amazon-connect-streams
Version:
Amazon Connect Streams Library
1 lines • 867 kB
JavaScript
(()=>{var l;(l={296:()=>{!function(){var l=this||globalThis,Z=l.connect||{};l.connect=Z,l.globalConnect={},l.lily=Z,globalConnect.Container=null;var b=window.atob("KCgpPT57dmFyIGU9ezI1NjooZSx0LG4pPT57InVzZSBzdHJpY3QiO2xldCByO2Z1bmN0aW9uIG8oZSl7aWYoIXIpdGhyb3cgbmV3IEVycm9yKG51bGwhPWU/ZToiQXR0ZW1wdGVkIHRvIGdldCBHbG9iYWwgQW1hem9uQ29ubmVjdFByb3ZpZGVyIHRoYXQgaGFzIG5vdCBiZWVuIHNldC4iKTtyZXR1cm4gcn1uLnIodCksbi5kKHQse0FtYXpvbkNvbm5lY3RTdHJlYW1zU2l0ZTooKT0+a30pO2NsYXNzIGkgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih7cmVhc29uOmUsbmFtZXNwYWNlOnQsZXJyb3JLZXk6bixkZXRhaWxzOnJ9KXtzdXBlcihgQ29ubmVjdEVycm9yIHdpdGggZXJyb3Iga2V5ICIke259ImApLHRoaXMuZXJyb3JUeXBlPWkuRXJyb3JUeXBlLHRoaXMubmFtZXNwYWNlPXQsdGhpcy5lcnJvcktleT1uLHRoaXMucmVhc29uPWUsdGhpcy5kZXRhaWxzPW51bGwhPXI/cjp7fX19aS5FcnJvclR5cGU9IkNvbm5lY3RFcnJvciI7Y2xhc3MgYXtjb25zdHJ1Y3Rvcih7cHJvdmlkZXI6ZSxsb2dnZXJLZXk6dH0pe3RoaXMuZXZlbnRzPW5ldyBNYXAsdGhpcy5sb2dnZXI9bmV3IFIoe3Byb3ZpZGVyOmUsc291cmNlOiJlbWl0dGVyIixtaXhpbjooKT0+KHtlbWl0dGVyTG9nZ2VyS2V5OnR9KX0pfW9uKGUsdCl7Y29uc3Qgbj10aGlzLmV2ZW50cy5nZXQoZSk7bj9uLmFkZCh0KTp0aGlzLmV2ZW50cy5zZXQoZSxuZXcgU2V0KFt0XSkpfW9mZihlLHQpe2NvbnN0IG49dGhpcy5ldmVudHMuZ2V0KGUpO24mJihuLmRlbGV0ZSh0KSxuLnNpemU8MSYmdGhpcy5ldmVudHMuZGVsZXRlKGUpKX1nZXRIYW5kbGVycyhlKXt2YXIgdDtyZXR1cm4gQXJyYXkuZnJvbShudWxsIT09KHQ9dGhpcy5ldmVudHMuZ2V0KGUpKSYmdm9pZCAwIT09dD90OltdKX19dmFyIHM9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG5ldyhufHwobj1Qcm9taXNlKSkoKGZ1bmN0aW9uKG8saSl7ZnVuY3Rpb24gYShlKXt0cnl7YyhyLm5leHQoZSkpfWNhdGNoKGUpe2koZSl9fWZ1bmN0aW9uIHMoZSl7dHJ5e2Moci50aHJvdyhlKSl9Y2F0Y2goZSl7aShlKX19ZnVuY3Rpb24gYyhlKXt2YXIgdDtlLmRvbmU/byhlLnZhbHVlKToodD1lLnZhbHVlLHQgaW5zdGFuY2VvZiBuP3Q6bmV3IG4oKGZ1bmN0aW9uKGUpe2UodCl9KSkpLnRoZW4oYSxzKX1jKChyPXIuYXBwbHkoZSx0fHxbXSkpLm5leHQoKSl9KSl9O2NsYXNzIGMgZXh0ZW5kcyBhe2VtaXQoZSx0KXtyZXR1cm4gcyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IG49dGhpcy5nZXRIYW5kbGVycyhlKTt5aWVsZCBQcm9taXNlLmFsbFNldHRsZWQobi5tYXAoKG49PnModGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0cnl7eWllbGQgbih0KX1jYXRjaCh0KXt0aGlzLmxvZ2dlci5lcnJvcigiQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiBpbnZva2luZyBldmVudCBoYW5kbGVyIix7ZXJyb3I6dCxwYXJhbWV0ZXI6ZX0pfX0pKSkpKX0pKX19ZnVuY3Rpb24gdSgpe3JldHVybiJyYW5kb21VVUlEImluIGNyeXB0bz9jcnlwdG8ucmFuZG9tVVVJRCgpOiIxMDAwMDAwMC0xMDAwLTQwMDAtODAwMC0xMDAwMDAwMDAwMDAiLnJlcGxhY2UoL1swMThdL2csKGU9Pntjb25zdCB0PXBhcnNlSW50KGUpO3JldHVybih0XmNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMSkpWzBdJjE1Pj50LzQpLnRvU3RyaW5nKDE2KX0pKX1jbGFzcyBse2NvbnN0cnVjdG9yKCl7dGhpcy5pZHNCeUhhbmRsZXI9bmV3IE1hcCx0aGlzLmhhbmRsZXJzQnlJZD1uZXcgTWFwfWFkZChlKXtjb25zdCB0PXRoaXMuaWRzQnlIYW5kbGVyLmdldChlKTtpZih0KXJldHVybntoYW5kbGVySWQ6dH07Y29uc3Qgbj11KCk7cmV0dXJuIHRoaXMuaWRzQnlIYW5kbGVyLnNldChlLG4pLHRoaXMuaGFuZGxlcnNCeUlkLnNldChuLGUpLHtoYW5kbGVySWQ6bn19Z2V0SWRCeUhhbmRsZXIoZSl7dmFyIHQ7cmV0dXJuIG51bGwhPT0odD10aGlzLmlkc0J5SGFuZGxlci5nZXQoZSkpJiZ2b2lkIDAhPT10P3Q6bnVsbH1nZXRIYW5kbGVyQnlJZChlKXt2YXIgdDtyZXR1cm4gbnVsbCE9PSh0PXRoaXMuaGFuZGxlcnNCeUlkLmdldChlKSkmJnZvaWQgMCE9PXQ/dDpudWxsfWdldCgpe3JldHVyblsuLi50aGlzLmlkc0J5SGFuZGxlci5lbnRyaWVzKCldLm1hcCgoKFtlLHRdKT0+KHtoYW5kbGVyOmUsaGFuZGxlcklkOnR9KSkpfWRlbGV0ZShlKXtjb25zdCB0PXRoaXMuaWRzQnlIYW5kbGVyLmdldChlKTtyZXR1cm4gdCYmdGhpcy5oYW5kbGVyc0J5SWQuZGVsZXRlKHQpLHRoaXMuaWRzQnlIYW5kbGVyLmRlbGV0ZShlKSx7aXNFbXB0eTp0aGlzLmlkc0J5SGFuZGxlci5zaXplPDF9fXNpemUoKXtyZXR1cm4gdGhpcy5pZHNCeUhhbmRsZXIuc2l6ZX19Y2xhc3MgcHtjb25zdHJ1Y3Rvcigpe3RoaXMuc2ltcGxlU3Vic2NyaXB0aW9ucz1uZXcgTWFwLHRoaXMucGFyYW1TdWJzY3JpcHRpb25zPW5ldyBNYXB9YWRkKHtuYW1lc3BhY2U6ZSxrZXk6dCxwYXJhbWV0ZXI6bn0scil7dmFyIG8saSxhLHMsYztpZihuKXtpZighdGhpcy5wYXJhbVN1YnNjcmlwdGlvbnMuaGFzKGUpKXJldHVybiB2b2lkIHRoaXMucGFyYW1TdWJzY3JpcHRpb25zLnNldChlLG5ldyBNYXAoW1t0LG5ldyBNYXAoW1tuLHJdXSldXSkpO2lmKCEobnVsbD09PShvPXRoaXMucGFyYW1TdWJzY3JpcHRpb25zLmdldChlKSl8fHZvaWQgMD09PW8/dm9pZCAwOm8uaGFzKHQpKSlyZXR1cm4gdm9pZChudWxsPT09KGk9dGhpcy5wYXJhbVN1YnNjcmlwdGlvbnMuZ2V0KGUpKXx8dm9pZCAwPT09aXx8aS5zZXQodCxuZXcgTWFwKFtbbixyXV0pKSk7bnVsbD09PShzPW51bGw9PT0oYT10aGlzLnBhcmFtU3Vic2NyaXB0aW9ucy5nZXQoZSkpfHx2b2lkIDA9PT1hP3ZvaWQgMDphLmdldCh0KSl8fHZvaWQgMD09PXN8fHMuc2V0KG4scil9ZWxzZXtpZighdGhpcy5zaW1wbGVTdWJzY3JpcHRpb25zLmhhcyhlKSlyZXR1cm4gdm9pZCB0aGlzLnNpbXBsZVN1YnNjcmlwdGlvbnMuc2V0KGUsbmV3IE1hcChbW3Qscl1dKSk7bnVsbD09PShjPXRoaXMuc2ltcGxlU3Vic2NyaXB0aW9ucy5nZXQoZSkpfHx2b2lkIDA9PT1jfHxjLnNldCh0LHIpfX1kZWxldGUoe25hbWVzcGFjZTplLGtleTp0LHBhcmFtZXRlcjpufSl7dmFyIHIsbyxpLGE7bj8obnVsbD09PShvPW51bGw9PT0ocj10aGlzLnBhcmFtU3Vic2NyaXB0aW9ucy5nZXQoZSkpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmdldCh0KSl8fHZvaWQgMD09PW8/dm9pZCAwOm8uZGVsZXRlKG4pKSYmdGhpcy5wYXJhbVN1YnNjcmlwdGlvbnMuZ2V0KGUpLmdldCh0KS5zaXplPDEmJihudWxsPT09KGk9dGhpcy5wYXJhbVN1YnNjcmlwdGlvbnMuZ2V0KGUpKXx8dm9pZCAwPT09aXx8aS5kZWxldGUodCksdGhpcy5wYXJhbVN1YnNjcmlwdGlvbnMuZ2V0KGUpLnNpemU8MSYmdGhpcy5wYXJhbVN1YnNjcmlwdGlvbnMuZGVsZXRlKGUpKToobnVsbD09PShhPXRoaXMuc2ltcGxlU3Vic2NyaXB0aW9ucy5nZXQoZSkpfHx2b2lkIDA9PT1hP3ZvaWQgMDphLmRlbGV0ZSh0KSkmJnRoaXMuc2ltcGxlU3Vic2NyaXB0aW9ucy5nZXQoZSkuc2l6ZTwxJiZ0aGlzLnNpbXBsZVN1YnNjcmlwdGlvbnMuZGVsZXRlKGUpfWdldCh7bmFtZXNwYWNlOmUsa2V5OnQscGFyYW1ldGVyOm59KXt2YXIgcixvLGk7cmV0dXJuIG4/bnVsbD09PShpPW51bGw9PT0obz10aGlzLnBhcmFtU3Vic2NyaXB0aW9ucy5nZXQoZSkpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLmdldCh0KSl8fHZvaWQgMD09PWk/dm9pZCAwOmkuZ2V0KG4pOm51bGw9PT0ocj10aGlzLnNpbXBsZVN1YnNjcmlwdGlvbnMuZ2V0KGUpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5nZXQodCl9Z2V0T3JBZGQoZSx0KXtsZXQgbj10aGlzLmdldChlKTtyZXR1cm4gbnx8KG49dCgpLHRoaXMuYWRkKGUsbikpLG59YWRkT3JVcGRhdGUoZSx0LG4pe2xldCByPXRoaXMuZ2V0KGUpO3JldHVybiByPXI/bihyKTp0KCksdGhpcy5hZGQoZSxyKSxyfWdldEFsbFN1YnNjcmlwdGlvbnMoKXtyZXR1cm5bLi4uQXJyYXkuZnJvbSh0aGlzLnNpbXBsZVN1YnNjcmlwdGlvbnMua2V5cygpKS5mbGF0TWFwKChlPT5BcnJheS5mcm9tKHRoaXMuc2ltcGxlU3Vic2NyaXB0aW9ucy5nZXQoZSkua2V5cygpKS5mbGF0TWFwKCh0PT4oe25hbWVzcGFjZTplLGtleTp0fSkpKSkpLC4uLkFycmF5LmZyb20odGhpcy5wYXJhbVN1YnNjcmlwdGlvbnMua2V5cygpKS5mbGF0TWFwKChlPT5BcnJheS5mcm9tKHRoaXMucGFyYW1TdWJzY3JpcHRpb25zLmdldChlKS5rZXlzKCkpLmZsYXRNYXAoKHQ9PkFycmF5LmZyb20odGhpcy5wYXJhbVN1YnNjcmlwdGlvbnMuZ2V0KGUpLmdldCh0KS5rZXlzKCkpLmZsYXRNYXAoKG49Pih7bmFtZXNwYWNlOmUsa2V5OnQscGFyYW1ldGVyOm59KSkpKSkpKV19fWNsYXNzIGR7Y29uc3RydWN0b3IoKXt0aGlzLnN1YnNjcmlwdGlvbnM9bmV3IHB9YWRkKGUsdCl7cmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9ucy5nZXRPckFkZChlLCgoKT0+bmV3IGwpKS5hZGQodCl9Z2V0KGUpe3ZhciB0LG47cmV0dXJuIG51bGwhPT0obj1udWxsPT09KHQ9dGhpcy5zdWJzY3JpcHRpb25zLmdldChlKSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuZ2V0KCkpJiZ2b2lkIDAhPT1uP246W119Z2V0QnlJZChlLHQpe3ZhciBuLHI7cmV0dXJuIG51bGwhPT0ocj1udWxsPT09KG49dGhpcy5zdWJzY3JpcHRpb25zLmdldChlKSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uZ2V0SGFuZGxlckJ5SWQodCkpJiZ2b2lkIDAhPT1yP3I6bnVsbH1kZWxldGUoZSx0KXt2YXIgbixyO251bGwhPT0ocj1udWxsPT09KG49dGhpcy5zdWJzY3JpcHRpb25zLmdldChlKSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uZGVsZXRlKHQpLmlzRW1wdHkpJiZ2b2lkIDAhPT1yJiZyJiZ0aGlzLnN1YnNjcmlwdGlvbnMuZGVsZXRlKGUpfXNpemUoZSl7dmFyIHQsbjtyZXR1cm4gbnVsbCE9PShuPW51bGw9PT0odD10aGlzLnN1YnNjcmlwdGlvbnMuZ2V0KGUpKXx8dm9pZCAwPT09dD92b2lkIDA6dC5zaXplKCkpJiZ2b2lkIDAhPT1uP246MH1pc0VtcHR5KGUpe3JldHVybiAwPT09dGhpcy5zaXplKGUpfWdldEFsbFN1YnNjcmlwdGlvbnMoKXtyZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25zLmdldEFsbFN1YnNjcmlwdGlvbnMoKX1nZXRBbGxTdWJzY3JpcHRpb25IYW5kbGVySWRzKCl7cmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9ucy5nZXRBbGxTdWJzY3JpcHRpb25zKCkucmVkdWNlKCgoZSx0KT0+ZS5jb25jYXQodGhpcy5nZXQodCkubWFwKCgoe2hhbmRsZXJJZDplfSk9Pih7dG9waWM6dCxoYW5kbGVySWQ6ZX0pKSkpKSxbXSl9fWNvbnN0IGg9ImNsaWVudFRpbWVvdXQiO2Z1bmN0aW9uIGYoZSx0LG4scil7Y29uc3Qgbz1NYXRoLm1heCgxLG51bGwhPXI/cjozZTQpO3JldHVybiBuZXcgUHJvbWlzZSgoKHIsYSk9PntsZXQgcz0hMTtjb25zdCBjPXNldFRpbWVvdXQoKCgpPT57bih7dGltZW91dE1zOm8scmVxdWVzdDplfSksYShmdW5jdGlvbihlLHQpe2NvbnN0e25hbWVzcGFjZTpuLGNvbW1hbmQ6cixkYXRhOm99PWU7cmV0dXJue25hbWVzcGFjZTpuLHJlYXNvbjoiQ2xpZW50IFRpbWVvdXQiLGRldGFpbHM6e2NvbW1hbmQ6cixyZXF1ZXN0RGF0YTpvLHRpbWVvdXRNczp0fSxlcnJvcktleTpofX0oZSxvKSkscz0hMH0pLG8pO3QoKGU9PntjbGVhclRpbWVvdXQoYyksc3x8KGUuaXNFcnJvcj9hKG5ldyBpKGUpKTpyKGUuZGF0YSkpfSkpfSkpfWNsYXNzIGd7Y29uc3RydWN0b3IoZSl7dGhpcy5yZXF1ZXN0TWFwPW5ldyBNYXAsdGhpcy5sb2dnZXI9bmV3IFIoe3Byb3ZpZGVyOmUsc291cmNlOiJjb3JlLnJlcXVlc3RNYW5hZ2VyIn0pfXByb2Nlc3NSZXF1ZXN0KGUpe2NvbnN0e3JlcXVlc3RJZDp0fT1lO3JldHVybiBmKGUsKGU9PnRoaXMucmVxdWVzdE1hcC5zZXQodCxlKSksKCh7cmVxdWVzdDplLHRpbWVvdXRNczp0fSk9PnRoaXMuaGFuZGxlVGltZW91dChlLHQpKSl9cHJvY2Vzc1Jlc3BvbnNlKGUpe2NvbnN0e3JlcXVlc3RJZDp0fT1lLG49dGhpcy5yZXF1ZXN0TWFwLmdldCh0KTtuPyhuKGUpLHRoaXMucmVxdWVzdE1hcC5kZWxldGUodCkpOnRoaXMubG9nZ2VyLmVycm9yKCJSZXR1cm5lZCBhIHJlc3BvbnNlIG1lc3NhZ2Ugd2l0aCBubyBoYW5kbGVyIix7bWVzc2FnZTplfSl9aGFuZGxlVGltZW91dChlLHQpe2NvbnN0e3JlcXVlc3RJZDpuLG5hbWVzcGFjZTpyLGNvbW1hbmQ6b309ZTt0aGlzLnJlcXVlc3RNYXAuZGVsZXRlKG4pLHRoaXMubG9nZ2VyLmVycm9yKCJDbGllbnQgcmVxdWVzdCB0aW1lb3V0Iix7cmVxdWVzdElkOm4sbmFtZXNwYWNlOnIsY29tbWFuZDpvLHRpbWVvdXRNczp0fSl9fXZhciBtPWZ1bmN0aW9uKGUsdCl7dmFyIG49e307Zm9yKHZhciByIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJnQuaW5kZXhPZihyKTwwJiYobltyXT1lW3JdKTtpZihudWxsIT1lJiYiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG89MDtmb3Iocj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO288ci5sZW5ndGg7bysrKXQuaW5kZXhPZihyW29dKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyW29dKSYmKG5bcltvXV09ZVtyW29dXSl9cmV0dXJuIG59O2Z1bmN0aW9uIHYoZSl7dHJ5e3N3aXRjaChlLnR5cGUpe2Nhc2UiYWNrbm93bGVkZ2UiOmNhc2UiZXJyb3IiOmNhc2UiY2hpbGRDb25uZWN0aW9uQ2xvc2UiOmRlZmF1bHQ6cmV0dXJuIGU7Y2FzZSJjaGlsZERvd25zdHJlYW1NZXNzYWdlIjpyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHttZXNzYWdlOnYoZS5tZXNzYWdlKX0pO2Nhc2UicHVibGlzaCI6e2NvbnN0e2RhdGE6dH09ZSxuPW0oZSxbImRhdGEiXSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sbil9Y2FzZSJyZXNwb25zZSI6aWYoZS5pc0Vycm9yKXJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSkse2RldGFpbHM6e2NvbW1hbmQ6ZS5kZXRhaWxzLmNvbW1hbmR9fSk7e2NvbnN0e2RhdGE6dH09ZSxuPW0oZSxbImRhdGEiXSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sbil9fX1jYXRjaCh0KXtyZXR1cm57bWVzc2FnZURldGFpbHM6ImVycm9yIHdoZW4gc2FuaXRpemluZyBkb3duc3RyZWFtIG1lc3NhZ2UiLG1lc3NhZ2U6ZSxlcnJvcjp0fX19Y2xhc3MgeXtjb25zdHJ1Y3RvcihlLHQpe3RoaXMucHJvdmlkZXI9ZSx0aGlzLnJlbGF5Q2hpbGRVcHN0cmVhbU1lc3NhZ2U9dCx0aGlzLm1lc3NhZ2VQb3J0cz1uZXcgTWFwLHRoaXMubG9nZ2VyPW5ldyBSKHtwcm92aWRlcjplLHNvdXJjZToiY2hpbGRDb25uZWN0aW9uTWFuYWdlciJ9KX1hZGRDaGFubmVsKGUpe2NvbnN0e2Nvbm5lY3Rpb25JZDp0fT1lO3RoaXMubWVzc2FnZVBvcnRzLmhhcyh0KT90aGlzLmxvZ2dlci5lcnJvcigiQXR0ZW1wdGVkIHRvIGFkZCBjaGlsZCBjb25uZWN0aW9uIHRoYXQgYWxyZWFkeSBleGlzdHMuIE5vIGFjdGlvbiIse2Nvbm5lY3Rpb25JZDp0fSk6KHRoaXMuc2V0dXBQb3J0KGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJDaGlsZCBwb3J0IGFkZGVkIix7Y29ubmVjdGlvbklkOnR9KSl9dXBkYXRlQ2hhbm5lbFBvcnQoZSl7dmFyIHQ7Y29uc3R7Y29ubmVjdGlvbklkOm59PWUscj1udWxsPT09KHQ9dGhpcy5tZXNzYWdlUG9ydHMuZ2V0KG4pKXx8dm9pZCAwPT09dD92b2lkIDA6dC5wb3J0O3I/KHIub25tZXNzYWdlPW51bGwsci5jbG9zZSgpLHRoaXMuc2V0dXBQb3J0KGUpLHRoaXMubG9nZ2VyLmluZm8oIlVwZGF0ZWQgY2hpbGQgcG9ydCIse2Nvbm5lY3Rpb25JZDpufSkpOnRoaXMubG9nZ2VyLmVycm9yKCJBdHRlbXB0ZWQgdG8gdXBkYXRlIGNoaWxkIGNvbm5lY3Rpb24gdGhhdCBkb2VzIG5vdCBleGlzdCBObyBhY3Rpb24iLHtjb25uZWN0aW9uSWQ6bn0pfXNldHVwUG9ydCh7Y29ubmVjdGlvbklkOmUscG9ydDp0LHByb3ZpZGVySWQ6bn0pe2NvbnN0IHI9dGhpcy5jcmVhdGVNZXNzYWdlSGFuZGxlcihlLG4pO3QuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsciksdC5zdGFydCgpLHRoaXMubWVzc2FnZVBvcnRzLnNldChlLHtwb3J0OnQsaGFuZGxlcjpyLHByb3ZpZGVySWQ6bn0pLHRoaXMucmVsYXlDaGlsZFVwc3RyZWFtTWVzc2FnZSh7dHlwZToiY2hpbGRVcHN0cmVhbSIsY29ubmVjdGlvbklkOmUsc291cmNlUHJvdmlkZXJJZDpuLHBhcmVudFByb3ZpZGVySWQ6dGhpcy5wcm92aWRlci5pZCxtZXNzYWdlOnt0eXBlOiJjaGlsZENvbm5lY3Rpb25SZWFkeSJ9fSl9aGFuZGxlRG93bnN0cmVhbU1lc3NhZ2Uoe2Nvbm5lY3Rpb25JZDplLG1lc3NhZ2U6dCx0YXJnZXRQcm92aWRlcklkOm59KXtjb25zdCByPXRoaXMubWVzc2FnZVBvcnRzLmdldChlKTtpZighcilyZXR1cm4gdm9pZCB0aGlzLmxvZ2dlci53YXJuKCJBdHRlbXB0ZWQgdG8gcm91dGUgZG93bnN0cmVhbSBtZXNzYWdlIHRvIGNoaWxkIG1lc3NhZ2UgcG9ydCB0aGF0IGRvZXMgbm90IGV4aXN0Iix7Y29ubmVjdGlvbklkOmUsbWVzc2FnZTp2KHQpfSk7Y29uc3R7cG9ydDpvLHByb3ZpZGVySWQ6aX09cjtpJiZpIT09bj90aGlzLmxvZ2dlci5lcnJvcigiRG93bnN0cmVhbSB0YXJnZXQgbWVzc2FnZSBkaWQgbm90IG1hdGNoIHRhcmdldCBwcm92aWRlciBpZC4gTm90IHNlbmRpbmcgbWVzc2FnZS4iLHtjb25uZWN0aW9uSWQ6ZSx0YXJnZXRQcm92aWRlcklkOm4sYWN0dWFsUHJvdmlkZXJJZDppLG1lc3NhZ2U6dih0KX0pOm8ucG9zdE1lc3NhZ2UodCl9aGFuZGxlQ2xvc2VNZXNzYWdlKHtjb25uZWN0aW9uSWQ6ZX0pe2NvbnN0IHQ9dGhpcy5tZXNzYWdlUG9ydHMuZ2V0KGUpO2lmKCF0KXJldHVybiB2b2lkIHRoaXMubG9nZ2VyLndhcm4oIkF0dGVtcHRlZCB0byBjbG9zZSBjaGlsZCBtZXNzYWdlIHBvcnQgdGhhdCB3YXMgbm90IGZvdW5kIix7Y29ubmVjdGlvbklkOmV9KTtjb25zdHtwb3J0Om4saGFuZGxlcjpyfT10O24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsciksbi5jbG9zZSgpLHRoaXMubWVzc2FnZVBvcnRzLmRlbGV0ZShlKSx0aGlzLmxvZ2dlci5kZWJ1ZygiUmVtb3ZlZCBjaGlsZCBtZXNzYWdlIGNoYW5uZWwiLHtjb25uZWN0aW9uSWQ6ZX0pfWNyZWF0ZU1lc3NhZ2VIYW5kbGVyKGUsdCl7cmV0dXJuIG49PnRoaXMucmVsYXlDaGlsZFVwc3RyZWFtTWVzc2FnZSh7dHlwZToiY2hpbGRVcHN0cmVhbSIsc291cmNlUHJvdmlkZXJJZDp0LHBhcmVudFByb3ZpZGVySWQ6dGhpcy5wcm92aWRlci5pZCxjb25uZWN0aW9uSWQ6ZSxtZXNzYWdlOm4uZGF0YX0pfX1jbGFzcyBie2NvbnN0cnVjdG9yKGUpe3RoaXMuZXJyb3JIYW5kbGVycz1uZXcgU2V0LHRoaXMubG9nZ2VyPW5ldyBSKHtwcm92aWRlcjplLHNvdXJjZToiY29yZS5wcm94eS5lcnJvciJ9KX1pbnZva2UoZSl7Y29uc3R7bWVzc2FnZTp0LGtleTpuLGRldGFpbHM6cixpc0ZhdGFsOm8sY29ubmVjdGlvblN0YXR1czppfT1lO3RoaXMubG9nZ2VyLmVycm9yKHQse2tleTpuLGRldGFpbHM6cixpc0ZhdGFsOm8sY29ubmVjdGlvblN0YXR1czppfSx7ZHVwbGljYXRlTWVzc2FnZVRvQ29uc29sZTohMCxyZW1vdGVJZ25vcmU6ITB9KSxbLi4udGhpcy5lcnJvckhhbmRsZXJzXS5mb3JFYWNoKCh0PT57dHJ5e3QoZSl9Y2F0Y2godCl7dGhpcy5sb2dnZXIuZXJyb3IoIkFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiBhIEFtYXpvbkNvbm5lY3RFcnJvckhhbmRsZXIiLHtoYW5kbGVyRXJyb3I6dCxvcmlnaW5hbEVycm9yOmV9KX19KSl9b25FcnJvcihlKXt0aGlzLmVycm9ySGFuZGxlcnMuYWRkKGUpfW9mZkVycm9yKGUpe3RoaXMuZXJyb3JIYW5kbGVycy5kZWxldGUoZSl9fWNsYXNzIEV7Y29uc3RydWN0b3Ioe3Byb3ZpZGVyOmUsc2VuZEhlYWx0aENoZWNrOnQsZ2V0VXBzdHJlYW1NZXNzYWdlT3JpZ2luOm59KXt0aGlzLmNvbm5lY3Rpb25JZD1udWxsLHRoaXMuaGVhbHRoQ2hlY2tJbnRlcnZhbD1udWxsLHRoaXMuaGVhbHRoQ2hlY2tUaW1lb3V0PW51bGwsdGhpcy5zZW5kSGVhbHRoQ2hlY2s9dCx0aGlzLmdldFVwc3RyZWFtTWVzc2FnZU9yaWdpbj1uLHRoaXMuc2VuZEhlYWx0aENoZWNrSW50ZXJ2YWw9bnVsbCx0aGlzLmxhc3RIZWFsdGhDaGVja1Jlc3BvbnNlPW51bGwsdGhpcy5fc3RhdHVzPSJ1bmtub3duIix0aGlzLmxvZ2dlcj1uZXcgUih7c291cmNlOiJjb3JlLnByb3h5LmhlYWx0aC1jaGVjayIscHJvdmlkZXI6ZSxtaXhpbjooKT0+KHtjb25uZWN0aW9uSWQ6dGhpcy5jb25uZWN0aW9uSWR9KX0pLHRoaXMuZXZlbnRzPW5ldyBjKHtwcm92aWRlcjplLGxvZ2dlcktleToiY29yZS5wcm94eS5oZWFsdGgtY2hlY2sifSl9Z2V0IHN0YXR1cygpe3JldHVybiB0aGlzLl9zdGF0dXN9Z2V0IGlzUnVubmluZygpe3JldHVybiBudWxsIT09dGhpcy5zZW5kSGVhbHRoQ2hlY2tJbnRlcnZhbH1nZXQgbGFzdENoZWNrQ291bnRlcigpe3ZhciBlLHQ7cmV0dXJuIG51bGwhPT0odD1udWxsPT09KGU9dGhpcy5sYXN0SGVhbHRoQ2hlY2tSZXNwb25zZSl8fHZvaWQgMD09PWU/dm9pZCAwOmUuY291bnRlcikmJnZvaWQgMCE9PXQ/dDpudWxsfWdldCBsYXN0Q2hlY2tUaW1lKCl7dmFyIGUsdDtyZXR1cm4gbnVsbCE9PSh0PW51bGw9PT0oZT10aGlzLmxhc3RIZWFsdGhDaGVja1Jlc3BvbnNlKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS50aW1lKSYmdm9pZCAwIT09dD90Om51bGx9c3RhcnQoe2hlYWx0aENoZWNrSW50ZXJ2YWw6ZSxjb25uZWN0aW9uSWQ6dH0pe3RoaXMuY29ubmVjdGlvbklkPXQsdGhpcy5oZWFsdGhDaGVja0ludGVydmFsPWUsdGhpcy5jbGVhckludGVydmFsKCksZTw9MD90aGlzLmxvZ2dlci5kZWJ1ZygiSGVhbHRoIGNoZWNrIGRpc2FibGVkIik6ZTwxZTM/dGhpcy5sb2dnZXIuZXJyb3IoIkhlYWx0aCBjaGVjayBpbnRlcnZhbCBpcyBsZXNzIHRoYW4gMSBzZWNvbmQuIE5vdCBydW5uaW5nIix7aW50ZXJ2YWw6ZX0pOih0aGlzLnNlbmRIZWFsdGhDaGVja01lc3NhZ2UoKSx0aGlzLnNlbmRIZWFsdGhDaGVja0ludGVydmFsPXNldEludGVydmFsKCgoKT0+dGhpcy5zZW5kSGVhbHRoQ2hlY2tNZXNzYWdlKCkpLGUpLHRoaXMuc3RhcnRUaW1lb3V0KCkpfXN0b3AoKXt0aGlzLmNsZWFySW50ZXJ2YWwoKSx0aGlzLmNsZWFyVGltZW91dCgpfWhhbmRsZVJlc3BvbnNlKGUpe3RoaXMuc2V0SGVhbHRoeSh7dGltZTplLnRpbWUsY291bnRlcjplLmNvdW50ZXJ9KX1zZW5kSGVhbHRoQ2hlY2tNZXNzYWdlKCl7dGhpcy5zZW5kSGVhbHRoQ2hlY2soe3R5cGU6ImhlYWx0aENoZWNrIixtZXNzYWdlT3JpZ2luOnRoaXMuZ2V0VXBzdHJlYW1NZXNzYWdlT3JpZ2luKCl9KX1zdGFydFRpbWVvdXQoKXt0aGlzLmhlYWx0aENoZWNrSW50ZXJ2YWw/KHRoaXMuY2xlYXJUaW1lb3V0KCksdGhpcy5oZWFsdGhDaGVja1RpbWVvdXQ9c2V0VGltZW91dCgoKCk9Pnt0aGlzLnNldFVuaGVhbHRoeSgpfSksMyp0aGlzLmhlYWx0aENoZWNrSW50ZXJ2YWwpKTp0aGlzLmxvZ2dlci5lcnJvcigiSGVhbHRoIGNoZWNrIGludGVydmFsIG5vdCBzZXQuIENhbm5vdCBzdGFydCB0aW1lb3V0Iil9Y2xlYXJJbnRlcnZhbCgpe3RoaXMuc2VuZEhlYWx0aENoZWNrSW50ZXJ2YWwmJihjbGVhckludGVydmFsKHRoaXMuc2VuZEhlYWx0aENoZWNrSW50ZXJ2YWwpLHRoaXMuc2VuZEhlYWx0aENoZWNrSW50ZXJ2YWw9bnVsbCl9Y2xlYXJUaW1lb3V0KCl7dGhpcy5oZWFsdGhDaGVja1RpbWVvdXQmJihjbGVhclRpbWVvdXQodGhpcy5oZWFsdGhDaGVja1RpbWVvdXQpLHRoaXMuaGVhbHRoQ2hlY2tUaW1lb3V0PW51bGwpfXNldFVuaGVhbHRoeSgpe2lmKCJ1bmhlYWx0aHkiIT09dGhpcy5fc3RhdHVzKXtjb25zdCBlPXRoaXMuX3N0YXR1czt0aGlzLmxvZ2dlci5pbmZvKCJDb25uZWN0aW9uIHVuaGVhbHRoeSIse3ByZXZpb3VzU3RhdHVzOmV9KSx0aGlzLl9zdGF0dXM9InVuaGVhbHRoeSIsdGhpcy5lbWl0U3RhdHVzQ2hhbmdlZCgidW5oZWFsdGh5IixlKX19c2V0SGVhbHRoeShlKXtpZih0aGlzLmxhc3RIZWFsdGhDaGVja1Jlc3BvbnNlPU9iamVjdC5hc3NpZ24oe30sZSksImhlYWx0aHkiIT09dGhpcy5fc3RhdHVzKXtjb25zdCBlPXRoaXMuX3N0YXR1czt0aGlzLmxvZ2dlci5kZWJ1ZygiQ29ubmVjdGlvbiBoZWFsdGh5Iix7cHJldmlvdXNTdGF0dXM6ZX0pLHRoaXMuX3N0YXR1cz0iaGVhbHRoeSIsdGhpcy5lbWl0U3RhdHVzQ2hhbmdlZCgiaGVhbHRoeSIsZSl9dGhpcy5zdGFydFRpbWVvdXQoKX1lbWl0U3RhdHVzQ2hhbmdlZChlLHQpe3ZhciBuLHIsbyxpO3RoaXMuZXZlbnRzLmVtaXQoRS5zdGF0dXNDaGFuZ2VkS2V5LHtzdGF0dXM6ZSxwcmV2aW91c1N0YXR1czp0LGxhc3RDaGVja1RpbWU6bnVsbCE9PShyPW51bGw9PT0obj10aGlzLmxhc3RIZWFsdGhDaGVja1Jlc3BvbnNlKXx8dm9pZCAwPT09bj92b2lkIDA6bi50aW1lKSYmdm9pZCAwIT09cj9yOm51bGwsbGFzdENoZWNrQ291bnRlcjpudWxsIT09KGk9bnVsbD09PShvPXRoaXMubGFzdEhlYWx0aENoZWNrUmVzcG9uc2UpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLmNvdW50ZXIpJiZ2b2lkIDAhPT1pP2k6bnVsbH0pfW9uU3RhdHVzQ2hhbmdlZChlKXt0aGlzLmV2ZW50cy5vbihFLnN0YXR1c0NoYW5nZWRLZXksZSl9b2ZmU3RhdHVzQ2hhbmdlZChlKXt0aGlzLmV2ZW50cy5vZmYoRS5zdGF0dXNDaGFuZ2VkS2V5LGUpfX1FLnN0YXR1c0NoYW5nZWRLZXk9InN0YXR1c0NoYW5nZWQiO2NsYXNzIFN7Y29uc3RydWN0b3IoZSl7dGhpcy5zdGF0dXM9Im5vdENvbm5lY3RlZCIsdGhpcy5jaGFuZ2VIYW5kbGVycz1uZXcgU2V0LHRoaXMubG9nZ2VyPW5ldyBSKHtzb3VyY2U6ImNvcmUucHJveHkuY29ubmVjdGlvbi1zdGF0dXMtbWFuYWdlciIscHJvdmlkZXI6ZSxtaXhpbjooKT0+KHtzdGF0dXM6dGhpcy5zdGF0dXN9KX0pfWdldFN0YXR1cygpe3JldHVybiB0aGlzLnN0YXR1c311cGRhdGUoZSl7dGhpcy5zdGF0dXM9ZS5zdGF0dXMsdGhpcy5sb2dnZXIudHJhY2UoIlByb3h5IENvbm5lY3Rpb24gU3RhdHVzIENoYW5nZWQiLHtzdGF0dXM6ZS5zdGF0dXN9KSxbLi4udGhpcy5jaGFuZ2VIYW5kbGVyc10uZm9yRWFjaCgodD0+e3RyeXt0KGUpfWNhdGNoKGUpe3RoaXMubG9nZ2VyLmVycm9yKCJBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gYSBQcm94eUNvbm5lY3Rpb25DaGFuZ2VkSGFuZGxlciIse2Vycm9yOmV9KX19KSl9b25DaGFuZ2UoZSl7dGhpcy5jaGFuZ2VIYW5kbGVycy5hZGQoZSl9b2ZmQ2hhbmdlKGUpe3RoaXMuY2hhbmdlSGFuZGxlcnMuZGVsZXRlKGUpfX12YXIgQyxJPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBuZXcobnx8KG49UHJvbWlzZSkpKChmdW5jdGlvbihvLGkpe2Z1bmN0aW9uIGEoZSl7dHJ5e2Moci5uZXh0KGUpKX1jYXRjaChlKXtpKGUpfX1mdW5jdGlvbiBzKGUpe3RyeXtjKHIudGhyb3coZSkpfWNhdGNoKGUpe2koZSl9fWZ1bmN0aW9uIGMoZSl7dmFyIHQ7ZS5kb25lP28oZS52YWx1ZSk6KHQ9ZS52YWx1ZSx0IGluc3RhbmNlb2Ygbj90Om5ldyBuKChmdW5jdGlvbihlKXtlKHQpfSkpKS50aGVuKGEscyl9Yygocj1yLmFwcGx5KGUsdHx8W10pKS5uZXh0KCkpfSkpfSxUPWZ1bmN0aW9uKGUsdCl7dmFyIG49e307Zm9yKHZhciByIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJnQuaW5kZXhPZihyKTwwJiYobltyXT1lW3JdKTtpZihudWxsIT1lJiYiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG89MDtmb3Iocj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO288ci5sZW5ndGg7bysrKXQuaW5kZXhPZihyW29dKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyW29dKSYmKG5bcltvXV09ZVtyW29dXSl9cmV0dXJuIG59O2NsYXNzIHd7Y29uc3RydWN0b3IoZSl7dGhpcy5wcm92aWRlcj1lLHRoaXMubG9nZ2VyPW5ldyBSKHtzb3VyY2U6ImNvcmUucHJveHkiLHByb3ZpZGVyOmUsbWl4aW46KCk9Pih7cHJveHlUeXBlOnRoaXMucHJveHlUeXBlLGNvbm5lY3Rpb25JZDp0aGlzLmNvbm5lY3Rpb25JZH0pfSksdGhpcy5yZXF1ZXN0TWFuYWdlcj1uZXcgZyhlKSx0aGlzLnN0YXR1cz1uZXcgUyhlKSx0aGlzLmVycm9yU2VydmljZT1uZXcgYihlKSx0aGlzLnVwc3RyZWFtTWVzc2FnZVF1ZXVlPVtdLHRoaXMuY29ubmVjdGlvbkVzdGFibGlzaGVkPSExLHRoaXMuaXNJbml0aWFsaXplZD0hMSx0aGlzLnN1YnNjcmlwdGlvbnM9bmV3IGQsdGhpcy5jb25uZWN0aW9uSWQ9bnVsbCx0aGlzLmNoYW5uZWxNYW5hZ2VyPW5ldyB5KGUsdGhpcy5zZW5kT3JRdWV1ZU1lc3NhZ2VUb1N1YmplY3QuYmluZCh0aGlzKSksdGhpcy5oZWFsdGhDaGVjaz1uZXcgRSh7cHJvdmlkZXI6ZSxzZW5kSGVhbHRoQ2hlY2s6dGhpcy5zZW5kT3JRdWV1ZU1lc3NhZ2VUb1N1YmplY3QuYmluZCh0aGlzKSxnZXRVcHN0cmVhbU1lc3NhZ2VPcmlnaW46dGhpcy5nZXRVcHN0cmVhbU1lc3NhZ2VPcmlnaW4uYmluZCh0aGlzKX0pfWluaXQoKXtpZih0aGlzLmlzSW5pdGlhbGl6ZWQpdGhyb3cgbmV3IEVycm9yKCJQcm94eSBhbHJlYWR5IGluaXRpYWxpemVkIik7dGhpcy5pc0luaXRpYWxpemVkPSEwLHRoaXMuaW5pdFByb3h5KCl9cmVxdWVzdChlLHQsbixyKXtjb25zdCBvPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybnt0eXBlOiJyZXF1ZXN0IixuYW1lc3BhY2U6ZSxjb21tYW5kOnQscmVxdWVzdElkOnUoKSxkYXRhOm4sbWVzc2FnZU9yaWdpbjpyfX0oZSx0LG4sbnVsbCE9cj9yOnRoaXMuZ2V0VXBzdHJlYW1NZXNzYWdlT3JpZ2luKCkpLGk9dGhpcy5yZXF1ZXN0TWFuYWdlci5wcm9jZXNzUmVxdWVzdChvKTtyZXR1cm4gdGhpcy5zZW5kT3JRdWV1ZU1lc3NhZ2VUb1N1YmplY3QobyksaX1zdWJzY3JpYmUoZSx0LG4pe2NvbnN0e2hhbmRsZXJJZDpyfT10aGlzLnN1YnNjcmlwdGlvbnMuYWRkKGUsdCksbz17dHlwZToic3Vic2NyaWJlIix0b3BpYzplLG1lc3NhZ2VPcmlnaW46bnVsbCE9bj9uOnRoaXMuZ2V0VXBzdHJlYW1NZXNzYWdlT3JpZ2luKCksaGFuZGxlcklkOnJ9O3RoaXMuc2VuZE9yUXVldWVNZXNzYWdlVG9TdWJqZWN0KG8pfXVuc3Vic2NyaWJlKGUsdCxuKXtpZih0aGlzLnN1YnNjcmlwdGlvbnMuZGVsZXRlKGUsdCksdGhpcy5zdWJzY3JpcHRpb25zLmlzRW1wdHkoZSkpe2NvbnN0IHQ9e3R5cGU6InVuc3Vic2NyaWJlIix0b3BpYzplLG1lc3NhZ2VPcmlnaW46bnVsbCE9bj9uOnRoaXMuZ2V0VXBzdHJlYW1NZXNzYWdlT3JpZ2luKCl9O3RoaXMuc2VuZE9yUXVldWVNZXNzYWdlVG9TdWJqZWN0KHQpfX1sb2coZSl7Y29uc3QgdD1mdW5jdGlvbih7bGV2ZWw6ZSxzb3VyY2U6dCxtZXNzYWdlOm4sbG9nZ2VySWQ6cixkYXRhOm99LGksYSl7Y29uc3Qgcz1vP0pTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobykpOnZvaWQgMDtyZXR1cm57dHlwZToibG9nIixsZXZlbDplLHRpbWU6bmV3IERhdGUsc291cmNlOnQsbWVzc2FnZTpuLGxvZ2dlcklkOnIsZGF0YTpzLGNvbnRleHQ6aSxtZXNzYWdlT3JpZ2luOmF9fShlLHRoaXMuYWRkQ29udGV4dFRvTG9nZ2VyKCksdGhpcy5nZXRVcHN0cmVhbU1lc3NhZ2VPcmlnaW4oKSk7dGhpcy5zZW5kT3JRdWV1ZU1lc3NhZ2VUb1N1YmplY3QodCl9c2VuZExvZ01lc3NhZ2UoZSl7ImxvZyI9PT1lLnR5cGU/KGUuY29udGV4dD1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZS5jb250ZXh0KSx0aGlzLmFkZENvbnRleHRUb0xvZ2dlcigpKSx0aGlzLnNlbmRPclF1ZXVlTWVzc2FnZVRvU3ViamVjdChlKSk6dGhpcy5sb2dnZXIuZXJyb3IoIkF0dGVtcHRlZCB0byBzZW5kIGludmFsaWQgbG9nIG1lc3NhZ2UiLHttZXNzYWdlOmV9KX1zZW5kTWV0cmljKHttZXRyaWNEYXRhOmUsdGltZTp0LG5hbWVzcGFjZTpufSl7Y29uc3Qgcj1mdW5jdGlvbih7bWV0cmljRGF0YTplLHRpbWU6dCxuYW1lc3BhY2U6bn0scil7dmFyIG8saTtyZXR1cm57dHlwZToibWV0cmljIixuYW1lc3BhY2U6bixtZXRyaWNOYW1lOmUubWV0cmljTmFtZSx1bml0OmUudW5pdCx2YWx1ZTplLnZhbHVlLHRpbWU6dCxkaW1lbnNpb25zOm51bGwhPT0obz1lLmRpbWVuc2lvbnMpJiZ2b2lkIDAhPT1vP286e30sb3B0aW9uYWxEaW1lbnNpb25zOm51bGwhPT0oaT1lLm9wdGlvbmFsRGltZW5zaW9ucykmJnZvaWQgMCE9PWk/aTp7fSxtZXNzYWdlT3JpZ2luOnJ9fSh7bWV0cmljRGF0YTplLHRpbWU6dCxuYW1lc3BhY2U6bn0sdGhpcy5nZXRVcHN0cmVhbU1lc3NhZ2VPcmlnaW4oKSk7dGhpcy5zZW5kT3JRdWV1ZU1lc3NhZ2VUb1N1YmplY3Qocil9c2VuZE1ldHJpY01lc3NhZ2UoZSl7Im1ldHJpYyI9PT1lLnR5cGU/dGhpcy5zZW5kT3JRdWV1ZU1lc3NhZ2VUb1N1YmplY3QoZSk6dGhpcy5sb2dnZXIuZXJyb3IoIkF0dGVtcHRlZCB0byBzZW5kIGludmFsaWQgbWV0cmljIG1lc3NhZ2UiLHttZXRyaWNNZXNzYWdlOmV9KX1zZW5kT3JRdWV1ZU1lc3NhZ2VUb1N1YmplY3QoZSl7dGhpcy5jb25uZWN0aW9uRXN0YWJsaXNoZWQ/dGhpcy5zZW5kTWVzc2FnZVRvU3ViamVjdChlKTp0aGlzLnVwc3RyZWFtTWVzc2FnZVF1ZXVlLnB1c2goZSl9Y29uc3VtZXJNZXNzYWdlSGFuZGxlcihlKXtpZighdGhpcy5pc0luaXRpYWxpemVkKXJldHVybiB2b2lkIHRoaXMubG9nZ2VyLmVycm9yKCJBdHRlbXB0ZWQgdG8gcHJvY2VzcyBtZXNzYWdlIGZyb20gc3ViamVjdCBwcmlvciB0byBwcm94eSBiZWluZyBpbml0aWFsaXppbmcuIE1lc3NhZ2Ugbm90IHByb2Nlc3NlZCIse29yaWdpbmFsTWVzc2FnZUV2ZW50RGF0YTplLmRhdGF9KTtjb25zdHtkYXRhOnR9PWU7aWYoISgidHlwZSJpbiB0KSlyZXR1cm4gdm9pZCB0aGlzLmxvZ2dlci53YXJuKCJVbmtub3duIGluYm91bmQgbWVzc2FnZSIse29yaWdpbmFsTWVzc2FnZUV2ZW50RGF0YTp0fSk7Y29uc3Qgbj10O3RoaXMuaGFuZGxlTWVzc2FnZUZyb21TdWJqZWN0KG4pfWhhbmRsZU1lc3NhZ2VGcm9tU3ViamVjdChlKXt0aGlzLmhhbmRsZURlZmF1bHRNZXNzYWdlRnJvbVN1YmplY3QoZSl9aGFuZGxlRGVmYXVsdE1lc3NhZ2VGcm9tU3ViamVjdChlKXtzd2l0Y2goZS50eXBlKXtjYXNlImFja25vd2xlZGdlIjp0aGlzLmhhbmRsZUNvbm5lY3Rpb25BY2tub3dsZWRnZShlKTticmVhaztjYXNlInJlc3BvbnNlIjp0aGlzLmhhbmRsZVJlc3BvbnNlKGUpO2JyZWFrO2Nhc2UicHVibGlzaCI6dGhpcy5oYW5kbGVQdWJsaXNoKGUpO2JyZWFrO2Nhc2UiZXJyb3IiOnRoaXMuaGFuZGxlRXJyb3IoZSk7YnJlYWs7Y2FzZSJjaGlsZERvd25zdHJlYW1NZXNzYWdlIjp0aGlzLmNoYW5uZWxNYW5hZ2VyLmhhbmRsZURvd25zdHJlYW1NZXNzYWdlKGUpO2JyZWFrO2Nhc2UiY2hpbGRDb25uZWN0aW9uQ2xvc2UiOnRoaXMuY2hhbm5lbE1hbmFnZXIuaGFuZGxlQ2xvc2VNZXNzYWdlKGUpO2JyZWFrO2Nhc2UiaGVhbHRoQ2hlY2tSZXNwb25zZSI6dGhpcy5oZWFsdGhDaGVjay5oYW5kbGVSZXNwb25zZShlKTticmVhaztkZWZhdWx0OnJldHVybiB2b2lkIHRoaXMubG9nZ2VyLmVycm9yKCJVbmtub3duIGluYm91bmQgbWVzc2FnZSIse29yaWdpbmFsTWVzc2FnZUV2ZW50RGF0YTplfSl9fWhhbmRsZUNvbm5lY3Rpb25BY2tub3dsZWRnZShlKXtmb3IodGhpcy5jb25uZWN0aW9uSWQ9ZS5jb25uZWN0aW9uSWQsdGhpcy5zdGF0dXMudXBkYXRlKHtzdGF0dXM6InJlYWR5Iixjb25uZWN0aW9uSWQ6ZS5jb25uZWN0aW9uSWR9KSx0aGlzLmNvbm5lY3Rpb25Fc3RhYmxpc2hlZD0hMDt0aGlzLnVwc3RyZWFtTWVzc2FnZVF1ZXVlLmxlbmd0aDspe2NvbnN0IGU9dGhpcy51cHN0cmVhbU1lc3NhZ2VRdWV1ZS5zaGlmdCgpO3RoaXMuc2VuZE1lc3NhZ2VUb1N1YmplY3QoZSl9dGhpcy5oZWFsdGhDaGVjay5zdGFydChlKX1oYW5kbGVSZXNwb25zZShlKXt0aGlzLnJlcXVlc3RNYW5hZ2VyLnByb2Nlc3NSZXNwb25zZShlKX1oYW5kbGVQdWJsaXNoKGUpe2NvbnN0e2hhbmRsZXJJZDp0LHRvcGljOm59PWU7aWYodCl7Y29uc3Qgcj10aGlzLnN1YnNjcmlwdGlvbnMuZ2V0QnlJZChuLHQpO3ImJnRoaXMuaGFuZGxlQXN5bmNTdWJzY3JpcHRpb25IYW5kbGVySW52b2tlKHtoYW5kbGVyOnIsaGFuZGxlcklkOnR9LGUpfWVsc2UgdGhpcy5zdWJzY3JpcHRpb25zLmdldChuKS5tYXAoKHQ9Pnt0aGlzLmhhbmRsZUFzeW5jU3Vic2NyaXB0aW9uSGFuZGxlckludm9rZSh0LGUpfSkpfWhhbmRsZUVycm9yKGUpe2lmKGUuaXNGYXRhbCl7Y29uc3R7bWVzc2FnZTp0LHR5cGU6bn09ZSxyPVQoZSxbIm1lc3NhZ2UiLCJ0eXBlIl0pO3RoaXMuc3RhdHVzLnVwZGF0ZSh7c3RhdHVzOiJlcnJvciIscmVhc29uOnQsZGV0YWlsczpyfSl9dGhpcy5wdWJsaXNoRXJyb3Ioe21lc3NhZ2U6ZS5tZXNzYWdlLGtleTplLmtleSxkZXRhaWxzOmUuZGV0YWlscyxpc0ZhdGFsOmUuaXNGYXRhbCxwcm94eVN0YXR1czplLnN0YXR1c30pfXB1Ymxpc2hFcnJvcihlKXtjb25zdCB0PU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7Y29ubmVjdGlvblN0YXR1czp0aGlzLmNvbm5lY3Rpb25TdGF0dXN9KTt0aGlzLmVycm9yU2VydmljZS5pbnZva2UodCl9aGFuZGxlQXN5bmNTdWJzY3JpcHRpb25IYW5kbGVySW52b2tlKGUsdCl7cmV0dXJuIEkodGhpcyxhcmd1bWVudHMsdm9pZCAwLChmdW5jdGlvbiooe2hhbmRsZXI6ZSxoYW5kbGVySWQ6dH0se3RvcGljOm4sZGF0YTpyfSl7dHJ5e3lpZWxkIGUocil9Y2F0Y2goZSl7dGhpcy5sb2dnZXIuZXJyb3IoIkFuIGVycm9yIG9jY3VycmVkIHdoZW4gaGFuZGxpbmcgc3Vic2NyaXB0aW9uIix7dG9waWM6bixlcnJvcjplLGhhbmRsZXJJZDp0fSl9fSkpfWdldCBjb25uZWN0aW9uU3RhdHVzKCl7cmV0dXJuIHRoaXMuc3RhdHVzLmdldFN0YXR1cygpfW9uRXJyb3IoZSl7dGhpcy5lcnJvclNlcnZpY2Uub25FcnJvcihlKX1vZmZFcnJvcihlKXt0aGlzLmVycm9yU2VydmljZS5vZmZFcnJvcihlKX1vbkNvbm5lY3Rpb25TdGF0dXNDaGFuZ2UoZSl7dGhpcy5zdGF0dXMub25DaGFuZ2UoZSl9b2ZmQ29ubmVjdGlvblN0YXR1c0NoYW5nZShlKXt0aGlzLnN0YXR1cy5vZmZDaGFuZ2UoZSl9b25IZWFsdGhDaGVja1N0YXR1c0NoYW5nZWQoZSl7dGhpcy5oZWFsdGhDaGVjay5vblN0YXR1c0NoYW5nZWQoZSl9b2ZmSGVhbHRoQ2hlY2tTdGF0dXNDaGFuZ2VkKGUpe3RoaXMuaGVhbHRoQ2hlY2sub2ZmU3RhdHVzQ2hhbmdlZChlKX1hZGRDaGlsZENoYW5uZWwoZSl7dGhpcy5jaGFubmVsTWFuYWdlci5hZGRDaGFubmVsKGUpfXVwZGF0ZUNoaWxkQ2hhbm5lbFBvcnQoZSl7dGhpcy5jaGFubmVsTWFuYWdlci51cGRhdGVDaGFubmVsUG9ydChlKX1yZXNldENvbm5lY3Rpb24oZSl7dmFyIHQ7dGhpcy5jb25uZWN0aW9uRXN0YWJsaXNoZWQ9ITEsdGhpcy5zdGF0dXMudXBkYXRlKHtzdGF0dXM6InJlc2V0IixyZWFzb246ZX0pO2NvbnN0IG49dGhpcy5zdWJzY3JpcHRpb25zLmdldEFsbFN1YnNjcmlwdGlvbkhhbmRsZXJJZHMoKTt0aGlzLmxvZ2dlci5pbmZvKCJSZXNldHRpbmcgcHJveHkiLHtyZWFzb246ZSxzdWJzY3JpcHRpb25IYW5kbGVyQ291bnQ6bnVsbCE9PSh0PW51bGw9PW4/dm9pZCAwOm4ubGVuZ3RoKSYmdm9pZCAwIT09dD90Oi0xfSksbnVsbD09bnx8bi5tYXAoKCh7dG9waWM6ZSxoYW5kbGVySWQ6dH0pPT4oe3R5cGU6InN1YnNjcmliZSIsdG9waWM6ZSxtZXNzYWdlT3JpZ2luOnRoaXMuZ2V0VXBzdHJlYW1NZXNzYWdlT3JpZ2luKCksaGFuZGxlcklkOnR9KSkpLmZvckVhY2goKGU9PnRoaXMuc2VuZE9yUXVldWVNZXNzYWdlVG9TdWJqZWN0KGUpKSl9fWNsYXNzIEF7Y29uc3RydWN0b3Ioe2NvbmZpZzplLHByb3h5RmFjdG9yeTp0fSl7aWYodGhpcy5faWQ9dSgpLCF0KXRocm93IG5ldyBFcnJvcigiQXR0ZW1wdGVkIHRvIGdldCBQcm94eSBiZWZvcmUgc2V0dGluZyB1cCBmYWN0b3J5Iik7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gaW5jbHVkZSBjb25maWciKTt0aGlzLnByb3h5RmFjdG9yeT10LHRoaXMuX2NvbmZpZz1lfWdldCBpZCgpe3JldHVybiB0aGlzLl9pZH1nZXRQcm94eSgpe3JldHVybiB0aGlzLnByb3h5fHwodGhpcy5wcm94eT10aGlzLnByb3h5RmFjdG9yeSh0aGlzKSx0aGlzLnByb3h5LmluaXQoKSksdGhpcy5wcm94eX1nZXQgY29uZmlnKCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sdGhpcy5fY29uZmlnKX1vbkVycm9yKGUpe3RoaXMuZ2V0UHJveHkoKS5vbkVycm9yKGUpfW9mZkVycm9yKGUpe3RoaXMuZ2V0UHJveHkoKS5vZmZFcnJvcihlKX1zdGF0aWMgaW5pdGlhbGl6ZVByb3ZpZGVyKGUpe2lmKHRoaXMuaXNJbml0aWFsaXplZCl7Y29uc3QgZT0iQXR0ZW1wdGVkIHRvIGluaXRpYWxpemUgcHJvdmlkZXIgbW9yZSB0aGFuIG9uZSB0aW1lLiIsdD17fTt0cnl7Y29uc3QgdD1vKCk7bmV3IFIoe3NvdXJjZToiY29yZS5hbWF6b25Db25uZWN0UHJvdmlkZXIuaW5pdCIscHJvdmlkZXI6dH0pLmVycm9yKGUpfWNhdGNoKGUpe3QubG9nZ2luZ0Vycm9yPW51bGw9PWU/dm9pZCAwOmUubWVzc2FnZX10aHJvdyBuZXcgaSh7ZXJyb3JLZXk6ImF0dGVtcHRJbml0aWFsaXplTXVsdGlwbGVQcm92aWRlcnMiLHJlYXNvbjplLGRldGFpbHM6dH0pfXJldHVybiBmdW5jdGlvbihlKXtpZihyKXRocm93IG5ldyBFcnJvcigiR2xvYmFsIFByb3ZpZGVyIGlzIGFscmVhZHkgc2V0Iik7cj1lfShlKSx0aGlzLmlzSW5pdGlhbGl6ZWQ9ITAsZS5nZXRQcm94eSgpLGV9fUEuaXNJbml0aWFsaXplZD0hMSxmdW5jdGlvbihlKXtlW2UudHJhY2U9MV09InRyYWNlIixlW2UuZGVidWc9Ml09ImRlYnVnIixlW2UuaW5mbz0zXT0iaW5mbyIsZVtlLndhcm49NF09Indhcm4iLGVbZS5lcnJvcj01XT0iZXJyb3IifShDfHwoQz17fSkpO2NsYXNzIF97Y29uc3RydWN0b3IoZSl7dGhpcy5taXhpbj1lfWdldFRyYW5zZm9ybWVkRGF0YShlLHQpe3JldHVybiB0aGlzLm1peGluP09iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxudWxsIT10P3Q6e30pLHRoaXMubWl4aW4obnVsbCE9dD90Ont9LGUpKTp0fX1jbGFzcyBSe2NvbnN0cnVjdG9yKGUpe3RoaXMuX3Byb3h5PW51bGwsdGhpcy5fbG9nVG9Db25zb2xlTGV2ZWw9bnVsbCx0aGlzLmxvZ2dlcklkPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9bmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKGUvMikpO3JldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHQpLEFycmF5LmZyb20odCwoZT0+ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpKSkuam9pbigiIikuc3Vic3RyaW5nKDAsZSl9KDgpLCJzdHJpbmciPT10eXBlb2YgZT8odGhpcy5zb3VyY2U9ZSx0aGlzLmRhdGFUcmFuc2Zvcm1lcj1uZXcgXyh2b2lkIDApKToodGhpcy5zb3VyY2U9ZS5zb3VyY2UsZS5wcm92aWRlciYmImZ1bmN0aW9uIj09dHlwZW9mIGUucHJvdmlkZXI/dGhpcy5wcm92aWRlckZhY3Rvcnk9ZS5wcm92aWRlcjp0aGlzLnByb3ZpZGVyPWUucHJvdmlkZXIsdGhpcy5kYXRhVHJhbnNmb3JtZXI9bmV3IF8oZS5taXhpbiksdGhpcy5sb2dPcHRpb25zPWUub3B0aW9ucyl9dHJhY2UoZSx0LG4pe3RoaXMubG9nKEMudHJhY2UsZSx0LG4pfWRlYnVnKGUsdCxuKXt0aGlzLmxvZyhDLmRlYnVnLGUsdCxuKX1pbmZvKGUsdCxuKXt0aGlzLmxvZyhDLmluZm8sZSx0LG4pfXdhcm4oZSx0LG4pe3RoaXMubG9nKEMud2FybixlLHQsbil9ZXJyb3IoZSx0LG4pe3RoaXMubG9nKEMuZXJyb3IsZSx0LG4pfWxvZyhlLHQsbixyKXtjb25zdCBvPXRoaXMuZGF0YVRyYW5zZm9ybWVyLmdldFRyYW5zZm9ybWVkRGF0YShlLG4pO3RoaXMuaWdub3JlUmVtb3RlKHIpfHx0aGlzLmdldFByb3h5KCkubG9nKHtsZXZlbDplLHNvdXJjZTp0aGlzLnNvdXJjZSxsb2dnZXJJZDp0aGlzLmxvZ2dlcklkLG1lc3NhZ2U6dCxkYXRhOm99KSx0aGlzLmFwcGx5RHVwbGljYXRlTWVzc2FnZVRvQ29uc29sZShlLHIpJiZmdW5jdGlvbihlLHQsbil7aWYobilzd2l0Y2goZSl7Y2FzZSBDLmVycm9yOmNvbnNvbGUuZXJyb3IodCxuKTticmVhaztjYXNlIEMud2Fybjpjb25zb2xlLndhcm4odCxuKTticmVhaztjYXNlIEMuaW5mbzpjb25zb2xlLmluZm8odCxuKTticmVhaztjYXNlIEMuZGVidWc6Y29uc29sZS5kZWJ1Zyh0LG4pO2JyZWFrO2Nhc2UgQy50cmFjZTpjb25zb2xlLnRyYWNlKHQsbik7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmxvZyh0LG4pfWVsc2Ugc3dpdGNoKGUpe2Nhc2UgQy5lcnJvcjpjb25zb2xlLmVycm9yKHQpO2JyZWFrO2Nhc2UgQy53YXJuOmNvbnNvbGUud2Fybih0KTticmVhaztjYXNlIEMuaW5mbzpjb25zb2xlLmluZm8odCk7YnJlYWs7Y2FzZSBDLmRlYnVnOmNvbnNvbGUuZGVidWcodCk7YnJlYWs7Y2FzZSBDLnRyYWNlOmNvbnNvbGUudHJhY2UodCk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmxvZyh0KX19KGUsdCxvKX1nZXRQcm92aWRlcigpe3JldHVybiB0aGlzLnByb3ZpZGVyfHwodGhpcy5wcm92aWRlcj10aGlzLnByb3ZpZGVyRmFjdG9yeT90aGlzLnByb3ZpZGVyRmFjdG9yeSgpOm8oKSksdGhpcy5wcm92aWRlcn1nZXRQcm94eSgpe3JldHVybiB0aGlzLl9wcm94eXx8KHRoaXMuX3Byb3h5PXRoaXMuZ2V0UHJvdmlkZXIoKS5nZXRQcm94eSgpKSx0aGlzLl9wcm94eX1hcHBseUR1cGxpY2F0ZU1lc3NhZ2VUb0NvbnNvbGUoZSx0KXtyZXR1cm4obnVsbD09dD92b2lkIDA6dC5kdXBsaWNhdGVNZXNzYWdlVG9Db25zb2xlKXx8dGhpcy5nZXRMb2dDb25zb2xlTGV2ZWwoKTw9ZX1nZXRMb2dDb25zb2xlTGV2ZWwoKXt2YXIgZSx0LG4scjtyZXR1cm4gdGhpcy5fbG9nVG9Db25zb2xlTGV2ZWx8fCh0aGlzLl9sb2dUb0NvbnNvbGVMZXZlbD0obnVsbD09PShlPXRoaXMubG9nT3B0aW9ucyl8fHZvaWQgMD09PWU/dm9pZCAwOmUubWluTG9nVG9Db25zb2xlTGV2ZWxPdmVycmlkZSk/dGhpcy5sb2dPcHRpb25zLm1pbkxvZ1RvQ29uc29sZUxldmVsT3ZlcnJpZGU6bnVsbCE9PShyPW51bGw9PT0obj1udWxsPT09KHQ9dGhpcy5nZXRQcm92aWRlcigpLmNvbmZpZyl8fHZvaWQgMD09PXQ/dm9pZCAwOnQubG9nZ2luZyl8fHZvaWQgMD09PW4/dm9pZCAwOm4ubWluTG9nVG9Db25zb2xlTGV2ZWwpJiZ2b2lkIDAhPT1yP3I6Qy5lcnJvciksdGhpcy5fbG9nVG9Db25zb2xlTGV2ZWx9aWdub3JlUmVtb3RlKGUpe3ZhciB0LG4scjtyZXR1cm4gbnVsbCE9PShuPW51bGw9PT0odD10aGlzLmxvZ09wdGlvbnMpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LnJlbW90ZUlnbm9yZSkmJnZvaWQgMCE9PW4mJm58fG51bGwhPT0ocj1udWxsPT1lP3ZvaWQgMDplLnJlbW90ZUlnbm9yZSkmJnZvaWQgMCE9PXImJnJ9fWNsYXNzIE8gZXh0ZW5kcyB3e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLHRoaXMucG9zdE1lc3NhZ2VIYW5kbGVyPXRoaXMubGlzdGVuRm9ySW5pdGlhbE1lc3NhZ2UuYmluZCh0aGlzKSx0aGlzLnByb3h5TG9nZ2VyPW5ldyBSKHtzb3VyY2U6InNpdGVQcm94eSIscHJvdmlkZXI6ZX0pfWluaXRQcm94eSgpe3RoaXMuc3RhdHVzLnVwZGF0ZSh7c3RhdHVzOiJjb25uZWN0aW5nIn0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnBvc3RNZXNzYWdlSGFuZGxlcil9cmVzZXRDb25uZWN0aW9uKGUpe3N1cGVyLnJlc2V0Q29ubmVjdGlvbihlKSx0aGlzLm1lc3NhZ2VQb3J0PXZvaWQgMCx0aGlzLnN0YXR1cy51cGRhdGUoe3N0YXR1czoiY29ubmVjdGluZyJ9KX1zZW5kTWVzc2FnZVRvU3ViamVjdChlKXt0aGlzLm1lc3NhZ2VQb3J0P3RoaXMubWVzc2FnZVBvcnQucG9zdE1lc3NhZ2UoZSk6dGhpcy5wcm94eUxvZ2dlci5lcnJvcigiRmFpbGVkIHRvIHNlbmQgVXBzdHJlYW1NZXNzYWdlLiBNZXNzYWdlUG9ydCBub3Qgc2V0Iix7bWVzc2FnZVR5cGU6ZS50eXBlfSl9YWRkQ29udGV4dFRvTG9nZ2VyKCl7cmV0dXJue319bGlzdGVuRm9ySW5pdGlhbE1lc3NhZ2UoZSl7aWYodGhpcy52ZXJpZnlPcmlnaW4oZSkmJnRoaXMudmVyaWZ5RXZlbnRTb3VyY2UoZSkpe2lmKCJjcm9zcy1kb21haW4tYWRhcHRlci1pbml0IiE9PWUuZGF0YS50eXBlKXJldHVybiB2b2lkIHRoaXMuaW52YWxpZEluaXRNZXNzYWdlSGFuZGxlcihlLmRhdGEpO2lmKHRoaXMubWVzc2FnZVBvcnQmJih0aGlzLnJlc2V0Q29ubmVjdGlvbigiU3Vic2VxdWVudCBNZXNzYWdlIFBvcnQgRGV0ZWN0ZWQiKSx0aGlzLnByb3h5TG9nZ2VyLmluZm8oIlN1YnNlcXVlbnQgbWVzc2FnZSBwb3J0IHJlY2VpdmVkLiBSZXNldHRpbmcgY29ubmVjdGlvbiIpKSx0aGlzLm1lc3NhZ2VQb3J0PWUucG9ydHNbMF0sIXRoaXMubWVzc2FnZVBvcnQpdGhyb3cgbmV3IEVycm9yKCJtZXNzYWdlIHBvcnQgbm90IHByb3ZpZGVkIGJ5IGlmcmFtZSIpO3RoaXMubWVzc2FnZVBvcnQub25tZXNzYWdlPXRoaXMuY29uc3VtZXJNZXNzYWdlSGFuZGxlci5iaW5kKHRoaXMpLHRoaXMuc3RhdHVzLnVwZGF0ZSh7c3RhdHVzOiJpbml0aWFsaXppbmcifSksdGhpcy5tZXNzYWdlUG9ydC5wb3N0TWVzc2FnZSh7dHlwZToiY3Jvc3MtZG9tYWluLXNpdGUtcmVhZHkiLHByb3ZpZGVySWQ6dGhpcy5wcm92aWRlci5pZH0pLHRoaXMucHJveHlMb2dnZXIuZGVidWcoIkNEQSBQb3N0IG1lc3NhZ2UgaGFuZGxlciByZW1vdmVkIil9fXZlcmlmeU9yaWdpbihlKXtjb25zdCB0PWUub3JpZ2luO2lmKCF0KXJldHVybiB0aGlzLnByb3h5TG9nZ2VyLndhcm4oIk5vIG9yaWdpbiBwcm92aWRlZCBpbiBldmVudC4gSWdub3JpbmcgZXZlbnQuIiksITE7bGV0IG47dHJ5e249bmV3IFVSTCh0aGlzLnByb3ZpZGVyLmNvbmZpZy5pbnN0YW5jZVVybCkub3JpZ2lufWNhdGNoKGUpe3JldHVybiB0aGlzLnByb3h5TG9nZ2VyLmVycm9yKCJVbmFibGUgdG8gcGFyc2UgZXhwZWN0ZWQgb3JpZ2luIGZyb20gY29uZmlnLiBDYW5ub3QgbWF0Y2giLHtlcnJvcjplLGV2ZW50T3JpZ2luOnQsY29uZmlnSW5zdGFuY2VVcmw6dGhpcy5wcm92aWRlci5jb25maWcuaW5zdGFuY2VVcmx9LHtkdXBsaWNhdGVNZXNzYWdlVG9Db25zb2xlOiEwfSksITF9cmV0dXJuIHQ9PT1ufHwoImNyb3NzLWRvbWFpbi1hZGFwdGVyLWluaXQiPT09ZS5kYXRhLnR5cGUmJnRoaXMucHJveHlMb2dnZXIud2FybigiT3JpZ2luIG9mIG1lc3NhZ2Ugd2l0aCB0eXBlICdjcm9zcy1kb21haW4tYWRhcHRlci1pbml0JyBkaWQgbm90IGV4cGVjdGVkIGluc3RhbmNlIHZhbHVlLiBJZ25vcmluZyIse2V4cGVjdGVkT3JpZ2luOm4sZXZlbnRPcmlnaW46dH0se2R1cGxpY2F0ZU1lc3NhZ2VUb0NvbnNvbGU6ITB9KSwhMSl9fWNsYXNzIEwgZXh0ZW5kcyBPe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLHRoaXMuY2NwSUZyYW1lPW51bGx9Z2V0IHByb3h5VHlwZSgpe3JldHVybiJzdHJlYW1zLXNpdGUifXNldENDUElmcmFtZShlKXtjb25zdCB0PUJvb2xlYW4odGhpcy5jY3BJRnJhbWUpO3RoaXMuY2NwSUZyYW1lPWUsdCYmdGhpcy5yZXNldENvbm5lY3Rpb24oIkNDUCBJRnJhbWUgVXBkYXRlZCIpfWdldFVwc3RyZWFtTWVzc2FnZU9yaWdpbigpe3JldHVybiBPYmplY3QuYXNzaWduKHtfdHlwZToic3RyZWFtcy1zaXRlIixwcm92aWRlcklkOnRoaXMucHJvdmlkZXIuaWR9LHtvcmlnaW46bnVsbCE9PSh0PW51bGw9PT0oZT1udWxsPT09ZG9jdW1lbnR8fHZvaWQgMD09PWRvY3VtZW50P3ZvaWQgMDpkb2N1bWVudC5sb2NhdGlvbil8fHZvaWQgMD09PWU/dm9pZCAwOmUub3JpZ2luKSYmdm9pZCAwIT09dD90OiJ1bmtub3duIixwYXRoOm51bGwhPT0ocj1udWxsPT09KG49bnVsbD09PWRvY3VtZW50fHx2b2lkIDA9PT1kb2N1bWVudD92b2lkIDA6ZG9jdW1lbnQubG9jYXRpb24pfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLnBhdGhuYW1lKSYmdm9pZCAwIT09cj9yOiJ1bmtub3duIn0pO3ZhciBlLHQsbixyfXZlcmlmeUV2ZW50U291cmNlKGUpe2NvbnN0IHQ9dGhpcy5jY3BJRnJhbWU7aWYoIXQpcmV0dXJuIHRoaXMucHJveHlMb2dnZXIuZXJyb3IoIkNDUCBJZnJhbWUgbm90IHByb3ZpZGVkIHRvIHByb3h5LiBVbmFibGUgdG8gdmVyaWZ5IGV2ZW50IHRvIENvbm5lY3QgdG8gQ0NQLiIse29yaWdpbjplLm9yaWdpbn0pLCExO2NvbnN0IG49ZS5zb3VyY2U9PT10LmNvbnRlbnRXaW5kb3c7cmV0dXJuIG58fHRoaXMucHJveHlMb2dnZXIud2FybigiTWVzc2FnZSBjYW1lIGZyb20gdW5leHBlY3RlZCBpZnJhbWUuIE5vdCBhIHZhbGlkIENDUC4gV2lsbCBub3QgY29ubmVjdCIse29yaWdpbjplLm9yaWdpbn0pLG59aW52YWxpZEluaXRNZXNzYWdlSGFuZGxlcigpe319Y2xhc3MgayBleHRlbmRzIEF7Y29uc3RydWN0b3IoZSl7c3VwZXIoe2NvbmZpZzplLHByb3h5RmFjdG9yeTplPT5uZXcgTChlKX0pfXN0YXRpYyBpbml0KGUpe2NvbnN0IHQ9bmV3IGsoZSk7cmV0dXJuIGsuaW5pdGlhbGl6ZVByb3ZpZGVyKHQpLHtwcm92aWRlcjp0fX1zdGF0aWMgZ2V0IGRlZmF1bHQoKXtyZXR1cm4gbygiQW1hem9uQ29ubmVjdFN0cmVhbXNTaXRlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCIpfXNldENDUElmcmFtZShlKXt0aGlzLmdldFByb3h5KCkuc2V0Q0NQSWZyYW1lKGUpfX19LDgyNTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10LHQuYWdlbnRBcHA9e307dmFyIG49e0NDUDoiY2NwIixHVUlERVM6ImN1c3RvbXZpZXdzIn07dC5hZ2VudEFwcC5pbml0Q0NQPXQuY29yZS5pbml0Q0NQLHQuYWdlbnRBcHAuaXNJbml0aWFsaXplZD1mdW5jdGlvbihlKXt9LHQuYWdlbnRBcHAuaW5pdEFwcENvbW11bmljYXRpb249ZnVuY3Rpb24oZSxuKXt2YXIgcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKSxvPW5ldyB0LklGcmFtZUNvbmR1aXQobix3aW5kb3csciksaT1bdC5BZ2VudEV2ZW50cy5VUERBVEUsdC5Db250YWN0RXZlbnRzLlZJRVcsdC5FdmVudFR5cGUuQUNLTk9XTEVER0UsdC5FdmVudFR5cGUuVEVSTUlOQVRFRCx0LlRhc2tFdmVudHMuQ1JFQVRFRCx0LkVtYWlsRXZlbnRzLkNSRUFURURdO3IuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKGUpe2kuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbShlLChmdW5jdGlvbih0KXtvLnNlbmRVcHN0cmVhbShlLHQpfSkpfSkpfSkpfTt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdD1lLmluZGV4T2YoImNjcC12MiIpO3JldHVybiBlLnNsaWNlKDAsdC0xKX0sbz1mdW5jdGlvbihlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIGU7dHJ5e3JldHVybiBlLmdldENvbnRhY3RJZCgpfWNhdGNoKHQpe3JldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIltDdXN0b21WaWV3c106IEludmFsaWQgQ29udGFjdCBQcm92aWRlZDogIixlKX19O3QuYWdlbnRBcHAuaW5pdEFwcD1mdW5jdGlvbihlLGksYSxzKXtzPXN8fHt9O3ZhciBjLHU9YS5lbmRzV2l0aCgiLyIpfHwvWz8mXT9bXj0/Jl0rPVtePT8mXSsvZy50ZXN0KGEpP2E6YSsiLyIsbD1zLm9uTG9hZD9zLm9uTG9hZDpudWxsLHA9e2VuZHBvaW50OnUsc3R5bGU6cy5zdHlsZSxvbkxvYWQ6bH07aWYoZT09PW4uQ0NQX0RSKWM9bi5DQ1A7ZWxzZSBpZihlPT09bi5HVUlERVMmJnMuY3VzdG9tVmlld3NQYXJhbXMpe3ZhciBkPXMuY3VzdG9tVmlld3NQYXJhbXMuaWZyYW1lU3VmZml4O2lmKGM9ZD8iIi5jb25jYXQobi5HVUlERVMpLmNvbmNhdChkKToiIi5jb25jYXQobi5HVUlERVMpLHZvaWQgMCE9PXQuYWdlbnRBcHAuQXBwUmVnaXN0cnkuZ2V0KGMpKXRocm93IG5ldyBFcnJvcigiW0N1c3RvbVZpZXdzXTogQ3VzdG9tIHZpZXdzIGFwcGxpY2F0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4gUGxlYXNlIHByb3ZpZGUgYSBkaWZmZXJlbnQgaWZyYW1lU3VmZml4IGZvciB0aGUgY3VzdG9tIHZpZXdzIGFwcGxpY2F0aW9uLiIpfWVsc2UgYz1lO3ZhciBoPSJzdHJpbmciPT10eXBlb2YgaT9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKTppO3QuYWdlbnRBcHAuQXBwUmVnaXN0cnkucmVnaXN0ZXIoYyxwLGgpLHQuYWdlbnRBcHAuQXBwUmVnaXN0cnkuc3RhcnQoYywoZnVuY3Rpb24oaSl7dmFyIGE9aS5lbmRwb2ludCx1PWkuY29udGFpbmVyRE9NO3JldHVybntpbml0OmZ1bmN0aW9uKCl7c3dpdGNoKGUpe2Nhc2Ugbi5DQ1A6cmV0dXJuIHMuY2NwUGFyYW1zPXMuY2NwUGFyYW1zP3MuY2NwUGFyYW1zOnt9LHMuc3R5bGUmJihzLmNjcFBhcmFtcy5zdHlsZT1zLnN0eWxlKSxmdW5jdGlvbihlLG4sbyl7dmFyIGk9e2NjcFVybDplLGNjcExvYWRUaW1lb3V0OjFlNCxsb2dpblBvcHVwOiEwLGxvZ2luVXJsOnIoZSkrIi9sb2dpbiIsc29mdHBob25lOnthbGxvd0ZyYW1lZFNvZnRwaG9uZTohMCxkaXNhYmxlUmluZ3RvbmU6ITEsYWxsb3dGcmFtZWRWaWRlb0NhbGw6ITAsYWxsb3dGcmFtZWRTY3JlZW5TaGFyaW5nOiEwLGFsbG93RnJhbWVkU2NyZWVuU2hhcmluZ1BvcFVwOiExfX0sYT10Lm1lcmdlKGksby5jY3BQYXJhbXMpO3QuY29yZS5pbml0Q0NQKG4sYSl9KGEsdSxzKTtjYXNlIG4uR1VJREVTOnJldHVybiB2b2lkIDAhPT1zLmN1c3RvbVZpZXdzUGFyYW1zPyh0LmFnZW50QXBwLmluaXRBcHBDb21tdW5pY2F0aW9uKGMsYSx1KSxmdW5jdGlvbihlLHIsaSl7dmFyIGEscyxjPWkuY3VzdG9tVmlld3NQYXJhbXMsdT1jLmNvbnRhY3QsbD1jLmRpc2FibGVBdXRvRGVzdHJveSxwPWMuaWZyYW1lU3VmZml4LGQ9Yy50ZXJtaW5hdGVDdXN0b21WaWV3T3B0aW9ucyxoPXZvaWQgMD09PWQ/e306ZCxmPWkuY3VzdG9tVmlld3NQYXJhbXMuY29udGFjdEZsb3dJZDt2b2lkIDAhPT11JiYoKGE9byh1KSkmJiEwIT09bCYmInN0cmluZyIhPXR5cGVvZiB1JiZ1Lm9uRGVzdHJveSgoZnVuY3Rpb24obil7dC5jb3JlLnRlcm1pbmF0ZUN1c3RvbVZpZXcoZSxwLHt0aW1lb3V0OmgudGltZW91dHx8NWUzLGhpZGVJZnJhbWU6dm9pZCAwPT09aC5oaWRlSWZyYW1lfHxoLmhpZGVJZnJhbWUscmVzb2x2ZUlmcmFtZTp2b2lkIDA9PT1oLnJlc29sdmVJZnJhbWV8fGgucmVzb2x2ZUlmcmFtZX0pfSkpLGZ8fGNvbnNvbGUud2FybigiW0N1c3RvbVZpZXdzXTogTmVlZCB0byBwcm92aWRlIGEgY29udGFjdEZsb3dJZCB3aGVuIGRlZmluaW5nIGNvbnRhY3QgcGFyYW1ldGVyIGZvciBpbml0YWxpemluZyBjdXN0b212aWV3cyBhcHBsaWNhdGlvbiIpKSxzPXA/IiIuY29uY2F0KG4uR1VJREVTKS5jb25jYXQocCk6IiIuY29uY2F0KG4uR1VJREVTKTt2YXIgZz0iaWZyYW1lW2lkPSciLmNvbmNhdChzLCInXSIpLG09KG51bGw9PXI/dm9pZCAwOnIucXVlcnlTZWxlY3RvcihnKSl8fGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHMpfHx3aW5kb3cudG9wLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHMpO2lmKCFtKXRocm93IG5ldyBFcnJvcigiW0N1c3RvbVZpZXdzXTogTm8gaWZyYW1lIGZvdW5kIGZvciB0aGUgYXBwOiAiLHMpO3ZhciB2PUFXUy51dGlsLnV1aWQudjQoKTthP20uc3JjPSIiLmNvbmNhdChlLCI/Y29udGFjdEZsb3dJZD0iKS5jb25jYXQoZiwiJmN1cnJlbnRDb250YWN0SWQ9IikuY29uY2F0KGEsIiZhZ2VudEFwcFRhYklkPSIpLmNvbmNhdCh2LCItdGFiIik6ZiYmKG0uc3JjPSIiLmNvbmNhdChlLCI/Y29udGFjdEZsb3dJZD0iKS5jb25jYXQoZiwiJmFnZW50QXBwVGFiSWQ9IikuY29uY2F0KHYsIi10YWIiKSl9KGEsdSxzKSk6dC5hZ2VudEFwcC5pbml0QXBwQ29tbXVuaWNhdGlvbihjLGEsdSk7ZGVmYXVsdDpyZXR1cm4gdC5hZ2VudEFwcC5pbml0QXBwQ29tbXVuaWNhdGlvbihjLGEsdSl9fSxkZXN0cm95OmZ1bmN0aW9uKCl7c3dpdGNoKGUpe2Nhc2Ugbi5DQ1A6cmV0dXJuIGk9cihhKSsiL2xvZ291dCIsdC5mZXRjaChpLHtjcmVkZW50aWFsczoiaW5jbHVkZSJ9KS50aGVuKChmdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLlRFUk1JTkFURSksITB9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3JldHVybiB0LmdldExvZygpLmVycm9yKCJBbiBlcnJvciBvY2N1cmVkIG9uIGxvZ291dC4iK2UpLndpdGhFeGNlcHRpb24oZSksd2luZG93LmxvY2F0aW9uLmhyZWY9aSwhMX0pKTtjYXNlIG4uR1VJREVTOnJldHVybiB2b2lkIDAhPT1zLmN1c3RvbVZpZXdzUGFyYW1zPyhvPWMsdm9pZCB0LmFnZW50QXBwLkFwcFJlZ2lzdHJ5LmRlbGV0ZShvKSk6bnVsbDtkZWZhdWx0OnJldHVybiBudWxsfXZhciBvLGl9fX0pKX0sdC5hZ2VudEFwcC5zdG9wQXBwPWZ1bmN0aW9uKGUpe3JldHVybiB0LmFnZW50QXBwLkFwcFJlZ2lzdHJ5LnN0b3AoZSl9fSgpfSw5NjE6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dDt2YXIgbixyPSJjY3AiO2UuY29ubmVjdC5hZ2VudEFwcC5BcHBSZWdpc3RyeT0obj17fSx7cmVnaXN0ZXI6ZnVuY3Rpb24oZSx0LHIpe25bZV09e2NvbnRhaW5lckRPTTpyLGVuZHBvaW50OnQuZW5kcG9pbnQsc3R5bGU6dC5zdHlsZSxpbnN0YW5jZTp2b2lkIDAsb25Mb2FkOnQub25Mb2FkfX0sc3RhcnQ6ZnVuY3Rpb24oZSx0KXtpZihuW2VdKXt2YXIgbz1uW2VdLmNvbnRhaW5lckRPTSxpPW5bZV0uZW5kcG9pbnQsYT1uW2VdLnN0eWxlLHM9bltlXS5vbkxvYWQ7aWYoZSE9PXIpe3ZhciBjPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3JldHVybiBvLnNyYz10LG8uc3R5bGU9bnx8IndpZHRoOiAxMDAlOyBoZWlnaHQ6MTAwJTsiLG8uaWQ9ZSxvWyJhcmlhLWxhYmVsIl09ZSxvLm9ubG9hZD1yLG8uYWxsb3c9ImNsaXBib2FyZC1yZWFkOyBjbGlwYm9hcmQtd3JpdGUiLG8uc2V0QXR0cmlidXRlKCJzYW5kYm94IiwiYWxsb3ctZm9ybXMgYWxsb3ctcG9wdXBzIGFsbG93LXBvcHVwcy10by1lc2NhcGUtc2FuZGJveCBhbGxvdy1zYW1lLW9yaWdpbiBhbGxvdy1zY3JpcHRzIiksb30oZSxpLGEscyk7by5hcHBlbmRDaGlsZChjKX1yZXR1cm4gbltlXS5pbnN0YW5jZT10KG5bZV0pLG5bZV0uaW5zdGFuY2UuaW5pdCgpfX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBuW2VdfSxkZWxldGU6ZnVuY3Rpb24oZSl7ZGVsZXRlIG5bZV19LHN0b3A6ZnVuY3Rpb24oZSl7aWYobltlXSl7dmFyIHQscj1uW2VdLG89ci5jb250YWluZXJET00ucXVlcnlTZWxlY3RvcigiaWZyYW1lIik7aWYoZS5pbmNsdWRlcygiY3VzdG9tdmlld3MiKSl7dmFyIGk9ImlmcmFtZVtpZD0nIi5jb25jYXQoZSwiJ10iKTtvPXIuY29udGFpbmVyRE9NLnF1ZXJ5U2VsZWN0b3IoaSl9cmV0dXJuIHIuY29udGFpbmVyRE9NLnJlbW92ZUNoaWxkKG8pLHIuaW5zdGFuY2UmJih0PXIuaW5zdGFuY2UuZGVzdHJveSgpLGRlbGV0ZSByLmluc3RhbmNlKSx0fX19KX0oKX0sNjEwOigpPT57ZnVuY3Rpb24gZShlLHQpe3ZhciBuPU9iamVjdC5rZXlzKGUpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7dCYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gdCh0KXtmb3IodmFyIG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXt2YXIgcj1udWxsIT1hcmd1bWVudHNbbl0/YXJndW1lbnRzW25dOnt9O24lMj9lKE9iamVjdChyKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7cCh0LGUscltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyKSk6ZShPYmplY3QocikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLGUpKX0pKX1yZXR1cm4gdH1mdW5jdGlvbiBuKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGV9KGUpfHxmdW5jdGlvbihlLHQpe3ZhciBuPW51bGw9PWU/bnVsbDoidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmZVtTeW1ib2wuaXRlcmF0b3JdfHxlWyJAQGl0ZXJhdG9yIl07aWYobnVsbCE9bil7dmFyIHIsbyxpLGEscz1bXSxjPSEwLHU9ITE7dHJ5e2lmKGk9KG49bi5jYWxsKGUpKS5uZXh0LDA9PT10KXtpZihPYmplY3QobikhPT1uKXJldHVybjtjPSExfWVsc2UgZm9yKDshKGM9KHI9aS5jYWxsKG4pKS5kb25lKSYmKHMucHVzaChyLnZhbHVlKSxzLmxlbmd0aCE9PXQpO2M9ITApO31jYXRjaChlKXt1PSEwLG89ZX1maW5hbGx5e3RyeXtpZighYyYmbnVsbCE9bi5yZXR1cm4mJihhPW4ucmV0dXJuKCksT2JqZWN0KGEpIT09YSkpcmV0dXJufWZpbmFsbHl7aWYodSl0aHJvdyBvfX1yZXR1cm4gc319KGUsdCl8fHMoZSx0KXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfSgpfWZ1bmN0aW9uIHIoZSl7cmV0dXJuIHI9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9LHIoZSl9ZnVuY3Rpb24gbygpeyJ1c2Ugc3RyaWN0IjtvPWZ1bmN0aW9uKCl7cmV0dXJuIHR9O3ZhciBlLHQ9e30sbj1PYmplY3QucHJvdG90eXBlLGk9bi5oYXNPd25Qcm9wZXJ0eSxhPU9iamVjdC5kZWZpbmVQcm9wZXJ0eXx8ZnVuY3Rpb24oZSx0LG4pe2VbdF09bi52YWx1ZX0scz0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sP1N5bWJvbDp7fSxjPXMuaXRlcmF0b3J8fCJAQGl0ZXJhdG9yIix1PXMuYXN5bmNJdGVyYXRvcnx8IkBAYXN5bmNJdGVyYXRvciIsbD1zLnRvU3RyaW5nVGFnfHwiQEB0b1N0cmluZ1RhZyI7ZnVuY3Rpb24gcChlLHQsbil7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KSxlW3RdfXRyeXtwKHt9LCIiKX1jYXRjaChlKXtwPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZVt0XT1ufX1mdW5jdGlvbiBkKGUsdCxuLHIpe3ZhciBvPXQmJnQucHJvdG90eXBlIGluc3RhbmNlb2YgYj90OmIsaT1PYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSxzPW5ldyBOKHJ8fFtdKTtyZXR1cm4gYShpLCJfaW52b2tlIix7dmFsdWU6UihlLG4scyl9KSxpfWZ1bmN0aW9uIGgoZSx0LG4pe3RyeXtyZXR1cm57dHlwZToibm9ybWFsIixhcmc6ZS5jYWxsKHQsbil9fWNhdGNoKGUpe3JldHVybnt0eXBlOiJ0aHJvdyIsYXJnOmV9fX10LndyYXA9ZDt2YXIgZj0ic3VzcGVuZGVkU3RhcnQiLGc9InN1c3BlbmRlZFlpZWxkIixtPSJleGVjdXRpbmciLHY9ImNvbXBsZXRlZCIseT17fTtmdW5jdGlvbiBiKCl7fWZ1bmN0aW9uIEUoKXt9ZnVuY3Rpb24gUygpe312YXIgQz17fTtwKEMsYywoZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pKTt2YXIgST1PYmplY3QuZ2V0UHJvdG90eXBlT2YsVD1JJiZJKEkoUChbXSkpKTtUJiZUIT09biYmaS5jYWxsKFQsYykmJihDPVQpO3ZhciB3PVMucHJvdG90eXBlPWIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQyk7ZnVuY3Rpb24gQShlKXtbIm5leHQiLCJ0aHJvdyIsInJldHVybiJdLmZvckVhY2goKGZ1bmN0aW9uKHQpe3AoZSx0LChmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5faW52b2tlKHQsZSl9KSl9KSl9ZnVuY3Rpb24gXyhlLHQpe2Z1bmN0aW9uIG4obyxhLHMsYyl7dmFyIHU9aChlW29dLGUsYSk7aWYoInRocm93IiE9PXUudHlwZSl7dmFyIGw9dS5hcmcscD1sLnZhbHVlO3JldHVybiBwJiYib2JqZWN0Ij09cihwKSYmaS5jYWxsKHAsIl9fYXdhaXQiKT90LnJlc29sdmUocC5fX2F3YWl0KS50aGVuKChmdW5jdGlvbihlKXtuKCJuZXh0IixlLHMsYyl9KSwoZnVuY3Rpb24oZSl7bigidGhyb3ciLGUscyxjKX0pKTp0LnJlc29sdmUocCkudGhlbigoZnVuY3Rpb24oZSl7bC52YWx1ZT1lLHMobCl9KSwoZnVuY3Rpb24oZSl7cmV0dXJuIG4oInRocm93IixlLHMsYyl9KSl9Yyh1LmFyZyl9dmFyIG87YSh0aGlzLCJfaW52b2tlIix7dmFsdWU6ZnVuY3Rpb24oZSxyKXtmdW5jdGlvbiBpKCl7cmV0dXJuIG5ldyB0KChmdW5jdGlvbih0LG8pe24oZSxyLHQsbyl9KSl9cmV0dXJuIG89bz9vLnRoZW4oaSxpKTppKCl9fSl9ZnVuY3Rpb24gUih0LG4scil7dmFyIG89ZjtyZXR1cm4gZnVuY3Rpb24oaSxhKXtpZihvPT09bSl0aHJvdyBFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZyIpO2lmKG89PT12KXtpZigidGhyb3ciPT09aSl0aHJvdyBhO3JldHVybnt2YWx1ZTplLGRvbmU6ITB9fWZvcihyLm1ldGhvZD1pLHIuYXJnPWE7Oyl7dmFyIHM9ci5kZWxlZ2F0ZTtpZihzKXt2YXIgYz1PKHMscik7aWYoYyl7aWYoYz09PXkpY29udGludWU7cmV0dXJuIGN9fWlmKCJuZXh0Ij09PXIubWV0aG9kKXIuc2VudD1yLl9zZW50PXIuYXJnO2Vsc2UgaWYoInRocm93Ij09PXIubWV0aG9kKXtpZihvPT09Zil0aHJvdyBvPXYsci5hcmc7ci5kaXNwYXRjaEV4Y2VwdGlvbihyLmFyZyl9ZWxzZSJyZXR1cm4iPT09ci5tZXRob2QmJnIuYWJydXB0KCJyZXR1cm4iLHIuYXJnKTtvPW07dmFyIHU9aCh0LG4scik7aWYoIm5vcm1hbCI9PT11LnR5cGUpe2lmKG89ci5kb25lP3Y6Zyx1LmFyZz09PXkpY29udGludWU7cmV0dXJue3ZhbHVlOnUuYXJnLGRvbmU6ci5kb25lfX0idGhyb3ciPT09dS50eXBlJiYobz12LHIubWV0aG9kPSJ0aHJvdyIsci5hcmc9dS5hcmcpfX19ZnVuY3Rpb24gTyh0LG4pe3ZhciByPW4ubWV0aG9kLG89dC5pdGVyYXRvcltyXTtpZihvPT09ZSlyZXR1cm4gbi5kZWxlZ2F0ZT1udWxsLCJ0aHJvdyI9PT1yJiZ0Lml0ZXJhdG9yLnJldHVybiYmKG4ubWV0aG9kPSJyZXR1cm4iLG4uYXJnPWUsTyh0LG4pLCJ0aHJvdyI9PT1uLm1ldGhvZCl8fCJyZXR1cm4iIT09ciYmKG4ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9bmV3IFR5cGVFcnJvcigiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAnIityKyInIG1ldGhvZCIpKSx5O3ZhciBpPWgobyx0Lml0ZXJhdG9yLG4uYXJnKTtpZigidGhyb3ciPT09aS50eXBlKXJldHVybiBuLm1ldGhvZD0idGhyb3ciLG4uYXJnPWkuYXJnLG4uZGVsZWdhdGU9bnVsbCx5O3ZhciBhPWkuYXJnO3JldHVybiBhP2EuZG9uZT8oblt0LnJlc3VsdE5hbWVdPWEudmFsdWUsbi5uZXh0PXQubmV4dExvYywicmV0dXJuIiE9PW4ubWV0aG9kJiYobi5tZXRob2Q9Im5leHQiLG4uYXJnPWUpLG4uZGVsZWdhdGU9bnVsbCx5KTphOihuLm1ldGhvZD0idGhyb3ciLG4uYXJnPW5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0Iiksbi5kZWxlZ2F0ZT1udWxsLHkpfWZ1bmN0aW9uIEwoZSl7dmFyIHQ9e3RyeUxvYzplWzBdfTsxIGluIGUmJih0LmNhdGNoTG9jPWVbMV0pLDIgaW4gZSYmKHQuZmluYWxseUxvYz1lWzJdLHQuYWZ0ZXJMb2M9ZVszXSksdGhpcy50cnlFbnRyaWVzLnB1c2godCl9ZnVuY3Rpb24gayhlKXt2YXIgdD1lLmNvbXBsZXRpb258fHt9O3QudHlwZT0ibm9ybWFsIixkZWxldGUgdC5hcmcsZS5jb21wbGV0aW9uPXR9ZnVuY3Rpb24gTihlKXt0aGlzLnRyeUVudHJpZXM9W3t0cnlMb2M6InJvb3QifV0sZS5mb3JFYWNoKEwsdGhpcyksdGhpcy5yZXNldCghMCl9ZnVuY3Rpb24gUCh0KXtpZih0fHwiIj09PXQpe3ZhciBuPXRbY107aWYobilyZXR1cm4gbi5jYWxsKHQpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0Lm5leHQpcmV0dXJuIHQ7aWYoIWlzTmFOKHQubGVuZ3RoKSl7dmFyIG89LTEsYT1mdW5jdGlvbiBuKCl7Zm9yKDsrK288dC5sZW5ndGg7KWlmKGkuY2FsbCh0LG8pKXJldHVybiBuLnZhbHVlPXRbb10sbi5kb25lPSExLG47cmV0dXJuIG4udmFsdWU9ZSxuLmRvbmU9ITAsbn07cmV0dXJuIGEubmV4dD1hfX10aHJvdyBuZXcgVHlwZUVycm9yKHIodCkrIiBpcyBub3QgaXRlcmFibGUiKX1yZXR1cm4gRS5wcm90b3R5cGU9UyxhKHcsImNvbnN0cnVjdG9yIix7dmFsdWU6Uyxjb25maWd1cmFibGU6ITB9KSxhKFMsImNvbnN0cnVjdG9yIix7dmFsdWU6RSxjb25maWd1cmFibGU6ITB9KSxFLmRpc3BsYXlOYW1lPXAoUyxsLCJHZW5lcmF0b3JGdW5jdGlvbiIpLHQuaXNHZW5lcmF0b3JGdW5jdGlvbj1mdW5jdGlvbihlKXt2YXIgdD0iZnVuY3Rpb24iPT10eXBlb2YgZSYmZS5jb25zdHJ1Y3RvcjtyZXR1cm4hIXQmJih0PT09RXx8IkdlbmVyYXRvckZ1bmN0aW9uIj09PSh0LmRpc3BsYXlOYW1lfHx0Lm5hbWUpKX0sdC5tYXJrPWZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsUyk6KGUuX19wcm90b19fPVMscChlLGwsIkdlbmVyYXRvckZ1bmN0aW9uIikpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodyksZX0sdC5hd3JhcD1mdW5jdGlvbihlKXtyZXR1cm57X19hd2FpdDplfX0sQShfLnByb3RvdHlwZSkscChfLnByb3RvdHlwZSx1LChmdW5jdGlvbigpe3JldHVybiB0aGlzfSkpLHQuQXN5bmNJdGVyYXRvcj1fLHQuYXN5bmM9ZnVuY3Rpb24oZSxuLHIsbyxpKXt2b2lkIDA9PT1pJiYoaT1Qcm9taXNlKTt2YXIgYT1uZXcgXyhkKGUsbixyLG8pLGkpO3JldHVybiB0LmlzR2VuZXJhdG9yRnVuY3Rpb24obik/YTphLm5leHQoKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gZS5kb25lP2UudmFsdWU6YS5uZXh0KCl9KSl9LEEodykscCh3LGwsIkdlbmVyYXRvciIpLHAodyxjLChmdW5jdGlvbigpe3JldHVybiB0aGlzfSkpLHAodywidG9TdHJpbmciLChmdW5jdGlvbigpe3JldHVybiJbb2JqZWN0IEdlbmVyYXRvcl0ifSkpLHQua2V5cz1mdW5jdGlvbihlKXt2YXIgdD1PYmplY3QoZSksbj1bXTtmb3IodmFyIHIgaW4gdCluLnB1c2gocik7cmV0dXJuIG4ucmV2ZXJzZSgpLGZ1bmN0aW9uIGUoKXtmb3IoO24ubGVuZ3RoOyl7dmFyIHI9bi5wb3AoKTtpZihyIGluIHQpcmV0dXJuIGUudmFsdWU9cixlLmRvbmU9ITEsZX1yZXR1cm4gZS5kb25lPSEwLGV9fSx0LnZhbHVlcz1QLE4ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpOLHJlc2V0OmZ1bmN0aW9uKHQpe2lmKHRoaXMucHJldj0wLHRoaXMubmV4dD0wLHRoaXMuc2VudD10aGlzLl9zZW50PWUsdGhpcy5kb25lPSExLHRoaXMuZGVsZWdhdGU9bnVsbCx0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5hcmc9ZSx0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChrKSwhdClmb3IodmFyIG4gaW4gdGhpcykidCI9PT1uLmNoYXJBdCgwKSYmaS5jYWxsKHRoaXMsbikmJiFpc05hTigrbi5zbGljZSgxKSkmJih0aGlzW25dPWUpfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5kb25lPSEwO3ZhciBlPXRoaXMudHJ5RW50cmllc1swXS5jb21wbGV0aW9uO2lmKCJ0aHJvdyI9PT1lLnR5cGUpdGhyb3cgZS5hcmc7cmV0dXJuIHRoaXMucnZhbH0sZGlzcGF0Y2hFeGNlcHRpb246ZnVuY3Rpb24odCl7aWYodGhpcy5kb25lKXRocm93IHQ7dmFyIG49dGhpcztmdW5jdGlvbiByKHIsbyl7cmV0dXJuIHMudHlw