@nsshunt/stsoauth2plugin 0.1.11 → 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/stsoauth2plugin.es.js +11 -1
- package/dist/stsoauth2plugin.umd.js +6 -6
- package/package.json +2 -2
- package/src/stsoauth2manager.ts +4 -1
- package/dist/assets/stsoauth2worker.56b3b966.js +0 -7
- package/types/Utils/CryptoUtils.d.ts +0 -7
- package/types/Utils/CryptoUtils.d.ts.map +0 -1
- package/types/Utils/QueryParams.d.ts +0 -8
- package/types/Utils/QueryParams.d.ts.map +0 -1
- package/types/index.d.ts +0 -6
- package/types/index.d.ts.map +0 -1
- package/types/index.test.d.ts +0 -1
- package/types/index.test.d.ts.map +0 -1
- package/types/stsStorage.d.ts +0 -22
- package/types/stsStorage.d.ts.map +0 -1
- package/types/stsoauth2manager.d.ts +0 -11
- package/types/stsoauth2manager.d.ts.map +0 -1
- package/types/stsoauth2types.d.ts +0 -89
- package/types/stsoauth2types.d.ts.map +0 -1
- package/types/stsoauth2worker.d.ts +0 -2
- package/types/stsoauth2worker.d.ts.map +0 -1
|
@@ -7201,6 +7201,16 @@ function o(e2, r2) {
|
|
|
7201
7201
|
}
|
|
7202
7202
|
}
|
|
7203
7203
|
n.prototype = new Error(), n.prototype.name = "InvalidTokenError";
|
|
7204
|
+
const encodedJs = "dmFyIGlkPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxjZD1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgdWQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIFZvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIGxkPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksZmQ9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgT3M9KGVlLGFlLGllKT0+YWUgaW4gZWU/aWQoZWUsYWUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmllfSk6ZWVbYWVdPWllLFE9KGVlLGFlKT0+e2Zvcih2YXIgaWUgaW4gYWV8fChhZT17fSkpbGQuY2FsbChhZSxpZSkmJk9zKGVlLGllLGFlW2llXSk7aWYoVm8pZm9yKHZhciBpZSBvZiBWbyhhZSkpZmQuY2FsbChhZSxpZSkmJk9zKGVlLGllLGFlW2llXSk7cmV0dXJuIGVlfSxsZT0oZWUsYWUpPT5jZChlZSx1ZChhZSkpO3ZhciBfcj0oZWUsYWUsaWUpPT4oT3MoZWUsdHlwZW9mIGFlIT0ic3ltYm9sIj9hZSsiIjphZSxpZSksaWUpLHpvPShlZSxhZSxpZSk9PntpZighYWUuaGFzKGVlKSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCAiK2llKX07dmFyIFY9KGVlLGFlLGllKT0+KHpvKGVlLGFlLCJyZWFkIGZyb20gcHJpdmF0ZSBmaWVsZCIpLGllP2llLmNhbGwoZWUpOmFlLmdldChlZSkpLFNlPShlZSxhZSxpZSk9PntpZihhZS5oYXMoZWUpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90IGFkZCB0aGUgc2FtZSBwcml2YXRlIG1lbWJlciBtb3JlIHRoYW4gb25jZSIpO2FlIGluc3RhbmNlb2YgV2Vha1NldD9hZS5hZGQoZWUpOmFlLnNldChlZSxpZSl9LGNlPShlZSxhZSxpZSxjdCk9Pih6byhlZSxhZSwid3JpdGUgdG8gcHJpdmF0ZSBmaWVsZCIpLGN0P2N0LmNhbGwoZWUsaWUpOmFlLnNldChlZSxpZSksaWUpOyhmdW5jdGlvbigpe3ZhciBIdCxidCxGZSxPdCxBcix5bixIZSx2dCxOdCxLZSxLdCwkbix0dCxDcixJcixEcixjcixqcixrcixVcjsidXNlIHN0cmljdCI7dmFyIGVlPXR5cGVvZiBnbG9iYWxUaGlzIT0idW5kZWZpbmVkIj9nbG9iYWxUaGlzOnR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT0idW5kZWZpbmVkIj9nbG9iYWw6dHlwZW9mIHNlbGYhPSJ1bmRlZmluZWQiP3NlbGY6e30sYWU9e2V4cG9ydHM6e319LGllPTFlMyxjdD1pZSo2MCxRdD1jdCo2MCxUdD1RdCoyNCxIbz1UdCo3LEtvPVR0KjM2NS4yNSxCbz1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIHI9dHlwZW9mIGU7aWYocj09PSJzdHJpbmciJiZlLmxlbmd0aD4wKXJldHVybiBKbyhlKTtpZihyPT09Im51bWJlciImJmlzRmluaXRlKGUpKXJldHVybiB0Lmxvbmc/R28oZSk6cW8oZSk7dGhyb3cgbmV3IEVycm9yKCJ2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPSIrSlNPTi5zdHJpbmdpZnkoZSkpfTtmdW5jdGlvbiBKbyhlKXtpZihlPVN0cmluZyhlKSwhKGUubGVuZ3RoPjEwMCkpe3ZhciB0PS9eKC0/KD86XGQrKT9cLj9cZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhlKTtpZighIXQpe3ZhciByPXBhcnNlRmxvYXQodFsxXSksbj0odFsyXXx8Im1zIikudG9Mb3dlckNhc2UoKTtzd2l0Y2gobil7Y2FzZSJ5ZWFycyI6Y2FzZSJ5ZWFyIjpjYXNlInlycyI6Y2FzZSJ5ciI6Y2FzZSJ5IjpyZXR1cm4gcipLbztjYXNlIndlZWtzIjpjYXNlIndlZWsiOmNhc2UidyI6cmV0dXJuIHIqSG87Y2FzZSJkYXlzIjpjYXNlImRheSI6Y2FzZSJkIjpyZXR1cm4gcipUdDtjYXNlImhvdXJzIjpjYXNlImhvdXIiOmNhc2UiaHJzIjpjYXNlImhyIjpjYXNlImgiOnJldHVybiByKlF0O2Nhc2UibWludXRlcyI6Y2FzZSJtaW51dGUiOmNhc2UibWlucyI6Y2FzZSJtaW4iOmNhc2UibSI6cmV0dXJuIHIqY3Q7Y2FzZSJzZWNvbmRzIjpjYXNlInNlY29uZCI6Y2FzZSJzZWNzIjpjYXNlInNlYyI6Y2FzZSJzIjpyZXR1cm4gcippZTtjYXNlIm1pbGxpc2Vjb25kcyI6Y2FzZSJtaWxsaXNlY29uZCI6Y2FzZSJtc2VjcyI6Y2FzZSJtc2VjIjpjYXNlIm1zIjpyZXR1cm4gcjtkZWZhdWx0OnJldHVybn19fX1mdW5jdGlvbiBxbyhlKXt2YXIgdD1NYXRoLmFicyhlKTtyZXR1cm4gdD49VHQ/TWF0aC5yb3VuZChlL1R0KSsiZCI6dD49UXQ/TWF0aC5yb3VuZChlL1F0KSsiaCI6dD49Y3Q/TWF0aC5yb3VuZChlL2N0KSsibSI6dD49aWU/TWF0aC5yb3VuZChlL2llKSsicyI6ZSsibXMifWZ1bmN0aW9uIEdvKGUpe3ZhciB0PU1hdGguYWJzKGUpO3JldHVybiB0Pj1UdD9xcihlLHQsVHQsImRheSIpOnQ+PVF0P3FyKGUsdCxRdCwiaG91ciIpOnQ+PWN0P3FyKGUsdCxjdCwibWludXRlIik6dD49aWU/cXIoZSx0LGllLCJzZWNvbmQiKTplKyIgbXMifWZ1bmN0aW9uIHFyKGUsdCxyLG4pe3ZhciBzPXQ+PXIqMS41O3JldHVybiBNYXRoLnJvdW5kKGUvcikrIiAiK24rKHM/InMiOiIiKX1mdW5jdGlvbiBRbyhlKXtyLmRlYnVnPXIsci5kZWZhdWx0PXIsci5jb2VyY2U9ZixyLmRpc2FibGU9YSxyLmVuYWJsZT1zLHIuZW5hYmxlZD1vLHIuaHVtYW5pemU9Qm8sci5kZXN0cm95PXAsT2JqZWN0LmtleXMoZSkuZm9yRWFjaChpPT57cltpXT1lW2ldfSksci5uYW1lcz1bXSxyLnNraXBzPVtdLHIuZm9ybWF0dGVycz17fTtmdW5jdGlvbiB0KGkpe2xldCBoPTA7Zm9yKGxldCBFPTA7RTxpLmxlbmd0aDtFKyspaD0oaDw8NSktaCtpLmNoYXJDb2RlQXQoRSksaHw9MDtyZXR1cm4gci5jb2xvcnNbTWF0aC5hYnMoaCklci5jb2xvcnMubGVuZ3RoXX1yLnNlbGVjdENvbG9yPXQ7ZnVuY3Rpb24gcihpKXtsZXQgaCxFPW51bGwsVCxJO2Z1bmN0aW9uIGooLi4ueSl7aWYoIWouZW5hYmxlZClyZXR1cm47Y29uc3QgXz1qLGI9TnVtYmVyKG5ldyBEYXRlKSxPPWItKGh8fGIpO18uZGlmZj1PLF8ucHJldj1oLF8uY3Vycj1iLGg9Yix5WzBdPXIuY29lcmNlKHlbMF0pLHR5cGVvZiB5WzBdIT0ic3RyaW5nIiYmeS51bnNoaWZ0KCIlTyIpO2xldCBBPTA7eVswXT15WzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLCgkLE4pPT57aWYoJD09PSIlJSIpcmV0dXJuIiUiO0ErKztjb25zdCBEPXIuZm9ybWF0dGVyc1tOXTtpZih0eXBlb2YgRD09ImZ1bmN0aW9uIil7Y29uc3QgQj15W0FdOyQ9RC5jYWxsKF8sQikseS5zcGxpY2UoQSwxKSxBLS19cmV0dXJuICR9KSxyLmZvcm1hdEFyZ3MuY2FsbChfLHkpLChfLmxvZ3x8ci5sb2cpLmFwcGx5KF8seSl9cmV0dXJuIGoubmFtZXNwYWNlPWksai51c2VDb2xvcnM9ci51c2VDb2xvcnMoKSxqLmNvbG9yPXIuc2VsZWN0Q29sb3IoaSksai5leHRlbmQ9bixqLmRlc3Ryb3k9ci5kZXN0cm95LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShqLCJlbmFibGVkIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITEsZ2V0OigpPT5FIT09bnVsbD9FOihUIT09ci5uYW1lc3BhY2VzJiYoVD1yLm5hbWVzcGFjZXMsST1yLmVuYWJsZWQoaSkpLEkpLHNldDp5PT57RT15fX0pLHR5cGVvZiByLmluaXQ9PSJmdW5jdGlvbiImJnIuaW5pdChqKSxqfWZ1bmN0aW9uIG4oaSxoKXtjb25zdCBFPXIodGhpcy5uYW1lc3BhY2UrKHR5cGVvZiBoPT0idW5kZWZpbmVkIj8iOiI6aCkraSk7cmV0dXJuIEUubG9nPXRoaXMubG9nLEV9ZnVuY3Rpb24gcyhpKXtyLnNhdmUoaSksci5uYW1lc3BhY2VzPWksci5uYW1lcz1bXSxyLnNraXBzPVtdO2xldCBoO2NvbnN0IEU9KHR5cGVvZiBpPT0ic3RyaW5nIj9pOiIiKS5zcGxpdCgvW1xzLF0rLyksVD1FLmxlbmd0aDtmb3IoaD0wO2g8VDtoKyspIUVbaF18fChpPUVbaF0ucmVwbGFjZSgvXCovZywiLio/IiksaVswXT09PSItIj9yLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgiXiIraS5zbGljZSgxKSsiJCIpKTpyLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgiXiIraSsiJCIpKSl9ZnVuY3Rpb24gYSgpe2NvbnN0IGk9Wy4uLnIubmFtZXMubWFwKGwpLC4uLnIuc2tpcHMubWFwKGwpLm1hcChoPT4iLSIraCldLmpvaW4oIiwiKTtyZXR1cm4gci5lbmFibGUoIiIpLGl9ZnVuY3Rpb24gbyhpKXtpZihpW2kubGVuZ3RoLTFdPT09IioiKXJldHVybiEwO2xldCBoLEU7Zm9yKGg9MCxFPXIuc2tpcHMubGVuZ3RoO2g8RTtoKyspaWYoci5za2lwc1toXS50ZXN0KGkpKXJldHVybiExO2ZvcihoPTAsRT1yLm5hbWVzLmxlbmd0aDtoPEU7aCsrKWlmKHIubmFtZXNbaF0udGVzdChpKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBsKGkpe3JldHVybiBpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIsaS50b1N0cmluZygpLmxlbmd0aC0yKS5yZXBsYWNlKC9cLlwqXD8kLywiKiIpfWZ1bmN0aW9uIGYoaSl7cmV0dXJuIGkgaW5zdGFuY2VvZiBFcnJvcj9pLnN0YWNrfHxpLm1lc3NhZ2U6aX1mdW5jdGlvbiBwKCl7Y29uc29sZS53YXJuKCJJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuIil9cmV0dXJuIHIuZW5hYmxlKHIubG9hZCgpKSxyfXZhciBZbz1RbzsoZnVuY3Rpb24oZSx0KXt0LmZvcm1hdEFyZ3M9bix0LnNhdmU9cyx0LmxvYWQ9YSx0LnVzZUNvbG9ycz1yLHQuc3RvcmFnZT1vKCksdC5kZXN0cm95PSgoKT0+e2xldCBmPSExO3JldHVybigpPT57Znx8KGY9ITAsY29uc29sZS53YXJuKCJJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuIikpfX0pKCksdC5jb2xvcnM9WyIjMDAwMENDIiwiIzAwMDBGRiIsIiMwMDMzQ0MiLCIjMDAzM0ZGIiwiIzAwNjZDQyIsIiMwMDY2RkYiLCIjMDA5OUNDIiwiIzAwOTlGRiIsIiMwMENDMDAiLCIjMDBDQzMzIiwiIzAwQ0M2NiIsIiMwMENDOTkiLCIjMDBDQ0NDIiwiIzAwQ0NGRiIsIiMzMzAwQ0MiLCIjMzMwMEZGIiwiIzMzMzNDQyIsIiMzMzMzRkYiLCIjMzM2NkNDIiwiIzMzNjZGRiIsIiMzMzk5Q0MiLCIjMzM5OUZGIiwiIzMzQ0MwMCIsIiMzM0NDMzMiLCIjMzNDQzY2IiwiIzMzQ0M5OSIsIiMzM0NDQ0MiLCIjMzNDQ0ZGIiwiIzY2MDBDQyIsIiM2NjAwRkYiLCIjNjYzM0NDIiwiIzY2MzNGRiIsIiM2NkNDMDAiLCIjNjZDQzMzIiwiIzk5MDBDQyIsIiM5OTAwRkYiLCIjOTkzM0NDIiwiIzk5MzNGRiIsIiM5OUNDMDAiLCIjOTlDQzMzIiwiI0NDMDAwMCIsIiNDQzAwMzMiLCIjQ0MwMDY2IiwiI0NDMDA5OSIsIiNDQzAwQ0MiLCIjQ0MwMEZGIiwiI0NDMzMwMCIsIiNDQzMzMzMiLCIjQ0MzMzY2IiwiI0NDMzM5OSIsIiNDQzMzQ0MiLCIjQ0MzM0ZGIiwiI0NDNjYwMCIsIiNDQzY2MzMiLCIjQ0M5OTAwIiwiI0NDOTkzMyIsIiNDQ0NDMDAiLCIjQ0NDQzMzIiwiI0ZGMDAwMCIsIiNGRjAwMzMiLCIjRkYwMDY2IiwiI0ZGMDA5OSIsIiNGRjAwQ0MiLCIjRkYwMEZGIiwiI0ZGMzMwMCIsIiNGRjMzMzMiLCIjRkYzMzY2IiwiI0ZGMzM5OSIsIiNGRjMzQ0MiLCIjRkYzM0ZGIiwiI0ZGNjYwMCIsIiNGRjY2MzMiLCIjRkY5OTAwIiwiI0ZGOTkzMyIsIiNGRkNDMDAiLCIjRkZDQzMzIl07ZnVuY3Rpb24gcigpe3JldHVybiB0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LnByb2Nlc3MmJih3aW5kb3cucHJvY2Vzcy50eXBlPT09InJlbmRlcmVyInx8d2luZG93LnByb2Nlc3MuX19ud2pzKT8hMDp0eXBlb2YgbmF2aWdhdG9yIT0idW5kZWZpbmVkIiYmbmF2aWdhdG9yLnVzZXJBZ2VudCYmbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC8oZWRnZXx0cmlkZW50KVwvKFxkKykvKT8hMTp0eXBlb2YgZG9jdW1lbnQhPSJ1bmRlZmluZWQiJiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2V8fHR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ3aW5kb3cuY29uc29sZSYmKHdpbmRvdy5jb25zb2xlLmZpcmVidWd8fHdpbmRvdy5jb25zb2xlLmV4Y2VwdGlvbiYmd2luZG93LmNvbnNvbGUudGFibGUpfHx0eXBlb2YgbmF2aWdhdG9yIT0idW5kZWZpbmVkIiYmbmF2aWdhdG9yLnVzZXJBZ2VudCYmbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XC8oXGQrKS8pJiZwYXJzZUludChSZWdFeHAuJDEsMTApPj0zMXx8dHlwZW9mIG5hdmlnYXRvciE9InVuZGVmaW5lZCImJm5hdmlnYXRvci51c2VyQWdlbnQmJm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvYXBwbGV3ZWJraXRcLyhcZCspLyl9ZnVuY3Rpb24gbihmKXtpZihmWzBdPSh0aGlzLnVzZUNvbG9ycz8iJWMiOiIiKSt0aGlzLm5hbWVzcGFjZSsodGhpcy51c2VDb2xvcnM/IiAlYyI6IiAiKStmWzBdKyh0aGlzLnVzZUNvbG9ycz8iJWMgIjoiICIpKyIrIitlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKSwhdGhpcy51c2VDb2xvcnMpcmV0dXJuO2NvbnN0IHA9ImNvbG9yOiAiK3RoaXMuY29sb3I7Zi5zcGxpY2UoMSwwLHAsImNvbG9yOiBpbmhlcml0Iik7bGV0IGk9MCxoPTA7ZlswXS5yZXBsYWNlKC8lW2EtekEtWiVdL2csRT0+e0UhPT0iJSUiJiYoaSsrLEU9PT0iJWMiJiYoaD1pKSl9KSxmLnNwbGljZShoLDAscCl9dC5sb2c9Y29uc29sZS5kZWJ1Z3x8Y29uc29sZS5sb2d8fCgoKT0+e30pO2Z1bmN0aW9uIHMoZil7dHJ5e2Y/dC5zdG9yYWdlLnNldEl0ZW0oImRlYnVnIixmKTp0LnN0b3JhZ2UucmVtb3ZlSXRlbSgiZGVidWciKX1jYXRjaHt9fWZ1bmN0aW9uIGEoKXtsZXQgZjt0cnl7Zj10LnN0b3JhZ2UuZ2V0SXRlbSgiZGVidWciKX1jYXRjaHt9cmV0dXJuIWYmJnR5cGVvZiBwcm9jZXNzIT0idW5kZWZpbmVkIiYmImVudiJpbiBwcm9jZXNzJiYoZj17fS5ERUJVRyksZn1mdW5jdGlvbiBvKCl7dHJ5e3JldHVybiBsb2NhbFN0b3JhZ2V9Y2F0Y2h7fX1lLmV4cG9ydHM9WW8odCk7Y29uc3R7Zm9ybWF0dGVyczpsfT1lLmV4cG9ydHM7bC5qPWZ1bmN0aW9uKGYpe3RyeXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZil9Y2F0Y2gocCl7cmV0dXJuIltVbmV4cGVjdGVkSlNPTlBhcnNlRXJyb3JdOiAiK3AubWVzc2FnZX19fSkoYWUsYWUuZXhwb3J0cyk7dmFyIE5zPWFlLmV4cG9ydHMsT249e2V4cG9ydHM6e319LFBzPWZ1bmN0aW9uKHQscil7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBzPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxhPTA7YTxzLmxlbmd0aDthKyspc1thXT1hcmd1bWVudHNbYV07cmV0dXJuIHQuYXBwbHkocixzKX19LFdvPVBzLE5uPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsUG49ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByPU5uLmNhbGwodCk7cmV0dXJuIGVbcl18fChlW3JdPXIuc2xpY2UoOCwtMSkudG9Mb3dlckNhc2UoKSl9fShPYmplY3QuY3JlYXRlKG51bGwpKTtmdW5jdGlvbiBBdChlKXtyZXR1cm4gZT1lLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24ocil7cmV0dXJuIFBuKHIpPT09ZX19ZnVuY3Rpb24gVG4oZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl9ZnVuY3Rpb24gR3IoZSl7cmV0dXJuIHR5cGVvZiBlPT0idW5kZWZpbmVkIn1mdW5jdGlvbiBYbyhlKXtyZXR1cm4gZSE9PW51bGwmJiFHcihlKSYmZS5jb25zdHJ1Y3RvciE9PW51bGwmJiFHcihlLmNvbnN0cnVjdG9yKSYmdHlwZW9mIGUuY29uc3RydWN0b3IuaXNCdWZmZXI9PSJmdW5jdGlvbiImJmUuY29uc3RydWN0b3IuaXNCdWZmZXIoZSl9dmFyIFRzPUF0KCJBcnJheUJ1ZmZlciIpO2Z1bmN0aW9uIFpvKGUpe3ZhciB0O3JldHVybiB0eXBlb2YgQXJyYXlCdWZmZXIhPSJ1bmRlZmluZWQiJiZBcnJheUJ1ZmZlci5pc1ZpZXc/dD1BcnJheUJ1ZmZlci5pc1ZpZXcoZSk6dD1lJiZlLmJ1ZmZlciYmVHMoZS5idWZmZXIpLHR9ZnVuY3Rpb24geG8oZSl7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIn1mdW5jdGlvbiBlaShlKXtyZXR1cm4gdHlwZW9mIGU9PSJudW1iZXIifWZ1bmN0aW9uIEFzKGUpe3JldHVybiBlIT09bnVsbCYmdHlwZW9mIGU9PSJvYmplY3QifWZ1bmN0aW9uIFFyKGUpe2lmKFBuKGUpIT09Im9iamVjdCIpcmV0dXJuITE7dmFyIHQ9T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO3JldHVybiB0PT09bnVsbHx8dD09PU9iamVjdC5wcm90b3R5cGV9dmFyIHRpPUF0KCJEYXRlIikscmk9QXQoIkZpbGUiKSxuaT1BdCgiQmxvYiIpLHNpPUF0KCJGaWxlTGlzdCIpO2Z1bmN0aW9uIEFuKGUpe3JldHVybiBObi5jYWxsKGUpPT09IltvYmplY3QgRnVuY3Rpb25dIn1mdW5jdGlvbiBhaShlKXtyZXR1cm4gQXMoZSkmJkFuKGUucGlwZSl9ZnVuY3Rpb24gb2koZSl7dmFyIHQ9IltvYmplY3QgRm9ybURhdGFdIjtyZXR1cm4gZSYmKHR5cGVvZiBGb3JtRGF0YT09ImZ1bmN0aW9uIiYmZSBpbnN0YW5jZW9mIEZvcm1EYXRhfHxObi5jYWxsKGUpPT09dHx8QW4oZS50b1N0cmluZykmJmUudG9TdHJpbmcoKT09PXQpfXZhciBpaT1BdCgiVVJMU2VhcmNoUGFyYW1zIik7ZnVuY3Rpb24gY2koZSl7cmV0dXJuIGUudHJpbT9lLnRyaW0oKTplLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX1mdW5jdGlvbiB1aSgpe3JldHVybiB0eXBlb2YgbmF2aWdhdG9yIT0idW5kZWZpbmVkIiYmKG5hdmlnYXRvci5wcm9kdWN0PT09IlJlYWN0TmF0aXZlInx8bmF2aWdhdG9yLnByb2R1Y3Q9PT0iTmF0aXZlU2NyaXB0Inx8bmF2aWdhdG9yLnByb2R1Y3Q9PT0iTlMiKT8hMTp0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmdHlwZW9mIGRvY3VtZW50IT0idW5kZWZpbmVkIn1mdW5jdGlvbiBDbihlLHQpe2lmKCEoZT09PW51bGx8fHR5cGVvZiBlPT0idW5kZWZpbmVkIikpaWYodHlwZW9mIGUhPSJvYmplY3QiJiYoZT1bZV0pLFRuKGUpKWZvcih2YXIgcj0wLG49ZS5sZW5ndGg7cjxuO3IrKyl0LmNhbGwobnVsbCxlW3JdLHIsZSk7ZWxzZSBmb3IodmFyIHMgaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxzKSYmdC5jYWxsKG51bGwsZVtzXSxzLGUpfWZ1bmN0aW9uIEluKCl7dmFyIGU9e307ZnVuY3Rpb24gdChzLGEpe1FyKGVbYV0pJiZRcihzKT9lW2FdPUluKGVbYV0scyk6UXIocyk/ZVthXT1Jbih7fSxzKTpUbihzKT9lW2FdPXMuc2xpY2UoKTplW2FdPXN9Zm9yKHZhciByPTAsbj1hcmd1bWVudHMubGVuZ3RoO3I8bjtyKyspQ24oYXJndW1lbnRzW3JdLHQpO3JldHVybiBlfWZ1bmN0aW9uIGxpKGUsdCxyKXtyZXR1cm4gQ24odCxmdW5jdGlvbihzLGEpe3ImJnR5cGVvZiBzPT0iZnVuY3Rpb24iP2VbYV09V28ocyxyKTplW2FdPXN9KSxlfWZ1bmN0aW9uIGZpKGUpe3JldHVybiBlLmNoYXJDb2RlQXQoMCk9PT02NTI3OSYmKGU9ZS5zbGljZSgxKSksZX1mdW5jdGlvbiBkaShlLHQscixuKXtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlLG4pLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsciYmT2JqZWN0LmFzc2lnbihlLnByb3RvdHlwZSxyKX1mdW5jdGlvbiBoaShlLHQscil7dmFyIG4scyxhLG89e307dD10fHx7fTtkb3tmb3Iobj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKSxzPW4ubGVuZ3RoO3MtLSA+MDspYT1uW3NdLG9bYV18fCh0W2FdPWVbYV0sb1thXT0hMCk7ZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSl9d2hpbGUoZSYmKCFyfHxyKGUsdCkpJiZlIT09T2JqZWN0LnByb3RvdHlwZSk7cmV0dXJuIHR9ZnVuY3Rpb24gcGkoZSx0LHIpe2U9U3RyaW5nKGUpLChyPT09dm9pZCAwfHxyPmUubGVuZ3RoKSYmKHI9ZS5sZW5ndGgpLHItPXQubGVuZ3RoO3ZhciBuPWUuaW5kZXhPZih0LHIpO3JldHVybiBuIT09LTEmJm49PT1yfWZ1bmN0aW9uIG1pKGUpe2lmKCFlKXJldHVybiBudWxsO3ZhciB0PWUubGVuZ3RoO2lmKEdyKHQpKXJldHVybiBudWxsO2Zvcih2YXIgcj1uZXcgQXJyYXkodCk7dC0tID4wOylyW3RdPWVbdF07cmV0dXJuIHJ9dmFyIHZpPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZSYmdCBpbnN0YW5jZW9mIGV9fSh0eXBlb2YgVWludDhBcnJheSE9InVuZGVmaW5lZCImJk9iamVjdC5nZXRQcm90b3R5cGVPZihVaW50OEFycmF5KSksUGU9e2lzQXJyYXk6VG4saXNBcnJheUJ1ZmZlcjpUcyxpc0J1ZmZlcjpYbyxpc0Zvcm1EYXRhOm9pLGlzQXJyYXlCdWZmZXJWaWV3OlpvLGlzU3RyaW5nOnhvLGlzTnVtYmVyOmVpLGlzT2JqZWN0OkFzLGlzUGxhaW5PYmplY3Q6UXIsaXNVbmRlZmluZWQ6R3IsaXNEYXRlOnRpLGlzRmlsZTpyaSxpc0Jsb2I6bmksaXNGdW5jdGlvbjpBbixpc1N0cmVhbTphaSxpc1VSTFNlYXJjaFBhcmFtczppaSxpc1N0YW5kYXJkQnJvd3NlckVudjp1aSxmb3JFYWNoOkNuLG1lcmdlOkluLGV4dGVuZDpsaSx0cmltOmNpLHN0cmlwQk9NOmZpLGluaGVyaXRzOmRpLHRvRmxhdE9iamVjdDpoaSxraW5kT2Y6UG4sa2luZE9mVGVzdDpBdCxlbmRzV2l0aDpwaSx0b0FycmF5Om1pLGlzVHlwZWRBcnJheTp2aSxpc0ZpbGVMaXN0OnNpfSxZdD1QZTtmdW5jdGlvbiBDcyhlKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUpLnJlcGxhY2UoLyUzQS9naSwiOiIpLnJlcGxhY2UoLyUyNC9nLCIkIikucmVwbGFjZSgvJTJDL2dpLCIsIikucmVwbGFjZSgvJTIwL2csIisiKS5yZXBsYWNlKC8lNUIvZ2ksIlsiKS5yZXBsYWNlKC8lNUQvZ2ksIl0iKX12YXIgSXM9ZnVuY3Rpb24odCxyLG4pe2lmKCFyKXJldHVybiB0O3ZhciBzO2lmKG4pcz1uKHIpO2Vsc2UgaWYoWXQuaXNVUkxTZWFyY2hQYXJhbXMocikpcz1yLnRvU3RyaW5nKCk7ZWxzZXt2YXIgYT1bXTtZdC5mb3JFYWNoKHIsZnVuY3Rpb24oZixwKXtmPT09bnVsbHx8dHlwZW9mIGY9PSJ1bmRlZmluZWQifHwoWXQuaXNBcnJheShmKT9wPXArIltdIjpmPVtmXSxZdC5mb3JFYWNoKGYsZnVuY3Rpb24oaCl7WXQuaXNEYXRlKGgpP2g9aC50b0lTT1N0cmluZygpOll0LmlzT2JqZWN0KGgpJiYoaD1KU09OLnN0cmluZ2lmeShoKSksYS5wdXNoKENzKHApKyI9IitDcyhoKSl9KSl9KSxzPWEuam9pbigiJiIpfWlmKHMpe3ZhciBvPXQuaW5kZXhPZigiIyIpO28hPT0tMSYmKHQ9dC5zbGljZSgwLG8pKSx0Kz0odC5pbmRleE9mKCI/Iik9PT0tMT8iPyI6IiYiKStzfXJldHVybiB0fSxfaT1QZTtmdW5jdGlvbiBZcigpe3RoaXMuaGFuZGxlcnM9W119WXIucHJvdG90eXBlLnVzZT1mdW5jdGlvbih0LHIsbil7cmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7ZnVsZmlsbGVkOnQscmVqZWN0ZWQ6cixzeW5jaHJvbm91czpuP24uc3luY2hyb25vdXM6ITEscnVuV2hlbjpuP24ucnVuV2hlbjpudWxsfSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX0sWXIucHJvdG90eXBlLmVqZWN0PWZ1bmN0aW9uKHQpe3RoaXMuaGFuZGxlcnNbdF0mJih0aGlzLmhhbmRsZXJzW3RdPW51bGwpfSxZci5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0KXtfaS5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsZnVuY3Rpb24obil7biE9PW51bGwmJnQobil9KX07dmFyIGdpPVlyLEVpPVBlLHlpPWZ1bmN0aW9uKHQscil7RWkuZm9yRWFjaCh0LGZ1bmN0aW9uKHMsYSl7YSE9PXImJmEudG9VcHBlckNhc2UoKT09PXIudG9VcHBlckNhc2UoKSYmKHRbcl09cyxkZWxldGUgdFthXSl9KX0sRHM9UGU7ZnVuY3Rpb24gV3QoZSx0LHIsbixzKXtFcnJvci5jYWxsKHRoaXMpLHRoaXMubWVzc2FnZT1lLHRoaXMubmFtZT0iQXhpb3NFcnJvciIsdCYmKHRoaXMuY29kZT10KSxyJiYodGhpcy5jb25maWc9ciksbiYmKHRoaXMucmVxdWVzdD1uKSxzJiYodGhpcy5yZXNwb25zZT1zKX1Ecy5pbmhlcml0cyhXdCxFcnJvcix7dG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOnRoaXMuY29uZmlnLGNvZGU6dGhpcy5jb2RlLHN0YXR1czp0aGlzLnJlc3BvbnNlJiZ0aGlzLnJlc3BvbnNlLnN0YXR1cz90aGlzLnJlc3BvbnNlLnN0YXR1czpudWxsfX19KTt2YXIganM9V3QucHJvdG90eXBlLGtzPXt9O1siRVJSX0JBRF9PUFRJT05fVkFMVUUiLCJFUlJfQkFEX09QVElPTiIsIkVDT05OQUJPUlRFRCIsIkVUSU1FRE9VVCIsIkVSUl9ORVRXT1JLIiwiRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUyIsIkVSUl9ERVBSRUNBVEVEIiwiRVJSX0JBRF9SRVNQT05TRSIsIkVSUl9CQURfUkVRVUVTVCIsIkVSUl9DQU5DRUxFRCJdLmZvckVhY2goZnVuY3Rpb24oZSl7a3NbZV09e3ZhbHVlOmV9fSksT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoV3Qsa3MpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShqcywiaXNBeGlvc0Vycm9yIix7dmFsdWU6ITB9KSxXdC5mcm9tPWZ1bmN0aW9uKGUsdCxyLG4scyxhKXt2YXIgbz1PYmplY3QuY3JlYXRlKGpzKTtyZXR1cm4gRHMudG9GbGF0T2JqZWN0KGUsbyxmdW5jdGlvbihmKXtyZXR1cm4gZiE9PUVycm9yLnByb3RvdHlwZX0pLFd0LmNhbGwobyxlLm1lc3NhZ2UsdCxyLG4scyksby5uYW1lPWUubmFtZSxhJiZPYmplY3QuYXNzaWduKG8sYSksb307dmFyIFh0PVd0LFVzPXtzaWxlbnRKU09OUGFyc2luZzohMCxmb3JjZWRKU09OUGFyc2luZzohMCxjbGFyaWZ5VGltZW91dEVycm9yOiExfSxHZT1QZTtmdW5jdGlvbiAkaShlLHQpe3Q9dHx8bmV3IEZvcm1EYXRhO3ZhciByPVtdO2Z1bmN0aW9uIG4oYSl7cmV0dXJuIGE9PT1udWxsPyIiOkdlLmlzRGF0ZShhKT9hLnRvSVNPU3RyaW5nKCk6R2UuaXNBcnJheUJ1ZmZlcihhKXx8R2UuaXNUeXBlZEFycmF5KGEpP3R5cGVvZiBCbG9iPT0iZnVuY3Rpb24iP25ldyBCbG9iKFthXSk6QnVmZmVyLmZyb20oYSk6YX1mdW5jdGlvbiBzKGEsbyl7aWYoR2UuaXNQbGFpbk9iamVjdChhKXx8R2UuaXNBcnJheShhKSl7aWYoci5pbmRleE9mKGEpIT09LTEpdGhyb3cgRXJyb3IoIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiAiK28pO3IucHVzaChhKSxHZS5mb3JFYWNoKGEsZnVuY3Rpb24oZixwKXtpZighR2UuaXNVbmRlZmluZWQoZikpe3ZhciBpPW8/bysiLiIrcDpwLGg7aWYoZiYmIW8mJnR5cGVvZiBmPT0ib2JqZWN0Iil7aWYoR2UuZW5kc1dpdGgocCwie30iKSlmPUpTT04uc3RyaW5naWZ5KGYpO2Vsc2UgaWYoR2UuZW5kc1dpdGgocCwiW10iKSYmKGg9R2UudG9BcnJheShmKSkpe2guZm9yRWFjaChmdW5jdGlvbihFKXshR2UuaXNVbmRlZmluZWQoRSkmJnQuYXBwZW5kKGksbihFKSl9KTtyZXR1cm59fXMoZixpKX19KSxyLnBvcCgpfWVsc2UgdC5hcHBlbmQobyxuKGEpKX1yZXR1cm4gcyhlKSx0fXZhciBGcz0kaSxEbj1YdCx3aT1mdW5jdGlvbih0LHIsbil7dmFyIHM9bi5jb25maWcudmFsaWRhdGVTdGF0dXM7IW4uc3RhdHVzfHwhc3x8cyhuLnN0YXR1cyk/dChuKTpyKG5ldyBEbigiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAiK24uc3RhdHVzLFtEbi5FUlJfQkFEX1JFUVVFU1QsRG4uRVJSX0JBRF9SRVNQT05TRV1bTWF0aC5mbG9vcihuLnN0YXR1cy8xMDApLTRdLG4uY29uZmlnLG4ucmVxdWVzdCxuKSl9LFdyPVBlLFNpPVdyLmlzU3RhbmRhcmRCcm93c2VyRW52KCk/ZnVuY3Rpb24oKXtyZXR1cm57d3JpdGU6ZnVuY3Rpb24ocixuLHMsYSxvLGwpe3ZhciBmPVtdO2YucHVzaChyKyI9IitlbmNvZGVVUklDb21wb25lbnQobikpLFdyLmlzTnVtYmVyKHMpJiZmLnB1c2goImV4cGlyZXM9IituZXcgRGF0ZShzKS50b0dNVFN0cmluZygpKSxXci5pc1N0cmluZyhhKSYmZi5wdXNoKCJwYXRoPSIrYSksV3IuaXNTdHJpbmcobykmJmYucHVzaCgiZG9tYWluPSIrbyksbD09PSEwJiZmLnB1c2goInNlY3VyZSIpLGRvY3VtZW50LmNvb2tpZT1mLmpvaW4oIjsgIil9LHJlYWQ6ZnVuY3Rpb24ocil7dmFyIG49ZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoIihefDtcXHMqKSgiK3IrIik9KFteO10qKSIpKTtyZXR1cm4gbj9kZWNvZGVVUklDb21wb25lbnQoblszXSk6bnVsbH0scmVtb3ZlOmZ1bmN0aW9uKHIpe3RoaXMud3JpdGUociwiIixEYXRlLm5vdygpLTg2NGU1KX19fSgpOmZ1bmN0aW9uKCl7cmV0dXJue3dyaXRlOmZ1bmN0aW9uKCl7fSxyZWFkOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LHJlbW92ZTpmdW5jdGlvbigpe319fSgpLFJpPWZ1bmN0aW9uKHQpe3JldHVybi9eKFthLXpdW2EtelxkK1wtLl0qOik/XC9cLy9pLnRlc3QodCl9LGJpPWZ1bmN0aW9uKHQscil7cmV0dXJuIHI/dC5yZXBsYWNlKC9cLyskLywiIikrIi8iK3IucmVwbGFjZSgvXlwvKy8sIiIpOnR9LE9pPVJpLE5pPWJpLE1zPWZ1bmN0aW9uKHQscil7cmV0dXJuIHQmJiFPaShyKT9OaSh0LHIpOnJ9LGpuPVBlLFBpPVsiYWdlIiwiYXV0aG9yaXphdGlvbiIsImNvbnRlbnQtbGVuZ3RoIiwiY29udGVudC10eXBlIiwiZXRhZyIsImV4cGlyZXMiLCJmcm9tIiwiaG9zdCIsImlmLW1vZGlmaWVkLXNpbmNlIiwiaWYtdW5tb2RpZmllZC1zaW5jZSIsImxhc3QtbW9kaWZpZWQiLCJsb2NhdGlvbiIsIm1heC1mb3J3YXJkcyIsInByb3h5LWF1dGhvcml6YXRpb24iLCJyZWZlcmVyIiwicmV0cnktYWZ0ZXIiLCJ1c2VyLWFnZW50Il0sVGk9ZnVuY3Rpb24odCl7dmFyIHI9e30sbixzLGE7cmV0dXJuIHQmJmpuLmZvckVhY2godC5zcGxpdChgCmApLGZ1bmN0aW9uKGwpe2lmKGE9bC5pbmRleE9mKCI6Iiksbj1qbi50cmltKGwuc3Vic3RyKDAsYSkpLnRvTG93ZXJDYXNlKCkscz1qbi50cmltKGwuc3Vic3RyKGErMSkpLG4pe2lmKHJbbl0mJlBpLmluZGV4T2Yobik+PTApcmV0dXJuO249PT0ic2V0LWNvb2tpZSI/cltuXT0ocltuXT9yW25dOltdKS5jb25jYXQoW3NdKTpyW25dPXJbbl0/cltuXSsiLCAiK3M6c319KSxyfSxMcz1QZSxBaT1Mcy5pc1N0YW5kYXJkQnJvd3NlckVudigpP2Z1bmN0aW9uKCl7dmFyIHQ9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxuO2Z1bmN0aW9uIHMoYSl7dmFyIG89YTtyZXR1cm4gdCYmKHIuc2V0QXR0cmlidXRlKCJocmVmIixvKSxvPXIuaHJlZiksci5zZXRBdHRyaWJ1dGUoImhyZWYiLG8pLHtocmVmOnIuaHJlZixwcm90b2NvbDpyLnByb3RvY29sP3IucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0OnIuaG9zdCxzZWFyY2g6ci5zZWFyY2g/ci5zZWFyY2gucmVwbGFjZSgvXlw/LywiIik6IiIsaGFzaDpyLmhhc2g/ci5oYXNoLnJlcGxhY2UoL14jLywiIik6IiIsaG9zdG5hbWU6ci5ob3N0bmFtZSxwb3J0OnIucG9ydCxwYXRobmFtZTpyLnBhdGhuYW1lLmNoYXJBdCgwKT09PSIvIj9yLnBhdGhuYW1lOiIvIityLnBhdGhuYW1lfX1yZXR1cm4gbj1zKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbihvKXt2YXIgbD1Mcy5pc1N0cmluZyhvKT9zKG8pOm87cmV0dXJuIGwucHJvdG9jb2w9PT1uLnByb3RvY29sJiZsLmhvc3Q9PT1uLmhvc3R9fSgpOmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuITB9fSgpLGtuPVh0LENpPVBlO2Z1bmN0aW9uIFZzKGUpe2tuLmNhbGwodGhpcyxlPT1udWxsPyJjYW5jZWxlZCI6ZSxrbi5FUlJfQ0FOQ0VMRUQpLHRoaXMubmFtZT0iQ2FuY2VsZWRFcnJvciJ9Q2kuaW5oZXJpdHMoVnMsa24se19fQ0FOQ0VMX186ITB9KTt2YXIgWHI9VnMsSWk9ZnVuY3Rpb24odCl7dmFyIHI9L14oWy0rXHddezEsMjV9KSg6P1wvXC98OikvLmV4ZWModCk7cmV0dXJuIHImJnJbMV18fCIifSxncj1QZSxEaT13aSxqaT1TaSxraT1JcyxVaT1NcyxGaT1UaSxNaT1BaSxMaT1Vcyx1dD1YdCxWaT1Ycix6aT1JaSx6cz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24obixzKXt2YXIgYT10LmRhdGEsbz10LmhlYWRlcnMsbD10LnJlc3BvbnNlVHlwZSxmO2Z1bmN0aW9uIHAoKXt0LmNhbmNlbFRva2VuJiZ0LmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKGYpLHQuc2lnbmFsJiZ0LnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsZil9Z3IuaXNGb3JtRGF0YShhKSYmZ3IuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSYmZGVsZXRlIG9bIkNvbnRlbnQtVHlwZSJdO3ZhciBpPW5ldyBYTUxIdHRwUmVxdWVzdDtpZih0LmF1dGgpe3ZhciBoPXQuYXV0aC51c2VybmFtZXx8IiIsRT10LmF1dGgucGFzc3dvcmQ/dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHQuYXV0aC5wYXNzd29yZCkpOiIiO28uQXV0aG9yaXphdGlvbj0iQmFzaWMgIitidG9hKGgrIjoiK0UpfXZhciBUPVVpKHQuYmFzZVVSTCx0LnVybCk7aS5vcGVuKHQubWV0aG9kLnRvVXBwZXJDYXNlKCksa2koVCx0LnBhcmFtcyx0LnBhcmFtc1NlcmlhbGl6ZXIpLCEwKSxpLnRpbWVvdXQ9dC50aW1lb3V0O2Z1bmN0aW9uIEkoKXtpZighIWkpe3ZhciBfPSJnZXRBbGxSZXNwb25zZUhlYWRlcnMiaW4gaT9GaShpLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKTpudWxsLGI9IWx8fGw9PT0idGV4dCJ8fGw9PT0ianNvbiI/aS5yZXNwb25zZVRleHQ6aS5yZXNwb25zZSxPPXtkYXRhOmIsc3RhdHVzOmkuc3RhdHVzLHN0YXR1c1RleHQ6aS5zdGF0dXNUZXh0LGhlYWRlcnM6Xyxjb25maWc6dCxyZXF1ZXN0Oml9O0RpKGZ1bmN0aW9uKEgpe24oSCkscCgpfSxmdW5jdGlvbihIKXtzKEgpLHAoKX0sTyksaT1udWxsfX1pZigib25sb2FkZW5kImluIGk/aS5vbmxvYWRlbmQ9STppLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFpfHxpLnJlYWR5U3RhdGUhPT00fHxpLnN0YXR1cz09PTAmJiEoaS5yZXNwb25zZVVSTCYmaS5yZXNwb25zZVVSTC5pbmRleE9mKCJmaWxlOiIpPT09MCl8fHNldFRpbWVvdXQoSSl9LGkub25hYm9ydD1mdW5jdGlvbigpeyFpfHwocyhuZXcgdXQoIlJlcXVlc3QgYWJvcnRlZCIsdXQuRUNPTk5BQk9SVEVELHQsaSkpLGk9bnVsbCl9LGkub25lcnJvcj1mdW5jdGlvbigpe3MobmV3IHV0KCJOZXR3b3JrIEVycm9yIix1dC5FUlJfTkVUV09SSyx0LGksaSkpLGk9bnVsbH0saS5vbnRpbWVvdXQ9ZnVuY3Rpb24oKXt2YXIgYj10LnRpbWVvdXQ/InRpbWVvdXQgb2YgIit0LnRpbWVvdXQrIm1zIGV4Y2VlZGVkIjoidGltZW91dCBleGNlZWRlZCIsTz10LnRyYW5zaXRpb25hbHx8TGk7dC50aW1lb3V0RXJyb3JNZXNzYWdlJiYoYj10LnRpbWVvdXRFcnJvck1lc3NhZ2UpLHMobmV3IHV0KGIsTy5jbGFyaWZ5VGltZW91dEVycm9yP3V0LkVUSU1FRE9VVDp1dC5FQ09OTkFCT1JURUQsdCxpKSksaT1udWxsfSxnci5pc1N0YW5kYXJkQnJvd3NlckVudigpKXt2YXIgaj0odC53aXRoQ3JlZGVudGlhbHN8fE1pKFQpKSYmdC54c3JmQ29va2llTmFtZT9qaS5yZWFkKHQueHNyZkNvb2tpZU5hbWUpOnZvaWQgMDtqJiYob1t0LnhzcmZIZWFkZXJOYW1lXT1qKX0ic2V0UmVxdWVzdEhlYWRlciJpbiBpJiZnci5mb3JFYWNoKG8sZnVuY3Rpb24oYixPKXt0eXBlb2YgYT09InVuZGVmaW5lZCImJk8udG9Mb3dlckNhc2UoKT09PSJjb250ZW50LXR5cGUiP2RlbGV0ZSBvW09dOmkuc2V0UmVxdWVzdEhlYWRlcihPLGIpfSksZ3IuaXNVbmRlZmluZWQodC53aXRoQ3JlZGVudGlhbHMpfHwoaS53aXRoQ3JlZGVudGlhbHM9ISF0LndpdGhDcmVkZW50aWFscyksbCYmbCE9PSJqc29uIiYmKGkucmVzcG9uc2VUeXBlPXQucmVzcG9uc2VUeXBlKSx0eXBlb2YgdC5vbkRvd25sb2FkUHJvZ3Jlc3M9PSJmdW5jdGlvbiImJmkuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLHQub25Eb3dubG9hZFByb2dyZXNzKSx0eXBlb2YgdC5vblVwbG9hZFByb2dyZXNzPT0iZnVuY3Rpb24iJiZpLnVwbG9hZCYmaS51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLHQub25VcGxvYWRQcm9ncmVzcyksKHQuY2FuY2VsVG9rZW58fHQuc2lnbmFsKSYmKGY9ZnVuY3Rpb24oXyl7IWl8fChzKCFffHxfJiZfLnR5cGU/bmV3IFZpOl8pLGkuYWJvcnQoKSxpPW51bGwpfSx0LmNhbmNlbFRva2VuJiZ0LmNhbmNlbFRva2VuLnN1YnNjcmliZShmKSx0LnNpZ25hbCYmKHQuc2lnbmFsLmFib3J0ZWQ/ZigpOnQuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixmKSkpLGF8fChhPW51bGwpO3ZhciB5PXppKFQpO2lmKHkmJlsiaHR0cCIsImh0dHBzIiwiZmlsZSJdLmluZGV4T2YoeSk9PT0tMSl7cyhuZXcgdXQoIlVuc3VwcG9ydGVkIHByb3RvY29sICIreSsiOiIsdXQuRVJSX0JBRF9SRVFVRVNULHQpKTtyZXR1cm59aS5zZW5kKGEpfSl9LEhpPW51bGwsT2U9UGUsSHM9eWksS3M9WHQsS2k9VXMsQmk9RnMsSmk9eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifTtmdW5jdGlvbiBCcyhlLHQpeyFPZS5pc1VuZGVmaW5lZChlKSYmT2UuaXNVbmRlZmluZWQoZVsiQ29udGVudC1UeXBlIl0pJiYoZVsiQ29udGVudC1UeXBlIl09dCl9ZnVuY3Rpb24gcWkoKXt2YXIgZTtyZXR1cm4odHlwZW9mIFhNTEh0dHBSZXF1ZXN0IT0idW5kZWZpbmVkInx8dHlwZW9mIHByb2Nlc3MhPSJ1bmRlZmluZWQiJiZPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocHJvY2Vzcyk9PT0iW29iamVjdCBwcm9jZXNzXSIpJiYoZT16cyksZX1mdW5jdGlvbiBHaShlLHQscil7aWYoT2UuaXNTdHJpbmcoZSkpdHJ5e3JldHVybih0fHxKU09OLnBhcnNlKShlKSxPZS50cmltKGUpfWNhdGNoKG4pe2lmKG4ubmFtZSE9PSJTeW50YXhFcnJvciIpdGhyb3cgbn1yZXR1cm4ocnx8SlNPTi5zdHJpbmdpZnkpKGUpfXZhciBacj17dHJhbnNpdGlvbmFsOktpLGFkYXB0ZXI6cWkoKSx0cmFuc2Zvcm1SZXF1ZXN0OltmdW5jdGlvbih0LHIpe2lmKEhzKHIsIkFjY2VwdCIpLEhzKHIsIkNvbnRlbnQtVHlwZSIpLE9lLmlzRm9ybURhdGEodCl8fE9lLmlzQXJyYXlCdWZmZXIodCl8fE9lLmlzQnVmZmVyKHQpfHxPZS5pc1N0cmVhbSh0KXx8T2UuaXNGaWxlKHQpfHxPZS5pc0Jsb2IodCkpcmV0dXJuIHQ7aWYoT2UuaXNBcnJheUJ1ZmZlclZpZXcodCkpcmV0dXJuIHQuYnVmZmVyO2lmKE9lLmlzVVJMU2VhcmNoUGFyYW1zKHQpKXJldHVybiBCcyhyLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCIpLHQudG9TdHJpbmcoKTt2YXIgbj1PZS5pc09iamVjdCh0KSxzPXImJnJbIkNvbnRlbnQtVHlwZSJdLGE7aWYoKGE9T2UuaXNGaWxlTGlzdCh0KSl8fG4mJnM9PT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpe3ZhciBvPXRoaXMuZW52JiZ0aGlzLmVudi5Gb3JtRGF0YTtyZXR1cm4gQmkoYT97ImZpbGVzW10iOnR9OnQsbyYmbmV3IG8pfWVsc2UgaWYobnx8cz09PSJhcHBsaWNhdGlvbi9qc29uIilyZXR1cm4gQnMociwiYXBwbGljYXRpb24vanNvbiIpLEdpKHQpO3JldHVybiB0fV0sdHJhbnNmb3JtUmVzcG9uc2U6W2Z1bmN0aW9uKHQpe3ZhciByPXRoaXMudHJhbnNpdGlvbmFsfHxaci50cmFuc2l0aW9uYWwsbj1yJiZyLnNpbGVudEpTT05QYXJzaW5nLHM9ciYmci5mb3JjZWRKU09OUGFyc2luZyxhPSFuJiZ0aGlzLnJlc3BvbnNlVHlwZT09PSJqc29uIjtpZihhfHxzJiZPZS5pc1N0cmluZyh0KSYmdC5sZW5ndGgpdHJ5e3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoKG8pe2lmKGEpdGhyb3cgby5uYW1lPT09IlN5bnRheEVycm9yIj9Lcy5mcm9tKG8sS3MuRVJSX0JBRF9SRVNQT05TRSx0aGlzLG51bGwsdGhpcy5yZXNwb25zZSk6b31yZXR1cm4gdH1dLHRpbWVvdXQ6MCx4c3JmQ29va2llTmFtZToiWFNSRi1UT0tFTiIseHNyZkhlYWRlck5hbWU6IlgtWFNSRi1UT0tFTiIsbWF4Q29udGVudExlbmd0aDotMSxtYXhCb2R5TGVuZ3RoOi0xLGVudjp7Rm9ybURhdGE6SGl9LHZhbGlkYXRlU3RhdHVzOmZ1bmN0aW9uKHQpe3JldHVybiB0Pj0yMDAmJnQ8MzAwfSxoZWFkZXJzOntjb21tb246e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qIn19fTtPZS5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCJdLGZ1bmN0aW9uKHQpe1pyLmhlYWRlcnNbdF09e319KSxPZS5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24odCl7WnIuaGVhZGVyc1t0XT1PZS5tZXJnZShKaSl9KTt2YXIgVW49WnIsUWk9UGUsWWk9VW4sV2k9ZnVuY3Rpb24odCxyLG4pe3ZhciBzPXRoaXN8fFlpO3JldHVybiBRaS5mb3JFYWNoKG4sZnVuY3Rpb24obyl7dD1vLmNhbGwocyx0LHIpfSksdH0sSnM9ZnVuY3Rpb24odCl7cmV0dXJuISEodCYmdC5fX0NBTkNFTF9fKX0scXM9UGUsRm49V2ksWGk9SnMsWmk9VW4seGk9WHI7ZnVuY3Rpb24gTW4oZSl7aWYoZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCksZS5zaWduYWwmJmUuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IHhpfXZhciBlYz1mdW5jdGlvbih0KXtNbih0KSx0LmhlYWRlcnM9dC5oZWFkZXJzfHx7fSx0LmRhdGE9Rm4uY2FsbCh0LHQuZGF0YSx0LmhlYWRlcnMsdC50cmFuc2Zvcm1SZXF1ZXN0KSx0LmhlYWRlcnM9cXMubWVyZ2UodC5oZWFkZXJzLmNvbW1vbnx8e30sdC5oZWFkZXJzW3QubWV0aG9kXXx8e30sdC5oZWFkZXJzKSxxcy5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCIsImNvbW1vbiJdLGZ1bmN0aW9uKHMpe2RlbGV0ZSB0LmhlYWRlcnNbc119KTt2YXIgcj10LmFkYXB0ZXJ8fFppLmFkYXB0ZXI7cmV0dXJuIHIodCkudGhlbihmdW5jdGlvbihzKXtyZXR1cm4gTW4odCkscy5kYXRhPUZuLmNhbGwodCxzLmRhdGEscy5oZWFkZXJzLHQudHJhbnNmb3JtUmVzcG9uc2UpLHN9LGZ1bmN0aW9uKHMpe3JldHVybiBYaShzKXx8KE1uKHQpLHMmJnMucmVzcG9uc2UmJihzLnJlc3BvbnNlLmRhdGE9Rm4uY2FsbCh0LHMucmVzcG9uc2UuZGF0YSxzLnJlc3BvbnNlLmhlYWRlcnMsdC50cmFuc2Zvcm1SZXNwb25zZSkpKSxQcm9taXNlLnJlamVjdChzKX0pfSxVZT1QZSxHcz1mdW5jdGlvbih0LHIpe3I9cnx8e307dmFyIG49e307ZnVuY3Rpb24gcyhpLGgpe3JldHVybiBVZS5pc1BsYWluT2JqZWN0KGkpJiZVZS5pc1BsYWluT2JqZWN0KGgpP1VlLm1lcmdlKGksaCk6VWUuaXNQbGFpbk9iamVjdChoKT9VZS5tZXJnZSh7fSxoKTpVZS5pc0FycmF5KGgpP2guc2xpY2UoKTpofWZ1bmN0aW9uIGEoaSl7aWYoVWUuaXNVbmRlZmluZWQocltpXSkpe2lmKCFVZS5pc1VuZGVmaW5lZCh0W2ldKSlyZXR1cm4gcyh2b2lkIDAsdFtpXSl9ZWxzZSByZXR1cm4gcyh0W2ldLHJbaV0pfWZ1bmN0aW9uIG8oaSl7aWYoIVVlLmlzVW5kZWZpbmVkKHJbaV0pKXJldHVybiBzKHZvaWQgMCxyW2ldKX1mdW5jdGlvbiBsKGkpe2lmKFVlLmlzVW5kZWZpbmVkKHJbaV0pKXtpZighVWUuaXNVbmRlZmluZWQodFtpXSkpcmV0dXJuIHModm9pZCAwLHRbaV0pfWVsc2UgcmV0dXJuIHModm9pZCAwLHJbaV0pfWZ1bmN0aW9uIGYoaSl7aWYoaSBpbiByKXJldHVybiBzKHRbaV0scltpXSk7aWYoaSBpbiB0KXJldHVybiBzKHZvaWQgMCx0W2ldKX12YXIgcD17dXJsOm8sbWV0aG9kOm8sZGF0YTpvLGJhc2VVUkw6bCx0cmFuc2Zvcm1SZXF1ZXN0OmwsdHJhbnNmb3JtUmVzcG9uc2U6bCxwYXJhbXNTZXJpYWxpemVyOmwsdGltZW91dDpsLHRpbWVvdXRNZXNzYWdlOmwsd2l0aENyZWRlbnRpYWxzOmwsYWRhcHRlcjpsLHJlc3BvbnNlVHlwZTpsLHhzcmZDb29raWVOYW1lOmwseHNyZkhlYWRlck5hbWU6bCxvblVwbG9hZFByb2dyZXNzOmwsb25Eb3dubG9hZFByb2dyZXNzOmwsZGVjb21wcmVzczpsLG1heENvbnRlbnRMZW5ndGg6bCxtYXhCb2R5TGVuZ3RoOmwsYmVmb3JlUmVkaXJlY3Q6bCx0cmFuc3BvcnQ6bCxodHRwQWdlbnQ6bCxodHRwc0FnZW50OmwsY2FuY2VsVG9rZW46bCxzb2NrZXRQYXRoOmwscmVzcG9uc2VFbmNvZGluZzpsLHZhbGlkYXRlU3RhdHVzOmZ9O3JldHVybiBVZS5mb3JFYWNoKE9iamVjdC5rZXlzKHQpLmNvbmNhdChPYmplY3Qua2V5cyhyKSksZnVuY3Rpb24oaCl7dmFyIEU9cFtoXXx8YSxUPUUoaCk7VWUuaXNVbmRlZmluZWQoVCkmJkUhPT1mfHwobltoXT1UKX0pLG59LFFzPXt2ZXJzaW9uOiIwLjI3LjIifSx0Yz1Rcy52ZXJzaW9uLGd0PVh0LExuPXt9O1sib2JqZWN0IiwiYm9vbGVhbiIsIm51bWJlciIsImZ1bmN0aW9uIiwic3RyaW5nIiwic3ltYm9sIl0uZm9yRWFjaChmdW5jdGlvbihlLHQpe0xuW2VdPWZ1bmN0aW9uKG4pe3JldHVybiB0eXBlb2Ygbj09PWV8fCJhIisodDwxPyJuICI6IiAiKStlfX0pO3ZhciBZcz17fTtMbi50cmFuc2l0aW9uYWw9ZnVuY3Rpb24odCxyLG4pe2Z1bmN0aW9uIHMoYSxvKXtyZXR1cm4iW0F4aW9zIHYiK3RjKyJdIFRyYW5zaXRpb25hbCBvcHRpb24gJyIrYSsiJyIrbysobj8iLiAiK246IiIpfXJldHVybiBmdW5jdGlvbihhLG8sbCl7aWYodD09PSExKXRocm93IG5ldyBndChzKG8sIiBoYXMgYmVlbiByZW1vdmVkIisocj8iIGluICIrcjoiIikpLGd0LkVSUl9ERVBSRUNBVEVEKTtyZXR1cm4gciYmIVlzW29dJiYoWXNbb109ITAsY29uc29sZS53YXJuKHMobywiIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgdiIrcisiIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlIikpKSx0P3QoYSxvLGwpOiEwfX07ZnVuY3Rpb24gcmMoZSx0LHIpe2lmKHR5cGVvZiBlIT0ib2JqZWN0Iil0aHJvdyBuZXcgZ3QoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiLGd0LkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtmb3IodmFyIG49T2JqZWN0LmtleXMoZSkscz1uLmxlbmd0aDtzLS0gPjA7KXt2YXIgYT1uW3NdLG89dFthXTtpZihvKXt2YXIgbD1lW2FdLGY9bD09PXZvaWQgMHx8byhsLGEsZSk7aWYoZiE9PSEwKXRocm93IG5ldyBndCgib3B0aW9uICIrYSsiIG11c3QgYmUgIitmLGd0LkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtjb250aW51ZX1pZihyIT09ITApdGhyb3cgbmV3IGd0KCJVbmtub3duIG9wdGlvbiAiK2EsZ3QuRVJSX0JBRF9PUFRJT04pfX12YXIgbmM9e2Fzc2VydE9wdGlvbnM6cmMsdmFsaWRhdG9yczpMbn0sV3M9UGUsc2M9SXMsWHM9Z2ksWnM9ZWMseHI9R3MsYWM9TXMseHM9bmMsWnQ9eHMudmFsaWRhdG9ycztmdW5jdGlvbiB4dChlKXt0aGlzLmRlZmF1bHRzPWUsdGhpcy5pbnRlcmNlcHRvcnM9e3JlcXVlc3Q6bmV3IFhzLHJlc3BvbnNlOm5ldyBYc319eHQucHJvdG90eXBlLnJlcXVlc3Q9ZnVuY3Rpb24odCxyKXt0eXBlb2YgdD09InN0cmluZyI/KHI9cnx8e30sci51cmw9dCk6cj10fHx7fSxyPXhyKHRoaXMuZGVmYXVsdHMsciksci5tZXRob2Q/ci5tZXRob2Q9ci5tZXRob2QudG9Mb3dlckNhc2UoKTp0aGlzLmRlZmF1bHRzLm1ldGhvZD9yLm1ldGhvZD10aGlzLmRlZmF1bHRzLm1ldGhvZC50b0xvd2VyQ2FzZSgpOnIubWV0aG9kPSJnZXQiO3ZhciBuPXIudHJhbnNpdGlvbmFsO24hPT12b2lkIDAmJnhzLmFzc2VydE9wdGlvbnMobix7c2lsZW50SlNPTlBhcnNpbmc6WnQudHJhbnNpdGlvbmFsKFp0LmJvb2xlYW4pLGZvcmNlZEpTT05QYXJzaW5nOlp0LnRyYW5zaXRpb25hbChadC5ib29sZWFuKSxjbGFyaWZ5VGltZW91dEVycm9yOlp0LnRyYW5zaXRpb25hbChadC5ib29sZWFuKX0sITEpO3ZhciBzPVtdLGE9ITA7dGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uKFQpe3R5cGVvZiBULnJ1bldoZW49PSJmdW5jdGlvbiImJlQucnVuV2hlbihyKT09PSExfHwoYT1hJiZULnN5bmNocm9ub3VzLHMudW5zaGlmdChULmZ1bGZpbGxlZCxULnJlamVjdGVkKSl9KTt2YXIgbz1bXTt0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uKFQpe28ucHVzaChULmZ1bGZpbGxlZCxULnJlamVjdGVkKX0pO3ZhciBsO2lmKCFhKXt2YXIgZj1bWnMsdm9pZCAwXTtmb3IoQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkoZixzKSxmPWYuY29uY2F0KG8pLGw9UHJvbWlzZS5yZXNvbHZlKHIpO2YubGVuZ3RoOylsPWwudGhlbihmLnNoaWZ0KCksZi5zaGlmdCgpKTtyZXR1cm4gbH1mb3IodmFyIHA9cjtzLmxlbmd0aDspe3ZhciBpPXMuc2hpZnQoKSxoPXMuc2hpZnQoKTt0cnl7cD1pKHApfWNhdGNoKEUpe2goRSk7YnJlYWt9fXRyeXtsPVpzKHApfWNhdGNoKEUpe3JldHVybiBQcm9taXNlLnJlamVjdChFKX1mb3IoO28ubGVuZ3RoOylsPWwudGhlbihvLnNoaWZ0KCksby5zaGlmdCgpKTtyZXR1cm4gbH0seHQucHJvdG90eXBlLmdldFVyaT1mdW5jdGlvbih0KXt0PXhyKHRoaXMuZGVmYXVsdHMsdCk7dmFyIHI9YWModC5iYXNlVVJMLHQudXJsKTtyZXR1cm4gc2Mocix0LnBhcmFtcyx0LnBhcmFtc1NlcmlhbGl6ZXIpfSxXcy5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSxmdW5jdGlvbih0KXt4dC5wcm90b3R5cGVbdF09ZnVuY3Rpb24ocixuKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KHhyKG58fHt9LHttZXRob2Q6dCx1cmw6cixkYXRhOihufHx7fSkuZGF0YX0pKX19KSxXcy5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24odCl7ZnVuY3Rpb24gcihuKXtyZXR1cm4gZnVuY3Rpb24oYSxvLGwpe3JldHVybiB0aGlzLnJlcXVlc3QoeHIobHx8e30se21ldGhvZDp0LGhlYWRlcnM6bj97IkNvbnRlbnQtVHlwZSI6Im11bHRpcGFydC9mb3JtLWRhdGEifTp7fSx1cmw6YSxkYXRhOm99KSl9fXh0LnByb3RvdHlwZVt0XT1yKCkseHQucHJvdG90eXBlW3QrIkZvcm0iXT1yKCEwKX0pO3ZhciBvYz14dCxpYz1YcjtmdW5jdGlvbiBlcihlKXtpZih0eXBlb2YgZSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uIik7dmFyIHQ7dGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHMpe3Q9c30pO3ZhciByPXRoaXM7dGhpcy5wcm9taXNlLnRoZW4oZnVuY3Rpb24obil7aWYoISFyLl9saXN0ZW5lcnMpe3ZhciBzLGE9ci5fbGlzdGVuZXJzLmxlbmd0aDtmb3Iocz0wO3M8YTtzKyspci5fbGlzdGVuZXJzW3NdKG4pO3IuX2xpc3RlbmVycz1udWxsfX0pLHRoaXMucHJvbWlzZS50aGVuPWZ1bmN0aW9uKG4pe3ZhciBzLGE9bmV3IFByb21pc2UoZnVuY3Rpb24obyl7ci5zdWJzY3JpYmUobykscz1vfSkudGhlbihuKTtyZXR1cm4gYS5jYW5jZWw9ZnVuY3Rpb24oKXtyLnVuc3Vic2NyaWJlKHMpfSxhfSxlKGZ1bmN0aW9uKHMpe3IucmVhc29ufHwoci5yZWFzb249bmV3IGljKHMpLHQoci5yZWFzb24pKX0pfWVyLnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkPWZ1bmN0aW9uKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259LGVyLnByb3RvdHlwZS5zdWJzY3JpYmU9ZnVuY3Rpb24odCl7aWYodGhpcy5yZWFzb24pe3QodGhpcy5yZWFzb24pO3JldHVybn10aGlzLl9saXN0ZW5lcnM/dGhpcy5fbGlzdGVuZXJzLnB1c2godCk6dGhpcy5fbGlzdGVuZXJzPVt0XX0sZXIucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKHQpe2lmKCEhdGhpcy5fbGlzdGVuZXJzKXt2YXIgcj10aGlzLl9saXN0ZW5lcnMuaW5kZXhPZih0KTtyIT09LTEmJnRoaXMuX2xpc3RlbmVycy5zcGxpY2UociwxKX19LGVyLnNvdXJjZT1mdW5jdGlvbigpe3ZhciB0LHI9bmV3IGVyKGZ1bmN0aW9uKHMpe3Q9c30pO3JldHVybnt0b2tlbjpyLGNhbmNlbDp0fX07dmFyIGNjPWVyLHVjPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdC5hcHBseShudWxsLG4pfX0sbGM9UGUsZmM9ZnVuY3Rpb24odCl7cmV0dXJuIGxjLmlzT2JqZWN0KHQpJiZ0LmlzQXhpb3NFcnJvcj09PSEwfSxlYT1QZSxkYz1Qcyxlbj1vYyxoYz1HcyxwYz1VbjtmdW5jdGlvbiB0YShlKXt2YXIgdD1uZXcgZW4oZSkscj1kYyhlbi5wcm90b3R5cGUucmVxdWVzdCx0KTtyZXR1cm4gZWEuZXh0ZW5kKHIsZW4ucHJvdG90eXBlLHQpLGVhLmV4dGVuZChyLHQpLHIuY3JlYXRlPWZ1bmN0aW9uKHMpe3JldHVybiB0YShoYyhlLHMpKX0scn12YXIgRGU9dGEocGMpO0RlLkF4aW9zPWVuLERlLkNhbmNlbGVkRXJyb3I9WHIsRGUuQ2FuY2VsVG9rZW49Y2MsRGUuaXNDYW5jZWw9SnMsRGUuVkVSU0lPTj1Rcy52ZXJzaW9uLERlLnRvRm9ybURhdGE9RnMsRGUuQXhpb3NFcnJvcj1YdCxEZS5DYW5jZWw9RGUuQ2FuY2VsZWRFcnJvcixEZS5hbGw9ZnVuY3Rpb24odCl7cmV0dXJuIFByb21pc2UuYWxsKHQpfSxEZS5zcHJlYWQ9dWMsRGUuaXNBeGlvc0Vycm9yPWZjLE9uLmV4cG9ydHM9RGUsT24uZXhwb3J0cy5kZWZhdWx0PURlO3ZhciBWbj1Pbi5leHBvcnRzLEN0PXt9LHRuPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0biwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdG4uR2V0RXJyb3JQYXlsb2FkPXZvaWQgMDtmdW5jdGlvbiBtYyhlLHQ9bnVsbCl7cmV0dXJue2Vycm9yOmUuY29kZSxlcnJvcl9kZXNjcmlwdGlvbjplLmRlc2NyaXB0aW9uLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRldGFpbHM6dH19dG4uR2V0RXJyb3JQYXlsb2FkPW1jO3ZhciBybj17fSxJdD17fSx6bj17ZXhwb3J0czp7fX0scmE9e30sV2U9e30sdHI9e30sRXI9e30sdWU9e30seXI9e307KGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLnJlZ2V4cENvZGU9ZS5nZXRFc21FeHBvcnROYW1lPWUuZ2V0UHJvcGVydHk9ZS5zYWZlU3RyaW5naWZ5PWUuc3RyaW5naWZ5PWUuc3RyQ29uY2F0PWUuYWRkQ29kZUFyZz1lLnN0cj1lLl89ZS5uaWw9ZS5fQ29kZT1lLk5hbWU9ZS5JREVOVElGSUVSPWUuX0NvZGVPck5hbWU9dm9pZCAwO2NsYXNzIHR7fWUuX0NvZGVPck5hbWU9dCxlLklERU5USUZJRVI9L15bYS16JF9dW2EteiRfMC05XSokL2k7Y2xhc3MgciBleHRlbmRzIHR7Y29uc3RydWN0b3IoYil7aWYoc3VwZXIoKSwhZS5JREVOVElGSUVSLnRlc3QoYikpdGhyb3cgbmV3IEVycm9yKCJDb2RlR2VuOiBuYW1lIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyIik7dGhpcy5zdHI9Yn10b1N0cmluZygpe3JldHVybiB0aGlzLnN0cn1lbXB0eVN0cigpe3JldHVybiExfWdldCBuYW1lcygpe3JldHVybntbdGhpcy5zdHJdOjF9fX1lLk5hbWU9cjtjbGFzcyBuIGV4dGVuZHMgdHtjb25zdHJ1Y3RvcihiKXtzdXBlcigpLHRoaXMuX2l0ZW1zPXR5cGVvZiBiPT0ic3RyaW5nIj9bYl06Yn10b1N0cmluZygpe3JldHVybiB0aGlzLnN0cn1lbXB0eVN0cigpe2lmKHRoaXMuX2l0ZW1zLmxlbmd0aD4xKXJldHVybiExO2NvbnN0IGI9dGhpcy5faXRlbXNbMF07cmV0dXJuIGI9PT0iInx8Yj09PSciIid9Z2V0IHN0cigpe3ZhciBiO3JldHVybihiPXRoaXMuX3N0cikhPT1udWxsJiZiIT09dm9pZCAwP2I6dGhpcy5fc3RyPXRoaXMuX2l0ZW1zLnJlZHVjZSgoTyxBKT0+YCR7T30ke0F9YCwiIil9Z2V0IG5hbWVzKCl7dmFyIGI7cmV0dXJuKGI9dGhpcy5fbmFtZXMpIT09bnVsbCYmYiE9PXZvaWQgMD9iOnRoaXMuX25hbWVzPXRoaXMuX2l0ZW1zLnJlZHVjZSgoTyxBKT0+KEEgaW5zdGFuY2VvZiByJiYoT1tBLnN0cl09KE9bQS5zdHJdfHwwKSsxKSxPKSx7fSl9fWUuX0NvZGU9bixlLm5pbD1uZXcgbigiIik7ZnVuY3Rpb24gcyhfLC4uLmIpe2NvbnN0IE89W19bMF1dO2xldCBBPTA7Zm9yKDtBPGIubGVuZ3RoOylsKE8sYltBXSksTy5wdXNoKF9bKytBXSk7cmV0dXJuIG5ldyBuKE8pfWUuXz1zO2NvbnN0IGE9bmV3IG4oIisiKTtmdW5jdGlvbiBvKF8sLi4uYil7Y29uc3QgTz1bVChfWzBdKV07bGV0IEE9MDtmb3IoO0E8Yi5sZW5ndGg7KU8ucHVzaChhKSxsKE8sYltBXSksTy5wdXNoKGEsVChfWysrQV0pKTtyZXR1cm4gZihPKSxuZXcgbihPKX1lLnN0cj1vO2Z1bmN0aW9uIGwoXyxiKXtiIGluc3RhbmNlb2Ygbj9fLnB1c2goLi4uYi5faXRlbXMpOmIgaW5zdGFuY2VvZiByP18ucHVzaChiKTpfLnB1c2goaChiKSl9ZS5hZGRDb2RlQXJnPWw7ZnVuY3Rpb24gZihfKXtsZXQgYj0xO2Zvcig7YjxfLmxlbmd0aC0xOyl7aWYoX1tiXT09PWEpe2NvbnN0IE89cChfW2ItMV0sX1tiKzFdKTtpZihPIT09dm9pZCAwKXtfLnNwbGljZShiLTEsMyxPKTtjb250aW51ZX1fW2IrK109IisifWIrK319ZnVuY3Rpb24gcChfLGIpe2lmKGI9PT0nIiInKXJldHVybiBfO2lmKF89PT0nIiInKXJldHVybiBiO2lmKHR5cGVvZiBfPT0ic3RyaW5nIilyZXR1cm4gYiBpbnN0YW5jZW9mIHJ8fF9bXy5sZW5ndGgtMV0hPT0nIic/dm9pZCAwOnR5cGVvZiBiIT0ic3RyaW5nIj9gJHtfLnNsaWNlKDAsLTEpfSR7Yn0iYDpiWzBdPT09JyInP18uc2xpY2UoMCwtMSkrYi5zbGljZSgxKTp2b2lkIDA7aWYodHlwZW9mIGI9PSJzdHJpbmciJiZiWzBdPT09JyInJiYhKF8gaW5zdGFuY2VvZiByKSlyZXR1cm5gIiR7X30ke2Iuc2xpY2UoMSl9YH1mdW5jdGlvbiBpKF8sYil7cmV0dXJuIGIuZW1wdHlTdHIoKT9fOl8uZW1wdHlTdHIoKT9iOm9gJHtffSR7Yn1gfWUuc3RyQ29uY2F0PWk7ZnVuY3Rpb24gaChfKXtyZXR1cm4gdHlwZW9mIF89PSJudW1iZXIifHx0eXBlb2YgXz09ImJvb2xlYW4ifHxfPT09bnVsbD9fOlQoQXJyYXkuaXNBcnJheShfKT9fLmpvaW4oIiwiKTpfKX1mdW5jdGlvbiBFKF8pe3JldHVybiBuZXcgbihUKF8pKX1lLnN0cmluZ2lmeT1FO2Z1bmN0aW9uIFQoXyl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KF8pLnJlcGxhY2UoL1x1MjAyOC9nLCJcXHUyMDI4IikucmVwbGFjZSgvXHUyMDI5L2csIlxcdTIwMjkiKX1lLnNhZmVTdHJpbmdpZnk9VDtmdW5jdGlvbiBJKF8pe3JldHVybiB0eXBlb2YgXz09InN0cmluZyImJmUuSURFTlRJRklFUi50ZXN0KF8pP25ldyBuKGAuJHtffWApOnNgWyR7X31dYH1lLmdldFByb3BlcnR5PUk7ZnVuY3Rpb24gaihfKXtpZih0eXBlb2YgXz09InN0cmluZyImJmUuSURFTlRJRklFUi50ZXN0KF8pKXJldHVybiBuZXcgbihgJHtffWApO3Rocm93IG5ldyBFcnJvcihgQ29kZUdlbjogaW52YWxpZCBleHBvcnQgbmFtZTogJHtffSwgdXNlIGV4cGxpY2l0ICRpZCBuYW1lIG1hcHBpbmdgKX1lLmdldEVzbUV4cG9ydE5hbWU9ajtmdW5jdGlvbiB5KF8pe3JldHVybiBuZXcgbihfLnRvU3RyaW5nKCkpfWUucmVnZXhwQ29kZT15fSkoeXIpO3ZhciBIbj17fTsoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuVmFsdWVTY29wZT1lLlZhbHVlU2NvcGVOYW1lPWUuU2NvcGU9ZS52YXJLaW5kcz1lLlVzZWRWYWx1ZVN0YXRlPXZvaWQgMDtjb25zdCB0PXlyO2NsYXNzIHIgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihwKXtzdXBlcihgQ29kZUdlbjogImNvZGUiIGZvciAke3B9IG5vdCBkZWZpbmVkYCksdGhpcy52YWx1ZT1wLnZhbHVlfX12YXIgbjsoZnVuY3Rpb24oZil7ZltmLlN0YXJ0ZWQ9MF09IlN0YXJ0ZWQiLGZbZi5Db21wbGV0ZWQ9MV09IkNvbXBsZXRlZCJ9KShuPWUuVXNlZFZhbHVlU3RhdGV8fChlLlVzZWRWYWx1ZVN0YXRlPXt9KSksZS52YXJLaW5kcz17Y29uc3Q6bmV3IHQuTmFtZSgiY29uc3QiKSxsZXQ6bmV3IHQuTmFtZSgibGV0IiksdmFyOm5ldyB0Lk5hbWUoInZhciIpfTtjbGFzcyBze2NvbnN0cnVjdG9yKHtwcmVmaXhlczpwLHBhcmVudDppfT17fSl7dGhpcy5fbmFtZXM9e30sdGhpcy5fcHJlZml4ZXM9cCx0aGlzLl9wYXJlbnQ9aX10b05hbWUocCl7cmV0dXJuIHAgaW5zdGFuY2VvZiB0Lk5hbWU/cDp0aGlzLm5hbWUocCl9bmFtZShwKXtyZXR1cm4gbmV3IHQuTmFtZSh0aGlzLl9uZXdOYW1lKHApKX1fbmV3TmFtZShwKXtjb25zdCBpPXRoaXMuX25hbWVzW3BdfHx0aGlzLl9uYW1lR3JvdXAocCk7cmV0dXJuYCR7cH0ke2kuaW5kZXgrK31gfV9uYW1lR3JvdXAocCl7dmFyIGksaDtpZigoKGg9KGk9dGhpcy5fcGFyZW50KT09PW51bGx8fGk9PT12b2lkIDA/dm9pZCAwOmkuX3ByZWZpeGVzKT09PW51bGx8fGg9PT12b2lkIDA/dm9pZCAwOmguaGFzKHApKXx8dGhpcy5fcHJlZml4ZXMmJiF0aGlzLl9wcmVmaXhlcy5oYXMocCkpdGhyb3cgbmV3IEVycm9yKGBDb2RlR2VuOiBwcmVmaXggIiR7cH0iIGlzIG5vdCBhbGxvd2VkIGluIHRoaXMgc2NvcGVgKTtyZXR1cm4gdGhpcy5fbmFtZXNbcF09e3ByZWZpeDpwLGluZGV4OjB9fX1lLlNjb3BlPXM7Y2xhc3MgYSBleHRlbmRzIHQuTmFtZXtjb25zdHJ1Y3RvcihwLGkpe3N1cGVyKGkpLHRoaXMucHJlZml4PXB9c2V0VmFsdWUocCx7cHJvcGVydHk6aSxpdGVtSW5kZXg6aH0pe3RoaXMudmFsdWU9cCx0aGlzLnNjb3BlUGF0aD0oMCx0Ll8pYC4ke25ldyB0Lk5hbWUoaSl9WyR7aH1dYH19ZS5WYWx1ZVNjb3BlTmFtZT1hO2NvbnN0IG89KDAsdC5fKWBcbmA7Y2xhc3MgbCBleHRlbmRzIHN7Y29uc3RydWN0b3IocCl7c3VwZXIocCksdGhpcy5fdmFsdWVzPXt9LHRoaXMuX3Njb3BlPXAuc2NvcGUsdGhpcy5vcHRzPWxlKFEoe30scCkse19uOnAubGluZXM/bzp0Lm5pbH0pfWdldCgpe3JldHVybiB0aGlzLl9zY29wZX1uYW1lKHApe3JldHVybiBuZXcgYShwLHRoaXMuX25ld05hbWUocCkpfXZhbHVlKHAsaSl7dmFyIGg7aWYoaS5yZWY9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKCJDb2RlR2VuOiByZWYgbXVzdCBiZSBwYXNzZWQgaW4gdmFsdWUiKTtjb25zdCBFPXRoaXMudG9OYW1lKHApLHtwcmVmaXg6VH09RSxJPShoPWkua2V5KSE9PW51bGwmJmghPT12b2lkIDA/aDppLnJlZjtsZXQgaj10aGlzLl92YWx1ZXNbVF07aWYoail7Y29uc3QgYj1qLmdldChJKTtpZihiKXJldHVybiBifWVsc2Ugaj10aGlzLl92YWx1ZXNbVF09bmV3IE1hcDtqLnNldChJLEUpO2NvbnN0IHk9dGhpcy5fc2NvcGVbVF18fCh0aGlzLl9zY29wZVtUXT1bXSksXz15Lmxlbmd0aDtyZXR1cm4geVtfXT1pLnJlZixFLnNldFZhbHVlKGkse3Byb3BlcnR5OlQsaXRlbUluZGV4Ol99KSxFfWdldFZhbHVlKHAsaSl7Y29uc3QgaD10aGlzLl92YWx1ZXNbcF07aWYoISFoKXJldHVybiBoLmdldChpKX1zY29wZVJlZnMocCxpPXRoaXMuX3ZhbHVlcyl7cmV0dXJuIHRoaXMuX3JlZHVjZVZhbHVlcyhpLGg9PntpZihoLnNjb3BlUGF0aD09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYENvZGVHZW46IG5hbWUgIiR7aH0iIGhhcyBubyB2YWx1ZWApO3JldHVybigwLHQuXylgJHtwfSR7aC5zY29wZVBhdGh9YH0pfXNjb3BlQ29kZShwPXRoaXMuX3ZhbHVlcyxpLGgpe3JldHVybiB0aGlzLl9yZWR1Y2VWYWx1ZXMocCxFPT57aWYoRS52YWx1ZT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYENvZGVHZW46IG5hbWUgIiR7RX0iIGhhcyBubyB2YWx1ZWApO3JldHVybiBFLnZhbHVlLmNvZGV9LGksaCl9X3JlZHVjZVZhbHVlcyhwLGksaD17fSxFKXtsZXQgVD10Lm5pbDtmb3IoY29uc3QgSSBpbiBwKXtjb25zdCBqPXBbSV07aWYoIWopY29udGludWU7Y29uc3QgeT1oW0ldPWhbSV18fG5ldyBNYXA7ai5mb3JFYWNoKF89PntpZih5LmhhcyhfKSlyZXR1cm47eS5zZXQoXyxuLlN0YXJ0ZWQpO2xldCBiPWkoXyk7aWYoYil7Y29uc3QgTz10aGlzLm9wdHMuZXM1P2UudmFyS2luZHMudmFyOmUudmFyS2luZHMuY29uc3Q7VD0oMCx0Ll8pYCR7VH0ke099ICR7X30gPSAke2J9OyR7dGhpcy5vcHRzLl9ufWB9ZWxzZSBpZihiPUU9PW51bGw/dm9pZCAwOkUoXykpVD0oMCx0Ll8pYCR7VH0ke2J9JHt0aGlzLm9wdHMuX259YDtlbHNlIHRocm93IG5ldyByKF8pO3kuc2V0KF8sbi5Db21wbGV0ZWQpfSl9cmV0dXJuIFR9fWUuVmFsdWVTY29wZT1sfSkoSG4pLGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLm9yPWUuYW5kPWUubm90PWUuQ29kZUdlbj1lLm9wZXJhdG9ycz1lLnZhcktpbmRzPWUuVmFsdWVTY29wZU5hbWU9ZS5WYWx1ZVNjb3BlPWUuU2NvcGU9ZS5OYW1lPWUucmVnZXhwQ29kZT1lLnN0cmluZ2lmeT1lLmdldFByb3BlcnR5PWUubmlsPWUuc3RyQ29uY2F0PWUuc3RyPWUuXz12b2lkIDA7Y29uc3QgdD15cixyPUhuO3ZhciBuPXlyO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5ffX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJzdHIiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBuLnN0cn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwic3RyQ29uY2F0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5zdHJDb25jYXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIm5pbCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG4ubmlsfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJnZXRQcm9wZXJ0eSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG4uZ2V0UHJvcGVydHl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInN0cmluZ2lmeSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG4uc3RyaW5naWZ5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJyZWdleHBDb2RlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5yZWdleHBDb2RlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJOYW1lIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5OYW1lfX0pO3ZhciBzPUhuO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJTY29wZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHMuU2NvcGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIlZhbHVlU2NvcGUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBzLlZhbHVlU2NvcGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIlZhbHVlU2NvcGVOYW1lIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcy5WYWx1ZVNjb3BlTmFtZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwidmFyS2luZHMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBzLnZhcktpbmRzfX0pLGUub3BlcmF0b3JzPXtHVDpuZXcgdC5fQ29kZSgiPiIpLEdURTpuZXcgdC5fQ29kZSgiPj0iKSxMVDpuZXcgdC5fQ29kZSgiPCIpLExURTpuZXcgdC5fQ29kZSgiPD0iKSxFUTpuZXcgdC5fQ29kZSgiPT09IiksTkVROm5ldyB0Ll9Db2RlKCIhPT0iKSxOT1Q6bmV3IHQuX0NvZGUoIiEiKSxPUjpuZXcgdC5fQ29kZSgifHwiKSxBTkQ6bmV3IHQuX0NvZGUoIiYmIiksQUREOm5ldyB0Ll9Db2RlKCIrIil9O2NsYXNzIGF7b3B0aW1pemVOb2Rlcygpe3JldHVybiB0aGlzfW9wdGltaXplTmFtZXMoYyxtKXtyZXR1cm4gdGhpc319Y2xhc3MgbyBleHRlbmRzIGF7Y29uc3RydWN0b3IoYyxtLFApe3N1cGVyKCksdGhpcy52YXJLaW5kPWMsdGhpcy5uYW1lPW0sdGhpcy5yaHM9UH1yZW5kZXIoe2VzNTpjLF9uOm19KXtjb25zdCBQPWM/ci52YXJLaW5kcy52YXI6dGhpcy52YXJLaW5kLFU9dGhpcy5yaHM9PT12b2lkIDA/IiI6YCA9ICR7dGhpcy5yaHN9YDtyZXR1cm5gJHtQfSAke3RoaXMubmFtZX0ke1V9O2ArbX1vcHRpbWl6ZU5hbWVzKGMsbSl7aWYoISFjW3RoaXMubmFtZS5zdHJdKXJldHVybiB0aGlzLnJocyYmKHRoaXMucmhzPVgodGhpcy5yaHMsYyxtKSksdGhpc31nZXQgbmFtZXMoKXtyZXR1cm4gdGhpcy5yaHMgaW5zdGFuY2VvZiB0Ll9Db2RlT3JOYW1lP3RoaXMucmhzLm5hbWVzOnt9fX1jbGFzcyBsIGV4dGVuZHMgYXtjb25zdHJ1Y3RvcihjLG0sUCl7c3VwZXIoKSx0aGlzLmxocz1jLHRoaXMucmhzPW0sdGhpcy5zaWRlRWZmZWN0cz1QfXJlbmRlcih7X246Y30pe3JldHVybmAke3RoaXMubGhzfSA9ICR7dGhpcy5yaHN9O2ArY31vcHRpbWl6ZU5hbWVzKGMsbSl7aWYoISh0aGlzLmxocyBpbnN0YW5jZW9mIHQuTmFtZSYmIWNbdGhpcy5saHMuc3RyXSYmIXRoaXMuc2lkZUVmZmVjdHMpKXJldHVybiB0aGlzLnJocz1YKHRoaXMucmhzLGMsbSksdGhpc31nZXQgbmFtZXMoKXtjb25zdCBjPXRoaXMubGhzIGluc3RhbmNlb2YgdC5OYW1lP3t9OlEoe30sdGhpcy5saHMubmFtZXMpO3JldHVybiBvZShjLHRoaXMucmhzKX19Y2xhc3MgZiBleHRlbmRzIGx7Y29uc3RydWN0b3IoYyxtLFAsVSl7c3VwZXIoYyxQLFUpLHRoaXMub3A9bX1yZW5kZXIoe19uOmN9KXtyZXR1cm5gJHt0aGlzLmxoc30gJHt0aGlzLm9wfT0gJHt0aGlzLnJoc307YCtjfX1jbGFzcyBwIGV4dGVuZHMgYXtjb25zdHJ1Y3RvcihjKXtzdXBlcigpLHRoaXMubGFiZWw9Yyx0aGlzLm5hbWVzPXt9fXJlbmRlcih7X246Y30pe3JldHVybmAke3RoaXMubGFiZWx9OmArY319Y2xhc3MgaSBleHRlbmRzIGF7Y29uc3RydWN0b3IoYyl7c3VwZXIoKSx0aGlzLmxhYmVsPWMsdGhpcy5uYW1lcz17fX1yZW5kZXIoe19uOmN9KXtyZXR1cm5gYnJlYWske3RoaXMubGFiZWw/YCAke3RoaXMubGFiZWx9YDoiIn07YCtjfX1jbGFzcyBoIGV4dGVuZHMgYXtjb25zdHJ1Y3RvcihjKXtzdXBlcigpLHRoaXMuZXJyb3I9Y31yZW5kZXIoe19uOmN9KXtyZXR1cm5gdGhyb3cgJHt0aGlzLmVycm9yfTtgK2N9Z2V0IG5hbWVzKCl7cmV0dXJuIHRoaXMuZXJyb3IubmFtZXN9fWNsYXNzIEUgZXh0ZW5kcyBhe2NvbnN0cnVjdG9yKGMpe3N1cGVyKCksdGhpcy5jb2RlPWN9cmVuZGVyKHtfbjpjfSl7cmV0dXJuYCR7dGhpcy5jb2RlfTtgK2N9b3B0aW1pemVOb2Rlcygpe3JldHVybmAke3RoaXMuY29kZX1gP3RoaXM6dm9pZCAwfW9wdGltaXplTmFtZXMoYyxtKXtyZXR1cm4gdGhpcy5jb2RlPVgodGhpcy5jb2RlLGMsbSksdGhpc31nZXQgbmFtZXMoKXtyZXR1cm4gdGhpcy5jb2RlIGluc3RhbmNlb2YgdC5fQ29kZU9yTmFtZT90aGlzLmNvZGUubmFtZXM6e319fWNsYXNzIFQgZXh0ZW5kcyBhe2NvbnN0cnVjdG9yKGM9W10pe3N1cGVyKCksdGhpcy5ub2Rlcz1jfXJlbmRlcihjKXtyZXR1cm4gdGhpcy5ub2Rlcy5yZWR1Y2UoKG0sUCk9Pm0rUC5yZW5kZXIoYyksIiIpfW9wdGltaXplTm9kZXMoKXtjb25zdHtub2RlczpjfT10aGlzO2xldCBtPWMubGVuZ3RoO2Zvcig7bS0tOyl7Y29uc3QgUD1jW21dLm9wdGltaXplTm9kZXMoKTtBcnJheS5pc0FycmF5KFApP2Muc3BsaWNlKG0sMSwuLi5QKTpQP2NbbV09UDpjLnNwbGljZShtLDEpfXJldHVybiBjLmxlbmd0aD4wP3RoaXM6dm9pZCAwfW9wdGltaXplTmFtZXMoYyxtKXtjb25zdHtub2RlczpQfT10aGlzO2xldCBVPVAubGVuZ3RoO2Zvcig7VS0tOyl7Y29uc3QgRj1QW1VdO0Yub3B0aW1pemVOYW1lcyhjLG0pfHwodmUoYyxGLm5hbWVzKSxQLnNwbGljZShVLDEpKX1yZXR1cm4gUC5sZW5ndGg+MD90aGlzOnZvaWQgMH1nZXQgbmFtZXMoKXtyZXR1cm4gdGhpcy5ub2Rlcy5yZWR1Y2UoKGMsbSk9PlcoYyxtLm5hbWVzKSx7fSl9fWNsYXNzIEkgZXh0ZW5kcyBUe3JlbmRlcihjKXtyZXR1cm4ieyIrYy5fbitzdXBlci5yZW5kZXIoYykrIn0iK2MuX259fWNsYXNzIGogZXh0ZW5kcyBUe31jbGFzcyB5IGV4dGVuZHMgSXt9eS5raW5kPSJlbHNlIjtjbGFzcyBfIGV4dGVuZHMgSXtjb25zdHJ1Y3RvcihjLG0pe3N1cGVyKG0pLHRoaXMuY29uZGl0aW9uPWN9cmVuZGVyKGMpe2xldCBtPWBpZigke3RoaXMuY29uZGl0aW9ufSlgK3N1cGVyLnJlbmRlcihjKTtyZXR1cm4gdGhpcy5lbHNlJiYobSs9ImVsc2UgIit0aGlzLmVsc2UucmVuZGVyKGMpKSxtfW9wdGltaXplTm9kZXMoKXtzdXBlci5vcHRpbWl6ZU5vZGVzKCk7Y29uc3QgYz10aGlzLmNvbmRpdGlvbjtpZihjPT09ITApcmV0dXJuIHRoaXMubm9kZXM7bGV0IG09dGhpcy5lbHNlO2lmKG0pe2NvbnN0IFA9bS5vcHRpbWl6ZU5vZGVzKCk7bT10aGlzLmVsc2U9QXJyYXkuaXNBcnJheShQKT9uZXcgeShQKTpQfWlmKG0pcmV0dXJuIGM9PT0hMT9tIGluc3RhbmNlb2YgXz9tOm0ubm9kZXM6dGhpcy5ub2Rlcy5sZW5ndGg/dGhpczpuZXcgXyhFZShjKSxtIGluc3RhbmNlb2YgXz9bbV06bS5ub2Rlcyk7aWYoIShjPT09ITF8fCF0aGlzLm5vZGVzLmxlbmd0aCkpcmV0dXJuIHRoaXN9b3B0aW1pemVOYW1lcyhjLG0pe3ZhciBQO2lmKHRoaXMuZWxzZT0oUD10aGlzLmVsc2UpPT09bnVsbHx8UD09PXZvaWQgMD92b2lkIDA6UC5vcHRpbWl6ZU5hbWVzKGMsbSksISEoc3VwZXIub3B0aW1pemVOYW1lcyhjLG0pfHx0aGlzLmVsc2UpKXJldHVybiB0aGlzLmNvbmRpdGlvbj1YKHRoaXMuY29uZGl0aW9uLGMsbSksdGhpc31nZXQgbmFtZXMoKXtjb25zdCBjPXN1cGVyLm5hbWVzO3JldHVybiBvZShjLHRoaXMuY29uZGl0aW9uKSx0aGlzLmVsc2UmJlcoYyx0aGlzLmVsc2UubmFtZXMpLGN9fV8ua2luZD0iaWYiO2NsYXNzIGIgZXh0ZW5kcyBJe31iLmtpbmQ9ImZvciI7Y2xhc3MgTyBleHRlbmRzIGJ7Y29uc3RydWN0b3IoYyl7c3VwZXIoKSx0aGlzLml0ZXJhdGlvbj1jfXJlbmRlcihjKXtyZXR1cm5gZm9yKCR7dGhpcy5pdGVyYXRpb259KWArc3VwZXIucmVuZGVyKGMpfW9wdGltaXplTmFtZXMoYyxtKXtpZighIXN1cGVyLm9wdGltaXplTmFtZXMoYyxtKSlyZXR1cm4gdGhpcy5pdGVyYXRpb249WCh0aGlzLml0ZXJhdGlvbixjLG0pLHRoaXN9Z2V0IG5hbWVzKCl7cmV0dXJuIFcoc3VwZXIubmFtZXMsdGhpcy5pdGVyYXRpb24ubmFtZXMpfX1jbGFzcyBBIGV4dGVuZHMgYntjb25zdHJ1Y3RvcihjLG0sUCxVKXtzdXBlcigpLHRoaXMudmFyS2luZD1jLHRoaXMubmFtZT1tLHRoaXMuZnJvbT1QLHRoaXMudG89VX1yZW5kZXIoYyl7Y29uc3QgbT1jLmVzNT9yLnZhcktpbmRzLnZhcjp0aGlzLnZhcktpbmQse25hbWU6UCxmcm9tOlUsdG86Rn09dGhpcztyZXR1cm5gZm9yKCR7bX0gJHtQfT0ke1V9OyAke1B9PCR7Rn07ICR7UH0rKylgK3N1cGVyLnJlbmRlcihjKX1nZXQgbmFtZXMoKXtjb25zdCBjPW9lKHN1cGVyLm5hbWVzLHRoaXMuZnJvbSk7cmV0dXJuIG9lKGMsdGhpcy50byl9fWNsYXNzIEggZXh0ZW5kcyBie2NvbnN0cnVjdG9yKGMsbSxQLFUpe3N1cGVyKCksdGhpcy5sb29wPWMsdGhpcy52YXJLaW5kPW0sdGhpcy5uYW1lPVAsdGhpcy5pdGVyYWJsZT1VfXJlbmRlcihjKXtyZXR1cm5gZm9yKCR7dGhpcy52YXJLaW5kfSAke3RoaXMubmFtZX0gJHt0aGlzLmxvb3B9ICR7dGhpcy5pdGVyYWJsZX0pYCtzdXBlci5yZW5kZXIoYyl9b3B0aW1pemVOYW1lcyhjLG0pe2lmKCEhc3VwZXIub3B0aW1pemVOYW1lcyhjLG0pKXJldHVybiB0aGlzLml0ZXJhYmxlPVgodGhpcy5pdGVyYWJsZSxjLG0pLHRoaXN9Z2V0IG5hbWVzKCl7cmV0dXJuIFcoc3VwZXIubmFtZXMsdGhpcy5pdGVyYWJsZS5uYW1lcyl9fWNsYXNzICQgZXh0ZW5kcyBJe2NvbnN0cnVjdG9yKGMsbSxQKXtzdXBlcigpLHRoaXMubmFtZT1jLHRoaXMuYXJncz1tLHRoaXMuYXN5bmM9UH1yZW5kZXIoYyl7cmV0dXJuYCR7dGhpcy5hc3luYz8iYXN5bmMgIjoiIn1mdW5jdGlvbiAke3RoaXMubmFtZX0oJHt0aGlzLmFyZ3N9KWArc3VwZXIucmVuZGVyKGMpfX0kLmtpbmQ9ImZ1bmMiO2NsYXNzIE4gZXh0ZW5kcyBUe3JlbmRlcihjKXtyZXR1cm4icmV0dXJuICIrc3VwZXIucmVuZGVyKGMpfX1OLmtpbmQ9InJldHVybiI7Y2xhc3MgRCBleHRlbmRzIEl7cmVuZGVyKGMpe2xldCBtPSJ0cnkiK3N1cGVyLnJlbmRlcihjKTtyZXR1cm4gdGhpcy5jYXRjaCYmKG0rPXRoaXMuY2F0Y2gucmVuZGVyKGMpKSx0aGlzLmZpbmFsbHkmJihtKz10aGlzLmZpbmFsbHkucmVuZGVyKGMpKSxtfW9wdGltaXplTm9kZXMoKXt2YXIgYyxtO3JldHVybiBzdXBlci5vcHRpbWl6ZU5vZGVzKCksKGM9dGhpcy5jYXRjaCk9PT1udWxsfHxjPT09dm9pZCAwfHxjLm9wdGltaXplTm9kZXMoKSwobT10aGlzLmZpbmFsbHkpPT09bnVsbHx8bT09PXZvaWQgMHx8bS5vcHRpbWl6ZU5vZGVzKCksdGhpc31vcHRpbWl6ZU5hbWVzKGMsbSl7dmFyIFAsVTtyZXR1cm4gc3VwZXIub3B0aW1pemVOYW1lcyhjLG0pLChQPXRoaXMuY2F0Y2gpPT09bnVsbHx8UD09PXZvaWQgMHx8UC5vcHRpbWl6ZU5hbWVzKGMsbSksKFU9dGhpcy5maW5hbGx5KT09PW51bGx8fFU9PT12b2lkIDB8fFUub3B0aW1pemVOYW1lcyhjLG0pLHRoaXN9Z2V0IG5hbWVzKCl7Y29uc3QgYz1zdXBlci5uYW1lcztyZXR1cm4gdGhpcy5jYXRjaCYmVyhjLHRoaXMuY2F0Y2gubmFtZXMpLHRoaXMuZmluYWxseSYmVyhjLHRoaXMuZmluYWxseS5uYW1lcyksY319Y2xhc3MgQiBleHRlbmRzIEl7Y29uc3RydWN0b3IoYyl7c3VwZXIoKSx0aGlzLmVycm9yPWN9cmVuZGVyKGMpe3JldHVybmBjYXRjaCgke3RoaXMuZXJyb3J9KWArc3VwZXIucmVuZGVyKGMpfX1CLmtpbmQ9ImNhdGNoIjtjbGFzcyBHIGV4dGVuZHMgSXtyZW5kZXIoYyl7cmV0dXJuImZpbmFsbHkiK3N1cGVyLnJlbmRlcihjKX19Ry5raW5kPSJmaW5hbGx5IjtjbGFzcyBwZXtjb25zdHJ1Y3RvcihjLG09e30pe3RoaXMuX3ZhbHVlcz17fSx0aGlzLl9ibG9ja1N0YXJ0cz1bXSx0aGlzLl9jb25zdGFudHM9e30sdGhpcy5vcHRzPWxlKFEoe30sbSkse19uOm0ubGluZXM/YApgOiIifSksdGhpcy5fZXh0U2NvcGU9Yyx0aGlzLl9zY29wZT1uZXcgci5TY29wZSh7cGFyZW50OmN9KSx0aGlzLl9ub2Rlcz1bbmV3IGpdfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuX3Jvb3QucmVuZGVyKHRoaXMub3B0cyl9bmFtZShjKXtyZXR1cm4gdGhpcy5fc2NvcGUubmFtZShjKX1zY29wZU5hbWUoYyl7cmV0dXJuIHRoaXMuX2V4dFNjb3BlLm5hbWUoYyl9c2NvcGVWYWx1ZShjLG0pe2NvbnN0IFA9dGhpcy5fZXh0U2NvcGUudmFsdWUoYyxtKTtyZXR1cm4odGhpcy5fdmFsdWVzW1AucHJlZml4XXx8KHRoaXMuX3ZhbHVlc1tQLnByZWZpeF09bmV3IFNldCkpLmFkZChQKSxQfWdldFNjb3BlVmFsdWUoYyxtKXtyZXR1cm4gdGhpcy5fZXh0U2NvcGUuZ2V0VmFsdWUoYyxtKX1zY29wZVJlZnMoYyl7cmV0dXJuIHRoaXMuX2V4dFNjb3BlLnNjb3BlUmVmcyhjLHRoaXMuX3ZhbHVlcyl9c2NvcGVDb2RlKCl7cmV0dXJuIHRoaXMuX2V4dFNjb3BlLnNjb3BlQ29kZSh0aGlzLl92YWx1ZXMpfV9kZWYoYyxtLFAsVSl7Y29uc3QgRj10aGlzLl9zY29wZS50b05hbWUobSk7cmV0dXJuIFAhPT12b2lkIDAmJlUmJih0aGlzLl9jb25zdGFudHNbRi5zdHJdPVApLHRoaXMuX2xlYWZOb2RlKG5ldyBvKGMsRixQKSksRn1jb25zdChjLG0sUCl7cmV0dXJuIHRoaXMuX2RlZihyLnZhcktpbmRzLmNvbnN0LGMsbSxQKX1sZXQoYyxtLFApe3JldHVybiB0aGlzLl9kZWYoci52YXJLaW5kcy5sZXQsYyxtLFApfXZhcihjLG0sUCl7cmV0dXJuIHRoaXMuX2RlZihyLnZhcktpbmRzLnZhcixjLG0sUCl9YXNzaWduKGMsbSxQKXtyZXR1cm4gdGhpcy5fbGVhZk5vZGUobmV3IGwoYyxtLFApKX1hZGQoYyxtKXtyZXR1cm4gdGhpcy5fbGVhZk5vZGUobmV3IGYoYyxlLm9wZXJhdG9ycy5BREQsbSkpfWNvZGUoYyl7cmV0dXJuIHR5cGVvZiBjPT0iZnVuY3Rpb24iP2MoKTpjIT09dC5uaWwmJnRoaXMuX2xlYWZOb2RlKG5ldyBFKGMpKSx0aGlzfW9iamVjdCguLi5jKXtjb25zdCBtPVsieyJdO2Zvcihjb25zdFtQLFVdb2YgYyltLmxlbmd0aD4xJiZtLnB1c2goIiwiKSxtLnB1c2goUCksKFAhPT1VfHx0aGlzLm9wdHMuZXM1KSYmKG0ucHVzaCgiOiIpLCgwLHQuYWRkQ29kZUFyZykobSxVKSk7cmV0dXJuIG0ucHVzaCgifSIpLG5ldyB0Ll9Db2RlKG0pfWlmKGMsbSxQKXtpZih0aGlzLl9ibG9ja05vZGUobmV3IF8oYykpLG0mJlApdGhpcy5jb2RlKG0pLmVsc2UoKS5jb2RlKFApLmVuZElmKCk7ZWxzZSBpZihtKXRoaXMuY29kZShtKS5lbmRJZigpO2Vsc2UgaWYoUCl0aHJvdyBuZXcgRXJyb3IoJ0NvZGVHZW46ICJlbHNlIiBib2R5IHdpdGhvdXQgInRoZW4iIGJvZHknKTtyZXR1cm4gdGhpc31lbHNlSWYoYyl7cmV0dXJuIHRoaXMuX2Vsc2VOb2RlKG5ldyBfKGMpKX1lbHNlKCl7cmV0dXJuIHRoaXMuX2Vsc2VOb2RlKG5ldyB5KX1lbmRJZigpe3JldHVybiB0aGlzLl9lbmRCbG9ja05vZGUoXyx5KX1fZm9yKGMsbSl7cmV0dXJuIHRoaXMuX2Jsb2NrTm9kZShjKSxtJiZ0aGlzLmNvZGUobSkuZW5kRm9yKCksdGhpc31mb3IoYyxtKXtyZXR1cm4gdGhpcy5fZm9yKG5ldyBPKGMpLG0pfWZvclJhbmdlKGMsbSxQLFUsRj10aGlzLm9wdHMuZXM1P3IudmFyS2luZHMudmFyOnIudmFyS2luZHMubGV0KXtjb25zdCBaPXRoaXMuX3Njb3BlLnRvTmFtZShjKTtyZXR1cm4gdGhpcy5fZm9yKG5ldyBBKEYsWixtLFApLCgpPT5VKFopKX1mb3JPZihjLG0sUCxVPXIudmFyS2luZHMuY29uc3Qpe2NvbnN0IEY9dGhpcy5fc2NvcGUudG9OYW1lKGMpO2lmKHRoaXMub3B0cy5lczUpe2NvbnN0IFo9bSBpbnN0YW5jZW9mIHQuTmFtZT9tOnRoaXMudmFyKCJfYXJyIixtKTtyZXR1cm4gdGhpcy5mb3JSYW5nZSgiX2kiLDAsKDAsdC5fKWAke1p9Lmxlbmd0aGAscmU9Pnt0aGlzLnZhcihGLCgwLHQuXylgJHtafVske3JlfV1gKSxQKEYpfSl9cmV0dXJuIHRoaXMuX2ZvcihuZXcgSCgib2YiLFUsRixtKSwoKT0+UChGKSl9Zm9ySW4oYyxtLFAsVT10aGlzLm9wdHMuZXM1P3IudmFyS2luZHMudmFyOnIudmFyS2luZHMuY29uc3Qpe2lmKHRoaXMub3B0cy5vd25Qcm9wZXJ0aWVzKXJldHVybiB0aGlzLmZvck9mKGMsKDAsdC5fKWBPYmplY3Qua2V5cygke219KWAsUCk7Y29uc3QgRj10aGlzLl9zY29wZS50b05hbWUoYyk7cmV0dXJuIHRoaXMuX2ZvcihuZXcgSCgiaW4iLFUsRixtKSwoKT0+UChGKSl9ZW5kRm9yKCl7cmV0dXJuIHRoaXMuX2VuZEJsb2NrTm9kZShiKX1sYWJlbChjKXtyZXR1cm4gdGhpcy5fbGVhZk5vZGUobmV3IHAoYykpfWJyZWFrKGMpe3JldHVybiB0aGlzLl9sZWFmTm9kZShuZXcgaShjKSl9cmV0dXJuKGMpe2NvbnN0IG09bmV3IE47aWYodGhpcy5fYmxvY2tOb2RlKG0pLHRoaXMuY29kZShjKSxtLm5vZGVzLmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCdDb2RlR2VuOiAicmV0dXJuIiBzaG91bGQgaGF2ZSBvbmUgbm9kZScpO3JldHVybiB0aGlzLl9lbmRCbG9ja05vZGUoTil9dHJ5KGMsbSxQKXtpZighbSYmIVApdGhyb3cgbmV3IEVycm9yKCdDb2RlR2VuOiAidHJ5IiB3aXRob3V0ICJjYXRjaCIgYW5kICJmaW5hbGx5IicpO2NvbnN0IFU9bmV3IEQ7aWYodGhpcy5fYmxvY2tOb2RlKFUpLHRoaXMuY29kZShjKSxtKXtjb25zdCBGPXRoaXMubmFtZSgiZSIpO3RoaXMuX2N1cnJOb2RlPVUuY2F0Y2g9bmV3IEIoRiksbShGKX1yZXR1cm4gUCYmKHRoaXMuX2N1cnJOb2RlPVUuZmluYWxseT1uZXcgRyx0aGlzLmNvZGUoUCkpLHRoaXMuX2VuZEJsb2NrTm9kZShCLEcpfXRocm93KGMpe3JldHVybiB0aGlzLl9sZWFmTm9kZShuZXcgaChjKSl9YmxvY2soYyxtKXtyZXR1cm4gdGhpcy5fYmxvY2tTdGFydHMucHVzaCh0aGlzLl9ub2Rlcy5sZW5ndGgpLGMmJnRoaXMuY29kZShjKS5lbmRCbG9jayhtKSx0aGlzfWVuZEJsb2NrKGMpe2NvbnN0IG09dGhpcy5fYmxvY2tTdGFydHMucG9wKCk7aWYobT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoIkNvZGVHZW46IG5vdCBpbiBzZWxmLWJhbGFuY2luZyBibG9jayIpO2NvbnN0IFA9dGhpcy5fbm9kZXMubGVuZ3RoLW07aWYoUDwwfHxjIT09dm9pZCAwJiZQIT09Yyl0aHJvdyBuZXcgRXJyb3IoYENvZGVHZW46IHdyb25nIG51bWJlciBvZiBub2RlczogJHtQfSB2cyAke2N9IGV4cGVjdGVkYCk7cmV0dXJuIHRoaXMuX25vZGVzLmxlbmd0aD1tLHRoaXN9ZnVuYyhjLG09dC5uaWwsUCxVKXtyZXR1cm4gdGhpcy5fYmxvY2tOb2RlKG5ldyAkKGMsbSxQKSksVSYmdGhpcy5jb2RlKFUpLmVuZEZ1bmMoKSx0aGlzfWVuZEZ1bmMoKXtyZXR1cm4gdGhpcy5fZW5kQmxvY2tOb2RlKCQpfW9wdGltaXplKGM9MSl7Zm9yKDtjLS0gPjA7KXRoaXMuX3Jvb3Qub3B0aW1pemVOb2RlcygpLHRoaXMuX3Jvb3Qub3B0aW1pemVOYW1lcyh0aGlzLl9yb290Lm5hbWVzLHRoaXMuX2NvbnN0YW50cyl9X2xlYWZOb2RlKGMpe3JldHVybiB0aGlzLl9jdXJyTm9kZS5ub2Rlcy5wdXNoKGMpLHRoaXN9X2Jsb2NrTm9kZShjKXt0aGlzLl9jdXJyTm9kZS5ub2Rlcy5wdXNoKGMpLHRoaXMuX25vZGVzLnB1c2goYyl9X2VuZEJsb2NrTm9kZShjLG0pe2NvbnN0IFA9dGhpcy5fY3Vyck5vZGU7aWYoUCBpbnN0YW5jZW9mIGN8fG0mJlAgaW5zdGFuY2VvZiBtKXJldHVybiB0aGlzLl9ub2Rlcy5wb3AoKSx0aGlzO3Rocm93IG5ldyBFcnJvcihgQ29kZUdlbjogbm90IGluIGJsb2NrICIke20/YCR7Yy5raW5kfS8ke20ua2luZH1gOmMua2luZH0iYCl9X2Vsc2VOb2RlKGMpe2NvbnN0IG09dGhpcy5fY3Vyck5vZGU7aWYoIShtIGluc3RhbmNlb2YgXykpdGhyb3cgbmV3IEVycm9yKCdDb2RlR2VuOiAiZWxzZSIgd2l0aG91dCAiaWYiJyk7cmV0dXJuIHRoaXMuX2N1cnJOb2RlPW0uZWxzZT1jLHRoaXN9Z2V0IF9yb290KCl7cmV0dXJuIHRoaXMuX25vZGVzWzBdfWdldCBfY3Vyck5vZGUoKXtjb25zdCBjPXRoaXMuX25vZGVzO3JldHVybiBjW2MubGVuZ3RoLTFdfXNldCBfY3Vyck5vZGUoYyl7Y29uc3QgbT10aGlzLl9ub2RlczttW20ubGVuZ3RoLTFdPWN9fWUuQ29kZUdlbj1wZTtmdW5jdGlvbiBXKHcsYyl7Zm9yKGNvbnN0IG0gaW4gYyl3W21dPSh3W21dfHwwKSsoY1ttXXx8MCk7cmV0dXJuIHd9ZnVuY3Rpb24gb2UodyxjKXtyZXR1cm4gYyBpbnN0YW5jZW9mIHQuX0NvZGVPck5hbWU/Vyh3LGMubmFtZXMpOnd9ZnVuY3Rpb24gWCh3LGMsbSl7aWYodyBpbnN0YW5jZW9mIHQuTmFtZSlyZXR1cm4gUCh3KTtpZighVSh3KSlyZXR1cm4gdztyZXR1cm4gbmV3IHQuX0NvZGUody5faXRlbXMucmVkdWNlKChGLFopPT4oWiBpbnN0YW5jZW9mIHQuTmFtZSYmKFo9UChaKSksWiBpbnN0YW5jZW9mIHQuX0NvZGU/Ri5wdXNoKC4uLlouX2l0ZW1zKTpGLnB1c2goWiksRiksW10pKTtmdW5jdGlvbiBQKEYpe2NvbnN0IFo9bVtGLnN0cl07cmV0dXJuIFo9PT12b2lkIDB8fGNbRi5zdHJdIT09MT9GOihkZWxldGUgY1tGLnN0cl0sWil9ZnVuY3Rpb24gVShGKXtyZXR1cm4gRiBpbnN0YW5jZW9mIHQuX0NvZGUmJkYuX2l0ZW1zLnNvbWUoWj0+WiBpbnN0YW5jZW9mIHQuTmFtZSYmY1taLnN0cl09PT0xJiZtW1ouc3RyXSE9PXZvaWQgMCl9fWZ1bmN0aW9uIHZlKHcsYyl7Zm9yKGNvbnN0IG0gaW4gYyl3W21dPSh3W21dfHwwKS0oY1ttXXx8MCl9ZnVuY3Rpb24gRWUodyl7cmV0dXJuIHR5cGVvZiB3PT0iYm9vbGVhbiJ8fHR5cGVvZiB3PT0ibnVtYmVyInx8dz09PW51bGw/IXc6KDAsdC5fKWAhJHtDKHcpfWB9ZS5ub3Q9RWU7Y29uc3QgTmU9ZyhlLm9wZXJhdG9ycy5BTkQpO2Z1bmN0aW9uIEJlKC4uLncpe3JldHVybiB3LnJlZHVjZShOZSl9ZS5hbmQ9QmU7Y29uc3QgdXI9ZyhlLm9wZXJhdG9ycy5PUik7ZnVuY3Rpb24gayguLi53KXtyZXR1cm4gdy5yZWR1Y2UodXIpfWUub3I9aztmdW5jdGlvbiBnKHcpe3JldHVybihjLG0pPT5jPT09dC5uaWw/bTptPT09dC5uaWw/YzooMCx0Ll8pYCR7QyhjKX0gJHt3fSAke0MobSl9YH1mdW5jdGlvbiBDKHcpe3JldHVybiB3IGluc3RhbmNlb2YgdC5OYW1lP3c6KDAsdC5fKWAoJHt3fSlgfX0odWUpO3ZhciBiZT17fTsoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuY2hlY2tTdHJpY3RNb2RlPWUuZ2V0RXJyb3JQYXRoPWUuVHlwZT1lLnVzZUZ1bmM9ZS5zZXRFdmFsdWF0ZWQ9ZS5ldmFsdWF0ZWRQcm9wc1RvTmFtZT1lLm1lcmdlRXZhbHVhdGVkPWUuZWFjaEl0ZW09ZS51bmVzY2FwZUpzb25Qb2ludGVyPWUuZXNjYXBlSnNvblBvaW50ZXI9ZS5lc2NhcGVGcmFnbWVudD1lLnVuZXNjYXBlRnJhZ21lbnQ9ZS5zY2hlbWFSZWZPclZhbD1lLnNjaGVtYUhhc1J1bGVzQnV0UmVmPWUuc2NoZW1hSGFzUnVsZXM9ZS5jaGVja1Vua25vd25SdWxlcz1lLmFsd2F5c1ZhbGlkU2NoZW1hPWUudG9IYXNoPXZvaWQgMDtjb25zdCB0PXVlLHI9eXI7ZnVuY3Rpb24gbigkKXtjb25zdCBOPXt9O2Zvcihjb25zdCBEIG9mICQpTltEXT0hMDtyZXR1cm4gTn1lLnRvSGFzaD1uO2Z1bmN0aW9uIHMoJCxOKXtyZXR1cm4gdHlwZW9mIE49PSJib29sZWFuIj9OOk9iamVjdC5rZXlzKE4pLmxlbmd0aD09PTA/ITA6KGEoJCxOKSwhbyhOLCQuc2VsZi5SVUxFUy5hbGwpKX1lLmFsd2F5c1ZhbGlkU2NoZW1hPXM7ZnVuY3Rpb24gYSgkLE49JC5zY2hlbWEpe2NvbnN0e29wdHM6RCxzZWxmOkJ9PSQ7aWYoIUQuc3RyaWN0U2NoZW1hfHx0eXBlb2YgTj09ImJvb2xlYW4iKXJldHVybjtjb25zdCBHPUIuUlVMRVMua2V5d29yZHM7Zm9yKGNvbnN0IHBlIGluIE4pR1twZV18fEgoJCxgdW5rbm93biBrZXl3b3JkOiAiJHtwZX0iYCl9ZS5jaGVja1Vua25vd25SdWxlcz1hO2Z1bmN0aW9uIG8oJCxOKXtpZih0eXBlb2YgJD09ImJvb2xlYW4iKXJldHVybiEkO2Zvcihjb25zdCBEIGluICQpaWYoTltEXSlyZXR1cm4hMDtyZXR1cm4hMX1lLnNjaGVtYUhhc1J1bGVzPW87ZnVuY3Rpb24gbCgkLE4pe2lmKHR5cGVvZiAkPT0iYm9vbGVhbiIpcmV0dXJuISQ7Zm9yKGNvbnN0IEQgaW4gJClpZihEIT09IiRyZWYiJiZOLmFsbFtEXSlyZXR1cm4hMDtyZXR1cm4hMX1lLnNjaGVtYUhhc1J1bGVzQnV0UmVmPWw7ZnVuY3Rpb24gZih7dG9wU2NoZW1hUmVmOiQsc2NoZW1hUGF0aDpOfSxELEIsRyl7aWYoIUcpe2lmKHR5cGVvZiBEPT0ibnVtYmVyInx8dHlwZW9mIEQ9PSJib29sZWFuIilyZXR1cm4gRDtpZih0eXBlb2YgRD09InN0cmluZyIpcmV0dXJuKDAsdC5fKWAke0R9YH1yZXR1cm4oMCx0Ll8pYCR7JH0ke059JHsoMCx0LmdldFByb3BlcnR5KShCKX1gfWUuc2NoZW1hUmVmT3JWYWw9ZjtmdW5jdGlvbiBwKCQpe3JldHVybiBFKGRlY29kZVVSSUNvbXBvbmVudCgkKSl9ZS51bmVzY2FwZUZyYWdtZW50PXA7ZnVuY3Rpb24gaSgkKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGgoJCkpfWUuZXNjYXBlRnJhZ21lbnQ9aTtmdW5jdGlvbiBoKCQpe3JldHVybiB0eXBlb2YgJD09Im51bWJlciI/YCR7JH1gOiQucmVwbGFjZSgvfi9nLCJ+MCIpLnJlcGxhY2UoL1wvL2csIn4xIil9ZS5lc2NhcGVKc29uUG9pbnRlcj1oO2Z1bmN0aW9uIEUoJCl7cmV0dXJuICQucmVwbGFjZSgvfjEvZywiLyIpLnJlcGxhY2UoL34wL2csIn4iKX1lLnVuZXNjYXBlSnNvblBvaW50ZXI9RTtmdW5jdGlvbiBUKCQsTil7aWYoQXJyYXkuaXNBcnJheSgkKSlmb3IoY29uc3QgRCBvZiAkKU4oRCk7ZWxzZSBOKCQpfWUuZWFjaEl0ZW09VDtmdW5jdGlvbiBJKHttZXJnZU5hbWVzOiQsbWVyZ2VUb05hbWU6TixtZXJnZVZhbHVlczpELHJlc3VsdFRvTmFtZTpCfSl7cmV0dXJuKEcscGUsVyxvZSk9Pntjb25zdCBYPVc9PT12b2lkIDA/cGU6VyBpbnN0YW5jZW9mIHQuTmFtZT8ocGUgaW5zdGFuY2VvZiB0Lk5hbWU/JChHLHBlLFcpOk4oRyxwZSxXKSxXKTpwZSBpbnN0YW5jZW9mIHQuTmFtZT8oTihHLFcscGUpLHBlKTpEKHBlLFcpO3JldHVybiBvZT09PXQuTmFtZSYmIShYIGluc3RhbmNlb2YgdC5OYW1lKT9CKEcsWCk6WH19ZS5tZXJnZUV2YWx1YXRlZD17cHJvcHM6SSh7bWVyZ2VOYW1lczooJCxOLEQpPT4kLmlmKCgwLHQuXylgJHtEfSAhPT0gdHJ1ZSAmJiAke059ICE9PSB1bmRlZmluZWRgLCgpPT57JC5pZigoMCx0Ll8pYCR7Tn0gPT09IHRydWVgLCgpPT4kLmFzc2lnbihELCEwKSwoKT0+JC5hc3NpZ24oRCwoMCx0Ll8pYCR7RH0gfHwge31gKS5jb2RlKCgwLHQuXylgT2JqZWN0LmFzc2lnbigke0R9LCAke059KWApKX0pLG1lcmdlVG9OYW1lOigkLE4sRCk9PiQuaWYoKDAsdC5fKWAke0R9ICE9PSB0cnVlYCwoKT0+e049PT0hMD8kLmFzc2lnbihELCEwKTooJC5hc3NpZ24oRCwoMCx0Ll8pYCR7RH0gfHwge31gKSx5KCQsRCxOKSl9KSxtZXJnZVZhbHVlczooJCxOKT0+JD09PSEwPyEwOlEoUSh7fSwkKSxOKSxyZXN1bHRUb05hbWU6an0pLGl0ZW1zOkkoe21lcmdlTmFtZXM6KCQsTixEKT0+JC5pZigoMCx0Ll8pYCR7RH0gIT09IHRydWUgJiYgJHtOfSAhPT0gdW5kZWZpbmVkYCwoKT0+JC5hc3NpZ24oRCwoMCx0Ll8pYCR7Tn0gPT09IHRydWUgPyB0cnVlIDogJHtEfSA+ICR7Tn0gPyAke0R9IDogJHtOfWApKSxtZXJnZVRvTmFtZTooJCxOLEQpPT4kLmlmKCgwLHQuXylgJHtEfSAhPT0gdHJ1ZWAsKCk9PiQuYXNzaWduKEQsTj09PSEwPyEwOigwLHQuXylgJHtEfSA+ICR7Tn0gPyAke0R9IDogJHtOfWApKSxtZXJnZVZhbHVlczooJCxOKT0+JD09PSEwPyEwOk1hdGgubWF4KCQsTikscmVzdWx0VG9OYW1lOigkLE4pPT4kLnZhcigiaXRlbXMiLE4pfSl9O2Z1bmN0aW9uIGooJCxOKXtpZihOPT09ITApcmV0dXJuICQudmFyKCJwcm9wcyIsITApO2NvbnN0IEQ9JC52YXIoInByb3BzIiwoMCx0Ll8pYHt9YCk7cmV0dXJuIE4hPT12b2lkIDAmJnkoJCxELE4pLER9ZS5ldmFsdWF0ZWRQcm9wc1RvTmFtZT1qO2Z1bmN0aW9uIHkoJCxOLEQpe09iamVjdC5rZXlzKEQpLmZvckVhY2goQj0+JC5hc3NpZ24oKDAsdC5fKWAke059JHsoMCx0LmdldFByb3BlcnR5KShCKX1gLCEwKSl9ZS5zZXRFdmFsdWF0ZWQ9eTtjb25zdCBfPXt9O2Z1bmN0aW9uIGIoJCxOKXtyZXR1cm4gJC5zY29wZVZhbHVlKCJmdW5jIix7cmVmOk4sY29kZTpfW04uY29kZV18fChfW04uY29kZV09bmV3IHIuX0NvZGUoTi5jb2RlKSl9KX1lLnVzZUZ1bmM9Yjt2YXIgTzsoZnVuY3Rpb24oJCl7JFskLk51bT0wXT0iTnVtIiwkWyQuU3RyPTFdPSJTdHIifSkoTz1lLlR5cGV8fChlLlR5cGU9e30pKTtmdW5jdGlvbiBBKCQsTixEKXtpZigkIGluc3RhbmNlb2YgdC5OYW1lKXtjb25zdCBCPU49PT1PLk51bTtyZXR1cm4gRD9CPygwLHQuXylgIlsiICsgJHskfSArICJdImA6KDAsdC5fKWAiWyciICsgJHskfSArICInXSJgOkI/KDAsdC5fKWAiLyIgKyAkeyR9YDooMCx0Ll8pYCIvIiArICR7JH0ucmVwbGFjZSgvfi9nLCAifjAiKS5yZXBsYWNlKC9cXC8vZywgIn4xIilgfXJldHVybiBEPygwLHQuZ2V0UHJvcGVydHkpKCQpLnRvU3RyaW5nKCk6Ii8iK2goJCl9ZS5nZXRFcnJvclBhdGg9QTtmdW5jdGlvbiBIKCQsTixEPSQub3B0cy5zdHJpY3RTY2hlbWEpe2lmKCEhRCl7aWYoTj1gc3RyaWN0IG1vZGU6ICR7Tn1gLEQ9PT0hMCl0aHJvdyBuZXcgRXJyb3IoTik7JC5zZWxmLmxvZ2dlci53YXJuKE4pfX1lLmNoZWNrU3RyaWN0TW9kZT1IfSkoYmUpO3ZhciBMZT17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2NvbnN0IEFlPXVlLHZjPXtkYXRhOm5ldyBBZS5OYW1lKCJkYXRhIiksdmFsQ3h0Om5ldyBBZS5OYW1lKCJ2YWxDeHQiKSxpbnN0YW5jZVBhdGg6bmV3IEFlLk5hbWUoImluc3RhbmNlUGF0aCIpLHBhcmVudERhdGE6bmV3IEFlLk5hbWUoInBhcmVudERhdGEiKSxwYXJlbnREYXRhUHJvcGVydHk6bmV3IEFlLk5hbWUoInBhcmVudERhdGFQcm9wZXJ0eSIpLHJvb3REYXRhOm5ldyBBZS5OYW1lKCJyb290RGF0YSIpLGR5bmFtaWNBbmNob3JzOm5ldyBBZS5OYW1lKCJkeW5hbWljQW5jaG9ycyIpLHZFcnJvcnM6bmV3IEFlLk5hbWUoInZFcnJvcnMiKSxlcnJvcnM6bmV3IEFlLk5hbWUoImVycm9ycyIpLHRoaXM6bmV3IEFlLk5hbWUoInRoaXMiKSxzZWxmOm5ldyBBZS5OYW1lKCJzZWxmIiksc2NvcGU6bmV3IEFlLk5hbWUoInNjb3BlIiksanNvbjpuZXcgQWUuTmFtZSgianNvbiIpLGpzb25Qb3M6bmV3IEFlLk5hbWUoImpzb25Qb3MiKSxqc29uTGVuOm5ldyBBZS5OYW1lKCJqc29uTGVuIiksanNvblBhcnQ6bmV3IEFlLk5hbWUoImpzb25QYXJ0Iil9O0xlLmRlZmF1bHQ9dmMsZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZXh0ZW5kRXJyb3JzPWUucmVzZXRFcnJvcnNDb3VudD1lLnJlcG9ydEV4dHJhRXJyb3I9ZS5yZXBvcnRFcnJvcj1lLmtleXdvcmQkRGF0YUVycm9yPWUua2V5d29yZEVycm9yPXZvaWQgMDtjb25zdCB0PXVlLHI9YmUsbj1MZTtlLmtleXdvcmRFcnJvcj17bWVzc2FnZTooe2tleXdvcmQ6eX0pPT4oMCx0LnN0cilgbXVzdCBwYXNzICIke3l9IiBrZXl3b3JkIHZhbGlkYXRpb25gfSxlLmtleXdvcmQkRGF0YUVycm9yPXttZXNzYWdlOih7a2V5d29yZDp5LHNjaGVtYVR5cGU6X30pPT5fPygwLHQuc3RyKWAiJHt5fSIga2V5d29yZCBtdXN0IGJlICR7X30gKCRkYXRhKWA6KDAsdC5zdHIpYCIke3l9IiBrZXl3b3JkIGlzIGludmFsaWQgKCRkYXRhKWB9O2Z1bmN0aW9uIHMoeSxfPWUua2V5d29yZEVycm9yLGIsTyl7Y29uc3R7aXQ6QX09eSx7Z2VuOkgsY29tcG9zaXRlUnVsZTokLGFsbEVycm9yczpOfT1BLEQ9aCh5LF8sYik7KE8hPW51bGw/TzokfHxOKT9mKEgsRCk6cChBLCgwLHQuXylgWyR7RH1dYCl9ZS5yZXBvcnRFcnJvcj1zO2Z1bmN0aW9uIGEoeSxfPWUua2V5d29yZEVycm9yLGIpe2NvbnN0e2l0Ok99PXkse2dlbjpBLGNvbXBvc2l0ZVJ1bGU6SCxhbGxFcnJvcnM6JH09TyxOPWgoeSxfLGIpO2YoQSxOKSxIfHwkfHxwKE8sbi5kZWZhdWx0LnZFcnJvcnMpfWUucmVwb3J0RXh0cmFFcnJvcj1hO2Z1bmN0aW9uIG8oeSxfKXt5LmFzc2lnbihuLmRlZmF1bHQuZXJyb3JzLF8pLHkuaWYoKDAsdC5fKWAke24uZGVmYXVsdC52RXJyb3JzfSAhPT0gbnVsbGAsKCk9PnkuaWYoXywoKT0+eS5hc3NpZ24oKDAsdC5fKWAke24uZGVmYXVsdC52RXJyb3JzfS5sZW5ndGhgLF8pLCgpPT55LmFzc2lnbihuLmRlZmF1bHQudkVycm9ycyxudWxsKSkpfWUucmVzZXRFcnJvcnNDb3VudD1vO2Z1bmN0aW9uIGwoe2dlbjp5LGtleXdvcmQ6XyxzY2hlbWFWYWx1ZTpiLGRhdGE6TyxlcnJzQ291bnQ6QSxpdDpIfSl7aWYoQT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoImFqdiBpbXBsZW1lbnRhdGlvbiBlcnJvciIpO2NvbnN0ICQ9eS5uYW1lKCJlcnIiKTt5LmZvclJhbmdlKCJpIixBLG4uZGVmYXVsdC5lcnJvcnMsTj0+e3kuY29uc3QoJCwoMCx0Ll8pYCR7bi5kZWZhdWx0LnZFcnJvcnN9WyR7Tn1dYCkseS5pZigoMCx0Ll8pYCR7JH0uaW5zdGFuY2VQYXRoID09PSB1bmRlZmluZWRgLCgpPT55LmFzc2lnbigoMCx0Ll8pYCR7JH0uaW5zdGFuY2VQYXRoYCwoMCx0LnN0ckNvbmNhdCkobi5kZWZhdWx0Lmluc3RhbmNlUGF0aCxILmVycm9yUGF0aCkpKSx5LmFzc2lnbigoMCx0Ll8pYCR7JH0uc2NoZW1hUGF0aGAsKDAsdC5zdHIpYCR7SC5lcnJTY2hlbWFQYXRofS8ke199YCksSC5vcHRzLnZlcmJvc2UmJih5LmFzc2lnbigoMCx0Ll8pYCR7JH0uc2NoZW1hYCxiKSx5LmFzc2lnbigoMCx0Ll8pYCR7JH0uZGF0YWAsTykpfSl9ZS5leHRlbmRFcnJvcnM9bDtmdW5jdGlvbiBmKHksXyl7Y29uc3QgYj15LmNvbnN0KCJlcnIiLF8pO3kuaWYoKDAsdC5fKWAke24uZGVmYXVsdC52RXJyb3JzfSA9PT0gbnVsbGAsKCk9PnkuYXNzaWduKG4uZGVmYXVsdC52RXJyb3JzLCgwLHQuXylgWyR7Yn1dYCksKDAsdC5fKWAke24uZGVmYXVsdC52RXJyb3JzfS5wdXNoKCR7Yn0pYCkseS5jb2RlKCgwLHQuXylgJHtuLmRlZmF1bHQuZXJyb3JzfSsrYCl9ZnVuY3Rpb24gcCh5LF8pe2NvbnN0e2dlbjpiLHZhbGlkYXRlTmFtZTpPLHNjaGVtYUVudjpBfT15O0EuJGFzeW5jP2IudGhyb3coKDAsdC5fKWBuZXcgJHt5LlZhbGlkYXRpb25FcnJvcn0oJHtffSlgKTooYi5hc3NpZ24oKDAsdC5fKWAke099LmVycm9yc2AsXyksYi5yZXR1cm4oITEpKX1jb25zdCBpPXtrZXl3b3JkOm5ldyB0Lk5hbWUoImtleXdvcmQiKSxzY2hlbWFQYXRoOm5ldyB0Lk5hbWUoInNjaGVtYVBhdGgiKSxwYXJhbXM6bmV3IHQuTmFtZSgicGFyYW1zIikscHJvcGVydHlOYW1lOm5ldyB0Lk5hbWUoInByb3BlcnR5TmFtZSIpLG1lc3NhZ2U6bmV3IHQuTmFtZSgibWVzc2FnZSIpLHNjaGVtYTpuZXcgdC5OYW1lKCJzY2hlbWEiKSxwYXJlbnRTY2hlbWE6bmV3IHQuTmFtZSgicGFyZW50U2NoZW1hIil9O2Z1bmN0aW9uIGgoeSxfLGIpe2NvbnN0e2NyZWF0ZUVycm9yczpPfT15Lml0O3JldHVybiBPPT09ITE/KDAsdC5fKWB7fWA6RSh5LF8sYil9ZnVuY3Rpb24gRSh5LF8sYj17fSl7Y29uc3R7Z2VuOk8saXQ6QX09eSxIPVtUKEEsYiksSSh5LGIpXTtyZXR1cm4gaih5LF8sSCksTy5vYmplY3QoLi4uSCl9ZnVuY3Rpb24gVCh7ZXJyb3JQYXRoOnl9LHtpbnN0YW5jZVBhdGg6X30pe2NvbnN0IGI9Xz8oMCx0LnN0cilgJHt5fSR7KDAsci5nZXRFcnJvclBhdGgpKF8sci5UeXBlLlN0cil9YDp5O3JldHVybltuLmRlZmF1bHQuaW5zdGFuY2VQYXRoLCgwLHQuc3RyQ29uY2F0KShuLmRlZmF1bHQuaW5zdGFuY2VQYXRoLGIpXX1mdW5jdGlvbiBJKHtrZXl3b3JkOnksaXQ6e2VyclNjaGVtYVBhdGg6X319LHtzY2hlbWFQYXRoOmIscGFyZW50U2NoZW1hOk99KXtsZXQgQT1PP186KDAsdC5zdHIpYCR7X30vJHt5fWA7cmV0dXJuIGImJihBPSgwLHQuc3RyKWAke0F9JHsoMCxyLmdldEVycm9yUGF0aCkoYixyLlR5cGUuU3RyKX1gKSxbaS5zY2hlbWFQYXRoLEFdfWZ1bmN0aW9uIGooeSx7cGFyYW1zOl8sbWVzc2FnZTpifSxPKXtjb25zdHtrZXl3b3JkOkEsZGF0YTpILHNjaGVtYVZhbHVlOiQsaXQ6Tn09eSx7b3B0czpELHByb3BlcnR5TmFtZTpCLHRvcFNjaGVtYVJlZjpHLHNjaGVtYVBhdGg6cGV9PU47Ty5wdXNoKFtpLmtleXdvcmQsQV0sW2kucGFyYW1zLHR5cGVvZiBfPT0iZnVuY3Rpb24iP18oeSk6X3x8KDAsdC5fKWB7fWBdKSxELm1lc3NhZ2VzJiZPLnB1c2goW2kubWVzc2FnZSx0eXBlb2YgYj09ImZ1bmN0aW9uIj9iKHkpOmJdKSxELnZlcmJvc2UmJk8ucHVzaChbaS5zY2hlbWEsJF0sW2kucGFyZW50U2NoZW1hLCgwLHQuXylgJHtHfSR7cGV9YF0sW24uZGVmYXVsdC5kYXRhLEhdKSxCJiZPLnB1c2goW2kucHJvcGVydHlOYW1lLEJdKX19KEVyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRyLmJvb2xPckVtcHR5U2NoZW1hPXRyLnRvcEJvb2xPckVtcHR5U2NoZW1hPXZvaWQgMDtjb25zdCBfYz1FcixnYz11ZSxFYz1MZSx5Yz17bWVzc2FnZToiYm9vbGVhbiBzY2hlbWEgaXMgZmFsc2UifTtmdW5jdGlvbiAkYyhlKXtjb25zdHtnZW46dCxzY2hlbWE6cix2YWxpZGF0ZU5hbWU6bn09ZTtyPT09ITE/bmEoZSwhMSk6dHlwZW9mIHI9PSJvYmplY3QiJiZyLiRhc3luYz09PSEwP3QucmV0dXJuKEVjLmRlZmF1bHQuZGF0YSk6KHQuYXNzaWduKCgwLGdjLl8pYCR7bn0uZXJyb3JzYCxudWxsKSx0LnJldHVybighMCkpfXRyLnRvcEJvb2xPckVtcHR5U2NoZW1hPSRjO2Z1bmN0aW9uIHdjKGUsdCl7Y29uc3R7Z2VuOnIsc2NoZW1hOm59PWU7bj09PSExPyhyLnZhcih0LCExKSxuYShlKSk6ci52YXIodCwhMCl9dHIuYm9vbE9yRW1wdHlTY2hlbWE9d2M7ZnVuY3Rpb24gbmEoZSx0KXtjb25zdHtnZW46cixkYXRhOm59PWUscz17Z2VuOnIsa2V5d29yZDoiZmFsc2Ugc2NoZW1hIixkYXRhOm4sc2NoZW1hOiExLHNjaGVtYUNvZGU6ITEsc2NoZW1hVmFsdWU6ITEscGFyYW1zOnt9LGl0OmV9OygwLF9jLnJlcG9ydEVycm9yKShzLHljLHZvaWQgMCx0KX12YXIgbm49e30sRHQ9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KER0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxEdC5nZXRSdWxlcz1EdC5pc0pTT05UeXBlPXZvaWQgMDtjb25zdCBTYz1bInN0cmluZyIsIm51bWJlciIsImludGVnZXIiLCJib29sZWFuIiwibnVsbCIsIm9iamVjdCIsImFycmF5Il0sUmM9bmV3IFNldChTYyk7ZnVuY3Rpb24gYmMoZSl7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIiYmUmMuaGFzKGUpfUR0LmlzSlNPTlR5cGU9YmM7ZnVuY3Rpb24gT2MoKXtjb25zdCBlPXtudW1iZXI6e3R5cGU6Im51bWJlciIscnVsZXM6W119LHN0cmluZzp7dHlwZToic3RyaW5nIixydWxlczpbXX0sYXJyYXk6e3R5cGU6ImFycmF5IixydWxlczpbXX0sb2JqZWN0Ont0eXBlOiJvYmplY3QiLHJ1bGVzOltdfX07cmV0dXJue3R5cGVzOmxlKFEoe30sZSkse2ludGVnZXI6ITAsYm9vbGVhbjohMCxudWxsOiEwfSkscnVsZXM6W3tydWxlczpbXX0sZS5udW1iZXIsZS5zdHJpbmcsZS5hcnJheSxlLm9iamVjdF0scG9zdDp7cnVsZXM6W119LGFsbDp7fSxrZXl3b3Jkczp7fX19RHQuZ2V0UnVsZXM9T2M7dmFyIGx0PXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShsdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbHQuc2hvdWxkVXNlUnVsZT1sdC5zaG91bGRVc2VHcm91cD1sdC5zY2hlbWFIYXNSdWxlc0ZvclR5cGU9dm9pZCAwO2Z1bmN0aW9uIE5jKHtzY2hlbWE6ZSxzZWxmOnR9LHIpe2NvbnN0IG49dC5SVUxFUy50eXBlc1tyXTtyZXR1cm4gbiYmbiE9PSEwJiZzYShlLG4pfWx0LnNjaGVtYUhhc1J1bGVzRm9yVHlwZT1OYztmdW5jdGlvbiBzYShlLHQpe3JldHVybiB0LnJ1bGVzLnNvbWUocj0+YWEoZSxyKSl9bHQuc2hvdWxkVXNlR3JvdXA9c2E7ZnVuY3Rpb24gYWEoZSx0KXt2YXIgcjtyZXR1cm4gZVt0LmtleXdvcmRdIT09dm9pZCAwfHwoKHI9dC5kZWZpbml0aW9uLmltcGxlbWVudHMpPT09bnVsbHx8cj09PXZvaWQgMD92b2lkIDA6ci5zb21lKG49PmVbbl0hPT12b2lkIDApKX1sdC5zaG91bGRVc2VSdWxlPWFhLGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLnJlcG9ydFR5cGVFcnJvcj1lLmNoZWNrRGF0YVR5cGVzPWUuY2hlY2tEYXRhVHlwZT1lLmNvZXJjZUFuZENoZWNrRGF0YVR5cGU9ZS5nZXRKU09OVHlwZXM9ZS5nZXRTY2hlbWFUeXBlcz1lLkRhdGFUeXBlPXZvaWQgMDtjb25zdCB0PUR0LHI9bHQsbj1FcixzPXVlLGE9YmU7dmFyIG87KGZ1bmN0aW9uKE8pe09bTy5Db3JyZWN0PTBdPSJDb3JyZWN0IixPW08uV3Jvbmc9MV09Ildyb25nIn0pKG89ZS5EYXRhVHlwZXx8KGUuRGF0YVR5cGU9e30pKTtmdW5jdGlvbiBsKE8pe2NvbnN0IEE9ZihPLnR5cGUpO2lmKEEuaW5jbHVkZXMoIm51bGwiKSl7aWYoTy5udWxsYWJsZT09PSExKXRocm93IG5ldyBFcnJvcigidHlwZTogbnVsbCBjb250cmFkaWN0cyBudWxsYWJsZTogZmFsc2UiKX1lbHNle2lmKCFBLmxlbmd0aCYmTy5udWxsYWJsZSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoJyJudWxsYWJsZSIgY2Fubm90IGJlIHVzZWQgd2l0aG91dCAidHlwZSInKTtPLm51bGxhYmxlPT09ITAmJkEucHVzaCgibnVsbCIpfXJldHVybiBBfWUuZ2V0U2NoZW1hVHlwZXM9bDtmdW5jdGlvbiBmKE8pe2NvbnN0IEE9QXJyYXkuaXNBcnJheShPKT9POk8/W09dOltdO2lmKEEuZXZlcnkodC5pc0pTT05UeXBlKSlyZXR1cm4gQTt0aHJvdyBuZXcgRXJyb3IoInR5cGUgbXVzdCBiZSBKU09OVHlwZSBvciBKU09OVHlwZVtdOiAiK0Euam9pbigiLCIpKX1lLmdldEpTT05UeXBlcz1mO2Z1bmN0aW9uIHAoTyxBKXtjb25zdHtnZW46SCxkYXRhOiQsb3B0czpOfT1PLEQ9aChBLE4uY29lcmNlVHlwZXMpLEI9QS5sZW5ndGg+MCYmIShELmxlbmd0aD09PTAmJkEubGVuZ3RoPT09MSYmKDAsci5zY2hlbWFIYXNSdWxlc0ZvclR5cGUpKE8sQVswXSkpO2lmKEIpe2NvbnN0IEc9aihBLCQsTi5zdHJpY3ROdW1iZXJzLG8uV3JvbmcpO0guaWYoRywoKT0+e0QubGVuZ3RoP0UoTyxBLEQpOl8oTyl9KX1yZXR1cm4gQn1lLmNvZXJjZUFuZENoZWNrRGF0YVR5cGU9cDtjb25zdCBpPW5ldyBTZXQoWyJzdHJpbmciLCJudW1iZXIiLCJpbnRlZ2VyIiwiYm9vbGVhbiIsIm51bGwiXSk7ZnVuY3Rpb24gaChPLEEpe3JldHVybiBBP08uZmlsdGVyKEg9PmkuaGFzKEgpfHxBPT09ImFycmF5IiYmSD09PSJhcnJheSIpOltdfWZ1bmN0aW9uIEUoTyxBLEgpe2NvbnN0e2dlbjokLGRhdGE6TixvcHRzOkR9PU8sQj0kLmxldCgiZGF0YVR5cGUiLCgwLHMuXylgdHlwZW9mICR7Tn1gKSxHPSQubGV0KCJjb2VyY2VkIiwoMCxzLl8pYHVuZGVmaW5lZGApO0QuY29lcmNlVHlwZXM9PT0iYXJyYXkiJiYkLmlmKCgwLHMuXylgJHtCfSA9PSAnb2JqZWN0JyAmJiBBcnJheS5pc0FycmF5KCR7Tn0pICYmICR7Tn0ubGVuZ3RoID09IDFgLCgpPT4kLmFzc2lnbihOLCgwLHMuXylgJHtOfVswXWApLmFzc2lnbihCLCgwLHMuXylgdHlwZW9mICR7Tn1gKS5pZihqKEEsTixELnN0cmljdE51bWJlcnMpLCgpPT4kLmFzc2lnbihHLE4pKSksJC5pZigoMCxzLl8pYCR7R30gIT09IHVuZGVmaW5lZGApO2Zvcihjb25zdCBXIG9mIEgpKGkuaGFzKFcpfHxXPT09ImFycmF5IiYmRC5jb2VyY2VUeXBlcz09PSJhcnJheSIpJiZwZShXKTskLmVsc2UoKSxfKE8pLCQuZW5kSWYoKSwkLmlmKCgwLHMuXylgJHtHfSAhPT0gdW5kZWZpbmVkYCwoKT0+eyQuYXNzaWduKE4sRyksVChPLEcpfSk7ZnVuY3Rpb24gcGUoVyl7c3dpdGNoKFcpe2Nhc2Uic3RyaW5nIjokLmVsc2VJZigoMCxzLl8pYCR7Qn0gPT0gIm51bWJlciIgfHwgJHtCfSA9PSAiYm9vbGVhbiJgKS5hc3NpZ24oRywoMCxzLl8pYCIiICsgJHtOfWApLmVsc2VJZigoMCxzLl8pYCR7Tn0gPT09IG51bGxgKS5hc3NpZ24oRywoMCxzLl8pYCIiYCk7cmV0dXJuO2Nhc2UibnVtYmVyIjokLmVsc2VJZigoMCxzLl8pYCR7Qn0gPT0gImJvb2xlYW4iIHx8ICR7Tn0gPT09IG51bGwKICAgICAgICAgICAgICB8fCAoJHtCfSA9PSAic3RyaW5nIiAmJiAke059ICYmICR7Tn0gPT0gKyR7Tn0pYCkuYXNzaWduKEcsKDAscy5fKWArJHtOfWApO3JldHVybjtjYXNlImludGVnZXIiOiQuZWxzZUlmKCgwLHMuXylgJHtCfSA9PT0gImJvb2xlYW4iIHx8ICR7Tn0gPT09IG51bGwKICAgICAgICAgICAgICB8fCAoJHtCfSA9PT0gInN0cmluZyIgJiYgJHtOfSAmJiAke059ID09ICske059ICYmICEoJHtOfSAlIDEpKWApLmFzc2lnbihHLCgwLHMuXylgKyR7Tn1gKTtyZXR1cm47Y2FzZSJib29sZWFuIjokLmVsc2VJZigoMCxzLl8pYCR7Tn0gPT09ICJmYWxzZSIgfHwgJHtOfSA9PT0gMCB8fCAke059ID09PSBudWxsYCkuYXNzaWduKEcsITEpLmVsc2VJZigoMCxzLl8pYCR7Tn0gPT09ICJ0cnVlIiB8fCAke059ID09PSAxYCkuYXNzaWduKEcsITApO3JldHVybjtjYXNlIm51bGwiOiQuZWxzZUlmKCgwLHMuXylgJHtOfSA9PT0gIiIgfHwgJHtOfSA9PT0gMCB8fCAke059ID09PSBmYWxzZWApLCQuYXNzaWduKEcsbnVsbCk7cmV0dXJuO2Nhc2UiYXJyYXkiOiQuZWxzZUlmKCgwLHMuXylgJHtCfSA9PT0gInN0cmluZyIgfHwgJHtCfSA9PT0gIm51bWJlciIKICAgICAgICAgICAgICB8fCAke0J9ID09PSAiYm9vbGVhbiIgfHwgJHtOfSA9PT0gbnVsbGApLmFzc2lnbihHLCgwLHMuXylgWyR7Tn1dYCl9fX1mdW5jdGlvbiBUKHtnZW46TyxwYXJlbnREYXRhOkEscGFyZW50RGF0YVByb3BlcnR5Okh9LCQpe08uaWYoKDAscy5fKWAke0F9ICE9PSB1bmRlZmluZWRgLCgpPT5PLmFzc2lnbigoMCxzLl8pYCR7QX1bJHtIfV1gLCQpKX1mdW5jdGlvbiBJKE8sQSxILCQ9by5Db3JyZWN0KXtjb25zdCBOPSQ9PT1vLkNvcnJlY3Q/cy5vcGVyYXRvcnMuRVE6cy5vcGVyYXRvcnMuTkVRO2xldCBEO3N3aXRjaChPKXtjYXNlIm51bGwiOnJldHVybigwLHMuXylgJHtBfSAke059IG51bGxgO2Nhc2UiYXJyYXkiOkQ9KDAscy5fKWBBcnJheS5pc0FycmF5KCR7QX0pYDticmVhaztjYXNlIm9iamVjdCI6RD0oMCxzLl8pYCR7QX0gJiYgdHlwZW9mICR7QX0gPT0gIm9iamVjdCIgJiYgIUFycmF5LmlzQXJyYXkoJHtBfSlgO2JyZWFrO2Nhc2UiaW50ZWdlciI6RD1CKCgwLHMuXylgISgke0F9ICUgMSkgJiYgIWlzTmFOKCR7QX0pYCk7YnJlYWs7Y2FzZSJudW1iZXIiOkQ9QigpO2JyZWFrO2RlZmF1bHQ6cmV0dXJuKDAscy5fKWB0eXBlb2YgJHtBfSAke059ICR7T31gfXJldHVybiAkPT09by5Db3JyZWN0P0Q6KDAscy5ub3QpKEQpO2Z1bmN0aW9uIEIoRz1zLm5pbCl7cmV0dXJuKDAscy5hbmQpKCgwLHMuXylgdHlwZW9mICR7QX0gPT0gIm51bWJlciJgLEcsSD8oMCxzLl8pYGlzRmluaXRlKCR7QX0pYDpzLm5pbCl9fWUuY2hlY2tEYXRhVHlwZT1JO2Z1bmN0aW9uIGooTyxBLEgsJCl7aWYoTy5sZW5ndGg9PT0xKXJldHVybiBJKE9bMF0sQSxILCQpO2xldCBOO2NvbnN0IEQ9KDAsYS50b0hhc2gpKE8pO2lmKEQuYXJyYXkmJkQub2JqZWN0KXtjb25zdCBCPSgwLHMuXylgdHlwZW9mICR7QX0gIT0gIm9iamVjdCJgO049RC5udWxsP0I6KDAscy5fKWAhJHtBfSB8fCAke0J9YCxkZWxldGUgRC5udWxsLGRlbGV0ZSBELmFycmF5LGRlbGV0ZSBELm9iamVjdH1lbHNlIE49cy5uaWw7RC5udW1iZXImJmRlbGV0ZSBELmludGVnZXI7Zm9yKGNvbnN0IEIgaW4gRClOPSgwLHMuYW5kKShOLEkoQixBLEgsJCkpO3JldHVybiBOfWUuY2hlY2tEYXRhVHlwZXM9ajtjb25zdCB5PXttZXNzYWdlOih7c2NoZW1hOk99KT0+YG11c3QgYmUgJHtPfWAscGFyYW1zOih7c2NoZW1hOk8sc2NoZW1hVmFsdWU6QX0pPT50eXBlb2YgTz09InN0cmluZyI/KDAscy5fKWB7dHlwZTogJHtPfX1gOigwLHMuXylge3R5cGU6ICR7QX19YH07ZnVuY3Rpb24gXyhPKXtjb25zdCBBPWIoTyk7KDAsbi5yZXBvcnRFcnJvcikoQSx5KX1lLnJlcG9ydFR5cGVFcnJvcj1fO2Z1bmN0aW9uIGIoTyl7Y29uc3R7Z2VuOkEsZGF0YTpILHNjaGVtYTokfT1PLE49KDAsYS5zY2hlbWFSZWZPclZhbCkoTywkLCJ0eXBlIik7cmV0dXJue2dlbjpBLGtleXdvcmQ6InR5cGUiLGRhdGE6SCxzY2hlbWE6JC50eXBlLHNjaGVtYUNvZGU6TixzY2hlbWFWYWx1ZTpOLHBhcmVudFNjaGVtYTokLHBhcmFtczp7fSxpdDpPfX19KG5uKTt2YXIgc249e307T2JqZWN0LmRlZmluZVByb3BlcnR5KHNuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxzbi5hc3NpZ25EZWZhdWx0cz12b2lkIDA7Y29uc3QgcnI9dWUsUGM9YmU7ZnVuY3Rpb24gVGMoZSx0KXtjb25zdHtwcm9wZXJ0aWVzOnIsaXRlbXM6bn09ZS5zY2hlbWE7aWYodD09PSJvYmplY3QiJiZyKWZvcihjb25zdCBzIGluIHIpb2EoZSxzLHJbc10uZGVmYXVsdCk7ZWxzZSB0PT09ImFycmF5IiYmQXJyYXkuaXNBcnJheShuKSYmbi5mb3JFYWNoKChzLGEpPT5vYShlLGEscy5kZWZhdWx0KSl9c24uYXNzaWduRGVmYXVsdHM9VGM7ZnVuY3Rpb24gb2EoZSx0LHIpe2NvbnN0e2dlbjpuLGNvbXBvc2l0ZVJ1bGU6cyxkYXRhOmEsb3B0czpvfT1lO2lmKHI9PT12b2lkIDApcmV0dXJuO2NvbnN0IGw9KDAscnIuXylgJHthfSR7KDAscnIuZ2V0UHJvcGVydHkpKHQpfWA7aWYocyl7KDAsUGMuY2hlY2tTdHJpY3RNb2RlKShlLGBkZWZhdWx0IGlzIGlnbm9yZWQgZm9yOiAke2x9YCk7cmV0dXJufWxldCBmPSgwLHJyLl8pYCR7bH0gPT09IHVuZGVmaW5lZGA7by51c2VEZWZhdWx0cz09PSJlbXB0eSImJihmPSgwLHJyLl8pYCR7Zn0gfHwgJHtsfSA9PT0gbnVsbCB8fCAke2x9ID09PSAiImApLG4uaWYoZiwoMCxyci5fKWAke2x9ID0gJHsoMCxyci5zdHJpbmdpZnkpKHIpfWApfXZhciBYZT17fSxuZT17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkobmUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG5lLnZhbGlkYXRlVW5pb249bmUudmFsaWRhdGVBcnJheT1uZS51c2VQYXR0ZXJuPW5lLmNhbGxWYWxpZGF0ZUNvZGU9bmUuc2NoZW1hUHJvcGVydGllcz1uZS5hbGxTY2hlbWFQcm9wZXJ0aWVzPW5lLm5vUHJvcGVydHlJbkRhdGE9bmUucHJvcGVydHlJbkRhdGE9bmUuaXNPd25Qcm9wZXJ0eT1uZS5oYXNQcm9wRnVuYz1uZS5yZXBvcnRNaXNzaW5nUHJvcD1uZS5jaGVja01pc3NpbmdQcm9wPW5lLmNoZWNrUmVwb3J0TWlzc2luZ1Byb3A9dm9pZCAwO2NvbnN0IGRlPXVlLEtuPWJlLEV0PUxlLEFjPWJlO2Z1bmN0aW9uIENjKGUsdCl7Y29uc3R7Z2VuOnIsZGF0YTpuLGl0OnN9PWU7ci5pZihKbihyLG4sdCxzLm9wdHMub3duUHJvcGVydGllcyksKCk9PntlLnNldFBhcmFtcyh7bWlzc2luZ1Byb3BlcnR5OigwLGRlLl8pYCR7dH1gfSwhMCksZS5lcnJvcigpfSl9bmUuY2hlY2tSZXBvcnRNaXNzaW5nUHJvcD1DYztmdW5jdGlvbiBJYyh7Z2VuOmUsZGF0YTp0LGl0OntvcHRzOnJ9fSxuLHMpe3JldHVybigwLGRlLm9yKSguLi5uLm1hcChhPT4oMCxkZS5hbmQpKEpuKGUsdCxhLHIub3duUHJvcGVydGllcyksKDAsZGUuXylgJHtzfSA9ICR7YX1gKSkpfW5lLmNoZWNrTWlzc2luZ1Byb3A9SWM7ZnVuY3Rpb24gRGMoZSx0KXtlLnNldFBhcmFtcyh7bWlzc2luZ1Byb3BlcnR5OnR9LCEwKSxlLmVycm9yKCl9bmUucmVwb3J0TWlzc2luZ1Byb3A9RGM7ZnVuY3Rpb24gaWEoZSl7cmV0dXJuIGUuc2NvcGVWYWx1ZSgiZnVuYyIse3JlZjpPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGNvZGU6KDAsZGUuXylgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eWB9KX1uZS5oYXNQcm9wRnVuYz1pYTtmdW5jdGlvbiBCbihlLHQscil7cmV0dXJuKDAsZGUuXylgJHtpYShlKX0uY2FsbCgke3R9LCAke3J9KWB9bmUuaXNPd25Qcm9wZXJ0eT1CbjtmdW5jdGlvbiBqYyhlLHQscixuKXtjb25zdCBzPSgwLGRlLl8pYCR7dH0keygwLGRlLmdldFByb3BlcnR5KShyKX0gIT09IHVuZGVmaW5lZGA7cmV0dXJuIG4/KDAsZGUuXylgJHtzfSAmJiAke0JuKGUsdCxyKX1gOnN9bmUucHJvcGVydHlJbkRhdGE9amM7ZnVuY3Rpb24gSm4oZSx0LHIsbil7Y29uc3Qgcz0oMCxkZS5fKWAke3R9JHsoMCxkZS5nZXRQcm9wZXJ0eSkocil9ID09PSB1bmRlZmluZWRgO3JldHVybiBuPygwLGRlLm9yKShzLCgwLGRlLm5vdCkoQm4oZSx0LHIpKSk6c31uZS5ub1Byb3BlcnR5SW5EYXRhPUpuO2Z1bmN0aW9uIGNhKGUpe3JldHVybiBlP09iamVjdC5rZXlzKGUpLmZpbHRlcih0PT50IT09Il9fcHJvdG9fXyIpOltdfW5lLmFsbFNjaGVtYVByb3BlcnRpZXM9Y2E7ZnVuY3Rpb24ga2MoZSx0KXtyZXR1cm4gY2EodCkuZmlsdGVyKHI9PiEoMCxLbi5hbHdheXNWYWxpZFNjaGVtYSkoZSx0W3JdKSl9bmUuc2NoZW1hUHJvcGVydGllcz1rYztmdW5jdGlvbiBVYyh7c2NoZW1hQ29kZTplLGRhdGE6dCxpdDp7Z2VuOnIsdG9wU2NoZW1hUmVmOm4sc2NoZW1hUGF0aDpzLGVycm9yUGF0aDphfSxpdDpvfSxsLGYscCl7Y29uc3QgaT1wPygwLGRlLl8pYCR7ZX0sICR7dH0sICR7bn0ke3N9YDp0LGg9W1tFdC5kZWZhdWx0Lmluc3RhbmNlUGF0aCwoMCxkZS5zdHJDb25jYXQpKEV0LmRlZmF1bHQuaW5zdGFuY2VQYXRoLGEpXSxbRXQuZGVmYXVsdC5wYXJlbnREYXRhLG8ucGFyZW50RGF0YV0sW0V0LmRlZmF1bHQucGFyZW50RGF0YVByb3BlcnR5LG8ucGFyZW50RGF0YVByb3BlcnR5XSxbRXQuZGVmYXVsdC5yb290RGF0YSxFdC5kZWZhdWx0LnJvb3REYXRhXV07by5vcHRzLmR5bmFtaWNSZWYmJmgucHVzaChbRXQuZGVmYXVsdC5keW5hbWljQW5jaG9ycyxFdC5kZWZhdWx0LmR5bmFtaWNBbmNob3JzXSk7Y29uc3QgRT0oMCxkZS5fKWAke2l9LCAke3Iub2JqZWN0KC4uLmgpfWA7cmV0dXJuIGYhPT1kZS5uaWw/KDAsZGUuXylgJHtsfS5jYWxsKCR7Zn0sICR7RX0pYDooMCxkZS5fKWAke2x9KCR7RX0pYH1uZS5jYWxsVmFsaWRhdGVDb2RlPVVjO2NvbnN0IEZjPSgwLGRlLl8pYG5ldyBSZWdFeHBgO2Z1bmN0aW9uIE1jKHtnZW46ZSxpdDp7b3B0czp0fX0scil7Y29uc3Qgbj10LnVuaWNvZGVSZWdFeHA/InUiOiIiLHtyZWdFeHA6c309dC5jb2RlLGE9cyhyLG4pO3JldHVybiBlLnNjb3BlVmFsdWUoInBhdHRlcm4iLHtrZXk6YS50b1N0cmluZygpLHJlZjphLGNvZGU6KDAsZGUuXylgJHtzLmNvZGU9PT0ibmV3IFJlZ0V4cCI/RmM6KDAsQWMudXNlRnVuYykoZSxzKX0oJHtyfSwgJHtufSlgfSl9bmUudXNlUGF0dGVybj1NYztmdW5jdGlvbiBMYyhlKXtjb25zdHtnZW46dCxkYXRhOnIsa2V5d29yZDpuLGl0OnN9PWUsYT10Lm5hbWUoInZhbGlkIik7aWYocy5hbGxFcnJvcnMpe2NvbnN0IGw9dC5sZXQoInZhbGlkIiwhMCk7cmV0dXJuIG8oKCk9PnQuYXNzaWduKGwsITEpKSxsfXJldHVybiB0LnZhcihhLCEwKSxvKCgpPT50LmJyZWFrKCkpLGE7ZnVuY3Rpb24gbyhsKXtjb25zdCBmPXQuY29uc3QoImxlbiIsKDAsZGUuXylgJHtyfS5sZW5ndGhgKTt0LmZvclJhbmdlKCJpIiwwLGYscD0+e2Uuc3Vic2NoZW1hKHtrZXl3b3JkOm4sZGF0YVByb3A6cCxkYXRhUHJvcFR5cGU6S24uVHlwZS5OdW19LGEpLHQuaWYoKDAsZGUubm90KShhKSxsKX0pfX1uZS52YWxpZGF0ZUFycmF5PUxjO2Z1bmN0aW9uIFZjKGUpe2NvbnN0e2dlbjp0LHNjaGVtYTpyLGtleXdvcmQ6bixpdDpzfT1lO2lmKCFBcnJheS5pc0FycmF5KHIpKXRocm93IG5ldyBFcnJvcigiYWp2IGltcGxlbWVudGF0aW9uIGVycm9yIik7aWYoci5zb21lKGY9PigwLEtuLmFsd2F5c1ZhbGlkU2NoZW1hKShzLGYpKSYmIXMub3B0cy51bmV2YWx1YXRlZClyZXR1cm47Y29uc3Qgbz10LmxldCgidmFsaWQiLCExKSxsPXQubmFtZSgiX3ZhbGlkIik7dC5ibG9jaygoKT0+ci5mb3JFYWNoKChmLHApPT57Y29uc3QgaT1lLnN1YnNjaGVtYSh7a2V5d29yZDpuLHNjaGVtYVByb3A6cCxjb21wb3NpdGVSdWxlOiEwfSxsKTt0LmFzc2lnbihvLCgwLGRlLl8pYCR7b30gfHwgJHtsfWApLGUubWVyZ2VWYWxpZEV2YWx1YXRlZChpLGwpfHx0LmlmKCgwLGRlLm5vdCkobykpfSkpLGUucmVzdWx0KG8sKCk9PmUucmVzZXQoKSwoKT0+ZS5lcnJvcighMCkpfW5lLnZhbGlkYXRlVW5pb249VmMsT2JqZWN0LmRlZmluZVByb3BlcnR5KFhlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxYZS52YWxpZGF0ZUtleXdvcmRVc2FnZT1YZS52YWxpZFNjaGVtYVR5cGU9WGUuZnVuY0tleXdvcmRDb2RlPVhlLm1hY3JvS2V5d29yZENvZGU9dm9pZCAwO2NvbnN0IEllPXVlLGp0PUxlLHpjPW5lLEhjPUVyO2Z1bmN0aW9uIEtjKGUsdCl7Y29uc3R7Z2VuOnIsa2V5d29yZDpuLHNjaGVtYTpzLHBhcmVudFNjaGVtYTphLGl0Om99PWUsbD10Lm1hY3JvLmNhbGwoby5zZWxmLHMsYSxvKSxmPWxhKHIsbixsKTtvLm9wdHMudmFsaWRhdGVTY2hlbWEhPT0hMSYmby5zZWxmLnZhbGlkYXRlU2NoZW1hKGwsITApO2NvbnN0IHA9ci5uYW1lKCJ2YWxpZCIpO2Uuc3Vic2NoZW1hKHtzY2hlbWE6bCxzY2hlbWFQYXRoOkllLm5pbCxlcnJTY2hlbWFQYXRoOmAke28uZXJyU2NoZW1hUGF0aH0vJHtufWAsdG9wU2NoZW1hUmVmOmYsY29tcG9zaXRlUnVsZTohMH0scCksZS5wYXNzKHAsKCk9PmUuZXJyb3IoITApKX1YZS5tYWNyb0tleXdvcmRDb2RlPUtjO2Z1bmN0aW9uIEJjKGUsdCl7dmFyIHI7Y29uc3R7Z2VuOm4sa2V5d29yZDpzLHNjaGVtYTphLHBhcmVudFNjaGVtYTpvLCRkYXRhOmwsaXQ6Zn09ZTtxYyhmLHQpO2NvbnN0IHA9IWwmJnQuY29tcGlsZT90LmNvbXBpbGUuY2FsbChmLnNlbGYsYSxvLGYpOnQudmFsaWRhdGUsaT1sYShuLHMscCksaD1uLmxldCgidmFsaWQiKTtlLmJsb2NrJGRhdGEoaCxFKSxlLm9rKChyPXQudmFsaWQpIT09bnVsbCYmciE9PXZvaWQgMD9yOmgpO2Z1bmN0aW9uIEUoKXtpZih0LmVycm9ycz09PSExKWooKSx0Lm1vZGlmeWluZyYmdWEoZSkseSgoKT0+ZS5lcnJvcigpKTtlbHNle2NvbnN0IF89dC5hc3luYz9UKCk6SSgpO3QubW9kaWZ5aW5nJiZ1YShlKSx5KCgpPT5KYyhlLF8pKX19ZnVuY3Rpb24gVCgpe2NvbnN0IF89bi5sZXQoInJ1bGVFcnJzIixudWxsKTtyZXR1cm4gbi50cnkoKCk9PmooKDAsSWUuXylgYXdhaXQgYCksYj0+bi5hc3NpZ24oaCwhMSkuaWYoKDAsSWUuXylgJHtifSBpbnN0YW5jZW9mICR7Zi5WYWxpZGF0aW9uRXJyb3J9YCwoKT0+bi5hc3NpZ24oXywoMCxJZS5fKWAke2J9LmVycm9yc2ApLCgpPT5uLnRocm93KGIpKSksX31mdW5jdGlvbiBJKCl7Y29uc3QgXz0oMCxJZS5fKWAke2l9LmVycm9yc2A7cmV0dXJuIG4uYXNzaWduKF8sbnVsbCksaihJZS5uaWwpLF99ZnVuY3Rpb24gaihfPXQuYXN5bmM/KDAsSWUuXylgYXdhaXQgYDpJZS5uaWwpe2NvbnN0IGI9Zi5vcHRzLnBhc3NDb250ZXh0P2p0LmRlZmF1bHQudGhpczpqdC5kZWZhdWx0LnNlbGYsTz0hKCJjb21waWxlImluIHQmJiFsfHx0LnNjaGVtYT09PSExKTtuLmFzc2lnbihoLCgwLEllLl8pYCR7X30keygwLHpjLmNhbGxWYWxpZGF0ZUNvZGUpKGUsaSxiLE8pfWAsdC5tb2RpZnlpbmcpfWZ1bmN0aW9uIHkoXyl7dmFyIGI7bi5pZigoMCxJZS5ub3QpKChiPXQudmFsaWQpIT09bnVsbCYmYiE9PXZvaWQgMD9iOmgpLF8pfX1YZS5mdW5jS2V5d29yZENvZGU9QmM7ZnVuY3Rpb24gdWEoZSl7Y29uc3R7Z2VuOnQsZGF0YTpyLGl0Om59PWU7dC5pZihuLnBhcmVudERhdGEsKCk9PnQuYXNzaWduKHIsKDAsSWUuXylgJHtuLnBhcmVudERhdGF9WyR7bi5wYXJlbnREYXRhUHJvcGVydHl9XWApKX1mdW5jdGlvbiBKYyhlLHQpe2NvbnN0e2dlbjpyfT1lO3IuaWYoKDAsSWUuXylgQXJyYXkuaXNBcnJheSgke3R9KWAsKCk9PntyLmFzc2lnbihqdC5kZWZhdWx0LnZFcnJvcnMsKDAsSWUuXylgJHtqdC5kZWZhdWx0LnZFcnJvcnN9ID09PSBudWxsID8gJHt0fSA6ICR7anQuZGVmYXVsdC52RXJyb3JzfS5jb25jYXQoJHt0fSlgKS5hc3NpZ24oanQuZGVmYXVsdC5lcnJvcnMsKDAsSWUuXylgJHtqdC5kZWZhdWx0LnZFcnJvcnN9Lmxlbmd0aGApLCgwLEhjLmV4dGVuZEVycm9ycykoZSl9LCgpPT5lLmVycm9yKCkpfWZ1bmN0aW9uIHFjKHtzY2hlbWFFbnY6ZX0sdCl7aWYodC5hc3luYyYmIWUuJGFzeW5jKXRocm93IG5ldyBFcnJvcigiYXN5bmMga2V5d29yZCBpbiBzeW5jIHNjaGVtYSIpfWZ1bmN0aW9uIGxhKGUsdCxyKXtpZihyPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihga2V5d29yZCAiJHt0fSIgZmFpbGVkIHRvIGNvbXBpbGVgKTtyZXR1cm4gZS5zY29wZVZhbHVlKCJrZXl3b3JkIix0eXBlb2Ygcj09ImZ1bmN0aW9uIj97cmVmOnJ9OntyZWY6cixjb2RlOigwLEllLnN0cmluZ2lmeSkocil9KX1mdW5jdGlvbiBHYyhlLHQscj0hMSl7cmV0dXJuIXQubGVuZ3RofHx0LnNvbWUobj0+bj09PSJhcnJheSI/QXJyYXkuaXNBcnJheShlKTpuPT09Im9iamVjdCI/ZSYmdHlwZW9mIGU9PSJvYmplY3QiJiYhQXJyYXkuaXNBcnJheShlKTp0eXBlb2YgZT09bnx8ciYmdHlwZW9mIGU9PSJ1bmRlZmluZWQiKX1YZS52YWxpZFNjaGVtYVR5cGU9R2M7ZnVuY3Rpb24gUWMoe3NjaGVtYTplLG9wdHM6dCxzZWxmOnIsZXJyU2NoZW1hUGF0aDpufSxzLGEpe2lmKEFycmF5LmlzQXJyYXkocy5rZXl3b3JkKT8hcy5rZXl3b3JkLmluY2x1ZGVzKGEpOnMua2V5d29yZCE9PWEpdGhyb3cgbmV3IEVycm9yKCJhanYgaW1wbGVtZW50YXRpb24gZXJyb3IiKTtjb25zdCBvPXMuZGVwZW5kZW5jaWVzO2lmKG8hPW51bGwmJm8uc29tZShsPT4hT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbCkpKXRocm93IG5ldyBFcnJvcihgcGFyZW50IHNjaGVtYSBtdXN0IGhhdmUgZGVwZW5kZW5jaWVzIG9mICR7YX06ICR7by5qb2luKCIsIil9YCk7aWYocy52YWxpZGF0ZVNjaGVtYSYmIXMudmFsaWRhdGVTY2hlbWEoZVthXSkpe2NvbnN0IGY9YGtleXdvcmQgIiR7YX0iIHZhbHVlIGlzIGludmFsaWQgYXQgcGF0aCAiJHtufSI6IGArci5lcnJvcnNUZXh0KHMudmFsaWRhdGVTY2hlbWEuZXJyb3JzKTtpZih0LnZhbGlkYXRlU2NoZW1hPT09ImxvZyIpci5sb2dnZXIuZXJyb3IoZik7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoZil9fVhlLnZhbGlkYXRlS2V5d29yZFVzYWdlPVFjO3ZhciB5dD17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoeXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHl0LmV4dGVuZFN1YnNjaGVtYU1vZGU9eXQuZXh0ZW5kU3Vic2NoZW1hRGF0YT15dC5nZXRTdWJzY2hlbWE9dm9pZCAwO2NvbnN0IFplPXVlLGZhPWJlO2Z1bmN0aW9uIFljKGUse2tleXdvcmQ6dCxzY2hlbWFQcm9wOnIsc2NoZW1hOm4sc2NoZW1hUGF0aDpzLGVyclNjaGVtYVBhdGg6YSx0b3BTY2hlbWFSZWY6b30pe2lmKHQhPT12b2lkIDAmJm4hPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKCdib3RoICJrZXl3b3JkIiBhbmQgInNjaGVtYSIgcGFzc2VkLCBvbmx5IG9uZSBhbGxvd2VkJyk7aWYodCE9PXZvaWQgMCl7Y29uc3QgbD1lLnNjaGVtYVt0XTtyZXR1cm4gcj09PXZvaWQgMD97c2NoZW1hOmwsc2NoZW1hUGF0aDooMCxaZS5fKWAke2Uuc2NoZW1hUGF0aH0keygwLFplLmdldFByb3BlcnR5KSh0KX1gLGVyclNjaGVtYVBhdGg6YCR7ZS5lcnJTY2hlbWFQYXRofS8ke3R9YH06e3NjaGVtYTpsW3JdLHNjaGVtYVBhdGg6KDAsWmUuXylgJHtlLnNjaGVtYVBhdGh9JHsoMCxaZS5nZXRQcm9wZXJ0eSkodCl9JHsoMCxaZS5nZXRQcm9wZXJ0eSkocil9YCxlcnJTY2hlbWFQYXRoOmAke2UuZXJyU2NoZW1hUGF0aH0vJHt0fS8keygwLGZhLmVzY2FwZUZyYWdtZW50KShyKX1gfX1pZihuIT09dm9pZCAwKXtpZihzPT09dm9pZCAwfHxhPT09dm9pZCAwfHxvPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcignInNjaGVtYVBhdGgiLCAiZXJyU2NoZW1hUGF0aCIgYW5kICJ0b3BTY2hlbWFSZWYiIGFyZSByZXF1aXJlZCB3aXRoICJzY2hlbWEiJyk7cmV0dXJue3NjaGVtYTpuLHNjaGVtYVBhdGg6cyx0b3BTY2hlbWFSZWY6byxlcnJTY2hlbWFQYXRoOmF9fXRocm93IG5ldyBFcnJvcignZWl0aGVyICJrZXl3b3JkIiBvciAic2NoZW1hIiBtdXN0IGJlIHBhc3NlZCcpfXl0LmdldFN1YnNjaGVtYT1ZYztmdW5jdGlvbiBXYyhlLHQse2RhdGFQcm9wOnIsZGF0YVByb3BUeXBlOm4sZGF0YTpzLGRhdGFUeXBlczphLHByb3BlcnR5TmFtZTpvfSl7aWYocyE9PXZvaWQgMCYmciE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoJ2JvdGggImRhdGEiIGFuZCAiZGF0YVByb3AiIHBhc3NlZCwgb25seSBvbmUgYWxsb3dlZCcpO2NvbnN0e2dlbjpsfT10O2lmKHIhPT12b2lkIDApe2NvbnN0e2Vycm9yUGF0aDpwLGRhdGFQYXRoQXJyOmksb3B0czpofT10LEU9bC5sZXQoImRhdGEiLCgwLFplLl8pYCR7dC5kYXRhfSR7KDAsWmUuZ2V0UHJvcGVydHkpKHIpfWAsITApO2YoRSksZS5lcnJvclBhdGg9KDAsWmUuc3RyKWAke3B9JHsoMCxmYS5nZXRFcnJvclBhdGgpKHIsbixoLmpzUHJvcGVydHlTeW50YXgpfWAsZS5wYXJlbnREYXRhUHJvcGVydHk9KDAsWmUuXylgJHtyfWAsZS5kYXRhUGF0aEFycj1bLi4uaSxlLnBhcmVudERhdGFQcm9wZXJ0eV19aWYocyE9PXZvaWQgMCl7Y29uc3QgcD1zIGluc3RhbmNlb2YgWmUuTmFtZT9zOmwubGV0KCJkYXRhIixzLCEwKTtmKHApLG8hPT12b2lkIDAmJihlLnByb3BlcnR5TmFtZT1vKX1hJiYoZS5kYXRhVHlwZXM9YSk7ZnVuY3Rpb24gZihwKXtlLmRhdGE9cCxlLmRhdGFMZXZlbD10LmRhdGFMZXZlbCsxLGUuZGF0YVR5cGVzPVtdLHQuZGVmaW5lZFByb3BlcnRpZXM9bmV3IFNldCxlLnBhcmVudERhdGE9dC5kYXRhLGUuZGF0YU5hbWVzPVsuLi50LmRhdGFOYW1lcyxwXX19eXQuZXh0ZW5kU3Vic2NoZW1hRGF0YT1XYztmdW5jdGlvbiBYYyhlLHtqdGREaXNjcmltaW5hdG9yOnQsanRkTWV0YWRhdGE6cixjb21wb3NpdGVSdWxlOm4sY3JlYXRlRXJyb3JzOnMsYWxsRXJyb3JzOmF9KXtuIT09dm9pZCAwJiYoZS5jb21wb3NpdGVSdWxlPW4pLHMhPT12b2lkIDAmJihlLmNyZWF0ZUVycm9ycz1zKSxhIT09dm9pZCAwJiYoZS5hbGxFcnJvcnM9YSksZS5qdGREaXNjcmltaW5hdG9yPXQsZS5qdGRNZXRhZGF0YT1yfXl0LmV4dGVuZFN1YnNjaGVtYU1vZGU9WGM7dmFyIFRlPXt9LFpjPWZ1bmN0aW9uIGUodCxyKXtpZih0PT09cilyZXR1cm4hMDtpZih0JiZyJiZ0eXBlb2YgdD09Im9iamVjdCImJnR5cGVvZiByPT0ib2JqZWN0Iil7aWYodC5jb25zdHJ1Y3RvciE9PXIuY29uc3RydWN0b3IpcmV0dXJuITE7dmFyIG4scyxhO2lmKEFycmF5LmlzQXJyYXkodCkpe2lmKG49dC5sZW5ndGgsbiE9ci5sZW5ndGgpcmV0dXJuITE7Zm9yKHM9bjtzLS0hPT0wOylpZighZSh0W3NdLHJbc10pKXJldHVybiExO3JldHVybiEwfWlmKHQuY29uc3RydWN0b3I9PT1SZWdFeHApcmV0dXJuIHQuc291cmNlPT09ci5zb3VyY2UmJnQuZmxhZ3M9PT1yLmZsYWdzO2lmKHQudmFsdWVPZiE9PU9iamVjdC5wcm90b3R5cGUudmFsdWVPZilyZXR1cm4gdC52YWx1ZU9mKCk9PT1yLnZhbHVlT2YoKTtpZih0LnRvU3RyaW5nIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZylyZXR1cm4gdC50b1N0cmluZygpPT09ci50b1N0cmluZygpO2lmKGE9T2JqZWN0LmtleXModCksbj1hLmxlbmd0aCxuIT09T2JqZWN0LmtleXMocikubGVuZ3RoKXJldHVybiExO2ZvcihzPW47cy0tIT09MDspaWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLGFbc10pKXJldHVybiExO2ZvcihzPW47cy0tIT09MDspe3ZhciBvPWFbc107aWYoIWUodFtvXSxyW29dKSlyZXR1cm4hMX1yZXR1cm4hMH1yZXR1cm4gdCE9PXQmJnIhPT1yfSxkYT17ZXhwb3J0czp7fX0sJHQ9ZGEuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7dHlwZW9mIHQ9PSJmdW5jdGlvbiImJihyPXQsdD17fSkscj10LmNifHxyO3ZhciBuPXR5cGVvZiByPT0iZnVuY3Rpb24iP3I6ci5wcmV8fGZ1bmN0aW9uKCl7fSxzPXIucG9zdHx8ZnVuY3Rpb24oKXt9O2FuKHQsbixzLGUsIiIsZSl9OyR0LmtleXdvcmRzPXthZGRpdGlvbmFsSXRlbXM6ITAsaXRlbXM6ITAsY29udGFpbnM6ITAsYWRkaXRpb25hbFByb3BlcnRpZXM6ITAscHJvcGVydHlOYW1lczohMCxub3Q6ITAsaWY6ITAsdGhlbjohMCxlbHNlOiEwfSwkdC5hcnJheUtleXdvcmRzPXtpdGVtczohMCxhbGxPZjohMCxhbnlPZjohMCxvbmVPZjohMH0sJHQucHJvcHNLZXl3b3Jkcz17JGRlZnM6ITAsZGVmaW5pdGlvbnM6ITAscHJvcGVydGllczohMCxwYXR0ZXJuUHJvcGVydGllczohMCxkZXBlbmRlbmNpZXM6ITB9LCR0LnNraXBLZXl3b3Jkcz17ZGVmYXVsdDohMCxlbnVtOiEwLGNvbnN0OiEwLHJlcXVpcmVkOiEwLG1heGltdW06ITAsbWluaW11bTohMCxleGNsdXNpdmVNYXhpbXVtOiEwLGV4Y2x1c2l2ZU1pbmltdW06ITAsbXVsdGlwbGVPZjohMCxtYXhMZW5ndGg6ITAsbWluTGVuZ3RoOiEwLHBhdHRlcm46ITAsZm9ybWF0OiEwLG1heEl0ZW1zOiEwLG1pbkl0ZW1zOiEwLHVuaXF1ZUl0ZW1zOiEwLG1heFByb3BlcnRpZXM6ITAsbWluUHJvcGVydGllczohMH07ZnVuY3Rpb24gYW4oZSx0LHIsbixzLGEsbyxsLGYscCl7aWYobiYmdHlwZW9mIG49PSJvYmplY3QiJiYhQXJyYXkuaXNBcnJheShuKSl7dChuLHMsYSxvLGwsZixwKTtmb3IodmFyIGkgaW4gbil7dmFyIGg9bltpXTtpZihBcnJheS5pc0FycmF5KGgpKXtpZihpIGluICR0LmFycmF5S2V5d29yZHMpZm9yKHZhciBFPTA7RTxoLmxlbmd0aDtFKyspYW4oZSx0LHIsaFtFXSxzKyIvIitpKyIvIitFLGEscyxpLG4sRSl9ZWxzZSBpZihpIGluICR0LnByb3BzS2V5d29yZHMpe2lmKGgmJnR5cGVvZiBoPT0ib2JqZWN0Iilmb3IodmFyIFQgaW4gaClhbihlLHQscixoW1RdLHMrIi8iK2krIi8iK3hjKFQpLGEscyxpLG4sVCl9ZWxzZShpIGluICR0LmtleXdvcmRzfHxlLmFsbEtleXMmJiEoaSBpbiAkdC5za2lwS2V5d29yZHMpKSYmYW4oZSx0LHIsaCxzKyIvIitpLGEscyxpLG4pfXIobixzLGEsbyxsLGYscCl9fWZ1bmN0aW9uIHhjKGUpe3JldHVybiBlLnJlcGxhY2UoL34vZywifjAiKS5yZXBsYWNlKC9cLy9nLCJ+MSIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShUZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksVGUuZ2V0U2NoZW1hUmVmcz1UZS5yZXNvbHZlVXJsPVRlLm5vcm1hbGl6ZUlkPVRlLl9nZXRGdWxsUGF0aD1UZS5nZXRGdWxsUGF0aD1UZS5pbmxpbmVSZWY9dm9pZCAwO2NvbnN0IGV1PWJlLHR1PVpjLHJ1PWRhLmV4cG9ydHMsbnU9bmV3IFNldChbInR5cGUiLCJmb3JtYXQiLCJwYXR0ZXJuIiwibWF4TGVuZ3RoIiwibWluTGVuZ3RoIiwibWF4UHJvcGVydGllcyIsIm1pblByb3BlcnRpZXMiLCJtYXhJdGVtcyIsIm1pbkl0ZW1zIiwibWF4aW11bSIsIm1pbmltdW0iLCJ1bmlxdWVJdGVtcyIsIm11bHRpcGxlT2YiLCJyZXF1aXJlZCIsImVudW0iLCJjb25zdCJdKTtmdW5jdGlvbiBzdShlLHQ9ITApe3JldHVybiB0eXBlb2YgZT09ImJvb2xlYW4iPyEwOnQ9PT0hMD8hcW4oZSk6dD9oYShlKTw9dDohMX1UZS5pbmxpbmVSZWY9c3U7Y29uc3QgYXU9bmV3IFNldChbIiRyZWYiLCIkcmVjdXJzaXZlUmVmIiwiJHJlY3Vyc2l2ZUFuY2hvciIsIiRkeW5hbWljUmVmIiwiJGR5bmFtaWNBbmNob3IiXSk7ZnVuY3Rpb24gcW4oZSl7Zm9yKGNvbnN0IHQgaW4gZSl7aWYoYXUuaGFzKHQpKXJldHVybiEwO2NvbnN0IHI9ZVt0XTtpZihBcnJheS5pc0FycmF5KHIpJiZyLnNvbWUocW4pfHx0eXBlb2Ygcj09Im9iamVjdCImJnFuKHIpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIGhhKGUpe2xldCB0PTA7Zm9yKGNvbnN0IHIgaW4gZSl7aWYocj09PSIkcmVmIilyZXR1cm4gMS8wO2lmKHQrKywhbnUuaGFzKHIpJiYodHlwZW9mIGVbcl09PSJvYmplY3QiJiYoMCxldS5lYWNoSXRlbSkoZVtyXSxuPT50Kz1oYShuKSksdD09PTEvMCkpcmV0dXJuIDEvMH1yZXR1cm4gdH1mdW5jdGlvbiBwYShlLHQ9IiIscil7ciE9PSExJiYodD1ucih0KSk7Y29uc3Qgbj1lLnBhcnNlKHQpO3JldHVybiBtYShlLG4pfVRlLmdldEZ1bGxQYXRoPXBhO2Z1bmN0aW9uIG1hKGUsdCl7cmV0dXJuIGUuc2VyaWFsaXplKHQpLnNwbGl0KCIjIilbMF0rIiMifVRlLl9nZXRGdWxsUGF0aD1tYTtjb25zdCBvdT0vI1wvPyQvO2Z1bmN0aW9uIG5yKGUpe3JldHVybiBlP2UucmVwbGFjZShvdSwiIik6IiJ9VGUubm9ybWFsaXplSWQ9bnI7ZnVuY3Rpb24gaXUoZSx0LHIpe3JldHVybiByPW5yKHIpLGUucmVzb2x2ZSh0LHIpfVRlLnJlc29sdmVVcmw9aXU7Y29uc3QgY3U9L15bYS16X11bLWEtejAtOS5fXSokL2k7ZnVuY3Rpb24gdXUoZSx0KXtpZih0eXBlb2YgZT09ImJvb2xlYW4iKXJldHVybnt9O2NvbnN0e3NjaGVtYUlkOnIsdXJpUmVzb2x2ZXI6bn09dGhpcy5vcHRzLHM9bnIoZVtyXXx8dCksYT17IiI6c30sbz1wYShuLHMsITEpLGw9e30sZj1uZXcgU2V0O3JldHVybiBydShlLHthbGxLZXlzOiEwfSwoaCxFLFQsSSk9PntpZihJPT09dm9pZCAwKXJldHVybjtjb25zdCBqPW8rRTtsZXQgeT1hW0ldO3R5cGVvZiBoW3JdPT0ic3RyaW5nIiYmKHk9Xy5jYWxsKHRoaXMsaFtyXSkpLGIuY2FsbCh0aGlzLGguJGFuY2hvciksYi5jYWxsKHRoaXMsaC4kZHluYW1pY0FuY2hvciksYVtFXT15O2Z1bmN0aW9uIF8oTyl7Y29uc3QgQT10aGlzLm9wdHMudXJpUmVzb2x2ZXIucmVzb2x2ZTtpZihPPW5yKHk/QSh5LE8pOk8pLGYuaGFzKE8pKXRocm93IGkoTyk7Zi5hZGQoTyk7bGV0IEg9dGhpcy5yZWZzW09dO3JldHVybiB0eXBlb2YgSD09InN0cmluZyImJihIPXRoaXMucmVmc1tIXSksdHlwZW9mIEg9PSJvYmplY3QiP3AoaCxILnNjaGVtYSxPKTpPIT09bnIoaikmJihPWzBdPT09IiMiPyhwKGgsbFtPXSxPKSxsW09dPWgpOnRoaXMucmVmc1tPXT1qKSxPfWZ1bmN0aW9uIGIoTyl7aWYodHlwZW9mIE89PSJzdHJpbmciKXtpZighY3UudGVzdChPKSl0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgYW5jaG9yICIke099ImApO18uY2FsbCh0aGlzLGAjJHtPfWApfX19KSxsO2Z1bmN0aW9uIHAoaCxFLFQpe2lmKEUhPT12b2lkIDAmJiF0dShoLEUpKXRocm93IGkoVCl9ZnVuY3Rpb24gaShoKXtyZXR1cm4gbmV3IEVycm9yKGByZWZlcmVuY2UgIiR7aH0iIHJlc29sdmVzIHRvIG1vcmUgdGhhbiBvbmUgc2NoZW1hYCl9fVRlLmdldFNjaGVtYVJlZnM9dXUsT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxXZS5nZXREYXRhPVdlLktleXdvcmRDeHQ9V2UudmFsaWRhdGVGdW5jdGlvbkNvZGU9dm9pZCAwO2NvbnN0IHZhPXRyLF9hPW5uLEduPWx0LG9uPW5uLGx1PXNuLCRyPVhlLFFuPXl0LE09dWUsSj1MZSxmdT1UZSxmdD1iZSx3cj1FcjtmdW5jdGlvbiBkdShlKXtpZigkYShlKSYmKHdhKGUpLHlhKGUpKSl7bXUoZSk7cmV0dXJufWdhKGUsKCk9PigwLHZhLnRvcEJvb2xPckVtcHR5U2NoZW1hKShlKSl9V2UudmFsaWRhdGVGdW5jdGlvbkNvZGU9ZHU7ZnVuY3Rpb24gZ2Eoe2dlbjplLHZhbGlkYXRlTmFtZTp0LHNjaGVtYTpyLHNjaGVtYUVudjpuLG9wdHM6c30sYSl7cy5jb2RlLmVzNT9lLmZ1bmModCwoMCxNLl8pYCR7Si5kZWZhdWx0LmRhdGF9LCAke0ouZGVmYXVsdC52YWxDeHR9YCxuLiRhc3luYywoKT0+e2UuY29kZSgoMCxNLl8pYCJ1c2Ugc3RyaWN0IjsgJHtFYShyLHMpfWApLHB1KGUscyksZS5jb2RlKGEpfSk6ZS5mdW5jKHQsKDAsTS5fKWAke0ouZGVmYXVsdC5kYXRhfSwgJHtodShzKX1gLG4uJGFzeW5jLCgpPT5lLmNvZGUoRWEocixzKSkuY29kZShhKSl9ZnVuY3Rpb24gaHUoZSl7cmV0dXJuKDAsTS5fKWB7JHtKLmRlZmF1bHQuaW5zdGFuY2VQYXRofT0iIiwgJHtKLmRlZmF1bHQucGFyZW50RGF0YX0sICR7Si5kZWZhdWx0LnBhcmVudERhdGFQcm9wZXJ0eX0sICR7Si5kZWZhdWx0LnJvb3REYXRhfT0ke0ouZGVmYXVsdC5kYXRhfSR7ZS5keW5hbWljUmVmPygwLE0uXylgLCAke0ouZGVmYXVsdC5keW5hbWljQW5jaG9yc309e31gOk0ubmlsfX09e31gfWZ1bmN0aW9uIHB1KGUsdCl7ZS5pZihKLmRlZmF1bHQudmFsQ3h0LCgpPT57ZS52YXIoSi5kZWZhdWx0Lmluc3RhbmNlUGF0aCwoMCxNLl8pYCR7Si5kZWZhdWx0LnZhbEN4dH0uJHtKLmRlZmF1bHQuaW5zdGFuY2VQYXRofWApLGUudmFyKEouZGVmYXVsdC5wYXJlbnREYXRhLCgwLE0uXylgJHtKLmRlZmF1bHQudmFsQ3h0fS4ke0ouZGVmYXVsdC5wYXJlbnREYXRhfWApLGUudmFyKEouZGVmYXVsdC5wYXJlbnREYXRhUHJvcGVydHksKDAsTS5fKWAke0ouZGVmYXVsdC52YWxDeHR9LiR7Si5kZWZhdWx0LnBhcmVudERhdGFQcm9wZXJ0eX1gKSxlLnZhcihKLmRlZmF1bHQucm9vdERhdGEsKDAsTS5fKWAke0ouZGVmYXVsdC52YWxDeHR9LiR7Si5kZWZhdWx0LnJvb3REYXRhfWApLHQuZHluYW1pY1JlZiYmZS52YXIoSi5kZWZhdWx0LmR5bmFtaWNBbmNob3JzLCgwLE0uXylgJHtKLmRlZmF1bHQudmFsQ3h0fS4ke0ouZGVmYXVsdC5keW5hbWljQW5jaG9yc31gKX0sKCk9PntlLnZhcihKLmRlZmF1bHQuaW5zdGFuY2VQYXRoLCgwLE0uXylgIiJgKSxlLnZhcihKLmRlZmF1bHQucGFyZW50RGF0YSwoMCxNLl8pYHVuZGVmaW5lZGApLGUudmFyKEouZGVmYXVsdC5wYXJlbnREYXRhUHJvcGVydHksKDAsTS5fKWB1bmRlZmluZWRgKSxlLnZhcihKLmRlZmF1bHQucm9vdERhdGEsSi5kZWZhdWx0LmRhdGEpLHQuZHluYW1pY1JlZiYmZS52YXIoSi5kZWZhdWx0LmR5bmFtaWNBbmNob3JzLCgwLE0uXylge31gKX0pfWZ1bmN0aW9uIG11KGUpe2NvbnN0e3NjaGVtYTp0LG9wdHM6cixnZW46bn09ZTtnYShlLCgpPT57ci4kY29tbWVudCYmdC4kY29tbWVudCYmUmEoZSkseXUoZSksbi5sZXQoSi5kZWZhdWx0LnZFcnJvcnMsbnVsbCksbi5sZXQoSi5kZWZhdWx0LmVycm9ycywwKSxyLnVuZXZhbHVhdGVkJiZ2dShlKSxTYShlKSxTdShlKX0pfWZ1bmN0aW9uIHZ1KGUpe2NvbnN0e2dlbjp0LHZhbGlkYXRlTmFtZTpyfT1lO2UuZXZhbHVhdGVkPXQuY29uc3QoImV2YWx1YXRlZCIsKDAsTS5fKWAke3J9LmV2YWx1YXRlZGApLHQuaWYoKDAsTS5fKWAke2UuZXZhbHVhdGVkfS5keW5hbWljUHJvcHNgLCgpPT50LmFzc2lnbigoMCxNLl8pYCR7ZS5ldmFsdWF0ZWR9LnByb3BzYCwoMCxNLl8pYHVuZGVmaW5lZGApKSx0LmlmKCgwLE0uXylgJHtlLmV2YWx1YXRlZH0uZHluYW1pY0l0ZW1zYCwoKT0+dC5hc3NpZ24oKDAsTS5fKWAke2UuZXZhbHVhdGVkfS5pdGVtc2AsKDAsTS5fKWB1bmRlZmluZWRgKSl9ZnVuY3Rpb24gRWEoZSx0KXtjb25zdCByPXR5cGVvZiBlPT0ib2JqZWN0IiYmZVt0LnNjaGVtYUlkXTtyZXR1cm4gciYmKHQuY29kZS5zb3VyY2V8fHQuY29kZS5wcm9jZXNzKT8oMCxNLl8pYC8qIyBzb3VyY2VVUkw9JHtyfSAqL2A6TS5uaWx9ZnVuY3Rpb24gX3UoZSx0KXtpZigkYShlKSYmKHdhKGUpLHlhKGUpKSl7Z3UoZSx0KTtyZXR1cm59KDAsdmEuYm9vbE9yRW1wdHlTY2hlbWEpKGUsdCl9ZnVuY3Rpb24geWEoe3NjaGVtYTplLHNlbGY6dH0pe2lmKHR5cGVvZiBlPT0iYm9vbGVhbiIpcmV0dXJuIWU7Zm9yKGNvbnN0IHIgaW4gZSlpZih0LlJVTEVTLmFsbFtyXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiAkYShlKXtyZXR1cm4gdHlwZW9mIGUuc2NoZW1hIT0iYm9vbGVhbiJ9ZnVuY3Rpb24gZ3UoZSx0KXtjb25zdHtzY2hlbWE6cixnZW46bixvcHRzOnN9PWU7cy4kY29tbWVudCYmci4kY29tbWVudCYmUmEoZSksJHUoZSksd3UoZSk7Y29uc3QgYT1uLmNvbnN0KCJfZXJycyIsSi5kZWZhdWx0LmVycm9ycyk7U2EoZSxhKSxuLnZhcih0LCgwLE0uXylgJHthfSA9PT0gJHtKLmRlZmF1bHQuZXJyb3JzfWApfWZ1bmN0aW9uIHdhKGUpeygwLGZ0LmNoZWNrVW5rbm93blJ1bGVzKShlKSxFdShlKX1mdW5jdGlvbiBTYShlLHQpe2lmKGUub3B0cy5qdGQpcmV0dXJuIGJhKGUsW10sITEsdCk7Y29uc3Qgcj0oMCxfYS5nZXRTY2hlbWFUeXBlcykoZS5zY2hlbWEpLG49KDAsX2EuY29lcmNlQW5kQ2hlY2tEYXRhVHlwZSkoZSxyKTtiYShlLHIsIW4sdCl9ZnVuY3Rpb24gRXUoZSl7Y29uc3R7c2NoZW1hOnQsZXJyU2NoZW1hUGF0aDpyLG9wdHM6bixzZWxmOnN9PWU7dC4kcmVmJiZuLmlnbm9yZUtleXdvcmRzV2l0aFJlZiYmKDAsZnQuc2NoZW1hSGFzUnVsZXNCdXRSZWYpKHQscy5SVUxFUykmJnMubG9nZ2VyLndhcm4oYCRyZWY6IGtleXdvcmRzIGlnbm9yZWQgaW4gc2NoZW1hIGF0IHBhdGggIiR7cn0iYCl9ZnVuY3Rpb24geXUoZSl7Y29uc3R7c2NoZW1hOnQsb3B0czpyfT1lO3QuZGVmYXVsdCE9PXZvaWQgMCYmci51c2VEZWZhdWx0cyYmci5zdHJpY3RTY2hlbWEmJigwLGZ0LmNoZWNrU3RyaWN0TW9kZSkoZSwiZGVmYXVsdCBpcyBpZ25vcmVkIGluIHRoZSBzY2hlbWEgcm9vdCIpfWZ1bmN0aW9uICR1KGUpe2NvbnN0IHQ9ZS5zY2hlbWFbZS5vcHRzLnNjaGVtYUlkXTt0JiYoZS5iYXNlSWQ9KDAsZnUucmVzb2x2ZVVybCkoZS5vcHRzLnVyaVJlc29sdmVyLGUuYmFzZUlkLHQpKX1mdW5jdGlvbiB3dShlKXtpZihlLnNjaGVtYS4kYXN5bmMmJiFlLnNjaGVtYUVudi4kYXN5bmMpdGhyb3cgbmV3IEVycm9yKCJhc3luYyBzY2hlbWEgaW4gc3luYyBzY2hlbWEiKX1mdW5jdGlvbiBSYSh7Z2VuOmUsc2NoZW1hRW52OnQsc2NoZW1hOnIsZXJyU2NoZW1hUGF0aDpuLG9wdHM6c30pe2NvbnN0IGE9ci4kY29tbWVudDtpZihzLiRjb21tZW50PT09ITApZS5jb2RlKCgwLE0uXylgJHtKLmRlZmF1bHQuc2VsZn0ubG9nZ2VyLmxvZygke2F9KWApO2Vsc2UgaWYodHlwZW9mIHMuJGNvbW1lbnQ9PSJmdW5jdGlvbiIpe2NvbnN0IG89KDAsTS5zdHIpYCR7bn0vJGNvbW1lbnRgLGw9ZS5zY29wZVZhbHVlKCJyb290Iix7cmVmOnQucm9vdH0pO2UuY29kZSgoMCxNLl8pYCR7Si5kZWZhdWx0LnNlbGZ9Lm9wdHMuJGNvbW1lbnQoJHthfSwgJHtvfSwgJHtsfS5zY2hlbWEpYCl9fWZ1bmN0aW9uIFN1KGUpe2NvbnN0e2dlbjp0LHNjaGVtYUVudjpyLHZhbGlkYXRlTmFtZTpuLFZhbGlkYXRpb25FcnJvcjpzLG9wdHM6YX09ZTtyLiRhc3luYz90LmlmKCgwLE0uXylgJHtKLmRlZmF1bHQuZXJyb3JzfSA9PT0gMGAsKCk9PnQucmV0dXJuKEouZGVmYXVsdC5kYXRhKSwoKT0+dC50aHJvdygoMCxNLl8pYG5ldyAke3N9KCR7Si5kZWZhdWx0LnZFcnJvcnN9KWApKToodC5hc3NpZ24oKDAsTS5fKWAke259LmVycm9yc2AsSi5kZWZhdWx0LnZFcnJvcnMpLGEudW5ldmFsdWF0ZWQmJlJ1KGUpLHQucmV0dXJuKCgwLE0uXylgJHtKLmRlZmF1bHQuZXJyb3JzfSA9PT0gMGApKX1mdW5jdGlvbiBSdSh7Z2VuOmUsZXZhbHVhdGVkOnQscHJvcHM6cixpdGVtczpufSl7ciBpbnN0YW5jZW9mIE0uTmFtZSYmZS5hc3NpZ24oKDAsTS5fKWAke3R9LnByb3BzYCxyKSxuIGluc3RhbmNlb2YgTS5OYW1lJiZlLmFzc2lnbigoMCxNLl8pYCR7dH0uaXRlbXNgLG4pfWZ1bmN0aW9uIGJhKGUsdCxyLG4pe2NvbnN0e2dlbjpzLHNjaGVtYTphLGRhdGE6byxhbGxFcnJvcnM6bCxvcHRzOmYsc2VsZjpwfT1lLHtSVUxFUzppfT1wO2lmKGEuJHJlZiYmKGYuaWdub3JlS2V5d29yZHNXaXRoUmVmfHwhKDAsZnQuc2NoZW1hSGFzUnVsZXNCdXRSZWYpKGEsaSkpKXtzLmJsb2NrKCgpPT5UYShlLCIkcmVmIixpLmFsbC4kcmVmLmRlZmluaXRpb24pKTtyZXR1cm59Zi5qdGR8fGJ1KGUsdCkscy5ibG9jaygoKT0+e2Zvcihjb25zdCBFIG9mIGkucnVsZXMpaChFKTtoKGkucG9zdCl9KTtmdW5jdGlvbiBoKEUpeyEoMCxHbi5zaG91bGRVc2VHcm91cCkoYSxFKXx8KEUudHlwZT8ocy5pZigoMCxvbi5jaGVja0RhdGFUeXBlKShFLnR5cGUsbyxmLnN0cmljdE51bWJlcnMpKSxPYShlLEUpLHQubGVuZ3RoPT09MSYmdFswXT09PUUudHlwZSYmciYmKHMuZWxzZSgpLCgwLG9uLnJlcG9ydFR5cGVFcnJvcikoZSkpLHMuZW5kSWYoKSk6T2EoZSxFKSxsfHxzLmlmKCgwLE0uXylgJHtKLmRlZmF1bHQuZXJyb3JzfSA9PT0gJHtufHwwfWApKX19ZnVuY3Rpb24gT2EoZSx0KXtjb25zdHtnZW46cixzY2hlbWE6bixvcHRzOnt1c2VEZWZhdWx0czpzfX09ZTtzJiYoMCxsdS5hc3NpZ25EZWZhdWx0cykoZSx0LnR5cGUpLHIuYmxvY2soKCk9Pntmb3IoY29uc3QgYSBvZiB0LnJ1bGVzKSgwLEduLnNob3VsZFVzZVJ1bGUpKG4sYSkmJlRhKGUsYS5rZXl3b3JkLGEuZGVmaW5pdGlvbix0LnR5cGUpfSl9ZnVuY3Rpb24gYnUoZSx0KXtlLnNjaGVtYUVudi5tZXRhfHwhZS5vcHRzLnN0cmljdFR5cGVzfHwoT3UoZSx0KSxlLm9wdHMuYWxsb3dVbmlvblR5cGVzfHxOdShlLHQpLFB1KGUsZS5kYXRhVHlwZXMpKX1mdW5jdGlvbiBPdShlLHQpe2lmKCEhdC5sZW5ndGgpe2lmKCFlLmRhdGFUeXBlcy5sZW5ndGgpe2UuZGF0YVR5cGVzPXQ7cmV0dXJufXQuZm9yRWFjaChyPT57TmEoZS5kYXRhVHlwZXMscil8fFluKGUsYHR5cGUgIiR7cn0iIG5vdCBhbGxvd2VkIGJ5IGNvbnRleHQgIiR7ZS5kYXRhVHlwZXMuam9pbigiLCIpfSJgKX0pLGUuZGF0YVR5cGVzPWUuZGF0YVR5cGVzLmZpbHRlcihyPT5OYSh0LHIpKX19ZnVuY3Rpb24gTnUoZSx0KXt0Lmxlbmd0aD4xJiYhKHQubGVuZ3RoPT09MiYmdC5pbmNsdWRlcygibnVsbCIpKSYmWW4oZSwidXNlIGFsbG93VW5pb25UeXBlcyB0byBhbGxvdyB1bmlvbiB0eXBlIGtleXdvcmQiKX1mdW5jdGlvbiBQdShlLHQpe2NvbnN0IHI9ZS5zZWxmLlJVTEVTLmFsbDtmb3IoY29uc3QgbiBpbiByKXtjb25zdCBzPXJbbl07aWYodHlwZW9mIHM9PSJvYmplY3QiJiYoMCxHbi5zaG91bGRVc2VSdWxlKShlLnNjaGVtYSxzKSl7Y29uc3R7dHlwZTphfT1zLmRlZmluaXRpb247YS5sZW5ndGgmJiFhLnNvbWUobz0+VHUodCxvKSkmJlluKGUsYG1pc3NpbmcgdHlwZSAiJHthLmpvaW4oIiwiKX0iIGZvciBrZXl3b3JkICIke259ImApfX19ZnVuY3Rpb24gVHUoZSx0KXtyZXR1cm4gZS5pbmNsdWRlcyh0KXx8dD09PSJudW1iZXIiJiZlLmluY2x1ZGVzKCJpbnRlZ2VyIil9ZnVuY3Rpb24gTmEoZSx0KXtyZXR1cm4gZS5pbmNsdWRlcyh0KXx8dD09PSJpbnRlZ2VyIiYmZS5pbmNsdWRlcygibnVtYmVyIil9ZnVuY3Rpb24gWW4oZSx0KXt0Kz1gIGF0ICIke2Uuc2NoZW1hRW52LmJhc2VJZCtlLmVyclNjaGVtYVBhdGh9IiAoc3RyaWN0VHlwZXMpYCwoMCxmdC5jaGVja1N0cmljdE1vZGUpKGUsdCxlLm9wdHMuc3RyaWN0VHlwZXMpfWNsYXNzIFBhe2NvbnN0cnVjdG9yKHQscixuKXtpZigoMCwkci52YWxpZGF0ZUtleXdvcmRVc2FnZSkodCxyLG4pLHRoaXMuZ2VuPXQuZ2VuLHRoaXMuYWxsRXJyb3JzPXQuYWxsRXJyb3JzLHRoaXMua2V5d29yZD1uLHRoaXMuZGF0YT10LmRhdGEsdGhpcy5zY2hlbWE9dC5zY2hlbWFbbl0sdGhpcy4kZGF0YT1yLiRkYXRhJiZ0Lm9wdHMuJGRhdGEmJnRoaXMuc2NoZW1hJiZ0aGlzLnNjaGVtYS4kZGF0YSx0aGlzLnNjaGVtYVZhbHVlPSgwLGZ0LnNjaGVtYVJlZk9yVmFsKSh0LHRoaXMuc2NoZW1hLG4sdGhpcy4kZGF0YSksdGhpcy5zY2hlbWFUeXBlPXIuc2NoZW1hVHlwZSx0aGlzLnBhcmVudFNjaGVtYT10LnNjaGVtYSx0aGlzLnBhcmFtcz17fSx0aGlzLml0PXQsdGhpcy5kZWY9cix0aGlzLiRkYXRhKXRoaXMuc2NoZW1hQ29kZT10Lmdlbi5jb25zdCgidlNjaGVtYSIsQWEodGhpcy4kZGF0YSx0KSk7ZWxzZSBpZih0aGlzLnNjaGVtYUNvZGU9dGhpcy5zY2hlbWFWYWx1ZSwhKDAsJHIudmFsaWRTY2hlbWFUeXBlKSh0aGlzLnNjaGVtYSxyLnNjaGVtYVR5cGUsci5hbGxvd1VuZGVmaW5lZCkpdGhyb3cgbmV3IEVycm9yKGAke259IHZhbHVlIG11c3QgYmUgJHtKU09OLnN0cmluZ2lmeShyLnNjaGVtYVR5cGUpfWApOygiY29kZSJpbiByP3IudHJhY2tFcnJvcnM6ci5lcnJvcnMhPT0hMSkmJih0aGlzLmVycnNDb3VudD10Lmdlbi5jb25zdCgiX2VycnMiLEouZGVmYXVsdC5lcnJvcnMpKX1yZXN1bHQodCxyLG4pe3RoaXMuZmFpbFJlc3VsdCgoMCxNLm5vdCkodCkscixuKX1mYWlsUmVzdWx0KHQscixuKXt0aGlzLmdlbi5pZih0KSxuP24oKTp0aGlzLmVycm9yKCkscj8odGhpcy5nZW4uZWxzZSgpLHIoKSx0aGlzLmFsbEVycm9ycyYmdGhpcy5nZW4uZW5kSWYoKSk6dGhpcy5hbGxFcnJvcnM/dGhpcy5nZW4uZW5kSWYoKTp0aGlzLmdlbi5lbHNlKCl9cGFzcyh0LHIpe3RoaXMuZmFpbFJlc3VsdCgoMCxNLm5vdCkodCksdm9pZCAwLHIpfWZhaWwodCl7aWYodD09PXZvaWQgMCl7dGhpcy5lcnJvcigpLHRoaXMuYWxsRXJyb3JzfHx0aGlzLmdlbi5pZighMSk7cmV0dXJufXRoaXMuZ2VuLmlmKHQpLHRoaXMuZXJyb3IoKSx0aGlzLmFsbEVycm9ycz90aGlzLmdlbi5lbmRJZigpOnRoaXMuZ2VuLmVsc2UoKX1mYWlsJGRhdGEodCl7aWYoIXRoaXMuJGRhdGEpcmV0dXJuIHRoaXMuZmFpbCh0KTtjb25zdHtzY2hlbWFDb2RlOnJ9PXRoaXM7dGhpcy5mYWlsKCgwLE0uXylgJHtyfSAhPT0gdW5kZWZpbmVkICYmICgkeygwLE0ub3IpKHRoaXMuaW52YWxpZCRkYXRhKCksdCl9KWApfWVycm9yKHQscixuKXtpZihyKXt0aGlzLnNldFBhcmFtcyhyKSx0aGlzLl9lcnJvcih0LG4pLHRoaXMuc2V0UGFyYW1zKHt9KTtyZXR1cm59dGhpcy5fZXJyb3IodCxuKX1fZXJyb3IodCxyKXsodD93ci5yZXBvcnRFeHRyYUVycm9yOndyLnJlcG9ydEVycm9yKSh0aGlzLHRoaXMuZGVmLmVycm9yLHIpfSRkYXRhRXJyb3IoKXsoMCx3ci5yZXBvcnRFcnJvcikodGhpcyx0aGlzLmRlZi4kZGF0YUVycm9yfHx3ci5rZXl3b3JkJERhdGFFcnJvcil9cmVzZXQoKXtpZih0aGlzLmVycnNDb3VudD09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoJ2FkZCAidHJhY2tFcnJvcnMiIHRvIGtleXdvcmQgZGVmaW5pdGlvbicpOygwLHdyLnJlc2V0RXJyb3JzQ291bnQpKHRoaXMuZ2VuLHRoaXMuZXJyc0NvdW50KX1vayh0KXt0aGlzLmFsbEVycm9yc3x8dGhpcy5nZW4uaWYodCl9c2V0UGFyYW1zKHQscil7cj9PYmplY3QuYXNzaWduKHRoaXMucGFyYW1zLHQpOnRoaXMucGFyYW1zPXR9YmxvY2skZGF0YSh0LHIsbj1NLm5pbCl7dGhpcy5nZW4uYmxvY2soKCk9Pnt0aGlzLmNoZWNrJGRhdGEodCxuKSxyKCl9KX1jaGVjayRkYXRhKHQ9TS5uaWwscj1NLm5pbCl7aWYoIXRoaXMuJGRhdGEpcmV0dXJuO2NvbnN0e2dlbjpuLHNjaGVtYUNvZGU6cyxzY2hlbWFUeXBlOmEsZGVmOm99PXRoaXM7bi5pZigoMCxNLm9yKSgoMCxNLl8pYCR7c30gPT09IHVuZGVmaW5lZGAscikpLHQhPT1NLm5pbCYmbi5hc3NpZ24odCwhMCksKGEubGVuZ3RofHxvLnZhbGlkYXRlU2NoZW1hKSYmKG4uZWxzZUlmKHRoaXMuaW52YWxpZCRkYXRhKCkpLHRoaXMuJGRhdGFFcnJvcigpLHQhPT1NLm5pbCYmbi5hc3NpZ24odCwhMSkpLG4uZWxzZSgpfWludmFsaWQkZGF0YSgpe2NvbnN0e2dlbjp0LHNjaGVtYUNvZGU6cixzY2hlbWFUeXBlOm4sZGVmOnMsaXQ6YX09dGhpcztyZXR1cm4oMCxNLm9yKShvKCksbCgpKTtmdW5jdGlvbiBvKCl7aWYobi5sZW5ndGgpe2lmKCEociBpbnN0YW5jZW9mIE0uTmFtZSkpdGhyb3cgbmV3IEVycm9yKCJhanYgaW1wbGVtZW50YXRpb24gZXJyb3IiKTtjb25zdCBmPUFycmF5LmlzQXJyYXkobik/bjpbbl07cmV0dXJuKDAsTS5fKWAkeygwLG9uLmNoZWNrRGF0YVR5cGVzKShmLHIsYS5vcHRzLnN0cmljdE51bWJlcnMsb24uRGF0YVR5cGUuV3JvbmcpfWB9cmV0dXJuIE0ubmlsfWZ1bmN0aW9uIGwoKXtpZihzLnZhbGlkYXRlU2NoZW1hKXtjb25zdCBmPXQuc2NvcGVWYWx1ZSgidmFsaWRhdGUkZGF0YSIse3JlZjpzLnZhbGlkYXRlU2NoZW1hfSk7cmV0dXJuKDAsTS5fKWAhJHtmfSgke3J9KWB9cmV0dXJuIE0ubmlsfX1zdWJzY2hlbWEodCxyKXtjb25zdCBuPSgwLFFuLmdldFN1YnNjaGVtYSkodGhpcy5pdCx0KTsoMCxRbi5leHRlbmRTdWJzY2hlbWFEYXRhKShuLHRoaXMuaXQsdCksKDAsUW4uZXh0ZW5kU3Vic2NoZW1hTW9kZSkobix0KTtjb25zdCBzPWxlKFEoUSh7fSx0aGlzLml0KSxuKSx7aXRlbXM6dm9pZCAwLHByb3BzOnZvaWQgMH0pO3JldHVybiBfdShzLHIpLHN9bWVyZ2VFdmFsdWF0ZWQodCxyKXtjb25zdHtpdDpuLGdlbjpzfT10aGlzOyFuLm9wdHMudW5ldmFsdWF0ZWR8fChuLnByb3BzIT09ITAmJnQucHJvcHMhPT12b2lkIDAmJihuLnByb3BzPWZ0Lm1lcmdlRXZhbHVhdGVkLnByb3BzKHMsdC5wcm9wcyxuLnByb3BzLHIpKSxuLml0ZW1zIT09ITAmJnQuaXRlbXMhPT12b2lkIDAmJihuLml0ZW1zPWZ0Lm1lcmdlRXZhbHVhdGVkLml0ZW1zKHMsdC5pdGVtcyxuLml0ZW1zLHIpKSl9bWVyZ2VWYWxpZEV2YWx1YXRlZCh0LHIpe2NvbnN0e2l0Om4sZ2VuOnN9PXRoaXM7aWYobi5vcHRzLnVuZXZhbHVhdGVkJiYobi5wcm9wcyE9PSEwfHxuLml0ZW1zIT09ITApKXJldHVybiBzLmlmKHIsKCk9PnRoaXMubWVyZ2VFdmFsdWF0ZWQodCxNLk5hbWUpKSwhMH19V2UuS2V5d29yZEN4dD1QYTtmdW5jdGlvbiBUYShlLHQscixuKXtjb25zdCBzPW5ldyBQYShlLHIsdCk7ImNvZGUiaW4gcj9yLmNvZGUocyxuKTpzLiRkYXRhJiZyLnZhbGlkYXRlPygwLCRyLmZ1bmNLZXl3b3JkQ29kZSkocyxyKToibWFjcm8iaW4gcj8oMCwkci5tYWNyb0tleXdvcmRDb2RlKShzLHIpOihyLmNvbXBpbGV8fHIudmFsaWRhdGUpJiYoMCwkci5mdW5jS2V5d29yZENvZGUpKHMscil9Y29uc3QgQXU9L15cLyg/Oltefl18fjB8fjEpKiQvLEN1PS9eKFswLTldKykoI3xcLyg/Oltefl18fjB8fjEpKik/JC87ZnVuY3Rpb24gQWEoZSx7ZGF0YUxldmVsOnQsZGF0YU5hbWVzOnIsZGF0YVBhdGhBcnI6bn0pe2xldCBzLGE7aWYoZT09PSIiKXJldHVybiBKLmRlZmF1bHQucm9vdERhdGE7aWYoZVswXT09PSIvIil7aWYoIUF1LnRlc3QoZSkpdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEpTT04tcG9pbnRlcjogJHtlfWApO3M9ZSxhPUouZGVmYXVsdC5yb290RGF0YX1lbHNle2NvbnN0IHA9Q3UuZXhlYyhlKTtpZighcCl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgSlNPTi1wb2ludGVyOiAke2V9YCk7Y29uc3QgaT0rcFsxXTtpZihzPXBbMl0scz09PSIjIil7aWYoaT49dCl0aHJvdyBuZXcgRXJyb3IoZigicHJvcGVydHkvaW5kZXgiLGkpKTtyZXR1cm4gblt0LWldfWlmKGk+dCl0aHJvdyBuZXcgRXJyb3IoZigiZGF0YSIsaSkpO2lmKGE9clt0LWldLCFzKXJldHVybiBhfWxldCBvPWE7Y29uc3QgbD1zLnNwbGl0KCIvIik7Zm9yKGNvbnN0IHAgb2YgbClwJiYoYT0oMCxNLl8pYCR7YX0keygwLE0uZ2V0UHJvcGVydHkpKCgwLGZ0LnVuZXNjYXBlSnNvblBvaW50ZXIpKHApKX1gLG89KDAsTS5fKWAke299ICYmICR7YX1gKTtyZXR1cm4gbztmdW5jdGlvbiBmKHAsaSl7cmV0dXJuYENhbm5vdCBhY2Nlc3MgJHtwfSAke2l9IGxldmVscyB1cCwgY3VycmVudCBsZXZlbCBpcyAke3R9YH19V2UuZ2V0RGF0YT1BYTt2YXIgY249e307T2JqZWN0LmRlZmluZVByb3BlcnR5KGNuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjbGFzcyBJdSBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQpe3N1cGVyKCJ2YWxpZGF0aW9uIGZhaWxlZCIpLHRoaXMuZXJyb3JzPXQsdGhpcy5hanY9dGhpcy52YWxpZGF0aW9uPSEwfX1jbi5kZWZhdWx0PUl1O3ZhciBrdD17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoa3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2NvbnN0IFduPVRlO2NsYXNzIER1IGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCxyLG4scyl7c3VwZXIoc3x8YGNhbid0IHJlc29sdmUgcmVmZXJlbmNlICR7bn0gZnJvbSBpZCAke3J9YCksdGhpcy5taXNzaW5nUmVmPSgwLFduLnJlc29sdmVVcmwpKHQscixuKSx0aGlzLm1pc3NpbmdTY2hlbWE9KDAsV24ubm9ybWFsaXplSWQpKCgwLFduLmdldEZ1bGxQYXRoKSh0LHRoaXMubWlzc2luZ1JlZikpfX1rdC5kZWZhdWx0PUR1O3ZhciBDZT17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQ2UsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLENlLnJlc29sdmVTY2hlbWE9Q2UuZ2V0Q29tcGlsaW5nU2NoZW1hPUNlLnJlc29sdmVSZWY9Q2UuY29tcGlsZVNjaGVtYT1DZS5TY2hlbWFFbnY9dm9pZCAwO2NvbnN0IFFlPXVlLGp1PWNuLFV0PUxlLFllPVRlLENhPWJlLGt1PVdlO2NsYXNzIHVue2NvbnN0cnVjdG9yKHQpe3ZhciByO3RoaXMucmVmcz17fSx0aGlzLmR5bmFtaWNBbmNob3JzPXt9O2xldCBuO3R5cGVvZiB0LnNjaGVtYT09Im9iamVjdCImJihuPXQuc2NoZW1hKSx0aGlzLnNjaGVtYT10LnNjaGVtYSx0aGlzLnNjaGVtYUlkPXQuc2NoZW1hSWQsdGhpcy5yb290PXQucm9vdHx8dGhpcyx0aGlzLmJhc2VJZD0ocj10LmJhc2VJZCkhPT1udWxsJiZyIT09dm9pZCAwP3I6KDAsWWUubm9ybWFsaXplSWQpKG49PW51bGw/dm9pZCAwOm5bdC5zY2hlbWFJZHx8IiRpZCJdKSx0aGlzLnNjaGVtYVBhdGg9dC5zY2hlbWFQYXRoLHRoaXMubG9jYWxSZWZzPXQubG9jYWxSZWZzLHRoaXMubWV0YT10Lm1ldGEsdGhpcy4kYXN5bmM9bj09bnVsbD92b2lkIDA6bi4kYXN5bmMsdGhpcy5yZWZzPXt9fX1DZS5TY2hlbWFFbnY9dW47ZnVuY3Rpb24gWG4oZSl7Y29uc3QgdD1JYS5jYWxsKHRoaXMsZSk7aWYodClyZXR1cm4gdDtjb25zdCByPSgwLFllLmdldEZ1bGxQYXRoKSh0aGlzLm9wdHMudXJpUmVzb2x2ZXIsZS5yb290LmJhc2VJZCkse2VzNTpuLGxpbmVzOnN9PXRoaXMub3B0cy5jb2RlLHtvd25Qcm9wZXJ0aWVzOmF9PXRoaXMub3B0cyxvPW5ldyBRZS5Db2RlR2VuKHRoaXMuc2NvcGUse2VzNTpuLGxpbmVzOnMsb3duUHJvcGVydGllczphfSk7bGV0IGw7ZS4kYXN5bmMmJihsPW8uc2NvcGVWYWx1ZSgiRXJyb3IiLHtyZWY6anUuZGVmYXVsdCxjb2RlOigwLFFlLl8pYHJlcXVpcmUoImFqdi9kaXN0L3J1bnRpbWUvdmFsaWRhdGlvbl9lcnJvciIpLmRlZmF1bHRgfSkpO2NvbnN0IGY9by5zY29wZU5hbWUoInZhbGlkYXRlIik7ZS52YWxpZGF0ZU5hbWU9Zjtjb25zdCBwPXtnZW46byxhbGxFcnJvcnM6dGhpcy5vcHRzLmFsbEVycm9ycyxkYXRhOlV0LmRlZmF1bHQuZGF0YSxwYXJlbnREYXRhOlV0LmRlZmF1bHQucGFyZW50RGF0YSxwYXJlbnREYXRhUHJvcGVydHk6VXQuZGVmYXVsdC5wYXJlbnREYXRhUHJvcGVydHksZGF0YU5hbWVzOltVdC5kZWZhdWx0LmRhdGFdLGRhdGFQYXRoQXJyOltRZS5uaWxdLGRhdGFMZXZlbDowLGRhdGFUeXBlczpbXSxkZWZpbmVkUHJvcGVydGllczpuZXcgU2V0LHRvcFNjaGVtYVJlZjpvLnNjb3BlVmFsdWUoInNjaGVtYSIsdGhpcy5vcHRzLmNvZGUuc291cmNlPT09ITA/e3JlZjplLnNjaGVtYSxjb2RlOigwLFFlLnN0cmluZ2lmeSkoZS5zY2hlbWEpfTp7cmVmOmUuc2NoZW1hfSksdmFsaWRhdGVOYW1lOmYsVmFsaWRhdGlvbkVycm9yOmwsc2NoZW1hOmUuc2NoZW1hLHNjaGVtYUVudjplLHJvb3RJZDpyLGJhc2VJZDplLmJhc2VJZHx8cixzY2hlbWFQYXRoOlFlLm5pbCxlcnJTY2hlbWFQYXRoOmUuc2NoZW1hUGF0aHx8KHRoaXMub3B0cy5qdGQ/IiI6IiMiKSxlcnJvclBhdGg6KDAsUWUuXylgIiJgLG9wdHM6dGhpcy5vcHRzLHNlbGY6dGhpc307bGV0IGk7dHJ5e3RoaXMuX2NvbXBpbGF0aW9ucy5hZGQoZSksKDAsa3UudmFsaWRhdGVGdW5jdGlvbkNvZGUpKHApLG8ub3B0aW1pemUodGhpcy5vcHRzLmNvZGUub3B0aW1pemUpO2NvbnN0IGg9by50b1N0cmluZygpO2k9YCR7by5zY29wZVJlZnMoVXQuZGVmYXVsdC5zY29wZSl9cmV0dXJuICR7aH1gLHRoaXMub3B0cy5jb2RlLnByb2Nlc3MmJihpPXRoaXMub3B0cy5jb2RlLnByb2Nlc3MoaSxlKSk7Y29uc3QgVD1uZXcgRnVuY3Rpb24oYCR7VXQuZGVmYXVsdC5zZWxmfWAsYCR7VXQuZGVmYXVsdC5zY29wZX1gLGkpKHRoaXMsdGhpcy5zY29wZS5nZXQoKSk7aWYodGhpcy5zY29wZS52YWx1ZShmLHtyZWY6VH0pLFQuZXJyb3JzPW51bGwsVC5zY2hlbWE9ZS5zY2hlbWEsVC5zY2hlbWFFbnY9ZSxlLiRhc3luYyYmKFQuJGFzeW5jPSEwKSx0aGlzLm9wdHMuY29kZS5zb3VyY2U9PT0hMCYmKFQuc291cmNlPXt2YWxpZGF0ZU5hbWU6Zix2YWxpZGF0ZUNvZGU6aCxzY29wZVZhbHVlczpvLl92YWx1ZXN9KSx0aGlzLm9wdHMudW5ldmFsdWF0ZWQpe2NvbnN0e3Byb3BzOkksaXRlbXM6an09cDtULmV2YWx1YXRlZD17cHJvcHM6SSBpbnN0YW5jZW9mIFFlLk5hbWU/dm9pZCAwOkksaXRlbXM6aiBpbnN0YW5jZW9mIFFlLk5hbWU/dm9pZCAwOmosZHluYW1pY1Byb3BzOkkgaW5zdGFuY2VvZiBRZS5OYW1lLGR5bmFtaWNJdGVtczpqIGluc3RhbmNlb2YgUWUuTmFtZX0sVC5zb3VyY2UmJihULnNvdXJjZS5ldmFsdWF0ZWQ9KDAsUWUuc3RyaW5naWZ5KShULmV2YWx1YXRlZCkpfXJldHVybiBlLnZhbGlkYXRlPVQsZX1jYXRjaChoKXt0aHJvdyBkZWxldGUgZS52YWxpZGF0ZSxkZWxldGUgZS52YWxpZGF0ZU5hbWUsaSYmdGhpcy5sb2dnZXIuZXJyb3IoIkVycm9yIGNvbXBpbGluZyBzY2hlbWEsIGZ1bmN0aW9uIGNvZGU6IixpKSxofWZpbmFsbHl7dGhpcy5fY29tcGlsYXRpb25zLmRlbGV0ZShlKX19Q2UuY29tcGlsZVNjaGVtYT1YbjtmdW5jdGlvbiBVdShlLHQscil7dmFyIG47cj0oMCxZZS5yZXNvbHZlVXJsKSh0aGlzLm9wdHMudXJpUmVzb2x2ZXIsdCxyKTtjb25zdCBzPWUucmVmc1tyXTtpZihzKXJldHVybiBzO2xldCBhPUx1LmNhbGwodGhpcyxlLHIpO2lmKGE9PT12b2lkIDApe2NvbnN0IG89KG49ZS5sb2NhbFJlZnMpPT09bnVsbHx8bj09PXZvaWQgMD92b2lkIDA6bltyXSx7c2NoZW1hSWQ6bH09dGhpcy5vcHRzO28mJihhPW5ldyB1bih7c2NoZW1hOm8sc2NoZW1hSWQ6bCxyb290OmUsYmFzZUlkOnR9KSl9aWYoYSE9PXZvaWQgMClyZXR1cm4gZS5yZWZzW3JdPUZ1LmNhbGwodGhpcyxhKX1DZS5yZXNvbHZlUmVmPVV1O2Z1bmN0aW9uIEZ1KGUpe3JldHVybigwLFllLmlubGluZVJlZikoZS5zY2hlbWEsdGhpcy5vcHRzLmlubGluZVJlZnMpP2Uuc2NoZW1hOmUudmFsaWRhdGU/ZTpYbi5jYWxsKHRoaXMsZSl9ZnVuY3Rpb24gSWEoZSl7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fY29tcGlsYXRpb25zKWlmKE11KHQsZSkpcmV0dXJuIHR9Q2UuZ2V0Q29tcGlsaW5nU2NoZW1hPUlhO2Z1bmN0aW9uIE11KGUsdCl7cmV0dXJuIGUuc2NoZW1hPT09dC5zY2hlbWEmJmUucm9vdD09PXQucm9vdCYmZS5iYXNlSWQ9PT10LmJhc2VJZH1mdW5jdGlvbiBMdShlLHQpe2xldCByO2Zvcig7dHlwZW9mKHI9dGhpcy5yZWZzW3RdKT09InN0cmluZyI7KXQ9cjtyZXR1cm4gcnx8dGhpcy5zY2hlbWFzW3RdfHxsbi5jYWxsKHRoaXMsZSx0KX1mdW5jdGlvbiBsbihlLHQpe2NvbnN0IHI9dGhpcy5vcHRzLnVyaVJlc29sdmVyLnBhcnNlKHQpLG49KDAsWWUuX2dldEZ1bGxQYXRoKSh0aGlzLm9wdHMudXJpUmVzb2x2ZXIscik7bGV0IHM9KDAsWWUuZ2V0RnVsbFBhdGgpKHRoaXMub3B0cy51cmlSZXNvbHZlcixlLmJhc2VJZCx2b2lkIDApO2lmKE9iamVjdC5rZXlzKGUuc2NoZW1hKS5sZW5ndGg+MCYmbj09PXMpcmV0dXJuIFpuLmNhbGwodGhpcyxyLGUpO2NvbnN0IGE9KDAsWWUubm9ybWFsaXplSWQpKG4pLG89dGhpcy5yZWZzW2FdfHx0aGlzLnNjaGVtYXNbYV07aWYodHlwZW9mIG89PSJzdHJpbmciKXtjb25zdCBsPWxuLmNhbGwodGhpcyxlLG8pO3JldHVybiB0eXBlb2YobD09bnVsbD92b2lkIDA6bC5zY2hlbWEpIT0ib2JqZWN0Ij92b2lkIDA6Wm4uY2FsbCh0aGlzLHIsbCl9aWYodHlwZW9mKG89PW51bGw/dm9pZCAwOm8uc2NoZW1hKT09Im9iamVjdCIpe2lmKG8udmFsaWRhdGV8fFhuLmNhbGwodGhpcyxvKSxhPT09KDAsWWUubm9ybWFsaXplSWQpKHQpKXtjb25zdHtzY2hlbWE6bH09byx7c2NoZW1hSWQ6Zn09dGhpcy5vcHRzLHA9bFtmXTtyZXR1cm4gcCYmKHM9KDAsWWUucmVzb2x2ZVVybCkodGhpcy5vcHRzLnVyaVJlc29sdmVyLHMscCkpLG5ldyB1bih7c2NoZW1hOmwsc2NoZW1hSWQ6Zixyb290OmUsYmFzZUlkOnN9KX1yZXR1cm4gWm4uY2FsbCh0aGlzLHIsbyl9fUNlLnJlc29sdmVTY2hlbWE9bG47Y29uc3QgVnU9bmV3IFNldChbInByb3BlcnRpZXMiLCJwYXR0ZXJuUHJvcGVydGllcyIsImVudW0iLCJkZXBlbmRlbmNpZXMiLCJkZWZpbml0aW9ucyJdKTtmdW5jdGlvbiBabihlLHtiYXNlSWQ6dCxzY2hlbWE6cixyb290Om59KXt2YXIgcztpZigoKHM9ZS5mcmFnbWVudCk9PT1udWxsfHxzPT09dm9pZCAwP3ZvaWQgMDpzWzBdKSE9PSIvIilyZXR1cm47Zm9yKGNvbnN0IGwgb2YgZS5mcmFnbWVudC5zbGljZSgxKS5zcGxpdCgiLyIpKXtpZih0eXBlb2Ygcj09ImJvb2xlYW4iKXJldHVybjtjb25zdCBmPXJbKDAsQ2EudW5lc2NhcGVGcmFnbWVudCkobCldO2lmKGY9PT12b2lkIDApcmV0dXJuO3I9Zjtjb25zdCBwPXR5cGVvZiByPT0ib2JqZWN0IiYmclt0aGlzLm9wdHMuc2NoZW1hSWRdOyFWdS5oYXMobCkmJnAmJih0PSgwLFllLnJlc29sdmVVcmwpKHRoaXMub3B0cy51cmlSZXNvbHZlcix0LHApKX1sZXQgYTtpZih0eXBlb2YgciE9ImJvb2xlYW4iJiZyLiRyZWYmJiEoMCxDYS5zY2hlbWFIYXNSdWxlc0J1dFJlZikocix0aGlzLlJVTEVTKSl7Y29uc3QgbD0oMCxZZS5yZXNvbHZlVXJsKSh0aGlzLm9wdHMudXJpUmVzb2x2ZXIsdCxyLiRyZWYpO2E9bG4uY2FsbCh0aGlzLG4sbCl9Y29uc3R7c2NoZW1hSWQ6b309dGhpcy5vcHRzO2lmKGE9YXx8bmV3IHVuKHtzY2hlbWE6cixzY2hlbWFJZDpvLHJvb3Q6bixiYXNlSWQ6dH0pLGEuc2NoZW1hIT09YS5yb290LnNjaGVtYSlyZXR1cm4gYX12YXIgenU9eyRpZDoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Fqdi12YWxpZGF0b3IvYWp2L21hc3Rlci9saWIvcmVmcy9kYXRhLmpzb24jIixkZXNjcmlwdGlvbjoiTWV0YS1zY2hlbWEgZm9yICRkYXRhIHJlZmVyZW5jZSAoSlNPTiBBbnlTY2hlbWEgZXh0ZW5zaW9uIHByb3Bvc2FsKSIsdHlwZToib2JqZWN0IixyZXF1aXJlZDpbIiRkYXRhIl0scHJvcGVydGllczp7JGRhdGE6e3R5cGU6InN0cmluZyIsYW55T2Y6W3tmb3JtYXQ6InJlbGF0aXZlLWpzb24tcG9pbnRlciJ9LHtmb3JtYXQ6Impzb24tcG9pbnRlciJ9XX19LGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiExfSx4bj17fSxlcz17ZXhwb3J0czp7fX07LyoqIEBsaWNlbnNlIFVSSS5qcyB2NC40LjEgKGMpIDIwMTEgR2FyeSBDb3VydC4gTGljZW5zZTogaHR0cDovL2dpdGh1Yi5jb20vZ2FyeWNvdXJ0L3VyaS1qcyAqLyhmdW5jdGlvbihlLHQpeyhmdW5jdGlvbihyLG4pe24odCl9KShlZSxmdW5jdGlvbihyKXtmdW5jdGlvbiBuKCl7Zm9yKHZhciBkPWFyZ3VtZW50cy5sZW5ndGgsdT1BcnJheShkKSx2PTA7djxkO3YrKyl1W3ZdPWFyZ3VtZW50c1t2XTtpZih1Lmxlbmd0aD4xKXt1WzBdPXVbMF0uc2xpY2UoMCwtMSk7Zm9yKHZhciBSPXUubGVuZ3RoLTEsUz0xO1M8UjsrK1MpdVtTXT11W1NdLnNsaWNlKDEsLTEpO3JldHVybiB1W1JdPXVbUl0uc2xpY2UoMSksdS5qb2luKCIiKX1lbHNlIHJldHVybiB1WzBdfWZ1bmN0aW9uIHMoZCl7cmV0dXJuIig/OiIrZCsiKSJ9ZnVuY3Rpb24gYShkKXtyZXR1cm4gZD09PXZvaWQgMD8idW5kZWZpbmVkIjpkPT09bnVsbD8ibnVsbCI6T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGQpLnNwbGl0KCIgIikucG9wKCkuc3BsaXQoIl0iKS5zaGlmdCgpLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gbyhkKXtyZXR1cm4gZC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIGwoZCl7cmV0dXJuIGQhPW51bGw/ZCBpbnN0YW5jZW9mIEFycmF5P2Q6dHlwZW9mIGQubGVuZ3RoIT0ibnVtYmVyInx8ZC5zcGxpdHx8ZC5zZXRJbnRlcnZhbHx8ZC5jYWxsP1tkXTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkKTpbXX1mdW5jdGlvbiBmKGQsdSl7dmFyIHY9ZDtpZih1KWZvcih2YXIgUiBpbiB1KXZbUl09dVtSXTtyZXR1cm4gdn1mdW5jdGlvbiBwKGQpe3ZhciB1PSJbQS1aYS16XSIsdj0iWzAtOV0iLFI9bih2LCJbQS1GYS1mXSIpLFM9cyhzKCIlW0VGZWZdIitSKyIlIitSK1IrIiUiK1IrUikrInwiK3MoIiVbODlBLUZhLWZdIitSKyIlIitSK1IpKyJ8IitzKCIlIitSK1IpKSx6PSJbXFw6XFwvXFw/XFwjXFxbXFxdXFxAXSIsSz0iW1xcIVxcJFxcJlxcJ1xcKFxcKVxcKlxcK1xcLFxcO1xcPV0iLHNlPW4oeixLKSxtZT1kPyJbXFx4QTAtXFx1MjAwRFxcdTIwMTAtXFx1MjAyOVxcdTIwMkYtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0iOiJbXSIsJGU9ZD8iW1xcdUUwMDAtXFx1RjhGRl0iOiJbXSIseD1uKHUsdiwiW1xcLVxcLlxcX1xcfl0iLG1lKTtzKHUrbih1LHYsIltcXCtcXC1cXC5dIikrIioiKSxzKHMoUysifCIrbih4LEssIltcXDpdIikpKyIqIik7dmFyIGZlPXMocygiMjVbMC01XSIpKyJ8IitzKCIyWzAtNF0iK3YpKyJ8IitzKCIxIit2K3YpKyJ8IitzKCIwP1sxLTldIit2KSsifDA/MD8iK3YpLHdlPXMoZmUrIlxcLiIrZmUrIlxcLiIrZmUrIlxcLiIrZmUpLHE9cyhSKyJ7MSw0fSIpLF9lPXMocyhxKyJcXDoiK3EpKyJ8Iit3ZSksUmU9cyhzKHErIlxcOiIpKyJ7Nn0iK19lKSxnZT1zKCJcXDpcXDoiK3MocSsiXFw6IikrIns1fSIrX2UpLFB0PXMocyhxKSsiP1xcOlxcOiIrcyhxKyJcXDoiKSsiezR9IitfZSksYXQ9cyhzKHMocSsiXFw6IikrInswLDF9IitxKSsiP1xcOlxcOiIrcyhxKyJcXDoiKSsiezN9IitfZSksb3Q9cyhzKHMocSsiXFw6IikrInswLDJ9IitxKSsiP1xcOlxcOiIrcyhxKyJcXDoiKSsiezJ9IitfZSksdnI9cyhzKHMocSsiXFw6IikrInswLDN9IitxKSsiP1xcOlxcOiIrcSsiXFw6IitfZSkscXQ9cyhzKHMocSsiXFw6IikrInswLDR9IitxKSsiP1xcOlxcOiIrX2UpLHFlPXMocyhzKHErIlxcOiIpKyJ7MCw1fSIrcSkrIj9cXDpcXDoiK3EpLGl0PXMocyhzKHErIlxcOiIpKyJ7MCw2fSIrcSkrIj9cXDpcXDoiKSxHdD1zKFtSZSxnZSxQdCxhdCxvdCx2cixxdCxxZSxpdF0uam9pbigifCIpKSxfdD1zKHMoeCsifCIrUykrIisiKTtzKCJbdlZdIitSKyIrXFwuIituKHgsSywiW1xcOl0iKSsiKyIpLHMocyhTKyJ8IituKHgsSykpKyIqIik7dmFyIEJyPXMoUysifCIrbih4LEssIltcXDpcXEBdIikpO3JldHVybiBzKHMoUysifCIrbih4LEssIltcXEBdIikpKyIrIikscyhzKEJyKyJ8IituKCJbXFwvXFw/XSIsJGUpKSsiKiIpLHtOT1RfU0NIRU1FOm5ldyBSZWdFeHAobigiW15dIix1LHYsIltcXCtcXC1cXC5dIiksImciKSxOT1RfVVNFUklORk86bmV3IFJlZ0V4cChuKCJbXlxcJVxcOl0iLHgsSyksImciKSxOT1RfSE9TVDpuZXcgUmVnRXhwKG4oIlteXFwlXFxbXFxdXFw6XSIseCxLKSwiZyIpLE5PVF9QQVRIOm5ldyBSZWdFeHAobigiW15cXCVcXC9cXDpcXEBdIix4LEspLCJnIiksTk9UX1BBVEhfTk9TQ0hFTUU6bmV3IFJlZ0V4cChuKCJbXlxcJVxcL1xcQF0iLHgsSyksImciKSxOT1RfUVVFUlk6bmV3IFJlZ0V4cChuKCJbXlxcJV0iLHgsSywiW1xcOlxcQFxcL1xcP10iLCRlKSwiZyIpLE5PVF9GUkFHTUVOVDpuZXcgUmVnRXhwKG4oIlteXFwlXSIseCxLLCJbXFw6XFxAXFwvXFw/XSIpLCJnIiksRVNDQVBFOm5ldyBSZWdFeHAobigiW15dIix4LEspLCJnIiksVU5SRVNFUlZFRDpuZXcgUmVnRXhwKHgsImciKSxPVEhFUl9DSEFSUzpuZXcgUmVnRXhwKG4oIlteXFwlXSIseCxzZSksImciKSxQQ1RfRU5DT0RFRDpuZXcgUmVnRXhwKFMsImciKSxJUFY0QUREUkVTUzpuZXcgUmVnRXhwKCJeKCIrd2UrIikkIiksSVBWNkFERFJFU1M6bmV3IFJlZ0V4cCgiXlxcWz8oIitHdCsiKSIrcyhzKCJcXCUyNXxcXCUoPyEiK1IrInsyfSkiKSsiKCIrX3QrIikiKSsiP1xcXT8kIil9fXZhciBpPXAoITEpLGg9cCghMCksRT1mdW5jdGlvbigpe2Z1bmN0aW9uIGQodSx2KXt2YXIgUj1bXSxTPSEwLHo9ITEsSz12b2lkIDA7dHJ5e2Zvcih2YXIgc2U9dVtTeW1ib2wuaXRlcmF0b3JdKCksbWU7IShTPShtZT1zZS5uZXh0KCkpLmRvbmUpJiYoUi5wdXNoKG1lLnZhbHVlKSwhKHYmJlIubGVuZ3RoPT09dikpO1M9ITApO31jYXRjaCgkZSl7ej0hMCxLPSRlfWZpbmFsbHl7dHJ5eyFTJiZzZS5yZXR1cm4mJnNlLnJldHVybigpfWZpbmFsbHl7aWYoeil0aHJvdyBLfX1yZXR1cm4gUn1yZXR1cm4gZnVuY3Rpb24odSx2KXtpZihBcnJheS5pc0FycmF5KHUpKXJldHVybiB1O2lmKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QodSkpcmV0dXJuIGQodSx2KTt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlIil9fSgpLFQ9ZnVuY3Rpb24oZCl7aWYoQXJyYXkuaXNBcnJheShkKSl7Zm9yKHZhciB1PTAsdj1BcnJheShkLmxlbmd0aCk7dTxkLmxlbmd0aDt1Kyspdlt1XT1kW3VdO3JldHVybiB2fWVsc2UgcmV0dXJuIEFycmF5LmZyb20oZCl9LEk9MjE0NzQ4MzY0NyxqPTM2LHk9MSxfPTI2LGI9MzgsTz03MDAsQT03MixIPTEyOCwkPSItIixOPS9eeG4tLS8sRD0vW15cMC1ceDdFXS8sQj0vW1x4MkVcdTMwMDJcdUZGMEVcdUZGNjFdL2csRz17b3ZlcmZsb3c6Ik92ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzIiwibm90LWJhc2ljIjoiSWxsZWdhbCBpbnB1dCA+PSAweDgwIChub3QgYSBiYXNpYyBjb2RlIHBvaW50KSIsImludmFsaWQtaW5wdXQiOiJJbnZhbGlkIGlucHV0In0scGU9ai15LFc9TWF0aC5mbG9vcixvZT1TdHJpbmcuZnJvbUNoYXJDb2RlO2Z1bmN0aW9uIFgoZCl7dGhyb3cgbmV3IFJhbmdlRXJyb3IoR1tkXSl9ZnVuY3Rpb24gdmUoZCx1KXtmb3IodmFyIHY9W10sUj1kLmxlbmd0aDtSLS07KXZbUl09dShkW1JdKTtyZXR1cm4gdn1mdW5jdGlvbiBFZShkLHUpe3ZhciB2PWQuc3BsaXQoIkAiKSxSPSIiO3YubGVuZ3RoPjEmJihSPXZbMF0rIkAiLGQ9dlsxXSksZD1kLnJlcGxhY2UoQiwiLiIpO3ZhciBTPWQuc3BsaXQoIi4iKSx6PXZlKFMsdSkuam9pbigiLiIpO3JldHVybiBSK3p9ZnVuY3Rpb24gTmUoZCl7Zm9yKHZhciB1PVtdLHY9MCxSPWQubGVuZ3RoO3Y8Ujspe3ZhciBTPWQuY2hhckNvZGVBdCh2KyspO2lmKFM+PTU1Mjk2JiZTPD01NjMxOSYmdjxSKXt2YXIgej1kLmNoYXJDb2RlQXQodisrKTsoeiY2NDUxMik9PTU2MzIwP3UucHVzaCgoKFMmMTAyMyk8PDEwKSsoeiYxMDIzKSs2NTUzNik6KHUucHVzaChTKSx2LS0pfWVsc2UgdS5wdXNoKFMpfXJldHVybiB1fXZhciBCZT1mdW5jdGlvbih1KXtyZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQuYXBwbHkoU3RyaW5nLFQodSkpfSx1cj1mdW5jdGlvbih1KXtyZXR1cm4gdS00ODwxMD91LTIyOnUtNjU8MjY/dS02NTp1LTk3PDI2P3UtOTc6an0saz1mdW5jdGlvbih1LHYpe3JldHVybiB1KzIyKzc1Kih1PDI2KS0oKHYhPTApPDw1KX0sZz1mdW5jdGlvbih1LHYsUil7dmFyIFM9MDtmb3IodT1SP1codS9PKTp1Pj4xLHUrPVcodS92KTt1PnBlKl8+PjE7Uys9ail1PVcodS9wZSk7cmV0dXJuIFcoUysocGUrMSkqdS8odStiKSl9LEM9ZnVuY3Rpb24odSl7dmFyIHY9W10sUj11Lmxlbmd0aCxTPTAsej1ILEs9QSxzZT11Lmxhc3RJbmRleE9mKCQpO3NlPDAmJihzZT0wKTtmb3IodmFyIG1lPTA7bWU8c2U7KyttZSl1LmNoYXJDb2RlQXQobWUpPj0xMjgmJlgoIm5vdC1iYXNpYyIpLHYucHVzaCh1LmNoYXJDb2RlQXQobWUpKTtmb3IodmFyICRlPXNlPjA/c2UrMTowOyRlPFI7KXtmb3IodmFyIHg9UyxmZT0xLHdlPWo7O3dlKz1qKXskZT49UiYmWCgiaW52YWxpZC1pbnB1dCIpO3ZhciBxPXVyKHUuY2hhckNvZGVBdCgkZSsrKSk7KHE+PWp8fHE+VygoSS1TKS9mZSkpJiZYKCJvdmVyZmxvdyIpLFMrPXEqZmU7dmFyIF9lPXdlPD1LP3k6d2U+PUsrXz9fOndlLUs7aWYocTxfZSlicmVhazt2YXIgUmU9ai1fZTtmZT5XKEkvUmUpJiZYKCJvdmVyZmxvdyIpLGZlKj1SZX12YXIgZ2U9di5sZW5ndGgrMTtLPWcoUy14LGdlLHg9PTApLFcoUy9nZSk+SS16JiZYKCJvdmVyZmxvdyIpLHorPVcoUy9nZSksUyU9Z2Usdi5zcGxpY2UoUysrLDAseil9cmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50LmFwcGx5KFN0cmluZyx2KX0sdz1mdW5jdGlvbih1KXt2YXIgdj1bXTt1PU5lKHUpO3ZhciBSPXUubGVuZ3RoLFM9SCx6PTAsSz1BLHNlPSEwLG1lPSExLCRlPXZvaWQgMDt0cnl7Zm9yKHZhciB4PXVbU3ltYm9sLml0ZXJhdG9yXSgpLGZlOyEoc2U9KGZlPXgubmV4dCgpKS5kb25lKTtzZT0hMCl7dmFyIHdlPWZlLnZhbHVlO3dlPDEyOCYmdi5wdXNoKG9lKHdlKSl9fWNhdGNoKEpyKXttZT0hMCwkZT1Kcn1maW5hbGx5e3RyeXshc2UmJngucmV0dXJuJiZ4LnJldHVybigpfWZpbmFsbHl7aWYobWUpdGhyb3cgJGV9fXZhciBxPXYubGVuZ3RoLF9lPXE7Zm9yKHEmJnYucHVzaCgkKTtfZTxSOyl7dmFyIFJlPUksZ2U9ITAsUHQ9ITEsYXQ9dm9pZCAwO3RyeXtmb3IodmFyIG90PXVbU3ltYm9sLml0ZXJhdG9yXSgpLHZyOyEoZ2U9KHZyPW90Lm5leHQoKSkuZG9uZSk7Z2U9ITApe3ZhciBxdD12ci52YWx1ZTtxdD49UyYmcXQ8UmUmJihSZT1xdCl9fWNhdGNoKEpyKXtQdD0hMCxhdD1Kcn1maW5hbGx5e3RyeXshZ2UmJm90LnJldHVybiYmb3QucmV0dXJuKCl9ZmluYWxseXtpZihQdCl0aHJvdyBhdH19dmFyIHFlPV9lKzE7UmUtUz5XKChJLXopL3FlKSYmWCgib3ZlcmZsb3ciKSx6Kz0oUmUtUykqcWUsUz1SZTt2YXIgaXQ9ITAsR3Q9ITEsX3Q9dm9pZCAwO3RyeXtmb3IodmFyIEJyPXVbU3ltYm9sLml0ZXJhdG9yXSgpLFVvOyEoaXQ9KFVvPUJyLm5leHQoKSkuZG9uZSk7aXQ9ITApe3ZhciBGbz1Vby52YWx1ZTtpZihGbzxTJiYrK3o+SSYmWCgib3ZlcmZsb3ciKSxGbz09Uyl7Zm9yKHZhciBTbj16LFJuPWo7O1JuKz1qKXt2YXIgYm49Um48PUs/eTpSbj49SytfP186Um4tSztpZihTbjxibilicmVhazt2YXIgTW89U24tYm4sTG89ai1ibjt2LnB1c2gob2UoayhibitNbyVMbywwKSkpLFNuPVcoTW8vTG8pfXYucHVzaChvZShrKFNuLDApKSksSz1nKHoscWUsX2U9PXEpLHo9MCwrK19lfX19Y2F0Y2goSnIpe0d0PSEwLF90PUpyfWZpbmFsbHl7dHJ5eyFpdCYmQnIucmV0dXJuJiZCci5yZXR1cm4oKX1maW5hbGx5e2lmKEd0KXRocm93IF90fX0rK3osKytTfXJldHVybiB2LmpvaW4oIiIpfSxjPWZ1bmN0aW9uKHUpe3JldHVybiBFZSh1LGZ1bmN0aW9uKHYpe3JldHVybiBOLnRlc3Qodik/Qyh2LnNsaWNlKDQpLnRvTG93ZXJDYXNlKCkpOnZ9KX0sbT1mdW5jdGlvbih1KXtyZXR1cm4gRWUodSxmdW5jdGlvbih2KXtyZXR1cm4gRC50ZXN0KHYpPyJ4bi0tIit3KHYpOnZ9KX0sUD17dmVyc2lvbjoiMi4xLjAiLHVjczI6e2RlY29kZTpOZSxlbmNvZGU6QmV9LGRlY29kZTpDLGVuY29kZTp3LHRvQVNDSUk6bSx0b1VuaWNvZGU6Y30sVT17fTtmdW5jdGlvbiBGKGQpe3ZhciB1PWQuY2hhckNvZGVBdCgwKSx2PXZvaWQgMDtyZXR1cm4gdTwxNj92PSIlMCIrdS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTp1PDEyOD92PSIlIit1LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOnU8MjA0OD92PSIlIisodT4+NnwxOTIpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKyIlIisodSY2M3wxMjgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOnY9IiUiKyh1Pj4xMnwyMjQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKyIlIisodT4+NiY2M3wxMjgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKyIlIisodSY2M3wxMjgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLHZ9ZnVuY3Rpb24gWihkKXtmb3IodmFyIHU9IiIsdj0wLFI9ZC5sZW5ndGg7djxSOyl7dmFyIFM9cGFyc2VJbnQoZC5zdWJzdHIodisxLDIpLDE2KTtpZihTPDEyOCl1Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKFMpLHYrPTM7ZWxzZSBpZihTPj0xOTQmJlM8MjI0KXtpZihSLXY+PTYpe3ZhciB6PXBhcnNlSW50KGQuc3Vic3RyKHYrNCwyKSwxNik7dSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoUyYzMSk8PDZ8eiY2Myl9ZWxzZSB1Kz1kLnN1YnN0cih2LDYpO3YrPTZ9ZWxzZSBpZihTPj0yMjQpe2lmKFItdj49OSl7dmFyIEs9cGFyc2VJbnQoZC5zdWJzdHIodis0LDIpLDE2KSxzZT1wYXJzZUludChkLnN1YnN0cih2KzcsMiksMTYpO3UrPVN0cmluZy5mcm9tQ2hhckNvZGUoKFMmMTUpPDwxMnwoSyY2Myk8PDZ8c2UmNjMpfWVsc2UgdSs9ZC5zdWJzdHIodiw5KTt2Kz05fWVsc2UgdSs9ZC5zdWJzdHIodiwzKSx2Kz0zfXJldHVybiB1fWZ1bmN0aW9uIHJlKGQsdSl7ZnVuY3Rpb24gdihSKXt2YXIgUz1aKFIpO3JldHVybiBTLm1hdGNoKHUuVU5SRVNFUlZFRCk/UzpSfXJldHVybiBkLnNjaGVtZSYmKGQuc2NoZW1lPVN0cmluZyhkLnNjaGVtZSkucmVwbGFjZSh1LlBDVF9FTkNPREVELHYpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSh1Lk5PVF9TQ0hFTUUsIiIpKSxkLnVzZXJpbmZvIT09dm9pZCAwJiYoZC51c2VyaW5mbz1TdHJpbmcoZC51c2VyaW5mbykucmVwbGFjZSh1LlBDVF9FTkNPREVELHYpLnJlcGxhY2UodS5OT1RfVVNFUklORk8sRikucmVwbGFjZSh1LlBDVF9FTkNPREVELG8pKSxkLmhvc3QhPT12b2lkIDAmJihkLmhvc3Q9U3RyaW5nKGQuaG9zdCkucmVwbGFjZSh1LlBDVF9FTkNPREVELHYpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSh1Lk5PVF9IT1NULEYpLnJlcGxhY2UodS5QQ1RfRU5DT0RFRCxvKSksZC5wYXRoIT09dm9pZCAwJiYoZC5wYXRoPVN0cmluZyhkLnBhdGgpLnJlcGxhY2UodS5QQ1RfRU5DT0RFRCx2KS5yZXBsYWNlKGQuc2NoZW1lP3UuTk9UX1BBVEg6dS5OT1RfUEFUSF9OT1NDSEVNRSxGKS5yZXBsYWNlKHUuUENUX0VOQ09ERUQsbykpLGQucXVlcnkhPT12b2lkIDAmJihkLnF1ZXJ5PVN0cmluZyhkLnF1ZXJ5KS5yZXBsYWNlKHUuUENUX0VOQ09ERUQsdikucmVwbGFjZSh1Lk5PVF9RVUVSWSxGKS5yZXBsYWNlKHUuUENUX0VOQ09ERUQsbykpLGQuZnJhZ21lbnQhPT12b2lkIDAmJihkLmZyYWdtZW50PVN0cmluZyhkLmZyYWdtZW50KS5yZXBsYWNlKHUuUENUX0VOQ09ERUQsdikucmVwbGFjZSh1Lk5PVF9GUkFHTUVOVCxGKS5yZXBsYWNlKHUuUENUX0VOQ09ERUQsbykpLGR9ZnVuY3Rpb24geWUoZCl7cmV0dXJuIGQucmVwbGFjZSgvXjAqKC4qKS8sIiQxIil8fCIwIn1mdW5jdGlvbiBydChkLHUpe3ZhciB2PWQubWF0Y2godS5JUFY0QUREUkVTUyl8fFtdLFI9RSh2LDIpLFM9UlsxXTtyZXR1cm4gUz9TLnNwbGl0KCIuIikubWFwKHllKS5qb2luKCIuIik6ZH1mdW5jdGlvbiBscihkLHUpe3ZhciB2PWQubWF0Y2godS5JUFY2QUREUkVTUyl8fFtdLFI9RSh2LDMpLFM9UlsxXSx6PVJbMl07aWYoUyl7Zm9yKHZhciBLPVMudG9Mb3dlckNhc2UoKS5zcGxpdCgiOjoiKS5yZXZlcnNlKCksc2U9RShLLDIpLG1lPXNlWzBdLCRlPXNlWzFdLHg9JGU/JGUuc3BsaXQoIjoiKS5tYXAoeWUpOltdLGZlPW1lLnNwbGl0KCI6IikubWFwKHllKSx3ZT11LklQVjRBRERSRVNTLnRlc3QoZmVbZmUubGVuZ3RoLTFdKSxxPXdlPzc6OCxfZT1mZS5sZW5ndGgtcSxSZT1BcnJheShxKSxnZT0wO2dlPHE7KytnZSlSZVtnZV09eFtnZV18fGZlW19lK2dlXXx8IiI7d2UmJihSZVtxLTFdPXJ0KFJlW3EtMV0sdSkpO3ZhciBQdD1SZS5yZWR1Y2UoZnVuY3Rpb24ocWUsaXQsR3Qpe2lmKCFpdHx8aXQ9PT0iMCIpe3ZhciBfdD1xZVtxZS5sZW5ndGgtMV07X3QmJl90LmluZGV4K190Lmxlbmd0aD09PUd0P190Lmxlbmd0aCsrOnFlLnB1c2goe2luZGV4Okd0LGxlbmd0aDoxfSl9cmV0dXJuIHFlfSxbXSksYXQ9UHQuc29ydChmdW5jdGlvbihxZSxpdCl7cmV0dXJuIGl0Lmxlbmd0aC1xZS5sZW5ndGh9KVswXSxvdD12b2lkIDA7aWYoYXQmJmF0Lmxlbmd0aD4xKXt2YXIgdnI9UmUuc2xpY2UoMCxhdC5pbmRleCkscXQ9UmUuc2xpY2UoYXQuaW5kZXgrYXQubGVuZ3RoKTtvdD12ci5qb2luKCI6IikrIjo6IitxdC5qb2luKCI6Iil9ZWxzZSBvdD1SZS5qb2luKCI6Iik7cmV0dXJuIHomJihvdCs9IiUiK3opLG90fWVsc2UgcmV0dXJuIGR9dmFyIEZyPS9eKD86KFteOlwvPyNdKyk6KT8oPzpcL1wvKCg/OihbXlwvPyNAXSopQCk/KFxbW15cLz8jXF1dK1xdfFteXC8/IzpdKikoPzpcOihcZCopKT8pKT8oW14/I10qKSg/Olw/KFteI10qKSk/KD86IygoPzoufFxufFxyKSopKT8vaSxNcj0iIi5tYXRjaCgvKCl7MH0vKVsxXT09PXZvaWQgMDtmdW5jdGlvbiBNZShkKXt2YXIgdT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e30sdj17fSxSPXUuaXJpIT09ITE/aDppO3UucmVmZXJlbmNlPT09InN1ZmZpeCImJihkPSh1LnNjaGVtZT91LnNjaGVtZSsiOiI6IiIpKyIvLyIrZCk7dmFyIFM9ZC5tYXRjaChGcik7aWYoUyl7TXI/KHYuc2NoZW1lPVNbMV0sdi51c2VyaW5mbz1TWzNdLHYuaG9zdD1TWzRdLHYucG9ydD1wYXJzZUludChTWzVdLDEwKSx2LnBhdGg9U1s2XXx8IiIsdi5xdWVyeT1TWzddLHYuZnJhZ21lbnQ9U1s4XSxpc05hTih2LnBvcnQpJiYodi5wb3J0PVNbNV0pKToodi5zY2hlbWU9U1sxXXx8dm9pZCAwLHYudXNlcmluZm89ZC5pbmRleE9mKCJAIikhPT0tMT9TWzNdOnZvaWQgMCx2Lmhvc3Q9ZC5pbmRleE9mKCIvLyIpIT09LTE/U1s0XTp2b2lkIDAsdi5wb3J0PXBhcnNlSW50KFNbNV0sMTApLHYucGF0aD1TWzZdfHwiIix2LnF1ZXJ5PWQuaW5kZXhPZigiPyIpIT09LTE/U1s3XTp2b2lkIDAsdi5mcmFnbWVudD1kLmluZGV4T2YoIiMiKSE9PS0xP1NbOF06dm9pZCAwLGlzTmFOKHYucG9ydCkmJih2LnBvcnQ9ZC5tYXRjaCgvXC9cLyg/Oi58XG4pKlw6KD86XC98XD98XCN8JCkvKT9TWzRdOnZvaWQgMCkpLHYuaG9zdCYmKHYuaG9zdD1scihydCh2Lmhvc3QsUiksUikpLHYuc2NoZW1lPT09dm9pZCAwJiZ2LnVzZXJpbmZvPT09dm9pZCAwJiZ2Lmhvc3Q9PT12b2lkIDAmJnYucG9ydD09PXZvaWQgMCYmIXYucGF0aCYmdi5xdWVyeT09PXZvaWQgMD92LnJlZmVyZW5jZT0ic2FtZS1kb2N1bWVudCI6di5zY2hlbWU9PT12b2lkIDA/di5yZWZlcmVuY2U9InJlbGF0aXZlIjp2LmZyYWdtZW50PT09dm9pZCAwP3YucmVmZXJlbmNlPSJhYnNvbHV0ZSI6di5yZWZlcmVuY2U9InVyaSIsdS5yZWZlcmVuY2UmJnUucmVmZXJlbmNlIT09InN1ZmZpeCImJnUucmVmZXJlbmNlIT09di5yZWZlcmVuY2UmJih2LmVycm9yPXYuZXJyb3J8fCJVUkkgaXMgbm90IGEgIit1LnJlZmVyZW5jZSsiIHJlZmVyZW5jZS4iKTt2YXIgej1VWyh1LnNjaGVtZXx8di5zY2hlbWV8fCIiKS50b0xvd2VyQ2FzZSgpXTtpZighdS51bmljb2RlU3VwcG9ydCYmKCF6fHwhei51bmljb2RlU3VwcG9ydCkpe2lmKHYuaG9zdCYmKHUuZG9tYWluSG9zdHx8eiYmei5kb21haW5Ib3N0KSl0cnl7di5ob3N0PVAudG9BU0NJSSh2Lmhvc3QucmVwbGFjZShSLlBDVF9FTkNPREVELFopLnRvTG93ZXJDYXNlKCkpfWNhdGNoKEspe3YuZXJyb3I9di5lcnJvcnx8Ikhvc3QncyBkb21haW4gbmFtZSBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byBBU0NJSSB2aWEgcHVueWNvZGU6ICIrS31yZSh2LGkpfWVsc2UgcmUodixSKTt6JiZ6LnBhcnNlJiZ6LnBhcnNlKHYsdSl9ZWxzZSB2LmVycm9yPXYuZXJyb3J8fCJVUkkgY2FuIG5vdCBiZSBwYXJzZWQuIjtyZXR1cm4gdn1mdW5jdGlvbiBMcihkLHUpe3ZhciB2PXUuaXJpIT09ITE/aDppLFI9W107cmV0dXJuIGQudXNlcmluZm8hPT12b2lkIDAmJihSLnB1c2goZC51c2VyaW5mbyksUi5wdXNoKCJAIikpLGQuaG9zdCE9PXZvaWQgMCYmUi5wdXNoKGxyKHJ0KFN0cmluZyhkLmhvc3QpLHYpLHYpLnJlcGxhY2Uodi5JUFY2QUREUkVTUyxmdW5jdGlvbihTLHosSyl7cmV0dXJuIlsiK3orKEs/IiUyNSIrSzoiIikrIl0ifSkpLCh0eXBlb2YgZC5wb3J0PT0ibnVtYmVyInx8dHlwZW9mIGQucG9ydD09InN0cmluZyIpJiYoUi5wdXNoKCI6IiksUi5wdXNoKFN0cmluZyhkLnBvcnQpKSksUi5sZW5ndGg/Ui5qb2luKCIiKTp2b2lkIDB9dmFyIGZyPS9eXC5cLj9cLy8sZHI9L15cL1wuKFwvfCQpLyxocj0vXlwvXC5cLihcL3wkKS8sVnI9L15cLz8oPzoufFxuKSo/KD89XC98JCkvO2Z1bmN0aW9uIG50KGQpe2Zvcih2YXIgdT1bXTtkLmxlbmd0aDspaWYoZC5tYXRjaChmcikpZD1kLnJlcGxhY2UoZnIsIiIpO2Vsc2UgaWYoZC5tYXRjaChkcikpZD1kLnJlcGxhY2UoZHIsIi8iKTtlbHNlIGlmKGQubWF0Y2goaHIpKWQ9ZC5yZXBsYWNlKGhyLCIvIiksdS5wb3AoKTtlbHNlIGlmKGQ9PT0iLiJ8fGQ9PT0iLi4iKWQ9IiI7ZWxzZXt2YXIgdj1kLm1hdGNoKFZyKTtpZih2KXt2YXIgUj12WzBdO2Q9ZC5zbGljZShSLmxlbmd0aCksdS5wdXNoKFIpfWVsc2UgdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGRvdCBzZWdtZW50IGNvbmRpdGlvbiIpfXJldHVybiB1LmpvaW4oIiIpfWZ1bmN0aW9uIGtlKGQpe3ZhciB1PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSx2PXUuaXJpP2g6aSxSPVtdLFM9VVsodS5zY2hlbWV8fGQuc2NoZW1lfHwiIikudG9Mb3dlckNhc2UoKV07aWYoUyYmUy5zZXJpYWxpemUmJlMuc2VyaWFsaXplKGQsdSksZC5ob3N0JiYhdi5JUFY2QUREUkVTUy50ZXN0KGQuaG9zdCkpe2lmKHUuZG9tYWluSG9zdHx8UyYmUy5kb21haW5Ib3N0KXRyeXtkLmhvc3Q9dS5pcmk/UC50b1VuaWNvZGUoZC5ob3N0KTpQLnRvQVNDSUkoZC5ob3N0LnJlcGxhY2Uodi5QQ1RfRU5DT0RFRCxaKS50b0xvd2VyQ2FzZSgpKX1jYXRjaChzZSl7ZC5lcnJvcj1kLmVycm9yfHwiSG9zdCdzIGRvbWFpbiBuYW1lIGNhbiBub3QgYmUgY29udmVydGVkIHRvICIrKHUuaXJpPyJVbmljb2RlIjoiQVNDSUkiKSsiIHZpYSBwdW55Y29kZTogIitzZX19cmUoZCx2KSx1LnJlZmVyZW5jZSE9PSJzdWZmaXgiJiZkLnNjaGVtZSYmKFIucHVzaChkLnNjaGVtZSksUi5wdXNoKCI6IikpO3ZhciB6PUxyKGQsdSk7aWYoeiE9PXZvaWQgMCYmKHUucmVmZXJlbmNlIT09InN1ZmZpeCImJlIucHVzaCgiLy8iKSxSLnB1c2goeiksZC5wYXRoJiZkLnBhdGguY2hhckF0KDApIT09Ii8iJiZSLnB1c2goIi8iKSksZC5wYXRoIT09dm9pZCAwKXt2YXIgSz1kLnBhdGg7IXUuYWJzb2x1dGVQYXRoJiYoIVN8fCFTLmFic29sdXRlUGF0aCkmJihLPW50KEspKSx6PT09dm9pZCAwJiYoSz1LLnJlcGxhY2UoL15cL1wvLywiLyUyRiIpKSxSLnB1c2goSyl9cmV0dXJuIGQucXVlcnkhPT12b2lkIDAmJihSLnB1c2goIj8iKSxSLnB1c2goZC5xdWVyeSkpLGQuZnJhZ21lbnQhPT12b2lkIDAmJihSLnB1c2goIiMiKSxSLnB1c2goZC5mcmFnbWVudCkpLFIuam9pbigiIil9ZnVuY3Rpb24gcHIoZCx1KXt2YXIgdj1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e30sUj1hcmd1bWVudHNbM10sUz17fTtyZXR1cm4gUnx8KGQ9TWUoa2UoZCx2KSx2KSx1PU1lKGtlKHUsdiksdikpLHY9dnx8e30sIXYudG9sZXJhbnQmJnUuc2NoZW1lPyhTLnNjaGVtZT11LnNjaGVtZSxTLnVzZXJpbmZvPXUudXNlcmluZm8sUy5ob3N0PXUuaG9zdCxTLnBvcnQ9dS5wb3J0LFMucGF0aD1udCh1LnBhdGh8fCIiKSxTLnF1ZXJ5PXUucXVlcnkpOih1LnVzZXJpbmZvIT09dm9pZCAwfHx1Lmhvc3QhPT12b2lkIDB8fHUucG9ydCE9PXZvaWQgMD8oUy51c2VyaW5mbz11LnVzZXJpbmZvLFMuaG9zdD11Lmhvc3QsUy5wb3J0PXUucG9ydCxTLnBhdGg9bnQodS5wYXRofHwiIiksUy5xdWVyeT11LnF1ZXJ5KToodS5wYXRoPyh1LnBhdGguY2hhckF0KDApPT09Ii8iP1MucGF0aD1udCh1LnBhdGgpOigoZC51c2VyaW5mbyE9PXZvaWQgMHx8ZC5ob3N0IT09dm9pZCAwfHxkLnBvcnQhPT12b2lkIDApJiYhZC5wYXRoP1MucGF0aD0iLyIrdS5wYXRoOmQucGF0aD9TLnBhdGg9ZC5wYXRoLnNsaWNlKDAsZC5wYXRoLmxhc3RJbmRleE9mKCIvIikrMSkrdS5wYXRoOlMucGF0aD11LnBhdGgsUy5wYXRoPW50KFMucGF0aCkpLFMucXVlcnk9dS5xdWVyeSk6KFMucGF0aD1kLnBhdGgsdS5xdWVyeSE9PXZvaWQgMD9TLnF1ZXJ5PXUucXVlcnk6Uy5xdWVyeT1kLnF1ZXJ5KSxTLnVzZXJpbmZvPWQudXNlcmluZm8sUy5ob3N0PWQuaG9zdCxTLnBvcnQ9ZC5wb3J0KSxTLnNjaGVtZT1kLnNjaGVtZSksUy5mcmFnbWVudD11LmZyYWdtZW50LFN9ZnVuY3Rpb24genIoZCx1LHYpe3ZhciBSPWYoe3NjaGVtZToibnVsbCJ9LHYpO3JldHVybiBrZShwcihNZShkLFIpLE1lKHUsUiksUiwhMCksUil9ZnVuY3Rpb24gQnQoZCx1KXtyZXR1cm4gdHlwZW9mIGQ9PSJzdHJpbmciP2Q9a2UoTWUoZCx1KSx1KTphKGQpPT09Im9iamVjdCImJihkPU1lKGtlKGQsdSksdSkpLGR9ZnVuY3Rpb24gSHIoZCx1LHYpe3JldHVybiB0eXBlb2YgZD09InN0cmluZyI/ZD1rZShNZShkLHYpLHYpOmEoZCk9PT0ib2JqZWN0IiYmKGQ9a2UoZCx2KSksdHlwZW9mIHU9PSJzdHJpbmciP3U9a2UoTWUodSx2KSx2KTphKHUpPT09Im9iamVjdCImJih1PWtlKHUsdikpLGQ9PT11fWZ1bmN0aW9uIHduKGQsdSl7cmV0dXJuIGQmJmQudG9TdHJpbmcoKS5yZXBsYWNlKCF1fHwhdS5pcmk/aS5FU0NBUEU6aC5FU0NBUEUsRil9ZnVuY3Rpb24gSmUoZCx1KXtyZXR1cm4gZCYmZC50b1N0cmluZygpLnJlcGxhY2UoIXV8fCF1LmlyaT9pLlBDVF9FTkNPREVEOmguUENUX0VOQ09ERUQsWil9dmFyIEp0PXtzY2hlbWU6Imh0dHAiLGRvbWFpbkhvc3Q6ITAscGFyc2U6ZnVuY3Rpb24odSx2KXtyZXR1cm4gdS5ob3N0fHwodS5lcnJvcj11LmVycm9yfHwiSFRUUCBVUklzIG11c3QgaGF2ZSBhIGhvc3QuIiksdX0sc2VyaWFsaXplOmZ1bmN0aW9uKHUsdil7dmFyIFI9U3RyaW5nKHUuc2NoZW1lKS50b0xvd2VyQ2FzZSgpPT09Imh0dHBzIjtyZXR1cm4odS5wb3J0PT09KFI/NDQzOjgwKXx8dS5wb3J0PT09IiIpJiYodS5wb3J0PXZvaWQgMCksdS5wYXRofHwodS5wYXRoPSIvIiksdX19LFBvPXtzY2hlbWU6Imh0dHBzIixkb21haW5Ib3N0Okp0LmRvbWFpbkhvc3QscGFyc2U6SnQucGFyc2Usc2VyaWFsaXplOkp0LnNlcmlhbGl6ZX07ZnVuY3Rpb24gVG8oZCl7cmV0dXJuIHR5cGVvZiBkLnNlY3VyZT09ImJvb2xlYW4iP2Quc2VjdXJlOlN0cmluZyhkLnNjaGVtZSkudG9Mb3dlckNhc2UoKT09PSJ3c3MifXZhciBLcj17c2NoZW1lOiJ3cyIsZG9tYWluSG9zdDohMCxwYXJzZTpmdW5jdGlvbih1LHYpe3ZhciBSPXU7cmV0dXJuIFIuc2VjdXJlPVRvKFIpLFIucmVzb3VyY2VOYW1lPShSLnBhdGh8fCIvIikrKFIucXVlcnk/Ij8iK1IucXVlcnk6IiIpLFIucGF0aD12b2lkIDAsUi5xdWVyeT12b2lkIDAsUn0sc2VyaWFsaXplOmZ1bmN0aW9uKHUsdil7aWYoKHUucG9ydD09PShUbyh1KT80NDM6ODApfHx1LnBvcnQ9PT0iIikmJih1LnBvcnQ9dm9pZCAwKSx0eXBlb2YgdS5zZWN1cmU9PSJib29sZWFuIiYmKHUuc2NoZW1lPXUuc2VjdXJlPyJ3c3MiOiJ3cyIsdS5zZWN1cmU9dm9pZCAwKSx1LnJlc291cmNlTmFtZSl7dmFyIFI9dS5yZXNvdXJjZU5hbWUuc3BsaXQoIj8iKSxTPUUoUiwyKSx6PVNbMF0sSz1TWzFdO3UucGF0aD16JiZ6IT09Ii8iP3o6dm9pZCAwLHUucXVlcnk9Syx1LnJlc291cmNlTmFtZT12b2lkIDB9cmV0dXJuIHUuZnJhZ21lbnQ9dm9pZCAwLHV9fSxBbz17c2NoZW1lOiJ3c3MiLGRvbWFpbkhvc3Q6S3IuZG9tYWluSG9zdCxwYXJzZTpLci5wYXJzZSxzZXJpYWxpemU6S3Iuc2VyaWFsaXplfSxXZj17fSxDbz0iW0EtWmEtejAtOVxcLVxcLlxcX1xcflxceEEwLVxcdTIwMERcXHUyMDEwLVxcdTIwMjlcXHUyMDJGLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdIixzdD0iWzAtOUEtRmEtZl0iLFhmPXMocygiJVtFRmVmXSIrc3QrIiUiK3N0K3N0KyIlIitzdCtzdCkrInwiK3MoIiVbODlBLUZhLWZdIitzdCsiJSIrc3Qrc3QpKyJ8IitzKCIlIitzdCtzdCkpLFpmPSJbQS1aYS16MC05XFwhXFwkXFwlXFwnXFwqXFwrXFwtXFxeXFxfXFxgXFx7XFx8XFx9XFx+XSIseGY9IltcXCFcXCRcXCVcXCdcXChcXClcXCpcXCtcXCxcXC1cXC4wLTlcXDxcXD5BLVpcXHg1RS1cXHg3RV0iLGVkPW4oeGYsJ1tcXCJcXFxcXScpLHRkPSJbXFwhXFwkXFwnXFwoXFwpXFwqXFwrXFwsXFw7XFw6XFxAXSIscmQ9bmV3IFJlZ0V4cChDbywiZyIpLG1yPW5ldyBSZWdFeHAoWGYsImciKSxuZD1uZXcgUmVnRXhwKG4oIlteXSIsWmYsIltcXC5dIiwnW1xcIl0nLGVkKSwiZyIpLElvPW5ldyBSZWdFeHAobigiW15dIixDbyx0ZCksImciKSxzZD1JbztmdW5jdGlvbiBicyhkKXt2YXIgdT1aKGQpO3JldHVybiB1Lm1hdGNoKHJkKT91OmR9dmFyIERvPXtzY2hlbWU6Im1haWx0byIscGFyc2U6ZnVuY3Rpb24odSx2KXt2YXIgUj11LFM9Ui50bz1SLnBhdGg/Ui5wYXRoLnNwbGl0KCIsIik6W107aWYoUi5wYXRoPXZvaWQgMCxSLnF1ZXJ5KXtmb3IodmFyIHo9ITEsSz17fSxzZT1SLnF1ZXJ5LnNwbGl0KCImIiksbWU9MCwkZT1zZS5sZW5ndGg7bWU8JGU7KyttZSl7dmFyIHg9c2VbbWVdLnNwbGl0KCI9Iik7c3dpdGNoKHhbMF0pe2Nhc2UidG8iOmZvcih2YXIgZmU9eFsxXS5zcGxpdCgiLCIpLHdlPTAscT1mZS5sZW5ndGg7d2U8cTsrK3dlKVMucHVzaChmZVt3ZV0pO2JyZWFrO2Nhc2Uic3ViamVjdCI6Ui5zdWJqZWN0PUplKHhbMV0sdik7YnJlYWs7Y2FzZSJib2R5IjpSLmJvZHk9SmUoeFsxXSx2KTticmVhaztkZWZhdWx0Ono9ITAsS1tKZSh4WzBdLHYpXT1KZSh4WzFdLHYpO2JyZWFrfX16JiYoUi5oZWFkZXJzPUspfVIucXVlcnk9dm9pZCAwO2Zvcih2YXIgX2U9MCxSZT1TLmxlbmd0aDtfZTxSZTsrK19lKXt2YXIgZ2U9U1tfZV0uc3BsaXQoIkAiKTtpZihnZVswXT1KZShnZVswXSksdi51bmljb2RlU3VwcG9ydClnZVsxXT1KZShnZVsxXSx2KS50b0xvd2VyQ2FzZSgpO2Vsc2UgdHJ5e2dlWzFdPVAudG9BU0NJSShKZShnZVsxXSx2KS50b0xvd2VyQ2FzZSgpKX1jYXRjaChQdCl7Ui5lcnJvcj1SLmVycm9yfHwiRW1haWwgYWRkcmVzcydzIGRvbWFpbiBuYW1lIGNhbiBub3QgYmUgY29udmVydGVkIHRvIEFTQ0lJIHZpYSBwdW55Y29kZTogIitQdH1TW19lXT1nZS5qb2luKCJAIil9cmV0dXJuIFJ9LHNlcmlhbGl6ZTpmdW5jdGlvbih1LHYpe3ZhciBSPXUsUz1sKHUudG8pO2lmKFMpe2Zvcih2YXIgej0wLEs9Uy5sZW5ndGg7ejxLOysreil7dmFyIHNlPVN0cmluZyhTW3pdKSxtZT1zZS5sYXN0SW5kZXhPZigiQCIpLCRlPXNlLnNsaWNlKDAsbWUpLnJlcGxhY2UobXIsYnMpLnJlcGxhY2UobXIsbykucmVwbGFjZShuZCxGKSx4PXNlLnNsaWNlKG1lKzEpO3RyeXt4PXYuaXJpP1AudG9Vbmljb2RlKHgpOlAudG9BU0NJSShKZSh4LHYpLnRvTG93ZXJDYXNlKCkpfWNhdGNoKF9lKXtSLmVycm9yPVIuZXJyb3J8fCJFbWFpbCBhZGRyZXNzJ3MgZG9tYWluIG5hbWUgY2FuIG5vdCBiZSBjb252ZXJ0ZWQgdG8gIisodi5pcmk/IlVuaWNvZGUiOiJBU0NJSSIpKyIgdmlhIHB1bnljb2RlOiAiK19lfVNbel09JGUrIkAiK3h9Ui5wYXRoPVMuam9pbigiLCIpfXZhciBmZT11LmhlYWRlcnM9dS5oZWFkZXJzfHx7fTt1LnN1YmplY3QmJihmZS5zdWJqZWN0PXUuc3ViamVjdCksdS5ib2R5JiYoZmUuYm9keT11LmJvZHkpO3ZhciB3ZT1bXTtmb3IodmFyIHEgaW4gZmUpZmVbcV0hPT1XZltxXSYmd2UucHVzaChxLnJlcGxhY2UobXIsYnMpLnJlcGxhY2UobXIsbykucmVwbGFjZShJbyxGKSsiPSIrZmVbcV0ucmVwbGFjZShtcixicykucmVwbGFjZShtcixvKS5yZXBsYWNlKHNkLEYpKTtyZXR1cm4gd2UubGVuZ3RoJiYoUi5xdWVyeT13ZS5qb2luKCImIikpLFJ9fSxhZD0vXihbXlw6XSspXDooLiopLyxqbz17c2NoZW1lOiJ1cm4iLHBhcnNlOmZ1bmN0aW9uKHUsdil7dmFyIFI9dS5wYXRoJiZ1LnBhdGgubWF0Y2goYWQpLFM9dTtpZihSKXt2YXIgej12LnNjaGVtZXx8Uy5zY2hlbWV8fCJ1cm4iLEs9UlsxXS50b0xvd2VyQ2FzZSgpLHNlPVJbMl0sbWU9eisiOiIrKHYubmlkfHxLKSwkZT1VW21lXTtTLm5pZD1LLFMubnNzPXNlLFMucGF0aD12b2lkIDAsJGUmJihTPSRlLnBhcnNlKFMsdikpfWVsc2UgUy5lcnJvcj1TLmVycm9yfHwiVVJOIGNhbiBub3QgYmUgcGFyc2VkLiI7cmV0dXJuIFN9LHNlcmlhbGl6ZTpmdW5jdGlvbih1LHYpe3ZhciBSPXYuc2NoZW1lfHx1LnNjaGVtZXx8InVybiIsUz11Lm5pZCx6PVIrIjoiKyh2Lm5pZHx8UyksSz1VW3pdO0smJih1PUsuc2VyaWFsaXplKHUsdikpO3ZhciBzZT11LG1lPXUubnNzO3JldHVybiBzZS5wYXRoPShTfHx2Lm5pZCkrIjoiK21lLHNlfX0sb2Q9L15bMC05QS1GYS1mXXs4fSg/OlwtWzAtOUEtRmEtZl17NH0pezN9XC1bMC05QS1GYS1mXXsxMn0kLyxrbz17c2NoZW1lOiJ1cm46dXVpZCIscGFyc2U6ZnVuY3Rpb24odSx2KXt2YXIgUj11O3JldHVybiBSLnV1aWQ9Ui5uc3MsUi5uc3M9dm9pZCAwLCF2LnRvbGVyYW50JiYoIVIudXVpZHx8IVIudXVpZC5tYXRjaChvZCkpJiYoUi5lcnJvcj1SLmVycm9yfHwiVVVJRCBpcyBub3QgdmFsaWQuIiksUn0sc2VyaWFsaXplOmZ1bmN0aW9uKHUsdil7dmFyIFI9dTtyZXR1cm4gUi5uc3M9KHUudXVpZHx8IiIpLnRvTG93ZXJDYXNlKCksUn19O1VbSnQuc2NoZW1lXT1KdCxVW1BvLnNjaGVtZV09UG8sVVtLci5zY2hlbWVdPUtyLFVbQW8uc2NoZW1lXT1BbyxVW0RvLnNjaGVtZV09RG8sVVtqby5zY2hlbWVdPWpvLFVba28uc2NoZW1lXT1rbyxyLlNDSEVNRVM9VSxyLnBjdEVuY0NoYXI9RixyLnBjdERlY0NoYXJzPVosci5wYXJzZT1NZSxyLnJlbW92ZURvdFNlZ21lbnRzPW50LHIuc2VyaWFsaXplPWtlLHIucmVzb2x2ZUNvbXBvbmVudHM9cHIsci5yZXNvbHZlPXpyLHIubm9ybWFsaXplPUJ0LHIuZXF1YWw9SHIsci5lc2NhcGVDb21wb25lbnQ9d24sci51bmVzY2FwZUNvbXBvbmVudD1KZSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9KX0pKGVzLGVzLmV4cG9ydHMpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh4biwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y29uc3QgRGE9ZXMuZXhwb3J0cztEYS5jb2RlPSdyZXF1aXJlKCJhanYvZGlzdC9ydW50aW1lL3VyaSIpLmRlZmF1bHQnLHhuLmRlZmF1bHQ9RGEsZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuQ29kZUdlbj1lLk5hbWU9ZS5uaWw9ZS5zdHJpbmdpZnk9ZS5zdHI9ZS5fPWUuS2V5d29yZEN4dD12b2lkIDA7dmFyIHQ9V2U7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIktleXdvcmRDeHQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0LktleXdvcmRDeHR9fSk7dmFyIHI9dWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl8iLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiByLl99fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInN0ciIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHIuc3RyfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJzdHJpbmdpZnkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiByLnN0cmluZ2lmeX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwibmlsIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5uaWx9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIk5hbWUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiByLk5hbWV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIkNvZGVHZW4iLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiByLkNvZGVHZW59fSk7Y29uc3Qgbj1jbixzPWt0LGE9RHQsbz1DZSxsPXVlLGY9VGUscD1ubixpPWJlLGg9enUsRT14bixUPShrLGcpPT5uZXcgUmVnRXhwKGssZyk7VC5jb2RlPSJuZXcgUmVnRXhwIjtjb25zdCBJPVsicmVtb3ZlQWRkaXRpb25hbCIsInVzZURlZmF1bHRzIiwiY29lcmNlVHlwZXMiXSxqPW5ldyBTZXQoWyJ2YWxpZGF0ZSIsInNlcmlhbGl6ZSIsInBhcnNlIiwid3JhcHBlciIsInJvb3QiLCJzY2hlbWEiLCJrZXl3b3JkIiwicGF0dGVybiIsImZvcm1hdHMiLCJ2YWxpZGF0ZSRkYXRhIiwiZnVuYyIsIm9iaiIsIkVycm9yIl0pLHk9e2Vycm9yRGF0YVBhdGg6IiIsZm9ybWF0OiJgdmFsaWRhdGVGb3JtYXRzOiBmYWxzZWAgY2FuIGJlIHVzZWQgaW5zdGVhZC4iLG51bGxhYmxlOicibnVsbGFibGUiIGtleXdvcmQgaXMgc3VwcG9ydGVkIGJ5IGRlZmF1bHQuJyxqc29uUG9pbnRlcnM6IkRlcHJlY2F0ZWQganNQcm9wZXJ0eVN5bnRheCBjYW4gYmUgdXNlZCBpbnN0ZWFkLiIsZXh0ZW5kUmVmczoiRGVwcmVjYXRlZCBpZ25vcmVLZXl3b3Jkc1dpdGhSZWYgY2FuIGJlIHVzZWQgaW5zdGVhZC4iLG1pc3NpbmdSZWZzOiJQYXNzIGVtcHR5IHNjaGVtYSB3aXRoICRpZCB0aGF0IHNob3VsZCBiZSBpZ25vcmVkIHRvIGFqdi5hZGRTY2hlbWEuIixwcm9jZXNzQ29kZToiVXNlIG9wdGlvbiBgY29kZToge3Byb2Nlc3M6IChjb2RlLCBzY2hlbWFFbnY6IG9iamVjdCkgPT4gc3RyaW5nfWAiLHNvdXJjZUNvZGU6IlVzZSBvcHRpb24gYGNvZGU6IHtzb3VyY2U6IHRydWV9YCIsc3RyaWN0RGVmYXVsdHM6Ikl0IGlzIGRlZmF1bHQgbm93LCBzZWUgb3B0aW9uIGBzdHJpY3RgLiIsc3RyaWN0S2V5d29yZHM6Ikl0IGlzIGRlZmF1bHQgbm93LCBzZWUgb3B0aW9uIGBzdHJpY3RgLiIsdW5pcXVlSXRlbXM6JyJ1bmlxdWVJdGVtcyIga2V5d29yZCBpcyBhbHdheXMgdmFsaWRhdGVkLicsdW5rbm93bkZvcm1hdHM6IkRpc2FibGUgc3RyaWN0IG1vZGUgb3IgcGFzcyBgdHJ1ZWAgdG8gYGFqdi5hZGRGb3JtYXRgIChvciBgZm9ybWF0c2Agb3B0aW9uKS4iLGNhY2hlOiJNYXAgaXMgdXNlZCBhcyBjYWNoZSwgc2NoZW1hIG9iamVjdCBhcyBrZXkuIixzZXJpYWxpemU6Ik1hcCBpcyB1c2VkIGFzIGNhY2hlLCBzY2hlbWEgb2JqZWN0IGFzIGtleS4iLGFqdkVycm9yczoiSXQgaXMgZGVmYXVsdCBub3cuIn0sXz17aWdub3JlS2V5d29yZHNXaXRoUmVmOiIiLGpzUHJvcGVydHlTeW50YXg6IiIsdW5pY29kZTonIm1pbkxlbmd0aCIvIm1heExlbmd0aCIgYWNjb3VudCBmb3IgdW5pY29kZSBjaGFyYWN0ZXJzIGJ5IGRlZmF1bHQuJ30sYj0yMDA7ZnVuY3Rpb24gTyhrKXt2YXIgZyxDLHcsYyxtLFAsVSxGLFoscmUseWUscnQsbHIsRnIsTXIsTWUsTHIsZnIsZHIsaHIsVnIsbnQsa2UscHIsenI7Y29uc3QgQnQ9ay5zdHJpY3QsSHI9KGc9ay5jb2RlKT09PW51bGx8fGc9PT12b2lkIDA/dm9pZCAwOmcub3B0aW1pemUsd249SHI9PT0hMHx8SHI9PT12b2lkIDA/MTpIcnx8MCxKZT0odz0oQz1rLmNvZGUpPT09bnVsbHx8Qz09PXZvaWQgMD92b2lkIDA6Qy5yZWdFeHApIT09bnVsbCYmdyE9PXZvaWQgMD93OlQsSnQ9KGM9ay51cmlSZXNvbHZlcikhPT1udWxsJiZjIT09dm9pZCAwP2M6RS5kZWZhdWx0O3JldHVybntzdHJpY3RTY2hlbWE6KFA9KG09ay5zdHJpY3RTY2hlbWEpIT09bnVsbCYmbSE9PXZvaWQgMD9tOkJ0KSE9PW51bGwmJlAhPT12b2lkIDA/UDohMCxzdHJpY3ROdW1iZXJzOihGPShVPWsuc3RyaWN0TnVtYmVycykhPT1udWxsJiZVIT09dm9pZCAwP1U6QnQpIT09bnVsbCYmRiE9PXZvaWQgMD9GOiEwLHN0cmljdFR5cGVzOihyZT0oWj1rLnN0cmljdFR5cGVzKSE9PW51bGwmJlohPT12b2lkIDA/WjpCdCkhPT1udWxsJiZyZSE9PXZvaWQgMD9yZToibG9nIixzdHJpY3RUdXBsZXM6KHJ0PSh5ZT1rLnN0cmljdFR1cGxlcykhPT1udWxsJiZ5ZSE9PXZvaWQgMD95ZTpCdCkhPT1udWxsJiZydCE9PXZvaWQgMD9ydDoibG9nIixzdHJpY3RSZXF1aXJlZDooRnI9KGxyPWsuc3RyaWN0UmVxdWlyZWQpIT09bnVsbCYmbHIhPT12b2lkIDA/bHI6QnQpIT09bnVsbCYmRnIhPT12b2lkIDA/RnI6ITEsY29kZTprLmNvZGU/bGUoUSh7fSxrLmNvZGUpLHtvcHRpbWl6ZTp3bixyZWdFeHA6SmV9KTp7b3B0aW1pemU6d24scmVnRXhwOkplfSxsb29wUmVxdWlyZWQ6KE1yPWsubG9vcFJlcXVpcmVkKSE9PW51bGwmJk1yIT09dm9pZCAwP01yOmIsbG9vcEVudW06KE1lPWsubG9vcEVudW0pIT09bnVsbCYmTWUhPT12b2lkIDA/TWU6YixtZXRhOihMcj1rLm1ldGEpIT09bnVsbCYmTHIhPT12b2lkIDA/THI6ITAsbWVzc2FnZXM6KGZyPWsubWVzc2FnZXMpIT09bnVsbCYmZnIhPT12b2lkIDA/ZnI6ITAsaW5saW5lUmVmczooZHI9ay5pbmxpbmVSZWZzKSE9PW51bGwmJmRyIT09dm9pZCAwP2RyOiEwLHNjaGVtYUlkOihocj1rLnNjaGVtYUlkKSE9PW51bGwmJmhyIT09dm9pZCAwP2hyOiIkaWQiLGFkZFVzZWRTY2hlbWE6KFZyPWsuYWRkVXNlZFNjaGVtYSkhPT1udWxsJiZWciE9PXZvaWQgMD9WcjohMCx2YWxpZGF0ZVNjaGVtYToobnQ9ay52YWxpZGF0ZVNjaGVtYSkhPT1udWxsJiZudCE9PXZvaWQgMD9udDohMCx2YWxpZGF0ZUZvcm1hdHM6KGtlPWsudmFsaWRhdGVGb3JtYXRzKSE9PW51bGwmJmtlIT09dm9pZCAwP2tlOiEwLHVuaWNvZGVSZWdFeHA6KHByPWsudW5pY29kZVJlZ0V4cCkhPT1udWxsJiZwciE9PXZvaWQgMD9wcjohMCxpbnQzMnJhbmdlOih6cj1rLmludDMycmFuZ2UpIT09bnVsbCYmenIhPT12b2lkIDA/enI6ITAsdXJpUmVzb2x2ZXI6SnR9fWNsYXNzIEF7Y29uc3RydWN0b3IoZz17fSl7dGhpcy5zY2hlbWFzPXt9LHRoaXMucmVmcz17fSx0aGlzLmZvcm1hdHM9e30sdGhpcy5fY29tcGlsYXRpb25zPW5ldyBTZXQsdGhpcy5fbG9hZGluZz17fSx0aGlzLl9jYWNoZT1uZXcgTWFwLGc9dGhpcy5vcHRzPVEoUSh7fSxnKSxPKGcpKTtjb25zdHtlczU6QyxsaW5lczp3fT10aGlzLm9wdHMuY29kZTt0aGlzLnNjb3BlPW5ldyBsLlZhbHVlU2NvcGUoe3Njb3BlOnt9LHByZWZpeGVzOmosZXM1OkMsbGluZXM6d30pLHRoaXMubG9nZ2VyPVcoZy5sb2dnZXIpO2NvbnN0IGM9Zy52YWxpZGF0ZUZvcm1hdHM7Zy52YWxpZGF0ZUZvcm1hdHM9ITEsdGhpcy5SVUxFUz0oMCxhLmdldFJ1bGVzKSgpLEguY2FsbCh0aGlzLHksZywiTk9UIFNVUFBPUlRFRCIpLEguY2FsbCh0aGlzLF8sZywiREVQUkVDQVRFRCIsIndhcm4iKSx0aGlzLl9tZXRhT3B0cz1HLmNhbGwodGhpcyksZy5mb3JtYXRzJiZELmNhbGwodGhpcyksdGhpcy5fYWRkVm9jYWJ1bGFyaWVzKCksdGhpcy5fYWRkRGVmYXVsdE1ldGFTY2hlbWEoKSxnLmtleXdvcmRzJiZCLmNhbGwodGhpcyxnLmtleXdvcmRzKSx0eXBlb2YgZy5tZXRhPT0ib2JqZWN0IiYmdGhpcy5hZGRNZXRhU2NoZW1hKGcubWV0YSksTi5jYWxsKHRoaXMpLGcudmFsaWRhdGVGb3JtYXRzPWN9X2FkZFZvY2FidWxhcmllcygpe3RoaXMuYWRkS2V5d29yZCgiJGFzeW5jIil9X2FkZERlZmF1bHRNZXRhU2NoZW1hKCl7Y29uc3R7JGRhdGE6ZyxtZXRhOkMsc2NoZW1hSWQ6d309dGhpcy5vcHRzO2xldCBjPWg7dz09PSJpZCImJihjPVEoe30saCksYy5pZD1jLiRpZCxkZWxldGUgYy4kaWQpLEMmJmcmJnRoaXMuYWRkTWV0YVNjaGVtYShjLGNbd10sITEpfWRlZmF1bHRNZXRhKCl7Y29uc3R7bWV0YTpnLHNjaGVtYUlkOkN9PXRoaXMub3B0cztyZXR1cm4gdGhpcy5vcHRzLmRlZmF1bHRNZXRhPXR5cGVvZiBnPT0ib2JqZWN0Ij9nW0NdfHxnOnZvaWQgMH12YWxpZGF0ZShnLEMpe2xldCB3O2lmKHR5cGVvZiBnPT0ic3RyaW5nIil7aWYodz10aGlzLmdldFNjaGVtYShnKSwhdyl0aHJvdyBuZXcgRXJyb3IoYG5vIHNjaGVtYSB3aXRoIGtleSBvciByZWYgIiR7Z30iYCl9ZWxzZSB3PXRoaXMuY29tcGlsZShnKTtjb25zdCBjPXcoQyk7cmV0dXJuIiRhc3luYyJpbiB3fHwodGhpcy5lcnJvcnM9dy5lcnJvcnMpLGN9Y29tcGlsZShnLEMpe2NvbnN0IHc9dGhpcy5fYWRkU2NoZW1hKGcsQyk7cmV0dXJuIHcudmFsaWRhdGV8fHRoaXMuX2NvbXBpbGVTY2hlbWFFbnYodyl9Y29tcGlsZUFzeW5jKGcsQyl7aWYodHlwZW9mIHRoaXMub3B0cy5sb2FkU2NoZW1hIT0iZnVuY3Rpb24iKXRocm93IG5ldyBFcnJvcigib3B0aW9ucy5sb2FkU2NoZW1hIHNob3VsZCBiZSBhIGZ1bmN0aW9uIik7Y29uc3R7bG9hZFNjaGVtYTp3fT10aGlzLm9wdHM7cmV0dXJuIGMuY2FsbCh0aGlzLGcsQyk7YXN5bmMgZnVuY3Rpb24gYyhyZSx5ZSl7YXdhaXQgbS5jYWxsKHRoaXMscmUuJHNjaGVtYSk7Y29uc3QgcnQ9dGhpcy5fYWRkU2NoZW1hKHJlLHllKTtyZXR1cm4gcnQudmFsaWRhdGV8fFAuY2FsbCh0aGlzLHJ0KX1hc3luYyBmdW5jdGlvbiBtKHJlKXtyZSYmIXRoaXMuZ2V0U2NoZW1hKHJlKSYmYXdhaXQgYy5jYWxsKHRoaXMseyRyZWY6cmV9LCEwKX1hc3luYyBmdW5jdGlvbiBQKHJlKXt0cnl7cmV0dXJuIHRoaXMuX2NvbXBpbGVTY2hlbWFFbnYocmUpfWNhdGNoKHllKXtpZighKHllIGluc3RhbmNlb2Ygcy5kZWZhdWx0KSl0aHJvdyB5ZTtyZXR1cm4gVS5jYWxsKHRoaXMseWUpLGF3YWl0IEYuY2FsbCh0aGlzLHllLm1pc3NpbmdTY2hlbWEpLFAuY2FsbCh0aGlzLHJlKX19ZnVuY3Rpb24gVSh7bWlzc2luZ1NjaGVtYTpyZSxtaXNzaW5nUmVmOnllfSl7aWYodGhpcy5yZWZzW3JlXSl0aHJvdyBuZXcgRXJyb3IoYEFueVNjaGVtYSAke3JlfSBpcyBsb2FkZWQgYnV0ICR7eWV9IGNhbm5vdCBiZSByZXNvbHZlZGApfWFzeW5jIGZ1bmN0aW9uIEYocmUpe2NvbnN0IHllPWF3YWl0IFouY2FsbCh0aGlzLHJlKTt0aGlzLnJlZnNbcmVdfHxhd2FpdCBtLmNhbGwodGhpcyx5ZS4kc2NoZW1hKSx0aGlzLnJlZnNbcmVdfHx0aGlzLmFkZFNjaGVtYSh5ZSxyZSxDKX1hc3luYyBmdW5jdGlvbiBaKHJlKXtjb25zdCB5ZT10aGlzLl9sb2FkaW5nW3JlXTtpZih5ZSlyZXR1cm4geWU7dHJ5e3JldHVybiBhd2FpdCh0aGlzLl9sb2FkaW5nW3JlXT13KHJlKSl9ZmluYWxseXtkZWxldGUgdGhpcy5fbG9hZGluZ1tyZV19fX1hZGRTY2hlbWEoZyxDLHcsYz10aGlzLm9wdHMudmFsaWRhdGVTY2hlbWEpe2lmKEFycmF5LmlzQXJyYXkoZykpe2Zvcihjb25zdCBQIG9mIGcpdGhpcy5hZGRTY2hlbWEoUCx2b2lkIDAsdyxjKTtyZXR1cm4gdGhpc31sZXQgbTtpZih0eXBlb2YgZz09Im9iamVjdCIpe2NvbnN0e3NjaGVtYUlkOlB9PXRoaXMub3B0cztpZihtPWdbUF0sbSE9PXZvaWQgMCYmdHlwZW9mIG0hPSJzdHJpbmciKXRocm93IG5ldyBFcnJvcihgc2NoZW1hICR7UH0gbXVzdCBiZSBzdHJpbmdgKX1yZXR1cm4gQz0oMCxmLm5vcm1hbGl6ZUlkKShDfHxtKSx0aGlzLl9jaGVja1VuaXF1ZShDKSx0aGlzLnNjaGVtYXNbQ109dGhpcy5fYWRkU2NoZW1hKGcsdyxDLGMsITApLHRoaXN9YWRkTWV0YVNjaGVtYShnLEMsdz10aGlzLm9wdHMudmFsaWRhdGVTY2hlbWEpe3JldHVybiB0aGlzLmFkZFNjaGVtYShnLEMsITAsdyksdGhpc312YWxpZGF0ZVNjaGVtYShnLEMpe2lmKHR5cGVvZiBnPT0iYm9vbGVhbiIpcmV0dXJuITA7bGV0IHc7aWYodz1nLiRzY2hlbWEsdyE9PXZvaWQgMCYmdHlwZW9mIHchPSJzdHJpbmciKXRocm93IG5ldyBFcnJvcigiJHNjaGVtYSBtdXN0IGJlIGEgc3RyaW5nIik7aWYodz13fHx0aGlzLm9wdHMuZGVmYXVsdE1ldGF8fHRoaXMuZGVmYXVsdE1ldGEoKSwhdylyZXR1cm4gdGhpcy5sb2dnZXIud2FybigibWV0YS1zY2hlbWEgbm90IGF2YWlsYWJsZSIpLHRoaXMuZXJyb3JzPW51bGwsITA7Y29uc3QgYz10aGlzLnZhbGlkYXRlKHcsZyk7aWYoIWMmJkMpe2NvbnN0IG09InNjaGVtYSBpcyBpbnZhbGlkOiAiK3RoaXMuZXJyb3JzVGV4dCgpO2lmKHRoaXMub3B0cy52YWxpZGF0ZVNjaGVtYT09PSJsb2ciKXRoaXMubG9nZ2VyLmVycm9yKG0pO2Vsc2UgdGhyb3cgbmV3IEVycm9yKG0pfXJldHVybiBjfWdldFNjaGVtYShnKXtsZXQgQztmb3IoO3R5cGVvZihDPSQuY2FsbCh0aGlzLGcpKT09InN0cmluZyI7KWc9QztpZihDPT09dm9pZCAwKXtjb25zdHtzY2hlbWFJZDp3fT10aGlzLm9wdHMsYz1uZXcgby5TY2hlbWFFbnYoe3NjaGVtYTp7fSxzY2hlbWFJZDp3fSk7aWYoQz1vLnJlc29sdmVTY2hlbWEuY2FsbCh0aGlzLGMsZyksIUMpcmV0dXJuO3RoaXMucmVmc1tnXT1DfXJldHVybiBDLnZhbGlkYXRlfHx0aGlzLl9jb21waWxlU2NoZW1hRW52KEMpfXJlbW92ZVNjaGVtYShnKXtpZihnIGluc3RhbmNlb2YgUmVnRXhwKXJldHVybiB0aGlzLl9yZW1vdmVBbGxTY2hlbWFzKHRoaXMuc2NoZW1hcyxnKSx0aGlzLl9yZW1vdmVBbGxTY2hlbWFzKHRoaXMucmVmcyxnKSx0aGlzO3N3aXRjaCh0eXBlb2YgZyl7Y2FzZSJ1bmRlZmluZWQiOnJldHVybiB0aGlzLl9yZW1vdmVBbGxTY2hlbWFzKHRoaXMuc2NoZW1hcyksdGhpcy5fcmVtb3ZlQWxsU2NoZW1hcyh0aGlzLnJlZnMpLHRoaXMuX2NhY2hlLmNsZWFyKCksdGhpcztjYXNlInN0cmluZyI6e2NvbnN0IEM9JC5jYWxsKHRoaXMsZyk7cmV0dXJuIHR5cGVvZiBDPT0ib2JqZWN0IiYmdGhpcy5fY2FjaGUuZGVsZXRlKEMuc2NoZW1hKSxkZWxldGUgdGhpcy5zY2hlbWFzW2ddLGRlbGV0ZSB0aGlzLnJlZnNbZ10sdGhpc31jYXNlIm9iamVjdCI6e2NvbnN0IEM9Zzt0aGlzLl9jYWNoZS5kZWxldGUoQyk7bGV0IHc9Z1t0aGlzLm9wdHMuc2NoZW1hSWRdO3JldHVybiB3JiYodz0oMCxmLm5vcm1hbGl6ZUlkKSh3KSxkZWxldGUgdGhpcy5zY2hlbWFzW3ddLGRlbGV0ZSB0aGlzLnJlZnNbd10pLHRoaXN9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImFqdi5yZW1vdmVTY2hlbWE6IGludmFsaWQgcGFyYW1ldGVyIil9fWFkZFZvY2FidWxhcnkoZyl7Zm9yKGNvbnN0IEMgb2YgZyl0aGlzLmFkZEtleXdvcmQoQyk7cmV0dXJuIHRoaXN9YWRkS2V5d29yZChnLEMpe2xldCB3O2lmKHR5cGVvZiBnPT0ic3RyaW5nIil3PWcsdHlwZW9mIEM9PSJvYmplY3QiJiYodGhpcy5sb2dnZXIud2FybigidGhlc2UgcGFyYW1ldGVycyBhcmUgZGVwcmVjYXRlZCwgc2VlIGRvY3MgZm9yIGFkZEtleXdvcmQiKSxDLmtleXdvcmQ9dyk7ZWxzZSBpZih0eXBlb2YgZz09Im9iamVjdCImJkM9PT12b2lkIDApe2lmKEM9Zyx3PUMua2V5d29yZCxBcnJheS5pc0FycmF5KHcpJiYhdy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJhZGRLZXl3b3Jkczoga2V5d29yZCBtdXN0IGJlIHN0cmluZyBvciBub24tZW1wdHkgYXJyYXkiKX1lbHNlIHRocm93IG5ldyBFcnJvcigiaW52YWxpZCBhZGRLZXl3b3JkcyBwYXJhbWV0ZXJzIik7aWYoWC5jYWxsKHRoaXMsdyxDKSwhQylyZXR1cm4oMCxpLmVhY2hJdGVtKSh3LG09PnZlLmNhbGwodGhpcyxtKSksdGhpcztOZS5jYWxsKHRoaXMsQyk7Y29uc3QgYz1sZShRKHt9LEMpLHt0eXBlOigwLHAuZ2V0SlNPTlR5cGVzKShDLnR5cGUpLHNjaGVtYVR5cGU6KDAscC5nZXRKU09OVHlwZXMpKEMuc2NoZW1hVHlwZSl9KTtyZXR1cm4oMCxpLmVhY2hJdGVtKSh3LGMudHlwZS5sZW5ndGg9PT0wP209PnZlLmNhbGwodGhpcyxtLGMpOm09PmMudHlwZS5mb3JFYWNoKFA9PnZlLmNhbGwodGhpcyxtLGMsUCkpKSx0aGlzfWdldEtleXdvcmQoZyl7Y29uc3QgQz10aGlzLlJVTEVTLmFsbFtnXTtyZXR1cm4gdHlwZW9mIEM9PSJvYmplY3QiP0MuZGVmaW5pdGlvbjohIUN9cmVtb3ZlS2V5d29yZChnKXtjb25zdHtSVUxFUzpDfT10aGlzO2RlbGV0ZSBDLmtleXdvcmRzW2ddLGRlbGV0ZSBDLmFsbFtnXTtmb3IoY29uc3QgdyBvZiBDLnJ1bGVzKXtjb25zdCBjPXcucnVsZXMuZmluZEluZGV4KG09Pm0ua2V5d29yZD09PWcpO2M+PTAmJncucnVsZXMuc3BsaWNlKGMsMSl9cmV0dXJuIHRoaXN9YWRkRm9ybWF0KGcsQyl7cmV0dXJuIHR5cGVvZiBDPT0ic3RyaW5nIiYmKEM9bmV3IFJlZ0V4cChDKSksdGhpcy5mb3JtYXRzW2ddPUMsdGhpc31lcnJvcnNUZXh0KGc9dGhpcy5lcnJvcnMse3NlcGFyYXRvcjpDPSIsICIsZGF0YVZhcjp3PSJkYXRhIn09e30pe3JldHVybiFnfHxnLmxlbmd0aD09PTA/Ik5vIGVycm9ycyI6Zy5tYXAoYz0+YCR7d30ke2MuaW5zdGFuY2VQYXRofSAke2MubWVzc2FnZX1gKS5yZWR1Y2UoKGMsbSk9PmMrQyttKX0kZGF0YU1ldGFTY2hlbWEoZyxDKXtjb25zdCB3PXRoaXMuUlVMRVMuYWxsO2c9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShnKSk7Zm9yKGNvbnN0IGMgb2YgQyl7Y29uc3QgbT1jLnNwbGl0KCIvIikuc2xpY2UoMSk7bGV0IFA9Zztmb3IoY29uc3QgVSBvZiBtKVA9UFtVXTtmb3IoY29uc3QgVSBpbiB3KXtjb25zdCBGPXdbVV07aWYodHlwZW9mIEYhPSJvYmplY3QiKWNvbnRpbnVlO2NvbnN0eyRkYXRhOlp9PUYuZGVmaW5pdGlvbixyZT1QW1VdO1omJnJlJiYoUFtVXT11cihyZSkpfX1yZXR1cm4gZ31fcmVtb3ZlQWxsU2NoZW1hcyhnLEMpe2Zvcihjb25zdCB3IGluIGcpe2NvbnN0IGM9Z1t3XTsoIUN8fEMudGVzdCh3KSkmJih0eXBlb2YgYz09InN0cmluZyI/ZGVsZXRlIGdbd106YyYmIWMubWV0YSYmKHRoaXMuX2NhY2hlLmRlbGV0ZShjLnNjaGVtYSksZGVsZXRlIGdbd10pKX19X2FkZFNjaGVtYShnLEMsdyxjPXRoaXMub3B0cy52YWxpZGF0ZVNjaGVtYSxtPXRoaXMub3B0cy5hZGRVc2VkU2NoZW1hKXtsZXQgUDtjb25zdHtzY2hlbWFJZDpVfT10aGlzLm9wdHM7aWYodHlwZW9mIGc9PSJvYmplY3QiKVA9Z1tVXTtlbHNle2lmKHRoaXMub3B0cy5qdGQpdGhyb3cgbmV3IEVycm9yKCJzY2hlbWEgbXVzdCBiZSBvYmplY3QiKTtpZih0eXBlb2YgZyE9ImJvb2xlYW4iKXRocm93IG5ldyBFcnJvcigic2NoZW1hIG11c3QgYmUgb2JqZWN0IG9yIGJvb2xlYW4iKX1sZXQgRj10aGlzLl9jYWNoZS5nZXQoZyk7aWYoRiE9PXZvaWQgMClyZXR1cm4gRjt3PSgwLGYubm9ybWFsaXplSWQpKFB8fHcpO2NvbnN0IFo9Zi5nZXRTY2hlbWFSZWZzLmNhbGwodGhpcyxnLHcpO3JldHVybiBGPW5ldyBvLlNjaGVtYUVudih7c2NoZW1hOmcsc2NoZW1hSWQ6VSxtZXRhOkMsYmFzZUlkOncsbG9jYWxSZWZzOlp9KSx0aGlzLl9jYWNoZS5zZXQoRi5zY2hlbWEsRiksbSYmIXcuc3RhcnRzV2l0aCgiIyIpJiYodyYmdGhpcy5fY2hlY2tVbmlxdWUodyksdGhpcy5yZWZzW3ddPUYpLGMmJnRoaXMudmFsaWRhdGVTY2hlbWEoZywhMCksRn1fY2hlY2tVbmlxdWUoZyl7aWYodGhpcy5zY2hlbWFzW2ddfHx0aGlzLnJlZnNbZ10pdGhyb3cgbmV3IEVycm9yKGBzY2hlbWEgd2l0aCBrZXkgb3IgaWQgIiR7Z30iIGFscmVhZHkgZXhpc3RzYCl9X2NvbXBpbGVTY2hlbWFFbnYoZyl7aWYoZy5tZXRhP3RoaXMuX2NvbXBpbGVNZXRhU2NoZW1hKGcpOm8uY29tcGlsZVNjaGVtYS5jYWxsKHRoaXMsZyksIWcudmFsaWRhdGUpdGhyb3cgbmV3IEVycm9yKCJhanYgaW1wbGVtZW50YXRpb24gZXJyb3IiKTtyZXR1cm4gZy52YWxpZGF0ZX1fY29tcGlsZU1ldGFTY2hlbWEoZyl7Y29uc3QgQz10aGlzLm9wdHM7dGhpcy5vcHRzPXRoaXMuX21ldGFPcHRzO3RyeXtvLmNvbXBpbGVTY2hlbWEuY2FsbCh0aGlzLGcpfWZpbmFsbHl7dGhpcy5vcHRzPUN9fX1lLmRlZmF1bHQ9QSxBLlZhbGlkYXRpb25FcnJvcj1uLmRlZmF1bHQsQS5NaXNzaW5nUmVmRXJyb3I9cy5kZWZhdWx0O2Z1bmN0aW9uIEgoayxnLEMsdz0iZXJyb3IiKXtmb3IoY29uc3QgYyBpbiBrKXtjb25zdCBtPWM7bSBpbiBnJiZ0aGlzLmxvZ2dlclt3XShgJHtDfTogb3B0aW9uICR7Y30uICR7a1ttXX1gKX19ZnVuY3Rpb24gJChrKXtyZXR1cm4gaz0oMCxmLm5vcm1hbGl6ZUlkKShrKSx0aGlzLnNjaGVtYXNba118fHRoaXMucmVmc1trXX1mdW5jdGlvbiBOKCl7Y29uc3Qgaz10aGlzLm9wdHMuc2NoZW1hcztpZighIWspaWYoQXJyYXkuaXNBcnJheShrKSl0aGlzLmFkZFNjaGVtYShrKTtlbHNlIGZvcihjb25zdCBnIGluIGspdGhpcy5hZGRTY2hlbWEoa1tnXSxnKX1mdW5jdGlvbiBEKCl7Zm9yKGNvbnN0IGsgaW4gdGhpcy5vcHRzLmZvcm1hdHMpe2NvbnN0IGc9dGhpcy5vcHRzLmZvcm1hdHNba107ZyYmdGhpcy5hZGRGb3JtYXQoayxnKX19ZnVuY3Rpb24gQihrKXtpZihBcnJheS5pc0FycmF5KGspKXt0aGlzLmFkZFZvY2FidWxhcnkoayk7cmV0dXJufXRoaXMubG9nZ2VyLndhcm4oImtleXdvcmRzIG9wdGlvbiBhcyBtYXAgaXMgZGVwcmVjYXRlZCwgcGFzcyBhcnJheSIpO2Zvcihjb25zdCBnIGluIGspe2NvbnN0IEM9a1tnXTtDLmtleXdvcmR8fChDLmtleXdvcmQ9ZyksdGhpcy5hZGRLZXl3b3JkKEMpfX1mdW5jdGlvbiBHKCl7Y29uc3Qgaz1RKHt9LHRoaXMub3B0cyk7Zm9yKGNvbnN0IGcgb2YgSSlkZWxldGUga1tnXTtyZXR1cm4ga31jb25zdCBwZT17bG9nKCl7fSx3YXJuKCl7fSxlcnJvcigpe319O2Z1bmN0aW9uIFcoayl7aWYoaz09PSExKXJldHVybiBwZTtpZihrPT09dm9pZCAwKXJldHVybiBjb25zb2xlO2lmKGsubG9nJiZrLndhcm4mJmsuZXJyb3IpcmV0dXJuIGs7dGhyb3cgbmV3IEVycm9yKCJsb2dnZXIgbXVzdCBpbXBsZW1lbnQgbG9nLCB3YXJuIGFuZCBlcnJvciBtZXRob2RzIil9Y29uc3Qgb2U9L15bYS16XyRdW2EtejAtOV8kOi1dKiQvaTtmdW5jdGlvbiBYKGssZyl7Y29uc3R7UlVMRVM6Q309dGhpcztpZigoMCxpLmVhY2hJdGVtKShrLHc9PntpZihDLmtleXdvcmRzW3ddKXRocm93IG5ldyBFcnJvcihgS2V5d29yZCAke3d9IGlzIGFscmVhZHkgZGVmaW5lZGApO2lmKCFvZS50ZXN0KHcpKXRocm93IG5ldyBFcnJvcihgS2V5d29yZCAke3d9IGhhcyBpbnZhbGlkIG5hbWVgKX0pLCEhZyYmZy4kZGF0YSYmISgiY29kZSJpbiBnfHwidmFsaWRhdGUiaW4gZykpdGhyb3cgbmV3IEVycm9yKCckZGF0YSBrZXl3b3JkIG11c3QgaGF2ZSAiY29kZSIgb3IgInZhbGlkYXRlIiBmdW5jdGlvbicpfWZ1bmN0aW9uIHZlKGssZyxDKXt2YXIgdztjb25zdCBjPWc9PW51bGw/dm9pZCAwOmcucG9zdDtpZihDJiZjKXRocm93IG5ldyBFcnJvcigna2V5d29yZCB3aXRoICJwb3N0IiBmbGFnIGNhbm5vdCBoYXZlICJ0eXBlIicpO2NvbnN0e1JVTEVTOm19PXRoaXM7bGV0IFA9Yz9tLnBvc3Q6bS5ydWxlcy5maW5kKCh7dHlwZTpGfSk9PkY9PT1DKTtpZihQfHwoUD17dHlwZTpDLHJ1bGVzOltdfSxtLnJ1bGVzLnB1c2goUCkpLG0ua2V5d29yZHNba109ITAsIWcpcmV0dXJuO2NvbnN0IFU9e2tleXdvcmQ6ayxkZWZpbml0aW9uOmxlKFEoe30sZykse3R5cGU6KDAscC5nZXRKU09OVHlwZXMpKGcudHlwZSksc2NoZW1hVHlwZTooMCxwLmdldEpTT05UeXBlcykoZy5zY2hlbWFUeXBlKX0pfTtnLmJlZm9yZT9FZS5jYWxsKHRoaXMsUCxVLGcuYmVmb3JlKTpQLnJ1bGVzLnB1c2goVSksbS5hbGxba109VSwodz1nLmltcGxlbWVudHMpPT09bnVsbHx8dz09PXZvaWQgMHx8dy5mb3JFYWNoKEY9PnRoaXMuYWRkS2V5d29yZChGKSl9ZnVuY3Rpb24gRWUoayxnLEMpe2NvbnN0IHc9ay5ydWxlcy5maW5kSW5kZXgoYz0+Yy5rZXl3b3JkPT09Qyk7dz49MD9rLnJ1bGVzLnNwbGljZSh3LDAsZyk6KGsucnVsZXMucHVzaChnKSx0aGlzLmxvZ2dlci53YXJuKGBydWxlICR7Q30gaXMgbm90IGRlZmluZWRgKSl9ZnVuY3Rpb24gTmUoayl7bGV0e21ldGFTY2hlbWE6Z309aztnIT09dm9pZCAwJiYoay4kZGF0YSYmdGhpcy5vcHRzLiRkYXRhJiYoZz11cihnKSksay52YWxpZGF0ZVNjaGVtYT10aGlzLmNvbXBpbGUoZywhMCkpfWNvbnN0IEJlPXskcmVmOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYWp2LXZhbGlkYXRvci9hanYvbWFzdGVyL2xpYi9yZWZzL2RhdGEuanNvbiMifTtmdW5jdGlvbiB1cihrKXtyZXR1cm57YW55T2Y6W2ssQmVdfX19KHJhKTt2YXIgdHM9e30sRnQ9e30sTXQ9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KE10LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxNdC5jYWxsUmVmPU10LmdldFZhbGlkYXRlPXZvaWQgMDtjb25zdCBIdT1rdCxqYT1uZSxqZT11ZSxzcj1MZSxrYT1DZSxmbj1iZSxLdT17a2V5d29yZDoiJHJlZiIsc2NoZW1hVHlwZToic3RyaW5nIixjb2RlKGUpe2NvbnN0e2dlbjp0LHNjaGVtYTpyLGl0Om59PWUse2Jhc2VJZDpzLHNjaGVtYUVudjphLHZhbGlkYXRlTmFtZTpvLG9wdHM6bCxzZWxmOmZ9PW4se3Jvb3Q6cH09YTtpZigocj09PSIjInx8cj09PSIjLyIpJiZzPT09cC5iYXNlSWQpcmV0dXJuIGgoKTtjb25zdCBpPWthLnJlc29sdmVSZWYuY2FsbChmLHAscyxyKTtpZihpPT09dm9pZCAwKXRocm93IG5ldyBIdS5kZWZhdWx0KG4ub3B0cy51cmlSZXNvbHZlcixzLHIpO2lmKGkgaW5zdGFuY2VvZiBrYS5TY2hlbWFFbnYpcmV0dXJuIEUoaSk7cmV0dXJuIFQoaSk7ZnVuY3Rpb24gaCgpe2lmKGE9PT1wKXJldHVybiBkbihlLG8sYSxhLiRhc3luYyk7Y29uc3QgST10LnNjb3BlVmFsdWUoInJvb3QiLHtyZWY6cH0pO3JldHVybiBkbihlLCgwLGplLl8pYCR7SX0udmFsaWRhdGVgLHAscC4kYXN5bmMpfWZ1bmN0aW9uIEUoSSl7Y29uc3Qgaj1VYShlLEkpO2RuKGUsaixJLEkuJGFzeW5jKX1mdW5jdGlvbiBUKEkpe2NvbnN0IGo9dC5zY29wZVZhbHVlKCJzY2hlbWEiLGwuY29kZS5zb3VyY2U9PT0hMD97cmVmOkksY29kZTooMCxqZS5zdHJpbmdpZnkpKEkpfTp7cmVmOkl9KSx5PXQubmFtZSgidmFsaWQiKSxfPWUuc3Vic2NoZW1hKHtzY2hlbWE6SSxkYXRhVHlwZXM6W10sc2NoZW1hUGF0aDpqZS5uaWwsdG9wU2NoZW1hUmVmOmosZXJyU2NoZW1hUGF0aDpyfSx5KTtlLm1lcmdlRXZhbHVhdGVkKF8pLGUub2soeSl9fX07ZnVuY3Rpb24gVWEoZSx0KXtjb25zdHtnZW46cn09ZTtyZXR1cm4gdC52YWxpZGF0ZT9yLnNjb3BlVmFsdWUoInZhbGlkYXRlIix7cmVmOnQudmFsaWRhdGV9KTooMCxqZS5fKWAke3Iuc2NvcGVWYWx1ZSgid3JhcHBlciIse3JlZjp0fSl9LnZhbGlkYXRlYH1NdC5nZXRWYWxpZGF0ZT1VYTtmdW5jdGlvbiBkbihlLHQscixuKXtjb25zdHtnZW46cyxpdDphfT1lLHthbGxFcnJvcnM6byxzY2hlbWFFbnY6bCxvcHRzOmZ9PWEscD1mLnBhc3NDb250ZXh0P3NyLmRlZmF1bHQudGhpczpqZS5uaWw7bj9pKCk6aCgpO2Z1bmN0aW9uIGkoKXtpZighbC4kYXN5bmMpdGhyb3cgbmV3IEVycm9yKCJhc3luYyBzY2hlbWEgcmVmZXJlbmNlZCBieSBzeW5jIHNjaGVtYSIpO2NvbnN0IEk9cy5sZXQoInZhbGlkIik7cy50cnkoKCk9PntzLmNvZGUoKDAsamUuXylgYXdhaXQgJHsoMCxqYS5jYWxsVmFsaWRhdGVDb2RlKShlLHQscCl9YCksVCh0KSxvfHxzLmFzc2lnbihJLCEwKX0saj0+e3MuaWYoKDAsamUuXylgISgke2p9IGluc3RhbmNlb2YgJHthLlZhbGlkYXRpb25FcnJvcn0pYCwoKT0+cy50aHJvdyhqKSksRShqKSxvfHxzLmFzc2lnbihJLCExKX0pLGUub2soSSl9ZnVuY3Rpb24gaCgpe2UucmVzdWx0KCgwLGphLmNhbGxWYWxpZGF0ZUNvZGUpKGUsdCxwKSwoKT0+VCh0KSwoKT0+RSh0KSl9ZnVuY3Rpb24gRShJKXtjb25zdCBqPSgwLGplLl8pYCR7SX0uZXJyb3JzYDtzLmFzc2lnbihzci5kZWZhdWx0LnZFcnJvcnMsKDAsamUuXylgJHtzci5kZWZhdWx0LnZFcnJvcnN9ID09PSBudWxsID8gJHtqfSA6ICR7c3IuZGVmYXVsdC52RXJyb3JzfS5jb25jYXQoJHtqfSlgKSxzLmFzc2lnbihzci5kZWZhdWx0LmVycm9ycywoMCxqZS5fKWAke3NyLmRlZmF1bHQudkVycm9yc30ubGVuZ3RoYCl9ZnVuY3Rpb24gVChJKXt2YXIgajtpZighYS5vcHRzLnVuZXZhbHVhdGVkKXJldHVybjtjb25zdCB5PShqPXI9PW51bGw/dm9pZCAwOnIudmFsaWRhdGUpPT09bnVsbHx8aj09PXZvaWQgMD92b2lkIDA6ai5ldmFsdWF0ZWQ7aWYoYS5wcm9wcyE9PSEwKWlmKHkmJiF5LmR5bmFtaWNQcm9wcyl5LnByb3BzIT09dm9pZCAwJiYoYS5wcm9wcz1mbi5tZXJnZUV2YWx1YXRlZC5wcm9wcyhzLHkucHJvcHMsYS5wcm9wcykpO2Vsc2V7Y29uc3QgXz1zLnZhcigicHJvcHMiLCgwLGplLl8pYCR7SX0uZXZhbHVhdGVkLnByb3BzYCk7YS5wcm9wcz1mbi5tZXJnZUV2YWx1YXRlZC5wcm9wcyhzLF8sYS5wcm9wcyxqZS5OYW1lKX1pZihhLml0ZW1zIT09ITApaWYoeSYmIXkuZHluYW1pY0l0ZW1zKXkuaXRlbXMhPT12b2lkIDAmJihhLml0ZW1zPWZuLm1lcmdlRXZhbHVhdGVkLml0ZW1zKHMseS5pdGVtcyxhLml0ZW1zKSk7ZWxzZXtjb25zdCBfPXMudmFyKCJpdGVtcyIsKDAsamUuXylgJHtJfS5ldmFsdWF0ZWQuaXRlbXNgKTthLml0ZW1zPWZuLm1lcmdlRXZhbHVhdGVkLml0ZW1zKHMsXyxhLml0ZW1zLGplLk5hbWUpfX19TXQuY2FsbFJlZj1kbixNdC5kZWZhdWx0PUt1O3ZhciBWZT17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVmUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLFZlLmNoZWNrTWV0YWRhdGE9dm9pZCAwO2NvbnN0IEJ1PWJlLEp1PXtrZXl3b3JkOiJtZXRhZGF0YSIsc2NoZW1hVHlwZToib2JqZWN0Iixjb2RlKGUpe0ZhKGUpO2NvbnN0e2dlbjp0LHNjaGVtYTpyLGl0Om59PWU7aWYoKDAsQnUuYWx3YXlzVmFsaWRTY2hlbWEpKG4scikpcmV0dXJuO2NvbnN0IHM9dC5uYW1lKCJ2YWxpZCIpO2Uuc3Vic2NoZW1hKHtrZXl3b3JkOiJtZXRhZGF0YSIsanRkTWV0YWRhdGE6ITB9LHMpLGUub2socyl9fTtmdW5jdGlvbiBGYSh7aXQ6ZSxrZXl3b3JkOnR9LHIpe2lmKGUuanRkTWV0YWRhdGEhPT1yKXRocm93IG5ldyBFcnJvcihgSlREOiAiJHt0fSIgY2Fubm90IGJlIHVzZWQgaW4gdGhpcyBzY2hlbWEgbG9jYXRpb25gKX1WZS5jaGVja01ldGFkYXRhPUZhLFZlLmRlZmF1bHQ9SnUsT2JqZWN0LmRlZmluZVByb3BlcnR5KEZ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxGdC5oYXNSZWY9dm9pZCAwO2NvbnN0IE1hPUNlLFNyPXVlLHF1PWt0LExhPUxlLFZhPU10LEd1PVZlLFF1PXtrZXl3b3JkOiJyZWYiLHNjaGVtYVR5cGU6InN0cmluZyIsY29kZShlKXsoMCxHdS5jaGVja01ldGFkYXRhKShlKTtjb25zdHtnZW46dCxkYXRhOnIsc2NoZW1hOm4scGFyZW50U2NoZW1hOnMsaXQ6YX09ZSx7c2NoZW1hRW52Ontyb290Om99fT1hLGw9dC5uYW1lKCJ2YWxpZCIpO3MubnVsbGFibGU/KHQudmFyKGwsKDAsU3IuXylgJHtyfSA9PT0gbnVsbGApLHQuaWYoKDAsU3Iubm90KShsKSxmKSk6KHQudmFyKGwsITEpLGYoKSksZS5vayhsKTtmdW5jdGlvbiBmKCl7dmFyIGg7Y29uc3QgRT0oaD1vLnNjaGVtYS5kZWZpbml0aW9ucyk9PT1udWxsfHxoPT09dm9pZCAwP3ZvaWQgMDpoW25dO2lmKCFFKXRocm93IG5ldyBxdS5kZWZhdWx0KGEub3B0cy51cmlSZXNvbHZlciwiIixuLGBObyBkZWZpbml0aW9uICR7bn1gKTtycyhFKXx8IWEub3B0cy5pbmxpbmVSZWZzP3AoRSk6aShFKX1mdW5jdGlvbiBwKGgpe2NvbnN0IEU9TWEuY29tcGlsZVNjaGVtYS5jYWxsKGEuc2VsZixuZXcgTWEuU2NoZW1hRW52KHtzY2hlbWE6aCxyb290Om8sc2NoZW1hUGF0aDpgL2RlZmluaXRpb25zLyR7bn1gfSkpLFQ9KDAsVmEuZ2V0VmFsaWRhdGUpKGUsRSksST10LmNvbnN0KCJfZXJycyIsTGEuZGVmYXVsdC5lcnJvcnMpOygwLFZhLmNhbGxSZWYpKGUsVCxFLEUuJGFzeW5jKSx0LmFzc2lnbihsLCgwLFNyLl8pYCR7SX0gPT09ICR7TGEuZGVmYXVsdC5lcnJvcnN9YCl9ZnVuY3Rpb24gaShoKXtjb25zdCBFPXQuc2NvcGVWYWx1ZSgic2NoZW1hIixhLm9wdHMuY29kZS5zb3VyY2U9PT0hMD97cmVmOmgsY29kZTooMCxTci5zdHJpbmdpZnkpKGgpfTp7cmVmOmh9KTtlLnN1YnNjaGVtYSh7c2NoZW1hOmgsZGF0YVR5cGVzOltdLHNjaGVtYVBhdGg6U3IubmlsLHRvcFNjaGVtYVJlZjpFLGVyclNjaGVtYVBhdGg6YC9kZWZpbml0aW9ucy8ke259YH0sbCl9fX07ZnVuY3Rpb24gcnMoZSl7Zm9yKGNvbnN0IHQgaW4gZSl7bGV0IHI7aWYodD09PSJyZWYifHx0eXBlb2Yocj1lW3RdKT09Im9iamVjdCImJnJzKHIpKXJldHVybiEwfXJldHVybiExfUZ0Lmhhc1JlZj1ycyxGdC5kZWZhdWx0PVF1O3ZhciBucz17fSxobj17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2NvbnN0IFl1PS90fFxzL2ksV3U9L14oXGRcZFxkXGQpLShcZFxkKS0oXGRcZCkkLyxYdT0vXihcZFxkKTooXGRcZCk6KFxkXGQpKD86XC5cZCspPyg/Onp8KFsrLV1cZFxkKSg/Ojo/KFxkXGQpKT8pJC9pLFp1PVswLDMxLDI4LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXTtmdW5jdGlvbiB6YShlLHQpe2NvbnN0IHI9ZS5zcGxpdChZdSk7cmV0dXJuIHIubGVuZ3RoPT09MiYmSGEoclswXSkmJnh1KHJbMV0pfHx0JiZyLmxlbmd0aD09PTEmJkhhKHJbMF0pfWhuLmRlZmF1bHQ9emE7ZnVuY3Rpb24gSGEoZSl7Y29uc3QgdD1XdS5leGVjKGUpO2lmKCF0KXJldHVybiExO2NvbnN0IHI9K3RbMV0sbj0rdFsyXSxzPSt0WzNdO3JldHVybiBuPj0xJiZuPD0xMiYmcz49MSYmKHM8PVp1W25dfHxuPT09MiYmcz09PTI5JiYociUxMDA9PT0wP3IlNDAwPT09MDpyJTQ9PT0wKSl9ZnVuY3Rpb24geHUoZSl7Y29uc3QgdD1YdS5leGVjKGUpO2lmKCF0KXJldHVybiExO2NvbnN0IHI9K3RbMV0sbj0rdFsyXSxzPSt0WzNdLGE9Kyh0WzRdfHwwKSxvPSsodFs1XXx8MCk7cmV0dXJuIHI8PTIzJiZuPD01OSYmczw9NTl8fHItYT09PTIzJiZuLW89PT01OSYmcz09PTYwfXphLmNvZGU9J3JlcXVpcmUoImFqdi9kaXN0L3J1bnRpbWUvdGltZXN0YW1wIikuZGVmYXVsdCc7dmFyIHplPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh6ZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksemUudHlwZUVycm9yUGFyYW1zPXplLnR5cGVFcnJvck1lc3NhZ2U9emUudHlwZUVycm9yPXZvaWQgMDtjb25zdCBlbD11ZTtmdW5jdGlvbiB0bChlKXtyZXR1cm57bWVzc2FnZTp0PT5LYSh0LGUpLHBhcmFtczp0PT5CYSh0LGUpfX16ZS50eXBlRXJyb3I9dGw7ZnVuY3Rpb24gS2Eoe3BhcmVudFNjaGVtYTplfSx0KXtyZXR1cm4gZSE9bnVsbCYmZS5udWxsYWJsZT9gbXVzdCBiZSAke3R9IG9yIG51bGxgOmBtdXN0IGJlICR7dH1gfXplLnR5cGVFcnJvck1lc3NhZ2U9S2E7ZnVuY3Rpb24gQmEoe3BhcmVudFNjaGVtYTplfSx0KXtyZXR1cm4oMCxlbC5fKWB7dHlwZTogJHt0fSwgbnVsbGFibGU6ICR7ISEoZSE9bnVsbCYmZS5udWxsYWJsZSl9fWB9emUudHlwZUVycm9yUGFyYW1zPUJhLGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmludFJhbmdlPXZvaWQgMDtjb25zdCB0PXVlLHI9aG4sbj1iZSxzPVZlLGE9emU7ZS5pbnRSYW5nZT17aW50ODpbLTEyOCwxMjcsM10sdWludDg6WzAsMjU1LDNdLGludDE2OlstMzI3NjgsMzI3NjcsNV0sdWludDE2OlswLDY1NTM1LDVdLGludDMyOlstMjE0NzQ4MzY0OCwyMTQ3NDgzNjQ3LDEwXSx1aW50MzI6WzAsNDI5NDk2NzI5NSwxMF19O2NvbnN0IG89e21lc3NhZ2U6cD0+KDAsYS50eXBlRXJyb3JNZXNzYWdlKShwLHAuc2NoZW1hKSxwYXJhbXM6cD0+KDAsYS50eXBlRXJyb3JQYXJhbXMpKHAscC5zY2hlbWEpfTtmdW5jdGlvbiBsKHApe2NvbnN0e2dlbjppLGRhdGE6aCxpdDpFfT1wLHt0aW1lc3RhbXA6VCxhbGxvd0RhdGU6SX09RS5vcHRzO2lmKFQ9PT0iZGF0ZSIpcmV0dXJuKDAsdC5fKWAke2h9IGluc3RhbmNlb2YgRGF0ZSBgO2NvbnN0IGo9KDAsbi51c2VGdW5jKShpLHIuZGVmYXVsdCkseT1JPygwLHQuXylgLCB0cnVlYDp0Lm5pbCxfPSgwLHQuXylgdHlwZW9mICR7aH0gPT0gInN0cmluZyIgJiYgJHtqfSgke2h9JHt5fSlgO3JldHVybiBUPT09InN0cmluZyI/XzooMCx0Lm9yKSgoMCx0Ll8pYCR7aH0gaW5zdGFuY2VvZiBEYXRlYCxfKX1jb25zdCBmPXtrZXl3b3JkOiJ0eXBlIixzY2hlbWFUeXBlOiJzdHJpbmciLGVycm9yOm8sY29kZShwKXsoMCxzLmNoZWNrTWV0YWRhdGEpKHApO2NvbnN0e2RhdGE6aSxzY2hlbWE6aCxwYXJlbnRTY2hlbWE6RSxpdDpUfT1wO2xldCBJO3N3aXRjaChoKXtjYXNlImJvb2xlYW4iOmNhc2Uic3RyaW5nIjpJPSgwLHQuXylgdHlwZW9mICR7aX0gPT0gJHtofWA7YnJlYWs7Y2FzZSJ0aW1lc3RhbXAiOntJPWwocCk7YnJlYWt9Y2FzZSJmbG9hdDMyIjpjYXNlImZsb2F0NjQiOkk9KDAsdC5fKWB0eXBlb2YgJHtpfSA9PSAibnVtYmVyImA7YnJlYWs7ZGVmYXVsdDp7Y29uc3Qgaj1oO2lmKEk9KDAsdC5fKWB0eXBlb2YgJHtpfSA9PSAibnVtYmVyIiAmJiBpc0Zpbml0ZSgke2l9KSAmJiAhKCR7aX0gJSAxKWAsIVQub3B0cy5pbnQzMnJhbmdlJiYoaj09PSJpbnQzMiJ8fGo9PT0idWludDMyIikpaj09PSJ1aW50MzIiJiYoST0oMCx0Ll8pYCR7SX0gJiYgJHtpfSA+PSAwYCk7ZWxzZXtjb25zdFt5LF9dPWUuaW50UmFuZ2Vbal07ST0oMCx0Ll8pYCR7SX0gJiYgJHtpfSA+PSAke3l9ICYmICR7aX0gPD0gJHtffWB9fX1wLnBhc3MoRS5udWxsYWJsZT8oMCx0Lm9yKSgoMCx0Ll8pYCR7aX0gPT09IG51bGxgLEkpOkkpfX07ZS5kZWZhdWx0PWZ9KG5zKTt2YXIgc3M9e30seGU9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KHhlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx4ZS5jaGVja051bGxhYmxlT2JqZWN0PXhlLmNoZWNrTnVsbGFibGU9dm9pZCAwO2NvbnN0IHBuPXVlO2Z1bmN0aW9uIEphKHtnZW46ZSxkYXRhOnQscGFyZW50U2NoZW1hOnJ9LG49cG4ubmlsKXtjb25zdCBzPWUubmFtZSgidmFsaWQiKTtyZXR1cm4gci5udWxsYWJsZT8oZS5sZXQocywoMCxwbi5fKWAke3R9ID09PSBudWxsYCksbj0oMCxwbi5ub3QpKHMpKTplLmxldChzLCExKSxbcyxuXX14ZS5jaGVja051bGxhYmxlPUphO2Z1bmN0aW9uIHJsKGUsdCl7Y29uc3RbcixuXT1KYShlLHQpO3JldHVybltyLCgwLHBuLl8pYCR7bn0gJiYgdHlwZW9mICR7ZS5kYXRhfSA9PSAib2JqZWN0IiAmJiAhQXJyYXkuaXNBcnJheSgke2UuZGF0YX0pYF19eGUuY2hlY2tOdWxsYWJsZU9iamVjdD1ybCxPYmplY3QuZGVmaW5lUHJvcGVydHkoc3MsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2NvbnN0IHd0PXVlLG5sPVZlLHNsPXhlLGFsPXtrZXl3b3JkOiJlbnVtIixzY2hlbWFUeXBlOiJhcnJheSIsZXJyb3I6e21lc3NhZ2U6Im11c3QgYmUgZXF1YWwgdG8gb25lIG9mIHRoZSBhbGxvd2VkIHZhbHVlcyIscGFyYW1zOih7c2NoZW1hQ29kZTplfSk9PigwLHd0Ll8pYHthbGxvd2VkVmFsdWVzOiAke2V9fWB9LGNvZGUoZSl7KDAsbmwuY2hlY2tNZXRhZGF0YSkoZSk7Y29uc3R7Z2VuOnQsZGF0YTpyLHNjaGVtYTpuLHNjaGVtYVZhbHVlOnMscGFyZW50U2NoZW1hOmEsaXQ6b309ZTtpZihuLmxlbmd0aD09PTApdGhyb3cgbmV3IEVycm9yKCJlbnVtIG11c3QgaGF2ZSBub24tZW1wdHkgYXJyYXkiKTtpZihuLmxlbmd0aCE9PW5ldyBTZXQobikuc2l6ZSl0aHJvdyBuZXcgRXJyb3IoImVudW0gaXRlbXMgbXVzdCBiZSB1bmlxdWUiKTtsZXQgbDtjb25zdCBmPSgwLHd0Ll8pYHR5cGVvZiAke3J9ID09ICJzdHJpbmciYDtpZihuLmxlbmd0aD49by5vcHRzLmxvb3BFbnVtKXtsZXQgaTtbbCxpXT0oMCxzbC5jaGVja051bGxhYmxlKShlLGYpLHQuaWYoaSxwKX1lbHNle2lmKCFBcnJheS5pc0FycmF5KG4pKXRocm93IG5ldyBFcnJvcigiYWp2IGltcGxlbWVudGF0aW9uIGVycm9yIik7bD0oMCx3dC5hbmQpKGYsKDAsd3Qub3IpKC4uLm4ubWFwKGk9PigwLHd0Ll8pYCR7cn0gPT09ICR7aX1gKSkpLGEubnVsbGFibGUmJihsPSgwLHd0Lm9yKSgoMCx3dC5fKWAke3J9ID09PSBudWxsYCxsKSl9ZS5wYXNzKGwpO2Z1bmN0aW9uIHAoKXt0LmZvck9mKCJ2IixzLGk9PnQuaWYoKDAsd3QuXylgJHtsfSA9ICR7cn0gPT09ICR7aX1gLCgpPT50LmJyZWFrKCkpKX19fTtzcy5kZWZhdWx0PWFsO3ZhciBhcz17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYXMsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2NvbnN0IG9sPWJlLGlsPW5lLHFhPXVlLGNsPVZlLHVsPXhlLGxsPXtrZXl3b3JkOiJlbGVtZW50cyIsc2NoZW1hVHlwZToib2JqZWN0IixlcnJvcjooMCx6ZS50eXBlRXJyb3IpKCJhcnJheSIpLGNvZGUoZSl7KDAsY2wuY2hlY2tNZXRhZGF0YSkoZSk7Y29uc3R7Z2VuOnQsZGF0YTpyLHNjaGVtYTpuLGl0OnN9PWU7aWYoKDAsb2wuYWx3YXlzVmFsaWRTY2hlbWEpKHMsbikpcmV0dXJuO2NvbnN0W2FdPSgwLHVsLmNoZWNrTnVsbGFibGUpKGUpO3QuaWYoKDAscWEubm90KShhKSwoKT0+dC5pZigoMCxxYS5fKWBBcnJheS5pc0FycmF5KCR7cn0pYCwoKT0+dC5hc3NpZ24oYSwoMCxpbC52YWxpZGF0ZUFycmF5KShlKSksKCk9PmUuZXJyb3IoKSkpLGUub2soYSl9fTthcy5kZWZhdWx0PWxsO3ZhciBvcz17fTsoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUudmFsaWRhdGVQcm9wZXJ0aWVzPWUuZXJyb3I9dm9pZCAwO2NvbnN0IHQ9bmUscj1iZSxuPXVlLHM9VmUsYT14ZSxvPXplO3ZhciBsOyhmdW5jdGlvbihpKXtpLkFkZGl0aW9uYWw9ImFkZGl0aW9uYWwiLGkuTWlzc2luZz0ibWlzc2luZyJ9KShsfHwobD17fSkpLGUuZXJyb3I9e21lc3NhZ2U6aT0+e2NvbnN0e3BhcmFtczpofT1pO3JldHVybiBoLnByb3BFcnJvcj9oLnByb3BFcnJvcj09PWwuQWRkaXRpb25hbD8ibXVzdCBOT1QgaGF2ZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMiOmBtdXN0IGhhdmUgcHJvcGVydHkgJyR7aC5taXNzaW5nUHJvcGVydHl9J2A6KDAsby50eXBlRXJyb3JNZXNzYWdlKShpLCJvYmplY3QiKX0scGFyYW1zOmk9Pntjb25zdHtwYXJhbXM6aH09aTtyZXR1cm4gaC5wcm9wRXJyb3I/aC5wcm9wRXJyb3I9PT1sLkFkZGl0aW9uYWw/KDAsbi5fKWB7ZXJyb3I6ICR7aC5wcm9wRXJyb3J9LCBhZGRpdGlvbmFsUHJvcGVydHk6ICR7aC5hZGRpdGlvbmFsUHJvcGVydHl9fWA6KDAsbi5fKWB7ZXJyb3I6ICR7aC5wcm9wRXJyb3J9LCBtaXNzaW5nUHJvcGVydHk6ICR7aC5taXNzaW5nUHJvcGVydHl9fWA6KDAsby50eXBlRXJyb3JQYXJhbXMpKGksIm9iamVjdCIpfX07Y29uc3QgZj17a2V5d29yZDoicHJvcGVydGllcyIsc2NoZW1hVHlwZToib2JqZWN0IixlcnJvcjplLmVycm9yLGNvZGU6cH07ZnVuY3Rpb24gcChpKXsoMCxzLmNoZWNrTWV0YWRhdGEpKGkpO2NvbnN0e2dlbjpoLGRhdGE6RSxwYXJlbnRTY2hlbWE6VCxpdDpJfT1pLHthZGRpdGlvbmFsUHJvcGVydGllczpqLG51bGxhYmxlOnl9PVQ7aWYoSS5qdGREaXNjcmltaW5hdG9yJiZ5KXRocm93IG5ldyBFcnJvcigiSlREOiBudWxsYWJsZSBpbnNpZGUgZGlzY3JpbWluYXRvciBtYXBwaW5nIik7aWYoTigpKXRocm93IG5ldyBFcnJvcigiSlREOiBwcm9wZXJ0aWVzIGFuZCBvcHRpb25hbFByb3BlcnRpZXMgaGF2ZSBjb21tb24gbWVtYmVycyIpO2NvbnN0W18sYl09RCgicHJvcGVydGllcyIpLFtPLEFdPUQoIm9wdGlvbmFsUHJvcGVydGllcyIpO2lmKGIubGVuZ3RoPT09MCYmQS5sZW5ndGg9PT0wJiZqKXJldHVybjtjb25zdFtILCRdPUkuanRkRGlzY3JpbWluYXRvcj09PXZvaWQgMD8oMCxhLmNoZWNrTnVsbGFibGVPYmplY3QpKGksRSk6W2gubGV0KCJ2YWxpZCIsITEpLCEwXTtoLmlmKCQsKCk9PmguYXNzaWduKEgsITApLmJsb2NrKCgpPT57QihiLCJwcm9wZXJ0aWVzIiwhMCksQihBLCJvcHRpb25hbFByb3BlcnRpZXMiKSxqfHxwZSgpfSkpLGkucGFzcyhIKTtmdW5jdGlvbiBOKCl7Y29uc3Qgb2U9VC5wcm9wZXJ0aWVzLFg9VC5vcHRpb25hbFByb3BlcnRpZXM7aWYoIShvZSYmWCkpcmV0dXJuITE7Zm9yKGNvbnN0IHZlIGluIG9lKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChYLHZlKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBEKG9lKXtjb25zdCBYPVRbb2VdLHZlPVg/KDAsdC5hbGxTY2hlbWFQcm9wZXJ0aWVzKShYKTpbXTtpZihJLmp0ZERpc2NyaW1pbmF0b3ImJnZlLnNvbWUoTmU9Pk5lPT09SS5qdGREaXNjcmltaW5hdG9yKSl0aHJvdyBuZXcgRXJyb3IoYEpURDogZGlzY3JpbWluYXRvciB0YWcgdXNlZCBpbiAke29lfWApO2NvbnN0IEVlPXZlLmZpbHRlcihOZT0+ISgwLHIuYWx3YXlzVmFsaWRTY2hlbWEpKEksWFtOZV0pKTtyZXR1cm5bdmUsRWVdfWZ1bmN0aW9uIEIob2UsWCx2ZSl7Y29uc3QgRWU9aC52YXIoInZhbGlkIik7Zm9yKGNvbnN0IEJlIG9mIG9lKWguaWYoKDAsdC5wcm9wZXJ0eUluRGF0YSkoaCxFLEJlLEkub3B0cy5vd25Qcm9wZXJ0aWVzKSwoKT0+RyhCZSxYLEVlKSwoKT0+TmUoQmUpKSxpLm9rKEVlKTtmdW5jdGlvbiBOZShCZSl7dmU/KGguYXNzaWduKEVlLCExKSxpLmVycm9yKCExLHtwcm9wRXJyb3I6bC5NaXNzaW5nLG1pc3NpbmdQcm9wZXJ0eTpCZX0se3NjaGVtYVBhdGg6QmV9KSk6aC5hc3NpZ24oRWUsITApfX1mdW5jdGlvbiBHKG9lLFgsdmUpe2kuc3Vic2NoZW1hKHtrZXl3b3JkOlgsc2NoZW1hUHJvcDpvZSxkYXRhUHJvcDpvZX0sdmUpfWZ1bmN0aW9uIHBlKCl7aC5mb3JJbigia2V5IixFLG9lPT57Y29uc3QgWD1JLmp0ZERpc2NyaW1pbmF0b3I9PT12b2lkIDA/XzpbSS5qdGREaXNjcmltaW5hdG9yXS5jb25jYXQoXyksdmU9VyhvZSxYLCJwcm9wZXJ0aWVzIiksRWU9VyhvZSxPLCJvcHRpb25hbFByb3BlcnRpZXMiKSxOZT12ZT09PSEwP0VlOkVlPT09ITA/dmU6KDAsbi5hbmQpKHZlLEVlKTtoLmlmKE5lLCgpPT57SS5vcHRzLnJlbW92ZUFkZGl0aW9uYWw/aC5jb2RlKCgwLG4uXylgZGVsZXRlICR7RX1bJHtvZX1dYCk6KGkuZXJyb3IoITEse3Byb3BFcnJvcjpsLkFkZGl0aW9uYWwsYWRkaXRpb25hbFByb3BlcnR5Om9lfSx7aW5zdGFuY2VQYXRoOm9lLHBhcmVudFNjaGVtYTohMH0pLEkub3B0cy5hbGxFcnJvcnN8fGguYnJlYWsoKSl9KX0pfWZ1bmN0aW9uIFcob2UsWCx2ZSl7bGV0IEVlO2lmKFgubGVuZ3RoPjgpe2NvbnN0IE5lPSgwLHIuc2NoZW1hUmVmT3JWYWwpKEksVFt2ZV0sdmUpO0VlPSgwLG4ubm90KSgoMCx0LmlzT3duUHJvcGVydHkpKGgsTmUsb2UpKX1lbHNlIFgubGVuZ3RoP0VlPSgwLG4uYW5kKSguLi5YLm1hcChOZT0+KDAsbi5fKWAke29lfSAhPT0gJHtOZX1gKSk6RWU9ITA7cmV0dXJuIEVlfX1lLnZhbGlkYXRlUHJvcGVydGllcz1wLGUuZGVmYXVsdD1mfSkob3MpO3ZhciBpcz17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXMsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2NvbnN0IEdhPW9zLGZsPXtrZXl3b3JkOiJvcHRpb25hbFByb3BlcnRpZXMiLHNjaGVtYVR5cGU6Im9iamVjdCIsZXJyb3I6R2EuZXJyb3IsY29kZShlKXtlLnBhcmVudFNjaGVtYS5wcm9wZXJ0aWVzfHwoMCxHYS52YWxpZGF0ZVByb3BlcnRpZXMpKGUpfX07aXMuZGVmYXVsdD1mbDt2YXIgY3M9e30sUWE9e307KGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLkRpc2NyRXJyb3I9dm9pZCAwLGZ1bmN0aW9uKHQpe3QuVGFnPSJ0YWciLHQuTWFwcGluZz0ibWFwcGluZyJ9KGUuRGlzY3JFcnJvcnx8KGUuRGlzY3JFcnJvcj17fSkpfSkoUWEpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjcywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y29uc3QgTHQ9dWUsZGw9VmUsaGw9eGUsWWE9emUsbW49UWEscGw9e2tleXdvcmQ6ImRpc2NyaW1pbmF0b3IiLHNjaGVtYVR5cGU6InN0cmluZyIsaW1wbGVtZW50czpbIm1hcHBpbmciXSxlcnJvcjp7bWVzc2FnZTplPT57Y29uc3R7c2NoZW1hOnQscGFyYW1zOnJ9PWU7cmV0dXJuIHIuZGlzY3JFcnJvcj9yLmRpc2NyRXJyb3I9PT1tbi5EaXNjckVycm9yLlRhZz9gdGFnICIke3R9IiBtdXN0IGJlIHN0cmluZ2A6YHZhbHVlIG9mIHRhZyAiJHt0fSIgbXVzdCBiZSBpbiBtYXBwaW5nYDooMCxZYS50eXBlRXJyb3JNZXNzYWdlKShlLCJvYmplY3QiKX0scGFyYW1zOmU9Pntjb25zdHtzY2hlbWE6dCxwYXJhbXM6cn09ZTtyZXR1cm4gci5kaXNjckVycm9yPygwLEx0Ll8pYHtlcnJvcjogJHtyLmRpc2NyRXJyb3J9LCB0YWc6ICR7dH0sIHRhZ1ZhbHVlOiAke3IudGFnfX1gOigwLFlhLnR5cGVFcnJvclBhcmFtcykoZSwib2JqZWN0Iil9fSxjb2RlKGUpeygwLGRsLmNoZWNrTWV0YWRhdGEpKGUpO2NvbnN0e2dlbjp0LGRhdGE6cixzY2hlbWE6bixwYXJlbnRTY2hlbWE6c309ZSxbYSxvXT0oMCxobC5jaGVja051bGxhYmxlT2JqZWN0KShlLHIpO3QuaWYobyksbCgpLHQuZWxzZUlmKCgwLEx0Lm5vdCkoYSkpLGUuZXJyb3IoKSx0LmVuZElmKCksZS5vayhhKTtmdW5jdGlvbiBsKCl7Y29uc3QgaT10LmNvbnN0KCJ0YWciLCgwLEx0Ll8pYCR7cn0keygwLEx0LmdldFByb3BlcnR5KShuKX1gKTt0LmlmKCgwLEx0Ll8pYCR7aX0gPT09IHVuZGVmaW5lZGApLGUuZXJyb3IoITEse2Rpc2NyRXJyb3I6bW4uRGlzY3JFcnJvci5UYWcsdGFnOml9KSx0LmVsc2VJZigoMCxMdC5fKWB0eXBlb2YgJHtpfSA9PSAic3RyaW5nImApLGYoaSksdC5lbHNlKCksZS5lcnJvcighMSx7ZGlzY3JFcnJvcjptbi5EaXNjckVycm9yLlRhZyx0YWc6aX0se2luc3RhbmNlUGF0aDpufSksdC5lbmRJZigpfWZ1bmN0aW9uIGYoaSl7dC5pZighMSk7Zm9yKGNvbnN0IGggaW4gcy5tYXBwaW5nKXQuZWxzZUlmKCgwLEx0Ll8pYCR7aX0gPT09ICR7aH1gKSx0LmFzc2lnbihhLHAoaCkpO3QuZWxzZSgpLGUuZXJyb3IoITEse2Rpc2NyRXJyb3I6bW4uRGlzY3JFcnJvci5NYXBwaW5nLHRhZzppfSx7aW5zdGFuY2VQYXRoOm4sc2NoZW1hUGF0aDoibWFwcGluZyIscGFyZW50U2NoZW1hOiEwfSksdC5lbmRJZigpfWZ1bmN0aW9uIHAoaSl7Y29uc3QgaD10Lm5hbWUoInZhbGlkIik7cmV0dXJuIGUuc3Vic2NoZW1hKHtrZXl3b3JkOiJtYXBwaW5nIixzY2hlbWFQcm9wOmksanRkRGlzY3JpbWluYXRvcjpufSxoKSxofX19O2NzLmRlZmF1bHQ9cGw7dmFyIHVzPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh1cywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y29uc3QgV2E9YmUsWGE9dWUsbWw9VmUsdmw9eGUsX2w9e2tleXdvcmQ6InZhbHVlcyIsc2NoZW1hVHlwZToib2JqZWN0IixlcnJvcjooMCx6ZS50eXBlRXJyb3IpKCJvYmplY3QiKSxjb2RlKGUpeygwLG1sLmNoZWNrTWV0YWRhdGEpKGUpO2NvbnN0e2dlbjp0LGRhdGE6cixzY2hlbWE6bixpdDpzfT1lO2lmKCgwLFdhLmFsd2F5c1ZhbGlkU2NoZW1hKShzLG4pKXJldHVybjtjb25zdFthLG9dPSgwLHZsLmNoZWNrTnVsbGFibGVPYmplY3QpKGUscik7dC5pZihvKSx0LmFzc2lnbihhLGwoKSksdC5lbHNlSWYoKDAsWGEubm90KShhKSksZS5lcnJvcigpLHQuZW5kSWYoKSxlLm9rKGEpO2Z1bmN0aW9uIGwoKXtjb25zdCBmPXQubmFtZSgidmFsaWQiKTtpZihzLmFsbEVycm9ycyl7Y29uc3QgaT10LmxldCgidmFsaWQiLCEwKTtyZXR1cm4gcCgoKT0+dC5hc3NpZ24oaSwhMSkpLGl9cmV0dXJuIHQudmFyKGYsITApLHAoKCk9PnQuYnJlYWsoKSksZjtmdW5jdGlvbiBwKGkpe3QuZm9ySW4oImtleSIscixoPT57ZS5zdWJzY2hlbWEoe2tleXdvcmQ6InZhbHVlcyIsZGF0YVByb3A6aCxkYXRhUHJvcFR5cGU6V2EuVHlwZS5TdHJ9LGYpLHQuaWYoKDAsWGEubm90KShmKSxpKX0pfX19fTt1cy5kZWZhdWx0PV9sO3ZhciBscz17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkobHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2NvbnN0IGdsPXtrZXl3b3JkOiJ1bmlvbiIsc2NoZW1hVHlwZToiYXJyYXkiLHRyYWNrRXJyb3JzOiEwLGNvZGU6bmUudmFsaWRhdGVVbmlvbixlcnJvcjp7bWVzc2FnZToibXVzdCBtYXRjaCBhIHNjaGVtYSBpbiB1bmlvbiJ9fTtscy5kZWZhdWx0PWdsLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0cywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y29uc3QgRWw9RnQseWw9bnMsJGw9c3Msd2w9YXMsU2w9b3MsUmw9aXMsYmw9Y3MsT2w9dXMsTmw9bHMsUGw9VmUsVGw9WyJkZWZpbml0aW9ucyIsRWwuZGVmYXVsdCx5bC5kZWZhdWx0LCRsLmRlZmF1bHQsd2wuZGVmYXVsdCxTbC5kZWZhdWx0LFJsLmRlZmF1bHQsYmwuZGVmYXVsdCxPbC5kZWZhdWx0LE5sLmRlZmF1bHQsUGwuZGVmYXVsdCx7a2V5d29yZDoiYWRkaXRpb25hbFByb3BlcnRpZXMiLHNjaGVtYVR5cGU6ImJvb2xlYW4ifSx7a2V5d29yZDoibnVsbGFibGUiLHNjaGVtYVR5cGU6ImJvb2xlYW4ifV07dHMuZGVmYXVsdD1UbDt2YXIgZnM9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KGZzLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjb25zdCBkdD1lPT57Y29uc3QgdD17bnVsbGFibGU6e3R5cGU6ImJvb2xlYW4ifSxtZXRhZGF0YTp7b3B0aW9uYWxQcm9wZXJ0aWVzOnt1bmlvbjp7ZWxlbWVudHM6e3JlZjoic2NoZW1hIn19fSxhZGRpdGlvbmFsUHJvcGVydGllczohMH19O3JldHVybiBlJiYodC5kZWZpbml0aW9ucz17dmFsdWVzOntyZWY6InNjaGVtYSJ9fSksdH0sQWw9ZT0+KHtvcHRpb25hbFByb3BlcnRpZXM6ZHQoZSl9KSxDbD1lPT4oe3Byb3BlcnRpZXM6e3JlZjp7dHlwZToic3RyaW5nIn19LG9wdGlvbmFsUHJvcGVydGllczpkdChlKX0pLElsPWU9Pih7cHJvcGVydGllczp7dHlwZTp7ZW51bTpbImJvb2xlYW4iLCJ0aW1lc3RhbXAiLCJzdHJpbmciLCJmbG9hdDMyIiwiZmxvYXQ2NCIsImludDgiLCJ1aW50OCIsImludDE2IiwidWludDE2IiwiaW50MzIiLCJ1aW50MzIiXX19LG9wdGlvbmFsUHJvcGVydGllczpkdChlKX0pLERsPWU9Pih7cHJvcGVydGllczp7ZW51bTp7ZWxlbWVudHM6e3R5cGU6InN0cmluZyJ9fX0sb3B0aW9uYWxQcm9wZXJ0aWVzOmR0KGUpfSksamw9ZT0+KHtwcm9wZXJ0aWVzOntlbGVtZW50czp7cmVmOiJzY2hlbWEifX0sb3B0aW9uYWxQcm9wZXJ0aWVzOmR0KGUpfSksWmE9ZT0+KHtwcm9wZXJ0aWVzOntwcm9wZXJ0aWVzOnt2YWx1ZXM6e3JlZjoic2NoZW1hIn19fSxvcHRpb25hbFByb3BlcnRpZXM6USh7b3B0aW9uYWxQcm9wZXJ0aWVzOnt2YWx1ZXM6e3JlZjoic2NoZW1hIn19LGFkZGl0aW9uYWxQcm9wZXJ0aWVzOnt0eXBlOiJib29sZWFuIn19LGR0KGUpKX0pLHhhPWU9Pih7cHJvcGVydGllczp7b3B0aW9uYWxQcm9wZXJ0aWVzOnt2YWx1ZXM6e3JlZjoic2NoZW1hIn19fSxvcHRpb25hbFByb3BlcnRpZXM6USh7YWRkaXRpb25hbFByb3BlcnRpZXM6e3R5cGU6ImJvb2xlYW4ifX0sZHQoZSkpfSksa2w9ZT0+KHtwcm9wZXJ0aWVzOntkaXNjcmltaW5hdG9yOnt0eXBlOiJzdHJpbmcifSxtYXBwaW5nOnt2YWx1ZXM6e21ldGFkYXRhOnt1bmlvbjpbWmEoITEpLHhhKCExKV19fX19LG9wdGlvbmFsUHJvcGVydGllczpkdChlKX0pLFVsPWU9Pih7cHJvcGVydGllczp7dmFsdWVzOntyZWY6InNjaGVtYSJ9fSxvcHRpb25hbFByb3BlcnRpZXM6ZHQoZSl9KSxlbz1lPT4oe21ldGFkYXRhOnt1bmlvbjpbQWwsQ2wsSWwsRGwsamwsWmEseGEsa2wsVWxdLm1hcCh0PT50KGUpKX19KSxGbD1RKHtkZWZpbml0aW9uczp7c2NoZW1hOmVvKCExKX19LGVvKCEwKSk7ZnMuZGVmYXVsdD1GbDt2YXIgZHM9e30sUnI9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KFJyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxSci5qdGRGb3Jtcz12b2lkIDAsUnIuanRkRm9ybXM9WyJlbGVtZW50cyIsInZhbHVlcyIsImRpc2NyaW1pbmF0b3IiLCJwcm9wZXJ0aWVzIiwib3B0aW9uYWxQcm9wZXJ0aWVzIiwiZW51bSIsInR5cGUiLCJyZWYiXTt2YXIgaHM9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KGhzLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjb25zdCBwcz0vW1xcIlx1MDAwMC1cdTAwMWZcdTAwN2YtXHUwMDlmXHUwMGFkXHUwNjAwLVx1MDYwNFx1MDcwZlx1MTdiNFx1MTdiNVx1MjAwYy1cdTIwMGZcdTIwMjgtXHUyMDJmXHUyMDYwLVx1MjA2Zlx1ZmVmZlx1ZmZmMC1cdWZmZmZdL2csTWw9eyJcYiI6IlxcYiIsIgkiOiJcXHQiLCJcbiI6IlxcbiIsIlxmIjoiXFxmIiwiXHIiOiJcXHIiLCciJzonXFwiJywiXFwiOiJcXFxcIn07ZnVuY3Rpb24gdG8oZSl7cmV0dXJuIHBzLmxhc3RJbmRleD0wLCciJysocHMudGVzdChlKT9lLnJlcGxhY2UocHMsdD0+e2NvbnN0IHI9TWxbdF07cmV0dXJuIHR5cGVvZiByPT0ic3RyaW5nIj9yOiJcXHUiKygiMDAwMCIrdC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpfSk6ZSkrJyInfWhzLmRlZmF1bHQ9dG8sdG8uY29kZT0ncmVxdWlyZSgiYWp2L2Rpc3QvcnVudGltZS9xdW90ZSIpLmRlZmF1bHQnLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkcywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y29uc3QgTGw9UnIscm89Q2UsdGU9dWUsVmw9a3QsaGU9TGUsemw9bmUsSGw9RnQsS2w9YmUsQmw9aHMsSmw9e2VsZW1lbnRzOkdsLHZhbHVlczpRbCxkaXNjcmltaW5hdG9yOllsLHByb3BlcnRpZXM6YW8sb3B0aW9uYWxQcm9wZXJ0aWVzOmFvLGVudW06T3IsdHlwZTpXbCxyZWY6Wmx9O2Z1bmN0aW9uIG5vKGUsdCl7Y29uc3Qgcj1yby5nZXRDb21waWxpbmdTY2hlbWEuY2FsbCh0aGlzLGUpO2lmKHIpcmV0dXJuIHI7Y29uc3R7ZXM1Om4sbGluZXM6c309dGhpcy5vcHRzLmNvZGUse293blByb3BlcnRpZXM6YX09dGhpcy5vcHRzLG89bmV3IHRlLkNvZGVHZW4odGhpcy5zY29wZSx7ZXM1Om4sbGluZXM6cyxvd25Qcm9wZXJ0aWVzOmF9KSxsPW8uc2NvcGVOYW1lKCJzZXJpYWxpemUiKSxmPXtzZWxmOnRoaXMsZ2VuOm8sc2NoZW1hOmUuc2NoZW1hLHNjaGVtYUVudjplLGRlZmluaXRpb25zOnQsZGF0YTpoZS5kZWZhdWx0LmRhdGF9O2xldCBwO3RyeXt0aGlzLl9jb21waWxhdGlvbnMuYWRkKGUpLGUuc2VyaWFsaXplTmFtZT1sLG8uZnVuYyhsLGhlLmRlZmF1bHQuZGF0YSwhMSwoKT0+e28ubGV0KGhlLmRlZmF1bHQuanNvbiwoMCx0ZS5zdHIpYGApLGJyKGYpLG8ucmV0dXJuKGhlLmRlZmF1bHQuanNvbil9KSxvLm9wdGltaXplKHRoaXMub3B0cy5jb2RlLm9wdGltaXplKTtjb25zdCBpPW8udG9TdHJpbmcoKTtwPWAke28uc2NvcGVSZWZzKGhlLmRlZmF1bHQuc2NvcGUpfXJldHVybiAke2l9YDtjb25zdCBFPW5ldyBGdW5jdGlvbihgJHtoZS5kZWZhdWx0LnNjb3BlfWAscCkodGhpcy5zY29wZS5nZXQoKSk7dGhpcy5zY29wZS52YWx1ZShsLHtyZWY6RX0pLGUuc2VyaWFsaXplPUV9Y2F0Y2goaSl7dGhyb3cgcCYmdGhpcy5sb2dnZXIuZXJyb3IoIkVycm9yIGNvbXBpbGluZyBzZXJpYWxpemVyLCBmdW5jdGlvbiBjb2RlOiIscCksZGVsZXRlIGUuc2VyaWFsaXplLGRlbGV0ZSBlLnNlcmlhbGl6ZU5hbWUsaX1maW5hbGx5e3RoaXMuX2NvbXBpbGF0aW9ucy5kZWxldGUoZSl9cmV0dXJuIGV9ZHMuZGVmYXVsdD1ubztmdW5jdGlvbiBicihlKXtsZXQgdDtmb3IoY29uc3QgciBvZiBMbC5qdGRGb3JtcylpZihyIGluIGUuc2NoZW1hKXt0PXI7YnJlYWt9cWwoZSx0P0psW3RdOmVmKX1mdW5jdGlvbiBxbChlLHQpe2NvbnN0e2dlbjpyLHNjaGVtYTpuLGRhdGE6c309ZTtpZighbi5udWxsYWJsZSlyZXR1cm4gdChlKTtyLmlmKCgwLHRlLl8pYCR7c30gPT09IHVuZGVmaW5lZCB8fCAke3N9ID09PSBudWxsYCwoKT0+ci5hZGQoaGUuZGVmYXVsdC5qc29uLCgwLHRlLl8pYCJudWxsImApLCgpPT50KGUpKX1mdW5jdGlvbiBHbChlKXtjb25zdHtnZW46dCxzY2hlbWE6cixkYXRhOm59PWU7dC5hZGQoaGUuZGVmYXVsdC5qc29uLCgwLHRlLnN0cilgW2ApO2NvbnN0IHM9dC5sZXQoImZpcnN0IiwhMCk7dC5mb3JPZigiZWwiLG4sYT0+e2lvKGUscyksYnIobGUoUSh7fSxlKSx7c2NoZW1hOnIuZWxlbWVudHMsZGF0YTphfSkpfSksdC5hZGQoaGUuZGVmYXVsdC5qc29uLCgwLHRlLnN0cilgXWApfWZ1bmN0aW9uIFFsKGUpe2NvbnN0e2dlbjp0LHNjaGVtYTpyLGRhdGE6bn09ZTt0LmFkZChoZS5kZWZhdWx0Lmpzb24sKDAsdGUuc3RyKWB7YCk7Y29uc3Qgcz10LmxldCgiZmlyc3QiLCEwKTt0LmZvckluKCJrZXkiLG4sYT0+c28oZSxhLHIudmFsdWVzLHMpKSx0LmFkZChoZS5kZWZhdWx0Lmpzb24sKDAsdGUuc3RyKWB9YCl9ZnVuY3Rpb24gc28oZSx0LHIsbil7Y29uc3R7Z2VuOnMsZGF0YTphfT1lO2lvKGUsbiksT3IobGUoUSh7fSxlKSx7ZGF0YTp0fSkpLHMuYWRkKGhlLmRlZmF1bHQuanNvbiwoMCx0ZS5zdHIpYDpgKTtjb25zdCBvPXMuY29uc3QoInZhbHVlIiwoMCx0ZS5fKWAke2F9JHsoMCx0ZS5nZXRQcm9wZXJ0eSkodCl9YCk7YnIobGUoUSh7fSxlKSx7c2NoZW1hOnIsZGF0YTpvfSkpfWZ1bmN0aW9uIFlsKGUpe2NvbnN0e2dlbjp0LHNjaGVtYTpyLGRhdGE6bn09ZSx7ZGlzY3JpbWluYXRvcjpzfT1yO3QuYWRkKGhlLmRlZmF1bHQuanNvbiwoMCx0ZS5zdHIpYHske0pTT04uc3RyaW5naWZ5KHMpfTpgKTtjb25zdCBhPXQuY29uc3QoInRhZyIsKDAsdGUuXylgJHtufSR7KDAsdGUuZ2V0UHJvcGVydHkpKHMpfWApO09yKGxlKFEoe30sZSkse2RhdGE6YX0pKSx0LmlmKCExKTtmb3IoY29uc3QgbyBpbiByLm1hcHBpbmcpe3QuZWxzZUlmKCgwLHRlLl8pYCR7YX0gPT09ICR7b31gKTtjb25zdCBsPXIubWFwcGluZ1tvXTtvbyhsZShRKHt9LGUpLHtzY2hlbWE6bH0pLHMpfXQuZW5kSWYoKSx0LmFkZChoZS5kZWZhdWx0Lmpzb24sKDAsdGUuc3RyKWB9YCl9ZnVuY3Rpb24gYW8oZSl7Y29uc3R7Z2VuOnR9PWU7dC5hZGQoaGUuZGVmYXVsdC5qc29uLCgwLHRlLnN0cilge2ApLG9vKGUpLHQuYWRkKGhlLmRlZmF1bHQuanNvbiwoMCx0ZS5zdHIpYH1gKX1mdW5jdGlvbiBvbyhlLHQpe2NvbnN0e2dlbjpyLHNjaGVtYTpuLGRhdGE6c309ZSx7cHJvcGVydGllczphLG9wdGlvbmFsUHJvcGVydGllczpvfT1uLGw9aChhKSxmPWgobykscD1FKGwuY29uY2F0KGYpKTtsZXQgaT0hdDtmb3IoY29uc3QgeSBvZiBsKUkoeSxhW3ldLFQoeSkpO2Zvcihjb25zdCB5IG9mIGYpe2NvbnN0IF89VCh5KTtyLmlmKCgwLHRlLmFuZCkoKDAsdGUuXylgJHtffSAhPT0gdW5kZWZpbmVkYCwoMCx6bC5pc093blByb3BlcnR5KShyLHMseSkpLCgpPT5JKHksb1t5XSxfKSl9bi5hZGRpdGlvbmFsUHJvcGVydGllcyYmci5mb3JJbigia2V5IixzLHk9PnIuaWYoaih5LHApLCgpPT5zbyhlLHkse30sci5sZXQoImZpcnN0IixpKSkpKTtmdW5jdGlvbiBoKHkpe3JldHVybiB5P09iamVjdC5rZXlzKHkpOltdfWZ1bmN0aW9uIEUoeSl7aWYodCYmeS5wdXNoKHQpLG5ldyBTZXQoeSkuc2l6ZSE9PXkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSlREOiBwcm9wZXJ0aWVzL29wdGlvbmFsUHJvcGVydGllcy9kaXNjaW1pbmF0b3Igb3ZlcmxhcCIpO3JldHVybiB5fWZ1bmN0aW9uIFQoeSl7cmV0dXJuIHIuY29uc3QoInZhbHVlIiwoMCx0ZS5fKWAke3N9JHsoMCx0ZS5nZXRQcm9wZXJ0eSkoeSl9YCl9ZnVuY3Rpb24gSSh5LF8sYil7aT9pPSExOnIuYWRkKGhlLmRlZmF1bHQuanNvbiwoMCx0ZS5zdHIpYCxgKSxyLmFkZChoZS5kZWZhdWx0Lmpzb24sKDAsdGUuc3RyKWAke0pTT04uc3RyaW5naWZ5KHkpfTpgKSxicihsZShRKHt9LGUpLHtzY2hlbWE6XyxkYXRhOmJ9KSl9ZnVuY3Rpb24gaih5LF8pe3JldHVybiBfLmxlbmd0aD8oMCx0ZS5hbmQpKC4uLl8ubWFwKGI9PigwLHRlLl8pYCR7eX0gIT09ICR7Yn1gKSk6ITB9fWZ1bmN0aW9uIFdsKGUpe2NvbnN0e2dlbjp0LHNjaGVtYTpyLGRhdGE6bn09ZTtzd2l0Y2goci50eXBlKXtjYXNlImJvb2xlYW4iOnQuYWRkKGhlLmRlZmF1bHQuanNvbiwoMCx0ZS5fKWAke259ID8gInRydWUiIDogImZhbHNlImApO2JyZWFrO2Nhc2Uic3RyaW5nIjpPcihlKTticmVhaztjYXNlInRpbWVzdGFtcCI6dC5pZigoMCx0ZS5fKWAke259IGluc3RhbmNlb2YgRGF0ZWAsKCk9PnQuYWRkKGhlLmRlZmF1bHQuanNvbiwoMCx0ZS5fKWAnIicgKyAke259LnRvSVNPU3RyaW5nKCkgKyAnIidgKSwoKT0+T3IoZSkpO2JyZWFrO2RlZmF1bHQ6WGwoZSl9fWZ1bmN0aW9uIE9yKHtnZW46ZSxkYXRhOnR9KXtlLmFkZChoZS5kZWZhdWx0Lmpzb24sKDAsdGUuXylgJHsoMCxLbC51c2VGdW5jKShlLEJsLmRlZmF1bHQpfSgke3R9KWApfWZ1bmN0aW9uIFhsKHtnZW46ZSxkYXRhOnR9KXtlLmFkZChoZS5kZWZhdWx0Lmpzb24sKDAsdGUuXylgIiIgKyAke3R9YCl9ZnVuY3Rpb24gWmwoZSl7Y29uc3R7Z2VuOnQsc2VsZjpyLGRhdGE6bixkZWZpbml0aW9uczpzLHNjaGVtYTphLHNjaGVtYUVudjpvfT1lLHtyZWY6bH09YSxmPXNbbF07aWYoIWYpdGhyb3cgbmV3IFZsLmRlZmF1bHQoci5vcHRzLnVyaVJlc29sdmVyLCIiLGwsYE5vIGRlZmluaXRpb24gJHtsfWApO2lmKCEoMCxIbC5oYXNSZWYpKGYpKXJldHVybiBicihsZShRKHt9LGUpLHtzY2hlbWE6Zn0pKTtjb25zdHtyb290OnB9PW8saT1uby5jYWxsKHIsbmV3IHJvLlNjaGVtYUVudih7c2NoZW1hOmYscm9vdDpwfSkscyk7dC5hZGQoaGUuZGVmYXVsdC5qc29uLCgwLHRlLl8pYCR7eGwodCxpKX0oJHtufSlgKX1mdW5jdGlvbiB4bChlLHQpe3JldHVybiB0LnNlcmlhbGl6ZT9lLnNjb3BlVmFsdWUoInNlcmlhbGl6ZSIse3JlZjp0LnNlcmlhbGl6ZX0pOigwLHRlLl8pYCR7ZS5zY29wZVZhbHVlKCJ3cmFwcGVyIix7cmVmOnR9KX0uc2VyaWFsaXplYH1mdW5jdGlvbiBlZih7Z2VuOmUsZGF0YTp0fSl7ZS5hZGQoaGUuZGVmYXVsdC5qc29uLCgwLHRlLl8pYEpTT04uc3RyaW5naWZ5KCR7dH0pYCl9ZnVuY3Rpb24gaW8oe2dlbjplfSx0KXtlLmlmKHQsKCk9PmUuYXNzaWduKHQsITEpLCgpPT5lLmFkZChoZS5kZWZhdWx0Lmpzb24sKDAsdGUuc3RyKWAsYCkpfXZhciBtcz17fSxTdD17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoU3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLFN0LnBhcnNlSnNvblN0cmluZz1TdC5wYXJzZUpzb25OdW1iZXI9U3QucGFyc2VKc29uPXZvaWQgMDtjb25zdCB0Zj0vcG9zaXRpb25ccyhcZCspJC87ZnVuY3Rpb24gaHQoZSx0KXtsZXQgcjtodC5tZXNzYWdlPXZvaWQgMDtsZXQgbjt0JiYoZT1lLnNsaWNlKHQpKTt0cnl7cmV0dXJuIGh0LnBvc2l0aW9uPXQrZS5sZW5ndGgsSlNPTi5wYXJzZShlKX1jYXRjaChzKXtpZihuPXRmLmV4ZWMocy5tZXNzYWdlKSwhbil7aHQubWVzc2FnZT0idW5leHBlY3RlZCBlbmQiO3JldHVybn1yPStuWzFdO2NvbnN0IGE9ZVtyXTtlPWUuc2xpY2UoMCxyKSxodC5wb3NpdGlvbj10K3I7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoe2h0Lm1lc3NhZ2U9YHVuZXhwZWN0ZWQgdG9rZW4gJHthfWA7cmV0dXJufX19U3QucGFyc2VKc29uPWh0LGh0Lm1lc3NhZ2U9dm9pZCAwLGh0LnBvc2l0aW9uPTAsaHQuY29kZT0ncmVxdWlyZSgiYWp2L2Rpc3QvcnVudGltZS9wYXJzZUpzb24iKS5wYXJzZUpzb24nO2Z1bmN0aW9uIHB0KGUsdCxyKXtsZXQgbj0iIixzO2lmKHB0Lm1lc3NhZ2U9dm9pZCAwLGVbdF09PT0iLSImJihuKz0iLSIsdCsrKSxlW3RdPT09IjAiKW4rPSIwIix0Kys7ZWxzZSBpZighYShyKSl7bygpO3JldHVybn1pZihyKXJldHVybiBwdC5wb3NpdGlvbj10LCtuO2lmKGVbdF09PT0iLiImJihuKz0iLiIsdCsrLCFhKCkpKXtvKCk7cmV0dXJufWlmKHM9ZVt0XSwocz09PSJlInx8cz09PSJFIikmJihuKz0iZSIsdCsrLHM9ZVt0XSwocz09PSIrInx8cz09PSItIikmJihuKz1zLHQrKyksIWEoKSkpe28oKTtyZXR1cm59cmV0dXJuIHB0LnBvc2l0aW9uPXQsK247ZnVuY3Rpb24gYShsKXtsZXQgZj0hMTtmb3IoO3M9ZVt0XSxzPj0iMCImJnM8PSI5IiYmKGw9PT12b2lkIDB8fGwtLSA+MCk7KWY9ITAsbis9cyx0Kys7cmV0dXJuIGZ9ZnVuY3Rpb24gbygpe3B0LnBvc2l0aW9uPXQscHQubWVzc2FnZT10PGUubGVuZ3RoP2B1bmV4cGVjdGVkIHRva2VuICR7ZVt0XX1gOiJ1bmV4cGVjdGVkIGVuZCJ9fVN0LnBhcnNlSnNvbk51bWJlcj1wdCxwdC5tZXNzYWdlPXZvaWQgMCxwdC5wb3NpdGlvbj0wLHB0LmNvZGU9J3JlcXVpcmUoImFqdi9kaXN0L3J1bnRpbWUvcGFyc2VKc29uIikucGFyc2VKc29uTnVtYmVyJztjb25zdCBjbz17YjoiXGIiLGY6IlxmIixuOmAKYCxyOiJcciIsdDoiCSIsJyInOiciJywiLyI6Ii8iLCJcXCI6IlxcIn0scmY9ImEiLmNoYXJDb2RlQXQoMCksbmY9IjAiLmNoYXJDb2RlQXQoMCk7ZnVuY3Rpb24gUnQoZSx0KXtsZXQgcj0iIixuO2ZvcihSdC5tZXNzYWdlPXZvaWQgMDtuPWVbdCsrXSxuIT09JyInOylpZihuPT09IlxcIilpZihuPWVbdF0sbiBpbiBjbylyKz1jb1tuXSx0Kys7ZWxzZSBpZihuPT09InUiKXt0Kys7bGV0IGE9NCxvPTA7Zm9yKDthLS07KXtpZihvPDw9NCxuPWVbdF0sbj09PXZvaWQgMCl7cygidW5leHBlY3RlZCBlbmQiKTtyZXR1cm59aWYobj1uLnRvTG93ZXJDYXNlKCksbj49ImEiJiZuPD0iZiIpbys9bi5jaGFyQ29kZUF0KDApLXJmKzEwO2Vsc2UgaWYobj49IjAiJiZuPD0iOSIpbys9bi5jaGFyQ29kZUF0KDApLW5mO2Vsc2V7cyhgdW5leHBlY3RlZCB0b2tlbiAke259YCk7cmV0dXJufXQrK31yKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG8pfWVsc2V7cyhgdW5leHBlY3RlZCB0b2tlbiAke259YCk7cmV0dXJufWVsc2UgaWYobj09PXZvaWQgMCl7cygidW5leHBlY3RlZCBlbmQiKTtyZXR1cm59ZWxzZSBpZihuLmNoYXJDb2RlQXQoMCk+PTMyKXIrPW47ZWxzZXtzKGB1bmV4cGVjdGVkIHRva2VuICR7bn1gKTtyZXR1cm59cmV0dXJuIFJ0LnBvc2l0aW9uPXQscjtmdW5jdGlvbiBzKGEpe1J0LnBvc2l0aW9uPXQsUnQubWVzc2FnZT1hfX1TdC5wYXJzZUpzb25TdHJpbmc9UnQsUnQubWVzc2FnZT12b2lkIDAsUnQucG9zaXRpb249MCxSdC5jb2RlPSdyZXF1aXJlKCJhanYvZGlzdC9ydW50aW1lL3BhcnNlSnNvbiIpLnBhcnNlSnNvblN0cmluZycsT2JqZWN0LmRlZmluZVByb3BlcnR5KG1zLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjb25zdCBzZj1Scix1bz1DZSxMPXVlLGFmPWt0LFk9TGUsb2Y9bmUsY2Y9RnQsdWY9bnMsdnM9U3QsbG89YmUsbGY9aG4sZmY9e2VsZW1lbnRzOm1mLHZhbHVlczp2ZixkaXNjcmltaW5hdG9yOmdmLHByb3BlcnRpZXM6cG8sb3B0aW9uYWxQcm9wZXJ0aWVzOnBvLGVudW06eWYsdHlwZTpFZixyZWY6JGZ9O2Z1bmN0aW9uIGZvKGUsdCl7Y29uc3Qgcj11by5nZXRDb21waWxpbmdTY2hlbWEuY2FsbCh0aGlzLGUpO2lmKHIpcmV0dXJuIHI7Y29uc3R7ZXM1Om4sbGluZXM6c309dGhpcy5vcHRzLmNvZGUse293blByb3BlcnRpZXM6YX09dGhpcy5vcHRzLG89bmV3IEwuQ29kZUdlbih0aGlzLnNjb3BlLHtlczU6bixsaW5lczpzLG93blByb3BlcnRpZXM6YX0pLGw9by5zY29wZU5hbWUoInBhcnNlIiksZj17c2VsZjp0aGlzLGdlbjpvLHNjaGVtYTplLnNjaGVtYSxzY2hlbWFFbnY6ZSxkZWZpbml0aW9uczp0LGRhdGE6WS5kZWZhdWx0LmRhdGEscGFyc2VOYW1lOmwsY2hhcjpvLm5hbWUoImMiKX07bGV0IHA7dHJ5e3RoaXMuX2NvbXBpbGF0aW9ucy5hZGQoZSksZS5wYXJzZU5hbWU9bCxkZihmKSxvLm9wdGltaXplKHRoaXMub3B0cy5jb2RlLm9wdGltaXplKTtjb25zdCBpPW8udG9TdHJpbmcoKTtwPWAke28uc2NvcGVSZWZzKFkuZGVmYXVsdC5zY29wZSl9cmV0dXJuICR7aX1gO2NvbnN0IEU9bmV3IEZ1bmN0aW9uKGAke1kuZGVmYXVsdC5zY29wZX1gLHApKHRoaXMuc2NvcGUuZ2V0KCkpO3RoaXMuc2NvcGUudmFsdWUobCx7cmVmOkV9KSxlLnBhcnNlPUV9Y2F0Y2goaSl7dGhyb3cgcCYmdGhpcy5sb2dnZXIuZXJyb3IoIkVycm9yIGNvbXBpbGluZyBwYXJzZXIsIGZ1bmN0aW9uIGNvZGU6IixwKSxkZWxldGUgZS5wYXJzZSxkZWxldGUgZS5wYXJzZU5hbWUsaX1maW5hbGx5e3RoaXMuX2NvbXBpbGF0aW9ucy5kZWxldGUoZSl9cmV0dXJuIGV9bXMuZGVmYXVsdD1mbztjb25zdCBfcz0oMCxMLl8pYHVuZGVmaW5lZGA7ZnVuY3Rpb24gZGYoZSl7Y29uc3R7Z2VuOnQscGFyc2VOYW1lOnIsY2hhcjpufT1lO3QuZnVuYyhyLCgwLEwuXylgJHtZLmRlZmF1bHQuanNvbn0sICR7WS5kZWZhdWx0Lmpzb25Qb3N9LCAke1kuZGVmYXVsdC5qc29uUGFydH1gLCExLCgpPT57dC5sZXQoWS5kZWZhdWx0LmRhdGEpLHQubGV0KG4pLHQuYXNzaWduKCgwLEwuXylgJHtyfS5tZXNzYWdlYCxfcyksdC5hc3NpZ24oKDAsTC5fKWAke3J9LnBvc2l0aW9uYCxfcyksdC5hc3NpZ24oWS5kZWZhdWx0Lmpzb25Qb3MsKDAsTC5fKWAke1kuZGVmYXVsdC5qc29uUG9zfSB8fCAwYCksdC5jb25zdChZLmRlZmF1bHQuanNvbkxlbiwoMCxMLl8pYCR7WS5kZWZhdWx0Lmpzb259Lmxlbmd0aGApLHZuKGUpLHdzKGUpLHQuaWYoWS5kZWZhdWx0Lmpzb25QYXJ0LCgpPT57dC5hc3NpZ24oKDAsTC5fKWAke3J9LnBvc2l0aW9uYCxZLmRlZmF1bHQuanNvblBvcyksdC5yZXR1cm4oWS5kZWZhdWx0LmRhdGEpfSksdC5pZigoMCxMLl8pYCR7WS5kZWZhdWx0Lmpzb25Qb3N9ID09PSAke1kuZGVmYXVsdC5qc29uTGVufWAsKCk9PnQucmV0dXJuKFkuZGVmYXVsdC5kYXRhKSksYXIoZSl9KX1mdW5jdGlvbiB2bihlKXtsZXQgdDtmb3IoY29uc3QgciBvZiBzZi5qdGRGb3JtcylpZihyIGluIGUuc2NoZW1hKXt0PXI7YnJlYWt9dD9wZihlLGZmW3RdKTp5cyhlKX1jb25zdCBoZj1nbyghMCxnbyghMSxhcikpO2Z1bmN0aW9uIHBmKGUsdCl7Y29uc3R7Z2VuOnIsc2NoZW1hOm4sZGF0YTpzfT1lO2lmKCFuLm51bGxhYmxlKXJldHVybiB0KGUpO05yKGUsIm51bGwiLHQsKCk9PnIuYXNzaWduKHMsbnVsbCkpfWZ1bmN0aW9uIG1mKGUpe2NvbnN0e2dlbjp0LHNjaGVtYTpyLGRhdGE6bn09ZTtldChlLCJbIik7Y29uc3Qgcz10LmxldCgiaSIsMCk7dC5hc3NpZ24obiwoMCxMLl8pYFtdYCksZ3MoZSwiXSIsKCk9Pntjb25zdCBhPXQubGV0KCJlbCIpO3ZuKGxlKFEoe30sZSkse3NjaGVtYTpyLmVsZW1lbnRzLGRhdGE6YX0pKSx0LmFzc2lnbigoMCxMLl8pYCR7bn1bJHtzfSsrXWAsYSl9KX1mdW5jdGlvbiB2ZihlKXtjb25zdHtnZW46dCxzY2hlbWE6cixkYXRhOm59PWU7ZXQoZSwieyIpLHQuYXNzaWduKG4sKDAsTC5fKWB7fWApLGdzKGUsIn0iLCgpPT5fZihlLHIudmFsdWVzKSl9ZnVuY3Rpb24gZ3MoZSx0LHIpe2hvKGUsdCxyKSxldChlLHQpfWZ1bmN0aW9uIGhvKGUsdCxyKXtjb25zdHtnZW46bn09ZTtuLmZvcigoMCxMLl8pYDske1kuZGVmYXVsdC5qc29uUG9zfTwke1kuZGVmYXVsdC5qc29uTGVufSAmJiAke19uKDEpfSE9PSR7dH07YCwoKT0+e3IoKSxOcihlLCIsIiwoKT0+bi5icmVhaygpLHMpfSk7ZnVuY3Rpb24gcygpe05yKGUsdCwoKT0+e30sYXIpfX1mdW5jdGlvbiBfZihlLHQpe2NvbnN0e2dlbjpyfT1lLG49ci5sZXQoImtleSIpO1Z0KGxlKFEoe30sZSkse2RhdGE6bn0pKSxldChlLCI6IiksX28oZSxuLHQpfWZ1bmN0aW9uIGdmKGUpe2NvbnN0e2dlbjp0LGRhdGE6cixzY2hlbWE6bn09ZSx7ZGlzY3JpbWluYXRvcjpzLG1hcHBpbmc6YX09bjtldChlLCJ7IiksdC5hc3NpZ24ociwoMCxMLl8pYHt9YCk7Y29uc3Qgbz10LmNvbnN0KCJwb3MiLFkuZGVmYXVsdC5qc29uUG9zKSxsPXQubGV0KCJ2YWx1ZSIpLGY9dC5sZXQoInRhZyIpO2hvKGUsIn0iLCgpPT57Y29uc3QgcD10LmxldCgia2V5Iik7VnQobGUoUSh7fSxlKSx7ZGF0YTpwfSkpLGV0KGUsIjoiKSx0LmlmKCgwLEwuXylgJHtwfSA9PT0gJHtzfWAsKCk9PntWdChsZShRKHt9LGUpLHtkYXRhOmZ9KSksdC5hc3NpZ24oKDAsTC5fKWAke3J9WyR7cH1dYCxmKSx0LmJyZWFrKCl9LCgpPT55cyhsZShRKHt9LGUpLHtkYXRhOmx9KSkpfSksdC5hc3NpZ24oWS5kZWZhdWx0Lmpzb25Qb3MsbyksdC5pZigoMCxMLl8pYCR7Zn0gPT09IHVuZGVmaW5lZGApLG10KGUsKDAsTC5zdHIpYGRpc2NyaW1pbmF0b3IgdGFnIG5vdCBmb3VuZGApO2Zvcihjb25zdCBwIGluIGEpdC5lbHNlSWYoKDAsTC5fKWAke2Z9ID09PSAke3B9YCksbW8obGUoUSh7fSxlKSx7c2NoZW1hOmFbcF19KSxzKTt0LmVsc2UoKSxtdChlLCgwLEwuc3RyKWBkaXNjcmltaW5hdG9yIHZhbHVlIG5vdCBpbiBzY2hlbWFgKSx0LmVuZElmKCl9ZnVuY3Rpb24gcG8oZSl7Y29uc3R7Z2VuOnQsZGF0YTpyfT1lO2V0KGUsInsiKSx0LmFzc2lnbihyLCgwLEwuXylge31gKSxtbyhlKX1mdW5jdGlvbiBtbyhlLHQpe2NvbnN0e2dlbjpyLHNjaGVtYTpuLGRhdGE6c309ZSx7cHJvcGVydGllczphLG9wdGlvbmFsUHJvcGVydGllczpvLGFkZGl0aW9uYWxQcm9wZXJ0aWVzOmx9PW47aWYoZ3MoZSwifSIsKCk9Pntjb25zdCBmPXIubGV0KCJrZXkiKTtpZihWdChsZShRKHt9LGUpLHtkYXRhOmZ9KSksZXQoZSwiOiIpLHIuaWYoITEpLHZvKGUsZixhKSx2byhlLGYsbyksdCl7ci5lbHNlSWYoKDAsTC5fKWAke2Z9ID09PSAke3R9YCk7Y29uc3QgcD1yLmxldCgidGFnIik7VnQobGUoUSh7fSxlKSx7ZGF0YTpwfSkpfXIuZWxzZSgpLGw/eXMobGUoUSh7fSxlKSx7ZGF0YTooMCxMLl8pYCR7c31bJHtmfV1gfSkpOm10KGUsKDAsTC5zdHIpYHByb3BlcnR5ICR7Zn0gbm90IGFsbG93ZWRgKSxyLmVuZElmKCl9KSxhKXtjb25zdCBmPSgwLG9mLmhhc1Byb3BGdW5jKShyKSxwPSgwLEwuYW5kKSguLi5PYmplY3Qua2V5cyhhKS5tYXAoaT0+KDAsTC5fKWAke2Z9LmNhbGwoJHtzfSwgJHtpfSlgKSk7ci5pZigoMCxMLm5vdCkocCksKCk9Pm10KGUsKDAsTC5zdHIpYG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydGllc2ApKX19ZnVuY3Rpb24gdm8oZSx0LHI9e30pe2NvbnN0e2dlbjpufT1lO2Zvcihjb25zdCBzIGluIHIpbi5lbHNlSWYoKDAsTC5fKWAke3R9ID09PSAke3N9YCksX28oZSx0LHJbc10pfWZ1bmN0aW9uIF9vKGUsdCxyKXt2bihsZShRKHt9LGUpLHtzY2hlbWE6cixkYXRhOigwLEwuXylgJHtlLmRhdGF9WyR7dH1dYH0pKX1mdW5jdGlvbiBFZihlKXtjb25zdHtnZW46dCxzY2hlbWE6cixkYXRhOm4sc2VsZjpzfT1lO3N3aXRjaChyLnR5cGUpe2Nhc2UiYm9vbGVhbiI6aGYoZSk7YnJlYWs7Y2FzZSJzdHJpbmciOlZ0KGUpO2JyZWFrO2Nhc2UidGltZXN0YW1wIjp7VnQoZSk7Y29uc3QgYT0oMCxsby51c2VGdW5jKSh0LGxmLmRlZmF1bHQpLHthbGxvd0RhdGU6byxwYXJzZURhdGU6bH09cy5vcHRzLGY9bz8oMCxMLl8pYCEke2F9KCR7bn0sIHRydWUpYDooMCxMLl8pYCEke2F9KCR7bn0pYCxwPWw/KDAsTC5vcikoZiwoMCxMLl8pYCgke259ID0gbmV3IERhdGUoJHtufSksIGZhbHNlKWAsKDAsTC5fKWBpc05hTigke259LnZhbHVlT2YoKSlgKTpmO3QuaWYocCwoKT0+bXQoZSwoMCxMLnN0cilgaW52YWxpZCB0aW1lc3RhbXBgKSk7YnJlYWt9Y2FzZSJmbG9hdDMyIjpjYXNlImZsb2F0NjQiOkVzKGUpO2JyZWFrO2RlZmF1bHQ6e2NvbnN0IGE9ci50eXBlO2lmKCFzLm9wdHMuaW50MzJyYW5nZSYmKGE9PT0iaW50MzIifHxhPT09InVpbnQzMiIpKUVzKGUsMTYpLGE9PT0idWludDMyIiYmdC5pZigoMCxMLl8pYCR7bn0gPCAwYCwoKT0+bXQoZSwoMCxMLnN0cilgaW50ZWdlciBvdXQgb2YgcmFuZ2VgKSk7ZWxzZXtjb25zdFtvLGwsZl09dWYuaW50UmFuZ2VbYV07RXMoZSxmKSx0LmlmKCgwLEwuXylgJHtufSA8ICR7b30gfHwgJHtufSA+ICR7bH1gLCgpPT5tdChlLCgwLEwuc3RyKWBpbnRlZ2VyIG91dCBvZiByYW5nZWApKX19fX1mdW5jdGlvbiBWdChlKXtldChlLCciJyksJHMoZSx2cy5wYXJzZUpzb25TdHJpbmcpfWZ1bmN0aW9uIHlmKGUpe2NvbnN0e2dlbjp0LGRhdGE6cixzY2hlbWE6bn09ZSxzPW4uZW51bTtldChlLCciJyksdC5pZighMSk7Zm9yKGNvbnN0IGEgb2Ygcyl7Y29uc3Qgbz1KU09OLnN0cmluZ2lmeShhKS5zbGljZSgxKTt0LmVsc2VJZigoMCxMLl8pYCR7X24oby5sZW5ndGgpfSA9PT0gJHtvfWApLHQuYXNzaWduKHIsKDAsTC5zdHIpYCR7YX1gKSx0LmFkZChZLmRlZmF1bHQuanNvblBvcyxvLmxlbmd0aCl9dC5lbHNlKCksYXIoZSksdC5lbmRJZigpfWZ1bmN0aW9uIEVzKGUsdCl7Y29uc3R7Z2VuOnJ9PWU7d3MoZSksci5pZigoMCxMLl8pYCItMDEyMzQ1Njc4OSIuaW5kZXhPZigke19uKDEpfSkgPCAwYCwoKT0+YXIoZSksKCk9PiRzKGUsdnMucGFyc2VKc29uTnVtYmVyLHQpKX1mdW5jdGlvbiBnbyhlLHQpe3JldHVybiByPT57Y29uc3R7Z2VuOm4sZGF0YTpzfT1yO05yKHIsYCR7ZX1gLCgpPT50KHIpLCgpPT5uLmFzc2lnbihzLGUpKX19ZnVuY3Rpb24gJGYoZSl7Y29uc3R7Z2VuOnQsc2VsZjpyLGRlZmluaXRpb25zOm4sc2NoZW1hOnMsc2NoZW1hRW52OmF9PWUse3JlZjpvfT1zLGw9bltvXTtpZighbCl0aHJvdyBuZXcgYWYuZGVmYXVsdChyLm9wdHMudXJpUmVzb2x2ZXIsIiIsbyxgTm8gZGVmaW5pdGlvbiAke299YCk7aWYoISgwLGNmLmhhc1JlZikobCkpcmV0dXJuIHZuKGxlKFEoe30sZSkse3NjaGVtYTpsfSkpO2NvbnN0e3Jvb3Q6Zn09YSxwPWZvLmNhbGwocixuZXcgdW8uU2NoZW1hRW52KHtzY2hlbWE6bCxyb290OmZ9KSxuKTtFbyhlLHdmKHQscCksITApfWZ1bmN0aW9uIHdmKGUsdCl7cmV0dXJuIHQucGFyc2U/ZS5zY29wZVZhbHVlKCJwYXJzZSIse3JlZjp0LnBhcnNlfSk6KDAsTC5fKWAke2Uuc2NvcGVWYWx1ZSgid3JhcHBlciIse3JlZjp0fSl9LnBhcnNlYH1mdW5jdGlvbiB5cyhlKXskcyhlLHZzLnBhcnNlSnNvbil9ZnVuY3Rpb24gJHMoZSx0LHIpe0VvKGUsKDAsbG8udXNlRnVuYykoZS5nZW4sdCkscil9ZnVuY3Rpb24gRW8oZSx0LHIpe2NvbnN0e2dlbjpuLGRhdGE6c309ZTtuLmFzc2lnbihzLCgwLEwuXylgJHt0fSgke1kuZGVmYXVsdC5qc29ufSwgJHtZLmRlZmF1bHQuanNvblBvc30ke3I/KDAsTC5fKWAsICR7cn1gOkwubmlsfSlgKSxuLmFzc2lnbihZLmRlZmF1bHQuanNvblBvcywoMCxMLl8pYCR7dH0ucG9zaXRpb25gKSxuLmlmKCgwLEwuXylgJHtzfSA9PT0gdW5kZWZpbmVkYCwoKT0+bXQoZSwoMCxMLl8pYCR7dH0ubWVzc2FnZWApKX1mdW5jdGlvbiBldChlLHQpe05yKGUsdCxhcil9ZnVuY3Rpb24gTnIoZSx0LHIsbil7Y29uc3R7Z2VuOnN9PWUsYT10Lmxlbmd0aDt3cyhlKSxzLmlmKCgwLEwuXylgJHtfbihhKX0gPT09ICR7dH1gLCgpPT57cy5hZGQoWS5kZWZhdWx0Lmpzb25Qb3MsYSksbj09bnVsbHx8bihlKX0sKCk9PnIoZSkpfWZ1bmN0aW9uIHdzKHtnZW46ZSxjaGFyOnR9KXtlLmNvZGUoKDAsTC5fKWB3aGlsZSgoJHt0fT0ke1kuZGVmYXVsdC5qc29ufVske1kuZGVmYXVsdC5qc29uUG9zfV0sJHt0fT09PSIgInx8JHt0fT09PSJcXG4ifHwke3R9PT09IlxcciJ8fCR7dH09PT0iXFx0IikpJHtZLmRlZmF1bHQuanNvblBvc30rKztgKX1mdW5jdGlvbiBfbihlKXtyZXR1cm4gZT09PTE/KDAsTC5fKWAke1kuZGVmYXVsdC5qc29ufVske1kuZGVmYXVsdC5qc29uUG9zfV1gOigwLEwuXylgJHtZLmRlZmF1bHQuanNvbn0uc2xpY2UoJHtZLmRlZmF1bHQuanNvblBvc30sICR7WS5kZWZhdWx0Lmpzb25Qb3N9KyR7ZX0pYH1mdW5jdGlvbiBhcihlKXttdChlLCgwLEwuXylgInVuZXhwZWN0ZWQgdG9rZW4gIiArICR7WS5kZWZhdWx0Lmpzb259WyR7WS5kZWZhdWx0Lmpzb25Qb3N9XWApfWZ1bmN0aW9uIG10KHtnZW46ZSxwYXJzZU5hbWU6dH0scil7ZS5hc3NpZ24oKDAsTC5fKWAke3R9Lm1lc3NhZ2VgLHIpLGUuYXNzaWduKCgwLEwuXylgJHt0fS5wb3NpdGlvbmAsWS5kZWZhdWx0Lmpzb25Qb3MpLGUucmV0dXJuKF9zKX0oZnVuY3Rpb24oZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Db2RlR2VuPXQuTmFtZT10Lm5pbD10LnN0cmluZ2lmeT10LnN0cj10Ll89dC5LZXl3b3JkQ3h0PXZvaWQgMDtjb25zdCByPXJhLG49dHMscz1mcyxhPWRzLG89bXMsbD0iSlRELW1ldGEtc2NoZW1hIjtjbGFzcyBmIGV4dGVuZHMgci5kZWZhdWx0e2NvbnN0cnVjdG9yKEU9e30pe3N1cGVyKGxlKFEoe30sRSkse2p0ZDohMH0pKX1fYWRkVm9jYWJ1bGFyaWVzKCl7c3VwZXIuX2FkZFZvY2FidWxhcmllcygpLHRoaXMuYWRkVm9jYWJ1bGFyeShuLmRlZmF1bHQpfV9hZGREZWZhdWx0TWV0YVNjaGVtYSgpe3N1cGVyLl9hZGREZWZhdWx0TWV0YVNjaGVtYSgpLHRoaXMub3B0cy5tZXRhJiZ0aGlzLmFkZE1ldGFTY2hlbWEocy5kZWZhdWx0LGwsITEpfWRlZmF1bHRNZXRhKCl7cmV0dXJuIHRoaXMub3B0cy5kZWZhdWx0TWV0YT1zdXBlci5kZWZhdWx0TWV0YSgpfHwodGhpcy5nZXRTY2hlbWEobCk/bDp2b2lkIDApfWNvbXBpbGVTZXJpYWxpemVyKEUpe2NvbnN0IFQ9dGhpcy5fYWRkU2NoZW1hKEUpO3JldHVybiBULnNlcmlhbGl6ZXx8dGhpcy5fY29tcGlsZVNlcmlhbGl6ZXIoVCl9Y29tcGlsZVBhcnNlcihFKXtjb25zdCBUPXRoaXMuX2FkZFNjaGVtYShFKTtyZXR1cm4gVC5wYXJzZXx8dGhpcy5fY29tcGlsZVBhcnNlcihUKX1fY29tcGlsZVNlcmlhbGl6ZXIoRSl7aWYoYS5kZWZhdWx0LmNhbGwodGhpcyxFLEUuc2NoZW1hLmRlZmluaXRpb25zfHx7fSksIUUuc2VyaWFsaXplKXRocm93IG5ldyBFcnJvcigiYWp2IGltcGxlbWVudGF0aW9uIGVycm9yIik7cmV0dXJuIEUuc2VyaWFsaXplfV9jb21waWxlUGFyc2VyKEUpe2lmKG8uZGVmYXVsdC5jYWxsKHRoaXMsRSxFLnNjaGVtYS5kZWZpbml0aW9uc3x8e30pLCFFLnBhcnNlKXRocm93IG5ldyBFcnJvcigiYWp2IGltcGxlbWVudGF0aW9uIGVycm9yIik7cmV0dXJuIEUucGFyc2V9fWUuZXhwb3J0cz10PWYsT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZGVmYXVsdD1mO3ZhciBwPVdlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJLZXl3b3JkQ3h0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcC5LZXl3b3JkQ3h0fX0pO3ZhciBpPXVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5ffX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJzdHIiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBpLnN0cn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwic3RyaW5naWZ5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5zdHJpbmdpZnl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIm5pbCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGkubmlsfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJOYW1lIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5OYW1lfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJDb2RlR2VuIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5Db2RlR2VufX0pfSkoem4sem4uZXhwb3J0cyk7dmFyIFNmPWVlJiZlZS5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KEl0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxJdC5WYWxpZGF0ZT1JdC5BZGRTY2hlbWE9dm9pZCAwO2NvbnN0IFJmPVNmKHpuLmV4cG9ydHMpLHlvPW5ldyBSZi5kZWZhdWx0LGJmPShlLHQpPT5lKHQpP251bGw6ZS5lcnJvcnM7ZnVuY3Rpb24gT2YoZSx0KXt5by5hZGRTY2hlbWEodCxlKX1JdC5BZGRTY2hlbWE9T2Y7ZnVuY3Rpb24gTmYoZSx0KXtjb25zdCByPXlvLmdldFNjaGVtYShlKTtpZihyKXJldHVybiBiZihyLHQpfUl0LlZhbGlkYXRlPU5mLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShybiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSkscm4uU1RTT3B0aW9uc0Jhc2U9dm9pZCAwO2NvbnN0IFBmPUl0O2NsYXNzIFRme2NvbnN0cnVjdG9yKHQ9bnVsbCl7X3IodGhpcywiX29wdGlvbnMiKTt0aGlzLl9vcHRpb25zPXQsdCE9PW51bGwmJih0eXBlb2YgdC52YWxpZGF0b3I9PSJ1bmRlZmluZWQifHwoMCxQZi5WYWxpZGF0ZSkodC52YWxpZGF0b3IsdCkpfWdldCBvcHRpb25zKCl7cmV0dXJuIHRoaXMuX29wdGlvbnN9fXJuLlNUU09wdGlvbnNCYXNlPVRmO3ZhciBvcj17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkob3IsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG9yLkplc3RTbGVlcD1vci5TbGVlcD12b2lkIDA7YXN5bmMgZnVuY3Rpb24gJG8oZT0xZTMpe3JldHVybiBuZXcgUHJvbWlzZSh0PT5zZXRUaW1lb3V0KHQsZSkpfW9yLlNsZWVwPSRvO2FzeW5jIGZ1bmN0aW9uIEFmKCl7cmV0dXJuICRvKDEwMCl9b3IuSmVzdFNsZWVwPUFmO3ZhciB3bz17fTsoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuY29tcGFyZVBhcmFtZXRlclR5cGVzPWUuT0F1dGgyUGFyYW1ldGVyRXJyb3JUeXBlPWUuT0lEQ0FkZHJlc3NDbGFpbT1lLk9JRENTdGFuZGFyZENsYWltPWUuT0F1dGgyUGFyYW1ldGVyVHlwZT12b2lkIDAsZnVuY3Rpb24obil7bi5BVURJRU5DRT0iQVVESUVOQ0UiLG4uQ0xJRU5UX0lEPSJjbGllbnRfaWQiLG4uQ0xJRU5UX1NFQ1JFVD0iY2xpZW50X3NlY3JldCIsbi5SRVNQT05TRV9UWVBFPSJyZXNwb25zZV90eXBlIixuLlNDT1BFPSJzY29wZSIsbi5TVEFURT0ic3RhdGUiLG4uUkVESVJFQ1RfVVJJPSJyZWRpcmVjdF91cmkiLG4uRVJST1I9ImVycm9yIixuLkVSUk9SX0RFU0NSSVBUSU9OPSJlcnJvcl9kZXNjcmlwdGlvbiIsbi5FUlJPUl9DT0RFUz0iZXJyb3JfY29kZXMiLG4uRVJST1JfVVJJPSJlcnJvcl91cmkiLG4uR1JBTlRfVFlQRT0iZ3JhbnRfdHlwZSIsbi5DT0RFPSJjb2RlIixuLkFDQ0VTU19UT0tFTj0iYWNjZXNzX3Rva2VuIixuLlRPS0VOX1RZUEU9InRva2VuX3R5cGUiLG4uRVhQSVJFU19JTj0iZXhwaXJlc19pbiIsbi5VU0VSTkFNRT0idXNlcm5hbWUiLG4uUEFTU1dPUkQ9InBhc3N3b3JkIixuLlJFRlJFU0hfVE9LRU49InJlZnJlc2hfdG9rZW4iLG4uUkVTUE9OU0VfTU9ERT0icmVzcG9uc2VfbW9kZSIsbi5USU1FU1RBTVA9InRpbWVzdGFtcCIsbi5UUkFDRV9JRD0idHJhY2VfaWQiLG4uQ09SUkVMQVRJT05fSUQ9ImNvcnJlbGF0aW9uX2lkIn0oZS5PQXV0aDJQYXJhbWV0ZXJUeXBlfHwoZS5PQXV0aDJQYXJhbWV0ZXJUeXBlPXt9KSksZnVuY3Rpb24obil7bi5TVUI9InN1YiIsbi5OQU1FPSJuYW1lIixuLkdJVkVOX05BTUU9ImdpdmVuX25hbWUiLG4uRkFNSUxZX05BTUU9ImZhbWlseV9uYW1lIixuLk1JRERMRV9OQU1FPSJtaWRkbGVfbmFtZSIsbi5OSUNLTkFNRT0ibmlja25hbWUiLG4uUFJFRkVSUkVEX1VTRVJOQU1FPSJwcmVmZXJyZWRfdXNlcm5hbWUiLG4uUFJPRklMRT0icHJvZmlsZSIsbi5QSUNUVVJFPSJwaWN0dXJlIixuLldFQlNJVEU9IndlYnNpdGUiLG4uRU1BSUw9ImVtYWlsIixuLkVNQUlMX1ZFUklGSUVEPSJlbWFpbF92ZXJpZmllZCIsbi5HRU5ERVI9ImdlbmRlciIsbi5CSVJUSERBVEU9ImJpcnRoZGF0ZSIsbi5aT05FSU5GTz0iem9uZWluZm8iLG4uTE9DQUxFPSJsb2NhbGUiLG4uUEhPTkVfTlVNQkVSPSJwaG9uZV9udW1iZXIiLG4uUEhPTkVfTlVNQkVSX1ZFUklGSUVEPSJwaG9uZV9udW1iZXJfdmVyaWZpZWQiLG4uQUREUkVTUz0iYWRkcmVzcyIsbi5DTElFTlRfU0VDUkVUPSJjbGllbnRfc2VjcmV0IixuLk5PTkNFPSJub25jZSJ9KGUuT0lEQ1N0YW5kYXJkQ2xhaW18fChlLk9JRENTdGFuZGFyZENsYWltPXt9KSksZnVuY3Rpb24obil7bi5GT1JNQVRURUQ9ImZvcm1hdHRlZCIsbi5TVFJFRVRfQUREUkVTUz0ic3RyZWV0X2FkZHJlc3MiLG4uTE9DQUxJVFk9ImxvY2FsaXR5IixuLlJFR0lPTj0icmVnaW9uIixuLkNPVU5UUlk9ImNvdW50cnkifShlLk9JRENBZGRyZXNzQ2xhaW18fChlLk9JRENBZGRyZXNzQ2xhaW09e30pKTtjbGFzcyB0e31fcih0LCJOT1RfRVFVQUwiLHtjb2RlOiJTVFNfT0FVVEgyX0VSUl8wMDAxIixkZXNjcmlwdGlvbjoiUGFyYW1ldGVyIHZhbHVlcyBub3QgZXF1YWwuIn0pLF9yKHQsIk5PVF9QUkVTRU5UIix7Y29kZToiU1RTX09BVVRIMl9FUlJfMDAwMiIsZGVzY3JpcHRpb246IlBhcmFtZXRlciBub3QgcHJvdmlkZWQuIn0pLF9yKHQsIklOVkFMSURfRk9STUFUIix7Y29kZToiU1RTX09BVVRIMl9FUlJfMDAwMyIsZGVzY3JpcHRpb246IlBhcmFtZXRlciB2YWx1ZSBmb3JtYXQgaW52YWxpZC4ifSksX3IodCwiRVhQSVJFRCIse2NvZGU6IlNUU19PQVVUSDJfRVJSXzAwMDQiLGRlc2NyaXB0aW9uOiJQYXJhbWV0ZXIgdmFsdWUgZXhwaXJlZC4ifSksZS5PQXV0aDJQYXJhbWV0ZXJFcnJvclR5cGU9dDtmdW5jdGlvbiByKG4scyxhKXtjb25zdCBvPVtdO2ZvcihsZXQgbD0wO2w8YS5sZW5ndGg7bCsrKXtjb25zdCBmPWFbbF07aWYobltsXS5sb2NhbGVDb21wYXJlKHNbbF0pIT09MCl7Y29uc3QgcD17ZXJyb3I6dC5OT1RfRVFVQUwuY29kZSxlcnJvcl9kZXNjcmlwdGlvbjp0Lk5PVF9FUVVBTC5kZXNjcmlwdGlvbix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkZXRhaWxzOmAke3QuTk9UX0VRVUFMLmRlc2NyaXB0aW9ufTogUGFyYW1ldGVyOiBbJHtmfV1gfTtvLnB1c2gocCl9fXJldHVybiBvfWUuY29tcGFyZVBhcmFtZXRlclR5cGVzPXJ9KSh3byksZnVuY3Rpb24oZSl7dmFyIHQ9ZWUmJmVlLl9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24ocyxhLG8sbCl7bD09PXZvaWQgMCYmKGw9byk7dmFyIGY9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLG8pOyghZnx8KCJnZXQiaW4gZj8hYS5fX2VzTW9kdWxlOmYud3JpdGFibGV8fGYuY29uZmlndXJhYmxlKSkmJihmPXtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBhW29dfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLGwsZil9OmZ1bmN0aW9uKHMsYSxvLGwpe2w9PT12b2lkIDAmJihsPW8pLHNbbF09YVtvXX0pLHI9ZWUmJmVlLl9fZXhwb3J0U3Rhcnx8ZnVuY3Rpb24ocyxhKXtmb3IodmFyIG8gaW4gcylvIT09ImRlZmF1bHQiJiYhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsbykmJnQoYSxzLG8pfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS4kc3RzZ2RmPWUuJHN0c2dkPXZvaWQgMCxyKHRuLGUpLHIocm4sZSkscihvcixlKSxyKEl0LGUpLHIod28sZSksZS4kc3RzZ2Q9e307ZnVuY3Rpb24gbigpe3JldHVybiBlLiRzdHNnZH1lLiRzdHNnZGY9bn0oQ3QpO2NsYXNzIENme2NvbnN0cnVjdG9yKCl7dGhpcy5EaWdlc3RNZXNzYWdlPWFzeW5jIGZ1bmN0aW9uKHQpe2NvbnN0IG49bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHQpLHM9YXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoIlNIQS0yNTYiLG4pLGE9QXJyYXkuZnJvbShuZXcgVWludDhBcnJheShzKSk7cmV0dXJuIGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5hKSl9LHRoaXMuQ3JlYXRlUmFuZG9tU3RyaW5nPSh0PTQzKT0+e2NvbnN0IHI9QXJyYXkuZnJvbShjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KHQpKSk7cmV0dXJuIGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5yKSl9LHRoaXMuQ3JlYXRlUmFuZG9tU3RyaW5nRXg9KCk9Pntjb25zdCB0PSIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei1ffi4iO2xldCByPSIiO3JldHVybiBBcnJheS5mcm9tKGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoNDMpKSkuZm9yRWFjaChzPT5yKz10W3MldC5sZW5ndGhdKSxyfX19Y2xhc3MgSWZ7Y29uc3RydWN0b3IoKXt0aGlzLkRlY29kZVF1ZXJ5UGFyYW1zPXQ9Pntjb25zdCByPXt9O3JldHVybiBPYmplY3Qua2V5cyh0KS5maWx0ZXIobj0+dHlwZW9mIHRbbl0hPSJ1bmRlZmluZWQiKS5tYXAobj0+e3JbZGVjb2RlVVJJQ29tcG9uZW50KG4pXT1kZWNvZGVVUklDb21wb25lbnQodFtuXSl9KSxyfSx0aGlzLkNyZWF0ZVF1ZXJ5UGFyYW1zPXQ9Pk9iamVjdC5rZXlzKHQpLmZpbHRlcihyPT50eXBlb2YgdFtyXSE9InVuZGVmaW5lZCIpLm1hcChyPT5BcnJheS5pc0FycmF5KHRbcl0pP2VuY29kZVVSSUNvbXBvbmVudChyKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KHRbcl0uam9pbigiICIpKTplbmNvZGVVUklDb21wb25lbnQocikrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0W3JdKSkuam9pbigiJiIpLHRoaXMuX0dldFF1ZXJ5UGFyYW1zPXQ9PntsZXQgcj17fTtjb25zdCBuPXQuc3BsaXQoIj8iKTtpZihuLmxlbmd0aD09Mil7Y29uc3Qgcz1uWzFdLnNwbGl0KCImIiksYT17fTtsZXQgbz0iIjtzLmZvckVhY2goZnVuY3Rpb24obCl7bz1sLnNwbGl0KCI9Iiksby5sZW5ndGg9PTImJihhW29bMF1dPW9bMV0pfSkscj10aGlzLkRlY29kZVF1ZXJ5UGFyYW1zKGEpfXJldHVybiByfSx0aGlzLkdldFF1ZXJ5UGFyYW1zPSgpPT50aGlzLl9HZXRRdWVyeVBhcmFtcyh3aW5kb3cubG9jYXRpb24uaHJlZil9fWZ1bmN0aW9uIFNzKGUpe3RoaXMubWVzc2FnZT1lfVNzLnByb3RvdHlwZT1uZXcgRXJyb3IsU3MucHJvdG90eXBlLm5hbWU9IkludmFsaWRDaGFyYWN0ZXJFcnJvciI7dmFyIFNvPXR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ3aW5kb3cuYXRvYiYmd2luZG93LmF0b2IuYmluZCh3aW5kb3cpfHxmdW5jdGlvbihlKXt2YXIgdD1TdHJpbmcoZSkucmVwbGFjZSgvPSskLywiIik7aWYodC5sZW5ndGglND09MSl0aHJvdyBuZXcgU3MoIidhdG9iJyBmYWlsZWQ6IFRoZSBzdHJpbmcgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuIik7Zm9yKHZhciByLG4scz0wLGE9MCxvPSIiO249dC5jaGFyQXQoYSsrKTt+biYmKHI9cyU0PzY0KnIrbjpuLHMrKyU0KT9vKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDI1NSZyPj4oLTIqcyY2KSk6MCluPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuaW5kZXhPZihuKTtyZXR1cm4gb307ZnVuY3Rpb24gRGYoZSl7dmFyIHQ9ZS5yZXBsYWNlKC8tL2csIisiKS5yZXBsYWNlKC9fL2csIi8iKTtzd2l0Y2godC5sZW5ndGglNCl7Y2FzZSAwOmJyZWFrO2Nhc2UgMjp0Kz0iPT0iO2JyZWFrO2Nhc2UgMzp0Kz0iPSI7YnJlYWs7ZGVmYXVsdDp0aHJvdyJJbGxlZ2FsIGJhc2U2NHVybCBzdHJpbmchIn10cnl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoU28ocikucmVwbGFjZSgvKC4pL2csZnVuY3Rpb24obixzKXt2YXIgYT1zLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7cmV0dXJuIGEubGVuZ3RoPDImJihhPSIwIithKSwiJSIrYX0pKX0odCl9Y2F0Y2h7cmV0dXJuIFNvKHQpfX1mdW5jdGlvbiBnbihlKXt0aGlzLm1lc3NhZ2U9ZX1mdW5jdGlvbiBqZihlLHQpe2lmKHR5cGVvZiBlIT0ic3RyaW5nIil0aHJvdyBuZXcgZ24oIkludmFsaWQgdG9rZW4gc3BlY2lmaWVkIik7dmFyIHI9KHQ9dHx8e30pLmhlYWRlcj09PSEwPzA6MTt0cnl7cmV0dXJuIEpTT04ucGFyc2UoRGYoZS5zcGxpdCgiLiIpW3JdKSl9Y2F0Y2gobil7dGhyb3cgbmV3IGduKCJJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogIituLm1lc3NhZ2UpfX1nbi5wcm90b3R5cGU9bmV3IEVycm9yLGduLnByb3RvdHlwZS5uYW1lPSJJbnZhbGlkVG9rZW5FcnJvciI7dmFyIFByPWVlJiZlZS5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4gUHI9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LHI9MSxuPWFyZ3VtZW50cy5sZW5ndGg7cjxuO3IrKyl7dD1hcmd1bWVudHNbcl07Zm9yKHZhciBzIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscykmJihlW3NdPXRbc10pfXJldHVybiBlfSxQci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Z1bmN0aW9uIFRyKGUsdCl7aWYoIXQpcmV0dXJuIiI7dmFyIHI9IjsgIitlO3JldHVybiB0PT09ITA/cjpyKyI9Iit0fWZ1bmN0aW9uIGtmKGUpe2lmKHR5cGVvZiBlLmV4cGlyZXM9PSJudW1iZXIiKXt2YXIgdD1uZXcgRGF0ZTt0LnNldE1pbGxpc2Vjb25kcyh0LmdldE1pbGxpc2Vjb25kcygpK2UuZXhwaXJlcyo4NjRlNSksZS5leHBpcmVzPXR9cmV0dXJuIFRyKCJFeHBpcmVzIixlLmV4cGlyZXM/ZS5leHBpcmVzLnRvVVRDU3RyaW5nKCk6IiIpK1RyKCJEb21haW4iLGUuZG9tYWluKStUcigiUGF0aCIsZS5wYXRoKStUcigiU2VjdXJlIixlLnNlY3VyZSkrVHIoIlNhbWVTaXRlIixlLnNhbWVTaXRlKX1mdW5jdGlvbiBVZihlLHQscil7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKS5yZXBsYWNlKC8lKDIzfDI0fDI2fDJCfDVFfDYwfDdDKS9nLGRlY29kZVVSSUNvbXBvbmVudCkucmVwbGFjZSgvXCgvZywiJTI4IikucmVwbGFjZSgvXCkvZywiJTI5IikrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0KS5yZXBsYWNlKC8lKDIzfDI0fDI2fDJCfDNBfDNDfDNFfDNEfDJGfDNGfDQwfDVCfDVEfDVFfDYwfDdCfDdEfDdDKS9nLGRlY29kZVVSSUNvbXBvbmVudCkra2Yocil9ZnVuY3Rpb24gRmYoZSl7Zm9yKHZhciB0PXt9LHI9ZT9lLnNwbGl0KCI7ICIpOltdLG49LyglW1xkQS1GXXsyfSkrL2dpLHM9MDtzPHIubGVuZ3RoO3MrKyl7dmFyIGE9cltzXS5zcGxpdCgiPSIpLG89YS5zbGljZSgxKS5qb2luKCI9Iik7by5jaGFyQXQoMCk9PT0nIicmJihvPW8uc2xpY2UoMSwtMSkpO3RyeXt2YXIgbD1hWzBdLnJlcGxhY2UobixkZWNvZGVVUklDb21wb25lbnQpO3RbbF09by5yZXBsYWNlKG4sZGVjb2RlVVJJQ29tcG9uZW50KX1jYXRjaHt9fXJldHVybiB0fWZ1bmN0aW9uIE1mKCl7cmV0dXJuIEZmKGRvY3VtZW50LmNvb2tpZSl9ZnVuY3Rpb24gTGYoZSl7cmV0dXJuIE1mKClbZV19dmFyIFZmPUxmO2Z1bmN0aW9uIFJvKGUsdCxyKXtkb2N1bWVudC5jb29raWU9VWYoZSx0LFByKHtwYXRoOiIvIn0scikpfXZhciB6Zj1SbztmdW5jdGlvbiBIZihlLHQpe1JvKGUsIiIsUHIoUHIoe30sdCkse2V4cGlyZXM6LTF9KSl9dmFyIEtmPUhmO2NvbnN0IEVuPU5zKGBwcm9jOiR7cHJvY2Vzcy5waWR9OnN0b3JhZ2UudHNgKTt2YXIgYm89KGU9PihlLkxPQ0FMX1NUT1JBR0U9IkxvY2FsU3RvcmFnZSIsZS5TRVNTSU9OX1NUT1JBR0U9IlNlc3Npb25TdG9yYWdlIixlLkNPT0tJRV9TVE9SQUdFPSJDb29raWVTdG9yYWdlIixlLk1FTU9SWV9TVE9SQUdFPSJNZW1vcnlTdG9yYWdlIixlKSkoYm98fHt9KTtjbGFzcyBCZntjb25zdHJ1Y3Rvcigpe3RoaXMuZ2V0PXQ9Pntjb25zdCByPVZmKHQpO3JldHVybiByP0pTT04ucGFyc2Uocik6bnVsbH0sdGhpcy5zZXQ9KHQscixuPXt9KT0+e2xldCBzPXt9O3dpbmRvdy5sb2NhdGlvbi5wcm90b2NvbD09PSJodHRwczoiJiYocz17c2VjdXJlOiEwLHNhbWVTaXRlOiJub25lIn0pLG4mJm4uZGF5c1VudGlsRXhwaXJlP3MuZXhwaXJlcz1uLmRheXNVbnRpbEV4cGlyZTpzLmV4cGlyZXM9MSxFbihgQ29va2llU3RvcmFnZS5zZXQ6IGtleTogJHt0fSwgdmFsdWU6IFske3J9XWApLHpmKHQsSlNPTi5zdHJpbmdpZnkocikscyl9LHRoaXMucmVtb3ZlPXQ9PntLZih0KX19fWNsYXNzIEpme2NvbnN0cnVjdG9yKCl7dGhpcy5nZXQ9dD0+e2NvbnN0IHI9c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0KTtyZXR1cm4gdHlwZW9mIHI9PSJ1bmRlZmluZWQifHxyPT09bnVsbD9udWxsOkpTT04ucGFyc2Uocil9LHRoaXMuc2V0PSh0LHIpPT57RW4oYFNlc3Npb25TdG9yYWdlLnNldDoga2V5OiAke3R9LCB2YWx1ZTogWyR7cn1dYCksc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0LEpTT04uc3RyaW5naWZ5KHIpKX0sdGhpcy5yZW1vdmU9dD0+e3Nlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0odCl9fX1jbGFzcyBxZntjb25zdHJ1Y3Rvcigpe3RoaXMuZ2V0PXQ9Pntjb25zdCByPWxvY2FsU3RvcmFnZS5nZXRJdGVtKHQpO3JldHVybiB0eXBlb2Ygcj09InVuZGVmaW5lZCJ8fHI9PT1udWxsP251bGw6SlNPTi5wYXJzZShyKX0sdGhpcy5zZXQ9KHQscik9PntFbihgTG9jYWxTdG9yYWdlLnNldDoga2V5OiAke3R9LCB2YWx1ZTogWyR7cn1dYCksbG9jYWxTdG9yYWdlLnNldEl0ZW0odCxKU09OLnN0cmluZ2lmeShyKSl9LHRoaXMucmVtb3ZlPXQ9Pntsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0KX19fWNsYXNzIEdme2NvbnN0cnVjdG9yKCl7U2UodGhpcyxIdCx2b2lkIDApO2NlKHRoaXMsSHQse30pLHRoaXMuZ2V0PXQ9Pntjb25zdCByPVYodGhpcyxIdClbdF07cmV0dXJuIHR5cGVvZiByPT0idW5kZWZpbmVkInx8cj09PW51bGw/bnVsbDpyfSx0aGlzLnNldD0odCxyKT0+e0VuKGBNZW1vcnlTdG9yYWdlLnNldDoga2V5OiAke3R9LCB2YWx1ZTogWyR7cn1dYCksVih0aGlzLEh0KVt0XT1yfSx0aGlzLnJlbW92ZT10PT57ZGVsZXRlIFYodGhpcyxIdClbdF19fX1IdD1uZXcgV2Vha01hcDtjbGFzcyBRZntjb25zdHJ1Y3Rvcih0KXtTZSh0aGlzLGJ0LG51bGwpO3N3aXRjaCh0LmNsaWVudFN0b3JhZ2VUeXBlKXtjYXNlIlNlc3Npb25TdG9yYWdlIjpjZSh0aGlzLGJ0LG5ldyBKZik7YnJlYWs7Y2FzZSJMb2NhbFN0b3JhZ2UiOmNlKHRoaXMsYnQsbmV3IHFmKTticmVhaztjYXNlIkNvb2tpZVN0b3JhZ2UiOmNlKHRoaXMsYnQsbmV3IEJmKTticmVhaztjYXNlIk1lbW9yeVN0b3JhZ2UiOmNlKHRoaXMsYnQsbmV3IEdmKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5rbm93biBbJHt0LmNsaWVudFN0b3JhZ2VUeXBlfV0gc3RvcmFnZSB0eXBlLmApfX1HZXRTdG9yYWdlKCl7cmV0dXJuIFYodGhpcyxidCl9fWJ0PW5ldyBXZWFrTWFwO3ZhciBpcjsoZnVuY3Rpb24oZSl7ZVtlLkFDQ0VQVEVEPTIwMl09IkFDQ0VQVEVEIixlW2UuQkFEX0dBVEVXQVk9NTAyXT0iQkFEX0dBVEVXQVkiLGVbZS5CQURfUkVRVUVTVD00MDBdPSJCQURfUkVRVUVTVCIsZVtlLkNPTkZMSUNUPTQwOV09IkNPTkZMSUNUIixlW2UuQ09OVElOVUU9MTAwXT0iQ09OVElOVUUiLGVbZS5DUkVBVEVEPTIwMV09IkNSRUFURUQiLGVbZS5FWFBFQ1RBVElPTl9GQUlMRUQ9NDE3XT0iRVhQRUNUQVRJT05fRkFJTEVEIixlW2UuRkFJTEVEX0RFUEVOREVOQ1k9NDI0XT0iRkFJTEVEX0RFUEVOREVOQ1kiLGVbZS5GT1JCSURERU49NDAzXT0iRk9SQklEREVOIixlW2UuR0FURVdBWV9USU1FT1VUPTUwNF09IkdBVEVXQVlfVElNRU9VVCIsZVtlLkdPTkU9NDEwXT0iR09ORSIsZVtlLkhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEPTUwNV09IkhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEIixlW2UuSU1fQV9URUFQT1Q9NDE4XT0iSU1fQV9URUFQT1QiLGVbZS5JTlNVRkZJQ0lFTlRfU1BBQ0VfT05fUkVTT1VSQ0U9NDE5XT0iSU5TVUZGSUNJRU5UX1NQQUNFX09OX1JFU09VUkNFIixlW2UuSU5TVUZGSUNJRU5UX1NUT1JBR0U9NTA3XT0iSU5TVUZGSUNJRU5UX1NUT1JBR0UiLGVbZS5JTlRFUk5BTF9TRVJWRVJfRVJST1I9NTAwXT0iSU5URVJOQUxfU0VSVkVSX0VSUk9SIixlW2UuTEVOR1RIX1JFUVVJUkVEPTQxMV09IkxFTkdUSF9SRVFVSVJFRCIsZVtlLkxPQ0tFRD00MjNdPSJMT0NLRUQiLGVbZS5NRVRIT0RfRkFJTFVSRT00MjBdPSJNRVRIT0RfRkFJTFVSRSIsZVtlLk1FVEhPRF9OT1RfQUxMT1dFRD00MDVdPSJNRVRIT0RfTk9UX0FMTE9XRUQiLGVbZS5NT1ZFRF9QRVJNQU5FTlRMWT0zMDFdPSJNT1ZFRF9QRVJNQU5FTlRMWSIsZVtlLk1PVkVEX1RFTVBPUkFSSUxZPTMwMl09Ik1PVkVEX1RFTVBPUkFSSUxZIixlW2UuTVVMVElfU1RBVFVTPTIwN109Ik1VTFRJX1NUQVRVUyIsZVtlLk1VTFRJUExFX0NIT0lDRVM9MzAwXT0iTVVMVElQTEVfQ0hPSUNFUyIsZVtlLk5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQ9NTExXT0iTkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRCIsZVtlLk5PX0NPTlRFTlQ9MjA0XT0iTk9fQ09OVEVOVCIsZVtlLk5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OPTIwM109Ik5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OIixlW2UuTk9UX0FDQ0VQVEFCTEU9NDA2XT0iTk9UX0FDQ0VQVEFCTEUiLGVbZS5OT1RfRk9VTkQ9NDA0XT0iTk9UX0ZPVU5EIixlW2UuTk9UX0lNUExFTUVOVEVEPTUwMV09Ik5PVF9JTVBMRU1FTlRFRCIsZVtlLk5PVF9NT0RJRklFRD0zMDRdPSJOT1RfTU9ESUZJRUQiLGVbZS5PSz0yMDBdPSJPSyIsZVtlLlBBUlRJQUxfQ09OVEVOVD0yMDZdPSJQQVJUSUFMX0NPTlRFTlQiLGVbZS5QQVlNRU5UX1JFUVVJUkVEPTQwMl09IlBBWU1FTlRfUkVRVUlSRUQiLGVbZS5QRVJNQU5FTlRfUkVESVJFQ1Q9MzA4XT0iUEVSTUFORU5UX1JFRElSRUNUIixlW2UuUFJFQ09ORElUSU9OX0ZBSUxFRD00MTJdPSJQUkVDT05ESVRJT05fRkFJTEVEIixlW2UuUFJFQ09ORElUSU9OX1JFUVVJUkVEPTQyOF09IlBSRUNPTkRJVElPTl9SRVFVSVJFRCIsZVtlLlBST0NFU1NJTkc9MTAyXT0iUFJPQ0VTU0lORyIsZVtlLlBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEPTQwN109IlBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEIixlW2UuUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRT00MzFdPSJSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFIixlW2UuUkVRVUVTVF9USU1FT1VUPTQwOF09IlJFUVVFU1RfVElNRU9VVCIsZVtlLlJFUVVFU1RfVE9PX0xPTkc9NDEzXT0iUkVRVUVTVF9UT09fTE9ORyIsZVtlLlJFUVVFU1RfVVJJX1RPT19MT05HPTQxNF09IlJFUVVFU1RfVVJJX1RPT19MT05HIixlW2UuUkVRVUVTVEVEX1JBTkdFX05PVF9TQVRJU0ZJQUJMRT00MTZdPSJSRVFVRVNURURfUkFOR0VfTk9UX1NBVElTRklBQkxFIixlW2UuUkVTRVRfQ09OVEVOVD0yMDVdPSJSRVNFVF9DT05URU5UIixlW2UuU0VFX09USEVSPTMwM109IlNFRV9PVEhFUiIsZVtlLlNFUlZJQ0VfVU5BVkFJTEFCTEU9NTAzXT0iU0VSVklDRV9VTkFWQUlMQUJMRSIsZVtlLlNXSVRDSElOR19QUk9UT0NPTFM9MTAxXT0iU1dJVENISU5HX1BST1RPQ09MUyIsZVtlLlRFTVBPUkFSWV9SRURJUkVDVD0zMDddPSJURU1QT1JBUllfUkVESVJFQ1QiLGVbZS5UT09fTUFOWV9SRVFVRVNUUz00MjldPSJUT09fTUFOWV9SRVFVRVNUUyIsZVtlLlVOQVVUSE9SSVpFRD00MDFdPSJVTkFVVEhPUklaRUQiLGVbZS5VTkFWQUlMQUJMRV9GT1JfTEVHQUxfUkVBU09OUz00NTFdPSJVTkFWQUlMQUJMRV9GT1JfTEVHQUxfUkVBU09OUyIsZVtlLlVOUFJPQ0VTU0FCTEVfRU5USVRZPTQyMl09IlVOUFJPQ0VTU0FCTEVfRU5USVRZIixlW2UuVU5TVVBQT1JURURfTUVESUFfVFlQRT00MTVdPSJVTlNVUFBPUlRFRF9NRURJQV9UWVBFIixlW2UuVVNFX1BST1hZPTMwNV09IlVTRV9QUk9YWSIsZVtlLk1JU0RJUkVDVEVEX1JFUVVFU1Q9NDIxXT0iTUlTRElSRUNURURfUkVRVUVTVCJ9KShpcnx8KGlyPXt9KSk7dmFyIE9vPShlPT4oZS5DT0RFPSJjb2RlIixlLklEX1RPS0VOPSJpZF90b2tlbiIsZS5UT0tFTj0idG9rZW4iLGUpKShPb3x8e30pLE5vPShlPT4oZS5RVUVSWT0icXVlcnkiLGUuRlJBR01FTlQ9ImZyYWdtZW50IixlLkZPUk1fUE9TVD0iZm9ybV9wb3N0IixlKSkoTm98fHt9KSxScz0oZT0+KGUuQ0xJRU5UX0NSRURFTlRJQUxTPSJjbGllbnRfY3JlZGVudGlhbHMiLGUuQVVUSE9SSVpBVElPTl9DT0RFPSJhdXRob3JpemF0aW9uX2NvZGUiLGUuUkVGUkVTSF9UT0tFTj0icmVmcmVzaF90b2tlbiIsZSkpKFJzfHx7fSksenQ9KGU9PihlLlJFU1RPUkVfU0VTU0lPTj0iUmVzdG9yZVNlc3Npb24iLGUuQVVUSE9SSVpFPSJBdXRob3JpemUiLGUuSEFORExFX1JFRElSRUNUPSJIYW5kbGVSZWRpcmVjdCIsZS5MT0dPVVQ9IkxvZ291dCIsZS5BVVRIRU5USUNBVEVfRVZFTlQ9IkF1dGhlbnRpY2F0ZUV2ZW50IixlLkVSUk9SPSJFcnJvciIsZSkpKHp0fHx7fSk7TnMoYHByb2M6JHtwcm9jZXNzLnBpZH06c3Rzb2F1dGgyd29ya2VyLnRzYCk7Y2xhc3MgWWZ7Y29uc3RydWN0b3IodCl7U2UodGhpcyxGZSx2b2lkIDApO1NlKHRoaXMsT3Qsdm9pZCAwKTtTZSh0aGlzLEFyLHZvaWQgMCk7U2UodGhpcyx5bix2b2lkIDApO1NlKHRoaXMsSGUsdm9pZCAwKTtTZSh0aGlzLHZ0LHZvaWQgMCk7U2UodGhpcyxOdCx2b2lkIDApO1NlKHRoaXMsS2Usdm9pZCAwKTtTZSh0aGlzLEt0LHZvaWQgMCk7U2UodGhpcywkbix2b2lkIDApO1NlKHRoaXMsdHQsdm9pZCAwKTtTZSh0aGlzLENyLHZvaWQgMCk7U2UodGhpcyxJcix2b2lkIDApO1NlKHRoaXMsRHIsdm9pZCAwKTtTZSh0aGlzLGNyLHZvaWQgMCk7U2UodGhpcyxqcix2b2lkIDApO1NlKHRoaXMsa3Isdm9pZCAwKTtTZSh0aGlzLFVyLHZvaWQgMCk7Y2UodGhpcyxGZSxudWxsKSxjZSh0aGlzLE90LG5ldyBDZiksY2UodGhpcyxBcixuZXcgSWYpLGNlKHRoaXMseW4sImF1dGhvcml6ZV9vcHRpb25zLnN0c21kYS5jb20uYXUiKSxjZSh0aGlzLEhlLCJzZXNzaW9uLnN0c21kYS5jb20uYXUiKSxjZSh0aGlzLHZ0LG51bGwpLGNlKHRoaXMsTnQsbnVsbCksY2UodGhpcyxLZSxudWxsKSxjZSh0aGlzLEt0LG51bGwpLGNlKHRoaXMsJG4sMCksdGhpcy5TZXR1cExpc3RlbmVyPSgpPT57Vih0aGlzLEt0KS5vbm1lc3NhZ2U9YXN5bmMgcj0+e2NvbnN0IG49ci5kYXRhO3N3aXRjaChuLmNvbW1hbmQpe2Nhc2UgenQuUkVTVE9SRV9TRVNTSU9OOlYodGhpcyx0dCkuY2FsbCh0aGlzLG4sYXdhaXQgVih0aGlzLENyKS5jYWxsKHRoaXMpKTticmVhaztjYXNlIHp0LkFVVEhPUklaRTpWKHRoaXMsdHQpLmNhbGwodGhpcyxuLGF3YWl0IFYodGhpcyxJcikuY2FsbCh0aGlzKSk7YnJlYWs7Y2FzZSB6dC5IQU5ETEVfUkVESVJFQ1Q6Vih0aGlzLHR0KS5jYWxsKHRoaXMsbixhd2FpdCBWKHRoaXMsRHIpLmNhbGwodGhpcyxuLnBheWxvYWQpKTticmVhaztjYXNlIHp0LkxPR09VVDpWKHRoaXMsdHQpLmNhbGwodGhpcyxuLGF3YWl0IFYodGhpcyxVcikuY2FsbCh0aGlzKSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYENvbW1hbmQ6IFske24uY29tbWFuZH0nXSBub3QgZm91bmQuYCl9fX0sY2UodGhpcyx0dCxhc3luYyhyLG4pPT57Y29uc3Qgcz17bWVzc2FnZUlkOnIubWVzc2FnZUlkLGNvbW1hbmQ6ci5jb21tYW5kLHBheWxvYWQ6bn07Vih0aGlzLEt0KS5wb3N0TWVzc2FnZShzKX0pLGNlKHRoaXMsQ3IsYXN5bmMoKT0+e2xldCByPW51bGw7aWYocj1WKHRoaXMsRmUpLmdldChWKHRoaXMsSGUpKSxyIT09bnVsbCljb25zb2xlLmxvZygiU2Vzc2lvbiByZXN0b3JlZCBmcm9tIGNsaWVudCBzdG9yYWdlLiIpLFYodGhpcyx2dCkmJlYodGhpcyx2dCkuVXBkYXRlSW5zdHJ1bWVudCgibSIse0xvZ01lc3NhZ2U6IlNlc3Npb24gcmVzdG9yZWQgZnJvbSBjbGllbnQgc3RvcmFnZS4ifSk7ZWxzZXtjb25zdCBuPWAke3t9LkJST0tFUl9FTkRQT0lOVH06JHt7fS5CUk9LRVJfUE9SVH0ke3t9LkJST0tFUl9BUElfUk9PVH0vc2Vzc2lvbmA7Y29uc29sZS5sb2coIlJlc3RvcmVTZXNzaW9uIiksY29uc29sZS5sb2cobiksVih0aGlzLHZ0KSYmKFYodGhpcyx2dCkuVXBkYXRlSW5zdHJ1bWVudCgibSIse0xvZ01lc3NhZ2U6IlJlc3RvcmVTZXNzaW9uIn0pLFYodGhpcyx2dCkuVXBkYXRlSW5zdHJ1bWVudCgibSIse0xvZ01lc3NhZ2U6bn0pKTt0cnl7Y29uc3Qgcz1hd2FpdCBWbih7bWV0aG9kOiJwb3N0Iix1cmw6bixkYXRhOntbQ3QuT0F1dGgyUGFyYW1ldGVyVHlwZS5DTElFTlRfSURdOnt9LkNMSUVOVF9JRCxbQ3QuT0F1dGgyUGFyYW1ldGVyVHlwZS5TQ09QRV06e30uU0NPUEUsW0N0Lk9BdXRoMlBhcmFtZXRlclR5cGUuUkVESVJFQ1RfVVJJXTp7fS5SRURJUkVDVF9VUkksW0N0Lk9BdXRoMlBhcmFtZXRlclR5cGUuQVVESUVOQ0VdOnt9LkFVRElFTkNFfSx3aXRoQ3JlZGVudGlhbHM6ITAsdGltZW91dDpwYXJzZUludCh7fS5USU1FT1VUKX0pO3MuZGF0YS5zdGF0dXM9PT1pci5PSz8ocj1zLmRhdGEuZGV0YWlsLFYodGhpcyxGZSkuc2V0KFYodGhpcyxIZSksciksY29uc29sZS5sb2coIlNlc3Npb24gcmVzdG9yZWQgZnJvbSBzZXJ2ZXIgc2lkZSBjb29raWUuIikpOihjb25zb2xlLmxvZygiQ291bGQgbm90IHJlc3RvcmUgcHJldmlvdXMgc2Vzc2lvbjotIiksY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocy5kYXRhKSkpfWNhdGNoKHMpe2NvbnNvbGUubG9nKCJDb3VsZCBub3QgcmVzdG9yZSBwcmV2aW91cyBzZXNzaW9uIChlcnJvciBzdGF0ZSk6LSIpLGNvbnNvbGUubG9nKHMpLGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHMpKX19cmV0dXJuIHIhPT1udWxsPyhWKHRoaXMsS2UpLmNhbGwodGhpcyxyLmlkX3Rva2VuKSxjb25zb2xlLmxvZygiUmVmcmVzaGluZyB0b2tlbnMgLi4uIiksVih0aGlzLGtyKS5jYWxsKHRoaXMpKTooVih0aGlzLEtlKS5jYWxsKHRoaXMsbnVsbCksITEpfSksY2UodGhpcyxJcixhc3luYygpPT57Y29uc29sZS5sb2coIkF1dGhvcml6ZSAuLi4iKTtjb25zdCByPXt9LkNMSUVOVF9JRCxuPVYodGhpcyxPdCkuQ3JlYXRlUmFuZG9tU3RyaW5nKCkscz1bT28uQ09ERV0sYT17fS5SRURJUkVDVF9VUkksbz1Oby5RVUVSWSxsPXt9LlNDT1BFLGY9Vih0aGlzLE90KS5DcmVhdGVSYW5kb21TdHJpbmcoKSxwPVYodGhpcyxPdCkuQ3JlYXRlUmFuZG9tU3RyaW5nKCksaT1hd2FpdCBWKHRoaXMsT3QpLkRpZ2VzdE1lc3NhZ2UocCksRT17Y2xpZW50X2lkOnIsbm9uY2U6bixyZXNwb25zZV90eXBlOnMscmVkaXJlY3RfdXJpOmEscmVzcG9uc2VfbW9kZTpvLHNjb3BlOmwsc3RhdGU6Zixjb2RlX2NoYWxsZW5nZTppLGNvZGVfY2hhbGxlbmdlX21ldGhvZDoiUzI1NiJ9LFQ9YCR7e30uQVVUSF9FTkRQT0lOVH06JHt7fS5BVVRIX1BPUlR9JHt7fS5BVVRIX0FQSVJPT1R9PyR7Vih0aGlzLEFyKS5DcmVhdGVRdWVyeVBhcmFtcyhFKX1gO3JldHVybiBjb25zb2xlLmxvZyhUKSxFLmNvZGVfdmVyaWZpZXI9cCxjb25zb2xlLmxvZyhgQXV0aG9yaXplOmF1dGhvcml6ZU9wdGlvbnM6IFske0pTT04uc3RyaW5naWZ5KEUpfV1gKSx7dXJsOlQsYXV0aG9yaXplT3B0aW9uczpFfX0pLGNlKHRoaXMsRHIsYXN5bmMgcj0+e2NvbnN0IG49ci5xdWVyeVZhcnMscz1yLmF1dGhvcml6ZU9wdGlvbnM7aWYoY29uc29sZS5sb2coIkhhbmRsZVJlZGlyZWN0IiksY29uc29sZS5sb2coYEhhbmRsZVJlZGlyZWN0OlF1ZXJ5IFZhcnM6IFske0pTT04uc3RyaW5naWZ5KG4pfV1gKSxuW0N0Lk9BdXRoMlBhcmFtZXRlclR5cGUuQ09ERV0pe2NvbnN0IGE9bjtjb25zb2xlLmxvZyhgYXV0aG9yaXplT3B0aW9ucyBmcm9tIHRyYW5zYWN0aW9uIHN0YXRlOiBbJHtKU09OLnN0cmluZ2lmeShzKX1dYCk7Y29uc3Qgbz1hLnN0YXRlO3JldHVybiBzLnN0YXRlLmxvY2FsZUNvbXBhcmUobyk9PT0wPyhjb25zb2xlLmxvZygicmVkaXJlY3RlZCBzdGF0ZSAoZnJvbSBxdWVyeVZhcnMpIG1hdGNoZWQgcHJldmlvdXNseSBzYXZlZCB0cmFuc2FjdGlvbiBhdXRob3JpemVPcHRpb25zIHN0YXRlIiksYXdhaXQgVih0aGlzLGpyKS5jYWxsKHRoaXMscyxhKSk6KGNvbnNvbGUubG9nKCJyZWRpcmVjdGVkIHN0YXRlIChmcm9tIHF1ZXJ5VmFycykgZGlkIE5PVCBtYXRjaCBwcmV2aW91c2x5IHNhdmVkIHRyYW5zYWN0aW9uIGF1dGhvcml6ZU9wdGlvbnMgc3RhdGUiKSxWKHRoaXMsTnQpLmNhbGwodGhpcyx7bWVzc2FnZToiU3RhdGUgdW4tbWF0Y2hlZCJ9KSwhMSl9ZWxzZSBpZihuW0N0Lk9BdXRoMlBhcmFtZXRlclR5cGUuRVJST1JdKXtjb25zdCBhPW47cmV0dXJuIGEuZXJyb3IsYS5lcnJvcl9kZXNjcmlwdGlvbixWKHRoaXMsTnQpLmNhbGwodGhpcyx7bWVzc2FnZToiU3RhdGUgdW4tbWF0Y2hlZCJ9KSwhMX1lbHNlIHJldHVybiBWKHRoaXMsTnQpLmNhbGwodGhpcyx7bWVzc2FnZToiU3RhdGUgdW4tbWF0Y2hlZCJ9KSwhMX0pLGNlKHRoaXMsY3IsYXN5bmMgcj0+e2NvbnNvbGUubG9nKCIjR2V0VG9rZW5Gcm9tQnJva2VyIiksVih0aGlzLEZlKS5yZW1vdmUoVih0aGlzLEhlKSk7Y29uc3Qgbj1gJHt7fS5CUk9LRVJfRU5EUE9JTlR9OiR7e30uQlJPS0VSX1BPUlR9JHt7fS5CUk9LRVJfQVBJX1JPT1R9L3Rva2VuYDtjb25zb2xlLmxvZyhgI0dldFRva2VuRnJvbUJyb2tlcjp1cmwgPSBbJHtufV1gKSxjb25zb2xlLmxvZyhyKTt0cnl7Y29uc3Qgcz1hd2FpdCBWbih7bWV0aG9kOiJwb3N0Iix1cmw6bixkYXRhOnIsd2l0aENyZWRlbnRpYWxzOiEwLHRpbWVvdXQ6cGFyc2VJbnQoe30uVElNRU9VVCl9KTtpZihjb25zb2xlLmxvZyhgcmV0VmFsOiAke0pTT04uc3RyaW5naWZ5KHMpfWApLHMuc3RhdHVzPT09aXIuT0spe2NvbnNvbGUubG9nKCJTdG9yaW5nIHRva2Vucy4uLiIpO2NvbnN0IGE9cy5kYXRhO3JldHVybiBWKHRoaXMsS2UpLmNhbGwodGhpcyxhLmlkX3Rva2VuKSxWKHRoaXMsRmUpLnNldChWKHRoaXMsSGUpLGEpLCEwfWVsc2UgaWYocy5zdGF0dXM9PT1pci5VTkFVVEhPUklaRUQpe2NvbnNvbGUubG9nKCJOT1QgU3RvcmluZyB0b2tlbnMuLi4iKSxjb25zb2xlLmxvZyhzLnN0YXR1cyksVih0aGlzLEtlKS5jYWxsKHRoaXMsbnVsbCk7Y29uc3QgYT1zLmRhdGE7cmV0dXJuITF9ZWxzZSByZXR1cm4gY29uc29sZS5sb2coIk5PVCBTdG9yaW5nIHRva2Vucy4uLiIpLGNvbnNvbGUubG9nKHMuc3RhdHVzKSxWKHRoaXMsS2UpLmNhbGwodGhpcyxudWxsKSxjb25zb2xlLmxvZygiQ291bGQgbm90IG9idGFpbiBhY2Nlc3NfdG9rZW4gZnJvbSB0b2tlbiBlbmQtcG9pbnQ6LSIpLGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHMuZGF0YSkpLCExfWNhdGNoKHMpe3JldHVybiBWKHRoaXMsS2UpLmNhbGwodGhpcyxudWxsKSxjb25zb2xlLmxvZyhzKSxjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShzKSksITF9fSksY2UodGhpcyxqcixhc3luYyhyLG4pPT57Y29uc29sZS5sb2coIiNHZXRUb2tlbiIpLGNvbnNvbGUubG9nKG4pLFYodGhpcyxGZSkuc2V0KFYodGhpcyxIZSksbnVsbCk7Y29uc3Qgcz17Y2xpZW50X2lkOnt9LkNMSUVOVF9JRCxzY29wZTp7fS5TQ09QRSxjb2RlOm4uY29kZSxyZWRpcmVjdF91cmk6e30uUkVESVJFQ1RfVVJJLGdyYW50X3R5cGU6UnMuQVVUSE9SSVpBVElPTl9DT0RFLGNvZGVfdmVyaWZpZXI6ci5jb2RlX3ZlcmlmaWVyfTtyZXR1cm4gVih0aGlzLGNyKS5jYWxsKHRoaXMscyl9KSxjZSh0aGlzLGtyLGFzeW5jKCk9Pntjb25zb2xlLmxvZygiUmVmcmVzaFRva2VuIik7Y29uc3Qgcj1WKHRoaXMsRmUpLmdldChWKHRoaXMsSGUpKTtpZihyKXtjb25zdCBuPXtjbGllbnRfaWQ6e30uQ0xJRU5UX0lELHNjb3BlOnt9LlNDT1BFLHJlZnJlc2hfdG9rZW46ci5yZWZyZXNoX3Rva2VuLGdyYW50X3R5cGU6UnMuUkVGUkVTSF9UT0tFTn07cmV0dXJuIFYodGhpcyxjcikuY2FsbCh0aGlzLG4pfWVsc2UgcmV0dXJuITF9KSxjZSh0aGlzLFVyLGFzeW5jKCk9Pntjb25zb2xlLmxvZygiTG9nb3V0Iik7Y29uc3Qgcj1gJHt7fS5CUk9LRVJfRU5EUE9JTlR9OiR7e30uQlJPS0VSX1BPUlR9JHt7fS5CUk9LRVJfQVBJX1JPT1R9L2xvZ291dGA7Y29uc29sZS5sb2cocik7Y29uc3Qgcz1WKHRoaXMsRmUpLmdldChWKHRoaXMsSGUpKS5yZWZyZXNoX3Rva2VuO2NvbnNvbGUubG9nKHMpO2NvbnN0IGE9amYocyk7Y29uc29sZS5sb2coYSk7Y29uc3Qgbz1hLnN0c19zZXNzaW9uO2NvbnNvbGUubG9nKG8pLFYodGhpcyxGZSkucmVtb3ZlKFYodGhpcyxIZSkpLFYodGhpcyxLZSkuY2FsbCh0aGlzLG51bGwpO3RyeXtjb25zdCBsPWF3YWl0IFZuKHttZXRob2Q6InBvc3QiLHVybDpyLGRhdGE6e3Nlc3Npb25JZDpvfSx3aXRoQ3JlZGVudGlhbHM6ITAsdGltZW91dDpwYXJzZUludCh7fS5USU1FT1VUKX0pO3JldHVybiBsLmRhdGEuc3RhdHVzPT09aXIuT0s/ITA6KGNvbnNvbGUubG9nKCJFcnJvciBkdXJpbmcgbG9nb3V0IChzZXJ2ZXIgc2lkZSkiKSxjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShsLmRhdGEpKSwhMSl9Y2F0Y2gobCl7cmV0dXJuIGNvbnNvbGUubG9nKCJFcnJvciBkdXJpbmcgbG9nb3V0IChzZXJ2ZXIgc2lkZSkiKSxjb25zb2xlLmxvZyhsKSxjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShsKSksITF9fSksY2UodGhpcyxGZSxuZXcgUWYoe2NsaWVudFN0b3JhZ2VUeXBlOmJvLk1FTU9SWV9TVE9SQUdFfSkuR2V0U3RvcmFnZSgpKSxjZSh0aGlzLEtlLHI9Pntjb25zdCBuPXttZXNzYWdlSWQ6LTEsY29tbWFuZDp6dC5BVVRIRU5USUNBVEVfRVZFTlR9O1YodGhpcyx0dCkuY2FsbCh0aGlzLG4scil9KSxjZSh0aGlzLE50LHI9Pntjb25zdCBuPXttZXNzYWdlSWQ6LTEsY29tbWFuZDp6dC5FUlJPUn07Vih0aGlzLHR0KS5jYWxsKHRoaXMsbixyKX0pLGNlKHRoaXMsS3QsdCksdGhpcy5TZXR1cExpc3RlbmVyKCl9fUZlPW5ldyBXZWFrTWFwLE90PW5ldyBXZWFrTWFwLEFyPW5ldyBXZWFrTWFwLHluPW5ldyBXZWFrTWFwLEhlPW5ldyBXZWFrTWFwLHZ0PW5ldyBXZWFrTWFwLE50PW5ldyBXZWFrTWFwLEtlPW5ldyBXZWFrTWFwLEt0PW5ldyBXZWFrTWFwLCRuPW5ldyBXZWFrTWFwLHR0PW5ldyBXZWFrTWFwLENyPW5ldyBXZWFrTWFwLElyPW5ldyBXZWFrTWFwLERyPW5ldyBXZWFrTWFwLGNyPW5ldyBXZWFrTWFwLGpyPW5ldyBXZWFrTWFwLGtyPW5ldyBXZWFrTWFwLFVyPW5ldyBXZWFrTWFwLG9ubWVzc2FnZT1hc3luYyBmdW5jdGlvbihlKXtjb25zdCB0PWUuZGF0YTtuZXcgWWYodCl9fSkoKTsK";
|
|
7205
|
+
const blob = typeof window !== "undefined" && window.Blob && new Blob([atob(encodedJs)], { type: "text/javascript;charset=utf-8" });
|
|
7206
|
+
function WorkerWrapper() {
|
|
7207
|
+
const objURL = blob && (window.URL || window.webkitURL).createObjectURL(blob);
|
|
7208
|
+
try {
|
|
7209
|
+
return objURL ? new Worker(objURL, {}) : new Worker("data:application/javascript;base64," + encodedJs, { type: "module" });
|
|
7210
|
+
} finally {
|
|
7211
|
+
objURL && (window.URL || window.webkitURL).revokeObjectURL(objURL);
|
|
7212
|
+
}
|
|
7213
|
+
}
|
|
7204
7214
|
const debug = Debug(`proc:${process.pid}:stsoauth2manager.ts`);
|
|
7205
7215
|
class STSOAuth2Manager {
|
|
7206
7216
|
constructor(app, options) {
|
|
@@ -7447,7 +7457,7 @@ class STSOAuth2Manager {
|
|
|
7447
7457
|
__privateSet(this, _aic, app.config.globalProperties.$sts.aic.PrimaryPublishInstrumentController);
|
|
7448
7458
|
__privateSet(this, _router, app.config.globalProperties.$router);
|
|
7449
7459
|
__privateSet(this, _transactionStore, new ClientStorageFactory({ clientStorageType: ClientStorageType.SESSION_STORAGE }).GetStorage());
|
|
7450
|
-
__privateSet(this, _worker, new
|
|
7460
|
+
__privateSet(this, _worker, new WorkerWrapper());
|
|
7451
7461
|
__privateGet(this, _worker).onmessage = (data) => {
|
|
7452
7462
|
console.log(`this.#worker.onmessage = [${data}]`);
|
|
7453
7463
|
};
|