diff --git a/assets/dist/report.html b/assets/dist/report.html index bab3afe..5fdd58c 100644 --- a/assets/dist/report.html +++ b/assets/dist/report.html @@ -3,7 +3,7 @@ - Webpack Bundle Analyzer [19 Mar 2025 at 12:56] + Webpack Bundle Analyzer [19 Mar 2025 at 14:55] diff --git a/assets/dist/theme-bundle.main.js b/assets/dist/theme-bundle.main.js index 65027c2..82f5b06 100644 --- a/assets/dist/theme-bundle.main.js +++ b/assets/dist/theme-bundle.main.js @@ -20301,4 +20301,4 @@ window.stencilBootstrap = function stencilBootstrap(pageType, contextJSON, loadG /******/ })() ; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVULDZFQUE2RSxxREFBVyxxQ0FBcUMsb0RBQVU7QUFDdkk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVULDRFQUE0RSxxREFBVyxxQ0FBcUMsb0RBQVU7QUFDdEk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTix5Q0FBeUM7QUFDekM7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUCxrREFBa0Q7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRTJCO0FBQzNCOzs7Ozs7Ozs7Ozs7QUN4dkJhLFlBQVksWUFBWSxjQUFjLGNBQWMsc0NBQXNDLFdBQVcsU0FBUyxjQUFjLG1CQUFtQiw2RUFBNkUsMkZBQTJGLGNBQWMsbUJBQW1CLDZFQUE2RSxNQUFNLG1CQUFtQjtBQUMzYyx5RkFBeUYsYUFBYSxrQkFBa0IsYUFBYSxLQUFLLG9GQUFvRixxRkFBcUYsT0FBTyxnQ0FBZ0MsV0FBVyx3Q0FBd0MsdUNBQXVDLG9DQUFvQyxTQUFTO0FBQ2plLE1BQU0sSUFBSSw0RUFBNEUsU0FBUyxZQUFZLElBQUk7QUFDL0c7Ozs7Ozs7Ozs7OztBQ0hBLENBQUM7QUFDRDs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7O0FBSUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0EsMEJBQTBCLHNCQUFzQjtBQUNoRDs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBLGdCQUFnQjtBQUNoQixPQUFPOztBQUVQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCO0FBQ2xCOztBQUVBLGdCQUFnQjtBQUNoQixPQUFPOztBQUVQO0FBQ0E7O0FBRUE7O0FBRUE7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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsbURBQW1EO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWOztBQUVBO0FBQ0E7QUFDQSxtREFBbUQsY0FBYztBQUNqRTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FB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QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7O0FBRWI7QUFDQSx3REFBd0QsU0FBUztBQUNqRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvREFBb0QsU0FBUztBQUM3RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBLCtDQUErQyxTQUFTO0FBQ3hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQixTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9EQUFvRDtBQUNwRCxvREFBb0Q7QUFDcEQsb0RBQW9EO0FBQ3BEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZEQUE2RCxnQkFBZ0I7O0FBRTdFO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLG9DQUFhO0FBQ3pCLG1CQUFtQixvQ0FBYTtBQUNoQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7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QUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGdFQUFnRTtBQUNyRixNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0Isb0JBQW9CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSLDRFQUE0RTtBQUM1RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7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V0FBUSxDQUFDaGpDLElBQUksQ0FBQ3ZSLE9BQU8sQ0FBQztVQUNsQyxDQUFDLENBQUM7UUFDTixDQUFDLENBQUM7TUFDTixDQUFDLENBQUM7SUFDTjtFQUNKLENBQUM7QUFDTCxDQUFDLEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vYXJpYS9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL2FyaWEvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL2FyaWEvcmFkaW9PcHRpb25zLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2NvbW1vbi9jYXJvdXNlbC9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL2Nhcm91c2VsL2luZGV4LmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2NvbW1vbi9jYXJvdXNlbC91dGlscy9hY3RpdmF0ZVBsYXlQYXVzZUJ1dHRvbi5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vY2Fyb3VzZWwvdXRpbHMvYW5hbGl6ZVNsaWRlcy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vY2Fyb3VzZWwvdXRpbHMvYXJyb3dBcmlhTGFibGluZy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vY2Fyb3VzZWwvdXRpbHMvZG90c1NldHVwLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2NvbW1vbi9jYXJvdXNlbC91dGlscy9nZXRBY3RpdmVTbGlkZUlkeEFuZFNsaWRlc1F1YW50aXR5LmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2NvbW1vbi9jYXJvdXNlbC91dGlscy9nZXRBY3RpdmVTbGlkZUluZm8uanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL2Nhcm91c2VsL3V0aWxzL2hhbmRsZUltYWdlQXNwZWN0UmF0aW8uanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL2Nhcm91c2VsL3V0aWxzL2hhbmRsZUltYWdlTG9hZC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vY2Fyb3VzZWwvdXRpbHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL2Nhcm91c2VsL3V0aWxzL3JlZnJlc2hGb2N1cy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vY2Fyb3VzZWwvdXRpbHMvdG9vbHRpcFNldHVwLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2NvbW1vbi9jYXJvdXNlbC91dGlscy91cGRhdGVUZXh0V2l0aExpdmVEYXRhLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2NvbW1vbi9jb2xsYXBzaWJsZS1ncm91cC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vY29sbGFwc2libGUuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL21lZGlhLXF1ZXJ5LWxpc3QuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL21vZGVscy9mb3Jtcy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vbm9kLWZ1bmN0aW9ucy9taW4tbWF4LXZhbGlkYXRlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2NvbW1vbi9ub2QuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL3Byb2R1Y3QtZGV0YWlscy1iYXNlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2NvbW1vbi9wcm9kdWN0LWRldGFpbHMuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL3NlbGVjdC1vcHRpb24tcGx1Z2luLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2NvbW1vbi91dGlscy9hcGkuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL3V0aWxzL2Jhbm5lci11dGlscy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vdXRpbHMvZm9ybS11dGlscy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vdXRpbHMvaWUtaGVscGVycy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vdXRpbHMvcGFnaW5hdGlvbi11dGlscy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vdXRpbHMvc2FmZS1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL3V0aWxzL3VybC11dGlscy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvZ2xvYmFsL2FkbWluQmFyLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2dsb2JhbC9jYXJ0LXByZXZpZXcuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvZ2xvYmFsL2Nvb2tpZU5vdGlmaWNhdGlvbi5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9nbG9iYWwvY3VycmVuY3ktc2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvZ2xvYmFsL2ZvdW5kYXRpb24uanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvZ2xvYmFsL2pxdWVyeS1taWdyYXRlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2dsb2JhbC9qcXVlcnktbWlncmF0ZS9kYXRhLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2dsb2JhbC9qcXVlcnktbWlncmF0ZS9ldmVudC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9nbG9iYWwvanF1ZXJ5LW1pZ3JhdGUvaW5pdC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9nbG9iYWwvanF1ZXJ5LW1pZ3JhdGUvdHJhdmVyc2luZy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9nbG9iYWwvbG9hZGluZy1wcm9ncmVzcy1iYXIuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvZ2xvYmFsL21lbnUuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvZ2xvYmFsL21vYmlsZS1tZW51LXRvZ2dsZS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9nbG9iYWwvbW9kYWwuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvZ2xvYmFsL3F1aWNrLXNlYXJjaC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9nbG9iYWwvcXVpY2stdmlldy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9nbG9iYWwvcmV2ZWFsLWNsb3NlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2dsb2JhbC9zdGVuY2lsLWRyb3Bkb3duLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2dsb2JhbC9zdmctaW5qZWN0b3IuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvZ2xvYmFsL3N3ZWV0LWFsZXJ0LmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL3BhZ2UtbWFuYWdlci5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9wcm9kdWN0L2ltYWdlLWdhbGxlcnkuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvcHJvZHVjdC9yZXZpZXdzLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL3Jvb3RzL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS93aXNobGlzdC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9AYmlnY29tbWVyY2Uvc3RlbmNpbC11dGlscy9zcmMvYXBpL2Jhc2UuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL2FwaS9jYXJ0LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzL3NyYy9hcGkvY291bnRyaWVzLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzL3NyYy9hcGkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL2FwaS9wcm9kdWN0LWF0dHJpYnV0ZXMuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL2FwaS9wcm9kdWN0LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzL3NyYy9hcGkvc2VhcmNoLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzL3NyYy9hcGkvd2lzaGxpc3QuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL2JvZGwvZW1pdHRlcnMvYmFzZS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9AYmlnY29tbWVyY2Uvc3RlbmNpbC11dGlscy9zcmMvYm9kbC9lbWl0dGVycy9jYXJ0LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzL3NyYy9ib2RsL2hlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL2hvb2tzL2Jhc2UuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL2hvb2tzL2NhcnQuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL2hvb2tzL2Nvb2tpZS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9AYmlnY29tbWVyY2Uvc3RlbmNpbC11dGlscy9zcmMvaG9va3MvY3VycmVuY3ktc2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL2hvb2tzL2ZhY2V0ZWQtc2VhcmNoLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzL3NyYy9ob29rcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9AYmlnY29tbWVyY2Uvc3RlbmNpbC11dGlscy9zcmMvaG9va3MvcHJvZHVjdC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9AYmlnY29tbWVyY2Uvc3RlbmNpbC11dGlscy9zcmMvaG9va3Mvc2VhcmNoLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzL3NyYy9ob29rcy9zb3J0LWJ5LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzL3NyYy9saWIvY2xvc2VzdC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9AYmlnY29tbWVyY2Uvc3RlbmNpbC11dGlscy9zcmMvbGliL3F1ZXJ5LXN0cmluZy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9AYmlnY29tbWVyY2Uvc3RlbmNpbC11dGlscy9zcmMvbGliL3JlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL21haW4uanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL3Rvb2xzL2ltYWdlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzL3NyYy90b29scy9pbWFnZVNyY3NldC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9AYmlnY29tbWVyY2Uvc3RlbmNpbC11dGlscy9zcmMvdG9vbHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL3Rvb2xzL3N0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvYWN0dWFsQXBwbHkuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvZnVuY3Rpb25BcHBseS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9jYWxsLWJpbmQtYXBwbHktaGVscGVycy9mdW5jdGlvbkNhbGwuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvcmVmbGVjdEFwcGx5LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2NhbGwtYm91bmQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvZHVuZGVyLXByb3RvL2dldC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9lYXN5em9vbS9kaXN0L2Vhc3l6b29tLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2VzLWRlZmluZS1wcm9wZXJ0eS9pbmRleC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvZXZhbC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3JhbmdlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9yZWYuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3N5bnRheC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvdHlwZS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvdXJpLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2VzLW9iamVjdC1hdG9tcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9ldmVudGVtaXR0ZXIzL2luZGV4LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLXRyYXAvZGlzdC9mb2N1cy10cmFwLmVzbS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9mb2N1cy13aXRoaW4tcG9seWZpbGwvZGlzdC9mb2N1cy13aXRoaW4tcG9seWZpbGwuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uL2ZvdW5kYXRpb24uZHJvcGRvd24uanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uL2ZvdW5kYXRpb24uanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uL2ZvdW5kYXRpb24ucmV2ZWFsLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi9mb3VuZGF0aW9uLnRhYi5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9mdW5jdGlvbi1iaW5kL2ltcGxlbWVudGF0aW9uLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvZ2V0LWludHJpbnNpYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9nZXQtcHJvdG8vT2JqZWN0LmdldFByb3RvdHlwZU9mLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2dldC1wcm90by9SZWZsZWN0LmdldFByb3RvdHlwZU9mLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2dldC1wcm90by9pbmRleC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9nb3BkL2dPUEQuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvZ29wZC9pbmRleC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9pbmRleC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9zaGFtcy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9oYXNvd24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvaG92ZXJpbnRlbnQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvanF1ZXJ5L2Rpc3QvanF1ZXJ5Lm1pbi5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FwcGx5LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlSZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc2NpaVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc2NpaVdvcmRzLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNzaWduVmFsdWUuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQXNzaWduVmFsdWUuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0VGFnLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUluZGV4T2YuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlS2V5cy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VSZXN0LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVNsaWNlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRvU3RyaW5nLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2FzdFNsaWNlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29weU9iamVjdC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUFzc2lnbmVyLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlQ2FzZUZpcnN0LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlQ29tcG91bmRlci5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZnJlZUdsb2JhbC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE5hdGl2ZS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFByb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFRhZy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc1VuaWNvZGUuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNVbmljb2RlV29yZC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzSXRlcmF0ZWVDYWxsLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNQcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vdmVyQXJnLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlclJlc3QuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19yb290LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0VG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdHJpbmdUb0FycmF5LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fdW5pY29kZVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL191bmljb2RlV29yZHMuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2Fzc2lnbkluLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9jYW1lbENhc2UuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2NhcGl0YWxpemUuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2RlYm91bmNlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9kZWJ1cnIuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2VxLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9leHRlbmQuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lkZW50aXR5LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcmd1bWVudHMuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXkuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXlMaWtlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0J1ZmZlci5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNFbXB0eS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNGdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNMZW5ndGguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzTmFOLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc051bWJlci5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3QuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0TGlrZS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNQbGFpbk9iamVjdC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNUeXBlZEFycmF5LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9rZXlzSW4uanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL25vdy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdGhyb3R0bGUuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvTnVtYmVyLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC90b1N0cmluZy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdXBwZXJGaXJzdC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvd29yZHMuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbWF0aC1pbnRyaW5zaWNzL2Ficy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3MvZmxvb3IuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbWF0aC1pbnRyaW5zaWNzL2lzTmFOLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL21hdGgtaW50cmluc2ljcy9tYXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbWF0aC1pbnRyaW5zaWNzL21pbi5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3MvcG93LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL21hdGgtaW50cmluc2ljcy9yb3VuZC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3Mvc2lnbi5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9uYW5vYmFyL25hbm9iYXIubWluLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL25vZC12YWxpZGF0ZS9ub2QuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvb2JqZWN0LWluc3BlY3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvcXMvbGliL2Zvcm1hdHMuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvcXMvbGliL2luZGV4LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL3FzL2xpYi9wYXJzZS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9xcy9saWIvc3RyaW5naWZ5LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL3FzL2xpYi91dGlscy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9zaWRlLWNoYW5uZWwtbGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9zaWRlLWNoYW5uZWwtbWFwL2luZGV4LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL3NpZGUtY2hhbm5lbC13ZWFrbWFwL2luZGV4LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL3NpZGUtY2hhbm5lbC9pbmRleC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9zbGljay1jYXJvdXNlbC9zbGljay9zbGljay5taW4uanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvc3ZnLWluamVjdG9yL2Rpc3Qvc3ZnLWluamVjdG9yLm1pbi5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9zd2VldGFsZXJ0Mi9kaXN0L3N3ZWV0YWxlcnQyLm1pbi5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy90YWJiYWJsZS9kaXN0L2luZGV4LmVzbS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy91cmwvbm9kZV9tb2R1bGVzL3B1bnljb2RlL3B1bnljb2RlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL3VybC91cmwuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL25hdGl2ZS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcmVnZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc3RyaW5naWZ5LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92NC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdmFsaWRhdGUuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvd2hhdHdnLWZldGNoL2ZldGNoLmpzIiwid2VicGFjazovL1Jvb3RzL2lnbm9yZWR8QzpcXFZlcm9TYXJ0b3JpYVxcc3RlbmNpbF9kZXZfMVxcbm9kZV9tb2R1bGVzXFxvYmplY3QtaW5zcGVjdHwuL3V0aWwuaW5zcGVjdCIsIndlYnBhY2s6Ly9Sb290cy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9Sb290cy93ZWJwYWNrL3J1bnRpbWUvYW1kIG9wdGlvbnMiLCJ3ZWJwYWNrOi8vUm9vdHMvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vUm9vdHMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL1Jvb3RzL3dlYnBhY2svcnVudGltZS9lbnN1cmUgY2h1bmsiLCJ3ZWJwYWNrOi8vUm9vdHMvd2VicGFjay9ydW50aW1lL2dldCBqYXZhc2NyaXB0IGNodW5rIGZpbGVuYW1lIiwid2VicGFjazovL1Jvb3RzL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vUm9vdHMvd2VicGFjay9ydW50aW1lL2hhcm1vbnkgbW9kdWxlIGRlY29yYXRvciIsIndlYnBhY2s6Ly9Sb290cy93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL1Jvb3RzL3dlYnBhY2svcnVudGltZS9sb2FkIHNjcmlwdCIsIndlYnBhY2s6Ly9Sb290cy93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL1Jvb3RzL3dlYnBhY2svcnVudGltZS9ub2RlIG1vZHVsZSBkZWNvcmF0b3IiLCJ3ZWJwYWNrOi8vUm9vdHMvd2VicGFjay9ydW50aW1lL3B1YmxpY1BhdGgiLCJ3ZWJwYWNrOi8vUm9vdHMvd2VicGFjay9ydW50aW1lL2pzb25wIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvYXBwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBhcmlhS2V5Q29kZXMgPSB7XHJcbiAgICBSRVRVUk46IDEzLFxyXG4gICAgU1BBQ0U6IDMyLFxyXG4gICAgTEVGVDogMzcsXHJcbiAgICBVUDogMzgsXHJcbiAgICBSSUdIVDogMzksXHJcbiAgICBET1dOOiA0MCxcclxufTtcclxuIiwiZXhwb3J0IHsgZGVmYXVsdCBhcyBpbml0UmFkaW9PcHRpb25zIH0gZnJvbSAnLi9yYWRpb09wdGlvbnMnO1xyXG4iLCJpbXBvcnQgeyBhcmlhS2V5Q29kZXMgfSBmcm9tICcuL2NvbnN0YW50cyc7XHJcblxyXG5jb25zdCBzZXRDaGVja2VkUmFkaW9JdGVtID0gKGl0ZW1Db2xsZWN0aW9uLCBpdGVtSWR4KSA9PiB7XHJcbiAgICBpdGVtQ29sbGVjdGlvbi5lYWNoKChpZHgsIGl0ZW0pID0+IHtcclxuICAgICAgICBjb25zdCAkaXRlbSA9ICQoaXRlbSk7XHJcbiAgICAgICAgaWYgKGlkeCAhPT0gaXRlbUlkeCkge1xyXG4gICAgICAgICAgICAkaXRlbS5hdHRyKCdhcmlhLWNoZWNrZWQnLCBmYWxzZSkucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJGl0ZW0uYXR0cignYXJpYS1jaGVja2VkJywgdHJ1ZSkucHJvcCgnY2hlY2tlZCcsIHRydWUpLmZvY3VzKCk7XHJcbiAgICAgICAgJGl0ZW0udHJpZ2dlcignY2hhbmdlJyk7XHJcbiAgICB9KTtcclxufTtcclxuXHJcbmNvbnN0IGNhbGN1bGF0ZVRhcmdldEl0ZW1Qb3NpdGlvbiA9IChsYXN0SXRlbUlkeCwgY3VycmVudElkeCkgPT4ge1xyXG4gICAgc3dpdGNoICh0cnVlKSB7XHJcbiAgICBjYXNlIGN1cnJlbnRJZHggPiBsYXN0SXRlbUlkeDogcmV0dXJuIDA7XHJcbiAgICBjYXNlIGN1cnJlbnRJZHggPCAwOiByZXR1cm4gbGFzdEl0ZW1JZHg7XHJcbiAgICBkZWZhdWx0OiByZXR1cm4gY3VycmVudElkeDtcclxuICAgIH1cclxufTtcclxuXHJcbmNvbnN0IGhhbmRsZUl0ZW1LZXlEb3duID0gaXRlbUNvbGxlY3Rpb24gPT4gZSA9PiB7XHJcbiAgICBjb25zdCB7IGtleUNvZGUgfSA9IGU7XHJcbiAgICBjb25zdCBpdGVtSWR4ID0gaXRlbUNvbGxlY3Rpb24uaW5kZXgoZS5jdXJyZW50VGFyZ2V0KTtcclxuICAgIGNvbnN0IGxhc3RDb2xsZWN0aW9uSXRlbUlkeCA9IGl0ZW1Db2xsZWN0aW9uLmxlbmd0aCAtIDE7XHJcblxyXG4gICAgaWYgKE9iamVjdC52YWx1ZXMoYXJpYUtleUNvZGVzKS5pbmNsdWRlcyhrZXlDb2RlKSkge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAoa2V5Q29kZSkge1xyXG4gICAgY2FzZSBhcmlhS2V5Q29kZXMuTEVGVDpcclxuICAgIGNhc2UgYXJpYUtleUNvZGVzLlVQOiB7XHJcbiAgICAgICAgY29uc3QgcHJldkl0ZW1JZHggPSBjYWxjdWxhdGVUYXJnZXRJdGVtUG9zaXRpb24obGFzdENvbGxlY3Rpb25JdGVtSWR4LCBpdGVtSWR4IC0gMSk7XHJcbiAgICAgICAgaXRlbUNvbGxlY3Rpb24uZ2V0KHByZXZJdGVtSWR4KS5mb2N1cygpO1xyXG4gICAgICAgIHNldENoZWNrZWRSYWRpb0l0ZW0oaXRlbUNvbGxlY3Rpb24sIGl0ZW1JZHggLSAxKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGNhc2UgYXJpYUtleUNvZGVzLlJJR0hUOlxyXG4gICAgY2FzZSBhcmlhS2V5Q29kZXMuRE9XTjoge1xyXG4gICAgICAgIGNvbnN0IG5leHRJdGVtSWR4ID0gY2FsY3VsYXRlVGFyZ2V0SXRlbVBvc2l0aW9uKGxhc3RDb2xsZWN0aW9uSXRlbUlkeCwgaXRlbUlkeCArIDEpO1xyXG4gICAgICAgIGl0ZW1Db2xsZWN0aW9uLmdldChuZXh0SXRlbUlkeCkuZm9jdXMoKTtcclxuICAgICAgICBzZXRDaGVja2VkUmFkaW9JdGVtKGl0ZW1Db2xsZWN0aW9uLCBpdGVtSWR4ICsgMSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgZGVmYXVsdDogYnJlYWs7XHJcbiAgICB9XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCAoJGNvbnRhaW5lciwgaXRlbVNlbGVjdG9yKSA9PiB7XHJcbiAgICBjb25zdCAkaXRlbUNvbGxlY3Rpb24gPSAkY29udGFpbmVyLmZpbmQoaXRlbVNlbGVjdG9yKTtcclxuXHJcbiAgICAkY29udGFpbmVyLm9uKCdrZXlkb3duJywgaXRlbVNlbGVjdG9yLCBoYW5kbGVJdGVtS2V5RG93bigkaXRlbUNvbGxlY3Rpb24pKTtcclxufTtcclxuIiwiZXhwb3J0IGNvbnN0IEZPQ1VTQUJMRV9FTEVNRU5UU19TRUxFQ1RPUiA9ICdbaHJlZl0sIGJ1dHRvbiwgaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QsIGRldGFpbHMsIFtjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdLCBbdGFiaW5kZXhdJztcclxuIiwiaW1wb3J0ICdzbGljay1jYXJvdXNlbCc7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgYWN0aXZhdGVQbGF5UGF1c2VCdXR0b24sXHJcbiAgICBhbmFsaXplU2xpZGVzLFxyXG4gICAgYXJyb3dBcmlhTGFibGluZyxcclxuICAgIGRvdHNTZXR1cCxcclxuICAgIGdldEFjdGl2ZVNsaWRlSWR4QW5kU2xpZGVzUXVhbnRpdHksXHJcbiAgICBoYW5kbGVJbWFnZUFzcGVjdFJhdGlvLFxyXG4gICAgaGFuZGxlSW1hZ2VMb2FkLFxyXG4gICAgcmVmcmVzaEZvY3VzLFxyXG4gICAgdXBkYXRlVGV4dFdpdGhMaXZlRGF0YSxcclxufSBmcm9tICcuL3V0aWxzJztcclxuXHJcbmV4cG9ydCBjb25zdCBzZXRDYXJvdXNlbFN0YXRlID0gKHsgZGVsZWdhdGVUYXJnZXQgfSwgY2Fyb3VzZWxPYmopID0+IHtcclxuICAgIGNvbnN0IGNhcm91c2VsT2JqQ3VycmVudCA9IGNhcm91c2VsT2JqIHx8IGRlbGVnYXRlVGFyZ2V0LnNsaWNrO1xyXG4gICAgY29uc3QgeyAkc2xpZGVyIH0gPSBjYXJvdXNlbE9iakN1cnJlbnQ7XHJcblxyXG4gICAgJHNsaWRlci5kYXRhKCdzdGF0ZScsIGdldEFjdGl2ZVNsaWRlSWR4QW5kU2xpZGVzUXVhbnRpdHkoY2Fyb3VzZWxPYmpDdXJyZW50KSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgb25Vc2VyQ2Fyb3VzZWxDaGFuZ2UgPSAoeyBkYXRhIH0sIGNvbnRleHQsICRzbGlkZXIpID0+IHtcclxuICAgIGNvbnN0ICRhY3RpdmVTbGlkZXIgPSAkc2xpZGVyIHx8IGRhdGE7XHJcbiAgICBjb25zdCAkcGFyZW50Q29udGFpbmVyID0gJGFjdGl2ZVNsaWRlci5oYXNDbGFzcygncHJvZHVjdFZpZXctdGh1bWJuYWlscycpID8gJGFjdGl2ZVNsaWRlci5wYXJlbnQoJy5wcm9kdWN0Vmlldy1pbWFnZXMnKSA6ICRhY3RpdmVTbGlkZXI7XHJcbiAgICBjb25zdCB7IGFjdGl2ZVNsaWRlSWR4LCBzbGlkZXNRdWFudGl0eSB9ID0gJGFjdGl2ZVNsaWRlci5kYXRhKCdzdGF0ZScpO1xyXG4gICAgY29uc3QgJGNhcm91c2VsQ29udGVudEVsZW1lbnQgPSAkKCdbZGF0YS1jYXJvdXNlbC1jb250ZW50LWNoYW5nZS1tZXNzYWdlXScsICRwYXJlbnRDb250YWluZXIpO1xyXG4gICAgY29uc3QgY2Fyb3VzZWxDb250ZW50QW5ub3VuY2VNZXNzYWdlID0gdXBkYXRlVGV4dFdpdGhMaXZlRGF0YShjb250ZXh0LmNhcm91c2VsQ29udGVudEFubm91bmNlTWVzc2FnZSwgKGFjdGl2ZVNsaWRlSWR4ICsgMSksIHNsaWRlc1F1YW50aXR5KTtcclxuXHJcbiAgICAkY2Fyb3VzZWxDb250ZW50RWxlbWVudC50ZXh0KGNhcm91c2VsQ29udGVudEFubm91bmNlTWVzc2FnZSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgb25TbGlja0Nhcm91c2VsQ2hhbmdlID0gKGUsIGNhcm91c2VsT2JqLCBjb250ZXh0KSA9PiB7XHJcbiAgICBjb25zdCB7XHJcbiAgICAgICAgJGRvdHMsXHJcbiAgICAgICAgJHNsaWRlcixcclxuICAgICAgICAkcHJldkFycm93LFxyXG4gICAgICAgICRuZXh0QXJyb3csXHJcbiAgICAgICAgb3B0aW9uczogeyBpbmZpbml0ZSB9LFxyXG4gICAgfSA9IGNhcm91c2VsT2JqO1xyXG5cclxuICAgIGNvbnN0IHsgYWN0aXZlU2xpZGVJZHgsIHNsaWRlc1F1YW50aXR5IH0gPSAkc2xpZGVyLmRhdGEoJ3N0YXRlJykgfHwgZ2V0QWN0aXZlU2xpZGVJZHhBbmRTbGlkZXNRdWFudGl0eShjYXJvdXNlbE9iaik7XHJcblxyXG4gICAgZG90c1NldHVwKCRkb3RzLCBhY3RpdmVTbGlkZUlkeCwgc2xpZGVzUXVhbnRpdHksIGNvbnRleHQpO1xyXG4gICAgYXJyb3dBcmlhTGFibGluZygkcHJldkFycm93LCAkbmV4dEFycm93LCBhY3RpdmVTbGlkZUlkeCwgc2xpZGVzUXVhbnRpdHksIGluZmluaXRlLCBjb250ZXh0LmNhcm91c2VsQXJyb3dBbmREb3RBcmlhTGFiZWwpO1xyXG4gICAgYW5hbGl6ZVNsaWRlcygkc2xpZGVyLmZpbmQoJy5zbGljay1zbGlkZScpKTtcclxuICAgIHJlZnJlc2hGb2N1cygkcHJldkFycm93LCAkbmV4dEFycm93LCAkZG90cywgJHNsaWRlciwgYWN0aXZlU2xpZGVJZHgsIHNsaWRlc1F1YW50aXR5LCBpbmZpbml0ZSk7XHJcblxyXG4gICAgJHNsaWRlci5kYXRhKCdzdGF0ZScsIG51bGwpO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGNvbnRleHQpIHtcclxuICAgICQoJ1tkYXRhLXNsaWNrXScpLmVhY2goKGlkeCwgY2Fyb3VzZWwpID0+IHtcclxuICAgICAgICAvLyBnZXR0aW5nIGVsZW1lbnQgdXNpbmcgZmluZCB0byBwYXNzIGplc3QgdGVzdFxyXG4gICAgICAgIGNvbnN0ICRjYXJvdXNlbCA9ICQoZG9jdW1lbnQpLmZpbmQoY2Fyb3VzZWwpO1xyXG5cclxuICAgICAgICAkY2Fyb3VzZWwub24oJ2luaXQgYnJlYWtwb2ludCBzd2lwZScsIHNldENhcm91c2VsU3RhdGUpO1xyXG4gICAgICAgICRjYXJvdXNlbC5vbignY2xpY2snLCAnLnNsaWNrLWFycm93LCAuc2xpY2stZG90cycsIHNldENhcm91c2VsU3RhdGUpO1xyXG5cclxuICAgICAgICAkY2Fyb3VzZWwub24oJ2luaXQgYnJlYWtwb2ludCcsIChlLCBjYXJvdXNlbE9iaikgPT4gYWN0aXZhdGVQbGF5UGF1c2VCdXR0b24oZSwgY2Fyb3VzZWxPYmosIGNvbnRleHQpKTtcclxuICAgICAgICAkY2Fyb3VzZWwub24oJ2luaXQgYWZ0ZXJDaGFuZ2UnLCAoZSwgY2Fyb3VzZWxPYmopID0+IG9uU2xpY2tDYXJvdXNlbENoYW5nZShlLCBjYXJvdXNlbE9iaiwgY29udGV4dCkpO1xyXG4gICAgICAgICRjYXJvdXNlbC5vbignY2xpY2snLCAnLnNsaWNrLWFycm93LCAuc2xpY2stZG90cycsICRjYXJvdXNlbCwgZSA9PiBvblVzZXJDYXJvdXNlbENoYW5nZShlLCBjb250ZXh0KSk7XHJcbiAgICAgICAgJGNhcm91c2VsLm9uKCdzd2lwZScsIChlLCBjYXJvdXNlbE9iaikgPT4gb25Vc2VyQ2Fyb3VzZWxDaGFuZ2UoZSwgY29udGV4dCwgY2Fyb3VzZWxPYmouJHNsaWRlcikpO1xyXG5cclxuICAgICAgICBpZiAoJGNhcm91c2VsLmhhc0NsYXNzKCdoZXJvQ2Fyb3VzZWwnKSkge1xyXG4gICAgICAgICAgICAkY2Fyb3VzZWwub24oJ2luaXQgYWZ0ZXJDaGFuZ2UnLCBoYW5kbGVJbWFnZUxvYWQpO1xyXG4gICAgICAgICAgICAkY2Fyb3VzZWwub24oJ3N3aXBlJywgaGFuZGxlSW1hZ2VBc3BlY3RSYXRpbyk7XHJcbiAgICAgICAgICAgICRjYXJvdXNlbC5vbignY2xpY2snLCAnLnNsaWNrLWFycm93LCAuc2xpY2stZG90cycsIGhhbmRsZUltYWdlQXNwZWN0UmF0aW8pO1xyXG5cclxuICAgICAgICAgICAgLy8gQWx0ZXJuYXRpdmUgaW1hZ2Ugc3R5bGluZyBmb3IgSUUsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBvYmplY3RmaXRcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUub2JqZWN0Rml0ID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgJGNhcm91c2VsLmZpbmQoJy5oZXJvQ2Fyb3VzZWwtc2xpZGUnKS5lYWNoKChpbmRleCwgc2xpZGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAkKHNsaWRlKS5hZGRDbGFzcygnY29tcGF0LW9iamVjdC1maXQnKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBpc011bHRpcGxlU2xpZGVzID0gJGNhcm91c2VsLmNoaWxkcmVuKCkubGVuZ3RoID4gMTtcclxuICAgICAgICBjb25zdCBjdXN0b21QYWdpbmcgPSBpc011bHRpcGxlU2xpZGVzXHJcbiAgICAgICAgICAgID8gKCkgPT4gKFxyXG4gICAgICAgICAgICAgICAgJzxidXR0b24gZGF0YS1jYXJvdXNlbC1kb3QgdHlwZT1cImJ1dHRvblwiPjwvYnV0dG9uPidcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICA6ICgpID0+IHt9O1xyXG5cclxuICAgICAgICAkY2Fyb3VzZWwuc2xpY2soe1xyXG4gICAgICAgICAgICBhY2Nlc3NpYmlsaXR5OiBmYWxzZSxcclxuICAgICAgICAgICAgYXJyb3dzOiBpc011bHRpcGxlU2xpZGVzLFxyXG4gICAgICAgICAgICBjdXN0b21QYWdpbmcsXHJcbiAgICAgICAgICAgIGRvdHM6IGlzTXVsdGlwbGVTbGlkZXMsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxufVxyXG4iLCJpbXBvcnQgeyB0aHJvdHRsZSB9IGZyb20gJ2xvZGFzaCc7XHJcblxyXG5jb25zdCBQTEFZX0FDVElPTiA9ICdzbGlja1BsYXknO1xyXG5jb25zdCBQQVVTRV9BQ1RJT04gPSAnc2xpY2tQYXVzZSc7XHJcbmNvbnN0IHVwZGF0ZUJ1dHRvbkxhYmVscyA9IChjb250ZXh0KSA9PiB7XHJcbiAgICBjb25zdCB7XHJcbiAgICAgICAgY2Fyb3VzZWxQbGF5UGF1c2VCdXR0b25QbGF5LFxyXG4gICAgICAgIGNhcm91c2VsUGxheVBhdXNlQnV0dG9uUGF1c2UsXHJcbiAgICAgICAgY2Fyb3VzZWxQbGF5UGF1c2VCdXR0b25BcmlhUGxheSxcclxuICAgICAgICBjYXJvdXNlbFBsYXlQYXVzZUJ1dHRvbkFyaWFQYXVzZSxcclxuICAgIH0gPSBjb250ZXh0O1xyXG5cclxuICAgIHJldHVybiAoJGJ1dHRvbiwgYWN0aW9uKSA9PiB7XHJcbiAgICAgICAgJGJ1dHRvblxyXG4gICAgICAgICAgICAudGV4dChhY3Rpb24gPT09IFBMQVlfQUNUSU9OXHJcbiAgICAgICAgICAgICAgICA/IGNhcm91c2VsUGxheVBhdXNlQnV0dG9uUGF1c2UgOiBjYXJvdXNlbFBsYXlQYXVzZUJ1dHRvblBsYXkpXHJcbiAgICAgICAgICAgIC5hdHRyKCdhcmlhLWxhYmVsJywgYWN0aW9uID09PSBQTEFZX0FDVElPTlxyXG4gICAgICAgICAgICAgICAgPyBjYXJvdXNlbFBsYXlQYXVzZUJ1dHRvbkFyaWFQYXVzZSA6IGNhcm91c2VsUGxheVBhdXNlQnV0dG9uQXJpYVBsYXkpO1xyXG4gICAgfTtcclxufTtcclxubGV0IHVwZGF0ZUJ1dHRvbkxhYmVsc1dpdGhDb250ZXh0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKGUsIGNhcm91c2VsT2JqLCBjb250ZXh0KSA9PiB7XHJcbiAgICBjb25zdCB7ICRzbGlkZXIsICRkb3RzLCBvcHRpb25zOiB7IHNwZWVkIH0gfSA9IGNhcm91c2VsT2JqO1xyXG4gICAgY29uc3QgJHBsYXlQYXVzZUJ1dHRvbiA9ICRzbGlkZXIuZmluZCgnW2RhdGEtcGxheS1wYXVzZS1idXR0b25dJyk7XHJcblxyXG4gICAgaWYgKCRwbGF5UGF1c2VCdXR0b24ubGVuZ3RoID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgLy8gZm9yIGNvcnJlY3QgY2Fyb3VzZWwgY29udHJvbHMgZm9jdXMgb3JkZXJcclxuICAgIGlmICgkZG90cykge1xyXG4gICAgICAgICRwbGF5UGF1c2VCdXR0b24uaW5zZXJ0QmVmb3JlKCRkb3RzKTtcclxuICAgIH0gZWxzZSAkc2xpZGVyLmFwcGVuZCgkcGxheVBhdXNlQnV0dG9uKTtcclxuXHJcbiAgICBjb25zdCB7IHNsaWRlc1F1YW50aXR5IH0gPSAkc2xpZGVyLmRhdGEoJ3N0YXRlJyk7XHJcbiAgICAkcGxheVBhdXNlQnV0dG9uLmNzcygnZGlzcGxheScsIHNsaWRlc1F1YW50aXR5ID4gMSA/ICdibG9jaycgOiAnbm9uZScpO1xyXG5cclxuICAgIGlmIChlLnR5cGUgPT09ICdpbml0JykgdXBkYXRlQnV0dG9uTGFiZWxzV2l0aENvbnRleHQgPSB1cGRhdGVCdXR0b25MYWJlbHMoY29udGV4dCk7XHJcblxyXG4gICAgaWYgKGUudHlwZSA9PT0gJ2JyZWFrcG9pbnQnKSB7XHJcbiAgICAgICAgdXBkYXRlQnV0dG9uTGFiZWxzV2l0aENvbnRleHQoJHBsYXlQYXVzZUJ1dHRvbiwgUExBWV9BQ1RJT04pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvblBsYXlQYXVzZUNsaWNrID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IGNhcm91c2VsT2JqLnBhdXNlZCA/IFBMQVlfQUNUSU9OIDogUEFVU0VfQUNUSU9OO1xyXG5cclxuICAgICAgICAkc2xpZGVyLnNsaWNrKGFjdGlvbik7XHJcbiAgICAgICAgdXBkYXRlQnV0dG9uTGFiZWxzV2l0aENvbnRleHQoJHBsYXlQYXVzZUJ1dHRvbiwgYWN0aW9uKTtcclxuICAgIH07XHJcblxyXG4gICAgJHBsYXlQYXVzZUJ1dHRvbi5vbignY2xpY2snLCB0aHJvdHRsZShvblBsYXlQYXVzZUNsaWNrLCBzcGVlZCwgeyB0cmFpbGluZzogZmFsc2UgfSkpO1xyXG59O1xyXG4iLCJpbXBvcnQgeyBGT0NVU0FCTEVfRUxFTUVOVFNfU0VMRUNUT1IgfSBmcm9tICcuLi9jb25zdGFudHMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKCRzbGlkZXMpID0+IHtcclxuICAgICRzbGlkZXMuZWFjaCgoaWR4LCBzbGlkZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0ICRzbGlkZSA9ICQoc2xpZGUpO1xyXG4gICAgICAgIGNvbnN0IHRhYkluZGV4ID0gJHNsaWRlLmhhc0NsYXNzKCdzbGljay1hY3RpdmUnKSA/IDAgOiAtMTtcclxuXHJcbiAgICAgICAgaWYgKCRzbGlkZS5pcyhGT0NVU0FCTEVfRUxFTUVOVFNfU0VMRUNUT1IpKSAkc2xpZGUuYXR0cigndGFiaW5kZXgnLCB0YWJJbmRleCk7XHJcblxyXG4gICAgICAgICRzbGlkZS5maW5kKEZPQ1VTQUJMRV9FTEVNRU5UU19TRUxFQ1RPUikuZWFjaCgoaW5kZXgsIGNoaWxkKSA9PiB7XHJcbiAgICAgICAgICAgICQoY2hpbGQpLmF0dHIoJ3RhYmluZGV4JywgdGFiSW5kZXgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn07XHJcbiIsImltcG9ydCB1cGRhdGVUZXh0V2l0aExpdmVEYXRhIGZyb20gJy4vdXBkYXRlVGV4dFdpdGhMaXZlRGF0YSc7XHJcbmltcG9ydCB0b29sdGlwU2V0dXAgZnJvbSAnLi90b29sdGlwU2V0dXAnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKCRwcmV2QXJyb3csICRuZXh0QXJyb3csIGFjdGl2ZVNsaWRlSWR4LCBzbGlkZXNRdWFudGl0eSwgaXNJbmZpbml0ZSwgYXJpYUxhYmVsKSA9PiB7XHJcbiAgICBpZiAoc2xpZGVzUXVhbnRpdHkgPCAyIHx8ICEkcHJldkFycm93IHx8ICEkbmV4dEFycm93KSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgYWN0aXZlU2xpZGVOdW1iZXIgPSBhY3RpdmVTbGlkZUlkeCArIDE7XHJcblxyXG4gICAgY29uc3QgcHJldlNsaWRlTnVtYmVyID0gYWN0aXZlU2xpZGVJZHggPT09IDAgPyBzbGlkZXNRdWFudGl0eSA6IGFjdGl2ZVNsaWRlTnVtYmVyIC0gMTtcclxuICAgIGNvbnN0IGFycm93TGVmdFRleHQgPSB1cGRhdGVUZXh0V2l0aExpdmVEYXRhKGFyaWFMYWJlbCwgcHJldlNsaWRlTnVtYmVyLCBzbGlkZXNRdWFudGl0eSk7XHJcblxyXG4gICAgJHByZXZBcnJvdy5hdHRyKHtcclxuICAgICAgICAnYXJpYS1sYWJlbCc6IGFycm93TGVmdFRleHQsXHJcbiAgICAgICAgdGFiaW5kZXg6ICFpc0luZmluaXRlICYmIGFjdGl2ZVNsaWRlSWR4ID09PSAwID8gLTEgOiAwLFxyXG4gICAgfSk7XHJcbiAgICB0b29sdGlwU2V0dXAoJHByZXZBcnJvdyk7XHJcblxyXG4gICAgY29uc3QgbmV4dFNsaWRlTnVtYmVyID0gYWN0aXZlU2xpZGVJZHggPT09IHNsaWRlc1F1YW50aXR5IC0gMSA/IDEgOiBhY3RpdmVTbGlkZU51bWJlciArIDE7XHJcbiAgICBjb25zdCBhcnJvd1JpZ2h0VGV4dCA9IHVwZGF0ZVRleHRXaXRoTGl2ZURhdGEoYXJpYUxhYmVsLCBuZXh0U2xpZGVOdW1iZXIsIHNsaWRlc1F1YW50aXR5KTtcclxuXHJcbiAgICAkbmV4dEFycm93LmF0dHIoe1xyXG4gICAgICAgICdhcmlhLWxhYmVsJzogYXJyb3dSaWdodFRleHQsXHJcbiAgICAgICAgdGFiaW5kZXg6ICFpc0luZmluaXRlICYmIGFjdGl2ZVNsaWRlSWR4ID09PSBzbGlkZXNRdWFudGl0eSAtIDEgPyAtMSA6IDAsXHJcbiAgICB9KTtcclxuICAgIHRvb2x0aXBTZXR1cCgkbmV4dEFycm93KTtcclxufTtcclxuIiwiaW1wb3J0IHVwZGF0ZVRleHRXaXRoTGl2ZURhdGEgZnJvbSAnLi91cGRhdGVUZXh0V2l0aExpdmVEYXRhJztcclxuaW1wb3J0IHRvb2x0aXBTZXR1cCBmcm9tICcuL3Rvb2x0aXBTZXR1cCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCAoJGRvdHMsIGFjdGl2ZVNsaWRlSWR4LCBzbGlkZXNRdWFudGl0eSwgeyBjYXJvdXNlbEFycm93QW5kRG90QXJpYUxhYmVsLCBjYXJvdXNlbEFjdGl2ZURvdEFyaWFMYWJlbCB9KSA9PiB7XHJcbiAgICBpZiAoISRkb3RzKSByZXR1cm47XHJcblxyXG4gICAgaWYgKHNsaWRlc1F1YW50aXR5IDwgMikge1xyXG4gICAgICAgICRkb3RzLmNzcygnZGlzcGxheScsICdub25lJyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgICRkb3RzLmNzcygnZGlzcGxheScsICdibG9jaycpO1xyXG5cclxuICAgICRkb3RzLmNoaWxkcmVuKCkuZWFjaCgoaWR4LCBkb3QpID0+IHtcclxuICAgICAgICBjb25zdCBkb3RMYWJlbFRleHQgPSB1cGRhdGVUZXh0V2l0aExpdmVEYXRhKGNhcm91c2VsQXJyb3dBbmREb3RBcmlhTGFiZWwsIGlkeCArIDEsIHNsaWRlc1F1YW50aXR5KTtcclxuICAgICAgICBjb25zdCBkb3RTbGlkZVN0YXR1c1RleHQgPSBpZHggPT09IGFjdGl2ZVNsaWRlSWR4ID8gYCwgJHtjYXJvdXNlbEFjdGl2ZURvdEFyaWFMYWJlbH1gIDogJyc7XHJcbiAgICAgICAgY29uc3QgZG90QXJpYUxhYmVsID0gYCR7ZG90TGFiZWxUZXh0fSR7ZG90U2xpZGVTdGF0dXNUZXh0fWA7XHJcbiAgICAgICAgY29uc3QgJGRvdEJ1dHRvbiA9ICQoZG90KS5maW5kKCdbZGF0YS1jYXJvdXNlbC1kb3RdJyk7XHJcblxyXG4gICAgICAgIHRvb2x0aXBTZXR1cCgkZG90QnV0dG9uLmF0dHIoJ2FyaWEtbGFiZWwnLCBkb3RBcmlhTGFiZWwpKTtcclxuICAgIH0pO1xyXG59O1xyXG4iLCJleHBvcnQgZGVmYXVsdCAoeyBzbGlkZUNvdW50LCAkc2xpZGVzLCBvcHRpb25zOiB7IHNsaWRlc1RvU2hvdywgc2xpZGVzVG9TY3JvbGwgfSB9KSA9PiB7XHJcbiAgICBjb25zdCBsYXN0VmlzaWJsZUlkeCA9ICRzbGlkZXMuZ2V0KCkucmVkdWNlKChhY2MsIGN1cnIsIGlkeCkgPT4ge1xyXG4gICAgICAgIGlmICgkKGN1cnIpLmhhc0NsYXNzKCdzbGljay1hY3RpdmUnKSkgcmV0dXJuIGlkeDtcclxuICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgfSwgLTEpO1xyXG5cclxuICAgIGNvbnN0IGFjdGl2ZVNsaWRlSWR4ID0gbGFzdFZpc2libGVJZHggPCBzbGlkZXNUb1Nob3dcclxuICAgICAgICA/IDBcclxuICAgICAgICA6IE1hdGguY2VpbCgobGFzdFZpc2libGVJZHggKyAxIC0gc2xpZGVzVG9TaG93KSAvIHNsaWRlc1RvU2Nyb2xsKTtcclxuXHJcbiAgICBsZXQgc2xpZGVzUXVhbnRpdHk7XHJcbiAgICBpZiAoc2xpZGVDb3VudCA9PT0gMCkge1xyXG4gICAgICAgIHNsaWRlc1F1YW50aXR5ID0gMDtcclxuICAgIH0gZWxzZSBpZiAoc2xpZGVDb3VudCA8PSBzbGlkZXNUb1Nob3cpIHtcclxuICAgICAgICBzbGlkZXNRdWFudGl0eSA9IDE7XHJcbiAgICB9IGVsc2Ugc2xpZGVzUXVhbnRpdHkgPSBNYXRoLmNlaWwoKHNsaWRlQ291bnQgLSBzbGlkZXNUb1Nob3cpIC8gc2xpZGVzVG9TY3JvbGwpICsgMTtcclxuXHJcbiAgICAvLyBGWUkgLSBvbmUgc2xpZGUgY2FuIGNvbnRhaW4gc2V2ZXJhbCBjYXJkIGl0ZW1zIGZvciBwcm9kdWN0IGNhcm91c2VsXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGFjdGl2ZVNsaWRlSWR4LFxyXG4gICAgICAgIHNsaWRlc1F1YW50aXR5LFxyXG4gICAgfTtcclxufTtcclxuIiwiZXhwb3J0IGRlZmF1bHQgKHsgJHNsaWRlciB9LCBpc0FuYWx5emVkRGF0YUF0dHIpID0+IHtcclxuICAgIGNvbnN0ICRhY3RpdmVTbGlkZSA9ICRzbGlkZXIuZmluZCgnLnNsaWNrLWN1cnJlbnQnKTtcclxuICAgIGNvbnN0IGlzQW5hbHl6ZWRTbGlkZSA9ICRhY3RpdmVTbGlkZS5kYXRhKGlzQW5hbHl6ZWREYXRhQXR0cik7XHJcblxyXG4gICAgaWYgKGlzQW5hbHl6ZWRTbGlkZSkgcmV0dXJuIHsgaXNBbmFseXplZFNsaWRlIH07XHJcblxyXG4gICAgY29uc3QgJGFjdGl2ZVNsaWRlSW1nID0gJGFjdGl2ZVNsaWRlLmZpbmQoJy5oZXJvQ2Fyb3VzZWwtaW1hZ2UnKTtcclxuICAgIGNvbnN0IGFjdGl2ZVNsaWRlSW1nTm9kZSA9ICRhY3RpdmVTbGlkZUltZ1swXTtcclxuICAgIGNvbnN0ICRhY3RpdmVTbGlkZUFuZENsb25lcyA9ICRzbGlkZXIuZmluZChgW2RhdGEtaGVyby1zbGlkZT0keyRhY3RpdmVTbGlkZS5kYXRhKCdoZXJvLXNsaWRlJyl9XWApO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgJHNsaWRlcixcclxuICAgICAgICAkYWN0aXZlU2xpZGUsXHJcbiAgICAgICAgJGFjdGl2ZVNsaWRlSW1nLFxyXG4gICAgICAgIGFjdGl2ZVNsaWRlSW1nTm9kZSxcclxuICAgICAgICAkYWN0aXZlU2xpZGVBbmRDbG9uZXMsXHJcbiAgICB9O1xyXG59O1xyXG4iLCJpbXBvcnQgZ2V0QWN0aXZlU2xpZGVJbmZvIGZyb20gJy4vZ2V0QWN0aXZlU2xpZGVJbmZvJztcclxuXHJcbmNvbnN0IElNQUdFX0NMQVNTRVMgPSB7XHJcbiAgICB2ZXJ0aWNhbDogJ2lzLXZlcnRpY2FsLWltYWdlLXR5cGUnLFxyXG4gICAgc3F1YXJlOiAnaXMtc3F1YXJlLWltYWdlLXR5cGUnLFxyXG59O1xyXG5jb25zdCBJU19BTkFMWVpFRF9EQVRBX0FUVFIgPSAnaW1hZ2UtcmF0aW8tYW5hbHl6ZWQnO1xyXG5cclxuY29uc3QgZGVmaW5lQXNwZWN0UmF0aW9DbGFzcyA9IChpbWFnZUFzcGVjdFJhdGlvKSA9PiB7XHJcbiAgICBzd2l0Y2ggKHRydWUpIHtcclxuICAgIGNhc2UgaW1hZ2VBc3BlY3RSYXRpbyA+IDAuOCAmJiBpbWFnZUFzcGVjdFJhdGlvIDw9IDEuMjpcclxuICAgICAgICByZXR1cm4gSU1BR0VfQ0xBU1NFUy5zcXVhcmU7XHJcbiAgICBjYXNlIGltYWdlQXNwZWN0UmF0aW8gPiAxLjI6XHJcbiAgICAgICAgcmV0dXJuIElNQUdFX0NMQVNTRVMudmVydGljYWw7XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxufTtcclxuXHJcbmNvbnN0IHNldEFzcGVjdFJhdGlvQ2xhc3MgPSAoaW1hZ2VOb2RlLCAkc2xpZGVzKSA9PiB7XHJcbiAgICBpZiAoaW1hZ2VOb2RlLm5hdHVyYWxIZWlnaHQgPD0gMSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGltYWdlQXNwZWN0UmF0aW8gPSBpbWFnZU5vZGUubmF0dXJhbEhlaWdodCAvIGltYWdlTm9kZS5uYXR1cmFsV2lkdGg7XHJcbiAgICAkc2xpZGVzLmFkZENsYXNzKGRlZmluZUFzcGVjdFJhdGlvQ2xhc3MoaW1hZ2VBc3BlY3RSYXRpbykpO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKHsgZGVsZWdhdGVUYXJnZXQgfSwgY2Fyb3VzZWxPYmopID0+IHtcclxuICAgIGNvbnN0IHtcclxuICAgICAgICBpc0FuYWx5emVkU2xpZGUsXHJcbiAgICAgICAgJGFjdGl2ZVNsaWRlLFxyXG4gICAgICAgICRhY3RpdmVTbGlkZUltZyxcclxuICAgICAgICBhY3RpdmVTbGlkZUltZ05vZGUsXHJcbiAgICAgICAgJGFjdGl2ZVNsaWRlQW5kQ2xvbmVzLFxyXG4gICAgfSA9IGdldEFjdGl2ZVNsaWRlSW5mbyhjYXJvdXNlbE9iaiB8fCBkZWxlZ2F0ZVRhcmdldC5zbGljaywgSVNfQU5BTFlaRURfREFUQV9BVFRSKTtcclxuXHJcbiAgICBpZiAoaXNBbmFseXplZFNsaWRlKSByZXR1cm47XHJcblxyXG4gICAgJGFjdGl2ZVNsaWRlQW5kQ2xvbmVzLmRhdGEoSVNfQU5BTFlaRURfREFUQV9BVFRSLCB0cnVlKTtcclxuXHJcbiAgICBpZiAoJGFjdGl2ZVNsaWRlLmZpbmQoJy5oZXJvQ2Fyb3VzZWwtY29udGVudCcpLmxlbmd0aCkgcmV0dXJuO1xyXG5cclxuICAgIGlmIChhY3RpdmVTbGlkZUltZ05vZGUuY29tcGxldGUpIHtcclxuICAgICAgICBpZiAoYWN0aXZlU2xpZGVJbWdOb2RlLm5hdHVyYWxIZWlnaHQgPT09IDEpIHtcclxuICAgICAgICAgICAgLy8gb25seSBiYXNlNjQgaW1hZ2UgZnJvbSBzcmNzZXQgd2FzIGxvYWRlZFxyXG4gICAgICAgICAgICAkYWN0aXZlU2xpZGVJbWcub24oJ2xvYWQnLCAoKSA9PiBzZXRBc3BlY3RSYXRpb0NsYXNzKGFjdGl2ZVNsaWRlSW1nTm9kZSwgJGFjdGl2ZVNsaWRlQW5kQ2xvbmVzKSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChhY3RpdmVTbGlkZUltZ05vZGUubmF0dXJhbEhlaWdodCA+IDEpIHtcclxuICAgICAgICAgICAgc2V0QXNwZWN0UmF0aW9DbGFzcyhhY3RpdmVTbGlkZUltZ05vZGUsICRhY3RpdmVTbGlkZUFuZENsb25lcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfSBlbHNlICRhY3RpdmVTbGlkZUltZy5vbignbG9hZCcsICgpID0+IHNldEFzcGVjdFJhdGlvQ2xhc3MoYWN0aXZlU2xpZGVJbWdOb2RlLCAkYWN0aXZlU2xpZGVBbmRDbG9uZXMpKTtcclxufTtcclxuIiwiaW1wb3J0IHsgaXNCcm93c2VySUUgfSBmcm9tICcuLi8uLi91dGlscy9pZS1oZWxwZXJzJztcclxuaW1wb3J0IGdldEFjdGl2ZVNsaWRlSW5mbyBmcm9tICcuL2dldEFjdGl2ZVNsaWRlSW5mbyc7XHJcblxyXG5jb25zdCBJTUFHRV9FUlJPUl9DTEFTUyA9ICdpcy1pbWFnZS1lcnJvcic7XHJcbmNvbnN0IElTX0FOQUxZWkVEX0RBVEFfQVRUUiA9ICdpbWFnZS1sb2FkLWFuYWx5emVkJztcclxuXHJcbmNvbnN0IGdlbmVyYXRlSW1hZ2UgPSAoJGltYWdlLCAkc2xpZGVzKSA9PiB7XHJcbiAgICAkKCc8aW1nIC8+JylcclxuICAgICAgICAub24oJ2Vycm9yJywgKCkgPT4gJHNsaWRlcy5hZGRDbGFzcyhJTUFHRV9FUlJPUl9DTEFTUykpXHJcbiAgICAgICAgLmF0dHIoJ3NyYycsICRpbWFnZS5hdHRyKCdzcmMnKSk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCAoZSwgY2Fyb3VzZWxPYmopID0+IHtcclxuICAgIGNvbnN0IHtcclxuICAgICAgICBpc0FuYWx5emVkU2xpZGUsXHJcbiAgICAgICAgJGFjdGl2ZVNsaWRlSW1nLFxyXG4gICAgICAgIGFjdGl2ZVNsaWRlSW1nTm9kZSxcclxuICAgICAgICAkYWN0aXZlU2xpZGVBbmRDbG9uZXMsXHJcbiAgICB9ID0gZ2V0QWN0aXZlU2xpZGVJbmZvKGNhcm91c2VsT2JqLCBJU19BTkFMWVpFRF9EQVRBX0FUVFIpO1xyXG5cclxuICAgIGlmIChpc0FuYWx5emVkU2xpZGUpIHJldHVybjtcclxuXHJcbiAgICAkYWN0aXZlU2xpZGVBbmRDbG9uZXMuZGF0YShJU19BTkFMWVpFRF9EQVRBX0FUVFIsIHRydWUpO1xyXG5cclxuICAgIGlmIChhY3RpdmVTbGlkZUltZ05vZGUuY29tcGxldGUpIHtcclxuICAgICAgICBpZiAoYWN0aXZlU2xpZGVJbWdOb2RlLm5hdHVyYWxIZWlnaHQgPT09IDApIHtcclxuICAgICAgICAgICAgJGFjdGl2ZVNsaWRlQW5kQ2xvbmVzLmFkZENsYXNzKElNQUdFX0VSUk9SX0NMQVNTKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGFjdGl2ZVNsaWRlSW1nTm9kZS5uYXR1cmFsSGVpZ2h0ID09PSAxKSB7XHJcbiAgICAgICAgICAgIC8vIG9ubHkgYmFzZTY0IGltYWdlIGZyb20gc3Jjc2V0IHdhcyBsb2FkZWRcclxuICAgICAgICAgICAgJGFjdGl2ZVNsaWRlSW1nLm9uKCdlcnJvcicsICgpID0+ICRhY3RpdmVTbGlkZUFuZENsb25lcy5hZGRDbGFzcyhJTUFHRV9FUlJPUl9DTEFTUykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghJGFjdGl2ZVNsaWRlSW1nLmF0dHIoJ3NyYycpKSB7XHJcbiAgICAgICAgJGFjdGl2ZVNsaWRlQW5kQ2xvbmVzLmFkZENsYXNzKElNQUdFX0VSUk9SX0NMQVNTKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGlzQnJvd3NlcklFKSB7XHJcbiAgICAgICAgZ2VuZXJhdGVJbWFnZSgkYWN0aXZlU2xpZGVJbWcsICRhY3RpdmVTbGlkZUFuZENsb25lcyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgICRhY3RpdmVTbGlkZUltZy5vbignZXJyb3InLCAoKSA9PiAkYWN0aXZlU2xpZGVBbmRDbG9uZXMuYWRkQ2xhc3MoSU1BR0VfRVJST1JfQ0xBU1MpKTtcclxufTtcclxuIiwiZXhwb3J0IHsgZGVmYXVsdCBhcyBhY3RpdmF0ZVBsYXlQYXVzZUJ1dHRvbiB9IGZyb20gJy4vYWN0aXZhdGVQbGF5UGF1c2VCdXR0b24nO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFuYWxpemVTbGlkZXMgfSBmcm9tICcuL2FuYWxpemVTbGlkZXMnO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFycm93QXJpYUxhYmxpbmcgfSBmcm9tICcuL2Fycm93QXJpYUxhYmxpbmcnO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIGRvdHNTZXR1cCB9IGZyb20gJy4vZG90c1NldHVwJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBnZXRBY3RpdmVTbGlkZUlkeEFuZFNsaWRlc1F1YW50aXR5IH0gZnJvbSAnLi9nZXRBY3RpdmVTbGlkZUlkeEFuZFNsaWRlc1F1YW50aXR5JztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBoYW5kbGVJbWFnZUFzcGVjdFJhdGlvIH0gZnJvbSAnLi9oYW5kbGVJbWFnZUFzcGVjdFJhdGlvJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBoYW5kbGVJbWFnZUxvYWQgfSBmcm9tICcuL2hhbmRsZUltYWdlTG9hZCc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcmVmcmVzaEZvY3VzIH0gZnJvbSAnLi9yZWZyZXNoRm9jdXMnO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIHVwZGF0ZVRleHRXaXRoTGl2ZURhdGEgfSBmcm9tICcuL3VwZGF0ZVRleHRXaXRoTGl2ZURhdGEnO1xyXG4iLCJpbXBvcnQgeyBGT0NVU0FCTEVfRUxFTUVOVFNfU0VMRUNUT1IgfSBmcm9tICcuLi9jb25zdGFudHMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKCRwcmV2QXJyb3csICRuZXh0QXJyb3csICRkb3RzLCAkc2xpZGVyLCBhY3RpdmVTbGlkZUlkeCwgc2xpZGVzUXVhbnRpdHksIGlzSW5maW5pdGUpID0+IHtcclxuICAgIGlmIChpc0luZmluaXRlIHx8ICEkcHJldkFycm93IHx8ICEkbmV4dEFycm93KSByZXR1cm47XHJcblxyXG4gICAgaWYgKGFjdGl2ZVNsaWRlSWR4ID09PSAwICYmICRwcmV2QXJyb3cuaXMoJzpmb2N1cycpKSB7XHJcbiAgICAgICAgJG5leHRBcnJvdy5mb2N1cygpO1xyXG4gICAgfSBlbHNlIGlmIChhY3RpdmVTbGlkZUlkeCA9PT0gc2xpZGVzUXVhbnRpdHkgLSAxICYmICRuZXh0QXJyb3cuaXMoJzpmb2N1cycpKSB7XHJcbiAgICAgICAgaWYgKCRkb3RzKSB7XHJcbiAgICAgICAgICAgICRkb3RzLmNoaWxkcmVuKCkuZmlyc3QoKS5maW5kKCdbZGF0YS1jYXJvdXNlbC1kb3RdJykuZm9jdXMoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgJGZpcnN0QWN0aXZlU2xpZGUgPSAkc2xpZGVyLmZpbmQoJy5zbGljay1hY3RpdmUnKS5maXJzdCgpO1xyXG5cclxuICAgICAgICBpZiAoJGZpcnN0QWN0aXZlU2xpZGUuaXMoRk9DVVNBQkxFX0VMRU1FTlRTX1NFTEVDVE9SKSkge1xyXG4gICAgICAgICAgICAkZmlyc3RBY3RpdmVTbGlkZS5mb2N1cygpO1xyXG4gICAgICAgIH0gZWxzZSAkZmlyc3RBY3RpdmVTbGlkZS5maW5kKEZPQ1VTQUJMRV9FTEVNRU5UU19TRUxFQ1RPUikuZmlyc3QoKS5mb2N1cygpO1xyXG4gICAgfVxyXG59O1xyXG4iLCJjb25zdCBUT09MVElQX0RBVEFfU0VMRUNUT1IgPSAnZGF0YS1jYXJvdXNlbC10b29sdGlwJztcclxuY29uc3QgVE9PTFRJUF9DTEFTUyA9ICdjYXJvdXNlbC10b29sdGlwJztcclxuY29uc3QgVE9PTFRJUF9OT0RFID0gYDxzcGFuICR7VE9PTFRJUF9EQVRBX1NFTEVDVE9SfSBjbGFzcz1cIiR7VE9PTFRJUF9DTEFTU31cIj48L3NwYW4+YDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0ICgkbm9kZSkgPT4ge1xyXG4gICAgY29uc3QgJGV4aXN0ZWRUb29sdGlwID0gJG5vZGUuZmluZChgWyR7VE9PTFRJUF9EQVRBX1NFTEVDVE9SfV1gKTtcclxuICAgIGlmICgkZXhpc3RlZFRvb2x0aXAubGVuZ3RoKSB7XHJcbiAgICAgICAgJGV4aXN0ZWRUb29sdGlwLmF0dHIoJ2FyaWEtbGFiZWwnLCAkbm9kZS5hdHRyKCdhcmlhLWxhYmVsJykpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCAkdG9vbHRpcCA9ICQoVE9PTFRJUF9OT0RFKS5hdHRyKCdhcmlhLWxhYmVsJywgJG5vZGUuYXR0cignYXJpYS1sYWJlbCcpKTtcclxuICAgICAgICAkbm9kZS5hcHBlbmQoJHRvb2x0aXApO1xyXG4gICAgfVxyXG59O1xyXG4iLCJjb25zdCBTTElERV9OVU1CRVIgPSAnW1NMSURFX05VTUJFUl0nO1xyXG5jb25zdCBTTElERVNfUVVBTlRJVFkgPSAnW1NMSURFU19RVUFOVElUWV0nO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKHRleHRGb3JDaGFuZ2UsIHNsaWRlTnVtYmVyLCBzbGlkZXNRdWFudGl0eSkgPT4gKFxyXG4gICAgdGV4dEZvckNoYW5nZVxyXG4gICAgICAgIC5yZXBsYWNlKFNMSURFX05VTUJFUiwgc2xpZGVOdW1iZXIpXHJcbiAgICAgICAgLnJlcGxhY2UoU0xJREVTX1FVQU5USVRZLCBzbGlkZXNRdWFudGl0eSlcclxuKTtcclxuIiwiaW1wb3J0IHsgQ29sbGFwc2libGVFdmVudHMgfSBmcm9tICcuLi9jb21tb24vY29sbGFwc2libGUnO1xyXG5cclxuY29uc3QgUExVR0lOX0tFWSA9ICdjb2xsYXBzaWJsZS1ncm91cCc7XHJcblxyXG4vKlxyXG4gKiBNYW5hZ2UgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIGNvbGxhcHNpYmxlcy4gRm9yIGV4YW1wbGUsIGlmIGEgY29sbGFwc2libGUgaXNcclxuICogYWJvdXQgdG8gb3BlbiBhbmQgdGhlcmUncyBvbmUgYWxyZWFkeSBvcGVuLCBjbG9zZSB0aGUgbGF0dGVyIGZpcnN0LlxyXG4gKiBAcGFyYW0ge2pRdWVyeX0gJGNvbXBvbmVudFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIENvbGxhcHNpYmxlR3JvdXAge1xyXG4gICAgY29uc3RydWN0b3IoJGNvbXBvbmVudCkge1xyXG4gICAgICAgIHRoaXMuJGNvbXBvbmVudCA9ICRjb21wb25lbnQ7XHJcbiAgICAgICAgdGhpcy5vcGVuQ29sbGFwc2libGUgPSBudWxsO1xyXG5cclxuICAgICAgICAvLyBBdXRvIGJpbmRcclxuICAgICAgICB0aGlzLm9uQ29sbGFwc2libGVPcGVuID0gdGhpcy5vbkNvbGxhcHNpYmxlT3Blbi5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub25Db2xsYXBzaWJsZUNsb3NlID0gdGhpcy5vbkNvbGxhcHNpYmxlQ2xvc2UuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgLy8gTGlzdGVuXHJcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3BlbkNvbGxhcHNpYmxlICYmICF0aGlzLm9wZW5Db2xsYXBzaWJsZS5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLm9wZW5Db2xsYXBzaWJsZS5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBiaW5kRXZlbnRzKCkge1xyXG4gICAgICAgIHRoaXMuJGNvbXBvbmVudC5vbihDb2xsYXBzaWJsZUV2ZW50cy5vcGVuLCB0aGlzLm9uQ29sbGFwc2libGVPcGVuKTtcclxuICAgICAgICB0aGlzLiRjb21wb25lbnQub24oQ29sbGFwc2libGVFdmVudHMuY2xvc2UsIHRoaXMub25Db2xsYXBzaWJsZUNsb3NlKTtcclxuICAgIH1cclxuXHJcbiAgICB1bmJpbmRFdmVudHMoKSB7XHJcbiAgICAgICAgdGhpcy4kY29tcG9uZW50Lm9mZihDb2xsYXBzaWJsZUV2ZW50cy5vcGVuLCB0aGlzLm9uQ29sbGFwc2libGVPcGVuKTtcclxuICAgICAgICB0aGlzLiRjb21wb25lbnQub2ZmKENvbGxhcHNpYmxlRXZlbnRzLmNsb3NlLCB0aGlzLm9uQ29sbGFwc2libGVDbG9zZSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Db2xsYXBzaWJsZU9wZW4oZXZlbnQsIGNvbGxhcHNpYmxlSW5zdGFuY2UpIHtcclxuICAgICAgICBpZiAodGhpcy5vcGVuQ29sbGFwc2libGUgJiYgdGhpcy5vcGVuQ29sbGFwc2libGUuaGFzQ29sbGFwc2libGUoY29sbGFwc2libGVJbnN0YW5jZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG5cclxuICAgICAgICB0aGlzLm9wZW5Db2xsYXBzaWJsZSA9IGNvbGxhcHNpYmxlSW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgb25Db2xsYXBzaWJsZUNsb3NlKGV2ZW50LCBjb2xsYXBzaWJsZUluc3RhbmNlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3BlbkNvbGxhcHNpYmxlICYmIHRoaXMub3BlbkNvbGxhcHNpYmxlLmhhc0NvbGxhcHNpYmxlKGNvbGxhcHNpYmxlSW5zdGFuY2UpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMub3BlbkNvbGxhcHNpYmxlID0gbnVsbDtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBuZXcgQ29sbGFwc2libGVHcm91cCBpbnN0YW5jZXNcclxuICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl1cclxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxyXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuJGNvbnRleHRdXHJcbiAqIEByZXR1cm4ge0FycmF5fSBhcnJheSBvZiBDb2xsYXBzaWJsZUdyb3VwIGluc3RhbmNlc1xyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29sbGFwc2libGVHcm91cEZhY3Rvcnkoc2VsZWN0b3IgPSBgW2RhdGEtJHtQTFVHSU5fS0VZfV1gLCBvcHRpb25zID0ge30pIHtcclxuICAgIGNvbnN0ICRncm91cHMgPSAkKHNlbGVjdG9yLCBvcHRpb25zLiRjb250ZXh0KTtcclxuICAgIGNvbnN0IGluc3RhbmNlS2V5ID0gYCR7UExVR0lOX0tFWX1JbnN0YW5jZWA7XHJcblxyXG4gICAgcmV0dXJuICRncm91cHMubWFwKChpbmRleCwgZWxlbWVudCkgPT4ge1xyXG4gICAgICAgIGNvbnN0ICRncm91cCA9ICQoZWxlbWVudCk7XHJcbiAgICAgICAgY29uc3QgY2FjaGVkR3JvdXAgPSAkZ3JvdXAuZGF0YShpbnN0YW5jZUtleSk7XHJcblxyXG4gICAgICAgIGlmIChjYWNoZWRHcm91cCBpbnN0YW5jZW9mIENvbGxhcHNpYmxlR3JvdXApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZEdyb3VwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgQ29sbGFwc2libGVHcm91cCgkZ3JvdXApO1xyXG5cclxuICAgICAgICAkZ3JvdXAuZGF0YShpbnN0YW5jZUtleSwgZ3JvdXApO1xyXG5cclxuICAgICAgICByZXR1cm4gZ3JvdXA7XHJcbiAgICB9KS50b0FycmF5KCk7XHJcbn1cclxuIiwiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IG1lZGlhUXVlcnlMaXN0RmFjdG9yeSBmcm9tICcuL21lZGlhLXF1ZXJ5LWxpc3QnO1xyXG5cclxuY29uc3QgUExVR0lOX0tFWSA9ICdjb2xsYXBzaWJsZSc7XHJcblxyXG5leHBvcnQgY29uc3QgQ29sbGFwc2libGVFdmVudHMgPSB7XHJcbiAgICBvcGVuOiAnb3Blbi5jb2xsYXBzaWJsZScsXHJcbiAgICBjbG9zZTogJ2Nsb3NlLmNvbGxhcHNpYmxlJyxcclxuICAgIHRvZ2dsZTogJ3RvZ2dsZS5jb2xsYXBzaWJsZScsXHJcbiAgICBjbGljazogJ2NsaWNrLmNvbGxhcHNpYmxlJyxcclxufTtcclxuXHJcbmNvbnN0IENvbGxhcHNpYmxlU3RhdGUgPSB7XHJcbiAgICBjbG9zZWQ6ICdjbG9zZWQnLFxyXG4gICAgb3BlbjogJ29wZW4nLFxyXG59O1xyXG5cclxuZnVuY3Rpb24gcHJlcGVuZEhhc2goaWQpIHtcclxuICAgIGlmIChpZCAmJiBpZC5pbmRleE9mKCcjJykgPT09IDApIHtcclxuICAgICAgICByZXR1cm4gaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGAjJHtpZH1gO1xyXG59XHJcblxyXG5mdW5jdGlvbiBvcHRpb25zRnJvbURhdGEoJGVsZW1lbnQpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgZGlzYWJsZWRCcmVha3BvaW50OiAkZWxlbWVudC5kYXRhKGAke1BMVUdJTl9LRVl9RGlzYWJsZWRCcmVha3BvaW50YCksXHJcbiAgICAgICAgZGlzYWJsZWRTdGF0ZTogJGVsZW1lbnQuZGF0YShgJHtQTFVHSU5fS0VZfURpc2FibGVkU3RhdGVgKSxcclxuICAgICAgICBlbmFibGVkU3RhdGU6ICRlbGVtZW50LmRhdGEoYCR7UExVR0lOX0tFWX1FbmFibGVkU3RhdGVgKSxcclxuICAgICAgICBvcGVuQ2xhc3NOYW1lOiAkZWxlbWVudC5kYXRhKGAke1BMVUdJTl9LRVl9T3BlbkNsYXNzTmFtZWApLFxyXG4gICAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbGxhcHNlL0V4cGFuZCB0b2dnbGVcclxuICovXHJcbmV4cG9ydCBjbGFzcyBDb2xsYXBzaWJsZSB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7alF1ZXJ5fSAkdG9nZ2xlIC0gVHJpZ2dlciBidXR0b25cclxuICAgICAqIEBwYXJhbSB7alF1ZXJ5fSAkdGFyZ2V0IC0gQ29udGVudCB0byBjb2xsYXBzZSAvIGV4cGFuZFxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIENvbmZpZ3VyYWJsZSBvcHRpb25zXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuJGNvbnRleHRdXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZGlzYWJsZWRCcmVha3BvaW50XVxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmRpc2FibGVkU3RhdGVdXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuZW5hYmxlZFN0YXRlXVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm9wZW5DbGFzc05hbWVdXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICpcclxuICAgICAqIDxidXR0b24gaWQ9XCIjbW9yZVwiPkNvbGxhcHNlPC9idXR0b24+XHJcbiAgICAgKiA8ZGl2IGlkPVwiY29udGVudFwiPi4uLjwvZGl2PlxyXG4gICAgICpcclxuICAgICAqIG5ldyBDb2xsYXBzaWJsZSgkKCcjbW9yZScpLCAkKCcjY29udGVudCcpKTtcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoJHRvZ2dsZSwgJHRhcmdldCwge1xyXG4gICAgICAgIGRpc2FibGVkQnJlYWtwb2ludCxcclxuICAgICAgICBkaXNhYmxlZFN0YXRlLFxyXG4gICAgICAgIGVuYWJsZWRTdGF0ZSxcclxuICAgICAgICBvcGVuQ2xhc3NOYW1lID0gJ2lzLW9wZW4nLFxyXG4gICAgfSA9IHt9KSB7XHJcbiAgICAgICAgdGhpcy4kdG9nZ2xlID0gJHRvZ2dsZTtcclxuICAgICAgICB0aGlzLiR0YXJnZXQgPSAkdGFyZ2V0O1xyXG4gICAgICAgIHRoaXMudGFyZ2V0SWQgPSAkdGFyZ2V0LmF0dHIoJ2lkJyk7XHJcbiAgICAgICAgdGhpcy5vcGVuQ2xhc3NOYW1lID0gb3BlbkNsYXNzTmFtZTtcclxuICAgICAgICB0aGlzLmRpc2FibGVkU3RhdGUgPSBkaXNhYmxlZFN0YXRlO1xyXG4gICAgICAgIHRoaXMuZW5hYmxlZFN0YXRlID0gZW5hYmxlZFN0YXRlO1xyXG5cclxuICAgICAgICBpZiAoZGlzYWJsZWRCcmVha3BvaW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWRNZWRpYVF1ZXJ5TGlzdCA9IG1lZGlhUXVlcnlMaXN0RmFjdG9yeShkaXNhYmxlZEJyZWFrcG9pbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWRNZWRpYVF1ZXJ5TGlzdCkge1xyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkID0gdGhpcy5kaXNhYmxlZE1lZGlhUXVlcnlMaXN0Lm1hdGNoZXM7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQXV0by1iaW5kXHJcbiAgICAgICAgdGhpcy5vbkNsaWNrZWQgPSB0aGlzLm9uQ2xpY2tlZC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub25EaXNhYmxlZE1lZGlhUXVlcnlMaXN0TWF0Y2ggPSB0aGlzLm9uRGlzYWJsZWRNZWRpYVF1ZXJ5TGlzdE1hdGNoLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIC8vIEFzc2lnbiBET00gYXR0cmlidXRlc1xyXG4gICAgICAgIHRoaXMuJHRhcmdldC5hdHRyKCdhcmlhLWhpZGRlbicsIHRoaXMuaXNDb2xsYXBzZWQpO1xyXG4gICAgICAgIHRoaXMuJHRvZ2dsZVxyXG4gICAgICAgICAgICAuYXR0cignYXJpYS1sYWJlbCcsIHRoaXMuX2dldFRvZ2dsZUFyaWFMYWJlbFRleHQoJHRvZ2dsZSkpXHJcbiAgICAgICAgICAgIC5hdHRyKCdhcmlhLWNvbnRyb2xzJywgJHRhcmdldC5hdHRyKCdpZCcpKVxyXG4gICAgICAgICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsIHRoaXMuaXNPcGVuKTtcclxuXHJcbiAgICAgICAgLy8gTGlzdGVuXHJcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzQ29sbGFwc2VkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLiR0YXJnZXQuaXMoJzpoaWRkZW4nKSAmJiAhdGhpcy4kdGFyZ2V0Lmhhc0NsYXNzKHRoaXMub3BlbkNsYXNzTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzT3BlbigpIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMuaXNDb2xsYXBzZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGRpc2FibGVkKGRpc2FibGVkKSB7XHJcbiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBkaXNhYmxlZDtcclxuXHJcbiAgICAgICAgaWYgKGRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQnlTdGF0ZSh0aGlzLmRpc2FibGVkU3RhdGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQnlTdGF0ZSh0aGlzLmVuYWJsZWRTdGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBkaXNhYmxlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgX2dldFRvZ2dsZUFyaWFMYWJlbFRleHQoJHRvZ2dsZSkge1xyXG4gICAgICAgIGNvbnN0ICR0ZXh0VG9nZ2xlQ2hpbGRyZW4gPSAkdG9nZ2xlLmNoaWxkcmVuKCkuZmlsdGVyKChfXywgY2hpbGQpID0+ICQoY2hpbGQpLnRleHQoKS50cmltKCkpO1xyXG4gICAgICAgIGNvbnN0ICRhcmlhTGFiZWxUYXJnZXQgPSAkdGV4dFRvZ2dsZUNoaWxkcmVuLmxlbmd0aCA/ICR0ZXh0VG9nZ2xlQ2hpbGRyZW4uZmlyc3QoKSA6ICR0b2dnbGU7XHJcblxyXG4gICAgICAgIHJldHVybiAkKCRhcmlhTGFiZWxUYXJnZXQpLnRleHQoKS50cmltKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb3Blbih7IG5vdGlmeSA9IHRydWUgfSA9IHt9KSB7XHJcbiAgICAgICAgdGhpcy4kdG9nZ2xlXHJcbiAgICAgICAgICAgIC5hZGRDbGFzcyh0aGlzLm9wZW5DbGFzc05hbWUpXHJcbiAgICAgICAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuJHRhcmdldFxyXG4gICAgICAgICAgICAuYWRkQ2xhc3ModGhpcy5vcGVuQ2xhc3NOYW1lKVxyXG4gICAgICAgICAgICAuYXR0cignYXJpYS1oaWRkZW4nLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIGlmIChub3RpZnkpIHtcclxuICAgICAgICAgICAgdGhpcy4kdG9nZ2xlLnRyaWdnZXIoQ29sbGFwc2libGVFdmVudHMub3BlbiwgW3RoaXNdKTtcclxuICAgICAgICAgICAgdGhpcy4kdG9nZ2xlLnRyaWdnZXIoQ29sbGFwc2libGVFdmVudHMudG9nZ2xlLCBbdGhpc10pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjbG9zZSh7IG5vdGlmeSA9IHRydWUgfSA9IHt9KSB7XHJcbiAgICAgICAgdGhpcy4kdG9nZ2xlXHJcbiAgICAgICAgICAgIC5yZW1vdmVDbGFzcyh0aGlzLm9wZW5DbGFzc05hbWUpXHJcbiAgICAgICAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpO1xyXG5cclxuICAgICAgICB0aGlzLiR0YXJnZXRcclxuICAgICAgICAgICAgLnJlbW92ZUNsYXNzKHRoaXMub3BlbkNsYXNzTmFtZSlcclxuICAgICAgICAgICAgLmF0dHIoJ2FyaWEtaGlkZGVuJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGlmIChub3RpZnkpIHtcclxuICAgICAgICAgICAgdGhpcy4kdG9nZ2xlLnRyaWdnZXIoQ29sbGFwc2libGVFdmVudHMuY2xvc2UsIFt0aGlzXSk7XHJcbiAgICAgICAgICAgIHRoaXMuJHRvZ2dsZS50cmlnZ2VyKENvbGxhcHNpYmxlRXZlbnRzLnRvZ2dsZSwgW3RoaXNdKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdG9nZ2xlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdG9nZ2xlQnlTdGF0ZShzdGF0ZSwgLi4uYXJncykge1xyXG4gICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcclxuICAgICAgICBjYXNlIENvbGxhcHNpYmxlU3RhdGUub3BlbjpcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3Blbi5hcHBseSh0aGlzLCBhcmdzKTtcclxuXHJcbiAgICAgICAgY2FzZSBDb2xsYXBzaWJsZVN0YXRlLmNsb3NlZDpcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvc2UuYXBwbHkodGhpcywgYXJncyk7XHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhc0NvbGxhcHNpYmxlKGNvbGxhcHNpYmxlSW5zdGFuY2UpIHtcclxuICAgICAgICByZXR1cm4gJC5jb250YWlucyh0aGlzLiR0YXJnZXQuZ2V0KDApLCBjb2xsYXBzaWJsZUluc3RhbmNlLiR0YXJnZXQuZ2V0KDApKTtcclxuICAgIH1cclxuXHJcbiAgICBiaW5kRXZlbnRzKCkge1xyXG4gICAgICAgIHRoaXMuJHRvZ2dsZS5vbihDb2xsYXBzaWJsZUV2ZW50cy5jbGljaywgdGhpcy5vbkNsaWNrZWQpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZE1lZGlhUXVlcnlMaXN0ICYmIHRoaXMuZGlzYWJsZWRNZWRpYVF1ZXJ5TGlzdC5hZGRMaXN0ZW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkTWVkaWFRdWVyeUxpc3QuYWRkTGlzdGVuZXIodGhpcy5vbkRpc2FibGVkTWVkaWFRdWVyeUxpc3RNYXRjaCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVuYmluZEV2ZW50cygpIHtcclxuICAgICAgICB0aGlzLiR0b2dnbGUub2ZmKENvbGxhcHNpYmxlRXZlbnRzLmNsaWNrLCB0aGlzLm9uQ2xpY2tlZCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkTWVkaWFRdWVyeUxpc3QgJiYgdGhpcy5kaXNhYmxlZE1lZGlhUXVlcnlMaXN0LnJlbW92ZUxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWRNZWRpYVF1ZXJ5TGlzdC5yZW1vdmVMaXN0ZW5lcih0aGlzLm9uRGlzYWJsZWRNZWRpYVF1ZXJ5TGlzdE1hdGNoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGlja2VkKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgdGhpcy50b2dnbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkRpc2FibGVkTWVkaWFRdWVyeUxpc3RNYXRjaChtZWRpYSkge1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBtZWRpYS5tYXRjaGVzO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgQ29sbGFwc2libGUgaW5zdGFuY2VcclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl1cclxuICogQHBhcmFtIHtPYmplY3R9IFtvdmVycmlkZU9wdGlvbnNdXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3ZlcnJpZGVPcHRpb25zLiRjb250ZXh0XVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gW292ZXJyaWRlT3B0aW9ucy5kaXNhYmxlZEJyZWFrcG9pbnRdXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3ZlcnJpZGVPcHRpb25zLmRpc2FibGVkU3RhdGVdXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3ZlcnJpZGVPcHRpb25zLmVuYWJsZWRTdGF0ZV1cclxuICogQHBhcmFtIHtTdHJpbmd9IFtvdmVycmlkZU9wdGlvbnMub3BlbkNsYXNzTmFtZV1cclxuICogQHJldHVybiB7QXJyYXl9IGFycmF5IG9mIENvbGxhcHNpYmxlIGluc3RhbmNlc1xyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiA8YSBocmVmPVwiI2NvbnRlbnRcIiBkYXRhLWNvbGxhcHNpYmxlPkNvbGxhcHNlPC9hPlxyXG4gKiA8ZGl2IGlkPVwiY29udGVudFwiPi4uLjwvZGl2PlxyXG4gKlxyXG4gKiBjb2xsYXBzaWJsZUZhY3RvcnkoKTtcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbGxhcHNpYmxlRmFjdG9yeShzZWxlY3RvciA9IGBbZGF0YS0ke1BMVUdJTl9LRVl9XWAsIG92ZXJyaWRlT3B0aW9ucyA9IHt9KSB7XHJcbiAgICBjb25zdCAkY29sbGFwc2libGVzID0gJChzZWxlY3Rvciwgb3ZlcnJpZGVPcHRpb25zLiRjb250ZXh0KTtcclxuXHJcbiAgICByZXR1cm4gJGNvbGxhcHNpYmxlcy5tYXAoKGluZGV4LCBlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgY29uc3QgJHRvZ2dsZSA9ICQoZWxlbWVudCk7XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2VLZXkgPSBgJHtQTFVHSU5fS0VZfUluc3RhbmNlYDtcclxuICAgICAgICBjb25zdCBjYWNoZWRDb2xsYXBzaWJsZSA9ICR0b2dnbGUuZGF0YShpbnN0YW5jZUtleSk7XHJcblxyXG4gICAgICAgIGlmIChjYWNoZWRDb2xsYXBzaWJsZSBpbnN0YW5jZW9mIENvbGxhcHNpYmxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDb2xsYXBzaWJsZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHRhcmdldElkID0gcHJlcGVuZEhhc2goJHRvZ2dsZS5kYXRhKFBMVUdJTl9LRVkpIHx8XHJcbiAgICAgICAgICAgICR0b2dnbGUuZGF0YShgJHtQTFVHSU5fS0VZfVRhcmdldGApIHx8XHJcbiAgICAgICAgICAgICR0b2dnbGUuYXR0cignaHJlZicpKTtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gXy5leHRlbmQob3B0aW9uc0Zyb21EYXRhKCR0b2dnbGUpLCBvdmVycmlkZU9wdGlvbnMpO1xyXG4gICAgICAgIGNvbnN0IGNvbGxhcHNpYmxlID0gbmV3IENvbGxhcHNpYmxlKCR0b2dnbGUsICQodGFyZ2V0SWQsIG92ZXJyaWRlT3B0aW9ucy4kY29udGV4dCksIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICAkdG9nZ2xlLmRhdGEoaW5zdGFuY2VLZXksIGNvbGxhcHNpYmxlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbGxhcHNpYmxlO1xyXG4gICAgfSkudG9BcnJheSgpO1xyXG59XHJcbiIsIi8qXHJcbiAqIFJlbWVtYmVyIHRvIHVwZGF0ZSAvYXNzZXRzL3Njc3Mvc2V0dGluZ3MvZ2xvYmFsL3NjcmVlbnNpemVzL3NjcmVlbnNpemVzLnNjc3NcclxuICogaWYgeW91IGRlY2lkZSB0byBjaGFuZ2UgYnJlYWtwb2ludCB2YWx1ZXNcclxuICovXHJcbmNvbnN0IGJyZWFrcG9pbnRTaXplcyA9IHtcclxuICAgIGxhcmdlOiAxMjYxLFxyXG4gICAgbWVkaXVtOiA4MDEsXHJcbiAgICBzbWFsbDogNTUxLFxyXG59O1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBNZWRpYVF1ZXJ5TGlzdCB1c2luZyBicmVha3BvaW50IG5hbWVcclxuICogQHBhcmFtIHtzdHJpbmd9IGJyZWFrcG9pbnROYW1lXHJcbiAqIEByZXR1cm4ge01lZGlhUXVlcnlMaXN0fG51bGx9XHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZWRpYVF1ZXJ5TGlzdEZhY3RvcnkoYnJlYWtwb2ludE5hbWUpIHtcclxuICAgIGlmICghYnJlYWtwb2ludE5hbWUgfHwgIXdpbmRvdy5tYXRjaE1lZGlhKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYnJlYWtwb2ludCA9IGJyZWFrcG9pbnRTaXplc1ticmVha3BvaW50TmFtZV07XHJcbiAgICBjb25zdCBtZWRpYVF1ZXJ5ID0gYChtaW4td2lkdGg6ICR7YnJlYWtwb2ludH1weClgO1xyXG4gICAgY29uc3QgbWVkaWFRdWVyeUxpc3QgPSB3aW5kb3cubWF0Y2hNZWRpYShtZWRpYVF1ZXJ5KTtcclxuXHJcbiAgICByZXR1cm4gbWVkaWFRdWVyeUxpc3Q7XHJcbn1cclxuIiwiY29uc3QgZm9ybXMgPSB7XHJcbiAgICBlbWFpbCh2YWx1ZSkge1xyXG4gICAgICAgIGNvbnN0IHJlID0gL15cXFMrQFxcUytcXC5cXFMrLztcclxuICAgICAgICByZXR1cm4gcmUudGVzdCh2YWx1ZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhdGVzIGEgcGFzc3dvcmQgZmllbGRcclxuICAgICAqIEBwYXJhbSB2YWx1ZVxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIHBhc3N3b3JkKHZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubm90RW1wdHkodmFsdWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIHZhbGlkYXRlcyBpZiBhIGZpZWxkIGlzIGVtcHR5XHJcbiAgICAgKiBAcGFyYW0gdmFsdWVcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgbm90RW1wdHkodmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWUubGVuZ3RoID4gMDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB2YWxpZGF0ZXMgYSBmaWVsZCBsaWtlIHByb2R1Y3QgcXVhbnRpdHlcclxuICAgICAqIEBwYXJhbSB2YWx1ZVxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKlxyXG4gICAgICovXHJcbiAgICBudW1iZXJzT25seSh2YWx1ZSkge1xyXG4gICAgICAgIGNvbnN0IHJlID0gL15cXGQrJC87XHJcbiAgICAgICAgcmV0dXJuIHJlLnRlc3QodmFsdWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIHZhbGlkYXRlcyBpbmNyZWFzZSBpbiB2YWx1ZSBkb2VzIG5vdCBleGNlZWQgbWF4XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAgICAgKlxyXG4gICAgICovXHJcbiAgICB2YWxpZGF0ZUluY3JlYXNlQWdhaW5zdE1heEJvdW5kYXJ5KHZhbHVlLCBtYXgpIHtcclxuICAgICAgICBjb25zdCByYWlzZSA9IHZhbHVlICsgMTtcclxuXHJcbiAgICAgICAgaWYgKCFtYXggfHwgcmFpc2UgPD0gbWF4KSByZXR1cm4gcmFpc2U7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIHZhbGlkYXRlcyBkZWNyZWFzZSBpbiB2YWx1ZSBkb2VzIG5vdCBmYWxsIGJlbG93IG1pblxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWluXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgdmFsaWRhdGVEZWNyZWFzZUFnYWluc3RNaW5Cb3VuZGFyeSh2YWx1ZSwgbWluKSB7XHJcbiAgICAgICAgY29uc3QgZGVjbGluZSA9IHZhbHVlIC0gMTtcclxuXHJcbiAgICAgICAgaWYgKCFtaW4gfHwgZGVjbGluZSA+PSBtaW4pIHJldHVybiBkZWNsaW5lO1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0sXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmb3JtcztcclxuIiwiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcclxuXHJcbmZ1bmN0aW9uIG1pbk1heFZhbGlkYXRlKG1pbklucHV0U2VsZWN0b3IsIG1heElucHV0U2VsZWN0b3IpIHtcclxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKGNiKSB7XHJcbiAgICAgICAgY29uc3QgbWluVmFsdWUgPSBwYXJzZUZsb2F0KCQobWluSW5wdXRTZWxlY3RvcikudmFsKCkpO1xyXG4gICAgICAgIGNvbnN0IG1heFZhbHVlID0gcGFyc2VGbG9hdCgkKG1heElucHV0U2VsZWN0b3IpLnZhbCgpKTtcclxuXHJcbiAgICAgICAgaWYgKG1heFZhbHVlID4gbWluVmFsdWUgfHwgXy5pc05hTihtYXhWYWx1ZSkgfHwgXy5pc05hTihtaW5WYWx1ZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNiKHRydWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNiKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdmFsaWRhdGU7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG1pbk1heFZhbGlkYXRlO1xyXG4iLCJpbXBvcnQgbm9kIGZyb20gJ25vZC12YWxpZGF0ZSc7XHJcbmltcG9ydCBtaW5NYXhWYWxpZGF0ZSBmcm9tICcuL25vZC1mdW5jdGlvbnMvbWluLW1heC12YWxpZGF0ZSc7XHJcblxyXG4vLyBIb29rIG91ciBTQ1NTIGZyYW1ld29yayBmb3JtIGZpZWxkIHN0YXR1cyBjbGFzc2VzIGludG8gdGhlIG5vZCB2YWxpZGF0aW9uIHN5c3RlbSBiZWZvcmUgdXNlXHJcbm5vZC5jbGFzc2VzLmVycm9yQ2xhc3MgPSAnZm9ybS1maWVsZC0tZXJyb3InO1xyXG5ub2QuY2xhc3Nlcy5zdWNjZXNzQ2xhc3MgPSAnZm9ybS1maWVsZC0tc3VjY2Vzcyc7XHJcbm5vZC5jbGFzc2VzLmVycm9yTWVzc2FnZUNsYXNzID0gJ2Zvcm0taW5saW5lTWVzc2FnZSc7XHJcblxyXG4vLyBSZWdpc3RlciB2YWxpZGF0ZSBmdW5jdGlvbnNcclxubm9kLmNoZWNrRnVuY3Rpb25zWydtaW4tbWF4J10gPSBtaW5NYXhWYWxpZGF0ZTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5vZDtcclxuIiwiaW1wb3J0IFdpc2hsaXN0IGZyb20gJy4uL3dpc2hsaXN0JztcclxuaW1wb3J0IHsgaW5pdFJhZGlvT3B0aW9ucyB9IGZyb20gJy4vYXJpYSc7XHJcbmltcG9ydCB7IGlzT2JqZWN0LCBpc051bWJlciB9IGZyb20gJ2xvZGFzaCc7XHJcblxyXG5jb25zdCBvcHRpb25zVHlwZXNNYXAgPSB7XHJcbiAgICBJTlBVVF9GSUxFOiAnaW5wdXQtZmlsZScsXHJcbiAgICBJTlBVVF9URVhUOiAnaW5wdXQtdGV4dCcsXHJcbiAgICBJTlBVVF9OVU1CRVI6ICdpbnB1dC1udW1iZXInLFxyXG4gICAgSU5QVVRfQ0hFQ0tCT1g6ICdpbnB1dC1jaGVja2JveCcsXHJcbiAgICBURVhUQVJFQTogJ3RleHRhcmVhJyxcclxuICAgIERBVEU6ICdkYXRlJyxcclxuICAgIFNFVF9TRUxFQ1Q6ICdzZXQtc2VsZWN0JyxcclxuICAgIFNFVF9SRUNUQU5HTEU6ICdzZXQtcmVjdGFuZ2xlJyxcclxuICAgIFNFVF9SQURJTzogJ3NldC1yYWRpbycsXHJcbiAgICBTV0FUQ0g6ICdzd2F0Y2gnLFxyXG4gICAgUFJPRFVDVF9MSVNUOiAncHJvZHVjdC1saXN0JyxcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25DaGFuZ2VEZWNvcmF0b3IoYXJlRGVmYXVsdE90aW9uc1NldCkge1xyXG4gICAgcmV0dXJuIChlcnIsIHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYXR0cmlidXRlc0RhdGEgPSByZXNwb25zZS5kYXRhIHx8IHt9O1xyXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXNDb250ZW50ID0gcmVzcG9uc2UuY29udGVudCB8fCB7fTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVQcm9kdWN0QXR0cmlidXRlcyhhdHRyaWJ1dGVzRGF0YSk7XHJcbiAgICAgICAgaWYgKGFyZURlZmF1bHRPdGlvbnNTZXQpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVWaWV3KGF0dHJpYnV0ZXNEYXRhLCBhdHRyaWJ1dGVzQ29udGVudCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVEZWZhdWx0QXR0cmlidXRlc0Zvck9PUyhhdHRyaWJ1dGVzRGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvZHVjdERldGFpbHNCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKCRzY29wZSwgY29udGV4dCkge1xyXG4gICAgICAgIHRoaXMuJHNjb3BlID0gJHNjb3BlO1xyXG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgICAgICAgdGhpcy5pbml0UmFkaW9BdHRyaWJ1dGVzKCk7XHJcbiAgICAgICAgV2lzaGxpc3QubG9hZCh0aGlzLmNvbnRleHQpO1xyXG4gICAgICAgIHRoaXMuZ2V0VGFiUmVxdWVzdHMoKTtcclxuXHJcbiAgICAgICAgJCgnW2RhdGEtcHJvZHVjdC1hdHRyaWJ1dGVdJykuZWFjaCgoX18sIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB2YWx1ZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcHJvZHVjdC1hdHRyaWJ1dGUnKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21ha2VQcm9kdWN0VmFyaWFudEFjY2Vzc2libGUodmFsdWUsIHR5cGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9tYWtlUHJvZHVjdFZhcmlhbnRBY2Nlc3NpYmxlKHZhcmlhbnREb21Ob2RlLCB2YXJpYW50VHlwZSkge1xyXG4gICAgICAgIHN3aXRjaCAodmFyaWFudFR5cGUpIHtcclxuICAgICAgICBjYXNlIG9wdGlvbnNUeXBlc01hcC5TRVRfUkFESU86XHJcbiAgICAgICAgY2FzZSBvcHRpb25zVHlwZXNNYXAuU1dBVENIOiB7XHJcbiAgICAgICAgICAgIGluaXRSYWRpb09wdGlvbnMoJCh2YXJpYW50RG9tTm9kZSksICdbdHlwZT1yYWRpb10nKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkZWZhdWx0OiBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbGxvdyByYWRpbyBidXR0b25zIHRvIGdldCBkZXNlbGVjdGVkXHJcbiAgICAgKi9cclxuICAgIGluaXRSYWRpb0F0dHJpYnV0ZXMoKSB7XHJcbiAgICAgICAgJCgnW2RhdGEtcHJvZHVjdC1hdHRyaWJ1dGVdIGlucHV0W3R5cGU9XCJyYWRpb1wiXScsIHRoaXMuJHNjb3BlKS5lYWNoKChpLCByYWRpbykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCAkcmFkaW8gPSAkKHJhZGlvKTtcclxuXHJcbiAgICAgICAgICAgIC8vIE9ubHkgYmluZCB0byBjbGljayBvbmNlXHJcbiAgICAgICAgICAgIGlmICgkcmFkaW8uYXR0cignZGF0YS1zdGF0ZScpICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICRyYWRpby5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCRyYWRpby5kYXRhKCdzdGF0ZScpID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICRyYWRpby5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkcmFkaW8uZGF0YSgnc3RhdGUnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAkcmFkaW8udHJpZ2dlcignY2hhbmdlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJHJhZGlvLmRhdGEoJ3N0YXRlJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRSYWRpb0F0dHJpYnV0ZXMoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAkcmFkaW8uYXR0cignZGF0YS1zdGF0ZScsICRyYWRpby5wcm9wKCdjaGVja2VkJykpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGlkZSBvciBtYXJrIGFzIHVuYXZhaWxhYmxlIG91dCBvZiBzdG9jayBhdHRyaWJ1dGVzIGlmIGVuYWJsZWRcclxuICAgICAqIEBwYXJhbSAge09iamVjdH0gZGF0YSBQcm9kdWN0IGF0dHJpYnV0ZSBkYXRhXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVByb2R1Y3RBdHRyaWJ1dGVzKGRhdGEpIHtcclxuICAgICAgICBjb25zdCBiZWhhdmlvciA9IGRhdGEub3V0X29mX3N0b2NrX2JlaGF2aW9yO1xyXG4gICAgICAgIGNvbnN0IGluU3RvY2tJZHMgPSBkYXRhLmluX3N0b2NrX2F0dHJpYnV0ZXM7XHJcbiAgICAgICAgY29uc3Qgb3V0T2ZTdG9ja01lc3NhZ2UgPSBgICgke2RhdGEub3V0X29mX3N0b2NrX21lc3NhZ2V9KWA7XHJcblxyXG4gICAgICAgIGlmIChiZWhhdmlvciAhPT0gJ2hpZGVfb3B0aW9uJyAmJiBiZWhhdmlvciAhPT0gJ2xhYmVsX29wdGlvbicpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJCgnW2RhdGEtcHJvZHVjdC1hdHRyaWJ1dGUtdmFsdWVdJywgdGhpcy4kc2NvcGUpLmVhY2goKGksIGF0dHJpYnV0ZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCAkYXR0cmlidXRlID0gJChhdHRyaWJ1dGUpO1xyXG4gICAgICAgICAgICBjb25zdCBhdHRySWQgPSBwYXJzZUludCgkYXR0cmlidXRlLmRhdGEoJ3Byb2R1Y3RBdHRyaWJ1dGVWYWx1ZScpLCAxMCk7XHJcblxyXG5cclxuICAgICAgICAgICAgaWYgKGluU3RvY2tJZHMuaW5kZXhPZihhdHRySWQpICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGVBdHRyaWJ1dGUoJGF0dHJpYnV0ZSwgYmVoYXZpb3IsIG91dE9mU3RvY2tNZXNzYWdlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZUF0dHJpYnV0ZSgkYXR0cmlidXRlLCBiZWhhdmlvciwgb3V0T2ZTdG9ja01lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayBmb3IgZnJhZ21lbnQgaWRlbnRpZmllciBpbiBVUkwgcmVxdWVzdGluZyBhIHNwZWNpZmljIHRhYlxyXG4gICAgICovXHJcbiAgICBnZXRUYWJSZXF1ZXN0cygpIHtcclxuICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2ggJiYgd2luZG93LmxvY2F0aW9uLmhhc2guaW5kZXhPZignI3RhYi0nKSA9PT0gMCkge1xyXG4gICAgICAgICAgICBjb25zdCAkYWN0aXZlVGFiID0gJCgnLnRhYnMnKS5oYXMoYFtocmVmPScke3dpbmRvdy5sb2NhdGlvbi5oYXNofSddYCk7XHJcbiAgICAgICAgICAgIGNvbnN0ICR0YWJDb250ZW50ID0gJChgJHt3aW5kb3cubG9jYXRpb24uaGFzaH1gKTtcclxuXHJcbiAgICAgICAgICAgIGlmICgkYWN0aXZlVGFiLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICRhY3RpdmVUYWIuZmluZCgnLnRhYicpXHJcbiAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCdpcy1hY3RpdmUnKVxyXG4gICAgICAgICAgICAgICAgICAgIC5oYXMoYFtocmVmPScke3dpbmRvdy5sb2NhdGlvbi5oYXNofSddYClcclxuICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2lzLWFjdGl2ZScpO1xyXG5cclxuICAgICAgICAgICAgICAgICR0YWJDb250ZW50LmFkZENsYXNzKCdpcy1hY3RpdmUnKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zaWJsaW5ncygpXHJcbiAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCdpcy1hY3RpdmUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNpbmNlICRwcm9kdWN0VmlldyBjYW4gYmUgZHluYW1pY2FsbHkgaW5zZXJ0ZWQgdXNpbmcgcmVuZGVyX3dpdGgsXHJcbiAgICAgKiBXZSBoYXZlIHRvIHJldHJpZXZlIHRoZSByZXNwZWN0aXZlIGVsZW1lbnRzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtICRzY29wZVxyXG4gICAgICovXHJcbiAgICBnZXRWaWV3TW9kZWwoJHNjb3BlKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgJHByaWNlV2l0aFRheDogJCgnW2RhdGEtcHJvZHVjdC1wcmljZS13aXRoLXRheF0nLCAkc2NvcGUpLFxyXG4gICAgICAgICAgICAkcHJpY2VXaXRob3V0VGF4OiAkKCdbZGF0YS1wcm9kdWN0LXByaWNlLXdpdGhvdXQtdGF4XScsICRzY29wZSksXHJcbiAgICAgICAgICAgIHJycFdpdGhUYXg6IHtcclxuICAgICAgICAgICAgICAgICRkaXY6ICQoJy5ycnAtcHJpY2UtLXdpdGhUYXgnLCAkc2NvcGUpLFxyXG4gICAgICAgICAgICAgICAgJHNwYW46ICQoJ1tkYXRhLXByb2R1Y3QtcnJwLXdpdGgtdGF4XScsICRzY29wZSksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHJycFdpdGhvdXRUYXg6IHtcclxuICAgICAgICAgICAgICAgICRkaXY6ICQoJy5ycnAtcHJpY2UtLXdpdGhvdXRUYXgnLCAkc2NvcGUpLFxyXG4gICAgICAgICAgICAgICAgJHNwYW46ICQoJ1tkYXRhLXByb2R1Y3QtcnJwLXByaWNlLXdpdGhvdXQtdGF4XScsICRzY29wZSksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG5vblNhbGVXaXRoVGF4OiB7XHJcbiAgICAgICAgICAgICAgICAkZGl2OiAkKCcubm9uLXNhbGUtcHJpY2UtLXdpdGhUYXgnLCAkc2NvcGUpLFxyXG4gICAgICAgICAgICAgICAgJHNwYW46ICQoJ1tkYXRhLXByb2R1Y3Qtbm9uLXNhbGUtcHJpY2Utd2l0aC10YXhdJywgJHNjb3BlKSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbm9uU2FsZVdpdGhvdXRUYXg6IHtcclxuICAgICAgICAgICAgICAgICRkaXY6ICQoJy5ub24tc2FsZS1wcmljZS0td2l0aG91dFRheCcsICRzY29wZSksXHJcbiAgICAgICAgICAgICAgICAkc3BhbjogJCgnW2RhdGEtcHJvZHVjdC1ub24tc2FsZS1wcmljZS13aXRob3V0LXRheF0nLCAkc2NvcGUpLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwcmljZVNhdmVkOiB7XHJcbiAgICAgICAgICAgICAgICAkZGl2OiAkKCcucHJpY2Utc2VjdGlvbi0tc2F2aW5nJywgJHNjb3BlKSxcclxuICAgICAgICAgICAgICAgICRzcGFuOiAkKCdbZGF0YS1wcm9kdWN0LXByaWNlLXNhdmVkXScsICRzY29wZSksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHByaWNlTm93TGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICRzcGFuOiAkKCcucHJpY2Utbm93LWxhYmVsJywgJHNjb3BlKSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcHJpY2VMYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgJHNwYW46ICQoJy5wcmljZS1sYWJlbCcsICRzY29wZSksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICR3ZWlnaHQ6ICQoJy5wcm9kdWN0Vmlldy1pbmZvIFtkYXRhLXByb2R1Y3Qtd2VpZ2h0XScsICRzY29wZSksXHJcbiAgICAgICAgICAgICRpbmNyZW1lbnRzOiAkKCcuZm9ybS1maWVsZC0taW5jcmVtZW50cyA6aW5wdXQnLCAkc2NvcGUpLFxyXG4gICAgICAgICAgICAkYWRkVG9DYXJ0OiAkKCcjZm9ybS1hY3Rpb24tYWRkVG9DYXJ0JywgJHNjb3BlKSxcclxuICAgICAgICAgICAgJHdpc2hsaXN0VmFyaWF0aW9uOiAkKCdbZGF0YS13aXNobGlzdC1hZGRdIFtuYW1lPVwidmFyaWF0aW9uX2lkXCJdJywgJHNjb3BlKSxcclxuICAgICAgICAgICAgc3RvY2s6IHtcclxuICAgICAgICAgICAgICAgICRjb250YWluZXI6ICQoJy5mb3JtLWZpZWxkLS1zdG9jaycsICRzY29wZSksXHJcbiAgICAgICAgICAgICAgICAkaW5wdXQ6ICQoJ1tkYXRhLXByb2R1Y3Qtc3RvY2tdJywgJHNjb3BlKSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2t1OiB7XHJcbiAgICAgICAgICAgICAgICAkbGFiZWw6ICQoJ2R0LnNrdS1sYWJlbCcsICRzY29wZSksXHJcbiAgICAgICAgICAgICAgICAkdmFsdWU6ICQoJ1tkYXRhLXByb2R1Y3Qtc2t1XScsICRzY29wZSksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHVwYzoge1xyXG4gICAgICAgICAgICAgICAgJGxhYmVsOiAkKCdkdC51cGMtbGFiZWwnLCAkc2NvcGUpLFxyXG4gICAgICAgICAgICAgICAgJHZhbHVlOiAkKCdbZGF0YS1wcm9kdWN0LXVwY10nLCAkc2NvcGUpLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBxdWFudGl0eToge1xyXG4gICAgICAgICAgICAgICAgJHRleHQ6ICQoJy5pbmNyZW1lbnRUb3RhbCcsICRzY29wZSksXHJcbiAgICAgICAgICAgICAgICAkaW5wdXQ6ICQoJ1tuYW1lPXF0eVxcXFxbXFxcXF1dJywgJHNjb3BlKSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgJGJ1bGtQcmljaW5nOiAkKCcucHJvZHVjdFZpZXctaW5mby1idWxrUHJpY2luZycsICRzY29wZSksXHJcbiAgICAgICAgICAgICR3YWxsZXRCdXR0b25zOiAkKCdbZGF0YS1hZGQtdG8tY2FydC13YWxsZXQtYnV0dG9uc10nLCAkc2NvcGUpLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIaWRlIHRoZSBwcmljaW5nIGVsZW1lbnRzIHRoYXQgd2lsbCBzaG93IHVwIG9ubHkgd2hlbiB0aGUgcHJpY2UgZXhpc3RzIGluIEFQSVxyXG4gICAgICogQHBhcmFtIHZpZXdNb2RlbFxyXG4gICAgICovXHJcbiAgICBjbGVhclByaWNpbmdOb3RGb3VuZCh2aWV3TW9kZWwpIHtcclxuICAgICAgICB2aWV3TW9kZWwucnJwV2l0aFRheC4kZGl2LmhpZGUoKTtcclxuICAgICAgICB2aWV3TW9kZWwucnJwV2l0aG91dFRheC4kZGl2LmhpZGUoKTtcclxuICAgICAgICB2aWV3TW9kZWwubm9uU2FsZVdpdGhUYXguJGRpdi5oaWRlKCk7XHJcbiAgICAgICAgdmlld01vZGVsLm5vblNhbGVXaXRob3V0VGF4LiRkaXYuaGlkZSgpO1xyXG4gICAgICAgIHZpZXdNb2RlbC5wcmljZVNhdmVkLiRkaXYuaGlkZSgpO1xyXG4gICAgICAgIHZpZXdNb2RlbC5wcmljZU5vd0xhYmVsLiRzcGFuLmhpZGUoKTtcclxuICAgICAgICB2aWV3TW9kZWwucHJpY2VMYWJlbC4kc3Bhbi5oaWRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgdGhlIHZpZXcgb2YgcHJpY2UsIG1lc3NhZ2VzLCBTS1UgYW5kIHN0b2NrIG9wdGlvbnMgd2hlbiBhIHByb2R1Y3Qgb3B0aW9uIGNoYW5nZXNcclxuICAgICAqIEBwYXJhbSAge09iamVjdH0gZGF0YSBQcm9kdWN0IGF0dHJpYnV0ZSBkYXRhXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVZpZXcoZGF0YSwgY29udGVudCA9IG51bGwpIHtcclxuICAgICAgICBjb25zdCB2aWV3TW9kZWwgPSB0aGlzLmdldFZpZXdNb2RlbCh0aGlzLiRzY29wZSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2hvd01lc3NhZ2VCb3goZGF0YS5zdG9ja19tZXNzYWdlIHx8IGRhdGEucHVyY2hhc2luZ19tZXNzYWdlKTtcclxuXHJcbiAgICAgICAgaWYgKGlzT2JqZWN0KGRhdGEucHJpY2UpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUHJpY2VWaWV3KHZpZXdNb2RlbCwgZGF0YS5wcmljZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaXNPYmplY3QoZGF0YS53ZWlnaHQpKSB7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC4kd2VpZ2h0Lmh0bWwoZGF0YS53ZWlnaHQuZm9ybWF0dGVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNldCB2YXJpYXRpb25faWQgaWYgaXQgZXhpc3RzIGZvciBhZGRpbmcgdG8gd2lzaGxpc3RcclxuICAgICAgICBpZiAoZGF0YS52YXJpYW50SWQpIHtcclxuICAgICAgICAgICAgdmlld01vZGVsLiR3aXNobGlzdFZhcmlhdGlvbi52YWwoZGF0YS52YXJpYW50SWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgU0tVIGlzIGF2YWlsYWJsZVxyXG4gICAgICAgIGlmIChkYXRhLnNrdSkge1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwuc2t1LiR2YWx1ZS50ZXh0KGRhdGEuc2t1KTtcclxuICAgICAgICAgICAgdmlld01vZGVsLnNrdS4kbGFiZWwuc2hvdygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC5za3UuJGxhYmVsLmhpZGUoKTtcclxuICAgICAgICAgICAgdmlld01vZGVsLnNrdS4kdmFsdWUudGV4dCgnJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiBVUEMgaXMgYXZhaWxhYmxlXHJcbiAgICAgICAgaWYgKGRhdGEudXBjKSB7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC51cGMuJHZhbHVlLnRleHQoZGF0YS51cGMpO1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwudXBjLiRsYWJlbC5zaG93KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmlld01vZGVsLnVwYy4kbGFiZWwuaGlkZSgpO1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwudXBjLiR2YWx1ZS50ZXh0KCcnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGlmIHN0b2NrIHZpZXcgaXMgb24gKENQIHNldHRpbmdzKVxyXG4gICAgICAgIGlmICh2aWV3TW9kZWwuc3RvY2suJGNvbnRhaW5lci5sZW5ndGggJiYgaXNOdW1iZXIoZGF0YS5zdG9jaykpIHtcclxuICAgICAgICAgICAgLy8gaWYgdGhlIHN0b2NrIGNvbnRhaW5lciBpcyBoaWRkZW4sIHNob3dcclxuICAgICAgICAgICAgdmlld01vZGVsLnN0b2NrLiRjb250YWluZXIucmVtb3ZlQ2xhc3MoJ3UtaGlkZGVuVmlzdWFsbHknKTtcclxuXHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC5zdG9jay4kaW5wdXQudGV4dChkYXRhLnN0b2NrKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwuc3RvY2suJGNvbnRhaW5lci5hZGRDbGFzcygndS1oaWRkZW5WaXN1YWxseScpO1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwuc3RvY2suJGlucHV0LnRleHQoZGF0YS5zdG9jayk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZURlZmF1bHRBdHRyaWJ1dGVzRm9yT09TKGRhdGEpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlV2FsbGV0QnV0dG9uc1ZpZXcoZGF0YSk7XHJcblxyXG4gICAgICAgIC8vIElmIEJ1bGsgUHJpY2luZyByZW5kZXJlZCBIVE1MIGlzIGF2YWlsYWJsZVxyXG4gICAgICAgIGlmIChkYXRhLmJ1bGtfZGlzY291bnRfcmF0ZXMgJiYgY29udGVudCkge1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwuJGJ1bGtQcmljaW5nLmh0bWwoY29udGVudCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgKGRhdGEuYnVsa19kaXNjb3VudF9yYXRlcykgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC4kYnVsa1ByaWNpbmcuaHRtbCgnJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBhZGRUb0NhcnRXcmFwcGVyID0gJCgnI2FkZC10by1jYXJ0LXdyYXBwZXInKTtcclxuXHJcbiAgICAgICAgaWYgKGFkZFRvQ2FydFdyYXBwZXIuaXMoJzpoaWRkZW4nKSAmJiBkYXRhLnB1cmNoYXNhYmxlKSB7XHJcbiAgICAgICAgICAgIGFkZFRvQ2FydFdyYXBwZXIuc2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSB0aGUgdmlldyBvZiBwcmljZSwgbWVzc2FnZXMsIFNLVSBhbmQgc3RvY2sgb3B0aW9ucyB3aGVuIGEgcHJvZHVjdCBvcHRpb24gY2hhbmdlc1xyXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBkYXRhIFByb2R1Y3QgYXR0cmlidXRlIGRhdGFcclxuICAgICAqL1xyXG4gICAgdXBkYXRlUHJpY2VWaWV3KHZpZXdNb2RlbCwgcHJpY2UpIHtcclxuICAgICAgICB0aGlzLmNsZWFyUHJpY2luZ05vdEZvdW5kKHZpZXdNb2RlbCk7XHJcblxyXG4gICAgICAgIGlmIChwcmljZS53aXRoX3RheCkge1xyXG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkUHJpY2UgPSBwcmljZS5wcmljZV9yYW5nZSA/XHJcbiAgICAgICAgICAgICAgICBgJHtwcmljZS5wcmljZV9yYW5nZS5taW4ud2l0aF90YXguZm9ybWF0dGVkfSAtICR7cHJpY2UucHJpY2VfcmFuZ2UubWF4LndpdGhfdGF4LmZvcm1hdHRlZH1gXHJcbiAgICAgICAgICAgICAgICA6IHByaWNlLndpdGhfdGF4LmZvcm1hdHRlZDtcclxuICAgICAgICAgICAgdmlld01vZGVsLnByaWNlTGFiZWwuJHNwYW4uc2hvdygpO1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwuJHByaWNlV2l0aFRheC5odG1sKHVwZGF0ZWRQcmljZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJpY2Uud2l0aG91dF90YXgpIHtcclxuICAgICAgICAgICAgY29uc3QgdXBkYXRlZFByaWNlID0gcHJpY2UucHJpY2VfcmFuZ2UgP1xyXG4gICAgICAgICAgICAgICAgYCR7cHJpY2UucHJpY2VfcmFuZ2UubWluLndpdGhvdXRfdGF4LmZvcm1hdHRlZH0gLSAke3ByaWNlLnByaWNlX3JhbmdlLm1heC53aXRob3V0X3RheC5mb3JtYXR0ZWR9YFxyXG4gICAgICAgICAgICAgICAgOiBwcmljZS53aXRob3V0X3RheC5mb3JtYXR0ZWQ7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC5wcmljZUxhYmVsLiRzcGFuLnNob3coKTtcclxuICAgICAgICAgICAgdmlld01vZGVsLiRwcmljZVdpdGhvdXRUYXguaHRtbCh1cGRhdGVkUHJpY2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHByaWNlLnJycF93aXRoX3RheCkge1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwucnJwV2l0aFRheC4kZGl2LnNob3coKTtcclxuICAgICAgICAgICAgdmlld01vZGVsLnJycFdpdGhUYXguJHNwYW4uaHRtbChwcmljZS5ycnBfd2l0aF90YXguZm9ybWF0dGVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwcmljZS5ycnBfd2l0aG91dF90YXgpIHtcclxuICAgICAgICAgICAgdmlld01vZGVsLnJycFdpdGhvdXRUYXguJGRpdi5zaG93KCk7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC5ycnBXaXRob3V0VGF4LiRzcGFuLmh0bWwocHJpY2UucnJwX3dpdGhvdXRfdGF4LmZvcm1hdHRlZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJpY2Uuc2F2ZWQpIHtcclxuICAgICAgICAgICAgdmlld01vZGVsLnByaWNlU2F2ZWQuJGRpdi5zaG93KCk7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC5wcmljZVNhdmVkLiRzcGFuLmh0bWwocHJpY2Uuc2F2ZWQuZm9ybWF0dGVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwcmljZS5ub25fc2FsZV9wcmljZV93aXRoX3RheCkge1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwucHJpY2VMYWJlbC4kc3Bhbi5oaWRlKCk7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC5ub25TYWxlV2l0aFRheC4kZGl2LnNob3coKTtcclxuICAgICAgICAgICAgdmlld01vZGVsLnByaWNlTm93TGFiZWwuJHNwYW4uc2hvdygpO1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwubm9uU2FsZVdpdGhUYXguJHNwYW4uaHRtbChwcmljZS5ub25fc2FsZV9wcmljZV93aXRoX3RheC5mb3JtYXR0ZWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHByaWNlLm5vbl9zYWxlX3ByaWNlX3dpdGhvdXRfdGF4KSB7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC5wcmljZUxhYmVsLiRzcGFuLmhpZGUoKTtcclxuICAgICAgICAgICAgdmlld01vZGVsLm5vblNhbGVXaXRob3V0VGF4LiRkaXYuc2hvdygpO1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwucHJpY2VOb3dMYWJlbC4kc3Bhbi5zaG93KCk7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC5ub25TYWxlV2l0aG91dFRheC4kc3Bhbi5odG1sKHByaWNlLm5vbl9zYWxlX3ByaWNlX3dpdGhvdXRfdGF4LmZvcm1hdHRlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvdyBhbiBtZXNzYWdlIGJveCBpZiBhIG1lc3NhZ2UgaXMgcGFzc2VkXHJcbiAgICAgKiBIaWRlIHRoZSBib3ggaWYgdGhlIG1lc3NhZ2UgaXMgZW1wdHlcclxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gbWVzc2FnZVxyXG4gICAgICovXHJcbiAgICBzaG93TWVzc2FnZUJveChtZXNzYWdlKSB7XHJcbiAgICAgICAgY29uc3QgJG1lc3NhZ2VCb3ggPSAkKCcucHJvZHVjdEF0dHJpYnV0ZXMtbWVzc2FnZScpO1xyXG5cclxuICAgICAgICBpZiAobWVzc2FnZSkge1xyXG4gICAgICAgICAgICAkKCcuYWxlcnRCb3gtbWVzc2FnZScsICRtZXNzYWdlQm94KS50ZXh0KG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAkbWVzc2FnZUJveC5zaG93KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJG1lc3NhZ2VCb3guaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVEZWZhdWx0QXR0cmlidXRlc0Zvck9PUyhkYXRhKSB7XHJcbiAgICAgICAgY29uc3Qgdmlld01vZGVsID0gdGhpcy5nZXRWaWV3TW9kZWwodGhpcy4kc2NvcGUpO1xyXG4gICAgICAgIGlmICghZGF0YS5wdXJjaGFzYWJsZSB8fCAhZGF0YS5pbnN0b2NrKSB7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC4kYWRkVG9DYXJ0LnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC4kaW5jcmVtZW50cy5wcm9wKCdkaXNhYmxlZCcsIHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC4kYWRkVG9DYXJ0LnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpO1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwuJGluY3JlbWVudHMucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVdhbGxldEJ1dHRvbnNWaWV3KGRhdGEpIHtcclxuICAgICAgICB0aGlzLnRvZ2dsZVdhbGxldEJ1dHRvbnNWaXNpYmlsaXR5KGRhdGEucHVyY2hhc2FibGUgJiYgZGF0YS5pbnN0b2NrKTtcclxuICAgIH1cclxuXHJcbiAgICB0b2dnbGVXYWxsZXRCdXR0b25zVmlzaWJpbGl0eShzaG91bGRTaG93KSB7XHJcbiAgICAgICAgY29uc3Qgdmlld01vZGVsID0gdGhpcy5nZXRWaWV3TW9kZWwodGhpcy4kc2NvcGUpO1xyXG5cclxuICAgICAgICBpZiAoc2hvdWxkU2hvdykge1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwuJHdhbGxldEJ1dHRvbnMuc2hvdygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC4kd2FsbGV0QnV0dG9ucy5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZUF0dHJpYnV0ZSgkYXR0cmlidXRlLCBiZWhhdmlvciwgb3V0T2ZTdG9ja01lc3NhZ2UpIHtcclxuICAgICAgICBpZiAodGhpcy5nZXRBdHRyaWJ1dGVUeXBlKCRhdHRyaWJ1dGUpID09PSAnc2V0LXNlbGVjdCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5hYmxlU2VsZWN0T3B0aW9uQXR0cmlidXRlKCRhdHRyaWJ1dGUsIGJlaGF2aW9yLCBvdXRPZlN0b2NrTWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYmVoYXZpb3IgPT09ICdoaWRlX29wdGlvbicpIHtcclxuICAgICAgICAgICAgJGF0dHJpYnV0ZS5zaG93KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJGF0dHJpYnV0ZS5yZW1vdmVDbGFzcygndW5hdmFpbGFibGUnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZUF0dHJpYnV0ZSgkYXR0cmlidXRlLCBiZWhhdmlvciwgb3V0T2ZTdG9ja01lc3NhZ2UpIHtcclxuICAgICAgICBpZiAodGhpcy5nZXRBdHRyaWJ1dGVUeXBlKCRhdHRyaWJ1dGUpID09PSAnc2V0LXNlbGVjdCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZVNlbGVjdE9wdGlvbkF0dHJpYnV0ZSgkYXR0cmlidXRlLCBiZWhhdmlvciwgb3V0T2ZTdG9ja01lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGJlaGF2aW9yID09PSAnaGlkZV9vcHRpb24nKSB7XHJcbiAgICAgICAgICAgICRhdHRyaWJ1dGUuaGlkZSgwKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkYXR0cmlidXRlLmFkZENsYXNzKCd1bmF2YWlsYWJsZScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRBdHRyaWJ1dGVUeXBlKCRhdHRyaWJ1dGUpIHtcclxuICAgICAgICBjb25zdCAkcGFyZW50ID0gJGF0dHJpYnV0ZS5jbG9zZXN0KCdbZGF0YS1wcm9kdWN0LWF0dHJpYnV0ZV0nKTtcclxuXHJcbiAgICAgICAgcmV0dXJuICRwYXJlbnQgPyAkcGFyZW50LmRhdGEoJ3Byb2R1Y3RBdHRyaWJ1dGUnKSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZVNlbGVjdE9wdGlvbkF0dHJpYnV0ZSgkYXR0cmlidXRlLCBiZWhhdmlvciwgb3V0T2ZTdG9ja01lc3NhZ2UpIHtcclxuICAgICAgICBjb25zdCAkc2VsZWN0ID0gJGF0dHJpYnV0ZS5wYXJlbnQoKTtcclxuXHJcbiAgICAgICAgaWYgKGJlaGF2aW9yID09PSAnaGlkZV9vcHRpb24nKSB7XHJcbiAgICAgICAgICAgICRhdHRyaWJ1dGUudG9nZ2xlT3B0aW9uKGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBpcyB0aGUgc2VsZWN0ZWQgb3B0aW9uIGluIGEgc2VsZWN0IGRyb3Bkb3duLCBzZWxlY3QgdGhlIGZpcnN0IG9wdGlvbiAoTUVSQy02MzkpXHJcbiAgICAgICAgICAgIGlmICgkc2VsZWN0LnZhbCgpID09PSAkYXR0cmlidXRlLmF0dHIoJ3ZhbHVlJykpIHtcclxuICAgICAgICAgICAgICAgICRzZWxlY3RbMF0uc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkYXR0cmlidXRlLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XHJcbiAgICAgICAgICAgICRhdHRyaWJ1dGUuaHRtbCgkYXR0cmlidXRlLmh0bWwoKS5yZXBsYWNlKG91dE9mU3RvY2tNZXNzYWdlLCAnJykgKyBvdXRPZlN0b2NrTWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZVNlbGVjdE9wdGlvbkF0dHJpYnV0ZSgkYXR0cmlidXRlLCBiZWhhdmlvciwgb3V0T2ZTdG9ja01lc3NhZ2UpIHtcclxuICAgICAgICBpZiAoYmVoYXZpb3IgPT09ICdoaWRlX29wdGlvbicpIHtcclxuICAgICAgICAgICAgJGF0dHJpYnV0ZS50b2dnbGVPcHRpb24odHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJGF0dHJpYnV0ZS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgJGF0dHJpYnV0ZS5odG1sKCRhdHRyaWJ1dGUuaHRtbCgpLnJlcGxhY2Uob3V0T2ZTdG9ja01lc3NhZ2UsICcnKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB1dGlscyBmcm9tICdAYmlnY29tbWVyY2Uvc3RlbmNpbC11dGlscyc7XHJcbmltcG9ydCBQcm9kdWN0RGV0YWlsc0Jhc2UsIHsgb3B0aW9uQ2hhbmdlRGVjb3JhdG9yIH0gZnJvbSAnLi9wcm9kdWN0LWRldGFpbHMtYmFzZSc7XHJcbmltcG9ydCAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uL2ZvdW5kYXRpb24nO1xyXG5pbXBvcnQgJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi9mb3VuZGF0aW9uLnJldmVhbCc7XHJcbmltcG9ydCBJbWFnZUdhbGxlcnkgZnJvbSAnLi4vcHJvZHVjdC9pbWFnZS1nYWxsZXJ5JztcclxuaW1wb3J0IG1vZGFsRmFjdG9yeSwgeyBhbGVydE1vZGFsLCBzaG93QWxlcnRNb2RhbCB9IGZyb20gJy4uL2dsb2JhbC9tb2RhbCc7XHJcbmltcG9ydCB7IGlzRW1wdHksIGlzUGxhaW5PYmplY3QgfSBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgbm9kIGZyb20gJy4uL2NvbW1vbi9ub2QnO1xyXG5pbXBvcnQgeyBhbm5vdW5jZUlucHV0RXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzL2Zvcm0tdXRpbHMnO1xyXG5pbXBvcnQgZm9ybXMgZnJvbSAnLi4vY29tbW9uL21vZGVscy9mb3Jtcyc7XHJcbmltcG9ydCB7IG5vcm1hbGl6ZUZvcm1EYXRhIH0gZnJvbSAnLi91dGlscy9hcGknO1xyXG5pbXBvcnQgeyBpc0Jyb3dzZXJJRSwgY29udmVydEludG9BcnJheSB9IGZyb20gJy4vdXRpbHMvaWUtaGVscGVycyc7XHJcbmltcG9ydCBiYW5uZXJVdGlscyBmcm9tICcuL3V0aWxzL2Jhbm5lci11dGlscyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcm9kdWN0RGV0YWlscyBleHRlbmRzIFByb2R1Y3REZXRhaWxzQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigkc2NvcGUsIGNvbnRleHQsIHByb2R1Y3RBdHRyaWJ1dGVzRGF0YSA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIoJHNjb3BlLCBjb250ZXh0KTtcclxuXHJcbiAgICAgICAgdGhpcy4kb3ZlcmxheSA9ICQoJ1tkYXRhLWNhcnQtaXRlbS1hZGRdIC5sb2FkaW5nT3ZlcmxheScpO1xyXG4gICAgICAgIHRoaXMuaW1hZ2VHYWxsZXJ5ID0gbmV3IEltYWdlR2FsbGVyeSgkKCdbZGF0YS1pbWFnZS1nYWxsZXJ5XScsIHRoaXMuJHNjb3BlKSk7XHJcbiAgICAgICAgdGhpcy5pbWFnZUdhbGxlcnkuaW5pdCgpO1xyXG4gICAgICAgIHRoaXMubGlzdGVuUXVhbnRpdHlDaGFuZ2UoKTtcclxuICAgICAgICB0aGlzLiRzd2F0Y2hPcHRpb25NZXNzYWdlID0gJCgnLnN3YXRjaC1vcHRpb24tbWVzc2FnZScpO1xyXG4gICAgICAgIHRoaXMuc3dhdGNoSW5pdE1lc3NhZ2VTdG9yYWdlID0ge307XHJcbiAgICAgICAgdGhpcy5zd2F0Y2hHcm91cElkTGlzdCA9ICQoJ1tpZF49XCJzd2F0Y2hHcm91cFwiXScpLm1hcCgoXywgZ3JvdXApID0+ICQoZ3JvdXApLmF0dHIoJ2lkJykpO1xyXG4gICAgICAgIHRoaXMuc3RvcmVJbml0TWVzc2FnZXNGb3JTd2F0Y2hlcygpO1xyXG5cclxuICAgICAgICBjb25zdCAkZm9ybSA9ICQoJ2Zvcm1bZGF0YS1jYXJ0LWl0ZW0tYWRkXScsICRzY29wZSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkVG9DYXJ0VmFsaWRhdG9yID0gbm9kKHtcclxuICAgICAgICAgICAgc3VibWl0OiAkZm9ybS5maW5kKCdpbnB1dCNmb3JtLWFjdGlvbi1hZGRUb0NhcnQnKSxcclxuICAgICAgICAgICAgdGFwOiBhbm5vdW5jZUlucHV0RXJyb3JNZXNzYWdlLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCAkcHJvZHVjdE9wdGlvbnNFbGVtZW50ID0gJCgnW2RhdGEtcHJvZHVjdC1vcHRpb24tY2hhbmdlXScsICRmb3JtKTtcclxuICAgICAgICBjb25zdCBoYXNPcHRpb25zID0gJHByb2R1Y3RPcHRpb25zRWxlbWVudC5odG1sKCkudHJpbSgpLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBoYXNEZWZhdWx0T3B0aW9ucyA9ICRwcm9kdWN0T3B0aW9uc0VsZW1lbnQuZmluZCgnW2RhdGEtZGVmYXVsdF0nKS5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgJHByb2R1Y3RTd2F0Y2hHcm91cCA9ICQoJ1tpZCo9XCJhdHRyaWJ1dGVfc3dhdGNoXCJdJywgJGZvcm0pO1xyXG4gICAgICAgIGNvbnN0ICRwcm9kdWN0U3dhdGNoTGFiZWxzID0gJCgnLmZvcm0tb3B0aW9uLXN3YXRjaCcsICRmb3JtKTtcclxuICAgICAgICBjb25zdCBwbGFjZVN3YXRjaExhYmVsSW1hZ2UgPSAoXywgbGFiZWwpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgJG9wdGlvbkltYWdlID0gJCgnLmZvcm0tb3B0aW9uLWV4cGFuZGVkJywgJChsYWJlbCkpO1xyXG4gICAgICAgICAgICBjb25zdCBvcHRpb25JbWFnZVdpZHRoID0gJG9wdGlvbkltYWdlLm91dGVyV2lkdGgoKTtcclxuICAgICAgICAgICAgY29uc3QgZXh0ZW5kZWRPcHRpb25JbWFnZU9mZnNldExlZnQgPSA1NTtcclxuICAgICAgICAgICAgY29uc3QgeyByaWdodCB9ID0gbGFiZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGVtcHR5U3BhY2VUb1NjcmVlblJpZ2h0Qm9yZGVyID0gd2luZG93LnNjcmVlbi53aWR0aCAtIHJpZ2h0O1xyXG4gICAgICAgICAgICBjb25zdCBzaGlmdFZhbHVlID0gb3B0aW9uSW1hZ2VXaWR0aCAtIGVtcHR5U3BhY2VUb1NjcmVlblJpZ2h0Qm9yZGVyO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVtcHR5U3BhY2VUb1NjcmVlblJpZ2h0Qm9yZGVyIDwgKG9wdGlvbkltYWdlV2lkdGggKyBleHRlbmRlZE9wdGlvbkltYWdlT2Zmc2V0TGVmdCkpIHtcclxuICAgICAgICAgICAgICAgICRvcHRpb25JbWFnZS5jc3MoJ2xlZnQnLCBgJHtzaGlmdFZhbHVlID4gMCA/IC1zaGlmdFZhbHVlIDogc2hpZnRWYWx1ZX1weGApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgJCh3aW5kb3cpLm9uKCdsb2FkJywgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyQWRkVG9DYXJ0VmFsaWRhdGlvbigpO1xyXG4gICAgICAgICAgICAkLmVhY2goJHByb2R1Y3RTd2F0Y2hMYWJlbHMsIHBsYWNlU3dhdGNoTGFiZWxJbWFnZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChjb250ZXh0LnNob3dTd2F0Y2hOYW1lcykge1xyXG4gICAgICAgICAgICB0aGlzLiRzd2F0Y2hPcHRpb25NZXNzYWdlLnJlbW92ZUNsYXNzKCd1LWhpZGRlbicpO1xyXG5cclxuICAgICAgICAgICAgJHByb2R1Y3RTd2F0Y2hHcm91cC5vbignY2hhbmdlJywgKHsgdGFyZ2V0IH0pID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN3YXRjaEdyb3VwRWxlbWVudCA9IHRhcmdldC5wYXJlbnROb2RlLnBhcmVudE5vZGU7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93U3dhdGNoTmFtZU9uT3B0aW9uKCQodGFyZ2V0KSwgJChzd2F0Y2hHcm91cEVsZW1lbnQpKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAkLmVhY2goJHByb2R1Y3RTd2F0Y2hHcm91cCwgKF8sIGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN3YXRjaEdyb3VwRWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZS5wYXJlbnROb2RlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICgkKGVsZW1lbnQpLmlzKCc6Y2hlY2tlZCcpKSB0aGlzLnNob3dTd2F0Y2hOYW1lT25PcHRpb24oJChlbGVtZW50KSwgJChzd2F0Y2hHcm91cEVsZW1lbnQpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAkcHJvZHVjdE9wdGlvbnNFbGVtZW50Lm9uKCdjaGFuZ2UnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdE9wdGlvbnNDaGFuZ2VkKGV2ZW50KTtcclxuICAgICAgICAgICAgdGhpcy5zZXRQcm9kdWN0VmFyaWFudCgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkZm9ybS5vbignc3VibWl0JywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFRvQ2FydFZhbGlkYXRvci5wZXJmb3JtQ2hlY2soKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmFkZFRvQ2FydFZhbGlkYXRvci5hcmVBbGwoJ3ZhbGlkJykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkUHJvZHVjdFRvQ2FydChldmVudCwgJGZvcm1bMF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIFVwZGF0ZSBwcm9kdWN0IGF0dHJpYnV0ZXMuIEFsc28gdXBkYXRlIHRoZSBpbml0aWFsIHZpZXcgaW4gY2FzZSBpdGVtcyBhcmUgb29zXHJcbiAgICAgICAgLy8gb3IgaGF2ZSBkZWZhdWx0IHZhcmlhbnQgcHJvcGVydGllcyB0aGF0IGNoYW5nZSB0aGUgdmlld1xyXG4gICAgICAgIGlmICgoaXNFbXB0eShwcm9kdWN0QXR0cmlidXRlc0RhdGEpIHx8IGhhc0RlZmF1bHRPcHRpb25zKSAmJiBoYXNPcHRpb25zKSB7XHJcbiAgICAgICAgICAgIGNvbnN0ICRwcm9kdWN0SWQgPSAkKCdbbmFtZT1cInByb2R1Y3RfaWRcIl0nLCAkZm9ybSkudmFsKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbkNoYW5nZUNhbGxiYWNrID0gb3B0aW9uQ2hhbmdlRGVjb3JhdG9yLmNhbGwodGhpcywgaGFzRGVmYXVsdE9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgdXRpbHMuYXBpLnByb2R1Y3RBdHRyaWJ1dGVzLm9wdGlvbkNoYW5nZSgkcHJvZHVjdElkLCAkZm9ybS5zZXJpYWxpemUoKSwgJ3Byb2R1Y3RzL2J1bGstZGlzY291bnQtcmF0ZXMnLCBvcHRpb25DaGFuZ2VDYWxsYmFjayk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVQcm9kdWN0QXR0cmlidXRlcyhwcm9kdWN0QXR0cmlidXRlc0RhdGEpO1xyXG4gICAgICAgICAgICBiYW5uZXJVdGlscy5kaXNwYXRjaFByb2R1Y3RCYW5uZXJFdmVudChwcm9kdWN0QXR0cmlidXRlc0RhdGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJHByb2R1Y3RPcHRpb25zRWxlbWVudC5zaG93KCk7XHJcblxyXG4gICAgICAgIHRoaXMucHJldmlld01vZGFsID0gbW9kYWxGYWN0b3J5KCcjcHJldmlld01vZGFsJylbMF07XHJcbiAgICB9XHJcblxyXG4gICAgcmVnaXN0ZXJBZGRUb0NhcnRWYWxpZGF0aW9uKCkge1xyXG4gICAgICAgIHRoaXMuYWRkVG9DYXJ0VmFsaWRhdG9yLmFkZChbe1xyXG4gICAgICAgICAgICBzZWxlY3RvcjogJ1tkYXRhLXF1YW50aXR5LWNoYW5nZV0gPiAuZm9ybS1pbnB1dC0taW5jcmVtZW50VG90YWwnLFxyXG4gICAgICAgICAgICB2YWxpZGF0ZTogKGNiLCB2YWwpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZvcm1zLm51bWJlcnNPbmx5KHZhbCk7XHJcbiAgICAgICAgICAgICAgICBjYihyZXN1bHQpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHRoaXMuY29udGV4dC5wcm9kdWN0UXVhbnRpdHlFcnJvck1lc3NhZ2UsXHJcbiAgICAgICAgfV0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5hZGRUb0NhcnRWYWxpZGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgc3RvcmVJbml0TWVzc2FnZXNGb3JTd2F0Y2hlcygpIHtcclxuICAgICAgICBpZiAodGhpcy5zd2F0Y2hHcm91cElkTGlzdC5sZW5ndGggJiYgaXNFbXB0eSh0aGlzLnN3YXRjaEluaXRNZXNzYWdlU3RvcmFnZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5zd2F0Y2hHcm91cElkTGlzdC5lYWNoKChfLCBzd2F0Y2hHcm91cElkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc3dhdGNoSW5pdE1lc3NhZ2VTdG9yYWdlW3N3YXRjaEdyb3VwSWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zd2F0Y2hJbml0TWVzc2FnZVN0b3JhZ2Vbc3dhdGNoR3JvdXBJZF0gPSAkKGAjJHtzd2F0Y2hHcm91cElkfSB+IC5zd2F0Y2gtb3B0aW9uLW1lc3NhZ2VgKS50ZXh0KCkudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UHJvZHVjdFZhcmlhbnQoKSB7XHJcbiAgICAgICAgY29uc3QgdW5zYXRpc2ZpZWRSZXF1aXJlZEZpZWxkcyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBbXTtcclxuXHJcbiAgICAgICAgJC5lYWNoKCQoJ1tkYXRhLXByb2R1Y3QtYXR0cmlidXRlXScpLCAoaW5kZXgsIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbkxhYmVsID0gdmFsdWUuY2hpbGRyZW5bMF0uaW5uZXJUZXh0O1xyXG4gICAgICAgICAgICBjb25zdCBvcHRpb25UaXRsZSA9IG9wdGlvbkxhYmVsLnNwbGl0KCc6JylbMF0udHJpbSgpO1xyXG4gICAgICAgICAgICBjb25zdCByZXF1aXJlZCA9IG9wdGlvbkxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3JlcXVpcmVkJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB2YWx1ZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcHJvZHVjdC1hdHRyaWJ1dGUnKTtcclxuXHJcbiAgICAgICAgICAgIGlmICgodHlwZSA9PT0gJ2lucHV0LWZpbGUnIHx8IHR5cGUgPT09ICdpbnB1dC10ZXh0JyB8fCB0eXBlID09PSAnaW5wdXQtbnVtYmVyJykgJiYgdmFsdWUucXVlcnlTZWxlY3RvcignaW5wdXQnKS52YWx1ZSA9PT0gJycgJiYgcmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgICAgIHVuc2F0aXNmaWVkUmVxdWlyZWRGaWVsZHMucHVzaCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAndGV4dGFyZWEnICYmIHZhbHVlLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJykudmFsdWUgPT09ICcnICYmIHJlcXVpcmVkKSB7XHJcbiAgICAgICAgICAgICAgICB1bnNhdGlzZmllZFJlcXVpcmVkRmllbGRzLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2RhdGUnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc1NhdGlzZmllZCA9IEFycmF5LmZyb20odmFsdWUucXVlcnlTZWxlY3RvckFsbCgnc2VsZWN0JykpLmV2ZXJ5KChzZWxlY3QpID0+IHNlbGVjdC5zZWxlY3RlZEluZGV4ICE9PSAwKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXNTYXRpc2ZpZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gQXJyYXkuZnJvbSh2YWx1ZS5xdWVyeVNlbGVjdG9yQWxsKCdzZWxlY3QnKSkubWFwKCh4KSA9PiB4LnZhbHVlKS5qb2luKCctJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wdXNoKGAke29wdGlvblRpdGxlfToke2RhdGVTdHJpbmd9YCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB1bnNhdGlzZmllZFJlcXVpcmVkRmllbGRzLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3NldC1zZWxlY3QnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3QgPSB2YWx1ZS5xdWVyeVNlbGVjdG9yKCdzZWxlY3QnKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSW5kZXggPSBzZWxlY3Quc2VsZWN0ZWRJbmRleDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHVzaChgJHtvcHRpb25UaXRsZX06JHtzZWxlY3Qub3B0aW9uc1tzZWxlY3RlZEluZGV4XS5pbm5lclRleHR9YCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB1bnNhdGlzZmllZFJlcXVpcmVkRmllbGRzLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3NldC1yZWN0YW5nbGUnIHx8IHR5cGUgPT09ICdzZXQtcmFkaW8nIHx8IHR5cGUgPT09ICdzd2F0Y2gnIHx8IHR5cGUgPT09ICdpbnB1dC1jaGVja2JveCcgfHwgdHlwZSA9PT0gJ3Byb2R1Y3QtbGlzdCcpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrZWQgPSB2YWx1ZS5xdWVyeVNlbGVjdG9yKCc6Y2hlY2tlZCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBnZXRTZWxlY3RlZE9wdGlvbkxhYmVsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9kdWN0VmFyaWFudHNsaXN0ID0gY29udmVydEludG9BcnJheSh2YWx1ZS5jaGlsZHJlbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoTGFiZWxGb3JDaGVja2VkSW5wdXQgPSBpbnB0ID0+IGlucHQuZGF0YXNldC5wcm9kdWN0QXR0cmlidXRlVmFsdWUgPT09IGNoZWNrZWQudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9kdWN0VmFyaWFudHNsaXN0LmZpbHRlcihtYXRjaExhYmVsRm9yQ2hlY2tlZElucHV0KVswXTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnc2V0LXJlY3RhbmdsZScgfHwgdHlwZSA9PT0gJ3NldC1yYWRpbycgfHwgdHlwZSA9PT0gJ3Byb2R1Y3QtbGlzdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBpc0Jyb3dzZXJJRSA/IGdldFNlbGVjdGVkT3B0aW9uTGFiZWwoKS5pbm5lclRleHQudHJpbSgpIDogY2hlY2tlZC5sYWJlbHNbMF0uaW5uZXJUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHVzaChgJHtvcHRpb25UaXRsZX06JHtsYWJlbH1gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzd2F0Y2gnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gaXNCcm93c2VySUUgPyBnZXRTZWxlY3RlZE9wdGlvbkxhYmVsKCkuY2hpbGRyZW5bMF0gOiBjaGVja2VkLmxhYmVsc1swXS5jaGlsZHJlblswXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnB1c2goYCR7b3B0aW9uVGl0bGV9OiR7bGFiZWwudGl0bGV9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnaW5wdXQtY2hlY2tib3gnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHVzaChgJHtvcHRpb25UaXRsZX06WWVzYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdpbnB1dC1jaGVja2JveCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnB1c2goYCR7b3B0aW9uVGl0bGV9Ok5vYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdW5zYXRpc2ZpZWRSZXF1aXJlZEZpZWxkcy5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgcHJvZHVjdFZhcmlhbnQgPSB1bnNhdGlzZmllZFJlcXVpcmVkRmllbGRzLmxlbmd0aCA9PT0gMCA/IG9wdGlvbnMuc29ydCgpLmpvaW4oJywgJykgOiAndW5zYXRpc2ZpZWQnO1xyXG4gICAgICAgIGNvbnN0IHZpZXcgPSAkKCcucHJvZHVjdFZpZXcnKTtcclxuXHJcbiAgICAgICAgaWYgKHByb2R1Y3RWYXJpYW50KSB7XHJcbiAgICAgICAgICAgIHByb2R1Y3RWYXJpYW50ID0gcHJvZHVjdFZhcmlhbnQgPT09ICd1bnNhdGlzZmllZCcgPyAnJyA6IHByb2R1Y3RWYXJpYW50O1xyXG4gICAgICAgICAgICBpZiAodmlldy5hdHRyKCdkYXRhLWV2ZW50LXR5cGUnKSkge1xyXG4gICAgICAgICAgICAgICAgdmlldy5hdHRyKCdkYXRhLXByb2R1Y3QtdmFyaWFudCcsIHByb2R1Y3RWYXJpYW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2R1Y3ROYW1lID0gdmlldy5maW5kKCcucHJvZHVjdFZpZXctdGl0bGUnKVswXS5pbm5lclRleHQucmVwbGFjZSgvXCIvZywgJ1xcXFwkJicpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2FyZCA9ICQoYFtkYXRhLW5hbWU9XCIke3Byb2R1Y3ROYW1lfVwiXWApO1xyXG4gICAgICAgICAgICAgICAgY2FyZC5hdHRyKCdkYXRhLXByb2R1Y3QtdmFyaWFudCcsIHByb2R1Y3RWYXJpYW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiB0aGUgY3VycmVudCB3aW5kb3cgaXMgYmVpbmcgcnVuIGluc2lkZSBhbiBpZnJhbWVcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBpc1J1bm5pbmdJbklmcmFtZSgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gd2luZG93LnNlbGYgIT09IHdpbmRvdy50b3A7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogSGFuZGxlIHByb2R1Y3Qgb3B0aW9ucyBjaGFuZ2VzXHJcbiAgICAgKlxyXG4gICAgICovXHJcbiAgICBwcm9kdWN0T3B0aW9uc0NoYW5nZWQoZXZlbnQpIHtcclxuICAgICAgICBjb25zdCAkY2hhbmdlZE9wdGlvbiA9ICQoZXZlbnQudGFyZ2V0KTtcclxuICAgICAgICBjb25zdCAkZm9ybSA9ICRjaGFuZ2VkT3B0aW9uLnBhcmVudHMoJ2Zvcm0nKTtcclxuICAgICAgICBjb25zdCBwcm9kdWN0SWQgPSAkKCdbbmFtZT1cInByb2R1Y3RfaWRcIl0nLCAkZm9ybSkudmFsKCk7XHJcblxyXG4gICAgICAgIC8vIERvIG5vdCB0cmlnZ2VyIGFuIGFqYXggcmVxdWVzdCBpZiBpdCdzIGEgZmlsZSBvciBpZiB0aGUgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgRm9ybURhdGFcclxuICAgICAgICBpZiAoJGNoYW5nZWRPcHRpb24uYXR0cigndHlwZScpID09PSAnZmlsZScgfHwgd2luZG93LkZvcm1EYXRhID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdXRpbHMuYXBpLnByb2R1Y3RBdHRyaWJ1dGVzLm9wdGlvbkNoYW5nZShwcm9kdWN0SWQsICRmb3JtLnNlcmlhbGl6ZSgpLCAncHJvZHVjdHMvYnVsay1kaXNjb3VudC1yYXRlcycsIChlcnIsIHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByb2R1Y3RBdHRyaWJ1dGVzRGF0YSA9IHJlc3BvbnNlLmRhdGEgfHwge307XHJcbiAgICAgICAgICAgIGNvbnN0IHByb2R1Y3RBdHRyaWJ1dGVzQ29udGVudCA9IHJlc3BvbnNlLmNvbnRlbnQgfHwge307XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUHJvZHVjdEF0dHJpYnV0ZXMocHJvZHVjdEF0dHJpYnV0ZXNEYXRhKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVWaWV3KHByb2R1Y3RBdHRyaWJ1dGVzRGF0YSwgcHJvZHVjdEF0dHJpYnV0ZXNDb250ZW50KTtcclxuICAgICAgICAgICAgYmFubmVyVXRpbHMuZGlzcGF0Y2hQcm9kdWN0QmFubmVyRXZlbnQocHJvZHVjdEF0dHJpYnV0ZXNEYXRhKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jaGVja0lzUXVpY2tWaWV3Q2hpbGQoJGZvcm0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCAkY29udGV4dCA9ICRmb3JtLnBhcmVudHMoJy5wcm9kdWN0VmlldycpLmZpbmQoJy5wcm9kdWN0Vmlldy1pbmZvJyk7XHJcbiAgICAgICAgICAgICAgICBtb2RhbEZhY3RvcnkoJ1tkYXRhLXJldmVhbF0nLCB7ICRjb250ZXh0IH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBpZiB0aGlzIHNldHRpbmcgaXMgZW5hYmxlZCBpbiBQYWdlIEJ1aWxkZXJcclxuICAgICAqIHNob3cgbmFtZSBmb3Igc3dhdGNoIG9wdGlvblxyXG4gICAgICovXHJcbiAgICBzaG93U3dhdGNoTmFtZU9uT3B0aW9uKCRzd2F0Y2gsICRzd2F0Y2hHcm91cCkge1xyXG4gICAgICAgIGNvbnN0IHN3YXRjaE5hbWUgPSAkc3dhdGNoLmF0dHIoJ2FyaWEtbGFiZWwnKTtcclxuICAgICAgICBjb25zdCBhY3RpdmVTd2F0Y2hHcm91cElkID0gJHN3YXRjaEdyb3VwLmF0dHIoJ2FyaWEtbGFiZWxsZWRieScpO1xyXG4gICAgICAgIGNvbnN0ICRzd2F0Y2hPcHRpb25NZXNzYWdlID0gJChgIyR7YWN0aXZlU3dhdGNoR3JvdXBJZH0gfiAuc3dhdGNoLW9wdGlvbi1tZXNzYWdlYCk7XHJcblxyXG4gICAgICAgICQoJ1tkYXRhLW9wdGlvbi12YWx1ZV0nLCAkc3dhdGNoR3JvdXApLnRleHQoc3dhdGNoTmFtZSk7XHJcbiAgICAgICAgJHN3YXRjaE9wdGlvbk1lc3NhZ2UudGV4dChgJHt0aGlzLnN3YXRjaEluaXRNZXNzYWdlU3RvcmFnZVthY3RpdmVTd2F0Y2hHcm91cElkXX0gJHtzd2F0Y2hOYW1lfWApO1xyXG4gICAgICAgIHRoaXMuc2V0TGl2ZVJlZ2lvbkF0dHJpYnV0ZXMoJHN3YXRjaE9wdGlvbk1lc3NhZ2UsICdzdGF0dXMnLCAnYXNzZXJ0aXZlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0TGl2ZVJlZ2lvbkF0dHJpYnV0ZXMoJGVsZW1lbnQsIHJvbGVUeXBlLCBhcmlhTGl2ZVN0YXR1cykge1xyXG4gICAgICAgICRlbGVtZW50LmF0dHIoe1xyXG4gICAgICAgICAgICByb2xlOiByb2xlVHlwZSxcclxuICAgICAgICAgICAgJ2FyaWEtbGl2ZSc6IGFyaWFMaXZlU3RhdHVzLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSXNRdWlja1ZpZXdDaGlsZCgkZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiAhISRlbGVtZW50LnBhcmVudHMoJy5xdWlja1ZpZXcnKS5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd1Byb2R1Y3RJbWFnZShpbWFnZSkge1xyXG4gICAgICAgIGlmIChpc1BsYWluT2JqZWN0KGltYWdlKSkge1xyXG4gICAgICAgICAgICBjb25zdCB6b29tSW1hZ2VVcmwgPSB1dGlscy50b29scy5pbWFnZVNyY3NldC5nZXRTcmNzZXQoXHJcbiAgICAgICAgICAgICAgICBpbWFnZS5kYXRhLFxyXG4gICAgICAgICAgICAgICAgeyAnMXgnOiB0aGlzLmNvbnRleHQuem9vbVNpemUgfSxcclxuICAgICAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgICAgICAgU2hvdWxkIG1hdGNoIHpvb20gc2l6ZSB1c2VkIGZvciBkYXRhLXpvb20taW1hZ2UgaW5cclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzL3Byb2R1Y3RzL3Byb2R1Y3Qtdmlldy5odG1sXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIHdpbGwgb25seSBiZSB1c2VkIGFzIGEgZmFsbGJhY2sgaW1hZ2UgZm9yIGJyb3dzZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgc3Jjc2V0XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIEFsc28gbm90ZSB0aGF0IGdldFNyY3NldCByZXR1cm5zIGEgc2ltcGxlIHNyYyBzdHJpbmcgd2hlbiBleGFjdGx5IG9uZSBzaXplIGlzIHByb3ZpZGVkXHJcbiAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgbWFpbkltYWdlVXJsID0gdXRpbHMudG9vbHMuaW1hZ2VTcmNzZXQuZ2V0U3Jjc2V0KFxyXG4gICAgICAgICAgICAgICAgaW1hZ2UuZGF0YSxcclxuICAgICAgICAgICAgICAgIHsgJzF4JzogdGhpcy5jb250ZXh0LnByb2R1Y3RTaXplIH0sXHJcbiAgICAgICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgICAgICAgIFNob3VsZCBtYXRjaCBmYWxsYmFjayBpbWFnZSBzaXplIHVzZWQgZm9yIHRoZSBtYWluIHByb2R1Y3QgaW1hZ2UgaW5cclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzL3Byb2R1Y3RzL3Byb2R1Y3Qtdmlldy5odG1sXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIHdpbGwgb25seSBiZSB1c2VkIGFzIGEgZmFsbGJhY2sgaW1hZ2UgZm9yIGJyb3dzZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgc3Jjc2V0XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIEFsc28gbm90ZSB0aGF0IGdldFNyY3NldCByZXR1cm5zIGEgc2ltcGxlIHNyYyBzdHJpbmcgd2hlbiBleGFjdGx5IG9uZSBzaXplIGlzIHByb3ZpZGVkXHJcbiAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgbWFpbkltYWdlU3Jjc2V0ID0gdXRpbHMudG9vbHMuaW1hZ2VTcmNzZXQuZ2V0U3Jjc2V0KGltYWdlLmRhdGEpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5pbWFnZUdhbGxlcnkuc2V0QWx0ZXJuYXRlSW1hZ2Uoe1xyXG4gICAgICAgICAgICAgICAgbWFpbkltYWdlVXJsLFxyXG4gICAgICAgICAgICAgICAgem9vbUltYWdlVXJsLFxyXG4gICAgICAgICAgICAgICAgbWFpbkltYWdlU3Jjc2V0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmltYWdlR2FsbGVyeS5yZXN0b3JlSW1hZ2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogSGFuZGxlIGFjdGlvbiB3aGVuIHRoZSBzaG9wcGVyIGNsaWNrcyBvbiArIC8gLSBmb3IgcXVhbnRpdHlcclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIGxpc3RlblF1YW50aXR5Q2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMuJHNjb3BlLm9uKCdjbGljaycsICdbZGF0YS1xdWFudGl0eS1jaGFuZ2VdIGJ1dHRvbicsIGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgY29uc3QgJHRhcmdldCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHZpZXdNb2RlbCA9IHRoaXMuZ2V0Vmlld01vZGVsKHRoaXMuJHNjb3BlKTtcclxuICAgICAgICAgICAgY29uc3QgJGlucHV0ID0gdmlld01vZGVsLnF1YW50aXR5LiRpbnB1dDtcclxuICAgICAgICAgICAgY29uc3QgcXVhbnRpdHlNaW4gPSBwYXJzZUludCgkaW5wdXQuZGF0YSgncXVhbnRpdHlNaW4nKSwgMTApO1xyXG4gICAgICAgICAgICBjb25zdCBxdWFudGl0eU1heCA9IHBhcnNlSW50KCRpbnB1dC5kYXRhKCdxdWFudGl0eU1heCcpLCAxMCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgcXR5ID0gZm9ybXMubnVtYmVyc09ubHkoJGlucHV0LnZhbCgpKSA/IHBhcnNlSW50KCRpbnB1dC52YWwoKSwgMTApIDogcXVhbnRpdHlNaW47XHJcbiAgICAgICAgICAgIC8vIElmIGFjdGlvbiBpcyBpbmNyZW1lbnRpbmdcclxuICAgICAgICAgICAgaWYgKCR0YXJnZXQuZGF0YSgnYWN0aW9uJykgPT09ICdpbmMnKSB7XHJcbiAgICAgICAgICAgICAgICBxdHkgPSBmb3Jtcy52YWxpZGF0ZUluY3JlYXNlQWdhaW5zdE1heEJvdW5kYXJ5KHF0eSwgcXVhbnRpdHlNYXgpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHF0eSA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHF0eSA9IGZvcm1zLnZhbGlkYXRlRGVjcmVhc2VBZ2FpbnN0TWluQm91bmRhcnkocXR5LCBxdWFudGl0eU1pbik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBoaWRkZW4gaW5wdXRcclxuICAgICAgICAgICAgdmlld01vZGVsLnF1YW50aXR5LiRpbnB1dC52YWwocXR5KTtcclxuICAgICAgICAgICAgLy8gdXBkYXRlIHRleHRcclxuICAgICAgICAgICAgdmlld01vZGVsLnF1YW50aXR5LiR0ZXh0LnRleHQocXR5KTtcclxuICAgICAgICAgICAgLy8gcGVyZm9ybSB2YWxpZGF0aW9uIGFmdGVyIHVwZGF0aW5nIHByb2R1Y3QgcXVhbnRpdHlcclxuICAgICAgICAgICAgdGhpcy5hZGRUb0NhcnRWYWxpZGF0b3IucGVyZm9ybUNoZWNrKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIFByZXZlbnQgdHJpZ2dlcmluZyBxdWFudGl0eSBjaGFuZ2Ugd2hlbiBwcmVzc2luZyBlbnRlclxyXG4gICAgICAgIHRoaXMuJHNjb3BlLm9uKCdrZXlwcmVzcycsICcuZm9ybS1pbnB1dC0taW5jcmVtZW50VG90YWwnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBicm93c2VyIHN1cHBvcnRzIGV2ZW50LndoaWNoLCB0aGVuIHVzZSBldmVudC53aGljaCwgb3RoZXJ3aXNlIHVzZSBldmVudC5rZXlDb2RlXHJcbiAgICAgICAgICAgIGNvbnN0IHggPSBldmVudC53aGljaCB8fCBldmVudC5rZXlDb2RlO1xyXG4gICAgICAgICAgICBpZiAoeCA9PT0gMTMpIHtcclxuICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgZGVmYXVsdFxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEFkZCBhIHByb2R1Y3QgdG8gY2FydFxyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgYWRkUHJvZHVjdFRvQ2FydChldmVudCwgZm9ybSkge1xyXG4gICAgICAgIGNvbnN0ICRhZGRUb0NhcnRCdG4gPSAkKCcjZm9ybS1hY3Rpb24tYWRkVG9DYXJ0JywgJChldmVudC50YXJnZXQpKTtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbEJ0blZhbCA9ICRhZGRUb0NhcnRCdG4udmFsKCk7XHJcbiAgICAgICAgY29uc3Qgd2FpdE1lc3NhZ2UgPSAkYWRkVG9DYXJ0QnRuLmRhdGEoJ3dhaXRNZXNzYWdlJyk7XHJcblxyXG4gICAgICAgIC8vIERvIG5vdCBkbyBBSkFYIGlmIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IEZvcm1EYXRhXHJcbiAgICAgICAgaWYgKHdpbmRvdy5Gb3JtRGF0YSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFByZXZlbnQgZGVmYXVsdFxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICRhZGRUb0NhcnRCdG5cclxuICAgICAgICAgICAgLnZhbCh3YWl0TWVzc2FnZSlcclxuICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuJG92ZXJsYXkuc2hvdygpO1xyXG5cclxuICAgICAgICAvLyBBZGQgaXRlbSB0byBjYXJ0XHJcbiAgICAgICAgdXRpbHMuYXBpLmNhcnQuaXRlbUFkZChub3JtYWxpemVGb3JtRGF0YShuZXcgRm9ybURhdGEoZm9ybSkpLCAoZXJyLCByZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnIgfHwgcmVzcG9uc2UuZGF0YS5lcnJvcjtcclxuXHJcbiAgICAgICAgICAgICRhZGRUb0NhcnRCdG5cclxuICAgICAgICAgICAgICAgIC52YWwob3JpZ2luYWxCdG5WYWwpXHJcbiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLiRvdmVybGF5LmhpZGUoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIEd1YXJkIHN0YXRlbWVudFxyXG4gICAgICAgICAgICBpZiAoZXJyb3JNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBTdHJpcCB0aGUgSFRNTCBmcm9tIHRoZSBlcnJvciBtZXNzYWdlXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0bXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcclxuICAgICAgICAgICAgICAgIHRtcC5pbm5lckhUTUwgPSBlcnJvck1lc3NhZ2U7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNoZWNrSXNRdWlja1ZpZXdDaGlsZCgkYWRkVG9DYXJ0QnRuKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0TW9kYWwoKS4kcHJlTW9kYWxGb2N1c2VkRWwgPSAkYWRkVG9DYXJ0QnRuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBzaG93QWxlcnRNb2RhbCh0bXAudGV4dENvbnRlbnQgfHwgdG1wLmlubmVyVGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIE9wZW4gcHJldmlldyBtb2RhbCBhbmQgdXBkYXRlIGNvbnRlbnRcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cudGhlbWVfc2V0dGluZ3MgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy50aGVtZV9zZXR0aW5ncy5zaG93X2Zhc3RfY2FydCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldmlld01vZGFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3TW9kYWwub3BlbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuQXBwbGVQYXlTZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJldmlld01vZGFsLiRtb2RhbC5hZGRDbGFzcygnYXBwbGUtcGF5LXN1cHBvcnRlZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCRhZGRUb0NhcnRCdG4ucGFyZW50cygnLnF1aWNrVmlldycpLmxlbmd0aCA9PT0gMCkgdGhpcy5wcmV2aWV3TW9kYWwuJHByZU1vZGFsRm9jdXNlZEVsID0gJGFkZFRvQ2FydEJ0bjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcnRDb250ZW50KHRoaXMucHJldmlld01vZGFsLCByZXNwb25zZS5kYXRhLmNhcnRfaXRlbS5pZCwgKCkgPT4gdGhpcy5wcmV2aWV3TW9kYWwuc2V0dXBGb2N1c1RyYXAoKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJG92ZXJsYXkuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIG1vZGFsLCByZWRpcmVjdCB0byB0aGUgY2FydCBwYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdFRvKHJlc3BvbnNlLmRhdGEuY2FydF9pdGVtLmNhcnRfdXJsIHx8IHRoaXMuY29udGV4dC51cmxzLmNhcnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jaGVja0lzUXVpY2tWaWV3Q2hpbGQoJGFkZFRvQ2FydEJ0bikpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByZXZpZXdNb2RhbC4kcHJlTW9kYWxGb2N1c2VkRWwgPSAkYWRkVG9DYXJ0QnRuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FydENvbnRlbnQodGhpcy5wcmV2aWV3TW9kYWwsIHJlc3BvbnNlLmRhdGEuY2FydF9pdGVtLmlkKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RUbyhyZXNwb25zZS5kYXRhLmNhcnRfaXRlbS5jYXJ0X3VybCB8fCB0aGlzLmNvbnRleHQudXJscy5jYXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnNldExpdmVSZWdpb25BdHRyaWJ1dGVzKCRhZGRUb0NhcnRCdG4ubmV4dCgpLCAnc3RhdHVzJywgJ3BvbGl0ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGNhcnQgY29udGVudHNcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY2FydEl0ZW1JZFxyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25Db21wbGV0ZVxyXG4gICAgICovXHJcbiAgICBnZXRDYXJ0Q29udGVudChjYXJ0SXRlbUlkLCBvbkNvbXBsZXRlKSB7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICdjYXJ0L3ByZXZpZXcnLFxyXG4gICAgICAgICAgICBwYXJhbXM6IHtcclxuICAgICAgICAgICAgICAgIHN1Z2dlc3Q6IGNhcnRJdGVtSWQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNvbmZpZzoge1xyXG4gICAgICAgICAgICAgICAgY2FydDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0OiA0LFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHV0aWxzLmFwaS5jYXJ0LmdldENvbnRlbnQob3B0aW9ucywgb25Db21wbGV0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWRpcmVjdCB0byB1cmxcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsXHJcbiAgICAgKi9cclxuICAgIHJlZGlyZWN0VG8odXJsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNSdW5uaW5nSW5JZnJhbWUoKSAmJiAhd2luZG93LmlmcmFtZVNkaykge1xyXG4gICAgICAgICAgICB3aW5kb3cudG9wLmxvY2F0aW9uID0gdXJsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHVybDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgY2FydCBjb250ZW50XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtNb2RhbH0gbW9kYWxcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjYXJ0SXRlbUlkXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkNvbXBsZXRlXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZUNhcnRDb250ZW50KG1vZGFsLCBjYXJ0SXRlbUlkLCBvbkNvbXBsZXRlKSB7XHJcbiAgICAgICAgdGhpcy5nZXRDYXJ0Q29udGVudChjYXJ0SXRlbUlkLCAoZXJyLCByZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG1vZGFsLnVwZGF0ZUNvbnRlbnQocmVzcG9uc2UpO1xyXG5cclxuICAgICAgICAgICAgLy8gVXBkYXRlIGNhcnQgY291bnRlclxyXG4gICAgICAgICAgICBjb25zdCAkYm9keSA9ICQoJ2JvZHknKTtcclxuICAgICAgICAgICAgY29uc3QgJGNhcnRRdWFudGl0eSA9ICQoJ1tkYXRhLWNhcnQtcXVhbnRpdHldJywgbW9kYWwuJGNvbnRlbnQpO1xyXG4gICAgICAgICAgICBjb25zdCAkY2FydENvdW50ZXIgPSAkKCcubmF2VXNlci1hY3Rpb24gLmNhcnQtY291bnQnKTtcclxuICAgICAgICAgICAgY29uc3QgcXVhbnRpdHkgPSAkY2FydFF1YW50aXR5LmRhdGEoJ2NhcnRRdWFudGl0eScpIHx8IDA7XHJcbiAgICAgICAgICAgIGNvbnN0ICRwcm9tb3Rpb25CYW5uZXIgPSAkKCdbZGF0YS1wcm9tb3Rpb24tYmFubmVyXScpO1xyXG4gICAgICAgICAgICBjb25zdCAkYmFja1RvU2hvcHBwaW5nQnRuID0gJCgnLnByZXZpZXdDYXJ0Q2hlY2tvdXQgPiBbZGF0YS1yZXZlYWwtY2xvc2VdJyk7XHJcbiAgICAgICAgICAgIGNvbnN0ICRtb2RhbENsb3NlQnRuID0gJCgnI3ByZXZpZXdNb2RhbCA+IC5tb2RhbC1jbG9zZScpO1xyXG4gICAgICAgICAgICBjb25zdCBiYW5uZXJVcGRhdGVIYW5kbGVyID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgJHByb2R1Y3RDb250YWluZXIgPSAkKCcjbWFpbi1jb250ZW50ID4gLmNvbnRhaW5lcicpO1xyXG5cclxuICAgICAgICAgICAgICAgICRwcm9kdWN0Q29udGFpbmVyLmFwcGVuZCgnPGRpdiBjbGFzcz1cImxvYWRpbmdPdmVybGF5IHBkcC11cGRhdGVcIj48L2Rpdj4nKTtcclxuICAgICAgICAgICAgICAgICQoJy5sb2FkaW5nT3ZlcmxheS5wZHAtdXBkYXRlJywgJHByb2R1Y3RDb250YWluZXIpLnNob3coKTtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICRjYXJ0Q291bnRlci5hZGRDbGFzcygnY2FydC1jb3VudC0tcG9zaXRpdmUnKTtcclxuICAgICAgICAgICAgJGJvZHkudHJpZ2dlcignY2FydC1xdWFudGl0eS11cGRhdGUnLCBxdWFudGl0eSk7XHJcblxyXG4gICAgICAgICAgICBpZiAob25Db21wbGV0ZSkge1xyXG4gICAgICAgICAgICAgICAgb25Db21wbGV0ZShyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICgkcHJvbW90aW9uQmFubmVyLmxlbmd0aCAmJiAkYmFja1RvU2hvcHBwaW5nQnRuLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgJGJhY2tUb1Nob3BwcGluZ0J0bi5vbignY2xpY2snLCBiYW5uZXJVcGRhdGVIYW5kbGVyKTtcclxuICAgICAgICAgICAgICAgICRtb2RhbENsb3NlQnRuLm9uKCdjbGljaycsIGJhbm5lclVwZGF0ZUhhbmRsZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIaWRlIG9yIG1hcmsgYXMgdW5hdmFpbGFibGUgb3V0IG9mIHN0b2NrIGF0dHJpYnV0ZXMgaWYgZW5hYmxlZFxyXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBkYXRhIFByb2R1Y3QgYXR0cmlidXRlIGRhdGFcclxuICAgICAqL1xyXG4gICAgdXBkYXRlUHJvZHVjdEF0dHJpYnV0ZXMoZGF0YSkge1xyXG4gICAgICAgIHN1cGVyLnVwZGF0ZVByb2R1Y3RBdHRyaWJ1dGVzKGRhdGEpO1xyXG4gICAgICAgIHRoaXMuc2hvd1Byb2R1Y3RJbWFnZShkYXRhLmltYWdlKTtcclxuICAgIH1cclxufVxyXG4iLCIvKipcclxuICogVmlzdWFsbHkgaGlkZXMgdGhlIG9wdGlvbiBmcm9tIHVzZXIgYnkgbW92aW5nIG9wdGlvbiB0byBhbiBpbnZpc2libGVcclxuICogYW5kIGRpc2FibGVkIHNlbGVjdCBwbGFjZWhvbGRlciBlbGVtZW50LlxyXG4gKlxyXG4gKiBUaGlzIGFwcHJvYWNoIGlzIHJlcXVpcmVkIHJhdGhlciB0aGFuIHNpbXBseSBoaWRpbmcgdGhlIG9wdGlvbiBiZWNhdXNlXHJcbiAqIGhpZGRlbiBvcHRpb24gY2FuIHN0aWxsIGJlIGluY2x1ZGVkIHdoZW4gc2VyaWFsaXplQXJyYXkoKSBpcyBjYWxsZWQgYW5kXHJcbiAqIGNhdXNlIHdyb25nIHZhbHVlIHRvIGJlIHN1Ym1pdHRlZC5cclxuICogKGVnLiBpZiB5b3UgaGF2ZSBvcHRpb24gMSwgMiwgMyBhbmQgMiBpcyBoaWRkZW4sIHdoZW4geW91IHNlbGVjdCAzLFxyXG4gKiBzZXJpYWxpemVBcnJheSgpIHdpbGwgdXNlIHRoZSB2YWx1ZSBvZiAyIGluc3RlYWQgb2YgMylcclxuICovXHJcbmZ1bmN0aW9uIHRvZ2dsZU9wdGlvbihzaG93KSB7XHJcbiAgICBjb25zdCBjdXJyZW50U2VsZWN0RWxlbWVudCA9ICQodGhpcykuY2xvc2VzdCgnc2VsZWN0Jyk7IC8vIHRoZSBzZWxlY3QgY29udGFpbmluZyB0aGlzXHJcbiAgICBsZXQgZGlzYWJsZWRTZWxlY3RFbGVtZW50OyAvLyB0aGUgZGlzYWJsZWQgc2VsZWN0IGVsZW1lbnRcclxuICAgIGxldCBzZWxlY3RFbGVtZW50OyAvLyB0aGUgcmVhbCBzZWxlY3QgZWxlbWVudFxyXG5cclxuICAgIGlmIChjdXJyZW50U2VsZWN0RWxlbWVudC5pcygnOmRpc2FibGVkJykpIHtcclxuICAgICAgICBkaXNhYmxlZFNlbGVjdEVsZW1lbnQgPSBjdXJyZW50U2VsZWN0RWxlbWVudDtcclxuICAgICAgICBzZWxlY3RFbGVtZW50ID0gZGlzYWJsZWRTZWxlY3RFbGVtZW50LmRhdGEoJ2xpbmtlZFNlbGVjdEVsZW1lbnQnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2VsZWN0RWxlbWVudCA9IGN1cnJlbnRTZWxlY3RFbGVtZW50O1xyXG4gICAgICAgIGRpc2FibGVkU2VsZWN0RWxlbWVudCA9IGN1cnJlbnRTZWxlY3RFbGVtZW50LmRhdGEoJ2xpbmtlZFNlbGVjdEVsZW1lbnQnKTtcclxuICAgICAgICBpZiAoIWRpc2FibGVkU2VsZWN0RWxlbWVudCkge1xyXG4gICAgICAgICAgICAvLyBjcmVhdGUgdGhlIGRpc2FibGVkIHBsYWNlaG9sZGVyIHNlbGVjdCBlbGVtZW50XHJcbiAgICAgICAgICAgIGRpc2FibGVkU2VsZWN0RWxlbWVudCA9ICQoJzxzZWxlY3Q+JylcclxuICAgICAgICAgICAgICAgIC5wcm9wKCdkaXNhYmxlZCcsIHRydWUpXHJcbiAgICAgICAgICAgICAgICAuaGlkZSgpXHJcbiAgICAgICAgICAgICAgICAuYXR0cignbmFtZScsIGN1cnJlbnRTZWxlY3RFbGVtZW50LmF0dHIoJ25hbWUnKSlcclxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhjdXJyZW50U2VsZWN0RWxlbWVudC5hdHRyKCdjbGFzcycpKVxyXG4gICAgICAgICAgICAgICAgLmRhdGEoJ2xpbmtlZFNlbGVjdEVsZW1lbnQnLCBzZWxlY3RFbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgLmluc2VydEFmdGVyKHNlbGVjdEVsZW1lbnQpO1xyXG5cclxuICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5kYXRhKCdsaW5rZWRTZWxlY3RFbGVtZW50JywgZGlzYWJsZWRTZWxlY3RFbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2F2ZSB0aGUgc2VsZWN0ZWQgb3B0aW9uXHJcbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IHNlbGVjdEVsZW1lbnQuZmluZCgnb3B0aW9uOnNlbGVjdGVkJyk7XHJcblxyXG4gICAgLy8gbW92ZSB0aGUgb3B0aW9uIHRvIHRoZSBjb3JyZWN0IHNlbGVjdCBlbGVtZW50IGlmIHJlcXVpcmVkXHJcbiAgICBpZiAoY3VycmVudFNlbGVjdEVsZW1lbnQuaXMoJzpkaXNhYmxlZCcpICYmIHNob3cpIHtcclxuICAgICAgICBjb25zdCBwcmV2aW91c0luZGV4ID0gdGhpcy5kYXRhKCdpbmRleCcpO1xyXG4gICAgICAgIGNvbnN0ICRlbGVtZW50Tm93QXRQcmV2aW91c0luZGV4ID0gc2VsZWN0RWxlbWVudC5maW5kKCdvcHRpb24nKS5lcShwcmV2aW91c0luZGV4KTtcclxuXHJcbiAgICAgICAgaWYgKCRlbGVtZW50Tm93QXRQcmV2aW91c0luZGV4Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmluc2VydEJlZm9yZSgkZWxlbWVudE5vd0F0UHJldmlvdXNJbmRleCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJCh0aGlzKS5hcHBlbmRUbyhzZWxlY3RFbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKCFjdXJyZW50U2VsZWN0RWxlbWVudC5pcygnOmRpc2FibGVkJykgJiYgIXNob3cpIHtcclxuICAgICAgICB0aGlzLmRhdGEoJ2luZGV4JywgY3VycmVudFNlbGVjdEVsZW1lbnQuZmluZCgnb3B0aW9uJykuaW5kZXgodGhpcykpO1xyXG4gICAgICAgICQodGhpcykucHJlcGVuZFRvKGRpc2FibGVkU2VsZWN0RWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbWFrZSBzdXJlIHRoZSBvcHRpb24gaXMgc3RpbGwgc2VsZWN0ZWRcclxuICAgIHNlbGVjdGVkT3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7XHJcbn1cclxuXHJcbiQuZm4udG9nZ2xlT3B0aW9uID0gdG9nZ2xlT3B0aW9uO1xyXG4iLCIvKipcclxuICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGFueSBlbXB0eSBzdHJpbmcgdmFsdWVzIGZyb20gdGhlIGZvcm1EYXRhXHJcbiAqIEBwYXJhbSBmb3JtRGF0YTogRm9ybURhdGEgb2JqZWN0XHJcbiAqIEByZXR1cm5zIEZvcm1EYXRhIG9iamVjdFxyXG4qL1xyXG5leHBvcnQgY29uc3QgZmlsdGVyRW1wdHlWYWx1ZXNGcm9tRm9ybSA9IGZvcm1EYXRhID0+IHtcclxuICAgIGNvbnN0IHJlcyA9IG5ldyBGb3JtRGF0YSgpO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIGZvcm1EYXRhKSB7XHJcbiAgICAgICAgICAgIGlmICh2YWwgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICByZXMuYXBwZW5kKGtleSwgdmFsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlcztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80OTY3Mjk5Mi9hamF4LXJlcXVlc3QtZmFpbHMtd2hlbi1zZW5kaW5nLWZvcm1kYXRhLWluY2x1ZGluZy1lbXB0eS1maWxlLWlucHV0LWluLXNhZmFyaVxyXG4gKiBTYWZhcmkgYnJvd3NlciB3aXRoIGpxdWVyeSAzLjMuMSBoYXMgYW4gaXNzdWUgdXBsb2FkaW5nIGVtcHR5IGZpbGUgcGFyYW1ldGVycy4gVGhpcyBmdW5jdGlvbiByZW1vdmVzIGFueSBlbXB0eSBmaWxlcyBmcm9tIHRoZSBmb3JtIHBhcmFtc1xyXG4gKiBAcGFyYW0gZm9ybURhdGE6IEZvcm1EYXRhIG9iamVjdFxyXG4gKiBAcmV0dXJucyBGb3JtRGF0YSBvYmplY3RcclxuICovXHJcbmV4cG9ydCBjb25zdCBmaWx0ZXJFbXB0eUZpbGVzRnJvbUZvcm0gPSBmb3JtRGF0YSA9PiB7XHJcbiAgICBjb25zdCByZXMgPSBuZXcgRm9ybURhdGEoKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBmb3JtRGF0YSkge1xyXG4gICAgICAgICAgICBpZiAoISh2YWwgaW5zdGFuY2VvZiBGaWxlKSB8fCB2YWwubmFtZSB8fCB2YWwuc2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgcmVzLmFwcGVuZChrZXksIHZhbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlcztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgZW1wdHkgc3RyaW5nIHZhbHVlcyBhbmQgZW1wdHkgZmlsZXMgZnJvbSB0aGUgZm9ybURhdGFcclxuICogQHBhcmFtIGZvcm1EYXRhOiBGb3JtRGF0YSBvYmplY3RcclxuICogQHJldHVybnMgRm9ybURhdGEgb2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplRm9ybURhdGEgPSBmb3JtRGF0YSA9PiBmaWx0ZXJFbXB0eVZhbHVlc0Zyb21Gb3JtKGZpbHRlckVtcHR5RmlsZXNGcm9tRm9ybShmb3JtRGF0YSkpO1xyXG4iLCJpbXBvcnQgeyBpc0Jyb3dzZXJJRSB9IGZyb20gJy4vaWUtaGVscGVycyc7XHJcblxyXG5jb25zdCBiYW5uZXJVdGlscyA9IHtcclxuICAgIGRpc3BhdGNoUHJvZHVjdEJhbm5lckV2ZW50OiAocHJvZHVjdEF0dHJpYnV0ZXMpID0+IHtcclxuICAgICAgICBpZiAoIXByb2R1Y3RBdHRyaWJ1dGVzLnByaWNlIHx8IGlzQnJvd3NlcklFKSByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCBwcmljZSA9IDA7XHJcblxyXG4gICAgICAgIGlmICghcHJvZHVjdEF0dHJpYnV0ZXMucHJpY2UucHJpY2VfcmFuZ2UpIHtcclxuICAgICAgICAgICAgaWYgKHByb2R1Y3RBdHRyaWJ1dGVzLnByaWNlLndpdGhvdXRfdGF4KSB7XHJcbiAgICAgICAgICAgICAgICBwcmljZSA9IHByb2R1Y3RBdHRyaWJ1dGVzLnByaWNlLndpdGhvdXRfdGF4LnZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocHJvZHVjdEF0dHJpYnV0ZXMucHJpY2Uud2l0aF90YXgpIHtcclxuICAgICAgICAgICAgICAgIHByaWNlID0gcHJvZHVjdEF0dHJpYnV0ZXMucHJpY2Uud2l0aF90YXgudmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGV2dCA9IG5ldyBDdXN0b21FdmVudCgnYmlnY29tbWVyY2UucHJvZHVjdHByaWNlY2hhbmdlJywge1xyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgIGFtb3VudDogcHJpY2UsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KGV2dCk7XHJcbiAgICB9LFxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgYmFubmVyVXRpbHM7XHJcbiIsImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCBub2QgZnJvbSAnLi4vbm9kJztcclxuaW1wb3J0IGZvcm1zIGZyb20gJy4uL21vZGVscy9mb3Jtcyc7XHJcblxyXG5jb25zdCBpbnB1dFRhZ05hbWVzID0gW1xyXG4gICAgJ2lucHV0JyxcclxuICAgICdzZWxlY3QnLFxyXG4gICAgJ3RleHRhcmVhJyxcclxuXTtcclxuLyoqXHJcbiAqIFNldCB1cCBPYmplY3Qgd2l0aCBFcnJvciBNZXNzYWdlcyBvbiBQYXNzd29yZCBWYWxpZGF0aW9uLiBQbGVhc2UgdXNlIG1lc3NhZ2VzIGluIG1lbnRpb25lZCBvcmRlclxyXG4gKiBAcGFyYW0ge3N0cmluZ30gZW1wdHkgZGVmaW5lcyBlcnJvciB0ZXh0IGZvciBlbXB0eSBmaWVsZFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlybSBkZWZpbmVzIGVycm9yIHRleHQgZm9yIGVtcHR5IGNvbmZpcm1hdGlvbiBmaWVsZFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbWlzbWF0Y2ggZGVmaW5lcyBlcnJvciB0ZXh0IGlmIGNvbmZpcm0gcGFzc2ZvcmQgbWlzbWF0Y2hlcyBwYXNzZm9yZCBmaWVsZFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gaW52YWxpZCBkZWZpbmVzIGVycm9yIHRleHQgZm9yIGludmFsaWQgcGFzc3dvcmQgY2hhcmF0ZXJzIHNlcXVlbmNlXHJcbiAqIEByZXR1cm4ge29iamVjdH0gbWVzc2FnZXMgb3IgZGVmYXVsdCB0ZXh0cyBpZiBub3RoaW5nIGlzIHByb3ZpZGluZ1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNyZWF0ZVBhc3N3b3JkVmFsaWRhdGlvbkVycm9yVGV4dE9iamVjdCA9IChlbXB0eSwgY29uZmlybSwgbWlzbWF0Y2gsIGludmFsaWQpID0+ICh7XHJcbiAgICBvbkVtcHR5UGFzc3dvcmRFcnJvclRleHQ6IGVtcHR5LFxyXG4gICAgb25Db25maXJtUGFzc3dvcmRFcnJvclRleHQ6IGNvbmZpcm0sXHJcbiAgICBvbk1pc21hdGNoUGFzc3dvcmRFcnJvclRleHQ6IG1pc21hdGNoLFxyXG4gICAgb25Ob3RWYWxpZFBhc3N3b3JkRXJyb3JUZXh0OiBpbnZhbGlkLFxyXG59KTtcclxuXHJcblxyXG4vKipcclxuICogQXBwbHkgY2xhc3MgbmFtZSB0byBhbiBpbnB1dCBlbGVtZW50IG9uIGl0cyB0eXBlXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybUZpZWxkQ2xhc3NcclxuICogQHJldHVybiB7b2JqZWN0fSBFbGVtZW50IGl0c2VsZlxyXG4gKi9cclxuZnVuY3Rpb24gY2xhc3NpZnlJbnB1dChpbnB1dCwgZm9ybUZpZWxkQ2xhc3MpIHtcclxuICAgIGNvbnN0ICRpbnB1dCA9ICQoaW5wdXQpO1xyXG4gICAgY29uc3QgJGZvcm1GaWVsZCA9ICRpbnB1dC5wYXJlbnQoYC4ke2Zvcm1GaWVsZENsYXNzfWApO1xyXG4gICAgY29uc3QgdGFnTmFtZSA9ICRpbnB1dC5wcm9wKCd0YWdOYW1lJykudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBsZXQgY2xhc3NOYW1lID0gYCR7Zm9ybUZpZWxkQ2xhc3N9LS0ke3RhZ05hbWV9YDtcclxuICAgIGxldCBzcGVjaWZpY0NsYXNzTmFtZTtcclxuXHJcbiAgICAvLyBJbnB1dCBjYW4gYmUgdGV4dC9jaGVja2JveC9yYWRpbyBldGMuLi5cclxuICAgIGlmICh0YWdOYW1lID09PSAnaW5wdXQnKSB7XHJcbiAgICAgICAgY29uc3QgaW5wdXRUeXBlID0gJGlucHV0LnByb3AoJ3R5cGUnKTtcclxuXHJcbiAgICAgICAgaWYgKF8uaW5jbHVkZXMoWydyYWRpbycsICdjaGVja2JveCcsICdzdWJtaXQnXSwgaW5wdXRUeXBlKSkge1xyXG4gICAgICAgICAgICAvLyBpZTogLmZvcm0tZmllbGQtLWNoZWNrYm94LCAuZm9ybS1maWVsZC0tcmFkaW9cclxuICAgICAgICAgICAgY2xhc3NOYW1lID0gYCR7Zm9ybUZpZWxkQ2xhc3N9LS0ke18uY2FtZWxDYXNlKGlucHV0VHlwZSl9YDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBpZTogLmZvcm0tZmllbGQtLWlucHV0IC5mb3JtLWZpZWxkLS1pbnB1dFRleHRcclxuICAgICAgICAgICAgc3BlY2lmaWNDbGFzc05hbWUgPSBgJHtjbGFzc05hbWV9JHtfLmNhcGl0YWxpemUoaW5wdXRUeXBlKX1gO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBBcHBseSBjbGFzcyBtb2RpZmllclxyXG4gICAgcmV0dXJuICRmb3JtRmllbGRcclxuICAgICAgICAuYWRkQ2xhc3MoY2xhc3NOYW1lKVxyXG4gICAgICAgIC5hZGRDbGFzcyhzcGVjaWZpY0NsYXNzTmFtZSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBseSBjbGFzcyBuYW1lIHRvIGVhY2ggaW5wdXQgZWxlbWVudCBpbiBhIGZvcm0gYmFzZWQgb24gaXRzIHR5cGVcclxuICogQGV4YW1wbGVcclxuICogLy8gQmVmb3JlXHJcbiAqIDxmb3JtIGlkPVwiZm9ybVwiPlxyXG4gKiAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIj5cclxuICogICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIj5cclxuICogICAgIDwvZGl2PlxyXG4gKiAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIj5cclxuICogICAgICAgICA8c2VsZWN0Pi4uLjwvc2VsZWN0PlxyXG4gKiAgICAgPC9kaXY+XHJcbiAqIDwvZm9ybT5cclxuICpcclxuICogY2xhc3NpZnlGb3JtKCcjZm9ybScsIHsgZm9ybUZpZWxkQ2xhc3M6ICdmb3JtLWZpZWxkJyB9KTtcclxuICpcclxuICogLy8gQWZ0ZXJcclxuICogPGRpdiBjbGFzcz1cImZvcm0tZmllbGQgZm9ybS1maWVsZC0taW5wdXQgZm9ybS1maWVsZC0taW5wdXRUZXh0XCI+Li4uPC9kaXY+XHJcbiAqIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkIGZvcm0tZmllbGQtLXNlbGVjdFwiPi4uLjwvZGl2PlxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IGZvcm1TZWxlY3RvciAtIHNlbGVjdG9yIG9yIGVsZW1lbnRcclxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcclxuICogQHJldHVybiB7alF1ZXJ5fSBFbGVtZW50IGl0c2VsZlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5Rm9ybShmb3JtU2VsZWN0b3IsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgY29uc3QgJGZvcm0gPSAkKGZvcm1TZWxlY3Rvcik7XHJcbiAgICBjb25zdCAkaW5wdXRzID0gJGZvcm0uZmluZChpbnB1dFRhZ05hbWVzLmpvaW4oJywgJykpO1xyXG5cclxuICAgIC8vIE9idGFpbiBvcHRpb25zXHJcbiAgICBjb25zdCB7IGZvcm1GaWVsZENsYXNzID0gJ2Zvcm0tZmllbGQnIH0gPSBvcHRpb25zO1xyXG5cclxuICAgIC8vIENsYXNzaWZ5IGVhY2ggaW5wdXQgaW4gYSBmb3JtXHJcbiAgICAkaW5wdXRzLmVhY2goKF9fLCBpbnB1dCkgPT4ge1xyXG4gICAgICAgIGNsYXNzaWZ5SW5wdXQoaW5wdXQsIGZvcm1GaWVsZENsYXNzKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiAkZm9ybTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldCBpZCBmcm9tIGdpdmVuIGZpZWxkXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSAkZmllbGQgSlF1ZXJ5IGZpZWxkIG9iamVjdFxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRGaWVsZElkKCRmaWVsZCkge1xyXG4gICAgY29uc3QgZmllbGRJZCA9ICRmaWVsZC5wcm9wKCduYW1lJykubWF0Y2goLyhcXFsuKlxcXSkvKTtcclxuXHJcbiAgICBpZiAoZmllbGRJZCAmJiBmaWVsZElkLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICAgIHJldHVybiBmaWVsZElkWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAnJztcclxufVxyXG5cclxuLyoqXHJcbiAqIEluc2VydCBoaWRkZW4gZmllbGQgYWZ0ZXIgU3RhdGUvUHJvdmluY2UgZmllbGRcclxuICogQHBhcmFtIHtvYmplY3R9ICRzdGF0ZUZpZWxkIEpRdWVyeSBmaWVsZCBvYmplY3RcclxuICovXHJcbmZ1bmN0aW9uIGluc2VydFN0YXRlSGlkZGVuRmllbGQoJHN0YXRlRmllbGQpIHtcclxuICAgIGNvbnN0IGZpZWxkSWQgPSBnZXRGaWVsZElkKCRzdGF0ZUZpZWxkKTtcclxuICAgIGNvbnN0IHN0YXRlRmllbGRBdHRycyA9IHtcclxuICAgICAgICB0eXBlOiAnaGlkZGVuJyxcclxuICAgICAgICBuYW1lOiBgRm9ybUZpZWxkSXNUZXh0JHtmaWVsZElkfWAsXHJcbiAgICAgICAgdmFsdWU6ICcxJyxcclxuICAgIH07XHJcblxyXG4gICAgJHN0YXRlRmllbGQuYWZ0ZXIoJCgnPGlucHV0IC8+Jywgc3RhdGVGaWVsZEF0dHJzKSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBbm5vdW5jZSBmb3JtIGlucHV0IGVycm9yIG1lc3NhZ2UgYnkgc2NyZWVuIHJlYWRlclxyXG4gKiBAcGFyYW0ge3BhcmFtcy5lbGVtZW50fSBkb20gaW5wdXQgZWxlbWVudCB3aGVyZSBjaGVja2luZyBpcyBoYXBwZW5lZFxyXG4gKiBAcGFyYW0ge3BhcmFtcy5yZXN1bHR9IHJlc3VsdCBvZiB2YWxpZGF0aW9uIGNoZWNrXHJcbiAqL1xyXG5mdW5jdGlvbiBhbm5vdW5jZUlucHV0RXJyb3JNZXNzYWdlKHsgZWxlbWVudCwgcmVzdWx0IH0pIHtcclxuICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBhY3RpdmVJbnB1dENvbnRhaW5lciA9ICQoZWxlbWVudCkucGFyZW50KCk7XHJcbiAgICAvLyB0aGUgcmVhc29uIGZvciB1c2luZyBzcGFuIHRhZyBpcyBub2QtdmFsaWRhdGUgbGliXHJcbiAgICAvLyB3aGljaCBkb2VzIG5vdCBhZGQgZXJyb3IgbWVzc2FnZSBjbGFzcyB3aGlsZSBpbml0aWFsaXNpbmcgZm9ybS5cclxuICAgIC8vIHNwZWNpZmljIGNsYXNzIGlzIGFkZGVkIHNpbmNlIGl0IGNhbiBiZSBtdWx0aXBsZSBzcGFuc1xyXG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gJChhY3RpdmVJbnB1dENvbnRhaW5lcikuZmluZCgnc3Bhbi5mb3JtLWlubGluZU1lc3NhZ2UnKTtcclxuXHJcbiAgICBpZiAoZXJyb3JNZXNzYWdlLmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0ICRlcnJNZXNzYWdlID0gJChlcnJvck1lc3NhZ2VbMF0pO1xyXG5cclxuICAgICAgICBpZiAoISRlcnJNZXNzYWdlLmF0dHIoJ3JvbGUnKSkge1xyXG4gICAgICAgICAgICAkZXJyTWVzc2FnZS5hdHRyKCdyb2xlJywgJ2FsZXJ0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBWYWxpZGF0b3JzID0ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHVwIGEgbmV3IHZhbGlkYXRpb24gd2hlbiB0aGUgZm9ybSBpcyBkaXJ0eVxyXG4gICAgICogQHBhcmFtIHZhbGlkYXRvclxyXG4gICAgICogQHBhcmFtIGZpZWxkXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXJyb3JUZXh0IGRlc2NyaWJlcyBlcnJvck1hc3NhZ2Ugb24gZW1haWwgdmFsaWRhdGlvblxyXG4gICAgICovXHJcbiAgICBzZXRFbWFpbFZhbGlkYXRpb246ICh2YWxpZGF0b3IsIGZpZWxkLCBlcnJvclRleHQpID0+IHtcclxuICAgICAgICBpZiAoZmllbGQpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9yLmFkZCh7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogZmllbGQsXHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZTogKGNiLCB2YWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmb3Jtcy5lbWFpbCh2YWwpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYihyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyb3JUZXh0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhdGUgcGFzc3dvcmQgZmllbGRzXHJcbiAgICAgKiBAcGFyYW0gdmFsaWRhdG9yXHJcbiAgICAgKiBAcGFyYW0gcGFzc3dvcmRTZWxlY3RvclxyXG4gICAgICogQHBhcmFtIHBhc3N3b3JkMlNlbGVjdG9yXHJcbiAgICAgKiBAcGFyYW0gcmVxdWlyZW1lbnRzXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXJyb3JUZXh0c09iamVjdFxyXG4gICAgICogQHBhcmFtIGlzT3B0aW9uYWxcclxuICAgICAqL1xyXG4gICAgc2V0UGFzc3dvcmRWYWxpZGF0aW9uOiAodmFsaWRhdG9yLCBwYXNzd29yZFNlbGVjdG9yLCBwYXNzd29yZDJTZWxlY3RvciwgcmVxdWlyZW1lbnRzLCB7XHJcbiAgICAgICAgb25FbXB0eVBhc3N3b3JkRXJyb3JUZXh0LCBvbkNvbmZpcm1QYXNzd29yZEVycm9yVGV4dCwgb25NaXNtYXRjaFBhc3N3b3JkRXJyb3JUZXh0LCBvbk5vdFZhbGlkUGFzc3dvcmRFcnJvclRleHQsXHJcbiAgICB9LCBpc09wdGlvbmFsKSA9PiB7XHJcbiAgICAgICAgY29uc3QgJHBhc3N3b3JkID0gJChwYXNzd29yZFNlbGVjdG9yKTtcclxuICAgICAgICBjb25zdCBwYXNzd29yZFZhbGlkYXRpb25zID0gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogcGFzc3dvcmRTZWxlY3RvcixcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRlOiAoY2IsIHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbC5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc09wdGlvbmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYih0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNiKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBvbkVtcHR5UGFzc3dvcmRFcnJvclRleHQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBwYXNzd29yZFNlbGVjdG9yLFxyXG4gICAgICAgICAgICAgICAgdmFsaWRhdGU6IChjYiwgdmFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdmFsLm1hdGNoKG5ldyBSZWdFeHAocmVxdWlyZW1lbnRzLmFscGhhKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgdmFsLm1hdGNoKG5ldyBSZWdFeHAocmVxdWlyZW1lbnRzLm51bWVyaWMpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiB2YWwubGVuZ3RoID49IHJlcXVpcmVtZW50cy5taW5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIG9wdGlvbmFsIGFuZCBub3RoaW5nIGVudGVyZWQsIGl0IGlzIHZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzT3B0aW9uYWwgJiYgdmFsLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2IodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYihyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogb25Ob3RWYWxpZFBhc3N3b3JkRXJyb3JUZXh0LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogcGFzc3dvcmQyU2VsZWN0b3IsXHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZTogKGNiLCB2YWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB2YWwubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNPcHRpb25hbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2IodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYihyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogb25Db25maXJtUGFzc3dvcmRFcnJvclRleHQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBwYXNzd29yZDJTZWxlY3RvcixcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRlOiAoY2IsIHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbCA9PT0gJHBhc3N3b3JkLnZhbCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYihyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogb25NaXNtYXRjaFBhc3N3b3JkRXJyb3JUZXh0LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIHZhbGlkYXRvci5hZGQocGFzc3dvcmRWYWxpZGF0aW9ucyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhdGUgcGFzc3dvcmQgZmllbGRzXHJcbiAgICAgKiBAcGFyYW0ge05vZH0gdmFsaWRhdG9yXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc2VsZWN0b3JzXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JzLmVycm9yU2VsZWN0b3JcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcnMuZmllbGRzZXRTZWxlY3RvclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9ycy5mb3JtU2VsZWN0b3JcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcnMubWF4UHJpY2VTZWxlY3RvclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9ycy5taW5QcmljZVNlbGVjdG9yXHJcbiAgICAgKi9cclxuICAgIHNldE1pbk1heFByaWNlVmFsaWRhdGlvbjogKHZhbGlkYXRvciwgc2VsZWN0b3JzLCBwcmljZVZhbGlkYXRpb25FcnJvclRleHRzID0ge30pID0+IHtcclxuICAgICAgICBjb25zdCB7XHJcbiAgICAgICAgICAgIGVycm9yU2VsZWN0b3IsXHJcbiAgICAgICAgICAgIGZpZWxkc2V0U2VsZWN0b3IsXHJcbiAgICAgICAgICAgIGZvcm1TZWxlY3RvcixcclxuICAgICAgICAgICAgbWF4UHJpY2VTZWxlY3RvcixcclxuICAgICAgICAgICAgbWluUHJpY2VTZWxlY3RvcixcclxuICAgICAgICB9ID0gc2VsZWN0b3JzO1xyXG5cclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JqZWN0LWN1cmx5LW5ld2xpbmVcclxuICAgICAgICBjb25zdCB7IG9uTWluUHJpY2VFcnJvciwgb25NYXhQcmljZUVycm9yLCBtaW5QcmljZU5vdEVudGVyZWQsIG1heFByaWNlTm90RW50ZXJlZCwgb25JbnZhbGlkUHJpY2UgfSA9IHByaWNlVmFsaWRhdGlvbkVycm9yVGV4dHM7XHJcblxyXG4gICAgICAgIHZhbGlkYXRvci5jb25maWd1cmUoe1xyXG4gICAgICAgICAgICBmb3JtOiBmb3JtU2VsZWN0b3IsXHJcbiAgICAgICAgICAgIHByZXZlbnRTdWJtaXQ6IHRydWUsXHJcbiAgICAgICAgICAgIHN1Y2Nlc3NDbGFzczogJ18nLCAvLyBLTFVER0U6IERvbid0IGFwcGx5IHN1Y2Nlc3MgY2xhc3NcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdmFsaWRhdG9yLmFkZCh7XHJcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZTogb25NaW5QcmljZUVycm9yLFxyXG4gICAgICAgICAgICBzZWxlY3RvcjogbWluUHJpY2VTZWxlY3RvcixcclxuICAgICAgICAgICAgdmFsaWRhdGU6IGBtaW4tbWF4OiR7bWluUHJpY2VTZWxlY3Rvcn06JHttYXhQcmljZVNlbGVjdG9yfWAsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHZhbGlkYXRvci5hZGQoe1xyXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6IG9uTWF4UHJpY2VFcnJvcixcclxuICAgICAgICAgICAgc2VsZWN0b3I6IG1heFByaWNlU2VsZWN0b3IsXHJcbiAgICAgICAgICAgIHZhbGlkYXRlOiBgbWluLW1heDoke21pblByaWNlU2VsZWN0b3J9OiR7bWF4UHJpY2VTZWxlY3Rvcn1gLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB2YWxpZGF0b3IuYWRkKHtcclxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBtYXhQcmljZU5vdEVudGVyZWQsXHJcbiAgICAgICAgICAgIHNlbGVjdG9yOiBtYXhQcmljZVNlbGVjdG9yLFxyXG4gICAgICAgICAgICB2YWxpZGF0ZTogJ3ByZXNlbmNlJyxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdmFsaWRhdG9yLmFkZCh7XHJcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZTogbWluUHJpY2VOb3RFbnRlcmVkLFxyXG4gICAgICAgICAgICBzZWxlY3RvcjogbWluUHJpY2VTZWxlY3RvcixcclxuICAgICAgICAgICAgdmFsaWRhdGU6ICdwcmVzZW5jZScsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHZhbGlkYXRvci5hZGQoe1xyXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6IG9uSW52YWxpZFByaWNlLFxyXG4gICAgICAgICAgICBzZWxlY3RvcjogW21pblByaWNlU2VsZWN0b3IsIG1heFByaWNlU2VsZWN0b3JdLFxyXG4gICAgICAgICAgICB2YWxpZGF0ZTogJ21pbi1udW1iZXI6MCcsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHZhbGlkYXRvci5zZXRNZXNzYWdlT3B0aW9ucyh7XHJcbiAgICAgICAgICAgIHNlbGVjdG9yOiBbbWluUHJpY2VTZWxlY3RvciwgbWF4UHJpY2VTZWxlY3Rvcl0sXHJcbiAgICAgICAgICAgIHBhcmVudDogZmllbGRzZXRTZWxlY3RvcixcclxuICAgICAgICAgICAgZXJyb3JTcGFuOiBlcnJvclNlbGVjdG9yLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdXAgYSBuZXcgdmFsaWRhdGlvbiB3aGVuIHRoZSBmb3JtIGlzIGRpcnR5XHJcbiAgICAgKiBAcGFyYW0gdmFsaWRhdG9yXHJcbiAgICAgKiBAcGFyYW0gZmllbGRcclxuICAgICAqL1xyXG4gICAgc2V0U3RhdGVDb3VudHJ5VmFsaWRhdGlvbjogKHZhbGlkYXRvciwgZmllbGQsIGVycm9yVGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChmaWVsZCkge1xyXG4gICAgICAgICAgICB2YWxpZGF0b3IuYWRkKHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBmaWVsZCxcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRlOiAncHJlc2VuY2UnLFxyXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvclRleHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGNsYXNzZXMgZnJvbSBkaXJ0eSBmb3JtIGlmIHByZXZpb3VzbHkgY2hlY2tlZFxyXG4gICAgICogQHBhcmFtIGZpZWxkXHJcbiAgICAgKi9cclxuICAgIGNsZWFuVXBTdGF0ZVZhbGlkYXRpb246IChmaWVsZCkgPT4ge1xyXG4gICAgICAgIGNvbnN0ICRmaWVsZENsYXNzRWxlbWVudCA9ICQoKGBbZGF0YS10eXBlPVwiJHtmaWVsZC5kYXRhKCdmaWVsZFR5cGUnKX1cIl1gKSk7XHJcblxyXG4gICAgICAgIE9iamVjdC5rZXlzKG5vZC5jbGFzc2VzKS5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoJGZpZWxkQ2xhc3NFbGVtZW50Lmhhc0NsYXNzKG5vZC5jbGFzc2VzW3ZhbHVlXSkpIHtcclxuICAgICAgICAgICAgICAgICRmaWVsZENsYXNzRWxlbWVudC5yZW1vdmVDbGFzcyhub2QuY2xhc3Nlc1t2YWx1ZV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LFxyXG59O1xyXG5cclxuZXhwb3J0IHsgVmFsaWRhdG9ycywgaW5zZXJ0U3RhdGVIaWRkZW5GaWVsZCwgYW5ub3VuY2VJbnB1dEVycm9yTWVzc2FnZSB9O1xyXG4iLCJleHBvcnQgY29uc3QgaXNCcm93c2VySUUgPSAhIWRvY3VtZW50LmRvY3VtZW50TW9kZTtcclxuXHJcbmV4cG9ydCBjb25zdCBjb252ZXJ0SW50b0FycmF5ID0gY29sbGVjdGlvbiA9PiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjb2xsZWN0aW9uKTtcclxuIiwiY29uc3QgY2hhbmdlV2lzaGxpc3RQYWdpbmF0aW9uTGlua3MgPSAod2lzaGxpc3RVcmwsIC4uLnBhZ2luYXRpb25JdGVtcykgPT4gJC5lYWNoKHBhZ2luYXRpb25JdGVtcywgKF8sICRpdGVtKSA9PiB7XHJcbiAgICBjb25zdCBwYWdpbmF0aW9uTGluayA9ICRpdGVtLmNoaWxkcmVuKCcucGFnaW5hdGlvbi1saW5rJyk7XHJcblxyXG4gICAgaWYgKCRpdGVtLmxlbmd0aCAmJiAhcGFnaW5hdGlvbkxpbmsuYXR0cignaHJlZicpLmluY2x1ZGVzKCdwYWdlPScpKSB7XHJcbiAgICAgICAgY29uc3QgcGFnZU51bWJlciA9IHBhZ2luYXRpb25MaW5rLmF0dHIoJ2hyZWYnKTtcclxuICAgICAgICBwYWdpbmF0aW9uTGluay5hdHRyKCdocmVmJywgYCR7d2lzaGxpc3RVcmx9cGFnZT0ke3BhZ2VOdW1iZXJ9YCk7XHJcbiAgICB9XHJcbn0pO1xyXG5cclxuLyoqXHJcbiAqIGhlbHBzIHRvIHdpdGhkcmF3IGRpZmZlcmVuY2VzIGluIHN0cnVjdHVyZXMgYXJvdW5kIHRoZSBzdGVuY2lsIHJlc291cmNlIHBhZ2luYXRpb25cclxuICovXHJcbmV4cG9ydCBjb25zdCB3aXNobGlzdFBhZ2luYXRvckhlbHBlciA9ICgpID0+IHtcclxuICAgIGNvbnN0ICRwYWdpbmF0aW9uTGlzdCA9ICQoJy5wYWdpbmF0aW9uLWxpc3QnKTtcclxuXHJcbiAgICBpZiAoISRwYWdpbmF0aW9uTGlzdC5sZW5ndGgpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCAkbmV4dEl0ZW0gPSAkKCcucGFnaW5hdGlvbi1pdGVtLS1uZXh0JywgJHBhZ2luYXRpb25MaXN0KTtcclxuICAgIGNvbnN0ICRwcmV2SXRlbSA9ICQoJy5wYWdpbmF0aW9uLWl0ZW0tLXByZXZpb3VzJywgJHBhZ2luYXRpb25MaXN0KTtcclxuICAgIGNvbnN0IGN1cnJlbnRIcmVmID0gJCgnW2RhdGEtcGFnaW5hdGlvbi1jdXJyZW50LXBhZ2UtbGlua10nKS5hdHRyKCdocmVmJyk7XHJcbiAgICBjb25zdCBwYXJ0aWFsUGFnaW5hdGlvblVybCA9IGN1cnJlbnRIcmVmLnNwbGl0KCdwYWdlPScpLnNoaWZ0KCk7XHJcblxyXG4gICAgY2hhbmdlV2lzaGxpc3RQYWdpbmF0aW9uTGlua3MocGFydGlhbFBhZ2luYXRpb25VcmwsICRwcmV2SXRlbSwgJG5leHRJdGVtKTtcclxufTtcclxuIiwiLyoqXHJcbiAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIEhUTUwgZW50aXRpZXMgaW4gc3RyaW5nc1xyXG4gKiBAcGFyYW0gc3RyOiBTdHJpbmdcclxuICogQHJldHVybnMgU3RyaW5nXHJcbiovXHJcbmV4cG9ydCBjb25zdCBzYWZlU3RyaW5nID0gKHN0cikgPT4ge1xyXG4gICAgY29uc3QgZCA9IG5ldyBET01QYXJzZXIoKTtcclxuICAgIHJldHVybiBkLnBhcnNlRnJvbVN0cmluZyhzdHIsICd0ZXh0L2h0bWwnKS5ib2R5LnRleHRDb250ZW50O1xyXG59O1xyXG4iLCJpbXBvcnQgVXJsIGZyb20gJ3VybCc7XHJcblxyXG5jb25zdCB1cmxVdGlscyA9IHtcclxuICAgIGdldFVybDogKCkgPT4gYCR7d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lfSR7d2luZG93LmxvY2F0aW9uLnNlYXJjaH1gLFxyXG5cclxuICAgIGdvVG9Vcmw6ICh1cmwpID0+IHtcclxuICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoe30sIGRvY3VtZW50LnRpdGxlLCB1cmwpO1xyXG4gICAgICAgICQod2luZG93KS50cmlnZ2VyKCdzdGF0ZWNoYW5nZScpO1xyXG4gICAgfSxcclxuXHJcbiAgICByZXBsYWNlUGFyYW1zOiAodXJsLCBwYXJhbXMpID0+IHtcclxuICAgICAgICBjb25zdCBwYXJzZWQgPSBVcmwucGFyc2UodXJsLCB0cnVlKTtcclxuICAgICAgICBsZXQgcGFyYW07XHJcblxyXG4gICAgICAgIC8vIExldCB0aGUgZm9ybWF0dGVyIHVzZSB0aGUgcXVlcnkgb2JqZWN0IHRvIGJ1aWxkIHRoZSBuZXcgdXJsXHJcbiAgICAgICAgcGFyc2VkLnNlYXJjaCA9IG51bGw7XHJcblxyXG4gICAgICAgIGZvciAocGFyYW0gaW4gcGFyYW1zKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMuaGFzT3duUHJvcGVydHkocGFyYW0pKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJzZWQucXVlcnlbcGFyYW1dID0gcGFyYW1zW3BhcmFtXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFVybC5mb3JtYXQocGFyc2VkKTtcclxuICAgIH0sXHJcblxyXG4gICAgYnVpbGRRdWVyeVN0cmluZzogKHF1ZXJ5RGF0YSkgPT4ge1xyXG4gICAgICAgIGxldCBvdXQgPSAnJztcclxuICAgICAgICBsZXQga2V5O1xyXG4gICAgICAgIGZvciAoa2V5IGluIHF1ZXJ5RGF0YSkge1xyXG4gICAgICAgICAgICBpZiAocXVlcnlEYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHF1ZXJ5RGF0YVtrZXldKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZHg7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobmR4IGluIHF1ZXJ5RGF0YVtrZXldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeURhdGFba2V5XS5oYXNPd25Qcm9wZXJ0eShuZHgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gYCYke2tleX09JHtxdWVyeURhdGFba2V5XVtuZHhdfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG91dCArPSBgJiR7a2V5fT0ke3F1ZXJ5RGF0YVtrZXldfWA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvdXQuc3Vic3RyaW5nKDEpO1xyXG4gICAgfSxcclxuXHJcbiAgICBwYXJzZVF1ZXJ5UGFyYW1zOiAocXVlcnlEYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge307XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVlcnlEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRlbXAgPSBxdWVyeURhdGFbaV0uc3BsaXQoJz0nKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0ZW1wWzBdIGluIHBhcmFtcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zW3RlbXBbMF1dKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1t0ZW1wWzBdXS5wdXNoKHRlbXBbMV0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXNbdGVtcFswXV0gPSBbcGFyYW1zW3RlbXBbMF1dLCB0ZW1wWzFdXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtc1t0ZW1wWzBdXSA9IHRlbXBbMV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwYXJhbXM7XHJcbiAgICB9LFxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgdXJsVXRpbHM7XHJcbiIsImltcG9ydCAnZm9jdXMtd2l0aGluLXBvbHlmaWxsJztcclxuXHJcbmltcG9ydCAnLi9nbG9iYWwvanF1ZXJ5LW1pZ3JhdGUnO1xyXG5pbXBvcnQgJy4vY29tbW9uL3NlbGVjdC1vcHRpb24tcGx1Z2luJztcclxuaW1wb3J0IFBhZ2VNYW5hZ2VyIGZyb20gJy4vcGFnZS1tYW5hZ2VyJztcclxuaW1wb3J0IHF1aWNrU2VhcmNoIGZyb20gJy4vZ2xvYmFsL3F1aWNrLXNlYXJjaCc7XHJcbmltcG9ydCBjdXJyZW5jeVNlbGVjdG9yIGZyb20gJy4vZ2xvYmFsL2N1cnJlbmN5LXNlbGVjdG9yJztcclxuaW1wb3J0IG1vYmlsZU1lbnVUb2dnbGUgZnJvbSAnLi9nbG9iYWwvbW9iaWxlLW1lbnUtdG9nZ2xlJztcclxuaW1wb3J0IG1lbnUgZnJvbSAnLi9nbG9iYWwvbWVudSc7XHJcbmltcG9ydCBmb3VuZGF0aW9uIGZyb20gJy4vZ2xvYmFsL2ZvdW5kYXRpb24nO1xyXG5pbXBvcnQgcXVpY2tWaWV3IGZyb20gJy4vZ2xvYmFsL3F1aWNrLXZpZXcnO1xyXG5pbXBvcnQgY2FydFByZXZpZXcgZnJvbSAnLi9nbG9iYWwvY2FydC1wcmV2aWV3JztcclxuaW1wb3J0IHByaXZhY3lDb29raWVOb3RpZmljYXRpb24gZnJvbSAnLi9nbG9iYWwvY29va2llTm90aWZpY2F0aW9uJztcclxuaW1wb3J0IGFkbWluQmFyIGZyb20gJy4vZ2xvYmFsL2FkbWluQmFyJztcclxuaW1wb3J0IGNhcm91c2VsIGZyb20gJy4vY29tbW9uL2Nhcm91c2VsJztcclxuaW1wb3J0IGxvYWRpbmdQcm9ncmVzc0JhciBmcm9tICcuL2dsb2JhbC9sb2FkaW5nLXByb2dyZXNzLWJhcic7XHJcbmltcG9ydCBzdmdJbmplY3RvciBmcm9tICcuL2dsb2JhbC9zdmctaW5qZWN0b3InO1xyXG5pbXBvcnQgcm9vdHNMb2FkZWQgZnJvbSAnLi9yb290cy9nbG9iYWwnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2xvYmFsIGV4dGVuZHMgUGFnZU1hbmFnZXIge1xyXG4gICAgb25SZWFkeSgpIHtcclxuICAgICAgICBjb25zdCB7XHJcbiAgICAgICAgICAgIGNoYW5uZWxJZCwgY2FydElkLCBwcm9kdWN0SWQsIGNhdGVnb3J5SWQsIHNlY3VyZUJhc2VVcmwsIG1haW50ZW5hbmNlTW9kZVNldHRpbmdzLCBhZG1pbkJhckxhbmd1YWdlLFxyXG4gICAgICAgIH0gPSB0aGlzLmNvbnRleHQ7XHJcbiAgICAgICAgY2FydFByZXZpZXcoc2VjdXJlQmFzZVVybCwgY2FydElkKTtcclxuICAgICAgICBxdWlja1NlYXJjaCgpO1xyXG4gICAgICAgIGN1cnJlbmN5U2VsZWN0b3IoY2FydElkKTtcclxuICAgICAgICBmb3VuZGF0aW9uKCQoZG9jdW1lbnQpKTtcclxuICAgICAgICBxdWlja1ZpZXcodGhpcy5jb250ZXh0KTtcclxuICAgICAgICBjYXJvdXNlbCh0aGlzLmNvbnRleHQpO1xyXG4gICAgICAgIG1lbnUoKTtcclxuICAgICAgICBtb2JpbGVNZW51VG9nZ2xlKCk7XHJcbiAgICAgICAgcHJpdmFjeUNvb2tpZU5vdGlmaWNhdGlvbigpO1xyXG4gICAgICAgIGFkbWluQmFyKHNlY3VyZUJhc2VVcmwsIGNoYW5uZWxJZCwgbWFpbnRlbmFuY2VNb2RlU2V0dGluZ3MsIEpTT04ucGFyc2UoYWRtaW5CYXJMYW5ndWFnZSksIHByb2R1Y3RJZCwgY2F0ZWdvcnlJZCk7XHJcbiAgICAgICAgbG9hZGluZ1Byb2dyZXNzQmFyKCk7XHJcbiAgICAgICAgc3ZnSW5qZWN0b3IoKTtcclxuICAgICAgICBcclxuICAgICAgICByb290c0xvYWRlZCgpO1xyXG4gICAgfVxyXG59XHJcbiIsIi8qKlxyXG4gKiBQZXJzaXN0ZW50IGFkbWluIGJhciBmb3Igc3RvcmUgYWRtaW5pc3RyYXRvcnMgdmlld2luZyB0aGUgc3RvcmVmcm9udFxyXG4gKiBAcGFyYW0gbWFpbnRlbmFuY2VNb2RlXHJcbiAqIEBwYXJhbSBzZWN1cmVCYXNlVXJsXHJcbiAqIEBwYXJhbSBjaGFubmVsSWRcclxuICogQHBhcmFtIGFkbWluQmFyTGFuZ3VhZ2VcclxuICogQHBhcmFtIHByb2R1Y3RJZFxyXG4gKiBAcGFyYW0gY2F0ZWdvcnlJZFxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHNlY3VyZUJhc2VVcmwsIGNoYW5uZWxJZCA9IDEsIG1haW50ZW5hbmNlTW9kZSA9IHt9LCBhZG1pbkJhckxhbmd1YWdlLCBwcm9kdWN0SWQsIGNhdGVnb3J5SWQpIHtcclxuICAgIGNvbnN0IGxhbmcgPSBhZG1pbkJhckxhbmd1YWdlLnRyYW5zbGF0aW9ucztcclxuICAgIGNvbnN0IHBhc3N3b3JkID0gbWFpbnRlbmFuY2VNb2RlLnBhc3N3b3JkIHx8IGZhbHNlO1xyXG4gICAgY29uc3QgaXNNYWludGVuYW5jZU1vZGUgPSAobWFpbnRlbmFuY2VNb2RlLmhlYWRlciAmJiAhcGFzc3dvcmQpIHx8IGZhbHNlO1xyXG5cclxuICAgIGZ1bmN0aW9uIGlzSW5JZnJhbWUoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbiAhPT0gd2luZG93LnBhcmVudC5sb2NhdGlvbjtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XHJcbiAgICBmdW5jdGlvbiBnZXRDb250ZXh0dWFsTWF0Y2gocHJvZHVjdElkLCBjYXRlZ29yeUlkKSB7XHJcbiAgICAgICAgaWYgKHByb2R1Y3RJZCAmJiBwYXJzZUludChwcm9kdWN0SWQsIDEwKSkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ3Byb2R1Y3QnLFxyXG4gICAgICAgICAgICAgICAgdXJsOiBgL21hbmFnZS9wcm9kdWN0cy8ke3Byb2R1Y3RJZH0vZWRpdGAsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIGlmIChjYXRlZ29yeUlkICYmIHBhcnNlSW50KGNhdGVnb3J5SWQsIDEwKSkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2NhdGVnb3J5JyxcclxuICAgICAgICAgICAgICAgIHVybDogYC9tYW5hZ2UvcHJvZHVjdHMvY2F0ZWdvcmllcy8ke2NhdGVnb3J5SWR9L2VkaXRgLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkb2VzTm90SGF2ZUFkbWluQ29va2llKCkge1xyXG4gICAgICAgIHJldHVybiBkb2N1bWVudC5jb29raWUuaW5kZXhPZignQURNSU5fQkFSPTEnKSA9PT0gLTE7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2V0IGFkbWluIGNvb2tpZSBpZiBhcHByb3ByaWF0ZVxyXG4gICAgaWYgKHdpbmRvdy5VUkxTZWFyY2hQYXJhbXMgJiYgd2luZG93LlVSTCAmJiAobmV3IFVSTChkb2N1bWVudC5sb2NhdGlvbikpLnNlYXJjaFBhcmFtcy5nZXQoJ2N0aycpKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuY29va2llID0gJ0FETUlOX0JBUj0xOyBwYXRoPS8nO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBSZXR1cm4gaWYgaXNJbklmcmFtZSBpcyB0cnVlIChpbnNpZGUgcGFnZSBidWlsZGVyKSBvciBpZiB0aGVyZSBpcyBubyBhZG1pbiBjb29raWVcclxuICAgIGlmIChkb2VzTm90SGF2ZUFkbWluQ29va2llKCkgfHwgaXNJbklmcmFtZSgpKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVybCA9IGVuY29kZVVSSUNvbXBvbmVudCgobmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5yZXBsYWNlKC9eXFwvfFxcLyQvZywgJycpKTtcclxuICAgIGNvbnN0IGNvbnRleHR1YWxNYXRjaCA9IGdldENvbnRleHR1YWxNYXRjaChwcm9kdWN0SWQsIGNhdGVnb3J5SWQpO1xyXG5cclxuICAgIGNvbnN0ICRlbGVtZW50ID0gJCgnPGRpdj4nLCB7XHJcbiAgICAgICAgY2xhc3M6ICdhZG1pbkJhcicsXHJcbiAgICB9KTtcclxuXHJcbiAgICAkZWxlbWVudC5odG1sKGA8ZGl2IGNsYXNzPVwiYWRtaW5CYXItbG9nb1wiPlxyXG4gICAgICAgIDxhIGhyZWY9XCIke3NlY3VyZUJhc2VVcmx9L21hbmFnZS9kYXNoYm9hcmRcIj48c3ZnPjx1c2UgeGxpbms6aHJlZj1cIiNpY29uLWxvZ28tc21hbGxcIj48L3VzZT48L3N2Zz48L2E+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFkbWluQmFyLWNvbnRlbnRcIj5cclxuICAgICAgICAke3Bhc3N3b3JkID9cclxuICAgICAgICBgPGRpdiBjbGFzcz1cImFkbWluQmFyLXByaXZhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInByZXZpZXdcIj4ke2xhbmdbJ2FkbWluLnByZWxhdW5jaF9oZWFkZXInXX0gPHN0cm9uZz4ke3Bhc3N3b3JkfTwvc3Ryb25nPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PmAgOiAnJ31cclxuICAgICAgICAke2lzTWFpbnRlbmFuY2VNb2RlID9cclxuICAgICAgICBgPGRpdiBjbGFzcz1cImFkbWluQmFyLXByaXZhdGVcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPiR7bGFuZ1snYWRtaW4ubWFpbnRlbmFuY2VfaGVhZGVyJ119PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctYmFzZWxpbmUgYWRtaW5CYXItbGFyZ2UgdG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmc+PHVzZSB4bGluazpocmVmPVwiI2ljb24tYWRtaW4tdG9vbHRpcFwiPjwvdXNlPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9vbHRpcHRleHQgdG9vbHRpcC1ib3R0b21cIj4ke2xhbmdbJ2FkbWluLm1haW50ZW5hbmNlX3Rvb2x0aXAnXX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiP3Nob3dTdG9yZT1ub1wiIGNsYXNzPVwiYWRtaW5CYXItbGFyZ2VcIj4ke2xhbmdbJ2FkbWluLm1haW50ZW5hbmNlX3Nob3dzdG9yZV9saW5rJ119IDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWJhc2VsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBzdHlsZT1cImhlaWdodDogMC44ZW07XCI+PHVzZSB4bGluazpocmVmPVwiI2ljb24tYWRtaW4tbGlua1wiPjwvdXNlPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPjwvYT5cclxuICAgICAgICAgPC9kaXY+YCA6ICcnfVxyXG4gICAgICAgICA8ZGl2IGNsYXNzPVwiYWRtaW5CYXItbGlua3NcIj5cclxuICAgICAgICAgICAgJHtjb250ZXh0dWFsTWF0Y2ggPyBgPGEgaHJlZj0nJHtzZWN1cmVCYXNlVXJsfSR7Y29udGV4dHVhbE1hdGNoLnVybH0nIHRhcmdldD1cIl9ibGFua1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctYmFzZWxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnPjx1c2UgeGxpbms6aHJlZj1cIiNpY29uLWFkbWluLWVkaXRcIj48L3VzZT48L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj48c3BhbiBjbGFzcz1cImFkbWluQmFyLWxhcmdlXCI+IEVkaXQgJHtjb250ZXh0dWFsTWF0Y2gudHlwZX0gaW5mb3JtYXRpb248L3NwYW4+PC9hPmAgOiAnJ31cclxuICAgICAgICAgICAgPGEgaHJlZj1cIiR7c2VjdXJlQmFzZVVybH0vbWFuYWdlL3BhZ2UtYnVpbGRlcj9jaGFubmVsSWQ9JHtjaGFubmVsSWR9JnJlZGlyZWN0SWZyYW1lVXJsPSR7dXJsfVwiIHRhcmdldD1cIl9ibGFua1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctYmFzZWxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnPjx1c2UgeGxpbms6aHJlZj1cIiNpY29uLWFkbWluLWJydXNoXCI+PC91c2U+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+PHNwYW4gY2xhc3M9XCJhZG1pbkJhci1sYXJnZVwiPiAke2xhbmdbJ2FkbWluLnBhZ2VfYnVpbGRlcl9saW5rJ119PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICA8ZGl2IGNsYXNzPVwiYWRtaW5CYXItY2xvc2VcIiBpZD1cImNsb3NlLWFkbWluLWJhclwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIHN2Zy1iYXNlbGluZVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2Zz48dXNlIHhsaW5rOmhyZWY9XCIjaWNvbi1hZG1pbi1jbG9zZVwiPjwvdXNlPjwvc3ZnPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PmApO1xyXG5cclxuICAgICQoJ2JvZHknKS5hZGRDbGFzcygnaGFzQWRtaW5CYXInKTtcclxuICAgICQoJ2JvZHknKS5hcHBlbmQoJGVsZW1lbnQpO1xyXG5cclxuICAgICQoJyNjbG9zZS1hZG1pbi1iYXInKS5jbGljaygoKSA9PiB7XHJcbiAgICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCdoYXNBZG1pbkJhcicpO1xyXG4gICAgICAgICQoJy5hZG1pbkJhcicpLnJlbW92ZSgpO1xyXG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9ICdBRE1JTl9CQVI9MDsgcGF0aD0vJztcclxuICAgIH0pO1xyXG59XHJcbiIsImltcG9ydCAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uL2ZvdW5kYXRpb24nO1xyXG5pbXBvcnQgJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi9mb3VuZGF0aW9uLmRyb3Bkb3duJztcclxuaW1wb3J0IHV0aWxzIGZyb20gJ0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzJztcclxuXHJcbmV4cG9ydCBjb25zdCBDYXJ0UHJldmlld0V2ZW50cyA9IHtcclxuICAgIGNsb3NlOiAnY2xvc2VkLmZuZHRuLmRyb3Bkb3duJyxcclxuICAgIG9wZW46ICdvcGVuZWQuZm5kdG4uZHJvcGRvd24nLFxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHNlY3VyZUJhc2VVcmwsIGNhcnRJZCkge1xyXG4gICAgY29uc3QgbG9hZGluZ0NsYXNzID0gJ2lzLWxvYWRpbmcnO1xyXG4gICAgY29uc3QgJGNhcnQgPSAkKCdbZGF0YS1jYXJ0LXByZXZpZXddJyk7XHJcbiAgICBjb25zdCAkY2FydERyb3Bkb3duID0gJCgnI2NhcnQtcHJldmlldy1kcm9wZG93bicpO1xyXG4gICAgY29uc3QgJGNhcnRMb2FkaW5nID0gJCgnPGRpdiBjbGFzcz1cImxvYWRpbmdPdmVybGF5XCI+PC9kaXY+Jyk7XHJcblxyXG4gICAgY29uc3QgJGJvZHkgPSAkKCdib2R5Jyk7XHJcblxyXG4gICAgaWYgKHdpbmRvdy5BcHBsZVBheVNlc3Npb24pIHtcclxuICAgICAgICAkY2FydERyb3Bkb3duLmFkZENsYXNzKCdhcHBsZS1wYXktc3VwcG9ydGVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgJGJvZHkub24oJ2NhcnQtcXVhbnRpdHktdXBkYXRlJywgKGV2ZW50LCBxdWFudGl0eSkgPT4ge1xyXG4vLyAgICAgICAgICRjYXJ0LmF0dHIoJ2FyaWEtbGFiZWwnLCAoXywgcHJldlZhbHVlKSA9PiBwcmV2VmFsdWUucmVwbGFjZSgvXFxkKy8sIHF1YW50aXR5KSk7XHJcblxyXG4gICAgICAgIGlmICghcXVhbnRpdHkpIHtcclxuICAgICAgICAgICAgJGNhcnQuYWRkQ2xhc3MoJ25hdlVzZXItaXRlbS0tY2FydF9faGlkZGVuLXMnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkY2FydC5yZW1vdmVDbGFzcygnbmF2VXNlci1pdGVtLS1jYXJ0X19oaWRkZW4tcycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJCgnLmNhcnQtcXVhbnRpdHknKVxyXG4gICAgICAgICAgICAudGV4dChxdWFudGl0eSlcclxuICAgICAgICAgICAgLnRvZ2dsZUNsYXNzKCdjb3VudFBpbGwtLXBvc2l0aXZlJywgcXVhbnRpdHkgPiAwKTtcclxuICAgICAgICBpZiAodXRpbHMudG9vbHMuc3RvcmFnZS5sb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSkge1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FydC1xdWFudGl0eScsIHF1YW50aXR5KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAkY2FydC5vbignY2xpY2snLCBldmVudCA9PiB7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICdjb21tb24vY2FydC1wcmV2aWV3JyxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBSZWRpcmVjdCB0byBmdWxsIGNhcnQgcGFnZVxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Ccm93c2VyX2RldGVjdGlvbl91c2luZ190aGVfdXNlcl9hZ2VudFxyXG4gICAgICAgIC8vIEluIHN1bW1hcnksIHdlIHJlY29tbWVuZCBsb29raW5nIGZvciB0aGUgc3RyaW5nICdNb2JpJyBhbnl3aGVyZSBpbiB0aGUgVXNlciBBZ2VudCB0byBkZXRlY3QgYSBtb2JpbGUgZGV2aWNlLlxyXG4gICAgICAgIGlmICgvTW9iaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgJGNhcnREcm9wZG93blxyXG4gICAgICAgICAgICAuYWRkQ2xhc3MobG9hZGluZ0NsYXNzKVxyXG4gICAgICAgICAgICAuaHRtbCgkY2FydExvYWRpbmcpO1xyXG4gICAgICAgICRjYXJ0TG9hZGluZ1xyXG4gICAgICAgICAgICAuc2hvdygpO1xyXG5cclxuICAgICAgICB1dGlscy5hcGkuY2FydC5nZXRDb250ZW50KG9wdGlvbnMsIChlcnIsIHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICRjYXJ0RHJvcGRvd25cclxuICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcyhsb2FkaW5nQ2xhc3MpXHJcbiAgICAgICAgICAgICAgICAuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgICAgICRjYXJ0TG9hZGluZ1xyXG4gICAgICAgICAgICAgICAgLmhpZGUoKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBxdWFudGl0eSA9IDA7XHJcblxyXG4gICAgaWYgKGNhcnRJZCkge1xyXG4gICAgICAgIC8vIEdldCBleGlzdGluZyBxdWFudGl0eSBmcm9tIGxvY2FsU3RvcmFnZSBpZiBmb3VuZFxyXG4gICAgICAgIGlmICh1dGlscy50b29scy5zdG9yYWdlLmxvY2FsU3RvcmFnZUF2YWlsYWJsZSgpKSB7XHJcbiAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydC1xdWFudGl0eScpKSB7XHJcbiAgICAgICAgICAgICAgICBxdWFudGl0eSA9IE51bWJlcihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydC1xdWFudGl0eScpKTtcclxuICAgICAgICAgICAgICAgICRib2R5LnRyaWdnZXIoJ2NhcnQtcXVhbnRpdHktdXBkYXRlJywgcXVhbnRpdHkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBHZXQgdXBkYXRlZCBjYXJ0IHF1YW50aXR5IGZyb20gdGhlIENhcnQgQVBJXHJcbiAgICAgICAgY29uc3QgY2FydFF0eVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHV0aWxzLmFwaS5jYXJ0LmdldENhcnRRdWFudGl0eSh7IGJhc2VVcmw6IHNlY3VyZUJhc2VVcmwsIGNhcnRJZCB9LCAoZXJyLCBxdHkpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGFwcGVhcnMgdG8gYmUgYSA0MDQgZm9yIHRoZSBjYXJ0IElELCBzZXQgY2FydCBxdWFudGl0eSB0byAwXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PT0gJ05vdCBGb3VuZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgwKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHF0eSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgQ2FydCBBUEkgZ2l2ZXMgdXMgYSBkaWZmZXJlbnQgcXVhbnRpdHkgbnVtYmVyLCB1cGRhdGUgaXRcclxuICAgICAgICBjYXJ0UXR5UHJvbWlzZS50aGVuKHF0eSA9PiB7XHJcbiAgICAgICAgICAgIHF1YW50aXR5ID0gcXR5O1xyXG4gICAgICAgICAgICAkYm9keS50cmlnZ2VyKCdjYXJ0LXF1YW50aXR5LXVwZGF0ZScsIHF1YW50aXR5KTtcclxuICAgICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgJGJvZHkudHJpZ2dlcignY2FydC1xdWFudGl0eS11cGRhdGUnLCBxdWFudGl0eSk7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHV0aWxzIGZyb20gJ0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzJztcclxuXHJcbi8qKlxyXG4gKiBFdXJvcGVhbiB3ZWJzaXRlcyBtdXN0IG5vdGlmeSB1c2VycyBvZiBjb29raWVzIHRvIGNvbXBseSB3aXRoIEV1cm9wZWFuIFVuaW9uIGxhdy5cclxuICogVGhpcyB3aWxsIGFsZXJ0IHNob3BwZXJzIHRoYXQgdGhpcyB3ZWJzaXRlIHVzZXMgY29va2llcy5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpIHtcclxuICAgIC8qXHJcbiAgICAvLyBIZXJlIHlvdSBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYnJvd3NlciBhbGVydCBib3ggYnkgaG9va2luZyB0byB0aGUgJ2Nvb2tpZS1wcml2YWN5LW5vdGlmaWNhdGlvbicgaG9vay5cclxuICAgIHV0aWxzLmhvb2tzLm9uKCdjb29raWUtcHJpdmFjeS1ub3RpZmljYXRpb24nLCAoZXZlbnQsIHByaXZhY3lNZXNzYWdlKSA9PiB7XHJcbiAgICAgICAgLy8gWW91IGNhbiBtYWtlIHlvdXIgb3duIGN1c3RvbSBtb2RhbCBvciBhbGVydCBib3ggYXBwZWFyIGluIHlvdXIgdGhlbWUgdXNpbmcgdGhlIHByaXZhY3lNZXNzYWdlIHByb3ZpZGVkXHJcbiAgICAgICAgbXlDdXN0b21BbGVydChwcml2YWN5TWVzc2FnZSk7XHJcblxyXG4gICAgICAgIC8vIENhbGwgZXZlbnQucHJldmVudERlZmF1bHQoKSB0byBwcmV2ZW50IHRoZSBkZWZhdWx0IGJyb3dzZXIgYWxlcnQgZnJvbSBvY2N1cnJpbmcgaW4gc3RlbmNpbC11dGlsc1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9KTtcclxuICAgICovXHJcblxyXG4gICAgY29uc3QgJHByaXZhY3lEaWFsb2cgPSAkKCcuY29va2llTWVzc2FnZScpO1xyXG5cclxuICAgIGlmIChkb2N1bWVudC5jb29raWUuaW5kZXhPZignQUNDRVBUX0NPT0tJRV9VU0FHRScpID09PSAtMSkge1xyXG4gICAgICAgICRwcml2YWN5RGlhbG9nLnNob3coKTtcclxuICAgIH1cclxuXHJcbiAgICAkKCdib2R5Jykub24oJ2NsaWNrJywgJ1tkYXRhLXByaXZhY3ktYWNjZXB0XScsICgpID0+IHtcclxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyAzNjUpO1xyXG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGBBQ0NFUFRfQ09PS0lFX1VTQUdFPTE7ZXhwaXJlcz0ke2RhdGUudG9HTVRTdHJpbmcoKX07IHBhdGg9L2A7XHJcblxyXG4gICAgICAgIHV0aWxzLmhvb2tzLmVtaXQoJ2Nvb2tpZS1wcml2YWN5LWFjY2VwdGVkJyk7XHJcbiAgICAgICAgJHByaXZhY3lEaWFsb2cuaGlkZSgpO1xyXG4gICAgfSk7XHJcbn1cclxuIiwiaW1wb3J0IHN3YWwgZnJvbSAnLi9zd2VldC1hbGVydCc7XHJcbmltcG9ydCB1dGlscyBmcm9tICdAYmlnY29tbWVyY2Uvc3RlbmNpbC11dGlscyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoY2FydElkKSB7XHJcbiAgICBmdW5jdGlvbiBjaGFuZ2VDdXJyZW5jeSh1cmwsIGN1cnJlbmN5Q29kZSkge1xyXG4gICAgICAgICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybCxcclxuICAgICAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHsgY3VycmVuY3lDb2RlIH0pLFxyXG4gICAgICAgIH0pLmRvbmUoKCkgPT4ge1xyXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgfSkuZmFpbCgoZSkgPT4ge1xyXG4gICAgICAgICAgICBzd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgdGV4dDogSlNPTi5wYXJzZShlLnJlc3BvbnNlVGV4dCkuZXJyb3IsXHJcbiAgICAgICAgICAgICAgICBpY29uOiAnd2FybmluZycsXHJcbiAgICAgICAgICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAkKCdbZGF0YS1jYXJ0LWN1cnJlbmN5LXN3aXRjaC11cmxdJykub24oJ2NsaWNrJywgZXZlbnQgPT4ge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbmN5U2Vzc2lvblN3aXRjaGVyID0gZXZlbnQudGFyZ2V0LmhyZWY7XHJcbiAgICAgICAgaWYgKCFjYXJ0SWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHV0aWxzLmFwaS5jYXJ0LmdldENhcnQoeyBjYXJ0SWQgfSwgKGVyciwgcmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVyciB8fCByZXNwb25zZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGN1cnJlbmN5U2Vzc2lvblN3aXRjaGVyO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzaG93V2FybmluZyA9IHJlc3BvbnNlLmRpc2NvdW50cy5zb21lKGRpc2NvdW50ID0+IGRpc2NvdW50LmRpc2NvdW50ZWRBbW91bnQgPiAwKSB8fFxyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UuY291cG9ucy5sZW5ndGggPiAwIHx8XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZS5saW5lSXRlbXMuZ2lmdENlcnRpZmljYXRlcy5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNob3dXYXJuaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICQoZXZlbnQudGFyZ2V0KS5kYXRhKCd3YXJuaW5nJyksXHJcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ3dhcm5pbmcnLFxyXG4gICAgICAgICAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgICB9KS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC52YWx1ZSAmJiByZXN1bHQudmFsdWUgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlQ3VycmVuY3koJChldmVudC50YXJnZXQpLmRhdGEoJ2NhcnQtY3VycmVuY3ktc3dpdGNoLXVybCcpLCAkKGV2ZW50LnRhcmdldCkuZGF0YSgnY3VycmVuY3ktY29kZScpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNoYW5nZUN1cnJlbmN5KCQoZXZlbnQudGFyZ2V0KS5kYXRhKCdjYXJ0LWN1cnJlbmN5LXN3aXRjaC11cmwnKSwgJChldmVudC50YXJnZXQpLmRhdGEoJ2N1cnJlbmN5LWNvZGUnKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcbiIsImltcG9ydCAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uL2ZvdW5kYXRpb24nO1xyXG5pbXBvcnQgJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi9mb3VuZGF0aW9uLmRyb3Bkb3duJztcclxuaW1wb3J0ICdmb3VuZGF0aW9uLXNpdGVzL2pzL2ZvdW5kYXRpb24vZm91bmRhdGlvbi5yZXZlYWwnO1xyXG5pbXBvcnQgJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi9mb3VuZGF0aW9uLnRhYic7XHJcbmltcG9ydCBtb2RhbEZhY3RvcnkgZnJvbSAnLi9tb2RhbCc7XHJcbmltcG9ydCByZXZlYWxDbG9zZUZhY3RvcnkgZnJvbSAnLi9yZXZlYWwtY2xvc2UnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCRlbGVtZW50KSB7XHJcbiAgICAkZWxlbWVudC5mb3VuZGF0aW9uKHtcclxuICAgICAgICBkcm9wZG93bjoge1xyXG4gICAgICAgICAgICAvLyBzcGVjaWZ5IHRoZSBjbGFzcyB1c2VkIGZvciBhY3RpdmUgZHJvcGRvd25zXHJcbiAgICAgICAgICAgIGFjdGl2ZV9jbGFzczogJ2lzLW9wZW4nLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmV2ZWFsOiB7XHJcbiAgICAgICAgICAgIGJnX2NsYXNzOiAnbW9kYWwtYmFja2dyb3VuZCcsXHJcbiAgICAgICAgICAgIGRpc21pc3NfbW9kYWxfY2xhc3M6ICdtb2RhbC1jbG9zZScsXHJcbiAgICAgICAgICAgIGNsb3NlX29uX2JhY2tncm91bmRfY2xpY2s6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB0YWI6IHtcclxuICAgICAgICAgICAgYWN0aXZlX2NsYXNzOiAnaXMtYWN0aXZlJyxcclxuICAgICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgbW9kYWxGYWN0b3J5KCdbZGF0YS1yZXZlYWxdJywgeyAkY29udGV4dDogJGVsZW1lbnQgfSk7XHJcbiAgICByZXZlYWxDbG9zZUZhY3RvcnkoJ1tkYXRhLXJldmVhbC1jbG9zZV0nLCB7ICRjb250ZXh0OiAkZWxlbWVudCB9KTtcclxufVxyXG4iLCIvLyBOZWVkZWQgYmVjYXVzZSB3ZSB1c2UgRm91bmRhdGlvbiA1LjUsIHdoaWNoIGV4cGVjdHMgalF1ZXJ5IDIueC4gSG93ZXZlcixcclxuLy8gcmF0aGVyIHRoYW4gYnJpbmdpbmcgaW4gYWxsIG9mIGpxdWVyeS1taWdyYXRlLCB3ZSdyZSBjaGVycnkgcGlja2luZyBpbmRpdmlkdWFsXHJcbi8vIGZpeGVzIG5lZWRlZCBmb3IgRm91bmRhdGlvbi5cclxuaW1wb3J0IGluaXQgZnJvbSAnLi9qcXVlcnktbWlncmF0ZS9pbml0JztcclxuaW1wb3J0IHRyYXZlcnNpbmcgZnJvbSAnLi9qcXVlcnktbWlncmF0ZS90cmF2ZXJzaW5nJztcclxuaW1wb3J0IGRhdGEgZnJvbSAnLi9qcXVlcnktbWlncmF0ZS9kYXRhJztcclxuaW1wb3J0IGV2ZW50cyBmcm9tICcuL2pxdWVyeS1taWdyYXRlL2V2ZW50JztcclxuXHJcbmluaXQoKTtcclxudHJhdmVyc2luZygpO1xyXG5kYXRhKCk7XHJcbmV2ZW50cygpO1xyXG4iLCIvLyBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LW1pZ3JhdGUvYmxvYi9tYXN0ZXIvc3JjL2RhdGEuanNcclxuLy9cclxuLy8gaHR0cHM6Ly9qcXVlcnkuY29tL3VwZ3JhZGUtZ3VpZGUvMy4wLyNkYXRhXHJcblxyXG4vKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItcmVzdC1wYXJhbXMsIGZ1bmMtbmFtZXMgKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc3Qgb2xkRGF0YSA9IGpRdWVyeS5kYXRhO1xyXG4gICAgalF1ZXJ5LmRhdGEgPSBmdW5jdGlvbiAoZWxlbSwgbmFtZSwgdmFsdWUpIHtcclxuICAgICAgICBsZXQgY3VyRGF0YTtcclxuXHJcbiAgICAgICAgLy8gTmFtZSBjYW4gYmUgYW4gb2JqZWN0LCBhbmQgZWFjaCBlbnRyeSBpbiB0aGUgb2JqZWN0IGlzIG1lYW50IHRvIGJlIHNldCBhcyBkYXRhXHJcbiAgICAgICAgaWYgKG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09ICdvYmplY3QnICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcclxuICAgICAgICAgICAgY3VyRGF0YSA9IGpRdWVyeS5oYXNEYXRhKGVsZW0pICYmIG9sZERhdGEuY2FsbCh0aGlzLCBlbGVtKTtcclxuICAgICAgICAgICAgY29uc3Qgc2FtZUtleXMgPSB7fTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbmFtZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPT0galF1ZXJ5LmNhbWVsQ2FzZShrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VyRGF0YVtrZXldID0gbmFtZVtrZXldO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzYW1lS2V5c1trZXldID0gbmFtZVtrZXldO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvbGREYXRhLmNhbGwodGhpcywgZWxlbSwgc2FtZUtleXMpO1xyXG4gICAgICAgICAgICByZXR1cm4gbmFtZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBuYW1lIGlzIHRyYW5zZm9ybWVkLCBsb29rIGZvciB0aGUgdW4tdHJhbnNmb3JtZWQgbmFtZSBpbiB0aGUgZGF0YSBvYmplY3RcclxuICAgICAgICBpZiAobmFtZSAmJiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgJiYgbmFtZSAhPT0galF1ZXJ5LmNhbWVsQ2FzZShuYW1lKSkge1xyXG4gICAgICAgICAgICBjdXJEYXRhID0galF1ZXJ5Lmhhc0RhdGEoZWxlbSkgJiYgb2xkRGF0YS5jYWxsKHRoaXMsIGVsZW0pO1xyXG4gICAgICAgICAgICBpZiAoY3VyRGF0YSAmJiBuYW1lIGluIGN1ckRhdGEpIHtcclxuICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xyXG4gICAgICAgICAgICAgICAgICAgIGN1ckRhdGFbbmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJEYXRhW25hbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb2xkRGF0YS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgfTtcclxufVxyXG4vKiBlc2xpbnQtZW5hYmxlIHByZWZlci1yZXN0LXBhcmFtcyAqL1xyXG4iLCIvLyBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LW1pZ3JhdGUvYmxvYi9tYXN0ZXIvc3JjL2V2ZW50LmpzXHJcbi8vXHJcbi8vIGh0dHBzOi8vanF1ZXJ5LmNvbS91cGdyYWRlLWd1aWRlLzMuMC8jYnJlYWtpbmctY2hhbmdlLWxvYWQtdW5sb2FkLWFuZC1lcnJvci1yZW1vdmVkXHJcblxyXG4vKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItcmVzdC1wYXJhbXMgKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xyXG4gICAgalF1ZXJ5LmVhY2goWydsb2FkJywgJ3VubG9hZCcsICdlcnJvciddLCAoXywgbmFtZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG9sZExvYWQgPSBqUXVlcnkuZm4ubG9hZDtcclxuXHJcbiAgICAgICAgalF1ZXJ5LmZuW25hbWVdID0gZnVuY3Rpb24gaGFuZGxlcigpIHtcclxuICAgICAgICAgICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIGFqYXggbG9hZCgpIHRoZSBmaXJzdCBhcmcgc2hvdWxkIGJlIHRoZSBzdHJpbmcgVVJMO1xyXG4gICAgICAgICAgICAvLyB0ZWNobmljYWxseSB0aGlzIGNvdWxkIGFsc28gYmUgdGhlIFwiQW55dGhpbmdcIiBhcmcgb2YgdGhlIGV2ZW50IC5sb2FkKClcclxuICAgICAgICAgICAgLy8gd2hpY2gganVzdCBnb2VzIHRvIHNob3cgd2h5IHRoaXMgZHVtYiBzaWduYXR1cmUgaGFzIGJlZW4gZGVwcmVjYXRlZCFcclxuICAgICAgICAgICAgLy8galF1ZXJ5IGN1c3RvbSBidWlsZHMgdGhhdCBleGNsdWRlIHRoZSBBamF4IG1vZHVsZSBqdXN0aWZpYWJseSBkaWUgaGVyZS5cclxuICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdsb2FkJyAmJiB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvbGRMb2FkLmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBhcmdzLnNwbGljZSgwLCAwLCBuYW1lKTtcclxuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9uLmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBVc2UgLnRyaWdnZXJIYW5kbGVyIGhlcmUgYmVjYXVzZTpcclxuICAgICAgICAgICAgLy8gLSBsb2FkIGFuZCB1bmxvYWQgZXZlbnRzIGRvbid0IG5lZWQgdG8gYnViYmxlLCBvbmx5IGFwcGxpZWQgdG8gd2luZG93IG9yIGltYWdlXHJcbiAgICAgICAgICAgIC8vIC0gZXJyb3IgZXZlbnQgc2hvdWxkIG5vdCBidWJibGUgdG8gd2luZG93LCBhbHRob3VnaCBpdCBkb2VzIHByZS0xLjdcclxuICAgICAgICAgICAgLy8gU2VlIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzExODIwXHJcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlckhhbmRsZXIuYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH07XHJcbiAgICB9KTtcclxufVxyXG4vKiBlc2xpbnQtZW5hYmxlIHByZWZlci1yZXN0LXBhcmFtcyAqL1xyXG4iLCIvLyBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LW1pZ3JhdGUvYmxvYi8xLngtc3RhYmxlL3NyYy9jb3JlLmpzXHJcbi8vXHJcbi8vIGh0dHBzOi8vanF1ZXJ5LmNvbS91cGdyYWRlLWd1aWRlLzMuMC8jYnJlYWtpbmctY2hhbmdlLWRlcHJlY2F0ZWQtY29udGV4dC1hbmQtc2VsZWN0b3ItcHJvcGVydGllcy1yZW1vdmVkXHJcblxyXG4vKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItcmVzdC1wYXJhbXMsIGZ1bmMtbmFtZXMgKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc3Qgb2xkSW5pdCA9IGpRdWVyeS5mbi5pbml0O1xyXG5cclxuICAgIGpRdWVyeS5mbi5pbml0ID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBjb250ZXh0KSB7XHJcbiAgICAgICAgY29uc3QgcmV0ID0gb2xkSW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG5cclxuICAgICAgICAvLyBGaWxsIGluIHNlbGVjdG9yIGFuZCBjb250ZXh0IHByb3BlcnRpZXMgc28gLmxpdmUoKSB3b3Jrc1xyXG4gICAgICAgIGlmIChzZWxlY3RvciAmJiBzZWxlY3Rvci5zZWxlY3RvciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vIEEgalF1ZXJ5IG9iamVjdCwgY29weSBpdHMgcHJvcGVydGllc1xyXG4gICAgICAgICAgICByZXQuc2VsZWN0b3IgPSBzZWxlY3Rvci5zZWxlY3RvcjtcclxuICAgICAgICAgICAgcmV0LmNvbnRleHQgPSBzZWxlY3Rvci5jb250ZXh0O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldC5zZWxlY3RvciA9IHR5cGVvZiBzZWxlY3RvciA9PT0gJ3N0cmluZycgPyBzZWxlY3RvciA6ICcnO1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0b3IpIHtcclxuICAgICAgICAgICAgICAgIHJldC5jb250ZXh0ID0gc2VsZWN0b3Iubm9kZVR5cGUgPyBzZWxlY3RvciA6IGNvbnRleHQgfHwgZG9jdW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXQ7XHJcbiAgICB9O1xyXG5cclxuICAgIGpRdWVyeS5mbi5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjtcclxufVxyXG4vKiBlc2xpbnQtZW5hYmxlIHByZWZlci1yZXN0LXBhcmFtcyAqL1xyXG4iLCIvLyBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LW1pZ3JhdGUvYmxvYi8xLngtc3RhYmxlL3NyYy90cmF2ZXJzaW5nLmpzXHJcbi8vXHJcbi8vIGh0dHBzOi8vanF1ZXJ5LmNvbS91cGdyYWRlLWd1aWRlLzMuMC8jYnJlYWtpbmctY2hhbmdlLWRlcHJlY2F0ZWQtY29udGV4dC1hbmQtc2VsZWN0b3ItcHJvcGVydGllcy1yZW1vdmVkXHJcblxyXG4vKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItcmVzdC1wYXJhbXMsIGZ1bmMtbmFtZXMgKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc3Qgb2xkRm5GaW5kID0galF1ZXJ5LmZuLmZpbmQ7XHJcblxyXG4gICAgalF1ZXJ5LmZuLmZpbmQgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcclxuICAgICAgICBjb25zdCByZXQgPSBvbGRGbkZpbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgICByZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDtcclxuICAgICAgICByZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yID8gYCR7dGhpcy5zZWxlY3Rvcn0gJHtzZWxlY3Rvcn1gIDogc2VsZWN0b3I7XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgIH07XHJcbn1cclxuLyogZXNsaW50LWVuYWJsZSBwcmVmZXItcmVzdC1wYXJhbXMgKi9cclxuIiwiaW1wb3J0IE5hbm9iYXIgZnJvbSAnbmFub2Jhcic7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKSB7XHJcbiAgICAvLyBDcmVhdGUgdGhlIG5hbm9iYXIgaW5zdGFuY2VcclxuICAgIGNvbnN0IG5hbm9iYXIgPSBuZXcgTmFub2JhcigpO1xyXG5cclxuICAgIC8vIFRpbWVyIGZvciBtb3ZpbmcgcHJvZ3Jlc3MgYmFyIGR1cmluZyBhamF4IGNhbGxzXHJcbiAgICBsZXQgdGltZXIgPSBudWxsO1xyXG4gICAgbGV0IGN1cnJlbnQgPSAwO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyVGltZXIoKSB7XHJcbiAgICAgICAgaWYgKHRpbWVyKSB7XHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpO1xyXG4gICAgICAgICAgICB0aW1lciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNldFRpbWVyKCkge1xyXG4gICAgICAgIGNsZWFyVGltZXIoKTtcclxuXHJcbiAgICAgICAgY3VycmVudCA9IDA7XHJcbiAgICAgICAgdGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGN1cnJlbnQgKz0gMztcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPD0gMTAwKSB7XHJcbiAgICAgICAgICAgICAgICBuYW5vYmFyLmdvKGN1cnJlbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgNTApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEF0dGFjaCBnbG9iYWwganF1ZXJ5IGhhbmRsZXJzIHRvIGxpc3RlbiBmb3IgYWpheCBzdGFydFxyXG4gICAgJChkb2N1bWVudCkuYWpheFNlbmQoKCkgPT4ge1xyXG4gICAgICAgIHNldFRpbWVyKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAkKGRvY3VtZW50KS5hamF4Q29tcGxldGUoKCkgPT4ge1xyXG4gICAgICAgIG5hbm9iYXIuZ28oMTAwKTtcclxuICAgICAgICBjbGVhclRpbWVyKCk7XHJcbiAgICB9KTtcclxufVxyXG4iLCJpbXBvcnQgY29sbGFwc2libGVGYWN0b3J5IGZyb20gJy4uL2NvbW1vbi9jb2xsYXBzaWJsZSc7XHJcbmltcG9ydCBjb2xsYXBzaWJsZUdyb3VwRmFjdG9yeSBmcm9tICcuLi9jb21tb24vY29sbGFwc2libGUtZ3JvdXAnO1xyXG5cclxuY29uc3QgUExVR0lOX0tFWSA9ICdtZW51JztcclxuXHJcbi8qXHJcbiAqIE1hbmFnZSB0aGUgYmVoYXZpb3VyIG9mIGEgbWVudVxyXG4gKiBAcGFyYW0ge2pRdWVyeX0gJG1lbnVcclxuICovXHJcbmNsYXNzIE1lbnUge1xyXG4gICAgY29uc3RydWN0b3IoJG1lbnUpIHtcclxuICAgICAgICB0aGlzLiRtZW51ID0gJG1lbnU7XHJcbiAgICAgICAgdGhpcy4kYm9keSA9ICQoJ2JvZHknKTtcclxuICAgICAgICB0aGlzLmhhc01heE1lbnVEaXNwbGF5RGVwdGggPSB0aGlzLiRib2R5LmZpbmQoJy5uYXZQYWdlcy1saXN0JykuaGFzQ2xhc3MoJ25hdlBhZ2VzLWxpc3QtZGVwdGgtbWF4Jyk7XHJcblxyXG4gICAgICAgIC8vIEluaXQgY29sbGFwc2libGVcclxuICAgICAgICB0aGlzLmNvbGxhcHNpYmxlcyA9IGNvbGxhcHNpYmxlRmFjdG9yeSgnW2RhdGEtY29sbGFwc2libGVdJywgeyAkY29udGV4dDogdGhpcy4kbWVudSB9KTtcclxuICAgICAgICB0aGlzLmNvbGxhcHNpYmxlR3JvdXBzID0gY29sbGFwc2libGVHcm91cEZhY3RvcnkoJG1lbnUpO1xyXG5cclxuICAgICAgICAvLyBBdXRvLWJpbmRcclxuICAgICAgICB0aGlzLm9uTWVudUNsaWNrID0gdGhpcy5vbk1lbnVDbGljay5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub25Eb2N1bWVudENsaWNrID0gdGhpcy5vbkRvY3VtZW50Q2xpY2suYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgLy8gTGlzdGVuXHJcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29sbGFwc2VBbGwoKSB7XHJcbiAgICAgICAgdGhpcy5jb2xsYXBzaWJsZXMuZm9yRWFjaChjb2xsYXBzaWJsZSA9PiBjb2xsYXBzaWJsZS5jbG9zZSgpKTtcclxuICAgICAgICB0aGlzLmNvbGxhcHNpYmxlR3JvdXBzLmZvckVhY2goZ3JvdXAgPT4gZ3JvdXAuY2xvc2UoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29sbGFwc2VOZWlnaGJvcnMoJG5laWdoYm9ycykge1xyXG4gICAgICAgIGNvbnN0ICRjb2xsYXBzaWJsZXMgPSBjb2xsYXBzaWJsZUZhY3RvcnkoJ1tkYXRhLWNvbGxhcHNpYmxlXScsIHsgJGNvbnRleHQ6ICRuZWlnaGJvcnMgfSk7XHJcblxyXG4gICAgICAgICRjb2xsYXBzaWJsZXMuZm9yRWFjaCgkY29sbGFwc2libGUgPT4gJGNvbGxhcHNpYmxlLmNsb3NlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGJpbmRFdmVudHMoKSB7XHJcbiAgICAgICAgdGhpcy4kbWVudS5vbignY2xpY2snLCB0aGlzLm9uTWVudUNsaWNrKTtcclxuICAgICAgICB0aGlzLiRib2R5Lm9uKCdjbGljaycsIHRoaXMub25Eb2N1bWVudENsaWNrKTtcclxuICAgIH1cclxuXHJcbiAgICB1bmJpbmRFdmVudHMoKSB7XHJcbiAgICAgICAgdGhpcy4kbWVudS5vZmYoJ2NsaWNrJywgdGhpcy5vbk1lbnVDbGljayk7XHJcbiAgICAgICAgdGhpcy4kYm9keS5vZmYoJ2NsaWNrJywgdGhpcy5vbkRvY3VtZW50Q2xpY2spO1xyXG4gICAgfVxyXG5cclxuICAgIG9uTWVudUNsaWNrKGV2ZW50KSB7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmhhc01heE1lbnVEaXNwbGF5RGVwdGgpIHtcclxuICAgICAgICAgICAgY29uc3QgJG5laWdoYm9ycyA9ICQoZXZlbnQudGFyZ2V0KS5wYXJlbnQoKS5zaWJsaW5ncygpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jb2xsYXBzZU5laWdoYm9ycygkbmVpZ2hib3JzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25Eb2N1bWVudENsaWNrKCkge1xyXG4gICAgICAgIHRoaXMuY29sbGFwc2VBbGwoKTtcclxuICAgIH1cclxufVxyXG5cclxuLypcclxuICogQ3JlYXRlIGEgbmV3IE1lbnUgaW5zdGFuY2VcclxuICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl1cclxuICogQHJldHVybiB7TWVudX1cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lbnVGYWN0b3J5KHNlbGVjdG9yID0gYFtkYXRhLSR7UExVR0lOX0tFWX1dYCkge1xyXG4gICAgY29uc3QgJG1lbnUgPSAkKHNlbGVjdG9yKS5lcSgwKTtcclxuICAgIGNvbnN0IGluc3RhbmNlS2V5ID0gYCR7UExVR0lOX0tFWX1JbnN0YW5jZWA7XHJcbiAgICBjb25zdCBjYWNoZWRNZW51ID0gJG1lbnUuZGF0YShpbnN0YW5jZUtleSk7XHJcblxyXG4gICAgaWYgKGNhY2hlZE1lbnUgaW5zdGFuY2VvZiBNZW51KSB7XHJcbiAgICAgICAgcmV0dXJuIGNhY2hlZE1lbnU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbWVudSA9IG5ldyBNZW51KCRtZW51KTtcclxuXHJcbiAgICAkbWVudS5kYXRhKGluc3RhbmNlS2V5LCBtZW51KTtcclxuXHJcbiAgICByZXR1cm4gbWVudTtcclxufVxyXG4iLCJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgbWVkaWFRdWVyeUxpc3RGYWN0b3J5IGZyb20gJy4uL2NvbW1vbi9tZWRpYS1xdWVyeS1saXN0JztcclxuaW1wb3J0IHsgQ2FydFByZXZpZXdFdmVudHMgfSBmcm9tICcuL2NhcnQtcHJldmlldyc7XHJcblxyXG5jb25zdCBQTFVHSU5fS0VZID0ge1xyXG4gICAgQ0FNRUw6ICdtb2JpbGVNZW51VG9nZ2xlJyxcclxuICAgIFNOQUtFOiAnbW9iaWxlLW1lbnUtdG9nZ2xlJyxcclxufTtcclxuXHJcbmZ1bmN0aW9uIG9wdGlvbnNGcm9tRGF0YSgkZWxlbWVudCkge1xyXG4gICAgY29uc3QgbW9iaWxlTWVudUlkID0gJGVsZW1lbnQuZGF0YShQTFVHSU5fS0VZLkNBTUVMKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG1lbnVTZWxlY3RvcjogbW9iaWxlTWVudUlkICYmIGAjJHttb2JpbGVNZW51SWR9YCxcclxuICAgIH07XHJcbn1cclxuXHJcbi8qXHJcbiAqIE1hbmFnZSB0aGUgYmVoYXZpb3VyIG9mIGEgbW9iaWxlIG1lbnVcclxuICogQHBhcmFtIHtqUXVlcnl9ICR0b2dnbGVcclxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxyXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuaGVhZGVyU2VsZWN0b3JdXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5tZW51U2VsZWN0b3JdXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5zY3JvbGxWaWV3U2VsZWN0b3JdXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTW9iaWxlTWVudVRvZ2dsZSB7XHJcbiAgICBjb25zdHJ1Y3RvcigkdG9nZ2xlLCB7XHJcbiAgICAgICAgaGVhZGVyU2VsZWN0b3IgPSAnLmhlYWRlcicsXHJcbiAgICAgICAgbWVudVNlbGVjdG9yID0gJyNtZW51JyxcclxuICAgICAgICBzY3JvbGxWaWV3U2VsZWN0b3IgPSAnLm5hdlBhZ2VzJyxcclxuICAgIH0gPSB7fSkge1xyXG4gICAgICAgIHRoaXMuJGJvZHkgPSAkKCdib2R5Jyk7XHJcbiAgICAgICAgdGhpcy4kbWVudSA9ICQobWVudVNlbGVjdG9yKTtcclxuICAgICAgICB0aGlzLiRuYXZMaXN0ID0gJCgnLm5hdlBhZ2VzLWxpc3QubmF2UGFnZXMtbGlzdC1kZXB0aC1tYXgnKTtcclxuICAgICAgICB0aGlzLiRoZWFkZXIgPSAkKGhlYWRlclNlbGVjdG9yKTtcclxuICAgICAgICB0aGlzLiRzY3JvbGxWaWV3ID0gJChzY3JvbGxWaWV3U2VsZWN0b3IsIHRoaXMuJG1lbnUpO1xyXG4gICAgICAgIHRoaXMuJHN1Yk1lbnVzID0gdGhpcy4kbmF2TGlzdC5maW5kKCcubmF2UGFnZXMtYWN0aW9uJyk7XHJcbiAgICAgICAgdGhpcy4kdG9nZ2xlID0gJHRvZ2dsZTtcclxuICAgICAgICB0aGlzLm1lZGl1bU1lZGlhUXVlcnlMaXN0ID0gbWVkaWFRdWVyeUxpc3RGYWN0b3J5KCdtZWRpdW0nKTtcclxuXHJcbiAgICAgICAgLy8gQXV0by1iaW5kXHJcbiAgICAgICAgdGhpcy5vblRvZ2dsZUNsaWNrID0gdGhpcy5vblRvZ2dsZUNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5vbkNhcnRQcmV2aWV3T3BlbiA9IHRoaXMub25DYXJ0UHJldmlld09wZW4uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9uTWVkaXVtTWVkaWFRdWVyeU1hdGNoID0gdGhpcy5vbk1lZGl1bU1lZGlhUXVlcnlNYXRjaC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub25TdWJNZW51Q2xpY2sgPSB0aGlzLm9uU3ViTWVudUNsaWNrLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIC8vIExpc3RlblxyXG4gICAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xyXG5cclxuICAgICAgICAvLyBBc3NpZ24gRE9NIGF0dHJpYnV0ZXNcclxuICAgICAgICB0aGlzLiR0b2dnbGUuYXR0cignYXJpYS1jb250cm9scycsIHRoaXMuJG1lbnUuYXR0cignaWQnKSk7XHJcblxyXG4gICAgICAgIC8vIEhpZGUgYnkgZGVmYXVsdFxyXG4gICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc09wZW4oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuJG1lbnUuaGFzQ2xhc3MoJ2lzLW9wZW4nKTtcclxuICAgIH1cclxuXHJcbiAgICBiaW5kRXZlbnRzKCkge1xyXG4gICAgICAgIHRoaXMuJHRvZ2dsZS5vbignY2xpY2snLCB0aGlzLm9uVG9nZ2xlQ2xpY2spO1xyXG4gICAgICAgIHRoaXMuJGhlYWRlci5vbihDYXJ0UHJldmlld0V2ZW50cy5vcGVuLCB0aGlzLm9uQ2FydFByZXZpZXdPcGVuKTtcclxuICAgICAgICB0aGlzLiRzdWJNZW51cy5vbignY2xpY2snLCB0aGlzLm9uU3ViTWVudUNsaWNrKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubWVkaXVtTWVkaWFRdWVyeUxpc3QgJiYgdGhpcy5tZWRpdW1NZWRpYVF1ZXJ5TGlzdC5hZGRMaXN0ZW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLm1lZGl1bU1lZGlhUXVlcnlMaXN0LmFkZExpc3RlbmVyKHRoaXMub25NZWRpdW1NZWRpYVF1ZXJ5TWF0Y2gpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1bmJpbmRFdmVudHMoKSB7XHJcbiAgICAgICAgdGhpcy4kdG9nZ2xlLm9mZignY2xpY2snLCB0aGlzLm9uVG9nZ2xlQ2xpY2spO1xyXG4gICAgICAgIHRoaXMuJGhlYWRlci5vZmYoQ2FydFByZXZpZXdFdmVudHMub3BlbiwgdGhpcy5vbkNhcnRQcmV2aWV3T3Blbik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1lZGl1bU1lZGlhUXVlcnlMaXN0ICYmIHRoaXMubWVkaXVtTWVkaWFRdWVyeUxpc3QuYWRkTGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5tZWRpdW1NZWRpYVF1ZXJ5TGlzdC5yZW1vdmVMaXN0ZW5lcih0aGlzLm9uTWVkaXVtTWVkaWFRdWVyeU1hdGNoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdG9nZ2xlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdygpIHtcclxuICAgICAgICB0aGlzLiRib2R5LmFkZENsYXNzKCdoYXMtYWN0aXZlTmF2UGFnZXMnKTtcclxuXHJcbiAgICAgICAgdGhpcy4kdG9nZ2xlXHJcbiAgICAgICAgICAgIC5hZGRDbGFzcygnaXMtb3BlbicpXHJcbiAgICAgICAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuJG1lbnUuYWRkQ2xhc3MoJ2lzLW9wZW4nKTtcclxuXHJcbiAgICAgICAgdGhpcy4kaGVhZGVyLmFkZENsYXNzKCdpcy1vcGVuJyk7XHJcbiAgICAgICAgdGhpcy4kc2Nyb2xsVmlldy5zY3JvbGxUb3AoMCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVzZXRTdWJNZW51cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGUoKSB7XHJcbiAgICAgICAgdGhpcy4kYm9keS5yZW1vdmVDbGFzcygnaGFzLWFjdGl2ZU5hdlBhZ2VzJyk7XHJcblxyXG4gICAgICAgIHRoaXMuJHRvZ2dsZVxyXG4gICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2lzLW9wZW4nKVxyXG4gICAgICAgICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgdGhpcy4kbWVudS5yZW1vdmVDbGFzcygnaXMtb3BlbicpO1xyXG5cclxuICAgICAgICB0aGlzLiRoZWFkZXIucmVtb3ZlQ2xhc3MoJ2lzLW9wZW4nKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZXNldFN1Yk1lbnVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUHJpdmF0ZVxyXG4gICAgb25Ub2dnbGVDbGljayhldmVudCkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DYXJ0UHJldmlld09wZW4oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbk1lZGl1bU1lZGlhUXVlcnlNYXRjaChtZWRpYSkge1xyXG4gICAgICAgIGlmICghbWVkaWEubWF0Y2hlcykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBvblN1Yk1lbnVDbGljayhldmVudCkge1xyXG4gICAgICAgIGNvbnN0ICRjbG9zZXN0QWN0aW9uID0gJChldmVudC50YXJnZXQpLmNsb3Nlc3QoJy5uYXZQYWdlcy1hY3Rpb24nKTtcclxuICAgICAgICBjb25zdCAkcGFyZW50U2libGluZ3MgPSAkY2xvc2VzdEFjdGlvbi5wYXJlbnQoKS5zaWJsaW5ncygpO1xyXG4gICAgICAgIGNvbnN0ICRwYXJlbnRBY3Rpb24gPSAkY2xvc2VzdEFjdGlvbi5jbG9zZXN0KCcubmF2UGFnZS1zdWJNZW51LWhvcml6b250YWwnKS5zaWJsaW5ncygnLm5hdlBhZ2VzLWFjdGlvbicpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy4kc3ViTWVudXMuaGFzQ2xhc3MoJ2lzLW9wZW4nKSkge1xyXG4gICAgICAgICAgICB0aGlzLiRuYXZMaXN0LmFkZENsYXNzKCdzdWJNZW51LWlzLW9wZW4nKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLiRuYXZMaXN0LnJlbW92ZUNsYXNzKCdzdWJNZW51LWlzLW9wZW4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICgkKGV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ2lzLW9wZW4nKSkge1xyXG4gICAgICAgICAgICAkcGFyZW50U2libGluZ3MuYWRkQ2xhc3MoJ2lzLWhpZGRlbicpO1xyXG4gICAgICAgICAgICAkcGFyZW50QWN0aW9uLmFkZENsYXNzKCdpcy1oaWRkZW4nKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkcGFyZW50U2libGluZ3MucmVtb3ZlQ2xhc3MoJ2lzLWhpZGRlbicpO1xyXG4gICAgICAgICAgICAkcGFyZW50QWN0aW9uLnJlbW92ZUNsYXNzKCdpcy1oaWRkZW4nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRTdWJNZW51cygpIHtcclxuICAgICAgICB0aGlzLiRuYXZMaXN0LmZpbmQoJy5pcy1oaWRkZW4nKS5yZW1vdmVDbGFzcygnaXMtaGlkZGVuJyk7XHJcbiAgICAgICAgdGhpcy4kbmF2TGlzdC5yZW1vdmVDbGFzcygnc3ViTWVudS1pcy1vcGVuJyk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qXHJcbiAqIENyZWF0ZSBhIG5ldyBNb2JpbGVNZW51VG9nZ2xlIGluc3RhbmNlXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cclxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmhlYWRlclNlbGVjdG9yXVxyXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMubWVudVNlbGVjdG9yXVxyXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuc2Nyb2xsVmlld1NlbGVjdG9yXVxyXG4gKiBAcmV0dXJuIHtNb2JpbGVNZW51VG9nZ2xlfVxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbW9iaWxlTWVudVRvZ2dsZUZhY3Rvcnkoc2VsZWN0b3IgPSBgW2RhdGEtJHtQTFVHSU5fS0VZLlNOQUtFfV1gLCBvdmVycmlkZU9wdGlvbnMgPSB7fSkge1xyXG4gICAgY29uc3QgJHRvZ2dsZSA9ICQoc2VsZWN0b3IpLmVxKDApO1xyXG4gICAgY29uc3QgaW5zdGFuY2VLZXkgPSBgJHtQTFVHSU5fS0VZLkNBTUVMfUluc3RhbmNlYDtcclxuICAgIGNvbnN0IGNhY2hlZE1vYmlsZU1lbnUgPSAkdG9nZ2xlLmRhdGEoaW5zdGFuY2VLZXkpO1xyXG5cclxuICAgIGlmIChjYWNoZWRNb2JpbGVNZW51IGluc3RhbmNlb2YgTW9iaWxlTWVudVRvZ2dsZSkge1xyXG4gICAgICAgIHJldHVybiBjYWNoZWRNb2JpbGVNZW51O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG9wdGlvbnMgPSBfLmV4dGVuZChvcHRpb25zRnJvbURhdGEoJHRvZ2dsZSksIG92ZXJyaWRlT3B0aW9ucyk7XHJcbiAgICBjb25zdCBtb2JpbGVNZW51ID0gbmV3IE1vYmlsZU1lbnVUb2dnbGUoJHRvZ2dsZSwgb3B0aW9ucyk7XHJcblxyXG4gICAgJHRvZ2dsZS5kYXRhKGluc3RhbmNlS2V5LCBtb2JpbGVNZW51KTtcclxuXHJcbiAgICByZXR1cm4gbW9iaWxlTWVudTtcclxufVxyXG4iLCJpbXBvcnQgZm91bmRhdGlvbiBmcm9tICcuL2ZvdW5kYXRpb24nO1xyXG5pbXBvcnQgKiBhcyBmb2N1c1RyYXAgZnJvbSAnZm9jdXMtdHJhcCc7XHJcblxyXG5jb25zdCBib2R5QWN0aXZlQ2xhc3MgPSAnaGFzLWFjdGl2ZU1vZGFsJztcclxuY29uc3QgbG9hZGluZ092ZXJsYXlDbGFzcyA9ICdsb2FkaW5nT3ZlcmxheSc7XHJcbmNvbnN0IG1vZGFsQm9keUNsYXNzID0gJ21vZGFsLWJvZHknO1xyXG5jb25zdCBtb2RhbENvbnRlbnRDbGFzcyA9ICdtb2RhbC1jb250ZW50JztcclxuXHJcbmNvbnN0IFNpemVDbGFzc2VzID0ge1xyXG4gICAgc21hbGw6ICdtb2RhbC0tc21hbGwnLFxyXG4gICAgbGFyZ2U6ICdtb2RhbC0tbGFyZ2UnLFxyXG4gICAgbm9ybWFsOiAnJyxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBNb2RhbEV2ZW50cyA9IHtcclxuICAgIGNsb3NlOiAnY2xvc2UuZm5kdG4ucmV2ZWFsJyxcclxuICAgIGNsb3NlZDogJ2Nsb3NlZC5mbmR0bi5yZXZlYWwnLFxyXG4gICAgb3BlbjogJ29wZW4uZm5kdG4ucmV2ZWFsJyxcclxuICAgIG9wZW5lZDogJ29wZW5lZC5mbmR0bi5yZXZlYWwnLFxyXG4gICAgbG9hZGVkOiAnbG9hZGVkLmRhdGEuY3VzdG9tJyxcclxufTtcclxuXHJcbmZ1bmN0aW9uIGdldFNpemVGcm9tTW9kYWwoJG1vZGFsKSB7XHJcbiAgICBpZiAoJG1vZGFsLmhhc0NsYXNzKFNpemVDbGFzc2VzLnNtYWxsKSkge1xyXG4gICAgICAgIHJldHVybiAnc21hbGwnO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICgkbW9kYWwuaGFzQ2xhc3MoU2l6ZUNsYXNzZXMubGFyZ2UpKSB7XHJcbiAgICAgICAgcmV0dXJuICdsYXJnZSc7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuICdub3JtYWwnO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRWaWV3cG9ydEhlaWdodChtdWx0aXBsZXIgPSAxKSB7XHJcbiAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTtcclxuXHJcbiAgICByZXR1cm4gdmlld3BvcnRIZWlnaHQgKiBtdWx0aXBsZXI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdyYXBNb2RhbEJvZHkoY29udGVudCkge1xyXG4gICAgY29uc3QgJG1vZGFsQm9keSA9ICQoJzxkaXY+Jyk7XHJcblxyXG4gICAgJG1vZGFsQm9keVxyXG4gICAgICAgIC5hZGRDbGFzcyhtb2RhbEJvZHlDbGFzcylcclxuICAgICAgICAuaHRtbChjb250ZW50KTtcclxuXHJcbiAgICByZXR1cm4gJG1vZGFsQm9keTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVzdHJhaW5Db250ZW50SGVpZ2h0KCRjb250ZW50KSB7XHJcbiAgICBpZiAoJGNvbnRlbnQubGVuZ3RoID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgJGJvZHkgPSAkKGAuJHttb2RhbEJvZHlDbGFzc31gLCAkY29udGVudCk7XHJcblxyXG4gICAgaWYgKCRib2R5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGJvZHlIZWlnaHQgPSAkYm9keS5vdXRlckhlaWdodCgpO1xyXG4gICAgY29uc3QgY29udGVudEhlaWdodCA9ICRjb250ZW50Lm91dGVySGVpZ2h0KCk7XHJcbiAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IGdldFZpZXdwb3J0SGVpZ2h0KDAuOSk7XHJcbiAgICBjb25zdCBtYXhIZWlnaHQgPSB2aWV3cG9ydEhlaWdodCAtIChjb250ZW50SGVpZ2h0IC0gYm9keUhlaWdodCk7XHJcblxyXG4gICAgJGJvZHkuY3NzKCdtYXgtaGVpZ2h0JywgbWF4SGVpZ2h0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlTW9kYWxDb250ZW50KCRtb2RhbCkge1xyXG4gICAgbGV0ICRjb250ZW50ID0gJChgLiR7bW9kYWxDb250ZW50Q2xhc3N9YCwgJG1vZGFsKTtcclxuXHJcbiAgICBpZiAoJGNvbnRlbnQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gJG1vZGFsLmNoaWxkcmVuKCk7XHJcblxyXG4gICAgICAgICRjb250ZW50ID0gJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAuYWRkQ2xhc3MobW9kYWxDb250ZW50Q2xhc3MpXHJcbiAgICAgICAgICAgIC5hcHBlbmQoZXhpc3RpbmdDb250ZW50KVxyXG4gICAgICAgICAgICAuYXBwZW5kVG8oJG1vZGFsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gJGNvbnRlbnQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUxvYWRpbmdPdmVybGF5KCRtb2RhbCkge1xyXG4gICAgbGV0ICRsb2FkaW5nT3ZlcmxheSA9ICQoYC4ke2xvYWRpbmdPdmVybGF5Q2xhc3N9YCwgJG1vZGFsKTtcclxuXHJcbiAgICBpZiAoJGxvYWRpbmdPdmVybGF5Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICRsb2FkaW5nT3ZlcmxheSA9ICQoJzxkaXY+JylcclxuICAgICAgICAgICAgLmFkZENsYXNzKGxvYWRpbmdPdmVybGF5Q2xhc3MpXHJcbiAgICAgICAgICAgIC5hcHBlbmRUbygkbW9kYWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAkbG9hZGluZ092ZXJsYXk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXF1aXJlIGZvdW5kYXRpb24ucmV2ZWFsXHJcbiAqIERlY29yYXRlIGZvdW5kYXRpb24ucmV2ZWFsIHdpdGggYWRkaXRpb25hbCBtZXRob2RzXHJcbiAqIEBwYXJhbSB7alF1ZXJ5fSAkbW9kYWxcclxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc2l6ZV1cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNb2RhbCB7XHJcbiAgICBjb25zdHJ1Y3RvcigkbW9kYWwsIHtcclxuICAgICAgICBzaXplID0gbnVsbCxcclxuICAgIH0gPSB7fSkge1xyXG4gICAgICAgIHRoaXMuJG1vZGFsID0gJG1vZGFsO1xyXG4gICAgICAgIHRoaXMuJGNvbnRlbnQgPSBjcmVhdGVNb2RhbENvbnRlbnQodGhpcy4kbW9kYWwpO1xyXG4gICAgICAgIHRoaXMuJG92ZXJsYXkgPSBjcmVhdGVMb2FkaW5nT3ZlcmxheSh0aGlzLiRtb2RhbCk7XHJcbiAgICAgICAgdGhpcy5kZWZhdWx0U2l6ZSA9IHNpemUgfHwgZ2V0U2l6ZUZyb21Nb2RhbCgkbW9kYWwpO1xyXG4gICAgICAgIHRoaXMuc2l6ZSA9IHRoaXMuZGVmYXVsdFNpemU7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy4kcHJlTW9kYWxGb2N1c2VkRWwgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZm9jdXNUcmFwID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5vbk1vZGFsT3BlbiA9IHRoaXMub25Nb2RhbE9wZW4uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9uTW9kYWxPcGVuZWQgPSB0aGlzLm9uTW9kYWxPcGVuZWQuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9uTW9kYWxDbG9zZSA9IHRoaXMub25Nb2RhbENsb3NlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5vbk1vZGFsQ2xvc2VkID0gdGhpcy5vbk1vZGFsQ2xvc2VkLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xyXG5cclxuICAgICAgICAvKiBTVFJGLTI0NzEgLSBNdWx0aXBsZSBXaXNoIExpc3RzIC0gcHJldmVudHMgZG91YmxlLWZpcmluZ1xyXG4gICAgICAgICAqIG9mIGZvdW5kYXRpb24uZHJvcGRvd24gY2xpY2suZm5kdG4uZHJvcGRvd24gZXZlbnQgKi9cclxuICAgICAgICB0aGlzLiRtb2RhbC5vbignY2xpY2snLCAnLmRyb3Bkb3duLW1lbnUtYnV0dG9uJywgZSA9PiB7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHBlbmRpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BlbmRpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHBlbmRpbmcocGVuZGluZykge1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmcgPSBwZW5kaW5nO1xyXG5cclxuICAgICAgICBpZiAocGVuZGluZykge1xyXG4gICAgICAgICAgICB0aGlzLiRvdmVybGF5LnNob3coKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLiRvdmVybGF5LmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNpemUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHNpemUoc2l6ZSkge1xyXG4gICAgICAgIHRoaXMuX3NpemUgPSBzaXplO1xyXG5cclxuICAgICAgICB0aGlzLiRtb2RhbFxyXG4gICAgICAgICAgICAucmVtb3ZlQ2xhc3MoU2l6ZUNsYXNzZXMuc21hbGwpXHJcbiAgICAgICAgICAgIC5yZW1vdmVDbGFzcyhTaXplQ2xhc3Nlcy5sYXJnZSlcclxuICAgICAgICAgICAgLmFkZENsYXNzKFNpemVDbGFzc2VzW3NpemVdIHx8ICcnKTtcclxuICAgIH1cclxuXHJcbiAgICBiaW5kRXZlbnRzKCkge1xyXG4gICAgICAgIHRoaXMuJG1vZGFsLm9uKE1vZGFsRXZlbnRzLmNsb3NlLCB0aGlzLm9uTW9kYWxDbG9zZSk7XHJcbiAgICAgICAgdGhpcy4kbW9kYWwub24oTW9kYWxFdmVudHMuY2xvc2VkLCB0aGlzLm9uTW9kYWxDbG9zZWQpO1xyXG4gICAgICAgIHRoaXMuJG1vZGFsLm9uKE1vZGFsRXZlbnRzLm9wZW4sIHRoaXMub25Nb2RhbE9wZW4pO1xyXG4gICAgICAgIHRoaXMuJG1vZGFsLm9uKE1vZGFsRXZlbnRzLm9wZW5lZCwgdGhpcy5vbk1vZGFsT3BlbmVkKTtcclxuICAgIH1cclxuXHJcbiAgICBvcGVuKHtcclxuICAgICAgICBzaXplLFxyXG4gICAgICAgIHBlbmRpbmcgPSB0cnVlLFxyXG4gICAgICAgIGNsZWFyQ29udGVudCA9IHRydWUsXHJcbiAgICB9ID0ge30pIHtcclxuICAgICAgICB0aGlzLnBlbmRpbmcgPSBwZW5kaW5nO1xyXG5cclxuICAgICAgICBpZiAoc2l6ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNsZWFyQ29udGVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyQ29udGVudCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy4kbW9kYWwuZm91bmRhdGlvbigncmV2ZWFsJywgJ29wZW4nKTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZSgpIHtcclxuICAgICAgICB0aGlzLiRtb2RhbC5mb3VuZGF0aW9uKCdyZXZlYWwnLCAnY2xvc2UnKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVDb250ZW50KGNvbnRlbnQsIHsgd3JhcCA9IGZhbHNlIH0gPSB7fSkge1xyXG4gICAgICAgIGxldCAkY29udGVudCA9ICQoY29udGVudCk7XHJcblxyXG4gICAgICAgIGlmICh3cmFwKSB7XHJcbiAgICAgICAgICAgICRjb250ZW50ID0gd3JhcE1vZGFsQm9keShjb250ZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucGVuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuJGNvbnRlbnQuaHRtbCgkY29udGVudCk7XHJcbiAgICAgICAgdGhpcy4kbW9kYWwudHJpZ2dlcihNb2RhbEV2ZW50cy5sb2FkZWQpO1xyXG5cclxuICAgICAgICByZXN0cmFpbkNvbnRlbnRIZWlnaHQodGhpcy4kY29udGVudCk7XHJcbiAgICAgICAgZm91bmRhdGlvbih0aGlzLiRjb250ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhckNvbnRlbnQoKSB7XHJcbiAgICAgICAgdGhpcy4kY29udGVudC5odG1sKCcnKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXR1cEZvY3VzVHJhcCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuJHByZU1vZGFsRm9jdXNlZEVsKSB0aGlzLiRwcmVNb2RhbEZvY3VzZWRFbCA9ICQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5mb2N1c1RyYXApIHtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c1RyYXAgPSBmb2N1c1RyYXAuY3JlYXRlRm9jdXNUcmFwKHRoaXMuJG1vZGFsWzBdLCB7XHJcbiAgICAgICAgICAgICAgICBlc2NhcGVEZWFjdGl2YXRlczogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICByZXR1cm5Gb2N1c09uRGVhY3RpdmF0ZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBhbGxvd091dHNpZGVDbGljazogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGZhbGxiYWNrRm9jdXM6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmYWxsYmFja05vZGUgPSB0aGlzLiRwcmVNb2RhbEZvY3VzZWRFbCAmJiB0aGlzLiRwcmVNb2RhbEZvY3VzZWRFbC5sZW5ndGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLiRwcmVNb2RhbEZvY3VzZWRFbFswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICQoJ1tkYXRhLWhlYWRlci1sb2dvLWxpbmtdJylbMF07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFja05vZGU7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZm9jdXNUcmFwLmRlYWN0aXZhdGUoKTtcclxuICAgICAgICB0aGlzLmZvY3VzVHJhcC5hY3RpdmF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uTW9kYWxDbG9zZSgpIHtcclxuICAgICAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoYm9keUFjdGl2ZUNsYXNzKTtcclxuICAgIH1cclxuXHJcbiAgICBvbk1vZGFsQ2xvc2VkKCkge1xyXG4gICAgICAgIHRoaXMuc2l6ZSA9IHRoaXMuZGVmYXVsdFNpemU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmZvY3VzVHJhcCkgdGhpcy5mb2N1c1RyYXAuZGVhY3RpdmF0ZSgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy4kcHJlTW9kYWxGb2N1c2VkRWwpIHRoaXMuJHByZU1vZGFsRm9jdXNlZEVsLmZvY3VzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuJHByZU1vZGFsRm9jdXNlZEVsID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBvbk1vZGFsT3BlbigpIHtcclxuICAgICAgICAkKCdib2R5JykuYWRkQ2xhc3MoYm9keUFjdGl2ZUNsYXNzKTtcclxuICAgIH1cclxuXHJcbiAgICBvbk1vZGFsT3BlbmVkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy4kbW9kYWwub25lKE1vZGFsRXZlbnRzLmxvYWRlZCwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuJG1vZGFsLmhhc0NsYXNzKCdvcGVuJykpIHRoaXMuc2V0dXBGb2N1c1RyYXAoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXR1cEZvY3VzVHJhcCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVzdHJhaW5Db250ZW50SGVpZ2h0KHRoaXMuJGNvbnRlbnQpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJuIGFuIGFycmF5IG9mIG1vZGFsc1xyXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcclxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc2l6ZV1cclxuICogQHJldHVybnMge2FycmF5fVxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbW9kYWxGYWN0b3J5KHNlbGVjdG9yID0gJ1tkYXRhLXJldmVhbF0nLCBvcHRpb25zID0ge30pIHtcclxuICAgIGNvbnN0ICRtb2RhbHMgPSAkKHNlbGVjdG9yLCBvcHRpb25zLiRjb250ZXh0KTtcclxuXHJcbiAgICByZXR1cm4gJG1vZGFscy5tYXAoKGluZGV4LCBlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgY29uc3QgJG1vZGFsID0gJChlbGVtZW50KTtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZUtleSA9ICdtb2RhbEluc3RhbmNlJztcclxuICAgICAgICBjb25zdCBjYWNoZWRNb2RhbCA9ICRtb2RhbC5kYXRhKGluc3RhbmNlS2V5KTtcclxuXHJcbiAgICAgICAgaWYgKGNhY2hlZE1vZGFsIGluc3RhbmNlb2YgTW9kYWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZE1vZGFsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbW9kYWwgPSBuZXcgTW9kYWwoJG1vZGFsLCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgJG1vZGFsLmRhdGEoaW5zdGFuY2VLZXksIG1vZGFsKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1vZGFsO1xyXG4gICAgfSkudG9BcnJheSgpO1xyXG59XHJcblxyXG4vKlxyXG4gKiBSZXR1cm4gdGhlIGRlZmF1bHQgcGFnZSBtb2RhbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRNb2RhbCgpIHtcclxuICAgIHJldHVybiBtb2RhbEZhY3RvcnkoJyNtb2RhbCcpWzBdO1xyXG59XHJcblxyXG4vKlxyXG4gKiBSZXR1cm4gdGhlIGRlZmF1bHQgYWxlcnQgbW9kYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhbGVydE1vZGFsKCkge1xyXG4gICAgcmV0dXJuIG1vZGFsRmFjdG9yeSgnI2FsZXJ0LW1vZGFsJylbMF07XHJcbn1cclxuXHJcbi8qXHJcbiAqIERpc3BsYXkgdGhlIGdpdmVuIG1lc3NhZ2UgaW4gdGhlIGRlZmF1bHQgYWxlcnQgbW9kYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzaG93QWxlcnRNb2RhbChtZXNzYWdlKSB7XHJcbiAgICBjb25zdCBtb2RhbCA9IGFsZXJ0TW9kYWwoKTtcclxuICAgIG1vZGFsLm9wZW4oKTtcclxuICAgIG1vZGFsLnVwZGF0ZUNvbnRlbnQoYDxzcGFuPiR7bWVzc2FnZX08L3NwYW4+YCk7XHJcbn1cclxuIiwiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHV0aWxzIGZyb20gJ0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzJztcclxuaW1wb3J0IFN0ZW5jaWxEcm9wRG93biBmcm9tICcuL3N0ZW5jaWwtZHJvcGRvd24nO1xyXG5pbXBvcnQgdXJsVXRpbHMgZnJvbSAnLi4vY29tbW9uL3V0aWxzL3VybC11dGlscyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKSB7XHJcbiAgICBjb25zdCBUT1BfU1RZTElORyA9ICd0b3A6IDQ5cHg7JztcclxuICAgIGNvbnN0ICRxdWlja1NlYXJjaFJlc3VsdHMgPSAkKCcucXVpY2tTZWFyY2hSZXN1bHRzJyk7XHJcbiAgICBjb25zdCAkcXVpY2tTZWFyY2hGb3JtcyA9ICQoJ1tkYXRhLXF1aWNrLXNlYXJjaC1mb3JtXScpO1xyXG4gICAgY29uc3QgJHF1aWNrU2VhcmNoRXhwYW5kID0gJCgnI3F1aWNrLXNlYXJjaC1leHBhbmQnKTtcclxuICAgIGNvbnN0ICRzZWFyY2hRdWVyeSA9ICRxdWlja1NlYXJjaEZvcm1zLmZpbmQoJ1tkYXRhLXNlYXJjaC1xdWlja10nKTtcclxuICAgIGNvbnN0IHN0ZW5jaWxEcm9wRG93bkV4dGVuZGFibGVzID0ge1xyXG4gICAgICAgIGhpZGU6ICgpID0+IHtcclxuICAgICAgICAgICAgJHF1aWNrU2VhcmNoRXhwYW5kLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICRzZWFyY2hRdWVyeS50cmlnZ2VyKCdibHVyJyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBzaG93OiAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgJHF1aWNrU2VhcmNoRXhwYW5kLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKTtcclxuICAgICAgICAgICAgJHNlYXJjaFF1ZXJ5LnRyaWdnZXIoJ2ZvY3VzJyk7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgY29uc3Qgc3RlbmNpbERyb3BEb3duID0gbmV3IFN0ZW5jaWxEcm9wRG93bihzdGVuY2lsRHJvcERvd25FeHRlbmRhYmxlcyk7XHJcbiAgICBzdGVuY2lsRHJvcERvd24uYmluZCgkKCdbZGF0YS1zZWFyY2g9XCJxdWlja1NlYXJjaFwiXScpLCAkKCcjcXVpY2tTZWFyY2gnKSwgVE9QX1NUWUxJTkcpO1xyXG5cclxuICAgIHN0ZW5jaWxEcm9wRG93bkV4dGVuZGFibGVzLm9uQm9keUNsaWNrID0gKGUsICRjb250YWluZXIpID0+IHtcclxuICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IGVsZW1lbnQgaGFzIHRoaXMgZGF0YSB0YWcgb3Igb25lIG9mIGl0J3MgcGFyZW50cywgZG8gbm90IGNsb3NlIHRoZSBzZWFyY2ggcmVzdWx0c1xyXG4gICAgICAgIC8vIFdlIGhhdmUgdG8gc3BlY2lmeSBgLm1vZGFsLWJhY2tncm91bmRgIGJlY2F1c2Ugb2YgbGltaXRhdGlvbnMgYXJvdW5kIEZvdW5kYXRpb24gUmV2ZWFsIG5vdCBhbGxvd2luZ1xyXG4gICAgICAgIC8vIGFueSBtb2RpZmljYXRpb24gdG8gdGhlIGJhY2tncm91bmQgZWxlbWVudC5cclxuICAgICAgICBpZiAoJChlLnRhcmdldCkuY2xvc2VzdCgnW2RhdGEtcHJldmVudC1xdWljay1zZWFyY2gtY2xvc2VdLCAubW9kYWwtYmFja2dyb3VuZCcpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBzdGVuY2lsRHJvcERvd24uaGlkZSgkY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIHN0YWdnZXIgc2VhcmNoaW5nIGZvciAxMjAwbXMgYWZ0ZXIgbGFzdCBpbnB1dFxyXG4gICAgY29uc3QgZGVib3VuY2VXYWl0VGltZSA9IDEyMDA7XHJcbiAgICBjb25zdCBkb1NlYXJjaCA9IF8uZGVib3VuY2UoKHNlYXJjaFF1ZXJ5KSA9PiB7XHJcbiAgICAgICAgdXRpbHMuYXBpLnNlYXJjaC5zZWFyY2goc2VhcmNoUXVlcnksIHsgdGVtcGxhdGU6ICdzZWFyY2gvcXVpY2stcmVzdWx0cycgfSwgKGVyciwgcmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAkcXVpY2tTZWFyY2hSZXN1bHRzLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICBjb25zdCAkcXVpY2tTZWFyY2hSZXN1bHRzQ3VycmVudCA9ICRxdWlja1NlYXJjaFJlc3VsdHMuZmlsdGVyKCc6dmlzaWJsZScpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgJG5vUmVzdWx0c01lc3NhZ2UgPSAkcXVpY2tTZWFyY2hSZXN1bHRzQ3VycmVudC5maW5kKCcucXVpY2tTZWFyY2hNZXNzYWdlJyk7XHJcbiAgICAgICAgICAgIGlmICgkbm9SZXN1bHRzTWVzc2FnZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICRub1Jlc3VsdHNNZXNzYWdlLmF0dHIoe1xyXG4gICAgICAgICAgICAgICAgICAgIHJvbGU6ICdzdGF0dXMnLFxyXG4gICAgICAgICAgICAgICAgICAgICdhcmlhLWxpdmUnOiAncG9saXRlJyxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgJHF1aWNrU2VhcmNoQXJpYU1lc3NhZ2UgPSAkcXVpY2tTZWFyY2hSZXN1bHRzQ3VycmVudC5uZXh0KCk7XHJcbiAgICAgICAgICAgICAgICAkcXVpY2tTZWFyY2hBcmlhTWVzc2FnZS5hZGRDbGFzcygndS1oaWRkZW4nKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcmVkZWZpbmVkVGV4dCA9ICRxdWlja1NlYXJjaEFyaWFNZXNzYWdlLmRhdGEoJ3NlYXJjaC1hcmlhLW1lc3NhZ2UtcHJlZGVmaW5lZC10ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtc0ZvdW5kQ291bnQgPSAkcXVpY2tTZWFyY2hSZXN1bHRzQ3VycmVudC5maW5kKCcucHJvZHVjdCcpLmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgICAgICAkcXVpY2tTZWFyY2hBcmlhTWVzc2FnZS50ZXh0KGAke2l0ZW1zRm91bmRDb3VudH0gJHtwcmVkZWZpbmVkVGV4dH0gJHtzZWFyY2hRdWVyeX1gKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAkcXVpY2tTZWFyY2hBcmlhTWVzc2FnZS5yZW1vdmVDbGFzcygndS1oaWRkZW4nKTtcclxuICAgICAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0sIGRlYm91bmNlV2FpdFRpbWUpO1xyXG5cclxuICAgIHV0aWxzLmhvb2tzLm9uKCdzZWFyY2gtcXVpY2snLCAoZXZlbnQsIGN1cnJlbnRUYXJnZXQpID0+IHtcclxuICAgICAgICBjb25zdCBzZWFyY2hRdWVyeSA9ICQoY3VycmVudFRhcmdldCkudmFsKCk7XHJcblxyXG4gICAgICAgIC8vIHNlcnZlciB3aWxsIG9ubHkgcGVyZm9ybSBzZWFyY2ggd2l0aCBhdCBsZWFzdCAzIGNoYXJhY3RlcnNcclxuICAgICAgICBpZiAoc2VhcmNoUXVlcnkubGVuZ3RoIDwgMykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkb1NlYXJjaChzZWFyY2hRdWVyeSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBDYXRjaCB0aGUgc3VibWlzc2lvbiBvZiB0aGUgcXVpY2stc2VhcmNoIGZvcm1zXHJcbiAgICAkcXVpY2tTZWFyY2hGb3Jtcy5vbignc3VibWl0JywgZXZlbnQgPT4ge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgIGNvbnN0ICR0YXJnZXQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xyXG4gICAgICAgIGNvbnN0IHNlYXJjaFF1ZXJ5ID0gJHRhcmdldC5maW5kKCdpbnB1dCcpLnZhbCgpO1xyXG4gICAgICAgIGNvbnN0IHNlYXJjaFVybCA9ICR0YXJnZXQuZGF0YSgndXJsJyk7XHJcblxyXG4gICAgICAgIGlmIChzZWFyY2hRdWVyeS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdXJsVXRpbHMuZ29Ub1VybChgJHtzZWFyY2hVcmx9P3NlYXJjaF9xdWVyeT0ke3NlYXJjaFF1ZXJ5fWApO1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgIH0pO1xyXG59XHJcbiIsImltcG9ydCAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uL2ZvdW5kYXRpb24nO1xyXG5pbXBvcnQgJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi9mb3VuZGF0aW9uLmRyb3Bkb3duJztcclxuaW1wb3J0IHV0aWxzIGZyb20gJ0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzJztcclxuaW1wb3J0IFJldmlldyBmcm9tICcuLi9wcm9kdWN0L3Jldmlld3MnO1xyXG5pbXBvcnQgUHJvZHVjdERldGFpbHMgZnJvbSAnLi4vY29tbW9uL3Byb2R1Y3QtZGV0YWlscyc7XHJcbmltcG9ydCB7IGRlZmF1bHRNb2RhbCwgTW9kYWxFdmVudHMgfSBmcm9tICcuL21vZGFsJztcclxuaW1wb3J0ICdzbGljay1jYXJvdXNlbCc7XHJcbmltcG9ydCB7IHNldENhcm91c2VsU3RhdGUsIG9uU2xpY2tDYXJvdXNlbENoYW5nZSwgb25Vc2VyQ2Fyb3VzZWxDaGFuZ2UgfSBmcm9tICcuLi9jb21tb24vY2Fyb3VzZWwnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGNvbnRleHQpIHtcclxuICAgIGNvbnN0IG1vZGFsID0gZGVmYXVsdE1vZGFsKCk7XHJcblxyXG4gICAgJCgnYm9keScpLm9uKCdjbGljaycsICcucXVpY2t2aWV3JywgZXZlbnQgPT4ge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHByb2R1Y3RJZCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YSgncHJvZHVjdElkJyk7XHJcbiAgICAgICAgY29uc3QgaGFuZGxlRHJvcGRvd25FeHBhbmQgPSAoeyBjdXJyZW50VGFyZ2V0IH0pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgJGRyb3Bkb3duTWVudSA9ICQoY3VycmVudFRhcmdldCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQnRuSGVpZ2h0ID0gJGRyb3Bkb3duTWVudS5wcmV2KCkub3V0ZXJIZWlnaHQoKTtcclxuXHJcbiAgICAgICAgICAgICRkcm9wZG93bk1lbnUuY3NzKCd0b3AnLCBkcm9wZG93bkJ0bkhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbW9kYWwuJG1vZGFsLm9uZShNb2RhbEV2ZW50cy5jbG9zZSwgKCkgPT4gJGRyb3Bkb3duTWVudS5vZmYoJ29wZW5lZC5mbmR0bi5kcm9wZG93bicsIGhhbmRsZURyb3Bkb3duRXhwYW5kKSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbW9kYWwub3Blbih7IHNpemU6ICdsYXJnZScgfSk7XHJcblxyXG4gICAgICAgIHV0aWxzLmFwaS5wcm9kdWN0LmdldEJ5SWQocHJvZHVjdElkLCB7IHRlbXBsYXRlOiAncHJvZHVjdHMvcXVpY2stdmlldycgfSwgKGVyciwgcmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgbW9kYWwudXBkYXRlQ29udGVudChyZXNwb25zZSk7XHJcblxyXG4gICAgICAgICAgICAkKCcjbW9kYWwgLmRyb3Bkb3duLW1lbnUnKS5vbignb3BlbmVkLmZuZHRuLmRyb3Bkb3duJywgaGFuZGxlRHJvcGRvd25FeHBhbmQpO1xyXG4gICAgICAgICAgICBtb2RhbC4kY29udGVudC5maW5kKCcucHJvZHVjdFZpZXcnKS5hZGRDbGFzcygncHJvZHVjdFZpZXctLXF1aWNrVmlldycpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgJGNhcm91c2VsID0gbW9kYWwuJGNvbnRlbnQuZmluZCgnW2RhdGEtc2xpY2tdJyk7XHJcbiAgICAgICAgICAgIGlmICgkY2Fyb3VzZWwubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAkY2Fyb3VzZWwub24oJ2luaXQgYnJlYWtwb2ludCBzd2lwZScsIHNldENhcm91c2VsU3RhdGUpO1xyXG4gICAgICAgICAgICAgICAgJGNhcm91c2VsLm9uKCdjbGljaycsICcuc2xpY2stYXJyb3csIC5zbGljay1kb3RzJywgc2V0Q2Fyb3VzZWxTdGF0ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgJGNhcm91c2VsLm9uKCdpbml0IGFmdGVyQ2hhbmdlJywgKGUsIGNhcm91c2VsT2JqKSA9PiBvblNsaWNrQ2Fyb3VzZWxDaGFuZ2UoZSwgY2Fyb3VzZWxPYmosIGNvbnRleHQpKTtcclxuICAgICAgICAgICAgICAgICRjYXJvdXNlbC5vbignY2xpY2snLCAnLnNsaWNrLWFycm93LCAuc2xpY2stZG90cycsICRjYXJvdXNlbCwgZSA9PiBvblVzZXJDYXJvdXNlbENoYW5nZShlLCBjb250ZXh0KSk7XHJcbiAgICAgICAgICAgICAgICAkY2Fyb3VzZWwub24oJ3N3aXBlJywgKGUsIGNhcm91c2VsT2JqKSA9PiBvblVzZXJDYXJvdXNlbENoYW5nZShlLCBjb250ZXh0LCBjYXJvdXNlbE9iai4kc2xpZGVyKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG1vZGFsLiRtb2RhbC5oYXNDbGFzcygnb3BlbicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJGNhcm91c2VsLnNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGFsLiRtb2RhbC5vbmUoTW9kYWxFdmVudHMub3BlbmVkLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkLmNvbnRhaW5zKGRvY3VtZW50LCAkY2Fyb3VzZWxbMF0pKSAkY2Fyb3VzZWwuc2xpY2soKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tbmV3ICovXHJcbiAgICAgICAgICAgIG5ldyBSZXZpZXcoeyAkY29udGV4dDogbW9kYWwuJGNvbnRlbnQgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb2R1Y3REZXRhaWxzKG1vZGFsLiRjb250ZW50LmZpbmQoJy5xdWlja1ZpZXcnKSwgY29udGV4dCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxufVxyXG4iLCJjb25zdCByZXZlYWxDbG9zZUF0dHIgPSAncmV2ZWFsQ2xvc2UnO1xyXG5jb25zdCByZXZlYWxDbG9zZVNlbGVjdG9yID0gYFtkYXRhLSR7cmV2ZWFsQ2xvc2VBdHRyfV1gO1xyXG5jb25zdCByZXZlYWxTZWxlY3RvciA9ICdbZGF0YS1yZXZlYWxdJztcclxuXHJcbmNsYXNzIFJldmVhbENsb3NlIHtcclxuICAgIGNvbnN0cnVjdG9yKCRidXR0b24pIHtcclxuICAgICAgICB0aGlzLiRidXR0b24gPSAkYnV0dG9uO1xyXG4gICAgICAgIHRoaXMubW9kYWxJZCA9ICRidXR0b24uZGF0YShyZXZlYWxDbG9zZUF0dHIpO1xyXG5cclxuICAgICAgICB0aGlzLm9uQ2xpY2sgPSB0aGlzLm9uQ2xpY2suYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1vZGFsKCkge1xyXG4gICAgICAgIGxldCAkbW9kYWw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1vZGFsSWQpIHtcclxuICAgICAgICAgICAgJG1vZGFsID0gJChgIyR7dGhpcy5tb2RhbElkfWApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICRtb2RhbCA9IHRoaXMuJGJ1dHRvbi5wYXJlbnRzKHJldmVhbFNlbGVjdG9yKS5lcSgwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAkbW9kYWwuZGF0YSgnbW9kYWxJbnN0YW5jZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGJpbmRFdmVudHMoKSB7XHJcbiAgICAgICAgdGhpcy4kYnV0dG9uLm9uKCdjbGljaycsIHRoaXMub25DbGljayk7XHJcbiAgICB9XHJcblxyXG4gICAgdW5iaW5kRXZlbnRzKCkge1xyXG4gICAgICAgIHRoaXMuJGJ1dHRvbi5vZmYoJ2NsaWNrJywgdGhpcy5vbkNsaWNrKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKGV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgeyBtb2RhbCB9ID0gdGhpcztcclxuXHJcbiAgICAgICAgaWYgKG1vZGFsKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICBtb2RhbC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLypcclxuICogRXh0ZW5kIGZvdW5kYXRpb24ucmV2ZWFsIHdpdGggdGhlIGFiaWxpdHkgdG8gY2xvc2UgYSBtb2RhbCBieSBjbGlja2luZyBvbiBhbnkgb2YgaXRzIGNoaWxkIGVsZW1lbnRcclxuICogd2l0aCBkYXRhLXJldmVhbC1jbG9zZSBhdHRyaWJ1dGUuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqXHJcbiAqIDxkaXYgZGF0YS1yZXZlYWwgaWQ9XCJoZWxsb01vZGFsXCI+XHJcbiAqICAgPGJ1dHRvbiBkYXRhLXJldmVhbC1jbG9zZT5Db250aW51ZTwvYnV0dG9uPlxyXG4gKiA8L2Rpdj5cclxuICpcclxuICogPGRpdiBkYXRhLXJldmVhbCBpZD1cImhlbGxvTW9kYWxcIj48L2Rpdj5cclxuICogPGJ1dHRvbiBkYXRhLXJldmVhbC1jbG9zZT1cImhlbGxvTW9kYWxcIj5Db250aW51ZTwvYnV0dG9uPlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmV2ZWFsQ2xvc2VGYWN0b3J5KHNlbGVjdG9yID0gcmV2ZWFsQ2xvc2VTZWxlY3Rvciwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICBjb25zdCAkYnV0dG9ucyA9ICQoc2VsZWN0b3IsIG9wdGlvbnMuJGNvbnRleHQpO1xyXG5cclxuICAgIHJldHVybiAkYnV0dG9ucy5tYXAoKGluZGV4LCBlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgY29uc3QgJGJ1dHRvbiA9ICQoZWxlbWVudCk7XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2VLZXkgPSBgJHtyZXZlYWxDbG9zZUF0dHJ9SW5zdGFuY2VgO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZEJ1dHRvbiA9ICRidXR0b24uZGF0YShpbnN0YW5jZUtleSk7XHJcblxyXG4gICAgICAgIGlmIChjYWNoZWRCdXR0b24gaW5zdGFuY2VvZiBSZXZlYWxDbG9zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQnV0dG9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYnV0dG9uID0gbmV3IFJldmVhbENsb3NlKCRidXR0b24pO1xyXG5cclxuICAgICAgICAkYnV0dG9uLmRhdGEoaW5zdGFuY2VLZXksIGJ1dHRvbik7XHJcblxyXG4gICAgICAgIHJldHVybiBidXR0b247XHJcbiAgICB9KS50b0FycmF5KCk7XHJcbn1cclxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RlbmNpbERyb3Bkb3duIHtcclxuICAgIGNvbnN0cnVjdG9yKGV4dGVuZGFibGVzKSB7XHJcbiAgICAgICAgdGhpcy5leHRlbmRhYmxlcyA9IGV4dGVuZGFibGVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtICRkcm9wRG93blxyXG4gICAgICogQHBhcmFtIHN0eWxlXHJcbiAgICAgKi9cclxuICAgIGhpZGUoJGRyb3BEb3duLCBzdHlsZSkge1xyXG4gICAgICAgIGlmIChzdHlsZSkge1xyXG4gICAgICAgICAgICAkZHJvcERvd24uYXR0cignc3R5bGUnLCBzdHlsZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjYWxsYmFjayBcImhpZGVcIlxyXG4gICAgICAgIGlmICh0aGlzLmV4dGVuZGFibGVzICYmIHRoaXMuZXh0ZW5kYWJsZXMuaGlkZSkge1xyXG4gICAgICAgICAgICB0aGlzLmV4dGVuZGFibGVzLmhpZGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICRkcm9wRG93bi5yZW1vdmVDbGFzcygnaXMtb3BlbiBmLW9wZW4tZHJvcGRvd24nKS5hdHRyKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdygkZHJvcERvd24sIGV2ZW50LCBzdHlsZSkge1xyXG4gICAgICAgIGlmIChzdHlsZSkge1xyXG4gICAgICAgICAgICAkZHJvcERvd24uYXR0cignc3R5bGUnLCBzdHlsZSkuYXR0cignYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICRkcm9wRG93bi5hZGRDbGFzcygnaXMtb3BlbiBmLW9wZW4tZHJvcGRvd24nKS5hdHRyKCdhcmlhLWhpZGRlbicsICdmYWxzZScpO1xyXG5cclxuICAgICAgICAvLyBjYWxsYmFjayBcInNob3dcIlxyXG4gICAgICAgIGlmICh0aGlzLmV4dGVuZGFibGVzICYmIHRoaXMuZXh0ZW5kYWJsZXMuc2hvdykge1xyXG4gICAgICAgICAgICB0aGlzLmV4dGVuZGFibGVzLnNob3coZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBiaW5kKCRkcm9wRG93blRyaWdnZXIsICRjb250YWluZXIsIHN0eWxlKSB7XHJcbiAgICAgICAgbGV0IG1vZGFsT3BlbmVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICRkcm9wRG93blRyaWdnZXIub24oJ2NsaWNrJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCAkY2FydCA9ICQoJy5pcy1vcGVuW2RhdGEtY2FydC1wcmV2aWV3XScpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCRjYXJ0KSB7XHJcbiAgICAgICAgICAgICAgICAkY2FydC50cmlnZ2VyKCdjbGljaycpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoJGNvbnRhaW5lci5oYXNDbGFzcygnaXMtb3BlbicpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoJGNvbnRhaW5lciwgZXZlbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93KCRjb250YWluZXIsIGV2ZW50LCBzdHlsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJCgnYm9keScpLm9uKCdjbGljaycsIGUgPT4ge1xyXG4gICAgICAgICAgICAvLyBDYWxsIG9uQ2xpY2sgaGFuZGxlclxyXG4gICAgICAgICAgICBpZiAodGhpcy5leHRlbmRhYmxlcyAmJiB0aGlzLmV4dGVuZGFibGVzLm9uQm9keUNsaWNrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmV4dGVuZGFibGVzLm9uQm9keUNsaWNrKGUsICRjb250YWluZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkub24oJ2tleXVwJywgKGUpID0+IHtcclxuICAgICAgICAgICAgLy8gSWYgdGhleSBoaXQgZXNjYXBlIGFuZCB0aGUgbW9kYWwgaXNuJ3Qgb3BlbiwgY2xvc2UgdGhlIHNlYXJjaFxyXG4gICAgICAgICAgICBpZiAoZS53aGljaCA9PT0gMjcgJiYgIW1vZGFsT3BlbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoJGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KS5vbignb3Blbi5mbmR0bi5yZXZlYWwnLCAnW2RhdGEtcmV2ZWFsXScsICgpID0+IHtcclxuICAgICAgICAgICAgbW9kYWxPcGVuZWQgPSB0cnVlO1xyXG4gICAgICAgIH0pLm9uKCdjbG9zZS5mbmR0bi5yZXZlYWwnLCAnW2RhdGEtcmV2ZWFsXScsICgpID0+IHtcclxuICAgICAgICAgICAgbW9kYWxPcGVuZWQgPSBmYWxzZTtcclxuICAgICAgICB9KS5vbignY2xpY2snLCAnW2RhdGEtZHJvcC1kb3duLWNsb3NlXScsICgpID0+IHtcclxuICAgICAgICAgICAgbW9kYWxPcGVuZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5oaWRlKCRjb250YWluZXIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCBzdmdJbmplY3RvciBmcm9tICdzdmctaW5qZWN0b3InO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xyXG4gICAgc3ZnSW5qZWN0b3IoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnc3ZnW2RhdGEtc3JjXScpKTtcclxufVxyXG4iLCJpbXBvcnQgc3dlZXRBbGVydCBmcm9tICdzd2VldGFsZXJ0Mic7XHJcblxyXG4vLyBXZWFrTWFwIHdpbGwgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIGlmIG5hdGl2ZSBXZWFrTWFwIGlzIG5vdCBzdXBwb3J0ZWQuXHJcbmNvbnN0IHdlYWtNYXAgPSBuZXcgV2Vha01hcCgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXHJcblxyXG4vLyBTZXQgZGVmYXVsdHMgZm9yIHN3ZWV0YWxlcnQyIHBvcHVwIGJveGVzXHJcbmNvbnN0IFN3YWwgPSBzd2VldEFsZXJ0Lm1peGluKHtcclxuICAgIGJ1dHRvbnNTdHlsaW5nOiBmYWxzZSxcclxuICAgIGN1c3RvbUNsYXNzOiB7XHJcbiAgICAgICAgY29uZmlybUJ1dHRvbjogJ2J1dHRvbicsXHJcbiAgICAgICAgY2FuY2VsQnV0dG9uOiAnYnV0dG9uJyxcclxuICAgIH0sXHJcbn0pO1xyXG5cclxuLy8gUmUtZXhwb3J0XHJcbmV4cG9ydCBkZWZhdWx0IFN3YWw7XHJcbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhZ2VNYW5hZ2VyIHtcclxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQpIHtcclxuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIHR5cGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBvblJlYWR5KCkge1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBsb2FkKGNvbnRleHQpIHtcclxuICAgICAgICBjb25zdCBwYWdlID0gbmV3IHRoaXMoY29udGV4dCk7XHJcblxyXG4gICAgICAgICQoZG9jdW1lbnQpLnJlYWR5KCgpID0+IHtcclxuICAgICAgICAgICAgcGFnZS5vblJlYWR5LmJpbmQocGFnZSkoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgJ2Vhc3l6b29tJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEltYWdlR2FsbGVyeSB7XHJcbiAgICBjb25zdHJ1Y3RvcigkZ2FsbGVyeSkge1xyXG4gICAgICAgIHRoaXMuJG1haW5JbWFnZSA9ICRnYWxsZXJ5LmZpbmQoJ1tkYXRhLWltYWdlLWdhbGxlcnktbWFpbl0nKTtcclxuICAgICAgICB0aGlzLiRtYWluSW1hZ2VOZXN0ZWQgPSAkZ2FsbGVyeS5maW5kKCdbZGF0YS1tYWluLWltYWdlXScpO1xyXG4gICAgICAgIHRoaXMuJHNlbGVjdGFibGVJbWFnZXMgPSAkZ2FsbGVyeS5maW5kKCdbZGF0YS1pbWFnZS1nYWxsZXJ5LWl0ZW1dJyk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50SW1hZ2UgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCkge1xyXG4gICAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xyXG4gICAgICAgIHRoaXMuc2V0SW1hZ2Vab29tKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0TWFpbkltYWdlKGltZ09iaikge1xyXG4gICAgICAgIHRoaXMuY3VycmVudEltYWdlID0geyAuLi5pbWdPYmogfTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVUaHVtYigpO1xyXG4gICAgICAgIHRoaXMuc3dhcE1haW5JbWFnZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEFsdGVybmF0ZUltYWdlKGltZ09iaikge1xyXG4gICAgICAgIGlmICghdGhpcy5zYXZlZEltYWdlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZWRJbWFnZSA9IHtcclxuICAgICAgICAgICAgICAgIG1haW5JbWFnZVVybDogdGhpcy4kbWFpbkltYWdlLmZpbmQoJ2ltZycpLmF0dHIoJ3NyYycpLFxyXG4gICAgICAgICAgICAgICAgem9vbUltYWdlVXJsOiB0aGlzLiRtYWluSW1hZ2UuYXR0cignZGF0YS16b29tLWltYWdlJyksXHJcbiAgICAgICAgICAgICAgICBtYWluSW1hZ2VTcmNzZXQ6IHRoaXMuJG1haW5JbWFnZS5maW5kKCdpbWcnKS5hdHRyKCdzcmNzZXQnKSxcclxuICAgICAgICAgICAgICAgICRzZWxlY3RlZFRodW1iOiB0aGlzLmN1cnJlbnRJbWFnZS4kc2VsZWN0ZWRUaHVtYixcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRNYWluSW1hZ2UoaW1nT2JqKTtcclxuICAgIH1cclxuXHJcbiAgICByZXN0b3JlSW1hZ2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2F2ZWRJbWFnZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldE1haW5JbWFnZSh0aGlzLnNhdmVkSW1hZ2UpO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5zYXZlZEltYWdlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3ROZXdJbWFnZShlKSB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGNvbnN0ICR0YXJnZXQgPSAkKGUuY3VycmVudFRhcmdldCk7XHJcbiAgICAgICAgY29uc3QgaW1nT2JqID0ge1xyXG4gICAgICAgICAgICBtYWluSW1hZ2VVcmw6ICR0YXJnZXQuYXR0cignZGF0YS1pbWFnZS1nYWxsZXJ5LW5ldy1pbWFnZS11cmwnKSxcclxuICAgICAgICAgICAgem9vbUltYWdlVXJsOiAkdGFyZ2V0LmF0dHIoJ2RhdGEtaW1hZ2UtZ2FsbGVyeS16b29tLWltYWdlLXVybCcpLFxyXG4gICAgICAgICAgICBtYWluSW1hZ2VTcmNzZXQ6ICR0YXJnZXQuYXR0cignZGF0YS1pbWFnZS1nYWxsZXJ5LW5ldy1pbWFnZS1zcmNzZXQnKSxcclxuICAgICAgICAgICAgJHNlbGVjdGVkVGh1bWI6ICR0YXJnZXQsXHJcbiAgICAgICAgICAgIG1haW5JbWFnZUFsdDogJHRhcmdldC5jaGlsZHJlbigpLmZpcnN0KCkuYXR0cignYWx0JyksXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNldE1haW5JbWFnZShpbWdPYmopO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEFjdGl2ZVRodW1iKCkge1xyXG4gICAgICAgIHRoaXMuJHNlbGVjdGFibGVJbWFnZXMucmVtb3ZlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRJbWFnZS4kc2VsZWN0ZWRUaHVtYikge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRJbWFnZS4kc2VsZWN0ZWRUaHVtYi5hZGRDbGFzcygnaXMtYWN0aXZlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN3YXBNYWluSW1hZ2UoKSB7XHJcbiAgICAgICAgY29uc3QgaXNCcm93c2VySUUgPSBuYXZpZ2F0b3IudXNlckFnZW50LmluY2x1ZGVzKCdUcmlkZW50Jyk7XHJcblxyXG4gICAgICAgIHRoaXMuZWFzeXpvb20uZGF0YSgnZWFzeVpvb20nKS5zd2FwKFxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRJbWFnZS5tYWluSW1hZ2VVcmwsXHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEltYWdlLnpvb21JbWFnZVVybCxcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50SW1hZ2UubWFpbkltYWdlU3Jjc2V0LFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuJG1haW5JbWFnZS5hdHRyKHtcclxuICAgICAgICAgICAgJ2RhdGEtem9vbS1pbWFnZSc6IHRoaXMuY3VycmVudEltYWdlLnpvb21JbWFnZVVybCxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLiRtYWluSW1hZ2VOZXN0ZWQuYXR0cih7XHJcbiAgICAgICAgICAgIGFsdDogdGhpcy5jdXJyZW50SW1hZ2UubWFpbkltYWdlQWx0LFxyXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5jdXJyZW50SW1hZ2UubWFpbkltYWdlQWx0LFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoaXNCcm93c2VySUUpIHtcclxuICAgICAgICAgICAgY29uc3QgZmFsbGJhY2tTdHlsZXNJRSA9IHtcclxuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWltYWdlJzogYHVybCgke3RoaXMuY3VycmVudEltYWdlLm1haW5JbWFnZVVybH0pYCxcclxuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLXBvc2l0aW9uJzogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1yZXBlYXQnOiAnbm8tcmVwZWF0JyxcclxuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLW9yaWdpbic6ICdjb250ZW50LWJveCcsXHJcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1zaXplJzogJ2NvbnRhaW4nLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy4kbWFpbkltYWdlTmVzdGVkLmNzcyhmYWxsYmFja1N0eWxlc0lFKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tJbWFnZSgpIHtcclxuICAgICAgICBjb25zdCAkaW1hZ2VDb250YWluZXIgPSAkKCcucHJvZHVjdFZpZXctaW1hZ2UnKTtcclxuICAgICAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSAkaW1hZ2VDb250YWluZXIuaGVpZ2h0KCk7XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyV2lkdGggPSAkaW1hZ2VDb250YWluZXIud2lkdGgoKTtcclxuXHJcbiAgICAgICAgY29uc3QgJGltYWdlID0gdGhpcy5lYXN5em9vbS5kYXRhKCdlYXN5Wm9vbScpLiR6b29tO1xyXG4gICAgICAgIGNvbnN0IGhlaWdodCA9ICRpbWFnZS5oZWlnaHQoKTtcclxuICAgICAgICBjb25zdCB3aWR0aCA9ICRpbWFnZS53aWR0aCgpO1xyXG5cclxuICAgICAgICBpZiAoaGVpZ2h0IDwgY29udGFpbmVySGVpZ2h0IHx8IHdpZHRoIDwgY29udGFpbmVyV2lkdGgpIHtcclxuICAgICAgICAgICAgdGhpcy5lYXN5em9vbS5kYXRhKCdlYXN5Wm9vbScpLmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW1hZ2Vab29tKCkge1xyXG4gICAgICAgIHRoaXMuZWFzeXpvb20gPSB0aGlzLiRtYWluSW1hZ2UuZWFzeVpvb20oe1xyXG4gICAgICAgICAgICBvblNob3c6ICgpID0+IHRoaXMuY2hlY2tJbWFnZSgpLFxyXG4gICAgICAgICAgICBlcnJvck5vdGljZTogJycsXHJcbiAgICAgICAgICAgIGxvYWRpbmdOb3RpY2U6ICcnLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGJpbmRFdmVudHMoKSB7XHJcbiAgICAgICAgdGhpcy4kc2VsZWN0YWJsZUltYWdlcy5vbignY2xpY2snLCB0aGlzLnNlbGVjdE5ld0ltYWdlLmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCBub2QgZnJvbSAnLi4vY29tbW9uL25vZCc7XHJcbmltcG9ydCBjb2xsYXBzaWJsZUZhY3RvcnksIHsgQ29sbGFwc2libGVFdmVudHMgfSBmcm9tICcuLi9jb21tb24vY29sbGFwc2libGUnO1xyXG5pbXBvcnQgZm9ybXMgZnJvbSAnLi4vY29tbW9uL21vZGVscy9mb3Jtcyc7XHJcbmltcG9ydCB7IHNhZmVTdHJpbmcgfSBmcm9tICcuLi9jb21tb24vdXRpbHMvc2FmZS1zdHJpbmcnO1xyXG5pbXBvcnQgeyBhbm5vdW5jZUlucHV0RXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzL2Zvcm0tdXRpbHMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3Mge1xyXG4gICAgY29uc3RydWN0b3IoeyAkcmV2aWV3Rm9ybSwgJGNvbnRleHQgfSkge1xyXG4gICAgICAgIGlmICgkcmV2aWV3Rm9ybSAmJiAkcmV2aWV3Rm9ybS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy52YWxpZGF0b3IgPSBub2Qoe1xyXG4gICAgICAgICAgICAgICAgc3VibWl0OiAkcmV2aWV3Rm9ybS5maW5kKCdpbnB1dFt0eXBlPVwic3VibWl0XCJdJyksXHJcbiAgICAgICAgICAgICAgICB0YXA6IGFubm91bmNlSW5wdXRFcnJvck1lc3NhZ2UsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy4kY29udGV4dCA9ICRjb250ZXh0O1xyXG4gICAgICAgIHRoaXMuJHJldmlld1RhYkxpbmsgPSAkKCcucHJvZHVjdFZpZXctcmV2aWV3VGFiTGluaycsIHRoaXMuJGNvbnRleHQpO1xyXG4gICAgICAgIHRoaXMuJHJldmlld3NDb250ZW50ID0gJCgnI3Byb2R1Y3QtcmV2aWV3cycsIHRoaXMuJGNvbnRleHQpO1xyXG4gICAgICAgIHRoaXMuJHJldmlld3NDb250ZW50TGlzdCA9ICQoJyNwcm9kdWN0UmV2aWV3cy1jb250ZW50JywgdGhpcy4kcmV2aWV3c0NvbnRlbnQpO1xyXG4gICAgICAgIHRoaXMuJGNvbGxhcHNpYmxlID0gJCgnW2RhdGEtY29sbGFwc2libGVdJywgdGhpcy4kcmV2aWV3c0NvbnRlbnQpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy4kY29udGV4dCkge1xyXG4gICAgICAgICAgICBjb2xsYXBzaWJsZUZhY3RvcnkoJ1tkYXRhLWNvbGxhcHNpYmxlXScsIHsgJGNvbnRleHQgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0TGlua0JpbmQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5qZWN0UGFnaW5hdGlvbkxpbmsoKTtcclxuICAgICAgICB0aGlzLnNldHVwUmV2aWV3cygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT24gaW5pdGlhbCBwYWdlIGxvYWQsIHRoZSB1c2VyIGNsaWNrcyBvbiBcIigxMiBSZXZpZXdzKVwiIGxpbmtcclxuICAgICAqIFRoZSBicm93c2VyIGp1bXBzIHRvIHRoZSByZXZpZXcgcGFnZSBhbmQgc2hvdWxkIGV4cGFuZCB0aGUgcmV2aWV3cyBzZWN0aW9uXHJcbiAgICAgKi9cclxuICAgIGluaXRMaW5rQmluZCgpIHtcclxuICAgICAgICBjb25zdCAkcHJvZHVjdFJldmlld0xpbmsgPSAkKCcjcHJvZHVjdFJldmlld19saW5rJyk7XHJcbiAgICAgICAgJHByb2R1Y3RSZXZpZXdMaW5rXHJcbiAgICAgICAgICAgIC5hdHRyKCdocmVmJywgYCR7JHByb2R1Y3RSZXZpZXdMaW5rLmF0dHIoJ2hyZWYnKX0ke3dpbmRvdy5sb2NhdGlvbi5zZWFyY2h9I3Byb2R1Y3QtcmV2aWV3c2ApXHJcbiAgICAgICAgICAgIC5vbignY2xpY2snLCAoKSA9PiB0aGlzLmV4cGFuZFJldmlld3MoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0dXBSZXZpZXdzKCkge1xyXG4gICAgICAgIC8vIFdlJ3JlIGluIHBhZ2luYXRpbmcgc3RhdGUsIHJldmlld3Mgc2hvdWxkIGJlIHZpc2libGVcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoXHJcbiAgICAgICAgICAgICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoLmluZGV4T2YoJyNwcm9kdWN0LXJldmlld3MnKSA9PT0gMFxyXG4gICAgICAgICAgICAmJiB0aGlzLiRyZXZpZXdzQ29udGVudC5wYXJlbnRzKCcucXVpY2tWaWV3JykubGVuZ3RoID09PSAwXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kUmV2aWV3cygpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBmb3JjZSBjb2xsYXBzZSBvbiBwYWdlIGxvYWRcclxuICAgICAgICB0aGlzLiRjb2xsYXBzaWJsZS50cmlnZ2VyKENvbGxhcHNpYmxlRXZlbnRzLmNsaWNrKTtcclxuICAgIH1cclxuXHJcbiAgICBleHBhbmRSZXZpZXdzKCkge1xyXG4gICAgICAgIHRoaXMuJHJldmlld1RhYkxpbmsudHJpZ2dlcignY2xpY2snKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLiRyZXZpZXdzQ29udGVudExpc3QuaGFzQ2xhc3MoJ2lzLW9wZW4nKSkge1xyXG4gICAgICAgICAgICB0aGlzLiRjb2xsYXBzaWJsZS50cmlnZ2VyKENvbGxhcHNpYmxlRXZlbnRzLmNsaWNrKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3QgSUQgaW50byB0aGUgcGFnaW5hdGlvbiBsaW5rXHJcbiAgICAgKi9cclxuICAgIGluamVjdFBhZ2luYXRpb25MaW5rKCkge1xyXG4gICAgICAgIGNvbnN0ICRuZXh0TGluayA9ICQoJy5wYWdpbmF0aW9uLWl0ZW0tLW5leHQgLnBhZ2luYXRpb24tbGluaycsIHRoaXMuJHJldmlld3NDb250ZW50KTtcclxuICAgICAgICBjb25zdCAkcHJldkxpbmsgPSAkKCcucGFnaW5hdGlvbi1pdGVtLS1wcmV2aW91cyAucGFnaW5hdGlvbi1saW5rJywgdGhpcy4kcmV2aWV3c0NvbnRlbnQpO1xyXG5cclxuICAgICAgICBpZiAoJG5leHRMaW5rLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAkbmV4dExpbmsuYXR0cignaHJlZicsIGAkeyRuZXh0TGluay5hdHRyKCdocmVmJyl9ICNwcm9kdWN0LXJldmlld3NgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICgkcHJldkxpbmsubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICRwcmV2TGluay5hdHRyKCdocmVmJywgYCR7JHByZXZMaW5rLmF0dHIoJ2hyZWYnKX0gI3Byb2R1Y3QtcmV2aWV3c2ApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlclZhbGlkYXRpb24oY29udGV4dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgICAgICAgdGhpcy52YWxpZGF0b3IuYWRkKFt7XHJcbiAgICAgICAgICAgIHNlbGVjdG9yOiAnW25hbWU9XCJyZXZyYXRpbmdcIl0nLFxyXG4gICAgICAgICAgICB2YWxpZGF0ZTogJ3ByZXNlbmNlJyxcclxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBzYWZlU3RyaW5nKHRoaXMuY29udGV4dC5yZXZpZXdSYXRpbmcpLFxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgc2VsZWN0b3I6ICdbbmFtZT1cInJldnRpdGxlXCJdJyxcclxuICAgICAgICAgICAgdmFsaWRhdGU6ICdwcmVzZW5jZScsXHJcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZTogc2FmZVN0cmluZyh0aGlzLmNvbnRleHQucmV2aWV3U3ViamVjdCksXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBzZWxlY3RvcjogJ1tuYW1lPVwicmV2dGV4dFwiXScsXHJcbiAgICAgICAgICAgIHZhbGlkYXRlOiAncHJlc2VuY2UnLFxyXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHNhZmVTdHJpbmcodGhpcy5jb250ZXh0LnJldmlld0NvbW1lbnQpLFxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgc2VsZWN0b3I6ICcud3JpdGVSZXZpZXctZm9ybSBbbmFtZT1cImVtYWlsXCJdJyxcclxuICAgICAgICAgICAgdmFsaWRhdGU6IChjYiwgdmFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmb3Jtcy5lbWFpbCh2YWwpO1xyXG4gICAgICAgICAgICAgICAgY2IocmVzdWx0KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiB0aGlzLmNvbnRleHQucmV2aWV3RW1haWwsXHJcbiAgICAgICAgfV0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhdGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdG9yLnBlcmZvcm1DaGVjaygpO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XHJcbmltcG9ydCBob3ZlcmludGVudCBmcm9tICdob3ZlcmludGVudCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsb2FkZWQoKSB7XHJcbiAgICBmdW5jdGlvbiB3aW5kb3dXaWR0aCgpIHtcclxuICAgICAgICBsZXQgd2luV2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcclxuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHdpbldpZHRoKSkgd2luV2lkdGggPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoO1xyXG5cclxuICAgICAgICByZXR1cm4gd2luV2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc2l6ZVRpbWVyO1xyXG5cclxuICAgIC8vIG5hdmlnYXRpb24gZnVuY3Rpb25hbGl0eVxyXG4gICAgJCgnLmV4cGFuZExpbmsnKS5vbignY2xpY2snLCBmdW5jdGlvbiB0b2dnbGVBY3RpdmUoKSB7XHJcbiAgICAgICAgJCh0aGlzKS5wYXJlbnQoKS50b2dnbGVDbGFzcygnYWN0aXZlJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBmdW5jdGlvbiB0b3VjaEV4cGFuZCgpIHtcclxuICAgICAgICAkKCcubmF2UGFnZXMtbWFpbk5hdiAubmF2UGFnZXMtYWN0aW9uJykudW5iaW5kKCdjbGljaycpO1xyXG4gICAgICAgICQoJy5uYXZQYWdlcy1tYWluTmF2IC5uYXZQYWdlcy1hY3Rpb24tbW9yZUljb24nKS51bmJpbmQoJ2NsaWNrJyk7XHJcblxyXG4gICAgICAgIGlmICh3aW5kb3dXaWR0aCgpID4gODAwKSB7XHJcbiAgICAgICAgICAgICQoJyNtZW51IC5saW5rLWV4cGFuZGVkJykucmVtb3ZlQ2xhc3MoJ2xpbmstZXhwYW5kZWQnKTtcclxuICAgICAgICAgICAgJCgnI21lbnUgLmlzLW9wZW4nKS5yZW1vdmVDbGFzcygnaXMtb3BlbicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHdpbmRvd1dpZHRoKCkgPD0gODAwKSB7XHJcbiAgICAgICAgICAgICQoJy5uYXZQYWdlcy1tYWluTmF2IC5uYXZQYWdlcy1pdGVtID4gYSA+IC5uYXZQYWdlcy1hY3Rpb24tbW9yZUljb24nKS5vbignY2xpY2snLCBmdW5jdGlvbiBtb2JpbGVFeHBhbmQoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMpLnBhcmVudHMoJ2xpOmZpcnN0JykudG9nZ2xlQ2xhc3MoJ2xpbmstZXhwYW5kZWQnKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAkKCcubmF2UGFnZS1zdWJNZW51LWl0ZW0gLm5hdlBhZ2VzLWFjdGlvbi1tb3JlSWNvbicpLm9uKCdjbGljaycsIGZ1bmN0aW9uIGV4cGFuZEdyb3VwKCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSAkKHRoaXMpLnBhcmVudCgpLm5leHRVbnRpbCgkKCcubmF2UGFnZS1zdWJNZW51LWl0ZW0nKSwgJ2xpJyk7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMpLnBhcmVudCgpLnRvZ2dsZUNsYXNzKCdpcy1vcGVuJyk7XHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi50b2dnbGVDbGFzcygnaXMtb3BlbicpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbW9iaWxlTmF2UGFkZGluZygpIHtcclxuICAgICAgICBpZiAod2luZG93V2lkdGgoKSA8PSA4MDApIHtcclxuICAgICAgICAgICAgY29uc3QgbG9nb0hlaWdodCA9ICQoJy5oZWFkZXItbG9nbycpLm91dGVySGVpZ2h0KCk7XHJcbiAgICAgICAgICAgICQoJy5tb2JpbGVNZW51LXRvZ2dsZScpLmNzcygnaGVpZ2h0JywgYCR7bG9nb0hlaWdodH1weGApO1xyXG4gICAgICAgICAgICAkKCcubmF2VXNlci1pdGVtLS1jYXJ0JykuY3NzKCdoZWlnaHQnLCBgJHtsb2dvSGVpZ2h0fXB4YCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJCgnLm5hdlVzZXItaXRlbS0tY2FydCcpLmNzcygnaGVpZ2h0JywgJ2F1dG8nKTtcclxuICAgICAgICAgICAgJCgnLm5hdlBhZ2VzLWNvbnRhaW5lcicpLmNzcygncGFkZGluZy10b3AnLCAnMCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBoZWFkZXIgY29tcHJlc3Mgb24gc2Nyb2xsXHJcbiAgICBmdW5jdGlvbiBjYWxjSGVhZGVySGVpZ2h0TW9iaWxlKCkge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlck5vTmF2SGVpZ2h0ID0gJCgnLmhlYWRlci1sb2dvLS13cmFwJykub3V0ZXJIZWlnaHQodHJ1ZSk7XHJcbiAgICAgICAgY29uc3Qgc2VhcmNoSGVpZ2h0ID0gJCgnLnF1aWNrU2VhcmNoV3JhcCcpLm91dGVySGVpZ2h0KHRydWUpO1xyXG4gICAgICAgIGNvbnN0IG1vYmlsZUhlYWRlckhlaWdodCA9IGhlYWRlck5vTmF2SGVpZ2h0ICsgc2VhcmNoSGVpZ2h0O1xyXG4gICAgICAgIGNvbnN0IHBhZ2VPZmZzZXQgPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCk7XHJcblxyXG4gICAgICAgIGlmIChwYWdlT2Zmc2V0ID4gbW9iaWxlSGVhZGVySGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIGlmICghJCgnLnF1aWNrU2VhcmNoV3JhcCAuZm9ybS1pbnB1dCcpLmlzKCc6Zm9jdXMnKSl7XHJcbiAgICAgICAgICAgICAgICBpZiAoISQoJy5oZWFkZXInKS5oYXNDbGFzcygnc2xpbScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLmhlYWRlcicpLmFkZENsYXNzKCdzbGltJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAkKCcuaGVhZGVyJykuY3NzKCdoZWlnaHQnLCBgJHttb2JpbGVIZWFkZXJIZWlnaHQgLSBzZWFyY2hIZWlnaHR9cHhgKTtcclxuICAgICAgICAgICAgICAgICQoJ2JvZHknKS5jc3MoJ3BhZGRpbmctdG9wJywgYCR7bW9iaWxlSGVhZGVySGVpZ2h0IC0gc2VhcmNoSGVpZ2h0fXB4YCk7XHJcbiAgICAgICAgICAgICAgICAkKCcubmF2VXNlci1pdGVtLS1tb2JpbGUtc2VhcmNoJykuY3NzKCd0b3AnLCAnMCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocGFnZU9mZnNldCA9PT0gMCkge1xyXG4gICAgICAgICAgICBpZiAoJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdzbGltJykpIHtcclxuICAgICAgICAgICAgICAgICQoJy5oZWFkZXInKS5yZW1vdmVDbGFzcygnc2xpbScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICQoJy5oZWFkZXInKS5jc3MoJ2hlaWdodCcsIGAke21vYmlsZUhlYWRlckhlaWdodH1weGApO1xyXG4gICAgICAgICAgICAkKCdib2R5JykuY3NzKCdwYWRkaW5nLXRvcCcsIGAke21vYmlsZUhlYWRlckhlaWdodH1weGApO1xyXG4gICAgICAgICAgICAkKCcubmF2VXNlci1pdGVtLS1tb2JpbGUtc2VhcmNoJykuY3NzKCd0b3AnLCBgLSR7aGVhZGVyTm9OYXZIZWlnaHR9cHhgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdG9nZ2xlSGVhZGVySGVpZ2h0RGVza3RvcCgpIHtcclxuICAgICAgICBjb25zdCBoZWFkZXJOb05hdkhlaWdodCA9ICQoJy5oZWFkZXItbG9nby0td3JhcCcpLm91dGVySGVpZ2h0KHRydWUpO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlckhlaWdodCA9ICQoJy5oZWFkZXInKS5vdXRlckhlaWdodCgpO1xyXG4gICAgICAgIGNvbnN0IG5hdkhlaWdodCA9ICQoJy5uYXZQYWdlcy1jb250YWluZXInKS5vdXRlckhlaWdodCgpO1xyXG4gICAgICAgIGNvbnN0IG5hdlRvZ2dsZVdpZHRoID0gNDQ7XHJcbiAgICAgICAgY29uc3QgbG9nb1dpZHRoID0gJCgnLmxvZ28td3JhcCcpLm91dGVyV2lkdGgodHJ1ZSk7XHJcblxyXG4gICAgICAgIGlmICghJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdzbGltJykpIHtcclxuICAgICAgICAgICAgJCgnLmhlYWRlcicpLmNzcygnaGVpZ2h0JywgYCR7aGVhZGVyTm9OYXZIZWlnaHQgKyBuYXZIZWlnaHR9cHhgKTtcclxuICAgICAgICAgICAgJCgnYm9keScpLmNzcygncGFkZGluZy10b3AnLCBgJHtoZWFkZXJOb05hdkhlaWdodCArIG5hdkhlaWdodH1weGApO1xyXG4gICAgICAgICAgICAkKCcubG9nby1hbmQtdG9nZ2xlJykuY3NzKCd3aWR0aCcsIGAke2xvZ29XaWR0aH1gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGNvbXByZXNzSGVhZGVyRGVza3RvcCgpIHtcclxuICAgICAgICAgICAgJCgnLmhlYWRlcicpLmFkZENsYXNzKCdzbGltJyk7XHJcbiAgICAgICAgICAgICQoJy5uYXZQYWdlcy1jb250YWluZXInKS5jc3MoJ3RvcCcsIGAtJHtuYXZIZWlnaHR9cHhgKTtcclxuICAgICAgICAgICAgJCgnLmhlYWRlcicpLmNzcygnaGVpZ2h0JywgYCR7aGVhZGVyTm9OYXZIZWlnaHR9cHhgKTtcclxuICAgICAgICAgICAgJCgnLmRlc2t0b3BNZW51LXRvZ2dsZScpLmNzcygnbGVmdCcsICcwJyk7XHJcbiAgICAgICAgICAgICQoJy5kZXNrdG9wTWVudS10b2dnbGUnKS5jc3MoJ3dpZHRoJywgYCR7bmF2VG9nZ2xlV2lkdGh9cHhgKTtcclxuICAgICAgICAgICAgJCgnLmxvZ28tYW5kLXRvZ2dsZScpLmNzcygnd2lkdGgnLCBgJHtsb2dvV2lkdGggKyBuYXZUb2dnbGVXaWR0aH1gKTtcclxuICAgICAgICAgICAgJCgnYm9keScpLmNzcygncGFkZGluZy10b3AnLCBgJHtoZWFkZXJOb05hdkhlaWdodH1weGApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZXhwYW5kSGVhZGVyRGVza3RvcCgpIHtcclxuICAgICAgICAgICAgJCgnLmhlYWRlcicpLnJlbW92ZUNsYXNzKCdzbGltJyk7XHJcbiAgICAgICAgICAgICQoJy5uYXZQYWdlcy1jb250YWluZXInKS5jc3MoJ3RvcCcsICcwJyk7XHJcbiAgICAgICAgICAgICQoJy5oZWFkZXInKS5jc3MoJ2hlaWdodCcsIGAke2hlYWRlck5vTmF2SGVpZ2h0ICsgbmF2SGVpZ2h0fXB4YCk7XHJcbiAgICAgICAgICAgICQoJy5kZXNrdG9wTWVudS10b2dnbGUnKS5jc3MoJ2xlZnQnLCAnLTQ0cHgnKTtcclxuICAgICAgICAgICAgJCgnLmRlc2t0b3BNZW51LXRvZ2dsZScpLmNzcygnd2lkdGgnLCAnMCcpO1xyXG4gICAgICAgICAgICAkKCcubG9nby1hbmQtdG9nZ2xlJykuY3NzKCd3aWR0aCcsIGAke2xvZ29XaWR0aH1gKTtcclxuICAgICAgICAgICAgJCgnYm9keScpLmNzcygncGFkZGluZy10b3AnLCBgJHtoZWFkZXJOb05hdkhlaWdodCArIG5hdkhlaWdodH1weGApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJCgnLmRlc2t0b3BNZW51LXRvZ2dsZSBhJykudW5iaW5kKCdjbGljaycpO1xyXG5cclxuICAgICAgICAkKCcuZGVza3RvcE1lbnUtdG9nZ2xlIGEnKS5iaW5kKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCQoJy5oZWFkZXInKS5oYXNDbGFzcygnc2xpbScpKSB7XHJcbiAgICAgICAgICAgICAgICBleHBhbmRIZWFkZXJEZXNrdG9wKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJCh3aW5kb3cpLnVuYmluZCgnc2Nyb2xsJyk7XHJcbiAgICAgICAgJCh3aW5kb3cpLnNjcm9sbCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhZ2VPZmZzZXQgPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCk7XHJcbiAgICAgICAgICAgIGlmIChwYWdlT2Zmc2V0ID4gaGVhZGVySGVpZ2h0ICYmICEkKCcuaGVhZGVyJykuaGFzQ2xhc3MoJ3NsaW0nKSkge1xyXG4gICAgICAgICAgICAgICAgY29tcHJlc3NIZWFkZXJEZXNrdG9wKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChwYWdlT2Zmc2V0ID09PSAwICYmICQoJy5oZWFkZXInKS5oYXNDbGFzcygnc2xpbScpKSB7XHJcbiAgICAgICAgICAgICAgICBleHBhbmRIZWFkZXJEZXNrdG9wKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gdG9nZ2xlSGVhZGVySGVpZ2h0TW9iaWxlKCkge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlck5vTmF2SGVpZ2h0ID0gJCgnLmhlYWRlci1sb2dvLS13cmFwJykub3V0ZXJIZWlnaHQodHJ1ZSk7XHJcbiAgICAgICAgY29uc3Qgc2VhcmNoSGVpZ2h0ID0gJCgnLnF1aWNrU2VhcmNoV3JhcCcpLm91dGVySGVpZ2h0KHRydWUpO1xyXG4gICAgICAgIGNvbnN0IG1vYmlsZUhlYWRlckhlaWdodCA9IGhlYWRlck5vTmF2SGVpZ2h0ICsgc2VhcmNoSGVpZ2h0O1xyXG5cclxuICAgICAgICBjYWxjSGVhZGVySGVpZ2h0TW9iaWxlKCk7XHJcblxyXG4gICAgICAgICQoJy5uYXZVc2VyLWl0ZW0tLW1vYmlsZS1zZWFyY2gnKS51bmJpbmQoJ2NsaWNrJyk7XHJcbiAgICAgICAgJCgnLm5hdlVzZXItaXRlbS0tbW9iaWxlLXNlYXJjaCcpLmJpbmQoJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdzbGltJykpIHtcclxuICAgICAgICAgICAgICAgICQoJy5oZWFkZXInKS5yZW1vdmVDbGFzcygnc2xpbScpO1xyXG4gICAgICAgICAgICAgICAgJCgnLmhlYWRlcicpLmNzcygnaGVpZ2h0JywgYCR7bW9iaWxlSGVhZGVySGVpZ2h0fXB4YCk7XHJcbiAgICAgICAgICAgICAgICAkKCdib2R5JykuY3NzKCdwYWRkaW5nLXRvcCcsIGAke21vYmlsZUhlYWRlckhlaWdodH1weGApO1xyXG4gICAgICAgICAgICAgICAgJCgnLm5hdlVzZXItaXRlbS0tbW9iaWxlLXNlYXJjaCcpLmNzcygndG9wJywgYC0ke2hlYWRlck5vTmF2SGVpZ2h0fXB4YCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAkKCcuaGVhZGVyJykuYWRkQ2xhc3MoJ3NsaW0nKTtcclxuICAgICAgICAgICAgICAgICQoJy5oZWFkZXInKS5jc3MoJ2hlaWdodCcsIGAke21vYmlsZUhlYWRlckhlaWdodCAtIHNlYXJjaEhlaWdodH1weGApO1xyXG4gICAgICAgICAgICAgICAgJCgnYm9keScpLmNzcygncGFkZGluZy10b3AnLCBgJHttb2JpbGVIZWFkZXJIZWlnaHQgLSBzZWFyY2hIZWlnaHR9cHhgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKHdpbmRvdykudW5iaW5kKCdzY3JvbGwnKTtcclxuICAgICAgICAkKHdpbmRvdykuc2Nyb2xsKCgpID0+IHtcclxuICAgICAgICAgICAgdG9nZ2xlSGVhZGVySGVpZ2h0TW9iaWxlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaGVhZGVyQ29tcHJlc3MoKSB7XHJcbiAgICAgICAgJCh3aW5kb3cpLnVuYmluZCgnc2Nyb2xsJyk7XHJcbiAgICAgICAgJCgnLm5hdlVzZXItaXRlbS0tbW9iaWxlLXNlYXJjaCcpLnVuYmluZCgnY2xpY2snKTtcclxuXHJcbiAgICAgICAgaWYgKHdpbmRvd1dpZHRoKCkgPiA4MDApIHtcclxuICAgICAgICAgICAgdG9nZ2xlSGVhZGVySGVpZ2h0RGVza3RvcCgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2luZG93V2lkdGgoKSA8PSA4MDApIHtcclxuICAgICAgICAgICAgdG9nZ2xlSGVhZGVySGVpZ2h0TW9iaWxlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgICQoJy5tb2JpbGUtY2xvc2VOYXYnKS5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgJCgnaGVhZGVyLmhlYWRlciA+IC5tb2JpbGVNZW51LXRvZ2dsZScpLnRyaWdnZXIoJ2NsaWNrJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBzcGxpdCBuYXYgaW50byBjb2x1bW5zXHJcbiAgICBjb25zdCBudW1QZXJDb2x1bW4gPSB3aW5kb3cudGhlbWVfc2V0dGluZ3MubGlua3NQZXJDb2w7XHJcbiAgICBjb25zdCBtZW51Q29sdW1ucyA9ICQoJy5uYXZQYWdlcyAuY29sdW1uLW1lbnUnKTtcclxuXHJcbiAgICBtZW51Q29sdW1ucy5lYWNoKGZ1bmN0aW9uIHNwbGl0Q29sdW1ucygpIHtcclxuICAgICAgICBjb25zdCAkY29sbWVudSA9ICQodGhpcyk7XHJcbiAgICAgICAgY29uc3QgJGxpcyA9ICRjb2xtZW51LmZpbmQoJ2xpJyk7XHJcblxyXG4gICAgICAgIGxldCBjb2xNZW51SHRtbCA9ICc8dWw+JztcclxuICAgICAgICBsZXQgY29sTWVudUNvdW50ID0gMDtcclxuXHJcbiAgICAgICAgbGV0IGNvbEdyb3VwID0gJyc7XHJcbiAgICAgICAgbGV0IGNvbEdyb3VwQ291bnQgPSAwO1xyXG5cclxuICAgICAgICAkbGlzLmVhY2goZnVuY3Rpb24gYnVpbGRDb2x1bW4oKSB7XHJcbiAgICAgICAgICAgIGNvbnN0ICRsaSA9ICQodGhpcyk7XHJcbiAgICAgICAgICAgIGNvbnN0ICRsaUNsYXNzID0gJGxpLmF0dHIoJ2NsYXNzJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoJGxpQ2xhc3MgPT09ICduYXZQYWdlLXN1Yk1lbnUtaXRlbScpIHtcclxuICAgICAgICAgICAgICAgIC8vIHRlc3QgaWYgdGhlcmUgaXMgcm9vbSBmb3IgdGhlIGdyb3VwIGluIHRoZSBjdXJyZW50IGNvbHVtblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbE1lbnVDb3VudCArIGNvbEdyb3VwQ291bnQgPiBudW1QZXJDb2x1bW4gJiYgY29sTWVudUh0bWwgIT09ICc8dWw+Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBncm91cCBkb2Vzbid0IGZpdCwgc3RhcnQgYSBuZXcgY29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgY29sTWVudUh0bWwgKz0gJzwvdWw+PHVsPic7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sTWVudUNvdW50ID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBhZGQgZ3JvdXAgdG8gbWVudVxyXG4gICAgICAgICAgICAgICAgY29sTWVudUh0bWwgKz0gY29sR3JvdXA7IC8vIGFkZCBncm91cCBodG1sIHRvIG1lbnVcclxuICAgICAgICAgICAgICAgIGNvbE1lbnVDb3VudCArPSBjb2xHcm91cENvdW50OyAvLyBsaW5rIGNvdW50IGZvciB0aGUgY3VycmVudCBjb2x1bW5cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzdGFydCBuZXcgZ3JvdXBcclxuICAgICAgICAgICAgICAgIGNvbEdyb3VwID0gJyc7XHJcbiAgICAgICAgICAgICAgICBjb2xHcm91cENvdW50ID0gMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gYWRkIHRvIGdyb3VwXHJcbiAgICAgICAgICAgIGNvbEdyb3VwICs9IGA8bGkgY2xhc3M9XCIkeyRsaUNsYXNzfVwiPiR7JGxpLmh0bWwoKX08L2xpPmA7XHJcbiAgICAgICAgICAgIGNvbEdyb3VwQ291bnQgKys7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIGFkZCBsYXN0IGdyb3VwIHRvIG1lbnVcclxuICAgICAgICBpZiAoY29sR3JvdXBDb3VudCA+IDAgJiYgKGNvbEdyb3VwQ291bnQgKyBjb2xNZW51Q291bnQgPD0gbnVtUGVyQ29sdW1uKSkge1xyXG4gICAgICAgICAgICBjb2xNZW51SHRtbCArPSBgJHtjb2xHcm91cH08L3VsPmA7XHJcbiAgICAgICAgfSBlbHNlIGlmIChjb2xHcm91cENvdW50ID4gMCAmJiAoY29sR3JvdXBDb3VudCArIGNvbE1lbnVDb3VudCA+IG51bVBlckNvbHVtbikpIHtcclxuICAgICAgICAgICAgY29sTWVudUh0bWwgKz0gYDwvdWw+PHVsPiR7Y29sR3JvdXB9PC91bD5gO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJGNvbG1lbnUuaHRtbChjb2xNZW51SHRtbCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBzZXQgd2lkdGggb2YgZHJvcGRvd25zXHJcbiAgICBmdW5jdGlvbiBwcmVwYXJlTWVudSgpIHtcclxuICAgICAgICBpZiAod2luZG93V2lkdGgoKSA+IDgwMCkge1xyXG4gICAgICAgICAgICBjb25zdCBkcm9wZG93blBhZGRpbmcgPSBwYXJzZUludCgkKCcuY29sdW1uLW1lbnU6Zmlyc3QnKS5jc3MoJ3BhZGRpbmctbGVmdCcpLCAxMCkgKiAyO1xyXG4gICAgICAgICAgICBjb25zdCBuYXZXaWR0aCA9ICQoJy5uYXZQYWdlcycpLndpZHRoKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbFdpZHRoID0gTWF0aC5mbG9vcigobmF2V2lkdGggLSBkcm9wZG93blBhZGRpbmcpICogMC4yKTtcclxuICAgICAgICAgICAgbWVudUNvbHVtbnMuZWFjaChmdW5jdGlvbiBjb3VudENvbHMoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xzID0gJCh0aGlzKS5jaGlsZHJlbigndWwnKS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkcm9wZG93bldpZHRoID0gKGNvbFdpZHRoICogY29scyArIGRyb3Bkb3duUGFkZGluZyA8PSBuYXZXaWR0aCA/IGNvbFdpZHRoICogY29scyArIGRyb3Bkb3duUGFkZGluZyA6IG5hdldpZHRoKTtcclxuICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oJ3VsJykuY3NzKCdmbGV4JywgYDAgMCAke2NvbFdpZHRofXB4YCk7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmNzcygnd2lkdGgnLCBgJHtkcm9wZG93bldpZHRofXB4YCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmF2T2Zmc2V0ID0gJCgnLm5hdlBhZ2VzJykub2Zmc2V0KCkubGVmdDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudE9mZnNldCA9ICQodGhpcykucGFyZW50KCkub2Zmc2V0KCkubGVmdCAtIG5hdk9mZnNldDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNwYWNlQXZhaWxhYmxlID0gbmF2V2lkdGggLSBwYXJlbnRPZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGRyb3Bkb3duV2lkdGggPiBzcGFjZUF2YWlsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0Qm91bmQgPSBkcm9wZG93bldpZHRoIC0gc3BhY2VBdmFpbGFibGU7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jc3MoJ2xlZnQnLCBgLSR7cmlnaHRCb3VuZH1weGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtZW51Q29sdW1ucy5lYWNoKGZ1bmN0aW9uIHJlc2V0V2lkdGhzKCkge1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigndWwnKS5jc3MoJ2ZsZXgnLCAnMSAxIGF1dG8nKTtcclxuICAgICAgICAgICAgICAgICQodGhpcykuY3NzKCd3aWR0aCcsICdhdXRvJyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0b3VjaEV4cGFuZCgpO1xyXG4gICAgbW9iaWxlTmF2UGFkZGluZygpO1xyXG4gICAgaGVhZGVyQ29tcHJlc3MoKTtcclxuXHJcbiAgICAvLyBob3ZlcmludGVudFxyXG4gICAgY29uc3Qgb3B0cyA9IHtcclxuICAgICAgICBpbnRlcnZhbDogMTAwLFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBlbCA9ICQoJy5uYXZQYWdlcy1tZWdhIC5uYXZQYWdlcy1pdGVtJyk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGhvdmVyaW50ZW50KGVsW2ldLFxyXG4gICAgICAgIGZ1bmN0aW9uIGhvdmVySW50ZW50T3ZlcigpIHtcclxuICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnaG92ZXInKTtcclxuICAgICAgICB9LCBmdW5jdGlvbiBob3ZlckludGVudE91dCgpIHtcclxuICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnaG92ZXInKTtcclxuICAgICAgICB9KS5vcHRpb25zKG9wdHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByZXBhcmVNZW51KCk7XHJcblxyXG4gICAgJCh3aW5kb3cpLm9uKCdyZXNpemUnLCAoKSA9PiB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHJlc2l6ZVRpbWVyKTtcclxuICAgICAgICByZXNpemVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0b3VjaEV4cGFuZCgpO1xyXG4gICAgICAgICAgICBtb2JpbGVOYXZQYWRkaW5nKCk7XHJcbiAgICAgICAgICAgIHByZXBhcmVNZW51KCk7XHJcbiAgICAgICAgICAgIGhlYWRlckNvbXByZXNzKCk7XHJcbiAgICAgICAgICAgIGNsb3NlTWluaUNhcnQoKTtcclxuICAgICAgICB9LCA1MDApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29yaWVudGF0aW9uY2hhbmdlJywgKCkgPT4ge1xyXG4gICAgICAgIHRvdWNoRXhwYW5kKCk7XHJcbiAgICAgICAgcHJlcGFyZU1lbnUoKTtcclxuICAgICAgICBoZWFkZXJDb21wcmVzcygpO1xyXG4gICAgfSwgZmFsc2UpO1xyXG5cclxuICAgIC8vIGhpZGUgcXVpY2sgc2VhcmNoIHJlc3VsdHMgd2hlbiBjbGlja2VkIG91dHNpZGUgb2YgcXVpY2sgc2VhcmNoXHJcbiAgICAkKHdpbmRvdykub24oJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICQoJy5xdWlja1NlYXJjaFdyYXAgLnF1aWNrU2VhcmNoUmVzdWx0cycpLmhpZGUoKTtcclxuICAgIH0pO1xyXG5cclxuICAgICQoJy5xdWlja1NlYXJjaFdyYXAnKS5vbignY2xpY2snLCAnLm1vZGFsLWNsb3NlJywgKCkgPT4ge1xyXG4gICAgICAgICQoJy5xdWlja1NlYXJjaFdyYXAgLnF1aWNrU2VhcmNoUmVzdWx0cycpLmhpZGUoKTtcclxuICAgIH0pO1xyXG5cclxuICAgICQoJy5xdWlja1NlYXJjaFdyYXAnKS5vbignY2xpY2snLCAoZXZlbnQpID0+IHtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH0pO1xyXG5cclxuICAgICQoJy5xdWlja1NlYXJjaFJlc3VsdHMnKS5vbignY2xpY2snLCAnLnF1aWNrU2VhcmNoQWxsJywgKCkgPT4ge1xyXG4gICAgICAgICQoJyNxdWlja1NlYXJjaCBmb3JtJykuc3VibWl0KCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBzaG93IHF1aWNrIHNlYXJjaCByZXN1bHRzIHdoZW4gZm9jdXNlZCBpbiBzZWFyY2ggaW5wdXRcclxuICAgICQoJy5xdWlja1NlYXJjaFdyYXAgaW5wdXQnKS5vbignZm9jdXNpbicsICgpID0+IHtcclxuICAgICAgICAkKCcucXVpY2tTZWFyY2hXcmFwIC5xdWlja1NlYXJjaFJlc3VsdHMnKS5zaG93KCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBjb21wYXJlIGZ1bmN0aW9uYWxpdHlcclxuICAgICQoJy5jb21wYXJlLWlucHV0Jykub24oJ2NoYW5nZScsIGZ1bmN0aW9uIGNvbXBhcmVUb2dnbGUoKSB7XHJcbiAgICAgICAgY2hlY2tDb21wYXJlKCQodGhpcykpO1xyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIGlmICgkKCcucGFnZS1zaWRlYmFyJykubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgLy8gcmUtYmluZCBjb21wYXJlIG9uY2hhbmdlIHdoZW4gZmlsdGVycyB1cGRhdGVcclxuICAgICAgICBjb25zdCBjb25maWcgPSB7IGF0dHJpYnV0ZXM6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9O1xyXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gZnVuY3Rpb24obXV0YXRpb25zTGlzdCwgb2JzZXJ2ZXIpIHtcclxuICAgICAgICAgICAgLy8gVXNlIHRyYWRpdGlvbmFsICdmb3IgbG9vcHMnIGZvciBJRSAxMVxyXG4gICAgICAgICAgICAkKCcuY29tcGFyZS1pbnB1dCcpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiBjb21wYXJlVG9nZ2xlKCkge1xyXG4gICAgICAgICAgICAgICAgY2hlY2tDb21wYXJlKCQodGhpcykpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xyXG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUoJCgnLnBhZ2Utc2lkZWJhcicpLmdldCgwKSwgY29uZmlnKTtcclxuICAgIH1cclxuXHJcbiAgICAkKGRvY3VtZW50KS5hamF4Q29tcGxldGUoKCkgPT4ge1xyXG4gICAgICAgICQoJy5jb21wYXJlLWlucHV0Jykub24oJ2NoYW5nZScsIGZ1bmN0aW9uIGNvbXBhcmVUb2dnbGUoKSB7XHJcbiAgICAgICAgICAgIGNoZWNrQ29tcGFyZSgkKHRoaXMpKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICBmdW5jdGlvbiBjaGVja0NvbXBhcmUoJHRoaXMpIHtcclxuICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gJHRoaXMuaXMoJzpjaGVja2VkJyk7XHJcbiAgICAgICAgY29uc3QgY29tcGFyZUxhYmVsID0gJHRoaXMucGFyZW50KCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGlzU2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgY29tcGFyZUxhYmVsLmZpbmQoJ3NwYW4nKS5zaG93KCk7XHJcbiAgICAgICAgICAgIGNvbXBhcmVMYWJlbC5uZXh0KCkuY3NzKCd2aXNpYmlsaXR5JywgJ3Zpc2libGUnKTtcclxuICAgICAgICAgICAgY29tcGFyZUxhYmVsLm5leHQoKS5zaG93KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29tcGFyZUxhYmVsLmZpbmQoJ3NwYW4nKS5oaWRlKCk7XHJcbiAgICAgICAgICAgIGNvbXBhcmVMYWJlbC5uZXh0KCkuY3NzKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpO1xyXG4gICAgICAgICAgICBjb21wYXJlTGFiZWwubmV4dCgpLmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcmV2aWV3IGFuY2hvciBsaW5rXHJcbiAgICAkKCcucHJvZHVjdFZpZXctcmV2aWV3TGluayBhJykub24oJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmV2aWV3c09mZnNldCA9ICQoJyNyZXZpZXdzLWFjY29yZGlvbicpLm9mZnNldCgpID8gJCgnI3Jldmlld3MtYWNjb3JkaW9uJykub2Zmc2V0KCkudG9wIDogMDtcclxuICAgICAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSAkKCcuaGVhZGVyLWxvZ28tLXdyYXAnKS5vdXRlckhlaWdodCh0cnVlKTtcclxuICAgICAgICAkKHdpbmRvdykuc2Nyb2xsVG9wKHJldmlld3NPZmZzZXQgLSBoZWFkZXJIZWlnaHQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gZm9vdGVyIGNvbGxhcHNlXHJcbiAgICAkKCcuZm9vdGVyLWluZm8tZHJvcGRvd24gLmZvb3Rlci1pbmZvLWhlYWRpbmcnKS5vbignY2xpY2snLCBmdW5jdGlvbiB0b2dnbGVGb290ZXJCbG9ja3MoKSB7XHJcbiAgICAgICAgJCh0aGlzKS5wYXJlbnQoKS50b2dnbGVDbGFzcygnaXMtb3BlbicpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsb3NlTWluaUNhcnQoKSB7XHJcbiAgICBpZiAoJCgnLm5hdlVzZXItaXRlbS0tY2FydCAuaXMtb3BlbicpLmxlbmd0aCA+IDAgKXtcclxuICAgICAgICAkKCcubmF2VXNlci1pdGVtLS1jYXJ0IGEnKS50cmlnZ2VyKCdjbGljaycpO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uL2ZvdW5kYXRpb24nO1xyXG5pbXBvcnQgJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi9mb3VuZGF0aW9uLnJldmVhbCc7XHJcbmltcG9ydCBub2QgZnJvbSAnLi9jb21tb24vbm9kJztcclxuaW1wb3J0IFBhZ2VNYW5hZ2VyIGZyb20gJy4vcGFnZS1tYW5hZ2VyJztcclxuaW1wb3J0IHsgd2lzaGxpc3RQYWdpbmF0b3JIZWxwZXIgfSBmcm9tICcuL2NvbW1vbi91dGlscy9wYWdpbmF0aW9uLXV0aWxzJztcclxuaW1wb3J0IHsgYW5ub3VuY2VJbnB1dEVycm9yTWVzc2FnZSB9IGZyb20gJy4vY29tbW9uL3V0aWxzL2Zvcm0tdXRpbHMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2lzaExpc3QgZXh0ZW5kcyBQYWdlTWFuYWdlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0KSB7XHJcbiAgICAgICAgc3VwZXIoY29udGV4dCk7XHJcblxyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICdhY2NvdW50L2FkZC13aXNobGlzdCcsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgY29uZmlybSBib3ggYmVmb3JlIGRlbGV0aW5nIGFsbCB3aXNoIGxpc3RzXHJcbiAgICAgKi9cclxuICAgIHdpc2hsaXN0RGVsZXRlQ29uZmlybSgpIHtcclxuICAgICAgICAkKCdib2R5Jykub24oJ2NsaWNrJywgJ1tkYXRhLXdpc2hsaXN0LWRlbGV0ZV0nLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IHdpbmRvdy5jb25maXJtKHRoaXMuY29udGV4dC53aXNobGlzdERlbGV0ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY29uZmlybWVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlckFkZFdpc2hMaXN0VmFsaWRhdGlvbigkYWRkV2lzaGxpc3RGb3JtKSB7XHJcbiAgICAgICAgdGhpcy5hZGRXaXNobGlzdFZhbGlkYXRvciA9IG5vZCh7XHJcbiAgICAgICAgICAgIHN1Ym1pdDogJy53aXNobGlzdC1mb3JtIGlucHV0W3R5cGU9XCJzdWJtaXRcIl0nLFxyXG4gICAgICAgICAgICB0YXA6IGFubm91bmNlSW5wdXRFcnJvck1lc3NhZ2UsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkV2lzaGxpc3RWYWxpZGF0b3IuYWRkKFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICcud2lzaGxpc3QtZm9ybSBpbnB1dFtuYW1lPVwid2lzaGxpc3RuYW1lXCJdJyxcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRlOiAoY2IsIHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbC5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYihyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogdGhpcy5jb250ZXh0LmVudGVyV2lzaGxpc3ROYW1lRXJyb3IsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgXSk7XHJcblxyXG4gICAgICAgICRhZGRXaXNobGlzdEZvcm0ub24oJ3N1Ym1pdCcsIGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hZGRXaXNobGlzdFZhbGlkYXRvci5wZXJmb3JtQ2hlY2soKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmFkZFdpc2hsaXN0VmFsaWRhdG9yLmFyZUFsbCgndmFsaWQnKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uUmVhZHkoKSB7XHJcbiAgICAgICAgY29uc3QgJGFkZFdpc2hMaXN0Rm9ybSA9ICQoJy53aXNobGlzdC1mb3JtJyk7XHJcblxyXG4gICAgICAgIGlmICgkKCdbZGF0YS1wYWdpbmF0aW9uLXdpc2hsaXN0XScpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB3aXNobGlzdFBhZ2luYXRvckhlbHBlcigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCRhZGRXaXNoTGlzdEZvcm0ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJBZGRXaXNoTGlzdFZhbGlkYXRpb24oJGFkZFdpc2hMaXN0Rm9ybSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLndpc2hsaXN0RGVsZXRlQ29uZmlybSgpO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCByZXF1ZXN0IGZyb20gJy4uL2xpYi9yZXF1ZXN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3Mge1xuICAgIC8qKlxuICAgICAqIEBDb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5yZW1vdGVWZXJzaW9uID0gdmVyc2lvbiB8fCAndjEnO1xuICAgICAgICB0aGlzLnJlbW90ZUJhc2VFbmRwb2ludCA9ICcvcmVtb3RlLyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZCBbJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnXVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtCb29sZWFufSByZW1vdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIG1ha2VSZXF1ZXN0KHVybCwgbWV0aG9kLCBvcHRpb25zLCByZW1vdGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJlcXVlc3QodXJsLCB7XG4gICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgICByZW1vdGUsXG4gICAgICAgICAgICByZXF1ZXN0T3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgfSwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGVuZHBvaW50XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZCBbJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnXVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICByZW1vdGVSZXF1ZXN0KGVuZHBvaW50LCBtZXRob2QsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHJlbW90ZVVybCA9IHRoaXMucmVtb3RlQmFzZUVuZHBvaW50ICsgdGhpcy5yZW1vdGVWZXJzaW9uICsgZW5kcG9pbnQ7XG5cbiAgICAgICAgdGhpcy5tYWtlUmVxdWVzdChyZW1vdGVVcmwsIG1ldGhvZCwgb3B0aW9ucywgdHJ1ZSwgY2FsbGJhY2spO1xuICAgIH1cbn1cbiIsImltcG9ydCBCb2RsRXZlbnRzQ2FydCBmcm9tICcuLi9ib2RsL2VtaXR0ZXJzL2NhcnQnO1xuaW1wb3J0IEJhc2UgZnJvbSAnLi9iYXNlJztcbmltcG9ydCBIb29rcyBmcm9tICcuLi9ob29rcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgY29uc3RydWN0b3IodmVyc2lvbikge1xuICAgICAgICBzdXBlcih2ZXJzaW9uKTtcbiAgICAgICAgdGhpcy5ib2RsRXZlbnRzQ2FydCA9IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0Qm9kbEV2ZW50c0NhcnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5ib2RsRXZlbnRzQ2FydCkge1xuICAgICAgICAgICAgdGhpcy5ib2RsRXZlbnRzQ2FydCA9IG5ldyBCb2RsRXZlbnRzQ2FydCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJvZGxFdmVudHNDYXJ0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIGNvbGxlY3Rpb24gb2YgQ2FydHMuIEZvciBub3csIHRoaXMgd2lsbCBvbmx5IHJldHVybiBhbiBhcnJheSBvZiBhIHNpbmdsZSBjYXJ0IGFzIG11bHRpcGxlIGNhcnRzIHBlciBzZXNzaW9uXG4gICAgICogYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIGdldENhcnRzKG9wdGlvbnMgPSB7fSwgY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IHVybCA9ICcvYXBpL3N0b3JlZnJvbnQvY2FydHMnO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVPcHRpb25zKSB7XG4gICAgICAgICAgICB1cmwgPSB0aGlzLmluY2x1ZGVPcHRpb25zKHVybCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1ha2VSZXF1ZXN0KHVybCwgJ0dFVCcsIG9wdGlvbnMsIHRydWUsIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IENhcnQncyBkZXRhaWxzLCBlaXRoZXIgd2l0aCBvciB3aXRob3V0IFByb2R1Y3QgT3B0aW9uIHNlbGVjdGlvbnMuXG4gICAgICogQ2FuIGFsc28gYmUgdXNlZCB0byBnZXQgYSBwYXJ0aWN1bGFyIGNhcnQgcHJvdmlkZWQgYSBjYXJ0SWQgaW4gdGhlIG9wdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgZ2V0Q2FydChvcHRpb25zID0ge30sIGNhbGxiYWNrKSB7XG4gICAgICAgIC8qIElmIG5vIGNhcnQgSUQgaXMgcHJvdmlkZWQsIGdldCB0aGUgY29sbGVjdGlvbiBvZiBjYXJ0cyBhbmQgcmV0dXJuIHRoZSBmaXJzdCBvbmUgKi9cbiAgICAgICAgaWYgKCFvcHRpb25zLmNhcnRJZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FydHMob3B0aW9ucywgKGVyciwgcmVzcG9uc2UpID0+IGNhbGxiYWNrKGVyciwgcmVzcG9uc2VbMF0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB1cmwgPSBgL2FwaS9zdG9yZWZyb250L2NhcnRzLyR7b3B0aW9ucy5jYXJ0SWR9YDtcblxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlT3B0aW9ucykge1xuICAgICAgICAgICAgdXJsID0gdGhpcy5pbmNsdWRlT3B0aW9ucyh1cmwpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tYWtlUmVxdWVzdCh1cmwsICdHRVQnLCBvcHRpb25zLCB0cnVlLCAoZXJyLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc3VtbWFyeSBmb3IgdGhlIGN1cnJlbnQgcHJpbWFyeSBjYXJ0LiBUaGlzIHN1bW1hcnkgZG9lcyBub3QgaW5jbHVkZSB0aGUgZnVsbCBkZXRhaWxzIG9mIHRoZSBjYXJ0LCBidXRcbiAgICAgKiB0aGUgcmVzcG9uc2UgdGltZSBpcyBtdWNoIGZhc3RlciBhbmQgaXQncyBhcHByb3ByaWF0ZSBmb3Igc3VtbWFyeSB1c2UgY2FzZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgZ2V0Q2FydFN1bW1hcnkob3B0aW9ucyA9IHt9LCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCB1cmwgPSAnL2FwaS9zdG9yZWZyb250L2NhcnQtc3VtbWFyeSc7XG5cbiAgICAgICAgdGhpcy5tYWtlUmVxdWVzdCh1cmwsICdHRVQnLCBvcHRpb25zLCB0cnVlLCAoZXJyLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCB0aGUgcGFyYW1ldGVycyB0byBhIFVSTCBuZWVkZWQgdG8gZ2V0IHByb2R1Y3Qgb3B0aW9uIGRldGFpbHMgb24gY2FydCBsaW5lIGl0ZW1zXG4gICAgICogQHBhcmFtIHVybFxuICAgICAqL1xuICAgIGluY2x1ZGVPcHRpb25zKHVybCkge1xuICAgICAgICByZXR1cm4gYCR7dXJsfT9pbmNsdWRlPWxpbmVJdGVtcy5waHlzaWNhbEl0ZW1zLm9wdGlvbnMsbGluZUl0ZW1zLmRpZ2l0YWxJdGVtcy5vcHRpb25zYDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzdW0gb2YgdGhlIGNhcnQgbGluZSBpdGVtIHF1YW50aXRpZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBnZXRDYXJ0UXVhbnRpdHkob3B0aW9ucyA9IHt9LCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmdldENhcnRTdW1tYXJ5KG9wdGlvbnMsIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcXVhbnRpdHkgPSAwO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXG4gICAgICAgICAgICAgICAgJiYgcmVzcG9uc2Uuc3RhdHVzICE9PSAyMDRcbiAgICAgICAgICAgICAgICAmJiByZXNwb25zZS50b3RhbF9xdWFudGl0eSkge1xuICAgICAgICAgICAgICAgIHF1YW50aXR5ID0gcmVzcG9uc2UudG90YWxfcXVhbnRpdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBxdWFudGl0eSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuaGFuY2Ugd2l0aCBCaWcgT3BlbiBEYXRhIExheWVyIGV2ZW50c1xuICAgICAqXG4gICAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIGl0ZW1BZGQoZm9ybURhdGEsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlSXRlbUFkZChmb3JtRGF0YSwgKGVyciwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRCb2RsRXZlbnRzQ2FydCgpLmVtaXRBZGRJdGVtKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgaXRlbSB0byBjYXJ0IHdpdGggb3B0aW9ucyAodmFyaWFudHMpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgaGFuZGxlSXRlbUFkZChmb3JtRGF0YSwgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5yZW1vdGVSZXF1ZXN0KCcvY2FydC9hZGQnLCAnUE9TVCcsIHsgZm9ybURhdGEgfSwgKGVyciwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVtaXREYXRhID0ge1xuICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIEhvb2tzLmVtaXQoJ2NhcnQtaXRlbS1hZGQtcmVtb3RlJywgZW1pdERhdGEpO1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBjYXJ0IGl0ZW0gcXVhbnRpdHlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gaXRlbUlkXG4gICAgICogQHBhcmFtIHtOdW1iZXJ8RnVuY3Rpb259IHF0eVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258bnVsbH0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBpdGVtVXBkYXRlKGl0ZW1JZCwgcXR5LCBjYWxsYmFjaykge1xuICAgICAgICBsZXQgY2FsbGJhY2tBcmcgPSBjYWxsYmFjaztcbiAgICAgICAgbGV0IGl0ZW1zO1xuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1JZCkgJiYgdHlwZW9mIHF0eSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FsbGJhY2tBcmcgPSBxdHk7XG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1JZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZW1zID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGl0ZW1JZCxcbiAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IHF0eSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlKGl0ZW1zLCAoZXJyLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZW1pdERhdGEgPSB7XG4gICAgICAgICAgICAgICAgaXRlbXMsXG4gICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHF0eSA9PT0gMCAmJiAhZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRCb2RsRXZlbnRzQ2FydCgpLmVtaXRSZW1vdmVJdGVtKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgSG9va3MuZW1pdCgnY2FydC1pdGVtLXVwZGF0ZS1yZW1vdGUnLCBlbWl0RGF0YSk7XG4gICAgICAgICAgICBjYWxsYmFja0FyZyhlcnIsIHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5oYW5jZSB3aXRoIEJpZyBPcGVuIERhdGEgTGF5ZXIgZXZlbnRzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaXRlbUlkXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBpdGVtUmVtb3ZlKGl0ZW1JZCwgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5oYW5kbGVJdGVtUmVtb3ZlKGl0ZW1JZCwgKGVyciwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRCb2RsRXZlbnRzQ2FydCgpLmVtaXRSZW1vdmVJdGVtKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgY2FydCBpdGVtc1xuICAgICAqXG4gICAgICogQ2FsbHMgdGhlIGludGVybmFsIHVwZGF0ZSBmdW5jdGlvbiB3aXRoIHF1YW50aXR5OiAwXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaXRlbUlkXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBoYW5kbGVJdGVtUmVtb3ZlKGl0ZW1JZCwgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6IGl0ZW1JZCxcbiAgICAgICAgICAgICAgICBxdWFudGl0eTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy51cGRhdGUoaXRlbXMsIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbWl0RGF0YSA9IHtcbiAgICAgICAgICAgICAgICBpdGVtcyxcbiAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBIb29rcy5lbWl0KCdjYXJ0LWl0ZW0tcmVtb3ZlLXJlbW90ZScsIGVtaXREYXRhKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZ2lmdHdyYXBwaW5nIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaXRlbUlkXG4gICAgICogQHBhcmFtIHtPYmplY3R8RnVuY3Rpb259IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufG51bGx9IGNhbGxiYWNrXG4gICAgICovXG4gICAgZ2V0SXRlbUdpZnRXcmFwcGluZ09wdGlvbnMoaXRlbUlkLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICBsZXQgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGxldCBjYWxsYmFja0FyZyA9IGNhbGxiYWNrO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FsbGJhY2tBcmcgPSBvcHRzO1xuICAgICAgICAgICAgb3B0cyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW1vdGVSZXF1ZXN0KGAvZ2lmdC13cmFwcGluZy8ke2l0ZW1JZH1gLCAnR0VUJywgb3B0cywgY2FsbGJhY2tBcmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN1Ym1pdCBnaWZ0d3JhcHBpbmcgb3B0aW9uc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGl0ZW1JZFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgc3VibWl0SXRlbUdpZnRXcmFwcGluZ09wdGlvbihpdGVtSWQsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5yZW1vdGVSZXF1ZXN0KGAvZ2lmdC13cmFwcGluZy8ke2l0ZW1JZH1gLCAnUE9TVCcsIHsgcGFyYW1zIH0sIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgY2FydCBpdGVtc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gaXRlbXNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIHVwZGF0ZShpdGVtcywgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIGl0ZW1zLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMucmVtb3RlUmVxdWVzdCgnL2NhcnQvdXBkYXRlJywgJ1BPU1QnLCB7IHBhcmFtczogcGF5bG9hZCB9LCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUE9TVCBmb3JtIGRhdGEgdG8gL2NhcnQucGhwXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgcG9zdEZvcm1EYXRhKGZvcm1EYXRhLCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLm1ha2VSZXF1ZXN0KCcvY2FydC5waHAnLCAnUE9TVCcsIHsgZm9ybURhdGEgfSwgZmFsc2UsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY2FydCBjb250ZW50XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgZ2V0Q29udGVudChvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICBsZXQgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGxldCBjYWxsYmFja0FyZyA9IGNhbGxiYWNrO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FsbGJhY2tBcmcgPSBvcHRzO1xuICAgICAgICAgICAgb3B0cyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tYWtlUmVxdWVzdCgnL2NhcnQucGhwJywgJ0dFVCcsIG9wdHMsIGZhbHNlLCBjYWxsYmFja0FyZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGNhcnQgc2hpcHBpbmcgcXVvdGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xBcnJheXxPYmplY3R9IHJlbmRlcldpdGhcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIGdldFNoaXBwaW5nUXVvdGVzKHBhcmFtcywgcmVuZGVyV2l0aCwgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGNhbGxiYWNrQXJnID0gY2FsbGJhY2s7XG4gICAgICAgIGxldCByZW5kZXJXaXRoQXJnID0gcmVuZGVyV2l0aDtcblxuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrQXJnICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWxsYmFja0FyZyA9IHJlbmRlcldpdGhBcmc7XG4gICAgICAgICAgICByZW5kZXJXaXRoQXJnID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZW5kZXJXaXRoQXJnKSB7XG4gICAgICAgICAgICBvcHRpb25zLnRlbXBsYXRlID0gcmVuZGVyV2l0aEFyZztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVtb3RlUmVxdWVzdCgnL3NoaXBwaW5nLXF1b3RlJywgJ0dFVCcsIG9wdGlvbnMsIGNhbGxiYWNrQXJnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdWJtaXQgc2hpcHBpbmcgcXVvdGUgYmFzZWQgb24gcXVvdGVJZFxuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHF1b3RlSWRcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIHN1Ym1pdFNoaXBwaW5nUXVvdGUocXVvdGVJZCwgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIHNoaXBwaW5nX21ldGhvZDogcXVvdGVJZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5yZW1vdGVSZXF1ZXN0KCcvc2hpcHBpbmctcXVvdGUnLCAnUE9TVCcsIG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBseSBhIGNvdXBvbiBjb2RlIG9yIGdpZnQgY2VydGlmaWNhdGUgdG8gdGhlIGNhcnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb2RlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBhcHBseUNvZGUoY29kZSwgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMucmVtb3RlUmVxdWVzdCgnL2FwcGx5LWNvZGUnLCAnUE9TVCcsIG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBseSBhIGNvdXBvbiBjb2RlIG9yIGdpZnQgY2VydGlmaWNhdGUgdG8gdGhlIGNhcnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBhcHBseUdpZnRDZXJ0aWZpY2F0ZShjb2RlLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5yZW1vdGVSZXF1ZXN0KCcvZ2lmdC1jZXJ0aWZpY2F0ZXMnLCAnUE9TVCcsIG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuL2Jhc2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgIC8qKlxuICAgICAqIEBDb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHZlcnNpb24pIHtcbiAgICAgICAgLy8gY2FsbCBwYXJlbnRcbiAgICAgICAgc3VwZXIodmVyc2lvbik7XG5cbiAgICAgICAgLy8gc2V0IHVwIGNsYXNzIHZhcmlhYmxlc1xuICAgICAgICB0aGlzLmVuZHBvaW50ID0gJy9jb3VudHJ5LXN0YXRlcy8nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogR2V0IGNvdW50cnkgZGF0YSBieSBpZCB3cmFwcGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaWRcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIGdldEJ5SWQoaWQsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuZW5kcG9pbnQgKyBpZDtcblxuICAgICAgICB0aGlzLnJlbW90ZVJlcXVlc3QodXJsLCAnR0VUJywge30sIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY291bnRyeSBkYXRhIGJ5IGNvdW50cnkgbmFtZVxuICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAgICovXG4gICAgZ2V0QnlOYW1lKG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuZW5kcG9pbnQgKyBuYW1lO1xuXG4gICAgICAgIHRoaXMucmVtb3RlUmVxdWVzdCh1cmwsICdHRVQnLCB7fSwgY2FsbGJhY2spO1xuICAgIH1cbn1cbiIsImltcG9ydCByZXF1ZXN0IGZyb20gJy4uL2xpYi9yZXF1ZXN0JztcblxuaW1wb3J0IENvdW50cnlBcGkgZnJvbSAnLi9jb3VudHJpZXMnO1xuaW1wb3J0IFByb2R1Y3RBcGkgZnJvbSAnLi9wcm9kdWN0JztcbmltcG9ydCBQcm9kdWN0QXR0cmlidXRlc0FwaSBmcm9tICcuL3Byb2R1Y3QtYXR0cmlidXRlcyc7XG5pbXBvcnQgU2VhcmNoQXBpIGZyb20gJy4vc2VhcmNoJztcbmltcG9ydCBDYXJ0QXBpIGZyb20gJy4vY2FydCc7XG5pbXBvcnQgV2lzaGxpc3QgZnJvbSAnLi93aXNobGlzdCc7XG5cbmNvbnN0IGludGVybmFscyA9IHt9O1xuXG4vKipcbiAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIHJlcXVlc3QgYSBwYWdlIHZpYSBhamF4XG4gKlxuICogQHBhcmFtIHVybFxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEBwYXJhbSBjYWxsYmFja1xuICovXG5pbnRlcm5hbHMuZ2V0UGFnZSA9IGZ1bmN0aW9uICh1cmwsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgcmVxdWVzdCh1cmwsIHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgcmVxdWVzdE9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfSwgY2FsbGJhY2spO1xufTtcblxuaW50ZXJuYWxzLmdldFBhZ2VCeUdRTCA9IGZ1bmN0aW9uIChwYWdlLCBjYWxsYmFjaykge1xuICAgIHJlcXVlc3QoJy9ncmFwaHFsLXJlbmRlcicsIHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgcmVxdWVzdE9wdGlvbnM6IHtcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlX25hbWU6IHBhZ2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sIGNhbGxiYWNrKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBjb3VudHJ5OiBuZXcgQ291bnRyeUFwaSgpLFxuICAgIHByb2R1Y3RBdHRyaWJ1dGVzOiBuZXcgUHJvZHVjdEF0dHJpYnV0ZXNBcGkoKSxcbiAgICBwcm9kdWN0OiBuZXcgUHJvZHVjdEFwaSgpLFxuICAgIHNlYXJjaDogbmV3IFNlYXJjaEFwaSgpLFxuICAgIGNhcnQ6IG5ldyBDYXJ0QXBpKCksXG4gICAgd2lzaGxpc3Q6IG5ldyBXaXNobGlzdCgpLFxuICAgIGdldFBhZ2U6IGludGVybmFscy5nZXRQYWdlLFxuICAgIGdldFBhZ2VCeUdRTDogaW50ZXJuYWxzLmdldFBhZ2VCeUdRTCxcbn07XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IEhvb2tzIGZyb20gJy4uL2hvb2tzJztcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAnLi4vbGliL3F1ZXJ5LXN0cmluZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgLyoqXG4gICAgICogQENvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodmVyc2lvbikge1xuICAgICAgICAvLyBjYWxsIHBhcmVudFxuICAgICAgICBzdXBlcih2ZXJzaW9uKTtcblxuICAgICAgICAvLyBzZXQgdXAgY2xhc3MgdmFyaWFibGVzXG4gICAgICAgIHRoaXMuZW5kcG9pbnQgPSAnL3Byb2R1Y3QtYXR0cmlidXRlcy8nO1xuICAgICAgICB0aGlzLmluQ2FydEVuZHBvaW50ID0gJy9jb25maWd1cmUtb3B0aW9ucy8nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBwcm9kdWN0SWRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gICAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAgICovXG4gICAgb3B0aW9uQ2hhbmdlKHByb2R1Y3RJZCwgcGFyYW1zLCB0ZW1wbGF0ZSA9IG51bGwsIGNhbGxiYWNrKSB7XG4gICAgICAgIGxldCB0ZW1wbGF0ZUFyZyA9IHRlbXBsYXRlO1xuICAgICAgICBsZXQgY2FsbGJhY2tBcmcgPSBjYWxsYmFjaztcblxuICAgICAgICBpZiAodHlwZW9mIHRlbXBsYXRlQXJnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWxsYmFja0FyZyA9IHRlbXBsYXRlQXJnO1xuICAgICAgICAgICAgdGVtcGxhdGVBcmcgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW1vdGVSZXF1ZXN0KHRoaXMuZW5kcG9pbnQgKyBwcm9kdWN0SWQsICdQT1NUJywgeyBwYXJhbXM6IHBhcnNlKHBhcmFtcyksIHRlbXBsYXRlOiB0ZW1wbGF0ZUFyZyB9LCAoZXJyLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZW1pdERhdGEgPSB7XG4gICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgSG9va3MuZW1pdCgncHJvZHVjdC1vcHRpb25zLWNoYW5nZS1yZW1vdGUnLCBlbWl0RGF0YSk7XG4gICAgICAgICAgICBjYWxsYmFja0FyZyhlcnIsIHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGl0ZW1JZFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBjb25maWd1cmVJbkNhcnQoaXRlbUlkLCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMucmVtb3RlUmVxdWVzdCh0aGlzLmluQ2FydEVuZHBvaW50ICsgaXRlbUlkLCAnR0VUJywgcGFyYW1zLCAoZXJyLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlIGZyb20gJy4vYmFzZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgLyoqXG4gICAgICogQENvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodmVyc2lvbikge1xuICAgICAgICAvLyBjYWxsIHBhcmVudFxuICAgICAgICBzdXBlcih2ZXJzaW9uKTtcblxuICAgICAgICAvLyBzZXQgdXAgY2xhc3MgdmFyaWFibGVzXG4gICAgICAgIHRoaXMuZW5kcG9pbnQgPSAnL3Byb2R1Y3RzLnBocD9wcm9kdWN0SWQ9JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBwcm9kdWN0SWRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBnZXRCeUlkKHByb2R1Y3RJZCwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmVuZHBvaW50ICsgcHJvZHVjdElkO1xuICAgICAgICBsZXQgcGFyYW1zQXJnID0gcGFyYW1zO1xuICAgICAgICBsZXQgY2FsbGJhY2tBcmcgPSBjYWxsYmFjaztcblxuICAgICAgICBpZiAodHlwZW9mIHBhcmFtc0FyZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FsbGJhY2tBcmcgPSBwYXJhbXNBcmc7XG4gICAgICAgICAgICBwYXJhbXNBcmcgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWFrZVJlcXVlc3QodXJsLCAnR0VUJywgcGFyYW1zQXJnLCBmYWxzZSwgY2FsbGJhY2tBcmcpO1xuICAgIH1cbn1cbiIsImltcG9ydCBIb29rcyBmcm9tICcuLi9ob29rcyc7XG5pbXBvcnQgQmFzZSBmcm9tICcuL2Jhc2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgIC8qKlxuICAgICAqIEBDb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHZlcnNpb24pIHtcbiAgICAgICAgLy8gY2FsbCBwYXJlbnRcbiAgICAgICAgc3VwZXIodmVyc2lvbik7XG5cbiAgICAgICAgLy8gc2V0IHVwIGNsYXNzIHZhcmlhYmxlc1xuICAgICAgICB0aGlzLmVuZHBvaW50ID0gJy9zZWFyY2gucGhwP3NlYXJjaF9xdWVyeT0nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzZWFyY2ggcmVzdWx0c1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBxdWVyeVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIHNlYXJjaChxdWVyeSwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmVuZHBvaW50ICsgZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KTtcbiAgICAgICAgbGV0IHBhcmFtc0FyZyA9IHBhcmFtcztcbiAgICAgICAgbGV0IGNhbGxiYWNrQXJnID0gY2FsbGJhY2s7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXNBcmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrQXJnID0gcGFyYW1zQXJnO1xuICAgICAgICAgICAgcGFyYW1zQXJnID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBIb29rcy5lbWl0KCdzZWFyY2gtcXVpY2stcmVtb3RlJywgcXVlcnkpO1xuICAgICAgICB0aGlzLm1ha2VSZXF1ZXN0KHVybCwgJ0dFVCcsIHBhcmFtc0FyZywgZmFsc2UsIGNhbGxiYWNrQXJnKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuL2Jhc2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgIGl0ZW1BZGQod2lzaGxpc3RJZCwgcHJvZHVjdElkLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCB1cmwgPSBgL3dpc2hsaXN0LnBocD9hY3Rpb249YWRkJndpc2hsaXN0aWQ9JHt3aXNobGlzdElkfSZwcm9kdWN0X2lkPSR7cHJvZHVjdElkfWA7XG4gICAgICAgIGxldCBvcHRzID0gb3B0aW9ucztcbiAgICAgICAgbGV0IGNhbGxiYWNrRm4gPSBjYWxsYmFjaztcblxuICAgICAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrRm4gPSBvcHRzO1xuICAgICAgICAgICAgb3B0cyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tYWtlUmVxdWVzdCh1cmwsICdQT1NUJywgb3B0cywgZmFsc2UsIGNhbGxiYWNrRm4pO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IGdldEJPRExFdmVudHMgfSBmcm9tICcuLi9oZWxwZXJzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJvZGxFdmVudHMgPSBnZXRCT0RMRXZlbnRzKCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZ2V0RXZlbnRJZCwgaXNCT0RMRW5hYmxlZCB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IEJhc2UgZnJvbSAnLi9iYXNlJztcblxuY2xhc3MgQ2FydCBleHRlbmRzIEJhc2Uge1xuICAgIGVtaXRBZGRJdGVtKHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuZW1pdCh0aGlzLmJvZGxFdmVudHMuQWRkQ2FydEl0ZW1FdmVudC5DUkVBVEUsIHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBlbWl0UmVtb3ZlSXRlbShyZXNwb25zZSkge1xuICAgICAgICBpZiAodGhpcy5zaG91bGRFbWl0UmVtb3ZlSXRlbShyZXNwb25zZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCh0aGlzLmJvZGxFdmVudHMuUmVtb3ZlQ2FydEl0ZW1FdmVudC5DUkVBVEUsIHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNob3VsZEVtaXRSZW1vdmVJdGVtKHJlc3BvbnNlKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhLmxpbmVfaXRlbXM/Lmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgZW1pdChldmVudE5hbWUsIHJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLnByZXBhcmVQYXlsb2FkKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5ib2RsRXZlbnRzLmNhcnQuZW1pdChldmVudE5hbWUsIHBheWxvYWQpO1xuICAgIH1cblxuICAgIHByZXBhcmVQYXlsb2FkKHJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChpc0JPRExFbmFibGVkKCkgJiYgIXJlc3BvbnNlLmRhdGEuZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGdldEV2ZW50SWQoKSxcbiAgICAgICAgICAgICAgICBjaGFubmVsX2lkOiByZXNwb25zZS5kYXRhLmNoYW5uZWxfaWQsXG4gICAgICAgICAgICAgICAgY3VycmVuY3k6IHJlc3BvbnNlLmRhdGEuY3VycmVuY3ksXG4gICAgICAgICAgICAgICAgcHJvZHVjdF92YWx1ZTogcmVzcG9uc2UuZGF0YS5wcm9kdWN0X3ZhbHVlLFxuICAgICAgICAgICAgICAgIGxpbmVfaXRlbXM6IHJlc3BvbnNlLmRhdGEubGluZV9pdGVtcy5tYXAoKGl0ZW0pID0+ICh7IC4uLml0ZW0sIHByb2R1Y3RfaWQ6IFN0cmluZyhpdGVtLnByb2R1Y3RfaWQpIH0pKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge307XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDYXJ0O1xuIiwiaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5cbmV4cG9ydCBjb25zdCBpc0JPRExFbmFibGVkID0gKCkgPT4gdHlwZW9mIHdpbmRvdy5ib2RsRXZlbnRzICE9PSAndW5kZWZpbmVkJztcblxuZXhwb3J0IGNvbnN0IEZha2VCT0RMRXZlbnRzID0ge1xuICAgIGNhcnQ6IHtcbiAgICAgICAgYWRkSXRlbTogKCkgPT4ge30sXG4gICAgICAgIHJlbW92ZUl0ZW06ICgpID0+IHt9LFxuICAgICAgICBlbWl0OiAoKSA9PiB7fSxcbiAgICB9LFxuICAgIEFkZENhcnRJdGVtRXZlbnQ6IHtcbiAgICAgICAgQ1JFQVRFOiAnY3JlYXRlX2FkZF9jYXJ0X2l0ZW0nLFxuICAgIH0sXG4gICAgUmVtb3ZlQ2FydEl0ZW1FdmVudDoge1xuICAgICAgICBDUkVBVEU6ICdjcmVhdGVfcmVtb3ZlX2NhcnRfaXRlbScsXG4gICAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFdmVudElkID0gKCkgPT4gdXVpZHY0KCk7XG5cbmV4cG9ydCBjb25zdCBnZXRCT0RMRXZlbnRzID0gKCkgPT4ge1xuICAgIGlmIChpc0JPRExFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5ib2RsRXZlbnRzO1xuICAgIH1cblxuICAgIHJldHVybiBGYWtlQk9ETEV2ZW50cztcbn07XG4iLCJpbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50ZW1pdHRlcjMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgc3Vic2NyaWJlKGV2ZW50TmFtZSwgZWxlbWVudFNlbGVjdG9yLCBoYW5kbGVyKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgeyB0YXJnZXQgfSA9IGU7IHRhcmdldCAmJiB0YXJnZXQgIT09IHRoaXM7IHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5tYXRjaGVzKGVsZW1lbnRTZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKHRhcmdldCwgZSwgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCBmYWxzZSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VIb29rcyBmcm9tICcuL2Jhc2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEJhc2VIb29rcyB7XG4gICAgLyoqXG4gICAgICogQENvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIGNhbGwgcGFyZW50XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5pdGVtQWRkKCk7XG4gICAgfVxuXG4gICAgaXRlbUFkZCgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmUoJ3N1Ym1pdCcsICdbZGF0YS1jYXJ0LWl0ZW0tYWRkXScsIChldmVudCwgdGFyZ2V0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2NhcnQtaXRlbS1hZGQnLCBldmVudCwgdGFyZ2V0KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VIb29rcyBmcm9tICcuL2Jhc2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEJhc2VIb29rcyB7fVxuIiwiaW1wb3J0IEJhc2VIb29rcyBmcm9tICcuL2Jhc2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEJhc2VIb29rcyB7XG4gICAgLyoqXG4gICAgICogQENvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIGNhbGwgcGFyZW50XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5jdXJyZW5jeVNlbGVjdG9yKCk7XG4gICAgfVxuXG4gICAgY3VycmVuY3lTZWxlY3RvcigpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmUoJ2lucHV0JywgJ1tkYXRhLWN1cnJlbmN5LXNlbGVjdG9yLXRvZ2dsZV0nLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnY3VycmVuY3lTZWxlY3Rvci10b2dnbGUnLCBldmVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlSG9va3MgZnJvbSAnLi9iYXNlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBCYXNlSG9va3Mge1xuICAgIC8qKlxuICAgICAqIEBDb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBjYWxsIHBhcmVudFxuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMuc2VhcmNoRXZlbnRzKCk7XG4gICAgfVxuXG4gICAgc2VhcmNoRXZlbnRzKCkge1xuICAgICAgICB0aGlzLnN1YnNjcmliZSgnY2xpY2snLCAnW2RhdGEtZmFjZXRlZC1zZWFyY2gtZmFjZXRdJywgKGV2ZW50LCB0YXJnZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZmFjZXRlZFNlYXJjaC1mYWNldC1jbGlja2VkJywgZXZlbnQsIHRhcmdldCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlKCdzdWJtaXQnLCAnW2RhdGEtZmFjZXRlZC1zZWFyY2gtcmFuZ2VdJywgKGV2ZW50LCB0YXJnZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZmFjZXRlZFNlYXJjaC1yYW5nZS1zdWJtaXR0ZWQnLCBldmVudCwgdGFyZ2V0KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IENhcnRIb29rcyBmcm9tICcuL2NhcnQnO1xuaW1wb3J0IENvb2tpZUhvb2tzIGZyb20gJy4vY29va2llJztcbmltcG9ydCBDdXJyZW5jeVNlbGVjdG9ySG9va3MgZnJvbSAnLi9jdXJyZW5jeS1zZWxlY3Rvcic7XG5pbXBvcnQgUHJvZHVjdEhvb2tzIGZyb20gJy4vcHJvZHVjdCc7XG5pbXBvcnQgU2VhcmNoSG9va3MgZnJvbSAnLi9zZWFyY2gnO1xuaW1wb3J0IEZhY2V0ZWRTZWFyY2hIb29rcyBmcm9tICcuL2ZhY2V0ZWQtc2VhcmNoJztcbmltcG9ydCBTb3J0QnlIb29rcyBmcm9tICcuL3NvcnQtYnknO1xuXG5jb25zdCBpbnRlcm5hbHMgPSB7fTtcblxuaW50ZXJuYWxzLmNsYXNzZXMgPSB7XG4gICAgY2FydDogbmV3IENhcnRIb29rcygpLFxuICAgIGNvb2tpZTogbmV3IENvb2tpZUhvb2tzKCksXG4gICAgY3VycmVuY3lTZWxlY3RvcjogbmV3IEN1cnJlbmN5U2VsZWN0b3JIb29rcygpLFxuICAgIHByb2R1Y3Q6IG5ldyBQcm9kdWN0SG9va3MoKSxcbiAgICBzZWFyY2g6IG5ldyBTZWFyY2hIb29rcygpLFxuICAgIGZhY2V0ZWRTZWFyY2g6IG5ldyBGYWNldGVkU2VhcmNoSG9va3MoKSxcbiAgICBzb3J0Qnk6IG5ldyBTb3J0QnlIb29rcygpLFxufTtcblxuaW50ZXJuYWxzLnBhcnNlSG9va3MgPSBmdW5jdGlvbiAoaG9va05hbWUpIHtcbiAgICBjb25zdCBob29rVHlwZSA9IGhvb2tOYW1lLnNwbGl0KCctJylbMF07XG5cbiAgICBpZiAoaW50ZXJuYWxzLmNsYXNzZXNbaG9va1R5cGVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2hvb2tUeXBlfSBpcyBub3QgYSB2YWxpZCBob29rVHlwZWApO1xuICAgIH1cblxuICAgIHJldHVybiBpbnRlcm5hbHMuY2xhc3Nlc1tob29rVHlwZV07XG59O1xuXG5jbGFzcyBIb29rcyB7XG4gICAgb24oaG9va05hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGhvb2sgPSBpbnRlcm5hbHMucGFyc2VIb29rcyhob29rTmFtZSk7XG5cbiAgICAgICAgcmV0dXJuIGhvb2sub24oaG9va05hbWUsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBvZmYoaG9va05hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGhvb2sgPSBpbnRlcm5hbHMucGFyc2VIb29rcyhob29rTmFtZSk7XG5cbiAgICAgICAgcmV0dXJuIGhvb2sub2ZmKGhvb2tOYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgZW1pdChob29rTmFtZSkge1xuICAgICAgICBjb25zdCBob29rID0gaW50ZXJuYWxzLnBhcnNlSG9va3MoaG9va05hbWUpO1xuXG4gICAgICAgIHJldHVybiBob29rLmVtaXQoLi4uYXJndW1lbnRzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBIb29rcygpO1xuIiwiaW1wb3J0IEJhc2VIb29rcyBmcm9tICcuL2Jhc2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEJhc2VIb29rcyB7XG4gICAgLyoqXG4gICAgICogQENvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIGNhbGwgcGFyZW50XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgb3B0aW9uc0NoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmUoJ2NoYW5nZScsICdbZGF0YS1wcm9kdWN0LW9wdGlvbi1jaGFuZ2VdJywgKGV2ZW50LCB0YXJnZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncHJvZHVjdC1vcHRpb24tY2hhbmdlJywgZXZlbnQsIHRhcmdldCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlSG9va3MgZnJvbSAnLi9iYXNlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBCYXNlSG9va3Mge1xuICAgIC8qKlxuICAgICAqIEBDb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBjYWxsIHBhcmVudFxuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMucXVpY2tTZWFyY2goKTtcbiAgICB9XG5cbiAgICBxdWlja1NlYXJjaCgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmUoJ2lucHV0JywgJ1tkYXRhLXNlYXJjaC1xdWlja10nLCAoZXZlbnQsIHRhcmdldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdzZWFyY2gtcXVpY2snLCBldmVudCwgdGFyZ2V0KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VIb29rcyBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IGNsb3Nlc3QgZnJvbSAnLi4vbGliL2Nsb3Nlc3QnO1xuXG4vLyBpZSAxMSBkb2VzIG5vdCBzdXBwb3J0IG5hdGl2ZSBjbG9zZXN0XG5pZiAoIUVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMpIHtcbiAgICBFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzID0gRWxlbWVudC5wcm90b3R5cGUubXNNYXRjaGVzU2VsZWN0b3IgfHwgRWxlbWVudC5wcm90b3R5cGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yO1xufVxuXG5pZiAoIUVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3QpIHtcbiAgICBFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0ID0gY2xvc2VzdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBCYXNlSG9va3Mge1xuICAgIC8qKlxuICAgICAqIEBDb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBjYWxsIHBhcmVudFxuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMuc29ydEJ5RXZlbnRzKCk7XG4gICAgfVxuXG4gICAgc29ydEJ5RXZlbnRzKCkge1xuICAgICAgICB0aGlzLnN1YnNjcmliZSgnc3VibWl0JywgJ1tkYXRhLXNvcnQtYnldJywgKGV2ZW50LCB0YXJnZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnc29ydEJ5LXN1Ym1pdHRlZCcsIGV2ZW50LCB0YXJnZXQpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN1YnNjcmliZSgnY2hhbmdlJywgJ1tkYXRhLXNvcnQtYnldIHNlbGVjdCcsIChldmVudCwgdGFyZ2V0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3NvcnRCeS1zZWxlY3QtY2hhbmdlZCcsIGV2ZW50LCB0YXJnZXQpO1xuXG4gICAgICAgICAgICBpZiAoIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3NvcnRCeS1zdWJtaXR0ZWQnLCBldmVudCwgdGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiLyoqXG4gKiBpZSAxMSBkb2VzIG5vdCBzdXBwb3J0IG5hdGl2ZSBjbG9zZXN0IHNvIHVzZSB0aGlzIHBvbHlmaWxsIGZ1bmN0aW9uIGluc3RlYWQgdG8gZmluZCBjbG9zZXN0IG1hdGNoaW5nIHNlbGVjdG9yIHN0YXJ0aW5nIGZyb20gZWwuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zXG4gKiBAcmV0dXJucyB7YW55fSBtYXRjaGluZyBzZWxlY3RvciBvciBudWxsXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNsb3Nlc3Qocykge1xuICAgIGxldCBlbCA9IHRoaXM7XG5cbiAgICBkbyB7XG4gICAgICAgIGlmIChlbC5tYXRjaGVzKHMpKSByZXR1cm4gZWw7XG4gICAgICAgIGVsID0gZWwucGFyZW50RWxlbWVudCB8fCBlbC5wYXJlbnROb2RlO1xuICAgIH0gd2hpbGUgKGVsICE9PSBudWxsICYmIGVsLm5vZGVUeXBlID09PSAxKTtcblxuICAgIHJldHVybiBudWxsO1xufVxuIiwiLyoqXG4gKiBFbmNvZGVzIHN0cmluZyBieSBzdHJpY3RlciBydWxlc1xuICogc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9rZXZ2YS9zdHJpY3QtdXJpLWVuY29kZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAqL1xuY29uc3QgZW5jb2RlID0gKHN0cmluZykgPT4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZykucmVwbGFjZSgvWyEnKCkqXS9nLCAoeCkgPT4gYCUke3guY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1gKTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5LCB3aGVyZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBzbGljZSB0aWxsIHNlcGFyYXRvciBhbmQgdGhlIHNlY29uZCBpcyB0aGUgcmVzdC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VwYXJhdG9yXG4gKi9cbmNvbnN0IHNwbGl0T25GaXJzdCA9IChzdHJpbmcsIHNlcGFyYXRvcikgPT4ge1xuICAgIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gc3RyaW5nLmluZGV4T2Yoc2VwYXJhdG9yKTtcbiAgICBpZiAoc2VwYXJhdG9ySW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBbc3RyaW5nXTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgICAgc3RyaW5nLnNsaWNlKDAsIHNlcGFyYXRvckluZGV4KSxcbiAgICAgICAgc3RyaW5nLnNsaWNlKHNlcGFyYXRvckluZGV4ICsgc2VwYXJhdG9yLmxlbmd0aCksXG4gICAgXTtcbn07XG5cbi8qKlxuICogU29ydHMgYXJyYXkgb3Igb2JqZWN0IGJ5IGtleXNcbiAqXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gaW5wdXRcbiAqL1xuY29uc3Qgc29ydEJ5S2V5cyA9IChpbnB1dCkgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICByZXR1cm4gaW5wdXQuc29ydCgpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBzb3J0QnlLZXlzKE9iamVjdC5rZXlzKGlucHV0KSlcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBOdW1iZXIoYSkgLSBOdW1iZXIoYikpXG4gICAgICAgICAgICAubWFwKChrZXkpID0+IGlucHV0W2tleV0pO1xuICAgIH1cblxuICAgIHJldHVybiBpbnB1dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBpZiB0aGUga2V5IGV4aXN0cyBpbiB0aGUgb2JqZWN0IG9yIHRoZSB2YWx1ZSBpZiBkb2VuJ3RcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvclxuICovXG5jb25zdCBnZXRQYXJzZWRWYWx1ZSA9IChrZXksIHZhbHVlLCBhY2N1bXVsYXRvcikgPT4ge1xuICAgIGlmIChhY2N1bXVsYXRvcltrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBbXS5jb25jYXQoYWNjdW11bGF0b3Jba2V5XSwgdmFsdWUpO1xufTtcblxuLyoqXG4gKiBSZWR1Y2VyIHRoYXQgZm9ybWF0cyBhbmQgY29tYmluZXMga2V5LXZhbHVlIHBhaXJcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9uc1xuICovXG5jb25zdCByZWR1Y2VCeUtleSA9IChvcHRpb25zKSA9PiAoa2V5KSA9PiAocmVzdWx0LCB2YWx1ZSkgPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbLi4ucmVzdWx0LCBlbmNvZGUoa2V5KV07XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZUFycmF5SW5kZXgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcmVzdWx0Lmxlbmd0aCAvIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmNvbmNhdChcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkubWFwKChrZXlPZlZhbHVlKSA9PiAoW1xuICAgICAgICAgICAgICAgICAgICBlbmNvZGUoa2V5KSxcbiAgICAgICAgICAgICAgICAgICAgJ1snLCBlbmNvZGUoaW5kZXgpLCAnXScsXG4gICAgICAgICAgICAgICAgICAgICdbJywgZW5jb2RlKGtleU9mVmFsdWUpLCAnXT0nLFxuICAgICAgICAgICAgICAgICAgICBlbmNvZGUodmFsdWVba2V5T2ZWYWx1ZV0pLFxuICAgICAgICAgICAgICAgIF0uam9pbignJykpKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5kZXggPSByZXN1bHQubGVuZ3RoO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgICBbZW5jb2RlKGtleSksICdbJywgZW5jb2RlKGluZGV4KSwgJ109JywgZW5jb2RlKHZhbHVlKV0uam9pbignJyksXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcmV0dXJuIFsuLi5yZXN1bHQsIFtlbmNvZGUoa2V5KSwgJz0nLCBlbmNvZGUodmFsdWUpXS5qb2luKCcnKV07XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHF1ZXJ5IHN0cmluZyBpbnRvIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2UoaW5wdXQpIHtcbiAgICBjb25zdCByZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dFBhcnNlZCA9IGlucHV0LnRyaW0oKS5yZXBsYWNlKC9eWz8jJl0vLCAnJyk7XG5cbiAgICBpZiAoIWlucHV0UGFyc2VkKSB7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgaW5wdXRQYXJzZWQuc3BsaXQoJyYnKS5mb3JFYWNoKChwYXJhbSkgPT4ge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItY29uc3QgKi9cbiAgICAgICAgbGV0IFtrZXksIHZhbHVlXSA9IHNwbGl0T25GaXJzdChwYXJhbS5yZXBsYWNlKC9cXCsvZywgJyAnKSwgJz0nKTtcblxuICAgICAgICBrZXkgPSBkZWNvZGVVUklDb21wb25lbnQoa2V5KTtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG4gICAgICAgIHJldFtrZXldID0gZ2V0UGFyc2VkVmFsdWUoa2V5LCB2YWx1ZSwgcmV0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXQpLnNvcnQoKS5yZWR1Y2UoKHJlc3VsdCwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmV0W2tleV07XG4gICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gc29ydEJ5S2V5cyh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IHRvIHF1ZXJ5IHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZpbHRlclZhbHVlc10gLSBmaWx0ZXJzIGVtcHR5IHN0cmluZyBvciB1bmRlZmluZWRzXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmluY2x1ZGVBcnJheUluZGV4XSAtIGluY2x1ZGVzIGFycmF5IGluZGV4IGluIHRoZSBxdWVyeSBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeShvYmplY3QsIG9wdGlvbnMgPSB7XG4gICAgZmlsdGVyVmFsdWVzOiBmYWxzZSxcbiAgICBhcnJheUluZGV4OiBmYWxzZSxcbn0pIHtcbiAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3Qgb2JqZWN0Q29weSA9IHt9O1xuICAgIGNvbnN0IHNob3VsZEZpbHRlciA9IChrZXkpID0+IChcbiAgICAgICAgb3B0aW9ucy5maWx0ZXJWYWx1ZXNcbiAgICAgICAgJiYgKG9iamVjdFtrZXldID09PSAnJyB8fCBvYmplY3Rba2V5XSA9PT0gdW5kZWZpbmVkKVxuICAgICk7XG5cbiAgICBPYmplY3Qua2V5cyhvYmplY3QpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBpZiAoIXNob3VsZEZpbHRlcihrZXkpKSB7XG4gICAgICAgICAgICBvYmplY3RDb3B5W2tleV0gPSBvYmplY3Rba2V5XTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdENvcHkpO1xuICAgIGtleXMuc29ydCgpO1xuXG4gICAgcmV0dXJuIGtleXMubWFwKChrZXkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlKGtleSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgICAgIC5yZWR1Y2UocmVkdWNlQnlLZXkob3B0aW9ucykoa2V5KSwgW10pXG4gICAgICAgICAgICAgICAgLmpvaW4oJyYnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgJHtlbmNvZGUoa2V5KX09JHtlbmNvZGUodmFsdWUpfWA7XG4gICAgfSkuZmlsdGVyKCh4KSA9PiB4Lmxlbmd0aCA+IDApLmpvaW4oJyYnKTtcbn1cbiIsImltcG9ydCAnd2hhdHdnLWZldGNoJztcbmltcG9ydCB7IHN0cmluZ2lmeSB9IGZyb20gJy4vcXVlcnktc3RyaW5nJztcbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBjdXJyZW50IG1ldGhvZCBwYXNzZWQgaW4gaXMgdmFsaWRcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuY29uc3QgaXNWYWxpZEhUVFBNZXRob2QgPSAobWV0aG9kKSA9PiBbJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnXS5pbmRleE9mKG1ldGhvZCkgIT09IC0xO1xuXG4vKipcbiAqIENoZWNrcyBpZiByZXF1ZXN0ZWQgdGVtcGxhdGUgaXMgdXNpbmcgc2VjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheXxTdHJpbmd9IHJlcXVlc3RlZFRlbXBsYXRlXG4gKi9cbmNvbnN0IGlzVXNpbmdTZWN0aW9ucyA9IChyZXF1ZXN0ZWRUZW1wbGF0ZSkgPT4gcmVxdWVzdGVkVGVtcGxhdGUgIT09IG51bGwgJiYgdHlwZW9mIChyZXF1ZXN0ZWRUZW1wbGF0ZSkgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHJlcXVlc3RlZFRlbXBsYXRlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRlbXBsYXRlcyBhcnJheVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fFN0cmluZ30gcmVxdWVzdGVkVGVtcGxhdGVcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuY29uc3QgZ2V0VGVtcGxhdGVzID0gKHJlcXVlc3RlZFRlbXBsYXRlKSA9PiB7XG4gICAgbGV0IHRlbXBsYXRlcyA9IFtdO1xuICAgIGlmIChpc1VzaW5nU2VjdGlvbnMocmVxdWVzdGVkVGVtcGxhdGUpKSB7XG4gICAgICAgIHRlbXBsYXRlcyA9IE9iamVjdC52YWx1ZXMocmVxdWVzdGVkVGVtcGxhdGUpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIChyZXF1ZXN0ZWRUZW1wbGF0ZSkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRlbXBsYXRlcyA9IFtyZXF1ZXN0ZWRUZW1wbGF0ZV07XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlcXVlc3RlZFRlbXBsYXRlKSAmJiByZXF1ZXN0ZWRUZW1wbGF0ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRlbXBsYXRlcyA9IHJlcXVlc3RlZFRlbXBsYXRlO1xuICAgIH1cbiAgICByZXR1cm4gdGVtcGxhdGVzO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHJlbGF0aXZlVXJsLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICByZW1vdGU6IGZhbHNlLFxuICAgICAgICByZXF1ZXN0T3B0aW9uczoge1xuICAgICAgICAgICAgYmFzZVVybDogbnVsbCxcbiAgICAgICAgICAgIGZvcm1EYXRhOiBudWxsLFxuICAgICAgICAgICAgcGFyYW1zOiB7fSxcbiAgICAgICAgICAgIGNvbmZpZzoge30sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogW10sXG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBvcHRpb25zID0geyAuLi5kZWZhdWx0T3B0aW9ucywgLi4ub3B0cyB9O1xuICAgIGNvbnN0IGRhdGEgPSBvcHRpb25zLnJlcXVlc3RPcHRpb25zLmZvcm1EYXRhID8gb3B0aW9ucy5yZXF1ZXN0T3B0aW9ucy5mb3JtRGF0YSA6IG9wdGlvbnMucmVxdWVzdE9wdGlvbnMucGFyYW1zO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAgICdzdGVuY2lsLWNvbmZpZyc6IG9wdGlvbnMucmVxdWVzdE9wdGlvbnMuY29uZmlnID8gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5yZXF1ZXN0T3B0aW9ucy5jb25maWcpIDogJ3t9JyxcbiAgICAgICAgJ3N0ZW5jaWwtb3B0aW9ucyc6ICd7fScsXG4gICAgICAgICd4LXhzcmYtdG9rZW4nOiB3aW5kb3cuQkNEYXRhICYmIHdpbmRvdy5CQ0RhdGEuY3NyZl90b2tlbiA/IHdpbmRvdy5CQ0RhdGEuY3NyZl90b2tlbiA6ICcnLFxuICAgICAgICAneC1yZXF1ZXN0ZWQtd2l0aCc6ICdzdGVuY2lsLXV0aWxzJyxcbiAgICB9O1xuXG4gICAgaWYgKCFpc1ZhbGlkSFRUUE1ldGhvZChvcHRpb25zLm1ldGhvZCkpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcignTm90IGEgdmFsaWQgSFRUUCBtZXRob2QnKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcGxhdGVzID0gZ2V0VGVtcGxhdGVzKG9wdGlvbnMucmVxdWVzdE9wdGlvbnMudGVtcGxhdGUpO1xuICAgIGNvbnN0IHVzaW5nU2VjdGlvbnMgPSBpc1VzaW5nU2VjdGlvbnMob3B0aW9ucy5yZXF1ZXN0T3B0aW9ucy50ZW1wbGF0ZSk7XG4gICAgY29uc3QgdXNpbmdUZW1wbGF0ZXMgPSB0ZW1wbGF0ZXMubGVuZ3RoID4gMDtcblxuICAgIGlmICghb3B0aW9ucy5yZXF1ZXN0T3B0aW9ucy5mb3JtRGF0YSkge1xuICAgICAgICBoZWFkZXJzWydjb250ZW50LXR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgnO1xuICAgIH1cblxuICAgIGlmICh1c2luZ1RlbXBsYXRlcykge1xuICAgICAgICBoZWFkZXJzWydzdGVuY2lsLW9wdGlvbnMnXSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHJlbmRlcl93aXRoOiB0ZW1wbGF0ZXMuam9pbignLCcpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgIG1ldGhvZDogb3B0aW9ucy5tZXRob2QsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgfTtcblxuICAgIGxldCB1cmwgPSBvcHRpb25zLnJlcXVlc3RPcHRpb25zLmJhc2VVcmwgPyBgJHtvcHRpb25zLnJlcXVlc3RPcHRpb25zLmJhc2VVcmx9JHtyZWxhdGl2ZVVybH1gIDogcmVsYXRpdmVVcmw7XG4gICAgaWYgKFsnR0VUJywgJ0hFQUQnXS5pbmRleE9mKGNvbmZpZy5tZXRob2QpID09PSAtMSkge1xuICAgICAgICBjb25maWcuYm9keSA9ICFvcHRpb25zLnJlcXVlc3RPcHRpb25zLmZvcm1EYXRhID8gc3RyaW5naWZ5KGRhdGEsIHsgaW5jbHVkZUFycmF5SW5kZXg6IHRydWUgfSkgOiBkYXRhO1xuICAgIH0gZWxzZSBpZiAoZGF0YSkge1xuICAgICAgICBjb25zdCBkZWxpbWl0ZXIgPSAhdXJsLmluY2x1ZGVzKCc/JykgPyAnPycgOiAnJic7XG4gICAgICAgIHVybCArPSBgJHtkZWxpbWl0ZXJ9JHtzdHJpbmdpZnkoZGF0YSl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmV0Y2godXJsLCBjb25maWcpXG4gICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSAmJiByZXNwb25zZS5oZWFkZXJzLmdldCgnWC1CQy1QcmV2aWV3LU1vZGUnKS5pbmRleE9mKCd0cnVlJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykuaW5kZXhPZignYXBwbGljYXRpb24vanNvbicpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IG9wdGlvbnMucmVtb3RlID8gcmVzcG9uc2UuY29udGVudCA6IHJlc3BvbnNlO1xuICAgICAgICAgICAgbGV0IHJldCA9IHJlc3BvbnNlO1xuXG4gICAgICAgICAgICBpZiAodXNpbmdUZW1wbGF0ZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGBjb21wb25lbnRzYCBwcmVmaXggZnJvbSB0aGUgcmVzcG9uc2UgaWYgaXQncyBhbiBvYmplY3RcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChjb250ZW50KSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY29udGVudCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbktleSA9IGtleS5yZXBsYWNlKC9eY29tcG9uZW50c1xcLy8sICcnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFtjbGVhbktleV0gPSBjb250ZW50W2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgKGNvbnRlbnRba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElmIHVzaW5nIFwic2VjdGlvbnNcIiwgbW9ycGggdGhlIGNvbnRlbnQgaW50byB0aGUgYXJiaXRyYXJ5IGtleXMgPT4gY29udGVudCBvYmplY3QuXG4gICAgICAgICAgICAgICAgaWYgKHVzaW5nU2VjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVkVGVtcGxhdGUgPSBvcHRpb25zLnJlcXVlc3RPcHRpb25zLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyZXF1ZXN0ZWRUZW1wbGF0ZSkuZm9yRWFjaCgodGVtcGxhdGVWYXJpYWJsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFt0ZW1wbGF0ZVZhcmlhYmxlXSA9IGNvbnRlbnRbcmVxdWVzdGVkVGVtcGxhdGVbdGVtcGxhdGVWYXJpYWJsZV1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNvbnRlbnRbcmVxdWVzdGVkVGVtcGxhdGVbdGVtcGxhdGVWYXJpYWJsZV1dO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMucmVtb3RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmV0KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IGNhbGxiYWNrKGVycikpO1xufVxuIiwiaW1wb3J0IGhvb2tzIGZyb20gJy4vaG9va3MnO1xuaW1wb3J0IGFwaSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgdG9vbHMgZnJvbSAnLi90b29scyc7XG5cbmNvbnN0IFN0ZW5jaWxVdGlscyA9IHtcbiAgICBob29rcyxcbiAgICBhcGksXG4gICAgdG9vbHMsXG59O1xuZXhwb3J0IHsgaG9va3MsIGFwaSwgdG9vbHMgfTtcbmV4cG9ydCBkZWZhdWx0IFN0ZW5jaWxVdGlscztcblxuLyogZ2xvYmFsIGRlZmluZSAqL1xuKGZ1bmN0aW9uIChyb290KSB7XG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCAmJiByb290KSB7XG4gICAgICAgIC8vIElnbm9yZXMgYmVsb3cgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2lzc3Vlcy81MTUwXG4gICAgICAgIGRlZmluZShmdW5jdGlvbiAoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLWFycm93LWNhbGxiYWNrXG4gICAgICAgICAgICByb290LnN0ZW5jaWxVdGlscyA9IFN0ZW5jaWxVdGlsczsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gU3RlbmNpbFV0aWxzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5zdGVuY2lsVXRpbHMgPSBTdGVuY2lsVXRpbHM7XG4gICAgfVxufSh0aGlzKSk7XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyB7XG4gICAgZ2V0U3JjKHBhdGgsIGRpbWVuc2lvbnMpIHtcbiAgICAgICAgLy8gUmVnZXggdG8gdGVzdCBzaXplIHN0cmluZyBpcyBvZiB0aGUgZm9ybSAxMjN4MTIzIG9yIDEwMHdcbiAgICAgICAgY29uc3Qgc2l6ZVJlZ2V4ID0gLyheXFxkK3ckKXwoXihcXGQrPyl4KFxcZCs/KSQpL2c7XG4gICAgICAgIGxldCBzaXplO1xuXG4gICAgICAgIGlmICh0eXBlb2YgKGRpbWVuc2lvbnMpID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBkaW1lbnNpb25zLndpZHRoIHx8IDEwMDtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGRpbWVuc2lvbnMuaGVpZ2h0IHx8IDEwMDtcblxuICAgICAgICAgICAgc2l6ZSA9IGAke3dpZHRofXgke2hlaWdodH1gO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiAoZGltZW5zaW9ucykgPT09ICdzdHJpbmcnICYmIHNpemVSZWdleC50ZXN0KGRpbWVuc2lvbnMpKSB7XG4gICAgICAgICAgICAvLyBJZiBkaW1lbnNpb25zIGlzIGEgc3RyaW5nIGFuZCBtYXRjaCB0aGUgTk5OeE5OTiBvciBOTk53IGZvcm1hdFxuICAgICAgICAgICAgc2l6ZSA9IGRpbWVuc2lvbnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBVc2UgdGhlIG9yaWdpbmFsIGltYWdlIHNpemVcbiAgICAgICAgICAgIHNpemUgPSAnb3JpZ2luYWwnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgnezpzaXplfScsIHNpemUpO1xuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIHtcbiAgICBnZXRTcmNzZXQodXJsLCBzaXplcykge1xuICAgICAgICAvLyBSZWdleCB0byB0ZXN0IHNpemUgc3RyaW5nIGlzIG9mIHRoZSBmb3JtIDEyM3gxMjMgb3IgMTAwd1xuICAgICAgICBjb25zdCBzaXplUmVnZXggPSAvKF5cXGQrdyQpfCheKFxcZCs/KXgoXFxkKz8pJCkvO1xuICAgICAgICAvLyBSZWdleCB0byB0ZXN0IHRvIHRoYXQgc3Jjc2V0IGRlc2NyaXB0b3IgaXMgb2YgdGhlIGZvcm0gMXggMS41eCAyeCBPUiAxMjN3XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3JSZWdleCA9IC8oXlxcZCt3JCl8KF4oWzAtOV0oXFwuWzAtOV0rKT8peCkkLztcblxuICAgICAgICBsZXQgc3Jjc2V0cyA9IHt9O1xuXG4gICAgICAgIGlmICghc2l6ZXMpIHtcbiAgICAgICAgICAgIC8vIFVzZSBkZWZhdWx0IHNyY3NldHMgaWYgbm9uZSBhcmUgcHJvdmlkZWRcbiAgICAgICAgICAgIHNyY3NldHMgPSB7XG4gICAgICAgICAgICAgICAgJzgwdyc6ICc4MHcnLFxuICAgICAgICAgICAgICAgICcxNjB3JzogJzE2MHcnLFxuICAgICAgICAgICAgICAgICczMjB3JzogJzMyMHcnLFxuICAgICAgICAgICAgICAgICc2NDB3JzogJzY0MHcnLFxuICAgICAgICAgICAgICAgICc5NjB3JzogJzk2MHcnLFxuICAgICAgICAgICAgICAgICcxMjgwdyc6ICcxMjgwdycsXG4gICAgICAgICAgICAgICAgJzE5MjB3JzogJzE5MjB3JyxcbiAgICAgICAgICAgICAgICAnMjU2MHcnOiAnMjU2MHcnLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICgoc2l6ZXMgPT09IE9iamVjdChzaXplcykpICYmICFPYmplY3Qua2V5cyhzaXplcykuc29tZSgoZGVzY3JpcHRvcikgPT4gIShkZXNjcmlwdG9yUmVnZXgudGVzdChkZXNjcmlwdG9yKSAmJiBzaXplUmVnZXgudGVzdChzaXplc1tkZXNjcmlwdG9yXSkpKSkge1xuICAgICAgICAgICAgLy8gSWYgb2JqZWN0IGNvbnNpc3RzIG9mIHZhbGlkIHNyY3NldHMsIHVzZSBpdCBpbnN0ZWFkXG4gICAgICAgICAgICBzcmNzZXRzID0gc2l6ZXM7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG9ubHkgb25lIGFyZ3VtZW50LCByZXR1cm4gYSBgc3JjYCBvbmx5IChhbHNvIHdvcmtzIGZvciBgc3Jjc2V0YClcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzcmNzZXRzKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHVybC5yZXBsYWNlKCd7OnNpemV9Jywgc3Jjc2V0c1tPYmplY3Qua2V5cyhzcmNzZXRzKVswXV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzcmNzZXQgZGVzY3JpcHRvciBvciBzaXplJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoc3Jjc2V0cykubWFwKChkZXNjcmlwdG9yKSA9PiBbdXJsLnJlcGxhY2UoJ3s6c2l6ZX0nLCBzcmNzZXRzW2Rlc2NyaXB0b3JdKSwgZGVzY3JpcHRvcl0uam9pbignICcpKS5qb2luKCcsICcpO1xuICAgIH1cbn1cbiIsImltcG9ydCBJbWFnZVRvb2wgZnJvbSAnLi9pbWFnZSc7XG5pbXBvcnQgSW1hZ2VTcmNzZXRUb29sIGZyb20gJy4vaW1hZ2VTcmNzZXQnO1xuaW1wb3J0IFN0b3JhZ2VUb29scyBmcm9tICcuL3N0b3JhZ2UnO1xuXG5jb25zdCB0b29scyA9IHtcbiAgICBpbWFnZTogbmV3IEltYWdlVG9vbCgpLFxuICAgIGltYWdlU3Jjc2V0OiBuZXcgSW1hZ2VTcmNzZXRUb29sKCksXG4gICAgc3RvcmFnZTogbmV3IFN0b3JhZ2VUb29scygpLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgdG9vbHM7XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyB7XG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBzdG9yYWdlIHR5cGUgKGxpa2UgbG9jYWxTdG9yYWdlIG9yIHNlc3Npb25TdG9yYWdlKSBpcyBhdmFpbGFibGUgZm9yIHVzZVxuICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJfU3RvcmFnZV9BUEkvVXNpbmdfdGhlX1dlYl9TdG9yYWdlX0FQSSNUZXN0aW5nX2Zvcl9hdmFpbGFiaWxpdHlcbiAgICAgKiBAcGFyYW0gdHlwZVxuICAgICAqIEByZXR1cm5zIGJvb2xlYW5cbiAgICAgKi9cbiAgICBzdG9yYWdlQXZhaWxhYmxlKHR5cGUpIHtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IHdpbmRvd1t0eXBlXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHggPSAnX19zdG9yYWdlX3Rlc3RfXyc7XG4gICAgICAgICAgICBzdG9yYWdlLnNldEl0ZW0oeCwgeCk7XG4gICAgICAgICAgICBzdG9yYWdlLnJlbW92ZUl0ZW0oeCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBET01FeGNlcHRpb24gJiYgKFxuICAgICAgICAgICAgLy8gZXZlcnl0aGluZyBleGNlcHQgRmlyZWZveFxuICAgICAgICAgICAgICAgIGUuY29kZSA9PT0gMjJcbiAgICAgICAgICAgICAgICAvLyBGaXJlZm94XG4gICAgICAgICAgICAgICAgfHwgZS5jb2RlID09PSAxMDE0XG4gICAgICAgICAgICAgICAgLy8gdGVzdCBuYW1lIGZpZWxkIHRvbywgYmVjYXVzZSBjb2RlIG1pZ2h0IG5vdCBiZSBwcmVzZW50XG4gICAgICAgICAgICAgICAgLy8gZXZlcnl0aGluZyBleGNlcHQgRmlyZWZveFxuICAgICAgICAgICAgICAgIHx8IGUubmFtZSA9PT0gJ1F1b3RhRXhjZWVkZWRFcnJvcidcbiAgICAgICAgICAgICAgICAvLyBGaXJlZm94XG4gICAgICAgICAgICAgICAgfHwgZS5uYW1lID09PSAnTlNfRVJST1JfRE9NX1FVT1RBX1JFQUNIRUQnKVxuICAgICAgICAgICAgICAgIC8vIGFja25vd2xlZGdlIFF1b3RhRXhjZWVkZWRFcnJvciBvbmx5IGlmIHRoZXJlJ3Mgc29tZXRoaW5nIGFscmVhZHkgc3RvcmVkXG4gICAgICAgICAgICAgICAgJiYgc3RvcmFnZS5sZW5ndGggIT09IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2VBdmFpbGFibGUoJ2xvY2FsU3RvcmFnZScpO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG5cbnZhciAkYXBwbHkgPSByZXF1aXJlKCcuL2Z1bmN0aW9uQXBwbHknKTtcbnZhciAkY2FsbCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25DYWxsJyk7XG52YXIgJHJlZmxlY3RBcHBseSA9IHJlcXVpcmUoJy4vcmVmbGVjdEFwcGx5Jyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2FjdHVhbEFwcGx5Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9ICRyZWZsZWN0QXBwbHkgfHwgYmluZC5jYWxsKCRjYWxsLCAkYXBwbHkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9mdW5jdGlvbkFwcGx5Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vZnVuY3Rpb25DYWxsJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcbnZhciAkVHlwZUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3R5cGUnKTtcblxudmFyICRjYWxsID0gcmVxdWlyZSgnLi9mdW5jdGlvbkNhbGwnKTtcbnZhciAkYWN0dWFsQXBwbHkgPSByZXF1aXJlKCcuL2FjdHVhbEFwcGx5Jyk7XG5cbi8qKiBAdHlwZSB7KGFyZ3M6IFtGdW5jdGlvbiwgdGhpc0FyZz86IHVua25vd24sIC4uLmFyZ3M6IHVua25vd25bXV0pID0+IEZ1bmN0aW9ufSBUT0RPIEZJWE1FLCBmaW5kIGEgd2F5IHRvIHVzZSBpbXBvcnQoJy4nKSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQmluZEJhc2ljKGFyZ3MpIHtcblx0aWYgKGFyZ3MubGVuZ3RoIDwgMSB8fCB0eXBlb2YgYXJnc1swXSAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdhIGZ1bmN0aW9uIGlzIHJlcXVpcmVkJyk7XG5cdH1cblx0cmV0dXJuICRhY3R1YWxBcHBseShiaW5kLCAkY2FsbCwgYXJncyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9yZWZsZWN0QXBwbHknKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIFJlZmxlY3QgIT09ICd1bmRlZmluZWQnICYmIFJlZmxlY3QgJiYgUmVmbGVjdC5hcHBseTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcblxudmFyIGNhbGxCaW5kQmFzaWMgPSByZXF1aXJlKCdjYWxsLWJpbmQtYXBwbHktaGVscGVycycpO1xuXG4vKiogQHR5cGUgeyh0aGlzQXJnOiBzdHJpbmcsIHNlYXJjaFN0cmluZzogc3RyaW5nLCBwb3NpdGlvbj86IG51bWJlcikgPT4gbnVtYmVyfSAqL1xudmFyICRpbmRleE9mID0gY2FsbEJpbmRCYXNpYyhbR2V0SW50cmluc2ljKCclU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mJScpXSk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNhbGxCb3VuZEludHJpbnNpYyhuYW1lLCBhbGxvd01pc3NpbmcpIHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXBhcmVuc1xuXHR2YXIgaW50cmluc2ljID0gLyoqIEB0eXBlIHtQYXJhbWV0ZXJzPHR5cGVvZiBjYWxsQmluZEJhc2ljPlswXVswXX0gKi8gKEdldEludHJpbnNpYyhuYW1lLCAhIWFsbG93TWlzc2luZykpO1xuXHRpZiAodHlwZW9mIGludHJpbnNpYyA9PT0gJ2Z1bmN0aW9uJyAmJiAkaW5kZXhPZihuYW1lLCAnLnByb3RvdHlwZS4nKSA+IC0xKSB7XG5cdFx0cmV0dXJuIGNhbGxCaW5kQmFzaWMoW2ludHJpbnNpY10pO1xuXHR9XG5cdHJldHVybiBpbnRyaW5zaWM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCdjYWxsLWJpbmQtYXBwbHktaGVscGVycycpO1xudmFyIGdPUEQgPSByZXF1aXJlKCdnb3BkJyk7XG5cbnZhciBoYXNQcm90b0FjY2Vzc29yO1xudHJ5IHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXBhcmVucywgbm8tcHJvdG9cblx0aGFzUHJvdG9BY2Nlc3NvciA9IC8qKiBAdHlwZSB7eyBfX3Byb3RvX18/OiB0eXBlb2YgQXJyYXkucHJvdG90eXBlIH19ICovIChbXSkuX19wcm90b19fID09PSBBcnJheS5wcm90b3R5cGU7XG59IGNhdGNoIChlKSB7XG5cdGlmICghZSB8fCB0eXBlb2YgZSAhPT0gJ29iamVjdCcgfHwgISgnY29kZScgaW4gZSkgfHwgZS5jb2RlICE9PSAnRVJSX1BST1RPX0FDQ0VTUycpIHtcblx0XHR0aHJvdyBlO1xuXHR9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1wYXJlbnNcbnZhciBkZXNjID0gISFoYXNQcm90b0FjY2Vzc29yICYmIGdPUEQgJiYgZ09QRChPYmplY3QucHJvdG90eXBlLCAvKiogQHR5cGUge2tleW9mIHR5cGVvZiBPYmplY3QucHJvdG90eXBlfSAqLyAoJ19fcHJvdG9fXycpKTtcblxudmFyICRPYmplY3QgPSBPYmplY3Q7XG52YXIgJGdldFByb3RvdHlwZU9mID0gJE9iamVjdC5nZXRQcm90b3R5cGVPZjtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vZ2V0Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGRlc2MgJiYgdHlwZW9mIGRlc2MuZ2V0ID09PSAnZnVuY3Rpb24nXG5cdD8gY2FsbEJpbmQoW2Rlc2MuZ2V0XSlcblx0OiB0eXBlb2YgJGdldFByb3RvdHlwZU9mID09PSAnZnVuY3Rpb24nXG5cdFx0PyAvKiogQHR5cGUge2ltcG9ydCgnLi9nZXQnKX0gKi8gZnVuY3Rpb24gZ2V0RHVuZGVyKHZhbHVlKSB7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0XHRyZXR1cm4gJGdldFByb3RvdHlwZU9mKHZhbHVlID09IG51bGwgPyB2YWx1ZSA6ICRPYmplY3QodmFsdWUpKTtcblx0XHR9XG5cdFx0OiBmYWxzZTtcbiIsIi8qIVxuICogQG5hbWUgICAgICAgIGVhc3l6b29tXG4gKiBAYXV0aG9yICAgICAgTWF0dCBIaW5jaGxpZmZlXG4gKiBAbW9kaWZpZWQgICAgRnJpZGF5LCBEZWNlbWJlciAzMHRoLCAyMDIyXG4gKiBAdmVyc2lvbiAgICAgMi42LjBcbiAqL1xuIWZ1bmN0aW9uKHQsZSl7XCJ1c2Ugc3RyaWN0XCI7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJqcXVlcnlcIl0sZnVuY3Rpb24odCl7ZSh0KX0pOlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPXQuRWFzeVpvb209ZShyZXF1aXJlKFwianF1ZXJ5XCIpKTp0LkVhc3lab29tPWUodC5qUXVlcnkpfSh0aGlzLGZ1bmN0aW9uKGkpe1widXNlIHN0cmljdFwiO3ZhciBjLGQsbCxwLG8scyxoPXtsb2FkaW5nTm90aWNlOlwiTG9hZGluZyBpbWFnZVwiLGVycm9yTm90aWNlOlwiVGhlIGltYWdlIGNvdWxkIG5vdCBiZSBsb2FkZWRcIixlcnJvckR1cmF0aW9uOjI1MDAsbGlua0F0dHJpYnV0ZTpcImhyZWZcIixwcmV2ZW50Q2xpY2tzOiEwLGJlZm9yZVNob3c6aS5ub29wLGJlZm9yZUhpZGU6aS5ub29wLG9uU2hvdzppLm5vb3Asb25IaWRlOmkubm9vcCxvbk1vdmU6aS5ub29wfTtmdW5jdGlvbiBuKHQsZSl7dGhpcy4kdGFyZ2V0PWkodCksdGhpcy5vcHRzPWkuZXh0ZW5kKHt9LGgsZSx0aGlzLiR0YXJnZXQuZGF0YSgpKSx2b2lkIDA9PT10aGlzLmlzT3BlbiYmdGhpcy5faW5pdCgpfXJldHVybiBuLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbigpe3RoaXMuJGxpbms9dGhpcy4kdGFyZ2V0LmZpbmQoXCJhXCIpLHRoaXMuJGltYWdlPXRoaXMuJHRhcmdldC5maW5kKFwiaW1nXCIpLHRoaXMuJGZseW91dD1pKCc8ZGl2IGNsYXNzPVwiZWFzeXpvb20tZmx5b3V0XCIgLz4nKSx0aGlzLiRub3RpY2U9aSgnPGRpdiBjbGFzcz1cImVhc3l6b29tLW5vdGljZVwiIC8+JyksdGhpcy4kdGFyZ2V0Lm9uKHtcIm1vdXNlbW92ZS5lYXN5em9vbSB0b3VjaG1vdmUuZWFzeXpvb21cIjppLnByb3h5KHRoaXMuX29uTW92ZSx0aGlzKSxcIm1vdXNlbGVhdmUuZWFzeXpvb20gdG91Y2hlbmQuZWFzeXpvb21cIjppLnByb3h5KHRoaXMuX29uTGVhdmUsdGhpcyksXCJtb3VzZWVudGVyLmVhc3l6b29tIHRvdWNoc3RhcnQuZWFzeXpvb21cIjppLnByb3h5KHRoaXMuX29uRW50ZXIsdGhpcyl9KSx0aGlzLm9wdHMucHJldmVudENsaWNrcyYmdGhpcy4kdGFyZ2V0Lm9uKFwiY2xpY2suZWFzeXpvb21cIixmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCl9KX0sbi5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbih0LGUpe3ZhciBvPXRoaXM7aWYoITEhPT10aGlzLm9wdHMuYmVmb3JlU2hvdy5jYWxsKHRoaXMpKXtpZighdGhpcy5pc1JlYWR5KXJldHVybiB0aGlzLl9sb2FkSW1hZ2UodGhpcy4kbGluay5hdHRyKHRoaXMub3B0cy5saW5rQXR0cmlidXRlKSxmdW5jdGlvbigpeyFvLmlzTW91c2VPdmVyJiZlfHxvLnNob3codCl9KTt0aGlzLiR0YXJnZXQuYXBwZW5kKHRoaXMuJGZseW91dCk7dmFyIGk9dGhpcy4kdGFyZ2V0Lm91dGVyV2lkdGgoKSxzPXRoaXMuJHRhcmdldC5vdXRlckhlaWdodCgpLGg9dGhpcy4kZmx5b3V0LndpZHRoKCksbj10aGlzLiRmbHlvdXQuaGVpZ2h0KCksYT10aGlzLiR6b29tLndpZHRoKCkscj10aGlzLiR6b29tLmhlaWdodCgpO2M9TWF0aC5jZWlsKGEtaCksZD1NYXRoLmNlaWwoci1uKSxsPShjPWM8MD8wOmMpL2kscD0oZD1kPDA/MDpkKS9zLHRoaXMuaXNPcGVuPSEwLHRoaXMub3B0cy5vblNob3cuY2FsbCh0aGlzKSx0JiZ0aGlzLl9tb3ZlKHQpfX0sbi5wcm90b3R5cGUuX29uRW50ZXI9ZnVuY3Rpb24odCl7dmFyIGU9dC5vcmlnaW5hbEV2ZW50LnRvdWNoZXM7dGhpcy5pc01vdXNlT3Zlcj0hMCxlJiYxIT1lLmxlbmd0aHx8KHQucHJldmVudERlZmF1bHQoKSx0aGlzLnNob3codCwhMCkpfSxuLnByb3RvdHlwZS5fb25Nb3ZlPWZ1bmN0aW9uKHQpe3RoaXMuaXNPcGVuJiYodC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX21vdmUodCkpfSxuLnByb3RvdHlwZS5fb25MZWF2ZT1mdW5jdGlvbigpe3RoaXMuaXNNb3VzZU92ZXI9ITEsdGhpcy5pc09wZW4mJnRoaXMuaGlkZSgpfSxuLnByb3RvdHlwZS5fb25Mb2FkPWZ1bmN0aW9uKHQpe3QuY3VycmVudFRhcmdldC53aWR0aCYmKHRoaXMuaXNSZWFkeT0hMCx0aGlzLiRub3RpY2UuZGV0YWNoKCksdGhpcy4kZmx5b3V0Lmh0bWwodGhpcy4kem9vbSksdGhpcy4kdGFyZ2V0LnJlbW92ZUNsYXNzKFwiaXMtbG9hZGluZ1wiKS5hZGRDbGFzcyhcImlzLXJlYWR5XCIpLHQuZGF0YS5jYWxsJiZ0LmRhdGEoKSl9LG4ucHJvdG90eXBlLl9vbkVycm9yPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLiRub3RpY2UudGV4dCh0aGlzLm9wdHMuZXJyb3JOb3RpY2UpLHRoaXMuJHRhcmdldC5yZW1vdmVDbGFzcyhcImlzLWxvYWRpbmdcIikuYWRkQ2xhc3MoXCJpcy1lcnJvclwiKSx0aGlzLmRldGFjaE5vdGljZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC4kbm90aWNlLmRldGFjaCgpLHQuZGV0YWNoTm90aWNlPW51bGx9LHRoaXMub3B0cy5lcnJvckR1cmF0aW9uKX0sbi5wcm90b3R5cGUuX2xvYWRJbWFnZT1mdW5jdGlvbih0LGUpe3ZhciBvPW5ldyBJbWFnZTt0aGlzLiR0YXJnZXQuYWRkQ2xhc3MoXCJpcy1sb2FkaW5nXCIpLmFwcGVuZCh0aGlzLiRub3RpY2UudGV4dCh0aGlzLm9wdHMubG9hZGluZ05vdGljZSkpLHRoaXMuJHpvb209aShvKS5vbihcImVycm9yXCIsaS5wcm94eSh0aGlzLl9vbkVycm9yLHRoaXMpKS5vbihcImxvYWRcIixlLGkucHJveHkodGhpcy5fb25Mb2FkLHRoaXMpKSxvLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIixvLnNyYz10fSxuLnByb3RvdHlwZS5fbW92ZT1mdW5jdGlvbih0KXtzPTA9PT10LnR5cGUuaW5kZXhPZihcInRvdWNoXCIpPyhlPXQudG91Y2hlc3x8dC5vcmlnaW5hbEV2ZW50LnRvdWNoZXMsbz1lWzBdLnBhZ2VYLGVbMF0ucGFnZVkpOihvPXQucGFnZVh8fG8sdC5wYWdlWXx8cyk7dmFyIGU9dGhpcy4kdGFyZ2V0Lm9mZnNldCgpLHQ9by1lLmxlZnQsZT1zLWUudG9wLHQ9TWF0aC5jZWlsKHQqbCksZT1NYXRoLmNlaWwoZSpwKTt0PDB8fGU8MHx8Yzx0fHxkPGU/dGhpcy5oaWRlKCk6KGU9LTEqZSx0PS0xKnQsXCJ0cmFuc2Zvcm1cImluIGRvY3VtZW50LmJvZHkuc3R5bGU/dGhpcy4kem9vbS5jc3Moe3RyYW5zZm9ybTpcInRyYW5zbGF0ZShcIit0K1wicHgsIFwiK2UrXCJweClcIn0pOnRoaXMuJHpvb20uY3NzKHt0b3A6ZSxsZWZ0OnR9KSx0aGlzLm9wdHMub25Nb3ZlLmNhbGwodGhpcyxlLHQpKX0sbi5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3RoaXMuaXNPcGVuJiYhMSE9PXRoaXMub3B0cy5iZWZvcmVIaWRlLmNhbGwodGhpcykmJih0aGlzLiRmbHlvdXQuZGV0YWNoKCksdGhpcy5pc09wZW49ITEsdGhpcy5vcHRzLm9uSGlkZS5jYWxsKHRoaXMpKX0sbi5wcm90b3R5cGUuc3dhcD1mdW5jdGlvbih0LGUsbyl7dGhpcy5oaWRlKCksdGhpcy5pc1JlYWR5PSExLHRoaXMuZGV0YWNoTm90aWNlJiZjbGVhclRpbWVvdXQodGhpcy5kZXRhY2hOb3RpY2UpLHRoaXMuJG5vdGljZS5wYXJlbnQoKS5sZW5ndGgmJnRoaXMuJG5vdGljZS5kZXRhY2goKSx0aGlzLiR0YXJnZXQucmVtb3ZlQ2xhc3MoXCJpcy1sb2FkaW5nIGlzLXJlYWR5IGlzLWVycm9yXCIpLHRoaXMuJGltYWdlLmF0dHIoe3NyYzp0LHNyY3NldDppLmlzQXJyYXkobyk/by5qb2luKCk6b30pLHRoaXMuJGxpbmsuYXR0cih0aGlzLm9wdHMubGlua0F0dHJpYnV0ZSxlKX0sbi5wcm90b3R5cGUudGVhcmRvd249ZnVuY3Rpb24oKXt0aGlzLmhpZGUoKSx0aGlzLiR0YXJnZXQub2ZmKFwiLmVhc3l6b29tXCIpLnJlbW92ZUNsYXNzKFwiaXMtbG9hZGluZyBpcy1yZWFkeSBpcy1lcnJvclwiKSx0aGlzLmRldGFjaE5vdGljZSYmY2xlYXJUaW1lb3V0KHRoaXMuZGV0YWNoTm90aWNlKSxkZWxldGUgdGhpcy4kbGluayxkZWxldGUgdGhpcy4kem9vbSxkZWxldGUgdGhpcy4kaW1hZ2UsZGVsZXRlIHRoaXMuJG5vdGljZSxkZWxldGUgdGhpcy4kZmx5b3V0LGRlbGV0ZSB0aGlzLmlzT3BlbixkZWxldGUgdGhpcy5pc1JlYWR5fSxpLmZuLmVhc3lab29tPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1pLmRhdGEodGhpcyxcImVhc3lab29tXCIpO3Q/dm9pZCAwPT09dC5pc09wZW4mJnQuX2luaXQoKTppLmRhdGEodGhpcyxcImVhc3lab29tXCIsbmV3IG4odGhpcyxlKSl9KX0sbn0pOyIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgfHwgZmFsc2U7XG5pZiAoJGRlZmluZVByb3BlcnR5KSB7XG5cdHRyeSB7XG5cdFx0JGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsgdmFsdWU6IDEgfSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJRSA4IGhhcyBhIGJyb2tlbiBkZWZpbmVQcm9wZXJ0eVxuXHRcdCRkZWZpbmVQcm9wZXJ0eSA9IGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gJGRlZmluZVByb3BlcnR5O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9ldmFsJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IEV2YWxFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3JhbmdlJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFJhbmdlRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3JlZicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBSZWZlcmVuY2VFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vc3ludGF4Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRheEVycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi90eXBlJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFR5cGVFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vdXJpJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFVSSUVycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Q7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG4gICwgcHJlZml4ID0gJ34nO1xuXG4vKipcbiAqIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIHN0b3JhZ2UgZm9yIG91ciBgRUVgIG9iamVjdHMuXG4gKiBBbiBgRXZlbnRzYCBpbnN0YW5jZSBpcyBhIHBsYWluIG9iamVjdCB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBldmVudCBuYW1lcy5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEV2ZW50cygpIHt9XG5cbi8vXG4vLyBXZSB0cnkgdG8gbm90IGluaGVyaXQgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAuIEluIHNvbWUgZW5naW5lcyBjcmVhdGluZyBhblxuLy8gaW5zdGFuY2UgaW4gdGhpcyB3YXkgaXMgZmFzdGVyIHRoYW4gY2FsbGluZyBgT2JqZWN0LmNyZWF0ZShudWxsKWAgZGlyZWN0bHkuXG4vLyBJZiBgT2JqZWN0LmNyZWF0ZShudWxsKWAgaXMgbm90IHN1cHBvcnRlZCB3ZSBwcmVmaXggdGhlIGV2ZW50IG5hbWVzIHdpdGggYVxuLy8gY2hhcmFjdGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsdC1pbiBvYmplY3QgcHJvcGVydGllcyBhcmUgbm90XG4vLyBvdmVycmlkZGVuIG9yIHVzZWQgYXMgYW4gYXR0YWNrIHZlY3Rvci5cbi8vXG5pZiAoT2JqZWN0LmNyZWF0ZSkge1xuICBFdmVudHMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAvL1xuICAvLyBUaGlzIGhhY2sgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIGBfX3Byb3RvX19gIHByb3BlcnR5IGlzIHN0aWxsIGluaGVyaXRlZCBpblxuICAvLyBzb21lIG9sZCBicm93c2VycyBsaWtlIEFuZHJvaWQgNCwgaVBob25lIDUuMSwgT3BlcmEgMTEgYW5kIFNhZmFyaSA1LlxuICAvL1xuICBpZiAoIW5ldyBFdmVudHMoKS5fX3Byb3RvX18pIHByZWZpeCA9IGZhbHNlO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGV2ZW50IGxpc3RlbmVyLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvbmNlPWZhbHNlXSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBFRShmbiwgY29udGV4dCwgb25jZSkge1xuICB0aGlzLmZuID0gZm47XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMub25jZSA9IG9uY2UgfHwgZmFsc2U7XG59XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IGVtaXR0ZXIgUmVmZXJlbmNlIHRvIHRoZSBgRXZlbnRFbWl0dGVyYCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9uY2UgU3BlY2lmeSBpZiB0aGUgbGlzdGVuZXIgaXMgYSBvbmUtdGltZSBsaXN0ZW5lci5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhZGRMaXN0ZW5lcihlbWl0dGVyLCBldmVudCwgZm4sIGNvbnRleHQsIG9uY2UpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lciA9IG5ldyBFRShmbiwgY29udGV4dCB8fCBlbWl0dGVyLCBvbmNlKVxuICAgICwgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIWVtaXR0ZXIuX2V2ZW50c1tldnRdKSBlbWl0dGVyLl9ldmVudHNbZXZ0XSA9IGxpc3RlbmVyLCBlbWl0dGVyLl9ldmVudHNDb3VudCsrO1xuICBlbHNlIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0uZm4pIGVtaXR0ZXIuX2V2ZW50c1tldnRdLnB1c2gobGlzdGVuZXIpO1xuICBlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gW2VtaXR0ZXIuX2V2ZW50c1tldnRdLCBsaXN0ZW5lcl07XG5cbiAgcmV0dXJuIGVtaXR0ZXI7XG59XG5cbi8qKlxuICogQ2xlYXIgZXZlbnQgYnkgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2dCBUaGUgRXZlbnQgbmFtZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNsZWFyRXZlbnQoZW1pdHRlciwgZXZ0KSB7XG4gIGlmICgtLWVtaXR0ZXIuX2V2ZW50c0NvdW50ID09PSAwKSBlbWl0dGVyLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gIGVsc2UgZGVsZXRlIGVtaXR0ZXIuX2V2ZW50c1tldnRdO1xufVxuXG4vKipcbiAqIE1pbmltYWwgYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlIHRoYXQgaXMgbW9sZGVkIGFnYWluc3QgdGhlIE5vZGUuanNcbiAqIGBFdmVudEVtaXR0ZXJgIGludGVyZmFjZS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYW4gYXJyYXkgbGlzdGluZyB0aGUgZXZlbnRzIGZvciB3aGljaCB0aGUgZW1pdHRlciBoYXMgcmVnaXN0ZXJlZFxuICogbGlzdGVuZXJzLlxuICpcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgdmFyIG5hbWVzID0gW11cbiAgICAsIGV2ZW50c1xuICAgICwgbmFtZTtcblxuICBpZiAodGhpcy5fZXZlbnRzQ291bnQgPT09IDApIHJldHVybiBuYW1lcztcblxuICBmb3IgKG5hbWUgaW4gKGV2ZW50cyA9IHRoaXMuX2V2ZW50cykpIHtcbiAgICBpZiAoaGFzLmNhbGwoZXZlbnRzLCBuYW1lKSkgbmFtZXMucHVzaChwcmVmaXggPyBuYW1lLnNsaWNlKDEpIDogbmFtZSk7XG4gIH1cblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHJldHVybiBuYW1lcy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhldmVudHMpKTtcbiAgfVxuXG4gIHJldHVybiBuYW1lcztcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnMoZXZlbnQpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnRcbiAgICAsIGhhbmRsZXJzID0gdGhpcy5fZXZlbnRzW2V2dF07XG5cbiAgaWYgKCFoYW5kbGVycykgcmV0dXJuIFtdO1xuICBpZiAoaGFuZGxlcnMuZm4pIHJldHVybiBbaGFuZGxlcnMuZm5dO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoLCBlZSA9IG5ldyBBcnJheShsKTsgaSA8IGw7IGkrKykge1xuICAgIGVlW2ldID0gaGFuZGxlcnNbaV0uZm47XG4gIH1cblxuICByZXR1cm4gZWU7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyBsaXN0ZW5pbmcgdG8gYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgbnVtYmVyIG9mIGxpc3RlbmVycy5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gbGlzdGVuZXJDb3VudChldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2dF07XG5cbiAgaWYgKCFsaXN0ZW5lcnMpIHJldHVybiAwO1xuICBpZiAobGlzdGVuZXJzLmZuKSByZXR1cm4gMTtcbiAgcmV0dXJuIGxpc3RlbmVycy5sZW5ndGg7XG59O1xuXG4vKipcbiAqIENhbGxzIGVhY2ggb2YgdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIGV2ZW50IGhhZCBsaXN0ZW5lcnMsIGVsc2UgYGZhbHNlYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdChldmVudCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW2V2dF0pIHJldHVybiBmYWxzZTtcblxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2dF1cbiAgICAsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAsIGFyZ3NcbiAgICAsIGk7XG5cbiAgaWYgKGxpc3RlbmVycy5mbikge1xuICAgIGlmIChsaXN0ZW5lcnMub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgc3dpdGNoIChsZW4pIHtcbiAgICAgIGNhc2UgMTogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgMjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSksIHRydWU7XG4gICAgICBjYXNlIDM6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyKSwgdHJ1ZTtcbiAgICAgIGNhc2UgNDogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzKSwgdHJ1ZTtcbiAgICAgIGNhc2UgNTogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCksIHRydWU7XG4gICAgICBjYXNlIDY6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyLCBhMywgYTQsIGE1KSwgdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGkgPCBsZW47IGkrKykge1xuICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuXG4gICAgbGlzdGVuZXJzLmZuLmFwcGx5KGxpc3RlbmVycy5jb250ZXh0LCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGVuZ3RoID0gbGlzdGVuZXJzLmxlbmd0aFxuICAgICAgLCBqO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobGlzdGVuZXJzW2ldLm9uY2UpIHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyc1tpXS5mbiwgdW5kZWZpbmVkLCB0cnVlKTtcblxuICAgICAgc3dpdGNoIChsZW4pIHtcbiAgICAgICAgY2FzZSAxOiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCk7IGJyZWFrO1xuICAgICAgICBjYXNlIDI6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSk7IGJyZWFrO1xuICAgICAgICBjYXNlIDM6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIpOyBicmVhaztcbiAgICAgICAgY2FzZSA0OiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCwgYTEsIGEyLCBhMyk7IGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmICghYXJncykgZm9yIChqID0gMSwgYXJncyA9IG5ldyBBcnJheShsZW4gLTEpOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaiAtIDFdID0gYXJndW1lbnRzW2pdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxpc3RlbmVyc1tpXS5mbi5hcHBseShsaXN0ZW5lcnNbaV0uY29udGV4dCwgYXJncyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEFkZCBhIGxpc3RlbmVyIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW2NvbnRleHQ9dGhpc10gVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gb24oZXZlbnQsIGZuLCBjb250ZXh0KSB7XG4gIHJldHVybiBhZGRMaXN0ZW5lcih0aGlzLCBldmVudCwgZm4sIGNvbnRleHQsIGZhbHNlKTtcbn07XG5cbi8qKlxuICogQWRkIGEgb25lLXRpbWUgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UoZXZlbnQsIGZuLCBjb250ZXh0KSB7XG4gIHJldHVybiBhZGRMaXN0ZW5lcih0aGlzLCBldmVudCwgZm4sIGNvbnRleHQsIHRydWUpO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgdGhlIGxpc3RlbmVycyBvZiBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIE9ubHkgcmVtb3ZlIHRoZSBsaXN0ZW5lcnMgdGhhdCBtYXRjaCB0aGlzIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IE9ubHkgcmVtb3ZlIHRoZSBsaXN0ZW5lcnMgdGhhdCBoYXZlIHRoaXMgY29udGV4dC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBPbmx5IHJlbW92ZSBvbmUtdGltZSBsaXN0ZW5lcnMuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihldmVudCwgZm4sIGNvbnRleHQsIG9uY2UpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIHRoaXM7XG4gIGlmICghZm4pIHtcbiAgICBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2dF07XG5cbiAgaWYgKGxpc3RlbmVycy5mbikge1xuICAgIGlmIChcbiAgICAgIGxpc3RlbmVycy5mbiA9PT0gZm4gJiZcbiAgICAgICghb25jZSB8fCBsaXN0ZW5lcnMub25jZSkgJiZcbiAgICAgICghY29udGV4dCB8fCBsaXN0ZW5lcnMuY29udGV4dCA9PT0gY29udGV4dClcbiAgICApIHtcbiAgICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGV2ZW50cyA9IFtdLCBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChcbiAgICAgICAgbGlzdGVuZXJzW2ldLmZuICE9PSBmbiB8fFxuICAgICAgICAob25jZSAmJiAhbGlzdGVuZXJzW2ldLm9uY2UpIHx8XG4gICAgICAgIChjb250ZXh0ICYmIGxpc3RlbmVyc1tpXS5jb250ZXh0ICE9PSBjb250ZXh0KVxuICAgICAgKSB7XG4gICAgICAgIGV2ZW50cy5wdXNoKGxpc3RlbmVyc1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBSZXNldCB0aGUgYXJyYXksIG9yIHJlbW92ZSBpdCBjb21wbGV0ZWx5IGlmIHdlIGhhdmUgbm8gbW9yZSBsaXN0ZW5lcnMuXG4gICAgLy9cbiAgICBpZiAoZXZlbnRzLmxlbmd0aCkgdGhpcy5fZXZlbnRzW2V2dF0gPSBldmVudHMubGVuZ3RoID09PSAxID8gZXZlbnRzWzBdIDogZXZlbnRzO1xuICAgIGVsc2UgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhbGwgbGlzdGVuZXJzLCBvciB0aG9zZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBbZXZlbnRdIFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0O1xuXG4gIGlmIChldmVudCkge1xuICAgIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG4gICAgaWYgKHRoaXMuX2V2ZW50c1tldnRdKSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50cygpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy9cbi8vIEFsaWFzIG1ldGhvZHMgbmFtZXMgYmVjYXVzZSBwZW9wbGUgcm9sbCBsaWtlIHRoYXQuXG4vL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUub247XG5cbi8vXG4vLyBFeHBvc2UgdGhlIHByZWZpeC5cbi8vXG5FdmVudEVtaXR0ZXIucHJlZml4ZWQgPSBwcmVmaXg7XG5cbi8vXG4vLyBBbGxvdyBgRXZlbnRFbWl0dGVyYCB0byBiZSBpbXBvcnRlZCBhcyBtb2R1bGUgbmFtZXNwYWNlLlxuLy9cbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbi8vXG4vLyBFeHBvc2UgdGhlIG1vZHVsZS5cbi8vXG5pZiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBtb2R1bGUpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG59XG4iLCIvKiFcbiogZm9jdXMtdHJhcCA2LjkuNFxuKiBAbGljZW5zZSBNSVQsIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2N1cy10cmFwL2ZvY3VzLXRyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRVxuKi9cbmltcG9ydCB7IHRhYmJhYmxlLCBmb2N1c2FibGUsIGlzVGFiYmFibGUsIGlzRm9jdXNhYmxlIH0gZnJvbSAndGFiYmFibGUnO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMih0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTtcbiAgICBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG52YXIgYWN0aXZlRm9jdXNUcmFwcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRyYXBRdWV1ZSA9IFtdO1xuICByZXR1cm4ge1xuICAgIGFjdGl2YXRlVHJhcDogZnVuY3Rpb24gYWN0aXZhdGVUcmFwKHRyYXApIHtcbiAgICAgIGlmICh0cmFwUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgYWN0aXZlVHJhcCA9IHRyYXBRdWV1ZVt0cmFwUXVldWUubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgaWYgKGFjdGl2ZVRyYXAgIT09IHRyYXApIHtcbiAgICAgICAgICBhY3RpdmVUcmFwLnBhdXNlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHRyYXBJbmRleCA9IHRyYXBRdWV1ZS5pbmRleE9mKHRyYXApO1xuXG4gICAgICBpZiAodHJhcEluZGV4ID09PSAtMSkge1xuICAgICAgICB0cmFwUXVldWUucHVzaCh0cmFwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG1vdmUgdGhpcyBleGlzdGluZyB0cmFwIHRvIHRoZSBmcm9udCBvZiB0aGUgcXVldWVcbiAgICAgICAgdHJhcFF1ZXVlLnNwbGljZSh0cmFwSW5kZXgsIDEpO1xuICAgICAgICB0cmFwUXVldWUucHVzaCh0cmFwKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRlYWN0aXZhdGVUcmFwOiBmdW5jdGlvbiBkZWFjdGl2YXRlVHJhcCh0cmFwKSB7XG4gICAgICB2YXIgdHJhcEluZGV4ID0gdHJhcFF1ZXVlLmluZGV4T2YodHJhcCk7XG5cbiAgICAgIGlmICh0cmFwSW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRyYXBRdWV1ZS5zcGxpY2UodHJhcEluZGV4LCAxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRyYXBRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRyYXBRdWV1ZVt0cmFwUXVldWUubGVuZ3RoIC0gMV0udW5wYXVzZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn0oKTtcblxudmFyIGlzU2VsZWN0YWJsZUlucHV0ID0gZnVuY3Rpb24gaXNTZWxlY3RhYmxlSW5wdXQobm9kZSkge1xuICByZXR1cm4gbm9kZS50YWdOYW1lICYmIG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmIHR5cGVvZiBub2RlLnNlbGVjdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cbnZhciBpc0VzY2FwZUV2ZW50ID0gZnVuY3Rpb24gaXNFc2NhcGVFdmVudChlKSB7XG4gIHJldHVybiBlLmtleSA9PT0gJ0VzY2FwZScgfHwgZS5rZXkgPT09ICdFc2MnIHx8IGUua2V5Q29kZSA9PT0gMjc7XG59O1xuXG52YXIgaXNUYWJFdmVudCA9IGZ1bmN0aW9uIGlzVGFiRXZlbnQoZSkge1xuICByZXR1cm4gZS5rZXkgPT09ICdUYWInIHx8IGUua2V5Q29kZSA9PT0gOTtcbn07XG5cbnZhciBkZWxheSA9IGZ1bmN0aW9uIGRlbGF5KGZuKSB7XG4gIHJldHVybiBzZXRUaW1lb3V0KGZuLCAwKTtcbn07IC8vIEFycmF5LmZpbmQvZmluZEluZGV4KCkgYXJlIG5vdCBzdXBwb3J0ZWQgb24gSUU7IHRoaXMgcmVwbGljYXRlcyBlbm91Z2hcbi8vICBvZiBBcnJheS5maW5kSW5kZXgoKSBmb3Igb3VyIG5lZWRzXG5cblxudmFyIGZpbmRJbmRleCA9IGZ1bmN0aW9uIGZpbmRJbmRleChhcnIsIGZuKSB7XG4gIHZhciBpZHggPSAtMTtcbiAgYXJyLmV2ZXJ5KGZ1bmN0aW9uICh2YWx1ZSwgaSkge1xuICAgIGlmIChmbih2YWx1ZSkpIHtcbiAgICAgIGlkeCA9IGk7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIGJyZWFrXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7IC8vIG5leHRcbiAgfSk7XG4gIHJldHVybiBpZHg7XG59O1xuLyoqXG4gKiBHZXQgYW4gb3B0aW9uJ3MgdmFsdWUgd2hlbiBpdCBjb3VsZCBiZSBhIHBsYWluIHZhbHVlLCBvciBhIGhhbmRsZXIgdGhhdCBwcm92aWRlc1xuICogIHRoZSB2YWx1ZS5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgT3B0aW9uJ3MgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0gey4uLip9IFtwYXJhbXNdIEFueSBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXIsIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHsqfSBUaGUgYHZhbHVlYCwgb3IgdGhlIGhhbmRsZXIncyByZXR1cm5lZCB2YWx1ZS5cbiAqL1xuXG5cbnZhciB2YWx1ZU9ySGFuZGxlciA9IGZ1bmN0aW9uIHZhbHVlT3JIYW5kbGVyKHZhbHVlKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBwYXJhbXMgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHBhcmFtc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nID8gdmFsdWUuYXBwbHkodm9pZCAwLCBwYXJhbXMpIDogdmFsdWU7XG59O1xuXG52YXIgZ2V0QWN0dWFsVGFyZ2V0ID0gZnVuY3Rpb24gZ2V0QWN0dWFsVGFyZ2V0KGV2ZW50KSB7XG4gIC8vIE5PVEU6IElmIHRoZSB0cmFwIGlzIF9pbnNpZGVfIGEgc2hhZG93IERPTSwgZXZlbnQudGFyZ2V0IHdpbGwgYWx3YXlzIGJlIHRoZVxuICAvLyAgc2hhZG93IGhvc3QuIEhvd2V2ZXIsIGV2ZW50LnRhcmdldC5jb21wb3NlZFBhdGgoKSB3aWxsIGJlIGFuIGFycmF5IG9mXG4gIC8vICBub2RlcyBcImNsaWNrZWRcIiBmcm9tIGlubmVyLW1vc3QgKHRoZSBhY3R1YWwgZWxlbWVudCBpbnNpZGUgdGhlIHNoYWRvdykgdG9cbiAgLy8gIG91dGVyLW1vc3QgKHRoZSBob3N0IEhUTUwgZG9jdW1lbnQpLiBJZiB3ZSBoYXZlIGFjY2VzcyB0byBjb21wb3NlZFBhdGgoKSxcbiAgLy8gIHRoZW4gdXNlIGl0cyBmaXJzdCBlbGVtZW50OyBvdGhlcndpc2UsIGZhbGwgYmFjayB0byBldmVudC50YXJnZXQgKGFuZFxuICAvLyAgdGhpcyBvbmx5IHdvcmtzIGZvciBhbiBfb3Blbl8gc2hhZG93IERPTTsgb3RoZXJ3aXNlLFxuICAvLyAgY29tcG9zZWRQYXRoKClbMF0gPT09IGV2ZW50LnRhcmdldCBhbHdheXMpLlxuICByZXR1cm4gZXZlbnQudGFyZ2V0LnNoYWRvd1Jvb3QgJiYgdHlwZW9mIGV2ZW50LmNvbXBvc2VkUGF0aCA9PT0gJ2Z1bmN0aW9uJyA/IGV2ZW50LmNvbXBvc2VkUGF0aCgpWzBdIDogZXZlbnQudGFyZ2V0O1xufTtcblxudmFyIGNyZWF0ZUZvY3VzVHJhcCA9IGZ1bmN0aW9uIGNyZWF0ZUZvY3VzVHJhcChlbGVtZW50cywgdXNlck9wdGlvbnMpIHtcbiAgLy8gU1NSOiBhIGxpdmUgdHJhcCBzaG91bGRuJ3QgYmUgY3JlYXRlZCBpbiB0aGlzIHR5cGUgb2YgZW52aXJvbm1lbnQgc28gdGhpc1xuICAvLyAgc2hvdWxkIGJlIHNhZmUgY29kZSB0byBleGVjdXRlIGlmIHRoZSBgZG9jdW1lbnRgIG9wdGlvbiBpc24ndCBzcGVjaWZpZWRcbiAgdmFyIGRvYyA9ICh1c2VyT3B0aW9ucyA9PT0gbnVsbCB8fCB1c2VyT3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogdXNlck9wdGlvbnMuZG9jdW1lbnQpIHx8IGRvY3VtZW50O1xuXG4gIHZhciBjb25maWcgPSBfb2JqZWN0U3ByZWFkMih7XG4gICAgcmV0dXJuRm9jdXNPbkRlYWN0aXZhdGU6IHRydWUsXG4gICAgZXNjYXBlRGVhY3RpdmF0ZXM6IHRydWUsXG4gICAgZGVsYXlJbml0aWFsRm9jdXM6IHRydWVcbiAgfSwgdXNlck9wdGlvbnMpO1xuXG4gIHZhciBzdGF0ZSA9IHtcbiAgICAvLyBjb250YWluZXJzIGdpdmVuIHRvIGNyZWF0ZUZvY3VzVHJhcCgpXG4gICAgLy8gQHR5cGUge0FycmF5PEhUTUxFbGVtZW50Pn1cbiAgICBjb250YWluZXJzOiBbXSxcbiAgICAvLyBsaXN0IG9mIG9iamVjdHMgaWRlbnRpZnlpbmcgdGFiYmFibGUgbm9kZXMgaW4gYGNvbnRhaW5lcnNgIGluIHRoZSB0cmFwXG4gICAgLy8gTk9URTogaXQncyBwb3NzaWJsZSB0aGF0IGEgZ3JvdXAgaGFzIG5vIHRhYmJhYmxlIG5vZGVzIGlmIG5vZGVzIGdldCByZW1vdmVkIHdoaWxlIHRoZSB0cmFwXG4gICAgLy8gIGlzIGFjdGl2ZSwgYnV0IHRoZSB0cmFwIHNob3VsZCBuZXZlciBnZXQgdG8gYSBzdGF0ZSB3aGVyZSB0aGVyZSBpc24ndCBhdCBsZWFzdCBvbmUgZ3JvdXBcbiAgICAvLyAgd2l0aCBhdCBsZWFzdCBvbmUgdGFiYmFibGUgbm9kZSBpbiBpdCAodGhhdCB3b3VsZCBsZWFkIHRvIGFuIGVycm9yIGNvbmRpdGlvbiB0aGF0IHdvdWxkXG4gICAgLy8gIHJlc3VsdCBpbiBhbiBlcnJvciBiZWluZyB0aHJvd24pXG4gICAgLy8gQHR5cGUge0FycmF5PHtcbiAgICAvLyAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgLy8gICB0YWJiYWJsZU5vZGVzOiBBcnJheTxIVE1MRWxlbWVudD4sIC8vIGVtcHR5IGlmIG5vbmVcbiAgICAvLyAgIGZvY3VzYWJsZU5vZGVzOiBBcnJheTxIVE1MRWxlbWVudD4sIC8vIGVtcHR5IGlmIG5vbmVcbiAgICAvLyAgIGZpcnN0VGFiYmFibGVOb2RlOiBIVE1MRWxlbWVudHxudWxsLFxuICAgIC8vICAgbGFzdFRhYmJhYmxlTm9kZTogSFRNTEVsZW1lbnR8bnVsbCxcbiAgICAvLyAgIG5leHRUYWJiYWJsZU5vZGU6IChub2RlOiBIVE1MRWxlbWVudCwgZm9yd2FyZDogYm9vbGVhbikgPT4gSFRNTEVsZW1lbnR8dW5kZWZpbmVkXG4gICAgLy8gfT59XG4gICAgY29udGFpbmVyR3JvdXBzOiBbXSxcbiAgICAvLyBzYW1lIG9yZGVyL2xlbmd0aCBhcyBgY29udGFpbmVyc2AgbGlzdFxuICAgIC8vIHJlZmVyZW5jZXMgdG8gb2JqZWN0cyBpbiBgY29udGFpbmVyR3JvdXBzYCwgYnV0IG9ubHkgdGhvc2UgdGhhdCBhY3R1YWxseSBoYXZlXG4gICAgLy8gIHRhYmJhYmxlIG5vZGVzIGluIHRoZW1cbiAgICAvLyBOT1RFOiBzYW1lIG9yZGVyIGFzIGBjb250YWluZXJzYCBhbmQgYGNvbnRhaW5lckdyb3Vwc2AsIGJ1dCBfX25vdCBuZWNlc3NhcmlseV9fXG4gICAgLy8gIHRoZSBzYW1lIGxlbmd0aFxuICAgIHRhYmJhYmxlR3JvdXBzOiBbXSxcbiAgICBub2RlRm9jdXNlZEJlZm9yZUFjdGl2YXRpb246IG51bGwsXG4gICAgbW9zdFJlY2VudGx5Rm9jdXNlZE5vZGU6IG51bGwsXG4gICAgYWN0aXZlOiBmYWxzZSxcbiAgICBwYXVzZWQ6IGZhbHNlLFxuICAgIC8vIHRpbWVyIElEIGZvciB3aGVuIGRlbGF5SW5pdGlhbEZvY3VzIGlzIHRydWUgYW5kIGluaXRpYWwgZm9jdXMgaW4gdGhpcyB0cmFwXG4gICAgLy8gIGhhcyBiZWVuIGRlbGF5ZWQgZHVyaW5nIGFjdGl2YXRpb25cbiAgICBkZWxheUluaXRpYWxGb2N1c1RpbWVyOiB1bmRlZmluZWRcbiAgfTtcbiAgdmFyIHRyYXA7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLWNvbnN0IC0tIHNvbWUgcHJpdmF0ZSBmdW5jdGlvbnMgcmVmZXJlbmNlIGl0LCBhbmQgaXRzIG1ldGhvZHMgcmVmZXJlbmNlIHByaXZhdGUgZnVuY3Rpb25zLCBzbyB3ZSBtdXN0IGRlY2xhcmUgaGVyZSBhbmQgZGVmaW5lIGxhdGVyXG5cbiAgLyoqXG4gICAqIEdldHMgYSBjb25maWd1cmF0aW9uIG9wdGlvbiB2YWx1ZS5cbiAgICogQHBhcmFtIHtPYmplY3R8dW5kZWZpbmVkfSBjb25maWdPdmVycmlkZU9wdGlvbnMgSWYgdHJ1ZSwgYW5kIG9wdGlvbiBpcyBkZWZpbmVkIGluIHRoaXMgc2V0LFxuICAgKiAgdmFsdWUgd2lsbCBiZSB0YWtlbiBmcm9tIHRoaXMgb2JqZWN0LiBPdGhlcndpc2UsIHZhbHVlIHdpbGwgYmUgdGFrZW4gZnJvbSBiYXNlIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25OYW1lIE5hbWUgb2YgdGhlIG9wdGlvbiB3aG9zZSB2YWx1ZSBpcyBzb3VnaHQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gW2NvbmZpZ09wdGlvbk5hbWVdIE5hbWUgb2Ygb3B0aW9uIHRvIHVzZSBfX2luc3RlYWQgb2ZfXyBgb3B0aW9uTmFtZWBcbiAgICogIElJRiBgY29uZmlnT3ZlcnJpZGVPcHRpb25zYCBpcyBub3QgZGVmaW5lZC4gT3RoZXJ3aXNlLCBgb3B0aW9uTmFtZWAgaXMgdXNlZC5cbiAgICovXG5cbiAgdmFyIGdldE9wdGlvbiA9IGZ1bmN0aW9uIGdldE9wdGlvbihjb25maWdPdmVycmlkZU9wdGlvbnMsIG9wdGlvbk5hbWUsIGNvbmZpZ09wdGlvbk5hbWUpIHtcbiAgICByZXR1cm4gY29uZmlnT3ZlcnJpZGVPcHRpb25zICYmIGNvbmZpZ092ZXJyaWRlT3B0aW9uc1tvcHRpb25OYW1lXSAhPT0gdW5kZWZpbmVkID8gY29uZmlnT3ZlcnJpZGVPcHRpb25zW29wdGlvbk5hbWVdIDogY29uZmlnW2NvbmZpZ09wdGlvbk5hbWUgfHwgb3B0aW9uTmFtZV07XG4gIH07XG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgaW5kZXggb2YgdGhlIGNvbnRhaW5lciB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IEluZGV4IG9mIHRoZSBjb250YWluZXIgaW4gZWl0aGVyIGBzdGF0ZS5jb250YWluZXJzYCBvclxuICAgKiAgYHN0YXRlLmNvbnRhaW5lckdyb3Vwc2AgKHRoZSBvcmRlci9sZW5ndGggb2YgdGhlc2UgbGlzdHMgYXJlIHRoZSBzYW1lKTsgLTFcbiAgICogIGlmIHRoZSBlbGVtZW50IGlzbid0IGZvdW5kLlxuICAgKi9cblxuXG4gIHZhciBmaW5kQ29udGFpbmVySW5kZXggPSBmdW5jdGlvbiBmaW5kQ29udGFpbmVySW5kZXgoZWxlbWVudCkge1xuICAgIC8vIE5PVEU6IHNlYXJjaCBgY29udGFpbmVyR3JvdXBzYCBiZWNhdXNlIGl0J3MgcG9zc2libGUgYSBncm91cCBjb250YWlucyBubyB0YWJiYWJsZVxuICAgIC8vICBub2RlcywgYnV0IHN0aWxsIGNvbnRhaW5zIGZvY3VzYWJsZSBub2RlcyAoZS5nLiBpZiB0aGV5IGFsbCBoYXZlIGB0YWJpbmRleD0tMWApXG4gICAgLy8gIGFuZCB3ZSBzdGlsbCBuZWVkIHRvIGZpbmQgdGhlIGVsZW1lbnQgaW4gdGhlcmVcbiAgICByZXR1cm4gc3RhdGUuY29udGFpbmVyR3JvdXBzLmZpbmRJbmRleChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIGNvbnRhaW5lciA9IF9yZWYuY29udGFpbmVyLFxuICAgICAgICAgIHRhYmJhYmxlTm9kZXMgPSBfcmVmLnRhYmJhYmxlTm9kZXM7XG4gICAgICByZXR1cm4gY29udGFpbmVyLmNvbnRhaW5zKGVsZW1lbnQpIHx8IC8vIGZhbGwgYmFjayB0byBleHBsaWNpdCB0YWJiYWJsZSBzZWFyY2ggd2hpY2ggd2lsbCB0YWtlIGludG8gY29uc2lkZXJhdGlvbiBhbnlcbiAgICAgIC8vICB3ZWIgY29tcG9uZW50cyBpZiB0aGUgYHRhYmJhYmxlT3B0aW9ucy5nZXRTaGFkb3dSb290YCBvcHRpb24gd2FzIHVzZWQgZm9yXG4gICAgICAvLyAgdGhlIHRyYXAsIGVuYWJsaW5nIHNoYWRvdyBET00gc3VwcG9ydCBpbiB0YWJiYWJsZSAoYE5vZGUuY29udGFpbnMoKWAgZG9lc24ndFxuICAgICAgLy8gIGxvb2sgaW5zaWRlIHdlYiBjb21wb25lbnRzIGV2ZW4gaWYgb3BlbilcbiAgICAgIHRhYmJhYmxlTm9kZXMuZmluZChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZSA9PT0gZWxlbWVudDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuICAvKipcbiAgICogR2V0cyB0aGUgbm9kZSBmb3IgdGhlIGdpdmVuIG9wdGlvbiwgd2hpY2ggaXMgZXhwZWN0ZWQgdG8gYmUgYW4gb3B0aW9uIHRoYXRcbiAgICogIGNhbiBiZSBlaXRoZXIgYSBET00gbm9kZSwgYSBzdHJpbmcgdGhhdCBpcyBhIHNlbGVjdG9yIHRvIGdldCBhIG5vZGUsIGBmYWxzZWBcbiAgICogIChpZiBhIG5vZGUgaXMgZXhwbGljaXRseSBOT1QgZ2l2ZW4pLCBvciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbnkgb2YgdGhlc2VcbiAgICogIHZhbHVlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbk5hbWVcbiAgICogQHJldHVybnMge3VuZGVmaW5lZCB8IGZhbHNlIHwgSFRNTEVsZW1lbnQgfCBTVkdFbGVtZW50fSBSZXR1cm5zXG4gICAqICBgdW5kZWZpbmVkYCBpZiB0aGUgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQ7IGBmYWxzZWAgaWYgdGhlIG9wdGlvblxuICAgKiAgcmVzb2x2ZWQgdG8gYGZhbHNlYCAobm9kZSBleHBsaWNpdGx5IG5vdCBnaXZlbik7IG90aGVyd2lzZSwgdGhlIHJlc29sdmVkXG4gICAqICBET00gbm9kZS5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBvcHRpb24gaXMgc2V0LCBub3QgYGZhbHNlYCwgYW5kIGlzIG5vdCwgb3IgZG9lcyBub3RcbiAgICogIHJlc29sdmUgdG8gYSBub2RlLlxuICAgKi9cblxuXG4gIHZhciBnZXROb2RlRm9yT3B0aW9uID0gZnVuY3Rpb24gZ2V0Tm9kZUZvck9wdGlvbihvcHRpb25OYW1lKSB7XG4gICAgdmFyIG9wdGlvblZhbHVlID0gY29uZmlnW29wdGlvbk5hbWVdO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25WYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBwYXJhbXMgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBwYXJhbXNbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIG9wdGlvblZhbHVlID0gb3B0aW9uVmFsdWUuYXBwbHkodm9pZCAwLCBwYXJhbXMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25WYWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9uVmFsdWUgPSB1bmRlZmluZWQ7IC8vIHVzZSBkZWZhdWx0IHZhbHVlXG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25WYWx1ZSkge1xuICAgICAgaWYgKG9wdGlvblZhbHVlID09PSB1bmRlZmluZWQgfHwgb3B0aW9uVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25WYWx1ZTtcbiAgICAgIH0gLy8gZWxzZSwgZW1wdHkgc3RyaW5nIChpbnZhbGlkKSwgbnVsbCAoaW52YWxpZCksIDAgKGludmFsaWQpXG5cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYFwiLmNvbmNhdChvcHRpb25OYW1lLCBcImAgd2FzIHNwZWNpZmllZCBidXQgd2FzIG5vdCBhIG5vZGUsIG9yIGRpZCBub3QgcmV0dXJuIGEgbm9kZVwiKSk7XG4gICAgfVxuXG4gICAgdmFyIG5vZGUgPSBvcHRpb25WYWx1ZTsgLy8gY291bGQgYmUgSFRNTEVsZW1lbnQsIFNWR0VsZW1lbnQsIG9yIG5vbi1lbXB0eSBzdHJpbmcgYXQgdGhpcyBwb2ludFxuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25WYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5vZGUgPSBkb2MucXVlcnlTZWxlY3RvcihvcHRpb25WYWx1ZSk7IC8vIHJlc29sdmUgdG8gbm9kZSwgb3IgbnVsbCBpZiBmYWlsc1xuXG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYFwiLmNvbmNhdChvcHRpb25OYW1lLCBcImAgYXMgc2VsZWN0b3IgcmVmZXJzIHRvIG5vIGtub3duIG5vZGVcIikpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9O1xuXG4gIHZhciBnZXRJbml0aWFsRm9jdXNOb2RlID0gZnVuY3Rpb24gZ2V0SW5pdGlhbEZvY3VzTm9kZSgpIHtcbiAgICB2YXIgbm9kZSA9IGdldE5vZGVGb3JPcHRpb24oJ2luaXRpYWxGb2N1cycpOyAvLyBmYWxzZSBleHBsaWNpdGx5IGluZGljYXRlcyB3ZSB3YW50IG5vIGluaXRpYWxGb2N1cyBhdCBhbGxcblxuICAgIGlmIChub2RlID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIG9wdGlvbiBub3Qgc3BlY2lmaWVkOiB1c2UgZmFsbGJhY2sgb3B0aW9uc1xuICAgICAgaWYgKGZpbmRDb250YWluZXJJbmRleChkb2MuYWN0aXZlRWxlbWVudCkgPj0gMCkge1xuICAgICAgICBub2RlID0gZG9jLmFjdGl2ZUVsZW1lbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZmlyc3RUYWJiYWJsZUdyb3VwID0gc3RhdGUudGFiYmFibGVHcm91cHNbMF07XG4gICAgICAgIHZhciBmaXJzdFRhYmJhYmxlTm9kZSA9IGZpcnN0VGFiYmFibGVHcm91cCAmJiBmaXJzdFRhYmJhYmxlR3JvdXAuZmlyc3RUYWJiYWJsZU5vZGU7IC8vIE5PVEU6IGBmYWxsYmFja0ZvY3VzYCBvcHRpb24gZnVuY3Rpb24gY2Fubm90IHJldHVybiBgZmFsc2VgIChub3Qgc3VwcG9ydGVkKVxuXG4gICAgICAgIG5vZGUgPSBmaXJzdFRhYmJhYmxlTm9kZSB8fCBnZXROb2RlRm9yT3B0aW9uKCdmYWxsYmFja0ZvY3VzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFub2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdXIgZm9jdXMtdHJhcCBuZWVkcyB0byBoYXZlIGF0IGxlYXN0IG9uZSBmb2N1c2FibGUgZWxlbWVudCcpO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9O1xuXG4gIHZhciB1cGRhdGVUYWJiYWJsZU5vZGVzID0gZnVuY3Rpb24gdXBkYXRlVGFiYmFibGVOb2RlcygpIHtcbiAgICBzdGF0ZS5jb250YWluZXJHcm91cHMgPSBzdGF0ZS5jb250YWluZXJzLm1hcChmdW5jdGlvbiAoY29udGFpbmVyKSB7XG4gICAgICB2YXIgdGFiYmFibGVOb2RlcyA9IHRhYmJhYmxlKGNvbnRhaW5lciwgY29uZmlnLnRhYmJhYmxlT3B0aW9ucyk7IC8vIE5PVEU6IGlmIHdlIGhhdmUgdGFiYmFibGUgbm9kZXMsIHdlIG11c3QgaGF2ZSBmb2N1c2FibGUgbm9kZXM7IGZvY3VzYWJsZSBub2Rlc1xuICAgICAgLy8gIGFyZSBhIHN1cGVyc2V0IG9mIHRhYmJhYmxlIG5vZGVzXG5cbiAgICAgIHZhciBmb2N1c2FibGVOb2RlcyA9IGZvY3VzYWJsZShjb250YWluZXIsIGNvbmZpZy50YWJiYWJsZU9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGFpbmVyOiBjb250YWluZXIsXG4gICAgICAgIHRhYmJhYmxlTm9kZXM6IHRhYmJhYmxlTm9kZXMsXG4gICAgICAgIGZvY3VzYWJsZU5vZGVzOiBmb2N1c2FibGVOb2RlcyxcbiAgICAgICAgZmlyc3RUYWJiYWJsZU5vZGU6IHRhYmJhYmxlTm9kZXMubGVuZ3RoID4gMCA/IHRhYmJhYmxlTm9kZXNbMF0gOiBudWxsLFxuICAgICAgICBsYXN0VGFiYmFibGVOb2RlOiB0YWJiYWJsZU5vZGVzLmxlbmd0aCA+IDAgPyB0YWJiYWJsZU5vZGVzW3RhYmJhYmxlTm9kZXMubGVuZ3RoIC0gMV0gOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaW5kcyB0aGUgX190YWJiYWJsZV9fIG5vZGUgdGhhdCBmb2xsb3dzIHRoZSBnaXZlbiBub2RlIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0aW9uLFxuICAgICAgICAgKiAgaW4gdGhpcyBjb250YWluZXIsIGlmIGFueS5cbiAgICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmb3J3YXJkXSBUcnVlIGlmIGdvaW5nIGluIGZvcndhcmQgdGFiIG9yZGVyOyBmYWxzZSBpZiBnb2luZ1xuICAgICAgICAgKiAgaW4gcmV2ZXJzZS5cbiAgICAgICAgICogQHJldHVybnMge0hUTUxFbGVtZW50fHVuZGVmaW5lZH0gVGhlIG5leHQgdGFiYmFibGUgbm9kZSwgaWYgYW55LlxuICAgICAgICAgKi9cbiAgICAgICAgbmV4dFRhYmJhYmxlTm9kZTogZnVuY3Rpb24gbmV4dFRhYmJhYmxlTm9kZShub2RlKSB7XG4gICAgICAgICAgdmFyIGZvcndhcmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gICAgICAgICAgLy8gTk9URTogSWYgdGFiaW5kZXggaXMgcG9zaXRpdmUgKGluIG9yZGVyIHRvIG1hbmlwdWxhdGUgdGhlIHRhYiBvcmRlciBzZXBhcmF0ZVxuICAgICAgICAgIC8vICBmcm9tIHRoZSBET00gb3JkZXIpLCB0aGlzIF9fd2lsbCBub3Qgd29ya19fIGJlY2F1c2UgdGhlIGxpc3Qgb2YgZm9jdXNhYmxlTm9kZXMsXG4gICAgICAgICAgLy8gIHdoaWxlIGl0IGNvbnRhaW5zIHRhYmJhYmxlIG5vZGVzLCBkb2VzIG5vdCBzb3J0IGl0cyBub2RlcyBpbiBhbnkgb3JkZXIgb3RoZXJcbiAgICAgICAgICAvLyAgdGhhbiBET00gb3JkZXIsIGJlY2F1c2UgaXQgY2FuJ3Q6IFdoZXJlIHdvdWxkIHlvdSBwbGFjZSBmb2N1c2FibGUgKGJ1dCBub3RcbiAgICAgICAgICAvLyAgdGFiYmFibGUpIG5vZGVzIGluIHRoYXQgb3JkZXI/IFRoZXkgaGF2ZSBubyBvcmRlciwgYmVjYXVzZSB0aGV5IGFyZW4ndCB0YWJiYWxlLi4uXG4gICAgICAgICAgLy8gU3VwcG9ydCBmb3IgcG9zaXRpdmUgdGFiaW5kZXggaXMgYWxyZWFkeSBicm9rZW4gYW5kIGhhcmQgdG8gbWFuYWdlIChwb3NzaWJseVxuICAgICAgICAgIC8vICBub3Qgc3VwcG9ydGFibGUsIFRCRCksIHNvIHRoaXMgaXNuJ3QgZ29pbmcgdG8gbWFrZSB0aGluZ3Mgd29yc2UgdGhhbiB0aGV5XG4gICAgICAgICAgLy8gIGFscmVhZHkgYXJlLCBhbmQgYXQgbGVhc3QgbWFrZXMgdGhpbmdzIGJldHRlciBmb3IgdGhlIG1ham9yaXR5IG9mIGNhc2VzIHdoZXJlXG4gICAgICAgICAgLy8gIHRhYmluZGV4IGlzIGVpdGhlciAwL3Vuc2V0IG9yIG5lZ2F0aXZlLlxuICAgICAgICAgIC8vIEZZSSwgcG9zaXRpdmUgdGFiaW5kZXggaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mb2N1cy10cmFwL2ZvY3VzLXRyYXAvaXNzdWVzLzM3NVxuICAgICAgICAgIHZhciBub2RlSWR4ID0gZm9jdXNhYmxlTm9kZXMuZmluZEluZGV4KGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICByZXR1cm4gbiA9PT0gbm9kZTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChub2RlSWR4IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZm9yd2FyZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZvY3VzYWJsZU5vZGVzLnNsaWNlKG5vZGVJZHggKyAxKS5maW5kKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpc1RhYmJhYmxlKG4sIGNvbmZpZy50YWJiYWJsZU9wdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZvY3VzYWJsZU5vZGVzLnNsaWNlKDAsIG5vZGVJZHgpLnJldmVyc2UoKS5maW5kKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNUYWJiYWJsZShuLCBjb25maWcudGFiYmFibGVPcHRpb25zKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgICBzdGF0ZS50YWJiYWJsZUdyb3VwcyA9IHN0YXRlLmNvbnRhaW5lckdyb3Vwcy5maWx0ZXIoZnVuY3Rpb24gKGdyb3VwKSB7XG4gICAgICByZXR1cm4gZ3JvdXAudGFiYmFibGVOb2Rlcy5sZW5ndGggPiAwO1xuICAgIH0pOyAvLyB0aHJvdyBpZiBubyBncm91cHMgaGF2ZSB0YWJiYWJsZSBub2RlcyBhbmQgd2UgZG9uJ3QgaGF2ZSBhIGZhbGxiYWNrIGZvY3VzIG5vZGUgZWl0aGVyXG5cbiAgICBpZiAoc3RhdGUudGFiYmFibGVHcm91cHMubGVuZ3RoIDw9IDAgJiYgIWdldE5vZGVGb3JPcHRpb24oJ2ZhbGxiYWNrRm9jdXMnKSAvLyByZXR1cm5pbmcgZmFsc2Ugbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBvcHRpb25cbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91ciBmb2N1cy10cmFwIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgY29udGFpbmVyIHdpdGggYXQgbGVhc3Qgb25lIHRhYmJhYmxlIG5vZGUgaW4gaXQgYXQgYWxsIHRpbWVzJyk7XG4gICAgfVxuICB9O1xuXG4gIHZhciB0cnlGb2N1cyA9IGZ1bmN0aW9uIHRyeUZvY3VzKG5vZGUpIHtcbiAgICBpZiAobm9kZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gZG9jLmFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIW5vZGUgfHwgIW5vZGUuZm9jdXMpIHtcbiAgICAgIHRyeUZvY3VzKGdldEluaXRpYWxGb2N1c05vZGUoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5mb2N1cyh7XG4gICAgICBwcmV2ZW50U2Nyb2xsOiAhIWNvbmZpZy5wcmV2ZW50U2Nyb2xsXG4gICAgfSk7XG4gICAgc3RhdGUubW9zdFJlY2VudGx5Rm9jdXNlZE5vZGUgPSBub2RlO1xuXG4gICAgaWYgKGlzU2VsZWN0YWJsZUlucHV0KG5vZGUpKSB7XG4gICAgICBub2RlLnNlbGVjdCgpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgZ2V0UmV0dXJuRm9jdXNOb2RlID0gZnVuY3Rpb24gZ2V0UmV0dXJuRm9jdXNOb2RlKHByZXZpb3VzQWN0aXZlRWxlbWVudCkge1xuICAgIHZhciBub2RlID0gZ2V0Tm9kZUZvck9wdGlvbignc2V0UmV0dXJuRm9jdXMnLCBwcmV2aW91c0FjdGl2ZUVsZW1lbnQpO1xuICAgIHJldHVybiBub2RlID8gbm9kZSA6IG5vZGUgPT09IGZhbHNlID8gZmFsc2UgOiBwcmV2aW91c0FjdGl2ZUVsZW1lbnQ7XG4gIH07IC8vIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBvbiBtb3VzZWRvd24gYW5kIHRvdWNoc3RhcnQgaW5zdGVhZCBvZiBjbGlja1xuICAvLyBzbyB0aGF0IGl0IHByZWNlZGVzIHRoZSBmb2N1cyBldmVudC5cblxuXG4gIHZhciBjaGVja1BvaW50ZXJEb3duID0gZnVuY3Rpb24gY2hlY2tQb2ludGVyRG93bihlKSB7XG4gICAgdmFyIHRhcmdldCA9IGdldEFjdHVhbFRhcmdldChlKTtcblxuICAgIGlmIChmaW5kQ29udGFpbmVySW5kZXgodGFyZ2V0KSA+PSAwKSB7XG4gICAgICAvLyBhbGxvdyB0aGUgY2xpY2sgc2luY2UgaXQgb2N1cnJlZCBpbnNpZGUgdGhlIHRyYXBcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVPckhhbmRsZXIoY29uZmlnLmNsaWNrT3V0c2lkZURlYWN0aXZhdGVzLCBlKSkge1xuICAgICAgLy8gaW1tZWRpYXRlbHkgZGVhY3RpdmF0ZSB0aGUgdHJhcFxuICAgICAgdHJhcC5kZWFjdGl2YXRlKHtcbiAgICAgICAgLy8gaWYsIG9uIGRlYWN0aXZhdGlvbiwgd2Ugc2hvdWxkIHJldHVybiBmb2N1cyB0byB0aGUgbm9kZSBvcmlnaW5hbGx5LWZvY3VzZWRcbiAgICAgICAgLy8gIHdoZW4gdGhlIHRyYXAgd2FzIGFjdGl2YXRlZCAob3IgdGhlIGNvbmZpZ3VyZWQgYHNldFJldHVybkZvY3VzYCBub2RlKSxcbiAgICAgICAgLy8gIHRoZW4gYXNzdW1lIGl0J3MgYWxzbyBPSyB0byByZXR1cm4gZm9jdXMgdG8gdGhlIG91dHNpZGUgbm9kZSB0aGF0IHdhc1xuICAgICAgICAvLyAganVzdCBjbGlja2VkLCBjYXVzaW5nIGRlYWN0aXZhdGlvbiwgYXMgbG9uZyBhcyB0aGF0IG5vZGUgaXMgZm9jdXNhYmxlO1xuICAgICAgICAvLyAgaWYgaXQgaXNuJ3QgZm9jdXNhYmxlLCB0aGVuIHJldHVybiBmb2N1cyB0byB0aGUgb3JpZ2luYWwgbm9kZSBmb2N1c2VkXG4gICAgICAgIC8vICBvbiBhY3RpdmF0aW9uIChvciB0aGUgY29uZmlndXJlZCBgc2V0UmV0dXJuRm9jdXNgIG5vZGUpXG4gICAgICAgIC8vIE5PVEU6IGJ5IHNldHRpbmcgYHJldHVybkZvY3VzOiBmYWxzZWAsIGRlYWN0aXZhdGUoKSB3aWxsIGRvIG5vdGhpbmcsXG4gICAgICAgIC8vICB3aGljaCB3aWxsIHJlc3VsdCBpbiB0aGUgb3V0c2lkZSBjbGljayBzZXR0aW5nIGZvY3VzIHRvIHRoZSBub2RlXG4gICAgICAgIC8vICB0aGF0IHdhcyBjbGlja2VkLCB3aGV0aGVyIGl0J3MgZm9jdXNhYmxlIG9yIG5vdDsgYnkgc2V0dGluZ1xuICAgICAgICAvLyAgYHJldHVybkZvY3VzOiB0cnVlYCwgd2UnbGwgYXR0ZW1wdCB0byByZS1mb2N1cyB0aGUgbm9kZSBvcmlnaW5hbGx5LWZvY3VzZWRcbiAgICAgICAgLy8gIG9uIGFjdGl2YXRpb24gKG9yIHRoZSBjb25maWd1cmVkIGBzZXRSZXR1cm5Gb2N1c2Agbm9kZSlcbiAgICAgICAgcmV0dXJuRm9jdXM6IGNvbmZpZy5yZXR1cm5Gb2N1c09uRGVhY3RpdmF0ZSAmJiAhaXNGb2N1c2FibGUodGFyZ2V0LCBjb25maWcudGFiYmFibGVPcHRpb25zKVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgbW9iaWxlIGRldmljZXMuXG4gICAgLy8gKElmIHdlJ2xsIG9ubHkgbGV0IGBjbGlja2AgZXZlbnRzIHRocm91Z2gsXG4gICAgLy8gdGhlbiBvbiBtb2JpbGUgdGhleSB3aWxsIGJlIGJsb2NrZWQgYW55d2F5cyBpZiBgdG91Y2hzdGFydGAgaXMgYmxvY2tlZC4pXG5cblxuICAgIGlmICh2YWx1ZU9ySGFuZGxlcihjb25maWcuYWxsb3dPdXRzaWRlQ2xpY2ssIGUpKSB7XG4gICAgICAvLyBhbGxvdyB0aGUgY2xpY2sgb3V0c2lkZSB0aGUgdHJhcCB0byB0YWtlIHBsYWNlXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBvdGhlcndpc2UsIHByZXZlbnQgdGhlIGNsaWNrXG5cblxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfTsgLy8gSW4gY2FzZSBmb2N1cyBlc2NhcGVzIHRoZSB0cmFwIGZvciBzb21lIHN0cmFuZ2UgcmVhc29uLCBwdWxsIGl0IGJhY2sgaW4uXG5cblxuICB2YXIgY2hlY2tGb2N1c0luID0gZnVuY3Rpb24gY2hlY2tGb2N1c0luKGUpIHtcbiAgICB2YXIgdGFyZ2V0ID0gZ2V0QWN0dWFsVGFyZ2V0KGUpO1xuICAgIHZhciB0YXJnZXRDb250YWluZWQgPSBmaW5kQ29udGFpbmVySW5kZXgodGFyZ2V0KSA+PSAwOyAvLyBJbiBGaXJlZm94IHdoZW4geW91IFRhYiBvdXQgb2YgYW4gaWZyYW1lIHRoZSBEb2N1bWVudCBpcyBicmllZmx5IGZvY3VzZWQuXG5cbiAgICBpZiAodGFyZ2V0Q29udGFpbmVkIHx8IHRhcmdldCBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgICBpZiAodGFyZ2V0Q29udGFpbmVkKSB7XG4gICAgICAgIHN0YXRlLm1vc3RSZWNlbnRseUZvY3VzZWROb2RlID0gdGFyZ2V0O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlc2NhcGVkISBwdWxsIGl0IGJhY2sgaW4gdG8gd2hlcmUgaXQganVzdCBsZWZ0XG4gICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgdHJ5Rm9jdXMoc3RhdGUubW9zdFJlY2VudGx5Rm9jdXNlZE5vZGUgfHwgZ2V0SW5pdGlhbEZvY3VzTm9kZSgpKTtcbiAgICB9XG4gIH07IC8vIEhpamFjayBUYWIgZXZlbnRzIG9uIHRoZSBmaXJzdCBhbmQgbGFzdCBmb2N1c2FibGUgbm9kZXMgb2YgdGhlIHRyYXAsXG4gIC8vIGluIG9yZGVyIHRvIHByZXZlbnQgZm9jdXMgZnJvbSBlc2NhcGluZy4gSWYgaXQgZXNjYXBlcyBmb3IgZXZlbiBhXG4gIC8vIG1vbWVudCBpdCBjYW4gZW5kIHVwIHNjcm9sbGluZyB0aGUgcGFnZSBhbmQgY2F1c2luZyBjb25mdXNpb24gc28gd2VcbiAgLy8ga2luZCBvZiBuZWVkIHRvIGNhcHR1cmUgdGhlIGFjdGlvbiBhdCB0aGUga2V5ZG93biBwaGFzZS5cblxuXG4gIHZhciBjaGVja1RhYiA9IGZ1bmN0aW9uIGNoZWNrVGFiKGUpIHtcbiAgICB2YXIgdGFyZ2V0ID0gZ2V0QWN0dWFsVGFyZ2V0KGUpO1xuICAgIHVwZGF0ZVRhYmJhYmxlTm9kZXMoKTtcbiAgICB2YXIgZGVzdGluYXRpb25Ob2RlID0gbnVsbDtcblxuICAgIGlmIChzdGF0ZS50YWJiYWJsZUdyb3Vwcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBtYWtlIHN1cmUgdGhlIHRhcmdldCBpcyBhY3R1YWxseSBjb250YWluZWQgaW4gYSBncm91cFxuICAgICAgLy8gTk9URTogdGhlIHRhcmdldCBtYXkgYWxzbyBiZSB0aGUgY29udGFpbmVyIGl0c2VsZiBpZiBpdCdzIGZvY3VzYWJsZVxuICAgICAgLy8gIHdpdGggdGFiSW5kZXg9Jy0xJyBhbmQgd2FzIGdpdmVuIGluaXRpYWwgZm9jdXNcbiAgICAgIHZhciBjb250YWluZXJJbmRleCA9IGZpbmRDb250YWluZXJJbmRleCh0YXJnZXQpO1xuICAgICAgdmFyIGNvbnRhaW5lckdyb3VwID0gY29udGFpbmVySW5kZXggPj0gMCA/IHN0YXRlLmNvbnRhaW5lckdyb3Vwc1tjb250YWluZXJJbmRleF0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChjb250YWluZXJJbmRleCA8IDApIHtcbiAgICAgICAgLy8gdGFyZ2V0IG5vdCBmb3VuZCBpbiBhbnkgZ3JvdXA6IHF1aXRlIHBvc3NpYmxlIGZvY3VzIGhhcyBlc2NhcGVkIHRoZSB0cmFwLFxuICAgICAgICAvLyAgc28gYnJpbmcgaXQgYmFjayBpbiB0by4uLlxuICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAgIC8vIC4uLnRoZSBsYXN0IG5vZGUgaW4gdGhlIGxhc3QgZ3JvdXBcbiAgICAgICAgICBkZXN0aW5hdGlvbk5vZGUgPSBzdGF0ZS50YWJiYWJsZUdyb3Vwc1tzdGF0ZS50YWJiYWJsZUdyb3Vwcy5sZW5ndGggLSAxXS5sYXN0VGFiYmFibGVOb2RlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIC4uLnRoZSBmaXJzdCBub2RlIGluIHRoZSBmaXJzdCBncm91cFxuICAgICAgICAgIGRlc3RpbmF0aW9uTm9kZSA9IHN0YXRlLnRhYmJhYmxlR3JvdXBzWzBdLmZpcnN0VGFiYmFibGVOb2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgLy8gUkVWRVJTRVxuICAgICAgICAvLyBpcyB0aGUgdGFyZ2V0IHRoZSBmaXJzdCB0YWJiYWJsZSBub2RlIGluIGEgZ3JvdXA/XG4gICAgICAgIHZhciBzdGFydE9mR3JvdXBJbmRleCA9IGZpbmRJbmRleChzdGF0ZS50YWJiYWJsZUdyb3VwcywgZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgICAgdmFyIGZpcnN0VGFiYmFibGVOb2RlID0gX3JlZjIuZmlyc3RUYWJiYWJsZU5vZGU7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldCA9PT0gZmlyc3RUYWJiYWJsZU5vZGU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChzdGFydE9mR3JvdXBJbmRleCA8IDAgJiYgKGNvbnRhaW5lckdyb3VwLmNvbnRhaW5lciA9PT0gdGFyZ2V0IHx8IGlzRm9jdXNhYmxlKHRhcmdldCwgY29uZmlnLnRhYmJhYmxlT3B0aW9ucykgJiYgIWlzVGFiYmFibGUodGFyZ2V0LCBjb25maWcudGFiYmFibGVPcHRpb25zKSAmJiAhY29udGFpbmVyR3JvdXAubmV4dFRhYmJhYmxlTm9kZSh0YXJnZXQsIGZhbHNlKSkpIHtcbiAgICAgICAgICAvLyBhbiBleGNlcHRpb24gY2FzZSB3aGVyZSB0aGUgdGFyZ2V0IGlzIGVpdGhlciB0aGUgY29udGFpbmVyIGl0c2VsZiwgb3JcbiAgICAgICAgICAvLyAgYSBub24tdGFiYmFibGUgbm9kZSB0aGF0IHdhcyBnaXZlbiBmb2N1cyAoaS5lLiB0YWJpbmRleCBpcyBuZWdhdGl2ZVxuICAgICAgICAgIC8vICBhbmQgdXNlciBjbGlja2VkIG9uIGl0IG9yIG5vZGUgd2FzIHByb2dyYW1tYXRpY2FsbHkgZ2l2ZW4gZm9jdXMpXG4gICAgICAgICAgLy8gIGFuZCBpcyBub3QgZm9sbG93ZWQgYnkgYW55IG90aGVyIHRhYmJhYmxlIG5vZGUsIGluIHdoaWNoXG4gICAgICAgICAgLy8gIGNhc2UsIHdlIHNob3VsZCBoYW5kbGUgc2hpZnQrdGFiIGFzIGlmIGZvY3VzIHdlcmUgb24gdGhlIGNvbnRhaW5lcidzXG4gICAgICAgICAgLy8gIGZpcnN0IHRhYmJhYmxlIG5vZGUsIGFuZCBnbyB0byB0aGUgbGFzdCB0YWJiYWJsZSBub2RlIG9mIHRoZSBMQVNUIGdyb3VwXG4gICAgICAgICAgc3RhcnRPZkdyb3VwSW5kZXggPSBjb250YWluZXJJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGFydE9mR3JvdXBJbmRleCA+PSAwKSB7XG4gICAgICAgICAgLy8gWUVTOiB0aGVuIHNoaWZ0K3RhYiBzaG91bGQgZ28gdG8gdGhlIGxhc3QgdGFiYmFibGUgbm9kZSBpbiB0aGVcbiAgICAgICAgICAvLyAgcHJldmlvdXMgZ3JvdXAgKGFuZCB3cmFwIGFyb3VuZCB0byB0aGUgbGFzdCB0YWJiYWJsZSBub2RlIG9mXG4gICAgICAgICAgLy8gIHRoZSBMQVNUIGdyb3VwIGlmIGl0J3MgdGhlIGZpcnN0IHRhYmJhYmxlIG5vZGUgb2YgdGhlIEZJUlNUIGdyb3VwKVxuICAgICAgICAgIHZhciBkZXN0aW5hdGlvbkdyb3VwSW5kZXggPSBzdGFydE9mR3JvdXBJbmRleCA9PT0gMCA/IHN0YXRlLnRhYmJhYmxlR3JvdXBzLmxlbmd0aCAtIDEgOiBzdGFydE9mR3JvdXBJbmRleCAtIDE7XG4gICAgICAgICAgdmFyIGRlc3RpbmF0aW9uR3JvdXAgPSBzdGF0ZS50YWJiYWJsZUdyb3Vwc1tkZXN0aW5hdGlvbkdyb3VwSW5kZXhdO1xuICAgICAgICAgIGRlc3RpbmF0aW9uTm9kZSA9IGRlc3RpbmF0aW9uR3JvdXAubGFzdFRhYmJhYmxlTm9kZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRk9SV0FSRFxuICAgICAgICAvLyBpcyB0aGUgdGFyZ2V0IHRoZSBsYXN0IHRhYmJhYmxlIG5vZGUgaW4gYSBncm91cD9cbiAgICAgICAgdmFyIGxhc3RPZkdyb3VwSW5kZXggPSBmaW5kSW5kZXgoc3RhdGUudGFiYmFibGVHcm91cHMsIGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICAgIHZhciBsYXN0VGFiYmFibGVOb2RlID0gX3JlZjMubGFzdFRhYmJhYmxlTm9kZTtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0ID09PSBsYXN0VGFiYmFibGVOb2RlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAobGFzdE9mR3JvdXBJbmRleCA8IDAgJiYgKGNvbnRhaW5lckdyb3VwLmNvbnRhaW5lciA9PT0gdGFyZ2V0IHx8IGlzRm9jdXNhYmxlKHRhcmdldCwgY29uZmlnLnRhYmJhYmxlT3B0aW9ucykgJiYgIWlzVGFiYmFibGUodGFyZ2V0LCBjb25maWcudGFiYmFibGVPcHRpb25zKSAmJiAhY29udGFpbmVyR3JvdXAubmV4dFRhYmJhYmxlTm9kZSh0YXJnZXQpKSkge1xuICAgICAgICAgIC8vIGFuIGV4Y2VwdGlvbiBjYXNlIHdoZXJlIHRoZSB0YXJnZXQgaXMgdGhlIGNvbnRhaW5lciBpdHNlbGYsIG9yXG4gICAgICAgICAgLy8gIGEgbm9uLXRhYmJhYmxlIG5vZGUgdGhhdCB3YXMgZ2l2ZW4gZm9jdXMgKGkuZS4gdGFiaW5kZXggaXMgbmVnYXRpdmVcbiAgICAgICAgICAvLyAgYW5kIHVzZXIgY2xpY2tlZCBvbiBpdCBvciBub2RlIHdhcyBwcm9ncmFtbWF0aWNhbGx5IGdpdmVuIGZvY3VzKVxuICAgICAgICAgIC8vICBhbmQgaXMgbm90IGZvbGxvd2VkIGJ5IGFueSBvdGhlciB0YWJiYWJsZSBub2RlLCBpbiB3aGljaFxuICAgICAgICAgIC8vICBjYXNlLCB3ZSBzaG91bGQgaGFuZGxlIHRhYiBhcyBpZiBmb2N1cyB3ZXJlIG9uIHRoZSBjb250YWluZXInc1xuICAgICAgICAgIC8vICBsYXN0IHRhYmJhYmxlIG5vZGUsIGFuZCBnbyB0byB0aGUgZmlyc3QgdGFiYmFibGUgbm9kZSBvZiB0aGUgRklSU1QgZ3JvdXBcbiAgICAgICAgICBsYXN0T2ZHcm91cEluZGV4ID0gY29udGFpbmVySW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGFzdE9mR3JvdXBJbmRleCA+PSAwKSB7XG4gICAgICAgICAgLy8gWUVTOiB0aGVuIHRhYiBzaG91bGQgZ28gdG8gdGhlIGZpcnN0IHRhYmJhYmxlIG5vZGUgaW4gdGhlIG5leHRcbiAgICAgICAgICAvLyAgZ3JvdXAgKGFuZCB3cmFwIGFyb3VuZCB0byB0aGUgZmlyc3QgdGFiYmFibGUgbm9kZSBvZiB0aGUgRklSU1RcbiAgICAgICAgICAvLyAgZ3JvdXAgaWYgaXQncyB0aGUgbGFzdCB0YWJiYWJsZSBub2RlIG9mIHRoZSBMQVNUIGdyb3VwKVxuICAgICAgICAgIHZhciBfZGVzdGluYXRpb25Hcm91cEluZGV4ID0gbGFzdE9mR3JvdXBJbmRleCA9PT0gc3RhdGUudGFiYmFibGVHcm91cHMubGVuZ3RoIC0gMSA/IDAgOiBsYXN0T2ZHcm91cEluZGV4ICsgMTtcblxuICAgICAgICAgIHZhciBfZGVzdGluYXRpb25Hcm91cCA9IHN0YXRlLnRhYmJhYmxlR3JvdXBzW19kZXN0aW5hdGlvbkdyb3VwSW5kZXhdO1xuICAgICAgICAgIGRlc3RpbmF0aW9uTm9kZSA9IF9kZXN0aW5hdGlvbkdyb3VwLmZpcnN0VGFiYmFibGVOb2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5PVEU6IHRoZSBmYWxsYmFja0ZvY3VzIG9wdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHJldHVybmluZyBmYWxzZSB0byBvcHQtb3V0XG4gICAgICBkZXN0aW5hdGlvbk5vZGUgPSBnZXROb2RlRm9yT3B0aW9uKCdmYWxsYmFja0ZvY3VzJyk7XG4gICAgfVxuXG4gICAgaWYgKGRlc3RpbmF0aW9uTm9kZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdHJ5Rm9jdXMoZGVzdGluYXRpb25Ob2RlKTtcbiAgICB9IC8vIGVsc2UsIGxldCB0aGUgYnJvd3NlciB0YWtlIGNhcmUgb2YgW3NoaWZ0K110YWIgYW5kIG1vdmUgdGhlIGZvY3VzXG5cbiAgfTtcblxuICB2YXIgY2hlY2tLZXkgPSBmdW5jdGlvbiBjaGVja0tleShlKSB7XG4gICAgaWYgKGlzRXNjYXBlRXZlbnQoZSkgJiYgdmFsdWVPckhhbmRsZXIoY29uZmlnLmVzY2FwZURlYWN0aXZhdGVzLCBlKSAhPT0gZmFsc2UpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRyYXAuZGVhY3RpdmF0ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc1RhYkV2ZW50KGUpKSB7XG4gICAgICBjaGVja1RhYihlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGNoZWNrQ2xpY2sgPSBmdW5jdGlvbiBjaGVja0NsaWNrKGUpIHtcbiAgICB2YXIgdGFyZ2V0ID0gZ2V0QWN0dWFsVGFyZ2V0KGUpO1xuXG4gICAgaWYgKGZpbmRDb250YWluZXJJbmRleCh0YXJnZXQpID49IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVPckhhbmRsZXIoY29uZmlnLmNsaWNrT3V0c2lkZURlYWN0aXZhdGVzLCBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZU9ySGFuZGxlcihjb25maWcuYWxsb3dPdXRzaWRlQ2xpY2ssIGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIH07IC8vXG4gIC8vIEVWRU5UIExJU1RFTkVSU1xuICAvL1xuXG5cbiAgdmFyIGFkZExpc3RlbmVycyA9IGZ1bmN0aW9uIGFkZExpc3RlbmVycygpIHtcbiAgICBpZiAoIXN0YXRlLmFjdGl2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gVGhlcmUgY2FuIGJlIG9ubHkgb25lIGxpc3RlbmluZyBmb2N1cyB0cmFwIGF0IGEgdGltZVxuXG5cbiAgICBhY3RpdmVGb2N1c1RyYXBzLmFjdGl2YXRlVHJhcCh0cmFwKTsgLy8gRGVsYXkgZW5zdXJlcyB0aGF0IHRoZSBmb2N1c2VkIGVsZW1lbnQgZG9lc24ndCBjYXB0dXJlIHRoZSBldmVudFxuICAgIC8vIHRoYXQgY2F1c2VkIHRoZSBmb2N1cyB0cmFwIGFjdGl2YXRpb24uXG5cbiAgICBzdGF0ZS5kZWxheUluaXRpYWxGb2N1c1RpbWVyID0gY29uZmlnLmRlbGF5SW5pdGlhbEZvY3VzID8gZGVsYXkoZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5Rm9jdXMoZ2V0SW5pdGlhbEZvY3VzTm9kZSgpKTtcbiAgICB9KSA6IHRyeUZvY3VzKGdldEluaXRpYWxGb2N1c05vZGUoKSk7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBjaGVja0ZvY3VzSW4sIHRydWUpO1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBjaGVja1BvaW50ZXJEb3duLCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICB9KTtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGNoZWNrUG9pbnRlckRvd24sIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNoZWNrQ2xpY2ssIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgY2hlY2tLZXksIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiB0cmFwO1xuICB9O1xuXG4gIHZhciByZW1vdmVMaXN0ZW5lcnMgPSBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIGNoZWNrRm9jdXNJbiwgdHJ1ZSk7XG4gICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGNoZWNrUG9pbnRlckRvd24sIHRydWUpO1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgY2hlY2tQb2ludGVyRG93biwgdHJ1ZSk7XG4gICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2hlY2tDbGljaywgdHJ1ZSk7XG4gICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBjaGVja0tleSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHRyYXA7XG4gIH07IC8vXG4gIC8vIFRSQVAgREVGSU5JVElPTlxuICAvL1xuXG5cbiAgdHJhcCA9IHtcbiAgICBnZXQgYWN0aXZlKCkge1xuICAgICAgcmV0dXJuIHN0YXRlLmFjdGl2ZTtcbiAgICB9LFxuXG4gICAgZ2V0IHBhdXNlZCgpIHtcbiAgICAgIHJldHVybiBzdGF0ZS5wYXVzZWQ7XG4gICAgfSxcblxuICAgIGFjdGl2YXRlOiBmdW5jdGlvbiBhY3RpdmF0ZShhY3RpdmF0ZU9wdGlvbnMpIHtcbiAgICAgIGlmIChzdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIHZhciBvbkFjdGl2YXRlID0gZ2V0T3B0aW9uKGFjdGl2YXRlT3B0aW9ucywgJ29uQWN0aXZhdGUnKTtcbiAgICAgIHZhciBvblBvc3RBY3RpdmF0ZSA9IGdldE9wdGlvbihhY3RpdmF0ZU9wdGlvbnMsICdvblBvc3RBY3RpdmF0ZScpO1xuICAgICAgdmFyIGNoZWNrQ2FuRm9jdXNUcmFwID0gZ2V0T3B0aW9uKGFjdGl2YXRlT3B0aW9ucywgJ2NoZWNrQ2FuRm9jdXNUcmFwJyk7XG5cbiAgICAgIGlmICghY2hlY2tDYW5Gb2N1c1RyYXApIHtcbiAgICAgICAgdXBkYXRlVGFiYmFibGVOb2RlcygpO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgc3RhdGUucGF1c2VkID0gZmFsc2U7XG4gICAgICBzdGF0ZS5ub2RlRm9jdXNlZEJlZm9yZUFjdGl2YXRpb24gPSBkb2MuYWN0aXZlRWxlbWVudDtcblxuICAgICAgaWYgKG9uQWN0aXZhdGUpIHtcbiAgICAgICAgb25BY3RpdmF0ZSgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZmluaXNoQWN0aXZhdGlvbiA9IGZ1bmN0aW9uIGZpbmlzaEFjdGl2YXRpb24oKSB7XG4gICAgICAgIGlmIChjaGVja0NhbkZvY3VzVHJhcCkge1xuICAgICAgICAgIHVwZGF0ZVRhYmJhYmxlTm9kZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZExpc3RlbmVycygpO1xuXG4gICAgICAgIGlmIChvblBvc3RBY3RpdmF0ZSkge1xuICAgICAgICAgIG9uUG9zdEFjdGl2YXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChjaGVja0NhbkZvY3VzVHJhcCkge1xuICAgICAgICBjaGVja0NhbkZvY3VzVHJhcChzdGF0ZS5jb250YWluZXJzLmNvbmNhdCgpKS50aGVuKGZpbmlzaEFjdGl2YXRpb24sIGZpbmlzaEFjdGl2YXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgZmluaXNoQWN0aXZhdGlvbigpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBkZWFjdGl2YXRlOiBmdW5jdGlvbiBkZWFjdGl2YXRlKGRlYWN0aXZhdGVPcHRpb25zKSB7XG4gICAgICBpZiAoIXN0YXRlLmFjdGl2ZSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIG9wdGlvbnMgPSBfb2JqZWN0U3ByZWFkMih7XG4gICAgICAgIG9uRGVhY3RpdmF0ZTogY29uZmlnLm9uRGVhY3RpdmF0ZSxcbiAgICAgICAgb25Qb3N0RGVhY3RpdmF0ZTogY29uZmlnLm9uUG9zdERlYWN0aXZhdGUsXG4gICAgICAgIGNoZWNrQ2FuUmV0dXJuRm9jdXM6IGNvbmZpZy5jaGVja0NhblJldHVybkZvY3VzXG4gICAgICB9LCBkZWFjdGl2YXRlT3B0aW9ucyk7XG5cbiAgICAgIGNsZWFyVGltZW91dChzdGF0ZS5kZWxheUluaXRpYWxGb2N1c1RpbWVyKTsgLy8gbm9vcCBpZiB1bmRlZmluZWRcblxuICAgICAgc3RhdGUuZGVsYXlJbml0aWFsRm9jdXNUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgIHJlbW92ZUxpc3RlbmVycygpO1xuICAgICAgc3RhdGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICBzdGF0ZS5wYXVzZWQgPSBmYWxzZTtcbiAgICAgIGFjdGl2ZUZvY3VzVHJhcHMuZGVhY3RpdmF0ZVRyYXAodHJhcCk7XG4gICAgICB2YXIgb25EZWFjdGl2YXRlID0gZ2V0T3B0aW9uKG9wdGlvbnMsICdvbkRlYWN0aXZhdGUnKTtcbiAgICAgIHZhciBvblBvc3REZWFjdGl2YXRlID0gZ2V0T3B0aW9uKG9wdGlvbnMsICdvblBvc3REZWFjdGl2YXRlJyk7XG4gICAgICB2YXIgY2hlY2tDYW5SZXR1cm5Gb2N1cyA9IGdldE9wdGlvbihvcHRpb25zLCAnY2hlY2tDYW5SZXR1cm5Gb2N1cycpO1xuICAgICAgdmFyIHJldHVybkZvY3VzID0gZ2V0T3B0aW9uKG9wdGlvbnMsICdyZXR1cm5Gb2N1cycsICdyZXR1cm5Gb2N1c09uRGVhY3RpdmF0ZScpO1xuXG4gICAgICBpZiAob25EZWFjdGl2YXRlKSB7XG4gICAgICAgIG9uRGVhY3RpdmF0ZSgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZmluaXNoRGVhY3RpdmF0aW9uID0gZnVuY3Rpb24gZmluaXNoRGVhY3RpdmF0aW9uKCkge1xuICAgICAgICBkZWxheShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHJldHVybkZvY3VzKSB7XG4gICAgICAgICAgICB0cnlGb2N1cyhnZXRSZXR1cm5Gb2N1c05vZGUoc3RhdGUubm9kZUZvY3VzZWRCZWZvcmVBY3RpdmF0aW9uKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG9uUG9zdERlYWN0aXZhdGUpIHtcbiAgICAgICAgICAgIG9uUG9zdERlYWN0aXZhdGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgaWYgKHJldHVybkZvY3VzICYmIGNoZWNrQ2FuUmV0dXJuRm9jdXMpIHtcbiAgICAgICAgY2hlY2tDYW5SZXR1cm5Gb2N1cyhnZXRSZXR1cm5Gb2N1c05vZGUoc3RhdGUubm9kZUZvY3VzZWRCZWZvcmVBY3RpdmF0aW9uKSkudGhlbihmaW5pc2hEZWFjdGl2YXRpb24sIGZpbmlzaERlYWN0aXZhdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBmaW5pc2hEZWFjdGl2YXRpb24oKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgcGF1c2U6IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgICAgaWYgKHN0YXRlLnBhdXNlZCB8fCAhc3RhdGUuYWN0aXZlKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5wYXVzZWQgPSB0cnVlO1xuICAgICAgcmVtb3ZlTGlzdGVuZXJzKCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIHVucGF1c2U6IGZ1bmN0aW9uIHVucGF1c2UoKSB7XG4gICAgICBpZiAoIXN0YXRlLnBhdXNlZCB8fCAhc3RhdGUuYWN0aXZlKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5wYXVzZWQgPSBmYWxzZTtcbiAgICAgIHVwZGF0ZVRhYmJhYmxlTm9kZXMoKTtcbiAgICAgIGFkZExpc3RlbmVycygpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICB1cGRhdGVDb250YWluZXJFbGVtZW50czogZnVuY3Rpb24gdXBkYXRlQ29udGFpbmVyRWxlbWVudHMoY29udGFpbmVyRWxlbWVudHMpIHtcbiAgICAgIHZhciBlbGVtZW50c0FzQXJyYXkgPSBbXS5jb25jYXQoY29udGFpbmVyRWxlbWVudHMpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgIHN0YXRlLmNvbnRhaW5lcnMgPSBlbGVtZW50c0FzQXJyYXkubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycgPyBkb2MucXVlcnlTZWxlY3RvcihlbGVtZW50KSA6IGVsZW1lbnQ7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHN0YXRlLmFjdGl2ZSkge1xuICAgICAgICB1cGRhdGVUYWJiYWJsZU5vZGVzKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfTsgLy8gaW5pdGlhbGl6ZSBjb250YWluZXIgZWxlbWVudHNcblxuICB0cmFwLnVwZGF0ZUNvbnRhaW5lckVsZW1lbnRzKGVsZW1lbnRzKTtcbiAgcmV0dXJuIHRyYXA7XG59O1xuXG5leHBvcnQgeyBjcmVhdGVGb2N1c1RyYXAgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZvY3VzLXRyYXAuZXNtLmpzLm1hcFxuIiwiJ3VzZSBzdHJpY3QnOyhmdW5jdGlvbigpeyhmdW5jdGlvbigpe2Z1bmN0aW9uIGUoYSl7Zm9yKHZhciBiPVthXTthPWEucGFyZW50Tm9kZXx8YS5ob3N0fHxhLmRlZmF1bHRWaWV3OyliLnB1c2goYSk7cmV0dXJuIGJ9ZnVuY3Rpb24gZihhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBiLmdldEF0dHJpYnV0ZT9iLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpfHxcIlwiOnZvaWQgMDtcInVuZGVmaW5lZFwiIT09dHlwZW9mIGMmJi0xPT09Yy5pbmRleE9mKGEpJiZiLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsYy5jb25jYXQoXCIgXCIsYSkudHJpbSgpKX19ZnVuY3Rpb24gZyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBiLmdldEF0dHJpYnV0ZT9iLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpfHxcIlwiOnZvaWQgMDtpZihjKXt2YXIgZD1jLmluZGV4T2YoYSk7MDw9ZCYmKDA9PT1kfHwwPD1oLmluZGV4T2YoYy5jaGFyQXQoZC0xKSkpJiZcbihjPWMucmVwbGFjZShhLFwiXCIpLnRyaW0oKSxcIlwiPT09Yz9iLnJlbW92ZUF0dHJpYnV0ZShcImNsYXNzXCIpOmIuc2V0QXR0cmlidXRlKFwiY2xhc3NcIixjKSl9fX1mdW5jdGlvbiBrKCl7dmFyIGE9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYygpe2I9ITE7XCJibHVyXCI9PT1hLnR5cGUmJkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUoYS50YXJnZXQpKS5mb3JFYWNoKGcoXCJmb2N1cy13aXRoaW5cIikpO1wiZm9jdXNcIj09PWEudHlwZSYmQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZShhLnRhcmdldCkpLmZvckVhY2goZihcImZvY3VzLXdpdGhpblwiKSl9aWYoIWIpe3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYyk7dmFyIGI9ITB9fTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIixhLCEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLGEsITApO2YoXCJqcy1mb2N1cy13aXRoaW5cIikoZG9jdW1lbnQuYm9keSk7cmV0dXJuITB9dmFyIGg9W1wiXFxuXCIsXCJcXHRcIixcIiBcIixcblwiXFxyXCJdO3RyeXtyZXR1cm5cInVuZGVmaW5lZFwiIT09dHlwZW9mIHdpbmRvdyYmIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCI6Zm9jdXMtd2l0aGluXCIpfWNhdGNoKGEpe3JldHVybiBrKCl9fSkoKX0pKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb2N1cy13aXRoaW4tcG9seWZpbGwuanMubWFwXG4iLCI7KGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIEZvdW5kYXRpb24ubGlicy5kcm9wZG93biA9IHtcbiAgICBuYW1lIDogJ2Ryb3Bkb3duJyxcblxuICAgIHZlcnNpb24gOiAnNS41LjMnLFxuXG4gICAgc2V0dGluZ3MgOiB7XG4gICAgICBhY3RpdmVfY2xhc3MgOiAnb3BlbicsXG4gICAgICBkaXNhYmxlZF9jbGFzcyA6ICdkaXNhYmxlZCcsXG4gICAgICBtZWdhX2NsYXNzIDogJ21lZ2EnLFxuICAgICAgYWxpZ24gOiAnYm90dG9tJyxcbiAgICAgIGlzX2hvdmVyIDogZmFsc2UsXG4gICAgICBob3Zlcl90aW1lb3V0IDogMTUwLFxuICAgICAgb3BlbmVkIDogZnVuY3Rpb24gKCkge30sXG4gICAgICBjbG9zZWQgOiBmdW5jdGlvbiAoKSB7fVxuICAgIH0sXG5cbiAgICBpbml0IDogZnVuY3Rpb24gKHNjb3BlLCBtZXRob2QsIG9wdGlvbnMpIHtcbiAgICAgIEZvdW5kYXRpb24uaW5oZXJpdCh0aGlzLCAndGhyb3R0bGUnKTtcblxuICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcy5zZXR0aW5ncywgbWV0aG9kLCBvcHRpb25zKTtcbiAgICAgIHRoaXMuYmluZGluZ3MobWV0aG9kLCBvcHRpb25zKTtcbiAgICB9LFxuXG4gICAgZXZlbnRzIDogZnVuY3Rpb24gKHNjb3BlKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgICAgUyA9IHNlbGYuUztcblxuICAgICAgUyh0aGlzLnNjb3BlKVxuICAgICAgICAub2ZmKCcuZHJvcGRvd24nKVxuICAgICAgICAub24oJ2NsaWNrLmZuZHRuLmRyb3Bkb3duJywgJ1snICsgdGhpcy5hdHRyX25hbWUoKSArICddJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICB2YXIgc2V0dGluZ3MgPSBTKHRoaXMpLmRhdGEoc2VsZi5hdHRyX25hbWUodHJ1ZSkgKyAnLWluaXQnKSB8fCBzZWxmLnNldHRpbmdzO1xuICAgICAgICAgIGlmICghc2V0dGluZ3MuaXNfaG92ZXIgfHwgTW9kZXJuaXpyLnRvdWNoKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBpZiAoUyh0aGlzKS5wYXJlbnQoJ1tkYXRhLXJldmVhbC1pZF0nKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGYudG9nZ2xlKCQodGhpcykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdtb3VzZWVudGVyLmZuZHRuLmRyb3Bkb3duJywgJ1snICsgdGhpcy5hdHRyX25hbWUoKSArICddLCBbJyArIHRoaXMuYXR0cl9uYW1lKCkgKyAnLWNvbnRlbnRdJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICB2YXIgJHRoaXMgPSBTKHRoaXMpLFxuICAgICAgICAgICAgICBkcm9wZG93bixcbiAgICAgICAgICAgICAgdGFyZ2V0O1xuXG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHNlbGYudGltZW91dCk7XG5cbiAgICAgICAgICBpZiAoJHRoaXMuZGF0YShzZWxmLmRhdGFfYXR0cigpKSkge1xuICAgICAgICAgICAgZHJvcGRvd24gPSBTKCcjJyArICR0aGlzLmRhdGEoc2VsZi5kYXRhX2F0dHIoKSkpO1xuICAgICAgICAgICAgdGFyZ2V0ID0gJHRoaXM7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRyb3Bkb3duID0gJHRoaXM7XG4gICAgICAgICAgICB0YXJnZXQgPSBTKCdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnPVwiJyArIGRyb3Bkb3duLmF0dHIoJ2lkJykgKyAnXCJdJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHNldHRpbmdzID0gdGFyZ2V0LmRhdGEoc2VsZi5hdHRyX25hbWUodHJ1ZSkgKyAnLWluaXQnKSB8fCBzZWxmLnNldHRpbmdzO1xuXG4gICAgICAgICAgaWYgKFMoZS5jdXJyZW50VGFyZ2V0KS5kYXRhKHNlbGYuZGF0YV9hdHRyKCkpICYmIHNldHRpbmdzLmlzX2hvdmVyKSB7XG4gICAgICAgICAgICBzZWxmLmNsb3NlYWxsLmNhbGwoc2VsZik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNldHRpbmdzLmlzX2hvdmVyKSB7XG4gICAgICAgICAgICBzZWxmLm9wZW4uYXBwbHkoc2VsZiwgW2Ryb3Bkb3duLCB0YXJnZXRdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignbW91c2VsZWF2ZS5mbmR0bi5kcm9wZG93bicsICdbJyArIHRoaXMuYXR0cl9uYW1lKCkgKyAnXSwgWycgKyB0aGlzLmF0dHJfbmFtZSgpICsgJy1jb250ZW50XScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgdmFyICR0aGlzID0gUyh0aGlzKTtcbiAgICAgICAgICB2YXIgc2V0dGluZ3M7XG5cbiAgICAgICAgICBpZiAoJHRoaXMuZGF0YShzZWxmLmRhdGFfYXR0cigpKSkge1xuICAgICAgICAgICAgICBzZXR0aW5ncyA9ICR0aGlzLmRhdGEoc2VsZi5kYXRhX2F0dHIodHJ1ZSkgKyAnLWluaXQnKSB8fCBzZWxmLnNldHRpbmdzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciB0YXJnZXQgICA9IFMoJ1snICsgc2VsZi5hdHRyX25hbWUoKSArICc9XCInICsgUyh0aGlzKS5hdHRyKCdpZCcpICsgJ1wiXScpLFxuICAgICAgICAgICAgICAgICAgc2V0dGluZ3MgPSB0YXJnZXQuZGF0YShzZWxmLmF0dHJfbmFtZSh0cnVlKSArICctaW5pdCcpIHx8IHNlbGYuc2V0dGluZ3M7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoJHRoaXMuZGF0YShzZWxmLmRhdGFfYXR0cigpKSkge1xuICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuaXNfaG92ZXIpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmNsb3NlLmNhbGwoc2VsZiwgUygnIycgKyAkdGhpcy5kYXRhKHNlbGYuZGF0YV9hdHRyKCkpKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5pc19ob3Zlcikge1xuICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UuY2FsbChzZWxmLCAkdGhpcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LmJpbmQodGhpcyksIHNldHRpbmdzLmhvdmVyX3RpbWVvdXQpO1xuICAgICAgICB9KVxuICAgICAgICAub24oJ2NsaWNrLmZuZHRuLmRyb3Bkb3duJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICB2YXIgcGFyZW50ID0gUyhlLnRhcmdldCkuY2xvc2VzdCgnWycgKyBzZWxmLmF0dHJfbmFtZSgpICsgJy1jb250ZW50XScpO1xuICAgICAgICAgIHZhciBsaW5rcyAgPSBwYXJlbnQuZmluZCgnYScpO1xuXG4gICAgICAgICAgaWYgKGxpbmtzLmxlbmd0aCA+IDAgJiYgcGFyZW50LmF0dHIoJ2FyaWEtYXV0b2Nsb3NlJykgIT09ICdmYWxzZScpIHtcbiAgICAgICAgICAgICAgc2VsZi5jbG9zZS5jYWxsKHNlbGYsIFMoJ1snICsgc2VsZi5hdHRyX25hbWUoKSArICctY29udGVudF0nKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGUudGFyZ2V0ICE9PSBkb2N1bWVudCAmJiAhJC5jb250YWlucyhkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGUudGFyZ2V0KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChTKGUudGFyZ2V0KS5jbG9zZXN0KCdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnXScpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIShTKGUudGFyZ2V0KS5kYXRhKCdyZXZlYWxJZCcpKSAmJlxuICAgICAgICAgICAgKHBhcmVudC5sZW5ndGggPiAwICYmIChTKGUudGFyZ2V0KS5pcygnWycgKyBzZWxmLmF0dHJfbmFtZSgpICsgJy1jb250ZW50XScpIHx8XG4gICAgICAgICAgICAgICQuY29udGFpbnMocGFyZW50LmZpcnN0KClbMF0sIGUudGFyZ2V0KSkpKSB7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlbGYuY2xvc2UuY2FsbChzZWxmLCBTKCdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnLWNvbnRlbnRdJykpO1xuICAgICAgICB9KVxuICAgICAgICAub24oJ29wZW5lZC5mbmR0bi5kcm9wZG93bicsICdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnLWNvbnRlbnRdJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNlbGYuc2V0dGluZ3Mub3BlbmVkLmNhbGwodGhpcyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignY2xvc2VkLmZuZHRuLmRyb3Bkb3duJywgJ1snICsgc2VsZi5hdHRyX25hbWUoKSArICctY29udGVudF0nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2VsZi5zZXR0aW5ncy5jbG9zZWQuY2FsbCh0aGlzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIFMod2luZG93KVxuICAgICAgICAub2ZmKCcuZHJvcGRvd24nKVxuICAgICAgICAub24oJ3Jlc2l6ZS5mbmR0bi5kcm9wZG93bicsIHNlbGYudGhyb3R0bGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNlbGYucmVzaXplLmNhbGwoc2VsZik7XG4gICAgICAgIH0sIDUwKSk7XG5cbiAgICAgIHRoaXMucmVzaXplKCk7XG4gICAgfSxcblxuICAgIGNsb3NlIDogZnVuY3Rpb24gKGRyb3Bkb3duKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICBkcm9wZG93bi5lYWNoKGZ1bmN0aW9uIChpZHgpIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsX3RhcmdldCA9ICQoJ1snICsgc2VsZi5hdHRyX25hbWUoKSArICc9JyArIGRyb3Bkb3duW2lkeF0uaWQgKyAnXScpIHx8ICQoJ2FyaWEtY29udHJvbHM9JyArIGRyb3Bkb3duW2lkeF0uaWQgKyAnXScpO1xuICAgICAgICBvcmlnaW5hbF90YXJnZXQuYXR0cignYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuICAgICAgICBpZiAoc2VsZi5TKHRoaXMpLmhhc0NsYXNzKHNlbGYuc2V0dGluZ3MuYWN0aXZlX2NsYXNzKSkge1xuICAgICAgICAgIHNlbGYuUyh0aGlzKVxuICAgICAgICAgICAgLmNzcyhGb3VuZGF0aW9uLnJ0bCA/ICdyaWdodCcgOiAnbGVmdCcsICctOTk5OTlweCcpXG4gICAgICAgICAgICAuYXR0cignYXJpYS1oaWRkZW4nLCAndHJ1ZScpXG4gICAgICAgICAgICAucmVtb3ZlQ2xhc3Moc2VsZi5zZXR0aW5ncy5hY3RpdmVfY2xhc3MpXG4gICAgICAgICAgICAucHJldignWycgKyBzZWxmLmF0dHJfbmFtZSgpICsgJ10nKVxuICAgICAgICAgICAgLnJlbW92ZUNsYXNzKHNlbGYuc2V0dGluZ3MuYWN0aXZlX2NsYXNzKVxuICAgICAgICAgICAgLnJlbW92ZURhdGEoJ3RhcmdldCcpO1xuXG4gICAgICAgICAgc2VsZi5TKHRoaXMpLnRyaWdnZXIoJ2Nsb3NlZC5mbmR0bi5kcm9wZG93bicsIFtkcm9wZG93bl0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGRyb3Bkb3duLnJlbW92ZUNsYXNzKCdmLW9wZW4tJyArIHRoaXMuYXR0cl9uYW1lKHRydWUpKTtcbiAgICB9LFxuXG4gICAgY2xvc2VhbGwgOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAkLmVhY2goc2VsZi5TKCcuZi1vcGVuLScgKyB0aGlzLmF0dHJfbmFtZSh0cnVlKSksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5jbG9zZS5jYWxsKHNlbGYsIHNlbGYuUyh0aGlzKSk7XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgb3BlbiA6IGZ1bmN0aW9uIChkcm9wZG93biwgdGFyZ2V0KSB7XG4gICAgICB0aGlzXG4gICAgICAgIC5jc3MoZHJvcGRvd25cbiAgICAgICAgLmFkZENsYXNzKHRoaXMuc2V0dGluZ3MuYWN0aXZlX2NsYXNzKSwgdGFyZ2V0KTtcbiAgICAgIGRyb3Bkb3duLnByZXYoJ1snICsgdGhpcy5hdHRyX25hbWUoKSArICddJykuYWRkQ2xhc3ModGhpcy5zZXR0aW5ncy5hY3RpdmVfY2xhc3MpO1xuICAgICAgZHJvcGRvd24uZGF0YSgndGFyZ2V0JywgdGFyZ2V0LmdldCgwKSkudHJpZ2dlcignb3BlbmVkLmZuZHRuLmRyb3Bkb3duJywgW2Ryb3Bkb3duLCB0YXJnZXRdKTtcbiAgICAgIGRyb3Bkb3duLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7XG4gICAgICB0YXJnZXQuYXR0cignYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG4gICAgICBkcm9wZG93bi5mb2N1cygpO1xuICAgICAgZHJvcGRvd24uYWRkQ2xhc3MoJ2Ytb3Blbi0nICsgdGhpcy5hdHRyX25hbWUodHJ1ZSkpO1xuICAgIH0sXG5cbiAgICBkYXRhX2F0dHIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAodGhpcy5uYW1lc3BhY2UubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2UgKyAnLScgKyB0aGlzLm5hbWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfSxcblxuICAgIHRvZ2dsZSA6IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgIGlmICh0YXJnZXQuaGFzQ2xhc3ModGhpcy5zZXR0aW5ncy5kaXNhYmxlZF9jbGFzcykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGRyb3Bkb3duID0gdGhpcy5TKCcjJyArIHRhcmdldC5kYXRhKHRoaXMuZGF0YV9hdHRyKCkpKTtcbiAgICAgIGlmIChkcm9wZG93bi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gTm8gZHJvcGRvd24gZm91bmQsIG5vdCBjb250aW51aW5nXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jbG9zZS5jYWxsKHRoaXMsIHRoaXMuUygnWycgKyB0aGlzLmF0dHJfbmFtZSgpICsgJy1jb250ZW50XScpLm5vdChkcm9wZG93bikpO1xuXG4gICAgICBpZiAoZHJvcGRvd24uaGFzQ2xhc3ModGhpcy5zZXR0aW5ncy5hY3RpdmVfY2xhc3MpKSB7XG4gICAgICAgIHRoaXMuY2xvc2UuY2FsbCh0aGlzLCBkcm9wZG93bik7XG4gICAgICAgIGlmIChkcm9wZG93bi5kYXRhKCd0YXJnZXQnKSAhPT0gdGFyZ2V0LmdldCgwKSkge1xuICAgICAgICAgIHRoaXMub3Blbi5jYWxsKHRoaXMsIGRyb3Bkb3duLCB0YXJnZXQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9wZW4uY2FsbCh0aGlzLCBkcm9wZG93biwgdGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVzaXplIDogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGRyb3Bkb3duID0gdGhpcy5TKCdbJyArIHRoaXMuYXR0cl9uYW1lKCkgKyAnLWNvbnRlbnRdLm9wZW4nKTtcbiAgICAgIHZhciB0YXJnZXQgPSAkKGRyb3Bkb3duLmRhdGEoXCJ0YXJnZXRcIikpO1xuXG4gICAgICBpZiAoZHJvcGRvd24ubGVuZ3RoICYmIHRhcmdldC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5jc3MoZHJvcGRvd24sIHRhcmdldCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGNzcyA6IGZ1bmN0aW9uIChkcm9wZG93biwgdGFyZ2V0KSB7XG4gICAgICB2YXIgbGVmdF9vZmZzZXQgPSBNYXRoLm1heCgodGFyZ2V0LndpZHRoKCkgLSBkcm9wZG93bi53aWR0aCgpKSAvIDIsIDgpLFxuICAgICAgICAgIHNldHRpbmdzID0gdGFyZ2V0LmRhdGEodGhpcy5hdHRyX25hbWUodHJ1ZSkgKyAnLWluaXQnKSB8fCB0aGlzLnNldHRpbmdzLFxuICAgICAgICAgIHBhcmVudE92ZXJmbG93ID0gZHJvcGRvd24ucGFyZW50KCkuY3NzKCdvdmVyZmxvdy15JykgfHwgZHJvcGRvd24ucGFyZW50KCkuY3NzKCdvdmVyZmxvdycpO1xuXG4gICAgICB0aGlzLmNsZWFyX2lkeCgpO1xuXG5cblxuICAgICAgaWYgKHRoaXMuc21hbGwoKSkge1xuICAgICAgICB2YXIgcCA9IHRoaXMuZGlycy5ib3R0b20uY2FsbChkcm9wZG93biwgdGFyZ2V0LCBzZXR0aW5ncyk7XG5cbiAgICAgICAgZHJvcGRvd24uYXR0cignc3R5bGUnLCAnJykucmVtb3ZlQ2xhc3MoJ2Ryb3AtbGVmdCBkcm9wLXJpZ2h0IGRyb3AtdG9wJykuY3NzKHtcbiAgICAgICAgICBwb3NpdGlvbiA6ICdhYnNvbHV0ZScsXG4gICAgICAgICAgd2lkdGggOiAnOTUlJyxcbiAgICAgICAgICAnbWF4LXdpZHRoJyA6ICdub25lJyxcbiAgICAgICAgICB0b3AgOiBwLnRvcFxuICAgICAgICB9KTtcblxuICAgICAgICBkcm9wZG93bi5jc3MoRm91bmRhdGlvbi5ydGwgPyAncmlnaHQnIDogJ2xlZnQnLCBsZWZ0X29mZnNldCk7XG4gICAgICB9XG4gICAgICAvLyBkZXRlY3QgaWYgZHJvcGRvd24gaXMgaW4gYW4gb3ZlcmZsb3cgY29udGFpbmVyXG4gICAgICBlbHNlIGlmIChwYXJlbnRPdmVyZmxvdyAhPT0gJ3Zpc2libGUnKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0YXJnZXRbMF0ub2Zmc2V0VG9wICsgdGFyZ2V0WzBdLm9mZnNldEhlaWdodDtcblxuICAgICAgICBkcm9wZG93bi5hdHRyKCdzdHlsZScsICcnKS5jc3Moe1xuICAgICAgICAgIHBvc2l0aW9uIDogJ2Fic29sdXRlJyxcbiAgICAgICAgICB0b3AgOiBvZmZzZXRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZHJvcGRvd24uY3NzKEZvdW5kYXRpb24ucnRsID8gJ3JpZ2h0JyA6ICdsZWZ0JywgbGVmdF9vZmZzZXQpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG5cbiAgICAgICAgdGhpcy5zdHlsZShkcm9wZG93biwgdGFyZ2V0LCBzZXR0aW5ncyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkcm9wZG93bjtcbiAgICB9LFxuXG4gICAgc3R5bGUgOiBmdW5jdGlvbiAoZHJvcGRvd24sIHRhcmdldCwgc2V0dGluZ3MpIHtcbiAgICAgIHZhciBjc3MgPSAkLmV4dGVuZCh7cG9zaXRpb24gOiAnYWJzb2x1dGUnfSxcbiAgICAgICAgdGhpcy5kaXJzW3NldHRpbmdzLmFsaWduXS5jYWxsKGRyb3Bkb3duLCB0YXJnZXQsIHNldHRpbmdzKSk7XG5cbiAgICAgIGRyb3Bkb3duLmF0dHIoJ3N0eWxlJywgJycpLmNzcyhjc3MpO1xuICAgIH0sXG5cbiAgICAvLyByZXR1cm4gQ1NTIHByb3BlcnR5IG9iamVjdFxuICAgIC8vIGB0aGlzYCBpcyB0aGUgZHJvcGRvd25cbiAgICBkaXJzIDoge1xuICAgICAgLy8gQ2FsY3VsYXRlIHRhcmdldCBvZmZzZXRcbiAgICAgIF9iYXNlIDogZnVuY3Rpb24gKHQsIHMpIHtcbiAgICAgICAgdmFyIG9fcCA9IHRoaXMub2Zmc2V0UGFyZW50KCksXG4gICAgICAgICAgICBvID0gb19wLm9mZnNldCgpLFxuICAgICAgICAgICAgcCA9IHQub2Zmc2V0KCk7XG5cbiAgICAgICAgcC50b3AgLT0gby50b3A7XG4gICAgICAgIHAubGVmdCAtPSBvLmxlZnQ7XG5cbiAgICAgICAgLy9zZXQgc29tZSBmbGFncyBvbiB0aGUgcCBvYmplY3QgdG8gcGFzcyBhbG9uZ1xuICAgICAgICBwLm1pc3NSaWdodCA9IGZhbHNlO1xuICAgICAgICBwLm1pc3NUb3AgPSBmYWxzZTtcbiAgICAgICAgcC5taXNzTGVmdCA9IGZhbHNlO1xuICAgICAgICBwLmxlZnRSaWdodEZsYWcgPSBmYWxzZTtcblxuICAgICAgICAvL2xldHMgc2VlIGlmIHRoZSBwYW5lbCB3aWxsIGJlIG9mZiB0aGUgc2NyZWVuXG4gICAgICAgIC8vZ2V0IHRoZSBhY3R1YWwgd2lkdGggb2YgdGhlIHBhZ2UgYW5kIHN0b3JlIGl0XG4gICAgICAgIHZhciBhY3R1YWxCb2R5V2lkdGg7XG4gICAgICAgIHZhciB3aW5kb3dXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgICBcbiAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3JvdycpWzBdKSB7XG4gICAgICAgICAgYWN0dWFsQm9keVdpZHRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncm93JylbMF0uY2xpZW50V2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWN0dWFsQm9keVdpZHRoID0gd2luZG93V2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYWN0dWFsTWFyZ2luV2lkdGggPSAod2luZG93V2lkdGggLSBhY3R1YWxCb2R5V2lkdGgpIC8gMjtcbiAgICAgICAgdmFyIGFjdHVhbEJvdW5kYXJ5ID0gYWN0dWFsQm9keVdpZHRoO1xuXG4gICAgICAgIGlmICghdGhpcy5oYXNDbGFzcygnbWVnYScpICYmICFzLmlnbm9yZV9yZXBvc2l0aW9uaW5nKSB7XG4gICAgICAgICAgdmFyIG91dGVyV2lkdGggPSB0aGlzLm91dGVyV2lkdGgoKTtcbiAgICAgICAgICB2YXIgb19sZWZ0ID0gdC5vZmZzZXQoKS5sZWZ0O1xuXHRcdCAgXG4gICAgICAgICAgLy9taXNzIHRvcFxuICAgICAgICAgIGlmICh0Lm9mZnNldCgpLnRvcCA8PSB0aGlzLm91dGVySGVpZ2h0KCkpIHtcbiAgICAgICAgICAgIHAubWlzc1RvcCA9IHRydWU7XG4gICAgICAgICAgICBhY3R1YWxCb3VuZGFyeSA9IHdpbmRvd1dpZHRoIC0gYWN0dWFsTWFyZ2luV2lkdGg7XG4gICAgICAgICAgICBwLmxlZnRSaWdodEZsYWcgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vbWlzcyByaWdodFxuICAgICAgICAgIGlmIChvX2xlZnQgKyBvdXRlcldpZHRoID4gb19sZWZ0ICsgYWN0dWFsTWFyZ2luV2lkdGggJiYgb19sZWZ0IC0gYWN0dWFsTWFyZ2luV2lkdGggPiBvdXRlcldpZHRoKSB7XG4gICAgICAgICAgICBwLm1pc3NSaWdodCA9IHRydWU7XG4gICAgICAgICAgICBwLm1pc3NMZWZ0ID0gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy9taXNzIGxlZnRcbiAgICAgICAgICBpZiAob19sZWZ0IC0gb3V0ZXJXaWR0aCA8PSAwKSB7XG4gICAgICAgICAgICBwLm1pc3NMZWZ0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHAubWlzc1JpZ2h0ID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHA7XG4gICAgICB9LFxuXG4gICAgICB0b3AgOiBmdW5jdGlvbiAodCwgcykge1xuICAgICAgICB2YXIgc2VsZiA9IEZvdW5kYXRpb24ubGlicy5kcm9wZG93bixcbiAgICAgICAgICAgIHAgPSBzZWxmLmRpcnMuX2Jhc2UuY2FsbCh0aGlzLCB0LCBzKTtcblxuICAgICAgICB0aGlzLmFkZENsYXNzKCdkcm9wLXRvcCcpO1xuXG4gICAgICAgIGlmIChwLm1pc3NUb3AgPT0gdHJ1ZSkge1xuICAgICAgICAgIHAudG9wID0gcC50b3AgKyB0Lm91dGVySGVpZ2h0KCkgKyB0aGlzLm91dGVySGVpZ2h0KCk7XG4gICAgICAgICAgdGhpcy5yZW1vdmVDbGFzcygnZHJvcC10b3AnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwLm1pc3NSaWdodCA9PSB0cnVlKSB7XG4gICAgICAgICAgcC5sZWZ0ID0gcC5sZWZ0IC0gdGhpcy5vdXRlcldpZHRoKCkgKyB0Lm91dGVyV2lkdGgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0Lm91dGVyV2lkdGgoKSA8IHRoaXMub3V0ZXJXaWR0aCgpIHx8IHNlbGYuc21hbGwoKSB8fCB0aGlzLmhhc0NsYXNzKHMubWVnYV9tZW51KSkge1xuICAgICAgICAgIHNlbGYuYWRqdXN0X3BpcCh0aGlzLCB0LCBzLCBwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChGb3VuZGF0aW9uLnJ0bCkge1xuICAgICAgICAgIHJldHVybiB7bGVmdCA6IHAubGVmdCAtIHRoaXMub3V0ZXJXaWR0aCgpICsgdC5vdXRlcldpZHRoKCksXG4gICAgICAgICAgICB0b3AgOiBwLnRvcCAtIHRoaXMub3V0ZXJIZWlnaHQoKX07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge2xlZnQgOiBwLmxlZnQsIHRvcCA6IHAudG9wIC0gdGhpcy5vdXRlckhlaWdodCgpfTtcbiAgICAgIH0sXG5cbiAgICAgIGJvdHRvbSA6IGZ1bmN0aW9uICh0LCBzKSB7XG4gICAgICAgIHZhciBzZWxmID0gRm91bmRhdGlvbi5saWJzLmRyb3Bkb3duLFxuICAgICAgICAgICAgcCA9IHNlbGYuZGlycy5fYmFzZS5jYWxsKHRoaXMsIHQsIHMpO1xuXG4gICAgICAgIGlmIChwLm1pc3NSaWdodCA9PSB0cnVlKSB7XG4gICAgICAgICAgcC5sZWZ0ID0gcC5sZWZ0IC0gdGhpcy5vdXRlcldpZHRoKCkgKyB0Lm91dGVyV2lkdGgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0Lm91dGVyV2lkdGgoKSA8IHRoaXMub3V0ZXJXaWR0aCgpIHx8IHNlbGYuc21hbGwoKSB8fCB0aGlzLmhhc0NsYXNzKHMubWVnYV9tZW51KSkge1xuICAgICAgICAgIHNlbGYuYWRqdXN0X3BpcCh0aGlzLCB0LCBzLCBwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxmLnJ0bCkge1xuICAgICAgICAgIHJldHVybiB7bGVmdCA6IHAubGVmdCAtIHRoaXMub3V0ZXJXaWR0aCgpICsgdC5vdXRlcldpZHRoKCksIHRvcCA6IHAudG9wICsgdC5vdXRlckhlaWdodCgpfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7bGVmdCA6IHAubGVmdCwgdG9wIDogcC50b3AgKyB0Lm91dGVySGVpZ2h0KCl9O1xuICAgICAgfSxcblxuICAgICAgbGVmdCA6IGZ1bmN0aW9uICh0LCBzKSB7XG4gICAgICAgIHZhciBwID0gRm91bmRhdGlvbi5saWJzLmRyb3Bkb3duLmRpcnMuX2Jhc2UuY2FsbCh0aGlzLCB0LCBzKTtcblxuICAgICAgICB0aGlzLmFkZENsYXNzKCdkcm9wLWxlZnQnKTtcblxuICAgICAgICBpZiAocC5taXNzTGVmdCA9PSB0cnVlKSB7XG4gICAgICAgICAgcC5sZWZ0ID0gIHAubGVmdCArIHRoaXMub3V0ZXJXaWR0aCgpO1xuICAgICAgICAgIHAudG9wID0gcC50b3AgKyB0Lm91dGVySGVpZ2h0KCk7XG4gICAgICAgICAgdGhpcy5yZW1vdmVDbGFzcygnZHJvcC1sZWZ0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge2xlZnQgOiBwLmxlZnQgLSB0aGlzLm91dGVyV2lkdGgoKSwgdG9wIDogcC50b3B9O1xuICAgICAgfSxcblxuICAgICAgcmlnaHQgOiBmdW5jdGlvbiAodCwgcykge1xuICAgICAgICB2YXIgcCA9IEZvdW5kYXRpb24ubGlicy5kcm9wZG93bi5kaXJzLl9iYXNlLmNhbGwodGhpcywgdCwgcyk7XG5cbiAgICAgICAgdGhpcy5hZGRDbGFzcygnZHJvcC1yaWdodCcpO1xuXG4gICAgICAgIGlmIChwLm1pc3NSaWdodCA9PSB0cnVlKSB7XG4gICAgICAgICAgcC5sZWZ0ID0gcC5sZWZ0IC0gdGhpcy5vdXRlcldpZHRoKCk7XG4gICAgICAgICAgcC50b3AgPSBwLnRvcCArIHQub3V0ZXJIZWlnaHQoKTtcbiAgICAgICAgICB0aGlzLnJlbW92ZUNsYXNzKCdkcm9wLXJpZ2h0Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcC50cmlnZ2VyZWRSaWdodCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2VsZiA9IEZvdW5kYXRpb24ubGlicy5kcm9wZG93bjtcblxuICAgICAgICBpZiAodC5vdXRlcldpZHRoKCkgPCB0aGlzLm91dGVyV2lkdGgoKSB8fCBzZWxmLnNtYWxsKCkgfHwgdGhpcy5oYXNDbGFzcyhzLm1lZ2FfbWVudSkpIHtcbiAgICAgICAgICBzZWxmLmFkanVzdF9waXAodGhpcywgdCwgcywgcCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge2xlZnQgOiBwLmxlZnQgKyB0Lm91dGVyV2lkdGgoKSwgdG9wIDogcC50b3B9O1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBJbnNlcnQgcnVsZSB0byBzdHlsZSBwc3VlZG8gZWxlbWVudHNcbiAgICBhZGp1c3RfcGlwIDogZnVuY3Rpb24gKGRyb3Bkb3duLCB0YXJnZXQsIHNldHRpbmdzLCBwb3NpdGlvbikge1xuICAgICAgdmFyIHNoZWV0ID0gRm91bmRhdGlvbi5zdHlsZXNoZWV0LFxuICAgICAgICAgIHBpcF9vZmZzZXRfYmFzZSA9IDg7XG5cbiAgICAgIGlmIChkcm9wZG93bi5oYXNDbGFzcyhzZXR0aW5ncy5tZWdhX2NsYXNzKSkge1xuICAgICAgICBwaXBfb2Zmc2V0X2Jhc2UgPSBwb3NpdGlvbi5sZWZ0ICsgKHRhcmdldC5vdXRlcldpZHRoKCkgLyAyKSAtIDg7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc21hbGwoKSkge1xuICAgICAgICBwaXBfb2Zmc2V0X2Jhc2UgKz0gcG9zaXRpb24ubGVmdCAtIDg7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucnVsZV9pZHggPSBzaGVldC5jc3NSdWxlcy5sZW5ndGg7XG5cbiAgICAgIC8vZGVmYXVsdFxuICAgICAgdmFyIHNlbF9iZWZvcmUgPSAnLmYtZHJvcGRvd24ub3BlbjpiZWZvcmUnLFxuICAgICAgICAgIHNlbF9hZnRlciAgPSAnLmYtZHJvcGRvd24ub3BlbjphZnRlcicsXG4gICAgICAgICAgY3NzX2JlZm9yZSA9ICdsZWZ0OiAnICsgcGlwX29mZnNldF9iYXNlICsgJ3B4OycsXG4gICAgICAgICAgY3NzX2FmdGVyICA9ICdsZWZ0OiAnICsgKHBpcF9vZmZzZXRfYmFzZSAtIDEpICsgJ3B4Oyc7XG5cbiAgICAgIGlmIChwb3NpdGlvbi5taXNzUmlnaHQgPT0gdHJ1ZSkge1xuICAgICAgICBwaXBfb2Zmc2V0X2Jhc2UgPSBkcm9wZG93bi5vdXRlcldpZHRoKCkgLSAyMztcbiAgICAgICAgc2VsX2JlZm9yZSA9ICcuZi1kcm9wZG93bi5vcGVuOmJlZm9yZScsXG4gICAgICAgIHNlbF9hZnRlciAgPSAnLmYtZHJvcGRvd24ub3BlbjphZnRlcicsXG4gICAgICAgIGNzc19iZWZvcmUgPSAnbGVmdDogJyArIHBpcF9vZmZzZXRfYmFzZSArICdweDsnLFxuICAgICAgICBjc3NfYWZ0ZXIgID0gJ2xlZnQ6ICcgKyAocGlwX29mZnNldF9iYXNlIC0gMSkgKyAncHg7JztcbiAgICAgIH1cblxuICAgICAgLy9qdXN0IGEgY2FzZSB3aGVyZSByaWdodCBpcyBmaXJlZCwgYnV0IGl0cyBub3QgbWlzc2luZyByaWdodFxuICAgICAgaWYgKHBvc2l0aW9uLnRyaWdnZXJlZFJpZ2h0ID09IHRydWUpIHtcbiAgICAgICAgc2VsX2JlZm9yZSA9ICcuZi1kcm9wZG93bi5vcGVuOmJlZm9yZScsXG4gICAgICAgIHNlbF9hZnRlciAgPSAnLmYtZHJvcGRvd24ub3BlbjphZnRlcicsXG4gICAgICAgIGNzc19iZWZvcmUgPSAnbGVmdDotMTJweDsnLFxuICAgICAgICBjc3NfYWZ0ZXIgID0gJ2xlZnQ6LTE0cHg7JztcbiAgICAgIH1cblxuICAgICAgaWYgKHNoZWV0Lmluc2VydFJ1bGUpIHtcbiAgICAgICAgc2hlZXQuaW5zZXJ0UnVsZShbc2VsX2JlZm9yZSwgJ3snLCBjc3NfYmVmb3JlLCAnfSddLmpvaW4oJyAnKSwgdGhpcy5ydWxlX2lkeCk7XG4gICAgICAgIHNoZWV0Lmluc2VydFJ1bGUoW3NlbF9hZnRlciwgJ3snLCBjc3NfYWZ0ZXIsICd9J10uam9pbignICcpLCB0aGlzLnJ1bGVfaWR4ICsgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaGVldC5hZGRSdWxlKHNlbF9iZWZvcmUsIGNzc19iZWZvcmUsIHRoaXMucnVsZV9pZHgpO1xuICAgICAgICBzaGVldC5hZGRSdWxlKHNlbF9hZnRlciwgY3NzX2FmdGVyLCB0aGlzLnJ1bGVfaWR4ICsgMSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIFJlbW92ZSBvbGQgZHJvcGRvd24gcnVsZSBpbmRleFxuICAgIGNsZWFyX2lkeCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzaGVldCA9IEZvdW5kYXRpb24uc3R5bGVzaGVldDtcblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLnJ1bGVfaWR4ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzaGVldC5kZWxldGVSdWxlKHRoaXMucnVsZV9pZHgpO1xuICAgICAgICBzaGVldC5kZWxldGVSdWxlKHRoaXMucnVsZV9pZHgpO1xuICAgICAgICBkZWxldGUgdGhpcy5ydWxlX2lkeDtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc21hbGwgOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbWF0Y2hNZWRpYShGb3VuZGF0aW9uLm1lZGlhX3F1ZXJpZXMuc21hbGwpLm1hdGNoZXMgJiZcbiAgICAgICAgIW1hdGNoTWVkaWEoRm91bmRhdGlvbi5tZWRpYV9xdWVyaWVzLm1lZGl1bSkubWF0Y2hlcztcbiAgICB9LFxuXG4gICAgb2ZmIDogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5TKHRoaXMuc2NvcGUpLm9mZignLmZuZHRuLmRyb3Bkb3duJyk7XG4gICAgICB0aGlzLlMoJ2h0bWwsIGJvZHknKS5vZmYoJy5mbmR0bi5kcm9wZG93bicpO1xuICAgICAgdGhpcy5TKHdpbmRvdykub2ZmKCcuZm5kdG4uZHJvcGRvd24nKTtcbiAgICAgIHRoaXMuUygnW2RhdGEtZHJvcGRvd24tY29udGVudF0nKS5vZmYoJy5mbmR0bi5kcm9wZG93bicpO1xuICAgIH0sXG5cbiAgICByZWZsb3cgOiBmdW5jdGlvbiAoKSB7fVxuICB9O1xufShqUXVlcnksIHdpbmRvdywgd2luZG93LmRvY3VtZW50KSk7XG4iLCIvKlxuICogRm91bmRhdGlvbiBSZXNwb25zaXZlIExpYnJhcnlcbiAqIGh0dHA6Ly9mb3VuZGF0aW9uLnp1cmIuY29tXG4gKiBDb3B5cmlnaHQgMjAxNSwgWlVSQlxuICogRnJlZSB0byB1c2UgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiovXG5cbihmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgaGVhZGVyX2hlbHBlcnMgPSBmdW5jdGlvbiAoY2xhc3NfYXJyYXkpIHtcbiAgICB2YXIgaGVhZCA9ICQoJ2hlYWQnKTtcbiAgICBoZWFkLnByZXBlbmQoJC5tYXAoY2xhc3NfYXJyYXksIGZ1bmN0aW9uIChjbGFzc19uYW1lKSB7XG4gICAgICBpZiAoaGVhZC5oYXMoJy4nICsgY2xhc3NfbmFtZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAnPG1ldGEgY2xhc3M9XCInICsgY2xhc3NfbmFtZSArICdcIiAvPic7XG4gICAgICB9XG4gICAgfSkpO1xuICB9O1xuXG4gIGhlYWRlcl9oZWxwZXJzKFtcbiAgICAnZm91bmRhdGlvbi1tcS1zbWFsbCcsXG4gICAgJ2ZvdW5kYXRpb24tbXEtc21hbGwtb25seScsXG4gICAgJ2ZvdW5kYXRpb24tbXEtbWVkaXVtJyxcbiAgICAnZm91bmRhdGlvbi1tcS1tZWRpdW0tb25seScsXG4gICAgJ2ZvdW5kYXRpb24tbXEtbGFyZ2UnLFxuICAgICdmb3VuZGF0aW9uLW1xLWxhcmdlLW9ubHknLFxuICAgICdmb3VuZGF0aW9uLW1xLXhsYXJnZScsXG4gICAgJ2ZvdW5kYXRpb24tbXEteGxhcmdlLW9ubHknLFxuICAgICdmb3VuZGF0aW9uLW1xLXh4bGFyZ2UnLFxuICAgICdmb3VuZGF0aW9uLWRhdGEtYXR0cmlidXRlLW5hbWVzcGFjZSddKTtcblxuICAvLyBFbmFibGUgRmFzdENsaWNrIGlmIHByZXNlbnRcblxuICAkKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIEZhc3RDbGljayAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIERvbid0IGF0dGFjaCB0byBib2R5IGlmIHVuZGVmaW5lZFxuICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudC5ib2R5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBGYXN0Q2xpY2suYXR0YWNoKGRvY3VtZW50LmJvZHkpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gcHJpdmF0ZSBGYXN0IFNlbGVjdG9yIHdyYXBwZXIsXG4gIC8vIHJldHVybnMgalF1ZXJ5IG9iamVjdC4gT25seSB1c2Ugd2hlcmVcbiAgLy8gZ2V0RWxlbWVudEJ5SWQgaXMgbm90IGF2YWlsYWJsZS5cbiAgdmFyIFMgPSBmdW5jdGlvbiAoc2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICBpZiAodHlwZW9mIHNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGNvbnQ7XG4gICAgICAgIGlmIChjb250ZXh0LmpxdWVyeSkge1xuICAgICAgICAgIGNvbnQgPSBjb250ZXh0WzBdO1xuICAgICAgICAgIGlmICghY29udCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnQgPSBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAkKGNvbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICQoc2VsZWN0b3IsIGNvbnRleHQpO1xuICB9O1xuXG4gIC8vIE5hbWVzcGFjZSBmdW5jdGlvbnMuXG5cbiAgdmFyIGF0dHJfbmFtZSA9IGZ1bmN0aW9uIChpbml0KSB7XG4gICAgdmFyIGFyciA9IFtdO1xuICAgIGlmICghaW5pdCkge1xuICAgICAgYXJyLnB1c2goJ2RhdGEnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubmFtZXNwYWNlLmxlbmd0aCA+IDApIHtcbiAgICAgIGFyci5wdXNoKHRoaXMubmFtZXNwYWNlKTtcbiAgICB9XG4gICAgYXJyLnB1c2godGhpcy5uYW1lKTtcblxuICAgIHJldHVybiBhcnIuam9pbignLScpO1xuICB9O1xuXG4gIHZhciBhZGRfbmFtZXNwYWNlID0gZnVuY3Rpb24gKHN0cikge1xuICAgIHZhciBwYXJ0cyA9IHN0ci5zcGxpdCgnLScpLFxuICAgICAgICBpID0gcGFydHMubGVuZ3RoLFxuICAgICAgICBhcnIgPSBbXTtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGlmIChpICE9PSAwKSB7XG4gICAgICAgIGFyci5wdXNoKHBhcnRzW2ldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLm5hbWVzcGFjZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXJyLnB1c2godGhpcy5uYW1lc3BhY2UsIHBhcnRzW2ldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhcnIucHVzaChwYXJ0c1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYXJyLnJldmVyc2UoKS5qb2luKCctJyk7XG4gIH07XG5cbiAgLy8gRXZlbnQgYmluZGluZyBhbmQgZGF0YS1vcHRpb25zIHVwZGF0aW5nLlxuXG4gIHZhciBiaW5kaW5ncyA9IGZ1bmN0aW9uIChtZXRob2QsIG9wdGlvbnMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGJpbmQgPSBmdW5jdGlvbigpe1xuICAgICAgICAgIHZhciAkdGhpcyA9IFModGhpcyksXG4gICAgICAgICAgICAgIHNob3VsZF9iaW5kX2V2ZW50cyA9ICEkdGhpcy5kYXRhKHNlbGYuYXR0cl9uYW1lKHRydWUpICsgJy1pbml0Jyk7XG4gICAgICAgICAgJHRoaXMuZGF0YShzZWxmLmF0dHJfbmFtZSh0cnVlKSArICctaW5pdCcsICQuZXh0ZW5kKHt9LCBzZWxmLnNldHRpbmdzLCAob3B0aW9ucyB8fCBtZXRob2QpLCBzZWxmLmRhdGFfb3B0aW9ucygkdGhpcykpKTtcblxuICAgICAgICAgIGlmIChzaG91bGRfYmluZF9ldmVudHMpIHtcbiAgICAgICAgICAgIHNlbGYuZXZlbnRzKHRoaXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgIGlmIChTKHRoaXMuc2NvcGUpLmlzKCdbJyArIHRoaXMuYXR0cl9uYW1lKCkgKyddJykpIHtcbiAgICAgIGJpbmQuY2FsbCh0aGlzLnNjb3BlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUygnWycgKyB0aGlzLmF0dHJfbmFtZSgpICsnXScsIHRoaXMuc2NvcGUpLmVhY2goYmluZCk7XG4gICAgfVxuICAgIC8vICMgUGF0Y2ggdG8gZml4ICM1MDQzIHRvIG1vdmUgdGhpcyAqYWZ0ZXIqIHRoZSBpZi9lbHNlIGNsYXVzZSBpbiBvcmRlciBmb3IgQmFja2JvbmUgYW5kIHNpbWlsYXIgZnJhbWV3b3JrcyB0byBoYXZlIGltcHJvdmVkIGNvbnRyb2wgb3ZlciBldmVudCBiaW5kaW5nIGFuZCBkYXRhLW9wdGlvbnMgdXBkYXRpbmcuXG4gICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpc1ttZXRob2RdLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuXG4gIH07XG5cbiAgdmFyIHNpbmdsZV9pbWFnZV9sb2FkZWQgPSBmdW5jdGlvbiAoaW1hZ2UsIGNhbGxiYWNrKSB7XG4gICAgZnVuY3Rpb24gbG9hZGVkICgpIHtcbiAgICAgIGNhbGxiYWNrKGltYWdlWzBdKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBiaW5kTG9hZCAoKSB7XG4gICAgICB0aGlzLm9uZSgnbG9hZCcsIGxvYWRlZCk7XG5cbiAgICAgIGlmICgvTVNJRSAoXFxkK1xcLlxcZCspOy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkge1xuICAgICAgICB2YXIgc3JjID0gdGhpcy5hdHRyKCAnc3JjJyApLFxuICAgICAgICAgICAgcGFyYW0gPSBzcmMubWF0Y2goIC9cXD8vICkgPyAnJicgOiAnPyc7XG5cbiAgICAgICAgcGFyYW0gKz0gJ3JhbmRvbT0nICsgKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcbiAgICAgICAgdGhpcy5hdHRyKCdzcmMnLCBzcmMgKyBwYXJhbSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpbWFnZS5hdHRyKCdzcmMnKSkge1xuICAgICAgbG9hZGVkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGltYWdlWzBdLmNvbXBsZXRlIHx8IGltYWdlWzBdLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgIGxvYWRlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiaW5kTG9hZC5jYWxsKGltYWdlKTtcbiAgICB9XG4gIH07XG5cbiAgLyohIG1hdGNoTWVkaWEoKSBwb2x5ZmlsbCAtIFRlc3QgYSBDU1MgbWVkaWEgdHlwZS9xdWVyeSBpbiBKUy4gQXV0aG9ycyAmIGNvcHlyaWdodCAoYykgMjAxMjogU2NvdHQgSmVobCwgUGF1bCBJcmlzaCwgTmljaG9sYXMgWmFrYXMsIERhdmlkIEtuaWdodC4gRHVhbCBNSVQvQlNEIGxpY2Vuc2UgKi9cblxuICB3aW5kb3cubWF0Y2hNZWRpYSB8fCAod2luZG93Lm1hdGNoTWVkaWEgPSBmdW5jdGlvbigpIHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICAvLyBGb3IgYnJvd3NlcnMgdGhhdCBzdXBwb3J0IG1hdGNoTWVkaXVtIGFwaSBzdWNoIGFzIElFIDkgYW5kIHdlYmtpdFxuICAgICAgdmFyIHN0eWxlTWVkaWEgPSAod2luZG93LnN0eWxlTWVkaWEgfHwgd2luZG93Lm1lZGlhKTtcblxuICAgICAgLy8gRm9yIHRob3NlIHRoYXQgZG9uJ3Qgc3VwcG9ydCBtYXRjaE1lZGl1bVxuICAgICAgaWYgKCFzdHlsZU1lZGlhKSB7XG4gICAgICAgICAgdmFyIHN0eWxlICAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKSxcbiAgICAgICAgICAgICAgc2NyaXB0ICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF0sXG4gICAgICAgICAgICAgIGluZm8gICAgICAgID0gbnVsbDtcblxuICAgICAgICAgIHN0eWxlLnR5cGUgID0gJ3RleHQvY3NzJztcbiAgICAgICAgICBzdHlsZS5pZCAgICA9ICdtYXRjaG1lZGlhanMtdGVzdCc7XG5cbiAgICAgICAgICBzY3JpcHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc3R5bGUsIHNjcmlwdCk7XG5cbiAgICAgICAgICAvLyAnc3R5bGUuY3VycmVudFN0eWxlJyBpcyB1c2VkIGJ5IElFIDw9IDggYW5kICd3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZScgZm9yIGFsbCBvdGhlciBicm93c2Vyc1xuICAgICAgICAgIGluZm8gPSAoJ2dldENvbXB1dGVkU3R5bGUnIGluIHdpbmRvdykgJiYgd2luZG93LmdldENvbXB1dGVkU3R5bGUoc3R5bGUsIG51bGwpIHx8IHN0eWxlLmN1cnJlbnRTdHlsZTtcblxuICAgICAgICAgIHN0eWxlTWVkaWEgPSB7XG4gICAgICAgICAgICAgIG1hdGNoTWVkaXVtOiBmdW5jdGlvbihtZWRpYSkge1xuICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSAnQG1lZGlhICcgKyBtZWRpYSArICd7ICNtYXRjaG1lZGlhanMtdGVzdCB7IHdpZHRoOiAxcHg7IH0gfSc7XG5cbiAgICAgICAgICAgICAgICAgIC8vICdzdHlsZS5zdHlsZVNoZWV0JyBpcyB1c2VkIGJ5IElFIDw9IDggYW5kICdzdHlsZS50ZXh0Q29udGVudCcgZm9yIGFsbCBvdGhlciBicm93c2Vyc1xuICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlLnN0eWxlU2hlZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5zdHlsZVNoZWV0LmNzc1RleHQgPSB0ZXh0O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZS50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIFRlc3QgaWYgbWVkaWEgcXVlcnkgaXMgdHJ1ZSBvciBmYWxzZVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZm8ud2lkdGggPT09ICcxcHgnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG1lZGlhKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWF0Y2hlczogc3R5bGVNZWRpYS5tYXRjaE1lZGl1bShtZWRpYSB8fCAnYWxsJyksXG4gICAgICAgICAgICAgIG1lZGlhOiBtZWRpYSB8fCAnYWxsJ1xuICAgICAgICAgIH07XG4gICAgICB9O1xuICB9KCkpO1xuXG4gIC8qXG4gICAqIGpxdWVyeS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2duYXJmMzcvanF1ZXJ5LXJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgKiBSZXF1aXJlcyBqUXVlcnkgMS44K1xuICAgKlxuICAgKiBDb3B5cmlnaHQgKGMpIDIwMTIgQ29yZXkgRnJhbmdcbiAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICAgKi9cblxuICAoZnVuY3Rpb24oalF1ZXJ5KSB7XG5cblxuICAvLyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgcG9seWZpbGwgYWRhcHRlZCBmcm9tIEVyaWsgTcO2bGxlclxuICAvLyBmaXhlcyBmcm9tIFBhdWwgSXJpc2ggYW5kIFRpbm8gWmlqZGVsXG4gIC8vIGh0dHA6Ly9wYXVsaXJpc2guY29tLzIwMTEvcmVxdWVzdGFuaW1hdGlvbmZyYW1lLWZvci1zbWFydC1hbmltYXRpbmcvXG4gIC8vIGh0dHA6Ly9teS5vcGVyYS5jb20vZW1vbGxlci9ibG9nLzIwMTEvMTIvMjAvcmVxdWVzdGFuaW1hdGlvbmZyYW1lLWZvci1zbWFydC1lci1hbmltYXRpbmdcblxuICB2YXIgYW5pbWF0aW5nLFxuICAgICAgbGFzdFRpbWUgPSAwLFxuICAgICAgdmVuZG9ycyA9IFsnd2Via2l0JywgJ21veiddLFxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSxcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lID0gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lLFxuICAgICAganF1ZXJ5RnhBdmFpbGFibGUgPSAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGpRdWVyeS5meDtcblxuICBmb3IgKDsgbGFzdFRpbWUgPCB2ZW5kb3JzLmxlbmd0aCAmJiAhcmVxdWVzdEFuaW1hdGlvbkZyYW1lOyBsYXN0VGltZSsrKSB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gd2luZG93WyB2ZW5kb3JzW2xhc3RUaW1lXSArICdSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnIF07XG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBjYW5jZWxBbmltYXRpb25GcmFtZSB8fFxuICAgICAgd2luZG93WyB2ZW5kb3JzW2xhc3RUaW1lXSArICdDYW5jZWxBbmltYXRpb25GcmFtZScgXSB8fFxuICAgICAgd2luZG93WyB2ZW5kb3JzW2xhc3RUaW1lXSArICdDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnIF07XG4gIH1cblxuICBmdW5jdGlvbiByYWYoKSB7XG4gICAgaWYgKGFuaW1hdGluZykge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJhZik7XG5cbiAgICAgIGlmIChqcXVlcnlGeEF2YWlsYWJsZSkge1xuICAgICAgICBqUXVlcnkuZngudGljaygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChyZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcbiAgICAvLyB1c2UgckFGXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZTtcbiAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBjYW5jZWxBbmltYXRpb25GcmFtZTtcblxuICAgIGlmIChqcXVlcnlGeEF2YWlsYWJsZSkge1xuICAgICAgalF1ZXJ5LmZ4LnRpbWVyID0gZnVuY3Rpb24gKHRpbWVyKSB7XG4gICAgICAgIGlmICh0aW1lcigpICYmIGpRdWVyeS50aW1lcnMucHVzaCh0aW1lcikgJiYgIWFuaW1hdGluZykge1xuICAgICAgICAgIGFuaW1hdGluZyA9IHRydWU7XG4gICAgICAgICAgcmFmKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGpRdWVyeS5meC5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBhbmltYXRpbmcgPSBmYWxzZTtcbiAgICAgIH07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIHBvbHlmaWxsXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgdmFyIGN1cnJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCksXG4gICAgICAgIHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSksXG4gICAgICAgIGlkID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNhbGxiYWNrKGN1cnJUaW1lICsgdGltZVRvQ2FsbCk7XG4gICAgICAgIH0sIHRpbWVUb0NhbGwpO1xuICAgICAgbGFzdFRpbWUgPSBjdXJyVGltZSArIHRpbWVUb0NhbGw7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfTtcblxuICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGlkKTtcbiAgICB9O1xuXG4gIH1cblxuICB9KCAkICkpO1xuXG4gIGZ1bmN0aW9uIHJlbW92ZVF1b3RlcyAoc3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnIHx8IHN0cmluZyBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoL15bJ1xcXFwvXCJdK3woO1xccz99KSt8WydcXFxcL1wiXSskL2csICcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gTWVkaWFRdWVyeShzZWxlY3Rvcikge1xuICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICB0aGlzLnF1ZXJ5ID0gJyc7XG4gIH1cblxuICBNZWRpYVF1ZXJ5LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSB8fCAodGhpcy5xdWVyeSA9IFModGhpcy5zZWxlY3RvcikuY3NzKCdmb250LWZhbWlseScpLnJlcGxhY2UoL15bXFwvXFxcXCdcIl0rfCg7XFxzP30pK3xbXFwvXFxcXCdcIl0rJC9nLCAnJykpO1xuICB9O1xuXG4gIHdpbmRvdy5Gb3VuZGF0aW9uID0ge1xuICAgIG5hbWUgOiAnRm91bmRhdGlvbicsXG5cbiAgICB2ZXJzaW9uIDogJzUuNS4zJyxcblxuICAgIG1lZGlhX3F1ZXJpZXMgOiB7XG4gICAgICAnc21hbGwnICAgICAgIDogbmV3IE1lZGlhUXVlcnkoJy5mb3VuZGF0aW9uLW1xLXNtYWxsJyksXG4gICAgICAnc21hbGwtb25seScgIDogbmV3IE1lZGlhUXVlcnkoJy5mb3VuZGF0aW9uLW1xLXNtYWxsLW9ubHknKSxcbiAgICAgICdtZWRpdW0nICAgICAgOiBuZXcgTWVkaWFRdWVyeSgnLmZvdW5kYXRpb24tbXEtbWVkaXVtJyksXG4gICAgICAnbWVkaXVtLW9ubHknIDogbmV3IE1lZGlhUXVlcnkoJy5mb3VuZGF0aW9uLW1xLW1lZGl1bS1vbmx5JyksXG4gICAgICAnbGFyZ2UnICAgICAgIDogbmV3IE1lZGlhUXVlcnkoJy5mb3VuZGF0aW9uLW1xLWxhcmdlJyksXG4gICAgICAnbGFyZ2Utb25seScgIDogbmV3IE1lZGlhUXVlcnkoJy5mb3VuZGF0aW9uLW1xLWxhcmdlLW9ubHknKSxcbiAgICAgICd4bGFyZ2UnICAgICAgOiBuZXcgTWVkaWFRdWVyeSgnLmZvdW5kYXRpb24tbXEteGxhcmdlJyksXG4gICAgICAneGxhcmdlLW9ubHknIDogbmV3IE1lZGlhUXVlcnkoJy5mb3VuZGF0aW9uLW1xLXhsYXJnZS1vbmx5JyksXG4gICAgICAneHhsYXJnZScgICAgIDogbmV3IE1lZGlhUXVlcnkoJy5mb3VuZGF0aW9uLW1xLXh4bGFyZ2UnKVxuICAgIH0sXG5cbiAgICBzdHlsZXNoZWV0IDogJCgnPHN0eWxlPjwvc3R5bGU+JykuYXBwZW5kVG8oJ2hlYWQnKVswXS5zaGVldCxcblxuICAgIGdsb2JhbCA6IHtcbiAgICAgIG5hbWVzcGFjZSA6IHVuZGVmaW5lZFxuICAgIH0sXG5cbiAgICBpbml0IDogZnVuY3Rpb24gKHNjb3BlLCBsaWJyYXJpZXMsIG1ldGhvZCwgb3B0aW9ucywgcmVzcG9uc2UpIHtcbiAgICAgIHZhciBhcmdzID0gW3Njb3BlLCBtZXRob2QsIG9wdGlvbnMsIHJlc3BvbnNlXSxcbiAgICAgICAgICByZXNwb25zZXMgPSBbXTtcblxuICAgICAgLy8gY2hlY2sgUlRMXG4gICAgICB0aGlzLnJ0bCA9IC9ydGwvaS50ZXN0KFMoJ2h0bWwnKS5hdHRyKCdkaXInKSk7XG5cbiAgICAgIC8vIHNldCBmb3VuZGF0aW9uIGdsb2JhbCBzY29wZVxuICAgICAgdGhpcy5zY29wZSA9IHNjb3BlIHx8IHRoaXMuc2NvcGU7XG5cbiAgICAgIHRoaXMuc2V0X25hbWVzcGFjZSgpO1xuXG4gICAgICBpZiAobGlicmFyaWVzICYmIHR5cGVvZiBsaWJyYXJpZXMgPT09ICdzdHJpbmcnICYmICEvcmVmbG93L2kudGVzdChsaWJyYXJpZXMpKSB7XG4gICAgICAgIGlmICh0aGlzLmxpYnMuaGFzT3duUHJvcGVydHkobGlicmFyaWVzKSkge1xuICAgICAgICAgIHJlc3BvbnNlcy5wdXNoKHRoaXMuaW5pdF9saWIobGlicmFyaWVzLCBhcmdzKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGxpYiBpbiB0aGlzLmxpYnMpIHtcbiAgICAgICAgICByZXNwb25zZXMucHVzaCh0aGlzLmluaXRfbGliKGxpYiwgbGlicmFyaWVzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgUyh3aW5kb3cpLmxvYWQoZnVuY3Rpb24gKCkge1xuICAgICAgICBTKHdpbmRvdylcbiAgICAgICAgICAudHJpZ2dlcigncmVzaXplLmZuZHRuLmNsZWFyaW5nJylcbiAgICAgICAgICAudHJpZ2dlcigncmVzaXplLmZuZHRuLmRyb3Bkb3duJylcbiAgICAgICAgICAudHJpZ2dlcigncmVzaXplLmZuZHRuLmVxdWFsaXplcicpXG4gICAgICAgICAgLnRyaWdnZXIoJ3Jlc2l6ZS5mbmR0bi5pbnRlcmNoYW5nZScpXG4gICAgICAgICAgLnRyaWdnZXIoJ3Jlc2l6ZS5mbmR0bi5qb3lyaWRlJylcbiAgICAgICAgICAudHJpZ2dlcigncmVzaXplLmZuZHRuLm1hZ2VsbGFuJylcbiAgICAgICAgICAudHJpZ2dlcigncmVzaXplLmZuZHRuLnRvcGJhcicpXG4gICAgICAgICAgLnRyaWdnZXIoJ3Jlc2l6ZS5mbmR0bi5zbGlkZXInKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gc2NvcGU7XG4gICAgfSxcblxuICAgIGluaXRfbGliIDogZnVuY3Rpb24gKGxpYiwgYXJncykge1xuICAgICAgaWYgKHRoaXMubGlicy5oYXNPd25Qcm9wZXJ0eShsaWIpKSB7XG4gICAgICAgIHRoaXMucGF0Y2godGhpcy5saWJzW2xpYl0pO1xuXG4gICAgICAgIGlmIChhcmdzICYmIGFyZ3MuaGFzT3duUHJvcGVydHkobGliKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmxpYnNbbGliXS5zZXR0aW5ncyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcy5saWJzW2xpYl0uc2V0dGluZ3MsIGFyZ3NbbGliXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmxpYnNbbGliXS5kZWZhdWx0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcy5saWJzW2xpYl0uZGVmYXVsdHMsIGFyZ3NbbGliXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMubGlic1tsaWJdLmluaXQuYXBwbHkodGhpcy5saWJzW2xpYl0sIFt0aGlzLnNjb3BlLCBhcmdzW2xpYl1dKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFyZ3MgPSBhcmdzIGluc3RhbmNlb2YgQXJyYXkgPyBhcmdzIDogbmV3IEFycmF5KGFyZ3MpO1xuICAgICAgICByZXR1cm4gdGhpcy5saWJzW2xpYl0uaW5pdC5hcHBseSh0aGlzLmxpYnNbbGliXSwgYXJncyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7fTtcbiAgICB9LFxuXG4gICAgcGF0Y2ggOiBmdW5jdGlvbiAobGliKSB7XG4gICAgICBsaWIuc2NvcGUgPSB0aGlzLnNjb3BlO1xuICAgICAgbGliLm5hbWVzcGFjZSA9IHRoaXMuZ2xvYmFsLm5hbWVzcGFjZTtcbiAgICAgIGxpYi5ydGwgPSB0aGlzLnJ0bDtcbiAgICAgIGxpYlsnZGF0YV9vcHRpb25zJ10gPSB0aGlzLnV0aWxzLmRhdGFfb3B0aW9ucztcbiAgICAgIGxpYlsnYXR0cl9uYW1lJ10gPSBhdHRyX25hbWU7XG4gICAgICBsaWJbJ2FkZF9uYW1lc3BhY2UnXSA9IGFkZF9uYW1lc3BhY2U7XG4gICAgICBsaWJbJ2JpbmRpbmdzJ10gPSBiaW5kaW5ncztcbiAgICAgIGxpYlsnUyddID0gdGhpcy51dGlscy5TO1xuICAgIH0sXG5cbiAgICBpbmhlcml0IDogZnVuY3Rpb24gKHNjb3BlLCBtZXRob2RzKSB7XG4gICAgICB2YXIgbWV0aG9kc19hcnIgPSBtZXRob2RzLnNwbGl0KCcgJyksXG4gICAgICAgICAgaSA9IG1ldGhvZHNfYXJyLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICBpZiAodGhpcy51dGlscy5oYXNPd25Qcm9wZXJ0eShtZXRob2RzX2FycltpXSkpIHtcbiAgICAgICAgICBzY29wZVttZXRob2RzX2FycltpXV0gPSB0aGlzLnV0aWxzW21ldGhvZHNfYXJyW2ldXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXRfbmFtZXNwYWNlIDogZnVuY3Rpb24gKCkge1xuXG4gICAgICAvLyBEZXNjcmlwdGlvbjpcbiAgICAgIC8vICAgIERvbid0IGJvdGhlciByZWFkaW5nIHRoZSBuYW1lc3BhY2Ugb3V0IG9mIHRoZSBtZXRhIHRhZ1xuICAgICAgLy8gICAgaWYgdGhlIG5hbWVzcGFjZSBoYXMgYmVlbiBzZXQgZ2xvYmFsbHkgaW4gamF2YXNjcmlwdFxuICAgICAgLy9cbiAgICAgIC8vIEV4YW1wbGU6XG4gICAgICAvLyAgICBGb3VuZGF0aW9uLmdsb2JhbC5uYW1lc3BhY2UgPSAnbXktbmFtZXNwYWNlJztcbiAgICAgIC8vIG9yIG1ha2UgaXQgYW4gZW1wdHkgc3RyaW5nOlxuICAgICAgLy8gICAgRm91bmRhdGlvbi5nbG9iYWwubmFtZXNwYWNlID0gJyc7XG4gICAgICAvL1xuICAgICAgLy9cblxuICAgICAgLy8gSWYgdGhlIG5hbWVzcGFjZSBoYXMgbm90IGJlZW4gc2V0IChpcyB1bmRlZmluZWQpLCB0cnkgdG8gcmVhZCBpdCBvdXQgb2YgdGhlIG1ldGEgZWxlbWVudC5cbiAgICAgIC8vIE90aGVyd2lzZSB1c2UgdGhlIGdsb2JhbGx5IGRlZmluZWQgbmFtZXNwYWNlLCBldmVuIGlmIGl0J3MgZW1wdHkgKCcnKVxuICAgICAgdmFyIG5hbWVzcGFjZSA9ICggdGhpcy5nbG9iYWwubmFtZXNwYWNlID09PSB1bmRlZmluZWQgKSA/ICQoJy5mb3VuZGF0aW9uLWRhdGEtYXR0cmlidXRlLW5hbWVzcGFjZScpLmNzcygnZm9udC1mYW1pbHknKSA6IHRoaXMuZ2xvYmFsLm5hbWVzcGFjZTtcblxuICAgICAgLy8gRmluYWxseSwgaWYgdGhlIG5hbXNlcGFjZSBpcyBlaXRoZXIgdW5kZWZpbmVkIG9yIGZhbHNlLCBzZXQgaXQgdG8gYW4gZW1wdHkgc3RyaW5nLlxuICAgICAgLy8gT3RoZXJ3aXNlIHVzZSB0aGUgbmFtZXNwYWNlIHZhbHVlLlxuICAgICAgdGhpcy5nbG9iYWwubmFtZXNwYWNlID0gKCBuYW1lc3BhY2UgPT09IHVuZGVmaW5lZCB8fCAvZmFsc2UvaS50ZXN0KG5hbWVzcGFjZSkgKSA/ICcnIDogbmFtZXNwYWNlO1xuICAgIH0sXG5cbiAgICBsaWJzIDoge30sXG5cbiAgICAvLyBtZXRob2RzIHRoYXQgY2FuIGJlIGluaGVyaXRlZCBpbiBsaWJyYXJpZXNcbiAgICB1dGlscyA6IHtcblxuICAgICAgLy8gRGVzY3JpcHRpb246XG4gICAgICAvLyAgICBGYXN0IFNlbGVjdG9yIHdyYXBwZXIgcmV0dXJucyBqUXVlcnkgb2JqZWN0LiBPbmx5IHVzZSB3aGVyZSBnZXRFbGVtZW50QnlJZFxuICAgICAgLy8gICAgaXMgbm90IGF2YWlsYWJsZS5cbiAgICAgIC8vXG4gICAgICAvLyBBcmd1bWVudHM6XG4gICAgICAvLyAgICBTZWxlY3RvciAoU3RyaW5nKTogQ1NTIHNlbGVjdG9yIGRlc2NyaWJpbmcgdGhlIGVsZW1lbnQocykgdG8gYmVcbiAgICAgIC8vICAgIHJldHVybmVkIGFzIGEgalF1ZXJ5IG9iamVjdC5cbiAgICAgIC8vXG4gICAgICAvLyAgICBTY29wZSAoU3RyaW5nKTogQ1NTIHNlbGVjdG9yIGRlc2NyaWJpbmcgdGhlIGFyZWEgdG8gYmUgc2VhcmNoZWQuIERlZmF1bHRcbiAgICAgIC8vICAgIGlzIGRvY3VtZW50LlxuICAgICAgLy9cbiAgICAgIC8vIFJldHVybnM6XG4gICAgICAvLyAgICBFbGVtZW50IChqUXVlcnkgT2JqZWN0KTogalF1ZXJ5IG9iamVjdCBjb250YWluaW5nIGVsZW1lbnRzIG1hdGNoaW5nIHRoZVxuICAgICAgLy8gICAgc2VsZWN0b3Igd2l0aGluIHRoZSBzY29wZS5cbiAgICAgIFMgOiBTLFxuXG4gICAgICAvLyBEZXNjcmlwdGlvbjpcbiAgICAgIC8vICAgIEV4ZWN1dGVzIGEgZnVuY3Rpb24gYSBtYXggb2Ygb25jZSBldmVyeSBuIG1pbGxpc2Vjb25kc1xuICAgICAgLy9cbiAgICAgIC8vIEFyZ3VtZW50czpcbiAgICAgIC8vICAgIEZ1bmMgKEZ1bmN0aW9uKTogRnVuY3Rpb24gdG8gYmUgdGhyb3R0bGVkLlxuICAgICAgLy9cbiAgICAgIC8vICAgIERlbGF5IChJbnRlZ2VyKTogRnVuY3Rpb24gZXhlY3V0aW9uIHRocmVzaG9sZCBpbiBtaWxsaXNlY29uZHMuXG4gICAgICAvL1xuICAgICAgLy8gUmV0dXJuczpcbiAgICAgIC8vICAgIExhenlfZnVuY3Rpb24gKEZ1bmN0aW9uKTogRnVuY3Rpb24gd2l0aCB0aHJvdHRsaW5nIGFwcGxpZWQuXG4gICAgICB0aHJvdHRsZSA6IGZ1bmN0aW9uIChmdW5jLCBkZWxheSkge1xuICAgICAgICB2YXIgdGltZXIgPSBudWxsO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuXG4gICAgICAgICAgaWYgKHRpbWVyID09IG51bGwpIHtcbiAgICAgICAgICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgICAgIH0sIGRlbGF5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9LFxuXG4gICAgICAvLyBEZXNjcmlwdGlvbjpcbiAgICAgIC8vICAgIEV4ZWN1dGVzIGEgZnVuY3Rpb24gd2hlbiBpdCBzdG9wcyBiZWluZyBpbnZva2VkIGZvciBuIHNlY29uZHNcbiAgICAgIC8vICAgIE1vZGlmaWVkIHZlcnNpb24gb2YgXy5kZWJvdW5jZSgpIGh0dHA6Ly91bmRlcnNjb3JlanMub3JnXG4gICAgICAvL1xuICAgICAgLy8gQXJndW1lbnRzOlxuICAgICAgLy8gICAgRnVuYyAoRnVuY3Rpb24pOiBGdW5jdGlvbiB0byBiZSBkZWJvdW5jZWQuXG4gICAgICAvL1xuICAgICAgLy8gICAgRGVsYXkgKEludGVnZXIpOiBGdW5jdGlvbiBleGVjdXRpb24gdGhyZXNob2xkIGluIG1pbGxpc2Vjb25kcy5cbiAgICAgIC8vXG4gICAgICAvLyAgICBJbW1lZGlhdGUgKEJvb2wpOiBXaGV0aGVyIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmdcbiAgICAgIC8vICAgIG9mIHRoZSBkZWxheSBpbnN0ZWFkIG9mIHRoZSBlbmQuIERlZmF1bHQgaXMgZmFsc2UuXG4gICAgICAvL1xuICAgICAgLy8gUmV0dXJuczpcbiAgICAgIC8vICAgIExhenlfZnVuY3Rpb24gKEZ1bmN0aW9uKTogRnVuY3Rpb24gd2l0aCBkZWJvdW5jaW5nIGFwcGxpZWQuXG4gICAgICBkZWJvdW5jZSA6IGZ1bmN0aW9uIChmdW5jLCBkZWxheSwgaW1tZWRpYXRlKSB7XG4gICAgICAgIHZhciB0aW1lb3V0LCByZXN1bHQ7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICAgIHZhciBsYXRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKCFpbW1lZGlhdGUpIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHZhciBjYWxsTm93ID0gaW1tZWRpYXRlICYmICF0aW1lb3V0O1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgZGVsYXkpO1xuICAgICAgICAgIGlmIChjYWxsTm93KSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgfSxcblxuICAgICAgLy8gRGVzY3JpcHRpb246XG4gICAgICAvLyAgICBQYXJzZXMgZGF0YS1vcHRpb25zIGF0dHJpYnV0ZVxuICAgICAgLy9cbiAgICAgIC8vIEFyZ3VtZW50czpcbiAgICAgIC8vICAgIEVsIChqUXVlcnkgT2JqZWN0KTogRWxlbWVudCB0byBiZSBwYXJzZWQuXG4gICAgICAvL1xuICAgICAgLy8gUmV0dXJuczpcbiAgICAgIC8vICAgIE9wdGlvbnMgKEphdmFzY3JpcHQgT2JqZWN0KTogQ29udGVudHMgb2YgdGhlIGVsZW1lbnQncyBkYXRhLW9wdGlvbnNcbiAgICAgIC8vICAgIGF0dHJpYnV0ZS5cbiAgICAgIGRhdGFfb3B0aW9ucyA6IGZ1bmN0aW9uIChlbCwgZGF0YV9hdHRyX25hbWUpIHtcbiAgICAgICAgZGF0YV9hdHRyX25hbWUgPSBkYXRhX2F0dHJfbmFtZSB8fCAnb3B0aW9ucyc7XG4gICAgICAgIHZhciBvcHRzID0ge30sIGlpLCBwLCBvcHRzX2FycixcbiAgICAgICAgICAgIGRhdGFfb3B0aW9ucyA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgICAgICB2YXIgbmFtZXNwYWNlID0gRm91bmRhdGlvbi5nbG9iYWwubmFtZXNwYWNlO1xuXG4gICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbC5kYXRhKG5hbWVzcGFjZSArICctJyArIGRhdGFfYXR0cl9uYW1lKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBlbC5kYXRhKGRhdGFfYXR0cl9uYW1lKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgdmFyIGNhY2hlZF9vcHRpb25zID0gZGF0YV9vcHRpb25zKGVsKTtcblxuICAgICAgICBpZiAodHlwZW9mIGNhY2hlZF9vcHRpb25zID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHJldHVybiBjYWNoZWRfb3B0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdHNfYXJyID0gKGNhY2hlZF9vcHRpb25zIHx8ICc6Jykuc3BsaXQoJzsnKTtcbiAgICAgICAgaWkgPSBvcHRzX2Fyci5sZW5ndGg7XG5cbiAgICAgICAgZnVuY3Rpb24gaXNOdW1iZXIgKG8pIHtcbiAgICAgICAgICByZXR1cm4gIWlzTmFOIChvIC0gMCkgJiYgbyAhPT0gbnVsbCAmJiBvICE9PSAnJyAmJiBvICE9PSBmYWxzZSAmJiBvICE9PSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gdHJpbSAoc3RyKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gJC50cmltKHN0cik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzdHI7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAoaWktLSkge1xuICAgICAgICAgIHAgPSBvcHRzX2FycltpaV0uc3BsaXQoJzonKTtcbiAgICAgICAgICBwID0gW3BbMF0sIHAuc2xpY2UoMSkuam9pbignOicpXTtcblxuICAgICAgICAgIGlmICgvdHJ1ZS9pLnRlc3QocFsxXSkpIHtcbiAgICAgICAgICAgIHBbMV0gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoL2ZhbHNlL2kudGVzdChwWzFdKSkge1xuICAgICAgICAgICAgcFsxXSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNOdW1iZXIocFsxXSkpIHtcbiAgICAgICAgICAgIGlmIChwWzFdLmluZGV4T2YoJy4nKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgcFsxXSA9IHBhcnNlSW50KHBbMV0sIDEwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBbMV0gPSBwYXJzZUZsb2F0KHBbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwLmxlbmd0aCA9PT0gMiAmJiBwWzBdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG9wdHNbdHJpbShwWzBdKV0gPSB0cmltKHBbMV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRzO1xuICAgICAgfSxcblxuICAgICAgLy8gRGVzY3JpcHRpb246XG4gICAgICAvLyAgICBBZGRzIEpTLXJlY29nbml6YWJsZSBtZWRpYSBxdWVyaWVzXG4gICAgICAvL1xuICAgICAgLy8gQXJndW1lbnRzOlxuICAgICAgLy8gICAgTWVkaWEgKFN0cmluZyk6IEtleSBzdHJpbmcgZm9yIHRoZSBtZWRpYSBxdWVyeSB0byBiZSBzdG9yZWQgYXMgaW5cbiAgICAgIC8vICAgIEZvdW5kYXRpb24ubWVkaWFfcXVlcmllc1xuICAgICAgLy9cbiAgICAgIC8vICAgIENsYXNzIChTdHJpbmcpOiBDbGFzcyBuYW1lIGZvciB0aGUgZ2VuZXJhdGVkIDxtZXRhPiB0YWdcbiAgICAgIHJlZ2lzdGVyX21lZGlhIDogZnVuY3Rpb24gKG1lZGlhLCBtZWRpYV9jbGFzcykge1xuICAgICAgICBpZiAoRm91bmRhdGlvbi5tZWRpYV9xdWVyaWVzW21lZGlhXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgJCgnaGVhZCcpLmFwcGVuZCgnPG1ldGEgY2xhc3M9XCInICsgbWVkaWFfY2xhc3MgKyAnXCIvPicpO1xuICAgICAgICAgIEZvdW5kYXRpb24ubWVkaWFfcXVlcmllc1ttZWRpYV0gPSByZW1vdmVRdW90ZXMoJCgnLicgKyBtZWRpYV9jbGFzcykuY3NzKCdmb250LWZhbWlseScpKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gRGVzY3JpcHRpb246XG4gICAgICAvLyAgICBBZGQgY3VzdG9tIENTUyB3aXRoaW4gYSBKUy1kZWZpbmVkIG1lZGlhIHF1ZXJ5XG4gICAgICAvL1xuICAgICAgLy8gQXJndW1lbnRzOlxuICAgICAgLy8gICAgUnVsZSAoU3RyaW5nKTogQ1NTIHJ1bGUgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIGRvY3VtZW50LlxuICAgICAgLy9cbiAgICAgIC8vICAgIE1lZGlhIChTdHJpbmcpOiBPcHRpb25hbCBtZWRpYSBxdWVyeSBzdHJpbmcgZm9yIHRoZSBDU1MgcnVsZSB0byBiZVxuICAgICAgLy8gICAgbmVzdGVkIHVuZGVyLlxuICAgICAgYWRkX2N1c3RvbV9ydWxlIDogZnVuY3Rpb24gKHJ1bGUsIG1lZGlhKSB7XG4gICAgICAgIGlmIChtZWRpYSA9PT0gdW5kZWZpbmVkICYmIEZvdW5kYXRpb24uc3R5bGVzaGVldCkge1xuICAgICAgICAgIEZvdW5kYXRpb24uc3R5bGVzaGVldC5pbnNlcnRSdWxlKHJ1bGUsIEZvdW5kYXRpb24uc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBxdWVyeSA9IEZvdW5kYXRpb24ubWVkaWFfcXVlcmllc1ttZWRpYV07XG5cbiAgICAgICAgICBpZiAocXVlcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgRm91bmRhdGlvbi5zdHlsZXNoZWV0Lmluc2VydFJ1bGUoJ0BtZWRpYSAnICtcbiAgICAgICAgICAgICAgRm91bmRhdGlvbi5tZWRpYV9xdWVyaWVzW21lZGlhXSArICd7ICcgKyBydWxlICsgJyB9JywgRm91bmRhdGlvbi5zdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvLyBEZXNjcmlwdGlvbjpcbiAgICAgIC8vICAgIFBlcmZvcm1zIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2hlbiBhbiBpbWFnZSBpcyBmdWxseSBsb2FkZWRcbiAgICAgIC8vXG4gICAgICAvLyBBcmd1bWVudHM6XG4gICAgICAvLyAgICBJbWFnZSAoalF1ZXJ5IE9iamVjdCk6IEltYWdlKHMpIHRvIGNoZWNrIGlmIGxvYWRlZC5cbiAgICAgIC8vXG4gICAgICAvLyAgICBDYWxsYmFjayAoRnVuY3Rpb24pOiBGdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gaW1hZ2UgaXMgZnVsbHkgbG9hZGVkLlxuICAgICAgaW1hZ2VfbG9hZGVkIDogZnVuY3Rpb24gKGltYWdlcywgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICAgICAgdW5sb2FkZWQgPSBpbWFnZXMubGVuZ3RoO1xuXG4gICAgICAgIGZ1bmN0aW9uIHBpY3R1cmVzX2hhc19oZWlnaHQoaW1hZ2VzKSB7XG4gICAgICAgICAgdmFyIHBpY3R1cmVzX251bWJlciA9IGltYWdlcy5sZW5ndGg7XG5cbiAgICAgICAgICBmb3IgKHZhciBpID0gcGljdHVyZXNfbnVtYmVyIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmKGltYWdlcy5hdHRyKCdoZWlnaHQnKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVubG9hZGVkID09PSAwIHx8IHBpY3R1cmVzX2hhc19oZWlnaHQoaW1hZ2VzKSkge1xuICAgICAgICAgIGNhbGxiYWNrKGltYWdlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpbWFnZXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2luZ2xlX2ltYWdlX2xvYWRlZChzZWxmLlModGhpcyksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHVubG9hZGVkIC09IDE7XG4gICAgICAgICAgICBpZiAodW5sb2FkZWQgPT09IDApIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soaW1hZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvLyBEZXNjcmlwdGlvbjpcbiAgICAgIC8vICAgIFJldHVybnMgYSByYW5kb20sIGFscGhhbnVtZXJpYyBzdHJpbmdcbiAgICAgIC8vXG4gICAgICAvLyBBcmd1bWVudHM6XG4gICAgICAvLyAgICBMZW5ndGggKEludGVnZXIpOiBMZW5ndGggb2Ygc3RyaW5nIHRvIGJlIGdlbmVyYXRlZC4gRGVmYXVsdHMgdG8gcmFuZG9tXG4gICAgICAvLyAgICBpbnRlZ2VyLlxuICAgICAgLy9cbiAgICAgIC8vIFJldHVybnM6XG4gICAgICAvLyAgICBSYW5kIChTdHJpbmcpOiBQc2V1ZG8tcmFuZG9tLCBhbHBoYW51bWVyaWMgc3RyaW5nLlxuICAgICAgcmFuZG9tX3N0ciA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpZHgpIHtcbiAgICAgICAgICB0aGlzLmZpZHggPSAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJlZml4ID0gdGhpcy5wcmVmaXggfHwgWyh0aGlzLm5hbWUgfHwgJ0YnKSwgKCtuZXcgRGF0ZSkudG9TdHJpbmcoMzYpXS5qb2luKCctJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucHJlZml4ICsgKHRoaXMuZmlkeCsrKS50b1N0cmluZygzNik7XG4gICAgICB9LFxuXG4gICAgICAvLyBEZXNjcmlwdGlvbjpcbiAgICAgIC8vICAgIEhlbHBlciBmb3Igd2luZG93Lm1hdGNoTWVkaWFcbiAgICAgIC8vXG4gICAgICAvLyBBcmd1bWVudHM6XG4gICAgICAvLyAgICBtcSAoU3RyaW5nKTogTWVkaWEgcXVlcnlcbiAgICAgIC8vXG4gICAgICAvLyBSZXR1cm5zOlxuICAgICAgLy8gICAgKEJvb2xlYW4pOiBXaGV0aGVyIHRoZSBtZWRpYSBxdWVyeSBwYXNzZXMgb3Igbm90XG4gICAgICBtYXRjaCA6IGZ1bmN0aW9uIChtcSkge1xuICAgICAgICByZXR1cm4gd2luZG93Lm1hdGNoTWVkaWEobXEpLm1hdGNoZXM7XG4gICAgICB9LFxuXG4gICAgICAvLyBEZXNjcmlwdGlvbjpcbiAgICAgIC8vICAgIEhlbHBlcnMgZm9yIGNoZWNraW5nIEZvdW5kYXRpb24gZGVmYXVsdCBtZWRpYSBxdWVyaWVzIHdpdGggSlNcbiAgICAgIC8vXG4gICAgICAvLyBSZXR1cm5zOlxuICAgICAgLy8gICAgKEJvb2xlYW4pOiBXaGV0aGVyIHRoZSBtZWRpYSBxdWVyeSBwYXNzZXMgb3Igbm90XG5cbiAgICAgIGlzX3NtYWxsX3VwIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXRjaChGb3VuZGF0aW9uLm1lZGlhX3F1ZXJpZXMuc21hbGwpO1xuICAgICAgfSxcblxuICAgICAgaXNfbWVkaXVtX3VwIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXRjaChGb3VuZGF0aW9uLm1lZGlhX3F1ZXJpZXMubWVkaXVtKTtcbiAgICAgIH0sXG5cbiAgICAgIGlzX2xhcmdlX3VwIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXRjaChGb3VuZGF0aW9uLm1lZGlhX3F1ZXJpZXMubGFyZ2UpO1xuICAgICAgfSxcblxuICAgICAgaXNfeGxhcmdlX3VwIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXRjaChGb3VuZGF0aW9uLm1lZGlhX3F1ZXJpZXMueGxhcmdlKTtcbiAgICAgIH0sXG5cbiAgICAgIGlzX3h4bGFyZ2VfdXAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hdGNoKEZvdW5kYXRpb24ubWVkaWFfcXVlcmllcy54eGxhcmdlKTtcbiAgICAgIH0sXG5cbiAgICAgIGlzX3NtYWxsX29ubHkgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc19tZWRpdW1fdXAoKSAmJiAhdGhpcy5pc19sYXJnZV91cCgpICYmICF0aGlzLmlzX3hsYXJnZV91cCgpICYmICF0aGlzLmlzX3h4bGFyZ2VfdXAoKTtcbiAgICAgIH0sXG5cbiAgICAgIGlzX21lZGl1bV9vbmx5IDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc19tZWRpdW1fdXAoKSAmJiAhdGhpcy5pc19sYXJnZV91cCgpICYmICF0aGlzLmlzX3hsYXJnZV91cCgpICYmICF0aGlzLmlzX3h4bGFyZ2VfdXAoKTtcbiAgICAgIH0sXG5cbiAgICAgIGlzX2xhcmdlX29ubHkgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzX21lZGl1bV91cCgpICYmIHRoaXMuaXNfbGFyZ2VfdXAoKSAmJiAhdGhpcy5pc194bGFyZ2VfdXAoKSAmJiAhdGhpcy5pc194eGxhcmdlX3VwKCk7XG4gICAgICB9LFxuXG4gICAgICBpc194bGFyZ2Vfb25seSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNfbWVkaXVtX3VwKCkgJiYgdGhpcy5pc19sYXJnZV91cCgpICYmIHRoaXMuaXNfeGxhcmdlX3VwKCkgJiYgIXRoaXMuaXNfeHhsYXJnZV91cCgpO1xuICAgICAgfSxcblxuICAgICAgaXNfeHhsYXJnZV9vbmx5IDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc19tZWRpdW1fdXAoKSAmJiB0aGlzLmlzX2xhcmdlX3VwKCkgJiYgdGhpcy5pc194bGFyZ2VfdXAoKSAmJiB0aGlzLmlzX3h4bGFyZ2VfdXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgJC5mbi5mb3VuZGF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcblxuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgRm91bmRhdGlvbi5pbml0LmFwcGx5KEZvdW5kYXRpb24sIFt0aGlzXS5jb25jYXQoYXJncykpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSk7XG4gIH07XG5cbn0oalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCkpO1xuIiwiOyhmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgb3Blbk1vZGFscyA9IFtdO1xuXG4gIEZvdW5kYXRpb24ubGlicy5yZXZlYWwgPSB7XG4gICAgbmFtZSA6ICdyZXZlYWwnLFxuXG4gICAgdmVyc2lvbiA6ICc1LjUuMycsXG5cbiAgICBsb2NrZWQgOiBmYWxzZSxcblxuICAgIHNldHRpbmdzIDoge1xuICAgICAgYW5pbWF0aW9uIDogJ2ZhZGVBbmRQb3AnLFxuICAgICAgYW5pbWF0aW9uX3NwZWVkIDogMjUwLFxuICAgICAgY2xvc2Vfb25fYmFja2dyb3VuZF9jbGljayA6IHRydWUsXG4gICAgICBjbG9zZV9vbl9lc2MgOiB0cnVlLFxuICAgICAgZGlzbWlzc19tb2RhbF9jbGFzcyA6ICdjbG9zZS1yZXZlYWwtbW9kYWwnLFxuICAgICAgbXVsdGlwbGVfb3BlbmVkIDogZmFsc2UsXG4gICAgICBiZ19jbGFzcyA6ICdyZXZlYWwtbW9kYWwtYmcnLFxuICAgICAgcm9vdF9lbGVtZW50IDogJ2JvZHknLFxuICAgICAgb3BlbiA6IGZ1bmN0aW9uKCl7fSxcbiAgICAgIG9wZW5lZCA6IGZ1bmN0aW9uKCl7fSxcbiAgICAgIGNsb3NlIDogZnVuY3Rpb24oKXt9LFxuICAgICAgY2xvc2VkIDogZnVuY3Rpb24oKXt9LFxuICAgICAgb25fYWpheF9lcnJvcjogJC5ub29wLFxuICAgICAgYmcgOiAkKCcucmV2ZWFsLW1vZGFsLWJnJyksXG4gICAgICBjc3MgOiB7XG4gICAgICAgIG9wZW4gOiB7XG4gICAgICAgICAgJ29wYWNpdHknIDogMCxcbiAgICAgICAgICAndmlzaWJpbGl0eScgOiAndmlzaWJsZScsXG4gICAgICAgICAgJ2Rpc3BsYXknIDogJ2Jsb2NrJ1xuICAgICAgICB9LFxuICAgICAgICBjbG9zZSA6IHtcbiAgICAgICAgICAnb3BhY2l0eScgOiAxLFxuICAgICAgICAgICd2aXNpYmlsaXR5JyA6ICdoaWRkZW4nLFxuICAgICAgICAgICdkaXNwbGF5JyA6ICdub25lJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGluaXQgOiBmdW5jdGlvbiAoc2NvcGUsIG1ldGhvZCwgb3B0aW9ucykge1xuICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcy5zZXR0aW5ncywgbWV0aG9kLCBvcHRpb25zKTtcbiAgICAgIHRoaXMuYmluZGluZ3MobWV0aG9kLCBvcHRpb25zKTtcbiAgICB9LFxuXG4gICAgZXZlbnRzIDogZnVuY3Rpb24gKHNjb3BlKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgICAgUyA9IHNlbGYuUztcblxuICAgICAgUyh0aGlzLnNjb3BlKVxuICAgICAgICAub2ZmKCcucmV2ZWFsJylcbiAgICAgICAgLm9uKCdjbGljay5mbmR0bi5yZXZlYWwnLCAnWycgKyB0aGlzLmFkZF9uYW1lc3BhY2UoJ2RhdGEtcmV2ZWFsLWlkJykgKyAnXTpub3QoW2Rpc2FibGVkXSknLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgIGlmICghc2VsZi5sb2NrZWQpIHtcbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gUyh0aGlzKSxcbiAgICAgICAgICAgICAgICBhamF4ID0gZWxlbWVudC5kYXRhKHNlbGYuZGF0YV9hdHRyKCdyZXZlYWwtYWpheCcpKSxcbiAgICAgICAgICAgICAgICByZXBsYWNlQ29udGVudFNlbCA9IGVsZW1lbnQuZGF0YShzZWxmLmRhdGFfYXR0cigncmV2ZWFsLXJlcGxhY2UtY29udGVudCcpKTtcblxuICAgICAgICAgICAgc2VsZi5sb2NrZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGFqYXggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHNlbGYub3Blbi5jYWxsKHNlbGYsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIHVybCA9IGFqYXggPT09IHRydWUgPyBlbGVtZW50LmF0dHIoJ2hyZWYnKSA6IGFqYXg7XG4gICAgICAgICAgICAgIHNlbGYub3Blbi5jYWxsKHNlbGYsIGVsZW1lbnQsIHt1cmwgOiB1cmx9LCB7IHJlcGxhY2VDb250ZW50U2VsIDogcmVwbGFjZUNvbnRlbnRTZWwgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgUyhkb2N1bWVudClcbiAgICAgICAgLm9uKCdjbGljay5mbmR0bi5yZXZlYWwnLCB0aGlzLmNsb3NlX3RhcmdldHMoKSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgaWYgKCFzZWxmLmxvY2tlZCkge1xuICAgICAgICAgICAgdmFyIHNldHRpbmdzID0gUygnWycgKyBzZWxmLmF0dHJfbmFtZSgpICsgJ10ub3BlbicpLmRhdGEoc2VsZi5hdHRyX25hbWUodHJ1ZSkgKyAnLWluaXQnKSB8fCBzZWxmLnNldHRpbmdzLFxuICAgICAgICAgICAgICAgIGJnX2NsaWNrZWQgPSBTKGUudGFyZ2V0KVswXSA9PT0gUygnLicgKyBzZXR0aW5ncy5iZ19jbGFzcylbMF07XG5cbiAgICAgICAgICAgIGlmIChiZ19jbGlja2VkKSB7XG4gICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5jbG9zZV9vbl9iYWNrZ3JvdW5kX2NsaWNrKSB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VsZi5sb2NrZWQgPSB0cnVlO1xuICAgICAgICAgICAgc2VsZi5jbG9zZS5jYWxsKHNlbGYsIGJnX2NsaWNrZWQgPyBTKCdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnXS5vcGVuOm5vdCgudG9iYWNrKScpIDogUyh0aGlzKS5jbG9zZXN0KCdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnXScpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICBpZiAoUygnWycgKyBzZWxmLmF0dHJfbmFtZSgpICsgJ10nLCB0aGlzLnNjb3BlKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIFModGhpcy5zY29wZSlcbiAgICAgICAgICAvLyAub2ZmKCcucmV2ZWFsJylcbiAgICAgICAgICAub24oJ29wZW4uZm5kdG4ucmV2ZWFsJywgdGhpcy5zZXR0aW5ncy5vcGVuKVxuICAgICAgICAgIC5vbignb3BlbmVkLmZuZHRuLnJldmVhbCcsIHRoaXMuc2V0dGluZ3Mub3BlbmVkKVxuICAgICAgICAgIC5vbignb3BlbmVkLmZuZHRuLnJldmVhbCcsIHRoaXMub3Blbl92aWRlbylcbiAgICAgICAgICAub24oJ2Nsb3NlLmZuZHRuLnJldmVhbCcsIHRoaXMuc2V0dGluZ3MuY2xvc2UpXG4gICAgICAgICAgLm9uKCdjbG9zZWQuZm5kdG4ucmV2ZWFsJywgdGhpcy5zZXR0aW5ncy5jbG9zZWQpXG4gICAgICAgICAgLm9uKCdjbG9zZWQuZm5kdG4ucmV2ZWFsJywgdGhpcy5jbG9zZV92aWRlbyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBTKHRoaXMuc2NvcGUpXG4gICAgICAgICAgLy8gLm9mZignLnJldmVhbCcpXG4gICAgICAgICAgLm9uKCdvcGVuLmZuZHRuLnJldmVhbCcsICdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnXScsIHRoaXMuc2V0dGluZ3Mub3BlbilcbiAgICAgICAgICAub24oJ29wZW5lZC5mbmR0bi5yZXZlYWwnLCAnWycgKyBzZWxmLmF0dHJfbmFtZSgpICsgJ10nLCB0aGlzLnNldHRpbmdzLm9wZW5lZClcbiAgICAgICAgICAub24oJ29wZW5lZC5mbmR0bi5yZXZlYWwnLCAnWycgKyBzZWxmLmF0dHJfbmFtZSgpICsgJ10nLCB0aGlzLm9wZW5fdmlkZW8pXG4gICAgICAgICAgLm9uKCdjbG9zZS5mbmR0bi5yZXZlYWwnLCAnWycgKyBzZWxmLmF0dHJfbmFtZSgpICsgJ10nLCB0aGlzLnNldHRpbmdzLmNsb3NlKVxuICAgICAgICAgIC5vbignY2xvc2VkLmZuZHRuLnJldmVhbCcsICdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnXScsIHRoaXMuc2V0dGluZ3MuY2xvc2VkKVxuICAgICAgICAgIC5vbignY2xvc2VkLmZuZHRuLnJldmVhbCcsICdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnXScsIHRoaXMuY2xvc2VfdmlkZW8pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgLy8gUEFUQ0ggIzM6IHR1cm5pbmcgb24ga2V5IHVwIGNhcHR1cmUgb25seSB3aGVuIGEgcmV2ZWFsIHdpbmRvdyBpcyBvcGVuXG4gICAga2V5X3VwX29uIDogZnVuY3Rpb24gKHNjb3BlKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIFBBVENIICMxOiBmaXhpbmcgbXVsdGlwbGUga2V5dXAgZXZlbnQgdHJpZ2dlciBmcm9tIHNpbmdsZSBrZXkgcHJlc3NcbiAgICAgIHNlbGYuUygnYm9keScpLm9mZigna2V5dXAuZm5kdG4ucmV2ZWFsJykub24oJ2tleXVwLmZuZHRuLnJldmVhbCcsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG4gICAgICAgIHZhciBvcGVuX21vZGFsID0gc2VsZi5TKCdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnXS5vcGVuJyksXG4gICAgICAgICAgICBzZXR0aW5ncyA9IG9wZW5fbW9kYWwuZGF0YShzZWxmLmF0dHJfbmFtZSh0cnVlKSArICctaW5pdCcpIHx8IHNlbGYuc2V0dGluZ3MgO1xuICAgICAgICAvLyBQQVRDSCAjMjogbWFraW5nIHN1cmUgdGhhdCB0aGUgY2xvc2UgZXZlbnQgY2FuIGJlIGNhbGxlZCBvbmx5IHdoaWxlIHVubG9ja2VkLFxuICAgICAgICAvLyAgICAgICAgICAgc28gdGhhdCBtdWx0aXBsZSBrZXl1cC5mbmR0bi5yZXZlYWwgZXZlbnRzIGRvbid0IHByZXZlbnQgY2xlYW4gY2xvc2luZyBvZiB0aGUgcmV2ZWFsIHdpbmRvdy5cbiAgICAgICAgaWYgKCBzZXR0aW5ncyAmJiBldmVudC53aGljaCA9PT0gMjcgICYmIHNldHRpbmdzLmNsb3NlX29uX2VzYyAmJiAhc2VsZi5sb2NrZWQpIHsgLy8gMjcgaXMgdGhlIGtleWNvZGUgZm9yIHRoZSBFc2NhcGUga2V5XG4gICAgICAgICAgc2VsZi5jbG9zZS5jYWxsKHNlbGYsIG9wZW5fbW9kYWwpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIC8vIFBBVENIICMzOiB0dXJuaW5nIG9uIGtleSB1cCBjYXB0dXJlIG9ubHkgd2hlbiBhIHJldmVhbCB3aW5kb3cgaXMgb3BlblxuICAgIGtleV91cF9vZmYgOiBmdW5jdGlvbiAoc2NvcGUpIHtcbiAgICAgIHRoaXMuUygnYm9keScpLm9mZigna2V5dXAuZm5kdG4ucmV2ZWFsJyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgb3BlbiA6IGZ1bmN0aW9uICh0YXJnZXQsIGFqYXhfc2V0dGluZ3MpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgICBtb2RhbDtcblxuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBpZiAodHlwZW9mIHRhcmdldC5zZWxlY3RvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAvLyBGaW5kIHRoZSBuYW1lZCBub2RlOyBvbmx5IHVzZSB0aGUgZmlyc3Qgb25lIGZvdW5kLCBzaW5jZSB0aGUgcmVzdCBvZiB0aGUgY29kZSBhc3N1bWVzIHRoZXJlJ3Mgb25seSBvbmUgbm9kZVxuICAgICAgICAgIG1vZGFsID0gc2VsZi5TKCcjJyArIHRhcmdldC5kYXRhKHNlbGYuZGF0YV9hdHRyKCdyZXZlYWwtaWQnKSkpLmZpcnN0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbW9kYWwgPSBzZWxmLlModGhpcy5zY29wZSk7XG5cbiAgICAgICAgICBhamF4X3NldHRpbmdzID0gdGFyZ2V0O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtb2RhbCA9IHNlbGYuUyh0aGlzLnNjb3BlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNldHRpbmdzID0gbW9kYWwuZGF0YShzZWxmLmF0dHJfbmFtZSh0cnVlKSArICctaW5pdCcpO1xuICAgICAgc2V0dGluZ3MgPSBzZXR0aW5ncyB8fCB0aGlzLnNldHRpbmdzO1xuXG5cbiAgICAgIGlmIChtb2RhbC5oYXNDbGFzcygnb3BlbicpICYmIHRhcmdldCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldC5hdHRyKCdkYXRhLXJldmVhbC1pZCcpID09IG1vZGFsLmF0dHIoJ2lkJykpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuY2xvc2UobW9kYWwpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW1vZGFsLmhhc0NsYXNzKCdvcGVuJykpIHtcbiAgICAgICAgdmFyIG9wZW5fbW9kYWwgPSBzZWxmLlMoJ1snICsgc2VsZi5hdHRyX25hbWUoKSArICddLm9wZW4nKTtcblxuICAgICAgICBpZiAodHlwZW9mIG1vZGFsLmRhdGEoJ2Nzcy10b3AnKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBtb2RhbC5kYXRhKCdjc3MtdG9wJywgcGFyc2VJbnQobW9kYWwuY3NzKCd0b3AnKSwgMTApKVxuICAgICAgICAgICAgLmRhdGEoJ29mZnNldCcsIHRoaXMuY2FjaGVfb2Zmc2V0KG1vZGFsKSk7XG4gICAgICAgIH1cblxuICAgICAgICBtb2RhbC5hdHRyKCd0YWJpbmRleCcsJzAnKS5hdHRyKCdhcmlhLWhpZGRlbicsJ2ZhbHNlJyk7XG5cbiAgICAgICAgdGhpcy5rZXlfdXBfb24obW9kYWwpOyAgICAvLyBQQVRDSCAjMzogdHVybmluZyBvbiBrZXkgdXAgY2FwdHVyZSBvbmx5IHdoZW4gYSByZXZlYWwgd2luZG93IGlzIG9wZW5cblxuICAgICAgICAvLyBQcmV2ZW50IG5hbWVzcGFjZSBldmVudCBmcm9tIHRyaWdnZXJpbmcgdHdpY2VcbiAgICAgICAgbW9kYWwub24oJ29wZW4uZm5kdG4ucmV2ZWFsJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgIGlmIChlLm5hbWVzcGFjZSAhPT0gJ2ZuZHRuLnJldmVhbCcpIHJldHVybjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbW9kYWwub24oJ29wZW4uZm5kdG4ucmV2ZWFsJykudHJpZ2dlcignb3Blbi5mbmR0bi5yZXZlYWwnKTtcblxuICAgICAgICBpZiAob3Blbl9tb2RhbC5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgdGhpcy50b2dnbGVfYmcobW9kYWwsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBhamF4X3NldHRpbmdzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGFqYXhfc2V0dGluZ3MgPSB7XG4gICAgICAgICAgICB1cmwgOiBhamF4X3NldHRpbmdzXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvcGVuTW9kYWwgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZihvcGVuX21vZGFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmKHNldHRpbmdzLm11bHRpcGxlX29wZW5lZCkge1xuICAgICAgICAgICAgICBzZWxmLnRvX2JhY2sob3Blbl9tb2RhbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZWxmLmhpZGUob3Blbl9tb2RhbCwgc2V0dGluZ3MuY3NzLmNsb3NlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBibDogYWRkIHRoZSBvcGVuX21vZGFsIHRoYXQgaXNuJ3QgYWxyZWFkeSBpbiB0aGUgYmFja2dyb3VuZCB0byB0aGUgb3Blbk1vZGFscyBhcnJheVxuICAgICAgICAgIGlmKHNldHRpbmdzLm11bHRpcGxlX29wZW5lZCkge1xuICAgICAgICAgICAgb3Blbk1vZGFscy5wdXNoKG1vZGFsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWxmLnNob3cobW9kYWwsIHNldHRpbmdzLmNzcy5vcGVuKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodHlwZW9mIGFqYXhfc2V0dGluZ3MgPT09ICd1bmRlZmluZWQnIHx8ICFhamF4X3NldHRpbmdzLnVybCkge1xuICAgICAgICAgIG9wZW5Nb2RhbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBvbGRfc3VjY2VzcyA9IHR5cGVvZiBhamF4X3NldHRpbmdzLnN1Y2Nlc3MgIT09ICd1bmRlZmluZWQnID8gYWpheF9zZXR0aW5ncy5zdWNjZXNzIDogbnVsbDtcbiAgICAgICAgICAkLmV4dGVuZChhamF4X3NldHRpbmdzLCB7XG4gICAgICAgICAgICBzdWNjZXNzIDogZnVuY3Rpb24gKGRhdGEsIHRleHRTdGF0dXMsIGpxWEhSKSB7XG4gICAgICAgICAgICAgIGlmICggJC5pc0Z1bmN0aW9uKG9sZF9zdWNjZXNzKSApIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gb2xkX3N1Y2Nlc3MoZGF0YSwgdGV4dFN0YXR1cywganFYSFIpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICBkYXRhID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMucmVwbGFjZUNvbnRlbnRTZWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbW9kYWwuZmluZChvcHRpb25zLnJlcGxhY2VDb250ZW50U2VsKS5odG1sKGRhdGEpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1vZGFsLmh0bWwoZGF0YSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzZWxmLlMobW9kYWwpLmZvdW5kYXRpb24oJ3NlY3Rpb24nLCAncmVmbG93Jyk7XG4gICAgICAgICAgICAgIHNlbGYuUyhtb2RhbCkuY2hpbGRyZW4oKS5mb3VuZGF0aW9uKCk7XG5cbiAgICAgICAgICAgICAgb3Blbk1vZGFsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBjaGVjayBmb3IgaWYgdXNlciBpbml0YWxpemVkIHdpdGggZXJyb3IgY2FsbGJhY2tcbiAgICAgICAgICBpZiAoc2V0dGluZ3Mub25fYWpheF9lcnJvciAhPT0gJC5ub29wKSB7XG4gICAgICAgICAgICAkLmV4dGVuZChhamF4X3NldHRpbmdzLCB7XG4gICAgICAgICAgICAgIGVycm9yIDogc2V0dGluZ3Mub25fYWpheF9lcnJvclxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgJC5hamF4KGFqYXhfc2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZWxmLlMod2luZG93KS50cmlnZ2VyKCdyZXNpemUnKTtcbiAgICB9LFxuXG4gICAgY2xvc2UgOiBmdW5jdGlvbiAobW9kYWwpIHtcbiAgICAgIHZhciBtb2RhbCA9IG1vZGFsICYmIG1vZGFsLmxlbmd0aCA/IG1vZGFsIDogdGhpcy5TKHRoaXMuc2NvcGUpLFxuICAgICAgICAgIG9wZW5fbW9kYWxzID0gdGhpcy5TKCdbJyArIHRoaXMuYXR0cl9uYW1lKCkgKyAnXS5vcGVuJyksXG4gICAgICAgICAgc2V0dGluZ3MgPSBtb2RhbC5kYXRhKHRoaXMuYXR0cl9uYW1lKHRydWUpICsgJy1pbml0JykgfHwgdGhpcy5zZXR0aW5ncyxcbiAgICAgICAgICBzZWxmID0gdGhpcztcblxuICAgICAgaWYgKG9wZW5fbW9kYWxzLmxlbmd0aCA+IDApIHtcblxuICAgICAgICBtb2RhbC5yZW1vdmVBdHRyKCd0YWJpbmRleCcsJzAnKS5hdHRyKCdhcmlhLWhpZGRlbicsJ3RydWUnKTtcblxuICAgICAgICB0aGlzLmxvY2tlZCA9IHRydWU7XG4gICAgICAgIHRoaXMua2V5X3VwX29mZihtb2RhbCk7ICAgLy8gUEFUQ0ggIzM6IHR1cm5pbmcgb24ga2V5IHVwIGNhcHR1cmUgb25seSB3aGVuIGEgcmV2ZWFsIHdpbmRvdyBpcyBvcGVuXG5cbiAgICAgICAgbW9kYWwudHJpZ2dlcignY2xvc2UuZm5kdG4ucmV2ZWFsJyk7XG5cbiAgICAgICAgaWYgKChzZXR0aW5ncy5tdWx0aXBsZV9vcGVuZWQgJiYgb3Blbl9tb2RhbHMubGVuZ3RoID09PSAxKSB8fCAhc2V0dGluZ3MubXVsdGlwbGVfb3BlbmVkIHx8IG1vZGFsLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBzZWxmLnRvZ2dsZV9iZyhtb2RhbCwgZmFsc2UpO1xuICAgICAgICAgIHNlbGYudG9fZnJvbnQobW9kYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNldHRpbmdzLm11bHRpcGxlX29wZW5lZCkge1xuICAgICAgICAgIHZhciBpc0N1cnJlbnQgPSBtb2RhbC5pcygnOm5vdCgudG9iYWNrKScpO1xuICAgICAgICAgIHNlbGYuaGlkZShtb2RhbCwgc2V0dGluZ3MuY3NzLmNsb3NlLCBzZXR0aW5ncyk7XG4gICAgICAgICAgaWYoaXNDdXJyZW50KSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgdGhlIGxhc3QgbW9kYWwgc2luY2UgaXQgaXMgbm93IGNsb3NlZFxuICAgICAgICAgICAgb3Blbk1vZGFscy5wb3AoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgdGhpcyBpc24ndCB0aGUgY3VycmVudCBtb2RhbCwgdGhlbiBmaW5kIGl0IGluIHRoZSBhcnJheSBhbmQgcmVtb3ZlIGl0XG4gICAgICAgICAgICBvcGVuTW9kYWxzID0gJC5ncmVwKG9wZW5Nb2RhbHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgICB2YXIgaXNUaGlzID0gZWx0WzBdPT09bW9kYWxbMF07XG4gICAgICAgICAgICAgIGlmKGlzVGhpcykge1xuICAgICAgICAgICAgICAgIC8vIHNpbmNlIGl0J3Mgbm90IGN1cnJlbnRseSBpbiB0aGUgZnJvbnQsIHB1dCBpdCBpbiB0aGUgZnJvbnQgbm93IHRoYXQgaXQgaXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgLy8gc28gdGhhdCBpZiBpdCdzIHJlLW9wZW5lZCwgaXQgd29uJ3QgYmUgLnRvYmFja1xuICAgICAgICAgICAgICAgIHNlbGYudG9fZnJvbnQobW9kYWwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiAhaXNUaGlzO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGZpbmFsbHksIHNob3cgdGhlIG5leHQgbW9kYWwgaW4gdGhlIHN0YWNrLCBpZiB0aGVyZSBpcyBvbmVcbiAgICAgICAgICBpZihvcGVuTW9kYWxzLmxlbmd0aD4wKSB7XG4gICAgICAgICAgICBzZWxmLnRvX2Zyb250KG9wZW5Nb2RhbHNbb3Blbk1vZGFscy5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYuaGlkZShvcGVuX21vZGFscywgc2V0dGluZ3MuY3NzLmNsb3NlLCBzZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2xvc2VfdGFyZ2V0cyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBiYXNlID0gJy4nICsgdGhpcy5zZXR0aW5ncy5kaXNtaXNzX21vZGFsX2NsYXNzO1xuXG4gICAgICBpZiAodGhpcy5zZXR0aW5ncy5jbG9zZV9vbl9iYWNrZ3JvdW5kX2NsaWNrKSB7XG4gICAgICAgIHJldHVybiBiYXNlICsgJywgLicgKyB0aGlzLnNldHRpbmdzLmJnX2NsYXNzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYmFzZTtcbiAgICB9LFxuXG4gICAgdG9nZ2xlX2JnIDogZnVuY3Rpb24gKG1vZGFsLCBzdGF0ZSkge1xuICAgICAgaWYgKHRoaXMuUygnLicgKyB0aGlzLnNldHRpbmdzLmJnX2NsYXNzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5iZyA9ICQoJzxkaXYgLz4nLCB7J2NsYXNzJzogdGhpcy5zZXR0aW5ncy5iZ19jbGFzc30pXG4gICAgICAgICAgLmFwcGVuZFRvKCdib2R5JykuaGlkZSgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdmlzaWJsZSA9IHRoaXMuc2V0dGluZ3MuYmcuZmlsdGVyKCc6dmlzaWJsZScpLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoIHN0YXRlICE9IHZpc2libGUgKSB7XG4gICAgICAgIGlmICggc3RhdGUgPT0gdW5kZWZpbmVkID8gdmlzaWJsZSA6ICFzdGF0ZSApIHtcbiAgICAgICAgICB0aGlzLmhpZGUodGhpcy5zZXR0aW5ncy5iZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zaG93KHRoaXMuc2V0dGluZ3MuYmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHNob3cgOiBmdW5jdGlvbiAoZWwsIGNzcykge1xuICAgICAgLy8gaXMgbW9kYWxcbiAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgdmFyIHNldHRpbmdzID0gZWwuZGF0YSh0aGlzLmF0dHJfbmFtZSh0cnVlKSArICctaW5pdCcpIHx8IHRoaXMuc2V0dGluZ3MsXG4gICAgICAgICAgICByb290X2VsZW1lbnQgPSBzZXR0aW5ncy5yb290X2VsZW1lbnQsXG4gICAgICAgICAgICBjb250ZXh0ID0gdGhpcztcblxuICAgICAgICBpZiAoZWwucGFyZW50KHJvb3RfZWxlbWVudCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdmFyIHBsYWNlaG9sZGVyID0gZWwud3JhcCgnPGRpdiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgLz4nKS5wYXJlbnQoKTtcblxuICAgICAgICAgIGVsLm9uKCdjbG9zZWQuZm5kdG4ucmV2ZWFsLndyYXBwZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBlbC5kZXRhY2goKS5hcHBlbmRUbyhwbGFjZWhvbGRlcik7XG4gICAgICAgICAgICBlbC51bndyYXAoKS51bmJpbmQoJ2Nsb3NlZC5mbmR0bi5yZXZlYWwud3JhcHBlZCcpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgZWwuZGV0YWNoKCkuYXBwZW5kVG8ocm9vdF9lbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhbmltRGF0YSA9IGdldEFuaW1hdGlvbkRhdGEoc2V0dGluZ3MuYW5pbWF0aW9uKTtcbiAgICAgICAgaWYgKCFhbmltRGF0YS5hbmltYXRlKSB7XG4gICAgICAgICAgdGhpcy5sb2NrZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5pbURhdGEucG9wKSB7XG4gICAgICAgICAgY3NzLnRvcCA9ICQod2luZG93KS5zY3JvbGxUb3AoKSAtIGVsLmRhdGEoJ29mZnNldCcpICsgJ3B4JztcbiAgICAgICAgICB2YXIgZW5kX2NzcyA9IHtcbiAgICAgICAgICAgIHRvcDogJCh3aW5kb3cpLnNjcm9sbFRvcCgpICsgZWwuZGF0YSgnY3NzLXRvcCcpICsgJ3B4JyxcbiAgICAgICAgICAgIG9wYWNpdHk6IDFcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsXG4gICAgICAgICAgICAgIC5jc3MoY3NzKVxuICAgICAgICAgICAgICAuYW5pbWF0ZShlbmRfY3NzLCBzZXR0aW5ncy5hbmltYXRpb25fc3BlZWQsICdsaW5lYXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5sb2NrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBlbC50cmlnZ2VyKCdvcGVuZWQuZm5kdG4ucmV2ZWFsJyk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5hZGRDbGFzcygnb3BlbicpO1xuICAgICAgICAgIH0sIHNldHRpbmdzLmFuaW1hdGlvbl9zcGVlZCAvIDIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY3NzLnRvcCA9ICQod2luZG93KS5zY3JvbGxUb3AoKSArIGVsLmRhdGEoJ2Nzcy10b3AnKSArICdweCc7XG5cbiAgICAgICAgaWYgKGFuaW1EYXRhLmZhZGUpIHtcbiAgICAgICAgICB2YXIgZW5kX2NzcyA9IHtvcGFjaXR5OiAxfTtcblxuICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBlbFxuICAgICAgICAgICAgICAuY3NzKGNzcylcbiAgICAgICAgICAgICAgLmFuaW1hdGUoZW5kX2Nzcywgc2V0dGluZ3MuYW5pbWF0aW9uX3NwZWVkLCAnbGluZWFyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQubG9ja2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZWwudHJpZ2dlcignb3BlbmVkLmZuZHRuLnJldmVhbCcpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ29wZW4nKTtcbiAgICAgICAgICB9LCBzZXR0aW5ncy5hbmltYXRpb25fc3BlZWQgLyAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbC5jc3MoY3NzKS5zaG93KCkuY3NzKHtvcGFjaXR5IDogMX0pLmFkZENsYXNzKCdvcGVuJykudHJpZ2dlcignb3BlbmVkLmZuZHRuLnJldmVhbCcpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzO1xuXG4gICAgICAvLyBzaG91bGQgd2UgYW5pbWF0ZSB0aGUgYmFja2dyb3VuZD9cbiAgICAgIGlmIChnZXRBbmltYXRpb25EYXRhKHNldHRpbmdzLmFuaW1hdGlvbikuZmFkZSkge1xuICAgICAgICByZXR1cm4gZWwuZmFkZUluKHNldHRpbmdzLmFuaW1hdGlvbl9zcGVlZCAvIDIpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlO1xuXG4gICAgICByZXR1cm4gZWwuc2hvdygpO1xuICAgIH0sXG5cbiAgICB0b19iYWNrIDogZnVuY3Rpb24oZWwpIHtcbiAgICAgIGVsLmFkZENsYXNzKCd0b2JhY2snKTtcbiAgICB9LFxuXG4gICAgdG9fZnJvbnQgOiBmdW5jdGlvbihlbCkge1xuICAgICAgZWwucmVtb3ZlQ2xhc3MoJ3RvYmFjaycpO1xuICAgIH0sXG5cbiAgICBoaWRlIDogZnVuY3Rpb24gKGVsLCBjc3MpIHtcbiAgICAgIC8vIGlzIG1vZGFsXG4gICAgICBpZiAoY3NzKSB7XG4gICAgICAgIHZhciBzZXR0aW5ncyA9IGVsLmRhdGEodGhpcy5hdHRyX25hbWUodHJ1ZSkgKyAnLWluaXQnKSxcbiAgICAgICAgICAgIGNvbnRleHQgPSB0aGlzO1xuICAgICAgICBzZXR0aW5ncyA9IHNldHRpbmdzIHx8IHRoaXMuc2V0dGluZ3M7XG5cbiAgICAgICAgdmFyIGFuaW1EYXRhID0gZ2V0QW5pbWF0aW9uRGF0YShzZXR0aW5ncy5hbmltYXRpb24pO1xuICAgICAgICBpZiAoIWFuaW1EYXRhLmFuaW1hdGUpIHtcbiAgICAgICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbmltRGF0YS5wb3ApIHtcbiAgICAgICAgICB2YXIgZW5kX2NzcyA9IHtcbiAgICAgICAgICAgIHRvcDogLSAkKHdpbmRvdykuc2Nyb2xsVG9wKCkgLSBlbC5kYXRhKCdvZmZzZXQnKSArICdweCcsXG4gICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBlbFxuICAgICAgICAgICAgICAuYW5pbWF0ZShlbmRfY3NzLCBzZXR0aW5ncy5hbmltYXRpb25fc3BlZWQsICdsaW5lYXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5sb2NrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBlbC5jc3MoY3NzKS50cmlnZ2VyKCdjbG9zZWQuZm5kdG4ucmV2ZWFsJyk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnb3BlbicpO1xuICAgICAgICAgIH0sIHNldHRpbmdzLmFuaW1hdGlvbl9zcGVlZCAvIDIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFuaW1EYXRhLmZhZGUpIHtcbiAgICAgICAgICB2YXIgZW5kX2NzcyA9IHtvcGFjaXR5IDogMH07XG5cbiAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxcbiAgICAgICAgICAgICAgLmFuaW1hdGUoZW5kX2Nzcywgc2V0dGluZ3MuYW5pbWF0aW9uX3NwZWVkLCAnbGluZWFyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQubG9ja2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZWwuY3NzKGNzcykudHJpZ2dlcignY2xvc2VkLmZuZHRuLnJldmVhbCcpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ29wZW4nKTtcbiAgICAgICAgICB9LCBzZXR0aW5ncy5hbmltYXRpb25fc3BlZWQgLyAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbC5oaWRlKCkuY3NzKGNzcykucmVtb3ZlQ2xhc3MoJ29wZW4nKS50cmlnZ2VyKCdjbG9zZWQuZm5kdG4ucmV2ZWFsJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3M7XG5cbiAgICAgIC8vIHNob3VsZCB3ZSBhbmltYXRlIHRoZSBiYWNrZ3JvdW5kP1xuICAgICAgaWYgKGdldEFuaW1hdGlvbkRhdGEoc2V0dGluZ3MuYW5pbWF0aW9uKS5mYWRlKSB7XG4gICAgICAgIHJldHVybiBlbC5mYWRlT3V0KHNldHRpbmdzLmFuaW1hdGlvbl9zcGVlZCAvIDIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZWwuaGlkZSgpO1xuICAgIH0sXG5cbiAgICBjbG9zZV92aWRlbyA6IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdmlkZW8gPSAkKCcuZmxleC12aWRlbycsIGUudGFyZ2V0KSxcbiAgICAgICAgICBpZnJhbWUgPSAkKCdpZnJhbWUnLCB2aWRlbyk7XG5cbiAgICAgIGlmIChpZnJhbWUubGVuZ3RoID4gMCkge1xuICAgICAgICBpZnJhbWUuYXR0cignZGF0YS1zcmMnLCBpZnJhbWVbMF0uc3JjKTtcbiAgICAgICAgaWZyYW1lLmF0dHIoJ3NyYycsIGlmcmFtZS5hdHRyKCdzcmMnKSk7XG4gICAgICAgIHZpZGVvLmhpZGUoKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb3Blbl92aWRlbyA6IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdmlkZW8gPSAkKCcuZmxleC12aWRlbycsIGUudGFyZ2V0KSxcbiAgICAgICAgICBpZnJhbWUgPSB2aWRlby5maW5kKCdpZnJhbWUnKTtcblxuICAgICAgaWYgKGlmcmFtZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBkYXRhX3NyYyA9IGlmcmFtZS5hdHRyKCdkYXRhLXNyYycpO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFfc3JjID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmcmFtZVswXS5zcmMgPSBpZnJhbWUuYXR0cignZGF0YS1zcmMnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc3JjID0gaWZyYW1lWzBdLnNyYztcbiAgICAgICAgICBpZnJhbWVbMF0uc3JjID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGlmcmFtZVswXS5zcmMgPSBzcmM7XG4gICAgICAgIH1cbiAgICAgICAgdmlkZW8uc2hvdygpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBkYXRhX2F0dHIgOiBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICBpZiAodGhpcy5uYW1lc3BhY2UubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2UgKyAnLScgKyBzdHI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdHI7XG4gICAgfSxcblxuICAgIGNhY2hlX29mZnNldCA6IGZ1bmN0aW9uIChtb2RhbCkge1xuICAgICAgdmFyIG9mZnNldCA9IG1vZGFsLnNob3coKS5oZWlnaHQoKSArIHBhcnNlSW50KG1vZGFsLmNzcygndG9wJyksIDEwKSArIG1vZGFsLnNjcm9sbFk7XG5cbiAgICAgIG1vZGFsLmhpZGUoKTtcblxuICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9LFxuXG4gICAgb2ZmIDogZnVuY3Rpb24gKCkge1xuICAgICAgJCh0aGlzLnNjb3BlKS5vZmYoJy5mbmR0bi5yZXZlYWwnKTtcbiAgICB9LFxuXG4gICAgcmVmbG93IDogZnVuY3Rpb24gKCkge31cbiAgfTtcblxuICAvKlxuICAgKiBnZXRBbmltYXRpb25EYXRhKCdwb3BBbmRGYWRlJykgLy8ge2FuaW1hdGU6IHRydWUsICBwb3A6IHRydWUsICBmYWRlOiB0cnVlfVxuICAgKiBnZXRBbmltYXRpb25EYXRhKCdmYWRlJykgICAgICAgLy8ge2FuaW1hdGU6IHRydWUsICBwb3A6IGZhbHNlLCBmYWRlOiB0cnVlfVxuICAgKiBnZXRBbmltYXRpb25EYXRhKCdwb3AnKSAgICAgICAgLy8ge2FuaW1hdGU6IHRydWUsICBwb3A6IHRydWUsICBmYWRlOiBmYWxzZX1cbiAgICogZ2V0QW5pbWF0aW9uRGF0YSgnZm9vJykgICAgICAgIC8vIHthbmltYXRlOiBmYWxzZSwgcG9wOiBmYWxzZSwgZmFkZTogZmFsc2V9XG4gICAqIGdldEFuaW1hdGlvbkRhdGEobnVsbCkgICAgICAgICAvLyB7YW5pbWF0ZTogZmFsc2UsIHBvcDogZmFsc2UsIGZhZGU6IGZhbHNlfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QW5pbWF0aW9uRGF0YShzdHIpIHtcbiAgICB2YXIgZmFkZSA9IC9mYWRlL2kudGVzdChzdHIpO1xuICAgIHZhciBwb3AgPSAvcG9wL2kudGVzdChzdHIpO1xuICAgIHJldHVybiB7XG4gICAgICBhbmltYXRlIDogZmFkZSB8fCBwb3AsXG4gICAgICBwb3AgOiBwb3AsXG4gICAgICBmYWRlIDogZmFkZVxuICAgIH07XG4gIH1cbn0oalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCkpO1xuIiwiOyhmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBGb3VuZGF0aW9uLmxpYnMudGFiID0ge1xuICAgIG5hbWUgOiAndGFiJyxcblxuICAgIHZlcnNpb24gOiAnNS41LjMnLFxuXG4gICAgc2V0dGluZ3MgOiB7XG4gICAgICBhY3RpdmVfY2xhc3MgOiAnYWN0aXZlJyxcbiAgICAgIGNhbGxiYWNrIDogZnVuY3Rpb24gKCkge30sXG4gICAgICBkZWVwX2xpbmtpbmcgOiBmYWxzZSxcbiAgICAgIHNjcm9sbF90b19jb250ZW50IDogdHJ1ZSxcbiAgICAgIGlzX2hvdmVyIDogZmFsc2VcbiAgICB9LFxuXG4gICAgZGVmYXVsdF90YWJfaGFzaGVzIDogW10sXG5cbiAgICBpbml0IDogZnVuY3Rpb24gKHNjb3BlLCBtZXRob2QsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgICBTID0gdGhpcy5TO1xuXG4gIFx0ICAvLyBTdG9yZSB0aGUgZGVmYXVsdCBhY3RpdmUgdGFicyB3aGljaCB3aWxsIGJlIHJlZmVyZW5jZWQgd2hlbiB0aGVcbiAgXHQgIC8vIGxvY2F0aW9uIGhhc2ggaXMgYWJzZW50LCBhcyBpbiB0aGUgY2FzZSBvZiBuYXZpZ2F0aW5nIHRoZSB0YWJzIGFuZFxuICBcdCAgLy8gcmV0dXJuaW5nIHRvIHRoZSBmaXJzdCB2aWV3aW5nIHZpYSB0aGUgYnJvd3NlciBCYWNrIGJ1dHRvbi5cbiAgXHQgIFMoJ1snICsgdGhpcy5hdHRyX25hbWUoKSArICddID4gLmFjdGl2ZSA+IGEnLCB0aGlzLnNjb3BlKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgXHQgICAgc2VsZi5kZWZhdWx0X3RhYl9oYXNoZXMucHVzaCh0aGlzLmhhc2gpO1xuICBcdCAgfSk7XG5cbiAgICAgIHRoaXMuYmluZGluZ3MobWV0aG9kLCBvcHRpb25zKTtcbiAgICAgIHRoaXMuaGFuZGxlX2xvY2F0aW9uX2hhc2hfY2hhbmdlKCk7XG4gICAgfSxcblxuICAgIGV2ZW50cyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgICBTID0gdGhpcy5TO1xuXG4gICAgICB2YXIgdXN1YWxfdGFiX2JlaGF2aW9yID0gIGZ1bmN0aW9uIChlLCB0YXJnZXQpIHtcbiAgICAgICAgdmFyIHNldHRpbmdzID0gUyh0YXJnZXQpLmNsb3Nlc3QoJ1snICsgc2VsZi5hdHRyX25hbWUoKSArICddJykuZGF0YShzZWxmLmF0dHJfbmFtZSh0cnVlKSArICctaW5pdCcpO1xuICAgICAgICBpZiAoIXNldHRpbmdzLmlzX2hvdmVyIHx8IE1vZGVybml6ci50b3VjaCkge1xuICAgICAgICAgIC8vIGlmIHVzZXIgZGlkIG5vdCBwcmVzc2VkIHRhYiBrZXksIHByZXZlbnQgZGVmYXVsdCBhY3Rpb25cbiAgICAgICAgICB2YXIga2V5Q29kZSA9IGUua2V5Q29kZSB8fCBlLndoaWNoO1xuICAgICAgICAgIGlmIChrZXlDb2RlICE9PSA5KSB7IFxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZi50b2dnbGVfYWN0aXZlX3RhYihTKHRhcmdldCkucGFyZW50KCkpO1xuICAgICAgICAgIFxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBTKHRoaXMuc2NvcGUpXG4gICAgICAgIC5vZmYoJy50YWInKVxuICAgICAgICAvLyBLZXkgZXZlbnQ6IGZvY3VzL3RhYiBrZXlcbiAgICAgICAgLm9uKCdrZXlkb3duLmZuZHRuLnRhYicsICdbJyArIHRoaXMuYXR0cl9uYW1lKCkgKyAnXSA+ICogPiBhJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgIHZhciBrZXlDb2RlID0gZS5rZXlDb2RlIHx8IGUud2hpY2g7XG4gICAgICAgICAgLy8gaWYgdXNlciBwcmVzc2VkIHRhYiBrZXlcbiAgICAgICAgICBpZiAoa2V5Q29kZSA9PT0gMTMgfHwga2V5Q29kZSA9PT0gMzIpIHsgLy8gZW50ZXIgb3Igc3BhY2VcbiAgICAgICAgICAgIHZhciBlbCA9IHRoaXM7XG4gICAgICAgICAgICB1c3VhbF90YWJfYmVoYXZpb3IoZSwgZWwpO1xuICAgICAgICAgIH0gXG4gICAgICAgIH0pXG4gICAgICAgIC8vIENsaWNrIGV2ZW50OiB0YWIgdGl0bGVcbiAgICAgICAgLm9uKCdjbGljay5mbmR0bi50YWInLCAnWycgKyB0aGlzLmF0dHJfbmFtZSgpICsgJ10gPiAqID4gYScsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICB2YXIgZWwgPSB0aGlzO1xuICAgICAgICAgIHVzdWFsX3RhYl9iZWhhdmlvcihlLCBlbCk7XG4gICAgICAgIH0pXG4gICAgICAgIC8vIEhvdmVyIGV2ZW50OiB0YWIgdGl0bGVcbiAgICAgICAgLm9uKCdtb3VzZWVudGVyLmZuZHRuLnRhYicsICdbJyArIHRoaXMuYXR0cl9uYW1lKCkgKyAnXSA+ICogPiBhJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICB2YXIgc2V0dGluZ3MgPSBTKHRoaXMpLmNsb3Nlc3QoJ1snICsgc2VsZi5hdHRyX25hbWUoKSArICddJykuZGF0YShzZWxmLmF0dHJfbmFtZSh0cnVlKSArICctaW5pdCcpO1xuICAgICAgICAgIGlmIChzZXR0aW5ncy5pc19ob3Zlcikge1xuICAgICAgICAgICAgc2VsZi50b2dnbGVfYWN0aXZlX3RhYihTKHRoaXMpLnBhcmVudCgpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBMb2NhdGlvbiBoYXNoIGNoYW5nZSBldmVudFxuICAgICAgUyh3aW5kb3cpLm9uKCdoYXNoY2hhbmdlLmZuZHRuLnRhYicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2VsZi5oYW5kbGVfbG9jYXRpb25faGFzaF9jaGFuZ2UoKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBoYW5kbGVfbG9jYXRpb25faGFzaF9jaGFuZ2UgOiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgICBTID0gdGhpcy5TO1xuXG4gICAgICBTKCdbJyArIHRoaXMuYXR0cl9uYW1lKCkgKyAnXScsIHRoaXMuc2NvcGUpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2V0dGluZ3MgPSBTKHRoaXMpLmRhdGEoc2VsZi5hdHRyX25hbWUodHJ1ZSkgKyAnLWluaXQnKTtcbiAgICAgICAgaWYgKHNldHRpbmdzLmRlZXBfbGlua2luZykge1xuICAgICAgICAgIC8vIE1hdGNoIHRoZSBsb2NhdGlvbiBoYXNoIHRvIGEgbGFiZWxcbiAgICAgICAgICB2YXIgaGFzaDtcbiAgICAgICAgICBpZiAoc2V0dGluZ3Muc2Nyb2xsX3RvX2NvbnRlbnQpIHtcbiAgICAgICAgICAgIGhhc2ggPSBzZWxmLnNjb3BlLmxvY2F0aW9uLmhhc2g7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHByZWZpeCB0aGUgaGFzaCB0byBwcmV2ZW50IGFuY2hvciBzY3JvbGxpbmdcbiAgICAgICAgICAgIGhhc2ggPSBzZWxmLnNjb3BlLmxvY2F0aW9uLmhhc2gucmVwbGFjZSgnZm5kdG4tJywgJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFzaCAhPSAnJykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgbG9jYXRpb24gaGFzaCByZWZlcmVuY2VzIGEgdGFiIGNvbnRlbnQgZGl2IG9yXG4gICAgICAgICAgICAvLyBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBhZ2UgKGluc2lkZSBvciBvdXRzaWRlIHRoZSB0YWIgY29udGVudCBkaXYpXG4gICAgICAgICAgICB2YXIgaGFzaF9lbGVtZW50ID0gUyhoYXNoKTtcbiAgICAgICAgICAgIGlmIChoYXNoX2VsZW1lbnQuaGFzQ2xhc3MoJ2NvbnRlbnQnKSAmJiBoYXNoX2VsZW1lbnQucGFyZW50KCkuaGFzQ2xhc3MoJ3RhYnMtY29udGVudCcpKSB7XG4gICAgICAgICAgICAgIC8vIFRhYiBjb250ZW50IGRpdlxuICAgICAgICAgICAgICBzZWxmLnRvZ2dsZV9hY3RpdmVfdGFiKCQoJ1snICsgc2VsZi5hdHRyX25hbWUoKSArICddID4gKiA+IGFbaHJlZj0nICsgaGFzaCArICddJykucGFyZW50KCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTm90IHRoZSB0YWIgY29udGVudCBkaXYuIElmIGluc2lkZSB0aGUgdGFiIGNvbnRlbnQsIGZpbmQgdGhlXG4gICAgICAgICAgICAgIC8vIGNvbnRhaW5pbmcgdGFiIGFuZCB0b2dnbGUgaXQgYXMgYWN0aXZlLlxuICAgICAgICAgICAgICB2YXIgaGFzaF90YWJfY29udGFpbmVyX2lkID0gaGFzaF9lbGVtZW50LmNsb3Nlc3QoJy5jb250ZW50JykuYXR0cignaWQnKTtcbiAgICAgICAgICAgICAgaWYgKGhhc2hfdGFiX2NvbnRhaW5lcl9pZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzZWxmLnRvZ2dsZV9hY3RpdmVfdGFiKCQoJ1snICsgc2VsZi5hdHRyX25hbWUoKSArICddID4gKiA+IGFbaHJlZj0jJyArIGhhc2hfdGFiX2NvbnRhaW5lcl9pZCArICddJykucGFyZW50KCksIGhhc2gpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlZmVyZW5jZSB0aGUgZGVmYXVsdCB0YWIgaGFzaGVzIHdoaWNoIHdlcmUgaW5pdGlhbGl6ZWQgaW4gdGhlIGluaXQgZnVuY3Rpb25cbiAgICAgICAgICAgIGZvciAodmFyIGluZCA9IDA7IGluZCA8IHNlbGYuZGVmYXVsdF90YWJfaGFzaGVzLmxlbmd0aDsgaW5kKyspIHtcbiAgICAgICAgICAgICAgc2VsZi50b2dnbGVfYWN0aXZlX3RhYigkKCdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnXSA+ICogPiBhW2hyZWY9JyArIHNlbGYuZGVmYXVsdF90YWJfaGFzaGVzW2luZF0gKyAnXScpLnBhcmVudCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICB9KTtcbiAgICAgfSxcblxuICAgIHRvZ2dsZV9hY3RpdmVfdGFiIDogZnVuY3Rpb24gKHRhYiwgbG9jYXRpb25faGFzaCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICAgIFMgPSBzZWxmLlMsXG4gICAgICAgICAgdGFicyA9IHRhYi5jbG9zZXN0KCdbJyArIHRoaXMuYXR0cl9uYW1lKCkgKyAnXScpLFxuICAgICAgICAgIHRhYl9saW5rID0gdGFiLmZpbmQoJ2EnKSxcbiAgICAgICAgICBhbmNob3IgPSB0YWIuY2hpbGRyZW4oJ2EnKS5maXJzdCgpLFxuICAgICAgICAgIHRhcmdldF9oYXNoID0gJyMnICsgYW5jaG9yLmF0dHIoJ2hyZWYnKS5zcGxpdCgnIycpWzFdLFxuICAgICAgICAgIHRhcmdldCA9IFModGFyZ2V0X2hhc2gpLFxuICAgICAgICAgIHNpYmxpbmdzID0gdGFiLnNpYmxpbmdzKCksXG4gICAgICAgICAgc2V0dGluZ3MgPSB0YWJzLmRhdGEodGhpcy5hdHRyX25hbWUodHJ1ZSkgKyAnLWluaXQnKSxcbiAgICAgICAgICBpbnRlcnByZXRfa2V5dXBfYWN0aW9uID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIC8vIExpZ2h0IG1vZGlmaWNhdGlvbiBvZiBIZXlkb24gUGlja2VyaW5nJ3MgUHJhY3RpY2FsIEFSSUEgRXhhbXBsZXM6IGh0dHA6Ly9oZXlkb253b3Jrcy5jb20vcHJhY3RpY2FsX2FyaWFfZXhhbXBsZXMvanMvYTExeS5qc1xuXG4gICAgICAgICAgICAvLyBkZWZpbmUgY3VycmVudCwgcHJldmlvdXMgYW5kIG5leHQgKHBvc3NpYmxlKSB0YWJzXG5cbiAgICAgICAgICAgIHZhciAkb3JpZ2luYWwgPSAkKHRoaXMpO1xuICAgICAgICAgICAgdmFyICRwcmV2ID0gJCh0aGlzKS5wYXJlbnRzKCdsaScpLnByZXYoKS5jaGlsZHJlbignW3JvbGU9XCJ0YWJcIl0nKTtcbiAgICAgICAgICAgIHZhciAkbmV4dCA9ICQodGhpcykucGFyZW50cygnbGknKS5uZXh0KCkuY2hpbGRyZW4oJ1tyb2xlPVwidGFiXCJdJyk7XG4gICAgICAgICAgICB2YXIgJHRhcmdldDtcblxuICAgICAgICAgICAgLy8gZmluZCB0aGUgZGlyZWN0aW9uIChwcmV2IG9yIG5leHQpXG5cbiAgICAgICAgICAgIHN3aXRjaCAoZS5rZXlDb2RlKSB7XG4gICAgICAgICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICAgICAgJHRhcmdldCA9ICRwcmV2O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgICAgICAgICR0YXJnZXQgPSAkbmV4dDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAkdGFyZ2V0ID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoJHRhcmdldC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgJG9yaWdpbmFsLmF0dHIoe1xuICAgICAgICAgICAgICAgICd0YWJpbmRleCcgOiAnLTEnLFxuICAgICAgICAgICAgICAgICdhcmlhLXNlbGVjdGVkJyA6IG51bGxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICR0YXJnZXQuYXR0cih7XG4gICAgICAgICAgICAgICAgJ3RhYmluZGV4JyA6ICcwJyxcbiAgICAgICAgICAgICAgICAnYXJpYS1zZWxlY3RlZCcgOiB0cnVlXG4gICAgICAgICAgICAgIH0pLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEhpZGUgcGFuZWxzXG5cbiAgICAgICAgICAgICQoJ1tyb2xlPVwidGFicGFuZWxcIl0nKVxuICAgICAgICAgICAgICAuYXR0cignYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuXG4gICAgICAgICAgICAvLyBTaG93IHBhbmVsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRhcmdldFxuXG4gICAgICAgICAgICAkKCcjJyArICQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkuYXR0cignaHJlZicpLnN1YnN0cmluZygxKSlcbiAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtaGlkZGVuJywgbnVsbCk7XG5cbiAgICAgICAgICB9LFxuICAgICAgICAgIGdvX3RvX2hhc2ggPSBmdW5jdGlvbihoYXNoKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjb3JyZWN0IGJlaGF2aW91ciBvZiB0aGUgYnJvd3NlcidzIGJhY2sgYnV0dG9uIHdoZW4gZGVlcCBsaW5raW5nIGlzIGVuYWJsZWQuIFdpdGhvdXQgaXRcbiAgICAgICAgICAgIC8vIHRoZSB1c2VyIHdvdWxkIGdldCBjb250aW51YWxseSByZWRpcmVjdGVkIHRvIHRoZSBkZWZhdWx0IGhhc2guXG4gICAgICAgICAgICB2YXIgZGVmYXVsdF9oYXNoID0gc2V0dGluZ3Muc2Nyb2xsX3RvX2NvbnRlbnQgPyBzZWxmLmRlZmF1bHRfdGFiX2hhc2hlc1swXSA6ICdmbmR0bi0nICsgc2VsZi5kZWZhdWx0X3RhYl9oYXNoZXNbMF0ucmVwbGFjZSgnIycsICcnKTtcblxuICAgICAgICAgICAgaWYgKGhhc2ggIT09IGRlZmF1bHRfaGFzaCB8fCB3aW5kb3cubG9jYXRpb24uaGFzaCkge1xuICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGhhc2g7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgLy8gYWxsb3cgdXNhZ2Ugb2YgZGF0YS10YWItY29udGVudCBhdHRyaWJ1dGUgaW5zdGVhZCBvZiBocmVmXG4gICAgICBpZiAoYW5jaG9yLmRhdGEoJ3RhYi1jb250ZW50JykpIHtcbiAgICAgICAgdGFyZ2V0X2hhc2ggPSAnIycgKyBhbmNob3IuZGF0YSgndGFiLWNvbnRlbnQnKS5zcGxpdCgnIycpWzFdO1xuICAgICAgICB0YXJnZXQgPSBTKHRhcmdldF9oYXNoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNldHRpbmdzLmRlZXBfbGlua2luZykge1xuXG4gICAgICAgIGlmIChzZXR0aW5ncy5zY3JvbGxfdG9fY29udGVudCkge1xuXG4gICAgICAgICAgLy8gcmV0YWluIGN1cnJlbnQgaGFzaCB0byBzY3JvbGwgdG8gY29udGVudFxuICAgICAgICAgIGdvX3RvX2hhc2gobG9jYXRpb25faGFzaCB8fCB0YXJnZXRfaGFzaCk7XG5cbiAgICAgICAgICBpZiAobG9jYXRpb25faGFzaCA9PSB1bmRlZmluZWQgfHwgbG9jYXRpb25faGFzaCA9PSB0YXJnZXRfaGFzaCkge1xuICAgICAgICAgICAgdGFiLnBhcmVudCgpWzBdLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFModGFyZ2V0X2hhc2gpWzBdLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHByZWZpeCB0aGUgaGFzaGVzIHNvIHRoYXQgdGhlIGJyb3dzZXIgZG9lc24ndCBzY3JvbGwgZG93blxuICAgICAgICAgIGlmIChsb2NhdGlvbl9oYXNoICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZ29fdG9faGFzaCgnZm5kdG4tJyArIGxvY2F0aW9uX2hhc2gucmVwbGFjZSgnIycsICcnKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdvX3RvX2hhc2goJ2ZuZHRuLScgKyB0YXJnZXRfaGFzaC5yZXBsYWNlKCcjJywgJycpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gV0FSTklORzogVGhlIGFjdGl2YXRpb24gYW5kIGRlYWN0aXZhdGlvbiBvZiB0aGUgdGFiIGNvbnRlbnQgbXVzdFxuICAgICAgLy8gb2NjdXIgYWZ0ZXIgdGhlIGRlZXAgbGlua2luZyBpbiBvcmRlciB0byBwcm9wZXJseSByZWZyZXNoIHRoZSBicm93c2VyXG4gICAgICAvLyB3aW5kb3cgKG5vdGFibHkgaW4gQ2hyb21lKS5cbiAgICAgIC8vIENsZWFuIHVwIG11bHRpcGxlIGF0dHIgaW5zdGFuY2VzIHRvIGRvbmUgb25jZVxuICAgICAgdGFiLmFkZENsYXNzKHNldHRpbmdzLmFjdGl2ZV9jbGFzcykudHJpZ2dlckhhbmRsZXIoJ29wZW5lZCcpO1xuICAgICAgdGFiX2xpbmsuYXR0cih7J2FyaWEtc2VsZWN0ZWQnIDogJ3RydWUnLCAgdGFiaW5kZXggOiAwfSk7XG4gICAgICBzaWJsaW5ncy5yZW1vdmVDbGFzcyhzZXR0aW5ncy5hY3RpdmVfY2xhc3MpXG4gICAgICBzaWJsaW5ncy5maW5kKCdhJykuYXR0cih7J2FyaWEtc2VsZWN0ZWQnIDogJ2ZhbHNlJy8qLCAgdGFiaW5kZXggOiAtMSovfSk7XG4gICAgICB0YXJnZXQuc2libGluZ3MoKS5yZW1vdmVDbGFzcyhzZXR0aW5ncy5hY3RpdmVfY2xhc3MpLmF0dHIoeydhcmlhLWhpZGRlbicgOiAndHJ1ZScvKiwgIHRhYmluZGV4IDogLTEqL30pO1xuICAgICAgdGFyZ2V0LmFkZENsYXNzKHNldHRpbmdzLmFjdGl2ZV9jbGFzcykuYXR0cignYXJpYS1oaWRkZW4nLCAnZmFsc2UnKS5yZW1vdmVBdHRyKCd0YWJpbmRleCcpO1xuICAgICAgc2V0dGluZ3MuY2FsbGJhY2sodGFiKTtcbiAgICAgIHRhcmdldC50cmlnZ2VySGFuZGxlcigndG9nZ2xlZCcsIFt0YXJnZXRdKTtcbiAgICAgIHRhYnMudHJpZ2dlckhhbmRsZXIoJ3RvZ2dsZWQnLCBbdGFiXSk7XG5cbiAgICAgIHRhYl9saW5rLm9mZigna2V5ZG93bicpLm9uKCdrZXlkb3duJywgaW50ZXJwcmV0X2tleXVwX2FjdGlvbiApO1xuICAgIH0sXG5cbiAgICBkYXRhX2F0dHIgOiBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICBpZiAodGhpcy5uYW1lc3BhY2UubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2UgKyAnLScgKyBzdHI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdHI7XG4gICAgfSxcblxuICAgIG9mZiA6IGZ1bmN0aW9uICgpIHt9LFxuXG4gICAgcmVmbG93IDogZnVuY3Rpb24gKCkge31cbiAgfTtcbn0oalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQgbm8taW52YWxpZC10aGlzOiAxICovXG5cbnZhciBFUlJPUl9NRVNTQUdFID0gJ0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgJztcbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgZnVuY1R5cGUgPSAnW29iamVjdCBGdW5jdGlvbl0nO1xuXG52YXIgY29uY2F0dHkgPSBmdW5jdGlvbiBjb25jYXR0eShhLCBiKSB7XG4gICAgdmFyIGFyciA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGFycltpXSA9IGFbaV07XG4gICAgfVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgYi5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICBhcnJbaiArIGEubGVuZ3RoXSA9IGJbal07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycjtcbn07XG5cbnZhciBzbGljeSA9IGZ1bmN0aW9uIHNsaWN5KGFyckxpa2UsIG9mZnNldCkge1xuICAgIHZhciBhcnIgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gb2Zmc2V0IHx8IDAsIGogPSAwOyBpIDwgYXJyTGlrZS5sZW5ndGg7IGkgKz0gMSwgaiArPSAxKSB7XG4gICAgICAgIGFycltqXSA9IGFyckxpa2VbaV07XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG59O1xuXG52YXIgam9pbnkgPSBmdW5jdGlvbiAoYXJyLCBqb2luZXIpIHtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgc3RyICs9IGFycltpXTtcbiAgICAgICAgaWYgKGkgKyAxIDwgYXJyLmxlbmd0aCkge1xuICAgICAgICAgICAgc3RyICs9IGpvaW5lcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiaW5kKHRoYXQpIHtcbiAgICB2YXIgdGFyZ2V0ID0gdGhpcztcbiAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gJ2Z1bmN0aW9uJyB8fCB0b1N0ci5hcHBseSh0YXJnZXQpICE9PSBmdW5jVHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUk9SX01FU1NBR0UgKyB0YXJnZXQpO1xuICAgIH1cbiAgICB2YXIgYXJncyA9IHNsaWN5KGFyZ3VtZW50cywgMSk7XG5cbiAgICB2YXIgYm91bmQ7XG4gICAgdmFyIGJpbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBib3VuZCkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRhcmdldC5hcHBseShcbiAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgIGNvbmNhdHR5KGFyZ3MsIGFyZ3VtZW50cylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoT2JqZWN0KHJlc3VsdCkgPT09IHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KFxuICAgICAgICAgICAgdGhhdCxcbiAgICAgICAgICAgIGNvbmNhdHR5KGFyZ3MsIGFyZ3VtZW50cylcbiAgICAgICAgKTtcblxuICAgIH07XG5cbiAgICB2YXIgYm91bmRMZW5ndGggPSBtYXgoMCwgdGFyZ2V0Lmxlbmd0aCAtIGFyZ3MubGVuZ3RoKTtcbiAgICB2YXIgYm91bmRBcmdzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib3VuZExlbmd0aDsgaSsrKSB7XG4gICAgICAgIGJvdW5kQXJnc1tpXSA9ICckJyArIGk7XG4gICAgfVxuXG4gICAgYm91bmQgPSBGdW5jdGlvbignYmluZGVyJywgJ3JldHVybiBmdW5jdGlvbiAoJyArIGpvaW55KGJvdW5kQXJncywgJywnKSArICcpeyByZXR1cm4gYmluZGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsgfScpKGJpbmRlcik7XG5cbiAgICBpZiAodGFyZ2V0LnByb3RvdHlwZSkge1xuICAgICAgICB2YXIgRW1wdHkgPSBmdW5jdGlvbiBFbXB0eSgpIHt9O1xuICAgICAgICBFbXB0eS5wcm90b3R5cGUgPSB0YXJnZXQucHJvdG90eXBlO1xuICAgICAgICBib3VuZC5wcm90b3R5cGUgPSBuZXcgRW1wdHkoKTtcbiAgICAgICAgRW1wdHkucHJvdG90eXBlID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gYm91bmQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgfHwgaW1wbGVtZW50YXRpb247XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1bmRlZmluZWQ7XG5cbnZhciAkT2JqZWN0ID0gcmVxdWlyZSgnZXMtb2JqZWN0LWF0b21zJyk7XG5cbnZhciAkRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMnKTtcbnZhciAkRXZhbEVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL2V2YWwnKTtcbnZhciAkUmFuZ2VFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy9yYW5nZScpO1xudmFyICRSZWZlcmVuY2VFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy9yZWYnKTtcbnZhciAkU3ludGF4RXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvc3ludGF4Jyk7XG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG52YXIgJFVSSUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3VyaScpO1xuXG52YXIgYWJzID0gcmVxdWlyZSgnbWF0aC1pbnRyaW5zaWNzL2FicycpO1xudmFyIGZsb29yID0gcmVxdWlyZSgnbWF0aC1pbnRyaW5zaWNzL2Zsb29yJyk7XG52YXIgbWF4ID0gcmVxdWlyZSgnbWF0aC1pbnRyaW5zaWNzL21heCcpO1xudmFyIG1pbiA9IHJlcXVpcmUoJ21hdGgtaW50cmluc2ljcy9taW4nKTtcbnZhciBwb3cgPSByZXF1aXJlKCdtYXRoLWludHJpbnNpY3MvcG93Jyk7XG52YXIgcm91bmQgPSByZXF1aXJlKCdtYXRoLWludHJpbnNpY3Mvcm91bmQnKTtcbnZhciBzaWduID0gcmVxdWlyZSgnbWF0aC1pbnRyaW5zaWNzL3NpZ24nKTtcblxudmFyICRGdW5jdGlvbiA9IEZ1bmN0aW9uO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbnZhciBnZXRFdmFsbGVkQ29uc3RydWN0b3IgPSBmdW5jdGlvbiAoZXhwcmVzc2lvblN5bnRheCkge1xuXHR0cnkge1xuXHRcdHJldHVybiAkRnVuY3Rpb24oJ1widXNlIHN0cmljdFwiOyByZXR1cm4gKCcgKyBleHByZXNzaW9uU3ludGF4ICsgJykuY29uc3RydWN0b3I7JykoKTtcblx0fSBjYXRjaCAoZSkge31cbn07XG5cbnZhciAkZ09QRCA9IHJlcXVpcmUoJ2dvcGQnKTtcbnZhciAkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCdlcy1kZWZpbmUtcHJvcGVydHknKTtcblxudmFyIHRocm93VHlwZUVycm9yID0gZnVuY3Rpb24gKCkge1xuXHR0aHJvdyBuZXcgJFR5cGVFcnJvcigpO1xufTtcbnZhciBUaHJvd1R5cGVFcnJvciA9ICRnT1BEXG5cdD8gKGZ1bmN0aW9uICgpIHtcblx0XHR0cnkge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9ucywgbm8tY2FsbGVyLCBuby1yZXN0cmljdGVkLXByb3BlcnRpZXNcblx0XHRcdGFyZ3VtZW50cy5jYWxsZWU7IC8vIElFIDggZG9lcyBub3QgdGhyb3cgaGVyZVxuXHRcdFx0cmV0dXJuIHRocm93VHlwZUVycm9yO1xuXHRcdH0gY2F0Y2ggKGNhbGxlZVRocm93cykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Ly8gSUUgOCB0aHJvd3Mgb24gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhcmd1bWVudHMsICcnKVxuXHRcdFx0XHRyZXR1cm4gJGdPUEQoYXJndW1lbnRzLCAnY2FsbGVlJykuZ2V0O1xuXHRcdFx0fSBjYXRjaCAoZ09QRHRocm93cykge1xuXHRcdFx0XHRyZXR1cm4gdGhyb3dUeXBlRXJyb3I7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KCkpXG5cdDogdGhyb3dUeXBlRXJyb3I7XG5cbnZhciBoYXNTeW1ib2xzID0gcmVxdWlyZSgnaGFzLXN5bWJvbHMnKSgpO1xuXG52YXIgZ2V0UHJvdG8gPSByZXF1aXJlKCdnZXQtcHJvdG8nKTtcbnZhciAkT2JqZWN0R1BPID0gcmVxdWlyZSgnZ2V0LXByb3RvL09iamVjdC5nZXRQcm90b3R5cGVPZicpO1xudmFyICRSZWZsZWN0R1BPID0gcmVxdWlyZSgnZ2V0LXByb3RvL1JlZmxlY3QuZ2V0UHJvdG90eXBlT2YnKTtcblxudmFyICRhcHBseSA9IHJlcXVpcmUoJ2NhbGwtYmluZC1hcHBseS1oZWxwZXJzL2Z1bmN0aW9uQXBwbHknKTtcbnZhciAkY2FsbCA9IHJlcXVpcmUoJ2NhbGwtYmluZC1hcHBseS1oZWxwZXJzL2Z1bmN0aW9uQ2FsbCcpO1xuXG52YXIgbmVlZHNFdmFsID0ge307XG5cbnZhciBUeXBlZEFycmF5ID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnIHx8ICFnZXRQcm90byA/IHVuZGVmaW5lZCA6IGdldFByb3RvKFVpbnQ4QXJyYXkpO1xuXG52YXIgSU5UUklOU0lDUyA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHQnJUFnZ3JlZ2F0ZUVycm9yJSc6IHR5cGVvZiBBZ2dyZWdhdGVFcnJvciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBZ2dyZWdhdGVFcnJvcixcblx0JyVBcnJheSUnOiBBcnJheSxcblx0JyVBcnJheUJ1ZmZlciUnOiB0eXBlb2YgQXJyYXlCdWZmZXIgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQXJyYXlCdWZmZXIsXG5cdCclQXJyYXlJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzICYmIGdldFByb3RvID8gZ2V0UHJvdG8oW11bU3ltYm9sLml0ZXJhdG9yXSgpKSA6IHVuZGVmaW5lZCxcblx0JyVBc3luY0Zyb21TeW5jSXRlcmF0b3JQcm90b3R5cGUlJzogdW5kZWZpbmVkLFxuXHQnJUFzeW5jRnVuY3Rpb24lJzogbmVlZHNFdmFsLFxuXHQnJUFzeW5jR2VuZXJhdG9yJSc6IG5lZWRzRXZhbCxcblx0JyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJSc6IG5lZWRzRXZhbCxcblx0JyVBc3luY0l0ZXJhdG9yUHJvdG90eXBlJSc6IG5lZWRzRXZhbCxcblx0JyVBdG9taWNzJSc6IHR5cGVvZiBBdG9taWNzID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEF0b21pY3MsXG5cdCclQmlnSW50JSc6IHR5cGVvZiBCaWdJbnQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQmlnSW50LFxuXHQnJUJpZ0ludDY0QXJyYXklJzogdHlwZW9mIEJpZ0ludDY0QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQmlnSW50NjRBcnJheSxcblx0JyVCaWdVaW50NjRBcnJheSUnOiB0eXBlb2YgQmlnVWludDY0QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQmlnVWludDY0QXJyYXksXG5cdCclQm9vbGVhbiUnOiBCb29sZWFuLFxuXHQnJURhdGFWaWV3JSc6IHR5cGVvZiBEYXRhVmlldyA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBEYXRhVmlldyxcblx0JyVEYXRlJSc6IERhdGUsXG5cdCclZGVjb2RlVVJJJSc6IGRlY29kZVVSSSxcblx0JyVkZWNvZGVVUklDb21wb25lbnQlJzogZGVjb2RlVVJJQ29tcG9uZW50LFxuXHQnJWVuY29kZVVSSSUnOiBlbmNvZGVVUkksXG5cdCclZW5jb2RlVVJJQ29tcG9uZW50JSc6IGVuY29kZVVSSUNvbXBvbmVudCxcblx0JyVFcnJvciUnOiAkRXJyb3IsXG5cdCclZXZhbCUnOiBldmFsLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWV2YWxcblx0JyVFdmFsRXJyb3IlJzogJEV2YWxFcnJvcixcblx0JyVGbG9hdDE2QXJyYXklJzogdHlwZW9mIEZsb2F0MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBGbG9hdDE2QXJyYXksXG5cdCclRmxvYXQzMkFycmF5JSc6IHR5cGVvZiBGbG9hdDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmxvYXQzMkFycmF5LFxuXHQnJUZsb2F0NjRBcnJheSUnOiB0eXBlb2YgRmxvYXQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0NjRBcnJheSxcblx0JyVGaW5hbGl6YXRpb25SZWdpc3RyeSUnOiB0eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmluYWxpemF0aW9uUmVnaXN0cnksXG5cdCclRnVuY3Rpb24lJzogJEZ1bmN0aW9uLFxuXHQnJUdlbmVyYXRvckZ1bmN0aW9uJSc6IG5lZWRzRXZhbCxcblx0JyVJbnQ4QXJyYXklJzogdHlwZW9mIEludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQ4QXJyYXksXG5cdCclSW50MTZBcnJheSUnOiB0eXBlb2YgSW50MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQxNkFycmF5LFxuXHQnJUludDMyQXJyYXklJzogdHlwZW9mIEludDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MzJBcnJheSxcblx0JyVpc0Zpbml0ZSUnOiBpc0Zpbml0ZSxcblx0JyVpc05hTiUnOiBpc05hTixcblx0JyVJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzICYmIGdldFByb3RvID8gZ2V0UHJvdG8oZ2V0UHJvdG8oW11bU3ltYm9sLml0ZXJhdG9yXSgpKSkgOiB1bmRlZmluZWQsXG5cdCclSlNPTiUnOiB0eXBlb2YgSlNPTiA9PT0gJ29iamVjdCcgPyBKU09OIDogdW5kZWZpbmVkLFxuXHQnJU1hcCUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IE1hcCxcblx0JyVNYXBJdGVyYXRvclByb3RvdHlwZSUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyB8fCAhaGFzU3ltYm9scyB8fCAhZ2V0UHJvdG8gPyB1bmRlZmluZWQgOiBnZXRQcm90byhuZXcgTWFwKClbU3ltYm9sLml0ZXJhdG9yXSgpKSxcblx0JyVNYXRoJSc6IE1hdGgsXG5cdCclTnVtYmVyJSc6IE51bWJlcixcblx0JyVPYmplY3QlJzogJE9iamVjdCxcblx0JyVPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJSc6ICRnT1BELFxuXHQnJXBhcnNlRmxvYXQlJzogcGFyc2VGbG9hdCxcblx0JyVwYXJzZUludCUnOiBwYXJzZUludCxcblx0JyVQcm9taXNlJSc6IHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFByb21pc2UsXG5cdCclUHJveHklJzogdHlwZW9mIFByb3h5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFByb3h5LFxuXHQnJVJhbmdlRXJyb3IlJzogJFJhbmdlRXJyb3IsXG5cdCclUmVmZXJlbmNlRXJyb3IlJzogJFJlZmVyZW5jZUVycm9yLFxuXHQnJVJlZmxlY3QlJzogdHlwZW9mIFJlZmxlY3QgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUmVmbGVjdCxcblx0JyVSZWdFeHAlJzogUmVnRXhwLFxuXHQnJVNldCUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFNldCxcblx0JyVTZXRJdGVyYXRvclByb3RvdHlwZSUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyB8fCAhaGFzU3ltYm9scyB8fCAhZ2V0UHJvdG8gPyB1bmRlZmluZWQgOiBnZXRQcm90byhuZXcgU2V0KClbU3ltYm9sLml0ZXJhdG9yXSgpKSxcblx0JyVTaGFyZWRBcnJheUJ1ZmZlciUnOiB0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogU2hhcmVkQXJyYXlCdWZmZXIsXG5cdCclU3RyaW5nJSc6IFN0cmluZyxcblx0JyVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzICYmIGdldFByb3RvID8gZ2V0UHJvdG8oJydbU3ltYm9sLml0ZXJhdG9yXSgpKSA6IHVuZGVmaW5lZCxcblx0JyVTeW1ib2wlJzogaGFzU3ltYm9scyA/IFN5bWJvbCA6IHVuZGVmaW5lZCxcblx0JyVTeW50YXhFcnJvciUnOiAkU3ludGF4RXJyb3IsXG5cdCclVGhyb3dUeXBlRXJyb3IlJzogVGhyb3dUeXBlRXJyb3IsXG5cdCclVHlwZWRBcnJheSUnOiBUeXBlZEFycmF5LFxuXHQnJVR5cGVFcnJvciUnOiAkVHlwZUVycm9yLFxuXHQnJVVpbnQ4QXJyYXklJzogdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDhBcnJheSxcblx0JyVVaW50OENsYW1wZWRBcnJheSUnOiB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDhDbGFtcGVkQXJyYXksXG5cdCclVWludDE2QXJyYXklJzogdHlwZW9mIFVpbnQxNkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQxNkFycmF5LFxuXHQnJVVpbnQzMkFycmF5JSc6IHR5cGVvZiBVaW50MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50MzJBcnJheSxcblx0JyVVUklFcnJvciUnOiAkVVJJRXJyb3IsXG5cdCclV2Vha01hcCUnOiB0eXBlb2YgV2Vha01hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrTWFwLFxuXHQnJVdlYWtSZWYlJzogdHlwZW9mIFdlYWtSZWYgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha1JlZixcblx0JyVXZWFrU2V0JSc6IHR5cGVvZiBXZWFrU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtTZXQsXG5cblx0JyVGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCUnOiAkY2FsbCxcblx0JyVGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHklJzogJGFwcGx5LFxuXHQnJU9iamVjdC5kZWZpbmVQcm9wZXJ0eSUnOiAkZGVmaW5lUHJvcGVydHksXG5cdCclT2JqZWN0LmdldFByb3RvdHlwZU9mJSc6ICRPYmplY3RHUE8sXG5cdCclTWF0aC5hYnMlJzogYWJzLFxuXHQnJU1hdGguZmxvb3IlJzogZmxvb3IsXG5cdCclTWF0aC5tYXglJzogbWF4LFxuXHQnJU1hdGgubWluJSc6IG1pbixcblx0JyVNYXRoLnBvdyUnOiBwb3csXG5cdCclTWF0aC5yb3VuZCUnOiByb3VuZCxcblx0JyVNYXRoLnNpZ24lJzogc2lnbixcblx0JyVSZWZsZWN0LmdldFByb3RvdHlwZU9mJSc6ICRSZWZsZWN0R1BPXG59O1xuXG5pZiAoZ2V0UHJvdG8pIHtcblx0dHJ5IHtcblx0XHRudWxsLmVycm9yOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2hhZG93cmVhbG0vcHVsbC8zODQjaXNzdWVjb21tZW50LTEzNjQyNjQyMjlcblx0XHR2YXIgZXJyb3JQcm90byA9IGdldFByb3RvKGdldFByb3RvKGUpKTtcblx0XHRJTlRSSU5TSUNTWyclRXJyb3IucHJvdG90eXBlJSddID0gZXJyb3JQcm90bztcblx0fVxufVxuXG52YXIgZG9FdmFsID0gZnVuY3Rpb24gZG9FdmFsKG5hbWUpIHtcblx0dmFyIHZhbHVlO1xuXHRpZiAobmFtZSA9PT0gJyVBc3luY0Z1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24gKCkge30nKTtcblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUdlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvciUnKSB7XG5cdFx0dmFyIGZuID0gZG9FdmFsKCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnKTtcblx0XHRpZiAoZm4pIHtcblx0XHRcdHZhbHVlID0gZm4ucHJvdG90eXBlO1xuXHRcdH1cblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJykge1xuXHRcdHZhciBnZW4gPSBkb0V2YWwoJyVBc3luY0dlbmVyYXRvciUnKTtcblx0XHRpZiAoZ2VuICYmIGdldFByb3RvKSB7XG5cdFx0XHR2YWx1ZSA9IGdldFByb3RvKGdlbi5wcm90b3R5cGUpO1xuXHRcdH1cblx0fVxuXG5cdElOVFJJTlNJQ1NbbmFtZV0gPSB2YWx1ZTtcblxuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgTEVHQUNZX0FMSUFTRVMgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0JyVBcnJheUJ1ZmZlclByb3RvdHlwZSUnOiBbJ0FycmF5QnVmZmVyJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFycmF5UHJvdG90eXBlJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclQXJyYXlQcm90b19lbnRyaWVzJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ2VudHJpZXMnXSxcblx0JyVBcnJheVByb3RvX2ZvckVhY2glJzogWydBcnJheScsICdwcm90b3R5cGUnLCAnZm9yRWFjaCddLFxuXHQnJUFycmF5UHJvdG9fa2V5cyUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICdrZXlzJ10sXG5cdCclQXJyYXlQcm90b192YWx1ZXMlJzogWydBcnJheScsICdwcm90b3R5cGUnLCAndmFsdWVzJ10sXG5cdCclQXN5bmNGdW5jdGlvblByb3RvdHlwZSUnOiBbJ0FzeW5jRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclQXN5bmNHZW5lcmF0b3IlJzogWydBc3luY0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFzeW5jR2VuZXJhdG9yUHJvdG90eXBlJSc6IFsnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnLCAncHJvdG90eXBlJ10sXG5cdCclQm9vbGVhblByb3RvdHlwZSUnOiBbJ0Jvb2xlYW4nLCAncHJvdG90eXBlJ10sXG5cdCclRGF0YVZpZXdQcm90b3R5cGUlJzogWydEYXRhVmlldycsICdwcm90b3R5cGUnXSxcblx0JyVEYXRlUHJvdG90eXBlJSc6IFsnRGF0ZScsICdwcm90b3R5cGUnXSxcblx0JyVFcnJvclByb3RvdHlwZSUnOiBbJ0Vycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJUV2YWxFcnJvclByb3RvdHlwZSUnOiBbJ0V2YWxFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVGbG9hdDMyQXJyYXlQcm90b3R5cGUlJzogWydGbG9hdDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclRmxvYXQ2NEFycmF5UHJvdG90eXBlJSc6IFsnRmxvYXQ2NEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUZ1bmN0aW9uUHJvdG90eXBlJSc6IFsnRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclR2VuZXJhdG9yJSc6IFsnR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclR2VuZXJhdG9yUHJvdG90eXBlJSc6IFsnR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJywgJ3Byb3RvdHlwZSddLFxuXHQnJUludDhBcnJheVByb3RvdHlwZSUnOiBbJ0ludDhBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQxNkFycmF5UHJvdG90eXBlJSc6IFsnSW50MTZBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQzMkFycmF5UHJvdG90eXBlJSc6IFsnSW50MzJBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVKU09OUGFyc2UlJzogWydKU09OJywgJ3BhcnNlJ10sXG5cdCclSlNPTlN0cmluZ2lmeSUnOiBbJ0pTT04nLCAnc3RyaW5naWZ5J10sXG5cdCclTWFwUHJvdG90eXBlJSc6IFsnTWFwJywgJ3Byb3RvdHlwZSddLFxuXHQnJU51bWJlclByb3RvdHlwZSUnOiBbJ051bWJlcicsICdwcm90b3R5cGUnXSxcblx0JyVPYmplY3RQcm90b3R5cGUlJzogWydPYmplY3QnLCAncHJvdG90eXBlJ10sXG5cdCclT2JqUHJvdG9fdG9TdHJpbmclJzogWydPYmplY3QnLCAncHJvdG90eXBlJywgJ3RvU3RyaW5nJ10sXG5cdCclT2JqUHJvdG9fdmFsdWVPZiUnOiBbJ09iamVjdCcsICdwcm90b3R5cGUnLCAndmFsdWVPZiddLFxuXHQnJVByb21pc2VQcm90b3R5cGUlJzogWydQcm9taXNlJywgJ3Byb3RvdHlwZSddLFxuXHQnJVByb21pc2VQcm90b190aGVuJSc6IFsnUHJvbWlzZScsICdwcm90b3R5cGUnLCAndGhlbiddLFxuXHQnJVByb21pc2VfYWxsJSc6IFsnUHJvbWlzZScsICdhbGwnXSxcblx0JyVQcm9taXNlX3JlamVjdCUnOiBbJ1Byb21pc2UnLCAncmVqZWN0J10sXG5cdCclUHJvbWlzZV9yZXNvbHZlJSc6IFsnUHJvbWlzZScsICdyZXNvbHZlJ10sXG5cdCclUmFuZ2VFcnJvclByb3RvdHlwZSUnOiBbJ1JhbmdlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclUmVmZXJlbmNlRXJyb3JQcm90b3R5cGUlJzogWydSZWZlcmVuY2VFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVSZWdFeHBQcm90b3R5cGUlJzogWydSZWdFeHAnLCAncHJvdG90eXBlJ10sXG5cdCclU2V0UHJvdG90eXBlJSc6IFsnU2V0JywgJ3Byb3RvdHlwZSddLFxuXHQnJVNoYXJlZEFycmF5QnVmZmVyUHJvdG90eXBlJSc6IFsnU2hhcmVkQXJyYXlCdWZmZXInLCAncHJvdG90eXBlJ10sXG5cdCclU3RyaW5nUHJvdG90eXBlJSc6IFsnU3RyaW5nJywgJ3Byb3RvdHlwZSddLFxuXHQnJVN5bWJvbFByb3RvdHlwZSUnOiBbJ1N5bWJvbCcsICdwcm90b3R5cGUnXSxcblx0JyVTeW50YXhFcnJvclByb3RvdHlwZSUnOiBbJ1N5bnRheEVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVR5cGVkQXJyYXlQcm90b3R5cGUlJzogWydUeXBlZEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVR5cGVFcnJvclByb3RvdHlwZSUnOiBbJ1R5cGVFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVVaW50OEFycmF5UHJvdG90eXBlJSc6IFsnVWludDhBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQ4Q2xhbXBlZEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQxNkFycmF5UHJvdG90eXBlJSc6IFsnVWludDE2QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVWludDMyQXJyYXlQcm90b3R5cGUlJzogWydVaW50MzJBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVUklFcnJvclByb3RvdHlwZSUnOiBbJ1VSSUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVdlYWtNYXBQcm90b3R5cGUlJzogWydXZWFrTWFwJywgJ3Byb3RvdHlwZSddLFxuXHQnJVdlYWtTZXRQcm90b3R5cGUlJzogWydXZWFrU2V0JywgJ3Byb3RvdHlwZSddXG59O1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCdoYXNvd24nKTtcbnZhciAkY29uY2F0ID0gYmluZC5jYWxsKCRjYWxsLCBBcnJheS5wcm90b3R5cGUuY29uY2F0KTtcbnZhciAkc3BsaWNlQXBwbHkgPSBiaW5kLmNhbGwoJGFwcGx5LCBBcnJheS5wcm90b3R5cGUuc3BsaWNlKTtcbnZhciAkcmVwbGFjZSA9IGJpbmQuY2FsbCgkY2FsbCwgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKTtcbnZhciAkc3RyU2xpY2UgPSBiaW5kLmNhbGwoJGNhbGwsIFN0cmluZy5wcm90b3R5cGUuc2xpY2UpO1xudmFyICRleGVjID0gYmluZC5jYWxsKCRjYWxsLCBSZWdFeHAucHJvdG90eXBlLmV4ZWMpO1xuXG4vKiBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi80LjE3LjE1L2Rpc3QvbG9kYXNoLmpzI0w2NzM1LUw2NzQ0ICovXG52YXIgcmVQcm9wTmFtZSA9IC9bXiUuW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JSQpKS9nO1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nOyAvKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciBzdHJpbmdUb1BhdGggPSBmdW5jdGlvbiBzdHJpbmdUb1BhdGgoc3RyaW5nKSB7XG5cdHZhciBmaXJzdCA9ICRzdHJTbGljZShzdHJpbmcsIDAsIDEpO1xuXHR2YXIgbGFzdCA9ICRzdHJTbGljZShzdHJpbmcsIC0xKTtcblx0aWYgKGZpcnN0ID09PSAnJScgJiYgbGFzdCAhPT0gJyUnKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW52YWxpZCBpbnRyaW5zaWMgc3ludGF4LCBleHBlY3RlZCBjbG9zaW5nIGAlYCcpO1xuXHR9IGVsc2UgaWYgKGxhc3QgPT09ICclJyAmJiBmaXJzdCAhPT0gJyUnKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW52YWxpZCBpbnRyaW5zaWMgc3ludGF4LCBleHBlY3RlZCBvcGVuaW5nIGAlYCcpO1xuXHR9XG5cdHZhciByZXN1bHQgPSBbXTtcblx0JHJlcGxhY2Uoc3RyaW5nLCByZVByb3BOYW1lLCBmdW5jdGlvbiAobWF0Y2gsIG51bWJlciwgcXVvdGUsIHN1YlN0cmluZykge1xuXHRcdHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHF1b3RlID8gJHJlcGxhY2Uoc3ViU3RyaW5nLCByZUVzY2FwZUNoYXIsICckMScpIDogbnVtYmVyIHx8IG1hdGNoO1xuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG4vKiBlbmQgYWRhcHRhdGlvbiAqL1xuXG52YXIgZ2V0QmFzZUludHJpbnNpYyA9IGZ1bmN0aW9uIGdldEJhc2VJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdHZhciBpbnRyaW5zaWNOYW1lID0gbmFtZTtcblx0dmFyIGFsaWFzO1xuXHRpZiAoaGFzT3duKExFR0FDWV9BTElBU0VTLCBpbnRyaW5zaWNOYW1lKSkge1xuXHRcdGFsaWFzID0gTEVHQUNZX0FMSUFTRVNbaW50cmluc2ljTmFtZV07XG5cdFx0aW50cmluc2ljTmFtZSA9ICclJyArIGFsaWFzWzBdICsgJyUnO1xuXHR9XG5cblx0aWYgKGhhc093bihJTlRSSU5TSUNTLCBpbnRyaW5zaWNOYW1lKSkge1xuXHRcdHZhciB2YWx1ZSA9IElOVFJJTlNJQ1NbaW50cmluc2ljTmFtZV07XG5cdFx0aWYgKHZhbHVlID09PSBuZWVkc0V2YWwpIHtcblx0XHRcdHZhbHVlID0gZG9FdmFsKGludHJpbnNpY05hbWUpO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyAmJiAhYWxsb3dNaXNzaW5nKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignaW50cmluc2ljICcgKyBuYW1lICsgJyBleGlzdHMsIGJ1dCBpcyBub3QgYXZhaWxhYmxlLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZSEnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0YWxpYXM6IGFsaWFzLFxuXHRcdFx0bmFtZTogaW50cmluc2ljTmFtZSxcblx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdH07XG5cdH1cblxuXHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdpbnRyaW5zaWMgJyArIG5hbWUgKyAnIGRvZXMgbm90IGV4aXN0IScpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBHZXRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignaW50cmluc2ljIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcblx0fVxuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdHlwZW9mIGFsbG93TWlzc2luZyAhPT0gJ2Jvb2xlYW4nKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1wiYWxsb3dNaXNzaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBhIGJvb2xlYW4nKTtcblx0fVxuXG5cdGlmICgkZXhlYygvXiU/W14lXSolPyQvLCBuYW1lKSA9PT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2AlYCBtYXkgbm90IGJlIHByZXNlbnQgYW55d2hlcmUgYnV0IGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgaW50cmluc2ljIG5hbWUnKTtcblx0fVxuXHR2YXIgcGFydHMgPSBzdHJpbmdUb1BhdGgobmFtZSk7XG5cdHZhciBpbnRyaW5zaWNCYXNlTmFtZSA9IHBhcnRzLmxlbmd0aCA+IDAgPyBwYXJ0c1swXSA6ICcnO1xuXG5cdHZhciBpbnRyaW5zaWMgPSBnZXRCYXNlSW50cmluc2ljKCclJyArIGludHJpbnNpY0Jhc2VOYW1lICsgJyUnLCBhbGxvd01pc3NpbmcpO1xuXHR2YXIgaW50cmluc2ljUmVhbE5hbWUgPSBpbnRyaW5zaWMubmFtZTtcblx0dmFyIHZhbHVlID0gaW50cmluc2ljLnZhbHVlO1xuXHR2YXIgc2tpcEZ1cnRoZXJDYWNoaW5nID0gZmFsc2U7XG5cblx0dmFyIGFsaWFzID0gaW50cmluc2ljLmFsaWFzO1xuXHRpZiAoYWxpYXMpIHtcblx0XHRpbnRyaW5zaWNCYXNlTmFtZSA9IGFsaWFzWzBdO1xuXHRcdCRzcGxpY2VBcHBseShwYXJ0cywgJGNvbmNhdChbMCwgMV0sIGFsaWFzKSk7XG5cdH1cblxuXHRmb3IgKHZhciBpID0gMSwgaXNPd24gPSB0cnVlOyBpIDwgcGFydHMubGVuZ3RoOyBpICs9IDEpIHtcblx0XHR2YXIgcGFydCA9IHBhcnRzW2ldO1xuXHRcdHZhciBmaXJzdCA9ICRzdHJTbGljZShwYXJ0LCAwLCAxKTtcblx0XHR2YXIgbGFzdCA9ICRzdHJTbGljZShwYXJ0LCAtMSk7XG5cdFx0aWYgKFxuXHRcdFx0KFxuXHRcdFx0XHQoZmlyc3QgPT09ICdcIicgfHwgZmlyc3QgPT09IFwiJ1wiIHx8IGZpcnN0ID09PSAnYCcpXG5cdFx0XHRcdHx8IChsYXN0ID09PSAnXCInIHx8IGxhc3QgPT09IFwiJ1wiIHx8IGxhc3QgPT09ICdgJylcblx0XHRcdClcblx0XHRcdCYmIGZpcnN0ICE9PSBsYXN0XG5cdFx0KSB7XG5cdFx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdwcm9wZXJ0eSBuYW1lcyB3aXRoIHF1b3RlcyBtdXN0IGhhdmUgbWF0Y2hpbmcgcXVvdGVzJyk7XG5cdFx0fVxuXHRcdGlmIChwYXJ0ID09PSAnY29uc3RydWN0b3InIHx8ICFpc093bikge1xuXHRcdFx0c2tpcEZ1cnRoZXJDYWNoaW5nID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpbnRyaW5zaWNCYXNlTmFtZSArPSAnLicgKyBwYXJ0O1xuXHRcdGludHJpbnNpY1JlYWxOYW1lID0gJyUnICsgaW50cmluc2ljQmFzZU5hbWUgKyAnJSc7XG5cblx0XHRpZiAoaGFzT3duKElOVFJJTlNJQ1MsIGludHJpbnNpY1JlYWxOYW1lKSkge1xuXHRcdFx0dmFsdWUgPSBJTlRSSU5TSUNTW2ludHJpbnNpY1JlYWxOYW1lXTtcblx0XHR9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcblx0XHRcdGlmICghKHBhcnQgaW4gdmFsdWUpKSB7XG5cdFx0XHRcdGlmICghYWxsb3dNaXNzaW5nKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2Jhc2UgaW50cmluc2ljIGZvciAnICsgbmFtZSArICcgZXhpc3RzLCBidXQgdGhlIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUuJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHZvaWQgdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCRnT1BEICYmIChpICsgMSkgPj0gcGFydHMubGVuZ3RoKSB7XG5cdFx0XHRcdHZhciBkZXNjID0gJGdPUEQodmFsdWUsIHBhcnQpO1xuXHRcdFx0XHRpc093biA9ICEhZGVzYztcblxuXHRcdFx0XHQvLyBCeSBjb252ZW50aW9uLCB3aGVuIGEgZGF0YSBwcm9wZXJ0eSBpcyBjb252ZXJ0ZWQgdG8gYW4gYWNjZXNzb3Jcblx0XHRcdFx0Ly8gcHJvcGVydHkgdG8gZW11bGF0ZSBhIGRhdGEgcHJvcGVydHkgdGhhdCBkb2VzIG5vdCBzdWZmZXIgZnJvbVxuXHRcdFx0XHQvLyB0aGUgb3ZlcnJpZGUgbWlzdGFrZSwgdGhhdCBhY2Nlc3NvcidzIGdldHRlciBpcyBtYXJrZWQgd2l0aFxuXHRcdFx0XHQvLyBhbiBgb3JpZ2luYWxWYWx1ZWAgcHJvcGVydHkuIEhlcmUsIHdoZW4gd2UgZGV0ZWN0IHRoaXMsIHdlXG5cdFx0XHRcdC8vIHVwaG9sZCB0aGUgaWxsdXNpb24gYnkgcHJldGVuZGluZyB0byBzZWUgdGhhdCBvcmlnaW5hbCBkYXRhXG5cdFx0XHRcdC8vIHByb3BlcnR5LCBpLmUuLCByZXR1cm5pbmcgdGhlIHZhbHVlIHJhdGhlciB0aGFuIHRoZSBnZXR0ZXJcblx0XHRcdFx0Ly8gaXRzZWxmLlxuXHRcdFx0XHRpZiAoaXNPd24gJiYgJ2dldCcgaW4gZGVzYyAmJiAhKCdvcmlnaW5hbFZhbHVlJyBpbiBkZXNjLmdldCkpIHtcblx0XHRcdFx0XHR2YWx1ZSA9IGRlc2MuZ2V0O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHZhbHVlID0gdmFsdWVbcGFydF07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlzT3duID0gaGFzT3duKHZhbHVlLCBwYXJ0KTtcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZVtwYXJ0XTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGlzT3duICYmICFza2lwRnVydGhlckNhY2hpbmcpIHtcblx0XHRcdFx0SU5UUklOU0lDU1tpbnRyaW5zaWNSZWFsTmFtZV0gPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyICRPYmplY3QgPSByZXF1aXJlKCdlcy1vYmplY3QtYXRvbXMnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vT2JqZWN0LmdldFByb3RvdHlwZU9mJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9ICRPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgbnVsbDtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vUmVmbGVjdC5nZXRQcm90b3R5cGVPZicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSAodHlwZW9mIFJlZmxlY3QgIT09ICd1bmRlZmluZWQnICYmIFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YpIHx8IG51bGw7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciByZWZsZWN0R2V0UHJvdG8gPSByZXF1aXJlKCcuL1JlZmxlY3QuZ2V0UHJvdG90eXBlT2YnKTtcbnZhciBvcmlnaW5hbEdldFByb3RvID0gcmVxdWlyZSgnLi9PYmplY3QuZ2V0UHJvdG90eXBlT2YnKTtcblxudmFyIGdldER1bmRlclByb3RvID0gcmVxdWlyZSgnZHVuZGVyLXByb3RvL2dldCcpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSByZWZsZWN0R2V0UHJvdG9cblx0PyBmdW5jdGlvbiBnZXRQcm90byhPKSB7XG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUUyBjYW4ndCBuYXJyb3cgaW5zaWRlIGEgY2xvc3VyZSwgZm9yIHNvbWUgcmVhc29uXG5cdFx0cmV0dXJuIHJlZmxlY3RHZXRQcm90byhPKTtcblx0fVxuXHQ6IG9yaWdpbmFsR2V0UHJvdG9cblx0XHQ/IGZ1bmN0aW9uIGdldFByb3RvKE8pIHtcblx0XHRcdGlmICghTyB8fCAodHlwZW9mIE8gIT09ICdvYmplY3QnICYmIHR5cGVvZiBPICE9PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdnZXRQcm90bzogbm90IGFuIG9iamVjdCcpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUUyBjYW4ndCBuYXJyb3cgaW5zaWRlIGEgY2xvc3VyZSwgZm9yIHNvbWUgcmVhc29uXG5cdFx0XHRyZXR1cm4gb3JpZ2luYWxHZXRQcm90byhPKTtcblx0XHR9XG5cdFx0OiBnZXREdW5kZXJQcm90b1xuXHRcdFx0PyBmdW5jdGlvbiBnZXRQcm90byhPKSB7XG5cdFx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgVFMgY2FuJ3QgbmFycm93IGluc2lkZSBhIGNsb3N1cmUsIGZvciBzb21lIHJlYXNvblxuXHRcdFx0XHRyZXR1cm4gZ2V0RHVuZGVyUHJvdG8oTyk7XG5cdFx0XHR9XG5cdFx0XHQ6IG51bGw7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2dPUEQnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbnZhciAkZ09QRCA9IHJlcXVpcmUoJy4vZ09QRCcpO1xuXG5pZiAoJGdPUEQpIHtcblx0dHJ5IHtcblx0XHQkZ09QRChbXSwgJ2xlbmd0aCcpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gSUUgOCBoYXMgYSBicm9rZW4gZ09QRFxuXHRcdCRnT1BEID0gbnVsbDtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9ICRnT1BEO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgb3JpZ1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbDtcbnZhciBoYXNTeW1ib2xTaGFtID0gcmVxdWlyZSgnLi9zaGFtcycpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNOYXRpdmVTeW1ib2xzKCkge1xuXHRpZiAodHlwZW9mIG9yaWdTeW1ib2wgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgU3ltYm9sICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIG9yaWdTeW1ib2woJ2ZvbycpICE9PSAnc3ltYm9sJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2woJ2JhcicpICE9PSAnc3ltYm9sJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRyZXR1cm4gaGFzU3ltYm9sU2hhbSgpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vc2hhbXMnKX0gKi9cbi8qIGVzbGludCBjb21wbGV4aXR5OiBbMiwgMThdLCBtYXgtc3RhdGVtZW50czogWzIsIDMzXSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNTeW1ib2xzKCkge1xuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnKSB7IHJldHVybiB0cnVlOyB9XG5cblx0LyoqIEB0eXBlIHt7IFtrIGluIHN5bWJvbF0/OiB1bmtub3duIH19ICovXG5cdHZhciBvYmogPSB7fTtcblx0dmFyIHN5bSA9IFN5bWJvbCgndGVzdCcpO1xuXHR2YXIgc3ltT2JqID0gT2JqZWN0KHN5bSk7XG5cdGlmICh0eXBlb2Ygc3ltID09PSAnc3RyaW5nJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bSkgIT09ICdbb2JqZWN0IFN5bWJvbF0nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bU9iaikgIT09ICdbb2JqZWN0IFN5bWJvbF0nKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdC8vIHRlbXAgZGlzYWJsZWQgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9samhhcmIvb2JqZWN0LmFzc2lnbi9pc3N1ZXMvMTdcblx0Ly8gaWYgKHN5bSBpbnN0YW5jZW9mIFN5bWJvbCkgeyByZXR1cm4gZmFsc2U7IH1cblx0Ly8gdGVtcCBkaXNhYmxlZCBwZXIgaHR0cHM6Ly9naXRodWIuY29tL1dlYlJlZmxlY3Rpb24vZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzL2lzc3Vlcy80XG5cdC8vIGlmICghKHN5bU9iaiBpbnN0YW5jZW9mIFN5bWJvbCkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0Ly8gaWYgKHR5cGVvZiBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHQvLyBpZiAoU3RyaW5nKHN5bSkgIT09IFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW0pKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHZhciBzeW1WYWwgPSA0Mjtcblx0b2JqW3N5bV0gPSBzeW1WYWw7XG5cdGZvciAodmFyIF8gaW4gb2JqKSB7IHJldHVybiBmYWxzZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby11bnJlYWNoYWJsZS1sb29wXG5cdGlmICh0eXBlb2YgT2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggIT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyA9PT0gJ2Z1bmN0aW9uJyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmxlbmd0aCAhPT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHR2YXIgc3ltcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKTtcblx0aWYgKHN5bXMubGVuZ3RoICE9PSAxIHx8IHN5bXNbMF0gIT09IHN5bSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmosIHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXBhcmVuc1xuXHRcdHZhciBkZXNjcmlwdG9yID0gLyoqIEB0eXBlIHtQcm9wZXJ0eURlc2NyaXB0b3J9ICovIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgc3ltKSk7XG5cdFx0aWYgKGRlc2NyaXB0b3IudmFsdWUgIT09IHN5bVZhbCB8fCBkZXNjcmlwdG9yLmVudW1lcmFibGUgIT09IHRydWUpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7XG52YXIgJGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gYmluZC5jYWxsKGNhbGwsICRoYXNPd24pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGVsLCBvbk92ZXIsIG9uT3V0KSB7XG4gIHZhciB4LCB5LCBwWCwgcFk7XG4gIHZhciBtb3VzZU92ZXIgPSBmYWxzZTtcbiAgdmFyIGZvY3VzZWQgPSBmYWxzZTtcbiAgdmFyIGggPSB7fSxcbiAgICBzdGF0ZSA9IDAsXG4gICAgdGltZXIgPSAwO1xuXG4gIHZhciBvcHRpb25zID0ge1xuICAgIHNlbnNpdGl2aXR5OiA3LFxuICAgIGludGVydmFsOiAxMDAsXG4gICAgdGltZW91dDogMCxcbiAgICBoYW5kbGVGb2N1czogZmFsc2VcbiAgfTtcblxuICBmdW5jdGlvbiBkZWxheShlbCwgZSkge1xuICAgIGlmICh0aW1lcikgdGltZXIgPSBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIHN0YXRlID0gMDtcbiAgICByZXR1cm4gZm9jdXNlZCA/IHVuZGVmaW5lZCA6IG9uT3V0LmNhbGwoZWwsIGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhY2tlcihlKSB7XG4gICAgeCA9IGUuY2xpZW50WDtcbiAgICB5ID0gZS5jbGllbnRZO1xuICB9XG5cbiAgZnVuY3Rpb24gY29tcGFyZShlbCwgZSkge1xuICAgIGlmICh0aW1lcikgdGltZXIgPSBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIGlmICgoTWF0aC5hYnMocFggLSB4KSArIE1hdGguYWJzKHBZIC0geSkpIDwgb3B0aW9ucy5zZW5zaXRpdml0eSkge1xuICAgICAgc3RhdGUgPSAxO1xuICAgICAgcmV0dXJuIGZvY3VzZWQgPyB1bmRlZmluZWQgOiBvbk92ZXIuY2FsbChlbCwgZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBYID0geDtcbiAgICAgIHBZID0geTtcbiAgICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgY29tcGFyZShlbCwgZSk7XG4gICAgICB9LCBvcHRpb25zLmludGVydmFsKTtcbiAgICB9XG4gIH1cblxuICAvLyBQdWJsaWMgbWV0aG9kc1xuICBoLm9wdGlvbnMgPSBmdW5jdGlvbihvcHQpIHtcbiAgICB2YXIgZm9jdXNPcHRpb25DaGFuZ2VkID0gb3B0LmhhbmRsZUZvY3VzICE9PSBvcHRpb25zLmhhbmRsZUZvY3VzO1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCBvcHQpO1xuICAgIGlmIChmb2N1c09wdGlvbkNoYW5nZWQpIHtcbiAgICAgIG9wdGlvbnMuaGFuZGxlRm9jdXMgPyBhZGRGb2N1cygpIDogcmVtb3ZlRm9jdXMoKTtcbiAgICB9XG4gICAgcmV0dXJuIGg7XG4gIH07XG5cbiAgZnVuY3Rpb24gZGlzcGF0Y2hPdmVyKGUpIHtcbiAgICBtb3VzZU92ZXIgPSB0cnVlO1xuICAgIGlmICh0aW1lcikgdGltZXIgPSBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRyYWNrZXIsIGZhbHNlKTtcblxuICAgIGlmIChzdGF0ZSAhPT0gMSkge1xuICAgICAgcFggPSBlLmNsaWVudFg7XG4gICAgICBwWSA9IGUuY2xpZW50WTtcblxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdHJhY2tlciwgZmFsc2UpO1xuXG4gICAgICB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbXBhcmUoZWwsIGUpO1xuICAgICAgfSwgb3B0aW9ucy5pbnRlcnZhbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBmdW5jdGlvbiBkaXNwYXRjaE91dChlKSB7XG4gICAgbW91c2VPdmVyID0gZmFsc2U7XG4gICAgaWYgKHRpbWVyKSB0aW1lciA9IGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdHJhY2tlciwgZmFsc2UpO1xuXG4gICAgaWYgKHN0YXRlID09PSAxKSB7XG4gICAgICB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGRlbGF5KGVsLCBlKTtcbiAgICAgIH0sIG9wdGlvbnMudGltZW91dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBmdW5jdGlvbiBkaXNwYXRjaEZvY3VzKGUpIHtcbiAgICBpZiAoIW1vdXNlT3Zlcikge1xuICAgICAgZm9jdXNlZCA9IHRydWU7XG4gICAgICBvbk92ZXIuY2FsbChlbCwgZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGlzcGF0Y2hCbHVyKGUpIHtcbiAgICBpZiAoIW1vdXNlT3ZlciAmJiBmb2N1c2VkKSB7XG4gICAgICBmb2N1c2VkID0gZmFsc2U7XG4gICAgICBvbk91dC5jYWxsKGVsLCBlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhZGRGb2N1cygpIHtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGRpc3BhdGNoRm9jdXMsIGZhbHNlKTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgZGlzcGF0Y2hCbHVyLCBmYWxzZSk7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVGb2N1cygpIHtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIGRpc3BhdGNoRm9jdXMsIGZhbHNlKTtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJywgZGlzcGF0Y2hCbHVyLCBmYWxzZSk7XG4gIH1cblxuICBoLnJlbW92ZSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCBkaXNwYXRjaE92ZXIsIGZhbHNlKTtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIGRpc3BhdGNoT3V0LCBmYWxzZSk7XG4gICAgcmVtb3ZlRm9jdXMoKTtcbiAgfTtcblxuICBpZiAoZWwpIHtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCBkaXNwYXRjaE92ZXIsIGZhbHNlKTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIGRpc3BhdGNoT3V0LCBmYWxzZSk7XG4gIH1cblxuICByZXR1cm4gaDtcbn07XG4iLCIvKiEgalF1ZXJ5IHYzLjcuMSB8IChjKSBPcGVuSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovXG4hZnVuY3Rpb24oZSx0KXtcInVzZSBzdHJpY3RcIjtcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9ZS5kb2N1bWVudD90KGUsITApOmZ1bmN0aW9uKGUpe2lmKCFlLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcihcImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnRcIik7cmV0dXJuIHQoZSl9OnQoZSl9KFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oaWUsZSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIG9lPVtdLHI9T2JqZWN0LmdldFByb3RvdHlwZU9mLGFlPW9lLnNsaWNlLGc9b2UuZmxhdD9mdW5jdGlvbihlKXtyZXR1cm4gb2UuZmxhdC5jYWxsKGUpfTpmdW5jdGlvbihlKXtyZXR1cm4gb2UuY29uY2F0LmFwcGx5KFtdLGUpfSxzPW9lLnB1c2gsc2U9b2UuaW5kZXhPZixuPXt9LGk9bi50b1N0cmluZyx1ZT1uLmhhc093blByb3BlcnR5LG89dWUudG9TdHJpbmcsYT1vLmNhbGwoT2JqZWN0KSxsZT17fSx2PWZ1bmN0aW9uKGUpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIGUmJlwibnVtYmVyXCIhPXR5cGVvZiBlLm5vZGVUeXBlJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBlLml0ZW19LHk9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUmJmU9PT1lLndpbmRvd30sQz1pZS5kb2N1bWVudCx1PXt0eXBlOiEwLHNyYzohMCxub25jZTohMCxub01vZHVsZTohMH07ZnVuY3Rpb24gbShlLHQsbil7dmFyIHIsaSxvPShuPW58fEMpLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7aWYoby50ZXh0PWUsdClmb3IociBpbiB1KShpPXRbcl18fHQuZ2V0QXR0cmlidXRlJiZ0LmdldEF0dHJpYnV0ZShyKSkmJm8uc2V0QXR0cmlidXRlKHIsaSk7bi5oZWFkLmFwcGVuZENoaWxkKG8pLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobyl9ZnVuY3Rpb24geChlKXtyZXR1cm4gbnVsbD09ZT9lK1wiXCI6XCJvYmplY3RcIj09dHlwZW9mIGV8fFwiZnVuY3Rpb25cIj09dHlwZW9mIGU/bltpLmNhbGwoZSldfHxcIm9iamVjdFwiOnR5cGVvZiBlfXZhciB0PVwiMy43LjFcIixsPS9IVE1MJC9pLGNlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBjZS5mbi5pbml0KGUsdCl9O2Z1bmN0aW9uIGMoZSl7dmFyIHQ9ISFlJiZcImxlbmd0aFwiaW4gZSYmZS5sZW5ndGgsbj14KGUpO3JldHVybiF2KGUpJiYheShlKSYmKFwiYXJyYXlcIj09PW58fDA9PT10fHxcIm51bWJlclwiPT10eXBlb2YgdCYmMDx0JiZ0LTEgaW4gZSl9ZnVuY3Rpb24gZmUoZSx0KXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpfWNlLmZuPWNlLnByb3RvdHlwZT17anF1ZXJ5OnQsY29uc3RydWN0b3I6Y2UsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBhZS5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/YWUuY2FsbCh0aGlzKTplPDA/dGhpc1tlK3RoaXMubGVuZ3RoXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9Y2UubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGUpO3JldHVybiB0LnByZXZPYmplY3Q9dGhpcyx0fSxlYWNoOmZ1bmN0aW9uKGUpe3JldHVybiBjZS5lYWNoKHRoaXMsZSl9LG1hcDpmdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soY2UubWFwKHRoaXMsZnVuY3Rpb24oZSx0KXtyZXR1cm4gbi5jYWxsKGUsdCxlKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYWUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXZlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhjZS5ncmVwKHRoaXMsZnVuY3Rpb24oZSx0KXtyZXR1cm4odCsxKSUyfSkpfSxvZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soY2UuZ3JlcCh0aGlzLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQlMn0pKX0sZXE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5sZW5ndGgsbj0rZSsoZTwwP3Q6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKDA8PW4mJm48dD9bdGhpc1tuXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6cyxzb3J0Om9lLnNvcnQsc3BsaWNlOm9lLnNwbGljZX0sY2UuZXh0ZW5kPWNlLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBlLHQsbixyLGksbyxhPWFyZ3VtZW50c1swXXx8e30scz0xLHU9YXJndW1lbnRzLmxlbmd0aCxsPSExO2ZvcihcImJvb2xlYW5cIj09dHlwZW9mIGEmJihsPWEsYT1hcmd1bWVudHNbc118fHt9LHMrKyksXCJvYmplY3RcIj09dHlwZW9mIGF8fHYoYSl8fChhPXt9KSxzPT09dSYmKGE9dGhpcyxzLS0pO3M8dTtzKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW3NdKSlmb3IodCBpbiBlKXI9ZVt0XSxcIl9fcHJvdG9fX1wiIT09dCYmYSE9PXImJihsJiZyJiYoY2UuaXNQbGFpbk9iamVjdChyKXx8KGk9QXJyYXkuaXNBcnJheShyKSkpPyhuPWFbdF0sbz1pJiYhQXJyYXkuaXNBcnJheShuKT9bXTppfHxjZS5pc1BsYWluT2JqZWN0KG4pP246e30saT0hMSxhW3RdPWNlLmV4dGVuZChsLG8scikpOnZvaWQgMCE9PXImJihhW3RdPXIpKTtyZXR1cm4gYX0sY2UuZXh0ZW5kKHtleHBhbmRvOlwialF1ZXJ5XCIrKHQrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXFxEL2csXCJcIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoZSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4hKCFlfHxcIltvYmplY3QgT2JqZWN0XVwiIT09aS5jYWxsKGUpKSYmKCEodD1yKGUpKXx8XCJmdW5jdGlvblwiPT10eXBlb2Yobj11ZS5jYWxsKHQsXCJjb25zdHJ1Y3RvclwiKSYmdC5jb25zdHJ1Y3RvcikmJm8uY2FsbChuKT09PWEpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oZSx0LG4pe20oZSx7bm9uY2U6dCYmdC5ub25jZX0sbil9LGVhY2g6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTA7aWYoYyhlKSl7Zm9yKG49ZS5sZW5ndGg7cjxuO3IrKylpZighMT09PXQuY2FsbChlW3JdLHIsZVtyXSkpYnJlYWt9ZWxzZSBmb3IociBpbiBlKWlmKCExPT09dC5jYWxsKGVbcl0scixlW3JdKSlicmVhaztyZXR1cm4gZX0sdGV4dDpmdW5jdGlvbihlKXt2YXIgdCxuPVwiXCIscj0wLGk9ZS5ub2RlVHlwZTtpZighaSl3aGlsZSh0PWVbcisrXSluKz1jZS50ZXh0KHQpO3JldHVybiAxPT09aXx8MTE9PT1pP2UudGV4dENvbnRlbnQ6OT09PWk/ZS5kb2N1bWVudEVsZW1lbnQudGV4dENvbnRlbnQ6Mz09PWl8fDQ9PT1pP2Uubm9kZVZhbHVlOm59LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fFtdO3JldHVybiBudWxsIT1lJiYoYyhPYmplY3QoZSkpP2NlLm1lcmdlKG4sXCJzdHJpbmdcIj09dHlwZW9mIGU/W2VdOmUpOnMuY2FsbChuLGUpKSxufSxpbkFycmF5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09dD8tMTpzZS5jYWxsKHQsZSxuKX0saXNYTUxEb2M6ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5uYW1lc3BhY2VVUkksbj1lJiYoZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIWwudGVzdCh0fHxuJiZuLm5vZGVOYW1lfHxcIkhUTUxcIil9LG1lcmdlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPSt0Lmxlbmd0aCxyPTAsaT1lLmxlbmd0aDtyPG47cisrKWVbaSsrXT10W3JdO3JldHVybiBlLmxlbmd0aD1pLGV9LGdyZXA6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1bXSxpPTAsbz1lLmxlbmd0aCxhPSFuO2k8bztpKyspIXQoZVtpXSxpKSE9PWEmJnIucHVzaChlW2ldKTtyZXR1cm4gcn0sbWFwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89MCxhPVtdO2lmKGMoZSkpZm9yKHI9ZS5sZW5ndGg7bzxyO28rKyludWxsIT0oaT10KGVbb10sbyxuKSkmJmEucHVzaChpKTtlbHNlIGZvcihvIGluIGUpbnVsbCE9KGk9dChlW29dLG8sbikpJiZhLnB1c2goaSk7cmV0dXJuIGcoYSl9LGd1aWQ6MSxzdXBwb3J0OmxlfSksXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiYoY2UuZm5bU3ltYm9sLml0ZXJhdG9yXT1vZVtTeW1ib2wuaXRlcmF0b3JdKSxjZS5lYWNoKFwiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2xcIi5zcGxpdChcIiBcIiksZnVuY3Rpb24oZSx0KXtuW1wiW29iamVjdCBcIit0K1wiXVwiXT10LnRvTG93ZXJDYXNlKCl9KTt2YXIgcGU9b2UucG9wLGRlPW9lLnNvcnQsaGU9b2Uuc3BsaWNlLGdlPVwiW1xcXFx4MjBcXFxcdFxcXFxyXFxcXG5cXFxcZl1cIix2ZT1uZXcgUmVnRXhwKFwiXlwiK2dlK1wiK3woKD86XnxbXlxcXFxcXFxcXSkoPzpcXFxcXFxcXC4pKilcIitnZStcIiskXCIsXCJnXCIpO2NlLmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7dmFyIG49dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09bnx8ISghbnx8MSE9PW4ubm9kZVR5cGV8fCEoZS5jb250YWlucz9lLmNvbnRhaW5zKG4pOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obikpKX07dmFyIGY9LyhbXFwwLVxceDFmXFx4N2ZdfF4tP1xcZCl8Xi0kfFteXFx4ODAtXFx1RkZGRlxcdy1dL2c7ZnVuY3Rpb24gcChlLHQpe3JldHVybiB0P1wiXFwwXCI9PT1lP1wiXFx1ZmZmZFwiOmUuc2xpY2UoMCwtMSkrXCJcXFxcXCIrZS5jaGFyQ29kZUF0KGUubGVuZ3RoLTEpLnRvU3RyaW5nKDE2KStcIiBcIjpcIlxcXFxcIitlfWNlLmVzY2FwZVNlbGVjdG9yPWZ1bmN0aW9uKGUpe3JldHVybihlK1wiXCIpLnJlcGxhY2UoZixwKX07dmFyIHllPUMsbWU9czshZnVuY3Rpb24oKXt2YXIgZSxiLHcsbyxhLFQscixDLGQsaSxrPW1lLFM9Y2UuZXhwYW5kbyxFPTAsbj0wLHM9VygpLGM9VygpLHU9VygpLGg9VygpLGw9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PXQmJihhPSEwKSwwfSxmPVwiY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWRcIix0PVwiKD86XFxcXFxcXFxbXFxcXGRhLWZBLUZdezEsNn1cIitnZStcIj98XFxcXFxcXFxbXlxcXFxyXFxcXG5cXFxcZl18W1xcXFx3LV18W15cXDAtXFxcXHg3Zl0pK1wiLHA9XCJcXFxcW1wiK2dlK1wiKihcIit0K1wiKSg/OlwiK2dlK1wiKihbKl4kfCF+XT89KVwiK2dlK1wiKig/OicoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcInwoXCIrdCtcIikpfClcIitnZStcIipcXFxcXVwiLGc9XCI6KFwiK3QrXCIpKD86XFxcXCgoKCcoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcIil8KCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcKClbXFxcXF1dfFwiK3ArXCIpKil8LiopXFxcXCl8KVwiLHY9bmV3IFJlZ0V4cChnZStcIitcIixcImdcIikseT1uZXcgUmVnRXhwKFwiXlwiK2dlK1wiKixcIitnZStcIipcIiksbT1uZXcgUmVnRXhwKFwiXlwiK2dlK1wiKihbPit+XXxcIitnZStcIilcIitnZStcIipcIikseD1uZXcgUmVnRXhwKGdlK1wifD5cIiksaj1uZXcgUmVnRXhwKGcpLEE9bmV3IFJlZ0V4cChcIl5cIit0K1wiJFwiKSxEPXtJRDpuZXcgUmVnRXhwKFwiXiMoXCIrdCtcIilcIiksQ0xBU1M6bmV3IFJlZ0V4cChcIl5cXFxcLihcIit0K1wiKVwiKSxUQUc6bmV3IFJlZ0V4cChcIl4oXCIrdCtcInxbKl0pXCIpLEFUVFI6bmV3IFJlZ0V4cChcIl5cIitwKSxQU0VVRE86bmV3IFJlZ0V4cChcIl5cIitnKSxDSElMRDpuZXcgUmVnRXhwKFwiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFxcXChcIitnZStcIiooZXZlbnxvZGR8KChbKy1dfCkoXFxcXGQqKW58KVwiK2dlK1wiKig/OihbKy1dfClcIitnZStcIiooXFxcXGQrKXwpKVwiK2dlK1wiKlxcXFwpfClcIixcImlcIiksYm9vbDpuZXcgUmVnRXhwKFwiXig/OlwiK2YrXCIpJFwiLFwiaVwiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cChcIl5cIitnZStcIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcXFwoXCIrZ2UrXCIqKCg/Oi1cXFxcZCk/XFxcXGQqKVwiK2dlK1wiKlxcXFwpfCkoPz1bXi1dfCQpXCIsXCJpXCIpfSxOPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2kscT0vXmhcXGQkL2ksTD0vXig/OiMoW1xcdy1dKyl8KFxcdyspfFxcLihbXFx3LV0rKSkkLyxIPS9bK35dLyxPPW5ldyBSZWdFeHAoXCJcXFxcXFxcXFtcXFxcZGEtZkEtRl17MSw2fVwiK2dlK1wiP3xcXFxcXFxcXChbXlxcXFxyXFxcXG5cXFxcZl0pXCIsXCJnXCIpLFA9ZnVuY3Rpb24oZSx0KXt2YXIgbj1cIjB4XCIrZS5zbGljZSgxKS02NTUzNjtyZXR1cm4gdHx8KG48MD9TdHJpbmcuZnJvbUNoYXJDb2RlKG4rNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUobj4+MTB8NTUyOTYsMTAyMyZufDU2MzIwKSl9LE09ZnVuY3Rpb24oKXtWKCl9LFI9SihmdW5jdGlvbihlKXtyZXR1cm4hMD09PWUuZGlzYWJsZWQmJmZlKGUsXCJmaWVsZHNldFwiKX0se2RpcjpcInBhcmVudE5vZGVcIixuZXh0OlwibGVnZW5kXCJ9KTt0cnl7ay5hcHBseShvZT1hZS5jYWxsKHllLmNoaWxkTm9kZXMpLHllLmNoaWxkTm9kZXMpLG9lW3llLmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlKXtrPXthcHBseTpmdW5jdGlvbihlLHQpe21lLmFwcGx5KGUsYWUuY2FsbCh0KSl9LGNhbGw6ZnVuY3Rpb24oZSl7bWUuYXBwbHkoZSxhZS5jYWxsKGFyZ3VtZW50cywxKSl9fX1mdW5jdGlvbiBJKHQsZSxuLHIpe3ZhciBpLG8sYSxzLHUsbCxjLGY9ZSYmZS5vd25lckRvY3VtZW50LHA9ZT9lLm5vZGVUeXBlOjk7aWYobj1ufHxbXSxcInN0cmluZ1wiIT10eXBlb2YgdHx8IXR8fDEhPT1wJiY5IT09cCYmMTEhPT1wKXJldHVybiBuO2lmKCFyJiYoVihlKSxlPWV8fFQsQykpe2lmKDExIT09cCYmKHU9TC5leGVjKHQpKSlpZihpPXVbMV0pe2lmKDk9PT1wKXtpZighKGE9ZS5nZXRFbGVtZW50QnlJZChpKSkpcmV0dXJuIG47aWYoYS5pZD09PWkpcmV0dXJuIGsuY2FsbChuLGEpLG59ZWxzZSBpZihmJiYoYT1mLmdldEVsZW1lbnRCeUlkKGkpKSYmSS5jb250YWlucyhlLGEpJiZhLmlkPT09aSlyZXR1cm4gay5jYWxsKG4sYSksbn1lbHNle2lmKHVbMl0pcmV0dXJuIGsuYXBwbHkobixlLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpKSxuO2lmKChpPXVbM10pJiZlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIGsuYXBwbHkobixlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaSkpLG59aWYoIShoW3QrXCIgXCJdfHxkJiZkLnRlc3QodCkpKXtpZihjPXQsZj1lLDE9PT1wJiYoeC50ZXN0KHQpfHxtLnRlc3QodCkpKXsoZj1ILnRlc3QodCkmJlUoZS5wYXJlbnROb2RlKXx8ZSk9PWUmJmxlLnNjb3BlfHwoKHM9ZS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSk/cz1jZS5lc2NhcGVTZWxlY3RvcihzKTplLnNldEF0dHJpYnV0ZShcImlkXCIscz1TKSksbz0obD1ZKHQpKS5sZW5ndGg7d2hpbGUoby0tKWxbb109KHM/XCIjXCIrczpcIjpzY29wZVwiKStcIiBcIitRKGxbb10pO2M9bC5qb2luKFwiLFwiKX10cnl7cmV0dXJuIGsuYXBwbHkobixmLnF1ZXJ5U2VsZWN0b3JBbGwoYykpLG59Y2F0Y2goZSl7aCh0LCEwKX1maW5hbGx5e3M9PT1TJiZlLnJlbW92ZUF0dHJpYnV0ZShcImlkXCIpfX19cmV0dXJuIHJlKHQucmVwbGFjZSh2ZSxcIiQxXCIpLGUsbixyKX1mdW5jdGlvbiBXKCl7dmFyIHI9W107cmV0dXJuIGZ1bmN0aW9uIGUodCxuKXtyZXR1cm4gci5wdXNoKHQrXCIgXCIpPmIuY2FjaGVMZW5ndGgmJmRlbGV0ZSBlW3Iuc2hpZnQoKV0sZVt0K1wiIFwiXT1ufX1mdW5jdGlvbiBGKGUpe3JldHVybiBlW1NdPSEwLGV9ZnVuY3Rpb24gJChlKXt2YXIgdD1ULmNyZWF0ZUVsZW1lbnQoXCJmaWVsZHNldFwiKTt0cnl7cmV0dXJuISFlKHQpfWNhdGNoKGUpe3JldHVybiExfWZpbmFsbHl7dC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksdD1udWxsfX1mdW5jdGlvbiBCKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZmUoZSxcImlucHV0XCIpJiZlLnR5cGU9PT10fX1mdW5jdGlvbiBfKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4oZmUoZSxcImlucHV0XCIpfHxmZShlLFwiYnV0dG9uXCIpKSYmZS50eXBlPT09dH19ZnVuY3Rpb24geih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuXCJmb3JtXCJpbiBlP2UucGFyZW50Tm9kZSYmITE9PT1lLmRpc2FibGVkP1wibGFiZWxcImluIGU/XCJsYWJlbFwiaW4gZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5kaXNhYmxlZD09PXQ6ZS5kaXNhYmxlZD09PXQ6ZS5pc0Rpc2FibGVkPT09dHx8ZS5pc0Rpc2FibGVkIT09IXQmJlIoZSk9PT10OmUuZGlzYWJsZWQ9PT10OlwibGFiZWxcImluIGUmJmUuZGlzYWJsZWQ9PT10fX1mdW5jdGlvbiBYKGEpe3JldHVybiBGKGZ1bmN0aW9uKG8pe3JldHVybiBvPStvLEYoZnVuY3Rpb24oZSx0KXt2YXIgbixyPWEoW10sZS5sZW5ndGgsbyksaT1yLmxlbmd0aDt3aGlsZShpLS0pZVtuPXJbaV1dJiYoZVtuXT0hKHRbbl09ZVtuXSkpfSl9KX1mdW5jdGlvbiBVKGUpe3JldHVybiBlJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmZX1mdW5jdGlvbiBWKGUpe3ZhciB0LG49ZT9lLm93bmVyRG9jdW1lbnR8fGU6eWU7cmV0dXJuIG4hPVQmJjk9PT1uLm5vZGVUeXBlJiZuLmRvY3VtZW50RWxlbWVudCYmKHI9KFQ9bikuZG9jdW1lbnRFbGVtZW50LEM9IWNlLmlzWE1MRG9jKFQpLGk9ci5tYXRjaGVzfHxyLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8ci5tc01hdGNoZXNTZWxlY3RvcixyLm1zTWF0Y2hlc1NlbGVjdG9yJiZ5ZSE9VCYmKHQ9VC5kZWZhdWx0VmlldykmJnQudG9wIT09dCYmdC5hZGRFdmVudExpc3RlbmVyKFwidW5sb2FkXCIsTSksbGUuZ2V0QnlJZD0kKGZ1bmN0aW9uKGUpe3JldHVybiByLmFwcGVuZENoaWxkKGUpLmlkPWNlLmV4cGFuZG8sIVQuZ2V0RWxlbWVudHNCeU5hbWV8fCFULmdldEVsZW1lbnRzQnlOYW1lKGNlLmV4cGFuZG8pLmxlbmd0aH0pLGxlLmRpc2Nvbm5lY3RlZE1hdGNoPSQoZnVuY3Rpb24oZSl7cmV0dXJuIGkuY2FsbChlLFwiKlwiKX0pLGxlLnNjb3BlPSQoZnVuY3Rpb24oKXtyZXR1cm4gVC5xdWVyeVNlbGVjdG9yQWxsKFwiOnNjb3BlXCIpfSksbGUuY3NzSGFzPSQoZnVuY3Rpb24oKXt0cnl7cmV0dXJuIFQucXVlcnlTZWxlY3RvcihcIjpoYXMoKiw6anFmYWtlKVwiKSwhMX1jYXRjaChlKXtyZXR1cm4hMH19KSxsZS5nZXRCeUlkPyhiLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoTyxQKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKFwiaWRcIik9PT10fX0sYi5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQmJkMpe3ZhciBuPXQuZ2V0RWxlbWVudEJ5SWQoZSk7cmV0dXJuIG4/W25dOltdfX0pOihiLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgbj1lLnJlcGxhY2UoTyxQKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlTm9kZSYmZS5nZXRBdHRyaWJ1dGVOb2RlKFwiaWRcIik7cmV0dXJuIHQmJnQudmFsdWU9PT1ufX0sYi5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQmJkMpe3ZhciBuLHIsaSxvPXQuZ2V0RWxlbWVudEJ5SWQoZSk7aWYobyl7aWYoKG49by5nZXRBdHRyaWJ1dGVOb2RlKFwiaWRcIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb107aT10LmdldEVsZW1lbnRzQnlOYW1lKGUpLHI9MDt3aGlsZShvPWlbcisrXSlpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKSkmJm4udmFsdWU9PT1lKXJldHVybltvXX1yZXR1cm5bXX19KSxiLmZpbmQuVEFHPWZ1bmN0aW9uKGUsdCl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHQuZ2V0RWxlbWVudHNCeVRhZ05hbWU/dC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKTp0LnF1ZXJ5U2VsZWN0b3JBbGwoZSl9LGIuZmluZC5DTEFTUz1mdW5jdGlvbihlLHQpe2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJkMpcmV0dXJuIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlKX0sZD1bXSwkKGZ1bmN0aW9uKGUpe3ZhciB0O3IuYXBwZW5kQ2hpbGQoZSkuaW5uZXJIVE1MPVwiPGEgaWQ9J1wiK1MrXCInIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBpZD0nXCIrUytcIi1cXHJcXFxcJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+XCIsZS5xdWVyeVNlbGVjdG9yQWxsKFwiW3NlbGVjdGVkXVwiKS5sZW5ndGh8fGQucHVzaChcIlxcXFxbXCIrZ2UrXCIqKD86dmFsdWV8XCIrZitcIilcIiksZS5xdWVyeVNlbGVjdG9yQWxsKFwiW2lkfj1cIitTK1wiLV1cIikubGVuZ3RofHxkLnB1c2goXCJ+PVwiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoXCJhI1wiK1MrXCIrKlwiKS5sZW5ndGh8fGQucHVzaChcIi4jLitbK35dXCIpLGUucXVlcnlTZWxlY3RvckFsbChcIjpjaGVja2VkXCIpLmxlbmd0aHx8ZC5wdXNoKFwiOmNoZWNrZWRcIiksKHQ9VC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIikpLnNldEF0dHJpYnV0ZShcInR5cGVcIixcImhpZGRlblwiKSxlLmFwcGVuZENoaWxkKHQpLnNldEF0dHJpYnV0ZShcIm5hbWVcIixcIkRcIiksci5hcHBlbmRDaGlsZChlKS5kaXNhYmxlZD0hMCwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKFwiOmRpc2FibGVkXCIpLmxlbmd0aCYmZC5wdXNoKFwiOmVuYWJsZWRcIixcIjpkaXNhYmxlZFwiKSwodD1ULmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKSkuc2V0QXR0cmlidXRlKFwibmFtZVwiLFwiXCIpLGUuYXBwZW5kQ2hpbGQodCksZS5xdWVyeVNlbGVjdG9yQWxsKFwiW25hbWU9JyddXCIpLmxlbmd0aHx8ZC5wdXNoKFwiXFxcXFtcIitnZStcIipuYW1lXCIrZ2UrXCIqPVwiK2dlK1wiKig/OicnfFxcXCJcXFwiKVwiKX0pLGxlLmNzc0hhc3x8ZC5wdXNoKFwiOmhhc1wiKSxkPWQubGVuZ3RoJiZuZXcgUmVnRXhwKGQuam9pbihcInxcIikpLGw9ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gYT0hMCwwO3ZhciBuPSFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBufHwoMSYobj0oZS5vd25lckRvY3VtZW50fHxlKT09KHQub3duZXJEb2N1bWVudHx8dCk/ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KToxKXx8IWxlLnNvcnREZXRhY2hlZCYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKT09PW4/ZT09PVR8fGUub3duZXJEb2N1bWVudD09eWUmJkkuY29udGFpbnMoeWUsZSk/LTE6dD09PVR8fHQub3duZXJEb2N1bWVudD09eWUmJkkuY29udGFpbnMoeWUsdCk/MTpvP3NlLmNhbGwobyxlKS1zZS5jYWxsKG8sdCk6MDo0Jm4/LTE6MSl9KSxUfWZvcihlIGluIEkubWF0Y2hlcz1mdW5jdGlvbihlLHQpe3JldHVybiBJKGUsbnVsbCxudWxsLHQpfSxJLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihlLHQpe2lmKFYoZSksQyYmIWhbdCtcIiBcIl0mJighZHx8IWQudGVzdCh0KSkpdHJ5e3ZhciBuPWkuY2FsbChlLHQpO2lmKG58fGxlLmRpc2Nvbm5lY3RlZE1hdGNofHxlLmRvY3VtZW50JiYxMSE9PWUuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIG59Y2F0Y2goZSl7aCh0LCEwKX1yZXR1cm4gMDxJKHQsVCxudWxsLFtlXSkubGVuZ3RofSxJLmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUub3duZXJEb2N1bWVudHx8ZSkhPVQmJlYoZSksY2UuY29udGFpbnMoZSx0KX0sSS5hdHRyPWZ1bmN0aW9uKGUsdCl7KGUub3duZXJEb2N1bWVudHx8ZSkhPVQmJlYoZSk7dmFyIG49Yi5hdHRySGFuZGxlW3QudG9Mb3dlckNhc2UoKV0scj1uJiZ1ZS5jYWxsKGIuYXR0ckhhbmRsZSx0LnRvTG93ZXJDYXNlKCkpP24oZSx0LCFDKTp2b2lkIDA7cmV0dXJuIHZvaWQgMCE9PXI/cjplLmdldEF0dHJpYnV0ZSh0KX0sSS5lcnJvcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoXCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiBcIitlKX0sY2UudW5pcXVlU29ydD1mdW5jdGlvbihlKXt2YXIgdCxuPVtdLHI9MCxpPTA7aWYoYT0hbGUuc29ydFN0YWJsZSxvPSFsZS5zb3J0U3RhYmxlJiZhZS5jYWxsKGUsMCksZGUuY2FsbChlLGwpLGEpe3doaWxlKHQ9ZVtpKytdKXQ9PT1lW2ldJiYocj1uLnB1c2goaSkpO3doaWxlKHItLSloZS5jYWxsKGUsbltyXSwxKX1yZXR1cm4gbz1udWxsLGV9LGNlLmZuLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soY2UudW5pcXVlU29ydChhZS5hcHBseSh0aGlzKSkpfSwoYj1jZS5leHByPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86RixtYXRjaDpELGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7XCI+XCI6e2RpcjpcInBhcmVudE5vZGVcIixmaXJzdDohMH0sXCIgXCI6e2RpcjpcInBhcmVudE5vZGVcIn0sXCIrXCI6e2RpcjpcInByZXZpb3VzU2libGluZ1wiLGZpcnN0OiEwfSxcIn5cIjp7ZGlyOlwicHJldmlvdXNTaWJsaW5nXCJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS5yZXBsYWNlKE8sUCksZVszXT0oZVszXXx8ZVs0XXx8ZVs1XXx8XCJcIikucmVwbGFjZShPLFApLFwifj1cIj09PWVbMl0mJihlWzNdPVwiIFwiK2VbM10rXCIgXCIpLGUuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS50b0xvd2VyQ2FzZSgpLFwibnRoXCI9PT1lWzFdLnNsaWNlKDAsMyk/KGVbM118fEkuZXJyb3IoZVswXSksZVs0XT0rKGVbNF0/ZVs1XSsoZVs2XXx8MSk6MiooXCJldmVuXCI9PT1lWzNdfHxcIm9kZFwiPT09ZVszXSkpLGVbNV09KyhlWzddK2VbOF18fFwib2RkXCI9PT1lWzNdKSk6ZVszXSYmSS5lcnJvcihlWzBdKSxlfSxQU0VVRE86ZnVuY3Rpb24oZSl7dmFyIHQsbj0hZVs2XSYmZVsyXTtyZXR1cm4gRC5DSElMRC50ZXN0KGVbMF0pP251bGw6KGVbM10/ZVsyXT1lWzRdfHxlWzVdfHxcIlwiOm4mJmoudGVzdChuKSYmKHQ9WShuLCEwKSkmJih0PW4uaW5kZXhPZihcIilcIixuLmxlbmd0aC10KS1uLmxlbmd0aCkmJihlWzBdPWVbMF0uc2xpY2UoMCx0KSxlWzJdPW4uc2xpY2UoMCx0KSksZS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZShPLFApLnRvTG93ZXJDYXNlKCk7cmV0dXJuXCIqXCI9PT1lP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGUpe3JldHVybiBmZShlLHQpfX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9c1tlK1wiIFwiXTtyZXR1cm4gdHx8KHQ9bmV3IFJlZ0V4cChcIihefFwiK2dlK1wiKVwiK2UrXCIoXCIrZ2UrXCJ8JClcIikpJiZzKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdChcInN0cmluZ1wiPT10eXBlb2YgZS5jbGFzc05hbWUmJmUuY2xhc3NOYW1lfHxcInVuZGVmaW5lZFwiIT10eXBlb2YgZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIil8fFwiXCIpfSl9LEFUVFI6ZnVuY3Rpb24obixyLGkpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1JLmF0dHIoZSxuKTtyZXR1cm4gbnVsbD09dD9cIiE9XCI9PT1yOiFyfHwodCs9XCJcIixcIj1cIj09PXI/dD09PWk6XCIhPVwiPT09cj90IT09aTpcIl49XCI9PT1yP2kmJjA9PT10LmluZGV4T2YoaSk6XCIqPVwiPT09cj9pJiYtMTx0LmluZGV4T2YoaSk6XCIkPVwiPT09cj9pJiZ0LnNsaWNlKC1pLmxlbmd0aCk9PT1pOlwifj1cIj09PXI/LTE8KFwiIFwiK3QucmVwbGFjZSh2LFwiIFwiKStcIiBcIikuaW5kZXhPZihpKTpcInw9XCI9PT1yJiYodD09PWl8fHQuc2xpY2UoMCxpLmxlbmd0aCsxKT09PWkrXCItXCIpKX19LENISUxEOmZ1bmN0aW9uKGQsZSx0LGgsZyl7dmFyIHY9XCJudGhcIiE9PWQuc2xpY2UoMCwzKSx5PVwibGFzdFwiIT09ZC5zbGljZSgtNCksbT1cIm9mLXR5cGVcIj09PWU7cmV0dXJuIDE9PT1oJiYwPT09Zz9mdW5jdGlvbihlKXtyZXR1cm4hIWUucGFyZW50Tm9kZX06ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHMsdT12IT09eT9cIm5leHRTaWJsaW5nXCI6XCJwcmV2aW91c1NpYmxpbmdcIixsPWUucGFyZW50Tm9kZSxjPW0mJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxmPSFuJiYhbSxwPSExO2lmKGwpe2lmKHYpe3doaWxlKHUpe289ZTt3aGlsZShvPW9bdV0paWYobT9mZShvLGMpOjE9PT1vLm5vZGVUeXBlKXJldHVybiExO3M9dT1cIm9ubHlcIj09PWQmJiFzJiZcIm5leHRTaWJsaW5nXCJ9cmV0dXJuITB9aWYocz1beT9sLmZpcnN0Q2hpbGQ6bC5sYXN0Q2hpbGRdLHkmJmYpe3A9KGE9KHI9KGk9bFtTXXx8KGxbU109e30pKVtkXXx8W10pWzBdPT09RSYmclsxXSkmJnJbMl0sbz1hJiZsLmNoaWxkTm9kZXNbYV07d2hpbGUobz0rK2EmJm8mJm9bdV18fChwPWE9MCl8fHMucG9wKCkpaWYoMT09PW8ubm9kZVR5cGUmJisrcCYmbz09PWUpe2lbZF09W0UsYSxwXTticmVha319ZWxzZSBpZihmJiYocD1hPShyPShpPWVbU118fChlW1NdPXt9KSlbZF18fFtdKVswXT09PUUmJnJbMV0pLCExPT09cCl3aGlsZShvPSsrYSYmbyYmb1t1XXx8KHA9YT0wKXx8cy5wb3AoKSlpZigobT9mZShvLGMpOjE9PT1vLm5vZGVUeXBlKSYmKytwJiYoZiYmKChpPW9bU118fChvW1NdPXt9KSlbZF09W0UscF0pLG89PT1lKSlicmVhaztyZXR1cm4ocC09Zyk9PT1ofHxwJWg9PTAmJjA8PXAvaH19fSxQU0VVRE86ZnVuY3Rpb24oZSxvKXt2YXIgdCxhPWIucHNldWRvc1tlXXx8Yi5zZXRGaWx0ZXJzW2UudG9Mb3dlckNhc2UoKV18fEkuZXJyb3IoXCJ1bnN1cHBvcnRlZCBwc2V1ZG86IFwiK2UpO3JldHVybiBhW1NdP2Eobyk6MTxhLmxlbmd0aD8odD1bZSxlLFwiXCIsb10sYi5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/RihmdW5jdGlvbihlLHQpe3ZhciBuLHI9YShlLG8pLGk9ci5sZW5ndGg7d2hpbGUoaS0tKWVbbj1zZS5jYWxsKGUscltpXSldPSEodFtuXT1yW2ldKX0pOmZ1bmN0aW9uKGUpe3JldHVybiBhKGUsMCx0KX0pOmF9fSxwc2V1ZG9zOntub3Q6RihmdW5jdGlvbihlKXt2YXIgcj1bXSxpPVtdLHM9bmUoZS5yZXBsYWNlKHZlLFwiJDFcIikpO3JldHVybiBzW1NdP0YoZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz1zKGUsbnVsbCxyLFtdKSxhPWUubGVuZ3RoO3doaWxlKGEtLSkoaT1vW2FdKSYmKGVbYV09ISh0W2FdPWkpKX0pOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gclswXT1lLHMocixudWxsLG4saSksclswXT1udWxsLCFpLnBvcCgpfX0pLGhhczpGKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gMDxJKHQsZSkubGVuZ3RofX0pLGNvbnRhaW5zOkYoZnVuY3Rpb24odCl7cmV0dXJuIHQ9dC5yZXBsYWNlKE8sUCksZnVuY3Rpb24oZSl7cmV0dXJuLTE8KGUudGV4dENvbnRlbnR8fGNlLnRleHQoZSkpLmluZGV4T2YodCl9fSksbGFuZzpGKGZ1bmN0aW9uKG4pe3JldHVybiBBLnRlc3Qobnx8XCJcIil8fEkuZXJyb3IoXCJ1bnN1cHBvcnRlZCBsYW5nOiBcIituKSxuPW4ucmVwbGFjZShPLFApLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oZSl7dmFyIHQ7ZG97aWYodD1DP2UubGFuZzplLmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpfHxlLmdldEF0dHJpYnV0ZShcImxhbmdcIikpcmV0dXJuKHQ9dC50b0xvd2VyQ2FzZSgpKT09PW58fDA9PT10LmluZGV4T2YobitcIi1cIil9d2hpbGUoKGU9ZS5wYXJlbnROb2RlKSYmMT09PWUubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbihlKXt2YXIgdD1pZS5sb2NhdGlvbiYmaWUubG9jYXRpb24uaGFzaDtyZXR1cm4gdCYmdC5zbGljZSgxKT09PWUuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1yfSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBULmFjdGl2ZUVsZW1lbnR9Y2F0Y2goZSl7fX0oKSYmVC5oYXNGb2N1cygpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgpfSxlbmFibGVkOnooITEpLGRpc2FibGVkOnooITApLGNoZWNrZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGZlKGUsXCJpbnB1dFwiKSYmISFlLmNoZWNrZWR8fGZlKGUsXCJvcHRpb25cIikmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT1lLnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIWIucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBxLnRlc3QoZS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBOLnRlc3QoZS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihlKXtyZXR1cm4gZmUoZSxcImlucHV0XCIpJiZcImJ1dHRvblwiPT09ZS50eXBlfHxmZShlLFwiYnV0dG9uXCIpfSx0ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBmZShlLFwiaW5wdXRcIikmJlwidGV4dFwiPT09ZS50eXBlJiYobnVsbD09KHQ9ZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpKXx8XCJ0ZXh0XCI9PT10LnRvTG93ZXJDYXNlKCkpfSxmaXJzdDpYKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpYKGZ1bmN0aW9uKGUsdCl7cmV0dXJuW3QtMV19KSxlcTpYKGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bbjwwP24rdDpuXX0pLGV2ZW46WChmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDpYKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTE7bjx0O24rPTIpZS5wdXNoKG4pO3JldHVybiBlfSksbHQ6WChmdW5jdGlvbihlLHQsbil7dmFyIHI7Zm9yKHI9bjwwP24rdDp0PG4/dDpuOzA8PS0tcjspZS5wdXNoKHIpO3JldHVybiBlfSksZ3Q6WChmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPW48MD9uK3Q6bjsrK3I8dDspZS5wdXNoKHIpO3JldHVybiBlfSl9fSkucHNldWRvcy5udGg9Yi5wc2V1ZG9zLmVxLHtyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSliLnBzZXVkb3NbZV09QihlKTtmb3IoZSBpbntzdWJtaXQ6ITAscmVzZXQ6ITB9KWIucHNldWRvc1tlXT1fKGUpO2Z1bmN0aW9uIEcoKXt9ZnVuY3Rpb24gWShlLHQpe3ZhciBuLHIsaSxvLGEscyx1LGw9Y1tlK1wiIFwiXTtpZihsKXJldHVybiB0PzA6bC5zbGljZSgwKTthPWUscz1bXSx1PWIucHJlRmlsdGVyO3doaWxlKGEpe2ZvcihvIGluIG4mJiEocj15LmV4ZWMoYSkpfHwociYmKGE9YS5zbGljZShyWzBdLmxlbmd0aCl8fGEpLHMucHVzaChpPVtdKSksbj0hMSwocj1tLmV4ZWMoYSkpJiYobj1yLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6clswXS5yZXBsYWNlKHZlLFwiIFwiKX0pLGE9YS5zbGljZShuLmxlbmd0aCkpLGIuZmlsdGVyKSEocj1EW29dLmV4ZWMoYSkpfHx1W29dJiYhKHI9dVtvXShyKSl8fChuPXIuc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTpvLG1hdGNoZXM6cn0pLGE9YS5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiB0P2EubGVuZ3RoOmE/SS5lcnJvcihlKTpjKGUscykuc2xpY2UoMCl9ZnVuY3Rpb24gUShlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoLHI9XCJcIjt0PG47dCsrKXIrPWVbdF0udmFsdWU7cmV0dXJuIHJ9ZnVuY3Rpb24gSihhLGUsdCl7dmFyIHM9ZS5kaXIsdT1lLm5leHQsbD11fHxzLGM9dCYmXCJwYXJlbnROb2RlXCI9PT1sLGY9bisrO3JldHVybiBlLmZpcnN0P2Z1bmN0aW9uKGUsdCxuKXt3aGlsZShlPWVbc10paWYoMT09PWUubm9kZVR5cGV8fGMpcmV0dXJuIGEoZSx0LG4pO3JldHVybiExfTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPVtFLGZdO2lmKG4pe3doaWxlKGU9ZVtzXSlpZigoMT09PWUubm9kZVR5cGV8fGMpJiZhKGUsdCxuKSlyZXR1cm4hMH1lbHNlIHdoaWxlKGU9ZVtzXSlpZigxPT09ZS5ub2RlVHlwZXx8YylpZihpPWVbU118fChlW1NdPXt9KSx1JiZmZShlLHUpKWU9ZVtzXXx8ZTtlbHNle2lmKChyPWlbbF0pJiZyWzBdPT09RSYmclsxXT09PWYpcmV0dXJuIG9bMl09clsyXTtpZigoaVtsXT1vKVsyXT1hKGUsdCxuKSlyZXR1cm4hMH1yZXR1cm4hMX19ZnVuY3Rpb24gSyhpKXtyZXR1cm4gMTxpLmxlbmd0aD9mdW5jdGlvbihlLHQsbil7dmFyIHI9aS5sZW5ndGg7d2hpbGUoci0tKWlmKCFpW3JdKGUsdCxuKSlyZXR1cm4hMTtyZXR1cm4hMH06aVswXX1mdW5jdGlvbiBaKGUsdCxuLHIsaSl7Zm9yKHZhciBvLGE9W10scz0wLHU9ZS5sZW5ndGgsbD1udWxsIT10O3M8dTtzKyspKG89ZVtzXSkmJihuJiYhbihvLHIsaSl8fChhLnB1c2gobyksbCYmdC5wdXNoKHMpKSk7cmV0dXJuIGF9ZnVuY3Rpb24gZWUoZCxoLGcsdix5LGUpe3JldHVybiB2JiYhdltTXSYmKHY9ZWUodikpLHkmJiF5W1NdJiYoeT1lZSh5LGUpKSxGKGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzLHU9W10sbD1bXSxjPXQubGVuZ3RoLGY9ZXx8ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj0wLGk9dC5sZW5ndGg7cjxpO3IrKylJKGUsdFtyXSxuKTtyZXR1cm4gbn0oaHx8XCIqXCIsbi5ub2RlVHlwZT9bbl06bixbXSkscD0hZHx8IWUmJmg/ZjpaKGYsdSxkLG4scik7aWYoZz9nKHAscz15fHwoZT9kOmN8fHYpP1tdOnQsbixyKTpzPXAsdil7aT1aKHMsbCksdihpLFtdLG4sciksbz1pLmxlbmd0aDt3aGlsZShvLS0pKGE9aVtvXSkmJihzW2xbb11dPSEocFtsW29dXT1hKSl9aWYoZSl7aWYoeXx8ZCl7aWYoeSl7aT1bXSxvPXMubGVuZ3RoO3doaWxlKG8tLSkoYT1zW29dKSYmaS5wdXNoKHBbb109YSk7eShudWxsLHM9W10saSxyKX1vPXMubGVuZ3RoO3doaWxlKG8tLSkoYT1zW29dKSYmLTE8KGk9eT9zZS5jYWxsKGUsYSk6dVtvXSkmJihlW2ldPSEodFtpXT1hKSl9fWVsc2Ugcz1aKHM9PT10P3Muc3BsaWNlKGMscy5sZW5ndGgpOnMpLHk/eShudWxsLHQscyxyKTprLmFwcGx5KHQscyl9KX1mdW5jdGlvbiB0ZShlKXtmb3IodmFyIGksdCxuLHI9ZS5sZW5ndGgsbz1iLnJlbGF0aXZlW2VbMF0udHlwZV0sYT1vfHxiLnJlbGF0aXZlW1wiIFwiXSxzPW8/MTowLHU9SihmdW5jdGlvbihlKXtyZXR1cm4gZT09PWl9LGEsITApLGw9SihmdW5jdGlvbihlKXtyZXR1cm4tMTxzZS5jYWxsKGksZSl9LGEsITApLGM9W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj0hbyYmKG58fHQhPXcpfHwoKGk9dCkubm9kZVR5cGU/dShlLHQsbik6bChlLHQsbikpO3JldHVybiBpPW51bGwscn1dO3M8cjtzKyspaWYodD1iLnJlbGF0aXZlW2Vbc10udHlwZV0pYz1bSihLKGMpLHQpXTtlbHNle2lmKCh0PWIuZmlsdGVyW2Vbc10udHlwZV0uYXBwbHkobnVsbCxlW3NdLm1hdGNoZXMpKVtTXSl7Zm9yKG49KytzO248cjtuKyspaWYoYi5yZWxhdGl2ZVtlW25dLnR5cGVdKWJyZWFrO3JldHVybiBlZSgxPHMmJksoYyksMTxzJiZRKGUuc2xpY2UoMCxzLTEpLmNvbmNhdCh7dmFsdWU6XCIgXCI9PT1lW3MtMl0udHlwZT9cIipcIjpcIlwifSkpLnJlcGxhY2UodmUsXCIkMVwiKSx0LHM8biYmdGUoZS5zbGljZShzLG4pKSxuPHImJnRlKGU9ZS5zbGljZShuKSksbjxyJiZRKGUpKX1jLnB1c2godCl9cmV0dXJuIEsoYyl9ZnVuY3Rpb24gbmUoZSx0KXt2YXIgbix2LHksbSx4LHIsaT1bXSxvPVtdLGE9dVtlK1wiIFwiXTtpZighYSl7dHx8KHQ9WShlKSksbj10Lmxlbmd0aDt3aGlsZShuLS0pKGE9dGUodFtuXSkpW1NdP2kucHVzaChhKTpvLnB1c2goYSk7KGE9dShlLCh2PW8sbT0wPCh5PWkpLmxlbmd0aCx4PTA8di5sZW5ndGgscj1mdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscyx1PTAsbD1cIjBcIixjPWUmJltdLGY9W10scD13LGQ9ZXx8eCYmYi5maW5kLlRBRyhcIipcIixpKSxoPUUrPW51bGw9PXA/MTpNYXRoLnJhbmRvbSgpfHwuMSxnPWQubGVuZ3RoO2ZvcihpJiYodz10PT1UfHx0fHxpKTtsIT09ZyYmbnVsbCE9KG89ZFtsXSk7bCsrKXtpZih4JiZvKXthPTAsdHx8by5vd25lckRvY3VtZW50PT1UfHwoVihvKSxuPSFDKTt3aGlsZShzPXZbYSsrXSlpZihzKG8sdHx8VCxuKSl7ay5jYWxsKHIsbyk7YnJlYWt9aSYmKEU9aCl9bSYmKChvPSFzJiZvKSYmdS0tLGUmJmMucHVzaChvKSl9aWYodSs9bCxtJiZsIT09dSl7YT0wO3doaWxlKHM9eVthKytdKXMoYyxmLHQsbik7aWYoZSl7aWYoMDx1KXdoaWxlKGwtLSljW2xdfHxmW2xdfHwoZltsXT1wZS5jYWxsKHIpKTtmPVooZil9ay5hcHBseShyLGYpLGkmJiFlJiYwPGYubGVuZ3RoJiYxPHUreS5sZW5ndGgmJmNlLnVuaXF1ZVNvcnQocil9cmV0dXJuIGkmJihFPWgsdz1wKSxjfSxtP0Yocik6cikpKS5zZWxlY3Rvcj1lfXJldHVybiBhfWZ1bmN0aW9uIHJlKGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD1cImZ1bmN0aW9uXCI9PXR5cGVvZiBlJiZlLGM9IXImJlkoZT1sLnNlbGVjdG9yfHxlKTtpZihuPW58fFtdLDE9PT1jLmxlbmd0aCl7aWYoMjwobz1jWzBdPWNbMF0uc2xpY2UoMCkpLmxlbmd0aCYmXCJJRFwiPT09KGE9b1swXSkudHlwZSYmOT09PXQubm9kZVR5cGUmJkMmJmIucmVsYXRpdmVbb1sxXS50eXBlXSl7aWYoISh0PShiLmZpbmQuSUQoYS5tYXRjaGVzWzBdLnJlcGxhY2UoTyxQKSx0KXx8W10pWzBdKSlyZXR1cm4gbjtsJiYodD10LnBhcmVudE5vZGUpLGU9ZS5zbGljZShvLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1pPUQubmVlZHNDb250ZXh0LnRlc3QoZSk/MDpvLmxlbmd0aDt3aGlsZShpLS0pe2lmKGE9b1tpXSxiLnJlbGF0aXZlW3M9YS50eXBlXSlicmVhaztpZigodT1iLmZpbmRbc10pJiYocj11KGEubWF0Y2hlc1swXS5yZXBsYWNlKE8sUCksSC50ZXN0KG9bMF0udHlwZSkmJlUodC5wYXJlbnROb2RlKXx8dCkpKXtpZihvLnNwbGljZShpLDEpLCEoZT1yLmxlbmd0aCYmUShvKSkpcmV0dXJuIGsuYXBwbHkobixyKSxuO2JyZWFrfX19cmV0dXJuKGx8fG5lKGUsYykpKHIsdCwhQyxuLCF0fHxILnRlc3QoZSkmJlUodC5wYXJlbnROb2RlKXx8dCksbn1HLnByb3RvdHlwZT1iLmZpbHRlcnM9Yi5wc2V1ZG9zLGIuc2V0RmlsdGVycz1uZXcgRyxsZS5zb3J0U3RhYmxlPVMuc3BsaXQoXCJcIikuc29ydChsKS5qb2luKFwiXCIpPT09UyxWKCksbGUuc29ydERldGFjaGVkPSQoZnVuY3Rpb24oZSl7cmV0dXJuIDEmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihULmNyZWF0ZUVsZW1lbnQoXCJmaWVsZHNldFwiKSl9KSxjZS5maW5kPUksY2UuZXhwcltcIjpcIl09Y2UuZXhwci5wc2V1ZG9zLGNlLnVuaXF1ZT1jZS51bmlxdWVTb3J0LEkuY29tcGlsZT1uZSxJLnNlbGVjdD1yZSxJLnNldERvY3VtZW50PVYsSS50b2tlbml6ZT1ZLEkuZXNjYXBlPWNlLmVzY2FwZVNlbGVjdG9yLEkuZ2V0VGV4dD1jZS50ZXh0LEkuaXNYTUw9Y2UuaXNYTUxEb2MsSS5zZWxlY3RvcnM9Y2UuZXhwcixJLnN1cHBvcnQ9Y2Uuc3VwcG9ydCxJLnVuaXF1ZVNvcnQ9Y2UudW5pcXVlU29ydH0oKTt2YXIgZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9W10saT12b2lkIDAhPT1uO3doaWxlKChlPWVbdF0pJiY5IT09ZS5ub2RlVHlwZSlpZigxPT09ZS5ub2RlVHlwZSl7aWYoaSYmY2UoZSkuaXMobikpYnJlYWs7ci5wdXNoKGUpfXJldHVybiByfSxoPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtdO2U7ZT1lLm5leHRTaWJsaW5nKTE9PT1lLm5vZGVUeXBlJiZlIT09dCYmbi5wdXNoKGUpO3JldHVybiBufSxiPWNlLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LHc9L148KFthLXpdW15cXC9cXDA+OlxceDIwXFx0XFxyXFxuXFxmXSopW1xceDIwXFx0XFxyXFxuXFxmXSpcXC8/Pig/OjxcXC9cXDE+fCkkL2k7ZnVuY3Rpb24gVChlLG4scil7cmV0dXJuIHYobik/Y2UuZ3JlcChlLGZ1bmN0aW9uKGUsdCl7cmV0dXJuISFuLmNhbGwoZSx0LGUpIT09cn0pOm4ubm9kZVR5cGU/Y2UuZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09biE9PXJ9KTpcInN0cmluZ1wiIT10eXBlb2Ygbj9jZS5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuLTE8c2UuY2FsbChuLGUpIT09cn0pOmNlLmZpbHRlcihuLGUscil9Y2UuZmlsdGVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10WzBdO3JldHVybiBuJiYoZT1cIjpub3QoXCIrZStcIilcIiksMT09PXQubGVuZ3RoJiYxPT09ci5ub2RlVHlwZT9jZS5maW5kLm1hdGNoZXNTZWxlY3RvcihyLGUpP1tyXTpbXTpjZS5maW5kLm1hdGNoZXMoZSxjZS5ncmVwKHQsZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfSkpfSxjZS5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPXRoaXMubGVuZ3RoLGk9dGhpcztpZihcInN0cmluZ1wiIT10eXBlb2YgZSlyZXR1cm4gdGhpcy5wdXNoU3RhY2soY2UoZSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHQ9MDt0PHI7dCsrKWlmKGNlLmNvbnRhaW5zKGlbdF0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKG49dGhpcy5wdXNoU3RhY2soW10pLHQ9MDt0PHI7dCsrKWNlLmZpbmQoZSxpW3RdLG4pO3JldHVybiAxPHI/Y2UudW5pcXVlU29ydChuKTpufSxmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFQodGhpcyxlfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFQodGhpcyxlfHxbXSwhMCkpfSxpczpmdW5jdGlvbihlKXtyZXR1cm4hIVQodGhpcyxcInN0cmluZ1wiPT10eXBlb2YgZSYmYi50ZXN0KGUpP2NlKGUpOmV8fFtdLCExKS5sZW5ndGh9fSk7dmFyIGssUz0vXig/OlxccyooPFtcXHdcXFddKz4pW14+XSp8IyhbXFx3LV0rKSkkLzsoY2UuZm4uaW5pdD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaTtpZighZSlyZXR1cm4gdGhpcztpZihuPW58fGssXCJzdHJpbmdcIj09dHlwZW9mIGUpe2lmKCEocj1cIjxcIj09PWVbMF0mJlwiPlwiPT09ZVtlLmxlbmd0aC0xXSYmMzw9ZS5sZW5ndGg/W251bGwsZSxudWxsXTpTLmV4ZWMoZSkpfHwhclsxXSYmdClyZXR1cm4hdHx8dC5qcXVlcnk/KHR8fG4pLmZpbmQoZSk6dGhpcy5jb25zdHJ1Y3Rvcih0KS5maW5kKGUpO2lmKHJbMV0pe2lmKHQ9dCBpbnN0YW5jZW9mIGNlP3RbMF06dCxjZS5tZXJnZSh0aGlzLGNlLnBhcnNlSFRNTChyWzFdLHQmJnQubm9kZVR5cGU/dC5vd25lckRvY3VtZW50fHx0OkMsITApKSx3LnRlc3QoclsxXSkmJmNlLmlzUGxhaW5PYmplY3QodCkpZm9yKHIgaW4gdCl2KHRoaXNbcl0pP3RoaXNbcl0odFtyXSk6dGhpcy5hdHRyKHIsdFtyXSk7cmV0dXJuIHRoaXN9cmV0dXJuKGk9Qy5nZXRFbGVtZW50QnlJZChyWzJdKSkmJih0aGlzWzBdPWksdGhpcy5sZW5ndGg9MSksdGhpc31yZXR1cm4gZS5ub2RlVHlwZT8odGhpc1swXT1lLHRoaXMubGVuZ3RoPTEsdGhpcyk6dihlKT92b2lkIDAhPT1uLnJlYWR5P24ucmVhZHkoZSk6ZShjZSk6Y2UubWFrZUFycmF5KGUsdGhpcyl9KS5wcm90b3R5cGU9Y2UuZm4saz1jZShDKTt2YXIgRT0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxqPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2Z1bmN0aW9uIEEoZSx0KXt3aGlsZSgoZT1lW3RdKSYmMSE9PWUubm9kZVR5cGUpO3JldHVybiBlfWNlLmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKGUpe3ZhciB0PWNlKGUsdGhpcyksbj10Lmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPG47ZSsrKWlmKGNlLmNvbnRhaW5zKHRoaXMsdFtlXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXRoaXMubGVuZ3RoLG89W10sYT1cInN0cmluZ1wiIT10eXBlb2YgZSYmY2UoZSk7aWYoIWIudGVzdChlKSlmb3IoO3I8aTtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT8tMTxhLmluZGV4KG4pOjE9PT1uLm5vZGVUeXBlJiZjZS5maW5kLm1hdGNoZXNTZWxlY3RvcihuLGUpKSl7by5wdXNoKG4pO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjaygxPG8ubGVuZ3RoP2NlLnVuaXF1ZVNvcnQobyk6byl9LGluZGV4OmZ1bmN0aW9uKGUpe3JldHVybiBlP1wic3RyaW5nXCI9PXR5cGVvZiBlP3NlLmNhbGwoY2UoZSksdGhpc1swXSk6c2UuY2FsbCh0aGlzLGUuanF1ZXJ5P2VbMF06ZSk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soY2UudW5pcXVlU29ydChjZS5tZXJnZSh0aGlzLmdldCgpLGNlKGUsdCkpKSl9LGFkZEJhY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWU/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoZSkpfX0pLGNlLmVhY2goe3BhcmVudDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJjExIT09dC5ub2RlVHlwZT90Om51bGx9LHBhcmVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIGQoZSxcInBhcmVudE5vZGVcIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGQoZSxcInBhcmVudE5vZGVcIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gQShlLFwibmV4dFNpYmxpbmdcIil9LHByZXY6ZnVuY3Rpb24oZSl7cmV0dXJuIEEoZSxcInByZXZpb3VzU2libGluZ1wiKX0sbmV4dEFsbDpmdW5jdGlvbihlKXtyZXR1cm4gZChlLFwibmV4dFNpYmxpbmdcIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIGQoZSxcInByZXZpb3VzU2libGluZ1wiKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZChlLFwibmV4dFNpYmxpbmdcIixuKX0scHJldlVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZChlLFwicHJldmlvdXNTaWJsaW5nXCIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiBoKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4gaChlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZS5jb250ZW50RG9jdW1lbnQmJnIoZS5jb250ZW50RG9jdW1lbnQpP2UuY29udGVudERvY3VtZW50OihmZShlLFwidGVtcGxhdGVcIikmJihlPWUuY29udGVudHx8ZSksY2UubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9fSxmdW5jdGlvbihyLGkpe2NlLmZuW3JdPWZ1bmN0aW9uKGUsdCl7dmFyIG49Y2UubWFwKHRoaXMsaSxlKTtyZXR1cm5cIlVudGlsXCIhPT1yLnNsaWNlKC01KSYmKHQ9ZSksdCYmXCJzdHJpbmdcIj09dHlwZW9mIHQmJihuPWNlLmZpbHRlcih0LG4pKSwxPHRoaXMubGVuZ3RoJiYoaltyXXx8Y2UudW5pcXVlU29ydChuKSxFLnRlc3QocikmJm4ucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhuKX19KTt2YXIgRD0vW15cXHgyMFxcdFxcclxcblxcZl0rL2c7ZnVuY3Rpb24gTihlKXtyZXR1cm4gZX1mdW5jdGlvbiBxKGUpe3Rocm93IGV9ZnVuY3Rpb24gTChlLHQsbixyKXt2YXIgaTt0cnl7ZSYmdihpPWUucHJvbWlzZSk/aS5jYWxsKGUpLmRvbmUodCkuZmFpbChuKTplJiZ2KGk9ZS50aGVuKT9pLmNhbGwoZSx0LG4pOnQuYXBwbHkodm9pZCAwLFtlXS5zbGljZShyKSl9Y2F0Y2goZSl7bi5hcHBseSh2b2lkIDAsW2VdKX19Y2UuQ2FsbGJhY2tzPWZ1bmN0aW9uKHIpe3ZhciBlLG47cj1cInN0cmluZ1wiPT10eXBlb2Ygcj8oZT1yLG49e30sY2UuZWFjaChlLm1hdGNoKEQpfHxbXSxmdW5jdGlvbihlLHQpe25bdF09ITB9KSxuKTpjZS5leHRlbmQoe30scik7dmFyIGksdCxvLGEscz1bXSx1PVtdLGw9LTEsYz1mdW5jdGlvbigpe2ZvcihhPWF8fHIub25jZSxvPWk9ITA7dS5sZW5ndGg7bD0tMSl7dD11LnNoaWZ0KCk7d2hpbGUoKytsPHMubGVuZ3RoKSExPT09c1tsXS5hcHBseSh0WzBdLHRbMV0pJiZyLnN0b3BPbkZhbHNlJiYobD1zLmxlbmd0aCx0PSExKX1yLm1lbW9yeXx8KHQ9ITEpLGk9ITEsYSYmKHM9dD9bXTpcIlwiKX0sZj17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIHMmJih0JiYhaSYmKGw9cy5sZW5ndGgtMSx1LnB1c2godCkpLGZ1bmN0aW9uIG4oZSl7Y2UuZWFjaChlLGZ1bmN0aW9uKGUsdCl7dih0KT9yLnVuaXF1ZSYmZi5oYXModCl8fHMucHVzaCh0KTp0JiZ0Lmxlbmd0aCYmXCJzdHJpbmdcIiE9PXgodCkmJm4odCl9KX0oYXJndW1lbnRzKSx0JiYhaSYmYygpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gY2UuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSx0KXt2YXIgbjt3aGlsZSgtMTwobj1jZS5pbkFycmF5KHQscyxuKSkpcy5zcGxpY2UobiwxKSxuPD1sJiZsLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/LTE8Y2UuaW5BcnJheShlLHMpOjA8cy5sZW5ndGh9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHMmJihzPVtdKSx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGE9dT1bXSxzPXQ9XCJcIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFzfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGE9dT1bXSx0fHxpfHwocz10PVwiXCIpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiEhYX0sZmlyZVdpdGg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYXx8KHQ9W2UsKHQ9dHx8W10pLnNsaWNlP3Quc2xpY2UoKTp0XSx1LnB1c2godCksaXx8YygpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGYuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFvfX07cmV0dXJuIGZ9LGNlLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oZSl7dmFyIG89W1tcIm5vdGlmeVwiLFwicHJvZ3Jlc3NcIixjZS5DYWxsYmFja3MoXCJtZW1vcnlcIiksY2UuQ2FsbGJhY2tzKFwibWVtb3J5XCIpLDJdLFtcInJlc29sdmVcIixcImRvbmVcIixjZS5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKSxjZS5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKSwwLFwicmVzb2x2ZWRcIl0sW1wicmVqZWN0XCIsXCJmYWlsXCIsY2UuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIiksY2UuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIiksMSxcInJlamVjdGVkXCJdXSxpPVwicGVuZGluZ1wiLGE9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGl9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBzLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sXCJjYXRjaFwiOmZ1bmN0aW9uKGUpe3JldHVybiBhLnRoZW4obnVsbCxlKX0scGlwZTpmdW5jdGlvbigpe3ZhciBpPWFyZ3VtZW50cztyZXR1cm4gY2UuRGVmZXJyZWQoZnVuY3Rpb24ocil7Y2UuZWFjaChvLGZ1bmN0aW9uKGUsdCl7dmFyIG49dihpW3RbNF1dKSYmaVt0WzRdXTtzW3RbMV1dKGZ1bmN0aW9uKCl7dmFyIGU9biYmbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZSYmdihlLnByb21pc2UpP2UucHJvbWlzZSgpLnByb2dyZXNzKHIubm90aWZ5KS5kb25lKHIucmVzb2x2ZSkuZmFpbChyLnJlamVjdCk6clt0WzBdK1wiV2l0aFwiXSh0aGlzLG4/W2VdOmFyZ3VtZW50cyl9KX0pLGk9bnVsbH0pLnByb21pc2UoKX0sdGhlbjpmdW5jdGlvbih0LG4scil7dmFyIHU9MDtmdW5jdGlvbiBsKGksbyxhLHMpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMscj1hcmd1bWVudHMsZT1mdW5jdGlvbigpe3ZhciBlLHQ7aWYoIShpPHUpKXtpZigoZT1hLmFwcGx5KG4scikpPT09by5wcm9taXNlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvblwiKTt0PWUmJihcIm9iamVjdFwiPT10eXBlb2YgZXx8XCJmdW5jdGlvblwiPT10eXBlb2YgZSkmJmUudGhlbix2KHQpP3M/dC5jYWxsKGUsbCh1LG8sTixzKSxsKHUsbyxxLHMpKToodSsrLHQuY2FsbChlLGwodSxvLE4scyksbCh1LG8scSxzKSxsKHUsbyxOLG8ubm90aWZ5V2l0aCkpKTooYSE9PU4mJihuPXZvaWQgMCxyPVtlXSksKHN8fG8ucmVzb2x2ZVdpdGgpKG4scikpfX0sdD1zP2U6ZnVuY3Rpb24oKXt0cnl7ZSgpfWNhdGNoKGUpe2NlLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJmNlLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soZSx0LmVycm9yKSx1PD1pKzEmJihhIT09cSYmKG49dm9pZCAwLHI9W2VdKSxvLnJlamVjdFdpdGgobixyKSl9fTtpP3QoKTooY2UuRGVmZXJyZWQuZ2V0RXJyb3JIb29rP3QuZXJyb3I9Y2UuRGVmZXJyZWQuZ2V0RXJyb3JIb29rKCk6Y2UuRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYodC5lcnJvcj1jZS5EZWZlcnJlZC5nZXRTdGFja0hvb2soKSksaWUuc2V0VGltZW91dCh0KSl9fXJldHVybiBjZS5EZWZlcnJlZChmdW5jdGlvbihlKXtvWzBdWzNdLmFkZChsKDAsZSx2KHIpP3I6TixlLm5vdGlmeVdpdGgpKSxvWzFdWzNdLmFkZChsKDAsZSx2KHQpP3Q6TikpLG9bMl1bM10uYWRkKGwoMCxlLHYobik/bjpxKSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWU/Y2UuZXh0ZW5kKGUsYSk6YX19LHM9e307cmV0dXJuIGNlLmVhY2gobyxmdW5jdGlvbihlLHQpe3ZhciBuPXRbMl0scj10WzVdO2FbdFsxXV09bi5hZGQsciYmbi5hZGQoZnVuY3Rpb24oKXtpPXJ9LG9bMy1lXVsyXS5kaXNhYmxlLG9bMy1lXVszXS5kaXNhYmxlLG9bMF1bMl0ubG9jayxvWzBdWzNdLmxvY2spLG4uYWRkKHRbM10uZmlyZSksc1t0WzBdXT1mdW5jdGlvbigpe3JldHVybiBzW3RbMF0rXCJXaXRoXCJdKHRoaXM9PT1zP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30sc1t0WzBdK1wiV2l0aFwiXT1uLmZpcmVXaXRofSksYS5wcm9taXNlKHMpLGUmJmUuY2FsbChzLHMpLHN9LHdoZW46ZnVuY3Rpb24oZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCx0PW4scj1BcnJheSh0KSxpPWFlLmNhbGwoYXJndW1lbnRzKSxvPWNlLkRlZmVycmVkKCksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7clt0XT10aGlzLGlbdF09MTxhcmd1bWVudHMubGVuZ3RoP2FlLmNhbGwoYXJndW1lbnRzKTplLC0tbnx8by5yZXNvbHZlV2l0aChyLGkpfX07aWYobjw9MSYmKEwoZSxvLmRvbmUoYSh0KSkucmVzb2x2ZSxvLnJlamVjdCwhbiksXCJwZW5kaW5nXCI9PT1vLnN0YXRlKCl8fHYoaVt0XSYmaVt0XS50aGVuKSkpcmV0dXJuIG8udGhlbigpO3doaWxlKHQtLSlMKGlbdF0sYSh0KSxvLnJlamVjdCk7cmV0dXJuIG8ucHJvbWlzZSgpfX0pO3ZhciBIPS9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO2NlLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2s9ZnVuY3Rpb24oZSx0KXtpZS5jb25zb2xlJiZpZS5jb25zb2xlLndhcm4mJmUmJkgudGVzdChlLm5hbWUpJiZpZS5jb25zb2xlLndhcm4oXCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiBcIitlLm1lc3NhZ2UsZS5zdGFjayx0KX0sY2UucmVhZHlFeGNlcHRpb249ZnVuY3Rpb24oZSl7aWUuc2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IGV9KX07dmFyIE89Y2UuRGVmZXJyZWQoKTtmdW5jdGlvbiBQKCl7Qy5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLFApLGllLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsUCksY2UucmVhZHkoKX1jZS5mbi5yZWFkeT1mdW5jdGlvbihlKXtyZXR1cm4gTy50aGVuKGUpW1wiY2F0Y2hcIl0oZnVuY3Rpb24oZSl7Y2UucmVhZHlFeGNlcHRpb24oZSl9KSx0aGlzfSxjZS5leHRlbmQoe2lzUmVhZHk6ITEscmVhZHlXYWl0OjEscmVhZHk6ZnVuY3Rpb24oZSl7KCEwPT09ZT8tLWNlLnJlYWR5V2FpdDpjZS5pc1JlYWR5KXx8KGNlLmlzUmVhZHk9ITApIT09ZSYmMDwtLWNlLnJlYWR5V2FpdHx8Ty5yZXNvbHZlV2l0aChDLFtjZV0pfX0pLGNlLnJlYWR5LnRoZW49Ty50aGVuLFwiY29tcGxldGVcIj09PUMucmVhZHlTdGF0ZXx8XCJsb2FkaW5nXCIhPT1DLnJlYWR5U3RhdGUmJiFDLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbD9pZS5zZXRUaW1lb3V0KGNlLnJlYWR5KTooQy5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLFApLGllLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsUCkpO3ZhciBNPWZ1bmN0aW9uKGUsdCxuLHIsaSxvLGEpe3ZhciBzPTAsdT1lLmxlbmd0aCxsPW51bGw9PW47aWYoXCJvYmplY3RcIj09PXgobikpZm9yKHMgaW4gaT0hMCxuKU0oZSx0LHMsbltzXSwhMCxvLGEpO2Vsc2UgaWYodm9pZCAwIT09ciYmKGk9ITAsdihyKXx8KGE9ITApLGwmJihhPyh0LmNhbGwoZSxyKSx0PW51bGwpOihsPXQsdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGwuY2FsbChjZShlKSxuKX0pKSx0KSlmb3IoO3M8dTtzKyspdChlW3NdLG4sYT9yOnIuY2FsbChlW3NdLHMsdChlW3NdLG4pKSk7cmV0dXJuIGk/ZTpsP3QuY2FsbChlKTp1P3QoZVswXSxuKTpvfSxSPS9eLW1zLS8sST0vLShbYS16XSkvZztmdW5jdGlvbiBXKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKX1mdW5jdGlvbiBGKGUpe3JldHVybiBlLnJlcGxhY2UoUixcIm1zLVwiKS5yZXBsYWNlKEksVyl9dmFyICQ9ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfHw5PT09ZS5ub2RlVHlwZXx8IStlLm5vZGVUeXBlfTtmdW5jdGlvbiBCKCl7dGhpcy5leHBhbmRvPWNlLmV4cGFuZG8rQi51aWQrK31CLnVpZD0xLEIucHJvdG90eXBlPXtjYWNoZTpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMuZXhwYW5kb107cmV0dXJuIHR8fCh0PXt9LCQoZSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT10Ok9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHRoaXMuZXhwYW5kbyx7dmFsdWU6dCxjb25maWd1cmFibGU6ITB9KSkpLHR9LHNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT10aGlzLmNhY2hlKGUpO2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KWlbRih0KV09bjtlbHNlIGZvcihyIGluIHQpaVtGKHIpXT10W3JdO3JldHVybiBpfSxnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD90aGlzLmNhY2hlKGUpOmVbdGhpcy5leHBhbmRvXSYmZVt0aGlzLmV4cGFuZG9dW0YodCldfSxhY2Nlc3M6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT10fHx0JiZcInN0cmluZ1wiPT10eXBlb2YgdCYmdm9pZCAwPT09bj90aGlzLmdldChlLHQpOih0aGlzLnNldChlLHQsbiksdm9pZCAwIT09bj9uOnQpfSxyZW1vdmU6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWVbdGhpcy5leHBhbmRvXTtpZih2b2lkIDAhPT1yKXtpZih2b2lkIDAhPT10KXtuPSh0PUFycmF5LmlzQXJyYXkodCk/dC5tYXAoRik6KHQ9Rih0KSlpbiByP1t0XTp0Lm1hdGNoKEQpfHxbXSkubGVuZ3RoO3doaWxlKG4tLSlkZWxldGUgclt0W25dXX0odm9pZCAwPT09dHx8Y2UuaXNFbXB0eU9iamVjdChyKSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIGVbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09dCYmIWNlLmlzRW1wdHlPYmplY3QodCl9fTt2YXIgXz1uZXcgQix6PW5ldyBCLFg9L14oPzpcXHtbXFx3XFxXXSpcXH18XFxbW1xcd1xcV10qXFxdKSQvLFU9L1tBLVpdL2c7ZnVuY3Rpb24gVihlLHQsbil7dmFyIHIsaTtpZih2b2lkIDA9PT1uJiYxPT09ZS5ub2RlVHlwZSlpZihyPVwiZGF0YS1cIit0LnJlcGxhY2UoVSxcIi0kJlwiKS50b0xvd2VyQ2FzZSgpLFwic3RyaW5nXCI9PXR5cGVvZihuPWUuZ2V0QXR0cmlidXRlKHIpKSl7dHJ5e249XCJ0cnVlXCI9PT0oaT1uKXx8XCJmYWxzZVwiIT09aSYmKFwibnVsbFwiPT09aT9udWxsOmk9PT0raStcIlwiPytpOlgudGVzdChpKT9KU09OLnBhcnNlKGkpOmkpfWNhdGNoKGUpe316LnNldChlLHQsbil9ZWxzZSBuPXZvaWQgMDtyZXR1cm4gbn1jZS5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIHouaGFzRGF0YShlKXx8Xy5oYXNEYXRhKGUpfSxkYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gei5hY2Nlc3MoZSx0LG4pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7ei5yZW1vdmUoZSx0KX0sX2RhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBfLmFjY2VzcyhlLHQsbil9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7Xy5yZW1vdmUoZSx0KX19KSxjZS5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24obixlKXt2YXIgdCxyLGksbz10aGlzWzBdLGE9byYmby5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PW4pe2lmKHRoaXMubGVuZ3RoJiYoaT16LmdldChvKSwxPT09by5ub2RlVHlwZSYmIV8uZ2V0KG8sXCJoYXNEYXRhQXR0cnNcIikpKXt0PWEubGVuZ3RoO3doaWxlKHQtLSlhW3RdJiYwPT09KHI9YVt0XS5uYW1lKS5pbmRleE9mKFwiZGF0YS1cIikmJihyPUYoci5zbGljZSg1KSksVihvLHIsaVtyXSkpO18uc2V0KG8sXCJoYXNEYXRhQXR0cnNcIiwhMCl9cmV0dXJuIGl9cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIG4/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7ei5zZXQodGhpcyxuKX0pOk0odGhpcyxmdW5jdGlvbihlKXt2YXIgdDtpZihvJiZ2b2lkIDA9PT1lKXJldHVybiB2b2lkIDAhPT0odD16LmdldChvLG4pKT90OnZvaWQgMCE9PSh0PVYobyxuKSk/dDp2b2lkIDA7dGhpcy5lYWNoKGZ1bmN0aW9uKCl7ei5zZXQodGhpcyxuLGUpfSl9LG51bGwsZSwxPGFyZ3VtZW50cy5sZW5ndGgsbnVsbCwhMCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3oucmVtb3ZlKHRoaXMsZSl9KX19KSxjZS5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZihlKXJldHVybiB0PSh0fHxcImZ4XCIpK1wicXVldWVcIixyPV8uZ2V0KGUsdCksbiYmKCFyfHxBcnJheS5pc0FycmF5KG4pP3I9Xy5hY2Nlc3MoZSx0LGNlLm1ha2VBcnJheShuKSk6ci5wdXNoKG4pKSxyfHxbXX0sZGVxdWV1ZTpmdW5jdGlvbihlLHQpe3Q9dHx8XCJmeFwiO3ZhciBuPWNlLnF1ZXVlKGUsdCkscj1uLmxlbmd0aCxpPW4uc2hpZnQoKSxvPWNlLl9xdWV1ZUhvb2tzKGUsdCk7XCJpbnByb2dyZXNzXCI9PT1pJiYoaT1uLnNoaWZ0KCksci0tKSxpJiYoXCJmeFwiPT09dCYmbi51bnNoaWZ0KFwiaW5wcm9ncmVzc1wiKSxkZWxldGUgby5zdG9wLGkuY2FsbChlLGZ1bmN0aW9uKCl7Y2UuZGVxdWV1ZShlLHQpfSxvKSksIXImJm8mJm8uZW1wdHkuZmlyZSgpfSxfcXVldWVIb29rczpmdW5jdGlvbihlLHQpe3ZhciBuPXQrXCJxdWV1ZUhvb2tzXCI7cmV0dXJuIF8uZ2V0KGUsbil8fF8uYWNjZXNzKGUsbix7ZW1wdHk6Y2UuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIikuYWRkKGZ1bmN0aW9uKCl7Xy5yZW1vdmUoZSxbdCtcInF1ZXVlXCIsbl0pfSl9KX19KSxjZS5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKHQsbil7dmFyIGU9MjtyZXR1cm5cInN0cmluZ1wiIT10eXBlb2YgdCYmKG49dCx0PVwiZnhcIixlLS0pLGFyZ3VtZW50cy5sZW5ndGg8ZT9jZS5xdWV1ZSh0aGlzWzBdLHQpOnZvaWQgMD09PW4/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1jZS5xdWV1ZSh0aGlzLHQsbik7Y2UuX3F1ZXVlSG9va3ModGhpcyx0KSxcImZ4XCI9PT10JiZcImlucHJvZ3Jlc3NcIiE9PWVbMF0mJmNlLmRlcXVldWUodGhpcyx0KX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjZS5kZXF1ZXVlKHRoaXMsZSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5xdWV1ZShlfHxcImZ4XCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0xLGk9Y2UuRGVmZXJyZWQoKSxvPXRoaXMsYT10aGlzLmxlbmd0aCxzPWZ1bmN0aW9uKCl7LS1yfHxpLnJlc29sdmVXaXRoKG8sW29dKX07XCJzdHJpbmdcIiE9dHlwZW9mIGUmJih0PWUsZT12b2lkIDApLGU9ZXx8XCJmeFwiO3doaWxlKGEtLSkobj1fLmdldChvW2FdLGUrXCJxdWV1ZUhvb2tzXCIpKSYmbi5lbXB0eSYmKHIrKyxuLmVtcHR5LmFkZChzKSk7cmV0dXJuIHMoKSxpLnByb21pc2UodCl9fSk7dmFyIEc9L1srLV0/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bKy1dP1xcZCt8KS8uc291cmNlLFk9bmV3IFJlZ0V4cChcIl4oPzooWystXSk9fCkoXCIrRytcIikoW2EteiVdKikkXCIsXCJpXCIpLFE9W1wiVG9wXCIsXCJSaWdodFwiLFwiQm90dG9tXCIsXCJMZWZ0XCJdLEo9Qy5kb2N1bWVudEVsZW1lbnQsSz1mdW5jdGlvbihlKXtyZXR1cm4gY2UuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfSxaPXtjb21wb3NlZDohMH07Si5nZXRSb290Tm9kZSYmKEs9ZnVuY3Rpb24oZSl7cmV0dXJuIGNlLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKXx8ZS5nZXRSb290Tm9kZShaKT09PWUub3duZXJEb2N1bWVudH0pO3ZhciBlZT1mdW5jdGlvbihlLHQpe3JldHVyblwibm9uZVwiPT09KGU9dHx8ZSkuc3R5bGUuZGlzcGxheXx8XCJcIj09PWUuc3R5bGUuZGlzcGxheSYmSyhlKSYmXCJub25lXCI9PT1jZS5jc3MoZSxcImRpc3BsYXlcIil9O2Z1bmN0aW9uIHRlKGUsdCxuLHIpe3ZhciBpLG8sYT0yMCxzPXI/ZnVuY3Rpb24oKXtyZXR1cm4gci5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gY2UuY3NzKGUsdCxcIlwiKX0sdT1zKCksbD1uJiZuWzNdfHwoY2UuY3NzTnVtYmVyW3RdP1wiXCI6XCJweFwiKSxjPWUubm9kZVR5cGUmJihjZS5jc3NOdW1iZXJbdF18fFwicHhcIiE9PWwmJit1KSYmWS5leGVjKGNlLmNzcyhlLHQpKTtpZihjJiZjWzNdIT09bCl7dS89MixsPWx8fGNbM10sYz0rdXx8MTt3aGlsZShhLS0pY2Uuc3R5bGUoZSx0LGMrbCksKDEtbykqKDEtKG89cygpL3V8fC41KSk8PTAmJihhPTApLGMvPW87Yyo9MixjZS5zdHlsZShlLHQsYytsKSxuPW58fFtdfXJldHVybiBuJiYoYz0rY3x8K3V8fDAsaT1uWzFdP2MrKG5bMV0rMSkqblsyXTorblsyXSxyJiYoci51bml0PWwsci5zdGFydD1jLHIuZW5kPWkpKSxpfXZhciBuZT17fTtmdW5jdGlvbiByZShlLHQpe2Zvcih2YXIgbixyLGksbyxhLHMsdSxsPVtdLGM9MCxmPWUubGVuZ3RoO2M8ZjtjKyspKHI9ZVtjXSkuc3R5bGUmJihuPXIuc3R5bGUuZGlzcGxheSx0PyhcIm5vbmVcIj09PW4mJihsW2NdPV8uZ2V0KHIsXCJkaXNwbGF5XCIpfHxudWxsLGxbY118fChyLnN0eWxlLmRpc3BsYXk9XCJcIikpLFwiXCI9PT1yLnN0eWxlLmRpc3BsYXkmJmVlKHIpJiYobFtjXT0odT1hPW89dm9pZCAwLGE9KGk9cikub3duZXJEb2N1bWVudCxzPWkubm9kZU5hbWUsKHU9bmVbc10pfHwobz1hLmJvZHkuYXBwZW5kQ2hpbGQoYS5jcmVhdGVFbGVtZW50KHMpKSx1PWNlLmNzcyhvLFwiZGlzcGxheVwiKSxvLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobyksXCJub25lXCI9PT11JiYodT1cImJsb2NrXCIpLG5lW3NdPXUpKSkpOlwibm9uZVwiIT09biYmKGxbY109XCJub25lXCIsXy5zZXQocixcImRpc3BsYXlcIixuKSkpO2ZvcihjPTA7YzxmO2MrKyludWxsIT1sW2NdJiYoZVtjXS5zdHlsZS5kaXNwbGF5PWxbY10pO3JldHVybiBlfWNlLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbigpe3JldHVybiByZSh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiByZSh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGUpe3JldHVyblwiYm9vbGVhblwiPT10eXBlb2YgZT9lP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe2VlKHRoaXMpP2NlKHRoaXMpLnNob3coKTpjZSh0aGlzKS5oaWRlKCl9KX19KTt2YXIgeGUsYmUsd2U9L14oPzpjaGVja2JveHxyYWRpbykkL2ksVGU9LzwoW2Etel1bXlxcL1xcMD5cXHgyMFxcdFxcclxcblxcZl0qKS9pLENlPS9eJHxebW9kdWxlJHxcXC8oPzpqYXZhfGVjbWEpc2NyaXB0L2k7eGU9Qy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkuYXBwZW5kQ2hpbGQoQy5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKSwoYmU9Qy5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIikpLnNldEF0dHJpYnV0ZShcInR5cGVcIixcInJhZGlvXCIpLGJlLnNldEF0dHJpYnV0ZShcImNoZWNrZWRcIixcImNoZWNrZWRcIiksYmUuc2V0QXR0cmlidXRlKFwibmFtZVwiLFwidFwiKSx4ZS5hcHBlbmRDaGlsZChiZSksbGUuY2hlY2tDbG9uZT14ZS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQseGUuaW5uZXJIVE1MPVwiPHRleHRhcmVhPng8L3RleHRhcmVhPlwiLGxlLm5vQ2xvbmVDaGVja2VkPSEheGUuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlLHhlLmlubmVySFRNTD1cIjxvcHRpb24+PC9vcHRpb24+XCIsbGUub3B0aW9uPSEheGUubGFzdENoaWxkO3ZhciBrZT17dGhlYWQ6WzEsXCI8dGFibGU+XCIsXCI8L3RhYmxlPlwiXSxjb2w6WzIsXCI8dGFibGU+PGNvbGdyb3VwPlwiLFwiPC9jb2xncm91cD48L3RhYmxlPlwiXSx0cjpbMixcIjx0YWJsZT48dGJvZHk+XCIsXCI8L3Rib2R5PjwvdGFibGU+XCJdLHRkOlszLFwiPHRhYmxlPjx0Ym9keT48dHI+XCIsXCI8L3RyPjwvdGJvZHk+PC90YWJsZT5cIl0sX2RlZmF1bHQ6WzAsXCJcIixcIlwiXX07ZnVuY3Rpb24gU2UoZSx0KXt2YXIgbjtyZXR1cm4gbj1cInVuZGVmaW5lZFwiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHR8fFwiKlwiKTpcInVuZGVmaW5lZFwiIT10eXBlb2YgZS5xdWVyeVNlbGVjdG9yQWxsP2UucXVlcnlTZWxlY3RvckFsbCh0fHxcIipcIik6W10sdm9pZCAwPT09dHx8dCYmZmUoZSx0KT9jZS5tZXJnZShbZV0sbik6bn1mdW5jdGlvbiBFZShlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylfLnNldChlW25dLFwiZ2xvYmFsRXZhbFwiLCF0fHxfLmdldCh0W25dLFwiZ2xvYmFsRXZhbFwiKSl9a2UudGJvZHk9a2UudGZvb3Q9a2UuY29sZ3JvdXA9a2UuY2FwdGlvbj1rZS50aGVhZCxrZS50aD1rZS50ZCxsZS5vcHRpb258fChrZS5vcHRncm91cD1rZS5vcHRpb249WzEsXCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+XCIsXCI8L3NlbGVjdD5cIl0pO3ZhciBqZT0vPHwmIz9cXHcrOy87ZnVuY3Rpb24gQWUoZSx0LG4scixpKXtmb3IodmFyIG8sYSxzLHUsbCxjLGY9dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkscD1bXSxkPTAsaD1lLmxlbmd0aDtkPGg7ZCsrKWlmKChvPWVbZF0pfHwwPT09bylpZihcIm9iamVjdFwiPT09eChvKSljZS5tZXJnZShwLG8ubm9kZVR5cGU/W29dOm8pO2Vsc2UgaWYoamUudGVzdChvKSl7YT1hfHxmLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudChcImRpdlwiKSkscz0oVGUuZXhlYyhvKXx8W1wiXCIsXCJcIl0pWzFdLnRvTG93ZXJDYXNlKCksdT1rZVtzXXx8a2UuX2RlZmF1bHQsYS5pbm5lckhUTUw9dVsxXStjZS5odG1sUHJlZmlsdGVyKG8pK3VbMl0sYz11WzBdO3doaWxlKGMtLSlhPWEubGFzdENoaWxkO2NlLm1lcmdlKHAsYS5jaGlsZE5vZGVzKSwoYT1mLmZpcnN0Q2hpbGQpLnRleHRDb250ZW50PVwiXCJ9ZWxzZSBwLnB1c2godC5jcmVhdGVUZXh0Tm9kZShvKSk7Zi50ZXh0Q29udGVudD1cIlwiLGQ9MDt3aGlsZShvPXBbZCsrXSlpZihyJiYtMTxjZS5pbkFycmF5KG8scikpaSYmaS5wdXNoKG8pO2Vsc2UgaWYobD1LKG8pLGE9U2UoZi5hcHBlbmRDaGlsZChvKSxcInNjcmlwdFwiKSxsJiZFZShhKSxuKXtjPTA7d2hpbGUobz1hW2MrK10pQ2UudGVzdChvLnR5cGV8fFwiXCIpJiZuLnB1c2gobyl9cmV0dXJuIGZ9dmFyIERlPS9eKFteLl0qKSg/OlxcLiguKyl8KS87ZnVuY3Rpb24gTmUoKXtyZXR1cm4hMH1mdW5jdGlvbiBxZSgpe3JldHVybiExfWZ1bmN0aW9uIExlKGUsdCxuLHIsaSxvKXt2YXIgYSxzO2lmKFwib2JqZWN0XCI9PXR5cGVvZiB0KXtmb3IocyBpblwic3RyaW5nXCIhPXR5cGVvZiBuJiYocj1yfHxuLG49dm9pZCAwKSx0KUxlKGUscyxuLHIsdFtzXSxvKTtyZXR1cm4gZX1pZihudWxsPT1yJiZudWxsPT1pPyhpPW4scj1uPXZvaWQgMCk6bnVsbD09aSYmKFwic3RyaW5nXCI9PXR5cGVvZiBuPyhpPXIscj12b2lkIDApOihpPXIscj1uLG49dm9pZCAwKSksITE9PT1pKWk9cWU7ZWxzZSBpZighaSlyZXR1cm4gZTtyZXR1cm4gMT09PW8mJihhPWksKGk9ZnVuY3Rpb24oZSl7cmV0dXJuIGNlKCkub2ZmKGUpLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfSkuZ3VpZD1hLmd1aWR8fChhLmd1aWQ9Y2UuZ3VpZCsrKSksZS5lYWNoKGZ1bmN0aW9uKCl7Y2UuZXZlbnQuYWRkKHRoaXMsdCxpLHIsbil9KX1mdW5jdGlvbiBIZShlLHIsdCl7dD8oXy5zZXQoZSxyLCExKSxjZS5ldmVudC5hZGQoZSxyLHtuYW1lc3BhY2U6ITEsaGFuZGxlcjpmdW5jdGlvbihlKXt2YXIgdCxuPV8uZ2V0KHRoaXMscik7aWYoMSZlLmlzVHJpZ2dlciYmdGhpc1tyXSl7aWYobikoY2UuZXZlbnQuc3BlY2lhbFtyXXx8e30pLmRlbGVnYXRlVHlwZSYmZS5zdG9wUHJvcGFnYXRpb24oKTtlbHNlIGlmKG49YWUuY2FsbChhcmd1bWVudHMpLF8uc2V0KHRoaXMscixuKSx0aGlzW3JdKCksdD1fLmdldCh0aGlzLHIpLF8uc2V0KHRoaXMsciwhMSksbiE9PXQpcmV0dXJuIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksZS5wcmV2ZW50RGVmYXVsdCgpLHR9ZWxzZSBuJiYoXy5zZXQodGhpcyxyLGNlLmV2ZW50LnRyaWdnZXIoblswXSxuLnNsaWNlKDEpLHRoaXMpKSxlLnN0b3BQcm9wYWdhdGlvbigpLGUuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9TmUpfX0pKTp2b2lkIDA9PT1fLmdldChlLHIpJiZjZS5ldmVudC5hZGQoZSxyLE5lKX1jZS5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvLGEscyx1LGwsYyxmLHAsZCxoLGcsdj1fLmdldCh0KTtpZigkKHQpKXtuLmhhbmRsZXImJihuPShvPW4pLmhhbmRsZXIsaT1vLnNlbGVjdG9yKSxpJiZjZS5maW5kLm1hdGNoZXNTZWxlY3RvcihKLGkpLG4uZ3VpZHx8KG4uZ3VpZD1jZS5ndWlkKyspLCh1PXYuZXZlbnRzKXx8KHU9di5ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSksKGE9di5oYW5kbGUpfHwoYT12LmhhbmRsZT1mdW5jdGlvbihlKXtyZXR1cm5cInVuZGVmaW5lZFwiIT10eXBlb2YgY2UmJmNlLmV2ZW50LnRyaWdnZXJlZCE9PWUudHlwZT9jZS5ldmVudC5kaXNwYXRjaC5hcHBseSh0LGFyZ3VtZW50cyk6dm9pZCAwfSksbD0oZT0oZXx8XCJcIikubWF0Y2goRCl8fFtcIlwiXSkubGVuZ3RoO3doaWxlKGwtLSlkPWc9KHM9RGUuZXhlYyhlW2xdKXx8W10pWzFdLGg9KHNbMl18fFwiXCIpLnNwbGl0KFwiLlwiKS5zb3J0KCksZCYmKGY9Y2UuZXZlbnQuc3BlY2lhbFtkXXx8e30sZD0oaT9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8ZCxmPWNlLmV2ZW50LnNwZWNpYWxbZF18fHt9LGM9Y2UuZXh0ZW5kKHt0eXBlOmQsb3JpZ1R5cGU6ZyxkYXRhOnIsaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOmksbmVlZHNDb250ZXh0OmkmJmNlLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoaSksbmFtZXNwYWNlOmguam9pbihcIi5cIil9LG8pLChwPXVbZF0pfHwoKHA9dVtkXT1bXSkuZGVsZWdhdGVDb3VudD0wLGYuc2V0dXAmJiExIT09Zi5zZXR1cC5jYWxsKHQscixoLGEpfHx0LmFkZEV2ZW50TGlzdGVuZXImJnQuYWRkRXZlbnRMaXN0ZW5lcihkLGEpKSxmLmFkZCYmKGYuYWRkLmNhbGwodCxjKSxjLmhhbmRsZXIuZ3VpZHx8KGMuaGFuZGxlci5ndWlkPW4uZ3VpZCkpLGk/cC5zcGxpY2UocC5kZWxlZ2F0ZUNvdW50KyssMCxjKTpwLnB1c2goYyksY2UuZXZlbnQuZ2xvYmFsW2RdPSEwKX19LHJlbW92ZTpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscyx1LGwsYyxmLHAsZCxoLGcsdj1fLmhhc0RhdGEoZSkmJl8uZ2V0KGUpO2lmKHYmJih1PXYuZXZlbnRzKSl7bD0odD0odHx8XCJcIikubWF0Y2goRCl8fFtcIlwiXSkubGVuZ3RoO3doaWxlKGwtLSlpZihkPWc9KHM9RGUuZXhlYyh0W2xdKXx8W10pWzFdLGg9KHNbMl18fFwiXCIpLnNwbGl0KFwiLlwiKS5zb3J0KCksZCl7Zj1jZS5ldmVudC5zcGVjaWFsW2RdfHx7fSxwPXVbZD0ocj9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8ZF18fFtdLHM9c1syXSYmbmV3IFJlZ0V4cChcIihefFxcXFwuKVwiK2guam9pbihcIlxcXFwuKD86LipcXFxcLnwpXCIpK1wiKFxcXFwufCQpXCIpLGE9bz1wLmxlbmd0aDt3aGlsZShvLS0pYz1wW29dLCFpJiZnIT09Yy5vcmlnVHlwZXx8biYmbi5ndWlkIT09Yy5ndWlkfHxzJiYhcy50ZXN0KGMubmFtZXNwYWNlKXx8ciYmciE9PWMuc2VsZWN0b3ImJihcIioqXCIhPT1yfHwhYy5zZWxlY3Rvcil8fChwLnNwbGljZShvLDEpLGMuc2VsZWN0b3ImJnAuZGVsZWdhdGVDb3VudC0tLGYucmVtb3ZlJiZmLnJlbW92ZS5jYWxsKGUsYykpO2EmJiFwLmxlbmd0aCYmKGYudGVhcmRvd24mJiExIT09Zi50ZWFyZG93bi5jYWxsKGUsaCx2LmhhbmRsZSl8fGNlLnJlbW92ZUV2ZW50KGUsZCx2LmhhbmRsZSksZGVsZXRlIHVbZF0pfWVsc2UgZm9yKGQgaW4gdSljZS5ldmVudC5yZW1vdmUoZSxkK3RbbF0sbixyLCEwKTtjZS5pc0VtcHR5T2JqZWN0KHUpJiZfLnJlbW92ZShlLFwiaGFuZGxlIGV2ZW50c1wiKX19LGRpc3BhdGNoOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYSxzPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSx1PWNlLmV2ZW50LmZpeChlKSxsPShfLmdldCh0aGlzLFwiZXZlbnRzXCIpfHxPYmplY3QuY3JlYXRlKG51bGwpKVt1LnR5cGVdfHxbXSxjPWNlLmV2ZW50LnNwZWNpYWxbdS50eXBlXXx8e307Zm9yKHNbMF09dSx0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKylzW3RdPWFyZ3VtZW50c1t0XTtpZih1LmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWMucHJlRGlzcGF0Y2h8fCExIT09Yy5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsdSkpe2E9Y2UuZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLHUsbCksdD0wO3doaWxlKChpPWFbdCsrXSkmJiF1LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe3UuY3VycmVudFRhcmdldD1pLmVsZW0sbj0wO3doaWxlKChvPWkuaGFuZGxlcnNbbisrXSkmJiF1LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpdS5ybmFtZXNwYWNlJiYhMSE9PW8ubmFtZXNwYWNlJiYhdS5ybmFtZXNwYWNlLnRlc3Qoby5uYW1lc3BhY2UpfHwodS5oYW5kbGVPYmo9byx1LmRhdGE9by5kYXRhLHZvaWQgMCE9PShyPSgoY2UuZXZlbnQuc3BlY2lhbFtvLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8by5oYW5kbGVyKS5hcHBseShpLmVsZW0scykpJiYhMT09PSh1LnJlc3VsdD1yKSYmKHUucHJldmVudERlZmF1bHQoKSx1LnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGMucG9zdERpc3BhdGNoJiZjLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsdSksdS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscz1bXSx1PXQuZGVsZWdhdGVDb3VudCxsPWUudGFyZ2V0O2lmKHUmJmwubm9kZVR5cGUmJiEoXCJjbGlja1wiPT09ZS50eXBlJiYxPD1lLmJ1dHRvbikpZm9yKDtsIT09dGhpcztsPWwucGFyZW50Tm9kZXx8dGhpcylpZigxPT09bC5ub2RlVHlwZSYmKFwiY2xpY2tcIiE9PWUudHlwZXx8ITAhPT1sLmRpc2FibGVkKSl7Zm9yKG89W10sYT17fSxuPTA7bjx1O24rKyl2b2lkIDA9PT1hW2k9KHI9dFtuXSkuc2VsZWN0b3IrXCIgXCJdJiYoYVtpXT1yLm5lZWRzQ29udGV4dD8tMTxjZShpLHRoaXMpLmluZGV4KGwpOmNlLmZpbmQoaSx0aGlzLG51bGwsW2xdKS5sZW5ndGgpLGFbaV0mJm8ucHVzaChyKTtvLmxlbmd0aCYmcy5wdXNoKHtlbGVtOmwsaGFuZGxlcnM6b30pfXJldHVybiBsPXRoaXMsdTx0Lmxlbmd0aCYmcy5wdXNoKHtlbGVtOmwsaGFuZGxlcnM6dC5zbGljZSh1KX0pLHN9LGFkZFByb3A6ZnVuY3Rpb24odCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoY2UuRXZlbnQucHJvdG90eXBlLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDp2KGUpP2Z1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiBlKHRoaXMub3JpZ2luYWxFdmVudCl9OmZ1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbdF19LHNldDpmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTplfSl9fSl9LGZpeDpmdW5jdGlvbihlKXtyZXR1cm4gZVtjZS5leHBhbmRvXT9lOm5ldyBjZS5FdmVudChlKX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGNsaWNrOntzZXR1cDpmdW5jdGlvbihlKXt2YXIgdD10aGlzfHxlO3JldHVybiB3ZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJmZlKHQsXCJpbnB1dFwiKSYmSGUodCxcImNsaWNrXCIsITApLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXN8fGU7cmV0dXJuIHdlLnRlc3QodC50eXBlKSYmdC5jbGljayYmZmUodCxcImlucHV0XCIpJiZIZSh0LFwiY2xpY2tcIiksITB9LF9kZWZhdWx0OmZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0O3JldHVybiB3ZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJmZlKHQsXCJpbnB1dFwiKSYmXy5nZXQodCxcImNsaWNrXCIpfHxmZSh0LFwiYVwiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUucmVzdWx0JiZlLm9yaWdpbmFsRXZlbnQmJihlLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9ZS5yZXN1bHQpfX19fSxjZS5yZW1vdmVFdmVudD1mdW5jdGlvbihlLHQsbil7ZS5yZW1vdmVFdmVudExpc3RlbmVyJiZlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuKX0sY2UuRXZlbnQ9ZnVuY3Rpb24oZSx0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBjZS5FdmVudCkpcmV0dXJuIG5ldyBjZS5FdmVudChlLHQpO2UmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PWUuZGVmYXVsdFByZXZlbnRlZCYmITE9PT1lLnJldHVyblZhbHVlP05lOnFlLHRoaXMudGFyZ2V0PWUudGFyZ2V0JiYzPT09ZS50YXJnZXQubm9kZVR5cGU/ZS50YXJnZXQucGFyZW50Tm9kZTplLnRhcmdldCx0aGlzLmN1cnJlbnRUYXJnZXQ9ZS5jdXJyZW50VGFyZ2V0LHRoaXMucmVsYXRlZFRhcmdldD1lLnJlbGF0ZWRUYXJnZXQpOnRoaXMudHlwZT1lLHQmJmNlLmV4dGVuZCh0aGlzLHQpLHRoaXMudGltZVN0YW1wPWUmJmUudGltZVN0YW1wfHxEYXRlLm5vdygpLHRoaXNbY2UuZXhwYW5kb109ITB9LGNlLkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6Y2UuRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOnFlLGlzUHJvcGFnYXRpb25TdG9wcGVkOnFlLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOnFlLGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPU5lLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPU5lLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1OZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sY2UuZWFjaCh7YWx0S2V5OiEwLGJ1YmJsZXM6ITAsY2FuY2VsYWJsZTohMCxjaGFuZ2VkVG91Y2hlczohMCxjdHJsS2V5OiEwLGRldGFpbDohMCxldmVudFBoYXNlOiEwLG1ldGFLZXk6ITAscGFnZVg6ITAscGFnZVk6ITAsc2hpZnRLZXk6ITAsdmlldzohMCxcImNoYXJcIjohMCxjb2RlOiEwLGNoYXJDb2RlOiEwLGtleTohMCxrZXlDb2RlOiEwLGJ1dHRvbjohMCxidXR0b25zOiEwLGNsaWVudFg6ITAsY2xpZW50WTohMCxvZmZzZXRYOiEwLG9mZnNldFk6ITAscG9pbnRlcklkOiEwLHBvaW50ZXJUeXBlOiEwLHNjcmVlblg6ITAsc2NyZWVuWTohMCx0YXJnZXRUb3VjaGVzOiEwLHRvRWxlbWVudDohMCx0b3VjaGVzOiEwLHdoaWNoOiEwfSxjZS5ldmVudC5hZGRQcm9wKSxjZS5lYWNoKHtmb2N1czpcImZvY3VzaW5cIixibHVyOlwiZm9jdXNvdXRcIn0sZnVuY3Rpb24ocixpKXtmdW5jdGlvbiBvKGUpe2lmKEMuZG9jdW1lbnRNb2RlKXt2YXIgdD1fLmdldCh0aGlzLFwiaGFuZGxlXCIpLG49Y2UuZXZlbnQuZml4KGUpO24udHlwZT1cImZvY3VzaW5cIj09PWUudHlwZT9cImZvY3VzXCI6XCJibHVyXCIsbi5pc1NpbXVsYXRlZD0hMCx0KGUpLG4udGFyZ2V0PT09bi5jdXJyZW50VGFyZ2V0JiZ0KG4pfWVsc2UgY2UuZXZlbnQuc2ltdWxhdGUoaSxlLnRhcmdldCxjZS5ldmVudC5maXgoZSkpfWNlLmV2ZW50LnNwZWNpYWxbcl09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIGU7aWYoSGUodGhpcyxyLCEwKSwhQy5kb2N1bWVudE1vZGUpcmV0dXJuITE7KGU9Xy5nZXQodGhpcyxpKSl8fHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihpLG8pLF8uc2V0KHRoaXMsaSwoZXx8MCkrMSl9LHRyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gSGUodGhpcyxyKSwhMH0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgZTtpZighQy5kb2N1bWVudE1vZGUpcmV0dXJuITE7KGU9Xy5nZXQodGhpcyxpKS0xKT9fLnNldCh0aGlzLGksZSk6KHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihpLG8pLF8ucmVtb3ZlKHRoaXMsaSkpfSxfZGVmYXVsdDpmdW5jdGlvbihlKXtyZXR1cm4gXy5nZXQoZS50YXJnZXQscil9LGRlbGVnYXRlVHlwZTppfSxjZS5ldmVudC5zcGVjaWFsW2ldPXtzZXR1cDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcy5kb2N1bWVudHx8dGhpcyx0PUMuZG9jdW1lbnRNb2RlP3RoaXM6ZSxuPV8uZ2V0KHQsaSk7bnx8KEMuZG9jdW1lbnRNb2RlP3RoaXMuYWRkRXZlbnRMaXN0ZW5lcihpLG8pOmUuYWRkRXZlbnRMaXN0ZW5lcihyLG8sITApKSxfLnNldCh0LGksKG58fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcy5kb2N1bWVudHx8dGhpcyx0PUMuZG9jdW1lbnRNb2RlP3RoaXM6ZSxuPV8uZ2V0KHQsaSktMTtuP18uc2V0KHQsaSxuKTooQy5kb2N1bWVudE1vZGU/dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGksbyk6ZS5yZW1vdmVFdmVudExpc3RlbmVyKHIsbywhMCksXy5yZW1vdmUodCxpKSl9fX0pLGNlLmVhY2goe21vdXNlZW50ZXI6XCJtb3VzZW92ZXJcIixtb3VzZWxlYXZlOlwibW91c2VvdXRcIixwb2ludGVyZW50ZXI6XCJwb2ludGVyb3ZlclwiLHBvaW50ZXJsZWF2ZTpcInBvaW50ZXJvdXRcIn0sZnVuY3Rpb24oZSxpKXtjZS5ldmVudC5zcGVjaWFsW2VdPXtkZWxlZ2F0ZVR5cGU6aSxiaW5kVHlwZTppLGhhbmRsZTpmdW5jdGlvbihlKXt2YXIgdCxuPWUucmVsYXRlZFRhcmdldCxyPWUuaGFuZGxlT2JqO3JldHVybiBuJiYobj09PXRoaXN8fGNlLmNvbnRhaW5zKHRoaXMsbikpfHwoZS50eXBlPXIub3JpZ1R5cGUsdD1yLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT1pKSx0fX19KSxjZS5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBMZSh0aGlzLGUsdCxuLHIpfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIExlKHRoaXMsZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiByPWUuaGFuZGxlT2JqLGNlKGUuZGVsZWdhdGVUYXJnZXQpLm9mZihyLm5hbWVzcGFjZT9yLm9yaWdUeXBlK1wiLlwiK3IubmFtZXNwYWNlOnIub3JpZ1R5cGUsci5zZWxlY3RvcixyLmhhbmRsZXIpLHRoaXM7aWYoXCJvYmplY3RcIj09dHlwZW9mIGUpe2ZvcihpIGluIGUpdGhpcy5vZmYoaSx0LGVbaV0pO3JldHVybiB0aGlzfXJldHVybiExIT09dCYmXCJmdW5jdGlvblwiIT10eXBlb2YgdHx8KG49dCx0PXZvaWQgMCksITE9PT1uJiYobj1xZSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Y2UuZXZlbnQucmVtb3ZlKHRoaXMsZSxuLHQpfSl9fSk7dmFyIE9lPS88c2NyaXB0fDxzdHlsZXw8bGluay9pLFBlPS9jaGVja2VkXFxzKig/OltePV18PVxccyouY2hlY2tlZC4pL2ksTWU9L15cXHMqPCFcXFtDREFUQVxcW3xcXF1cXF0+XFxzKiQvZztmdW5jdGlvbiBSZShlLHQpe3JldHVybiBmZShlLFwidGFibGVcIikmJmZlKDExIT09dC5ub2RlVHlwZT90OnQuZmlyc3RDaGlsZCxcInRyXCIpJiZjZShlKS5jaGlsZHJlbihcInRib2R5XCIpWzBdfHxlfWZ1bmN0aW9uIEllKGUpe3JldHVybiBlLnR5cGU9KG51bGwhPT1lLmdldEF0dHJpYnV0ZShcInR5cGVcIikpK1wiL1wiK2UudHlwZSxlfWZ1bmN0aW9uIFdlKGUpe3JldHVyblwidHJ1ZS9cIj09PShlLnR5cGV8fFwiXCIpLnNsaWNlKDAsNSk/ZS50eXBlPWUudHlwZS5zbGljZSg1KTplLnJlbW92ZUF0dHJpYnV0ZShcInR5cGVcIiksZX1mdW5jdGlvbiBGZShlLHQpe3ZhciBuLHIsaSxvLGEscztpZigxPT09dC5ub2RlVHlwZSl7aWYoXy5oYXNEYXRhKGUpJiYocz1fLmdldChlKS5ldmVudHMpKWZvcihpIGluIF8ucmVtb3ZlKHQsXCJoYW5kbGUgZXZlbnRzXCIpLHMpZm9yKG49MCxyPXNbaV0ubGVuZ3RoO248cjtuKyspY2UuZXZlbnQuYWRkKHQsaSxzW2ldW25dKTt6Lmhhc0RhdGEoZSkmJihvPXouYWNjZXNzKGUpLGE9Y2UuZXh0ZW5kKHt9LG8pLHouc2V0KHQsYSkpfX1mdW5jdGlvbiAkZShuLHIsaSxvKXtyPWcocik7dmFyIGUsdCxhLHMsdSxsLGM9MCxmPW4ubGVuZ3RoLHA9Zi0xLGQ9clswXSxoPXYoZCk7aWYoaHx8MTxmJiZcInN0cmluZ1wiPT10eXBlb2YgZCYmIWxlLmNoZWNrQ2xvbmUmJlBlLnRlc3QoZCkpcmV0dXJuIG4uZWFjaChmdW5jdGlvbihlKXt2YXIgdD1uLmVxKGUpO2gmJihyWzBdPWQuY2FsbCh0aGlzLGUsdC5odG1sKCkpKSwkZSh0LHIsaSxvKX0pO2lmKGYmJih0PShlPUFlKHIsblswXS5vd25lckRvY3VtZW50LCExLG4sbykpLmZpcnN0Q2hpbGQsMT09PWUuY2hpbGROb2Rlcy5sZW5ndGgmJihlPXQpLHR8fG8pKXtmb3Iocz0oYT1jZS5tYXAoU2UoZSxcInNjcmlwdFwiKSxJZSkpLmxlbmd0aDtjPGY7YysrKXU9ZSxjIT09cCYmKHU9Y2UuY2xvbmUodSwhMCwhMCkscyYmY2UubWVyZ2UoYSxTZSh1LFwic2NyaXB0XCIpKSksaS5jYWxsKG5bY10sdSxjKTtpZihzKWZvcihsPWFbYS5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxjZS5tYXAoYSxXZSksYz0wO2M8cztjKyspdT1hW2NdLENlLnRlc3QodS50eXBlfHxcIlwiKSYmIV8uYWNjZXNzKHUsXCJnbG9iYWxFdmFsXCIpJiZjZS5jb250YWlucyhsLHUpJiYodS5zcmMmJlwibW9kdWxlXCIhPT0odS50eXBlfHxcIlwiKS50b0xvd2VyQ2FzZSgpP2NlLl9ldmFsVXJsJiYhdS5ub01vZHVsZSYmY2UuX2V2YWxVcmwodS5zcmMse25vbmNlOnUubm9uY2V8fHUuZ2V0QXR0cmlidXRlKFwibm9uY2VcIil9LGwpOm0odS50ZXh0Q29udGVudC5yZXBsYWNlKE1lLFwiXCIpLHUsbCkpfXJldHVybiBufWZ1bmN0aW9uIEJlKGUsdCxuKXtmb3IodmFyIHIsaT10P2NlLmZpbHRlcih0LGUpOmUsbz0wO251bGwhPShyPWlbb10pO28rKylufHwxIT09ci5ub2RlVHlwZXx8Y2UuY2xlYW5EYXRhKFNlKHIpKSxyLnBhcmVudE5vZGUmJihuJiZLKHIpJiZFZShTZShyLFwic2NyaXB0XCIpKSxyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpO3JldHVybiBlfWNlLmV4dGVuZCh7aHRtbFByZWZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sY2xvbmU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHMsdSxsLGM9ZS5jbG9uZU5vZGUoITApLGY9SyhlKTtpZighKGxlLm5vQ2xvbmVDaGVja2VkfHwxIT09ZS5ub2RlVHlwZSYmMTEhPT1lLm5vZGVUeXBlfHxjZS5pc1hNTERvYyhlKSkpZm9yKGE9U2UoYykscj0wLGk9KG89U2UoZSkpLmxlbmd0aDtyPGk7cisrKXM9b1tyXSx1PWFbcl0sdm9pZCAwLFwiaW5wdXRcIj09PShsPXUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkmJndlLnRlc3Qocy50eXBlKT91LmNoZWNrZWQ9cy5jaGVja2VkOlwiaW5wdXRcIiE9PWwmJlwidGV4dGFyZWFcIiE9PWx8fCh1LmRlZmF1bHRWYWx1ZT1zLmRlZmF1bHRWYWx1ZSk7aWYodClpZihuKWZvcihvPW98fFNlKGUpLGE9YXx8U2UoYykscj0wLGk9by5sZW5ndGg7cjxpO3IrKylGZShvW3JdLGFbcl0pO2Vsc2UgRmUoZSxjKTtyZXR1cm4gMDwoYT1TZShjLFwic2NyaXB0XCIpKS5sZW5ndGgmJkVlKGEsIWYmJlNlKGUsXCJzY3JpcHRcIikpLGN9LGNsZWFuRGF0YTpmdW5jdGlvbihlKXtmb3IodmFyIHQsbixyLGk9Y2UuZXZlbnQuc3BlY2lhbCxvPTA7dm9pZCAwIT09KG49ZVtvXSk7bysrKWlmKCQobikpe2lmKHQ9bltfLmV4cGFuZG9dKXtpZih0LmV2ZW50cylmb3IociBpbiB0LmV2ZW50cylpW3JdP2NlLmV2ZW50LnJlbW92ZShuLHIpOmNlLnJlbW92ZUV2ZW50KG4scix0LmhhbmRsZSk7bltfLmV4cGFuZG9dPXZvaWQgMH1uW3ouZXhwYW5kb10mJihuW3ouZXhwYW5kb109dm9pZCAwKX19fSksY2UuZm4uZXh0ZW5kKHtkZXRhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIEJlKHRoaXMsZSwhMCl9LHJlbW92ZTpmdW5jdGlvbihlKXtyZXR1cm4gQmUodGhpcyxlKX0sdGV4dDpmdW5jdGlvbihlKXtyZXR1cm4gTSh0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP2NlLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9ZSl9KX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gJGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fFJlKHRoaXMsZSkuYXBwZW5kQ2hpbGQoZSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiAkZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIHQ9UmUodGhpcyxlKTt0Lmluc2VydEJlZm9yZShlLHQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiAkZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiAkZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PTA7bnVsbCE9KGU9dGhpc1t0XSk7dCsrKTE9PT1lLm5vZGVUeXBlJiYoY2UuY2xlYW5EYXRhKFNlKGUsITEpKSxlLnRleHRDb250ZW50PVwiXCIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGwhPWUmJmUsdD1udWxsPT10P2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBjZS5jbG9uZSh0aGlzLGUsdCl9KX0saHRtbDpmdW5jdGlvbihlKXtyZXR1cm4gTSh0aGlzLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXNbMF18fHt9LG49MCxyPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWUmJjE9PT10Lm5vZGVUeXBlKXJldHVybiB0LmlubmVySFRNTDtpZihcInN0cmluZ1wiPT10eXBlb2YgZSYmIU9lLnRlc3QoZSkmJiFrZVsoVGUuZXhlYyhlKXx8W1wiXCIsXCJcIl0pWzFdLnRvTG93ZXJDYXNlKCldKXtlPWNlLmh0bWxQcmVmaWx0ZXIoZSk7dHJ5e2Zvcig7bjxyO24rKykxPT09KHQ9dGhpc1tuXXx8e30pLm5vZGVUeXBlJiYoY2UuY2xlYW5EYXRhKFNlKHQsITEpKSx0LmlubmVySFRNTD1lKTt0PTB9Y2F0Y2goZSl7fX10JiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGUpfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIG49W107cmV0dXJuICRlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTtjZS5pbkFycmF5KHRoaXMsbik8MCYmKGNlLmNsZWFuRGF0YShTZSh0aGlzKSksdCYmdC5yZXBsYWNlQ2hpbGQoZSx0aGlzKSl9LG4pfX0pLGNlLmVhY2goe2FwcGVuZFRvOlwiYXBwZW5kXCIscHJlcGVuZFRvOlwicHJlcGVuZFwiLGluc2VydEJlZm9yZTpcImJlZm9yZVwiLGluc2VydEFmdGVyOlwiYWZ0ZXJcIixyZXBsYWNlQWxsOlwicmVwbGFjZVdpdGhcIn0sZnVuY3Rpb24oZSxhKXtjZS5mbltlXT1mdW5jdGlvbihlKXtmb3IodmFyIHQsbj1bXSxyPWNlKGUpLGk9ci5sZW5ndGgtMSxvPTA7bzw9aTtvKyspdD1vPT09aT90aGlzOnRoaXMuY2xvbmUoITApLGNlKHJbb10pW2FdKHQpLHMuYXBwbHkobix0LmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobil9fSk7dmFyIF9lPW5ldyBSZWdFeHAoXCJeKFwiK0crXCIpKD8hcHgpW2EteiVdKyRcIixcImlcIiksemU9L14tLS8sWGU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiB0JiZ0Lm9wZW5lcnx8KHQ9aWUpLHQuZ2V0Q29tcHV0ZWRTdHlsZShlKX0sVWU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz17fTtmb3IoaSBpbiB0KW9baV09ZS5zdHlsZVtpXSxlLnN0eWxlW2ldPXRbaV07Zm9yKGkgaW4gcj1uLmNhbGwoZSksdCllLnN0eWxlW2ldPW9baV07cmV0dXJuIHJ9LFZlPW5ldyBSZWdFeHAoUS5qb2luKFwifFwiKSxcImlcIik7ZnVuY3Rpb24gR2UoZSx0LG4pe3ZhciByLGksbyxhLHM9emUudGVzdCh0KSx1PWUuc3R5bGU7cmV0dXJuKG49bnx8WGUoZSkpJiYoYT1uLmdldFByb3BlcnR5VmFsdWUodCl8fG5bdF0scyYmYSYmKGE9YS5yZXBsYWNlKHZlLFwiJDFcIil8fHZvaWQgMCksXCJcIiE9PWF8fEsoZSl8fChhPWNlLnN0eWxlKGUsdCkpLCFsZS5waXhlbEJveFN0eWxlcygpJiZfZS50ZXN0KGEpJiZWZS50ZXN0KHQpJiYocj11LndpZHRoLGk9dS5taW5XaWR0aCxvPXUubWF4V2lkdGgsdS5taW5XaWR0aD11Lm1heFdpZHRoPXUud2lkdGg9YSxhPW4ud2lkdGgsdS53aWR0aD1yLHUubWluV2lkdGg9aSx1Lm1heFdpZHRoPW8pKSx2b2lkIDAhPT1hP2ErXCJcIjphfWZ1bmN0aW9uIFllKGUsdCl7cmV0dXJue2dldDpmdW5jdGlvbigpe2lmKCFlKCkpcmV0dXJuKHRoaXMuZ2V0PXQpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkZWxldGUgdGhpcy5nZXR9fX0hZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7aWYobCl7dS5zdHlsZS5jc3NUZXh0PVwicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O21hcmdpbi10b3A6MXB4O3BhZGRpbmc6MDtib3JkZXI6MFwiLGwuc3R5bGUuY3NzVGV4dD1cInBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OnNjcm9sbDttYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjYwJTt0b3A6MSVcIixKLmFwcGVuZENoaWxkKHUpLmFwcGVuZENoaWxkKGwpO3ZhciBlPWllLmdldENvbXB1dGVkU3R5bGUobCk7bj1cIjElXCIhPT1lLnRvcCxzPTEyPT09dChlLm1hcmdpbkxlZnQpLGwuc3R5bGUucmlnaHQ9XCI2MCVcIixvPTM2PT09dChlLnJpZ2h0KSxyPTM2PT09dChlLndpZHRoKSxsLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIixpPTEyPT09dChsLm9mZnNldFdpZHRoLzMpLEoucmVtb3ZlQ2hpbGQodSksbD1udWxsfX1mdW5jdGlvbiB0KGUpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZSkpfXZhciBuLHIsaSxvLGEscyx1PUMuY3JlYXRlRWxlbWVudChcImRpdlwiKSxsPUMuY3JlYXRlRWxlbWVudChcImRpdlwiKTtsLnN0eWxlJiYobC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD1cImNvbnRlbnQtYm94XCIsbC5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPVwiXCIsbGUuY2xlYXJDbG9uZVN0eWxlPVwiY29udGVudC1ib3hcIj09PWwuc3R5bGUuYmFja2dyb3VuZENsaXAsY2UuZXh0ZW5kKGxlLHtib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiBlKCkscn0scGl4ZWxCb3hTdHlsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLG99LHBpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLG59LHJlbGlhYmxlTWFyZ2luTGVmdDpmdW5jdGlvbigpe3JldHVybiBlKCksc30sc2Nyb2xsYm94U2l6ZTpmdW5jdGlvbigpe3JldHVybiBlKCksaX0scmVsaWFibGVUckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXt2YXIgZSx0LG4scjtyZXR1cm4gbnVsbD09YSYmKGU9Qy5jcmVhdGVFbGVtZW50KFwidGFibGVcIiksdD1DLmNyZWF0ZUVsZW1lbnQoXCJ0clwiKSxuPUMuY3JlYXRlRWxlbWVudChcImRpdlwiKSxlLnN0eWxlLmNzc1RleHQ9XCJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O2JvcmRlci1jb2xsYXBzZTpzZXBhcmF0ZVwiLHQuc3R5bGUuY3NzVGV4dD1cImJveC1zaXppbmc6Y29udGVudC1ib3g7Ym9yZGVyOjFweCBzb2xpZFwiLHQuc3R5bGUuaGVpZ2h0PVwiMXB4XCIsbi5zdHlsZS5oZWlnaHQ9XCI5cHhcIixuLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiLEouYXBwZW5kQ2hpbGQoZSkuYXBwZW5kQ2hpbGQodCkuYXBwZW5kQ2hpbGQobikscj1pZS5nZXRDb21wdXRlZFN0eWxlKHQpLGE9cGFyc2VJbnQoci5oZWlnaHQsMTApK3BhcnNlSW50KHIuYm9yZGVyVG9wV2lkdGgsMTApK3BhcnNlSW50KHIuYm9yZGVyQm90dG9tV2lkdGgsMTApPT09dC5vZmZzZXRIZWlnaHQsSi5yZW1vdmVDaGlsZChlKSksYX19KSl9KCk7dmFyIFFlPVtcIldlYmtpdFwiLFwiTW96XCIsXCJtc1wiXSxKZT1DLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikuc3R5bGUsS2U9e307ZnVuY3Rpb24gWmUoZSl7dmFyIHQ9Y2UuY3NzUHJvcHNbZV18fEtlW2VdO3JldHVybiB0fHwoZSBpbiBKZT9lOktlW2VdPWZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpLG49UWUubGVuZ3RoO3doaWxlKG4tLSlpZigoZT1RZVtuXSt0KWluIEplKXJldHVybiBlfShlKXx8ZSl9dmFyIGV0PS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyx0dD17cG9zaXRpb246XCJhYnNvbHV0ZVwiLHZpc2liaWxpdHk6XCJoaWRkZW5cIixkaXNwbGF5OlwiYmxvY2tcIn0sbnQ9e2xldHRlclNwYWNpbmc6XCIwXCIsZm9udFdlaWdodDpcIjQwMFwifTtmdW5jdGlvbiBydChlLHQsbil7dmFyIHI9WS5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsyXS0obnx8MCkpKyhyWzNdfHxcInB4XCIpOnR9ZnVuY3Rpb24gaXQoZSx0LG4scixpLG8pe3ZhciBhPVwid2lkdGhcIj09PXQ/MTowLHM9MCx1PTAsbD0wO2lmKG49PT0ocj9cImJvcmRlclwiOlwiY29udGVudFwiKSlyZXR1cm4gMDtmb3IoO2E8NDthKz0yKVwibWFyZ2luXCI9PT1uJiYobCs9Y2UuY3NzKGUsbitRW2FdLCEwLGkpKSxyPyhcImNvbnRlbnRcIj09PW4mJih1LT1jZS5jc3MoZSxcInBhZGRpbmdcIitRW2FdLCEwLGkpKSxcIm1hcmdpblwiIT09biYmKHUtPWNlLmNzcyhlLFwiYm9yZGVyXCIrUVthXStcIldpZHRoXCIsITAsaSkpKToodSs9Y2UuY3NzKGUsXCJwYWRkaW5nXCIrUVthXSwhMCxpKSxcInBhZGRpbmdcIiE9PW4/dSs9Y2UuY3NzKGUsXCJib3JkZXJcIitRW2FdK1wiV2lkdGhcIiwhMCxpKTpzKz1jZS5jc3MoZSxcImJvcmRlclwiK1FbYV0rXCJXaWR0aFwiLCEwLGkpKTtyZXR1cm4hciYmMDw9byYmKHUrPU1hdGgubWF4KDAsTWF0aC5jZWlsKGVbXCJvZmZzZXRcIit0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKV0tby11LXMtLjUpKXx8MCksdStsfWZ1bmN0aW9uIG90KGUsdCxuKXt2YXIgcj1YZShlKSxpPSghbGUuYm94U2l6aW5nUmVsaWFibGUoKXx8bikmJlwiYm9yZGVyLWJveFwiPT09Y2UuY3NzKGUsXCJib3hTaXppbmdcIiwhMSxyKSxvPWksYT1HZShlLHQscikscz1cIm9mZnNldFwiK3RbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2lmKF9lLnRlc3QoYSkpe2lmKCFuKXJldHVybiBhO2E9XCJhdXRvXCJ9cmV0dXJuKCFsZS5ib3hTaXppbmdSZWxpYWJsZSgpJiZpfHwhbGUucmVsaWFibGVUckRpbWVuc2lvbnMoKSYmZmUoZSxcInRyXCIpfHxcImF1dG9cIj09PWF8fCFwYXJzZUZsb2F0KGEpJiZcImlubGluZVwiPT09Y2UuY3NzKGUsXCJkaXNwbGF5XCIsITEscikpJiZlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiYoaT1cImJvcmRlci1ib3hcIj09PWNlLmNzcyhlLFwiYm94U2l6aW5nXCIsITEsciksKG89cyBpbiBlKSYmKGE9ZVtzXSkpLChhPXBhcnNlRmxvYXQoYSl8fDApK2l0KGUsdCxufHwoaT9cImJvcmRlclwiOlwiY29udGVudFwiKSxvLHIsYSkrXCJweFwifWZ1bmN0aW9uIGF0KGUsdCxuLHIsaSl7cmV0dXJuIG5ldyBhdC5wcm90b3R5cGUuaW5pdChlLHQsbixyLGkpfWNlLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihlLHQpe2lmKHQpe3ZhciBuPUdlKGUsXCJvcGFjaXR5XCIpO3JldHVyblwiXCI9PT1uP1wiMVwiOm59fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsYXNwZWN0UmF0aW86ITAsYm9yZGVySW1hZ2VTbGljZTohMCxjb2x1bW5Db3VudDohMCxmbGV4R3JvdzohMCxmbGV4U2hyaW5rOiEwLGZvbnRXZWlnaHQ6ITAsZ3JpZEFyZWE6ITAsZ3JpZENvbHVtbjohMCxncmlkQ29sdW1uRW5kOiEwLGdyaWRDb2x1bW5TdGFydDohMCxncmlkUm93OiEwLGdyaWRSb3dFbmQ6ITAsZ3JpZFJvd1N0YXJ0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHNjYWxlOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMCxmaWxsT3BhY2l0eTohMCxmbG9vZE9wYWNpdHk6ITAsc3RvcE9wYWNpdHk6ITAsc3Ryb2tlTWl0ZXJsaW1pdDohMCxzdHJva2VPcGFjaXR5OiEwfSxjc3NQcm9wczp7fSxzdHlsZTpmdW5jdGlvbihlLHQsbixyKXtpZihlJiYzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJmUuc3R5bGUpe3ZhciBpLG8sYSxzPUYodCksdT16ZS50ZXN0KHQpLGw9ZS5zdHlsZTtpZih1fHwodD1aZShzKSksYT1jZS5jc3NIb29rc1t0XXx8Y2UuY3NzSG9va3Nbc10sdm9pZCAwPT09bilyZXR1cm4gYSYmXCJnZXRcImluIGEmJnZvaWQgMCE9PShpPWEuZ2V0KGUsITEscikpP2k6bFt0XTtcInN0cmluZ1wiPT09KG89dHlwZW9mIG4pJiYoaT1ZLmV4ZWMobikpJiZpWzFdJiYobj10ZShlLHQsaSksbz1cIm51bWJlclwiKSxudWxsIT1uJiZuPT1uJiYoXCJudW1iZXJcIiE9PW98fHV8fChuKz1pJiZpWzNdfHwoY2UuY3NzTnVtYmVyW3NdP1wiXCI6XCJweFwiKSksbGUuY2xlYXJDbG9uZVN0eWxlfHxcIlwiIT09bnx8MCE9PXQuaW5kZXhPZihcImJhY2tncm91bmRcIil8fChsW3RdPVwiaW5oZXJpdFwiKSxhJiZcInNldFwiaW4gYSYmdm9pZCAwPT09KG49YS5zZXQoZSxuLHIpKXx8KHU/bC5zZXRQcm9wZXJ0eSh0LG4pOmxbdF09bikpfX0sY3NzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzPUYodCk7cmV0dXJuIHplLnRlc3QodCl8fCh0PVplKHMpKSwoYT1jZS5jc3NIb29rc1t0XXx8Y2UuY3NzSG9va3Nbc10pJiZcImdldFwiaW4gYSYmKGk9YS5nZXQoZSwhMCxuKSksdm9pZCAwPT09aSYmKGk9R2UoZSx0LHIpKSxcIm5vcm1hbFwiPT09aSYmdCBpbiBudCYmKGk9bnRbdF0pLFwiXCI9PT1ufHxuPyhvPXBhcnNlRmxvYXQoaSksITA9PT1ufHxpc0Zpbml0ZShvKT9vfHwwOmkpOml9fSksY2UuZWFjaChbXCJoZWlnaHRcIixcIndpZHRoXCJdLGZ1bmN0aW9uKGUsdSl7Y2UuY3NzSG9va3NbdV09e2dldDpmdW5jdGlvbihlLHQsbil7aWYodClyZXR1cm4hZXQudGVzdChjZS5jc3MoZSxcImRpc3BsYXlcIikpfHxlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiZlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoP290KGUsdSxuKTpVZShlLHR0LGZ1bmN0aW9uKCl7cmV0dXJuIG90KGUsdSxuKX0pfSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk9WGUoZSksbz0hbGUuc2Nyb2xsYm94U2l6ZSgpJiZcImFic29sdXRlXCI9PT1pLnBvc2l0aW9uLGE9KG98fG4pJiZcImJvcmRlci1ib3hcIj09PWNlLmNzcyhlLFwiYm94U2l6aW5nXCIsITEsaSkscz1uP2l0KGUsdSxuLGEsaSk6MDtyZXR1cm4gYSYmbyYmKHMtPU1hdGguY2VpbChlW1wib2Zmc2V0XCIrdVswXS50b1VwcGVyQ2FzZSgpK3Uuc2xpY2UoMSldLXBhcnNlRmxvYXQoaVt1XSktaXQoZSx1LFwiYm9yZGVyXCIsITEsaSktLjUpKSxzJiYocj1ZLmV4ZWModCkpJiZcInB4XCIhPT0oclszXXx8XCJweFwiKSYmKGUuc3R5bGVbdV09dCx0PWNlLmNzcyhlLHUpKSxydCgwLHQscyl9fX0pLGNlLmNzc0hvb2tzLm1hcmdpbkxlZnQ9WWUobGUucmVsaWFibGVNYXJnaW5MZWZ0LGZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4ocGFyc2VGbG9hdChHZShlLFwibWFyZ2luTGVmdFwiKSl8fGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC1VZShlLHttYXJnaW5MZWZ0OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKStcInB4XCJ9KSxjZS5lYWNoKHttYXJnaW46XCJcIixwYWRkaW5nOlwiXCIsYm9yZGVyOlwiV2lkdGhcIn0sZnVuY3Rpb24oaSxvKXtjZS5jc3NIb29rc1tpK29dPXtleHBhbmQ6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj17fSxyPVwic3RyaW5nXCI9PXR5cGVvZiBlP2Uuc3BsaXQoXCIgXCIpOltlXTt0PDQ7dCsrKW5baStRW3RdK29dPXJbdF18fHJbdC0yXXx8clswXTtyZXR1cm4gbn19LFwibWFyZ2luXCIhPT1pJiYoY2UuY3NzSG9va3NbaStvXS5zZXQ9cnQpfSksY2UuZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gTSh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89e30sYT0wO2lmKEFycmF5LmlzQXJyYXkodCkpe2ZvcihyPVhlKGUpLGk9dC5sZW5ndGg7YTxpO2ErKylvW3RbYV1dPWNlLmNzcyhlLHRbYV0sITEscik7cmV0dXJuIG99cmV0dXJuIHZvaWQgMCE9PW4/Y2Uuc3R5bGUoZSx0LG4pOmNlLmNzcyhlLHQpfSxlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX19KSwoKGNlLlR3ZWVuPWF0KS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmF0LGluaXQ6ZnVuY3Rpb24oZSx0LG4scixpLG8pe3RoaXMuZWxlbT1lLHRoaXMucHJvcD1uLHRoaXMuZWFzaW5nPWl8fGNlLmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9dCx0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9cix0aGlzLnVuaXQ9b3x8KGNlLmNzc051bWJlcltuXT9cIlwiOlwicHhcIil9LGN1cjpmdW5jdGlvbigpe3ZhciBlPWF0LnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBlJiZlLmdldD9lLmdldCh0aGlzKTphdC5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oZSl7dmFyIHQsbj1hdC5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPXQ9Y2UuZWFzaW5nW3RoaXMuZWFzaW5nXShlLHRoaXMub3B0aW9ucy5kdXJhdGlvbiplLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPXQ9ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTphdC5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSkuaW5pdC5wcm90b3R5cGU9YXQucHJvdG90eXBlLChhdC5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIDEhPT1lLmVsZW0ubm9kZVR5cGV8fG51bGwhPWUuZWxlbVtlLnByb3BdJiZudWxsPT1lLmVsZW0uc3R5bGVbZS5wcm9wXT9lLmVsZW1bZS5wcm9wXToodD1jZS5jc3MoZS5lbGVtLGUucHJvcCxcIlwiKSkmJlwiYXV0b1wiIT09dD90OjB9LHNldDpmdW5jdGlvbihlKXtjZS5meC5zdGVwW2UucHJvcF0/Y2UuZnguc3RlcFtlLnByb3BdKGUpOjEhPT1lLmVsZW0ubm9kZVR5cGV8fCFjZS5jc3NIb29rc1tlLnByb3BdJiZudWxsPT1lLmVsZW0uc3R5bGVbWmUoZS5wcm9wKV0/ZS5lbGVtW2UucHJvcF09ZS5ub3c6Y2Uuc3R5bGUoZS5lbGVtLGUucHJvcCxlLm5vdytlLnVuaXQpfX19KS5zY3JvbGxUb3A9YXQucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihlKXtlLmVsZW0ubm9kZVR5cGUmJmUuZWxlbS5wYXJlbnROb2RlJiYoZS5lbGVtW2UucHJvcF09ZS5ub3cpfX0sY2UuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn0sX2RlZmF1bHQ6XCJzd2luZ1wifSxjZS5meD1hdC5wcm90b3R5cGUuaW5pdCxjZS5meC5zdGVwPXt9O3ZhciBzdCx1dCxsdCxjdCxmdD0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8scHQ9L3F1ZXVlSG9va3MkLztmdW5jdGlvbiBkdCgpe3V0JiYoITE9PT1DLmhpZGRlbiYmaWUucmVxdWVzdEFuaW1hdGlvbkZyYW1lP2llLnJlcXVlc3RBbmltYXRpb25GcmFtZShkdCk6aWUuc2V0VGltZW91dChkdCxjZS5meC5pbnRlcnZhbCksY2UuZngudGljaygpKX1mdW5jdGlvbiBodCgpe3JldHVybiBpZS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c3Q9dm9pZCAwfSksc3Q9RGF0ZS5ub3coKX1mdW5jdGlvbiBndChlLHQpe3ZhciBuLHI9MCxpPXtoZWlnaHQ6ZX07Zm9yKHQ9dD8xOjA7cjw0O3IrPTItdClpW1wibWFyZ2luXCIrKG49UVtyXSldPWlbXCJwYWRkaW5nXCIrbl09ZTtyZXR1cm4gdCYmKGkub3BhY2l0eT1pLndpZHRoPWUpLGl9ZnVuY3Rpb24gdnQoZSx0LG4pe2Zvcih2YXIgcixpPSh5dC50d2VlbmVyc1t0XXx8W10pLmNvbmNhdCh5dC50d2VlbmVyc1tcIipcIl0pLG89MCxhPWkubGVuZ3RoO288YTtvKyspaWYocj1pW29dLmNhbGwobix0LGUpKXJldHVybiByfWZ1bmN0aW9uIHl0KG8sZSx0KXt2YXIgbixhLHI9MCxpPXl0LnByZWZpbHRlcnMubGVuZ3RoLHM9Y2UuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgdS5lbGVtfSksdT1mdW5jdGlvbigpe2lmKGEpcmV0dXJuITE7Zm9yKHZhciBlPXN0fHxodCgpLHQ9TWF0aC5tYXgoMCxsLnN0YXJ0VGltZStsLmR1cmF0aW9uLWUpLG49MS0odC9sLmR1cmF0aW9ufHwwKSxyPTAsaT1sLnR3ZWVucy5sZW5ndGg7cjxpO3IrKylsLnR3ZWVuc1tyXS5ydW4obik7cmV0dXJuIHMubm90aWZ5V2l0aChvLFtsLG4sdF0pLG48MSYmaT90OihpfHxzLm5vdGlmeVdpdGgobyxbbCwxLDBdKSxzLnJlc29sdmVXaXRoKG8sW2xdKSwhMSl9LGw9cy5wcm9taXNlKHtlbGVtOm8scHJvcHM6Y2UuZXh0ZW5kKHt9LGUpLG9wdHM6Y2UuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpjZS5lYXNpbmcuX2RlZmF1bHR9LHQpLG9yaWdpbmFsUHJvcGVydGllczplLG9yaWdpbmFsT3B0aW9uczp0LHN0YXJ0VGltZTpzdHx8aHQoKSxkdXJhdGlvbjp0LmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihlLHQpe3ZhciBuPWNlLlR3ZWVuKG8sbC5vcHRzLGUsdCxsLm9wdHMuc3BlY2lhbEVhc2luZ1tlXXx8bC5vcHRzLmVhc2luZyk7cmV0dXJuIGwudHdlZW5zLnB1c2gobiksbn0sc3RvcDpmdW5jdGlvbihlKXt2YXIgdD0wLG49ZT9sLnR3ZWVucy5sZW5ndGg6MDtpZihhKXJldHVybiB0aGlzO2ZvcihhPSEwO3Q8bjt0KyspbC50d2VlbnNbdF0ucnVuKDEpO3JldHVybiBlPyhzLm5vdGlmeVdpdGgobyxbbCwxLDBdKSxzLnJlc29sdmVXaXRoKG8sW2wsZV0pKTpzLnJlamVjdFdpdGgobyxbbCxlXSksdGhpc319KSxjPWwucHJvcHM7Zm9yKCFmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGE7Zm9yKG4gaW4gZSlpZihpPXRbcj1GKG4pXSxvPWVbbl0sQXJyYXkuaXNBcnJheShvKSYmKGk9b1sxXSxvPWVbbl09b1swXSksbiE9PXImJihlW3JdPW8sZGVsZXRlIGVbbl0pLChhPWNlLmNzc0hvb2tzW3JdKSYmXCJleHBhbmRcImluIGEpZm9yKG4gaW4gbz1hLmV4cGFuZChvKSxkZWxldGUgZVtyXSxvKW4gaW4gZXx8KGVbbl09b1tuXSx0W25dPWkpO2Vsc2UgdFtyXT1pfShjLGwub3B0cy5zcGVjaWFsRWFzaW5nKTtyPGk7cisrKWlmKG49eXQucHJlZmlsdGVyc1tyXS5jYWxsKGwsbyxjLGwub3B0cykpcmV0dXJuIHYobi5zdG9wKSYmKGNlLl9xdWV1ZUhvb2tzKGwuZWxlbSxsLm9wdHMucXVldWUpLnN0b3A9bi5zdG9wLmJpbmQobikpLG47cmV0dXJuIGNlLm1hcChjLHZ0LGwpLHYobC5vcHRzLnN0YXJ0KSYmbC5vcHRzLnN0YXJ0LmNhbGwobyxsKSxsLnByb2dyZXNzKGwub3B0cy5wcm9ncmVzcykuZG9uZShsLm9wdHMuZG9uZSxsLm9wdHMuY29tcGxldGUpLmZhaWwobC5vcHRzLmZhaWwpLmFsd2F5cyhsLm9wdHMuYWx3YXlzKSxjZS5meC50aW1lcihjZS5leHRlbmQodSx7ZWxlbTpvLGFuaW06bCxxdWV1ZTpsLm9wdHMucXVldWV9KSksbH1jZS5BbmltYXRpb249Y2UuZXh0ZW5kKHl0LHt0d2VlbmVyczp7XCIqXCI6W2Z1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jcmVhdGVUd2VlbihlLHQpO3JldHVybiB0ZShuLmVsZW0sZSxZLmV4ZWModCksbiksbn1dfSx0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7dihlKT8odD1lLGU9W1wiKlwiXSk6ZT1lLm1hdGNoKEQpO2Zvcih2YXIgbixyPTAsaT1lLmxlbmd0aDtyPGk7cisrKW49ZVtyXSx5dC50d2VlbmVyc1tuXT15dC50d2VlbmVyc1tuXXx8W10seXQudHdlZW5lcnNbbl0udW5zaGlmdCh0KX0scHJlZmlsdGVyczpbZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHMsdSxsLGMsZj1cIndpZHRoXCJpbiB0fHxcImhlaWdodFwiaW4gdCxwPXRoaXMsZD17fSxoPWUuc3R5bGUsZz1lLm5vZGVUeXBlJiZlZShlKSx2PV8uZ2V0KGUsXCJmeHNob3dcIik7Zm9yKHIgaW4gbi5xdWV1ZXx8KG51bGw9PShhPWNlLl9xdWV1ZUhvb2tzKGUsXCJmeFwiKSkudW5xdWV1ZWQmJihhLnVucXVldWVkPTAscz1hLmVtcHR5LmZpcmUsYS5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7YS51bnF1ZXVlZHx8cygpfSksYS51bnF1ZXVlZCsrLHAuYWx3YXlzKGZ1bmN0aW9uKCl7cC5hbHdheXMoZnVuY3Rpb24oKXthLnVucXVldWVkLS0sY2UucXVldWUoZSxcImZ4XCIpLmxlbmd0aHx8YS5lbXB0eS5maXJlKCl9KX0pKSx0KWlmKGk9dFtyXSxmdC50ZXN0KGkpKXtpZihkZWxldGUgdFtyXSxvPW98fFwidG9nZ2xlXCI9PT1pLGk9PT0oZz9cImhpZGVcIjpcInNob3dcIikpe2lmKFwic2hvd1wiIT09aXx8IXZ8fHZvaWQgMD09PXZbcl0pY29udGludWU7Zz0hMH1kW3JdPXYmJnZbcl18fGNlLnN0eWxlKGUscil9aWYoKHU9IWNlLmlzRW1wdHlPYmplY3QodCkpfHwhY2UuaXNFbXB0eU9iamVjdChkKSlmb3IociBpbiBmJiYxPT09ZS5ub2RlVHlwZSYmKG4ub3ZlcmZsb3c9W2gub3ZlcmZsb3csaC5vdmVyZmxvd1gsaC5vdmVyZmxvd1ldLG51bGw9PShsPXYmJnYuZGlzcGxheSkmJihsPV8uZ2V0KGUsXCJkaXNwbGF5XCIpKSxcIm5vbmVcIj09PShjPWNlLmNzcyhlLFwiZGlzcGxheVwiKSkmJihsP2M9bDoocmUoW2VdLCEwKSxsPWUuc3R5bGUuZGlzcGxheXx8bCxjPWNlLmNzcyhlLFwiZGlzcGxheVwiKSxyZShbZV0pKSksKFwiaW5saW5lXCI9PT1jfHxcImlubGluZS1ibG9ja1wiPT09YyYmbnVsbCE9bCkmJlwibm9uZVwiPT09Y2UuY3NzKGUsXCJmbG9hdFwiKSYmKHV8fChwLmRvbmUoZnVuY3Rpb24oKXtoLmRpc3BsYXk9bH0pLG51bGw9PWwmJihjPWguZGlzcGxheSxsPVwibm9uZVwiPT09Yz9cIlwiOmMpKSxoLmRpc3BsYXk9XCJpbmxpbmUtYmxvY2tcIikpLG4ub3ZlcmZsb3cmJihoLm92ZXJmbG93PVwiaGlkZGVuXCIscC5hbHdheXMoZnVuY3Rpb24oKXtoLm92ZXJmbG93PW4ub3ZlcmZsb3dbMF0saC5vdmVyZmxvd1g9bi5vdmVyZmxvd1sxXSxoLm92ZXJmbG93WT1uLm92ZXJmbG93WzJdfSkpLHU9ITEsZCl1fHwodj9cImhpZGRlblwiaW4gdiYmKGc9di5oaWRkZW4pOnY9Xy5hY2Nlc3MoZSxcImZ4c2hvd1wiLHtkaXNwbGF5Omx9KSxvJiYodi5oaWRkZW49IWcpLGcmJnJlKFtlXSwhMCkscC5kb25lKGZ1bmN0aW9uKCl7Zm9yKHIgaW4gZ3x8cmUoW2VdKSxfLnJlbW92ZShlLFwiZnhzaG93XCIpLGQpY2Uuc3R5bGUoZSxyLGRbcl0pfSkpLHU9dnQoZz92W3JdOjAscixwKSxyIGluIHZ8fCh2W3JdPXUuc3RhcnQsZyYmKHUuZW5kPXUuc3RhcnQsdS5zdGFydD0wKSl9XSxwcmVmaWx0ZXI6ZnVuY3Rpb24oZSx0KXt0P3l0LnByZWZpbHRlcnMudW5zaGlmdChlKTp5dC5wcmVmaWx0ZXJzLnB1c2goZSl9fSksY2Uuc3BlZWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUmJlwib2JqZWN0XCI9PXR5cGVvZiBlP2NlLmV4dGVuZCh7fSxlKTp7Y29tcGxldGU6bnx8IW4mJnR8fHYoZSkmJmUsZHVyYXRpb246ZSxlYXNpbmc6biYmdHx8dCYmIXYodCkmJnR9O3JldHVybiBjZS5meC5vZmY/ci5kdXJhdGlvbj0wOlwibnVtYmVyXCIhPXR5cGVvZiByLmR1cmF0aW9uJiYoci5kdXJhdGlvbiBpbiBjZS5meC5zcGVlZHM/ci5kdXJhdGlvbj1jZS5meC5zcGVlZHNbci5kdXJhdGlvbl06ci5kdXJhdGlvbj1jZS5meC5zcGVlZHMuX2RlZmF1bHQpLG51bGwhPXIucXVldWUmJiEwIT09ci5xdWV1ZXx8KHIucXVldWU9XCJmeFwiKSxyLm9sZD1yLmNvbXBsZXRlLHIuY29tcGxldGU9ZnVuY3Rpb24oKXt2KHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZjZS5kZXF1ZXVlKHRoaXMsci5xdWV1ZSl9LHJ9LGNlLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLmZpbHRlcihlZSkuY3NzKFwib3BhY2l0eVwiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OnR9LGUsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1jZS5pc0VtcHR5T2JqZWN0KHQpLG89Y2Uuc3BlZWQoZSxuLHIpLGE9ZnVuY3Rpb24oKXt2YXIgZT15dCh0aGlzLGNlLmV4dGVuZCh7fSx0KSxvKTsoaXx8Xy5nZXQodGhpcyxcImZpbmlzaFwiKSkmJmUuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLGl8fCExPT09by5xdWV1ZT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShvLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKGksZSxvKXt2YXIgYT1mdW5jdGlvbihlKXt2YXIgdD1lLnN0b3A7ZGVsZXRlIGUuc3RvcCx0KG8pfTtyZXR1cm5cInN0cmluZ1wiIT10eXBlb2YgaSYmKG89ZSxlPWksaT12b2lkIDApLGUmJnRoaXMucXVldWUoaXx8XCJmeFwiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT0hMCx0PW51bGwhPWkmJmkrXCJxdWV1ZUhvb2tzXCIsbj1jZS50aW1lcnMscj1fLmdldCh0aGlzKTtpZih0KXJbdF0mJnJbdF0uc3RvcCYmYShyW3RdKTtlbHNlIGZvcih0IGluIHIpclt0XSYmclt0XS5zdG9wJiZwdC50ZXN0KHQpJiZhKHJbdF0pO2Zvcih0PW4ubGVuZ3RoO3QtLTspblt0XS5lbGVtIT09dGhpc3x8bnVsbCE9aSYmblt0XS5xdWV1ZSE9PWl8fChuW3RdLmFuaW0uc3RvcChvKSxlPSExLG4uc3BsaWNlKHQsMSkpOyFlJiZvfHxjZS5kZXF1ZXVlKHRoaXMsaSl9KX0sZmluaXNoOmZ1bmN0aW9uKGEpe3JldHVybiExIT09YSYmKGE9YXx8XCJmeFwiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZSx0PV8uZ2V0KHRoaXMpLG49dFthK1wicXVldWVcIl0scj10W2ErXCJxdWV1ZUhvb2tzXCJdLGk9Y2UudGltZXJzLG89bj9uLmxlbmd0aDowO2Zvcih0LmZpbmlzaD0hMCxjZS5xdWV1ZSh0aGlzLGEsW10pLHImJnIuc3RvcCYmci5zdG9wLmNhbGwodGhpcywhMCksZT1pLmxlbmd0aDtlLS07KWlbZV0uZWxlbT09PXRoaXMmJmlbZV0ucXVldWU9PT1hJiYoaVtlXS5hbmltLnN0b3AoITApLGkuc3BsaWNlKGUsMSkpO2ZvcihlPTA7ZTxvO2UrKyluW2VdJiZuW2VdLmZpbmlzaCYmbltlXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgdC5maW5pc2h9KX19KSxjZS5lYWNoKFtcInRvZ2dsZVwiLFwic2hvd1wiLFwiaGlkZVwiXSxmdW5jdGlvbihlLHIpe3ZhciBpPWNlLmZuW3JdO2NlLmZuW3JdPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09ZXx8XCJib29sZWFuXCI9PXR5cGVvZiBlP2kuYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuYW5pbWF0ZShndChyLCEwKSxlLHQsbil9fSksY2UuZWFjaCh7c2xpZGVEb3duOmd0KFwic2hvd1wiKSxzbGlkZVVwOmd0KFwiaGlkZVwiKSxzbGlkZVRvZ2dsZTpndChcInRvZ2dsZVwiKSxmYWRlSW46e29wYWNpdHk6XCJzaG93XCJ9LGZhZGVPdXQ6e29wYWNpdHk6XCJoaWRlXCJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6XCJ0b2dnbGVcIn19LGZ1bmN0aW9uKGUscil7Y2UuZm5bZV09ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmFuaW1hdGUocixlLHQsbil9fSksY2UudGltZXJzPVtdLGNlLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgZSx0PTAsbj1jZS50aW1lcnM7Zm9yKHN0PURhdGUubm93KCk7dDxuLmxlbmd0aDt0KyspKGU9blt0XSkoKXx8blt0XSE9PWV8fG4uc3BsaWNlKHQtLSwxKTtuLmxlbmd0aHx8Y2UuZnguc3RvcCgpLHN0PXZvaWQgMH0sY2UuZngudGltZXI9ZnVuY3Rpb24oZSl7Y2UudGltZXJzLnB1c2goZSksY2UuZnguc3RhcnQoKX0sY2UuZnguaW50ZXJ2YWw9MTMsY2UuZnguc3RhcnQ9ZnVuY3Rpb24oKXt1dHx8KHV0PSEwLGR0KCkpfSxjZS5meC5zdG9wPWZ1bmN0aW9uKCl7dXQ9bnVsbH0sY2UuZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LGNlLmZuLmRlbGF5PWZ1bmN0aW9uKHIsZSl7cmV0dXJuIHI9Y2UuZngmJmNlLmZ4LnNwZWVkc1tyXXx8cixlPWV8fFwiZnhcIix0aGlzLnF1ZXVlKGUsZnVuY3Rpb24oZSx0KXt2YXIgbj1pZS5zZXRUaW1lb3V0KGUscik7dC5zdG9wPWZ1bmN0aW9uKCl7aWUuY2xlYXJUaW1lb3V0KG4pfX0pfSxsdD1DLmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKSxjdD1DLmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIikuYXBwZW5kQ2hpbGQoQy5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpKSxsdC50eXBlPVwiY2hlY2tib3hcIixsZS5jaGVja09uPVwiXCIhPT1sdC52YWx1ZSxsZS5vcHRTZWxlY3RlZD1jdC5zZWxlY3RlZCwobHQ9Qy5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIikpLnZhbHVlPVwidFwiLGx0LnR5cGU9XCJyYWRpb1wiLGxlLnJhZGlvVmFsdWU9XCJ0XCI9PT1sdC52YWx1ZTt2YXIgbXQseHQ9Y2UuZXhwci5hdHRySGFuZGxlO2NlLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQpe3JldHVybiBNKHRoaXMsY2UuYXR0cixlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Y2UucmVtb3ZlQXR0cih0aGlzLGUpfSl9fSksY2UuZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVyblwidW5kZWZpbmVkXCI9PXR5cGVvZiBlLmdldEF0dHJpYnV0ZT9jZS5wcm9wKGUsdCxuKTooMT09PW8mJmNlLmlzWE1MRG9jKGUpfHwoaT1jZS5hdHRySG9va3NbdC50b0xvd2VyQ2FzZSgpXXx8KGNlLmV4cHIubWF0Y2guYm9vbC50ZXN0KHQpP210OnZvaWQgMCkpLHZvaWQgMCE9PW4/bnVsbD09PW4/dm9pZCBjZS5yZW1vdmVBdHRyKGUsdCk6aSYmXCJzZXRcImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjooZS5zZXRBdHRyaWJ1dGUodCxuK1wiXCIpLG4pOmkmJlwiZ2V0XCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjpudWxsPT0ocj1jZS5maW5kLmF0dHIoZSx0KSk/dm9pZCAwOnIpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihlLHQpe2lmKCFsZS5yYWRpb1ZhbHVlJiZcInJhZGlvXCI9PT10JiZmZShlLFwiaW5wdXRcIikpe3ZhciBuPWUudmFsdWU7cmV0dXJuIGUuc2V0QXR0cmlidXRlKFwidHlwZVwiLHQpLG4mJihlLnZhbHVlPW4pLHR9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10JiZ0Lm1hdGNoKEQpO2lmKGkmJjE9PT1lLm5vZGVUeXBlKXdoaWxlKG49aVtyKytdKWUucmVtb3ZlQXR0cmlidXRlKG4pfX0pLG10PXtzZXQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExPT09dD9jZS5yZW1vdmVBdHRyKGUsbik6ZS5zZXRBdHRyaWJ1dGUobixuKSxufX0sY2UuZWFjaChjZS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cXHcrL2cpLGZ1bmN0aW9uKGUsdCl7dmFyIGE9eHRbdF18fGNlLmZpbmQuYXR0cjt4dFt0XT1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPXQudG9Mb3dlckNhc2UoKTtyZXR1cm4gbnx8KGk9eHRbb10seHRbb109cixyPW51bGwhPWEoZSx0LG4pP286bnVsbCx4dFtvXT1pKSxyfX0pO3ZhciBidD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLHd0PS9eKD86YXxhcmVhKSQvaTtmdW5jdGlvbiBUdChlKXtyZXR1cm4oZS5tYXRjaChEKXx8W10pLmpvaW4oXCIgXCIpfWZ1bmN0aW9uIEN0KGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKXx8XCJcIn1mdW5jdGlvbiBrdChlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lOlwic3RyaW5nXCI9PXR5cGVvZiBlJiZlLm1hdGNoKEQpfHxbXX1jZS5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gTSh0aGlzLGNlLnByb3AsZSx0LDE8YXJndW1lbnRzLmxlbmd0aCl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW2NlLnByb3BGaXhbZV18fGVdfSl9fSksY2UuZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiAxPT09byYmY2UuaXNYTUxEb2MoZSl8fCh0PWNlLnByb3BGaXhbdF18fHQsaT1jZS5wcm9wSG9va3NbdF0pLHZvaWQgMCE9PW4/aSYmXCJzZXRcImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjplW3RdPW46aSYmXCJnZXRcImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOmVbdF19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihlKXt2YXIgdD1jZS5maW5kLmF0dHIoZSxcInRhYmluZGV4XCIpO3JldHVybiB0P3BhcnNlSW50KHQsMTApOmJ0LnRlc3QoZS5ub2RlTmFtZSl8fHd0LnRlc3QoZS5ub2RlTmFtZSkmJmUuaHJlZj8wOi0xfX19LHByb3BGaXg6e1wiZm9yXCI6XCJodG1sRm9yXCIsXCJjbGFzc1wiOlwiY2xhc3NOYW1lXCJ9fSksbGUub3B0U2VsZWN0ZWR8fChjZS5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJnQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH0sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTt0JiYodC5zZWxlY3RlZEluZGV4LHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLGNlLmVhY2goW1widGFiSW5kZXhcIixcInJlYWRPbmx5XCIsXCJtYXhMZW5ndGhcIixcImNlbGxTcGFjaW5nXCIsXCJjZWxsUGFkZGluZ1wiLFwicm93U3BhblwiLFwiY29sU3BhblwiLFwidXNlTWFwXCIsXCJmcmFtZUJvcmRlclwiLFwiY29udGVudEVkaXRhYmxlXCJdLGZ1bmN0aW9uKCl7Y2UucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxjZS5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8sYTtyZXR1cm4gdih0KT90aGlzLmVhY2goZnVuY3Rpb24oZSl7Y2UodGhpcykuYWRkQ2xhc3ModC5jYWxsKHRoaXMsZSxDdCh0aGlzKSkpfSk6KGU9a3QodCkpLmxlbmd0aD90aGlzLmVhY2goZnVuY3Rpb24oKXtpZihyPUN0KHRoaXMpLG49MT09PXRoaXMubm9kZVR5cGUmJlwiIFwiK1R0KHIpK1wiIFwiKXtmb3Iobz0wO288ZS5sZW5ndGg7bysrKWk9ZVtvXSxuLmluZGV4T2YoXCIgXCIraStcIiBcIik8MCYmKG4rPWkrXCIgXCIpO2E9VHQobiksciE9PWEmJnRoaXMuc2V0QXR0cmlidXRlKFwiY2xhc3NcIixhKX19KTp0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLGE7cmV0dXJuIHYodCk/dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe2NlKHRoaXMpLnJlbW92ZUNsYXNzKHQuY2FsbCh0aGlzLGUsQ3QodGhpcykpKX0pOmFyZ3VtZW50cy5sZW5ndGg/KGU9a3QodCkpLmxlbmd0aD90aGlzLmVhY2goZnVuY3Rpb24oKXtpZihyPUN0KHRoaXMpLG49MT09PXRoaXMubm9kZVR5cGUmJlwiIFwiK1R0KHIpK1wiIFwiKXtmb3Iobz0wO288ZS5sZW5ndGg7bysrKXtpPWVbb107d2hpbGUoLTE8bi5pbmRleE9mKFwiIFwiK2krXCIgXCIpKW49bi5yZXBsYWNlKFwiIFwiK2krXCIgXCIsXCIgXCIpfWE9VHQobiksciE9PWEmJnRoaXMuc2V0QXR0cmlidXRlKFwiY2xhc3NcIixhKX19KTp0aGlzOnRoaXMuYXR0cihcImNsYXNzXCIsXCJcIil9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKHQsbil7dmFyIGUscixpLG8sYT10eXBlb2YgdCxzPVwic3RyaW5nXCI9PT1hfHxBcnJheS5pc0FycmF5KHQpO3JldHVybiB2KHQpP3RoaXMuZWFjaChmdW5jdGlvbihlKXtjZSh0aGlzKS50b2dnbGVDbGFzcyh0LmNhbGwodGhpcyxlLEN0KHRoaXMpLG4pLG4pfSk6XCJib29sZWFuXCI9PXR5cGVvZiBuJiZzP24/dGhpcy5hZGRDbGFzcyh0KTp0aGlzLnJlbW92ZUNsYXNzKHQpOihlPWt0KHQpLHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKHMpZm9yKG89Y2UodGhpcyksaT0wO2k8ZS5sZW5ndGg7aSsrKXI9ZVtpXSxvLmhhc0NsYXNzKHIpP28ucmVtb3ZlQ2xhc3Mocik6by5hZGRDbGFzcyhyKTtlbHNlIHZvaWQgMCE9PXQmJlwiYm9vbGVhblwiIT09YXx8KChyPUN0KHRoaXMpKSYmXy5zZXQodGhpcyxcIl9fY2xhc3NOYW1lX19cIixyKSx0aGlzLnNldEF0dHJpYnV0ZSYmdGhpcy5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLHJ8fCExPT09dD9cIlwiOl8uZ2V0KHRoaXMsXCJfX2NsYXNzTmFtZV9fXCIpfHxcIlwiKSl9KSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj0wO3Q9XCIgXCIrZStcIiBcIjt3aGlsZShuPXRoaXNbcisrXSlpZigxPT09bi5ub2RlVHlwZSYmLTE8KFwiIFwiK1R0KEN0KG4pKStcIiBcIikuaW5kZXhPZih0KSlyZXR1cm4hMDtyZXR1cm4hMX19KTt2YXIgU3Q9L1xcci9nO2NlLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKG4pe3ZhciByLGUsaSx0PXRoaXNbMF07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dihuKSx0aGlzLmVhY2goZnVuY3Rpb24oZSl7dmFyIHQ7MT09PXRoaXMubm9kZVR5cGUmJihudWxsPT0odD1pP24uY2FsbCh0aGlzLGUsY2UodGhpcykudmFsKCkpOm4pP3Q9XCJcIjpcIm51bWJlclwiPT10eXBlb2YgdD90Kz1cIlwiOkFycmF5LmlzQXJyYXkodCkmJih0PWNlLm1hcCh0LGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP1wiXCI6ZStcIlwifSkpLChyPWNlLnZhbEhvb2tzW3RoaXMudHlwZV18fGNlLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiZcInNldFwiaW4gciYmdm9pZCAwIT09ci5zZXQodGhpcyx0LFwidmFsdWVcIil8fCh0aGlzLnZhbHVlPXQpKX0pKTp0PyhyPWNlLnZhbEhvb2tzW3QudHlwZV18fGNlLnZhbEhvb2tzW3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiZcImdldFwiaW4gciYmdm9pZCAwIT09KGU9ci5nZXQodCxcInZhbHVlXCIpKT9lOlwic3RyaW5nXCI9PXR5cGVvZihlPXQudmFsdWUpP2UucmVwbGFjZShTdCxcIlwiKTpudWxsPT1lP1wiXCI6ZTp2b2lkIDB9fSksY2UuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9Y2UuZmluZC5hdHRyKGUsXCJ2YWx1ZVwiKTtyZXR1cm4gbnVsbCE9dD90OlR0KGNlLnRleHQoZSkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGk9ZS5vcHRpb25zLG89ZS5zZWxlY3RlZEluZGV4LGE9XCJzZWxlY3Qtb25lXCI9PT1lLnR5cGUscz1hP251bGw6W10sdT1hP28rMTppLmxlbmd0aDtmb3Iocj1vPDA/dTphP286MDtyPHU7cisrKWlmKCgobj1pW3JdKS5zZWxlY3RlZHx8cj09PW8pJiYhbi5kaXNhYmxlZCYmKCFuLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFmZShuLnBhcmVudE5vZGUsXCJvcHRncm91cFwiKSkpe2lmKHQ9Y2UobikudmFsKCksYSlyZXR1cm4gdDtzLnB1c2godCl9cmV0dXJuIHN9LHNldDpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT1lLm9wdGlvbnMsbz1jZS5tYWtlQXJyYXkodCksYT1pLmxlbmd0aDt3aGlsZShhLS0pKChyPWlbYV0pLnNlbGVjdGVkPS0xPGNlLmluQXJyYXkoY2UudmFsSG9va3Mub3B0aW9uLmdldChyKSxvKSkmJihuPSEwKTtyZXR1cm4gbnx8KGUuc2VsZWN0ZWRJbmRleD0tMSksb319fX0pLGNlLmVhY2goW1wicmFkaW9cIixcImNoZWNrYm94XCJdLGZ1bmN0aW9uKCl7Y2UudmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihlLHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIGUuY2hlY2tlZD0tMTxjZS5pbkFycmF5KGNlKGUpLnZhbCgpLHQpfX0sbGUuY2hlY2tPbnx8KGNlLnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWUuZ2V0QXR0cmlidXRlKFwidmFsdWVcIik/XCJvblwiOmUudmFsdWV9KX0pO3ZhciBFdD1pZS5sb2NhdGlvbixqdD17Z3VpZDpEYXRlLm5vdygpfSxBdD0vXFw/LztjZS5wYXJzZVhNTD1mdW5jdGlvbihlKXt2YXIgdCxuO2lmKCFlfHxcInN0cmluZ1wiIT10eXBlb2YgZSlyZXR1cm4gbnVsbDt0cnl7dD0obmV3IGllLkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGUsXCJ0ZXh0L3htbFwiKX1jYXRjaChlKXt9cmV0dXJuIG49dCYmdC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInBhcnNlcmVycm9yXCIpWzBdLHQmJiFufHxjZS5lcnJvcihcIkludmFsaWQgWE1MOiBcIisobj9jZS5tYXAobi5jaGlsZE5vZGVzLGZ1bmN0aW9uKGUpe3JldHVybiBlLnRleHRDb250ZW50fSkuam9pbihcIlxcblwiKTplKSksdH07dmFyIER0PS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxOdD1mdW5jdGlvbihlKXtlLnN0b3BQcm9wYWdhdGlvbigpfTtjZS5leHRlbmQoY2UuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsLGMsZixwPVtufHxDXSxkPXVlLmNhbGwoZSxcInR5cGVcIik/ZS50eXBlOmUsaD11ZS5jYWxsKGUsXCJuYW1lc3BhY2VcIik/ZS5uYW1lc3BhY2Uuc3BsaXQoXCIuXCIpOltdO2lmKG89Zj1hPW49bnx8QywzIT09bi5ub2RlVHlwZSYmOCE9PW4ubm9kZVR5cGUmJiFEdC50ZXN0KGQrY2UuZXZlbnQudHJpZ2dlcmVkKSYmKC0xPGQuaW5kZXhPZihcIi5cIikmJihkPShoPWQuc3BsaXQoXCIuXCIpKS5zaGlmdCgpLGguc29ydCgpKSx1PWQuaW5kZXhPZihcIjpcIik8MCYmXCJvblwiK2QsKGU9ZVtjZS5leHBhbmRvXT9lOm5ldyBjZS5FdmVudChkLFwib2JqZWN0XCI9PXR5cGVvZiBlJiZlKSkuaXNUcmlnZ2VyPXI/MjozLGUubmFtZXNwYWNlPWguam9pbihcIi5cIiksZS5ybmFtZXNwYWNlPWUubmFtZXNwYWNlP25ldyBSZWdFeHAoXCIoXnxcXFxcLilcIitoLmpvaW4oXCJcXFxcLig/Oi4qXFxcXC58KVwiKStcIihcXFxcLnwkKVwiKTpudWxsLGUucmVzdWx0PXZvaWQgMCxlLnRhcmdldHx8KGUudGFyZ2V0PW4pLHQ9bnVsbD09dD9bZV06Y2UubWFrZUFycmF5KHQsW2VdKSxjPWNlLmV2ZW50LnNwZWNpYWxbZF18fHt9LHJ8fCFjLnRyaWdnZXJ8fCExIT09Yy50cmlnZ2VyLmFwcGx5KG4sdCkpKXtpZighciYmIWMubm9CdWJibGUmJiF5KG4pKXtmb3Iocz1jLmRlbGVnYXRlVHlwZXx8ZCxEdC50ZXN0KHMrZCl8fChvPW8ucGFyZW50Tm9kZSk7bztvPW8ucGFyZW50Tm9kZSlwLnB1c2gobyksYT1vO2E9PT0obi5vd25lckRvY3VtZW50fHxDKSYmcC5wdXNoKGEuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93fHxpZSl9aT0wO3doaWxlKChvPXBbaSsrXSkmJiFlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpZj1vLGUudHlwZT0xPGk/czpjLmJpbmRUeXBlfHxkLChsPShfLmdldChvLFwiZXZlbnRzXCIpfHxPYmplY3QuY3JlYXRlKG51bGwpKVtlLnR5cGVdJiZfLmdldChvLFwiaGFuZGxlXCIpKSYmbC5hcHBseShvLHQpLChsPXUmJm9bdV0pJiZsLmFwcGx5JiYkKG8pJiYoZS5yZXN1bHQ9bC5hcHBseShvLHQpLCExPT09ZS5yZXN1bHQmJmUucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIGUudHlwZT1kLHJ8fGUuaXNEZWZhdWx0UHJldmVudGVkKCl8fGMuX2RlZmF1bHQmJiExIT09Yy5fZGVmYXVsdC5hcHBseShwLnBvcCgpLHQpfHwhJChuKXx8dSYmdihuW2RdKSYmIXkobikmJigoYT1uW3VdKSYmKG5bdV09bnVsbCksY2UuZXZlbnQudHJpZ2dlcmVkPWQsZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZmLmFkZEV2ZW50TGlzdGVuZXIoZCxOdCksbltkXSgpLGUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmZi5yZW1vdmVFdmVudExpc3RlbmVyKGQsTnQpLGNlLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsYSYmKG5bdV09YSkpLGUucmVzdWx0fX0sc2ltdWxhdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWNlLmV4dGVuZChuZXcgY2UuRXZlbnQsbix7dHlwZTplLGlzU2ltdWxhdGVkOiEwfSk7Y2UuZXZlbnQudHJpZ2dlcihyLG51bGwsdCl9fSksY2UuZm4uZXh0ZW5kKHt0cmlnZ2VyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2NlLmV2ZW50LnRyaWdnZXIoZSx0LHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpc1swXTtpZihuKXJldHVybiBjZS5ldmVudC50cmlnZ2VyKGUsdCxuLCEwKX19KTt2YXIgcXQ9L1xcW1xcXSQvLEx0PS9cXHI/XFxuL2csSHQ9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLE90PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBQdChuLGUscixpKXt2YXIgdDtpZihBcnJheS5pc0FycmF5KGUpKWNlLmVhY2goZSxmdW5jdGlvbihlLHQpe3J8fHF0LnRlc3Qobik/aShuLHQpOlB0KG4rXCJbXCIrKFwib2JqZWN0XCI9PXR5cGVvZiB0JiZudWxsIT10P2U6XCJcIikrXCJdXCIsdCxyLGkpfSk7ZWxzZSBpZihyfHxcIm9iamVjdFwiIT09eChlKSlpKG4sZSk7ZWxzZSBmb3IodCBpbiBlKVB0KG4rXCJbXCIrdCtcIl1cIixlW3RdLHIsaSl9Y2UucGFyYW09ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9ZnVuY3Rpb24oZSx0KXt2YXIgbj12KHQpP3QoKTp0O3Jbci5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChlKStcIj1cIitlbmNvZGVVUklDb21wb25lbnQobnVsbD09bj9cIlwiOm4pfTtpZihudWxsPT1lKXJldHVyblwiXCI7aWYoQXJyYXkuaXNBcnJheShlKXx8ZS5qcXVlcnkmJiFjZS5pc1BsYWluT2JqZWN0KGUpKWNlLmVhY2goZSxmdW5jdGlvbigpe2kodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IobiBpbiBlKVB0KG4sZVtuXSx0LGkpO3JldHVybiByLmpvaW4oXCImXCIpfSxjZS5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBjZS5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPWNlLnByb3AodGhpcyxcImVsZW1lbnRzXCIpO3JldHVybiBlP2NlLm1ha2VBcnJheShlKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFjZSh0aGlzKS5pcyhcIjpkaXNhYmxlZFwiKSYmT3QudGVzdCh0aGlzLm5vZGVOYW1lKSYmIUh0LnRlc3QoZSkmJih0aGlzLmNoZWNrZWR8fCF3ZS50ZXN0KGUpKX0pLm1hcChmdW5jdGlvbihlLHQpe3ZhciBuPWNlKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1uP251bGw6QXJyYXkuaXNBcnJheShuKT9jZS5tYXAobixmdW5jdGlvbihlKXtyZXR1cm57bmFtZTp0Lm5hbWUsdmFsdWU6ZS5yZXBsYWNlKEx0LFwiXFxyXFxuXCIpfX0pOntuYW1lOnQubmFtZSx2YWx1ZTpuLnJlcGxhY2UoTHQsXCJcXHJcXG5cIil9fSkuZ2V0KCl9fSk7dmFyIE10PS8lMjAvZyxSdD0vIy4qJC8sSXQ9LyhbPyZdKV89W14mXSovLFd0PS9eKC4qPyk6WyBcXHRdKihbXlxcclxcbl0qKSQvZ20sRnQ9L14oPzpHRVR8SEVBRCkkLywkdD0vXlxcL1xcLy8sQnQ9e30sX3Q9e30senQ9XCIqL1wiLmNvbmNhdChcIipcIiksWHQ9Qy5jcmVhdGVFbGVtZW50KFwiYVwiKTtmdW5jdGlvbiBVdChvKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXtcInN0cmluZ1wiIT10eXBlb2YgZSYmKHQ9ZSxlPVwiKlwiKTt2YXIgbixyPTAsaT1lLnRvTG93ZXJDYXNlKCkubWF0Y2goRCl8fFtdO2lmKHYodCkpd2hpbGUobj1pW3IrK10pXCIrXCI9PT1uWzBdPyhuPW4uc2xpY2UoMSl8fFwiKlwiLChvW25dPW9bbl18fFtdKS51bnNoaWZ0KHQpKToob1tuXT1vW25dfHxbXSkucHVzaCh0KX19ZnVuY3Rpb24gVnQodCxpLG8sYSl7dmFyIHM9e30sdT10PT09X3Q7ZnVuY3Rpb24gbChlKXt2YXIgcjtyZXR1cm4gc1tlXT0hMCxjZS5lYWNoKHRbZV18fFtdLGZ1bmN0aW9uKGUsdCl7dmFyIG49dChpLG8sYSk7cmV0dXJuXCJzdHJpbmdcIiE9dHlwZW9mIG58fHV8fHNbbl0/dT8hKHI9bik6dm9pZCAwOihpLmRhdGFUeXBlcy51bnNoaWZ0KG4pLGwobiksITEpfSkscn1yZXR1cm4gbChpLmRhdGFUeXBlc1swXSl8fCFzW1wiKlwiXSYmbChcIipcIil9ZnVuY3Rpb24gR3QoZSx0KXt2YXIgbixyLGk9Y2UuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IobiBpbiB0KXZvaWQgMCE9PXRbbl0mJigoaVtuXT9lOnJ8fChyPXt9KSlbbl09dFtuXSk7cmV0dXJuIHImJmNlLmV4dGVuZCghMCxlLHIpLGV9WHQuaHJlZj1FdC5ocmVmLGNlLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6RXQuaHJlZix0eXBlOlwiR0VUXCIsaXNMb2NhbDovXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLy50ZXN0KEV0LnByb3RvY29sKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6XCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLThcIixhY2NlcHRzOntcIipcIjp6dCx0ZXh0OlwidGV4dC9wbGFpblwiLGh0bWw6XCJ0ZXh0L2h0bWxcIix4bWw6XCJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sXCIsanNvbjpcImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdFwifSxjb250ZW50czp7eG1sOi9cXGJ4bWxcXGIvLGh0bWw6L1xcYmh0bWwvLGpzb246L1xcYmpzb25cXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOlwicmVzcG9uc2VYTUxcIix0ZXh0OlwicmVzcG9uc2VUZXh0XCIsanNvbjpcInJlc3BvbnNlSlNPTlwifSxjb252ZXJ0ZXJzOntcIiogdGV4dFwiOlN0cmluZyxcInRleHQgaHRtbFwiOiEwLFwidGV4dCBqc29uXCI6SlNPTi5wYXJzZSxcInRleHQgeG1sXCI6Y2UucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihlLHQpe3JldHVybiB0P0d0KEd0KGUsY2UuYWpheFNldHRpbmdzKSx0KTpHdChjZS5hamF4U2V0dGluZ3MsZSl9LGFqYXhQcmVmaWx0ZXI6VXQoQnQpLGFqYXhUcmFuc3BvcnQ6VXQoX3QpLGFqYXg6ZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksdD10fHx7fTt2YXIgYyxmLHAsbixkLHIsaCxnLGksbyx2PWNlLmFqYXhTZXR1cCh7fSx0KSx5PXYuY29udGV4dHx8dixtPXYuY29udGV4dCYmKHkubm9kZVR5cGV8fHkuanF1ZXJ5KT9jZSh5KTpjZS5ldmVudCx4PWNlLkRlZmVycmVkKCksYj1jZS5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKSx3PXYuc3RhdHVzQ29kZXx8e30sYT17fSxzPXt9LHU9XCJjYW5jZWxlZFwiLFQ9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihlKXt2YXIgdDtpZihoKXtpZighbil7bj17fTt3aGlsZSh0PVd0LmV4ZWMocCkpblt0WzFdLnRvTG93ZXJDYXNlKCkrXCIgXCJdPShuW3RbMV0udG9Mb3dlckNhc2UoKStcIiBcIl18fFtdKS5jb25jYXQodFsyXSl9dD1uW2UudG9Mb3dlckNhc2UoKStcIiBcIl19cmV0dXJuIG51bGw9PXQ/bnVsbDp0LmpvaW4oXCIsIFwiKX0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGg/cDpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWgmJihlPXNbZS50b0xvd2VyQ2FzZSgpXT1zW2UudG9Mb3dlckNhc2UoKV18fGUsYVtlXT10KSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1oJiYodi5taW1lVHlwZT1lKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGUpaWYoaClULmFsd2F5cyhlW1Quc3RhdHVzXSk7ZWxzZSBmb3IodCBpbiBlKXdbdF09W3dbdF0sZVt0XV07cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGUpe3ZhciB0PWV8fHU7cmV0dXJuIGMmJmMuYWJvcnQodCksbCgwLHQpLHRoaXN9fTtpZih4LnByb21pc2UoVCksdi51cmw9KChlfHx2LnVybHx8RXQuaHJlZikrXCJcIikucmVwbGFjZSgkdCxFdC5wcm90b2NvbCtcIi8vXCIpLHYudHlwZT10Lm1ldGhvZHx8dC50eXBlfHx2Lm1ldGhvZHx8di50eXBlLHYuZGF0YVR5cGVzPSh2LmRhdGFUeXBlfHxcIipcIikudG9Mb3dlckNhc2UoKS5tYXRjaChEKXx8W1wiXCJdLG51bGw9PXYuY3Jvc3NEb21haW4pe3I9Qy5jcmVhdGVFbGVtZW50KFwiYVwiKTt0cnl7ci5ocmVmPXYudXJsLHIuaHJlZj1yLmhyZWYsdi5jcm9zc0RvbWFpbj1YdC5wcm90b2NvbCtcIi8vXCIrWHQuaG9zdCE9ci5wcm90b2NvbCtcIi8vXCIrci5ob3N0fWNhdGNoKGUpe3YuY3Jvc3NEb21haW49ITB9fWlmKHYuZGF0YSYmdi5wcm9jZXNzRGF0YSYmXCJzdHJpbmdcIiE9dHlwZW9mIHYuZGF0YSYmKHYuZGF0YT1jZS5wYXJhbSh2LmRhdGEsdi50cmFkaXRpb25hbCkpLFZ0KEJ0LHYsdCxUKSxoKXJldHVybiBUO2ZvcihpIGluKGc9Y2UuZXZlbnQmJnYuZ2xvYmFsKSYmMD09Y2UuYWN0aXZlKysmJmNlLmV2ZW50LnRyaWdnZXIoXCJhamF4U3RhcnRcIiksdi50eXBlPXYudHlwZS50b1VwcGVyQ2FzZSgpLHYuaGFzQ29udGVudD0hRnQudGVzdCh2LnR5cGUpLGY9di51cmwucmVwbGFjZShSdCxcIlwiKSx2Lmhhc0NvbnRlbnQ/di5kYXRhJiZ2LnByb2Nlc3NEYXRhJiYwPT09KHYuY29udGVudFR5cGV8fFwiXCIpLmluZGV4T2YoXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIikmJih2LmRhdGE9di5kYXRhLnJlcGxhY2UoTXQsXCIrXCIpKToobz12LnVybC5zbGljZShmLmxlbmd0aCksdi5kYXRhJiYodi5wcm9jZXNzRGF0YXx8XCJzdHJpbmdcIj09dHlwZW9mIHYuZGF0YSkmJihmKz0oQXQudGVzdChmKT9cIiZcIjpcIj9cIikrdi5kYXRhLGRlbGV0ZSB2LmRhdGEpLCExPT09di5jYWNoZSYmKGY9Zi5yZXBsYWNlKEl0LFwiJDFcIiksbz0oQXQudGVzdChmKT9cIiZcIjpcIj9cIikrXCJfPVwiK2p0Lmd1aWQrKytvKSx2LnVybD1mK28pLHYuaWZNb2RpZmllZCYmKGNlLmxhc3RNb2RpZmllZFtmXSYmVC5zZXRSZXF1ZXN0SGVhZGVyKFwiSWYtTW9kaWZpZWQtU2luY2VcIixjZS5sYXN0TW9kaWZpZWRbZl0pLGNlLmV0YWdbZl0mJlQuc2V0UmVxdWVzdEhlYWRlcihcIklmLU5vbmUtTWF0Y2hcIixjZS5ldGFnW2ZdKSksKHYuZGF0YSYmdi5oYXNDb250ZW50JiYhMSE9PXYuY29udGVudFR5cGV8fHQuY29udGVudFR5cGUpJiZULnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIix2LmNvbnRlbnRUeXBlKSxULnNldFJlcXVlc3RIZWFkZXIoXCJBY2NlcHRcIix2LmRhdGFUeXBlc1swXSYmdi5hY2NlcHRzW3YuZGF0YVR5cGVzWzBdXT92LmFjY2VwdHNbdi5kYXRhVHlwZXNbMF1dKyhcIipcIiE9PXYuZGF0YVR5cGVzWzBdP1wiLCBcIit6dCtcIjsgcT0wLjAxXCI6XCJcIik6di5hY2NlcHRzW1wiKlwiXSksdi5oZWFkZXJzKVQuc2V0UmVxdWVzdEhlYWRlcihpLHYuaGVhZGVyc1tpXSk7aWYodi5iZWZvcmVTZW5kJiYoITE9PT12LmJlZm9yZVNlbmQuY2FsbCh5LFQsdil8fGgpKXJldHVybiBULmFib3J0KCk7aWYodT1cImFib3J0XCIsYi5hZGQodi5jb21wbGV0ZSksVC5kb25lKHYuc3VjY2VzcyksVC5mYWlsKHYuZXJyb3IpLGM9VnQoX3Qsdix0LFQpKXtpZihULnJlYWR5U3RhdGU9MSxnJiZtLnRyaWdnZXIoXCJhamF4U2VuZFwiLFtULHZdKSxoKXJldHVybiBUO3YuYXN5bmMmJjA8di50aW1lb3V0JiYoZD1pZS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7VC5hYm9ydChcInRpbWVvdXRcIil9LHYudGltZW91dCkpO3RyeXtoPSExLGMuc2VuZChhLGwpfWNhdGNoKGUpe2lmKGgpdGhyb3cgZTtsKC0xLGUpfX1lbHNlIGwoLTEsXCJObyBUcmFuc3BvcnRcIik7ZnVuY3Rpb24gbChlLHQsbixyKXt2YXIgaSxvLGEscyx1LGw9dDtofHwoaD0hMCxkJiZpZS5jbGVhclRpbWVvdXQoZCksYz12b2lkIDAscD1yfHxcIlwiLFQucmVhZHlTdGF0ZT0wPGU/NDowLGk9MjAwPD1lJiZlPDMwMHx8MzA0PT09ZSxuJiYocz1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscz1lLmNvbnRlbnRzLHU9ZS5kYXRhVHlwZXM7d2hpbGUoXCIqXCI9PT11WzBdKXUuc2hpZnQoKSx2b2lkIDA9PT1yJiYocj1lLm1pbWVUeXBlfHx0LmdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1UeXBlXCIpKTtpZihyKWZvcihpIGluIHMpaWYoc1tpXSYmc1tpXS50ZXN0KHIpKXt1LnVuc2hpZnQoaSk7YnJlYWt9aWYodVswXWluIG4pbz11WzBdO2Vsc2V7Zm9yKGkgaW4gbil7aWYoIXVbMF18fGUuY29udmVydGVyc1tpK1wiIFwiK3VbMF1dKXtvPWk7YnJlYWt9YXx8KGE9aSl9bz1vfHxhfWlmKG8pcmV0dXJuIG8hPT11WzBdJiZ1LnVuc2hpZnQobyksbltvXX0odixULG4pKSwhaSYmLTE8Y2UuaW5BcnJheShcInNjcmlwdFwiLHYuZGF0YVR5cGVzKSYmY2UuaW5BcnJheShcImpzb25cIix2LmRhdGFUeXBlcyk8MCYmKHYuY29udmVydGVyc1tcInRleHQgc2NyaXB0XCJdPWZ1bmN0aW9uKCl7fSkscz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyx1LGw9e30sYz1lLmRhdGFUeXBlcy5zbGljZSgpO2lmKGNbMV0pZm9yKGEgaW4gZS5jb252ZXJ0ZXJzKWxbYS50b0xvd2VyQ2FzZSgpXT1lLmNvbnZlcnRlcnNbYV07bz1jLnNoaWZ0KCk7d2hpbGUobylpZihlLnJlc3BvbnNlRmllbGRzW29dJiYobltlLnJlc3BvbnNlRmllbGRzW29dXT10KSwhdSYmciYmZS5kYXRhRmlsdGVyJiYodD1lLmRhdGFGaWx0ZXIodCxlLmRhdGFUeXBlKSksdT1vLG89Yy5zaGlmdCgpKWlmKFwiKlwiPT09bylvPXU7ZWxzZSBpZihcIipcIiE9PXUmJnUhPT1vKXtpZighKGE9bFt1K1wiIFwiK29dfHxsW1wiKiBcIitvXSkpZm9yKGkgaW4gbClpZigocz1pLnNwbGl0KFwiIFwiKSlbMV09PT1vJiYoYT1sW3UrXCIgXCIrc1swXV18fGxbXCIqIFwiK3NbMF1dKSl7ITA9PT1hP2E9bFtpXTohMCE9PWxbaV0mJihvPXNbMF0sYy51bnNoaWZ0KHNbMV0pKTticmVha31pZighMCE9PWEpaWYoYSYmZVtcInRocm93c1wiXSl0PWEodCk7ZWxzZSB0cnl7dD1hKHQpfWNhdGNoKGUpe3JldHVybntzdGF0ZTpcInBhcnNlcmVycm9yXCIsZXJyb3I6YT9lOlwiTm8gY29udmVyc2lvbiBmcm9tIFwiK3UrXCIgdG8gXCIrb319fXJldHVybntzdGF0ZTpcInN1Y2Nlc3NcIixkYXRhOnR9fSh2LHMsVCxpKSxpPyh2LmlmTW9kaWZpZWQmJigodT1ULmdldFJlc3BvbnNlSGVhZGVyKFwiTGFzdC1Nb2RpZmllZFwiKSkmJihjZS5sYXN0TW9kaWZpZWRbZl09dSksKHU9VC5nZXRSZXNwb25zZUhlYWRlcihcImV0YWdcIikpJiYoY2UuZXRhZ1tmXT11KSksMjA0PT09ZXx8XCJIRUFEXCI9PT12LnR5cGU/bD1cIm5vY29udGVudFwiOjMwND09PWU/bD1cIm5vdG1vZGlmaWVkXCI6KGw9cy5zdGF0ZSxvPXMuZGF0YSxpPSEoYT1zLmVycm9yKSkpOihhPWwsIWUmJmx8fChsPVwiZXJyb3JcIixlPDAmJihlPTApKSksVC5zdGF0dXM9ZSxULnN0YXR1c1RleHQ9KHR8fGwpK1wiXCIsaT94LnJlc29sdmVXaXRoKHksW28sbCxUXSk6eC5yZWplY3RXaXRoKHksW1QsbCxhXSksVC5zdGF0dXNDb2RlKHcpLHc9dm9pZCAwLGcmJm0udHJpZ2dlcihpP1wiYWpheFN1Y2Nlc3NcIjpcImFqYXhFcnJvclwiLFtULHYsaT9vOmFdKSxiLmZpcmVXaXRoKHksW1QsbF0pLGcmJihtLnRyaWdnZXIoXCJhamF4Q29tcGxldGVcIixbVCx2XSksLS1jZS5hY3RpdmV8fGNlLmV2ZW50LnRyaWdnZXIoXCJhamF4U3RvcFwiKSkpfXJldHVybiBUfSxnZXRKU09OOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gY2UuZ2V0KGUsdCxuLFwianNvblwiKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGNlLmdldChlLHZvaWQgMCx0LFwic2NyaXB0XCIpfX0pLGNlLmVhY2goW1wiZ2V0XCIsXCJwb3N0XCJdLGZ1bmN0aW9uKGUsaSl7Y2VbaV09ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHYodCkmJihyPXJ8fG4sbj10LHQ9dm9pZCAwKSxjZS5hamF4KGNlLmV4dGVuZCh7dXJsOmUsdHlwZTppLGRhdGFUeXBlOnIsZGF0YTp0LHN1Y2Nlc3M6bn0sY2UuaXNQbGFpbk9iamVjdChlKSYmZSkpfX0pLGNlLmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZS5oZWFkZXJzKVwiY29udGVudC10eXBlXCI9PT10LnRvTG93ZXJDYXNlKCkmJihlLmNvbnRlbnRUeXBlPWUuaGVhZGVyc1t0XXx8XCJcIil9KSxjZS5fZXZhbFVybD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGNlLmFqYXgoe3VybDplLHR5cGU6XCJHRVRcIixkYXRhVHlwZTpcInNjcmlwdFwiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSxjb252ZXJ0ZXJzOntcInRleHQgc2NyaXB0XCI6ZnVuY3Rpb24oKXt9fSxkYXRhRmlsdGVyOmZ1bmN0aW9uKGUpe2NlLmdsb2JhbEV2YWwoZSx0LG4pfX0pfSxjZS5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIHRoaXNbMF0mJih2KGUpJiYoZT1lLmNhbGwodGhpc1swXSkpLHQ9Y2UoZSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJnQuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLHQubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpczt3aGlsZShlLmZpcnN0RWxlbWVudENoaWxkKWU9ZS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gZX0pLmFwcGVuZCh0aGlzKSksdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKG4pe3JldHVybiB2KG4pP3RoaXMuZWFjaChmdW5jdGlvbihlKXtjZSh0aGlzKS53cmFwSW5uZXIobi5jYWxsKHRoaXMsZSkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9Y2UodGhpcyksdD1lLmNvbnRlbnRzKCk7dC5sZW5ndGg/dC53cmFwQWxsKG4pOmUuYXBwZW5kKG4pfSl9LHdyYXA6ZnVuY3Rpb24odCl7dmFyIG49dih0KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe2NlKHRoaXMpLndyYXBBbGwobj90LmNhbGwodGhpcyxlKTp0KX0pfSx1bndyYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucGFyZW50KGUpLm5vdChcImJvZHlcIikuZWFjaChmdW5jdGlvbigpe2NlKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KSx0aGlzfX0pLGNlLmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIWNlLmV4cHIucHNldWRvcy52aXNpYmxlKGUpfSxjZS5leHByLnBzZXVkb3MudmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4hIShlLm9mZnNldFdpZHRofHxlLm9mZnNldEhlaWdodHx8ZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCl9LGNlLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBpZS5YTUxIdHRwUmVxdWVzdH1jYXRjaChlKXt9fTt2YXIgWXQ9ezA6MjAwLDEyMjM6MjA0fSxRdD1jZS5hamF4U2V0dGluZ3MueGhyKCk7bGUuY29ycz0hIVF0JiZcIndpdGhDcmVkZW50aWFsc1wiaW4gUXQsbGUuYWpheD1RdD0hIVF0LGNlLmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24oaSl7dmFyIG8sYTtpZihsZS5jb3JzfHxRdCYmIWkuY3Jvc3NEb21haW4pcmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWkueGhyKCk7aWYoci5vcGVuKGkudHlwZSxpLnVybCxpLmFzeW5jLGkudXNlcm5hbWUsaS5wYXNzd29yZCksaS54aHJGaWVsZHMpZm9yKG4gaW4gaS54aHJGaWVsZHMpcltuXT1pLnhockZpZWxkc1tuXTtmb3IobiBpbiBpLm1pbWVUeXBlJiZyLm92ZXJyaWRlTWltZVR5cGUmJnIub3ZlcnJpZGVNaW1lVHlwZShpLm1pbWVUeXBlKSxpLmNyb3NzRG9tYWlufHxlW1wiWC1SZXF1ZXN0ZWQtV2l0aFwiXXx8KGVbXCJYLVJlcXVlc3RlZC1XaXRoXCJdPVwiWE1MSHR0cFJlcXVlc3RcIiksZSlyLnNldFJlcXVlc3RIZWFkZXIobixlW25dKTtvPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe28mJihvPWE9ci5vbmxvYWQ9ci5vbmVycm9yPXIub25hYm9ydD1yLm9udGltZW91dD1yLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLFwiYWJvcnRcIj09PWU/ci5hYm9ydCgpOlwiZXJyb3JcIj09PWU/XCJudW1iZXJcIiE9dHlwZW9mIHIuc3RhdHVzP3QoMCxcImVycm9yXCIpOnQoci5zdGF0dXMsci5zdGF0dXNUZXh0KTp0KFl0W3Iuc3RhdHVzXXx8ci5zdGF0dXMsci5zdGF0dXNUZXh0LFwidGV4dFwiIT09KHIucmVzcG9uc2VUeXBlfHxcInRleHRcIil8fFwic3RyaW5nXCIhPXR5cGVvZiByLnJlc3BvbnNlVGV4dD97YmluYXJ5OnIucmVzcG9uc2V9Ont0ZXh0OnIucmVzcG9uc2VUZXh0fSxyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSl9fSxyLm9ubG9hZD1vKCksYT1yLm9uZXJyb3I9ci5vbnRpbWVvdXQ9byhcImVycm9yXCIpLHZvaWQgMCE9PXIub25hYm9ydD9yLm9uYWJvcnQ9YTpyLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1yLnJlYWR5U3RhdGUmJmllLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtvJiZhKCl9KX0sbz1vKFwiYWJvcnRcIik7dHJ5e3Iuc2VuZChpLmhhc0NvbnRlbnQmJmkuZGF0YXx8bnVsbCl9Y2F0Y2goZSl7aWYobyl0aHJvdyBlfX0sYWJvcnQ6ZnVuY3Rpb24oKXtvJiZvKCl9fX0pLGNlLmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24oZSl7ZS5jcm9zc0RvbWFpbiYmKGUuY29udGVudHMuc2NyaXB0PSExKX0pLGNlLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OlwidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHRcIn0sY29udGVudHM6e3NjcmlwdDovXFxiKD86amF2YXxlY21hKXNjcmlwdFxcYi99LGNvbnZlcnRlcnM6e1widGV4dCBzY3JpcHRcIjpmdW5jdGlvbihlKXtyZXR1cm4gY2UuZ2xvYmFsRXZhbChlKSxlfX19KSxjZS5hamF4UHJlZmlsdGVyKFwic2NyaXB0XCIsZnVuY3Rpb24oZSl7dm9pZCAwPT09ZS5jYWNoZSYmKGUuY2FjaGU9ITEpLGUuY3Jvc3NEb21haW4mJihlLnR5cGU9XCJHRVRcIil9KSxjZS5hamF4VHJhbnNwb3J0KFwic2NyaXB0XCIsZnVuY3Rpb24obil7dmFyIHIsaTtpZihuLmNyb3NzRG9tYWlufHxuLnNjcmlwdEF0dHJzKXJldHVybntzZW5kOmZ1bmN0aW9uKGUsdCl7cj1jZShcIjxzY3JpcHQ+XCIpLmF0dHIobi5zY3JpcHRBdHRyc3x8e30pLnByb3Aoe2NoYXJzZXQ6bi5zY3JpcHRDaGFyc2V0LHNyYzpuLnVybH0pLm9uKFwibG9hZCBlcnJvclwiLGk9ZnVuY3Rpb24oZSl7ci5yZW1vdmUoKSxpPW51bGwsZSYmdChcImVycm9yXCI9PT1lLnR5cGU/NDA0OjIwMCxlLnR5cGUpfSksQy5oZWFkLmFwcGVuZENoaWxkKHJbMF0pfSxhYm9ydDpmdW5jdGlvbigpe2kmJmkoKX19fSk7dmFyIEp0LEt0PVtdLFp0PS8oPSlcXD8oPz0mfCQpfFxcP1xcPy87Y2UuYWpheFNldHVwKHtqc29ucDpcImNhbGxiYWNrXCIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPUt0LnBvcCgpfHxjZS5leHBhbmRvK1wiX1wiK2p0Lmd1aWQrKztyZXR1cm4gdGhpc1tlXT0hMCxlfX0pLGNlLmFqYXhQcmVmaWx0ZXIoXCJqc29uIGpzb25wXCIsZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhPSExIT09ZS5qc29ucCYmKFp0LnRlc3QoZS51cmwpP1widXJsXCI6XCJzdHJpbmdcIj09dHlwZW9mIGUuZGF0YSYmMD09PShlLmNvbnRlbnRUeXBlfHxcIlwiKS5pbmRleE9mKFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpJiZadC50ZXN0KGUuZGF0YSkmJlwiZGF0YVwiKTtpZihhfHxcImpzb25wXCI9PT1lLmRhdGFUeXBlc1swXSlyZXR1cm4gcj1lLmpzb25wQ2FsbGJhY2s9dihlLmpzb25wQ2FsbGJhY2spP2UuanNvbnBDYWxsYmFjaygpOmUuanNvbnBDYWxsYmFjayxhP2VbYV09ZVthXS5yZXBsYWNlKFp0LFwiJDFcIityKTohMSE9PWUuanNvbnAmJihlLnVybCs9KEF0LnRlc3QoZS51cmwpP1wiJlwiOlwiP1wiKStlLmpzb25wK1wiPVwiK3IpLGUuY29udmVydGVyc1tcInNjcmlwdCBqc29uXCJdPWZ1bmN0aW9uKCl7cmV0dXJuIG98fGNlLmVycm9yKHIrXCIgd2FzIG5vdCBjYWxsZWRcIiksb1swXX0sZS5kYXRhVHlwZXNbMF09XCJqc29uXCIsaT1pZVtyXSxpZVtyXT1mdW5jdGlvbigpe289YXJndW1lbnRzfSxuLmFsd2F5cyhmdW5jdGlvbigpe3ZvaWQgMD09PWk/Y2UoaWUpLnJlbW92ZVByb3Aocik6aWVbcl09aSxlW3JdJiYoZS5qc29ucENhbGxiYWNrPXQuanNvbnBDYWxsYmFjayxLdC5wdXNoKHIpKSxvJiZ2KGkpJiZpKG9bMF0pLG89aT12b2lkIDB9KSxcInNjcmlwdFwifSksbGUuY3JlYXRlSFRNTERvY3VtZW50PSgoSnQ9Qy5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoXCJcIikuYm9keSkuaW5uZXJIVE1MPVwiPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT5cIiwyPT09SnQuY2hpbGROb2Rlcy5sZW5ndGgpLGNlLnBhcnNlSFRNTD1mdW5jdGlvbihlLHQsbil7cmV0dXJuXCJzdHJpbmdcIiE9dHlwZW9mIGU/W106KFwiYm9vbGVhblwiPT10eXBlb2YgdCYmKG49dCx0PSExKSx0fHwobGUuY3JlYXRlSFRNTERvY3VtZW50Pygocj0odD1DLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudChcIlwiKSkuY3JlYXRlRWxlbWVudChcImJhc2VcIikpLmhyZWY9Qy5sb2NhdGlvbi5ocmVmLHQuaGVhZC5hcHBlbmRDaGlsZChyKSk6dD1DKSxvPSFuJiZbXSwoaT13LmV4ZWMoZSkpP1t0LmNyZWF0ZUVsZW1lbnQoaVsxXSldOihpPUFlKFtlXSx0LG8pLG8mJm8ubGVuZ3RoJiZjZShvKS5yZW1vdmUoKSxjZS5tZXJnZShbXSxpLmNoaWxkTm9kZXMpKSk7dmFyIHIsaSxvfSxjZS5mbi5sb2FkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYT10aGlzLHM9ZS5pbmRleE9mKFwiIFwiKTtyZXR1cm4tMTxzJiYocj1UdChlLnNsaWNlKHMpKSxlPWUuc2xpY2UoMCxzKSksdih0KT8obj10LHQ9dm9pZCAwKTp0JiZcIm9iamVjdFwiPT10eXBlb2YgdCYmKGk9XCJQT1NUXCIpLDA8YS5sZW5ndGgmJmNlLmFqYXgoe3VybDplLHR5cGU6aXx8XCJHRVRcIixkYXRhVHlwZTpcImh0bWxcIixkYXRhOnR9KS5kb25lKGZ1bmN0aW9uKGUpe289YXJndW1lbnRzLGEuaHRtbChyP2NlKFwiPGRpdj5cIikuYXBwZW5kKGNlLnBhcnNlSFRNTChlKSkuZmluZChyKTplKX0pLmFsd2F5cyhuJiZmdW5jdGlvbihlLHQpe2EuZWFjaChmdW5jdGlvbigpe24uYXBwbHkodGhpcyxvfHxbZS5yZXNwb25zZVRleHQsdCxlXSl9KX0pLHRoaXN9LGNlLmV4cHIucHNldWRvcy5hbmltYXRlZD1mdW5jdGlvbih0KXtyZXR1cm4gY2UuZ3JlcChjZS50aW1lcnMsZnVuY3Rpb24oZSl7cmV0dXJuIHQ9PT1lLmVsZW19KS5sZW5ndGh9LGNlLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbD1jZS5jc3MoZSxcInBvc2l0aW9uXCIpLGM9Y2UoZSksZj17fTtcInN0YXRpY1wiPT09bCYmKGUuc3R5bGUucG9zaXRpb249XCJyZWxhdGl2ZVwiKSxzPWMub2Zmc2V0KCksbz1jZS5jc3MoZSxcInRvcFwiKSx1PWNlLmNzcyhlLFwibGVmdFwiKSwoXCJhYnNvbHV0ZVwiPT09bHx8XCJmaXhlZFwiPT09bCkmJi0xPChvK3UpLmluZGV4T2YoXCJhdXRvXCIpPyhhPShyPWMucG9zaXRpb24oKSkudG9wLGk9ci5sZWZ0KTooYT1wYXJzZUZsb2F0KG8pfHwwLGk9cGFyc2VGbG9hdCh1KXx8MCksdih0KSYmKHQ9dC5jYWxsKGUsbixjZS5leHRlbmQoe30scykpKSxudWxsIT10LnRvcCYmKGYudG9wPXQudG9wLXMudG9wK2EpLG51bGwhPXQubGVmdCYmKGYubGVmdD10LmxlZnQtcy5sZWZ0K2kpLFwidXNpbmdcImluIHQ/dC51c2luZy5jYWxsKGUsZik6Yy5jc3MoZil9fSxjZS5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbih0KXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe2NlLm9mZnNldC5zZXRPZmZzZXQodGhpcyx0LGUpfSk7dmFyIGUsbixyPXRoaXNbMF07cmV0dXJuIHI/ci5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8oZT1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49ci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6ZS50b3Arbi5wYWdlWU9mZnNldCxsZWZ0OmUubGVmdCtuLnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH06dm9pZCAwfSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBlLHQsbixyPXRoaXNbMF0saT17dG9wOjAsbGVmdDowfTtpZihcImZpeGVkXCI9PT1jZS5jc3MocixcInBvc2l0aW9uXCIpKXQ9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle3Q9dGhpcy5vZmZzZXQoKSxuPXIub3duZXJEb2N1bWVudCxlPXIub2Zmc2V0UGFyZW50fHxuLmRvY3VtZW50RWxlbWVudDt3aGlsZShlJiYoZT09PW4uYm9keXx8ZT09PW4uZG9jdW1lbnRFbGVtZW50KSYmXCJzdGF0aWNcIj09PWNlLmNzcyhlLFwicG9zaXRpb25cIikpZT1lLnBhcmVudE5vZGU7ZSYmZSE9PXImJjE9PT1lLm5vZGVUeXBlJiYoKGk9Y2UoZSkub2Zmc2V0KCkpLnRvcCs9Y2UuY3NzKGUsXCJib3JkZXJUb3BXaWR0aFwiLCEwKSxpLmxlZnQrPWNlLmNzcyhlLFwiYm9yZGVyTGVmdFdpZHRoXCIsITApKX1yZXR1cm57dG9wOnQudG9wLWkudG9wLWNlLmNzcyhyLFwibWFyZ2luVG9wXCIsITApLGxlZnQ6dC5sZWZ0LWkubGVmdC1jZS5jc3MocixcIm1hcmdpbkxlZnRcIiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnQ7d2hpbGUoZSYmXCJzdGF0aWNcIj09PWNlLmNzcyhlLFwicG9zaXRpb25cIikpZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8Sn0pfX0pLGNlLmVhY2goe3Njcm9sbExlZnQ6XCJwYWdlWE9mZnNldFwiLHNjcm9sbFRvcDpcInBhZ2VZT2Zmc2V0XCJ9LGZ1bmN0aW9uKHQsaSl7dmFyIG89XCJwYWdlWU9mZnNldFwiPT09aTtjZS5mblt0XT1mdW5jdGlvbihlKXtyZXR1cm4gTSh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZih5KGUpP3I9ZTo5PT09ZS5ub2RlVHlwZSYmKHI9ZS5kZWZhdWx0Vmlldyksdm9pZCAwPT09bilyZXR1cm4gcj9yW2ldOmVbdF07cj9yLnNjcm9sbFRvKG8/ci5wYWdlWE9mZnNldDpuLG8/bjpyLnBhZ2VZT2Zmc2V0KTplW3RdPW59LHQsZSxhcmd1bWVudHMubGVuZ3RoKX19KSxjZS5lYWNoKFtcInRvcFwiLFwibGVmdFwiXSxmdW5jdGlvbihlLG4pe2NlLmNzc0hvb2tzW25dPVllKGxlLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oZSx0KXtpZih0KXJldHVybiB0PUdlKGUsbiksX2UudGVzdCh0KT9jZShlKS5wb3NpdGlvbigpW25dK1wicHhcIjp0fSl9KSxjZS5lYWNoKHtIZWlnaHQ6XCJoZWlnaHRcIixXaWR0aDpcIndpZHRoXCJ9LGZ1bmN0aW9uKGEscyl7Y2UuZWFjaCh7cGFkZGluZzpcImlubmVyXCIrYSxjb250ZW50OnMsXCJcIjpcIm91dGVyXCIrYX0sZnVuY3Rpb24ocixvKXtjZS5mbltvXT1mdW5jdGlvbihlLHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGgmJihyfHxcImJvb2xlYW5cIiE9dHlwZW9mIGUpLGk9cnx8KCEwPT09ZXx8ITA9PT10P1wibWFyZ2luXCI6XCJib3JkZXJcIik7cmV0dXJuIE0odGhpcyxmdW5jdGlvbihlLHQsbil7dmFyIHI7cmV0dXJuIHkoZSk/MD09PW8uaW5kZXhPZihcIm91dGVyXCIpP2VbXCJpbm5lclwiK2FdOmUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W1wiY2xpZW50XCIrYV06OT09PWUubm9kZVR5cGU/KHI9ZS5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoZS5ib2R5W1wic2Nyb2xsXCIrYV0scltcInNjcm9sbFwiK2FdLGUuYm9keVtcIm9mZnNldFwiK2FdLHJbXCJvZmZzZXRcIithXSxyW1wiY2xpZW50XCIrYV0pKTp2b2lkIDA9PT1uP2NlLmNzcyhlLHQsaSk6Y2Uuc3R5bGUoZSx0LG4saSl9LHMsbj9lOnZvaWQgMCxuKX19KX0pLGNlLmVhY2goW1wiYWpheFN0YXJ0XCIsXCJhamF4U3RvcFwiLFwiYWpheENvbXBsZXRlXCIsXCJhamF4RXJyb3JcIixcImFqYXhTdWNjZXNzXCIsXCJhamF4U2VuZFwiXSxmdW5jdGlvbihlLHQpe2NlLmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9uKHQsZSl9fSksY2UuZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vbihlLG51bGwsdCxuKX0sdW5iaW5kOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub2ZmKGUsbnVsbCx0KX0sZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMub24odCxlLG4scil9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihlLFwiKipcIik6dGhpcy5vZmYodCxlfHxcIioqXCIsbil9LGhvdmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub24oXCJtb3VzZWVudGVyXCIsZSkub24oXCJtb3VzZWxlYXZlXCIsdHx8ZSl9fSksY2UuZWFjaChcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnVcIi5zcGxpdChcIiBcIiksZnVuY3Rpb24oZSxuKXtjZS5mbltuXT1mdW5jdGlvbihlLHQpe3JldHVybiAwPGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vbihuLG51bGwsZSx0KTp0aGlzLnRyaWdnZXIobil9fSk7dmFyIGVuPS9eW1xcc1xcdUZFRkZcXHhBMF0rfChbXlxcc1xcdUZFRkZcXHhBMF0pW1xcc1xcdUZFRkZcXHhBMF0rJC9nO2NlLnByb3h5PWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpO2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0JiYobj1lW3RdLHQ9ZSxlPW4pLHYoZSkpcmV0dXJuIHI9YWUuY2FsbChhcmd1bWVudHMsMiksKGk9ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0fHx0aGlzLHIuY29uY2F0KGFlLmNhbGwoYXJndW1lbnRzKSkpfSkuZ3VpZD1lLmd1aWQ9ZS5ndWlkfHxjZS5ndWlkKyssaX0sY2UuaG9sZFJlYWR5PWZ1bmN0aW9uKGUpe2U/Y2UucmVhZHlXYWl0Kys6Y2UucmVhZHkoITApfSxjZS5pc0FycmF5PUFycmF5LmlzQXJyYXksY2UucGFyc2VKU09OPUpTT04ucGFyc2UsY2Uubm9kZU5hbWU9ZmUsY2UuaXNGdW5jdGlvbj12LGNlLmlzV2luZG93PXksY2UuY2FtZWxDYXNlPUYsY2UudHlwZT14LGNlLm5vdz1EYXRlLm5vdyxjZS5pc051bWVyaWM9ZnVuY3Rpb24oZSl7dmFyIHQ9Y2UudHlwZShlKTtyZXR1cm4oXCJudW1iZXJcIj09PXR8fFwic3RyaW5nXCI9PT10KSYmIWlzTmFOKGUtcGFyc2VGbG9hdChlKSl9LGNlLnRyaW09ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/XCJcIjooZStcIlwiKS5yZXBsYWNlKGVuLFwiJDFcIil9LFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKFwianF1ZXJ5XCIsW10sZnVuY3Rpb24oKXtyZXR1cm4gY2V9KTt2YXIgdG49aWUualF1ZXJ5LG5uPWllLiQ7cmV0dXJuIGNlLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGllLiQ9PT1jZSYmKGllLiQ9bm4pLGUmJmllLmpRdWVyeT09PWNlJiYoaWUualF1ZXJ5PXRuKSxjZX0sXCJ1bmRlZmluZWRcIj09dHlwZW9mIGUmJihpZS5qUXVlcnk9aWUuJD1jZSksY2V9KTtcbiIsIi8qKlxuICogQSBmYXN0ZXIgYWx0ZXJuYXRpdmUgdG8gYEZ1bmN0aW9uI2FwcGx5YCwgdGhpcyBmdW5jdGlvbiBpbnZva2VzIGBmdW5jYFxuICogd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgIGFuZCB0aGUgYXJndW1lbnRzIG9mIGBhcmdzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5KGZ1bmMsIHRoaXNBcmcsIGFyZ3MpIHtcbiAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnKTtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgfVxuICByZXR1cm4gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcHBseTtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnJlZHVjZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAgYXNcbiAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICBhY2N1bXVsYXRvciA9IGFycmF5WysraW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYWNjdW11bGF0b3IgPSBpdGVyYXRlZShhY2N1bXVsYXRvciwgYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheVJlZHVjZTtcbiIsIi8qKlxuICogQ29udmVydHMgYW4gQVNDSUkgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFzY2lpVG9BcnJheShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5zcGxpdCgnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNjaWlUb0FycmF5O1xuIiwiLyoqIFVzZWQgdG8gbWF0Y2ggd29yZHMgY29tcG9zZWQgb2YgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuICovXG52YXIgcmVBc2NpaVdvcmQgPSAvW15cXHgwMC1cXHgyZlxceDNhLVxceDQwXFx4NWItXFx4NjBcXHg3Yi1cXHg3Zl0rL2c7XG5cbi8qKlxuICogU3BsaXRzIGFuIEFTQ0lJIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAqL1xuZnVuY3Rpb24gYXNjaWlXb3JkcyhzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5tYXRjaChyZUFzY2lpV29yZCkgfHwgW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNjaWlXb3JkcztcbiIsInZhciBiYXNlQXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19iYXNlQXNzaWduVmFsdWUnKSxcbiAgICBlcSA9IHJlcXVpcmUoJy4vZXEnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBBc3NpZ25zIGB2YWx1ZWAgdG8gYGtleWAgb2YgYG9iamVjdGAgaWYgdGhlIGV4aXN0aW5nIHZhbHVlIGlzIG5vdCBlcXVpdmFsZW50XG4gKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgaWYgKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgZXEob2JqVmFsdWUsIHZhbHVlKSkgfHxcbiAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NpZ25WYWx1ZTtcbiIsInZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2RlZmluZVByb3BlcnR5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGFzc2lnblZhbHVlYCBhbmQgYGFzc2lnbk1lcmdlVmFsdWVgIHdpdGhvdXRcbiAqIHZhbHVlIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgPT0gJ19fcHJvdG9fXycgJiYgZGVmaW5lUHJvcGVydHkpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge1xuICAgICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgICAnZW51bWVyYWJsZSc6IHRydWUsXG4gICAgICAndmFsdWUnOiB2YWx1ZSxcbiAgICAgICd3cml0YWJsZSc6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUFzc2lnblZhbHVlO1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb2JqZWN0VG9TdHJpbmc7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmRleE9mYCB3aGljaCBwZXJmb3JtcyBzdHJpY3QgZXF1YWxpdHlcbiAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaWN0SW5kZXhPZjtcbiIsInZhciBvdmVyQXJnID0gcmVxdWlyZSgnLi9fb3ZlckFyZycpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlS2V5cyA9IG92ZXJBcmcoT2JqZWN0LmtleXMsIE9iamVjdCk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF0aXZlS2V5cztcbiIsInZhciBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKSxcbiAgICBvdmVyUmVzdCA9IHJlcXVpcmUoJy4vX292ZXJSZXN0JyksXG4gICAgc2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19zZXRUb1N0cmluZycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlc3RgIHdoaWNoIGRvZXNuJ3QgdmFsaWRhdGUgb3IgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUmVzdChmdW5jLCBzdGFydCkge1xuICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgc3RhcnQsIGlkZW50aXR5KSwgZnVuYyArICcnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUmVzdDtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2xpY2VgIHdpdGhvdXQgYW4gaXRlcmF0ZWUgY2FsbCBndWFyZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNsaWNlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAtc3RhcnQgPiBsZW5ndGggPyAwIDogKGxlbmd0aCArIHN0YXJ0KTtcbiAgfVxuICBlbmQgPSBlbmQgPiBsZW5ndGggPyBsZW5ndGggOiBlbmQ7XG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlbmd0aDtcbiAgfVxuICBsZW5ndGggPSBzdGFydCA+IGVuZCA/IDAgOiAoKGVuZCAtIHN0YXJ0KSA+Pj4gMCk7XG4gIHN0YXJ0ID4+Pj0gMDtcblxuICB2YXIgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gYXJyYXlbaW5kZXggKyBzdGFydF07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlU2xpY2U7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGl0IHJlY2VpdmVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICpcbiAqIGNvbnNvbGUubG9nKF8uaWRlbnRpdHkob2JqZWN0KSA9PT0gb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlkZW50aXR5O1xuIiwidmFyIGJhc2VTbGljZSA9IHJlcXVpcmUoJy4vX2Jhc2VTbGljZScpO1xuXG4vKipcbiAqIENhc3RzIGBhcnJheWAgdG8gYSBzbGljZSBpZiBpdCdzIG5lZWRlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHNsaWNlLlxuICovXG5mdW5jdGlvbiBjYXN0U2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBlbmQ7XG4gIHJldHVybiAoIXN0YXJ0ICYmIGVuZCA+PSBsZW5ndGgpID8gYXJyYXkgOiBiYXNlU2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RTbGljZTtcbiIsInZhciBhc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnblZhbHVlJyksXG4gICAgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyk7XG5cbi8qKlxuICogQ29waWVzIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29waWVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlPYmplY3Qoc291cmNlLCBwcm9wcywgb2JqZWN0LCBjdXN0b21pemVyKSB7XG4gIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gIG9iamVjdCB8fCAob2JqZWN0ID0ge30pO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcblxuICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgID8gY3VzdG9taXplcihvYmplY3Rba2V5XSwgc291cmNlW2tleV0sIGtleSwgb2JqZWN0LCBzb3VyY2UpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXdWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgICBpZiAoaXNOZXcpIHtcbiAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlPYmplY3Q7XG4iLCJ2YXIgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGlzSXRlcmF0ZWVDYWxsID0gcmVxdWlyZSgnLi9faXNJdGVyYXRlZUNhbGwnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5hc3NpZ25gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25lciBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFzc2lnbmVyIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVBc3NpZ25lcihhc3NpZ25lcikge1xuICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2VzKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoLFxuICAgICAgICBjdXN0b21pemVyID0gbGVuZ3RoID4gMSA/IHNvdXJjZXNbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQsXG4gICAgICAgIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICBjdXN0b21pemVyID0gKGFzc2lnbmVyLmxlbmd0aCA+IDMgJiYgdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJylcbiAgICAgID8gKGxlbmd0aC0tLCBjdXN0b21pemVyKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgICBjdXN0b21pemVyID0gbGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IGN1c3RvbWl6ZXI7XG4gICAgICBsZW5ndGggPSAxO1xuICAgIH1cbiAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICBhc3NpZ25lcihvYmplY3QsIHNvdXJjZSwgaW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0O1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVBc3NpZ25lcjtcbiIsInZhciBjYXN0U2xpY2UgPSByZXF1aXJlKCcuL19jYXN0U2xpY2UnKSxcbiAgICBoYXNVbmljb2RlID0gcmVxdWlyZSgnLi9faGFzVW5pY29kZScpLFxuICAgIHN0cmluZ1RvQXJyYXkgPSByZXF1aXJlKCcuL19zdHJpbmdUb0FycmF5JyksXG4gICAgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ubG93ZXJGaXJzdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgU3RyaW5nYCBjYXNlIG1ldGhvZCB0byB1c2UuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXNlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcblxuICAgIHZhciBzdHJTeW1ib2xzID0gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICA/IHN0cmluZ1RvQXJyYXkoc3RyaW5nKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICB2YXIgY2hyID0gc3RyU3ltYm9sc1xuICAgICAgPyBzdHJTeW1ib2xzWzBdXG4gICAgICA6IHN0cmluZy5jaGFyQXQoMCk7XG5cbiAgICB2YXIgdHJhaWxpbmcgPSBzdHJTeW1ib2xzXG4gICAgICA/IGNhc3RTbGljZShzdHJTeW1ib2xzLCAxKS5qb2luKCcnKVxuICAgICAgOiBzdHJpbmcuc2xpY2UoMSk7XG5cbiAgICByZXR1cm4gY2hyW21ldGhvZE5hbWVdKCkgKyB0cmFpbGluZztcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVDYXNlRmlyc3Q7XG4iLCJ2YXIgYXJyYXlSZWR1Y2UgPSByZXF1aXJlKCcuL19hcnJheVJlZHVjZScpLFxuICAgIGRlYnVyciA9IHJlcXVpcmUoJy4vZGVidXJyJyksXG4gICAgd29yZHMgPSByZXF1aXJlKCcuL3dvcmRzJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc0Fwb3MgPSBcIlsnXFx1MjAxOV1cIjtcblxuLyoqIFVzZWQgdG8gbWF0Y2ggYXBvc3Ryb3BoZXMuICovXG52YXIgcmVBcG9zID0gUmVnRXhwKHJzQXBvcywgJ2cnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5jYW1lbENhc2VgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gY29tYmluZSBlYWNoIHdvcmQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3VuZGVyIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVDb21wb3VuZGVyKGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICByZXR1cm4gYXJyYXlSZWR1Y2Uod29yZHMoZGVidXJyKHN0cmluZykucmVwbGFjZShyZUFwb3MsICcnKSksIGNhbGxiYWNrLCAnJyk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQ29tcG91bmRlcjtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIHZhciBmdW5jID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2RlZmluZVByb3BlcnR5Jyk7XG4gICAgZnVuYyh7fSwgJycsIHt9KTtcbiAgICByZXR1cm4gZnVuYztcbiAgfSBjYXRjaCAoZSkge31cbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lUHJvcGVydHk7XG4iLCIvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZyZWVHbG9iYWw7XG4iLCIvKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRWYWx1ZTtcbiIsInZhciBvdmVyQXJnID0gcmVxdWlyZSgnLi9fb3ZlckFyZycpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBnZXRQcm90b3R5cGUgPSBvdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZiwgT2JqZWN0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRQcm90b3R5cGU7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIHVzaW5nIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvYmplY3RUb1N0cmluZztcbiIsIi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbnZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZSxcbiAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZic7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB3aXRoIFt6ZXJvLXdpZHRoIGpvaW5lcnMgb3IgY29kZSBwb2ludHMgZnJvbSB0aGUgYXN0cmFsIHBsYW5lc10oaHR0cDovL2Vldi5lZS9ibG9nLzIwMTUvMDkvMTIvZGFyay1jb3JuZXJzLW9mLXVuaWNvZGUvKS4gKi9cbnZhciByZUhhc1VuaWNvZGUgPSBSZWdFeHAoJ1snICsgcnNaV0ogKyByc0FzdHJhbFJhbmdlICArIHJzQ29tYm9SYW5nZSArIHJzVmFyUmFuZ2UgKyAnXScpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBVbmljb2RlIHN5bWJvbHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgc3ltYm9sIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc1VuaWNvZGUoc3RyaW5nKSB7XG4gIHJldHVybiByZUhhc1VuaWNvZGUudGVzdChzdHJpbmcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc1VuaWNvZGU7XG4iLCIvKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB0aGF0IG5lZWQgYSBtb3JlIHJvYnVzdCByZWdleHAgdG8gbWF0Y2ggd29yZHMuICovXG52YXIgcmVIYXNVbmljb2RlV29yZCA9IC9bYS16XVtBLVpdfFtBLVpdezJ9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBhIHdvcmQgY29tcG9zZWQgb2YgVW5pY29kZSBzeW1ib2xzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhIHdvcmQgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSB7XG4gIHJldHVybiByZUhhc1VuaWNvZGVXb3JkLnRlc3Qoc3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNVbmljb2RlV29yZDtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLnN0dWJGYWxzZSk7XG4gKiAvLyA9PiBbZmFsc2UsIGZhbHNlXVxuICovXG5mdW5jdGlvbiBzdHViRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViRmFsc2U7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICogLy8gPT4gW2ZhbHNlLCBmYWxzZV1cbiAqL1xuZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R1YkZhbHNlO1xuIiwiLyoqXG4gKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlckFyZztcbiIsInZhciBhcHBseSA9IHJlcXVpcmUoJy4vX2FwcGx5Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCB0cmFuc2Zvcm1zIHRoZSByZXN0IGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSByZXN0IGFycmF5IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyUmVzdChmdW5jLCBzdGFydCwgdHJhbnNmb3JtKSB7XG4gIHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0ID09PSB1bmRlZmluZWQgPyAoZnVuYy5sZW5ndGggLSAxKSA6IHN0YXJ0LCAwKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBzdGFydCwgMCksXG4gICAgICAgIGFycmF5ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhcnJheVtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdO1xuICAgIH1cbiAgICBpbmRleCA9IC0xO1xuICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpO1xuICAgIHdoaWxlICgrK2luZGV4IDwgc3RhcnQpIHtcbiAgICAgIG90aGVyQXJnc1tpbmRleF0gPSBhcmdzW2luZGV4XTtcbiAgICB9XG4gICAgb3RoZXJBcmdzW3N0YXJ0XSA9IHRyYW5zZm9ybShhcnJheSk7XG4gICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlclJlc3Q7XG4iLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJvb3Q7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGl0IHJlY2VpdmVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICpcbiAqIGNvbnNvbGUubG9nKF8uaWRlbnRpdHkob2JqZWN0KSA9PT0gb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlkZW50aXR5O1xuIiwidmFyIGFzY2lpVG9BcnJheSA9IHJlcXVpcmUoJy4vX2FzY2lpVG9BcnJheScpLFxuICAgIGhhc1VuaWNvZGUgPSByZXF1aXJlKCcuL19oYXNVbmljb2RlJyksXG4gICAgdW5pY29kZVRvQXJyYXkgPSByZXF1aXJlKCcuL191bmljb2RlVG9BcnJheScpO1xuXG4vKipcbiAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBzdHJpbmdUb0FycmF5KHN0cmluZykge1xuICByZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgPyB1bmljb2RlVG9BcnJheShzdHJpbmcpXG4gICAgOiBhc2NpaVRvQXJyYXkoc3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmdUb0FycmF5O1xuIiwiLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNoYXJhY3RlciBjbGFzc2VzLiAqL1xudmFyIHJzQXN0cmFsUmFuZ2UgPSAnXFxcXHVkODAwLVxcXFx1ZGZmZicsXG4gICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgcmVDb21ib0hhbGZNYXJrc1JhbmdlID0gJ1xcXFx1ZmUyMC1cXFxcdWZlMmYnLFxuICAgIHJzQ29tYm9TeW1ib2xzUmFuZ2UgPSAnXFxcXHUyMGQwLVxcXFx1MjBmZicsXG4gICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgIHJzVmFyUmFuZ2UgPSAnXFxcXHVmZTBlXFxcXHVmZTBmJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xudmFyIHJzQXN0cmFsID0gJ1snICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc0NvbWJvID0gJ1snICsgcnNDb21ib1JhbmdlICsgJ10nLFxuICAgIHJzRml0eiA9ICdcXFxcdWQ4M2NbXFxcXHVkZmZiLVxcXFx1ZGZmZl0nLFxuICAgIHJzTW9kaWZpZXIgPSAnKD86JyArIHJzQ29tYm8gKyAnfCcgKyByc0ZpdHogKyAnKScsXG4gICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc1JlZ2lvbmFsID0gJyg/OlxcXFx1ZDgzY1tcXFxcdWRkZTYtXFxcXHVkZGZmXSl7Mn0nLFxuICAgIHJzU3VyclBhaXIgPSAnW1xcXFx1ZDgwMC1cXFxcdWRiZmZdW1xcXFx1ZGMwMC1cXFxcdWRmZmZdJyxcbiAgICByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbnZhciByZU9wdE1vZCA9IHJzTW9kaWZpZXIgKyAnPycsXG4gICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICByc09wdEpvaW4gPSAnKD86JyArIHJzWldKICsgJyg/OicgKyBbcnNOb25Bc3RyYWwsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzT3B0VmFyICsgcmVPcHRNb2QgKyAnKSonLFxuICAgIHJzU2VxID0gcnNPcHRWYXIgKyByZU9wdE1vZCArIHJzT3B0Sm9pbixcbiAgICByc1N5bWJvbCA9ICcoPzonICsgW3JzTm9uQXN0cmFsICsgcnNDb21ibyArICc/JywgcnNDb21ibywgcnNSZWdpb25hbCwgcnNTdXJyUGFpciwgcnNBc3RyYWxdLmpvaW4oJ3wnKSArICcpJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggW3N0cmluZyBzeW1ib2xzXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlKS4gKi9cbnZhciByZVVuaWNvZGUgPSBSZWdFeHAocnNGaXR6ICsgJyg/PScgKyByc0ZpdHogKyAnKXwnICsgcnNTeW1ib2wgKyByc1NlcSwgJ2cnKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIFVuaWNvZGUgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIHVuaWNvZGVUb0FycmF5KHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLm1hdGNoKHJlVW5pY29kZSkgfHwgW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdW5pY29kZVRvQXJyYXk7XG4iLCIvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG52YXIgcnNBc3RyYWxSYW5nZSA9ICdcXFxcdWQ4MDAtXFxcXHVkZmZmJyxcbiAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgcnNDb21ib1N5bWJvbHNSYW5nZSA9ICdcXFxcdTIwZDAtXFxcXHUyMGZmJyxcbiAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgcnNEaW5nYmF0UmFuZ2UgPSAnXFxcXHUyNzAwLVxcXFx1MjdiZicsXG4gICAgcnNMb3dlclJhbmdlID0gJ2EtelxcXFx4ZGYtXFxcXHhmNlxcXFx4ZjgtXFxcXHhmZicsXG4gICAgcnNNYXRoT3BSYW5nZSA9ICdcXFxceGFjXFxcXHhiMVxcXFx4ZDdcXFxceGY3JyxcbiAgICByc05vbkNoYXJSYW5nZSA9ICdcXFxceDAwLVxcXFx4MmZcXFxceDNhLVxcXFx4NDBcXFxceDViLVxcXFx4NjBcXFxceDdiLVxcXFx4YmYnLFxuICAgIHJzUHVuY3R1YXRpb25SYW5nZSA9ICdcXFxcdTIwMDAtXFxcXHUyMDZmJyxcbiAgICByc1NwYWNlUmFuZ2UgPSAnIFxcXFx0XFxcXHgwYlxcXFxmXFxcXHhhMFxcXFx1ZmVmZlxcXFxuXFxcXHJcXFxcdTIwMjhcXFxcdTIwMjlcXFxcdTE2ODBcXFxcdTE4MGVcXFxcdTIwMDBcXFxcdTIwMDFcXFxcdTIwMDJcXFxcdTIwMDNcXFxcdTIwMDRcXFxcdTIwMDVcXFxcdTIwMDZcXFxcdTIwMDdcXFxcdTIwMDhcXFxcdTIwMDlcXFxcdTIwMGFcXFxcdTIwMmZcXFxcdTIwNWZcXFxcdTMwMDAnLFxuICAgIHJzVXBwZXJSYW5nZSA9ICdBLVpcXFxceGMwLVxcXFx4ZDZcXFxceGQ4LVxcXFx4ZGUnLFxuICAgIHJzVmFyUmFuZ2UgPSAnXFxcXHVmZTBlXFxcXHVmZTBmJyxcbiAgICByc0JyZWFrUmFuZ2UgPSByc01hdGhPcFJhbmdlICsgcnNOb25DaGFyUmFuZ2UgKyByc1B1bmN0dWF0aW9uUmFuZ2UgKyByc1NwYWNlUmFuZ2U7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc0Fwb3MgPSBcIlsnXFx1MjAxOV1cIixcbiAgICByc0JyZWFrID0gJ1snICsgcnNCcmVha1JhbmdlICsgJ10nLFxuICAgIHJzQ29tYm8gPSAnWycgKyByc0NvbWJvUmFuZ2UgKyAnXScsXG4gICAgcnNEaWdpdHMgPSAnXFxcXGQrJyxcbiAgICByc0RpbmdiYXQgPSAnWycgKyByc0RpbmdiYXRSYW5nZSArICddJyxcbiAgICByc0xvd2VyID0gJ1snICsgcnNMb3dlclJhbmdlICsgJ10nLFxuICAgIHJzTWlzYyA9ICdbXicgKyByc0FzdHJhbFJhbmdlICsgcnNCcmVha1JhbmdlICsgcnNEaWdpdHMgKyByc0RpbmdiYXRSYW5nZSArIHJzTG93ZXJSYW5nZSArIHJzVXBwZXJSYW5nZSArICddJyxcbiAgICByc0ZpdHogPSAnXFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdJyxcbiAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgIHJzTm9uQXN0cmFsID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNSZWdpb25hbCA9ICcoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9JyxcbiAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgcnNVcHBlciA9ICdbJyArIHJzVXBwZXJSYW5nZSArICddJyxcbiAgICByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbnZhciByc01pc2NMb3dlciA9ICcoPzonICsgcnNMb3dlciArICd8JyArIHJzTWlzYyArICcpJyxcbiAgICByc01pc2NVcHBlciA9ICcoPzonICsgcnNVcHBlciArICd8JyArIHJzTWlzYyArICcpJyxcbiAgICByc09wdENvbnRyTG93ZXIgPSAnKD86JyArIHJzQXBvcyArICcoPzpkfGxsfG18cmV8c3x0fHZlKSk/JyxcbiAgICByc09wdENvbnRyVXBwZXIgPSAnKD86JyArIHJzQXBvcyArICcoPzpEfExMfE18UkV8U3xUfFZFKSk/JyxcbiAgICByZU9wdE1vZCA9IHJzTW9kaWZpZXIgKyAnPycsXG4gICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICByc09wdEpvaW4gPSAnKD86JyArIHJzWldKICsgJyg/OicgKyBbcnNOb25Bc3RyYWwsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzT3B0VmFyICsgcmVPcHRNb2QgKyAnKSonLFxuICAgIHJzT3JkTG93ZXIgPSAnXFxcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxcXGR0aCkoPz1cXFxcYnxbQS1aX10pJyxcbiAgICByc09yZFVwcGVyID0gJ1xcXFxkKig/OjFTVHwyTkR8M1JEfCg/IVsxMjNdKVxcXFxkVEgpKD89XFxcXGJ8W2Etel9dKScsXG4gICAgcnNTZXEgPSByc09wdFZhciArIHJlT3B0TW9kICsgcnNPcHRKb2luLFxuICAgIHJzRW1vamkgPSAnKD86JyArIFtyc0RpbmdiYXQsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzU2VxO1xuXG4vKiogVXNlZCB0byBtYXRjaCBjb21wbGV4IG9yIGNvbXBvdW5kIHdvcmRzLiAqL1xudmFyIHJlVW5pY29kZVdvcmQgPSBSZWdFeHAoW1xuICByc1VwcGVyICsgJz8nICsgcnNMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlciArICcoPz0nICsgW3JzQnJlYWssIHJzVXBwZXIsICckJ10uam9pbignfCcpICsgJyknLFxuICByc01pc2NVcHBlciArICcrJyArIHJzT3B0Q29udHJVcHBlciArICcoPz0nICsgW3JzQnJlYWssIHJzVXBwZXIgKyByc01pc2NMb3dlciwgJyQnXS5qb2luKCd8JykgKyAnKScsXG4gIHJzVXBwZXIgKyAnPycgKyByc01pc2NMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlcixcbiAgcnNVcHBlciArICcrJyArIHJzT3B0Q29udHJVcHBlcixcbiAgcnNPcmRVcHBlcixcbiAgcnNPcmRMb3dlcixcbiAgcnNEaWdpdHMsXG4gIHJzRW1vamlcbl0uam9pbignfCcpLCAnZycpO1xuXG4vKipcbiAqIFNwbGl0cyBhIFVuaWNvZGUgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICovXG5mdW5jdGlvbiB1bmljb2RlV29yZHMoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlV29yZCkgfHwgW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdW5pY29kZVdvcmRzO1xuIiwidmFyIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAgY3JlYXRlQXNzaWduZXIgPSByZXF1aXJlKCcuL19jcmVhdGVBc3NpZ25lcicpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgb3duIGFuZFxuICogaW5oZXJpdGVkIHNvdXJjZSBwcm9wZXJ0aWVzLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBhbGlhcyBleHRlbmRcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBzZWUgXy5hc3NpZ25cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIEJhcigpIHtcbiAqICAgdGhpcy5jID0gMztcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmIgPSAyO1xuICogQmFyLnByb3RvdHlwZS5kID0gNDtcbiAqXG4gKiBfLmFzc2lnbkluKHsgJ2EnOiAwIH0sIG5ldyBGb28sIG5ldyBCYXIpO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzLCAnZCc6IDQgfVxuICovXG52YXIgYXNzaWduSW4gPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSkge1xuICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBhc3NpZ25JbjtcbiIsInZhciBjYXBpdGFsaXplID0gcmVxdWlyZSgnLi9jYXBpdGFsaXplJyksXG4gICAgY3JlYXRlQ29tcG91bmRlciA9IHJlcXVpcmUoJy4vX2NyZWF0ZUNvbXBvdW5kZXInKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBbY2FtZWwgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2FtZWxDYXNlKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY2FtZWwgY2FzZWQgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmNhbWVsQ2FzZSgnRm9vIEJhcicpO1xuICogLy8gPT4gJ2Zvb0JhcidcbiAqXG4gKiBfLmNhbWVsQ2FzZSgnLS1mb28tYmFyLS0nKTtcbiAqIC8vID0+ICdmb29CYXInXG4gKlxuICogXy5jYW1lbENhc2UoJ19fRk9PX0JBUl9fJyk7XG4gKiAvLyA9PiAnZm9vQmFyJ1xuICovXG52YXIgY2FtZWxDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gIHdvcmQgPSB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyBjYXBpdGFsaXplKHdvcmQpIDogd29yZCk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBjYW1lbENhc2U7XG4iLCJ2YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyksXG4gICAgdXBwZXJGaXJzdCA9IHJlcXVpcmUoJy4vdXBwZXJGaXJzdCcpO1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AgdG8gdXBwZXIgY2FzZSBhbmQgdGhlIHJlbWFpbmluZ1xuICogdG8gbG93ZXIgY2FzZS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjYXBpdGFsaXplLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY2FwaXRhbGl6ZWQgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmNhcGl0YWxpemUoJ0ZSRUQnKTtcbiAqIC8vID0+ICdGcmVkJ1xuICovXG5mdW5jdGlvbiBjYXBpdGFsaXplKHN0cmluZykge1xuICByZXR1cm4gdXBwZXJGaXJzdCh0b1N0cmluZyhzdHJpbmcpLnRvTG93ZXJDYXNlKCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhcGl0YWxpemU7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgbm93ID0gcmVxdWlyZSgnLi9ub3cnKSxcbiAgICB0b051bWJlciA9IHJlcXVpcmUoJy4vdG9OdW1iZXInKTtcblxuLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4LFxuICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWJvdW5jZWQgZnVuY3Rpb24gdGhhdCBkZWxheXMgaW52b2tpbmcgYGZ1bmNgIHVudGlsIGFmdGVyIGB3YWl0YFxuICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gKiBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYCBtZXRob2QgdG8gY2FuY2VsXG4gKiBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0byBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS5cbiAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICogbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZFxuICogd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbi4gU3Vic2VxdWVudFxuICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAqIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8uZGVib3VuY2VgIGFuZCBgXy50aHJvdHRsZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWJvdW5jZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPWZhbHNlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXYWl0XVxuICogIFRoZSBtYXhpbXVtIHRpbWUgYGZ1bmNgIGlzIGFsbG93ZWQgdG8gYmUgZGVsYXllZCBiZWZvcmUgaXQncyBpbnZva2VkLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBkZWJvdW5jZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGNvc3RseSBjYWxjdWxhdGlvbnMgd2hpbGUgdGhlIHdpbmRvdyBzaXplIGlzIGluIGZsdXguXG4gKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICpcbiAqIC8vIEludm9rZSBgc2VuZE1haWxgIHdoZW4gY2xpY2tlZCwgZGVib3VuY2luZyBzdWJzZXF1ZW50IGNhbGxzLlxuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICogICAnbGVhZGluZyc6IHRydWUsXG4gKiAgICd0cmFpbGluZyc6IGZhbHNlXG4gKiB9KSk7XG4gKlxuICogLy8gRW5zdXJlIGBiYXRjaExvZ2AgaXMgaW52b2tlZCBvbmNlIGFmdGVyIDEgc2Vjb25kIG9mIGRlYm91bmNlZCBjYWxscy5cbiAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICogdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL3N0cmVhbScpO1xuICogalF1ZXJ5KHNvdXJjZSkub24oJ21lc3NhZ2UnLCBkZWJvdW5jZWQpO1xuICpcbiAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgZGVib3VuY2VkIGludm9jYXRpb24uXG4gKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCBkZWJvdW5jZWQuY2FuY2VsKTtcbiAqL1xuZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICB2YXIgbGFzdEFyZ3MsXG4gICAgICBsYXN0VGhpcyxcbiAgICAgIG1heFdhaXQsXG4gICAgICByZXN1bHQsXG4gICAgICB0aW1lcklkLFxuICAgICAgbGFzdENhbGxUaW1lLFxuICAgICAgbGFzdEludm9rZVRpbWUgPSAwLFxuICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgbWF4aW5nID0gZmFsc2UsXG4gICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAhIW9wdGlvbnMubGVhZGluZztcbiAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0O1xuICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHtcbiAgICB2YXIgYXJncyA9IGxhc3RBcmdzLFxuICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci5cbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIC8vIEludm9rZSB0aGUgbGVhZGluZyBlZGdlLlxuICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsXG4gICAgICAgIHRpbWVXYWl0aW5nID0gd2FpdCAtIHRpbWVTaW5jZUxhc3RDYWxsO1xuXG4gICAgcmV0dXJuIG1heGluZ1xuICAgICAgPyBuYXRpdmVNaW4odGltZVdhaXRpbmcsIG1heFdhaXQgLSB0aW1lU2luY2VMYXN0SW52b2tlKVxuICAgICAgOiB0aW1lV2FpdGluZztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3VsZEludm9rZSh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuICAgIC8vIEVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCBhY3Rpdml0eSBoYXMgc3RvcHBlZCBhbmQgd2UncmUgYXQgdGhlXG4gICAgLy8gdHJhaWxpbmcgZWRnZSwgdGhlIHN5c3RlbSB0aW1lIGhhcyBnb25lIGJhY2t3YXJkcyBhbmQgd2UncmUgdHJlYXRpbmdcbiAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG4gICAgcmV0dXJuIChsYXN0Q2FsbFRpbWUgPT09IHVuZGVmaW5lZCB8fCAodGltZVNpbmNlTGFzdENhbGwgPj0gd2FpdCkgfHxcbiAgICAgICh0aW1lU2luY2VMYXN0Q2FsbCA8IDApIHx8IChtYXhpbmcgJiYgdGltZVNpbmNlTGFzdEludm9rZSA+PSBtYXhXYWl0KSk7XG4gIH1cblxuICBmdW5jdGlvbiB0aW1lckV4cGlyZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKTtcbiAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG4gICAgICByZXR1cm4gdHJhaWxpbmdFZGdlKHRpbWUpO1xuICAgIH1cbiAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHJlbWFpbmluZ1dhaXQodGltZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcbiAgICB0aW1lcklkID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gT25seSBpbnZva2UgaWYgd2UgaGF2ZSBgbGFzdEFyZ3NgIHdoaWNoIG1lYW5zIGBmdW5jYCBoYXMgYmVlblxuICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuICAgIGlmICh0cmFpbGluZyAmJiBsYXN0QXJncykge1xuICAgICAgcmV0dXJuIGludm9rZUZ1bmModGltZSk7XG4gICAgfVxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICBpZiAodGltZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgfVxuICAgIGxhc3RJbnZva2VUaW1lID0gMDtcbiAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93KCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVib3VuY2VkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCksXG4gICAgICAgIGlzSW52b2tpbmcgPSBzaG91bGRJbnZva2UodGltZSk7XG5cbiAgICBsYXN0QXJncyA9IGFyZ3VtZW50cztcbiAgICBsYXN0VGhpcyA9IHRoaXM7XG4gICAgbGFzdENhbGxUaW1lID0gdGltZTtcblxuICAgIGlmIChpc0ludm9raW5nKSB7XG4gICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBsZWFkaW5nRWRnZShsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgICAgaWYgKG1heGluZykge1xuICAgICAgICAvLyBIYW5kbGUgaW52b2NhdGlvbnMgaW4gYSB0aWdodCBsb29wLlxuICAgICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgIHJldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7XG4gIHJldHVybiBkZWJvdW5jZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVib3VuY2U7XG4iLCJ2YXIgYmFzZVRvU3RyaW5nID0gcmVxdWlyZSgnLi9fYmFzZVRvU3RyaW5nJyk7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZy4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGZvciBgbnVsbGBcbiAqIGFuZCBgdW5kZWZpbmVkYCB2YWx1ZXMuIFRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b1N0cmluZyhudWxsKTtcbiAqIC8vID0+ICcnXG4gKlxuICogXy50b1N0cmluZygtMCk7XG4gKiAvLyA9PiAnLTAnXG4gKlxuICogXy50b1N0cmluZyhbMSwgMiwgM10pO1xuICogLy8gPT4gJzEsMiwzJ1xuICovXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogYmFzZVRvU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1N0cmluZztcbiIsIi8qKlxuICogUGVyZm9ybXMgYVxuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAqXG4gKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKCdhJywgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKE5hTiwgTmFOKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gZXEodmFsdWUsIG90aGVyKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgKHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Fzc2lnbkluJyk7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGl0IHJlY2VpdmVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICpcbiAqIGNvbnNvbGUubG9nKF8uaWRlbnRpdHkob2JqZWN0KSA9PT0gb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlkZW50aXR5O1xuIiwidmFyIGJhc2VJbmRleE9mID0gcmVxdWlyZSgnLi9fYmFzZUluZGV4T2YnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5jbHVkZXNgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogc3BlY2lmeWluZyBhbiBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksIHZhbHVlKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgMCkgPiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUluY2x1ZGVzO1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEzLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRpbWVzKDIsIF8uc3R1YkZhbHNlKTtcbiAqIC8vID0+IFtmYWxzZSwgZmFsc2VdXG4gKi9cbmZ1bmN0aW9uIHN0dWJGYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0dWJGYWxzZTtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXk7XG4iLCJ2YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5TGlrZTtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLnN0dWJGYWxzZSk7XG4gKiAvLyA9PiBbZmFsc2UsIGZhbHNlXVxuICovXG5mdW5jdGlvbiBzdHViRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViRmFsc2U7XG4iLCJ2YXIgYmFzZUtleXMgPSByZXF1aXJlKCcuL19iYXNlS2V5cycpLFxuICAgIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGVtcHR5IG9iamVjdCwgY29sbGVjdGlvbiwgbWFwLCBvciBzZXQuXG4gKlxuICogT2JqZWN0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgbm8gb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkXG4gKiBwcm9wZXJ0aWVzLlxuICpcbiAqIEFycmF5LWxpa2UgdmFsdWVzIHN1Y2ggYXMgYGFyZ3VtZW50c2Agb2JqZWN0cywgYXJyYXlzLCBidWZmZXJzLCBzdHJpbmdzLCBvclxuICogalF1ZXJ5LWxpa2UgY29sbGVjdGlvbnMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYGxlbmd0aGAgb2YgYDBgLlxuICogU2ltaWxhcmx5LCBtYXBzIGFuZCBzZXRzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBhIGBzaXplYCBvZiBgMGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZW1wdHksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0VtcHR5KG51bGwpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNFbXB0eSh0cnVlKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRW1wdHkoMSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0VtcHR5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNFbXB0eSh7ICdhJzogMSB9KTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaXNBcnJheUxpa2UodmFsdWUpICYmXG4gICAgICAoaXNBcnJheSh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZS5zcGxpY2UgPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICBpc0J1ZmZlcih2YWx1ZSkgfHwgaXNUeXBlZEFycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkpKSB7XG4gICAgcmV0dXJuICF2YWx1ZS5sZW5ndGg7XG4gIH1cbiAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSk7XG4gIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICByZXR1cm4gIXZhbHVlLnNpemU7XG4gIH1cbiAgaWYgKGlzUHJvdG90eXBlKHZhbHVlKSkge1xuICAgIHJldHVybiAhYmFzZUtleXModmFsdWUpLmxlbmd0aDtcbiAgfVxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0VtcHR5O1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhc3luY1RhZyA9ICdbb2JqZWN0IEFzeW5jRnVuY3Rpb25dJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHByb3h5VGFnID0gJ1tvYmplY3QgUHJveHldJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oXyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gIC8vIGluIFNhZmFyaSA5IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5cyBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnIHx8IHRhZyA9PSBhc3luY1RhZyB8fCB0YWcgPT0gcHJveHlUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGdW5jdGlvbjtcbiIsIi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBsZW5ndGguXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0xlbmd0aCgzKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aCgnMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJlxuICAgIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0xlbmd0aDtcbiIsInZhciBpc051bWJlciA9IHJlcXVpcmUoJy4vaXNOdW1iZXInKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgTmFOYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAqIFtgTnVtYmVyLmlzTmFOYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzTmFOKSBhbmQgaXMgbm90IHRoZSBzYW1lIGFzXG4gKiBnbG9iYWwgW2Bpc05hTmBdKGh0dHBzOi8vbWRuLmlvL2lzTmFOKSB3aGljaCByZXR1cm5zIGB0cnVlYCBmb3JcbiAqIGB1bmRlZmluZWRgIGFuZCBvdGhlciBub24tbnVtYmVyIHZhbHVlcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTmFOKE5hTik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc05hTihuZXcgTnVtYmVyKE5hTikpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIGlzTmFOKHVuZGVmaW5lZCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc05hTih1bmRlZmluZWQpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOYU4odmFsdWUpIHtcbiAgLy8gQW4gYE5hTmAgcHJpbWl0aXZlIGlzIHRoZSBvbmx5IHZhbHVlIHRoYXQgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi5cbiAgLy8gUGVyZm9ybSB0aGUgYHRvU3RyaW5nVGFnYCBjaGVjayBmaXJzdCB0byBhdm9pZCBlcnJvcnMgd2l0aCBzb21lXG4gIC8vIEFjdGl2ZVggb2JqZWN0cyBpbiBJRS5cbiAgcmV0dXJuIGlzTnVtYmVyKHZhbHVlKSAmJiB2YWx1ZSAhPSArdmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNOYU47XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBOdW1iZXJgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogKipOb3RlOioqIFRvIGV4Y2x1ZGUgYEluZmluaXR5YCwgYC1JbmZpbml0eWAsIGFuZCBgTmFOYCwgd2hpY2ggYXJlXG4gKiBjbGFzc2lmaWVkIGFzIG51bWJlcnMsIHVzZSB0aGUgYF8uaXNGaW5pdGVgIG1ldGhvZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG51bWJlciwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTnVtYmVyKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNOdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcignMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IG51bWJlclRhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNOdW1iZXI7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0TGlrZTtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGdldFByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2dldFByb3RvdHlwZScpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBVc2VkIHRvIGluZmVyIHRoZSBgT2JqZWN0YCBjb25zdHJ1Y3Rvci4gKi9cbnZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgdGhhdCBpcywgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlXG4gKiBgT2JqZWN0YCBjb25zdHJ1Y3RvciBvciBvbmUgd2l0aCBhIGBbW1Byb3RvdHlwZV1dYCBvZiBgbnVsbGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjguMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogfVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChuZXcgRm9vKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgfHwgYmFzZUdldFRhZyh2YWx1ZSkgIT0gb2JqZWN0VGFnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwcm90byA9IGdldFByb3RvdHlwZSh2YWx1ZSk7XG4gIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gIHJldHVybiB0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmXG4gICAgZnVuY1RvU3RyaW5nLmNhbGwoQ3RvcikgPT0gb2JqZWN0Q3RvclN0cmluZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1BsYWluT2JqZWN0O1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEzLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRpbWVzKDIsIF8uc3R1YkZhbHNlKTtcbiAqIC8vID0+IFtmYWxzZSwgZmFsc2VdXG4gKi9cbmZ1bmN0aW9uIHN0dWJGYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0dWJGYWxzZTtcbiIsIi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlXG4gKiBbYE9iamVjdC5rZXlzYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gKiBleGNlcHQgdGhhdCBpdCBpbmNsdWRlcyBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBuYXRpdmVLZXlzSW4ob2JqZWN0KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgaWYgKG9iamVjdCAhPSBudWxsKSB7XG4gICAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUtleXNJbjtcbiIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKipcbiAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IERhdGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICogfSwgXy5ub3coKSk7XG4gKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICovXG52YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiByb290LkRhdGUubm93KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5vdztcbiIsInZhciBkZWJvdW5jZSA9IHJlcXVpcmUoJy4vZGVib3VuY2UnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGZ1bmN0aW9uIHRoYXQgb25seSBpbnZva2VzIGBmdW5jYCBhdCBtb3N0IG9uY2UgcGVyXG4gKiBldmVyeSBgd2FpdGAgbWlsbGlzZWNvbmRzLiBUaGUgdGhyb3R0bGVkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYFxuICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0b1xuICogaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgXG4gKiBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGUgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgXG4gKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlXG4gKiB0aHJvdHRsZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBmdW5jdGlvbiByZXR1cm4gdGhlXG4gKiByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aHJvdHRsZSBpbnZvY2F0aW9ucyB0by5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB0aHJvdHRsZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGV4Y2Vzc2l2ZWx5IHVwZGF0aW5nIHRoZSBwb3NpdGlvbiB3aGlsZSBzY3JvbGxpbmcuXG4gKiBqUXVlcnkod2luZG93KS5vbignc2Nyb2xsJywgXy50aHJvdHRsZSh1cGRhdGVQb3NpdGlvbiwgMTAwKSk7XG4gKlxuICogLy8gSW52b2tlIGByZW5ld1Rva2VuYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgYnV0IG5vdCBtb3JlIHRoYW4gb25jZSBldmVyeSA1IG1pbnV0ZXMuXG4gKiB2YXIgdGhyb3R0bGVkID0gXy50aHJvdHRsZShyZW5ld1Rva2VuLCAzMDAwMDAsIHsgJ3RyYWlsaW5nJzogZmFsc2UgfSk7XG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIHRocm90dGxlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG4gIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7XG4gICAgJ2xlYWRpbmcnOiBsZWFkaW5nLFxuICAgICdtYXhXYWl0Jzogd2FpdCxcbiAgICAndHJhaWxpbmcnOiB0cmFpbGluZ1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0aHJvdHRsZTtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKlxuICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaWRlbnRpdHk7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGl0IHJlY2VpdmVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICpcbiAqIGNvbnNvbGUubG9nKF8uaWRlbnRpdHkob2JqZWN0KSA9PT0gb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlkZW50aXR5O1xuIiwidmFyIGNyZWF0ZUNhc2VGaXJzdCA9IHJlcXVpcmUoJy4vX2NyZWF0ZUNhc2VGaXJzdCcpO1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AgdG8gdXBwZXIgY2FzZS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy51cHBlckZpcnN0KCdmcmVkJyk7XG4gKiAvLyA9PiAnRnJlZCdcbiAqXG4gKiBfLnVwcGVyRmlyc3QoJ0ZSRUQnKTtcbiAqIC8vID0+ICdGUkVEJ1xuICovXG52YXIgdXBwZXJGaXJzdCA9IGNyZWF0ZUNhc2VGaXJzdCgndG9VcHBlckNhc2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB1cHBlckZpcnN0O1xuIiwidmFyIGFzY2lpV29yZHMgPSByZXF1aXJlKCcuL19hc2NpaVdvcmRzJyksXG4gICAgaGFzVW5pY29kZVdvcmQgPSByZXF1aXJlKCcuL19oYXNVbmljb2RlV29yZCcpLFxuICAgIHRvU3RyaW5nID0gcmVxdWlyZSgnLi90b1N0cmluZycpLFxuICAgIHVuaWNvZGVXb3JkcyA9IHJlcXVpcmUoJy4vX3VuaWNvZGVXb3JkcycpO1xuXG4vKipcbiAqIFNwbGl0cyBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBbcGF0dGVybl0gVGhlIHBhdHRlcm4gdG8gbWF0Y2ggd29yZHMuXG4gKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcyddXG4gKlxuICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnLCAvW14sIF0rL2cpO1xuICogLy8gPT4gWydmcmVkJywgJ2Jhcm5leScsICcmJywgJ3BlYmJsZXMnXVxuICovXG5mdW5jdGlvbiB3b3JkcyhzdHJpbmcsIHBhdHRlcm4sIGd1YXJkKSB7XG4gIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gIHBhdHRlcm4gPSBndWFyZCA/IHVuZGVmaW5lZCA6IHBhdHRlcm47XG5cbiAgaWYgKHBhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBoYXNVbmljb2RlV29yZChzdHJpbmcpID8gdW5pY29kZVdvcmRzKHN0cmluZykgOiBhc2NpaVdvcmRzKHN0cmluZyk7XG4gIH1cbiAgcmV0dXJuIHN0cmluZy5tYXRjaChwYXR0ZXJuKSB8fCBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3b3JkcztcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vYWJzJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGguYWJzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9mbG9vcicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBNYXRoLmZsb29yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9pc05hTicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gaXNOYU4oYSkge1xuXHRyZXR1cm4gYSAhPT0gYTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL21heCcpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBNYXRoLm1heDtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vbWluJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgubWluO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9wb3cnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gTWF0aC5wb3c7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3JvdW5kJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgucm91bmQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciAkaXNOYU4gPSByZXF1aXJlKCcuL2lzTmFOJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3NpZ24nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2lnbihudW1iZXIpIHtcblx0aWYgKCRpc05hTihudW1iZXIpIHx8IG51bWJlciA9PT0gMCkge1xuXHRcdHJldHVybiBudW1iZXI7XG5cdH1cblx0cmV0dXJuIG51bWJlciA8IDAgPyAtMSA6ICsxO1xufTtcbiIsIihmdW5jdGlvbihyb290KXtcInVzZSBzdHJpY3RcIjt2YXIgY3NzPVwiLm5hbm9iYXJ7d2lkdGg6MTAwJTtoZWlnaHQ6NHB4O3otaW5kZXg6OTk5OTt0b3A6MH0uYmFye3dpZHRoOjA7aGVpZ2h0OjEwMCU7dHJhbnNpdGlvbjpoZWlnaHQgLjNzO2JhY2tncm91bmQ6IzAwMH1cIjtmdW5jdGlvbiBhZGRDc3MoKXt2YXIgcz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm5hbm9iYXJjc3NcIik7aWYocz09PW51bGwpe3M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO3MudHlwZT1cInRleHQvY3NzXCI7cy5pZD1cIm5hbm9iYXJjc3NcIjtkb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShzLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk7aWYoIXMuc3R5bGVTaGVldClyZXR1cm4gcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtzLnN0eWxlU2hlZXQuY3NzVGV4dD1jc3N9fWZ1bmN0aW9uIGFkZENsYXNzKGVsLGNscyl7aWYoZWwuY2xhc3NMaXN0KWVsLmNsYXNzTGlzdC5hZGQoY2xzKTtlbHNlIGVsLmNsYXNzTmFtZSs9XCIgXCIrY2xzfWZ1bmN0aW9uIGNyZWF0ZUJhcihybSl7dmFyIGVsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksd2lkdGg9MCxoZXJlPTAsb249MCxiYXI9e2VsOmVsLGdvOmdvfTthZGRDbGFzcyhlbCxcImJhclwiKTtmdW5jdGlvbiBtb3ZlKCl7dmFyIGRpc3Q9d2lkdGgtaGVyZTtpZihkaXN0PC4xJiZkaXN0Pi0uMSl7cGxhY2UoaGVyZSk7b249MDtpZih3aWR0aD09PTEwMCl7ZWwuc3R5bGUuaGVpZ2h0PTA7c2V0VGltZW91dChmdW5jdGlvbigpe3JtKGVsKX0sMzAwKX19ZWxzZXtwbGFjZSh3aWR0aC1kaXN0LzQpO3NldFRpbWVvdXQoZ28sMTYpfX1mdW5jdGlvbiBwbGFjZShudW0pe3dpZHRoPW51bTtlbC5zdHlsZS53aWR0aD13aWR0aCtcIiVcIn1mdW5jdGlvbiBnbyhudW0pe2lmKG51bT49MCl7aGVyZT1udW07aWYoIW9uKXtvbj0xO21vdmUoKX19ZWxzZSBpZihvbil7bW92ZSgpfX1yZXR1cm4gYmFyfWZ1bmN0aW9uIE5hbm9iYXIob3B0cyl7b3B0cz1vcHRzfHx7fTt2YXIgZWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxhcHBseUdvLG5hbm9iYXI9e2VsOmVsLGdvOmZ1bmN0aW9uKHApe2FwcGx5R28ocCk7aWYocD09PTEwMCl7aW5pdCgpfX19O2Z1bmN0aW9uIHJtKGNoaWxkKXtlbC5yZW1vdmVDaGlsZChjaGlsZCl9ZnVuY3Rpb24gaW5pdCgpe3ZhciBiYXI9Y3JlYXRlQmFyKHJtKTtlbC5hcHBlbmRDaGlsZChiYXIuZWwpO2FwcGx5R289YmFyLmdvfWFkZENzcygpO2FkZENsYXNzKGVsLFwibmFub2JhclwiKTtpZihvcHRzLmlkKWVsLmlkPW9wdHMuaWQ7aWYob3B0cy5jbGFzc25hbWUpYWRkQ2xhc3MoZWwsb3B0cy5jbGFzc25hbWUpO2lmKG9wdHMudGFyZ2V0KXtlbC5zdHlsZS5wb3NpdGlvbj1cInJlbGF0aXZlXCI7b3B0cy50YXJnZXQuaW5zZXJ0QmVmb3JlKGVsLG9wdHMudGFyZ2V0LmZpcnN0Q2hpbGQpfWVsc2V7ZWwuc3R5bGUucG9zaXRpb249XCJmaXhlZFwiO2RvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKVswXS5hcHBlbmRDaGlsZChlbCl9aW5pdCgpO3JldHVybiBuYW5vYmFyfWlmKHR5cGVvZiBleHBvcnRzPT09XCJvYmplY3RcIil7bW9kdWxlLmV4cG9ydHM9TmFub2Jhcn1lbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT1cImZ1bmN0aW9uXCImJmRlZmluZS5hbWQpe2RlZmluZShbXSxmdW5jdGlvbigpe3JldHVybiBOYW5vYmFyfSl9ZWxzZXtyb290Lk5hbm9iYXI9TmFub2Jhcn19KSh0aGlzKTsiLCJcbi8qKlxuICpcbiAqXG4gKiBub2Qgdi4yLjAuMTJcbiAqIEdvcm0gQ2FzcGVyXG4gKlxuICpcbiAqXG4gKiBUaGlzIGlzIGEgc2hvcnQgYnJlYWtkb3duIG9mIHRoZSBjb2RlIHRvIGhlbHAgeW91IGZpbmQgeW91ciB3YXkgYXJvdW5kLlxuICpcbiAqXG4gKiBBbiBgZWxlbWVudGAgYWx3YXlzIHJlZmVyIHRvIHNvbWUgaW5wdXQgZWxlbWVudCBkZWZpbmVkIGJ5IHRoZSB1c2VyIHZpYSB0aGVcbiAqIGBzZWxlY3RvcmAga2V5LlxuICpcbiAqIEEgYG1ldHJpY2AgaXMgdGhlIHVzZXIgY3JlYXRlZCBvYmplY3RzIHRoYXQgaXMgdXNlZCB0byBhZGQgY2hlY2tzIHRvXG4gKiBub2QuXG4gKlxuICogRWFjaCBgZWxlbWVudGAgd2lsbCBoYXZlIGF0IG1vc3Qgb25lIG9mIGEgYGxpc3RlbmVyYCwgYSBgY2hlY2tlcmAsIGFcbiAqIGBjaGVja0hhbmRsZXJgLCBhbmQgYSBgZG9tTm9kZWAgXCJhdHRhY2hlZFwiIHRvIGl0LiBUaGUgYGxpc3RlbmVyYCBsaXN0ZW5zXG4gKiBmb3IgaW5wdXRzIG9yIGNoYW5nZXMgdG8gdGhlIGBlbGVtZW50YCBhbmQgcGFzc2VzIHRoZSBuZXcgdmFsdWUgb24gdG8gdG8gdGhlXG4gKiBgY2hlY2tlcmAgd2hpY2ggcGVyZm9ybXMgaXRzIGNoZWNrcyBhbmQgcGFzc2VzIHRoZSB0aGUgcmVzdWx0cyBvbiB0byB0aGVcbiAqIGBjaGVja0hhbmRsZXJgIHdoaWNoIGNhbGN1bGF0ZXMgdGhlIG5ldyBzdGF0ZSBvZiB0aGUgYGVsZW1lbnRgIHdoaWNoIGl0XG4gKiBwYXNzZXMgb24gdG8gdGhlIGBkb21Ob2RlYCB3aGljaCB3aWxsIHVwZGF0ZSB0aGUgZG9tLlxuICpcbiAqIFRoZSBmb3VyIG1haW4gcGFydHMsIHRoZSBsaXN0ZW5lciwgdGhlIGNoZWNrZXIsIHRoZSBjaGVja0hhbmRsZXIsIGFuZCB0aGVcbiAqIGRvbU5vZGUgYWxsIGNvbW11bmljYXRlIHRocm91Z2ggdGhlIGBtZWRpYXRvcmAgYnkgZmlyaW5nIGV2ZW50cyBpZGVudGlmaWVkXG4gKiBieSBhIHVuaXF1ZSBpZC4gVGhleSBkbyBub3Qga25vdyBvZiBlYWNoIG90aGVyJ3MgZXhpc3RhbmNlLCBhbmQgc28gbm9cbiAqIGNvbW11bmljYXRpb24gZmxvd3MgZGlyZWN0bHkgYmV0d2VlbiB0aGVtLlxuICpcbiAqIEFsbCBsaXN0ZW5lcnMsIGNoZWNrZXJzLCBoYW5kbGVycywgYW5kIGRvbU5vZGVzIGFyZSBncm91cGVkIHRvZ2V0aGVyIGluXG4gKiBgY29sbGVjdGlvbnNgLCB3aGljaCBhcmUgYmFzaWNhbGx5IGEgZ2xvcmlmaWVkIGFycmF5IHRoYXQgbWFrZXMgaXQgZWFzeVxuICogbm90IHRvIGdldCBkdXBsaWNhdGUgaXRlbXMgZm9yIGVhY2ggZWxlbWVudCAoZm9yIGluc3RhbmNlIHR3byBsaXN0ZW5lcnNcbiAqIGxpc3RlbmluZyB0byB0aGUgc2FtZSBlbGVtZW50KS5cbiAqXG4gKiBUaGUgY29tbXVuaWNhdGlvbiBmbG93IGxvb2tzIGxpa2UgdGhpczpcbiAqIGxpc3RlbmVyIC0+IGNoZWNrZXIgLT4gY2hlY2tIYW5kbGVyIC0+IGRvbU5vZGVcbiAqXG4gKiBCZXR3ZWVuIGVhY2ggcGFydCwgeW91IGhhdmUgdGhlIG1lZGlhdG9yLlxuICpcbiAqXG4gKiBgTWV0cmljc2AgYXJlIGFkZGVkIGJ5IHRoZSB1c2VyLCB3aGljaCBzZXRzIHVwIHRoZSBzeXN0ZW0gYWJvdmUuIE5vdGljZVxuICogdGhhdCBhIG1ldHJpYyBjYW4gdGFyZ2V0IG11bHRpcGxlIGVsZW1lbnRzIGF0IG9uY2UsIGFuZCB0aGF0IHRoZXJlIGNhblxuICogYmUgb3ZlcmxhcHMuIE9uZSBtZXRyaWMgZGVmaW5pdGVseSBkb2VzIG5vdCBlcXVhbCBvbmUgZWxlbWVudCBvciBvbmVcbiAqIGNoZWNrLlxuICpcbiAqL1xuXG5mdW5jdGlvbiBub2QgKGNvbmZpZykge1xuICAgIHZhciBmb3JtLFxuICAgICAgICBjb25maWd1cmF0aW9uICAgPSB7fSxcbiAgICAgICAgbWVkaWF0b3IgICAgICAgID0gbm9kLm1ha2VNZWRpYXRvcigpLFxuICAgICAgICBldmVudEVtaXR0ZXIgICAgPSBub2QubWFrZUV2ZW50RW1pdHRlcihtZWRpYXRvciksXG5cbiAgICAgICAgLy8gQ3JlYXRpbmcgKGVtcHR5KSBjb2xsZWN0aW9uc1xuICAgICAgICBsaXN0ZW5lcnMgICAgICAgPSBub2QubWFrZUNvbGxlY3Rpb24obm9kLm1ha2VMaXN0ZW5lciksXG4gICAgICAgIGNoZWNrZXJzICAgICAgICA9IG5vZC5tYWtlQ29sbGVjdGlvbihub2QubWFrZUNoZWNrZXIpLFxuICAgICAgICBjaGVja0hhbmRsZXJzICAgPSBub2QubWFrZUNvbGxlY3Rpb24obm9kLm1ha2VDaGVja0hhbmRsZXIpLFxuICAgICAgICBkb21Ob2RlcyAgICAgICAgPSBub2QubWFrZUNvbGxlY3Rpb24obm9kLm1ha2VEb21Ob2RlKTtcblxuICAgIC8qKlxuICAgICAqIEVudHJ5IHBvaW50IGZvciB0aGUgdXNlci4gVGhlIHVzZXIgcGFzc2VzIGluIGFuIGFycmF5IG9mIG1ldHJpY3MgKGFuXG4gICAgICogb2JqZWN0IGNvbnRhaW5pbmcgYSBzZWxlY3RvciwgYSB2YWxpZGF0ZSBzdHJpbmcvZnVuY3Rpb24sIGV0Yy4pIGFuZCBpdFxuICAgICAqIGdldHMgcHJvY2Vzc2VkIGZyb20gaGVyZS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24sIGlzIG1vc3RseSBhYm91dCBjbGVhbmluZyB1cCB3aGF0IHRoZSB1c2VyIHBhc3NlZCB1cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhZGRNZXRyaWNzIChtZXRyaWNzKSB7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgZGVhbGluZyB3aXRoIGFuIGFycmF5IG9mIG1ldHJpY3MuXG4gICAgICAgIHZhciBhcnJheU1ldHJpY3MgPSBBcnJheS5pc0FycmF5KG1ldHJpY3MpID8gbWV0cmljcyA6IFttZXRyaWNzXTtcblxuICAgICAgICBhcnJheU1ldHJpY3MuZm9yRWFjaChmdW5jdGlvbiAobWV0cmljKSB7XG4gICAgICAgICAgICB2YXIgdmFsaWRhdGVBcnJheSwgZXJyb3JNZXNzYWdlQXJyYXksXG4gICAgICAgICAgICAgICAgbm90QXJyYXkgPSAhQXJyYXkuaXNBcnJheShtZXRyaWMudmFsaWRhdGUpO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgJ3ZhbGlkYXRlJyBpcyBub3QgYW4gYXJyYXksIHRoZW4gd2UncmUgZ29vZCB0byBnby5cbiAgICAgICAgICAgIGlmIChub3RBcnJheSkge1xuICAgICAgICAgICAgICAgIGFkZE1ldHJpYyhtZXRyaWMpO1xuXG4gICAgICAgICAgICAvLyBJZiBpdCBpcyBhbiBhcnJheSAoZS5nLiwgdmFsaWRhdGU6IFsnZW1haWwnLCAnbWF4LWxlbmd0aDoxMCddKSxcbiAgICAgICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBzcGxpdCB0aGVtIHVwIGludG8gbXVsdGlwbGUgbWV0cmljcywgYW5kIGFkZFxuICAgICAgICAgICAgLy8gdGhlbSBpbmRpdmlkdWFsbHkuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShtZXRyaWMuZXJyb3JNZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3JNc2cgPSAnSWYgeW91IHBhc3MgaW4gYHZhbGlkYXRlOi4uLmAgYXMgYW4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnIGFycmF5LCB0aGVuIGBlcnJvck1lc3NhZ2U6Li4uYCBhbHNvIG5lZWRzIHRvIGJlIGFuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyBhcnJheS4gXCInICsgbWV0cmljLnZhbGlkYXRlICsgJ1wiLCBhbmQgXCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpYy5lcnJvck1lc3NhZ2UgKyAnXCInO1xuXG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGVycm9yTXNnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBXZSBzdG9yZSBlYWNoIGFzIGFycmF5cywgYW5kIHRoZW4gcnVuIHRocm91Z2ggdGhlbSxcbiAgICAgICAgICAgICAgICAvLyBvdmVyd3JpdGluZyBlYWNoIG9mIHRoZSBrZXlzIGFjY29yZGluZ2x5LlxuICAgICAgICAgICAgICAgIHZhbGlkYXRlQXJyYXkgICAgID0gbWV0cmljLnZhbGlkYXRlO1xuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZUFycmF5ID0gbWV0cmljLmVycm9yTWVzc2FnZTtcblxuICAgICAgICAgICAgICAgIHZhbGlkYXRlQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAodmFsaWRhdGUsIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gT3ZlcndyaXRlIHRoZSBhcnJheSB3aXRoIHRoZSBpbmRpdmlkdWFsICd2YWxpZGF0ZScgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vICdlcnJvck1lc3NhZ2UnLlxuICAgICAgICAgICAgICAgICAgICBtZXRyaWMudmFsaWRhdGUgICAgID0gdmFsaWRhdGU7XG4gICAgICAgICAgICAgICAgICAgIG1ldHJpYy5lcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2VBcnJheVtpXTtcblxuICAgICAgICAgICAgICAgICAgICBhZGRNZXRyaWMobWV0cmljKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkTWV0cmljIChtZXRyaWMpIHtcbiAgICAgICAgdmFyIHNwZWNpYWxUcmlnZ2VycyA9IFtdLFxuXG4gICAgICAgICAgICAvLyBUaGUgZnVuY3Rpb24gdGhhdCB3aWxsIGNoZWNrIHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudC5cbiAgICAgICAgICAgIGNoZWNrRnVuY3Rpb24gPSBub2QuZ2V0Q2hlY2tGdW5jdGlvbihtZXRyaWMpLFxuXG4gICAgICAgICAgICAvLyBBIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCB0aGlzIG1ldHJpYyB3aWxsIHRhcmdldC5cbiAgICAgICAgICAgIGVsZW1lbnRzID0gbm9kLmdldEVsZW1lbnRzKG1ldHJpYy5zZWxlY3RvciksXG5cbiAgICAgICAgICAgIC8vIEEgXCJzZXRcIiBoZXJlLCByZWZlcnMgdG8gYW4gb2JqIHdpdGggb25lIGxpc3RlbmVyLCBvbmUgY2hlY2tlcixcbiAgICAgICAgICAgIC8vIGFuZCBvbmUgY2hlY2tIYW5kbGVyLiBPbmx5IGV2ZXJ5IG9uZSBmb3IgZWFjaCBlbGVtZW50IGluIHRoZVxuICAgICAgICAgICAgLy8gZG9tLlxuICAgICAgICAgICAgbWV0cmljU2V0cyA9IGVsZW1lbnRzLm1hcChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyOiAgICAgICBsaXN0ZW5lcnMuZmluZE9yTWFrZShlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWF0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWMudHJpZ2dlckV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24pLFxuICAgICAgICAgICAgICAgICAgICBjaGVja2VyOiAgICAgICAgY2hlY2tlcnMuZmluZE9yTWFrZShlbGVtZW50LCBtZWRpYXRvciksXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrSGFuZGxlcjogICBjaGVja0hhbmRsZXJzLmZpbmRPck1ha2UoZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgZG9tTm9kZTogICAgICAgIGRvbU5vZGVzLmZpbmRPck1ha2UoZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWF0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24pXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNhdmVkIGZvciBsYXRlciByZWZlcmVuY2UgaW4gY2FzZSB0aGUgdXNlciBoYXMgYSBgdGFwYCBmdW5jdGlvblxuICAgICAgICAvLyBkZWZpbmVkLlxuICAgICAgICBjaGVja0Z1bmN0aW9uLnZhbGlkYXRlID0gKHR5cGVvZiBtZXRyaWMudmFsaWRhdGUgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICA/IG1ldHJpYy52YWxpZGF0ZS50b1N0cmluZygpXG4gICAgICAgICAgICA6IG1ldHJpYy52YWxpZGF0ZTtcblxuICAgICAgICAvLyBTcGVjaWFsIGNhc2VzLiBUaGVzZSBgdmFsaWRhdGVzYCBhZmZlY3QgZWFjaCBvdGhlciwgYW5kIHRoZWlyIHN0YXRlXG4gICAgICAgIC8vIG5lZWRzIHRvIHVwZGF0ZSBlYWNoIHRpbWUgZWl0aGVyIG9mIHRoZSBlbGVtZW50cycgdmFsdWVzIGNoYW5nZS5cbiAgICAgICAgaWYgKG1ldHJpYy52YWxpZGF0ZSA9PT0gJ29uZS1vZidcbiAgICAgICAgICAgIHx8IG1ldHJpYy52YWxpZGF0ZSA9PT0gJ29ubHktb25lLW9mJ1xuICAgICAgICAgICAgfHwgbWV0cmljLnZhbGlkYXRlID09PSAnc29tZS1yYWRpbycpIHtcbiAgICAgICAgICAgIHNwZWNpYWxUcmlnZ2Vycy5wdXNoKG1ldHJpYy5zZWxlY3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIG1ldHJpYy52YWxpZGF0ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICYmIG1ldHJpYy52YWxpZGF0ZS5pbmRleE9mKCdzYW1lLWFzJykgPiAtMSkge1xuICAgICAgICAgICAgc3BlY2lhbFRyaWdnZXJzLnB1c2gobWV0cmljLnZhbGlkYXRlLnNwbGl0KCc6JylbMV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9uLCB1c2VkIGluIHRoZSBsb29wIGJlbG93LlxuICAgICAgICBmdW5jdGlvbiBzdWJzY3JpYmVUb1RyaWdnZXJzIChjaGVja2VyLCBzZWxlY3Rvcikge1xuICAgICAgICAgICAgdmFyIHRyaWdnZXJFbGVtZW50cyA9IG5vZC5nZXRFbGVtZW50cyhzZWxlY3Rvcik7XG5cbiAgICAgICAgICAgIHRyaWdnZXJFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzLmZpbmRPck1ha2UoZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24pO1xuXG4gICAgICAgICAgICAgICAgY2hlY2tlci5zdWJzY3JpYmVUbyhsaXN0ZW5lci5pZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhlcmUgd2Ugc2V0IHVwIHRoZSBcImNvbm5lY3Rpb25zXCIgYmV0d2VlbiBlYWNoIG9mIG91ciBtYWluIHBhcnRzLlxuICAgICAgICAvLyBUaGV5IGNvbW11bmljYXRlIG9ubHkgdGhyb3VnaCB0aGUgbWVkaWF0b3IuXG4gICAgICAgIG1ldHJpY1NldHMuZm9yRWFjaChmdW5jdGlvbiAobWV0cmljU2V0KSB7XG4gICAgICAgICAgICAvLyA6OiBMaXN0ZW5lciAtPiBDaGVja2VyXG5cbiAgICAgICAgICAgIC8vIFdlIHdhbnQgb3VyIGNoZWNrZXIgdG8gbGlzdGVuIHRvIHRoZSBsaXN0ZW5lci4gQSBsaXN0ZW5lciBoYXMgYW5cbiAgICAgICAgICAgIC8vIGlkLCB3aGljaCBpdCB1c2VzIHdoZW4gaXQgZmlyZXMgZXZlbnRzIHRvIHRoZSBtZWRpYXRvciAod2hpY2hcbiAgICAgICAgICAgIC8vIHdhcyBzZXQgdXAgd2hlbiB0aGUgbGlzdGVuZXIgd2FzIGNyZWF0ZWQpLlxuICAgICAgICAgICAgbWV0cmljU2V0LmNoZWNrZXIuc3Vic2NyaWJlVG8obWV0cmljU2V0Lmxpc3RlbmVyLmlkKTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIHVzZXIgc2V0IGEgYHRyaWdnZXJlZEJ5YCwgdGhlIGNoZWNrZXIgbmVlZCB0byBsaXN0ZW4gdG9cbiAgICAgICAgICAgIC8vIGNoYW5nZXMgb24gdGhpcyBlbGVtZW50IGFzIHdlbGwuXG4gICAgICAgICAgICAvLyBTYW1lIGdvZXMgZm9yIHNwZWNpYWwgdHJpZ2dlcnMgdGhhdCB3ZSBzZXQuXG4gICAgICAgICAgICBzdWJzY3JpYmVUb1RyaWdnZXJzKG1ldHJpY1NldC5jaGVja2VyLCBtZXRyaWMudHJpZ2dlcmVkQnkpO1xuICAgICAgICAgICAgc3Vic2NyaWJlVG9UcmlnZ2VycyhtZXRyaWNTZXQuY2hlY2tlciwgc3BlY2lhbFRyaWdnZXJzKTtcblxuICAgICAgICAgICAgLy8gOjogQ2hlY2tlciAtPiBjaGVja0hhbmRsZXJcblxuICAgICAgICAgICAgdmFyIGNoZWNrSWQgPSBub2QudW5pcXVlKCk7XG5cbiAgICAgICAgICAgIC8vIFdlIGFkZCB0aGUgY2hlY2sgZnVuY3Rpb24gYXMgb25lIHRvIGJlIGNoZWNrZWQgd2hlbiB0aGUgdXNlclxuICAgICAgICAgICAgLy8gaW5wdXRzIHNvbWV0aGluZy4gKFRoZXJlIG1pZ2h0IGJlIG1vcmUgdGhhbiB0aGlzIG9uZSkuXG4gICAgICAgICAgICBtZXRyaWNTZXQuY2hlY2tlci5hZGRDaGVjayhjaGVja0Z1bmN0aW9uLCBjaGVja0lkKTtcblxuICAgICAgICAgICAgLy8gV2Ugd2FudCB0aGUgY2hlY2sgaGFuZGxlciB0byBsaXN0ZW4gZm9yIHJlc3VsdHMgZnJvbSB0aGUgY2hlY2tlclxuICAgICAgICAgICAgbWV0cmljU2V0LmNoZWNrSGFuZGxlci5zdWJzY3JpYmVUbyhjaGVja0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWMuZXJyb3JNZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWMuZGVmYXVsdFN0YXR1cyk7XG5cbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uLm5vRG9tKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRFbWl0dGVyLnN1YnNjcmliZShtZXRyaWNTZXQuY2hlY2tIYW5kbGVyLmlkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gOjogY2hlY2tIYW5kbGVyIC0+IGRvbU5vZGVcblxuICAgICAgICAgICAgICAgIC8vIFRoZSBjaGVja0hhbmRsZXIgaGFzIGl0cyBvd24gaWQgKGFuZCBvbmx5IGV2ZXIgbmVlZHMgb25lKSwgc29cbiAgICAgICAgICAgICAgICAvLyB3ZSBqdXN0IGFzayB0aGUgZG9tTm9kZSB0byBsaXN0ZW4gZm9yIHRoYXQuXG4gICAgICAgICAgICAgICAgbWV0cmljU2V0LmRvbU5vZGUuc3Vic2NyaWJlVG8obWV0cmljU2V0LmNoZWNrSGFuZGxlci5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFmdGVyIGFsbCBpcyBkb25lLCB3ZSBtYXkgaGF2ZSB0byBlbmFibGUvZGlzYWJsZSBhIHN1Ym1pdCBidXR0b24uXG4gICAgICAgIHRvZ2dsZVN1Ym1pdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIGEgZm9ybSBpcyBhZGRlZCwgd2UgbGlzdGVuIGZvciBzdWJtaXRzLCBhbmQgaWYgdGhlIGhhcyBhbHNvIHNldFxuICAgICAqIGBwcmV2ZW50U3VibWl0YCBpbiB0aGUgY29uZmlndXJhdGlvbiwgdGhlbiB3ZSBzdG9wIHRoZSBjb21taXQgZnJvbVxuICAgICAqIGhhcHBlbmluZyB1bmxlc3MgYWxsIHRoZSBlbGVtZW50cyBhcmUgdmFsaWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWRkRm9ybSAoc2VsZWN0b3IpIHtcbiAgICAgICAgdmFyIGZvcm0gPSBub2QuZ2V0RWxlbWVudChzZWxlY3Rvcik7XG5cbiAgICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBwb3NzaWJsZVByZXZlbnRTdWJtaXQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBQcmV2ZW50IGZ1bmN0aW9uLCB1c2VkIGFib3ZlXG4gICAgZnVuY3Rpb24gcG9zc2libGVQcmV2ZW50U3VibWl0IChldmVudCkge1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5wcmV2ZW50U3VibWl0ICYmICFhcmVBbGwobm9kLmNvbnN0YW50cy5WQUxJRCkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIC8vIFNob3cgZXJyb3JzIHRvIHRoZSB1c2VyXG4gICAgICAgICAgICBjaGVja2Vycy5mb3JFYWNoKGZ1bmN0aW9uIChjaGVja2VyKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tlci5wZXJmb3JtQ2hlY2soe1xuICAgICAgICAgICAgICAgICAgICBldmVudDogZXZlbnRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBGb2N1cyBvbiB0aGUgZmlyc3QgaW52YWxpZCBlbGVtZW50XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gY2hlY2tIYW5kbGVycy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBjaGVja0hhbmRsZXIgPSBjaGVja0hhbmRsZXJzW2ldO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrSGFuZGxlci5nZXRTdGF0dXMoKS5zdGF0dXMgPT09IG5vZC5jb25zdGFudHMuSU5WQUxJRCkge1xuICAgICAgICAgICAgICAgICAgICBjaGVja0hhbmRsZXIuZWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGVsZW1lbnRzIGNvbXBsZXRlbHkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudCAoc2VsZWN0b3IpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRzID0gbm9kLmdldEVsZW1lbnRzKHNlbGVjdG9yKTtcblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnMucmVtb3ZlSXRlbShlbGVtZW50KTtcbiAgICAgICAgICAgIGNoZWNrZXJzLnJlbW92ZUl0ZW0oZWxlbWVudCk7XG4gICAgICAgICAgICBjaGVja0hhbmRsZXJzLnJlbW92ZUl0ZW0oZWxlbWVudCk7XG4gICAgICAgICAgICBkb21Ob2Rlcy5yZW1vdmVJdGVtKGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjb25maWd1cmVcbiAgICAgKlxuICAgICAqIENoYW5nZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHVzZWQgdGhyb3VnaG91dCB0aGUgY29kZSBmb3IgY2xhc3NlcyxcbiAgICAgKiBkZWxheXMsIG1lc3NhZ2VzLCBldGMuXG4gICAgICpcbiAgICAgKiBJdCBjYW4gZWl0aGVyIGJlIGNhbGxlZCB3aXRoIGEga2V5L3ZhbHVlIHBhaXIgKHR3byBhcmd1bWVudHMpLCBvciB3aXRoXG4gICAgICogYW4gb2JqZWN0IHdpdGgga2V5L3ZhbHVlIHBhaXJzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmZpZ3VyZSAoa2V5LCB2YWx1ZSkge1xuICAgICAgICB2YXIgYXR0cmlidXRlcyA9IHt9O1xuXG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgYXR0cmlidXRlc1trZXldID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzID0ga2V5O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgayBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBjb25maWd1cmF0aW9uW2tdID0gYXR0cmlidXRlc1trXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzLnN1Ym1pdCB8fCBhdHRyaWJ1dGVzLmRpc2FibGVTdWJtaXQpIHtcbiAgICAgICAgICAgIHRvZ2dsZVN1Ym1pdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGF0dHJpYnV0ZXMuZm9ybSkge1xuICAgICAgICAgICAgYWRkRm9ybShhdHRyaWJ1dGVzLmZvcm0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdG9nZ2xlU3VibWl0XG4gICAgICpcbiAgICAgKiBUb2dnbGVzIHRoZSBzdWJtaXQgYnV0dG9uIChlbmFibGVkIGlmIGV2ZXJ5IGVsZW1lbnQgaXMgdmFsaWQsIG90aGVyd2lzZVxuICAgICAqIGRpc2FibGVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b2dnbGVTdWJtaXQgKCkge1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5zdWJtaXQgJiYgY29uZmlndXJhdGlvbi5kaXNhYmxlU3VibWl0KSB7XG4gICAgICAgICAgICBub2QuZ2V0RWxlbWVudHMoY29uZmlndXJhdGlvbi5zdWJtaXQpLmZvckVhY2goZnVuY3Rpb24gKHN1Ym1pdEJ0bikge1xuICAgICAgICAgICAgICAgIHN1Ym1pdEJ0bi5kaXNhYmxlZCA9ICFhcmVBbGwobm9kLmNvbnN0YW50cy5WQUxJRCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RlbiB0byBhbGwgY2hlY2tzLCBhbmQgaWYgdGhlIHVzZXIgaGFzIHNldCBpbiB0aGUgY29uZmlndXJhdGlvbiB0b1xuICAgICAqIGVuYWJsZS9kaXNhYmxlZCB0aGUgc3VibWl0IGJ1dHRvbiwgd2UgZG8gdGhhdC5cbiAgICAgKi9cbiAgICBtZWRpYXRvci5zdWJzY3JpYmUoJ2FsbCcsIHRvZ2dsZVN1Ym1pdCk7XG5cbiAgICBmdW5jdGlvbiBhcmVBbGwgKHN0YXR1cykge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gY2hlY2tIYW5kbGVycy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKGNoZWNrSGFuZGxlcnNbaV0uZ2V0U3RhdHVzKCkuc3RhdHVzICE9PSBzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRNZXNzYWdlT3B0aW9ucyAob3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gQXJyYXkuaXNBcnJheShvcHRpb25zKSA/IG9wdGlvbnMgOiBbb3B0aW9uc107XG5cbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgICAgICAgIHZhciBlbGVtZW50cyA9IG5vZC5nZXRFbGVtZW50cyhvcHRpb24uc2VsZWN0b3IpO1xuXG4gICAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGRvbU5vZGUgPSBkb21Ob2Rlcy5maW5kT3JNYWtlKGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uKTtcblxuICAgICAgICAgICAgICAgIGRvbU5vZGUuc2V0TWVzc2FnZU9wdGlvbnMob3B0aW9uLnBhcmVudCwgb3B0aW9uLmVycm9yU3Bhbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIHRvIGFsbCBjaGVja3MgYW5kIGFsbG93IHRoZSB1c2VyIHRvIGxpc3RlbiBpbiwgaWYgaGUgc2V0IGEgYHRhcGBcbiAgICAgKiBmdW5jdGlvbiBpbiB0aGUgY29uZmlndXJhdGlvbi5cbiAgICAgKi9cbiAgICBtZWRpYXRvci5zdWJzY3JpYmUoJ2FsbCcsIGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlndXJhdGlvbi50YXAgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICYmIG9wdGlvbnMudHlwZSA9PT0gJ2NoZWNrJykge1xuICAgICAgICAgICAgY29uZmlndXJhdGlvbi50YXAob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGdldFN0YXR1cyAoc2VsZWN0b3IsIHNob3dFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBub2QuZ2V0RWxlbWVudChzZWxlY3RvciksXG4gICAgICAgICAgICBzdGF0dXMgID0gY2hlY2tIYW5kbGVycy5maW5kT3JNYWtlKGVsZW1lbnQpLmdldFN0YXR1cygpO1xuXG4gICAgICAgIHJldHVybiBzaG93RXJyb3JNZXNzYWdlID8gc3RhdHVzIDogc3RhdHVzLnN0YXR1cztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZXJmb3JtQ2hlY2sgKHNlbGVjdG9yKSB7XG4gICAgICAgIHZhciBjcyA9IHNlbGVjdG9yXG4gICAgICAgICAgICA/IG5vZC5nZXRFbGVtZW50cyhzZWxlY3RvcikubWFwKGNoZWNrZXJzLmZpbmRPck1ha2UpXG4gICAgICAgICAgICA6IGNoZWNrZXJzO1xuXG4gICAgICAgIGNzLmZvckVhY2goZnVuY3Rpb24gKGNoZWNrZXIpIHtcbiAgICAgICAgICAgIGNoZWNrZXIucGVyZm9ybUNoZWNrKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldEludmFsaWQgKHNlbGVjdG9yLCBlcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBub2QuZ2V0RWxlbWVudChzZWxlY3RvciksXG4gICAgICAgICAgICBkb21Ob2RlICA9IGRvbU5vZGVzLmZpbmRPck1ha2UoZWxlbWVudCk7XG5cbiAgICAgICAgZG9tTm9kZS5zZXQoe1xuICAgICAgICAgICAgcmVzdWx0OiBub2QuY29uc3RhbnRzLklOVkFMSUQsXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yTWVzc2FnZSB8fCAnJ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRWYWxpZCAoc2VsZWN0b3IpIHtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBub2QuZ2V0RWxlbWVudChzZWxlY3RvciksXG4gICAgICAgICAgICBkb21Ob2RlICA9IGRvbU5vZGVzLmZpbmRPck1ha2UoZWxlbWVudCk7XG5cbiAgICAgICAgZG9tTm9kZS5zZXQoe1xuICAgICAgICAgICAgcmVzdWx0OiBub2QuY29uc3RhbnRzLlZBTElELFxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiAnJ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRBbGxOb2RlVmFsaWQgKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZG9tTm9kZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHNldFZhbGlkKGRvbU5vZGVzW2ldLmVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgZnVuY3Rpb25zIHRoYXQgYXJlIGV4cG9zZWQgdG8gdGhlIHB1YmxpYy5cbiAgICAgKi9cbiAgICB2YXIgbm9kSW5zdGFjZSA9IHtcbiAgICAgICAgYWRkOiAgICAgICAgICAgICAgICAgICAgYWRkTWV0cmljcyxcbiAgICAgICAgcmVtb3ZlOiAgICAgICAgICAgICAgICAgcmVtb3ZlRWxlbWVudCxcbiAgICAgICAgYXJlQWxsOiAgICAgICAgICAgICAgICAgYXJlQWxsLFxuICAgICAgICBnZXRTdGF0dXM6ICAgICAgICAgICAgICBnZXRTdGF0dXMsXG4gICAgICAgIGNvbmZpZ3VyZTogICAgICAgICAgICAgIGNvbmZpZ3VyZSxcbiAgICAgICAgc2V0TWVzc2FnZU9wdGlvbnM6ICAgICAgc2V0TWVzc2FnZU9wdGlvbnMsXG4gICAgICAgIHBlcmZvcm1DaGVjazogICAgICAgICAgIHBlcmZvcm1DaGVjayxcbiAgICAgICAgc2V0SW52YWxpZDogICAgICAgICAgICAgc2V0SW52YWxpZCxcbiAgICAgICAgc2V0VmFsaWQ6ICAgICAgICAgICAgICAgc2V0VmFsaWQsXG4gICAgICAgIHNldEFsbE5vZGVWYWxpZDogICAgICAgIHNldEFsbE5vZGVWYWxpZFxuICAgIH07XG5cbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgIG5vZEluc3RhY2UuY29uZmlndXJlKGNvbmZpZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZEluc3RhY2U7XG59XG5cbm5vZC5jb25zdGFudHMgPSB7XG4gICAgVkFMSUQ6ICAgICAgICAgICd2YWxpZCcsXG4gICAgSU5WQUxJRDogICAgICAgICdpbnZhbGlkJyxcbiAgICBVTkNIRUNLRUQ6ICAgICAgJ3VuY2hlY2tlZCcsXG5cbiAgICBERUxBWTogICAgICAgICAgNzAwXG59O1xuXG5ub2QuY2xhc3NlcyA9IHtcbiAgICBzdWNjZXNzQ2xhc3M6ICAgICAgICAgJ25vZC1zdWNjZXNzJyxcbiAgICBzdWNjZXNzTWVzc2FnZUNsYXNzOiAgJ25vZC1zdWNjZXNzLW1lc3NhZ2UnLFxuICAgIGVycm9yQ2xhc3M6ICAgICAgICAgICAnbm9kLWVycm9yJyxcbiAgICBlcnJvck1lc3NhZ2VDbGFzczogICAgJ25vZC1lcnJvci1tZXNzYWdlJ1xufTtcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSB1bmlxdWUgaWQnc1xubm9kLnVuaXF1ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHVuaXF1ZUNvdW50ZXIgPSAwO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHVuaXF1ZUNvdW50ZXIrKztcbiAgICB9O1xufSkoKTtcblxuLyoqIG1ha2VNZWRpYXRvclxuICpcbiAqIE1pbmltYWwgaW1wbGVtZW50YXRpb24gb2YgYSBtZWRpYXRvciBwYXR0ZXJuLCB1c2VkIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW5cbiAqIGNoZWNrZXJzIGFuZCBjaGVja0hhbmRsZXJzIChjaGVja2VycyBmaXJlcyBldmVudHMgd2hpY2ggaGFuZGxlcnMgY2FuXG4gKiBzdWJzY3JpYmUgdG8pLiBVbmlxdWUgSUQncyBhcmUgdXNlZCB0byB0ZWxsIGV2ZW50cyBhcGFydC5cbiAqXG4gKiBTdWJzY3JpYmluZyB0byAnYWxsJyB3aWxsIGdpdmUgeW91IGFsbCByZXN1bHRzIGZyb20gYWxsIGNoZWNrcy5cbiAqL1xubm9kLm1ha2VNZWRpYXRvciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3Vic2NyaWJlcnMgPSBbXSxcbiAgICAgICAgYWxsID0gW107XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZSAoaWQsIGZuKSB7XG4gICAgICAgICAgICBpZiAoaWQgPT09ICdhbGwnKSB7XG4gICAgICAgICAgICAgICAgYWxsLnB1c2goZm4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIXN1YnNjcmliZXJzW2lkXSkge1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyc1tpZF0gPSBbXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc3Vic2NyaWJlcnNbaWRdLmluZGV4T2YoZm4pID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyc1tpZF0ucHVzaChmbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGZpcmU6IGZ1bmN0aW9uIGZpcmUgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHZhciBzdWJzY3JpYmVkRnVuY3Rpb25zID0gc3Vic2NyaWJlcnNbb3B0aW9ucy5pZF0uY29uY2F0KGFsbCk7XG5cbiAgICAgICAgICAgIHN1YnNjcmliZWRGdW5jdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlZEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlZEZ1bmN0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufTtcblxubm9kLmZpbmRDb2xsZWN0aW9uSW5kZXggPSBmdW5jdGlvbiAoY29sbGVjdGlvbiwgZWxlbWVudCkge1xuICAgIGZvciAodmFyIGkgaW4gY29sbGVjdGlvbikge1xuICAgICAgICBpZiAoY29sbGVjdGlvbltpXS5lbGVtZW50ID09PSBlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAtMTtcbn07XG5cbi8qKlxuICogbWFrZUNvbGxlY3Rpb25cbiAqXG4gKiBBIG1pbmltYWwgaW1wbGVtZW50YXRpb24gb2YgYSBcImNvbGxlY3Rpb25cIiwgaW5zcGlyZWQgYnkgY29sbGVjdGlvbnMgZnJvbVxuICogQmFja2JvbmVKUy4gVXNlZCBieSBsaXN0ZW5lcnMsIGNoZWNrZXJzLCBhbmQgY2hlY2tIYW5kbGVycy5cbiAqL1xubm9kLm1ha2VDb2xsZWN0aW9uID0gZnVuY3Rpb24gKG1ha2VyKSB7XG4gICAgdmFyIGNvbGxlY3Rpb24gPSBbXTtcblxuICAgIGNvbGxlY3Rpb24uZmluZE9yTWFrZSA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHZhciBpbmRleCA9IG5vZC5maW5kQ29sbGVjdGlvbkluZGV4KGNvbGxlY3Rpb24sIGVsZW1lbnQpO1xuXG4gICAgICAgIC8vIEZvdW5kXG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uW2luZGV4XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vbmUgZm91bmQsIGxldCdzIG1ha2Ugb25lIHRoZW4uXG4gICAgICAgIHZhciBpdGVtID0gbWFrZXIuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcblxuICAgICAgICBjb2xsZWN0aW9uLnB1c2goaXRlbSk7XG5cbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfTtcblxuICAgIGNvbGxlY3Rpb24ucmVtb3ZlSXRlbSA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHZhciBpbmRleCA9IG5vZC5maW5kQ29sbGVjdGlvbkluZGV4KGNvbGxlY3Rpb24sIGVsZW1lbnQpLFxuICAgICAgICAgICAgaXRlbSA9IGNvbGxlY3Rpb25baW5kZXhdO1xuXG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbCAuZGlzcG9zZSgpIGlmIGl0IGV4aXN0c1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW0uZGlzcG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaXRlbS5kaXNwb3NlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgaXRlbVxuICAgICAgICBjb2xsZWN0aW9uLnNwbGljZShpbmRleCwgMSk7XG4gICAgfTtcblxuICAgIHJldHVybiBjb2xsZWN0aW9uO1xufTtcblxuLyoqXG4gKiBtYWtlTGlzdGVuZXJcbiAqXG4gKiBUYWtlcyBjYXJlIG9mIGxpc3RlbmluZyB0byBjaGFuZ2VzIHRvIGl0cyBlbGVtZW50IGFuZCBmaXJlIHRoZW0gb2ZmIGFzXG4gKiBldmVudHMgb24gdGhlIG1lZGlhdG9yIGZvciBjaGVja2VycyB0byBsaXN0ZW4gdG8uXG4gKi9cbm5vZC5tYWtlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgbWVkaWF0b3IsIHRyaWdnZXJFdmVudHMsIGNvbmZpZ3VyYXRpb24pIHtcbiAgICB2YXIgaWQgPSBub2QudW5pcXVlKCksXG4gICAgICAgICRlbGVtZW50O1xuXG4gICAgZnVuY3Rpb24gY2hhbmdlZCAoZXZlbnQpIHtcbiAgICAgICAgbWVkaWF0b3IuZmlyZSh7XG4gICAgICAgICAgICBpZDogICAgIGlkLFxuICAgICAgICAgICAgZXZlbnQ6ICBldmVudCxcbiAgICAgICAgICAgIHR5cGU6ICAgJ2NoYW5nZSdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGNoYW5nZWQsIGZhbHNlKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGNoYW5nZWQsIGZhbHNlKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBjaGFuZ2VkLCBmYWxzZSk7XG5cbiAgICBpZiAoY29uZmlndXJhdGlvbi5qUXVlcnkpIHtcbiAgICAgICAgJGVsZW1lbnQgPSBjb25maWd1cmF0aW9uLmpRdWVyeShlbGVtZW50KTtcblxuICAgICAgICAkZWxlbWVudC5vbigncHJvcGVydHljaGFuZ2UgY2hhbmdlIGNsaWNrIGtleXVwIGlucHV0IHBhc3RlJywgY2hhbmdlZCk7XG4gICAgfVxuXG4gICAgaWYgKHRyaWdnZXJFdmVudHMpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50cyA9IEFycmF5LmlzQXJyYXkodHJpZ2dlckV2ZW50cylcbiAgICAgICAgICAgID8gdHJpZ2dlckV2ZW50c1xuICAgICAgICAgICAgOiBbdHJpZ2dlckV2ZW50c107XG5cbiAgICAgICAgdHJpZ2dlckV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNoYW5nZWQsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGlzcG9zZSAoKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBjaGFuZ2VkLCBmYWxzZSk7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgY2hhbmdlZCwgZmFsc2UpO1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCBjaGFuZ2VkLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKCRlbGVtZW50KSB7XG4gICAgICAgICAgICAkZWxlbWVudC5vZmYoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0cmlnZ2VyRXZlbnRzKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNoYW5nZWQsIGZhbHNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZWxlbWVudDogICAgZWxlbWVudCxcbiAgICAgICAgZGlzcG9zZTogICAgZGlzcG9zZSxcbiAgICAgICAgaWQ6ICAgICAgICAgaWRcbiAgICB9O1xufTtcblxuLyoqXG4gKiBtYWtlQ2hlY2tlclxuICpcbiAqIEFuIFwiY2hlY2tlclwiIGNvbW11bmljYXRlcyBwcmltYXJpbHkgd2l0aCB0aGUgbWVkaWF0b3IuIEl0IGxpc3RlbnMgZm9yIGlucHV0XG4gKiBjaGFuZ2VzIChjb21pbmcgZnJvbSBsaXN0ZW5lcnMpLCBwZXJmb3JtcyBpdHMgY2hlY2tzIGFuZCBmaXJlcyBvZmYgcmVzdWx0c1xuICogYmFjayB0byB0aGUgbWVkaWF0b3IgZm9yIGNoZWNrSGFuZGxlcnMgdG8gaGFuZGxlLlxuICpcbiAqIFRoZSBjaGVja2VyIGhhcyBhIDEgdG8gMSByZWxhdGlvbnNoaXAgd2l0aCBhbiBlbGVtZW50LCBhbiBsaXN0ZW5lcnMsIGFuZCBhblxuICogY2hlY2tIYW5kbGVyOyBhbHRob3VnaCB0aGV5IG1heSBjb21tdW5pY2F0ZSB3aXRoIG90aGVyIFwic2V0c1wiIG9mIGxpc3RlbmVycyxcbiAqIGNoZWNrZXJzIGFuZCBoYW5kbGVycy5cbiAqXG4gKiBDaGVja3MgYXJlIGFkZGVkLCBmcm9tIHRoZSBvdXRzaWRlLCBhbmQgY29uc2lzdHMgb2YgYSBjaGVja0Z1bmN0aW9uIChzZWVcbiAqIG5vZC5jaGVja0Z1bmN0aW9ucykgYW5kIGEgdW5pcXVlIGlkLlxuICovXG5ub2QubWFrZUNoZWNrZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgbWVkaWF0b3IpIHtcbiAgICB2YXIgY2hlY2tzID0gW107XG5cbiAgICBmdW5jdGlvbiBzdWJzY3JpYmVUbyAoaWQpIHtcbiAgICAgICAgbWVkaWF0b3Iuc3Vic2NyaWJlKGlkLCBwZXJmb3JtQ2hlY2spO1xuICAgIH1cblxuICAgIC8vIFJ1biBldmVyeSBjaGVjayBmdW5jdGlvbiBhZ2FpbnN0IHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudC5cbiAgICBmdW5jdGlvbiBwZXJmb3JtQ2hlY2sgKG9wdGlvbnMpIHtcbiAgICAgICAgY2hlY2tzLmZvckVhY2goZnVuY3Rpb24gKGNoZWNrKSB7XG4gICAgICAgICAgICBjaGVjayhvcHRpb25zIHx8IHt9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGEgY2hlY2sgZnVuY3Rpb24gdG8gdGhlIGVsZW1lbnQuIFRoZSByZXN1bHQgd2lsbCBiZSBoYW5kZWQgb2ZmIHRvIHRoZVxuICAgIC8vIG1lZGlhdG9yIChmb3IgY2hlY2tIYW5kbGVycyB0byBldmFsdWF0ZSkuXG4gICAgZnVuY3Rpb24gYWRkQ2hlY2sgKGNoZWNrRnVuY3Rpb24sIGlkKSB7XG4gICAgICAgIGZ1bmN0aW9uIGNhbGxiYWNrIChyZXN1bHQpIHtcbiAgICAgICAgICAgIG1lZGlhdG9yLmZpcmUoe1xuICAgICAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgICAgICB0eXBlOiAnY2hlY2snLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogcmVzdWx0LFxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgdmFsaWRhdGU6IGNoZWNrRnVuY3Rpb24udmFsaWRhdGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hlY2tzLnB1c2goZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIElmIGVsZW1lbnQudmFsdWUgaXMgdW5kZWZpbmVkLCB0aGVuIHdlIG1pZ2h0IGJlIGRlYWxpbmcgd2l0aFxuICAgICAgICAgICAgLy8gYW5vdGhlciB0eXBlIG9mIGVsZW1lbnQ7IGxpa2UgPGRpdiBjb250ZW50ZWRpdGFibGU9J3RydWUnPlxuICAgICAgICAgICAgdmFyIHZhbHVlID0gZWxlbWVudC52YWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBlbGVtZW50LmlubmVySFRNTFxuICAgICAgICAgICAgICAgIDogZWxlbWVudC52YWx1ZTtcblxuICAgICAgICAgICAgb3B0aW9ucy5lbGVtZW50ID0gZWxlbWVudDtcblxuICAgICAgICAgICAgY2hlY2tGdW5jdGlvbihjYWxsYmFjaywgdmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzdWJzY3JpYmVUbzogICAgc3Vic2NyaWJlVG8sXG4gICAgICAgIGFkZENoZWNrOiAgICAgICBhZGRDaGVjayxcbiAgICAgICAgcGVyZm9ybUNoZWNrOiAgIHBlcmZvcm1DaGVjayxcbiAgICAgICAgZWxlbWVudDogICAgICAgIGVsZW1lbnRcbiAgICB9O1xufTtcblxuLyoqXG4gKiBtYWtlQ2hlY2tIYW5kbGVyXG4gKlxuICogSGFuZGxlcyBjaGVja3MgY29taW5nIGluIGZyb20gdGhlIG1lZGlhdG9yIGFuZCB0YWtlcyBjYXJlIG9mIGNhbGN1bGF0aW5nIHRoZVxuICogc3RhdGUgYW5kIGVycm9yIG1lc3NhZ2VzLlxuICpcbiAqIFRoZSBjaGVja0hhbmRsZXJzIGxpdmVzIGluIG9uZSB0byBvbmUgd2l0aCB0aGUgZWxlbWVudCBwYXJzZWQgaW4sIGFuZCBsaXN0ZW5zXG4gKiBmb3IgKHVzdWFsbHkpIG11bHRpcGxlIGVycm9yIGNoZWNrcy5cbiAqL1xubm9kLm1ha2VDaGVja0hhbmRsZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgbWVkaWF0b3IsIGNvbmZpZ3VyYXRpb24pIHtcbiAgICB2YXIgcmVzdWx0cyAgICAgPSB7fSxcbiAgICAgICAgaWQgICAgICAgICAgPSBub2QudW5pcXVlKCk7XG5cbiAgICBmdW5jdGlvbiBzdWJzY3JpYmVUbyAoaWQsIGVycm9yTWVzc2FnZSwgZGVmYXVsdFN0YXR1cykge1xuICAgICAgICAvLyBDcmVhdGUgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZSBvZiBlcnJvciBpbiB0aGUgcmVzdWx0cyBvYmplY3QuXG4gICAgICAgIGlmICghcmVzdWx0c1tpZF0pIHtcbiAgICAgICAgICAgIHJlc3VsdHNbaWRdID0ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogZGVmYXVsdFN0YXR1cyB8fCBub2QuY29uc3RhbnRzLlVOQ0hFQ0tFRCxcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yTWVzc2FnZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN1YnNjcmliZSB0byBlcnJvciBpZC5cbiAgICAgICAgbWVkaWF0b3Iuc3Vic2NyaWJlKGlkLCBjaGVja0hhbmRsZXIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrSGFuZGxlciAocmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdHNbcmVzdWx0LmlkXS5zdGF0dXMgPSByZXN1bHQucmVzdWx0XG4gICAgICAgICAgICA/IG5vZC5jb25zdGFudHMuVkFMSURcbiAgICAgICAgICAgIDogbm9kLmNvbnN0YW50cy5JTlZBTElEO1xuXG4gICAgICAgIG5vdGlmeU1lZGlhdG9yKCk7XG4gICAgfVxuXG4gICAgLy8gUnVucyB0aHJvdWdoIGFsbCByZXN1bHRzIHRvIHNlZSB3aGF0IGtpbmQgb2YgZmVlZGJhY2sgdG8gc2hvdyB0aGUgdXNlci5cbiAgICBmdW5jdGlvbiBub3RpZnlNZWRpYXRvciAoKSB7XG4gICAgICAgIHZhciBzdGF0dXMgPSBnZXRTdGF0dXMoKTtcblxuICAgICAgICAvLyBFdmVudCBpZiBtaWdodCBiZSB2YWxpZCB3ZSBwYXNzIGFsb25nIGFuIHVuZGVmaW5lZCBlcnJvck1lc3NhZ2UuXG4gICAgICAgIG1lZGlhdG9yLmZpcmUoe1xuICAgICAgICAgICAgaWQ6ICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgdHlwZTogICAgICAgICAgICdyZXN1bHQnLFxuICAgICAgICAgICAgcmVzdWx0OiAgICAgICAgIHN0YXR1cy5zdGF0dXMsXG4gICAgICAgICAgICBlbGVtZW50OiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZTogICBzdGF0dXMuZXJyb3JNZXNzYWdlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFN0YXR1cyAoKSB7XG4gICAgICAgIHZhciBzdGF0dXMsIGVycm9yTWVzc2FnZTtcblxuICAgICAgICBmb3IgKHZhciBpZCBpbiByZXN1bHRzKSB7XG4gICAgICAgICAgICBzdGF0dXMgPSByZXN1bHRzW2lkXS5zdGF0dXM7XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHRzW2lkXS5zdGF0dXMgPT09IG5vZC5jb25zdGFudHMuSU5WQUxJRCkge1xuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IHJlc3VsdHNbaWRdLmVycm9yTWVzc2FnZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXM6ICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6ICBlcnJvck1lc3NhZ2VcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogICAgICAgICAgICAgaWQsXG4gICAgICAgIHN1YnNjcmliZVRvOiAgICBzdWJzY3JpYmVUbyxcbiAgICAgICAgY2hlY2tIYW5kbGVyOiAgIGNoZWNrSGFuZGxlcixcbiAgICAgICAgZ2V0U3RhdHVzOiAgICAgIGdldFN0YXR1cyxcbiAgICAgICAgZWxlbWVudDogICAgICAgIGVsZW1lbnRcbiAgICB9O1xufTtcblxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgYG1ha2VEb21Ob2RlYC5cbm5vZC5oYXNDbGFzcyA9IGZ1bmN0aW9uIChjbGFzc05hbWUsIGVsKSB7XG4gICAgaWYgKGVsLmNsYXNzTGlzdCkge1xuICAgICAgICByZXR1cm4gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cCgnKFxcXFxzfF4pJyArIGNsYXNzTmFtZSArICcoXFxcXHN8JCknKTtcbiAgICAgICAgcmV0dXJuICEhZWwuY2xhc3NOYW1lLm1hdGNoKHJlZ2V4KTtcbiAgICB9XG59O1xuXG5ub2QucmVtb3ZlQ2xhc3MgPSBmdW5jdGlvbiAoY2xhc3NOYW1lLCBlbCkge1xuICAgIGlmIChlbC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICAgIH0gZWxzZSBpZiAobm9kLmhhc0NsYXNzKGNsYXNzTmFtZSwgZWwpKSB7XG4gICAgICAgIHZhciByZWdleCA9IG5ldyBSZWdFeHAoJyg/Ol58XFxcXHMpJyArIGNsYXNzTmFtZSArICcoPyFcXFxcUyknKTtcbiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lLnJlcGxhY2UocmVnZXgsICcnKTtcbiAgICB9XG59O1xuXG5ub2QuYWRkQ2xhc3MgPSBmdW5jdGlvbiAoY2xhc3NOYW1lLCBlbCkge1xuICAgIGlmIChlbC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgIH0gZWxzZSBpZiAoIW5vZC5oYXNDbGFzcyhjbGFzc05hbWUsIGVsKSkge1xuICAgICAgICBlbC5jbGFzc05hbWUgKz0gJyAnICsgY2xhc3NOYW1lO1xuICAgIH1cbn07XG5cbm5vZC5nZXRQYXJlbnQgPSBmdW5jdGlvbiAoZWxlbWVudCwgY29uZmlndXJhdGlvbikge1xuICAgIHZhciBrbGFzcyA9IGNvbmZpZ3VyYXRpb24ucGFyZW50Q2xhc3M7XG5cbiAgICBpZiAoa2xhc3MpIHtcbiAgICAgICAga2xhc3MgPSBrbGFzcy5jaGFyQXQoMCkgPT09ICcuJyA/IGtsYXNzLnNsaWNlKDEpIDoga2xhc3M7XG4gICAgICAgIHJldHVybiBub2QuZmluZFBhcmVudFdpdGhDbGFzcyhlbGVtZW50LnBhcmVudE5vZGUsIGtsYXNzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgIH1cbn07XG5cbm5vZC5maW5kUGFyZW50V2l0aENsYXNzID0gZnVuY3Rpb24gKHBhcmVudCwga2xhc3MpIHtcbiAgICAvLyBHdWFyZCAob25seSB0aGUgYHdpbmRvd2AgZG9lcyBub3QgaGF2ZSBhIHBhcmVudCkuXG4gICAgaWYgKCFwYXJlbnQucGFyZW50Tm9kZSkge1xuICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cblxuICAgIC8vIEZvdW5kIGl0XG4gICAgaWYgKG5vZC5oYXNDbGFzcyhrbGFzcywgcGFyZW50KSkge1xuICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cblxuICAgIC8vIFRyeSBuZXh0IHBhcmVudCAocmVjdXJzaW9uKVxuICAgIHJldHVybiBub2QuZmluZFBhcmVudFdpdGhDbGFzcyhwYXJlbnQucGFyZW50Tm9kZSwga2xhc3MpO1xufTtcblxuLyoqXG4gKiBtYWtlRG9tTm9kZVxuICpcbiAqIFRoaXMgY3JlYXRlcyB0aGUgZXJyb3Ivc3VjY2VzcyBtZXNzYWdlIGJlaGluZCB0aGUgaW5wdXQgZWxlbWVudCwgYXMgd2VsbCBhc1xuICogdGFrZXMgY2FyZSBvZiB1cGRhdGluZyBjbGFzc2VzIGFuZCB0YWtpbmcgY2FyZSBvZiBpdHMgb3duIHN0YXRlLlxuICpcbiAqIFRoZSBkb20gbm9kZSBpcyBvd25lZCBieSBjaGVja0hhbmRsZXIsIGFuZCBoYXMgYSBvbmUgdG8gb25lIHJlbGF0aW9uc2hpcCB3aXRoXG4gKiBib3RoIHRoZSBjaGVja0hhbmRsZXIgYW5kIHRoZSBpbnB1dCBlbGVtZW50IGJlaW5nIGNoZWNrZWQuXG4gKlxuICovXG5ub2QubWFrZURvbU5vZGUgPSBmdW5jdGlvbiAoZWxlbWVudCwgbWVkaWF0b3IsIGNvbmZpZ3VyYXRpb24pIHtcbiAgICAvLyBBICdkb21Ob2RlJyBjb25zaXN0cyBvZiB0d28gZWxlbWVudHM6IGEgJ3BhcmVudCcsIGFuZCBhICdzcGFuJy4gVGhlXG4gICAgLy8gcGFyZW50IGlzIGdpdmVuIGFzIGEgcGFyZW1ldGVyLCB3aGlsZSB0aGUgc3BhbiBpcyBjcmVhdGVkIGFuZCBhZGRlZCBhcyBhXG4gICAgLy8gY2hpbGQgdG8gdGhlIHBhcmVudC5cbiAgICB2YXIgcGFyZW50ICAgICAgICAgICAgICA9IG5vZC5nZXRQYXJlbnQoZWxlbWVudCwgY29uZmlndXJhdGlvbiksXG4gICAgICAgIF9zdGF0dXMgICAgICAgICAgICAgPSBub2QuY29uc3RhbnRzLlVOQ0hFQ0tFRCxcbiAgICAgICAgcGVuZGluZ1VwZGF0ZSAgICAgICA9IG51bGwsXG4gICAgICAgIHNwYW4gICAgICAgICAgICAgICAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyksXG4gICAgICAgIGN1c3RvbVNwYW4gICAgICAgICAgPSBmYWxzZTtcblxuICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIGlmICghY29uZmlndXJhdGlvbi5ub0RvbSkge1xuICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlcyB0aGUgY2xhc3Mgb2YgdGhlIHBhcmVudCB0byBtYXRjaCB0aGUgc3RhdHVzIG9mIHRoZSBlbGVtZW50LlxuICAgIGZ1bmN0aW9uIHVwZGF0ZVBhcmVudCAoc3RhdHVzKSB7XG4gICAgICAgIHZhciBzdWNjZXNzQ2xhc3MgPSBjb25maWd1cmF0aW9uLnN1Y2Nlc3NDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbm9kLmNsYXNzZXMuc3VjY2Vzc0NsYXNzLFxuICAgICAgICAgICAgZXJyb3JDbGFzcyA9IGNvbmZpZ3VyYXRpb24uZXJyb3JDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG5vZC5jbGFzc2VzLmVycm9yQ2xhc3M7XG5cbiAgICAgICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgICAgY2FzZSBub2QuY29uc3RhbnRzLlZBTElEOlxuICAgICAgICAgICAgbm9kLnJlbW92ZUNsYXNzKGVycm9yQ2xhc3MsIHBhcmVudCk7XG4gICAgICAgICAgICBub2QuYWRkQ2xhc3Moc3VjY2Vzc0NsYXNzLCBwYXJlbnQpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBub2QuY29uc3RhbnRzLklOVkFMSUQ6XG4gICAgICAgICAgICBub2QucmVtb3ZlQ2xhc3Moc3VjY2Vzc0NsYXNzLCBwYXJlbnQpO1xuICAgICAgICAgICAgbm9kLmFkZENsYXNzKGVycm9yQ2xhc3MsIHBhcmVudCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZXMgdGhlIHRleHQgYW5kIGNsYXNzIGFjY29yZGluZyB0byB0aGUgc3RhdHVzLlxuICAgIGZ1bmN0aW9uIHVwZGF0ZVNwYW4gKHN0YXR1cywgZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgIHZhciBzdWNjZXNzTWVzc2FnZUNsYXNzID0gY29uZmlndXJhdGlvbi5zdWNjZXNzTWVzc2FnZUNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbm9kLmNsYXNzZXMuc3VjY2Vzc01lc3NhZ2VDbGFzcyxcbiAgICAgICAgICBlcnJvck1lc3NhZ2VDbGFzcyAgID0gY29uZmlndXJhdGlvbi5lcnJvck1lc3NhZ2VDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBub2QuY2xhc3Nlcy5lcnJvck1lc3NhZ2VDbGFzcztcblxuICAgICAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgICAgY2FzZSBub2QuY29uc3RhbnRzLlZBTElEOlxuICAgICAgICAgICAgbm9kLnJlbW92ZUNsYXNzKGVycm9yTWVzc2FnZUNsYXNzLCBzcGFuKTtcbiAgICAgICAgICAgIG5vZC5hZGRDbGFzcyhzdWNjZXNzTWVzc2FnZUNsYXNzLCBzcGFuKTtcblxuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uc3VjY2Vzc01lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBzcGFuLnRleHRDb250ZW50ID0gY29uZmlndXJhdGlvbi5zdWNjZXNzTWVzc2FnZTtcbiAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBub2QuY29uc3RhbnRzLklOVkFMSUQ6XG4gICAgICAgICAgICBub2QucmVtb3ZlQ2xhc3Moc3VjY2Vzc01lc3NhZ2VDbGFzcywgc3Bhbik7XG4gICAgICAgICAgICBub2QuYWRkQ2xhc3MoZXJyb3JNZXNzYWdlQ2xhc3MsIHNwYW4pO1xuICAgICAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IGVycm9yTWVzc2FnZTtcbiAgICAgICAgICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXQgKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIHN0YXR1cyAgICAgICAgICAgICAgPSBvcHRpb25zLnJlc3VsdCxcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSAgICAgICAgPSBvcHRpb25zLmVycm9yTWVzc2FnZTtcblxuICAgICAgICAvLyBJZiB0aGUgZG9tIGlzIHNob3dpbmcgYW4gaW52YWxpZCBtZXNzYWdlLCB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgZG9tXG4gICAgICAgIC8vIHJpZ2h0IGF3YXkuXG4gICAgICAgIGlmIChfc3RhdHVzID09PSBub2QuY29uc3RhbnRzLklOVkFMSUQgfHwgY29uZmlndXJhdGlvbi5kZWxheSA9PT0gMCkge1xuICAgICAgICAgICAgX3N0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgICAgIHVwZGF0ZVBhcmVudChzdGF0dXMpO1xuICAgICAgICAgICAgdXBkYXRlU3BhbihzdGF0dXMsIGVycm9yTWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZG9tIHNob3dzIGVpdGhlciBhbiB1bmNoZWNrZWQgb3IgYSB2YWxpZCBzdGF0ZSB3ZSB3b24ndFxuICAgICAgICAgICAgLy8gcnVzaCB0byB0ZWxsIHRoZW0gdGhleSBhcmUgd3JvbmcuIEluc3RlYWQgd2UgdXNlIGEgbWV0aG9kIHNpbWlsYXJcbiAgICAgICAgICAgIC8vIHRvIFwiZGVib3VuY2luZ1wiIHRoZSB1cGRhdGVcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChwZW5kaW5nVXBkYXRlKTtcblxuICAgICAgICAgICAgcGVuZGluZ1VwZGF0ZSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF9zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgICAgICAgICAgdXBkYXRlUGFyZW50KHN0YXR1cyk7XG4gICAgICAgICAgICAgICAgdXBkYXRlU3BhbihzdGF0dXMsIGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcGVuZGluZ1VwZGF0ZSA9IG51bGw7XG4gICAgICAgICAgICB9LCBjb25maWd1cmF0aW9uLmRlbGF5IHx8IG5vZC5jb25zdGFudHMuREVMQVkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3Vic2NyaWJlVG8gKGlkKSB7XG4gICAgICAgIG1lZGlhdG9yLnN1YnNjcmliZShpZCwgc2V0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRNZXNzYWdlT3B0aW9ucyAocGFyZW50Q29udGFpbmVyLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChwYXJlbnRDb250YWluZXIpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IG5vZC5nZXRFbGVtZW50KHBhcmVudENvbnRhaW5lcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICAgICAgc3Bhbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNwYW4pOyAgICAgIC8vIFJlbW92ZSBvbGQgc3Bhbi5cbiAgICAgICAgICAgIHNwYW4gPSBub2QuZ2V0RWxlbWVudChtZXNzYWdlKTsgICAgICAgICAvLyBTZXQgdGhlIG5ldyBvbmUuXG4gICAgICAgICAgICBjdXN0b21TcGFuID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgLy8gU28gd2Ugd29uJ3QgZGVsZXRlIGl0LlxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGlzcG9zZSAoKSB7XG4gICAgICAgIC8vIEZpcnN0IHJlbW92ZSBhbnkgY2xhc3Nlc1xuICAgICAgICBub2QucmVtb3ZlQ2xhc3MoY29uZmlndXJhdGlvbi5lcnJvckNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBub2QuY2xhc3Nlcy5lcnJvckNsYXNzLCBwYXJlbnQpO1xuICAgICAgICBub2QucmVtb3ZlQ2xhc3MoY29uZmlndXJhdGlvbi5zdWNjZXNzQ2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IG5vZC5jbGFzc2VzLnN1Y2Nlc3NDbGFzcywgcGFyZW50KTtcblxuICAgICAgICAvLyBUaGVuIHdlIHJlbW92ZSB0aGUgc3BhbiBpZiBpdCB3YXNuJ3Qgb25lIHRoYXQgd2FzIHNldCBieSB0aGUgdXNlci5cbiAgICAgICAgLy8gSWYgYG5vRG9tYCB3YXMgdXNlZCwgdGhlbiB0aGVyZSB3b24ndCBiZSBhbnkgdG8gcmVtb3ZlLlxuICAgICAgICBpZiAoc3Bhbi5wYXJlbnROb2RlICYmICFjdXN0b21TcGFuKSB7XG4gICAgICAgICAgICBzcGFuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3Bhbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzdWJzY3JpYmVUbzogICAgICAgIHN1YnNjcmliZVRvLFxuICAgICAgICBlbGVtZW50OiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHNldE1lc3NhZ2VPcHRpb25zOiAgc2V0TWVzc2FnZU9wdGlvbnMsXG4gICAgICAgIGRpc3Bvc2U6ICAgICAgICAgICAgZGlzcG9zZSxcbiAgICAgICAgc2V0OiAgICAgICAgICAgICAgICBzZXRcbiAgICB9O1xufTtcblxubm9kLm1ha2VFdmVudEVtaXR0ZXIgPSBmdW5jdGlvbiAobWVkaWF0b3IpIHtcbiAgICB2YXIgY3VzdG9tRXZlbnQ7XG5cbiAgICBmdW5jdGlvbiBlbWl0IChvcHRpb25zKSB7XG4gICAgICAgIGlmIChDdXN0b21FdmVudCkge1xuICAgICAgICAgICAgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ25vZC52YWxpZGF0aW9uJywge2RldGFpbDogb3B0aW9uc30pO1xuXG4gICAgICAgICAgICBvcHRpb25zLmVsZW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgZXJyb3JNc2cgPSAnbm9kLnZhbGlkYXRlIHRyaWVkIHRvIGZpcmUgYSBjdXN0b20gZXZlbnQsIGJ1dCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IEN1c3RvbUV2ZW50XFwncyc7XG5cbiAgICAgICAgICAgIHRocm93IEVycm9yKGVycm9yTXNnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN1YnNjcmliZSAoaWQpIHtcbiAgICAgICAgbWVkaWF0b3Iuc3Vic2NyaWJlKGlkLCBlbWl0KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzdWJzY3JpYmU6IHN1YnNjcmliZVxuICAgIH07XG59O1xuXG4vKipcbiAqIGdldEVsZW1lbnRcbiAqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IHRhcmdldGVkIGJ5IHRoZSBzZWxlY3Rvci4gKHNlZSBgZ2V0RWxlbWVudHNgKVxuICovXG5ub2QuZ2V0RWxlbWVudCA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHJldHVybiBub2QuZ2V0RWxlbWVudHMoc2VsZWN0b3IpWzBdO1xufTtcblxuLyoqXG4gKiBnZXRFbGVtZW50c1xuICpcbiAqIFRha2VzIHNvbWUgc29ydCBvZiBzZWxlY3RvciwgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgZWxlbWVudChzKS4gVGhlIGFwcGxpZWRcbiAqIHNlbGVjdG9yIGNhbiBiZSBvbmUgb2Y6XG4gKlxuICogLSBDc3MgdHlwZSBzZWxlY3RvciAoZS5nLiwgXCIuZm9vXCIpXG4gKiAtIEEgalF1ZXJ5IGVsZW1lbnQgKGUuZy4sICQoJy5mb28pKVxuICogLSBBIHNpbmdsZSByYXcgZG9tIGVsZW1lbnQgKGUuZy4sIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb28nKSlcbiAqIC0gQSBsaXN0IG9mIHJhdyBkb20gZWxlbWVudCAoZS5nLiwgJCgnLmZvbycpLmdldCgpKVxuICovXG5ub2QuZ2V0RWxlbWVudHMgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICBpZiAoIXNlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWwgY3NzIHR5cGUgc2VsZWN0b3IgaXMgYXNzdW1lZFxuICAgIGlmICh0eXBlb2Ygc2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgalF1ZXJ5LCB0aGVuIHdlIHVzZSB0aGF0IHRvIGNyZWF0ZSBhIGRvbSBsaXN0IGZvciB1cy5cbiAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkpIHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cualF1ZXJ5KHNlbGVjdG9yKS5nZXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG5vdCwgdGhlbiB3ZSBkbyBpdCB0aGUgbWFudWFsIHdheS5cbiAgICAgICAgdmFyIG5vZGVMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG5cbiAgICAgICAgcmV0dXJuIFtdLm1hcC5jYWxsKG5vZGVMaXN0LCBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gaWYgdXNlciBnYXZlIHVzIGpRdWVyeSBlbGVtZW50c1xuICAgIGlmIChzZWxlY3Rvci5qcXVlcnkpIHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yLmdldCgpO1xuICAgIH1cblxuICAgIC8vIFJhdyBET00gZWxlbWVudFxuICAgIGlmIChzZWxlY3Rvci5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICByZXR1cm4gW3NlbGVjdG9yXTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3RvcikpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gICAgICAgIHNlbGVjdG9yLmZvckVhY2goZnVuY3Rpb24gKHNlbCkge1xuICAgICAgICAgICAgdmFyIGVsZW1lbnRzID0gbm9kLmdldEVsZW1lbnRzKHNlbCk7XG5cbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoZWxlbWVudHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHRocm93IEVycm9yKCdVbmtub3duIHR5cGUgb2YgZWxlbWVudHMgaW4geW91ciBgc2VsZWN0b3JgOiAnICsgc2VsZWN0b3IpO1xufTtcblxubm9kLmdldENoZWNrRnVuY3Rpb24gPSBmdW5jdGlvbiAobWV0cmljKSB7XG4gICAgaWYgKHR5cGVvZiBtZXRyaWMudmFsaWRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG1ldHJpYy52YWxpZGF0ZTtcbiAgICB9XG5cbiAgICBpZiAobWV0cmljLnZhbGlkYXRlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHJldHVybiBub2QuY2hlY2tGdW5jdGlvbnMucmVnZXhwKG1ldHJpYy52YWxpZGF0ZSk7XG4gICAgfVxuXG4gICAgdmFyIGFyZ3MgICA9IG1ldHJpYy52YWxpZGF0ZS5zcGxpdCgnOicpLFxuICAgICAgICBmbk5hbWUgPSBhcmdzLnNoaWZ0KCk7XG5cbiAgICBpZiAoZm5OYW1lID09PSAnb25lLW9mJyB8fCBmbk5hbWUgPT09ICdvbmx5LW9uZS1vZicgfHxcbiAgICAgICAgZm5OYW1lID09PSAnc2FtZS1hcycgfHwgZm5OYW1lID09PSAnc29tZS1yYWRpbycpIHtcbiAgICAgICAgYXJncy5wdXNoKG1ldHJpYy5zZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBub2QuY2hlY2tGdW5jdGlvbnNbZm5OYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbm9kLmNoZWNrRnVuY3Rpb25zW2ZuTmFtZV0uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGVycm9yTXNnID0gJ0NvdWxkblxcJ3QgZmluZCB5b3VyIHZhbGlkYXRvciBmdW5jdGlvbiBcIicgK1xuICAgICAgICAgICAgICAgICAgICAgICBmbk5hbWUgKyAnXCIgZm9yIFwiJyArIG1ldHJpYy5zZWxlY3RvciArICdcIic7XG5cbiAgICAgICAgdGhyb3cgRXJyb3IoZXJyb3JNc2cpO1xuICAgIH1cbn07XG5cbi8vIENvbGxlY3Rpb24gb2YgYnVpbHQtaW4gY2hlY2sgZnVuY3Rpb25zXG5ub2QuY2hlY2tGdW5jdGlvbnMgPSB7XG4gICAgJ3ByZXNlbmNlJzogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gcHJlc2VuY2UgKGNhbGxiYWNrLCB2YWx1ZSkge1xuICAgICAgICAgICAgY2FsbGJhY2sodmFsdWUubGVuZ3RoID4gMCk7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgICdleGFjdCc6IGZ1bmN0aW9uIChleGFjdFZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBleGFjdCAoY2FsbGJhY2ssIHZhbHVlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayh2YWx1ZSA9PT0gZXhhY3RWYWx1ZSk7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgICdjb250YWlucyc6IGZ1bmN0aW9uIChjb250YWluc1ZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBjb250YWlucyAoY2FsbGJhY2ssIHZhbHVlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayh2YWx1ZS5pbmRleE9mKGNvbnRhaW5zVmFsdWUpID4gLTEpO1xuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAnbm90JzogZnVuY3Rpb24gKGV4YWN0VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5vdCAoY2FsbGJhY2ssIHZhbHVlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayh2YWx1ZSAhPT0gZXhhY3RWYWx1ZSk7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgICdtaW4tbGVuZ3RoJzogZnVuY3Rpb24gKG1pbmltdW1MZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG1pbkxlbmd0aCAoY2FsbGJhY2ssIHZhbHVlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayh2YWx1ZS5sZW5ndGggPj0gbWluaW11bUxlbmd0aCk7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgICdtYXgtbGVuZ3RoJzogZnVuY3Rpb24gKG1heGltdW1MZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG1heExlbmd0aCAoY2FsbGJhY2ssIHZhbHVlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayh2YWx1ZS5sZW5ndGggPD0gbWF4aW11bUxlbmd0aCk7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgICdleGFjdC1sZW5ndGgnOiBmdW5jdGlvbiAoZXhhY3RMZW4pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGV4YWN0TGVuZ3RoIChjYWxsYmFjaywgdmFsdWUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHZhbHVlLmxlbmd0aCA9PT0gK2V4YWN0TGVuKTtcbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgJ2JldHdlZW4tbGVuZ3RoJzogZnVuY3Rpb24gKG1pbmltdW1MZW5ndGgsIG1heGltdW1MZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGJldHdlZW5MZW5ndGggKGNhbGxiYWNrLCB2YWx1ZSkge1xuICAgICAgICAgICAgdmFyIGFib3ZlTWluTGVuZ3RoID0gdmFsdWUubGVuZ3RoID49IG1pbmltdW1MZW5ndGgsXG4gICAgICAgICAgICAgICAgYmVsb3dNYXhMZW5ndGggPSB2YWx1ZS5sZW5ndGggPD0gbWF4aW11bUxlbmd0aDtcblxuICAgICAgICAgICAgY2FsbGJhY2soYWJvdmVNaW5MZW5ndGggJiYgYmVsb3dNYXhMZW5ndGgpO1xuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAnbWF4LW51bWJlcic6IGZ1bmN0aW9uIChtYXhpbXVtTnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBtYXhOdW1iZXIgKGNhbGxiYWNrLCB2YWx1ZSkge1xuICAgICAgICAgICAgY2FsbGJhY2soK3ZhbHVlIDw9IG1heGltdW1OdW1iZXIpO1xuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAnbWluLW51bWJlcic6IGZ1bmN0aW9uIChtaW5pbXVtTnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBtaW5OdW1iZXIgKGNhbGxiYWNrLCB2YWx1ZSkge1xuICAgICAgICAgICAgY2FsbGJhY2soK3ZhbHVlID49IG1pbmltdW1OdW1iZXIpO1xuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAnYmV0d2Vlbi1udW1iZXInOiBmdW5jdGlvbiAobWluaW11bU51bWJlciwgbWF4aW11bU51bWJlcikge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gYmV0d2Vlbk51bWJlciAoY2FsbGJhY2ssIHZhbHVlKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygrdmFsdWUgPj0gbWluaW11bU51bWJlciAmJiArdmFsdWUgPD0gbWF4aW11bU51bWJlcik7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgICdpbnRlZ2VyJzogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNhbGxiYWNrLCB2YWx1ZSkge1xuICAgICAgICAgICAgY2FsbGJhY2soL15cXHMqXFxkK1xccyokLy50ZXN0KHZhbHVlKSk7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgICdmbG9hdCc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjYWxsYmFjaywgdmFsdWUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKC9eWy0rXT9bMC05XSsoXFwuWzAtOV0rKT8kLy50ZXN0KHZhbHVlKSk7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgICdzYW1lLWFzJzogZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgICAgIHZhciBzYW1lQXNFbGVtZW50ID0gbm9kLmdldEVsZW1lbnQoc2VsZWN0b3IpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBzYW1lQXMgKGNhbGxiYWNrLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICAgICAgLy8gJ3NhbWUtYXMnIGlzIHNwZWNpYWwsIGluIHRoYXQgaWYgaXQgaXMgdHJpZ2dlcmVkIGJ5IGFub3RoZXIgZmllbGRcbiAgICAgICAgICAgIC8vICh0aGUgb25lIGl0IHNob3VsZCBiZSBzaW1pbGFyIHRvKSwgYW5kIHRoZSBmaWVsZCBpdHNlbGYgaXMgZW1wdHksXG4gICAgICAgICAgICAvLyB0aGVuIGl0IGJhaWxzIG91dCB3aXRob3V0IGEgY2hlY2suIFRoaXMgaXMgdG8gYXZvaWQgc2hvd2luZyBhblxuICAgICAgICAgICAgLy8gZXJyb3IgbWVzc2FnZSBiZWZvcmUgdGhlIHVzZXIgaGFzIGV2ZW4gcmVhY2hlZCB0aGUgZWxlbWVudC5cbiAgICAgICAgICAgIGlmIChvcHRpb25zICYmXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ldmVudCAmJlxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZXZlbnQudGFyZ2V0ICYmXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ldmVudC50YXJnZXQgIT09IG9wdGlvbnMuZWxlbWVudCAmJlxuICAgICAgICAgICAgICAgIHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FsbGJhY2sodmFsdWUgPT09IHNhbWVBc0VsZW1lbnQudmFsdWUpO1xuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAnb25lLW9mJzogZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgICAgIHZhciBlbGVtZW50cyA9IG5vZC5nZXRFbGVtZW50cyhzZWxlY3Rvcik7XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0VmFsdWVzICgpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWVtbyArICcnICsgKGVsZW1lbnQudmFsdWUgfHwgJycpO1xuICAgICAgICAgICAgfSwgJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG9uZU9mIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2soZ2V0VmFsdWVzKCkudHJpbSgpLmxlbmd0aCA+IDApO1xuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAnb25seS1vbmUtb2YnOiBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRzID0gbm9kLmdldEVsZW1lbnRzKHNlbGVjdG9yKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gb25seU9uZU9mIChjYWxsYmFjaywgdmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBudW1PZlZhbHVlcyA9IDA7XG5cbiAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBudW1PZlZhbHVlcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhudW1PZlZhbHVlcyA9PT0gMSk7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgICdjaGVja2VkJzogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gY2hlY2tlZCAoY2FsbGJhY2ssIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhvcHRpb25zLmVsZW1lbnQuY2hlY2tlZCk7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgICdzb21lLXJhZGlvJzogZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgICAgIHZhciByYWRpb0VsZW1lbnRzID0gbm9kLmdldEVsZW1lbnRzKHNlbGVjdG9yKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gc29tZVJhZGlvIChjYWxsYmFjaywgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSByYWRpb0VsZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAobWVtbywgZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZW1vIHx8IGVsZW1lbnQuY2hlY2tlZDtcbiAgICAgICAgICAgIH0sIGZhbHNlKTtcblxuICAgICAgICAgICAgY2FsbGJhY2socmVzdWx0KTtcbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgJ3JlZ2V4cCc6IGZ1bmN0aW9uIChyZWcpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHJlZ0V4cCAoY2FsbGJhY2ssIHZhbHVlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhyZWcudGVzdCh2YWx1ZSkpO1xuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAnZW1haWwnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBSRkM4MjIgPSAvXihbXlxceDAwLVxceDIwXFx4MjJcXHgyOFxceDI5XFx4MmNcXHgyZVxceDNhLVxceDNjXFx4M2VcXHg0MFxceDViLVxceDVkXFx4N2YtXFx4ZmZdK3xcXHgyMihbXlxceDBkXFx4MjJcXHg1Y1xceDgwLVxceGZmXXxcXHg1Y1tcXHgwMC1cXHg3Zl0pKlxceDIyKShcXHgyZShbXlxceDAwLVxceDIwXFx4MjJcXHgyOFxceDI5XFx4MmNcXHgyZVxceDNhLVxceDNjXFx4M2VcXHg0MFxceDViLVxceDVkXFx4N2YtXFx4ZmZdK3xcXHgyMihbXlxceDBkXFx4MjJcXHg1Y1xceDgwLVxceGZmXXxcXHg1Y1tcXHgwMC1cXHg3Zl0pKlxceDIyKSkqXFx4NDAoW15cXHgwMC1cXHgyMFxceDIyXFx4MjhcXHgyOVxceDJjXFx4MmVcXHgzYS1cXHgzY1xceDNlXFx4NDBcXHg1Yi1cXHg1ZFxceDdmLVxceGZmXSt8XFx4NWIoW15cXHgwZFxceDViLVxceDVkXFx4ODAtXFx4ZmZdfFxceDVjW1xceDAwLVxceDdmXSkqXFx4NWQpKFxceDJlKFteXFx4MDAtXFx4MjBcXHgyMlxceDI4XFx4MjlcXHgyY1xceDJlXFx4M2EtXFx4M2NcXHgzZVxceDQwXFx4NWItXFx4NWRcXHg3Zi1cXHhmZl0rfFxceDViKFteXFx4MGRcXHg1Yi1cXHg1ZFxceDgwLVxceGZmXXxcXHg1Y1tcXHgwMC1cXHg3Zl0pKlxceDVkKSkqJC87XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGVtYWlsIChjYWxsYmFjaywgdmFsdWUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKFJGQzgyMi50ZXN0KHZhbHVlKSk7XG4gICAgICAgIH07XG4gICAgfVxufTtcblxuLy8gQ3VzdG9tRXZlbnQgcG9seWZpbGwgZm9yIG9sZGVyIElFIHZlcnNpb25zLiBUYWtlbiBmcm9tXG4vLyBnaXRodWIuY29tL2Q0dG9jY2hpbmkvY3VzdG9tZXZlbnQtcG9seWZpbGwvYmxvYi9tYXN0ZXIvQ3VzdG9tRXZlbnQuanNcbnRyeSB7XG4gICAgbmV3IEN1c3RvbUV2ZW50KFwidGVzdFwiKTtcbn0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgQ3VzdG9tRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIHBhcmFtcykge1xuICAgICAgICB2YXIgZXZ0O1xuICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge1xuICAgICAgICAgICAgYnViYmxlczogZmFsc2UsXG4gICAgICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGRldGFpbDogdW5kZWZpbmVkXG4gICAgICAgIH07XG5cbiAgICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJDdXN0b21FdmVudFwiKTtcbiAgICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuYnViYmxlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY2FuY2VsYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZGV0YWlsKTtcbiAgICAgICAgcmV0dXJuIGV2dDtcbiAgICB9O1xuXG4gICAgQ3VzdG9tRXZlbnQucHJvdG90eXBlID0gd2luZG93LkV2ZW50LnByb3RvdHlwZTtcbiAgICB3aW5kb3cuQ3VzdG9tRXZlbnQgPSBDdXN0b21FdmVudDtcbn1cblxuLy8gU2FmZWx5IGV4cG9ydCBub2QuXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IG5vZDtcbn1cbiIsInZhciBoYXNNYXAgPSB0eXBlb2YgTWFwID09PSAnZnVuY3Rpb24nICYmIE1hcC5wcm90b3R5cGU7XG52YXIgbWFwU2l6ZURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmIGhhc01hcCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTWFwLnByb3RvdHlwZSwgJ3NpemUnKSA6IG51bGw7XG52YXIgbWFwU2l6ZSA9IGhhc01hcCAmJiBtYXBTaXplRGVzY3JpcHRvciAmJiB0eXBlb2YgbWFwU2l6ZURlc2NyaXB0b3IuZ2V0ID09PSAnZnVuY3Rpb24nID8gbWFwU2l6ZURlc2NyaXB0b3IuZ2V0IDogbnVsbDtcbnZhciBtYXBGb3JFYWNoID0gaGFzTWFwICYmIE1hcC5wcm90b3R5cGUuZm9yRWFjaDtcbnZhciBoYXNTZXQgPSB0eXBlb2YgU2V0ID09PSAnZnVuY3Rpb24nICYmIFNldC5wcm90b3R5cGU7XG52YXIgc2V0U2l6ZURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmIGhhc1NldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoU2V0LnByb3RvdHlwZSwgJ3NpemUnKSA6IG51bGw7XG52YXIgc2V0U2l6ZSA9IGhhc1NldCAmJiBzZXRTaXplRGVzY3JpcHRvciAmJiB0eXBlb2Ygc2V0U2l6ZURlc2NyaXB0b3IuZ2V0ID09PSAnZnVuY3Rpb24nID8gc2V0U2l6ZURlc2NyaXB0b3IuZ2V0IDogbnVsbDtcbnZhciBzZXRGb3JFYWNoID0gaGFzU2V0ICYmIFNldC5wcm90b3R5cGUuZm9yRWFjaDtcbnZhciBoYXNXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgJiYgV2Vha01hcC5wcm90b3R5cGU7XG52YXIgd2Vha01hcEhhcyA9IGhhc1dlYWtNYXAgPyBXZWFrTWFwLnByb3RvdHlwZS5oYXMgOiBudWxsO1xudmFyIGhhc1dlYWtTZXQgPSB0eXBlb2YgV2Vha1NldCA9PT0gJ2Z1bmN0aW9uJyAmJiBXZWFrU2V0LnByb3RvdHlwZTtcbnZhciB3ZWFrU2V0SGFzID0gaGFzV2Vha1NldCA/IFdlYWtTZXQucHJvdG90eXBlLmhhcyA6IG51bGw7XG52YXIgaGFzV2Vha1JlZiA9IHR5cGVvZiBXZWFrUmVmID09PSAnZnVuY3Rpb24nICYmIFdlYWtSZWYucHJvdG90eXBlO1xudmFyIHdlYWtSZWZEZXJlZiA9IGhhc1dlYWtSZWYgPyBXZWFrUmVmLnByb3RvdHlwZS5kZXJlZiA6IG51bGw7XG52YXIgYm9vbGVhblZhbHVlT2YgPSBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mO1xudmFyIG9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBmdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyICRtYXRjaCA9IFN0cmluZy5wcm90b3R5cGUubWF0Y2g7XG52YXIgJHNsaWNlID0gU3RyaW5nLnByb3RvdHlwZS5zbGljZTtcbnZhciAkcmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcbnZhciAkdG9VcHBlckNhc2UgPSBTdHJpbmcucHJvdG90eXBlLnRvVXBwZXJDYXNlO1xudmFyICR0b0xvd2VyQ2FzZSA9IFN0cmluZy5wcm90b3R5cGUudG9Mb3dlckNhc2U7XG52YXIgJHRlc3QgPSBSZWdFeHAucHJvdG90eXBlLnRlc3Q7XG52YXIgJGNvbmNhdCA9IEFycmF5LnByb3RvdHlwZS5jb25jYXQ7XG52YXIgJGpvaW4gPSBBcnJheS5wcm90b3R5cGUuam9pbjtcbnZhciAkYXJyU2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgJGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBiaWdJbnRWYWx1ZU9mID0gdHlwZW9mIEJpZ0ludCA9PT0gJ2Z1bmN0aW9uJyA/IEJpZ0ludC5wcm90b3R5cGUudmFsdWVPZiA6IG51bGw7XG52YXIgZ09QUyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgc3ltVG9TdHJpbmcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnID8gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZyA6IG51bGw7XG52YXIgaGFzU2hhbW1lZFN5bWJvbHMgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdvYmplY3QnO1xuLy8gaWUsIGBoYXMtdG9zdHJpbmd0YWcvc2hhbXNcbnZhciB0b1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnICYmICh0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnID09PSBoYXNTaGFtbWVkU3ltYm9scyA/ICdvYmplY3QnIDogJ3N5bWJvbCcpXG4gICAgPyBTeW1ib2wudG9TdHJpbmdUYWdcbiAgICA6IG51bGw7XG52YXIgaXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxudmFyIGdQTyA9ICh0eXBlb2YgUmVmbGVjdCA9PT0gJ2Z1bmN0aW9uJyA/IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YgOiBPYmplY3QuZ2V0UHJvdG90eXBlT2YpIHx8IChcbiAgICBbXS5fX3Byb3RvX18gPT09IEFycmF5LnByb3RvdHlwZSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvXG4gICAgICAgID8gZnVuY3Rpb24gKE8pIHtcbiAgICAgICAgICAgIHJldHVybiBPLl9fcHJvdG9fXzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b1xuICAgICAgICB9XG4gICAgICAgIDogbnVsbFxuKTtcblxuZnVuY3Rpb24gYWRkTnVtZXJpY1NlcGFyYXRvcihudW0sIHN0cikge1xuICAgIGlmIChcbiAgICAgICAgbnVtID09PSBJbmZpbml0eVxuICAgICAgICB8fCBudW0gPT09IC1JbmZpbml0eVxuICAgICAgICB8fCBudW0gIT09IG51bVxuICAgICAgICB8fCAobnVtICYmIG51bSA+IC0xMDAwICYmIG51bSA8IDEwMDApXG4gICAgICAgIHx8ICR0ZXN0LmNhbGwoL2UvLCBzdHIpXG4gICAgKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIHZhciBzZXBSZWdleCA9IC9bMC05XSg/PSg/OlswLTldezN9KSsoPyFbMC05XSkpL2c7XG4gICAgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInKSB7XG4gICAgICAgIHZhciBpbnQgPSBudW0gPCAwID8gLSRmbG9vcigtbnVtKSA6ICRmbG9vcihudW0pOyAvLyB0cnVuYyhudW0pXG4gICAgICAgIGlmIChpbnQgIT09IG51bSkge1xuICAgICAgICAgICAgdmFyIGludFN0ciA9IFN0cmluZyhpbnQpO1xuICAgICAgICAgICAgdmFyIGRlYyA9ICRzbGljZS5jYWxsKHN0ciwgaW50U3RyLmxlbmd0aCArIDEpO1xuICAgICAgICAgICAgcmV0dXJuICRyZXBsYWNlLmNhbGwoaW50U3RyLCBzZXBSZWdleCwgJyQmXycpICsgJy4nICsgJHJlcGxhY2UuY2FsbCgkcmVwbGFjZS5jYWxsKGRlYywgLyhbMC05XXszfSkvZywgJyQmXycpLCAvXyQvLCAnJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICRyZXBsYWNlLmNhbGwoc3RyLCBzZXBSZWdleCwgJyQmXycpO1xufVxuXG52YXIgdXRpbEluc3BlY3QgPSByZXF1aXJlKCcuL3V0aWwuaW5zcGVjdCcpO1xudmFyIGluc3BlY3RDdXN0b20gPSB1dGlsSW5zcGVjdC5jdXN0b207XG52YXIgaW5zcGVjdFN5bWJvbCA9IGlzU3ltYm9sKGluc3BlY3RDdXN0b20pID8gaW5zcGVjdEN1c3RvbSA6IG51bGw7XG5cbnZhciBxdW90ZXMgPSB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgICdkb3VibGUnOiAnXCInLFxuICAgIHNpbmdsZTogXCInXCJcbn07XG52YXIgcXVvdGVSRXMgPSB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgICdkb3VibGUnOiAvKFtcIlxcXFxdKS9nLFxuICAgIHNpbmdsZTogLyhbJ1xcXFxdKS9nXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluc3BlY3RfKG9iaiwgb3B0aW9ucywgZGVwdGgsIHNlZW4pIHtcbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBpZiAoaGFzKG9wdHMsICdxdW90ZVN0eWxlJykgJiYgIWhhcyhxdW90ZXMsIG9wdHMucXVvdGVTdHlsZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwicXVvdGVTdHlsZVwiIG11c3QgYmUgXCJzaW5nbGVcIiBvciBcImRvdWJsZVwiJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICAgaGFzKG9wdHMsICdtYXhTdHJpbmdMZW5ndGgnKSAmJiAodHlwZW9mIG9wdHMubWF4U3RyaW5nTGVuZ3RoID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgPyBvcHRzLm1heFN0cmluZ0xlbmd0aCA8IDAgJiYgb3B0cy5tYXhTdHJpbmdMZW5ndGggIT09IEluZmluaXR5XG4gICAgICAgICAgICA6IG9wdHMubWF4U3RyaW5nTGVuZ3RoICE9PSBudWxsXG4gICAgICAgIClcbiAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwibWF4U3RyaW5nTGVuZ3RoXCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgSW5maW5pdHksIG9yIGBudWxsYCcpO1xuICAgIH1cbiAgICB2YXIgY3VzdG9tSW5zcGVjdCA9IGhhcyhvcHRzLCAnY3VzdG9tSW5zcGVjdCcpID8gb3B0cy5jdXN0b21JbnNwZWN0IDogdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGN1c3RvbUluc3BlY3QgIT09ICdib29sZWFuJyAmJiBjdXN0b21JbnNwZWN0ICE9PSAnc3ltYm9sJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJjdXN0b21JbnNwZWN0XCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGB0cnVlYCwgYGZhbHNlYCwgb3IgYFxcJ3N5bWJvbFxcJ2AnKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAgIGhhcyhvcHRzLCAnaW5kZW50JylcbiAgICAgICAgJiYgb3B0cy5pbmRlbnQgIT09IG51bGxcbiAgICAgICAgJiYgb3B0cy5pbmRlbnQgIT09ICdcXHQnXG4gICAgICAgICYmICEocGFyc2VJbnQob3B0cy5pbmRlbnQsIDEwKSA9PT0gb3B0cy5pbmRlbnQgJiYgb3B0cy5pbmRlbnQgPiAwKVxuICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJpbmRlbnRcIiBtdXN0IGJlIFwiXFxcXHRcIiwgYW4gaW50ZWdlciA+IDAsIG9yIGBudWxsYCcpO1xuICAgIH1cbiAgICBpZiAoaGFzKG9wdHMsICdudW1lcmljU2VwYXJhdG9yJykgJiYgdHlwZW9mIG9wdHMubnVtZXJpY1NlcGFyYXRvciAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcIm51bWVyaWNTZXBhcmF0b3JcIiwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYHRydWVgIG9yIGBmYWxzZWAnKTtcbiAgICB9XG4gICAgdmFyIG51bWVyaWNTZXBhcmF0b3IgPSBvcHRzLm51bWVyaWNTZXBhcmF0b3I7XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIG9iaiA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpbnNwZWN0U3RyaW5nKG9iaiwgb3B0cyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAob2JqID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gSW5maW5pdHkgLyBvYmogPiAwID8gJzAnIDogJy0wJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RyID0gU3RyaW5nKG9iaik7XG4gICAgICAgIHJldHVybiBudW1lcmljU2VwYXJhdG9yID8gYWRkTnVtZXJpY1NlcGFyYXRvcihvYmosIHN0cikgOiBzdHI7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYmlnaW50Jykge1xuICAgICAgICB2YXIgYmlnSW50U3RyID0gU3RyaW5nKG9iaikgKyAnbic7XG4gICAgICAgIHJldHVybiBudW1lcmljU2VwYXJhdG9yID8gYWRkTnVtZXJpY1NlcGFyYXRvcihvYmosIGJpZ0ludFN0cikgOiBiaWdJbnRTdHI7XG4gICAgfVxuXG4gICAgdmFyIG1heERlcHRoID0gdHlwZW9mIG9wdHMuZGVwdGggPT09ICd1bmRlZmluZWQnID8gNSA6IG9wdHMuZGVwdGg7XG4gICAgaWYgKHR5cGVvZiBkZXB0aCA9PT0gJ3VuZGVmaW5lZCcpIHsgZGVwdGggPSAwOyB9XG4gICAgaWYgKGRlcHRoID49IG1heERlcHRoICYmIG1heERlcHRoID4gMCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gaXNBcnJheShvYmopID8gJ1tBcnJheV0nIDogJ1tPYmplY3RdJztcbiAgICB9XG5cbiAgICB2YXIgaW5kZW50ID0gZ2V0SW5kZW50KG9wdHMsIGRlcHRoKTtcblxuICAgIGlmICh0eXBlb2Ygc2VlbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2VlbiA9IFtdO1xuICAgIH0gZWxzZSBpZiAoaW5kZXhPZihzZWVuLCBvYmopID49IDApIHtcbiAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnNwZWN0KHZhbHVlLCBmcm9tLCBub0luZGVudCkge1xuICAgICAgICBpZiAoZnJvbSkge1xuICAgICAgICAgICAgc2VlbiA9ICRhcnJTbGljZS5jYWxsKHNlZW4pO1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub0luZGVudCkge1xuICAgICAgICAgICAgdmFyIG5ld09wdHMgPSB7XG4gICAgICAgICAgICAgICAgZGVwdGg6IG9wdHMuZGVwdGhcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoaGFzKG9wdHMsICdxdW90ZVN0eWxlJykpIHtcbiAgICAgICAgICAgICAgICBuZXdPcHRzLnF1b3RlU3R5bGUgPSBvcHRzLnF1b3RlU3R5bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW5zcGVjdF8odmFsdWUsIG5ld09wdHMsIGRlcHRoICsgMSwgc2Vlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3BlY3RfKHZhbHVlLCBvcHRzLCBkZXB0aCArIDEsIHNlZW4pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nICYmICFpc1JlZ0V4cChvYmopKSB7IC8vIGluIG9sZGVyIGVuZ2luZXMsIHJlZ2V4ZXMgYXJlIGNhbGxhYmxlXG4gICAgICAgIHZhciBuYW1lID0gbmFtZU9mKG9iaik7XG4gICAgICAgIHZhciBrZXlzID0gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpO1xuICAgICAgICByZXR1cm4gJ1tGdW5jdGlvbicgKyAobmFtZSA/ICc6ICcgKyBuYW1lIDogJyAoYW5vbnltb3VzKScpICsgJ10nICsgKGtleXMubGVuZ3RoID4gMCA/ICcgeyAnICsgJGpvaW4uY2FsbChrZXlzLCAnLCAnKSArICcgfScgOiAnJyk7XG4gICAgfVxuICAgIGlmIChpc1N5bWJvbChvYmopKSB7XG4gICAgICAgIHZhciBzeW1TdHJpbmcgPSBoYXNTaGFtbWVkU3ltYm9scyA/ICRyZXBsYWNlLmNhbGwoU3RyaW5nKG9iaiksIC9eKFN5bWJvbFxcKC4qXFwpKV9bXildKiQvLCAnJDEnKSA6IHN5bVRvU3RyaW5nLmNhbGwob2JqKTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmICFoYXNTaGFtbWVkU3ltYm9scyA/IG1hcmtCb3hlZChzeW1TdHJpbmcpIDogc3ltU3RyaW5nO1xuICAgIH1cbiAgICBpZiAoaXNFbGVtZW50KG9iaikpIHtcbiAgICAgICAgdmFyIHMgPSAnPCcgKyAkdG9Mb3dlckNhc2UuY2FsbChTdHJpbmcob2JqLm5vZGVOYW1lKSk7XG4gICAgICAgIHZhciBhdHRycyA9IG9iai5hdHRyaWJ1dGVzIHx8IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzICs9ICcgJyArIGF0dHJzW2ldLm5hbWUgKyAnPScgKyB3cmFwUXVvdGVzKHF1b3RlKGF0dHJzW2ldLnZhbHVlKSwgJ2RvdWJsZScsIG9wdHMpO1xuICAgICAgICB9XG4gICAgICAgIHMgKz0gJz4nO1xuICAgICAgICBpZiAob2JqLmNoaWxkTm9kZXMgJiYgb2JqLmNoaWxkTm9kZXMubGVuZ3RoKSB7IHMgKz0gJy4uLic7IH1cbiAgICAgICAgcyArPSAnPC8nICsgJHRvTG93ZXJDYXNlLmNhbGwoU3RyaW5nKG9iai5ub2RlTmFtZSkpICsgJz4nO1xuICAgICAgICByZXR1cm4gcztcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgICAgICBpZiAob2JqLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJ1tdJzsgfVxuICAgICAgICB2YXIgeHMgPSBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCk7XG4gICAgICAgIGlmIChpbmRlbnQgJiYgIXNpbmdsZUxpbmVWYWx1ZXMoeHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1snICsgaW5kZW50ZWRKb2luKHhzLCBpbmRlbnQpICsgJ10nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnWyAnICsgJGpvaW4uY2FsbCh4cywgJywgJykgKyAnIF0nO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcihvYmopKSB7XG4gICAgICAgIHZhciBwYXJ0cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgaWYgKCEoJ2NhdXNlJyBpbiBFcnJvci5wcm90b3R5cGUpICYmICdjYXVzZScgaW4gb2JqICYmICFpc0VudW1lcmFibGUuY2FsbChvYmosICdjYXVzZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3sgWycgKyBTdHJpbmcob2JqKSArICddICcgKyAkam9pbi5jYWxsKCRjb25jYXQuY2FsbCgnW2NhdXNlXTogJyArIGluc3BlY3Qob2JqLmNhdXNlKSwgcGFydHMpLCAnLCAnKSArICcgfSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJ1snICsgU3RyaW5nKG9iaikgKyAnXSc7IH1cbiAgICAgICAgcmV0dXJuICd7IFsnICsgU3RyaW5nKG9iaikgKyAnXSAnICsgJGpvaW4uY2FsbChwYXJ0cywgJywgJykgKyAnIH0nO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgY3VzdG9tSW5zcGVjdCkge1xuICAgICAgICBpZiAoaW5zcGVjdFN5bWJvbCAmJiB0eXBlb2Ygb2JqW2luc3BlY3RTeW1ib2xdID09PSAnZnVuY3Rpb24nICYmIHV0aWxJbnNwZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdXRpbEluc3BlY3Qob2JqLCB7IGRlcHRoOiBtYXhEZXB0aCAtIGRlcHRoIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGN1c3RvbUluc3BlY3QgIT09ICdzeW1ib2wnICYmIHR5cGVvZiBvYmouaW5zcGVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIG9iai5pbnNwZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzTWFwKG9iaikpIHtcbiAgICAgICAgdmFyIG1hcFBhcnRzID0gW107XG4gICAgICAgIGlmIChtYXBGb3JFYWNoKSB7XG4gICAgICAgICAgICBtYXBGb3JFYWNoLmNhbGwob2JqLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgICAgIG1hcFBhcnRzLnB1c2goaW5zcGVjdChrZXksIG9iaiwgdHJ1ZSkgKyAnID0+ICcgKyBpbnNwZWN0KHZhbHVlLCBvYmopKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uT2YoJ01hcCcsIG1hcFNpemUuY2FsbChvYmopLCBtYXBQYXJ0cywgaW5kZW50KTtcbiAgICB9XG4gICAgaWYgKGlzU2V0KG9iaikpIHtcbiAgICAgICAgdmFyIHNldFBhcnRzID0gW107XG4gICAgICAgIGlmIChzZXRGb3JFYWNoKSB7XG4gICAgICAgICAgICBzZXRGb3JFYWNoLmNhbGwob2JqLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzZXRQYXJ0cy5wdXNoKGluc3BlY3QodmFsdWUsIG9iaikpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25PZignU2V0Jywgc2V0U2l6ZS5jYWxsKG9iaiksIHNldFBhcnRzLCBpbmRlbnQpO1xuICAgIH1cbiAgICBpZiAoaXNXZWFrTWFwKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHdlYWtDb2xsZWN0aW9uT2YoJ1dlYWtNYXAnKTtcbiAgICB9XG4gICAgaWYgKGlzV2Vha1NldChvYmopKSB7XG4gICAgICAgIHJldHVybiB3ZWFrQ29sbGVjdGlvbk9mKCdXZWFrU2V0Jyk7XG4gICAgfVxuICAgIGlmIChpc1dlYWtSZWYob2JqKSkge1xuICAgICAgICByZXR1cm4gd2Vha0NvbGxlY3Rpb25PZignV2Vha1JlZicpO1xuICAgIH1cbiAgICBpZiAoaXNOdW1iZXIob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGluc3BlY3QoTnVtYmVyKG9iaikpKTtcbiAgICB9XG4gICAgaWYgKGlzQmlnSW50KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtCb3hlZChpbnNwZWN0KGJpZ0ludFZhbHVlT2YuY2FsbChvYmopKSk7XG4gICAgfVxuICAgIGlmIChpc0Jvb2xlYW4ob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGJvb2xlYW5WYWx1ZU9mLmNhbGwob2JqKSk7XG4gICAgfVxuICAgIGlmIChpc1N0cmluZyhvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoaW5zcGVjdChTdHJpbmcob2JqKSkpO1xuICAgIH1cbiAgICAvLyBub3RlOiBpbiBJRSA4LCBzb21ldGltZXMgYGdsb2JhbCAhPT0gd2luZG93YCBidXQgYm90aCBhcmUgdGhlIHByb3RvdHlwZXMgb2YgZWFjaCBvdGhlclxuICAgIC8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBvYmogPT09IHdpbmRvdykge1xuICAgICAgICByZXR1cm4gJ3sgW29iamVjdCBXaW5kb3ddIH0nO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAgICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqID09PSBnbG9iYWxUaGlzKVxuICAgICAgICB8fCAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqID09PSBnbG9iYWwpXG4gICAgKSB7XG4gICAgICAgIHJldHVybiAneyBbb2JqZWN0IGdsb2JhbFRoaXNdIH0nO1xuICAgIH1cbiAgICBpZiAoIWlzRGF0ZShvYmopICYmICFpc1JlZ0V4cChvYmopKSB7XG4gICAgICAgIHZhciB5cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgdmFyIGlzUGxhaW5PYmplY3QgPSBnUE8gPyBnUE8ob2JqKSA9PT0gT2JqZWN0LnByb3RvdHlwZSA6IG9iaiBpbnN0YW5jZW9mIE9iamVjdCB8fCBvYmouY29uc3RydWN0b3IgPT09IE9iamVjdDtcbiAgICAgICAgdmFyIHByb3RvVGFnID0gb2JqIGluc3RhbmNlb2YgT2JqZWN0ID8gJycgOiAnbnVsbCBwcm90b3R5cGUnO1xuICAgICAgICB2YXIgc3RyaW5nVGFnID0gIWlzUGxhaW5PYmplY3QgJiYgdG9TdHJpbmdUYWcgJiYgT2JqZWN0KG9iaikgPT09IG9iaiAmJiB0b1N0cmluZ1RhZyBpbiBvYmogPyAkc2xpY2UuY2FsbCh0b1N0cihvYmopLCA4LCAtMSkgOiBwcm90b1RhZyA/ICdPYmplY3QnIDogJyc7XG4gICAgICAgIHZhciBjb25zdHJ1Y3RvclRhZyA9IGlzUGxhaW5PYmplY3QgfHwgdHlwZW9mIG9iai5jb25zdHJ1Y3RvciAhPT0gJ2Z1bmN0aW9uJyA/ICcnIDogb2JqLmNvbnN0cnVjdG9yLm5hbWUgPyBvYmouY29uc3RydWN0b3IubmFtZSArICcgJyA6ICcnO1xuICAgICAgICB2YXIgdGFnID0gY29uc3RydWN0b3JUYWcgKyAoc3RyaW5nVGFnIHx8IHByb3RvVGFnID8gJ1snICsgJGpvaW4uY2FsbCgkY29uY2F0LmNhbGwoW10sIHN0cmluZ1RhZyB8fCBbXSwgcHJvdG9UYWcgfHwgW10pLCAnOiAnKSArICddICcgOiAnJyk7XG4gICAgICAgIGlmICh5cy5sZW5ndGggPT09IDApIHsgcmV0dXJuIHRhZyArICd7fSc7IH1cbiAgICAgICAgaWYgKGluZGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhZyArICd7JyArIGluZGVudGVkSm9pbih5cywgaW5kZW50KSArICd9JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFnICsgJ3sgJyArICRqb2luLmNhbGwoeXMsICcsICcpICsgJyB9JztcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyhvYmopO1xufTtcblxuZnVuY3Rpb24gd3JhcFF1b3RlcyhzLCBkZWZhdWx0U3R5bGUsIG9wdHMpIHtcbiAgICB2YXIgc3R5bGUgPSBvcHRzLnF1b3RlU3R5bGUgfHwgZGVmYXVsdFN0eWxlO1xuICAgIHZhciBxdW90ZUNoYXIgPSBxdW90ZXNbc3R5bGVdO1xuICAgIHJldHVybiBxdW90ZUNoYXIgKyBzICsgcXVvdGVDaGFyO1xufVxuXG5mdW5jdGlvbiBxdW90ZShzKSB7XG4gICAgcmV0dXJuICRyZXBsYWNlLmNhbGwoU3RyaW5nKHMpLCAvXCIvZywgJyZxdW90OycpO1xufVxuXG5mdW5jdGlvbiBjYW5UcnVzdFRvU3RyaW5nKG9iaikge1xuICAgIHJldHVybiAhdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiAodG9TdHJpbmdUYWcgaW4gb2JqIHx8IHR5cGVvZiBvYmpbdG9TdHJpbmdUYWddICE9PSAndW5kZWZpbmVkJykpO1xufVxuZnVuY3Rpb24gaXNBcnJheShvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEFycmF5XScgJiYgY2FuVHJ1c3RUb1N0cmluZyhvYmopOyB9XG5mdW5jdGlvbiBpc0RhdGUob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBEYXRlXScgJiYgY2FuVHJ1c3RUb1N0cmluZyhvYmopOyB9XG5mdW5jdGlvbiBpc1JlZ0V4cChvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IFJlZ0V4cF0nICYmIGNhblRydXN0VG9TdHJpbmcob2JqKTsgfVxuZnVuY3Rpb24gaXNFcnJvcihvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEVycm9yXScgJiYgY2FuVHJ1c3RUb1N0cmluZyhvYmopOyB9XG5mdW5jdGlvbiBpc1N0cmluZyhvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IFN0cmluZ10nICYmIGNhblRydXN0VG9TdHJpbmcob2JqKTsgfVxuZnVuY3Rpb24gaXNOdW1iZXIob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiBjYW5UcnVzdFRvU3RyaW5nKG9iaik7IH1cbmZ1bmN0aW9uIGlzQm9vbGVhbihvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEJvb2xlYW5dJyAmJiBjYW5UcnVzdFRvU3RyaW5nKG9iaik7IH1cblxuLy8gU3ltYm9sIGFuZCBCaWdJbnQgZG8gaGF2ZSBTeW1ib2wudG9TdHJpbmdUYWcgYnkgc3BlYywgc28gdGhhdCBjYW4ndCBiZSB1c2VkIHRvIGVsaW1pbmF0ZSBmYWxzZSBwb3NpdGl2ZXNcbmZ1bmN0aW9uIGlzU3ltYm9sKG9iaikge1xuICAgIGlmIChoYXNTaGFtbWVkU3ltYm9scykge1xuICAgICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiBpbnN0YW5jZW9mIFN5bWJvbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCAhc3ltVG9TdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBzeW1Ub1N0cmluZy5jYWxsKG9iaik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc0JpZ0ludChvYmopIHtcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCAhYmlnSW50VmFsdWVPZikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGJpZ0ludFZhbHVlT2YuY2FsbChvYmopO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkgfHwgZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5IGluIHRoaXM7IH07XG5mdW5jdGlvbiBoYXMob2JqLCBrZXkpIHtcbiAgICByZXR1cm4gaGFzT3duLmNhbGwob2JqLCBrZXkpO1xufVxuXG5mdW5jdGlvbiB0b1N0cihvYmopIHtcbiAgICByZXR1cm4gb2JqZWN0VG9TdHJpbmcuY2FsbChvYmopO1xufVxuXG5mdW5jdGlvbiBuYW1lT2YoZikge1xuICAgIGlmIChmLm5hbWUpIHsgcmV0dXJuIGYubmFtZTsgfVxuICAgIHZhciBtID0gJG1hdGNoLmNhbGwoZnVuY3Rpb25Ub1N0cmluZy5jYWxsKGYpLCAvXmZ1bmN0aW9uXFxzKihbXFx3JF0rKS8pO1xuICAgIGlmIChtKSB7IHJldHVybiBtWzFdOyB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgICBpZiAoeHMuaW5kZXhPZikgeyByZXR1cm4geHMuaW5kZXhPZih4KTsgfVxuICAgIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmICh4c1tpXSA9PT0geCkgeyByZXR1cm4gaTsgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGlzTWFwKHgpIHtcbiAgICBpZiAoIW1hcFNpemUgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgbWFwU2l6ZS5jYWxsKHgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2V0U2l6ZS5jYWxsKHgpO1xuICAgICAgICB9IGNhdGNoIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIE1hcDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzV2Vha01hcCh4KSB7XG4gICAgaWYgKCF3ZWFrTWFwSGFzIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHdlYWtNYXBIYXMuY2FsbCh4LCB3ZWFrTWFwSGFzKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdlYWtTZXRIYXMuY2FsbCh4LCB3ZWFrU2V0SGFzKTtcbiAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBXZWFrTWFwOyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNXZWFrUmVmKHgpIHtcbiAgICBpZiAoIXdlYWtSZWZEZXJlZiB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICB3ZWFrUmVmRGVyZWYuY2FsbCh4KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzU2V0KHgpIHtcbiAgICBpZiAoIXNldFNpemUgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgc2V0U2l6ZS5jYWxsKHgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbWFwU2l6ZS5jYWxsKHgpO1xuICAgICAgICB9IGNhdGNoIChtKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIFNldDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzV2Vha1NldCh4KSB7XG4gICAgaWYgKCF3ZWFrU2V0SGFzIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHdlYWtTZXRIYXMuY2FsbCh4LCB3ZWFrU2V0SGFzKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdlYWtNYXBIYXMuY2FsbCh4LCB3ZWFrTWFwSGFzKTtcbiAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBXZWFrU2V0OyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNFbGVtZW50KHgpIHtcbiAgICBpZiAoIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmICh0eXBlb2YgSFRNTEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHggaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiB4Lm5vZGVOYW1lID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgeC5nZXRBdHRyaWJ1dGUgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGluc3BlY3RTdHJpbmcoc3RyLCBvcHRzKSB7XG4gICAgaWYgKHN0ci5sZW5ndGggPiBvcHRzLm1heFN0cmluZ0xlbmd0aCkge1xuICAgICAgICB2YXIgcmVtYWluaW5nID0gc3RyLmxlbmd0aCAtIG9wdHMubWF4U3RyaW5nTGVuZ3RoO1xuICAgICAgICB2YXIgdHJhaWxlciA9ICcuLi4gJyArIHJlbWFpbmluZyArICcgbW9yZSBjaGFyYWN0ZXInICsgKHJlbWFpbmluZyA+IDEgPyAncycgOiAnJyk7XG4gICAgICAgIHJldHVybiBpbnNwZWN0U3RyaW5nKCRzbGljZS5jYWxsKHN0ciwgMCwgb3B0cy5tYXhTdHJpbmdMZW5ndGgpLCBvcHRzKSArIHRyYWlsZXI7XG4gICAgfVxuICAgIHZhciBxdW90ZVJFID0gcXVvdGVSRXNbb3B0cy5xdW90ZVN0eWxlIHx8ICdzaW5nbGUnXTtcbiAgICBxdW90ZVJFLmxhc3RJbmRleCA9IDA7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbiAgICB2YXIgcyA9ICRyZXBsYWNlLmNhbGwoJHJlcGxhY2UuY2FsbChzdHIsIHF1b3RlUkUsICdcXFxcJDEnKSwgL1tcXHgwMC1cXHgxZl0vZywgbG93Ynl0ZSk7XG4gICAgcmV0dXJuIHdyYXBRdW90ZXMocywgJ3NpbmdsZScsIG9wdHMpO1xufVxuXG5mdW5jdGlvbiBsb3dieXRlKGMpIHtcbiAgICB2YXIgbiA9IGMuY2hhckNvZGVBdCgwKTtcbiAgICB2YXIgeCA9IHtcbiAgICAgICAgODogJ2InLFxuICAgICAgICA5OiAndCcsXG4gICAgICAgIDEwOiAnbicsXG4gICAgICAgIDEyOiAnZicsXG4gICAgICAgIDEzOiAncidcbiAgICB9W25dO1xuICAgIGlmICh4KSB7IHJldHVybiAnXFxcXCcgKyB4OyB9XG4gICAgcmV0dXJuICdcXFxceCcgKyAobiA8IDB4MTAgPyAnMCcgOiAnJykgKyAkdG9VcHBlckNhc2UuY2FsbChuLnRvU3RyaW5nKDE2KSk7XG59XG5cbmZ1bmN0aW9uIG1hcmtCb3hlZChzdHIpIHtcbiAgICByZXR1cm4gJ09iamVjdCgnICsgc3RyICsgJyknO1xufVxuXG5mdW5jdGlvbiB3ZWFrQ29sbGVjdGlvbk9mKHR5cGUpIHtcbiAgICByZXR1cm4gdHlwZSArICcgeyA/IH0nO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0aW9uT2YodHlwZSwgc2l6ZSwgZW50cmllcywgaW5kZW50KSB7XG4gICAgdmFyIGpvaW5lZEVudHJpZXMgPSBpbmRlbnQgPyBpbmRlbnRlZEpvaW4oZW50cmllcywgaW5kZW50KSA6ICRqb2luLmNhbGwoZW50cmllcywgJywgJyk7XG4gICAgcmV0dXJuIHR5cGUgKyAnICgnICsgc2l6ZSArICcpIHsnICsgam9pbmVkRW50cmllcyArICd9Jztcbn1cblxuZnVuY3Rpb24gc2luZ2xlTGluZVZhbHVlcyh4cykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGluZGV4T2YoeHNbaV0sICdcXG4nKSA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldEluZGVudChvcHRzLCBkZXB0aCkge1xuICAgIHZhciBiYXNlSW5kZW50O1xuICAgIGlmIChvcHRzLmluZGVudCA9PT0gJ1xcdCcpIHtcbiAgICAgICAgYmFzZUluZGVudCA9ICdcXHQnO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdHMuaW5kZW50ID09PSAnbnVtYmVyJyAmJiBvcHRzLmluZGVudCA+IDApIHtcbiAgICAgICAgYmFzZUluZGVudCA9ICRqb2luLmNhbGwoQXJyYXkob3B0cy5pbmRlbnQgKyAxKSwgJyAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmFzZTogYmFzZUluZGVudCxcbiAgICAgICAgcHJldjogJGpvaW4uY2FsbChBcnJheShkZXB0aCArIDEpLCBiYXNlSW5kZW50KVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGluZGVudGVkSm9pbih4cywgaW5kZW50KSB7XG4gICAgaWYgKHhzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJyc7IH1cbiAgICB2YXIgbGluZUpvaW5lciA9ICdcXG4nICsgaW5kZW50LnByZXYgKyBpbmRlbnQuYmFzZTtcbiAgICByZXR1cm4gbGluZUpvaW5lciArICRqb2luLmNhbGwoeHMsICcsJyArIGxpbmVKb2luZXIpICsgJ1xcbicgKyBpbmRlbnQucHJldjtcbn1cblxuZnVuY3Rpb24gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpIHtcbiAgICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iaik7XG4gICAgdmFyIHhzID0gW107XG4gICAgaWYgKGlzQXJyKSB7XG4gICAgICAgIHhzLmxlbmd0aCA9IG9iai5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB4c1tpXSA9IGhhcyhvYmosIGkpID8gaW5zcGVjdChvYmpbaV0sIG9iaikgOiAnJztcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgc3ltcyA9IHR5cGVvZiBnT1BTID09PSAnZnVuY3Rpb24nID8gZ09QUyhvYmopIDogW107XG4gICAgdmFyIHN5bU1hcDtcbiAgICBpZiAoaGFzU2hhbW1lZFN5bWJvbHMpIHtcbiAgICAgICAgc3ltTWFwID0ge307XG4gICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgc3ltcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgc3ltTWFwWyckJyArIHN5bXNba11dID0gc3ltc1trXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICBpZiAoIWhhcyhvYmosIGtleSkpIHsgY29udGludWU7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCwgbm8tY29udGludWVcbiAgICAgICAgaWYgKGlzQXJyICYmIFN0cmluZyhOdW1iZXIoa2V5KSkgPT09IGtleSAmJiBrZXkgPCBvYmoubGVuZ3RoKSB7IGNvbnRpbnVlOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLWNvbnRpbnVlXG4gICAgICAgIGlmIChoYXNTaGFtbWVkU3ltYm9scyAmJiBzeW1NYXBbJyQnICsga2V5XSBpbnN0YW5jZW9mIFN5bWJvbCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyB0byBwcmV2ZW50IHNoYW1tZWQgU3ltYm9scywgd2hpY2ggYXJlIHN0b3JlZCBhcyBzdHJpbmdzLCBmcm9tIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBzdHJpbmcga2V5IHNlY3Rpb25cbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby1jb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKCR0ZXN0LmNhbGwoL1teXFx3JF0vLCBrZXkpKSB7XG4gICAgICAgICAgICB4cy5wdXNoKGluc3BlY3Qoa2V5LCBvYmopICsgJzogJyArIGluc3BlY3Qob2JqW2tleV0sIG9iaikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeHMucHVzaChrZXkgKyAnOiAnICsgaW5zcGVjdChvYmpba2V5XSwgb2JqKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnT1BTID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3ltcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKGlzRW51bWVyYWJsZS5jYWxsKG9iaiwgc3ltc1tqXSkpIHtcbiAgICAgICAgICAgICAgICB4cy5wdXNoKCdbJyArIGluc3BlY3Qoc3ltc1tqXSkgKyAnXTogJyArIGluc3BlY3Qob2JqW3N5bXNbal1dLCBvYmopKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geHM7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciByZXBsYWNlID0gU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlO1xudmFyIHBlcmNlbnRUd2VudGllcyA9IC8lMjAvZztcblxudmFyIEZvcm1hdCA9IHtcbiAgICBSRkMxNzM4OiAnUkZDMTczOCcsXG4gICAgUkZDMzk4NjogJ1JGQzM5ODYnXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAnZGVmYXVsdCc6IEZvcm1hdC5SRkMzOTg2LFxuICAgIGZvcm1hdHRlcnM6IHtcbiAgICAgICAgUkZDMTczODogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbGFjZS5jYWxsKHZhbHVlLCBwZXJjZW50VHdlbnRpZXMsICcrJyk7XG4gICAgICAgIH0sXG4gICAgICAgIFJGQzM5ODY6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFJGQzE3Mzg6IEZvcm1hdC5SRkMxNzM4LFxuICAgIFJGQzM5ODY6IEZvcm1hdC5SRkMzOTg2XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3RyaW5naWZ5ID0gcmVxdWlyZSgnLi9zdHJpbmdpZnknKTtcbnZhciBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKTtcbnZhciBmb3JtYXRzID0gcmVxdWlyZSgnLi9mb3JtYXRzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGZvcm1hdHM6IGZvcm1hdHMsXG4gICAgcGFyc2U6IHBhcnNlLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gICAgYWxsb3dEb3RzOiBmYWxzZSxcbiAgICBhbGxvd0VtcHR5QXJyYXlzOiBmYWxzZSxcbiAgICBhbGxvd1Byb3RvdHlwZXM6IGZhbHNlLFxuICAgIGFsbG93U3BhcnNlOiBmYWxzZSxcbiAgICBhcnJheUxpbWl0OiAyMCxcbiAgICBjaGFyc2V0OiAndXRmLTgnLFxuICAgIGNoYXJzZXRTZW50aW5lbDogZmFsc2UsXG4gICAgY29tbWE6IGZhbHNlLFxuICAgIGRlY29kZURvdEluS2V5czogZmFsc2UsXG4gICAgZGVjb2RlcjogdXRpbHMuZGVjb2RlLFxuICAgIGRlbGltaXRlcjogJyYnLFxuICAgIGRlcHRoOiA1LFxuICAgIGR1cGxpY2F0ZXM6ICdjb21iaW5lJyxcbiAgICBpZ25vcmVRdWVyeVByZWZpeDogZmFsc2UsXG4gICAgaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzOiBmYWxzZSxcbiAgICBwYXJhbWV0ZXJMaW1pdDogMTAwMCxcbiAgICBwYXJzZUFycmF5czogdHJ1ZSxcbiAgICBwbGFpbk9iamVjdHM6IGZhbHNlLFxuICAgIHN0cmljdERlcHRoOiBmYWxzZSxcbiAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IGZhbHNlLFxuICAgIHRocm93T25MaW1pdEV4Y2VlZGVkOiBmYWxzZVxufTtcblxudmFyIGludGVycHJldE51bWVyaWNFbnRpdGllcyA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyYjKFxcZCspOy9nLCBmdW5jdGlvbiAoJDAsIG51bWJlclN0cikge1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChudW1iZXJTdHIsIDEwKSk7XG4gICAgfSk7XG59O1xuXG52YXIgcGFyc2VBcnJheVZhbHVlID0gZnVuY3Rpb24gKHZhbCwgb3B0aW9ucywgY3VycmVudEFycmF5TGVuZ3RoKSB7XG4gICAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJiBvcHRpb25zLmNvbW1hICYmIHZhbC5pbmRleE9mKCcsJykgPiAtMSkge1xuICAgICAgICByZXR1cm4gdmFsLnNwbGl0KCcsJyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMudGhyb3dPbkxpbWl0RXhjZWVkZWQgJiYgY3VycmVudEFycmF5TGVuZ3RoID49IG9wdGlvbnMuYXJyYXlMaW1pdCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXJyYXkgbGltaXQgZXhjZWVkZWQuIE9ubHkgJyArIG9wdGlvbnMuYXJyYXlMaW1pdCArICcgZWxlbWVudCcgKyAob3B0aW9ucy5hcnJheUxpbWl0ID09PSAxID8gJycgOiAncycpICsgJyBhbGxvd2VkIGluIGFuIGFycmF5LicpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWw7XG59O1xuXG4vLyBUaGlzIGlzIHdoYXQgYnJvd3NlcnMgd2lsbCBzdWJtaXQgd2hlbiB0aGUg4pyTIGNoYXJhY3RlciBvY2N1cnMgaW4gYW5cbi8vIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBib2R5IGFuZCB0aGUgZW5jb2Rpbmcgb2YgdGhlIHBhZ2UgY29udGFpbmluZ1xuLy8gdGhlIGZvcm0gaXMgaXNvLTg4NTktMSwgb3Igd2hlbiB0aGUgc3VibWl0dGVkIGZvcm0gaGFzIGFuIGFjY2VwdC1jaGFyc2V0XG4vLyBhdHRyaWJ1dGUgb2YgaXNvLTg4NTktMS4gUHJlc3VtYWJseSBhbHNvIHdpdGggb3RoZXIgY2hhcnNldHMgdGhhdCBkbyBub3QgY29udGFpblxuLy8gdGhlIOKckyBjaGFyYWN0ZXIsIHN1Y2ggYXMgdXMtYXNjaWkuXG52YXIgaXNvU2VudGluZWwgPSAndXRmOD0lMjYlMjMxMDAwMyUzQic7IC8vIGVuY29kZVVSSUNvbXBvbmVudCgnJiMxMDAwMzsnKVxuXG4vLyBUaGVzZSBhcmUgdGhlIHBlcmNlbnQtZW5jb2RlZCB1dGYtOCBvY3RldHMgcmVwcmVzZW50aW5nIGEgY2hlY2ttYXJrLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3QgYWN0dWFsbHkgaXMgdXRmLTggZW5jb2RlZC5cbnZhciBjaGFyc2V0U2VudGluZWwgPSAndXRmOD0lRTIlOUMlOTMnOyAvLyBlbmNvZGVVUklDb21wb25lbnQoJ+KckycpXG5cbnZhciBwYXJzZVZhbHVlcyA9IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdWYWx1ZXMoc3RyLCBvcHRpb25zKSB7XG4gICAgdmFyIG9iaiA9IHsgX19wcm90b19fOiBudWxsIH07XG5cbiAgICB2YXIgY2xlYW5TdHIgPSBvcHRpb25zLmlnbm9yZVF1ZXJ5UHJlZml4ID8gc3RyLnJlcGxhY2UoL15cXD8vLCAnJykgOiBzdHI7XG4gICAgY2xlYW5TdHIgPSBjbGVhblN0ci5yZXBsYWNlKC8lNUIvZ2ksICdbJykucmVwbGFjZSgvJTVEL2dpLCAnXScpO1xuXG4gICAgdmFyIGxpbWl0ID0gb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdCA9PT0gSW5maW5pdHkgPyB1bmRlZmluZWQgOiBvcHRpb25zLnBhcmFtZXRlckxpbWl0O1xuICAgIHZhciBwYXJ0cyA9IGNsZWFuU3RyLnNwbGl0KFxuICAgICAgICBvcHRpb25zLmRlbGltaXRlcixcbiAgICAgICAgb3B0aW9ucy50aHJvd09uTGltaXRFeGNlZWRlZCA/IGxpbWl0ICsgMSA6IGxpbWl0XG4gICAgKTtcblxuICAgIGlmIChvcHRpb25zLnRocm93T25MaW1pdEV4Y2VlZGVkICYmIHBhcnRzLmxlbmd0aCA+IGxpbWl0KSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdQYXJhbWV0ZXIgbGltaXQgZXhjZWVkZWQuIE9ubHkgJyArIGxpbWl0ICsgJyBwYXJhbWV0ZXInICsgKGxpbWl0ID09PSAxID8gJycgOiAncycpICsgJyBhbGxvd2VkLicpO1xuICAgIH1cblxuICAgIHZhciBza2lwSW5kZXggPSAtMTsgLy8gS2VlcCB0cmFjayBvZiB3aGVyZSB0aGUgdXRmOCBzZW50aW5lbCB3YXMgZm91bmRcbiAgICB2YXIgaTtcblxuICAgIHZhciBjaGFyc2V0ID0gb3B0aW9ucy5jaGFyc2V0O1xuICAgIGlmIChvcHRpb25zLmNoYXJzZXRTZW50aW5lbCkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0c1tpXS5pbmRleE9mKCd1dGY4PScpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzW2ldID09PSBjaGFyc2V0U2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9ICd1dGYtOCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0c1tpXSA9PT0gaXNvU2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9ICdpc28tODg1OS0xJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2tpcEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBpID0gcGFydHMubGVuZ3RoOyAvLyBUaGUgZXNsaW50IHNldHRpbmdzIGRvIG5vdCBhbGxvdyBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoaSA9PT0gc2tpcEluZGV4KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFydCA9IHBhcnRzW2ldO1xuXG4gICAgICAgIHZhciBicmFja2V0RXF1YWxzUG9zID0gcGFydC5pbmRleE9mKCddPScpO1xuICAgICAgICB2YXIgcG9zID0gYnJhY2tldEVxdWFsc1BvcyA9PT0gLTEgPyBwYXJ0LmluZGV4T2YoJz0nKSA6IGJyYWNrZXRFcXVhbHNQb3MgKyAxO1xuXG4gICAgICAgIHZhciBrZXk7XG4gICAgICAgIHZhciB2YWw7XG4gICAgICAgIGlmIChwb3MgPT09IC0xKSB7XG4gICAgICAgICAgICBrZXkgPSBvcHRpb25zLmRlY29kZXIocGFydCwgZGVmYXVsdHMuZGVjb2RlciwgY2hhcnNldCwgJ2tleScpO1xuICAgICAgICAgICAgdmFsID0gb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcgPyBudWxsIDogJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBrZXkgPSBvcHRpb25zLmRlY29kZXIocGFydC5zbGljZSgwLCBwb3MpLCBkZWZhdWx0cy5kZWNvZGVyLCBjaGFyc2V0LCAna2V5Jyk7XG5cbiAgICAgICAgICAgIHZhbCA9IHV0aWxzLm1heWJlTWFwKFxuICAgICAgICAgICAgICAgIHBhcnNlQXJyYXlWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgcGFydC5zbGljZShwb3MgKyAxKSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgaXNBcnJheShvYmpba2V5XSkgPyBvYmpba2V5XS5sZW5ndGggOiAwXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZW5jb2RlZFZhbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5kZWNvZGVyKGVuY29kZWRWYWwsIGRlZmF1bHRzLmRlY29kZXIsIGNoYXJzZXQsICd2YWx1ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsICYmIG9wdGlvbnMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzICYmIGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAgICAgdmFsID0gaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzKFN0cmluZyh2YWwpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0LmluZGV4T2YoJ1tdPScpID4gLTEpIHtcbiAgICAgICAgICAgIHZhbCA9IGlzQXJyYXkodmFsKSA/IFt2YWxdIDogdmFsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGV4aXN0aW5nID0gaGFzLmNhbGwob2JqLCBrZXkpO1xuICAgICAgICBpZiAoZXhpc3RpbmcgJiYgb3B0aW9ucy5kdXBsaWNhdGVzID09PSAnY29tYmluZScpIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gdXRpbHMuY29tYmluZShvYmpba2V5XSwgdmFsKTtcbiAgICAgICAgfSBlbHNlIGlmICghZXhpc3RpbmcgfHwgb3B0aW9ucy5kdXBsaWNhdGVzID09PSAnbGFzdCcpIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBwYXJzZU9iamVjdCA9IGZ1bmN0aW9uIChjaGFpbiwgdmFsLCBvcHRpb25zLCB2YWx1ZXNQYXJzZWQpIHtcbiAgICB2YXIgY3VycmVudEFycmF5TGVuZ3RoID0gMDtcbiAgICBpZiAoY2hhaW4ubGVuZ3RoID4gMCAmJiBjaGFpbltjaGFpbi5sZW5ndGggLSAxXSA9PT0gJ1tdJykge1xuICAgICAgICB2YXIgcGFyZW50S2V5ID0gY2hhaW4uc2xpY2UoMCwgLTEpLmpvaW4oJycpO1xuICAgICAgICBjdXJyZW50QXJyYXlMZW5ndGggPSBBcnJheS5pc0FycmF5KHZhbCkgJiYgdmFsW3BhcmVudEtleV0gPyB2YWxbcGFyZW50S2V5XS5sZW5ndGggOiAwO1xuICAgIH1cblxuICAgIHZhciBsZWFmID0gdmFsdWVzUGFyc2VkID8gdmFsIDogcGFyc2VBcnJheVZhbHVlKHZhbCwgb3B0aW9ucywgY3VycmVudEFycmF5TGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSBjaGFpbi5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgb2JqO1xuICAgICAgICB2YXIgcm9vdCA9IGNoYWluW2ldO1xuXG4gICAgICAgIGlmIChyb290ID09PSAnW10nICYmIG9wdGlvbnMucGFyc2VBcnJheXMpIHtcbiAgICAgICAgICAgIG9iaiA9IG9wdGlvbnMuYWxsb3dFbXB0eUFycmF5cyAmJiAobGVhZiA9PT0gJycgfHwgKG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nICYmIGxlYWYgPT09IG51bGwpKVxuICAgICAgICAgICAgICAgID8gW11cbiAgICAgICAgICAgICAgICA6IHV0aWxzLmNvbWJpbmUoW10sIGxlYWYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2JqID0gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyB7IF9fcHJvdG9fXzogbnVsbCB9IDoge307XG4gICAgICAgICAgICB2YXIgY2xlYW5Sb290ID0gcm9vdC5jaGFyQXQoMCkgPT09ICdbJyAmJiByb290LmNoYXJBdChyb290Lmxlbmd0aCAtIDEpID09PSAnXScgPyByb290LnNsaWNlKDEsIC0xKSA6IHJvb3Q7XG4gICAgICAgICAgICB2YXIgZGVjb2RlZFJvb3QgPSBvcHRpb25zLmRlY29kZURvdEluS2V5cyA/IGNsZWFuUm9vdC5yZXBsYWNlKC8lMkUvZywgJy4nKSA6IGNsZWFuUm9vdDtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlSW50KGRlY29kZWRSb290LCAxMCk7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMucGFyc2VBcnJheXMgJiYgZGVjb2RlZFJvb3QgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgb2JqID0geyAwOiBsZWFmIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICFpc05hTihpbmRleClcbiAgICAgICAgICAgICAgICAmJiByb290ICE9PSBkZWNvZGVkUm9vdFxuICAgICAgICAgICAgICAgICYmIFN0cmluZyhpbmRleCkgPT09IGRlY29kZWRSb290XG4gICAgICAgICAgICAgICAgJiYgaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgICYmIChvcHRpb25zLnBhcnNlQXJyYXlzICYmIGluZGV4IDw9IG9wdGlvbnMuYXJyYXlMaW1pdClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG9iaiA9IFtdO1xuICAgICAgICAgICAgICAgIG9ialtpbmRleF0gPSBsZWFmO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkZWNvZGVkUm9vdCAhPT0gJ19fcHJvdG9fXycpIHtcbiAgICAgICAgICAgICAgICBvYmpbZGVjb2RlZFJvb3RdID0gbGVhZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxlYWYgPSBvYmo7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxlYWY7XG59O1xuXG52YXIgcGFyc2VLZXlzID0gZnVuY3Rpb24gcGFyc2VRdWVyeVN0cmluZ0tleXMoZ2l2ZW5LZXksIHZhbCwgb3B0aW9ucywgdmFsdWVzUGFyc2VkKSB7XG4gICAgaWYgKCFnaXZlbktleSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtIGRvdCBub3RhdGlvbiB0byBicmFja2V0IG5vdGF0aW9uXG4gICAgdmFyIGtleSA9IG9wdGlvbnMuYWxsb3dEb3RzID8gZ2l2ZW5LZXkucmVwbGFjZSgvXFwuKFteLltdKykvZywgJ1skMV0nKSA6IGdpdmVuS2V5O1xuXG4gICAgLy8gVGhlIHJlZ2V4IGNodW5rc1xuXG4gICAgdmFyIGJyYWNrZXRzID0gLyhcXFtbXltcXF1dKl0pLztcbiAgICB2YXIgY2hpbGQgPSAvKFxcW1teW1xcXV0qXSkvZztcblxuICAgIC8vIEdldCB0aGUgcGFyZW50XG5cbiAgICB2YXIgc2VnbWVudCA9IG9wdGlvbnMuZGVwdGggPiAwICYmIGJyYWNrZXRzLmV4ZWMoa2V5KTtcbiAgICB2YXIgcGFyZW50ID0gc2VnbWVudCA/IGtleS5zbGljZSgwLCBzZWdtZW50LmluZGV4KSA6IGtleTtcblxuICAgIC8vIFN0YXNoIHRoZSBwYXJlbnQgaWYgaXQgZXhpc3RzXG5cbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgYXJlbid0IHVzaW5nIHBsYWluIG9iamVjdHMsIG9wdGlvbmFsbHkgcHJlZml4IGtleXMgdGhhdCB3b3VsZCBvdmVyd3JpdGUgb2JqZWN0IHByb3RvdHlwZSBwcm9wZXJ0aWVzXG4gICAgICAgIGlmICghb3B0aW9ucy5wbGFpbk9iamVjdHMgJiYgaGFzLmNhbGwoT2JqZWN0LnByb3RvdHlwZSwgcGFyZW50KSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmFsbG93UHJvdG90eXBlcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGtleXMucHVzaChwYXJlbnQpO1xuICAgIH1cblxuICAgIC8vIExvb3AgdGhyb3VnaCBjaGlsZHJlbiBhcHBlbmRpbmcgdG8gdGhlIGFycmF5IHVudGlsIHdlIGhpdCBkZXB0aFxuXG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChvcHRpb25zLmRlcHRoID4gMCAmJiAoc2VnbWVudCA9IGNoaWxkLmV4ZWMoa2V5KSkgIT09IG51bGwgJiYgaSA8IG9wdGlvbnMuZGVwdGgpIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBpZiAoIW9wdGlvbnMucGxhaW5PYmplY3RzICYmIGhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHNlZ21lbnRbMV0uc2xpY2UoMSwgLTEpKSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmFsbG93UHJvdG90eXBlcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBrZXlzLnB1c2goc2VnbWVudFsxXSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUncyBhIHJlbWFpbmRlciwgY2hlY2sgc3RyaWN0RGVwdGggb3B0aW9uIGZvciB0aHJvdywgZWxzZSBqdXN0IGFkZCB3aGF0ZXZlciBpcyBsZWZ0XG5cbiAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICBpZiAob3B0aW9ucy5zdHJpY3REZXB0aCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0lucHV0IGRlcHRoIGV4Y2VlZGVkIGRlcHRoIG9wdGlvbiBvZiAnICsgb3B0aW9ucy5kZXB0aCArICcgYW5kIHN0cmljdERlcHRoIGlzIHRydWUnKTtcbiAgICAgICAgfVxuICAgICAgICBrZXlzLnB1c2goJ1snICsga2V5LnNsaWNlKHNlZ21lbnQuaW5kZXgpICsgJ10nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VPYmplY3Qoa2V5cywgdmFsLCBvcHRpb25zLCB2YWx1ZXNQYXJzZWQpO1xufTtcblxudmFyIG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyhvcHRzKSB7XG4gICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BhbGxvd0VtcHR5QXJyYXlzYCBvcHRpb24gY2FuIG9ubHkgYmUgYHRydWVgIG9yIGBmYWxzZWAsIHdoZW4gcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuZGVjb2RlRG90SW5LZXlzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0cy5kZWNvZGVEb3RJbktleXMgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgZGVjb2RlRG90SW5LZXlzYCBvcHRpb24gY2FuIG9ubHkgYmUgYHRydWVgIG9yIGBmYWxzZWAsIHdoZW4gcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5kZWNvZGVyICE9PSBudWxsICYmIHR5cGVvZiBvcHRzLmRlY29kZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRzLmRlY29kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRGVjb2RlciBoYXMgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuY2hhcnNldCAhPT0gJ3VuZGVmaW5lZCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAndXRmLTgnICYmIG9wdHMuY2hhcnNldCAhPT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBjaGFyc2V0IG9wdGlvbiBtdXN0IGJlIGVpdGhlciB1dGYtOCwgaXNvLTg4NTktMSwgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLnRocm93T25MaW1pdEV4Y2VlZGVkICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0cy50aHJvd09uTGltaXRFeGNlZWRlZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2B0aHJvd09uTGltaXRFeGNlZWRlZGAgb3B0aW9uIG11c3QgYmUgYSBib29sZWFuJyk7XG4gICAgfVxuXG4gICAgdmFyIGNoYXJzZXQgPSB0eXBlb2Ygb3B0cy5jaGFyc2V0ID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRzLmNoYXJzZXQgOiBvcHRzLmNoYXJzZXQ7XG5cbiAgICB2YXIgZHVwbGljYXRlcyA9IHR5cGVvZiBvcHRzLmR1cGxpY2F0ZXMgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuZHVwbGljYXRlcyA6IG9wdHMuZHVwbGljYXRlcztcblxuICAgIGlmIChkdXBsaWNhdGVzICE9PSAnY29tYmluZScgJiYgZHVwbGljYXRlcyAhPT0gJ2ZpcnN0JyAmJiBkdXBsaWNhdGVzICE9PSAnbGFzdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGR1cGxpY2F0ZXMgb3B0aW9uIG11c3QgYmUgZWl0aGVyIGNvbWJpbmUsIGZpcnN0LCBvciBsYXN0Jyk7XG4gICAgfVxuXG4gICAgdmFyIGFsbG93RG90cyA9IHR5cGVvZiBvcHRzLmFsbG93RG90cyA9PT0gJ3VuZGVmaW5lZCcgPyBvcHRzLmRlY29kZURvdEluS2V5cyA9PT0gdHJ1ZSA/IHRydWUgOiBkZWZhdWx0cy5hbGxvd0RvdHMgOiAhIW9wdHMuYWxsb3dEb3RzO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWxsb3dEb3RzOiBhbGxvd0RvdHMsXG4gICAgICAgIGFsbG93RW1wdHlBcnJheXM6IHR5cGVvZiBvcHRzLmFsbG93RW1wdHlBcnJheXMgPT09ICdib29sZWFuJyA/ICEhb3B0cy5hbGxvd0VtcHR5QXJyYXlzIDogZGVmYXVsdHMuYWxsb3dFbXB0eUFycmF5cyxcbiAgICAgICAgYWxsb3dQcm90b3R5cGVzOiB0eXBlb2Ygb3B0cy5hbGxvd1Byb3RvdHlwZXMgPT09ICdib29sZWFuJyA/IG9wdHMuYWxsb3dQcm90b3R5cGVzIDogZGVmYXVsdHMuYWxsb3dQcm90b3R5cGVzLFxuICAgICAgICBhbGxvd1NwYXJzZTogdHlwZW9mIG9wdHMuYWxsb3dTcGFyc2UgPT09ICdib29sZWFuJyA/IG9wdHMuYWxsb3dTcGFyc2UgOiBkZWZhdWx0cy5hbGxvd1NwYXJzZSxcbiAgICAgICAgYXJyYXlMaW1pdDogdHlwZW9mIG9wdHMuYXJyYXlMaW1pdCA9PT0gJ251bWJlcicgPyBvcHRzLmFycmF5TGltaXQgOiBkZWZhdWx0cy5hcnJheUxpbWl0LFxuICAgICAgICBjaGFyc2V0OiBjaGFyc2V0LFxuICAgICAgICBjaGFyc2V0U2VudGluZWw6IHR5cGVvZiBvcHRzLmNoYXJzZXRTZW50aW5lbCA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jaGFyc2V0U2VudGluZWwgOiBkZWZhdWx0cy5jaGFyc2V0U2VudGluZWwsXG4gICAgICAgIGNvbW1hOiB0eXBlb2Ygb3B0cy5jb21tYSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jb21tYSA6IGRlZmF1bHRzLmNvbW1hLFxuICAgICAgICBkZWNvZGVEb3RJbktleXM6IHR5cGVvZiBvcHRzLmRlY29kZURvdEluS2V5cyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5kZWNvZGVEb3RJbktleXMgOiBkZWZhdWx0cy5kZWNvZGVEb3RJbktleXMsXG4gICAgICAgIGRlY29kZXI6IHR5cGVvZiBvcHRzLmRlY29kZXIgPT09ICdmdW5jdGlvbicgPyBvcHRzLmRlY29kZXIgOiBkZWZhdWx0cy5kZWNvZGVyLFxuICAgICAgICBkZWxpbWl0ZXI6IHR5cGVvZiBvcHRzLmRlbGltaXRlciA9PT0gJ3N0cmluZycgfHwgdXRpbHMuaXNSZWdFeHAob3B0cy5kZWxpbWl0ZXIpID8gb3B0cy5kZWxpbWl0ZXIgOiBkZWZhdWx0cy5kZWxpbWl0ZXIsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbXBsaWNpdC1jb2VyY2lvbiwgbm8tZXh0cmEtcGFyZW5zXG4gICAgICAgIGRlcHRoOiAodHlwZW9mIG9wdHMuZGVwdGggPT09ICdudW1iZXInIHx8IG9wdHMuZGVwdGggPT09IGZhbHNlKSA/ICtvcHRzLmRlcHRoIDogZGVmYXVsdHMuZGVwdGgsXG4gICAgICAgIGR1cGxpY2F0ZXM6IGR1cGxpY2F0ZXMsXG4gICAgICAgIGlnbm9yZVF1ZXJ5UHJlZml4OiBvcHRzLmlnbm9yZVF1ZXJ5UHJlZml4ID09PSB0cnVlLFxuICAgICAgICBpbnRlcnByZXROdW1lcmljRW50aXRpZXM6IHR5cGVvZiBvcHRzLmludGVycHJldE51bWVyaWNFbnRpdGllcyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5pbnRlcnByZXROdW1lcmljRW50aXRpZXMgOiBkZWZhdWx0cy5pbnRlcnByZXROdW1lcmljRW50aXRpZXMsXG4gICAgICAgIHBhcmFtZXRlckxpbWl0OiB0eXBlb2Ygb3B0cy5wYXJhbWV0ZXJMaW1pdCA9PT0gJ251bWJlcicgPyBvcHRzLnBhcmFtZXRlckxpbWl0IDogZGVmYXVsdHMucGFyYW1ldGVyTGltaXQsXG4gICAgICAgIHBhcnNlQXJyYXlzOiBvcHRzLnBhcnNlQXJyYXlzICE9PSBmYWxzZSxcbiAgICAgICAgcGxhaW5PYmplY3RzOiB0eXBlb2Ygb3B0cy5wbGFpbk9iamVjdHMgPT09ICdib29sZWFuJyA/IG9wdHMucGxhaW5PYmplY3RzIDogZGVmYXVsdHMucGxhaW5PYmplY3RzLFxuICAgICAgICBzdHJpY3REZXB0aDogdHlwZW9mIG9wdHMuc3RyaWN0RGVwdGggPT09ICdib29sZWFuJyA/ICEhb3B0cy5zdHJpY3REZXB0aCA6IGRlZmF1bHRzLnN0cmljdERlcHRoLFxuICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IHR5cGVvZiBvcHRzLnN0cmljdE51bGxIYW5kbGluZyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgOiBkZWZhdWx0cy5zdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgICAgIHRocm93T25MaW1pdEV4Y2VlZGVkOiB0eXBlb2Ygb3B0cy50aHJvd09uTGltaXRFeGNlZWRlZCA9PT0gJ2Jvb2xlYW4nID8gb3B0cy50aHJvd09uTGltaXRFeGNlZWRlZCA6IGZhbHNlXG4gICAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0ciwgb3B0cykge1xuICAgIHZhciBvcHRpb25zID0gbm9ybWFsaXplUGFyc2VPcHRpb25zKG9wdHMpO1xuXG4gICAgaWYgKHN0ciA9PT0gJycgfHwgc3RyID09PSBudWxsIHx8IHR5cGVvZiBzdHIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnBsYWluT2JqZWN0cyA/IHsgX19wcm90b19fOiBudWxsIH0gOiB7fTtcbiAgICB9XG5cbiAgICB2YXIgdGVtcE9iaiA9IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnID8gcGFyc2VWYWx1ZXMoc3RyLCBvcHRpb25zKSA6IHN0cjtcbiAgICB2YXIgb2JqID0gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyB7IF9fcHJvdG9fXzogbnVsbCB9IDoge307XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGtleXMgYW5kIHNldHVwIHRoZSBuZXcgb2JqZWN0XG5cbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRlbXBPYmopO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgdmFyIG5ld09iaiA9IHBhcnNlS2V5cyhrZXksIHRlbXBPYmpba2V5XSwgb3B0aW9ucywgdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycpO1xuICAgICAgICBvYmogPSB1dGlscy5tZXJnZShvYmosIG5ld09iaiwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYWxsb3dTcGFyc2UgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICByZXR1cm4gdXRpbHMuY29tcGFjdChvYmopO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGdldFNpZGVDaGFubmVsID0gcmVxdWlyZSgnc2lkZS1jaGFubmVsJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgZm9ybWF0cyA9IHJlcXVpcmUoJy4vZm9ybWF0cycpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBhcnJheVByZWZpeEdlbmVyYXRvcnMgPSB7XG4gICAgYnJhY2tldHM6IGZ1bmN0aW9uIGJyYWNrZXRzKHByZWZpeCkge1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgJ1tdJztcbiAgICB9LFxuICAgIGNvbW1hOiAnY29tbWEnLFxuICAgIGluZGljZXM6IGZ1bmN0aW9uIGluZGljZXMocHJlZml4LCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeCArICdbJyArIGtleSArICddJztcbiAgICB9LFxuICAgIHJlcGVhdDogZnVuY3Rpb24gcmVwZWF0KHByZWZpeCkge1xuICAgICAgICByZXR1cm4gcHJlZml4O1xuICAgIH1cbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbnZhciBwdXNoID0gQXJyYXkucHJvdG90eXBlLnB1c2g7XG52YXIgcHVzaFRvQXJyYXkgPSBmdW5jdGlvbiAoYXJyLCB2YWx1ZU9yQXJyYXkpIHtcbiAgICBwdXNoLmFwcGx5KGFyciwgaXNBcnJheSh2YWx1ZU9yQXJyYXkpID8gdmFsdWVPckFycmF5IDogW3ZhbHVlT3JBcnJheV0pO1xufTtcblxudmFyIHRvSVNPID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc7XG5cbnZhciBkZWZhdWx0Rm9ybWF0ID0gZm9ybWF0c1snZGVmYXVsdCddO1xudmFyIGRlZmF1bHRzID0ge1xuICAgIGFkZFF1ZXJ5UHJlZml4OiBmYWxzZSxcbiAgICBhbGxvd0RvdHM6IGZhbHNlLFxuICAgIGFsbG93RW1wdHlBcnJheXM6IGZhbHNlLFxuICAgIGFycmF5Rm9ybWF0OiAnaW5kaWNlcycsXG4gICAgY2hhcnNldDogJ3V0Zi04JyxcbiAgICBjaGFyc2V0U2VudGluZWw6IGZhbHNlLFxuICAgIGNvbW1hUm91bmRUcmlwOiBmYWxzZSxcbiAgICBkZWxpbWl0ZXI6ICcmJyxcbiAgICBlbmNvZGU6IHRydWUsXG4gICAgZW5jb2RlRG90SW5LZXlzOiBmYWxzZSxcbiAgICBlbmNvZGVyOiB1dGlscy5lbmNvZGUsXG4gICAgZW5jb2RlVmFsdWVzT25seTogZmFsc2UsXG4gICAgZmlsdGVyOiB2b2lkIHVuZGVmaW5lZCxcbiAgICBmb3JtYXQ6IGRlZmF1bHRGb3JtYXQsXG4gICAgZm9ybWF0dGVyOiBmb3JtYXRzLmZvcm1hdHRlcnNbZGVmYXVsdEZvcm1hdF0sXG4gICAgLy8gZGVwcmVjYXRlZFxuICAgIGluZGljZXM6IGZhbHNlLFxuICAgIHNlcmlhbGl6ZURhdGU6IGZ1bmN0aW9uIHNlcmlhbGl6ZURhdGUoZGF0ZSkge1xuICAgICAgICByZXR1cm4gdG9JU08uY2FsbChkYXRlKTtcbiAgICB9LFxuICAgIHNraXBOdWxsczogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZVxufTtcblxudmFyIGlzTm9uTnVsbGlzaFByaW1pdGl2ZSA9IGZ1bmN0aW9uIGlzTm9uTnVsbGlzaFByaW1pdGl2ZSh2KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnc3RyaW5nJ1xuICAgICAgICB8fCB0eXBlb2YgdiA9PT0gJ251bWJlcidcbiAgICAgICAgfHwgdHlwZW9mIHYgPT09ICdib29sZWFuJ1xuICAgICAgICB8fCB0eXBlb2YgdiA9PT0gJ3N5bWJvbCdcbiAgICAgICAgfHwgdHlwZW9mIHYgPT09ICdiaWdpbnQnO1xufTtcblxudmFyIHNlbnRpbmVsID0ge307XG5cbnZhciBzdHJpbmdpZnkgPSBmdW5jdGlvbiBzdHJpbmdpZnkoXG4gICAgb2JqZWN0LFxuICAgIHByZWZpeCxcbiAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgIGNvbW1hUm91bmRUcmlwLFxuICAgIGFsbG93RW1wdHlBcnJheXMsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgIHNraXBOdWxscyxcbiAgICBlbmNvZGVEb3RJbktleXMsXG4gICAgZW5jb2RlcixcbiAgICBmaWx0ZXIsXG4gICAgc29ydCxcbiAgICBhbGxvd0RvdHMsXG4gICAgc2VyaWFsaXplRGF0ZSxcbiAgICBmb3JtYXQsXG4gICAgZm9ybWF0dGVyLFxuICAgIGVuY29kZVZhbHVlc09ubHksXG4gICAgY2hhcnNldCxcbiAgICBzaWRlQ2hhbm5lbFxuKSB7XG4gICAgdmFyIG9iaiA9IG9iamVjdDtcblxuICAgIHZhciB0bXBTYyA9IHNpZGVDaGFubmVsO1xuICAgIHZhciBzdGVwID0gMDtcbiAgICB2YXIgZmluZEZsYWcgPSBmYWxzZTtcbiAgICB3aGlsZSAoKHRtcFNjID0gdG1wU2MuZ2V0KHNlbnRpbmVsKSkgIT09IHZvaWQgdW5kZWZpbmVkICYmICFmaW5kRmxhZykge1xuICAgICAgICAvLyBXaGVyZSBvYmplY3QgbGFzdCBhcHBlYXJlZCBpbiB0aGUgcmVmIHRyZWVcbiAgICAgICAgdmFyIHBvcyA9IHRtcFNjLmdldChvYmplY3QpO1xuICAgICAgICBzdGVwICs9IDE7XG4gICAgICAgIGlmICh0eXBlb2YgcG9zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKHBvcyA9PT0gc3RlcCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdDeWNsaWMgb2JqZWN0IHZhbHVlJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbmRGbGFnID0gdHJ1ZTsgLy8gQnJlYWsgd2hpbGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRtcFNjLmdldChzZW50aW5lbCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBzdGVwID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9iaiA9IGZpbHRlcihwcmVmaXgsIG9iaik7XG4gICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIG9iaiA9IHNlcmlhbGl6ZURhdGUob2JqKTtcbiAgICB9IGVsc2UgaWYgKGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgaXNBcnJheShvYmopKSB7XG4gICAgICAgIG9iaiA9IHV0aWxzLm1heWJlTWFwKG9iaiwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZURhdGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICAgIGlmIChzdHJpY3ROdWxsSGFuZGxpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBlbmNvZGVyICYmICFlbmNvZGVWYWx1ZXNPbmx5ID8gZW5jb2RlcihwcmVmaXgsIGRlZmF1bHRzLmVuY29kZXIsIGNoYXJzZXQsICdrZXknLCBmb3JtYXQpIDogcHJlZml4O1xuICAgICAgICB9XG5cbiAgICAgICAgb2JqID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKGlzTm9uTnVsbGlzaFByaW1pdGl2ZShvYmopIHx8IHV0aWxzLmlzQnVmZmVyKG9iaikpIHtcbiAgICAgICAgaWYgKGVuY29kZXIpIHtcbiAgICAgICAgICAgIHZhciBrZXlWYWx1ZSA9IGVuY29kZVZhbHVlc09ubHkgPyBwcmVmaXggOiBlbmNvZGVyKHByZWZpeCwgZGVmYXVsdHMuZW5jb2RlciwgY2hhcnNldCwgJ2tleScsIGZvcm1hdCk7XG4gICAgICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihrZXlWYWx1ZSkgKyAnPScgKyBmb3JtYXR0ZXIoZW5jb2RlcihvYmosIGRlZmF1bHRzLmVuY29kZXIsIGNoYXJzZXQsICd2YWx1ZScsIGZvcm1hdCkpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihwcmVmaXgpICsgJz0nICsgZm9ybWF0dGVyKFN0cmluZyhvYmopKV07XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuXG4gICAgdmFyIG9iaktleXM7XG4gICAgaWYgKGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgaXNBcnJheShvYmopKSB7XG4gICAgICAgIC8vIHdlIG5lZWQgdG8gam9pbiBlbGVtZW50cyBpblxuICAgICAgICBpZiAoZW5jb2RlVmFsdWVzT25seSAmJiBlbmNvZGVyKSB7XG4gICAgICAgICAgICBvYmogPSB1dGlscy5tYXliZU1hcChvYmosIGVuY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIG9iaktleXMgPSBbeyB2YWx1ZTogb2JqLmxlbmd0aCA+IDAgPyBvYmouam9pbignLCcpIHx8IG51bGwgOiB2b2lkIHVuZGVmaW5lZCB9XTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkoZmlsdGVyKSkge1xuICAgICAgICBvYmpLZXlzID0gZmlsdGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgb2JqS2V5cyA9IHNvcnQgPyBrZXlzLnNvcnQoc29ydCkgOiBrZXlzO1xuICAgIH1cblxuICAgIHZhciBlbmNvZGVkUHJlZml4ID0gZW5jb2RlRG90SW5LZXlzID8gU3RyaW5nKHByZWZpeCkucmVwbGFjZSgvXFwuL2csICclMkUnKSA6IFN0cmluZyhwcmVmaXgpO1xuXG4gICAgdmFyIGFkanVzdGVkUHJlZml4ID0gY29tbWFSb3VuZFRyaXAgJiYgaXNBcnJheShvYmopICYmIG9iai5sZW5ndGggPT09IDEgPyBlbmNvZGVkUHJlZml4ICsgJ1tdJyA6IGVuY29kZWRQcmVmaXg7XG5cbiAgICBpZiAoYWxsb3dFbXB0eUFycmF5cyAmJiBpc0FycmF5KG9iaikgJiYgb2JqLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYWRqdXN0ZWRQcmVmaXggKyAnW10nO1xuICAgIH1cblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgb2JqS2V5cy5sZW5ndGg7ICsraikge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tqXTtcbiAgICAgICAgdmFyIHZhbHVlID0gdHlwZW9mIGtleSA9PT0gJ29iamVjdCcgJiYga2V5ICYmIHR5cGVvZiBrZXkudmFsdWUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICA/IGtleS52YWx1ZVxuICAgICAgICAgICAgOiBvYmpba2V5XTtcblxuICAgICAgICBpZiAoc2tpcE51bGxzICYmIHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBlbmNvZGVkS2V5ID0gYWxsb3dEb3RzICYmIGVuY29kZURvdEluS2V5cyA/IFN0cmluZyhrZXkpLnJlcGxhY2UoL1xcLi9nLCAnJTJFJykgOiBTdHJpbmcoa2V5KTtcbiAgICAgICAgdmFyIGtleVByZWZpeCA9IGlzQXJyYXkob2JqKVxuICAgICAgICAgICAgPyB0eXBlb2YgZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2Z1bmN0aW9uJyA/IGdlbmVyYXRlQXJyYXlQcmVmaXgoYWRqdXN0ZWRQcmVmaXgsIGVuY29kZWRLZXkpIDogYWRqdXN0ZWRQcmVmaXhcbiAgICAgICAgICAgIDogYWRqdXN0ZWRQcmVmaXggKyAoYWxsb3dEb3RzID8gJy4nICsgZW5jb2RlZEtleSA6ICdbJyArIGVuY29kZWRLZXkgKyAnXScpO1xuXG4gICAgICAgIHNpZGVDaGFubmVsLnNldChvYmplY3QsIHN0ZXApO1xuICAgICAgICB2YXIgdmFsdWVTaWRlQ2hhbm5lbCA9IGdldFNpZGVDaGFubmVsKCk7XG4gICAgICAgIHZhbHVlU2lkZUNoYW5uZWwuc2V0KHNlbnRpbmVsLCBzaWRlQ2hhbm5lbCk7XG4gICAgICAgIHB1c2hUb0FycmF5KHZhbHVlcywgc3RyaW5naWZ5KFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBrZXlQcmVmaXgsXG4gICAgICAgICAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgICAgICAgICAgY29tbWFSb3VuZFRyaXAsXG4gICAgICAgICAgICBhbGxvd0VtcHR5QXJyYXlzLFxuICAgICAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgICAgICAgICAgc2tpcE51bGxzLFxuICAgICAgICAgICAgZW5jb2RlRG90SW5LZXlzLFxuICAgICAgICAgICAgZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2NvbW1hJyAmJiBlbmNvZGVWYWx1ZXNPbmx5ICYmIGlzQXJyYXkob2JqKSA/IG51bGwgOiBlbmNvZGVyLFxuICAgICAgICAgICAgZmlsdGVyLFxuICAgICAgICAgICAgc29ydCxcbiAgICAgICAgICAgIGFsbG93RG90cyxcbiAgICAgICAgICAgIHNlcmlhbGl6ZURhdGUsXG4gICAgICAgICAgICBmb3JtYXQsXG4gICAgICAgICAgICBmb3JtYXR0ZXIsXG4gICAgICAgICAgICBlbmNvZGVWYWx1ZXNPbmx5LFxuICAgICAgICAgICAgY2hhcnNldCxcbiAgICAgICAgICAgIHZhbHVlU2lkZUNoYW5uZWxcbiAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlcztcbn07XG5cbnZhciBub3JtYWxpemVTdHJpbmdpZnlPcHRpb25zID0gZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5naWZ5T3B0aW9ucyhvcHRzKSB7XG4gICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BhbGxvd0VtcHR5QXJyYXlzYCBvcHRpb24gY2FuIG9ubHkgYmUgYHRydWVgIG9yIGBmYWxzZWAsIHdoZW4gcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuZW5jb2RlRG90SW5LZXlzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0cy5lbmNvZGVEb3RJbktleXMgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgZW5jb2RlRG90SW5LZXlzYCBvcHRpb24gY2FuIG9ubHkgYmUgYHRydWVgIG9yIGBmYWxzZWAsIHdoZW4gcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5lbmNvZGVyICE9PSBudWxsICYmIHR5cGVvZiBvcHRzLmVuY29kZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRzLmVuY29kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRW5jb2RlciBoYXMgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICB2YXIgY2hhcnNldCA9IG9wdHMuY2hhcnNldCB8fCBkZWZhdWx0cy5jaGFyc2V0O1xuICAgIGlmICh0eXBlb2Ygb3B0cy5jaGFyc2V0ICE9PSAndW5kZWZpbmVkJyAmJiBvcHRzLmNoYXJzZXQgIT09ICd1dGYtOCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGNoYXJzZXQgb3B0aW9uIG11c3QgYmUgZWl0aGVyIHV0Zi04LCBpc28tODg1OS0xLCBvciB1bmRlZmluZWQnKTtcbiAgICB9XG5cbiAgICB2YXIgZm9ybWF0ID0gZm9ybWF0c1snZGVmYXVsdCddO1xuICAgIGlmICh0eXBlb2Ygb3B0cy5mb3JtYXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmICghaGFzLmNhbGwoZm9ybWF0cy5mb3JtYXR0ZXJzLCBvcHRzLmZvcm1hdCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZm9ybWF0IG9wdGlvbiBwcm92aWRlZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBmb3JtYXQgPSBvcHRzLmZvcm1hdDtcbiAgICB9XG4gICAgdmFyIGZvcm1hdHRlciA9IGZvcm1hdHMuZm9ybWF0dGVyc1tmb3JtYXRdO1xuXG4gICAgdmFyIGZpbHRlciA9IGRlZmF1bHRzLmZpbHRlcjtcbiAgICBpZiAodHlwZW9mIG9wdHMuZmlsdGVyID09PSAnZnVuY3Rpb24nIHx8IGlzQXJyYXkob3B0cy5maWx0ZXIpKSB7XG4gICAgICAgIGZpbHRlciA9IG9wdHMuZmlsdGVyO1xuICAgIH1cblxuICAgIHZhciBhcnJheUZvcm1hdDtcbiAgICBpZiAob3B0cy5hcnJheUZvcm1hdCBpbiBhcnJheVByZWZpeEdlbmVyYXRvcnMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRzLmFycmF5Rm9ybWF0O1xuICAgIH0gZWxzZSBpZiAoJ2luZGljZXMnIGluIG9wdHMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRzLmluZGljZXMgPyAnaW5kaWNlcycgOiAncmVwZWF0JztcbiAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheUZvcm1hdCA9IGRlZmF1bHRzLmFycmF5Rm9ybWF0O1xuICAgIH1cblxuICAgIGlmICgnY29tbWFSb3VuZFRyaXAnIGluIG9wdHMgJiYgdHlwZW9mIG9wdHMuY29tbWFSb3VuZFRyaXAgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgY29tbWFSb3VuZFRyaXBgIG11c3QgYmUgYSBib29sZWFuLCBvciBhYnNlbnQnKTtcbiAgICB9XG5cbiAgICB2YXIgYWxsb3dEb3RzID0gdHlwZW9mIG9wdHMuYWxsb3dEb3RzID09PSAndW5kZWZpbmVkJyA/IG9wdHMuZW5jb2RlRG90SW5LZXlzID09PSB0cnVlID8gdHJ1ZSA6IGRlZmF1bHRzLmFsbG93RG90cyA6ICEhb3B0cy5hbGxvd0RvdHM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhZGRRdWVyeVByZWZpeDogdHlwZW9mIG9wdHMuYWRkUXVlcnlQcmVmaXggPT09ICdib29sZWFuJyA/IG9wdHMuYWRkUXVlcnlQcmVmaXggOiBkZWZhdWx0cy5hZGRRdWVyeVByZWZpeCxcbiAgICAgICAgYWxsb3dEb3RzOiBhbGxvd0RvdHMsXG4gICAgICAgIGFsbG93RW1wdHlBcnJheXM6IHR5cGVvZiBvcHRzLmFsbG93RW1wdHlBcnJheXMgPT09ICdib29sZWFuJyA/ICEhb3B0cy5hbGxvd0VtcHR5QXJyYXlzIDogZGVmYXVsdHMuYWxsb3dFbXB0eUFycmF5cyxcbiAgICAgICAgYXJyYXlGb3JtYXQ6IGFycmF5Rm9ybWF0LFxuICAgICAgICBjaGFyc2V0OiBjaGFyc2V0LFxuICAgICAgICBjaGFyc2V0U2VudGluZWw6IHR5cGVvZiBvcHRzLmNoYXJzZXRTZW50aW5lbCA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jaGFyc2V0U2VudGluZWwgOiBkZWZhdWx0cy5jaGFyc2V0U2VudGluZWwsXG4gICAgICAgIGNvbW1hUm91bmRUcmlwOiAhIW9wdHMuY29tbWFSb3VuZFRyaXAsXG4gICAgICAgIGRlbGltaXRlcjogdHlwZW9mIG9wdHMuZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRzLmRlbGltaXRlciA6IG9wdHMuZGVsaW1pdGVyLFxuICAgICAgICBlbmNvZGU6IHR5cGVvZiBvcHRzLmVuY29kZSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5lbmNvZGUgOiBkZWZhdWx0cy5lbmNvZGUsXG4gICAgICAgIGVuY29kZURvdEluS2V5czogdHlwZW9mIG9wdHMuZW5jb2RlRG90SW5LZXlzID09PSAnYm9vbGVhbicgPyBvcHRzLmVuY29kZURvdEluS2V5cyA6IGRlZmF1bHRzLmVuY29kZURvdEluS2V5cyxcbiAgICAgICAgZW5jb2RlcjogdHlwZW9mIG9wdHMuZW5jb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG9wdHMuZW5jb2RlciA6IGRlZmF1bHRzLmVuY29kZXIsXG4gICAgICAgIGVuY29kZVZhbHVlc09ubHk6IHR5cGVvZiBvcHRzLmVuY29kZVZhbHVlc09ubHkgPT09ICdib29sZWFuJyA/IG9wdHMuZW5jb2RlVmFsdWVzT25seSA6IGRlZmF1bHRzLmVuY29kZVZhbHVlc09ubHksXG4gICAgICAgIGZpbHRlcjogZmlsdGVyLFxuICAgICAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICAgICAgZm9ybWF0dGVyOiBmb3JtYXR0ZXIsXG4gICAgICAgIHNlcmlhbGl6ZURhdGU6IHR5cGVvZiBvcHRzLnNlcmlhbGl6ZURhdGUgPT09ICdmdW5jdGlvbicgPyBvcHRzLnNlcmlhbGl6ZURhdGUgOiBkZWZhdWx0cy5zZXJpYWxpemVEYXRlLFxuICAgICAgICBza2lwTnVsbHM6IHR5cGVvZiBvcHRzLnNraXBOdWxscyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5za2lwTnVsbHMgOiBkZWZhdWx0cy5za2lwTnVsbHMsXG4gICAgICAgIHNvcnQ6IHR5cGVvZiBvcHRzLnNvcnQgPT09ICdmdW5jdGlvbicgPyBvcHRzLnNvcnQgOiBudWxsLFxuICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IHR5cGVvZiBvcHRzLnN0cmljdE51bGxIYW5kbGluZyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgOiBkZWZhdWx0cy5zdHJpY3ROdWxsSGFuZGxpbmdcbiAgICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBvcHRzKSB7XG4gICAgdmFyIG9iaiA9IG9iamVjdDtcbiAgICB2YXIgb3B0aW9ucyA9IG5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMob3B0cyk7XG5cbiAgICB2YXIgb2JqS2V5cztcbiAgICB2YXIgZmlsdGVyO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmaWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICAgICAgb2JqID0gZmlsdGVyKCcnLCBvYmopO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvcHRpb25zLmZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgICAgIG9iaktleXMgPSBmaWx0ZXI7XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBbXTtcblxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHZhciBnZW5lcmF0ZUFycmF5UHJlZml4ID0gYXJyYXlQcmVmaXhHZW5lcmF0b3JzW29wdGlvbnMuYXJyYXlGb3JtYXRdO1xuICAgIHZhciBjb21tYVJvdW5kVHJpcCA9IGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgb3B0aW9ucy5jb21tYVJvdW5kVHJpcDtcblxuICAgIGlmICghb2JqS2V5cykge1xuICAgICAgICBvYmpLZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zb3J0KSB7XG4gICAgICAgIG9iaktleXMuc29ydChvcHRpb25zLnNvcnQpO1xuICAgIH1cblxuICAgIHZhciBzaWRlQ2hhbm5lbCA9IGdldFNpZGVDaGFubmVsKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmpLZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBrZXkgPSBvYmpLZXlzW2ldO1xuICAgICAgICB2YXIgdmFsdWUgPSBvYmpba2V5XTtcblxuICAgICAgICBpZiAob3B0aW9ucy5za2lwTnVsbHMgJiYgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHB1c2hUb0FycmF5KGtleXMsIHN0cmluZ2lmeShcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgZ2VuZXJhdGVBcnJheVByZWZpeCxcbiAgICAgICAgICAgIGNvbW1hUm91bmRUcmlwLFxuICAgICAgICAgICAgb3B0aW9ucy5hbGxvd0VtcHR5QXJyYXlzLFxuICAgICAgICAgICAgb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgICAgICAgICBvcHRpb25zLnNraXBOdWxscyxcbiAgICAgICAgICAgIG9wdGlvbnMuZW5jb2RlRG90SW5LZXlzLFxuICAgICAgICAgICAgb3B0aW9ucy5lbmNvZGUgPyBvcHRpb25zLmVuY29kZXIgOiBudWxsLFxuICAgICAgICAgICAgb3B0aW9ucy5maWx0ZXIsXG4gICAgICAgICAgICBvcHRpb25zLnNvcnQsXG4gICAgICAgICAgICBvcHRpb25zLmFsbG93RG90cyxcbiAgICAgICAgICAgIG9wdGlvbnMuc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgICAgIG9wdGlvbnMuZm9ybWF0LFxuICAgICAgICAgICAgb3B0aW9ucy5mb3JtYXR0ZXIsXG4gICAgICAgICAgICBvcHRpb25zLmVuY29kZVZhbHVlc09ubHksXG4gICAgICAgICAgICBvcHRpb25zLmNoYXJzZXQsXG4gICAgICAgICAgICBzaWRlQ2hhbm5lbFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICB2YXIgam9pbmVkID0ga2V5cy5qb2luKG9wdGlvbnMuZGVsaW1pdGVyKTtcbiAgICB2YXIgcHJlZml4ID0gb3B0aW9ucy5hZGRRdWVyeVByZWZpeCA9PT0gdHJ1ZSA/ICc/JyA6ICcnO1xuXG4gICAgaWYgKG9wdGlvbnMuY2hhcnNldFNlbnRpbmVsKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAgICAgLy8gZW5jb2RlVVJJQ29tcG9uZW50KCcmIzEwMDAzOycpLCB0aGUgXCJudW1lcmljIGVudGl0eVwiIHJlcHJlc2VudGF0aW9uIG9mIGEgY2hlY2ttYXJrXG4gICAgICAgICAgICBwcmVmaXggKz0gJ3V0Zjg9JTI2JTIzMTAwMDMlM0ImJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGVuY29kZVVSSUNvbXBvbmVudCgn4pyTJylcbiAgICAgICAgICAgIHByZWZpeCArPSAndXRmOD0lRTIlOUMlOTMmJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBqb2luZWQubGVuZ3RoID4gMCA/IHByZWZpeCArIGpvaW5lZCA6ICcnO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGZvcm1hdHMgPSByZXF1aXJlKCcuL2Zvcm1hdHMnKTtcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbnZhciBoZXhUYWJsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgICAgICBhcnJheS5wdXNoKCclJyArICgoaSA8IDE2ID8gJzAnIDogJycpICsgaS50b1N0cmluZygxNikpLnRvVXBwZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBhcnJheTtcbn0oKSk7XG5cbnZhciBjb21wYWN0UXVldWUgPSBmdW5jdGlvbiBjb21wYWN0UXVldWUocXVldWUpIHtcbiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMSkge1xuICAgICAgICB2YXIgaXRlbSA9IHF1ZXVlLnBvcCgpO1xuICAgICAgICB2YXIgb2JqID0gaXRlbS5vYmpbaXRlbS5wcm9wXTtcblxuICAgICAgICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICB2YXIgY29tcGFjdGVkID0gW107XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgb2JqLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmpbal0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBhY3RlZC5wdXNoKG9ialtqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpdGVtLm9ialtpdGVtLnByb3BdID0gY29tcGFjdGVkO1xuICAgICAgICB9XG4gICAgfVxufTtcblxudmFyIGFycmF5VG9PYmplY3QgPSBmdW5jdGlvbiBhcnJheVRvT2JqZWN0KHNvdXJjZSwgb3B0aW9ucykge1xuICAgIHZhciBvYmogPSBvcHRpb25zICYmIG9wdGlvbnMucGxhaW5PYmplY3RzID8geyBfX3Byb3RvX186IG51bGwgfSA6IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlW2ldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb2JqW2ldID0gc291cmNlW2ldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBtZXJnZSA9IGZ1bmN0aW9uIG1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgLyogZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOiAwICovXG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHNvdXJjZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoaXNBcnJheSh0YXJnZXQpKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaChzb3VyY2UpO1xuICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCAmJiB0eXBlb2YgdGFyZ2V0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChvcHRpb25zICYmIChvcHRpb25zLnBsYWluT2JqZWN0cyB8fCBvcHRpb25zLmFsbG93UHJvdG90eXBlcykpXG4gICAgICAgICAgICAgICAgfHwgIWhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHNvdXJjZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtzb3VyY2VdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbdGFyZ2V0LCBzb3VyY2VdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldCB8fCB0eXBlb2YgdGFyZ2V0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gW3RhcmdldF0uY29uY2F0KHNvdXJjZSk7XG4gICAgfVxuXG4gICAgdmFyIG1lcmdlVGFyZ2V0ID0gdGFyZ2V0O1xuICAgIGlmIChpc0FycmF5KHRhcmdldCkgJiYgIWlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICBtZXJnZVRhcmdldCA9IGFycmF5VG9PYmplY3QodGFyZ2V0LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoaXNBcnJheSh0YXJnZXQpICYmIGlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICBzb3VyY2UuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaSkge1xuICAgICAgICAgICAgaWYgKGhhcy5jYWxsKHRhcmdldCwgaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0SXRlbSA9IHRhcmdldFtpXTtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SXRlbSAmJiB0eXBlb2YgdGFyZ2V0SXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2ldID0gbWVyZ2UodGFyZ2V0SXRlbSwgaXRlbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuXG4gICAgICAgIGlmIChoYXMuY2FsbChhY2MsIGtleSkpIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gbWVyZ2UoYWNjW2tleV0sIHZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBtZXJnZVRhcmdldCk7XG59O1xuXG52YXIgYXNzaWduID0gZnVuY3Rpb24gYXNzaWduU2luZ2xlU291cmNlKHRhcmdldCwgc291cmNlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICBhY2Nba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHRhcmdldCk7XG59O1xuXG52YXIgZGVjb2RlID0gZnVuY3Rpb24gKHN0ciwgZGVmYXVsdERlY29kZXIsIGNoYXJzZXQpIHtcbiAgICB2YXIgc3RyV2l0aG91dFBsdXMgPSBzdHIucmVwbGFjZSgvXFwrL2csICcgJyk7XG4gICAgaWYgKGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAvLyB1bmVzY2FwZSBuZXZlciB0aHJvd3MsIG5vIHRyeS4uLmNhdGNoIG5lZWRlZDpcbiAgICAgICAgcmV0dXJuIHN0cldpdGhvdXRQbHVzLnJlcGxhY2UoLyVbMC05YS1mXXsyfS9naSwgdW5lc2NhcGUpO1xuICAgIH1cbiAgICAvLyB1dGYtOFxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoc3RyV2l0aG91dFBsdXMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHN0cldpdGhvdXRQbHVzO1xuICAgIH1cbn07XG5cbnZhciBsaW1pdCA9IDEwMjQ7XG5cbi8qIGVzbGludCBvcGVyYXRvci1saW5lYnJlYWs6IFsyLCBcImJlZm9yZVwiXSAqL1xuXG52YXIgZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKHN0ciwgZGVmYXVsdEVuY29kZXIsIGNoYXJzZXQsIGtpbmQsIGZvcm1hdCkge1xuICAgIC8vIFRoaXMgY29kZSB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IEJyaWFuIFdoaXRlIChtc2NkZXgpIGZvciB0aGUgaW8uanMgY29yZSBxdWVyeXN0cmluZyBsaWJyYXJ5LlxuICAgIC8vIEl0IGhhcyBiZWVuIGFkYXB0ZWQgaGVyZSBmb3Igc3RyaWN0ZXIgYWRoZXJlbmNlIHRvIFJGQyAzOTg2XG4gICAgaWYgKHN0ci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICB2YXIgc3RyaW5nID0gc3RyO1xuICAgIGlmICh0eXBlb2Ygc3RyID09PSAnc3ltYm9sJykge1xuICAgICAgICBzdHJpbmcgPSBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3RyKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHN0cmluZyA9IFN0cmluZyhzdHIpO1xuICAgIH1cblxuICAgIGlmIChjaGFyc2V0ID09PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgcmV0dXJuIGVzY2FwZShzdHJpbmcpLnJlcGxhY2UoLyV1WzAtOWEtZl17NH0vZ2ksIGZ1bmN0aW9uICgkMCkge1xuICAgICAgICAgICAgcmV0dXJuICclMjYlMjMnICsgcGFyc2VJbnQoJDAuc2xpY2UoMiksIDE2KSArICclM0InO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgb3V0ID0gJyc7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzdHJpbmcubGVuZ3RoOyBqICs9IGxpbWl0KSB7XG4gICAgICAgIHZhciBzZWdtZW50ID0gc3RyaW5nLmxlbmd0aCA+PSBsaW1pdCA/IHN0cmluZy5zbGljZShqLCBqICsgbGltaXQpIDogc3RyaW5nO1xuICAgICAgICB2YXIgYXJyID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB2YXIgYyA9IHNlZ21lbnQuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBjID09PSAweDJEIC8vIC1cbiAgICAgICAgICAgICAgICB8fCBjID09PSAweDJFIC8vIC5cbiAgICAgICAgICAgICAgICB8fCBjID09PSAweDVGIC8vIF9cbiAgICAgICAgICAgICAgICB8fCBjID09PSAweDdFIC8vIH5cbiAgICAgICAgICAgICAgICB8fCAoYyA+PSAweDMwICYmIGMgPD0gMHgzOSkgLy8gMC05XG4gICAgICAgICAgICAgICAgfHwgKGMgPj0gMHg0MSAmJiBjIDw9IDB4NUEpIC8vIGEtelxuICAgICAgICAgICAgICAgIHx8IChjID49IDB4NjEgJiYgYyA8PSAweDdBKSAvLyBBLVpcbiAgICAgICAgICAgICAgICB8fCAoZm9ybWF0ID09PSBmb3JtYXRzLlJGQzE3MzggJiYgKGMgPT09IDB4MjggfHwgYyA9PT0gMHgyOSkpIC8vICggKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYXJyW2Fyci5sZW5ndGhdID0gc2VnbWVudC5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgICAgICAgICAgIGFyclthcnIubGVuZ3RoXSA9IGhleFRhYmxlW2NdO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAgICAgICAgICAgYXJyW2Fyci5sZW5ndGhdID0gaGV4VGFibGVbMHhDMCB8IChjID4+IDYpXVxuICAgICAgICAgICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGMgPCAweEQ4MDAgfHwgYyA+PSAweEUwMDApIHtcbiAgICAgICAgICAgICAgICBhcnJbYXJyLmxlbmd0aF0gPSBoZXhUYWJsZVsweEUwIHwgKGMgPj4gMTIpXVxuICAgICAgICAgICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gNikgJiAweDNGKV1cbiAgICAgICAgICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV07XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIGMgPSAweDEwMDAwICsgKCgoYyAmIDB4M0ZGKSA8PCAxMCkgfCAoc2VnbWVudC5jaGFyQ29kZUF0KGkpICYgMHgzRkYpKTtcblxuICAgICAgICAgICAgYXJyW2Fyci5sZW5ndGhdID0gaGV4VGFibGVbMHhGMCB8IChjID4+IDE4KV1cbiAgICAgICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRildXG4gICAgICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDYpICYgMHgzRildXG4gICAgICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV07XG4gICAgICAgIH1cblxuICAgICAgICBvdXQgKz0gYXJyLmpvaW4oJycpO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG52YXIgY29tcGFjdCA9IGZ1bmN0aW9uIGNvbXBhY3QodmFsdWUpIHtcbiAgICB2YXIgcXVldWUgPSBbeyBvYmo6IHsgbzogdmFsdWUgfSwgcHJvcDogJ28nIH1dO1xuICAgIHZhciByZWZzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBpdGVtID0gcXVldWVbaV07XG4gICAgICAgIHZhciBvYmogPSBpdGVtLm9ialtpdGVtLnByb3BdO1xuXG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBrZXlzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0ga2V5c1tqXTtcbiAgICAgICAgICAgIHZhciB2YWwgPSBvYmpba2V5XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgJiYgcmVmcy5pbmRleE9mKHZhbCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcXVldWUucHVzaCh7IG9iajogb2JqLCBwcm9wOiBrZXkgfSk7XG4gICAgICAgICAgICAgICAgcmVmcy5wdXNoKHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wYWN0UXVldWUocXVldWUpO1xuXG4gICAgcmV0dXJuIHZhbHVlO1xufTtcblxudmFyIGlzUmVnRXhwID0gZnVuY3Rpb24gaXNSZWdFeHAob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBSZWdFeHBdJztcbn07XG5cbnZhciBpc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyKG9iaikge1xuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gISEob2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKSk7XG59O1xuXG52YXIgY29tYmluZSA9IGZ1bmN0aW9uIGNvbWJpbmUoYSwgYikge1xuICAgIHJldHVybiBbXS5jb25jYXQoYSwgYik7XG59O1xuXG52YXIgbWF5YmVNYXAgPSBmdW5jdGlvbiBtYXliZU1hcCh2YWwsIGZuKSB7XG4gICAgaWYgKGlzQXJyYXkodmFsKSkge1xuICAgICAgICB2YXIgbWFwcGVkID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBtYXBwZWQucHVzaChmbih2YWxbaV0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFwcGVkO1xuICAgIH1cbiAgICByZXR1cm4gZm4odmFsKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGFycmF5VG9PYmplY3Q6IGFycmF5VG9PYmplY3QsXG4gICAgYXNzaWduOiBhc3NpZ24sXG4gICAgY29tYmluZTogY29tYmluZSxcbiAgICBjb21wYWN0OiBjb21wYWN0LFxuICAgIGRlY29kZTogZGVjb2RlLFxuICAgIGVuY29kZTogZW5jb2RlLFxuICAgIGlzQnVmZmVyOiBpc0J1ZmZlcixcbiAgICBpc1JlZ0V4cDogaXNSZWdFeHAsXG4gICAgbWF5YmVNYXA6IG1heWJlTWFwLFxuICAgIG1lcmdlOiBtZXJnZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGluc3BlY3QgPSByZXF1aXJlKCdvYmplY3QtaW5zcGVjdCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG5cbi8qXG4qIFRoaXMgZnVuY3Rpb24gdHJhdmVyc2VzIHRoZSBsaXN0IHJldHVybmluZyB0aGUgbm9kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBrZXkuXG4qXG4qIFRoYXQgbm9kZSBpcyBhbHNvIG1vdmVkIHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBzbyB0aGF0IGlmIGl0J3MgYWNjZXNzZWQgYWdhaW4gd2UgZG9uJ3QgbmVlZCB0byB0cmF2ZXJzZSB0aGUgd2hvbGUgbGlzdC5cbiogQnkgZG9pbmcgc28sIGFsbCB0aGUgcmVjZW50bHkgdXNlZCBub2RlcyBjYW4gYmUgYWNjZXNzZWQgcmVsYXRpdmVseSBxdWlja2x5LlxuKi9cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2xpc3QuZC50cycpLmxpc3RHZXROb2RlfSAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG52YXIgbGlzdEdldE5vZGUgPSBmdW5jdGlvbiAobGlzdCwga2V5LCBpc0RlbGV0ZSkge1xuXHQvKiogQHR5cGUge3R5cGVvZiBsaXN0IHwgTm9uTnVsbGFibGU8KHR5cGVvZiBsaXN0KVsnbmV4dCddPn0gKi9cblx0dmFyIHByZXYgPSBsaXN0O1xuXHQvKiogQHR5cGUgeyh0eXBlb2YgbGlzdClbJ25leHQnXX0gKi9cblx0dmFyIGN1cnI7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0Zm9yICg7IChjdXJyID0gcHJldi5uZXh0KSAhPSBudWxsOyBwcmV2ID0gY3Vycikge1xuXHRcdGlmIChjdXJyLmtleSA9PT0ga2V5KSB7XG5cdFx0XHRwcmV2Lm5leHQgPSBjdXJyLm5leHQ7XG5cdFx0XHRpZiAoIWlzRGVsZXRlKSB7XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1wYXJlbnNcblx0XHRcdFx0Y3Vyci5uZXh0ID0gLyoqIEB0eXBlIHtOb25OdWxsYWJsZTx0eXBlb2YgbGlzdC5uZXh0Pn0gKi8gKGxpc3QubmV4dCk7XG5cdFx0XHRcdGxpc3QubmV4dCA9IGN1cnI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblx0XHRcdH1cblx0XHRcdHJldHVybiBjdXJyO1xuXHRcdH1cblx0fVxufTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vbGlzdC5kLnRzJykubGlzdEdldH0gKi9cbnZhciBsaXN0R2V0ID0gZnVuY3Rpb24gKG9iamVjdHMsIGtleSkge1xuXHRpZiAoIW9iamVjdHMpIHtcblx0XHRyZXR1cm4gdm9pZCB1bmRlZmluZWQ7XG5cdH1cblx0dmFyIG5vZGUgPSBsaXN0R2V0Tm9kZShvYmplY3RzLCBrZXkpO1xuXHRyZXR1cm4gbm9kZSAmJiBub2RlLnZhbHVlO1xufTtcbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2xpc3QuZC50cycpLmxpc3RTZXR9ICovXG52YXIgbGlzdFNldCA9IGZ1bmN0aW9uIChvYmplY3RzLCBrZXksIHZhbHVlKSB7XG5cdHZhciBub2RlID0gbGlzdEdldE5vZGUob2JqZWN0cywga2V5KTtcblx0aWYgKG5vZGUpIHtcblx0XHRub2RlLnZhbHVlID0gdmFsdWU7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gUHJlcGVuZCB0aGUgbmV3IG5vZGUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdFxuXHRcdG9iamVjdHMubmV4dCA9IC8qKiBAdHlwZSB7aW1wb3J0KCcuL2xpc3QuZC50cycpLkxpc3ROb2RlPHR5cGVvZiB2YWx1ZSwgdHlwZW9mIGtleT59ICovICh7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ24sIG5vLWV4dHJhLXBhcmVuc1xuXHRcdFx0a2V5OiBrZXksXG5cdFx0XHRuZXh0OiBvYmplY3RzLm5leHQsXG5cdFx0XHR2YWx1ZTogdmFsdWVcblx0XHR9KTtcblx0fVxufTtcbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2xpc3QuZC50cycpLmxpc3RIYXN9ICovXG52YXIgbGlzdEhhcyA9IGZ1bmN0aW9uIChvYmplY3RzLCBrZXkpIHtcblx0aWYgKCFvYmplY3RzKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHJldHVybiAhIWxpc3RHZXROb2RlKG9iamVjdHMsIGtleSk7XG59O1xuLyoqIEB0eXBlIHtpbXBvcnQoJy4vbGlzdC5kLnRzJykubGlzdERlbGV0ZX0gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxudmFyIGxpc3REZWxldGUgPSBmdW5jdGlvbiAob2JqZWN0cywga2V5KSB7XG5cdGlmIChvYmplY3RzKSB7XG5cdFx0cmV0dXJuIGxpc3RHZXROb2RlKG9iamVjdHMsIGtleSwgdHJ1ZSk7XG5cdH1cbn07XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFNpZGVDaGFubmVsTGlzdCgpIHtcblx0LyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBnZXRTaWRlQ2hhbm5lbExpc3Q+fSBDaGFubmVsICovXG5cdC8qKiBAdHlwZWRlZiB7UGFyYW1ldGVyczxDaGFubmVsWydnZXQnXT5bMF19IEsgKi9cblx0LyoqIEB0eXBlZGVmIHtQYXJhbWV0ZXJzPENoYW5uZWxbJ3NldCddPlsxXX0gViAqL1xuXG5cdC8qKiBAdHlwZSB7aW1wb3J0KCcuL2xpc3QuZC50cycpLlJvb3ROb2RlPFYsIEs+IHwgdW5kZWZpbmVkfSAqLyB2YXIgJG87XG5cblx0LyoqIEB0eXBlIHtDaGFubmVsfSAqL1xuXHR2YXIgY2hhbm5lbCA9IHtcblx0XHRhc3NlcnQ6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdGlmICghY2hhbm5lbC5oYXMoa2V5KSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignU2lkZSBjaGFubmVsIGRvZXMgbm90IGNvbnRhaW4gJyArIGluc3BlY3Qoa2V5KSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0dmFyIHJvb3QgPSAkbyAmJiAkby5uZXh0O1xuXHRcdFx0dmFyIGRlbGV0ZWROb2RlID0gbGlzdERlbGV0ZSgkbywga2V5KTtcblx0XHRcdGlmIChkZWxldGVkTm9kZSAmJiByb290ICYmIHJvb3QgPT09IGRlbGV0ZWROb2RlKSB7XG5cdFx0XHRcdCRvID0gdm9pZCB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gISFkZWxldGVkTm9kZTtcblx0XHR9LFxuXHRcdGdldDogZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0cmV0dXJuIGxpc3RHZXQoJG8sIGtleSk7XG5cdFx0fSxcblx0XHRoYXM6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdHJldHVybiBsaXN0SGFzKCRvLCBrZXkpO1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuXHRcdFx0aWYgKCEkbykge1xuXHRcdFx0XHQvLyBJbml0aWFsaXplIHRoZSBsaW5rZWQgbGlzdCBhcyBhbiBlbXB0eSBub2RlLCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gc3BlY2lhbC1jYXNlIGhhbmRsaW5nIG9mIHRoZSBmaXJzdCBub2RlOiB3ZSBjYW4gYWx3YXlzIHJlZmVyIHRvIGl0IGFzIChwcmV2aW91cyBub2RlKS5uZXh0LCBpbnN0ZWFkIG9mIHNvbWV0aGluZyBsaWtlIChsaXN0KS5oZWFkXG5cdFx0XHRcdCRvID0ge1xuXHRcdFx0XHRcdG5leHQ6IHZvaWQgdW5kZWZpbmVkXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXh0cmEtcGFyZW5zXG5cdFx0XHRsaXN0U2V0KC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mICRvPn0gKi8gKCRvKSwga2V5LCB2YWx1ZSk7XG5cdFx0fVxuXHR9O1xuXHQvLyBAdHMtZXhwZWN0LWVycm9yIFRPRE86IGZpZ3VyZSBvdXQgd2h5IHRoaXMgaXMgZXJyb3Jpbmdcblx0cmV0dXJuIGNoYW5uZWw7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJ2NhbGwtYm91bmQnKTtcbnZhciBpbnNwZWN0ID0gcmVxdWlyZSgnb2JqZWN0LWluc3BlY3QnKTtcblxudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xudmFyICRNYXAgPSBHZXRJbnRyaW5zaWMoJyVNYXAlJywgdHJ1ZSk7XG5cbi8qKiBAdHlwZSB7PEssIFY+KHRoaXNBcmc6IE1hcDxLLCBWPiwga2V5OiBLKSA9PiBWfSAqL1xudmFyICRtYXBHZXQgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuZ2V0JywgdHJ1ZSk7XG4vKiogQHR5cGUgezxLLCBWPih0aGlzQXJnOiBNYXA8SywgVj4sIGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9ICovXG52YXIgJG1hcFNldCA9IGNhbGxCb3VuZCgnTWFwLnByb3RvdHlwZS5zZXQnLCB0cnVlKTtcbi8qKiBAdHlwZSB7PEssIFY+KHRoaXNBcmc6IE1hcDxLLCBWPiwga2V5OiBLKSA9PiBib29sZWFufSAqL1xudmFyICRtYXBIYXMgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuaGFzJywgdHJ1ZSk7XG4vKiogQHR5cGUgezxLLCBWPih0aGlzQXJnOiBNYXA8SywgVj4sIGtleTogSykgPT4gYm9vbGVhbn0gKi9cbnZhciAkbWFwRGVsZXRlID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLmRlbGV0ZScsIHRydWUpO1xuLyoqIEB0eXBlIHs8SywgVj4odGhpc0FyZzogTWFwPEssIFY+KSA9PiBudW1iZXJ9ICovXG52YXIgJG1hcFNpemUgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuc2l6ZScsIHRydWUpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSAhISRNYXAgJiYgLyoqIEB0eXBlIHtFeGNsdWRlPGltcG9ydCgnLicpLCBmYWxzZT59ICovIGZ1bmN0aW9uIGdldFNpZGVDaGFubmVsTWFwKCkge1xuXHQvKiogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIGdldFNpZGVDaGFubmVsTWFwPn0gQ2hhbm5lbCAqL1xuXHQvKiogQHR5cGVkZWYge1BhcmFtZXRlcnM8Q2hhbm5lbFsnZ2V0J10+WzBdfSBLICovXG5cdC8qKiBAdHlwZWRlZiB7UGFyYW1ldGVyczxDaGFubmVsWydzZXQnXT5bMV19IFYgKi9cblxuXHQvKiogQHR5cGUge01hcDxLLCBWPiB8IHVuZGVmaW5lZH0gKi8gdmFyICRtO1xuXG5cdC8qKiBAdHlwZSB7Q2hhbm5lbH0gKi9cblx0dmFyIGNoYW5uZWwgPSB7XG5cdFx0YXNzZXJ0OiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRpZiAoIWNoYW5uZWwuaGFzKGtleSkpIHtcblx0XHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1NpZGUgY2hhbm5lbCBkb2VzIG5vdCBjb250YWluICcgKyBpbnNwZWN0KGtleSkpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdGlmICgkbSkge1xuXHRcdFx0XHR2YXIgcmVzdWx0ID0gJG1hcERlbGV0ZSgkbSwga2V5KTtcblx0XHRcdFx0aWYgKCRtYXBTaXplKCRtKSA9PT0gMCkge1xuXHRcdFx0XHRcdCRtID0gdm9pZCB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdGdldDogZnVuY3Rpb24gKGtleSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG5cdFx0XHRpZiAoJG0pIHtcblx0XHRcdFx0cmV0dXJuICRtYXBHZXQoJG0sIGtleSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRoYXM6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdGlmICgkbSkge1xuXHRcdFx0XHRyZXR1cm4gJG1hcEhhcygkbSwga2V5KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0XHRcdGlmICghJG0pIHtcblx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUUyBjYW4ndCBoYW5kbGUgbmFycm93aW5nIGEgdmFyaWFibGUgaW5zaWRlIGEgY2xvc3VyZVxuXHRcdFx0XHQkbSA9IG5ldyAkTWFwKCk7XG5cdFx0XHR9XG5cdFx0XHQkbWFwU2V0KCRtLCBrZXksIHZhbHVlKTtcblx0XHR9XG5cdH07XG5cblx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUT0RPOiBmaWd1cmUgb3V0IHdoeSBUUyBpcyBlcnJvcmluZyBoZXJlXG5cdHJldHVybiBjaGFubmVsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJvdW5kJyk7XG52YXIgaW5zcGVjdCA9IHJlcXVpcmUoJ29iamVjdC1pbnNwZWN0Jyk7XG52YXIgZ2V0U2lkZUNoYW5uZWxNYXAgPSByZXF1aXJlKCdzaWRlLWNoYW5uZWwtbWFwJyk7XG5cbnZhciAkVHlwZUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3R5cGUnKTtcbnZhciAkV2Vha01hcCA9IEdldEludHJpbnNpYygnJVdlYWtNYXAlJywgdHJ1ZSk7XG5cbi8qKiBAdHlwZSB7PEsgZXh0ZW5kcyBvYmplY3QsIFY+KHRoaXNBcmc6IFdlYWtNYXA8SywgVj4sIGtleTogSykgPT4gVn0gKi9cbnZhciAkd2Vha01hcEdldCA9IGNhbGxCb3VuZCgnV2Vha01hcC5wcm90b3R5cGUuZ2V0JywgdHJ1ZSk7XG4vKiogQHR5cGUgezxLIGV4dGVuZHMgb2JqZWN0LCBWPih0aGlzQXJnOiBXZWFrTWFwPEssIFY+LCBrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSAqL1xudmFyICR3ZWFrTWFwU2V0ID0gY2FsbEJvdW5kKCdXZWFrTWFwLnByb3RvdHlwZS5zZXQnLCB0cnVlKTtcbi8qKiBAdHlwZSB7PEsgZXh0ZW5kcyBvYmplY3QsIFY+KHRoaXNBcmc6IFdlYWtNYXA8SywgVj4sIGtleTogSykgPT4gYm9vbGVhbn0gKi9cbnZhciAkd2Vha01hcEhhcyA9IGNhbGxCb3VuZCgnV2Vha01hcC5wcm90b3R5cGUuaGFzJywgdHJ1ZSk7XG4vKiogQHR5cGUgezxLIGV4dGVuZHMgb2JqZWN0LCBWPih0aGlzQXJnOiBXZWFrTWFwPEssIFY+LCBrZXk6IEspID0+IGJvb2xlYW59ICovXG52YXIgJHdlYWtNYXBEZWxldGUgPSBjYWxsQm91bmQoJ1dlYWtNYXAucHJvdG90eXBlLmRlbGV0ZScsIHRydWUpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSAkV2Vha01hcFxuXHQ/IC8qKiBAdHlwZSB7RXhjbHVkZTxpbXBvcnQoJy4nKSwgZmFsc2U+fSAqLyBmdW5jdGlvbiBnZXRTaWRlQ2hhbm5lbFdlYWtNYXAoKSB7XG5cdFx0LyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBnZXRTaWRlQ2hhbm5lbFdlYWtNYXA+fSBDaGFubmVsICovXG5cdFx0LyoqIEB0eXBlZGVmIHtQYXJhbWV0ZXJzPENoYW5uZWxbJ2dldCddPlswXX0gSyAqL1xuXHRcdC8qKiBAdHlwZWRlZiB7UGFyYW1ldGVyczxDaGFubmVsWydzZXQnXT5bMV19IFYgKi9cblxuXHRcdC8qKiBAdHlwZSB7V2Vha01hcDxLICYgb2JqZWN0LCBWPiB8IHVuZGVmaW5lZH0gKi8gdmFyICR3bTtcblx0XHQvKiogQHR5cGUge0NoYW5uZWwgfCB1bmRlZmluZWR9ICovIHZhciAkbTtcblxuXHRcdC8qKiBAdHlwZSB7Q2hhbm5lbH0gKi9cblx0XHR2YXIgY2hhbm5lbCA9IHtcblx0XHRcdGFzc2VydDogZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0XHRpZiAoIWNoYW5uZWwuaGFzKGtleSkpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignU2lkZSBjaGFubmVsIGRvZXMgbm90IGNvbnRhaW4gJyArIGluc3BlY3Qoa2V5KSk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0XHRpZiAoJFdlYWtNYXAgJiYga2V5ICYmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0XHRcdGlmICgkd20pIHtcblx0XHRcdFx0XHRcdHJldHVybiAkd2Vha01hcERlbGV0ZSgkd20sIGtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGdldFNpZGVDaGFubmVsTWFwKSB7XG5cdFx0XHRcdFx0aWYgKCRtKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJG1bJ2RlbGV0ZSddKGtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0sXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdFx0aWYgKCRXZWFrTWFwICYmIGtleSAmJiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIGtleSA9PT0gJ2Z1bmN0aW9uJykpIHtcblx0XHRcdFx0XHRpZiAoJHdtKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJHdlYWtNYXBHZXQoJHdtLCBrZXkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gJG0gJiYgJG0uZ2V0KGtleSk7XG5cdFx0XHR9LFxuXHRcdFx0aGFzOiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRcdGlmICgkV2Vha01hcCAmJiBrZXkgJiYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRcdFx0aWYgKCR3bSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuICR3ZWFrTWFwSGFzKCR3bSwga2V5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuICEhJG0gJiYgJG0uaGFzKGtleSk7XG5cdFx0XHR9LFxuXHRcdFx0c2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuXHRcdFx0XHRpZiAoJFdlYWtNYXAgJiYga2V5ICYmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0XHRcdGlmICghJHdtKSB7XG5cdFx0XHRcdFx0XHQkd20gPSBuZXcgJFdlYWtNYXAoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0JHdlYWtNYXBTZXQoJHdtLCBrZXksIHZhbHVlKTtcblx0XHRcdFx0fSBlbHNlIGlmIChnZXRTaWRlQ2hhbm5lbE1hcCkge1xuXHRcdFx0XHRcdGlmICghJG0pIHtcblx0XHRcdFx0XHRcdCRtID0gZ2V0U2lkZUNoYW5uZWxNYXAoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXBhcmVuc1xuXHRcdFx0XHRcdC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mICRtPn0gKi8gKCRtKS5zZXQoa2V5LCB2YWx1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUT0RPOiBmaWd1cmUgb3V0IHdoeSB0aGlzIGlzIGVycm9yaW5nXG5cdFx0cmV0dXJuIGNoYW5uZWw7XG5cdH1cblx0OiBnZXRTaWRlQ2hhbm5lbE1hcDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xudmFyIGluc3BlY3QgPSByZXF1aXJlKCdvYmplY3QtaW5zcGVjdCcpO1xudmFyIGdldFNpZGVDaGFubmVsTGlzdCA9IHJlcXVpcmUoJ3NpZGUtY2hhbm5lbC1saXN0Jyk7XG52YXIgZ2V0U2lkZUNoYW5uZWxNYXAgPSByZXF1aXJlKCdzaWRlLWNoYW5uZWwtbWFwJyk7XG52YXIgZ2V0U2lkZUNoYW5uZWxXZWFrTWFwID0gcmVxdWlyZSgnc2lkZS1jaGFubmVsLXdlYWttYXAnKTtcblxudmFyIG1ha2VDaGFubmVsID0gZ2V0U2lkZUNoYW5uZWxXZWFrTWFwIHx8IGdldFNpZGVDaGFubmVsTWFwIHx8IGdldFNpZGVDaGFubmVsTGlzdDtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0U2lkZUNoYW5uZWwoKSB7XG5cdC8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgZ2V0U2lkZUNoYW5uZWw+fSBDaGFubmVsICovXG5cblx0LyoqIEB0eXBlIHtDaGFubmVsIHwgdW5kZWZpbmVkfSAqLyB2YXIgJGNoYW5uZWxEYXRhO1xuXG5cdC8qKiBAdHlwZSB7Q2hhbm5lbH0gKi9cblx0dmFyIGNoYW5uZWwgPSB7XG5cdFx0YXNzZXJ0OiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRpZiAoIWNoYW5uZWwuaGFzKGtleSkpIHtcblx0XHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1NpZGUgY2hhbm5lbCBkb2VzIG5vdCBjb250YWluICcgKyBpbnNwZWN0KGtleSkpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdHJldHVybiAhISRjaGFubmVsRGF0YSAmJiAkY2hhbm5lbERhdGFbJ2RlbGV0ZSddKGtleSk7XG5cdFx0fSxcblx0XHRnZXQ6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdHJldHVybiAkY2hhbm5lbERhdGEgJiYgJGNoYW5uZWxEYXRhLmdldChrZXkpO1xuXHRcdH0sXG5cdFx0aGFzOiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRyZXR1cm4gISEkY2hhbm5lbERhdGEgJiYgJGNoYW5uZWxEYXRhLmhhcyhrZXkpO1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuXHRcdFx0aWYgKCEkY2hhbm5lbERhdGEpIHtcblx0XHRcdFx0JGNoYW5uZWxEYXRhID0gbWFrZUNoYW5uZWwoKTtcblx0XHRcdH1cblxuXHRcdFx0JGNoYW5uZWxEYXRhLnNldChrZXksIHZhbHVlKTtcblx0XHR9XG5cdH07XG5cdC8vIEB0cy1leHBlY3QtZXJyb3IgVE9ETzogZmlndXJlIG91dCB3aHkgdGhpcyBpcyBlcnJvcmluZ1xuXHRyZXR1cm4gY2hhbm5lbDtcbn07XG4iLCIhZnVuY3Rpb24oaSl7XCJ1c2Ugc3RyaWN0XCI7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJqcXVlcnlcIl0saSk6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9aShyZXF1aXJlKFwianF1ZXJ5XCIpKTppKGpRdWVyeSl9KGZ1bmN0aW9uKGkpe1widXNlIHN0cmljdFwiO3ZhciBlPXdpbmRvdy5TbGlja3x8e307KGU9ZnVuY3Rpb24oKXt2YXIgZT0wO3JldHVybiBmdW5jdGlvbih0LG8pe3ZhciBzLG49dGhpcztuLmRlZmF1bHRzPXthY2Nlc3NpYmlsaXR5OiEwLGFkYXB0aXZlSGVpZ2h0OiExLGFwcGVuZEFycm93czppKHQpLGFwcGVuZERvdHM6aSh0KSxhcnJvd3M6ITAsYXNOYXZGb3I6bnVsbCxwcmV2QXJyb3c6JzxidXR0b24gY2xhc3M9XCJzbGljay1wcmV2XCIgYXJpYS1sYWJlbD1cIlByZXZpb3VzXCIgdHlwZT1cImJ1dHRvblwiPlByZXZpb3VzPC9idXR0b24+JyxuZXh0QXJyb3c6JzxidXR0b24gY2xhc3M9XCJzbGljay1uZXh0XCIgYXJpYS1sYWJlbD1cIk5leHRcIiB0eXBlPVwiYnV0dG9uXCI+TmV4dDwvYnV0dG9uPicsYXV0b3BsYXk6ITEsYXV0b3BsYXlTcGVlZDozZTMsY2VudGVyTW9kZTohMSxjZW50ZXJQYWRkaW5nOlwiNTBweFwiLGNzc0Vhc2U6XCJlYXNlXCIsY3VzdG9tUGFnaW5nOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGkoJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIC8+JykudGV4dCh0KzEpfSxkb3RzOiExLGRvdHNDbGFzczpcInNsaWNrLWRvdHNcIixkcmFnZ2FibGU6ITAsZWFzaW5nOlwibGluZWFyXCIsZWRnZUZyaWN0aW9uOi4zNSxmYWRlOiExLGZvY3VzT25TZWxlY3Q6ITEsZm9jdXNPbkNoYW5nZTohMSxpbmZpbml0ZTohMCxpbml0aWFsU2xpZGU6MCxsYXp5TG9hZDpcIm9uZGVtYW5kXCIsbW9iaWxlRmlyc3Q6ITEscGF1c2VPbkhvdmVyOiEwLHBhdXNlT25Gb2N1czohMCxwYXVzZU9uRG90c0hvdmVyOiExLHJlc3BvbmRUbzpcIndpbmRvd1wiLHJlc3BvbnNpdmU6bnVsbCxyb3dzOjEscnRsOiExLHNsaWRlOlwiXCIsc2xpZGVzUGVyUm93OjEsc2xpZGVzVG9TaG93OjEsc2xpZGVzVG9TY3JvbGw6MSxzcGVlZDo1MDAsc3dpcGU6ITAsc3dpcGVUb1NsaWRlOiExLHRvdWNoTW92ZTohMCx0b3VjaFRocmVzaG9sZDo1LHVzZUNTUzohMCx1c2VUcmFuc2Zvcm06ITAsdmFyaWFibGVXaWR0aDohMSx2ZXJ0aWNhbDohMSx2ZXJ0aWNhbFN3aXBpbmc6ITEsd2FpdEZvckFuaW1hdGU6ITAsekluZGV4OjFlM30sbi5pbml0aWFscz17YW5pbWF0aW5nOiExLGRyYWdnaW5nOiExLGF1dG9QbGF5VGltZXI6bnVsbCxjdXJyZW50RGlyZWN0aW9uOjAsY3VycmVudExlZnQ6bnVsbCxjdXJyZW50U2xpZGU6MCxkaXJlY3Rpb246MSwkZG90czpudWxsLGxpc3RXaWR0aDpudWxsLGxpc3RIZWlnaHQ6bnVsbCxsb2FkSW5kZXg6MCwkbmV4dEFycm93Om51bGwsJHByZXZBcnJvdzpudWxsLHNjcm9sbGluZzohMSxzbGlkZUNvdW50Om51bGwsc2xpZGVXaWR0aDpudWxsLCRzbGlkZVRyYWNrOm51bGwsJHNsaWRlczpudWxsLHNsaWRpbmc6ITEsc2xpZGVPZmZzZXQ6MCxzd2lwZUxlZnQ6bnVsbCxzd2lwaW5nOiExLCRsaXN0Om51bGwsdG91Y2hPYmplY3Q6e30sdHJhbnNmb3Jtc0VuYWJsZWQ6ITEsdW5zbGlja2VkOiExfSxpLmV4dGVuZChuLG4uaW5pdGlhbHMpLG4uYWN0aXZlQnJlYWtwb2ludD1udWxsLG4uYW5pbVR5cGU9bnVsbCxuLmFuaW1Qcm9wPW51bGwsbi5icmVha3BvaW50cz1bXSxuLmJyZWFrcG9pbnRTZXR0aW5ncz1bXSxuLmNzc1RyYW5zaXRpb25zPSExLG4uZm9jdXNzZWQ9ITEsbi5pbnRlcnJ1cHRlZD0hMSxuLmhpZGRlbj1cImhpZGRlblwiLG4ucGF1c2VkPSEwLG4ucG9zaXRpb25Qcm9wPW51bGwsbi5yZXNwb25kVG89bnVsbCxuLnJvd0NvdW50PTEsbi5zaG91bGRDbGljaz0hMCxuLiRzbGlkZXI9aSh0KSxuLiRzbGlkZXNDYWNoZT1udWxsLG4udHJhbnNmb3JtVHlwZT1udWxsLG4udHJhbnNpdGlvblR5cGU9bnVsbCxuLnZpc2liaWxpdHlDaGFuZ2U9XCJ2aXNpYmlsaXR5Y2hhbmdlXCIsbi53aW5kb3dXaWR0aD0wLG4ud2luZG93VGltZXI9bnVsbCxzPWkodCkuZGF0YShcInNsaWNrXCIpfHx7fSxuLm9wdGlvbnM9aS5leHRlbmQoe30sbi5kZWZhdWx0cyxvLHMpLG4uY3VycmVudFNsaWRlPW4ub3B0aW9ucy5pbml0aWFsU2xpZGUsbi5vcmlnaW5hbFNldHRpbmdzPW4ub3B0aW9ucyx2b2lkIDAhPT1kb2N1bWVudC5tb3pIaWRkZW4/KG4uaGlkZGVuPVwibW96SGlkZGVuXCIsbi52aXNpYmlsaXR5Q2hhbmdlPVwibW96dmlzaWJpbGl0eWNoYW5nZVwiKTp2b2lkIDAhPT1kb2N1bWVudC53ZWJraXRIaWRkZW4mJihuLmhpZGRlbj1cIndlYmtpdEhpZGRlblwiLG4udmlzaWJpbGl0eUNoYW5nZT1cIndlYmtpdHZpc2liaWxpdHljaGFuZ2VcIiksbi5hdXRvUGxheT1pLnByb3h5KG4uYXV0b1BsYXksbiksbi5hdXRvUGxheUNsZWFyPWkucHJveHkobi5hdXRvUGxheUNsZWFyLG4pLG4uYXV0b1BsYXlJdGVyYXRvcj1pLnByb3h5KG4uYXV0b1BsYXlJdGVyYXRvcixuKSxuLmNoYW5nZVNsaWRlPWkucHJveHkobi5jaGFuZ2VTbGlkZSxuKSxuLmNsaWNrSGFuZGxlcj1pLnByb3h5KG4uY2xpY2tIYW5kbGVyLG4pLG4uc2VsZWN0SGFuZGxlcj1pLnByb3h5KG4uc2VsZWN0SGFuZGxlcixuKSxuLnNldFBvc2l0aW9uPWkucHJveHkobi5zZXRQb3NpdGlvbixuKSxuLnN3aXBlSGFuZGxlcj1pLnByb3h5KG4uc3dpcGVIYW5kbGVyLG4pLG4uZHJhZ0hhbmRsZXI9aS5wcm94eShuLmRyYWdIYW5kbGVyLG4pLG4ua2V5SGFuZGxlcj1pLnByb3h5KG4ua2V5SGFuZGxlcixuKSxuLmluc3RhbmNlVWlkPWUrKyxuLmh0bWxFeHByPS9eKD86XFxzKig8W1xcd1xcV10rPilbXj5dKikkLyxuLnJlZ2lzdGVyQnJlYWtwb2ludHMoKSxuLmluaXQoITApfX0oKSkucHJvdG90eXBlLmFjdGl2YXRlQURBPWZ1bmN0aW9uKCl7dGhpcy4kc2xpZGVUcmFjay5maW5kKFwiLnNsaWNrLWFjdGl2ZVwiKS5hdHRyKHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwifSkuZmluZChcImEsIGlucHV0LCBidXR0b24sIHNlbGVjdFwiKS5hdHRyKHt0YWJpbmRleDpcIjBcIn0pfSxlLnByb3RvdHlwZS5hZGRTbGlkZT1lLnByb3RvdHlwZS5zbGlja0FkZD1mdW5jdGlvbihlLHQsbyl7dmFyIHM9dGhpcztpZihcImJvb2xlYW5cIj09dHlwZW9mIHQpbz10LHQ9bnVsbDtlbHNlIGlmKHQ8MHx8dD49cy5zbGlkZUNvdW50KXJldHVybiExO3MudW5sb2FkKCksXCJudW1iZXJcIj09dHlwZW9mIHQ/MD09PXQmJjA9PT1zLiRzbGlkZXMubGVuZ3RoP2koZSkuYXBwZW5kVG8ocy4kc2xpZGVUcmFjayk6bz9pKGUpLmluc2VydEJlZm9yZShzLiRzbGlkZXMuZXEodCkpOmkoZSkuaW5zZXJ0QWZ0ZXIocy4kc2xpZGVzLmVxKHQpKTohMD09PW8/aShlKS5wcmVwZW5kVG8ocy4kc2xpZGVUcmFjayk6aShlKS5hcHBlbmRUbyhzLiRzbGlkZVRyYWNrKSxzLiRzbGlkZXM9cy4kc2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpLHMuJHNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKS5kZXRhY2goKSxzLiRzbGlkZVRyYWNrLmFwcGVuZChzLiRzbGlkZXMpLHMuJHNsaWRlcy5lYWNoKGZ1bmN0aW9uKGUsdCl7aSh0KS5hdHRyKFwiZGF0YS1zbGljay1pbmRleFwiLGUpfSkscy4kc2xpZGVzQ2FjaGU9cy4kc2xpZGVzLHMucmVpbml0KCl9LGUucHJvdG90eXBlLmFuaW1hdGVIZWlnaHQ9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2lmKDE9PT1pLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYhMD09PWkub3B0aW9ucy5hZGFwdGl2ZUhlaWdodCYmITE9PT1pLm9wdGlvbnMudmVydGljYWwpe3ZhciBlPWkuJHNsaWRlcy5lcShpLmN1cnJlbnRTbGlkZSkub3V0ZXJIZWlnaHQoITApO2kuJGxpc3QuYW5pbWF0ZSh7aGVpZ2h0OmV9LGkub3B0aW9ucy5zcGVlZCl9fSxlLnByb3RvdHlwZS5hbmltYXRlU2xpZGU9ZnVuY3Rpb24oZSx0KXt2YXIgbz17fSxzPXRoaXM7cy5hbmltYXRlSGVpZ2h0KCksITA9PT1zLm9wdGlvbnMucnRsJiYhMT09PXMub3B0aW9ucy52ZXJ0aWNhbCYmKGU9LWUpLCExPT09cy50cmFuc2Zvcm1zRW5hYmxlZD8hMT09PXMub3B0aW9ucy52ZXJ0aWNhbD9zLiRzbGlkZVRyYWNrLmFuaW1hdGUoe2xlZnQ6ZX0scy5vcHRpb25zLnNwZWVkLHMub3B0aW9ucy5lYXNpbmcsdCk6cy4kc2xpZGVUcmFjay5hbmltYXRlKHt0b3A6ZX0scy5vcHRpb25zLnNwZWVkLHMub3B0aW9ucy5lYXNpbmcsdCk6ITE9PT1zLmNzc1RyYW5zaXRpb25zPyghMD09PXMub3B0aW9ucy5ydGwmJihzLmN1cnJlbnRMZWZ0PS1zLmN1cnJlbnRMZWZ0KSxpKHthbmltU3RhcnQ6cy5jdXJyZW50TGVmdH0pLmFuaW1hdGUoe2FuaW1TdGFydDplfSx7ZHVyYXRpb246cy5vcHRpb25zLnNwZWVkLGVhc2luZzpzLm9wdGlvbnMuZWFzaW5nLHN0ZXA6ZnVuY3Rpb24oaSl7aT1NYXRoLmNlaWwoaSksITE9PT1zLm9wdGlvbnMudmVydGljYWw/KG9bcy5hbmltVHlwZV09XCJ0cmFuc2xhdGUoXCIraStcInB4LCAwcHgpXCIscy4kc2xpZGVUcmFjay5jc3MobykpOihvW3MuYW5pbVR5cGVdPVwidHJhbnNsYXRlKDBweCxcIitpK1wicHgpXCIscy4kc2xpZGVUcmFjay5jc3MobykpfSxjb21wbGV0ZTpmdW5jdGlvbigpe3QmJnQuY2FsbCgpfX0pKToocy5hcHBseVRyYW5zaXRpb24oKSxlPU1hdGguY2VpbChlKSwhMT09PXMub3B0aW9ucy52ZXJ0aWNhbD9vW3MuYW5pbVR5cGVdPVwidHJhbnNsYXRlM2QoXCIrZStcInB4LCAwcHgsIDBweClcIjpvW3MuYW5pbVR5cGVdPVwidHJhbnNsYXRlM2QoMHB4LFwiK2UrXCJweCwgMHB4KVwiLHMuJHNsaWRlVHJhY2suY3NzKG8pLHQmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtzLmRpc2FibGVUcmFuc2l0aW9uKCksdC5jYWxsKCl9LHMub3B0aW9ucy5zcGVlZCkpfSxlLnByb3RvdHlwZS5nZXROYXZUYXJnZXQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS5vcHRpb25zLmFzTmF2Rm9yO3JldHVybiB0JiZudWxsIT09dCYmKHQ9aSh0KS5ub3QoZS4kc2xpZGVyKSksdH0sZS5wcm90b3R5cGUuYXNOYXZGb3I9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXROYXZUYXJnZXQoKTtudWxsIT09dCYmXCJvYmplY3RcIj09dHlwZW9mIHQmJnQuZWFjaChmdW5jdGlvbigpe3ZhciB0PWkodGhpcykuc2xpY2soXCJnZXRTbGlja1wiKTt0LnVuc2xpY2tlZHx8dC5zbGlkZUhhbmRsZXIoZSwhMCl9KX0sZS5wcm90b3R5cGUuYXBwbHlUcmFuc2l0aW9uPWZ1bmN0aW9uKGkpe3ZhciBlPXRoaXMsdD17fTshMT09PWUub3B0aW9ucy5mYWRlP3RbZS50cmFuc2l0aW9uVHlwZV09ZS50cmFuc2Zvcm1UeXBlK1wiIFwiK2Uub3B0aW9ucy5zcGVlZCtcIm1zIFwiK2Uub3B0aW9ucy5jc3NFYXNlOnRbZS50cmFuc2l0aW9uVHlwZV09XCJvcGFjaXR5IFwiK2Uub3B0aW9ucy5zcGVlZCtcIm1zIFwiK2Uub3B0aW9ucy5jc3NFYXNlLCExPT09ZS5vcHRpb25zLmZhZGU/ZS4kc2xpZGVUcmFjay5jc3ModCk6ZS4kc2xpZGVzLmVxKGkpLmNzcyh0KX0sZS5wcm90b3R5cGUuYXV0b1BsYXk9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2kuYXV0b1BsYXlDbGVhcigpLGkuc2xpZGVDb3VudD5pLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoaS5hdXRvUGxheVRpbWVyPXNldEludGVydmFsKGkuYXV0b1BsYXlJdGVyYXRvcixpLm9wdGlvbnMuYXV0b3BsYXlTcGVlZCkpfSxlLnByb3RvdHlwZS5hdXRvUGxheUNsZWFyPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztpLmF1dG9QbGF5VGltZXImJmNsZWFySW50ZXJ2YWwoaS5hdXRvUGxheVRpbWVyKX0sZS5wcm90b3R5cGUuYXV0b1BsYXlJdGVyYXRvcj1mdW5jdGlvbigpe3ZhciBpPXRoaXMsZT1pLmN1cnJlbnRTbGlkZStpLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw7aS5wYXVzZWR8fGkuaW50ZXJydXB0ZWR8fGkuZm9jdXNzZWR8fCghMT09PWkub3B0aW9ucy5pbmZpbml0ZSYmKDE9PT1pLmRpcmVjdGlvbiYmaS5jdXJyZW50U2xpZGUrMT09PWkuc2xpZGVDb3VudC0xP2kuZGlyZWN0aW9uPTA6MD09PWkuZGlyZWN0aW9uJiYoZT1pLmN1cnJlbnRTbGlkZS1pLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwsaS5jdXJyZW50U2xpZGUtMT09MCYmKGkuZGlyZWN0aW9uPTEpKSksaS5zbGlkZUhhbmRsZXIoZSkpfSxlLnByb3RvdHlwZS5idWlsZEFycm93cz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ITA9PT1lLm9wdGlvbnMuYXJyb3dzJiYoZS4kcHJldkFycm93PWkoZS5vcHRpb25zLnByZXZBcnJvdykuYWRkQ2xhc3MoXCJzbGljay1hcnJvd1wiKSxlLiRuZXh0QXJyb3c9aShlLm9wdGlvbnMubmV4dEFycm93KS5hZGRDbGFzcyhcInNsaWNrLWFycm93XCIpLGUuc2xpZGVDb3VudD5lLm9wdGlvbnMuc2xpZGVzVG9TaG93PyhlLiRwcmV2QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1oaWRkZW5cIikucmVtb3ZlQXR0cihcImFyaWEtaGlkZGVuIHRhYmluZGV4XCIpLGUuJG5leHRBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWhpZGRlblwiKS5yZW1vdmVBdHRyKFwiYXJpYS1oaWRkZW4gdGFiaW5kZXhcIiksZS5odG1sRXhwci50ZXN0KGUub3B0aW9ucy5wcmV2QXJyb3cpJiZlLiRwcmV2QXJyb3cucHJlcGVuZFRvKGUub3B0aW9ucy5hcHBlbmRBcnJvd3MpLGUuaHRtbEV4cHIudGVzdChlLm9wdGlvbnMubmV4dEFycm93KSYmZS4kbmV4dEFycm93LmFwcGVuZFRvKGUub3B0aW9ucy5hcHBlbmRBcnJvd3MpLCEwIT09ZS5vcHRpb25zLmluZmluaXRlJiZlLiRwcmV2QXJyb3cuYWRkQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwidHJ1ZVwiKSk6ZS4kcHJldkFycm93LmFkZChlLiRuZXh0QXJyb3cpLmFkZENsYXNzKFwic2xpY2staGlkZGVuXCIpLmF0dHIoe1wiYXJpYS1kaXNhYmxlZFwiOlwidHJ1ZVwiLHRhYmluZGV4OlwiLTFcIn0pKX0sZS5wcm90b3R5cGUuYnVpbGREb3RzPWZ1bmN0aW9uKCl7dmFyIGUsdCxvPXRoaXM7aWYoITA9PT1vLm9wdGlvbnMuZG90cyl7Zm9yKG8uJHNsaWRlci5hZGRDbGFzcyhcInNsaWNrLWRvdHRlZFwiKSx0PWkoXCI8dWwgLz5cIikuYWRkQ2xhc3Moby5vcHRpb25zLmRvdHNDbGFzcyksZT0wO2U8PW8uZ2V0RG90Q291bnQoKTtlKz0xKXQuYXBwZW5kKGkoXCI8bGkgLz5cIikuYXBwZW5kKG8ub3B0aW9ucy5jdXN0b21QYWdpbmcuY2FsbCh0aGlzLG8sZSkpKTtvLiRkb3RzPXQuYXBwZW5kVG8oby5vcHRpb25zLmFwcGVuZERvdHMpLG8uJGRvdHMuZmluZChcImxpXCIpLmZpcnN0KCkuYWRkQ2xhc3MoXCJzbGljay1hY3RpdmVcIil9fSxlLnByb3RvdHlwZS5idWlsZE91dD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS4kc2xpZGVzPWUuJHNsaWRlci5jaGlsZHJlbihlLm9wdGlvbnMuc2xpZGUrXCI6bm90KC5zbGljay1jbG9uZWQpXCIpLmFkZENsYXNzKFwic2xpY2stc2xpZGVcIiksZS5zbGlkZUNvdW50PWUuJHNsaWRlcy5sZW5ndGgsZS4kc2xpZGVzLmVhY2goZnVuY3Rpb24oZSx0KXtpKHQpLmF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIsZSkuZGF0YShcIm9yaWdpbmFsU3R5bGluZ1wiLGkodCkuYXR0cihcInN0eWxlXCIpfHxcIlwiKX0pLGUuJHNsaWRlci5hZGRDbGFzcyhcInNsaWNrLXNsaWRlclwiKSxlLiRzbGlkZVRyYWNrPTA9PT1lLnNsaWRlQ291bnQ/aSgnPGRpdiBjbGFzcz1cInNsaWNrLXRyYWNrXCIvPicpLmFwcGVuZFRvKGUuJHNsaWRlcik6ZS4kc2xpZGVzLndyYXBBbGwoJzxkaXYgY2xhc3M9XCJzbGljay10cmFja1wiLz4nKS5wYXJlbnQoKSxlLiRsaXN0PWUuJHNsaWRlVHJhY2sud3JhcCgnPGRpdiBjbGFzcz1cInNsaWNrLWxpc3RcIi8+JykucGFyZW50KCksZS4kc2xpZGVUcmFjay5jc3MoXCJvcGFjaXR5XCIsMCksITAhPT1lLm9wdGlvbnMuY2VudGVyTW9kZSYmITAhPT1lLm9wdGlvbnMuc3dpcGVUb1NsaWRlfHwoZS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsPTEpLGkoXCJpbWdbZGF0YS1sYXp5XVwiLGUuJHNsaWRlcikubm90KFwiW3NyY11cIikuYWRkQ2xhc3MoXCJzbGljay1sb2FkaW5nXCIpLGUuc2V0dXBJbmZpbml0ZSgpLGUuYnVpbGRBcnJvd3MoKSxlLmJ1aWxkRG90cygpLGUudXBkYXRlRG90cygpLGUuc2V0U2xpZGVDbGFzc2VzKFwibnVtYmVyXCI9PXR5cGVvZiBlLmN1cnJlbnRTbGlkZT9lLmN1cnJlbnRTbGlkZTowKSwhMD09PWUub3B0aW9ucy5kcmFnZ2FibGUmJmUuJGxpc3QuYWRkQ2xhc3MoXCJkcmFnZ2FibGVcIil9LGUucHJvdG90eXBlLmJ1aWxkUm93cz1mdW5jdGlvbigpe3ZhciBpLGUsdCxvLHMsbixyLGw9dGhpcztpZihvPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxuPWwuJHNsaWRlci5jaGlsZHJlbigpLGwub3B0aW9ucy5yb3dzPjEpe2ZvcihyPWwub3B0aW9ucy5zbGlkZXNQZXJSb3cqbC5vcHRpb25zLnJvd3Mscz1NYXRoLmNlaWwobi5sZW5ndGgvciksaT0wO2k8cztpKyspe3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7Zm9yKGU9MDtlPGwub3B0aW9ucy5yb3dzO2UrKyl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtmb3IodD0wO3Q8bC5vcHRpb25zLnNsaWRlc1BlclJvdzt0Kyspe3ZhciBjPWkqcisoZSpsLm9wdGlvbnMuc2xpZGVzUGVyUm93K3QpO24uZ2V0KGMpJiZhLmFwcGVuZENoaWxkKG4uZ2V0KGMpKX1kLmFwcGVuZENoaWxkKGEpfW8uYXBwZW5kQ2hpbGQoZCl9bC4kc2xpZGVyLmVtcHR5KCkuYXBwZW5kKG8pLGwuJHNsaWRlci5jaGlsZHJlbigpLmNoaWxkcmVuKCkuY2hpbGRyZW4oKS5jc3Moe3dpZHRoOjEwMC9sLm9wdGlvbnMuc2xpZGVzUGVyUm93K1wiJVwiLGRpc3BsYXk6XCJpbmxpbmUtYmxvY2tcIn0pfX0sZS5wcm90b3R5cGUuY2hlY2tSZXNwb25zaXZlPWZ1bmN0aW9uKGUsdCl7dmFyIG8scyxuLHI9dGhpcyxsPSExLGQ9ci4kc2xpZGVyLndpZHRoKCksYT13aW5kb3cuaW5uZXJXaWR0aHx8aSh3aW5kb3cpLndpZHRoKCk7aWYoXCJ3aW5kb3dcIj09PXIucmVzcG9uZFRvP249YTpcInNsaWRlclwiPT09ci5yZXNwb25kVG8/bj1kOlwibWluXCI9PT1yLnJlc3BvbmRUbyYmKG49TWF0aC5taW4oYSxkKSksci5vcHRpb25zLnJlc3BvbnNpdmUmJnIub3B0aW9ucy5yZXNwb25zaXZlLmxlbmd0aCYmbnVsbCE9PXIub3B0aW9ucy5yZXNwb25zaXZlKXtzPW51bGw7Zm9yKG8gaW4gci5icmVha3BvaW50cylyLmJyZWFrcG9pbnRzLmhhc093blByb3BlcnR5KG8pJiYoITE9PT1yLm9yaWdpbmFsU2V0dGluZ3MubW9iaWxlRmlyc3Q/bjxyLmJyZWFrcG9pbnRzW29dJiYocz1yLmJyZWFrcG9pbnRzW29dKTpuPnIuYnJlYWtwb2ludHNbb10mJihzPXIuYnJlYWtwb2ludHNbb10pKTtudWxsIT09cz9udWxsIT09ci5hY3RpdmVCcmVha3BvaW50PyhzIT09ci5hY3RpdmVCcmVha3BvaW50fHx0KSYmKHIuYWN0aXZlQnJlYWtwb2ludD1zLFwidW5zbGlja1wiPT09ci5icmVha3BvaW50U2V0dGluZ3Nbc10/ci51bnNsaWNrKHMpOihyLm9wdGlvbnM9aS5leHRlbmQoe30sci5vcmlnaW5hbFNldHRpbmdzLHIuYnJlYWtwb2ludFNldHRpbmdzW3NdKSwhMD09PWUmJihyLmN1cnJlbnRTbGlkZT1yLm9wdGlvbnMuaW5pdGlhbFNsaWRlKSxyLnJlZnJlc2goZSkpLGw9cyk6KHIuYWN0aXZlQnJlYWtwb2ludD1zLFwidW5zbGlja1wiPT09ci5icmVha3BvaW50U2V0dGluZ3Nbc10/ci51bnNsaWNrKHMpOihyLm9wdGlvbnM9aS5leHRlbmQoe30sci5vcmlnaW5hbFNldHRpbmdzLHIuYnJlYWtwb2ludFNldHRpbmdzW3NdKSwhMD09PWUmJihyLmN1cnJlbnRTbGlkZT1yLm9wdGlvbnMuaW5pdGlhbFNsaWRlKSxyLnJlZnJlc2goZSkpLGw9cyk6bnVsbCE9PXIuYWN0aXZlQnJlYWtwb2ludCYmKHIuYWN0aXZlQnJlYWtwb2ludD1udWxsLHIub3B0aW9ucz1yLm9yaWdpbmFsU2V0dGluZ3MsITA9PT1lJiYoci5jdXJyZW50U2xpZGU9ci5vcHRpb25zLmluaXRpYWxTbGlkZSksci5yZWZyZXNoKGUpLGw9cyksZXx8ITE9PT1sfHxyLiRzbGlkZXIudHJpZ2dlcihcImJyZWFrcG9pbnRcIixbcixsXSl9fSxlLnByb3RvdHlwZS5jaGFuZ2VTbGlkZT1mdW5jdGlvbihlLHQpe3ZhciBvLHMsbixyPXRoaXMsbD1pKGUuY3VycmVudFRhcmdldCk7c3dpdGNoKGwuaXMoXCJhXCIpJiZlLnByZXZlbnREZWZhdWx0KCksbC5pcyhcImxpXCIpfHwobD1sLmNsb3Nlc3QoXCJsaVwiKSksbj1yLnNsaWRlQ291bnQlci5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsIT0wLG89bj8wOihyLnNsaWRlQ291bnQtci5jdXJyZW50U2xpZGUpJXIub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCxlLmRhdGEubWVzc2FnZSl7Y2FzZVwicHJldmlvdXNcIjpzPTA9PT1vP3Iub3B0aW9ucy5zbGlkZXNUb1Njcm9sbDpyLm9wdGlvbnMuc2xpZGVzVG9TaG93LW8sci5zbGlkZUNvdW50PnIub3B0aW9ucy5zbGlkZXNUb1Nob3cmJnIuc2xpZGVIYW5kbGVyKHIuY3VycmVudFNsaWRlLXMsITEsdCk7YnJlYWs7Y2FzZVwibmV4dFwiOnM9MD09PW8/ci5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsOm8sci5zbGlkZUNvdW50PnIub3B0aW9ucy5zbGlkZXNUb1Nob3cmJnIuc2xpZGVIYW5kbGVyKHIuY3VycmVudFNsaWRlK3MsITEsdCk7YnJlYWs7Y2FzZVwiaW5kZXhcIjp2YXIgZD0wPT09ZS5kYXRhLmluZGV4PzA6ZS5kYXRhLmluZGV4fHxsLmluZGV4KCkqci5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsO3Iuc2xpZGVIYW5kbGVyKHIuY2hlY2tOYXZpZ2FibGUoZCksITEsdCksbC5jaGlsZHJlbigpLnRyaWdnZXIoXCJmb2N1c1wiKTticmVhaztkZWZhdWx0OnJldHVybn19LGUucHJvdG90eXBlLmNoZWNrTmF2aWdhYmxlPWZ1bmN0aW9uKGkpe3ZhciBlLHQ7aWYoZT10aGlzLmdldE5hdmlnYWJsZUluZGV4ZXMoKSx0PTAsaT5lW2UubGVuZ3RoLTFdKWk9ZVtlLmxlbmd0aC0xXTtlbHNlIGZvcih2YXIgbyBpbiBlKXtpZihpPGVbb10pe2k9dDticmVha310PWVbb119cmV0dXJuIGl9LGUucHJvdG90eXBlLmNsZWFuVXBFdmVudHM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2Uub3B0aW9ucy5kb3RzJiZudWxsIT09ZS4kZG90cyYmKGkoXCJsaVwiLGUuJGRvdHMpLm9mZihcImNsaWNrLnNsaWNrXCIsZS5jaGFuZ2VTbGlkZSkub2ZmKFwibW91c2VlbnRlci5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMCkpLm9mZihcIm1vdXNlbGVhdmUuc2xpY2tcIixpLnByb3h5KGUuaW50ZXJydXB0LGUsITEpKSwhMD09PWUub3B0aW9ucy5hY2Nlc3NpYmlsaXR5JiZlLiRkb3RzLm9mZihcImtleWRvd24uc2xpY2tcIixlLmtleUhhbmRsZXIpKSxlLiRzbGlkZXIub2ZmKFwiZm9jdXMuc2xpY2sgYmx1ci5zbGlja1wiKSwhMD09PWUub3B0aW9ucy5hcnJvd3MmJmUuc2xpZGVDb3VudD5lLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoZS4kcHJldkFycm93JiZlLiRwcmV2QXJyb3cub2ZmKFwiY2xpY2suc2xpY2tcIixlLmNoYW5nZVNsaWRlKSxlLiRuZXh0QXJyb3cmJmUuJG5leHRBcnJvdy5vZmYoXCJjbGljay5zbGlja1wiLGUuY2hhbmdlU2xpZGUpLCEwPT09ZS5vcHRpb25zLmFjY2Vzc2liaWxpdHkmJihlLiRwcmV2QXJyb3cmJmUuJHByZXZBcnJvdy5vZmYoXCJrZXlkb3duLnNsaWNrXCIsZS5rZXlIYW5kbGVyKSxlLiRuZXh0QXJyb3cmJmUuJG5leHRBcnJvdy5vZmYoXCJrZXlkb3duLnNsaWNrXCIsZS5rZXlIYW5kbGVyKSkpLGUuJGxpc3Qub2ZmKFwidG91Y2hzdGFydC5zbGljayBtb3VzZWRvd24uc2xpY2tcIixlLnN3aXBlSGFuZGxlciksZS4kbGlzdC5vZmYoXCJ0b3VjaG1vdmUuc2xpY2sgbW91c2Vtb3ZlLnNsaWNrXCIsZS5zd2lwZUhhbmRsZXIpLGUuJGxpc3Qub2ZmKFwidG91Y2hlbmQuc2xpY2sgbW91c2V1cC5zbGlja1wiLGUuc3dpcGVIYW5kbGVyKSxlLiRsaXN0Lm9mZihcInRvdWNoY2FuY2VsLnNsaWNrIG1vdXNlbGVhdmUuc2xpY2tcIixlLnN3aXBlSGFuZGxlciksZS4kbGlzdC5vZmYoXCJjbGljay5zbGlja1wiLGUuY2xpY2tIYW5kbGVyKSxpKGRvY3VtZW50KS5vZmYoZS52aXNpYmlsaXR5Q2hhbmdlLGUudmlzaWJpbGl0eSksZS5jbGVhblVwU2xpZGVFdmVudHMoKSwhMD09PWUub3B0aW9ucy5hY2Nlc3NpYmlsaXR5JiZlLiRsaXN0Lm9mZihcImtleWRvd24uc2xpY2tcIixlLmtleUhhbmRsZXIpLCEwPT09ZS5vcHRpb25zLmZvY3VzT25TZWxlY3QmJmkoZS4kc2xpZGVUcmFjaykuY2hpbGRyZW4oKS5vZmYoXCJjbGljay5zbGlja1wiLGUuc2VsZWN0SGFuZGxlciksaSh3aW5kb3cpLm9mZihcIm9yaWVudGF0aW9uY2hhbmdlLnNsaWNrLnNsaWNrLVwiK2UuaW5zdGFuY2VVaWQsZS5vcmllbnRhdGlvbkNoYW5nZSksaSh3aW5kb3cpLm9mZihcInJlc2l6ZS5zbGljay5zbGljay1cIitlLmluc3RhbmNlVWlkLGUucmVzaXplKSxpKFwiW2RyYWdnYWJsZSE9dHJ1ZV1cIixlLiRzbGlkZVRyYWNrKS5vZmYoXCJkcmFnc3RhcnRcIixlLnByZXZlbnREZWZhdWx0KSxpKHdpbmRvdykub2ZmKFwibG9hZC5zbGljay5zbGljay1cIitlLmluc3RhbmNlVWlkLGUuc2V0UG9zaXRpb24pfSxlLnByb3RvdHlwZS5jbGVhblVwU2xpZGVFdmVudHM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuJGxpc3Qub2ZmKFwibW91c2VlbnRlci5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMCkpLGUuJGxpc3Qub2ZmKFwibW91c2VsZWF2ZS5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMSkpfSxlLnByb3RvdHlwZS5jbGVhblVwUm93cz1mdW5jdGlvbigpe3ZhciBpLGU9dGhpcztlLm9wdGlvbnMucm93cz4xJiYoKGk9ZS4kc2xpZGVzLmNoaWxkcmVuKCkuY2hpbGRyZW4oKSkucmVtb3ZlQXR0cihcInN0eWxlXCIpLGUuJHNsaWRlci5lbXB0eSgpLmFwcGVuZChpKSl9LGUucHJvdG90eXBlLmNsaWNrSGFuZGxlcj1mdW5jdGlvbihpKXshMT09PXRoaXMuc2hvdWxkQ2xpY2smJihpLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLGkuc3RvcFByb3BhZ2F0aW9uKCksaS5wcmV2ZW50RGVmYXVsdCgpKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuYXV0b1BsYXlDbGVhcigpLHQudG91Y2hPYmplY3Q9e30sdC5jbGVhblVwRXZlbnRzKCksaShcIi5zbGljay1jbG9uZWRcIix0LiRzbGlkZXIpLmRldGFjaCgpLHQuJGRvdHMmJnQuJGRvdHMucmVtb3ZlKCksdC4kcHJldkFycm93JiZ0LiRwcmV2QXJyb3cubGVuZ3RoJiYodC4kcHJldkFycm93LnJlbW92ZUNsYXNzKFwic2xpY2stZGlzYWJsZWQgc2xpY2stYXJyb3cgc2xpY2staGlkZGVuXCIpLnJlbW92ZUF0dHIoXCJhcmlhLWhpZGRlbiBhcmlhLWRpc2FibGVkIHRhYmluZGV4XCIpLmNzcyhcImRpc3BsYXlcIixcIlwiKSx0Lmh0bWxFeHByLnRlc3QodC5vcHRpb25zLnByZXZBcnJvdykmJnQuJHByZXZBcnJvdy5yZW1vdmUoKSksdC4kbmV4dEFycm93JiZ0LiRuZXh0QXJyb3cubGVuZ3RoJiYodC4kbmV4dEFycm93LnJlbW92ZUNsYXNzKFwic2xpY2stZGlzYWJsZWQgc2xpY2stYXJyb3cgc2xpY2staGlkZGVuXCIpLnJlbW92ZUF0dHIoXCJhcmlhLWhpZGRlbiBhcmlhLWRpc2FibGVkIHRhYmluZGV4XCIpLmNzcyhcImRpc3BsYXlcIixcIlwiKSx0Lmh0bWxFeHByLnRlc3QodC5vcHRpb25zLm5leHRBcnJvdykmJnQuJG5leHRBcnJvdy5yZW1vdmUoKSksdC4kc2xpZGVzJiYodC4kc2xpZGVzLnJlbW92ZUNsYXNzKFwic2xpY2stc2xpZGUgc2xpY2stYWN0aXZlIHNsaWNrLWNlbnRlciBzbGljay12aXNpYmxlIHNsaWNrLWN1cnJlbnRcIikucmVtb3ZlQXR0cihcImFyaWEtaGlkZGVuXCIpLnJlbW92ZUF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIpLmVhY2goZnVuY3Rpb24oKXtpKHRoaXMpLmF0dHIoXCJzdHlsZVwiLGkodGhpcykuZGF0YShcIm9yaWdpbmFsU3R5bGluZ1wiKSl9KSx0LiRzbGlkZVRyYWNrLmNoaWxkcmVuKHRoaXMub3B0aW9ucy5zbGlkZSkuZGV0YWNoKCksdC4kc2xpZGVUcmFjay5kZXRhY2goKSx0LiRsaXN0LmRldGFjaCgpLHQuJHNsaWRlci5hcHBlbmQodC4kc2xpZGVzKSksdC5jbGVhblVwUm93cygpLHQuJHNsaWRlci5yZW1vdmVDbGFzcyhcInNsaWNrLXNsaWRlclwiKSx0LiRzbGlkZXIucmVtb3ZlQ2xhc3MoXCJzbGljay1pbml0aWFsaXplZFwiKSx0LiRzbGlkZXIucmVtb3ZlQ2xhc3MoXCJzbGljay1kb3R0ZWRcIiksdC51bnNsaWNrZWQ9ITAsZXx8dC4kc2xpZGVyLnRyaWdnZXIoXCJkZXN0cm95XCIsW3RdKX0sZS5wcm90b3R5cGUuZGlzYWJsZVRyYW5zaXRpb249ZnVuY3Rpb24oaSl7dmFyIGU9dGhpcyx0PXt9O3RbZS50cmFuc2l0aW9uVHlwZV09XCJcIiwhMT09PWUub3B0aW9ucy5mYWRlP2UuJHNsaWRlVHJhY2suY3NzKHQpOmUuJHNsaWRlcy5lcShpKS5jc3ModCl9LGUucHJvdG90eXBlLmZhZGVTbGlkZT1mdW5jdGlvbihpLGUpe3ZhciB0PXRoaXM7ITE9PT10LmNzc1RyYW5zaXRpb25zPyh0LiRzbGlkZXMuZXEoaSkuY3NzKHt6SW5kZXg6dC5vcHRpb25zLnpJbmRleH0pLHQuJHNsaWRlcy5lcShpKS5hbmltYXRlKHtvcGFjaXR5OjF9LHQub3B0aW9ucy5zcGVlZCx0Lm9wdGlvbnMuZWFzaW5nLGUpKToodC5hcHBseVRyYW5zaXRpb24oaSksdC4kc2xpZGVzLmVxKGkpLmNzcyh7b3BhY2l0eToxLHpJbmRleDp0Lm9wdGlvbnMuekluZGV4fSksZSYmc2V0VGltZW91dChmdW5jdGlvbigpe3QuZGlzYWJsZVRyYW5zaXRpb24oaSksZS5jYWxsKCl9LHQub3B0aW9ucy5zcGVlZCkpfSxlLnByb3RvdHlwZS5mYWRlU2xpZGVPdXQ9ZnVuY3Rpb24oaSl7dmFyIGU9dGhpczshMT09PWUuY3NzVHJhbnNpdGlvbnM/ZS4kc2xpZGVzLmVxKGkpLmFuaW1hdGUoe29wYWNpdHk6MCx6SW5kZXg6ZS5vcHRpb25zLnpJbmRleC0yfSxlLm9wdGlvbnMuc3BlZWQsZS5vcHRpb25zLmVhc2luZyk6KGUuYXBwbHlUcmFuc2l0aW9uKGkpLGUuJHNsaWRlcy5lcShpKS5jc3Moe29wYWNpdHk6MCx6SW5kZXg6ZS5vcHRpb25zLnpJbmRleC0yfSkpfSxlLnByb3RvdHlwZS5maWx0ZXJTbGlkZXM9ZS5wcm90b3R5cGUuc2xpY2tGaWx0ZXI9ZnVuY3Rpb24oaSl7dmFyIGU9dGhpcztudWxsIT09aSYmKGUuJHNsaWRlc0NhY2hlPWUuJHNsaWRlcyxlLnVubG9hZCgpLGUuJHNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKS5kZXRhY2goKSxlLiRzbGlkZXNDYWNoZS5maWx0ZXIoaSkuYXBwZW5kVG8oZS4kc2xpZGVUcmFjayksZS5yZWluaXQoKSl9LGUucHJvdG90eXBlLmZvY3VzSGFuZGxlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS4kc2xpZGVyLm9mZihcImZvY3VzLnNsaWNrIGJsdXIuc2xpY2tcIikub24oXCJmb2N1cy5zbGljayBibHVyLnNsaWNrXCIsXCIqXCIsZnVuY3Rpb24odCl7dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTt2YXIgbz1pKHRoaXMpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9wdGlvbnMucGF1c2VPbkZvY3VzJiYoZS5mb2N1c3NlZD1vLmlzKFwiOmZvY3VzXCIpLGUuYXV0b1BsYXkoKSl9LDApfSl9LGUucHJvdG90eXBlLmdldEN1cnJlbnQ9ZS5wcm90b3R5cGUuc2xpY2tDdXJyZW50U2xpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJyZW50U2xpZGV9LGUucHJvdG90eXBlLmdldERvdENvdW50PWZ1bmN0aW9uKCl7dmFyIGk9dGhpcyxlPTAsdD0wLG89MDtpZighMD09PWkub3B0aW9ucy5pbmZpbml0ZSlpZihpLnNsaWRlQ291bnQ8PWkub3B0aW9ucy5zbGlkZXNUb1Nob3cpKytvO2Vsc2UgZm9yKDtlPGkuc2xpZGVDb3VudDspKytvLGU9dCtpLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwsdCs9aS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsPD1pLm9wdGlvbnMuc2xpZGVzVG9TaG93P2kub3B0aW9ucy5zbGlkZXNUb1Njcm9sbDppLm9wdGlvbnMuc2xpZGVzVG9TaG93O2Vsc2UgaWYoITA9PT1pLm9wdGlvbnMuY2VudGVyTW9kZSlvPWkuc2xpZGVDb3VudDtlbHNlIGlmKGkub3B0aW9ucy5hc05hdkZvcilmb3IoO2U8aS5zbGlkZUNvdW50OykrK28sZT10K2kub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCx0Kz1pLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw8PWkub3B0aW9ucy5zbGlkZXNUb1Nob3c/aS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsOmkub3B0aW9ucy5zbGlkZXNUb1Nob3c7ZWxzZSBvPTErTWF0aC5jZWlsKChpLnNsaWRlQ291bnQtaS5vcHRpb25zLnNsaWRlc1RvU2hvdykvaS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsKTtyZXR1cm4gby0xfSxlLnByb3RvdHlwZS5nZXRMZWZ0PWZ1bmN0aW9uKGkpe3ZhciBlLHQsbyxzLG49dGhpcyxyPTA7cmV0dXJuIG4uc2xpZGVPZmZzZXQ9MCx0PW4uJHNsaWRlcy5maXJzdCgpLm91dGVySGVpZ2h0KCEwKSwhMD09PW4ub3B0aW9ucy5pbmZpbml0ZT8obi5zbGlkZUNvdW50Pm4ub3B0aW9ucy5zbGlkZXNUb1Nob3cmJihuLnNsaWRlT2Zmc2V0PW4uc2xpZGVXaWR0aCpuLm9wdGlvbnMuc2xpZGVzVG9TaG93Ki0xLHM9LTEsITA9PT1uLm9wdGlvbnMudmVydGljYWwmJiEwPT09bi5vcHRpb25zLmNlbnRlck1vZGUmJigyPT09bi5vcHRpb25zLnNsaWRlc1RvU2hvdz9zPS0xLjU6MT09PW4ub3B0aW9ucy5zbGlkZXNUb1Nob3cmJihzPS0yKSkscj10Km4ub3B0aW9ucy5zbGlkZXNUb1Nob3cqcyksbi5zbGlkZUNvdW50JW4ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCE9MCYmaStuLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw+bi5zbGlkZUNvdW50JiZuLnNsaWRlQ291bnQ+bi5vcHRpb25zLnNsaWRlc1RvU2hvdyYmKGk+bi5zbGlkZUNvdW50PyhuLnNsaWRlT2Zmc2V0PShuLm9wdGlvbnMuc2xpZGVzVG9TaG93LShpLW4uc2xpZGVDb3VudCkpKm4uc2xpZGVXaWR0aCotMSxyPShuLm9wdGlvbnMuc2xpZGVzVG9TaG93LShpLW4uc2xpZGVDb3VudCkpKnQqLTEpOihuLnNsaWRlT2Zmc2V0PW4uc2xpZGVDb3VudCVuLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwqbi5zbGlkZVdpZHRoKi0xLHI9bi5zbGlkZUNvdW50JW4ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCp0Ki0xKSkpOmkrbi5vcHRpb25zLnNsaWRlc1RvU2hvdz5uLnNsaWRlQ291bnQmJihuLnNsaWRlT2Zmc2V0PShpK24ub3B0aW9ucy5zbGlkZXNUb1Nob3ctbi5zbGlkZUNvdW50KSpuLnNsaWRlV2lkdGgscj0oaStuLm9wdGlvbnMuc2xpZGVzVG9TaG93LW4uc2xpZGVDb3VudCkqdCksbi5zbGlkZUNvdW50PD1uLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYobi5zbGlkZU9mZnNldD0wLHI9MCksITA9PT1uLm9wdGlvbnMuY2VudGVyTW9kZSYmbi5zbGlkZUNvdW50PD1uLm9wdGlvbnMuc2xpZGVzVG9TaG93P24uc2xpZGVPZmZzZXQ9bi5zbGlkZVdpZHRoKk1hdGguZmxvb3Iobi5vcHRpb25zLnNsaWRlc1RvU2hvdykvMi1uLnNsaWRlV2lkdGgqbi5zbGlkZUNvdW50LzI6ITA9PT1uLm9wdGlvbnMuY2VudGVyTW9kZSYmITA9PT1uLm9wdGlvbnMuaW5maW5pdGU/bi5zbGlkZU9mZnNldCs9bi5zbGlkZVdpZHRoKk1hdGguZmxvb3Iobi5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKS1uLnNsaWRlV2lkdGg6ITA9PT1uLm9wdGlvbnMuY2VudGVyTW9kZSYmKG4uc2xpZGVPZmZzZXQ9MCxuLnNsaWRlT2Zmc2V0Kz1uLnNsaWRlV2lkdGgqTWF0aC5mbG9vcihuLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIpKSxlPSExPT09bi5vcHRpb25zLnZlcnRpY2FsP2kqbi5zbGlkZVdpZHRoKi0xK24uc2xpZGVPZmZzZXQ6aSp0Ki0xK3IsITA9PT1uLm9wdGlvbnMudmFyaWFibGVXaWR0aCYmKG89bi5zbGlkZUNvdW50PD1uLm9wdGlvbnMuc2xpZGVzVG9TaG93fHwhMT09PW4ub3B0aW9ucy5pbmZpbml0ZT9uLiRzbGlkZVRyYWNrLmNoaWxkcmVuKFwiLnNsaWNrLXNsaWRlXCIpLmVxKGkpOm4uJHNsaWRlVHJhY2suY2hpbGRyZW4oXCIuc2xpY2stc2xpZGVcIikuZXEoaStuLm9wdGlvbnMuc2xpZGVzVG9TaG93KSxlPSEwPT09bi5vcHRpb25zLnJ0bD9vWzBdPy0xKihuLiRzbGlkZVRyYWNrLndpZHRoKCktb1swXS5vZmZzZXRMZWZ0LW8ud2lkdGgoKSk6MDpvWzBdPy0xKm9bMF0ub2Zmc2V0TGVmdDowLCEwPT09bi5vcHRpb25zLmNlbnRlck1vZGUmJihvPW4uc2xpZGVDb3VudDw9bi5vcHRpb25zLnNsaWRlc1RvU2hvd3x8ITE9PT1uLm9wdGlvbnMuaW5maW5pdGU/bi4kc2xpZGVUcmFjay5jaGlsZHJlbihcIi5zbGljay1zbGlkZVwiKS5lcShpKTpuLiRzbGlkZVRyYWNrLmNoaWxkcmVuKFwiLnNsaWNrLXNsaWRlXCIpLmVxKGkrbi5vcHRpb25zLnNsaWRlc1RvU2hvdysxKSxlPSEwPT09bi5vcHRpb25zLnJ0bD9vWzBdPy0xKihuLiRzbGlkZVRyYWNrLndpZHRoKCktb1swXS5vZmZzZXRMZWZ0LW8ud2lkdGgoKSk6MDpvWzBdPy0xKm9bMF0ub2Zmc2V0TGVmdDowLGUrPShuLiRsaXN0LndpZHRoKCktby5vdXRlcldpZHRoKCkpLzIpKSxlfSxlLnByb3RvdHlwZS5nZXRPcHRpb249ZS5wcm90b3R5cGUuc2xpY2tHZXRPcHRpb249ZnVuY3Rpb24oaSl7cmV0dXJuIHRoaXMub3B0aW9uc1tpXX0sZS5wcm90b3R5cGUuZ2V0TmF2aWdhYmxlSW5kZXhlcz1mdW5jdGlvbigpe3ZhciBpLGU9dGhpcyx0PTAsbz0wLHM9W107Zm9yKCExPT09ZS5vcHRpb25zLmluZmluaXRlP2k9ZS5zbGlkZUNvdW50Oih0PS0xKmUub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCxvPS0xKmUub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCxpPTIqZS5zbGlkZUNvdW50KTt0PGk7KXMucHVzaCh0KSx0PW8rZS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsLG8rPWUub3B0aW9ucy5zbGlkZXNUb1Njcm9sbDw9ZS5vcHRpb25zLnNsaWRlc1RvU2hvdz9lLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw6ZS5vcHRpb25zLnNsaWRlc1RvU2hvdztyZXR1cm4gc30sZS5wcm90b3R5cGUuZ2V0U2xpY2s9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZS5wcm90b3R5cGUuZ2V0U2xpZGVDb3VudD1mdW5jdGlvbigpe3ZhciBlLHQsbz10aGlzO3JldHVybiB0PSEwPT09by5vcHRpb25zLmNlbnRlck1vZGU/by5zbGlkZVdpZHRoKk1hdGguZmxvb3Ioby5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKTowLCEwPT09by5vcHRpb25zLnN3aXBlVG9TbGlkZT8oby4kc2xpZGVUcmFjay5maW5kKFwiLnNsaWNrLXNsaWRlXCIpLmVhY2goZnVuY3Rpb24ocyxuKXtpZihuLm9mZnNldExlZnQtdCtpKG4pLm91dGVyV2lkdGgoKS8yPi0xKm8uc3dpcGVMZWZ0KXJldHVybiBlPW4sITF9KSxNYXRoLmFicyhpKGUpLmF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIpLW8uY3VycmVudFNsaWRlKXx8MSk6by5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsfSxlLnByb3RvdHlwZS5nb1RvPWUucHJvdG90eXBlLnNsaWNrR29Ubz1mdW5jdGlvbihpLGUpe3RoaXMuY2hhbmdlU2xpZGUoe2RhdGE6e21lc3NhZ2U6XCJpbmRleFwiLGluZGV4OnBhcnNlSW50KGkpfX0sZSl9LGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpKHQuJHNsaWRlcikuaGFzQ2xhc3MoXCJzbGljay1pbml0aWFsaXplZFwiKXx8KGkodC4kc2xpZGVyKS5hZGRDbGFzcyhcInNsaWNrLWluaXRpYWxpemVkXCIpLHQuYnVpbGRSb3dzKCksdC5idWlsZE91dCgpLHQuc2V0UHJvcHMoKSx0LnN0YXJ0TG9hZCgpLHQubG9hZFNsaWRlcigpLHQuaW5pdGlhbGl6ZUV2ZW50cygpLHQudXBkYXRlQXJyb3dzKCksdC51cGRhdGVEb3RzKCksdC5jaGVja1Jlc3BvbnNpdmUoITApLHQuZm9jdXNIYW5kbGVyKCkpLGUmJnQuJHNsaWRlci50cmlnZ2VyKFwiaW5pdFwiLFt0XSksITA9PT10Lm9wdGlvbnMuYWNjZXNzaWJpbGl0eSYmdC5pbml0QURBKCksdC5vcHRpb25zLmF1dG9wbGF5JiYodC5wYXVzZWQ9ITEsdC5hdXRvUGxheSgpKX0sZS5wcm90b3R5cGUuaW5pdEFEQT1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1NYXRoLmNlaWwoZS5zbGlkZUNvdW50L2Uub3B0aW9ucy5zbGlkZXNUb1Nob3cpLG89ZS5nZXROYXZpZ2FibGVJbmRleGVzKCkuZmlsdGVyKGZ1bmN0aW9uKGkpe3JldHVybiBpPj0wJiZpPGUuc2xpZGVDb3VudH0pO2UuJHNsaWRlcy5hZGQoZS4kc2xpZGVUcmFjay5maW5kKFwiLnNsaWNrLWNsb25lZFwiKSkuYXR0cih7XCJhcmlhLWhpZGRlblwiOlwidHJ1ZVwiLHRhYmluZGV4OlwiLTFcIn0pLmZpbmQoXCJhLCBpbnB1dCwgYnV0dG9uLCBzZWxlY3RcIikuYXR0cih7dGFiaW5kZXg6XCItMVwifSksbnVsbCE9PWUuJGRvdHMmJihlLiRzbGlkZXMubm90KGUuJHNsaWRlVHJhY2suZmluZChcIi5zbGljay1jbG9uZWRcIikpLmVhY2goZnVuY3Rpb24odCl7dmFyIHM9by5pbmRleE9mKHQpO2kodGhpcykuYXR0cih7cm9sZTpcInRhYnBhbmVsXCIsaWQ6XCJzbGljay1zbGlkZVwiK2UuaW5zdGFuY2VVaWQrdCx0YWJpbmRleDotMX0pLC0xIT09cyYmaSh0aGlzKS5hdHRyKHtcImFyaWEtZGVzY3JpYmVkYnlcIjpcInNsaWNrLXNsaWRlLWNvbnRyb2xcIitlLmluc3RhbmNlVWlkK3N9KX0pLGUuJGRvdHMuYXR0cihcInJvbGVcIixcInRhYmxpc3RcIikuZmluZChcImxpXCIpLmVhY2goZnVuY3Rpb24ocyl7dmFyIG49b1tzXTtpKHRoaXMpLmF0dHIoe3JvbGU6XCJwcmVzZW50YXRpb25cIn0pLGkodGhpcykuZmluZChcImJ1dHRvblwiKS5maXJzdCgpLmF0dHIoe3JvbGU6XCJ0YWJcIixpZDpcInNsaWNrLXNsaWRlLWNvbnRyb2xcIitlLmluc3RhbmNlVWlkK3MsXCJhcmlhLWNvbnRyb2xzXCI6XCJzbGljay1zbGlkZVwiK2UuaW5zdGFuY2VVaWQrbixcImFyaWEtbGFiZWxcIjpzKzErXCIgb2YgXCIrdCxcImFyaWEtc2VsZWN0ZWRcIjpudWxsLHRhYmluZGV4OlwiLTFcIn0pfSkuZXEoZS5jdXJyZW50U2xpZGUpLmZpbmQoXCJidXR0b25cIikuYXR0cih7XCJhcmlhLXNlbGVjdGVkXCI6XCJ0cnVlXCIsdGFiaW5kZXg6XCIwXCJ9KS5lbmQoKSk7Zm9yKHZhciBzPWUuY3VycmVudFNsaWRlLG49cytlLm9wdGlvbnMuc2xpZGVzVG9TaG93O3M8bjtzKyspZS4kc2xpZGVzLmVxKHMpLmF0dHIoXCJ0YWJpbmRleFwiLDApO2UuYWN0aXZhdGVBREEoKX0sZS5wcm90b3R5cGUuaW5pdEFycm93RXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGk9dGhpczshMD09PWkub3B0aW9ucy5hcnJvd3MmJmkuc2xpZGVDb3VudD5pLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoaS4kcHJldkFycm93Lm9mZihcImNsaWNrLnNsaWNrXCIpLm9uKFwiY2xpY2suc2xpY2tcIix7bWVzc2FnZTpcInByZXZpb3VzXCJ9LGkuY2hhbmdlU2xpZGUpLGkuJG5leHRBcnJvdy5vZmYoXCJjbGljay5zbGlja1wiKS5vbihcImNsaWNrLnNsaWNrXCIse21lc3NhZ2U6XCJuZXh0XCJ9LGkuY2hhbmdlU2xpZGUpLCEwPT09aS5vcHRpb25zLmFjY2Vzc2liaWxpdHkmJihpLiRwcmV2QXJyb3cub24oXCJrZXlkb3duLnNsaWNrXCIsaS5rZXlIYW5kbGVyKSxpLiRuZXh0QXJyb3cub24oXCJrZXlkb3duLnNsaWNrXCIsaS5rZXlIYW5kbGVyKSkpfSxlLnByb3RvdHlwZS5pbml0RG90RXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczshMD09PWUub3B0aW9ucy5kb3RzJiYoaShcImxpXCIsZS4kZG90cykub24oXCJjbGljay5zbGlja1wiLHttZXNzYWdlOlwiaW5kZXhcIn0sZS5jaGFuZ2VTbGlkZSksITA9PT1lLm9wdGlvbnMuYWNjZXNzaWJpbGl0eSYmZS4kZG90cy5vbihcImtleWRvd24uc2xpY2tcIixlLmtleUhhbmRsZXIpKSwhMD09PWUub3B0aW9ucy5kb3RzJiYhMD09PWUub3B0aW9ucy5wYXVzZU9uRG90c0hvdmVyJiZpKFwibGlcIixlLiRkb3RzKS5vbihcIm1vdXNlZW50ZXIuc2xpY2tcIixpLnByb3h5KGUuaW50ZXJydXB0LGUsITApKS5vbihcIm1vdXNlbGVhdmUuc2xpY2tcIixpLnByb3h5KGUuaW50ZXJydXB0LGUsITEpKX0sZS5wcm90b3R5cGUuaW5pdFNsaWRlRXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLm9wdGlvbnMucGF1c2VPbkhvdmVyJiYoZS4kbGlzdC5vbihcIm1vdXNlZW50ZXIuc2xpY2tcIixpLnByb3h5KGUuaW50ZXJydXB0LGUsITApKSxlLiRsaXN0Lm9uKFwibW91c2VsZWF2ZS5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMSkpKX0sZS5wcm90b3R5cGUuaW5pdGlhbGl6ZUV2ZW50cz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5pbml0QXJyb3dFdmVudHMoKSxlLmluaXREb3RFdmVudHMoKSxlLmluaXRTbGlkZUV2ZW50cygpLGUuJGxpc3Qub24oXCJ0b3VjaHN0YXJ0LnNsaWNrIG1vdXNlZG93bi5zbGlja1wiLHthY3Rpb246XCJzdGFydFwifSxlLnN3aXBlSGFuZGxlciksZS4kbGlzdC5vbihcInRvdWNobW92ZS5zbGljayBtb3VzZW1vdmUuc2xpY2tcIix7YWN0aW9uOlwibW92ZVwifSxlLnN3aXBlSGFuZGxlciksZS4kbGlzdC5vbihcInRvdWNoZW5kLnNsaWNrIG1vdXNldXAuc2xpY2tcIix7YWN0aW9uOlwiZW5kXCJ9LGUuc3dpcGVIYW5kbGVyKSxlLiRsaXN0Lm9uKFwidG91Y2hjYW5jZWwuc2xpY2sgbW91c2VsZWF2ZS5zbGlja1wiLHthY3Rpb246XCJlbmRcIn0sZS5zd2lwZUhhbmRsZXIpLGUuJGxpc3Qub24oXCJjbGljay5zbGlja1wiLGUuY2xpY2tIYW5kbGVyKSxpKGRvY3VtZW50KS5vbihlLnZpc2liaWxpdHlDaGFuZ2UsaS5wcm94eShlLnZpc2liaWxpdHksZSkpLCEwPT09ZS5vcHRpb25zLmFjY2Vzc2liaWxpdHkmJmUuJGxpc3Qub24oXCJrZXlkb3duLnNsaWNrXCIsZS5rZXlIYW5kbGVyKSwhMD09PWUub3B0aW9ucy5mb2N1c09uU2VsZWN0JiZpKGUuJHNsaWRlVHJhY2spLmNoaWxkcmVuKCkub24oXCJjbGljay5zbGlja1wiLGUuc2VsZWN0SGFuZGxlciksaSh3aW5kb3cpLm9uKFwib3JpZW50YXRpb25jaGFuZ2Uuc2xpY2suc2xpY2stXCIrZS5pbnN0YW5jZVVpZCxpLnByb3h5KGUub3JpZW50YXRpb25DaGFuZ2UsZSkpLGkod2luZG93KS5vbihcInJlc2l6ZS5zbGljay5zbGljay1cIitlLmluc3RhbmNlVWlkLGkucHJveHkoZS5yZXNpemUsZSkpLGkoXCJbZHJhZ2dhYmxlIT10cnVlXVwiLGUuJHNsaWRlVHJhY2spLm9uKFwiZHJhZ3N0YXJ0XCIsZS5wcmV2ZW50RGVmYXVsdCksaSh3aW5kb3cpLm9uKFwibG9hZC5zbGljay5zbGljay1cIitlLmluc3RhbmNlVWlkLGUuc2V0UG9zaXRpb24pLGkoZS5zZXRQb3NpdGlvbil9LGUucHJvdG90eXBlLmluaXRVST1mdW5jdGlvbigpe3ZhciBpPXRoaXM7ITA9PT1pLm9wdGlvbnMuYXJyb3dzJiZpLnNsaWRlQ291bnQ+aS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmKGkuJHByZXZBcnJvdy5zaG93KCksaS4kbmV4dEFycm93LnNob3coKSksITA9PT1pLm9wdGlvbnMuZG90cyYmaS5zbGlkZUNvdW50Pmkub3B0aW9ucy5zbGlkZXNUb1Nob3cmJmkuJGRvdHMuc2hvdygpfSxlLnByb3RvdHlwZS5rZXlIYW5kbGVyPWZ1bmN0aW9uKGkpe3ZhciBlPXRoaXM7aS50YXJnZXQudGFnTmFtZS5tYXRjaChcIlRFWFRBUkVBfElOUFVUfFNFTEVDVFwiKXx8KDM3PT09aS5rZXlDb2RlJiYhMD09PWUub3B0aW9ucy5hY2Nlc3NpYmlsaXR5P2UuY2hhbmdlU2xpZGUoe2RhdGE6e21lc3NhZ2U6ITA9PT1lLm9wdGlvbnMucnRsP1wibmV4dFwiOlwicHJldmlvdXNcIn19KTozOT09PWkua2V5Q29kZSYmITA9PT1lLm9wdGlvbnMuYWNjZXNzaWJpbGl0eSYmZS5jaGFuZ2VTbGlkZSh7ZGF0YTp7bWVzc2FnZTohMD09PWUub3B0aW9ucy5ydGw/XCJwcmV2aW91c1wiOlwibmV4dFwifX0pKX0sZS5wcm90b3R5cGUubGF6eUxvYWQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2koXCJpbWdbZGF0YS1sYXp5XVwiLGUpLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1pKHRoaXMpLHQ9aSh0aGlzKS5hdHRyKFwiZGF0YS1sYXp5XCIpLG89aSh0aGlzKS5hdHRyKFwiZGF0YS1zcmNzZXRcIikscz1pKHRoaXMpLmF0dHIoXCJkYXRhLXNpemVzXCIpfHxuLiRzbGlkZXIuYXR0cihcImRhdGEtc2l6ZXNcIikscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO3Iub25sb2FkPWZ1bmN0aW9uKCl7ZS5hbmltYXRlKHtvcGFjaXR5OjB9LDEwMCxmdW5jdGlvbigpe28mJihlLmF0dHIoXCJzcmNzZXRcIixvKSxzJiZlLmF0dHIoXCJzaXplc1wiLHMpKSxlLmF0dHIoXCJzcmNcIix0KS5hbmltYXRlKHtvcGFjaXR5OjF9LDIwMCxmdW5jdGlvbigpe2UucmVtb3ZlQXR0cihcImRhdGEtbGF6eSBkYXRhLXNyY3NldCBkYXRhLXNpemVzXCIpLnJlbW92ZUNsYXNzKFwic2xpY2stbG9hZGluZ1wiKX0pLG4uJHNsaWRlci50cmlnZ2VyKFwibGF6eUxvYWRlZFwiLFtuLGUsdF0pfSl9LHIub25lcnJvcj1mdW5jdGlvbigpe2UucmVtb3ZlQXR0cihcImRhdGEtbGF6eVwiKS5yZW1vdmVDbGFzcyhcInNsaWNrLWxvYWRpbmdcIikuYWRkQ2xhc3MoXCJzbGljay1sYXp5bG9hZC1lcnJvclwiKSxuLiRzbGlkZXIudHJpZ2dlcihcImxhenlMb2FkRXJyb3JcIixbbixlLHRdKX0sci5zcmM9dH0pfXZhciB0LG8scyxuPXRoaXM7aWYoITA9PT1uLm9wdGlvbnMuY2VudGVyTW9kZT8hMD09PW4ub3B0aW9ucy5pbmZpbml0ZT9zPShvPW4uY3VycmVudFNsaWRlKyhuLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIrMSkpK24ub3B0aW9ucy5zbGlkZXNUb1Nob3crMjoobz1NYXRoLm1heCgwLG4uY3VycmVudFNsaWRlLShuLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIrMSkpLHM9bi5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKzErMituLmN1cnJlbnRTbGlkZSk6KG89bi5vcHRpb25zLmluZmluaXRlP24ub3B0aW9ucy5zbGlkZXNUb1Nob3crbi5jdXJyZW50U2xpZGU6bi5jdXJyZW50U2xpZGUscz1NYXRoLmNlaWwobytuLm9wdGlvbnMuc2xpZGVzVG9TaG93KSwhMD09PW4ub3B0aW9ucy5mYWRlJiYobz4wJiZvLS0sczw9bi5zbGlkZUNvdW50JiZzKyspKSx0PW4uJHNsaWRlci5maW5kKFwiLnNsaWNrLXNsaWRlXCIpLnNsaWNlKG8scyksXCJhbnRpY2lwYXRlZFwiPT09bi5vcHRpb25zLmxhenlMb2FkKWZvcih2YXIgcj1vLTEsbD1zLGQ9bi4kc2xpZGVyLmZpbmQoXCIuc2xpY2stc2xpZGVcIiksYT0wO2E8bi5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsO2ErKylyPDAmJihyPW4uc2xpZGVDb3VudC0xKSx0PSh0PXQuYWRkKGQuZXEocikpKS5hZGQoZC5lcShsKSksci0tLGwrKztlKHQpLG4uc2xpZGVDb3VudDw9bi5vcHRpb25zLnNsaWRlc1RvU2hvdz9lKG4uJHNsaWRlci5maW5kKFwiLnNsaWNrLXNsaWRlXCIpKTpuLmN1cnJlbnRTbGlkZT49bi5zbGlkZUNvdW50LW4ub3B0aW9ucy5zbGlkZXNUb1Nob3c/ZShuLiRzbGlkZXIuZmluZChcIi5zbGljay1jbG9uZWRcIikuc2xpY2UoMCxuLm9wdGlvbnMuc2xpZGVzVG9TaG93KSk6MD09PW4uY3VycmVudFNsaWRlJiZlKG4uJHNsaWRlci5maW5kKFwiLnNsaWNrLWNsb25lZFwiKS5zbGljZSgtMSpuLm9wdGlvbnMuc2xpZGVzVG9TaG93KSl9LGUucHJvdG90eXBlLmxvYWRTbGlkZXI9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2kuc2V0UG9zaXRpb24oKSxpLiRzbGlkZVRyYWNrLmNzcyh7b3BhY2l0eToxfSksaS4kc2xpZGVyLnJlbW92ZUNsYXNzKFwic2xpY2stbG9hZGluZ1wiKSxpLmluaXRVSSgpLFwicHJvZ3Jlc3NpdmVcIj09PWkub3B0aW9ucy5sYXp5TG9hZCYmaS5wcm9ncmVzc2l2ZUxhenlMb2FkKCl9LGUucHJvdG90eXBlLm5leHQ9ZS5wcm90b3R5cGUuc2xpY2tOZXh0PWZ1bmN0aW9uKCl7dGhpcy5jaGFuZ2VTbGlkZSh7ZGF0YTp7bWVzc2FnZTpcIm5leHRcIn19KX0sZS5wcm90b3R5cGUub3JpZW50YXRpb25DaGFuZ2U9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2kuY2hlY2tSZXNwb25zaXZlKCksaS5zZXRQb3NpdGlvbigpfSxlLnByb3RvdHlwZS5wYXVzZT1lLnByb3RvdHlwZS5zbGlja1BhdXNlPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztpLmF1dG9QbGF5Q2xlYXIoKSxpLnBhdXNlZD0hMH0sZS5wcm90b3R5cGUucGxheT1lLnByb3RvdHlwZS5zbGlja1BsYXk9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2kuYXV0b1BsYXkoKSxpLm9wdGlvbnMuYXV0b3BsYXk9ITAsaS5wYXVzZWQ9ITEsaS5mb2N1c3NlZD0hMSxpLmludGVycnVwdGVkPSExfSxlLnByb3RvdHlwZS5wb3N0U2xpZGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0LnVuc2xpY2tlZHx8KHQuJHNsaWRlci50cmlnZ2VyKFwiYWZ0ZXJDaGFuZ2VcIixbdCxlXSksdC5hbmltYXRpbmc9ITEsdC5zbGlkZUNvdW50PnQub3B0aW9ucy5zbGlkZXNUb1Nob3cmJnQuc2V0UG9zaXRpb24oKSx0LnN3aXBlTGVmdD1udWxsLHQub3B0aW9ucy5hdXRvcGxheSYmdC5hdXRvUGxheSgpLCEwPT09dC5vcHRpb25zLmFjY2Vzc2liaWxpdHkmJih0LmluaXRBREEoKSx0Lm9wdGlvbnMuZm9jdXNPbkNoYW5nZSYmaSh0LiRzbGlkZXMuZ2V0KHQuY3VycmVudFNsaWRlKSkuYXR0cihcInRhYmluZGV4XCIsMCkuZm9jdXMoKSkpfSxlLnByb3RvdHlwZS5wcmV2PWUucHJvdG90eXBlLnNsaWNrUHJldj1mdW5jdGlvbigpe3RoaXMuY2hhbmdlU2xpZGUoe2RhdGE6e21lc3NhZ2U6XCJwcmV2aW91c1wifX0pfSxlLnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbihpKXtpLnByZXZlbnREZWZhdWx0KCl9LGUucHJvdG90eXBlLnByb2dyZXNzaXZlTGF6eUxvYWQ9ZnVuY3Rpb24oZSl7ZT1lfHwxO3ZhciB0LG8scyxuLHIsbD10aGlzLGQ9aShcImltZ1tkYXRhLWxhenldXCIsbC4kc2xpZGVyKTtkLmxlbmd0aD8odD1kLmZpcnN0KCksbz10LmF0dHIoXCJkYXRhLWxhenlcIikscz10LmF0dHIoXCJkYXRhLXNyY3NldFwiKSxuPXQuYXR0cihcImRhdGEtc2l6ZXNcIil8fGwuJHNsaWRlci5hdHRyKFwiZGF0YS1zaXplc1wiKSwocj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpKS5vbmxvYWQ9ZnVuY3Rpb24oKXtzJiYodC5hdHRyKFwic3Jjc2V0XCIscyksbiYmdC5hdHRyKFwic2l6ZXNcIixuKSksdC5hdHRyKFwic3JjXCIsbykucmVtb3ZlQXR0cihcImRhdGEtbGF6eSBkYXRhLXNyY3NldCBkYXRhLXNpemVzXCIpLnJlbW92ZUNsYXNzKFwic2xpY2stbG9hZGluZ1wiKSwhMD09PWwub3B0aW9ucy5hZGFwdGl2ZUhlaWdodCYmbC5zZXRQb3NpdGlvbigpLGwuJHNsaWRlci50cmlnZ2VyKFwibGF6eUxvYWRlZFwiLFtsLHQsb10pLGwucHJvZ3Jlc3NpdmVMYXp5TG9hZCgpfSxyLm9uZXJyb3I9ZnVuY3Rpb24oKXtlPDM/c2V0VGltZW91dChmdW5jdGlvbigpe2wucHJvZ3Jlc3NpdmVMYXp5TG9hZChlKzEpfSw1MDApOih0LnJlbW92ZUF0dHIoXCJkYXRhLWxhenlcIikucmVtb3ZlQ2xhc3MoXCJzbGljay1sb2FkaW5nXCIpLmFkZENsYXNzKFwic2xpY2stbGF6eWxvYWQtZXJyb3JcIiksbC4kc2xpZGVyLnRyaWdnZXIoXCJsYXp5TG9hZEVycm9yXCIsW2wsdCxvXSksbC5wcm9ncmVzc2l2ZUxhenlMb2FkKCkpfSxyLnNyYz1vKTpsLiRzbGlkZXIudHJpZ2dlcihcImFsbEltYWdlc0xvYWRlZFwiLFtsXSl9LGUucHJvdG90eXBlLnJlZnJlc2g9ZnVuY3Rpb24oZSl7dmFyIHQsbyxzPXRoaXM7bz1zLnNsaWRlQ291bnQtcy5vcHRpb25zLnNsaWRlc1RvU2hvdywhcy5vcHRpb25zLmluZmluaXRlJiZzLmN1cnJlbnRTbGlkZT5vJiYocy5jdXJyZW50U2xpZGU9bykscy5zbGlkZUNvdW50PD1zLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYocy5jdXJyZW50U2xpZGU9MCksdD1zLmN1cnJlbnRTbGlkZSxzLmRlc3Ryb3koITApLGkuZXh0ZW5kKHMscy5pbml0aWFscyx7Y3VycmVudFNsaWRlOnR9KSxzLmluaXQoKSxlfHxzLmNoYW5nZVNsaWRlKHtkYXRhOnttZXNzYWdlOlwiaW5kZXhcIixpbmRleDp0fX0sITEpfSxlLnByb3RvdHlwZS5yZWdpc3RlckJyZWFrcG9pbnRzPWZ1bmN0aW9uKCl7dmFyIGUsdCxvLHM9dGhpcyxuPXMub3B0aW9ucy5yZXNwb25zaXZlfHxudWxsO2lmKFwiYXJyYXlcIj09PWkudHlwZShuKSYmbi5sZW5ndGgpe3MucmVzcG9uZFRvPXMub3B0aW9ucy5yZXNwb25kVG98fFwid2luZG93XCI7Zm9yKGUgaW4gbilpZihvPXMuYnJlYWtwb2ludHMubGVuZ3RoLTEsbi5oYXNPd25Qcm9wZXJ0eShlKSl7Zm9yKHQ9bltlXS5icmVha3BvaW50O28+PTA7KXMuYnJlYWtwb2ludHNbb10mJnMuYnJlYWtwb2ludHNbb109PT10JiZzLmJyZWFrcG9pbnRzLnNwbGljZShvLDEpLG8tLTtzLmJyZWFrcG9pbnRzLnB1c2godCkscy5icmVha3BvaW50U2V0dGluZ3NbdF09bltlXS5zZXR0aW5nc31zLmJyZWFrcG9pbnRzLnNvcnQoZnVuY3Rpb24oaSxlKXtyZXR1cm4gcy5vcHRpb25zLm1vYmlsZUZpcnN0P2ktZTplLWl9KX19LGUucHJvdG90eXBlLnJlaW5pdD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS4kc2xpZGVzPWUuJHNsaWRlVHJhY2suY2hpbGRyZW4oZS5vcHRpb25zLnNsaWRlKS5hZGRDbGFzcyhcInNsaWNrLXNsaWRlXCIpLGUuc2xpZGVDb3VudD1lLiRzbGlkZXMubGVuZ3RoLGUuY3VycmVudFNsaWRlPj1lLnNsaWRlQ291bnQmJjAhPT1lLmN1cnJlbnRTbGlkZSYmKGUuY3VycmVudFNsaWRlPWUuY3VycmVudFNsaWRlLWUub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCksZS5zbGlkZUNvdW50PD1lLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoZS5jdXJyZW50U2xpZGU9MCksZS5yZWdpc3RlckJyZWFrcG9pbnRzKCksZS5zZXRQcm9wcygpLGUuc2V0dXBJbmZpbml0ZSgpLGUuYnVpbGRBcnJvd3MoKSxlLnVwZGF0ZUFycm93cygpLGUuaW5pdEFycm93RXZlbnRzKCksZS5idWlsZERvdHMoKSxlLnVwZGF0ZURvdHMoKSxlLmluaXREb3RFdmVudHMoKSxlLmNsZWFuVXBTbGlkZUV2ZW50cygpLGUuaW5pdFNsaWRlRXZlbnRzKCksZS5jaGVja1Jlc3BvbnNpdmUoITEsITApLCEwPT09ZS5vcHRpb25zLmZvY3VzT25TZWxlY3QmJmkoZS4kc2xpZGVUcmFjaykuY2hpbGRyZW4oKS5vbihcImNsaWNrLnNsaWNrXCIsZS5zZWxlY3RIYW5kbGVyKSxlLnNldFNsaWRlQ2xhc3NlcyhcIm51bWJlclwiPT10eXBlb2YgZS5jdXJyZW50U2xpZGU/ZS5jdXJyZW50U2xpZGU6MCksZS5zZXRQb3NpdGlvbigpLGUuZm9jdXNIYW5kbGVyKCksZS5wYXVzZWQ9IWUub3B0aW9ucy5hdXRvcGxheSxlLmF1dG9QbGF5KCksZS4kc2xpZGVyLnRyaWdnZXIoXCJyZUluaXRcIixbZV0pfSxlLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2kod2luZG93KS53aWR0aCgpIT09ZS53aW5kb3dXaWR0aCYmKGNsZWFyVGltZW91dChlLndpbmRvd0RlbGF5KSxlLndpbmRvd0RlbGF5PXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS53aW5kb3dXaWR0aD1pKHdpbmRvdykud2lkdGgoKSxlLmNoZWNrUmVzcG9uc2l2ZSgpLGUudW5zbGlja2VkfHxlLnNldFBvc2l0aW9uKCl9LDUwKSl9LGUucHJvdG90eXBlLnJlbW92ZVNsaWRlPWUucHJvdG90eXBlLnNsaWNrUmVtb3ZlPWZ1bmN0aW9uKGksZSx0KXt2YXIgbz10aGlzO2lmKGk9XCJib29sZWFuXCI9PXR5cGVvZiBpPyEwPT09KGU9aSk/MDpvLnNsaWRlQ291bnQtMTohMD09PWU/LS1pOmksby5zbGlkZUNvdW50PDF8fGk8MHx8aT5vLnNsaWRlQ291bnQtMSlyZXR1cm4hMTtvLnVubG9hZCgpLCEwPT09dD9vLiRzbGlkZVRyYWNrLmNoaWxkcmVuKCkucmVtb3ZlKCk6by4kc2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpLmVxKGkpLnJlbW92ZSgpLG8uJHNsaWRlcz1vLiRzbGlkZVRyYWNrLmNoaWxkcmVuKHRoaXMub3B0aW9ucy5zbGlkZSksby4kc2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpLmRldGFjaCgpLG8uJHNsaWRlVHJhY2suYXBwZW5kKG8uJHNsaWRlcyksby4kc2xpZGVzQ2FjaGU9by4kc2xpZGVzLG8ucmVpbml0KCl9LGUucHJvdG90eXBlLnNldENTUz1mdW5jdGlvbihpKXt2YXIgZSx0LG89dGhpcyxzPXt9OyEwPT09by5vcHRpb25zLnJ0bCYmKGk9LWkpLGU9XCJsZWZ0XCI9PW8ucG9zaXRpb25Qcm9wP01hdGguY2VpbChpKStcInB4XCI6XCIwcHhcIix0PVwidG9wXCI9PW8ucG9zaXRpb25Qcm9wP01hdGguY2VpbChpKStcInB4XCI6XCIwcHhcIixzW28ucG9zaXRpb25Qcm9wXT1pLCExPT09by50cmFuc2Zvcm1zRW5hYmxlZD9vLiRzbGlkZVRyYWNrLmNzcyhzKToocz17fSwhMT09PW8uY3NzVHJhbnNpdGlvbnM/KHNbby5hbmltVHlwZV09XCJ0cmFuc2xhdGUoXCIrZStcIiwgXCIrdCtcIilcIixvLiRzbGlkZVRyYWNrLmNzcyhzKSk6KHNbby5hbmltVHlwZV09XCJ0cmFuc2xhdGUzZChcIitlK1wiLCBcIit0K1wiLCAwcHgpXCIsby4kc2xpZGVUcmFjay5jc3MocykpKX0sZS5wcm90b3R5cGUuc2V0RGltZW5zaW9ucz1mdW5jdGlvbigpe3ZhciBpPXRoaXM7ITE9PT1pLm9wdGlvbnMudmVydGljYWw/ITA9PT1pLm9wdGlvbnMuY2VudGVyTW9kZSYmaS4kbGlzdC5jc3Moe3BhZGRpbmc6XCIwcHggXCIraS5vcHRpb25zLmNlbnRlclBhZGRpbmd9KTooaS4kbGlzdC5oZWlnaHQoaS4kc2xpZGVzLmZpcnN0KCkub3V0ZXJIZWlnaHQoITApKmkub3B0aW9ucy5zbGlkZXNUb1Nob3cpLCEwPT09aS5vcHRpb25zLmNlbnRlck1vZGUmJmkuJGxpc3QuY3NzKHtwYWRkaW5nOmkub3B0aW9ucy5jZW50ZXJQYWRkaW5nK1wiIDBweFwifSkpLGkubGlzdFdpZHRoPWkuJGxpc3Qud2lkdGgoKSxpLmxpc3RIZWlnaHQ9aS4kbGlzdC5oZWlnaHQoKSwhMT09PWkub3B0aW9ucy52ZXJ0aWNhbCYmITE9PT1pLm9wdGlvbnMudmFyaWFibGVXaWR0aD8oaS5zbGlkZVdpZHRoPU1hdGguY2VpbChpLmxpc3RXaWR0aC9pLm9wdGlvbnMuc2xpZGVzVG9TaG93KSxpLiRzbGlkZVRyYWNrLndpZHRoKE1hdGguY2VpbChpLnNsaWRlV2lkdGgqaS4kc2xpZGVUcmFjay5jaGlsZHJlbihcIi5zbGljay1zbGlkZVwiKS5sZW5ndGgpKSk6ITA9PT1pLm9wdGlvbnMudmFyaWFibGVXaWR0aD9pLiRzbGlkZVRyYWNrLndpZHRoKDVlMyppLnNsaWRlQ291bnQpOihpLnNsaWRlV2lkdGg9TWF0aC5jZWlsKGkubGlzdFdpZHRoKSxpLiRzbGlkZVRyYWNrLmhlaWdodChNYXRoLmNlaWwoaS4kc2xpZGVzLmZpcnN0KCkub3V0ZXJIZWlnaHQoITApKmkuJHNsaWRlVHJhY2suY2hpbGRyZW4oXCIuc2xpY2stc2xpZGVcIikubGVuZ3RoKSkpO3ZhciBlPWkuJHNsaWRlcy5maXJzdCgpLm91dGVyV2lkdGgoITApLWkuJHNsaWRlcy5maXJzdCgpLndpZHRoKCk7ITE9PT1pLm9wdGlvbnMudmFyaWFibGVXaWR0aCYmaS4kc2xpZGVUcmFjay5jaGlsZHJlbihcIi5zbGljay1zbGlkZVwiKS53aWR0aChpLnNsaWRlV2lkdGgtZSl9LGUucHJvdG90eXBlLnNldEZhZGU9ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXM7dC4kc2xpZGVzLmVhY2goZnVuY3Rpb24obyxzKXtlPXQuc2xpZGVXaWR0aCpvKi0xLCEwPT09dC5vcHRpb25zLnJ0bD9pKHMpLmNzcyh7cG9zaXRpb246XCJyZWxhdGl2ZVwiLHJpZ2h0OmUsdG9wOjAsekluZGV4OnQub3B0aW9ucy56SW5kZXgtMixvcGFjaXR5OjB9KTppKHMpLmNzcyh7cG9zaXRpb246XCJyZWxhdGl2ZVwiLGxlZnQ6ZSx0b3A6MCx6SW5kZXg6dC5vcHRpb25zLnpJbmRleC0yLG9wYWNpdHk6MH0pfSksdC4kc2xpZGVzLmVxKHQuY3VycmVudFNsaWRlKS5jc3Moe3pJbmRleDp0Lm9wdGlvbnMuekluZGV4LTEsb3BhY2l0eToxfSl9LGUucHJvdG90eXBlLnNldEhlaWdodD1mdW5jdGlvbigpe3ZhciBpPXRoaXM7aWYoMT09PWkub3B0aW9ucy5zbGlkZXNUb1Nob3cmJiEwPT09aS5vcHRpb25zLmFkYXB0aXZlSGVpZ2h0JiYhMT09PWkub3B0aW9ucy52ZXJ0aWNhbCl7dmFyIGU9aS4kc2xpZGVzLmVxKGkuY3VycmVudFNsaWRlKS5vdXRlckhlaWdodCghMCk7aS4kbGlzdC5jc3MoXCJoZWlnaHRcIixlKX19LGUucHJvdG90eXBlLnNldE9wdGlvbj1lLnByb3RvdHlwZS5zbGlja1NldE9wdGlvbj1mdW5jdGlvbigpe3ZhciBlLHQsbyxzLG4scj10aGlzLGw9ITE7aWYoXCJvYmplY3RcIj09PWkudHlwZShhcmd1bWVudHNbMF0pPyhvPWFyZ3VtZW50c1swXSxsPWFyZ3VtZW50c1sxXSxuPVwibXVsdGlwbGVcIik6XCJzdHJpbmdcIj09PWkudHlwZShhcmd1bWVudHNbMF0pJiYobz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sbD1hcmd1bWVudHNbMl0sXCJyZXNwb25zaXZlXCI9PT1hcmd1bWVudHNbMF0mJlwiYXJyYXlcIj09PWkudHlwZShhcmd1bWVudHNbMV0pP249XCJyZXNwb25zaXZlXCI6dm9pZCAwIT09YXJndW1lbnRzWzFdJiYobj1cInNpbmdsZVwiKSksXCJzaW5nbGVcIj09PW4pci5vcHRpb25zW29dPXM7ZWxzZSBpZihcIm11bHRpcGxlXCI9PT1uKWkuZWFjaChvLGZ1bmN0aW9uKGksZSl7ci5vcHRpb25zW2ldPWV9KTtlbHNlIGlmKFwicmVzcG9uc2l2ZVwiPT09bilmb3IodCBpbiBzKWlmKFwiYXJyYXlcIiE9PWkudHlwZShyLm9wdGlvbnMucmVzcG9uc2l2ZSkpci5vcHRpb25zLnJlc3BvbnNpdmU9W3NbdF1dO2Vsc2V7Zm9yKGU9ci5vcHRpb25zLnJlc3BvbnNpdmUubGVuZ3RoLTE7ZT49MDspci5vcHRpb25zLnJlc3BvbnNpdmVbZV0uYnJlYWtwb2ludD09PXNbdF0uYnJlYWtwb2ludCYmci5vcHRpb25zLnJlc3BvbnNpdmUuc3BsaWNlKGUsMSksZS0tO3Iub3B0aW9ucy5yZXNwb25zaXZlLnB1c2goc1t0XSl9bCYmKHIudW5sb2FkKCksci5yZWluaXQoKSl9LGUucHJvdG90eXBlLnNldFBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztpLnNldERpbWVuc2lvbnMoKSxpLnNldEhlaWdodCgpLCExPT09aS5vcHRpb25zLmZhZGU/aS5zZXRDU1MoaS5nZXRMZWZ0KGkuY3VycmVudFNsaWRlKSk6aS5zZXRGYWRlKCksaS4kc2xpZGVyLnRyaWdnZXIoXCJzZXRQb3NpdGlvblwiLFtpXSl9LGUucHJvdG90eXBlLnNldFByb3BzPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcyxlPWRvY3VtZW50LmJvZHkuc3R5bGU7aS5wb3NpdGlvblByb3A9ITA9PT1pLm9wdGlvbnMudmVydGljYWw/XCJ0b3BcIjpcImxlZnRcIixcInRvcFwiPT09aS5wb3NpdGlvblByb3A/aS4kc2xpZGVyLmFkZENsYXNzKFwic2xpY2stdmVydGljYWxcIik6aS4kc2xpZGVyLnJlbW92ZUNsYXNzKFwic2xpY2stdmVydGljYWxcIiksdm9pZCAwPT09ZS5XZWJraXRUcmFuc2l0aW9uJiZ2b2lkIDA9PT1lLk1velRyYW5zaXRpb24mJnZvaWQgMD09PWUubXNUcmFuc2l0aW9ufHwhMD09PWkub3B0aW9ucy51c2VDU1MmJihpLmNzc1RyYW5zaXRpb25zPSEwKSxpLm9wdGlvbnMuZmFkZSYmKFwibnVtYmVyXCI9PXR5cGVvZiBpLm9wdGlvbnMuekluZGV4P2kub3B0aW9ucy56SW5kZXg8MyYmKGkub3B0aW9ucy56SW5kZXg9Myk6aS5vcHRpb25zLnpJbmRleD1pLmRlZmF1bHRzLnpJbmRleCksdm9pZCAwIT09ZS5PVHJhbnNmb3JtJiYoaS5hbmltVHlwZT1cIk9UcmFuc2Zvcm1cIixpLnRyYW5zZm9ybVR5cGU9XCItby10cmFuc2Zvcm1cIixpLnRyYW5zaXRpb25UeXBlPVwiT1RyYW5zaXRpb25cIix2b2lkIDA9PT1lLnBlcnNwZWN0aXZlUHJvcGVydHkmJnZvaWQgMD09PWUud2Via2l0UGVyc3BlY3RpdmUmJihpLmFuaW1UeXBlPSExKSksdm9pZCAwIT09ZS5Nb3pUcmFuc2Zvcm0mJihpLmFuaW1UeXBlPVwiTW96VHJhbnNmb3JtXCIsaS50cmFuc2Zvcm1UeXBlPVwiLW1vei10cmFuc2Zvcm1cIixpLnRyYW5zaXRpb25UeXBlPVwiTW96VHJhbnNpdGlvblwiLHZvaWQgMD09PWUucGVyc3BlY3RpdmVQcm9wZXJ0eSYmdm9pZCAwPT09ZS5Nb3pQZXJzcGVjdGl2ZSYmKGkuYW5pbVR5cGU9ITEpKSx2b2lkIDAhPT1lLndlYmtpdFRyYW5zZm9ybSYmKGkuYW5pbVR5cGU9XCJ3ZWJraXRUcmFuc2Zvcm1cIixpLnRyYW5zZm9ybVR5cGU9XCItd2Via2l0LXRyYW5zZm9ybVwiLGkudHJhbnNpdGlvblR5cGU9XCJ3ZWJraXRUcmFuc2l0aW9uXCIsdm9pZCAwPT09ZS5wZXJzcGVjdGl2ZVByb3BlcnR5JiZ2b2lkIDA9PT1lLndlYmtpdFBlcnNwZWN0aXZlJiYoaS5hbmltVHlwZT0hMSkpLHZvaWQgMCE9PWUubXNUcmFuc2Zvcm0mJihpLmFuaW1UeXBlPVwibXNUcmFuc2Zvcm1cIixpLnRyYW5zZm9ybVR5cGU9XCItbXMtdHJhbnNmb3JtXCIsaS50cmFuc2l0aW9uVHlwZT1cIm1zVHJhbnNpdGlvblwiLHZvaWQgMD09PWUubXNUcmFuc2Zvcm0mJihpLmFuaW1UeXBlPSExKSksdm9pZCAwIT09ZS50cmFuc2Zvcm0mJiExIT09aS5hbmltVHlwZSYmKGkuYW5pbVR5cGU9XCJ0cmFuc2Zvcm1cIixpLnRyYW5zZm9ybVR5cGU9XCJ0cmFuc2Zvcm1cIixpLnRyYW5zaXRpb25UeXBlPVwidHJhbnNpdGlvblwiKSxpLnRyYW5zZm9ybXNFbmFibGVkPWkub3B0aW9ucy51c2VUcmFuc2Zvcm0mJm51bGwhPT1pLmFuaW1UeXBlJiYhMSE9PWkuYW5pbVR5cGV9LGUucHJvdG90eXBlLnNldFNsaWRlQ2xhc3Nlcz1mdW5jdGlvbihpKXt2YXIgZSx0LG8scyxuPXRoaXM7aWYodD1uLiRzbGlkZXIuZmluZChcIi5zbGljay1zbGlkZVwiKS5yZW1vdmVDbGFzcyhcInNsaWNrLWFjdGl2ZSBzbGljay1jZW50ZXIgc2xpY2stY3VycmVudFwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIiksbi4kc2xpZGVzLmVxKGkpLmFkZENsYXNzKFwic2xpY2stY3VycmVudFwiKSwhMD09PW4ub3B0aW9ucy5jZW50ZXJNb2RlKXt2YXIgcj1uLm9wdGlvbnMuc2xpZGVzVG9TaG93JTI9PTA/MTowO2U9TWF0aC5mbG9vcihuLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIpLCEwPT09bi5vcHRpb25zLmluZmluaXRlJiYoaT49ZSYmaTw9bi5zbGlkZUNvdW50LTEtZT9uLiRzbGlkZXMuc2xpY2UoaS1lK3IsaStlKzEpLmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwiZmFsc2VcIik6KG89bi5vcHRpb25zLnNsaWRlc1RvU2hvdytpLHQuc2xpY2Uoby1lKzErcixvK2UrMikuYWRkQ2xhc3MoXCJzbGljay1hY3RpdmVcIikuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJmYWxzZVwiKSksMD09PWk/dC5lcSh0Lmxlbmd0aC0xLW4ub3B0aW9ucy5zbGlkZXNUb1Nob3cpLmFkZENsYXNzKFwic2xpY2stY2VudGVyXCIpOmk9PT1uLnNsaWRlQ291bnQtMSYmdC5lcShuLm9wdGlvbnMuc2xpZGVzVG9TaG93KS5hZGRDbGFzcyhcInNsaWNrLWNlbnRlclwiKSksbi4kc2xpZGVzLmVxKGkpLmFkZENsYXNzKFwic2xpY2stY2VudGVyXCIpfWVsc2UgaT49MCYmaTw9bi5zbGlkZUNvdW50LW4ub3B0aW9ucy5zbGlkZXNUb1Nob3c/bi4kc2xpZGVzLnNsaWNlKGksaStuLm9wdGlvbnMuc2xpZGVzVG9TaG93KS5hZGRDbGFzcyhcInNsaWNrLWFjdGl2ZVwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcImZhbHNlXCIpOnQubGVuZ3RoPD1uLm9wdGlvbnMuc2xpZGVzVG9TaG93P3QuYWRkQ2xhc3MoXCJzbGljay1hY3RpdmVcIikuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJmYWxzZVwiKToocz1uLnNsaWRlQ291bnQlbi5vcHRpb25zLnNsaWRlc1RvU2hvdyxvPSEwPT09bi5vcHRpb25zLmluZmluaXRlP24ub3B0aW9ucy5zbGlkZXNUb1Nob3craTppLG4ub3B0aW9ucy5zbGlkZXNUb1Nob3c9PW4ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCYmbi5zbGlkZUNvdW50LWk8bi5vcHRpb25zLnNsaWRlc1RvU2hvdz90LnNsaWNlKG8tKG4ub3B0aW9ucy5zbGlkZXNUb1Nob3ctcyksbytzKS5hZGRDbGFzcyhcInNsaWNrLWFjdGl2ZVwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcImZhbHNlXCIpOnQuc2xpY2UobyxvK24ub3B0aW9ucy5zbGlkZXNUb1Nob3cpLmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwiZmFsc2VcIikpO1wib25kZW1hbmRcIiE9PW4ub3B0aW9ucy5sYXp5TG9hZCYmXCJhbnRpY2lwYXRlZFwiIT09bi5vcHRpb25zLmxhenlMb2FkfHxuLmxhenlMb2FkKCl9LGUucHJvdG90eXBlLnNldHVwSW5maW5pdGU9ZnVuY3Rpb24oKXt2YXIgZSx0LG8scz10aGlzO2lmKCEwPT09cy5vcHRpb25zLmZhZGUmJihzLm9wdGlvbnMuY2VudGVyTW9kZT0hMSksITA9PT1zLm9wdGlvbnMuaW5maW5pdGUmJiExPT09cy5vcHRpb25zLmZhZGUmJih0PW51bGwscy5zbGlkZUNvdW50PnMub3B0aW9ucy5zbGlkZXNUb1Nob3cpKXtmb3Iobz0hMD09PXMub3B0aW9ucy5jZW50ZXJNb2RlP3Mub3B0aW9ucy5zbGlkZXNUb1Nob3crMTpzLm9wdGlvbnMuc2xpZGVzVG9TaG93LGU9cy5zbGlkZUNvdW50O2U+cy5zbGlkZUNvdW50LW87ZS09MSl0PWUtMSxpKHMuJHNsaWRlc1t0XSkuY2xvbmUoITApLmF0dHIoXCJpZFwiLFwiXCIpLmF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIsdC1zLnNsaWRlQ291bnQpLnByZXBlbmRUbyhzLiRzbGlkZVRyYWNrKS5hZGRDbGFzcyhcInNsaWNrLWNsb25lZFwiKTtmb3IoZT0wO2U8bytzLnNsaWRlQ291bnQ7ZSs9MSl0PWUsaShzLiRzbGlkZXNbdF0pLmNsb25lKCEwKS5hdHRyKFwiaWRcIixcIlwiKS5hdHRyKFwiZGF0YS1zbGljay1pbmRleFwiLHQrcy5zbGlkZUNvdW50KS5hcHBlbmRUbyhzLiRzbGlkZVRyYWNrKS5hZGRDbGFzcyhcInNsaWNrLWNsb25lZFwiKTtzLiRzbGlkZVRyYWNrLmZpbmQoXCIuc2xpY2stY2xvbmVkXCIpLmZpbmQoXCJbaWRdXCIpLmVhY2goZnVuY3Rpb24oKXtpKHRoaXMpLmF0dHIoXCJpZFwiLFwiXCIpfSl9fSxlLnByb3RvdHlwZS5pbnRlcnJ1cHQ9ZnVuY3Rpb24oaSl7dmFyIGU9dGhpcztpfHxlLmF1dG9QbGF5KCksZS5pbnRlcnJ1cHRlZD1pfSxlLnByb3RvdHlwZS5zZWxlY3RIYW5kbGVyPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbz1pKGUudGFyZ2V0KS5pcyhcIi5zbGljay1zbGlkZVwiKT9pKGUudGFyZ2V0KTppKGUudGFyZ2V0KS5wYXJlbnRzKFwiLnNsaWNrLXNsaWRlXCIpLHM9cGFyc2VJbnQoby5hdHRyKFwiZGF0YS1zbGljay1pbmRleFwiKSk7c3x8KHM9MCksdC5zbGlkZUNvdW50PD10Lm9wdGlvbnMuc2xpZGVzVG9TaG93P3Quc2xpZGVIYW5kbGVyKHMsITEsITApOnQuc2xpZGVIYW5kbGVyKHMpfSxlLnByb3RvdHlwZS5zbGlkZUhhbmRsZXI9ZnVuY3Rpb24oaSxlLHQpe3ZhciBvLHMsbixyLGwsZD1udWxsLGE9dGhpcztpZihlPWV8fCExLCEoITA9PT1hLmFuaW1hdGluZyYmITA9PT1hLm9wdGlvbnMud2FpdEZvckFuaW1hdGV8fCEwPT09YS5vcHRpb25zLmZhZGUmJmEuY3VycmVudFNsaWRlPT09aSkpaWYoITE9PT1lJiZhLmFzTmF2Rm9yKGkpLG89aSxkPWEuZ2V0TGVmdChvKSxyPWEuZ2V0TGVmdChhLmN1cnJlbnRTbGlkZSksYS5jdXJyZW50TGVmdD1udWxsPT09YS5zd2lwZUxlZnQ/cjphLnN3aXBlTGVmdCwhMT09PWEub3B0aW9ucy5pbmZpbml0ZSYmITE9PT1hLm9wdGlvbnMuY2VudGVyTW9kZSYmKGk8MHx8aT5hLmdldERvdENvdW50KCkqYS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsKSkhMT09PWEub3B0aW9ucy5mYWRlJiYobz1hLmN1cnJlbnRTbGlkZSwhMCE9PXQ/YS5hbmltYXRlU2xpZGUocixmdW5jdGlvbigpe2EucG9zdFNsaWRlKG8pfSk6YS5wb3N0U2xpZGUobykpO2Vsc2UgaWYoITE9PT1hLm9wdGlvbnMuaW5maW5pdGUmJiEwPT09YS5vcHRpb25zLmNlbnRlck1vZGUmJihpPDB8fGk+YS5zbGlkZUNvdW50LWEub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCkpITE9PT1hLm9wdGlvbnMuZmFkZSYmKG89YS5jdXJyZW50U2xpZGUsITAhPT10P2EuYW5pbWF0ZVNsaWRlKHIsZnVuY3Rpb24oKXthLnBvc3RTbGlkZShvKX0pOmEucG9zdFNsaWRlKG8pKTtlbHNle2lmKGEub3B0aW9ucy5hdXRvcGxheSYmY2xlYXJJbnRlcnZhbChhLmF1dG9QbGF5VGltZXIpLHM9bzwwP2Euc2xpZGVDb3VudCVhLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwhPTA/YS5zbGlkZUNvdW50LWEuc2xpZGVDb3VudCVhLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw6YS5zbGlkZUNvdW50K286bz49YS5zbGlkZUNvdW50P2Euc2xpZGVDb3VudCVhLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwhPTA/MDpvLWEuc2xpZGVDb3VudDpvLGEuYW5pbWF0aW5nPSEwLGEuJHNsaWRlci50cmlnZ2VyKFwiYmVmb3JlQ2hhbmdlXCIsW2EsYS5jdXJyZW50U2xpZGUsc10pLG49YS5jdXJyZW50U2xpZGUsYS5jdXJyZW50U2xpZGU9cyxhLnNldFNsaWRlQ2xhc3NlcyhhLmN1cnJlbnRTbGlkZSksYS5vcHRpb25zLmFzTmF2Rm9yJiYobD0obD1hLmdldE5hdlRhcmdldCgpKS5zbGljayhcImdldFNsaWNrXCIpKS5zbGlkZUNvdW50PD1sLm9wdGlvbnMuc2xpZGVzVG9TaG93JiZsLnNldFNsaWRlQ2xhc3NlcyhhLmN1cnJlbnRTbGlkZSksYS51cGRhdGVEb3RzKCksYS51cGRhdGVBcnJvd3MoKSwhMD09PWEub3B0aW9ucy5mYWRlKXJldHVybiEwIT09dD8oYS5mYWRlU2xpZGVPdXQobiksYS5mYWRlU2xpZGUocyxmdW5jdGlvbigpe2EucG9zdFNsaWRlKHMpfSkpOmEucG9zdFNsaWRlKHMpLHZvaWQgYS5hbmltYXRlSGVpZ2h0KCk7ITAhPT10P2EuYW5pbWF0ZVNsaWRlKGQsZnVuY3Rpb24oKXthLnBvc3RTbGlkZShzKX0pOmEucG9zdFNsaWRlKHMpfX0sZS5wcm90b3R5cGUuc3RhcnRMb2FkPWZ1bmN0aW9uKCl7dmFyIGk9dGhpczshMD09PWkub3B0aW9ucy5hcnJvd3MmJmkuc2xpZGVDb3VudD5pLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoaS4kcHJldkFycm93LmhpZGUoKSxpLiRuZXh0QXJyb3cuaGlkZSgpKSwhMD09PWkub3B0aW9ucy5kb3RzJiZpLnNsaWRlQ291bnQ+aS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmaS4kZG90cy5oaWRlKCksaS4kc2xpZGVyLmFkZENsYXNzKFwic2xpY2stbG9hZGluZ1wiKX0sZS5wcm90b3R5cGUuc3dpcGVEaXJlY3Rpb249ZnVuY3Rpb24oKXt2YXIgaSxlLHQsbyxzPXRoaXM7cmV0dXJuIGk9cy50b3VjaE9iamVjdC5zdGFydFgtcy50b3VjaE9iamVjdC5jdXJYLGU9cy50b3VjaE9iamVjdC5zdGFydFktcy50b3VjaE9iamVjdC5jdXJZLHQ9TWF0aC5hdGFuMihlLGkpLChvPU1hdGgucm91bmQoMTgwKnQvTWF0aC5QSSkpPDAmJihvPTM2MC1NYXRoLmFicyhvKSksbzw9NDUmJm8+PTA/ITE9PT1zLm9wdGlvbnMucnRsP1wibGVmdFwiOlwicmlnaHRcIjpvPD0zNjAmJm8+PTMxNT8hMT09PXMub3B0aW9ucy5ydGw/XCJsZWZ0XCI6XCJyaWdodFwiOm8+PTEzNSYmbzw9MjI1PyExPT09cy5vcHRpb25zLnJ0bD9cInJpZ2h0XCI6XCJsZWZ0XCI6ITA9PT1zLm9wdGlvbnMudmVydGljYWxTd2lwaW5nP28+PTM1JiZvPD0xMzU/XCJkb3duXCI6XCJ1cFwiOlwidmVydGljYWxcIn0sZS5wcm90b3R5cGUuc3dpcGVFbmQ9ZnVuY3Rpb24oaSl7dmFyIGUsdCxvPXRoaXM7aWYoby5kcmFnZ2luZz0hMSxvLnN3aXBpbmc9ITEsby5zY3JvbGxpbmcpcmV0dXJuIG8uc2Nyb2xsaW5nPSExLCExO2lmKG8uaW50ZXJydXB0ZWQ9ITEsby5zaG91bGRDbGljaz0hKG8udG91Y2hPYmplY3Quc3dpcGVMZW5ndGg+MTApLHZvaWQgMD09PW8udG91Y2hPYmplY3QuY3VyWClyZXR1cm4hMTtpZighMD09PW8udG91Y2hPYmplY3QuZWRnZUhpdCYmby4kc2xpZGVyLnRyaWdnZXIoXCJlZGdlXCIsW28sby5zd2lwZURpcmVjdGlvbigpXSksby50b3VjaE9iamVjdC5zd2lwZUxlbmd0aD49by50b3VjaE9iamVjdC5taW5Td2lwZSl7c3dpdGNoKHQ9by5zd2lwZURpcmVjdGlvbigpKXtjYXNlXCJsZWZ0XCI6Y2FzZVwiZG93blwiOmU9by5vcHRpb25zLnN3aXBlVG9TbGlkZT9vLmNoZWNrTmF2aWdhYmxlKG8uY3VycmVudFNsaWRlK28uZ2V0U2xpZGVDb3VudCgpKTpvLmN1cnJlbnRTbGlkZStvLmdldFNsaWRlQ291bnQoKSxvLmN1cnJlbnREaXJlY3Rpb249MDticmVhaztjYXNlXCJyaWdodFwiOmNhc2VcInVwXCI6ZT1vLm9wdGlvbnMuc3dpcGVUb1NsaWRlP28uY2hlY2tOYXZpZ2FibGUoby5jdXJyZW50U2xpZGUtby5nZXRTbGlkZUNvdW50KCkpOm8uY3VycmVudFNsaWRlLW8uZ2V0U2xpZGVDb3VudCgpLG8uY3VycmVudERpcmVjdGlvbj0xfVwidmVydGljYWxcIiE9dCYmKG8uc2xpZGVIYW5kbGVyKGUpLG8udG91Y2hPYmplY3Q9e30sby4kc2xpZGVyLnRyaWdnZXIoXCJzd2lwZVwiLFtvLHRdKSl9ZWxzZSBvLnRvdWNoT2JqZWN0LnN0YXJ0WCE9PW8udG91Y2hPYmplY3QuY3VyWCYmKG8uc2xpZGVIYW5kbGVyKG8uY3VycmVudFNsaWRlKSxvLnRvdWNoT2JqZWN0PXt9KX0sZS5wcm90b3R5cGUuc3dpcGVIYW5kbGVyPWZ1bmN0aW9uKGkpe3ZhciBlPXRoaXM7aWYoISghMT09PWUub3B0aW9ucy5zd2lwZXx8XCJvbnRvdWNoZW5kXCJpbiBkb2N1bWVudCYmITE9PT1lLm9wdGlvbnMuc3dpcGV8fCExPT09ZS5vcHRpb25zLmRyYWdnYWJsZSYmLTEhPT1pLnR5cGUuaW5kZXhPZihcIm1vdXNlXCIpKSlzd2l0Y2goZS50b3VjaE9iamVjdC5maW5nZXJDb3VudD1pLm9yaWdpbmFsRXZlbnQmJnZvaWQgMCE9PWkub3JpZ2luYWxFdmVudC50b3VjaGVzP2kub3JpZ2luYWxFdmVudC50b3VjaGVzLmxlbmd0aDoxLGUudG91Y2hPYmplY3QubWluU3dpcGU9ZS5saXN0V2lkdGgvZS5vcHRpb25zLnRvdWNoVGhyZXNob2xkLCEwPT09ZS5vcHRpb25zLnZlcnRpY2FsU3dpcGluZyYmKGUudG91Y2hPYmplY3QubWluU3dpcGU9ZS5saXN0SGVpZ2h0L2Uub3B0aW9ucy50b3VjaFRocmVzaG9sZCksaS5kYXRhLmFjdGlvbil7Y2FzZVwic3RhcnRcIjplLnN3aXBlU3RhcnQoaSk7YnJlYWs7Y2FzZVwibW92ZVwiOmUuc3dpcGVNb3ZlKGkpO2JyZWFrO2Nhc2VcImVuZFwiOmUuc3dpcGVFbmQoaSl9fSxlLnByb3RvdHlwZS5zd2lwZU1vdmU9ZnVuY3Rpb24oaSl7dmFyIGUsdCxvLHMsbixyLGw9dGhpcztyZXR1cm4gbj12b2lkIDAhPT1pLm9yaWdpbmFsRXZlbnQ/aS5vcmlnaW5hbEV2ZW50LnRvdWNoZXM6bnVsbCwhKCFsLmRyYWdnaW5nfHxsLnNjcm9sbGluZ3x8biYmMSE9PW4ubGVuZ3RoKSYmKGU9bC5nZXRMZWZ0KGwuY3VycmVudFNsaWRlKSxsLnRvdWNoT2JqZWN0LmN1clg9dm9pZCAwIT09bj9uWzBdLnBhZ2VYOmkuY2xpZW50WCxsLnRvdWNoT2JqZWN0LmN1clk9dm9pZCAwIT09bj9uWzBdLnBhZ2VZOmkuY2xpZW50WSxsLnRvdWNoT2JqZWN0LnN3aXBlTGVuZ3RoPU1hdGgucm91bmQoTWF0aC5zcXJ0KE1hdGgucG93KGwudG91Y2hPYmplY3QuY3VyWC1sLnRvdWNoT2JqZWN0LnN0YXJ0WCwyKSkpLHI9TWF0aC5yb3VuZChNYXRoLnNxcnQoTWF0aC5wb3cobC50b3VjaE9iamVjdC5jdXJZLWwudG91Y2hPYmplY3Quc3RhcnRZLDIpKSksIWwub3B0aW9ucy52ZXJ0aWNhbFN3aXBpbmcmJiFsLnN3aXBpbmcmJnI+ND8obC5zY3JvbGxpbmc9ITAsITEpOighMD09PWwub3B0aW9ucy52ZXJ0aWNhbFN3aXBpbmcmJihsLnRvdWNoT2JqZWN0LnN3aXBlTGVuZ3RoPXIpLHQ9bC5zd2lwZURpcmVjdGlvbigpLHZvaWQgMCE9PWkub3JpZ2luYWxFdmVudCYmbC50b3VjaE9iamVjdC5zd2lwZUxlbmd0aD40JiYobC5zd2lwaW5nPSEwLGkucHJldmVudERlZmF1bHQoKSkscz0oITE9PT1sLm9wdGlvbnMucnRsPzE6LTEpKihsLnRvdWNoT2JqZWN0LmN1clg+bC50b3VjaE9iamVjdC5zdGFydFg/MTotMSksITA9PT1sLm9wdGlvbnMudmVydGljYWxTd2lwaW5nJiYocz1sLnRvdWNoT2JqZWN0LmN1clk+bC50b3VjaE9iamVjdC5zdGFydFk/MTotMSksbz1sLnRvdWNoT2JqZWN0LnN3aXBlTGVuZ3RoLGwudG91Y2hPYmplY3QuZWRnZUhpdD0hMSwhMT09PWwub3B0aW9ucy5pbmZpbml0ZSYmKDA9PT1sLmN1cnJlbnRTbGlkZSYmXCJyaWdodFwiPT09dHx8bC5jdXJyZW50U2xpZGU+PWwuZ2V0RG90Q291bnQoKSYmXCJsZWZ0XCI9PT10KSYmKG89bC50b3VjaE9iamVjdC5zd2lwZUxlbmd0aCpsLm9wdGlvbnMuZWRnZUZyaWN0aW9uLGwudG91Y2hPYmplY3QuZWRnZUhpdD0hMCksITE9PT1sLm9wdGlvbnMudmVydGljYWw/bC5zd2lwZUxlZnQ9ZStvKnM6bC5zd2lwZUxlZnQ9ZStvKihsLiRsaXN0LmhlaWdodCgpL2wubGlzdFdpZHRoKSpzLCEwPT09bC5vcHRpb25zLnZlcnRpY2FsU3dpcGluZyYmKGwuc3dpcGVMZWZ0PWUrbypzKSwhMCE9PWwub3B0aW9ucy5mYWRlJiYhMSE9PWwub3B0aW9ucy50b3VjaE1vdmUmJighMD09PWwuYW5pbWF0aW5nPyhsLnN3aXBlTGVmdD1udWxsLCExKTp2b2lkIGwuc2V0Q1NTKGwuc3dpcGVMZWZ0KSkpKX0sZS5wcm90b3R5cGUuc3dpcGVTdGFydD1mdW5jdGlvbihpKXt2YXIgZSx0PXRoaXM7aWYodC5pbnRlcnJ1cHRlZD0hMCwxIT09dC50b3VjaE9iamVjdC5maW5nZXJDb3VudHx8dC5zbGlkZUNvdW50PD10Lm9wdGlvbnMuc2xpZGVzVG9TaG93KXJldHVybiB0LnRvdWNoT2JqZWN0PXt9LCExO3ZvaWQgMCE9PWkub3JpZ2luYWxFdmVudCYmdm9pZCAwIT09aS5vcmlnaW5hbEV2ZW50LnRvdWNoZXMmJihlPWkub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdKSx0LnRvdWNoT2JqZWN0LnN0YXJ0WD10LnRvdWNoT2JqZWN0LmN1clg9dm9pZCAwIT09ZT9lLnBhZ2VYOmkuY2xpZW50WCx0LnRvdWNoT2JqZWN0LnN0YXJ0WT10LnRvdWNoT2JqZWN0LmN1clk9dm9pZCAwIT09ZT9lLnBhZ2VZOmkuY2xpZW50WSx0LmRyYWdnaW5nPSEwfSxlLnByb3RvdHlwZS51bmZpbHRlclNsaWRlcz1lLnByb3RvdHlwZS5zbGlja1VuZmlsdGVyPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztudWxsIT09aS4kc2xpZGVzQ2FjaGUmJihpLnVubG9hZCgpLGkuJHNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKS5kZXRhY2goKSxpLiRzbGlkZXNDYWNoZS5hcHBlbmRUbyhpLiRzbGlkZVRyYWNrKSxpLnJlaW5pdCgpKX0sZS5wcm90b3R5cGUudW5sb2FkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpKFwiLnNsaWNrLWNsb25lZFwiLGUuJHNsaWRlcikucmVtb3ZlKCksZS4kZG90cyYmZS4kZG90cy5yZW1vdmUoKSxlLiRwcmV2QXJyb3cmJmUuaHRtbEV4cHIudGVzdChlLm9wdGlvbnMucHJldkFycm93KSYmZS4kcHJldkFycm93LnJlbW92ZSgpLGUuJG5leHRBcnJvdyYmZS5odG1sRXhwci50ZXN0KGUub3B0aW9ucy5uZXh0QXJyb3cpJiZlLiRuZXh0QXJyb3cucmVtb3ZlKCksZS4kc2xpZGVzLnJlbW92ZUNsYXNzKFwic2xpY2stc2xpZGUgc2xpY2stYWN0aXZlIHNsaWNrLXZpc2libGUgc2xpY2stY3VycmVudFwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIikuY3NzKFwid2lkdGhcIixcIlwiKX0sZS5wcm90b3R5cGUudW5zbGljaz1mdW5jdGlvbihpKXt2YXIgZT10aGlzO2UuJHNsaWRlci50cmlnZ2VyKFwidW5zbGlja1wiLFtlLGldKSxlLmRlc3Ryb3koKX0sZS5wcm90b3R5cGUudXBkYXRlQXJyb3dzPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztNYXRoLmZsb29yKGkub3B0aW9ucy5zbGlkZXNUb1Nob3cvMiksITA9PT1pLm9wdGlvbnMuYXJyb3dzJiZpLnNsaWRlQ291bnQ+aS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmIWkub3B0aW9ucy5pbmZpbml0ZSYmKGkuJHByZXZBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWRpc2FibGVkXCIpLmF0dHIoXCJhcmlhLWRpc2FibGVkXCIsXCJmYWxzZVwiKSxpLiRuZXh0QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwiZmFsc2VcIiksMD09PWkuY3VycmVudFNsaWRlPyhpLiRwcmV2QXJyb3cuYWRkQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwidHJ1ZVwiKSxpLiRuZXh0QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwiZmFsc2VcIikpOmkuY3VycmVudFNsaWRlPj1pLnNsaWRlQ291bnQtaS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmITE9PT1pLm9wdGlvbnMuY2VudGVyTW9kZT8oaS4kbmV4dEFycm93LmFkZENsYXNzKFwic2xpY2stZGlzYWJsZWRcIikuYXR0cihcImFyaWEtZGlzYWJsZWRcIixcInRydWVcIiksaS4kcHJldkFycm93LnJlbW92ZUNsYXNzKFwic2xpY2stZGlzYWJsZWRcIikuYXR0cihcImFyaWEtZGlzYWJsZWRcIixcImZhbHNlXCIpKTppLmN1cnJlbnRTbGlkZT49aS5zbGlkZUNvdW50LTEmJiEwPT09aS5vcHRpb25zLmNlbnRlck1vZGUmJihpLiRuZXh0QXJyb3cuYWRkQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwidHJ1ZVwiKSxpLiRwcmV2QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwiZmFsc2VcIikpKX0sZS5wcm90b3R5cGUudXBkYXRlRG90cz1mdW5jdGlvbigpe3ZhciBpPXRoaXM7bnVsbCE9PWkuJGRvdHMmJihpLiRkb3RzLmZpbmQoXCJsaVwiKS5yZW1vdmVDbGFzcyhcInNsaWNrLWFjdGl2ZVwiKS5lbmQoKSxpLiRkb3RzLmZpbmQoXCJsaVwiKS5lcShNYXRoLmZsb29yKGkuY3VycmVudFNsaWRlL2kub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCkpLmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpKX0sZS5wcm90b3R5cGUudmlzaWJpbGl0eT1mdW5jdGlvbigpe3ZhciBpPXRoaXM7aS5vcHRpb25zLmF1dG9wbGF5JiYoZG9jdW1lbnRbaS5oaWRkZW5dP2kuaW50ZXJydXB0ZWQ9ITA6aS5pbnRlcnJ1cHRlZD0hMSl9LGkuZm4uc2xpY2s9ZnVuY3Rpb24oKXt2YXIgaSx0LG89dGhpcyxzPWFyZ3VtZW50c1swXSxuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxyPW8ubGVuZ3RoO2ZvcihpPTA7aTxyO2krKylpZihcIm9iamVjdFwiPT10eXBlb2Ygc3x8dm9pZCAwPT09cz9vW2ldLnNsaWNrPW5ldyBlKG9baV0scyk6dD1vW2ldLnNsaWNrW3NdLmFwcGx5KG9baV0uc2xpY2ssbiksdm9pZCAwIT09dClyZXR1cm4gdDtyZXR1cm4gb319KTtcbiIsIi8qKlxuICogU1ZHSW5qZWN0b3IgdjEuMS4zIC0gRmFzdCwgY2FjaGluZywgZHluYW1pYyBpbmxpbmUgU1ZHIERPTSBpbmplY3Rpb24gbGlicmFyeVxuICogaHR0cHM6Ly9naXRodWIuY29tL2ljb25pYy9TVkdJbmplY3RvclxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFdheWJ1cnkgPGhlbGxvQHdheWJ1cnkuY29tPlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cbiFmdW5jdGlvbih0LGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHIodCl7dD10LnNwbGl0KFwiIFwiKTtmb3IodmFyIGU9e30scj10Lmxlbmd0aCxuPVtdO3ItLTspZS5oYXNPd25Qcm9wZXJ0eSh0W3JdKXx8KGVbdFtyXV09MSxuLnVuc2hpZnQodFtyXSkpO3JldHVybiBuLmpvaW4oXCIgXCIpfXZhciBuPVwiZmlsZTpcIj09PXQubG9jYXRpb24ucHJvdG9jb2wsaT1lLmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoXCJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0Jhc2ljU3RydWN0dXJlXCIsXCIxLjFcIiksbz1BcnJheS5wcm90b3R5cGUuZm9yRWFjaHx8ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT10aGlzfHxudWxsPT09dGhpc3x8XCJmdW5jdGlvblwiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yO3ZhciByLG49dGhpcy5sZW5ndGg+Pj4wO2ZvcihyPTA7bj5yOysrcilyIGluIHRoaXMmJnQuY2FsbChlLHRoaXNbcl0scix0aGlzKX0sYT17fSxsPTAscz1bXSx1PVtdLGM9e30sZj1mdW5jdGlvbih0KXtyZXR1cm4gdC5jbG9uZU5vZGUoITApfSxwPWZ1bmN0aW9uKHQsZSl7dVt0XT11W3RdfHxbXSx1W3RdLnB1c2goZSl9LGQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAscj11W3RdLmxlbmd0aDtyPmU7ZSsrKSFmdW5jdGlvbihlKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dVt0XVtlXShmKGFbdF0pKX0sMCl9KGUpfSx2PWZ1bmN0aW9uKGUscil7aWYodm9pZCAwIT09YVtlXSlhW2VdaW5zdGFuY2VvZiBTVkdTVkdFbGVtZW50P3IoZihhW2VdKSk6cChlLHIpO2Vsc2V7aWYoIXQuWE1MSHR0cFJlcXVlc3QpcmV0dXJuIHIoXCJCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgWE1MSHR0cFJlcXVlc3RcIiksITE7YVtlXT17fSxwKGUscik7dmFyIGk9bmV3IFhNTEh0dHBSZXF1ZXN0O2kub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoND09PWkucmVhZHlTdGF0ZSl7aWYoNDA0PT09aS5zdGF0dXN8fG51bGw9PT1pLnJlc3BvbnNlWE1MKXJldHVybiByKFwiVW5hYmxlIHRvIGxvYWQgU1ZHIGZpbGU6IFwiK2UpLG4mJnIoXCJOb3RlOiBTVkcgaW5qZWN0aW9uIGFqYXggY2FsbHMgZG8gbm90IHdvcmsgbG9jYWxseSB3aXRob3V0IGFkanVzdGluZyBzZWN1cml0eSBzZXR0aW5nIGluIHlvdXIgYnJvd3Nlci4gT3IgY29uc2lkZXIgdXNpbmcgYSBsb2NhbCB3ZWJzZXJ2ZXIuXCIpLHIoKSwhMTtpZighKDIwMD09PWkuc3RhdHVzfHxuJiYwPT09aS5zdGF0dXMpKXJldHVybiByKFwiVGhlcmUgd2FzIGEgcHJvYmxlbSBpbmplY3RpbmcgdGhlIFNWRzogXCIraS5zdGF0dXMrXCIgXCIraS5zdGF0dXNUZXh0KSwhMTtpZihpLnJlc3BvbnNlWE1MIGluc3RhbmNlb2YgRG9jdW1lbnQpYVtlXT1pLnJlc3BvbnNlWE1MLmRvY3VtZW50RWxlbWVudDtlbHNlIGlmKERPTVBhcnNlciYmRE9NUGFyc2VyIGluc3RhbmNlb2YgRnVuY3Rpb24pe3ZhciB0O3RyeXt2YXIgbz1uZXcgRE9NUGFyc2VyO3Q9by5wYXJzZUZyb21TdHJpbmcoaS5yZXNwb25zZVRleHQsXCJ0ZXh0L3htbFwiKX1jYXRjaChsKXt0PXZvaWQgMH1pZighdHx8dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInBhcnNlcmVycm9yXCIpLmxlbmd0aClyZXR1cm4gcihcIlVuYWJsZSB0byBwYXJzZSBTVkcgZmlsZTogXCIrZSksITE7YVtlXT10LmRvY3VtZW50RWxlbWVudH1kKGUpfX0saS5vcGVuKFwiR0VUXCIsZSksaS5vdmVycmlkZU1pbWVUeXBlJiZpLm92ZXJyaWRlTWltZVR5cGUoXCJ0ZXh0L3htbFwiKSxpLnNlbmQoKX19LGg9ZnVuY3Rpb24oZSxuLGEsdSl7dmFyIGY9ZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXNyY1wiKXx8ZS5nZXRBdHRyaWJ1dGUoXCJzcmNcIik7aWYoIS9cXC5zdmcvaS50ZXN0KGYpKXJldHVybiB2b2lkIHUoXCJBdHRlbXB0ZWQgdG8gaW5qZWN0IGEgZmlsZSB3aXRoIGEgbm9uLXN2ZyBleHRlbnNpb246IFwiK2YpO2lmKCFpKXt2YXIgcD1lLmdldEF0dHJpYnV0ZShcImRhdGEtZmFsbGJhY2tcIil8fGUuZ2V0QXR0cmlidXRlKFwiZGF0YS1wbmdcIik7cmV0dXJuIHZvaWQocD8oZS5zZXRBdHRyaWJ1dGUoXCJzcmNcIixwKSx1KG51bGwpKTphPyhlLnNldEF0dHJpYnV0ZShcInNyY1wiLGErXCIvXCIrZi5zcGxpdChcIi9cIikucG9wKCkucmVwbGFjZShcIi5zdmdcIixcIi5wbmdcIikpLHUobnVsbCkpOnUoXCJUaGlzIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBTVkcgYW5kIG5vIFBORyBmYWxsYmFjayB3YXMgZGVmaW5lZC5cIikpfS0xPT09cy5pbmRleE9mKGUpJiYocy5wdXNoKGUpLGUuc2V0QXR0cmlidXRlKFwic3JjXCIsXCJcIiksdihmLGZ1bmN0aW9uKGkpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBpfHxcInN0cmluZ1wiPT10eXBlb2YgaSlyZXR1cm4gdShpKSwhMTt2YXIgYT1lLmdldEF0dHJpYnV0ZShcImlkXCIpO2EmJmkuc2V0QXR0cmlidXRlKFwiaWRcIixhKTt2YXIgcD1lLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpO3AmJmkuc2V0QXR0cmlidXRlKFwidGl0bGVcIixwKTt2YXIgZD1bXS5jb25jYXQoaS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKXx8W10sXCJpbmplY3RlZC1zdmdcIixlLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpfHxbXSkuam9pbihcIiBcIik7aS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLHIoZCkpO3ZhciB2PWUuZ2V0QXR0cmlidXRlKFwic3R5bGVcIik7diYmaS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLHYpO3ZhciBoPVtdLmZpbHRlci5jYWxsKGUuYXR0cmlidXRlcyxmdW5jdGlvbih0KXtyZXR1cm4vXmRhdGEtXFx3W1xcd1xcLV0qJC8udGVzdCh0Lm5hbWUpfSk7by5jYWxsKGgsZnVuY3Rpb24odCl7dC5uYW1lJiZ0LnZhbHVlJiZpLnNldEF0dHJpYnV0ZSh0Lm5hbWUsdC52YWx1ZSl9KTt2YXIgZyxtLGIseSxBLHc9e2NsaXBQYXRoOltcImNsaXAtcGF0aFwiXSxcImNvbG9yLXByb2ZpbGVcIjpbXCJjb2xvci1wcm9maWxlXCJdLGN1cnNvcjpbXCJjdXJzb3JcIl0sZmlsdGVyOltcImZpbHRlclwiXSxsaW5lYXJHcmFkaWVudDpbXCJmaWxsXCIsXCJzdHJva2VcIl0sbWFya2VyOltcIm1hcmtlclwiLFwibWFya2VyLXN0YXJ0XCIsXCJtYXJrZXItbWlkXCIsXCJtYXJrZXItZW5kXCJdLG1hc2s6W1wibWFza1wiXSxwYXR0ZXJuOltcImZpbGxcIixcInN0cm9rZVwiXSxyYWRpYWxHcmFkaWVudDpbXCJmaWxsXCIsXCJzdHJva2VcIl19O09iamVjdC5rZXlzKHcpLmZvckVhY2goZnVuY3Rpb24odCl7Zz10LGI9d1t0XSxtPWkucXVlcnlTZWxlY3RvckFsbChcImRlZnMgXCIrZytcIltpZF1cIik7Zm9yKHZhciBlPTAscj1tLmxlbmd0aDtyPmU7ZSsrKXt5PW1bZV0uaWQsQT15K1wiLVwiK2w7dmFyIG47by5jYWxsKGIsZnVuY3Rpb24odCl7bj1pLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbXCIrdCsnKj1cIicreSsnXCJdJyk7Zm9yKHZhciBlPTAscj1uLmxlbmd0aDtyPmU7ZSsrKW5bZV0uc2V0QXR0cmlidXRlKHQsXCJ1cmwoI1wiK0ErXCIpXCIpfSksbVtlXS5pZD1BfX0pLGkucmVtb3ZlQXR0cmlidXRlKFwieG1sbnM6YVwiKTtmb3IodmFyIHgsUyxrPWkucXVlcnlTZWxlY3RvckFsbChcInNjcmlwdFwiKSxqPVtdLEc9MCxUPWsubGVuZ3RoO1Q+RztHKyspUz1rW0ddLmdldEF0dHJpYnV0ZShcInR5cGVcIiksUyYmXCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0XCIhPT1TJiZcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiE9PVN8fCh4PWtbR10uaW5uZXJUZXh0fHxrW0ddLnRleHRDb250ZW50LGoucHVzaCh4KSxpLnJlbW92ZUNoaWxkKGtbR10pKTtpZihqLmxlbmd0aD4wJiYoXCJhbHdheXNcIj09PW58fFwib25jZVwiPT09biYmIWNbZl0pKXtmb3IodmFyIE09MCxWPWoubGVuZ3RoO1Y+TTtNKyspbmV3IEZ1bmN0aW9uKGpbTV0pKHQpO2NbZl09ITB9dmFyIEU9aS5xdWVyeVNlbGVjdG9yQWxsKFwic3R5bGVcIik7by5jYWxsKEUsZnVuY3Rpb24odCl7dC50ZXh0Q29udGVudCs9XCJcIn0pLGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaSxlKSxkZWxldGUgc1tzLmluZGV4T2YoZSldLGU9bnVsbCxsKyssdShpKX0pKX0sZz1mdW5jdGlvbih0LGUscil7ZT1lfHx7fTt2YXIgbj1lLmV2YWxTY3JpcHRzfHxcImFsd2F5c1wiLGk9ZS5wbmdGYWxsYmFja3x8ITEsYT1lLmVhY2g7aWYodm9pZCAwIT09dC5sZW5ndGgpe3ZhciBsPTA7by5jYWxsKHQsZnVuY3Rpb24oZSl7aChlLG4saSxmdW5jdGlvbihlKXthJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhJiZhKGUpLHImJnQubGVuZ3RoPT09KytsJiZyKGwpfSl9KX1lbHNlIHQ/aCh0LG4saSxmdW5jdGlvbihlKXthJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhJiZhKGUpLHImJnIoMSksdD1udWxsfSk6ciYmcigwKX07XCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWV4cG9ydHM9ZzpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKGZ1bmN0aW9uKCl7cmV0dXJuIGd9KTpcIm9iamVjdFwiPT10eXBlb2YgdCYmKHQuU1ZHSW5qZWN0b3I9Zyl9KHdpbmRvdyxkb2N1bWVudCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdmctaW5qZWN0b3IubWFwLmpzIiwiIWZ1bmN0aW9uKHQsZSl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZSgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZSk6KHQ9dHx8c2VsZikuU3dlZXRhbGVydDI9ZSgpfSh0aGlzLGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gcih0KXtyZXR1cm4ocj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9ZnVuY3Rpb24gYSh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gbyh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbz1lW25dO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19ZnVuY3Rpb24gYyh0LGUsbil7cmV0dXJuIGUmJm8odC5wcm90b3R5cGUsZSksbiYmbyh0LG4pLHR9ZnVuY3Rpb24gcygpe3JldHVybihzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPWFyZ3VtZW50c1tlXTtmb3IodmFyIG8gaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixvKSYmKHRbb109bltvXSl9cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gdSh0KXtyZXR1cm4odT1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9ZnVuY3Rpb24gbCh0LGUpe3JldHVybihsPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5fX3Byb3RvX189ZSx0fSkodCxlKX1mdW5jdGlvbiBkKCl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX1mdW5jdGlvbiBpKHQsZSxuKXtyZXR1cm4oaT1kKCk/UmVmbGVjdC5jb25zdHJ1Y3Q6ZnVuY3Rpb24odCxlLG4pe3ZhciBvPVtudWxsXTtvLnB1c2guYXBwbHkobyxlKTt2YXIgaT1uZXcoRnVuY3Rpb24uYmluZC5hcHBseSh0LG8pKTtyZXR1cm4gbiYmbChpLG4ucHJvdG90eXBlKSxpfSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfWZ1bmN0aW9uIHAodCxlKXtyZXR1cm4hZXx8XCJvYmplY3RcIiE9dHlwZW9mIGUmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGU/ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7cmV0dXJuIHR9KHQpOmV9ZnVuY3Rpb24gZih0LGUsbil7cmV0dXJuKGY9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFJlZmxlY3QmJlJlZmxlY3QuZ2V0P1JlZmxlY3QuZ2V0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgbz1mdW5jdGlvbih0LGUpe2Zvcig7IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpJiZudWxsIT09KHQ9dSh0KSk7KTtyZXR1cm4gdH0odCxlKTtpZihvKXt2YXIgaT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sZSk7cmV0dXJuIGkuZ2V0P2kuZ2V0LmNhbGwobik6aS52YWx1ZX19KSh0LGUsbnx8dCl9ZnVuY3Rpb24gbShlKXtyZXR1cm4gT2JqZWN0LmtleXMoZSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfSl9ZnVuY3Rpb24gaCh0KXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCl9ZnVuY3Rpb24gZyh0LGUpe3ZhciBuO249J1wiJy5jb25jYXQodCwnXCIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuIFBsZWFzZSB1c2UgXCInKS5jb25jYXQoZSwnXCIgaW5zdGVhZC4nKSwtMT09PXouaW5kZXhPZihuKSYmKHoucHVzaChuKSxfKG4pKX1mdW5jdGlvbiB2KHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiB0LnRvUHJvbWlzZX1mdW5jdGlvbiBiKHQpe3JldHVybiB2KHQpP3QudG9Qcm9taXNlKCk6UHJvbWlzZS5yZXNvbHZlKHQpfWZ1bmN0aW9uIHkodCl7cmV0dXJuIHQmJlByb21pc2UucmVzb2x2ZSh0KT09PXR9ZnVuY3Rpb24gdyh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEVsZW1lbnR8fFwib2JqZWN0XCI9PT1yKGU9dCkmJmUuanF1ZXJ5O3ZhciBlfWZ1bmN0aW9uIHQodCl7dmFyIGU9e307Zm9yKHZhciBuIGluIHQpZVt0W25dXT1cInN3YWwyLVwiK3Rbbl07cmV0dXJuIGV9ZnVuY3Rpb24gQyh0KXt2YXIgZT1RKCk7cmV0dXJuIGU/ZS5xdWVyeVNlbGVjdG9yKHQpOm51bGx9ZnVuY3Rpb24gZSh0KXtyZXR1cm4gQyhcIi5cIi5jb25jYXQodCkpfWZ1bmN0aW9uIG4oKXt2YXIgdD0kKCk7cmV0dXJuIGgodC5xdWVyeVNlbGVjdG9yQWxsKFwiLlwiLmNvbmNhdChZLmljb24pKSl9ZnVuY3Rpb24gaygpe3ZhciB0PW4oKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHZ0KHQpfSk7cmV0dXJuIHQubGVuZ3RoP3RbMF06bnVsbH1mdW5jdGlvbiB4KCl7cmV0dXJuIGUoWS50aXRsZSl9ZnVuY3Rpb24gUCgpe3JldHVybiBlKFkuY29udGVudCl9ZnVuY3Rpb24gQSgpe3JldHVybiBlKFkuaW1hZ2UpfWZ1bmN0aW9uIEIoKXtyZXR1cm4gZShZW1wicHJvZ3Jlc3Mtc3RlcHNcIl0pfWZ1bmN0aW9uIFMoKXtyZXR1cm4gZShZW1widmFsaWRhdGlvbi1tZXNzYWdlXCJdKX1mdW5jdGlvbiBFKCl7cmV0dXJuIEMoXCIuXCIuY29uY2F0KFkuYWN0aW9ucyxcIiAuXCIpLmNvbmNhdChZLmNvbmZpcm0pKX1mdW5jdGlvbiBPKCl7cmV0dXJuIEMoXCIuXCIuY29uY2F0KFkuYWN0aW9ucyxcIiAuXCIpLmNvbmNhdChZLmNhbmNlbCkpfWZ1bmN0aW9uIFQoKXtyZXR1cm4gZShZLmFjdGlvbnMpfWZ1bmN0aW9uIEwoKXtyZXR1cm4gZShZLmhlYWRlcil9ZnVuY3Rpb24gSSgpe3JldHVybiBlKFkuZm9vdGVyKX1mdW5jdGlvbiBqKCl7cmV0dXJuIGUoWVtcInRpbWVyLXByb2dyZXNzLWJhclwiXSl9ZnVuY3Rpb24gcSgpe3JldHVybiBlKFkuY2xvc2UpfWZ1bmN0aW9uIFYoKXt2YXIgdD1oKCQoKS5xdWVyeVNlbGVjdG9yQWxsKCdbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9XCItMVwiXSk6bm90KFt0YWJpbmRleD1cIjBcIl0pJykpLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdD1wYXJzZUludCh0LmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKSwoZT1wYXJzZUludChlLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKSk8dD8xOnQ8ZT8tMTowfSksZT1oKCQoKS5xdWVyeVNlbGVjdG9yQWxsKCdcXG4gIGFbaHJlZl0sXFxuICBhcmVhW2hyZWZdLFxcbiAgaW5wdXQ6bm90KFtkaXNhYmxlZF0pLFxcbiAgc2VsZWN0Om5vdChbZGlzYWJsZWRdKSxcXG4gIHRleHRhcmVhOm5vdChbZGlzYWJsZWRdKSxcXG4gIGJ1dHRvbjpub3QoW2Rpc2FibGVkXSksXFxuICBpZnJhbWUsXFxuICBvYmplY3QsXFxuICBlbWJlZCxcXG4gIFt0YWJpbmRleD1cIjBcIl0sXFxuICBbY29udGVudGVkaXRhYmxlXSxcXG4gIGF1ZGlvW2NvbnRyb2xzXSxcXG4gIHZpZGVvW2NvbnRyb2xzXSxcXG4gIHN1bW1hcnlcXG4nKSkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVyblwiLTFcIiE9PXQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIil9KTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPHQubGVuZ3RoO24rKyktMT09PWUuaW5kZXhPZih0W25dKSYmZS5wdXNoKHRbbl0pO3JldHVybiBlfSh0LmNvbmNhdChlKSkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB2dCh0KX0pfWZ1bmN0aW9uIE0oKXtyZXR1cm4hSigpJiYhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoWVtcIm5vLWJhY2tkcm9wXCJdKX1mdW5jdGlvbiBSKCl7cmV0dXJuICQoKS5oYXNBdHRyaWJ1dGUoXCJkYXRhLWxvYWRpbmdcIil9ZnVuY3Rpb24gSChlLHQpe3ZhciBuO2UudGV4dENvbnRlbnQ9XCJcIix0JiYobj0obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHQsXCJ0ZXh0L2h0bWxcIiksaChuLnF1ZXJ5U2VsZWN0b3IoXCJoZWFkXCIpLmNoaWxkTm9kZXMpLmZvckVhY2goZnVuY3Rpb24odCl7ZS5hcHBlbmRDaGlsZCh0KX0pLGgobi5xdWVyeVNlbGVjdG9yKFwiYm9keVwiKS5jaGlsZE5vZGVzKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UuYXBwZW5kQ2hpbGQodCl9KSl9ZnVuY3Rpb24gRCh0LGUpe2lmKGUpe2Zvcih2YXIgbj1lLnNwbGl0KC9cXHMrLyksbz0wO288bi5sZW5ndGg7bysrKWlmKCF0LmNsYXNzTGlzdC5jb250YWlucyhuW29dKSlyZXR1cm47cmV0dXJuIDF9fWZ1bmN0aW9uIE4odCxlLG4pe3ZhciBvLGk7aWYoaT1lLGgoKG89dCkuY2xhc3NMaXN0KS5mb3JFYWNoKGZ1bmN0aW9uKHQpey0xPT09bShZKS5pbmRleE9mKHQpJiYtMT09PW0oWikuaW5kZXhPZih0KSYmLTE9PT1tKGkuc2hvd0NsYXNzKS5pbmRleE9mKHQpJiZvLmNsYXNzTGlzdC5yZW1vdmUodCl9KSxlLmN1c3RvbUNsYXNzJiZlLmN1c3RvbUNsYXNzW25dKXtpZihcInN0cmluZ1wiIT10eXBlb2YgZS5jdXN0b21DbGFzc1tuXSYmIWUuY3VzdG9tQ2xhc3Nbbl0uZm9yRWFjaClyZXR1cm4gXyhcIkludmFsaWQgdHlwZSBvZiBjdXN0b21DbGFzcy5cIi5jb25jYXQobiwnISBFeHBlY3RlZCBzdHJpbmcgb3IgaXRlcmFibGUgb2JqZWN0LCBnb3QgXCInKS5jb25jYXQocihlLmN1c3RvbUNsYXNzW25dKSwnXCInKSk7bXQodCxlLmN1c3RvbUNsYXNzW25dKX19dmFyIFU9XCJTd2VldEFsZXJ0MjpcIixfPWZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybihcIlwiLmNvbmNhdChVLFwiIFwiKS5jb25jYXQodCkpfSxGPWZ1bmN0aW9uKHQpe2NvbnNvbGUuZXJyb3IoXCJcIi5jb25jYXQoVSxcIiBcIikuY29uY2F0KHQpKX0sej1bXSxXPWZ1bmN0aW9uKHQpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/dCgpOnR9LEs9T2JqZWN0LmZyZWV6ZSh7Y2FuY2VsOlwiY2FuY2VsXCIsYmFja2Ryb3A6XCJiYWNrZHJvcFwiLGNsb3NlOlwiY2xvc2VcIixlc2M6XCJlc2NcIix0aW1lcjpcInRpbWVyXCJ9KSxZPXQoW1wiY29udGFpbmVyXCIsXCJzaG93blwiLFwiaGVpZ2h0LWF1dG9cIixcImlvc2ZpeFwiLFwicG9wdXBcIixcIm1vZGFsXCIsXCJuby1iYWNrZHJvcFwiLFwibm8tdHJhbnNpdGlvblwiLFwidG9hc3RcIixcInRvYXN0LXNob3duXCIsXCJ0b2FzdC1jb2x1bW5cIixcInNob3dcIixcImhpZGVcIixcImNsb3NlXCIsXCJ0aXRsZVwiLFwiaGVhZGVyXCIsXCJjb250ZW50XCIsXCJodG1sLWNvbnRhaW5lclwiLFwiYWN0aW9uc1wiLFwiY29uZmlybVwiLFwiY2FuY2VsXCIsXCJmb290ZXJcIixcImljb25cIixcImljb24tY29udGVudFwiLFwiaW1hZ2VcIixcImlucHV0XCIsXCJmaWxlXCIsXCJyYW5nZVwiLFwic2VsZWN0XCIsXCJyYWRpb1wiLFwiY2hlY2tib3hcIixcImxhYmVsXCIsXCJ0ZXh0YXJlYVwiLFwiaW5wdXRlcnJvclwiLFwidmFsaWRhdGlvbi1tZXNzYWdlXCIsXCJwcm9ncmVzcy1zdGVwc1wiLFwiYWN0aXZlLXByb2dyZXNzLXN0ZXBcIixcInByb2dyZXNzLXN0ZXBcIixcInByb2dyZXNzLXN0ZXAtbGluZVwiLFwibG9hZGluZ1wiLFwic3R5bGVkXCIsXCJ0b3BcIixcInRvcC1zdGFydFwiLFwidG9wLWVuZFwiLFwidG9wLWxlZnRcIixcInRvcC1yaWdodFwiLFwiY2VudGVyXCIsXCJjZW50ZXItc3RhcnRcIixcImNlbnRlci1lbmRcIixcImNlbnRlci1sZWZ0XCIsXCJjZW50ZXItcmlnaHRcIixcImJvdHRvbVwiLFwiYm90dG9tLXN0YXJ0XCIsXCJib3R0b20tZW5kXCIsXCJib3R0b20tbGVmdFwiLFwiYm90dG9tLXJpZ2h0XCIsXCJncm93LXJvd1wiLFwiZ3Jvdy1jb2x1bW5cIixcImdyb3ctZnVsbHNjcmVlblwiLFwicnRsXCIsXCJ0aW1lci1wcm9ncmVzcy1iYXJcIixcInRpbWVyLXByb2dyZXNzLWJhci1jb250YWluZXJcIixcInNjcm9sbGJhci1tZWFzdXJlXCIsXCJpY29uLXN1Y2Nlc3NcIixcImljb24td2FybmluZ1wiLFwiaWNvbi1pbmZvXCIsXCJpY29uLXF1ZXN0aW9uXCIsXCJpY29uLWVycm9yXCJdKSxaPXQoW1wic3VjY2Vzc1wiLFwid2FybmluZ1wiLFwiaW5mb1wiLFwicXVlc3Rpb25cIixcImVycm9yXCJdKSxRPWZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcihcIi5cIi5jb25jYXQoWS5jb250YWluZXIpKX0sJD1mdW5jdGlvbigpe3JldHVybiBlKFkucG9wdXApfSxKPWZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKFlbXCJ0b2FzdC1zaG93blwiXSl9LFg9e3ByZXZpb3VzQm9keVBhZGRpbmc6bnVsbH07ZnVuY3Rpb24gRyh0LGUpe2lmKCFlKXJldHVybiBudWxsO3N3aXRjaChlKXtjYXNlXCJzZWxlY3RcIjpjYXNlXCJ0ZXh0YXJlYVwiOmNhc2VcImZpbGVcIjpyZXR1cm4gZ3QodCxZW2VdKTtjYXNlXCJjaGVja2JveFwiOnJldHVybiB0LnF1ZXJ5U2VsZWN0b3IoXCIuXCIuY29uY2F0KFkuY2hlY2tib3gsXCIgaW5wdXRcIikpO2Nhc2VcInJhZGlvXCI6cmV0dXJuIHQucXVlcnlTZWxlY3RvcihcIi5cIi5jb25jYXQoWS5yYWRpbyxcIiBpbnB1dDpjaGVja2VkXCIpKXx8dC5xdWVyeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChZLnJhZGlvLFwiIGlucHV0OmZpcnN0LWNoaWxkXCIpKTtjYXNlXCJyYW5nZVwiOnJldHVybiB0LnF1ZXJ5U2VsZWN0b3IoXCIuXCIuY29uY2F0KFkucmFuZ2UsXCIgaW5wdXRcIikpO2RlZmF1bHQ6cmV0dXJuIGd0KHQsWS5pbnB1dCl9fWZ1bmN0aW9uIHR0KHQpe3ZhciBlO3QuZm9jdXMoKSxcImZpbGVcIiE9PXQudHlwZSYmKGU9dC52YWx1ZSx0LnZhbHVlPVwiXCIsdC52YWx1ZT1lKX1mdW5jdGlvbiBldCh0LGUsbil7dCYmZSYmKFwic3RyaW5nXCI9PXR5cGVvZiBlJiYoZT1lLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pKSxlLmZvckVhY2goZnVuY3Rpb24oZSl7dC5mb3JFYWNoP3QuZm9yRWFjaChmdW5jdGlvbih0KXtuP3QuY2xhc3NMaXN0LmFkZChlKTp0LmNsYXNzTGlzdC5yZW1vdmUoZSl9KTpuP3QuY2xhc3NMaXN0LmFkZChlKTp0LmNsYXNzTGlzdC5yZW1vdmUoZSl9KSl9ZnVuY3Rpb24gbnQodCxlLG4pe258fDA9PT1wYXJzZUludChuKT90LnN0eWxlW2VdPVwibnVtYmVyXCI9PXR5cGVvZiBuP1wiXCIuY29uY2F0KG4sXCJweFwiKTpuOnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoZSl9ZnVuY3Rpb24gb3QodCxlKXt2YXIgbj0xPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWU/ZTpcImZsZXhcIjt0LnN0eWxlLm9wYWNpdHk9XCJcIix0LnN0eWxlLmRpc3BsYXk9bn1mdW5jdGlvbiBpdCh0KXt0LnN0eWxlLm9wYWNpdHk9XCJcIix0LnN0eWxlLmRpc3BsYXk9XCJub25lXCJ9ZnVuY3Rpb24gcnQodCxlLG4pe2U/b3QodCxuKTppdCh0KX1mdW5jdGlvbiBhdCh0KXtyZXR1cm4hISh0LnNjcm9sbEhlaWdodD50LmNsaWVudEhlaWdodCl9ZnVuY3Rpb24gY3QodCl7dmFyIGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUodCksbj1wYXJzZUZsb2F0KGUuZ2V0UHJvcGVydHlWYWx1ZShcImFuaW1hdGlvbi1kdXJhdGlvblwiKXx8XCIwXCIpLG89cGFyc2VGbG9hdChlLmdldFByb3BlcnR5VmFsdWUoXCJ0cmFuc2l0aW9uLWR1cmF0aW9uXCIpfHxcIjBcIik7cmV0dXJuIDA8bnx8MDxvfWZ1bmN0aW9uIHN0KHQsZSl7dmFyIG49MTxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1lJiZlLG89aigpO3Z0KG8pJiYobiYmKG8uc3R5bGUudHJhbnNpdGlvbj1cIm5vbmVcIixvLnN0eWxlLndpZHRoPVwiMTAwJVwiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7by5zdHlsZS50cmFuc2l0aW9uPVwid2lkdGggXCIuY29uY2F0KHQvMWUzLFwicyBsaW5lYXJcIiksby5zdHlsZS53aWR0aD1cIjAlXCJ9LDEwKSl9ZnVuY3Rpb24gdXQoKXtyZXR1cm5cInVuZGVmaW5lZFwiPT10eXBlb2Ygd2luZG93fHxcInVuZGVmaW5lZFwiPT10eXBlb2YgZG9jdW1lbnR9ZnVuY3Rpb24gbHQodCl7bG4uaXNWaXNpYmxlKCkmJmZ0IT09dC50YXJnZXQudmFsdWUmJmxuLnJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UoKSxmdD10LnRhcmdldC52YWx1ZX1mdW5jdGlvbiBkdCh0LGUpe3QgaW5zdGFuY2VvZiBIVE1MRWxlbWVudD9lLmFwcGVuZENoaWxkKHQpOlwib2JqZWN0XCI9PT1yKHQpP3d0KHQsZSk6dCYmSChlLHQpfWZ1bmN0aW9uIHB0KHQsZSl7dmFyIG49VCgpLG89RSgpLGk9TygpO2Uuc2hvd0NvbmZpcm1CdXR0b258fGUuc2hvd0NhbmNlbEJ1dHRvbnx8aXQobiksTihuLGUsXCJhY3Rpb25zXCIpLHh0KG8sXCJjb25maXJtXCIsZSkseHQoaSxcImNhbmNlbFwiLGUpLGUuYnV0dG9uc1N0eWxpbmc/ZnVuY3Rpb24odCxlLG4pe210KFt0LGVdLFkuc3R5bGVkKSxuLmNvbmZpcm1CdXR0b25Db2xvciYmKHQuc3R5bGUuYmFja2dyb3VuZENvbG9yPW4uY29uZmlybUJ1dHRvbkNvbG9yKTtuLmNhbmNlbEJ1dHRvbkNvbG9yJiYoZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9bi5jYW5jZWxCdXR0b25Db2xvcik7e3ZhciBvO1IoKXx8KG89d2luZG93LmdldENvbXB1dGVkU3R5bGUodCkuZ2V0UHJvcGVydHlWYWx1ZShcImJhY2tncm91bmQtY29sb3JcIiksdC5zdHlsZS5ib3JkZXJMZWZ0Q29sb3I9byx0LnN0eWxlLmJvcmRlclJpZ2h0Q29sb3I9byl9fShvLGksZSk6KGh0KFtvLGldLFkuc3R5bGVkKSxvLnN0eWxlLmJhY2tncm91bmRDb2xvcj1vLnN0eWxlLmJvcmRlckxlZnRDb2xvcj1vLnN0eWxlLmJvcmRlclJpZ2h0Q29sb3I9XCJcIixpLnN0eWxlLmJhY2tncm91bmRDb2xvcj1pLnN0eWxlLmJvcmRlckxlZnRDb2xvcj1pLnN0eWxlLmJvcmRlclJpZ2h0Q29sb3I9XCJcIiksZS5yZXZlcnNlQnV0dG9ucyYmby5wYXJlbnROb2RlLmluc2VydEJlZm9yZShpLG8pfXZhciBmdCxtdD1mdW5jdGlvbih0LGUpe2V0KHQsZSwhMCl9LGh0PWZ1bmN0aW9uKHQsZSl7ZXQodCxlLCExKX0sZ3Q9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHQuY2hpbGROb2Rlcy5sZW5ndGg7bisrKWlmKEQodC5jaGlsZE5vZGVzW25dLGUpKXJldHVybiB0LmNoaWxkTm9kZXNbbl19LHZ0PWZ1bmN0aW9uKHQpe3JldHVybiEoIXR8fCEodC5vZmZzZXRXaWR0aHx8dC5vZmZzZXRIZWlnaHR8fHQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpKX0sYnQ9J1xcbiA8ZGl2IGFyaWEtbGFiZWxsZWRieT1cIicuY29uY2F0KFkudGl0bGUsJ1wiIGFyaWEtZGVzY3JpYmVkYnk9XCInKS5jb25jYXQoWS5jb250ZW50LCdcIiBjbGFzcz1cIicpLmNvbmNhdChZLnBvcHVwLCdcIiB0YWJpbmRleD1cIi0xXCI+XFxuICAgPGRpdiBjbGFzcz1cIicpLmNvbmNhdChZLmhlYWRlciwnXCI+XFxuICAgICA8dWwgY2xhc3M9XCInKS5jb25jYXQoWVtcInByb2dyZXNzLXN0ZXBzXCJdLCdcIj48L3VsPlxcbiAgICAgPGRpdiBjbGFzcz1cIicpLmNvbmNhdChZLmljb24sXCIgXCIpLmNvbmNhdChaLmVycm9yLCdcIj48L2Rpdj5cXG4gICAgIDxkaXYgY2xhc3M9XCInKS5jb25jYXQoWS5pY29uLFwiIFwiKS5jb25jYXQoWi5xdWVzdGlvbiwnXCI+PC9kaXY+XFxuICAgICA8ZGl2IGNsYXNzPVwiJykuY29uY2F0KFkuaWNvbixcIiBcIikuY29uY2F0KFoud2FybmluZywnXCI+PC9kaXY+XFxuICAgICA8ZGl2IGNsYXNzPVwiJykuY29uY2F0KFkuaWNvbixcIiBcIikuY29uY2F0KFouaW5mbywnXCI+PC9kaXY+XFxuICAgICA8ZGl2IGNsYXNzPVwiJykuY29uY2F0KFkuaWNvbixcIiBcIikuY29uY2F0KFouc3VjY2VzcywnXCI+PC9kaXY+XFxuICAgICA8aW1nIGNsYXNzPVwiJykuY29uY2F0KFkuaW1hZ2UsJ1wiIC8+XFxuICAgICA8aDIgY2xhc3M9XCInKS5jb25jYXQoWS50aXRsZSwnXCIgaWQ9XCInKS5jb25jYXQoWS50aXRsZSwnXCI+PC9oMj5cXG4gICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiJykuY29uY2F0KFkuY2xvc2UsJ1wiPjwvYnV0dG9uPlxcbiAgIDwvZGl2PlxcbiAgIDxkaXYgY2xhc3M9XCInKS5jb25jYXQoWS5jb250ZW50LCdcIj5cXG4gICAgIDxkaXYgaWQ9XCInKS5jb25jYXQoWS5jb250ZW50LCdcIiBjbGFzcz1cIicpLmNvbmNhdChZW1wiaHRtbC1jb250YWluZXJcIl0sJ1wiPjwvZGl2PlxcbiAgICAgPGlucHV0IGNsYXNzPVwiJykuY29uY2F0KFkuaW5wdXQsJ1wiIC8+XFxuICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBjbGFzcz1cIicpLmNvbmNhdChZLmZpbGUsJ1wiIC8+XFxuICAgICA8ZGl2IGNsYXNzPVwiJykuY29uY2F0KFkucmFuZ2UsJ1wiPlxcbiAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgLz5cXG4gICAgICAgPG91dHB1dD48L291dHB1dD5cXG4gICAgIDwvZGl2PlxcbiAgICAgPHNlbGVjdCBjbGFzcz1cIicpLmNvbmNhdChZLnNlbGVjdCwnXCI+PC9zZWxlY3Q+XFxuICAgICA8ZGl2IGNsYXNzPVwiJykuY29uY2F0KFkucmFkaW8sJ1wiPjwvZGl2PlxcbiAgICAgPGxhYmVsIGZvcj1cIicpLmNvbmNhdChZLmNoZWNrYm94LCdcIiBjbGFzcz1cIicpLmNvbmNhdChZLmNoZWNrYm94LCdcIj5cXG4gICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIC8+XFxuICAgICAgIDxzcGFuIGNsYXNzPVwiJykuY29uY2F0KFkubGFiZWwsJ1wiPjwvc3Bhbj5cXG4gICAgIDwvbGFiZWw+XFxuICAgICA8dGV4dGFyZWEgY2xhc3M9XCInKS5jb25jYXQoWS50ZXh0YXJlYSwnXCI+PC90ZXh0YXJlYT5cXG4gICAgIDxkaXYgY2xhc3M9XCInKS5jb25jYXQoWVtcInZhbGlkYXRpb24tbWVzc2FnZVwiXSwnXCIgaWQ9XCInKS5jb25jYXQoWVtcInZhbGlkYXRpb24tbWVzc2FnZVwiXSwnXCI+PC9kaXY+XFxuICAgPC9kaXY+XFxuICAgPGRpdiBjbGFzcz1cIicpLmNvbmNhdChZLmFjdGlvbnMsJ1wiPlxcbiAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCInKS5jb25jYXQoWS5jb25maXJtLCdcIj5PSzwvYnV0dG9uPlxcbiAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCInKS5jb25jYXQoWS5jYW5jZWwsJ1wiPkNhbmNlbDwvYnV0dG9uPlxcbiAgIDwvZGl2PlxcbiAgIDxkaXYgY2xhc3M9XCInKS5jb25jYXQoWS5mb290ZXIsJ1wiPjwvZGl2PlxcbiAgIDxkaXYgY2xhc3M9XCInKS5jb25jYXQoWVtcInRpbWVyLXByb2dyZXNzLWJhci1jb250YWluZXJcIl0sJ1wiPlxcbiAgICAgPGRpdiBjbGFzcz1cIicpLmNvbmNhdChZW1widGltZXItcHJvZ3Jlc3MtYmFyXCJdLCdcIj48L2Rpdj5cXG4gICA8L2Rpdj5cXG4gPC9kaXY+XFxuJykucmVwbGFjZSgvKF58XFxuKVxccyovZyxcIlwiKSx5dD1mdW5jdGlvbih0KXt2YXIgZSxuLG8saSxyLGEsYyxzLHUsbCxkLHAsZixtLGgsZz0hIShlPVEoKSkmJihlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSksaHQoW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCxkb2N1bWVudC5ib2R5XSxbWVtcIm5vLWJhY2tkcm9wXCJdLFlbXCJ0b2FzdC1zaG93blwiXSxZW1wiaGFzLWNvbHVtblwiXV0pLCEwKTt1dCgpP0YoXCJTd2VldEFsZXJ0MiByZXF1aXJlcyBkb2N1bWVudCB0byBpbml0aWFsaXplXCIpOigobj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKS5jbGFzc05hbWU9WS5jb250YWluZXIsZyYmbXQobixZW1wibm8tdHJhbnNpdGlvblwiXSksSChuLGJ0KSwobz1cInN0cmluZ1wiPT10eXBlb2YoaT10LnRhcmdldCk/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihpKTppKS5hcHBlbmRDaGlsZChuKSxyPXQsKGE9JCgpKS5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsci50b2FzdD9cImFsZXJ0XCI6XCJkaWFsb2dcIiksYS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxpdmVcIixyLnRvYXN0P1wicG9saXRlXCI6XCJhc3NlcnRpdmVcIiksci50b2FzdHx8YS5zZXRBdHRyaWJ1dGUoXCJhcmlhLW1vZGFsXCIsXCJ0cnVlXCIpLGM9byxcInJ0bFwiPT09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYykuZGlyZWN0aW9uJiZtdChRKCksWS5ydGwpLHM9UCgpLHU9Z3QocyxZLmlucHV0KSxsPWd0KHMsWS5maWxlKSxkPXMucXVlcnlTZWxlY3RvcihcIi5cIi5jb25jYXQoWS5yYW5nZSxcIiBpbnB1dFwiKSkscD1zLnF1ZXJ5U2VsZWN0b3IoXCIuXCIuY29uY2F0KFkucmFuZ2UsXCIgb3V0cHV0XCIpKSxmPWd0KHMsWS5zZWxlY3QpLG09cy5xdWVyeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChZLmNoZWNrYm94LFwiIGlucHV0XCIpKSxoPWd0KHMsWS50ZXh0YXJlYSksdS5vbmlucHV0PWx0LGwub25jaGFuZ2U9bHQsZi5vbmNoYW5nZT1sdCxtLm9uY2hhbmdlPWx0LGgub25pbnB1dD1sdCxkLm9uaW5wdXQ9ZnVuY3Rpb24odCl7bHQodCkscC52YWx1ZT1kLnZhbHVlfSxkLm9uY2hhbmdlPWZ1bmN0aW9uKHQpe2x0KHQpLGQubmV4dFNpYmxpbmcudmFsdWU9ZC52YWx1ZX0pfSx3dD1mdW5jdGlvbih0LGUpe3QuanF1ZXJ5P0N0KGUsdCk6SChlLHQudG9TdHJpbmcoKSl9LEN0PWZ1bmN0aW9uKHQsZSl7aWYodC50ZXh0Q29udGVudD1cIlwiLDAgaW4gZSlmb3IodmFyIG49MDtuIGluIGU7bisrKXQuYXBwZW5kQ2hpbGQoZVtuXS5jbG9uZU5vZGUoITApKTtlbHNlIHQuYXBwZW5kQ2hpbGQoZS5jbG9uZU5vZGUoITApKX0sa3Q9ZnVuY3Rpb24oKXtpZih1dCgpKXJldHVybiExO3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksZT17V2Via2l0QW5pbWF0aW9uOlwid2Via2l0QW5pbWF0aW9uRW5kXCIsT0FuaW1hdGlvbjpcIm9BbmltYXRpb25FbmQgb2FuaW1hdGlvbmVuZFwiLGFuaW1hdGlvbjpcImFuaW1hdGlvbmVuZFwifTtmb3IodmFyIG4gaW4gZSlpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmdm9pZCAwIT09dC5zdHlsZVtuXSlyZXR1cm4gZVtuXTtyZXR1cm4hMX0oKTtmdW5jdGlvbiB4dCh0LGUsbil7dmFyIG87cnQodCxuW1wic2hvd1wiLmNvbmNhdCgobz1lKS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStvLnNsaWNlKDEpLFwiQnV0dG9uXCIpXSxcImlubGluZS1ibG9ja1wiKSxIKHQsbltcIlwiLmNvbmNhdChlLFwiQnV0dG9uVGV4dFwiKV0pLHQuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLG5bXCJcIi5jb25jYXQoZSxcIkJ1dHRvbkFyaWFMYWJlbFwiKV0pLHQuY2xhc3NOYW1lPVlbZV0sTih0LG4sXCJcIi5jb25jYXQoZSxcIkJ1dHRvblwiKSksbXQodCxuW1wiXCIuY29uY2F0KGUsXCJCdXR0b25DbGFzc1wiKV0pfWZ1bmN0aW9uIFB0KHQsZSl7dmFyIG4sbyxpLHIsYSxjLHMsdSxsPVEoKTtsJiYobj1sLFwic3RyaW5nXCI9PXR5cGVvZihvPWUuYmFja2Ryb3ApP24uc3R5bGUuYmFja2dyb3VuZD1vOm98fG10KFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZG9jdW1lbnQuYm9keV0sWVtcIm5vLWJhY2tkcm9wXCJdKSwhZS5iYWNrZHJvcCYmZS5hbGxvd091dHNpZGVDbGljayYmXygnXCJhbGxvd091dHNpZGVDbGlja1wiIHBhcmFtZXRlciByZXF1aXJlcyBgYmFja2Ryb3BgIHBhcmFtZXRlciB0byBiZSBzZXQgdG8gYHRydWVgJyksaT1sLChyPWUucG9zaXRpb24paW4gWT9tdChpLFlbcl0pOihfKCdUaGUgXCJwb3NpdGlvblwiIHBhcmFtZXRlciBpcyBub3QgdmFsaWQsIGRlZmF1bHRpbmcgdG8gXCJjZW50ZXJcIicpLG10KGksWS5jZW50ZXIpKSxhPWwsIShjPWUuZ3Jvdyl8fFwic3RyaW5nXCIhPXR5cGVvZiBjfHwocz1cImdyb3ctXCIuY29uY2F0KGMpKWluIFkmJm10KGEsWVtzXSksTihsLGUsXCJjb250YWluZXJcIiksKHU9ZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXN3YWwyLXF1ZXVlLXN0ZXBcIikpJiYobC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXF1ZXVlLXN0ZXBcIix1KSxkb2N1bWVudC5ib2R5LnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtc3dhbDItcXVldWUtc3RlcFwiKSkpfWZ1bmN0aW9uIEF0KHQsZSl7dC5wbGFjZWhvbGRlciYmIWUuaW5wdXRQbGFjZWhvbGRlcnx8KHQucGxhY2Vob2xkZXI9ZS5pbnB1dFBsYWNlaG9sZGVyKX12YXIgQnQ9e3Byb21pc2U6bmV3IFdlYWtNYXAsaW5uZXJQYXJhbXM6bmV3IFdlYWtNYXAsZG9tQ2FjaGU6bmV3IFdlYWtNYXB9LFN0PVtcImlucHV0XCIsXCJmaWxlXCIsXCJyYW5nZVwiLFwic2VsZWN0XCIsXCJyYWRpb1wiLFwiY2hlY2tib3hcIixcInRleHRhcmVhXCJdLEV0PWZ1bmN0aW9uKHQpe2lmKCFJdFt0LmlucHV0XSlyZXR1cm4gRignVW5leHBlY3RlZCB0eXBlIG9mIGlucHV0ISBFeHBlY3RlZCBcInRleHRcIiwgXCJlbWFpbFwiLCBcInBhc3N3b3JkXCIsIFwibnVtYmVyXCIsIFwidGVsXCIsIFwic2VsZWN0XCIsIFwicmFkaW9cIiwgXCJjaGVja2JveFwiLCBcInRleHRhcmVhXCIsIFwiZmlsZVwiIG9yIFwidXJsXCIsIGdvdCBcIicuY29uY2F0KHQuaW5wdXQsJ1wiJykpO3ZhciBlPUx0KHQuaW5wdXQpLG49SXRbdC5pbnB1dF0oZSx0KTtvdChuKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHQobil9KX0sT3Q9ZnVuY3Rpb24odCxlKXt2YXIgbj1HKFAoKSx0KTtpZihuKWZvcih2YXIgbyBpbiFmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQuYXR0cmlidXRlcy5sZW5ndGg7ZSsrKXt2YXIgbj10LmF0dHJpYnV0ZXNbZV0ubmFtZTstMT09PVtcInR5cGVcIixcInZhbHVlXCIsXCJzdHlsZVwiXS5pbmRleE9mKG4pJiZ0LnJlbW92ZUF0dHJpYnV0ZShuKX19KG4pLGUpXCJyYW5nZVwiPT09dCYmXCJwbGFjZWhvbGRlclwiPT09b3x8bi5zZXRBdHRyaWJ1dGUobyxlW29dKX0sVHQ9ZnVuY3Rpb24odCl7dmFyIGU9THQodC5pbnB1dCk7dC5jdXN0b21DbGFzcyYmbXQoZSx0LmN1c3RvbUNsYXNzLmlucHV0KX0sTHQ9ZnVuY3Rpb24odCl7dmFyIGU9WVt0XT9ZW3RdOlkuaW5wdXQ7cmV0dXJuIGd0KFAoKSxlKX0sSXQ9e307SXQudGV4dD1JdC5lbWFpbD1JdC5wYXNzd29yZD1JdC5udW1iZXI9SXQudGVsPUl0LnVybD1mdW5jdGlvbih0LGUpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiBlLmlucHV0VmFsdWV8fFwibnVtYmVyXCI9PXR5cGVvZiBlLmlucHV0VmFsdWU/dC52YWx1ZT1lLmlucHV0VmFsdWU6eShlLmlucHV0VmFsdWUpfHxfKCdVbmV4cGVjdGVkIHR5cGUgb2YgaW5wdXRWYWx1ZSEgRXhwZWN0ZWQgXCJzdHJpbmdcIiwgXCJudW1iZXJcIiBvciBcIlByb21pc2VcIiwgZ290IFwiJy5jb25jYXQocihlLmlucHV0VmFsdWUpLCdcIicpKSxBdCh0LGUpLHQudHlwZT1lLmlucHV0LHR9LEl0LmZpbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gQXQodCxlKSx0fSxJdC5yYW5nZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQucXVlcnlTZWxlY3RvcihcImlucHV0XCIpLG89dC5xdWVyeVNlbGVjdG9yKFwib3V0cHV0XCIpO3JldHVybiBuLnZhbHVlPWUuaW5wdXRWYWx1ZSxuLnR5cGU9ZS5pbnB1dCxvLnZhbHVlPWUuaW5wdXRWYWx1ZSx0fSxJdC5zZWxlY3Q9ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gdC50ZXh0Q29udGVudD1cIlwiLGUuaW5wdXRQbGFjZWhvbGRlciYmKG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKSxIKG4sZS5pbnB1dFBsYWNlaG9sZGVyKSxuLnZhbHVlPVwiXCIsbi5kaXNhYmxlZD0hMCxuLnNlbGVjdGVkPSEwLHQuYXBwZW5kQ2hpbGQobikpLHR9LEl0LnJhZGlvPWZ1bmN0aW9uKHQpe3JldHVybiB0LnRleHRDb250ZW50PVwiXCIsdH0sSXQuY2hlY2tib3g9ZnVuY3Rpb24odCxlKXt2YXIgbj1HKFAoKSxcImNoZWNrYm94XCIpO24udmFsdWU9MSxuLmlkPVkuY2hlY2tib3gsbi5jaGVja2VkPUJvb2xlYW4oZS5pbnB1dFZhbHVlKTt2YXIgbz10LnF1ZXJ5U2VsZWN0b3IoXCJzcGFuXCIpO3JldHVybiBIKG8sZS5pbnB1dFBsYWNlaG9sZGVyKSx0fSxJdC50ZXh0YXJlYT1mdW5jdGlvbihlLHQpe3ZhciBuLG87cmV0dXJuIGUudmFsdWU9dC5pbnB1dFZhbHVlLEF0KGUsdCksXCJNdXRhdGlvbk9ic2VydmVyXCJpbiB3aW5kb3cmJihuPXBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCQoKSkud2lkdGgpLG89cGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoJCgpKS5wYWRkaW5nTGVmdCkrcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoJCgpKS5wYWRkaW5nUmlnaHQpLG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCl7dmFyIHQ9ZS5vZmZzZXRXaWR0aCtvOyQoKS5zdHlsZS53aWR0aD1uPHQ/XCJcIi5jb25jYXQodCxcInB4XCIpOm51bGx9KS5vYnNlcnZlKGUse2F0dHJpYnV0ZXM6ITAsYXR0cmlidXRlRmlsdGVyOltcInN0eWxlXCJdfSkpLGV9O2Z1bmN0aW9uIGp0KHQsZSl7dmFyIG4sbyxpLHIsYSxjPVAoKS5xdWVyeVNlbGVjdG9yKFwiI1wiLmNvbmNhdChZLmNvbnRlbnQpKTtlLmh0bWw/KGR0KGUuaHRtbCxjKSxvdChjLFwiYmxvY2tcIikpOmUudGV4dD8oYy50ZXh0Q29udGVudD1lLnRleHQsb3QoYyxcImJsb2NrXCIpKTppdChjKSxuPXQsbz1lLGk9UCgpLHI9QnQuaW5uZXJQYXJhbXMuZ2V0KG4pLGE9IXJ8fG8uaW5wdXQhPT1yLmlucHV0LFN0LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9WVt0XSxuPWd0KGksZSk7T3QodCxvLmlucHV0QXR0cmlidXRlcyksbi5jbGFzc05hbWU9ZSxhJiZpdChuKX0pLG8uaW5wdXQmJihhJiZFdChvKSxUdChvKSksTihQKCksZSxcImNvbnRlbnRcIil9ZnVuY3Rpb24gcXQoKXtyZXR1cm4gUSgpJiZRKCkuZ2V0QXR0cmlidXRlKFwiZGF0YS1xdWV1ZS1zdGVwXCIpfWZ1bmN0aW9uIFZ0KHQscyl7dmFyIHU9QigpO2lmKCFzLnByb2dyZXNzU3RlcHN8fDA9PT1zLnByb2dyZXNzU3RlcHMubGVuZ3RoKXJldHVybiBpdCh1KSwwO290KHUpLHUudGV4dENvbnRlbnQ9XCJcIjt2YXIgbD1wYXJzZUludCh2b2lkIDA9PT1zLmN1cnJlbnRQcm9ncmVzc1N0ZXA/cXQoKTpzLmN1cnJlbnRQcm9ncmVzc1N0ZXApO2w+PXMucHJvZ3Jlc3NTdGVwcy5sZW5ndGgmJl8oXCJJbnZhbGlkIGN1cnJlbnRQcm9ncmVzc1N0ZXAgcGFyYW1ldGVyLCBpdCBzaG91bGQgYmUgbGVzcyB0aGFuIHByb2dyZXNzU3RlcHMubGVuZ3RoIChjdXJyZW50UHJvZ3Jlc3NTdGVwIGxpa2UgSlMgYXJyYXlzIHN0YXJ0cyBmcm9tIDApXCIpLHMucHJvZ3Jlc3NTdGVwcy5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dmFyIG4sbyxpLHIsYSxjPShuPXQsbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlcIiksbXQobyxZW1wicHJvZ3Jlc3Mtc3RlcFwiXSksSChvLG4pLG8pO3UuYXBwZW5kQ2hpbGQoYyksZT09PWwmJm10KGMsWVtcImFjdGl2ZS1wcm9ncmVzcy1zdGVwXCJdKSxlIT09cy5wcm9ncmVzc1N0ZXBzLmxlbmd0aC0xJiYocj1zLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpXCIpLG10KGEsWVtcInByb2dyZXNzLXN0ZXAtbGluZVwiXSksci5wcm9ncmVzc1N0ZXBzRGlzdGFuY2UmJihhLnN0eWxlLndpZHRoPXIucHJvZ3Jlc3NTdGVwc0Rpc3RhbmNlKSxpPWEsdS5hcHBlbmRDaGlsZChpKSl9KX1mdW5jdGlvbiBNdCh0LGUpe3ZhciBuLG8saSxyLGEsYyxzLHUsbD1MKCk7TihsLGUsXCJoZWFkZXJcIiksVnQoMCxlKSxuPXQsbz1lLChyPUJ0LmlubmVyUGFyYW1zLmdldChuKSkmJm8uaWNvbj09PXIuaWNvbiYmaygpP04oaygpLG8sXCJpY29uXCIpOihEdCgpLG8uaWNvbiYmKC0xIT09T2JqZWN0LmtleXMoWikuaW5kZXhPZihvLmljb24pPyhpPUMoXCIuXCIuY29uY2F0KFkuaWNvbixcIi5cIikuY29uY2F0KFpbby5pY29uXSkpLG90KGkpLFV0KGksbyksTnQoKSxOKGksbyxcImljb25cIiksbXQoaSxvLnNob3dDbGFzcy5pY29uKSk6RignVW5rbm93biBpY29uISBFeHBlY3RlZCBcInN1Y2Nlc3NcIiwgXCJlcnJvclwiLCBcIndhcm5pbmdcIiwgXCJpbmZvXCIgb3IgXCJxdWVzdGlvblwiLCBnb3QgXCInLmNvbmNhdChvLmljb24sJ1wiJykpKSksZnVuY3Rpb24odCl7dmFyIGU9QSgpO2lmKCF0LmltYWdlVXJsKXJldHVybiBpdChlKTtvdChlLFwiXCIpLGUuc2V0QXR0cmlidXRlKFwic3JjXCIsdC5pbWFnZVVybCksZS5zZXRBdHRyaWJ1dGUoXCJhbHRcIix0LmltYWdlQWx0KSxudChlLFwid2lkdGhcIix0LmltYWdlV2lkdGgpLG50KGUsXCJoZWlnaHRcIix0LmltYWdlSGVpZ2h0KSxlLmNsYXNzTmFtZT1ZLmltYWdlLE4oZSx0LFwiaW1hZ2VcIil9KGUpLGE9ZSxjPXgoKSxydChjLGEudGl0bGV8fGEudGl0bGVUZXh0KSxhLnRpdGxlJiZkdChhLnRpdGxlLGMpLGEudGl0bGVUZXh0JiYoYy5pbm5lclRleHQ9YS50aXRsZVRleHQpLE4oYyxhLFwidGl0bGVcIikscz1lLHU9cSgpLEgodSxzLmNsb3NlQnV0dG9uSHRtbCksTih1LHMsXCJjbG9zZUJ1dHRvblwiKSxydCh1LHMuc2hvd0Nsb3NlQnV0dG9uKSx1LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIixzLmNsb3NlQnV0dG9uQXJpYUxhYmVsKX1mdW5jdGlvbiBSdCh0LGUpe3ZhciBuLG8saSxyO249ZSxvPSQoKSxudChvLFwid2lkdGhcIixuLndpZHRoKSxudChvLFwicGFkZGluZ1wiLG4ucGFkZGluZyksbi5iYWNrZ3JvdW5kJiYoby5zdHlsZS5iYWNrZ3JvdW5kPW4uYmFja2dyb3VuZCksenQobyxuKSxQdCgwLGUpLE10KHQsZSksanQodCxlKSxwdCgwLGUpLGk9ZSxyPUkoKSxydChyLGkuZm9vdGVyKSxpLmZvb3RlciYmZHQoaS5mb290ZXIsciksTihyLGksXCJmb290ZXJcIiksXCJmdW5jdGlvblwiPT10eXBlb2YgZS5vblJlbmRlciYmZS5vblJlbmRlcigkKCkpfWZ1bmN0aW9uIEh0KCl7cmV0dXJuIEUoKSYmRSgpLmNsaWNrKCl9dmFyIER0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW4oKSxlPTA7ZTx0Lmxlbmd0aDtlKyspaXQodFtlXSl9LE50PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PSQoKSxlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLmdldFByb3BlcnR5VmFsdWUoXCJiYWNrZ3JvdW5kLWNvbG9yXCIpLG49dC5xdWVyeVNlbGVjdG9yQWxsKFwiW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVdLCAuc3dhbDItc3VjY2Vzcy1maXhcIiksbz0wO288bi5sZW5ndGg7bysrKW5bb10uc3R5bGUuYmFja2dyb3VuZENvbG9yPWV9LFV0PWZ1bmN0aW9uKHQsZSl7dC50ZXh0Q29udGVudD1cIlwiLGUuaWNvbkh0bWw/SCh0LF90KGUuaWNvbkh0bWwpKTpcInN1Y2Nlc3NcIj09PWUuaWNvbj9IKHQsJ1xcbiAgICAgIDxkaXYgY2xhc3M9XCJzd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmUtbGVmdFwiPjwvZGl2PlxcbiAgICAgIDxzcGFuIGNsYXNzPVwic3dhbDItc3VjY2Vzcy1saW5lLXRpcFwiPjwvc3Bhbj4gPHNwYW4gY2xhc3M9XCJzd2FsMi1zdWNjZXNzLWxpbmUtbG9uZ1wiPjwvc3Bhbj5cXG4gICAgICA8ZGl2IGNsYXNzPVwic3dhbDItc3VjY2Vzcy1yaW5nXCI+PC9kaXY+IDxkaXYgY2xhc3M9XCJzd2FsMi1zdWNjZXNzLWZpeFwiPjwvZGl2PlxcbiAgICAgIDxkaXYgY2xhc3M9XCJzd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmUtcmlnaHRcIj48L2Rpdj5cXG4gICAgJyk6XCJlcnJvclwiPT09ZS5pY29uP0godCwnXFxuICAgICAgPHNwYW4gY2xhc3M9XCJzd2FsMi14LW1hcmtcIj5cXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3dhbDIteC1tYXJrLWxpbmUtbGVmdFwiPjwvc3Bhbj5cXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3dhbDIteC1tYXJrLWxpbmUtcmlnaHRcIj48L3NwYW4+XFxuICAgICAgPC9zcGFuPlxcbiAgICAnKTpIKHQsX3Qoe3F1ZXN0aW9uOlwiP1wiLHdhcm5pbmc6XCIhXCIsaW5mbzpcImlcIn1bZS5pY29uXSkpfSxfdD1mdW5jdGlvbih0KXtyZXR1cm4nPGRpdiBjbGFzcz1cIicuY29uY2F0KFlbXCJpY29uLWNvbnRlbnRcIl0sJ1wiPicpLmNvbmNhdCh0LFwiPC9kaXY+XCIpfSxGdD1bXSx6dD1mdW5jdGlvbih0LGUpe3QuY2xhc3NOYW1lPVwiXCIuY29uY2F0KFkucG9wdXAsXCIgXCIpLmNvbmNhdCh2dCh0KT9lLnNob3dDbGFzcy5wb3B1cDpcIlwiKSxlLnRvYXN0PyhtdChbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLFlbXCJ0b2FzdC1zaG93blwiXSksbXQodCxZLnRvYXN0KSk6bXQodCxZLm1vZGFsKSxOKHQsZSxcInBvcHVwXCIpLFwic3RyaW5nXCI9PXR5cGVvZiBlLmN1c3RvbUNsYXNzJiZtdCh0LGUuY3VzdG9tQ2xhc3MpLGUuaWNvbiYmbXQodCxZW1wiaWNvbi1cIi5jb25jYXQoZS5pY29uKV0pfTtmdW5jdGlvbiBXdCgpe3ZhciB0PSQoKTt0fHxsbi5maXJlKCksdD0kKCk7dmFyIGU9VCgpLG49RSgpO290KGUpLG90KG4sXCJpbmxpbmUtYmxvY2tcIiksbXQoW3QsZV0sWS5sb2FkaW5nKSxuLmRpc2FibGVkPSEwLHQuc2V0QXR0cmlidXRlKFwiZGF0YS1sb2FkaW5nXCIsITApLHQuc2V0QXR0cmlidXRlKFwiYXJpYS1idXN5XCIsITApLHQuZm9jdXMoKX1mdW5jdGlvbiBLdCgpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0KXt2YXIgZT13aW5kb3cuc2Nyb2xsWCxuPXdpbmRvdy5zY3JvbGxZO1h0LnJlc3RvcmVGb2N1c1RpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe1h0LnByZXZpb3VzQWN0aXZlRWxlbWVudCYmWHQucHJldmlvdXNBY3RpdmVFbGVtZW50LmZvY3VzPyhYdC5wcmV2aW91c0FjdGl2ZUVsZW1lbnQuZm9jdXMoKSxYdC5wcmV2aW91c0FjdGl2ZUVsZW1lbnQ9bnVsbCk6ZG9jdW1lbnQuYm9keSYmZG9jdW1lbnQuYm9keS5mb2N1cygpLHQoKX0sMTAwKSx2b2lkIDAhPT1lJiZ2b2lkIDAhPT1uJiZ3aW5kb3cuc2Nyb2xsVG8oZSxuKX0pfWZ1bmN0aW9uIFl0KCl7aWYoWHQudGltZW91dClyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD1qKCksZT1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS53aWR0aCk7dC5zdHlsZS5yZW1vdmVQcm9wZXJ0eShcInRyYW5zaXRpb25cIiksdC5zdHlsZS53aWR0aD1cIjEwMCVcIjt2YXIgbj1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS53aWR0aCksbz1wYXJzZUludChlL24qMTAwKTt0LnN0eWxlLnJlbW92ZVByb3BlcnR5KFwidHJhbnNpdGlvblwiKSx0LnN0eWxlLndpZHRoPVwiXCIuY29uY2F0KG8sXCIlXCIpfSgpLFh0LnRpbWVvdXQuc3RvcCgpfWZ1bmN0aW9uIFp0KCl7aWYoWHQudGltZW91dCl7dmFyIHQ9WHQudGltZW91dC5zdGFydCgpO3JldHVybiBzdCh0KSx0fX1mdW5jdGlvbiBRdCh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEd0LHQpfWZ1bmN0aW9uICR0KHQpe3JldHVybiBlZVt0XX1mdW5jdGlvbiBKdCh0KXtmb3IodmFyIGUgaW4gdClRdChpPWUpfHxfKCdVbmtub3duIHBhcmFtZXRlciBcIicuY29uY2F0KGksJ1wiJykpLHQudG9hc3QmJihvPWUsLTEhPT1uZS5pbmRleE9mKG8pJiZfKCdUaGUgcGFyYW1ldGVyIFwiJy5jb25jYXQobywnXCIgaXMgaW5jb21wYXRpYmxlIHdpdGggdG9hc3RzJykpKSwkdChuPWUpJiZnKG4sJHQobikpO3ZhciBuLG8saX12YXIgWHQ9e30sR3Q9e3RpdGxlOlwiXCIsdGl0bGVUZXh0OlwiXCIsdGV4dDpcIlwiLGh0bWw6XCJcIixmb290ZXI6XCJcIixpY29uOnZvaWQgMCxpY29uSHRtbDp2b2lkIDAsdG9hc3Q6ITEsYW5pbWF0aW9uOiEwLHNob3dDbGFzczp7cG9wdXA6XCJzd2FsMi1zaG93XCIsYmFja2Ryb3A6XCJzd2FsMi1iYWNrZHJvcC1zaG93XCIsaWNvbjpcInN3YWwyLWljb24tc2hvd1wifSxoaWRlQ2xhc3M6e3BvcHVwOlwic3dhbDItaGlkZVwiLGJhY2tkcm9wOlwic3dhbDItYmFja2Ryb3AtaGlkZVwiLGljb246XCJzd2FsMi1pY29uLWhpZGVcIn0sY3VzdG9tQ2xhc3M6dm9pZCAwLHRhcmdldDpcImJvZHlcIixiYWNrZHJvcDohMCxoZWlnaHRBdXRvOiEwLGFsbG93T3V0c2lkZUNsaWNrOiEwLGFsbG93RXNjYXBlS2V5OiEwLGFsbG93RW50ZXJLZXk6ITAsc3RvcEtleWRvd25Qcm9wYWdhdGlvbjohMCxrZXlkb3duTGlzdGVuZXJDYXB0dXJlOiExLHNob3dDb25maXJtQnV0dG9uOiEwLHNob3dDYW5jZWxCdXR0b246ITEscHJlQ29uZmlybTp2b2lkIDAsY29uZmlybUJ1dHRvblRleHQ6XCJPS1wiLGNvbmZpcm1CdXR0b25BcmlhTGFiZWw6XCJcIixjb25maXJtQnV0dG9uQ29sb3I6dm9pZCAwLGNhbmNlbEJ1dHRvblRleHQ6XCJDYW5jZWxcIixjYW5jZWxCdXR0b25BcmlhTGFiZWw6XCJcIixjYW5jZWxCdXR0b25Db2xvcjp2b2lkIDAsYnV0dG9uc1N0eWxpbmc6ITAscmV2ZXJzZUJ1dHRvbnM6ITEsZm9jdXNDb25maXJtOiEwLGZvY3VzQ2FuY2VsOiExLHNob3dDbG9zZUJ1dHRvbjohMSxjbG9zZUJ1dHRvbkh0bWw6XCImdGltZXM7XCIsY2xvc2VCdXR0b25BcmlhTGFiZWw6XCJDbG9zZSB0aGlzIGRpYWxvZ1wiLHNob3dMb2FkZXJPbkNvbmZpcm06ITEsaW1hZ2VVcmw6dm9pZCAwLGltYWdlV2lkdGg6dm9pZCAwLGltYWdlSGVpZ2h0OnZvaWQgMCxpbWFnZUFsdDpcIlwiLHRpbWVyOnZvaWQgMCx0aW1lclByb2dyZXNzQmFyOiExLHdpZHRoOnZvaWQgMCxwYWRkaW5nOnZvaWQgMCxiYWNrZ3JvdW5kOnZvaWQgMCxpbnB1dDp2b2lkIDAsaW5wdXRQbGFjZWhvbGRlcjpcIlwiLGlucHV0VmFsdWU6XCJcIixpbnB1dE9wdGlvbnM6e30saW5wdXRBdXRvVHJpbTohMCxpbnB1dEF0dHJpYnV0ZXM6e30saW5wdXRWYWxpZGF0b3I6dm9pZCAwLHZhbGlkYXRpb25NZXNzYWdlOnZvaWQgMCxncm93OiExLHBvc2l0aW9uOlwiY2VudGVyXCIscHJvZ3Jlc3NTdGVwczpbXSxjdXJyZW50UHJvZ3Jlc3NTdGVwOnZvaWQgMCxwcm9ncmVzc1N0ZXBzRGlzdGFuY2U6dm9pZCAwLG9uQmVmb3JlT3Blbjp2b2lkIDAsb25PcGVuOnZvaWQgMCxvblJlbmRlcjp2b2lkIDAsb25DbG9zZTp2b2lkIDAsb25BZnRlckNsb3NlOnZvaWQgMCxvbkRlc3Ryb3k6dm9pZCAwLHNjcm9sbGJhclBhZGRpbmc6ITB9LHRlPVtcImFsbG93RXNjYXBlS2V5XCIsXCJhbGxvd091dHNpZGVDbGlja1wiLFwiYnV0dG9uc1N0eWxpbmdcIixcImNhbmNlbEJ1dHRvbkFyaWFMYWJlbFwiLFwiY2FuY2VsQnV0dG9uQ29sb3JcIixcImNhbmNlbEJ1dHRvblRleHRcIixcImNsb3NlQnV0dG9uQXJpYUxhYmVsXCIsXCJjbG9zZUJ1dHRvbkh0bWxcIixcImNvbmZpcm1CdXR0b25BcmlhTGFiZWxcIixcImNvbmZpcm1CdXR0b25Db2xvclwiLFwiY29uZmlybUJ1dHRvblRleHRcIixcImN1cnJlbnRQcm9ncmVzc1N0ZXBcIixcImN1c3RvbUNsYXNzXCIsXCJmb290ZXJcIixcImhpZGVDbGFzc1wiLFwiaHRtbFwiLFwiaWNvblwiLFwiaW1hZ2VBbHRcIixcImltYWdlSGVpZ2h0XCIsXCJpbWFnZVVybFwiLFwiaW1hZ2VXaWR0aFwiLFwib25BZnRlckNsb3NlXCIsXCJvbkNsb3NlXCIsXCJvbkRlc3Ryb3lcIixcInByb2dyZXNzU3RlcHNcIixcInJldmVyc2VCdXR0b25zXCIsXCJzaG93Q2FuY2VsQnV0dG9uXCIsXCJzaG93Q2xvc2VCdXR0b25cIixcInNob3dDb25maXJtQnV0dG9uXCIsXCJ0ZXh0XCIsXCJ0aXRsZVwiLFwidGl0bGVUZXh0XCJdLGVlPXthbmltYXRpb246J3Nob3dDbGFzc1wiIGFuZCBcImhpZGVDbGFzcyd9LG5lPVtcImFsbG93T3V0c2lkZUNsaWNrXCIsXCJhbGxvd0VudGVyS2V5XCIsXCJiYWNrZHJvcFwiLFwiZm9jdXNDb25maXJtXCIsXCJmb2N1c0NhbmNlbFwiLFwiaGVpZ2h0QXV0b1wiLFwia2V5ZG93bkxpc3RlbmVyQ2FwdHVyZVwiXSxvZT1PYmplY3QuZnJlZXplKHtpc1ZhbGlkUGFyYW1ldGVyOlF0LGlzVXBkYXRhYmxlUGFyYW1ldGVyOmZ1bmN0aW9uKHQpe3JldHVybi0xIT09dGUuaW5kZXhPZih0KX0saXNEZXByZWNhdGVkUGFyYW1ldGVyOiR0LGFyZ3NUb1BhcmFtczpmdW5jdGlvbihvKXt2YXIgaT17fTtyZXR1cm5cIm9iamVjdFwiIT09cihvWzBdKXx8dyhvWzBdKT9bXCJ0aXRsZVwiLFwiaHRtbFwiLFwiaWNvblwiXS5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dmFyIG49b1tlXTtcInN0cmluZ1wiPT10eXBlb2Ygbnx8dyhuKT9pW3RdPW46dm9pZCAwIT09biYmRihcIlVuZXhwZWN0ZWQgdHlwZSBvZiBcIi5jb25jYXQodCwnISBFeHBlY3RlZCBcInN0cmluZ1wiIG9yIFwiRWxlbWVudFwiLCBnb3QgJykuY29uY2F0KHIobikpKX0pOnMoaSxvWzBdKSxpfSxpc1Zpc2libGU6ZnVuY3Rpb24oKXtyZXR1cm4gdnQoJCgpKX0sY2xpY2tDb25maXJtOkh0LGNsaWNrQ2FuY2VsOmZ1bmN0aW9uKCl7cmV0dXJuIE8oKSYmTygpLmNsaWNrKCl9LGdldENvbnRhaW5lcjpRLGdldFBvcHVwOiQsZ2V0VGl0bGU6eCxnZXRDb250ZW50OlAsZ2V0SHRtbENvbnRhaW5lcjpmdW5jdGlvbigpe3JldHVybiBlKFlbXCJodG1sLWNvbnRhaW5lclwiXSl9LGdldEltYWdlOkEsZ2V0SWNvbjprLGdldEljb25zOm4sZ2V0Q2xvc2VCdXR0b246cSxnZXRBY3Rpb25zOlQsZ2V0Q29uZmlybUJ1dHRvbjpFLGdldENhbmNlbEJ1dHRvbjpPLGdldEhlYWRlcjpMLGdldEZvb3RlcjpJLGdldFRpbWVyUHJvZ3Jlc3NCYXI6aixnZXRGb2N1c2FibGVFbGVtZW50czpWLGdldFZhbGlkYXRpb25NZXNzYWdlOlMsaXNMb2FkaW5nOlIsZmlyZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiBpKHRoaXMsZSl9LG1peGluOmZ1bmN0aW9uKHIpe3JldHVybiBmdW5jdGlvbih0KXshZnVuY3Rpb24odCxlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJmwodCxlKX0oaSx0KTt2YXIgbixvLGU9KG49aSxvPWQoKSxmdW5jdGlvbigpe3ZhciB0LGU9dShuKTtyZXR1cm4gcCh0aGlzLG8/KHQ9dSh0aGlzKS5jb25zdHJ1Y3RvcixSZWZsZWN0LmNvbnN0cnVjdChlLGFyZ3VtZW50cyx0KSk6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSk7ZnVuY3Rpb24gaSgpe3JldHVybiBhKHRoaXMsaSksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIGMoaSxbe2tleTpcIl9tYWluXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIGYodShpLnByb3RvdHlwZSksXCJfbWFpblwiLHRoaXMpLmNhbGwodGhpcyxzKHt9LHIsdCkpfX1dKSxpfSh0aGlzKX0scXVldWU6ZnVuY3Rpb24odCl7dmFyIHI9dGhpcztGdD10O2Z1bmN0aW9uIGEodCxlKXtGdD1bXSx0KGUpfXZhciBjPVtdO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihpKXshZnVuY3Rpb24gZShuLG8pe248RnQubGVuZ3RoPyhkb2N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZShcImRhdGEtc3dhbDItcXVldWUtc3RlcFwiLG4pLHIuZmlyZShGdFtuXSkudGhlbihmdW5jdGlvbih0KXt2b2lkIDAhPT10LnZhbHVlPyhjLnB1c2godC52YWx1ZSksZShuKzEsbykpOmEoaSx7ZGlzbWlzczp0LmRpc21pc3N9KX0pKTphKGkse3ZhbHVlOmN9KX0oMCl9KX0sZ2V0UXVldWVTdGVwOnF0LGluc2VydFF1ZXVlU3RlcDpmdW5jdGlvbih0LGUpe3JldHVybiBlJiZlPEZ0Lmxlbmd0aD9GdC5zcGxpY2UoZSwwLHQpOkZ0LnB1c2godCl9LGRlbGV0ZVF1ZXVlU3RlcDpmdW5jdGlvbih0KXt2b2lkIDAhPT1GdFt0XSYmRnQuc3BsaWNlKHQsMSl9LHNob3dMb2FkaW5nOld0LGVuYWJsZUxvYWRpbmc6V3QsZ2V0VGltZXJMZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIFh0LnRpbWVvdXQmJlh0LnRpbWVvdXQuZ2V0VGltZXJMZWZ0KCl9LHN0b3BUaW1lcjpZdCxyZXN1bWVUaW1lcjpadCx0b2dnbGVUaW1lcjpmdW5jdGlvbigpe3ZhciB0PVh0LnRpbWVvdXQ7cmV0dXJuIHQmJih0LnJ1bm5pbmc/WXQ6WnQpKCl9LGluY3JlYXNlVGltZXI6ZnVuY3Rpb24odCl7aWYoWHQudGltZW91dCl7dmFyIGU9WHQudGltZW91dC5pbmNyZWFzZSh0KTtyZXR1cm4gc3QoZSwhMCksZX19LGlzVGltZXJSdW5uaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIFh0LnRpbWVvdXQmJlh0LnRpbWVvdXQuaXNSdW5uaW5nKCl9fSk7ZnVuY3Rpb24gaWUoKXt2YXIgdCxlPUJ0LmlubmVyUGFyYW1zLmdldCh0aGlzKTtlJiYodD1CdC5kb21DYWNoZS5nZXQodGhpcyksZS5zaG93Q29uZmlybUJ1dHRvbnx8KGl0KHQuY29uZmlybUJ1dHRvbiksZS5zaG93Q2FuY2VsQnV0dG9ufHxpdCh0LmFjdGlvbnMpKSxodChbdC5wb3B1cCx0LmFjdGlvbnNdLFkubG9hZGluZyksdC5wb3B1cC5yZW1vdmVBdHRyaWJ1dGUoXCJhcmlhLWJ1c3lcIiksdC5wb3B1cC5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLWxvYWRpbmdcIiksdC5jb25maXJtQnV0dG9uLmRpc2FibGVkPSExLHQuY2FuY2VsQnV0dG9uLmRpc2FibGVkPSExKX1mdW5jdGlvbiByZSgpe251bGw9PT1YLnByZXZpb3VzQm9keVBhZGRpbmcmJmRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0PndpbmRvdy5pbm5lckhlaWdodCYmKFgucHJldmlvdXNCb2R5UGFkZGluZz1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZy1yaWdodFwiKSksZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ9XCJcIi5jb25jYXQoWC5wcmV2aW91c0JvZHlQYWRkaW5nK2Z1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTt0LmNsYXNzTmFtZT1ZW1wic2Nyb2xsYmFyLW1lYXN1cmVcIl0sZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KTt2YXIgZT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLXQuY2xpZW50V2lkdGg7cmV0dXJuIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodCksZX0oKSxcInB4XCIpKX1mdW5jdGlvbiBhZSgpe3JldHVybiEhd2luZG93Lk1TSW5wdXRNZXRob2RDb250ZXh0JiYhIWRvY3VtZW50LmRvY3VtZW50TW9kZX1mdW5jdGlvbiBjZSgpe3ZhciB0PVEoKSxlPSQoKTt0LnN0eWxlLnJlbW92ZVByb3BlcnR5KFwiYWxpZ24taXRlbXNcIiksZS5vZmZzZXRUb3A8MCYmKHQuc3R5bGUuYWxpZ25JdGVtcz1cImZsZXgtc3RhcnRcIil9dmFyIHNlPWZ1bmN0aW9uKCl7bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvKENyaU9TfEZ4aU9TfEVkZ2lPU3xZYUJyb3dzZXJ8VUNCcm93c2VyKS9pKXx8JCgpLnNjcm9sbEhlaWdodD53aW5kb3cuaW5uZXJIZWlnaHQtNDQmJihRKCkuc3R5bGUucGFkZGluZ0JvdHRvbT1cIlwiLmNvbmNhdCg0NCxcInB4XCIpKX0sdWU9ZnVuY3Rpb24oKXt2YXIgZSx0PVEoKTt0Lm9udG91Y2hzdGFydD1mdW5jdGlvbih0KXtlPWxlKHQudGFyZ2V0KX0sdC5vbnRvdWNobW92ZT1mdW5jdGlvbih0KXtlJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCkpfX0sbGU9ZnVuY3Rpb24odCl7dmFyIGU9USgpO3JldHVybiB0PT09ZXx8IShhdChlKXx8XCJJTlBVVFwiPT09dC50YWdOYW1lfHxhdChQKCkpJiZQKCkuY29udGFpbnModCkpfSxkZT17c3dhbFByb21pc2VSZXNvbHZlOm5ldyBXZWFrTWFwfTtmdW5jdGlvbiBwZSh0LGUsbixvKXt2YXIgaTtuP2hlKHQsbyk6KEt0KCkudGhlbihmdW5jdGlvbigpe3JldHVybiBoZSh0LG8pfSksWHQua2V5ZG93blRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLFh0LmtleWRvd25IYW5kbGVyLHtjYXB0dXJlOlh0LmtleWRvd25MaXN0ZW5lckNhcHR1cmV9KSxYdC5rZXlkb3duSGFuZGxlckFkZGVkPSExKSxlLnBhcmVudE5vZGUmJiFkb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZShcImRhdGEtc3dhbDItcXVldWUtc3RlcFwiKSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLE0oKSYmKG51bGwhPT1YLnByZXZpb3VzQm9keVBhZGRpbmcmJihkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD1cIlwiLmNvbmNhdChYLnByZXZpb3VzQm9keVBhZGRpbmcsXCJweFwiKSxYLnByZXZpb3VzQm9keVBhZGRpbmc9bnVsbCksRChkb2N1bWVudC5ib2R5LFkuaW9zZml4KSYmKGk9cGFyc2VJbnQoZG9jdW1lbnQuYm9keS5zdHlsZS50b3AsMTApLGh0KGRvY3VtZW50LmJvZHksWS5pb3NmaXgpLGRvY3VtZW50LmJvZHkuc3R5bGUudG9wPVwiXCIsZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A9LTEqaSksXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmYWUoKSYmd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIixjZSksaChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuaGFzQXR0cmlidXRlKFwiZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlblwiKT8odC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLHQuZ2V0QXR0cmlidXRlKFwiZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlblwiKSksdC5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLXByZXZpb3VzLWFyaWEtaGlkZGVuXCIpKTp0LnJlbW92ZUF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpfSkpLGh0KFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZG9jdW1lbnQuYm9keV0sW1kuc2hvd24sWVtcImhlaWdodC1hdXRvXCJdLFlbXCJuby1iYWNrZHJvcFwiXSxZW1widG9hc3Qtc2hvd25cIl0sWVtcInRvYXN0LWNvbHVtblwiXV0pfWZ1bmN0aW9uIGZlKHQpe3ZhciBlLG4sbyxpPSQoKTtpJiYoZT1CdC5pbm5lclBhcmFtcy5nZXQodGhpcykpJiYhRChpLGUuaGlkZUNsYXNzLnBvcHVwKSYmKG49ZGUuc3dhbFByb21pc2VSZXNvbHZlLmdldCh0aGlzKSxodChpLGUuc2hvd0NsYXNzLnBvcHVwKSxtdChpLGUuaGlkZUNsYXNzLnBvcHVwKSxvPVEoKSxodChvLGUuc2hvd0NsYXNzLmJhY2tkcm9wKSxtdChvLGUuaGlkZUNsYXNzLmJhY2tkcm9wKSxmdW5jdGlvbih0LGUsbil7dmFyIG89USgpLGk9a3QmJmN0KGUpLHI9bi5vbkNsb3NlLGE9bi5vbkFmdGVyQ2xvc2U7aWYociE9PW51bGwmJnR5cGVvZiByPT09XCJmdW5jdGlvblwiKXtyKGUpfWlmKGkpe21lKHQsZSxvLGEpfWVsc2V7cGUodCxvLEooKSxhKX19KHRoaXMsaSxlKSx2b2lkIDAhPT10Pyh0LmlzRGlzbWlzc2VkPXZvaWQgMCE9PXQuZGlzbWlzcyx0LmlzQ29uZmlybWVkPXZvaWQgMD09PXQuZGlzbWlzcyk6dD17aXNEaXNtaXNzZWQ6ITAsaXNDb25maXJtZWQ6ITF9LG4odHx8e30pKX12YXIgbWU9ZnVuY3Rpb24odCxlLG4sbyl7WHQuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrPXBlLmJpbmQobnVsbCx0LG4sSigpLG8pLGUuYWRkRXZlbnRMaXN0ZW5lcihrdCxmdW5jdGlvbih0KXt0LnRhcmdldD09PWUmJihYdC5zd2FsQ2xvc2VFdmVudEZpbmlzaGVkQ2FsbGJhY2soKSxkZWxldGUgWHQuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrKX0pfSxoZT1mdW5jdGlvbih0LGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBlJiZlKCksdC5fZGVzdHJveSgpfSl9O2Z1bmN0aW9uIGdlKHQsZSxuKXt2YXIgbz1CdC5kb21DYWNoZS5nZXQodCk7ZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe29bdF0uZGlzYWJsZWQ9bn0pfWZ1bmN0aW9uIHZlKHQsZSl7aWYoIXQpcmV0dXJuITE7aWYoXCJyYWRpb1wiPT09dC50eXBlKWZvcih2YXIgbj10LnBhcmVudE5vZGUucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRcIiksbz0wO288bi5sZW5ndGg7bysrKW5bb10uZGlzYWJsZWQ9ZTtlbHNlIHQuZGlzYWJsZWQ9ZX12YXIgYmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHQsZSl7YSh0aGlzLG4pLHRoaXMuY2FsbGJhY2s9dCx0aGlzLnJlbWFpbmluZz1lLHRoaXMucnVubmluZz0hMSx0aGlzLnN0YXJ0KCl9cmV0dXJuIGMobixbe2tleTpcInN0YXJ0XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ydW5uaW5nfHwodGhpcy5ydW5uaW5nPSEwLHRoaXMuc3RhcnRlZD1uZXcgRGF0ZSx0aGlzLmlkPXNldFRpbWVvdXQodGhpcy5jYWxsYmFjayx0aGlzLnJlbWFpbmluZykpLHRoaXMucmVtYWluaW5nfX0se2tleTpcInN0b3BcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJ1bm5pbmcmJih0aGlzLnJ1bm5pbmc9ITEsY2xlYXJUaW1lb3V0KHRoaXMuaWQpLHRoaXMucmVtYWluaW5nLT1uZXcgRGF0ZS10aGlzLnN0YXJ0ZWQpLHRoaXMucmVtYWluaW5nfX0se2tleTpcImluY3JlYXNlXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ydW5uaW5nO3JldHVybiBlJiZ0aGlzLnN0b3AoKSx0aGlzLnJlbWFpbmluZys9dCxlJiZ0aGlzLnN0YXJ0KCksdGhpcy5yZW1haW5pbmd9fSx7a2V5OlwiZ2V0VGltZXJMZWZ0XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ydW5uaW5nJiYodGhpcy5zdG9wKCksdGhpcy5zdGFydCgpKSx0aGlzLnJlbWFpbmluZ319LHtrZXk6XCJpc1J1bm5pbmdcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJ1bm5pbmd9fV0pLG59KCkseWU9e2VtYWlsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuL15bYS16QS1aMC05LitfLV0rQFthLXpBLVowLTkuLV0rXFwuW2EtekEtWjAtOS1dezIsMjR9JC8udGVzdCh0KT9Qcm9taXNlLnJlc29sdmUoKTpQcm9taXNlLnJlc29sdmUoZXx8XCJJbnZhbGlkIGVtYWlsIGFkZHJlc3NcIil9LHVybDpmdW5jdGlvbih0LGUpe3JldHVybi9eaHR0cHM/OlxcL1xcLyh3d3dcXC4pP1stYS16QS1aMC05QDolLl8rfiM9XXsxLDI1Nn1cXC5bYS16XXsyLDYzfVxcYihbLWEtekEtWjAtOUA6JV8rLn4jPyYvPV0qKSQvLnRlc3QodCk/UHJvbWlzZS5yZXNvbHZlKCk6UHJvbWlzZS5yZXNvbHZlKGV8fFwiSW52YWxpZCBVUkxcIil9fTtmdW5jdGlvbiB3ZSh0KXt2YXIgZSxuOyhlPXQpLmlucHV0VmFsaWRhdG9yfHxPYmplY3Qua2V5cyh5ZSkuZm9yRWFjaChmdW5jdGlvbih0KXtlLmlucHV0PT09dCYmKGUuaW5wdXRWYWxpZGF0b3I9eWVbdF0pfSksdC5zaG93TG9hZGVyT25Db25maXJtJiYhdC5wcmVDb25maXJtJiZfKFwic2hvd0xvYWRlck9uQ29uZmlybSBpcyBzZXQgdG8gdHJ1ZSwgYnV0IHByZUNvbmZpcm0gaXMgbm90IGRlZmluZWQuXFxuc2hvd0xvYWRlck9uQ29uZmlybSBzaG91bGQgYmUgdXNlZCB0b2dldGhlciB3aXRoIHByZUNvbmZpcm0sIHNlZSB1c2FnZSBleGFtcGxlOlxcbmh0dHBzOi8vc3dlZXRhbGVydDIuZ2l0aHViLmlvLyNhamF4LXJlcXVlc3RcIiksdC5hbmltYXRpb249Vyh0LmFuaW1hdGlvbiksKG49dCkudGFyZ2V0JiYoXCJzdHJpbmdcIiE9dHlwZW9mIG4udGFyZ2V0fHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG4udGFyZ2V0KSkmJihcInN0cmluZ1wiPT10eXBlb2Ygbi50YXJnZXR8fG4udGFyZ2V0LmFwcGVuZENoaWxkKXx8KF8oJ1RhcmdldCBwYXJhbWV0ZXIgaXMgbm90IHZhbGlkLCBkZWZhdWx0aW5nIHRvIFwiYm9keVwiJyksbi50YXJnZXQ9XCJib2R5XCIpLFwic3RyaW5nXCI9PXR5cGVvZiB0LnRpdGxlJiYodC50aXRsZT10LnRpdGxlLnNwbGl0KFwiXFxuXCIpLmpvaW4oXCI8YnIgLz5cIikpLHl0KHQpfWZ1bmN0aW9uIENlKHQpe3ZhciBlPVEoKSxuPSQoKTtcImZ1bmN0aW9uXCI9PXR5cGVvZiB0Lm9uQmVmb3JlT3BlbiYmdC5vbkJlZm9yZU9wZW4obik7dmFyIG89d2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkub3ZlcmZsb3dZO0llKGUsbix0KSxUZShlLG4pLE0oKSYmKExlKGUsdC5zY3JvbGxiYXJQYWRkaW5nLG8pLGgoZG9jdW1lbnQuYm9keS5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih0KXt0PT09USgpfHxmdW5jdGlvbih0LGUpe2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHQuY29udGFpbnMpcmV0dXJuIHQuY29udGFpbnMoZSl9KHQsUSgpKXx8KHQuaGFzQXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikmJnQuc2V0QXR0cmlidXRlKFwiZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlblwiLHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikpLHQuc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIikpfSkpLEooKXx8WHQucHJldmlvdXNBY3RpdmVFbGVtZW50fHwoWHQucHJldmlvdXNBY3RpdmVFbGVtZW50PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLFwiZnVuY3Rpb25cIj09dHlwZW9mIHQub25PcGVuJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIHQub25PcGVuKG4pfSksaHQoZSxZW1wibm8tdHJhbnNpdGlvblwiXSl9ZnVuY3Rpb24ga2UodCl7dmFyIGUsbj0kKCk7dC50YXJnZXQ9PT1uJiYoZT1RKCksbi5yZW1vdmVFdmVudExpc3RlbmVyKGt0LGtlKSxlLnN0eWxlLm92ZXJmbG93WT1cImF1dG9cIil9ZnVuY3Rpb24geGUodCxlKXtcInNlbGVjdFwiPT09ZS5pbnB1dHx8XCJyYWRpb1wiPT09ZS5pbnB1dD9NZSh0LGUpOi0xIT09W1widGV4dFwiLFwiZW1haWxcIixcIm51bWJlclwiLFwidGVsXCIsXCJ0ZXh0YXJlYVwiXS5pbmRleE9mKGUuaW5wdXQpJiYodihlLmlucHV0VmFsdWUpfHx5KGUuaW5wdXRWYWx1ZSkpJiZSZSh0LGUpfWZ1bmN0aW9uIFBlKHQsZSl7dC5kaXNhYmxlQnV0dG9ucygpLGUuaW5wdXQ/TmUodCxlKTpVZSh0LGUsITApfWZ1bmN0aW9uIEFlKHQsZSl7dC5kaXNhYmxlQnV0dG9ucygpLGUoSy5jYW5jZWwpfWZ1bmN0aW9uIEJlKHQsZSl7dC5jbG9zZVBvcHVwKHt2YWx1ZTplfSl9ZnVuY3Rpb24gU2UoZSx0LG4sbyl7dC5rZXlkb3duVGFyZ2V0JiZ0LmtleWRvd25IYW5kbGVyQWRkZWQmJih0LmtleWRvd25UYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIix0LmtleWRvd25IYW5kbGVyLHtjYXB0dXJlOnQua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZX0pLHQua2V5ZG93bkhhbmRsZXJBZGRlZD0hMSksbi50b2FzdHx8KHQua2V5ZG93bkhhbmRsZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHplKGUsdCxvKX0sdC5rZXlkb3duVGFyZ2V0PW4ua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZT93aW5kb3c6JCgpLHQua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZT1uLmtleWRvd25MaXN0ZW5lckNhcHR1cmUsdC5rZXlkb3duVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsdC5rZXlkb3duSGFuZGxlcix7Y2FwdHVyZTp0LmtleWRvd25MaXN0ZW5lckNhcHR1cmV9KSx0LmtleWRvd25IYW5kbGVyQWRkZWQ9ITApfWZ1bmN0aW9uIEVlKHQsZSxuKXt2YXIgbz1WKCksaT0wO2lmKGk8by5sZW5ndGgpcmV0dXJuKGUrPW4pPT09by5sZW5ndGg/ZT0wOi0xPT09ZSYmKGU9by5sZW5ndGgtMSksb1tlXS5mb2N1cygpOyQoKS5mb2N1cygpfWZ1bmN0aW9uIE9lKHQsZSxuKXtCdC5pbm5lclBhcmFtcy5nZXQodCkudG9hc3Q/UWUodCxlLG4pOihKZShlKSxYZShlKSxHZSh0LGUsbikpfXZhciBUZT1mdW5jdGlvbih0LGUpe2t0JiZjdChlKT8odC5zdHlsZS5vdmVyZmxvd1k9XCJoaWRkZW5cIixlLmFkZEV2ZW50TGlzdGVuZXIoa3Qsa2UpKTp0LnN0eWxlLm92ZXJmbG93WT1cImF1dG9cIn0sTGU9ZnVuY3Rpb24odCxlLG4pe3ZhciBvOygvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmIXdpbmRvdy5NU1N0cmVhbXx8XCJNYWNJbnRlbFwiPT09bmF2aWdhdG9yLnBsYXRmb3JtJiYxPG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cykmJiFEKGRvY3VtZW50LmJvZHksWS5pb3NmaXgpJiYobz1kb2N1bWVudC5ib2R5LnNjcm9sbFRvcCxkb2N1bWVudC5ib2R5LnN0eWxlLnRvcD1cIlwiLmNvbmNhdCgtMSpvLFwicHhcIiksbXQoZG9jdW1lbnQuYm9keSxZLmlvc2ZpeCksdWUoKSxzZSgpKSxcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZhZSgpJiYoY2UoKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLGNlKSksZSYmXCJoaWRkZW5cIiE9PW4mJnJlKCksc2V0VGltZW91dChmdW5jdGlvbigpe3Quc2Nyb2xsVG9wPTB9KX0sSWU9ZnVuY3Rpb24odCxlLG4pe210KHQsbi5zaG93Q2xhc3MuYmFja2Ryb3ApLG90KGUpLG10KGUsbi5zaG93Q2xhc3MucG9wdXApLG10KFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZG9jdW1lbnQuYm9keV0sWS5zaG93biksbi5oZWlnaHRBdXRvJiZuLmJhY2tkcm9wJiYhbi50b2FzdCYmbXQoW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCxkb2N1bWVudC5ib2R5XSxZW1wiaGVpZ2h0LWF1dG9cIl0pfSxqZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5jaGVja2VkPzE6MH0scWU9ZnVuY3Rpb24odCl7cmV0dXJuIHQuY2hlY2tlZD90LnZhbHVlOm51bGx9LFZlPWZ1bmN0aW9uKHQpe3JldHVybiB0LmZpbGVzLmxlbmd0aD9udWxsIT09dC5nZXRBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKT90LmZpbGVzOnQuZmlsZXNbMF06bnVsbH0sTWU9ZnVuY3Rpb24oZSxuKXtmdW5jdGlvbiBvKHQpe3JldHVybiBIZVtuLmlucHV0XShpLERlKHQpLG4pfXZhciBpPVAoKTt2KG4uaW5wdXRPcHRpb25zKXx8eShuLmlucHV0T3B0aW9ucyk/KFd0KCksYihuLmlucHV0T3B0aW9ucykudGhlbihmdW5jdGlvbih0KXtlLmhpZGVMb2FkaW5nKCksbyh0KX0pKTpcIm9iamVjdFwiPT09cihuLmlucHV0T3B0aW9ucyk/byhuLmlucHV0T3B0aW9ucyk6RihcIlVuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dE9wdGlvbnMhIEV4cGVjdGVkIG9iamVjdCwgTWFwIG9yIFByb21pc2UsIGdvdCBcIi5jb25jYXQocihuLmlucHV0T3B0aW9ucykpKX0sUmU9ZnVuY3Rpb24oZSxuKXt2YXIgbz1lLmdldElucHV0KCk7aXQobyksYihuLmlucHV0VmFsdWUpLnRoZW4oZnVuY3Rpb24odCl7by52YWx1ZT1cIm51bWJlclwiPT09bi5pbnB1dD9wYXJzZUZsb2F0KHQpfHwwOlwiXCIuY29uY2F0KHQpLG90KG8pLG8uZm9jdXMoKSxlLmhpZGVMb2FkaW5nKCl9KS5jYXRjaChmdW5jdGlvbih0KXtGKFwiRXJyb3IgaW4gaW5wdXRWYWx1ZSBwcm9taXNlOiBcIi5jb25jYXQodCkpLG8udmFsdWU9XCJcIixvdChvKSxvLmZvY3VzKCksZS5oaWRlTG9hZGluZygpfSl9LEhlPXtzZWxlY3Q6ZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIHIodCxlLG4pe3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7by52YWx1ZT1uLEgobyxlKSxpLmlucHV0VmFsdWUudG9TdHJpbmcoKT09PW4udG9TdHJpbmcoKSYmKG8uc2VsZWN0ZWQ9ITApLHQuYXBwZW5kQ2hpbGQobyl9dmFyIGE9Z3QodCxZLnNlbGVjdCk7ZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlLG49dFswXSxvPXRbMV07QXJyYXkuaXNBcnJheShvKT8oKGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGdyb3VwXCIpKS5sYWJlbD1uLGUuZGlzYWJsZWQ9ITEsYS5hcHBlbmRDaGlsZChlKSxvLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHIoZSx0WzFdLHRbMF0pfSkpOnIoYSxvLG4pfSksYS5mb2N1cygpfSxyYWRpbzpmdW5jdGlvbih0LGUsYSl7dmFyIGM9Z3QodCxZLnJhZGlvKTtlLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dFswXSxuPXRbMV0sbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiksaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIik7by50eXBlPVwicmFkaW9cIixvLm5hbWU9WS5yYWRpbyxvLnZhbHVlPWUsYS5pbnB1dFZhbHVlLnRvU3RyaW5nKCk9PT1lLnRvU3RyaW5nKCkmJihvLmNoZWNrZWQ9ITApO3ZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO0gocixuKSxyLmNsYXNzTmFtZT1ZLmxhYmVsLGkuYXBwZW5kQ2hpbGQobyksaS5hcHBlbmRDaGlsZChyKSxjLmFwcGVuZENoaWxkKGkpfSk7dmFyIG49Yy5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRcIik7bi5sZW5ndGgmJm5bMF0uZm9jdXMoKX19LERlPWZ1bmN0aW9uIG8obil7dmFyIGk9W107cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIE1hcCYmbiBpbnN0YW5jZW9mIE1hcD9uLmZvckVhY2goZnVuY3Rpb24odCxlKXt2YXIgbj10O1wib2JqZWN0XCI9PT1yKG4pJiYobj1vKG4pKSxpLnB1c2goW2Usbl0pfSk6T2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT1uW3RdO1wib2JqZWN0XCI9PT1yKGUpJiYoZT1vKGUpKSxpLnB1c2goW3QsZV0pfSksaX0sTmU9ZnVuY3Rpb24oZSxuKXt2YXIgbz1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0SW5wdXQoKTtpZighbilyZXR1cm4gbnVsbDtzd2l0Y2goZS5pbnB1dCl7Y2FzZVwiY2hlY2tib3hcIjpyZXR1cm4gamUobik7Y2FzZVwicmFkaW9cIjpyZXR1cm4gcWUobik7Y2FzZVwiZmlsZVwiOnJldHVybiBWZShuKTtkZWZhdWx0OnJldHVybiBlLmlucHV0QXV0b1RyaW0/bi52YWx1ZS50cmltKCk6bi52YWx1ZX19KGUsbik7bi5pbnB1dFZhbGlkYXRvcj8oZS5kaXNhYmxlSW5wdXQoKSxQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGIobi5pbnB1dFZhbGlkYXRvcihvLG4udmFsaWRhdGlvbk1lc3NhZ2UpKX0pLnRoZW4oZnVuY3Rpb24odCl7ZS5lbmFibGVCdXR0b25zKCksZS5lbmFibGVJbnB1dCgpLHQ/ZS5zaG93VmFsaWRhdGlvbk1lc3NhZ2UodCk6VWUoZSxuLG8pfSkpOmUuZ2V0SW5wdXQoKS5jaGVja1ZhbGlkaXR5KCk/VWUoZSxuLG8pOihlLmVuYWJsZUJ1dHRvbnMoKSxlLnNob3dWYWxpZGF0aW9uTWVzc2FnZShuLnZhbGlkYXRpb25NZXNzYWdlKSl9LFVlPWZ1bmN0aW9uKGUsdCxuKXt0LnNob3dMb2FkZXJPbkNvbmZpcm0mJld0KCksdC5wcmVDb25maXJtPyhlLnJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UoKSxQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGIodC5wcmVDb25maXJtKG4sdC52YWxpZGF0aW9uTWVzc2FnZSkpfSkudGhlbihmdW5jdGlvbih0KXt2dChTKCkpfHwhMT09PXQ/ZS5oaWRlTG9hZGluZygpOkJlKGUsdm9pZCAwPT09dD9uOnQpfSkpOkJlKGUsbil9LF9lPVtcIkFycm93TGVmdFwiLFwiQXJyb3dSaWdodFwiLFwiQXJyb3dVcFwiLFwiQXJyb3dEb3duXCIsXCJMZWZ0XCIsXCJSaWdodFwiLFwiVXBcIixcIkRvd25cIl0sRmU9W1wiRXNjYXBlXCIsXCJFc2NcIl0semU9ZnVuY3Rpb24odCxlLG4pe3ZhciBvPUJ0LmlubmVyUGFyYW1zLmdldCh0KTtvLnN0b3BLZXlkb3duUHJvcGFnYXRpb24mJmUuc3RvcFByb3BhZ2F0aW9uKCksXCJFbnRlclwiPT09ZS5rZXk/V2UodCxlLG8pOlwiVGFiXCI9PT1lLmtleT9LZShlLG8pOi0xIT09X2UuaW5kZXhPZihlLmtleSk/WWUoKTotMSE9PUZlLmluZGV4T2YoZS5rZXkpJiZaZShlLG8sbil9LFdlPWZ1bmN0aW9uKHQsZSxuKXtpZighZS5pc0NvbXBvc2luZyYmZS50YXJnZXQmJnQuZ2V0SW5wdXQoKSYmZS50YXJnZXQub3V0ZXJIVE1MPT09dC5nZXRJbnB1dCgpLm91dGVySFRNTCl7aWYoLTEhPT1bXCJ0ZXh0YXJlYVwiLFwiZmlsZVwiXS5pbmRleE9mKG4uaW5wdXQpKXJldHVybjtIdCgpLGUucHJldmVudERlZmF1bHQoKX19LEtlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LnRhcmdldCxuPVYoKSxvPS0xLGk9MDtpPG4ubGVuZ3RoO2krKylpZihlPT09bltpXSl7bz1pO2JyZWFrfXQuc2hpZnRLZXk/RWUoMCxvLC0xKTpFZSgwLG8sMSksdC5zdG9wUHJvcGFnYXRpb24oKSx0LnByZXZlbnREZWZhdWx0KCl9LFllPWZ1bmN0aW9uKCl7dmFyIHQ9RSgpLGU9TygpO2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT10JiZ2dChlKT9lLmZvY3VzKCk6ZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PWUmJnZ0KHQpJiZ0LmZvY3VzKCl9LFplPWZ1bmN0aW9uKHQsZSxuKXtXKGUuYWxsb3dFc2NhcGVLZXkpJiYodC5wcmV2ZW50RGVmYXVsdCgpLG4oSy5lc2MpKX0sUWU9ZnVuY3Rpb24oZSx0LG4pe3QucG9wdXAub25jbGljaz1mdW5jdGlvbigpe3ZhciB0PUJ0LmlubmVyUGFyYW1zLmdldChlKTt0LnNob3dDb25maXJtQnV0dG9ufHx0LnNob3dDYW5jZWxCdXR0b258fHQuc2hvd0Nsb3NlQnV0dG9ufHx0LmlucHV0fHxuKEsuY2xvc2UpfX0sJGU9ITEsSmU9ZnVuY3Rpb24oZSl7ZS5wb3B1cC5vbm1vdXNlZG93bj1mdW5jdGlvbigpe2UuY29udGFpbmVyLm9ubW91c2V1cD1mdW5jdGlvbih0KXtlLmNvbnRhaW5lci5vbm1vdXNldXA9dm9pZCAwLHQudGFyZ2V0PT09ZS5jb250YWluZXImJigkZT0hMCl9fX0sWGU9ZnVuY3Rpb24oZSl7ZS5jb250YWluZXIub25tb3VzZWRvd249ZnVuY3Rpb24oKXtlLnBvcHVwLm9ubW91c2V1cD1mdW5jdGlvbih0KXtlLnBvcHVwLm9ubW91c2V1cD12b2lkIDAsdC50YXJnZXQhPT1lLnBvcHVwJiYhZS5wb3B1cC5jb250YWlucyh0LnRhcmdldCl8fCgkZT0hMCl9fX0sR2U9ZnVuY3Rpb24obixvLGkpe28uY29udGFpbmVyLm9uY2xpY2s9ZnVuY3Rpb24odCl7dmFyIGU9QnQuaW5uZXJQYXJhbXMuZ2V0KG4pOyRlPyRlPSExOnQudGFyZ2V0PT09by5jb250YWluZXImJlcoZS5hbGxvd091dHNpZGVDbGljaykmJmkoSy5iYWNrZHJvcCl9fTt2YXIgdG49ZnVuY3Rpb24odCxlLG4pe3ZhciBvPWooKTtpdChvKSxlLnRpbWVyJiYodC50aW1lb3V0PW5ldyBiZShmdW5jdGlvbigpe24oXCJ0aW1lclwiKSxkZWxldGUgdC50aW1lb3V0fSxlLnRpbWVyKSxlLnRpbWVyUHJvZ3Jlc3NCYXImJihvdChvKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC50aW1lb3V0LnJ1bm5pbmcmJnN0KGUudGltZXIpfSkpKX0sZW49ZnVuY3Rpb24odCxlKXtpZighZS50b2FzdClyZXR1cm4gVyhlLmFsbG93RW50ZXJLZXkpP2UuZm9jdXNDYW5jZWwmJnZ0KHQuY2FuY2VsQnV0dG9uKT90LmNhbmNlbEJ1dHRvbi5mb2N1cygpOmUuZm9jdXNDb25maXJtJiZ2dCh0LmNvbmZpcm1CdXR0b24pP3QuY29uZmlybUJ1dHRvbi5mb2N1cygpOnZvaWQgRWUoMCwtMSwxKTpubigpfSxubj1mdW5jdGlvbigpe2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1ciYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyKCl9O3ZhciBvbixybixhbixjbj1mdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdCl0W2VdPW5ldyBXZWFrTWFwfSxzbj1PYmplY3QuZnJlZXplKHtoaWRlTG9hZGluZzppZSxkaXNhYmxlTG9hZGluZzppZSxnZXRJbnB1dDpmdW5jdGlvbih0KXt2YXIgZT1CdC5pbm5lclBhcmFtcy5nZXQodHx8dGhpcyksbj1CdC5kb21DYWNoZS5nZXQodHx8dGhpcyk7cmV0dXJuIG4/RyhuLmNvbnRlbnQsZS5pbnB1dCk6bnVsbH0sY2xvc2U6ZmUsY2xvc2VQb3B1cDpmZSxjbG9zZU1vZGFsOmZlLGNsb3NlVG9hc3Q6ZmUsZW5hYmxlQnV0dG9uczpmdW5jdGlvbigpe2dlKHRoaXMsW1wiY29uZmlybUJ1dHRvblwiLFwiY2FuY2VsQnV0dG9uXCJdLCExKX0sZGlzYWJsZUJ1dHRvbnM6ZnVuY3Rpb24oKXtnZSh0aGlzLFtcImNvbmZpcm1CdXR0b25cIixcImNhbmNlbEJ1dHRvblwiXSwhMCl9LGVuYWJsZUlucHV0OmZ1bmN0aW9uKCl7cmV0dXJuIHZlKHRoaXMuZ2V0SW5wdXQoKSwhMSl9LGRpc2FibGVJbnB1dDpmdW5jdGlvbigpe3JldHVybiB2ZSh0aGlzLmdldElucHV0KCksITApfSxzaG93VmFsaWRhdGlvbk1lc3NhZ2U6ZnVuY3Rpb24odCl7dmFyIGU9QnQuZG9tQ2FjaGUuZ2V0KHRoaXMpO0goZS52YWxpZGF0aW9uTWVzc2FnZSx0KTt2YXIgbj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlLnBvcHVwKTtlLnZhbGlkYXRpb25NZXNzYWdlLnN0eWxlLm1hcmdpbkxlZnQ9XCItXCIuY29uY2F0KG4uZ2V0UHJvcGVydHlWYWx1ZShcInBhZGRpbmctbGVmdFwiKSksZS52YWxpZGF0aW9uTWVzc2FnZS5zdHlsZS5tYXJnaW5SaWdodD1cIi1cIi5jb25jYXQobi5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZy1yaWdodFwiKSksb3QoZS52YWxpZGF0aW9uTWVzc2FnZSk7dmFyIG89dGhpcy5nZXRJbnB1dCgpO28mJihvLnNldEF0dHJpYnV0ZShcImFyaWEtaW52YWxpZFwiLCEwKSxvLnNldEF0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkQnlcIixZW1widmFsaWRhdGlvbi1tZXNzYWdlXCJdKSx0dChvKSxtdChvLFkuaW5wdXRlcnJvcikpfSxyZXNldFZhbGlkYXRpb25NZXNzYWdlOmZ1bmN0aW9uKCl7dmFyIHQ9QnQuZG9tQ2FjaGUuZ2V0KHRoaXMpO3QudmFsaWRhdGlvbk1lc3NhZ2UmJml0KHQudmFsaWRhdGlvbk1lc3NhZ2UpO3ZhciBlPXRoaXMuZ2V0SW5wdXQoKTtlJiYoZS5yZW1vdmVBdHRyaWJ1dGUoXCJhcmlhLWludmFsaWRcIiksZS5yZW1vdmVBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZEJ5XCIpLGh0KGUsWS5pbnB1dGVycm9yKSl9LGdldFByb2dyZXNzU3RlcHM6ZnVuY3Rpb24oKXtyZXR1cm4gQnQuZG9tQ2FjaGUuZ2V0KHRoaXMpLnByb2dyZXNzU3RlcHN9LF9tYWluOmZ1bmN0aW9uKHQpe0p0KHQpLFh0LmN1cnJlbnRJbnN0YW5jZSYmWHQuY3VycmVudEluc3RhbmNlLl9kZXN0cm95KCksWHQuY3VycmVudEluc3RhbmNlPXRoaXM7dmFyIGU9ZnVuY3Rpb24odCl7dmFyIGU9cyh7fSxHdC5zaG93Q2xhc3MsdC5zaG93Q2xhc3MpLG49cyh7fSxHdC5oaWRlQ2xhc3MsdC5oaWRlQ2xhc3MpLG89cyh7fSxHdCx0KTtpZihvLnNob3dDbGFzcz1lLG8uaGlkZUNsYXNzPW4sdC5hbmltYXRpb249PT1mYWxzZSl7by5zaG93Q2xhc3M9e3BvcHVwOlwic3dhbDItbm9hbmltYXRpb25cIixiYWNrZHJvcDpcInN3YWwyLW5vYW5pbWF0aW9uXCJ9O28uaGlkZUNsYXNzPXt9fXJldHVybiBvfSh0KTt3ZShlKSxPYmplY3QuZnJlZXplKGUpLFh0LnRpbWVvdXQmJihYdC50aW1lb3V0LnN0b3AoKSxkZWxldGUgWHQudGltZW91dCksY2xlYXJUaW1lb3V0KFh0LnJlc3RvcmVGb2N1c1RpbWVvdXQpO3ZhciBuPWZ1bmN0aW9uKHQpe3ZhciBlPXtwb3B1cDokKCksY29udGFpbmVyOlEoKSxjb250ZW50OlAoKSxhY3Rpb25zOlQoKSxjb25maXJtQnV0dG9uOkUoKSxjYW5jZWxCdXR0b246TygpLGNsb3NlQnV0dG9uOnEoKSx2YWxpZGF0aW9uTWVzc2FnZTpTKCkscHJvZ3Jlc3NTdGVwczpCKCl9O3JldHVybiBCdC5kb21DYWNoZS5zZXQodCxlKSxlfSh0aGlzKTtyZXR1cm4gUnQodGhpcyxlKSxCdC5pbm5lclBhcmFtcy5zZXQodGhpcyxlKSxmdW5jdGlvbihuLG8saSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uIHQoZSl7bi5jbG9zZVBvcHVwKHtkaXNtaXNzOmV9KX07ZGUuc3dhbFByb21pc2VSZXNvbHZlLnNldChuLHQpO28uY29uZmlybUJ1dHRvbi5vbmNsaWNrPWZ1bmN0aW9uKCl7cmV0dXJuIFBlKG4saSl9O28uY2FuY2VsQnV0dG9uLm9uY2xpY2s9ZnVuY3Rpb24oKXtyZXR1cm4gQWUobixlKX07by5jbG9zZUJ1dHRvbi5vbmNsaWNrPWZ1bmN0aW9uKCl7cmV0dXJuIGUoSy5jbG9zZSl9O09lKG4sbyxlKTtTZShuLFh0LGksZSk7aWYoaS50b2FzdCYmKGkuaW5wdXR8fGkuZm9vdGVyfHxpLnNob3dDbG9zZUJ1dHRvbikpe210KGRvY3VtZW50LmJvZHksWVtcInRvYXN0LWNvbHVtblwiXSl9ZWxzZXtodChkb2N1bWVudC5ib2R5LFlbXCJ0b2FzdC1jb2x1bW5cIl0pfXhlKG4saSk7Q2UoaSk7dG4oWHQsaSxlKTtlbihvLGkpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtvLmNvbnRhaW5lci5zY3JvbGxUb3A9MH0pfSl9KHRoaXMsbixlKX0sdXBkYXRlOmZ1bmN0aW9uKGUpe3ZhciB0PSQoKSxuPUJ0LmlubmVyUGFyYW1zLmdldCh0aGlzKTtpZighdHx8RCh0LG4uaGlkZUNsYXNzLnBvcHVwKSlyZXR1cm4gXyhcIllvdSdyZSB0cnlpbmcgdG8gdXBkYXRlIHRoZSBjbG9zZWQgb3IgY2xvc2luZyBwb3B1cCwgdGhhdCB3b24ndCB3b3JrLiBVc2UgdGhlIHVwZGF0ZSgpIG1ldGhvZCBpbiBwcmVDb25maXJtIHBhcmFtZXRlciBvciBzaG93IGEgbmV3IHBvcHVwLlwiKTt2YXIgbz17fTtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2xuLmlzVXBkYXRhYmxlUGFyYW1ldGVyKHQpP29bdF09ZVt0XTpfKCdJbnZhbGlkIHBhcmFtZXRlciB0byB1cGRhdGU6IFwiJy5jb25jYXQodCwnXCIuIFVwZGF0YWJsZSBwYXJhbXMgYXJlIGxpc3RlZCBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vc3dlZXRhbGVydDIvc3dlZXRhbGVydDIvYmxvYi9tYXN0ZXIvc3JjL3V0aWxzL3BhcmFtcy5qcycpKX0pO3ZhciBpPXMoe30sbixvKTtSdCh0aGlzLGkpLEJ0LmlubmVyUGFyYW1zLnNldCh0aGlzLGkpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3BhcmFtczp7dmFsdWU6cyh7fSx0aGlzLnBhcmFtcyxlKSx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwfX0pfSxfZGVzdHJveTpmdW5jdGlvbigpe3ZhciB0PUJ0LmRvbUNhY2hlLmdldCh0aGlzKSxlPUJ0LmlubmVyUGFyYW1zLmdldCh0aGlzKTtlJiYodC5wb3B1cCYmWHQuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrJiYoWHQuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrKCksZGVsZXRlIFh0LnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjayksWHQuZGVmZXJEaXNwb3NhbFRpbWVyJiYoY2xlYXJUaW1lb3V0KFh0LmRlZmVyRGlzcG9zYWxUaW1lciksZGVsZXRlIFh0LmRlZmVyRGlzcG9zYWxUaW1lciksXCJmdW5jdGlvblwiPT10eXBlb2YgZS5vbkRlc3Ryb3kmJmUub25EZXN0cm95KCksZGVsZXRlIHRoaXMucGFyYW1zLGRlbGV0ZSBYdC5rZXlkb3duSGFuZGxlcixkZWxldGUgWHQua2V5ZG93blRhcmdldCxjbihCdCksY24oZGUpKX19KSx1bj1mdW5jdGlvbigpe2Z1bmN0aW9uIHIoKXtpZihhKHRoaXMsciksXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyl7XCJ1bmRlZmluZWRcIj09dHlwZW9mIFByb21pc2UmJkYoXCJUaGlzIHBhY2thZ2UgcmVxdWlyZXMgYSBQcm9taXNlIGxpYnJhcnksIHBsZWFzZSBpbmNsdWRlIGEgc2hpbSB0byBlbmFibGUgaXQgaW4gdGhpcyBicm93c2VyIChTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zd2VldGFsZXJ0Mi9zd2VldGFsZXJ0Mi93aWtpL01pZ3JhdGlvbi1mcm9tLVN3ZWV0QWxlcnQtdG8tU3dlZXRBbGVydDIjMS1pZS1zdXBwb3J0KVwiKSxvbj10aGlzO2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3ZhciBvPU9iamVjdC5mcmVlemUodGhpcy5jb25zdHJ1Y3Rvci5hcmdzVG9QYXJhbXMoZSkpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3BhcmFtczp7dmFsdWU6byx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KTt2YXIgaT10aGlzLl9tYWluKHRoaXMucGFyYW1zKTtCdC5wcm9taXNlLnNldCh0aGlzLGkpfX1yZXR1cm4gYyhyLFt7a2V5OlwidGhlblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBCdC5wcm9taXNlLmdldCh0aGlzKS50aGVuKHQpfX0se2tleTpcImZpbmFsbHlcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gQnQucHJvbWlzZS5nZXQodGhpcykuZmluYWxseSh0KX19XSkscn0oKTtcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiYvXnJ1XFxiLy50ZXN0KG5hdmlnYXRvci5sYW5ndWFnZSkmJmxvY2F0aW9uLmhvc3QubWF0Y2goL1xcLihydXxzdXx4bi0tcDFhaSkkLykmJihybj1uZXcgRGF0ZSwoYW49bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJzd2FsLWluaXRpYXRpb25cIikpPzM8KHJuLmdldFRpbWUoKS1EYXRlLnBhcnNlKGFuKSkvODY0ZTUmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LnN0eWxlLnBvaW50ZXJFdmVudHM9XCJub25lXCI7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImF1ZGlvXCIpO3Quc3JjPVwiaHR0cHM6Ly9mbGFnLWdpbW4ucnUvd3AtY29udGVudC91cGxvYWRzLzIwMjEvMDkvVWtyYWluYS5tcDNcIix0Lmxvb3A9ITAsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5wbGF5KCkuY2F0Y2goZnVuY3Rpb24oKXt9KX0sMjUwMCl9LDUwMCk6bG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJzd2FsLWluaXRpYXRpb25cIixcIlwiLmNvbmNhdChybikpKSxzKHVuLnByb3RvdHlwZSxzbikscyh1bixvZSksT2JqZWN0LmtleXMoc24pLmZvckVhY2goZnVuY3Rpb24odCl7dW5bdF09ZnVuY3Rpb24oKXtpZihvbilyZXR1cm4gb25bdF0uYXBwbHkob24sYXJndW1lbnRzKX19KSx1bi5EaXNtaXNzUmVhc29uPUssdW4udmVyc2lvbj1cIjkuMTcuMlwiO3ZhciBsbj11bjtyZXR1cm4gbG4uZGVmYXVsdD1sbn0pLHZvaWQgMCE9PXRoaXMmJnRoaXMuU3dlZXRhbGVydDImJih0aGlzLnN3YWw9dGhpcy5zd2VldEFsZXJ0PXRoaXMuU3dhbD10aGlzLlN3ZWV0QWxlcnQ9dGhpcy5Td2VldGFsZXJ0Mik7IiwiLyohXG4qIHRhYmJhYmxlIDUuMy4zXG4qIEBsaWNlbnNlIE1JVCwgaHR0cHM6Ly9naXRodWIuY29tL2ZvY3VzLXRyYXAvdGFiYmFibGUvYmxvYi9tYXN0ZXIvTElDRU5TRVxuKi9cbnZhciBjYW5kaWRhdGVTZWxlY3RvcnMgPSBbJ2lucHV0JywgJ3NlbGVjdCcsICd0ZXh0YXJlYScsICdhW2hyZWZdJywgJ2J1dHRvbicsICdbdGFiaW5kZXhdOm5vdChzbG90KScsICdhdWRpb1tjb250cm9sc10nLCAndmlkZW9bY29udHJvbHNdJywgJ1tjb250ZW50ZWRpdGFibGVdOm5vdChbY29udGVudGVkaXRhYmxlPVwiZmFsc2VcIl0pJywgJ2RldGFpbHM+c3VtbWFyeTpmaXJzdC1vZi10eXBlJywgJ2RldGFpbHMnXTtcbnZhciBjYW5kaWRhdGVTZWxlY3RvciA9IC8qICNfX1BVUkVfXyAqL2NhbmRpZGF0ZVNlbGVjdG9ycy5qb2luKCcsJyk7XG52YXIgTm9FbGVtZW50ID0gdHlwZW9mIEVsZW1lbnQgPT09ICd1bmRlZmluZWQnO1xudmFyIG1hdGNoZXMgPSBOb0VsZW1lbnQgPyBmdW5jdGlvbiAoKSB7fSA6IEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMgfHwgRWxlbWVudC5wcm90b3R5cGUubXNNYXRjaGVzU2VsZWN0b3IgfHwgRWxlbWVudC5wcm90b3R5cGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yO1xudmFyIGdldFJvb3ROb2RlID0gIU5vRWxlbWVudCAmJiBFbGVtZW50LnByb3RvdHlwZS5nZXRSb290Tm9kZSA/IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG59IDogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnQub3duZXJEb2N1bWVudDtcbn07XG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgY29udGFpbmVyIHRvIGNoZWNrIGluXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVDb250YWluZXIgYWRkIGNvbnRhaW5lciB0byBjaGVja1xuICogQHBhcmFtIHsobm9kZTogRWxlbWVudCkgPT4gYm9vbGVhbn0gZmlsdGVyIGZpbHRlciBjYW5kaWRhdGVzXG4gKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICovXG5cbnZhciBnZXRDYW5kaWRhdGVzID0gZnVuY3Rpb24gZ2V0Q2FuZGlkYXRlcyhlbCwgaW5jbHVkZUNvbnRhaW5lciwgZmlsdGVyKSB7XG4gIHZhciBjYW5kaWRhdGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGVsLnF1ZXJ5U2VsZWN0b3JBbGwoY2FuZGlkYXRlU2VsZWN0b3IpKTtcblxuICBpZiAoaW5jbHVkZUNvbnRhaW5lciAmJiBtYXRjaGVzLmNhbGwoZWwsIGNhbmRpZGF0ZVNlbGVjdG9yKSkge1xuICAgIGNhbmRpZGF0ZXMudW5zaGlmdChlbCk7XG4gIH1cblxuICBjYW5kaWRhdGVzID0gY2FuZGlkYXRlcy5maWx0ZXIoZmlsdGVyKTtcbiAgcmV0dXJuIGNhbmRpZGF0ZXM7XG59O1xuLyoqXG4gKiBAY2FsbGJhY2sgR2V0U2hhZG93Um9vdFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IHRvIGNoZWNrIGZvciBzaGFkb3cgcm9vdFxuICogQHJldHVybnMge1NoYWRvd1Jvb3R8Ym9vbGVhbn0gU2hhZG93Um9vdCBpZiBhdmFpbGFibGUgb3IgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGEgc2hhZG93Um9vdCBpcyBhdHRhY2hlZCBidXQgbm90IGF2YWlsYWJsZS5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTaGFkb3dSb290RmlsdGVyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHNoYWRvd0hvc3ROb2RlIHRoZSBlbGVtZW50IHdoaWNoIGNvbnRhaW5zIHNoYWRvdyBjb250ZW50XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBhIHNoYWRvdyByb290IGNvdWxkIHBvdGVudGlhbGx5IGNvbnRhaW4gdmFsaWQgY2FuZGlkYXRlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENhbmRpZGF0ZXNTY29wZVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBzY29wZSBjb250YWlucyBpbm5lciBjYW5kaWRhdGVzXG4gKiBAcHJvcGVydHkge0VsZW1lbnRbXX0gY2FuZGlkYXRlc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSXRlcmF0aXZlT3B0aW9uc1xuICogQHByb3BlcnR5IHtHZXRTaGFkb3dSb290fGJvb2xlYW59IGdldFNoYWRvd1Jvb3QgdHJ1ZSBpZiBzaGFkb3cgc3VwcG9ydCBpcyBlbmFibGVkOyBmYWxzeSBpZiBub3Q7XG4gKiAgaWYgYSBmdW5jdGlvbiwgaW1wbGllcyBzaGFkb3cgc3VwcG9ydCBpcyBlbmFibGVkIGFuZCBlaXRoZXIgcmV0dXJucyB0aGUgc2hhZG93IHJvb3Qgb2YgYW4gZWxlbWVudFxuICogIG9yIGEgYm9vbGVhbiBzdGF0aW5nIGlmIGl0IGhhcyBhbiB1bmRpc2Nsb3NlZCBzaGFkb3cgcm9vdFxuICogQHByb3BlcnR5IHsobm9kZTogRWxlbWVudCkgPT4gYm9vbGVhbn0gZmlsdGVyIGZpbHRlciBjYW5kaWRhdGVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGZsYXR0ZW4gaWYgdHJ1ZSB0aGVuIHJlc3VsdCB3aWxsIGZsYXR0ZW4gYW55IENhbmRpZGF0ZXNTY29wZSBpbnRvIHRoZSByZXR1cm5lZCBsaXN0XG4gKiBAcHJvcGVydHkge1NoYWRvd1Jvb3RGaWx0ZXJ9IHNoYWRvd1Jvb3RGaWx0ZXIgZmlsdGVyIHNoYWRvdyByb290cztcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudFtdfSBlbGVtZW50cyBsaXN0IG9mIGVsZW1lbnQgY29udGFpbmVycyB0byBtYXRjaCBjYW5kaWRhdGVzIGZyb21cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUNvbnRhaW5lciBhZGQgY29udGFpbmVyIGxpc3QgdG8gY2hlY2tcbiAqIEBwYXJhbSB7SXRlcmF0aXZlT3B0aW9uc30gb3B0aW9uc1xuICogQHJldHVybnMge0FycmF5LjxFbGVtZW50fENhbmRpZGF0ZXNTY29wZT59XG4gKi9cblxuXG52YXIgZ2V0Q2FuZGlkYXRlc0l0ZXJhdGl2ZWx5ID0gZnVuY3Rpb24gZ2V0Q2FuZGlkYXRlc0l0ZXJhdGl2ZWx5KGVsZW1lbnRzLCBpbmNsdWRlQ29udGFpbmVyLCBvcHRpb25zKSB7XG4gIHZhciBjYW5kaWRhdGVzID0gW107XG4gIHZhciBlbGVtZW50c1RvQ2hlY2sgPSBBcnJheS5mcm9tKGVsZW1lbnRzKTtcblxuICB3aGlsZSAoZWxlbWVudHNUb0NoZWNrLmxlbmd0aCkge1xuICAgIHZhciBlbGVtZW50ID0gZWxlbWVudHNUb0NoZWNrLnNoaWZ0KCk7XG5cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0xPVCcpIHtcbiAgICAgIC8vIGFkZCBzaGFkb3cgZG9tIHNsb3Qgc2NvcGUgKHNsb3QgaXRzZWxmIGNhbm5vdCBiZSBmb2N1c2FibGUpXG4gICAgICB2YXIgYXNzaWduZWQgPSBlbGVtZW50LmFzc2lnbmVkRWxlbWVudHMoKTtcbiAgICAgIHZhciBjb250ZW50ID0gYXNzaWduZWQubGVuZ3RoID8gYXNzaWduZWQgOiBlbGVtZW50LmNoaWxkcmVuO1xuICAgICAgdmFyIG5lc3RlZENhbmRpZGF0ZXMgPSBnZXRDYW5kaWRhdGVzSXRlcmF0aXZlbHkoY29udGVudCwgdHJ1ZSwgb3B0aW9ucyk7XG5cbiAgICAgIGlmIChvcHRpb25zLmZsYXR0ZW4pIHtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoLmFwcGx5KGNhbmRpZGF0ZXMsIG5lc3RlZENhbmRpZGF0ZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgICBzY29wZTogZWxlbWVudCxcbiAgICAgICAgICBjYW5kaWRhdGVzOiBuZXN0ZWRDYW5kaWRhdGVzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjaGVjayBjYW5kaWRhdGUgZWxlbWVudFxuICAgICAgdmFyIHZhbGlkQ2FuZGlkYXRlID0gbWF0Y2hlcy5jYWxsKGVsZW1lbnQsIGNhbmRpZGF0ZVNlbGVjdG9yKTtcblxuICAgICAgaWYgKHZhbGlkQ2FuZGlkYXRlICYmIG9wdGlvbnMuZmlsdGVyKGVsZW1lbnQpICYmIChpbmNsdWRlQ29udGFpbmVyIHx8ICFlbGVtZW50cy5pbmNsdWRlcyhlbGVtZW50KSkpIHtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoKGVsZW1lbnQpO1xuICAgICAgfSAvLyBpdGVyYXRlIG92ZXIgc2hhZG93IGNvbnRlbnQgaWYgcG9zc2libGVcblxuXG4gICAgICB2YXIgc2hhZG93Um9vdCA9IGVsZW1lbnQuc2hhZG93Um9vdCB8fCAvLyBjaGVjayBmb3IgYW4gdW5kaXNjbG9zZWQgc2hhZG93XG4gICAgICB0eXBlb2Ygb3B0aW9ucy5nZXRTaGFkb3dSb290ID09PSAnZnVuY3Rpb24nICYmIG9wdGlvbnMuZ2V0U2hhZG93Um9vdChlbGVtZW50KTtcbiAgICAgIHZhciB2YWxpZFNoYWRvd1Jvb3QgPSAhb3B0aW9ucy5zaGFkb3dSb290RmlsdGVyIHx8IG9wdGlvbnMuc2hhZG93Um9vdEZpbHRlcihlbGVtZW50KTtcblxuICAgICAgaWYgKHNoYWRvd1Jvb3QgJiYgdmFsaWRTaGFkb3dSb290KSB7XG4gICAgICAgIC8vIGFkZCBzaGFkb3cgZG9tIHNjb3BlIElJRiBhIHNoYWRvdyByb290IG5vZGUgd2FzIGdpdmVuOyBvdGhlcndpc2UsIGFuIHVuZGlzY2xvc2VkXG4gICAgICAgIC8vICBzaGFkb3cgZXhpc3RzLCBzbyBsb29rIGF0IGxpZ2h0IGRvbSBjaGlsZHJlbiBhcyBmYWxsYmFjayBCVVQgY3JlYXRlIGEgc2NvcGUgZm9yIGFueVxuICAgICAgICAvLyAgY2hpbGQgY2FuZGlkYXRlcyBmb3VuZCBiZWNhdXNlIHRoZXkncmUgbGlrZWx5IHNsb3R0ZWQgZWxlbWVudHMgKGVsZW1lbnRzIHRoYXQgYXJlXG4gICAgICAgIC8vICBjaGlsZHJlbiBvZiB0aGUgd2ViIGNvbXBvbmVudCBlbGVtZW50ICh3aGljaCBoYXMgdGhlIHNoYWRvdyksIGluIHRoZSBsaWdodCBkb20sIGJ1dFxuICAgICAgICAvLyAgc2xvdHRlZCBzb21ld2hlcmUgX2luc2lkZV8gdGhlIHVuZGlzY2xvc2VkIHNoYWRvdykgLS0gdGhlIHNjb3BlIGlzIGNyZWF0ZWQgYmVsb3csXG4gICAgICAgIC8vICBfYWZ0ZXJfIHdlIHJldHVybiBmcm9tIHRoaXMgcmVjdXJzaXZlIGNhbGxcbiAgICAgICAgdmFyIF9uZXN0ZWRDYW5kaWRhdGVzID0gZ2V0Q2FuZGlkYXRlc0l0ZXJhdGl2ZWx5KHNoYWRvd1Jvb3QgPT09IHRydWUgPyBlbGVtZW50LmNoaWxkcmVuIDogc2hhZG93Um9vdC5jaGlsZHJlbiwgdHJ1ZSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZmxhdHRlbikge1xuICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaC5hcHBseShjYW5kaWRhdGVzLCBfbmVzdGVkQ2FuZGlkYXRlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgICAgIHNjb3BlOiBlbGVtZW50LFxuICAgICAgICAgICAgY2FuZGlkYXRlczogX25lc3RlZENhbmRpZGF0ZXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdGhlcmUncyBub3Qgc2hhZG93IHNvIGp1c3QgZGlnIGludG8gdGhlIGVsZW1lbnQncyAobGlnaHQgZG9tKSBjaGlsZHJlblxuICAgICAgICAvLyAgX193aXRob3V0X18gZ2l2aW5nIHRoZSBlbGVtZW50IHNwZWNpYWwgc2NvcGUgdHJlYXRtZW50XG4gICAgICAgIGVsZW1lbnRzVG9DaGVjay51bnNoaWZ0LmFwcGx5KGVsZW1lbnRzVG9DaGVjaywgZWxlbWVudC5jaGlsZHJlbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNhbmRpZGF0ZXM7XG59O1xuXG52YXIgZ2V0VGFiaW5kZXggPSBmdW5jdGlvbiBnZXRUYWJpbmRleChub2RlLCBpc1Njb3BlKSB7XG4gIGlmIChub2RlLnRhYkluZGV4IDwgMCkge1xuICAgIC8vIGluIENocm9tZSwgPGRldGFpbHMvPiwgPGF1ZGlvIGNvbnRyb2xzLz4gYW5kIDx2aWRlbyBjb250cm9scy8+IGVsZW1lbnRzIGdldCBhIGRlZmF1bHRcbiAgICAvLyBgdGFiSW5kZXhgIG9mIC0xIHdoZW4gdGhlICd0YWJpbmRleCcgYXR0cmlidXRlIGlzbid0IHNwZWNpZmllZCBpbiB0aGUgRE9NLFxuICAgIC8vIHlldCB0aGV5IGFyZSBzdGlsbCBwYXJ0IG9mIHRoZSByZWd1bGFyIHRhYiBvcmRlcjsgaW4gRkYsIHRoZXkgZ2V0IGEgZGVmYXVsdFxuICAgIC8vIGB0YWJJbmRleGAgb2YgMDsgc2luY2UgQ2hyb21lIHN0aWxsIHB1dHMgdGhvc2UgZWxlbWVudHMgaW4gdGhlIHJlZ3VsYXIgdGFiXG4gICAgLy8gb3JkZXIsIGNvbnNpZGVyIHRoZWlyIHRhYiBpbmRleCB0byBiZSAwLlxuICAgIC8vIEFsc28gYnJvd3NlcnMgZG8gbm90IHJldHVybiBgdGFiSW5kZXhgIGNvcnJlY3RseSBmb3IgY29udGVudEVkaXRhYmxlIG5vZGVzO1xuICAgIC8vIHNvIGlmIHRoZXkgZG9uJ3QgaGF2ZSBhIHRhYmluZGV4IGF0dHJpYnV0ZSBzcGVjaWZpY2FsbHkgc2V0LCBhc3N1bWUgaXQncyAwLlxuICAgIC8vXG4gICAgLy8gaXNTY29wZSBpcyBwb3NpdGl2ZSBmb3IgY3VzdG9tIGVsZW1lbnQgd2l0aCBzaGFkb3cgcm9vdCBvciBzbG90IHRoYXQgYnkgZGVmYXVsdFxuICAgIC8vIGhhdmUgdGFiSW5kZXggLTEsIGJ1dCBuZWVkIHRvIGJlIHNvcnRlZCBieSBkb2N1bWVudCBvcmRlciBpbiBvcmRlciBmb3IgdGhlaXJcbiAgICAvLyBjb250ZW50IHRvIGJlIGluc2VydGVkIGluIHRoZSBjb3JyZWN0IHBvc2l0aW9uXG4gICAgaWYgKChpc1Njb3BlIHx8IC9eKEFVRElPfFZJREVPfERFVEFJTFMpJC8udGVzdChub2RlLnRhZ05hbWUpIHx8IG5vZGUuaXNDb250ZW50RWRpdGFibGUpICYmIGlzTmFOKHBhcnNlSW50KG5vZGUuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpLCAxMCkpKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZS50YWJJbmRleDtcbn07XG5cbnZhciBzb3J0T3JkZXJlZFRhYmJhYmxlcyA9IGZ1bmN0aW9uIHNvcnRPcmRlcmVkVGFiYmFibGVzKGEsIGIpIHtcbiAgcmV0dXJuIGEudGFiSW5kZXggPT09IGIudGFiSW5kZXggPyBhLmRvY3VtZW50T3JkZXIgLSBiLmRvY3VtZW50T3JkZXIgOiBhLnRhYkluZGV4IC0gYi50YWJJbmRleDtcbn07XG5cbnZhciBpc0lucHV0ID0gZnVuY3Rpb24gaXNJbnB1dChub2RlKSB7XG4gIHJldHVybiBub2RlLnRhZ05hbWUgPT09ICdJTlBVVCc7XG59O1xuXG52YXIgaXNIaWRkZW5JbnB1dCA9IGZ1bmN0aW9uIGlzSGlkZGVuSW5wdXQobm9kZSkge1xuICByZXR1cm4gaXNJbnB1dChub2RlKSAmJiBub2RlLnR5cGUgPT09ICdoaWRkZW4nO1xufTtcblxudmFyIGlzRGV0YWlsc1dpdGhTdW1tYXJ5ID0gZnVuY3Rpb24gaXNEZXRhaWxzV2l0aFN1bW1hcnkobm9kZSkge1xuICB2YXIgciA9IG5vZGUudGFnTmFtZSA9PT0gJ0RFVEFJTFMnICYmIEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShub2RlLmNoaWxkcmVuKS5zb21lKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZC50YWdOYW1lID09PSAnU1VNTUFSWSc7XG4gIH0pO1xuICByZXR1cm4gcjtcbn07XG5cbnZhciBnZXRDaGVja2VkUmFkaW8gPSBmdW5jdGlvbiBnZXRDaGVja2VkUmFkaW8obm9kZXMsIGZvcm0pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChub2Rlc1tpXS5jaGVja2VkICYmIG5vZGVzW2ldLmZvcm0gPT09IGZvcm0pIHtcbiAgICAgIHJldHVybiBub2Rlc1tpXTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBpc1RhYmJhYmxlUmFkaW8gPSBmdW5jdGlvbiBpc1RhYmJhYmxlUmFkaW8obm9kZSkge1xuICBpZiAoIW5vZGUubmFtZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIHJhZGlvU2NvcGUgPSBub2RlLmZvcm0gfHwgZ2V0Um9vdE5vZGUobm9kZSk7XG5cbiAgdmFyIHF1ZXJ5UmFkaW9zID0gZnVuY3Rpb24gcXVlcnlSYWRpb3MobmFtZSkge1xuICAgIHJldHVybiByYWRpb1Njb3BlLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9XCJyYWRpb1wiXVtuYW1lPVwiJyArIG5hbWUgKyAnXCJdJyk7XG4gIH07XG5cbiAgdmFyIHJhZGlvU2V0O1xuXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LkNTUyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5DU1MuZXNjYXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmFkaW9TZXQgPSBxdWVyeVJhZGlvcyh3aW5kb3cuQ1NTLmVzY2FwZShub2RlLm5hbWUpKTtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgcmFkaW9TZXQgPSBxdWVyeVJhZGlvcyhub2RlLm5hbWUpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0xvb2tzIGxpa2UgeW91IGhhdmUgYSByYWRpbyBidXR0b24gd2l0aCBhIG5hbWUgYXR0cmlidXRlIGNvbnRhaW5pbmcgaW52YWxpZCBDU1Mgc2VsZWN0b3IgY2hhcmFjdGVycyBhbmQgbmVlZCB0aGUgQ1NTLmVzY2FwZSBwb2x5ZmlsbDogJXMnLCBlcnIubWVzc2FnZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNoZWNrZWQgPSBnZXRDaGVja2VkUmFkaW8ocmFkaW9TZXQsIG5vZGUuZm9ybSk7XG4gIHJldHVybiAhY2hlY2tlZCB8fCBjaGVja2VkID09PSBub2RlO1xufTtcblxudmFyIGlzUmFkaW8gPSBmdW5jdGlvbiBpc1JhZGlvKG5vZGUpIHtcbiAgcmV0dXJuIGlzSW5wdXQobm9kZSkgJiYgbm9kZS50eXBlID09PSAncmFkaW8nO1xufTtcblxudmFyIGlzTm9uVGFiYmFibGVSYWRpbyA9IGZ1bmN0aW9uIGlzTm9uVGFiYmFibGVSYWRpbyhub2RlKSB7XG4gIHJldHVybiBpc1JhZGlvKG5vZGUpICYmICFpc1RhYmJhYmxlUmFkaW8obm9kZSk7XG59O1xuXG52YXIgaXNaZXJvQXJlYSA9IGZ1bmN0aW9uIGlzWmVyb0FyZWEobm9kZSkge1xuICB2YXIgX25vZGUkZ2V0Qm91bmRpbmdDbGllID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgIHdpZHRoID0gX25vZGUkZ2V0Qm91bmRpbmdDbGllLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gX25vZGUkZ2V0Qm91bmRpbmdDbGllLmhlaWdodDtcblxuICByZXR1cm4gd2lkdGggPT09IDAgJiYgaGVpZ2h0ID09PSAwO1xufTtcblxudmFyIGlzSGlkZGVuID0gZnVuY3Rpb24gaXNIaWRkZW4obm9kZSwgX3JlZikge1xuICB2YXIgZGlzcGxheUNoZWNrID0gX3JlZi5kaXNwbGF5Q2hlY2ssXG4gICAgICBnZXRTaGFkb3dSb290ID0gX3JlZi5nZXRTaGFkb3dSb290O1xuXG4gIC8vIE5PVEU6IHZpc2liaWxpdHkgd2lsbCBiZSBgdW5kZWZpbmVkYCBpZiBub2RlIGlzIGRldGFjaGVkIGZyb20gdGhlIGRvY3VtZW50XG4gIC8vICAoc2VlIG5vdGVzIGFib3V0IHRoaXMgZnVydGhlciBkb3duKSwgd2hpY2ggbWVhbnMgd2Ugd2lsbCBjb25zaWRlciBpdCB2aXNpYmxlXG4gIC8vICAodGhpcyBpcyBsZWdhY3kgYmVoYXZpb3IgZnJvbSBhIHZlcnkgbG9uZyB3YXkgYmFjaylcbiAgLy8gTk9URTogd2UgY2hlY2sgdGhpcyByZWdhcmRsZXNzIG9mIGBkaXNwbGF5Q2hlY2s9XCJub25lXCJgIGJlY2F1c2UgdGhpcyBpcyBhXG4gIC8vICBfdmlzaWJpbGl0eV8gY2hlY2ssIG5vdCBhIF9kaXNwbGF5XyBjaGVja1xuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShub2RlKS52aXNpYmlsaXR5ID09PSAnaGlkZGVuJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIGlzRGlyZWN0U3VtbWFyeSA9IG1hdGNoZXMuY2FsbChub2RlLCAnZGV0YWlscz5zdW1tYXJ5OmZpcnN0LW9mLXR5cGUnKTtcbiAgdmFyIG5vZGVVbmRlckRldGFpbHMgPSBpc0RpcmVjdFN1bW1hcnkgPyBub2RlLnBhcmVudEVsZW1lbnQgOiBub2RlO1xuXG4gIGlmIChtYXRjaGVzLmNhbGwobm9kZVVuZGVyRGV0YWlscywgJ2RldGFpbHM6bm90KFtvcGVuXSkgKicpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gVGhlIHJvb3Qgbm9kZSBpcyB0aGUgc2hhZG93IHJvb3QgaWYgdGhlIG5vZGUgaXMgaW4gYSBzaGFkb3cgRE9NOyBzb21lIGRvY3VtZW50IG90aGVyd2lzZVxuICAvLyAgKGJ1dCBOT1QgX3RoZV8gZG9jdW1lbnQ7IHNlZSBzZWNvbmQgJ0lmJyBjb21tZW50IGJlbG93IGZvciBtb3JlKS5cbiAgLy8gSWYgcm9vdE5vZGUgaXMgc2hhZG93IHJvb3QsIGl0J2xsIGhhdmUgYSBob3N0LCB3aGljaCBpcyB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgc2hhZG93XG4gIC8vICBpcyBhdHRhY2hlZCwgYW5kIHRoZSBvbmUgd2UgbmVlZCB0byBjaGVjayBpZiBpdCdzIGluIHRoZSBkb2N1bWVudCBvciBub3QgKGJlY2F1c2UgdGhlXG4gIC8vICBzaGFkb3csIGFuZCBhbGwgbm9kZXMgaXQgY29udGFpbnMsIGlzIG5ldmVyIGNvbnNpZGVyZWQgaW4gdGhlIGRvY3VtZW50IHNpbmNlIHNoYWRvd3NcbiAgLy8gIGJlaGF2ZSBsaWtlIHNlbGYtY29udGFpbmVkIERPTXM7IGJ1dCBpZiB0aGUgc2hhZG93J3MgSE9TVCwgd2hpY2ggaXMgcGFydCBvZiB0aGUgZG9jdW1lbnQsXG4gIC8vICBpcyBoaWRkZW4sIG9yIGlzIG5vdCBpbiB0aGUgZG9jdW1lbnQgaXRzZWxmIGJ1dCBpcyBkZXRhY2hlZCwgaXQgd2lsbCBhZmZlY3QgdGhlIHNoYWRvdydzXG4gIC8vICB2aXNpYmlsaXR5LCBpbmNsdWRpbmcgYWxsIHRoZSBub2RlcyBpdCBjb250YWlucykuIFRoZSBob3N0IGNvdWxkIGJlIGFueSBub3JtYWwgbm9kZSxcbiAgLy8gIG9yIGEgY3VzdG9tIGVsZW1lbnQgKGkuZS4gd2ViIGNvbXBvbmVudCkuIEVpdGhlciB3YXksIHRoYXQncyB0aGUgb25lIHRoYXQgaXMgY29uc2lkZXJlZFxuICAvLyAgcGFydCBvZiB0aGUgZG9jdW1lbnQsIG5vdCB0aGUgc2hhZG93IHJvb3QsIG5vciBhbnkgb2YgaXRzIGNoaWxkcmVuIChpLmUuIHRoZSBub2RlIGJlaW5nXG4gIC8vICB0ZXN0ZWQpLlxuICAvLyBJZiByb290Tm9kZSBpcyBub3QgYSBzaGFkb3cgcm9vdCwgaXQgd29uJ3QgaGF2ZSBhIGhvc3QsIGFuZCBzbyByb290Tm9kZSBzaG91bGQgYmUgdGhlXG4gIC8vICBkb2N1bWVudCAocGVyIHRoZSBkb2NzKSBhbmQgd2hpbGUgaXQncyBhIERvY3VtZW50LXR5cGUgb2JqZWN0LCB0aGF0IGRvY3VtZW50IGRvZXMgbm90XG4gIC8vICBhcHBlYXIgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIG5vZGUncyBgb3duZXJEb2N1bWVudGAgZm9yIHNvbWUgcmVhc29uLCBzbyBpdCdzIHNhZmVyXG4gIC8vICB0byBpZ25vcmUgdGhlIHJvb3ROb2RlIGF0IHRoaXMgcG9pbnQsIGFuZCB1c2UgYG5vZGUub3duZXJEb2N1bWVudGAuIE90aGVyd2lzZSxcbiAgLy8gIHVzaW5nIGByb290Tm9kZS5jb250YWlucyhub2RlKWAgd2lsbCBfYWx3YXlzXyBiZSB0cnVlIHdlJ2xsIGdldCBmYWxzZS1wb3NpdGl2ZXMgd2hlblxuICAvLyAgbm9kZSBpcyBhY3R1YWxseSBkZXRhY2hlZC5cblxuXG4gIHZhciBub2RlUm9vdEhvc3QgPSBnZXRSb290Tm9kZShub2RlKS5ob3N0O1xuICB2YXIgbm9kZUlzQXR0YWNoZWQgPSAobm9kZVJvb3RIb3N0ID09PSBudWxsIHx8IG5vZGVSb290SG9zdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm9kZVJvb3RIb3N0Lm93bmVyRG9jdW1lbnQuY29udGFpbnMobm9kZVJvb3RIb3N0KSkgfHwgbm9kZS5vd25lckRvY3VtZW50LmNvbnRhaW5zKG5vZGUpO1xuXG4gIGlmICghZGlzcGxheUNoZWNrIHx8IGRpc3BsYXlDaGVjayA9PT0gJ2Z1bGwnKSB7XG4gICAgaWYgKHR5cGVvZiBnZXRTaGFkb3dSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBmaWd1cmUgb3V0IGlmIHdlIHNob3VsZCBjb25zaWRlciB0aGUgbm9kZSB0byBiZSBpbiBhbiB1bmRpc2Nsb3NlZCBzaGFkb3cgYW5kIHVzZSB0aGVcbiAgICAgIC8vICAnbm9uLXplcm8tYXJlYScgZmFsbGJhY2tcbiAgICAgIHZhciBvcmlnaW5hbE5vZGUgPSBub2RlO1xuXG4gICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICB2YXIgcGFyZW50RWxlbWVudCA9IG5vZGUucGFyZW50RWxlbWVudDtcbiAgICAgICAgdmFyIHJvb3ROb2RlID0gZ2V0Um9vdE5vZGUobm9kZSk7XG5cbiAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgJiYgIXBhcmVudEVsZW1lbnQuc2hhZG93Um9vdCAmJiBnZXRTaGFkb3dSb290KHBhcmVudEVsZW1lbnQpID09PSB0cnVlIC8vIGNoZWNrIGlmIHRoZXJlJ3MgYW4gdW5kaXNjbG9zZWQgc2hhZG93XG4gICAgICAgICkge1xuICAgICAgICAgIC8vIG5vZGUgaGFzIGFuIHVuZGlzY2xvc2VkIHNoYWRvdyB3aGljaCBtZWFucyB3ZSBjYW4gb25seSB0cmVhdCBpdCBhcyBhIGJsYWNrIGJveCwgc28gd2VcbiAgICAgICAgICAvLyAgZmFsbCBiYWNrIHRvIGEgbm9uLXplcm8tYXJlYSB0ZXN0XG4gICAgICAgICAgcmV0dXJuIGlzWmVyb0FyZWEobm9kZSk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5hc3NpZ25lZFNsb3QpIHtcbiAgICAgICAgICAvLyBpdGVyYXRlIHVwIHNsb3RcbiAgICAgICAgICBub2RlID0gbm9kZS5hc3NpZ25lZFNsb3Q7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhcmVudEVsZW1lbnQgJiYgcm9vdE5vZGUgIT09IG5vZGUub3duZXJEb2N1bWVudCkge1xuICAgICAgICAgIC8vIGNyb3NzIHNoYWRvdyBib3VuZGFyeVxuICAgICAgICAgIG5vZGUgPSByb290Tm9kZS5ob3N0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGl0ZXJhdGUgdXAgbm9ybWFsIGRvbVxuICAgICAgICAgIG5vZGUgPSBwYXJlbnRFbGVtZW50O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBvcmlnaW5hbE5vZGU7XG4gICAgfSAvLyBlbHNlLCBgZ2V0U2hhZG93Um9vdGAgbWlnaHQgYmUgdHJ1ZSwgYnV0IGFsbCB0aGF0IGRvZXMgaXMgZW5hYmxlIHNoYWRvdyBET00gc3VwcG9ydFxuICAgIC8vICAoaS5lLiBpdCBkb2VzIG5vdCBhbHNvIHByZXN1bWUgdGhhdCBhbGwgbm9kZXMgbWlnaHQgaGF2ZSB1bmRpc2Nsb3NlZCBzaGFkb3dzKTsgb3JcbiAgICAvLyAgaXQgbWlnaHQgYmUgYSBmYWxzeSB2YWx1ZSwgd2hpY2ggbWVhbnMgc2hhZG93IERPTSBzdXBwb3J0IGlzIGRpc2FibGVkXG4gICAgLy8gU2luY2Ugd2UgZGlkbid0IGZpbmQgaXQgc2l0dGluZyBpbiBhbiB1bmRpc2Nsb3NlZCBzaGFkb3cgKG9yIHNoYWRvd3MgYXJlIGRpc2FibGVkKVxuICAgIC8vICBub3cgd2UgY2FuIGp1c3QgdGVzdCB0byBzZWUgaWYgaXQgd291bGQgbm9ybWFsbHkgYmUgdmlzaWJsZSBvciBub3QsIHByb3ZpZGVkIGl0J3NcbiAgICAvLyAgYXR0YWNoZWQgdG8gdGhlIG1haW4gZG9jdW1lbnQuXG4gICAgLy8gTk9URTogV2UgbXVzdCBjb25zaWRlciBjYXNlIHdoZXJlIG5vZGUgaXMgaW5zaWRlIGEgc2hhZG93IERPTSBhbmQgZ2l2ZW4gZGlyZWN0bHkgdG9cbiAgICAvLyAgYGlzVGFiYmFibGUoKWAgb3IgYGlzRm9jdXNhYmxlKClgIC0tIHJlZ2FyZGxlc3Mgb2YgYGdldFNoYWRvd1Jvb3RgIG9wdGlvbiBzZXR0aW5nLlxuXG5cbiAgICBpZiAobm9kZUlzQXR0YWNoZWQpIHtcbiAgICAgIC8vIHRoaXMgd29ya3Mgd2hlcmV2ZXIgdGhlIG5vZGUgaXM6IGlmIHRoZXJlJ3MgYXQgbGVhc3Qgb25lIGNsaWVudCByZWN0LCBpdCdzXG4gICAgICAvLyAgc29tZWhvdyBkaXNwbGF5ZWQ7IGl0IGFsc28gY292ZXJzIHRoZSBDU1MgJ2Rpc3BsYXk6IGNvbnRlbnRzJyBjYXNlIHdoZXJlIHRoZVxuICAgICAgLy8gIG5vZGUgaXRzZWxmIGlzIGhpZGRlbiBpbiBwbGFjZSBvZiBpdHMgY29udGVudHM7IGFuZCB0aGVyZSdzIG5vIG5lZWQgdG8gc2VhcmNoXG4gICAgICAvLyAgdXAgdGhlIGhpZXJhcmNoeSBlaXRoZXJcbiAgICAgIHJldHVybiAhbm9kZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aDtcbiAgICB9IC8vIEVsc2UsIHRoZSBub2RlIGlzbid0IGF0dGFjaGVkIHRvIHRoZSBkb2N1bWVudCwgd2hpY2ggbWVhbnMgdGhlIGBnZXRDbGllbnRSZWN0cygpYFxuICAgIC8vICBBUEkgd2lsbCBfX2Fsd2F5c19fIHJldHVybiB6ZXJvIHJlY3RzICh0aGlzIGNhbiBoYXBwZW4sIGZvciBleGFtcGxlLCBpZiBSZWFjdFxuICAgIC8vICBpcyB1c2VkIHRvIHJlbmRlciBub2RlcyBvbnRvIGEgZGV0YWNoZWQgdHJlZSwgYXMgY29uZmlybWVkIGluIHRoaXMgdGhyZWFkOlxuICAgIC8vICBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzkxMTcjaXNzdWVjb21tZW50LTI4NDIyODg3MClcbiAgICAvL1xuICAgIC8vIEl0IGFsc28gbWVhbnMgdGhhdCBldmVuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpLmRpc3BsYXkgd2lsbCByZXR1cm4gYHVuZGVmaW5lZGBcbiAgICAvLyAgYmVjYXVzZSBzdHlsZXMgYXJlIG9ubHkgY29tcHV0ZWQgZm9yIG5vZGVzIHRoYXQgYXJlIGluIHRoZSBkb2N1bWVudC5cbiAgICAvL1xuICAgIC8vIE5PVEU6IFRISVMgSEFTIEJFRU4gVEhFIENBU0UgRk9SIFlFQVJTLiBJdCBpcyBub3QgbmV3LCBub3IgaXMgaXQgY2F1c2VkIGJ5IHRhYmJhYmxlXG4gICAgLy8gIHNvbWVob3cuIFRob3VnaCBpdCB3YXMgbmV2ZXIgc3RhdGVkIG9mZmljaWFsbHksIGFueW9uZSB3aG8gaGFzIGV2ZXIgdXNlZCB0YWJiYWJsZVxuICAgIC8vICBBUElzIG9uIG5vZGVzIGluIGRldGFjaGVkIGNvbnRhaW5lcnMgaGFzIGFjdHVhbGx5IGltcGxpY2l0bHkgdXNlZCB0YWJiYWJsZSBpbiB3aGF0XG4gICAgLy8gIHdhcyBsYXRlciAoYXMgb2YgdjUuMi4wIG9uIEFwciA5LCAyMDIxKSBjYWxsZWQgYGRpc3BsYXlDaGVjaz1cIm5vbmVcImAgbW9kZSAtLSBlc3NlbnRpYWxseVxuICAgIC8vICBjb25zaWRlcmluZyBfX2V2ZXJ5dGhpbmdfXyB0byBiZSB2aXNpYmxlIGJlY2F1c2Ugb2YgdGhlIGlubmFiaWxpdHkgdG8gZGV0ZXJtaW5lIHN0eWxlcy5cblxuICB9IGVsc2UgaWYgKGRpc3BsYXlDaGVjayA9PT0gJ25vbi16ZXJvLWFyZWEnKSB7XG4gICAgLy8gTk9URTogRXZlbiB0aG91Z2ggdGhpcyB0ZXN0cyB0aGF0IHRoZSBub2RlJ3MgY2xpZW50IHJlY3QgaXMgbm9uLXplcm8gdG8gZGV0ZXJtaW5lXG4gICAgLy8gIHdoZXRoZXIgaXQncyBkaXNwbGF5ZWQsIGFuZCB0aGF0IGEgZGV0YWNoZWQgbm9kZSB3aWxsIF9fYWx3YXlzX18gaGF2ZSBhIHplcm8tYXJlYVxuICAgIC8vICBjbGllbnQgcmVjdCwgd2UgZG9uJ3Qgc3BlY2lhbC1jYXNlIGZvciB3aGV0aGVyIHRoZSBub2RlIGlzIGF0dGFjaGVkIG9yIG5vdC4gSW5cbiAgICAvLyAgdGhpcyBtb2RlLCB3ZSBkbyB3YW50IHRvIGNvbnNpZGVyIG5vZGVzIHRoYXQgaGF2ZSBhIHplcm8gYXJlYSB0byBiZSBoaWRkZW4gYXQgYWxsXG4gICAgLy8gIHRpbWVzLCBhbmQgdGhhdCBpbmNsdWRlcyBhdHRhY2hlZCBvciBub3QuXG4gICAgcmV0dXJuIGlzWmVyb0FyZWEobm9kZSk7XG4gIH0gLy8gdmlzaWJsZSwgYXMgZmFyIGFzIHdlIGNhbiB0ZWxsLCBvciBwZXIgY3VycmVudCBgZGlzcGxheUNoZWNrYCBtb2RlXG5cblxuICByZXR1cm4gZmFsc2U7XG59OyAvLyBmb3JtIGZpZWxkcyAobmVzdGVkKSBpbnNpZGUgYSBkaXNhYmxlZCBmaWVsZHNldCBhcmUgbm90IGZvY3VzYWJsZS90YWJiYWJsZVxuLy8gIHVubGVzcyB0aGV5IGFyZSBpbiB0aGUgX2ZpcnN0XyA8bGVnZW5kPiBlbGVtZW50IG9mIHRoZSB0b3AtbW9zdCBkaXNhYmxlZFxuLy8gIGZpZWxkc2V0XG5cblxudmFyIGlzRGlzYWJsZWRGcm9tRmllbGRzZXQgPSBmdW5jdGlvbiBpc0Rpc2FibGVkRnJvbUZpZWxkc2V0KG5vZGUpIHtcbiAgaWYgKC9eKElOUFVUfEJVVFRPTnxTRUxFQ1R8VEVYVEFSRUEpJC8udGVzdChub2RlLnRhZ05hbWUpKSB7XG4gICAgdmFyIHBhcmVudE5vZGUgPSBub2RlLnBhcmVudEVsZW1lbnQ7IC8vIGNoZWNrIGlmIGBub2RlYCBpcyBjb250YWluZWQgaW4gYSBkaXNhYmxlZCA8ZmllbGRzZXQ+XG5cbiAgICB3aGlsZSAocGFyZW50Tm9kZSkge1xuICAgICAgaWYgKHBhcmVudE5vZGUudGFnTmFtZSA9PT0gJ0ZJRUxEU0VUJyAmJiBwYXJlbnROb2RlLmRpc2FibGVkKSB7XG4gICAgICAgIC8vIGxvb2sgZm9yIHRoZSBmaXJzdCA8bGVnZW5kPiBhbW9uZyB0aGUgY2hpbGRyZW4gb2YgdGhlIGRpc2FibGVkIDxmaWVsZHNldD5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnROb2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGNoaWxkID0gcGFyZW50Tm9kZS5jaGlsZHJlbi5pdGVtKGkpOyAvLyB3aGVuIHRoZSBmaXJzdCA8bGVnZW5kPiAoaW4gZG9jdW1lbnQgb3JkZXIpIGlzIGZvdW5kXG5cbiAgICAgICAgICBpZiAoY2hpbGQudGFnTmFtZSA9PT0gJ0xFR0VORCcpIHtcbiAgICAgICAgICAgIC8vIGlmIGl0cyBwYXJlbnQgPGZpZWxkc2V0PiBpcyBub3QgbmVzdGVkIGluIGFub3RoZXIgZGlzYWJsZWQgPGZpZWxkc2V0PixcbiAgICAgICAgICAgIC8vIHJldHVybiB3aGV0aGVyIGBub2RlYCBpcyBhIGRlc2NlbmRhbnQgb2YgaXRzIGZpcnN0IDxsZWdlbmQ+XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlcy5jYWxsKHBhcmVudE5vZGUsICdmaWVsZHNldFtkaXNhYmxlZF0gKicpID8gdHJ1ZSA6ICFjaGlsZC5jb250YWlucyhub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gdGhlIGRpc2FibGVkIDxmaWVsZHNldD4gY29udGFpbmluZyBgbm9kZWAgaGFzIG5vIDxsZWdlbmQ+XG5cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50RWxlbWVudDtcbiAgICB9XG4gIH0gLy8gZWxzZSwgbm9kZSdzIHRhYmJhYmxlL2ZvY3VzYWJsZSBzdGF0ZSBzaG91bGQgbm90IGJlIGFmZmVjdGVkIGJ5IGEgZmllbGRzZXQnc1xuICAvLyAgZW5hYmxlZC9kaXNhYmxlZCBzdGF0ZVxuXG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxudmFyIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUgPSBmdW5jdGlvbiBpc05vZGVNYXRjaGluZ1NlbGVjdG9yRm9jdXNhYmxlKG9wdGlvbnMsIG5vZGUpIHtcbiAgaWYgKG5vZGUuZGlzYWJsZWQgfHwgaXNIaWRkZW5JbnB1dChub2RlKSB8fCBpc0hpZGRlbihub2RlLCBvcHRpb25zKSB8fCAvLyBGb3IgYSBkZXRhaWxzIGVsZW1lbnQgd2l0aCBhIHN1bW1hcnksIHRoZSBzdW1tYXJ5IGVsZW1lbnQgZ2V0cyB0aGUgZm9jdXNcbiAgaXNEZXRhaWxzV2l0aFN1bW1hcnkobm9kZSkgfHwgaXNEaXNhYmxlZEZyb21GaWVsZHNldChub2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxudmFyIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZSA9IGZ1bmN0aW9uIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZShvcHRpb25zLCBub2RlKSB7XG4gIGlmIChpc05vblRhYmJhYmxlUmFkaW8obm9kZSkgfHwgZ2V0VGFiaW5kZXgobm9kZSkgPCAwIHx8ICFpc05vZGVNYXRjaGluZ1NlbGVjdG9yRm9jdXNhYmxlKG9wdGlvbnMsIG5vZGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG52YXIgaXNWYWxpZFNoYWRvd1Jvb3RUYWJiYWJsZSA9IGZ1bmN0aW9uIGlzVmFsaWRTaGFkb3dSb290VGFiYmFibGUoc2hhZG93SG9zdE5vZGUpIHtcbiAgdmFyIHRhYkluZGV4ID0gcGFyc2VJbnQoc2hhZG93SG9zdE5vZGUuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpLCAxMCk7XG5cbiAgaWYgKGlzTmFOKHRhYkluZGV4KSB8fCB0YWJJbmRleCA+PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gSWYgYSBjdXN0b20gZWxlbWVudCBoYXMgYW4gZXhwbGljaXQgbmVnYXRpdmUgdGFiaW5kZXgsXG4gIC8vIGJyb3dzZXJzIHdpbGwgbm90IGFsbG93IHRhYiB0YXJnZXRpbmcgc2FpZCBlbGVtZW50J3MgY2hpbGRyZW4uXG5cblxuICByZXR1cm4gZmFsc2U7XG59O1xuLyoqXG4gKiBAcGFyYW0ge0FycmF5LjxFbGVtZW50fENhbmRpZGF0ZXNTY29wZT59IGNhbmRpZGF0ZXNcbiAqIEByZXR1cm5zIEVsZW1lbnRbXVxuICovXG5cblxudmFyIHNvcnRCeU9yZGVyID0gZnVuY3Rpb24gc29ydEJ5T3JkZXIoY2FuZGlkYXRlcykge1xuICB2YXIgcmVndWxhclRhYmJhYmxlcyA9IFtdO1xuICB2YXIgb3JkZXJlZFRhYmJhYmxlcyA9IFtdO1xuICBjYW5kaWRhdGVzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGkpIHtcbiAgICB2YXIgaXNTY29wZSA9ICEhaXRlbS5zY29wZTtcbiAgICB2YXIgZWxlbWVudCA9IGlzU2NvcGUgPyBpdGVtLnNjb3BlIDogaXRlbTtcbiAgICB2YXIgY2FuZGlkYXRlVGFiaW5kZXggPSBnZXRUYWJpbmRleChlbGVtZW50LCBpc1Njb3BlKTtcbiAgICB2YXIgZWxlbWVudHMgPSBpc1Njb3BlID8gc29ydEJ5T3JkZXIoaXRlbS5jYW5kaWRhdGVzKSA6IGVsZW1lbnQ7XG5cbiAgICBpZiAoY2FuZGlkYXRlVGFiaW5kZXggPT09IDApIHtcbiAgICAgIGlzU2NvcGUgPyByZWd1bGFyVGFiYmFibGVzLnB1c2guYXBwbHkocmVndWxhclRhYmJhYmxlcywgZWxlbWVudHMpIDogcmVndWxhclRhYmJhYmxlcy5wdXNoKGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcmRlcmVkVGFiYmFibGVzLnB1c2goe1xuICAgICAgICBkb2N1bWVudE9yZGVyOiBpLFxuICAgICAgICB0YWJJbmRleDogY2FuZGlkYXRlVGFiaW5kZXgsXG4gICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgIGlzU2NvcGU6IGlzU2NvcGUsXG4gICAgICAgIGNvbnRlbnQ6IGVsZW1lbnRzXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3JkZXJlZFRhYmJhYmxlcy5zb3J0KHNvcnRPcmRlcmVkVGFiYmFibGVzKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgc29ydGFibGUpIHtcbiAgICBzb3J0YWJsZS5pc1Njb3BlID8gYWNjLnB1c2guYXBwbHkoYWNjLCBzb3J0YWJsZS5jb250ZW50KSA6IGFjYy5wdXNoKHNvcnRhYmxlLmNvbnRlbnQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIFtdKS5jb25jYXQocmVndWxhclRhYmJhYmxlcyk7XG59O1xuXG52YXIgdGFiYmFibGUgPSBmdW5jdGlvbiB0YWJiYWJsZShlbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIGNhbmRpZGF0ZXM7XG5cbiAgaWYgKG9wdGlvbnMuZ2V0U2hhZG93Um9vdCkge1xuICAgIGNhbmRpZGF0ZXMgPSBnZXRDYW5kaWRhdGVzSXRlcmF0aXZlbHkoW2VsXSwgb3B0aW9ucy5pbmNsdWRlQ29udGFpbmVyLCB7XG4gICAgICBmaWx0ZXI6IGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZS5iaW5kKG51bGwsIG9wdGlvbnMpLFxuICAgICAgZmxhdHRlbjogZmFsc2UsXG4gICAgICBnZXRTaGFkb3dSb290OiBvcHRpb25zLmdldFNoYWRvd1Jvb3QsXG4gICAgICBzaGFkb3dSb290RmlsdGVyOiBpc1ZhbGlkU2hhZG93Um9vdFRhYmJhYmxlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgY2FuZGlkYXRlcyA9IGdldENhbmRpZGF0ZXMoZWwsIG9wdGlvbnMuaW5jbHVkZUNvbnRhaW5lciwgaXNOb2RlTWF0Y2hpbmdTZWxlY3RvclRhYmJhYmxlLmJpbmQobnVsbCwgb3B0aW9ucykpO1xuICB9XG5cbiAgcmV0dXJuIHNvcnRCeU9yZGVyKGNhbmRpZGF0ZXMpO1xufTtcblxudmFyIGZvY3VzYWJsZSA9IGZ1bmN0aW9uIGZvY3VzYWJsZShlbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIGNhbmRpZGF0ZXM7XG5cbiAgaWYgKG9wdGlvbnMuZ2V0U2hhZG93Um9vdCkge1xuICAgIGNhbmRpZGF0ZXMgPSBnZXRDYW5kaWRhdGVzSXRlcmF0aXZlbHkoW2VsXSwgb3B0aW9ucy5pbmNsdWRlQ29udGFpbmVyLCB7XG4gICAgICBmaWx0ZXI6IGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUuYmluZChudWxsLCBvcHRpb25zKSxcbiAgICAgIGZsYXR0ZW46IHRydWUsXG4gICAgICBnZXRTaGFkb3dSb290OiBvcHRpb25zLmdldFNoYWRvd1Jvb3RcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjYW5kaWRhdGVzID0gZ2V0Q2FuZGlkYXRlcyhlbCwgb3B0aW9ucy5pbmNsdWRlQ29udGFpbmVyLCBpc05vZGVNYXRjaGluZ1NlbGVjdG9yRm9jdXNhYmxlLmJpbmQobnVsbCwgb3B0aW9ucykpO1xuICB9XG5cbiAgcmV0dXJuIGNhbmRpZGF0ZXM7XG59O1xuXG52YXIgaXNUYWJiYWJsZSA9IGZ1bmN0aW9uIGlzVGFiYmFibGUobm9kZSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICBpZiAoIW5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIG5vZGUgcHJvdmlkZWQnKTtcbiAgfVxuXG4gIGlmIChtYXRjaGVzLmNhbGwobm9kZSwgY2FuZGlkYXRlU2VsZWN0b3IpID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBpc05vZGVNYXRjaGluZ1NlbGVjdG9yVGFiYmFibGUob3B0aW9ucywgbm9kZSk7XG59O1xuXG52YXIgZm9jdXNhYmxlQ2FuZGlkYXRlU2VsZWN0b3IgPSAvKiAjX19QVVJFX18gKi9jYW5kaWRhdGVTZWxlY3RvcnMuY29uY2F0KCdpZnJhbWUnKS5qb2luKCcsJyk7XG5cbnZhciBpc0ZvY3VzYWJsZSA9IGZ1bmN0aW9uIGlzRm9jdXNhYmxlKG5vZGUsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgaWYgKCFub2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBub2RlIHByb3ZpZGVkJyk7XG4gIH1cblxuICBpZiAobWF0Y2hlcy5jYWxsKG5vZGUsIGZvY3VzYWJsZUNhbmRpZGF0ZVNlbGVjdG9yKSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gaXNOb2RlTWF0Y2hpbmdTZWxlY3RvckZvY3VzYWJsZShvcHRpb25zLCBub2RlKTtcbn07XG5cbmV4cG9ydCB7IGZvY3VzYWJsZSwgaXNGb2N1c2FibGUsIGlzVGFiYmFibGUsIHRhYmJhYmxlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20uanMubWFwXG4iLCIvKiEgaHR0cHM6Ly9tdGhzLmJlL3B1bnljb2RlIHYxLjQuMSBieSBAbWF0aGlhcyAqL1xuOyhmdW5jdGlvbihyb290KSB7XG5cblx0LyoqIERldGVjdCBmcmVlIHZhcmlhYmxlcyAqL1xuXHR2YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmXG5cdFx0IWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblx0dmFyIGZyZWVNb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJlxuXHRcdCFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXHR2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsO1xuXHRpZiAoXG5cdFx0ZnJlZUdsb2JhbC5nbG9iYWwgPT09IGZyZWVHbG9iYWwgfHxcblx0XHRmcmVlR2xvYmFsLndpbmRvdyA9PT0gZnJlZUdsb2JhbCB8fFxuXHRcdGZyZWVHbG9iYWwuc2VsZiA9PT0gZnJlZUdsb2JhbFxuXHQpIHtcblx0XHRyb290ID0gZnJlZUdsb2JhbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgYHB1bnljb2RlYCBvYmplY3QuXG5cdCAqIEBuYW1lIHB1bnljb2RlXG5cdCAqIEB0eXBlIE9iamVjdFxuXHQgKi9cblx0dmFyIHB1bnljb2RlLFxuXG5cdC8qKiBIaWdoZXN0IHBvc2l0aXZlIHNpZ25lZCAzMi1iaXQgZmxvYXQgdmFsdWUgKi9cblx0bWF4SW50ID0gMjE0NzQ4MzY0NywgLy8gYWthLiAweDdGRkZGRkZGIG9yIDJeMzEtMVxuXG5cdC8qKiBCb290c3RyaW5nIHBhcmFtZXRlcnMgKi9cblx0YmFzZSA9IDM2LFxuXHR0TWluID0gMSxcblx0dE1heCA9IDI2LFxuXHRza2V3ID0gMzgsXG5cdGRhbXAgPSA3MDAsXG5cdGluaXRpYWxCaWFzID0gNzIsXG5cdGluaXRpYWxOID0gMTI4LCAvLyAweDgwXG5cdGRlbGltaXRlciA9ICctJywgLy8gJ1xceDJEJ1xuXG5cdC8qKiBSZWd1bGFyIGV4cHJlc3Npb25zICovXG5cdHJlZ2V4UHVueWNvZGUgPSAvXnhuLS0vLFxuXHRyZWdleE5vbkFTQ0lJID0gL1teXFx4MjAtXFx4N0VdLywgLy8gdW5wcmludGFibGUgQVNDSUkgY2hhcnMgKyBub24tQVNDSUkgY2hhcnNcblx0cmVnZXhTZXBhcmF0b3JzID0gL1tcXHgyRVxcdTMwMDJcXHVGRjBFXFx1RkY2MV0vZywgLy8gUkZDIDM0OTAgc2VwYXJhdG9yc1xuXG5cdC8qKiBFcnJvciBtZXNzYWdlcyAqL1xuXHRlcnJvcnMgPSB7XG5cdFx0J292ZXJmbG93JzogJ092ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzJyxcblx0XHQnbm90LWJhc2ljJzogJ0lsbGVnYWwgaW5wdXQgPj0gMHg4MCAobm90IGEgYmFzaWMgY29kZSBwb2ludCknLFxuXHRcdCdpbnZhbGlkLWlucHV0JzogJ0ludmFsaWQgaW5wdXQnXG5cdH0sXG5cblx0LyoqIENvbnZlbmllbmNlIHNob3J0Y3V0cyAqL1xuXHRiYXNlTWludXNUTWluID0gYmFzZSAtIHRNaW4sXG5cdGZsb29yID0gTWF0aC5mbG9vcixcblx0c3RyaW5nRnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZSxcblxuXHQvKiogVGVtcG9yYXJ5IHZhcmlhYmxlICovXG5cdGtleTtcblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKipcblx0ICogQSBnZW5lcmljIGVycm9yIHV0aWxpdHkgZnVuY3Rpb24uXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBlcnJvciB0eXBlLlxuXHQgKiBAcmV0dXJucyB7RXJyb3J9IFRocm93cyBhIGBSYW5nZUVycm9yYCB3aXRoIHRoZSBhcHBsaWNhYmxlIGVycm9yIG1lc3NhZ2UuXG5cdCAqL1xuXHRmdW5jdGlvbiBlcnJvcih0eXBlKSB7XG5cdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoZXJyb3JzW3R5cGVdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBIGdlbmVyaWMgYEFycmF5I21hcGAgdXRpbGl0eSBmdW5jdGlvbi5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5IGFycmF5XG5cdCAqIGl0ZW0uXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgYXJyYXkgb2YgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cblx0ICovXG5cdGZ1bmN0aW9uIG1hcChhcnJheSwgZm4pIHtcblx0XHR2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXHRcdHZhciByZXN1bHQgPSBbXTtcblx0XHR3aGlsZSAobGVuZ3RoLS0pIHtcblx0XHRcdHJlc3VsdFtsZW5ndGhdID0gZm4oYXJyYXlbbGVuZ3RoXSk7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogQSBzaW1wbGUgYEFycmF5I21hcGAtbGlrZSB3cmFwcGVyIHRvIHdvcmsgd2l0aCBkb21haW4gbmFtZSBzdHJpbmdzIG9yIGVtYWlsXG5cdCAqIGFkZHJlc3Nlcy5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGRvbWFpbiBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcy5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5XG5cdCAqIGNoYXJhY3Rlci5cblx0ICogQHJldHVybnMge0FycmF5fSBBIG5ldyBzdHJpbmcgb2YgY2hhcmFjdGVycyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2tcblx0ICogZnVuY3Rpb24uXG5cdCAqL1xuXHRmdW5jdGlvbiBtYXBEb21haW4oc3RyaW5nLCBmbikge1xuXHRcdHZhciBwYXJ0cyA9IHN0cmluZy5zcGxpdCgnQCcpO1xuXHRcdHZhciByZXN1bHQgPSAnJztcblx0XHRpZiAocGFydHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Ly8gSW4gZW1haWwgYWRkcmVzc2VzLCBvbmx5IHRoZSBkb21haW4gbmFtZSBzaG91bGQgYmUgcHVueWNvZGVkLiBMZWF2ZVxuXHRcdFx0Ly8gdGhlIGxvY2FsIHBhcnQgKGkuZS4gZXZlcnl0aGluZyB1cCB0byBgQGApIGludGFjdC5cblx0XHRcdHJlc3VsdCA9IHBhcnRzWzBdICsgJ0AnO1xuXHRcdFx0c3RyaW5nID0gcGFydHNbMV07XG5cdFx0fVxuXHRcdC8vIEF2b2lkIGBzcGxpdChyZWdleClgIGZvciBJRTggY29tcGF0aWJpbGl0eS4gU2VlICMxNy5cblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShyZWdleFNlcGFyYXRvcnMsICdcXHgyRScpO1xuXHRcdHZhciBsYWJlbHMgPSBzdHJpbmcuc3BsaXQoJy4nKTtcblx0XHR2YXIgZW5jb2RlZCA9IG1hcChsYWJlbHMsIGZuKS5qb2luKCcuJyk7XG5cdFx0cmV0dXJuIHJlc3VsdCArIGVuY29kZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBudW1lcmljIGNvZGUgcG9pbnRzIG9mIGVhY2ggVW5pY29kZVxuXHQgKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXG5cdCAqIHRoaXMgZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGEgcGFpciBvZiBzdXJyb2dhdGUgaGFsdmVzIChlYWNoIG9mIHdoaWNoXG5cdCAqIFVDUy0yIGV4cG9zZXMgYXMgc2VwYXJhdGUgY2hhcmFjdGVycykgaW50byBhIHNpbmdsZSBjb2RlIHBvaW50LFxuXHQgKiBtYXRjaGluZyBVVEYtMTYuXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZW5jb2RlYFxuXHQgKiBAc2VlIDxodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZz5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcblx0ICogQG5hbWUgZGVjb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgVGhlIFVuaWNvZGUgaW5wdXQgc3RyaW5nIChVQ1MtMikuXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gVGhlIG5ldyBhcnJheSBvZiBjb2RlIHBvaW50cy5cblx0ICovXG5cdGZ1bmN0aW9uIHVjczJkZWNvZGUoc3RyaW5nKSB7XG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBjb3VudGVyID0gMCxcblx0XHQgICAgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aCxcblx0XHQgICAgdmFsdWUsXG5cdFx0ICAgIGV4dHJhO1xuXHRcdHdoaWxlIChjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHR2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGhpZ2ggc3Vycm9nYXRlLCBhbmQgdGhlcmUgaXMgYSBuZXh0IGNoYXJhY3RlclxuXHRcdFx0XHRleHRyYSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRcdGlmICgoZXh0cmEgJiAweEZDMDApID09IDB4REMwMCkgeyAvLyBsb3cgc3Vycm9nYXRlXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2goKCh2YWx1ZSAmIDB4M0ZGKSA8PCAxMCkgKyAoZXh0cmEgJiAweDNGRikgKyAweDEwMDAwKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB1bm1hdGNoZWQgc3Vycm9nYXRlOyBvbmx5IGFwcGVuZCB0aGlzIGNvZGUgdW5pdCwgaW4gY2FzZSB0aGUgbmV4dFxuXHRcdFx0XHRcdC8vIGNvZGUgdW5pdCBpcyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpclxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdFx0XHRjb3VudGVyLS07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgc3RyaW5nIGJhc2VkIG9uIGFuIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZGVjb2RlYFxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuXHQgKiBAbmFtZSBlbmNvZGVcblx0ICogQHBhcmFtIHtBcnJheX0gY29kZVBvaW50cyBUaGUgYXJyYXkgb2YgbnVtZXJpYyBjb2RlIHBvaW50cy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIG5ldyBVbmljb2RlIHN0cmluZyAoVUNTLTIpLlxuXHQgKi9cblx0ZnVuY3Rpb24gdWNzMmVuY29kZShhcnJheSkge1xuXHRcdHJldHVybiBtYXAoYXJyYXksIGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHR2YXIgb3V0cHV0ID0gJyc7XG5cdFx0XHRpZiAodmFsdWUgPiAweEZGRkYpIHtcblx0XHRcdFx0dmFsdWUgLT0gMHgxMDAwMDtcblx0XHRcdFx0b3V0cHV0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCk7XG5cdFx0XHRcdHZhbHVlID0gMHhEQzAwIHwgdmFsdWUgJiAweDNGRjtcblx0XHRcdH1cblx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUodmFsdWUpO1xuXHRcdFx0cmV0dXJuIG91dHB1dDtcblx0XHR9KS5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIGJhc2ljIGNvZGUgcG9pbnQgaW50byBhIGRpZ2l0L2ludGVnZXIuXG5cdCAqIEBzZWUgYGRpZ2l0VG9CYXNpYygpYFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0gY29kZVBvaW50IFRoZSBiYXNpYyBudW1lcmljIGNvZGUgcG9pbnQgdmFsdWUuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludCAoZm9yIHVzZSBpblxuXHQgKiByZXByZXNlbnRpbmcgaW50ZWdlcnMpIGluIHRoZSByYW5nZSBgMGAgdG8gYGJhc2UgLSAxYCwgb3IgYGJhc2VgIGlmXG5cdCAqIHRoZSBjb2RlIHBvaW50IGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbHVlLlxuXHQgKi9cblx0ZnVuY3Rpb24gYmFzaWNUb0RpZ2l0KGNvZGVQb2ludCkge1xuXHRcdGlmIChjb2RlUG9pbnQgLSA0OCA8IDEwKSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gMjI7XG5cdFx0fVxuXHRcdGlmIChjb2RlUG9pbnQgLSA2NSA8IDI2KSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gNjU7XG5cdFx0fVxuXHRcdGlmIChjb2RlUG9pbnQgLSA5NyA8IDI2KSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gOTc7XG5cdFx0fVxuXHRcdHJldHVybiBiYXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgZGlnaXQvaW50ZWdlciBpbnRvIGEgYmFzaWMgY29kZSBwb2ludC5cblx0ICogQHNlZSBgYmFzaWNUb0RpZ2l0KClgXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBkaWdpdCBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBiYXNpYyBjb2RlIHBvaW50IHdob3NlIHZhbHVlICh3aGVuIHVzZWQgZm9yXG5cdCAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaXMgYGRpZ2l0YCwgd2hpY2ggbmVlZHMgdG8gYmUgaW4gdGhlIHJhbmdlXG5cdCAqIGAwYCB0byBgYmFzZSAtIDFgLiBJZiBgZmxhZ2AgaXMgbm9uLXplcm8sIHRoZSB1cHBlcmNhc2UgZm9ybSBpc1xuXHQgKiB1c2VkOyBlbHNlLCB0aGUgbG93ZXJjYXNlIGZvcm0gaXMgdXNlZC4gVGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZFxuXHQgKiBpZiBgZmxhZ2AgaXMgbm9uLXplcm8gYW5kIGBkaWdpdGAgaGFzIG5vIHVwcGVyY2FzZSBmb3JtLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGlnaXRUb0Jhc2ljKGRpZ2l0LCBmbGFnKSB7XG5cdFx0Ly8gIDAuLjI1IG1hcCB0byBBU0NJSSBhLi56IG9yIEEuLlpcblx0XHQvLyAyNi4uMzUgbWFwIHRvIEFTQ0lJIDAuLjlcblx0XHRyZXR1cm4gZGlnaXQgKyAyMiArIDc1ICogKGRpZ2l0IDwgMjYpIC0gKChmbGFnICE9IDApIDw8IDUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJpYXMgYWRhcHRhdGlvbiBmdW5jdGlvbiBhcyBwZXIgc2VjdGlvbiAzLjQgb2YgUkZDIDM0OTIuXG5cdCAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyI3NlY3Rpb24tMy40XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRmdW5jdGlvbiBhZGFwdChkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHtcblx0XHR2YXIgayA9IDA7XG5cdFx0ZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTtcblx0XHRkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7XG5cdFx0Zm9yICgvKiBubyBpbml0aWFsaXphdGlvbiAqLzsgZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxOyBrICs9IGJhc2UpIHtcblx0XHRcdGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzIHRvIGEgc3RyaW5nIG9mIFVuaWNvZGVcblx0ICogc3ltYm9scy5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGVjb2RlKGlucHV0KSB7XG5cdFx0Ly8gRG9uJ3QgdXNlIFVDUy0yXG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCxcblx0XHQgICAgb3V0LFxuXHRcdCAgICBpID0gMCxcblx0XHQgICAgbiA9IGluaXRpYWxOLFxuXHRcdCAgICBiaWFzID0gaW5pdGlhbEJpYXMsXG5cdFx0ICAgIGJhc2ljLFxuXHRcdCAgICBqLFxuXHRcdCAgICBpbmRleCxcblx0XHQgICAgb2xkaSxcblx0XHQgICAgdyxcblx0XHQgICAgayxcblx0XHQgICAgZGlnaXQsXG5cdFx0ICAgIHQsXG5cdFx0ICAgIC8qKiBDYWNoZWQgY2FsY3VsYXRpb24gcmVzdWx0cyAqL1xuXHRcdCAgICBiYXNlTWludXNUO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50czogbGV0IGBiYXNpY2AgYmUgdGhlIG51bWJlciBvZiBpbnB1dCBjb2RlXG5cdFx0Ly8gcG9pbnRzIGJlZm9yZSB0aGUgbGFzdCBkZWxpbWl0ZXIsIG9yIGAwYCBpZiB0aGVyZSBpcyBub25lLCB0aGVuIGNvcHlcblx0XHQvLyB0aGUgZmlyc3QgYmFzaWMgY29kZSBwb2ludHMgdG8gdGhlIG91dHB1dC5cblxuXHRcdGJhc2ljID0gaW5wdXQubGFzdEluZGV4T2YoZGVsaW1pdGVyKTtcblx0XHRpZiAoYmFzaWMgPCAwKSB7XG5cdFx0XHRiYXNpYyA9IDA7XG5cdFx0fVxuXG5cdFx0Zm9yIChqID0gMDsgaiA8IGJhc2ljOyArK2opIHtcblx0XHRcdC8vIGlmIGl0J3Mgbm90IGEgYmFzaWMgY29kZSBwb2ludFxuXHRcdFx0aWYgKGlucHV0LmNoYXJDb2RlQXQoaikgPj0gMHg4MCkge1xuXHRcdFx0XHRlcnJvcignbm90LWJhc2ljJyk7XG5cdFx0XHR9XG5cdFx0XHRvdXRwdXQucHVzaChpbnB1dC5jaGFyQ29kZUF0KGopKTtcblx0XHR9XG5cblx0XHQvLyBNYWluIGRlY29kaW5nIGxvb3A6IHN0YXJ0IGp1c3QgYWZ0ZXIgdGhlIGxhc3QgZGVsaW1pdGVyIGlmIGFueSBiYXNpYyBjb2RlXG5cdFx0Ly8gcG9pbnRzIHdlcmUgY29waWVkOyBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG90aGVyd2lzZS5cblxuXHRcdGZvciAoaW5kZXggPSBiYXNpYyA+IDAgPyBiYXNpYyArIDEgOiAwOyBpbmRleCA8IGlucHV0TGVuZ3RoOyAvKiBubyBmaW5hbCBleHByZXNzaW9uICovKSB7XG5cblx0XHRcdC8vIGBpbmRleGAgaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGNoYXJhY3RlciB0byBiZSBjb25zdW1lZC5cblx0XHRcdC8vIERlY29kZSBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGludG8gYGRlbHRhYCxcblx0XHRcdC8vIHdoaWNoIGdldHMgYWRkZWQgdG8gYGlgLiBUaGUgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZWFzaWVyXG5cdFx0XHQvLyBpZiB3ZSBpbmNyZWFzZSBgaWAgYXMgd2UgZ28sIHRoZW4gc3VidHJhY3Qgb2ZmIGl0cyBzdGFydGluZ1xuXHRcdFx0Ly8gdmFsdWUgYXQgdGhlIGVuZCB0byBvYnRhaW4gYGRlbHRhYC5cblx0XHRcdGZvciAob2xkaSA9IGksIHcgPSAxLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblxuXHRcdFx0XHRpZiAoaW5kZXggPj0gaW5wdXRMZW5ndGgpIHtcblx0XHRcdFx0XHRlcnJvcignaW52YWxpZC1pbnB1dCcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGlnaXQgPSBiYXNpY1RvRGlnaXQoaW5wdXQuY2hhckNvZGVBdChpbmRleCsrKSk7XG5cblx0XHRcdFx0aWYgKGRpZ2l0ID49IGJhc2UgfHwgZGlnaXQgPiBmbG9vcigobWF4SW50IC0gaSkgLyB3KSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aSArPSBkaWdpdCAqIHc7XG5cdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXG5cdFx0XHRcdGlmIChkaWdpdCA8IHQpIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdFx0aWYgKHcgPiBmbG9vcihtYXhJbnQgLyBiYXNlTWludXNUKSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dyAqPSBiYXNlTWludXNUO1xuXG5cdFx0XHR9XG5cblx0XHRcdG91dCA9IG91dHB1dC5sZW5ndGggKyAxO1xuXHRcdFx0YmlhcyA9IGFkYXB0KGkgLSBvbGRpLCBvdXQsIG9sZGkgPT0gMCk7XG5cblx0XHRcdC8vIGBpYCB3YXMgc3VwcG9zZWQgdG8gd3JhcCBhcm91bmQgZnJvbSBgb3V0YCB0byBgMGAsXG5cdFx0XHQvLyBpbmNyZW1lbnRpbmcgYG5gIGVhY2ggdGltZSwgc28gd2UnbGwgZml4IHRoYXQgbm93OlxuXHRcdFx0aWYgKGZsb29yKGkgLyBvdXQpID4gbWF4SW50IC0gbikge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0biArPSBmbG9vcihpIC8gb3V0KTtcblx0XHRcdGkgJT0gb3V0O1xuXG5cdFx0XHQvLyBJbnNlcnQgYG5gIGF0IHBvc2l0aW9uIGBpYCBvZiB0aGUgb3V0cHV0XG5cdFx0XHRvdXRwdXQuc3BsaWNlKGkrKywgMCwgbik7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdWNzMmVuY29kZShvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scyAoZS5nLiBhIGRvbWFpbiBuYW1lIGxhYmVsKSB0byBhXG5cdCAqIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSByZXN1bHRpbmcgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICovXG5cdGZ1bmN0aW9uIGVuY29kZShpbnB1dCkge1xuXHRcdHZhciBuLFxuXHRcdCAgICBkZWx0YSxcblx0XHQgICAgaGFuZGxlZENQQ291bnQsXG5cdFx0ICAgIGJhc2ljTGVuZ3RoLFxuXHRcdCAgICBiaWFzLFxuXHRcdCAgICBqLFxuXHRcdCAgICBtLFxuXHRcdCAgICBxLFxuXHRcdCAgICBrLFxuXHRcdCAgICB0LFxuXHRcdCAgICBjdXJyZW50VmFsdWUsXG5cdFx0ICAgIG91dHB1dCA9IFtdLFxuXHRcdCAgICAvKiogYGlucHV0TGVuZ3RoYCB3aWxsIGhvbGQgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyBpbiBgaW5wdXRgLiAqL1xuXHRcdCAgICBpbnB1dExlbmd0aCxcblx0XHQgICAgLyoqIENhY2hlZCBjYWxjdWxhdGlvbiByZXN1bHRzICovXG5cdFx0ICAgIGhhbmRsZWRDUENvdW50UGx1c09uZSxcblx0XHQgICAgYmFzZU1pbnVzVCxcblx0XHQgICAgcU1pbnVzVDtcblxuXHRcdC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIFVuaWNvZGVcblx0XHRpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpO1xuXG5cdFx0Ly8gQ2FjaGUgdGhlIGxlbmd0aFxuXHRcdGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSB0aGUgc3RhdGVcblx0XHRuID0gaW5pdGlhbE47XG5cdFx0ZGVsdGEgPSAwO1xuXHRcdGJpYXMgPSBpbml0aWFsQmlhcztcblxuXHRcdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHNcblx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0Y3VycmVudFZhbHVlID0gaW5wdXRbal07XG5cdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgMHg4MCkge1xuXHRcdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoY3VycmVudFZhbHVlKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aGFuZGxlZENQQ291bnQgPSBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7XG5cblx0XHQvLyBgaGFuZGxlZENQQ291bnRgIGlzIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgdGhhdCBoYXZlIGJlZW4gaGFuZGxlZDtcblx0XHQvLyBgYmFzaWNMZW5ndGhgIGlzIHRoZSBudW1iZXIgb2YgYmFzaWMgY29kZSBwb2ludHMuXG5cblx0XHQvLyBGaW5pc2ggdGhlIGJhc2ljIHN0cmluZyAtIGlmIGl0IGlzIG5vdCBlbXB0eSAtIHdpdGggYSBkZWxpbWl0ZXJcblx0XHRpZiAoYmFzaWNMZW5ndGgpIHtcblx0XHRcdG91dHB1dC5wdXNoKGRlbGltaXRlcik7XG5cdFx0fVxuXG5cdFx0Ly8gTWFpbiBlbmNvZGluZyBsb29wOlxuXHRcdHdoaWxlIChoYW5kbGVkQ1BDb3VudCA8IGlucHV0TGVuZ3RoKSB7XG5cblx0XHRcdC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHRcblx0XHRcdC8vIGxhcmdlciBvbmU6XG5cdFx0XHRmb3IgKG0gPSBtYXhJbnQsIGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA+PSBuICYmIGN1cnJlbnRWYWx1ZSA8IG0pIHtcblx0XHRcdFx0XHRtID0gY3VycmVudFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluY3JlYXNlIGBkZWx0YWAgZW5vdWdoIHRvIGFkdmFuY2UgdGhlIGRlY29kZXIncyA8bixpPiBzdGF0ZSB0byA8bSwwPixcblx0XHRcdC8vIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93XG5cdFx0XHRoYW5kbGVkQ1BDb3VudFBsdXNPbmUgPSBoYW5kbGVkQ1BDb3VudCArIDE7XG5cdFx0XHRpZiAobSAtIG4gPiBmbG9vcigobWF4SW50IC0gZGVsdGEpIC8gaGFuZGxlZENQQ291bnRQbHVzT25lKSkge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTtcblx0XHRcdG4gPSBtO1xuXG5cdFx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlID09IG4pIHtcblx0XHRcdFx0XHQvLyBSZXByZXNlbnQgZGVsdGEgYXMgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlclxuXHRcdFx0XHRcdGZvciAocSA9IGRlbHRhLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblx0XHRcdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXHRcdFx0XHRcdFx0aWYgKHEgPCB0KSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cU1pbnVzVCA9IHEgLSB0O1xuXHRcdFx0XHRcdFx0YmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goXG5cdFx0XHRcdFx0XHRcdHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWModCArIHFNaW51c1QgJSBiYXNlTWludXNULCAwKSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWMocSwgMCkpKTtcblx0XHRcdFx0XHRiaWFzID0gYWRhcHQoZGVsdGEsIGhhbmRsZWRDUENvdW50UGx1c09uZSwgaGFuZGxlZENQQ291bnQgPT0gYmFzaWNMZW5ndGgpO1xuXHRcdFx0XHRcdGRlbHRhID0gMDtcblx0XHRcdFx0XHQrK2hhbmRsZWRDUENvdW50O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCsrZGVsdGE7XG5cdFx0XHQrK247XG5cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dC5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzXG5cdCAqIHRvIFVuaWNvZGUuIE9ubHkgdGhlIFB1bnljb2RlZCBwYXJ0cyBvZiB0aGUgaW5wdXQgd2lsbCBiZSBjb252ZXJ0ZWQsIGkuZS5cblx0ICogaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgb24gYSBzdHJpbmcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuXG5cdCAqIGNvbnZlcnRlZCB0byBVbmljb2RlLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZWQgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0b1xuXHQgKiBjb252ZXJ0IHRvIFVuaWNvZGUuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBQdW55Y29kZVxuXHQgKiBzdHJpbmcuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b1VuaWNvZGUoaW5wdXQpIHtcblx0XHRyZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdHJldHVybiByZWdleFB1bnljb2RlLnRlc3Qoc3RyaW5nKVxuXHRcdFx0XHQ/IGRlY29kZShzdHJpbmcuc2xpY2UoNCkudG9Mb3dlckNhc2UoKSlcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBVbmljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzIHRvXG5cdCAqIFB1bnljb2RlLiBPbmx5IHRoZSBub24tQVNDSUkgcGFydHMgb2YgdGhlIGRvbWFpbiBuYW1lIHdpbGwgYmUgY29udmVydGVkLFxuXHQgKiBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCdzIGFscmVhZHkgaW5cblx0ICogQVNDSUkuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MgdG8gY29udmVydCwgYXMgYVxuXHQgKiBVbmljb2RlIHN0cmluZy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIFB1bnljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBkb21haW4gbmFtZSBvclxuXHQgKiBlbWFpbCBhZGRyZXNzLlxuXHQgKi9cblx0ZnVuY3Rpb24gdG9BU0NJSShpbnB1dCkge1xuXHRcdHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdFx0cmV0dXJuIHJlZ2V4Tm9uQVNDSUkudGVzdChzdHJpbmcpXG5cdFx0XHRcdD8gJ3huLS0nICsgZW5jb2RlKHN0cmluZylcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKiogRGVmaW5lIHRoZSBwdWJsaWMgQVBJICovXG5cdHB1bnljb2RlID0ge1xuXHRcdC8qKlxuXHRcdCAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBQdW55Y29kZS5qcyB2ZXJzaW9uIG51bWJlci5cblx0XHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0XHQgKiBAdHlwZSBTdHJpbmdcblx0XHQgKi9cblx0XHQndmVyc2lvbic6ICcxLjQuMScsXG5cdFx0LyoqXG5cdFx0ICogQW4gb2JqZWN0IG9mIG1ldGhvZHMgdG8gY29udmVydCBmcm9tIEphdmFTY3JpcHQncyBpbnRlcm5hbCBjaGFyYWN0ZXJcblx0XHQgKiByZXByZXNlbnRhdGlvbiAoVUNTLTIpIHRvIFVuaWNvZGUgY29kZSBwb2ludHMsIGFuZCBiYWNrLlxuXHRcdCAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHRcdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHRcdCAqIEB0eXBlIE9iamVjdFxuXHRcdCAqL1xuXHRcdCd1Y3MyJzoge1xuXHRcdFx0J2RlY29kZSc6IHVjczJkZWNvZGUsXG5cdFx0XHQnZW5jb2RlJzogdWNzMmVuY29kZVxuXHRcdH0sXG5cdFx0J2RlY29kZSc6IGRlY29kZSxcblx0XHQnZW5jb2RlJzogZW5jb2RlLFxuXHRcdCd0b0FTQ0lJJzogdG9BU0NJSSxcblx0XHQndG9Vbmljb2RlJzogdG9Vbmljb2RlXG5cdH07XG5cblx0LyoqIEV4cG9zZSBgcHVueWNvZGVgICovXG5cdC8vIFNvbWUgQU1EIGJ1aWxkIG9wdGltaXplcnMsIGxpa2Ugci5qcywgY2hlY2sgZm9yIHNwZWNpZmljIGNvbmRpdGlvbiBwYXR0ZXJuc1xuXHQvLyBsaWtlIHRoZSBmb2xsb3dpbmc6XG5cdGlmIChcblx0XHR0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJlxuXHRcdGRlZmluZS5hbWRcblx0KSB7XG5cdFx0ZGVmaW5lKCdwdW55Y29kZScsIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHB1bnljb2RlO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKGZyZWVFeHBvcnRzICYmIGZyZWVNb2R1bGUpIHtcblx0XHRpZiAobW9kdWxlLmV4cG9ydHMgPT0gZnJlZUV4cG9ydHMpIHtcblx0XHRcdC8vIGluIE5vZGUuanMsIGlvLmpzLCBvciBSaW5nb0pTIHYwLjguMCtcblx0XHRcdGZyZWVNb2R1bGUuZXhwb3J0cyA9IHB1bnljb2RlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBpbiBOYXJ3aGFsIG9yIFJpbmdvSlMgdjAuNy4wLVxuXHRcdFx0Zm9yIChrZXkgaW4gcHVueWNvZGUpIHtcblx0XHRcdFx0cHVueWNvZGUuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAoZnJlZUV4cG9ydHNba2V5XSA9IHB1bnljb2RlW2tleV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBpbiBSaGlubyBvciBhIHdlYiBicm93c2VyXG5cdFx0cm9vdC5wdW55Y29kZSA9IHB1bnljb2RlO1xuXHR9XG5cbn0odGhpcykpO1xuIiwiLypcbiAqIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4gKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4gKiBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbiAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbiAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbiAqIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuICogZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbiAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1NcbiAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0ZcbiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbiAqIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4gKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4gKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHB1bnljb2RlID0gcmVxdWlyZSgncHVueWNvZGUvJyk7XG5cbmZ1bmN0aW9uIFVybCgpIHtcbiAgdGhpcy5wcm90b2NvbCA9IG51bGw7XG4gIHRoaXMuc2xhc2hlcyA9IG51bGw7XG4gIHRoaXMuYXV0aCA9IG51bGw7XG4gIHRoaXMuaG9zdCA9IG51bGw7XG4gIHRoaXMucG9ydCA9IG51bGw7XG4gIHRoaXMuaG9zdG5hbWUgPSBudWxsO1xuICB0aGlzLmhhc2ggPSBudWxsO1xuICB0aGlzLnNlYXJjaCA9IG51bGw7XG4gIHRoaXMucXVlcnkgPSBudWxsO1xuICB0aGlzLnBhdGhuYW1lID0gbnVsbDtcbiAgdGhpcy5wYXRoID0gbnVsbDtcbiAgdGhpcy5ocmVmID0gbnVsbDtcbn1cblxuLy8gUmVmZXJlbmNlOiBSRkMgMzk4NiwgUkZDIDE4MDgsIFJGQyAyMzk2XG5cbi8qXG4gKiBkZWZpbmUgdGhlc2UgaGVyZSBzbyBhdCBsZWFzdCB0aGV5IG9ubHkgaGF2ZSB0byBiZVxuICogY29tcGlsZWQgb25jZSBvbiB0aGUgZmlyc3QgbW9kdWxlIGxvYWQuXG4gKi9cbnZhciBwcm90b2NvbFBhdHRlcm4gPSAvXihbYS16MC05ListXSs6KS9pLFxuICBwb3J0UGF0dGVybiA9IC86WzAtOV0qJC8sXG5cbiAgLy8gU3BlY2lhbCBjYXNlIGZvciBhIHNpbXBsZSBwYXRoIFVSTFxuICBzaW1wbGVQYXRoUGF0dGVybiA9IC9eKFxcL1xcLz8oPyFcXC8pW14/XFxzXSopKFxcP1teXFxzXSopPyQvLFxuXG4gIC8qXG4gICAqIFJGQyAyMzk2OiBjaGFyYWN0ZXJzIHJlc2VydmVkIGZvciBkZWxpbWl0aW5nIFVSTHMuXG4gICAqIFdlIGFjdHVhbGx5IGp1c3QgYXV0by1lc2NhcGUgdGhlc2UuXG4gICAqL1xuICBkZWxpbXMgPSBbXG4gICAgJzwnLCAnPicsICdcIicsICdgJywgJyAnLCAnXFxyJywgJ1xcbicsICdcXHQnXG4gIF0sXG5cbiAgLy8gUkZDIDIzOTY6IGNoYXJhY3RlcnMgbm90IGFsbG93ZWQgZm9yIHZhcmlvdXMgcmVhc29ucy5cbiAgdW53aXNlID0gW1xuICAgICd7JywgJ30nLCAnfCcsICdcXFxcJywgJ14nLCAnYCdcbiAgXS5jb25jYXQoZGVsaW1zKSxcblxuICAvLyBBbGxvd2VkIGJ5IFJGQ3MsIGJ1dCBjYXVzZSBvZiBYU1MgYXR0YWNrcy4gIEFsd2F5cyBlc2NhcGUgdGhlc2UuXG4gIGF1dG9Fc2NhcGUgPSBbJ1xcJyddLmNvbmNhdCh1bndpc2UpLFxuICAvKlxuICAgKiBDaGFyYWN0ZXJzIHRoYXQgYXJlIG5ldmVyIGV2ZXIgYWxsb3dlZCBpbiBhIGhvc3RuYW1lLlxuICAgKiBOb3RlIHRoYXQgYW55IGludmFsaWQgY2hhcnMgYXJlIGFsc28gaGFuZGxlZCwgYnV0IHRoZXNlXG4gICAqIGFyZSB0aGUgb25lcyB0aGF0IGFyZSAqZXhwZWN0ZWQqIHRvIGJlIHNlZW4sIHNvIHdlIGZhc3QtcGF0aFxuICAgKiB0aGVtLlxuICAgKi9cbiAgbm9uSG9zdENoYXJzID0gW1xuICAgICclJywgJy8nLCAnPycsICc7JywgJyMnXG4gIF0uY29uY2F0KGF1dG9Fc2NhcGUpLFxuICBob3N0RW5kaW5nQ2hhcnMgPSBbXG4gICAgJy8nLCAnPycsICcjJ1xuICBdLFxuICBob3N0bmFtZU1heExlbiA9IDI1NSxcbiAgaG9zdG5hbWVQYXJ0UGF0dGVybiA9IC9eWythLXowLTlBLVpfLV17MCw2M30kLyxcbiAgaG9zdG5hbWVQYXJ0U3RhcnQgPSAvXihbK2EtejAtOUEtWl8tXXswLDYzfSkoLiopJC8sXG4gIC8vIHByb3RvY29scyB0aGF0IGNhbiBhbGxvdyBcInVuc2FmZVwiIGFuZCBcInVud2lzZVwiIGNoYXJzLlxuICB1bnNhZmVQcm90b2NvbCA9IHtcbiAgICBqYXZhc2NyaXB0OiB0cnVlLFxuICAgICdqYXZhc2NyaXB0Oic6IHRydWVcbiAgfSxcbiAgLy8gcHJvdG9jb2xzIHRoYXQgbmV2ZXIgaGF2ZSBhIGhvc3RuYW1lLlxuICBob3N0bGVzc1Byb3RvY29sID0ge1xuICAgIGphdmFzY3JpcHQ6IHRydWUsXG4gICAgJ2phdmFzY3JpcHQ6JzogdHJ1ZVxuICB9LFxuICAvLyBwcm90b2NvbHMgdGhhdCBhbHdheXMgY29udGFpbiBhIC8vIGJpdC5cbiAgc2xhc2hlZFByb3RvY29sID0ge1xuICAgIGh0dHA6IHRydWUsXG4gICAgaHR0cHM6IHRydWUsXG4gICAgZnRwOiB0cnVlLFxuICAgIGdvcGhlcjogdHJ1ZSxcbiAgICBmaWxlOiB0cnVlLFxuICAgICdodHRwOic6IHRydWUsXG4gICAgJ2h0dHBzOic6IHRydWUsXG4gICAgJ2Z0cDonOiB0cnVlLFxuICAgICdnb3BoZXI6JzogdHJ1ZSxcbiAgICAnZmlsZTonOiB0cnVlXG4gIH0sXG4gIHF1ZXJ5c3RyaW5nID0gcmVxdWlyZSgncXMnKTtcblxuZnVuY3Rpb24gdXJsUGFyc2UodXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCkge1xuICBpZiAodXJsICYmIHR5cGVvZiB1cmwgPT09ICdvYmplY3QnICYmIHVybCBpbnN0YW5jZW9mIFVybCkgeyByZXR1cm4gdXJsOyB9XG5cbiAgdmFyIHUgPSBuZXcgVXJsKCk7XG4gIHUucGFyc2UodXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCk7XG4gIHJldHVybiB1O1xufVxuXG5VcmwucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgaWYgKHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlBhcmFtZXRlciAndXJsJyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgXCIgKyB0eXBlb2YgdXJsKTtcbiAgfVxuXG4gIC8qXG4gICAqIENvcHkgY2hyb21lLCBJRSwgb3BlcmEgYmFja3NsYXNoLWhhbmRsaW5nIGJlaGF2aW9yLlxuICAgKiBCYWNrIHNsYXNoZXMgYmVmb3JlIHRoZSBxdWVyeSBzdHJpbmcgZ2V0IGNvbnZlcnRlZCB0byBmb3J3YXJkIHNsYXNoZXNcbiAgICogU2VlOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MjU5MTZcbiAgICovXG4gIHZhciBxdWVyeUluZGV4ID0gdXJsLmluZGV4T2YoJz8nKSxcbiAgICBzcGxpdHRlciA9IHF1ZXJ5SW5kZXggIT09IC0xICYmIHF1ZXJ5SW5kZXggPCB1cmwuaW5kZXhPZignIycpID8gJz8nIDogJyMnLFxuICAgIHVTcGxpdCA9IHVybC5zcGxpdChzcGxpdHRlciksXG4gICAgc2xhc2hSZWdleCA9IC9cXFxcL2c7XG4gIHVTcGxpdFswXSA9IHVTcGxpdFswXS5yZXBsYWNlKHNsYXNoUmVnZXgsICcvJyk7XG4gIHVybCA9IHVTcGxpdC5qb2luKHNwbGl0dGVyKTtcblxuICB2YXIgcmVzdCA9IHVybDtcblxuICAvKlxuICAgKiB0cmltIGJlZm9yZSBwcm9jZWVkaW5nLlxuICAgKiBUaGlzIGlzIHRvIHN1cHBvcnQgcGFyc2Ugc3R1ZmYgbGlrZSBcIiAgaHR0cDovL2Zvby5jb20gIFxcblwiXG4gICAqL1xuICByZXN0ID0gcmVzdC50cmltKCk7XG5cbiAgaWYgKCFzbGFzaGVzRGVub3RlSG9zdCAmJiB1cmwuc3BsaXQoJyMnKS5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBUcnkgZmFzdCBwYXRoIHJlZ2V4cFxuICAgIHZhciBzaW1wbGVQYXRoID0gc2ltcGxlUGF0aFBhdHRlcm4uZXhlYyhyZXN0KTtcbiAgICBpZiAoc2ltcGxlUGF0aCkge1xuICAgICAgdGhpcy5wYXRoID0gcmVzdDtcbiAgICAgIHRoaXMuaHJlZiA9IHJlc3Q7XG4gICAgICB0aGlzLnBhdGhuYW1lID0gc2ltcGxlUGF0aFsxXTtcbiAgICAgIGlmIChzaW1wbGVQYXRoWzJdKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gc2ltcGxlUGF0aFsyXTtcbiAgICAgICAgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnlzdHJpbmcucGFyc2UodGhpcy5zZWFyY2guc3Vic3RyKDEpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5ID0gdGhpcy5zZWFyY2guc3Vic3RyKDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSAnJztcbiAgICAgICAgdGhpcy5xdWVyeSA9IHt9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XG5cbiAgdmFyIHByb3RvID0gcHJvdG9jb2xQYXR0ZXJuLmV4ZWMocmVzdCk7XG4gIGlmIChwcm90bykge1xuICAgIHByb3RvID0gcHJvdG9bMF07XG4gICAgdmFyIGxvd2VyUHJvdG8gPSBwcm90by50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMucHJvdG9jb2wgPSBsb3dlclByb3RvO1xuICAgIHJlc3QgPSByZXN0LnN1YnN0cihwcm90by5sZW5ndGgpO1xuICB9XG5cbiAgLypcbiAgICogZmlndXJlIG91dCBpZiBpdCdzIGdvdCBhIGhvc3RcbiAgICogdXNlckBzZXJ2ZXIgaXMgKmFsd2F5cyogaW50ZXJwcmV0ZWQgYXMgYSBob3N0bmFtZSwgYW5kIHVybFxuICAgKiByZXNvbHV0aW9uIHdpbGwgdHJlYXQgLy9mb28vYmFyIGFzIGhvc3Q9Zm9vLHBhdGg9YmFyIGJlY2F1c2UgdGhhdCdzXG4gICAqIGhvdyB0aGUgYnJvd3NlciByZXNvbHZlcyByZWxhdGl2ZSBVUkxzLlxuICAgKi9cbiAgaWYgKHNsYXNoZXNEZW5vdGVIb3N0IHx8IHByb3RvIHx8IHJlc3QubWF0Y2goL15cXC9cXC9bXkAvXStAW15AL10rLykpIHtcbiAgICB2YXIgc2xhc2hlcyA9IHJlc3Quc3Vic3RyKDAsIDIpID09PSAnLy8nO1xuICAgIGlmIChzbGFzaGVzICYmICEocHJvdG8gJiYgaG9zdGxlc3NQcm90b2NvbFtwcm90b10pKSB7XG4gICAgICByZXN0ID0gcmVzdC5zdWJzdHIoMik7XG4gICAgICB0aGlzLnNsYXNoZXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaG9zdGxlc3NQcm90b2NvbFtwcm90b10gJiYgKHNsYXNoZXMgfHwgKHByb3RvICYmICFzbGFzaGVkUHJvdG9jb2xbcHJvdG9dKSkpIHtcblxuICAgIC8qXG4gICAgICogdGhlcmUncyBhIGhvc3RuYW1lLlxuICAgICAqIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiAvLCA/LCA7LCBvciAjIGVuZHMgdGhlIGhvc3QuXG4gICAgICpcbiAgICAgKiBJZiB0aGVyZSBpcyBhbiBAIGluIHRoZSBob3N0bmFtZSwgdGhlbiBub24taG9zdCBjaGFycyAqYXJlKiBhbGxvd2VkXG4gICAgICogdG8gdGhlIGxlZnQgb2YgdGhlIGxhc3QgQCBzaWduLCB1bmxlc3Mgc29tZSBob3N0LWVuZGluZyBjaGFyYWN0ZXJcbiAgICAgKiBjb21lcyAqYmVmb3JlKiB0aGUgQC1zaWduLlxuICAgICAqIFVSTHMgYXJlIG9ibm94aW91cy5cbiAgICAgKlxuICAgICAqIGV4OlxuICAgICAqIGh0dHA6Ly9hQGJAYy8gPT4gdXNlcjphQGIgaG9zdDpjXG4gICAgICogaHR0cDovL2FAYj9AYyA9PiB1c2VyOmEgaG9zdDpjIHBhdGg6Lz9AY1xuICAgICAqL1xuXG4gICAgLypcbiAgICAgKiB2MC4xMiBUT0RPKGlzYWFjcyk6IFRoaXMgaXMgbm90IHF1aXRlIGhvdyBDaHJvbWUgZG9lcyB0aGluZ3MuXG4gICAgICogUmV2aWV3IG91ciB0ZXN0IGNhc2UgYWdhaW5zdCBicm93c2VycyBtb3JlIGNvbXByZWhlbnNpdmVseS5cbiAgICAgKi9cblxuICAgIC8vIGZpbmQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGFueSBob3N0RW5kaW5nQ2hhcnNcbiAgICB2YXIgaG9zdEVuZCA9IC0xO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaG9zdEVuZGluZ0NoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaGVjID0gcmVzdC5pbmRleE9mKGhvc3RFbmRpbmdDaGFyc1tpXSk7XG4gICAgICBpZiAoaGVjICE9PSAtMSAmJiAoaG9zdEVuZCA9PT0gLTEgfHwgaGVjIDwgaG9zdEVuZCkpIHsgaG9zdEVuZCA9IGhlYzsgfVxuICAgIH1cblxuICAgIC8qXG4gICAgICogYXQgdGhpcyBwb2ludCwgZWl0aGVyIHdlIGhhdmUgYW4gZXhwbGljaXQgcG9pbnQgd2hlcmUgdGhlXG4gICAgICogYXV0aCBwb3J0aW9uIGNhbm5vdCBnbyBwYXN0LCBvciB0aGUgbGFzdCBAIGNoYXIgaXMgdGhlIGRlY2lkZXIuXG4gICAgICovXG4gICAgdmFyIGF1dGgsIGF0U2lnbjtcbiAgICBpZiAoaG9zdEVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIGF0U2lnbiBjYW4gYmUgYW55d2hlcmUuXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qXG4gICAgICAgKiBhdFNpZ24gbXVzdCBiZSBpbiBhdXRoIHBvcnRpb24uXG4gICAgICAgKiBodHRwOi8vYUBiL2NAZCA9PiBob3N0OmIgYXV0aDphIHBhdGg6L2NAZFxuICAgICAgICovXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJywgaG9zdEVuZCk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBOb3cgd2UgaGF2ZSBhIHBvcnRpb24gd2hpY2ggaXMgZGVmaW5pdGVseSB0aGUgYXV0aC5cbiAgICAgKiBQdWxsIHRoYXQgb2ZmLlxuICAgICAqL1xuICAgIGlmIChhdFNpZ24gIT09IC0xKSB7XG4gICAgICBhdXRoID0gcmVzdC5zbGljZSgwLCBhdFNpZ24pO1xuICAgICAgcmVzdCA9IHJlc3Quc2xpY2UoYXRTaWduICsgMSk7XG4gICAgICB0aGlzLmF1dGggPSBkZWNvZGVVUklDb21wb25lbnQoYXV0aCk7XG4gICAgfVxuXG4gICAgLy8gdGhlIGhvc3QgaXMgdGhlIHJlbWFpbmluZyB0byB0aGUgbGVmdCBvZiB0aGUgZmlyc3Qgbm9uLWhvc3QgY2hhclxuICAgIGhvc3RFbmQgPSAtMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vbkhvc3RDaGFycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhlYyA9IHJlc3QuaW5kZXhPZihub25Ib3N0Q2hhcnNbaV0pO1xuICAgICAgaWYgKGhlYyAhPT0gLTEgJiYgKGhvc3RFbmQgPT09IC0xIHx8IGhlYyA8IGhvc3RFbmQpKSB7IGhvc3RFbmQgPSBoZWM7IH1cbiAgICB9XG4gICAgLy8gaWYgd2Ugc3RpbGwgaGF2ZSBub3QgaGl0IGl0LCB0aGVuIHRoZSBlbnRpcmUgdGhpbmcgaXMgYSBob3N0LlxuICAgIGlmIChob3N0RW5kID09PSAtMSkgeyBob3N0RW5kID0gcmVzdC5sZW5ndGg7IH1cblxuICAgIHRoaXMuaG9zdCA9IHJlc3Quc2xpY2UoMCwgaG9zdEVuZCk7XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoaG9zdEVuZCk7XG5cbiAgICAvLyBwdWxsIG91dCBwb3J0LlxuICAgIHRoaXMucGFyc2VIb3N0KCk7XG5cbiAgICAvKlxuICAgICAqIHdlJ3ZlIGluZGljYXRlZCB0aGF0IHRoZXJlIGlzIGEgaG9zdG5hbWUsXG4gICAgICogc28gZXZlbiBpZiBpdCdzIGVtcHR5LCBpdCBoYXMgdG8gYmUgcHJlc2VudC5cbiAgICAgKi9cbiAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZSB8fCAnJztcblxuICAgIC8qXG4gICAgICogaWYgaG9zdG5hbWUgYmVnaW5zIHdpdGggWyBhbmQgZW5kcyB3aXRoIF1cbiAgICAgKiBhc3N1bWUgdGhhdCBpdCdzIGFuIElQdjYgYWRkcmVzcy5cbiAgICAgKi9cbiAgICB2YXIgaXB2Nkhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZVswXSA9PT0gJ1snICYmIHRoaXMuaG9zdG5hbWVbdGhpcy5ob3N0bmFtZS5sZW5ndGggLSAxXSA9PT0gJ10nO1xuXG4gICAgLy8gdmFsaWRhdGUgYSBsaXR0bGUuXG4gICAgaWYgKCFpcHY2SG9zdG5hbWUpIHtcbiAgICAgIHZhciBob3N0cGFydHMgPSB0aGlzLmhvc3RuYW1lLnNwbGl0KC9cXC4vKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gaG9zdHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB2YXIgcGFydCA9IGhvc3RwYXJ0c1tpXTtcbiAgICAgICAgaWYgKCFwYXJ0KSB7IGNvbnRpbnVlOyB9XG4gICAgICAgIGlmICghcGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgIHZhciBuZXdwYXJ0ID0gJyc7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGsgPSBwYXJ0Lmxlbmd0aDsgaiA8IGs7IGorKykge1xuICAgICAgICAgICAgaWYgKHBhcnQuY2hhckNvZGVBdChqKSA+IDEyNykge1xuICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgKiB3ZSByZXBsYWNlIG5vbi1BU0NJSSBjaGFyIHdpdGggYSB0ZW1wb3JhcnkgcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICogd2UgbmVlZCB0aGlzIHRvIG1ha2Ugc3VyZSBzaXplIG9mIGhvc3RuYW1lIGlzIG5vdFxuICAgICAgICAgICAgICAgKiBicm9rZW4gYnkgcmVwbGFjaW5nIG5vbi1BU0NJSSBieSBub3RoaW5nXG4gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICBuZXdwYXJ0ICs9ICd4JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5ld3BhcnQgKz0gcGFydFtqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gd2UgdGVzdCBhZ2FpbiB3aXRoIEFTQ0lJIGNoYXIgb25seVxuICAgICAgICAgIGlmICghbmV3cGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgICAgdmFyIHZhbGlkUGFydHMgPSBob3N0cGFydHMuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICB2YXIgbm90SG9zdCA9IGhvc3RwYXJ0cy5zbGljZShpICsgMSk7XG4gICAgICAgICAgICB2YXIgYml0ID0gcGFydC5tYXRjaChob3N0bmFtZVBhcnRTdGFydCk7XG4gICAgICAgICAgICBpZiAoYml0KSB7XG4gICAgICAgICAgICAgIHZhbGlkUGFydHMucHVzaChiaXRbMV0pO1xuICAgICAgICAgICAgICBub3RIb3N0LnVuc2hpZnQoYml0WzJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub3RIb3N0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXN0ID0gJy8nICsgbm90SG9zdC5qb2luKCcuJykgKyByZXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ob3N0bmFtZSA9IHZhbGlkUGFydHMuam9pbignLicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaG9zdG5hbWUubGVuZ3RoID4gaG9zdG5hbWVNYXhMZW4pIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaG9zdG5hbWVzIGFyZSBhbHdheXMgbG93ZXIgY2FzZS5cbiAgICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFpcHY2SG9zdG5hbWUpIHtcbiAgICAgIC8qXG4gICAgICAgKiBJRE5BIFN1cHBvcnQ6IFJldHVybnMgYSBwdW55Y29kZWQgcmVwcmVzZW50YXRpb24gb2YgXCJkb21haW5cIi5cbiAgICAgICAqIEl0IG9ubHkgY29udmVydHMgcGFydHMgb2YgdGhlIGRvbWFpbiBuYW1lIHRoYXRcbiAgICAgICAqIGhhdmUgbm9uLUFTQ0lJIGNoYXJhY3RlcnMsIGkuZS4gaXQgZG9lc24ndCBtYXR0ZXIgaWZcbiAgICAgICAqIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCBhbHJlYWR5IGlzIEFTQ0lJLW9ubHkuXG4gICAgICAgKi9cbiAgICAgIHRoaXMuaG9zdG5hbWUgPSBwdW55Y29kZS50b0FTQ0lJKHRoaXMuaG9zdG5hbWUpO1xuICAgIH1cblxuICAgIHZhciBwID0gdGhpcy5wb3J0ID8gJzonICsgdGhpcy5wb3J0IDogJyc7XG4gICAgdmFyIGggPSB0aGlzLmhvc3RuYW1lIHx8ICcnO1xuICAgIHRoaXMuaG9zdCA9IGggKyBwO1xuICAgIHRoaXMuaHJlZiArPSB0aGlzLmhvc3Q7XG5cbiAgICAvKlxuICAgICAqIHN0cmlwIFsgYW5kIF0gZnJvbSB0aGUgaG9zdG5hbWVcbiAgICAgKiB0aGUgaG9zdCBmaWVsZCBzdGlsbCByZXRhaW5zIHRoZW0sIHRob3VnaFxuICAgICAqL1xuICAgIGlmIChpcHY2SG9zdG5hbWUpIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnN1YnN0cigxLCB0aGlzLmhvc3RuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgaWYgKHJlc3RbMF0gIT09ICcvJykge1xuICAgICAgICByZXN0ID0gJy8nICsgcmVzdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKlxuICAgKiBub3cgcmVzdCBpcyBzZXQgdG8gdGhlIHBvc3QtaG9zdCBzdHVmZi5cbiAgICogY2hvcCBvZmYgYW55IGRlbGltIGNoYXJzLlxuICAgKi9cbiAgaWYgKCF1bnNhZmVQcm90b2NvbFtsb3dlclByb3RvXSkge1xuXG4gICAgLypcbiAgICAgKiBGaXJzdCwgbWFrZSAxMDAlIHN1cmUgdGhhdCBhbnkgXCJhdXRvRXNjYXBlXCIgY2hhcnMgZ2V0XG4gICAgICogZXNjYXBlZCwgZXZlbiBpZiBlbmNvZGVVUklDb21wb25lbnQgZG9lc24ndCB0aGluayB0aGV5XG4gICAgICogbmVlZCB0byBiZS5cbiAgICAgKi9cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGF1dG9Fc2NhcGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgYWUgPSBhdXRvRXNjYXBlW2ldO1xuICAgICAgaWYgKHJlc3QuaW5kZXhPZihhZSkgPT09IC0xKSB7IGNvbnRpbnVlOyB9XG4gICAgICB2YXIgZXNjID0gZW5jb2RlVVJJQ29tcG9uZW50KGFlKTtcbiAgICAgIGlmIChlc2MgPT09IGFlKSB7XG4gICAgICAgIGVzYyA9IGVzY2FwZShhZSk7XG4gICAgICB9XG4gICAgICByZXN0ID0gcmVzdC5zcGxpdChhZSkuam9pbihlc2MpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNob3Agb2ZmIGZyb20gdGhlIHRhaWwgZmlyc3QuXG4gIHZhciBoYXNoID0gcmVzdC5pbmRleE9mKCcjJyk7XG4gIGlmIChoYXNoICE9PSAtMSkge1xuICAgIC8vIGdvdCBhIGZyYWdtZW50IHN0cmluZy5cbiAgICB0aGlzLmhhc2ggPSByZXN0LnN1YnN0cihoYXNoKTtcbiAgICByZXN0ID0gcmVzdC5zbGljZSgwLCBoYXNoKTtcbiAgfVxuICB2YXIgcW0gPSByZXN0LmluZGV4T2YoJz8nKTtcbiAgaWYgKHFtICE9PSAtMSkge1xuICAgIHRoaXMuc2VhcmNoID0gcmVzdC5zdWJzdHIocW0pO1xuICAgIHRoaXMucXVlcnkgPSByZXN0LnN1YnN0cihxbSArIDEpO1xuICAgIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnlzdHJpbmcucGFyc2UodGhpcy5xdWVyeSk7XG4gICAgfVxuICAgIHJlc3QgPSByZXN0LnNsaWNlKDAsIHFtKTtcbiAgfSBlbHNlIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgLy8gbm8gcXVlcnkgc3RyaW5nLCBidXQgcGFyc2VRdWVyeVN0cmluZyBzdGlsbCByZXF1ZXN0ZWRcbiAgICB0aGlzLnNlYXJjaCA9ICcnO1xuICAgIHRoaXMucXVlcnkgPSB7fTtcbiAgfVxuICBpZiAocmVzdCkgeyB0aGlzLnBhdGhuYW1lID0gcmVzdDsgfVxuICBpZiAoc2xhc2hlZFByb3RvY29sW2xvd2VyUHJvdG9dICYmIHRoaXMuaG9zdG5hbWUgJiYgIXRoaXMucGF0aG5hbWUpIHtcbiAgICB0aGlzLnBhdGhuYW1lID0gJy8nO1xuICB9XG5cbiAgLy8gdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgaWYgKHRoaXMucGF0aG5hbWUgfHwgdGhpcy5zZWFyY2gpIHtcbiAgICB2YXIgcCA9IHRoaXMucGF0aG5hbWUgfHwgJyc7XG4gICAgdmFyIHMgPSB0aGlzLnNlYXJjaCB8fCAnJztcbiAgICB0aGlzLnBhdGggPSBwICsgcztcbiAgfVxuXG4gIC8vIGZpbmFsbHksIHJlY29uc3RydWN0IHRoZSBocmVmIGJhc2VkIG9uIHdoYXQgaGFzIGJlZW4gdmFsaWRhdGVkLlxuICB0aGlzLmhyZWYgPSB0aGlzLmZvcm1hdCgpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGZvcm1hdCBhIHBhcnNlZCBvYmplY3QgaW50byBhIHVybCBzdHJpbmdcbmZ1bmN0aW9uIHVybEZvcm1hdChvYmopIHtcbiAgLypcbiAgICogZW5zdXJlIGl0J3MgYW4gb2JqZWN0LCBhbmQgbm90IGEgc3RyaW5nIHVybC5cbiAgICogSWYgaXQncyBhbiBvYmosIHRoaXMgaXMgYSBuby1vcC5cbiAgICogdGhpcyB3YXksIHlvdSBjYW4gY2FsbCB1cmxfZm9ybWF0KCkgb24gc3RyaW5nc1xuICAgKiB0byBjbGVhbiB1cCBwb3RlbnRpYWxseSB3b25reSB1cmxzLlxuICAgKi9cbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7IG9iaiA9IHVybFBhcnNlKG9iaik7IH1cbiAgaWYgKCEob2JqIGluc3RhbmNlb2YgVXJsKSkgeyByZXR1cm4gVXJsLnByb3RvdHlwZS5mb3JtYXQuY2FsbChvYmopOyB9XG4gIHJldHVybiBvYmouZm9ybWF0KCk7XG59XG5cblVybC5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgYXV0aCA9IHRoaXMuYXV0aCB8fCAnJztcbiAgaWYgKGF1dGgpIHtcbiAgICBhdXRoID0gZW5jb2RlVVJJQ29tcG9uZW50KGF1dGgpO1xuICAgIGF1dGggPSBhdXRoLnJlcGxhY2UoLyUzQS9pLCAnOicpO1xuICAgIGF1dGggKz0gJ0AnO1xuICB9XG5cbiAgdmFyIHByb3RvY29sID0gdGhpcy5wcm90b2NvbCB8fCAnJyxcbiAgICBwYXRobmFtZSA9IHRoaXMucGF0aG5hbWUgfHwgJycsXG4gICAgaGFzaCA9IHRoaXMuaGFzaCB8fCAnJyxcbiAgICBob3N0ID0gZmFsc2UsXG4gICAgcXVlcnkgPSAnJztcblxuICBpZiAodGhpcy5ob3N0KSB7XG4gICAgaG9zdCA9IGF1dGggKyB0aGlzLmhvc3Q7XG4gIH0gZWxzZSBpZiAodGhpcy5ob3N0bmFtZSkge1xuICAgIGhvc3QgPSBhdXRoICsgKHRoaXMuaG9zdG5hbWUuaW5kZXhPZignOicpID09PSAtMSA/IHRoaXMuaG9zdG5hbWUgOiAnWycgKyB0aGlzLmhvc3RuYW1lICsgJ10nKTtcbiAgICBpZiAodGhpcy5wb3J0KSB7XG4gICAgICBob3N0ICs9ICc6JyArIHRoaXMucG9ydDtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5xdWVyeSAmJiB0eXBlb2YgdGhpcy5xdWVyeSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXModGhpcy5xdWVyeSkubGVuZ3RoKSB7XG4gICAgcXVlcnkgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkodGhpcy5xdWVyeSwge1xuICAgICAgYXJyYXlGb3JtYXQ6ICdyZXBlYXQnLFxuICAgICAgYWRkUXVlcnlQcmVmaXg6IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICB2YXIgc2VhcmNoID0gdGhpcy5zZWFyY2ggfHwgKHF1ZXJ5ICYmICgnPycgKyBxdWVyeSkpIHx8ICcnO1xuXG4gIGlmIChwcm90b2NvbCAmJiBwcm90b2NvbC5zdWJzdHIoLTEpICE9PSAnOicpIHsgcHJvdG9jb2wgKz0gJzonOyB9XG5cbiAgLypcbiAgICogb25seSB0aGUgc2xhc2hlZFByb3RvY29scyBnZXQgdGhlIC8vLiAgTm90IG1haWx0bzosIHhtcHA6LCBldGMuXG4gICAqIHVubGVzcyB0aGV5IGhhZCB0aGVtIHRvIGJlZ2luIHdpdGguXG4gICAqL1xuICBpZiAodGhpcy5zbGFzaGVzIHx8ICghcHJvdG9jb2wgfHwgc2xhc2hlZFByb3RvY29sW3Byb3RvY29sXSkgJiYgaG9zdCAhPT0gZmFsc2UpIHtcbiAgICBob3N0ID0gJy8vJyArIChob3N0IHx8ICcnKTtcbiAgICBpZiAocGF0aG5hbWUgJiYgcGF0aG5hbWUuY2hhckF0KDApICE9PSAnLycpIHsgcGF0aG5hbWUgPSAnLycgKyBwYXRobmFtZTsgfVxuICB9IGVsc2UgaWYgKCFob3N0KSB7XG4gICAgaG9zdCA9ICcnO1xuICB9XG5cbiAgaWYgKGhhc2ggJiYgaGFzaC5jaGFyQXQoMCkgIT09ICcjJykgeyBoYXNoID0gJyMnICsgaGFzaDsgfVxuICBpZiAoc2VhcmNoICYmIHNlYXJjaC5jaGFyQXQoMCkgIT09ICc/JykgeyBzZWFyY2ggPSAnPycgKyBzZWFyY2g7IH1cblxuICBwYXRobmFtZSA9IHBhdGhuYW1lLnJlcGxhY2UoL1s/I10vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChtYXRjaCk7XG4gIH0pO1xuICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgnIycsICclMjMnKTtcblxuICByZXR1cm4gcHJvdG9jb2wgKyBob3N0ICsgcGF0aG5hbWUgKyBzZWFyY2ggKyBoYXNoO1xufTtcblxuZnVuY3Rpb24gdXJsUmVzb2x2ZShzb3VyY2UsIHJlbGF0aXZlKSB7XG4gIHJldHVybiB1cmxQYXJzZShzb3VyY2UsIGZhbHNlLCB0cnVlKS5yZXNvbHZlKHJlbGF0aXZlKTtcbn1cblxuVXJsLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24gKHJlbGF0aXZlKSB7XG4gIHJldHVybiB0aGlzLnJlc29sdmVPYmplY3QodXJsUGFyc2UocmVsYXRpdmUsIGZhbHNlLCB0cnVlKSkuZm9ybWF0KCk7XG59O1xuXG5mdW5jdGlvbiB1cmxSZXNvbHZlT2JqZWN0KHNvdXJjZSwgcmVsYXRpdmUpIHtcbiAgaWYgKCFzb3VyY2UpIHsgcmV0dXJuIHJlbGF0aXZlOyB9XG4gIHJldHVybiB1cmxQYXJzZShzb3VyY2UsIGZhbHNlLCB0cnVlKS5yZXNvbHZlT2JqZWN0KHJlbGF0aXZlKTtcbn1cblxuVXJsLnByb3RvdHlwZS5yZXNvbHZlT2JqZWN0ID0gZnVuY3Rpb24gKHJlbGF0aXZlKSB7XG4gIGlmICh0eXBlb2YgcmVsYXRpdmUgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIHJlbCA9IG5ldyBVcmwoKTtcbiAgICByZWwucGFyc2UocmVsYXRpdmUsIGZhbHNlLCB0cnVlKTtcbiAgICByZWxhdGl2ZSA9IHJlbDtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSBuZXcgVXJsKCk7XG4gIHZhciB0a2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpO1xuICBmb3IgKHZhciB0ayA9IDA7IHRrIDwgdGtleXMubGVuZ3RoOyB0aysrKSB7XG4gICAgdmFyIHRrZXkgPSB0a2V5c1t0a107XG4gICAgcmVzdWx0W3RrZXldID0gdGhpc1t0a2V5XTtcbiAgfVxuXG4gIC8qXG4gICAqIGhhc2ggaXMgYWx3YXlzIG92ZXJyaWRkZW4sIG5vIG1hdHRlciB3aGF0LlxuICAgKiBldmVuIGhyZWY9XCJcIiB3aWxsIHJlbW92ZSBpdC5cbiAgICovXG4gIHJlc3VsdC5oYXNoID0gcmVsYXRpdmUuaGFzaDtcblxuICAvLyBpZiB0aGUgcmVsYXRpdmUgdXJsIGlzIGVtcHR5LCB0aGVuIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvIGhlcmUuXG4gIGlmIChyZWxhdGl2ZS5ocmVmID09PSAnJykge1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBocmVmcyBsaWtlIC8vZm9vL2JhciBhbHdheXMgY3V0IHRvIHRoZSBwcm90b2NvbC5cbiAgaWYgKHJlbGF0aXZlLnNsYXNoZXMgJiYgIXJlbGF0aXZlLnByb3RvY29sKSB7XG4gICAgLy8gdGFrZSBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgcHJvdG9jb2wgZnJvbSByZWxhdGl2ZVxuICAgIHZhciBya2V5cyA9IE9iamVjdC5rZXlzKHJlbGF0aXZlKTtcbiAgICBmb3IgKHZhciByayA9IDA7IHJrIDwgcmtleXMubGVuZ3RoOyByaysrKSB7XG4gICAgICB2YXIgcmtleSA9IHJrZXlzW3JrXTtcbiAgICAgIGlmIChya2V5ICE9PSAncHJvdG9jb2wnKSB7IHJlc3VsdFtya2V5XSA9IHJlbGF0aXZlW3JrZXldOyB9XG4gICAgfVxuXG4gICAgLy8gdXJsUGFyc2UgYXBwZW5kcyB0cmFpbGluZyAvIHRvIHVybHMgbGlrZSBodHRwOi8vd3d3LmV4YW1wbGUuY29tXG4gICAgaWYgKHNsYXNoZWRQcm90b2NvbFtyZXN1bHQucHJvdG9jb2xdICYmIHJlc3VsdC5ob3N0bmFtZSAmJiAhcmVzdWx0LnBhdGhuYW1lKSB7XG4gICAgICByZXN1bHQucGF0aG5hbWUgPSAnLyc7XG4gICAgICByZXN1bHQucGF0aCA9IHJlc3VsdC5wYXRobmFtZTtcbiAgICB9XG5cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKHJlbGF0aXZlLnByb3RvY29sICYmIHJlbGF0aXZlLnByb3RvY29sICE9PSByZXN1bHQucHJvdG9jb2wpIHtcbiAgICAvKlxuICAgICAqIGlmIGl0J3MgYSBrbm93biB1cmwgcHJvdG9jb2wsIHRoZW4gY2hhbmdpbmdcbiAgICAgKiB0aGUgcHJvdG9jb2wgZG9lcyB3ZWlyZCB0aGluZ3NcbiAgICAgKiBmaXJzdCwgaWYgaXQncyBub3QgZmlsZTosIHRoZW4gd2UgTVVTVCBoYXZlIGEgaG9zdCxcbiAgICAgKiBhbmQgaWYgdGhlcmUgd2FzIGEgcGF0aFxuICAgICAqIHRvIGJlZ2luIHdpdGgsIHRoZW4gd2UgTVVTVCBoYXZlIGEgcGF0aC5cbiAgICAgKiBpZiBpdCBpcyBmaWxlOiwgdGhlbiB0aGUgaG9zdCBpcyBkcm9wcGVkLFxuICAgICAqIGJlY2F1c2UgdGhhdCdzIGtub3duIHRvIGJlIGhvc3RsZXNzLlxuICAgICAqIGFueXRoaW5nIGVsc2UgaXMgYXNzdW1lZCB0byBiZSBhYnNvbHV0ZS5cbiAgICAgKi9cbiAgICBpZiAoIXNsYXNoZWRQcm90b2NvbFtyZWxhdGl2ZS5wcm90b2NvbF0pIHtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocmVsYXRpdmUpO1xuICAgICAgZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzLmxlbmd0aDsgdisrKSB7XG4gICAgICAgIHZhciBrID0ga2V5c1t2XTtcbiAgICAgICAgcmVzdWx0W2tdID0gcmVsYXRpdmVba107XG4gICAgICB9XG4gICAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmVzdWx0LnByb3RvY29sID0gcmVsYXRpdmUucHJvdG9jb2w7XG4gICAgaWYgKCFyZWxhdGl2ZS5ob3N0ICYmICFob3N0bGVzc1Byb3RvY29sW3JlbGF0aXZlLnByb3RvY29sXSkge1xuICAgICAgdmFyIHJlbFBhdGggPSAocmVsYXRpdmUucGF0aG5hbWUgfHwgJycpLnNwbGl0KCcvJyk7XG4gICAgICB3aGlsZSAocmVsUGF0aC5sZW5ndGggJiYgIShyZWxhdGl2ZS5ob3N0ID0gcmVsUGF0aC5zaGlmdCgpKSkgeyB9XG4gICAgICBpZiAoIXJlbGF0aXZlLmhvc3QpIHsgcmVsYXRpdmUuaG9zdCA9ICcnOyB9XG4gICAgICBpZiAoIXJlbGF0aXZlLmhvc3RuYW1lKSB7IHJlbGF0aXZlLmhvc3RuYW1lID0gJyc7IH1cbiAgICAgIGlmIChyZWxQYXRoWzBdICE9PSAnJykgeyByZWxQYXRoLnVuc2hpZnQoJycpOyB9XG4gICAgICBpZiAocmVsUGF0aC5sZW5ndGggPCAyKSB7IHJlbFBhdGgudW5zaGlmdCgnJyk7IH1cbiAgICAgIHJlc3VsdC5wYXRobmFtZSA9IHJlbFBhdGguam9pbignLycpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucGF0aG5hbWUgPSByZWxhdGl2ZS5wYXRobmFtZTtcbiAgICB9XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICByZXN1bHQuaG9zdCA9IHJlbGF0aXZlLmhvc3QgfHwgJyc7XG4gICAgcmVzdWx0LmF1dGggPSByZWxhdGl2ZS5hdXRoO1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlbGF0aXZlLmhvc3RuYW1lIHx8IHJlbGF0aXZlLmhvc3Q7XG4gICAgcmVzdWx0LnBvcnQgPSByZWxhdGl2ZS5wb3J0O1xuICAgIC8vIHRvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKHJlc3VsdC5wYXRobmFtZSB8fCByZXN1bHQuc2VhcmNoKSB7XG4gICAgICB2YXIgcCA9IHJlc3VsdC5wYXRobmFtZSB8fCAnJztcbiAgICAgIHZhciBzID0gcmVzdWx0LnNlYXJjaCB8fCAnJztcbiAgICAgIHJlc3VsdC5wYXRoID0gcCArIHM7XG4gICAgfVxuICAgIHJlc3VsdC5zbGFzaGVzID0gcmVzdWx0LnNsYXNoZXMgfHwgcmVsYXRpdmUuc2xhc2hlcztcbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdmFyIGlzU291cmNlQWJzID0gcmVzdWx0LnBhdGhuYW1lICYmIHJlc3VsdC5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJyxcbiAgICBpc1JlbEFicyA9IHJlbGF0aXZlLmhvc3QgfHwgcmVsYXRpdmUucGF0aG5hbWUgJiYgcmVsYXRpdmUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycsXG4gICAgbXVzdEVuZEFicyA9IGlzUmVsQWJzIHx8IGlzU291cmNlQWJzIHx8IChyZXN1bHQuaG9zdCAmJiByZWxhdGl2ZS5wYXRobmFtZSksXG4gICAgcmVtb3ZlQWxsRG90cyA9IG11c3RFbmRBYnMsXG4gICAgc3JjUGF0aCA9IHJlc3VsdC5wYXRobmFtZSAmJiByZXN1bHQucGF0aG5hbWUuc3BsaXQoJy8nKSB8fCBbXSxcbiAgICByZWxQYXRoID0gcmVsYXRpdmUucGF0aG5hbWUgJiYgcmVsYXRpdmUucGF0aG5hbWUuc3BsaXQoJy8nKSB8fCBbXSxcbiAgICBwc3ljaG90aWMgPSByZXN1bHQucHJvdG9jb2wgJiYgIXNsYXNoZWRQcm90b2NvbFtyZXN1bHQucHJvdG9jb2xdO1xuXG4gIC8qXG4gICAqIGlmIHRoZSB1cmwgaXMgYSBub24tc2xhc2hlZCB1cmwsIHRoZW4gcmVsYXRpdmVcbiAgICogbGlua3MgbGlrZSAuLi8uLiBzaG91bGQgYmUgYWJsZVxuICAgKiB0byBjcmF3bCB1cCB0byB0aGUgaG9zdG5hbWUsIGFzIHdlbGwuICBUaGlzIGlzIHN0cmFuZ2UuXG4gICAqIHJlc3VsdC5wcm90b2NvbCBoYXMgYWxyZWFkeSBiZWVuIHNldCBieSBub3cuXG4gICAqIExhdGVyIG9uLCBwdXQgdGhlIGZpcnN0IHBhdGggcGFydCBpbnRvIHRoZSBob3N0IGZpZWxkLlxuICAgKi9cbiAgaWYgKHBzeWNob3RpYykge1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9ICcnO1xuICAgIHJlc3VsdC5wb3J0ID0gbnVsbDtcbiAgICBpZiAocmVzdWx0Lmhvc3QpIHtcbiAgICAgIGlmIChzcmNQYXRoWzBdID09PSAnJykgeyBzcmNQYXRoWzBdID0gcmVzdWx0Lmhvc3Q7IH0gZWxzZSB7IHNyY1BhdGgudW5zaGlmdChyZXN1bHQuaG9zdCk7IH1cbiAgICB9XG4gICAgcmVzdWx0Lmhvc3QgPSAnJztcbiAgICBpZiAocmVsYXRpdmUucHJvdG9jb2wpIHtcbiAgICAgIHJlbGF0aXZlLmhvc3RuYW1lID0gbnVsbDtcbiAgICAgIHJlbGF0aXZlLnBvcnQgPSBudWxsO1xuICAgICAgaWYgKHJlbGF0aXZlLmhvc3QpIHtcbiAgICAgICAgaWYgKHJlbFBhdGhbMF0gPT09ICcnKSB7IHJlbFBhdGhbMF0gPSByZWxhdGl2ZS5ob3N0OyB9IGVsc2UgeyByZWxQYXRoLnVuc2hpZnQocmVsYXRpdmUuaG9zdCk7IH1cbiAgICAgIH1cbiAgICAgIHJlbGF0aXZlLmhvc3QgPSBudWxsO1xuICAgIH1cbiAgICBtdXN0RW5kQWJzID0gbXVzdEVuZEFicyAmJiAocmVsUGF0aFswXSA9PT0gJycgfHwgc3JjUGF0aFswXSA9PT0gJycpO1xuICB9XG5cbiAgaWYgKGlzUmVsQWJzKSB7XG4gICAgLy8gaXQncyBhYnNvbHV0ZS5cbiAgICByZXN1bHQuaG9zdCA9IHJlbGF0aXZlLmhvc3QgfHwgcmVsYXRpdmUuaG9zdCA9PT0gJycgPyByZWxhdGl2ZS5ob3N0IDogcmVzdWx0Lmhvc3Q7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdG5hbWUgPT09ICcnID8gcmVsYXRpdmUuaG9zdG5hbWUgOiByZXN1bHQuaG9zdG5hbWU7XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICBzcmNQYXRoID0gcmVsUGF0aDtcbiAgICAvLyBmYWxsIHRocm91Z2ggdG8gdGhlIGRvdC1oYW5kbGluZyBiZWxvdy5cbiAgfSBlbHNlIGlmIChyZWxQYXRoLmxlbmd0aCkge1xuICAgIC8qXG4gICAgICogaXQncyByZWxhdGl2ZVxuICAgICAqIHRocm93IGF3YXkgdGhlIGV4aXN0aW5nIGZpbGUsIGFuZCB0YWtlIHRoZSBuZXcgcGF0aCBpbnN0ZWFkLlxuICAgICAqL1xuICAgIGlmICghc3JjUGF0aCkgeyBzcmNQYXRoID0gW107IH1cbiAgICBzcmNQYXRoLnBvcCgpO1xuICAgIHNyY1BhdGggPSBzcmNQYXRoLmNvbmNhdChyZWxQYXRoKTtcbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICB9IGVsc2UgaWYgKHJlbGF0aXZlLnNlYXJjaCAhPSBudWxsKSB7XG4gICAgLypcbiAgICAgKiBqdXN0IHB1bGwgb3V0IHRoZSBzZWFyY2guXG4gICAgICogbGlrZSBocmVmPSc/Zm9vJy5cbiAgICAgKiBQdXQgdGhpcyBhZnRlciB0aGUgb3RoZXIgdHdvIGNhc2VzIGJlY2F1c2UgaXQgc2ltcGxpZmllcyB0aGUgYm9vbGVhbnNcbiAgICAgKi9cbiAgICBpZiAocHN5Y2hvdGljKSB7XG4gICAgICByZXN1bHQuaG9zdCA9IHNyY1BhdGguc2hpZnQoKTtcbiAgICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlc3VsdC5ob3N0O1xuICAgICAgLypcbiAgICAgICAqIG9jY2F0aW9uYWx5IHRoZSBhdXRoIGNhbiBnZXQgc3R1Y2sgb25seSBpbiBob3N0XG4gICAgICAgKiB0aGlzIGVzcGVjaWFsbHkgaGFwcGVucyBpbiBjYXNlcyBsaWtlXG4gICAgICAgKiB1cmwucmVzb2x2ZU9iamVjdCgnbWFpbHRvOmxvY2FsMUBkb21haW4xJywgJ2xvY2FsMkBkb21haW4yJylcbiAgICAgICAqL1xuICAgICAgdmFyIGF1dGhJbkhvc3QgPSByZXN1bHQuaG9zdCAmJiByZXN1bHQuaG9zdC5pbmRleE9mKCdAJykgPiAwID8gcmVzdWx0Lmhvc3Quc3BsaXQoJ0AnKSA6IGZhbHNlO1xuICAgICAgaWYgKGF1dGhJbkhvc3QpIHtcbiAgICAgICAgcmVzdWx0LmF1dGggPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICAgIHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgICAgcmVzdWx0Lmhvc3QgPSByZXN1bHQuaG9zdG5hbWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gICAgLy8gdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAocmVzdWx0LnBhdGhuYW1lICE9PSBudWxsIHx8IHJlc3VsdC5zZWFyY2ggIT09IG51bGwpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gKHJlc3VsdC5wYXRobmFtZSA/IHJlc3VsdC5wYXRobmFtZSA6ICcnKSArIChyZXN1bHQuc2VhcmNoID8gcmVzdWx0LnNlYXJjaCA6ICcnKTtcbiAgICB9XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmICghc3JjUGF0aC5sZW5ndGgpIHtcbiAgICAvKlxuICAgICAqIG5vIHBhdGggYXQgYWxsLiAgZWFzeS5cbiAgICAgKiB3ZSd2ZSBhbHJlYWR5IGhhbmRsZWQgdGhlIG90aGVyIHN0dWZmIGFib3ZlLlxuICAgICAqL1xuICAgIHJlc3VsdC5wYXRobmFtZSA9IG51bGw7XG4gICAgLy8gdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAocmVzdWx0LnNlYXJjaCkge1xuICAgICAgcmVzdWx0LnBhdGggPSAnLycgKyByZXN1bHQuc2VhcmNoO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucGF0aCA9IG51bGw7XG4gICAgfVxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKlxuICAgKiBpZiBhIHVybCBFTkRzIGluIC4gb3IgLi4sIHRoZW4gaXQgbXVzdCBnZXQgYSB0cmFpbGluZyBzbGFzaC5cbiAgICogaG93ZXZlciwgaWYgaXQgZW5kcyBpbiBhbnl0aGluZyBlbHNlIG5vbi1zbGFzaHksXG4gICAqIHRoZW4gaXQgbXVzdCBOT1QgZ2V0IGEgdHJhaWxpbmcgc2xhc2guXG4gICAqL1xuICB2YXIgbGFzdCA9IHNyY1BhdGguc2xpY2UoLTEpWzBdO1xuICB2YXIgaGFzVHJhaWxpbmdTbGFzaCA9IChyZXN1bHQuaG9zdCB8fCByZWxhdGl2ZS5ob3N0IHx8IHNyY1BhdGgubGVuZ3RoID4gMSkgJiYgKGxhc3QgPT09ICcuJyB8fCBsYXN0ID09PSAnLi4nKSB8fCBsYXN0ID09PSAnJztcblxuICAvKlxuICAgKiBzdHJpcCBzaW5nbGUgZG90cywgcmVzb2x2ZSBkb3VibGUgZG90cyB0byBwYXJlbnQgZGlyXG4gICAqIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gICAqL1xuICB2YXIgdXAgPSAwO1xuICBmb3IgKHZhciBpID0gc3JjUGF0aC5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XG4gICAgbGFzdCA9IHNyY1BhdGhbaV07XG4gICAgaWYgKGxhc3QgPT09ICcuJykge1xuICAgICAgc3JjUGF0aC5zcGxpY2UoaSwgMSk7XG4gICAgfSBlbHNlIGlmIChsYXN0ID09PSAnLi4nKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCkge1xuICAgICAgc3JjUGF0aC5zcGxpY2UoaSwgMSk7XG4gICAgICB1cC0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBwYXRoIGlzIGFsbG93ZWQgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIHJlc3RvcmUgbGVhZGluZyAuLnNcbiAgaWYgKCFtdXN0RW5kQWJzICYmICFyZW1vdmVBbGxEb3RzKSB7XG4gICAgZm9yICg7IHVwLS07IHVwKSB7XG4gICAgICBzcmNQYXRoLnVuc2hpZnQoJy4uJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG11c3RFbmRBYnMgJiYgc3JjUGF0aFswXSAhPT0gJycgJiYgKCFzcmNQYXRoWzBdIHx8IHNyY1BhdGhbMF0uY2hhckF0KDApICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmIChoYXNUcmFpbGluZ1NsYXNoICYmIChzcmNQYXRoLmpvaW4oJy8nKS5zdWJzdHIoLTEpICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC5wdXNoKCcnKTtcbiAgfVxuXG4gIHZhciBpc0Fic29sdXRlID0gc3JjUGF0aFswXSA9PT0gJycgfHwgKHNyY1BhdGhbMF0gJiYgc3JjUGF0aFswXS5jaGFyQXQoMCkgPT09ICcvJyk7XG5cbiAgLy8gcHV0IHRoZSBob3N0IGJhY2tcbiAgaWYgKHBzeWNob3RpYykge1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IGlzQWJzb2x1dGUgPyAnJyA6IHNyY1BhdGgubGVuZ3RoID8gc3JjUGF0aC5zaGlmdCgpIDogJyc7XG4gICAgcmVzdWx0Lmhvc3QgPSByZXN1bHQuaG9zdG5hbWU7XG4gICAgLypcbiAgICAgKiBvY2NhdGlvbmFseSB0aGUgYXV0aCBjYW4gZ2V0IHN0dWNrIG9ubHkgaW4gaG9zdFxuICAgICAqIHRoaXMgZXNwZWNpYWxseSBoYXBwZW5zIGluIGNhc2VzIGxpa2VcbiAgICAgKiB1cmwucmVzb2x2ZU9iamVjdCgnbWFpbHRvOmxvY2FsMUBkb21haW4xJywgJ2xvY2FsMkBkb21haW4yJylcbiAgICAgKi9cbiAgICB2YXIgYXV0aEluSG9zdCA9IHJlc3VsdC5ob3N0ICYmIHJlc3VsdC5ob3N0LmluZGV4T2YoJ0AnKSA+IDAgPyByZXN1bHQuaG9zdC5zcGxpdCgnQCcpIDogZmFsc2U7XG4gICAgaWYgKGF1dGhJbkhvc3QpIHtcbiAgICAgIHJlc3VsdC5hdXRoID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgcmVzdWx0Lmhvc3RuYW1lID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgcmVzdWx0Lmhvc3QgPSByZXN1bHQuaG9zdG5hbWU7XG4gICAgfVxuICB9XG5cbiAgbXVzdEVuZEFicyA9IG11c3RFbmRBYnMgfHwgKHJlc3VsdC5ob3N0ICYmIHNyY1BhdGgubGVuZ3RoKTtcblxuICBpZiAobXVzdEVuZEFicyAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHNyY1BhdGgudW5zaGlmdCgnJyk7XG4gIH1cblxuICBpZiAoc3JjUGF0aC5sZW5ndGggPiAwKSB7XG4gICAgcmVzdWx0LnBhdGhuYW1lID0gc3JjUGF0aC5qb2luKCcvJyk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0LnBhdGhuYW1lID0gbnVsbDtcbiAgICByZXN1bHQucGF0aCA9IG51bGw7XG4gIH1cblxuICAvLyB0byBzdXBwb3J0IHJlcXVlc3QuaHR0cFxuICBpZiAocmVzdWx0LnBhdGhuYW1lICE9PSBudWxsIHx8IHJlc3VsdC5zZWFyY2ggIT09IG51bGwpIHtcbiAgICByZXN1bHQucGF0aCA9IChyZXN1bHQucGF0aG5hbWUgPyByZXN1bHQucGF0aG5hbWUgOiAnJykgKyAocmVzdWx0LnNlYXJjaCA/IHJlc3VsdC5zZWFyY2ggOiAnJyk7XG4gIH1cbiAgcmVzdWx0LmF1dGggPSByZWxhdGl2ZS5hdXRoIHx8IHJlc3VsdC5hdXRoO1xuICByZXN1bHQuc2xhc2hlcyA9IHJlc3VsdC5zbGFzaGVzIHx8IHJlbGF0aXZlLnNsYXNoZXM7XG4gIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuVXJsLnByb3RvdHlwZS5wYXJzZUhvc3QgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBob3N0ID0gdGhpcy5ob3N0O1xuICB2YXIgcG9ydCA9IHBvcnRQYXR0ZXJuLmV4ZWMoaG9zdCk7XG4gIGlmIChwb3J0KSB7XG4gICAgcG9ydCA9IHBvcnRbMF07XG4gICAgaWYgKHBvcnQgIT09ICc6Jykge1xuICAgICAgdGhpcy5wb3J0ID0gcG9ydC5zdWJzdHIoMSk7XG4gICAgfVxuICAgIGhvc3QgPSBob3N0LnN1YnN0cigwLCBob3N0Lmxlbmd0aCAtIHBvcnQubGVuZ3RoKTtcbiAgfVxuICBpZiAoaG9zdCkgeyB0aGlzLmhvc3RuYW1lID0gaG9zdDsgfVxufTtcblxuZXhwb3J0cy5wYXJzZSA9IHVybFBhcnNlO1xuZXhwb3J0cy5yZXNvbHZlID0gdXJsUmVzb2x2ZTtcbmV4cG9ydHMucmVzb2x2ZU9iamVjdCA9IHVybFJlc29sdmVPYmplY3Q7XG5leHBvcnRzLmZvcm1hdCA9IHVybEZvcm1hdDtcblxuZXhwb3J0cy5VcmwgPSBVcmw7XG4iLCJjb25zdCByYW5kb21VVUlEID0gdHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQgJiYgY3J5cHRvLnJhbmRvbVVVSUQuYmluZChjcnlwdG8pO1xuZXhwb3J0IGRlZmF1bHQge1xuICByYW5kb21VVUlEXG59OyIsImV4cG9ydCBkZWZhdWx0IC9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTsiLCIvLyBVbmlxdWUgSUQgY3JlYXRpb24gcmVxdWlyZXMgYSBoaWdoIHF1YWxpdHkgcmFuZG9tICMgZ2VuZXJhdG9yLiBJbiB0aGUgYnJvd3NlciB3ZSB0aGVyZWZvcmVcbi8vIHJlcXVpcmUgdGhlIGNyeXB0byBBUEkgYW5kIGRvIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGZhbGxiYWNrIHRvIGxvd2VyIHF1YWxpdHkgcmFuZG9tIG51bWJlclxuLy8gZ2VuZXJhdG9ycyAobGlrZSBNYXRoLnJhbmRvbSgpKS5cbmxldCBnZXRSYW5kb21WYWx1ZXM7XG5jb25zdCBybmRzOCA9IG5ldyBVaW50OEFycmF5KDE2KTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJuZygpIHtcbiAgLy8gbGF6eSBsb2FkIHNvIHRoYXQgZW52aXJvbm1lbnRzIHRoYXQgbmVlZCB0byBwb2x5ZmlsbCBoYXZlIGEgY2hhbmNlIHRvIGRvIHNvXG4gIGlmICghZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgLy8gZ2V0UmFuZG9tVmFsdWVzIG5lZWRzIHRvIGJlIGludm9rZWQgaW4gYSBjb250ZXh0IHdoZXJlIFwidGhpc1wiIGlzIGEgQ3J5cHRvIGltcGxlbWVudGF0aW9uLlxuICAgIGdldFJhbmRvbVZhbHVlcyA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byk7XG5cbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbi8qKlxuICogQ29udmVydCBhcnJheSBvZiAxNiBieXRlIHZhbHVlcyB0byBVVUlEIHN0cmluZyBmb3JtYXQgb2YgdGhlIGZvcm06XG4gKiBYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFhcbiAqL1xuXG5jb25zdCBieXRlVG9IZXggPSBbXTtcblxuZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICBieXRlVG9IZXgucHVzaCgoaSArIDB4MTAwKS50b1N0cmluZygxNikuc2xpY2UoMSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5zYWZlU3RyaW5naWZ5KGFyciwgb2Zmc2V0ID0gMCkge1xuICAvLyBOb3RlOiBCZSBjYXJlZnVsIGVkaXRpbmcgdGhpcyBjb2RlISAgSXQncyBiZWVuIHR1bmVkIGZvciBwZXJmb3JtYW5jZVxuICAvLyBhbmQgd29ya3MgaW4gd2F5cyB5b3UgbWF5IG5vdCBleHBlY3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQvcHVsbC80MzRcbiAgcmV0dXJuIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgM11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDVdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA3XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDhdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxM11dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNV1dO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnkoYXJyLCBvZmZzZXQgPSAwKSB7XG4gIGNvbnN0IHV1aWQgPSB1bnNhZmVTdHJpbmdpZnkoYXJyLCBvZmZzZXQpOyAvLyBDb25zaXN0ZW5jeSBjaGVjayBmb3IgdmFsaWQgVVVJRC4gIElmIHRoaXMgdGhyb3dzLCBpdCdzIGxpa2VseSBkdWUgdG8gb25lXG4gIC8vIG9mIHRoZSBmb2xsb3dpbmc6XG4gIC8vIC0gT25lIG9yIG1vcmUgaW5wdXQgYXJyYXkgdmFsdWVzIGRvbid0IG1hcCB0byBhIGhleCBvY3RldCAobGVhZGluZyB0b1xuICAvLyBcInVuZGVmaW5lZFwiIGluIHRoZSB1dWlkKVxuICAvLyAtIEludmFsaWQgaW5wdXQgdmFsdWVzIGZvciB0aGUgUkZDIGB2ZXJzaW9uYCBvciBgdmFyaWFudGAgZmllbGRzXG5cbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkJyk7XG4gIH1cblxuICByZXR1cm4gdXVpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RyaW5naWZ5OyIsImltcG9ydCBuYXRpdmUgZnJvbSAnLi9uYXRpdmUuanMnO1xuaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVTdHJpbmdpZnkgfSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5cbmZ1bmN0aW9uIHY0KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIGlmIChuYXRpdmUucmFuZG9tVVVJRCAmJiAhYnVmICYmICFvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5hdGl2ZS5yYW5kb21VVUlEKCk7XG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgY29uc3Qgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBybmcpKCk7IC8vIFBlciA0LjQsIHNldCBiaXRzIGZvciB2ZXJzaW9uIGFuZCBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGBcblxuICBybmRzWzZdID0gcm5kc1s2XSAmIDB4MGYgfCAweDQwO1xuICBybmRzWzhdID0gcm5kc1s4XSAmIDB4M2YgfCAweDgwOyAvLyBDb3B5IGJ5dGVzIHRvIGJ1ZmZlciwgaWYgcHJvdmlkZWRcblxuICBpZiAoYnVmKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHJuZHNbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIHJldHVybiB1bnNhZmVTdHJpbmdpZnkocm5kcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHY0OyIsImltcG9ydCBSRUdFWCBmcm9tICcuL3JlZ2V4LmpzJztcblxuZnVuY3Rpb24gdmFsaWRhdGUodXVpZCkge1xuICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnICYmIFJFR0VYLnRlc3QodXVpZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRlOyIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvdHlwZS1idWlsdGlucyAqL1xudmFyIGcgPVxuICAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbFRoaXMpIHx8XG4gICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZikgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWwpIHx8XG4gIHt9XG5cbnZhciBzdXBwb3J0ID0ge1xuICBzZWFyY2hQYXJhbXM6ICdVUkxTZWFyY2hQYXJhbXMnIGluIGcsXG4gIGl0ZXJhYmxlOiAnU3ltYm9sJyBpbiBnICYmICdpdGVyYXRvcicgaW4gU3ltYm9sLFxuICBibG9iOlxuICAgICdGaWxlUmVhZGVyJyBpbiBnICYmXG4gICAgJ0Jsb2InIGluIGcgJiZcbiAgICAoZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgQmxvYigpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH0pKCksXG4gIGZvcm1EYXRhOiAnRm9ybURhdGEnIGluIGcsXG4gIGFycmF5QnVmZmVyOiAnQXJyYXlCdWZmZXInIGluIGdcbn1cblxuZnVuY3Rpb24gaXNEYXRhVmlldyhvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBEYXRhVmlldy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvYmopXG59XG5cbmlmIChzdXBwb3J0LmFycmF5QnVmZmVyKSB7XG4gIHZhciB2aWV3Q2xhc3NlcyA9IFtcbiAgICAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBGbG9hdDY0QXJyYXldJ1xuICBdXG5cbiAgdmFyIGlzQXJyYXlCdWZmZXJWaWV3ID1cbiAgICBBcnJheUJ1ZmZlci5pc1ZpZXcgfHxcbiAgICBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdmlld0NsYXNzZXMuaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSkgPiAtMVxuICAgIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmFtZShuYW1lKSB7XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICBuYW1lID0gU3RyaW5nKG5hbWUpXG4gIH1cbiAgaWYgKC9bXmEtejAtOVxcLSMkJSYnKisuXl9gfH4hXS9pLnRlc3QobmFtZSkgfHwgbmFtZSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGNoYXJhY3RlciBpbiBoZWFkZXIgZmllbGQgbmFtZTogXCInICsgbmFtZSArICdcIicpXG4gIH1cbiAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgIHZhbHVlID0gU3RyaW5nKHZhbHVlKVxuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG4vLyBCdWlsZCBhIGRlc3RydWN0aXZlIGl0ZXJhdG9yIGZvciB0aGUgdmFsdWUgbGlzdFxuZnVuY3Rpb24gaXRlcmF0b3JGb3IoaXRlbXMpIHtcbiAgdmFyIGl0ZXJhdG9yID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHZhbHVlID0gaXRlbXMuc2hpZnQoKVxuICAgICAgcmV0dXJuIHtkb25lOiB2YWx1ZSA9PT0gdW5kZWZpbmVkLCB2YWx1ZTogdmFsdWV9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuaXRlcmFibGUpIHtcbiAgICBpdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gaXRlcmF0b3JcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXRlcmF0b3Jcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEhlYWRlcnMoaGVhZGVycykge1xuICB0aGlzLm1hcCA9IHt9XG5cbiAgaWYgKGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICB0aGlzLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICB9LCB0aGlzKVxuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVycykpIHtcbiAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24oaGVhZGVyKSB7XG4gICAgICBpZiAoaGVhZGVyLmxlbmd0aCAhPSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0hlYWRlcnMgY29uc3RydWN0b3I6IGV4cGVjdGVkIG5hbWUvdmFsdWUgcGFpciB0byBiZSBsZW5ndGggMiwgZm91bmQnICsgaGVhZGVyLmxlbmd0aClcbiAgICAgIH1cbiAgICAgIHRoaXMuYXBwZW5kKGhlYWRlclswXSwgaGVhZGVyWzFdKVxuICAgIH0sIHRoaXMpXG4gIH0gZWxzZSBpZiAoaGVhZGVycykge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgdGhpcy5hcHBlbmQobmFtZSwgaGVhZGVyc1tuYW1lXSlcbiAgICB9LCB0aGlzKVxuICB9XG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIG5hbWUgPSBub3JtYWxpemVOYW1lKG5hbWUpXG4gIHZhbHVlID0gbm9ybWFsaXplVmFsdWUodmFsdWUpXG4gIHZhciBvbGRWYWx1ZSA9IHRoaXMubWFwW25hbWVdXG4gIHRoaXMubWFwW25hbWVdID0gb2xkVmFsdWUgPyBvbGRWYWx1ZSArICcsICcgKyB2YWx1ZSA6IHZhbHVlXG59XG5cbkhlYWRlcnMucHJvdG90eXBlWydkZWxldGUnXSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgZGVsZXRlIHRoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSlcbiAgcmV0dXJuIHRoaXMuaGFzKG5hbWUpID8gdGhpcy5tYXBbbmFtZV0gOiBudWxsXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMubWFwLmhhc093blByb3BlcnR5KG5vcm1hbGl6ZU5hbWUobmFtZSkpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHRoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldID0gbm9ybWFsaXplVmFsdWUodmFsdWUpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaywgdGhpc0FyZykge1xuICBmb3IgKHZhciBuYW1lIGluIHRoaXMubWFwKSB7XG4gICAgaWYgKHRoaXMubWFwLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHRoaXMubWFwW25hbWVdLCBuYW1lLCB0aGlzKVxuICAgIH1cbiAgfVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IFtdXG4gIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgIGl0ZW1zLnB1c2gobmFtZSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGl0ZW1zID0gW11cbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaXRlbXMucHVzaCh2YWx1ZSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IFtdXG4gIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgIGl0ZW1zLnB1c2goW25hbWUsIHZhbHVlXSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5pZiAoc3VwcG9ydC5pdGVyYWJsZSkge1xuICBIZWFkZXJzLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gSGVhZGVycy5wcm90b3R5cGUuZW50cmllc1xufVxuXG5mdW5jdGlvbiBjb25zdW1lZChib2R5KSB7XG4gIGlmIChib2R5Ll9ub0JvZHkpIHJldHVyblxuICBpZiAoYm9keS5ib2R5VXNlZCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKCdBbHJlYWR5IHJlYWQnKSlcbiAgfVxuICBib2R5LmJvZHlVc2VkID0gdHJ1ZVxufVxuXG5mdW5jdGlvbiBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXNvbHZlKHJlYWRlci5yZXN1bHQpXG4gICAgfVxuICAgIHJlYWRlci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZWplY3QocmVhZGVyLmVycm9yKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2JBc0FycmF5QnVmZmVyKGJsb2IpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKClcbiAgdmFyIHByb21pc2UgPSBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKVxuICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYilcbiAgcmV0dXJuIHByb21pc2Vcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2JBc1RleHQoYmxvYikge1xuICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICB2YXIgcHJvbWlzZSA9IGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpXG4gIHZhciBtYXRjaCA9IC9jaGFyc2V0PShbQS1aYS16MC05Xy1dKykvLmV4ZWMoYmxvYi50eXBlKVxuICB2YXIgZW5jb2RpbmcgPSBtYXRjaCA/IG1hdGNoWzFdIDogJ3V0Zi04J1xuICByZWFkZXIucmVhZEFzVGV4dChibG9iLCBlbmNvZGluZylcbiAgcmV0dXJuIHByb21pc2Vcbn1cblxuZnVuY3Rpb24gcmVhZEFycmF5QnVmZmVyQXNUZXh0KGJ1Zikge1xuICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZilcbiAgdmFyIGNoYXJzID0gbmV3IEFycmF5KHZpZXcubGVuZ3RoKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykge1xuICAgIGNoYXJzW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZSh2aWV3W2ldKVxuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBidWZmZXJDbG9uZShidWYpIHtcbiAgaWYgKGJ1Zi5zbGljZSkge1xuICAgIHJldHVybiBidWYuc2xpY2UoMClcbiAgfSBlbHNlIHtcbiAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zi5ieXRlTGVuZ3RoKVxuICAgIHZpZXcuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZikpXG4gICAgcmV0dXJuIHZpZXcuYnVmZmVyXG4gIH1cbn1cblxuZnVuY3Rpb24gQm9keSgpIHtcbiAgdGhpcy5ib2R5VXNlZCA9IGZhbHNlXG5cbiAgdGhpcy5faW5pdEJvZHkgPSBmdW5jdGlvbihib2R5KSB7XG4gICAgLypcbiAgICAgIGZldGNoLW1vY2sgd3JhcHMgdGhlIFJlc3BvbnNlIG9iamVjdCBpbiBhbiBFUzYgUHJveHkgdG9cbiAgICAgIHByb3ZpZGUgdXNlZnVsIHRlc3QgaGFybmVzcyBmZWF0dXJlcyBzdWNoIGFzIGZsdXNoLiBIb3dldmVyLCBvblxuICAgICAgRVM1IGJyb3dzZXJzIHdpdGhvdXQgZmV0Y2ggb3IgUHJveHkgc3VwcG9ydCBwb2xseWZpbGxzIG11c3QgYmUgdXNlZDtcbiAgICAgIHRoZSBwcm94eS1wb2xseWZpbGwgaXMgdW5hYmxlIHRvIHByb3h5IGFuIGF0dHJpYnV0ZSB1bmxlc3MgaXQgZXhpc3RzXG4gICAgICBvbiB0aGUgb2JqZWN0IGJlZm9yZSB0aGUgUHJveHkgaXMgY3JlYXRlZC4gVGhpcyBjaGFuZ2UgZW5zdXJlc1xuICAgICAgUmVzcG9uc2UuYm9keVVzZWQgZXhpc3RzIG9uIHRoZSBpbnN0YW5jZSwgd2hpbGUgbWFpbnRhaW5pbmcgdGhlXG4gICAgICBzZW1hbnRpYyBvZiBzZXR0aW5nIFJlcXVlc3QuYm9keVVzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGJlZm9yZVxuICAgICAgX2luaXRCb2R5IGlzIGNhbGxlZC5cbiAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWFzc2lnblxuICAgIHRoaXMuYm9keVVzZWQgPSB0aGlzLmJvZHlVc2VkXG4gICAgdGhpcy5fYm9keUluaXQgPSBib2R5XG4gICAgaWYgKCFib2R5KSB7XG4gICAgICB0aGlzLl9ub0JvZHkgPSB0cnVlO1xuICAgICAgdGhpcy5fYm9keVRleHQgPSAnJ1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYmxvYiAmJiBCbG9iLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICB0aGlzLl9ib2R5QmxvYiA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuZm9ybURhdGEgJiYgRm9ybURhdGEucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlGb3JtRGF0YSA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuc2VhcmNoUGFyYW1zICYmIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5LnRvU3RyaW5nKClcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIgJiYgc3VwcG9ydC5ibG9iICYmIGlzRGF0YVZpZXcoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkuYnVmZmVyKVxuICAgICAgLy8gSUUgMTAtMTEgY2FuJ3QgaGFuZGxlIGEgRGF0YVZpZXcgYm9keS5cbiAgICAgIHRoaXMuX2JvZHlJbml0ID0gbmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pXG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyICYmIChBcnJheUJ1ZmZlci5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSB8fCBpc0FycmF5QnVmZmVyVmlldyhib2R5KSkpIHtcbiAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChib2R5KVxuICAgIH1cblxuICAgIGlmICghdGhpcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpIHtcbiAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ3RleHQvcGxhaW47Y2hhcnNldD1VVEYtOCcpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlCbG9iICYmIHRoaXMuX2JvZHlCbG9iLnR5cGUpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgdGhpcy5fYm9keUJsb2IudHlwZSlcbiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5zZWFyY2hQYXJhbXMgJiYgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCcpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuYmxvYikge1xuICAgIHRoaXMuYmxvYiA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0ZWRcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2JvZHlCbG9iKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUJsb2IpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKSlcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyBibG9iJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlUZXh0XSkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGhpcy5hcnJheUJ1ZmZlciA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgIHZhciBpc0NvbnN1bWVkID0gY29uc3VtZWQodGhpcylcbiAgICAgIGlmIChpc0NvbnN1bWVkKSB7XG4gICAgICAgIHJldHVybiBpc0NvbnN1bWVkXG4gICAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ1ZmZlci5zbGljZShcbiAgICAgICAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ5dGVPZmZzZXQgKyB0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmJsb2IpIHtcbiAgICAgIHJldHVybiB0aGlzLmJsb2IoKS50aGVuKHJlYWRCbG9iQXNBcnJheUJ1ZmZlcilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBhcyBBcnJheUJ1ZmZlcicpXG4gICAgfVxuICB9XG5cbiAgdGhpcy50ZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICBpZiAocmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiByZWplY3RlZFxuICAgIH1cblxuICAgIGlmICh0aGlzLl9ib2R5QmxvYikge1xuICAgICAgcmV0dXJuIHJlYWRCbG9iQXNUZXh0KHRoaXMuX2JvZHlCbG9iKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlYWRBcnJheUJ1ZmZlckFzVGV4dCh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgdGV4dCcpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keVRleHQpXG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuZm9ybURhdGEpIHtcbiAgICB0aGlzLmZvcm1EYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihkZWNvZGUpXG4gICAgfVxuICB9XG5cbiAgdGhpcy5qc29uID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oSlNPTi5wYXJzZSlcbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhUVFAgbWV0aG9kcyB3aG9zZSBjYXBpdGFsaXphdGlvbiBzaG91bGQgYmUgbm9ybWFsaXplZFxudmFyIG1ldGhvZHMgPSBbJ0NPTk5FQ1QnLCAnREVMRVRFJywgJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnLCAnUEFUQ0gnLCAnUE9TVCcsICdQVVQnLCAnVFJBQ0UnXVxuXG5mdW5jdGlvbiBub3JtYWxpemVNZXRob2QobWV0aG9kKSB7XG4gIHZhciB1cGNhc2VkID0gbWV0aG9kLnRvVXBwZXJDYXNlKClcbiAgcmV0dXJuIG1ldGhvZHMuaW5kZXhPZih1cGNhc2VkKSA+IC0xID8gdXBjYXNlZCA6IG1ldGhvZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gUmVxdWVzdChpbnB1dCwgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVxdWVzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQbGVhc2UgdXNlIHRoZSBcIm5ld1wiIG9wZXJhdG9yLCB0aGlzIERPTSBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLicpXG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keVxuXG4gIGlmIChpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICBpZiAoaW5wdXQuYm9keVVzZWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpXG4gICAgfVxuICAgIHRoaXMudXJsID0gaW5wdXQudXJsXG4gICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzXG4gICAgaWYgKCFvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKGlucHV0LmhlYWRlcnMpXG4gICAgfVxuICAgIHRoaXMubWV0aG9kID0gaW5wdXQubWV0aG9kXG4gICAgdGhpcy5tb2RlID0gaW5wdXQubW9kZVxuICAgIHRoaXMuc2lnbmFsID0gaW5wdXQuc2lnbmFsXG4gICAgaWYgKCFib2R5ICYmIGlucHV0Ll9ib2R5SW5pdCAhPSBudWxsKSB7XG4gICAgICBib2R5ID0gaW5wdXQuX2JvZHlJbml0XG4gICAgICBpbnB1dC5ib2R5VXNlZCA9IHRydWVcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy51cmwgPSBTdHJpbmcoaW5wdXQpXG4gIH1cblxuICB0aGlzLmNyZWRlbnRpYWxzID0gb3B0aW9ucy5jcmVkZW50aWFscyB8fCB0aGlzLmNyZWRlbnRpYWxzIHx8ICdzYW1lLW9yaWdpbidcbiAgaWYgKG9wdGlvbnMuaGVhZGVycyB8fCAhdGhpcy5oZWFkZXJzKSB7XG4gICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKVxuICB9XG4gIHRoaXMubWV0aG9kID0gbm9ybWFsaXplTWV0aG9kKG9wdGlvbnMubWV0aG9kIHx8IHRoaXMubWV0aG9kIHx8ICdHRVQnKVxuICB0aGlzLm1vZGUgPSBvcHRpb25zLm1vZGUgfHwgdGhpcy5tb2RlIHx8IG51bGxcbiAgdGhpcy5zaWduYWwgPSBvcHRpb25zLnNpZ25hbCB8fCB0aGlzLnNpZ25hbCB8fCAoZnVuY3Rpb24gKCkge1xuICAgIGlmICgnQWJvcnRDb250cm9sbGVyJyBpbiBnKSB7XG4gICAgICB2YXIgY3RybCA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHJldHVybiBjdHJsLnNpZ25hbDtcbiAgICB9XG4gIH0oKSk7XG4gIHRoaXMucmVmZXJyZXIgPSBudWxsXG5cbiAgaWYgKCh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykgJiYgYm9keSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzJylcbiAgfVxuICB0aGlzLl9pbml0Qm9keShib2R5KVxuXG4gIGlmICh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykge1xuICAgIGlmIChvcHRpb25zLmNhY2hlID09PSAnbm8tc3RvcmUnIHx8IG9wdGlvbnMuY2FjaGUgPT09ICduby1jYWNoZScpIHtcbiAgICAgIC8vIFNlYXJjaCBmb3IgYSAnXycgcGFyYW1ldGVyIGluIHRoZSBxdWVyeSBzdHJpbmdcbiAgICAgIHZhciByZVBhcmFtU2VhcmNoID0gLyhbPyZdKV89W14mXSovXG4gICAgICBpZiAocmVQYXJhbVNlYXJjaC50ZXN0KHRoaXMudXJsKSkge1xuICAgICAgICAvLyBJZiBpdCBhbHJlYWR5IGV4aXN0cyB0aGVuIHNldCB0aGUgdmFsdWUgd2l0aCB0aGUgY3VycmVudCB0aW1lXG4gICAgICAgIHRoaXMudXJsID0gdGhpcy51cmwucmVwbGFjZShyZVBhcmFtU2VhcmNoLCAnJDFfPScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSBhZGQgYSBuZXcgJ18nIHBhcmFtZXRlciB0byB0aGUgZW5kIHdpdGggdGhlIGN1cnJlbnQgdGltZVxuICAgICAgICB2YXIgcmVRdWVyeVN0cmluZyA9IC9cXD8vXG4gICAgICAgIHRoaXMudXJsICs9IChyZVF1ZXJ5U3RyaW5nLnRlc3QodGhpcy51cmwpID8gJyYnIDogJz8nKSArICdfPScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFJlcXVlc3QodGhpcywge2JvZHk6IHRoaXMuX2JvZHlJbml0fSlcbn1cblxuZnVuY3Rpb24gZGVjb2RlKGJvZHkpIHtcbiAgdmFyIGZvcm0gPSBuZXcgRm9ybURhdGEoKVxuICBib2R5XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgnJicpXG4gICAgLmZvckVhY2goZnVuY3Rpb24oYnl0ZXMpIHtcbiAgICAgIGlmIChieXRlcykge1xuICAgICAgICB2YXIgc3BsaXQgPSBieXRlcy5zcGxpdCgnPScpXG4gICAgICAgIHZhciBuYW1lID0gc3BsaXQuc2hpZnQoKS5yZXBsYWNlKC9cXCsvZywgJyAnKVxuICAgICAgICB2YXIgdmFsdWUgPSBzcGxpdC5qb2luKCc9JykucmVwbGFjZSgvXFwrL2csICcgJylcbiAgICAgICAgZm9ybS5hcHBlbmQoZGVjb2RlVVJJQ29tcG9uZW50KG5hbWUpLCBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpKVxuICAgICAgfVxuICAgIH0pXG4gIHJldHVybiBmb3JtXG59XG5cbmZ1bmN0aW9uIHBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKSB7XG4gIHZhciBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKVxuICAvLyBSZXBsYWNlIGluc3RhbmNlcyBvZiBcXHJcXG4gYW5kIFxcbiBmb2xsb3dlZCBieSBhdCBsZWFzdCBvbmUgc3BhY2Ugb3IgaG9yaXpvbnRhbCB0YWIgd2l0aCBhIHNwYWNlXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4yXG4gIHZhciBwcmVQcm9jZXNzZWRIZWFkZXJzID0gcmF3SGVhZGVycy5yZXBsYWNlKC9cXHI/XFxuW1xcdCBdKy9nLCAnICcpXG4gIC8vIEF2b2lkaW5nIHNwbGl0IHZpYSByZWdleCB0byB3b3JrIGFyb3VuZCBhIGNvbW1vbiBJRTExIGJ1ZyB3aXRoIHRoZSBjb3JlLWpzIDMuNi4wIHJlZ2V4IHBvbHlmaWxsXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWIvZmV0Y2gvaXNzdWVzLzc0OFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNzUxXG4gIHByZVByb2Nlc3NlZEhlYWRlcnNcbiAgICAuc3BsaXQoJ1xccicpXG4gICAgLm1hcChmdW5jdGlvbihoZWFkZXIpIHtcbiAgICAgIHJldHVybiBoZWFkZXIuaW5kZXhPZignXFxuJykgPT09IDAgPyBoZWFkZXIuc3Vic3RyKDEsIGhlYWRlci5sZW5ndGgpIDogaGVhZGVyXG4gICAgfSlcbiAgICAuZm9yRWFjaChmdW5jdGlvbihsaW5lKSB7XG4gICAgICB2YXIgcGFydHMgPSBsaW5lLnNwbGl0KCc6JylcbiAgICAgIHZhciBrZXkgPSBwYXJ0cy5zaGlmdCgpLnRyaW0oKVxuICAgICAgaWYgKGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5qb2luKCc6JykudHJpbSgpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaGVhZGVycy5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1Jlc3BvbnNlICcgKyBlcnJvci5tZXNzYWdlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgcmV0dXJuIGhlYWRlcnNcbn1cblxuQm9keS5jYWxsKFJlcXVlc3QucHJvdG90eXBlKVxuXG5leHBvcnQgZnVuY3Rpb24gUmVzcG9uc2UoYm9keUluaXQsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlc3BvbnNlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BsZWFzZSB1c2UgdGhlIFwibmV3XCIgb3BlcmF0b3IsIHRoaXMgRE9NIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uJylcbiAgfVxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge31cbiAgfVxuXG4gIHRoaXMudHlwZSA9ICdkZWZhdWx0J1xuICB0aGlzLnN0YXR1cyA9IG9wdGlvbnMuc3RhdHVzID09PSB1bmRlZmluZWQgPyAyMDAgOiBvcHRpb25zLnN0YXR1c1xuICBpZiAodGhpcy5zdGF0dXMgPCAyMDAgfHwgdGhpcy5zdGF0dXMgPiA1OTkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Jlc3BvbnNlJzogVGhlIHN0YXR1cyBwcm92aWRlZCAoMCkgaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzIwMCwgNTk5XS5cIilcbiAgfVxuICB0aGlzLm9rID0gdGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgMzAwXG4gIHRoaXMuc3RhdHVzVGV4dCA9IG9wdGlvbnMuc3RhdHVzVGV4dCA9PT0gdW5kZWZpbmVkID8gJycgOiAnJyArIG9wdGlvbnMuc3RhdHVzVGV4dFxuICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpXG4gIHRoaXMudXJsID0gb3B0aW9ucy51cmwgfHwgJydcbiAgdGhpcy5faW5pdEJvZHkoYm9keUluaXQpXG59XG5cbkJvZHkuY2FsbChSZXNwb25zZS5wcm90b3R5cGUpXG5cblJlc3BvbnNlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuX2JvZHlJbml0LCB7XG4gICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICBzdGF0dXNUZXh0OiB0aGlzLnN0YXR1c1RleHQsXG4gICAgaGVhZGVyczogbmV3IEhlYWRlcnModGhpcy5oZWFkZXJzKSxcbiAgICB1cmw6IHRoaXMudXJsXG4gIH0pXG59XG5cblJlc3BvbnNlLmVycm9yID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZXNwb25zZSA9IG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiAyMDAsIHN0YXR1c1RleHQ6ICcnfSlcbiAgcmVzcG9uc2Uub2sgPSBmYWxzZVxuICByZXNwb25zZS5zdGF0dXMgPSAwXG4gIHJlc3BvbnNlLnR5cGUgPSAnZXJyb3InXG4gIHJldHVybiByZXNwb25zZVxufVxuXG52YXIgcmVkaXJlY3RTdGF0dXNlcyA9IFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF1cblxuUmVzcG9uc2UucmVkaXJlY3QgPSBmdW5jdGlvbih1cmwsIHN0YXR1cykge1xuICBpZiAocmVkaXJlY3RTdGF0dXNlcy5pbmRleE9mKHN0YXR1cykgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgc3RhdHVzIGNvZGUnKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IHtsb2NhdGlvbjogdXJsfX0pXG59XG5cbmV4cG9ydCB2YXIgRE9NRXhjZXB0aW9uID0gZy5ET01FeGNlcHRpb25cbnRyeSB7XG4gIG5ldyBET01FeGNlcHRpb24oKVxufSBjYXRjaCAoZXJyKSB7XG4gIERPTUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UsIG5hbWUpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlXG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHZhciBlcnJvciA9IEVycm9yKG1lc3NhZ2UpXG4gICAgdGhpcy5zdGFjayA9IGVycm9yLnN0YWNrXG4gIH1cbiAgRE9NRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKVxuICBET01FeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRE9NRXhjZXB0aW9uXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaChpbnB1dCwgaW5pdCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgaW5pdClcblxuICAgIGlmIChyZXF1ZXN0LnNpZ25hbCAmJiByZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICByZXR1cm4gcmVqZWN0KG5ldyBET01FeGNlcHRpb24oJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpKVxuICAgIH1cblxuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuXG4gICAgZnVuY3Rpb24gYWJvcnRYaHIoKSB7XG4gICAgICB4aHIuYWJvcnQoKVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBzdGF0dXNUZXh0OiB4aHIuc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogcGFyc2VIZWFkZXJzKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSB8fCAnJylcbiAgICAgIH1cbiAgICAgIC8vIFRoaXMgY2hlY2sgaWYgc3BlY2lmaWNhbGx5IGZvciB3aGVuIGEgdXNlciBmZXRjaGVzIGEgZmlsZSBsb2NhbGx5IGZyb20gdGhlIGZpbGUgc3lzdGVtXG4gICAgICAvLyBPbmx5IGlmIHRoZSBzdGF0dXMgaXMgb3V0IG9mIGEgbm9ybWFsIHJhbmdlXG4gICAgICBpZiAocmVxdWVzdC51cmwuaW5kZXhPZignZmlsZTovLycpID09PSAwICYmICh4aHIuc3RhdHVzIDwgMjAwIHx8IHhoci5zdGF0dXMgPiA1OTkpKSB7XG4gICAgICAgIG9wdGlvbnMuc3RhdHVzID0gMjAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucy5zdGF0dXMgPSB4aHIuc3RhdHVzO1xuICAgICAgfVxuICAgICAgb3B0aW9ucy51cmwgPSAncmVzcG9uc2VVUkwnIGluIHhociA/IHhoci5yZXNwb25zZVVSTCA6IG9wdGlvbnMuaGVhZGVycy5nZXQoJ1gtUmVxdWVzdC1VUkwnKVxuICAgICAgdmFyIGJvZHkgPSAncmVzcG9uc2UnIGluIHhociA/IHhoci5yZXNwb25zZSA6IHhoci5yZXNwb25zZVRleHRcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKGJvZHksIG9wdGlvbnMpKVxuICAgICAgfSwgMClcbiAgICB9XG5cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQnKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCB0aW1lZCBvdXQnKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChuZXcgRE9NRXhjZXB0aW9uKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZml4VXJsKHVybCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVybCA9PT0gJycgJiYgZy5sb2NhdGlvbi5ocmVmID8gZy5sb2NhdGlvbi5ocmVmIDogdXJsXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB1cmxcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub3BlbihyZXF1ZXN0Lm1ldGhvZCwgZml4VXJsKHJlcXVlc3QudXJsKSwgdHJ1ZSlcblxuICAgIGlmIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnaW5jbHVkZScpIHtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnb21pdCcpIHtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmICgncmVzcG9uc2VUeXBlJyBpbiB4aHIpIHtcbiAgICAgIGlmIChzdXBwb3J0LmJsb2IpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdibG9iJ1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgc3VwcG9ydC5hcnJheUJ1ZmZlclxuICAgICAgKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGluaXQgJiYgdHlwZW9mIGluaXQuaGVhZGVycyA9PT0gJ29iamVjdCcgJiYgIShpbml0LmhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzIHx8IChnLkhlYWRlcnMgJiYgaW5pdC5oZWFkZXJzIGluc3RhbmNlb2YgZy5IZWFkZXJzKSkpIHtcbiAgICAgIHZhciBuYW1lcyA9IFtdO1xuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaW5pdC5oZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgbmFtZXMucHVzaChub3JtYWxpemVOYW1lKG5hbWUpKVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCBub3JtYWxpemVWYWx1ZShpbml0LmhlYWRlcnNbbmFtZV0pKVxuICAgICAgfSlcbiAgICAgIHJlcXVlc3QuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGlmIChuYW1lcy5pbmRleE9mKG5hbWUpID09PSAtMSkge1xuICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXF1ZXN0LmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCB2YWx1ZSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3Quc2lnbmFsKSB7XG4gICAgICByZXF1ZXN0LnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0WGhyKVxuXG4gICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIERPTkUgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSlcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgcmVxdWVzdC5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydFhocilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5zZW5kKHR5cGVvZiByZXF1ZXN0Ll9ib2R5SW5pdCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogcmVxdWVzdC5fYm9keUluaXQpXG4gIH0pXG59XG5cbmZldGNoLnBvbHlmaWxsID0gdHJ1ZVxuXG5pZiAoIWcuZmV0Y2gpIHtcbiAgZy5mZXRjaCA9IGZldGNoXG4gIGcuSGVhZGVycyA9IEhlYWRlcnNcbiAgZy5SZXF1ZXN0ID0gUmVxdWVzdFxuICBnLlJlc3BvbnNlID0gUmVzcG9uc2Vcbn1cbiIsIi8qIChpZ25vcmVkKSAqLyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdGxvYWRlZDogZmFsc2UsXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4iLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmFtZE8gPSB7fTsiLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZiA9IHt9O1xuLy8gVGhpcyBmaWxlIGNvbnRhaW5zIG9ubHkgdGhlIGVudHJ5IGNodW5rLlxuLy8gVGhlIGNodW5rIGxvYWRpbmcgZnVuY3Rpb24gZm9yIGFkZGl0aW9uYWwgY2h1bmtzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmUgPSAoY2h1bmtJZCkgPT4ge1xuXHRyZXR1cm4gUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5mKS5yZWR1Y2UoKHByb21pc2VzLCBrZXkpID0+IHtcblx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmZba2V5XShjaHVua0lkLCBwcm9taXNlcyk7XG5cdFx0cmV0dXJuIHByb21pc2VzO1xuXHR9LCBbXSkpO1xufTsiLCIvLyBUaGlzIGZ1bmN0aW9uIGFsbG93IHRvIHJlZmVyZW5jZSBhc3luYyBjaHVua3Ncbl9fd2VicGFja19yZXF1aXJlX18udSA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gXCJ0aGVtZS1idW5kbGUuY2h1bmsuXCIgKyBjaHVua0lkICsgXCIuanNcIjtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmhtZCA9IChtb2R1bGUpID0+IHtcblx0bW9kdWxlID0gT2JqZWN0LmNyZWF0ZShtb2R1bGUpO1xuXHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsICdleHBvcnRzJywge1xuXHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0c2V0OiAoKSA9PiB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0VTIE1vZHVsZXMgbWF5IG5vdCBhc3NpZ24gbW9kdWxlLmV4cG9ydHMgb3IgZXhwb3J0cy4qLCBVc2UgRVNNIGV4cG9ydCBzeW50YXgsIGluc3RlYWQ6ICcgKyBtb2R1bGUuaWQpO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBtb2R1bGU7XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCJ2YXIgaW5Qcm9ncmVzcyA9IHt9O1xudmFyIGRhdGFXZWJwYWNrUHJlZml4ID0gXCJSb290czpcIjtcbi8vIGxvYWRTY3JpcHQgZnVuY3Rpb24gdG8gbG9hZCBhIHNjcmlwdCB2aWEgc2NyaXB0IHRhZ1xuX193ZWJwYWNrX3JlcXVpcmVfXy5sID0gKHVybCwgZG9uZSwga2V5LCBjaHVua0lkKSA9PiB7XG5cdGlmKGluUHJvZ3Jlc3NbdXJsXSkgeyBpblByb2dyZXNzW3VybF0ucHVzaChkb25lKTsgcmV0dXJuOyB9XG5cdHZhciBzY3JpcHQsIG5lZWRBdHRhY2g7XG5cdGlmKGtleSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNjcmlwdFwiKTtcblx0XHRmb3IodmFyIGkgPSAwOyBpIDwgc2NyaXB0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIHMgPSBzY3JpcHRzW2ldO1xuXHRcdFx0aWYocy5nZXRBdHRyaWJ1dGUoXCJzcmNcIikgPT0gdXJsIHx8IHMuZ2V0QXR0cmlidXRlKFwiZGF0YS13ZWJwYWNrXCIpID09IGRhdGFXZWJwYWNrUHJlZml4ICsga2V5KSB7IHNjcmlwdCA9IHM7IGJyZWFrOyB9XG5cdFx0fVxuXHR9XG5cdGlmKCFzY3JpcHQpIHtcblx0XHRuZWVkQXR0YWNoID0gdHJ1ZTtcblx0XHRzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcblxuXHRcdHNjcmlwdC5jaGFyc2V0ID0gJ3V0Zi04Jztcblx0XHRzY3JpcHQudGltZW91dCA9IDEyMDtcblx0XHRpZiAoX193ZWJwYWNrX3JlcXVpcmVfXy5uYykge1xuXHRcdFx0c2NyaXB0LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIF9fd2VicGFja19yZXF1aXJlX18ubmMpO1xuXHRcdH1cblx0XHRzY3JpcHQuc2V0QXR0cmlidXRlKFwiZGF0YS13ZWJwYWNrXCIsIGRhdGFXZWJwYWNrUHJlZml4ICsga2V5KTtcblxuXHRcdHNjcmlwdC5zcmMgPSB1cmw7XG5cdH1cblx0aW5Qcm9ncmVzc1t1cmxdID0gW2RvbmVdO1xuXHR2YXIgb25TY3JpcHRDb21wbGV0ZSA9IChwcmV2LCBldmVudCkgPT4ge1xuXHRcdC8vIGF2b2lkIG1lbSBsZWFrcyBpbiBJRS5cblx0XHRzY3JpcHQub25lcnJvciA9IHNjcmlwdC5vbmxvYWQgPSBudWxsO1xuXHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0XHR2YXIgZG9uZUZucyA9IGluUHJvZ3Jlc3NbdXJsXTtcblx0XHRkZWxldGUgaW5Qcm9ncmVzc1t1cmxdO1xuXHRcdHNjcmlwdC5wYXJlbnROb2RlICYmIHNjcmlwdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG5cdFx0ZG9uZUZucyAmJiBkb25lRm5zLmZvckVhY2goKGZuKSA9PiAoZm4oZXZlbnQpKSk7XG5cdFx0aWYocHJldikgcmV0dXJuIHByZXYoZXZlbnQpO1xuXHR9XG5cdHZhciB0aW1lb3V0ID0gc2V0VGltZW91dChvblNjcmlwdENvbXBsZXRlLmJpbmQobnVsbCwgdW5kZWZpbmVkLCB7IHR5cGU6ICd0aW1lb3V0JywgdGFyZ2V0OiBzY3JpcHQgfSksIDEyMDAwMCk7XG5cdHNjcmlwdC5vbmVycm9yID0gb25TY3JpcHRDb21wbGV0ZS5iaW5kKG51bGwsIHNjcmlwdC5vbmVycm9yKTtcblx0c2NyaXB0Lm9ubG9hZCA9IG9uU2NyaXB0Q29tcGxldGUuYmluZChudWxsLCBzY3JpcHQub25sb2FkKTtcblx0bmVlZEF0dGFjaCAmJiBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG59OyIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubm1kID0gKG1vZHVsZSkgPT4ge1xuXHRtb2R1bGUucGF0aHMgPSBbXTtcblx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRyZXR1cm4gbW9kdWxlO1xufTsiLCJ2YXIgc2NyaXB0VXJsO1xuaWYgKF9fd2VicGFja19yZXF1aXJlX18uZy5pbXBvcnRTY3JpcHRzKSBzY3JpcHRVcmwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLmcubG9jYXRpb24gKyBcIlwiO1xudmFyIGRvY3VtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5nLmRvY3VtZW50O1xuaWYgKCFzY3JpcHRVcmwgJiYgZG9jdW1lbnQpIHtcblx0aWYgKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdTQ1JJUFQnKVxuXHRcdHNjcmlwdFVybCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjO1xuXHRpZiAoIXNjcmlwdFVybCkge1xuXHRcdHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIik7XG5cdFx0aWYoc2NyaXB0cy5sZW5ndGgpIHtcblx0XHRcdHZhciBpID0gc2NyaXB0cy5sZW5ndGggLSAxO1xuXHRcdFx0d2hpbGUgKGkgPiAtMSAmJiAoIXNjcmlwdFVybCB8fCAhL15odHRwKHM/KTovLnRlc3Qoc2NyaXB0VXJsKSkpIHNjcmlwdFVybCA9IHNjcmlwdHNbaS0tXS5zcmM7XG5cdFx0fVxuXHR9XG59XG4vLyBXaGVuIHN1cHBvcnRpbmcgYnJvd3NlcnMgd2hlcmUgYW4gYXV0b21hdGljIHB1YmxpY1BhdGggaXMgbm90IHN1cHBvcnRlZCB5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dC5wdWJsaWNQYXRoIG1hbnVhbGx5IHZpYSBjb25maWd1cmF0aW9uXG4vLyBvciBwYXNzIGFuIGVtcHR5IHN0cmluZyAoXCJcIikgYW5kIHNldCB0aGUgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gdmFyaWFibGUgZnJvbSB5b3VyIGNvZGUgdG8gdXNlIHlvdXIgb3duIGxvZ2ljLlxuaWYgKCFzY3JpcHRVcmwpIHRocm93IG5ldyBFcnJvcihcIkF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyXCIpO1xuc2NyaXB0VXJsID0gc2NyaXB0VXJsLnJlcGxhY2UoL15ibG9iOi8sIFwiXCIpLnJlcGxhY2UoLyMuKiQvLCBcIlwiKS5yZXBsYWNlKC9cXD8uKiQvLCBcIlwiKS5yZXBsYWNlKC9cXC9bXlxcL10rJC8sIFwiL1wiKTtcbl9fd2VicGFja19yZXF1aXJlX18ucCA9IHNjcmlwdFVybDsiLCIvLyBubyBiYXNlVVJJXG5cbi8vIG9iamVjdCB0byBzdG9yZSBsb2FkZWQgYW5kIGxvYWRpbmcgY2h1bmtzXG4vLyB1bmRlZmluZWQgPSBjaHVuayBub3QgbG9hZGVkLCBudWxsID0gY2h1bmsgcHJlbG9hZGVkL3ByZWZldGNoZWRcbi8vIFtyZXNvbHZlLCByZWplY3QsIFByb21pc2VdID0gY2h1bmsgbG9hZGluZywgMCA9IGNodW5rIGxvYWRlZFxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0XCJtYWluXCI6IDBcbn07XG5cbl9fd2VicGFja19yZXF1aXJlX18uZi5qID0gKGNodW5rSWQsIHByb21pc2VzKSA9PiB7XG5cdFx0Ly8gSlNPTlAgY2h1bmsgbG9hZGluZyBmb3IgamF2YXNjcmlwdFxuXHRcdHZhciBpbnN0YWxsZWRDaHVua0RhdGEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm8oaW5zdGFsbGVkQ2h1bmtzLCBjaHVua0lkKSA/IGluc3RhbGxlZENodW5rc1tjaHVua0lkXSA6IHVuZGVmaW5lZDtcblx0XHRpZihpbnN0YWxsZWRDaHVua0RhdGEgIT09IDApIHsgLy8gMCBtZWFucyBcImFscmVhZHkgaW5zdGFsbGVkXCIuXG5cblx0XHRcdC8vIGEgUHJvbWlzZSBtZWFucyBcImN1cnJlbnRseSBsb2FkaW5nXCIuXG5cdFx0XHRpZihpbnN0YWxsZWRDaHVua0RhdGEpIHtcblx0XHRcdFx0cHJvbWlzZXMucHVzaChpbnN0YWxsZWRDaHVua0RhdGFbMl0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYodHJ1ZSkgeyAvLyBhbGwgY2h1bmtzIGhhdmUgSlNcblx0XHRcdFx0XHQvLyBzZXR1cCBQcm9taXNlIGluIGNodW5rIGNhY2hlXG5cdFx0XHRcdFx0dmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiAoaW5zdGFsbGVkQ2h1bmtEYXRhID0gaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gW3Jlc29sdmUsIHJlamVjdF0pKTtcblx0XHRcdFx0XHRwcm9taXNlcy5wdXNoKGluc3RhbGxlZENodW5rRGF0YVsyXSA9IHByb21pc2UpO1xuXG5cdFx0XHRcdFx0Ly8gc3RhcnQgY2h1bmsgbG9hZGluZ1xuXHRcdFx0XHRcdHZhciB1cmwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLnAgKyBfX3dlYnBhY2tfcmVxdWlyZV9fLnUoY2h1bmtJZCk7XG5cdFx0XHRcdFx0Ly8gY3JlYXRlIGVycm9yIGJlZm9yZSBzdGFjayB1bndvdW5kIHRvIGdldCB1c2VmdWwgc3RhY2t0cmFjZSBsYXRlclxuXHRcdFx0XHRcdHZhciBlcnJvciA9IG5ldyBFcnJvcigpO1xuXHRcdFx0XHRcdHZhciBsb2FkaW5nRW5kZWQgPSAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhpbnN0YWxsZWRDaHVua3MsIGNodW5rSWQpKSB7XG5cdFx0XHRcdFx0XHRcdGluc3RhbGxlZENodW5rRGF0YSA9IGluc3RhbGxlZENodW5rc1tjaHVua0lkXTtcblx0XHRcdFx0XHRcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdGlmKGluc3RhbGxlZENodW5rRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBlcnJvclR5cGUgPSBldmVudCAmJiAoZXZlbnQudHlwZSA9PT0gJ2xvYWQnID8gJ21pc3NpbmcnIDogZXZlbnQudHlwZSk7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJlYWxTcmMgPSBldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnNyYztcblx0XHRcdFx0XHRcdFx0XHRlcnJvci5tZXNzYWdlID0gJ0xvYWRpbmcgY2h1bmsgJyArIGNodW5rSWQgKyAnIGZhaWxlZC5cXG4oJyArIGVycm9yVHlwZSArICc6ICcgKyByZWFsU3JjICsgJyknO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLm5hbWUgPSAnQ2h1bmtMb2FkRXJyb3InO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLnR5cGUgPSBlcnJvclR5cGU7XG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3IucmVxdWVzdCA9IHJlYWxTcmM7XG5cdFx0XHRcdFx0XHRcdFx0aW5zdGFsbGVkQ2h1bmtEYXRhWzFdKGVycm9yKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5sKHVybCwgbG9hZGluZ0VuZGVkLCBcImNodW5rLVwiICsgY2h1bmtJZCwgY2h1bmtJZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG59O1xuXG4vLyBubyBwcmVmZXRjaGluZ1xuXG4vLyBubyBwcmVsb2FkZWRcblxuLy8gbm8gSE1SXG5cbi8vIG5vIEhNUiBtYW5pZmVzdFxuXG4vLyBubyBvbiBjaHVua3MgbG9hZGVkXG5cbi8vIGluc3RhbGwgYSBKU09OUCBjYWxsYmFjayBmb3IgY2h1bmsgbG9hZGluZ1xudmFyIHdlYnBhY2tKc29ucENhbGxiYWNrID0gKHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uLCBkYXRhKSA9PiB7XG5cdHZhciBbY2h1bmtJZHMsIG1vcmVNb2R1bGVzLCBydW50aW1lXSA9IGRhdGE7XG5cdC8vIGFkZCBcIm1vcmVNb2R1bGVzXCIgdG8gdGhlIG1vZHVsZXMgb2JqZWN0LFxuXHQvLyB0aGVuIGZsYWcgYWxsIFwiY2h1bmtJZHNcIiBhcyBsb2FkZWQgYW5kIGZpcmUgY2FsbGJhY2tcblx0dmFyIG1vZHVsZUlkLCBjaHVua0lkLCBpID0gMDtcblx0aWYoY2h1bmtJZHMuc29tZSgoaWQpID0+IChpbnN0YWxsZWRDaHVua3NbaWRdICE9PSAwKSkpIHtcblx0XHRmb3IobW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcblx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG5cdFx0XHRcdF9fd2VicGFja19yZXF1aXJlX18ubVttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmKHJ1bnRpbWUpIHZhciByZXN1bHQgPSBydW50aW1lKF9fd2VicGFja19yZXF1aXJlX18pO1xuXHR9XG5cdGlmKHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKSBwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbihkYXRhKTtcblx0Zm9yKDtpIDwgY2h1bmtJZHMubGVuZ3RoOyBpKyspIHtcblx0XHRjaHVua0lkID0gY2h1bmtJZHNbaV07XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGluc3RhbGxlZENodW5rcywgY2h1bmtJZCkgJiYgaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdKSB7XG5cdFx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF1bMF0oKTtcblx0XHR9XG5cdFx0aW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gMDtcblx0fVxuXG59XG5cbnZhciBjaHVua0xvYWRpbmdHbG9iYWwgPSBzZWxmW1wid2VicGFja0NodW5rUm9vdHNcIl0gPSBzZWxmW1wid2VicGFja0NodW5rUm9vdHNcIl0gfHwgW107XG5jaHVua0xvYWRpbmdHbG9iYWwuZm9yRWFjaCh3ZWJwYWNrSnNvbnBDYWxsYmFjay5iaW5kKG51bGwsIDApKTtcbmNodW5rTG9hZGluZ0dsb2JhbC5wdXNoID0gd2VicGFja0pzb25wQ2FsbGJhY2suYmluZChudWxsLCBjaHVua0xvYWRpbmdHbG9iYWwucHVzaC5iaW5kKGNodW5rTG9hZGluZ0dsb2JhbCkpOyIsIl9fd2VicGFja19wdWJsaWNfcGF0aF9fID0gd2luZG93Ll9fd2VicGFja19wdWJsaWNfcGF0aF9fOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXHJcblxyXG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vdGhlbWUvZ2xvYmFsJztcclxuXHJcbmNvbnN0IGdldEFjY291bnQgPSAoKSA9PiBpbXBvcnQoJy4vdGhlbWUvYWNjb3VudCcpO1xyXG5jb25zdCBnZXRMb2dpbiA9ICgpID0+IGltcG9ydCgnLi90aGVtZS9hdXRoJyk7XHJcbmNvbnN0IG5vb3AgPSBudWxsO1xyXG5cclxuY29uc3QgcGFnZUNsYXNzZXMgPSB7XHJcbiAgICBhY2NvdW50X29yZGVyc3RhdHVzOiBnZXRBY2NvdW50LFxyXG4gICAgYWNjb3VudF9vcmRlcjogZ2V0QWNjb3VudCxcclxuICAgIGFjY291bnRfYWRkcmVzc2Jvb2s6IGdldEFjY291bnQsXHJcbiAgICBzaGlwcGluZ2FkZHJlc3Nmb3JtOiBnZXRBY2NvdW50LFxyXG4gICAgYWNjb3VudF9uZXdfcmV0dXJuOiBnZXRBY2NvdW50LFxyXG4gICAgJ2FkZC13aXNobGlzdCc6ICgpID0+IGltcG9ydCgnLi90aGVtZS93aXNobGlzdCcpLFxyXG4gICAgYWNjb3VudF9yZWNlbnRpdGVtczogZ2V0QWNjb3VudCxcclxuICAgIGFjY291bnRfZG93bmxvYWRpdGVtOiBnZXRBY2NvdW50LFxyXG4gICAgZWRpdGFjY291bnQ6IGdldEFjY291bnQsXHJcbiAgICBhY2NvdW50X2luYm94OiBnZXRBY2NvdW50LFxyXG4gICAgYWNjb3VudF9zYXZlZF9yZXR1cm46IGdldEFjY291bnQsXHJcbiAgICBhY2NvdW50X3JldHVybnM6IGdldEFjY291bnQsXHJcbiAgICBhY2NvdW50X3BheW1lbnRtZXRob2RzOiBnZXRBY2NvdW50LFxyXG4gICAgYWNjb3VudF9hZGRwYXltZW50bWV0aG9kOiBnZXRBY2NvdW50LFxyXG4gICAgYWNjb3VudF9lZGl0cGF5bWVudG1ldGhvZDogZ2V0QWNjb3VudCxcclxuICAgIGxvZ2luOiBnZXRMb2dpbixcclxuICAgIGNyZWF0ZWFjY291bnRfdGhhbmtzOiBnZXRMb2dpbixcclxuICAgIGNyZWF0ZWFjY291bnQ6IGdldExvZ2luLFxyXG4gICAgZ2V0bmV3cGFzc3dvcmQ6IGdldExvZ2luLFxyXG4gICAgZm9yZ290cGFzc3dvcmQ6IGdldExvZ2luLFxyXG4gICAgYmxvZzogbm9vcCxcclxuICAgIGJsb2dfcG9zdDogbm9vcCxcclxuICAgIGJyYW5kOiAoKSA9PiBpbXBvcnQoJy4vdGhlbWUvYnJhbmQnKSxcclxuICAgIGJyYW5kczogKCkgPT4gaW1wb3J0KCcuL3RoZW1lL2JyYW5kcycpLFxyXG4gICAgY2FydDogKCkgPT4gaW1wb3J0KCcuL3RoZW1lL2NhcnQnKSxcclxuICAgIGNhdGVnb3J5OiAoKSA9PiBpbXBvcnQoJy4vdGhlbWUvY2F0ZWdvcnknKSxcclxuICAgIGNvbXBhcmU6ICgpID0+IGltcG9ydCgnLi90aGVtZS9jb21wYXJlJyksXHJcbiAgICBwYWdlX2NvbnRhY3RfZm9ybTogKCkgPT4gaW1wb3J0KCcuL3RoZW1lL2NvbnRhY3QtdXMnKSxcclxuICAgIGVycm9yOiBub29wLFxyXG4gICAgNDA0OiBub29wLFxyXG4gICAgZ2lmdGNlcnRpZmljYXRlczogKCkgPT4gaW1wb3J0KCcuL3RoZW1lL2dpZnQtY2VydGlmaWNhdGUnKSxcclxuICAgIGdpZnRjZXJ0aWZpY2F0ZXNfYmFsYW5jZTogKCkgPT4gaW1wb3J0KCcuL3RoZW1lL2dpZnQtY2VydGlmaWNhdGUnKSxcclxuICAgIGdpZnRjZXJ0aWZpY2F0ZXNfcmVkZWVtOiAoKSA9PiBpbXBvcnQoJy4vdGhlbWUvZ2lmdC1jZXJ0aWZpY2F0ZScpLFxyXG4gICAgZGVmYXVsdDogbm9vcCxcclxuICAgIHBhZ2U6IG5vb3AsXHJcbiAgICBwcm9kdWN0OiAoKSA9PiBpbXBvcnQoJy4vdGhlbWUvcHJvZHVjdCcpLFxyXG4gICAgYW1wX3Byb2R1Y3Rfb3B0aW9uczogKCkgPT4gaW1wb3J0KCcuL3RoZW1lL3Byb2R1Y3QnKSxcclxuICAgIHNlYXJjaDogKCkgPT4gaW1wb3J0KCcuL3RoZW1lL3NlYXJjaCcpLFxyXG4gICAgcnNzOiBub29wLFxyXG4gICAgc2l0ZW1hcDogbm9vcCxcclxuICAgIG5ld3NsZXR0ZXJfc3Vic2NyaWJlOiBub29wLFxyXG4gICAgd2lzaGxpc3Q6ICgpID0+IGltcG9ydCgnLi90aGVtZS93aXNobGlzdCcpLFxyXG4gICAgd2lzaGxpc3RzOiAoKSA9PiBpbXBvcnQoJy4vdGhlbWUvd2lzaGxpc3QnKSxcclxufTtcclxuXHJcbmNvbnN0IGN1c3RvbUNsYXNzZXMgPSB7fTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGZ1bmN0aW9uIGdldHMgYWRkZWQgdG8gdGhlIGdsb2JhbCB3aW5kb3cgYW5kIHRoZW4gY2FsbGVkXHJcbiAqIG9uIHBhZ2UgbG9hZCB3aXRoIHRoZSBjdXJyZW50IHRlbXBsYXRlIGxvYWRlZCBhbmQgSlMgQ29udGV4dCBwYXNzZWQgaW5cclxuICogQHBhcmFtIHBhZ2VUeXBlIFN0cmluZ1xyXG4gKiBAcGFyYW0gY29udGV4dEpTT05cclxuICogQHJldHVybnMgeyp9XHJcbiAqL1xyXG53aW5kb3cuc3RlbmNpbEJvb3RzdHJhcCA9IGZ1bmN0aW9uIHN0ZW5jaWxCb290c3RyYXAocGFnZVR5cGUsIGNvbnRleHRKU09OID0gbnVsbCwgbG9hZEdsb2JhbCA9IHRydWUpIHtcclxuICAgIGNvbnN0IGNvbnRleHQgPSBKU09OLnBhcnNlKGNvbnRleHRKU09OIHx8ICd7fScpO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbG9hZCgpIHtcclxuICAgICAgICAgICAgJCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBMb2FkIGdsb2JhbHNcclxuICAgICAgICAgICAgICAgIGlmIChsb2FkR2xvYmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgR2xvYmFsLmxvYWQoY29udGV4dCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgaW1wb3J0UHJvbWlzZXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBhcHByb3ByaWF0ZSBwYWdlIGxvYWRlciBiYXNlZCBvbiBwYWdlVHlwZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZUNsYXNzSW1wb3J0ZXIgPSBwYWdlQ2xhc3Nlc1twYWdlVHlwZV07XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhZ2VDbGFzc0ltcG9ydGVyID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0UHJvbWlzZXMucHVzaChwYWdlQ2xhc3NJbXBvcnRlcigpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYSBwYWdlIGNsYXNzIGRlZmF1bHQgZm9yIGEgY3VzdG9tIHRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21UZW1wbGF0ZUltcG9ydGVyID0gY3VzdG9tQ2xhc3Nlc1tjb250ZXh0LnRlbXBsYXRlXTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3VzdG9tVGVtcGxhdGVJbXBvcnRlciA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGltcG9ydFByb21pc2VzLnB1c2goY3VzdG9tVGVtcGxhdGVJbXBvcnRlcigpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciBpbXBvcnRzIHRvIHJlc29sdmUsIHRoZW4gY2FsbCBsb2FkKCkgb24gdGhlbVxyXG4gICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwoaW1wb3J0UHJvbWlzZXMpLnRoZW4oaW1wb3J0cyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0cy5mb3JFYWNoKGltcG9ydGVkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0ZWQuZGVmYXVsdC5sb2FkKGNvbnRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICB9O1xyXG59O1xyXG4iXSwibmFtZXMiOlsiYXJpYUtleUNvZGVzIiwiUkVUVVJOIiwiU1BBQ0UiLCJMRUZUIiwiVVAiLCJSSUdIVCIsIkRPV04iLCJkZWZhdWx0IiwiaW5pdFJhZGlvT3B0aW9ucyIsInNldENoZWNrZWRSYWRpb0l0ZW0iLCJpdGVtQ29sbGVjdGlvbiIsIml0ZW1JZHgiLCJlYWNoIiwiaWR4IiwiaXRlbSIsIiRpdGVtIiwiJCIsImF0dHIiLCJwcm9wIiwiZm9jdXMiLCJ0cmlnZ2VyIiwiY2FsY3VsYXRlVGFyZ2V0SXRlbVBvc2l0aW9uIiwibGFzdEl0ZW1JZHgiLCJjdXJyZW50SWR4IiwiaGFuZGxlSXRlbUtleURvd24iLCJlIiwia2V5Q29kZSIsImluZGV4IiwiY3VycmVudFRhcmdldCIsImxhc3RDb2xsZWN0aW9uSXRlbUlkeCIsImxlbmd0aCIsIk9iamVjdCIsInZhbHVlcyIsImluY2x1ZGVzIiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJwcmV2SXRlbUlkeCIsImdldCIsIm5leHRJdGVtSWR4IiwiJGNvbnRhaW5lciIsIml0ZW1TZWxlY3RvciIsIiRpdGVtQ29sbGVjdGlvbiIsImZpbmQiLCJvbiIsIkZPQ1VTQUJMRV9FTEVNRU5UU19TRUxFQ1RPUiIsImFjdGl2YXRlUGxheVBhdXNlQnV0dG9uIiwiYW5hbGl6ZVNsaWRlcyIsImFycm93QXJpYUxhYmxpbmciLCJkb3RzU2V0dXAiLCJnZXRBY3RpdmVTbGlkZUlkeEFuZFNsaWRlc1F1YW50aXR5IiwiaGFuZGxlSW1hZ2VBc3BlY3RSYXRpbyIsImhhbmRsZUltYWdlTG9hZCIsInJlZnJlc2hGb2N1cyIsInVwZGF0ZVRleHRXaXRoTGl2ZURhdGEiLCJzZXRDYXJvdXNlbFN0YXRlIiwiX3JlZiIsImNhcm91c2VsT2JqIiwiZGVsZWdhdGVUYXJnZXQiLCJjYXJvdXNlbE9iakN1cnJlbnQiLCJzbGljayIsIiRzbGlkZXIiLCJkYXRhIiwib25Vc2VyQ2Fyb3VzZWxDaGFuZ2UiLCJfcmVmMiIsImNvbnRleHQiLCIkYWN0aXZlU2xpZGVyIiwiJHBhcmVudENvbnRhaW5lciIsImhhc0NsYXNzIiwicGFyZW50IiwiXyRhY3RpdmVTbGlkZXIkZGF0YSIsImFjdGl2ZVNsaWRlSWR4Iiwic2xpZGVzUXVhbnRpdHkiLCIkY2Fyb3VzZWxDb250ZW50RWxlbWVudCIsImNhcm91c2VsQ29udGVudEFubm91bmNlTWVzc2FnZSIsInRleHQiLCJvblNsaWNrQ2Fyb3VzZWxDaGFuZ2UiLCIkZG90cyIsIiRwcmV2QXJyb3ciLCIkbmV4dEFycm93IiwiaW5maW5pdGUiLCJvcHRpb25zIiwiX3JlZjMiLCJjYXJvdXNlbEFycm93QW5kRG90QXJpYUxhYmVsIiwiY2Fyb3VzZWwiLCIkY2Fyb3VzZWwiLCJkb2N1bWVudCIsImRvY3VtZW50RWxlbWVudCIsInN0eWxlIiwib2JqZWN0Rml0Iiwic2xpZGUiLCJhZGRDbGFzcyIsImlzTXVsdGlwbGVTbGlkZXMiLCJjaGlsZHJlbiIsImN1c3RvbVBhZ2luZyIsImFjY2Vzc2liaWxpdHkiLCJhcnJvd3MiLCJkb3RzIiwiUExBWV9BQ1RJT04iLCJQQVVTRV9BQ1RJT04iLCJ1cGRhdGVCdXR0b25MYWJlbHMiLCJjYXJvdXNlbFBsYXlQYXVzZUJ1dHRvblBsYXkiLCJjYXJvdXNlbFBsYXlQYXVzZUJ1dHRvblBhdXNlIiwiY2Fyb3VzZWxQbGF5UGF1c2VCdXR0b25BcmlhUGxheSIsImNhcm91c2VsUGxheVBhdXNlQnV0dG9uQXJpYVBhdXNlIiwiJGJ1dHRvbiIsImFjdGlvbiIsInVwZGF0ZUJ1dHRvbkxhYmVsc1dpdGhDb250ZXh0Iiwic3BlZWQiLCIkcGxheVBhdXNlQnV0dG9uIiwiaW5zZXJ0QmVmb3JlIiwiYXBwZW5kIiwiXyRzbGlkZXIkZGF0YSIsImNzcyIsInR5cGUiLCJvblBsYXlQYXVzZUNsaWNrIiwicGF1c2VkIiwiX3Rocm90dGxlIiwidHJhaWxpbmciLCIkc2xpZGVzIiwiJHNsaWRlIiwidGFiSW5kZXgiLCJpcyIsImNoaWxkIiwidG9vbHRpcFNldHVwIiwiaXNJbmZpbml0ZSIsImFyaWFMYWJlbCIsImFjdGl2ZVNsaWRlTnVtYmVyIiwicHJldlNsaWRlTnVtYmVyIiwiYXJyb3dMZWZ0VGV4dCIsInRhYmluZGV4IiwibmV4dFNsaWRlTnVtYmVyIiwiYXJyb3dSaWdodFRleHQiLCJjYXJvdXNlbEFjdGl2ZURvdEFyaWFMYWJlbCIsImRvdCIsImRvdExhYmVsVGV4dCIsImRvdFNsaWRlU3RhdHVzVGV4dCIsImRvdEFyaWFMYWJlbCIsIiRkb3RCdXR0b24iLCJzbGlkZUNvdW50IiwiX3JlZiRvcHRpb25zIiwic2xpZGVzVG9TaG93Iiwic2xpZGVzVG9TY3JvbGwiLCJsYXN0VmlzaWJsZUlkeCIsInJlZHVjZSIsImFjYyIsImN1cnIiLCJNYXRoIiwiY2VpbCIsImlzQW5hbHl6ZWREYXRhQXR0ciIsIiRhY3RpdmVTbGlkZSIsImlzQW5hbHl6ZWRTbGlkZSIsIiRhY3RpdmVTbGlkZUltZyIsImFjdGl2ZVNsaWRlSW1nTm9kZSIsIiRhY3RpdmVTbGlkZUFuZENsb25lcyIsImdldEFjdGl2ZVNsaWRlSW5mbyIsIklNQUdFX0NMQVNTRVMiLCJ2ZXJ0aWNhbCIsInNxdWFyZSIsIklTX0FOQUxZWkVEX0RBVEFfQVRUUiIsImRlZmluZUFzcGVjdFJhdGlvQ2xhc3MiLCJpbWFnZUFzcGVjdFJhdGlvIiwic2V0QXNwZWN0UmF0aW9DbGFzcyIsImltYWdlTm9kZSIsIm5hdHVyYWxIZWlnaHQiLCJuYXR1cmFsV2lkdGgiLCJfZ2V0QWN0aXZlU2xpZGVJbmZvIiwiY29tcGxldGUiLCJpc0Jyb3dzZXJJRSIsIklNQUdFX0VSUk9SX0NMQVNTIiwiZ2VuZXJhdGVJbWFnZSIsIiRpbWFnZSIsImZpcnN0IiwiJGZpcnN0QWN0aXZlU2xpZGUiLCJUT09MVElQX0RBVEFfU0VMRUNUT1IiLCJUT09MVElQX0NMQVNTIiwiVE9PTFRJUF9OT0RFIiwiJG5vZGUiLCIkZXhpc3RlZFRvb2x0aXAiLCIkdG9vbHRpcCIsIlNMSURFX05VTUJFUiIsIlNMSURFU19RVUFOVElUWSIsInRleHRGb3JDaGFuZ2UiLCJzbGlkZU51bWJlciIsInJlcGxhY2UiLCJDb2xsYXBzaWJsZUV2ZW50cyIsIlBMVUdJTl9LRVkiLCJDb2xsYXBzaWJsZUdyb3VwIiwiJGNvbXBvbmVudCIsIm9wZW5Db2xsYXBzaWJsZSIsIm9uQ29sbGFwc2libGVPcGVuIiwiYmluZCIsIm9uQ29sbGFwc2libGVDbG9zZSIsImJpbmRFdmVudHMiLCJfcHJvdG8iLCJwcm90b3R5cGUiLCJjbG9zZSIsImRpc2FibGVkIiwib3BlbiIsInVuYmluZEV2ZW50cyIsIm9mZiIsImV2ZW50IiwiY29sbGFwc2libGVJbnN0YW5jZSIsImhhc0NvbGxhcHNpYmxlIiwiY29sbGFwc2libGVHcm91cEZhY3RvcnkiLCJzZWxlY3RvciIsIiRncm91cHMiLCIkY29udGV4dCIsImluc3RhbmNlS2V5IiwibWFwIiwiZWxlbWVudCIsIiRncm91cCIsImNhY2hlZEdyb3VwIiwiZ3JvdXAiLCJ0b0FycmF5IiwibWVkaWFRdWVyeUxpc3RGYWN0b3J5IiwidG9nZ2xlIiwiY2xpY2siLCJDb2xsYXBzaWJsZVN0YXRlIiwiY2xvc2VkIiwicHJlcGVuZEhhc2giLCJpZCIsImluZGV4T2YiLCJvcHRpb25zRnJvbURhdGEiLCIkZWxlbWVudCIsImRpc2FibGVkQnJlYWtwb2ludCIsImRpc2FibGVkU3RhdGUiLCJlbmFibGVkU3RhdGUiLCJvcGVuQ2xhc3NOYW1lIiwiQ29sbGFwc2libGUiLCIkdG9nZ2xlIiwiJHRhcmdldCIsIl90ZW1wIiwiX3JlZiRvcGVuQ2xhc3NOYW1lIiwidGFyZ2V0SWQiLCJkaXNhYmxlZE1lZGlhUXVlcnlMaXN0IiwibWF0Y2hlcyIsIm9uQ2xpY2tlZCIsIm9uRGlzYWJsZWRNZWRpYVF1ZXJ5TGlzdE1hdGNoIiwiaXNDb2xsYXBzZWQiLCJfZ2V0VG9nZ2xlQXJpYUxhYmVsVGV4dCIsImlzT3BlbiIsIiR0ZXh0VG9nZ2xlQ2hpbGRyZW4iLCJmaWx0ZXIiLCJfXyIsInRyaW0iLCIkYXJpYUxhYmVsVGFyZ2V0IiwiX3RlbXAyIiwiX3JlZjIkbm90aWZ5Iiwibm90aWZ5IiwiX3RlbXAzIiwiX3JlZjMkbm90aWZ5IiwicmVtb3ZlQ2xhc3MiLCJ0b2dnbGVCeVN0YXRlIiwic3RhdGUiLCJfbGVuIiwiYXJndW1lbnRzIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImFwcGx5IiwidW5kZWZpbmVkIiwiY29udGFpbnMiLCJhZGRMaXN0ZW5lciIsInJlbW92ZUxpc3RlbmVyIiwibWVkaWEiLCJfY3JlYXRlQ2xhc3MiLCJrZXkiLCJfZGlzYWJsZWQiLCJzZXQiLCJjb2xsYXBzaWJsZUZhY3RvcnkiLCJvdmVycmlkZU9wdGlvbnMiLCIkY29sbGFwc2libGVzIiwiY2FjaGVkQ29sbGFwc2libGUiLCJfZXh0ZW5kIiwiY29sbGFwc2libGUiLCJicmVha3BvaW50U2l6ZXMiLCJsYXJnZSIsIm1lZGl1bSIsInNtYWxsIiwiYnJlYWtwb2ludE5hbWUiLCJ3aW5kb3ciLCJtYXRjaE1lZGlhIiwiYnJlYWtwb2ludCIsIm1lZGlhUXVlcnkiLCJtZWRpYVF1ZXJ5TGlzdCIsImZvcm1zIiwiZW1haWwiLCJ2YWx1ZSIsInJlIiwidGVzdCIsInBhc3N3b3JkIiwibm90RW1wdHkiLCJudW1iZXJzT25seSIsInZhbGlkYXRlSW5jcmVhc2VBZ2FpbnN0TWF4Qm91bmRhcnkiLCJtYXgiLCJyYWlzZSIsInZhbGlkYXRlRGVjcmVhc2VBZ2FpbnN0TWluQm91bmRhcnkiLCJtaW4iLCJkZWNsaW5lIiwibWluTWF4VmFsaWRhdGUiLCJtaW5JbnB1dFNlbGVjdG9yIiwibWF4SW5wdXRTZWxlY3RvciIsInZhbGlkYXRlIiwiY2IiLCJtaW5WYWx1ZSIsInBhcnNlRmxvYXQiLCJ2YWwiLCJtYXhWYWx1ZSIsIl9pc05hTiIsIm5vZCIsImNsYXNzZXMiLCJlcnJvckNsYXNzIiwic3VjY2Vzc0NsYXNzIiwiZXJyb3JNZXNzYWdlQ2xhc3MiLCJjaGVja0Z1bmN0aW9ucyIsIldpc2hsaXN0Iiwib3B0aW9uc1R5cGVzTWFwIiwiSU5QVVRfRklMRSIsIklOUFVUX1RFWFQiLCJJTlBVVF9OVU1CRVIiLCJJTlBVVF9DSEVDS0JPWCIsIlRFWFRBUkVBIiwiREFURSIsIlNFVF9TRUxFQ1QiLCJTRVRfUkVDVEFOR0xFIiwiU0VUX1JBRElPIiwiU1dBVENIIiwiUFJPRFVDVF9MSVNUIiwib3B0aW9uQ2hhbmdlRGVjb3JhdG9yIiwiYXJlRGVmYXVsdE90aW9uc1NldCIsIl90aGlzIiwiZXJyIiwicmVzcG9uc2UiLCJhdHRyaWJ1dGVzRGF0YSIsImF0dHJpYnV0ZXNDb250ZW50IiwiY29udGVudCIsInVwZGF0ZVByb2R1Y3RBdHRyaWJ1dGVzIiwidXBkYXRlVmlldyIsInVwZGF0ZURlZmF1bHRBdHRyaWJ1dGVzRm9yT09TIiwiUHJvZHVjdERldGFpbHNCYXNlIiwiJHNjb3BlIiwiX3RoaXMyIiwiaW5pdFJhZGlvQXR0cmlidXRlcyIsImxvYWQiLCJnZXRUYWJSZXF1ZXN0cyIsImdldEF0dHJpYnV0ZSIsIl9tYWtlUHJvZHVjdFZhcmlhbnRBY2Nlc3NpYmxlIiwidmFyaWFudERvbU5vZGUiLCJ2YXJpYW50VHlwZSIsIl90aGlzMyIsImkiLCJyYWRpbyIsIiRyYWRpbyIsIl90aGlzNCIsImJlaGF2aW9yIiwib3V0X29mX3N0b2NrX2JlaGF2aW9yIiwiaW5TdG9ja0lkcyIsImluX3N0b2NrX2F0dHJpYnV0ZXMiLCJvdXRPZlN0b2NrTWVzc2FnZSIsIm91dF9vZl9zdG9ja19tZXNzYWdlIiwiYXR0cmlidXRlIiwiJGF0dHJpYnV0ZSIsImF0dHJJZCIsInBhcnNlSW50IiwiZW5hYmxlQXR0cmlidXRlIiwiZGlzYWJsZUF0dHJpYnV0ZSIsImxvY2F0aW9uIiwiaGFzaCIsIiRhY3RpdmVUYWIiLCJoYXMiLCIkdGFiQ29udGVudCIsInNpYmxpbmdzIiwiZ2V0Vmlld01vZGVsIiwiJHByaWNlV2l0aFRheCIsIiRwcmljZVdpdGhvdXRUYXgiLCJycnBXaXRoVGF4IiwiJGRpdiIsIiRzcGFuIiwicnJwV2l0aG91dFRheCIsIm5vblNhbGVXaXRoVGF4Iiwibm9uU2FsZVdpdGhvdXRUYXgiLCJwcmljZVNhdmVkIiwicHJpY2VOb3dMYWJlbCIsInByaWNlTGFiZWwiLCIkd2VpZ2h0IiwiJGluY3JlbWVudHMiLCIkYWRkVG9DYXJ0IiwiJHdpc2hsaXN0VmFyaWF0aW9uIiwic3RvY2siLCIkaW5wdXQiLCJza3UiLCIkbGFiZWwiLCIkdmFsdWUiLCJ1cGMiLCJxdWFudGl0eSIsIiR0ZXh0IiwiJGJ1bGtQcmljaW5nIiwiJHdhbGxldEJ1dHRvbnMiLCJjbGVhclByaWNpbmdOb3RGb3VuZCIsInZpZXdNb2RlbCIsImhpZGUiLCJzaG93TWVzc2FnZUJveCIsInN0b2NrX21lc3NhZ2UiLCJwdXJjaGFzaW5nX21lc3NhZ2UiLCJfaXNPYmplY3QiLCJwcmljZSIsInVwZGF0ZVByaWNlVmlldyIsIndlaWdodCIsImh0bWwiLCJmb3JtYXR0ZWQiLCJ2YXJpYW50SWQiLCJzaG93IiwiX2lzTnVtYmVyIiwidXBkYXRlV2FsbGV0QnV0dG9uc1ZpZXciLCJidWxrX2Rpc2NvdW50X3JhdGVzIiwiYWRkVG9DYXJ0V3JhcHBlciIsInB1cmNoYXNhYmxlIiwid2l0aF90YXgiLCJ1cGRhdGVkUHJpY2UiLCJwcmljZV9yYW5nZSIsIndpdGhvdXRfdGF4IiwicnJwX3dpdGhfdGF4IiwicnJwX3dpdGhvdXRfdGF4Iiwic2F2ZWQiLCJub25fc2FsZV9wcmljZV93aXRoX3RheCIsIm5vbl9zYWxlX3ByaWNlX3dpdGhvdXRfdGF4IiwibWVzc2FnZSIsIiRtZXNzYWdlQm94IiwiaW5zdG9jayIsInRvZ2dsZVdhbGxldEJ1dHRvbnNWaXNpYmlsaXR5Iiwic2hvdWxkU2hvdyIsImdldEF0dHJpYnV0ZVR5cGUiLCJlbmFibGVTZWxlY3RPcHRpb25BdHRyaWJ1dGUiLCJkaXNhYmxlU2VsZWN0T3B0aW9uQXR0cmlidXRlIiwiJHBhcmVudCIsImNsb3Nlc3QiLCIkc2VsZWN0IiwidG9nZ2xlT3B0aW9uIiwic2VsZWN0ZWRJbmRleCIsInV0aWxzIiwiSW1hZ2VHYWxsZXJ5IiwibW9kYWxGYWN0b3J5IiwiYWxlcnRNb2RhbCIsInNob3dBbGVydE1vZGFsIiwiYW5ub3VuY2VJbnB1dEVycm9yTWVzc2FnZSIsIm5vcm1hbGl6ZUZvcm1EYXRhIiwiY29udmVydEludG9BcnJheSIsImJhbm5lclV0aWxzIiwiUHJvZHVjdERldGFpbHMiLCJfUHJvZHVjdERldGFpbHNCYXNlIiwicHJvZHVjdEF0dHJpYnV0ZXNEYXRhIiwiY2FsbCIsIiRvdmVybGF5IiwiaW1hZ2VHYWxsZXJ5IiwiaW5pdCIsImxpc3RlblF1YW50aXR5Q2hhbmdlIiwiJHN3YXRjaE9wdGlvbk1lc3NhZ2UiLCJzd2F0Y2hJbml0TWVzc2FnZVN0b3JhZ2UiLCJzd2F0Y2hHcm91cElkTGlzdCIsIl8iLCJzdG9yZUluaXRNZXNzYWdlc0ZvclN3YXRjaGVzIiwiJGZvcm0iLCJhZGRUb0NhcnRWYWxpZGF0b3IiLCJzdWJtaXQiLCJ0YXAiLCIkcHJvZHVjdE9wdGlvbnNFbGVtZW50IiwiaGFzT3B0aW9ucyIsImhhc0RlZmF1bHRPcHRpb25zIiwiJHByb2R1Y3RTd2F0Y2hHcm91cCIsIiRwcm9kdWN0U3dhdGNoTGFiZWxzIiwicGxhY2VTd2F0Y2hMYWJlbEltYWdlIiwibGFiZWwiLCIkb3B0aW9uSW1hZ2UiLCJvcHRpb25JbWFnZVdpZHRoIiwib3V0ZXJXaWR0aCIsImV4dGVuZGVkT3B0aW9uSW1hZ2VPZmZzZXRMZWZ0IiwiX2xhYmVsJGdldEJvdW5kaW5nQ2xpIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwicmlnaHQiLCJlbXB0eVNwYWNlVG9TY3JlZW5SaWdodEJvcmRlciIsInNjcmVlbiIsIndpZHRoIiwic2hpZnRWYWx1ZSIsInJlZ2lzdGVyQWRkVG9DYXJ0VmFsaWRhdGlvbiIsInNob3dTd2F0Y2hOYW1lcyIsInRhcmdldCIsInN3YXRjaEdyb3VwRWxlbWVudCIsInBhcmVudE5vZGUiLCJzaG93U3dhdGNoTmFtZU9uT3B0aW9uIiwicHJvZHVjdE9wdGlvbnNDaGFuZ2VkIiwic2V0UHJvZHVjdFZhcmlhbnQiLCJwZXJmb3JtQ2hlY2siLCJhcmVBbGwiLCJhZGRQcm9kdWN0VG9DYXJ0IiwiX2lzRW1wdHkiLCIkcHJvZHVjdElkIiwib3B0aW9uQ2hhbmdlQ2FsbGJhY2siLCJhcGkiLCJwcm9kdWN0QXR0cmlidXRlcyIsIm9wdGlvbkNoYW5nZSIsInNlcmlhbGl6ZSIsImRpc3BhdGNoUHJvZHVjdEJhbm5lckV2ZW50IiwicHJldmlld01vZGFsIiwiX2luaGVyaXRzTG9vc2UiLCJhZGQiLCJyZXN1bHQiLCJlcnJvck1lc3NhZ2UiLCJwcm9kdWN0UXVhbnRpdHlFcnJvck1lc3NhZ2UiLCJzd2F0Y2hHcm91cElkIiwidW5zYXRpc2ZpZWRSZXF1aXJlZEZpZWxkcyIsIm9wdGlvbkxhYmVsIiwiaW5uZXJUZXh0Iiwib3B0aW9uVGl0bGUiLCJzcGxpdCIsInJlcXVpcmVkIiwidG9Mb3dlckNhc2UiLCJxdWVyeVNlbGVjdG9yIiwicHVzaCIsImlzU2F0aXNmaWVkIiwiZnJvbSIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJldmVyeSIsInNlbGVjdCIsImRhdGVTdHJpbmciLCJ4Iiwiam9pbiIsImNoZWNrZWQiLCJnZXRTZWxlY3RlZE9wdGlvbkxhYmVsIiwicHJvZHVjdFZhcmlhbnRzbGlzdCIsIm1hdGNoTGFiZWxGb3JDaGVja2VkSW5wdXQiLCJpbnB0IiwiZGF0YXNldCIsInByb2R1Y3RBdHRyaWJ1dGVWYWx1ZSIsImxhYmVscyIsInRpdGxlIiwicHJvZHVjdFZhcmlhbnQiLCJzb3J0IiwidmlldyIsInByb2R1Y3ROYW1lIiwiY2FyZCIsImlzUnVubmluZ0luSWZyYW1lIiwic2VsZiIsInRvcCIsIiRjaGFuZ2VkT3B0aW9uIiwicGFyZW50cyIsInByb2R1Y3RJZCIsIkZvcm1EYXRhIiwicHJvZHVjdEF0dHJpYnV0ZXNDb250ZW50IiwiY2hlY2tJc1F1aWNrVmlld0NoaWxkIiwiJHN3YXRjaCIsIiRzd2F0Y2hHcm91cCIsInN3YXRjaE5hbWUiLCJhY3RpdmVTd2F0Y2hHcm91cElkIiwic2V0TGl2ZVJlZ2lvbkF0dHJpYnV0ZXMiLCJyb2xlVHlwZSIsImFyaWFMaXZlU3RhdHVzIiwicm9sZSIsInNob3dQcm9kdWN0SW1hZ2UiLCJpbWFnZSIsIl9pc1BsYWluT2JqZWN0Iiwiem9vbUltYWdlVXJsIiwidG9vbHMiLCJpbWFnZVNyY3NldCIsImdldFNyY3NldCIsInpvb21TaXplIiwibWFpbkltYWdlVXJsIiwicHJvZHVjdFNpemUiLCJtYWluSW1hZ2VTcmNzZXQiLCJzZXRBbHRlcm5hdGVJbWFnZSIsInJlc3RvcmVJbWFnZSIsInF1YW50aXR5TWluIiwicXVhbnRpdHlNYXgiLCJxdHkiLCJ3aGljaCIsImZvcm0iLCJfdGhpczUiLCIkYWRkVG9DYXJ0QnRuIiwib3JpZ2luYWxCdG5WYWwiLCJ3YWl0TWVzc2FnZSIsImNhcnQiLCJpdGVtQWRkIiwiZXJyb3IiLCJ0bXAiLCJjcmVhdGVFbGVtZW50IiwiaW5uZXJIVE1MIiwiJHByZU1vZGFsRm9jdXNlZEVsIiwidGV4dENvbnRlbnQiLCJ0aGVtZV9zZXR0aW5ncyIsInNob3dfZmFzdF9jYXJ0IiwiQXBwbGVQYXlTZXNzaW9uIiwiJG1vZGFsIiwidXBkYXRlQ2FydENvbnRlbnQiLCJjYXJ0X2l0ZW0iLCJzZXR1cEZvY3VzVHJhcCIsInJlZGlyZWN0VG8iLCJjYXJ0X3VybCIsInVybHMiLCJuZXh0IiwiZ2V0Q2FydENvbnRlbnQiLCJjYXJ0SXRlbUlkIiwib25Db21wbGV0ZSIsInRlbXBsYXRlIiwicGFyYW1zIiwic3VnZ2VzdCIsImNvbmZpZyIsInN1Z2dlc3Rpb25zIiwibGltaXQiLCJnZXRDb250ZW50IiwidXJsIiwiaWZyYW1lU2RrIiwibW9kYWwiLCJ1cGRhdGVDb250ZW50IiwiJGJvZHkiLCIkY2FydFF1YW50aXR5IiwiJGNvbnRlbnQiLCIkY2FydENvdW50ZXIiLCIkcHJvbW90aW9uQmFubmVyIiwiJGJhY2tUb1Nob3BwcGluZ0J0biIsIiRtb2RhbENsb3NlQnRuIiwiYmFubmVyVXBkYXRlSGFuZGxlciIsIiRwcm9kdWN0Q29udGFpbmVyIiwicmVsb2FkIiwiY3VycmVudFNlbGVjdEVsZW1lbnQiLCJkaXNhYmxlZFNlbGVjdEVsZW1lbnQiLCJzZWxlY3RFbGVtZW50IiwiaW5zZXJ0QWZ0ZXIiLCJzZWxlY3RlZE9wdGlvbiIsInByZXZpb3VzSW5kZXgiLCIkZWxlbWVudE5vd0F0UHJldmlvdXNJbmRleCIsImVxIiwiYXBwZW5kVG8iLCJwcmVwZW5kVG8iLCJmbiIsImZpbHRlckVtcHR5VmFsdWVzRnJvbUZvcm0iLCJmb3JtRGF0YSIsInJlcyIsIl9pdGVyYXRvciIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UiLCJfc3RlcCIsImRvbmUiLCJfc3RlcCR2YWx1ZSIsImNvbnNvbGUiLCJsb2ciLCJmaWx0ZXJFbXB0eUZpbGVzRnJvbUZvcm0iLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwiX3N0ZXAyJHZhbHVlIiwiRmlsZSIsIm5hbWUiLCJzaXplIiwiZXZ0IiwiQ3VzdG9tRXZlbnQiLCJkZXRhaWwiLCJhbW91bnQiLCJkaXNwYXRjaEV2ZW50IiwiaW5wdXRUYWdOYW1lcyIsImNyZWF0ZVBhc3N3b3JkVmFsaWRhdGlvbkVycm9yVGV4dE9iamVjdCIsImVtcHR5IiwiY29uZmlybSIsIm1pc21hdGNoIiwiaW52YWxpZCIsIm9uRW1wdHlQYXNzd29yZEVycm9yVGV4dCIsIm9uQ29uZmlybVBhc3N3b3JkRXJyb3JUZXh0Iiwib25NaXNtYXRjaFBhc3N3b3JkRXJyb3JUZXh0Iiwib25Ob3RWYWxpZFBhc3N3b3JkRXJyb3JUZXh0IiwiY2xhc3NpZnlJbnB1dCIsImlucHV0IiwiZm9ybUZpZWxkQ2xhc3MiLCIkZm9ybUZpZWxkIiwidGFnTmFtZSIsImNsYXNzTmFtZSIsInNwZWNpZmljQ2xhc3NOYW1lIiwiaW5wdXRUeXBlIiwiX2luY2x1ZGVzIiwiX2NhbWVsQ2FzZSIsIl9jYXBpdGFsaXplIiwiY2xhc3NpZnlGb3JtIiwiZm9ybVNlbGVjdG9yIiwiJGlucHV0cyIsIl9vcHRpb25zIiwiX29wdGlvbnMkZm9ybUZpZWxkQ2xhIiwiZ2V0RmllbGRJZCIsIiRmaWVsZCIsImZpZWxkSWQiLCJtYXRjaCIsImluc2VydFN0YXRlSGlkZGVuRmllbGQiLCIkc3RhdGVGaWVsZCIsInN0YXRlRmllbGRBdHRycyIsImFmdGVyIiwiYWN0aXZlSW5wdXRDb250YWluZXIiLCIkZXJyTWVzc2FnZSIsIlZhbGlkYXRvcnMiLCJzZXRFbWFpbFZhbGlkYXRpb24iLCJ2YWxpZGF0b3IiLCJmaWVsZCIsImVycm9yVGV4dCIsInNldFBhc3N3b3JkVmFsaWRhdGlvbiIsInBhc3N3b3JkU2VsZWN0b3IiLCJwYXNzd29yZDJTZWxlY3RvciIsInJlcXVpcmVtZW50cyIsImlzT3B0aW9uYWwiLCIkcGFzc3dvcmQiLCJwYXNzd29yZFZhbGlkYXRpb25zIiwiUmVnRXhwIiwiYWxwaGEiLCJudW1lcmljIiwibWlubGVuZ3RoIiwic2V0TWluTWF4UHJpY2VWYWxpZGF0aW9uIiwic2VsZWN0b3JzIiwicHJpY2VWYWxpZGF0aW9uRXJyb3JUZXh0cyIsImVycm9yU2VsZWN0b3IiLCJmaWVsZHNldFNlbGVjdG9yIiwibWF4UHJpY2VTZWxlY3RvciIsIm1pblByaWNlU2VsZWN0b3IiLCJfcHJpY2VWYWxpZGF0aW9uRXJyb3IiLCJvbk1pblByaWNlRXJyb3IiLCJvbk1heFByaWNlRXJyb3IiLCJtaW5QcmljZU5vdEVudGVyZWQiLCJtYXhQcmljZU5vdEVudGVyZWQiLCJvbkludmFsaWRQcmljZSIsImNvbmZpZ3VyZSIsInByZXZlbnRTdWJtaXQiLCJzZXRNZXNzYWdlT3B0aW9ucyIsImVycm9yU3BhbiIsInNldFN0YXRlQ291bnRyeVZhbGlkYXRpb24iLCJjbGVhblVwU3RhdGVWYWxpZGF0aW9uIiwiJGZpZWxkQ2xhc3NFbGVtZW50Iiwia2V5cyIsImZvckVhY2giLCJkb2N1bWVudE1vZGUiLCJjb2xsZWN0aW9uIiwic2xpY2UiLCJjaGFuZ2VXaXNobGlzdFBhZ2luYXRpb25MaW5rcyIsIndpc2hsaXN0VXJsIiwicGFnaW5hdGlvbkl0ZW1zIiwicGFnaW5hdGlvbkxpbmsiLCJwYWdlTnVtYmVyIiwid2lzaGxpc3RQYWdpbmF0b3JIZWxwZXIiLCIkcGFnaW5hdGlvbkxpc3QiLCIkbmV4dEl0ZW0iLCIkcHJldkl0ZW0iLCJjdXJyZW50SHJlZiIsInBhcnRpYWxQYWdpbmF0aW9uVXJsIiwic2hpZnQiLCJzYWZlU3RyaW5nIiwic3RyIiwiZCIsIkRPTVBhcnNlciIsInBhcnNlRnJvbVN0cmluZyIsImJvZHkiLCJVcmwiLCJ1cmxVdGlscyIsImdldFVybCIsInBhdGhuYW1lIiwic2VhcmNoIiwiZ29Ub1VybCIsImhpc3RvcnkiLCJwdXNoU3RhdGUiLCJyZXBsYWNlUGFyYW1zIiwicGFyc2VkIiwicGFyc2UiLCJwYXJhbSIsImhhc093blByb3BlcnR5IiwicXVlcnkiLCJmb3JtYXQiLCJidWlsZFF1ZXJ5U3RyaW5nIiwicXVlcnlEYXRhIiwib3V0IiwiaXNBcnJheSIsIm5keCIsInN1YnN0cmluZyIsInBhcnNlUXVlcnlQYXJhbXMiLCJ0ZW1wIiwiUGFnZU1hbmFnZXIiLCJxdWlja1NlYXJjaCIsImN1cnJlbmN5U2VsZWN0b3IiLCJtb2JpbGVNZW51VG9nZ2xlIiwibWVudSIsImZvdW5kYXRpb24iLCJxdWlja1ZpZXciLCJjYXJ0UHJldmlldyIsInByaXZhY3lDb29raWVOb3RpZmljYXRpb24iLCJhZG1pbkJhciIsImxvYWRpbmdQcm9ncmVzc0JhciIsInN2Z0luamVjdG9yIiwicm9vdHNMb2FkZWQiLCJHbG9iYWwiLCJfUGFnZU1hbmFnZXIiLCJvblJlYWR5IiwiX3RoaXMkY29udGV4dCIsImNoYW5uZWxJZCIsImNhcnRJZCIsImNhdGVnb3J5SWQiLCJzZWN1cmVCYXNlVXJsIiwibWFpbnRlbmFuY2VNb2RlU2V0dGluZ3MiLCJhZG1pbkJhckxhbmd1YWdlIiwiSlNPTiIsIm1haW50ZW5hbmNlTW9kZSIsImxhbmciLCJ0cmFuc2xhdGlvbnMiLCJpc01haW50ZW5hbmNlTW9kZSIsImhlYWRlciIsImlzSW5JZnJhbWUiLCJnZXRDb250ZXh0dWFsTWF0Y2giLCJkb2VzTm90SGF2ZUFkbWluQ29va2llIiwiY29va2llIiwiVVJMU2VhcmNoUGFyYW1zIiwiVVJMIiwic2VhcmNoUGFyYW1zIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiaHJlZiIsImNvbnRleHR1YWxNYXRjaCIsInJlbW92ZSIsIkNhcnRQcmV2aWV3RXZlbnRzIiwibG9hZGluZ0NsYXNzIiwiJGNhcnQiLCIkY2FydERyb3Bkb3duIiwiJGNhcnRMb2FkaW5nIiwidG9nZ2xlQ2xhc3MiLCJzdG9yYWdlIiwibG9jYWxTdG9yYWdlQXZhaWxhYmxlIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsImdldEl0ZW0iLCJOdW1iZXIiLCJjYXJ0UXR5UHJvbWlzZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZ2V0Q2FydFF1YW50aXR5IiwiYmFzZVVybCIsInRoZW4iLCIkcHJpdmFjeURpYWxvZyIsImRhdGUiLCJEYXRlIiwic2V0RGF0ZSIsImdldERhdGUiLCJ0b0dNVFN0cmluZyIsImhvb2tzIiwiZW1pdCIsInN3YWwiLCJjaGFuZ2VDdXJyZW5jeSIsImN1cnJlbmN5Q29kZSIsImFqYXgiLCJjb250ZW50VHlwZSIsIm1ldGhvZCIsInN0cmluZ2lmeSIsImZhaWwiLCJmaXJlIiwicmVzcG9uc2VUZXh0IiwiaWNvbiIsInNob3dDYW5jZWxCdXR0b24iLCJjdXJyZW5jeVNlc3Npb25Td2l0Y2hlciIsImdldENhcnQiLCJzaG93V2FybmluZyIsImRpc2NvdW50cyIsInNvbWUiLCJkaXNjb3VudCIsImRpc2NvdW50ZWRBbW91bnQiLCJjb3Vwb25zIiwibGluZUl0ZW1zIiwiZ2lmdENlcnRpZmljYXRlcyIsInJldmVhbENsb3NlRmFjdG9yeSIsImRyb3Bkb3duIiwiYWN0aXZlX2NsYXNzIiwicmV2ZWFsIiwiYmdfY2xhc3MiLCJkaXNtaXNzX21vZGFsX2NsYXNzIiwiY2xvc2Vfb25fYmFja2dyb3VuZF9jbGljayIsInRhYiIsInRyYXZlcnNpbmciLCJldmVudHMiLCJvbGREYXRhIiwialF1ZXJ5IiwiZWxlbSIsImN1ckRhdGEiLCJoYXNEYXRhIiwic2FtZUtleXMiLCJjYW1lbENhc2UiLCJvbGRMb2FkIiwiaGFuZGxlciIsInNwbGljZSIsInRyaWdnZXJIYW5kbGVyIiwib2xkSW5pdCIsInJldCIsIm5vZGVUeXBlIiwib2xkRm5GaW5kIiwiTmFub2JhciIsIm5hbm9iYXIiLCJ0aW1lciIsImN1cnJlbnQiLCJjbGVhclRpbWVyIiwiY2xlYXJJbnRlcnZhbCIsInNldFRpbWVyIiwic2V0SW50ZXJ2YWwiLCJnbyIsImFqYXhTZW5kIiwiYWpheENvbXBsZXRlIiwiTWVudSIsIiRtZW51IiwiaGFzTWF4TWVudURpc3BsYXlEZXB0aCIsImNvbGxhcHNpYmxlcyIsImNvbGxhcHNpYmxlR3JvdXBzIiwib25NZW51Q2xpY2siLCJvbkRvY3VtZW50Q2xpY2siLCJjb2xsYXBzZUFsbCIsImNvbGxhcHNlTmVpZ2hib3JzIiwiJG5laWdoYm9ycyIsIiRjb2xsYXBzaWJsZSIsIm1lbnVGYWN0b3J5IiwiY2FjaGVkTWVudSIsIkNBTUVMIiwiU05BS0UiLCJtb2JpbGVNZW51SWQiLCJtZW51U2VsZWN0b3IiLCJNb2JpbGVNZW51VG9nZ2xlIiwiX3JlZiRoZWFkZXJTZWxlY3RvciIsImhlYWRlclNlbGVjdG9yIiwiX3JlZiRtZW51U2VsZWN0b3IiLCJfcmVmJHNjcm9sbFZpZXdTZWxlY3QiLCJzY3JvbGxWaWV3U2VsZWN0b3IiLCIkbmF2TGlzdCIsIiRoZWFkZXIiLCIkc2Nyb2xsVmlldyIsIiRzdWJNZW51cyIsIm1lZGl1bU1lZGlhUXVlcnlMaXN0Iiwib25Ub2dnbGVDbGljayIsIm9uQ2FydFByZXZpZXdPcGVuIiwib25NZWRpdW1NZWRpYVF1ZXJ5TWF0Y2giLCJvblN1Yk1lbnVDbGljayIsInNjcm9sbFRvcCIsInJlc2V0U3ViTWVudXMiLCIkY2xvc2VzdEFjdGlvbiIsIiRwYXJlbnRTaWJsaW5ncyIsIiRwYXJlbnRBY3Rpb24iLCJtb2JpbGVNZW51VG9nZ2xlRmFjdG9yeSIsImNhY2hlZE1vYmlsZU1lbnUiLCJtb2JpbGVNZW51IiwiZm9jdXNUcmFwIiwiYm9keUFjdGl2ZUNsYXNzIiwibG9hZGluZ092ZXJsYXlDbGFzcyIsIm1vZGFsQm9keUNsYXNzIiwibW9kYWxDb250ZW50Q2xhc3MiLCJTaXplQ2xhc3NlcyIsIm5vcm1hbCIsIk1vZGFsRXZlbnRzIiwib3BlbmVkIiwibG9hZGVkIiwiZ2V0U2l6ZUZyb21Nb2RhbCIsImdldFZpZXdwb3J0SGVpZ2h0IiwibXVsdGlwbGVyIiwidmlld3BvcnRIZWlnaHQiLCJoZWlnaHQiLCJ3cmFwTW9kYWxCb2R5IiwiJG1vZGFsQm9keSIsInJlc3RyYWluQ29udGVudEhlaWdodCIsImJvZHlIZWlnaHQiLCJvdXRlckhlaWdodCIsImNvbnRlbnRIZWlnaHQiLCJtYXhIZWlnaHQiLCJjcmVhdGVNb2RhbENvbnRlbnQiLCJleGlzdGluZ0NvbnRlbnQiLCJjcmVhdGVMb2FkaW5nT3ZlcmxheSIsIiRsb2FkaW5nT3ZlcmxheSIsIk1vZGFsIiwiX3JlZiRzaXplIiwiZGVmYXVsdFNpemUiLCJwZW5kaW5nIiwib25Nb2RhbE9wZW4iLCJvbk1vZGFsT3BlbmVkIiwib25Nb2RhbENsb3NlIiwib25Nb2RhbENsb3NlZCIsIl9yZWYyJHBlbmRpbmciLCJfcmVmMiRjbGVhckNvbnRlbnQiLCJjbGVhckNvbnRlbnQiLCJfcmVmMyR3cmFwIiwid3JhcCIsImFjdGl2ZUVsZW1lbnQiLCJjcmVhdGVGb2N1c1RyYXAiLCJlc2NhcGVEZWFjdGl2YXRlcyIsInJldHVybkZvY3VzT25EZWFjdGl2YXRlIiwiYWxsb3dPdXRzaWRlQ2xpY2siLCJmYWxsYmFja0ZvY3VzIiwiZmFsbGJhY2tOb2RlIiwiZGVhY3RpdmF0ZSIsImFjdGl2YXRlIiwib25lIiwiX3BlbmRpbmciLCJfc2l6ZSIsIiRtb2RhbHMiLCJjYWNoZWRNb2RhbCIsImRlZmF1bHRNb2RhbCIsIlN0ZW5jaWxEcm9wRG93biIsIlRPUF9TVFlMSU5HIiwiJHF1aWNrU2VhcmNoUmVzdWx0cyIsIiRxdWlja1NlYXJjaEZvcm1zIiwiJHF1aWNrU2VhcmNoRXhwYW5kIiwiJHNlYXJjaFF1ZXJ5Iiwic3RlbmNpbERyb3BEb3duRXh0ZW5kYWJsZXMiLCJzdGVuY2lsRHJvcERvd24iLCJvbkJvZHlDbGljayIsImRlYm91bmNlV2FpdFRpbWUiLCJkb1NlYXJjaCIsIl9kZWJvdW5jZSIsInNlYXJjaFF1ZXJ5IiwiJHF1aWNrU2VhcmNoUmVzdWx0c0N1cnJlbnQiLCIkbm9SZXN1bHRzTWVzc2FnZSIsIiRxdWlja1NlYXJjaEFyaWFNZXNzYWdlIiwicHJlZGVmaW5lZFRleHQiLCJpdGVtc0ZvdW5kQ291bnQiLCJzZXRUaW1lb3V0Iiwic2VhcmNoVXJsIiwiUmV2aWV3IiwiaGFuZGxlRHJvcGRvd25FeHBhbmQiLCIkZHJvcGRvd25NZW51IiwiZHJvcGRvd25CdG5IZWlnaHQiLCJwcmV2IiwicHJvZHVjdCIsImdldEJ5SWQiLCJyZXZlYWxDbG9zZUF0dHIiLCJyZXZlYWxDbG9zZVNlbGVjdG9yIiwicmV2ZWFsU2VsZWN0b3IiLCJSZXZlYWxDbG9zZSIsIm1vZGFsSWQiLCJvbkNsaWNrIiwiJGJ1dHRvbnMiLCJjYWNoZWRCdXR0b24iLCJidXR0b24iLCJTdGVuY2lsRHJvcGRvd24iLCJleHRlbmRhYmxlcyIsIiRkcm9wRG93biIsIiRkcm9wRG93blRyaWdnZXIiLCJtb2RhbE9wZW5lZCIsInN3ZWV0QWxlcnQiLCJ3ZWFrTWFwIiwiV2Vha01hcCIsIlN3YWwiLCJtaXhpbiIsImJ1dHRvbnNTdHlsaW5nIiwiY3VzdG9tQ2xhc3MiLCJjb25maXJtQnV0dG9uIiwiY2FuY2VsQnV0dG9uIiwiY29uc3RydWN0b3IiLCJwYWdlIiwicmVhZHkiLCIkZ2FsbGVyeSIsIiRtYWluSW1hZ2UiLCIkbWFpbkltYWdlTmVzdGVkIiwiJHNlbGVjdGFibGVJbWFnZXMiLCJjdXJyZW50SW1hZ2UiLCJzZXRJbWFnZVpvb20iLCJzZXRNYWluSW1hZ2UiLCJpbWdPYmoiLCJhc3NpZ24iLCJzZXRBY3RpdmVUaHVtYiIsInN3YXBNYWluSW1hZ2UiLCJzYXZlZEltYWdlIiwiJHNlbGVjdGVkVGh1bWIiLCJzZWxlY3ROZXdJbWFnZSIsIm1haW5JbWFnZUFsdCIsImVhc3l6b29tIiwic3dhcCIsImFsdCIsImZhbGxiYWNrU3R5bGVzSUUiLCJjaGVja0ltYWdlIiwiJGltYWdlQ29udGFpbmVyIiwiY29udGFpbmVySGVpZ2h0IiwiY29udGFpbmVyV2lkdGgiLCIkem9vbSIsImVhc3lab29tIiwib25TaG93IiwiZXJyb3JOb3RpY2UiLCJsb2FkaW5nTm90aWNlIiwiX2RlZmF1bHQiLCIkcmV2aWV3Rm9ybSIsIiRyZXZpZXdUYWJMaW5rIiwiJHJldmlld3NDb250ZW50IiwiJHJldmlld3NDb250ZW50TGlzdCIsImluaXRMaW5rQmluZCIsImluamVjdFBhZ2luYXRpb25MaW5rIiwic2V0dXBSZXZpZXdzIiwiJHByb2R1Y3RSZXZpZXdMaW5rIiwiZXhwYW5kUmV2aWV3cyIsIiRuZXh0TGluayIsIiRwcmV2TGluayIsInJlZ2lzdGVyVmFsaWRhdGlvbiIsInJldmlld1JhdGluZyIsInJldmlld1N1YmplY3QiLCJyZXZpZXdDb21tZW50IiwicmV2aWV3RW1haWwiLCJob3ZlcmludGVudCIsIndpbmRvd1dpZHRoIiwid2luV2lkdGgiLCJpbm5lcldpZHRoIiwiaXNOYU4iLCJjbGllbnRXaWR0aCIsInJlc2l6ZVRpbWVyIiwidG9nZ2xlQWN0aXZlIiwidG91Y2hFeHBhbmQiLCJ1bmJpbmQiLCJtb2JpbGVFeHBhbmQiLCJleHBhbmRHcm91cCIsIm5leHRVbnRpbCIsIm1vYmlsZU5hdlBhZGRpbmciLCJsb2dvSGVpZ2h0IiwiY2FsY0hlYWRlckhlaWdodE1vYmlsZSIsImhlYWRlck5vTmF2SGVpZ2h0Iiwic2VhcmNoSGVpZ2h0IiwibW9iaWxlSGVhZGVySGVpZ2h0IiwicGFnZU9mZnNldCIsInRvZ2dsZUhlYWRlckhlaWdodERlc2t0b3AiLCJoZWFkZXJIZWlnaHQiLCJuYXZIZWlnaHQiLCJuYXZUb2dnbGVXaWR0aCIsImxvZ29XaWR0aCIsImNvbXByZXNzSGVhZGVyRGVza3RvcCIsImV4cGFuZEhlYWRlckRlc2t0b3AiLCJzY3JvbGwiLCJ0b2dnbGVIZWFkZXJIZWlnaHRNb2JpbGUiLCJoZWFkZXJDb21wcmVzcyIsIm51bVBlckNvbHVtbiIsImxpbmtzUGVyQ29sIiwibWVudUNvbHVtbnMiLCJzcGxpdENvbHVtbnMiLCIkY29sbWVudSIsIiRsaXMiLCJjb2xNZW51SHRtbCIsImNvbE1lbnVDb3VudCIsImNvbEdyb3VwIiwiY29sR3JvdXBDb3VudCIsImJ1aWxkQ29sdW1uIiwiJGxpIiwiJGxpQ2xhc3MiLCJwcmVwYXJlTWVudSIsImRyb3Bkb3duUGFkZGluZyIsIm5hdldpZHRoIiwiY29sV2lkdGgiLCJmbG9vciIsImNvdW50Q29scyIsImNvbHMiLCJkcm9wZG93bldpZHRoIiwibmF2T2Zmc2V0Iiwib2Zmc2V0IiwibGVmdCIsInBhcmVudE9mZnNldCIsInNwYWNlQXZhaWxhYmxlIiwicmlnaHRCb3VuZCIsInJlc2V0V2lkdGhzIiwib3B0cyIsImludGVydmFsIiwiZWwiLCJob3ZlckludGVudE92ZXIiLCJob3ZlckludGVudE91dCIsImNsZWFyVGltZW91dCIsImNsb3NlTWluaUNhcnQiLCJhZGRFdmVudExpc3RlbmVyIiwiY29tcGFyZVRvZ2dsZSIsImNoZWNrQ29tcGFyZSIsImF0dHJpYnV0ZXMiLCJjaGlsZExpc3QiLCJzdWJ0cmVlIiwiY2FsbGJhY2siLCJtdXRhdGlvbnNMaXN0Iiwib2JzZXJ2ZXIiLCJNdXRhdGlvbk9ic2VydmVyIiwib2JzZXJ2ZSIsIiR0aGlzIiwiaXNTZWxlY3RlZCIsImNvbXBhcmVMYWJlbCIsInJldmlld3NPZmZzZXQiLCJ0b2dnbGVGb290ZXJCbG9ja3MiLCJXaXNoTGlzdCIsIl9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQiLCJ3aXNobGlzdERlbGV0ZUNvbmZpcm0iLCJjb25maXJtZWQiLCJ3aXNobGlzdERlbGV0ZSIsInJlZ2lzdGVyQWRkV2lzaExpc3RWYWxpZGF0aW9uIiwiJGFkZFdpc2hsaXN0Rm9ybSIsImFkZFdpc2hsaXN0VmFsaWRhdG9yIiwiZW50ZXJXaXNobGlzdE5hbWVFcnJvciIsIiRhZGRXaXNoTGlzdEZvcm0iLCJyZXF1ZXN0IiwidmVyc2lvbiIsInJlbW90ZVZlcnNpb24iLCJyZW1vdGVCYXNlRW5kcG9pbnQiLCJtYWtlUmVxdWVzdCIsInJlbW90ZSIsInJlcXVlc3RPcHRpb25zIiwicmVtb3RlUmVxdWVzdCIsImVuZHBvaW50IiwicmVtb3RlVXJsIiwiQm9kbEV2ZW50c0NhcnQiLCJCYXNlIiwiSG9va3MiLCJfQmFzZSIsImJvZGxFdmVudHNDYXJ0IiwiZ2V0Qm9kbEV2ZW50c0NhcnQiLCJnZXRDYXJ0cyIsImluY2x1ZGVPcHRpb25zIiwiZ2V0Q2FydFN1bW1hcnkiLCJzdGF0dXMiLCJ0b3RhbF9xdWFudGl0eSIsImhhbmRsZUl0ZW1BZGQiLCJlbWl0QWRkSXRlbSIsImVtaXREYXRhIiwiaXRlbVVwZGF0ZSIsIml0ZW1JZCIsImNhbGxiYWNrQXJnIiwiaXRlbXMiLCJ1cGRhdGUiLCJlbWl0UmVtb3ZlSXRlbSIsIml0ZW1SZW1vdmUiLCJoYW5kbGVJdGVtUmVtb3ZlIiwiZ2V0SXRlbUdpZnRXcmFwcGluZ09wdGlvbnMiLCJzdWJtaXRJdGVtR2lmdFdyYXBwaW5nT3B0aW9uIiwicGF5bG9hZCIsInBvc3RGb3JtRGF0YSIsImdldFNoaXBwaW5nUXVvdGVzIiwicmVuZGVyV2l0aCIsInJlbmRlcldpdGhBcmciLCJzdWJtaXRTaGlwcGluZ1F1b3RlIiwicXVvdGVJZCIsInNoaXBwaW5nX21ldGhvZCIsImFwcGx5Q29kZSIsImNvZGUiLCJhcHBseUdpZnRDZXJ0aWZpY2F0ZSIsImdldEJ5TmFtZSIsIkNvdW50cnlBcGkiLCJQcm9kdWN0QXBpIiwiUHJvZHVjdEF0dHJpYnV0ZXNBcGkiLCJTZWFyY2hBcGkiLCJDYXJ0QXBpIiwiaW50ZXJuYWxzIiwiZ2V0UGFnZSIsImdldFBhZ2VCeUdRTCIsInRlbXBsYXRlX25hbWUiLCJjb3VudHJ5Iiwid2lzaGxpc3QiLCJpbkNhcnRFbmRwb2ludCIsInRlbXBsYXRlQXJnIiwiY29uZmlndXJlSW5DYXJ0IiwicGFyYW1zQXJnIiwid2lzaGxpc3RJZCIsImNhbGxiYWNrRm4iLCJnZXRCT0RMRXZlbnRzIiwiYm9kbEV2ZW50cyIsImdldEV2ZW50SWQiLCJpc0JPRExFbmFibGVkIiwiQ2FydCIsIkFkZENhcnRJdGVtRXZlbnQiLCJDUkVBVEUiLCJzaG91bGRFbWl0UmVtb3ZlSXRlbSIsIlJlbW92ZUNhcnRJdGVtRXZlbnQiLCJfcmVzcG9uc2UkZGF0YSRsaW5lX2kiLCJsaW5lX2l0ZW1zIiwiZXZlbnROYW1lIiwicHJlcGFyZVBheWxvYWQiLCJldmVudF9pZCIsImNoYW5uZWxfaWQiLCJjdXJyZW5jeSIsInByb2R1Y3RfdmFsdWUiLCJwcm9kdWN0X2lkIiwiU3RyaW5nIiwidjQiLCJ1dWlkdjQiLCJGYWtlQk9ETEV2ZW50cyIsImFkZEl0ZW0iLCJyZW1vdmVJdGVtIiwiRXZlbnRFbWl0dGVyIiwiX0V2ZW50RW1pdHRlciIsInN1YnNjcmliZSIsImVsZW1lbnRTZWxlY3RvciIsIkJhc2VIb29rcyIsIl9CYXNlSG9va3MiLCJzZWFyY2hFdmVudHMiLCJDYXJ0SG9va3MiLCJDb29raWVIb29rcyIsIkN1cnJlbmN5U2VsZWN0b3JIb29rcyIsIlByb2R1Y3RIb29rcyIsIlNlYXJjaEhvb2tzIiwiRmFjZXRlZFNlYXJjaEhvb2tzIiwiU29ydEJ5SG9va3MiLCJmYWNldGVkU2VhcmNoIiwic29ydEJ5IiwicGFyc2VIb29rcyIsImhvb2tOYW1lIiwiaG9va1R5cGUiLCJFcnJvciIsImhvb2siLCJvcHRpb25zQ2hhbmdlIiwiRWxlbWVudCIsIm1zTWF0Y2hlc1NlbGVjdG9yIiwid2Via2l0TWF0Y2hlc1NlbGVjdG9yIiwic29ydEJ5RXZlbnRzIiwiZGVmYXVsdFByZXZlbnRlZCIsInMiLCJwYXJlbnRFbGVtZW50IiwiZW5jb2RlIiwic3RyaW5nIiwiY2hhckNvZGVBdCIsInRvU3RyaW5nIiwidG9VcHBlckNhc2UiLCJzcGxpdE9uRmlyc3QiLCJzZXBhcmF0b3IiLCJzZXBhcmF0b3JJbmRleCIsInNvcnRCeUtleXMiLCJhIiwiYiIsImdldFBhcnNlZFZhbHVlIiwiYWNjdW11bGF0b3IiLCJjb25jYXQiLCJyZWR1Y2VCeUtleSIsImluY2x1ZGVBcnJheUluZGV4Iiwia2V5T2ZWYWx1ZSIsImNyZWF0ZSIsImlucHV0UGFyc2VkIiwiX3NwbGl0T25GaXJzdCIsImRlY29kZVVSSUNvbXBvbmVudCIsIkJvb2xlYW4iLCJvYmplY3QiLCJmaWx0ZXJWYWx1ZXMiLCJhcnJheUluZGV4Iiwib2JqZWN0Q29weSIsInNob3VsZEZpbHRlciIsImlzVmFsaWRIVFRQTWV0aG9kIiwiaXNVc2luZ1NlY3Rpb25zIiwicmVxdWVzdGVkVGVtcGxhdGUiLCJnZXRUZW1wbGF0ZXMiLCJ0ZW1wbGF0ZXMiLCJyZWxhdGl2ZVVybCIsImRlZmF1bHRPcHRpb25zIiwiaGVhZGVycyIsIkJDRGF0YSIsImNzcmZfdG9rZW4iLCJ1c2luZ1NlY3Rpb25zIiwidXNpbmdUZW1wbGF0ZXMiLCJyZW5kZXJfd2l0aCIsImNyZWRlbnRpYWxzIiwiZGVsaW1pdGVyIiwiZmV0Y2giLCJqc29uIiwiY2xlYW5LZXkiLCJ0ZW1wbGF0ZVZhcmlhYmxlIiwiU3RlbmNpbFV0aWxzIiwicm9vdCIsImRlZmluZSIsImFtZCIsInN0ZW5jaWxVdGlscyIsIm1vZHVsZSIsImV4cG9ydHMiLCJnZXRTcmMiLCJwYXRoIiwiZGltZW5zaW9ucyIsInNpemVSZWdleCIsInNpemVzIiwiZGVzY3JpcHRvclJlZ2V4Iiwic3Jjc2V0cyIsImRlc2NyaXB0b3IiLCJJbWFnZVRvb2wiLCJJbWFnZVNyY3NldFRvb2wiLCJTdG9yYWdlVG9vbHMiLCJzdG9yYWdlQXZhaWxhYmxlIiwiRE9NRXhjZXB0aW9uIiwiX193ZWJwYWNrX3B1YmxpY19wYXRoX18iLCJnZXRBY2NvdW50IiwiZ2V0TG9naW4iLCJub29wIiwicGFnZUNsYXNzZXMiLCJhY2NvdW50X29yZGVyc3RhdHVzIiwiYWNjb3VudF9vcmRlciIsImFjY291bnRfYWRkcmVzc2Jvb2siLCJzaGlwcGluZ2FkZHJlc3Nmb3JtIiwiYWNjb3VudF9uZXdfcmV0dXJuIiwiYWRkV2lzaGxpc3QiLCJhY2NvdW50X3JlY2VudGl0ZW1zIiwiYWNjb3VudF9kb3dubG9hZGl0ZW0iLCJlZGl0YWNjb3VudCIsImFjY291bnRfaW5ib3giLCJhY2NvdW50X3NhdmVkX3JldHVybiIsImFjY291bnRfcmV0dXJucyIsImFjY291bnRfcGF5bWVudG1ldGhvZHMiLCJhY2NvdW50X2FkZHBheW1lbnRtZXRob2QiLCJhY2NvdW50X2VkaXRwYXltZW50bWV0aG9kIiwibG9naW4iLCJjcmVhdGVhY2NvdW50X3RoYW5rcyIsImNyZWF0ZWFjY291bnQiLCJnZXRuZXdwYXNzd29yZCIsImZvcmdvdHBhc3N3b3JkIiwiYmxvZyIsImJsb2dfcG9zdCIsImJyYW5kIiwiYnJhbmRzIiwiY2F0ZWdvcnkiLCJjb21wYXJlIiwicGFnZV9jb250YWN0X2Zvcm0iLCJnaWZ0Y2VydGlmaWNhdGVzIiwiZ2lmdGNlcnRpZmljYXRlc19iYWxhbmNlIiwiZ2lmdGNlcnRpZmljYXRlc19yZWRlZW0iLCJhbXBfcHJvZHVjdF9vcHRpb25zIiwicnNzIiwic2l0ZW1hcCIsIm5ld3NsZXR0ZXJfc3Vic2NyaWJlIiwid2lzaGxpc3RzIiwiY3VzdG9tQ2xhc3NlcyIsInN0ZW5jaWxCb290c3RyYXAiLCJwYWdlVHlwZSIsImNvbnRleHRKU09OIiwibG9hZEdsb2JhbCIsImltcG9ydFByb21pc2VzIiwicGFnZUNsYXNzSW1wb3J0ZXIiLCJjdXN0b21UZW1wbGF0ZUltcG9ydGVyIiwiYWxsIiwiaW1wb3J0cyIsImltcG9ydGVkIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVULDZFQUE2RSxxREFBVyxxQ0FBcUMsb0RBQVU7QUFDdkk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVULDRFQUE0RSxxREFBVyxxQ0FBcUMsb0RBQVU7QUFDdEk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTix5Q0FBeUM7QUFDekM7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUCxrREFBa0Q7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRTJCO0FBQzNCOzs7Ozs7Ozs7Ozs7QUN4dkJhLFlBQVksWUFBWSxjQUFjLGNBQWMsc0NBQXNDLFdBQVcsU0FBUyxjQUFjLG1CQUFtQiw2RUFBNkUsMkZBQTJGLGNBQWMsbUJBQW1CLDZFQUE2RSxNQUFNLG1CQUFtQjtBQUMzYyx5RkFBeUYsYUFBYSxrQkFBa0IsYUFBYSxLQUFLLG9GQUFvRixxRkFBcUYsT0FBTyxnQ0FBZ0MsV0FBVyx3Q0FBd0MsdUNBQXVDLG9DQUFvQyxTQUFTO0FBQ2plLE1BQU0sSUFBSSw0RUFBNEUsU0FBUyxZQUFZLElBQUk7QUFDL0c7Ozs7Ozs7Ozs7OztBQ0hBLENBQUM7QUFDRDs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7O0FBSUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0EsMEJBQTBCLHNCQUFzQjtBQUNoRDs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBLGdCQUFnQjtBQUNoQixPQUFPOztBQUVQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCO0FBQ2xCOztBQUVBLGdCQUFnQjtBQUNoQixPQUFPOztBQUVQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnQkFBZ0I7QUFDaEIsT0FBTzs7QUFFUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGdCQUFnQjtBQUNoQjtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RCw4REFBOEQ7O0FBRTlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3RELDREQUE0RDtBQUM1RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxpQ0FBaUM7QUFDakM7O0FBRUE7QUFDQSx3Q0FBd0MsaUJBQWlCO0FBQ3pELHVDQUF1QyxnQkFBZ0I7QUFDdkQsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLENBQUMsQ0FBQyxNQUFNOzs7Ozs7Ozs7Ozs7QUNuZFI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0U7O0FBRWhFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsMkJBQTJCO0FBQzNCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvREFBb0QscUJBQXFCLGVBQWU7O0FBRXhGO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUyxxREFBcUQ7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSwyQ0FBMkMsSUFBSTtBQUMvQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUdBQWlHLElBQUk7QUFDckc7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTCxhQUFhOztBQUViO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsbURBQW1EO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWOztBQUVBO0FBQ0E7QUFDQSxtREFBbUQsY0FBYztBQUNqRTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FB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QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7O0FBRWI7QUFDQSx3REFBd0QsU0FBUztBQUNqRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvREFBb0QsU0FBUztBQUM3RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBLCtDQUErQyxTQUFTO0FBQ3hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQixTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9EQUFvRDtBQUNwRCxvREFBb0Q7QUFDcEQsb0RBQW9EO0FBQ3BEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZEQUE2RCxnQkFBZ0I7O0FBRTdFO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLG9DQUFhO0FBQ3pCLG1CQUFtQixvQ0FBYTtBQUNoQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7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QUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGdFQUFnRTtBQUNyRixNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0Isb0JBQW9CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSLDRFQUE0RTtBQUM1RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7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V0FBUSxDQUFDaGpDLElBQUksQ0FBQ3ZSLE9BQU8sQ0FBQztVQUNsQyxDQUFDLENBQUM7UUFDTixDQUFDLENBQUM7TUFDTixDQUFDLENBQUM7SUFDTjtFQUNKLENBQUM7QUFDTCxDQUFDLEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vYXJpYS9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL2FyaWEvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL2FyaWEvcmFkaW9PcHRpb25zLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2NvbW1vbi9jYXJvdXNlbC9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL2Nhcm91c2VsL2luZGV4LmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2NvbW1vbi9jYXJvdXNlbC91dGlscy9hY3RpdmF0ZVBsYXlQYXVzZUJ1dHRvbi5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vY2Fyb3VzZWwvdXRpbHMvYW5hbGl6ZVNsaWRlcy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vY2Fyb3VzZWwvdXRpbHMvYXJyb3dBcmlhTGFibGluZy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vY2Fyb3VzZWwvdXRpbHMvZG90c1NldHVwLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2NvbW1vbi9jYXJvdXNlbC91dGlscy9nZXRBY3RpdmVTbGlkZUlkeEFuZFNsaWRlc1F1YW50aXR5LmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2NvbW1vbi9jYXJvdXNlbC91dGlscy9nZXRBY3RpdmVTbGlkZUluZm8uanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL2Nhcm91c2VsL3V0aWxzL2hhbmRsZUltYWdlQXNwZWN0UmF0aW8uanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL2Nhcm91c2VsL3V0aWxzL2hhbmRsZUltYWdlTG9hZC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vY2Fyb3VzZWwvdXRpbHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL2Nhcm91c2VsL3V0aWxzL3JlZnJlc2hGb2N1cy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vY2Fyb3VzZWwvdXRpbHMvdG9vbHRpcFNldHVwLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2NvbW1vbi9jYXJvdXNlbC91dGlscy91cGRhdGVUZXh0V2l0aExpdmVEYXRhLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2NvbW1vbi9jb2xsYXBzaWJsZS1ncm91cC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vY29sbGFwc2libGUuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL21lZGlhLXF1ZXJ5LWxpc3QuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL21vZGVscy9mb3Jtcy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vbm9kLWZ1bmN0aW9ucy9taW4tbWF4LXZhbGlkYXRlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2NvbW1vbi9ub2QuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL3Byb2R1Y3QtZGV0YWlscy1iYXNlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2NvbW1vbi9wcm9kdWN0LWRldGFpbHMuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL3NlbGVjdC1vcHRpb24tcGx1Z2luLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2NvbW1vbi91dGlscy9hcGkuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL3V0aWxzL2Jhbm5lci11dGlscy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vdXRpbHMvZm9ybS11dGlscy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vdXRpbHMvaWUtaGVscGVycy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vdXRpbHMvcGFnaW5hdGlvbi11dGlscy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9jb21tb24vdXRpbHMvc2FmZS1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvY29tbW9uL3V0aWxzL3VybC11dGlscy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvZ2xvYmFsL2FkbWluQmFyLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2dsb2JhbC9jYXJ0LXByZXZpZXcuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvZ2xvYmFsL2Nvb2tpZU5vdGlmaWNhdGlvbi5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9nbG9iYWwvY3VycmVuY3ktc2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvZ2xvYmFsL2ZvdW5kYXRpb24uanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvZ2xvYmFsL2pxdWVyeS1taWdyYXRlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2dsb2JhbC9qcXVlcnktbWlncmF0ZS9kYXRhLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2dsb2JhbC9qcXVlcnktbWlncmF0ZS9ldmVudC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9nbG9iYWwvanF1ZXJ5LW1pZ3JhdGUvaW5pdC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9nbG9iYWwvanF1ZXJ5LW1pZ3JhdGUvdHJhdmVyc2luZy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9nbG9iYWwvbG9hZGluZy1wcm9ncmVzcy1iYXIuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvZ2xvYmFsL21lbnUuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvZ2xvYmFsL21vYmlsZS1tZW51LXRvZ2dsZS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9nbG9iYWwvbW9kYWwuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvZ2xvYmFsL3F1aWNrLXNlYXJjaC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9nbG9iYWwvcXVpY2stdmlldy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9nbG9iYWwvcmV2ZWFsLWNsb3NlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2dsb2JhbC9zdGVuY2lsLWRyb3Bkb3duLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL2dsb2JhbC9zdmctaW5qZWN0b3IuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvZ2xvYmFsL3N3ZWV0LWFsZXJ0LmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL3BhZ2UtbWFuYWdlci5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS9wcm9kdWN0L2ltYWdlLWdhbGxlcnkuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvdGhlbWUvcHJvZHVjdC9yZXZpZXdzLmpzIiwid2VicGFjazovL1Jvb3RzLy4vYXNzZXRzL2pzL3RoZW1lL3Jvb3RzL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL2Fzc2V0cy9qcy90aGVtZS93aXNobGlzdC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9AYmlnY29tbWVyY2Uvc3RlbmNpbC11dGlscy9zcmMvYXBpL2Jhc2UuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL2FwaS9jYXJ0LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzL3NyYy9hcGkvY291bnRyaWVzLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzL3NyYy9hcGkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL2FwaS9wcm9kdWN0LWF0dHJpYnV0ZXMuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL2FwaS9wcm9kdWN0LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzL3NyYy9hcGkvc2VhcmNoLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzL3NyYy9hcGkvd2lzaGxpc3QuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL2JvZGwvZW1pdHRlcnMvYmFzZS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9AYmlnY29tbWVyY2Uvc3RlbmNpbC11dGlscy9zcmMvYm9kbC9lbWl0dGVycy9jYXJ0LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzL3NyYy9ib2RsL2hlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL2hvb2tzL2Jhc2UuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL2hvb2tzL2NhcnQuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL2hvb2tzL2Nvb2tpZS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9AYmlnY29tbWVyY2Uvc3RlbmNpbC11dGlscy9zcmMvaG9va3MvY3VycmVuY3ktc2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL2hvb2tzL2ZhY2V0ZWQtc2VhcmNoLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzL3NyYy9ob29rcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9AYmlnY29tbWVyY2Uvc3RlbmNpbC11dGlscy9zcmMvaG9va3MvcHJvZHVjdC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9AYmlnY29tbWVyY2Uvc3RlbmNpbC11dGlscy9zcmMvaG9va3Mvc2VhcmNoLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzL3NyYy9ob29rcy9zb3J0LWJ5LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzL3NyYy9saWIvY2xvc2VzdC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9AYmlnY29tbWVyY2Uvc3RlbmNpbC11dGlscy9zcmMvbGliL3F1ZXJ5LXN0cmluZy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9AYmlnY29tbWVyY2Uvc3RlbmNpbC11dGlscy9zcmMvbGliL3JlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL21haW4uanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL3Rvb2xzL2ltYWdlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzL3NyYy90b29scy9pbWFnZVNyY3NldC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9AYmlnY29tbWVyY2Uvc3RlbmNpbC11dGlscy9zcmMvdG9vbHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvQGJpZ2NvbW1lcmNlL3N0ZW5jaWwtdXRpbHMvc3JjL3Rvb2xzL3N0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvYWN0dWFsQXBwbHkuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvZnVuY3Rpb25BcHBseS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9jYWxsLWJpbmQtYXBwbHktaGVscGVycy9mdW5jdGlvbkNhbGwuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvcmVmbGVjdEFwcGx5LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2NhbGwtYm91bmQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvZHVuZGVyLXByb3RvL2dldC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9lYXN5em9vbS9kaXN0L2Vhc3l6b29tLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2VzLWRlZmluZS1wcm9wZXJ0eS9pbmRleC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvZXZhbC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3JhbmdlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9yZWYuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3N5bnRheC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvdHlwZS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvdXJpLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2VzLW9iamVjdC1hdG9tcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9ldmVudGVtaXR0ZXIzL2luZGV4LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLXRyYXAvZGlzdC9mb2N1cy10cmFwLmVzbS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9mb2N1cy13aXRoaW4tcG9seWZpbGwvZGlzdC9mb2N1cy13aXRoaW4tcG9seWZpbGwuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uL2ZvdW5kYXRpb24uZHJvcGRvd24uanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uL2ZvdW5kYXRpb24uanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uL2ZvdW5kYXRpb24ucmV2ZWFsLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi9mb3VuZGF0aW9uLnRhYi5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9mdW5jdGlvbi1iaW5kL2ltcGxlbWVudGF0aW9uLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvZ2V0LWludHJpbnNpYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9nZXQtcHJvdG8vT2JqZWN0LmdldFByb3RvdHlwZU9mLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2dldC1wcm90by9SZWZsZWN0LmdldFByb3RvdHlwZU9mLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2dldC1wcm90by9pbmRleC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9nb3BkL2dPUEQuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvZ29wZC9pbmRleC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9pbmRleC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9zaGFtcy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9oYXNvd24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvaG92ZXJpbnRlbnQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvanF1ZXJ5L2Rpc3QvanF1ZXJ5Lm1pbi5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FwcGx5LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlSZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc2NpaVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc2NpaVdvcmRzLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNzaWduVmFsdWUuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQXNzaWduVmFsdWUuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0VGFnLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUluZGV4T2YuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlS2V5cy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VSZXN0LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVNsaWNlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRvU3RyaW5nLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2FzdFNsaWNlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29weU9iamVjdC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUFzc2lnbmVyLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlQ2FzZUZpcnN0LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlQ29tcG91bmRlci5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZnJlZUdsb2JhbC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE5hdGl2ZS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFByb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFRhZy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc1VuaWNvZGUuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNVbmljb2RlV29yZC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzSXRlcmF0ZWVDYWxsLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNQcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vdmVyQXJnLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlclJlc3QuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19yb290LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0VG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdHJpbmdUb0FycmF5LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fdW5pY29kZVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL191bmljb2RlV29yZHMuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2Fzc2lnbkluLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9jYW1lbENhc2UuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2NhcGl0YWxpemUuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2RlYm91bmNlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9kZWJ1cnIuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2VxLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9leHRlbmQuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lkZW50aXR5LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcmd1bWVudHMuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXkuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXlMaWtlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0J1ZmZlci5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNFbXB0eS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNGdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNMZW5ndGguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzTmFOLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc051bWJlci5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3QuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0TGlrZS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNQbGFpbk9iamVjdC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNUeXBlZEFycmF5LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9rZXlzSW4uanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL25vdy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdGhyb3R0bGUuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvTnVtYmVyLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC90b1N0cmluZy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdXBwZXJGaXJzdC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvd29yZHMuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbWF0aC1pbnRyaW5zaWNzL2Ficy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3MvZmxvb3IuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbWF0aC1pbnRyaW5zaWNzL2lzTmFOLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL21hdGgtaW50cmluc2ljcy9tYXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvbWF0aC1pbnRyaW5zaWNzL21pbi5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3MvcG93LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL21hdGgtaW50cmluc2ljcy9yb3VuZC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3Mvc2lnbi5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9uYW5vYmFyL25hbm9iYXIubWluLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL25vZC12YWxpZGF0ZS9ub2QuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvb2JqZWN0LWluc3BlY3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvcXMvbGliL2Zvcm1hdHMuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvcXMvbGliL2luZGV4LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL3FzL2xpYi9wYXJzZS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9xcy9saWIvc3RyaW5naWZ5LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL3FzL2xpYi91dGlscy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9zaWRlLWNoYW5uZWwtbGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9zaWRlLWNoYW5uZWwtbWFwL2luZGV4LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL3NpZGUtY2hhbm5lbC13ZWFrbWFwL2luZGV4LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL3NpZGUtY2hhbm5lbC9pbmRleC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9zbGljay1jYXJvdXNlbC9zbGljay9zbGljay5taW4uanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvc3ZnLWluamVjdG9yL2Rpc3Qvc3ZnLWluamVjdG9yLm1pbi5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy9zd2VldGFsZXJ0Mi9kaXN0L3N3ZWV0YWxlcnQyLm1pbi5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy90YWJiYWJsZS9kaXN0L2luZGV4LmVzbS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy91cmwvbm9kZV9tb2R1bGVzL3B1bnljb2RlL3B1bnljb2RlLmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL3VybC91cmwuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL25hdGl2ZS5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcmVnZXguanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc3RyaW5naWZ5LmpzIiwid2VicGFjazovL1Jvb3RzLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92NC5qcyIsIndlYnBhY2s6Ly9Sb290cy8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdmFsaWRhdGUuanMiLCJ3ZWJwYWNrOi8vUm9vdHMvLi9ub2RlX21vZHVsZXMvd2hhdHdnLWZldGNoL2ZldGNoLmpzIiwid2VicGFjazovL1Jvb3RzL2lnbm9yZWR8QzpcXFVzZXJzXFxBU1VTXFxEb2N1bWVudHNcXEdpdEh1Ylxcc3RlbmNpbF9kZXZfMVxcbm9kZV9tb2R1bGVzXFxvYmplY3QtaW5zcGVjdHwuL3V0aWwuaW5zcGVjdCIsIndlYnBhY2s6Ly9Sb290cy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9Sb290cy93ZWJwYWNrL3J1bnRpbWUvYW1kIG9wdGlvbnMiLCJ3ZWJwYWNrOi8vUm9vdHMvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vUm9vdHMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL1Jvb3RzL3dlYnBhY2svcnVudGltZS9lbnN1cmUgY2h1bmsiLCJ3ZWJwYWNrOi8vUm9vdHMvd2VicGFjay9ydW50aW1lL2dldCBqYXZhc2NyaXB0IGNodW5rIGZpbGVuYW1lIiwid2VicGFjazovL1Jvb3RzL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vUm9vdHMvd2VicGFjay9ydW50aW1lL2hhcm1vbnkgbW9kdWxlIGRlY29yYXRvciIsIndlYnBhY2s6Ly9Sb290cy93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL1Jvb3RzL3dlYnBhY2svcnVudGltZS9sb2FkIHNjcmlwdCIsIndlYnBhY2s6Ly9Sb290cy93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL1Jvb3RzL3dlYnBhY2svcnVudGltZS9ub2RlIG1vZHVsZSBkZWNvcmF0b3IiLCJ3ZWJwYWNrOi8vUm9vdHMvd2VicGFjay9ydW50aW1lL3B1YmxpY1BhdGgiLCJ3ZWJwYWNrOi8vUm9vdHMvd2VicGFjay9ydW50aW1lL2pzb25wIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vUm9vdHMvLi9hc3NldHMvanMvYXBwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBhcmlhS2V5Q29kZXMgPSB7XHJcbiAgICBSRVRVUk46IDEzLFxyXG4gICAgU1BBQ0U6IDMyLFxyXG4gICAgTEVGVDogMzcsXHJcbiAgICBVUDogMzgsXHJcbiAgICBSSUdIVDogMzksXHJcbiAgICBET1dOOiA0MCxcclxufTtcclxuIiwiZXhwb3J0IHsgZGVmYXVsdCBhcyBpbml0UmFkaW9PcHRpb25zIH0gZnJvbSAnLi9yYWRpb09wdGlvbnMnO1xyXG4iLCJpbXBvcnQgeyBhcmlhS2V5Q29kZXMgfSBmcm9tICcuL2NvbnN0YW50cyc7XHJcblxyXG5jb25zdCBzZXRDaGVja2VkUmFkaW9JdGVtID0gKGl0ZW1Db2xsZWN0aW9uLCBpdGVtSWR4KSA9PiB7XHJcbiAgICBpdGVtQ29sbGVjdGlvbi5lYWNoKChpZHgsIGl0ZW0pID0+IHtcclxuICAgICAgICBjb25zdCAkaXRlbSA9ICQoaXRlbSk7XHJcbiAgICAgICAgaWYgKGlkeCAhPT0gaXRlbUlkeCkge1xyXG4gICAgICAgICAgICAkaXRlbS5hdHRyKCdhcmlhLWNoZWNrZWQnLCBmYWxzZSkucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJGl0ZW0uYXR0cignYXJpYS1jaGVja2VkJywgdHJ1ZSkucHJvcCgnY2hlY2tlZCcsIHRydWUpLmZvY3VzKCk7XHJcbiAgICAgICAgJGl0ZW0udHJpZ2dlcignY2hhbmdlJyk7XHJcbiAgICB9KTtcclxufTtcclxuXHJcbmNvbnN0IGNhbGN1bGF0ZVRhcmdldEl0ZW1Qb3NpdGlvbiA9IChsYXN0SXRlbUlkeCwgY3VycmVudElkeCkgPT4ge1xyXG4gICAgc3dpdGNoICh0cnVlKSB7XHJcbiAgICBjYXNlIGN1cnJlbnRJZHggPiBsYXN0SXRlbUlkeDogcmV0dXJuIDA7XHJcbiAgICBjYXNlIGN1cnJlbnRJZHggPCAwOiByZXR1cm4gbGFzdEl0ZW1JZHg7XHJcbiAgICBkZWZhdWx0OiByZXR1cm4gY3VycmVudElkeDtcclxuICAgIH1cclxufTtcclxuXHJcbmNvbnN0IGhhbmRsZUl0ZW1LZXlEb3duID0gaXRlbUNvbGxlY3Rpb24gPT4gZSA9PiB7XHJcbiAgICBjb25zdCB7IGtleUNvZGUgfSA9IGU7XHJcbiAgICBjb25zdCBpdGVtSWR4ID0gaXRlbUNvbGxlY3Rpb24uaW5kZXgoZS5jdXJyZW50VGFyZ2V0KTtcclxuICAgIGNvbnN0IGxhc3RDb2xsZWN0aW9uSXRlbUlkeCA9IGl0ZW1Db2xsZWN0aW9uLmxlbmd0aCAtIDE7XHJcblxyXG4gICAgaWYgKE9iamVjdC52YWx1ZXMoYXJpYUtleUNvZGVzKS5pbmNsdWRlcyhrZXlDb2RlKSkge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAoa2V5Q29kZSkge1xyXG4gICAgY2FzZSBhcmlhS2V5Q29kZXMuTEVGVDpcclxuICAgIGNhc2UgYXJpYUtleUNvZGVzLlVQOiB7XHJcbiAgICAgICAgY29uc3QgcHJldkl0ZW1JZHggPSBjYWxjdWxhdGVUYXJnZXRJdGVtUG9zaXRpb24obGFzdENvbGxlY3Rpb25JdGVtSWR4LCBpdGVtSWR4IC0gMSk7XHJcbiAgICAgICAgaXRlbUNvbGxlY3Rpb24uZ2V0KHByZXZJdGVtSWR4KS5mb2N1cygpO1xyXG4gICAgICAgIHNldENoZWNrZWRSYWRpb0l0ZW0oaXRlbUNvbGxlY3Rpb24sIGl0ZW1JZHggLSAxKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGNhc2UgYXJpYUtleUNvZGVzLlJJR0hUOlxyXG4gICAgY2FzZSBhcmlhS2V5Q29kZXMuRE9XTjoge1xyXG4gICAgICAgIGNvbnN0IG5leHRJdGVtSWR4ID0gY2FsY3VsYXRlVGFyZ2V0SXRlbVBvc2l0aW9uKGxhc3RDb2xsZWN0aW9uSXRlbUlkeCwgaXRlbUlkeCArIDEpO1xyXG4gICAgICAgIGl0ZW1Db2xsZWN0aW9uLmdldChuZXh0SXRlbUlkeCkuZm9jdXMoKTtcclxuICAgICAgICBzZXRDaGVja2VkUmFkaW9JdGVtKGl0ZW1Db2xsZWN0aW9uLCBpdGVtSWR4ICsgMSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgZGVmYXVsdDogYnJlYWs7XHJcbiAgICB9XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCAoJGNvbnRhaW5lciwgaXRlbVNlbGVjdG9yKSA9PiB7XHJcbiAgICBjb25zdCAkaXRlbUNvbGxlY3Rpb24gPSAkY29udGFpbmVyLmZpbmQoaXRlbVNlbGVjdG9yKTtcclxuXHJcbiAgICAkY29udGFpbmVyLm9uKCdrZXlkb3duJywgaXRlbVNlbGVjdG9yLCBoYW5kbGVJdGVtS2V5RG93bigkaXRlbUNvbGxlY3Rpb24pKTtcclxufTtcclxuIiwiZXhwb3J0IGNvbnN0IEZPQ1VTQUJMRV9FTEVNRU5UU19TRUxFQ1RPUiA9ICdbaHJlZl0sIGJ1dHRvbiwgaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QsIGRldGFpbHMsIFtjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdLCBbdGFiaW5kZXhdJztcclxuIiwiaW1wb3J0ICdzbGljay1jYXJvdXNlbCc7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgYWN0aXZhdGVQbGF5UGF1c2VCdXR0b24sXHJcbiAgICBhbmFsaXplU2xpZGVzLFxyXG4gICAgYXJyb3dBcmlhTGFibGluZyxcclxuICAgIGRvdHNTZXR1cCxcclxuICAgIGdldEFjdGl2ZVNsaWRlSWR4QW5kU2xpZGVzUXVhbnRpdHksXHJcbiAgICBoYW5kbGVJbWFnZUFzcGVjdFJhdGlvLFxyXG4gICAgaGFuZGxlSW1hZ2VMb2FkLFxyXG4gICAgcmVmcmVzaEZvY3VzLFxyXG4gICAgdXBkYXRlVGV4dFdpdGhMaXZlRGF0YSxcclxufSBmcm9tICcuL3V0aWxzJztcclxuXHJcbmV4cG9ydCBjb25zdCBzZXRDYXJvdXNlbFN0YXRlID0gKHsgZGVsZWdhdGVUYXJnZXQgfSwgY2Fyb3VzZWxPYmopID0+IHtcclxuICAgIGNvbnN0IGNhcm91c2VsT2JqQ3VycmVudCA9IGNhcm91c2VsT2JqIHx8IGRlbGVnYXRlVGFyZ2V0LnNsaWNrO1xyXG4gICAgY29uc3QgeyAkc2xpZGVyIH0gPSBjYXJvdXNlbE9iakN1cnJlbnQ7XHJcblxyXG4gICAgJHNsaWRlci5kYXRhKCdzdGF0ZScsIGdldEFjdGl2ZVNsaWRlSWR4QW5kU2xpZGVzUXVhbnRpdHkoY2Fyb3VzZWxPYmpDdXJyZW50KSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgb25Vc2VyQ2Fyb3VzZWxDaGFuZ2UgPSAoeyBkYXRhIH0sIGNvbnRleHQsICRzbGlkZXIpID0+IHtcclxuICAgIGNvbnN0ICRhY3RpdmVTbGlkZXIgPSAkc2xpZGVyIHx8IGRhdGE7XHJcbiAgICBjb25zdCAkcGFyZW50Q29udGFpbmVyID0gJGFjdGl2ZVNsaWRlci5oYXNDbGFzcygncHJvZHVjdFZpZXctdGh1bWJuYWlscycpID8gJGFjdGl2ZVNsaWRlci5wYXJlbnQoJy5wcm9kdWN0Vmlldy1pbWFnZXMnKSA6ICRhY3RpdmVTbGlkZXI7XHJcbiAgICBjb25zdCB7IGFjdGl2ZVNsaWRlSWR4LCBzbGlkZXNRdWFudGl0eSB9ID0gJGFjdGl2ZVNsaWRlci5kYXRhKCdzdGF0ZScpO1xyXG4gICAgY29uc3QgJGNhcm91c2VsQ29udGVudEVsZW1lbnQgPSAkKCdbZGF0YS1jYXJvdXNlbC1jb250ZW50LWNoYW5nZS1tZXNzYWdlXScsICRwYXJlbnRDb250YWluZXIpO1xyXG4gICAgY29uc3QgY2Fyb3VzZWxDb250ZW50QW5ub3VuY2VNZXNzYWdlID0gdXBkYXRlVGV4dFdpdGhMaXZlRGF0YShjb250ZXh0LmNhcm91c2VsQ29udGVudEFubm91bmNlTWVzc2FnZSwgKGFjdGl2ZVNsaWRlSWR4ICsgMSksIHNsaWRlc1F1YW50aXR5KTtcclxuXHJcbiAgICAkY2Fyb3VzZWxDb250ZW50RWxlbWVudC50ZXh0KGNhcm91c2VsQ29udGVudEFubm91bmNlTWVzc2FnZSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgb25TbGlja0Nhcm91c2VsQ2hhbmdlID0gKGUsIGNhcm91c2VsT2JqLCBjb250ZXh0KSA9PiB7XHJcbiAgICBjb25zdCB7XHJcbiAgICAgICAgJGRvdHMsXHJcbiAgICAgICAgJHNsaWRlcixcclxuICAgICAgICAkcHJldkFycm93LFxyXG4gICAgICAgICRuZXh0QXJyb3csXHJcbiAgICAgICAgb3B0aW9uczogeyBpbmZpbml0ZSB9LFxyXG4gICAgfSA9IGNhcm91c2VsT2JqO1xyXG5cclxuICAgIGNvbnN0IHsgYWN0aXZlU2xpZGVJZHgsIHNsaWRlc1F1YW50aXR5IH0gPSAkc2xpZGVyLmRhdGEoJ3N0YXRlJykgfHwgZ2V0QWN0aXZlU2xpZGVJZHhBbmRTbGlkZXNRdWFudGl0eShjYXJvdXNlbE9iaik7XHJcblxyXG4gICAgZG90c1NldHVwKCRkb3RzLCBhY3RpdmVTbGlkZUlkeCwgc2xpZGVzUXVhbnRpdHksIGNvbnRleHQpO1xyXG4gICAgYXJyb3dBcmlhTGFibGluZygkcHJldkFycm93LCAkbmV4dEFycm93LCBhY3RpdmVTbGlkZUlkeCwgc2xpZGVzUXVhbnRpdHksIGluZmluaXRlLCBjb250ZXh0LmNhcm91c2VsQXJyb3dBbmREb3RBcmlhTGFiZWwpO1xyXG4gICAgYW5hbGl6ZVNsaWRlcygkc2xpZGVyLmZpbmQoJy5zbGljay1zbGlkZScpKTtcclxuICAgIHJlZnJlc2hGb2N1cygkcHJldkFycm93LCAkbmV4dEFycm93LCAkZG90cywgJHNsaWRlciwgYWN0aXZlU2xpZGVJZHgsIHNsaWRlc1F1YW50aXR5LCBpbmZpbml0ZSk7XHJcblxyXG4gICAgJHNsaWRlci5kYXRhKCdzdGF0ZScsIG51bGwpO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGNvbnRleHQpIHtcclxuICAgICQoJ1tkYXRhLXNsaWNrXScpLmVhY2goKGlkeCwgY2Fyb3VzZWwpID0+IHtcclxuICAgICAgICAvLyBnZXR0aW5nIGVsZW1lbnQgdXNpbmcgZmluZCB0byBwYXNzIGplc3QgdGVzdFxyXG4gICAgICAgIGNvbnN0ICRjYXJvdXNlbCA9ICQoZG9jdW1lbnQpLmZpbmQoY2Fyb3VzZWwpO1xyXG5cclxuICAgICAgICAkY2Fyb3VzZWwub24oJ2luaXQgYnJlYWtwb2ludCBzd2lwZScsIHNldENhcm91c2VsU3RhdGUpO1xyXG4gICAgICAgICRjYXJvdXNlbC5vbignY2xpY2snLCAnLnNsaWNrLWFycm93LCAuc2xpY2stZG90cycsIHNldENhcm91c2VsU3RhdGUpO1xyXG5cclxuICAgICAgICAkY2Fyb3VzZWwub24oJ2luaXQgYnJlYWtwb2ludCcsIChlLCBjYXJvdXNlbE9iaikgPT4gYWN0aXZhdGVQbGF5UGF1c2VCdXR0b24oZSwgY2Fyb3VzZWxPYmosIGNvbnRleHQpKTtcclxuICAgICAgICAkY2Fyb3VzZWwub24oJ2luaXQgYWZ0ZXJDaGFuZ2UnLCAoZSwgY2Fyb3VzZWxPYmopID0+IG9uU2xpY2tDYXJvdXNlbENoYW5nZShlLCBjYXJvdXNlbE9iaiwgY29udGV4dCkpO1xyXG4gICAgICAgICRjYXJvdXNlbC5vbignY2xpY2snLCAnLnNsaWNrLWFycm93LCAuc2xpY2stZG90cycsICRjYXJvdXNlbCwgZSA9PiBvblVzZXJDYXJvdXNlbENoYW5nZShlLCBjb250ZXh0KSk7XHJcbiAgICAgICAgJGNhcm91c2VsLm9uKCdzd2lwZScsIChlLCBjYXJvdXNlbE9iaikgPT4gb25Vc2VyQ2Fyb3VzZWxDaGFuZ2UoZSwgY29udGV4dCwgY2Fyb3VzZWxPYmouJHNsaWRlcikpO1xyXG5cclxuICAgICAgICBpZiAoJGNhcm91c2VsLmhhc0NsYXNzKCdoZXJvQ2Fyb3VzZWwnKSkge1xyXG4gICAgICAgICAgICAkY2Fyb3VzZWwub24oJ2luaXQgYWZ0ZXJDaGFuZ2UnLCBoYW5kbGVJbWFnZUxvYWQpO1xyXG4gICAgICAgICAgICAkY2Fyb3VzZWwub24oJ3N3aXBlJywgaGFuZGxlSW1hZ2VBc3BlY3RSYXRpbyk7XHJcbiAgICAgICAgICAgICRjYXJvdXNlbC5vbignY2xpY2snLCAnLnNsaWNrLWFycm93LCAuc2xpY2stZG90cycsIGhhbmRsZUltYWdlQXNwZWN0UmF0aW8pO1xyXG5cclxuICAgICAgICAgICAgLy8gQWx0ZXJuYXRpdmUgaW1hZ2Ugc3R5bGluZyBmb3IgSUUsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBvYmplY3RmaXRcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUub2JqZWN0Rml0ID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgJGNhcm91c2VsLmZpbmQoJy5oZXJvQ2Fyb3VzZWwtc2xpZGUnKS5lYWNoKChpbmRleCwgc2xpZGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAkKHNsaWRlKS5hZGRDbGFzcygnY29tcGF0LW9iamVjdC1maXQnKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBpc011bHRpcGxlU2xpZGVzID0gJGNhcm91c2VsLmNoaWxkcmVuKCkubGVuZ3RoID4gMTtcclxuICAgICAgICBjb25zdCBjdXN0b21QYWdpbmcgPSBpc011bHRpcGxlU2xpZGVzXHJcbiAgICAgICAgICAgID8gKCkgPT4gKFxyXG4gICAgICAgICAgICAgICAgJzxidXR0b24gZGF0YS1jYXJvdXNlbC1kb3QgdHlwZT1cImJ1dHRvblwiPjwvYnV0dG9uPidcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICA6ICgpID0+IHt9O1xyXG5cclxuICAgICAgICAkY2Fyb3VzZWwuc2xpY2soe1xyXG4gICAgICAgICAgICBhY2Nlc3NpYmlsaXR5OiBmYWxzZSxcclxuICAgICAgICAgICAgYXJyb3dzOiBpc011bHRpcGxlU2xpZGVzLFxyXG4gICAgICAgICAgICBjdXN0b21QYWdpbmcsXHJcbiAgICAgICAgICAgIGRvdHM6IGlzTXVsdGlwbGVTbGlkZXMsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxufVxyXG4iLCJpbXBvcnQgeyB0aHJvdHRsZSB9IGZyb20gJ2xvZGFzaCc7XHJcblxyXG5jb25zdCBQTEFZX0FDVElPTiA9ICdzbGlja1BsYXknO1xyXG5jb25zdCBQQVVTRV9BQ1RJT04gPSAnc2xpY2tQYXVzZSc7XHJcbmNvbnN0IHVwZGF0ZUJ1dHRvbkxhYmVscyA9IChjb250ZXh0KSA9PiB7XHJcbiAgICBjb25zdCB7XHJcbiAgICAgICAgY2Fyb3VzZWxQbGF5UGF1c2VCdXR0b25QbGF5LFxyXG4gICAgICAgIGNhcm91c2VsUGxheVBhdXNlQnV0dG9uUGF1c2UsXHJcbiAgICAgICAgY2Fyb3VzZWxQbGF5UGF1c2VCdXR0b25BcmlhUGxheSxcclxuICAgICAgICBjYXJvdXNlbFBsYXlQYXVzZUJ1dHRvbkFyaWFQYXVzZSxcclxuICAgIH0gPSBjb250ZXh0O1xyXG5cclxuICAgIHJldHVybiAoJGJ1dHRvbiwgYWN0aW9uKSA9PiB7XHJcbiAgICAgICAgJGJ1dHRvblxyXG4gICAgICAgICAgICAudGV4dChhY3Rpb24gPT09IFBMQVlfQUNUSU9OXHJcbiAgICAgICAgICAgICAgICA/IGNhcm91c2VsUGxheVBhdXNlQnV0dG9uUGF1c2UgOiBjYXJvdXNlbFBsYXlQYXVzZUJ1dHRvblBsYXkpXHJcbiAgICAgICAgICAgIC5hdHRyKCdhcmlhLWxhYmVsJywgYWN0aW9uID09PSBQTEFZX0FDVElPTlxyXG4gICAgICAgICAgICAgICAgPyBjYXJvdXNlbFBsYXlQYXVzZUJ1dHRvbkFyaWFQYXVzZSA6IGNhcm91c2VsUGxheVBhdXNlQnV0dG9uQXJpYVBsYXkpO1xyXG4gICAgfTtcclxufTtcclxubGV0IHVwZGF0ZUJ1dHRvbkxhYmVsc1dpdGhDb250ZXh0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKGUsIGNhcm91c2VsT2JqLCBjb250ZXh0KSA9PiB7XHJcbiAgICBjb25zdCB7ICRzbGlkZXIsICRkb3RzLCBvcHRpb25zOiB7IHNwZWVkIH0gfSA9IGNhcm91c2VsT2JqO1xyXG4gICAgY29uc3QgJHBsYXlQYXVzZUJ1dHRvbiA9ICRzbGlkZXIuZmluZCgnW2RhdGEtcGxheS1wYXVzZS1idXR0b25dJyk7XHJcblxyXG4gICAgaWYgKCRwbGF5UGF1c2VCdXR0b24ubGVuZ3RoID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgLy8gZm9yIGNvcnJlY3QgY2Fyb3VzZWwgY29udHJvbHMgZm9jdXMgb3JkZXJcclxuICAgIGlmICgkZG90cykge1xyXG4gICAgICAgICRwbGF5UGF1c2VCdXR0b24uaW5zZXJ0QmVmb3JlKCRkb3RzKTtcclxuICAgIH0gZWxzZSAkc2xpZGVyLmFwcGVuZCgkcGxheVBhdXNlQnV0dG9uKTtcclxuXHJcbiAgICBjb25zdCB7IHNsaWRlc1F1YW50aXR5IH0gPSAkc2xpZGVyLmRhdGEoJ3N0YXRlJyk7XHJcbiAgICAkcGxheVBhdXNlQnV0dG9uLmNzcygnZGlzcGxheScsIHNsaWRlc1F1YW50aXR5ID4gMSA/ICdibG9jaycgOiAnbm9uZScpO1xyXG5cclxuICAgIGlmIChlLnR5cGUgPT09ICdpbml0JykgdXBkYXRlQnV0dG9uTGFiZWxzV2l0aENvbnRleHQgPSB1cGRhdGVCdXR0b25MYWJlbHMoY29udGV4dCk7XHJcblxyXG4gICAgaWYgKGUudHlwZSA9PT0gJ2JyZWFrcG9pbnQnKSB7XHJcbiAgICAgICAgdXBkYXRlQnV0dG9uTGFiZWxzV2l0aENvbnRleHQoJHBsYXlQYXVzZUJ1dHRvbiwgUExBWV9BQ1RJT04pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvblBsYXlQYXVzZUNsaWNrID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IGNhcm91c2VsT2JqLnBhdXNlZCA/IFBMQVlfQUNUSU9OIDogUEFVU0VfQUNUSU9OO1xyXG5cclxuICAgICAgICAkc2xpZGVyLnNsaWNrKGFjdGlvbik7XHJcbiAgICAgICAgdXBkYXRlQnV0dG9uTGFiZWxzV2l0aENvbnRleHQoJHBsYXlQYXVzZUJ1dHRvbiwgYWN0aW9uKTtcclxuICAgIH07XHJcblxyXG4gICAgJHBsYXlQYXVzZUJ1dHRvbi5vbignY2xpY2snLCB0aHJvdHRsZShvblBsYXlQYXVzZUNsaWNrLCBzcGVlZCwgeyB0cmFpbGluZzogZmFsc2UgfSkpO1xyXG59O1xyXG4iLCJpbXBvcnQgeyBGT0NVU0FCTEVfRUxFTUVOVFNfU0VMRUNUT1IgfSBmcm9tICcuLi9jb25zdGFudHMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKCRzbGlkZXMpID0+IHtcclxuICAgICRzbGlkZXMuZWFjaCgoaWR4LCBzbGlkZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0ICRzbGlkZSA9ICQoc2xpZGUpO1xyXG4gICAgICAgIGNvbnN0IHRhYkluZGV4ID0gJHNsaWRlLmhhc0NsYXNzKCdzbGljay1hY3RpdmUnKSA/IDAgOiAtMTtcclxuXHJcbiAgICAgICAgaWYgKCRzbGlkZS5pcyhGT0NVU0FCTEVfRUxFTUVOVFNfU0VMRUNUT1IpKSAkc2xpZGUuYXR0cigndGFiaW5kZXgnLCB0YWJJbmRleCk7XHJcblxyXG4gICAgICAgICRzbGlkZS5maW5kKEZPQ1VTQUJMRV9FTEVNRU5UU19TRUxFQ1RPUikuZWFjaCgoaW5kZXgsIGNoaWxkKSA9PiB7XHJcbiAgICAgICAgICAgICQoY2hpbGQpLmF0dHIoJ3RhYmluZGV4JywgdGFiSW5kZXgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn07XHJcbiIsImltcG9ydCB1cGRhdGVUZXh0V2l0aExpdmVEYXRhIGZyb20gJy4vdXBkYXRlVGV4dFdpdGhMaXZlRGF0YSc7XHJcbmltcG9ydCB0b29sdGlwU2V0dXAgZnJvbSAnLi90b29sdGlwU2V0dXAnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKCRwcmV2QXJyb3csICRuZXh0QXJyb3csIGFjdGl2ZVNsaWRlSWR4LCBzbGlkZXNRdWFudGl0eSwgaXNJbmZpbml0ZSwgYXJpYUxhYmVsKSA9PiB7XHJcbiAgICBpZiAoc2xpZGVzUXVhbnRpdHkgPCAyIHx8ICEkcHJldkFycm93IHx8ICEkbmV4dEFycm93KSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgYWN0aXZlU2xpZGVOdW1iZXIgPSBhY3RpdmVTbGlkZUlkeCArIDE7XHJcblxyXG4gICAgY29uc3QgcHJldlNsaWRlTnVtYmVyID0gYWN0aXZlU2xpZGVJZHggPT09IDAgPyBzbGlkZXNRdWFudGl0eSA6IGFjdGl2ZVNsaWRlTnVtYmVyIC0gMTtcclxuICAgIGNvbnN0IGFycm93TGVmdFRleHQgPSB1cGRhdGVUZXh0V2l0aExpdmVEYXRhKGFyaWFMYWJlbCwgcHJldlNsaWRlTnVtYmVyLCBzbGlkZXNRdWFudGl0eSk7XHJcblxyXG4gICAgJHByZXZBcnJvdy5hdHRyKHtcclxuICAgICAgICAnYXJpYS1sYWJlbCc6IGFycm93TGVmdFRleHQsXHJcbiAgICAgICAgdGFiaW5kZXg6ICFpc0luZmluaXRlICYmIGFjdGl2ZVNsaWRlSWR4ID09PSAwID8gLTEgOiAwLFxyXG4gICAgfSk7XHJcbiAgICB0b29sdGlwU2V0dXAoJHByZXZBcnJvdyk7XHJcblxyXG4gICAgY29uc3QgbmV4dFNsaWRlTnVtYmVyID0gYWN0aXZlU2xpZGVJZHggPT09IHNsaWRlc1F1YW50aXR5IC0gMSA/IDEgOiBhY3RpdmVTbGlkZU51bWJlciArIDE7XHJcbiAgICBjb25zdCBhcnJvd1JpZ2h0VGV4dCA9IHVwZGF0ZVRleHRXaXRoTGl2ZURhdGEoYXJpYUxhYmVsLCBuZXh0U2xpZGVOdW1iZXIsIHNsaWRlc1F1YW50aXR5KTtcclxuXHJcbiAgICAkbmV4dEFycm93LmF0dHIoe1xyXG4gICAgICAgICdhcmlhLWxhYmVsJzogYXJyb3dSaWdodFRleHQsXHJcbiAgICAgICAgdGFiaW5kZXg6ICFpc0luZmluaXRlICYmIGFjdGl2ZVNsaWRlSWR4ID09PSBzbGlkZXNRdWFudGl0eSAtIDEgPyAtMSA6IDAsXHJcbiAgICB9KTtcclxuICAgIHRvb2x0aXBTZXR1cCgkbmV4dEFycm93KTtcclxufTtcclxuIiwiaW1wb3J0IHVwZGF0ZVRleHRXaXRoTGl2ZURhdGEgZnJvbSAnLi91cGRhdGVUZXh0V2l0aExpdmVEYXRhJztcclxuaW1wb3J0IHRvb2x0aXBTZXR1cCBmcm9tICcuL3Rvb2x0aXBTZXR1cCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCAoJGRvdHMsIGFjdGl2ZVNsaWRlSWR4LCBzbGlkZXNRdWFudGl0eSwgeyBjYXJvdXNlbEFycm93QW5kRG90QXJpYUxhYmVsLCBjYXJvdXNlbEFjdGl2ZURvdEFyaWFMYWJlbCB9KSA9PiB7XHJcbiAgICBpZiAoISRkb3RzKSByZXR1cm47XHJcblxyXG4gICAgaWYgKHNsaWRlc1F1YW50aXR5IDwgMikge1xyXG4gICAgICAgICRkb3RzLmNzcygnZGlzcGxheScsICdub25lJyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgICRkb3RzLmNzcygnZGlzcGxheScsICdibG9jaycpO1xyXG5cclxuICAgICRkb3RzLmNoaWxkcmVuKCkuZWFjaCgoaWR4LCBkb3QpID0+IHtcclxuICAgICAgICBjb25zdCBkb3RMYWJlbFRleHQgPSB1cGRhdGVUZXh0V2l0aExpdmVEYXRhKGNhcm91c2VsQXJyb3dBbmREb3RBcmlhTGFiZWwsIGlkeCArIDEsIHNsaWRlc1F1YW50aXR5KTtcclxuICAgICAgICBjb25zdCBkb3RTbGlkZVN0YXR1c1RleHQgPSBpZHggPT09IGFjdGl2ZVNsaWRlSWR4ID8gYCwgJHtjYXJvdXNlbEFjdGl2ZURvdEFyaWFMYWJlbH1gIDogJyc7XHJcbiAgICAgICAgY29uc3QgZG90QXJpYUxhYmVsID0gYCR7ZG90TGFiZWxUZXh0fSR7ZG90U2xpZGVTdGF0dXNUZXh0fWA7XHJcbiAgICAgICAgY29uc3QgJGRvdEJ1dHRvbiA9ICQoZG90KS5maW5kKCdbZGF0YS1jYXJvdXNlbC1kb3RdJyk7XHJcblxyXG4gICAgICAgIHRvb2x0aXBTZXR1cCgkZG90QnV0dG9uLmF0dHIoJ2FyaWEtbGFiZWwnLCBkb3RBcmlhTGFiZWwpKTtcclxuICAgIH0pO1xyXG59O1xyXG4iLCJleHBvcnQgZGVmYXVsdCAoeyBzbGlkZUNvdW50LCAkc2xpZGVzLCBvcHRpb25zOiB7IHNsaWRlc1RvU2hvdywgc2xpZGVzVG9TY3JvbGwgfSB9KSA9PiB7XHJcbiAgICBjb25zdCBsYXN0VmlzaWJsZUlkeCA9ICRzbGlkZXMuZ2V0KCkucmVkdWNlKChhY2MsIGN1cnIsIGlkeCkgPT4ge1xyXG4gICAgICAgIGlmICgkKGN1cnIpLmhhc0NsYXNzKCdzbGljay1hY3RpdmUnKSkgcmV0dXJuIGlkeDtcclxuICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgfSwgLTEpO1xyXG5cclxuICAgIGNvbnN0IGFjdGl2ZVNsaWRlSWR4ID0gbGFzdFZpc2libGVJZHggPCBzbGlkZXNUb1Nob3dcclxuICAgICAgICA/IDBcclxuICAgICAgICA6IE1hdGguY2VpbCgobGFzdFZpc2libGVJZHggKyAxIC0gc2xpZGVzVG9TaG93KSAvIHNsaWRlc1RvU2Nyb2xsKTtcclxuXHJcbiAgICBsZXQgc2xpZGVzUXVhbnRpdHk7XHJcbiAgICBpZiAoc2xpZGVDb3VudCA9PT0gMCkge1xyXG4gICAgICAgIHNsaWRlc1F1YW50aXR5ID0gMDtcclxuICAgIH0gZWxzZSBpZiAoc2xpZGVDb3VudCA8PSBzbGlkZXNUb1Nob3cpIHtcclxuICAgICAgICBzbGlkZXNRdWFudGl0eSA9IDE7XHJcbiAgICB9IGVsc2Ugc2xpZGVzUXVhbnRpdHkgPSBNYXRoLmNlaWwoKHNsaWRlQ291bnQgLSBzbGlkZXNUb1Nob3cpIC8gc2xpZGVzVG9TY3JvbGwpICsgMTtcclxuXHJcbiAgICAvLyBGWUkgLSBvbmUgc2xpZGUgY2FuIGNvbnRhaW4gc2V2ZXJhbCBjYXJkIGl0ZW1zIGZvciBwcm9kdWN0IGNhcm91c2VsXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGFjdGl2ZVNsaWRlSWR4LFxyXG4gICAgICAgIHNsaWRlc1F1YW50aXR5LFxyXG4gICAgfTtcclxufTtcclxuIiwiZXhwb3J0IGRlZmF1bHQgKHsgJHNsaWRlciB9LCBpc0FuYWx5emVkRGF0YUF0dHIpID0+IHtcclxuICAgIGNvbnN0ICRhY3RpdmVTbGlkZSA9ICRzbGlkZXIuZmluZCgnLnNsaWNrLWN1cnJlbnQnKTtcclxuICAgIGNvbnN0IGlzQW5hbHl6ZWRTbGlkZSA9ICRhY3RpdmVTbGlkZS5kYXRhKGlzQW5hbHl6ZWREYXRhQXR0cik7XHJcblxyXG4gICAgaWYgKGlzQW5hbHl6ZWRTbGlkZSkgcmV0dXJuIHsgaXNBbmFseXplZFNsaWRlIH07XHJcblxyXG4gICAgY29uc3QgJGFjdGl2ZVNsaWRlSW1nID0gJGFjdGl2ZVNsaWRlLmZpbmQoJy5oZXJvQ2Fyb3VzZWwtaW1hZ2UnKTtcclxuICAgIGNvbnN0IGFjdGl2ZVNsaWRlSW1nTm9kZSA9ICRhY3RpdmVTbGlkZUltZ1swXTtcclxuICAgIGNvbnN0ICRhY3RpdmVTbGlkZUFuZENsb25lcyA9ICRzbGlkZXIuZmluZChgW2RhdGEtaGVyby1zbGlkZT0keyRhY3RpdmVTbGlkZS5kYXRhKCdoZXJvLXNsaWRlJyl9XWApO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgJHNsaWRlcixcclxuICAgICAgICAkYWN0aXZlU2xpZGUsXHJcbiAgICAgICAgJGFjdGl2ZVNsaWRlSW1nLFxyXG4gICAgICAgIGFjdGl2ZVNsaWRlSW1nTm9kZSxcclxuICAgICAgICAkYWN0aXZlU2xpZGVBbmRDbG9uZXMsXHJcbiAgICB9O1xyXG59O1xyXG4iLCJpbXBvcnQgZ2V0QWN0aXZlU2xpZGVJbmZvIGZyb20gJy4vZ2V0QWN0aXZlU2xpZGVJbmZvJztcclxuXHJcbmNvbnN0IElNQUdFX0NMQVNTRVMgPSB7XHJcbiAgICB2ZXJ0aWNhbDogJ2lzLXZlcnRpY2FsLWltYWdlLXR5cGUnLFxyXG4gICAgc3F1YXJlOiAnaXMtc3F1YXJlLWltYWdlLXR5cGUnLFxyXG59O1xyXG5jb25zdCBJU19BTkFMWVpFRF9EQVRBX0FUVFIgPSAnaW1hZ2UtcmF0aW8tYW5hbHl6ZWQnO1xyXG5cclxuY29uc3QgZGVmaW5lQXNwZWN0UmF0aW9DbGFzcyA9IChpbWFnZUFzcGVjdFJhdGlvKSA9PiB7XHJcbiAgICBzd2l0Y2ggKHRydWUpIHtcclxuICAgIGNhc2UgaW1hZ2VBc3BlY3RSYXRpbyA+IDAuOCAmJiBpbWFnZUFzcGVjdFJhdGlvIDw9IDEuMjpcclxuICAgICAgICByZXR1cm4gSU1BR0VfQ0xBU1NFUy5zcXVhcmU7XHJcbiAgICBjYXNlIGltYWdlQXNwZWN0UmF0aW8gPiAxLjI6XHJcbiAgICAgICAgcmV0dXJuIElNQUdFX0NMQVNTRVMudmVydGljYWw7XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxufTtcclxuXHJcbmNvbnN0IHNldEFzcGVjdFJhdGlvQ2xhc3MgPSAoaW1hZ2VOb2RlLCAkc2xpZGVzKSA9PiB7XHJcbiAgICBpZiAoaW1hZ2VOb2RlLm5hdHVyYWxIZWlnaHQgPD0gMSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGltYWdlQXNwZWN0UmF0aW8gPSBpbWFnZU5vZGUubmF0dXJhbEhlaWdodCAvIGltYWdlTm9kZS5uYXR1cmFsV2lkdGg7XHJcbiAgICAkc2xpZGVzLmFkZENsYXNzKGRlZmluZUFzcGVjdFJhdGlvQ2xhc3MoaW1hZ2VBc3BlY3RSYXRpbykpO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKHsgZGVsZWdhdGVUYXJnZXQgfSwgY2Fyb3VzZWxPYmopID0+IHtcclxuICAgIGNvbnN0IHtcclxuICAgICAgICBpc0FuYWx5emVkU2xpZGUsXHJcbiAgICAgICAgJGFjdGl2ZVNsaWRlLFxyXG4gICAgICAgICRhY3RpdmVTbGlkZUltZyxcclxuICAgICAgICBhY3RpdmVTbGlkZUltZ05vZGUsXHJcbiAgICAgICAgJGFjdGl2ZVNsaWRlQW5kQ2xvbmVzLFxyXG4gICAgfSA9IGdldEFjdGl2ZVNsaWRlSW5mbyhjYXJvdXNlbE9iaiB8fCBkZWxlZ2F0ZVRhcmdldC5zbGljaywgSVNfQU5BTFlaRURfREFUQV9BVFRSKTtcclxuXHJcbiAgICBpZiAoaXNBbmFseXplZFNsaWRlKSByZXR1cm47XHJcblxyXG4gICAgJGFjdGl2ZVNsaWRlQW5kQ2xvbmVzLmRhdGEoSVNfQU5BTFlaRURfREFUQV9BVFRSLCB0cnVlKTtcclxuXHJcbiAgICBpZiAoJGFjdGl2ZVNsaWRlLmZpbmQoJy5oZXJvQ2Fyb3VzZWwtY29udGVudCcpLmxlbmd0aCkgcmV0dXJuO1xyXG5cclxuICAgIGlmIChhY3RpdmVTbGlkZUltZ05vZGUuY29tcGxldGUpIHtcclxuICAgICAgICBpZiAoYWN0aXZlU2xpZGVJbWdOb2RlLm5hdHVyYWxIZWlnaHQgPT09IDEpIHtcclxuICAgICAgICAgICAgLy8gb25seSBiYXNlNjQgaW1hZ2UgZnJvbSBzcmNzZXQgd2FzIGxvYWRlZFxyXG4gICAgICAgICAgICAkYWN0aXZlU2xpZGVJbWcub24oJ2xvYWQnLCAoKSA9PiBzZXRBc3BlY3RSYXRpb0NsYXNzKGFjdGl2ZVNsaWRlSW1nTm9kZSwgJGFjdGl2ZVNsaWRlQW5kQ2xvbmVzKSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChhY3RpdmVTbGlkZUltZ05vZGUubmF0dXJhbEhlaWdodCA+IDEpIHtcclxuICAgICAgICAgICAgc2V0QXNwZWN0UmF0aW9DbGFzcyhhY3RpdmVTbGlkZUltZ05vZGUsICRhY3RpdmVTbGlkZUFuZENsb25lcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfSBlbHNlICRhY3RpdmVTbGlkZUltZy5vbignbG9hZCcsICgpID0+IHNldEFzcGVjdFJhdGlvQ2xhc3MoYWN0aXZlU2xpZGVJbWdOb2RlLCAkYWN0aXZlU2xpZGVBbmRDbG9uZXMpKTtcclxufTtcclxuIiwiaW1wb3J0IHsgaXNCcm93c2VySUUgfSBmcm9tICcuLi8uLi91dGlscy9pZS1oZWxwZXJzJztcclxuaW1wb3J0IGdldEFjdGl2ZVNsaWRlSW5mbyBmcm9tICcuL2dldEFjdGl2ZVNsaWRlSW5mbyc7XHJcblxyXG5jb25zdCBJTUFHRV9FUlJPUl9DTEFTUyA9ICdpcy1pbWFnZS1lcnJvcic7XHJcbmNvbnN0IElTX0FOQUxZWkVEX0RBVEFfQVRUUiA9ICdpbWFnZS1sb2FkLWFuYWx5emVkJztcclxuXHJcbmNvbnN0IGdlbmVyYXRlSW1hZ2UgPSAoJGltYWdlLCAkc2xpZGVzKSA9PiB7XHJcbiAgICAkKCc8aW1nIC8+JylcclxuICAgICAgICAub24oJ2Vycm9yJywgKCkgPT4gJHNsaWRlcy5hZGRDbGFzcyhJTUFHRV9FUlJPUl9DTEFTUykpXHJcbiAgICAgICAgLmF0dHIoJ3NyYycsICRpbWFnZS5hdHRyKCdzcmMnKSk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCAoZSwgY2Fyb3VzZWxPYmopID0+IHtcclxuICAgIGNvbnN0IHtcclxuICAgICAgICBpc0FuYWx5emVkU2xpZGUsXHJcbiAgICAgICAgJGFjdGl2ZVNsaWRlSW1nLFxyXG4gICAgICAgIGFjdGl2ZVNsaWRlSW1nTm9kZSxcclxuICAgICAgICAkYWN0aXZlU2xpZGVBbmRDbG9uZXMsXHJcbiAgICB9ID0gZ2V0QWN0aXZlU2xpZGVJbmZvKGNhcm91c2VsT2JqLCBJU19BTkFMWVpFRF9EQVRBX0FUVFIpO1xyXG5cclxuICAgIGlmIChpc0FuYWx5emVkU2xpZGUpIHJldHVybjtcclxuXHJcbiAgICAkYWN0aXZlU2xpZGVBbmRDbG9uZXMuZGF0YShJU19BTkFMWVpFRF9EQVRBX0FUVFIsIHRydWUpO1xyXG5cclxuICAgIGlmIChhY3RpdmVTbGlkZUltZ05vZGUuY29tcGxldGUpIHtcclxuICAgICAgICBpZiAoYWN0aXZlU2xpZGVJbWdOb2RlLm5hdHVyYWxIZWlnaHQgPT09IDApIHtcclxuICAgICAgICAgICAgJGFjdGl2ZVNsaWRlQW5kQ2xvbmVzLmFkZENsYXNzKElNQUdFX0VSUk9SX0NMQVNTKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGFjdGl2ZVNsaWRlSW1nTm9kZS5uYXR1cmFsSGVpZ2h0ID09PSAxKSB7XHJcbiAgICAgICAgICAgIC8vIG9ubHkgYmFzZTY0IGltYWdlIGZyb20gc3Jjc2V0IHdhcyBsb2FkZWRcclxuICAgICAgICAgICAgJGFjdGl2ZVNsaWRlSW1nLm9uKCdlcnJvcicsICgpID0+ICRhY3RpdmVTbGlkZUFuZENsb25lcy5hZGRDbGFzcyhJTUFHRV9FUlJPUl9DTEFTUykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghJGFjdGl2ZVNsaWRlSW1nLmF0dHIoJ3NyYycpKSB7XHJcbiAgICAgICAgJGFjdGl2ZVNsaWRlQW5kQ2xvbmVzLmFkZENsYXNzKElNQUdFX0VSUk9SX0NMQVNTKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGlzQnJvd3NlcklFKSB7XHJcbiAgICAgICAgZ2VuZXJhdGVJbWFnZSgkYWN0aXZlU2xpZGVJbWcsICRhY3RpdmVTbGlkZUFuZENsb25lcyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgICRhY3RpdmVTbGlkZUltZy5vbignZXJyb3InLCAoKSA9PiAkYWN0aXZlU2xpZGVBbmRDbG9uZXMuYWRkQ2xhc3MoSU1BR0VfRVJST1JfQ0xBU1MpKTtcclxufTtcclxuIiwiZXhwb3J0IHsgZGVmYXVsdCBhcyBhY3RpdmF0ZVBsYXlQYXVzZUJ1dHRvbiB9IGZyb20gJy4vYWN0aXZhdGVQbGF5UGF1c2VCdXR0b24nO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFuYWxpemVTbGlkZXMgfSBmcm9tICcuL2FuYWxpemVTbGlkZXMnO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFycm93QXJpYUxhYmxpbmcgfSBmcm9tICcuL2Fycm93QXJpYUxhYmxpbmcnO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIGRvdHNTZXR1cCB9IGZyb20gJy4vZG90c1NldHVwJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBnZXRBY3RpdmVTbGlkZUlkeEFuZFNsaWRlc1F1YW50aXR5IH0gZnJvbSAnLi9nZXRBY3RpdmVTbGlkZUlkeEFuZFNsaWRlc1F1YW50aXR5JztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBoYW5kbGVJbWFnZUFzcGVjdFJhdGlvIH0gZnJvbSAnLi9oYW5kbGVJbWFnZUFzcGVjdFJhdGlvJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBoYW5kbGVJbWFnZUxvYWQgfSBmcm9tICcuL2hhbmRsZUltYWdlTG9hZCc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcmVmcmVzaEZvY3VzIH0gZnJvbSAnLi9yZWZyZXNoRm9jdXMnO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIHVwZGF0ZVRleHRXaXRoTGl2ZURhdGEgfSBmcm9tICcuL3VwZGF0ZVRleHRXaXRoTGl2ZURhdGEnO1xyXG4iLCJpbXBvcnQgeyBGT0NVU0FCTEVfRUxFTUVOVFNfU0VMRUNUT1IgfSBmcm9tICcuLi9jb25zdGFudHMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKCRwcmV2QXJyb3csICRuZXh0QXJyb3csICRkb3RzLCAkc2xpZGVyLCBhY3RpdmVTbGlkZUlkeCwgc2xpZGVzUXVhbnRpdHksIGlzSW5maW5pdGUpID0+IHtcclxuICAgIGlmIChpc0luZmluaXRlIHx8ICEkcHJldkFycm93IHx8ICEkbmV4dEFycm93KSByZXR1cm47XHJcblxyXG4gICAgaWYgKGFjdGl2ZVNsaWRlSWR4ID09PSAwICYmICRwcmV2QXJyb3cuaXMoJzpmb2N1cycpKSB7XHJcbiAgICAgICAgJG5leHRBcnJvdy5mb2N1cygpO1xyXG4gICAgfSBlbHNlIGlmIChhY3RpdmVTbGlkZUlkeCA9PT0gc2xpZGVzUXVhbnRpdHkgLSAxICYmICRuZXh0QXJyb3cuaXMoJzpmb2N1cycpKSB7XHJcbiAgICAgICAgaWYgKCRkb3RzKSB7XHJcbiAgICAgICAgICAgICRkb3RzLmNoaWxkcmVuKCkuZmlyc3QoKS5maW5kKCdbZGF0YS1jYXJvdXNlbC1kb3RdJykuZm9jdXMoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgJGZpcnN0QWN0aXZlU2xpZGUgPSAkc2xpZGVyLmZpbmQoJy5zbGljay1hY3RpdmUnKS5maXJzdCgpO1xyXG5cclxuICAgICAgICBpZiAoJGZpcnN0QWN0aXZlU2xpZGUuaXMoRk9DVVNBQkxFX0VMRU1FTlRTX1NFTEVDVE9SKSkge1xyXG4gICAgICAgICAgICAkZmlyc3RBY3RpdmVTbGlkZS5mb2N1cygpO1xyXG4gICAgICAgIH0gZWxzZSAkZmlyc3RBY3RpdmVTbGlkZS5maW5kKEZPQ1VTQUJMRV9FTEVNRU5UU19TRUxFQ1RPUikuZmlyc3QoKS5mb2N1cygpO1xyXG4gICAgfVxyXG59O1xyXG4iLCJjb25zdCBUT09MVElQX0RBVEFfU0VMRUNUT1IgPSAnZGF0YS1jYXJvdXNlbC10b29sdGlwJztcclxuY29uc3QgVE9PTFRJUF9DTEFTUyA9ICdjYXJvdXNlbC10b29sdGlwJztcclxuY29uc3QgVE9PTFRJUF9OT0RFID0gYDxzcGFuICR7VE9PTFRJUF9EQVRBX1NFTEVDVE9SfSBjbGFzcz1cIiR7VE9PTFRJUF9DTEFTU31cIj48L3NwYW4+YDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0ICgkbm9kZSkgPT4ge1xyXG4gICAgY29uc3QgJGV4aXN0ZWRUb29sdGlwID0gJG5vZGUuZmluZChgWyR7VE9PTFRJUF9EQVRBX1NFTEVDVE9SfV1gKTtcclxuICAgIGlmICgkZXhpc3RlZFRvb2x0aXAubGVuZ3RoKSB7XHJcbiAgICAgICAgJGV4aXN0ZWRUb29sdGlwLmF0dHIoJ2FyaWEtbGFiZWwnLCAkbm9kZS5hdHRyKCdhcmlhLWxhYmVsJykpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCAkdG9vbHRpcCA9ICQoVE9PTFRJUF9OT0RFKS5hdHRyKCdhcmlhLWxhYmVsJywgJG5vZGUuYXR0cignYXJpYS1sYWJlbCcpKTtcclxuICAgICAgICAkbm9kZS5hcHBlbmQoJHRvb2x0aXApO1xyXG4gICAgfVxyXG59O1xyXG4iLCJjb25zdCBTTElERV9OVU1CRVIgPSAnW1NMSURFX05VTUJFUl0nO1xyXG5jb25zdCBTTElERVNfUVVBTlRJVFkgPSAnW1NMSURFU19RVUFOVElUWV0nO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKHRleHRGb3JDaGFuZ2UsIHNsaWRlTnVtYmVyLCBzbGlkZXNRdWFudGl0eSkgPT4gKFxyXG4gICAgdGV4dEZvckNoYW5nZVxyXG4gICAgICAgIC5yZXBsYWNlKFNMSURFX05VTUJFUiwgc2xpZGVOdW1iZXIpXHJcbiAgICAgICAgLnJlcGxhY2UoU0xJREVTX1FVQU5USVRZLCBzbGlkZXNRdWFudGl0eSlcclxuKTtcclxuIiwiaW1wb3J0IHsgQ29sbGFwc2libGVFdmVudHMgfSBmcm9tICcuLi9jb21tb24vY29sbGFwc2libGUnO1xyXG5cclxuY29uc3QgUExVR0lOX0tFWSA9ICdjb2xsYXBzaWJsZS1ncm91cCc7XHJcblxyXG4vKlxyXG4gKiBNYW5hZ2UgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIGNvbGxhcHNpYmxlcy4gRm9yIGV4YW1wbGUsIGlmIGEgY29sbGFwc2libGUgaXNcclxuICogYWJvdXQgdG8gb3BlbiBhbmQgdGhlcmUncyBvbmUgYWxyZWFkeSBvcGVuLCBjbG9zZSB0aGUgbGF0dGVyIGZpcnN0LlxyXG4gKiBAcGFyYW0ge2pRdWVyeX0gJGNvbXBvbmVudFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIENvbGxhcHNpYmxlR3JvdXAge1xyXG4gICAgY29uc3RydWN0b3IoJGNvbXBvbmVudCkge1xyXG4gICAgICAgIHRoaXMuJGNvbXBvbmVudCA9ICRjb21wb25lbnQ7XHJcbiAgICAgICAgdGhpcy5vcGVuQ29sbGFwc2libGUgPSBudWxsO1xyXG5cclxuICAgICAgICAvLyBBdXRvIGJpbmRcclxuICAgICAgICB0aGlzLm9uQ29sbGFwc2libGVPcGVuID0gdGhpcy5vbkNvbGxhcHNpYmxlT3Blbi5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub25Db2xsYXBzaWJsZUNsb3NlID0gdGhpcy5vbkNvbGxhcHNpYmxlQ2xvc2UuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgLy8gTGlzdGVuXHJcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3BlbkNvbGxhcHNpYmxlICYmICF0aGlzLm9wZW5Db2xsYXBzaWJsZS5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLm9wZW5Db2xsYXBzaWJsZS5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBiaW5kRXZlbnRzKCkge1xyXG4gICAgICAgIHRoaXMuJGNvbXBvbmVudC5vbihDb2xsYXBzaWJsZUV2ZW50cy5vcGVuLCB0aGlzLm9uQ29sbGFwc2libGVPcGVuKTtcclxuICAgICAgICB0aGlzLiRjb21wb25lbnQub24oQ29sbGFwc2libGVFdmVudHMuY2xvc2UsIHRoaXMub25Db2xsYXBzaWJsZUNsb3NlKTtcclxuICAgIH1cclxuXHJcbiAgICB1bmJpbmRFdmVudHMoKSB7XHJcbiAgICAgICAgdGhpcy4kY29tcG9uZW50Lm9mZihDb2xsYXBzaWJsZUV2ZW50cy5vcGVuLCB0aGlzLm9uQ29sbGFwc2libGVPcGVuKTtcclxuICAgICAgICB0aGlzLiRjb21wb25lbnQub2ZmKENvbGxhcHNpYmxlRXZlbnRzLmNsb3NlLCB0aGlzLm9uQ29sbGFwc2libGVDbG9zZSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Db2xsYXBzaWJsZU9wZW4oZXZlbnQsIGNvbGxhcHNpYmxlSW5zdGFuY2UpIHtcclxuICAgICAgICBpZiAodGhpcy5vcGVuQ29sbGFwc2libGUgJiYgdGhpcy5vcGVuQ29sbGFwc2libGUuaGFzQ29sbGFwc2libGUoY29sbGFwc2libGVJbnN0YW5jZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG5cclxuICAgICAgICB0aGlzLm9wZW5Db2xsYXBzaWJsZSA9IGNvbGxhcHNpYmxlSW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgb25Db2xsYXBzaWJsZUNsb3NlKGV2ZW50LCBjb2xsYXBzaWJsZUluc3RhbmNlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3BlbkNvbGxhcHNpYmxlICYmIHRoaXMub3BlbkNvbGxhcHNpYmxlLmhhc0NvbGxhcHNpYmxlKGNvbGxhcHNpYmxlSW5zdGFuY2UpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMub3BlbkNvbGxhcHNpYmxlID0gbnVsbDtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBuZXcgQ29sbGFwc2libGVHcm91cCBpbnN0YW5jZXNcclxuICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl1cclxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxyXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuJGNvbnRleHRdXHJcbiAqIEByZXR1cm4ge0FycmF5fSBhcnJheSBvZiBDb2xsYXBzaWJsZUdyb3VwIGluc3RhbmNlc1xyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29sbGFwc2libGVHcm91cEZhY3Rvcnkoc2VsZWN0b3IgPSBgW2RhdGEtJHtQTFVHSU5fS0VZfV1gLCBvcHRpb25zID0ge30pIHtcclxuICAgIGNvbnN0ICRncm91cHMgPSAkKHNlbGVjdG9yLCBvcHRpb25zLiRjb250ZXh0KTtcclxuICAgIGNvbnN0IGluc3RhbmNlS2V5ID0gYCR7UExVR0lOX0tFWX1JbnN0YW5jZWA7XHJcblxyXG4gICAgcmV0dXJuICRncm91cHMubWFwKChpbmRleCwgZWxlbWVudCkgPT4ge1xyXG4gICAgICAgIGNvbnN0ICRncm91cCA9ICQoZWxlbWVudCk7XHJcbiAgICAgICAgY29uc3QgY2FjaGVkR3JvdXAgPSAkZ3JvdXAuZGF0YShpbnN0YW5jZUtleSk7XHJcblxyXG4gICAgICAgIGlmIChjYWNoZWRHcm91cCBpbnN0YW5jZW9mIENvbGxhcHNpYmxlR3JvdXApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZEdyb3VwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgQ29sbGFwc2libGVHcm91cCgkZ3JvdXApO1xyXG5cclxuICAgICAgICAkZ3JvdXAuZGF0YShpbnN0YW5jZUtleSwgZ3JvdXApO1xyXG5cclxuICAgICAgICByZXR1cm4gZ3JvdXA7XHJcbiAgICB9KS50b0FycmF5KCk7XHJcbn1cclxuIiwiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IG1lZGlhUXVlcnlMaXN0RmFjdG9yeSBmcm9tICcuL21lZGlhLXF1ZXJ5LWxpc3QnO1xyXG5cclxuY29uc3QgUExVR0lOX0tFWSA9ICdjb2xsYXBzaWJsZSc7XHJcblxyXG5leHBvcnQgY29uc3QgQ29sbGFwc2libGVFdmVudHMgPSB7XHJcbiAgICBvcGVuOiAnb3Blbi5jb2xsYXBzaWJsZScsXHJcbiAgICBjbG9zZTogJ2Nsb3NlLmNvbGxhcHNpYmxlJyxcclxuICAgIHRvZ2dsZTogJ3RvZ2dsZS5jb2xsYXBzaWJsZScsXHJcbiAgICBjbGljazogJ2NsaWNrLmNvbGxhcHNpYmxlJyxcclxufTtcclxuXHJcbmNvbnN0IENvbGxhcHNpYmxlU3RhdGUgPSB7XHJcbiAgICBjbG9zZWQ6ICdjbG9zZWQnLFxyXG4gICAgb3BlbjogJ29wZW4nLFxyXG59O1xyXG5cclxuZnVuY3Rpb24gcHJlcGVuZEhhc2goaWQpIHtcclxuICAgIGlmIChpZCAmJiBpZC5pbmRleE9mKCcjJykgPT09IDApIHtcclxuICAgICAgICByZXR1cm4gaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGAjJHtpZH1gO1xyXG59XHJcblxyXG5mdW5jdGlvbiBvcHRpb25zRnJvbURhdGEoJGVsZW1lbnQpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgZGlzYWJsZWRCcmVha3BvaW50OiAkZWxlbWVudC5kYXRhKGAke1BMVUdJTl9LRVl9RGlzYWJsZWRCcmVha3BvaW50YCksXHJcbiAgICAgICAgZGlzYWJsZWRTdGF0ZTogJGVsZW1lbnQuZGF0YShgJHtQTFVHSU5fS0VZfURpc2FibGVkU3RhdGVgKSxcclxuICAgICAgICBlbmFibGVkU3RhdGU6ICRlbGVtZW50LmRhdGEoYCR7UExVR0lOX0tFWX1FbmFibGVkU3RhdGVgKSxcclxuICAgICAgICBvcGVuQ2xhc3NOYW1lOiAkZWxlbWVudC5kYXRhKGAke1BMVUdJTl9LRVl9T3BlbkNsYXNzTmFtZWApLFxyXG4gICAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbGxhcHNlL0V4cGFuZCB0b2dnbGVcclxuICovXHJcbmV4cG9ydCBjbGFzcyBDb2xsYXBzaWJsZSB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7alF1ZXJ5fSAkdG9nZ2xlIC0gVHJpZ2dlciBidXR0b25cclxuICAgICAqIEBwYXJhbSB7alF1ZXJ5fSAkdGFyZ2V0IC0gQ29udGVudCB0byBjb2xsYXBzZSAvIGV4cGFuZFxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIENvbmZpZ3VyYWJsZSBvcHRpb25zXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuJGNvbnRleHRdXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZGlzYWJsZWRCcmVha3BvaW50XVxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmRpc2FibGVkU3RhdGVdXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuZW5hYmxlZFN0YXRlXVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm9wZW5DbGFzc05hbWVdXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICpcclxuICAgICAqIDxidXR0b24gaWQ9XCIjbW9yZVwiPkNvbGxhcHNlPC9idXR0b24+XHJcbiAgICAgKiA8ZGl2IGlkPVwiY29udGVudFwiPi4uLjwvZGl2PlxyXG4gICAgICpcclxuICAgICAqIG5ldyBDb2xsYXBzaWJsZSgkKCcjbW9yZScpLCAkKCcjY29udGVudCcpKTtcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoJHRvZ2dsZSwgJHRhcmdldCwge1xyXG4gICAgICAgIGRpc2FibGVkQnJlYWtwb2ludCxcclxuICAgICAgICBkaXNhYmxlZFN0YXRlLFxyXG4gICAgICAgIGVuYWJsZWRTdGF0ZSxcclxuICAgICAgICBvcGVuQ2xhc3NOYW1lID0gJ2lzLW9wZW4nLFxyXG4gICAgfSA9IHt9KSB7XHJcbiAgICAgICAgdGhpcy4kdG9nZ2xlID0gJHRvZ2dsZTtcclxuICAgICAgICB0aGlzLiR0YXJnZXQgPSAkdGFyZ2V0O1xyXG4gICAgICAgIHRoaXMudGFyZ2V0SWQgPSAkdGFyZ2V0LmF0dHIoJ2lkJyk7XHJcbiAgICAgICAgdGhpcy5vcGVuQ2xhc3NOYW1lID0gb3BlbkNsYXNzTmFtZTtcclxuICAgICAgICB0aGlzLmRpc2FibGVkU3RhdGUgPSBkaXNhYmxlZFN0YXRlO1xyXG4gICAgICAgIHRoaXMuZW5hYmxlZFN0YXRlID0gZW5hYmxlZFN0YXRlO1xyXG5cclxuICAgICAgICBpZiAoZGlzYWJsZWRCcmVha3BvaW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWRNZWRpYVF1ZXJ5TGlzdCA9IG1lZGlhUXVlcnlMaXN0RmFjdG9yeShkaXNhYmxlZEJyZWFrcG9pbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWRNZWRpYVF1ZXJ5TGlzdCkge1xyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkID0gdGhpcy5kaXNhYmxlZE1lZGlhUXVlcnlMaXN0Lm1hdGNoZXM7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQXV0by1iaW5kXHJcbiAgICAgICAgdGhpcy5vbkNsaWNrZWQgPSB0aGlzLm9uQ2xpY2tlZC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub25EaXNhYmxlZE1lZGlhUXVlcnlMaXN0TWF0Y2ggPSB0aGlzLm9uRGlzYWJsZWRNZWRpYVF1ZXJ5TGlzdE1hdGNoLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIC8vIEFzc2lnbiBET00gYXR0cmlidXRlc1xyXG4gICAgICAgIHRoaXMuJHRhcmdldC5hdHRyKCdhcmlhLWhpZGRlbicsIHRoaXMuaXNDb2xsYXBzZWQpO1xyXG4gICAgICAgIHRoaXMuJHRvZ2dsZVxyXG4gICAgICAgICAgICAuYXR0cignYXJpYS1sYWJlbCcsIHRoaXMuX2dldFRvZ2dsZUFyaWFMYWJlbFRleHQoJHRvZ2dsZSkpXHJcbiAgICAgICAgICAgIC5hdHRyKCdhcmlhLWNvbnRyb2xzJywgJHRhcmdldC5hdHRyKCdpZCcpKVxyXG4gICAgICAgICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsIHRoaXMuaXNPcGVuKTtcclxuXHJcbiAgICAgICAgLy8gTGlzdGVuXHJcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzQ29sbGFwc2VkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLiR0YXJnZXQuaXMoJzpoaWRkZW4nKSAmJiAhdGhpcy4kdGFyZ2V0Lmhhc0NsYXNzKHRoaXMub3BlbkNsYXNzTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzT3BlbigpIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMuaXNDb2xsYXBzZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGRpc2FibGVkKGRpc2FibGVkKSB7XHJcbiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBkaXNhYmxlZDtcclxuXHJcbiAgICAgICAgaWYgKGRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQnlTdGF0ZSh0aGlzLmRpc2FibGVkU3RhdGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQnlTdGF0ZSh0aGlzLmVuYWJsZWRTdGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBkaXNhYmxlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgX2dldFRvZ2dsZUFyaWFMYWJlbFRleHQoJHRvZ2dsZSkge1xyXG4gICAgICAgIGNvbnN0ICR0ZXh0VG9nZ2xlQ2hpbGRyZW4gPSAkdG9nZ2xlLmNoaWxkcmVuKCkuZmlsdGVyKChfXywgY2hpbGQpID0+ICQoY2hpbGQpLnRleHQoKS50cmltKCkpO1xyXG4gICAgICAgIGNvbnN0ICRhcmlhTGFiZWxUYXJnZXQgPSAkdGV4dFRvZ2dsZUNoaWxkcmVuLmxlbmd0aCA/ICR0ZXh0VG9nZ2xlQ2hpbGRyZW4uZmlyc3QoKSA6ICR0b2dnbGU7XHJcblxyXG4gICAgICAgIHJldHVybiAkKCRhcmlhTGFiZWxUYXJnZXQpLnRleHQoKS50cmltKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb3Blbih7IG5vdGlmeSA9IHRydWUgfSA9IHt9KSB7XHJcbiAgICAgICAgdGhpcy4kdG9nZ2xlXHJcbiAgICAgICAgICAgIC5hZGRDbGFzcyh0aGlzLm9wZW5DbGFzc05hbWUpXHJcbiAgICAgICAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuJHRhcmdldFxyXG4gICAgICAgICAgICAuYWRkQ2xhc3ModGhpcy5vcGVuQ2xhc3NOYW1lKVxyXG4gICAgICAgICAgICAuYXR0cignYXJpYS1oaWRkZW4nLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIGlmIChub3RpZnkpIHtcclxuICAgICAgICAgICAgdGhpcy4kdG9nZ2xlLnRyaWdnZXIoQ29sbGFwc2libGVFdmVudHMub3BlbiwgW3RoaXNdKTtcclxuICAgICAgICAgICAgdGhpcy4kdG9nZ2xlLnRyaWdnZXIoQ29sbGFwc2libGVFdmVudHMudG9nZ2xlLCBbdGhpc10pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjbG9zZSh7IG5vdGlmeSA9IHRydWUgfSA9IHt9KSB7XHJcbiAgICAgICAgdGhpcy4kdG9nZ2xlXHJcbiAgICAgICAgICAgIC5yZW1vdmVDbGFzcyh0aGlzLm9wZW5DbGFzc05hbWUpXHJcbiAgICAgICAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpO1xyXG5cclxuICAgICAgICB0aGlzLiR0YXJnZXRcclxuICAgICAgICAgICAgLnJlbW92ZUNsYXNzKHRoaXMub3BlbkNsYXNzTmFtZSlcclxuICAgICAgICAgICAgLmF0dHIoJ2FyaWEtaGlkZGVuJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGlmIChub3RpZnkpIHtcclxuICAgICAgICAgICAgdGhpcy4kdG9nZ2xlLnRyaWdnZXIoQ29sbGFwc2libGVFdmVudHMuY2xvc2UsIFt0aGlzXSk7XHJcbiAgICAgICAgICAgIHRoaXMuJHRvZ2dsZS50cmlnZ2VyKENvbGxhcHNpYmxlRXZlbnRzLnRvZ2dsZSwgW3RoaXNdKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdG9nZ2xlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdG9nZ2xlQnlTdGF0ZShzdGF0ZSwgLi4uYXJncykge1xyXG4gICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcclxuICAgICAgICBjYXNlIENvbGxhcHNpYmxlU3RhdGUub3BlbjpcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3Blbi5hcHBseSh0aGlzLCBhcmdzKTtcclxuXHJcbiAgICAgICAgY2FzZSBDb2xsYXBzaWJsZVN0YXRlLmNsb3NlZDpcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvc2UuYXBwbHkodGhpcywgYXJncyk7XHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhc0NvbGxhcHNpYmxlKGNvbGxhcHNpYmxlSW5zdGFuY2UpIHtcclxuICAgICAgICByZXR1cm4gJC5jb250YWlucyh0aGlzLiR0YXJnZXQuZ2V0KDApLCBjb2xsYXBzaWJsZUluc3RhbmNlLiR0YXJnZXQuZ2V0KDApKTtcclxuICAgIH1cclxuXHJcbiAgICBiaW5kRXZlbnRzKCkge1xyXG4gICAgICAgIHRoaXMuJHRvZ2dsZS5vbihDb2xsYXBzaWJsZUV2ZW50cy5jbGljaywgdGhpcy5vbkNsaWNrZWQpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZE1lZGlhUXVlcnlMaXN0ICYmIHRoaXMuZGlzYWJsZWRNZWRpYVF1ZXJ5TGlzdC5hZGRMaXN0ZW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkTWVkaWFRdWVyeUxpc3QuYWRkTGlzdGVuZXIodGhpcy5vbkRpc2FibGVkTWVkaWFRdWVyeUxpc3RNYXRjaCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVuYmluZEV2ZW50cygpIHtcclxuICAgICAgICB0aGlzLiR0b2dnbGUub2ZmKENvbGxhcHNpYmxlRXZlbnRzLmNsaWNrLCB0aGlzLm9uQ2xpY2tlZCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkTWVkaWFRdWVyeUxpc3QgJiYgdGhpcy5kaXNhYmxlZE1lZGlhUXVlcnlMaXN0LnJlbW92ZUxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWRNZWRpYVF1ZXJ5TGlzdC5yZW1vdmVMaXN0ZW5lcih0aGlzLm9uRGlzYWJsZWRNZWRpYVF1ZXJ5TGlzdE1hdGNoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGlja2VkKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgdGhpcy50b2dnbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkRpc2FibGVkTWVkaWFRdWVyeUxpc3RNYXRjaChtZWRpYSkge1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBtZWRpYS5tYXRjaGVzO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgQ29sbGFwc2libGUgaW5zdGFuY2VcclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl1cclxuICogQHBhcmFtIHtPYmplY3R9IFtvdmVycmlkZU9wdGlvbnNdXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3ZlcnJpZGVPcHRpb25zLiRjb250ZXh0XVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gW292ZXJyaWRlT3B0aW9ucy5kaXNhYmxlZEJyZWFrcG9pbnRdXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3ZlcnJpZGVPcHRpb25zLmRpc2FibGVkU3RhdGVdXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3ZlcnJpZGVPcHRpb25zLmVuYWJsZWRTdGF0ZV1cclxuICogQHBhcmFtIHtTdHJpbmd9IFtvdmVycmlkZU9wdGlvbnMub3BlbkNsYXNzTmFtZV1cclxuICogQHJldHVybiB7QXJyYXl9IGFycmF5IG9mIENvbGxhcHNpYmxlIGluc3RhbmNlc1xyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiA8YSBocmVmPVwiI2NvbnRlbnRcIiBkYXRhLWNvbGxhcHNpYmxlPkNvbGxhcHNlPC9hPlxyXG4gKiA8ZGl2IGlkPVwiY29udGVudFwiPi4uLjwvZGl2PlxyXG4gKlxyXG4gKiBjb2xsYXBzaWJsZUZhY3RvcnkoKTtcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbGxhcHNpYmxlRmFjdG9yeShzZWxlY3RvciA9IGBbZGF0YS0ke1BMVUdJTl9LRVl9XWAsIG92ZXJyaWRlT3B0aW9ucyA9IHt9KSB7XHJcbiAgICBjb25zdCAkY29sbGFwc2libGVzID0gJChzZWxlY3Rvciwgb3ZlcnJpZGVPcHRpb25zLiRjb250ZXh0KTtcclxuXHJcbiAgICByZXR1cm4gJGNvbGxhcHNpYmxlcy5tYXAoKGluZGV4LCBlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgY29uc3QgJHRvZ2dsZSA9ICQoZWxlbWVudCk7XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2VLZXkgPSBgJHtQTFVHSU5fS0VZfUluc3RhbmNlYDtcclxuICAgICAgICBjb25zdCBjYWNoZWRDb2xsYXBzaWJsZSA9ICR0b2dnbGUuZGF0YShpbnN0YW5jZUtleSk7XHJcblxyXG4gICAgICAgIGlmIChjYWNoZWRDb2xsYXBzaWJsZSBpbnN0YW5jZW9mIENvbGxhcHNpYmxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDb2xsYXBzaWJsZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHRhcmdldElkID0gcHJlcGVuZEhhc2goJHRvZ2dsZS5kYXRhKFBMVUdJTl9LRVkpIHx8XHJcbiAgICAgICAgICAgICR0b2dnbGUuZGF0YShgJHtQTFVHSU5fS0VZfVRhcmdldGApIHx8XHJcbiAgICAgICAgICAgICR0b2dnbGUuYXR0cignaHJlZicpKTtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gXy5leHRlbmQob3B0aW9uc0Zyb21EYXRhKCR0b2dnbGUpLCBvdmVycmlkZU9wdGlvbnMpO1xyXG4gICAgICAgIGNvbnN0IGNvbGxhcHNpYmxlID0gbmV3IENvbGxhcHNpYmxlKCR0b2dnbGUsICQodGFyZ2V0SWQsIG92ZXJyaWRlT3B0aW9ucy4kY29udGV4dCksIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICAkdG9nZ2xlLmRhdGEoaW5zdGFuY2VLZXksIGNvbGxhcHNpYmxlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbGxhcHNpYmxlO1xyXG4gICAgfSkudG9BcnJheSgpO1xyXG59XHJcbiIsIi8qXHJcbiAqIFJlbWVtYmVyIHRvIHVwZGF0ZSAvYXNzZXRzL3Njc3Mvc2V0dGluZ3MvZ2xvYmFsL3NjcmVlbnNpemVzL3NjcmVlbnNpemVzLnNjc3NcclxuICogaWYgeW91IGRlY2lkZSB0byBjaGFuZ2UgYnJlYWtwb2ludCB2YWx1ZXNcclxuICovXHJcbmNvbnN0IGJyZWFrcG9pbnRTaXplcyA9IHtcclxuICAgIGxhcmdlOiAxMjYxLFxyXG4gICAgbWVkaXVtOiA4MDEsXHJcbiAgICBzbWFsbDogNTUxLFxyXG59O1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBNZWRpYVF1ZXJ5TGlzdCB1c2luZyBicmVha3BvaW50IG5hbWVcclxuICogQHBhcmFtIHtzdHJpbmd9IGJyZWFrcG9pbnROYW1lXHJcbiAqIEByZXR1cm4ge01lZGlhUXVlcnlMaXN0fG51bGx9XHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZWRpYVF1ZXJ5TGlzdEZhY3RvcnkoYnJlYWtwb2ludE5hbWUpIHtcclxuICAgIGlmICghYnJlYWtwb2ludE5hbWUgfHwgIXdpbmRvdy5tYXRjaE1lZGlhKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYnJlYWtwb2ludCA9IGJyZWFrcG9pbnRTaXplc1ticmVha3BvaW50TmFtZV07XHJcbiAgICBjb25zdCBtZWRpYVF1ZXJ5ID0gYChtaW4td2lkdGg6ICR7YnJlYWtwb2ludH1weClgO1xyXG4gICAgY29uc3QgbWVkaWFRdWVyeUxpc3QgPSB3aW5kb3cubWF0Y2hNZWRpYShtZWRpYVF1ZXJ5KTtcclxuXHJcbiAgICByZXR1cm4gbWVkaWFRdWVyeUxpc3Q7XHJcbn1cclxuIiwiY29uc3QgZm9ybXMgPSB7XHJcbiAgICBlbWFpbCh2YWx1ZSkge1xyXG4gICAgICAgIGNvbnN0IHJlID0gL15cXFMrQFxcUytcXC5cXFMrLztcclxuICAgICAgICByZXR1cm4gcmUudGVzdCh2YWx1ZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhdGVzIGEgcGFzc3dvcmQgZmllbGRcclxuICAgICAqIEBwYXJhbSB2YWx1ZVxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIHBhc3N3b3JkKHZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubm90RW1wdHkodmFsdWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIHZhbGlkYXRlcyBpZiBhIGZpZWxkIGlzIGVtcHR5XHJcbiAgICAgKiBAcGFyYW0gdmFsdWVcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgbm90RW1wdHkodmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWUubGVuZ3RoID4gMDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB2YWxpZGF0ZXMgYSBmaWVsZCBsaWtlIHByb2R1Y3QgcXVhbnRpdHlcclxuICAgICAqIEBwYXJhbSB2YWx1ZVxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKlxyXG4gICAgICovXHJcbiAgICBudW1iZXJzT25seSh2YWx1ZSkge1xyXG4gICAgICAgIGNvbnN0IHJlID0gL15cXGQrJC87XHJcbiAgICAgICAgcmV0dXJuIHJlLnRlc3QodmFsdWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIHZhbGlkYXRlcyBpbmNyZWFzZSBpbiB2YWx1ZSBkb2VzIG5vdCBleGNlZWQgbWF4XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAgICAgKlxyXG4gICAgICovXHJcbiAgICB2YWxpZGF0ZUluY3JlYXNlQWdhaW5zdE1heEJvdW5kYXJ5KHZhbHVlLCBtYXgpIHtcclxuICAgICAgICBjb25zdCByYWlzZSA9IHZhbHVlICsgMTtcclxuXHJcbiAgICAgICAgaWYgKCFtYXggfHwgcmFpc2UgPD0gbWF4KSByZXR1cm4gcmFpc2U7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIHZhbGlkYXRlcyBkZWNyZWFzZSBpbiB2YWx1ZSBkb2VzIG5vdCBmYWxsIGJlbG93IG1pblxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWluXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgdmFsaWRhdGVEZWNyZWFzZUFnYWluc3RNaW5Cb3VuZGFyeSh2YWx1ZSwgbWluKSB7XHJcbiAgICAgICAgY29uc3QgZGVjbGluZSA9IHZhbHVlIC0gMTtcclxuXHJcbiAgICAgICAgaWYgKCFtaW4gfHwgZGVjbGluZSA+PSBtaW4pIHJldHVybiBkZWNsaW5lO1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0sXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmb3JtcztcclxuIiwiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcclxuXHJcbmZ1bmN0aW9uIG1pbk1heFZhbGlkYXRlKG1pbklucHV0U2VsZWN0b3IsIG1heElucHV0U2VsZWN0b3IpIHtcclxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKGNiKSB7XHJcbiAgICAgICAgY29uc3QgbWluVmFsdWUgPSBwYXJzZUZsb2F0KCQobWluSW5wdXRTZWxlY3RvcikudmFsKCkpO1xyXG4gICAgICAgIGNvbnN0IG1heFZhbHVlID0gcGFyc2VGbG9hdCgkKG1heElucHV0U2VsZWN0b3IpLnZhbCgpKTtcclxuXHJcbiAgICAgICAgaWYgKG1heFZhbHVlID4gbWluVmFsdWUgfHwgXy5pc05hTihtYXhWYWx1ZSkgfHwgXy5pc05hTihtaW5WYWx1ZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNiKHRydWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNiKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdmFsaWRhdGU7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG1pbk1heFZhbGlkYXRlO1xyXG4iLCJpbXBvcnQgbm9kIGZyb20gJ25vZC12YWxpZGF0ZSc7XHJcbmltcG9ydCBtaW5NYXhWYWxpZGF0ZSBmcm9tICcuL25vZC1mdW5jdGlvbnMvbWluLW1heC12YWxpZGF0ZSc7XHJcblxyXG4vLyBIb29rIG91ciBTQ1NTIGZyYW1ld29yayBmb3JtIGZpZWxkIHN0YXR1cyBjbGFzc2VzIGludG8gdGhlIG5vZCB2YWxpZGF0aW9uIHN5c3RlbSBiZWZvcmUgdXNlXHJcbm5vZC5jbGFzc2VzLmVycm9yQ2xhc3MgPSAnZm9ybS1maWVsZC0tZXJyb3InO1xyXG5ub2QuY2xhc3Nlcy5zdWNjZXNzQ2xhc3MgPSAnZm9ybS1maWVsZC0tc3VjY2Vzcyc7XHJcbm5vZC5jbGFzc2VzLmVycm9yTWVzc2FnZUNsYXNzID0gJ2Zvcm0taW5saW5lTWVzc2FnZSc7XHJcblxyXG4vLyBSZWdpc3RlciB2YWxpZGF0ZSBmdW5jdGlvbnNcclxubm9kLmNoZWNrRnVuY3Rpb25zWydtaW4tbWF4J10gPSBtaW5NYXhWYWxpZGF0ZTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5vZDtcclxuIiwiaW1wb3J0IFdpc2hsaXN0IGZyb20gJy4uL3dpc2hsaXN0JztcclxuaW1wb3J0IHsgaW5pdFJhZGlvT3B0aW9ucyB9IGZyb20gJy4vYXJpYSc7XHJcbmltcG9ydCB7IGlzT2JqZWN0LCBpc051bWJlciB9IGZyb20gJ2xvZGFzaCc7XHJcblxyXG5jb25zdCBvcHRpb25zVHlwZXNNYXAgPSB7XHJcbiAgICBJTlBVVF9GSUxFOiAnaW5wdXQtZmlsZScsXHJcbiAgICBJTlBVVF9URVhUOiAnaW5wdXQtdGV4dCcsXHJcbiAgICBJTlBVVF9OVU1CRVI6ICdpbnB1dC1udW1iZXInLFxyXG4gICAgSU5QVVRfQ0hFQ0tCT1g6ICdpbnB1dC1jaGVja2JveCcsXHJcbiAgICBURVhUQVJFQTogJ3RleHRhcmVhJyxcclxuICAgIERBVEU6ICdkYXRlJyxcclxuICAgIFNFVF9TRUxFQ1Q6ICdzZXQtc2VsZWN0JyxcclxuICAgIFNFVF9SRUNUQU5HTEU6ICdzZXQtcmVjdGFuZ2xlJyxcclxuICAgIFNFVF9SQURJTzogJ3NldC1yYWRpbycsXHJcbiAgICBTV0FUQ0g6ICdzd2F0Y2gnLFxyXG4gICAgUFJPRFVDVF9MSVNUOiAncHJvZHVjdC1saXN0JyxcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25DaGFuZ2VEZWNvcmF0b3IoYXJlRGVmYXVsdE90aW9uc1NldCkge1xyXG4gICAgcmV0dXJuIChlcnIsIHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYXR0cmlidXRlc0RhdGEgPSByZXNwb25zZS5kYXRhIHx8IHt9O1xyXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXNDb250ZW50ID0gcmVzcG9uc2UuY29udGVudCB8fCB7fTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVQcm9kdWN0QXR0cmlidXRlcyhhdHRyaWJ1dGVzRGF0YSk7XHJcbiAgICAgICAgaWYgKGFyZURlZmF1bHRPdGlvbnNTZXQpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVWaWV3KGF0dHJpYnV0ZXNEYXRhLCBhdHRyaWJ1dGVzQ29udGVudCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVEZWZhdWx0QXR0cmlidXRlc0Zvck9PUyhhdHRyaWJ1dGVzRGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvZHVjdERldGFpbHNCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKCRzY29wZSwgY29udGV4dCkge1xyXG4gICAgICAgIHRoaXMuJHNjb3BlID0gJHNjb3BlO1xyXG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgICAgICAgdGhpcy5pbml0UmFkaW9BdHRyaWJ1dGVzKCk7XHJcbiAgICAgICAgV2lzaGxpc3QubG9hZCh0aGlzLmNvbnRleHQpO1xyXG4gICAgICAgIHRoaXMuZ2V0VGFiUmVxdWVzdHMoKTtcclxuXHJcbiAgICAgICAgJCgnW2RhdGEtcHJvZHVjdC1hdHRyaWJ1dGVdJykuZWFjaCgoX18sIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB2YWx1ZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcHJvZHVjdC1hdHRyaWJ1dGUnKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX21ha2VQcm9kdWN0VmFyaWFudEFjY2Vzc2libGUodmFsdWUsIHR5cGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9tYWtlUHJvZHVjdFZhcmlhbnRBY2Nlc3NpYmxlKHZhcmlhbnREb21Ob2RlLCB2YXJpYW50VHlwZSkge1xyXG4gICAgICAgIHN3aXRjaCAodmFyaWFudFR5cGUpIHtcclxuICAgICAgICBjYXNlIG9wdGlvbnNUeXBlc01hcC5TRVRfUkFESU86XHJcbiAgICAgICAgY2FzZSBvcHRpb25zVHlwZXNNYXAuU1dBVENIOiB7XHJcbiAgICAgICAgICAgIGluaXRSYWRpb09wdGlvbnMoJCh2YXJpYW50RG9tTm9kZSksICdbdHlwZT1yYWRpb10nKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkZWZhdWx0OiBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbGxvdyByYWRpbyBidXR0b25zIHRvIGdldCBkZXNlbGVjdGVkXHJcbiAgICAgKi9cclxuICAgIGluaXRSYWRpb0F0dHJpYnV0ZXMoKSB7XHJcbiAgICAgICAgJCgnW2RhdGEtcHJvZHVjdC1hdHRyaWJ1dGVdIGlucHV0W3R5cGU9XCJyYWRpb1wiXScsIHRoaXMuJHNjb3BlKS5lYWNoKChpLCByYWRpbykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCAkcmFkaW8gPSAkKHJhZGlvKTtcclxuXHJcbiAgICAgICAgICAgIC8vIE9ubHkgYmluZCB0byBjbGljayBvbmNlXHJcbiAgICAgICAgICAgIGlmICgkcmFkaW8uYXR0cignZGF0YS1zdGF0ZScpICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICRyYWRpby5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCRyYWRpby5kYXRhKCdzdGF0ZScpID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICRyYWRpby5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkcmFkaW8uZGF0YSgnc3RhdGUnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAkcmFkaW8udHJpZ2dlcignY2hhbmdlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJHJhZGlvLmRhdGEoJ3N0YXRlJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRSYWRpb0F0dHJpYnV0ZXMoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAkcmFkaW8uYXR0cignZGF0YS1zdGF0ZScsICRyYWRpby5wcm9wKCdjaGVja2VkJykpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGlkZSBvciBtYXJrIGFzIHVuYXZhaWxhYmxlIG91dCBvZiBzdG9jayBhdHRyaWJ1dGVzIGlmIGVuYWJsZWRcclxuICAgICAqIEBwYXJhbSAge09iamVjdH0gZGF0YSBQcm9kdWN0IGF0dHJpYnV0ZSBkYXRhXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVByb2R1Y3RBdHRyaWJ1dGVzKGRhdGEpIHtcclxuICAgICAgICBjb25zdCBiZWhhdmlvciA9IGRhdGEub3V0X29mX3N0b2NrX2JlaGF2aW9yO1xyXG4gICAgICAgIGNvbnN0IGluU3RvY2tJZHMgPSBkYXRhLmluX3N0b2NrX2F0dHJpYnV0ZXM7XHJcbiAgICAgICAgY29uc3Qgb3V0T2ZTdG9ja01lc3NhZ2UgPSBgICgke2RhdGEub3V0X29mX3N0b2NrX21lc3NhZ2V9KWA7XHJcblxyXG4gICAgICAgIGlmIChiZWhhdmlvciAhPT0gJ2hpZGVfb3B0aW9uJyAmJiBiZWhhdmlvciAhPT0gJ2xhYmVsX29wdGlvbicpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJCgnW2RhdGEtcHJvZHVjdC1hdHRyaWJ1dGUtdmFsdWVdJywgdGhpcy4kc2NvcGUpLmVhY2goKGksIGF0dHJpYnV0ZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCAkYXR0cmlidXRlID0gJChhdHRyaWJ1dGUpO1xyXG4gICAgICAgICAgICBjb25zdCBhdHRySWQgPSBwYXJzZUludCgkYXR0cmlidXRlLmRhdGEoJ3Byb2R1Y3RBdHRyaWJ1dGVWYWx1ZScpLCAxMCk7XHJcblxyXG5cclxuICAgICAgICAgICAgaWYgKGluU3RvY2tJZHMuaW5kZXhPZihhdHRySWQpICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGVBdHRyaWJ1dGUoJGF0dHJpYnV0ZSwgYmVoYXZpb3IsIG91dE9mU3RvY2tNZXNzYWdlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZUF0dHJpYnV0ZSgkYXR0cmlidXRlLCBiZWhhdmlvciwgb3V0T2ZTdG9ja01lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayBmb3IgZnJhZ21lbnQgaWRlbnRpZmllciBpbiBVUkwgcmVxdWVzdGluZyBhIHNwZWNpZmljIHRhYlxyXG4gICAgICovXHJcbiAgICBnZXRUYWJSZXF1ZXN0cygpIHtcclxuICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2ggJiYgd2luZG93LmxvY2F0aW9uLmhhc2guaW5kZXhPZignI3RhYi0nKSA9PT0gMCkge1xyXG4gICAgICAgICAgICBjb25zdCAkYWN0aXZlVGFiID0gJCgnLnRhYnMnKS5oYXMoYFtocmVmPScke3dpbmRvdy5sb2NhdGlvbi5oYXNofSddYCk7XHJcbiAgICAgICAgICAgIGNvbnN0ICR0YWJDb250ZW50ID0gJChgJHt3aW5kb3cubG9jYXRpb24uaGFzaH1gKTtcclxuXHJcbiAgICAgICAgICAgIGlmICgkYWN0aXZlVGFiLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICRhY3RpdmVUYWIuZmluZCgnLnRhYicpXHJcbiAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCdpcy1hY3RpdmUnKVxyXG4gICAgICAgICAgICAgICAgICAgIC5oYXMoYFtocmVmPScke3dpbmRvdy5sb2NhdGlvbi5oYXNofSddYClcclxuICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2lzLWFjdGl2ZScpO1xyXG5cclxuICAgICAgICAgICAgICAgICR0YWJDb250ZW50LmFkZENsYXNzKCdpcy1hY3RpdmUnKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zaWJsaW5ncygpXHJcbiAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCdpcy1hY3RpdmUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNpbmNlICRwcm9kdWN0VmlldyBjYW4gYmUgZHluYW1pY2FsbHkgaW5zZXJ0ZWQgdXNpbmcgcmVuZGVyX3dpdGgsXHJcbiAgICAgKiBXZSBoYXZlIHRvIHJldHJpZXZlIHRoZSByZXNwZWN0aXZlIGVsZW1lbnRzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtICRzY29wZVxyXG4gICAgICovXHJcbiAgICBnZXRWaWV3TW9kZWwoJHNjb3BlKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgJHByaWNlV2l0aFRheDogJCgnW2RhdGEtcHJvZHVjdC1wcmljZS13aXRoLXRheF0nLCAkc2NvcGUpLFxyXG4gICAgICAgICAgICAkcHJpY2VXaXRob3V0VGF4OiAkKCdbZGF0YS1wcm9kdWN0LXByaWNlLXdpdGhvdXQtdGF4XScsICRzY29wZSksXHJcbiAgICAgICAgICAgIHJycFdpdGhUYXg6IHtcclxuICAgICAgICAgICAgICAgICRkaXY6ICQoJy5ycnAtcHJpY2UtLXdpdGhUYXgnLCAkc2NvcGUpLFxyXG4gICAgICAgICAgICAgICAgJHNwYW46ICQoJ1tkYXRhLXByb2R1Y3QtcnJwLXdpdGgtdGF4XScsICRzY29wZSksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHJycFdpdGhvdXRUYXg6IHtcclxuICAgICAgICAgICAgICAgICRkaXY6ICQoJy5ycnAtcHJpY2UtLXdpdGhvdXRUYXgnLCAkc2NvcGUpLFxyXG4gICAgICAgICAgICAgICAgJHNwYW46ICQoJ1tkYXRhLXByb2R1Y3QtcnJwLXByaWNlLXdpdGhvdXQtdGF4XScsICRzY29wZSksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG5vblNhbGVXaXRoVGF4OiB7XHJcbiAgICAgICAgICAgICAgICAkZGl2OiAkKCcubm9uLXNhbGUtcHJpY2UtLXdpdGhUYXgnLCAkc2NvcGUpLFxyXG4gICAgICAgICAgICAgICAgJHNwYW46ICQoJ1tkYXRhLXByb2R1Y3Qtbm9uLXNhbGUtcHJpY2Utd2l0aC10YXhdJywgJHNjb3BlKSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbm9uU2FsZVdpdGhvdXRUYXg6IHtcclxuICAgICAgICAgICAgICAgICRkaXY6ICQoJy5ub24tc2FsZS1wcmljZS0td2l0aG91dFRheCcsICRzY29wZSksXHJcbiAgICAgICAgICAgICAgICAkc3BhbjogJCgnW2RhdGEtcHJvZHVjdC1ub24tc2FsZS1wcmljZS13aXRob3V0LXRheF0nLCAkc2NvcGUpLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwcmljZVNhdmVkOiB7XHJcbiAgICAgICAgICAgICAgICAkZGl2OiAkKCcucHJpY2Utc2VjdGlvbi0tc2F2aW5nJywgJHNjb3BlKSxcclxuICAgICAgICAgICAgICAgICRzcGFuOiAkKCdbZGF0YS1wcm9kdWN0LXByaWNlLXNhdmVkXScsICRzY29wZSksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHByaWNlTm93TGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICRzcGFuOiAkKCcucHJpY2Utbm93LWxhYmVsJywgJHNjb3BlKSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcHJpY2VMYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgJHNwYW46ICQoJy5wcmljZS1sYWJlbCcsICRzY29wZSksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICR3ZWlnaHQ6ICQoJy5wcm9kdWN0Vmlldy1pbmZvIFtkYXRhLXByb2R1Y3Qtd2VpZ2h0XScsICRzY29wZSksXHJcbiAgICAgICAgICAgICRpbmNyZW1lbnRzOiAkKCcuZm9ybS1maWVsZC0taW5jcmVtZW50cyA6aW5wdXQnLCAkc2NvcGUpLFxyXG4gICAgICAgICAgICAkYWRkVG9DYXJ0OiAkKCcjZm9ybS1hY3Rpb24tYWRkVG9DYXJ0JywgJHNjb3BlKSxcclxuICAgICAgICAgICAgJHdpc2hsaXN0VmFyaWF0aW9uOiAkKCdbZGF0YS13aXNobGlzdC1hZGRdIFtuYW1lPVwidmFyaWF0aW9uX2lkXCJdJywgJHNjb3BlKSxcclxuICAgICAgICAgICAgc3RvY2s6IHtcclxuICAgICAgICAgICAgICAgICRjb250YWluZXI6ICQoJy5mb3JtLWZpZWxkLS1zdG9jaycsICRzY29wZSksXHJcbiAgICAgICAgICAgICAgICAkaW5wdXQ6ICQoJ1tkYXRhLXByb2R1Y3Qtc3RvY2tdJywgJHNjb3BlKSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2t1OiB7XHJcbiAgICAgICAgICAgICAgICAkbGFiZWw6ICQoJ2R0LnNrdS1sYWJlbCcsICRzY29wZSksXHJcbiAgICAgICAgICAgICAgICAkdmFsdWU6ICQoJ1tkYXRhLXByb2R1Y3Qtc2t1XScsICRzY29wZSksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHVwYzoge1xyXG4gICAgICAgICAgICAgICAgJGxhYmVsOiAkKCdkdC51cGMtbGFiZWwnLCAkc2NvcGUpLFxyXG4gICAgICAgICAgICAgICAgJHZhbHVlOiAkKCdbZGF0YS1wcm9kdWN0LXVwY10nLCAkc2NvcGUpLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBxdWFudGl0eToge1xyXG4gICAgICAgICAgICAgICAgJHRleHQ6ICQoJy5pbmNyZW1lbnRUb3RhbCcsICRzY29wZSksXHJcbiAgICAgICAgICAgICAgICAkaW5wdXQ6ICQoJ1tuYW1lPXF0eVxcXFxbXFxcXF1dJywgJHNjb3BlKSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgJGJ1bGtQcmljaW5nOiAkKCcucHJvZHVjdFZpZXctaW5mby1idWxrUHJpY2luZycsICRzY29wZSksXHJcbiAgICAgICAgICAgICR3YWxsZXRCdXR0b25zOiAkKCdbZGF0YS1hZGQtdG8tY2FydC13YWxsZXQtYnV0dG9uc10nLCAkc2NvcGUpLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIaWRlIHRoZSBwcmljaW5nIGVsZW1lbnRzIHRoYXQgd2lsbCBzaG93IHVwIG9ubHkgd2hlbiB0aGUgcHJpY2UgZXhpc3RzIGluIEFQSVxyXG4gICAgICogQHBhcmFtIHZpZXdNb2RlbFxyXG4gICAgICovXHJcbiAgICBjbGVhclByaWNpbmdOb3RGb3VuZCh2aWV3TW9kZWwpIHtcclxuICAgICAgICB2aWV3TW9kZWwucnJwV2l0aFRheC4kZGl2LmhpZGUoKTtcclxuICAgICAgICB2aWV3TW9kZWwucnJwV2l0aG91dFRheC4kZGl2LmhpZGUoKTtcclxuICAgICAgICB2aWV3TW9kZWwubm9uU2FsZVdpdGhUYXguJGRpdi5oaWRlKCk7XHJcbiAgICAgICAgdmlld01vZGVsLm5vblNhbGVXaXRob3V0VGF4LiRkaXYuaGlkZSgpO1xyXG4gICAgICAgIHZpZXdNb2RlbC5wcmljZVNhdmVkLiRkaXYuaGlkZSgpO1xyXG4gICAgICAgIHZpZXdNb2RlbC5wcmljZU5vd0xhYmVsLiRzcGFuLmhpZGUoKTtcclxuICAgICAgICB2aWV3TW9kZWwucHJpY2VMYWJlbC4kc3Bhbi5oaWRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgdGhlIHZpZXcgb2YgcHJpY2UsIG1lc3NhZ2VzLCBTS1UgYW5kIHN0b2NrIG9wdGlvbnMgd2hlbiBhIHByb2R1Y3Qgb3B0aW9uIGNoYW5nZXNcclxuICAgICAqIEBwYXJhbSAge09iamVjdH0gZGF0YSBQcm9kdWN0IGF0dHJpYnV0ZSBkYXRhXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVZpZXcoZGF0YSwgY29udGVudCA9IG51bGwpIHtcclxuICAgICAgICBjb25zdCB2aWV3TW9kZWwgPSB0aGlzLmdldFZpZXdNb2RlbCh0aGlzLiRzY29wZSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2hvd01lc3NhZ2VCb3goZGF0YS5zdG9ja19tZXNzYWdlIHx8IGRhdGEucHVyY2hhc2luZ19tZXNzYWdlKTtcclxuXHJcbiAgICAgICAgaWYgKGlzT2JqZWN0KGRhdGEucHJpY2UpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUHJpY2VWaWV3KHZpZXdNb2RlbCwgZGF0YS5wcmljZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaXNPYmplY3QoZGF0YS53ZWlnaHQpKSB7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC4kd2VpZ2h0Lmh0bWwoZGF0YS53ZWlnaHQuZm9ybWF0dGVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNldCB2YXJpYXRpb25faWQgaWYgaXQgZXhpc3RzIGZvciBhZGRpbmcgdG8gd2lzaGxpc3RcclxuICAgICAgICBpZiAoZGF0YS52YXJpYW50SWQpIHtcclxuICAgICAgICAgICAgdmlld01vZGVsLiR3aXNobGlzdFZhcmlhdGlvbi52YWwoZGF0YS52YXJpYW50SWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgU0tVIGlzIGF2YWlsYWJsZVxyXG4gICAgICAgIGlmIChkYXRhLnNrdSkge1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwuc2t1LiR2YWx1ZS50ZXh0KGRhdGEuc2t1KTtcclxuICAgICAgICAgICAgdmlld01vZGVsLnNrdS4kbGFiZWwuc2hvdygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC5za3UuJGxhYmVsLmhpZGUoKTtcclxuICAgICAgICAgICAgdmlld01vZGVsLnNrdS4kdmFsdWUudGV4dCgnJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiBVUEMgaXMgYXZhaWxhYmxlXHJcbiAgICAgICAgaWYgKGRhdGEudXBjKSB7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC51cGMuJHZhbHVlLnRleHQoZGF0YS51cGMpO1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwudXBjLiRsYWJlbC5zaG93KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmlld01vZGVsLnVwYy4kbGFiZWwuaGlkZSgpO1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwudXBjLiR2YWx1ZS50ZXh0KCcnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGlmIHN0b2NrIHZpZXcgaXMgb24gKENQIHNldHRpbmdzKVxyXG4gICAgICAgIGlmICh2aWV3TW9kZWwuc3RvY2suJGNvbnRhaW5lci5sZW5ndGggJiYgaXNOdW1iZXIoZGF0YS5zdG9jaykpIHtcclxuICAgICAgICAgICAgLy8gaWYgdGhlIHN0b2NrIGNvbnRhaW5lciBpcyBoaWRkZW4sIHNob3dcclxuICAgICAgICAgICAgdmlld01vZGVsLnN0b2NrLiRjb250YWluZXIucmVtb3ZlQ2xhc3MoJ3UtaGlkZGVuVmlzdWFsbHknKTtcclxuXHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC5zdG9jay4kaW5wdXQudGV4dChkYXRhLnN0b2NrKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwuc3RvY2suJGNvbnRhaW5lci5hZGRDbGFzcygndS1oaWRkZW5WaXN1YWxseScpO1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwuc3RvY2suJGlucHV0LnRleHQoZGF0YS5zdG9jayk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZURlZmF1bHRBdHRyaWJ1dGVzRm9yT09TKGRhdGEpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlV2FsbGV0QnV0dG9uc1ZpZXcoZGF0YSk7XHJcblxyXG4gICAgICAgIC8vIElmIEJ1bGsgUHJpY2luZyByZW5kZXJlZCBIVE1MIGlzIGF2YWlsYWJsZVxyXG4gICAgICAgIGlmIChkYXRhLmJ1bGtfZGlzY291bnRfcmF0ZXMgJiYgY29udGVudCkge1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwuJGJ1bGtQcmljaW5nLmh0bWwoY29udGVudCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgKGRhdGEuYnVsa19kaXNjb3VudF9yYXRlcykgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC4kYnVsa1ByaWNpbmcuaHRtbCgnJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBhZGRUb0NhcnRXcmFwcGVyID0gJCgnI2FkZC10by1jYXJ0LXdyYXBwZXInKTtcclxuXHJcbiAgICAgICAgaWYgKGFkZFRvQ2FydFdyYXBwZXIuaXMoJzpoaWRkZW4nKSAmJiBkYXRhLnB1cmNoYXNhYmxlKSB7XHJcbiAgICAgICAgICAgIGFkZFRvQ2FydFdyYXBwZXIuc2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSB0aGUgdmlldyBvZiBwcmljZSwgbWVzc2FnZXMsIFNLVSBhbmQgc3RvY2sgb3B0aW9ucyB3aGVuIGEgcHJvZHVjdCBvcHRpb24gY2hhbmdlc1xyXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBkYXRhIFByb2R1Y3QgYXR0cmlidXRlIGRhdGFcclxuICAgICAqL1xyXG4gICAgdXBkYXRlUHJpY2VWaWV3KHZpZXdNb2RlbCwgcHJpY2UpIHtcclxuICAgICAgICB0aGlzLmNsZWFyUHJpY2luZ05vdEZvdW5kKHZpZXdNb2RlbCk7XHJcblxyXG4gICAgICAgIGlmIChwcmljZS53aXRoX3RheCkge1xyXG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkUHJpY2UgPSBwcmljZS5wcmljZV9yYW5nZSA/XHJcbiAgICAgICAgICAgICAgICBgJHtwcmljZS5wcmljZV9yYW5nZS5taW4ud2l0aF90YXguZm9ybWF0dGVkfSAtICR7cHJpY2UucHJpY2VfcmFuZ2UubWF4LndpdGhfdGF4LmZvcm1hdHRlZH1gXHJcbiAgICAgICAgICAgICAgICA6IHByaWNlLndpdGhfdGF4LmZvcm1hdHRlZDtcclxuICAgICAgICAgICAgdmlld01vZGVsLnByaWNlTGFiZWwuJHNwYW4uc2hvdygpO1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwuJHByaWNlV2l0aFRheC5odG1sKHVwZGF0ZWRQcmljZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJpY2Uud2l0aG91dF90YXgpIHtcclxuICAgICAgICAgICAgY29uc3QgdXBkYXRlZFByaWNlID0gcHJpY2UucHJpY2VfcmFuZ2UgP1xyXG4gICAgICAgICAgICAgICAgYCR7cHJpY2UucHJpY2VfcmFuZ2UubWluLndpdGhvdXRfdGF4LmZvcm1hdHRlZH0gLSAke3ByaWNlLnByaWNlX3JhbmdlLm1heC53aXRob3V0X3RheC5mb3JtYXR0ZWR9YFxyXG4gICAgICAgICAgICAgICAgOiBwcmljZS53aXRob3V0X3RheC5mb3JtYXR0ZWQ7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC5wcmljZUxhYmVsLiRzcGFuLnNob3coKTtcclxuICAgICAgICAgICAgdmlld01vZGVsLiRwcmljZVdpdGhvdXRUYXguaHRtbCh1cGRhdGVkUHJpY2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHByaWNlLnJycF93aXRoX3RheCkge1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwucnJwV2l0aFRheC4kZGl2LnNob3coKTtcclxuICAgICAgICAgICAgdmlld01vZGVsLnJycFdpdGhUYXguJHNwYW4uaHRtbChwcmljZS5ycnBfd2l0aF90YXguZm9ybWF0dGVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwcmljZS5ycnBfd2l0aG91dF90YXgpIHtcclxuICAgICAgICAgICAgdmlld01vZGVsLnJycFdpdGhvdXRUYXguJGRpdi5zaG93KCk7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC5ycnBXaXRob3V0VGF4LiRzcGFuLmh0bWwocHJpY2UucnJwX3dpdGhvdXRfdGF4LmZvcm1hdHRlZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJpY2Uuc2F2ZWQpIHtcclxuICAgICAgICAgICAgdmlld01vZGVsLnByaWNlU2F2ZWQuJGRpdi5zaG93KCk7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC5wcmljZVNhdmVkLiRzcGFuLmh0bWwocHJpY2Uuc2F2ZWQuZm9ybWF0dGVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwcmljZS5ub25fc2FsZV9wcmljZV93aXRoX3RheCkge1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwucHJpY2VMYWJlbC4kc3Bhbi5oaWRlKCk7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC5ub25TYWxlV2l0aFRheC4kZGl2LnNob3coKTtcclxuICAgICAgICAgICAgdmlld01vZGVsLnByaWNlTm93TGFiZWwuJHNwYW4uc2hvdygpO1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwubm9uU2FsZVdpdGhUYXguJHNwYW4uaHRtbChwcmljZS5ub25fc2FsZV9wcmljZV93aXRoX3RheC5mb3JtYXR0ZWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHByaWNlLm5vbl9zYWxlX3ByaWNlX3dpdGhvdXRfdGF4KSB7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC5wcmljZUxhYmVsLiRzcGFuLmhpZGUoKTtcclxuICAgICAgICAgICAgdmlld01vZGVsLm5vblNhbGVXaXRob3V0VGF4LiRkaXYuc2hvdygpO1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwucHJpY2VOb3dMYWJlbC4kc3Bhbi5zaG93KCk7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC5ub25TYWxlV2l0aG91dFRheC4kc3Bhbi5odG1sKHByaWNlLm5vbl9zYWxlX3ByaWNlX3dpdGhvdXRfdGF4LmZvcm1hdHRlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvdyBhbiBtZXNzYWdlIGJveCBpZiBhIG1lc3NhZ2UgaXMgcGFzc2VkXHJcbiAgICAgKiBIaWRlIHRoZSBib3ggaWYgdGhlIG1lc3NhZ2UgaXMgZW1wdHlcclxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gbWVzc2FnZVxyXG4gICAgICovXHJcbiAgICBzaG93TWVzc2FnZUJveChtZXNzYWdlKSB7XHJcbiAgICAgICAgY29uc3QgJG1lc3NhZ2VCb3ggPSAkKCcucHJvZHVjdEF0dHJpYnV0ZXMtbWVzc2FnZScpO1xyXG5cclxuICAgICAgICBpZiAobWVzc2FnZSkge1xyXG4gICAgICAgICAgICAkKCcuYWxlcnRCb3gtbWVzc2FnZScsICRtZXNzYWdlQm94KS50ZXh0KG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAkbWVzc2FnZUJveC5zaG93KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJG1lc3NhZ2VCb3guaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVEZWZhdWx0QXR0cmlidXRlc0Zvck9PUyhkYXRhKSB7XHJcbiAgICAgICAgY29uc3Qgdmlld01vZGVsID0gdGhpcy5nZXRWaWV3TW9kZWwodGhpcy4kc2NvcGUpO1xyXG4gICAgICAgIGlmICghZGF0YS5wdXJjaGFzYWJsZSB8fCAhZGF0YS5pbnN0b2NrKSB7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC4kYWRkVG9DYXJ0LnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC4kaW5jcmVtZW50cy5wcm9wKCdkaXNhYmxlZCcsIHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC4kYWRkVG9DYXJ0LnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpO1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwuJGluY3JlbWVudHMucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVdhbGxldEJ1dHRvbnNWaWV3KGRhdGEpIHtcclxuICAgICAgICB0aGlzLnRvZ2dsZVdhbGxldEJ1dHRvbnNWaXNpYmlsaXR5KGRhdGEucHVyY2hhc2FibGUgJiYgZGF0YS5pbnN0b2NrKTtcclxuICAgIH1cclxuXHJcbiAgICB0b2dnbGVXYWxsZXRCdXR0b25zVmlzaWJpbGl0eShzaG91bGRTaG93KSB7XHJcbiAgICAgICAgY29uc3Qgdmlld01vZGVsID0gdGhpcy5nZXRWaWV3TW9kZWwodGhpcy4kc2NvcGUpO1xyXG5cclxuICAgICAgICBpZiAoc2hvdWxkU2hvdykge1xyXG4gICAgICAgICAgICB2aWV3TW9kZWwuJHdhbGxldEJ1dHRvbnMuc2hvdygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZpZXdNb2RlbC4kd2FsbGV0QnV0dG9ucy5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZUF0dHJpYnV0ZSgkYXR0cmlidXRlLCBiZWhhdmlvciwgb3V0T2ZTdG9ja01lc3NhZ2UpIHtcclxuICAgICAgICBpZiAodGhpcy5nZXRBdHRyaWJ1dGVUeXBlKCRhdHRyaWJ1dGUpID09PSAnc2V0LXNlbGVjdCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5hYmxlU2VsZWN0T3B0aW9uQXR0cmlidXRlKCRhdHRyaWJ1dGUsIGJlaGF2aW9yLCBvdXRPZlN0b2NrTWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYmVoYXZpb3IgPT09ICdoaWRlX29wdGlvbicpIHtcclxuICAgICAgICAgICAgJGF0dHJpYnV0ZS5zaG93KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJGF0dHJpYnV0ZS5yZW1vdmVDbGFzcygndW5hdmFpbGFibGUnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZUF0dHJpYnV0ZSgkYXR0cmlidXRlLCBiZWhhdmlvciwgb3V0T2ZTdG9ja01lc3NhZ2UpIHtcclxuICAgICAgICBpZiAodGhpcy5nZXRBdHRyaWJ1dGVUeXBlKCRhdHRyaWJ1dGUpID09PSAnc2V0LXNlbGVjdCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZVNlbGVjdE9wdGlvbkF0dHJpYnV0ZSgkYXR0cmlidXRlLCBiZWhhdmlvciwgb3V0T2ZTdG9ja01lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGJlaGF2aW9yID09PSAnaGlkZV9vcHRpb24nKSB7XHJcbiAgICAgICAgICAgICRhdHRyaWJ1dGUuaGlkZSgwKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkYXR0cmlidXRlLmFkZENsYXNzKCd1bmF2YWlsYWJsZScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRBdHRyaWJ1dGVUeXBlKCRhdHRyaWJ1dGUpIHtcclxuICAgICAgICBjb25zdCAkcGFyZW50ID0gJGF0dHJpYnV0ZS5jbG9zZXN0KCdbZGF0YS1wcm9kdWN0LWF0dHJpYnV0ZV0nKTtcclxuXHJcbiAgICAgICAgcmV0dXJuICRwYXJlbnQgPyAkcGFyZW50LmRhdGEoJ3Byb2R1Y3RBdHRyaWJ1dGUnKSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZVNlbGVjdE9wdGlvbkF0dHJpYnV0ZSgkYXR0cmlidXRlLCBiZWhhdmlvciwgb3V0T2ZTdG9ja01lc3NhZ2UpIHtcclxuICAgICAgICBjb25zdCAkc2VsZWN0ID0gJGF0dHJpYnV0ZS5wYXJlbnQoKTtcclxuXHJcbiAgICAgICAgaWYgKGJlaGF2aW9yID09PSAnaGlkZV9vcHRpb24nKSB7XHJcbiAgICAgICAgICAgICRhdHRyaWJ1dGUudG9nZ2xlT3B0aW9uKGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBpcyB0aGUgc2VsZWN0ZWQgb3B0aW9uIGluIGEgc2VsZWN0IGRyb3Bkb3duLCBzZWxlY3QgdGhlIGZpcnN0IG9wdGlvbiAoTUVSQy02MzkpXHJcbiAgICAgICAgICAgIGlmICgkc2VsZWN0LnZhbCgpID09PSAkYXR0cmlidXRlLmF0dHIoJ3ZhbHVlJykpIHtcclxuICAgICAgICAgICAgICAgICRzZWxlY3RbMF0uc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkYXR0cmlidXRlLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XHJcbiAgICAgICAgICAgICRhdHRyaWJ1dGUuaHRtbCgkYXR0cmlidXRlLmh0bWwoKS5yZXBsYWNlKG91dE9mU3RvY2tNZXNzYWdlLCAnJykgKyBvdXRPZlN0b2NrTWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZVNlbGVjdE9wdGlvbkF0dHJpYnV0ZSgkYXR0cmlidXRlLCBiZWhhdmlvciwgb3V0T2ZTdG9ja01lc3NhZ2UpIHtcclxuICAgICAgICBpZiAoYmVoYXZpb3IgPT09ICdoaWRlX29wdGlvbicpIHtcclxuICAgICAgICAgICAgJGF0dHJpYnV0ZS50b2dnbGVPcHRpb24odHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJGF0dHJpYnV0ZS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgJGF0dHJpYnV0ZS5odG1sKCRhdHRyaWJ1dGUuaHRtbCgpLnJlcGxhY2Uob3V0T2ZTdG9ja01lc3NhZ2UsICcnKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB1dGlscyBmcm9tICdAYmlnY29tbWVyY2Uvc3RlbmNpbC11dGlscyc7XHJcbmltcG9ydCBQcm9kdWN0RGV0YWlsc0Jhc2UsIHsgb3B0aW9uQ2hhbmdlRGVjb3JhdG9yIH0gZnJvbSAnLi9wcm9kdWN0LWRldGFpbHMtYmFzZSc7XHJcbmltcG9ydCAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uL2ZvdW5kYXRpb24nO1xyXG5pbXBvcnQgJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi9mb3VuZGF0aW9uLnJldmVhbCc7XHJcbmltcG9ydCBJbWFnZUdhbGxlcnkgZnJvbSAnLi4vcHJvZHVjdC9pbWFnZS1nYWxsZXJ5JztcclxuaW1wb3J0IG1vZGFsRmFjdG9yeSwgeyBhbGVydE1vZGFsLCBzaG93QWxlcnRNb2RhbCB9IGZyb20gJy4uL2dsb2JhbC9tb2RhbCc7XHJcbmltcG9ydCB7IGlzRW1wdHksIGlzUGxhaW5PYmplY3QgfSBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgbm9kIGZyb20gJy4uL2NvbW1vbi9ub2QnO1xyXG5pbXBvcnQgeyBhbm5vdW5jZUlucHV0RXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzL2Zvcm0tdXRpbHMnO1xyXG5pbXBvcnQgZm9ybXMgZnJvbSAnLi4vY29tbW9uL21vZGVscy9mb3Jtcyc7XHJcbmltcG9ydCB7IG5vcm1hbGl6ZUZvcm1EYXRhIH0gZnJvbSAnLi91dGlscy9hcGknO1xyXG5pbXBvcnQgeyBpc0Jyb3dzZXJJRSwgY29udmVydEludG9BcnJheSB9IGZyb20gJy4vdXRpbHMvaWUtaGVscGVycyc7XHJcbmltcG9ydCBiYW5uZXJVdGlscyBmcm9tICcuL3V0aWxzL2Jhbm5lci11dGlscyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcm9kdWN0RGV0YWlscyBleHRlbmRzIFByb2R1Y3REZXRhaWxzQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigkc2NvcGUsIGNvbnRleHQsIHByb2R1Y3RBdHRyaWJ1dGVzRGF0YSA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIoJHNjb3BlLCBjb250ZXh0KTtcclxuXHJcbiAgICAgICAgdGhpcy4kb3ZlcmxheSA9ICQoJ1tkYXRhLWNhcnQtaXRlbS1hZGRdIC5sb2FkaW5nT3ZlcmxheScpO1xyXG4gICAgICAgIHRoaXMuaW1hZ2VHYWxsZXJ5ID0gbmV3IEltYWdlR2FsbGVyeSgkKCdbZGF0YS1pbWFnZS1nYWxsZXJ5XScsIHRoaXMuJHNjb3BlKSk7XHJcbiAgICAgICAgdGhpcy5pbWFnZUdhbGxlcnkuaW5pdCgpO1xyXG4gICAgICAgIHRoaXMubGlzdGVuUXVhbnRpdHlDaGFuZ2UoKTtcclxuICAgICAgICB0aGlzLiRzd2F0Y2hPcHRpb25NZXNzYWdlID0gJCgnLnN3YXRjaC1vcHRpb24tbWVzc2FnZScpO1xyXG4gICAgICAgIHRoaXMuc3dhdGNoSW5pdE1lc3NhZ2VTdG9yYWdlID0ge307XHJcbiAgICAgICAgdGhpcy5zd2F0Y2hHcm91cElkTGlzdCA9ICQoJ1tpZF49XCJzd2F0Y2hHcm91cFwiXScpLm1hcCgoXywgZ3JvdXApID0+ICQoZ3JvdXApLmF0dHIoJ2lkJykpO1xyXG4gICAgICAgIHRoaXMuc3RvcmVJbml0TWVzc2FnZXNGb3JTd2F0Y2hlcygpO1xyXG5cclxuICAgICAgICBjb25zdCAkZm9ybSA9ICQoJ2Zvcm1bZGF0YS1jYXJ0LWl0ZW0tYWRkXScsICRzY29wZSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkVG9DYXJ0VmFsaWRhdG9yID0gbm9kKHtcclxuICAgICAgICAgICAgc3VibWl0OiAkZm9ybS5maW5kKCdpbnB1dCNmb3JtLWFjdGlvbi1hZGRUb0NhcnQnKSxcclxuICAgICAgICAgICAgdGFwOiBhbm5vdW5jZUlucHV0RXJyb3JNZXNzYWdlLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCAkcHJvZHVjdE9wdGlvbnNFbGVtZW50ID0gJCgnW2RhdGEtcHJvZHVjdC1vcHRpb24tY2hhbmdlXScsICRmb3JtKTtcclxuICAgICAgICBjb25zdCBoYXNPcHRpb25zID0gJHByb2R1Y3RPcHRpb25zRWxlbWVudC5odG1sKCkudHJpbSgpLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBoYXNEZWZhdWx0T3B0aW9ucyA9ICRwcm9kdWN0T3B0aW9uc0VsZW1lbnQuZmluZCgnW2RhdGEtZGVmYXVsdF0nKS5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgJHByb2R1Y3RTd2F0Y2hHcm91cCA9ICQoJ1tpZCo9XCJhdHRyaWJ1dGVfc3dhdGNoXCJdJywgJGZvcm0pO1xyXG4gICAgICAgIGNvbnN0ICRwcm9kdWN0U3dhdGNoTGFiZWxzID0gJCgnLmZvcm0tb3B0aW9uLXN3YXRjaCcsICRmb3JtKTtcclxuICAgICAgICBjb25zdCBwbGFjZVN3YXRjaExhYmVsSW1hZ2UgPSAoXywgbGFiZWwpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgJG9wdGlvbkltYWdlID0gJCgnLmZvcm0tb3B0aW9uLWV4cGFuZGVkJywgJChsYWJlbCkpO1xyXG4gICAgICAgICAgICBjb25zdCBvcHRpb25JbWFnZVdpZHRoID0gJG9wdGlvbkltYWdlLm91dGVyV2lkdGgoKTtcclxuICAgICAgICAgICAgY29uc3QgZXh0ZW5kZWRPcHRpb25JbWFnZU9mZnNldExlZnQgPSA1NTtcclxuICAgICAgICAgICAgY29uc3QgeyByaWdodCB9ID0gbGFiZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGVtcHR5U3BhY2VUb1NjcmVlblJpZ2h0Qm9yZGVyID0gd2luZG93LnNjcmVlbi53aWR0aCAtIHJpZ2h0O1xyXG4gICAgICAgICAgICBjb25zdCBzaGlmdFZhbHVlID0gb3B0aW9uSW1hZ2VXaWR0aCAtIGVtcHR5U3BhY2VUb1NjcmVlblJpZ2h0Qm9yZGVyO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVtcHR5U3BhY2VUb1NjcmVlblJpZ2h0Qm9yZGVyIDwgKG9wdGlvbkltYWdlV2lkdGggKyBleHRlbmRlZE9wdGlvbkltYWdlT2Zmc2V0TGVmdCkpIHtcclxuICAgICAgICAgICAgICAgICRvcHRpb25JbWFnZS5jc3MoJ2xlZnQnLCBgJHtzaGlmdFZhbHVlID4gMCA/IC1zaGlmdFZhbHVlIDogc2hpZnRWYWx1ZX1weGApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgJCh3aW5kb3cpLm9uKCdsb2FkJywgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyQWRkVG9DYXJ0VmFsaWRhdGlvbigpO1xyXG4gICAgICAgICAgICAkLmVhY2goJHByb2R1Y3RTd2F0Y2hMYWJlbHMsIHBsYWNlU3dhdGNoTGFiZWxJbWFnZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChjb250ZXh0LnNob3dTd2F0Y2hOYW1lcykge1xyXG4gICAgICAgICAgICB0aGlzLiRzd2F0Y2hPcHRpb25NZXNzYWdlLnJlbW92ZUNsYXNzKCd1LWhpZGRlbicpO1xyXG5cclxuICAgICAgICAgICAgJHByb2R1Y3RTd2F0Y2hHcm91cC5vbignY2hhbmdlJywgKHsgdGFyZ2V0IH0pID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN3YXRjaEdyb3VwRWxlbWVudCA9IHRhcmdldC5wYXJlbnROb2RlLnBhcmVudE5vZGU7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93U3dhdGNoTmFtZU9uT3B0aW9uKCQodGFyZ2V0KSwgJChzd2F0Y2hHcm91cEVsZW1lbnQpKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAkLmVhY2goJHByb2R1Y3RTd2F0Y2hHcm91cCwgKF8sIGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN3YXRjaEdyb3VwRWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZS5wYXJlbnROb2RlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICgkKGVsZW1lbnQpLmlzKCc6Y2hlY2tlZCcpKSB0aGlzLnNob3dTd2F0Y2hOYW1lT25PcHRpb24oJChlbGVtZW50KSwgJChzd2F0Y2hHcm91cEVsZW1lbnQpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAkcHJvZHVjdE9wdGlvbnNFbGVtZW50Lm9uKCdjaGFuZ2UnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdE9wdGlvbnNDaGFuZ2VkKGV2ZW50KTtcclxuICAgICAgICAgICAgdGhpcy5zZXRQcm9kdWN0VmFyaWFudCgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkZm9ybS5vbignc3VibWl0JywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFRvQ2FydFZhbGlkYXRvci5wZXJmb3JtQ2hlY2soKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmFkZFRvQ2FydFZhbGlkYXRvci5hcmVBbGwoJ3ZhbGlkJykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkUHJvZHVjdFRvQ2FydChldmVudCwgJGZvcm1bMF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIFVwZGF0ZSBwcm9kdWN0IGF0dHJpYnV0ZXMuIEFsc28gdXBkYXRlIHRoZSBpbml0aWFsIHZpZXcgaW4gY2FzZSBpdGVtcyBhcmUgb29zXHJcbiAgICAgICAgLy8gb3IgaGF2ZSBkZWZhdWx0IHZhcmlhbnQgcHJvcGVydGllcyB0aGF0IGNoYW5nZSB0aGUgdmlld1xyXG4gICAgICAgIGlmICgoaXNFbXB0eShwcm9kdWN0QXR0cmlidXRlc0RhdGEpIHx8IGhhc0RlZmF1bHRPcHRpb25zKSAmJiBoYXNPcHRpb25zKSB7XHJcbiAgICAgICAgICAgIGNvbnN0ICRwcm9kdWN0SWQgPSAkKCdbbmFtZT1cInByb2R1Y3RfaWRcIl0nLCAkZm9ybSkudmFsKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbkNoYW5nZUNhbGxiYWNrID0gb3B0aW9uQ2hhbmdlRGVjb3JhdG9yLmNhbGwodGhpcywgaGFzRGVmYXVsdE9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgdXRpbHMuYXBpLnByb2R1Y3RBdHRyaWJ1dGVzLm9wdGlvbkNoYW5nZSgkcHJvZHVjdElkLCAkZm9ybS5zZXJpYWxpemUoKSwgJ3Byb2R1Y3RzL2J1bGstZGlzY291bnQtcmF0ZXMnLCBvcHRpb25DaGFuZ2VDYWxsYmFjayk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVQcm9kdWN0QXR0cmlidXRlcyhwcm9kdWN0QXR0cmlidXRlc0RhdGEpO1xyXG4gICAgICAgICAgICBiYW5uZXJVdGlscy5kaXNwYXRjaFByb2R1Y3RCYW5uZXJFdmVudChwcm9kdWN0QXR0cmlidXRlc0RhdGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJHByb2R1Y3RPcHRpb25zRWxlbWVudC5zaG93KCk7XHJcblxyXG4gICAgICAgIHRoaXMucHJldmlld01vZGFsID0gbW9kYWxGYWN0b3J5KCcjcHJldmlld01vZGFsJylbMF07XHJcbiAgICB9XHJcblxyXG4gICAgcmVnaXN0ZXJBZGRUb0NhcnRWYWxpZGF0aW9uKCkge1xyXG4gICAgICAgIHRoaXMuYWRkVG9DYXJ0VmFsaWRhdG9yLmFkZChbe1xyXG4gICAgICAgICAgICBzZWxlY3RvcjogJ1tkYXRhLXF1YW50aXR5LWNoYW5nZV0gPiAuZm9ybS1pbnB1dC0taW5jcmVtZW50VG90YWwnLFxyXG4gICAgICAgICAgICB2YWxpZGF0ZTogKGNiLCB2YWwpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZvcm1zLm51bWJlcnNPbmx5KHZhbCk7XHJcbiAgICAgICAgICAgICAgICBjYihyZXN1bHQpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHRoaXMuY29udGV4dC5wcm9kdWN0UXVhbnRpdHlFcnJvck1lc3NhZ2UsXHJcbiAgICAgICAgfV0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5hZGRUb0NhcnRWYWxpZGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgc3RvcmVJbml0TWVzc2FnZXNGb3JTd2F0Y2hlcygpIHtcclxuICAgICAgICBpZiAodGhpcy5zd2F0Y2hHcm91cElkTGlzdC5sZW5ndGggJiYgaXNFbXB0eSh0aGlzLnN3YXRjaEluaXRNZXNzYWdlU3RvcmFnZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5zd2F0Y2hHcm91cElkTGlzdC5lYWNoKChfLCBzd2F0Y2hHcm91cElkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc3dhdGNoSW5pdE1lc3NhZ2VTdG9yYWdlW3N3YXRjaEdyb3VwSWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zd2F0Y2hJbml0TWVzc2FnZVN0b3JhZ2Vbc3dhdGNoR3JvdXBJZF0gPSAkKGAjJHtzd2F0Y2hHcm91cElkfSB+IC5zd2F0Y2gtb3B0aW9uLW1lc3NhZ2VgKS50ZXh0KCkudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UHJvZHVjdFZhcmlhbnQoKSB7XHJcbiAgICAgICAgY29uc3QgdW5zYXRpc2ZpZWRSZXF1aXJlZEZpZWxkcyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBbXTtcclxuXHJcbiAgICAgICAgJC5lYWNoKCQoJ1tkYXRhLXByb2R1Y3QtYXR0cmlidXRlXScpLCAoaW5kZXgsIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbkxhYmVsID0gdmFsdWUuY2hpbGRyZW5bMF0uaW5uZXJUZXh0O1xyXG4gICAgICAgICAgICBjb25zdCBvcHRpb25UaXRsZSA9IG9wdGlvbkxhYmVsLnNwbGl0KCc6JylbMF0udHJpbSgpO1xyXG4gICAgICAgICAgICBjb25zdCByZXF1aXJlZCA9IG9wdGlvbkxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3JlcXVpcmVkJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB2YWx1ZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcHJvZHVjdC1hdHRyaWJ1dGUnKTtcclxuXHJcbiAgICAgICAgICAgIGlmICgodHlwZSA9PT0gJ2lucHV0LWZpbGUnIHx8IHR5cGUgPT09ICdpbnB1dC10ZXh0JyB8fCB0eXBlID09PSAnaW5wdXQtbnVtYmVyJykgJiYgdmFsdWUucXVlcnlTZWxlY3RvcignaW5wdXQnKS52YWx1ZSA9PT0gJycgJiYgcmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgICAgIHVuc2F0aXNmaWVkUmVxdWlyZWRGaWVsZHMucHVzaCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAndGV4dGFyZWEnICYmIHZhbHVlLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJykudmFsdWUgPT09ICcnICYmIHJlcXVpcmVkKSB7XHJcbiAgICAgICAgICAgICAgICB1bnNhdGlzZmllZFJlcXVpcmVkRmllbGRzLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2RhdGUnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc1NhdGlzZmllZCA9IEFycmF5LmZyb20odmFsdWUucXVlcnlTZWxlY3RvckFsbCgnc2VsZWN0JykpLmV2ZXJ5KChzZWxlY3QpID0+IHNlbGVjdC5zZWxlY3RlZEluZGV4ICE9PSAwKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXNTYXRpc2ZpZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gQXJyYXkuZnJvbSh2YWx1ZS5xdWVyeVNlbGVjdG9yQWxsKCdzZWxlY3QnKSkubWFwKCh4KSA9PiB4LnZhbHVlKS5qb2luKCctJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wdXNoKGAke29wdGlvblRpdGxlfToke2RhdGVTdHJpbmd9YCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB1bnNhdGlzZmllZFJlcXVpcmVkRmllbGRzLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3NldC1zZWxlY3QnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3QgPSB2YWx1ZS5xdWVyeVNlbGVjdG9yKCdzZWxlY3QnKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSW5kZXggPSBzZWxlY3Quc2VsZWN0ZWRJbmRleDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHVzaChgJHtvcHRpb25UaXRsZX06JHtzZWxlY3Qub3B0aW9uc1tzZWxlY3RlZEluZGV4XS5pbm5lclRleHR9YCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB1bnNhdGlzZmllZFJlcXVpcmVkRmllbGRzLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3NldC1yZWN0YW5nbGUnIHx8IHR5cGUgPT09ICdzZXQtcmFkaW8nIHx8IHR5cGUgPT09ICdzd2F0Y2gnIHx8IHR5cGUgPT09ICdpbnB1dC1jaGVja2JveCcgfHwgdHlwZSA9PT0gJ3Byb2R1Y3QtbGlzdCcpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrZWQgPSB2YWx1ZS5xdWVyeVNlbGVjdG9yKCc6Y2hlY2tlZCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBnZXRTZWxlY3RlZE9wdGlvbkxhYmVsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9kdWN0VmFyaWFudHNsaXN0ID0gY29udmVydEludG9BcnJheSh2YWx1ZS5jaGlsZHJlbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoTGFiZWxGb3JDaGVja2VkSW5wdXQgPSBpbnB0ID0+IGlucHQuZGF0YXNldC5wcm9kdWN0QXR0cmlidXRlVmFsdWUgPT09IGNoZWNrZWQudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9kdWN0VmFyaWFudHNsaXN0LmZpbHRlcihtYXRjaExhYmVsRm9yQ2hlY2tlZElucHV0KVswXTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnc2V0LXJlY3RhbmdsZScgfHwgdHlwZSA9PT0gJ3NldC1yYWRpbycgfHwgdHlwZSA9PT0gJ3Byb2R1Y3QtbGlzdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBpc0Jyb3dzZXJJRSA/IGdldFNlbGVjdGVkT3B0aW9uTGFiZWwoKS5pbm5lclRleHQudHJpbSgpIDogY2hlY2tlZC5sYWJlbHNbMF0uaW5uZXJUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHVzaChgJHtvcHRpb25UaXRsZX06JHtsYWJlbH1gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzd2F0Y2gnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gaXNCcm93c2VySUUgPyBnZXRTZWxlY3RlZE9wdGlvbkxhYmVsKCkuY2hpbGRyZW5bMF0gOiBjaGVja2VkLmxhYmVsc1swXS5jaGlsZHJlblswXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnB1c2goYCR7b3B0aW9uVGl0bGV9OiR7bGFiZWwudGl0bGV9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnaW5wdXQtY2hlY2tib3gnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHVzaChgJHtvcHRpb25UaXRsZX06WWVzYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdpbnB1dC1jaGVja2JveCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnB1c2goYCR7b3B0aW9uVGl0bGV9Ok5vYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdW5zYXRpc2ZpZWRSZXF1aXJlZEZpZWxkcy5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgcHJvZHVjdFZhcmlhbnQgPSB1bnNhdGlzZmllZFJlcXVpcmVkRmllbGRzLmxlbmd0aCA9PT0gMCA/IG9wdGlvbnMuc29ydCgpLmpvaW4oJywgJykgOiAndW5zYXRpc2ZpZWQnO1xyXG4gICAgICAgIGNvbnN0IHZpZXcgPSAkKCcucHJvZHVjdFZpZXcnKTtcclxuXHJcbiAgICAgICAgaWYgKHByb2R1Y3RWYXJpYW50KSB7XHJcbiAgICAgICAgICAgIHByb2R1Y3RWYXJpYW50ID0gcHJvZHVjdFZhcmlhbnQgPT09ICd1bnNhdGlzZmllZCcgPyAnJyA6IHByb2R1Y3RWYXJpYW50O1xyXG4gICAgICAgICAgICBpZiAodmlldy5hdHRyKCdkYXRhLWV2ZW50LXR5cGUnKSkge1xyXG4gICAgICAgICAgICAgICAgdmlldy5hdHRyKCdkYXRhLXByb2R1Y3QtdmFyaWFudCcsIHByb2R1Y3RWYXJpYW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2R1Y3ROYW1lID0gdmlldy5maW5kKCcucHJvZHVjdFZpZXctdGl0bGUnKVswXS5pbm5lclRleHQucmVwbGFjZSgvXCIvZywgJ1xcXFwkJicpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2FyZCA9ICQoYFtkYXRhLW5hbWU9XCIke3Byb2R1Y3ROYW1lfVwiXWApO1xyXG4gICAgICAgICAgICAgICAgY2FyZC5hdHRyKCdkYXRhLXByb2R1Y3QtdmFyaWFudCcsIHByb2R1Y3RWYXJpYW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiB0aGUgY3VycmVudCB3aW5kb3cgaXMgYmVpbmcgcnVuIGluc2lkZSBhbiBpZnJhbWVcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBpc1J1bm5pbmdJbklmcmFtZSgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gd2luZG93LnNlbGYgIT09IHdpbmRvdy50b3A7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogSGFuZGxlIHByb2R1Y3Qgb3B0aW9ucyBjaGFuZ2VzXHJcbiAgICAgKlxyXG4gICAgICovXHJcbiAgICBwcm9kdWN0T3B0aW9uc0NoYW5nZWQoZXZlbnQpIHtcclxuICAgICAgICBjb25zdCAkY2hhbmdlZE9wdGlvbiA9ICQoZXZlbnQudGFyZ2V0KTtcclxuICAgICAgICBjb25zdCAkZm9ybSA9ICRjaGFuZ2VkT3B0aW9uLnBhcmVudHMoJ2Zvcm0nKTtcclxuICAgICAgICBjb25zdCBwcm9kdWN0SWQgPSAkKCdbbmFtZT1cInByb2R1Y3RfaWRcIl0nLCAkZm9ybSkudmFsKCk7XHJcblxyXG4gICAgICAgIC8vIERvIG5vdCB0cmlnZ2VyIGFuIGFqYXggcmVxdWVzdCBpZiBpdCdzIGEgZmlsZSBvciBpZiB0aGUgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgRm9ybURhdGFcclxuICAgICAgICBpZiAoJGNoYW5nZWRPcHRpb24uYXR0cigndHlwZScpID09PSAnZmlsZScgfHwgd2luZG93LkZvcm1EYXRhID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdXRpbHMuYXBpLnByb2R1Y3RBdHRyaWJ1dGVzLm9wdGlvbkNoYW5nZShwcm9kdWN0SWQsICRmb3JtLnNlcmlhbGl6ZSgpLCAncHJvZHVjdHMvYnVsay1kaXNjb3VudC1yYXRlcycsIChlcnIsIHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByb2R1Y3RBdHRyaWJ1dGVzRGF0YSA9IHJlc3BvbnNlLmRhdGEgfHwge307XHJcbiAgICAgICAgICAgIGNvbnN0IHByb2R1Y3RBdHRyaWJ1dGVzQ29udGVudCA9IHJlc3BvbnNlLmNvbnRlbnQgfHwge307XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUHJvZHVjdEF0dHJpYnV0ZXMocHJvZHVjdEF0dHJpYnV0ZXNEYXRhKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVWaWV3KHByb2R1Y3RBdHRyaWJ1dGVzRGF0YSwgcHJvZHVjdEF0dHJpYnV0ZXNDb250ZW50KTtcclxuICAgICAgICAgICAgYmFubmVyVXRpbHMuZGlzcGF0Y2hQcm9kdWN0QmFubmVyRXZlbnQocHJvZHVjdEF0dHJpYnV0ZXNEYXRhKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jaGVja0lzUXVpY2tWaWV3Q2hpbGQoJGZvcm0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCAkY29udGV4dCA9ICRmb3JtLnBhcmVudHMoJy5wcm9kdWN0VmlldycpLmZpbmQoJy5wcm9kdWN0Vmlldy1pbmZvJyk7XHJcbiAgICAgICAgICAgICAgICBtb2RhbEZhY3RvcnkoJ1tkYXRhLXJldmVhbF0nLCB7ICRjb250ZXh0IH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBpZiB0aGlzIHNldHRpbmcgaXMgZW5hYmxlZCBpbiBQYWdlIEJ1aWxkZXJcclxuICAgICAqIHNob3cgbmFtZSBmb3Igc3dhdGNoIG9wdGlvblxyXG4gICAgICovXHJcbiAgICBzaG93U3dhdGNoTmFtZU9uT3B0aW9uKCRzd2F0Y2gsICRzd2F0Y2hHcm91cCkge1xyXG4gICAgICAgIGNvbnN0IHN3YXRjaE5hbWUgPSAkc3dhdGNoLmF0dHIoJ2FyaWEtbGFiZWwnKTtcclxuICAgICAgICBjb25zdCBhY3RpdmVTd2F0Y2hHcm91cElkID0gJHN3YXRjaEdyb3VwLmF0dHIoJ2FyaWEtbGFiZWxsZWRieScpO1xyXG4gICAgICAgIGNvbnN0ICRzd2F0Y2hPcHRpb25NZXNzYWdlID0gJChgIyR7YWN0aXZlU3dhdGNoR3JvdXBJZH0gfiAuc3dhdGNoLW9wdGlvbi1tZXNzYWdlYCk7XHJcblxyXG4gICAgICAgICQoJ1tkYXRhLW9wdGlvbi12YWx1ZV0nLCAkc3dhdGNoR3JvdXApLnRleHQoc3dhdGNoTmFtZSk7XHJcbiAgICAgICAgJHN3YXRjaE9wdGlvbk1lc3NhZ2UudGV4dChgJHt0aGlzLnN3YXRjaEluaXRNZXNzYWdlU3RvcmFnZVthY3RpdmVTd2F0Y2hHcm91cElkXX0gJHtzd2F0Y2hOYW1lfWApO1xyXG4gICAgICAgIHRoaXMuc2V0TGl2ZVJlZ2lvbkF0dHJpYnV0ZXMoJHN3YXRjaE9wdGlvbk1lc3NhZ2UsICdzdGF0dXMnLCAnYXNzZXJ0aXZlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0TGl2ZVJlZ2lvbkF0dHJpYnV0ZXMoJGVsZW1lbnQsIHJvbGVUeXBlLCBhcmlhTGl2ZVN0YXR1cykge1xyXG4gICAgICAgICRlbGVtZW50LmF0dHIoe1xyXG4gICAgICAgICAgICByb2xlOiByb2xlVHlwZSxcclxuICAgICAgICAgICAgJ2FyaWEtbGl2ZSc6IGFyaWFMaXZlU3RhdHVzLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSXNRdWlja1ZpZXdDaGlsZCgkZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiAhISRlbGVtZW50LnBhcmVudHMoJy5xdWlja1ZpZXcnKS5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd1Byb2R1Y3RJbWFnZShpbWFnZSkge1xyXG4gICAgICAgIGlmIChpc1BsYWluT2JqZWN0KGltYWdlKSkge1xyXG4gICAgICAgICAgICBjb25zdCB6b29tSW1hZ2VVcmwgPSB1dGlscy50b29scy5pbWFnZVNyY3NldC5nZXRTcmNzZXQoXHJcbiAgICAgICAgICAgICAgICBpbWFnZS5kYXRhLFxyXG4gICAgICAgICAgICAgICAgeyAnMXgnOiB0aGlzLmNvbnRleHQuem9vbVNpemUgfSxcclxuICAgICAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgICAgICAgU2hvdWxkIG1hdGNoIHpvb20gc2l6ZSB1c2VkIGZvciBkYXRhLXpvb20taW1hZ2UgaW5cclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzL3Byb2R1Y3RzL3Byb2R1Y3Qtdmlldy5odG1sXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIHdpbGwgb25seSBiZSB1c2VkIGFzIGEgZmFsbGJhY2sgaW1hZ2UgZm9yIGJyb3dzZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgc3Jjc2V0XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIEFsc28gbm90ZSB0aGF0IGdldFNyY3NldCByZXR1cm5zIGEgc2ltcGxlIHNyYyBzdHJpbmcgd2hlbiBleGFjdGx5IG9uZSBzaXplIGlzIHByb3ZpZGVkXHJcbiAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgbWFpbkltYWdlVXJsID0gdXRpbHMudG9vbHMuaW1hZ2VTcmNzZXQuZ2V0U3Jjc2V0KFxyXG4gICAgICAgICAgICAgICAgaW1hZ2UuZGF0YSxcclxuICAgICAgICAgICAgICAgIHsgJzF4JzogdGhpcy5jb250ZXh0LnByb2R1Y3RTaXplIH0sXHJcbiAgICAgICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgICAgICAgIFNob3VsZCBtYXRjaCBmYWxsYmFjayBpbWFnZSBzaXplIHVzZWQgZm9yIHRoZSBtYWluIHByb2R1Y3QgaW1hZ2UgaW5cclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzL3Byb2R1Y3RzL3Byb2R1Y3Qtdmlldy5odG1sXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIHdpbGwgb25seSBiZSB1c2VkIGFzIGEgZmFsbGJhY2sgaW1hZ2UgZm9yIGJyb3dzZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgc3Jjc2V0XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIEFsc28gbm90ZSB0aGF0IGdldFNyY3NldCByZXR1cm5zIGEgc2ltcGxlIHNyYyBzdHJpbmcgd2hlbiBleGFjdGx5IG9uZSBzaXplIGlzIHByb3ZpZGVkXHJcbiAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgbWFpbkltYWdlU3Jjc2V0ID0gdXRpbHMudG9vbHMuaW1hZ2VTcmNzZXQuZ2V0U3Jjc2V0KGltYWdlLmRhdGEpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5pbWFnZUdhbGxlcnkuc2V0QWx0ZXJuYXRlSW1hZ2Uoe1xyXG4gICAgICAgICAgICAgICAgbWFpbkltYWdlVXJsLFxyXG4gICAgICAgICAgICAgICAgem9vbUltYWdlVXJsLFxyXG4gICAgICAgICAgICAgICAgbWFpbkltYWdlU3Jjc2V0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmltYWdlR2FsbGVyeS5yZXN0b3JlSW1hZ2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogSGFuZGxlIGFjdGlvbiB3aGVuIHRoZSBzaG9wcGVyIGNsaWNrcyBvbiArIC8gLSBmb3IgcXVhbnRpdHlcclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIGxpc3RlblF1YW50aXR5Q2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMuJHNjb3BlLm9uKCdjbGljaycsICdbZGF0YS1xdWFudGl0eS1jaGFuZ2VdIGJ1dHRvbicsIGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgY29uc3QgJHRhcmdldCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHZpZXdNb2RlbCA9IHRoaXMuZ2V0Vmlld01vZGVsKHRoaXMuJHNjb3BlKTtcclxuICAgICAgICAgICAgY29uc3QgJGlucHV0ID0gdmlld01vZGVsLnF1YW50aXR5LiRpbnB1dDtcclxuICAgICAgICAgICAgY29uc3QgcXVhbnRpdHlNaW4gPSBwYXJzZUludCgkaW5wdXQuZGF0YSgncXVhbnRpdHlNaW4nKSwgMTApO1xyXG4gICAgICAgICAgICBjb25zdCBxdWFudGl0eU1heCA9IHBhcnNlSW50KCRpbnB1dC5kYXRhKCdxdWFudGl0eU1heCcpLCAxMCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgcXR5ID0gZm9ybXMubnVtYmVyc09ubHkoJGlucHV0LnZhbCgpKSA/IHBhcnNlSW50KCRpbnB1dC52YWwoKSwgMTApIDogcXVhbnRpdHlNaW47XHJcbiAgICAgICAgICAgIC8vIElmIGFjdGlvbiBpcyBpbmNyZW1lbnRpbmdcclxuICAgICAgICAgICAgaWYgKCR0YXJnZXQuZGF0YSgnYWN0aW9uJykgPT09ICdpbmMnKSB7XHJcbiAgICAgICAgICAgICAgICBxdHkgPSBmb3Jtcy52YWxpZGF0ZUluY3JlYXNlQWdhaW5zdE1heEJvdW5kYXJ5KHF0eSwgcXVhbnRpdHlNYXgpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHF0eSA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHF0eSA9IGZvcm1zLnZhbGlkYXRlRGVjcmVhc2VBZ2FpbnN0TWluQm91bmRhcnkocXR5LCBxdWFudGl0eU1pbik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBoaWRkZW4gaW5wdXRcclxuICAgICAgICAgICAgdmlld01vZGVsLnF1YW50aXR5LiRpbnB1dC52YWwocXR5KTtcclxuICAgICAgICAgICAgLy8gdXBkYXRlIHRleHRcclxuICAgICAgICAgICAgdmlld01vZGVsLnF1YW50aXR5LiR0ZXh0LnRleHQocXR5KTtcclxuICAgICAgICAgICAgLy8gcGVyZm9ybSB2YWxpZGF0aW9uIGFmdGVyIHVwZGF0aW5nIHByb2R1Y3QgcXVhbnRpdHlcclxuICAgICAgICAgICAgdGhpcy5hZGRUb0NhcnRWYWxpZGF0b3IucGVyZm9ybUNoZWNrKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIFByZXZlbnQgdHJpZ2dlcmluZyBxdWFudGl0eSBjaGFuZ2Ugd2hlbiBwcmVzc2luZyBlbnRlclxyXG4gICAgICAgIHRoaXMuJHNjb3BlLm9uKCdrZXlwcmVzcycsICcuZm9ybS1pbnB1dC0taW5jcmVtZW50VG90YWwnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBicm93c2VyIHN1cHBvcnRzIGV2ZW50LndoaWNoLCB0aGVuIHVzZSBldmVudC53aGljaCwgb3RoZXJ3aXNlIHVzZSBldmVudC5rZXlDb2RlXHJcbiAgICAgICAgICAgIGNvbnN0IHggPSBldmVudC53aGljaCB8fCBldmVudC5rZXlDb2RlO1xyXG4gICAgICAgICAgICBpZiAoeCA9PT0gMTMpIHtcclxuICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgZGVmYXVsdFxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEFkZCBhIHByb2R1Y3QgdG8gY2FydFxyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgYWRkUHJvZHVjdFRvQ2FydChldmVudCwgZm9ybSkge1xyXG4gICAgICAgIGNvbnN0ICRhZGRUb0NhcnRCdG4gPSAkKCcjZm9ybS1hY3Rpb24tYWRkVG9DYXJ0JywgJChldmVudC50YXJnZXQpKTtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbEJ0blZhbCA9ICRhZGRUb0NhcnRCdG4udmFsKCk7XHJcbiAgICAgICAgY29uc3Qgd2FpdE1lc3NhZ2UgPSAkYWRkVG9DYXJ0QnRuLmRhdGEoJ3dhaXRNZXNzYWdlJyk7XHJcblxyXG4gICAgICAgIC8vIERvIG5vdCBkbyBBSkFYIGlmIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IEZvcm1EYXRhXHJcbiAgICAgICAgaWYgKHdpbmRvdy5Gb3JtRGF0YSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFByZXZlbnQgZGVmYXVsdFxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICRhZGRUb0NhcnRCdG5cclxuICAgICAgICAgICAgLnZhbCh3YWl0TWVzc2FnZSlcclxuICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuJG92ZXJsYXkuc2hvdygpO1xyXG5cclxuICAgICAgICAvLyBBZGQgaXRlbSB0byBjYXJ0XHJcbiAgICAgICAgdXRpbHMuYXBpLmNhcnQuaXRlbUFkZChub3JtYWxpemVGb3JtRGF0YShuZXcgRm9ybURhdGEoZm9ybSkpLCAoZXJyLCByZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnIgfHwgcmVzcG9uc2UuZGF0YS5lcnJvcjtcclxuXHJcbiAgICAgICAgICAgICRhZGRUb0NhcnRCdG5cclxuICAgICAgICAgICAgICAgIC52YWwob3JpZ2luYWxCdG5WYWwpXHJcbiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLiRvdmVybGF5LmhpZGUoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIEd1YXJkIHN0YXRlbWVudFxyXG4gICAgICAgICAgICBpZiAoZXJyb3JNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBTdHJpcCB0aGUgSFRNTCBmcm9tIHRoZSBlcnJvciBtZXNzYWdlXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0bXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcclxuICAgICAgICAgICAgICAgIHRtcC5pbm5lckhUTUwgPSBlcnJvck1lc3NhZ2U7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNoZWNrSXNRdWlja1ZpZXdDaGlsZCgkYWRkVG9DYXJ0QnRuKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0TW9kYWwoKS4kcHJlTW9kYWxGb2N1c2VkRWwgPSAkYWRkVG9DYXJ0QnRuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBzaG93QWxlcnRNb2RhbCh0bXAudGV4dENvbnRlbnQgfHwgdG1wLmlubmVyVGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIE9wZW4gcHJldmlldyBtb2RhbCBhbmQgdXBkYXRlIGNvbnRlbnRcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cudGhlbWVfc2V0dGluZ3MgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy50aGVtZV9zZXR0aW5ncy5zaG93X2Zhc3RfY2FydCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldmlld01vZGFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3TW9kYWwub3BlbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuQXBwbGVQYXlTZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJldmlld01vZGFsLiRtb2RhbC5hZGRDbGFzcygnYXBwbGUtcGF5LXN1cHBvcnRlZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCRhZGRUb0NhcnRCdG4ucGFyZW50cygnLnF1aWNrVmlldycpLmxlbmd0aCA9PT0gMCkgdGhpcy5wcmV2aWV3TW9kYWwuJHByZU1vZGFsRm9jdXNlZEVsID0gJGFkZFRvQ2FydEJ0bjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcnRDb250ZW50KHRoaXMucHJldmlld01vZGFsLCByZXNwb25zZS5kYXRhLmNhcnRfaXRlbS5pZCwgKCkgPT4gdGhpcy5wcmV2aWV3TW9kYWwuc2V0dXBGb2N1c1RyYXAoKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJG92ZXJsYXkuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIG1vZGFsLCByZWRpcmVjdCB0byB0aGUgY2FydCBwYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdFRvKHJlc3BvbnNlLmRhdGEuY2FydF9pdGVtLmNhcnRfdXJsIHx8IHRoaXMuY29udGV4dC51cmxzLmNhcnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jaGVja0lzUXVpY2tWaWV3Q2hpbGQoJGFkZFRvQ2FydEJ0bikpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByZXZpZXdNb2RhbC4kcHJlTW9kYWxGb2N1c2VkRWwgPSAkYWRkVG9DYXJ0QnRuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FydENvbnRlbnQodGhpcy5wcmV2aWV3TW9kYWwsIHJlc3BvbnNlLmRhdGEuY2FydF9pdGVtLmlkKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RUbyhyZXNwb25zZS5kYXRhLmNhcnRfaXRlbS5jYXJ0X3VybCB8fCB0aGlzLmNvbnRleHQudXJscy5jYXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnNldExpdmVSZWdpb25BdHRyaWJ1dGVzKCRhZGRUb0NhcnRCdG4ubmV4dCgpLCAnc3RhdHVzJywgJ3BvbGl0ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGNhcnQgY29udGVudHNcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY2FydEl0ZW1JZFxyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25Db21wbGV0ZVxyXG4gICAgICovXHJcbiAgICBnZXRDYXJ0Q29udGVudChjYXJ0SXRlbUlkLCBvbkNvbXBsZXRlKSB7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICdjYXJ0L3ByZXZpZXcnLFxyXG4gICAgICAgICAgICBwYXJhbXM6IHtcclxuICAgICAgICAgICAgICAgIHN1Z2dlc3Q6IGNhcnRJdGVtSWQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNvbmZpZzoge1xyXG4gICAgICAgICAgICAgICAgY2FydDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0OiA0LFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHV0aWxzLmFwaS5jYXJ0LmdldENvbnRlbnQob3B0aW9ucywgb25Db21wbGV0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWRpcmVjdCB0byB1cmxcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsXHJcbiAgICAgKi9cclxuICAgIHJlZGlyZWN0VG8odXJsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNSdW5uaW5nSW5JZnJhbWUoKSAmJiAhd2luZG93LmlmcmFtZVNkaykge1xyXG4gICAgICAgICAgICB3aW5kb3cudG9wLmxvY2F0aW9uID0gdXJsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHVybDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgY2FydCBjb250ZW50XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtNb2RhbH0gbW9kYWxcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjYXJ0SXRlbUlkXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkNvbXBsZXRlXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZUNhcnRDb250ZW50KG1vZGFsLCBjYXJ0SXRlbUlkLCBvbkNvbXBsZXRlKSB7XHJcbiAgICAgICAgdGhpcy5nZXRDYXJ0Q29udGVudChjYXJ0SXRlbUlkLCAoZXJyLCByZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG1vZGFsLnVwZGF0ZUNvbnRlbnQocmVzcG9uc2UpO1xyXG5cclxuICAgICAgICAgICAgLy8gVXBkYXRlIGNhcnQgY291bnRlclxyXG4gICAgICAgICAgICBjb25zdCAkYm9keSA9ICQoJ2JvZHknKTtcclxuICAgICAgICAgICAgY29uc3QgJGNhcnRRdWFudGl0eSA9ICQoJ1tkYXRhLWNhcnQtcXVhbnRpdHldJywgbW9kYWwuJGNvbnRlbnQpO1xyXG4gICAgICAgICAgICBjb25zdCAkY2FydENvdW50ZXIgPSAkKCcubmF2VXNlci1hY3Rpb24gLmNhcnQtY291bnQnKTtcclxuICAgICAgICAgICAgY29uc3QgcXVhbnRpdHkgPSAkY2FydFF1YW50aXR5LmRhdGEoJ2NhcnRRdWFudGl0eScpIHx8IDA7XHJcbiAgICAgICAgICAgIGNvbnN0ICRwcm9tb3Rpb25CYW5uZXIgPSAkKCdbZGF0YS1wcm9tb3Rpb24tYmFubmVyXScpO1xyXG4gICAgICAgICAgICBjb25zdCAkYmFja1RvU2hvcHBwaW5nQnRuID0gJCgnLnByZXZpZXdDYXJ0Q2hlY2tvdXQgPiBbZGF0YS1yZXZlYWwtY2xvc2VdJyk7XHJcbiAgICAgICAgICAgIGNvbnN0ICRtb2RhbENsb3NlQnRuID0gJCgnI3ByZXZpZXdNb2RhbCA+IC5tb2RhbC1jbG9zZScpO1xyXG4gICAgICAgICAgICBjb25zdCBiYW5uZXJVcGRhdGVIYW5kbGVyID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgJHByb2R1Y3RDb250YWluZXIgPSAkKCcjbWFpbi1jb250ZW50ID4gLmNvbnRhaW5lcicpO1xyXG5cclxuICAgICAgICAgICAgICAgICRwcm9kdWN0Q29udGFpbmVyLmFwcGVuZCgnPGRpdiBjbGFzcz1cImxvYWRpbmdPdmVybGF5IHBkcC11cGRhdGVcIj48L2Rpdj4nKTtcclxuICAgICAgICAgICAgICAgICQoJy5sb2FkaW5nT3ZlcmxheS5wZHAtdXBkYXRlJywgJHByb2R1Y3RDb250YWluZXIpLnNob3coKTtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICRjYXJ0Q291bnRlci5hZGRDbGFzcygnY2FydC1jb3VudC0tcG9zaXRpdmUnKTtcclxuICAgICAgICAgICAgJGJvZHkudHJpZ2dlcignY2FydC1xdWFudGl0eS11cGRhdGUnLCBxdWFudGl0eSk7XHJcblxyXG4gICAgICAgICAgICBpZiAob25Db21wbGV0ZSkge1xyXG4gICAgICAgICAgICAgICAgb25Db21wbGV0ZShyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICgkcHJvbW90aW9uQmFubmVyLmxlbmd0aCAmJiAkYmFja1RvU2hvcHBwaW5nQnRuLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgJGJhY2tUb1Nob3BwcGluZ0J0bi5vbignY2xpY2snLCBiYW5uZXJVcGRhdGVIYW5kbGVyKTtcclxuICAgICAgICAgICAgICAgICRtb2RhbENsb3NlQnRuLm9uKCdjbGljaycsIGJhbm5lclVwZGF0ZUhhbmRsZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIaWRlIG9yIG1hcmsgYXMgdW5hdmFpbGFibGUgb3V0IG9mIHN0b2NrIGF0dHJpYnV0ZXMgaWYgZW5hYmxlZFxyXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBkYXRhIFByb2R1Y3QgYXR0cmlidXRlIGRhdGFcclxuICAgICAqL1xyXG4gICAgdXBkYXRlUHJvZHVjdEF0dHJpYnV0ZXMoZGF0YSkge1xyXG4gICAgICAgIHN1cGVyLnVwZGF0ZVByb2R1Y3RBdHRyaWJ1dGVzKGRhdGEpO1xyXG4gICAgICAgIHRoaXMuc2hvd1Byb2R1Y3RJbWFnZShkYXRhLmltYWdlKTtcclxuICAgIH1cclxufVxyXG4iLCIvKipcclxuICogVmlzdWFsbHkgaGlkZXMgdGhlIG9wdGlvbiBmcm9tIHVzZXIgYnkgbW92aW5nIG9wdGlvbiB0byBhbiBpbnZpc2libGVcclxuICogYW5kIGRpc2FibGVkIHNlbGVjdCBwbGFjZWhvbGRlciBlbGVtZW50LlxyXG4gKlxyXG4gKiBUaGlzIGFwcHJvYWNoIGlzIHJlcXVpcmVkIHJhdGhlciB0aGFuIHNpbXBseSBoaWRpbmcgdGhlIG9wdGlvbiBiZWNhdXNlXHJcbiAqIGhpZGRlbiBvcHRpb24gY2FuIHN0aWxsIGJlIGluY2x1ZGVkIHdoZW4gc2VyaWFsaXplQXJyYXkoKSBpcyBjYWxsZWQgYW5kXHJcbiAqIGNhdXNlIHdyb25nIHZhbHVlIHRvIGJlIHN1Ym1pdHRlZC5cclxuICogKGVnLiBpZiB5b3UgaGF2ZSBvcHRpb24gMSwgMiwgMyBhbmQgMiBpcyBoaWRkZW4sIHdoZW4geW91IHNlbGVjdCAzLFxyXG4gKiBzZXJpYWxpemVBcnJheSgpIHdpbGwgdXNlIHRoZSB2YWx1ZSBvZiAyIGluc3RlYWQgb2YgMylcclxuICovXHJcbmZ1bmN0aW9uIHRvZ2dsZU9wdGlvbihzaG93KSB7XHJcbiAgICBjb25zdCBjdXJyZW50U2VsZWN0RWxlbWVudCA9ICQodGhpcykuY2xvc2VzdCgnc2VsZWN0Jyk7IC8vIHRoZSBzZWxlY3QgY29udGFpbmluZyB0aGlzXHJcbiAgICBsZXQgZGlzYWJsZWRTZWxlY3RFbGVtZW50OyAvLyB0aGUgZGlzYWJsZWQgc2VsZWN0IGVsZW1lbnRcclxuICAgIGxldCBzZWxlY3RFbGVtZW50OyAvLyB0aGUgcmVhbCBzZWxlY3QgZWxlbWVudFxyXG5cclxuICAgIGlmIChjdXJyZW50U2VsZWN0RWxlbWVudC5pcygnOmRpc2FibGVkJykpIHtcclxuICAgICAgICBkaXNhYmxlZFNlbGVjdEVsZW1lbnQgPSBjdXJyZW50U2VsZWN0RWxlbWVudDtcclxuICAgICAgICBzZWxlY3RFbGVtZW50ID0gZGlzYWJsZWRTZWxlY3RFbGVtZW50LmRhdGEoJ2xpbmtlZFNlbGVjdEVsZW1lbnQnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2VsZWN0RWxlbWVudCA9IGN1cnJlbnRTZWxlY3RFbGVtZW50O1xyXG4gICAgICAgIGRpc2FibGVkU2VsZWN0RWxlbWVudCA9IGN1cnJlbnRTZWxlY3RFbGVtZW50LmRhdGEoJ2xpbmtlZFNlbGVjdEVsZW1lbnQnKTtcclxuICAgICAgICBpZiAoIWRpc2FibGVkU2VsZWN0RWxlbWVudCkge1xyXG4gICAgICAgICAgICAvLyBjcmVhdGUgdGhlIGRpc2FibGVkIHBsYWNlaG9sZGVyIHNlbGVjdCBlbGVtZW50XHJcbiAgICAgICAgICAgIGRpc2FibGVkU2VsZWN0RWxlbWVudCA9ICQoJzxzZWxlY3Q+JylcclxuICAgICAgICAgICAgICAgIC5wcm9wKCdkaXNhYmxlZCcsIHRydWUpXHJcbiAgICAgICAgICAgICAgICAuaGlkZSgpXHJcbiAgICAgICAgICAgICAgICAuYXR0cignbmFtZScsIGN1cnJlbnRTZWxlY3RFbGVtZW50LmF0dHIoJ25hbWUnKSlcclxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhjdXJyZW50U2VsZWN0RWxlbWVudC5hdHRyKCdjbGFzcycpKVxyXG4gICAgICAgICAgICAgICAgLmRhdGEoJ2xpbmtlZFNlbGVjdEVsZW1lbnQnLCBzZWxlY3RFbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgLmluc2VydEFmdGVyKHNlbGVjdEVsZW1lbnQpO1xyXG5cclxuICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5kYXRhKCdsaW5rZWRTZWxlY3RFbGVtZW50JywgZGlzYWJsZWRTZWxlY3RFbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2F2ZSB0aGUgc2VsZWN0ZWQgb3B0aW9uXHJcbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IHNlbGVjdEVsZW1lbnQuZmluZCgnb3B0aW9uOnNlbGVjdGVkJyk7XHJcblxyXG4gICAgLy8gbW92ZSB0aGUgb3B0aW9uIHRvIHRoZSBjb3JyZWN0IHNlbGVjdCBlbGVtZW50IGlmIHJlcXVpcmVkXHJcbiAgICBpZiAoY3VycmVudFNlbGVjdEVsZW1lbnQuaXMoJzpkaXNhYmxlZCcpICYmIHNob3cpIHtcclxuICAgICAgICBjb25zdCBwcmV2aW91c0luZGV4ID0gdGhpcy5kYXRhKCdpbmRleCcpO1xyXG4gICAgICAgIGNvbnN0ICRlbGVtZW50Tm93QXRQcmV2aW91c0luZGV4ID0gc2VsZWN0RWxlbWVudC5maW5kKCdvcHRpb24nKS5lcShwcmV2aW91c0luZGV4KTtcclxuXHJcbiAgICAgICAgaWYgKCRlbGVtZW50Tm93QXRQcmV2aW91c0luZGV4Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmluc2VydEJlZm9yZSgkZWxlbWVudE5vd0F0UHJldmlvdXNJbmRleCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJCh0aGlzKS5hcHBlbmRUbyhzZWxlY3RFbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKCFjdXJyZW50U2VsZWN0RWxlbWVudC5pcygnOmRpc2FibGVkJykgJiYgIXNob3cpIHtcclxuICAgICAgICB0aGlzLmRhdGEoJ2luZGV4JywgY3VycmVudFNlbGVjdEVsZW1lbnQuZmluZCgnb3B0aW9uJykuaW5kZXgodGhpcykpO1xyXG4gICAgICAgICQodGhpcykucHJlcGVuZFRvKGRpc2FibGVkU2VsZWN0RWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbWFrZSBzdXJlIHRoZSBvcHRpb24gaXMgc3RpbGwgc2VsZWN0ZWRcclxuICAgIHNlbGVjdGVkT3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7XHJcbn1cclxuXHJcbiQuZm4udG9nZ2xlT3B0aW9uID0gdG9nZ2xlT3B0aW9uO1xyXG4iLCIvKipcclxuICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGFueSBlbXB0eSBzdHJpbmcgdmFsdWVzIGZyb20gdGhlIGZvcm1EYXRhXHJcbiAqIEBwYXJhbSBmb3JtRGF0YTogRm9ybURhdGEgb2JqZWN0XHJcbiAqIEByZXR1cm5zIEZvcm1EYXRhIG9iamVjdFxyXG4qL1xyXG5leHBvcnQgY29uc3QgZmlsdGVyRW1wdHlWYWx1ZXNGcm9tRm9ybSA9IGZvcm1EYXRhID0+IHtcclxuICAgIGNvbnN0IHJlcyA9IG5ldyBGb3JtRGF0YSgpO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIGZvcm1EYXRhKSB7XHJcbiAgICAgICAgICAgIGlmICh2YWwgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICByZXMuYXBwZW5kKGtleSwgdmFsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlcztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80OTY3Mjk5Mi9hamF4LXJlcXVlc3QtZmFpbHMtd2hlbi1zZW5kaW5nLWZvcm1kYXRhLWluY2x1ZGluZy1lbXB0eS1maWxlLWlucHV0LWluLXNhZmFyaVxyXG4gKiBTYWZhcmkgYnJvd3NlciB3aXRoIGpxdWVyeSAzLjMuMSBoYXMgYW4gaXNzdWUgdXBsb2FkaW5nIGVtcHR5IGZpbGUgcGFyYW1ldGVycy4gVGhpcyBmdW5jdGlvbiByZW1vdmVzIGFueSBlbXB0eSBmaWxlcyBmcm9tIHRoZSBmb3JtIHBhcmFtc1xyXG4gKiBAcGFyYW0gZm9ybURhdGE6IEZvcm1EYXRhIG9iamVjdFxyXG4gKiBAcmV0dXJucyBGb3JtRGF0YSBvYmplY3RcclxuICovXHJcbmV4cG9ydCBjb25zdCBmaWx0ZXJFbXB0eUZpbGVzRnJvbUZvcm0gPSBmb3JtRGF0YSA9PiB7XHJcbiAgICBjb25zdCByZXMgPSBuZXcgRm9ybURhdGEoKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBmb3JtRGF0YSkge1xyXG4gICAgICAgICAgICBpZiAoISh2YWwgaW5zdGFuY2VvZiBGaWxlKSB8fCB2YWwubmFtZSB8fCB2YWwuc2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgcmVzLmFwcGVuZChrZXksIHZhbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlcztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgZW1wdHkgc3RyaW5nIHZhbHVlcyBhbmQgZW1wdHkgZmlsZXMgZnJvbSB0aGUgZm9ybURhdGFcclxuICogQHBhcmFtIGZvcm1EYXRhOiBGb3JtRGF0YSBvYmplY3RcclxuICogQHJldHVybnMgRm9ybURhdGEgb2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplRm9ybURhdGEgPSBmb3JtRGF0YSA9PiBmaWx0ZXJFbXB0eVZhbHVlc0Zyb21Gb3JtKGZpbHRlckVtcHR5RmlsZXNGcm9tRm9ybShmb3JtRGF0YSkpO1xyXG4iLCJpbXBvcnQgeyBpc0Jyb3dzZXJJRSB9IGZyb20gJy4vaWUtaGVscGVycyc7XHJcblxyXG5jb25zdCBiYW5uZXJVdGlscyA9IHtcclxuICAgIGRpc3BhdGNoUHJvZHVjdEJhbm5lckV2ZW50OiAocHJvZHVjdEF0dHJpYnV0ZXMpID0+IHtcclxuICAgICAgICBpZiAoIXByb2R1Y3RBdHRyaWJ1dGVzLnByaWNlIHx8IGlzQnJvd3NlcklFKSByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCBwcmljZSA9IDA7XHJcblxyXG4gICAgICAgIGlmICghcHJvZHVjdEF0dHJpYnV0ZXMucHJpY2UucHJpY2VfcmFuZ2UpIHtcclxuICAgICAgICAgICAgaWYgKHByb2R1Y3RBdHRyaWJ1dGVzLnByaWNlLndpdGhvdXRfdGF4KSB7XHJcbiAgICAgICAgICAgICAgICBwcmljZSA9IHByb2R1Y3RBdHRyaWJ1dGVzLnByaWNlLndpdGhvdXRfdGF4LnZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocHJvZHVjdEF0dHJpYnV0ZXMucHJpY2Uud2l0aF90YXgpIHtcclxuICAgICAgICAgICAgICAgIHByaWNlID0gcHJvZHVjdEF0dHJpYnV0ZXMucHJpY2Uud2l0aF90YXgudmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGV2dCA9IG5ldyBDdXN0b21FdmVudCgnYmlnY29tbWVyY2UucHJvZHVjdHByaWNlY2hhbmdlJywge1xyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgIGFtb3VudDogcHJpY2UsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KGV2dCk7XHJcbiAgICB9LFxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgYmFubmVyVXRpbHM7XHJcbiIsImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCBub2QgZnJvbSAnLi4vbm9kJztcclxuaW1wb3J0IGZvcm1zIGZyb20gJy4uL21vZGVscy9mb3Jtcyc7XHJcblxyXG5jb25zdCBpbnB1dFRhZ05hbWVzID0gW1xyXG4gICAgJ2lucHV0JyxcclxuICAgICdzZWxlY3QnLFxyXG4gICAgJ3RleHRhcmVhJyxcclxuXTtcclxuLyoqXHJcbiAqIFNldCB1cCBPYmplY3Qgd2l0aCBFcnJvciBNZXNzYWdlcyBvbiBQYXNzd29yZCBWYWxpZGF0aW9uLiBQbGVhc2UgdXNlIG1lc3NhZ2VzIGluIG1lbnRpb25lZCBvcmRlclxyXG4gKiBAcGFyYW0ge3N0cmluZ30gZW1wdHkgZGVmaW5lcyBlcnJvciB0ZXh0IGZvciBlbXB0eSBmaWVsZFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlybSBkZWZpbmVzIGVycm9yIHRleHQgZm9yIGVtcHR5IGNvbmZpcm1hdGlvbiBmaWVsZFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbWlzbWF0Y2ggZGVmaW5lcyBlcnJvciB0ZXh0IGlmIGNvbmZpcm0gcGFzc2ZvcmQgbWlzbWF0Y2hlcyBwYXNzZm9yZCBmaWVsZFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gaW52YWxpZCBkZWZpbmVzIGVycm9yIHRleHQgZm9yIGludmFsaWQgcGFzc3dvcmQgY2hhcmF0ZXJzIHNlcXVlbmNlXHJcbiAqIEByZXR1cm4ge29iamVjdH0gbWVzc2FnZXMgb3IgZGVmYXVsdCB0ZXh0cyBpZiBub3RoaW5nIGlzIHByb3ZpZGluZ1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNyZWF0ZVBhc3N3b3JkVmFsaWRhdGlvbkVycm9yVGV4dE9iamVjdCA9IChlbXB0eSwgY29uZmlybSwgbWlzbWF0Y2gsIGludmFsaWQpID0+ICh7XHJcbiAgICBvbkVtcHR5UGFzc3dvcmRFcnJvclRleHQ6IGVtcHR5LFxyXG4gICAgb25Db25maXJtUGFzc3dvcmRFcnJvclRleHQ6IGNvbmZpcm0sXHJcbiAgICBvbk1pc21hdGNoUGFzc3dvcmRFcnJvclRleHQ6IG1pc21hdGNoLFxyXG4gICAgb25Ob3RWYWxpZFBhc3N3b3JkRXJyb3JUZXh0OiBpbnZhbGlkLFxyXG59KTtcclxuXHJcblxyXG4vKipcclxuICogQXBwbHkgY2xhc3MgbmFtZSB0byBhbiBpbnB1dCBlbGVtZW50IG9uIGl0cyB0eXBlXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybUZpZWxkQ2xhc3NcclxuICogQHJldHVybiB7b2JqZWN0fSBFbGVtZW50IGl0c2VsZlxyXG4gKi9cclxuZnVuY3Rpb24gY2xhc3NpZnlJbnB1dChpbnB1dCwgZm9ybUZpZWxkQ2xhc3MpIHtcclxuICAgIGNvbnN0ICRpbnB1dCA9ICQoaW5wdXQpO1xyXG4gICAgY29uc3QgJGZvcm1GaWVsZCA9ICRpbnB1dC5wYXJlbnQoYC4ke2Zvcm1GaWVsZENsYXNzfWApO1xyXG4gICAgY29uc3QgdGFnTmFtZSA9ICRpbnB1dC5wcm9wKCd0YWdOYW1lJykudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBsZXQgY2xhc3NOYW1lID0gYCR7Zm9ybUZpZWxkQ2xhc3N9LS0ke3RhZ05hbWV9YDtcclxuICAgIGxldCBzcGVjaWZpY0NsYXNzTmFtZTtcclxuXHJcbiAgICAvLyBJbnB1dCBjYW4gYmUgdGV4dC9jaGVja2JveC9yYWRpbyBldGMuLi5cclxuICAgIGlmICh0YWdOYW1lID09PSAnaW5wdXQnKSB7XHJcbiAgICAgICAgY29uc3QgaW5wdXRUeXBlID0gJGlucHV0LnByb3AoJ3R5cGUnKTtcclxuXHJcbiAgICAgICAgaWYgKF8uaW5jbHVkZXMoWydyYWRpbycsICdjaGVja2JveCcsICdzdWJtaXQnXSwgaW5wdXRUeXBlKSkge1xyXG4gICAgICAgICAgICAvLyBpZTogLmZvcm0tZmllbGQtLWNoZWNrYm94LCAuZm9ybS1maWVsZC0tcmFkaW9cclxuICAgICAgICAgICAgY2xhc3NOYW1lID0gYCR7Zm9ybUZpZWxkQ2xhc3N9LS0ke18uY2FtZWxDYXNlKGlucHV0VHlwZSl9YDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBpZTogLmZvcm0tZmllbGQtLWlucHV0IC5mb3JtLWZpZWxkLS1pbnB1dFRleHRcclxuICAgICAgICAgICAgc3BlY2lmaWNDbGFzc05hbWUgPSBgJHtjbGFzc05hbWV9JHtfLmNhcGl0YWxpemUoaW5wdXRUeXBlKX1gO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBBcHBseSBjbGFzcyBtb2RpZmllclxyXG4gICAgcmV0dXJuICRmb3JtRmllbGRcclxuICAgICAgICAuYWRkQ2xhc3MoY2xhc3NOYW1lKVxyXG4gICAgICAgIC5hZGRDbGFzcyhzcGVjaWZpY0NsYXNzTmFtZSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBseSBjbGFzcyBuYW1lIHRvIGVhY2ggaW5wdXQgZWxlbWVudCBpbiBhIGZvcm0gYmFzZWQgb24gaXRzIHR5cGVcclxuICogQGV4YW1wbGVcclxuICogLy8gQmVmb3JlXHJcbiAqIDxmb3JtIGlkPVwiZm9ybVwiPlxyXG4gKiAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIj5cclxuICogICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIj5cclxuICogICAgIDwvZGl2PlxyXG4gKiAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIj5cclxuICogICAgICAgICA8c2VsZWN0Pi4uLjwvc2VsZWN0PlxyXG4gKiAgICAgPC9kaXY+XHJcbiAqIDwvZm9ybT5cclxuICpcclxuICogY2xhc3NpZnlGb3JtKCcjZm9ybScsIHsgZm9ybUZpZWxkQ2xhc3M6ICdmb3JtLWZpZWxkJyB9KTtcclxuICpcclxuICogLy8gQWZ0ZXJcclxuICogPGRpdiBjbGFzcz1cImZvcm0tZmllbGQgZm9ybS1maWVsZC0taW5wdXQgZm9ybS1maWVsZC0taW5wdXRUZXh0XCI+Li4uPC9kaXY+XHJcbiAqIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkIGZvcm0tZmllbGQtLXNlbGVjdFwiPi4uLjwvZGl2PlxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IGZvcm1TZWxlY3RvciAtIHNlbGVjdG9yIG9yIGVsZW1lbnRcclxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcclxuICogQHJldHVybiB7alF1ZXJ5fSBFbGVtZW50IGl0c2VsZlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5Rm9ybShmb3JtU2VsZWN0b3IsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgY29uc3QgJGZvcm0gPSAkKGZvcm1TZWxlY3Rvcik7XHJcbiAgICBjb25zdCAkaW5wdXRzID0gJGZvcm0uZmluZChpbnB1dFRhZ05hbWVzLmpvaW4oJywgJykpO1xyXG5cclxuICAgIC8vIE9idGFpbiBvcHRpb25zXHJcbiAgICBjb25zdCB7IGZvcm1GaWVsZENsYXNzID0gJ2Zvcm0tZmllbGQnIH0gPSBvcHRpb25zO1xyXG5cclxuICAgIC8vIENsYXNzaWZ5IGVhY2ggaW5wdXQgaW4gYSBmb3JtXHJcbiAgICAkaW5wdXRzLmVhY2goKF9fLCBpbnB1dCkgPT4ge1xyXG4gICAgICAgIGNsYXNzaWZ5SW5wdXQoaW5wdXQsIGZvcm1GaWVsZENsYXNzKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiAkZm9ybTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldCBpZCBmcm9tIGdpdmVuIGZpZWxkXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSAkZmllbGQgSlF1ZXJ5IGZpZWxkIG9iamVjdFxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRGaWVsZElkKCRmaWVsZCkge1xyXG4gICAgY29uc3QgZmllbGRJZCA9ICRmaWVsZC5wcm9wKCduYW1lJykubWF0Y2goLyhcXFsuKlxcXSkvKTtcclxuXHJcbiAgICBpZiAoZmllbGRJZCAmJiBmaWVsZElkLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICAgIHJldHVybiBmaWVsZElkWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAnJztcclxufVxyXG5cclxuLyoqXHJcbiAqIEluc2VydCBoaWRkZW4gZmllbGQgYWZ0ZXIgU3RhdGUvUHJvdmluY2UgZmllbGRcclxuICogQHBhcmFtIHtvYmplY3R9ICRzdGF0ZUZpZWxkIEpRdWVyeSBmaWVsZCBvYmplY3RcclxuICovXHJcbmZ1bmN0aW9uIGluc2VydFN0YXRlSGlkZGVuRmllbGQoJHN0YXRlRmllbGQpIHtcclxuICAgIGNvbnN0IGZpZWxkSWQgPSBnZXRGaWVsZElkKCRzdGF0ZUZpZWxkKTtcclxuICAgIGNvbnN0IHN0YXRlRmllbGRBdHRycyA9IHtcclxuICAgICAgICB0eXBlOiAnaGlkZGVuJyxcclxuICAgICAgICBuYW1lOiBgRm9ybUZpZWxkSXNUZXh0JHtmaWVsZElkfWAsXHJcbiAgICAgICAgdmFsdWU6ICcxJyxcclxuICAgIH07XHJcblxyXG4gICAgJHN0YXRlRmllbGQuYWZ0ZXIoJCgnPGlucHV0IC8+Jywgc3RhdGVGaWVsZEF0dHJzKSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBbm5vdW5jZSBmb3JtIGlucHV0IGVycm9yIG1lc3NhZ2UgYnkgc2NyZWVuIHJlYWRlclxyXG4gKiBAcGFyYW0ge3BhcmFtcy5lbGVtZW50fSBkb20gaW5wdXQgZWxlbWVudCB3aGVyZSBjaGVja2luZyBpcyBoYXBwZW5lZFxyXG4gKiBAcGFyYW0ge3BhcmFtcy5yZXN1bHR9IHJlc3VsdCBvZiB2YWxpZGF0aW9uIGNoZWNrXHJcbiAqL1xyXG5mdW5jdGlvbiBhbm5vdW5jZUlucHV0RXJyb3JNZXNzYWdlKHsgZWxlbWVudCwgcmVzdWx0IH0pIHtcclxuICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBhY3RpdmVJbnB1dENvbnRhaW5lciA9ICQoZWxlbWVudCkucGFyZW50KCk7XHJcbiAgICAvLyB0aGUgcmVhc29uIGZvciB1c2luZyBzcGFuIHRhZyBpcyBub2QtdmFsaWRhdGUgbGliXHJcbiAgICAvLyB3aGljaCBkb2VzIG5vdCBhZGQgZXJyb3IgbWVzc2FnZSBjbGFzcyB3aGlsZSBpbml0aWFsaXNpbmcgZm9ybS5cclxuICAgIC8vIHNwZWNpZmljIGNsYXNzIGlzIGFkZGVkIHNpbmNlIGl0IGNhbiBiZSBtdWx0aXBsZSBzcGFuc1xyXG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gJChhY3RpdmVJbnB1dENvbnRhaW5lcikuZmluZCgnc3Bhbi5mb3JtLWlubGluZU1lc3NhZ2UnKTtcclxuXHJcbiAgICBpZiAoZXJyb3JNZXNzYWdlLmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0ICRlcnJNZXNzYWdlID0gJChlcnJvck1lc3NhZ2VbMF0pO1xyXG5cclxuICAgICAgICBpZiAoISRlcnJNZXNzYWdlLmF0dHIoJ3JvbGUnKSkge1xyXG4gICAgICAgICAgICAkZXJyTWVzc2FnZS5hdHRyKCdyb2xlJywgJ2FsZXJ0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBWYWxpZGF0b3JzID0ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHVwIGEgbmV3IHZhbGlkYXRpb24gd2hlbiB0aGUgZm9ybSBpcyBkaXJ0eVxyXG4gICAgICogQHBhcmFtIHZhbGlkYXRvclxyXG4gICAgICogQHBhcmFtIGZpZWxkXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXJyb3JUZXh0IGRlc2NyaWJlcyBlcnJvck1hc3NhZ2Ugb24gZW1haWwgdmFsaWRhdGlvblxyXG4gICAgICovXHJcbiAgICBzZXRFbWFpbFZhbGlkYXRpb246ICh2YWxpZGF0b3IsIGZpZWxkLCBlcnJvclRleHQpID0+IHtcclxuICAgICAgICBpZiAoZmllbGQpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9yLmFkZCh7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogZmllbGQsXHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZTogKGNiLCB2YWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmb3Jtcy5lbWFpbCh2YWwpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYihyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyb3JUZXh0LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhdGUgcGFzc3dvcmQgZmllbGRzXHJcbiAgICAgKiBAcGFyYW0gdmFsaWRhdG9yXHJcbiAgICAgKiBAcGFyYW0gcGFzc3dvcmRTZWxlY3RvclxyXG4gICAgICogQHBhcmFtIHBhc3N3b3JkMlNlbGVjdG9yXHJcbiAgICAgKiBAcGFyYW0gcmVxdWlyZW1lbnRzXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXJyb3JUZXh0c09iamVjdFxyXG4gICAgICogQHBhcmFtIGlzT3B0aW9uYWxcclxuICAgICAqL1xyXG4gICAgc2V0UGFzc3dvcmRWYWxpZGF0aW9uOiAodmFsaWRhdG9yLCBwYXNzd29yZFNlbGVjdG9yLCBwYXNzd29yZDJTZWxlY3RvciwgcmVxdWlyZW1lbnRzLCB7XHJcbiAgICAgICAgb25FbXB0eVBhc3N3b3JkRXJyb3JUZXh0LCBvbkNvbmZpcm1QYXNzd29yZEVycm9yVGV4dCwgb25NaXNtYXRjaFBhc3N3b3JkRXJyb3JUZXh0LCBvbk5vdFZhbGlkUGFzc3dvcmRFcnJvclRleHQsXHJcbiAgICB9LCBpc09wdGlvbmFsKSA9PiB7XHJcbiAgICAgICAgY29uc3QgJHBhc3N3b3JkID0gJChwYXNzd29yZFNlbGVjdG9yKTtcclxuICAgICAgICBjb25zdCBwYXNzd29yZFZhbGlkYXRpb25zID0gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogcGFzc3dvcmRTZWxlY3RvcixcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRlOiAoY2IsIHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbC5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc09wdGlvbmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYih0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNiKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBvbkVtcHR5UGFzc3dvcmRFcnJvclRleHQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBwYXNzd29yZFNlbGVjdG9yLFxyXG4gICAgICAgICAgICAgICAgdmFsaWRhdGU6IChjYiwgdmFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdmFsLm1hdGNoKG5ldyBSZWdFeHAocmVxdWlyZW1lbnRzLmFscGhhKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgdmFsLm1hdGNoKG5ldyBSZWdFeHAocmVxdWlyZW1lbnRzLm51bWVyaWMpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiB2YWwubGVuZ3RoID49IHJlcXVpcmVtZW50cy5taW5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIG9wdGlvbmFsIGFuZCBub3RoaW5nIGVudGVyZWQsIGl0IGlzIHZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzT3B0aW9uYWwgJiYgdmFsLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2IodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYihyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogb25Ob3RWYWxpZFBhc3N3b3JkRXJyb3JUZXh0LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogcGFzc3dvcmQyU2VsZWN0b3IsXHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZTogKGNiLCB2YWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB2YWwubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNPcHRpb25hbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2IodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYihyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogb25Db25maXJtUGFzc3dvcmRFcnJvclRleHQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBwYXNzd29yZDJTZWxlY3RvcixcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRlOiAoY2IsIHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbCA9PT0gJHBhc3N3b3JkLnZhbCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYihyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogb25NaXNtYXRjaFBhc3N3b3JkRXJyb3JUZXh0LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIHZhbGlkYXRvci5hZGQocGFzc3dvcmRWYWxpZGF0aW9ucyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhdGUgcGFzc3dvcmQgZmllbGRzXHJcbiAgICAgKiBAcGFyYW0ge05vZH0gdmFsaWRhdG9yXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc2VsZWN0b3JzXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JzLmVycm9yU2VsZWN0b3JcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcnMuZmllbGRzZXRTZWxlY3RvclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9ycy5mb3JtU2VsZWN0b3JcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcnMubWF4UHJpY2VTZWxlY3RvclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9ycy5taW5QcmljZVNlbGVjdG9yXHJcbiAgICAgKi9cclxuICAgIHNldE1pbk1heFByaWNlVmFsaWRhdGlvbjogKHZhbGlkYXRvciwgc2VsZWN0b3JzLCBwcmljZVZhbGlkYXRpb25FcnJvclRleHRzID0ge30pID0+IHtcclxuICAgICAgICBjb25zdCB7XHJcbiAgICAgICAgICAgIGVycm9yU2VsZWN0b3IsXHJcbiAgICAgICAgICAgIGZpZWxkc2V0U2VsZWN0b3IsXHJcbiAgICAgICAgICAgIGZvcm1TZWxlY3RvcixcclxuICAgICAgICAgICAgbWF4UHJpY2VTZWxlY3RvcixcclxuICAgICAgICAgICAgbWluUHJpY2VTZWxlY3RvcixcclxuICAgICAgICB9ID0gc2VsZWN0b3JzO1xyXG5cclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JqZWN0LWN1cmx5LW5ld2xpbmVcclxuICAgICAgICBjb25zdCB7IG9uTWluUHJpY2VFcnJvciwgb25NYXhQcmljZUVycm9yLCBtaW5QcmljZU5vdEVudGVyZWQsIG1heFByaWNlTm90RW50ZXJlZCwgb25JbnZhbGlkUHJpY2UgfSA9IHByaWNlVmFsaWRhdGlvbkVycm9yVGV4dHM7XHJcblxyXG4gICAgICAgIHZhbGlkYXRvci5jb25maWd1cmUoe1xyXG4gICAgICAgICAgICBmb3JtOiBmb3JtU2VsZWN0b3IsXHJcbiAgICAgICAgICAgIHByZXZlbnRTdWJtaXQ6IHRydWUsXHJcbiAgICAgICAgICAgIHN1Y2Nlc3NDbGFzczogJ18nLCAvLyBLTFVER0U6IERvbid0IGFwcGx5IHN1Y2Nlc3MgY2xhc3NcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdmFsaWRhdG9yLmFkZCh7XHJcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZTogb25NaW5QcmljZUVycm9yLFxyXG4gICAgICAgICAgICBzZWxlY3RvcjogbWluUHJpY2VTZWxlY3RvcixcclxuICAgICAgICAgICAgdmFsaWRhdGU6IGBtaW4tbWF4OiR7bWluUHJpY2VTZWxlY3Rvcn06JHttYXhQcmljZVNlbGVjdG9yfWAsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHZhbGlkYXRvci5hZGQoe1xyXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6IG9uTWF4UHJpY2VFcnJvcixcclxuICAgICAgICAgICAgc2VsZWN0b3I6IG1heFByaWNlU2VsZWN0b3IsXHJcbiAgICAgICAgICAgIHZhbGlkYXRlOiBgbWluLW1heDoke21pblByaWNlU2VsZWN0b3J9OiR7bWF4UHJpY2VTZWxlY3Rvcn1gLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB2YWxpZGF0b3IuYWRkKHtcclxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBtYXhQcmljZU5vdEVudGVyZWQsXHJcbiAgICAgICAgICAgIHNlbGVjdG9yOiBtYXhQcmljZVNlbGVjdG9yLFxyXG4gICAgICAgICAgICB2YWxpZGF0ZTogJ3ByZXNlbmNlJyxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdmFsaWRhdG9yLmFkZCh7XHJcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZTogbWluUHJpY2VOb3RFbnRlcmVkLFxyXG4gICAgICAgICAgICBzZWxlY3RvcjogbWluUHJpY2VTZWxlY3RvcixcclxuICAgICAgICAgICAgdmFsaWRhdGU6ICdwcmVzZW5jZScsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHZhbGlkYXRvci5hZGQoe1xyXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6IG9uSW52YWxpZFByaWNlLFxyXG4gICAgICAgICAgICBzZWxlY3RvcjogW21pblByaWNlU2VsZWN0b3IsIG1heFByaWNlU2VsZWN0b3JdLFxyXG4gICAgICAgICAgICB2YWxpZGF0ZTogJ21pbi1udW1iZXI6MCcsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHZhbGlkYXRvci5zZXRNZXNzYWdlT3B0aW9ucyh7XHJcbiAgICAgICAgICAgIHNlbGVjdG9yOiBbbWluUHJpY2VTZWxlY3RvciwgbWF4UHJpY2VTZWxlY3Rvcl0sXHJcbiAgICAgICAgICAgIHBhcmVudDogZmllbGRzZXRTZWxlY3RvcixcclxuICAgICAgICAgICAgZXJyb3JTcGFuOiBlcnJvclNlbGVjdG9yLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdXAgYSBuZXcgdmFsaWRhdGlvbiB3aGVuIHRoZSBmb3JtIGlzIGRpcnR5XHJcbiAgICAgKiBAcGFyYW0gdmFsaWRhdG9yXHJcbiAgICAgKiBAcGFyYW0gZmllbGRcclxuICAgICAqL1xyXG4gICAgc2V0U3RhdGVDb3VudHJ5VmFsaWRhdGlvbjogKHZhbGlkYXRvciwgZmllbGQsIGVycm9yVGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChmaWVsZCkge1xyXG4gICAgICAgICAgICB2YWxpZGF0b3IuYWRkKHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBmaWVsZCxcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRlOiAncHJlc2VuY2UnLFxyXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvclRleHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGNsYXNzZXMgZnJvbSBkaXJ0eSBmb3JtIGlmIHByZXZpb3VzbHkgY2hlY2tlZFxyXG4gICAgICogQHBhcmFtIGZpZWxkXHJcbiAgICAgKi9cclxuICAgIGNsZWFuVXBTdGF0ZVZhbGlkYXRpb246IChmaWVsZCkgPT4ge1xyXG4gICAgICAgIGNvbnN0ICRmaWVsZENsYXNzRWxlbWVudCA9ICQoKGBbZGF0YS10eXBlPVwiJHtmaWVsZC5kYXRhKCdmaWVsZFR5cGUnKX1cIl1gKSk7XHJcblxyXG4gICAgICAgIE9iamVjdC5rZXlzKG5vZC5jbGFzc2VzKS5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoJGZpZWxkQ2xhc3NFbGVtZW50Lmhhc0NsYXNzKG5vZC5jbGFzc2VzW3ZhbHVlXSkpIHtcclxuICAgICAgICAgICAgICAgICRmaWVsZENsYXNzRWxlbWVudC5yZW1vdmVDbGFzcyhub2QuY2xhc3Nlc1t2YWx1ZV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LFxyXG59O1xyXG5cclxuZXhwb3J0IHsgVmFsaWRhdG9ycywgaW5zZXJ0U3RhdGVIaWRkZW5GaWVsZCwgYW5ub3VuY2VJbnB1dEVycm9yTWVzc2FnZSB9O1xyXG4iLCJleHBvcnQgY29uc3QgaXNCcm93c2VySUUgPSAhIWRvY3VtZW50LmRvY3VtZW50TW9kZTtcclxuXHJcbmV4cG9ydCBjb25zdCBjb252ZXJ0SW50b0FycmF5ID0gY29sbGVjdGlvbiA9PiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjb2xsZWN0aW9uKTtcclxuIiwiY29uc3QgY2hhbmdlV2lzaGxpc3RQYWdpbmF0aW9uTGlua3MgPSAod2lzaGxpc3RVcmwsIC4uLnBhZ2luYXRpb25JdGVtcykgPT4gJC5lYWNoKHBhZ2luYXRpb25JdGVtcywgKF8sICRpdGVtKSA9PiB7XHJcbiAgICBjb25zdCBwYWdpbmF0aW9uTGluayA9ICRpdGVtLmNoaWxkcmVuKCcucGFnaW5hdGlvbi1saW5rJyk7XHJcblxyXG4gICAgaWYgKCRpdGVtLmxlbmd0aCAmJiAhcGFnaW5hdGlvbkxpbmsuYXR0cignaHJlZicpLmluY2x1ZGVzKCdwYWdlPScpKSB7XHJcbiAgICAgICAgY29uc3QgcGFnZU51bWJlciA9IHBhZ2luYXRpb25MaW5rLmF0dHIoJ2hyZWYnKTtcclxuICAgICAgICBwYWdpbmF0aW9uTGluay5hdHRyKCdocmVmJywgYCR7d2lzaGxpc3RVcmx9cGFnZT0ke3BhZ2VOdW1iZXJ9YCk7XHJcbiAgICB9XHJcbn0pO1xyXG5cclxuLyoqXHJcbiAqIGhlbHBzIHRvIHdpdGhkcmF3IGRpZmZlcmVuY2VzIGluIHN0cnVjdHVyZXMgYXJvdW5kIHRoZSBzdGVuY2lsIHJlc291cmNlIHBhZ2luYXRpb25cclxuICovXHJcbmV4cG9ydCBjb25zdCB3aXNobGlzdFBhZ2luYXRvckhlbHBlciA9ICgpID0+IHtcclxuICAgIGNvbnN0ICRwYWdpbmF0aW9uTGlzdCA9ICQoJy5wYWdpbmF0aW9uLWxpc3QnKTtcclxuXHJcbiAgICBpZiAoISRwYWdpbmF0aW9uTGlzdC5sZW5ndGgpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCAkbmV4dEl0ZW0gPSAkKCcucGFnaW5hdGlvbi1pdGVtLS1uZXh0JywgJHBhZ2luYXRpb25MaXN0KTtcclxuICAgIGNvbnN0ICRwcmV2SXRlbSA9ICQoJy5wYWdpbmF0aW9uLWl0ZW0tLXByZXZpb3VzJywgJHBhZ2luYXRpb25MaXN0KTtcclxuICAgIGNvbnN0IGN1cnJlbnRIcmVmID0gJCgnW2RhdGEtcGFnaW5hdGlvbi1jdXJyZW50LXBhZ2UtbGlua10nKS5hdHRyKCdocmVmJyk7XHJcbiAgICBjb25zdCBwYXJ0aWFsUGFnaW5hdGlvblVybCA9IGN1cnJlbnRIcmVmLnNwbGl0KCdwYWdlPScpLnNoaWZ0KCk7XHJcblxyXG4gICAgY2hhbmdlV2lzaGxpc3RQYWdpbmF0aW9uTGlua3MocGFydGlhbFBhZ2luYXRpb25VcmwsICRwcmV2SXRlbSwgJG5leHRJdGVtKTtcclxufTtcclxuIiwiLyoqXHJcbiAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIEhUTUwgZW50aXRpZXMgaW4gc3RyaW5nc1xyXG4gKiBAcGFyYW0gc3RyOiBTdHJpbmdcclxuICogQHJldHVybnMgU3RyaW5nXHJcbiovXHJcbmV4cG9ydCBjb25zdCBzYWZlU3RyaW5nID0gKHN0cikgPT4ge1xyXG4gICAgY29uc3QgZCA9IG5ldyBET01QYXJzZXIoKTtcclxuICAgIHJldHVybiBkLnBhcnNlRnJvbVN0cmluZyhzdHIsICd0ZXh0L2h0bWwnKS5ib2R5LnRleHRDb250ZW50O1xyXG59O1xyXG4iLCJpbXBvcnQgVXJsIGZyb20gJ3VybCc7XHJcblxyXG5jb25zdCB1cmxVdGlscyA9IHtcclxuICAgIGdldFVybDogKCkgPT4gYCR7d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lfSR7d2luZG93LmxvY2F0aW9uLnNlYXJjaH1gLFxyXG5cclxuICAgIGdvVG9Vcmw6ICh1cmwpID0+IHtcclxuICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoe30sIGRvY3VtZW50LnRpdGxlLCB1cmwpO1xyXG4gICAgICAgICQod2luZG93KS50cmlnZ2VyKCdzdGF0ZWNoYW5nZScpO1xyXG4gICAgfSxcclxuXHJcbiAgICByZXBsYWNlUGFyYW1zOiAodXJsLCBwYXJhbXMpID0+IHtcclxuICAgICAgICBjb25zdCBwYXJzZWQgPSBVcmwucGFyc2UodXJsLCB0cnVlKTtcclxuICAgICAgICBsZXQgcGFyYW07XHJcblxyXG4gICAgICAgIC8vIExldCB0aGUgZm9ybWF0dGVyIHVzZSB0aGUgcXVlcnkgb2JqZWN0IHRvIGJ1aWxkIHRoZSBuZXcgdXJsXHJcbiAgICAgICAgcGFyc2VkLnNlYXJjaCA9IG51bGw7XHJcblxyXG4gICAgICAgIGZvciAocGFyYW0gaW4gcGFyYW1zKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMuaGFzT3duUHJvcGVydHkocGFyYW0pKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJzZWQucXVlcnlbcGFyYW1dID0gcGFyYW1zW3BhcmFtXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFVybC5mb3JtYXQocGFyc2VkKTtcclxuICAgIH0sXHJcblxyXG4gICAgYnVpbGRRdWVyeVN0cmluZzogKHF1ZXJ5RGF0YSkgPT4ge1xyXG4gICAgICAgIGxldCBvdXQgPSAnJztcclxuICAgICAgICBsZXQga2V5O1xyXG4gICAgICAgIGZvciAoa2V5IGluIHF1ZXJ5RGF0YSkge1xyXG4gICAgICAgICAgICBpZiAocXVlcnlEYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHF1ZXJ5RGF0YVtrZXldKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZHg7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobmR4IGluIHF1ZXJ5RGF0YVtrZXldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeURhdGFba2V5XS5oYXNPd25Qcm9wZXJ0eShuZHgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gYCYke2tleX09JHtxdWVyeURhdGFba2V5XVtuZHhdfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG91dCArPSBgJiR7a2V5fT0ke3F1ZXJ5RGF0YVtrZXldfWA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvdXQuc3Vic3RyaW5nKDEpO1xyXG4gICAgfSxcclxuXHJcbiAgICBwYXJzZVF1ZXJ5UGFyYW1zOiAocXVlcnlEYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge307XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVlcnlEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRlbXAgPSBxdWVyeURhdGFbaV0uc3BsaXQoJz0nKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0ZW1wWzBdIGluIHBhcmFtcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zW3RlbXBbMF1dKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1t0ZW1wWzBdXS5wdXNoKHRlbXBbMV0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXNbdGVtcFswXV0gPSBbcGFyYW1zW3RlbXBbMF1dLCB0ZW1wWzFdXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtc1t0ZW1wWzBdXSA9IHRlbXBbMV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwYXJhbXM7XHJcbiAgICB9LFxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgdXJsVXRpbHM7XHJcbiIsImltcG9ydCAnZm9jdXMtd2l0aGluLXBvbHlmaWxsJztcclxuXHJcbmltcG9ydCAnLi9nbG9iYWwvanF1ZXJ5LW1pZ3JhdGUnO1xyXG5pbXBvcnQgJy4vY29tbW9uL3NlbGVjdC1vcHRpb24tcGx1Z2luJztcclxuaW1wb3J0IFBhZ2VNYW5hZ2VyIGZyb20gJy4vcGFnZS1tYW5hZ2VyJztcclxuaW1wb3J0IHF1aWNrU2VhcmNoIGZyb20gJy4vZ2xvYmFsL3F1aWNrLXNlYXJjaCc7XHJcbmltcG9ydCBjdXJyZW5jeVNlbGVjdG9yIGZyb20gJy4vZ2xvYmFsL2N1cnJlbmN5LXNlbGVjdG9yJztcclxuaW1wb3J0IG1vYmlsZU1lbnVUb2dnbGUgZnJvbSAnLi9nbG9iYWwvbW9iaWxlLW1lbnUtdG9nZ2xlJztcclxuaW1wb3J0IG1lbnUgZnJvbSAnLi9nbG9iYWwvbWVudSc7XHJcbmltcG9ydCBmb3VuZGF0aW9uIGZyb20gJy4vZ2xvYmFsL2ZvdW5kYXRpb24nO1xyXG5pbXBvcnQgcXVpY2tWaWV3IGZyb20gJy4vZ2xvYmFsL3F1aWNrLXZpZXcnO1xyXG5pbXBvcnQgY2FydFByZXZpZXcgZnJvbSAnLi9nbG9iYWwvY2FydC1wcmV2aWV3JztcclxuaW1wb3J0IHByaXZhY3lDb29raWVOb3RpZmljYXRpb24gZnJvbSAnLi9nbG9iYWwvY29va2llTm90aWZpY2F0aW9uJztcclxuaW1wb3J0IGFkbWluQmFyIGZyb20gJy4vZ2xvYmFsL2FkbWluQmFyJztcclxuaW1wb3J0IGNhcm91c2VsIGZyb20gJy4vY29tbW9uL2Nhcm91c2VsJztcclxuaW1wb3J0IGxvYWRpbmdQcm9ncmVzc0JhciBmcm9tICcuL2dsb2JhbC9sb2FkaW5nLXByb2dyZXNzLWJhcic7XHJcbmltcG9ydCBzdmdJbmplY3RvciBmcm9tICcuL2dsb2JhbC9zdmctaW5qZWN0b3InO1xyXG5pbXBvcnQgcm9vdHNMb2FkZWQgZnJvbSAnLi9yb290cy9nbG9iYWwnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2xvYmFsIGV4dGVuZHMgUGFnZU1hbmFnZXIge1xyXG4gICAgb25SZWFkeSgpIHtcclxuICAgICAgICBjb25zdCB7XHJcbiAgICAgICAgICAgIGNoYW5uZWxJZCwgY2FydElkLCBwcm9kdWN0SWQsIGNhdGVnb3J5SWQsIHNlY3VyZUJhc2VVcmwsIG1haW50ZW5hbmNlTW9kZVNldHRpbmdzLCBhZG1pbkJhckxhbmd1YWdlLFxyXG4gICAgICAgIH0gPSB0aGlzLmNvbnRleHQ7XHJcbiAgICAgICAgY2FydFByZXZpZXcoc2VjdXJlQmFzZVVybCwgY2FydElkKTtcclxuICAgICAgICBxdWlja1NlYXJjaCgpO1xyXG4gICAgICAgIGN1cnJlbmN5U2VsZWN0b3IoY2FydElkKTtcclxuICAgICAgICBmb3VuZGF0aW9uKCQoZG9jdW1lbnQpKTtcclxuICAgICAgICBxdWlja1ZpZXcodGhpcy5jb250ZXh0KTtcclxuICAgICAgICBjYXJvdXNlbCh0aGlzLmNvbnRleHQpO1xyXG4gICAgICAgIG1lbnUoKTtcclxuICAgICAgICBtb2JpbGVNZW51VG9nZ2xlKCk7XHJcbiAgICAgICAgcHJpdmFjeUNvb2tpZU5vdGlmaWNhdGlvbigpO1xyXG4gICAgICAgIGFkbWluQmFyKHNlY3VyZUJhc2VVcmwsIGNoYW5uZWxJZCwgbWFpbnRlbmFuY2VNb2RlU2V0dGluZ3MsIEpTT04ucGFyc2UoYWRtaW5CYXJMYW5ndWFnZSksIHByb2R1Y3RJZCwgY2F0ZWdvcnlJZCk7XHJcbiAgICAgICAgbG9hZGluZ1Byb2dyZXNzQmFyKCk7XHJcbiAgICAgICAgc3ZnSW5qZWN0b3IoKTtcclxuICAgICAgICBcclxuICAgICAgICByb290c0xvYWRlZCgpO1xyXG4gICAgfVxyXG59XHJcbiIsIi8qKlxyXG4gKiBQZXJzaXN0ZW50IGFkbWluIGJhciBmb3Igc3RvcmUgYWRtaW5pc3RyYXRvcnMgdmlld2luZyB0aGUgc3RvcmVmcm9udFxyXG4gKiBAcGFyYW0gbWFpbnRlbmFuY2VNb2RlXHJcbiAqIEBwYXJhbSBzZWN1cmVCYXNlVXJsXHJcbiAqIEBwYXJhbSBjaGFubmVsSWRcclxuICogQHBhcmFtIGFkbWluQmFyTGFuZ3VhZ2VcclxuICogQHBhcmFtIHByb2R1Y3RJZFxyXG4gKiBAcGFyYW0gY2F0ZWdvcnlJZFxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHNlY3VyZUJhc2VVcmwsIGNoYW5uZWxJZCA9IDEsIG1haW50ZW5hbmNlTW9kZSA9IHt9LCBhZG1pbkJhckxhbmd1YWdlLCBwcm9kdWN0SWQsIGNhdGVnb3J5SWQpIHtcclxuICAgIGNvbnN0IGxhbmcgPSBhZG1pbkJhckxhbmd1YWdlLnRyYW5zbGF0aW9ucztcclxuICAgIGNvbnN0IHBhc3N3b3JkID0gbWFpbnRlbmFuY2VNb2RlLnBhc3N3b3JkIHx8IGZhbHNlO1xyXG4gICAgY29uc3QgaXNNYWludGVuYW5jZU1vZGUgPSAobWFpbnRlbmFuY2VNb2RlLmhlYWRlciAmJiAhcGFzc3dvcmQpIHx8IGZhbHNlO1xyXG5cclxuICAgIGZ1bmN0aW9uIGlzSW5JZnJhbWUoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbiAhPT0gd2luZG93LnBhcmVudC5sb2NhdGlvbjtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XHJcbiAgICBmdW5jdGlvbiBnZXRDb250ZXh0dWFsTWF0Y2gocHJvZHVjdElkLCBjYXRlZ29yeUlkKSB7XHJcbiAgICAgICAgaWYgKHByb2R1Y3RJZCAmJiBwYXJzZUludChwcm9kdWN0SWQsIDEwKSkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ3Byb2R1Y3QnLFxyXG4gICAgICAgICAgICAgICAgdXJsOiBgL21hbmFnZS9wcm9kdWN0cy8ke3Byb2R1Y3RJZH0vZWRpdGAsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIGlmIChjYXRlZ29yeUlkICYmIHBhcnNlSW50KGNhdGVnb3J5SWQsIDEwKSkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2NhdGVnb3J5JyxcclxuICAgICAgICAgICAgICAgIHVybDogYC9tYW5hZ2UvcHJvZHVjdHMvY2F0ZWdvcmllcy8ke2NhdGVnb3J5SWR9L2VkaXRgLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkb2VzTm90SGF2ZUFkbWluQ29va2llKCkge1xyXG4gICAgICAgIHJldHVybiBkb2N1bWVudC5jb29raWUuaW5kZXhPZignQURNSU5fQkFSPTEnKSA9PT0gLTE7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2V0IGFkbWluIGNvb2tpZSBpZiBhcHByb3ByaWF0ZVxyXG4gICAgaWYgKHdpbmRvdy5VUkxTZWFyY2hQYXJhbXMgJiYgd2luZG93LlVSTCAmJiAobmV3IFVSTChkb2N1bWVudC5sb2NhdGlvbikpLnNlYXJjaFBhcmFtcy5nZXQoJ2N0aycpKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuY29va2llID0gJ0FETUlOX0JBUj0xOyBwYXRoPS8nO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBSZXR1cm4gaWYgaXNJbklmcmFtZSBpcyB0cnVlIChpbnNpZGUgcGFnZSBidWlsZGVyKSBvciBpZiB0aGVyZSBpcyBubyBhZG1pbiBjb29raWVcclxuICAgIGlmIChkb2VzTm90SGF2ZUFkbWluQ29va2llKCkgfHwgaXNJbklmcmFtZSgpKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVybCA9IGVuY29kZVVSSUNvbXBvbmVudCgobmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5yZXBsYWNlKC9eXFwvfFxcLyQvZywgJycpKTtcclxuICAgIGNvbnN0IGNvbnRleHR1YWxNYXRjaCA9IGdldENvbnRleHR1YWxNYXRjaChwcm9kdWN0SWQsIGNhdGVnb3J5SWQpO1xyXG5cclxuICAgIGNvbnN0ICRlbGVtZW50ID0gJCgnPGRpdj4nLCB7XHJcbiAgICAgICAgY2xhc3M6ICdhZG1pbkJhcicsXHJcbiAgICB9KTtcclxuXHJcbiAgICAkZWxlbWVudC5odG1sKGA8ZGl2IGNsYXNzPVwiYWRtaW5CYXItbG9nb1wiPlxyXG4gICAgICAgIDxhIGhyZWY9XCIke3NlY3VyZUJhc2VVcmx9L21hbmFnZS9kYXNoYm9hcmRcIj48c3ZnPjx1c2UgeGxpbms6aHJlZj1cIiNpY29uLWxvZ28tc21hbGxcIj48L3VzZT48L3N2Zz48L2E+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFkbWluQmFyLWNvbnRlbnRcIj5cclxuICAgICAgICAke3Bhc3N3b3JkID9cclxuICAgICAgICBgPGRpdiBjbGFzcz1cImFkbWluQmFyLXByaXZhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInByZXZpZXdcIj4ke2xhbmdbJ2FkbWluLnByZWxhdW5jaF9oZWFkZXInXX0gPHN0cm9uZz4ke3Bhc3N3b3JkfTwvc3Ryb25nPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PmAgOiAnJ31cclxuICAgICAgICAke2lzTWFpbnRlbmFuY2VNb2RlID9cclxuICAgICAgICBgPGRpdiBjbGFzcz1cImFkbWluQmFyLXByaXZhdGVcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPiR7bGFuZ1snYWRtaW4ubWFpbnRlbmFuY2VfaGVhZGVyJ119PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctYmFzZWxpbmUgYWRtaW5CYXItbGFyZ2UgdG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmc+PHVzZSB4bGluazpocmVmPVwiI2ljb24tYWRtaW4tdG9vbHRpcFwiPjwvdXNlPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9vbHRpcHRleHQgdG9vbHRpcC1ib3R0b21cIj4ke2xhbmdbJ2FkbWluLm1haW50ZW5hbmNlX3Rvb2x0aXAnXX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiP3Nob3dTdG9yZT1ub1wiIGNsYXNzPVwiYWRtaW5CYXItbGFyZ2VcIj4ke2xhbmdbJ2FkbWluLm1haW50ZW5hbmNlX3Nob3dzdG9yZV9saW5rJ119IDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWJhc2VsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBzdHlsZT1cImhlaWdodDogMC44ZW07XCI+PHVzZSB4bGluazpocmVmPVwiI2ljb24tYWRtaW4tbGlua1wiPjwvdXNlPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPjwvYT5cclxuICAgICAgICAgPC9kaXY+YCA6ICcnfVxyXG4gICAgICAgICA8ZGl2IGNsYXNzPVwiYWRtaW5CYXItbGlua3NcIj5cclxuICAgICAgICAgICAgJHtjb250ZXh0dWFsTWF0Y2ggPyBgPGEgaHJlZj0nJHtzZWN1cmVCYXNlVXJsfSR7Y29udGV4dHVhbE1hdGNoLnVybH0nIHRhcmdldD1cIl9ibGFua1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctYmFzZWxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnPjx1c2UgeGxpbms6aHJlZj1cIiNpY29uLWFkbWluLWVkaXRcIj48L3VzZT48L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj48c3BhbiBjbGFzcz1cImFkbWluQmFyLWxhcmdlXCI+IEVkaXQgJHtjb250ZXh0dWFsTWF0Y2gudHlwZX0gaW5mb3JtYXRpb248L3NwYW4+PC9hPmAgOiAnJ31cclxuICAgICAgICAgICAgPGEgaHJlZj1cIiR7c2VjdXJlQmFzZVVybH0vbWFuYWdlL3BhZ2UtYnVpbGRlcj9jaGFubmVsSWQ9JHtjaGFubmVsSWR9JnJlZGlyZWN0SWZyYW1lVXJsPSR7dXJsfVwiIHRhcmdldD1cIl9ibGFua1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctYmFzZWxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnPjx1c2UgeGxpbms6aHJlZj1cIiNpY29uLWFkbWluLWJydXNoXCI+PC91c2U+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+PHNwYW4gY2xhc3M9XCJhZG1pbkJhci1sYXJnZVwiPiAke2xhbmdbJ2FkbWluLnBhZ2VfYnVpbGRlcl9saW5rJ119PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICA8ZGl2IGNsYXNzPVwiYWRtaW5CYXItY2xvc2VcIiBpZD1cImNsb3NlLWFkbWluLWJhclwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIHN2Zy1iYXNlbGluZVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2Zz48dXNlIHhsaW5rOmhyZWY9XCIjaWNvbi1hZG1pbi1jbG9zZVwiPjwvdXNlPjwvc3ZnPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PmApO1xyXG5cclxuICAgICQoJ2JvZHknKS5hZGRDbGFzcygnaGFzQWRtaW5CYXInKTtcclxuICAgICQoJ2JvZHknKS5hcHBlbmQoJGVsZW1lbnQpO1xyXG5cclxuICAgICQoJyNjbG9zZS1hZG1pbi1iYXInKS5jbGljaygoKSA9PiB7XHJcbiAgICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCdoYXNBZG1pbkJhcicpO1xyXG4gICAgICAgICQoJy5hZG1pbkJhcicpLnJlbW92ZSgpO1xyXG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9ICdBRE1JTl9CQVI9MDsgcGF0aD0vJztcclxuICAgIH0pO1xyXG59XHJcbiIsImltcG9ydCAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uL2ZvdW5kYXRpb24nO1xyXG5pbXBvcnQgJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi9mb3VuZGF0aW9uLmRyb3Bkb3duJztcclxuaW1wb3J0IHV0aWxzIGZyb20gJ0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzJztcclxuXHJcbmV4cG9ydCBjb25zdCBDYXJ0UHJldmlld0V2ZW50cyA9IHtcclxuICAgIGNsb3NlOiAnY2xvc2VkLmZuZHRuLmRyb3Bkb3duJyxcclxuICAgIG9wZW46ICdvcGVuZWQuZm5kdG4uZHJvcGRvd24nLFxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHNlY3VyZUJhc2VVcmwsIGNhcnRJZCkge1xyXG4gICAgY29uc3QgbG9hZGluZ0NsYXNzID0gJ2lzLWxvYWRpbmcnO1xyXG4gICAgY29uc3QgJGNhcnQgPSAkKCdbZGF0YS1jYXJ0LXByZXZpZXddJyk7XHJcbiAgICBjb25zdCAkY2FydERyb3Bkb3duID0gJCgnI2NhcnQtcHJldmlldy1kcm9wZG93bicpO1xyXG4gICAgY29uc3QgJGNhcnRMb2FkaW5nID0gJCgnPGRpdiBjbGFzcz1cImxvYWRpbmdPdmVybGF5XCI+PC9kaXY+Jyk7XHJcblxyXG4gICAgY29uc3QgJGJvZHkgPSAkKCdib2R5Jyk7XHJcblxyXG4gICAgaWYgKHdpbmRvdy5BcHBsZVBheVNlc3Npb24pIHtcclxuICAgICAgICAkY2FydERyb3Bkb3duLmFkZENsYXNzKCdhcHBsZS1wYXktc3VwcG9ydGVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgJGJvZHkub24oJ2NhcnQtcXVhbnRpdHktdXBkYXRlJywgKGV2ZW50LCBxdWFudGl0eSkgPT4ge1xyXG4vLyAgICAgICAgICRjYXJ0LmF0dHIoJ2FyaWEtbGFiZWwnLCAoXywgcHJldlZhbHVlKSA9PiBwcmV2VmFsdWUucmVwbGFjZSgvXFxkKy8sIHF1YW50aXR5KSk7XHJcblxyXG4gICAgICAgIGlmICghcXVhbnRpdHkpIHtcclxuICAgICAgICAgICAgJGNhcnQuYWRkQ2xhc3MoJ25hdlVzZXItaXRlbS0tY2FydF9faGlkZGVuLXMnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkY2FydC5yZW1vdmVDbGFzcygnbmF2VXNlci1pdGVtLS1jYXJ0X19oaWRkZW4tcycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJCgnLmNhcnQtcXVhbnRpdHknKVxyXG4gICAgICAgICAgICAudGV4dChxdWFudGl0eSlcclxuICAgICAgICAgICAgLnRvZ2dsZUNsYXNzKCdjb3VudFBpbGwtLXBvc2l0aXZlJywgcXVhbnRpdHkgPiAwKTtcclxuICAgICAgICBpZiAodXRpbHMudG9vbHMuc3RvcmFnZS5sb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSkge1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FydC1xdWFudGl0eScsIHF1YW50aXR5KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAkY2FydC5vbignY2xpY2snLCBldmVudCA9PiB7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICdjb21tb24vY2FydC1wcmV2aWV3JyxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBSZWRpcmVjdCB0byBmdWxsIGNhcnQgcGFnZVxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Ccm93c2VyX2RldGVjdGlvbl91c2luZ190aGVfdXNlcl9hZ2VudFxyXG4gICAgICAgIC8vIEluIHN1bW1hcnksIHdlIHJlY29tbWVuZCBsb29raW5nIGZvciB0aGUgc3RyaW5nICdNb2JpJyBhbnl3aGVyZSBpbiB0aGUgVXNlciBBZ2VudCB0byBkZXRlY3QgYSBtb2JpbGUgZGV2aWNlLlxyXG4gICAgICAgIGlmICgvTW9iaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgJGNhcnREcm9wZG93blxyXG4gICAgICAgICAgICAuYWRkQ2xhc3MobG9hZGluZ0NsYXNzKVxyXG4gICAgICAgICAgICAuaHRtbCgkY2FydExvYWRpbmcpO1xyXG4gICAgICAgICRjYXJ0TG9hZGluZ1xyXG4gICAgICAgICAgICAuc2hvdygpO1xyXG5cclxuICAgICAgICB1dGlscy5hcGkuY2FydC5nZXRDb250ZW50KG9wdGlvbnMsIChlcnIsIHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICRjYXJ0RHJvcGRvd25cclxuICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcyhsb2FkaW5nQ2xhc3MpXHJcbiAgICAgICAgICAgICAgICAuaHRtbChyZXNwb25zZSk7XHJcbiAgICAgICAgICAgICRjYXJ0TG9hZGluZ1xyXG4gICAgICAgICAgICAgICAgLmhpZGUoKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBxdWFudGl0eSA9IDA7XHJcblxyXG4gICAgaWYgKGNhcnRJZCkge1xyXG4gICAgICAgIC8vIEdldCBleGlzdGluZyBxdWFudGl0eSBmcm9tIGxvY2FsU3RvcmFnZSBpZiBmb3VuZFxyXG4gICAgICAgIGlmICh1dGlscy50b29scy5zdG9yYWdlLmxvY2FsU3RvcmFnZUF2YWlsYWJsZSgpKSB7XHJcbiAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydC1xdWFudGl0eScpKSB7XHJcbiAgICAgICAgICAgICAgICBxdWFudGl0eSA9IE51bWJlcihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydC1xdWFudGl0eScpKTtcclxuICAgICAgICAgICAgICAgICRib2R5LnRyaWdnZXIoJ2NhcnQtcXVhbnRpdHktdXBkYXRlJywgcXVhbnRpdHkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBHZXQgdXBkYXRlZCBjYXJ0IHF1YW50aXR5IGZyb20gdGhlIENhcnQgQVBJXHJcbiAgICAgICAgY29uc3QgY2FydFF0eVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHV0aWxzLmFwaS5jYXJ0LmdldENhcnRRdWFudGl0eSh7IGJhc2VVcmw6IHNlY3VyZUJhc2VVcmwsIGNhcnRJZCB9LCAoZXJyLCBxdHkpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGFwcGVhcnMgdG8gYmUgYSA0MDQgZm9yIHRoZSBjYXJ0IElELCBzZXQgY2FydCBxdWFudGl0eSB0byAwXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PT0gJ05vdCBGb3VuZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgwKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHF0eSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgQ2FydCBBUEkgZ2l2ZXMgdXMgYSBkaWZmZXJlbnQgcXVhbnRpdHkgbnVtYmVyLCB1cGRhdGUgaXRcclxuICAgICAgICBjYXJ0UXR5UHJvbWlzZS50aGVuKHF0eSA9PiB7XHJcbiAgICAgICAgICAgIHF1YW50aXR5ID0gcXR5O1xyXG4gICAgICAgICAgICAkYm9keS50cmlnZ2VyKCdjYXJ0LXF1YW50aXR5LXVwZGF0ZScsIHF1YW50aXR5KTtcclxuICAgICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgJGJvZHkudHJpZ2dlcignY2FydC1xdWFudGl0eS11cGRhdGUnLCBxdWFudGl0eSk7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHV0aWxzIGZyb20gJ0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzJztcclxuXHJcbi8qKlxyXG4gKiBFdXJvcGVhbiB3ZWJzaXRlcyBtdXN0IG5vdGlmeSB1c2VycyBvZiBjb29raWVzIHRvIGNvbXBseSB3aXRoIEV1cm9wZWFuIFVuaW9uIGxhdy5cclxuICogVGhpcyB3aWxsIGFsZXJ0IHNob3BwZXJzIHRoYXQgdGhpcyB3ZWJzaXRlIHVzZXMgY29va2llcy5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpIHtcclxuICAgIC8qXHJcbiAgICAvLyBIZXJlIHlvdSBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYnJvd3NlciBhbGVydCBib3ggYnkgaG9va2luZyB0byB0aGUgJ2Nvb2tpZS1wcml2YWN5LW5vdGlmaWNhdGlvbicgaG9vay5cclxuICAgIHV0aWxzLmhvb2tzLm9uKCdjb29raWUtcHJpdmFjeS1ub3RpZmljYXRpb24nLCAoZXZlbnQsIHByaXZhY3lNZXNzYWdlKSA9PiB7XHJcbiAgICAgICAgLy8gWW91IGNhbiBtYWtlIHlvdXIgb3duIGN1c3RvbSBtb2RhbCBvciBhbGVydCBib3ggYXBwZWFyIGluIHlvdXIgdGhlbWUgdXNpbmcgdGhlIHByaXZhY3lNZXNzYWdlIHByb3ZpZGVkXHJcbiAgICAgICAgbXlDdXN0b21BbGVydChwcml2YWN5TWVzc2FnZSk7XHJcblxyXG4gICAgICAgIC8vIENhbGwgZXZlbnQucHJldmVudERlZmF1bHQoKSB0byBwcmV2ZW50IHRoZSBkZWZhdWx0IGJyb3dzZXIgYWxlcnQgZnJvbSBvY2N1cnJpbmcgaW4gc3RlbmNpbC11dGlsc1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9KTtcclxuICAgICovXHJcblxyXG4gICAgY29uc3QgJHByaXZhY3lEaWFsb2cgPSAkKCcuY29va2llTWVzc2FnZScpO1xyXG5cclxuICAgIGlmIChkb2N1bWVudC5jb29raWUuaW5kZXhPZignQUNDRVBUX0NPT0tJRV9VU0FHRScpID09PSAtMSkge1xyXG4gICAgICAgICRwcml2YWN5RGlhbG9nLnNob3coKTtcclxuICAgIH1cclxuXHJcbiAgICAkKCdib2R5Jykub24oJ2NsaWNrJywgJ1tkYXRhLXByaXZhY3ktYWNjZXB0XScsICgpID0+IHtcclxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyAzNjUpO1xyXG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGBBQ0NFUFRfQ09PS0lFX1VTQUdFPTE7ZXhwaXJlcz0ke2RhdGUudG9HTVRTdHJpbmcoKX07IHBhdGg9L2A7XHJcblxyXG4gICAgICAgIHV0aWxzLmhvb2tzLmVtaXQoJ2Nvb2tpZS1wcml2YWN5LWFjY2VwdGVkJyk7XHJcbiAgICAgICAgJHByaXZhY3lEaWFsb2cuaGlkZSgpO1xyXG4gICAgfSk7XHJcbn1cclxuIiwiaW1wb3J0IHN3YWwgZnJvbSAnLi9zd2VldC1hbGVydCc7XHJcbmltcG9ydCB1dGlscyBmcm9tICdAYmlnY29tbWVyY2Uvc3RlbmNpbC11dGlscyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoY2FydElkKSB7XHJcbiAgICBmdW5jdGlvbiBjaGFuZ2VDdXJyZW5jeSh1cmwsIGN1cnJlbmN5Q29kZSkge1xyXG4gICAgICAgICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybCxcclxuICAgICAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHsgY3VycmVuY3lDb2RlIH0pLFxyXG4gICAgICAgIH0pLmRvbmUoKCkgPT4ge1xyXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgfSkuZmFpbCgoZSkgPT4ge1xyXG4gICAgICAgICAgICBzd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgdGV4dDogSlNPTi5wYXJzZShlLnJlc3BvbnNlVGV4dCkuZXJyb3IsXHJcbiAgICAgICAgICAgICAgICBpY29uOiAnd2FybmluZycsXHJcbiAgICAgICAgICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAkKCdbZGF0YS1jYXJ0LWN1cnJlbmN5LXN3aXRjaC11cmxdJykub24oJ2NsaWNrJywgZXZlbnQgPT4ge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbmN5U2Vzc2lvblN3aXRjaGVyID0gZXZlbnQudGFyZ2V0LmhyZWY7XHJcbiAgICAgICAgaWYgKCFjYXJ0SWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHV0aWxzLmFwaS5jYXJ0LmdldENhcnQoeyBjYXJ0SWQgfSwgKGVyciwgcmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVyciB8fCByZXNwb25zZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGN1cnJlbmN5U2Vzc2lvblN3aXRjaGVyO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzaG93V2FybmluZyA9IHJlc3BvbnNlLmRpc2NvdW50cy5zb21lKGRpc2NvdW50ID0+IGRpc2NvdW50LmRpc2NvdW50ZWRBbW91bnQgPiAwKSB8fFxyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UuY291cG9ucy5sZW5ndGggPiAwIHx8XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZS5saW5lSXRlbXMuZ2lmdENlcnRpZmljYXRlcy5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNob3dXYXJuaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICQoZXZlbnQudGFyZ2V0KS5kYXRhKCd3YXJuaW5nJyksXHJcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ3dhcm5pbmcnLFxyXG4gICAgICAgICAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgICB9KS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC52YWx1ZSAmJiByZXN1bHQudmFsdWUgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlQ3VycmVuY3koJChldmVudC50YXJnZXQpLmRhdGEoJ2NhcnQtY3VycmVuY3ktc3dpdGNoLXVybCcpLCAkKGV2ZW50LnRhcmdldCkuZGF0YSgnY3VycmVuY3ktY29kZScpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNoYW5nZUN1cnJlbmN5KCQoZXZlbnQudGFyZ2V0KS5kYXRhKCdjYXJ0LWN1cnJlbmN5LXN3aXRjaC11cmwnKSwgJChldmVudC50YXJnZXQpLmRhdGEoJ2N1cnJlbmN5LWNvZGUnKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcbiIsImltcG9ydCAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uL2ZvdW5kYXRpb24nO1xyXG5pbXBvcnQgJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi9mb3VuZGF0aW9uLmRyb3Bkb3duJztcclxuaW1wb3J0ICdmb3VuZGF0aW9uLXNpdGVzL2pzL2ZvdW5kYXRpb24vZm91bmRhdGlvbi5yZXZlYWwnO1xyXG5pbXBvcnQgJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi9mb3VuZGF0aW9uLnRhYic7XHJcbmltcG9ydCBtb2RhbEZhY3RvcnkgZnJvbSAnLi9tb2RhbCc7XHJcbmltcG9ydCByZXZlYWxDbG9zZUZhY3RvcnkgZnJvbSAnLi9yZXZlYWwtY2xvc2UnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCRlbGVtZW50KSB7XHJcbiAgICAkZWxlbWVudC5mb3VuZGF0aW9uKHtcclxuICAgICAgICBkcm9wZG93bjoge1xyXG4gICAgICAgICAgICAvLyBzcGVjaWZ5IHRoZSBjbGFzcyB1c2VkIGZvciBhY3RpdmUgZHJvcGRvd25zXHJcbiAgICAgICAgICAgIGFjdGl2ZV9jbGFzczogJ2lzLW9wZW4nLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmV2ZWFsOiB7XHJcbiAgICAgICAgICAgIGJnX2NsYXNzOiAnbW9kYWwtYmFja2dyb3VuZCcsXHJcbiAgICAgICAgICAgIGRpc21pc3NfbW9kYWxfY2xhc3M6ICdtb2RhbC1jbG9zZScsXHJcbiAgICAgICAgICAgIGNsb3NlX29uX2JhY2tncm91bmRfY2xpY2s6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB0YWI6IHtcclxuICAgICAgICAgICAgYWN0aXZlX2NsYXNzOiAnaXMtYWN0aXZlJyxcclxuICAgICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgbW9kYWxGYWN0b3J5KCdbZGF0YS1yZXZlYWxdJywgeyAkY29udGV4dDogJGVsZW1lbnQgfSk7XHJcbiAgICByZXZlYWxDbG9zZUZhY3RvcnkoJ1tkYXRhLXJldmVhbC1jbG9zZV0nLCB7ICRjb250ZXh0OiAkZWxlbWVudCB9KTtcclxufVxyXG4iLCIvLyBOZWVkZWQgYmVjYXVzZSB3ZSB1c2UgRm91bmRhdGlvbiA1LjUsIHdoaWNoIGV4cGVjdHMgalF1ZXJ5IDIueC4gSG93ZXZlcixcclxuLy8gcmF0aGVyIHRoYW4gYnJpbmdpbmcgaW4gYWxsIG9mIGpxdWVyeS1taWdyYXRlLCB3ZSdyZSBjaGVycnkgcGlja2luZyBpbmRpdmlkdWFsXHJcbi8vIGZpeGVzIG5lZWRlZCBmb3IgRm91bmRhdGlvbi5cclxuaW1wb3J0IGluaXQgZnJvbSAnLi9qcXVlcnktbWlncmF0ZS9pbml0JztcclxuaW1wb3J0IHRyYXZlcnNpbmcgZnJvbSAnLi9qcXVlcnktbWlncmF0ZS90cmF2ZXJzaW5nJztcclxuaW1wb3J0IGRhdGEgZnJvbSAnLi9qcXVlcnktbWlncmF0ZS9kYXRhJztcclxuaW1wb3J0IGV2ZW50cyBmcm9tICcuL2pxdWVyeS1taWdyYXRlL2V2ZW50JztcclxuXHJcbmluaXQoKTtcclxudHJhdmVyc2luZygpO1xyXG5kYXRhKCk7XHJcbmV2ZW50cygpO1xyXG4iLCIvLyBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LW1pZ3JhdGUvYmxvYi9tYXN0ZXIvc3JjL2RhdGEuanNcclxuLy9cclxuLy8gaHR0cHM6Ly9qcXVlcnkuY29tL3VwZ3JhZGUtZ3VpZGUvMy4wLyNkYXRhXHJcblxyXG4vKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItcmVzdC1wYXJhbXMsIGZ1bmMtbmFtZXMgKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc3Qgb2xkRGF0YSA9IGpRdWVyeS5kYXRhO1xyXG4gICAgalF1ZXJ5LmRhdGEgPSBmdW5jdGlvbiAoZWxlbSwgbmFtZSwgdmFsdWUpIHtcclxuICAgICAgICBsZXQgY3VyRGF0YTtcclxuXHJcbiAgICAgICAgLy8gTmFtZSBjYW4gYmUgYW4gb2JqZWN0LCBhbmQgZWFjaCBlbnRyeSBpbiB0aGUgb2JqZWN0IGlzIG1lYW50IHRvIGJlIHNldCBhcyBkYXRhXHJcbiAgICAgICAgaWYgKG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09ICdvYmplY3QnICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcclxuICAgICAgICAgICAgY3VyRGF0YSA9IGpRdWVyeS5oYXNEYXRhKGVsZW0pICYmIG9sZERhdGEuY2FsbCh0aGlzLCBlbGVtKTtcclxuICAgICAgICAgICAgY29uc3Qgc2FtZUtleXMgPSB7fTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbmFtZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPT0galF1ZXJ5LmNhbWVsQ2FzZShrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VyRGF0YVtrZXldID0gbmFtZVtrZXldO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzYW1lS2V5c1trZXldID0gbmFtZVtrZXldO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvbGREYXRhLmNhbGwodGhpcywgZWxlbSwgc2FtZUtleXMpO1xyXG4gICAgICAgICAgICByZXR1cm4gbmFtZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBuYW1lIGlzIHRyYW5zZm9ybWVkLCBsb29rIGZvciB0aGUgdW4tdHJhbnNmb3JtZWQgbmFtZSBpbiB0aGUgZGF0YSBvYmplY3RcclxuICAgICAgICBpZiAobmFtZSAmJiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgJiYgbmFtZSAhPT0galF1ZXJ5LmNhbWVsQ2FzZShuYW1lKSkge1xyXG4gICAgICAgICAgICBjdXJEYXRhID0galF1ZXJ5Lmhhc0RhdGEoZWxlbSkgJiYgb2xkRGF0YS5jYWxsKHRoaXMsIGVsZW0pO1xyXG4gICAgICAgICAgICBpZiAoY3VyRGF0YSAmJiBuYW1lIGluIGN1ckRhdGEpIHtcclxuICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xyXG4gICAgICAgICAgICAgICAgICAgIGN1ckRhdGFbbmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJEYXRhW25hbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb2xkRGF0YS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgfTtcclxufVxyXG4vKiBlc2xpbnQtZW5hYmxlIHByZWZlci1yZXN0LXBhcmFtcyAqL1xyXG4iLCIvLyBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LW1pZ3JhdGUvYmxvYi9tYXN0ZXIvc3JjL2V2ZW50LmpzXHJcbi8vXHJcbi8vIGh0dHBzOi8vanF1ZXJ5LmNvbS91cGdyYWRlLWd1aWRlLzMuMC8jYnJlYWtpbmctY2hhbmdlLWxvYWQtdW5sb2FkLWFuZC1lcnJvci1yZW1vdmVkXHJcblxyXG4vKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItcmVzdC1wYXJhbXMgKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xyXG4gICAgalF1ZXJ5LmVhY2goWydsb2FkJywgJ3VubG9hZCcsICdlcnJvciddLCAoXywgbmFtZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG9sZExvYWQgPSBqUXVlcnkuZm4ubG9hZDtcclxuXHJcbiAgICAgICAgalF1ZXJ5LmZuW25hbWVdID0gZnVuY3Rpb24gaGFuZGxlcigpIHtcclxuICAgICAgICAgICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIGFqYXggbG9hZCgpIHRoZSBmaXJzdCBhcmcgc2hvdWxkIGJlIHRoZSBzdHJpbmcgVVJMO1xyXG4gICAgICAgICAgICAvLyB0ZWNobmljYWxseSB0aGlzIGNvdWxkIGFsc28gYmUgdGhlIFwiQW55dGhpbmdcIiBhcmcgb2YgdGhlIGV2ZW50IC5sb2FkKClcclxuICAgICAgICAgICAgLy8gd2hpY2gganVzdCBnb2VzIHRvIHNob3cgd2h5IHRoaXMgZHVtYiBzaWduYXR1cmUgaGFzIGJlZW4gZGVwcmVjYXRlZCFcclxuICAgICAgICAgICAgLy8galF1ZXJ5IGN1c3RvbSBidWlsZHMgdGhhdCBleGNsdWRlIHRoZSBBamF4IG1vZHVsZSBqdXN0aWZpYWJseSBkaWUgaGVyZS5cclxuICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdsb2FkJyAmJiB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvbGRMb2FkLmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBhcmdzLnNwbGljZSgwLCAwLCBuYW1lKTtcclxuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9uLmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBVc2UgLnRyaWdnZXJIYW5kbGVyIGhlcmUgYmVjYXVzZTpcclxuICAgICAgICAgICAgLy8gLSBsb2FkIGFuZCB1bmxvYWQgZXZlbnRzIGRvbid0IG5lZWQgdG8gYnViYmxlLCBvbmx5IGFwcGxpZWQgdG8gd2luZG93IG9yIGltYWdlXHJcbiAgICAgICAgICAgIC8vIC0gZXJyb3IgZXZlbnQgc2hvdWxkIG5vdCBidWJibGUgdG8gd2luZG93LCBhbHRob3VnaCBpdCBkb2VzIHByZS0xLjdcclxuICAgICAgICAgICAgLy8gU2VlIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzExODIwXHJcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlckhhbmRsZXIuYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH07XHJcbiAgICB9KTtcclxufVxyXG4vKiBlc2xpbnQtZW5hYmxlIHByZWZlci1yZXN0LXBhcmFtcyAqL1xyXG4iLCIvLyBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LW1pZ3JhdGUvYmxvYi8xLngtc3RhYmxlL3NyYy9jb3JlLmpzXHJcbi8vXHJcbi8vIGh0dHBzOi8vanF1ZXJ5LmNvbS91cGdyYWRlLWd1aWRlLzMuMC8jYnJlYWtpbmctY2hhbmdlLWRlcHJlY2F0ZWQtY29udGV4dC1hbmQtc2VsZWN0b3ItcHJvcGVydGllcy1yZW1vdmVkXHJcblxyXG4vKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItcmVzdC1wYXJhbXMsIGZ1bmMtbmFtZXMgKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc3Qgb2xkSW5pdCA9IGpRdWVyeS5mbi5pbml0O1xyXG5cclxuICAgIGpRdWVyeS5mbi5pbml0ID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBjb250ZXh0KSB7XHJcbiAgICAgICAgY29uc3QgcmV0ID0gb2xkSW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG5cclxuICAgICAgICAvLyBGaWxsIGluIHNlbGVjdG9yIGFuZCBjb250ZXh0IHByb3BlcnRpZXMgc28gLmxpdmUoKSB3b3Jrc1xyXG4gICAgICAgIGlmIChzZWxlY3RvciAmJiBzZWxlY3Rvci5zZWxlY3RvciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vIEEgalF1ZXJ5IG9iamVjdCwgY29weSBpdHMgcHJvcGVydGllc1xyXG4gICAgICAgICAgICByZXQuc2VsZWN0b3IgPSBzZWxlY3Rvci5zZWxlY3RvcjtcclxuICAgICAgICAgICAgcmV0LmNvbnRleHQgPSBzZWxlY3Rvci5jb250ZXh0O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldC5zZWxlY3RvciA9IHR5cGVvZiBzZWxlY3RvciA9PT0gJ3N0cmluZycgPyBzZWxlY3RvciA6ICcnO1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0b3IpIHtcclxuICAgICAgICAgICAgICAgIHJldC5jb250ZXh0ID0gc2VsZWN0b3Iubm9kZVR5cGUgPyBzZWxlY3RvciA6IGNvbnRleHQgfHwgZG9jdW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXQ7XHJcbiAgICB9O1xyXG5cclxuICAgIGpRdWVyeS5mbi5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjtcclxufVxyXG4vKiBlc2xpbnQtZW5hYmxlIHByZWZlci1yZXN0LXBhcmFtcyAqL1xyXG4iLCIvLyBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LW1pZ3JhdGUvYmxvYi8xLngtc3RhYmxlL3NyYy90cmF2ZXJzaW5nLmpzXHJcbi8vXHJcbi8vIGh0dHBzOi8vanF1ZXJ5LmNvbS91cGdyYWRlLWd1aWRlLzMuMC8jYnJlYWtpbmctY2hhbmdlLWRlcHJlY2F0ZWQtY29udGV4dC1hbmQtc2VsZWN0b3ItcHJvcGVydGllcy1yZW1vdmVkXHJcblxyXG4vKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItcmVzdC1wYXJhbXMsIGZ1bmMtbmFtZXMgKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc3Qgb2xkRm5GaW5kID0galF1ZXJ5LmZuLmZpbmQ7XHJcblxyXG4gICAgalF1ZXJ5LmZuLmZpbmQgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcclxuICAgICAgICBjb25zdCByZXQgPSBvbGRGbkZpbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgICByZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDtcclxuICAgICAgICByZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yID8gYCR7dGhpcy5zZWxlY3Rvcn0gJHtzZWxlY3Rvcn1gIDogc2VsZWN0b3I7XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgIH07XHJcbn1cclxuLyogZXNsaW50LWVuYWJsZSBwcmVmZXItcmVzdC1wYXJhbXMgKi9cclxuIiwiaW1wb3J0IE5hbm9iYXIgZnJvbSAnbmFub2Jhcic7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKSB7XHJcbiAgICAvLyBDcmVhdGUgdGhlIG5hbm9iYXIgaW5zdGFuY2VcclxuICAgIGNvbnN0IG5hbm9iYXIgPSBuZXcgTmFub2JhcigpO1xyXG5cclxuICAgIC8vIFRpbWVyIGZvciBtb3ZpbmcgcHJvZ3Jlc3MgYmFyIGR1cmluZyBhamF4IGNhbGxzXHJcbiAgICBsZXQgdGltZXIgPSBudWxsO1xyXG4gICAgbGV0IGN1cnJlbnQgPSAwO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyVGltZXIoKSB7XHJcbiAgICAgICAgaWYgKHRpbWVyKSB7XHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpO1xyXG4gICAgICAgICAgICB0aW1lciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNldFRpbWVyKCkge1xyXG4gICAgICAgIGNsZWFyVGltZXIoKTtcclxuXHJcbiAgICAgICAgY3VycmVudCA9IDA7XHJcbiAgICAgICAgdGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGN1cnJlbnQgKz0gMztcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPD0gMTAwKSB7XHJcbiAgICAgICAgICAgICAgICBuYW5vYmFyLmdvKGN1cnJlbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgNTApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEF0dGFjaCBnbG9iYWwganF1ZXJ5IGhhbmRsZXJzIHRvIGxpc3RlbiBmb3IgYWpheCBzdGFydFxyXG4gICAgJChkb2N1bWVudCkuYWpheFNlbmQoKCkgPT4ge1xyXG4gICAgICAgIHNldFRpbWVyKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAkKGRvY3VtZW50KS5hamF4Q29tcGxldGUoKCkgPT4ge1xyXG4gICAgICAgIG5hbm9iYXIuZ28oMTAwKTtcclxuICAgICAgICBjbGVhclRpbWVyKCk7XHJcbiAgICB9KTtcclxufVxyXG4iLCJpbXBvcnQgY29sbGFwc2libGVGYWN0b3J5IGZyb20gJy4uL2NvbW1vbi9jb2xsYXBzaWJsZSc7XHJcbmltcG9ydCBjb2xsYXBzaWJsZUdyb3VwRmFjdG9yeSBmcm9tICcuLi9jb21tb24vY29sbGFwc2libGUtZ3JvdXAnO1xyXG5cclxuY29uc3QgUExVR0lOX0tFWSA9ICdtZW51JztcclxuXHJcbi8qXHJcbiAqIE1hbmFnZSB0aGUgYmVoYXZpb3VyIG9mIGEgbWVudVxyXG4gKiBAcGFyYW0ge2pRdWVyeX0gJG1lbnVcclxuICovXHJcbmNsYXNzIE1lbnUge1xyXG4gICAgY29uc3RydWN0b3IoJG1lbnUpIHtcclxuICAgICAgICB0aGlzLiRtZW51ID0gJG1lbnU7XHJcbiAgICAgICAgdGhpcy4kYm9keSA9ICQoJ2JvZHknKTtcclxuICAgICAgICB0aGlzLmhhc01heE1lbnVEaXNwbGF5RGVwdGggPSB0aGlzLiRib2R5LmZpbmQoJy5uYXZQYWdlcy1saXN0JykuaGFzQ2xhc3MoJ25hdlBhZ2VzLWxpc3QtZGVwdGgtbWF4Jyk7XHJcblxyXG4gICAgICAgIC8vIEluaXQgY29sbGFwc2libGVcclxuICAgICAgICB0aGlzLmNvbGxhcHNpYmxlcyA9IGNvbGxhcHNpYmxlRmFjdG9yeSgnW2RhdGEtY29sbGFwc2libGVdJywgeyAkY29udGV4dDogdGhpcy4kbWVudSB9KTtcclxuICAgICAgICB0aGlzLmNvbGxhcHNpYmxlR3JvdXBzID0gY29sbGFwc2libGVHcm91cEZhY3RvcnkoJG1lbnUpO1xyXG5cclxuICAgICAgICAvLyBBdXRvLWJpbmRcclxuICAgICAgICB0aGlzLm9uTWVudUNsaWNrID0gdGhpcy5vbk1lbnVDbGljay5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub25Eb2N1bWVudENsaWNrID0gdGhpcy5vbkRvY3VtZW50Q2xpY2suYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgLy8gTGlzdGVuXHJcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29sbGFwc2VBbGwoKSB7XHJcbiAgICAgICAgdGhpcy5jb2xsYXBzaWJsZXMuZm9yRWFjaChjb2xsYXBzaWJsZSA9PiBjb2xsYXBzaWJsZS5jbG9zZSgpKTtcclxuICAgICAgICB0aGlzLmNvbGxhcHNpYmxlR3JvdXBzLmZvckVhY2goZ3JvdXAgPT4gZ3JvdXAuY2xvc2UoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29sbGFwc2VOZWlnaGJvcnMoJG5laWdoYm9ycykge1xyXG4gICAgICAgIGNvbnN0ICRjb2xsYXBzaWJsZXMgPSBjb2xsYXBzaWJsZUZhY3RvcnkoJ1tkYXRhLWNvbGxhcHNpYmxlXScsIHsgJGNvbnRleHQ6ICRuZWlnaGJvcnMgfSk7XHJcblxyXG4gICAgICAgICRjb2xsYXBzaWJsZXMuZm9yRWFjaCgkY29sbGFwc2libGUgPT4gJGNvbGxhcHNpYmxlLmNsb3NlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGJpbmRFdmVudHMoKSB7XHJcbiAgICAgICAgdGhpcy4kbWVudS5vbignY2xpY2snLCB0aGlzLm9uTWVudUNsaWNrKTtcclxuICAgICAgICB0aGlzLiRib2R5Lm9uKCdjbGljaycsIHRoaXMub25Eb2N1bWVudENsaWNrKTtcclxuICAgIH1cclxuXHJcbiAgICB1bmJpbmRFdmVudHMoKSB7XHJcbiAgICAgICAgdGhpcy4kbWVudS5vZmYoJ2NsaWNrJywgdGhpcy5vbk1lbnVDbGljayk7XHJcbiAgICAgICAgdGhpcy4kYm9keS5vZmYoJ2NsaWNrJywgdGhpcy5vbkRvY3VtZW50Q2xpY2spO1xyXG4gICAgfVxyXG5cclxuICAgIG9uTWVudUNsaWNrKGV2ZW50KSB7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmhhc01heE1lbnVEaXNwbGF5RGVwdGgpIHtcclxuICAgICAgICAgICAgY29uc3QgJG5laWdoYm9ycyA9ICQoZXZlbnQudGFyZ2V0KS5wYXJlbnQoKS5zaWJsaW5ncygpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jb2xsYXBzZU5laWdoYm9ycygkbmVpZ2hib3JzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25Eb2N1bWVudENsaWNrKCkge1xyXG4gICAgICAgIHRoaXMuY29sbGFwc2VBbGwoKTtcclxuICAgIH1cclxufVxyXG5cclxuLypcclxuICogQ3JlYXRlIGEgbmV3IE1lbnUgaW5zdGFuY2VcclxuICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl1cclxuICogQHJldHVybiB7TWVudX1cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lbnVGYWN0b3J5KHNlbGVjdG9yID0gYFtkYXRhLSR7UExVR0lOX0tFWX1dYCkge1xyXG4gICAgY29uc3QgJG1lbnUgPSAkKHNlbGVjdG9yKS5lcSgwKTtcclxuICAgIGNvbnN0IGluc3RhbmNlS2V5ID0gYCR7UExVR0lOX0tFWX1JbnN0YW5jZWA7XHJcbiAgICBjb25zdCBjYWNoZWRNZW51ID0gJG1lbnUuZGF0YShpbnN0YW5jZUtleSk7XHJcblxyXG4gICAgaWYgKGNhY2hlZE1lbnUgaW5zdGFuY2VvZiBNZW51KSB7XHJcbiAgICAgICAgcmV0dXJuIGNhY2hlZE1lbnU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbWVudSA9IG5ldyBNZW51KCRtZW51KTtcclxuXHJcbiAgICAkbWVudS5kYXRhKGluc3RhbmNlS2V5LCBtZW51KTtcclxuXHJcbiAgICByZXR1cm4gbWVudTtcclxufVxyXG4iLCJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgbWVkaWFRdWVyeUxpc3RGYWN0b3J5IGZyb20gJy4uL2NvbW1vbi9tZWRpYS1xdWVyeS1saXN0JztcclxuaW1wb3J0IHsgQ2FydFByZXZpZXdFdmVudHMgfSBmcm9tICcuL2NhcnQtcHJldmlldyc7XHJcblxyXG5jb25zdCBQTFVHSU5fS0VZID0ge1xyXG4gICAgQ0FNRUw6ICdtb2JpbGVNZW51VG9nZ2xlJyxcclxuICAgIFNOQUtFOiAnbW9iaWxlLW1lbnUtdG9nZ2xlJyxcclxufTtcclxuXHJcbmZ1bmN0aW9uIG9wdGlvbnNGcm9tRGF0YSgkZWxlbWVudCkge1xyXG4gICAgY29uc3QgbW9iaWxlTWVudUlkID0gJGVsZW1lbnQuZGF0YShQTFVHSU5fS0VZLkNBTUVMKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG1lbnVTZWxlY3RvcjogbW9iaWxlTWVudUlkICYmIGAjJHttb2JpbGVNZW51SWR9YCxcclxuICAgIH07XHJcbn1cclxuXHJcbi8qXHJcbiAqIE1hbmFnZSB0aGUgYmVoYXZpb3VyIG9mIGEgbW9iaWxlIG1lbnVcclxuICogQHBhcmFtIHtqUXVlcnl9ICR0b2dnbGVcclxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxyXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuaGVhZGVyU2VsZWN0b3JdXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5tZW51U2VsZWN0b3JdXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5zY3JvbGxWaWV3U2VsZWN0b3JdXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTW9iaWxlTWVudVRvZ2dsZSB7XHJcbiAgICBjb25zdHJ1Y3RvcigkdG9nZ2xlLCB7XHJcbiAgICAgICAgaGVhZGVyU2VsZWN0b3IgPSAnLmhlYWRlcicsXHJcbiAgICAgICAgbWVudVNlbGVjdG9yID0gJyNtZW51JyxcclxuICAgICAgICBzY3JvbGxWaWV3U2VsZWN0b3IgPSAnLm5hdlBhZ2VzJyxcclxuICAgIH0gPSB7fSkge1xyXG4gICAgICAgIHRoaXMuJGJvZHkgPSAkKCdib2R5Jyk7XHJcbiAgICAgICAgdGhpcy4kbWVudSA9ICQobWVudVNlbGVjdG9yKTtcclxuICAgICAgICB0aGlzLiRuYXZMaXN0ID0gJCgnLm5hdlBhZ2VzLWxpc3QubmF2UGFnZXMtbGlzdC1kZXB0aC1tYXgnKTtcclxuICAgICAgICB0aGlzLiRoZWFkZXIgPSAkKGhlYWRlclNlbGVjdG9yKTtcclxuICAgICAgICB0aGlzLiRzY3JvbGxWaWV3ID0gJChzY3JvbGxWaWV3U2VsZWN0b3IsIHRoaXMuJG1lbnUpO1xyXG4gICAgICAgIHRoaXMuJHN1Yk1lbnVzID0gdGhpcy4kbmF2TGlzdC5maW5kKCcubmF2UGFnZXMtYWN0aW9uJyk7XHJcbiAgICAgICAgdGhpcy4kdG9nZ2xlID0gJHRvZ2dsZTtcclxuICAgICAgICB0aGlzLm1lZGl1bU1lZGlhUXVlcnlMaXN0ID0gbWVkaWFRdWVyeUxpc3RGYWN0b3J5KCdtZWRpdW0nKTtcclxuXHJcbiAgICAgICAgLy8gQXV0by1iaW5kXHJcbiAgICAgICAgdGhpcy5vblRvZ2dsZUNsaWNrID0gdGhpcy5vblRvZ2dsZUNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5vbkNhcnRQcmV2aWV3T3BlbiA9IHRoaXMub25DYXJ0UHJldmlld09wZW4uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9uTWVkaXVtTWVkaWFRdWVyeU1hdGNoID0gdGhpcy5vbk1lZGl1bU1lZGlhUXVlcnlNYXRjaC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub25TdWJNZW51Q2xpY2sgPSB0aGlzLm9uU3ViTWVudUNsaWNrLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIC8vIExpc3RlblxyXG4gICAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xyXG5cclxuICAgICAgICAvLyBBc3NpZ24gRE9NIGF0dHJpYnV0ZXNcclxuICAgICAgICB0aGlzLiR0b2dnbGUuYXR0cignYXJpYS1jb250cm9scycsIHRoaXMuJG1lbnUuYXR0cignaWQnKSk7XHJcblxyXG4gICAgICAgIC8vIEhpZGUgYnkgZGVmYXVsdFxyXG4gICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc09wZW4oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuJG1lbnUuaGFzQ2xhc3MoJ2lzLW9wZW4nKTtcclxuICAgIH1cclxuXHJcbiAgICBiaW5kRXZlbnRzKCkge1xyXG4gICAgICAgIHRoaXMuJHRvZ2dsZS5vbignY2xpY2snLCB0aGlzLm9uVG9nZ2xlQ2xpY2spO1xyXG4gICAgICAgIHRoaXMuJGhlYWRlci5vbihDYXJ0UHJldmlld0V2ZW50cy5vcGVuLCB0aGlzLm9uQ2FydFByZXZpZXdPcGVuKTtcclxuICAgICAgICB0aGlzLiRzdWJNZW51cy5vbignY2xpY2snLCB0aGlzLm9uU3ViTWVudUNsaWNrKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubWVkaXVtTWVkaWFRdWVyeUxpc3QgJiYgdGhpcy5tZWRpdW1NZWRpYVF1ZXJ5TGlzdC5hZGRMaXN0ZW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLm1lZGl1bU1lZGlhUXVlcnlMaXN0LmFkZExpc3RlbmVyKHRoaXMub25NZWRpdW1NZWRpYVF1ZXJ5TWF0Y2gpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1bmJpbmRFdmVudHMoKSB7XHJcbiAgICAgICAgdGhpcy4kdG9nZ2xlLm9mZignY2xpY2snLCB0aGlzLm9uVG9nZ2xlQ2xpY2spO1xyXG4gICAgICAgIHRoaXMuJGhlYWRlci5vZmYoQ2FydFByZXZpZXdFdmVudHMub3BlbiwgdGhpcy5vbkNhcnRQcmV2aWV3T3Blbik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1lZGl1bU1lZGlhUXVlcnlMaXN0ICYmIHRoaXMubWVkaXVtTWVkaWFRdWVyeUxpc3QuYWRkTGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5tZWRpdW1NZWRpYVF1ZXJ5TGlzdC5yZW1vdmVMaXN0ZW5lcih0aGlzLm9uTWVkaXVtTWVkaWFRdWVyeU1hdGNoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdG9nZ2xlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdygpIHtcclxuICAgICAgICB0aGlzLiRib2R5LmFkZENsYXNzKCdoYXMtYWN0aXZlTmF2UGFnZXMnKTtcclxuXHJcbiAgICAgICAgdGhpcy4kdG9nZ2xlXHJcbiAgICAgICAgICAgIC5hZGRDbGFzcygnaXMtb3BlbicpXHJcbiAgICAgICAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuJG1lbnUuYWRkQ2xhc3MoJ2lzLW9wZW4nKTtcclxuXHJcbiAgICAgICAgdGhpcy4kaGVhZGVyLmFkZENsYXNzKCdpcy1vcGVuJyk7XHJcbiAgICAgICAgdGhpcy4kc2Nyb2xsVmlldy5zY3JvbGxUb3AoMCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVzZXRTdWJNZW51cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGUoKSB7XHJcbiAgICAgICAgdGhpcy4kYm9keS5yZW1vdmVDbGFzcygnaGFzLWFjdGl2ZU5hdlBhZ2VzJyk7XHJcblxyXG4gICAgICAgIHRoaXMuJHRvZ2dsZVxyXG4gICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2lzLW9wZW4nKVxyXG4gICAgICAgICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgdGhpcy4kbWVudS5yZW1vdmVDbGFzcygnaXMtb3BlbicpO1xyXG5cclxuICAgICAgICB0aGlzLiRoZWFkZXIucmVtb3ZlQ2xhc3MoJ2lzLW9wZW4nKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZXNldFN1Yk1lbnVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUHJpdmF0ZVxyXG4gICAgb25Ub2dnbGVDbGljayhldmVudCkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DYXJ0UHJldmlld09wZW4oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbk1lZGl1bU1lZGlhUXVlcnlNYXRjaChtZWRpYSkge1xyXG4gICAgICAgIGlmICghbWVkaWEubWF0Y2hlcykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBvblN1Yk1lbnVDbGljayhldmVudCkge1xyXG4gICAgICAgIGNvbnN0ICRjbG9zZXN0QWN0aW9uID0gJChldmVudC50YXJnZXQpLmNsb3Nlc3QoJy5uYXZQYWdlcy1hY3Rpb24nKTtcclxuICAgICAgICBjb25zdCAkcGFyZW50U2libGluZ3MgPSAkY2xvc2VzdEFjdGlvbi5wYXJlbnQoKS5zaWJsaW5ncygpO1xyXG4gICAgICAgIGNvbnN0ICRwYXJlbnRBY3Rpb24gPSAkY2xvc2VzdEFjdGlvbi5jbG9zZXN0KCcubmF2UGFnZS1zdWJNZW51LWhvcml6b250YWwnKS5zaWJsaW5ncygnLm5hdlBhZ2VzLWFjdGlvbicpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy4kc3ViTWVudXMuaGFzQ2xhc3MoJ2lzLW9wZW4nKSkge1xyXG4gICAgICAgICAgICB0aGlzLiRuYXZMaXN0LmFkZENsYXNzKCdzdWJNZW51LWlzLW9wZW4nKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLiRuYXZMaXN0LnJlbW92ZUNsYXNzKCdzdWJNZW51LWlzLW9wZW4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICgkKGV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ2lzLW9wZW4nKSkge1xyXG4gICAgICAgICAgICAkcGFyZW50U2libGluZ3MuYWRkQ2xhc3MoJ2lzLWhpZGRlbicpO1xyXG4gICAgICAgICAgICAkcGFyZW50QWN0aW9uLmFkZENsYXNzKCdpcy1oaWRkZW4nKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkcGFyZW50U2libGluZ3MucmVtb3ZlQ2xhc3MoJ2lzLWhpZGRlbicpO1xyXG4gICAgICAgICAgICAkcGFyZW50QWN0aW9uLnJlbW92ZUNsYXNzKCdpcy1oaWRkZW4nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRTdWJNZW51cygpIHtcclxuICAgICAgICB0aGlzLiRuYXZMaXN0LmZpbmQoJy5pcy1oaWRkZW4nKS5yZW1vdmVDbGFzcygnaXMtaGlkZGVuJyk7XHJcbiAgICAgICAgdGhpcy4kbmF2TGlzdC5yZW1vdmVDbGFzcygnc3ViTWVudS1pcy1vcGVuJyk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qXHJcbiAqIENyZWF0ZSBhIG5ldyBNb2JpbGVNZW51VG9nZ2xlIGluc3RhbmNlXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cclxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmhlYWRlclNlbGVjdG9yXVxyXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMubWVudVNlbGVjdG9yXVxyXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuc2Nyb2xsVmlld1NlbGVjdG9yXVxyXG4gKiBAcmV0dXJuIHtNb2JpbGVNZW51VG9nZ2xlfVxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbW9iaWxlTWVudVRvZ2dsZUZhY3Rvcnkoc2VsZWN0b3IgPSBgW2RhdGEtJHtQTFVHSU5fS0VZLlNOQUtFfV1gLCBvdmVycmlkZU9wdGlvbnMgPSB7fSkge1xyXG4gICAgY29uc3QgJHRvZ2dsZSA9ICQoc2VsZWN0b3IpLmVxKDApO1xyXG4gICAgY29uc3QgaW5zdGFuY2VLZXkgPSBgJHtQTFVHSU5fS0VZLkNBTUVMfUluc3RhbmNlYDtcclxuICAgIGNvbnN0IGNhY2hlZE1vYmlsZU1lbnUgPSAkdG9nZ2xlLmRhdGEoaW5zdGFuY2VLZXkpO1xyXG5cclxuICAgIGlmIChjYWNoZWRNb2JpbGVNZW51IGluc3RhbmNlb2YgTW9iaWxlTWVudVRvZ2dsZSkge1xyXG4gICAgICAgIHJldHVybiBjYWNoZWRNb2JpbGVNZW51O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG9wdGlvbnMgPSBfLmV4dGVuZChvcHRpb25zRnJvbURhdGEoJHRvZ2dsZSksIG92ZXJyaWRlT3B0aW9ucyk7XHJcbiAgICBjb25zdCBtb2JpbGVNZW51ID0gbmV3IE1vYmlsZU1lbnVUb2dnbGUoJHRvZ2dsZSwgb3B0aW9ucyk7XHJcblxyXG4gICAgJHRvZ2dsZS5kYXRhKGluc3RhbmNlS2V5LCBtb2JpbGVNZW51KTtcclxuXHJcbiAgICByZXR1cm4gbW9iaWxlTWVudTtcclxufVxyXG4iLCJpbXBvcnQgZm91bmRhdGlvbiBmcm9tICcuL2ZvdW5kYXRpb24nO1xyXG5pbXBvcnQgKiBhcyBmb2N1c1RyYXAgZnJvbSAnZm9jdXMtdHJhcCc7XHJcblxyXG5jb25zdCBib2R5QWN0aXZlQ2xhc3MgPSAnaGFzLWFjdGl2ZU1vZGFsJztcclxuY29uc3QgbG9hZGluZ092ZXJsYXlDbGFzcyA9ICdsb2FkaW5nT3ZlcmxheSc7XHJcbmNvbnN0IG1vZGFsQm9keUNsYXNzID0gJ21vZGFsLWJvZHknO1xyXG5jb25zdCBtb2RhbENvbnRlbnRDbGFzcyA9ICdtb2RhbC1jb250ZW50JztcclxuXHJcbmNvbnN0IFNpemVDbGFzc2VzID0ge1xyXG4gICAgc21hbGw6ICdtb2RhbC0tc21hbGwnLFxyXG4gICAgbGFyZ2U6ICdtb2RhbC0tbGFyZ2UnLFxyXG4gICAgbm9ybWFsOiAnJyxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBNb2RhbEV2ZW50cyA9IHtcclxuICAgIGNsb3NlOiAnY2xvc2UuZm5kdG4ucmV2ZWFsJyxcclxuICAgIGNsb3NlZDogJ2Nsb3NlZC5mbmR0bi5yZXZlYWwnLFxyXG4gICAgb3BlbjogJ29wZW4uZm5kdG4ucmV2ZWFsJyxcclxuICAgIG9wZW5lZDogJ29wZW5lZC5mbmR0bi5yZXZlYWwnLFxyXG4gICAgbG9hZGVkOiAnbG9hZGVkLmRhdGEuY3VzdG9tJyxcclxufTtcclxuXHJcbmZ1bmN0aW9uIGdldFNpemVGcm9tTW9kYWwoJG1vZGFsKSB7XHJcbiAgICBpZiAoJG1vZGFsLmhhc0NsYXNzKFNpemVDbGFzc2VzLnNtYWxsKSkge1xyXG4gICAgICAgIHJldHVybiAnc21hbGwnO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICgkbW9kYWwuaGFzQ2xhc3MoU2l6ZUNsYXNzZXMubGFyZ2UpKSB7XHJcbiAgICAgICAgcmV0dXJuICdsYXJnZSc7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuICdub3JtYWwnO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRWaWV3cG9ydEhlaWdodChtdWx0aXBsZXIgPSAxKSB7XHJcbiAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTtcclxuXHJcbiAgICByZXR1cm4gdmlld3BvcnRIZWlnaHQgKiBtdWx0aXBsZXI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdyYXBNb2RhbEJvZHkoY29udGVudCkge1xyXG4gICAgY29uc3QgJG1vZGFsQm9keSA9ICQoJzxkaXY+Jyk7XHJcblxyXG4gICAgJG1vZGFsQm9keVxyXG4gICAgICAgIC5hZGRDbGFzcyhtb2RhbEJvZHlDbGFzcylcclxuICAgICAgICAuaHRtbChjb250ZW50KTtcclxuXHJcbiAgICByZXR1cm4gJG1vZGFsQm9keTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVzdHJhaW5Db250ZW50SGVpZ2h0KCRjb250ZW50KSB7XHJcbiAgICBpZiAoJGNvbnRlbnQubGVuZ3RoID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgJGJvZHkgPSAkKGAuJHttb2RhbEJvZHlDbGFzc31gLCAkY29udGVudCk7XHJcblxyXG4gICAgaWYgKCRib2R5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGJvZHlIZWlnaHQgPSAkYm9keS5vdXRlckhlaWdodCgpO1xyXG4gICAgY29uc3QgY29udGVudEhlaWdodCA9ICRjb250ZW50Lm91dGVySGVpZ2h0KCk7XHJcbiAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IGdldFZpZXdwb3J0SGVpZ2h0KDAuOSk7XHJcbiAgICBjb25zdCBtYXhIZWlnaHQgPSB2aWV3cG9ydEhlaWdodCAtIChjb250ZW50SGVpZ2h0IC0gYm9keUhlaWdodCk7XHJcblxyXG4gICAgJGJvZHkuY3NzKCdtYXgtaGVpZ2h0JywgbWF4SGVpZ2h0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlTW9kYWxDb250ZW50KCRtb2RhbCkge1xyXG4gICAgbGV0ICRjb250ZW50ID0gJChgLiR7bW9kYWxDb250ZW50Q2xhc3N9YCwgJG1vZGFsKTtcclxuXHJcbiAgICBpZiAoJGNvbnRlbnQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gJG1vZGFsLmNoaWxkcmVuKCk7XHJcblxyXG4gICAgICAgICRjb250ZW50ID0gJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAuYWRkQ2xhc3MobW9kYWxDb250ZW50Q2xhc3MpXHJcbiAgICAgICAgICAgIC5hcHBlbmQoZXhpc3RpbmdDb250ZW50KVxyXG4gICAgICAgICAgICAuYXBwZW5kVG8oJG1vZGFsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gJGNvbnRlbnQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUxvYWRpbmdPdmVybGF5KCRtb2RhbCkge1xyXG4gICAgbGV0ICRsb2FkaW5nT3ZlcmxheSA9ICQoYC4ke2xvYWRpbmdPdmVybGF5Q2xhc3N9YCwgJG1vZGFsKTtcclxuXHJcbiAgICBpZiAoJGxvYWRpbmdPdmVybGF5Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICRsb2FkaW5nT3ZlcmxheSA9ICQoJzxkaXY+JylcclxuICAgICAgICAgICAgLmFkZENsYXNzKGxvYWRpbmdPdmVybGF5Q2xhc3MpXHJcbiAgICAgICAgICAgIC5hcHBlbmRUbygkbW9kYWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAkbG9hZGluZ092ZXJsYXk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXF1aXJlIGZvdW5kYXRpb24ucmV2ZWFsXHJcbiAqIERlY29yYXRlIGZvdW5kYXRpb24ucmV2ZWFsIHdpdGggYWRkaXRpb25hbCBtZXRob2RzXHJcbiAqIEBwYXJhbSB7alF1ZXJ5fSAkbW9kYWxcclxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc2l6ZV1cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNb2RhbCB7XHJcbiAgICBjb25zdHJ1Y3RvcigkbW9kYWwsIHtcclxuICAgICAgICBzaXplID0gbnVsbCxcclxuICAgIH0gPSB7fSkge1xyXG4gICAgICAgIHRoaXMuJG1vZGFsID0gJG1vZGFsO1xyXG4gICAgICAgIHRoaXMuJGNvbnRlbnQgPSBjcmVhdGVNb2RhbENvbnRlbnQodGhpcy4kbW9kYWwpO1xyXG4gICAgICAgIHRoaXMuJG92ZXJsYXkgPSBjcmVhdGVMb2FkaW5nT3ZlcmxheSh0aGlzLiRtb2RhbCk7XHJcbiAgICAgICAgdGhpcy5kZWZhdWx0U2l6ZSA9IHNpemUgfHwgZ2V0U2l6ZUZyb21Nb2RhbCgkbW9kYWwpO1xyXG4gICAgICAgIHRoaXMuc2l6ZSA9IHRoaXMuZGVmYXVsdFNpemU7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy4kcHJlTW9kYWxGb2N1c2VkRWwgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZm9jdXNUcmFwID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5vbk1vZGFsT3BlbiA9IHRoaXMub25Nb2RhbE9wZW4uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9uTW9kYWxPcGVuZWQgPSB0aGlzLm9uTW9kYWxPcGVuZWQuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9uTW9kYWxDbG9zZSA9IHRoaXMub25Nb2RhbENsb3NlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5vbk1vZGFsQ2xvc2VkID0gdGhpcy5vbk1vZGFsQ2xvc2VkLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xyXG5cclxuICAgICAgICAvKiBTVFJGLTI0NzEgLSBNdWx0aXBsZSBXaXNoIExpc3RzIC0gcHJldmVudHMgZG91YmxlLWZpcmluZ1xyXG4gICAgICAgICAqIG9mIGZvdW5kYXRpb24uZHJvcGRvd24gY2xpY2suZm5kdG4uZHJvcGRvd24gZXZlbnQgKi9cclxuICAgICAgICB0aGlzLiRtb2RhbC5vbignY2xpY2snLCAnLmRyb3Bkb3duLW1lbnUtYnV0dG9uJywgZSA9PiB7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHBlbmRpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BlbmRpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHBlbmRpbmcocGVuZGluZykge1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmcgPSBwZW5kaW5nO1xyXG5cclxuICAgICAgICBpZiAocGVuZGluZykge1xyXG4gICAgICAgICAgICB0aGlzLiRvdmVybGF5LnNob3coKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLiRvdmVybGF5LmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNpemUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHNpemUoc2l6ZSkge1xyXG4gICAgICAgIHRoaXMuX3NpemUgPSBzaXplO1xyXG5cclxuICAgICAgICB0aGlzLiRtb2RhbFxyXG4gICAgICAgICAgICAucmVtb3ZlQ2xhc3MoU2l6ZUNsYXNzZXMuc21hbGwpXHJcbiAgICAgICAgICAgIC5yZW1vdmVDbGFzcyhTaXplQ2xhc3Nlcy5sYXJnZSlcclxuICAgICAgICAgICAgLmFkZENsYXNzKFNpemVDbGFzc2VzW3NpemVdIHx8ICcnKTtcclxuICAgIH1cclxuXHJcbiAgICBiaW5kRXZlbnRzKCkge1xyXG4gICAgICAgIHRoaXMuJG1vZGFsLm9uKE1vZGFsRXZlbnRzLmNsb3NlLCB0aGlzLm9uTW9kYWxDbG9zZSk7XHJcbiAgICAgICAgdGhpcy4kbW9kYWwub24oTW9kYWxFdmVudHMuY2xvc2VkLCB0aGlzLm9uTW9kYWxDbG9zZWQpO1xyXG4gICAgICAgIHRoaXMuJG1vZGFsLm9uKE1vZGFsRXZlbnRzLm9wZW4sIHRoaXMub25Nb2RhbE9wZW4pO1xyXG4gICAgICAgIHRoaXMuJG1vZGFsLm9uKE1vZGFsRXZlbnRzLm9wZW5lZCwgdGhpcy5vbk1vZGFsT3BlbmVkKTtcclxuICAgIH1cclxuXHJcbiAgICBvcGVuKHtcclxuICAgICAgICBzaXplLFxyXG4gICAgICAgIHBlbmRpbmcgPSB0cnVlLFxyXG4gICAgICAgIGNsZWFyQ29udGVudCA9IHRydWUsXHJcbiAgICB9ID0ge30pIHtcclxuICAgICAgICB0aGlzLnBlbmRpbmcgPSBwZW5kaW5nO1xyXG5cclxuICAgICAgICBpZiAoc2l6ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNsZWFyQ29udGVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyQ29udGVudCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy4kbW9kYWwuZm91bmRhdGlvbigncmV2ZWFsJywgJ29wZW4nKTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZSgpIHtcclxuICAgICAgICB0aGlzLiRtb2RhbC5mb3VuZGF0aW9uKCdyZXZlYWwnLCAnY2xvc2UnKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVDb250ZW50KGNvbnRlbnQsIHsgd3JhcCA9IGZhbHNlIH0gPSB7fSkge1xyXG4gICAgICAgIGxldCAkY29udGVudCA9ICQoY29udGVudCk7XHJcblxyXG4gICAgICAgIGlmICh3cmFwKSB7XHJcbiAgICAgICAgICAgICRjb250ZW50ID0gd3JhcE1vZGFsQm9keShjb250ZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucGVuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuJGNvbnRlbnQuaHRtbCgkY29udGVudCk7XHJcbiAgICAgICAgdGhpcy4kbW9kYWwudHJpZ2dlcihNb2RhbEV2ZW50cy5sb2FkZWQpO1xyXG5cclxuICAgICAgICByZXN0cmFpbkNvbnRlbnRIZWlnaHQodGhpcy4kY29udGVudCk7XHJcbiAgICAgICAgZm91bmRhdGlvbih0aGlzLiRjb250ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhckNvbnRlbnQoKSB7XHJcbiAgICAgICAgdGhpcy4kY29udGVudC5odG1sKCcnKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXR1cEZvY3VzVHJhcCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuJHByZU1vZGFsRm9jdXNlZEVsKSB0aGlzLiRwcmVNb2RhbEZvY3VzZWRFbCA9ICQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5mb2N1c1RyYXApIHtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c1RyYXAgPSBmb2N1c1RyYXAuY3JlYXRlRm9jdXNUcmFwKHRoaXMuJG1vZGFsWzBdLCB7XHJcbiAgICAgICAgICAgICAgICBlc2NhcGVEZWFjdGl2YXRlczogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICByZXR1cm5Gb2N1c09uRGVhY3RpdmF0ZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBhbGxvd091dHNpZGVDbGljazogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGZhbGxiYWNrRm9jdXM6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmYWxsYmFja05vZGUgPSB0aGlzLiRwcmVNb2RhbEZvY3VzZWRFbCAmJiB0aGlzLiRwcmVNb2RhbEZvY3VzZWRFbC5sZW5ndGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLiRwcmVNb2RhbEZvY3VzZWRFbFswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICQoJ1tkYXRhLWhlYWRlci1sb2dvLWxpbmtdJylbMF07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFja05vZGU7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZm9jdXNUcmFwLmRlYWN0aXZhdGUoKTtcclxuICAgICAgICB0aGlzLmZvY3VzVHJhcC5hY3RpdmF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uTW9kYWxDbG9zZSgpIHtcclxuICAgICAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoYm9keUFjdGl2ZUNsYXNzKTtcclxuICAgIH1cclxuXHJcbiAgICBvbk1vZGFsQ2xvc2VkKCkge1xyXG4gICAgICAgIHRoaXMuc2l6ZSA9IHRoaXMuZGVmYXVsdFNpemU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmZvY3VzVHJhcCkgdGhpcy5mb2N1c1RyYXAuZGVhY3RpdmF0ZSgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy4kcHJlTW9kYWxGb2N1c2VkRWwpIHRoaXMuJHByZU1vZGFsRm9jdXNlZEVsLmZvY3VzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuJHByZU1vZGFsRm9jdXNlZEVsID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBvbk1vZGFsT3BlbigpIHtcclxuICAgICAgICAkKCdib2R5JykuYWRkQ2xhc3MoYm9keUFjdGl2ZUNsYXNzKTtcclxuICAgIH1cclxuXHJcbiAgICBvbk1vZGFsT3BlbmVkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy4kbW9kYWwub25lKE1vZGFsRXZlbnRzLmxvYWRlZCwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuJG1vZGFsLmhhc0NsYXNzKCdvcGVuJykpIHRoaXMuc2V0dXBGb2N1c1RyYXAoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXR1cEZvY3VzVHJhcCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVzdHJhaW5Db250ZW50SGVpZ2h0KHRoaXMuJGNvbnRlbnQpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJuIGFuIGFycmF5IG9mIG1vZGFsc1xyXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcclxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc2l6ZV1cclxuICogQHJldHVybnMge2FycmF5fVxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbW9kYWxGYWN0b3J5KHNlbGVjdG9yID0gJ1tkYXRhLXJldmVhbF0nLCBvcHRpb25zID0ge30pIHtcclxuICAgIGNvbnN0ICRtb2RhbHMgPSAkKHNlbGVjdG9yLCBvcHRpb25zLiRjb250ZXh0KTtcclxuXHJcbiAgICByZXR1cm4gJG1vZGFscy5tYXAoKGluZGV4LCBlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgY29uc3QgJG1vZGFsID0gJChlbGVtZW50KTtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZUtleSA9ICdtb2RhbEluc3RhbmNlJztcclxuICAgICAgICBjb25zdCBjYWNoZWRNb2RhbCA9ICRtb2RhbC5kYXRhKGluc3RhbmNlS2V5KTtcclxuXHJcbiAgICAgICAgaWYgKGNhY2hlZE1vZGFsIGluc3RhbmNlb2YgTW9kYWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZE1vZGFsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbW9kYWwgPSBuZXcgTW9kYWwoJG1vZGFsLCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgJG1vZGFsLmRhdGEoaW5zdGFuY2VLZXksIG1vZGFsKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1vZGFsO1xyXG4gICAgfSkudG9BcnJheSgpO1xyXG59XHJcblxyXG4vKlxyXG4gKiBSZXR1cm4gdGhlIGRlZmF1bHQgcGFnZSBtb2RhbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRNb2RhbCgpIHtcclxuICAgIHJldHVybiBtb2RhbEZhY3RvcnkoJyNtb2RhbCcpWzBdO1xyXG59XHJcblxyXG4vKlxyXG4gKiBSZXR1cm4gdGhlIGRlZmF1bHQgYWxlcnQgbW9kYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhbGVydE1vZGFsKCkge1xyXG4gICAgcmV0dXJuIG1vZGFsRmFjdG9yeSgnI2FsZXJ0LW1vZGFsJylbMF07XHJcbn1cclxuXHJcbi8qXHJcbiAqIERpc3BsYXkgdGhlIGdpdmVuIG1lc3NhZ2UgaW4gdGhlIGRlZmF1bHQgYWxlcnQgbW9kYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzaG93QWxlcnRNb2RhbChtZXNzYWdlKSB7XHJcbiAgICBjb25zdCBtb2RhbCA9IGFsZXJ0TW9kYWwoKTtcclxuICAgIG1vZGFsLm9wZW4oKTtcclxuICAgIG1vZGFsLnVwZGF0ZUNvbnRlbnQoYDxzcGFuPiR7bWVzc2FnZX08L3NwYW4+YCk7XHJcbn1cclxuIiwiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHV0aWxzIGZyb20gJ0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzJztcclxuaW1wb3J0IFN0ZW5jaWxEcm9wRG93biBmcm9tICcuL3N0ZW5jaWwtZHJvcGRvd24nO1xyXG5pbXBvcnQgdXJsVXRpbHMgZnJvbSAnLi4vY29tbW9uL3V0aWxzL3VybC11dGlscyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKSB7XHJcbiAgICBjb25zdCBUT1BfU1RZTElORyA9ICd0b3A6IDQ5cHg7JztcclxuICAgIGNvbnN0ICRxdWlja1NlYXJjaFJlc3VsdHMgPSAkKCcucXVpY2tTZWFyY2hSZXN1bHRzJyk7XHJcbiAgICBjb25zdCAkcXVpY2tTZWFyY2hGb3JtcyA9ICQoJ1tkYXRhLXF1aWNrLXNlYXJjaC1mb3JtXScpO1xyXG4gICAgY29uc3QgJHF1aWNrU2VhcmNoRXhwYW5kID0gJCgnI3F1aWNrLXNlYXJjaC1leHBhbmQnKTtcclxuICAgIGNvbnN0ICRzZWFyY2hRdWVyeSA9ICRxdWlja1NlYXJjaEZvcm1zLmZpbmQoJ1tkYXRhLXNlYXJjaC1xdWlja10nKTtcclxuICAgIGNvbnN0IHN0ZW5jaWxEcm9wRG93bkV4dGVuZGFibGVzID0ge1xyXG4gICAgICAgIGhpZGU6ICgpID0+IHtcclxuICAgICAgICAgICAgJHF1aWNrU2VhcmNoRXhwYW5kLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICRzZWFyY2hRdWVyeS50cmlnZ2VyKCdibHVyJyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBzaG93OiAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgJHF1aWNrU2VhcmNoRXhwYW5kLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKTtcclxuICAgICAgICAgICAgJHNlYXJjaFF1ZXJ5LnRyaWdnZXIoJ2ZvY3VzJyk7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgY29uc3Qgc3RlbmNpbERyb3BEb3duID0gbmV3IFN0ZW5jaWxEcm9wRG93bihzdGVuY2lsRHJvcERvd25FeHRlbmRhYmxlcyk7XHJcbiAgICBzdGVuY2lsRHJvcERvd24uYmluZCgkKCdbZGF0YS1zZWFyY2g9XCJxdWlja1NlYXJjaFwiXScpLCAkKCcjcXVpY2tTZWFyY2gnKSwgVE9QX1NUWUxJTkcpO1xyXG5cclxuICAgIHN0ZW5jaWxEcm9wRG93bkV4dGVuZGFibGVzLm9uQm9keUNsaWNrID0gKGUsICRjb250YWluZXIpID0+IHtcclxuICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IGVsZW1lbnQgaGFzIHRoaXMgZGF0YSB0YWcgb3Igb25lIG9mIGl0J3MgcGFyZW50cywgZG8gbm90IGNsb3NlIHRoZSBzZWFyY2ggcmVzdWx0c1xyXG4gICAgICAgIC8vIFdlIGhhdmUgdG8gc3BlY2lmeSBgLm1vZGFsLWJhY2tncm91bmRgIGJlY2F1c2Ugb2YgbGltaXRhdGlvbnMgYXJvdW5kIEZvdW5kYXRpb24gUmV2ZWFsIG5vdCBhbGxvd2luZ1xyXG4gICAgICAgIC8vIGFueSBtb2RpZmljYXRpb24gdG8gdGhlIGJhY2tncm91bmQgZWxlbWVudC5cclxuICAgICAgICBpZiAoJChlLnRhcmdldCkuY2xvc2VzdCgnW2RhdGEtcHJldmVudC1xdWljay1zZWFyY2gtY2xvc2VdLCAubW9kYWwtYmFja2dyb3VuZCcpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBzdGVuY2lsRHJvcERvd24uaGlkZSgkY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIHN0YWdnZXIgc2VhcmNoaW5nIGZvciAxMjAwbXMgYWZ0ZXIgbGFzdCBpbnB1dFxyXG4gICAgY29uc3QgZGVib3VuY2VXYWl0VGltZSA9IDEyMDA7XHJcbiAgICBjb25zdCBkb1NlYXJjaCA9IF8uZGVib3VuY2UoKHNlYXJjaFF1ZXJ5KSA9PiB7XHJcbiAgICAgICAgdXRpbHMuYXBpLnNlYXJjaC5zZWFyY2goc2VhcmNoUXVlcnksIHsgdGVtcGxhdGU6ICdzZWFyY2gvcXVpY2stcmVzdWx0cycgfSwgKGVyciwgcmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAkcXVpY2tTZWFyY2hSZXN1bHRzLmh0bWwocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICBjb25zdCAkcXVpY2tTZWFyY2hSZXN1bHRzQ3VycmVudCA9ICRxdWlja1NlYXJjaFJlc3VsdHMuZmlsdGVyKCc6dmlzaWJsZScpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgJG5vUmVzdWx0c01lc3NhZ2UgPSAkcXVpY2tTZWFyY2hSZXN1bHRzQ3VycmVudC5maW5kKCcucXVpY2tTZWFyY2hNZXNzYWdlJyk7XHJcbiAgICAgICAgICAgIGlmICgkbm9SZXN1bHRzTWVzc2FnZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICRub1Jlc3VsdHNNZXNzYWdlLmF0dHIoe1xyXG4gICAgICAgICAgICAgICAgICAgIHJvbGU6ICdzdGF0dXMnLFxyXG4gICAgICAgICAgICAgICAgICAgICdhcmlhLWxpdmUnOiAncG9saXRlJyxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgJHF1aWNrU2VhcmNoQXJpYU1lc3NhZ2UgPSAkcXVpY2tTZWFyY2hSZXN1bHRzQ3VycmVudC5uZXh0KCk7XHJcbiAgICAgICAgICAgICAgICAkcXVpY2tTZWFyY2hBcmlhTWVzc2FnZS5hZGRDbGFzcygndS1oaWRkZW4nKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcmVkZWZpbmVkVGV4dCA9ICRxdWlja1NlYXJjaEFyaWFNZXNzYWdlLmRhdGEoJ3NlYXJjaC1hcmlhLW1lc3NhZ2UtcHJlZGVmaW5lZC10ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtc0ZvdW5kQ291bnQgPSAkcXVpY2tTZWFyY2hSZXN1bHRzQ3VycmVudC5maW5kKCcucHJvZHVjdCcpLmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgICAgICAkcXVpY2tTZWFyY2hBcmlhTWVzc2FnZS50ZXh0KGAke2l0ZW1zRm91bmRDb3VudH0gJHtwcmVkZWZpbmVkVGV4dH0gJHtzZWFyY2hRdWVyeX1gKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAkcXVpY2tTZWFyY2hBcmlhTWVzc2FnZS5yZW1vdmVDbGFzcygndS1oaWRkZW4nKTtcclxuICAgICAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0sIGRlYm91bmNlV2FpdFRpbWUpO1xyXG5cclxuICAgIHV0aWxzLmhvb2tzLm9uKCdzZWFyY2gtcXVpY2snLCAoZXZlbnQsIGN1cnJlbnRUYXJnZXQpID0+IHtcclxuICAgICAgICBjb25zdCBzZWFyY2hRdWVyeSA9ICQoY3VycmVudFRhcmdldCkudmFsKCk7XHJcblxyXG4gICAgICAgIC8vIHNlcnZlciB3aWxsIG9ubHkgcGVyZm9ybSBzZWFyY2ggd2l0aCBhdCBsZWFzdCAzIGNoYXJhY3RlcnNcclxuICAgICAgICBpZiAoc2VhcmNoUXVlcnkubGVuZ3RoIDwgMykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkb1NlYXJjaChzZWFyY2hRdWVyeSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBDYXRjaCB0aGUgc3VibWlzc2lvbiBvZiB0aGUgcXVpY2stc2VhcmNoIGZvcm1zXHJcbiAgICAkcXVpY2tTZWFyY2hGb3Jtcy5vbignc3VibWl0JywgZXZlbnQgPT4ge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgIGNvbnN0ICR0YXJnZXQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xyXG4gICAgICAgIGNvbnN0IHNlYXJjaFF1ZXJ5ID0gJHRhcmdldC5maW5kKCdpbnB1dCcpLnZhbCgpO1xyXG4gICAgICAgIGNvbnN0IHNlYXJjaFVybCA9ICR0YXJnZXQuZGF0YSgndXJsJyk7XHJcblxyXG4gICAgICAgIGlmIChzZWFyY2hRdWVyeS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdXJsVXRpbHMuZ29Ub1VybChgJHtzZWFyY2hVcmx9P3NlYXJjaF9xdWVyeT0ke3NlYXJjaFF1ZXJ5fWApO1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgIH0pO1xyXG59XHJcbiIsImltcG9ydCAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uL2ZvdW5kYXRpb24nO1xyXG5pbXBvcnQgJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi9mb3VuZGF0aW9uLmRyb3Bkb3duJztcclxuaW1wb3J0IHV0aWxzIGZyb20gJ0BiaWdjb21tZXJjZS9zdGVuY2lsLXV0aWxzJztcclxuaW1wb3J0IFJldmlldyBmcm9tICcuLi9wcm9kdWN0L3Jldmlld3MnO1xyXG5pbXBvcnQgUHJvZHVjdERldGFpbHMgZnJvbSAnLi4vY29tbW9uL3Byb2R1Y3QtZGV0YWlscyc7XHJcbmltcG9ydCB7IGRlZmF1bHRNb2RhbCwgTW9kYWxFdmVudHMgfSBmcm9tICcuL21vZGFsJztcclxuaW1wb3J0ICdzbGljay1jYXJvdXNlbCc7XHJcbmltcG9ydCB7IHNldENhcm91c2VsU3RhdGUsIG9uU2xpY2tDYXJvdXNlbENoYW5nZSwgb25Vc2VyQ2Fyb3VzZWxDaGFuZ2UgfSBmcm9tICcuLi9jb21tb24vY2Fyb3VzZWwnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGNvbnRleHQpIHtcclxuICAgIGNvbnN0IG1vZGFsID0gZGVmYXVsdE1vZGFsKCk7XHJcblxyXG4gICAgJCgnYm9keScpLm9uKCdjbGljaycsICcucXVpY2t2aWV3JywgZXZlbnQgPT4ge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHByb2R1Y3RJZCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YSgncHJvZHVjdElkJyk7XHJcbiAgICAgICAgY29uc3QgaGFuZGxlRHJvcGRvd25FeHBhbmQgPSAoeyBjdXJyZW50VGFyZ2V0IH0pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgJGRyb3Bkb3duTWVudSA9ICQoY3VycmVudFRhcmdldCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQnRuSGVpZ2h0ID0gJGRyb3Bkb3duTWVudS5wcmV2KCkub3V0ZXJIZWlnaHQoKTtcclxuXHJcbiAgICAgICAgICAgICRkcm9wZG93bk1lbnUuY3NzKCd0b3AnLCBkcm9wZG93bkJ0bkhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbW9kYWwuJG1vZGFsLm9uZShNb2RhbEV2ZW50cy5jbG9zZSwgKCkgPT4gJGRyb3Bkb3duTWVudS5vZmYoJ29wZW5lZC5mbmR0bi5kcm9wZG93bicsIGhhbmRsZURyb3Bkb3duRXhwYW5kKSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbW9kYWwub3Blbih7IHNpemU6ICdsYXJnZScgfSk7XHJcblxyXG4gICAgICAgIHV0aWxzLmFwaS5wcm9kdWN0LmdldEJ5SWQocHJvZHVjdElkLCB7IHRlbXBsYXRlOiAncHJvZHVjdHMvcXVpY2stdmlldycgfSwgKGVyciwgcmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgbW9kYWwudXBkYXRlQ29udGVudChyZXNwb25zZSk7XHJcblxyXG4gICAgICAgICAgICAkKCcjbW9kYWwgLmRyb3Bkb3duLW1lbnUnKS5vbignb3BlbmVkLmZuZHRuLmRyb3Bkb3duJywgaGFuZGxlRHJvcGRvd25FeHBhbmQpO1xyXG4gICAgICAgICAgICBtb2RhbC4kY29udGVudC5maW5kKCcucHJvZHVjdFZpZXcnKS5hZGRDbGFzcygncHJvZHVjdFZpZXctLXF1aWNrVmlldycpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgJGNhcm91c2VsID0gbW9kYWwuJGNvbnRlbnQuZmluZCgnW2RhdGEtc2xpY2tdJyk7XHJcbiAgICAgICAgICAgIGlmICgkY2Fyb3VzZWwubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAkY2Fyb3VzZWwub24oJ2luaXQgYnJlYWtwb2ludCBzd2lwZScsIHNldENhcm91c2VsU3RhdGUpO1xyXG4gICAgICAgICAgICAgICAgJGNhcm91c2VsLm9uKCdjbGljaycsICcuc2xpY2stYXJyb3csIC5zbGljay1kb3RzJywgc2V0Q2Fyb3VzZWxTdGF0ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgJGNhcm91c2VsLm9uKCdpbml0IGFmdGVyQ2hhbmdlJywgKGUsIGNhcm91c2VsT2JqKSA9PiBvblNsaWNrQ2Fyb3VzZWxDaGFuZ2UoZSwgY2Fyb3VzZWxPYmosIGNvbnRleHQpKTtcclxuICAgICAgICAgICAgICAgICRjYXJvdXNlbC5vbignY2xpY2snLCAnLnNsaWNrLWFycm93LCAuc2xpY2stZG90cycsICRjYXJvdXNlbCwgZSA9PiBvblVzZXJDYXJvdXNlbENoYW5nZShlLCBjb250ZXh0KSk7XHJcbiAgICAgICAgICAgICAgICAkY2Fyb3VzZWwub24oJ3N3aXBlJywgKGUsIGNhcm91c2VsT2JqKSA9PiBvblVzZXJDYXJvdXNlbENoYW5nZShlLCBjb250ZXh0LCBjYXJvdXNlbE9iai4kc2xpZGVyKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG1vZGFsLiRtb2RhbC5oYXNDbGFzcygnb3BlbicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJGNhcm91c2VsLnNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGFsLiRtb2RhbC5vbmUoTW9kYWxFdmVudHMub3BlbmVkLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkLmNvbnRhaW5zKGRvY3VtZW50LCAkY2Fyb3VzZWxbMF0pKSAkY2Fyb3VzZWwuc2xpY2soKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tbmV3ICovXHJcbiAgICAgICAgICAgIG5ldyBSZXZpZXcoeyAkY29udGV4dDogbW9kYWwuJGNvbnRlbnQgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb2R1Y3REZXRhaWxzKG1vZGFsLiRjb250ZW50LmZpbmQoJy5xdWlja1ZpZXcnKSwgY29udGV4dCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxufVxyXG4iLCJjb25zdCByZXZlYWxDbG9zZUF0dHIgPSAncmV2ZWFsQ2xvc2UnO1xyXG5jb25zdCByZXZlYWxDbG9zZVNlbGVjdG9yID0gYFtkYXRhLSR7cmV2ZWFsQ2xvc2VBdHRyfV1gO1xyXG5jb25zdCByZXZlYWxTZWxlY3RvciA9ICdbZGF0YS1yZXZlYWxdJztcclxuXHJcbmNsYXNzIFJldmVhbENsb3NlIHtcclxuICAgIGNvbnN0cnVjdG9yKCRidXR0b24pIHtcclxuICAgICAgICB0aGlzLiRidXR0b24gPSAkYnV0dG9uO1xyXG4gICAgICAgIHRoaXMubW9kYWxJZCA9ICRidXR0b24uZGF0YShyZXZlYWxDbG9zZUF0dHIpO1xyXG5cclxuICAgICAgICB0aGlzLm9uQ2xpY2sgPSB0aGlzLm9uQ2xpY2suYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1vZGFsKCkge1xyXG4gICAgICAgIGxldCAkbW9kYWw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1vZGFsSWQpIHtcclxuICAgICAgICAgICAgJG1vZGFsID0gJChgIyR7dGhpcy5tb2RhbElkfWApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICRtb2RhbCA9IHRoaXMuJGJ1dHRvbi5wYXJlbnRzKHJldmVhbFNlbGVjdG9yKS5lcSgwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAkbW9kYWwuZGF0YSgnbW9kYWxJbnN0YW5jZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGJpbmRFdmVudHMoKSB7XHJcbiAgICAgICAgdGhpcy4kYnV0dG9uLm9uKCdjbGljaycsIHRoaXMub25DbGljayk7XHJcbiAgICB9XHJcblxyXG4gICAgdW5iaW5kRXZlbnRzKCkge1xyXG4gICAgICAgIHRoaXMuJGJ1dHRvbi5vZmYoJ2NsaWNrJywgdGhpcy5vbkNsaWNrKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKGV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgeyBtb2RhbCB9ID0gdGhpcztcclxuXHJcbiAgICAgICAgaWYgKG1vZGFsKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICBtb2RhbC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLypcclxuICogRXh0ZW5kIGZvdW5kYXRpb24ucmV2ZWFsIHdpdGggdGhlIGFiaWxpdHkgdG8gY2xvc2UgYSBtb2RhbCBieSBjbGlja2luZyBvbiBhbnkgb2YgaXRzIGNoaWxkIGVsZW1lbnRcclxuICogd2l0aCBkYXRhLXJldmVhbC1jbG9zZSBhdHRyaWJ1dGUuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqXHJcbiAqIDxkaXYgZGF0YS1yZXZlYWwgaWQ9XCJoZWxsb01vZGFsXCI+XHJcbiAqICAgPGJ1dHRvbiBkYXRhLXJldmVhbC1jbG9zZT5Db250aW51ZTwvYnV0dG9uPlxyXG4gKiA8L2Rpdj5cclxuICpcclxuICogPGRpdiBkYXRhLXJldmVhbCBpZD1cImhlbGxvTW9kYWxcIj48L2Rpdj5cclxuICogPGJ1dHRvbiBkYXRhLXJldmVhbC1jbG9zZT1cImhlbGxvTW9kYWxcIj5Db250aW51ZTwvYnV0dG9uPlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmV2ZWFsQ2xvc2VGYWN0b3J5KHNlbGVjdG9yID0gcmV2ZWFsQ2xvc2VTZWxlY3Rvciwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICBjb25zdCAkYnV0dG9ucyA9ICQoc2VsZWN0b3IsIG9wdGlvbnMuJGNvbnRleHQpO1xyXG5cclxuICAgIHJldHVybiAkYnV0dG9ucy5tYXAoKGluZGV4LCBlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgY29uc3QgJGJ1dHRvbiA9ICQoZWxlbWVudCk7XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2VLZXkgPSBgJHtyZXZlYWxDbG9zZUF0dHJ9SW5zdGFuY2VgO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZEJ1dHRvbiA9ICRidXR0b24uZGF0YShpbnN0YW5jZUtleSk7XHJcblxyXG4gICAgICAgIGlmIChjYWNoZWRCdXR0b24gaW5zdGFuY2VvZiBSZXZlYWxDbG9zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQnV0dG9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYnV0dG9uID0gbmV3IFJldmVhbENsb3NlKCRidXR0b24pO1xyXG5cclxuICAgICAgICAkYnV0dG9uLmRhdGEoaW5zdGFuY2VLZXksIGJ1dHRvbik7XHJcblxyXG4gICAgICAgIHJldHVybiBidXR0b247XHJcbiAgICB9KS50b0FycmF5KCk7XHJcbn1cclxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RlbmNpbERyb3Bkb3duIHtcclxuICAgIGNvbnN0cnVjdG9yKGV4dGVuZGFibGVzKSB7XHJcbiAgICAgICAgdGhpcy5leHRlbmRhYmxlcyA9IGV4dGVuZGFibGVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtICRkcm9wRG93blxyXG4gICAgICogQHBhcmFtIHN0eWxlXHJcbiAgICAgKi9cclxuICAgIGhpZGUoJGRyb3BEb3duLCBzdHlsZSkge1xyXG4gICAgICAgIGlmIChzdHlsZSkge1xyXG4gICAgICAgICAgICAkZHJvcERvd24uYXR0cignc3R5bGUnLCBzdHlsZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjYWxsYmFjayBcImhpZGVcIlxyXG4gICAgICAgIGlmICh0aGlzLmV4dGVuZGFibGVzICYmIHRoaXMuZXh0ZW5kYWJsZXMuaGlkZSkge1xyXG4gICAgICAgICAgICB0aGlzLmV4dGVuZGFibGVzLmhpZGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICRkcm9wRG93bi5yZW1vdmVDbGFzcygnaXMtb3BlbiBmLW9wZW4tZHJvcGRvd24nKS5hdHRyKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdygkZHJvcERvd24sIGV2ZW50LCBzdHlsZSkge1xyXG4gICAgICAgIGlmIChzdHlsZSkge1xyXG4gICAgICAgICAgICAkZHJvcERvd24uYXR0cignc3R5bGUnLCBzdHlsZSkuYXR0cignYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICRkcm9wRG93bi5hZGRDbGFzcygnaXMtb3BlbiBmLW9wZW4tZHJvcGRvd24nKS5hdHRyKCdhcmlhLWhpZGRlbicsICdmYWxzZScpO1xyXG5cclxuICAgICAgICAvLyBjYWxsYmFjayBcInNob3dcIlxyXG4gICAgICAgIGlmICh0aGlzLmV4dGVuZGFibGVzICYmIHRoaXMuZXh0ZW5kYWJsZXMuc2hvdykge1xyXG4gICAgICAgICAgICB0aGlzLmV4dGVuZGFibGVzLnNob3coZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBiaW5kKCRkcm9wRG93blRyaWdnZXIsICRjb250YWluZXIsIHN0eWxlKSB7XHJcbiAgICAgICAgbGV0IG1vZGFsT3BlbmVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICRkcm9wRG93blRyaWdnZXIub24oJ2NsaWNrJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCAkY2FydCA9ICQoJy5pcy1vcGVuW2RhdGEtY2FydC1wcmV2aWV3XScpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCRjYXJ0KSB7XHJcbiAgICAgICAgICAgICAgICAkY2FydC50cmlnZ2VyKCdjbGljaycpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoJGNvbnRhaW5lci5oYXNDbGFzcygnaXMtb3BlbicpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoJGNvbnRhaW5lciwgZXZlbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93KCRjb250YWluZXIsIGV2ZW50LCBzdHlsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJCgnYm9keScpLm9uKCdjbGljaycsIGUgPT4ge1xyXG4gICAgICAgICAgICAvLyBDYWxsIG9uQ2xpY2sgaGFuZGxlclxyXG4gICAgICAgICAgICBpZiAodGhpcy5leHRlbmRhYmxlcyAmJiB0aGlzLmV4dGVuZGFibGVzLm9uQm9keUNsaWNrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmV4dGVuZGFibGVzLm9uQm9keUNsaWNrKGUsICRjb250YWluZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkub24oJ2tleXVwJywgKGUpID0+IHtcclxuICAgICAgICAgICAgLy8gSWYgdGhleSBoaXQgZXNjYXBlIGFuZCB0aGUgbW9kYWwgaXNuJ3Qgb3BlbiwgY2xvc2UgdGhlIHNlYXJjaFxyXG4gICAgICAgICAgICBpZiAoZS53aGljaCA9PT0gMjcgJiYgIW1vZGFsT3BlbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoJGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KS5vbignb3Blbi5mbmR0bi5yZXZlYWwnLCAnW2RhdGEtcmV2ZWFsXScsICgpID0+IHtcclxuICAgICAgICAgICAgbW9kYWxPcGVuZWQgPSB0cnVlO1xyXG4gICAgICAgIH0pLm9uKCdjbG9zZS5mbmR0bi5yZXZlYWwnLCAnW2RhdGEtcmV2ZWFsXScsICgpID0+IHtcclxuICAgICAgICAgICAgbW9kYWxPcGVuZWQgPSBmYWxzZTtcclxuICAgICAgICB9KS5vbignY2xpY2snLCAnW2RhdGEtZHJvcC1kb3duLWNsb3NlXScsICgpID0+IHtcclxuICAgICAgICAgICAgbW9kYWxPcGVuZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5oaWRlKCRjb250YWluZXIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCBzdmdJbmplY3RvciBmcm9tICdzdmctaW5qZWN0b3InO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xyXG4gICAgc3ZnSW5qZWN0b3IoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnc3ZnW2RhdGEtc3JjXScpKTtcclxufVxyXG4iLCJpbXBvcnQgc3dlZXRBbGVydCBmcm9tICdzd2VldGFsZXJ0Mic7XHJcblxyXG4vLyBXZWFrTWFwIHdpbGwgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIGlmIG5hdGl2ZSBXZWFrTWFwIGlzIG5vdCBzdXBwb3J0ZWQuXHJcbmNvbnN0IHdlYWtNYXAgPSBuZXcgV2Vha01hcCgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXHJcblxyXG4vLyBTZXQgZGVmYXVsdHMgZm9yIHN3ZWV0YWxlcnQyIHBvcHVwIGJveGVzXHJcbmNvbnN0IFN3YWwgPSBzd2VldEFsZXJ0Lm1peGluKHtcclxuICAgIGJ1dHRvbnNTdHlsaW5nOiBmYWxzZSxcclxuICAgIGN1c3RvbUNsYXNzOiB7XHJcbiAgICAgICAgY29uZmlybUJ1dHRvbjogJ2J1dHRvbicsXHJcbiAgICAgICAgY2FuY2VsQnV0dG9uOiAnYnV0dG9uJyxcclxuICAgIH0sXHJcbn0pO1xyXG5cclxuLy8gUmUtZXhwb3J0XHJcbmV4cG9ydCBkZWZhdWx0IFN3YWw7XHJcbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhZ2VNYW5hZ2VyIHtcclxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQpIHtcclxuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIHR5cGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBvblJlYWR5KCkge1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBsb2FkKGNvbnRleHQpIHtcclxuICAgICAgICBjb25zdCBwYWdlID0gbmV3IHRoaXMoY29udGV4dCk7XHJcblxyXG4gICAgICAgICQoZG9jdW1lbnQpLnJlYWR5KCgpID0+IHtcclxuICAgICAgICAgICAgcGFnZS5vblJlYWR5LmJpbmQocGFnZSkoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgJ2Vhc3l6b29tJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEltYWdlR2FsbGVyeSB7XHJcbiAgICBjb25zdHJ1Y3RvcigkZ2FsbGVyeSkge1xyXG4gICAgICAgIHRoaXMuJG1haW5JbWFnZSA9ICRnYWxsZXJ5LmZpbmQoJ1tkYXRhLWltYWdlLWdhbGxlcnktbWFpbl0nKTtcclxuICAgICAgICB0aGlzLiRtYWluSW1hZ2VOZXN0ZWQgPSAkZ2FsbGVyeS5maW5kKCdbZGF0YS1tYWluLWltYWdlXScpO1xyXG4gICAgICAgIHRoaXMuJHNlbGVjdGFibGVJbWFnZXMgPSAkZ2FsbGVyeS5maW5kKCdbZGF0YS1pbWFnZS1nYWxsZXJ5LWl0ZW1dJyk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50SW1hZ2UgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCkge1xyXG4gICAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xyXG4gICAgICAgIHRoaXMuc2V0SW1hZ2Vab29tKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0TWFpbkltYWdlKGltZ09iaikge1xyXG4gICAgICAgIHRoaXMuY3VycmVudEltYWdlID0geyAuLi5pbWdPYmogfTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVUaHVtYigpO1xyXG4gICAgICAgIHRoaXMuc3dhcE1haW5JbWFnZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEFsdGVybmF0ZUltYWdlKGltZ09iaikge1xyXG4gICAgICAgIGlmICghdGhpcy5zYXZlZEltYWdlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZWRJbWFnZSA9IHtcclxuICAgICAgICAgICAgICAgIG1haW5JbWFnZVVybDogdGhpcy4kbWFpbkltYWdlLmZpbmQoJ2ltZycpLmF0dHIoJ3NyYycpLFxyXG4gICAgICAgICAgICAgICAgem9vbUltYWdlVXJsOiB0aGlzLiRtYWluSW1hZ2UuYXR0cignZGF0YS16b29tLWltYWdlJyksXHJcbiAgICAgICAgICAgICAgICBtYWluSW1hZ2VTcmNzZXQ6IHRoaXMuJG1haW5JbWFnZS5maW5kKCdpbWcnKS5hdHRyKCdzcmNzZXQnKSxcclxuICAgICAgICAgICAgICAgICRzZWxlY3RlZFRodW1iOiB0aGlzLmN1cnJlbnRJbWFnZS4kc2VsZWN0ZWRUaHVtYixcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRNYWluSW1hZ2UoaW1nT2JqKTtcclxuICAgIH1cclxuXHJcbiAgICByZXN0b3JlSW1hZ2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2F2ZWRJbWFnZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldE1haW5JbWFnZSh0aGlzLnNhdmVkSW1hZ2UpO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5zYXZlZEltYWdlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3ROZXdJbWFnZShlKSB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGNvbnN0ICR0YXJnZXQgPSAkKGUuY3VycmVudFRhcmdldCk7XHJcbiAgICAgICAgY29uc3QgaW1nT2JqID0ge1xyXG4gICAgICAgICAgICBtYWluSW1hZ2VVcmw6ICR0YXJnZXQuYXR0cignZGF0YS1pbWFnZS1nYWxsZXJ5LW5ldy1pbWFnZS11cmwnKSxcclxuICAgICAgICAgICAgem9vbUltYWdlVXJsOiAkdGFyZ2V0LmF0dHIoJ2RhdGEtaW1hZ2UtZ2FsbGVyeS16b29tLWltYWdlLXVybCcpLFxyXG4gICAgICAgICAgICBtYWluSW1hZ2VTcmNzZXQ6ICR0YXJnZXQuYXR0cignZGF0YS1pbWFnZS1nYWxsZXJ5LW5ldy1pbWFnZS1zcmNzZXQnKSxcclxuICAgICAgICAgICAgJHNlbGVjdGVkVGh1bWI6ICR0YXJnZXQsXHJcbiAgICAgICAgICAgIG1haW5JbWFnZUFsdDogJHRhcmdldC5jaGlsZHJlbigpLmZpcnN0KCkuYXR0cignYWx0JyksXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNldE1haW5JbWFnZShpbWdPYmopO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEFjdGl2ZVRodW1iKCkge1xyXG4gICAgICAgIHRoaXMuJHNlbGVjdGFibGVJbWFnZXMucmVtb3ZlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRJbWFnZS4kc2VsZWN0ZWRUaHVtYikge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRJbWFnZS4kc2VsZWN0ZWRUaHVtYi5hZGRDbGFzcygnaXMtYWN0aXZlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN3YXBNYWluSW1hZ2UoKSB7XHJcbiAgICAgICAgY29uc3QgaXNCcm93c2VySUUgPSBuYXZpZ2F0b3IudXNlckFnZW50LmluY2x1ZGVzKCdUcmlkZW50Jyk7XHJcblxyXG4gICAgICAgIHRoaXMuZWFzeXpvb20uZGF0YSgnZWFzeVpvb20nKS5zd2FwKFxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRJbWFnZS5tYWluSW1hZ2VVcmwsXHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEltYWdlLnpvb21JbWFnZVVybCxcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50SW1hZ2UubWFpbkltYWdlU3Jjc2V0LFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuJG1haW5JbWFnZS5hdHRyKHtcclxuICAgICAgICAgICAgJ2RhdGEtem9vbS1pbWFnZSc6IHRoaXMuY3VycmVudEltYWdlLnpvb21JbWFnZVVybCxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLiRtYWluSW1hZ2VOZXN0ZWQuYXR0cih7XHJcbiAgICAgICAgICAgIGFsdDogdGhpcy5jdXJyZW50SW1hZ2UubWFpbkltYWdlQWx0LFxyXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5jdXJyZW50SW1hZ2UubWFpbkltYWdlQWx0LFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoaXNCcm93c2VySUUpIHtcclxuICAgICAgICAgICAgY29uc3QgZmFsbGJhY2tTdHlsZXNJRSA9IHtcclxuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWltYWdlJzogYHVybCgke3RoaXMuY3VycmVudEltYWdlLm1haW5JbWFnZVVybH0pYCxcclxuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLXBvc2l0aW9uJzogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1yZXBlYXQnOiAnbm8tcmVwZWF0JyxcclxuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLW9yaWdpbic6ICdjb250ZW50LWJveCcsXHJcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1zaXplJzogJ2NvbnRhaW4nLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy4kbWFpbkltYWdlTmVzdGVkLmNzcyhmYWxsYmFja1N0eWxlc0lFKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tJbWFnZSgpIHtcclxuICAgICAgICBjb25zdCAkaW1hZ2VDb250YWluZXIgPSAkKCcucHJvZHVjdFZpZXctaW1hZ2UnKTtcclxuICAgICAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSAkaW1hZ2VDb250YWluZXIuaGVpZ2h0KCk7XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyV2lkdGggPSAkaW1hZ2VDb250YWluZXIud2lkdGgoKTtcclxuXHJcbiAgICAgICAgY29uc3QgJGltYWdlID0gdGhpcy5lYXN5em9vbS5kYXRhKCdlYXN5Wm9vbScpLiR6b29tO1xyXG4gICAgICAgIGNvbnN0IGhlaWdodCA9ICRpbWFnZS5oZWlnaHQoKTtcclxuICAgICAgICBjb25zdCB3aWR0aCA9ICRpbWFnZS53aWR0aCgpO1xyXG5cclxuICAgICAgICBpZiAoaGVpZ2h0IDwgY29udGFpbmVySGVpZ2h0IHx8IHdpZHRoIDwgY29udGFpbmVyV2lkdGgpIHtcclxuICAgICAgICAgICAgdGhpcy5lYXN5em9vbS5kYXRhKCdlYXN5Wm9vbScpLmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW1hZ2Vab29tKCkge1xyXG4gICAgICAgIHRoaXMuZWFzeXpvb20gPSB0aGlzLiRtYWluSW1hZ2UuZWFzeVpvb20oe1xyXG4gICAgICAgICAgICBvblNob3c6ICgpID0+IHRoaXMuY2hlY2tJbWFnZSgpLFxyXG4gICAgICAgICAgICBlcnJvck5vdGljZTogJycsXHJcbiAgICAgICAgICAgIGxvYWRpbmdOb3RpY2U6ICcnLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGJpbmRFdmVudHMoKSB7XHJcbiAgICAgICAgdGhpcy4kc2VsZWN0YWJsZUltYWdlcy5vbignY2xpY2snLCB0aGlzLnNlbGVjdE5ld0ltYWdlLmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCBub2QgZnJvbSAnLi4vY29tbW9uL25vZCc7XHJcbmltcG9ydCBjb2xsYXBzaWJsZUZhY3RvcnksIHsgQ29sbGFwc2libGVFdmVudHMgfSBmcm9tICcuLi9jb21tb24vY29sbGFwc2libGUnO1xyXG5pbXBvcnQgZm9ybXMgZnJvbSAnLi4vY29tbW9uL21vZGVscy9mb3Jtcyc7XHJcbmltcG9ydCB7IHNhZmVTdHJpbmcgfSBmcm9tICcuLi9jb21tb24vdXRpbHMvc2FmZS1zdHJpbmcnO1xyXG5pbXBvcnQgeyBhbm5vdW5jZUlucHV0RXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzL2Zvcm0tdXRpbHMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3Mge1xyXG4gICAgY29uc3RydWN0b3IoeyAkcmV2aWV3Rm9ybSwgJGNvbnRleHQgfSkge1xyXG4gICAgICAgIGlmICgkcmV2aWV3Rm9ybSAmJiAkcmV2aWV3Rm9ybS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy52YWxpZGF0b3IgPSBub2Qoe1xyXG4gICAgICAgICAgICAgICAgc3VibWl0OiAkcmV2aWV3Rm9ybS5maW5kKCdpbnB1dFt0eXBlPVwic3VibWl0XCJdJyksXHJcbiAgICAgICAgICAgICAgICB0YXA6IGFubm91bmNlSW5wdXRFcnJvck1lc3NhZ2UsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy4kY29udGV4dCA9ICRjb250ZXh0O1xyXG4gICAgICAgIHRoaXMuJHJldmlld1RhYkxpbmsgPSAkKCcucHJvZHVjdFZpZXctcmV2aWV3VGFiTGluaycsIHRoaXMuJGNvbnRleHQpO1xyXG4gICAgICAgIHRoaXMuJHJldmlld3NDb250ZW50ID0gJCgnI3Byb2R1Y3QtcmV2aWV3cycsIHRoaXMuJGNvbnRleHQpO1xyXG4gICAgICAgIHRoaXMuJHJldmlld3NDb250ZW50TGlzdCA9ICQoJyNwcm9kdWN0UmV2aWV3cy1jb250ZW50JywgdGhpcy4kcmV2aWV3c0NvbnRlbnQpO1xyXG4gICAgICAgIHRoaXMuJGNvbGxhcHNpYmxlID0gJCgnW2RhdGEtY29sbGFwc2libGVdJywgdGhpcy4kcmV2aWV3c0NvbnRlbnQpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy4kY29udGV4dCkge1xyXG4gICAgICAgICAgICBjb2xsYXBzaWJsZUZhY3RvcnkoJ1tkYXRhLWNvbGxhcHNpYmxlXScsIHsgJGNvbnRleHQgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0TGlua0JpbmQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5qZWN0UGFnaW5hdGlvbkxpbmsoKTtcclxuICAgICAgICB0aGlzLnNldHVwUmV2aWV3cygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT24gaW5pdGlhbCBwYWdlIGxvYWQsIHRoZSB1c2VyIGNsaWNrcyBvbiBcIigxMiBSZXZpZXdzKVwiIGxpbmtcclxuICAgICAqIFRoZSBicm93c2VyIGp1bXBzIHRvIHRoZSByZXZpZXcgcGFnZSBhbmQgc2hvdWxkIGV4cGFuZCB0aGUgcmV2aWV3cyBzZWN0aW9uXHJcbiAgICAgKi9cclxuICAgIGluaXRMaW5rQmluZCgpIHtcclxuICAgICAgICBjb25zdCAkcHJvZHVjdFJldmlld0xpbmsgPSAkKCcjcHJvZHVjdFJldmlld19saW5rJyk7XHJcbiAgICAgICAgJHByb2R1Y3RSZXZpZXdMaW5rXHJcbiAgICAgICAgICAgIC5hdHRyKCdocmVmJywgYCR7JHByb2R1Y3RSZXZpZXdMaW5rLmF0dHIoJ2hyZWYnKX0ke3dpbmRvdy5sb2NhdGlvbi5zZWFyY2h9I3Byb2R1Y3QtcmV2aWV3c2ApXHJcbiAgICAgICAgICAgIC5vbignY2xpY2snLCAoKSA9PiB0aGlzLmV4cGFuZFJldmlld3MoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0dXBSZXZpZXdzKCkge1xyXG4gICAgICAgIC8vIFdlJ3JlIGluIHBhZ2luYXRpbmcgc3RhdGUsIHJldmlld3Mgc2hvdWxkIGJlIHZpc2libGVcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoXHJcbiAgICAgICAgICAgICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoLmluZGV4T2YoJyNwcm9kdWN0LXJldmlld3MnKSA9PT0gMFxyXG4gICAgICAgICAgICAmJiB0aGlzLiRyZXZpZXdzQ29udGVudC5wYXJlbnRzKCcucXVpY2tWaWV3JykubGVuZ3RoID09PSAwXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kUmV2aWV3cygpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBmb3JjZSBjb2xsYXBzZSBvbiBwYWdlIGxvYWRcclxuICAgICAgICB0aGlzLiRjb2xsYXBzaWJsZS50cmlnZ2VyKENvbGxhcHNpYmxlRXZlbnRzLmNsaWNrKTtcclxuICAgIH1cclxuXHJcbiAgICBleHBhbmRSZXZpZXdzKCkge1xyXG4gICAgICAgIHRoaXMuJHJldmlld1RhYkxpbmsudHJpZ2dlcignY2xpY2snKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLiRyZXZpZXdzQ29udGVudExpc3QuaGFzQ2xhc3MoJ2lzLW9wZW4nKSkge1xyXG4gICAgICAgICAgICB0aGlzLiRjb2xsYXBzaWJsZS50cmlnZ2VyKENvbGxhcHNpYmxlRXZlbnRzLmNsaWNrKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmplY3QgSUQgaW50byB0aGUgcGFnaW5hdGlvbiBsaW5rXHJcbiAgICAgKi9cclxuICAgIGluamVjdFBhZ2luYXRpb25MaW5rKCkge1xyXG4gICAgICAgIGNvbnN0ICRuZXh0TGluayA9ICQoJy5wYWdpbmF0aW9uLWl0ZW0tLW5leHQgLnBhZ2luYXRpb24tbGluaycsIHRoaXMuJHJldmlld3NDb250ZW50KTtcclxuICAgICAgICBjb25zdCAkcHJldkxpbmsgPSAkKCcucGFnaW5hdGlvbi1pdGVtLS1wcmV2aW91cyAucGFnaW5hdGlvbi1saW5rJywgdGhpcy4kcmV2aWV3c0NvbnRlbnQpO1xyXG5cclxuICAgICAgICBpZiAoJG5leHRMaW5rLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAkbmV4dExpbmsuYXR0cignaHJlZicsIGAkeyRuZXh0TGluay5hdHRyKCdocmVmJyl9ICNwcm9kdWN0LXJldmlld3NgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICgkcHJldkxpbmsubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICRwcmV2TGluay5hdHRyKCdocmVmJywgYCR7JHByZXZMaW5rLmF0dHIoJ2hyZWYnKX0gI3Byb2R1Y3QtcmV2aWV3c2ApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlclZhbGlkYXRpb24oY29udGV4dCkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgICAgICAgdGhpcy52YWxpZGF0b3IuYWRkKFt7XHJcbiAgICAgICAgICAgIHNlbGVjdG9yOiAnW25hbWU9XCJyZXZyYXRpbmdcIl0nLFxyXG4gICAgICAgICAgICB2YWxpZGF0ZTogJ3ByZXNlbmNlJyxcclxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBzYWZlU3RyaW5nKHRoaXMuY29udGV4dC5yZXZpZXdSYXRpbmcpLFxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgc2VsZWN0b3I6ICdbbmFtZT1cInJldnRpdGxlXCJdJyxcclxuICAgICAgICAgICAgdmFsaWRhdGU6ICdwcmVzZW5jZScsXHJcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZTogc2FmZVN0cmluZyh0aGlzLmNvbnRleHQucmV2aWV3U3ViamVjdCksXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBzZWxlY3RvcjogJ1tuYW1lPVwicmV2dGV4dFwiXScsXHJcbiAgICAgICAgICAgIHZhbGlkYXRlOiAncHJlc2VuY2UnLFxyXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHNhZmVTdHJpbmcodGhpcy5jb250ZXh0LnJldmlld0NvbW1lbnQpLFxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgc2VsZWN0b3I6ICcud3JpdGVSZXZpZXctZm9ybSBbbmFtZT1cImVtYWlsXCJdJyxcclxuICAgICAgICAgICAgdmFsaWRhdGU6IChjYiwgdmFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmb3Jtcy5lbWFpbCh2YWwpO1xyXG4gICAgICAgICAgICAgICAgY2IocmVzdWx0KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiB0aGlzLmNvbnRleHQucmV2aWV3RW1haWwsXHJcbiAgICAgICAgfV0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhdGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdG9yLnBlcmZvcm1DaGVjaygpO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XHJcbmltcG9ydCBob3ZlcmludGVudCBmcm9tICdob3ZlcmludGVudCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsb2FkZWQoKSB7XHJcbiAgICBmdW5jdGlvbiB3aW5kb3dXaWR0aCgpIHtcclxuICAgICAgICBsZXQgd2luV2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcclxuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHdpbldpZHRoKSkgd2luV2lkdGggPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoO1xyXG5cclxuICAgICAgICByZXR1cm4gd2luV2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc2l6ZVRpbWVyO1xyXG5cclxuICAgIC8vIG5hdmlnYXRpb24gZnVuY3Rpb25hbGl0eVxyXG4gICAgJCgnLmV4cGFuZExpbmsnKS5vbignY2xpY2snLCBmdW5jdGlvbiB0b2dnbGVBY3RpdmUoKSB7XHJcbiAgICAgICAgJCh0aGlzKS5wYXJlbnQoKS50b2dnbGVDbGFzcygnYWN0aXZlJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBmdW5jdGlvbiB0b3VjaEV4cGFuZCgpIHtcclxuICAgICAgICAkKCcubmF2UGFnZXMtbWFpbk5hdiAubmF2UGFnZXMtYWN0aW9uJykudW5iaW5kKCdjbGljaycpO1xyXG4gICAgICAgICQoJy5uYXZQYWdlcy1tYWluTmF2IC5uYXZQYWdlcy1hY3Rpb24tbW9yZUljb24nKS51bmJpbmQoJ2NsaWNrJyk7XHJcblxyXG4gICAgICAgIGlmICh3aW5kb3dXaWR0aCgpID4gODAwKSB7XHJcbiAgICAgICAgICAgICQoJyNtZW51IC5saW5rLWV4cGFuZGVkJykucmVtb3ZlQ2xhc3MoJ2xpbmstZXhwYW5kZWQnKTtcclxuICAgICAgICAgICAgJCgnI21lbnUgLmlzLW9wZW4nKS5yZW1vdmVDbGFzcygnaXMtb3BlbicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHdpbmRvd1dpZHRoKCkgPD0gODAwKSB7XHJcbiAgICAgICAgICAgICQoJy5uYXZQYWdlcy1tYWluTmF2IC5uYXZQYWdlcy1pdGVtID4gYSA+IC5uYXZQYWdlcy1hY3Rpb24tbW9yZUljb24nKS5vbignY2xpY2snLCBmdW5jdGlvbiBtb2JpbGVFeHBhbmQoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMpLnBhcmVudHMoJ2xpOmZpcnN0JykudG9nZ2xlQ2xhc3MoJ2xpbmstZXhwYW5kZWQnKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAkKCcubmF2UGFnZS1zdWJNZW51LWl0ZW0gLm5hdlBhZ2VzLWFjdGlvbi1tb3JlSWNvbicpLm9uKCdjbGljaycsIGZ1bmN0aW9uIGV4cGFuZEdyb3VwKCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSAkKHRoaXMpLnBhcmVudCgpLm5leHRVbnRpbCgkKCcubmF2UGFnZS1zdWJNZW51LWl0ZW0nKSwgJ2xpJyk7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMpLnBhcmVudCgpLnRvZ2dsZUNsYXNzKCdpcy1vcGVuJyk7XHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi50b2dnbGVDbGFzcygnaXMtb3BlbicpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbW9iaWxlTmF2UGFkZGluZygpIHtcclxuICAgICAgICBpZiAod2luZG93V2lkdGgoKSA8PSA4MDApIHtcclxuICAgICAgICAgICAgY29uc3QgbG9nb0hlaWdodCA9ICQoJy5oZWFkZXItbG9nbycpLm91dGVySGVpZ2h0KCk7XHJcbiAgICAgICAgICAgICQoJy5tb2JpbGVNZW51LXRvZ2dsZScpLmNzcygnaGVpZ2h0JywgYCR7bG9nb0hlaWdodH1weGApO1xyXG4gICAgICAgICAgICAkKCcubmF2VXNlci1pdGVtLS1jYXJ0JykuY3NzKCdoZWlnaHQnLCBgJHtsb2dvSGVpZ2h0fXB4YCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJCgnLm5hdlVzZXItaXRlbS0tY2FydCcpLmNzcygnaGVpZ2h0JywgJ2F1dG8nKTtcclxuICAgICAgICAgICAgJCgnLm5hdlBhZ2VzLWNvbnRhaW5lcicpLmNzcygncGFkZGluZy10b3AnLCAnMCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBoZWFkZXIgY29tcHJlc3Mgb24gc2Nyb2xsXHJcbiAgICBmdW5jdGlvbiBjYWxjSGVhZGVySGVpZ2h0TW9iaWxlKCkge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlck5vTmF2SGVpZ2h0ID0gJCgnLmhlYWRlci1sb2dvLS13cmFwJykub3V0ZXJIZWlnaHQodHJ1ZSk7XHJcbiAgICAgICAgY29uc3Qgc2VhcmNoSGVpZ2h0ID0gJCgnLnF1aWNrU2VhcmNoV3JhcCcpLm91dGVySGVpZ2h0KHRydWUpO1xyXG4gICAgICAgIGNvbnN0IG1vYmlsZUhlYWRlckhlaWdodCA9IGhlYWRlck5vTmF2SGVpZ2h0ICsgc2VhcmNoSGVpZ2h0O1xyXG4gICAgICAgIGNvbnN0IHBhZ2VPZmZzZXQgPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCk7XHJcblxyXG4gICAgICAgIGlmIChwYWdlT2Zmc2V0ID4gbW9iaWxlSGVhZGVySGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIGlmICghJCgnLnF1aWNrU2VhcmNoV3JhcCAuZm9ybS1pbnB1dCcpLmlzKCc6Zm9jdXMnKSl7XHJcbiAgICAgICAgICAgICAgICBpZiAoISQoJy5oZWFkZXInKS5oYXNDbGFzcygnc2xpbScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLmhlYWRlcicpLmFkZENsYXNzKCdzbGltJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAkKCcuaGVhZGVyJykuY3NzKCdoZWlnaHQnLCBgJHttb2JpbGVIZWFkZXJIZWlnaHQgLSBzZWFyY2hIZWlnaHR9cHhgKTtcclxuICAgICAgICAgICAgICAgICQoJ2JvZHknKS5jc3MoJ3BhZGRpbmctdG9wJywgYCR7bW9iaWxlSGVhZGVySGVpZ2h0IC0gc2VhcmNoSGVpZ2h0fXB4YCk7XHJcbiAgICAgICAgICAgICAgICAkKCcubmF2VXNlci1pdGVtLS1tb2JpbGUtc2VhcmNoJykuY3NzKCd0b3AnLCAnMCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocGFnZU9mZnNldCA9PT0gMCkge1xyXG4gICAgICAgICAgICBpZiAoJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdzbGltJykpIHtcclxuICAgICAgICAgICAgICAgICQoJy5oZWFkZXInKS5yZW1vdmVDbGFzcygnc2xpbScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICQoJy5oZWFkZXInKS5jc3MoJ2hlaWdodCcsIGAke21vYmlsZUhlYWRlckhlaWdodH1weGApO1xyXG4gICAgICAgICAgICAkKCdib2R5JykuY3NzKCdwYWRkaW5nLXRvcCcsIGAke21vYmlsZUhlYWRlckhlaWdodH1weGApO1xyXG4gICAgICAgICAgICAkKCcubmF2VXNlci1pdGVtLS1tb2JpbGUtc2VhcmNoJykuY3NzKCd0b3AnLCBgLSR7aGVhZGVyTm9OYXZIZWlnaHR9cHhgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdG9nZ2xlSGVhZGVySGVpZ2h0RGVza3RvcCgpIHtcclxuICAgICAgICBjb25zdCBoZWFkZXJOb05hdkhlaWdodCA9ICQoJy5oZWFkZXItbG9nby0td3JhcCcpLm91dGVySGVpZ2h0KHRydWUpO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlckhlaWdodCA9ICQoJy5oZWFkZXInKS5vdXRlckhlaWdodCgpO1xyXG4gICAgICAgIGNvbnN0IG5hdkhlaWdodCA9ICQoJy5uYXZQYWdlcy1jb250YWluZXInKS5vdXRlckhlaWdodCgpO1xyXG4gICAgICAgIGNvbnN0IG5hdlRvZ2dsZVdpZHRoID0gNDQ7XHJcbiAgICAgICAgY29uc3QgbG9nb1dpZHRoID0gJCgnLmxvZ28td3JhcCcpLm91dGVyV2lkdGgodHJ1ZSk7XHJcblxyXG4gICAgICAgIGlmICghJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdzbGltJykpIHtcclxuICAgICAgICAgICAgJCgnLmhlYWRlcicpLmNzcygnaGVpZ2h0JywgYCR7aGVhZGVyTm9OYXZIZWlnaHQgKyBuYXZIZWlnaHR9cHhgKTtcclxuICAgICAgICAgICAgJCgnYm9keScpLmNzcygncGFkZGluZy10b3AnLCBgJHtoZWFkZXJOb05hdkhlaWdodCArIG5hdkhlaWdodH1weGApO1xyXG4gICAgICAgICAgICAkKCcubG9nby1hbmQtdG9nZ2xlJykuY3NzKCd3aWR0aCcsIGAke2xvZ29XaWR0aH1gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGNvbXByZXNzSGVhZGVyRGVza3RvcCgpIHtcclxuICAgICAgICAgICAgJCgnLmhlYWRlcicpLmFkZENsYXNzKCdzbGltJyk7XHJcbiAgICAgICAgICAgICQoJy5uYXZQYWdlcy1jb250YWluZXInKS5jc3MoJ3RvcCcsIGAtJHtuYXZIZWlnaHR9cHhgKTtcclxuICAgICAgICAgICAgJCgnLmhlYWRlcicpLmNzcygnaGVpZ2h0JywgYCR7aGVhZGVyTm9OYXZIZWlnaHR9cHhgKTtcclxuICAgICAgICAgICAgJCgnLmRlc2t0b3BNZW51LXRvZ2dsZScpLmNzcygnbGVmdCcsICcwJyk7XHJcbiAgICAgICAgICAgICQoJy5kZXNrdG9wTWVudS10b2dnbGUnKS5jc3MoJ3dpZHRoJywgYCR7bmF2VG9nZ2xlV2lkdGh9cHhgKTtcclxuICAgICAgICAgICAgJCgnLmxvZ28tYW5kLXRvZ2dsZScpLmNzcygnd2lkdGgnLCBgJHtsb2dvV2lkdGggKyBuYXZUb2dnbGVXaWR0aH1gKTtcclxuICAgICAgICAgICAgJCgnYm9keScpLmNzcygncGFkZGluZy10b3AnLCBgJHtoZWFkZXJOb05hdkhlaWdodH1weGApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZXhwYW5kSGVhZGVyRGVza3RvcCgpIHtcclxuICAgICAgICAgICAgJCgnLmhlYWRlcicpLnJlbW92ZUNsYXNzKCdzbGltJyk7XHJcbiAgICAgICAgICAgICQoJy5uYXZQYWdlcy1jb250YWluZXInKS5jc3MoJ3RvcCcsICcwJyk7XHJcbiAgICAgICAgICAgICQoJy5oZWFkZXInKS5jc3MoJ2hlaWdodCcsIGAke2hlYWRlck5vTmF2SGVpZ2h0ICsgbmF2SGVpZ2h0fXB4YCk7XHJcbiAgICAgICAgICAgICQoJy5kZXNrdG9wTWVudS10b2dnbGUnKS5jc3MoJ2xlZnQnLCAnLTQ0cHgnKTtcclxuICAgICAgICAgICAgJCgnLmRlc2t0b3BNZW51LXRvZ2dsZScpLmNzcygnd2lkdGgnLCAnMCcpO1xyXG4gICAgICAgICAgICAkKCcubG9nby1hbmQtdG9nZ2xlJykuY3NzKCd3aWR0aCcsIGAke2xvZ29XaWR0aH1gKTtcclxuICAgICAgICAgICAgJCgnYm9keScpLmNzcygncGFkZGluZy10b3AnLCBgJHtoZWFkZXJOb05hdkhlaWdodCArIG5hdkhlaWdodH1weGApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJCgnLmRlc2t0b3BNZW51LXRvZ2dsZSBhJykudW5iaW5kKCdjbGljaycpO1xyXG5cclxuICAgICAgICAkKCcuZGVza3RvcE1lbnUtdG9nZ2xlIGEnKS5iaW5kKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCQoJy5oZWFkZXInKS5oYXNDbGFzcygnc2xpbScpKSB7XHJcbiAgICAgICAgICAgICAgICBleHBhbmRIZWFkZXJEZXNrdG9wKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJCh3aW5kb3cpLnVuYmluZCgnc2Nyb2xsJyk7XHJcbiAgICAgICAgJCh3aW5kb3cpLnNjcm9sbCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhZ2VPZmZzZXQgPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCk7XHJcbiAgICAgICAgICAgIGlmIChwYWdlT2Zmc2V0ID4gaGVhZGVySGVpZ2h0ICYmICEkKCcuaGVhZGVyJykuaGFzQ2xhc3MoJ3NsaW0nKSkge1xyXG4gICAgICAgICAgICAgICAgY29tcHJlc3NIZWFkZXJEZXNrdG9wKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChwYWdlT2Zmc2V0ID09PSAwICYmICQoJy5oZWFkZXInKS5oYXNDbGFzcygnc2xpbScpKSB7XHJcbiAgICAgICAgICAgICAgICBleHBhbmRIZWFkZXJEZXNrdG9wKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZnVuY3Rpb24gdG9nZ2xlSGVhZGVySGVpZ2h0TW9iaWxlKCkge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlck5vTmF2SGVpZ2h0ID0gJCgnLmhlYWRlci1sb2dvLS13cmFwJykub3V0ZXJIZWlnaHQodHJ1ZSk7XHJcbiAgICAgICAgY29uc3Qgc2VhcmNoSGVpZ2h0ID0gJCgnLnF1aWNrU2VhcmNoV3JhcCcpLm91dGVySGVpZ2h0KHRydWUpO1xyXG4gICAgICAgIGNvbnN0IG1vYmlsZUhlYWRlckhlaWdodCA9IGhlYWRlck5vTmF2SGVpZ2h0ICsgc2VhcmNoSGVpZ2h0O1xyXG5cclxuICAgICAgICBjYWxjSGVhZGVySGVpZ2h0TW9iaWxlKCk7XHJcblxyXG4gICAgICAgICQoJy5uYXZVc2VyLWl0ZW0tLW1vYmlsZS1zZWFyY2gnKS51bmJpbmQoJ2NsaWNrJyk7XHJcbiAgICAgICAgJCgnLm5hdlVzZXItaXRlbS0tbW9iaWxlLXNlYXJjaCcpLmJpbmQoJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdzbGltJykpIHtcclxuICAgICAgICAgICAgICAgICQoJy5oZWFkZXInKS5yZW1vdmVDbGFzcygnc2xpbScpO1xyXG4gICAgICAgICAgICAgICAgJCgnLmhlYWRlcicpLmNzcygnaGVpZ2h0JywgYCR7bW9iaWxlSGVhZGVySGVpZ2h0fXB4YCk7XHJcbiAgICAgICAgICAgICAgICAkKCdib2R5JykuY3NzKCdwYWRkaW5nLXRvcCcsIGAke21vYmlsZUhlYWRlckhlaWdodH1weGApO1xyXG4gICAgICAgICAgICAgICAgJCgnLm5hdlVzZXItaXRlbS0tbW9iaWxlLXNlYXJjaCcpLmNzcygndG9wJywgYC0ke2hlYWRlck5vTmF2SGVpZ2h0fXB4YCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAkKCcuaGVhZGVyJykuYWRkQ2xhc3MoJ3NsaW0nKTtcclxuICAgICAgICAgICAgICAgICQoJy5oZWFkZXInKS5jc3MoJ2hlaWdodCcsIGAke21vYmlsZUhlYWRlckhlaWdodCAtIHNlYXJjaEhlaWdodH1weGApO1xyXG4gICAgICAgICAgICAgICAgJCgnYm9keScpLmNzcygncGFkZGluZy10b3AnLCBgJHttb2JpbGVIZWFkZXJIZWlnaHQgLSBzZWFyY2hIZWlnaHR9cHhgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKHdpbmRvdykudW5iaW5kKCdzY3JvbGwnKTtcclxuICAgICAgICAkKHdpbmRvdykuc2Nyb2xsKCgpID0+IHtcclxuICAgICAgICAgICAgdG9nZ2xlSGVhZGVySGVpZ2h0TW9iaWxlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaGVhZGVyQ29tcHJlc3MoKSB7XHJcbiAgICAgICAgJCh3aW5kb3cpLnVuYmluZCgnc2Nyb2xsJyk7XHJcbiAgICAgICAgJCgnLm5hdlVzZXItaXRlbS0tbW9iaWxlLXNlYXJjaCcpLnVuYmluZCgnY2xpY2snKTtcclxuXHJcbiAgICAgICAgaWYgKHdpbmRvd1dpZHRoKCkgPiA4MDApIHtcclxuICAgICAgICAgICAgdG9nZ2xlSGVhZGVySGVpZ2h0RGVza3RvcCgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAod2luZG93V2lkdGgoKSA8PSA4MDApIHtcclxuICAgICAgICAgICAgdG9nZ2xlSGVhZGVySGVpZ2h0TW9iaWxlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgICQoJy5tb2JpbGUtY2xvc2VOYXYnKS5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgJCgnaGVhZGVyLmhlYWRlciA+IC5tb2JpbGVNZW51LXRvZ2dsZScpLnRyaWdnZXIoJ2NsaWNrJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBzcGxpdCBuYXYgaW50byBjb2x1bW5zXHJcbiAgICBjb25zdCBudW1QZXJDb2x1bW4gPSB3aW5kb3cudGhlbWVfc2V0dGluZ3MubGlua3NQZXJDb2w7XHJcbiAgICBjb25zdCBtZW51Q29sdW1ucyA9ICQoJy5uYXZQYWdlcyAuY29sdW1uLW1lbnUnKTtcclxuXHJcbiAgICBtZW51Q29sdW1ucy5lYWNoKGZ1bmN0aW9uIHNwbGl0Q29sdW1ucygpIHtcclxuICAgICAgICBjb25zdCAkY29sbWVudSA9ICQodGhpcyk7XHJcbiAgICAgICAgY29uc3QgJGxpcyA9ICRjb2xtZW51LmZpbmQoJ2xpJyk7XHJcblxyXG4gICAgICAgIGxldCBjb2xNZW51SHRtbCA9ICc8dWw+JztcclxuICAgICAgICBsZXQgY29sTWVudUNvdW50ID0gMDtcclxuXHJcbiAgICAgICAgbGV0IGNvbEdyb3VwID0gJyc7XHJcbiAgICAgICAgbGV0IGNvbEdyb3VwQ291bnQgPSAwO1xyXG5cclxuICAgICAgICAkbGlzLmVhY2goZnVuY3Rpb24gYnVpbGRDb2x1bW4oKSB7XHJcbiAgICAgICAgICAgIGNvbnN0ICRsaSA9ICQodGhpcyk7XHJcbiAgICAgICAgICAgIGNvbnN0ICRsaUNsYXNzID0gJGxpLmF0dHIoJ2NsYXNzJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoJGxpQ2xhc3MgPT09ICduYXZQYWdlLXN1Yk1lbnUtaXRlbScpIHtcclxuICAgICAgICAgICAgICAgIC8vIHRlc3QgaWYgdGhlcmUgaXMgcm9vbSBmb3IgdGhlIGdyb3VwIGluIHRoZSBjdXJyZW50IGNvbHVtblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbE1lbnVDb3VudCArIGNvbEdyb3VwQ291bnQgPiBudW1QZXJDb2x1bW4gJiYgY29sTWVudUh0bWwgIT09ICc8dWw+Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBncm91cCBkb2Vzbid0IGZpdCwgc3RhcnQgYSBuZXcgY29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgY29sTWVudUh0bWwgKz0gJzwvdWw+PHVsPic7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sTWVudUNvdW50ID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBhZGQgZ3JvdXAgdG8gbWVudVxyXG4gICAgICAgICAgICAgICAgY29sTWVudUh0bWwgKz0gY29sR3JvdXA7IC8vIGFkZCBncm91cCBodG1sIHRvIG1lbnVcclxuICAgICAgICAgICAgICAgIGNvbE1lbnVDb3VudCArPSBjb2xHcm91cENvdW50OyAvLyBsaW5rIGNvdW50IGZvciB0aGUgY3VycmVudCBjb2x1bW5cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzdGFydCBuZXcgZ3JvdXBcclxuICAgICAgICAgICAgICAgIGNvbEdyb3VwID0gJyc7XHJcbiAgICAgICAgICAgICAgICBjb2xHcm91cENvdW50ID0gMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gYWRkIHRvIGdyb3VwXHJcbiAgICAgICAgICAgIGNvbEdyb3VwICs9IGA8bGkgY2xhc3M9XCIkeyRsaUNsYXNzfVwiPiR7JGxpLmh0bWwoKX08L2xpPmA7XHJcbiAgICAgICAgICAgIGNvbEdyb3VwQ291bnQgKys7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIGFkZCBsYXN0IGdyb3VwIHRvIG1lbnVcclxuICAgICAgICBpZiAoY29sR3JvdXBDb3VudCA+IDAgJiYgKGNvbEdyb3VwQ291bnQgKyBjb2xNZW51Q291bnQgPD0gbnVtUGVyQ29sdW1uKSkge1xyXG4gICAgICAgICAgICBjb2xNZW51SHRtbCArPSBgJHtjb2xHcm91cH08L3VsPmA7XHJcbiAgICAgICAgfSBlbHNlIGlmIChjb2xHcm91cENvdW50ID4gMCAmJiAoY29sR3JvdXBDb3VudCArIGNvbE1lbnVDb3VudCA+IG51bVBlckNvbHVtbikpIHtcclxuICAgICAgICAgICAgY29sTWVudUh0bWwgKz0gYDwvdWw+PHVsPiR7Y29sR3JvdXB9PC91bD5gO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJGNvbG1lbnUuaHRtbChjb2xNZW51SHRtbCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBzZXQgd2lkdGggb2YgZHJvcGRvd25zXHJcbiAgICBmdW5jdGlvbiBwcmVwYXJlTWVudSgpIHtcclxuICAgICAgICBpZiAod2luZG93V2lkdGgoKSA+IDgwMCkge1xyXG4gICAgICAgICAgICBjb25zdCBkcm9wZG93blBhZGRpbmcgPSBwYXJzZUludCgkKCcuY29sdW1uLW1lbnU6Zmlyc3QnKS5jc3MoJ3BhZGRpbmctbGVmdCcpLCAxMCkgKiAyO1xyXG4gICAgICAgICAgICBjb25zdCBuYXZXaWR0aCA9ICQoJy5uYXZQYWdlcycpLndpZHRoKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbFdpZHRoID0gTWF0aC5mbG9vcigobmF2V2lkdGggLSBkcm9wZG93blBhZGRpbmcpICogMC4yKTtcclxuICAgICAgICAgICAgbWVudUNvbHVtbnMuZWFjaChmdW5jdGlvbiBjb3VudENvbHMoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xzID0gJCh0aGlzKS5jaGlsZHJlbigndWwnKS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkcm9wZG93bldpZHRoID0gKGNvbFdpZHRoICogY29scyArIGRyb3Bkb3duUGFkZGluZyA8PSBuYXZXaWR0aCA/IGNvbFdpZHRoICogY29scyArIGRyb3Bkb3duUGFkZGluZyA6IG5hdldpZHRoKTtcclxuICAgICAgICAgICAgICAgICQodGhpcykuY2hpbGRyZW4oJ3VsJykuY3NzKCdmbGV4JywgYDAgMCAke2NvbFdpZHRofXB4YCk7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmNzcygnd2lkdGgnLCBgJHtkcm9wZG93bldpZHRofXB4YCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmF2T2Zmc2V0ID0gJCgnLm5hdlBhZ2VzJykub2Zmc2V0KCkubGVmdDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudE9mZnNldCA9ICQodGhpcykucGFyZW50KCkub2Zmc2V0KCkubGVmdCAtIG5hdk9mZnNldDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNwYWNlQXZhaWxhYmxlID0gbmF2V2lkdGggLSBwYXJlbnRPZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGRyb3Bkb3duV2lkdGggPiBzcGFjZUF2YWlsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0Qm91bmQgPSBkcm9wZG93bldpZHRoIC0gc3BhY2VBdmFpbGFibGU7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jc3MoJ2xlZnQnLCBgLSR7cmlnaHRCb3VuZH1weGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtZW51Q29sdW1ucy5lYWNoKGZ1bmN0aW9uIHJlc2V0V2lkdGhzKCkge1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigndWwnKS5jc3MoJ2ZsZXgnLCAnMSAxIGF1dG8nKTtcclxuICAgICAgICAgICAgICAgICQodGhpcykuY3NzKCd3aWR0aCcsICdhdXRvJyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0b3VjaEV4cGFuZCgpO1xyXG4gICAgbW9iaWxlTmF2UGFkZGluZygpO1xyXG4gICAgaGVhZGVyQ29tcHJlc3MoKTtcclxuXHJcbiAgICAvLyBob3ZlcmludGVudFxyXG4gICAgY29uc3Qgb3B0cyA9IHtcclxuICAgICAgICBpbnRlcnZhbDogMTAwLFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBlbCA9ICQoJy5uYXZQYWdlcy1tZWdhIC5uYXZQYWdlcy1pdGVtJyk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGhvdmVyaW50ZW50KGVsW2ldLFxyXG4gICAgICAgIGZ1bmN0aW9uIGhvdmVySW50ZW50T3ZlcigpIHtcclxuICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnaG92ZXInKTtcclxuICAgICAgICB9LCBmdW5jdGlvbiBob3ZlckludGVudE91dCgpIHtcclxuICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnaG92ZXInKTtcclxuICAgICAgICB9KS5vcHRpb25zKG9wdHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByZXBhcmVNZW51KCk7XHJcblxyXG4gICAgJCh3aW5kb3cpLm9uKCdyZXNpemUnLCAoKSA9PiB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHJlc2l6ZVRpbWVyKTtcclxuICAgICAgICByZXNpemVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0b3VjaEV4cGFuZCgpO1xyXG4gICAgICAgICAgICBtb2JpbGVOYXZQYWRkaW5nKCk7XHJcbiAgICAgICAgICAgIHByZXBhcmVNZW51KCk7XHJcbiAgICAgICAgICAgIGhlYWRlckNvbXByZXNzKCk7XHJcbiAgICAgICAgICAgIGNsb3NlTWluaUNhcnQoKTtcclxuICAgICAgICB9LCA1MDApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29yaWVudGF0aW9uY2hhbmdlJywgKCkgPT4ge1xyXG4gICAgICAgIHRvdWNoRXhwYW5kKCk7XHJcbiAgICAgICAgcHJlcGFyZU1lbnUoKTtcclxuICAgICAgICBoZWFkZXJDb21wcmVzcygpO1xyXG4gICAgfSwgZmFsc2UpO1xyXG5cclxuICAgIC8vIGhpZGUgcXVpY2sgc2VhcmNoIHJlc3VsdHMgd2hlbiBjbGlja2VkIG91dHNpZGUgb2YgcXVpY2sgc2VhcmNoXHJcbiAgICAkKHdpbmRvdykub24oJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICQoJy5xdWlja1NlYXJjaFdyYXAgLnF1aWNrU2VhcmNoUmVzdWx0cycpLmhpZGUoKTtcclxuICAgIH0pO1xyXG5cclxuICAgICQoJy5xdWlja1NlYXJjaFdyYXAnKS5vbignY2xpY2snLCAnLm1vZGFsLWNsb3NlJywgKCkgPT4ge1xyXG4gICAgICAgICQoJy5xdWlja1NlYXJjaFdyYXAgLnF1aWNrU2VhcmNoUmVzdWx0cycpLmhpZGUoKTtcclxuICAgIH0pO1xyXG5cclxuICAgICQoJy5xdWlja1NlYXJjaFdyYXAnKS5vbignY2xpY2snLCAoZXZlbnQpID0+IHtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH0pO1xyXG5cclxuICAgICQoJy5xdWlja1NlYXJjaFJlc3VsdHMnKS5vbignY2xpY2snLCAnLnF1aWNrU2VhcmNoQWxsJywgKCkgPT4ge1xyXG4gICAgICAgICQoJyNxdWlja1NlYXJjaCBmb3JtJykuc3VibWl0KCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBzaG93IHF1aWNrIHNlYXJjaCByZXN1bHRzIHdoZW4gZm9jdXNlZCBpbiBzZWFyY2ggaW5wdXRcclxuICAgICQoJy5xdWlja1NlYXJjaFdyYXAgaW5wdXQnKS5vbignZm9jdXNpbicsICgpID0+IHtcclxuICAgICAgICAkKCcucXVpY2tTZWFyY2hXcmFwIC5xdWlja1NlYXJjaFJlc3VsdHMnKS5zaG93KCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBjb21wYXJlIGZ1bmN0aW9uYWxpdHlcclxuICAgICQoJy5jb21wYXJlLWlucHV0Jykub24oJ2NoYW5nZScsIGZ1bmN0aW9uIGNvbXBhcmVUb2dnbGUoKSB7XHJcbiAgICAgICAgY2hlY2tDb21wYXJlKCQodGhpcykpO1xyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIGlmICgkKCcucGFnZS1zaWRlYmFyJykubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgLy8gcmUtYmluZCBjb21wYXJlIG9uY2hhbmdlIHdoZW4gZmlsdGVycyB1cGRhdGVcclxuICAgICAgICBjb25zdCBjb25maWcgPSB7IGF0dHJpYnV0ZXM6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9O1xyXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gZnVuY3Rpb24obXV0YXRpb25zTGlzdCwgb2JzZXJ2ZXIpIHtcclxuICAgICAgICAgICAgLy8gVXNlIHRyYWRpdGlvbmFsICdmb3IgbG9vcHMnIGZvciBJRSAxMVxyXG4gICAgICAgICAgICAkKCcuY29tcGFyZS1pbnB1dCcpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiBjb21wYXJlVG9nZ2xlKCkge1xyXG4gICAgICAgICAgICAgICAgY2hlY2tDb21wYXJlKCQodGhpcykpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xyXG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUoJCgnLnBhZ2Utc2lkZWJhcicpLmdldCgwKSwgY29uZmlnKTtcclxuICAgIH1cclxuXHJcbiAgICAkKGRvY3VtZW50KS5hamF4Q29tcGxldGUoKCkgPT4ge1xyXG4gICAgICAgICQoJy5jb21wYXJlLWlucHV0Jykub24oJ2NoYW5nZScsIGZ1bmN0aW9uIGNvbXBhcmVUb2dnbGUoKSB7XHJcbiAgICAgICAgICAgIGNoZWNrQ29tcGFyZSgkKHRoaXMpKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICBmdW5jdGlvbiBjaGVja0NvbXBhcmUoJHRoaXMpIHtcclxuICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gJHRoaXMuaXMoJzpjaGVja2VkJyk7XHJcbiAgICAgICAgY29uc3QgY29tcGFyZUxhYmVsID0gJHRoaXMucGFyZW50KCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGlzU2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgY29tcGFyZUxhYmVsLmZpbmQoJ3NwYW4nKS5zaG93KCk7XHJcbiAgICAgICAgICAgIGNvbXBhcmVMYWJlbC5uZXh0KCkuY3NzKCd2aXNpYmlsaXR5JywgJ3Zpc2libGUnKTtcclxuICAgICAgICAgICAgY29tcGFyZUxhYmVsLm5leHQoKS5zaG93KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29tcGFyZUxhYmVsLmZpbmQoJ3NwYW4nKS5oaWRlKCk7XHJcbiAgICAgICAgICAgIGNvbXBhcmVMYWJlbC5uZXh0KCkuY3NzKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpO1xyXG4gICAgICAgICAgICBjb21wYXJlTGFiZWwubmV4dCgpLmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcmV2aWV3IGFuY2hvciBsaW5rXHJcbiAgICAkKCcucHJvZHVjdFZpZXctcmV2aWV3TGluayBhJykub24oJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmV2aWV3c09mZnNldCA9ICQoJyNyZXZpZXdzLWFjY29yZGlvbicpLm9mZnNldCgpID8gJCgnI3Jldmlld3MtYWNjb3JkaW9uJykub2Zmc2V0KCkudG9wIDogMDtcclxuICAgICAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSAkKCcuaGVhZGVyLWxvZ28tLXdyYXAnKS5vdXRlckhlaWdodCh0cnVlKTtcclxuICAgICAgICAkKHdpbmRvdykuc2Nyb2xsVG9wKHJldmlld3NPZmZzZXQgLSBoZWFkZXJIZWlnaHQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gZm9vdGVyIGNvbGxhcHNlXHJcbiAgICAkKCcuZm9vdGVyLWluZm8tZHJvcGRvd24gLmZvb3Rlci1pbmZvLWhlYWRpbmcnKS5vbignY2xpY2snLCBmdW5jdGlvbiB0b2dnbGVGb290ZXJCbG9ja3MoKSB7XHJcbiAgICAgICAgJCh0aGlzKS5wYXJlbnQoKS50b2dnbGVDbGFzcygnaXMtb3BlbicpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsb3NlTWluaUNhcnQoKSB7XHJcbiAgICBpZiAoJCgnLm5hdlVzZXItaXRlbS0tY2FydCAuaXMtb3BlbicpLmxlbmd0aCA+IDAgKXtcclxuICAgICAgICAkKCcubmF2VXNlci1pdGVtLS1jYXJ0IGEnKS50cmlnZ2VyKCdjbGljaycpO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCAnZm91bmRhdGlvbi1zaXRlcy9qcy9mb3VuZGF0aW9uL2ZvdW5kYXRpb24nO1xyXG5pbXBvcnQgJ2ZvdW5kYXRpb24tc2l0ZXMvanMvZm91bmRhdGlvbi9mb3VuZGF0aW9uLnJldmVhbCc7XHJcbmltcG9ydCBub2QgZnJvbSAnLi9jb21tb24vbm9kJztcclxuaW1wb3J0IFBhZ2VNYW5hZ2VyIGZyb20gJy4vcGFnZS1tYW5hZ2VyJztcclxuaW1wb3J0IHsgd2lzaGxpc3RQYWdpbmF0b3JIZWxwZXIgfSBmcm9tICcuL2NvbW1vbi91dGlscy9wYWdpbmF0aW9uLXV0aWxzJztcclxuaW1wb3J0IHsgYW5ub3VuY2VJbnB1dEVycm9yTWVzc2FnZSB9IGZyb20gJy4vY29tbW9uL3V0aWxzL2Zvcm0tdXRpbHMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2lzaExpc3QgZXh0ZW5kcyBQYWdlTWFuYWdlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0KSB7XHJcbiAgICAgICAgc3VwZXIoY29udGV4dCk7XHJcblxyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICdhY2NvdW50L2FkZC13aXNobGlzdCcsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgY29uZmlybSBib3ggYmVmb3JlIGRlbGV0aW5nIGFsbCB3aXNoIGxpc3RzXHJcbiAgICAgKi9cclxuICAgIHdpc2hsaXN0RGVsZXRlQ29uZmlybSgpIHtcclxuICAgICAgICAkKCdib2R5Jykub24oJ2NsaWNrJywgJ1tkYXRhLXdpc2hsaXN0LWRlbGV0ZV0nLCBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IHdpbmRvdy5jb25maXJtKHRoaXMuY29udGV4dC53aXNobGlzdERlbGV0ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY29uZmlybWVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlckFkZFdpc2hMaXN0VmFsaWRhdGlvbigkYWRkV2lzaGxpc3RGb3JtKSB7XHJcbiAgICAgICAgdGhpcy5hZGRXaXNobGlzdFZhbGlkYXRvciA9IG5vZCh7XHJcbiAgICAgICAgICAgIHN1Ym1pdDogJy53aXNobGlzdC1mb3JtIGlucHV0W3R5cGU9XCJzdWJtaXRcIl0nLFxyXG4gICAgICAgICAgICB0YXA6IGFubm91bmNlSW5wdXRFcnJvck1lc3NhZ2UsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkV2lzaGxpc3RWYWxpZGF0b3IuYWRkKFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICcud2lzaGxpc3QtZm9ybSBpbnB1dFtuYW1lPVwid2lzaGxpc3RuYW1lXCJdJyxcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRlOiAoY2IsIHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbC5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYihyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogdGhpcy5jb250ZXh0LmVudGVyV2lzaGxpc3ROYW1lRXJyb3IsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgXSk7XHJcblxyXG4gICAgICAgICRhZGRXaXNobGlzdEZvcm0ub24oJ3N1Ym1pdCcsIGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hZGRXaXNobGlzdFZhbGlkYXRvci5wZXJmb3JtQ2hlY2soKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmFkZFdpc2hsaXN0VmFsaWRhdG9yLmFyZUFsbCgndmFsaWQnKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uUmVhZHkoKSB7XHJcbiAgICAgICAgY29uc3QgJGFkZFdpc2hMaXN0Rm9ybSA9ICQoJy53aXNobGlzdC1mb3JtJyk7XHJcblxyXG4gICAgICAgIGlmICgkKCdbZGF0YS1wYWdpbmF0aW9uLXdpc2hsaXN0XScpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB3aXNobGlzdFBhZ2luYXRvckhlbHBlcigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCRhZGRXaXNoTGlzdEZvcm0ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJBZGRXaXNoTGlzdFZhbGlkYXRpb24oJGFkZFdpc2hMaXN0Rm9ybSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLndpc2hsaXN0RGVsZXRlQ29uZmlybSgpO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCByZXF1ZXN0IGZyb20gJy4uL2xpYi9yZXF1ZXN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3Mge1xuICAgIC8qKlxuICAgICAqIEBDb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5yZW1vdGVWZXJzaW9uID0gdmVyc2lvbiB8fCAndjEnO1xuICAgICAgICB0aGlzLnJlbW90ZUJhc2VFbmRwb2ludCA9ICcvcmVtb3RlLyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZCBbJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnXVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtCb29sZWFufSByZW1vdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIG1ha2VSZXF1ZXN0KHVybCwgbWV0aG9kLCBvcHRpb25zLCByZW1vdGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJlcXVlc3QodXJsLCB7XG4gICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgICByZW1vdGUsXG4gICAgICAgICAgICByZXF1ZXN0T3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgfSwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGVuZHBvaW50XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZCBbJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnXVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICByZW1vdGVSZXF1ZXN0KGVuZHBvaW50LCBtZXRob2QsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHJlbW90ZVVybCA9IHRoaXMucmVtb3RlQmFzZUVuZHBvaW50ICsgdGhpcy5yZW1vdGVWZXJzaW9uICsgZW5kcG9pbnQ7XG5cbiAgICAgICAgdGhpcy5tYWtlUmVxdWVzdChyZW1vdGVVcmwsIG1ldGhvZCwgb3B0aW9ucywgdHJ1ZSwgY2FsbGJhY2spO1xuICAgIH1cbn1cbiIsImltcG9ydCBCb2RsRXZlbnRzQ2FydCBmcm9tICcuLi9ib2RsL2VtaXR0ZXJzL2NhcnQnO1xuaW1wb3J0IEJhc2UgZnJvbSAnLi9iYXNlJztcbmltcG9ydCBIb29rcyBmcm9tICcuLi9ob29rcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgY29uc3RydWN0b3IodmVyc2lvbikge1xuICAgICAgICBzdXBlcih2ZXJzaW9uKTtcbiAgICAgICAgdGhpcy5ib2RsRXZlbnRzQ2FydCA9IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0Qm9kbEV2ZW50c0NhcnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5ib2RsRXZlbnRzQ2FydCkge1xuICAgICAgICAgICAgdGhpcy5ib2RsRXZlbnRzQ2FydCA9IG5ldyBCb2RsRXZlbnRzQ2FydCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJvZGxFdmVudHNDYXJ0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIGNvbGxlY3Rpb24gb2YgQ2FydHMuIEZvciBub3csIHRoaXMgd2lsbCBvbmx5IHJldHVybiBhbiBhcnJheSBvZiBhIHNpbmdsZSBjYXJ0IGFzIG11bHRpcGxlIGNhcnRzIHBlciBzZXNzaW9uXG4gICAgICogYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIGdldENhcnRzKG9wdGlvbnMgPSB7fSwgY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IHVybCA9ICcvYXBpL3N0b3JlZnJvbnQvY2FydHMnO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVPcHRpb25zKSB7XG4gICAgICAgICAgICB1cmwgPSB0aGlzLmluY2x1ZGVPcHRpb25zKHVybCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1ha2VSZXF1ZXN0KHVybCwgJ0dFVCcsIG9wdGlvbnMsIHRydWUsIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IENhcnQncyBkZXRhaWxzLCBlaXRoZXIgd2l0aCBvciB3aXRob3V0IFByb2R1Y3QgT3B0aW9uIHNlbGVjdGlvbnMuXG4gICAgICogQ2FuIGFsc28gYmUgdXNlZCB0byBnZXQgYSBwYXJ0aWN1bGFyIGNhcnQgcHJvdmlkZWQgYSBjYXJ0SWQgaW4gdGhlIG9wdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgZ2V0Q2FydChvcHRpb25zID0ge30sIGNhbGxiYWNrKSB7XG4gICAgICAgIC8qIElmIG5vIGNhcnQgSUQgaXMgcHJvdmlkZWQsIGdldCB0aGUgY29sbGVjdGlvbiBvZiBjYXJ0cyBhbmQgcmV0dXJuIHRoZSBmaXJzdCBvbmUgKi9cbiAgICAgICAgaWYgKCFvcHRpb25zLmNhcnRJZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FydHMob3B0aW9ucywgKGVyciwgcmVzcG9uc2UpID0+IGNhbGxiYWNrKGVyciwgcmVzcG9uc2VbMF0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB1cmwgPSBgL2FwaS9zdG9yZWZyb250L2NhcnRzLyR7b3B0aW9ucy5jYXJ0SWR9YDtcblxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlT3B0aW9ucykge1xuICAgICAgICAgICAgdXJsID0gdGhpcy5pbmNsdWRlT3B0aW9ucyh1cmwpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tYWtlUmVxdWVzdCh1cmwsICdHRVQnLCBvcHRpb25zLCB0cnVlLCAoZXJyLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc3VtbWFyeSBmb3IgdGhlIGN1cnJlbnQgcHJpbWFyeSBjYXJ0LiBUaGlzIHN1bW1hcnkgZG9lcyBub3QgaW5jbHVkZSB0aGUgZnVsbCBkZXRhaWxzIG9mIHRoZSBjYXJ0LCBidXRcbiAgICAgKiB0aGUgcmVzcG9uc2UgdGltZSBpcyBtdWNoIGZhc3RlciBhbmQgaXQncyBhcHByb3ByaWF0ZSBmb3Igc3VtbWFyeSB1c2UgY2FzZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgZ2V0Q2FydFN1bW1hcnkob3B0aW9ucyA9IHt9LCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCB1cmwgPSAnL2FwaS9zdG9yZWZyb250L2NhcnQtc3VtbWFyeSc7XG5cbiAgICAgICAgdGhpcy5tYWtlUmVxdWVzdCh1cmwsICdHRVQnLCBvcHRpb25zLCB0cnVlLCAoZXJyLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCB0aGUgcGFyYW1ldGVycyB0byBhIFVSTCBuZWVkZWQgdG8gZ2V0IHByb2R1Y3Qgb3B0aW9uIGRldGFpbHMgb24gY2FydCBsaW5lIGl0ZW1zXG4gICAgICogQHBhcmFtIHVybFxuICAgICAqL1xuICAgIGluY2x1ZGVPcHRpb25zKHVybCkge1xuICAgICAgICByZXR1cm4gYCR7dXJsfT9pbmNsdWRlPWxpbmVJdGVtcy5waHlzaWNhbEl0ZW1zLm9wdGlvbnMsbGluZUl0ZW1zLmRpZ2l0YWxJdGVtcy5vcHRpb25zYDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzdW0gb2YgdGhlIGNhcnQgbGluZSBpdGVtIHF1YW50aXRpZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBnZXRDYXJ0UXVhbnRpdHkob3B0aW9ucyA9IHt9LCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmdldENhcnRTdW1tYXJ5KG9wdGlvbnMsIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcXVhbnRpdHkgPSAwO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXG4gICAgICAgICAgICAgICAgJiYgcmVzcG9uc2Uuc3RhdHVzICE9PSAyMDRcbiAgICAgICAgICAgICAgICAmJiByZXNwb25zZS50b3RhbF9xdWFudGl0eSkge1xuICAgICAgICAgICAgICAgIHF1YW50aXR5ID0gcmVzcG9uc2UudG90YWxfcXVhbnRpdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBxdWFudGl0eSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuaGFuY2Ugd2l0aCBCaWcgT3BlbiBEYXRhIExheWVyIGV2ZW50c1xuICAgICAqXG4gICAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIGl0ZW1BZGQoZm9ybURhdGEsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlSXRlbUFkZChmb3JtRGF0YSwgKGVyciwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRCb2RsRXZlbnRzQ2FydCgpLmVtaXRBZGRJdGVtKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgaXRlbSB0byBjYXJ0IHdpdGggb3B0aW9ucyAodmFyaWFudHMpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgaGFuZGxlSXRlbUFkZChmb3JtRGF0YSwgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5yZW1vdGVSZXF1ZXN0KCcvY2FydC9hZGQnLCAnUE9TVCcsIHsgZm9ybURhdGEgfSwgKGVyciwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVtaXREYXRhID0ge1xuICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIEhvb2tzLmVtaXQoJ2NhcnQtaXRlbS1hZGQtcmVtb3RlJywgZW1pdERhdGEpO1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBjYXJ0IGl0ZW0gcXVhbnRpdHlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gaXRlbUlkXG4gICAgICogQHBhcmFtIHtOdW1iZXJ8RnVuY3Rpb259IHF0eVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258bnVsbH0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBpdGVtVXBkYXRlKGl0ZW1JZCwgcXR5LCBjYWxsYmFjaykge1xuICAgICAgICBsZXQgY2FsbGJhY2tBcmcgPSBjYWxsYmFjaztcbiAgICAgICAgbGV0IGl0ZW1zO1xuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1JZCkgJiYgdHlwZW9mIHF0eSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FsbGJhY2tBcmcgPSBxdHk7XG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1JZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZW1zID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGl0ZW1JZCxcbiAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IHF0eSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlKGl0ZW1zLCAoZXJyLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZW1pdERhdGEgPSB7XG4gICAgICAgICAgICAgICAgaXRlbXMsXG4gICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHF0eSA9PT0gMCAmJiAhZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRCb2RsRXZlbnRzQ2FydCgpLmVtaXRSZW1vdmVJdGVtKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgSG9va3MuZW1pdCgnY2FydC1pdGVtLXVwZGF0ZS1yZW1vdGUnLCBlbWl0RGF0YSk7XG4gICAgICAgICAgICBjYWxsYmFja0FyZyhlcnIsIHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5oYW5jZSB3aXRoIEJpZyBPcGVuIERhdGEgTGF5ZXIgZXZlbnRzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaXRlbUlkXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBpdGVtUmVtb3ZlKGl0ZW1JZCwgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5oYW5kbGVJdGVtUmVtb3ZlKGl0ZW1JZCwgKGVyciwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRCb2RsRXZlbnRzQ2FydCgpLmVtaXRSZW1vdmVJdGVtKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgY2FydCBpdGVtc1xuICAgICAqXG4gICAgICogQ2FsbHMgdGhlIGludGVybmFsIHVwZGF0ZSBmdW5jdGlvbiB3aXRoIHF1YW50aXR5OiAwXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaXRlbUlkXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBoYW5kbGVJdGVtUmVtb3ZlKGl0ZW1JZCwgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6IGl0ZW1JZCxcbiAgICAgICAgICAgICAgICBxdWFudGl0eTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy51cGRhdGUoaXRlbXMsIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbWl0RGF0YSA9IHtcbiAgICAgICAgICAgICAgICBpdGVtcyxcbiAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBIb29rcy5lbWl0KCdjYXJ0LWl0ZW0tcmVtb3ZlLXJlbW90ZScsIGVtaXREYXRhKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZ2lmdHdyYXBwaW5nIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaXRlbUlkXG4gICAgICogQHBhcmFtIHtPYmplY3R8RnVuY3Rpb259IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufG51bGx9IGNhbGxiYWNrXG4gICAgICovXG4gICAgZ2V0SXRlbUdpZnRXcmFwcGluZ09wdGlvbnMoaXRlbUlkLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICBsZXQgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGxldCBjYWxsYmFja0FyZyA9IGNhbGxiYWNrO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FsbGJhY2tBcmcgPSBvcHRzO1xuICAgICAgICAgICAgb3B0cyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW1vdGVSZXF1ZXN0KGAvZ2lmdC13cmFwcGluZy8ke2l0ZW1JZH1gLCAnR0VUJywgb3B0cywgY2FsbGJhY2tBcmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN1Ym1pdCBnaWZ0d3JhcHBpbmcgb3B0aW9uc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGl0ZW1JZFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgc3VibWl0SXRlbUdpZnRXcmFwcGluZ09wdGlvbihpdGVtSWQsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5yZW1vdGVSZXF1ZXN0KGAvZ2lmdC13cmFwcGluZy8ke2l0ZW1JZH1gLCAnUE9TVCcsIHsgcGFyYW1zIH0sIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgY2FydCBpdGVtc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gaXRlbXNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIHVwZGF0ZShpdGVtcywgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIGl0ZW1zLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMucmVtb3RlUmVxdWVzdCgnL2NhcnQvdXBkYXRlJywgJ1BPU1QnLCB7IHBhcmFtczogcGF5bG9hZCB9LCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUE9TVCBmb3JtIGRhdGEgdG8gL2NhcnQucGhwXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgcG9zdEZvcm1EYXRhKGZvcm1EYXRhLCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLm1ha2VSZXF1ZXN0KCcvY2FydC5waHAnLCAnUE9TVCcsIHsgZm9ybURhdGEgfSwgZmFsc2UsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY2FydCBjb250ZW50XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgZ2V0Q29udGVudChvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICBsZXQgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGxldCBjYWxsYmFja0FyZyA9IGNhbGxiYWNrO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FsbGJhY2tBcmcgPSBvcHRzO1xuICAgICAgICAgICAgb3B0cyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tYWtlUmVxdWVzdCgnL2NhcnQucGhwJywgJ0dFVCcsIG9wdHMsIGZhbHNlLCBjYWxsYmFja0FyZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGNhcnQgc2hpcHBpbmcgcXVvdGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xBcnJheXxPYmplY3R9IHJlbmRlcldpdGhcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIGdldFNoaXBwaW5nUXVvdGVzKHBhcmFtcywgcmVuZGVyV2l0aCwgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGNhbGxiYWNrQXJnID0gY2FsbGJhY2s7XG4gICAgICAgIGxldCByZW5kZXJXaXRoQXJnID0gcmVuZGVyV2l0aDtcblxuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrQXJnICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWxsYmFja0FyZyA9IHJlbmRlcldpdGhBcmc7XG4gICAgICAgICAgICByZW5kZXJXaXRoQXJnID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZW5kZXJXaXRoQXJnKSB7XG4gICAgICAgICAgICBvcHRpb25zLnRlbXBsYXRlID0gcmVuZGVyV2l0aEFyZztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVtb3RlUmVxdWVzdCgnL3NoaXBwaW5nLXF1b3RlJywgJ0dFVCcsIG9wdGlvbnMsIGNhbGxiYWNrQXJnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdWJtaXQgc2hpcHBpbmcgcXVvdGUgYmFzZWQgb24gcXVvdGVJZFxuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHF1b3RlSWRcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIHN1Ym1pdFNoaXBwaW5nUXVvdGUocXVvdGVJZCwgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIHNoaXBwaW5nX21ldGhvZDogcXVvdGVJZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5yZW1vdGVSZXF1ZXN0KCcvc2hpcHBpbmctcXVvdGUnLCAnUE9TVCcsIG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBseSBhIGNvdXBvbiBjb2RlIG9yIGdpZnQgY2VydGlmaWNhdGUgdG8gdGhlIGNhcnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb2RlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBhcHBseUNvZGUoY29kZSwgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMucmVtb3RlUmVxdWVzdCgnL2FwcGx5LWNvZGUnLCAnUE9TVCcsIG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBseSBhIGNvdXBvbiBjb2RlIG9yIGdpZnQgY2VydGlmaWNhdGUgdG8gdGhlIGNhcnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBhcHBseUdpZnRDZXJ0aWZpY2F0ZShjb2RlLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5yZW1vdGVSZXF1ZXN0KCcvZ2lmdC1jZXJ0aWZpY2F0ZXMnLCAnUE9TVCcsIG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuL2Jhc2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgIC8qKlxuICAgICAqIEBDb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHZlcnNpb24pIHtcbiAgICAgICAgLy8gY2FsbCBwYXJlbnRcbiAgICAgICAgc3VwZXIodmVyc2lvbik7XG5cbiAgICAgICAgLy8gc2V0IHVwIGNsYXNzIHZhcmlhYmxlc1xuICAgICAgICB0aGlzLmVuZHBvaW50ID0gJy9jb3VudHJ5LXN0YXRlcy8nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogR2V0IGNvdW50cnkgZGF0YSBieSBpZCB3cmFwcGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaWRcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIGdldEJ5SWQoaWQsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuZW5kcG9pbnQgKyBpZDtcblxuICAgICAgICB0aGlzLnJlbW90ZVJlcXVlc3QodXJsLCAnR0VUJywge30sIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY291bnRyeSBkYXRhIGJ5IGNvdW50cnkgbmFtZVxuICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAgICovXG4gICAgZ2V0QnlOYW1lKG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuZW5kcG9pbnQgKyBuYW1lO1xuXG4gICAgICAgIHRoaXMucmVtb3RlUmVxdWVzdCh1cmwsICdHRVQnLCB7fSwgY2FsbGJhY2spO1xuICAgIH1cbn1cbiIsImltcG9ydCByZXF1ZXN0IGZyb20gJy4uL2xpYi9yZXF1ZXN0JztcblxuaW1wb3J0IENvdW50cnlBcGkgZnJvbSAnLi9jb3VudHJpZXMnO1xuaW1wb3J0IFByb2R1Y3RBcGkgZnJvbSAnLi9wcm9kdWN0JztcbmltcG9ydCBQcm9kdWN0QXR0cmlidXRlc0FwaSBmcm9tICcuL3Byb2R1Y3QtYXR0cmlidXRlcyc7XG5pbXBvcnQgU2VhcmNoQXBpIGZyb20gJy4vc2VhcmNoJztcbmltcG9ydCBDYXJ0QXBpIGZyb20gJy4vY2FydCc7XG5pbXBvcnQgV2lzaGxpc3QgZnJvbSAnLi93aXNobGlzdCc7XG5cbmNvbnN0IGludGVybmFscyA9IHt9O1xuXG4vKipcbiAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIHJlcXVlc3QgYSBwYWdlIHZpYSBhamF4XG4gKlxuICogQHBhcmFtIHVybFxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEBwYXJhbSBjYWxsYmFja1xuICovXG5pbnRlcm5hbHMuZ2V0UGFnZSA9IGZ1bmN0aW9uICh1cmwsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgcmVxdWVzdCh1cmwsIHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgcmVxdWVzdE9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfSwgY2FsbGJhY2spO1xufTtcblxuaW50ZXJuYWxzLmdldFBhZ2VCeUdRTCA9IGZ1bmN0aW9uIChwYWdlLCBjYWxsYmFjaykge1xuICAgIHJlcXVlc3QoJy9ncmFwaHFsLXJlbmRlcicsIHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgcmVxdWVzdE9wdGlvbnM6IHtcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlX25hbWU6IHBhZ2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sIGNhbGxiYWNrKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBjb3VudHJ5OiBuZXcgQ291bnRyeUFwaSgpLFxuICAgIHByb2R1Y3RBdHRyaWJ1dGVzOiBuZXcgUHJvZHVjdEF0dHJpYnV0ZXNBcGkoKSxcbiAgICBwcm9kdWN0OiBuZXcgUHJvZHVjdEFwaSgpLFxuICAgIHNlYXJjaDogbmV3IFNlYXJjaEFwaSgpLFxuICAgIGNhcnQ6IG5ldyBDYXJ0QXBpKCksXG4gICAgd2lzaGxpc3Q6IG5ldyBXaXNobGlzdCgpLFxuICAgIGdldFBhZ2U6IGludGVybmFscy5nZXRQYWdlLFxuICAgIGdldFBhZ2VCeUdRTDogaW50ZXJuYWxzLmdldFBhZ2VCeUdRTCxcbn07XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IEhvb2tzIGZyb20gJy4uL2hvb2tzJztcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAnLi4vbGliL3F1ZXJ5LXN0cmluZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgLyoqXG4gICAgICogQENvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodmVyc2lvbikge1xuICAgICAgICAvLyBjYWxsIHBhcmVudFxuICAgICAgICBzdXBlcih2ZXJzaW9uKTtcblxuICAgICAgICAvLyBzZXQgdXAgY2xhc3MgdmFyaWFibGVzXG4gICAgICAgIHRoaXMuZW5kcG9pbnQgPSAnL3Byb2R1Y3QtYXR0cmlidXRlcy8nO1xuICAgICAgICB0aGlzLmluQ2FydEVuZHBvaW50ID0gJy9jb25maWd1cmUtb3B0aW9ucy8nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBwcm9kdWN0SWRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gICAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAgICovXG4gICAgb3B0aW9uQ2hhbmdlKHByb2R1Y3RJZCwgcGFyYW1zLCB0ZW1wbGF0ZSA9IG51bGwsIGNhbGxiYWNrKSB7XG4gICAgICAgIGxldCB0ZW1wbGF0ZUFyZyA9IHRlbXBsYXRlO1xuICAgICAgICBsZXQgY2FsbGJhY2tBcmcgPSBjYWxsYmFjaztcblxuICAgICAgICBpZiAodHlwZW9mIHRlbXBsYXRlQXJnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWxsYmFja0FyZyA9IHRlbXBsYXRlQXJnO1xuICAgICAgICAgICAgdGVtcGxhdGVBcmcgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW1vdGVSZXF1ZXN0KHRoaXMuZW5kcG9pbnQgKyBwcm9kdWN0SWQsICdQT1NUJywgeyBwYXJhbXM6IHBhcnNlKHBhcmFtcyksIHRlbXBsYXRlOiB0ZW1wbGF0ZUFyZyB9LCAoZXJyLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZW1pdERhdGEgPSB7XG4gICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgSG9va3MuZW1pdCgncHJvZHVjdC1vcHRpb25zLWNoYW5nZS1yZW1vdGUnLCBlbWl0RGF0YSk7XG4gICAgICAgICAgICBjYWxsYmFja0FyZyhlcnIsIHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGl0ZW1JZFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBjb25maWd1cmVJbkNhcnQoaXRlbUlkLCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMucmVtb3RlUmVxdWVzdCh0aGlzLmluQ2FydEVuZHBvaW50ICsgaXRlbUlkLCAnR0VUJywgcGFyYW1zLCAoZXJyLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlIGZyb20gJy4vYmFzZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgLyoqXG4gICAgICogQENvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodmVyc2lvbikge1xuICAgICAgICAvLyBjYWxsIHBhcmVudFxuICAgICAgICBzdXBlcih2ZXJzaW9uKTtcblxuICAgICAgICAvLyBzZXQgdXAgY2xhc3MgdmFyaWFibGVzXG4gICAgICAgIHRoaXMuZW5kcG9pbnQgPSAnL3Byb2R1Y3RzLnBocD9wcm9kdWN0SWQ9JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBwcm9kdWN0SWRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBnZXRCeUlkKHByb2R1Y3RJZCwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmVuZHBvaW50ICsgcHJvZHVjdElkO1xuICAgICAgICBsZXQgcGFyYW1zQXJnID0gcGFyYW1zO1xuICAgICAgICBsZXQgY2FsbGJhY2tBcmcgPSBjYWxsYmFjaztcblxuICAgICAgICBpZiAodHlwZW9mIHBhcmFtc0FyZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FsbGJhY2tBcmcgPSBwYXJhbXNBcmc7XG4gICAgICAgICAgICBwYXJhbXNBcmcgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWFrZVJlcXVlc3QodXJsLCAnR0VUJywgcGFyYW1zQXJnLCBmYWxzZSwgY2FsbGJhY2tBcmcpO1xuICAgIH1cbn1cbiIsImltcG9ydCBIb29rcyBmcm9tICcuLi9ob29rcyc7XG5pbXBvcnQgQmFzZSBmcm9tICcuL2Jhc2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgIC8qKlxuICAgICAqIEBDb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHZlcnNpb24pIHtcbiAgICAgICAgLy8gY2FsbCBwYXJlbnRcbiAgICAgICAgc3VwZXIodmVyc2lvbik7XG5cbiAgICAgICAgLy8gc2V0IHVwIGNsYXNzIHZhcmlhYmxlc1xuICAgICAgICB0aGlzLmVuZHBvaW50ID0gJy9zZWFyY2gucGhwP3NlYXJjaF9xdWVyeT0nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzZWFyY2ggcmVzdWx0c1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBxdWVyeVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIHNlYXJjaChxdWVyeSwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmVuZHBvaW50ICsgZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KTtcbiAgICAgICAgbGV0IHBhcmFtc0FyZyA9IHBhcmFtcztcbiAgICAgICAgbGV0IGNhbGxiYWNrQXJnID0gY2FsbGJhY2s7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXNBcmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrQXJnID0gcGFyYW1zQXJnO1xuICAgICAgICAgICAgcGFyYW1zQXJnID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBIb29rcy5lbWl0KCdzZWFyY2gtcXVpY2stcmVtb3RlJywgcXVlcnkpO1xuICAgICAgICB0aGlzLm1ha2VSZXF1ZXN0KHVybCwgJ0dFVCcsIHBhcmFtc0FyZywgZmFsc2UsIGNhbGxiYWNrQXJnKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuL2Jhc2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgIGl0ZW1BZGQod2lzaGxpc3RJZCwgcHJvZHVjdElkLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCB1cmwgPSBgL3dpc2hsaXN0LnBocD9hY3Rpb249YWRkJndpc2hsaXN0aWQ9JHt3aXNobGlzdElkfSZwcm9kdWN0X2lkPSR7cHJvZHVjdElkfWA7XG4gICAgICAgIGxldCBvcHRzID0gb3B0aW9ucztcbiAgICAgICAgbGV0IGNhbGxiYWNrRm4gPSBjYWxsYmFjaztcblxuICAgICAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrRm4gPSBvcHRzO1xuICAgICAgICAgICAgb3B0cyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tYWtlUmVxdWVzdCh1cmwsICdQT1NUJywgb3B0cywgZmFsc2UsIGNhbGxiYWNrRm4pO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IGdldEJPRExFdmVudHMgfSBmcm9tICcuLi9oZWxwZXJzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJvZGxFdmVudHMgPSBnZXRCT0RMRXZlbnRzKCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZ2V0RXZlbnRJZCwgaXNCT0RMRW5hYmxlZCB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IEJhc2UgZnJvbSAnLi9iYXNlJztcblxuY2xhc3MgQ2FydCBleHRlbmRzIEJhc2Uge1xuICAgIGVtaXRBZGRJdGVtKHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuZW1pdCh0aGlzLmJvZGxFdmVudHMuQWRkQ2FydEl0ZW1FdmVudC5DUkVBVEUsIHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBlbWl0UmVtb3ZlSXRlbShyZXNwb25zZSkge1xuICAgICAgICBpZiAodGhpcy5zaG91bGRFbWl0UmVtb3ZlSXRlbShyZXNwb25zZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCh0aGlzLmJvZGxFdmVudHMuUmVtb3ZlQ2FydEl0ZW1FdmVudC5DUkVBVEUsIHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNob3VsZEVtaXRSZW1vdmVJdGVtKHJlc3BvbnNlKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhLmxpbmVfaXRlbXM/Lmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgZW1pdChldmVudE5hbWUsIHJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLnByZXBhcmVQYXlsb2FkKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5ib2RsRXZlbnRzLmNhcnQuZW1pdChldmVudE5hbWUsIHBheWxvYWQpO1xuICAgIH1cblxuICAgIHByZXBhcmVQYXlsb2FkKHJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChpc0JPRExFbmFibGVkKCkgJiYgIXJlc3BvbnNlLmRhdGEuZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGdldEV2ZW50SWQoKSxcbiAgICAgICAgICAgICAgICBjaGFubmVsX2lkOiByZXNwb25zZS5kYXRhLmNoYW5uZWxfaWQsXG4gICAgICAgICAgICAgICAgY3VycmVuY3k6IHJlc3BvbnNlLmRhdGEuY3VycmVuY3ksXG4gICAgICAgICAgICAgICAgcHJvZHVjdF92YWx1ZTogcmVzcG9uc2UuZGF0YS5wcm9kdWN0X3ZhbHVlLFxuICAgICAgICAgICAgICAgIGxpbmVfaXRlbXM6IHJlc3BvbnNlLmRhdGEubGluZV9pdGVtcy5tYXAoKGl0ZW0pID0+ICh7IC4uLml0ZW0sIHByb2R1Y3RfaWQ6IFN0cmluZyhpdGVtLnByb2R1Y3RfaWQpIH0pKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge307XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDYXJ0O1xuIiwiaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5cbmV4cG9ydCBjb25zdCBpc0JPRExFbmFibGVkID0gKCkgPT4gdHlwZW9mIHdpbmRvdy5ib2RsRXZlbnRzICE9PSAndW5kZWZpbmVkJztcblxuZXhwb3J0IGNvbnN0IEZha2VCT0RMRXZlbnRzID0ge1xuICAgIGNhcnQ6IHtcbiAgICAgICAgYWRkSXRlbTogKCkgPT4ge30sXG4gICAgICAgIHJlbW92ZUl0ZW06ICgpID0+IHt9LFxuICAgICAgICBlbWl0OiAoKSA9PiB7fSxcbiAgICB9LFxuICAgIEFkZENhcnRJdGVtRXZlbnQ6IHtcbiAgICAgICAgQ1JFQVRFOiAnY3JlYXRlX2FkZF9jYXJ0X2l0ZW0nLFxuICAgIH0sXG4gICAgUmVtb3ZlQ2FydEl0ZW1FdmVudDoge1xuICAgICAgICBDUkVBVEU6ICdjcmVhdGVfcmVtb3ZlX2NhcnRfaXRlbScsXG4gICAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFdmVudElkID0gKCkgPT4gdXVpZHY0KCk7XG5cbmV4cG9ydCBjb25zdCBnZXRCT0RMRXZlbnRzID0gKCkgPT4ge1xuICAgIGlmIChpc0JPRExFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5ib2RsRXZlbnRzO1xuICAgIH1cblxuICAgIHJldHVybiBGYWtlQk9ETEV2ZW50cztcbn07XG4iLCJpbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50ZW1pdHRlcjMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgc3Vic2NyaWJlKGV2ZW50TmFtZSwgZWxlbWVudFNlbGVjdG9yLCBoYW5kbGVyKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgeyB0YXJnZXQgfSA9IGU7IHRhcmdldCAmJiB0YXJnZXQgIT09IHRoaXM7IHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5tYXRjaGVzKGVsZW1lbnRTZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKHRhcmdldCwgZSwgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCBmYWxzZSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VIb29rcyBmcm9tICcuL2Jhc2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEJhc2VIb29rcyB7XG4gICAgLyoqXG4gICAgICogQENvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIGNhbGwgcGFyZW50XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5pdGVtQWRkKCk7XG4gICAgfVxuXG4gICAgaXRlbUFkZCgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmUoJ3N1Ym1pdCcsICdbZGF0YS1jYXJ0LWl0ZW0tYWRkXScsIChldmVudCwgdGFyZ2V0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2NhcnQtaXRlbS1hZGQnLCBldmVudCwgdGFyZ2V0KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VIb29rcyBmcm9tICcuL2Jhc2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEJhc2VIb29rcyB7fVxuIiwiaW1wb3J0IEJhc2VIb29rcyBmcm9tICcuL2Jhc2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEJhc2VIb29rcyB7XG4gICAgLyoqXG4gICAgICogQENvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIGNhbGwgcGFyZW50XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5jdXJyZW5jeVNlbGVjdG9yKCk7XG4gICAgfVxuXG4gICAgY3VycmVuY3lTZWxlY3RvcigpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmUoJ2lucHV0JywgJ1tkYXRhLWN1cnJlbmN5LXNlbGVjdG9yLXRvZ2dsZV0nLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnY3VycmVuY3lTZWxlY3Rvci10b2dnbGUnLCBldmVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlSG9va3MgZnJvbSAnLi9iYXNlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBCYXNlSG9va3Mge1xuICAgIC8qKlxuICAgICAqIEBDb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBjYWxsIHBhcmVudFxuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMuc2VhcmNoRXZlbnRzKCk7XG4gICAgfVxuXG4gICAgc2VhcmNoRXZlbnRzKCkge1xuICAgICAgICB0aGlzLnN1YnNjcmliZSgnY2xpY2snLCAnW2RhdGEtZmFjZXRlZC1zZWFyY2gtZmFjZXRdJywgKGV2ZW50LCB0YXJnZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZmFjZXRlZFNlYXJjaC1mYWNldC1jbGlja2VkJywgZXZlbnQsIHRhcmdldCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlKCdzdWJtaXQnLCAnW2RhdGEtZmFjZXRlZC1zZWFyY2gtcmFuZ2VdJywgKGV2ZW50LCB0YXJnZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZmFjZXRlZFNlYXJjaC1yYW5nZS1zdWJtaXR0ZWQnLCBldmVudCwgdGFyZ2V0KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IENhcnRIb29rcyBmcm9tICcuL2NhcnQnO1xuaW1wb3J0IENvb2tpZUhvb2tzIGZyb20gJy4vY29va2llJztcbmltcG9ydCBDdXJyZW5jeVNlbGVjdG9ySG9va3MgZnJvbSAnLi9jdXJyZW5jeS1zZWxlY3Rvcic7XG5pbXBvcnQgUHJvZHVjdEhvb2tzIGZyb20gJy4vcHJvZHVjdCc7XG5pbXBvcnQgU2VhcmNoSG9va3MgZnJvbSAnLi9zZWFyY2gnO1xuaW1wb3J0IEZhY2V0ZWRTZWFyY2hIb29rcyBmcm9tICcuL2ZhY2V0ZWQtc2VhcmNoJztcbmltcG9ydCBTb3J0QnlIb29rcyBmcm9tICcuL3NvcnQtYnknO1xuXG5jb25zdCBpbnRlcm5hbHMgPSB7fTtcblxuaW50ZXJuYWxzLmNsYXNzZXMgPSB7XG4gICAgY2FydDogbmV3IENhcnRIb29rcygpLFxuICAgIGNvb2tpZTogbmV3IENvb2tpZUhvb2tzKCksXG4gICAgY3VycmVuY3lTZWxlY3RvcjogbmV3IEN1cnJlbmN5U2VsZWN0b3JIb29rcygpLFxuICAgIHByb2R1Y3Q6IG5ldyBQcm9kdWN0SG9va3MoKSxcbiAgICBzZWFyY2g6IG5ldyBTZWFyY2hIb29rcygpLFxuICAgIGZhY2V0ZWRTZWFyY2g6IG5ldyBGYWNldGVkU2VhcmNoSG9va3MoKSxcbiAgICBzb3J0Qnk6IG5ldyBTb3J0QnlIb29rcygpLFxufTtcblxuaW50ZXJuYWxzLnBhcnNlSG9va3MgPSBmdW5jdGlvbiAoaG9va05hbWUpIHtcbiAgICBjb25zdCBob29rVHlwZSA9IGhvb2tOYW1lLnNwbGl0KCctJylbMF07XG5cbiAgICBpZiAoaW50ZXJuYWxzLmNsYXNzZXNbaG9va1R5cGVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2hvb2tUeXBlfSBpcyBub3QgYSB2YWxpZCBob29rVHlwZWApO1xuICAgIH1cblxuICAgIHJldHVybiBpbnRlcm5hbHMuY2xhc3Nlc1tob29rVHlwZV07XG59O1xuXG5jbGFzcyBIb29rcyB7XG4gICAgb24oaG9va05hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGhvb2sgPSBpbnRlcm5hbHMucGFyc2VIb29rcyhob29rTmFtZSk7XG5cbiAgICAgICAgcmV0dXJuIGhvb2sub24oaG9va05hbWUsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBvZmYoaG9va05hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGhvb2sgPSBpbnRlcm5hbHMucGFyc2VIb29rcyhob29rTmFtZSk7XG5cbiAgICAgICAgcmV0dXJuIGhvb2sub2ZmKGhvb2tOYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgZW1pdChob29rTmFtZSkge1xuICAgICAgICBjb25zdCBob29rID0gaW50ZXJuYWxzLnBhcnNlSG9va3MoaG9va05hbWUpO1xuXG4gICAgICAgIHJldHVybiBob29rLmVtaXQoLi4uYXJndW1lbnRzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBIb29rcygpO1xuIiwiaW1wb3J0IEJhc2VIb29rcyBmcm9tICcuL2Jhc2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEJhc2VIb29rcyB7XG4gICAgLyoqXG4gICAgICogQENvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIGNhbGwgcGFyZW50XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgb3B0aW9uc0NoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmUoJ2NoYW5nZScsICdbZGF0YS1wcm9kdWN0LW9wdGlvbi1jaGFuZ2VdJywgKGV2ZW50LCB0YXJnZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncHJvZHVjdC1vcHRpb24tY2hhbmdlJywgZXZlbnQsIHRhcmdldCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlSG9va3MgZnJvbSAnLi9iYXNlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBCYXNlSG9va3Mge1xuICAgIC8qKlxuICAgICAqIEBDb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBjYWxsIHBhcmVudFxuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMucXVpY2tTZWFyY2goKTtcbiAgICB9XG5cbiAgICBxdWlja1NlYXJjaCgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmUoJ2lucHV0JywgJ1tkYXRhLXNlYXJjaC1xdWlja10nLCAoZXZlbnQsIHRhcmdldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdzZWFyY2gtcXVpY2snLCBldmVudCwgdGFyZ2V0KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VIb29rcyBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IGNsb3Nlc3QgZnJvbSAnLi4vbGliL2Nsb3Nlc3QnO1xuXG4vLyBpZSAxMSBkb2VzIG5vdCBzdXBwb3J0IG5hdGl2ZSBjbG9zZXN0XG5pZiAoIUVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMpIHtcbiAgICBFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzID0gRWxlbWVudC5wcm90b3R5cGUubXNNYXRjaGVzU2VsZWN0b3IgfHwgRWxlbWVudC5wcm90b3R5cGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yO1xufVxuXG5pZiAoIUVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3QpIHtcbiAgICBFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0ID0gY2xvc2VzdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBCYXNlSG9va3Mge1xuICAgIC8qKlxuICAgICAqIEBDb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBjYWxsIHBhcmVudFxuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMuc29ydEJ5RXZlbnRzKCk7XG4gICAgfVxuXG4gICAgc29ydEJ5RXZlbnRzKCkge1xuICAgICAgICB0aGlzLnN1YnNjcmliZSgnc3VibWl0JywgJ1tkYXRhLXNvcnQtYnldJywgKGV2ZW50LCB0YXJnZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnc29ydEJ5LXN1Ym1pdHRlZCcsIGV2ZW50LCB0YXJnZXQpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN1YnNjcmliZSgnY2hhbmdlJywgJ1tkYXRhLXNvcnQtYnldIHNlbGVjdCcsIChldmVudCwgdGFyZ2V0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3NvcnRCeS1zZWxlY3QtY2hhbmdlZCcsIGV2ZW50LCB0YXJnZXQpO1xuXG4gICAgICAgICAgICBpZiAoIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3NvcnRCeS1zdWJtaXR0ZWQnLCBldmVudCwgdGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiLyoqXG4gKiBpZSAxMSBkb2VzIG5vdCBzdXBwb3J0IG5hdGl2ZSBjbG9zZXN0IHNvIHVzZSB0aGlzIHBvbHlmaWxsIGZ1bmN0aW9uIGluc3RlYWQgdG8gZmluZCBjbG9zZXN0IG1hdGNoaW5nIHNlbGVjdG9yIHN0YXJ0aW5nIGZyb20gZWwuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zXG4gKiBAcmV0dXJucyB7YW55fSBtYXRjaGluZyBzZWxlY3RvciBvciBudWxsXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNsb3Nlc3Qocykge1xuICAgIGxldCBlbCA9IHRoaXM7XG5cbiAgICBkbyB7XG4gICAgICAgIGlmIChlbC5tYXRjaGVzKHMpKSByZXR1cm4gZWw7XG4gICAgICAgIGVsID0gZWwucGFyZW50RWxlbWVudCB8fCBlbC5wYXJlbnROb2RlO1xuICAgIH0gd2hpbGUgKGVsICE9PSBudWxsICYmIGVsLm5vZGVUeXBlID09PSAxKTtcblxuICAgIHJldHVybiBudWxsO1xufVxuIiwiLyoqXG4gKiBFbmNvZGVzIHN0cmluZyBieSBzdHJpY3RlciBydWxlc1xuICogc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9rZXZ2YS9zdHJpY3QtdXJpLWVuY29kZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAqL1xuY29uc3QgZW5jb2RlID0gKHN0cmluZykgPT4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZykucmVwbGFjZSgvWyEnKCkqXS9nLCAoeCkgPT4gYCUke3guY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1gKTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5LCB3aGVyZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBzbGljZSB0aWxsIHNlcGFyYXRvciBhbmQgdGhlIHNlY29uZCBpcyB0aGUgcmVzdC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VwYXJhdG9yXG4gKi9cbmNvbnN0IHNwbGl0T25GaXJzdCA9IChzdHJpbmcsIHNlcGFyYXRvcikgPT4ge1xuICAgIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gc3RyaW5nLmluZGV4T2Yoc2VwYXJhdG9yKTtcbiAgICBpZiAoc2VwYXJhdG9ySW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBbc3RyaW5nXTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgICAgc3RyaW5nLnNsaWNlKDAsIHNlcGFyYXRvckluZGV4KSxcbiAgICAgICAgc3RyaW5nLnNsaWNlKHNlcGFyYXRvckluZGV4ICsgc2VwYXJhdG9yLmxlbmd0aCksXG4gICAgXTtcbn07XG5cbi8qKlxuICogU29ydHMgYXJyYXkgb3Igb2JqZWN0IGJ5IGtleXNcbiAqXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gaW5wdXRcbiAqL1xuY29uc3Qgc29ydEJ5S2V5cyA9IChpbnB1dCkgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICByZXR1cm4gaW5wdXQuc29ydCgpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBzb3J0QnlLZXlzKE9iamVjdC5rZXlzKGlucHV0KSlcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBOdW1iZXIoYSkgLSBOdW1iZXIoYikpXG4gICAgICAgICAgICAubWFwKChrZXkpID0+IGlucHV0W2tleV0pO1xuICAgIH1cblxuICAgIHJldHVybiBpbnB1dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBpZiB0aGUga2V5IGV4aXN0cyBpbiB0aGUgb2JqZWN0IG9yIHRoZSB2YWx1ZSBpZiBkb2VuJ3RcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvclxuICovXG5jb25zdCBnZXRQYXJzZWRWYWx1ZSA9IChrZXksIHZhbHVlLCBhY2N1bXVsYXRvcikgPT4ge1xuICAgIGlmIChhY2N1bXVsYXRvcltrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBbXS5jb25jYXQoYWNjdW11bGF0b3Jba2V5XSwgdmFsdWUpO1xufTtcblxuLyoqXG4gKiBSZWR1Y2VyIHRoYXQgZm9ybWF0cyBhbmQgY29tYmluZXMga2V5LXZhbHVlIHBhaXJcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9uc1xuICovXG5jb25zdCByZWR1Y2VCeUtleSA9IChvcHRpb25zKSA9PiAoa2V5KSA9PiAocmVzdWx0LCB2YWx1ZSkgPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbLi4ucmVzdWx0LCBlbmNvZGUoa2V5KV07XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZUFycmF5SW5kZXgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcmVzdWx0Lmxlbmd0aCAvIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmNvbmNhdChcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkubWFwKChrZXlPZlZhbHVlKSA9PiAoW1xuICAgICAgICAgICAgICAgICAgICBlbmNvZGUoa2V5KSxcbiAgICAgICAgICAgICAgICAgICAgJ1snLCBlbmNvZGUoaW5kZXgpLCAnXScsXG4gICAgICAgICAgICAgICAgICAgICdbJywgZW5jb2RlKGtleU9mVmFsdWUpLCAnXT0nLFxuICAgICAgICAgICAgICAgICAgICBlbmNvZGUodmFsdWVba2V5T2ZWYWx1ZV0pLFxuICAgICAgICAgICAgICAgIF0uam9pbignJykpKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5kZXggPSByZXN1bHQubGVuZ3RoO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgICBbZW5jb2RlKGtleSksICdbJywgZW5jb2RlKGluZGV4KSwgJ109JywgZW5jb2RlKHZhbHVlKV0uam9pbignJyksXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcmV0dXJuIFsuLi5yZXN1bHQsIFtlbmNvZGUoa2V5KSwgJz0nLCBlbmNvZGUodmFsdWUpXS5qb2luKCcnKV07XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHF1ZXJ5IHN0cmluZyBpbnRvIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2UoaW5wdXQpIHtcbiAgICBjb25zdCByZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dFBhcnNlZCA9IGlucHV0LnRyaW0oKS5yZXBsYWNlKC9eWz8jJl0vLCAnJyk7XG5cbiAgICBpZiAoIWlucHV0UGFyc2VkKSB7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgaW5wdXRQYXJzZWQuc3BsaXQoJyYnKS5mb3JFYWNoKChwYXJhbSkgPT4ge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItY29uc3QgKi9cbiAgICAgICAgbGV0IFtrZXksIHZhbHVlXSA9IHNwbGl0T25GaXJzdChwYXJhbS5yZXBsYWNlKC9cXCsvZywgJyAnKSwgJz0nKTtcblxuICAgICAgICBrZXkgPSBkZWNvZGVVUklDb21wb25lbnQoa2V5KTtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG4gICAgICAgIHJldFtrZXldID0gZ2V0UGFyc2VkVmFsdWUoa2V5LCB2YWx1ZSwgcmV0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXQpLnNvcnQoKS5yZWR1Y2UoKHJlc3VsdCwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmV0W2tleV07XG4gICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gc29ydEJ5S2V5cyh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IHRvIHF1ZXJ5IHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZpbHRlclZhbHVlc10gLSBmaWx0ZXJzIGVtcHR5IHN0cmluZyBvciB1bmRlZmluZWRzXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmluY2x1ZGVBcnJheUluZGV4XSAtIGluY2x1ZGVzIGFycmF5IGluZGV4IGluIHRoZSBxdWVyeSBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeShvYmplY3QsIG9wdGlvbnMgPSB7XG4gICAgZmlsdGVyVmFsdWVzOiBmYWxzZSxcbiAgICBhcnJheUluZGV4OiBmYWxzZSxcbn0pIHtcbiAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3Qgb2JqZWN0Q29weSA9IHt9O1xuICAgIGNvbnN0IHNob3VsZEZpbHRlciA9IChrZXkpID0+IChcbiAgICAgICAgb3B0aW9ucy5maWx0ZXJWYWx1ZXNcbiAgICAgICAgJiYgKG9iamVjdFtrZXldID09PSAnJyB8fCBvYmplY3Rba2V5XSA9PT0gdW5kZWZpbmVkKVxuICAgICk7XG5cbiAgICBPYmplY3Qua2V5cyhvYmplY3QpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBpZiAoIXNob3VsZEZpbHRlcihrZXkpKSB7XG4gICAgICAgICAgICBvYmplY3RDb3B5W2tleV0gPSBvYmplY3Rba2V5XTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdENvcHkpO1xuICAgIGtleXMuc29ydCgpO1xuXG4gICAgcmV0dXJuIGtleXMubWFwKChrZXkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlKGtleSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgICAgIC5yZWR1Y2UocmVkdWNlQnlLZXkob3B0aW9ucykoa2V5KSwgW10pXG4gICAgICAgICAgICAgICAgLmpvaW4oJyYnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgJHtlbmNvZGUoa2V5KX09JHtlbmNvZGUodmFsdWUpfWA7XG4gICAgfSkuZmlsdGVyKCh4KSA9PiB4Lmxlbmd0aCA+IDApLmpvaW4oJyYnKTtcbn1cbiIsImltcG9ydCAnd2hhdHdnLWZldGNoJztcbmltcG9ydCB7IHN0cmluZ2lmeSB9IGZyb20gJy4vcXVlcnktc3RyaW5nJztcbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBjdXJyZW50IG1ldGhvZCBwYXNzZWQgaW4gaXMgdmFsaWRcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuY29uc3QgaXNWYWxpZEhUVFBNZXRob2QgPSAobWV0aG9kKSA9PiBbJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnXS5pbmRleE9mKG1ldGhvZCkgIT09IC0xO1xuXG4vKipcbiAqIENoZWNrcyBpZiByZXF1ZXN0ZWQgdGVtcGxhdGUgaXMgdXNpbmcgc2VjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheXxTdHJpbmd9IHJlcXVlc3RlZFRlbXBsYXRlXG4gKi9cbmNvbnN0IGlzVXNpbmdTZWN0aW9ucyA9IChyZXF1ZXN0ZWRUZW1wbGF0ZSkgPT4gcmVxdWVzdGVkVGVtcGxhdGUgIT09IG51bGwgJiYgdHlwZW9mIChyZXF1ZXN0ZWRUZW1wbGF0ZSkgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHJlcXVlc3RlZFRlbXBsYXRlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRlbXBsYXRlcyBhcnJheVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fFN0cmluZ30gcmVxdWVzdGVkVGVtcGxhdGVcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuY29uc3QgZ2V0VGVtcGxhdGVzID0gKHJlcXVlc3RlZFRlbXBsYXRlKSA9PiB7XG4gICAgbGV0IHRlbXBsYXRlcyA9IFtdO1xuICAgIGlmIChpc1VzaW5nU2VjdGlvbnMocmVxdWVzdGVkVGVtcGxhdGUpKSB7XG4gICAgICAgIHRlbXBsYXRlcyA9IE9iamVjdC52YWx1ZXMocmVxdWVzdGVkVGVtcGxhdGUpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIChyZXF1ZXN0ZWRUZW1wbGF0ZSkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRlbXBsYXRlcyA9IFtyZXF1ZXN0ZWRUZW1wbGF0ZV07XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlcXVlc3RlZFRlbXBsYXRlKSAmJiByZXF1ZXN0ZWRUZW1wbGF0ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRlbXBsYXRlcyA9IHJlcXVlc3RlZFRlbXBsYXRlO1xuICAgIH1cbiAgICByZXR1cm4gdGVtcGxhdGVzO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHJlbGF0aXZlVXJsLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICByZW1vdGU6IGZhbHNlLFxuICAgICAgICByZXF1ZXN0T3B0aW9uczoge1xuICAgICAgICAgICAgYmFzZVVybDogbnVsbCxcbiAgICAgICAgICAgIGZvcm1EYXRhOiBudWxsLFxuICAgICAgICAgICAgcGFyYW1zOiB7fSxcbiAgICAgICAgICAgIGNvbmZpZzoge30sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogW10sXG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBvcHRpb25zID0geyAuLi5kZWZhdWx0T3B0aW9ucywgLi4ub3B0cyB9O1xuICAgIGNvbnN0IGRhdGEgPSBvcHRpb25zLnJlcXVlc3RPcHRpb25zLmZvcm1EYXRhID8gb3B0aW9ucy5yZXF1ZXN0T3B0aW9ucy5mb3JtRGF0YSA6IG9wdGlvbnMucmVxdWVzdE9wdGlvbnMucGFyYW1zO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAgICdzdGVuY2lsLWNvbmZpZyc6IG9wdGlvbnMucmVxdWVzdE9wdGlvbnMuY29uZmlnID8gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5yZXF1ZXN0T3B0aW9ucy5jb25maWcpIDogJ3t9JyxcbiAgICAgICAgJ3N0ZW5jaWwtb3B0aW9ucyc6ICd7fScsXG4gICAgICAgICd4LXhzcmYtdG9rZW4nOiB3aW5kb3cuQkNEYXRhICYmIHdpbmRvdy5CQ0RhdGEuY3NyZl90b2tlbiA/IHdpbmRvdy5CQ0RhdGEuY3NyZl90b2tlbiA6ICcnLFxuICAgICAgICAneC1yZXF1ZXN0ZWQtd2l0aCc6ICdzdGVuY2lsLXV0aWxzJyxcbiAgICB9O1xuXG4gICAgaWYgKCFpc1ZhbGlkSFRUUE1ldGhvZChvcHRpb25zLm1ldGhvZCkpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcignTm90IGEgdmFsaWQgSFRUUCBtZXRob2QnKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcGxhdGVzID0gZ2V0VGVtcGxhdGVzKG9wdGlvbnMucmVxdWVzdE9wdGlvbnMudGVtcGxhdGUpO1xuICAgIGNvbnN0IHVzaW5nU2VjdGlvbnMgPSBpc1VzaW5nU2VjdGlvbnMob3B0aW9ucy5yZXF1ZXN0T3B0aW9ucy50ZW1wbGF0ZSk7XG4gICAgY29uc3QgdXNpbmdUZW1wbGF0ZXMgPSB0ZW1wbGF0ZXMubGVuZ3RoID4gMDtcblxuICAgIGlmICghb3B0aW9ucy5yZXF1ZXN0T3B0aW9ucy5mb3JtRGF0YSkge1xuICAgICAgICBoZWFkZXJzWydjb250ZW50LXR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgnO1xuICAgIH1cblxuICAgIGlmICh1c2luZ1RlbXBsYXRlcykge1xuICAgICAgICBoZWFkZXJzWydzdGVuY2lsLW9wdGlvbnMnXSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHJlbmRlcl93aXRoOiB0ZW1wbGF0ZXMuam9pbignLCcpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgIG1ldGhvZDogb3B0aW9ucy5tZXRob2QsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgfTtcblxuICAgIGxldCB1cmwgPSBvcHRpb25zLnJlcXVlc3RPcHRpb25zLmJhc2VVcmwgPyBgJHtvcHRpb25zLnJlcXVlc3RPcHRpb25zLmJhc2VVcmx9JHtyZWxhdGl2ZVVybH1gIDogcmVsYXRpdmVVcmw7XG4gICAgaWYgKFsnR0VUJywgJ0hFQUQnXS5pbmRleE9mKGNvbmZpZy5tZXRob2QpID09PSAtMSkge1xuICAgICAgICBjb25maWcuYm9keSA9ICFvcHRpb25zLnJlcXVlc3RPcHRpb25zLmZvcm1EYXRhID8gc3RyaW5naWZ5KGRhdGEsIHsgaW5jbHVkZUFycmF5SW5kZXg6IHRydWUgfSkgOiBkYXRhO1xuICAgIH0gZWxzZSBpZiAoZGF0YSkge1xuICAgICAgICBjb25zdCBkZWxpbWl0ZXIgPSAhdXJsLmluY2x1ZGVzKCc/JykgPyAnPycgOiAnJic7XG4gICAgICAgIHVybCArPSBgJHtkZWxpbWl0ZXJ9JHtzdHJpbmdpZnkoZGF0YSl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmV0Y2godXJsLCBjb25maWcpXG4gICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSAmJiByZXNwb25zZS5oZWFkZXJzLmdldCgnWC1CQy1QcmV2aWV3LU1vZGUnKS5pbmRleE9mKCd0cnVlJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykuaW5kZXhPZignYXBwbGljYXRpb24vanNvbicpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IG9wdGlvbnMucmVtb3RlID8gcmVzcG9uc2UuY29udGVudCA6IHJlc3BvbnNlO1xuICAgICAgICAgICAgbGV0IHJldCA9IHJlc3BvbnNlO1xuXG4gICAgICAgICAgICBpZiAodXNpbmdUZW1wbGF0ZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGBjb21wb25lbnRzYCBwcmVmaXggZnJvbSB0aGUgcmVzcG9uc2UgaWYgaXQncyBhbiBvYmplY3RcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChjb250ZW50KSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY29udGVudCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbktleSA9IGtleS5yZXBsYWNlKC9eY29tcG9uZW50c1xcLy8sICcnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFtjbGVhbktleV0gPSBjb250ZW50W2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgKGNvbnRlbnRba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElmIHVzaW5nIFwic2VjdGlvbnNcIiwgbW9ycGggdGhlIGNvbnRlbnQgaW50byB0aGUgYXJiaXRyYXJ5IGtleXMgPT4gY29udGVudCBvYmplY3QuXG4gICAgICAgICAgICAgICAgaWYgKHVzaW5nU2VjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVkVGVtcGxhdGUgPSBvcHRpb25zLnJlcXVlc3RPcHRpb25zLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyZXF1ZXN0ZWRUZW1wbGF0ZSkuZm9yRWFjaCgodGVtcGxhdGVWYXJpYWJsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFt0ZW1wbGF0ZVZhcmlhYmxlXSA9IGNvbnRlbnRbcmVxdWVzdGVkVGVtcGxhdGVbdGVtcGxhdGVWYXJpYWJsZV1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNvbnRlbnRbcmVxdWVzdGVkVGVtcGxhdGVbdGVtcGxhdGVWYXJpYWJsZV1dO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMucmVtb3RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmV0KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IGNhbGxiYWNrKGVycikpO1xufVxuIiwiaW1wb3J0IGhvb2tzIGZyb20gJy4vaG9va3MnO1xuaW1wb3J0IGFwaSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgdG9vbHMgZnJvbSAnLi90b29scyc7XG5cbmNvbnN0IFN0ZW5jaWxVdGlscyA9IHtcbiAgICBob29rcyxcbiAgICBhcGksXG4gICAgdG9vbHMsXG59O1xuZXhwb3J0IHsgaG9va3MsIGFwaSwgdG9vbHMgfTtcbmV4cG9ydCBkZWZhdWx0IFN0ZW5jaWxVdGlscztcblxuLyogZ2xvYmFsIGRlZmluZSAqL1xuKGZ1bmN0aW9uIChyb290KSB7XG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCAmJiByb290KSB7XG4gICAgICAgIC8vIElnbm9yZXMgYmVsb3cgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2lzc3Vlcy81MTUwXG4gICAgICAgIGRlZmluZShmdW5jdGlvbiAoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLWFycm93LWNhbGxiYWNrXG4gICAgICAgICAgICByb290LnN0ZW5jaWxVdGlscyA9IFN0ZW5jaWxVdGlsczsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gU3RlbmNpbFV0aWxzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5zdGVuY2lsVXRpbHMgPSBTdGVuY2lsVXRpbHM7XG4gICAgfVxufSh0aGlzKSk7XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyB7XG4gICAgZ2V0U3JjKHBhdGgsIGRpbWVuc2lvbnMpIHtcbiAgICAgICAgLy8gUmVnZXggdG8gdGVzdCBzaXplIHN0cmluZyBpcyBvZiB0aGUgZm9ybSAxMjN4MTIzIG9yIDEwMHdcbiAgICAgICAgY29uc3Qgc2l6ZVJlZ2V4ID0gLyheXFxkK3ckKXwoXihcXGQrPyl4KFxcZCs/KSQpL2c7XG4gICAgICAgIGxldCBzaXplO1xuXG4gICAgICAgIGlmICh0eXBlb2YgKGRpbWVuc2lvbnMpID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBkaW1lbnNpb25zLndpZHRoIHx8IDEwMDtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGRpbWVuc2lvbnMuaGVpZ2h0IHx8IDEwMDtcblxuICAgICAgICAgICAgc2l6ZSA9IGAke3dpZHRofXgke2hlaWdodH1gO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiAoZGltZW5zaW9ucykgPT09ICdzdHJpbmcnICYmIHNpemVSZWdleC50ZXN0KGRpbWVuc2lvbnMpKSB7XG4gICAgICAgICAgICAvLyBJZiBkaW1lbnNpb25zIGlzIGEgc3RyaW5nIGFuZCBtYXRjaCB0aGUgTk5OeE5OTiBvciBOTk53IGZvcm1hdFxuICAgICAgICAgICAgc2l6ZSA9IGRpbWVuc2lvbnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBVc2UgdGhlIG9yaWdpbmFsIGltYWdlIHNpemVcbiAgICAgICAgICAgIHNpemUgPSAnb3JpZ2luYWwnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgnezpzaXplfScsIHNpemUpO1xuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIHtcbiAgICBnZXRTcmNzZXQodXJsLCBzaXplcykge1xuICAgICAgICAvLyBSZWdleCB0byB0ZXN0IHNpemUgc3RyaW5nIGlzIG9mIHRoZSBmb3JtIDEyM3gxMjMgb3IgMTAwd1xuICAgICAgICBjb25zdCBzaXplUmVnZXggPSAvKF5cXGQrdyQpfCheKFxcZCs/KXgoXFxkKz8pJCkvO1xuICAgICAgICAvLyBSZWdleCB0byB0ZXN0IHRvIHRoYXQgc3Jjc2V0IGRlc2NyaXB0b3IgaXMgb2YgdGhlIGZvcm0gMXggMS41eCAyeCBPUiAxMjN3XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3JSZWdleCA9IC8oXlxcZCt3JCl8KF4oWzAtOV0oXFwuWzAtOV0rKT8peCkkLztcblxuICAgICAgICBsZXQgc3Jjc2V0cyA9IHt9O1xuXG4gICAgICAgIGlmICghc2l6ZXMpIHtcbiAgICAgICAgICAgIC8vIFVzZSBkZWZhdWx0IHNyY3NldHMgaWYgbm9uZSBhcmUgcHJvdmlkZWRcbiAgICAgICAgICAgIHNyY3NldHMgPSB7XG4gICAgICAgICAgICAgICAgJzgwdyc6ICc4MHcnLFxuICAgICAgICAgICAgICAgICcxNjB3JzogJzE2MHcnLFxuICAgICAgICAgICAgICAgICczMjB3JzogJzMyMHcnLFxuICAgICAgICAgICAgICAgICc2NDB3JzogJzY0MHcnLFxuICAgICAgICAgICAgICAgICc5NjB3JzogJzk2MHcnLFxuICAgICAgICAgICAgICAgICcxMjgwdyc6ICcxMjgwdycsXG4gICAgICAgICAgICAgICAgJzE5MjB3JzogJzE5MjB3JyxcbiAgICAgICAgICAgICAgICAnMjU2MHcnOiAnMjU2MHcnLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICgoc2l6ZXMgPT09IE9iamVjdChzaXplcykpICYmICFPYmplY3Qua2V5cyhzaXplcykuc29tZSgoZGVzY3JpcHRvcikgPT4gIShkZXNjcmlwdG9yUmVnZXgudGVzdChkZXNjcmlwdG9yKSAmJiBzaXplUmVnZXgudGVzdChzaXplc1tkZXNjcmlwdG9yXSkpKSkge1xuICAgICAgICAgICAgLy8gSWYgb2JqZWN0IGNvbnNpc3RzIG9mIHZhbGlkIHNyY3NldHMsIHVzZSBpdCBpbnN0ZWFkXG4gICAgICAgICAgICBzcmNzZXRzID0gc2l6ZXM7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG9ubHkgb25lIGFyZ3VtZW50LCByZXR1cm4gYSBgc3JjYCBvbmx5IChhbHNvIHdvcmtzIGZvciBgc3Jjc2V0YClcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzcmNzZXRzKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHVybC5yZXBsYWNlKCd7OnNpemV9Jywgc3Jjc2V0c1tPYmplY3Qua2V5cyhzcmNzZXRzKVswXV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzcmNzZXQgZGVzY3JpcHRvciBvciBzaXplJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoc3Jjc2V0cykubWFwKChkZXNjcmlwdG9yKSA9PiBbdXJsLnJlcGxhY2UoJ3s6c2l6ZX0nLCBzcmNzZXRzW2Rlc2NyaXB0b3JdKSwgZGVzY3JpcHRvcl0uam9pbignICcpKS5qb2luKCcsICcpO1xuICAgIH1cbn1cbiIsImltcG9ydCBJbWFnZVRvb2wgZnJvbSAnLi9pbWFnZSc7XG5pbXBvcnQgSW1hZ2VTcmNzZXRUb29sIGZyb20gJy4vaW1hZ2VTcmNzZXQnO1xuaW1wb3J0IFN0b3JhZ2VUb29scyBmcm9tICcuL3N0b3JhZ2UnO1xuXG5jb25zdCB0b29scyA9IHtcbiAgICBpbWFnZTogbmV3IEltYWdlVG9vbCgpLFxuICAgIGltYWdlU3Jjc2V0OiBuZXcgSW1hZ2VTcmNzZXRUb29sKCksXG4gICAgc3RvcmFnZTogbmV3IFN0b3JhZ2VUb29scygpLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgdG9vbHM7XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyB7XG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBzdG9yYWdlIHR5cGUgKGxpa2UgbG9jYWxTdG9yYWdlIG9yIHNlc3Npb25TdG9yYWdlKSBpcyBhdmFpbGFibGUgZm9yIHVzZVxuICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJfU3RvcmFnZV9BUEkvVXNpbmdfdGhlX1dlYl9TdG9yYWdlX0FQSSNUZXN0aW5nX2Zvcl9hdmFpbGFiaWxpdHlcbiAgICAgKiBAcGFyYW0gdHlwZVxuICAgICAqIEByZXR1cm5zIGJvb2xlYW5cbiAgICAgKi9cbiAgICBzdG9yYWdlQXZhaWxhYmxlKHR5cGUpIHtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IHdpbmRvd1t0eXBlXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHggPSAnX19zdG9yYWdlX3Rlc3RfXyc7XG4gICAgICAgICAgICBzdG9yYWdlLnNldEl0ZW0oeCwgeCk7XG4gICAgICAgICAgICBzdG9yYWdlLnJlbW92ZUl0ZW0oeCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBET01FeGNlcHRpb24gJiYgKFxuICAgICAgICAgICAgLy8gZXZlcnl0aGluZyBleGNlcHQgRmlyZWZveFxuICAgICAgICAgICAgICAgIGUuY29kZSA9PT0gMjJcbiAgICAgICAgICAgICAgICAvLyBGaXJlZm94XG4gICAgICAgICAgICAgICAgfHwgZS5jb2RlID09PSAxMDE0XG4gICAgICAgICAgICAgICAgLy8gdGVzdCBuYW1lIGZpZWxkIHRvbywgYmVjYXVzZSBjb2RlIG1pZ2h0IG5vdCBiZSBwcmVzZW50XG4gICAgICAgICAgICAgICAgLy8gZXZlcnl0aGluZyBleGNlcHQgRmlyZWZveFxuICAgICAgICAgICAgICAgIHx8IGUubmFtZSA9PT0gJ1F1b3RhRXhjZWVkZWRFcnJvcidcbiAgICAgICAgICAgICAgICAvLyBGaXJlZm94XG4gICAgICAgICAgICAgICAgfHwgZS5uYW1lID09PSAnTlNfRVJST1JfRE9NX1FVT1RBX1JFQUNIRUQnKVxuICAgICAgICAgICAgICAgIC8vIGFja25vd2xlZGdlIFF1b3RhRXhjZWVkZWRFcnJvciBvbmx5IGlmIHRoZXJlJ3Mgc29tZXRoaW5nIGFscmVhZHkgc3RvcmVkXG4gICAgICAgICAgICAgICAgJiYgc3RvcmFnZS5sZW5ndGggIT09IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2VBdmFpbGFibGUoJ2xvY2FsU3RvcmFnZScpO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG5cbnZhciAkYXBwbHkgPSByZXF1aXJlKCcuL2Z1bmN0aW9uQXBwbHknKTtcbnZhciAkY2FsbCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25DYWxsJyk7XG52YXIgJHJlZmxlY3RBcHBseSA9IHJlcXVpcmUoJy4vcmVmbGVjdEFwcGx5Jyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2FjdHVhbEFwcGx5Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9ICRyZWZsZWN0QXBwbHkgfHwgYmluZC5jYWxsKCRjYWxsLCAkYXBwbHkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9mdW5jdGlvbkFwcGx5Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vZnVuY3Rpb25DYWxsJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcbnZhciAkVHlwZUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3R5cGUnKTtcblxudmFyICRjYWxsID0gcmVxdWlyZSgnLi9mdW5jdGlvbkNhbGwnKTtcbnZhciAkYWN0dWFsQXBwbHkgPSByZXF1aXJlKCcuL2FjdHVhbEFwcGx5Jyk7XG5cbi8qKiBAdHlwZSB7KGFyZ3M6IFtGdW5jdGlvbiwgdGhpc0FyZz86IHVua25vd24sIC4uLmFyZ3M6IHVua25vd25bXV0pID0+IEZ1bmN0aW9ufSBUT0RPIEZJWE1FLCBmaW5kIGEgd2F5IHRvIHVzZSBpbXBvcnQoJy4nKSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQmluZEJhc2ljKGFyZ3MpIHtcblx0aWYgKGFyZ3MubGVuZ3RoIDwgMSB8fCB0eXBlb2YgYXJnc1swXSAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdhIGZ1bmN0aW9uIGlzIHJlcXVpcmVkJyk7XG5cdH1cblx0cmV0dXJuICRhY3R1YWxBcHBseShiaW5kLCAkY2FsbCwgYXJncyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9yZWZsZWN0QXBwbHknKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIFJlZmxlY3QgIT09ICd1bmRlZmluZWQnICYmIFJlZmxlY3QgJiYgUmVmbGVjdC5hcHBseTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcblxudmFyIGNhbGxCaW5kQmFzaWMgPSByZXF1aXJlKCdjYWxsLWJpbmQtYXBwbHktaGVscGVycycpO1xuXG4vKiogQHR5cGUgeyh0aGlzQXJnOiBzdHJpbmcsIHNlYXJjaFN0cmluZzogc3RyaW5nLCBwb3NpdGlvbj86IG51bWJlcikgPT4gbnVtYmVyfSAqL1xudmFyICRpbmRleE9mID0gY2FsbEJpbmRCYXNpYyhbR2V0SW50cmluc2ljKCclU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mJScpXSk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNhbGxCb3VuZEludHJpbnNpYyhuYW1lLCBhbGxvd01pc3NpbmcpIHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXBhcmVuc1xuXHR2YXIgaW50cmluc2ljID0gLyoqIEB0eXBlIHtQYXJhbWV0ZXJzPHR5cGVvZiBjYWxsQmluZEJhc2ljPlswXVswXX0gKi8gKEdldEludHJpbnNpYyhuYW1lLCAhIWFsbG93TWlzc2luZykpO1xuXHRpZiAodHlwZW9mIGludHJpbnNpYyA9PT0gJ2Z1bmN0aW9uJyAmJiAkaW5kZXhPZihuYW1lLCAnLnByb3RvdHlwZS4nKSA+IC0xKSB7XG5cdFx0cmV0dXJuIGNhbGxCaW5kQmFzaWMoW2ludHJpbnNpY10pO1xuXHR9XG5cdHJldHVybiBpbnRyaW5zaWM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCdjYWxsLWJpbmQtYXBwbHktaGVscGVycycpO1xudmFyIGdPUEQgPSByZXF1aXJlKCdnb3BkJyk7XG5cbnZhciBoYXNQcm90b0FjY2Vzc29yO1xudHJ5IHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXBhcmVucywgbm8tcHJvdG9cblx0aGFzUHJvdG9BY2Nlc3NvciA9IC8qKiBAdHlwZSB7eyBfX3Byb3RvX18/OiB0eXBlb2YgQXJyYXkucHJvdG90eXBlIH19ICovIChbXSkuX19wcm90b19fID09PSBBcnJheS5wcm90b3R5cGU7XG59IGNhdGNoIChlKSB7XG5cdGlmICghZSB8fCB0eXBlb2YgZSAhPT0gJ29iamVjdCcgfHwgISgnY29kZScgaW4gZSkgfHwgZS5jb2RlICE9PSAnRVJSX1BST1RPX0FDQ0VTUycpIHtcblx0XHR0aHJvdyBlO1xuXHR9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1wYXJlbnNcbnZhciBkZXNjID0gISFoYXNQcm90b0FjY2Vzc29yICYmIGdPUEQgJiYgZ09QRChPYmplY3QucHJvdG90eXBlLCAvKiogQHR5cGUge2tleW9mIHR5cGVvZiBPYmplY3QucHJvdG90eXBlfSAqLyAoJ19fcHJvdG9fXycpKTtcblxudmFyICRPYmplY3QgPSBPYmplY3Q7XG52YXIgJGdldFByb3RvdHlwZU9mID0gJE9iamVjdC5nZXRQcm90b3R5cGVPZjtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vZ2V0Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGRlc2MgJiYgdHlwZW9mIGRlc2MuZ2V0ID09PSAnZnVuY3Rpb24nXG5cdD8gY2FsbEJpbmQoW2Rlc2MuZ2V0XSlcblx0OiB0eXBlb2YgJGdldFByb3RvdHlwZU9mID09PSAnZnVuY3Rpb24nXG5cdFx0PyAvKiogQHR5cGUge2ltcG9ydCgnLi9nZXQnKX0gKi8gZnVuY3Rpb24gZ2V0RHVuZGVyKHZhbHVlKSB7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0XHRyZXR1cm4gJGdldFByb3RvdHlwZU9mKHZhbHVlID09IG51bGwgPyB2YWx1ZSA6ICRPYmplY3QodmFsdWUpKTtcblx0XHR9XG5cdFx0OiBmYWxzZTtcbiIsIi8qIVxuICogQG5hbWUgICAgICAgIGVhc3l6b29tXG4gKiBAYXV0aG9yICAgICAgTWF0dCBIaW5jaGxpZmZlXG4gKiBAbW9kaWZpZWQgICAgRnJpZGF5LCBEZWNlbWJlciAzMHRoLCAyMDIyXG4gKiBAdmVyc2lvbiAgICAgMi42LjBcbiAqL1xuIWZ1bmN0aW9uKHQsZSl7XCJ1c2Ugc3RyaWN0XCI7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJqcXVlcnlcIl0sZnVuY3Rpb24odCl7ZSh0KX0pOlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPXQuRWFzeVpvb209ZShyZXF1aXJlKFwianF1ZXJ5XCIpKTp0LkVhc3lab29tPWUodC5qUXVlcnkpfSh0aGlzLGZ1bmN0aW9uKGkpe1widXNlIHN0cmljdFwiO3ZhciBjLGQsbCxwLG8scyxoPXtsb2FkaW5nTm90aWNlOlwiTG9hZGluZyBpbWFnZVwiLGVycm9yTm90aWNlOlwiVGhlIGltYWdlIGNvdWxkIG5vdCBiZSBsb2FkZWRcIixlcnJvckR1cmF0aW9uOjI1MDAsbGlua0F0dHJpYnV0ZTpcImhyZWZcIixwcmV2ZW50Q2xpY2tzOiEwLGJlZm9yZVNob3c6aS5ub29wLGJlZm9yZUhpZGU6aS5ub29wLG9uU2hvdzppLm5vb3Asb25IaWRlOmkubm9vcCxvbk1vdmU6aS5ub29wfTtmdW5jdGlvbiBuKHQsZSl7dGhpcy4kdGFyZ2V0PWkodCksdGhpcy5vcHRzPWkuZXh0ZW5kKHt9LGgsZSx0aGlzLiR0YXJnZXQuZGF0YSgpKSx2b2lkIDA9PT10aGlzLmlzT3BlbiYmdGhpcy5faW5pdCgpfXJldHVybiBuLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbigpe3RoaXMuJGxpbms9dGhpcy4kdGFyZ2V0LmZpbmQoXCJhXCIpLHRoaXMuJGltYWdlPXRoaXMuJHRhcmdldC5maW5kKFwiaW1nXCIpLHRoaXMuJGZseW91dD1pKCc8ZGl2IGNsYXNzPVwiZWFzeXpvb20tZmx5b3V0XCIgLz4nKSx0aGlzLiRub3RpY2U9aSgnPGRpdiBjbGFzcz1cImVhc3l6b29tLW5vdGljZVwiIC8+JyksdGhpcy4kdGFyZ2V0Lm9uKHtcIm1vdXNlbW92ZS5lYXN5em9vbSB0b3VjaG1vdmUuZWFzeXpvb21cIjppLnByb3h5KHRoaXMuX29uTW92ZSx0aGlzKSxcIm1vdXNlbGVhdmUuZWFzeXpvb20gdG91Y2hlbmQuZWFzeXpvb21cIjppLnByb3h5KHRoaXMuX29uTGVhdmUsdGhpcyksXCJtb3VzZWVudGVyLmVhc3l6b29tIHRvdWNoc3RhcnQuZWFzeXpvb21cIjppLnByb3h5KHRoaXMuX29uRW50ZXIsdGhpcyl9KSx0aGlzLm9wdHMucHJldmVudENsaWNrcyYmdGhpcy4kdGFyZ2V0Lm9uKFwiY2xpY2suZWFzeXpvb21cIixmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCl9KX0sbi5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbih0LGUpe3ZhciBvPXRoaXM7aWYoITEhPT10aGlzLm9wdHMuYmVmb3JlU2hvdy5jYWxsKHRoaXMpKXtpZighdGhpcy5pc1JlYWR5KXJldHVybiB0aGlzLl9sb2FkSW1hZ2UodGhpcy4kbGluay5hdHRyKHRoaXMub3B0cy5saW5rQXR0cmlidXRlKSxmdW5jdGlvbigpeyFvLmlzTW91c2VPdmVyJiZlfHxvLnNob3codCl9KTt0aGlzLiR0YXJnZXQuYXBwZW5kKHRoaXMuJGZseW91dCk7dmFyIGk9dGhpcy4kdGFyZ2V0Lm91dGVyV2lkdGgoKSxzPXRoaXMuJHRhcmdldC5vdXRlckhlaWdodCgpLGg9dGhpcy4kZmx5b3V0LndpZHRoKCksbj10aGlzLiRmbHlvdXQuaGVpZ2h0KCksYT10aGlzLiR6b29tLndpZHRoKCkscj10aGlzLiR6b29tLmhlaWdodCgpO2M9TWF0aC5jZWlsKGEtaCksZD1NYXRoLmNlaWwoci1uKSxsPShjPWM8MD8wOmMpL2kscD0oZD1kPDA/MDpkKS9zLHRoaXMuaXNPcGVuPSEwLHRoaXMub3B0cy5vblNob3cuY2FsbCh0aGlzKSx0JiZ0aGlzLl9tb3ZlKHQpfX0sbi5wcm90b3R5cGUuX29uRW50ZXI9ZnVuY3Rpb24odCl7dmFyIGU9dC5vcmlnaW5hbEV2ZW50LnRvdWNoZXM7dGhpcy5pc01vdXNlT3Zlcj0hMCxlJiYxIT1lLmxlbmd0aHx8KHQucHJldmVudERlZmF1bHQoKSx0aGlzLnNob3codCwhMCkpfSxuLnByb3RvdHlwZS5fb25Nb3ZlPWZ1bmN0aW9uKHQpe3RoaXMuaXNPcGVuJiYodC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX21vdmUodCkpfSxuLnByb3RvdHlwZS5fb25MZWF2ZT1mdW5jdGlvbigpe3RoaXMuaXNNb3VzZU92ZXI9ITEsdGhpcy5pc09wZW4mJnRoaXMuaGlkZSgpfSxuLnByb3RvdHlwZS5fb25Mb2FkPWZ1bmN0aW9uKHQpe3QuY3VycmVudFRhcmdldC53aWR0aCYmKHRoaXMuaXNSZWFkeT0hMCx0aGlzLiRub3RpY2UuZGV0YWNoKCksdGhpcy4kZmx5b3V0Lmh0bWwodGhpcy4kem9vbSksdGhpcy4kdGFyZ2V0LnJlbW92ZUNsYXNzKFwiaXMtbG9hZGluZ1wiKS5hZGRDbGFzcyhcImlzLXJlYWR5XCIpLHQuZGF0YS5jYWxsJiZ0LmRhdGEoKSl9LG4ucHJvdG90eXBlLl9vbkVycm9yPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLiRub3RpY2UudGV4dCh0aGlzLm9wdHMuZXJyb3JOb3RpY2UpLHRoaXMuJHRhcmdldC5yZW1vdmVDbGFzcyhcImlzLWxvYWRpbmdcIikuYWRkQ2xhc3MoXCJpcy1lcnJvclwiKSx0aGlzLmRldGFjaE5vdGljZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC4kbm90aWNlLmRldGFjaCgpLHQuZGV0YWNoTm90aWNlPW51bGx9LHRoaXMub3B0cy5lcnJvckR1cmF0aW9uKX0sbi5wcm90b3R5cGUuX2xvYWRJbWFnZT1mdW5jdGlvbih0LGUpe3ZhciBvPW5ldyBJbWFnZTt0aGlzLiR0YXJnZXQuYWRkQ2xhc3MoXCJpcy1sb2FkaW5nXCIpLmFwcGVuZCh0aGlzLiRub3RpY2UudGV4dCh0aGlzLm9wdHMubG9hZGluZ05vdGljZSkpLHRoaXMuJHpvb209aShvKS5vbihcImVycm9yXCIsaS5wcm94eSh0aGlzLl9vbkVycm9yLHRoaXMpKS5vbihcImxvYWRcIixlLGkucHJveHkodGhpcy5fb25Mb2FkLHRoaXMpKSxvLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIixvLnNyYz10fSxuLnByb3RvdHlwZS5fbW92ZT1mdW5jdGlvbih0KXtzPTA9PT10LnR5cGUuaW5kZXhPZihcInRvdWNoXCIpPyhlPXQudG91Y2hlc3x8dC5vcmlnaW5hbEV2ZW50LnRvdWNoZXMsbz1lWzBdLnBhZ2VYLGVbMF0ucGFnZVkpOihvPXQucGFnZVh8fG8sdC5wYWdlWXx8cyk7dmFyIGU9dGhpcy4kdGFyZ2V0Lm9mZnNldCgpLHQ9by1lLmxlZnQsZT1zLWUudG9wLHQ9TWF0aC5jZWlsKHQqbCksZT1NYXRoLmNlaWwoZSpwKTt0PDB8fGU8MHx8Yzx0fHxkPGU/dGhpcy5oaWRlKCk6KGU9LTEqZSx0PS0xKnQsXCJ0cmFuc2Zvcm1cImluIGRvY3VtZW50LmJvZHkuc3R5bGU/dGhpcy4kem9vbS5jc3Moe3RyYW5zZm9ybTpcInRyYW5zbGF0ZShcIit0K1wicHgsIFwiK2UrXCJweClcIn0pOnRoaXMuJHpvb20uY3NzKHt0b3A6ZSxsZWZ0OnR9KSx0aGlzLm9wdHMub25Nb3ZlLmNhbGwodGhpcyxlLHQpKX0sbi5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3RoaXMuaXNPcGVuJiYhMSE9PXRoaXMub3B0cy5iZWZvcmVIaWRlLmNhbGwodGhpcykmJih0aGlzLiRmbHlvdXQuZGV0YWNoKCksdGhpcy5pc09wZW49ITEsdGhpcy5vcHRzLm9uSGlkZS5jYWxsKHRoaXMpKX0sbi5wcm90b3R5cGUuc3dhcD1mdW5jdGlvbih0LGUsbyl7dGhpcy5oaWRlKCksdGhpcy5pc1JlYWR5PSExLHRoaXMuZGV0YWNoTm90aWNlJiZjbGVhclRpbWVvdXQodGhpcy5kZXRhY2hOb3RpY2UpLHRoaXMuJG5vdGljZS5wYXJlbnQoKS5sZW5ndGgmJnRoaXMuJG5vdGljZS5kZXRhY2goKSx0aGlzLiR0YXJnZXQucmVtb3ZlQ2xhc3MoXCJpcy1sb2FkaW5nIGlzLXJlYWR5IGlzLWVycm9yXCIpLHRoaXMuJGltYWdlLmF0dHIoe3NyYzp0LHNyY3NldDppLmlzQXJyYXkobyk/by5qb2luKCk6b30pLHRoaXMuJGxpbmsuYXR0cih0aGlzLm9wdHMubGlua0F0dHJpYnV0ZSxlKX0sbi5wcm90b3R5cGUudGVhcmRvd249ZnVuY3Rpb24oKXt0aGlzLmhpZGUoKSx0aGlzLiR0YXJnZXQub2ZmKFwiLmVhc3l6b29tXCIpLnJlbW92ZUNsYXNzKFwiaXMtbG9hZGluZyBpcy1yZWFkeSBpcy1lcnJvclwiKSx0aGlzLmRldGFjaE5vdGljZSYmY2xlYXJUaW1lb3V0KHRoaXMuZGV0YWNoTm90aWNlKSxkZWxldGUgdGhpcy4kbGluayxkZWxldGUgdGhpcy4kem9vbSxkZWxldGUgdGhpcy4kaW1hZ2UsZGVsZXRlIHRoaXMuJG5vdGljZSxkZWxldGUgdGhpcy4kZmx5b3V0LGRlbGV0ZSB0aGlzLmlzT3BlbixkZWxldGUgdGhpcy5pc1JlYWR5fSxpLmZuLmVhc3lab29tPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1pLmRhdGEodGhpcyxcImVhc3lab29tXCIpO3Q/dm9pZCAwPT09dC5pc09wZW4mJnQuX2luaXQoKTppLmRhdGEodGhpcyxcImVhc3lab29tXCIsbmV3IG4odGhpcyxlKSl9KX0sbn0pOyIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgfHwgZmFsc2U7XG5pZiAoJGRlZmluZVByb3BlcnR5KSB7XG5cdHRyeSB7XG5cdFx0JGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsgdmFsdWU6IDEgfSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJRSA4IGhhcyBhIGJyb2tlbiBkZWZpbmVQcm9wZXJ0eVxuXHRcdCRkZWZpbmVQcm9wZXJ0eSA9IGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gJGRlZmluZVByb3BlcnR5O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9ldmFsJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IEV2YWxFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3JhbmdlJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFJhbmdlRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3JlZicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBSZWZlcmVuY2VFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vc3ludGF4Jyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRheEVycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi90eXBlJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFR5cGVFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vdXJpJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IFVSSUVycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Q7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG4gICwgcHJlZml4ID0gJ34nO1xuXG4vKipcbiAqIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIHN0b3JhZ2UgZm9yIG91ciBgRUVgIG9iamVjdHMuXG4gKiBBbiBgRXZlbnRzYCBpbnN0YW5jZSBpcyBhIHBsYWluIG9iamVjdCB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBldmVudCBuYW1lcy5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEV2ZW50cygpIHt9XG5cbi8vXG4vLyBXZSB0cnkgdG8gbm90IGluaGVyaXQgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAuIEluIHNvbWUgZW5naW5lcyBjcmVhdGluZyBhblxuLy8gaW5zdGFuY2UgaW4gdGhpcyB3YXkgaXMgZmFzdGVyIHRoYW4gY2FsbGluZyBgT2JqZWN0LmNyZWF0ZShudWxsKWAgZGlyZWN0bHkuXG4vLyBJZiBgT2JqZWN0LmNyZWF0ZShudWxsKWAgaXMgbm90IHN1cHBvcnRlZCB3ZSBwcmVmaXggdGhlIGV2ZW50IG5hbWVzIHdpdGggYVxuLy8gY2hhcmFjdGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsdC1pbiBvYmplY3QgcHJvcGVydGllcyBhcmUgbm90XG4vLyBvdmVycmlkZGVuIG9yIHVzZWQgYXMgYW4gYXR0YWNrIHZlY3Rvci5cbi8vXG5pZiAoT2JqZWN0LmNyZWF0ZSkge1xuICBFdmVudHMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAvL1xuICAvLyBUaGlzIGhhY2sgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIGBfX3Byb3RvX19gIHByb3BlcnR5IGlzIHN0aWxsIGluaGVyaXRlZCBpblxuICAvLyBzb21lIG9sZCBicm93c2VycyBsaWtlIEFuZHJvaWQgNCwgaVBob25lIDUuMSwgT3BlcmEgMTEgYW5kIFNhZmFyaSA1LlxuICAvL1xuICBpZiAoIW5ldyBFdmVudHMoKS5fX3Byb3RvX18pIHByZWZpeCA9IGZhbHNlO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGV2ZW50IGxpc3RlbmVyLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvbmNlPWZhbHNlXSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBFRShmbiwgY29udGV4dCwgb25jZSkge1xuICB0aGlzLmZuID0gZm47XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMub25jZSA9IG9uY2UgfHwgZmFsc2U7XG59XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IGVtaXR0ZXIgUmVmZXJlbmNlIHRvIHRoZSBgRXZlbnRFbWl0dGVyYCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9uY2UgU3BlY2lmeSBpZiB0aGUgbGlzdGVuZXIgaXMgYSBvbmUtdGltZSBsaXN0ZW5lci5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhZGRMaXN0ZW5lcihlbWl0dGVyLCBldmVudCwgZm4sIGNvbnRleHQsIG9uY2UpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lciA9IG5ldyBFRShmbiwgY29udGV4dCB8fCBlbWl0dGVyLCBvbmNlKVxuICAgICwgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIWVtaXR0ZXIuX2V2ZW50c1tldnRdKSBlbWl0dGVyLl9ldmVudHNbZXZ0XSA9IGxpc3RlbmVyLCBlbWl0dGVyLl9ldmVudHNDb3VudCsrO1xuICBlbHNlIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0uZm4pIGVtaXR0ZXIuX2V2ZW50c1tldnRdLnB1c2gobGlzdGVuZXIpO1xuICBlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gW2VtaXR0ZXIuX2V2ZW50c1tldnRdLCBsaXN0ZW5lcl07XG5cbiAgcmV0dXJuIGVtaXR0ZXI7XG59XG5cbi8qKlxuICogQ2xlYXIgZXZlbnQgYnkgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2dCBUaGUgRXZlbnQgbmFtZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNsZWFyRXZlbnQoZW1pdHRlciwgZXZ0KSB7XG4gIGlmICgtLWVtaXR0ZXIuX2V2ZW50c0NvdW50ID09PSAwKSBlbWl0dGVyLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gIGVsc2UgZGVsZXRlIGVtaXR0ZXIuX2V2ZW50c1tldnRdO1xufVxuXG4vKipcbiAqIE1pbmltYWwgYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlIHRoYXQgaXMgbW9sZGVkIGFnYWluc3QgdGhlIE5vZGUuanNcbiAqIGBFdmVudEVtaXR0ZXJgIGludGVyZmFjZS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYW4gYXJyYXkgbGlzdGluZyB0aGUgZXZlbnRzIGZvciB3aGljaCB0aGUgZW1pdHRlciBoYXMgcmVnaXN0ZXJlZFxuICogbGlzdGVuZXJzLlxuICpcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgdmFyIG5hbWVzID0gW11cbiAgICAsIGV2ZW50c1xuICAgICwgbmFtZTtcblxuICBpZiAodGhpcy5fZXZlbnRzQ291bnQgPT09IDApIHJldHVybiBuYW1lcztcblxuICBmb3IgKG5hbWUgaW4gKGV2ZW50cyA9IHRoaXMuX2V2ZW50cykpIHtcbiAgICBpZiAoaGFzLmNhbGwoZXZlbnRzLCBuYW1lKSkgbmFtZXMucHVzaChwcmVmaXggPyBuYW1lLnNsaWNlKDEpIDogbmFtZSk7XG4gIH1cblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHJldHVybiBuYW1lcy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhldmVudHMpKTtcbiAgfVxuXG4gIHJldHVybiBuYW1lcztcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnMoZXZlbnQpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnRcbiAgICAsIGhhbmRsZXJzID0gdGhpcy5fZXZlbnRzW2V2dF07XG5cbiAgaWYgKCFoYW5kbGVycykgcmV0dXJuIFtdO1xuICBpZiAoaGFuZGxlcnMuZm4pIHJldHVybiBbaGFuZGxlcnMuZm5dO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoLCBlZSA9IG5ldyBBcnJheShsKTsgaSA8IGw7IGkrKykge1xuICAgIGVlW2ldID0gaGFuZGxlcnNbaV0uZm47XG4gIH1cblxuICByZXR1cm4gZWU7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyBsaXN0ZW5pbmcgdG8gYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgbnVtYmVyIG9mIGxpc3RlbmVycy5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gbGlzdGVuZXJDb3VudChldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2dF07XG5cbiAgaWYgKCFsaXN0ZW5lcnMpIHJldHVybiAwO1xuICBpZiAobGlzdGVuZXJzLmZuKSByZXR1cm4gMTtcbiAgcmV0dXJuIGxpc3RlbmVycy5sZW5ndGg7XG59O1xuXG4vKipcbiAqIENhbGxzIGVhY2ggb2YgdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIGV2ZW50IGhhZCBsaXN0ZW5lcnMsIGVsc2UgYGZhbHNlYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdChldmVudCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW2V2dF0pIHJldHVybiBmYWxzZTtcblxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2dF1cbiAgICAsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAsIGFyZ3NcbiAgICAsIGk7XG5cbiAgaWYgKGxpc3RlbmVycy5mbikge1xuICAgIGlmIChsaXN0ZW5lcnMub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgc3dpdGNoIChsZW4pIHtcbiAgICAgIGNhc2UgMTogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgMjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSksIHRydWU7XG4gICAgICBjYXNlIDM6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyKSwgdHJ1ZTtcbiAgICAgIGNhc2UgNDogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzKSwgdHJ1ZTtcbiAgICAgIGNhc2UgNTogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCksIHRydWU7XG4gICAgICBjYXNlIDY6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyLCBhMywgYTQsIGE1KSwgdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGkgPCBsZW47IGkrKykge1xuICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuXG4gICAgbGlzdGVuZXJzLmZuLmFwcGx5KGxpc3RlbmVycy5jb250ZXh0LCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGVuZ3RoID0gbGlzdGVuZXJzLmxlbmd0aFxuICAgICAgLCBqO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobGlzdGVuZXJzW2ldLm9uY2UpIHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyc1tpXS5mbiwgdW5kZWZpbmVkLCB0cnVlKTtcblxuICAgICAgc3dpdGNoIChsZW4pIHtcbiAgICAgICAgY2FzZSAxOiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCk7IGJyZWFrO1xuICAgICAgICBjYXNlIDI6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSk7IGJyZWFrO1xuICAgICAgICBjYXNlIDM6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIpOyBicmVhaztcbiAgICAgICAgY2FzZSA0OiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCwgYTEsIGEyLCBhMyk7IGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmICghYXJncykgZm9yIChqID0gMSwgYXJncyA9IG5ldyBBcnJheShsZW4gLTEpOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaiAtIDFdID0gYXJndW1lbnRzW2pdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxpc3RlbmVyc1tpXS5mbi5hcHBseShsaXN0ZW5lcnNbaV0uY29udGV4dCwgYXJncyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEFkZCBhIGxpc3RlbmVyIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW2NvbnRleHQ9dGhpc10gVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gb24oZXZlbnQsIGZuLCBjb250ZXh0KSB7XG4gIHJldHVybiBhZGRMaXN0ZW5lcih0aGlzLCBldmVudCwgZm4sIGNvbnRleHQsIGZhbHNlKTtcbn07XG5cbi8qKlxuICogQWRkIGEgb25lLXRpbWUgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UoZXZlbnQsIGZuLCBjb250ZXh0KSB7XG4gIHJldHVybiBhZGRMaXN0ZW5lcih0aGlzLCBldmVudCwgZm4sIGNvbnRleHQsIHRydWUpO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgdGhlIGxpc3RlbmVycyBvZiBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIE9ubHkgcmVtb3ZlIHRoZSBsaXN0ZW5lcnMgdGhhdCBtYXRjaCB0aGlzIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IE9ubHkgcmVtb3ZlIHRoZSBsaXN0ZW5lcnMgdGhhdCBoYXZlIHRoaXMgY29udGV4dC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBPbmx5IHJlbW92ZSBvbmUtdGltZSBsaXN0ZW5lcnMuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihldmVudCwgZm4sIGNvbnRleHQsIG9uY2UpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIHRoaXM7XG4gIGlmICghZm4pIHtcbiAgICBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2dF07XG5cbiAgaWYgKGxpc3RlbmVycy5mbikge1xuICAgIGlmIChcbiAgICAgIGxpc3RlbmVycy5mbiA9PT0gZm4gJiZcbiAgICAgICghb25jZSB8fCBsaXN0ZW5lcnMub25jZSkgJiZcbiAgICAgICghY29udGV4dCB8fCBsaXN0ZW5lcnMuY29udGV4dCA9PT0gY29udGV4dClcbiAgICApIHtcbiAgICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGV2ZW50cyA9IFtdLCBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChcbiAgICAgICAgbGlzdGVuZXJzW2ldLmZuICE9PSBmbiB8fFxuICAgICAgICAob25jZSAmJiAhbGlzdGVuZXJzW2ldLm9uY2UpIHx8XG4gICAgICAgIChjb250ZXh0ICYmIGxpc3RlbmVyc1tpXS5jb250ZXh0ICE9PSBjb250ZXh0KVxuICAgICAgKSB7XG4gICAgICAgIGV2ZW50cy5wdXNoKGxpc3RlbmVyc1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBSZXNldCB0aGUgYXJyYXksIG9yIHJlbW92ZSBpdCBjb21wbGV0ZWx5IGlmIHdlIGhhdmUgbm8gbW9yZSBsaXN0ZW5lcnMuXG4gICAgLy9cbiAgICBpZiAoZXZlbnRzLmxlbmd0aCkgdGhpcy5fZXZlbnRzW2V2dF0gPSBldmVudHMubGVuZ3RoID09PSAxID8gZXZlbnRzWzBdIDogZXZlbnRzO1xuICAgIGVsc2UgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhbGwgbGlzdGVuZXJzLCBvciB0aG9zZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBbZXZlbnRdIFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0O1xuXG4gIGlmIChldmVudCkge1xuICAgIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG4gICAgaWYgKHRoaXMuX2V2ZW50c1tldnRdKSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50cygpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy9cbi8vIEFsaWFzIG1ldGhvZHMgbmFtZXMgYmVjYXVzZSBwZW9wbGUgcm9sbCBsaWtlIHRoYXQuXG4vL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUub247XG5cbi8vXG4vLyBFeHBvc2UgdGhlIHByZWZpeC5cbi8vXG5FdmVudEVtaXR0ZXIucHJlZml4ZWQgPSBwcmVmaXg7XG5cbi8vXG4vLyBBbGxvdyBgRXZlbnRFbWl0dGVyYCB0byBiZSBpbXBvcnRlZCBhcyBtb2R1bGUgbmFtZXNwYWNlLlxuLy9cbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbi8vXG4vLyBFeHBvc2UgdGhlIG1vZHVsZS5cbi8vXG5pZiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBtb2R1bGUpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG59XG4iLCIvKiFcbiogZm9jdXMtdHJhcCA2LjkuNFxuKiBAbGljZW5zZSBNSVQsIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2N1cy10cmFwL2ZvY3VzLXRyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRVxuKi9cbmltcG9ydCB7IHRhYmJhYmxlLCBmb2N1c2FibGUsIGlzVGFiYmFibGUsIGlzRm9jdXNhYmxlIH0gZnJvbSAndGFiYmFibGUnO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMih0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTtcbiAgICBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG52YXIgYWN0aXZlRm9jdXNUcmFwcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRyYXBRdWV1ZSA9IFtdO1xuICByZXR1cm4ge1xuICAgIGFjdGl2YXRlVHJhcDogZnVuY3Rpb24gYWN0aXZhdGVUcmFwKHRyYXApIHtcbiAgICAgIGlmICh0cmFwUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgYWN0aXZlVHJhcCA9IHRyYXBRdWV1ZVt0cmFwUXVldWUubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgaWYgKGFjdGl2ZVRyYXAgIT09IHRyYXApIHtcbiAgICAgICAgICBhY3RpdmVUcmFwLnBhdXNlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHRyYXBJbmRleCA9IHRyYXBRdWV1ZS5pbmRleE9mKHRyYXApO1xuXG4gICAgICBpZiAodHJhcEluZGV4ID09PSAtMSkge1xuICAgICAgICB0cmFwUXVldWUucHVzaCh0cmFwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG1vdmUgdGhpcyBleGlzdGluZyB0cmFwIHRvIHRoZSBmcm9udCBvZiB0aGUgcXVldWVcbiAgICAgICAgdHJhcFF1ZXVlLnNwbGljZSh0cmFwSW5kZXgsIDEpO1xuICAgICAgICB0cmFwUXVldWUucHVzaCh0cmFwKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRlYWN0aXZhdGVUcmFwOiBmdW5jdGlvbiBkZWFjdGl2YXRlVHJhcCh0cmFwKSB7XG4gICAgICB2YXIgdHJhcEluZGV4ID0gdHJhcFF1ZXVlLmluZGV4T2YodHJhcCk7XG5cbiAgICAgIGlmICh0cmFwSW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRyYXBRdWV1ZS5zcGxpY2UodHJhcEluZGV4LCAxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRyYXBRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRyYXBRdWV1ZVt0cmFwUXVldWUubGVuZ3RoIC0gMV0udW5wYXVzZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn0oKTtcblxudmFyIGlzU2VsZWN0YWJsZUlucHV0ID0gZnVuY3Rpb24gaXNTZWxlY3RhYmxlSW5wdXQobm9kZSkge1xuICByZXR1cm4gbm9kZS50YWdOYW1lICYmIG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmIHR5cGVvZiBub2RlLnNlbGVjdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cbnZhciBpc0VzY2FwZUV2ZW50ID0gZnVuY3Rpb24gaXNFc2NhcGVFdmVudChlKSB7XG4gIHJldHVybiBlLmtleSA9PT0gJ0VzY2FwZScgfHwgZS5rZXkgPT09ICdFc2MnIHx8IGUua2V5Q29kZSA9PT0gMjc7XG59O1xuXG52YXIgaXNUYWJFdmVudCA9IGZ1bmN0aW9uIGlzVGFiRXZlbnQoZSkge1xuICByZXR1cm4gZS5rZXkgPT09ICdUYWInIHx8IGUua2V5Q29kZSA9PT0gOTtcbn07XG5cbnZhciBkZWxheSA9IGZ1bmN0aW9uIGRlbGF5KGZuKSB7XG4gIHJldHVybiBzZXRUaW1lb3V0KGZuLCAwKTtcbn07IC8vIEFycmF5LmZpbmQvZmluZEluZGV4KCkgYXJlIG5vdCBzdXBwb3J0ZWQgb24gSUU7IHRoaXMgcmVwbGljYXRlcyBlbm91Z2hcbi8vICBvZiBBcnJheS5maW5kSW5kZXgoKSBmb3Igb3VyIG5lZWRzXG5cblxudmFyIGZpbmRJbmRleCA9IGZ1bmN0aW9uIGZpbmRJbmRleChhcnIsIGZuKSB7XG4gIHZhciBpZHggPSAtMTtcbiAgYXJyLmV2ZXJ5KGZ1bmN0aW9uICh2YWx1ZSwgaSkge1xuICAgIGlmIChmbih2YWx1ZSkpIHtcbiAgICAgIGlkeCA9IGk7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIGJyZWFrXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7IC8vIG5leHRcbiAgfSk7XG4gIHJldHVybiBpZHg7XG59O1xuLyoqXG4gKiBHZXQgYW4gb3B0aW9uJ3MgdmFsdWUgd2hlbiBpdCBjb3VsZCBiZSBhIHBsYWluIHZhbHVlLCBvciBhIGhhbmRsZXIgdGhhdCBwcm92aWRlc1xuICogIHRoZSB2YWx1ZS5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgT3B0aW9uJ3MgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0gey4uLip9IFtwYXJhbXNdIEFueSBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXIsIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHsqfSBUaGUgYHZhbHVlYCwgb3IgdGhlIGhhbmRsZXIncyByZXR1cm5lZCB2YWx1ZS5cbiAqL1xuXG5cbnZhciB2YWx1ZU9ySGFuZGxlciA9IGZ1bmN0aW9uIHZhbHVlT3JIYW5kbGVyKHZhbHVlKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBwYXJhbXMgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHBhcmFtc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nID8gdmFsdWUuYXBwbHkodm9pZCAwLCBwYXJhbXMpIDogdmFsdWU7XG59O1xuXG52YXIgZ2V0QWN0dWFsVGFyZ2V0ID0gZnVuY3Rpb24gZ2V0QWN0dWFsVGFyZ2V0KGV2ZW50KSB7XG4gIC8vIE5PVEU6IElmIHRoZSB0cmFwIGlzIF9pbnNpZGVfIGEgc2hhZG93IERPTSwgZXZlbnQudGFyZ2V0IHdpbGwgYWx3YXlzIGJlIHRoZVxuICAvLyAgc2hhZG93IGhvc3QuIEhvd2V2ZXIsIGV2ZW50LnRhcmdldC5jb21wb3NlZFBhdGgoKSB3aWxsIGJlIGFuIGFycmF5IG9mXG4gIC8vICBub2RlcyBcImNsaWNrZWRcIiBmcm9tIGlubmVyLW1vc3QgKHRoZSBhY3R1YWwgZWxlbWVudCBpbnNpZGUgdGhlIHNoYWRvdykgdG9cbiAgLy8gIG91dGVyLW1vc3QgKHRoZSBob3N0IEhUTUwgZG9jdW1lbnQpLiBJZiB3ZSBoYXZlIGFjY2VzcyB0byBjb21wb3NlZFBhdGgoKSxcbiAgLy8gIHRoZW4gdXNlIGl0cyBmaXJzdCBlbGVtZW50OyBvdGhlcndpc2UsIGZhbGwgYmFjayB0byBldmVudC50YXJnZXQgKGFuZFxuICAvLyAgdGhpcyBvbmx5IHdvcmtzIGZvciBhbiBfb3Blbl8gc2hhZG93IERPTTsgb3RoZXJ3aXNlLFxuICAvLyAgY29tcG9zZWRQYXRoKClbMF0gPT09IGV2ZW50LnRhcmdldCBhbHdheXMpLlxuICByZXR1cm4gZXZlbnQudGFyZ2V0LnNoYWRvd1Jvb3QgJiYgdHlwZW9mIGV2ZW50LmNvbXBvc2VkUGF0aCA9PT0gJ2Z1bmN0aW9uJyA/IGV2ZW50LmNvbXBvc2VkUGF0aCgpWzBdIDogZXZlbnQudGFyZ2V0O1xufTtcblxudmFyIGNyZWF0ZUZvY3VzVHJhcCA9IGZ1bmN0aW9uIGNyZWF0ZUZvY3VzVHJhcChlbGVtZW50cywgdXNlck9wdGlvbnMpIHtcbiAgLy8gU1NSOiBhIGxpdmUgdHJhcCBzaG91bGRuJ3QgYmUgY3JlYXRlZCBpbiB0aGlzIHR5cGUgb2YgZW52aXJvbm1lbnQgc28gdGhpc1xuICAvLyAgc2hvdWxkIGJlIHNhZmUgY29kZSB0byBleGVjdXRlIGlmIHRoZSBgZG9jdW1lbnRgIG9wdGlvbiBpc24ndCBzcGVjaWZpZWRcbiAgdmFyIGRvYyA9ICh1c2VyT3B0aW9ucyA9PT0gbnVsbCB8fCB1c2VyT3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogdXNlck9wdGlvbnMuZG9jdW1lbnQpIHx8IGRvY3VtZW50O1xuXG4gIHZhciBjb25maWcgPSBfb2JqZWN0U3ByZWFkMih7XG4gICAgcmV0dXJuRm9jdXNPbkRlYWN0aXZhdGU6IHRydWUsXG4gICAgZXNjYXBlRGVhY3RpdmF0ZXM6IHRydWUsXG4gICAgZGVsYXlJbml0aWFsRm9jdXM6IHRydWVcbiAgfSwgdXNlck9wdGlvbnMpO1xuXG4gIHZhciBzdGF0ZSA9IHtcbiAgICAvLyBjb250YWluZXJzIGdpdmVuIHRvIGNyZWF0ZUZvY3VzVHJhcCgpXG4gICAgLy8gQHR5cGUge0FycmF5PEhUTUxFbGVtZW50Pn1cbiAgICBjb250YWluZXJzOiBbXSxcbiAgICAvLyBsaXN0IG9mIG9iamVjdHMgaWRlbnRpZnlpbmcgdGFiYmFibGUgbm9kZXMgaW4gYGNvbnRhaW5lcnNgIGluIHRoZSB0cmFwXG4gICAgLy8gTk9URTogaXQncyBwb3NzaWJsZSB0aGF0IGEgZ3JvdXAgaGFzIG5vIHRhYmJhYmxlIG5vZGVzIGlmIG5vZGVzIGdldCByZW1vdmVkIHdoaWxlIHRoZSB0cmFwXG4gICAgLy8gIGlzIGFjdGl2ZSwgYnV0IHRoZSB0cmFwIHNob3VsZCBuZXZlciBnZXQgdG8gYSBzdGF0ZSB3aGVyZSB0aGVyZSBpc24ndCBhdCBsZWFzdCBvbmUgZ3JvdXBcbiAgICAvLyAgd2l0aCBhdCBsZWFzdCBvbmUgdGFiYmFibGUgbm9kZSBpbiBpdCAodGhhdCB3b3VsZCBsZWFkIHRvIGFuIGVycm9yIGNvbmRpdGlvbiB0aGF0IHdvdWxkXG4gICAgLy8gIHJlc3VsdCBpbiBhbiBlcnJvciBiZWluZyB0aHJvd24pXG4gICAgLy8gQHR5cGUge0FycmF5PHtcbiAgICAvLyAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgLy8gICB0YWJiYWJsZU5vZGVzOiBBcnJheTxIVE1MRWxlbWVudD4sIC8vIGVtcHR5IGlmIG5vbmVcbiAgICAvLyAgIGZvY3VzYWJsZU5vZGVzOiBBcnJheTxIVE1MRWxlbWVudD4sIC8vIGVtcHR5IGlmIG5vbmVcbiAgICAvLyAgIGZpcnN0VGFiYmFibGVOb2RlOiBIVE1MRWxlbWVudHxudWxsLFxuICAgIC8vICAgbGFzdFRhYmJhYmxlTm9kZTogSFRNTEVsZW1lbnR8bnVsbCxcbiAgICAvLyAgIG5leHRUYWJiYWJsZU5vZGU6IChub2RlOiBIVE1MRWxlbWVudCwgZm9yd2FyZDogYm9vbGVhbikgPT4gSFRNTEVsZW1lbnR8dW5kZWZpbmVkXG4gICAgLy8gfT59XG4gICAgY29udGFpbmVyR3JvdXBzOiBbXSxcbiAgICAvLyBzYW1lIG9yZGVyL2xlbmd0aCBhcyBgY29udGFpbmVyc2AgbGlzdFxuICAgIC8vIHJlZmVyZW5jZXMgdG8gb2JqZWN0cyBpbiBgY29udGFpbmVyR3JvdXBzYCwgYnV0IG9ubHkgdGhvc2UgdGhhdCBhY3R1YWxseSBoYXZlXG4gICAgLy8gIHRhYmJhYmxlIG5vZGVzIGluIHRoZW1cbiAgICAvLyBOT1RFOiBzYW1lIG9yZGVyIGFzIGBjb250YWluZXJzYCBhbmQgYGNvbnRhaW5lckdyb3Vwc2AsIGJ1dCBfX25vdCBuZWNlc3NhcmlseV9fXG4gICAgLy8gIHRoZSBzYW1lIGxlbmd0aFxuICAgIHRhYmJhYmxlR3JvdXBzOiBbXSxcbiAgICBub2RlRm9jdXNlZEJlZm9yZUFjdGl2YXRpb246IG51bGwsXG4gICAgbW9zdFJlY2VudGx5Rm9jdXNlZE5vZGU6IG51bGwsXG4gICAgYWN0aXZlOiBmYWxzZSxcbiAgICBwYXVzZWQ6IGZhbHNlLFxuICAgIC8vIHRpbWVyIElEIGZvciB3aGVuIGRlbGF5SW5pdGlhbEZvY3VzIGlzIHRydWUgYW5kIGluaXRpYWwgZm9jdXMgaW4gdGhpcyB0cmFwXG4gICAgLy8gIGhhcyBiZWVuIGRlbGF5ZWQgZHVyaW5nIGFjdGl2YXRpb25cbiAgICBkZWxheUluaXRpYWxGb2N1c1RpbWVyOiB1bmRlZmluZWRcbiAgfTtcbiAgdmFyIHRyYXA7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLWNvbnN0IC0tIHNvbWUgcHJpdmF0ZSBmdW5jdGlvbnMgcmVmZXJlbmNlIGl0LCBhbmQgaXRzIG1ldGhvZHMgcmVmZXJlbmNlIHByaXZhdGUgZnVuY3Rpb25zLCBzbyB3ZSBtdXN0IGRlY2xhcmUgaGVyZSBhbmQgZGVmaW5lIGxhdGVyXG5cbiAgLyoqXG4gICAqIEdldHMgYSBjb25maWd1cmF0aW9uIG9wdGlvbiB2YWx1ZS5cbiAgICogQHBhcmFtIHtPYmplY3R8dW5kZWZpbmVkfSBjb25maWdPdmVycmlkZU9wdGlvbnMgSWYgdHJ1ZSwgYW5kIG9wdGlvbiBpcyBkZWZpbmVkIGluIHRoaXMgc2V0LFxuICAgKiAgdmFsdWUgd2lsbCBiZSB0YWtlbiBmcm9tIHRoaXMgb2JqZWN0LiBPdGhlcndpc2UsIHZhbHVlIHdpbGwgYmUgdGFrZW4gZnJvbSBiYXNlIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25OYW1lIE5hbWUgb2YgdGhlIG9wdGlvbiB3aG9zZSB2YWx1ZSBpcyBzb3VnaHQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gW2NvbmZpZ09wdGlvbk5hbWVdIE5hbWUgb2Ygb3B0aW9uIHRvIHVzZSBfX2luc3RlYWQgb2ZfXyBgb3B0aW9uTmFtZWBcbiAgICogIElJRiBgY29uZmlnT3ZlcnJpZGVPcHRpb25zYCBpcyBub3QgZGVmaW5lZC4gT3RoZXJ3aXNlLCBgb3B0aW9uTmFtZWAgaXMgdXNlZC5cbiAgICovXG5cbiAgdmFyIGdldE9wdGlvbiA9IGZ1bmN0aW9uIGdldE9wdGlvbihjb25maWdPdmVycmlkZU9wdGlvbnMsIG9wdGlvbk5hbWUsIGNvbmZpZ09wdGlvbk5hbWUpIHtcbiAgICByZXR1cm4gY29uZmlnT3ZlcnJpZGVPcHRpb25zICYmIGNvbmZpZ092ZXJyaWRlT3B0aW9uc1tvcHRpb25OYW1lXSAhPT0gdW5kZWZpbmVkID8gY29uZmlnT3ZlcnJpZGVPcHRpb25zW29wdGlvbk5hbWVdIDogY29uZmlnW2NvbmZpZ09wdGlvbk5hbWUgfHwgb3B0aW9uTmFtZV07XG4gIH07XG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgaW5kZXggb2YgdGhlIGNvbnRhaW5lciB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IEluZGV4IG9mIHRoZSBjb250YWluZXIgaW4gZWl0aGVyIGBzdGF0ZS5jb250YWluZXJzYCBvclxuICAgKiAgYHN0YXRlLmNvbnRhaW5lckdyb3Vwc2AgKHRoZSBvcmRlci9sZW5ndGggb2YgdGhlc2UgbGlzdHMgYXJlIHRoZSBzYW1lKTsgLTFcbiAgICogIGlmIHRoZSBlbGVtZW50IGlzbid0IGZvdW5kLlxuICAgKi9cblxuXG4gIHZhciBmaW5kQ29udGFpbmVySW5kZXggPSBmdW5jdGlvbiBmaW5kQ29udGFpbmVySW5kZXgoZWxlbWVudCkge1xuICAgIC8vIE5PVEU6IHNlYXJjaCBgY29udGFpbmVyR3JvdXBzYCBiZWNhdXNlIGl0J3MgcG9zc2libGUgYSBncm91cCBjb250YWlucyBubyB0YWJiYWJsZVxuICAgIC8vICBub2RlcywgYnV0IHN0aWxsIGNvbnRhaW5zIGZvY3VzYWJsZSBub2RlcyAoZS5nLiBpZiB0aGV5IGFsbCBoYXZlIGB0YWJpbmRleD0tMWApXG4gICAgLy8gIGFuZCB3ZSBzdGlsbCBuZWVkIHRvIGZpbmQgdGhlIGVsZW1lbnQgaW4gdGhlcmVcbiAgICByZXR1cm4gc3RhdGUuY29udGFpbmVyR3JvdXBzLmZpbmRJbmRleChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIGNvbnRhaW5lciA9IF9yZWYuY29udGFpbmVyLFxuICAgICAgICAgIHRhYmJhYmxlTm9kZXMgPSBfcmVmLnRhYmJhYmxlTm9kZXM7XG4gICAgICByZXR1cm4gY29udGFpbmVyLmNvbnRhaW5zKGVsZW1lbnQpIHx8IC8vIGZhbGwgYmFjayB0byBleHBsaWNpdCB0YWJiYWJsZSBzZWFyY2ggd2hpY2ggd2lsbCB0YWtlIGludG8gY29uc2lkZXJhdGlvbiBhbnlcbiAgICAgIC8vICB3ZWIgY29tcG9uZW50cyBpZiB0aGUgYHRhYmJhYmxlT3B0aW9ucy5nZXRTaGFkb3dSb290YCBvcHRpb24gd2FzIHVzZWQgZm9yXG4gICAgICAvLyAgdGhlIHRyYXAsIGVuYWJsaW5nIHNoYWRvdyBET00gc3VwcG9ydCBpbiB0YWJiYWJsZSAoYE5vZGUuY29udGFpbnMoKWAgZG9lc24ndFxuICAgICAgLy8gIGxvb2sgaW5zaWRlIHdlYiBjb21wb25lbnRzIGV2ZW4gaWYgb3BlbilcbiAgICAgIHRhYmJhYmxlTm9kZXMuZmluZChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZSA9PT0gZWxlbWVudDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuICAvKipcbiAgICogR2V0cyB0aGUgbm9kZSBmb3IgdGhlIGdpdmVuIG9wdGlvbiwgd2hpY2ggaXMgZXhwZWN0ZWQgdG8gYmUgYW4gb3B0aW9uIHRoYXRcbiAgICogIGNhbiBiZSBlaXRoZXIgYSBET00gbm9kZSwgYSBzdHJpbmcgdGhhdCBpcyBhIHNlbGVjdG9yIHRvIGdldCBhIG5vZGUsIGBmYWxzZWBcbiAgICogIChpZiBhIG5vZGUgaXMgZXhwbGljaXRseSBOT1QgZ2l2ZW4pLCBvciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbnkgb2YgdGhlc2VcbiAgICogIHZhbHVlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbk5hbWVcbiAgICogQHJldHVybnMge3VuZGVmaW5lZCB8IGZhbHNlIHwgSFRNTEVsZW1lbnQgfCBTVkdFbGVtZW50fSBSZXR1cm5zXG4gICAqICBgdW5kZWZpbmVkYCBpZiB0aGUgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQ7IGBmYWxzZWAgaWYgdGhlIG9wdGlvblxuICAgKiAgcmVzb2x2ZWQgdG8gYGZhbHNlYCAobm9kZSBleHBsaWNpdGx5IG5vdCBnaXZlbik7IG90aGVyd2lzZSwgdGhlIHJlc29sdmVkXG4gICAqICBET00gbm9kZS5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBvcHRpb24gaXMgc2V0LCBub3QgYGZhbHNlYCwgYW5kIGlzIG5vdCwgb3IgZG9lcyBub3RcbiAgICogIHJlc29sdmUgdG8gYSBub2RlLlxuICAgKi9cblxuXG4gIHZhciBnZXROb2RlRm9yT3B0aW9uID0gZnVuY3Rpb24gZ2V0Tm9kZUZvck9wdGlvbihvcHRpb25OYW1lKSB7XG4gICAgdmFyIG9wdGlvblZhbHVlID0gY29uZmlnW29wdGlvbk5hbWVdO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25WYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBwYXJhbXMgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBwYXJhbXNbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIG9wdGlvblZhbHVlID0gb3B0aW9uVmFsdWUuYXBwbHkodm9pZCAwLCBwYXJhbXMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25WYWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9uVmFsdWUgPSB1bmRlZmluZWQ7IC8vIHVzZSBkZWZhdWx0IHZhbHVlXG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25WYWx1ZSkge1xuICAgICAgaWYgKG9wdGlvblZhbHVlID09PSB1bmRlZmluZWQgfHwgb3B0aW9uVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25WYWx1ZTtcbiAgICAgIH0gLy8gZWxzZSwgZW1wdHkgc3RyaW5nIChpbnZhbGlkKSwgbnVsbCAoaW52YWxpZCksIDAgKGludmFsaWQpXG5cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYFwiLmNvbmNhdChvcHRpb25OYW1lLCBcImAgd2FzIHNwZWNpZmllZCBidXQgd2FzIG5vdCBhIG5vZGUsIG9yIGRpZCBub3QgcmV0dXJuIGEgbm9kZVwiKSk7XG4gICAgfVxuXG4gICAgdmFyIG5vZGUgPSBvcHRpb25WYWx1ZTsgLy8gY291bGQgYmUgSFRNTEVsZW1lbnQsIFNWR0VsZW1lbnQsIG9yIG5vbi1lbXB0eSBzdHJpbmcgYXQgdGhpcyBwb2ludFxuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25WYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5vZGUgPSBkb2MucXVlcnlTZWxlY3RvcihvcHRpb25WYWx1ZSk7IC8vIHJlc29sdmUgdG8gbm9kZSwgb3IgbnVsbCBpZiBmYWlsc1xuXG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYFwiLmNvbmNhdChvcHRpb25OYW1lLCBcImAgYXMgc2VsZWN0b3IgcmVmZXJzIHRvIG5vIGtub3duIG5vZGVcIikpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9O1xuXG4gIHZhciBnZXRJbml0aWFsRm9jdXNOb2RlID0gZnVuY3Rpb24gZ2V0SW5pdGlhbEZvY3VzTm9kZSgpIHtcbiAgICB2YXIgbm9kZSA9IGdldE5vZGVGb3JPcHRpb24oJ2luaXRpYWxGb2N1cycpOyAvLyBmYWxzZSBleHBsaWNpdGx5IGluZGljYXRlcyB3ZSB3YW50IG5vIGluaXRpYWxGb2N1cyBhdCBhbGxcblxuICAgIGlmIChub2RlID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIG9wdGlvbiBub3Qgc3BlY2lmaWVkOiB1c2UgZmFsbGJhY2sgb3B0aW9uc1xuICAgICAgaWYgKGZpbmRDb250YWluZXJJbmRleChkb2MuYWN0aXZlRWxlbWVudCkgPj0gMCkge1xuICAgICAgICBub2RlID0gZG9jLmFjdGl2ZUVsZW1lbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZmlyc3RUYWJiYWJsZUdyb3VwID0gc3RhdGUudGFiYmFibGVHcm91cHNbMF07XG4gICAgICAgIHZhciBmaXJzdFRhYmJhYmxlTm9kZSA9IGZpcnN0VGFiYmFibGVHcm91cCAmJiBmaXJzdFRhYmJhYmxlR3JvdXAuZmlyc3RUYWJiYWJsZU5vZGU7IC8vIE5PVEU6IGBmYWxsYmFja0ZvY3VzYCBvcHRpb24gZnVuY3Rpb24gY2Fubm90IHJldHVybiBgZmFsc2VgIChub3Qgc3VwcG9ydGVkKVxuXG4gICAgICAgIG5vZGUgPSBmaXJzdFRhYmJhYmxlTm9kZSB8fCBnZXROb2RlRm9yT3B0aW9uKCdmYWxsYmFja0ZvY3VzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFub2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdXIgZm9jdXMtdHJhcCBuZWVkcyB0byBoYXZlIGF0IGxlYXN0IG9uZSBmb2N1c2FibGUgZWxlbWVudCcpO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9O1xuXG4gIHZhciB1cGRhdGVUYWJiYWJsZU5vZGVzID0gZnVuY3Rpb24gdXBkYXRlVGFiYmFibGVOb2RlcygpIHtcbiAgICBzdGF0ZS5jb250YWluZXJHcm91cHMgPSBzdGF0ZS5jb250YWluZXJzLm1hcChmdW5jdGlvbiAoY29udGFpbmVyKSB7XG4gICAgICB2YXIgdGFiYmFibGVOb2RlcyA9IHRhYmJhYmxlKGNvbnRhaW5lciwgY29uZmlnLnRhYmJhYmxlT3B0aW9ucyk7IC8vIE5PVEU6IGlmIHdlIGhhdmUgdGFiYmFibGUgbm9kZXMsIHdlIG11c3QgaGF2ZSBmb2N1c2FibGUgbm9kZXM7IGZvY3VzYWJsZSBub2Rlc1xuICAgICAgLy8gIGFyZSBhIHN1cGVyc2V0IG9mIHRhYmJhYmxlIG5vZGVzXG5cbiAgICAgIHZhciBmb2N1c2FibGVOb2RlcyA9IGZvY3VzYWJsZShjb250YWluZXIsIGNvbmZpZy50YWJiYWJsZU9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGFpbmVyOiBjb250YWluZXIsXG4gICAgICAgIHRhYmJhYmxlTm9kZXM6IHRhYmJhYmxlTm9kZXMsXG4gICAgICAgIGZvY3VzYWJsZU5vZGVzOiBmb2N1c2FibGVOb2RlcyxcbiAgICAgICAgZmlyc3RUYWJiYWJsZU5vZGU6IHRhYmJhYmxlTm9kZXMubGVuZ3RoID4gMCA/IHRhYmJhYmxlTm9kZXNbMF0gOiBudWxsLFxuICAgICAgICBsYXN0VGFiYmFibGVOb2RlOiB0YWJiYWJsZU5vZGVzLmxlbmd0aCA+IDAgPyB0YWJiYWJsZU5vZGVzW3RhYmJhYmxlTm9kZXMubGVuZ3RoIC0gMV0gOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaW5kcyB0aGUgX190YWJiYWJsZV9fIG5vZGUgdGhhdCBmb2xsb3dzIHRoZSBnaXZlbiBub2RlIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0aW9uLFxuICAgICAgICAgKiAgaW4gdGhpcyBjb250YWluZXIsIGlmIGFueS5cbiAgICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmb3J3YXJkXSBUcnVlIGlmIGdvaW5nIGluIGZvcndhcmQgdGFiIG9yZGVyOyBmYWxzZSBpZiBnb2luZ1xuICAgICAgICAgKiAgaW4gcmV2ZXJzZS5cbiAgICAgICAgICogQHJldHVybnMge0hUTUxFbGVtZW50fHVuZGVmaW5lZH0gVGhlIG5leHQgdGFiYmFibGUgbm9kZSwgaWYgYW55LlxuICAgICAgICAgKi9cbiAgICAgICAgbmV4dFRhYmJhYmxlTm9kZTogZnVuY3Rpb24gbmV4dFRhYmJhYmxlTm9kZShub2RlKSB7XG4gICAgICAgICAgdmFyIGZvcndhcmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gICAgICAgICAgLy8gTk9URTogSWYgdGFiaW5kZXggaXMgcG9zaXRpdmUgKGluIG9yZGVyIHRvIG1hbmlwdWxhdGUgdGhlIHRhYiBvcmRlciBzZXBhcmF0ZVxuICAgICAgICAgIC8vICBmcm9tIHRoZSBET00gb3JkZXIpLCB0aGlzIF9fd2lsbCBub3Qgd29ya19fIGJlY2F1c2UgdGhlIGxpc3Qgb2YgZm9jdXNhYmxlTm9kZXMsXG4gICAgICAgICAgLy8gIHdoaWxlIGl0IGNvbnRhaW5zIHRhYmJhYmxlIG5vZGVzLCBkb2VzIG5vdCBzb3J0IGl0cyBub2RlcyBpbiBhbnkgb3JkZXIgb3RoZXJcbiAgICAgICAgICAvLyAgdGhhbiBET00gb3JkZXIsIGJlY2F1c2UgaXQgY2FuJ3Q6IFdoZXJlIHdvdWxkIHlvdSBwbGFjZSBmb2N1c2FibGUgKGJ1dCBub3RcbiAgICAgICAgICAvLyAgdGFiYmFibGUpIG5vZGVzIGluIHRoYXQgb3JkZXI/IFRoZXkgaGF2ZSBubyBvcmRlciwgYmVjYXVzZSB0aGV5IGFyZW4ndCB0YWJiYWxlLi4uXG4gICAgICAgICAgLy8gU3VwcG9ydCBmb3IgcG9zaXRpdmUgdGFiaW5kZXggaXMgYWxyZWFkeSBicm9rZW4gYW5kIGhhcmQgdG8gbWFuYWdlIChwb3NzaWJseVxuICAgICAgICAgIC8vICBub3Qgc3VwcG9ydGFibGUsIFRCRCksIHNvIHRoaXMgaXNuJ3QgZ29pbmcgdG8gbWFrZSB0aGluZ3Mgd29yc2UgdGhhbiB0aGV5XG4gICAgICAgICAgLy8gIGFscmVhZHkgYXJlLCBhbmQgYXQgbGVhc3QgbWFrZXMgdGhpbmdzIGJldHRlciBmb3IgdGhlIG1ham9yaXR5IG9mIGNhc2VzIHdoZXJlXG4gICAgICAgICAgLy8gIHRhYmluZGV4IGlzIGVpdGhlciAwL3Vuc2V0IG9yIG5lZ2F0aXZlLlxuICAgICAgICAgIC8vIEZZSSwgcG9zaXRpdmUgdGFiaW5kZXggaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mb2N1cy10cmFwL2ZvY3VzLXRyYXAvaXNzdWVzLzM3NVxuICAgICAgICAgIHZhciBub2RlSWR4ID0gZm9jdXNhYmxlTm9kZXMuZmluZEluZGV4KGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICByZXR1cm4gbiA9PT0gbm9kZTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChub2RlSWR4IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZm9yd2FyZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZvY3VzYWJsZU5vZGVzLnNsaWNlKG5vZGVJZHggKyAxKS5maW5kKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpc1RhYmJhYmxlKG4sIGNvbmZpZy50YWJiYWJsZU9wdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZvY3VzYWJsZU5vZGVzLnNsaWNlKDAsIG5vZGVJZHgpLnJldmVyc2UoKS5maW5kKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNUYWJiYWJsZShuLCBjb25maWcudGFiYmFibGVPcHRpb25zKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgICBzdGF0ZS50YWJiYWJsZUdyb3VwcyA9IHN0YXRlLmNvbnRhaW5lckdyb3Vwcy5maWx0ZXIoZnVuY3Rpb24gKGdyb3VwKSB7XG4gICAgICByZXR1cm4gZ3JvdXAudGFiYmFibGVOb2Rlcy5sZW5ndGggPiAwO1xuICAgIH0pOyAvLyB0aHJvdyBpZiBubyBncm91cHMgaGF2ZSB0YWJiYWJsZSBub2RlcyBhbmQgd2UgZG9uJ3QgaGF2ZSBhIGZhbGxiYWNrIGZvY3VzIG5vZGUgZWl0aGVyXG5cbiAgICBpZiAoc3RhdGUudGFiYmFibGVHcm91cHMubGVuZ3RoIDw9IDAgJiYgIWdldE5vZGVGb3JPcHRpb24oJ2ZhbGxiYWNrRm9jdXMnKSAvLyByZXR1cm5pbmcgZmFsc2Ugbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBvcHRpb25cbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91ciBmb2N1cy10cmFwIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgY29udGFpbmVyIHdpdGggYXQgbGVhc3Qgb25lIHRhYmJhYmxlIG5vZGUgaW4gaXQgYXQgYWxsIHRpbWVzJyk7XG4gICAgfVxuICB9O1xuXG4gIHZhciB0cnlGb2N1cyA9IGZ1bmN0aW9uIHRyeUZvY3VzKG5vZGUpIHtcbiAgICBpZiAobm9kZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gZG9jLmFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIW5vZGUgfHwgIW5vZGUuZm9jdXMpIHtcbiAgICAgIHRyeUZvY3VzKGdldEluaXRpYWxGb2N1c05vZGUoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5mb2N1cyh7XG4gICAgICBwcmV2ZW50U2Nyb2xsOiAhIWNvbmZpZy5wcmV2ZW50U2Nyb2xsXG4gICAgfSk7XG4gICAgc3RhdGUubW9zdFJlY2VudGx5Rm9jdXNlZE5vZGUgPSBub2RlO1xuXG4gICAgaWYgKGlzU2VsZWN0YWJsZUlucHV0KG5vZGUpKSB7XG4gICAgICBub2RlLnNlbGVjdCgpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgZ2V0UmV0dXJuRm9jdXNOb2RlID0gZnVuY3Rpb24gZ2V0UmV0dXJuRm9jdXNOb2RlKHByZXZpb3VzQWN0aXZlRWxlbWVudCkge1xuICAgIHZhciBub2RlID0gZ2V0Tm9kZUZvck9wdGlvbignc2V0UmV0dXJuRm9jdXMnLCBwcmV2aW91c0FjdGl2ZUVsZW1lbnQpO1xuICAgIHJldHVybiBub2RlID8gbm9kZSA6IG5vZGUgPT09IGZhbHNlID8gZmFsc2UgOiBwcmV2aW91c0FjdGl2ZUVsZW1lbnQ7XG4gIH07IC8vIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBvbiBtb3VzZWRvd24gYW5kIHRvdWNoc3RhcnQgaW5zdGVhZCBvZiBjbGlja1xuICAvLyBzbyB0aGF0IGl0IHByZWNlZGVzIHRoZSBmb2N1cyBldmVudC5cblxuXG4gIHZhciBjaGVja1BvaW50ZXJEb3duID0gZnVuY3Rpb24gY2hlY2tQb2ludGVyRG93bihlKSB7XG4gICAgdmFyIHRhcmdldCA9IGdldEFjdHVhbFRhcmdldChlKTtcblxuICAgIGlmIChmaW5kQ29udGFpbmVySW5kZXgodGFyZ2V0KSA+PSAwKSB7XG4gICAgICAvLyBhbGxvdyB0aGUgY2xpY2sgc2luY2UgaXQgb2N1cnJlZCBpbnNpZGUgdGhlIHRyYXBcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVPckhhbmRsZXIoY29uZmlnLmNsaWNrT3V0c2lkZURlYWN0aXZhdGVzLCBlKSkge1xuICAgICAgLy8gaW1tZWRpYXRlbHkgZGVhY3RpdmF0ZSB0aGUgdHJhcFxuICAgICAgdHJhcC5kZWFjdGl2YXRlKHtcbiAgICAgICAgLy8gaWYsIG9uIGRlYWN0aXZhdGlvbiwgd2Ugc2hvdWxkIHJldHVybiBmb2N1cyB0byB0aGUgbm9kZSBvcmlnaW5hbGx5LWZvY3VzZWRcbiAgICAgICAgLy8gIHdoZW4gdGhlIHRyYXAgd2FzIGFjdGl2YXRlZCAob3IgdGhlIGNvbmZpZ3VyZWQgYHNldFJldHVybkZvY3VzYCBub2RlKSxcbiAgICAgICAgLy8gIHRoZW4gYXNzdW1lIGl0J3MgYWxzbyBPSyB0byByZXR1cm4gZm9jdXMgdG8gdGhlIG91dHNpZGUgbm9kZSB0aGF0IHdhc1xuICAgICAgICAvLyAganVzdCBjbGlja2VkLCBjYXVzaW5nIGRlYWN0aXZhdGlvbiwgYXMgbG9uZyBhcyB0aGF0IG5vZGUgaXMgZm9jdXNhYmxlO1xuICAgICAgICAvLyAgaWYgaXQgaXNuJ3QgZm9jdXNhYmxlLCB0aGVuIHJldHVybiBmb2N1cyB0byB0aGUgb3JpZ2luYWwgbm9kZSBmb2N1c2VkXG4gICAgICAgIC8vICBvbiBhY3RpdmF0aW9uIChvciB0aGUgY29uZmlndXJlZCBgc2V0UmV0dXJuRm9jdXNgIG5vZGUpXG4gICAgICAgIC8vIE5PVEU6IGJ5IHNldHRpbmcgYHJldHVybkZvY3VzOiBmYWxzZWAsIGRlYWN0aXZhdGUoKSB3aWxsIGRvIG5vdGhpbmcsXG4gICAgICAgIC8vICB3aGljaCB3aWxsIHJlc3VsdCBpbiB0aGUgb3V0c2lkZSBjbGljayBzZXR0aW5nIGZvY3VzIHRvIHRoZSBub2RlXG4gICAgICAgIC8vICB0aGF0IHdhcyBjbGlja2VkLCB3aGV0aGVyIGl0J3MgZm9jdXNhYmxlIG9yIG5vdDsgYnkgc2V0dGluZ1xuICAgICAgICAvLyAgYHJldHVybkZvY3VzOiB0cnVlYCwgd2UnbGwgYXR0ZW1wdCB0byByZS1mb2N1cyB0aGUgbm9kZSBvcmlnaW5hbGx5LWZvY3VzZWRcbiAgICAgICAgLy8gIG9uIGFjdGl2YXRpb24gKG9yIHRoZSBjb25maWd1cmVkIGBzZXRSZXR1cm5Gb2N1c2Agbm9kZSlcbiAgICAgICAgcmV0dXJuRm9jdXM6IGNvbmZpZy5yZXR1cm5Gb2N1c09uRGVhY3RpdmF0ZSAmJiAhaXNGb2N1c2FibGUodGFyZ2V0LCBjb25maWcudGFiYmFibGVPcHRpb25zKVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgbW9iaWxlIGRldmljZXMuXG4gICAgLy8gKElmIHdlJ2xsIG9ubHkgbGV0IGBjbGlja2AgZXZlbnRzIHRocm91Z2gsXG4gICAgLy8gdGhlbiBvbiBtb2JpbGUgdGhleSB3aWxsIGJlIGJsb2NrZWQgYW55d2F5cyBpZiBgdG91Y2hzdGFydGAgaXMgYmxvY2tlZC4pXG5cblxuICAgIGlmICh2YWx1ZU9ySGFuZGxlcihjb25maWcuYWxsb3dPdXRzaWRlQ2xpY2ssIGUpKSB7XG4gICAgICAvLyBhbGxvdyB0aGUgY2xpY2sgb3V0c2lkZSB0aGUgdHJhcCB0byB0YWtlIHBsYWNlXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBvdGhlcndpc2UsIHByZXZlbnQgdGhlIGNsaWNrXG5cblxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfTsgLy8gSW4gY2FzZSBmb2N1cyBlc2NhcGVzIHRoZSB0cmFwIGZvciBzb21lIHN0cmFuZ2UgcmVhc29uLCBwdWxsIGl0IGJhY2sgaW4uXG5cblxuICB2YXIgY2hlY2tGb2N1c0luID0gZnVuY3Rpb24gY2hlY2tGb2N1c0luKGUpIHtcbiAgICB2YXIgdGFyZ2V0ID0gZ2V0QWN0dWFsVGFyZ2V0KGUpO1xuICAgIHZhciB0YXJnZXRDb250YWluZWQgPSBmaW5kQ29udGFpbmVySW5kZXgodGFyZ2V0KSA+PSAwOyAvLyBJbiBGaXJlZm94IHdoZW4geW91IFRhYiBvdXQgb2YgYW4gaWZyYW1lIHRoZSBEb2N1bWVudCBpcyBicmllZmx5IGZvY3VzZWQuXG5cbiAgICBpZiAodGFyZ2V0Q29udGFpbmVkIHx8IHRhcmdldCBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgICBpZiAodGFyZ2V0Q29udGFpbmVkKSB7XG4gICAgICAgIHN0YXRlLm1vc3RSZWNlbnRseUZvY3VzZWROb2RlID0gdGFyZ2V0O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlc2NhcGVkISBwdWxsIGl0IGJhY2sgaW4gdG8gd2hlcmUgaXQganVzdCBsZWZ0XG4gICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgdHJ5Rm9jdXMoc3RhdGUubW9zdFJlY2VudGx5Rm9jdXNlZE5vZGUgfHwgZ2V0SW5pdGlhbEZvY3VzTm9kZSgpKTtcbiAgICB9XG4gIH07IC8vIEhpamFjayBUYWIgZXZlbnRzIG9uIHRoZSBmaXJzdCBhbmQgbGFzdCBmb2N1c2FibGUgbm9kZXMgb2YgdGhlIHRyYXAsXG4gIC8vIGluIG9yZGVyIHRvIHByZXZlbnQgZm9jdXMgZnJvbSBlc2NhcGluZy4gSWYgaXQgZXNjYXBlcyBmb3IgZXZlbiBhXG4gIC8vIG1vbWVudCBpdCBjYW4gZW5kIHVwIHNjcm9sbGluZyB0aGUgcGFnZSBhbmQgY2F1c2luZyBjb25mdXNpb24gc28gd2VcbiAgLy8ga2luZCBvZiBuZWVkIHRvIGNhcHR1cmUgdGhlIGFjdGlvbiBhdCB0aGUga2V5ZG93biBwaGFzZS5cblxuXG4gIHZhciBjaGVja1RhYiA9IGZ1bmN0aW9uIGNoZWNrVGFiKGUpIHtcbiAgICB2YXIgdGFyZ2V0ID0gZ2V0QWN0dWFsVGFyZ2V0KGUpO1xuICAgIHVwZGF0ZVRhYmJhYmxlTm9kZXMoKTtcbiAgICB2YXIgZGVzdGluYXRpb25Ob2RlID0gbnVsbDtcblxuICAgIGlmIChzdGF0ZS50YWJiYWJsZUdyb3Vwcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBtYWtlIHN1cmUgdGhlIHRhcmdldCBpcyBhY3R1YWxseSBjb250YWluZWQgaW4gYSBncm91cFxuICAgICAgLy8gTk9URTogdGhlIHRhcmdldCBtYXkgYWxzbyBiZSB0aGUgY29udGFpbmVyIGl0c2VsZiBpZiBpdCdzIGZvY3VzYWJsZVxuICAgICAgLy8gIHdpdGggdGFiSW5kZXg9Jy0xJyBhbmQgd2FzIGdpdmVuIGluaXRpYWwgZm9jdXNcbiAgICAgIHZhciBjb250YWluZXJJbmRleCA9IGZpbmRDb250YWluZXJJbmRleCh0YXJnZXQpO1xuICAgICAgdmFyIGNvbnRhaW5lckdyb3VwID0gY29udGFpbmVySW5kZXggPj0gMCA/IHN0YXRlLmNvbnRhaW5lckdyb3Vwc1tjb250YWluZXJJbmRleF0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChjb250YWluZXJJbmRleCA8IDApIHtcbiAgICAgICAgLy8gdGFyZ2V0IG5vdCBmb3VuZCBpbiBhbnkgZ3JvdXA6IHF1aXRlIHBvc3NpYmxlIGZvY3VzIGhhcyBlc2NhcGVkIHRoZSB0cmFwLFxuICAgICAgICAvLyAgc28gYnJpbmcgaXQgYmFjayBpbiB0by4uLlxuICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAgIC8vIC4uLnRoZSBsYXN0IG5vZGUgaW4gdGhlIGxhc3QgZ3JvdXBcbiAgICAgICAgICBkZXN0aW5hdGlvbk5vZGUgPSBzdGF0ZS50YWJiYWJsZUdyb3Vwc1tzdGF0ZS50YWJiYWJsZUdyb3Vwcy5sZW5ndGggLSAxXS5sYXN0VGFiYmFibGVOb2RlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIC4uLnRoZSBmaXJzdCBub2RlIGluIHRoZSBmaXJzdCBncm91cFxuICAgICAgICAgIGRlc3RpbmF0aW9uTm9kZSA9IHN0YXRlLnRhYmJhYmxlR3JvdXBzWzBdLmZpcnN0VGFiYmFibGVOb2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgLy8gUkVWRVJTRVxuICAgICAgICAvLyBpcyB0aGUgdGFyZ2V0IHRoZSBmaXJzdCB0YWJiYWJsZSBub2RlIGluIGEgZ3JvdXA/XG4gICAgICAgIHZhciBzdGFydE9mR3JvdXBJbmRleCA9IGZpbmRJbmRleChzdGF0ZS50YWJiYWJsZUdyb3VwcywgZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgICAgdmFyIGZpcnN0VGFiYmFibGVOb2RlID0gX3JlZjIuZmlyc3RUYWJiYWJsZU5vZGU7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldCA9PT0gZmlyc3RUYWJiYWJsZU5vZGU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChzdGFydE9mR3JvdXBJbmRleCA8IDAgJiYgKGNvbnRhaW5lckdyb3VwLmNvbnRhaW5lciA9PT0gdGFyZ2V0IHx8IGlzRm9jdXNhYmxlKHRhcmdldCwgY29uZmlnLnRhYmJhYmxlT3B0aW9ucykgJiYgIWlzVGFiYmFibGUodGFyZ2V0LCBjb25maWcudGFiYmFibGVPcHRpb25zKSAmJiAhY29udGFpbmVyR3JvdXAubmV4dFRhYmJhYmxlTm9kZSh0YXJnZXQsIGZhbHNlKSkpIHtcbiAgICAgICAgICAvLyBhbiBleGNlcHRpb24gY2FzZSB3aGVyZSB0aGUgdGFyZ2V0IGlzIGVpdGhlciB0aGUgY29udGFpbmVyIGl0c2VsZiwgb3JcbiAgICAgICAgICAvLyAgYSBub24tdGFiYmFibGUgbm9kZSB0aGF0IHdhcyBnaXZlbiBmb2N1cyAoaS5lLiB0YWJpbmRleCBpcyBuZWdhdGl2ZVxuICAgICAgICAgIC8vICBhbmQgdXNlciBjbGlja2VkIG9uIGl0IG9yIG5vZGUgd2FzIHByb2dyYW1tYXRpY2FsbHkgZ2l2ZW4gZm9jdXMpXG4gICAgICAgICAgLy8gIGFuZCBpcyBub3QgZm9sbG93ZWQgYnkgYW55IG90aGVyIHRhYmJhYmxlIG5vZGUsIGluIHdoaWNoXG4gICAgICAgICAgLy8gIGNhc2UsIHdlIHNob3VsZCBoYW5kbGUgc2hpZnQrdGFiIGFzIGlmIGZvY3VzIHdlcmUgb24gdGhlIGNvbnRhaW5lcidzXG4gICAgICAgICAgLy8gIGZpcnN0IHRhYmJhYmxlIG5vZGUsIGFuZCBnbyB0byB0aGUgbGFzdCB0YWJiYWJsZSBub2RlIG9mIHRoZSBMQVNUIGdyb3VwXG4gICAgICAgICAgc3RhcnRPZkdyb3VwSW5kZXggPSBjb250YWluZXJJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGFydE9mR3JvdXBJbmRleCA+PSAwKSB7XG4gICAgICAgICAgLy8gWUVTOiB0aGVuIHNoaWZ0K3RhYiBzaG91bGQgZ28gdG8gdGhlIGxhc3QgdGFiYmFibGUgbm9kZSBpbiB0aGVcbiAgICAgICAgICAvLyAgcHJldmlvdXMgZ3JvdXAgKGFuZCB3cmFwIGFyb3VuZCB0byB0aGUgbGFzdCB0YWJiYWJsZSBub2RlIG9mXG4gICAgICAgICAgLy8gIHRoZSBMQVNUIGdyb3VwIGlmIGl0J3MgdGhlIGZpcnN0IHRhYmJhYmxlIG5vZGUgb2YgdGhlIEZJUlNUIGdyb3VwKVxuICAgICAgICAgIHZhciBkZXN0aW5hdGlvbkdyb3VwSW5kZXggPSBzdGFydE9mR3JvdXBJbmRleCA9PT0gMCA/IHN0YXRlLnRhYmJhYmxlR3JvdXBzLmxlbmd0aCAtIDEgOiBzdGFydE9mR3JvdXBJbmRleCAtIDE7XG4gICAgICAgICAgdmFyIGRlc3RpbmF0aW9uR3JvdXAgPSBzdGF0ZS50YWJiYWJsZUdyb3Vwc1tkZXN0aW5hdGlvbkdyb3VwSW5kZXhdO1xuICAgICAgICAgIGRlc3RpbmF0aW9uTm9kZSA9IGRlc3RpbmF0aW9uR3JvdXAubGFzdFRhYmJhYmxlTm9kZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRk9SV0FSRFxuICAgICAgICAvLyBpcyB0aGUgdGFyZ2V0IHRoZSBsYXN0IHRhYmJhYmxlIG5vZGUgaW4gYSBncm91cD9cbiAgICAgICAgdmFyIGxhc3RPZkdyb3VwSW5kZXggPSBmaW5kSW5kZXgoc3RhdGUudGFiYmFibGVHcm91cHMsIGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICAgIHZhciBsYXN0VGFiYmFibGVOb2RlID0gX3JlZjMubGFzdFRhYmJhYmxlTm9kZTtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0ID09PSBsYXN0VGFiYmFibGVOb2RlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAobGFzdE9mR3JvdXBJbmRleCA8IDAgJiYgKGNvbnRhaW5lckdyb3VwLmNvbnRhaW5lciA9PT0gdGFyZ2V0IHx8IGlzRm9jdXNhYmxlKHRhcmdldCwgY29uZmlnLnRhYmJhYmxlT3B0aW9ucykgJiYgIWlzVGFiYmFibGUodGFyZ2V0LCBjb25maWcudGFiYmFibGVPcHRpb25zKSAmJiAhY29udGFpbmVyR3JvdXAubmV4dFRhYmJhYmxlTm9kZSh0YXJnZXQpKSkge1xuICAgICAgICAgIC8vIGFuIGV4Y2VwdGlvbiBjYXNlIHdoZXJlIHRoZSB0YXJnZXQgaXMgdGhlIGNvbnRhaW5lciBpdHNlbGYsIG9yXG4gICAgICAgICAgLy8gIGEgbm9uLXRhYmJhYmxlIG5vZGUgdGhhdCB3YXMgZ2l2ZW4gZm9jdXMgKGkuZS4gdGFiaW5kZXggaXMgbmVnYXRpdmVcbiAgICAgICAgICAvLyAgYW5kIHVzZXIgY2xpY2tlZCBvbiBpdCBvciBub2RlIHdhcyBwcm9ncmFtbWF0aWNhbGx5IGdpdmVuIGZvY3VzKVxuICAgICAgICAgIC8vICBhbmQgaXMgbm90IGZvbGxvd2VkIGJ5IGFueSBvdGhlciB0YWJiYWJsZSBub2RlLCBpbiB3aGljaFxuICAgICAgICAgIC8vICBjYXNlLCB3ZSBzaG91bGQgaGFuZGxlIHRhYiBhcyBpZiBmb2N1cyB3ZXJlIG9uIHRoZSBjb250YWluZXInc1xuICAgICAgICAgIC8vICBsYXN0IHRhYmJhYmxlIG5vZGUsIGFuZCBnbyB0byB0aGUgZmlyc3QgdGFiYmFibGUgbm9kZSBvZiB0aGUgRklSU1QgZ3JvdXBcbiAgICAgICAgICBsYXN0T2ZHcm91cEluZGV4ID0gY29udGFpbmVySW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGFzdE9mR3JvdXBJbmRleCA+PSAwKSB7XG4gICAgICAgICAgLy8gWUVTOiB0aGVuIHRhYiBzaG91bGQgZ28gdG8gdGhlIGZpcnN0IHRhYmJhYmxlIG5vZGUgaW4gdGhlIG5leHRcbiAgICAgICAgICAvLyAgZ3JvdXAgKGFuZCB3cmFwIGFyb3VuZCB0byB0aGUgZmlyc3QgdGFiYmFibGUgbm9kZSBvZiB0aGUgRklSU1RcbiAgICAgICAgICAvLyAgZ3JvdXAgaWYgaXQncyB0aGUgbGFzdCB0YWJiYWJsZSBub2RlIG9mIHRoZSBMQVNUIGdyb3VwKVxuICAgICAgICAgIHZhciBfZGVzdGluYXRpb25Hcm91cEluZGV4ID0gbGFzdE9mR3JvdXBJbmRleCA9PT0gc3RhdGUudGFiYmFibGVHcm91cHMubGVuZ3RoIC0gMSA/IDAgOiBsYXN0T2ZHcm91cEluZGV4ICsgMTtcblxuICAgICAgICAgIHZhciBfZGVzdGluYXRpb25Hcm91cCA9IHN0YXRlLnRhYmJhYmxlR3JvdXBzW19kZXN0aW5hdGlvbkdyb3VwSW5kZXhdO1xuICAgICAgICAgIGRlc3RpbmF0aW9uTm9kZSA9IF9kZXN0aW5hdGlvbkdyb3VwLmZpcnN0VGFiYmFibGVOb2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5PVEU6IHRoZSBmYWxsYmFja0ZvY3VzIG9wdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHJldHVybmluZyBmYWxzZSB0byBvcHQtb3V0XG4gICAgICBkZXN0aW5hdGlvbk5vZGUgPSBnZXROb2RlRm9yT3B0aW9uKCdmYWxsYmFja0ZvY3VzJyk7XG4gICAgfVxuXG4gICAgaWYgKGRlc3RpbmF0aW9uTm9kZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdHJ5Rm9jdXMoZGVzdGluYXRpb25Ob2RlKTtcbiAgICB9IC8vIGVsc2UsIGxldCB0aGUgYnJvd3NlciB0YWtlIGNhcmUgb2YgW3NoaWZ0K110YWIgYW5kIG1vdmUgdGhlIGZvY3VzXG5cbiAgfTtcblxuICB2YXIgY2hlY2tLZXkgPSBmdW5jdGlvbiBjaGVja0tleShlKSB7XG4gICAgaWYgKGlzRXNjYXBlRXZlbnQoZSkgJiYgdmFsdWVPckhhbmRsZXIoY29uZmlnLmVzY2FwZURlYWN0aXZhdGVzLCBlKSAhPT0gZmFsc2UpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRyYXAuZGVhY3RpdmF0ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc1RhYkV2ZW50KGUpKSB7XG4gICAgICBjaGVja1RhYihlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGNoZWNrQ2xpY2sgPSBmdW5jdGlvbiBjaGVja0NsaWNrKGUpIHtcbiAgICB2YXIgdGFyZ2V0ID0gZ2V0QWN0dWFsVGFyZ2V0KGUpO1xuXG4gICAgaWYgKGZpbmRDb250YWluZXJJbmRleCh0YXJnZXQpID49IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVPckhhbmRsZXIoY29uZmlnLmNsaWNrT3V0c2lkZURlYWN0aXZhdGVzLCBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZU9ySGFuZGxlcihjb25maWcuYWxsb3dPdXRzaWRlQ2xpY2ssIGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIH07IC8vXG4gIC8vIEVWRU5UIExJU1RFTkVSU1xuICAvL1xuXG5cbiAgdmFyIGFkZExpc3RlbmVycyA9IGZ1bmN0aW9uIGFkZExpc3RlbmVycygpIHtcbiAgICBpZiAoIXN0YXRlLmFjdGl2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gVGhlcmUgY2FuIGJlIG9ubHkgb25lIGxpc3RlbmluZyBmb2N1cyB0cmFwIGF0IGEgdGltZVxuXG5cbiAgICBhY3RpdmVGb2N1c1RyYXBzLmFjdGl2YXRlVHJhcCh0cmFwKTsgLy8gRGVsYXkgZW5zdXJlcyB0aGF0IHRoZSBmb2N1c2VkIGVsZW1lbnQgZG9lc24ndCBjYXB0dXJlIHRoZSBldmVudFxuICAgIC8vIHRoYXQgY2F1c2VkIHRoZSBmb2N1cyB0cmFwIGFjdGl2YXRpb24uXG5cbiAgICBzdGF0ZS5kZWxheUluaXRpYWxGb2N1c1RpbWVyID0gY29uZmlnLmRlbGF5SW5pdGlhbEZvY3VzID8gZGVsYXkoZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5Rm9jdXMoZ2V0SW5pdGlhbEZvY3VzTm9kZSgpKTtcbiAgICB9KSA6IHRyeUZvY3VzKGdldEluaXRpYWxGb2N1c05vZGUoKSk7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBjaGVja0ZvY3VzSW4sIHRydWUpO1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBjaGVja1BvaW50ZXJEb3duLCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICB9KTtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGNoZWNrUG9pbnRlckRvd24sIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNoZWNrQ2xpY2ssIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgY2hlY2tLZXksIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiB0cmFwO1xuICB9O1xuXG4gIHZhciByZW1vdmVMaXN0ZW5lcnMgPSBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIGNoZWNrRm9jdXNJbiwgdHJ1ZSk7XG4gICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGNoZWNrUG9pbnRlckRvd24sIHRydWUpO1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgY2hlY2tQb2ludGVyRG93biwgdHJ1ZSk7XG4gICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2hlY2tDbGljaywgdHJ1ZSk7XG4gICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBjaGVja0tleSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHRyYXA7XG4gIH07IC8vXG4gIC8vIFRSQVAgREVGSU5JVElPTlxuICAvL1xuXG5cbiAgdHJhcCA9IHtcbiAgICBnZXQgYWN0aXZlKCkge1xuICAgICAgcmV0dXJuIHN0YXRlLmFjdGl2ZTtcbiAgICB9LFxuXG4gICAgZ2V0IHBhdXNlZCgpIHtcbiAgICAgIHJldHVybiBzdGF0ZS5wYXVzZWQ7XG4gICAgfSxcblxuICAgIGFjdGl2YXRlOiBmdW5jdGlvbiBhY3RpdmF0ZShhY3RpdmF0ZU9wdGlvbnMpIHtcbiAgICAgIGlmIChzdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIHZhciBvbkFjdGl2YXRlID0gZ2V0T3B0aW9uKGFjdGl2YXRlT3B0aW9ucywgJ29uQWN0aXZhdGUnKTtcbiAgICAgIHZhciBvblBvc3RBY3RpdmF0ZSA9IGdldE9wdGlvbihhY3RpdmF0ZU9wdGlvbnMsICdvblBvc3RBY3RpdmF0ZScpO1xuICAgICAgdmFyIGNoZWNrQ2FuRm9jdXNUcmFwID0gZ2V0T3B0aW9uKGFjdGl2YXRlT3B0aW9ucywgJ2NoZWNrQ2FuRm9jdXNUcmFwJyk7XG5cbiAgICAgIGlmICghY2hlY2tDYW5Gb2N1c1RyYXApIHtcbiAgICAgICAgdXBkYXRlVGFiYmFibGVOb2RlcygpO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgc3RhdGUucGF1c2VkID0gZmFsc2U7XG4gICAgICBzdGF0ZS5ub2RlRm9jdXNlZEJlZm9yZUFjdGl2YXRpb24gPSBkb2MuYWN0aXZlRWxlbWVudDtcblxuICAgICAgaWYgKG9uQWN0aXZhdGUpIHtcbiAgICAgICAgb25BY3RpdmF0ZSgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZmluaXNoQWN0aXZhdGlvbiA9IGZ1bmN0aW9uIGZpbmlzaEFjdGl2YXRpb24oKSB7XG4gICAgICAgIGlmIChjaGVja0NhbkZvY3VzVHJhcCkge1xuICAgICAgICAgIHVwZGF0ZVRhYmJhYmxlTm9kZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZExpc3RlbmVycygpO1xuXG4gICAgICAgIGlmIChvblBvc3RBY3RpdmF0ZSkge1xuICAgICAgICAgIG9uUG9zdEFjdGl2YXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChjaGVja0NhbkZvY3VzVHJhcCkge1xuICAgICAgICBjaGVja0NhbkZvY3VzVHJhcChzdGF0ZS5jb250YWluZXJzLmNvbmNhdCgpKS50aGVuKGZpbmlzaEFjdGl2YXRpb24sIGZpbmlzaEFjdGl2YXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgZmluaXNoQWN0aXZhdGlvbigpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBkZWFjdGl2YXRlOiBmdW5jdGlvbiBkZWFjdGl2YXRlKGRlYWN0aXZhdGVPcHRpb25zKSB7XG4gICAgICBpZiAoIXN0YXRlLmFjdGl2ZSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIG9wdGlvbnMgPSBfb2JqZWN0U3ByZWFkMih7XG4gICAgICAgIG9uRGVhY3RpdmF0ZTogY29uZmlnLm9uRGVhY3RpdmF0ZSxcbiAgICAgICAgb25Qb3N0RGVhY3RpdmF0ZTogY29uZmlnLm9uUG9zdERlYWN0aXZhdGUsXG4gICAgICAgIGNoZWNrQ2FuUmV0dXJuRm9jdXM6IGNvbmZpZy5jaGVja0NhblJldHVybkZvY3VzXG4gICAgICB9LCBkZWFjdGl2YXRlT3B0aW9ucyk7XG5cbiAgICAgIGNsZWFyVGltZW91dChzdGF0ZS5kZWxheUluaXRpYWxGb2N1c1RpbWVyKTsgLy8gbm9vcCBpZiB1bmRlZmluZWRcblxuICAgICAgc3RhdGUuZGVsYXlJbml0aWFsRm9jdXNUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgIHJlbW92ZUxpc3RlbmVycygpO1xuICAgICAgc3RhdGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICBzdGF0ZS5wYXVzZWQgPSBmYWxzZTtcbiAgICAgIGFjdGl2ZUZvY3VzVHJhcHMuZGVhY3RpdmF0ZVRyYXAodHJhcCk7XG4gICAgICB2YXIgb25EZWFjdGl2YXRlID0gZ2V0T3B0aW9uKG9wdGlvbnMsICdvbkRlYWN0aXZhdGUnKTtcbiAgICAgIHZhciBvblBvc3REZWFjdGl2YXRlID0gZ2V0T3B0aW9uKG9wdGlvbnMsICdvblBvc3REZWFjdGl2YXRlJyk7XG4gICAgICB2YXIgY2hlY2tDYW5SZXR1cm5Gb2N1cyA9IGdldE9wdGlvbihvcHRpb25zLCAnY2hlY2tDYW5SZXR1cm5Gb2N1cycpO1xuICAgICAgdmFyIHJldHVybkZvY3VzID0gZ2V0T3B0aW9uKG9wdGlvbnMsICdyZXR1cm5Gb2N1cycsICdyZXR1cm5Gb2N1c09uRGVhY3RpdmF0ZScpO1xuXG4gICAgICBpZiAob25EZWFjdGl2YXRlKSB7XG4gICAgICAgIG9uRGVhY3RpdmF0ZSgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZmluaXNoRGVhY3RpdmF0aW9uID0gZnVuY3Rpb24gZmluaXNoRGVhY3RpdmF0aW9uKCkge1xuICAgICAgICBkZWxheShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHJldHVybkZvY3VzKSB7XG4gICAgICAgICAgICB0cnlGb2N1cyhnZXRSZXR1cm5Gb2N1c05vZGUoc3RhdGUubm9kZUZvY3VzZWRCZWZvcmVBY3RpdmF0aW9uKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG9uUG9zdERlYWN0aXZhdGUpIHtcbiAgICAgICAgICAgIG9uUG9zdERlYWN0aXZhdGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgaWYgKHJldHVybkZvY3VzICYmIGNoZWNrQ2FuUmV0dXJuRm9jdXMpIHtcbiAgICAgICAgY2hlY2tDYW5SZXR1cm5Gb2N1cyhnZXRSZXR1cm5Gb2N1c05vZGUoc3RhdGUubm9kZUZvY3VzZWRCZWZvcmVBY3RpdmF0aW9uKSkudGhlbihmaW5pc2hEZWFjdGl2YXRpb24sIGZpbmlzaERlYWN0aXZhdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBmaW5pc2hEZWFjdGl2YXRpb24oKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgcGF1c2U6IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgICAgaWYgKHN0YXRlLnBhdXNlZCB8fCAhc3RhdGUuYWN0aXZlKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5wYXVzZWQgPSB0cnVlO1xuICAgICAgcmVtb3ZlTGlzdGVuZXJzKCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIHVucGF1c2U6IGZ1bmN0aW9uIHVucGF1c2UoKSB7XG4gICAgICBpZiAoIXN0YXRlLnBhdXNlZCB8fCAhc3RhdGUuYWN0aXZlKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5wYXVzZWQgPSBmYWxzZTtcbiAgICAgIHVwZGF0ZVRhYmJhYmxlTm9kZXMoKTtcbiAgICAgIGFkZExpc3RlbmVycygpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICB1cGRhdGVDb250YWluZXJFbGVtZW50czogZnVuY3Rpb24gdXBkYXRlQ29udGFpbmVyRWxlbWVudHMoY29udGFpbmVyRWxlbWVudHMpIHtcbiAgICAgIHZhciBlbGVtZW50c0FzQXJyYXkgPSBbXS5jb25jYXQoY29udGFpbmVyRWxlbWVudHMpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgIHN0YXRlLmNvbnRhaW5lcnMgPSBlbGVtZW50c0FzQXJyYXkubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycgPyBkb2MucXVlcnlTZWxlY3RvcihlbGVtZW50KSA6IGVsZW1lbnQ7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHN0YXRlLmFjdGl2ZSkge1xuICAgICAgICB1cGRhdGVUYWJiYWJsZU5vZGVzKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfTsgLy8gaW5pdGlhbGl6ZSBjb250YWluZXIgZWxlbWVudHNcblxuICB0cmFwLnVwZGF0ZUNvbnRhaW5lckVsZW1lbnRzKGVsZW1lbnRzKTtcbiAgcmV0dXJuIHRyYXA7XG59O1xuXG5leHBvcnQgeyBjcmVhdGVGb2N1c1RyYXAgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZvY3VzLXRyYXAuZXNtLmpzLm1hcFxuIiwiJ3VzZSBzdHJpY3QnOyhmdW5jdGlvbigpeyhmdW5jdGlvbigpe2Z1bmN0aW9uIGUoYSl7Zm9yKHZhciBiPVthXTthPWEucGFyZW50Tm9kZXx8YS5ob3N0fHxhLmRlZmF1bHRWaWV3OyliLnB1c2goYSk7cmV0dXJuIGJ9ZnVuY3Rpb24gZihhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBiLmdldEF0dHJpYnV0ZT9iLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpfHxcIlwiOnZvaWQgMDtcInVuZGVmaW5lZFwiIT09dHlwZW9mIGMmJi0xPT09Yy5pbmRleE9mKGEpJiZiLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsYy5jb25jYXQoXCIgXCIsYSkudHJpbSgpKX19ZnVuY3Rpb24gZyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBiLmdldEF0dHJpYnV0ZT9iLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpfHxcIlwiOnZvaWQgMDtpZihjKXt2YXIgZD1jLmluZGV4T2YoYSk7MDw9ZCYmKDA9PT1kfHwwPD1oLmluZGV4T2YoYy5jaGFyQXQoZC0xKSkpJiZcbihjPWMucmVwbGFjZShhLFwiXCIpLnRyaW0oKSxcIlwiPT09Yz9iLnJlbW92ZUF0dHJpYnV0ZShcImNsYXNzXCIpOmIuc2V0QXR0cmlidXRlKFwiY2xhc3NcIixjKSl9fX1mdW5jdGlvbiBrKCl7dmFyIGE9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYygpe2I9ITE7XCJibHVyXCI9PT1hLnR5cGUmJkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUoYS50YXJnZXQpKS5mb3JFYWNoKGcoXCJmb2N1cy13aXRoaW5cIikpO1wiZm9jdXNcIj09PWEudHlwZSYmQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZShhLnRhcmdldCkpLmZvckVhY2goZihcImZvY3VzLXdpdGhpblwiKSl9aWYoIWIpe3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYyk7dmFyIGI9ITB9fTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIixhLCEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLGEsITApO2YoXCJqcy1mb2N1cy13aXRoaW5cIikoZG9jdW1lbnQuYm9keSk7cmV0dXJuITB9dmFyIGg9W1wiXFxuXCIsXCJcXHRcIixcIiBcIixcblwiXFxyXCJdO3RyeXtyZXR1cm5cInVuZGVmaW5lZFwiIT09dHlwZW9mIHdpbmRvdyYmIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCI6Zm9jdXMtd2l0aGluXCIpfWNhdGNoKGEpe3JldHVybiBrKCl9fSkoKX0pKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb2N1cy13aXRoaW4tcG9seWZpbGwuanMubWFwXG4iLCI7KGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIEZvdW5kYXRpb24ubGlicy5kcm9wZG93biA9IHtcbiAgICBuYW1lIDogJ2Ryb3Bkb3duJyxcblxuICAgIHZlcnNpb24gOiAnNS41LjMnLFxuXG4gICAgc2V0dGluZ3MgOiB7XG4gICAgICBhY3RpdmVfY2xhc3MgOiAnb3BlbicsXG4gICAgICBkaXNhYmxlZF9jbGFzcyA6ICdkaXNhYmxlZCcsXG4gICAgICBtZWdhX2NsYXNzIDogJ21lZ2EnLFxuICAgICAgYWxpZ24gOiAnYm90dG9tJyxcbiAgICAgIGlzX2hvdmVyIDogZmFsc2UsXG4gICAgICBob3Zlcl90aW1lb3V0IDogMTUwLFxuICAgICAgb3BlbmVkIDogZnVuY3Rpb24gKCkge30sXG4gICAgICBjbG9zZWQgOiBmdW5jdGlvbiAoKSB7fVxuICAgIH0sXG5cbiAgICBpbml0IDogZnVuY3Rpb24gKHNjb3BlLCBtZXRob2QsIG9wdGlvbnMpIHtcbiAgICAgIEZvdW5kYXRpb24uaW5oZXJpdCh0aGlzLCAndGhyb3R0bGUnKTtcblxuICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcy5zZXR0aW5ncywgbWV0aG9kLCBvcHRpb25zKTtcbiAgICAgIHRoaXMuYmluZGluZ3MobWV0aG9kLCBvcHRpb25zKTtcbiAgICB9LFxuXG4gICAgZXZlbnRzIDogZnVuY3Rpb24gKHNjb3BlKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgICAgUyA9IHNlbGYuUztcblxuICAgICAgUyh0aGlzLnNjb3BlKVxuICAgICAgICAub2ZmKCcuZHJvcGRvd24nKVxuICAgICAgICAub24oJ2NsaWNrLmZuZHRuLmRyb3Bkb3duJywgJ1snICsgdGhpcy5hdHRyX25hbWUoKSArICddJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICB2YXIgc2V0dGluZ3MgPSBTKHRoaXMpLmRhdGEoc2VsZi5hdHRyX25hbWUodHJ1ZSkgKyAnLWluaXQnKSB8fCBzZWxmLnNldHRpbmdzO1xuICAgICAgICAgIGlmICghc2V0dGluZ3MuaXNfaG92ZXIgfHwgTW9kZXJuaXpyLnRvdWNoKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBpZiAoUyh0aGlzKS5wYXJlbnQoJ1tkYXRhLXJldmVhbC1pZF0nKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGYudG9nZ2xlKCQodGhpcykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdtb3VzZWVudGVyLmZuZHRuLmRyb3Bkb3duJywgJ1snICsgdGhpcy5hdHRyX25hbWUoKSArICddLCBbJyArIHRoaXMuYXR0cl9uYW1lKCkgKyAnLWNvbnRlbnRdJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICB2YXIgJHRoaXMgPSBTKHRoaXMpLFxuICAgICAgICAgICAgICBkcm9wZG93bixcbiAgICAgICAgICAgICAgdGFyZ2V0O1xuXG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHNlbGYudGltZW91dCk7XG5cbiAgICAgICAgICBpZiAoJHRoaXMuZGF0YShzZWxmLmRhdGFfYXR0cigpKSkge1xuICAgICAgICAgICAgZHJvcGRvd24gPSBTKCcjJyArICR0aGlzLmRhdGEoc2VsZi5kYXRhX2F0dHIoKSkpO1xuICAgICAgICAgICAgdGFyZ2V0ID0gJHRoaXM7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRyb3Bkb3duID0gJHRoaXM7XG4gICAgICAgICAgICB0YXJnZXQgPSBTKCdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnPVwiJyArIGRyb3Bkb3duLmF0dHIoJ2lkJykgKyAnXCJdJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHNldHRpbmdzID0gdGFyZ2V0LmRhdGEoc2VsZi5hdHRyX25hbWUodHJ1ZSkgKyAnLWluaXQnKSB8fCBzZWxmLnNldHRpbmdzO1xuXG4gICAgICAgICAgaWYgKFMoZS5jdXJyZW50VGFyZ2V0KS5kYXRhKHNlbGYuZGF0YV9hdHRyKCkpICYmIHNldHRpbmdzLmlzX2hvdmVyKSB7XG4gICAgICAgICAgICBzZWxmLmNsb3NlYWxsLmNhbGwoc2VsZik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNldHRpbmdzLmlzX2hvdmVyKSB7XG4gICAgICAgICAgICBzZWxmLm9wZW4uYXBwbHkoc2VsZiwgW2Ryb3Bkb3duLCB0YXJnZXRdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignbW91c2VsZWF2ZS5mbmR0bi5kcm9wZG93bicsICdbJyArIHRoaXMuYXR0cl9uYW1lKCkgKyAnXSwgWycgKyB0aGlzLmF0dHJfbmFtZSgpICsgJy1jb250ZW50XScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgdmFyICR0aGlzID0gUyh0aGlzKTtcbiAgICAgICAgICB2YXIgc2V0dGluZ3M7XG5cbiAgICAgICAgICBpZiAoJHRoaXMuZGF0YShzZWxmLmRhdGFfYXR0cigpKSkge1xuICAgICAgICAgICAgICBzZXR0aW5ncyA9ICR0aGlzLmRhdGEoc2VsZi5kYXRhX2F0dHIodHJ1ZSkgKyAnLWluaXQnKSB8fCBzZWxmLnNldHRpbmdzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciB0YXJnZXQgICA9IFMoJ1snICsgc2VsZi5hdHRyX25hbWUoKSArICc9XCInICsgUyh0aGlzKS5hdHRyKCdpZCcpICsgJ1wiXScpLFxuICAgICAgICAgICAgICAgICAgc2V0dGluZ3MgPSB0YXJnZXQuZGF0YShzZWxmLmF0dHJfbmFtZSh0cnVlKSArICctaW5pdCcpIHx8IHNlbGYuc2V0dGluZ3M7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoJHRoaXMuZGF0YShzZWxmLmRhdGFfYXR0cigpKSkge1xuICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuaXNfaG92ZXIpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmNsb3NlLmNhbGwoc2VsZiwgUygnIycgKyAkdGhpcy5kYXRhKHNlbGYuZGF0YV9hdHRyKCkpKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5pc19ob3Zlcikge1xuICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UuY2FsbChzZWxmLCAkdGhpcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LmJpbmQodGhpcyksIHNldHRpbmdzLmhvdmVyX3RpbWVvdXQpO1xuICAgICAgICB9KVxuICAgICAgICAub24oJ2NsaWNrLmZuZHRuLmRyb3Bkb3duJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICB2YXIgcGFyZW50ID0gUyhlLnRhcmdldCkuY2xvc2VzdCgnWycgKyBzZWxmLmF0dHJfbmFtZSgpICsgJy1jb250ZW50XScpO1xuICAgICAgICAgIHZhciBsaW5rcyAgPSBwYXJlbnQuZmluZCgnYScpO1xuXG4gICAgICAgICAgaWYgKGxpbmtzLmxlbmd0aCA+IDAgJiYgcGFyZW50LmF0dHIoJ2FyaWEtYXV0b2Nsb3NlJykgIT09ICdmYWxzZScpIHtcbiAgICAgICAgICAgICAgc2VsZi5jbG9zZS5jYWxsKHNlbGYsIFMoJ1snICsgc2VsZi5hdHRyX25hbWUoKSArICctY29udGVudF0nKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGUudGFyZ2V0ICE9PSBkb2N1bWVudCAmJiAhJC5jb250YWlucyhkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGUudGFyZ2V0KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChTKGUudGFyZ2V0KS5jbG9zZXN0KCdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnXScpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIShTKGUudGFyZ2V0KS5kYXRhKCdyZXZlYWxJZCcpKSAmJlxuICAgICAgICAgICAgKHBhcmVudC5sZW5ndGggPiAwICYmIChTKGUudGFyZ2V0KS5pcygnWycgKyBzZWxmLmF0dHJfbmFtZSgpICsgJy1jb250ZW50XScpIHx8XG4gICAgICAgICAgICAgICQuY29udGFpbnMocGFyZW50LmZpcnN0KClbMF0sIGUudGFyZ2V0KSkpKSB7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlbGYuY2xvc2UuY2FsbChzZWxmLCBTKCdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnLWNvbnRlbnRdJykpO1xuICAgICAgICB9KVxuICAgICAgICAub24oJ29wZW5lZC5mbmR0bi5kcm9wZG93bicsICdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnLWNvbnRlbnRdJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNlbGYuc2V0dGluZ3Mub3BlbmVkLmNhbGwodGhpcyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignY2xvc2VkLmZuZHRuLmRyb3Bkb3duJywgJ1snICsgc2VsZi5hdHRyX25hbWUoKSArICctY29udGVudF0nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2VsZi5zZXR0aW5ncy5jbG9zZWQuY2FsbCh0aGlzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIFMod2luZG93KVxuICAgICAgICAub2ZmKCcuZHJvcGRvd24nKVxuICAgICAgICAub24oJ3Jlc2l6ZS5mbmR0bi5kcm9wZG93bicsIHNlbGYudGhyb3R0bGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNlbGYucmVzaXplLmNhbGwoc2VsZik7XG4gICAgICAgIH0sIDUwKSk7XG5cbiAgICAgIHRoaXMucmVzaXplKCk7XG4gICAgfSxcblxuICAgIGNsb3NlIDogZnVuY3Rpb24gKGRyb3Bkb3duKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICBkcm9wZG93bi5lYWNoKGZ1bmN0aW9uIChpZHgpIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsX3RhcmdldCA9ICQoJ1snICsgc2VsZi5hdHRyX25hbWUoKSArICc9JyArIGRyb3Bkb3duW2lkeF0uaWQgKyAnXScpIHx8ICQoJ2FyaWEtY29udHJvbHM9JyArIGRyb3Bkb3duW2lkeF0uaWQgKyAnXScpO1xuICAgICAgICBvcmlnaW5hbF90YXJnZXQuYXR0cignYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuICAgICAgICBpZiAoc2VsZi5TKHRoaXMpLmhhc0NsYXNzKHNlbGYuc2V0dGluZ3MuYWN0aXZlX2NsYXNzKSkge1xuICAgICAgICAgIHNlbGYuUyh0aGlzKVxuICAgICAgICAgICAgLmNzcyhGb3VuZGF0aW9uLnJ0bCA/ICdyaWdodCcgOiAnbGVmdCcsICctOTk5OTlweCcpXG4gICAgICAgICAgICAuYXR0cignYXJpYS1oaWRkZW4nLCAndHJ1ZScpXG4gICAgICAgICAgICAucmVtb3ZlQ2xhc3Moc2VsZi5zZXR0aW5ncy5hY3RpdmVfY2xhc3MpXG4gICAgICAgICAgICAucHJldignWycgKyBzZWxmLmF0dHJfbmFtZSgpICsgJ10nKVxuICAgICAgICAgICAgLnJlbW92ZUNsYXNzKHNlbGYuc2V0dGluZ3MuYWN0aXZlX2NsYXNzKVxuICAgICAgICAgICAgLnJlbW92ZURhdGEoJ3RhcmdldCcpO1xuXG4gICAgICAgICAgc2VsZi5TKHRoaXMpLnRyaWdnZXIoJ2Nsb3NlZC5mbmR0bi5kcm9wZG93bicsIFtkcm9wZG93bl0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGRyb3Bkb3duLnJlbW92ZUNsYXNzKCdmLW9wZW4tJyArIHRoaXMuYXR0cl9uYW1lKHRydWUpKTtcbiAgICB9LFxuXG4gICAgY2xvc2VhbGwgOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAkLmVhY2goc2VsZi5TKCcuZi1vcGVuLScgKyB0aGlzLmF0dHJfbmFtZSh0cnVlKSksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5jbG9zZS5jYWxsKHNlbGYsIHNlbGYuUyh0aGlzKSk7XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgb3BlbiA6IGZ1bmN0aW9uIChkcm9wZG93biwgdGFyZ2V0KSB7XG4gICAgICB0aGlzXG4gICAgICAgIC5jc3MoZHJvcGRvd25cbiAgICAgICAgLmFkZENsYXNzKHRoaXMuc2V0dGluZ3MuYWN0aXZlX2NsYXNzKSwgdGFyZ2V0KTtcbiAgICAgIGRyb3Bkb3duLnByZXYoJ1snICsgdGhpcy5hdHRyX25hbWUoKSArICddJykuYWRkQ2xhc3ModGhpcy5zZXR0aW5ncy5hY3RpdmVfY2xhc3MpO1xuICAgICAgZHJvcGRvd24uZGF0YSgndGFyZ2V0JywgdGFyZ2V0LmdldCgwKSkudHJpZ2dlcignb3BlbmVkLmZuZHRuLmRyb3Bkb3duJywgW2Ryb3Bkb3duLCB0YXJnZXRdKTtcbiAgICAgIGRyb3Bkb3duLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7XG4gICAgICB0YXJnZXQuYXR0cignYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG4gICAgICBkcm9wZG93bi5mb2N1cygpO1xuICAgICAgZHJvcGRvd24uYWRkQ2xhc3MoJ2Ytb3Blbi0nICsgdGhpcy5hdHRyX25hbWUodHJ1ZSkpO1xuICAgIH0sXG5cbiAgICBkYXRhX2F0dHIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAodGhpcy5uYW1lc3BhY2UubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2UgKyAnLScgKyB0aGlzLm5hbWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfSxcblxuICAgIHRvZ2dsZSA6IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgIGlmICh0YXJnZXQuaGFzQ2xhc3ModGhpcy5zZXR0aW5ncy5kaXNhYmxlZF9jbGFzcykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGRyb3Bkb3duID0gdGhpcy5TKCcjJyArIHRhcmdldC5kYXRhKHRoaXMuZGF0YV9hdHRyKCkpKTtcbiAgICAgIGlmIChkcm9wZG93bi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gTm8gZHJvcGRvd24gZm91bmQsIG5vdCBjb250aW51aW5nXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jbG9zZS5jYWxsKHRoaXMsIHRoaXMuUygnWycgKyB0aGlzLmF0dHJfbmFtZSgpICsgJy1jb250ZW50XScpLm5vdChkcm9wZG93bikpO1xuXG4gICAgICBpZiAoZHJvcGRvd24uaGFzQ2xhc3ModGhpcy5zZXR0aW5ncy5hY3RpdmVfY2xhc3MpKSB7XG4gICAgICAgIHRoaXMuY2xvc2UuY2FsbCh0aGlzLCBkcm9wZG93bik7XG4gICAgICAgIGlmIChkcm9wZG93bi5kYXRhKCd0YXJnZXQnKSAhPT0gdGFyZ2V0LmdldCgwKSkge1xuICAgICAgICAgIHRoaXMub3Blbi5jYWxsKHRoaXMsIGRyb3Bkb3duLCB0YXJnZXQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9wZW4uY2FsbCh0aGlzLCBkcm9wZG93biwgdGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVzaXplIDogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGRyb3Bkb3duID0gdGhpcy5TKCdbJyArIHRoaXMuYXR0cl9uYW1lKCkgKyAnLWNvbnRlbnRdLm9wZW4nKTtcbiAgICAgIHZhciB0YXJnZXQgPSAkKGRyb3Bkb3duLmRhdGEoXCJ0YXJnZXRcIikpO1xuXG4gICAgICBpZiAoZHJvcGRvd24ubGVuZ3RoICYmIHRhcmdldC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5jc3MoZHJvcGRvd24sIHRhcmdldCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGNzcyA6IGZ1bmN0aW9uIChkcm9wZG93biwgdGFyZ2V0KSB7XG4gICAgICB2YXIgbGVmdF9vZmZzZXQgPSBNYXRoLm1heCgodGFyZ2V0LndpZHRoKCkgLSBkcm9wZG93bi53aWR0aCgpKSAvIDIsIDgpLFxuICAgICAgICAgIHNldHRpbmdzID0gdGFyZ2V0LmRhdGEodGhpcy5hdHRyX25hbWUodHJ1ZSkgKyAnLWluaXQnKSB8fCB0aGlzLnNldHRpbmdzLFxuICAgICAgICAgIHBhcmVudE92ZXJmbG93ID0gZHJvcGRvd24ucGFyZW50KCkuY3NzKCdvdmVyZmxvdy15JykgfHwgZHJvcGRvd24ucGFyZW50KCkuY3NzKCdvdmVyZmxvdycpO1xuXG4gICAgICB0aGlzLmNsZWFyX2lkeCgpO1xuXG5cblxuICAgICAgaWYgKHRoaXMuc21hbGwoKSkge1xuICAgICAgICB2YXIgcCA9IHRoaXMuZGlycy5ib3R0b20uY2FsbChkcm9wZG93biwgdGFyZ2V0LCBzZXR0aW5ncyk7XG5cbiAgICAgICAgZHJvcGRvd24uYXR0cignc3R5bGUnLCAnJykucmVtb3ZlQ2xhc3MoJ2Ryb3AtbGVmdCBkcm9wLXJpZ2h0IGRyb3AtdG9wJykuY3NzKHtcbiAgICAgICAgICBwb3NpdGlvbiA6ICdhYnNvbHV0ZScsXG4gICAgICAgICAgd2lkdGggOiAnOTUlJyxcbiAgICAgICAgICAnbWF4LXdpZHRoJyA6ICdub25lJyxcbiAgICAgICAgICB0b3AgOiBwLnRvcFxuICAgICAgICB9KTtcblxuICAgICAgICBkcm9wZG93bi5jc3MoRm91bmRhdGlvbi5ydGwgPyAncmlnaHQnIDogJ2xlZnQnLCBsZWZ0X29mZnNldCk7XG4gICAgICB9XG4gICAgICAvLyBkZXRlY3QgaWYgZHJvcGRvd24gaXMgaW4gYW4gb3ZlcmZsb3cgY29udGFpbmVyXG4gICAgICBlbHNlIGlmIChwYXJlbnRPdmVyZmxvdyAhPT0gJ3Zpc2libGUnKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0YXJnZXRbMF0ub2Zmc2V0VG9wICsgdGFyZ2V0WzBdLm9mZnNldEhlaWdodDtcblxuICAgICAgICBkcm9wZG93bi5hdHRyKCdzdHlsZScsICcnKS5jc3Moe1xuICAgICAgICAgIHBvc2l0aW9uIDogJ2Fic29sdXRlJyxcbiAgICAgICAgICB0b3AgOiBvZmZzZXRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZHJvcGRvd24uY3NzKEZvdW5kYXRpb24ucnRsID8gJ3JpZ2h0JyA6ICdsZWZ0JywgbGVmdF9vZmZzZXQpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG5cbiAgICAgICAgdGhpcy5zdHlsZShkcm9wZG93biwgdGFyZ2V0LCBzZXR0aW5ncyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkcm9wZG93bjtcbiAgICB9LFxuXG4gICAgc3R5bGUgOiBmdW5jdGlvbiAoZHJvcGRvd24sIHRhcmdldCwgc2V0dGluZ3MpIHtcbiAgICAgIHZhciBjc3MgPSAkLmV4dGVuZCh7cG9zaXRpb24gOiAnYWJzb2x1dGUnfSxcbiAgICAgICAgdGhpcy5kaXJzW3NldHRpbmdzLmFsaWduXS5jYWxsKGRyb3Bkb3duLCB0YXJnZXQsIHNldHRpbmdzKSk7XG5cbiAgICAgIGRyb3Bkb3duLmF0dHIoJ3N0eWxlJywgJycpLmNzcyhjc3MpO1xuICAgIH0sXG5cbiAgICAvLyByZXR1cm4gQ1NTIHByb3BlcnR5IG9iamVjdFxuICAgIC8vIGB0aGlzYCBpcyB0aGUgZHJvcGRvd25cbiAgICBkaXJzIDoge1xuICAgICAgLy8gQ2FsY3VsYXRlIHRhcmdldCBvZmZzZXRcbiAgICAgIF9iYXNlIDogZnVuY3Rpb24gKHQsIHMpIHtcbiAgICAgICAgdmFyIG9fcCA9IHRoaXMub2Zmc2V0UGFyZW50KCksXG4gICAgICAgICAgICBvID0gb19wLm9mZnNldCgpLFxuICAgICAgICAgICAgcCA9IHQub2Zmc2V0KCk7XG5cbiAgICAgICAgcC50b3AgLT0gby50b3A7XG4gICAgICAgIHAubGVmdCAtPSBvLmxlZnQ7XG5cbiAgICAgICAgLy9zZXQgc29tZSBmbGFncyBvbiB0aGUgcCBvYmplY3QgdG8gcGFzcyBhbG9uZ1xuICAgICAgICBwLm1pc3NSaWdodCA9IGZhbHNlO1xuICAgICAgICBwLm1pc3NUb3AgPSBmYWxzZTtcbiAgICAgICAgcC5taXNzTGVmdCA9IGZhbHNlO1xuICAgICAgICBwLmxlZnRSaWdodEZsYWcgPSBmYWxzZTtcblxuICAgICAgICAvL2xldHMgc2VlIGlmIHRoZSBwYW5lbCB3aWxsIGJlIG9mZiB0aGUgc2NyZWVuXG4gICAgICAgIC8vZ2V0IHRoZSBhY3R1YWwgd2lkdGggb2YgdGhlIHBhZ2UgYW5kIHN0b3JlIGl0XG4gICAgICAgIHZhciBhY3R1YWxCb2R5V2lkdGg7XG4gICAgICAgIHZhciB3aW5kb3dXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgICBcbiAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3JvdycpWzBdKSB7XG4gICAgICAgICAgYWN0dWFsQm9keVdpZHRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncm93JylbMF0uY2xpZW50V2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWN0dWFsQm9keVdpZHRoID0gd2luZG93V2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYWN0dWFsTWFyZ2luV2lkdGggPSAod2luZG93V2lkdGggLSBhY3R1YWxCb2R5V2lkdGgpIC8gMjtcbiAgICAgICAgdmFyIGFjdHVhbEJvdW5kYXJ5ID0gYWN0dWFsQm9keVdpZHRoO1xuXG4gICAgICAgIGlmICghdGhpcy5oYXNDbGFzcygnbWVnYScpICYmICFzLmlnbm9yZV9yZXBvc2l0aW9uaW5nKSB7XG4gICAgICAgICAgdmFyIG91dGVyV2lkdGggPSB0aGlzLm91dGVyV2lkdGgoKTtcbiAgICAgICAgICB2YXIgb19sZWZ0ID0gdC5vZmZzZXQoKS5sZWZ0O1xuXHRcdCAgXG4gICAgICAgICAgLy9taXNzIHRvcFxuICAgICAgICAgIGlmICh0Lm9mZnNldCgpLnRvcCA8PSB0aGlzLm91dGVySGVpZ2h0KCkpIHtcbiAgICAgICAgICAgIHAubWlzc1RvcCA9IHRydWU7XG4gICAgICAgICAgICBhY3R1YWxCb3VuZGFyeSA9IHdpbmRvd1dpZHRoIC0gYWN0dWFsTWFyZ2luV2lkdGg7XG4gICAgICAgICAgICBwLmxlZnRSaWdodEZsYWcgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vbWlzcyByaWdodFxuICAgICAgICAgIGlmIChvX2xlZnQgKyBvdXRlcldpZHRoID4gb19sZWZ0ICsgYWN0dWFsTWFyZ2luV2lkdGggJiYgb19sZWZ0IC0gYWN0dWFsTWFyZ2luV2lkdGggPiBvdXRlcldpZHRoKSB7XG4gICAgICAgICAgICBwLm1pc3NSaWdodCA9IHRydWU7XG4gICAgICAgICAgICBwLm1pc3NMZWZ0ID0gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy9taXNzIGxlZnRcbiAgICAgICAgICBpZiAob19sZWZ0IC0gb3V0ZXJXaWR0aCA8PSAwKSB7XG4gICAgICAgICAgICBwLm1pc3NMZWZ0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHAubWlzc1JpZ2h0ID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHA7XG4gICAgICB9LFxuXG4gICAgICB0b3AgOiBmdW5jdGlvbiAodCwgcykge1xuICAgICAgICB2YXIgc2VsZiA9IEZvdW5kYXRpb24ubGlicy5kcm9wZG93bixcbiAgICAgICAgICAgIHAgPSBzZWxmLmRpcnMuX2Jhc2UuY2FsbCh0aGlzLCB0LCBzKTtcblxuICAgICAgICB0aGlzLmFkZENsYXNzKCdkcm9wLXRvcCcpO1xuXG4gICAgICAgIGlmIChwLm1pc3NUb3AgPT0gdHJ1ZSkge1xuICAgICAgICAgIHAudG9wID0gcC50b3AgKyB0Lm91dGVySGVpZ2h0KCkgKyB0aGlzLm91dGVySGVpZ2h0KCk7XG4gICAgICAgICAgdGhpcy5yZW1vdmVDbGFzcygnZHJvcC10b3AnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwLm1pc3NSaWdodCA9PSB0cnVlKSB7XG4gICAgICAgICAgcC5sZWZ0ID0gcC5sZWZ0IC0gdGhpcy5vdXRlcldpZHRoKCkgKyB0Lm91dGVyV2lkdGgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0Lm91dGVyV2lkdGgoKSA8IHRoaXMub3V0ZXJXaWR0aCgpIHx8IHNlbGYuc21hbGwoKSB8fCB0aGlzLmhhc0NsYXNzKHMubWVnYV9tZW51KSkge1xuICAgICAgICAgIHNlbGYuYWRqdXN0X3BpcCh0aGlzLCB0LCBzLCBwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChGb3VuZGF0aW9uLnJ0bCkge1xuICAgICAgICAgIHJldHVybiB7bGVmdCA6IHAubGVmdCAtIHRoaXMub3V0ZXJXaWR0aCgpICsgdC5vdXRlcldpZHRoKCksXG4gICAgICAgICAgICB0b3AgOiBwLnRvcCAtIHRoaXMub3V0ZXJIZWlnaHQoKX07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge2xlZnQgOiBwLmxlZnQsIHRvcCA6IHAudG9wIC0gdGhpcy5vdXRlckhlaWdodCgpfTtcbiAgICAgIH0sXG5cbiAgICAgIGJvdHRvbSA6IGZ1bmN0aW9uICh0LCBzKSB7XG4gICAgICAgIHZhciBzZWxmID0gRm91bmRhdGlvbi5saWJzLmRyb3Bkb3duLFxuICAgICAgICAgICAgcCA9IHNlbGYuZGlycy5fYmFzZS5jYWxsKHRoaXMsIHQsIHMpO1xuXG4gICAgICAgIGlmIChwLm1pc3NSaWdodCA9PSB0cnVlKSB7XG4gICAgICAgICAgcC5sZWZ0ID0gcC5sZWZ0IC0gdGhpcy5vdXRlcldpZHRoKCkgKyB0Lm91dGVyV2lkdGgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0Lm91dGVyV2lkdGgoKSA8IHRoaXMub3V0ZXJXaWR0aCgpIHx8IHNlbGYuc21hbGwoKSB8fCB0aGlzLmhhc0NsYXNzKHMubWVnYV9tZW51KSkge1xuICAgICAgICAgIHNlbGYuYWRqdXN0X3BpcCh0aGlzLCB0LCBzLCBwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxmLnJ0bCkge1xuICAgICAgICAgIHJldHVybiB7bGVmdCA6IHAubGVmdCAtIHRoaXMub3V0ZXJXaWR0aCgpICsgdC5vdXRlcldpZHRoKCksIHRvcCA6IHAudG9wICsgdC5vdXRlckhlaWdodCgpfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7bGVmdCA6IHAubGVmdCwgdG9wIDogcC50b3AgKyB0Lm91dGVySGVpZ2h0KCl9O1xuICAgICAgfSxcblxuICAgICAgbGVmdCA6IGZ1bmN0aW9uICh0LCBzKSB7XG4gICAgICAgIHZhciBwID0gRm91bmRhdGlvbi5saWJzLmRyb3Bkb3duLmRpcnMuX2Jhc2UuY2FsbCh0aGlzLCB0LCBzKTtcblxuICAgICAgICB0aGlzLmFkZENsYXNzKCdkcm9wLWxlZnQnKTtcblxuICAgICAgICBpZiAocC5taXNzTGVmdCA9PSB0cnVlKSB7XG4gICAgICAgICAgcC5sZWZ0ID0gIHAubGVmdCArIHRoaXMub3V0ZXJXaWR0aCgpO1xuICAgICAgICAgIHAudG9wID0gcC50b3AgKyB0Lm91dGVySGVpZ2h0KCk7XG4gICAgICAgICAgdGhpcy5yZW1vdmVDbGFzcygnZHJvcC1sZWZ0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge2xlZnQgOiBwLmxlZnQgLSB0aGlzLm91dGVyV2lkdGgoKSwgdG9wIDogcC50b3B9O1xuICAgICAgfSxcblxuICAgICAgcmlnaHQgOiBmdW5jdGlvbiAodCwgcykge1xuICAgICAgICB2YXIgcCA9IEZvdW5kYXRpb24ubGlicy5kcm9wZG93bi5kaXJzLl9iYXNlLmNhbGwodGhpcywgdCwgcyk7XG5cbiAgICAgICAgdGhpcy5hZGRDbGFzcygnZHJvcC1yaWdodCcpO1xuXG4gICAgICAgIGlmIChwLm1pc3NSaWdodCA9PSB0cnVlKSB7XG4gICAgICAgICAgcC5sZWZ0ID0gcC5sZWZ0IC0gdGhpcy5vdXRlcldpZHRoKCk7XG4gICAgICAgICAgcC50b3AgPSBwLnRvcCArIHQub3V0ZXJIZWlnaHQoKTtcbiAgICAgICAgICB0aGlzLnJlbW92ZUNsYXNzKCdkcm9wLXJpZ2h0Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcC50cmlnZ2VyZWRSaWdodCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2VsZiA9IEZvdW5kYXRpb24ubGlicy5kcm9wZG93bjtcblxuICAgICAgICBpZiAodC5vdXRlcldpZHRoKCkgPCB0aGlzLm91dGVyV2lkdGgoKSB8fCBzZWxmLnNtYWxsKCkgfHwgdGhpcy5oYXNDbGFzcyhzLm1lZ2FfbWVudSkpIHtcbiAgICAgICAgICBzZWxmLmFkanVzdF9waXAodGhpcywgdCwgcywgcCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge2xlZnQgOiBwLmxlZnQgKyB0Lm91dGVyV2lkdGgoKSwgdG9wIDogcC50b3B9O1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBJbnNlcnQgcnVsZSB0byBzdHlsZSBwc3VlZG8gZWxlbWVudHNcbiAgICBhZGp1c3RfcGlwIDogZnVuY3Rpb24gKGRyb3Bkb3duLCB0YXJnZXQsIHNldHRpbmdzLCBwb3NpdGlvbikge1xuICAgICAgdmFyIHNoZWV0ID0gRm91bmRhdGlvbi5zdHlsZXNoZWV0LFxuICAgICAgICAgIHBpcF9vZmZzZXRfYmFzZSA9IDg7XG5cbiAgICAgIGlmIChkcm9wZG93bi5oYXNDbGFzcyhzZXR0aW5ncy5tZWdhX2NsYXNzKSkge1xuICAgICAgICBwaXBfb2Zmc2V0X2Jhc2UgPSBwb3NpdGlvbi5sZWZ0ICsgKHRhcmdldC5vdXRlcldpZHRoKCkgLyAyKSAtIDg7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc21hbGwoKSkge1xuICAgICAgICBwaXBfb2Zmc2V0X2Jhc2UgKz0gcG9zaXRpb24ubGVmdCAtIDg7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucnVsZV9pZHggPSBzaGVldC5jc3NSdWxlcy5sZW5ndGg7XG5cbiAgICAgIC8vZGVmYXVsdFxuICAgICAgdmFyIHNlbF9iZWZvcmUgPSAnLmYtZHJvcGRvd24ub3BlbjpiZWZvcmUnLFxuICAgICAgICAgIHNlbF9hZnRlciAgPSAnLmYtZHJvcGRvd24ub3BlbjphZnRlcicsXG4gICAgICAgICAgY3NzX2JlZm9yZSA9ICdsZWZ0OiAnICsgcGlwX29mZnNldF9iYXNlICsgJ3B4OycsXG4gICAgICAgICAgY3NzX2FmdGVyICA9ICdsZWZ0OiAnICsgKHBpcF9vZmZzZXRfYmFzZSAtIDEpICsgJ3B4Oyc7XG5cbiAgICAgIGlmIChwb3NpdGlvbi5taXNzUmlnaHQgPT0gdHJ1ZSkge1xuICAgICAgICBwaXBfb2Zmc2V0X2Jhc2UgPSBkcm9wZG93bi5vdXRlcldpZHRoKCkgLSAyMztcbiAgICAgICAgc2VsX2JlZm9yZSA9ICcuZi1kcm9wZG93bi5vcGVuOmJlZm9yZScsXG4gICAgICAgIHNlbF9hZnRlciAgPSAnLmYtZHJvcGRvd24ub3BlbjphZnRlcicsXG4gICAgICAgIGNzc19iZWZvcmUgPSAnbGVmdDogJyArIHBpcF9vZmZzZXRfYmFzZSArICdweDsnLFxuICAgICAgICBjc3NfYWZ0ZXIgID0gJ2xlZnQ6ICcgKyAocGlwX29mZnNldF9iYXNlIC0gMSkgKyAncHg7JztcbiAgICAgIH1cblxuICAgICAgLy9qdXN0IGEgY2FzZSB3aGVyZSByaWdodCBpcyBmaXJlZCwgYnV0IGl0cyBub3QgbWlzc2luZyByaWdodFxuICAgICAgaWYgKHBvc2l0aW9uLnRyaWdnZXJlZFJpZ2h0ID09IHRydWUpIHtcbiAgICAgICAgc2VsX2JlZm9yZSA9ICcuZi1kcm9wZG93bi5vcGVuOmJlZm9yZScsXG4gICAgICAgIHNlbF9hZnRlciAgPSAnLmYtZHJvcGRvd24ub3BlbjphZnRlcicsXG4gICAgICAgIGNzc19iZWZvcmUgPSAnbGVmdDotMTJweDsnLFxuICAgICAgICBjc3NfYWZ0ZXIgID0gJ2xlZnQ6LTE0cHg7JztcbiAgICAgIH1cblxuICAgICAgaWYgKHNoZWV0Lmluc2VydFJ1bGUpIHtcbiAgICAgICAgc2hlZXQuaW5zZXJ0UnVsZShbc2VsX2JlZm9yZSwgJ3snLCBjc3NfYmVmb3JlLCAnfSddLmpvaW4oJyAnKSwgdGhpcy5ydWxlX2lkeCk7XG4gICAgICAgIHNoZWV0Lmluc2VydFJ1bGUoW3NlbF9hZnRlciwgJ3snLCBjc3NfYWZ0ZXIsICd9J10uam9pbignICcpLCB0aGlzLnJ1bGVfaWR4ICsgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaGVldC5hZGRSdWxlKHNlbF9iZWZvcmUsIGNzc19iZWZvcmUsIHRoaXMucnVsZV9pZHgpO1xuICAgICAgICBzaGVldC5hZGRSdWxlKHNlbF9hZnRlciwgY3NzX2FmdGVyLCB0aGlzLnJ1bGVfaWR4ICsgMSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIFJlbW92ZSBvbGQgZHJvcGRvd24gcnVsZSBpbmRleFxuICAgIGNsZWFyX2lkeCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzaGVldCA9IEZvdW5kYXRpb24uc3R5bGVzaGVldDtcblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLnJ1bGVfaWR4ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzaGVldC5kZWxldGVSdWxlKHRoaXMucnVsZV9pZHgpO1xuICAgICAgICBzaGVldC5kZWxldGVSdWxlKHRoaXMucnVsZV9pZHgpO1xuICAgICAgICBkZWxldGUgdGhpcy5ydWxlX2lkeDtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc21hbGwgOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbWF0Y2hNZWRpYShGb3VuZGF0aW9uLm1lZGlhX3F1ZXJpZXMuc21hbGwpLm1hdGNoZXMgJiZcbiAgICAgICAgIW1hdGNoTWVkaWEoRm91bmRhdGlvbi5tZWRpYV9xdWVyaWVzLm1lZGl1bSkubWF0Y2hlcztcbiAgICB9LFxuXG4gICAgb2ZmIDogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5TKHRoaXMuc2NvcGUpLm9mZignLmZuZHRuLmRyb3Bkb3duJyk7XG4gICAgICB0aGlzLlMoJ2h0bWwsIGJvZHknKS5vZmYoJy5mbmR0bi5kcm9wZG93bicpO1xuICAgICAgdGhpcy5TKHdpbmRvdykub2ZmKCcuZm5kdG4uZHJvcGRvd24nKTtcbiAgICAgIHRoaXMuUygnW2RhdGEtZHJvcGRvd24tY29udGVudF0nKS5vZmYoJy5mbmR0bi5kcm9wZG93bicpO1xuICAgIH0sXG5cbiAgICByZWZsb3cgOiBmdW5jdGlvbiAoKSB7fVxuICB9O1xufShqUXVlcnksIHdpbmRvdywgd2luZG93LmRvY3VtZW50KSk7XG4iLCIvKlxuICogRm91bmRhdGlvbiBSZXNwb25zaXZlIExpYnJhcnlcbiAqIGh0dHA6Ly9mb3VuZGF0aW9uLnp1cmIuY29tXG4gKiBDb3B5cmlnaHQgMjAxNSwgWlVSQlxuICogRnJlZSB0byB1c2UgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiovXG5cbihmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgaGVhZGVyX2hlbHBlcnMgPSBmdW5jdGlvbiAoY2xhc3NfYXJyYXkpIHtcbiAgICB2YXIgaGVhZCA9ICQoJ2hlYWQnKTtcbiAgICBoZWFkLnByZXBlbmQoJC5tYXAoY2xhc3NfYXJyYXksIGZ1bmN0aW9uIChjbGFzc19uYW1lKSB7XG4gICAgICBpZiAoaGVhZC5oYXMoJy4nICsgY2xhc3NfbmFtZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAnPG1ldGEgY2xhc3M9XCInICsgY2xhc3NfbmFtZSArICdcIiAvPic7XG4gICAgICB9XG4gICAgfSkpO1xuICB9O1xuXG4gIGhlYWRlcl9oZWxwZXJzKFtcbiAgICAnZm91bmRhdGlvbi1tcS1zbWFsbCcsXG4gICAgJ2ZvdW5kYXRpb24tbXEtc21hbGwtb25seScsXG4gICAgJ2ZvdW5kYXRpb24tbXEtbWVkaXVtJyxcbiAgICAnZm91bmRhdGlvbi1tcS1tZWRpdW0tb25seScsXG4gICAgJ2ZvdW5kYXRpb24tbXEtbGFyZ2UnLFxuICAgICdmb3VuZGF0aW9uLW1xLWxhcmdlLW9ubHknLFxuICAgICdmb3VuZGF0aW9uLW1xLXhsYXJnZScsXG4gICAgJ2ZvdW5kYXRpb24tbXEteGxhcmdlLW9ubHknLFxuICAgICdmb3VuZGF0aW9uLW1xLXh4bGFyZ2UnLFxuICAgICdmb3VuZGF0aW9uLWRhdGEtYXR0cmlidXRlLW5hbWVzcGFjZSddKTtcblxuICAvLyBFbmFibGUgRmFzdENsaWNrIGlmIHByZXNlbnRcblxuICAkKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIEZhc3RDbGljayAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIERvbid0IGF0dGFjaCB0byBib2R5IGlmIHVuZGVmaW5lZFxuICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudC5ib2R5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBGYXN0Q2xpY2suYXR0YWNoKGRvY3VtZW50LmJvZHkpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gcHJpdmF0ZSBGYXN0IFNlbGVjdG9yIHdyYXBwZXIsXG4gIC8vIHJldHVybnMgalF1ZXJ5IG9iamVjdC4gT25seSB1c2Ugd2hlcmVcbiAgLy8gZ2V0RWxlbWVudEJ5SWQgaXMgbm90IGF2YWlsYWJsZS5cbiAgdmFyIFMgPSBmdW5jdGlvbiAoc2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICBpZiAodHlwZW9mIHNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGNvbnQ7XG4gICAgICAgIGlmIChjb250ZXh0LmpxdWVyeSkge1xuICAgICAgICAgIGNvbnQgPSBjb250ZXh0WzBdO1xuICAgICAgICAgIGlmICghY29udCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnQgPSBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAkKGNvbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICQoc2VsZWN0b3IsIGNvbnRleHQpO1xuICB9O1xuXG4gIC8vIE5hbWVzcGFjZSBmdW5jdGlvbnMuXG5cbiAgdmFyIGF0dHJfbmFtZSA9IGZ1bmN0aW9uIChpbml0KSB7XG4gICAgdmFyIGFyciA9IFtdO1xuICAgIGlmICghaW5pdCkge1xuICAgICAgYXJyLnB1c2goJ2RhdGEnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubmFtZXNwYWNlLmxlbmd0aCA+IDApIHtcbiAgICAgIGFyci5wdXNoKHRoaXMubmFtZXNwYWNlKTtcbiAgICB9XG4gICAgYXJyLnB1c2godGhpcy5uYW1lKTtcblxuICAgIHJldHVybiBhcnIuam9pbignLScpO1xuICB9O1xuXG4gIHZhciBhZGRfbmFtZXNwYWNlID0gZnVuY3Rpb24gKHN0cikge1xuICAgIHZhciBwYXJ0cyA9IHN0ci5zcGxpdCgnLScpLFxuICAgICAgICBpID0gcGFydHMubGVuZ3RoLFxuICAgICAgICBhcnIgPSBbXTtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGlmIChpICE9PSAwKSB7XG4gICAgICAgIGFyci5wdXNoKHBhcnRzW2ldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLm5hbWVzcGFjZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXJyLnB1c2godGhpcy5uYW1lc3BhY2UsIHBhcnRzW2ldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhcnIucHVzaChwYXJ0c1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYXJyLnJldmVyc2UoKS5qb2luKCctJyk7XG4gIH07XG5cbiAgLy8gRXZlbnQgYmluZGluZyBhbmQgZGF0YS1vcHRpb25zIHVwZGF0aW5nLlxuXG4gIHZhciBiaW5kaW5ncyA9IGZ1bmN0aW9uIChtZXRob2QsIG9wdGlvbnMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGJpbmQgPSBmdW5jdGlvbigpe1xuICAgICAgICAgIHZhciAkdGhpcyA9IFModGhpcyksXG4gICAgICAgICAgICAgIHNob3VsZF9iaW5kX2V2ZW50cyA9ICEkdGhpcy5kYXRhKHNlbGYuYXR0cl9uYW1lKHRydWUpICsgJy1pbml0Jyk7XG4gICAgICAgICAgJHRoaXMuZGF0YShzZWxmLmF0dHJfbmFtZSh0cnVlKSArICctaW5pdCcsICQuZXh0ZW5kKHt9LCBzZWxmLnNldHRpbmdzLCAob3B0aW9ucyB8fCBtZXRob2QpLCBzZWxmLmRhdGFfb3B0aW9ucygkdGhpcykpKTtcblxuICAgICAgICAgIGlmIChzaG91bGRfYmluZF9ldmVudHMpIHtcbiAgICAgICAgICAgIHNlbGYuZXZlbnRzKHRoaXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgIGlmIChTKHRoaXMuc2NvcGUpLmlzKCdbJyArIHRoaXMuYXR0cl9uYW1lKCkgKyddJykpIHtcbiAgICAgIGJpbmQuY2FsbCh0aGlzLnNjb3BlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUygnWycgKyB0aGlzLmF0dHJfbmFtZSgpICsnXScsIHRoaXMuc2NvcGUpLmVhY2goYmluZCk7XG4gICAgfVxuICAgIC8vICMgUGF0Y2ggdG8gZml4ICM1MDQzIHRvIG1vdmUgdGhpcyAqYWZ0ZXIqIHRoZSBpZi9lbHNlIGNsYXVzZSBpbiBvcmRlciBmb3IgQmFja2JvbmUgYW5kIHNpbWlsYXIgZnJhbWV3b3JrcyB0byBoYXZlIGltcHJvdmVkIGNvbnRyb2wgb3ZlciBldmVudCBiaW5kaW5nIGFuZCBkYXRhLW9wdGlvbnMgdXBkYXRpbmcuXG4gICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpc1ttZXRob2RdLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuXG4gIH07XG5cbiAgdmFyIHNpbmdsZV9pbWFnZV9sb2FkZWQgPSBmdW5jdGlvbiAoaW1hZ2UsIGNhbGxiYWNrKSB7XG4gICAgZnVuY3Rpb24gbG9hZGVkICgpIHtcbiAgICAgIGNhbGxiYWNrKGltYWdlWzBdKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBiaW5kTG9hZCAoKSB7XG4gICAgICB0aGlzLm9uZSgnbG9hZCcsIGxvYWRlZCk7XG5cbiAgICAgIGlmICgvTVNJRSAoXFxkK1xcLlxcZCspOy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkge1xuICAgICAgICB2YXIgc3JjID0gdGhpcy5hdHRyKCAnc3JjJyApLFxuICAgICAgICAgICAgcGFyYW0gPSBzcmMubWF0Y2goIC9cXD8vICkgPyAnJicgOiAnPyc7XG5cbiAgICAgICAgcGFyYW0gKz0gJ3JhbmRvbT0nICsgKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcbiAgICAgICAgdGhpcy5hdHRyKCdzcmMnLCBzcmMgKyBwYXJhbSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpbWFnZS5hdHRyKCdzcmMnKSkge1xuICAgICAgbG9hZGVkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGltYWdlWzBdLmNvbXBsZXRlIHx8IGltYWdlWzBdLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgIGxvYWRlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiaW5kTG9hZC5jYWxsKGltYWdlKTtcbiAgICB9XG4gIH07XG5cbiAgLyohIG1hdGNoTWVkaWEoKSBwb2x5ZmlsbCAtIFRlc3QgYSBDU1MgbWVkaWEgdHlwZS9xdWVyeSBpbiBKUy4gQXV0aG9ycyAmIGNvcHlyaWdodCAoYykgMjAxMjogU2NvdHQgSmVobCwgUGF1bCBJcmlzaCwgTmljaG9sYXMgWmFrYXMsIERhdmlkIEtuaWdodC4gRHVhbCBNSVQvQlNEIGxpY2Vuc2UgKi9cblxuICB3aW5kb3cubWF0Y2hNZWRpYSB8fCAod2luZG93Lm1hdGNoTWVkaWEgPSBmdW5jdGlvbigpIHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICAvLyBGb3IgYnJvd3NlcnMgdGhhdCBzdXBwb3J0IG1hdGNoTWVkaXVtIGFwaSBzdWNoIGFzIElFIDkgYW5kIHdlYmtpdFxuICAgICAgdmFyIHN0eWxlTWVkaWEgPSAod2luZG93LnN0eWxlTWVkaWEgfHwgd2luZG93Lm1lZGlhKTtcblxuICAgICAgLy8gRm9yIHRob3NlIHRoYXQgZG9uJ3Qgc3VwcG9ydCBtYXRjaE1lZGl1bVxuICAgICAgaWYgKCFzdHlsZU1lZGlhKSB7XG4gICAgICAgICAgdmFyIHN0eWxlICAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKSxcbiAgICAgICAgICAgICAgc2NyaXB0ICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF0sXG4gICAgICAgICAgICAgIGluZm8gICAgICAgID0gbnVsbDtcblxuICAgICAgICAgIHN0eWxlLnR5cGUgID0gJ3RleHQvY3NzJztcbiAgICAgICAgICBzdHlsZS5pZCAgICA9ICdtYXRjaG1lZGlhanMtdGVzdCc7XG5cbiAgICAgICAgICBzY3JpcHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc3R5bGUsIHNjcmlwdCk7XG5cbiAgICAgICAgICAvLyAnc3R5bGUuY3VycmVudFN0eWxlJyBpcyB1c2VkIGJ5IElFIDw9IDggYW5kICd3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZScgZm9yIGFsbCBvdGhlciBicm93c2Vyc1xuICAgICAgICAgIGluZm8gPSAoJ2dldENvbXB1dGVkU3R5bGUnIGluIHdpbmRvdykgJiYgd2luZG93LmdldENvbXB1dGVkU3R5bGUoc3R5bGUsIG51bGwpIHx8IHN0eWxlLmN1cnJlbnRTdHlsZTtcblxuICAgICAgICAgIHN0eWxlTWVkaWEgPSB7XG4gICAgICAgICAgICAgIG1hdGNoTWVkaXVtOiBmdW5jdGlvbihtZWRpYSkge1xuICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSAnQG1lZGlhICcgKyBtZWRpYSArICd7ICNtYXRjaG1lZGlhanMtdGVzdCB7IHdpZHRoOiAxcHg7IH0gfSc7XG5cbiAgICAgICAgICAgICAgICAgIC8vICdzdHlsZS5zdHlsZVNoZWV0JyBpcyB1c2VkIGJ5IElFIDw9IDggYW5kICdzdHlsZS50ZXh0Q29udGVudCcgZm9yIGFsbCBvdGhlciBicm93c2Vyc1xuICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlLnN0eWxlU2hlZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5zdHlsZVNoZWV0LmNzc1RleHQgPSB0ZXh0O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZS50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIFRlc3QgaWYgbWVkaWEgcXVlcnkgaXMgdHJ1ZSBvciBmYWxzZVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZm8ud2lkdGggPT09ICcxcHgnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG1lZGlhKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWF0Y2hlczogc3R5bGVNZWRpYS5tYXRjaE1lZGl1bShtZWRpYSB8fCAnYWxsJyksXG4gICAgICAgICAgICAgIG1lZGlhOiBtZWRpYSB8fCAnYWxsJ1xuICAgICAgICAgIH07XG4gICAgICB9O1xuICB9KCkpO1xuXG4gIC8qXG4gICAqIGpxdWVyeS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2duYXJmMzcvanF1ZXJ5LXJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgKiBSZXF1aXJlcyBqUXVlcnkgMS44K1xuICAgKlxuICAgKiBDb3B5cmlnaHQgKGMpIDIwMTIgQ29yZXkgRnJhbmdcbiAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICAgKi9cblxuICAoZnVuY3Rpb24oalF1ZXJ5KSB7XG5cblxuICAvLyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgcG9seWZpbGwgYWRhcHRlZCBmcm9tIEVyaWsgTcO2bGxlclxuICAvLyBmaXhlcyBmcm9tIFBhdWwgSXJpc2ggYW5kIFRpbm8gWmlqZGVsXG4gIC8vIGh0dHA6Ly9wYXVsaXJpc2guY29tLzIwMTEvcmVxdWVzdGFuaW1hdGlvbmZyYW1lLWZvci1zbWFydC1hbmltYXRpbmcvXG4gIC8vIGh0dHA6Ly9teS5vcGVyYS5jb20vZW1vbGxlci9ibG9nLzIwMTEvMTIvMjAvcmVxdWVzdGFuaW1hdGlvbmZyYW1lLWZvci1zbWFydC1lci1hbmltYXRpbmdcblxuICB2YXIgYW5pbWF0aW5nLFxuICAgICAgbGFzdFRpbWUgPSAwLFxuICAgICAgdmVuZG9ycyA9IFsnd2Via2l0JywgJ21veiddLFxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSxcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lID0gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lLFxuICAgICAganF1ZXJ5RnhBdmFpbGFibGUgPSAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGpRdWVyeS5meDtcblxuICBmb3IgKDsgbGFzdFRpbWUgPCB2ZW5kb3JzLmxlbmd0aCAmJiAhcmVxdWVzdEFuaW1hdGlvbkZyYW1lOyBsYXN0VGltZSsrKSB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gd2luZG93WyB2ZW5kb3JzW2xhc3RUaW1lXSArICdSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnIF07XG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBjYW5jZWxBbmltYXRpb25GcmFtZSB8fFxuICAgICAgd2luZG93WyB2ZW5kb3JzW2xhc3RUaW1lXSArICdDYW5jZWxBbmltYXRpb25GcmFtZScgXSB8fFxuICAgICAgd2luZG93WyB2ZW5kb3JzW2xhc3RUaW1lXSArICdDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnIF07XG4gIH1cblxuICBmdW5jdGlvbiByYWYoKSB7XG4gICAgaWYgKGFuaW1hdGluZykge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJhZik7XG5cbiAgICAgIGlmIChqcXVlcnlGeEF2YWlsYWJsZSkge1xuICAgICAgICBqUXVlcnkuZngudGljaygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChyZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcbiAgICAvLyB1c2UgckFGXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZTtcbiAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBjYW5jZWxBbmltYXRpb25GcmFtZTtcblxuICAgIGlmIChqcXVlcnlGeEF2YWlsYWJsZSkge1xuICAgICAgalF1ZXJ5LmZ4LnRpbWVyID0gZnVuY3Rpb24gKHRpbWVyKSB7XG4gICAgICAgIGlmICh0aW1lcigpICYmIGpRdWVyeS50aW1lcnMucHVzaCh0aW1lcikgJiYgIWFuaW1hdGluZykge1xuICAgICAgICAgIGFuaW1hdGluZyA9IHRydWU7XG4gICAgICAgICAgcmFmKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGpRdWVyeS5meC5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBhbmltYXRpbmcgPSBmYWxzZTtcbiAgICAgIH07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIHBvbHlmaWxsXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgdmFyIGN1cnJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCksXG4gICAgICAgIHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSksXG4gICAgICAgIGlkID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNhbGxiYWNrKGN1cnJUaW1lICsgdGltZVRvQ2FsbCk7XG4gICAgICAgIH0sIHRpbWVUb0NhbGwpO1xuICAgICAgbGFzdFRpbWUgPSBjdXJyVGltZSArIHRpbWVUb0NhbGw7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfTtcblxuICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGlkKTtcbiAgICB9O1xuXG4gIH1cblxuICB9KCAkICkpO1xuXG4gIGZ1bmN0aW9uIHJlbW92ZVF1b3RlcyAoc3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnIHx8IHN0cmluZyBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoL15bJ1xcXFwvXCJdK3woO1xccz99KSt8WydcXFxcL1wiXSskL2csICcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gTWVkaWFRdWVyeShzZWxlY3Rvcikge1xuICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICB0aGlzLnF1ZXJ5ID0gJyc7XG4gIH1cblxuICBNZWRpYVF1ZXJ5LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSB8fCAodGhpcy5xdWVyeSA9IFModGhpcy5zZWxlY3RvcikuY3NzKCdmb250LWZhbWlseScpLnJlcGxhY2UoL15bXFwvXFxcXCdcIl0rfCg7XFxzP30pK3xbXFwvXFxcXCdcIl0rJC9nLCAnJykpO1xuICB9O1xuXG4gIHdpbmRvdy5Gb3VuZGF0aW9uID0ge1xuICAgIG5hbWUgOiAnRm91bmRhdGlvbicsXG5cbiAgICB2ZXJzaW9uIDogJzUuNS4zJyxcblxuICAgIG1lZGlhX3F1ZXJpZXMgOiB7XG4gICAgICAnc21hbGwnICAgICAgIDogbmV3IE1lZGlhUXVlcnkoJy5mb3VuZGF0aW9uLW1xLXNtYWxsJyksXG4gICAgICAnc21hbGwtb25seScgIDogbmV3IE1lZGlhUXVlcnkoJy5mb3VuZGF0aW9uLW1xLXNtYWxsLW9ubHknKSxcbiAgICAgICdtZWRpdW0nICAgICAgOiBuZXcgTWVkaWFRdWVyeSgnLmZvdW5kYXRpb24tbXEtbWVkaXVtJyksXG4gICAgICAnbWVkaXVtLW9ubHknIDogbmV3IE1lZGlhUXVlcnkoJy5mb3VuZGF0aW9uLW1xLW1lZGl1bS1vbmx5JyksXG4gICAgICAnbGFyZ2UnICAgICAgIDogbmV3IE1lZGlhUXVlcnkoJy5mb3VuZGF0aW9uLW1xLWxhcmdlJyksXG4gICAgICAnbGFyZ2Utb25seScgIDogbmV3IE1lZGlhUXVlcnkoJy5mb3VuZGF0aW9uLW1xLWxhcmdlLW9ubHknKSxcbiAgICAgICd4bGFyZ2UnICAgICAgOiBuZXcgTWVkaWFRdWVyeSgnLmZvdW5kYXRpb24tbXEteGxhcmdlJyksXG4gICAgICAneGxhcmdlLW9ubHknIDogbmV3IE1lZGlhUXVlcnkoJy5mb3VuZGF0aW9uLW1xLXhsYXJnZS1vbmx5JyksXG4gICAgICAneHhsYXJnZScgICAgIDogbmV3IE1lZGlhUXVlcnkoJy5mb3VuZGF0aW9uLW1xLXh4bGFyZ2UnKVxuICAgIH0sXG5cbiAgICBzdHlsZXNoZWV0IDogJCgnPHN0eWxlPjwvc3R5bGU+JykuYXBwZW5kVG8oJ2hlYWQnKVswXS5zaGVldCxcblxuICAgIGdsb2JhbCA6IHtcbiAgICAgIG5hbWVzcGFjZSA6IHVuZGVmaW5lZFxuICAgIH0sXG5cbiAgICBpbml0IDogZnVuY3Rpb24gKHNjb3BlLCBsaWJyYXJpZXMsIG1ldGhvZCwgb3B0aW9ucywgcmVzcG9uc2UpIHtcbiAgICAgIHZhciBhcmdzID0gW3Njb3BlLCBtZXRob2QsIG9wdGlvbnMsIHJlc3BvbnNlXSxcbiAgICAgICAgICByZXNwb25zZXMgPSBbXTtcblxuICAgICAgLy8gY2hlY2sgUlRMXG4gICAgICB0aGlzLnJ0bCA9IC9ydGwvaS50ZXN0KFMoJ2h0bWwnKS5hdHRyKCdkaXInKSk7XG5cbiAgICAgIC8vIHNldCBmb3VuZGF0aW9uIGdsb2JhbCBzY29wZVxuICAgICAgdGhpcy5zY29wZSA9IHNjb3BlIHx8IHRoaXMuc2NvcGU7XG5cbiAgICAgIHRoaXMuc2V0X25hbWVzcGFjZSgpO1xuXG4gICAgICBpZiAobGlicmFyaWVzICYmIHR5cGVvZiBsaWJyYXJpZXMgPT09ICdzdHJpbmcnICYmICEvcmVmbG93L2kudGVzdChsaWJyYXJpZXMpKSB7XG4gICAgICAgIGlmICh0aGlzLmxpYnMuaGFzT3duUHJvcGVydHkobGlicmFyaWVzKSkge1xuICAgICAgICAgIHJlc3BvbnNlcy5wdXNoKHRoaXMuaW5pdF9saWIobGlicmFyaWVzLCBhcmdzKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGxpYiBpbiB0aGlzLmxpYnMpIHtcbiAgICAgICAgICByZXNwb25zZXMucHVzaCh0aGlzLmluaXRfbGliKGxpYiwgbGlicmFyaWVzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgUyh3aW5kb3cpLmxvYWQoZnVuY3Rpb24gKCkge1xuICAgICAgICBTKHdpbmRvdylcbiAgICAgICAgICAudHJpZ2dlcigncmVzaXplLmZuZHRuLmNsZWFyaW5nJylcbiAgICAgICAgICAudHJpZ2dlcigncmVzaXplLmZuZHRuLmRyb3Bkb3duJylcbiAgICAgICAgICAudHJpZ2dlcigncmVzaXplLmZuZHRuLmVxdWFsaXplcicpXG4gICAgICAgICAgLnRyaWdnZXIoJ3Jlc2l6ZS5mbmR0bi5pbnRlcmNoYW5nZScpXG4gICAgICAgICAgLnRyaWdnZXIoJ3Jlc2l6ZS5mbmR0bi5qb3lyaWRlJylcbiAgICAgICAgICAudHJpZ2dlcigncmVzaXplLmZuZHRuLm1hZ2VsbGFuJylcbiAgICAgICAgICAudHJpZ2dlcigncmVzaXplLmZuZHRuLnRvcGJhcicpXG4gICAgICAgICAgLnRyaWdnZXIoJ3Jlc2l6ZS5mbmR0bi5zbGlkZXInKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gc2NvcGU7XG4gICAgfSxcblxuICAgIGluaXRfbGliIDogZnVuY3Rpb24gKGxpYiwgYXJncykge1xuICAgICAgaWYgKHRoaXMubGlicy5oYXNPd25Qcm9wZXJ0eShsaWIpKSB7XG4gICAgICAgIHRoaXMucGF0Y2godGhpcy5saWJzW2xpYl0pO1xuXG4gICAgICAgIGlmIChhcmdzICYmIGFyZ3MuaGFzT3duUHJvcGVydHkobGliKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmxpYnNbbGliXS5zZXR0aW5ncyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcy5saWJzW2xpYl0uc2V0dGluZ3MsIGFyZ3NbbGliXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmxpYnNbbGliXS5kZWZhdWx0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcy5saWJzW2xpYl0uZGVmYXVsdHMsIGFyZ3NbbGliXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMubGlic1tsaWJdLmluaXQuYXBwbHkodGhpcy5saWJzW2xpYl0sIFt0aGlzLnNjb3BlLCBhcmdzW2xpYl1dKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFyZ3MgPSBhcmdzIGluc3RhbmNlb2YgQXJyYXkgPyBhcmdzIDogbmV3IEFycmF5KGFyZ3MpO1xuICAgICAgICByZXR1cm4gdGhpcy5saWJzW2xpYl0uaW5pdC5hcHBseSh0aGlzLmxpYnNbbGliXSwgYXJncyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7fTtcbiAgICB9LFxuXG4gICAgcGF0Y2ggOiBmdW5jdGlvbiAobGliKSB7XG4gICAgICBsaWIuc2NvcGUgPSB0aGlzLnNjb3BlO1xuICAgICAgbGliLm5hbWVzcGFjZSA9IHRoaXMuZ2xvYmFsLm5hbWVzcGFjZTtcbiAgICAgIGxpYi5ydGwgPSB0aGlzLnJ0bDtcbiAgICAgIGxpYlsnZGF0YV9vcHRpb25zJ10gPSB0aGlzLnV0aWxzLmRhdGFfb3B0aW9ucztcbiAgICAgIGxpYlsnYXR0cl9uYW1lJ10gPSBhdHRyX25hbWU7XG4gICAgICBsaWJbJ2FkZF9uYW1lc3BhY2UnXSA9IGFkZF9uYW1lc3BhY2U7XG4gICAgICBsaWJbJ2JpbmRpbmdzJ10gPSBiaW5kaW5ncztcbiAgICAgIGxpYlsnUyddID0gdGhpcy51dGlscy5TO1xuICAgIH0sXG5cbiAgICBpbmhlcml0IDogZnVuY3Rpb24gKHNjb3BlLCBtZXRob2RzKSB7XG4gICAgICB2YXIgbWV0aG9kc19hcnIgPSBtZXRob2RzLnNwbGl0KCcgJyksXG4gICAgICAgICAgaSA9IG1ldGhvZHNfYXJyLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICBpZiAodGhpcy51dGlscy5oYXNPd25Qcm9wZXJ0eShtZXRob2RzX2FycltpXSkpIHtcbiAgICAgICAgICBzY29wZVttZXRob2RzX2FycltpXV0gPSB0aGlzLnV0aWxzW21ldGhvZHNfYXJyW2ldXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXRfbmFtZXNwYWNlIDogZnVuY3Rpb24gKCkge1xuXG4gICAgICAvLyBEZXNjcmlwdGlvbjpcbiAgICAgIC8vICAgIERvbid0IGJvdGhlciByZWFkaW5nIHRoZSBuYW1lc3BhY2Ugb3V0IG9mIHRoZSBtZXRhIHRhZ1xuICAgICAgLy8gICAgaWYgdGhlIG5hbWVzcGFjZSBoYXMgYmVlbiBzZXQgZ2xvYmFsbHkgaW4gamF2YXNjcmlwdFxuICAgICAgLy9cbiAgICAgIC8vIEV4YW1wbGU6XG4gICAgICAvLyAgICBGb3VuZGF0aW9uLmdsb2JhbC5uYW1lc3BhY2UgPSAnbXktbmFtZXNwYWNlJztcbiAgICAgIC8vIG9yIG1ha2UgaXQgYW4gZW1wdHkgc3RyaW5nOlxuICAgICAgLy8gICAgRm91bmRhdGlvbi5nbG9iYWwubmFtZXNwYWNlID0gJyc7XG4gICAgICAvL1xuICAgICAgLy9cblxuICAgICAgLy8gSWYgdGhlIG5hbWVzcGFjZSBoYXMgbm90IGJlZW4gc2V0IChpcyB1bmRlZmluZWQpLCB0cnkgdG8gcmVhZCBpdCBvdXQgb2YgdGhlIG1ldGEgZWxlbWVudC5cbiAgICAgIC8vIE90aGVyd2lzZSB1c2UgdGhlIGdsb2JhbGx5IGRlZmluZWQgbmFtZXNwYWNlLCBldmVuIGlmIGl0J3MgZW1wdHkgKCcnKVxuICAgICAgdmFyIG5hbWVzcGFjZSA9ICggdGhpcy5nbG9iYWwubmFtZXNwYWNlID09PSB1bmRlZmluZWQgKSA/ICQoJy5mb3VuZGF0aW9uLWRhdGEtYXR0cmlidXRlLW5hbWVzcGFjZScpLmNzcygnZm9udC1mYW1pbHknKSA6IHRoaXMuZ2xvYmFsLm5hbWVzcGFjZTtcblxuICAgICAgLy8gRmluYWxseSwgaWYgdGhlIG5hbXNlcGFjZSBpcyBlaXRoZXIgdW5kZWZpbmVkIG9yIGZhbHNlLCBzZXQgaXQgdG8gYW4gZW1wdHkgc3RyaW5nLlxuICAgICAgLy8gT3RoZXJ3aXNlIHVzZSB0aGUgbmFtZXNwYWNlIHZhbHVlLlxuICAgICAgdGhpcy5nbG9iYWwubmFtZXNwYWNlID0gKCBuYW1lc3BhY2UgPT09IHVuZGVmaW5lZCB8fCAvZmFsc2UvaS50ZXN0KG5hbWVzcGFjZSkgKSA/ICcnIDogbmFtZXNwYWNlO1xuICAgIH0sXG5cbiAgICBsaWJzIDoge30sXG5cbiAgICAvLyBtZXRob2RzIHRoYXQgY2FuIGJlIGluaGVyaXRlZCBpbiBsaWJyYXJpZXNcbiAgICB1dGlscyA6IHtcblxuICAgICAgLy8gRGVzY3JpcHRpb246XG4gICAgICAvLyAgICBGYXN0IFNlbGVjdG9yIHdyYXBwZXIgcmV0dXJucyBqUXVlcnkgb2JqZWN0LiBPbmx5IHVzZSB3aGVyZSBnZXRFbGVtZW50QnlJZFxuICAgICAgLy8gICAgaXMgbm90IGF2YWlsYWJsZS5cbiAgICAgIC8vXG4gICAgICAvLyBBcmd1bWVudHM6XG4gICAgICAvLyAgICBTZWxlY3RvciAoU3RyaW5nKTogQ1NTIHNlbGVjdG9yIGRlc2NyaWJpbmcgdGhlIGVsZW1lbnQocykgdG8gYmVcbiAgICAgIC8vICAgIHJldHVybmVkIGFzIGEgalF1ZXJ5IG9iamVjdC5cbiAgICAgIC8vXG4gICAgICAvLyAgICBTY29wZSAoU3RyaW5nKTogQ1NTIHNlbGVjdG9yIGRlc2NyaWJpbmcgdGhlIGFyZWEgdG8gYmUgc2VhcmNoZWQuIERlZmF1bHRcbiAgICAgIC8vICAgIGlzIGRvY3VtZW50LlxuICAgICAgLy9cbiAgICAgIC8vIFJldHVybnM6XG4gICAgICAvLyAgICBFbGVtZW50IChqUXVlcnkgT2JqZWN0KTogalF1ZXJ5IG9iamVjdCBjb250YWluaW5nIGVsZW1lbnRzIG1hdGNoaW5nIHRoZVxuICAgICAgLy8gICAgc2VsZWN0b3Igd2l0aGluIHRoZSBzY29wZS5cbiAgICAgIFMgOiBTLFxuXG4gICAgICAvLyBEZXNjcmlwdGlvbjpcbiAgICAgIC8vICAgIEV4ZWN1dGVzIGEgZnVuY3Rpb24gYSBtYXggb2Ygb25jZSBldmVyeSBuIG1pbGxpc2Vjb25kc1xuICAgICAgLy9cbiAgICAgIC8vIEFyZ3VtZW50czpcbiAgICAgIC8vICAgIEZ1bmMgKEZ1bmN0aW9uKTogRnVuY3Rpb24gdG8gYmUgdGhyb3R0bGVkLlxuICAgICAgLy9cbiAgICAgIC8vICAgIERlbGF5IChJbnRlZ2VyKTogRnVuY3Rpb24gZXhlY3V0aW9uIHRocmVzaG9sZCBpbiBtaWxsaXNlY29uZHMuXG4gICAgICAvL1xuICAgICAgLy8gUmV0dXJuczpcbiAgICAgIC8vICAgIExhenlfZnVuY3Rpb24gKEZ1bmN0aW9uKTogRnVuY3Rpb24gd2l0aCB0aHJvdHRsaW5nIGFwcGxpZWQuXG4gICAgICB0aHJvdHRsZSA6IGZ1bmN0aW9uIChmdW5jLCBkZWxheSkge1xuICAgICAgICB2YXIgdGltZXIgPSBudWxsO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuXG4gICAgICAgICAgaWYgKHRpbWVyID09IG51bGwpIHtcbiAgICAgICAgICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgICAgIH0sIGRlbGF5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9LFxuXG4gICAgICAvLyBEZXNjcmlwdGlvbjpcbiAgICAgIC8vICAgIEV4ZWN1dGVzIGEgZnVuY3Rpb24gd2hlbiBpdCBzdG9wcyBiZWluZyBpbnZva2VkIGZvciBuIHNlY29uZHNcbiAgICAgIC8vICAgIE1vZGlmaWVkIHZlcnNpb24gb2YgXy5kZWJvdW5jZSgpIGh0dHA6Ly91bmRlcnNjb3JlanMub3JnXG4gICAgICAvL1xuICAgICAgLy8gQXJndW1lbnRzOlxuICAgICAgLy8gICAgRnVuYyAoRnVuY3Rpb24pOiBGdW5jdGlvbiB0byBiZSBkZWJvdW5jZWQuXG4gICAgICAvL1xuICAgICAgLy8gICAgRGVsYXkgKEludGVnZXIpOiBGdW5jdGlvbiBleGVjdXRpb24gdGhyZXNob2xkIGluIG1pbGxpc2Vjb25kcy5cbiAgICAgIC8vXG4gICAgICAvLyAgICBJbW1lZGlhdGUgKEJvb2wpOiBXaGV0aGVyIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmdcbiAgICAgIC8vICAgIG9mIHRoZSBkZWxheSBpbnN0ZWFkIG9mIHRoZSBlbmQuIERlZmF1bHQgaXMgZmFsc2UuXG4gICAgICAvL1xuICAgICAgLy8gUmV0dXJuczpcbiAgICAgIC8vICAgIExhenlfZnVuY3Rpb24gKEZ1bmN0aW9uKTogRnVuY3Rpb24gd2l0aCBkZWJvdW5jaW5nIGFwcGxpZWQuXG4gICAgICBkZWJvdW5jZSA6IGZ1bmN0aW9uIChmdW5jLCBkZWxheSwgaW1tZWRpYXRlKSB7XG4gICAgICAgIHZhciB0aW1lb3V0LCByZXN1bHQ7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICAgIHZhciBsYXRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKCFpbW1lZGlhdGUpIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHZhciBjYWxsTm93ID0gaW1tZWRpYXRlICYmICF0aW1lb3V0O1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgZGVsYXkpO1xuICAgICAgICAgIGlmIChjYWxsTm93KSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgfSxcblxuICAgICAgLy8gRGVzY3JpcHRpb246XG4gICAgICAvLyAgICBQYXJzZXMgZGF0YS1vcHRpb25zIGF0dHJpYnV0ZVxuICAgICAgLy9cbiAgICAgIC8vIEFyZ3VtZW50czpcbiAgICAgIC8vICAgIEVsIChqUXVlcnkgT2JqZWN0KTogRWxlbWVudCB0byBiZSBwYXJzZWQuXG4gICAgICAvL1xuICAgICAgLy8gUmV0dXJuczpcbiAgICAgIC8vICAgIE9wdGlvbnMgKEphdmFzY3JpcHQgT2JqZWN0KTogQ29udGVudHMgb2YgdGhlIGVsZW1lbnQncyBkYXRhLW9wdGlvbnNcbiAgICAgIC8vICAgIGF0dHJpYnV0ZS5cbiAgICAgIGRhdGFfb3B0aW9ucyA6IGZ1bmN0aW9uIChlbCwgZGF0YV9hdHRyX25hbWUpIHtcbiAgICAgICAgZGF0YV9hdHRyX25hbWUgPSBkYXRhX2F0dHJfbmFtZSB8fCAnb3B0aW9ucyc7XG4gICAgICAgIHZhciBvcHRzID0ge30sIGlpLCBwLCBvcHRzX2FycixcbiAgICAgICAgICAgIGRhdGFfb3B0aW9ucyA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgICAgICB2YXIgbmFtZXNwYWNlID0gRm91bmRhdGlvbi5nbG9iYWwubmFtZXNwYWNlO1xuXG4gICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbC5kYXRhKG5hbWVzcGFjZSArICctJyArIGRhdGFfYXR0cl9uYW1lKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBlbC5kYXRhKGRhdGFfYXR0cl9uYW1lKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgdmFyIGNhY2hlZF9vcHRpb25zID0gZGF0YV9vcHRpb25zKGVsKTtcblxuICAgICAgICBpZiAodHlwZW9mIGNhY2hlZF9vcHRpb25zID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHJldHVybiBjYWNoZWRfb3B0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdHNfYXJyID0gKGNhY2hlZF9vcHRpb25zIHx8ICc6Jykuc3BsaXQoJzsnKTtcbiAgICAgICAgaWkgPSBvcHRzX2Fyci5sZW5ndGg7XG5cbiAgICAgICAgZnVuY3Rpb24gaXNOdW1iZXIgKG8pIHtcbiAgICAgICAgICByZXR1cm4gIWlzTmFOIChvIC0gMCkgJiYgbyAhPT0gbnVsbCAmJiBvICE9PSAnJyAmJiBvICE9PSBmYWxzZSAmJiBvICE9PSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gdHJpbSAoc3RyKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gJC50cmltKHN0cik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzdHI7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAoaWktLSkge1xuICAgICAgICAgIHAgPSBvcHRzX2FycltpaV0uc3BsaXQoJzonKTtcbiAgICAgICAgICBwID0gW3BbMF0sIHAuc2xpY2UoMSkuam9pbignOicpXTtcblxuICAgICAgICAgIGlmICgvdHJ1ZS9pLnRlc3QocFsxXSkpIHtcbiAgICAgICAgICAgIHBbMV0gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoL2ZhbHNlL2kudGVzdChwWzFdKSkge1xuICAgICAgICAgICAgcFsxXSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNOdW1iZXIocFsxXSkpIHtcbiAgICAgICAgICAgIGlmIChwWzFdLmluZGV4T2YoJy4nKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgcFsxXSA9IHBhcnNlSW50KHBbMV0sIDEwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBbMV0gPSBwYXJzZUZsb2F0KHBbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwLmxlbmd0aCA9PT0gMiAmJiBwWzBdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG9wdHNbdHJpbShwWzBdKV0gPSB0cmltKHBbMV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRzO1xuICAgICAgfSxcblxuICAgICAgLy8gRGVzY3JpcHRpb246XG4gICAgICAvLyAgICBBZGRzIEpTLXJlY29nbml6YWJsZSBtZWRpYSBxdWVyaWVzXG4gICAgICAvL1xuICAgICAgLy8gQXJndW1lbnRzOlxuICAgICAgLy8gICAgTWVkaWEgKFN0cmluZyk6IEtleSBzdHJpbmcgZm9yIHRoZSBtZWRpYSBxdWVyeSB0byBiZSBzdG9yZWQgYXMgaW5cbiAgICAgIC8vICAgIEZvdW5kYXRpb24ubWVkaWFfcXVlcmllc1xuICAgICAgLy9cbiAgICAgIC8vICAgIENsYXNzIChTdHJpbmcpOiBDbGFzcyBuYW1lIGZvciB0aGUgZ2VuZXJhdGVkIDxtZXRhPiB0YWdcbiAgICAgIHJlZ2lzdGVyX21lZGlhIDogZnVuY3Rpb24gKG1lZGlhLCBtZWRpYV9jbGFzcykge1xuICAgICAgICBpZiAoRm91bmRhdGlvbi5tZWRpYV9xdWVyaWVzW21lZGlhXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgJCgnaGVhZCcpLmFwcGVuZCgnPG1ldGEgY2xhc3M9XCInICsgbWVkaWFfY2xhc3MgKyAnXCIvPicpO1xuICAgICAgICAgIEZvdW5kYXRpb24ubWVkaWFfcXVlcmllc1ttZWRpYV0gPSByZW1vdmVRdW90ZXMoJCgnLicgKyBtZWRpYV9jbGFzcykuY3NzKCdmb250LWZhbWlseScpKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gRGVzY3JpcHRpb246XG4gICAgICAvLyAgICBBZGQgY3VzdG9tIENTUyB3aXRoaW4gYSBKUy1kZWZpbmVkIG1lZGlhIHF1ZXJ5XG4gICAgICAvL1xuICAgICAgLy8gQXJndW1lbnRzOlxuICAgICAgLy8gICAgUnVsZSAoU3RyaW5nKTogQ1NTIHJ1bGUgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIGRvY3VtZW50LlxuICAgICAgLy9cbiAgICAgIC8vICAgIE1lZGlhIChTdHJpbmcpOiBPcHRpb25hbCBtZWRpYSBxdWVyeSBzdHJpbmcgZm9yIHRoZSBDU1MgcnVsZSB0byBiZVxuICAgICAgLy8gICAgbmVzdGVkIHVuZGVyLlxuICAgICAgYWRkX2N1c3RvbV9ydWxlIDogZnVuY3Rpb24gKHJ1bGUsIG1lZGlhKSB7XG4gICAgICAgIGlmIChtZWRpYSA9PT0gdW5kZWZpbmVkICYmIEZvdW5kYXRpb24uc3R5bGVzaGVldCkge1xuICAgICAgICAgIEZvdW5kYXRpb24uc3R5bGVzaGVldC5pbnNlcnRSdWxlKHJ1bGUsIEZvdW5kYXRpb24uc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBxdWVyeSA9IEZvdW5kYXRpb24ubWVkaWFfcXVlcmllc1ttZWRpYV07XG5cbiAgICAgICAgICBpZiAocXVlcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgRm91bmRhdGlvbi5zdHlsZXNoZWV0Lmluc2VydFJ1bGUoJ0BtZWRpYSAnICtcbiAgICAgICAgICAgICAgRm91bmRhdGlvbi5tZWRpYV9xdWVyaWVzW21lZGlhXSArICd7ICcgKyBydWxlICsgJyB9JywgRm91bmRhdGlvbi5zdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvLyBEZXNjcmlwdGlvbjpcbiAgICAgIC8vICAgIFBlcmZvcm1zIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2hlbiBhbiBpbWFnZSBpcyBmdWxseSBsb2FkZWRcbiAgICAgIC8vXG4gICAgICAvLyBBcmd1bWVudHM6XG4gICAgICAvLyAgICBJbWFnZSAoalF1ZXJ5IE9iamVjdCk6IEltYWdlKHMpIHRvIGNoZWNrIGlmIGxvYWRlZC5cbiAgICAgIC8vXG4gICAgICAvLyAgICBDYWxsYmFjayAoRnVuY3Rpb24pOiBGdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gaW1hZ2UgaXMgZnVsbHkgbG9hZGVkLlxuICAgICAgaW1hZ2VfbG9hZGVkIDogZnVuY3Rpb24gKGltYWdlcywgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICAgICAgdW5sb2FkZWQgPSBpbWFnZXMubGVuZ3RoO1xuXG4gICAgICAgIGZ1bmN0aW9uIHBpY3R1cmVzX2hhc19oZWlnaHQoaW1hZ2VzKSB7XG4gICAgICAgICAgdmFyIHBpY3R1cmVzX251bWJlciA9IGltYWdlcy5sZW5ndGg7XG5cbiAgICAgICAgICBmb3IgKHZhciBpID0gcGljdHVyZXNfbnVtYmVyIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmKGltYWdlcy5hdHRyKCdoZWlnaHQnKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVubG9hZGVkID09PSAwIHx8IHBpY3R1cmVzX2hhc19oZWlnaHQoaW1hZ2VzKSkge1xuICAgICAgICAgIGNhbGxiYWNrKGltYWdlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpbWFnZXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2luZ2xlX2ltYWdlX2xvYWRlZChzZWxmLlModGhpcyksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHVubG9hZGVkIC09IDE7XG4gICAgICAgICAgICBpZiAodW5sb2FkZWQgPT09IDApIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soaW1hZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvLyBEZXNjcmlwdGlvbjpcbiAgICAgIC8vICAgIFJldHVybnMgYSByYW5kb20sIGFscGhhbnVtZXJpYyBzdHJpbmdcbiAgICAgIC8vXG4gICAgICAvLyBBcmd1bWVudHM6XG4gICAgICAvLyAgICBMZW5ndGggKEludGVnZXIpOiBMZW5ndGggb2Ygc3RyaW5nIHRvIGJlIGdlbmVyYXRlZC4gRGVmYXVsdHMgdG8gcmFuZG9tXG4gICAgICAvLyAgICBpbnRlZ2VyLlxuICAgICAgLy9cbiAgICAgIC8vIFJldHVybnM6XG4gICAgICAvLyAgICBSYW5kIChTdHJpbmcpOiBQc2V1ZG8tcmFuZG9tLCBhbHBoYW51bWVyaWMgc3RyaW5nLlxuICAgICAgcmFuZG9tX3N0ciA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpZHgpIHtcbiAgICAgICAgICB0aGlzLmZpZHggPSAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJlZml4ID0gdGhpcy5wcmVmaXggfHwgWyh0aGlzLm5hbWUgfHwgJ0YnKSwgKCtuZXcgRGF0ZSkudG9TdHJpbmcoMzYpXS5qb2luKCctJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucHJlZml4ICsgKHRoaXMuZmlkeCsrKS50b1N0cmluZygzNik7XG4gICAgICB9LFxuXG4gICAgICAvLyBEZXNjcmlwdGlvbjpcbiAgICAgIC8vICAgIEhlbHBlciBmb3Igd2luZG93Lm1hdGNoTWVkaWFcbiAgICAgIC8vXG4gICAgICAvLyBBcmd1bWVudHM6XG4gICAgICAvLyAgICBtcSAoU3RyaW5nKTogTWVkaWEgcXVlcnlcbiAgICAgIC8vXG4gICAgICAvLyBSZXR1cm5zOlxuICAgICAgLy8gICAgKEJvb2xlYW4pOiBXaGV0aGVyIHRoZSBtZWRpYSBxdWVyeSBwYXNzZXMgb3Igbm90XG4gICAgICBtYXRjaCA6IGZ1bmN0aW9uIChtcSkge1xuICAgICAgICByZXR1cm4gd2luZG93Lm1hdGNoTWVkaWEobXEpLm1hdGNoZXM7XG4gICAgICB9LFxuXG4gICAgICAvLyBEZXNjcmlwdGlvbjpcbiAgICAgIC8vICAgIEhlbHBlcnMgZm9yIGNoZWNraW5nIEZvdW5kYXRpb24gZGVmYXVsdCBtZWRpYSBxdWVyaWVzIHdpdGggSlNcbiAgICAgIC8vXG4gICAgICAvLyBSZXR1cm5zOlxuICAgICAgLy8gICAgKEJvb2xlYW4pOiBXaGV0aGVyIHRoZSBtZWRpYSBxdWVyeSBwYXNzZXMgb3Igbm90XG5cbiAgICAgIGlzX3NtYWxsX3VwIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXRjaChGb3VuZGF0aW9uLm1lZGlhX3F1ZXJpZXMuc21hbGwpO1xuICAgICAgfSxcblxuICAgICAgaXNfbWVkaXVtX3VwIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXRjaChGb3VuZGF0aW9uLm1lZGlhX3F1ZXJpZXMubWVkaXVtKTtcbiAgICAgIH0sXG5cbiAgICAgIGlzX2xhcmdlX3VwIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXRjaChGb3VuZGF0aW9uLm1lZGlhX3F1ZXJpZXMubGFyZ2UpO1xuICAgICAgfSxcblxuICAgICAgaXNfeGxhcmdlX3VwIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXRjaChGb3VuZGF0aW9uLm1lZGlhX3F1ZXJpZXMueGxhcmdlKTtcbiAgICAgIH0sXG5cbiAgICAgIGlzX3h4bGFyZ2VfdXAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hdGNoKEZvdW5kYXRpb24ubWVkaWFfcXVlcmllcy54eGxhcmdlKTtcbiAgICAgIH0sXG5cbiAgICAgIGlzX3NtYWxsX29ubHkgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc19tZWRpdW1fdXAoKSAmJiAhdGhpcy5pc19sYXJnZV91cCgpICYmICF0aGlzLmlzX3hsYXJnZV91cCgpICYmICF0aGlzLmlzX3h4bGFyZ2VfdXAoKTtcbiAgICAgIH0sXG5cbiAgICAgIGlzX21lZGl1bV9vbmx5IDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc19tZWRpdW1fdXAoKSAmJiAhdGhpcy5pc19sYXJnZV91cCgpICYmICF0aGlzLmlzX3hsYXJnZV91cCgpICYmICF0aGlzLmlzX3h4bGFyZ2VfdXAoKTtcbiAgICAgIH0sXG5cbiAgICAgIGlzX2xhcmdlX29ubHkgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzX21lZGl1bV91cCgpICYmIHRoaXMuaXNfbGFyZ2VfdXAoKSAmJiAhdGhpcy5pc194bGFyZ2VfdXAoKSAmJiAhdGhpcy5pc194eGxhcmdlX3VwKCk7XG4gICAgICB9LFxuXG4gICAgICBpc194bGFyZ2Vfb25seSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNfbWVkaXVtX3VwKCkgJiYgdGhpcy5pc19sYXJnZV91cCgpICYmIHRoaXMuaXNfeGxhcmdlX3VwKCkgJiYgIXRoaXMuaXNfeHhsYXJnZV91cCgpO1xuICAgICAgfSxcblxuICAgICAgaXNfeHhsYXJnZV9vbmx5IDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc19tZWRpdW1fdXAoKSAmJiB0aGlzLmlzX2xhcmdlX3VwKCkgJiYgdGhpcy5pc194bGFyZ2VfdXAoKSAmJiB0aGlzLmlzX3h4bGFyZ2VfdXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgJC5mbi5mb3VuZGF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcblxuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgRm91bmRhdGlvbi5pbml0LmFwcGx5KEZvdW5kYXRpb24sIFt0aGlzXS5jb25jYXQoYXJncykpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSk7XG4gIH07XG5cbn0oalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCkpO1xuIiwiOyhmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgb3Blbk1vZGFscyA9IFtdO1xuXG4gIEZvdW5kYXRpb24ubGlicy5yZXZlYWwgPSB7XG4gICAgbmFtZSA6ICdyZXZlYWwnLFxuXG4gICAgdmVyc2lvbiA6ICc1LjUuMycsXG5cbiAgICBsb2NrZWQgOiBmYWxzZSxcblxuICAgIHNldHRpbmdzIDoge1xuICAgICAgYW5pbWF0aW9uIDogJ2ZhZGVBbmRQb3AnLFxuICAgICAgYW5pbWF0aW9uX3NwZWVkIDogMjUwLFxuICAgICAgY2xvc2Vfb25fYmFja2dyb3VuZF9jbGljayA6IHRydWUsXG4gICAgICBjbG9zZV9vbl9lc2MgOiB0cnVlLFxuICAgICAgZGlzbWlzc19tb2RhbF9jbGFzcyA6ICdjbG9zZS1yZXZlYWwtbW9kYWwnLFxuICAgICAgbXVsdGlwbGVfb3BlbmVkIDogZmFsc2UsXG4gICAgICBiZ19jbGFzcyA6ICdyZXZlYWwtbW9kYWwtYmcnLFxuICAgICAgcm9vdF9lbGVtZW50IDogJ2JvZHknLFxuICAgICAgb3BlbiA6IGZ1bmN0aW9uKCl7fSxcbiAgICAgIG9wZW5lZCA6IGZ1bmN0aW9uKCl7fSxcbiAgICAgIGNsb3NlIDogZnVuY3Rpb24oKXt9LFxuICAgICAgY2xvc2VkIDogZnVuY3Rpb24oKXt9LFxuICAgICAgb25fYWpheF9lcnJvcjogJC5ub29wLFxuICAgICAgYmcgOiAkKCcucmV2ZWFsLW1vZGFsLWJnJyksXG4gICAgICBjc3MgOiB7XG4gICAgICAgIG9wZW4gOiB7XG4gICAgICAgICAgJ29wYWNpdHknIDogMCxcbiAgICAgICAgICAndmlzaWJpbGl0eScgOiAndmlzaWJsZScsXG4gICAgICAgICAgJ2Rpc3BsYXknIDogJ2Jsb2NrJ1xuICAgICAgICB9LFxuICAgICAgICBjbG9zZSA6IHtcbiAgICAgICAgICAnb3BhY2l0eScgOiAxLFxuICAgICAgICAgICd2aXNpYmlsaXR5JyA6ICdoaWRkZW4nLFxuICAgICAgICAgICdkaXNwbGF5JyA6ICdub25lJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGluaXQgOiBmdW5jdGlvbiAoc2NvcGUsIG1ldGhvZCwgb3B0aW9ucykge1xuICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcy5zZXR0aW5ncywgbWV0aG9kLCBvcHRpb25zKTtcbiAgICAgIHRoaXMuYmluZGluZ3MobWV0aG9kLCBvcHRpb25zKTtcbiAgICB9LFxuXG4gICAgZXZlbnRzIDogZnVuY3Rpb24gKHNjb3BlKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgICAgUyA9IHNlbGYuUztcblxuICAgICAgUyh0aGlzLnNjb3BlKVxuICAgICAgICAub2ZmKCcucmV2ZWFsJylcbiAgICAgICAgLm9uKCdjbGljay5mbmR0bi5yZXZlYWwnLCAnWycgKyB0aGlzLmFkZF9uYW1lc3BhY2UoJ2RhdGEtcmV2ZWFsLWlkJykgKyAnXTpub3QoW2Rpc2FibGVkXSknLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgIGlmICghc2VsZi5sb2NrZWQpIHtcbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gUyh0aGlzKSxcbiAgICAgICAgICAgICAgICBhamF4ID0gZWxlbWVudC5kYXRhKHNlbGYuZGF0YV9hdHRyKCdyZXZlYWwtYWpheCcpKSxcbiAgICAgICAgICAgICAgICByZXBsYWNlQ29udGVudFNlbCA9IGVsZW1lbnQuZGF0YShzZWxmLmRhdGFfYXR0cigncmV2ZWFsLXJlcGxhY2UtY29udGVudCcpKTtcblxuICAgICAgICAgICAgc2VsZi5sb2NrZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGFqYXggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHNlbGYub3Blbi5jYWxsKHNlbGYsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIHVybCA9IGFqYXggPT09IHRydWUgPyBlbGVtZW50LmF0dHIoJ2hyZWYnKSA6IGFqYXg7XG4gICAgICAgICAgICAgIHNlbGYub3Blbi5jYWxsKHNlbGYsIGVsZW1lbnQsIHt1cmwgOiB1cmx9LCB7IHJlcGxhY2VDb250ZW50U2VsIDogcmVwbGFjZUNvbnRlbnRTZWwgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgUyhkb2N1bWVudClcbiAgICAgICAgLm9uKCdjbGljay5mbmR0bi5yZXZlYWwnLCB0aGlzLmNsb3NlX3RhcmdldHMoKSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgaWYgKCFzZWxmLmxvY2tlZCkge1xuICAgICAgICAgICAgdmFyIHNldHRpbmdzID0gUygnWycgKyBzZWxmLmF0dHJfbmFtZSgpICsgJ10ub3BlbicpLmRhdGEoc2VsZi5hdHRyX25hbWUodHJ1ZSkgKyAnLWluaXQnKSB8fCBzZWxmLnNldHRpbmdzLFxuICAgICAgICAgICAgICAgIGJnX2NsaWNrZWQgPSBTKGUudGFyZ2V0KVswXSA9PT0gUygnLicgKyBzZXR0aW5ncy5iZ19jbGFzcylbMF07XG5cbiAgICAgICAgICAgIGlmIChiZ19jbGlja2VkKSB7XG4gICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5jbG9zZV9vbl9iYWNrZ3JvdW5kX2NsaWNrKSB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VsZi5sb2NrZWQgPSB0cnVlO1xuICAgICAgICAgICAgc2VsZi5jbG9zZS5jYWxsKHNlbGYsIGJnX2NsaWNrZWQgPyBTKCdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnXS5vcGVuOm5vdCgudG9iYWNrKScpIDogUyh0aGlzKS5jbG9zZXN0KCdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnXScpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICBpZiAoUygnWycgKyBzZWxmLmF0dHJfbmFtZSgpICsgJ10nLCB0aGlzLnNjb3BlKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIFModGhpcy5zY29wZSlcbiAgICAgICAgICAvLyAub2ZmKCcucmV2ZWFsJylcbiAgICAgICAgICAub24oJ29wZW4uZm5kdG4ucmV2ZWFsJywgdGhpcy5zZXR0aW5ncy5vcGVuKVxuICAgICAgICAgIC5vbignb3BlbmVkLmZuZHRuLnJldmVhbCcsIHRoaXMuc2V0dGluZ3Mub3BlbmVkKVxuICAgICAgICAgIC5vbignb3BlbmVkLmZuZHRuLnJldmVhbCcsIHRoaXMub3Blbl92aWRlbylcbiAgICAgICAgICAub24oJ2Nsb3NlLmZuZHRuLnJldmVhbCcsIHRoaXMuc2V0dGluZ3MuY2xvc2UpXG4gICAgICAgICAgLm9uKCdjbG9zZWQuZm5kdG4ucmV2ZWFsJywgdGhpcy5zZXR0aW5ncy5jbG9zZWQpXG4gICAgICAgICAgLm9uKCdjbG9zZWQuZm5kdG4ucmV2ZWFsJywgdGhpcy5jbG9zZV92aWRlbyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBTKHRoaXMuc2NvcGUpXG4gICAgICAgICAgLy8gLm9mZignLnJldmVhbCcpXG4gICAgICAgICAgLm9uKCdvcGVuLmZuZHRuLnJldmVhbCcsICdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnXScsIHRoaXMuc2V0dGluZ3Mub3BlbilcbiAgICAgICAgICAub24oJ29wZW5lZC5mbmR0bi5yZXZlYWwnLCAnWycgKyBzZWxmLmF0dHJfbmFtZSgpICsgJ10nLCB0aGlzLnNldHRpbmdzLm9wZW5lZClcbiAgICAgICAgICAub24oJ29wZW5lZC5mbmR0bi5yZXZlYWwnLCAnWycgKyBzZWxmLmF0dHJfbmFtZSgpICsgJ10nLCB0aGlzLm9wZW5fdmlkZW8pXG4gICAgICAgICAgLm9uKCdjbG9zZS5mbmR0bi5yZXZlYWwnLCAnWycgKyBzZWxmLmF0dHJfbmFtZSgpICsgJ10nLCB0aGlzLnNldHRpbmdzLmNsb3NlKVxuICAgICAgICAgIC5vbignY2xvc2VkLmZuZHRuLnJldmVhbCcsICdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnXScsIHRoaXMuc2V0dGluZ3MuY2xvc2VkKVxuICAgICAgICAgIC5vbignY2xvc2VkLmZuZHRuLnJldmVhbCcsICdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnXScsIHRoaXMuY2xvc2VfdmlkZW8pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgLy8gUEFUQ0ggIzM6IHR1cm5pbmcgb24ga2V5IHVwIGNhcHR1cmUgb25seSB3aGVuIGEgcmV2ZWFsIHdpbmRvdyBpcyBvcGVuXG4gICAga2V5X3VwX29uIDogZnVuY3Rpb24gKHNjb3BlKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIFBBVENIICMxOiBmaXhpbmcgbXVsdGlwbGUga2V5dXAgZXZlbnQgdHJpZ2dlciBmcm9tIHNpbmdsZSBrZXkgcHJlc3NcbiAgICAgIHNlbGYuUygnYm9keScpLm9mZigna2V5dXAuZm5kdG4ucmV2ZWFsJykub24oJ2tleXVwLmZuZHRuLnJldmVhbCcsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG4gICAgICAgIHZhciBvcGVuX21vZGFsID0gc2VsZi5TKCdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnXS5vcGVuJyksXG4gICAgICAgICAgICBzZXR0aW5ncyA9IG9wZW5fbW9kYWwuZGF0YShzZWxmLmF0dHJfbmFtZSh0cnVlKSArICctaW5pdCcpIHx8IHNlbGYuc2V0dGluZ3MgO1xuICAgICAgICAvLyBQQVRDSCAjMjogbWFraW5nIHN1cmUgdGhhdCB0aGUgY2xvc2UgZXZlbnQgY2FuIGJlIGNhbGxlZCBvbmx5IHdoaWxlIHVubG9ja2VkLFxuICAgICAgICAvLyAgICAgICAgICAgc28gdGhhdCBtdWx0aXBsZSBrZXl1cC5mbmR0bi5yZXZlYWwgZXZlbnRzIGRvbid0IHByZXZlbnQgY2xlYW4gY2xvc2luZyBvZiB0aGUgcmV2ZWFsIHdpbmRvdy5cbiAgICAgICAgaWYgKCBzZXR0aW5ncyAmJiBldmVudC53aGljaCA9PT0gMjcgICYmIHNldHRpbmdzLmNsb3NlX29uX2VzYyAmJiAhc2VsZi5sb2NrZWQpIHsgLy8gMjcgaXMgdGhlIGtleWNvZGUgZm9yIHRoZSBFc2NhcGUga2V5XG4gICAgICAgICAgc2VsZi5jbG9zZS5jYWxsKHNlbGYsIG9wZW5fbW9kYWwpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIC8vIFBBVENIICMzOiB0dXJuaW5nIG9uIGtleSB1cCBjYXB0dXJlIG9ubHkgd2hlbiBhIHJldmVhbCB3aW5kb3cgaXMgb3BlblxuICAgIGtleV91cF9vZmYgOiBmdW5jdGlvbiAoc2NvcGUpIHtcbiAgICAgIHRoaXMuUygnYm9keScpLm9mZigna2V5dXAuZm5kdG4ucmV2ZWFsJyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgb3BlbiA6IGZ1bmN0aW9uICh0YXJnZXQsIGFqYXhfc2V0dGluZ3MpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgICBtb2RhbDtcblxuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBpZiAodHlwZW9mIHRhcmdldC5zZWxlY3RvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAvLyBGaW5kIHRoZSBuYW1lZCBub2RlOyBvbmx5IHVzZSB0aGUgZmlyc3Qgb25lIGZvdW5kLCBzaW5jZSB0aGUgcmVzdCBvZiB0aGUgY29kZSBhc3N1bWVzIHRoZXJlJ3Mgb25seSBvbmUgbm9kZVxuICAgICAgICAgIG1vZGFsID0gc2VsZi5TKCcjJyArIHRhcmdldC5kYXRhKHNlbGYuZGF0YV9hdHRyKCdyZXZlYWwtaWQnKSkpLmZpcnN0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbW9kYWwgPSBzZWxmLlModGhpcy5zY29wZSk7XG5cbiAgICAgICAgICBhamF4X3NldHRpbmdzID0gdGFyZ2V0O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtb2RhbCA9IHNlbGYuUyh0aGlzLnNjb3BlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNldHRpbmdzID0gbW9kYWwuZGF0YShzZWxmLmF0dHJfbmFtZSh0cnVlKSArICctaW5pdCcpO1xuICAgICAgc2V0dGluZ3MgPSBzZXR0aW5ncyB8fCB0aGlzLnNldHRpbmdzO1xuXG5cbiAgICAgIGlmIChtb2RhbC5oYXNDbGFzcygnb3BlbicpICYmIHRhcmdldCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldC5hdHRyKCdkYXRhLXJldmVhbC1pZCcpID09IG1vZGFsLmF0dHIoJ2lkJykpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuY2xvc2UobW9kYWwpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW1vZGFsLmhhc0NsYXNzKCdvcGVuJykpIHtcbiAgICAgICAgdmFyIG9wZW5fbW9kYWwgPSBzZWxmLlMoJ1snICsgc2VsZi5hdHRyX25hbWUoKSArICddLm9wZW4nKTtcblxuICAgICAgICBpZiAodHlwZW9mIG1vZGFsLmRhdGEoJ2Nzcy10b3AnKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBtb2RhbC5kYXRhKCdjc3MtdG9wJywgcGFyc2VJbnQobW9kYWwuY3NzKCd0b3AnKSwgMTApKVxuICAgICAgICAgICAgLmRhdGEoJ29mZnNldCcsIHRoaXMuY2FjaGVfb2Zmc2V0KG1vZGFsKSk7XG4gICAgICAgIH1cblxuICAgICAgICBtb2RhbC5hdHRyKCd0YWJpbmRleCcsJzAnKS5hdHRyKCdhcmlhLWhpZGRlbicsJ2ZhbHNlJyk7XG5cbiAgICAgICAgdGhpcy5rZXlfdXBfb24obW9kYWwpOyAgICAvLyBQQVRDSCAjMzogdHVybmluZyBvbiBrZXkgdXAgY2FwdHVyZSBvbmx5IHdoZW4gYSByZXZlYWwgd2luZG93IGlzIG9wZW5cblxuICAgICAgICAvLyBQcmV2ZW50IG5hbWVzcGFjZSBldmVudCBmcm9tIHRyaWdnZXJpbmcgdHdpY2VcbiAgICAgICAgbW9kYWwub24oJ29wZW4uZm5kdG4ucmV2ZWFsJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgIGlmIChlLm5hbWVzcGFjZSAhPT0gJ2ZuZHRuLnJldmVhbCcpIHJldHVybjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbW9kYWwub24oJ29wZW4uZm5kdG4ucmV2ZWFsJykudHJpZ2dlcignb3Blbi5mbmR0bi5yZXZlYWwnKTtcblxuICAgICAgICBpZiAob3Blbl9tb2RhbC5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgdGhpcy50b2dnbGVfYmcobW9kYWwsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBhamF4X3NldHRpbmdzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGFqYXhfc2V0dGluZ3MgPSB7XG4gICAgICAgICAgICB1cmwgOiBhamF4X3NldHRpbmdzXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvcGVuTW9kYWwgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZihvcGVuX21vZGFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmKHNldHRpbmdzLm11bHRpcGxlX29wZW5lZCkge1xuICAgICAgICAgICAgICBzZWxmLnRvX2JhY2sob3Blbl9tb2RhbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZWxmLmhpZGUob3Blbl9tb2RhbCwgc2V0dGluZ3MuY3NzLmNsb3NlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBibDogYWRkIHRoZSBvcGVuX21vZGFsIHRoYXQgaXNuJ3QgYWxyZWFkeSBpbiB0aGUgYmFja2dyb3VuZCB0byB0aGUgb3Blbk1vZGFscyBhcnJheVxuICAgICAgICAgIGlmKHNldHRpbmdzLm11bHRpcGxlX29wZW5lZCkge1xuICAgICAgICAgICAgb3Blbk1vZGFscy5wdXNoKG1vZGFsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWxmLnNob3cobW9kYWwsIHNldHRpbmdzLmNzcy5vcGVuKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodHlwZW9mIGFqYXhfc2V0dGluZ3MgPT09ICd1bmRlZmluZWQnIHx8ICFhamF4X3NldHRpbmdzLnVybCkge1xuICAgICAgICAgIG9wZW5Nb2RhbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBvbGRfc3VjY2VzcyA9IHR5cGVvZiBhamF4X3NldHRpbmdzLnN1Y2Nlc3MgIT09ICd1bmRlZmluZWQnID8gYWpheF9zZXR0aW5ncy5zdWNjZXNzIDogbnVsbDtcbiAgICAgICAgICAkLmV4dGVuZChhamF4X3NldHRpbmdzLCB7XG4gICAgICAgICAgICBzdWNjZXNzIDogZnVuY3Rpb24gKGRhdGEsIHRleHRTdGF0dXMsIGpxWEhSKSB7XG4gICAgICAgICAgICAgIGlmICggJC5pc0Z1bmN0aW9uKG9sZF9zdWNjZXNzKSApIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gb2xkX3N1Y2Nlc3MoZGF0YSwgdGV4dFN0YXR1cywganFYSFIpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICBkYXRhID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMucmVwbGFjZUNvbnRlbnRTZWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbW9kYWwuZmluZChvcHRpb25zLnJlcGxhY2VDb250ZW50U2VsKS5odG1sKGRhdGEpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1vZGFsLmh0bWwoZGF0YSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzZWxmLlMobW9kYWwpLmZvdW5kYXRpb24oJ3NlY3Rpb24nLCAncmVmbG93Jyk7XG4gICAgICAgICAgICAgIHNlbGYuUyhtb2RhbCkuY2hpbGRyZW4oKS5mb3VuZGF0aW9uKCk7XG5cbiAgICAgICAgICAgICAgb3Blbk1vZGFsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBjaGVjayBmb3IgaWYgdXNlciBpbml0YWxpemVkIHdpdGggZXJyb3IgY2FsbGJhY2tcbiAgICAgICAgICBpZiAoc2V0dGluZ3Mub25fYWpheF9lcnJvciAhPT0gJC5ub29wKSB7XG4gICAgICAgICAgICAkLmV4dGVuZChhamF4X3NldHRpbmdzLCB7XG4gICAgICAgICAgICAgIGVycm9yIDogc2V0dGluZ3Mub25fYWpheF9lcnJvclxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgJC5hamF4KGFqYXhfc2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZWxmLlMod2luZG93KS50cmlnZ2VyKCdyZXNpemUnKTtcbiAgICB9LFxuXG4gICAgY2xvc2UgOiBmdW5jdGlvbiAobW9kYWwpIHtcbiAgICAgIHZhciBtb2RhbCA9IG1vZGFsICYmIG1vZGFsLmxlbmd0aCA/IG1vZGFsIDogdGhpcy5TKHRoaXMuc2NvcGUpLFxuICAgICAgICAgIG9wZW5fbW9kYWxzID0gdGhpcy5TKCdbJyArIHRoaXMuYXR0cl9uYW1lKCkgKyAnXS5vcGVuJyksXG4gICAgICAgICAgc2V0dGluZ3MgPSBtb2RhbC5kYXRhKHRoaXMuYXR0cl9uYW1lKHRydWUpICsgJy1pbml0JykgfHwgdGhpcy5zZXR0aW5ncyxcbiAgICAgICAgICBzZWxmID0gdGhpcztcblxuICAgICAgaWYgKG9wZW5fbW9kYWxzLmxlbmd0aCA+IDApIHtcblxuICAgICAgICBtb2RhbC5yZW1vdmVBdHRyKCd0YWJpbmRleCcsJzAnKS5hdHRyKCdhcmlhLWhpZGRlbicsJ3RydWUnKTtcblxuICAgICAgICB0aGlzLmxvY2tlZCA9IHRydWU7XG4gICAgICAgIHRoaXMua2V5X3VwX29mZihtb2RhbCk7ICAgLy8gUEFUQ0ggIzM6IHR1cm5pbmcgb24ga2V5IHVwIGNhcHR1cmUgb25seSB3aGVuIGEgcmV2ZWFsIHdpbmRvdyBpcyBvcGVuXG5cbiAgICAgICAgbW9kYWwudHJpZ2dlcignY2xvc2UuZm5kdG4ucmV2ZWFsJyk7XG5cbiAgICAgICAgaWYgKChzZXR0aW5ncy5tdWx0aXBsZV9vcGVuZWQgJiYgb3Blbl9tb2RhbHMubGVuZ3RoID09PSAxKSB8fCAhc2V0dGluZ3MubXVsdGlwbGVfb3BlbmVkIHx8IG1vZGFsLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBzZWxmLnRvZ2dsZV9iZyhtb2RhbCwgZmFsc2UpO1xuICAgICAgICAgIHNlbGYudG9fZnJvbnQobW9kYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNldHRpbmdzLm11bHRpcGxlX29wZW5lZCkge1xuICAgICAgICAgIHZhciBpc0N1cnJlbnQgPSBtb2RhbC5pcygnOm5vdCgudG9iYWNrKScpO1xuICAgICAgICAgIHNlbGYuaGlkZShtb2RhbCwgc2V0dGluZ3MuY3NzLmNsb3NlLCBzZXR0aW5ncyk7XG4gICAgICAgICAgaWYoaXNDdXJyZW50KSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgdGhlIGxhc3QgbW9kYWwgc2luY2UgaXQgaXMgbm93IGNsb3NlZFxuICAgICAgICAgICAgb3Blbk1vZGFscy5wb3AoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgdGhpcyBpc24ndCB0aGUgY3VycmVudCBtb2RhbCwgdGhlbiBmaW5kIGl0IGluIHRoZSBhcnJheSBhbmQgcmVtb3ZlIGl0XG4gICAgICAgICAgICBvcGVuTW9kYWxzID0gJC5ncmVwKG9wZW5Nb2RhbHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgICB2YXIgaXNUaGlzID0gZWx0WzBdPT09bW9kYWxbMF07XG4gICAgICAgICAgICAgIGlmKGlzVGhpcykge1xuICAgICAgICAgICAgICAgIC8vIHNpbmNlIGl0J3Mgbm90IGN1cnJlbnRseSBpbiB0aGUgZnJvbnQsIHB1dCBpdCBpbiB0aGUgZnJvbnQgbm93IHRoYXQgaXQgaXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgLy8gc28gdGhhdCBpZiBpdCdzIHJlLW9wZW5lZCwgaXQgd29uJ3QgYmUgLnRvYmFja1xuICAgICAgICAgICAgICAgIHNlbGYudG9fZnJvbnQobW9kYWwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiAhaXNUaGlzO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGZpbmFsbHksIHNob3cgdGhlIG5leHQgbW9kYWwgaW4gdGhlIHN0YWNrLCBpZiB0aGVyZSBpcyBvbmVcbiAgICAgICAgICBpZihvcGVuTW9kYWxzLmxlbmd0aD4wKSB7XG4gICAgICAgICAgICBzZWxmLnRvX2Zyb250KG9wZW5Nb2RhbHNbb3Blbk1vZGFscy5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYuaGlkZShvcGVuX21vZGFscywgc2V0dGluZ3MuY3NzLmNsb3NlLCBzZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2xvc2VfdGFyZ2V0cyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBiYXNlID0gJy4nICsgdGhpcy5zZXR0aW5ncy5kaXNtaXNzX21vZGFsX2NsYXNzO1xuXG4gICAgICBpZiAodGhpcy5zZXR0aW5ncy5jbG9zZV9vbl9iYWNrZ3JvdW5kX2NsaWNrKSB7XG4gICAgICAgIHJldHVybiBiYXNlICsgJywgLicgKyB0aGlzLnNldHRpbmdzLmJnX2NsYXNzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYmFzZTtcbiAgICB9LFxuXG4gICAgdG9nZ2xlX2JnIDogZnVuY3Rpb24gKG1vZGFsLCBzdGF0ZSkge1xuICAgICAgaWYgKHRoaXMuUygnLicgKyB0aGlzLnNldHRpbmdzLmJnX2NsYXNzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5iZyA9ICQoJzxkaXYgLz4nLCB7J2NsYXNzJzogdGhpcy5zZXR0aW5ncy5iZ19jbGFzc30pXG4gICAgICAgICAgLmFwcGVuZFRvKCdib2R5JykuaGlkZSgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdmlzaWJsZSA9IHRoaXMuc2V0dGluZ3MuYmcuZmlsdGVyKCc6dmlzaWJsZScpLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoIHN0YXRlICE9IHZpc2libGUgKSB7XG4gICAgICAgIGlmICggc3RhdGUgPT0gdW5kZWZpbmVkID8gdmlzaWJsZSA6ICFzdGF0ZSApIHtcbiAgICAgICAgICB0aGlzLmhpZGUodGhpcy5zZXR0aW5ncy5iZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zaG93KHRoaXMuc2V0dGluZ3MuYmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHNob3cgOiBmdW5jdGlvbiAoZWwsIGNzcykge1xuICAgICAgLy8gaXMgbW9kYWxcbiAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgdmFyIHNldHRpbmdzID0gZWwuZGF0YSh0aGlzLmF0dHJfbmFtZSh0cnVlKSArICctaW5pdCcpIHx8IHRoaXMuc2V0dGluZ3MsXG4gICAgICAgICAgICByb290X2VsZW1lbnQgPSBzZXR0aW5ncy5yb290X2VsZW1lbnQsXG4gICAgICAgICAgICBjb250ZXh0ID0gdGhpcztcblxuICAgICAgICBpZiAoZWwucGFyZW50KHJvb3RfZWxlbWVudCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdmFyIHBsYWNlaG9sZGVyID0gZWwud3JhcCgnPGRpdiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgLz4nKS5wYXJlbnQoKTtcblxuICAgICAgICAgIGVsLm9uKCdjbG9zZWQuZm5kdG4ucmV2ZWFsLndyYXBwZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBlbC5kZXRhY2goKS5hcHBlbmRUbyhwbGFjZWhvbGRlcik7XG4gICAgICAgICAgICBlbC51bndyYXAoKS51bmJpbmQoJ2Nsb3NlZC5mbmR0bi5yZXZlYWwud3JhcHBlZCcpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgZWwuZGV0YWNoKCkuYXBwZW5kVG8ocm9vdF9lbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhbmltRGF0YSA9IGdldEFuaW1hdGlvbkRhdGEoc2V0dGluZ3MuYW5pbWF0aW9uKTtcbiAgICAgICAgaWYgKCFhbmltRGF0YS5hbmltYXRlKSB7XG4gICAgICAgICAgdGhpcy5sb2NrZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5pbURhdGEucG9wKSB7XG4gICAgICAgICAgY3NzLnRvcCA9ICQod2luZG93KS5zY3JvbGxUb3AoKSAtIGVsLmRhdGEoJ29mZnNldCcpICsgJ3B4JztcbiAgICAgICAgICB2YXIgZW5kX2NzcyA9IHtcbiAgICAgICAgICAgIHRvcDogJCh3aW5kb3cpLnNjcm9sbFRvcCgpICsgZWwuZGF0YSgnY3NzLXRvcCcpICsgJ3B4JyxcbiAgICAgICAgICAgIG9wYWNpdHk6IDFcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsXG4gICAgICAgICAgICAgIC5jc3MoY3NzKVxuICAgICAgICAgICAgICAuYW5pbWF0ZShlbmRfY3NzLCBzZXR0aW5ncy5hbmltYXRpb25fc3BlZWQsICdsaW5lYXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5sb2NrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBlbC50cmlnZ2VyKCdvcGVuZWQuZm5kdG4ucmV2ZWFsJyk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5hZGRDbGFzcygnb3BlbicpO1xuICAgICAgICAgIH0sIHNldHRpbmdzLmFuaW1hdGlvbl9zcGVlZCAvIDIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY3NzLnRvcCA9ICQod2luZG93KS5zY3JvbGxUb3AoKSArIGVsLmRhdGEoJ2Nzcy10b3AnKSArICdweCc7XG5cbiAgICAgICAgaWYgKGFuaW1EYXRhLmZhZGUpIHtcbiAgICAgICAgICB2YXIgZW5kX2NzcyA9IHtvcGFjaXR5OiAxfTtcblxuICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBlbFxuICAgICAgICAgICAgICAuY3NzKGNzcylcbiAgICAgICAgICAgICAgLmFuaW1hdGUoZW5kX2Nzcywgc2V0dGluZ3MuYW5pbWF0aW9uX3NwZWVkLCAnbGluZWFyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQubG9ja2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZWwudHJpZ2dlcignb3BlbmVkLmZuZHRuLnJldmVhbCcpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ29wZW4nKTtcbiAgICAgICAgICB9LCBzZXR0aW5ncy5hbmltYXRpb25fc3BlZWQgLyAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbC5jc3MoY3NzKS5zaG93KCkuY3NzKHtvcGFjaXR5IDogMX0pLmFkZENsYXNzKCdvcGVuJykudHJpZ2dlcignb3BlbmVkLmZuZHRuLnJldmVhbCcpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzO1xuXG4gICAgICAvLyBzaG91bGQgd2UgYW5pbWF0ZSB0aGUgYmFja2dyb3VuZD9cbiAgICAgIGlmIChnZXRBbmltYXRpb25EYXRhKHNldHRpbmdzLmFuaW1hdGlvbikuZmFkZSkge1xuICAgICAgICByZXR1cm4gZWwuZmFkZUluKHNldHRpbmdzLmFuaW1hdGlvbl9zcGVlZCAvIDIpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlO1xuXG4gICAgICByZXR1cm4gZWwuc2hvdygpO1xuICAgIH0sXG5cbiAgICB0b19iYWNrIDogZnVuY3Rpb24oZWwpIHtcbiAgICAgIGVsLmFkZENsYXNzKCd0b2JhY2snKTtcbiAgICB9LFxuXG4gICAgdG9fZnJvbnQgOiBmdW5jdGlvbihlbCkge1xuICAgICAgZWwucmVtb3ZlQ2xhc3MoJ3RvYmFjaycpO1xuICAgIH0sXG5cbiAgICBoaWRlIDogZnVuY3Rpb24gKGVsLCBjc3MpIHtcbiAgICAgIC8vIGlzIG1vZGFsXG4gICAgICBpZiAoY3NzKSB7XG4gICAgICAgIHZhciBzZXR0aW5ncyA9IGVsLmRhdGEodGhpcy5hdHRyX25hbWUodHJ1ZSkgKyAnLWluaXQnKSxcbiAgICAgICAgICAgIGNvbnRleHQgPSB0aGlzO1xuICAgICAgICBzZXR0aW5ncyA9IHNldHRpbmdzIHx8IHRoaXMuc2V0dGluZ3M7XG5cbiAgICAgICAgdmFyIGFuaW1EYXRhID0gZ2V0QW5pbWF0aW9uRGF0YShzZXR0aW5ncy5hbmltYXRpb24pO1xuICAgICAgICBpZiAoIWFuaW1EYXRhLmFuaW1hdGUpIHtcbiAgICAgICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbmltRGF0YS5wb3ApIHtcbiAgICAgICAgICB2YXIgZW5kX2NzcyA9IHtcbiAgICAgICAgICAgIHRvcDogLSAkKHdpbmRvdykuc2Nyb2xsVG9wKCkgLSBlbC5kYXRhKCdvZmZzZXQnKSArICdweCcsXG4gICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBlbFxuICAgICAgICAgICAgICAuYW5pbWF0ZShlbmRfY3NzLCBzZXR0aW5ncy5hbmltYXRpb25fc3BlZWQsICdsaW5lYXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5sb2NrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBlbC5jc3MoY3NzKS50cmlnZ2VyKCdjbG9zZWQuZm5kdG4ucmV2ZWFsJyk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnb3BlbicpO1xuICAgICAgICAgIH0sIHNldHRpbmdzLmFuaW1hdGlvbl9zcGVlZCAvIDIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFuaW1EYXRhLmZhZGUpIHtcbiAgICAgICAgICB2YXIgZW5kX2NzcyA9IHtvcGFjaXR5IDogMH07XG5cbiAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxcbiAgICAgICAgICAgICAgLmFuaW1hdGUoZW5kX2Nzcywgc2V0dGluZ3MuYW5pbWF0aW9uX3NwZWVkLCAnbGluZWFyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQubG9ja2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZWwuY3NzKGNzcykudHJpZ2dlcignY2xvc2VkLmZuZHRuLnJldmVhbCcpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ29wZW4nKTtcbiAgICAgICAgICB9LCBzZXR0aW5ncy5hbmltYXRpb25fc3BlZWQgLyAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbC5oaWRlKCkuY3NzKGNzcykucmVtb3ZlQ2xhc3MoJ29wZW4nKS50cmlnZ2VyKCdjbG9zZWQuZm5kdG4ucmV2ZWFsJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3M7XG5cbiAgICAgIC8vIHNob3VsZCB3ZSBhbmltYXRlIHRoZSBiYWNrZ3JvdW5kP1xuICAgICAgaWYgKGdldEFuaW1hdGlvbkRhdGEoc2V0dGluZ3MuYW5pbWF0aW9uKS5mYWRlKSB7XG4gICAgICAgIHJldHVybiBlbC5mYWRlT3V0KHNldHRpbmdzLmFuaW1hdGlvbl9zcGVlZCAvIDIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZWwuaGlkZSgpO1xuICAgIH0sXG5cbiAgICBjbG9zZV92aWRlbyA6IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdmlkZW8gPSAkKCcuZmxleC12aWRlbycsIGUudGFyZ2V0KSxcbiAgICAgICAgICBpZnJhbWUgPSAkKCdpZnJhbWUnLCB2aWRlbyk7XG5cbiAgICAgIGlmIChpZnJhbWUubGVuZ3RoID4gMCkge1xuICAgICAgICBpZnJhbWUuYXR0cignZGF0YS1zcmMnLCBpZnJhbWVbMF0uc3JjKTtcbiAgICAgICAgaWZyYW1lLmF0dHIoJ3NyYycsIGlmcmFtZS5hdHRyKCdzcmMnKSk7XG4gICAgICAgIHZpZGVvLmhpZGUoKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb3Blbl92aWRlbyA6IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdmlkZW8gPSAkKCcuZmxleC12aWRlbycsIGUudGFyZ2V0KSxcbiAgICAgICAgICBpZnJhbWUgPSB2aWRlby5maW5kKCdpZnJhbWUnKTtcblxuICAgICAgaWYgKGlmcmFtZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBkYXRhX3NyYyA9IGlmcmFtZS5hdHRyKCdkYXRhLXNyYycpO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFfc3JjID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmcmFtZVswXS5zcmMgPSBpZnJhbWUuYXR0cignZGF0YS1zcmMnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc3JjID0gaWZyYW1lWzBdLnNyYztcbiAgICAgICAgICBpZnJhbWVbMF0uc3JjID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGlmcmFtZVswXS5zcmMgPSBzcmM7XG4gICAgICAgIH1cbiAgICAgICAgdmlkZW8uc2hvdygpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBkYXRhX2F0dHIgOiBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICBpZiAodGhpcy5uYW1lc3BhY2UubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2UgKyAnLScgKyBzdHI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdHI7XG4gICAgfSxcblxuICAgIGNhY2hlX29mZnNldCA6IGZ1bmN0aW9uIChtb2RhbCkge1xuICAgICAgdmFyIG9mZnNldCA9IG1vZGFsLnNob3coKS5oZWlnaHQoKSArIHBhcnNlSW50KG1vZGFsLmNzcygndG9wJyksIDEwKSArIG1vZGFsLnNjcm9sbFk7XG5cbiAgICAgIG1vZGFsLmhpZGUoKTtcblxuICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9LFxuXG4gICAgb2ZmIDogZnVuY3Rpb24gKCkge1xuICAgICAgJCh0aGlzLnNjb3BlKS5vZmYoJy5mbmR0bi5yZXZlYWwnKTtcbiAgICB9LFxuXG4gICAgcmVmbG93IDogZnVuY3Rpb24gKCkge31cbiAgfTtcblxuICAvKlxuICAgKiBnZXRBbmltYXRpb25EYXRhKCdwb3BBbmRGYWRlJykgLy8ge2FuaW1hdGU6IHRydWUsICBwb3A6IHRydWUsICBmYWRlOiB0cnVlfVxuICAgKiBnZXRBbmltYXRpb25EYXRhKCdmYWRlJykgICAgICAgLy8ge2FuaW1hdGU6IHRydWUsICBwb3A6IGZhbHNlLCBmYWRlOiB0cnVlfVxuICAgKiBnZXRBbmltYXRpb25EYXRhKCdwb3AnKSAgICAgICAgLy8ge2FuaW1hdGU6IHRydWUsICBwb3A6IHRydWUsICBmYWRlOiBmYWxzZX1cbiAgICogZ2V0QW5pbWF0aW9uRGF0YSgnZm9vJykgICAgICAgIC8vIHthbmltYXRlOiBmYWxzZSwgcG9wOiBmYWxzZSwgZmFkZTogZmFsc2V9XG4gICAqIGdldEFuaW1hdGlvbkRhdGEobnVsbCkgICAgICAgICAvLyB7YW5pbWF0ZTogZmFsc2UsIHBvcDogZmFsc2UsIGZhZGU6IGZhbHNlfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QW5pbWF0aW9uRGF0YShzdHIpIHtcbiAgICB2YXIgZmFkZSA9IC9mYWRlL2kudGVzdChzdHIpO1xuICAgIHZhciBwb3AgPSAvcG9wL2kudGVzdChzdHIpO1xuICAgIHJldHVybiB7XG4gICAgICBhbmltYXRlIDogZmFkZSB8fCBwb3AsXG4gICAgICBwb3AgOiBwb3AsXG4gICAgICBmYWRlIDogZmFkZVxuICAgIH07XG4gIH1cbn0oalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCkpO1xuIiwiOyhmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBGb3VuZGF0aW9uLmxpYnMudGFiID0ge1xuICAgIG5hbWUgOiAndGFiJyxcblxuICAgIHZlcnNpb24gOiAnNS41LjMnLFxuXG4gICAgc2V0dGluZ3MgOiB7XG4gICAgICBhY3RpdmVfY2xhc3MgOiAnYWN0aXZlJyxcbiAgICAgIGNhbGxiYWNrIDogZnVuY3Rpb24gKCkge30sXG4gICAgICBkZWVwX2xpbmtpbmcgOiBmYWxzZSxcbiAgICAgIHNjcm9sbF90b19jb250ZW50IDogdHJ1ZSxcbiAgICAgIGlzX2hvdmVyIDogZmFsc2VcbiAgICB9LFxuXG4gICAgZGVmYXVsdF90YWJfaGFzaGVzIDogW10sXG5cbiAgICBpbml0IDogZnVuY3Rpb24gKHNjb3BlLCBtZXRob2QsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgICBTID0gdGhpcy5TO1xuXG4gIFx0ICAvLyBTdG9yZSB0aGUgZGVmYXVsdCBhY3RpdmUgdGFicyB3aGljaCB3aWxsIGJlIHJlZmVyZW5jZWQgd2hlbiB0aGVcbiAgXHQgIC8vIGxvY2F0aW9uIGhhc2ggaXMgYWJzZW50LCBhcyBpbiB0aGUgY2FzZSBvZiBuYXZpZ2F0aW5nIHRoZSB0YWJzIGFuZFxuICBcdCAgLy8gcmV0dXJuaW5nIHRvIHRoZSBmaXJzdCB2aWV3aW5nIHZpYSB0aGUgYnJvd3NlciBCYWNrIGJ1dHRvbi5cbiAgXHQgIFMoJ1snICsgdGhpcy5hdHRyX25hbWUoKSArICddID4gLmFjdGl2ZSA+IGEnLCB0aGlzLnNjb3BlKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgXHQgICAgc2VsZi5kZWZhdWx0X3RhYl9oYXNoZXMucHVzaCh0aGlzLmhhc2gpO1xuICBcdCAgfSk7XG5cbiAgICAgIHRoaXMuYmluZGluZ3MobWV0aG9kLCBvcHRpb25zKTtcbiAgICAgIHRoaXMuaGFuZGxlX2xvY2F0aW9uX2hhc2hfY2hhbmdlKCk7XG4gICAgfSxcblxuICAgIGV2ZW50cyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgICBTID0gdGhpcy5TO1xuXG4gICAgICB2YXIgdXN1YWxfdGFiX2JlaGF2aW9yID0gIGZ1bmN0aW9uIChlLCB0YXJnZXQpIHtcbiAgICAgICAgdmFyIHNldHRpbmdzID0gUyh0YXJnZXQpLmNsb3Nlc3QoJ1snICsgc2VsZi5hdHRyX25hbWUoKSArICddJykuZGF0YShzZWxmLmF0dHJfbmFtZSh0cnVlKSArICctaW5pdCcpO1xuICAgICAgICBpZiAoIXNldHRpbmdzLmlzX2hvdmVyIHx8IE1vZGVybml6ci50b3VjaCkge1xuICAgICAgICAgIC8vIGlmIHVzZXIgZGlkIG5vdCBwcmVzc2VkIHRhYiBrZXksIHByZXZlbnQgZGVmYXVsdCBhY3Rpb25cbiAgICAgICAgICB2YXIga2V5Q29kZSA9IGUua2V5Q29kZSB8fCBlLndoaWNoO1xuICAgICAgICAgIGlmIChrZXlDb2RlICE9PSA5KSB7IFxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZi50b2dnbGVfYWN0aXZlX3RhYihTKHRhcmdldCkucGFyZW50KCkpO1xuICAgICAgICAgIFxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBTKHRoaXMuc2NvcGUpXG4gICAgICAgIC5vZmYoJy50YWInKVxuICAgICAgICAvLyBLZXkgZXZlbnQ6IGZvY3VzL3RhYiBrZXlcbiAgICAgICAgLm9uKCdrZXlkb3duLmZuZHRuLnRhYicsICdbJyArIHRoaXMuYXR0cl9uYW1lKCkgKyAnXSA+ICogPiBhJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgIHZhciBrZXlDb2RlID0gZS5rZXlDb2RlIHx8IGUud2hpY2g7XG4gICAgICAgICAgLy8gaWYgdXNlciBwcmVzc2VkIHRhYiBrZXlcbiAgICAgICAgICBpZiAoa2V5Q29kZSA9PT0gMTMgfHwga2V5Q29kZSA9PT0gMzIpIHsgLy8gZW50ZXIgb3Igc3BhY2VcbiAgICAgICAgICAgIHZhciBlbCA9IHRoaXM7XG4gICAgICAgICAgICB1c3VhbF90YWJfYmVoYXZpb3IoZSwgZWwpO1xuICAgICAgICAgIH0gXG4gICAgICAgIH0pXG4gICAgICAgIC8vIENsaWNrIGV2ZW50OiB0YWIgdGl0bGVcbiAgICAgICAgLm9uKCdjbGljay5mbmR0bi50YWInLCAnWycgKyB0aGlzLmF0dHJfbmFtZSgpICsgJ10gPiAqID4gYScsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICB2YXIgZWwgPSB0aGlzO1xuICAgICAgICAgIHVzdWFsX3RhYl9iZWhhdmlvcihlLCBlbCk7XG4gICAgICAgIH0pXG4gICAgICAgIC8vIEhvdmVyIGV2ZW50OiB0YWIgdGl0bGVcbiAgICAgICAgLm9uKCdtb3VzZWVudGVyLmZuZHRuLnRhYicsICdbJyArIHRoaXMuYXR0cl9uYW1lKCkgKyAnXSA+ICogPiBhJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICB2YXIgc2V0dGluZ3MgPSBTKHRoaXMpLmNsb3Nlc3QoJ1snICsgc2VsZi5hdHRyX25hbWUoKSArICddJykuZGF0YShzZWxmLmF0dHJfbmFtZSh0cnVlKSArICctaW5pdCcpO1xuICAgICAgICAgIGlmIChzZXR0aW5ncy5pc19ob3Zlcikge1xuICAgICAgICAgICAgc2VsZi50b2dnbGVfYWN0aXZlX3RhYihTKHRoaXMpLnBhcmVudCgpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBMb2NhdGlvbiBoYXNoIGNoYW5nZSBldmVudFxuICAgICAgUyh3aW5kb3cpLm9uKCdoYXNoY2hhbmdlLmZuZHRuLnRhYicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2VsZi5oYW5kbGVfbG9jYXRpb25faGFzaF9jaGFuZ2UoKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBoYW5kbGVfbG9jYXRpb25faGFzaF9jaGFuZ2UgOiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgICBTID0gdGhpcy5TO1xuXG4gICAgICBTKCdbJyArIHRoaXMuYXR0cl9uYW1lKCkgKyAnXScsIHRoaXMuc2NvcGUpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2V0dGluZ3MgPSBTKHRoaXMpLmRhdGEoc2VsZi5hdHRyX25hbWUodHJ1ZSkgKyAnLWluaXQnKTtcbiAgICAgICAgaWYgKHNldHRpbmdzLmRlZXBfbGlua2luZykge1xuICAgICAgICAgIC8vIE1hdGNoIHRoZSBsb2NhdGlvbiBoYXNoIHRvIGEgbGFiZWxcbiAgICAgICAgICB2YXIgaGFzaDtcbiAgICAgICAgICBpZiAoc2V0dGluZ3Muc2Nyb2xsX3RvX2NvbnRlbnQpIHtcbiAgICAgICAgICAgIGhhc2ggPSBzZWxmLnNjb3BlLmxvY2F0aW9uLmhhc2g7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHByZWZpeCB0aGUgaGFzaCB0byBwcmV2ZW50IGFuY2hvciBzY3JvbGxpbmdcbiAgICAgICAgICAgIGhhc2ggPSBzZWxmLnNjb3BlLmxvY2F0aW9uLmhhc2gucmVwbGFjZSgnZm5kdG4tJywgJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFzaCAhPSAnJykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgbG9jYXRpb24gaGFzaCByZWZlcmVuY2VzIGEgdGFiIGNvbnRlbnQgZGl2IG9yXG4gICAgICAgICAgICAvLyBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBhZ2UgKGluc2lkZSBvciBvdXRzaWRlIHRoZSB0YWIgY29udGVudCBkaXYpXG4gICAgICAgICAgICB2YXIgaGFzaF9lbGVtZW50ID0gUyhoYXNoKTtcbiAgICAgICAgICAgIGlmIChoYXNoX2VsZW1lbnQuaGFzQ2xhc3MoJ2NvbnRlbnQnKSAmJiBoYXNoX2VsZW1lbnQucGFyZW50KCkuaGFzQ2xhc3MoJ3RhYnMtY29udGVudCcpKSB7XG4gICAgICAgICAgICAgIC8vIFRhYiBjb250ZW50IGRpdlxuICAgICAgICAgICAgICBzZWxmLnRvZ2dsZV9hY3RpdmVfdGFiKCQoJ1snICsgc2VsZi5hdHRyX25hbWUoKSArICddID4gKiA+IGFbaHJlZj0nICsgaGFzaCArICddJykucGFyZW50KCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTm90IHRoZSB0YWIgY29udGVudCBkaXYuIElmIGluc2lkZSB0aGUgdGFiIGNvbnRlbnQsIGZpbmQgdGhlXG4gICAgICAgICAgICAgIC8vIGNvbnRhaW5pbmcgdGFiIGFuZCB0b2dnbGUgaXQgYXMgYWN0aXZlLlxuICAgICAgICAgICAgICB2YXIgaGFzaF90YWJfY29udGFpbmVyX2lkID0gaGFzaF9lbGVtZW50LmNsb3Nlc3QoJy5jb250ZW50JykuYXR0cignaWQnKTtcbiAgICAgICAgICAgICAgaWYgKGhhc2hfdGFiX2NvbnRhaW5lcl9pZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzZWxmLnRvZ2dsZV9hY3RpdmVfdGFiKCQoJ1snICsgc2VsZi5hdHRyX25hbWUoKSArICddID4gKiA+IGFbaHJlZj0jJyArIGhhc2hfdGFiX2NvbnRhaW5lcl9pZCArICddJykucGFyZW50KCksIGhhc2gpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlZmVyZW5jZSB0aGUgZGVmYXVsdCB0YWIgaGFzaGVzIHdoaWNoIHdlcmUgaW5pdGlhbGl6ZWQgaW4gdGhlIGluaXQgZnVuY3Rpb25cbiAgICAgICAgICAgIGZvciAodmFyIGluZCA9IDA7IGluZCA8IHNlbGYuZGVmYXVsdF90YWJfaGFzaGVzLmxlbmd0aDsgaW5kKyspIHtcbiAgICAgICAgICAgICAgc2VsZi50b2dnbGVfYWN0aXZlX3RhYigkKCdbJyArIHNlbGYuYXR0cl9uYW1lKCkgKyAnXSA+ICogPiBhW2hyZWY9JyArIHNlbGYuZGVmYXVsdF90YWJfaGFzaGVzW2luZF0gKyAnXScpLnBhcmVudCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICB9KTtcbiAgICAgfSxcblxuICAgIHRvZ2dsZV9hY3RpdmVfdGFiIDogZnVuY3Rpb24gKHRhYiwgbG9jYXRpb25faGFzaCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICAgIFMgPSBzZWxmLlMsXG4gICAgICAgICAgdGFicyA9IHRhYi5jbG9zZXN0KCdbJyArIHRoaXMuYXR0cl9uYW1lKCkgKyAnXScpLFxuICAgICAgICAgIHRhYl9saW5rID0gdGFiLmZpbmQoJ2EnKSxcbiAgICAgICAgICBhbmNob3IgPSB0YWIuY2hpbGRyZW4oJ2EnKS5maXJzdCgpLFxuICAgICAgICAgIHRhcmdldF9oYXNoID0gJyMnICsgYW5jaG9yLmF0dHIoJ2hyZWYnKS5zcGxpdCgnIycpWzFdLFxuICAgICAgICAgIHRhcmdldCA9IFModGFyZ2V0X2hhc2gpLFxuICAgICAgICAgIHNpYmxpbmdzID0gdGFiLnNpYmxpbmdzKCksXG4gICAgICAgICAgc2V0dGluZ3MgPSB0YWJzLmRhdGEodGhpcy5hdHRyX25hbWUodHJ1ZSkgKyAnLWluaXQnKSxcbiAgICAgICAgICBpbnRlcnByZXRfa2V5dXBfYWN0aW9uID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIC8vIExpZ2h0IG1vZGlmaWNhdGlvbiBvZiBIZXlkb24gUGlja2VyaW5nJ3MgUHJhY3RpY2FsIEFSSUEgRXhhbXBsZXM6IGh0dHA6Ly9oZXlkb253b3Jrcy5jb20vcHJhY3RpY2FsX2FyaWFfZXhhbXBsZXMvanMvYTExeS5qc1xuXG4gICAgICAgICAgICAvLyBkZWZpbmUgY3VycmVudCwgcHJldmlvdXMgYW5kIG5leHQgKHBvc3NpYmxlKSB0YWJzXG5cbiAgICAgICAgICAgIHZhciAkb3JpZ2luYWwgPSAkKHRoaXMpO1xuICAgICAgICAgICAgdmFyICRwcmV2ID0gJCh0aGlzKS5wYXJlbnRzKCdsaScpLnByZXYoKS5jaGlsZHJlbignW3JvbGU9XCJ0YWJcIl0nKTtcbiAgICAgICAgICAgIHZhciAkbmV4dCA9ICQodGhpcykucGFyZW50cygnbGknKS5uZXh0KCkuY2hpbGRyZW4oJ1tyb2xlPVwidGFiXCJdJyk7XG4gICAgICAgICAgICB2YXIgJHRhcmdldDtcblxuICAgICAgICAgICAgLy8gZmluZCB0aGUgZGlyZWN0aW9uIChwcmV2IG9yIG5leHQpXG5cbiAgICAgICAgICAgIHN3aXRjaCAoZS5rZXlDb2RlKSB7XG4gICAgICAgICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICAgICAgJHRhcmdldCA9ICRwcmV2O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgICAgICAgICR0YXJnZXQgPSAkbmV4dDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAkdGFyZ2V0ID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoJHRhcmdldC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgJG9yaWdpbmFsLmF0dHIoe1xuICAgICAgICAgICAgICAgICd0YWJpbmRleCcgOiAnLTEnLFxuICAgICAgICAgICAgICAgICdhcmlhLXNlbGVjdGVkJyA6IG51bGxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICR0YXJnZXQuYXR0cih7XG4gICAgICAgICAgICAgICAgJ3RhYmluZGV4JyA6ICcwJyxcbiAgICAgICAgICAgICAgICAnYXJpYS1zZWxlY3RlZCcgOiB0cnVlXG4gICAgICAgICAgICAgIH0pLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEhpZGUgcGFuZWxzXG5cbiAgICAgICAgICAgICQoJ1tyb2xlPVwidGFicGFuZWxcIl0nKVxuICAgICAgICAgICAgICAuYXR0cignYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuXG4gICAgICAgICAgICAvLyBTaG93IHBhbmVsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRhcmdldFxuXG4gICAgICAgICAgICAkKCcjJyArICQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkuYXR0cignaHJlZicpLnN1YnN0cmluZygxKSlcbiAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtaGlkZGVuJywgbnVsbCk7XG5cbiAgICAgICAgICB9LFxuICAgICAgICAgIGdvX3RvX2hhc2ggPSBmdW5jdGlvbihoYXNoKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjb3JyZWN0IGJlaGF2aW91ciBvZiB0aGUgYnJvd3NlcidzIGJhY2sgYnV0dG9uIHdoZW4gZGVlcCBsaW5raW5nIGlzIGVuYWJsZWQuIFdpdGhvdXQgaXRcbiAgICAgICAgICAgIC8vIHRoZSB1c2VyIHdvdWxkIGdldCBjb250aW51YWxseSByZWRpcmVjdGVkIHRvIHRoZSBkZWZhdWx0IGhhc2guXG4gICAgICAgICAgICB2YXIgZGVmYXVsdF9oYXNoID0gc2V0dGluZ3Muc2Nyb2xsX3RvX2NvbnRlbnQgPyBzZWxmLmRlZmF1bHRfdGFiX2hhc2hlc1swXSA6ICdmbmR0bi0nICsgc2VsZi5kZWZhdWx0X3RhYl9oYXNoZXNbMF0ucmVwbGFjZSgnIycsICcnKTtcblxuICAgICAgICAgICAgaWYgKGhhc2ggIT09IGRlZmF1bHRfaGFzaCB8fCB3aW5kb3cubG9jYXRpb24uaGFzaCkge1xuICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGhhc2g7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgLy8gYWxsb3cgdXNhZ2Ugb2YgZGF0YS10YWItY29udGVudCBhdHRyaWJ1dGUgaW5zdGVhZCBvZiBocmVmXG4gICAgICBpZiAoYW5jaG9yLmRhdGEoJ3RhYi1jb250ZW50JykpIHtcbiAgICAgICAgdGFyZ2V0X2hhc2ggPSAnIycgKyBhbmNob3IuZGF0YSgndGFiLWNvbnRlbnQnKS5zcGxpdCgnIycpWzFdO1xuICAgICAgICB0YXJnZXQgPSBTKHRhcmdldF9oYXNoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNldHRpbmdzLmRlZXBfbGlua2luZykge1xuXG4gICAgICAgIGlmIChzZXR0aW5ncy5zY3JvbGxfdG9fY29udGVudCkge1xuXG4gICAgICAgICAgLy8gcmV0YWluIGN1cnJlbnQgaGFzaCB0byBzY3JvbGwgdG8gY29udGVudFxuICAgICAgICAgIGdvX3RvX2hhc2gobG9jYXRpb25faGFzaCB8fCB0YXJnZXRfaGFzaCk7XG5cbiAgICAgICAgICBpZiAobG9jYXRpb25faGFzaCA9PSB1bmRlZmluZWQgfHwgbG9jYXRpb25faGFzaCA9PSB0YXJnZXRfaGFzaCkge1xuICAgICAgICAgICAgdGFiLnBhcmVudCgpWzBdLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFModGFyZ2V0X2hhc2gpWzBdLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHByZWZpeCB0aGUgaGFzaGVzIHNvIHRoYXQgdGhlIGJyb3dzZXIgZG9lc24ndCBzY3JvbGwgZG93blxuICAgICAgICAgIGlmIChsb2NhdGlvbl9oYXNoICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZ29fdG9faGFzaCgnZm5kdG4tJyArIGxvY2F0aW9uX2hhc2gucmVwbGFjZSgnIycsICcnKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdvX3RvX2hhc2goJ2ZuZHRuLScgKyB0YXJnZXRfaGFzaC5yZXBsYWNlKCcjJywgJycpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gV0FSTklORzogVGhlIGFjdGl2YXRpb24gYW5kIGRlYWN0aXZhdGlvbiBvZiB0aGUgdGFiIGNvbnRlbnQgbXVzdFxuICAgICAgLy8gb2NjdXIgYWZ0ZXIgdGhlIGRlZXAgbGlua2luZyBpbiBvcmRlciB0byBwcm9wZXJseSByZWZyZXNoIHRoZSBicm93c2VyXG4gICAgICAvLyB3aW5kb3cgKG5vdGFibHkgaW4gQ2hyb21lKS5cbiAgICAgIC8vIENsZWFuIHVwIG11bHRpcGxlIGF0dHIgaW5zdGFuY2VzIHRvIGRvbmUgb25jZVxuICAgICAgdGFiLmFkZENsYXNzKHNldHRpbmdzLmFjdGl2ZV9jbGFzcykudHJpZ2dlckhhbmRsZXIoJ29wZW5lZCcpO1xuICAgICAgdGFiX2xpbmsuYXR0cih7J2FyaWEtc2VsZWN0ZWQnIDogJ3RydWUnLCAgdGFiaW5kZXggOiAwfSk7XG4gICAgICBzaWJsaW5ncy5yZW1vdmVDbGFzcyhzZXR0aW5ncy5hY3RpdmVfY2xhc3MpXG4gICAgICBzaWJsaW5ncy5maW5kKCdhJykuYXR0cih7J2FyaWEtc2VsZWN0ZWQnIDogJ2ZhbHNlJy8qLCAgdGFiaW5kZXggOiAtMSovfSk7XG4gICAgICB0YXJnZXQuc2libGluZ3MoKS5yZW1vdmVDbGFzcyhzZXR0aW5ncy5hY3RpdmVfY2xhc3MpLmF0dHIoeydhcmlhLWhpZGRlbicgOiAndHJ1ZScvKiwgIHRhYmluZGV4IDogLTEqL30pO1xuICAgICAgdGFyZ2V0LmFkZENsYXNzKHNldHRpbmdzLmFjdGl2ZV9jbGFzcykuYXR0cignYXJpYS1oaWRkZW4nLCAnZmFsc2UnKS5yZW1vdmVBdHRyKCd0YWJpbmRleCcpO1xuICAgICAgc2V0dGluZ3MuY2FsbGJhY2sodGFiKTtcbiAgICAgIHRhcmdldC50cmlnZ2VySGFuZGxlcigndG9nZ2xlZCcsIFt0YXJnZXRdKTtcbiAgICAgIHRhYnMudHJpZ2dlckhhbmRsZXIoJ3RvZ2dsZWQnLCBbdGFiXSk7XG5cbiAgICAgIHRhYl9saW5rLm9mZigna2V5ZG93bicpLm9uKCdrZXlkb3duJywgaW50ZXJwcmV0X2tleXVwX2FjdGlvbiApO1xuICAgIH0sXG5cbiAgICBkYXRhX2F0dHIgOiBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICBpZiAodGhpcy5uYW1lc3BhY2UubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2UgKyAnLScgKyBzdHI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdHI7XG4gICAgfSxcblxuICAgIG9mZiA6IGZ1bmN0aW9uICgpIHt9LFxuXG4gICAgcmVmbG93IDogZnVuY3Rpb24gKCkge31cbiAgfTtcbn0oalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQgbm8taW52YWxpZC10aGlzOiAxICovXG5cbnZhciBFUlJPUl9NRVNTQUdFID0gJ0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgJztcbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgZnVuY1R5cGUgPSAnW29iamVjdCBGdW5jdGlvbl0nO1xuXG52YXIgY29uY2F0dHkgPSBmdW5jdGlvbiBjb25jYXR0eShhLCBiKSB7XG4gICAgdmFyIGFyciA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGFycltpXSA9IGFbaV07XG4gICAgfVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgYi5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICBhcnJbaiArIGEubGVuZ3RoXSA9IGJbal07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycjtcbn07XG5cbnZhciBzbGljeSA9IGZ1bmN0aW9uIHNsaWN5KGFyckxpa2UsIG9mZnNldCkge1xuICAgIHZhciBhcnIgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gb2Zmc2V0IHx8IDAsIGogPSAwOyBpIDwgYXJyTGlrZS5sZW5ndGg7IGkgKz0gMSwgaiArPSAxKSB7XG4gICAgICAgIGFycltqXSA9IGFyckxpa2VbaV07XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG59O1xuXG52YXIgam9pbnkgPSBmdW5jdGlvbiAoYXJyLCBqb2luZXIpIHtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgc3RyICs9IGFycltpXTtcbiAgICAgICAgaWYgKGkgKyAxIDwgYXJyLmxlbmd0aCkge1xuICAgICAgICAgICAgc3RyICs9IGpvaW5lcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiaW5kKHRoYXQpIHtcbiAgICB2YXIgdGFyZ2V0ID0gdGhpcztcbiAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gJ2Z1bmN0aW9uJyB8fCB0b1N0ci5hcHBseSh0YXJnZXQpICE9PSBmdW5jVHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUk9SX01FU1NBR0UgKyB0YXJnZXQpO1xuICAgIH1cbiAgICB2YXIgYXJncyA9IHNsaWN5KGFyZ3VtZW50cywgMSk7XG5cbiAgICB2YXIgYm91bmQ7XG4gICAgdmFyIGJpbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBib3VuZCkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRhcmdldC5hcHBseShcbiAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgIGNvbmNhdHR5KGFyZ3MsIGFyZ3VtZW50cylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoT2JqZWN0KHJlc3VsdCkgPT09IHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KFxuICAgICAgICAgICAgdGhhdCxcbiAgICAgICAgICAgIGNvbmNhdHR5KGFyZ3MsIGFyZ3VtZW50cylcbiAgICAgICAgKTtcblxuICAgIH07XG5cbiAgICB2YXIgYm91bmRMZW5ndGggPSBtYXgoMCwgdGFyZ2V0Lmxlbmd0aCAtIGFyZ3MubGVuZ3RoKTtcbiAgICB2YXIgYm91bmRBcmdzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib3VuZExlbmd0aDsgaSsrKSB7XG4gICAgICAgIGJvdW5kQXJnc1tpXSA9ICckJyArIGk7XG4gICAgfVxuXG4gICAgYm91bmQgPSBGdW5jdGlvbignYmluZGVyJywgJ3JldHVybiBmdW5jdGlvbiAoJyArIGpvaW55KGJvdW5kQXJncywgJywnKSArICcpeyByZXR1cm4gYmluZGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsgfScpKGJpbmRlcik7XG5cbiAgICBpZiAodGFyZ2V0LnByb3RvdHlwZSkge1xuICAgICAgICB2YXIgRW1wdHkgPSBmdW5jdGlvbiBFbXB0eSgpIHt9O1xuICAgICAgICBFbXB0eS5wcm90b3R5cGUgPSB0YXJnZXQucHJvdG90eXBlO1xuICAgICAgICBib3VuZC5wcm90b3R5cGUgPSBuZXcgRW1wdHkoKTtcbiAgICAgICAgRW1wdHkucHJvdG90eXBlID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gYm91bmQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgfHwgaW1wbGVtZW50YXRpb247XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1bmRlZmluZWQ7XG5cbnZhciAkT2JqZWN0ID0gcmVxdWlyZSgnZXMtb2JqZWN0LWF0b21zJyk7XG5cbnZhciAkRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMnKTtcbnZhciAkRXZhbEVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL2V2YWwnKTtcbnZhciAkUmFuZ2VFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy9yYW5nZScpO1xudmFyICRSZWZlcmVuY2VFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy9yZWYnKTtcbnZhciAkU3ludGF4RXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvc3ludGF4Jyk7XG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG52YXIgJFVSSUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3VyaScpO1xuXG52YXIgYWJzID0gcmVxdWlyZSgnbWF0aC1pbnRyaW5zaWNzL2FicycpO1xudmFyIGZsb29yID0gcmVxdWlyZSgnbWF0aC1pbnRyaW5zaWNzL2Zsb29yJyk7XG52YXIgbWF4ID0gcmVxdWlyZSgnbWF0aC1pbnRyaW5zaWNzL21heCcpO1xudmFyIG1pbiA9IHJlcXVpcmUoJ21hdGgtaW50cmluc2ljcy9taW4nKTtcbnZhciBwb3cgPSByZXF1aXJlKCdtYXRoLWludHJpbnNpY3MvcG93Jyk7XG52YXIgcm91bmQgPSByZXF1aXJlKCdtYXRoLWludHJpbnNpY3Mvcm91bmQnKTtcbnZhciBzaWduID0gcmVxdWlyZSgnbWF0aC1pbnRyaW5zaWNzL3NpZ24nKTtcblxudmFyICRGdW5jdGlvbiA9IEZ1bmN0aW9uO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbnZhciBnZXRFdmFsbGVkQ29uc3RydWN0b3IgPSBmdW5jdGlvbiAoZXhwcmVzc2lvblN5bnRheCkge1xuXHR0cnkge1xuXHRcdHJldHVybiAkRnVuY3Rpb24oJ1widXNlIHN0cmljdFwiOyByZXR1cm4gKCcgKyBleHByZXNzaW9uU3ludGF4ICsgJykuY29uc3RydWN0b3I7JykoKTtcblx0fSBjYXRjaCAoZSkge31cbn07XG5cbnZhciAkZ09QRCA9IHJlcXVpcmUoJ2dvcGQnKTtcbnZhciAkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCdlcy1kZWZpbmUtcHJvcGVydHknKTtcblxudmFyIHRocm93VHlwZUVycm9yID0gZnVuY3Rpb24gKCkge1xuXHR0aHJvdyBuZXcgJFR5cGVFcnJvcigpO1xufTtcbnZhciBUaHJvd1R5cGVFcnJvciA9ICRnT1BEXG5cdD8gKGZ1bmN0aW9uICgpIHtcblx0XHR0cnkge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9ucywgbm8tY2FsbGVyLCBuby1yZXN0cmljdGVkLXByb3BlcnRpZXNcblx0XHRcdGFyZ3VtZW50cy5jYWxsZWU7IC8vIElFIDggZG9lcyBub3QgdGhyb3cgaGVyZVxuXHRcdFx0cmV0dXJuIHRocm93VHlwZUVycm9yO1xuXHRcdH0gY2F0Y2ggKGNhbGxlZVRocm93cykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Ly8gSUUgOCB0aHJvd3Mgb24gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhcmd1bWVudHMsICcnKVxuXHRcdFx0XHRyZXR1cm4gJGdPUEQoYXJndW1lbnRzLCAnY2FsbGVlJykuZ2V0O1xuXHRcdFx0fSBjYXRjaCAoZ09QRHRocm93cykge1xuXHRcdFx0XHRyZXR1cm4gdGhyb3dUeXBlRXJyb3I7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KCkpXG5cdDogdGhyb3dUeXBlRXJyb3I7XG5cbnZhciBoYXNTeW1ib2xzID0gcmVxdWlyZSgnaGFzLXN5bWJvbHMnKSgpO1xuXG52YXIgZ2V0UHJvdG8gPSByZXF1aXJlKCdnZXQtcHJvdG8nKTtcbnZhciAkT2JqZWN0R1BPID0gcmVxdWlyZSgnZ2V0LXByb3RvL09iamVjdC5nZXRQcm90b3R5cGVPZicpO1xudmFyICRSZWZsZWN0R1BPID0gcmVxdWlyZSgnZ2V0LXByb3RvL1JlZmxlY3QuZ2V0UHJvdG90eXBlT2YnKTtcblxudmFyICRhcHBseSA9IHJlcXVpcmUoJ2NhbGwtYmluZC1hcHBseS1oZWxwZXJzL2Z1bmN0aW9uQXBwbHknKTtcbnZhciAkY2FsbCA9IHJlcXVpcmUoJ2NhbGwtYmluZC1hcHBseS1oZWxwZXJzL2Z1bmN0aW9uQ2FsbCcpO1xuXG52YXIgbmVlZHNFdmFsID0ge307XG5cbnZhciBUeXBlZEFycmF5ID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnIHx8ICFnZXRQcm90byA/IHVuZGVmaW5lZCA6IGdldFByb3RvKFVpbnQ4QXJyYXkpO1xuXG52YXIgSU5UUklOU0lDUyA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHQnJUFnZ3JlZ2F0ZUVycm9yJSc6IHR5cGVvZiBBZ2dyZWdhdGVFcnJvciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBZ2dyZWdhdGVFcnJvcixcblx0JyVBcnJheSUnOiBBcnJheSxcblx0JyVBcnJheUJ1ZmZlciUnOiB0eXBlb2YgQXJyYXlCdWZmZXIgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQXJyYXlCdWZmZXIsXG5cdCclQXJyYXlJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzICYmIGdldFByb3RvID8gZ2V0UHJvdG8oW11bU3ltYm9sLml0ZXJhdG9yXSgpKSA6IHVuZGVmaW5lZCxcblx0JyVBc3luY0Zyb21TeW5jSXRlcmF0b3JQcm90b3R5cGUlJzogdW5kZWZpbmVkLFxuXHQnJUFzeW5jRnVuY3Rpb24lJzogbmVlZHNFdmFsLFxuXHQnJUFzeW5jR2VuZXJhdG9yJSc6IG5lZWRzRXZhbCxcblx0JyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJSc6IG5lZWRzRXZhbCxcblx0JyVBc3luY0l0ZXJhdG9yUHJvdG90eXBlJSc6IG5lZWRzRXZhbCxcblx0JyVBdG9taWNzJSc6IHR5cGVvZiBBdG9taWNzID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEF0b21pY3MsXG5cdCclQmlnSW50JSc6IHR5cGVvZiBCaWdJbnQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQmlnSW50LFxuXHQnJUJpZ0ludDY0QXJyYXklJzogdHlwZW9mIEJpZ0ludDY0QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQmlnSW50NjRBcnJheSxcblx0JyVCaWdVaW50NjRBcnJheSUnOiB0eXBlb2YgQmlnVWludDY0QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQmlnVWludDY0QXJyYXksXG5cdCclQm9vbGVhbiUnOiBCb29sZWFuLFxuXHQnJURhdGFWaWV3JSc6IHR5cGVvZiBEYXRhVmlldyA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBEYXRhVmlldyxcblx0JyVEYXRlJSc6IERhdGUsXG5cdCclZGVjb2RlVVJJJSc6IGRlY29kZVVSSSxcblx0JyVkZWNvZGVVUklDb21wb25lbnQlJzogZGVjb2RlVVJJQ29tcG9uZW50LFxuXHQnJWVuY29kZVVSSSUnOiBlbmNvZGVVUkksXG5cdCclZW5jb2RlVVJJQ29tcG9uZW50JSc6IGVuY29kZVVSSUNvbXBvbmVudCxcblx0JyVFcnJvciUnOiAkRXJyb3IsXG5cdCclZXZhbCUnOiBldmFsLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWV2YWxcblx0JyVFdmFsRXJyb3IlJzogJEV2YWxFcnJvcixcblx0JyVGbG9hdDE2QXJyYXklJzogdHlwZW9mIEZsb2F0MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBGbG9hdDE2QXJyYXksXG5cdCclRmxvYXQzMkFycmF5JSc6IHR5cGVvZiBGbG9hdDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmxvYXQzMkFycmF5LFxuXHQnJUZsb2F0NjRBcnJheSUnOiB0eXBlb2YgRmxvYXQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0NjRBcnJheSxcblx0JyVGaW5hbGl6YXRpb25SZWdpc3RyeSUnOiB0eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmluYWxpemF0aW9uUmVnaXN0cnksXG5cdCclRnVuY3Rpb24lJzogJEZ1bmN0aW9uLFxuXHQnJUdlbmVyYXRvckZ1bmN0aW9uJSc6IG5lZWRzRXZhbCxcblx0JyVJbnQ4QXJyYXklJzogdHlwZW9mIEludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQ4QXJyYXksXG5cdCclSW50MTZBcnJheSUnOiB0eXBlb2YgSW50MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQxNkFycmF5LFxuXHQnJUludDMyQXJyYXklJzogdHlwZW9mIEludDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MzJBcnJheSxcblx0JyVpc0Zpbml0ZSUnOiBpc0Zpbml0ZSxcblx0JyVpc05hTiUnOiBpc05hTixcblx0JyVJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzICYmIGdldFByb3RvID8gZ2V0UHJvdG8oZ2V0UHJvdG8oW11bU3ltYm9sLml0ZXJhdG9yXSgpKSkgOiB1bmRlZmluZWQsXG5cdCclSlNPTiUnOiB0eXBlb2YgSlNPTiA9PT0gJ29iamVjdCcgPyBKU09OIDogdW5kZWZpbmVkLFxuXHQnJU1hcCUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IE1hcCxcblx0JyVNYXBJdGVyYXRvclByb3RvdHlwZSUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyB8fCAhaGFzU3ltYm9scyB8fCAhZ2V0UHJvdG8gPyB1bmRlZmluZWQgOiBnZXRQcm90byhuZXcgTWFwKClbU3ltYm9sLml0ZXJhdG9yXSgpKSxcblx0JyVNYXRoJSc6IE1hdGgsXG5cdCclTnVtYmVyJSc6IE51bWJlcixcblx0JyVPYmplY3QlJzogJE9iamVjdCxcblx0JyVPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJSc6ICRnT1BELFxuXHQnJXBhcnNlRmxvYXQlJzogcGFyc2VGbG9hdCxcblx0JyVwYXJzZUludCUnOiBwYXJzZUludCxcblx0JyVQcm9taXNlJSc6IHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFByb21pc2UsXG5cdCclUHJveHklJzogdHlwZW9mIFByb3h5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFByb3h5LFxuXHQnJVJhbmdlRXJyb3IlJzogJFJhbmdlRXJyb3IsXG5cdCclUmVmZXJlbmNlRXJyb3IlJzogJFJlZmVyZW5jZUVycm9yLFxuXHQnJVJlZmxlY3QlJzogdHlwZW9mIFJlZmxlY3QgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUmVmbGVjdCxcblx0JyVSZWdFeHAlJzogUmVnRXhwLFxuXHQnJVNldCUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFNldCxcblx0JyVTZXRJdGVyYXRvclByb3RvdHlwZSUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyB8fCAhaGFzU3ltYm9scyB8fCAhZ2V0UHJvdG8gPyB1bmRlZmluZWQgOiBnZXRQcm90byhuZXcgU2V0KClbU3ltYm9sLml0ZXJhdG9yXSgpKSxcblx0JyVTaGFyZWRBcnJheUJ1ZmZlciUnOiB0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogU2hhcmVkQXJyYXlCdWZmZXIsXG5cdCclU3RyaW5nJSc6IFN0cmluZyxcblx0JyVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzICYmIGdldFByb3RvID8gZ2V0UHJvdG8oJydbU3ltYm9sLml0ZXJhdG9yXSgpKSA6IHVuZGVmaW5lZCxcblx0JyVTeW1ib2wlJzogaGFzU3ltYm9scyA/IFN5bWJvbCA6IHVuZGVmaW5lZCxcblx0JyVTeW50YXhFcnJvciUnOiAkU3ludGF4RXJyb3IsXG5cdCclVGhyb3dUeXBlRXJyb3IlJzogVGhyb3dUeXBlRXJyb3IsXG5cdCclVHlwZWRBcnJheSUnOiBUeXBlZEFycmF5LFxuXHQnJVR5cGVFcnJvciUnOiAkVHlwZUVycm9yLFxuXHQnJVVpbnQ4QXJyYXklJzogdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDhBcnJheSxcblx0JyVVaW50OENsYW1wZWRBcnJheSUnOiB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDhDbGFtcGVkQXJyYXksXG5cdCclVWludDE2QXJyYXklJzogdHlwZW9mIFVpbnQxNkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQxNkFycmF5LFxuXHQnJVVpbnQzMkFycmF5JSc6IHR5cGVvZiBVaW50MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50MzJBcnJheSxcblx0JyVVUklFcnJvciUnOiAkVVJJRXJyb3IsXG5cdCclV2Vha01hcCUnOiB0eXBlb2YgV2Vha01hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrTWFwLFxuXHQnJVdlYWtSZWYlJzogdHlwZW9mIFdlYWtSZWYgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha1JlZixcblx0JyVXZWFrU2V0JSc6IHR5cGVvZiBXZWFrU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtTZXQsXG5cblx0JyVGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCUnOiAkY2FsbCxcblx0JyVGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHklJzogJGFwcGx5LFxuXHQnJU9iamVjdC5kZWZpbmVQcm9wZXJ0eSUnOiAkZGVmaW5lUHJvcGVydHksXG5cdCclT2JqZWN0LmdldFByb3RvdHlwZU9mJSc6ICRPYmplY3RHUE8sXG5cdCclTWF0aC5hYnMlJzogYWJzLFxuXHQnJU1hdGguZmxvb3IlJzogZmxvb3IsXG5cdCclTWF0aC5tYXglJzogbWF4LFxuXHQnJU1hdGgubWluJSc6IG1pbixcblx0JyVNYXRoLnBvdyUnOiBwb3csXG5cdCclTWF0aC5yb3VuZCUnOiByb3VuZCxcblx0JyVNYXRoLnNpZ24lJzogc2lnbixcblx0JyVSZWZsZWN0LmdldFByb3RvdHlwZU9mJSc6ICRSZWZsZWN0R1BPXG59O1xuXG5pZiAoZ2V0UHJvdG8pIHtcblx0dHJ5IHtcblx0XHRudWxsLmVycm9yOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2hhZG93cmVhbG0vcHVsbC8zODQjaXNzdWVjb21tZW50LTEzNjQyNjQyMjlcblx0XHR2YXIgZXJyb3JQcm90byA9IGdldFByb3RvKGdldFByb3RvKGUpKTtcblx0XHRJTlRSSU5TSUNTWyclRXJyb3IucHJvdG90eXBlJSddID0gZXJyb3JQcm90bztcblx0fVxufVxuXG52YXIgZG9FdmFsID0gZnVuY3Rpb24gZG9FdmFsKG5hbWUpIHtcblx0dmFyIHZhbHVlO1xuXHRpZiAobmFtZSA9PT0gJyVBc3luY0Z1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24gKCkge30nKTtcblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUdlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvciUnKSB7XG5cdFx0dmFyIGZuID0gZG9FdmFsKCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnKTtcblx0XHRpZiAoZm4pIHtcblx0XHRcdHZhbHVlID0gZm4ucHJvdG90eXBlO1xuXHRcdH1cblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJykge1xuXHRcdHZhciBnZW4gPSBkb0V2YWwoJyVBc3luY0dlbmVyYXRvciUnKTtcblx0XHRpZiAoZ2VuICYmIGdldFByb3RvKSB7XG5cdFx0XHR2YWx1ZSA9IGdldFByb3RvKGdlbi5wcm90b3R5cGUpO1xuXHRcdH1cblx0fVxuXG5cdElOVFJJTlNJQ1NbbmFtZV0gPSB2YWx1ZTtcblxuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgTEVHQUNZX0FMSUFTRVMgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0JyVBcnJheUJ1ZmZlclByb3RvdHlwZSUnOiBbJ0FycmF5QnVmZmVyJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFycmF5UHJvdG90eXBlJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclQXJyYXlQcm90b19lbnRyaWVzJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ2VudHJpZXMnXSxcblx0JyVBcnJheVByb3RvX2ZvckVhY2glJzogWydBcnJheScsICdwcm90b3R5cGUnLCAnZm9yRWFjaCddLFxuXHQnJUFycmF5UHJvdG9fa2V5cyUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICdrZXlzJ10sXG5cdCclQXJyYXlQcm90b192YWx1ZXMlJzogWydBcnJheScsICdwcm90b3R5cGUnLCAndmFsdWVzJ10sXG5cdCclQXN5bmNGdW5jdGlvblByb3RvdHlwZSUnOiBbJ0FzeW5jRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclQXN5bmNHZW5lcmF0b3IlJzogWydBc3luY0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFzeW5jR2VuZXJhdG9yUHJvdG90eXBlJSc6IFsnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnLCAncHJvdG90eXBlJ10sXG5cdCclQm9vbGVhblByb3RvdHlwZSUnOiBbJ0Jvb2xlYW4nLCAncHJvdG90eXBlJ10sXG5cdCclRGF0YVZpZXdQcm90b3R5cGUlJzogWydEYXRhVmlldycsICdwcm90b3R5cGUnXSxcblx0JyVEYXRlUHJvdG90eXBlJSc6IFsnRGF0ZScsICdwcm90b3R5cGUnXSxcblx0JyVFcnJvclByb3RvdHlwZSUnOiBbJ0Vycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJUV2YWxFcnJvclByb3RvdHlwZSUnOiBbJ0V2YWxFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVGbG9hdDMyQXJyYXlQcm90b3R5cGUlJzogWydGbG9hdDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclRmxvYXQ2NEFycmF5UHJvdG90eXBlJSc6IFsnRmxvYXQ2NEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUZ1bmN0aW9uUHJvdG90eXBlJSc6IFsnRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclR2VuZXJhdG9yJSc6IFsnR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclR2VuZXJhdG9yUHJvdG90eXBlJSc6IFsnR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJywgJ3Byb3RvdHlwZSddLFxuXHQnJUludDhBcnJheVByb3RvdHlwZSUnOiBbJ0ludDhBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQxNkFycmF5UHJvdG90eXBlJSc6IFsnSW50MTZBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQzMkFycmF5UHJvdG90eXBlJSc6IFsnSW50MzJBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVKU09OUGFyc2UlJzogWydKU09OJywgJ3BhcnNlJ10sXG5cdCclSlNPTlN0cmluZ2lmeSUnOiBbJ0pTT04nLCAnc3RyaW5naWZ5J10sXG5cdCclTWFwUHJvdG90eXBlJSc6IFsnTWFwJywgJ3Byb3RvdHlwZSddLFxuXHQnJU51bWJlclByb3RvdHlwZSUnOiBbJ051bWJlcicsICdwcm90b3R5cGUnXSxcblx0JyVPYmplY3RQcm90b3R5cGUlJzogWydPYmplY3QnLCAncHJvdG90eXBlJ10sXG5cdCclT2JqUHJvdG9fdG9TdHJpbmclJzogWydPYmplY3QnLCAncHJvdG90eXBlJywgJ3RvU3RyaW5nJ10sXG5cdCclT2JqUHJvdG9fdmFsdWVPZiUnOiBbJ09iamVjdCcsICdwcm90b3R5cGUnLCAndmFsdWVPZiddLFxuXHQnJVByb21pc2VQcm90b3R5cGUlJzogWydQcm9taXNlJywgJ3Byb3RvdHlwZSddLFxuXHQnJVByb21pc2VQcm90b190aGVuJSc6IFsnUHJvbWlzZScsICdwcm90b3R5cGUnLCAndGhlbiddLFxuXHQnJVByb21pc2VfYWxsJSc6IFsnUHJvbWlzZScsICdhbGwnXSxcblx0JyVQcm9taXNlX3JlamVjdCUnOiBbJ1Byb21pc2UnLCAncmVqZWN0J10sXG5cdCclUHJvbWlzZV9yZXNvbHZlJSc6IFsnUHJvbWlzZScsICdyZXNvbHZlJ10sXG5cdCclUmFuZ2VFcnJvclByb3RvdHlwZSUnOiBbJ1JhbmdlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclUmVmZXJlbmNlRXJyb3JQcm90b3R5cGUlJzogWydSZWZlcmVuY2VFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVSZWdFeHBQcm90b3R5cGUlJzogWydSZWdFeHAnLCAncHJvdG90eXBlJ10sXG5cdCclU2V0UHJvdG90eXBlJSc6IFsnU2V0JywgJ3Byb3RvdHlwZSddLFxuXHQnJVNoYXJlZEFycmF5QnVmZmVyUHJvdG90eXBlJSc6IFsnU2hhcmVkQXJyYXlCdWZmZXInLCAncHJvdG90eXBlJ10sXG5cdCclU3RyaW5nUHJvdG90eXBlJSc6IFsnU3RyaW5nJywgJ3Byb3RvdHlwZSddLFxuXHQnJVN5bWJvbFByb3RvdHlwZSUnOiBbJ1N5bWJvbCcsICdwcm90b3R5cGUnXSxcblx0JyVTeW50YXhFcnJvclByb3RvdHlwZSUnOiBbJ1N5bnRheEVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVR5cGVkQXJyYXlQcm90b3R5cGUlJzogWydUeXBlZEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVR5cGVFcnJvclByb3RvdHlwZSUnOiBbJ1R5cGVFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVVaW50OEFycmF5UHJvdG90eXBlJSc6IFsnVWludDhBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQ4Q2xhbXBlZEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQxNkFycmF5UHJvdG90eXBlJSc6IFsnVWludDE2QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVWludDMyQXJyYXlQcm90b3R5cGUlJzogWydVaW50MzJBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVUklFcnJvclByb3RvdHlwZSUnOiBbJ1VSSUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVdlYWtNYXBQcm90b3R5cGUlJzogWydXZWFrTWFwJywgJ3Byb3RvdHlwZSddLFxuXHQnJVdlYWtTZXRQcm90b3R5cGUlJzogWydXZWFrU2V0JywgJ3Byb3RvdHlwZSddXG59O1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCdoYXNvd24nKTtcbnZhciAkY29uY2F0ID0gYmluZC5jYWxsKCRjYWxsLCBBcnJheS5wcm90b3R5cGUuY29uY2F0KTtcbnZhciAkc3BsaWNlQXBwbHkgPSBiaW5kLmNhbGwoJGFwcGx5LCBBcnJheS5wcm90b3R5cGUuc3BsaWNlKTtcbnZhciAkcmVwbGFjZSA9IGJpbmQuY2FsbCgkY2FsbCwgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKTtcbnZhciAkc3RyU2xpY2UgPSBiaW5kLmNhbGwoJGNhbGwsIFN0cmluZy5wcm90b3R5cGUuc2xpY2UpO1xudmFyICRleGVjID0gYmluZC5jYWxsKCRjYWxsLCBSZWdFeHAucHJvdG90eXBlLmV4ZWMpO1xuXG4vKiBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi80LjE3LjE1L2Rpc3QvbG9kYXNoLmpzI0w2NzM1LUw2NzQ0ICovXG52YXIgcmVQcm9wTmFtZSA9IC9bXiUuW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JSQpKS9nO1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nOyAvKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciBzdHJpbmdUb1BhdGggPSBmdW5jdGlvbiBzdHJpbmdUb1BhdGgoc3RyaW5nKSB7XG5cdHZhciBmaXJzdCA9ICRzdHJTbGljZShzdHJpbmcsIDAsIDEpO1xuXHR2YXIgbGFzdCA9ICRzdHJTbGljZShzdHJpbmcsIC0xKTtcblx0aWYgKGZpcnN0ID09PSAnJScgJiYgbGFzdCAhPT0gJyUnKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW52YWxpZCBpbnRyaW5zaWMgc3ludGF4LCBleHBlY3RlZCBjbG9zaW5nIGAlYCcpO1xuXHR9IGVsc2UgaWYgKGxhc3QgPT09ICclJyAmJiBmaXJzdCAhPT0gJyUnKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW52YWxpZCBpbnRyaW5zaWMgc3ludGF4LCBleHBlY3RlZCBvcGVuaW5nIGAlYCcpO1xuXHR9XG5cdHZhciByZXN1bHQgPSBbXTtcblx0JHJlcGxhY2Uoc3RyaW5nLCByZVByb3BOYW1lLCBmdW5jdGlvbiAobWF0Y2gsIG51bWJlciwgcXVvdGUsIHN1YlN0cmluZykge1xuXHRcdHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHF1b3RlID8gJHJlcGxhY2Uoc3ViU3RyaW5nLCByZUVzY2FwZUNoYXIsICckMScpIDogbnVtYmVyIHx8IG1hdGNoO1xuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG4vKiBlbmQgYWRhcHRhdGlvbiAqL1xuXG52YXIgZ2V0QmFzZUludHJpbnNpYyA9IGZ1bmN0aW9uIGdldEJhc2VJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdHZhciBpbnRyaW5zaWNOYW1lID0gbmFtZTtcblx0dmFyIGFsaWFzO1xuXHRpZiAoaGFzT3duKExFR0FDWV9BTElBU0VTLCBpbnRyaW5zaWNOYW1lKSkge1xuXHRcdGFsaWFzID0gTEVHQUNZX0FMSUFTRVNbaW50cmluc2ljTmFtZV07XG5cdFx0aW50cmluc2ljTmFtZSA9ICclJyArIGFsaWFzWzBdICsgJyUnO1xuXHR9XG5cblx0aWYgKGhhc093bihJTlRSSU5TSUNTLCBpbnRyaW5zaWNOYW1lKSkge1xuXHRcdHZhciB2YWx1ZSA9IElOVFJJTlNJQ1NbaW50cmluc2ljTmFtZV07XG5cdFx0aWYgKHZhbHVlID09PSBuZWVkc0V2YWwpIHtcblx0XHRcdHZhbHVlID0gZG9FdmFsKGludHJpbnNpY05hbWUpO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyAmJiAhYWxsb3dNaXNzaW5nKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignaW50cmluc2ljICcgKyBuYW1lICsgJyBleGlzdHMsIGJ1dCBpcyBub3QgYXZhaWxhYmxlLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZSEnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0YWxpYXM6IGFsaWFzLFxuXHRcdFx0bmFtZTogaW50cmluc2ljTmFtZSxcblx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdH07XG5cdH1cblxuXHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdpbnRyaW5zaWMgJyArIG5hbWUgKyAnIGRvZXMgbm90IGV4aXN0IScpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBHZXRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignaW50cmluc2ljIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcblx0fVxuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdHlwZW9mIGFsbG93TWlzc2luZyAhPT0gJ2Jvb2xlYW4nKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1wiYWxsb3dNaXNzaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBhIGJvb2xlYW4nKTtcblx0fVxuXG5cdGlmICgkZXhlYygvXiU/W14lXSolPyQvLCBuYW1lKSA9PT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2AlYCBtYXkgbm90IGJlIHByZXNlbnQgYW55d2hlcmUgYnV0IGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgaW50cmluc2ljIG5hbWUnKTtcblx0fVxuXHR2YXIgcGFydHMgPSBzdHJpbmdUb1BhdGgobmFtZSk7XG5cdHZhciBpbnRyaW5zaWNCYXNlTmFtZSA9IHBhcnRzLmxlbmd0aCA+IDAgPyBwYXJ0c1swXSA6ICcnO1xuXG5cdHZhciBpbnRyaW5zaWMgPSBnZXRCYXNlSW50cmluc2ljKCclJyArIGludHJpbnNpY0Jhc2VOYW1lICsgJyUnLCBhbGxvd01pc3NpbmcpO1xuXHR2YXIgaW50cmluc2ljUmVhbE5hbWUgPSBpbnRyaW5zaWMubmFtZTtcblx0dmFyIHZhbHVlID0gaW50cmluc2ljLnZhbHVlO1xuXHR2YXIgc2tpcEZ1cnRoZXJDYWNoaW5nID0gZmFsc2U7XG5cblx0dmFyIGFsaWFzID0gaW50cmluc2ljLmFsaWFzO1xuXHRpZiAoYWxpYXMpIHtcblx0XHRpbnRyaW5zaWNCYXNlTmFtZSA9IGFsaWFzWzBdO1xuXHRcdCRzcGxpY2VBcHBseShwYXJ0cywgJGNvbmNhdChbMCwgMV0sIGFsaWFzKSk7XG5cdH1cblxuXHRmb3IgKHZhciBpID0gMSwgaXNPd24gPSB0cnVlOyBpIDwgcGFydHMubGVuZ3RoOyBpICs9IDEpIHtcblx0XHR2YXIgcGFydCA9IHBhcnRzW2ldO1xuXHRcdHZhciBmaXJzdCA9ICRzdHJTbGljZShwYXJ0LCAwLCAxKTtcblx0XHR2YXIgbGFzdCA9ICRzdHJTbGljZShwYXJ0LCAtMSk7XG5cdFx0aWYgKFxuXHRcdFx0KFxuXHRcdFx0XHQoZmlyc3QgPT09ICdcIicgfHwgZmlyc3QgPT09IFwiJ1wiIHx8IGZpcnN0ID09PSAnYCcpXG5cdFx0XHRcdHx8IChsYXN0ID09PSAnXCInIHx8IGxhc3QgPT09IFwiJ1wiIHx8IGxhc3QgPT09ICdgJylcblx0XHRcdClcblx0XHRcdCYmIGZpcnN0ICE9PSBsYXN0XG5cdFx0KSB7XG5cdFx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdwcm9wZXJ0eSBuYW1lcyB3aXRoIHF1b3RlcyBtdXN0IGhhdmUgbWF0Y2hpbmcgcXVvdGVzJyk7XG5cdFx0fVxuXHRcdGlmIChwYXJ0ID09PSAnY29uc3RydWN0b3InIHx8ICFpc093bikge1xuXHRcdFx0c2tpcEZ1cnRoZXJDYWNoaW5nID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpbnRyaW5zaWNCYXNlTmFtZSArPSAnLicgKyBwYXJ0O1xuXHRcdGludHJpbnNpY1JlYWxOYW1lID0gJyUnICsgaW50cmluc2ljQmFzZU5hbWUgKyAnJSc7XG5cblx0XHRpZiAoaGFzT3duKElOVFJJTlNJQ1MsIGludHJpbnNpY1JlYWxOYW1lKSkge1xuXHRcdFx0dmFsdWUgPSBJTlRSSU5TSUNTW2ludHJpbnNpY1JlYWxOYW1lXTtcblx0XHR9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcblx0XHRcdGlmICghKHBhcnQgaW4gdmFsdWUpKSB7XG5cdFx0XHRcdGlmICghYWxsb3dNaXNzaW5nKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2Jhc2UgaW50cmluc2ljIGZvciAnICsgbmFtZSArICcgZXhpc3RzLCBidXQgdGhlIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUuJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHZvaWQgdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCRnT1BEICYmIChpICsgMSkgPj0gcGFydHMubGVuZ3RoKSB7XG5cdFx0XHRcdHZhciBkZXNjID0gJGdPUEQodmFsdWUsIHBhcnQpO1xuXHRcdFx0XHRpc093biA9ICEhZGVzYztcblxuXHRcdFx0XHQvLyBCeSBjb252ZW50aW9uLCB3aGVuIGEgZGF0YSBwcm9wZXJ0eSBpcyBjb252ZXJ0ZWQgdG8gYW4gYWNjZXNzb3Jcblx0XHRcdFx0Ly8gcHJvcGVydHkgdG8gZW11bGF0ZSBhIGRhdGEgcHJvcGVydHkgdGhhdCBkb2VzIG5vdCBzdWZmZXIgZnJvbVxuXHRcdFx0XHQvLyB0aGUgb3ZlcnJpZGUgbWlzdGFrZSwgdGhhdCBhY2Nlc3NvcidzIGdldHRlciBpcyBtYXJrZWQgd2l0aFxuXHRcdFx0XHQvLyBhbiBgb3JpZ2luYWxWYWx1ZWAgcHJvcGVydHkuIEhlcmUsIHdoZW4gd2UgZGV0ZWN0IHRoaXMsIHdlXG5cdFx0XHRcdC8vIHVwaG9sZCB0aGUgaWxsdXNpb24gYnkgcHJldGVuZGluZyB0byBzZWUgdGhhdCBvcmlnaW5hbCBkYXRhXG5cdFx0XHRcdC8vIHByb3BlcnR5LCBpLmUuLCByZXR1cm5pbmcgdGhlIHZhbHVlIHJhdGhlciB0aGFuIHRoZSBnZXR0ZXJcblx0XHRcdFx0Ly8gaXRzZWxmLlxuXHRcdFx0XHRpZiAoaXNPd24gJiYgJ2dldCcgaW4gZGVzYyAmJiAhKCdvcmlnaW5hbFZhbHVlJyBpbiBkZXNjLmdldCkpIHtcblx0XHRcdFx0XHR2YWx1ZSA9IGRlc2MuZ2V0O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHZhbHVlID0gdmFsdWVbcGFydF07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlzT3duID0gaGFzT3duKHZhbHVlLCBwYXJ0KTtcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZVtwYXJ0XTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGlzT3duICYmICFza2lwRnVydGhlckNhY2hpbmcpIHtcblx0XHRcdFx0SU5UUklOU0lDU1tpbnRyaW5zaWNSZWFsTmFtZV0gPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyICRPYmplY3QgPSByZXF1aXJlKCdlcy1vYmplY3QtYXRvbXMnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vT2JqZWN0LmdldFByb3RvdHlwZU9mJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9ICRPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgbnVsbDtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vUmVmbGVjdC5nZXRQcm90b3R5cGVPZicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSAodHlwZW9mIFJlZmxlY3QgIT09ICd1bmRlZmluZWQnICYmIFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YpIHx8IG51bGw7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciByZWZsZWN0R2V0UHJvdG8gPSByZXF1aXJlKCcuL1JlZmxlY3QuZ2V0UHJvdG90eXBlT2YnKTtcbnZhciBvcmlnaW5hbEdldFByb3RvID0gcmVxdWlyZSgnLi9PYmplY3QuZ2V0UHJvdG90eXBlT2YnKTtcblxudmFyIGdldER1bmRlclByb3RvID0gcmVxdWlyZSgnZHVuZGVyLXByb3RvL2dldCcpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSByZWZsZWN0R2V0UHJvdG9cblx0PyBmdW5jdGlvbiBnZXRQcm90byhPKSB7XG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUUyBjYW4ndCBuYXJyb3cgaW5zaWRlIGEgY2xvc3VyZSwgZm9yIHNvbWUgcmVhc29uXG5cdFx0cmV0dXJuIHJlZmxlY3RHZXRQcm90byhPKTtcblx0fVxuXHQ6IG9yaWdpbmFsR2V0UHJvdG9cblx0XHQ/IGZ1bmN0aW9uIGdldFByb3RvKE8pIHtcblx0XHRcdGlmICghTyB8fCAodHlwZW9mIE8gIT09ICdvYmplY3QnICYmIHR5cGVvZiBPICE9PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdnZXRQcm90bzogbm90IGFuIG9iamVjdCcpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUUyBjYW4ndCBuYXJyb3cgaW5zaWRlIGEgY2xvc3VyZSwgZm9yIHNvbWUgcmVhc29uXG5cdFx0XHRyZXR1cm4gb3JpZ2luYWxHZXRQcm90byhPKTtcblx0XHR9XG5cdFx0OiBnZXREdW5kZXJQcm90b1xuXHRcdFx0PyBmdW5jdGlvbiBnZXRQcm90byhPKSB7XG5cdFx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgVFMgY2FuJ3QgbmFycm93IGluc2lkZSBhIGNsb3N1cmUsIGZvciBzb21lIHJlYXNvblxuXHRcdFx0XHRyZXR1cm4gZ2V0RHVuZGVyUHJvdG8oTyk7XG5cdFx0XHR9XG5cdFx0XHQ6IG51bGw7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2dPUEQnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbnZhciAkZ09QRCA9IHJlcXVpcmUoJy4vZ09QRCcpO1xuXG5pZiAoJGdPUEQpIHtcblx0dHJ5IHtcblx0XHQkZ09QRChbXSwgJ2xlbmd0aCcpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gSUUgOCBoYXMgYSBicm9rZW4gZ09QRFxuXHRcdCRnT1BEID0gbnVsbDtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9ICRnT1BEO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgb3JpZ1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbDtcbnZhciBoYXNTeW1ib2xTaGFtID0gcmVxdWlyZSgnLi9zaGFtcycpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNOYXRpdmVTeW1ib2xzKCkge1xuXHRpZiAodHlwZW9mIG9yaWdTeW1ib2wgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgU3ltYm9sICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIG9yaWdTeW1ib2woJ2ZvbycpICE9PSAnc3ltYm9sJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2woJ2JhcicpICE9PSAnc3ltYm9sJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRyZXR1cm4gaGFzU3ltYm9sU2hhbSgpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vc2hhbXMnKX0gKi9cbi8qIGVzbGludCBjb21wbGV4aXR5OiBbMiwgMThdLCBtYXgtc3RhdGVtZW50czogWzIsIDMzXSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNTeW1ib2xzKCkge1xuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnKSB7IHJldHVybiB0cnVlOyB9XG5cblx0LyoqIEB0eXBlIHt7IFtrIGluIHN5bWJvbF0/OiB1bmtub3duIH19ICovXG5cdHZhciBvYmogPSB7fTtcblx0dmFyIHN5bSA9IFN5bWJvbCgndGVzdCcpO1xuXHR2YXIgc3ltT2JqID0gT2JqZWN0KHN5bSk7XG5cdGlmICh0eXBlb2Ygc3ltID09PSAnc3RyaW5nJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bSkgIT09ICdbb2JqZWN0IFN5bWJvbF0nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bU9iaikgIT09ICdbb2JqZWN0IFN5bWJvbF0nKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdC8vIHRlbXAgZGlzYWJsZWQgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9samhhcmIvb2JqZWN0LmFzc2lnbi9pc3N1ZXMvMTdcblx0Ly8gaWYgKHN5bSBpbnN0YW5jZW9mIFN5bWJvbCkgeyByZXR1cm4gZmFsc2U7IH1cblx0Ly8gdGVtcCBkaXNhYmxlZCBwZXIgaHR0cHM6Ly9naXRodWIuY29tL1dlYlJlZmxlY3Rpb24vZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzL2lzc3Vlcy80XG5cdC8vIGlmICghKHN5bU9iaiBpbnN0YW5jZW9mIFN5bWJvbCkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0Ly8gaWYgKHR5cGVvZiBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHQvLyBpZiAoU3RyaW5nKHN5bSkgIT09IFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW0pKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHZhciBzeW1WYWwgPSA0Mjtcblx0b2JqW3N5bV0gPSBzeW1WYWw7XG5cdGZvciAodmFyIF8gaW4gb2JqKSB7IHJldHVybiBmYWxzZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby11bnJlYWNoYWJsZS1sb29wXG5cdGlmICh0eXBlb2YgT2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggIT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyA9PT0gJ2Z1bmN0aW9uJyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmxlbmd0aCAhPT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHR2YXIgc3ltcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKTtcblx0aWYgKHN5bXMubGVuZ3RoICE9PSAxIHx8IHN5bXNbMF0gIT09IHN5bSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmosIHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXBhcmVuc1xuXHRcdHZhciBkZXNjcmlwdG9yID0gLyoqIEB0eXBlIHtQcm9wZXJ0eURlc2NyaXB0b3J9ICovIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgc3ltKSk7XG5cdFx0aWYgKGRlc2NyaXB0b3IudmFsdWUgIT09IHN5bVZhbCB8fCBkZXNjcmlwdG9yLmVudW1lcmFibGUgIT09IHRydWUpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7XG52YXIgJGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gYmluZC5jYWxsKGNhbGwsICRoYXNPd24pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGVsLCBvbk92ZXIsIG9uT3V0KSB7XG4gIHZhciB4LCB5LCBwWCwgcFk7XG4gIHZhciBtb3VzZU92ZXIgPSBmYWxzZTtcbiAgdmFyIGZvY3VzZWQgPSBmYWxzZTtcbiAgdmFyIGggPSB7fSxcbiAgICBzdGF0ZSA9IDAsXG4gICAgdGltZXIgPSAwO1xuXG4gIHZhciBvcHRpb25zID0ge1xuICAgIHNlbnNpdGl2aXR5OiA3LFxuICAgIGludGVydmFsOiAxMDAsXG4gICAgdGltZW91dDogMCxcbiAgICBoYW5kbGVGb2N1czogZmFsc2VcbiAgfTtcblxuICBmdW5jdGlvbiBkZWxheShlbCwgZSkge1xuICAgIGlmICh0aW1lcikgdGltZXIgPSBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIHN0YXRlID0gMDtcbiAgICByZXR1cm4gZm9jdXNlZCA/IHVuZGVmaW5lZCA6IG9uT3V0LmNhbGwoZWwsIGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhY2tlcihlKSB7XG4gICAgeCA9IGUuY2xpZW50WDtcbiAgICB5ID0gZS5jbGllbnRZO1xuICB9XG5cbiAgZnVuY3Rpb24gY29tcGFyZShlbCwgZSkge1xuICAgIGlmICh0aW1lcikgdGltZXIgPSBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIGlmICgoTWF0aC5hYnMocFggLSB4KSArIE1hdGguYWJzKHBZIC0geSkpIDwgb3B0aW9ucy5zZW5zaXRpdml0eSkge1xuICAgICAgc3RhdGUgPSAxO1xuICAgICAgcmV0dXJuIGZvY3VzZWQgPyB1bmRlZmluZWQgOiBvbk92ZXIuY2FsbChlbCwgZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBYID0geDtcbiAgICAgIHBZID0geTtcbiAgICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgY29tcGFyZShlbCwgZSk7XG4gICAgICB9LCBvcHRpb25zLmludGVydmFsKTtcbiAgICB9XG4gIH1cblxuICAvLyBQdWJsaWMgbWV0aG9kc1xuICBoLm9wdGlvbnMgPSBmdW5jdGlvbihvcHQpIHtcbiAgICB2YXIgZm9jdXNPcHRpb25DaGFuZ2VkID0gb3B0LmhhbmRsZUZvY3VzICE9PSBvcHRpb25zLmhhbmRsZUZvY3VzO1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCBvcHQpO1xuICAgIGlmIChmb2N1c09wdGlvbkNoYW5nZWQpIHtcbiAgICAgIG9wdGlvbnMuaGFuZGxlRm9jdXMgPyBhZGRGb2N1cygpIDogcmVtb3ZlRm9jdXMoKTtcbiAgICB9XG4gICAgcmV0dXJuIGg7XG4gIH07XG5cbiAgZnVuY3Rpb24gZGlzcGF0Y2hPdmVyKGUpIHtcbiAgICBtb3VzZU92ZXIgPSB0cnVlO1xuICAgIGlmICh0aW1lcikgdGltZXIgPSBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRyYWNrZXIsIGZhbHNlKTtcblxuICAgIGlmIChzdGF0ZSAhPT0gMSkge1xuICAgICAgcFggPSBlLmNsaWVudFg7XG4gICAgICBwWSA9IGUuY2xpZW50WTtcblxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdHJhY2tlciwgZmFsc2UpO1xuXG4gICAgICB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbXBhcmUoZWwsIGUpO1xuICAgICAgfSwgb3B0aW9ucy5pbnRlcnZhbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBmdW5jdGlvbiBkaXNwYXRjaE91dChlKSB7XG4gICAgbW91c2VPdmVyID0gZmFsc2U7XG4gICAgaWYgKHRpbWVyKSB0aW1lciA9IGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdHJhY2tlciwgZmFsc2UpO1xuXG4gICAgaWYgKHN0YXRlID09PSAxKSB7XG4gICAgICB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGRlbGF5KGVsLCBlKTtcbiAgICAgIH0sIG9wdGlvbnMudGltZW91dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBmdW5jdGlvbiBkaXNwYXRjaEZvY3VzKGUpIHtcbiAgICBpZiAoIW1vdXNlT3Zlcikge1xuICAgICAgZm9jdXNlZCA9IHRydWU7XG4gICAgICBvbk92ZXIuY2FsbChlbCwgZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGlzcGF0Y2hCbHVyKGUpIHtcbiAgICBpZiAoIW1vdXNlT3ZlciAmJiBmb2N1c2VkKSB7XG4gICAgICBmb2N1c2VkID0gZmFsc2U7XG4gICAgICBvbk91dC5jYWxsKGVsLCBlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhZGRGb2N1cygpIHtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGRpc3BhdGNoRm9jdXMsIGZhbHNlKTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgZGlzcGF0Y2hCbHVyLCBmYWxzZSk7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVGb2N1cygpIHtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIGRpc3BhdGNoRm9jdXMsIGZhbHNlKTtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJywgZGlzcGF0Y2hCbHVyLCBmYWxzZSk7XG4gIH1cblxuICBoLnJlbW92ZSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCBkaXNwYXRjaE92ZXIsIGZhbHNlKTtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIGRpc3BhdGNoT3V0LCBmYWxzZSk7XG4gICAgcmVtb3ZlRm9jdXMoKTtcbiAgfTtcblxuICBpZiAoZWwpIHtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCBkaXNwYXRjaE92ZXIsIGZhbHNlKTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIGRpc3BhdGNoT3V0LCBmYWxzZSk7XG4gIH1cblxuICByZXR1cm4gaDtcbn07XG4iLCIvKiEgalF1ZXJ5IHYzLjcuMSB8IChjKSBPcGVuSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovXG4hZnVuY3Rpb24oZSx0KXtcInVzZSBzdHJpY3RcIjtcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9ZS5kb2N1bWVudD90KGUsITApOmZ1bmN0aW9uKGUpe2lmKCFlLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcihcImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnRcIik7cmV0dXJuIHQoZSl9OnQoZSl9KFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oaWUsZSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIG9lPVtdLHI9T2JqZWN0LmdldFByb3RvdHlwZU9mLGFlPW9lLnNsaWNlLGc9b2UuZmxhdD9mdW5jdGlvbihlKXtyZXR1cm4gb2UuZmxhdC5jYWxsKGUpfTpmdW5jdGlvbihlKXtyZXR1cm4gb2UuY29uY2F0LmFwcGx5KFtdLGUpfSxzPW9lLnB1c2gsc2U9b2UuaW5kZXhPZixuPXt9LGk9bi50b1N0cmluZyx1ZT1uLmhhc093blByb3BlcnR5LG89dWUudG9TdHJpbmcsYT1vLmNhbGwoT2JqZWN0KSxsZT17fSx2PWZ1bmN0aW9uKGUpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIGUmJlwibnVtYmVyXCIhPXR5cGVvZiBlLm5vZGVUeXBlJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBlLml0ZW19LHk9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUmJmU9PT1lLndpbmRvd30sQz1pZS5kb2N1bWVudCx1PXt0eXBlOiEwLHNyYzohMCxub25jZTohMCxub01vZHVsZTohMH07ZnVuY3Rpb24gbShlLHQsbil7dmFyIHIsaSxvPShuPW58fEMpLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7aWYoby50ZXh0PWUsdClmb3IociBpbiB1KShpPXRbcl18fHQuZ2V0QXR0cmlidXRlJiZ0LmdldEF0dHJpYnV0ZShyKSkmJm8uc2V0QXR0cmlidXRlKHIsaSk7bi5oZWFkLmFwcGVuZENoaWxkKG8pLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobyl9ZnVuY3Rpb24geChlKXtyZXR1cm4gbnVsbD09ZT9lK1wiXCI6XCJvYmplY3RcIj09dHlwZW9mIGV8fFwiZnVuY3Rpb25cIj09dHlwZW9mIGU/bltpLmNhbGwoZSldfHxcIm9iamVjdFwiOnR5cGVvZiBlfXZhciB0PVwiMy43LjFcIixsPS9IVE1MJC9pLGNlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBjZS5mbi5pbml0KGUsdCl9O2Z1bmN0aW9uIGMoZSl7dmFyIHQ9ISFlJiZcImxlbmd0aFwiaW4gZSYmZS5sZW5ndGgsbj14KGUpO3JldHVybiF2KGUpJiYheShlKSYmKFwiYXJyYXlcIj09PW58fDA9PT10fHxcIm51bWJlclwiPT10eXBlb2YgdCYmMDx0JiZ0LTEgaW4gZSl9ZnVuY3Rpb24gZmUoZSx0KXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpfWNlLmZuPWNlLnByb3RvdHlwZT17anF1ZXJ5OnQsY29uc3RydWN0b3I6Y2UsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBhZS5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/YWUuY2FsbCh0aGlzKTplPDA/dGhpc1tlK3RoaXMubGVuZ3RoXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9Y2UubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGUpO3JldHVybiB0LnByZXZPYmplY3Q9dGhpcyx0fSxlYWNoOmZ1bmN0aW9uKGUpe3JldHVybiBjZS5lYWNoKHRoaXMsZSl9LG1hcDpmdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soY2UubWFwKHRoaXMsZnVuY3Rpb24oZSx0KXtyZXR1cm4gbi5jYWxsKGUsdCxlKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYWUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXZlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhjZS5ncmVwKHRoaXMsZnVuY3Rpb24oZSx0KXtyZXR1cm4odCsxKSUyfSkpfSxvZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soY2UuZ3JlcCh0aGlzLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQlMn0pKX0sZXE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5sZW5ndGgsbj0rZSsoZTwwP3Q6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKDA8PW4mJm48dD9bdGhpc1tuXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6cyxzb3J0Om9lLnNvcnQsc3BsaWNlOm9lLnNwbGljZX0sY2UuZXh0ZW5kPWNlLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBlLHQsbixyLGksbyxhPWFyZ3VtZW50c1swXXx8e30scz0xLHU9YXJndW1lbnRzLmxlbmd0aCxsPSExO2ZvcihcImJvb2xlYW5cIj09dHlwZW9mIGEmJihsPWEsYT1hcmd1bWVudHNbc118fHt9LHMrKyksXCJvYmplY3RcIj09dHlwZW9mIGF8fHYoYSl8fChhPXt9KSxzPT09dSYmKGE9dGhpcyxzLS0pO3M8dTtzKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW3NdKSlmb3IodCBpbiBlKXI9ZVt0XSxcIl9fcHJvdG9fX1wiIT09dCYmYSE9PXImJihsJiZyJiYoY2UuaXNQbGFpbk9iamVjdChyKXx8KGk9QXJyYXkuaXNBcnJheShyKSkpPyhuPWFbdF0sbz1pJiYhQXJyYXkuaXNBcnJheShuKT9bXTppfHxjZS5pc1BsYWluT2JqZWN0KG4pP246e30saT0hMSxhW3RdPWNlLmV4dGVuZChsLG8scikpOnZvaWQgMCE9PXImJihhW3RdPXIpKTtyZXR1cm4gYX0sY2UuZXh0ZW5kKHtleHBhbmRvOlwialF1ZXJ5XCIrKHQrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXFxEL2csXCJcIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoZSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4hKCFlfHxcIltvYmplY3QgT2JqZWN0XVwiIT09aS5jYWxsKGUpKSYmKCEodD1yKGUpKXx8XCJmdW5jdGlvblwiPT10eXBlb2Yobj11ZS5jYWxsKHQsXCJjb25zdHJ1Y3RvclwiKSYmdC5jb25zdHJ1Y3RvcikmJm8uY2FsbChuKT09PWEpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oZSx0LG4pe20oZSx7bm9uY2U6dCYmdC5ub25jZX0sbil9LGVhY2g6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTA7aWYoYyhlKSl7Zm9yKG49ZS5sZW5ndGg7cjxuO3IrKylpZighMT09PXQuY2FsbChlW3JdLHIsZVtyXSkpYnJlYWt9ZWxzZSBmb3IociBpbiBlKWlmKCExPT09dC5jYWxsKGVbcl0scixlW3JdKSlicmVhaztyZXR1cm4gZX0sdGV4dDpmdW5jdGlvbihlKXt2YXIgdCxuPVwiXCIscj0wLGk9ZS5ub2RlVHlwZTtpZighaSl3aGlsZSh0PWVbcisrXSluKz1jZS50ZXh0KHQpO3JldHVybiAxPT09aXx8MTE9PT1pP2UudGV4dENvbnRlbnQ6OT09PWk/ZS5kb2N1bWVudEVsZW1lbnQudGV4dENvbnRlbnQ6Mz09PWl8fDQ9PT1pP2Uubm9kZVZhbHVlOm59LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fFtdO3JldHVybiBudWxsIT1lJiYoYyhPYmplY3QoZSkpP2NlLm1lcmdlKG4sXCJzdHJpbmdcIj09dHlwZW9mIGU/W2VdOmUpOnMuY2FsbChuLGUpKSxufSxpbkFycmF5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09dD8tMTpzZS5jYWxsKHQsZSxuKX0saXNYTUxEb2M6ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5uYW1lc3BhY2VVUkksbj1lJiYoZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIWwudGVzdCh0fHxuJiZuLm5vZGVOYW1lfHxcIkhUTUxcIil9LG1lcmdlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPSt0Lmxlbmd0aCxyPTAsaT1lLmxlbmd0aDtyPG47cisrKWVbaSsrXT10W3JdO3JldHVybiBlLmxlbmd0aD1pLGV9LGdyZXA6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1bXSxpPTAsbz1lLmxlbmd0aCxhPSFuO2k8bztpKyspIXQoZVtpXSxpKSE9PWEmJnIucHVzaChlW2ldKTtyZXR1cm4gcn0sbWFwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89MCxhPVtdO2lmKGMoZSkpZm9yKHI9ZS5sZW5ndGg7bzxyO28rKyludWxsIT0oaT10KGVbb10sbyxuKSkmJmEucHVzaChpKTtlbHNlIGZvcihvIGluIGUpbnVsbCE9KGk9dChlW29dLG8sbikpJiZhLnB1c2goaSk7cmV0dXJuIGcoYSl9LGd1aWQ6MSxzdXBwb3J0OmxlfSksXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiYoY2UuZm5bU3ltYm9sLml0ZXJhdG9yXT1vZVtTeW1ib2wuaXRlcmF0b3JdKSxjZS5lYWNoKFwiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2xcIi5zcGxpdChcIiBcIiksZnVuY3Rpb24oZSx0KXtuW1wiW29iamVjdCBcIit0K1wiXVwiXT10LnRvTG93ZXJDYXNlKCl9KTt2YXIgcGU9b2UucG9wLGRlPW9lLnNvcnQsaGU9b2Uuc3BsaWNlLGdlPVwiW1xcXFx4MjBcXFxcdFxcXFxyXFxcXG5cXFxcZl1cIix2ZT1uZXcgUmVnRXhwKFwiXlwiK2dlK1wiK3woKD86XnxbXlxcXFxcXFxcXSkoPzpcXFxcXFxcXC4pKilcIitnZStcIiskXCIsXCJnXCIpO2NlLmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7dmFyIG49dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09bnx8ISghbnx8MSE9PW4ubm9kZVR5cGV8fCEoZS5jb250YWlucz9lLmNvbnRhaW5zKG4pOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obikpKX07dmFyIGY9LyhbXFwwLVxceDFmXFx4N2ZdfF4tP1xcZCl8Xi0kfFteXFx4ODAtXFx1RkZGRlxcdy1dL2c7ZnVuY3Rpb24gcChlLHQpe3JldHVybiB0P1wiXFwwXCI9PT1lP1wiXFx1ZmZmZFwiOmUuc2xpY2UoMCwtMSkrXCJcXFxcXCIrZS5jaGFyQ29kZUF0KGUubGVuZ3RoLTEpLnRvU3RyaW5nKDE2KStcIiBcIjpcIlxcXFxcIitlfWNlLmVzY2FwZVNlbGVjdG9yPWZ1bmN0aW9uKGUpe3JldHVybihlK1wiXCIpLnJlcGxhY2UoZixwKX07dmFyIHllPUMsbWU9czshZnVuY3Rpb24oKXt2YXIgZSxiLHcsbyxhLFQscixDLGQsaSxrPW1lLFM9Y2UuZXhwYW5kbyxFPTAsbj0wLHM9VygpLGM9VygpLHU9VygpLGg9VygpLGw9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PXQmJihhPSEwKSwwfSxmPVwiY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWRcIix0PVwiKD86XFxcXFxcXFxbXFxcXGRhLWZBLUZdezEsNn1cIitnZStcIj98XFxcXFxcXFxbXlxcXFxyXFxcXG5cXFxcZl18W1xcXFx3LV18W15cXDAtXFxcXHg3Zl0pK1wiLHA9XCJcXFxcW1wiK2dlK1wiKihcIit0K1wiKSg/OlwiK2dlK1wiKihbKl4kfCF+XT89KVwiK2dlK1wiKig/OicoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcInwoXCIrdCtcIikpfClcIitnZStcIipcXFxcXVwiLGc9XCI6KFwiK3QrXCIpKD86XFxcXCgoKCcoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcIil8KCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcKClbXFxcXF1dfFwiK3ArXCIpKil8LiopXFxcXCl8KVwiLHY9bmV3IFJlZ0V4cChnZStcIitcIixcImdcIikseT1uZXcgUmVnRXhwKFwiXlwiK2dlK1wiKixcIitnZStcIipcIiksbT1uZXcgUmVnRXhwKFwiXlwiK2dlK1wiKihbPit+XXxcIitnZStcIilcIitnZStcIipcIikseD1uZXcgUmVnRXhwKGdlK1wifD5cIiksaj1uZXcgUmVnRXhwKGcpLEE9bmV3IFJlZ0V4cChcIl5cIit0K1wiJFwiKSxEPXtJRDpuZXcgUmVnRXhwKFwiXiMoXCIrdCtcIilcIiksQ0xBU1M6bmV3IFJlZ0V4cChcIl5cXFxcLihcIit0K1wiKVwiKSxUQUc6bmV3IFJlZ0V4cChcIl4oXCIrdCtcInxbKl0pXCIpLEFUVFI6bmV3IFJlZ0V4cChcIl5cIitwKSxQU0VVRE86bmV3IFJlZ0V4cChcIl5cIitnKSxDSElMRDpuZXcgUmVnRXhwKFwiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFxcXChcIitnZStcIiooZXZlbnxvZGR8KChbKy1dfCkoXFxcXGQqKW58KVwiK2dlK1wiKig/OihbKy1dfClcIitnZStcIiooXFxcXGQrKXwpKVwiK2dlK1wiKlxcXFwpfClcIixcImlcIiksYm9vbDpuZXcgUmVnRXhwKFwiXig/OlwiK2YrXCIpJFwiLFwiaVwiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cChcIl5cIitnZStcIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcXFwoXCIrZ2UrXCIqKCg/Oi1cXFxcZCk/XFxcXGQqKVwiK2dlK1wiKlxcXFwpfCkoPz1bXi1dfCQpXCIsXCJpXCIpfSxOPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2kscT0vXmhcXGQkL2ksTD0vXig/OiMoW1xcdy1dKyl8KFxcdyspfFxcLihbXFx3LV0rKSkkLyxIPS9bK35dLyxPPW5ldyBSZWdFeHAoXCJcXFxcXFxcXFtcXFxcZGEtZkEtRl17MSw2fVwiK2dlK1wiP3xcXFxcXFxcXChbXlxcXFxyXFxcXG5cXFxcZl0pXCIsXCJnXCIpLFA9ZnVuY3Rpb24oZSx0KXt2YXIgbj1cIjB4XCIrZS5zbGljZSgxKS02NTUzNjtyZXR1cm4gdHx8KG48MD9TdHJpbmcuZnJvbUNoYXJDb2RlKG4rNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUobj4+MTB8NTUyOTYsMTAyMyZufDU2MzIwKSl9LE09ZnVuY3Rpb24oKXtWKCl9LFI9SihmdW5jdGlvbihlKXtyZXR1cm4hMD09PWUuZGlzYWJsZWQmJmZlKGUsXCJmaWVsZHNldFwiKX0se2RpcjpcInBhcmVudE5vZGVcIixuZXh0OlwibGVnZW5kXCJ9KTt0cnl7ay5hcHBseShvZT1hZS5jYWxsKHllLmNoaWxkTm9kZXMpLHllLmNoaWxkTm9kZXMpLG9lW3llLmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlKXtrPXthcHBseTpmdW5jdGlvbihlLHQpe21lLmFwcGx5KGUsYWUuY2FsbCh0KSl9LGNhbGw6ZnVuY3Rpb24oZSl7bWUuYXBwbHkoZSxhZS5jYWxsKGFyZ3VtZW50cywxKSl9fX1mdW5jdGlvbiBJKHQsZSxuLHIpe3ZhciBpLG8sYSxzLHUsbCxjLGY9ZSYmZS5vd25lckRvY3VtZW50LHA9ZT9lLm5vZGVUeXBlOjk7aWYobj1ufHxbXSxcInN0cmluZ1wiIT10eXBlb2YgdHx8IXR8fDEhPT1wJiY5IT09cCYmMTEhPT1wKXJldHVybiBuO2lmKCFyJiYoVihlKSxlPWV8fFQsQykpe2lmKDExIT09cCYmKHU9TC5leGVjKHQpKSlpZihpPXVbMV0pe2lmKDk9PT1wKXtpZighKGE9ZS5nZXRFbGVtZW50QnlJZChpKSkpcmV0dXJuIG47aWYoYS5pZD09PWkpcmV0dXJuIGsuY2FsbChuLGEpLG59ZWxzZSBpZihmJiYoYT1mLmdldEVsZW1lbnRCeUlkKGkpKSYmSS5jb250YWlucyhlLGEpJiZhLmlkPT09aSlyZXR1cm4gay5jYWxsKG4sYSksbn1lbHNle2lmKHVbMl0pcmV0dXJuIGsuYXBwbHkobixlLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpKSxuO2lmKChpPXVbM10pJiZlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIGsuYXBwbHkobixlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaSkpLG59aWYoIShoW3QrXCIgXCJdfHxkJiZkLnRlc3QodCkpKXtpZihjPXQsZj1lLDE9PT1wJiYoeC50ZXN0KHQpfHxtLnRlc3QodCkpKXsoZj1ILnRlc3QodCkmJlUoZS5wYXJlbnROb2RlKXx8ZSk9PWUmJmxlLnNjb3BlfHwoKHM9ZS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSk/cz1jZS5lc2NhcGVTZWxlY3RvcihzKTplLnNldEF0dHJpYnV0ZShcImlkXCIscz1TKSksbz0obD1ZKHQpKS5sZW5ndGg7d2hpbGUoby0tKWxbb109KHM/XCIjXCIrczpcIjpzY29wZVwiKStcIiBcIitRKGxbb10pO2M9bC5qb2luKFwiLFwiKX10cnl7cmV0dXJuIGsuYXBwbHkobixmLnF1ZXJ5U2VsZWN0b3JBbGwoYykpLG59Y2F0Y2goZSl7aCh0LCEwKX1maW5hbGx5e3M9PT1TJiZlLnJlbW92ZUF0dHJpYnV0ZShcImlkXCIpfX19cmV0dXJuIHJlKHQucmVwbGFjZSh2ZSxcIiQxXCIpLGUsbixyKX1mdW5jdGlvbiBXKCl7dmFyIHI9W107cmV0dXJuIGZ1bmN0aW9uIGUodCxuKXtyZXR1cm4gci5wdXNoKHQrXCIgXCIpPmIuY2FjaGVMZW5ndGgmJmRlbGV0ZSBlW3Iuc2hpZnQoKV0sZVt0K1wiIFwiXT1ufX1mdW5jdGlvbiBGKGUpe3JldHVybiBlW1NdPSEwLGV9ZnVuY3Rpb24gJChlKXt2YXIgdD1ULmNyZWF0ZUVsZW1lbnQoXCJmaWVsZHNldFwiKTt0cnl7cmV0dXJuISFlKHQpfWNhdGNoKGUpe3JldHVybiExfWZpbmFsbHl7dC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksdD1udWxsfX1mdW5jdGlvbiBCKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZmUoZSxcImlucHV0XCIpJiZlLnR5cGU9PT10fX1mdW5jdGlvbiBfKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4oZmUoZSxcImlucHV0XCIpfHxmZShlLFwiYnV0dG9uXCIpKSYmZS50eXBlPT09dH19ZnVuY3Rpb24geih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuXCJmb3JtXCJpbiBlP2UucGFyZW50Tm9kZSYmITE9PT1lLmRpc2FibGVkP1wibGFiZWxcImluIGU/XCJsYWJlbFwiaW4gZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5kaXNhYmxlZD09PXQ6ZS5kaXNhYmxlZD09PXQ6ZS5pc0Rpc2FibGVkPT09dHx8ZS5pc0Rpc2FibGVkIT09IXQmJlIoZSk9PT10OmUuZGlzYWJsZWQ9PT10OlwibGFiZWxcImluIGUmJmUuZGlzYWJsZWQ9PT10fX1mdW5jdGlvbiBYKGEpe3JldHVybiBGKGZ1bmN0aW9uKG8pe3JldHVybiBvPStvLEYoZnVuY3Rpb24oZSx0KXt2YXIgbixyPWEoW10sZS5sZW5ndGgsbyksaT1yLmxlbmd0aDt3aGlsZShpLS0pZVtuPXJbaV1dJiYoZVtuXT0hKHRbbl09ZVtuXSkpfSl9KX1mdW5jdGlvbiBVKGUpe3JldHVybiBlJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmZX1mdW5jdGlvbiBWKGUpe3ZhciB0LG49ZT9lLm93bmVyRG9jdW1lbnR8fGU6eWU7cmV0dXJuIG4hPVQmJjk9PT1uLm5vZGVUeXBlJiZuLmRvY3VtZW50RWxlbWVudCYmKHI9KFQ9bikuZG9jdW1lbnRFbGVtZW50LEM9IWNlLmlzWE1MRG9jKFQpLGk9ci5tYXRjaGVzfHxyLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8ci5tc01hdGNoZXNTZWxlY3RvcixyLm1zTWF0Y2hlc1NlbGVjdG9yJiZ5ZSE9VCYmKHQ9VC5kZWZhdWx0VmlldykmJnQudG9wIT09dCYmdC5hZGRFdmVudExpc3RlbmVyKFwidW5sb2FkXCIsTSksbGUuZ2V0QnlJZD0kKGZ1bmN0aW9uKGUpe3JldHVybiByLmFwcGVuZENoaWxkKGUpLmlkPWNlLmV4cGFuZG8sIVQuZ2V0RWxlbWVudHNCeU5hbWV8fCFULmdldEVsZW1lbnRzQnlOYW1lKGNlLmV4cGFuZG8pLmxlbmd0aH0pLGxlLmRpc2Nvbm5lY3RlZE1hdGNoPSQoZnVuY3Rpb24oZSl7cmV0dXJuIGkuY2FsbChlLFwiKlwiKX0pLGxlLnNjb3BlPSQoZnVuY3Rpb24oKXtyZXR1cm4gVC5xdWVyeVNlbGVjdG9yQWxsKFwiOnNjb3BlXCIpfSksbGUuY3NzSGFzPSQoZnVuY3Rpb24oKXt0cnl7cmV0dXJuIFQucXVlcnlTZWxlY3RvcihcIjpoYXMoKiw6anFmYWtlKVwiKSwhMX1jYXRjaChlKXtyZXR1cm4hMH19KSxsZS5nZXRCeUlkPyhiLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoTyxQKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKFwiaWRcIik9PT10fX0sYi5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQmJkMpe3ZhciBuPXQuZ2V0RWxlbWVudEJ5SWQoZSk7cmV0dXJuIG4/W25dOltdfX0pOihiLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgbj1lLnJlcGxhY2UoTyxQKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlTm9kZSYmZS5nZXRBdHRyaWJ1dGVOb2RlKFwiaWRcIik7cmV0dXJuIHQmJnQudmFsdWU9PT1ufX0sYi5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQmJkMpe3ZhciBuLHIsaSxvPXQuZ2V0RWxlbWVudEJ5SWQoZSk7aWYobyl7aWYoKG49by5nZXRBdHRyaWJ1dGVOb2RlKFwiaWRcIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb107aT10LmdldEVsZW1lbnRzQnlOYW1lKGUpLHI9MDt3aGlsZShvPWlbcisrXSlpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKSkmJm4udmFsdWU9PT1lKXJldHVybltvXX1yZXR1cm5bXX19KSxiLmZpbmQuVEFHPWZ1bmN0aW9uKGUsdCl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHQuZ2V0RWxlbWVudHNCeVRhZ05hbWU/dC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKTp0LnF1ZXJ5U2VsZWN0b3JBbGwoZSl9LGIuZmluZC5DTEFTUz1mdW5jdGlvbihlLHQpe2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJkMpcmV0dXJuIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlKX0sZD1bXSwkKGZ1bmN0aW9uKGUpe3ZhciB0O3IuYXBwZW5kQ2hpbGQoZSkuaW5uZXJIVE1MPVwiPGEgaWQ9J1wiK1MrXCInIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBpZD0nXCIrUytcIi1cXHJcXFxcJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+XCIsZS5xdWVyeVNlbGVjdG9yQWxsKFwiW3NlbGVjdGVkXVwiKS5sZW5ndGh8fGQucHVzaChcIlxcXFxbXCIrZ2UrXCIqKD86dmFsdWV8XCIrZitcIilcIiksZS5xdWVyeVNlbGVjdG9yQWxsKFwiW2lkfj1cIitTK1wiLV1cIikubGVuZ3RofHxkLnB1c2goXCJ+PVwiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoXCJhI1wiK1MrXCIrKlwiKS5sZW5ndGh8fGQucHVzaChcIi4jLitbK35dXCIpLGUucXVlcnlTZWxlY3RvckFsbChcIjpjaGVja2VkXCIpLmxlbmd0aHx8ZC5wdXNoKFwiOmNoZWNrZWRcIiksKHQ9VC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIikpLnNldEF0dHJpYnV0ZShcInR5cGVcIixcImhpZGRlblwiKSxlLmFwcGVuZENoaWxkKHQpLnNldEF0dHJpYnV0ZShcIm5hbWVcIixcIkRcIiksci5hcHBlbmRDaGlsZChlKS5kaXNhYmxlZD0hMCwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKFwiOmRpc2FibGVkXCIpLmxlbmd0aCYmZC5wdXNoKFwiOmVuYWJsZWRcIixcIjpkaXNhYmxlZFwiKSwodD1ULmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKSkuc2V0QXR0cmlidXRlKFwibmFtZVwiLFwiXCIpLGUuYXBwZW5kQ2hpbGQodCksZS5xdWVyeVNlbGVjdG9yQWxsKFwiW25hbWU9JyddXCIpLmxlbmd0aHx8ZC5wdXNoKFwiXFxcXFtcIitnZStcIipuYW1lXCIrZ2UrXCIqPVwiK2dlK1wiKig/OicnfFxcXCJcXFwiKVwiKX0pLGxlLmNzc0hhc3x8ZC5wdXNoKFwiOmhhc1wiKSxkPWQubGVuZ3RoJiZuZXcgUmVnRXhwKGQuam9pbihcInxcIikpLGw9ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gYT0hMCwwO3ZhciBuPSFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBufHwoMSYobj0oZS5vd25lckRvY3VtZW50fHxlKT09KHQub3duZXJEb2N1bWVudHx8dCk/ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KToxKXx8IWxlLnNvcnREZXRhY2hlZCYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKT09PW4/ZT09PVR8fGUub3duZXJEb2N1bWVudD09eWUmJkkuY29udGFpbnMoeWUsZSk/LTE6dD09PVR8fHQub3duZXJEb2N1bWVudD09eWUmJkkuY29udGFpbnMoeWUsdCk/MTpvP3NlLmNhbGwobyxlKS1zZS5jYWxsKG8sdCk6MDo0Jm4/LTE6MSl9KSxUfWZvcihlIGluIEkubWF0Y2hlcz1mdW5jdGlvbihlLHQpe3JldHVybiBJKGUsbnVsbCxudWxsLHQpfSxJLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihlLHQpe2lmKFYoZSksQyYmIWhbdCtcIiBcIl0mJighZHx8IWQudGVzdCh0KSkpdHJ5e3ZhciBuPWkuY2FsbChlLHQpO2lmKG58fGxlLmRpc2Nvbm5lY3RlZE1hdGNofHxlLmRvY3VtZW50JiYxMSE9PWUuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIG59Y2F0Y2goZSl7aCh0LCEwKX1yZXR1cm4gMDxJKHQsVCxudWxsLFtlXSkubGVuZ3RofSxJLmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUub3duZXJEb2N1bWVudHx8ZSkhPVQmJlYoZSksY2UuY29udGFpbnMoZSx0KX0sSS5hdHRyPWZ1bmN0aW9uKGUsdCl7KGUub3duZXJEb2N1bWVudHx8ZSkhPVQmJlYoZSk7dmFyIG49Yi5hdHRySGFuZGxlW3QudG9Mb3dlckNhc2UoKV0scj1uJiZ1ZS5jYWxsKGIuYXR0ckhhbmRsZSx0LnRvTG93ZXJDYXNlKCkpP24oZSx0LCFDKTp2b2lkIDA7cmV0dXJuIHZvaWQgMCE9PXI/cjplLmdldEF0dHJpYnV0ZSh0KX0sSS5lcnJvcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoXCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiBcIitlKX0sY2UudW5pcXVlU29ydD1mdW5jdGlvbihlKXt2YXIgdCxuPVtdLHI9MCxpPTA7aWYoYT0hbGUuc29ydFN0YWJsZSxvPSFsZS5zb3J0U3RhYmxlJiZhZS5jYWxsKGUsMCksZGUuY2FsbChlLGwpLGEpe3doaWxlKHQ9ZVtpKytdKXQ9PT1lW2ldJiYocj1uLnB1c2goaSkpO3doaWxlKHItLSloZS5jYWxsKGUsbltyXSwxKX1yZXR1cm4gbz1udWxsLGV9LGNlLmZuLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soY2UudW5pcXVlU29ydChhZS5hcHBseSh0aGlzKSkpfSwoYj1jZS5leHByPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86RixtYXRjaDpELGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7XCI+XCI6e2RpcjpcInBhcmVudE5vZGVcIixmaXJzdDohMH0sXCIgXCI6e2RpcjpcInBhcmVudE5vZGVcIn0sXCIrXCI6e2RpcjpcInByZXZpb3VzU2libGluZ1wiLGZpcnN0OiEwfSxcIn5cIjp7ZGlyOlwicHJldmlvdXNTaWJsaW5nXCJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS5yZXBsYWNlKE8sUCksZVszXT0oZVszXXx8ZVs0XXx8ZVs1XXx8XCJcIikucmVwbGFjZShPLFApLFwifj1cIj09PWVbMl0mJihlWzNdPVwiIFwiK2VbM10rXCIgXCIpLGUuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS50b0xvd2VyQ2FzZSgpLFwibnRoXCI9PT1lWzFdLnNsaWNlKDAsMyk/KGVbM118fEkuZXJyb3IoZVswXSksZVs0XT0rKGVbNF0/ZVs1XSsoZVs2XXx8MSk6MiooXCJldmVuXCI9PT1lWzNdfHxcIm9kZFwiPT09ZVszXSkpLGVbNV09KyhlWzddK2VbOF18fFwib2RkXCI9PT1lWzNdKSk6ZVszXSYmSS5lcnJvcihlWzBdKSxlfSxQU0VVRE86ZnVuY3Rpb24oZSl7dmFyIHQsbj0hZVs2XSYmZVsyXTtyZXR1cm4gRC5DSElMRC50ZXN0KGVbMF0pP251bGw6KGVbM10/ZVsyXT1lWzRdfHxlWzVdfHxcIlwiOm4mJmoudGVzdChuKSYmKHQ9WShuLCEwKSkmJih0PW4uaW5kZXhPZihcIilcIixuLmxlbmd0aC10KS1uLmxlbmd0aCkmJihlWzBdPWVbMF0uc2xpY2UoMCx0KSxlWzJdPW4uc2xpY2UoMCx0KSksZS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZShPLFApLnRvTG93ZXJDYXNlKCk7cmV0dXJuXCIqXCI9PT1lP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGUpe3JldHVybiBmZShlLHQpfX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9c1tlK1wiIFwiXTtyZXR1cm4gdHx8KHQ9bmV3IFJlZ0V4cChcIihefFwiK2dlK1wiKVwiK2UrXCIoXCIrZ2UrXCJ8JClcIikpJiZzKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdChcInN0cmluZ1wiPT10eXBlb2YgZS5jbGFzc05hbWUmJmUuY2xhc3NOYW1lfHxcInVuZGVmaW5lZFwiIT10eXBlb2YgZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIil8fFwiXCIpfSl9LEFUVFI6ZnVuY3Rpb24obixyLGkpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1JLmF0dHIoZSxuKTtyZXR1cm4gbnVsbD09dD9cIiE9XCI9PT1yOiFyfHwodCs9XCJcIixcIj1cIj09PXI/dD09PWk6XCIhPVwiPT09cj90IT09aTpcIl49XCI9PT1yP2kmJjA9PT10LmluZGV4T2YoaSk6XCIqPVwiPT09cj9pJiYtMTx0LmluZGV4T2YoaSk6XCIkPVwiPT09cj9pJiZ0LnNsaWNlKC1pLmxlbmd0aCk9PT1pOlwifj1cIj09PXI/LTE8KFwiIFwiK3QucmVwbGFjZSh2LFwiIFwiKStcIiBcIikuaW5kZXhPZihpKTpcInw9XCI9PT1yJiYodD09PWl8fHQuc2xpY2UoMCxpLmxlbmd0aCsxKT09PWkrXCItXCIpKX19LENISUxEOmZ1bmN0aW9uKGQsZSx0LGgsZyl7dmFyIHY9XCJudGhcIiE9PWQuc2xpY2UoMCwzKSx5PVwibGFzdFwiIT09ZC5zbGljZSgtNCksbT1cIm9mLXR5cGVcIj09PWU7cmV0dXJuIDE9PT1oJiYwPT09Zz9mdW5jdGlvbihlKXtyZXR1cm4hIWUucGFyZW50Tm9kZX06ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHMsdT12IT09eT9cIm5leHRTaWJsaW5nXCI6XCJwcmV2aW91c1NpYmxpbmdcIixsPWUucGFyZW50Tm9kZSxjPW0mJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxmPSFuJiYhbSxwPSExO2lmKGwpe2lmKHYpe3doaWxlKHUpe289ZTt3aGlsZShvPW9bdV0paWYobT9mZShvLGMpOjE9PT1vLm5vZGVUeXBlKXJldHVybiExO3M9dT1cIm9ubHlcIj09PWQmJiFzJiZcIm5leHRTaWJsaW5nXCJ9cmV0dXJuITB9aWYocz1beT9sLmZpcnN0Q2hpbGQ6bC5sYXN0Q2hpbGRdLHkmJmYpe3A9KGE9KHI9KGk9bFtTXXx8KGxbU109e30pKVtkXXx8W10pWzBdPT09RSYmclsxXSkmJnJbMl0sbz1hJiZsLmNoaWxkTm9kZXNbYV07d2hpbGUobz0rK2EmJm8mJm9bdV18fChwPWE9MCl8fHMucG9wKCkpaWYoMT09PW8ubm9kZVR5cGUmJisrcCYmbz09PWUpe2lbZF09W0UsYSxwXTticmVha319ZWxzZSBpZihmJiYocD1hPShyPShpPWVbU118fChlW1NdPXt9KSlbZF18fFtdKVswXT09PUUmJnJbMV0pLCExPT09cCl3aGlsZShvPSsrYSYmbyYmb1t1XXx8KHA9YT0wKXx8cy5wb3AoKSlpZigobT9mZShvLGMpOjE9PT1vLm5vZGVUeXBlKSYmKytwJiYoZiYmKChpPW9bU118fChvW1NdPXt9KSlbZF09W0UscF0pLG89PT1lKSlicmVhaztyZXR1cm4ocC09Zyk9PT1ofHxwJWg9PTAmJjA8PXAvaH19fSxQU0VVRE86ZnVuY3Rpb24oZSxvKXt2YXIgdCxhPWIucHNldWRvc1tlXXx8Yi5zZXRGaWx0ZXJzW2UudG9Mb3dlckNhc2UoKV18fEkuZXJyb3IoXCJ1bnN1cHBvcnRlZCBwc2V1ZG86IFwiK2UpO3JldHVybiBhW1NdP2Eobyk6MTxhLmxlbmd0aD8odD1bZSxlLFwiXCIsb10sYi5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/RihmdW5jdGlvbihlLHQpe3ZhciBuLHI9YShlLG8pLGk9ci5sZW5ndGg7d2hpbGUoaS0tKWVbbj1zZS5jYWxsKGUscltpXSldPSEodFtuXT1yW2ldKX0pOmZ1bmN0aW9uKGUpe3JldHVybiBhKGUsMCx0KX0pOmF9fSxwc2V1ZG9zOntub3Q6RihmdW5jdGlvbihlKXt2YXIgcj1bXSxpPVtdLHM9bmUoZS5yZXBsYWNlKHZlLFwiJDFcIikpO3JldHVybiBzW1NdP0YoZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz1zKGUsbnVsbCxyLFtdKSxhPWUubGVuZ3RoO3doaWxlKGEtLSkoaT1vW2FdKSYmKGVbYV09ISh0W2FdPWkpKX0pOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gclswXT1lLHMocixudWxsLG4saSksclswXT1udWxsLCFpLnBvcCgpfX0pLGhhczpGKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gMDxJKHQsZSkubGVuZ3RofX0pLGNvbnRhaW5zOkYoZnVuY3Rpb24odCl7cmV0dXJuIHQ9dC5yZXBsYWNlKE8sUCksZnVuY3Rpb24oZSl7cmV0dXJuLTE8KGUudGV4dENvbnRlbnR8fGNlLnRleHQoZSkpLmluZGV4T2YodCl9fSksbGFuZzpGKGZ1bmN0aW9uKG4pe3JldHVybiBBLnRlc3Qobnx8XCJcIil8fEkuZXJyb3IoXCJ1bnN1cHBvcnRlZCBsYW5nOiBcIituKSxuPW4ucmVwbGFjZShPLFApLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oZSl7dmFyIHQ7ZG97aWYodD1DP2UubGFuZzplLmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpfHxlLmdldEF0dHJpYnV0ZShcImxhbmdcIikpcmV0dXJuKHQ9dC50b0xvd2VyQ2FzZSgpKT09PW58fDA9PT10LmluZGV4T2YobitcIi1cIil9d2hpbGUoKGU9ZS5wYXJlbnROb2RlKSYmMT09PWUubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbihlKXt2YXIgdD1pZS5sb2NhdGlvbiYmaWUubG9jYXRpb24uaGFzaDtyZXR1cm4gdCYmdC5zbGljZSgxKT09PWUuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1yfSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBULmFjdGl2ZUVsZW1lbnR9Y2F0Y2goZSl7fX0oKSYmVC5oYXNGb2N1cygpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgpfSxlbmFibGVkOnooITEpLGRpc2FibGVkOnooITApLGNoZWNrZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGZlKGUsXCJpbnB1dFwiKSYmISFlLmNoZWNrZWR8fGZlKGUsXCJvcHRpb25cIikmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT1lLnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIWIucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBxLnRlc3QoZS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBOLnRlc3QoZS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihlKXtyZXR1cm4gZmUoZSxcImlucHV0XCIpJiZcImJ1dHRvblwiPT09ZS50eXBlfHxmZShlLFwiYnV0dG9uXCIpfSx0ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBmZShlLFwiaW5wdXRcIikmJlwidGV4dFwiPT09ZS50eXBlJiYobnVsbD09KHQ9ZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpKXx8XCJ0ZXh0XCI9PT10LnRvTG93ZXJDYXNlKCkpfSxmaXJzdDpYKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpYKGZ1bmN0aW9uKGUsdCl7cmV0dXJuW3QtMV19KSxlcTpYKGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bbjwwP24rdDpuXX0pLGV2ZW46WChmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDpYKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTE7bjx0O24rPTIpZS5wdXNoKG4pO3JldHVybiBlfSksbHQ6WChmdW5jdGlvbihlLHQsbil7dmFyIHI7Zm9yKHI9bjwwP24rdDp0PG4/dDpuOzA8PS0tcjspZS5wdXNoKHIpO3JldHVybiBlfSksZ3Q6WChmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPW48MD9uK3Q6bjsrK3I8dDspZS5wdXNoKHIpO3JldHVybiBlfSl9fSkucHNldWRvcy5udGg9Yi5wc2V1ZG9zLmVxLHtyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSliLnBzZXVkb3NbZV09QihlKTtmb3IoZSBpbntzdWJtaXQ6ITAscmVzZXQ6ITB9KWIucHNldWRvc1tlXT1fKGUpO2Z1bmN0aW9uIEcoKXt9ZnVuY3Rpb24gWShlLHQpe3ZhciBuLHIsaSxvLGEscyx1LGw9Y1tlK1wiIFwiXTtpZihsKXJldHVybiB0PzA6bC5zbGljZSgwKTthPWUscz1bXSx1PWIucHJlRmlsdGVyO3doaWxlKGEpe2ZvcihvIGluIG4mJiEocj15LmV4ZWMoYSkpfHwociYmKGE9YS5zbGljZShyWzBdLmxlbmd0aCl8fGEpLHMucHVzaChpPVtdKSksbj0hMSwocj1tLmV4ZWMoYSkpJiYobj1yLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6clswXS5yZXBsYWNlKHZlLFwiIFwiKX0pLGE9YS5zbGljZShuLmxlbmd0aCkpLGIuZmlsdGVyKSEocj1EW29dLmV4ZWMoYSkpfHx1W29dJiYhKHI9dVtvXShyKSl8fChuPXIuc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTpvLG1hdGNoZXM6cn0pLGE9YS5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiB0P2EubGVuZ3RoOmE/SS5lcnJvcihlKTpjKGUscykuc2xpY2UoMCl9ZnVuY3Rpb24gUShlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoLHI9XCJcIjt0PG47dCsrKXIrPWVbdF0udmFsdWU7cmV0dXJuIHJ9ZnVuY3Rpb24gSihhLGUsdCl7dmFyIHM9ZS5kaXIsdT1lLm5leHQsbD11fHxzLGM9dCYmXCJwYXJlbnROb2RlXCI9PT1sLGY9bisrO3JldHVybiBlLmZpcnN0P2Z1bmN0aW9uKGUsdCxuKXt3aGlsZShlPWVbc10paWYoMT09PWUubm9kZVR5cGV8fGMpcmV0dXJuIGEoZSx0LG4pO3JldHVybiExfTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPVtFLGZdO2lmKG4pe3doaWxlKGU9ZVtzXSlpZigoMT09PWUubm9kZVR5cGV8fGMpJiZhKGUsdCxuKSlyZXR1cm4hMH1lbHNlIHdoaWxlKGU9ZVtzXSlpZigxPT09ZS5ub2RlVHlwZXx8YylpZihpPWVbU118fChlW1NdPXt9KSx1JiZmZShlLHUpKWU9ZVtzXXx8ZTtlbHNle2lmKChyPWlbbF0pJiZyWzBdPT09RSYmclsxXT09PWYpcmV0dXJuIG9bMl09clsyXTtpZigoaVtsXT1vKVsyXT1hKGUsdCxuKSlyZXR1cm4hMH1yZXR1cm4hMX19ZnVuY3Rpb24gSyhpKXtyZXR1cm4gMTxpLmxlbmd0aD9mdW5jdGlvbihlLHQsbil7dmFyIHI9aS5sZW5ndGg7d2hpbGUoci0tKWlmKCFpW3JdKGUsdCxuKSlyZXR1cm4hMTtyZXR1cm4hMH06aVswXX1mdW5jdGlvbiBaKGUsdCxuLHIsaSl7Zm9yKHZhciBvLGE9W10scz0wLHU9ZS5sZW5ndGgsbD1udWxsIT10O3M8dTtzKyspKG89ZVtzXSkmJihuJiYhbihvLHIsaSl8fChhLnB1c2gobyksbCYmdC5wdXNoKHMpKSk7cmV0dXJuIGF9ZnVuY3Rpb24gZWUoZCxoLGcsdix5LGUpe3JldHVybiB2JiYhdltTXSYmKHY9ZWUodikpLHkmJiF5W1NdJiYoeT1lZSh5LGUpKSxGKGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzLHU9W10sbD1bXSxjPXQubGVuZ3RoLGY9ZXx8ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj0wLGk9dC5sZW5ndGg7cjxpO3IrKylJKGUsdFtyXSxuKTtyZXR1cm4gbn0oaHx8XCIqXCIsbi5ub2RlVHlwZT9bbl06bixbXSkscD0hZHx8IWUmJmg/ZjpaKGYsdSxkLG4scik7aWYoZz9nKHAscz15fHwoZT9kOmN8fHYpP1tdOnQsbixyKTpzPXAsdil7aT1aKHMsbCksdihpLFtdLG4sciksbz1pLmxlbmd0aDt3aGlsZShvLS0pKGE9aVtvXSkmJihzW2xbb11dPSEocFtsW29dXT1hKSl9aWYoZSl7aWYoeXx8ZCl7aWYoeSl7aT1bXSxvPXMubGVuZ3RoO3doaWxlKG8tLSkoYT1zW29dKSYmaS5wdXNoKHBbb109YSk7eShudWxsLHM9W10saSxyKX1vPXMubGVuZ3RoO3doaWxlKG8tLSkoYT1zW29dKSYmLTE8KGk9eT9zZS5jYWxsKGUsYSk6dVtvXSkmJihlW2ldPSEodFtpXT1hKSl9fWVsc2Ugcz1aKHM9PT10P3Muc3BsaWNlKGMscy5sZW5ndGgpOnMpLHk/eShudWxsLHQscyxyKTprLmFwcGx5KHQscyl9KX1mdW5jdGlvbiB0ZShlKXtmb3IodmFyIGksdCxuLHI9ZS5sZW5ndGgsbz1iLnJlbGF0aXZlW2VbMF0udHlwZV0sYT1vfHxiLnJlbGF0aXZlW1wiIFwiXSxzPW8/MTowLHU9SihmdW5jdGlvbihlKXtyZXR1cm4gZT09PWl9LGEsITApLGw9SihmdW5jdGlvbihlKXtyZXR1cm4tMTxzZS5jYWxsKGksZSl9LGEsITApLGM9W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj0hbyYmKG58fHQhPXcpfHwoKGk9dCkubm9kZVR5cGU/dShlLHQsbik6bChlLHQsbikpO3JldHVybiBpPW51bGwscn1dO3M8cjtzKyspaWYodD1iLnJlbGF0aXZlW2Vbc10udHlwZV0pYz1bSihLKGMpLHQpXTtlbHNle2lmKCh0PWIuZmlsdGVyW2Vbc10udHlwZV0uYXBwbHkobnVsbCxlW3NdLm1hdGNoZXMpKVtTXSl7Zm9yKG49KytzO248cjtuKyspaWYoYi5yZWxhdGl2ZVtlW25dLnR5cGVdKWJyZWFrO3JldHVybiBlZSgxPHMmJksoYyksMTxzJiZRKGUuc2xpY2UoMCxzLTEpLmNvbmNhdCh7dmFsdWU6XCIgXCI9PT1lW3MtMl0udHlwZT9cIipcIjpcIlwifSkpLnJlcGxhY2UodmUsXCIkMVwiKSx0LHM8biYmdGUoZS5zbGljZShzLG4pKSxuPHImJnRlKGU9ZS5zbGljZShuKSksbjxyJiZRKGUpKX1jLnB1c2godCl9cmV0dXJuIEsoYyl9ZnVuY3Rpb24gbmUoZSx0KXt2YXIgbix2LHksbSx4LHIsaT1bXSxvPVtdLGE9dVtlK1wiIFwiXTtpZighYSl7dHx8KHQ9WShlKSksbj10Lmxlbmd0aDt3aGlsZShuLS0pKGE9dGUodFtuXSkpW1NdP2kucHVzaChhKTpvLnB1c2goYSk7KGE9dShlLCh2PW8sbT0wPCh5PWkpLmxlbmd0aCx4PTA8di5sZW5ndGgscj1mdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscyx1PTAsbD1cIjBcIixjPWUmJltdLGY9W10scD13LGQ9ZXx8eCYmYi5maW5kLlRBRyhcIipcIixpKSxoPUUrPW51bGw9PXA/MTpNYXRoLnJhbmRvbSgpfHwuMSxnPWQubGVuZ3RoO2ZvcihpJiYodz10PT1UfHx0fHxpKTtsIT09ZyYmbnVsbCE9KG89ZFtsXSk7bCsrKXtpZih4JiZvKXthPTAsdHx8by5vd25lckRvY3VtZW50PT1UfHwoVihvKSxuPSFDKTt3aGlsZShzPXZbYSsrXSlpZihzKG8sdHx8VCxuKSl7ay5jYWxsKHIsbyk7YnJlYWt9aSYmKEU9aCl9bSYmKChvPSFzJiZvKSYmdS0tLGUmJmMucHVzaChvKSl9aWYodSs9bCxtJiZsIT09dSl7YT0wO3doaWxlKHM9eVthKytdKXMoYyxmLHQsbik7aWYoZSl7aWYoMDx1KXdoaWxlKGwtLSljW2xdfHxmW2xdfHwoZltsXT1wZS5jYWxsKHIpKTtmPVooZil9ay5hcHBseShyLGYpLGkmJiFlJiYwPGYubGVuZ3RoJiYxPHUreS5sZW5ndGgmJmNlLnVuaXF1ZVNvcnQocil9cmV0dXJuIGkmJihFPWgsdz1wKSxjfSxtP0Yocik6cikpKS5zZWxlY3Rvcj1lfXJldHVybiBhfWZ1bmN0aW9uIHJlKGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD1cImZ1bmN0aW9uXCI9PXR5cGVvZiBlJiZlLGM9IXImJlkoZT1sLnNlbGVjdG9yfHxlKTtpZihuPW58fFtdLDE9PT1jLmxlbmd0aCl7aWYoMjwobz1jWzBdPWNbMF0uc2xpY2UoMCkpLmxlbmd0aCYmXCJJRFwiPT09KGE9b1swXSkudHlwZSYmOT09PXQubm9kZVR5cGUmJkMmJmIucmVsYXRpdmVbb1sxXS50eXBlXSl7aWYoISh0PShiLmZpbmQuSUQoYS5tYXRjaGVzWzBdLnJlcGxhY2UoTyxQKSx0KXx8W10pWzBdKSlyZXR1cm4gbjtsJiYodD10LnBhcmVudE5vZGUpLGU9ZS5zbGljZShvLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1pPUQubmVlZHNDb250ZXh0LnRlc3QoZSk/MDpvLmxlbmd0aDt3aGlsZShpLS0pe2lmKGE9b1tpXSxiLnJlbGF0aXZlW3M9YS50eXBlXSlicmVhaztpZigodT1iLmZpbmRbc10pJiYocj11KGEubWF0Y2hlc1swXS5yZXBsYWNlKE8sUCksSC50ZXN0KG9bMF0udHlwZSkmJlUodC5wYXJlbnROb2RlKXx8dCkpKXtpZihvLnNwbGljZShpLDEpLCEoZT1yLmxlbmd0aCYmUShvKSkpcmV0dXJuIGsuYXBwbHkobixyKSxuO2JyZWFrfX19cmV0dXJuKGx8fG5lKGUsYykpKHIsdCwhQyxuLCF0fHxILnRlc3QoZSkmJlUodC5wYXJlbnROb2RlKXx8dCksbn1HLnByb3RvdHlwZT1iLmZpbHRlcnM9Yi5wc2V1ZG9zLGIuc2V0RmlsdGVycz1uZXcgRyxsZS5zb3J0U3RhYmxlPVMuc3BsaXQoXCJcIikuc29ydChsKS5qb2luKFwiXCIpPT09UyxWKCksbGUuc29ydERldGFjaGVkPSQoZnVuY3Rpb24oZSl7cmV0dXJuIDEmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihULmNyZWF0ZUVsZW1lbnQoXCJmaWVsZHNldFwiKSl9KSxjZS5maW5kPUksY2UuZXhwcltcIjpcIl09Y2UuZXhwci5wc2V1ZG9zLGNlLnVuaXF1ZT1jZS51bmlxdWVTb3J0LEkuY29tcGlsZT1uZSxJLnNlbGVjdD1yZSxJLnNldERvY3VtZW50PVYsSS50b2tlbml6ZT1ZLEkuZXNjYXBlPWNlLmVzY2FwZVNlbGVjdG9yLEkuZ2V0VGV4dD1jZS50ZXh0LEkuaXNYTUw9Y2UuaXNYTUxEb2MsSS5zZWxlY3RvcnM9Y2UuZXhwcixJLnN1cHBvcnQ9Y2Uuc3VwcG9ydCxJLnVuaXF1ZVNvcnQ9Y2UudW5pcXVlU29ydH0oKTt2YXIgZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9W10saT12b2lkIDAhPT1uO3doaWxlKChlPWVbdF0pJiY5IT09ZS5ub2RlVHlwZSlpZigxPT09ZS5ub2RlVHlwZSl7aWYoaSYmY2UoZSkuaXMobikpYnJlYWs7ci5wdXNoKGUpfXJldHVybiByfSxoPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtdO2U7ZT1lLm5leHRTaWJsaW5nKTE9PT1lLm5vZGVUeXBlJiZlIT09dCYmbi5wdXNoKGUpO3JldHVybiBufSxiPWNlLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LHc9L148KFthLXpdW15cXC9cXDA+OlxceDIwXFx0XFxyXFxuXFxmXSopW1xceDIwXFx0XFxyXFxuXFxmXSpcXC8/Pig/OjxcXC9cXDE+fCkkL2k7ZnVuY3Rpb24gVChlLG4scil7cmV0dXJuIHYobik/Y2UuZ3JlcChlLGZ1bmN0aW9uKGUsdCl7cmV0dXJuISFuLmNhbGwoZSx0LGUpIT09cn0pOm4ubm9kZVR5cGU/Y2UuZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09biE9PXJ9KTpcInN0cmluZ1wiIT10eXBlb2Ygbj9jZS5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuLTE8c2UuY2FsbChuLGUpIT09cn0pOmNlLmZpbHRlcihuLGUscil9Y2UuZmlsdGVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10WzBdO3JldHVybiBuJiYoZT1cIjpub3QoXCIrZStcIilcIiksMT09PXQubGVuZ3RoJiYxPT09ci5ub2RlVHlwZT9jZS5maW5kLm1hdGNoZXNTZWxlY3RvcihyLGUpP1tyXTpbXTpjZS5maW5kLm1hdGNoZXMoZSxjZS5ncmVwKHQsZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfSkpfSxjZS5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPXRoaXMubGVuZ3RoLGk9dGhpcztpZihcInN0cmluZ1wiIT10eXBlb2YgZSlyZXR1cm4gdGhpcy5wdXNoU3RhY2soY2UoZSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHQ9MDt0PHI7dCsrKWlmKGNlLmNvbnRhaW5zKGlbdF0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKG49dGhpcy5wdXNoU3RhY2soW10pLHQ9MDt0PHI7dCsrKWNlLmZpbmQoZSxpW3RdLG4pO3JldHVybiAxPHI/Y2UudW5pcXVlU29ydChuKTpufSxmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFQodGhpcyxlfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFQodGhpcyxlfHxbXSwhMCkpfSxpczpmdW5jdGlvbihlKXtyZXR1cm4hIVQodGhpcyxcInN0cmluZ1wiPT10eXBlb2YgZSYmYi50ZXN0KGUpP2NlKGUpOmV8fFtdLCExKS5sZW5ndGh9fSk7dmFyIGssUz0vXig/OlxccyooPFtcXHdcXFddKz4pW14+XSp8IyhbXFx3LV0rKSkkLzsoY2UuZm4uaW5pdD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaTtpZighZSlyZXR1cm4gdGhpcztpZihuPW58fGssXCJzdHJpbmdcIj09dHlwZW9mIGUpe2lmKCEocj1cIjxcIj09PWVbMF0mJlwiPlwiPT09ZVtlLmxlbmd0aC0xXSYmMzw9ZS5sZW5ndGg/W251bGwsZSxudWxsXTpTLmV4ZWMoZSkpfHwhclsxXSYmdClyZXR1cm4hdHx8dC5qcXVlcnk/KHR8fG4pLmZpbmQoZSk6dGhpcy5jb25zdHJ1Y3Rvcih0KS5maW5kKGUpO2lmKHJbMV0pe2lmKHQ9dCBpbnN0YW5jZW9mIGNlP3RbMF06dCxjZS5tZXJnZSh0aGlzLGNlLnBhcnNlSFRNTChyWzFdLHQmJnQubm9kZVR5cGU/dC5vd25lckRvY3VtZW50fHx0OkMsITApKSx3LnRlc3QoclsxXSkmJmNlLmlzUGxhaW5PYmplY3QodCkpZm9yKHIgaW4gdCl2KHRoaXNbcl0pP3RoaXNbcl0odFtyXSk6dGhpcy5hdHRyKHIsdFtyXSk7cmV0dXJuIHRoaXN9cmV0dXJuKGk9Qy5nZXRFbGVtZW50QnlJZChyWzJdKSkmJih0aGlzWzBdPWksdGhpcy5sZW5ndGg9MSksdGhpc31yZXR1cm4gZS5ub2RlVHlwZT8odGhpc1swXT1lLHRoaXMubGVuZ3RoPTEsdGhpcyk6dihlKT92b2lkIDAhPT1uLnJlYWR5P24ucmVhZHkoZSk6ZShjZSk6Y2UubWFrZUFycmF5KGUsdGhpcyl9KS5wcm90b3R5cGU9Y2UuZm4saz1jZShDKTt2YXIgRT0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxqPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2Z1bmN0aW9uIEEoZSx0KXt3aGlsZSgoZT1lW3RdKSYmMSE9PWUubm9kZVR5cGUpO3JldHVybiBlfWNlLmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKGUpe3ZhciB0PWNlKGUsdGhpcyksbj10Lmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPG47ZSsrKWlmKGNlLmNvbnRhaW5zKHRoaXMsdFtlXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXRoaXMubGVuZ3RoLG89W10sYT1cInN0cmluZ1wiIT10eXBlb2YgZSYmY2UoZSk7aWYoIWIudGVzdChlKSlmb3IoO3I8aTtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT8tMTxhLmluZGV4KG4pOjE9PT1uLm5vZGVUeXBlJiZjZS5maW5kLm1hdGNoZXNTZWxlY3RvcihuLGUpKSl7by5wdXNoKG4pO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjaygxPG8ubGVuZ3RoP2NlLnVuaXF1ZVNvcnQobyk6byl9LGluZGV4OmZ1bmN0aW9uKGUpe3JldHVybiBlP1wic3RyaW5nXCI9PXR5cGVvZiBlP3NlLmNhbGwoY2UoZSksdGhpc1swXSk6c2UuY2FsbCh0aGlzLGUuanF1ZXJ5P2VbMF06ZSk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soY2UudW5pcXVlU29ydChjZS5tZXJnZSh0aGlzLmdldCgpLGNlKGUsdCkpKSl9LGFkZEJhY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWU/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoZSkpfX0pLGNlLmVhY2goe3BhcmVudDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJjExIT09dC5ub2RlVHlwZT90Om51bGx9LHBhcmVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIGQoZSxcInBhcmVudE5vZGVcIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGQoZSxcInBhcmVudE5vZGVcIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gQShlLFwibmV4dFNpYmxpbmdcIil9LHByZXY6ZnVuY3Rpb24oZSl7cmV0dXJuIEEoZSxcInByZXZpb3VzU2libGluZ1wiKX0sbmV4dEFsbDpmdW5jdGlvbihlKXtyZXR1cm4gZChlLFwibmV4dFNpYmxpbmdcIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIGQoZSxcInByZXZpb3VzU2libGluZ1wiKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZChlLFwibmV4dFNpYmxpbmdcIixuKX0scHJldlVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZChlLFwicHJldmlvdXNTaWJsaW5nXCIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiBoKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4gaChlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZS5jb250ZW50RG9jdW1lbnQmJnIoZS5jb250ZW50RG9jdW1lbnQpP2UuY29udGVudERvY3VtZW50OihmZShlLFwidGVtcGxhdGVcIikmJihlPWUuY29udGVudHx8ZSksY2UubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9fSxmdW5jdGlvbihyLGkpe2NlLmZuW3JdPWZ1bmN0aW9uKGUsdCl7dmFyIG49Y2UubWFwKHRoaXMsaSxlKTtyZXR1cm5cIlVudGlsXCIhPT1yLnNsaWNlKC01KSYmKHQ9ZSksdCYmXCJzdHJpbmdcIj09dHlwZW9mIHQmJihuPWNlLmZpbHRlcih0LG4pKSwxPHRoaXMubGVuZ3RoJiYoaltyXXx8Y2UudW5pcXVlU29ydChuKSxFLnRlc3QocikmJm4ucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhuKX19KTt2YXIgRD0vW15cXHgyMFxcdFxcclxcblxcZl0rL2c7ZnVuY3Rpb24gTihlKXtyZXR1cm4gZX1mdW5jdGlvbiBxKGUpe3Rocm93IGV9ZnVuY3Rpb24gTChlLHQsbixyKXt2YXIgaTt0cnl7ZSYmdihpPWUucHJvbWlzZSk/aS5jYWxsKGUpLmRvbmUodCkuZmFpbChuKTplJiZ2KGk9ZS50aGVuKT9pLmNhbGwoZSx0LG4pOnQuYXBwbHkodm9pZCAwLFtlXS5zbGljZShyKSl9Y2F0Y2goZSl7bi5hcHBseSh2b2lkIDAsW2VdKX19Y2UuQ2FsbGJhY2tzPWZ1bmN0aW9uKHIpe3ZhciBlLG47cj1cInN0cmluZ1wiPT10eXBlb2Ygcj8oZT1yLG49e30sY2UuZWFjaChlLm1hdGNoKEQpfHxbXSxmdW5jdGlvbihlLHQpe25bdF09ITB9KSxuKTpjZS5leHRlbmQoe30scik7dmFyIGksdCxvLGEscz1bXSx1PVtdLGw9LTEsYz1mdW5jdGlvbigpe2ZvcihhPWF8fHIub25jZSxvPWk9ITA7dS5sZW5ndGg7bD0tMSl7dD11LnNoaWZ0KCk7d2hpbGUoKytsPHMubGVuZ3RoKSExPT09c1tsXS5hcHBseSh0WzBdLHRbMV0pJiZyLnN0b3BPbkZhbHNlJiYobD1zLmxlbmd0aCx0PSExKX1yLm1lbW9yeXx8KHQ9ITEpLGk9ITEsYSYmKHM9dD9bXTpcIlwiKX0sZj17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIHMmJih0JiYhaSYmKGw9cy5sZW5ndGgtMSx1LnB1c2godCkpLGZ1bmN0aW9uIG4oZSl7Y2UuZWFjaChlLGZ1bmN0aW9uKGUsdCl7dih0KT9yLnVuaXF1ZSYmZi5oYXModCl8fHMucHVzaCh0KTp0JiZ0Lmxlbmd0aCYmXCJzdHJpbmdcIiE9PXgodCkmJm4odCl9KX0oYXJndW1lbnRzKSx0JiYhaSYmYygpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gY2UuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSx0KXt2YXIgbjt3aGlsZSgtMTwobj1jZS5pbkFycmF5KHQscyxuKSkpcy5zcGxpY2UobiwxKSxuPD1sJiZsLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/LTE8Y2UuaW5BcnJheShlLHMpOjA8cy5sZW5ndGh9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHMmJihzPVtdKSx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGE9dT1bXSxzPXQ9XCJcIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFzfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGE9dT1bXSx0fHxpfHwocz10PVwiXCIpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiEhYX0sZmlyZVdpdGg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYXx8KHQ9W2UsKHQ9dHx8W10pLnNsaWNlP3Quc2xpY2UoKTp0XSx1LnB1c2godCksaXx8YygpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGYuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFvfX07cmV0dXJuIGZ9LGNlLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oZSl7dmFyIG89W1tcIm5vdGlmeVwiLFwicHJvZ3Jlc3NcIixjZS5DYWxsYmFja3MoXCJtZW1vcnlcIiksY2UuQ2FsbGJhY2tzKFwibWVtb3J5XCIpLDJdLFtcInJlc29sdmVcIixcImRvbmVcIixjZS5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKSxjZS5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKSwwLFwicmVzb2x2ZWRcIl0sW1wicmVqZWN0XCIsXCJmYWlsXCIsY2UuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIiksY2UuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIiksMSxcInJlamVjdGVkXCJdXSxpPVwicGVuZGluZ1wiLGE9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGl9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBzLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sXCJjYXRjaFwiOmZ1bmN0aW9uKGUpe3JldHVybiBhLnRoZW4obnVsbCxlKX0scGlwZTpmdW5jdGlvbigpe3ZhciBpPWFyZ3VtZW50cztyZXR1cm4gY2UuRGVmZXJyZWQoZnVuY3Rpb24ocil7Y2UuZWFjaChvLGZ1bmN0aW9uKGUsdCl7dmFyIG49dihpW3RbNF1dKSYmaVt0WzRdXTtzW3RbMV1dKGZ1bmN0aW9uKCl7dmFyIGU9biYmbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZSYmdihlLnByb21pc2UpP2UucHJvbWlzZSgpLnByb2dyZXNzKHIubm90aWZ5KS5kb25lKHIucmVzb2x2ZSkuZmFpbChyLnJlamVjdCk6clt0WzBdK1wiV2l0aFwiXSh0aGlzLG4/W2VdOmFyZ3VtZW50cyl9KX0pLGk9bnVsbH0pLnByb21pc2UoKX0sdGhlbjpmdW5jdGlvbih0LG4scil7dmFyIHU9MDtmdW5jdGlvbiBsKGksbyxhLHMpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMscj1hcmd1bWVudHMsZT1mdW5jdGlvbigpe3ZhciBlLHQ7aWYoIShpPHUpKXtpZigoZT1hLmFwcGx5KG4scikpPT09by5wcm9taXNlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvblwiKTt0PWUmJihcIm9iamVjdFwiPT10eXBlb2YgZXx8XCJmdW5jdGlvblwiPT10eXBlb2YgZSkmJmUudGhlbix2KHQpP3M/dC5jYWxsKGUsbCh1LG8sTixzKSxsKHUsbyxxLHMpKToodSsrLHQuY2FsbChlLGwodSxvLE4scyksbCh1LG8scSxzKSxsKHUsbyxOLG8ubm90aWZ5V2l0aCkpKTooYSE9PU4mJihuPXZvaWQgMCxyPVtlXSksKHN8fG8ucmVzb2x2ZVdpdGgpKG4scikpfX0sdD1zP2U6ZnVuY3Rpb24oKXt0cnl7ZSgpfWNhdGNoKGUpe2NlLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJmNlLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soZSx0LmVycm9yKSx1PD1pKzEmJihhIT09cSYmKG49dm9pZCAwLHI9W2VdKSxvLnJlamVjdFdpdGgobixyKSl9fTtpP3QoKTooY2UuRGVmZXJyZWQuZ2V0RXJyb3JIb29rP3QuZXJyb3I9Y2UuRGVmZXJyZWQuZ2V0RXJyb3JIb29rKCk6Y2UuRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYodC5lcnJvcj1jZS5EZWZlcnJlZC5nZXRTdGFja0hvb2soKSksaWUuc2V0VGltZW91dCh0KSl9fXJldHVybiBjZS5EZWZlcnJlZChmdW5jdGlvbihlKXtvWzBdWzNdLmFkZChsKDAsZSx2KHIpP3I6TixlLm5vdGlmeVdpdGgpKSxvWzFdWzNdLmFkZChsKDAsZSx2KHQpP3Q6TikpLG9bMl1bM10uYWRkKGwoMCxlLHYobik/bjpxKSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWU/Y2UuZXh0ZW5kKGUsYSk6YX19LHM9e307cmV0dXJuIGNlLmVhY2gobyxmdW5jdGlvbihlLHQpe3ZhciBuPXRbMl0scj10WzVdO2FbdFsxXV09bi5hZGQsciYmbi5hZGQoZnVuY3Rpb24oKXtpPXJ9LG9bMy1lXVsyXS5kaXNhYmxlLG9bMy1lXVszXS5kaXNhYmxlLG9bMF1bMl0ubG9jayxvWzBdWzNdLmxvY2spLG4uYWRkKHRbM10uZmlyZSksc1t0WzBdXT1mdW5jdGlvbigpe3JldHVybiBzW3RbMF0rXCJXaXRoXCJdKHRoaXM9PT1zP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30sc1t0WzBdK1wiV2l0aFwiXT1uLmZpcmVXaXRofSksYS5wcm9taXNlKHMpLGUmJmUuY2FsbChzLHMpLHN9LHdoZW46ZnVuY3Rpb24oZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCx0PW4scj1BcnJheSh0KSxpPWFlLmNhbGwoYXJndW1lbnRzKSxvPWNlLkRlZmVycmVkKCksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7clt0XT10aGlzLGlbdF09MTxhcmd1bWVudHMubGVuZ3RoP2FlLmNhbGwoYXJndW1lbnRzKTplLC0tbnx8by5yZXNvbHZlV2l0aChyLGkpfX07aWYobjw9MSYmKEwoZSxvLmRvbmUoYSh0KSkucmVzb2x2ZSxvLnJlamVjdCwhbiksXCJwZW5kaW5nXCI9PT1vLnN0YXRlKCl8fHYoaVt0XSYmaVt0XS50aGVuKSkpcmV0dXJuIG8udGhlbigpO3doaWxlKHQtLSlMKGlbdF0sYSh0KSxvLnJlamVjdCk7cmV0dXJuIG8ucHJvbWlzZSgpfX0pO3ZhciBIPS9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO2NlLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2s9ZnVuY3Rpb24oZSx0KXtpZS5jb25zb2xlJiZpZS5jb25zb2xlLndhcm4mJmUmJkgudGVzdChlLm5hbWUpJiZpZS5jb25zb2xlLndhcm4oXCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiBcIitlLm1lc3NhZ2UsZS5zdGFjayx0KX0sY2UucmVhZHlFeGNlcHRpb249ZnVuY3Rpb24oZSl7aWUuc2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IGV9KX07dmFyIE89Y2UuRGVmZXJyZWQoKTtmdW5jdGlvbiBQKCl7Qy5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLFApLGllLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsUCksY2UucmVhZHkoKX1jZS5mbi5yZWFkeT1mdW5jdGlvbihlKXtyZXR1cm4gTy50aGVuKGUpW1wiY2F0Y2hcIl0oZnVuY3Rpb24oZSl7Y2UucmVhZHlFeGNlcHRpb24oZSl9KSx0aGlzfSxjZS5leHRlbmQoe2lzUmVhZHk6ITEscmVhZHlXYWl0OjEscmVhZHk6ZnVuY3Rpb24oZSl7KCEwPT09ZT8tLWNlLnJlYWR5V2FpdDpjZS5pc1JlYWR5KXx8KGNlLmlzUmVhZHk9ITApIT09ZSYmMDwtLWNlLnJlYWR5V2FpdHx8Ty5yZXNvbHZlV2l0aChDLFtjZV0pfX0pLGNlLnJlYWR5LnRoZW49Ty50aGVuLFwiY29tcGxldGVcIj09PUMucmVhZHlTdGF0ZXx8XCJsb2FkaW5nXCIhPT1DLnJlYWR5U3RhdGUmJiFDLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbD9pZS5zZXRUaW1lb3V0KGNlLnJlYWR5KTooQy5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLFApLGllLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsUCkpO3ZhciBNPWZ1bmN0aW9uKGUsdCxuLHIsaSxvLGEpe3ZhciBzPTAsdT1lLmxlbmd0aCxsPW51bGw9PW47aWYoXCJvYmplY3RcIj09PXgobikpZm9yKHMgaW4gaT0hMCxuKU0oZSx0LHMsbltzXSwhMCxvLGEpO2Vsc2UgaWYodm9pZCAwIT09ciYmKGk9ITAsdihyKXx8KGE9ITApLGwmJihhPyh0LmNhbGwoZSxyKSx0PW51bGwpOihsPXQsdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGwuY2FsbChjZShlKSxuKX0pKSx0KSlmb3IoO3M8dTtzKyspdChlW3NdLG4sYT9yOnIuY2FsbChlW3NdLHMsdChlW3NdLG4pKSk7cmV0dXJuIGk/ZTpsP3QuY2FsbChlKTp1P3QoZVswXSxuKTpvfSxSPS9eLW1zLS8sST0vLShbYS16XSkvZztmdW5jdGlvbiBXKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKX1mdW5jdGlvbiBGKGUpe3JldHVybiBlLnJlcGxhY2UoUixcIm1zLVwiKS5yZXBsYWNlKEksVyl9dmFyICQ9ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfHw5PT09ZS5ub2RlVHlwZXx8IStlLm5vZGVUeXBlfTtmdW5jdGlvbiBCKCl7dGhpcy5leHBhbmRvPWNlLmV4cGFuZG8rQi51aWQrK31CLnVpZD0xLEIucHJvdG90eXBlPXtjYWNoZTpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMuZXhwYW5kb107cmV0dXJuIHR8fCh0PXt9LCQoZSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT10Ok9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHRoaXMuZXhwYW5kbyx7dmFsdWU6dCxjb25maWd1cmFibGU6ITB9KSkpLHR9LHNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT10aGlzLmNhY2hlKGUpO2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KWlbRih0KV09bjtlbHNlIGZvcihyIGluIHQpaVtGKHIpXT10W3JdO3JldHVybiBpfSxnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD90aGlzLmNhY2hlKGUpOmVbdGhpcy5leHBhbmRvXSYmZVt0aGlzLmV4cGFuZG9dW0YodCldfSxhY2Nlc3M6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT10fHx0JiZcInN0cmluZ1wiPT10eXBlb2YgdCYmdm9pZCAwPT09bj90aGlzLmdldChlLHQpOih0aGlzLnNldChlLHQsbiksdm9pZCAwIT09bj9uOnQpfSxyZW1vdmU6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWVbdGhpcy5leHBhbmRvXTtpZih2b2lkIDAhPT1yKXtpZih2b2lkIDAhPT10KXtuPSh0PUFycmF5LmlzQXJyYXkodCk/dC5tYXAoRik6KHQ9Rih0KSlpbiByP1t0XTp0Lm1hdGNoKEQpfHxbXSkubGVuZ3RoO3doaWxlKG4tLSlkZWxldGUgclt0W25dXX0odm9pZCAwPT09dHx8Y2UuaXNFbXB0eU9iamVjdChyKSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIGVbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09dCYmIWNlLmlzRW1wdHlPYmplY3QodCl9fTt2YXIgXz1uZXcgQix6PW5ldyBCLFg9L14oPzpcXHtbXFx3XFxXXSpcXH18XFxbW1xcd1xcV10qXFxdKSQvLFU9L1tBLVpdL2c7ZnVuY3Rpb24gVihlLHQsbil7dmFyIHIsaTtpZih2b2lkIDA9PT1uJiYxPT09ZS5ub2RlVHlwZSlpZihyPVwiZGF0YS1cIit0LnJlcGxhY2UoVSxcIi0kJlwiKS50b0xvd2VyQ2FzZSgpLFwic3RyaW5nXCI9PXR5cGVvZihuPWUuZ2V0QXR0cmlidXRlKHIpKSl7dHJ5e249XCJ0cnVlXCI9PT0oaT1uKXx8XCJmYWxzZVwiIT09aSYmKFwibnVsbFwiPT09aT9udWxsOmk9PT0raStcIlwiPytpOlgudGVzdChpKT9KU09OLnBhcnNlKGkpOmkpfWNhdGNoKGUpe316LnNldChlLHQsbil9ZWxzZSBuPXZvaWQgMDtyZXR1cm4gbn1jZS5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIHouaGFzRGF0YShlKXx8Xy5oYXNEYXRhKGUpfSxkYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gei5hY2Nlc3MoZSx0LG4pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7ei5yZW1vdmUoZSx0KX0sX2RhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBfLmFjY2VzcyhlLHQsbil9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7Xy5yZW1vdmUoZSx0KX19KSxjZS5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24obixlKXt2YXIgdCxyLGksbz10aGlzWzBdLGE9byYmby5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PW4pe2lmKHRoaXMubGVuZ3RoJiYoaT16LmdldChvKSwxPT09by5ub2RlVHlwZSYmIV8uZ2V0KG8sXCJoYXNEYXRhQXR0cnNcIikpKXt0PWEubGVuZ3RoO3doaWxlKHQtLSlhW3RdJiYwPT09KHI9YVt0XS5uYW1lKS5pbmRleE9mKFwiZGF0YS1cIikmJihyPUYoci5zbGljZSg1KSksVihvLHIsaVtyXSkpO18uc2V0KG8sXCJoYXNEYXRhQXR0cnNcIiwhMCl9cmV0dXJuIGl9cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIG4/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7ei5zZXQodGhpcyxuKX0pOk0odGhpcyxmdW5jdGlvbihlKXt2YXIgdDtpZihvJiZ2b2lkIDA9PT1lKXJldHVybiB2b2lkIDAhPT0odD16LmdldChvLG4pKT90OnZvaWQgMCE9PSh0PVYobyxuKSk/dDp2b2lkIDA7dGhpcy5lYWNoKGZ1bmN0aW9uKCl7ei5zZXQodGhpcyxuLGUpfSl9LG51bGwsZSwxPGFyZ3VtZW50cy5sZW5ndGgsbnVsbCwhMCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3oucmVtb3ZlKHRoaXMsZSl9KX19KSxjZS5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZihlKXJldHVybiB0PSh0fHxcImZ4XCIpK1wicXVldWVcIixyPV8uZ2V0KGUsdCksbiYmKCFyfHxBcnJheS5pc0FycmF5KG4pP3I9Xy5hY2Nlc3MoZSx0LGNlLm1ha2VBcnJheShuKSk6ci5wdXNoKG4pKSxyfHxbXX0sZGVxdWV1ZTpmdW5jdGlvbihlLHQpe3Q9dHx8XCJmeFwiO3ZhciBuPWNlLnF1ZXVlKGUsdCkscj1uLmxlbmd0aCxpPW4uc2hpZnQoKSxvPWNlLl9xdWV1ZUhvb2tzKGUsdCk7XCJpbnByb2dyZXNzXCI9PT1pJiYoaT1uLnNoaWZ0KCksci0tKSxpJiYoXCJmeFwiPT09dCYmbi51bnNoaWZ0KFwiaW5wcm9ncmVzc1wiKSxkZWxldGUgby5zdG9wLGkuY2FsbChlLGZ1bmN0aW9uKCl7Y2UuZGVxdWV1ZShlLHQpfSxvKSksIXImJm8mJm8uZW1wdHkuZmlyZSgpfSxfcXVldWVIb29rczpmdW5jdGlvbihlLHQpe3ZhciBuPXQrXCJxdWV1ZUhvb2tzXCI7cmV0dXJuIF8uZ2V0KGUsbil8fF8uYWNjZXNzKGUsbix7ZW1wdHk6Y2UuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIikuYWRkKGZ1bmN0aW9uKCl7Xy5yZW1vdmUoZSxbdCtcInF1ZXVlXCIsbl0pfSl9KX19KSxjZS5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKHQsbil7dmFyIGU9MjtyZXR1cm5cInN0cmluZ1wiIT10eXBlb2YgdCYmKG49dCx0PVwiZnhcIixlLS0pLGFyZ3VtZW50cy5sZW5ndGg8ZT9jZS5xdWV1ZSh0aGlzWzBdLHQpOnZvaWQgMD09PW4/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1jZS5xdWV1ZSh0aGlzLHQsbik7Y2UuX3F1ZXVlSG9va3ModGhpcyx0KSxcImZ4XCI9PT10JiZcImlucHJvZ3Jlc3NcIiE9PWVbMF0mJmNlLmRlcXVldWUodGhpcyx0KX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjZS5kZXF1ZXVlKHRoaXMsZSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5xdWV1ZShlfHxcImZ4XCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0xLGk9Y2UuRGVmZXJyZWQoKSxvPXRoaXMsYT10aGlzLmxlbmd0aCxzPWZ1bmN0aW9uKCl7LS1yfHxpLnJlc29sdmVXaXRoKG8sW29dKX07XCJzdHJpbmdcIiE9dHlwZW9mIGUmJih0PWUsZT12b2lkIDApLGU9ZXx8XCJmeFwiO3doaWxlKGEtLSkobj1fLmdldChvW2FdLGUrXCJxdWV1ZUhvb2tzXCIpKSYmbi5lbXB0eSYmKHIrKyxuLmVtcHR5LmFkZChzKSk7cmV0dXJuIHMoKSxpLnByb21pc2UodCl9fSk7dmFyIEc9L1srLV0/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bKy1dP1xcZCt8KS8uc291cmNlLFk9bmV3IFJlZ0V4cChcIl4oPzooWystXSk9fCkoXCIrRytcIikoW2EteiVdKikkXCIsXCJpXCIpLFE9W1wiVG9wXCIsXCJSaWdodFwiLFwiQm90dG9tXCIsXCJMZWZ0XCJdLEo9Qy5kb2N1bWVudEVsZW1lbnQsSz1mdW5jdGlvbihlKXtyZXR1cm4gY2UuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfSxaPXtjb21wb3NlZDohMH07Si5nZXRSb290Tm9kZSYmKEs9ZnVuY3Rpb24oZSl7cmV0dXJuIGNlLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKXx8ZS5nZXRSb290Tm9kZShaKT09PWUub3duZXJEb2N1bWVudH0pO3ZhciBlZT1mdW5jdGlvbihlLHQpe3JldHVyblwibm9uZVwiPT09KGU9dHx8ZSkuc3R5bGUuZGlzcGxheXx8XCJcIj09PWUuc3R5bGUuZGlzcGxheSYmSyhlKSYmXCJub25lXCI9PT1jZS5jc3MoZSxcImRpc3BsYXlcIil9O2Z1bmN0aW9uIHRlKGUsdCxuLHIpe3ZhciBpLG8sYT0yMCxzPXI/ZnVuY3Rpb24oKXtyZXR1cm4gci5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gY2UuY3NzKGUsdCxcIlwiKX0sdT1zKCksbD1uJiZuWzNdfHwoY2UuY3NzTnVtYmVyW3RdP1wiXCI6XCJweFwiKSxjPWUubm9kZVR5cGUmJihjZS5jc3NOdW1iZXJbdF18fFwicHhcIiE9PWwmJit1KSYmWS5leGVjKGNlLmNzcyhlLHQpKTtpZihjJiZjWzNdIT09bCl7dS89MixsPWx8fGNbM10sYz0rdXx8MTt3aGlsZShhLS0pY2Uuc3R5bGUoZSx0LGMrbCksKDEtbykqKDEtKG89cygpL3V8fC41KSk8PTAmJihhPTApLGMvPW87Yyo9MixjZS5zdHlsZShlLHQsYytsKSxuPW58fFtdfXJldHVybiBuJiYoYz0rY3x8K3V8fDAsaT1uWzFdP2MrKG5bMV0rMSkqblsyXTorblsyXSxyJiYoci51bml0PWwsci5zdGFydD1jLHIuZW5kPWkpKSxpfXZhciBuZT17fTtmdW5jdGlvbiByZShlLHQpe2Zvcih2YXIgbixyLGksbyxhLHMsdSxsPVtdLGM9MCxmPWUubGVuZ3RoO2M8ZjtjKyspKHI9ZVtjXSkuc3R5bGUmJihuPXIuc3R5bGUuZGlzcGxheSx0PyhcIm5vbmVcIj09PW4mJihsW2NdPV8uZ2V0KHIsXCJkaXNwbGF5XCIpfHxudWxsLGxbY118fChyLnN0eWxlLmRpc3BsYXk9XCJcIikpLFwiXCI9PT1yLnN0eWxlLmRpc3BsYXkmJmVlKHIpJiYobFtjXT0odT1hPW89dm9pZCAwLGE9KGk9cikub3duZXJEb2N1bWVudCxzPWkubm9kZU5hbWUsKHU9bmVbc10pfHwobz1hLmJvZHkuYXBwZW5kQ2hpbGQoYS5jcmVhdGVFbGVtZW50KHMpKSx1PWNlLmNzcyhvLFwiZGlzcGxheVwiKSxvLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobyksXCJub25lXCI9PT11JiYodT1cImJsb2NrXCIpLG5lW3NdPXUpKSkpOlwibm9uZVwiIT09biYmKGxbY109XCJub25lXCIsXy5zZXQocixcImRpc3BsYXlcIixuKSkpO2ZvcihjPTA7YzxmO2MrKyludWxsIT1sW2NdJiYoZVtjXS5zdHlsZS5kaXNwbGF5PWxbY10pO3JldHVybiBlfWNlLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbigpe3JldHVybiByZSh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiByZSh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGUpe3JldHVyblwiYm9vbGVhblwiPT10eXBlb2YgZT9lP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe2VlKHRoaXMpP2NlKHRoaXMpLnNob3coKTpjZSh0aGlzKS5oaWRlKCl9KX19KTt2YXIgeGUsYmUsd2U9L14oPzpjaGVja2JveHxyYWRpbykkL2ksVGU9LzwoW2Etel1bXlxcL1xcMD5cXHgyMFxcdFxcclxcblxcZl0qKS9pLENlPS9eJHxebW9kdWxlJHxcXC8oPzpqYXZhfGVjbWEpc2NyaXB0L2k7eGU9Qy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkuYXBwZW5kQ2hpbGQoQy5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKSwoYmU9Qy5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIikpLnNldEF0dHJpYnV0ZShcInR5cGVcIixcInJhZGlvXCIpLGJlLnNldEF0dHJpYnV0ZShcImNoZWNrZWRcIixcImNoZWNrZWRcIiksYmUuc2V0QXR0cmlidXRlKFwibmFtZVwiLFwidFwiKSx4ZS5hcHBlbmRDaGlsZChiZSksbGUuY2hlY2tDbG9uZT14ZS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQseGUuaW5uZXJIVE1MPVwiPHRleHRhcmVhPng8L3RleHRhcmVhPlwiLGxlLm5vQ2xvbmVDaGVja2VkPSEheGUuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlLHhlLmlubmVySFRNTD1cIjxvcHRpb24+PC9vcHRpb24+XCIsbGUub3B0aW9uPSEheGUubGFzdENoaWxkO3ZhciBrZT17dGhlYWQ6WzEsXCI8dGFibGU+XCIsXCI8L3RhYmxlPlwiXSxjb2w6WzIsXCI8dGFibGU+PGNvbGdyb3VwPlwiLFwiPC9jb2xncm91cD48L3RhYmxlPlwiXSx0cjpbMixcIjx0YWJsZT48dGJvZHk+XCIsXCI8L3Rib2R5PjwvdGFibGU+XCJdLHRkOlszLFwiPHRhYmxlPjx0Ym9keT48dHI+XCIsXCI8L3RyPjwvdGJvZHk+PC90YWJsZT5cIl0sX2RlZmF1bHQ6WzAsXCJcIixcIlwiXX07ZnVuY3Rpb24gU2UoZSx0KXt2YXIgbjtyZXR1cm4gbj1cInVuZGVmaW5lZFwiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHR8fFwiKlwiKTpcInVuZGVmaW5lZFwiIT10eXBlb2YgZS5xdWVyeVNlbGVjdG9yQWxsP2UucXVlcnlTZWxlY3RvckFsbCh0fHxcIipcIik6W10sdm9pZCAwPT09dHx8dCYmZmUoZSx0KT9jZS5tZXJnZShbZV0sbik6bn1mdW5jdGlvbiBFZShlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylfLnNldChlW25dLFwiZ2xvYmFsRXZhbFwiLCF0fHxfLmdldCh0W25dLFwiZ2xvYmFsRXZhbFwiKSl9a2UudGJvZHk9a2UudGZvb3Q9a2UuY29sZ3JvdXA9a2UuY2FwdGlvbj1rZS50aGVhZCxrZS50aD1rZS50ZCxsZS5vcHRpb258fChrZS5vcHRncm91cD1rZS5vcHRpb249WzEsXCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+XCIsXCI8L3NlbGVjdD5cIl0pO3ZhciBqZT0vPHwmIz9cXHcrOy87ZnVuY3Rpb24gQWUoZSx0LG4scixpKXtmb3IodmFyIG8sYSxzLHUsbCxjLGY9dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkscD1bXSxkPTAsaD1lLmxlbmd0aDtkPGg7ZCsrKWlmKChvPWVbZF0pfHwwPT09bylpZihcIm9iamVjdFwiPT09eChvKSljZS5tZXJnZShwLG8ubm9kZVR5cGU/W29dOm8pO2Vsc2UgaWYoamUudGVzdChvKSl7YT1hfHxmLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudChcImRpdlwiKSkscz0oVGUuZXhlYyhvKXx8W1wiXCIsXCJcIl0pWzFdLnRvTG93ZXJDYXNlKCksdT1rZVtzXXx8a2UuX2RlZmF1bHQsYS5pbm5lckhUTUw9dVsxXStjZS5odG1sUHJlZmlsdGVyKG8pK3VbMl0sYz11WzBdO3doaWxlKGMtLSlhPWEubGFzdENoaWxkO2NlLm1lcmdlKHAsYS5jaGlsZE5vZGVzKSwoYT1mLmZpcnN0Q2hpbGQpLnRleHRDb250ZW50PVwiXCJ9ZWxzZSBwLnB1c2godC5jcmVhdGVUZXh0Tm9kZShvKSk7Zi50ZXh0Q29udGVudD1cIlwiLGQ9MDt3aGlsZShvPXBbZCsrXSlpZihyJiYtMTxjZS5pbkFycmF5KG8scikpaSYmaS5wdXNoKG8pO2Vsc2UgaWYobD1LKG8pLGE9U2UoZi5hcHBlbmRDaGlsZChvKSxcInNjcmlwdFwiKSxsJiZFZShhKSxuKXtjPTA7d2hpbGUobz1hW2MrK10pQ2UudGVzdChvLnR5cGV8fFwiXCIpJiZuLnB1c2gobyl9cmV0dXJuIGZ9dmFyIERlPS9eKFteLl0qKSg/OlxcLiguKyl8KS87ZnVuY3Rpb24gTmUoKXtyZXR1cm4hMH1mdW5jdGlvbiBxZSgpe3JldHVybiExfWZ1bmN0aW9uIExlKGUsdCxuLHIsaSxvKXt2YXIgYSxzO2lmKFwib2JqZWN0XCI9PXR5cGVvZiB0KXtmb3IocyBpblwic3RyaW5nXCIhPXR5cGVvZiBuJiYocj1yfHxuLG49dm9pZCAwKSx0KUxlKGUscyxuLHIsdFtzXSxvKTtyZXR1cm4gZX1pZihudWxsPT1yJiZudWxsPT1pPyhpPW4scj1uPXZvaWQgMCk6bnVsbD09aSYmKFwic3RyaW5nXCI9PXR5cGVvZiBuPyhpPXIscj12b2lkIDApOihpPXIscj1uLG49dm9pZCAwKSksITE9PT1pKWk9cWU7ZWxzZSBpZighaSlyZXR1cm4gZTtyZXR1cm4gMT09PW8mJihhPWksKGk9ZnVuY3Rpb24oZSl7cmV0dXJuIGNlKCkub2ZmKGUpLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfSkuZ3VpZD1hLmd1aWR8fChhLmd1aWQ9Y2UuZ3VpZCsrKSksZS5lYWNoKGZ1bmN0aW9uKCl7Y2UuZXZlbnQuYWRkKHRoaXMsdCxpLHIsbil9KX1mdW5jdGlvbiBIZShlLHIsdCl7dD8oXy5zZXQoZSxyLCExKSxjZS5ldmVudC5hZGQoZSxyLHtuYW1lc3BhY2U6ITEsaGFuZGxlcjpmdW5jdGlvbihlKXt2YXIgdCxuPV8uZ2V0KHRoaXMscik7aWYoMSZlLmlzVHJpZ2dlciYmdGhpc1tyXSl7aWYobikoY2UuZXZlbnQuc3BlY2lhbFtyXXx8e30pLmRlbGVnYXRlVHlwZSYmZS5zdG9wUHJvcGFnYXRpb24oKTtlbHNlIGlmKG49YWUuY2FsbChhcmd1bWVudHMpLF8uc2V0KHRoaXMscixuKSx0aGlzW3JdKCksdD1fLmdldCh0aGlzLHIpLF8uc2V0KHRoaXMsciwhMSksbiE9PXQpcmV0dXJuIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksZS5wcmV2ZW50RGVmYXVsdCgpLHR9ZWxzZSBuJiYoXy5zZXQodGhpcyxyLGNlLmV2ZW50LnRyaWdnZXIoblswXSxuLnNsaWNlKDEpLHRoaXMpKSxlLnN0b3BQcm9wYWdhdGlvbigpLGUuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9TmUpfX0pKTp2b2lkIDA9PT1fLmdldChlLHIpJiZjZS5ldmVudC5hZGQoZSxyLE5lKX1jZS5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvLGEscyx1LGwsYyxmLHAsZCxoLGcsdj1fLmdldCh0KTtpZigkKHQpKXtuLmhhbmRsZXImJihuPShvPW4pLmhhbmRsZXIsaT1vLnNlbGVjdG9yKSxpJiZjZS5maW5kLm1hdGNoZXNTZWxlY3RvcihKLGkpLG4uZ3VpZHx8KG4uZ3VpZD1jZS5ndWlkKyspLCh1PXYuZXZlbnRzKXx8KHU9di5ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSksKGE9di5oYW5kbGUpfHwoYT12LmhhbmRsZT1mdW5jdGlvbihlKXtyZXR1cm5cInVuZGVmaW5lZFwiIT10eXBlb2YgY2UmJmNlLmV2ZW50LnRyaWdnZXJlZCE9PWUudHlwZT9jZS5ldmVudC5kaXNwYXRjaC5hcHBseSh0LGFyZ3VtZW50cyk6dm9pZCAwfSksbD0oZT0oZXx8XCJcIikubWF0Y2goRCl8fFtcIlwiXSkubGVuZ3RoO3doaWxlKGwtLSlkPWc9KHM9RGUuZXhlYyhlW2xdKXx8W10pWzFdLGg9KHNbMl18fFwiXCIpLnNwbGl0KFwiLlwiKS5zb3J0KCksZCYmKGY9Y2UuZXZlbnQuc3BlY2lhbFtkXXx8e30sZD0oaT9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8ZCxmPWNlLmV2ZW50LnNwZWNpYWxbZF18fHt9LGM9Y2UuZXh0ZW5kKHt0eXBlOmQsb3JpZ1R5cGU6ZyxkYXRhOnIsaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOmksbmVlZHNDb250ZXh0OmkmJmNlLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoaSksbmFtZXNwYWNlOmguam9pbihcIi5cIil9LG8pLChwPXVbZF0pfHwoKHA9dVtkXT1bXSkuZGVsZWdhdGVDb3VudD0wLGYuc2V0dXAmJiExIT09Zi5zZXR1cC5jYWxsKHQscixoLGEpfHx0LmFkZEV2ZW50TGlzdGVuZXImJnQuYWRkRXZlbnRMaXN0ZW5lcihkLGEpKSxmLmFkZCYmKGYuYWRkLmNhbGwodCxjKSxjLmhhbmRsZXIuZ3VpZHx8KGMuaGFuZGxlci5ndWlkPW4uZ3VpZCkpLGk/cC5zcGxpY2UocC5kZWxlZ2F0ZUNvdW50KyssMCxjKTpwLnB1c2goYyksY2UuZXZlbnQuZ2xvYmFsW2RdPSEwKX19LHJlbW92ZTpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscyx1LGwsYyxmLHAsZCxoLGcsdj1fLmhhc0RhdGEoZSkmJl8uZ2V0KGUpO2lmKHYmJih1PXYuZXZlbnRzKSl7bD0odD0odHx8XCJcIikubWF0Y2goRCl8fFtcIlwiXSkubGVuZ3RoO3doaWxlKGwtLSlpZihkPWc9KHM9RGUuZXhlYyh0W2xdKXx8W10pWzFdLGg9KHNbMl18fFwiXCIpLnNwbGl0KFwiLlwiKS5zb3J0KCksZCl7Zj1jZS5ldmVudC5zcGVjaWFsW2RdfHx7fSxwPXVbZD0ocj9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8ZF18fFtdLHM9c1syXSYmbmV3IFJlZ0V4cChcIihefFxcXFwuKVwiK2guam9pbihcIlxcXFwuKD86LipcXFxcLnwpXCIpK1wiKFxcXFwufCQpXCIpLGE9bz1wLmxlbmd0aDt3aGlsZShvLS0pYz1wW29dLCFpJiZnIT09Yy5vcmlnVHlwZXx8biYmbi5ndWlkIT09Yy5ndWlkfHxzJiYhcy50ZXN0KGMubmFtZXNwYWNlKXx8ciYmciE9PWMuc2VsZWN0b3ImJihcIioqXCIhPT1yfHwhYy5zZWxlY3Rvcil8fChwLnNwbGljZShvLDEpLGMuc2VsZWN0b3ImJnAuZGVsZWdhdGVDb3VudC0tLGYucmVtb3ZlJiZmLnJlbW92ZS5jYWxsKGUsYykpO2EmJiFwLmxlbmd0aCYmKGYudGVhcmRvd24mJiExIT09Zi50ZWFyZG93bi5jYWxsKGUsaCx2LmhhbmRsZSl8fGNlLnJlbW92ZUV2ZW50KGUsZCx2LmhhbmRsZSksZGVsZXRlIHVbZF0pfWVsc2UgZm9yKGQgaW4gdSljZS5ldmVudC5yZW1vdmUoZSxkK3RbbF0sbixyLCEwKTtjZS5pc0VtcHR5T2JqZWN0KHUpJiZfLnJlbW92ZShlLFwiaGFuZGxlIGV2ZW50c1wiKX19LGRpc3BhdGNoOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYSxzPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSx1PWNlLmV2ZW50LmZpeChlKSxsPShfLmdldCh0aGlzLFwiZXZlbnRzXCIpfHxPYmplY3QuY3JlYXRlKG51bGwpKVt1LnR5cGVdfHxbXSxjPWNlLmV2ZW50LnNwZWNpYWxbdS50eXBlXXx8e307Zm9yKHNbMF09dSx0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKylzW3RdPWFyZ3VtZW50c1t0XTtpZih1LmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWMucHJlRGlzcGF0Y2h8fCExIT09Yy5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsdSkpe2E9Y2UuZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLHUsbCksdD0wO3doaWxlKChpPWFbdCsrXSkmJiF1LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe3UuY3VycmVudFRhcmdldD1pLmVsZW0sbj0wO3doaWxlKChvPWkuaGFuZGxlcnNbbisrXSkmJiF1LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpdS5ybmFtZXNwYWNlJiYhMSE9PW8ubmFtZXNwYWNlJiYhdS5ybmFtZXNwYWNlLnRlc3Qoby5uYW1lc3BhY2UpfHwodS5oYW5kbGVPYmo9byx1LmRhdGE9by5kYXRhLHZvaWQgMCE9PShyPSgoY2UuZXZlbnQuc3BlY2lhbFtvLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8by5oYW5kbGVyKS5hcHBseShpLmVsZW0scykpJiYhMT09PSh1LnJlc3VsdD1yKSYmKHUucHJldmVudERlZmF1bHQoKSx1LnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGMucG9zdERpc3BhdGNoJiZjLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsdSksdS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscz1bXSx1PXQuZGVsZWdhdGVDb3VudCxsPWUudGFyZ2V0O2lmKHUmJmwubm9kZVR5cGUmJiEoXCJjbGlja1wiPT09ZS50eXBlJiYxPD1lLmJ1dHRvbikpZm9yKDtsIT09dGhpcztsPWwucGFyZW50Tm9kZXx8dGhpcylpZigxPT09bC5ub2RlVHlwZSYmKFwiY2xpY2tcIiE9PWUudHlwZXx8ITAhPT1sLmRpc2FibGVkKSl7Zm9yKG89W10sYT17fSxuPTA7bjx1O24rKyl2b2lkIDA9PT1hW2k9KHI9dFtuXSkuc2VsZWN0b3IrXCIgXCJdJiYoYVtpXT1yLm5lZWRzQ29udGV4dD8tMTxjZShpLHRoaXMpLmluZGV4KGwpOmNlLmZpbmQoaSx0aGlzLG51bGwsW2xdKS5sZW5ndGgpLGFbaV0mJm8ucHVzaChyKTtvLmxlbmd0aCYmcy5wdXNoKHtlbGVtOmwsaGFuZGxlcnM6b30pfXJldHVybiBsPXRoaXMsdTx0Lmxlbmd0aCYmcy5wdXNoKHtlbGVtOmwsaGFuZGxlcnM6dC5zbGljZSh1KX0pLHN9LGFkZFByb3A6ZnVuY3Rpb24odCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoY2UuRXZlbnQucHJvdG90eXBlLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDp2KGUpP2Z1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiBlKHRoaXMub3JpZ2luYWxFdmVudCl9OmZ1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbdF19LHNldDpmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTplfSl9fSl9LGZpeDpmdW5jdGlvbihlKXtyZXR1cm4gZVtjZS5leHBhbmRvXT9lOm5ldyBjZS5FdmVudChlKX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGNsaWNrOntzZXR1cDpmdW5jdGlvbihlKXt2YXIgdD10aGlzfHxlO3JldHVybiB3ZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJmZlKHQsXCJpbnB1dFwiKSYmSGUodCxcImNsaWNrXCIsITApLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXN8fGU7cmV0dXJuIHdlLnRlc3QodC50eXBlKSYmdC5jbGljayYmZmUodCxcImlucHV0XCIpJiZIZSh0LFwiY2xpY2tcIiksITB9LF9kZWZhdWx0OmZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0O3JldHVybiB3ZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJmZlKHQsXCJpbnB1dFwiKSYmXy5nZXQodCxcImNsaWNrXCIpfHxmZSh0LFwiYVwiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUucmVzdWx0JiZlLm9yaWdpbmFsRXZlbnQmJihlLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9ZS5yZXN1bHQpfX19fSxjZS5yZW1vdmVFdmVudD1mdW5jdGlvbihlLHQsbil7ZS5yZW1vdmVFdmVudExpc3RlbmVyJiZlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuKX0sY2UuRXZlbnQ9ZnVuY3Rpb24oZSx0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBjZS5FdmVudCkpcmV0dXJuIG5ldyBjZS5FdmVudChlLHQpO2UmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PWUuZGVmYXVsdFByZXZlbnRlZCYmITE9PT1lLnJldHVyblZhbHVlP05lOnFlLHRoaXMudGFyZ2V0PWUudGFyZ2V0JiYzPT09ZS50YXJnZXQubm9kZVR5cGU/ZS50YXJnZXQucGFyZW50Tm9kZTplLnRhcmdldCx0aGlzLmN1cnJlbnRUYXJnZXQ9ZS5jdXJyZW50VGFyZ2V0LHRoaXMucmVsYXRlZFRhcmdldD1lLnJlbGF0ZWRUYXJnZXQpOnRoaXMudHlwZT1lLHQmJmNlLmV4dGVuZCh0aGlzLHQpLHRoaXMudGltZVN0YW1wPWUmJmUudGltZVN0YW1wfHxEYXRlLm5vdygpLHRoaXNbY2UuZXhwYW5kb109ITB9LGNlLkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6Y2UuRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOnFlLGlzUHJvcGFnYXRpb25TdG9wcGVkOnFlLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOnFlLGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPU5lLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPU5lLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1OZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sY2UuZWFjaCh7YWx0S2V5OiEwLGJ1YmJsZXM6ITAsY2FuY2VsYWJsZTohMCxjaGFuZ2VkVG91Y2hlczohMCxjdHJsS2V5OiEwLGRldGFpbDohMCxldmVudFBoYXNlOiEwLG1ldGFLZXk6ITAscGFnZVg6ITAscGFnZVk6ITAsc2hpZnRLZXk6ITAsdmlldzohMCxcImNoYXJcIjohMCxjb2RlOiEwLGNoYXJDb2RlOiEwLGtleTohMCxrZXlDb2RlOiEwLGJ1dHRvbjohMCxidXR0b25zOiEwLGNsaWVudFg6ITAsY2xpZW50WTohMCxvZmZzZXRYOiEwLG9mZnNldFk6ITAscG9pbnRlcklkOiEwLHBvaW50ZXJUeXBlOiEwLHNjcmVlblg6ITAsc2NyZWVuWTohMCx0YXJnZXRUb3VjaGVzOiEwLHRvRWxlbWVudDohMCx0b3VjaGVzOiEwLHdoaWNoOiEwfSxjZS5ldmVudC5hZGRQcm9wKSxjZS5lYWNoKHtmb2N1czpcImZvY3VzaW5cIixibHVyOlwiZm9jdXNvdXRcIn0sZnVuY3Rpb24ocixpKXtmdW5jdGlvbiBvKGUpe2lmKEMuZG9jdW1lbnRNb2RlKXt2YXIgdD1fLmdldCh0aGlzLFwiaGFuZGxlXCIpLG49Y2UuZXZlbnQuZml4KGUpO24udHlwZT1cImZvY3VzaW5cIj09PWUudHlwZT9cImZvY3VzXCI6XCJibHVyXCIsbi5pc1NpbXVsYXRlZD0hMCx0KGUpLG4udGFyZ2V0PT09bi5jdXJyZW50VGFyZ2V0JiZ0KG4pfWVsc2UgY2UuZXZlbnQuc2ltdWxhdGUoaSxlLnRhcmdldCxjZS5ldmVudC5maXgoZSkpfWNlLmV2ZW50LnNwZWNpYWxbcl09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIGU7aWYoSGUodGhpcyxyLCEwKSwhQy5kb2N1bWVudE1vZGUpcmV0dXJuITE7KGU9Xy5nZXQodGhpcyxpKSl8fHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihpLG8pLF8uc2V0KHRoaXMsaSwoZXx8MCkrMSl9LHRyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gSGUodGhpcyxyKSwhMH0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgZTtpZighQy5kb2N1bWVudE1vZGUpcmV0dXJuITE7KGU9Xy5nZXQodGhpcyxpKS0xKT9fLnNldCh0aGlzLGksZSk6KHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihpLG8pLF8ucmVtb3ZlKHRoaXMsaSkpfSxfZGVmYXVsdDpmdW5jdGlvbihlKXtyZXR1cm4gXy5nZXQoZS50YXJnZXQscil9LGRlbGVnYXRlVHlwZTppfSxjZS5ldmVudC5zcGVjaWFsW2ldPXtzZXR1cDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcy5kb2N1bWVudHx8dGhpcyx0PUMuZG9jdW1lbnRNb2RlP3RoaXM6ZSxuPV8uZ2V0KHQsaSk7bnx8KEMuZG9jdW1lbnRNb2RlP3RoaXMuYWRkRXZlbnRMaXN0ZW5lcihpLG8pOmUuYWRkRXZlbnRMaXN0ZW5lcihyLG8sITApKSxfLnNldCh0LGksKG58fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcy5kb2N1bWVudHx8dGhpcyx0PUMuZG9jdW1lbnRNb2RlP3RoaXM6ZSxuPV8uZ2V0KHQsaSktMTtuP18uc2V0KHQsaSxuKTooQy5kb2N1bWVudE1vZGU/dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGksbyk6ZS5yZW1vdmVFdmVudExpc3RlbmVyKHIsbywhMCksXy5yZW1vdmUodCxpKSl9fX0pLGNlLmVhY2goe21vdXNlZW50ZXI6XCJtb3VzZW92ZXJcIixtb3VzZWxlYXZlOlwibW91c2VvdXRcIixwb2ludGVyZW50ZXI6XCJwb2ludGVyb3ZlclwiLHBvaW50ZXJsZWF2ZTpcInBvaW50ZXJvdXRcIn0sZnVuY3Rpb24oZSxpKXtjZS5ldmVudC5zcGVjaWFsW2VdPXtkZWxlZ2F0ZVR5cGU6aSxiaW5kVHlwZTppLGhhbmRsZTpmdW5jdGlvbihlKXt2YXIgdCxuPWUucmVsYXRlZFRhcmdldCxyPWUuaGFuZGxlT2JqO3JldHVybiBuJiYobj09PXRoaXN8fGNlLmNvbnRhaW5zKHRoaXMsbikpfHwoZS50eXBlPXIub3JpZ1R5cGUsdD1yLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT1pKSx0fX19KSxjZS5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBMZSh0aGlzLGUsdCxuLHIpfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIExlKHRoaXMsZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiByPWUuaGFuZGxlT2JqLGNlKGUuZGVsZWdhdGVUYXJnZXQpLm9mZihyLm5hbWVzcGFjZT9yLm9yaWdUeXBlK1wiLlwiK3IubmFtZXNwYWNlOnIub3JpZ1R5cGUsci5zZWxlY3RvcixyLmhhbmRsZXIpLHRoaXM7aWYoXCJvYmplY3RcIj09dHlwZW9mIGUpe2ZvcihpIGluIGUpdGhpcy5vZmYoaSx0LGVbaV0pO3JldHVybiB0aGlzfXJldHVybiExIT09dCYmXCJmdW5jdGlvblwiIT10eXBlb2YgdHx8KG49dCx0PXZvaWQgMCksITE9PT1uJiYobj1xZSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Y2UuZXZlbnQucmVtb3ZlKHRoaXMsZSxuLHQpfSl9fSk7dmFyIE9lPS88c2NyaXB0fDxzdHlsZXw8bGluay9pLFBlPS9jaGVja2VkXFxzKig/OltePV18PVxccyouY2hlY2tlZC4pL2ksTWU9L15cXHMqPCFcXFtDREFUQVxcW3xcXF1cXF0+XFxzKiQvZztmdW5jdGlvbiBSZShlLHQpe3JldHVybiBmZShlLFwidGFibGVcIikmJmZlKDExIT09dC5ub2RlVHlwZT90OnQuZmlyc3RDaGlsZCxcInRyXCIpJiZjZShlKS5jaGlsZHJlbihcInRib2R5XCIpWzBdfHxlfWZ1bmN0aW9uIEllKGUpe3JldHVybiBlLnR5cGU9KG51bGwhPT1lLmdldEF0dHJpYnV0ZShcInR5cGVcIikpK1wiL1wiK2UudHlwZSxlfWZ1bmN0aW9uIFdlKGUpe3JldHVyblwidHJ1ZS9cIj09PShlLnR5cGV8fFwiXCIpLnNsaWNlKDAsNSk/ZS50eXBlPWUudHlwZS5zbGljZSg1KTplLnJlbW92ZUF0dHJpYnV0ZShcInR5cGVcIiksZX1mdW5jdGlvbiBGZShlLHQpe3ZhciBuLHIsaSxvLGEscztpZigxPT09dC5ub2RlVHlwZSl7aWYoXy5oYXNEYXRhKGUpJiYocz1fLmdldChlKS5ldmVudHMpKWZvcihpIGluIF8ucmVtb3ZlKHQsXCJoYW5kbGUgZXZlbnRzXCIpLHMpZm9yKG49MCxyPXNbaV0ubGVuZ3RoO248cjtuKyspY2UuZXZlbnQuYWRkKHQsaSxzW2ldW25dKTt6Lmhhc0RhdGEoZSkmJihvPXouYWNjZXNzKGUpLGE9Y2UuZXh0ZW5kKHt9LG8pLHouc2V0KHQsYSkpfX1mdW5jdGlvbiAkZShuLHIsaSxvKXtyPWcocik7dmFyIGUsdCxhLHMsdSxsLGM9MCxmPW4ubGVuZ3RoLHA9Zi0xLGQ9clswXSxoPXYoZCk7aWYoaHx8MTxmJiZcInN0cmluZ1wiPT10eXBlb2YgZCYmIWxlLmNoZWNrQ2xvbmUmJlBlLnRlc3QoZCkpcmV0dXJuIG4uZWFjaChmdW5jdGlvbihlKXt2YXIgdD1uLmVxKGUpO2gmJihyWzBdPWQuY2FsbCh0aGlzLGUsdC5odG1sKCkpKSwkZSh0LHIsaSxvKX0pO2lmKGYmJih0PShlPUFlKHIsblswXS5vd25lckRvY3VtZW50LCExLG4sbykpLmZpcnN0Q2hpbGQsMT09PWUuY2hpbGROb2Rlcy5sZW5ndGgmJihlPXQpLHR8fG8pKXtmb3Iocz0oYT1jZS5tYXAoU2UoZSxcInNjcmlwdFwiKSxJZSkpLmxlbmd0aDtjPGY7YysrKXU9ZSxjIT09cCYmKHU9Y2UuY2xvbmUodSwhMCwhMCkscyYmY2UubWVyZ2UoYSxTZSh1LFwic2NyaXB0XCIpKSksaS5jYWxsKG5bY10sdSxjKTtpZihzKWZvcihsPWFbYS5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxjZS5tYXAoYSxXZSksYz0wO2M8cztjKyspdT1hW2NdLENlLnRlc3QodS50eXBlfHxcIlwiKSYmIV8uYWNjZXNzKHUsXCJnbG9iYWxFdmFsXCIpJiZjZS5jb250YWlucyhsLHUpJiYodS5zcmMmJlwibW9kdWxlXCIhPT0odS50eXBlfHxcIlwiKS50b0xvd2VyQ2FzZSgpP2NlLl9ldmFsVXJsJiYhdS5ub01vZHVsZSYmY2UuX2V2YWxVcmwodS5zcmMse25vbmNlOnUubm9uY2V8fHUuZ2V0QXR0cmlidXRlKFwibm9uY2VcIil9LGwpOm0odS50ZXh0Q29udGVudC5yZXBsYWNlKE1lLFwiXCIpLHUsbCkpfXJldHVybiBufWZ1bmN0aW9uIEJlKGUsdCxuKXtmb3IodmFyIHIsaT10P2NlLmZpbHRlcih0LGUpOmUsbz0wO251bGwhPShyPWlbb10pO28rKylufHwxIT09ci5ub2RlVHlwZXx8Y2UuY2xlYW5EYXRhKFNlKHIpKSxyLnBhcmVudE5vZGUmJihuJiZLKHIpJiZFZShTZShyLFwic2NyaXB0XCIpKSxyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpO3JldHVybiBlfWNlLmV4dGVuZCh7aHRtbFByZWZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sY2xvbmU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHMsdSxsLGM9ZS5jbG9uZU5vZGUoITApLGY9SyhlKTtpZighKGxlLm5vQ2xvbmVDaGVja2VkfHwxIT09ZS5ub2RlVHlwZSYmMTEhPT1lLm5vZGVUeXBlfHxjZS5pc1hNTERvYyhlKSkpZm9yKGE9U2UoYykscj0wLGk9KG89U2UoZSkpLmxlbmd0aDtyPGk7cisrKXM9b1tyXSx1PWFbcl0sdm9pZCAwLFwiaW5wdXRcIj09PShsPXUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkmJndlLnRlc3Qocy50eXBlKT91LmNoZWNrZWQ9cy5jaGVja2VkOlwiaW5wdXRcIiE9PWwmJlwidGV4dGFyZWFcIiE9PWx8fCh1LmRlZmF1bHRWYWx1ZT1zLmRlZmF1bHRWYWx1ZSk7aWYodClpZihuKWZvcihvPW98fFNlKGUpLGE9YXx8U2UoYykscj0wLGk9by5sZW5ndGg7cjxpO3IrKylGZShvW3JdLGFbcl0pO2Vsc2UgRmUoZSxjKTtyZXR1cm4gMDwoYT1TZShjLFwic2NyaXB0XCIpKS5sZW5ndGgmJkVlKGEsIWYmJlNlKGUsXCJzY3JpcHRcIikpLGN9LGNsZWFuRGF0YTpmdW5jdGlvbihlKXtmb3IodmFyIHQsbixyLGk9Y2UuZXZlbnQuc3BlY2lhbCxvPTA7dm9pZCAwIT09KG49ZVtvXSk7bysrKWlmKCQobikpe2lmKHQ9bltfLmV4cGFuZG9dKXtpZih0LmV2ZW50cylmb3IociBpbiB0LmV2ZW50cylpW3JdP2NlLmV2ZW50LnJlbW92ZShuLHIpOmNlLnJlbW92ZUV2ZW50KG4scix0LmhhbmRsZSk7bltfLmV4cGFuZG9dPXZvaWQgMH1uW3ouZXhwYW5kb10mJihuW3ouZXhwYW5kb109dm9pZCAwKX19fSksY2UuZm4uZXh0ZW5kKHtkZXRhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIEJlKHRoaXMsZSwhMCl9LHJlbW92ZTpmdW5jdGlvbihlKXtyZXR1cm4gQmUodGhpcyxlKX0sdGV4dDpmdW5jdGlvbihlKXtyZXR1cm4gTSh0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP2NlLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9ZSl9KX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gJGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fFJlKHRoaXMsZSkuYXBwZW5kQ2hpbGQoZSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiAkZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIHQ9UmUodGhpcyxlKTt0Lmluc2VydEJlZm9yZShlLHQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiAkZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiAkZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PTA7bnVsbCE9KGU9dGhpc1t0XSk7dCsrKTE9PT1lLm5vZGVUeXBlJiYoY2UuY2xlYW5EYXRhKFNlKGUsITEpKSxlLnRleHRDb250ZW50PVwiXCIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGwhPWUmJmUsdD1udWxsPT10P2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBjZS5jbG9uZSh0aGlzLGUsdCl9KX0saHRtbDpmdW5jdGlvbihlKXtyZXR1cm4gTSh0aGlzLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXNbMF18fHt9LG49MCxyPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWUmJjE9PT10Lm5vZGVUeXBlKXJldHVybiB0LmlubmVySFRNTDtpZihcInN0cmluZ1wiPT10eXBlb2YgZSYmIU9lLnRlc3QoZSkmJiFrZVsoVGUuZXhlYyhlKXx8W1wiXCIsXCJcIl0pWzFdLnRvTG93ZXJDYXNlKCldKXtlPWNlLmh0bWxQcmVmaWx0ZXIoZSk7dHJ5e2Zvcig7bjxyO24rKykxPT09KHQ9dGhpc1tuXXx8e30pLm5vZGVUeXBlJiYoY2UuY2xlYW5EYXRhKFNlKHQsITEpKSx0LmlubmVySFRNTD1lKTt0PTB9Y2F0Y2goZSl7fX10JiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGUpfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIG49W107cmV0dXJuICRlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTtjZS5pbkFycmF5KHRoaXMsbik8MCYmKGNlLmNsZWFuRGF0YShTZSh0aGlzKSksdCYmdC5yZXBsYWNlQ2hpbGQoZSx0aGlzKSl9LG4pfX0pLGNlLmVhY2goe2FwcGVuZFRvOlwiYXBwZW5kXCIscHJlcGVuZFRvOlwicHJlcGVuZFwiLGluc2VydEJlZm9yZTpcImJlZm9yZVwiLGluc2VydEFmdGVyOlwiYWZ0ZXJcIixyZXBsYWNlQWxsOlwicmVwbGFjZVdpdGhcIn0sZnVuY3Rpb24oZSxhKXtjZS5mbltlXT1mdW5jdGlvbihlKXtmb3IodmFyIHQsbj1bXSxyPWNlKGUpLGk9ci5sZW5ndGgtMSxvPTA7bzw9aTtvKyspdD1vPT09aT90aGlzOnRoaXMuY2xvbmUoITApLGNlKHJbb10pW2FdKHQpLHMuYXBwbHkobix0LmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobil9fSk7dmFyIF9lPW5ldyBSZWdFeHAoXCJeKFwiK0crXCIpKD8hcHgpW2EteiVdKyRcIixcImlcIiksemU9L14tLS8sWGU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiB0JiZ0Lm9wZW5lcnx8KHQ9aWUpLHQuZ2V0Q29tcHV0ZWRTdHlsZShlKX0sVWU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz17fTtmb3IoaSBpbiB0KW9baV09ZS5zdHlsZVtpXSxlLnN0eWxlW2ldPXRbaV07Zm9yKGkgaW4gcj1uLmNhbGwoZSksdCllLnN0eWxlW2ldPW9baV07cmV0dXJuIHJ9LFZlPW5ldyBSZWdFeHAoUS5qb2luKFwifFwiKSxcImlcIik7ZnVuY3Rpb24gR2UoZSx0LG4pe3ZhciByLGksbyxhLHM9emUudGVzdCh0KSx1PWUuc3R5bGU7cmV0dXJuKG49bnx8WGUoZSkpJiYoYT1uLmdldFByb3BlcnR5VmFsdWUodCl8fG5bdF0scyYmYSYmKGE9YS5yZXBsYWNlKHZlLFwiJDFcIil8fHZvaWQgMCksXCJcIiE9PWF8fEsoZSl8fChhPWNlLnN0eWxlKGUsdCkpLCFsZS5waXhlbEJveFN0eWxlcygpJiZfZS50ZXN0KGEpJiZWZS50ZXN0KHQpJiYocj11LndpZHRoLGk9dS5taW5XaWR0aCxvPXUubWF4V2lkdGgsdS5taW5XaWR0aD11Lm1heFdpZHRoPXUud2lkdGg9YSxhPW4ud2lkdGgsdS53aWR0aD1yLHUubWluV2lkdGg9aSx1Lm1heFdpZHRoPW8pKSx2b2lkIDAhPT1hP2ErXCJcIjphfWZ1bmN0aW9uIFllKGUsdCl7cmV0dXJue2dldDpmdW5jdGlvbigpe2lmKCFlKCkpcmV0dXJuKHRoaXMuZ2V0PXQpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkZWxldGUgdGhpcy5nZXR9fX0hZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7aWYobCl7dS5zdHlsZS5jc3NUZXh0PVwicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O21hcmdpbi10b3A6MXB4O3BhZGRpbmc6MDtib3JkZXI6MFwiLGwuc3R5bGUuY3NzVGV4dD1cInBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OnNjcm9sbDttYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjYwJTt0b3A6MSVcIixKLmFwcGVuZENoaWxkKHUpLmFwcGVuZENoaWxkKGwpO3ZhciBlPWllLmdldENvbXB1dGVkU3R5bGUobCk7bj1cIjElXCIhPT1lLnRvcCxzPTEyPT09dChlLm1hcmdpbkxlZnQpLGwuc3R5bGUucmlnaHQ9XCI2MCVcIixvPTM2PT09dChlLnJpZ2h0KSxyPTM2PT09dChlLndpZHRoKSxsLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIixpPTEyPT09dChsLm9mZnNldFdpZHRoLzMpLEoucmVtb3ZlQ2hpbGQodSksbD1udWxsfX1mdW5jdGlvbiB0KGUpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZSkpfXZhciBuLHIsaSxvLGEscyx1PUMuY3JlYXRlRWxlbWVudChcImRpdlwiKSxsPUMuY3JlYXRlRWxlbWVudChcImRpdlwiKTtsLnN0eWxlJiYobC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD1cImNvbnRlbnQtYm94XCIsbC5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPVwiXCIsbGUuY2xlYXJDbG9uZVN0eWxlPVwiY29udGVudC1ib3hcIj09PWwuc3R5bGUuYmFja2dyb3VuZENsaXAsY2UuZXh0ZW5kKGxlLHtib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiBlKCkscn0scGl4ZWxCb3hTdHlsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLG99LHBpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLG59LHJlbGlhYmxlTWFyZ2luTGVmdDpmdW5jdGlvbigpe3JldHVybiBlKCksc30sc2Nyb2xsYm94U2l6ZTpmdW5jdGlvbigpe3JldHVybiBlKCksaX0scmVsaWFibGVUckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXt2YXIgZSx0LG4scjtyZXR1cm4gbnVsbD09YSYmKGU9Qy5jcmVhdGVFbGVtZW50KFwidGFibGVcIiksdD1DLmNyZWF0ZUVsZW1lbnQoXCJ0clwiKSxuPUMuY3JlYXRlRWxlbWVudChcImRpdlwiKSxlLnN0eWxlLmNzc1RleHQ9XCJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O2JvcmRlci1jb2xsYXBzZTpzZXBhcmF0ZVwiLHQuc3R5bGUuY3NzVGV4dD1cImJveC1zaXppbmc6Y29udGVudC1ib3g7Ym9yZGVyOjFweCBzb2xpZFwiLHQuc3R5bGUuaGVpZ2h0PVwiMXB4XCIsbi5zdHlsZS5oZWlnaHQ9XCI5cHhcIixuLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiLEouYXBwZW5kQ2hpbGQoZSkuYXBwZW5kQ2hpbGQodCkuYXBwZW5kQ2hpbGQobikscj1pZS5nZXRDb21wdXRlZFN0eWxlKHQpLGE9cGFyc2VJbnQoci5oZWlnaHQsMTApK3BhcnNlSW50KHIuYm9yZGVyVG9wV2lkdGgsMTApK3BhcnNlSW50KHIuYm9yZGVyQm90dG9tV2lkdGgsMTApPT09dC5vZmZzZXRIZWlnaHQsSi5yZW1vdmVDaGlsZChlKSksYX19KSl9KCk7dmFyIFFlPVtcIldlYmtpdFwiLFwiTW96XCIsXCJtc1wiXSxKZT1DLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikuc3R5bGUsS2U9e307ZnVuY3Rpb24gWmUoZSl7dmFyIHQ9Y2UuY3NzUHJvcHNbZV18fEtlW2VdO3JldHVybiB0fHwoZSBpbiBKZT9lOktlW2VdPWZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpLG49UWUubGVuZ3RoO3doaWxlKG4tLSlpZigoZT1RZVtuXSt0KWluIEplKXJldHVybiBlfShlKXx8ZSl9dmFyIGV0PS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyx0dD17cG9zaXRpb246XCJhYnNvbHV0ZVwiLHZpc2liaWxpdHk6XCJoaWRkZW5cIixkaXNwbGF5OlwiYmxvY2tcIn0sbnQ9e2xldHRlclNwYWNpbmc6XCIwXCIsZm9udFdlaWdodDpcIjQwMFwifTtmdW5jdGlvbiBydChlLHQsbil7dmFyIHI9WS5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsyXS0obnx8MCkpKyhyWzNdfHxcInB4XCIpOnR9ZnVuY3Rpb24gaXQoZSx0LG4scixpLG8pe3ZhciBhPVwid2lkdGhcIj09PXQ/MTowLHM9MCx1PTAsbD0wO2lmKG49PT0ocj9cImJvcmRlclwiOlwiY29udGVudFwiKSlyZXR1cm4gMDtmb3IoO2E8NDthKz0yKVwibWFyZ2luXCI9PT1uJiYobCs9Y2UuY3NzKGUsbitRW2FdLCEwLGkpKSxyPyhcImNvbnRlbnRcIj09PW4mJih1LT1jZS5jc3MoZSxcInBhZGRpbmdcIitRW2FdLCEwLGkpKSxcIm1hcmdpblwiIT09biYmKHUtPWNlLmNzcyhlLFwiYm9yZGVyXCIrUVthXStcIldpZHRoXCIsITAsaSkpKToodSs9Y2UuY3NzKGUsXCJwYWRkaW5nXCIrUVthXSwhMCxpKSxcInBhZGRpbmdcIiE9PW4/dSs9Y2UuY3NzKGUsXCJib3JkZXJcIitRW2FdK1wiV2lkdGhcIiwhMCxpKTpzKz1jZS5jc3MoZSxcImJvcmRlclwiK1FbYV0rXCJXaWR0aFwiLCEwLGkpKTtyZXR1cm4hciYmMDw9byYmKHUrPU1hdGgubWF4KDAsTWF0aC5jZWlsKGVbXCJvZmZzZXRcIit0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKV0tby11LXMtLjUpKXx8MCksdStsfWZ1bmN0aW9uIG90KGUsdCxuKXt2YXIgcj1YZShlKSxpPSghbGUuYm94U2l6aW5nUmVsaWFibGUoKXx8bikmJlwiYm9yZGVyLWJveFwiPT09Y2UuY3NzKGUsXCJib3hTaXppbmdcIiwhMSxyKSxvPWksYT1HZShlLHQscikscz1cIm9mZnNldFwiK3RbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2lmKF9lLnRlc3QoYSkpe2lmKCFuKXJldHVybiBhO2E9XCJhdXRvXCJ9cmV0dXJuKCFsZS5ib3hTaXppbmdSZWxpYWJsZSgpJiZpfHwhbGUucmVsaWFibGVUckRpbWVuc2lvbnMoKSYmZmUoZSxcInRyXCIpfHxcImF1dG9cIj09PWF8fCFwYXJzZUZsb2F0KGEpJiZcImlubGluZVwiPT09Y2UuY3NzKGUsXCJkaXNwbGF5XCIsITEscikpJiZlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiYoaT1cImJvcmRlci1ib3hcIj09PWNlLmNzcyhlLFwiYm94U2l6aW5nXCIsITEsciksKG89cyBpbiBlKSYmKGE9ZVtzXSkpLChhPXBhcnNlRmxvYXQoYSl8fDApK2l0KGUsdCxufHwoaT9cImJvcmRlclwiOlwiY29udGVudFwiKSxvLHIsYSkrXCJweFwifWZ1bmN0aW9uIGF0KGUsdCxuLHIsaSl7cmV0dXJuIG5ldyBhdC5wcm90b3R5cGUuaW5pdChlLHQsbixyLGkpfWNlLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihlLHQpe2lmKHQpe3ZhciBuPUdlKGUsXCJvcGFjaXR5XCIpO3JldHVyblwiXCI9PT1uP1wiMVwiOm59fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsYXNwZWN0UmF0aW86ITAsYm9yZGVySW1hZ2VTbGljZTohMCxjb2x1bW5Db3VudDohMCxmbGV4R3JvdzohMCxmbGV4U2hyaW5rOiEwLGZvbnRXZWlnaHQ6ITAsZ3JpZEFyZWE6ITAsZ3JpZENvbHVtbjohMCxncmlkQ29sdW1uRW5kOiEwLGdyaWRDb2x1bW5TdGFydDohMCxncmlkUm93OiEwLGdyaWRSb3dFbmQ6ITAsZ3JpZFJvd1N0YXJ0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHNjYWxlOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMCxmaWxsT3BhY2l0eTohMCxmbG9vZE9wYWNpdHk6ITAsc3RvcE9wYWNpdHk6ITAsc3Ryb2tlTWl0ZXJsaW1pdDohMCxzdHJva2VPcGFjaXR5OiEwfSxjc3NQcm9wczp7fSxzdHlsZTpmdW5jdGlvbihlLHQsbixyKXtpZihlJiYzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJmUuc3R5bGUpe3ZhciBpLG8sYSxzPUYodCksdT16ZS50ZXN0KHQpLGw9ZS5zdHlsZTtpZih1fHwodD1aZShzKSksYT1jZS5jc3NIb29rc1t0XXx8Y2UuY3NzSG9va3Nbc10sdm9pZCAwPT09bilyZXR1cm4gYSYmXCJnZXRcImluIGEmJnZvaWQgMCE9PShpPWEuZ2V0KGUsITEscikpP2k6bFt0XTtcInN0cmluZ1wiPT09KG89dHlwZW9mIG4pJiYoaT1ZLmV4ZWMobikpJiZpWzFdJiYobj10ZShlLHQsaSksbz1cIm51bWJlclwiKSxudWxsIT1uJiZuPT1uJiYoXCJudW1iZXJcIiE9PW98fHV8fChuKz1pJiZpWzNdfHwoY2UuY3NzTnVtYmVyW3NdP1wiXCI6XCJweFwiKSksbGUuY2xlYXJDbG9uZVN0eWxlfHxcIlwiIT09bnx8MCE9PXQuaW5kZXhPZihcImJhY2tncm91bmRcIil8fChsW3RdPVwiaW5oZXJpdFwiKSxhJiZcInNldFwiaW4gYSYmdm9pZCAwPT09KG49YS5zZXQoZSxuLHIpKXx8KHU/bC5zZXRQcm9wZXJ0eSh0LG4pOmxbdF09bikpfX0sY3NzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzPUYodCk7cmV0dXJuIHplLnRlc3QodCl8fCh0PVplKHMpKSwoYT1jZS5jc3NIb29rc1t0XXx8Y2UuY3NzSG9va3Nbc10pJiZcImdldFwiaW4gYSYmKGk9YS5nZXQoZSwhMCxuKSksdm9pZCAwPT09aSYmKGk9R2UoZSx0LHIpKSxcIm5vcm1hbFwiPT09aSYmdCBpbiBudCYmKGk9bnRbdF0pLFwiXCI9PT1ufHxuPyhvPXBhcnNlRmxvYXQoaSksITA9PT1ufHxpc0Zpbml0ZShvKT9vfHwwOmkpOml9fSksY2UuZWFjaChbXCJoZWlnaHRcIixcIndpZHRoXCJdLGZ1bmN0aW9uKGUsdSl7Y2UuY3NzSG9va3NbdV09e2dldDpmdW5jdGlvbihlLHQsbil7aWYodClyZXR1cm4hZXQudGVzdChjZS5jc3MoZSxcImRpc3BsYXlcIikpfHxlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiZlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoP290KGUsdSxuKTpVZShlLHR0LGZ1bmN0aW9uKCl7cmV0dXJuIG90KGUsdSxuKX0pfSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk9WGUoZSksbz0hbGUuc2Nyb2xsYm94U2l6ZSgpJiZcImFic29sdXRlXCI9PT1pLnBvc2l0aW9uLGE9KG98fG4pJiZcImJvcmRlci1ib3hcIj09PWNlLmNzcyhlLFwiYm94U2l6aW5nXCIsITEsaSkscz1uP2l0KGUsdSxuLGEsaSk6MDtyZXR1cm4gYSYmbyYmKHMtPU1hdGguY2VpbChlW1wib2Zmc2V0XCIrdVswXS50b1VwcGVyQ2FzZSgpK3Uuc2xpY2UoMSldLXBhcnNlRmxvYXQoaVt1XSktaXQoZSx1LFwiYm9yZGVyXCIsITEsaSktLjUpKSxzJiYocj1ZLmV4ZWModCkpJiZcInB4XCIhPT0oclszXXx8XCJweFwiKSYmKGUuc3R5bGVbdV09dCx0PWNlLmNzcyhlLHUpKSxydCgwLHQscyl9fX0pLGNlLmNzc0hvb2tzLm1hcmdpbkxlZnQ9WWUobGUucmVsaWFibGVNYXJnaW5MZWZ0LGZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4ocGFyc2VGbG9hdChHZShlLFwibWFyZ2luTGVmdFwiKSl8fGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC1VZShlLHttYXJnaW5MZWZ0OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKStcInB4XCJ9KSxjZS5lYWNoKHttYXJnaW46XCJcIixwYWRkaW5nOlwiXCIsYm9yZGVyOlwiV2lkdGhcIn0sZnVuY3Rpb24oaSxvKXtjZS5jc3NIb29rc1tpK29dPXtleHBhbmQ6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj17fSxyPVwic3RyaW5nXCI9PXR5cGVvZiBlP2Uuc3BsaXQoXCIgXCIpOltlXTt0PDQ7dCsrKW5baStRW3RdK29dPXJbdF18fHJbdC0yXXx8clswXTtyZXR1cm4gbn19LFwibWFyZ2luXCIhPT1pJiYoY2UuY3NzSG9va3NbaStvXS5zZXQ9cnQpfSksY2UuZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gTSh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89e30sYT0wO2lmKEFycmF5LmlzQXJyYXkodCkpe2ZvcihyPVhlKGUpLGk9dC5sZW5ndGg7YTxpO2ErKylvW3RbYV1dPWNlLmNzcyhlLHRbYV0sITEscik7cmV0dXJuIG99cmV0dXJuIHZvaWQgMCE9PW4/Y2Uuc3R5bGUoZSx0LG4pOmNlLmNzcyhlLHQpfSxlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX19KSwoKGNlLlR3ZWVuPWF0KS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmF0LGluaXQ6ZnVuY3Rpb24oZSx0LG4scixpLG8pe3RoaXMuZWxlbT1lLHRoaXMucHJvcD1uLHRoaXMuZWFzaW5nPWl8fGNlLmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9dCx0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9cix0aGlzLnVuaXQ9b3x8KGNlLmNzc051bWJlcltuXT9cIlwiOlwicHhcIil9LGN1cjpmdW5jdGlvbigpe3ZhciBlPWF0LnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBlJiZlLmdldD9lLmdldCh0aGlzKTphdC5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oZSl7dmFyIHQsbj1hdC5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPXQ9Y2UuZWFzaW5nW3RoaXMuZWFzaW5nXShlLHRoaXMub3B0aW9ucy5kdXJhdGlvbiplLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPXQ9ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTphdC5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSkuaW5pdC5wcm90b3R5cGU9YXQucHJvdG90eXBlLChhdC5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIDEhPT1lLmVsZW0ubm9kZVR5cGV8fG51bGwhPWUuZWxlbVtlLnByb3BdJiZudWxsPT1lLmVsZW0uc3R5bGVbZS5wcm9wXT9lLmVsZW1bZS5wcm9wXToodD1jZS5jc3MoZS5lbGVtLGUucHJvcCxcIlwiKSkmJlwiYXV0b1wiIT09dD90OjB9LHNldDpmdW5jdGlvbihlKXtjZS5meC5zdGVwW2UucHJvcF0/Y2UuZnguc3RlcFtlLnByb3BdKGUpOjEhPT1lLmVsZW0ubm9kZVR5cGV8fCFjZS5jc3NIb29rc1tlLnByb3BdJiZudWxsPT1lLmVsZW0uc3R5bGVbWmUoZS5wcm9wKV0/ZS5lbGVtW2UucHJvcF09ZS5ub3c6Y2Uuc3R5bGUoZS5lbGVtLGUucHJvcCxlLm5vdytlLnVuaXQpfX19KS5zY3JvbGxUb3A9YXQucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihlKXtlLmVsZW0ubm9kZVR5cGUmJmUuZWxlbS5wYXJlbnROb2RlJiYoZS5lbGVtW2UucHJvcF09ZS5ub3cpfX0sY2UuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn0sX2RlZmF1bHQ6XCJzd2luZ1wifSxjZS5meD1hdC5wcm90b3R5cGUuaW5pdCxjZS5meC5zdGVwPXt9O3ZhciBzdCx1dCxsdCxjdCxmdD0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8scHQ9L3F1ZXVlSG9va3MkLztmdW5jdGlvbiBkdCgpe3V0JiYoITE9PT1DLmhpZGRlbiYmaWUucmVxdWVzdEFuaW1hdGlvbkZyYW1lP2llLnJlcXVlc3RBbmltYXRpb25GcmFtZShkdCk6aWUuc2V0VGltZW91dChkdCxjZS5meC5pbnRlcnZhbCksY2UuZngudGljaygpKX1mdW5jdGlvbiBodCgpe3JldHVybiBpZS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c3Q9dm9pZCAwfSksc3Q9RGF0ZS5ub3coKX1mdW5jdGlvbiBndChlLHQpe3ZhciBuLHI9MCxpPXtoZWlnaHQ6ZX07Zm9yKHQ9dD8xOjA7cjw0O3IrPTItdClpW1wibWFyZ2luXCIrKG49UVtyXSldPWlbXCJwYWRkaW5nXCIrbl09ZTtyZXR1cm4gdCYmKGkub3BhY2l0eT1pLndpZHRoPWUpLGl9ZnVuY3Rpb24gdnQoZSx0LG4pe2Zvcih2YXIgcixpPSh5dC50d2VlbmVyc1t0XXx8W10pLmNvbmNhdCh5dC50d2VlbmVyc1tcIipcIl0pLG89MCxhPWkubGVuZ3RoO288YTtvKyspaWYocj1pW29dLmNhbGwobix0LGUpKXJldHVybiByfWZ1bmN0aW9uIHl0KG8sZSx0KXt2YXIgbixhLHI9MCxpPXl0LnByZWZpbHRlcnMubGVuZ3RoLHM9Y2UuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgdS5lbGVtfSksdT1mdW5jdGlvbigpe2lmKGEpcmV0dXJuITE7Zm9yKHZhciBlPXN0fHxodCgpLHQ9TWF0aC5tYXgoMCxsLnN0YXJ0VGltZStsLmR1cmF0aW9uLWUpLG49MS0odC9sLmR1cmF0aW9ufHwwKSxyPTAsaT1sLnR3ZWVucy5sZW5ndGg7cjxpO3IrKylsLnR3ZWVuc1tyXS5ydW4obik7cmV0dXJuIHMubm90aWZ5V2l0aChvLFtsLG4sdF0pLG48MSYmaT90OihpfHxzLm5vdGlmeVdpdGgobyxbbCwxLDBdKSxzLnJlc29sdmVXaXRoKG8sW2xdKSwhMSl9LGw9cy5wcm9taXNlKHtlbGVtOm8scHJvcHM6Y2UuZXh0ZW5kKHt9LGUpLG9wdHM6Y2UuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpjZS5lYXNpbmcuX2RlZmF1bHR9LHQpLG9yaWdpbmFsUHJvcGVydGllczplLG9yaWdpbmFsT3B0aW9uczp0LHN0YXJ0VGltZTpzdHx8aHQoKSxkdXJhdGlvbjp0LmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihlLHQpe3ZhciBuPWNlLlR3ZWVuKG8sbC5vcHRzLGUsdCxsLm9wdHMuc3BlY2lhbEVhc2luZ1tlXXx8bC5vcHRzLmVhc2luZyk7cmV0dXJuIGwudHdlZW5zLnB1c2gobiksbn0sc3RvcDpmdW5jdGlvbihlKXt2YXIgdD0wLG49ZT9sLnR3ZWVucy5sZW5ndGg6MDtpZihhKXJldHVybiB0aGlzO2ZvcihhPSEwO3Q8bjt0KyspbC50d2VlbnNbdF0ucnVuKDEpO3JldHVybiBlPyhzLm5vdGlmeVdpdGgobyxbbCwxLDBdKSxzLnJlc29sdmVXaXRoKG8sW2wsZV0pKTpzLnJlamVjdFdpdGgobyxbbCxlXSksdGhpc319KSxjPWwucHJvcHM7Zm9yKCFmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGE7Zm9yKG4gaW4gZSlpZihpPXRbcj1GKG4pXSxvPWVbbl0sQXJyYXkuaXNBcnJheShvKSYmKGk9b1sxXSxvPWVbbl09b1swXSksbiE9PXImJihlW3JdPW8sZGVsZXRlIGVbbl0pLChhPWNlLmNzc0hvb2tzW3JdKSYmXCJleHBhbmRcImluIGEpZm9yKG4gaW4gbz1hLmV4cGFuZChvKSxkZWxldGUgZVtyXSxvKW4gaW4gZXx8KGVbbl09b1tuXSx0W25dPWkpO2Vsc2UgdFtyXT1pfShjLGwub3B0cy5zcGVjaWFsRWFzaW5nKTtyPGk7cisrKWlmKG49eXQucHJlZmlsdGVyc1tyXS5jYWxsKGwsbyxjLGwub3B0cykpcmV0dXJuIHYobi5zdG9wKSYmKGNlLl9xdWV1ZUhvb2tzKGwuZWxlbSxsLm9wdHMucXVldWUpLnN0b3A9bi5zdG9wLmJpbmQobikpLG47cmV0dXJuIGNlLm1hcChjLHZ0LGwpLHYobC5vcHRzLnN0YXJ0KSYmbC5vcHRzLnN0YXJ0LmNhbGwobyxsKSxsLnByb2dyZXNzKGwub3B0cy5wcm9ncmVzcykuZG9uZShsLm9wdHMuZG9uZSxsLm9wdHMuY29tcGxldGUpLmZhaWwobC5vcHRzLmZhaWwpLmFsd2F5cyhsLm9wdHMuYWx3YXlzKSxjZS5meC50aW1lcihjZS5leHRlbmQodSx7ZWxlbTpvLGFuaW06bCxxdWV1ZTpsLm9wdHMucXVldWV9KSksbH1jZS5BbmltYXRpb249Y2UuZXh0ZW5kKHl0LHt0d2VlbmVyczp7XCIqXCI6W2Z1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jcmVhdGVUd2VlbihlLHQpO3JldHVybiB0ZShuLmVsZW0sZSxZLmV4ZWModCksbiksbn1dfSx0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7dihlKT8odD1lLGU9W1wiKlwiXSk6ZT1lLm1hdGNoKEQpO2Zvcih2YXIgbixyPTAsaT1lLmxlbmd0aDtyPGk7cisrKW49ZVtyXSx5dC50d2VlbmVyc1tuXT15dC50d2VlbmVyc1tuXXx8W10seXQudHdlZW5lcnNbbl0udW5zaGlmdCh0KX0scHJlZmlsdGVyczpbZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHMsdSxsLGMsZj1cIndpZHRoXCJpbiB0fHxcImhlaWdodFwiaW4gdCxwPXRoaXMsZD17fSxoPWUuc3R5bGUsZz1lLm5vZGVUeXBlJiZlZShlKSx2PV8uZ2V0KGUsXCJmeHNob3dcIik7Zm9yKHIgaW4gbi5xdWV1ZXx8KG51bGw9PShhPWNlLl9xdWV1ZUhvb2tzKGUsXCJmeFwiKSkudW5xdWV1ZWQmJihhLnVucXVldWVkPTAscz1hLmVtcHR5LmZpcmUsYS5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7YS51bnF1ZXVlZHx8cygpfSksYS51bnF1ZXVlZCsrLHAuYWx3YXlzKGZ1bmN0aW9uKCl7cC5hbHdheXMoZnVuY3Rpb24oKXthLnVucXVldWVkLS0sY2UucXVldWUoZSxcImZ4XCIpLmxlbmd0aHx8YS5lbXB0eS5maXJlKCl9KX0pKSx0KWlmKGk9dFtyXSxmdC50ZXN0KGkpKXtpZihkZWxldGUgdFtyXSxvPW98fFwidG9nZ2xlXCI9PT1pLGk9PT0oZz9cImhpZGVcIjpcInNob3dcIikpe2lmKFwic2hvd1wiIT09aXx8IXZ8fHZvaWQgMD09PXZbcl0pY29udGludWU7Zz0hMH1kW3JdPXYmJnZbcl18fGNlLnN0eWxlKGUscil9aWYoKHU9IWNlLmlzRW1wdHlPYmplY3QodCkpfHwhY2UuaXNFbXB0eU9iamVjdChkKSlmb3IociBpbiBmJiYxPT09ZS5ub2RlVHlwZSYmKG4ub3ZlcmZsb3c9W2gub3ZlcmZsb3csaC5vdmVyZmxvd1gsaC5vdmVyZmxvd1ldLG51bGw9PShsPXYmJnYuZGlzcGxheSkmJihsPV8uZ2V0KGUsXCJkaXNwbGF5XCIpKSxcIm5vbmVcIj09PShjPWNlLmNzcyhlLFwiZGlzcGxheVwiKSkmJihsP2M9bDoocmUoW2VdLCEwKSxsPWUuc3R5bGUuZGlzcGxheXx8bCxjPWNlLmNzcyhlLFwiZGlzcGxheVwiKSxyZShbZV0pKSksKFwiaW5saW5lXCI9PT1jfHxcImlubGluZS1ibG9ja1wiPT09YyYmbnVsbCE9bCkmJlwibm9uZVwiPT09Y2UuY3NzKGUsXCJmbG9hdFwiKSYmKHV8fChwLmRvbmUoZnVuY3Rpb24oKXtoLmRpc3BsYXk9bH0pLG51bGw9PWwmJihjPWguZGlzcGxheSxsPVwibm9uZVwiPT09Yz9cIlwiOmMpKSxoLmRpc3BsYXk9XCJpbmxpbmUtYmxvY2tcIikpLG4ub3ZlcmZsb3cmJihoLm92ZXJmbG93PVwiaGlkZGVuXCIscC5hbHdheXMoZnVuY3Rpb24oKXtoLm92ZXJmbG93PW4ub3ZlcmZsb3dbMF0saC5vdmVyZmxvd1g9bi5vdmVyZmxvd1sxXSxoLm92ZXJmbG93WT1uLm92ZXJmbG93WzJdfSkpLHU9ITEsZCl1fHwodj9cImhpZGRlblwiaW4gdiYmKGc9di5oaWRkZW4pOnY9Xy5hY2Nlc3MoZSxcImZ4c2hvd1wiLHtkaXNwbGF5Omx9KSxvJiYodi5oaWRkZW49IWcpLGcmJnJlKFtlXSwhMCkscC5kb25lKGZ1bmN0aW9uKCl7Zm9yKHIgaW4gZ3x8cmUoW2VdKSxfLnJlbW92ZShlLFwiZnhzaG93XCIpLGQpY2Uuc3R5bGUoZSxyLGRbcl0pfSkpLHU9dnQoZz92W3JdOjAscixwKSxyIGluIHZ8fCh2W3JdPXUuc3RhcnQsZyYmKHUuZW5kPXUuc3RhcnQsdS5zdGFydD0wKSl9XSxwcmVmaWx0ZXI6ZnVuY3Rpb24oZSx0KXt0P3l0LnByZWZpbHRlcnMudW5zaGlmdChlKTp5dC5wcmVmaWx0ZXJzLnB1c2goZSl9fSksY2Uuc3BlZWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUmJlwib2JqZWN0XCI9PXR5cGVvZiBlP2NlLmV4dGVuZCh7fSxlKTp7Y29tcGxldGU6bnx8IW4mJnR8fHYoZSkmJmUsZHVyYXRpb246ZSxlYXNpbmc6biYmdHx8dCYmIXYodCkmJnR9O3JldHVybiBjZS5meC5vZmY/ci5kdXJhdGlvbj0wOlwibnVtYmVyXCIhPXR5cGVvZiByLmR1cmF0aW9uJiYoci5kdXJhdGlvbiBpbiBjZS5meC5zcGVlZHM/ci5kdXJhdGlvbj1jZS5meC5zcGVlZHNbci5kdXJhdGlvbl06ci5kdXJhdGlvbj1jZS5meC5zcGVlZHMuX2RlZmF1bHQpLG51bGwhPXIucXVldWUmJiEwIT09ci5xdWV1ZXx8KHIucXVldWU9XCJmeFwiKSxyLm9sZD1yLmNvbXBsZXRlLHIuY29tcGxldGU9ZnVuY3Rpb24oKXt2KHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZjZS5kZXF1ZXVlKHRoaXMsci5xdWV1ZSl9LHJ9LGNlLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLmZpbHRlcihlZSkuY3NzKFwib3BhY2l0eVwiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OnR9LGUsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1jZS5pc0VtcHR5T2JqZWN0KHQpLG89Y2Uuc3BlZWQoZSxuLHIpLGE9ZnVuY3Rpb24oKXt2YXIgZT15dCh0aGlzLGNlLmV4dGVuZCh7fSx0KSxvKTsoaXx8Xy5nZXQodGhpcyxcImZpbmlzaFwiKSkmJmUuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLGl8fCExPT09by5xdWV1ZT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShvLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKGksZSxvKXt2YXIgYT1mdW5jdGlvbihlKXt2YXIgdD1lLnN0b3A7ZGVsZXRlIGUuc3RvcCx0KG8pfTtyZXR1cm5cInN0cmluZ1wiIT10eXBlb2YgaSYmKG89ZSxlPWksaT12b2lkIDApLGUmJnRoaXMucXVldWUoaXx8XCJmeFwiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT0hMCx0PW51bGwhPWkmJmkrXCJxdWV1ZUhvb2tzXCIsbj1jZS50aW1lcnMscj1fLmdldCh0aGlzKTtpZih0KXJbdF0mJnJbdF0uc3RvcCYmYShyW3RdKTtlbHNlIGZvcih0IGluIHIpclt0XSYmclt0XS5zdG9wJiZwdC50ZXN0KHQpJiZhKHJbdF0pO2Zvcih0PW4ubGVuZ3RoO3QtLTspblt0XS5lbGVtIT09dGhpc3x8bnVsbCE9aSYmblt0XS5xdWV1ZSE9PWl8fChuW3RdLmFuaW0uc3RvcChvKSxlPSExLG4uc3BsaWNlKHQsMSkpOyFlJiZvfHxjZS5kZXF1ZXVlKHRoaXMsaSl9KX0sZmluaXNoOmZ1bmN0aW9uKGEpe3JldHVybiExIT09YSYmKGE9YXx8XCJmeFwiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZSx0PV8uZ2V0KHRoaXMpLG49dFthK1wicXVldWVcIl0scj10W2ErXCJxdWV1ZUhvb2tzXCJdLGk9Y2UudGltZXJzLG89bj9uLmxlbmd0aDowO2Zvcih0LmZpbmlzaD0hMCxjZS5xdWV1ZSh0aGlzLGEsW10pLHImJnIuc3RvcCYmci5zdG9wLmNhbGwodGhpcywhMCksZT1pLmxlbmd0aDtlLS07KWlbZV0uZWxlbT09PXRoaXMmJmlbZV0ucXVldWU9PT1hJiYoaVtlXS5hbmltLnN0b3AoITApLGkuc3BsaWNlKGUsMSkpO2ZvcihlPTA7ZTxvO2UrKyluW2VdJiZuW2VdLmZpbmlzaCYmbltlXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgdC5maW5pc2h9KX19KSxjZS5lYWNoKFtcInRvZ2dsZVwiLFwic2hvd1wiLFwiaGlkZVwiXSxmdW5jdGlvbihlLHIpe3ZhciBpPWNlLmZuW3JdO2NlLmZuW3JdPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09ZXx8XCJib29sZWFuXCI9PXR5cGVvZiBlP2kuYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuYW5pbWF0ZShndChyLCEwKSxlLHQsbil9fSksY2UuZWFjaCh7c2xpZGVEb3duOmd0KFwic2hvd1wiKSxzbGlkZVVwOmd0KFwiaGlkZVwiKSxzbGlkZVRvZ2dsZTpndChcInRvZ2dsZVwiKSxmYWRlSW46e29wYWNpdHk6XCJzaG93XCJ9LGZhZGVPdXQ6e29wYWNpdHk6XCJoaWRlXCJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6XCJ0b2dnbGVcIn19LGZ1bmN0aW9uKGUscil7Y2UuZm5bZV09ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmFuaW1hdGUocixlLHQsbil9fSksY2UudGltZXJzPVtdLGNlLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgZSx0PTAsbj1jZS50aW1lcnM7Zm9yKHN0PURhdGUubm93KCk7dDxuLmxlbmd0aDt0KyspKGU9blt0XSkoKXx8blt0XSE9PWV8fG4uc3BsaWNlKHQtLSwxKTtuLmxlbmd0aHx8Y2UuZnguc3RvcCgpLHN0PXZvaWQgMH0sY2UuZngudGltZXI9ZnVuY3Rpb24oZSl7Y2UudGltZXJzLnB1c2goZSksY2UuZnguc3RhcnQoKX0sY2UuZnguaW50ZXJ2YWw9MTMsY2UuZnguc3RhcnQ9ZnVuY3Rpb24oKXt1dHx8KHV0PSEwLGR0KCkpfSxjZS5meC5zdG9wPWZ1bmN0aW9uKCl7dXQ9bnVsbH0sY2UuZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LGNlLmZuLmRlbGF5PWZ1bmN0aW9uKHIsZSl7cmV0dXJuIHI9Y2UuZngmJmNlLmZ4LnNwZWVkc1tyXXx8cixlPWV8fFwiZnhcIix0aGlzLnF1ZXVlKGUsZnVuY3Rpb24oZSx0KXt2YXIgbj1pZS5zZXRUaW1lb3V0KGUscik7dC5zdG9wPWZ1bmN0aW9uKCl7aWUuY2xlYXJUaW1lb3V0KG4pfX0pfSxsdD1DLmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKSxjdD1DLmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIikuYXBwZW5kQ2hpbGQoQy5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpKSxsdC50eXBlPVwiY2hlY2tib3hcIixsZS5jaGVja09uPVwiXCIhPT1sdC52YWx1ZSxsZS5vcHRTZWxlY3RlZD1jdC5zZWxlY3RlZCwobHQ9Qy5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIikpLnZhbHVlPVwidFwiLGx0LnR5cGU9XCJyYWRpb1wiLGxlLnJhZGlvVmFsdWU9XCJ0XCI9PT1sdC52YWx1ZTt2YXIgbXQseHQ9Y2UuZXhwci5hdHRySGFuZGxlO2NlLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQpe3JldHVybiBNKHRoaXMsY2UuYXR0cixlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Y2UucmVtb3ZlQXR0cih0aGlzLGUpfSl9fSksY2UuZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVyblwidW5kZWZpbmVkXCI9PXR5cGVvZiBlLmdldEF0dHJpYnV0ZT9jZS5wcm9wKGUsdCxuKTooMT09PW8mJmNlLmlzWE1MRG9jKGUpfHwoaT1jZS5hdHRySG9va3NbdC50b0xvd2VyQ2FzZSgpXXx8KGNlLmV4cHIubWF0Y2guYm9vbC50ZXN0KHQpP210OnZvaWQgMCkpLHZvaWQgMCE9PW4/bnVsbD09PW4/dm9pZCBjZS5yZW1vdmVBdHRyKGUsdCk6aSYmXCJzZXRcImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjooZS5zZXRBdHRyaWJ1dGUodCxuK1wiXCIpLG4pOmkmJlwiZ2V0XCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjpudWxsPT0ocj1jZS5maW5kLmF0dHIoZSx0KSk/dm9pZCAwOnIpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihlLHQpe2lmKCFsZS5yYWRpb1ZhbHVlJiZcInJhZGlvXCI9PT10JiZmZShlLFwiaW5wdXRcIikpe3ZhciBuPWUudmFsdWU7cmV0dXJuIGUuc2V0QXR0cmlidXRlKFwidHlwZVwiLHQpLG4mJihlLnZhbHVlPW4pLHR9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10JiZ0Lm1hdGNoKEQpO2lmKGkmJjE9PT1lLm5vZGVUeXBlKXdoaWxlKG49aVtyKytdKWUucmVtb3ZlQXR0cmlidXRlKG4pfX0pLG10PXtzZXQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExPT09dD9jZS5yZW1vdmVBdHRyKGUsbik6ZS5zZXRBdHRyaWJ1dGUobixuKSxufX0sY2UuZWFjaChjZS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cXHcrL2cpLGZ1bmN0aW9uKGUsdCl7dmFyIGE9eHRbdF18fGNlLmZpbmQuYXR0cjt4dFt0XT1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPXQudG9Mb3dlckNhc2UoKTtyZXR1cm4gbnx8KGk9eHRbb10seHRbb109cixyPW51bGwhPWEoZSx0LG4pP286bnVsbCx4dFtvXT1pKSxyfX0pO3ZhciBidD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLHd0PS9eKD86YXxhcmVhKSQvaTtmdW5jdGlvbiBUdChlKXtyZXR1cm4oZS5tYXRjaChEKXx8W10pLmpvaW4oXCIgXCIpfWZ1bmN0aW9uIEN0KGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKXx8XCJcIn1mdW5jdGlvbiBrdChlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lOlwic3RyaW5nXCI9PXR5cGVvZiBlJiZlLm1hdGNoKEQpfHxbXX1jZS5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gTSh0aGlzLGNlLnByb3AsZSx0LDE8YXJndW1lbnRzLmxlbmd0aCl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW2NlLnByb3BGaXhbZV18fGVdfSl9fSksY2UuZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiAxPT09byYmY2UuaXNYTUxEb2MoZSl8fCh0PWNlLnByb3BGaXhbdF18fHQsaT1jZS5wcm9wSG9va3NbdF0pLHZvaWQgMCE9PW4/aSYmXCJzZXRcImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjplW3RdPW46aSYmXCJnZXRcImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOmVbdF19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihlKXt2YXIgdD1jZS5maW5kLmF0dHIoZSxcInRhYmluZGV4XCIpO3JldHVybiB0P3BhcnNlSW50KHQsMTApOmJ0LnRlc3QoZS5ub2RlTmFtZSl8fHd0LnRlc3QoZS5ub2RlTmFtZSkmJmUuaHJlZj8wOi0xfX19LHByb3BGaXg6e1wiZm9yXCI6XCJodG1sRm9yXCIsXCJjbGFzc1wiOlwiY2xhc3NOYW1lXCJ9fSksbGUub3B0U2VsZWN0ZWR8fChjZS5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJnQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH0sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTt0JiYodC5zZWxlY3RlZEluZGV4LHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLGNlLmVhY2goW1widGFiSW5kZXhcIixcInJlYWRPbmx5XCIsXCJtYXhMZW5ndGhcIixcImNlbGxTcGFjaW5nXCIsXCJjZWxsUGFkZGluZ1wiLFwicm93U3BhblwiLFwiY29sU3BhblwiLFwidXNlTWFwXCIsXCJmcmFtZUJvcmRlclwiLFwiY29udGVudEVkaXRhYmxlXCJdLGZ1bmN0aW9uKCl7Y2UucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxjZS5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8sYTtyZXR1cm4gdih0KT90aGlzLmVhY2goZnVuY3Rpb24oZSl7Y2UodGhpcykuYWRkQ2xhc3ModC5jYWxsKHRoaXMsZSxDdCh0aGlzKSkpfSk6KGU9a3QodCkpLmxlbmd0aD90aGlzLmVhY2goZnVuY3Rpb24oKXtpZihyPUN0KHRoaXMpLG49MT09PXRoaXMubm9kZVR5cGUmJlwiIFwiK1R0KHIpK1wiIFwiKXtmb3Iobz0wO288ZS5sZW5ndGg7bysrKWk9ZVtvXSxuLmluZGV4T2YoXCIgXCIraStcIiBcIik8MCYmKG4rPWkrXCIgXCIpO2E9VHQobiksciE9PWEmJnRoaXMuc2V0QXR0cmlidXRlKFwiY2xhc3NcIixhKX19KTp0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLGE7cmV0dXJuIHYodCk/dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe2NlKHRoaXMpLnJlbW92ZUNsYXNzKHQuY2FsbCh0aGlzLGUsQ3QodGhpcykpKX0pOmFyZ3VtZW50cy5sZW5ndGg/KGU9a3QodCkpLmxlbmd0aD90aGlzLmVhY2goZnVuY3Rpb24oKXtpZihyPUN0KHRoaXMpLG49MT09PXRoaXMubm9kZVR5cGUmJlwiIFwiK1R0KHIpK1wiIFwiKXtmb3Iobz0wO288ZS5sZW5ndGg7bysrKXtpPWVbb107d2hpbGUoLTE8bi5pbmRleE9mKFwiIFwiK2krXCIgXCIpKW49bi5yZXBsYWNlKFwiIFwiK2krXCIgXCIsXCIgXCIpfWE9VHQobiksciE9PWEmJnRoaXMuc2V0QXR0cmlidXRlKFwiY2xhc3NcIixhKX19KTp0aGlzOnRoaXMuYXR0cihcImNsYXNzXCIsXCJcIil9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKHQsbil7dmFyIGUscixpLG8sYT10eXBlb2YgdCxzPVwic3RyaW5nXCI9PT1hfHxBcnJheS5pc0FycmF5KHQpO3JldHVybiB2KHQpP3RoaXMuZWFjaChmdW5jdGlvbihlKXtjZSh0aGlzKS50b2dnbGVDbGFzcyh0LmNhbGwodGhpcyxlLEN0KHRoaXMpLG4pLG4pfSk6XCJib29sZWFuXCI9PXR5cGVvZiBuJiZzP24/dGhpcy5hZGRDbGFzcyh0KTp0aGlzLnJlbW92ZUNsYXNzKHQpOihlPWt0KHQpLHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKHMpZm9yKG89Y2UodGhpcyksaT0wO2k8ZS5sZW5ndGg7aSsrKXI9ZVtpXSxvLmhhc0NsYXNzKHIpP28ucmVtb3ZlQ2xhc3Mocik6by5hZGRDbGFzcyhyKTtlbHNlIHZvaWQgMCE9PXQmJlwiYm9vbGVhblwiIT09YXx8KChyPUN0KHRoaXMpKSYmXy5zZXQodGhpcyxcIl9fY2xhc3NOYW1lX19cIixyKSx0aGlzLnNldEF0dHJpYnV0ZSYmdGhpcy5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLHJ8fCExPT09dD9cIlwiOl8uZ2V0KHRoaXMsXCJfX2NsYXNzTmFtZV9fXCIpfHxcIlwiKSl9KSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj0wO3Q9XCIgXCIrZStcIiBcIjt3aGlsZShuPXRoaXNbcisrXSlpZigxPT09bi5ub2RlVHlwZSYmLTE8KFwiIFwiK1R0KEN0KG4pKStcIiBcIikuaW5kZXhPZih0KSlyZXR1cm4hMDtyZXR1cm4hMX19KTt2YXIgU3Q9L1xcci9nO2NlLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKG4pe3ZhciByLGUsaSx0PXRoaXNbMF07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dihuKSx0aGlzLmVhY2goZnVuY3Rpb24oZSl7dmFyIHQ7MT09PXRoaXMubm9kZVR5cGUmJihudWxsPT0odD1pP24uY2FsbCh0aGlzLGUsY2UodGhpcykudmFsKCkpOm4pP3Q9XCJcIjpcIm51bWJlclwiPT10eXBlb2YgdD90Kz1cIlwiOkFycmF5LmlzQXJyYXkodCkmJih0PWNlLm1hcCh0LGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP1wiXCI6ZStcIlwifSkpLChyPWNlLnZhbEhvb2tzW3RoaXMudHlwZV18fGNlLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiZcInNldFwiaW4gciYmdm9pZCAwIT09ci5zZXQodGhpcyx0LFwidmFsdWVcIil8fCh0aGlzLnZhbHVlPXQpKX0pKTp0PyhyPWNlLnZhbEhvb2tzW3QudHlwZV18fGNlLnZhbEhvb2tzW3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiZcImdldFwiaW4gciYmdm9pZCAwIT09KGU9ci5nZXQodCxcInZhbHVlXCIpKT9lOlwic3RyaW5nXCI9PXR5cGVvZihlPXQudmFsdWUpP2UucmVwbGFjZShTdCxcIlwiKTpudWxsPT1lP1wiXCI6ZTp2b2lkIDB9fSksY2UuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9Y2UuZmluZC5hdHRyKGUsXCJ2YWx1ZVwiKTtyZXR1cm4gbnVsbCE9dD90OlR0KGNlLnRleHQoZSkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGk9ZS5vcHRpb25zLG89ZS5zZWxlY3RlZEluZGV4LGE9XCJzZWxlY3Qtb25lXCI9PT1lLnR5cGUscz1hP251bGw6W10sdT1hP28rMTppLmxlbmd0aDtmb3Iocj1vPDA/dTphP286MDtyPHU7cisrKWlmKCgobj1pW3JdKS5zZWxlY3RlZHx8cj09PW8pJiYhbi5kaXNhYmxlZCYmKCFuLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFmZShuLnBhcmVudE5vZGUsXCJvcHRncm91cFwiKSkpe2lmKHQ9Y2UobikudmFsKCksYSlyZXR1cm4gdDtzLnB1c2godCl9cmV0dXJuIHN9LHNldDpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT1lLm9wdGlvbnMsbz1jZS5tYWtlQXJyYXkodCksYT1pLmxlbmd0aDt3aGlsZShhLS0pKChyPWlbYV0pLnNlbGVjdGVkPS0xPGNlLmluQXJyYXkoY2UudmFsSG9va3Mub3B0aW9uLmdldChyKSxvKSkmJihuPSEwKTtyZXR1cm4gbnx8KGUuc2VsZWN0ZWRJbmRleD0tMSksb319fX0pLGNlLmVhY2goW1wicmFkaW9cIixcImNoZWNrYm94XCJdLGZ1bmN0aW9uKCl7Y2UudmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihlLHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIGUuY2hlY2tlZD0tMTxjZS5pbkFycmF5KGNlKGUpLnZhbCgpLHQpfX0sbGUuY2hlY2tPbnx8KGNlLnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWUuZ2V0QXR0cmlidXRlKFwidmFsdWVcIik/XCJvblwiOmUudmFsdWV9KX0pO3ZhciBFdD1pZS5sb2NhdGlvbixqdD17Z3VpZDpEYXRlLm5vdygpfSxBdD0vXFw/LztjZS5wYXJzZVhNTD1mdW5jdGlvbihlKXt2YXIgdCxuO2lmKCFlfHxcInN0cmluZ1wiIT10eXBlb2YgZSlyZXR1cm4gbnVsbDt0cnl7dD0obmV3IGllLkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGUsXCJ0ZXh0L3htbFwiKX1jYXRjaChlKXt9cmV0dXJuIG49dCYmdC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInBhcnNlcmVycm9yXCIpWzBdLHQmJiFufHxjZS5lcnJvcihcIkludmFsaWQgWE1MOiBcIisobj9jZS5tYXAobi5jaGlsZE5vZGVzLGZ1bmN0aW9uKGUpe3JldHVybiBlLnRleHRDb250ZW50fSkuam9pbihcIlxcblwiKTplKSksdH07dmFyIER0PS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxOdD1mdW5jdGlvbihlKXtlLnN0b3BQcm9wYWdhdGlvbigpfTtjZS5leHRlbmQoY2UuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsLGMsZixwPVtufHxDXSxkPXVlLmNhbGwoZSxcInR5cGVcIik/ZS50eXBlOmUsaD11ZS5jYWxsKGUsXCJuYW1lc3BhY2VcIik/ZS5uYW1lc3BhY2Uuc3BsaXQoXCIuXCIpOltdO2lmKG89Zj1hPW49bnx8QywzIT09bi5ub2RlVHlwZSYmOCE9PW4ubm9kZVR5cGUmJiFEdC50ZXN0KGQrY2UuZXZlbnQudHJpZ2dlcmVkKSYmKC0xPGQuaW5kZXhPZihcIi5cIikmJihkPShoPWQuc3BsaXQoXCIuXCIpKS5zaGlmdCgpLGguc29ydCgpKSx1PWQuaW5kZXhPZihcIjpcIik8MCYmXCJvblwiK2QsKGU9ZVtjZS5leHBhbmRvXT9lOm5ldyBjZS5FdmVudChkLFwib2JqZWN0XCI9PXR5cGVvZiBlJiZlKSkuaXNUcmlnZ2VyPXI/MjozLGUubmFtZXNwYWNlPWguam9pbihcIi5cIiksZS5ybmFtZXNwYWNlPWUubmFtZXNwYWNlP25ldyBSZWdFeHAoXCIoXnxcXFxcLilcIitoLmpvaW4oXCJcXFxcLig/Oi4qXFxcXC58KVwiKStcIihcXFxcLnwkKVwiKTpudWxsLGUucmVzdWx0PXZvaWQgMCxlLnRhcmdldHx8KGUudGFyZ2V0PW4pLHQ9bnVsbD09dD9bZV06Y2UubWFrZUFycmF5KHQsW2VdKSxjPWNlLmV2ZW50LnNwZWNpYWxbZF18fHt9LHJ8fCFjLnRyaWdnZXJ8fCExIT09Yy50cmlnZ2VyLmFwcGx5KG4sdCkpKXtpZighciYmIWMubm9CdWJibGUmJiF5KG4pKXtmb3Iocz1jLmRlbGVnYXRlVHlwZXx8ZCxEdC50ZXN0KHMrZCl8fChvPW8ucGFyZW50Tm9kZSk7bztvPW8ucGFyZW50Tm9kZSlwLnB1c2gobyksYT1vO2E9PT0obi5vd25lckRvY3VtZW50fHxDKSYmcC5wdXNoKGEuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93fHxpZSl9aT0wO3doaWxlKChvPXBbaSsrXSkmJiFlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpZj1vLGUudHlwZT0xPGk/czpjLmJpbmRUeXBlfHxkLChsPShfLmdldChvLFwiZXZlbnRzXCIpfHxPYmplY3QuY3JlYXRlKG51bGwpKVtlLnR5cGVdJiZfLmdldChvLFwiaGFuZGxlXCIpKSYmbC5hcHBseShvLHQpLChsPXUmJm9bdV0pJiZsLmFwcGx5JiYkKG8pJiYoZS5yZXN1bHQ9bC5hcHBseShvLHQpLCExPT09ZS5yZXN1bHQmJmUucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIGUudHlwZT1kLHJ8fGUuaXNEZWZhdWx0UHJldmVudGVkKCl8fGMuX2RlZmF1bHQmJiExIT09Yy5fZGVmYXVsdC5hcHBseShwLnBvcCgpLHQpfHwhJChuKXx8dSYmdihuW2RdKSYmIXkobikmJigoYT1uW3VdKSYmKG5bdV09bnVsbCksY2UuZXZlbnQudHJpZ2dlcmVkPWQsZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZmLmFkZEV2ZW50TGlzdGVuZXIoZCxOdCksbltkXSgpLGUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmZi5yZW1vdmVFdmVudExpc3RlbmVyKGQsTnQpLGNlLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsYSYmKG5bdV09YSkpLGUucmVzdWx0fX0sc2ltdWxhdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWNlLmV4dGVuZChuZXcgY2UuRXZlbnQsbix7dHlwZTplLGlzU2ltdWxhdGVkOiEwfSk7Y2UuZXZlbnQudHJpZ2dlcihyLG51bGwsdCl9fSksY2UuZm4uZXh0ZW5kKHt0cmlnZ2VyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2NlLmV2ZW50LnRyaWdnZXIoZSx0LHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpc1swXTtpZihuKXJldHVybiBjZS5ldmVudC50cmlnZ2VyKGUsdCxuLCEwKX19KTt2YXIgcXQ9L1xcW1xcXSQvLEx0PS9cXHI/XFxuL2csSHQ9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLE90PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBQdChuLGUscixpKXt2YXIgdDtpZihBcnJheS5pc0FycmF5KGUpKWNlLmVhY2goZSxmdW5jdGlvbihlLHQpe3J8fHF0LnRlc3Qobik/aShuLHQpOlB0KG4rXCJbXCIrKFwib2JqZWN0XCI9PXR5cGVvZiB0JiZudWxsIT10P2U6XCJcIikrXCJdXCIsdCxyLGkpfSk7ZWxzZSBpZihyfHxcIm9iamVjdFwiIT09eChlKSlpKG4sZSk7ZWxzZSBmb3IodCBpbiBlKVB0KG4rXCJbXCIrdCtcIl1cIixlW3RdLHIsaSl9Y2UucGFyYW09ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9ZnVuY3Rpb24oZSx0KXt2YXIgbj12KHQpP3QoKTp0O3Jbci5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChlKStcIj1cIitlbmNvZGVVUklDb21wb25lbnQobnVsbD09bj9cIlwiOm4pfTtpZihudWxsPT1lKXJldHVyblwiXCI7aWYoQXJyYXkuaXNBcnJheShlKXx8ZS5qcXVlcnkmJiFjZS5pc1BsYWluT2JqZWN0KGUpKWNlLmVhY2goZSxmdW5jdGlvbigpe2kodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IobiBpbiBlKVB0KG4sZVtuXSx0LGkpO3JldHVybiByLmpvaW4oXCImXCIpfSxjZS5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBjZS5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPWNlLnByb3AodGhpcyxcImVsZW1lbnRzXCIpO3JldHVybiBlP2NlLm1ha2VBcnJheShlKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFjZSh0aGlzKS5pcyhcIjpkaXNhYmxlZFwiKSYmT3QudGVzdCh0aGlzLm5vZGVOYW1lKSYmIUh0LnRlc3QoZSkmJih0aGlzLmNoZWNrZWR8fCF3ZS50ZXN0KGUpKX0pLm1hcChmdW5jdGlvbihlLHQpe3ZhciBuPWNlKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1uP251bGw6QXJyYXkuaXNBcnJheShuKT9jZS5tYXAobixmdW5jdGlvbihlKXtyZXR1cm57bmFtZTp0Lm5hbWUsdmFsdWU6ZS5yZXBsYWNlKEx0LFwiXFxyXFxuXCIpfX0pOntuYW1lOnQubmFtZSx2YWx1ZTpuLnJlcGxhY2UoTHQsXCJcXHJcXG5cIil9fSkuZ2V0KCl9fSk7dmFyIE10PS8lMjAvZyxSdD0vIy4qJC8sSXQ9LyhbPyZdKV89W14mXSovLFd0PS9eKC4qPyk6WyBcXHRdKihbXlxcclxcbl0qKSQvZ20sRnQ9L14oPzpHRVR8SEVBRCkkLywkdD0vXlxcL1xcLy8sQnQ9e30sX3Q9e30senQ9XCIqL1wiLmNvbmNhdChcIipcIiksWHQ9Qy5jcmVhdGVFbGVtZW50KFwiYVwiKTtmdW5jdGlvbiBVdChvKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXtcInN0cmluZ1wiIT10eXBlb2YgZSYmKHQ9ZSxlPVwiKlwiKTt2YXIgbixyPTAsaT1lLnRvTG93ZXJDYXNlKCkubWF0Y2goRCl8fFtdO2lmKHYodCkpd2hpbGUobj1pW3IrK10pXCIrXCI9PT1uWzBdPyhuPW4uc2xpY2UoMSl8fFwiKlwiLChvW25dPW9bbl18fFtdKS51bnNoaWZ0KHQpKToob1tuXT1vW25dfHxbXSkucHVzaCh0KX19ZnVuY3Rpb24gVnQodCxpLG8sYSl7dmFyIHM9e30sdT10PT09X3Q7ZnVuY3Rpb24gbChlKXt2YXIgcjtyZXR1cm4gc1tlXT0hMCxjZS5lYWNoKHRbZV18fFtdLGZ1bmN0aW9uKGUsdCl7dmFyIG49dChpLG8sYSk7cmV0dXJuXCJzdHJpbmdcIiE9dHlwZW9mIG58fHV8fHNbbl0/dT8hKHI9bik6dm9pZCAwOihpLmRhdGFUeXBlcy51bnNoaWZ0KG4pLGwobiksITEpfSkscn1yZXR1cm4gbChpLmRhdGFUeXBlc1swXSl8fCFzW1wiKlwiXSYmbChcIipcIil9ZnVuY3Rpb24gR3QoZSx0KXt2YXIgbixyLGk9Y2UuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IobiBpbiB0KXZvaWQgMCE9PXRbbl0mJigoaVtuXT9lOnJ8fChyPXt9KSlbbl09dFtuXSk7cmV0dXJuIHImJmNlLmV4dGVuZCghMCxlLHIpLGV9WHQuaHJlZj1FdC5ocmVmLGNlLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6RXQuaHJlZix0eXBlOlwiR0VUXCIsaXNMb2NhbDovXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLy50ZXN0KEV0LnByb3RvY29sKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6XCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLThcIixhY2NlcHRzOntcIipcIjp6dCx0ZXh0OlwidGV4dC9wbGFpblwiLGh0bWw6XCJ0ZXh0L2h0bWxcIix4bWw6XCJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sXCIsanNvbjpcImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdFwifSxjb250ZW50czp7eG1sOi9cXGJ4bWxcXGIvLGh0bWw6L1xcYmh0bWwvLGpzb246L1xcYmpzb25cXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOlwicmVzcG9uc2VYTUxcIix0ZXh0OlwicmVzcG9uc2VUZXh0XCIsanNvbjpcInJlc3BvbnNlSlNPTlwifSxjb252ZXJ0ZXJzOntcIiogdGV4dFwiOlN0cmluZyxcInRleHQgaHRtbFwiOiEwLFwidGV4dCBqc29uXCI6SlNPTi5wYXJzZSxcInRleHQgeG1sXCI6Y2UucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihlLHQpe3JldHVybiB0P0d0KEd0KGUsY2UuYWpheFNldHRpbmdzKSx0KTpHdChjZS5hamF4U2V0dGluZ3MsZSl9LGFqYXhQcmVmaWx0ZXI6VXQoQnQpLGFqYXhUcmFuc3BvcnQ6VXQoX3QpLGFqYXg6ZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksdD10fHx7fTt2YXIgYyxmLHAsbixkLHIsaCxnLGksbyx2PWNlLmFqYXhTZXR1cCh7fSx0KSx5PXYuY29udGV4dHx8dixtPXYuY29udGV4dCYmKHkubm9kZVR5cGV8fHkuanF1ZXJ5KT9jZSh5KTpjZS5ldmVudCx4PWNlLkRlZmVycmVkKCksYj1jZS5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKSx3PXYuc3RhdHVzQ29kZXx8e30sYT17fSxzPXt9LHU9XCJjYW5jZWxlZFwiLFQ9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihlKXt2YXIgdDtpZihoKXtpZighbil7bj17fTt3aGlsZSh0PVd0LmV4ZWMocCkpblt0WzFdLnRvTG93ZXJDYXNlKCkrXCIgXCJdPShuW3RbMV0udG9Mb3dlckNhc2UoKStcIiBcIl18fFtdKS5jb25jYXQodFsyXSl9dD1uW2UudG9Mb3dlckNhc2UoKStcIiBcIl19cmV0dXJuIG51bGw9PXQ/bnVsbDp0LmpvaW4oXCIsIFwiKX0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGg/cDpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWgmJihlPXNbZS50b0xvd2VyQ2FzZSgpXT1zW2UudG9Mb3dlckNhc2UoKV18fGUsYVtlXT10KSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1oJiYodi5taW1lVHlwZT1lKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGUpaWYoaClULmFsd2F5cyhlW1Quc3RhdHVzXSk7ZWxzZSBmb3IodCBpbiBlKXdbdF09W3dbdF0sZVt0XV07cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGUpe3ZhciB0PWV8fHU7cmV0dXJuIGMmJmMuYWJvcnQodCksbCgwLHQpLHRoaXN9fTtpZih4LnByb21pc2UoVCksdi51cmw9KChlfHx2LnVybHx8RXQuaHJlZikrXCJcIikucmVwbGFjZSgkdCxFdC5wcm90b2NvbCtcIi8vXCIpLHYudHlwZT10Lm1ldGhvZHx8dC50eXBlfHx2Lm1ldGhvZHx8di50eXBlLHYuZGF0YVR5cGVzPSh2LmRhdGFUeXBlfHxcIipcIikudG9Mb3dlckNhc2UoKS5tYXRjaChEKXx8W1wiXCJdLG51bGw9PXYuY3Jvc3NEb21haW4pe3I9Qy5jcmVhdGVFbGVtZW50KFwiYVwiKTt0cnl7ci5ocmVmPXYudXJsLHIuaHJlZj1yLmhyZWYsdi5jcm9zc0RvbWFpbj1YdC5wcm90b2NvbCtcIi8vXCIrWHQuaG9zdCE9ci5wcm90b2NvbCtcIi8vXCIrci5ob3N0fWNhdGNoKGUpe3YuY3Jvc3NEb21haW49ITB9fWlmKHYuZGF0YSYmdi5wcm9jZXNzRGF0YSYmXCJzdHJpbmdcIiE9dHlwZW9mIHYuZGF0YSYmKHYuZGF0YT1jZS5wYXJhbSh2LmRhdGEsdi50cmFkaXRpb25hbCkpLFZ0KEJ0LHYsdCxUKSxoKXJldHVybiBUO2ZvcihpIGluKGc9Y2UuZXZlbnQmJnYuZ2xvYmFsKSYmMD09Y2UuYWN0aXZlKysmJmNlLmV2ZW50LnRyaWdnZXIoXCJhamF4U3RhcnRcIiksdi50eXBlPXYudHlwZS50b1VwcGVyQ2FzZSgpLHYuaGFzQ29udGVudD0hRnQudGVzdCh2LnR5cGUpLGY9di51cmwucmVwbGFjZShSdCxcIlwiKSx2Lmhhc0NvbnRlbnQ/di5kYXRhJiZ2LnByb2Nlc3NEYXRhJiYwPT09KHYuY29udGVudFR5cGV8fFwiXCIpLmluZGV4T2YoXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIikmJih2LmRhdGE9di5kYXRhLnJlcGxhY2UoTXQsXCIrXCIpKToobz12LnVybC5zbGljZShmLmxlbmd0aCksdi5kYXRhJiYodi5wcm9jZXNzRGF0YXx8XCJzdHJpbmdcIj09dHlwZW9mIHYuZGF0YSkmJihmKz0oQXQudGVzdChmKT9cIiZcIjpcIj9cIikrdi5kYXRhLGRlbGV0ZSB2LmRhdGEpLCExPT09di5jYWNoZSYmKGY9Zi5yZXBsYWNlKEl0LFwiJDFcIiksbz0oQXQudGVzdChmKT9cIiZcIjpcIj9cIikrXCJfPVwiK2p0Lmd1aWQrKytvKSx2LnVybD1mK28pLHYuaWZNb2RpZmllZCYmKGNlLmxhc3RNb2RpZmllZFtmXSYmVC5zZXRSZXF1ZXN0SGVhZGVyKFwiSWYtTW9kaWZpZWQtU2luY2VcIixjZS5sYXN0TW9kaWZpZWRbZl0pLGNlLmV0YWdbZl0mJlQuc2V0UmVxdWVzdEhlYWRlcihcIklmLU5vbmUtTWF0Y2hcIixjZS5ldGFnW2ZdKSksKHYuZGF0YSYmdi5oYXNDb250ZW50JiYhMSE9PXYuY29udGVudFR5cGV8fHQuY29udGVudFR5cGUpJiZULnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIix2LmNvbnRlbnRUeXBlKSxULnNldFJlcXVlc3RIZWFkZXIoXCJBY2NlcHRcIix2LmRhdGFUeXBlc1swXSYmdi5hY2NlcHRzW3YuZGF0YVR5cGVzWzBdXT92LmFjY2VwdHNbdi5kYXRhVHlwZXNbMF1dKyhcIipcIiE9PXYuZGF0YVR5cGVzWzBdP1wiLCBcIit6dCtcIjsgcT0wLjAxXCI6XCJcIik6di5hY2NlcHRzW1wiKlwiXSksdi5oZWFkZXJzKVQuc2V0UmVxdWVzdEhlYWRlcihpLHYuaGVhZGVyc1tpXSk7aWYodi5iZWZvcmVTZW5kJiYoITE9PT12LmJlZm9yZVNlbmQuY2FsbCh5LFQsdil8fGgpKXJldHVybiBULmFib3J0KCk7aWYodT1cImFib3J0XCIsYi5hZGQodi5jb21wbGV0ZSksVC5kb25lKHYuc3VjY2VzcyksVC5mYWlsKHYuZXJyb3IpLGM9VnQoX3Qsdix0LFQpKXtpZihULnJlYWR5U3RhdGU9MSxnJiZtLnRyaWdnZXIoXCJhamF4U2VuZFwiLFtULHZdKSxoKXJldHVybiBUO3YuYXN5bmMmJjA8di50aW1lb3V0JiYoZD1pZS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7VC5hYm9ydChcInRpbWVvdXRcIil9LHYudGltZW91dCkpO3RyeXtoPSExLGMuc2VuZChhLGwpfWNhdGNoKGUpe2lmKGgpdGhyb3cgZTtsKC0xLGUpfX1lbHNlIGwoLTEsXCJObyBUcmFuc3BvcnRcIik7ZnVuY3Rpb24gbChlLHQsbixyKXt2YXIgaSxvLGEscyx1LGw9dDtofHwoaD0hMCxkJiZpZS5jbGVhclRpbWVvdXQoZCksYz12b2lkIDAscD1yfHxcIlwiLFQucmVhZHlTdGF0ZT0wPGU/NDowLGk9MjAwPD1lJiZlPDMwMHx8MzA0PT09ZSxuJiYocz1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscz1lLmNvbnRlbnRzLHU9ZS5kYXRhVHlwZXM7d2hpbGUoXCIqXCI9PT11WzBdKXUuc2hpZnQoKSx2b2lkIDA9PT1yJiYocj1lLm1pbWVUeXBlfHx0LmdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1UeXBlXCIpKTtpZihyKWZvcihpIGluIHMpaWYoc1tpXSYmc1tpXS50ZXN0KHIpKXt1LnVuc2hpZnQoaSk7YnJlYWt9aWYodVswXWluIG4pbz11WzBdO2Vsc2V7Zm9yKGkgaW4gbil7aWYoIXVbMF18fGUuY29udmVydGVyc1tpK1wiIFwiK3VbMF1dKXtvPWk7YnJlYWt9YXx8KGE9aSl9bz1vfHxhfWlmKG8pcmV0dXJuIG8hPT11WzBdJiZ1LnVuc2hpZnQobyksbltvXX0odixULG4pKSwhaSYmLTE8Y2UuaW5BcnJheShcInNjcmlwdFwiLHYuZGF0YVR5cGVzKSYmY2UuaW5BcnJheShcImpzb25cIix2LmRhdGFUeXBlcyk8MCYmKHYuY29udmVydGVyc1tcInRleHQgc2NyaXB0XCJdPWZ1bmN0aW9uKCl7fSkscz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyx1LGw9e30sYz1lLmRhdGFUeXBlcy5zbGljZSgpO2lmKGNbMV0pZm9yKGEgaW4gZS5jb252ZXJ0ZXJzKWxbYS50b0xvd2VyQ2FzZSgpXT1lLmNvbnZlcnRlcnNbYV07bz1jLnNoaWZ0KCk7d2hpbGUobylpZihlLnJlc3BvbnNlRmllbGRzW29dJiYobltlLnJlc3BvbnNlRmllbGRzW29dXT10KSwhdSYmciYmZS5kYXRhRmlsdGVyJiYodD1lLmRhdGFGaWx0ZXIodCxlLmRhdGFUeXBlKSksdT1vLG89Yy5zaGlmdCgpKWlmKFwiKlwiPT09bylvPXU7ZWxzZSBpZihcIipcIiE9PXUmJnUhPT1vKXtpZighKGE9bFt1K1wiIFwiK29dfHxsW1wiKiBcIitvXSkpZm9yKGkgaW4gbClpZigocz1pLnNwbGl0KFwiIFwiKSlbMV09PT1vJiYoYT1sW3UrXCIgXCIrc1swXV18fGxbXCIqIFwiK3NbMF1dKSl7ITA9PT1hP2E9bFtpXTohMCE9PWxbaV0mJihvPXNbMF0sYy51bnNoaWZ0KHNbMV0pKTticmVha31pZighMCE9PWEpaWYoYSYmZVtcInRocm93c1wiXSl0PWEodCk7ZWxzZSB0cnl7dD1hKHQpfWNhdGNoKGUpe3JldHVybntzdGF0ZTpcInBhcnNlcmVycm9yXCIsZXJyb3I6YT9lOlwiTm8gY29udmVyc2lvbiBmcm9tIFwiK3UrXCIgdG8gXCIrb319fXJldHVybntzdGF0ZTpcInN1Y2Nlc3NcIixkYXRhOnR9fSh2LHMsVCxpKSxpPyh2LmlmTW9kaWZpZWQmJigodT1ULmdldFJlc3BvbnNlSGVhZGVyKFwiTGFzdC1Nb2RpZmllZFwiKSkmJihjZS5sYXN0TW9kaWZpZWRbZl09dSksKHU9VC5nZXRSZXNwb25zZUhlYWRlcihcImV0YWdcIikpJiYoY2UuZXRhZ1tmXT11KSksMjA0PT09ZXx8XCJIRUFEXCI9PT12LnR5cGU/bD1cIm5vY29udGVudFwiOjMwND09PWU/bD1cIm5vdG1vZGlmaWVkXCI6KGw9cy5zdGF0ZSxvPXMuZGF0YSxpPSEoYT1zLmVycm9yKSkpOihhPWwsIWUmJmx8fChsPVwiZXJyb3JcIixlPDAmJihlPTApKSksVC5zdGF0dXM9ZSxULnN0YXR1c1RleHQ9KHR8fGwpK1wiXCIsaT94LnJlc29sdmVXaXRoKHksW28sbCxUXSk6eC5yZWplY3RXaXRoKHksW1QsbCxhXSksVC5zdGF0dXNDb2RlKHcpLHc9dm9pZCAwLGcmJm0udHJpZ2dlcihpP1wiYWpheFN1Y2Nlc3NcIjpcImFqYXhFcnJvclwiLFtULHYsaT9vOmFdKSxiLmZpcmVXaXRoKHksW1QsbF0pLGcmJihtLnRyaWdnZXIoXCJhamF4Q29tcGxldGVcIixbVCx2XSksLS1jZS5hY3RpdmV8fGNlLmV2ZW50LnRyaWdnZXIoXCJhamF4U3RvcFwiKSkpfXJldHVybiBUfSxnZXRKU09OOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gY2UuZ2V0KGUsdCxuLFwianNvblwiKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGNlLmdldChlLHZvaWQgMCx0LFwic2NyaXB0XCIpfX0pLGNlLmVhY2goW1wiZ2V0XCIsXCJwb3N0XCJdLGZ1bmN0aW9uKGUsaSl7Y2VbaV09ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHYodCkmJihyPXJ8fG4sbj10LHQ9dm9pZCAwKSxjZS5hamF4KGNlLmV4dGVuZCh7dXJsOmUsdHlwZTppLGRhdGFUeXBlOnIsZGF0YTp0LHN1Y2Nlc3M6bn0sY2UuaXNQbGFpbk9iamVjdChlKSYmZSkpfX0pLGNlLmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZS5oZWFkZXJzKVwiY29udGVudC10eXBlXCI9PT10LnRvTG93ZXJDYXNlKCkmJihlLmNvbnRlbnRUeXBlPWUuaGVhZGVyc1t0XXx8XCJcIil9KSxjZS5fZXZhbFVybD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGNlLmFqYXgoe3VybDplLHR5cGU6XCJHRVRcIixkYXRhVHlwZTpcInNjcmlwdFwiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSxjb252ZXJ0ZXJzOntcInRleHQgc2NyaXB0XCI6ZnVuY3Rpb24oKXt9fSxkYXRhRmlsdGVyOmZ1bmN0aW9uKGUpe2NlLmdsb2JhbEV2YWwoZSx0LG4pfX0pfSxjZS5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIHRoaXNbMF0mJih2KGUpJiYoZT1lLmNhbGwodGhpc1swXSkpLHQ9Y2UoZSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJnQuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLHQubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpczt3aGlsZShlLmZpcnN0RWxlbWVudENoaWxkKWU9ZS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gZX0pLmFwcGVuZCh0aGlzKSksdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKG4pe3JldHVybiB2KG4pP3RoaXMuZWFjaChmdW5jdGlvbihlKXtjZSh0aGlzKS53cmFwSW5uZXIobi5jYWxsKHRoaXMsZSkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9Y2UodGhpcyksdD1lLmNvbnRlbnRzKCk7dC5sZW5ndGg/dC53cmFwQWxsKG4pOmUuYXBwZW5kKG4pfSl9LHdyYXA6ZnVuY3Rpb24odCl7dmFyIG49dih0KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe2NlKHRoaXMpLndyYXBBbGwobj90LmNhbGwodGhpcyxlKTp0KX0pfSx1bndyYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucGFyZW50KGUpLm5vdChcImJvZHlcIikuZWFjaChmdW5jdGlvbigpe2NlKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KSx0aGlzfX0pLGNlLmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIWNlLmV4cHIucHNldWRvcy52aXNpYmxlKGUpfSxjZS5leHByLnBzZXVkb3MudmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4hIShlLm9mZnNldFdpZHRofHxlLm9mZnNldEhlaWdodHx8ZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCl9LGNlLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBpZS5YTUxIdHRwUmVxdWVzdH1jYXRjaChlKXt9fTt2YXIgWXQ9ezA6MjAwLDEyMjM6MjA0fSxRdD1jZS5hamF4U2V0dGluZ3MueGhyKCk7bGUuY29ycz0hIVF0JiZcIndpdGhDcmVkZW50aWFsc1wiaW4gUXQsbGUuYWpheD1RdD0hIVF0LGNlLmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24oaSl7dmFyIG8sYTtpZihsZS5jb3JzfHxRdCYmIWkuY3Jvc3NEb21haW4pcmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWkueGhyKCk7aWYoci5vcGVuKGkudHlwZSxpLnVybCxpLmFzeW5jLGkudXNlcm5hbWUsaS5wYXNzd29yZCksaS54aHJGaWVsZHMpZm9yKG4gaW4gaS54aHJGaWVsZHMpcltuXT1pLnhockZpZWxkc1tuXTtmb3IobiBpbiBpLm1pbWVUeXBlJiZyLm92ZXJyaWRlTWltZVR5cGUmJnIub3ZlcnJpZGVNaW1lVHlwZShpLm1pbWVUeXBlKSxpLmNyb3NzRG9tYWlufHxlW1wiWC1SZXF1ZXN0ZWQtV2l0aFwiXXx8KGVbXCJYLVJlcXVlc3RlZC1XaXRoXCJdPVwiWE1MSHR0cFJlcXVlc3RcIiksZSlyLnNldFJlcXVlc3RIZWFkZXIobixlW25dKTtvPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe28mJihvPWE9ci5vbmxvYWQ9ci5vbmVycm9yPXIub25hYm9ydD1yLm9udGltZW91dD1yLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLFwiYWJvcnRcIj09PWU/ci5hYm9ydCgpOlwiZXJyb3JcIj09PWU/XCJudW1iZXJcIiE9dHlwZW9mIHIuc3RhdHVzP3QoMCxcImVycm9yXCIpOnQoci5zdGF0dXMsci5zdGF0dXNUZXh0KTp0KFl0W3Iuc3RhdHVzXXx8ci5zdGF0dXMsci5zdGF0dXNUZXh0LFwidGV4dFwiIT09KHIucmVzcG9uc2VUeXBlfHxcInRleHRcIil8fFwic3RyaW5nXCIhPXR5cGVvZiByLnJlc3BvbnNlVGV4dD97YmluYXJ5OnIucmVzcG9uc2V9Ont0ZXh0OnIucmVzcG9uc2VUZXh0fSxyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSl9fSxyLm9ubG9hZD1vKCksYT1yLm9uZXJyb3I9ci5vbnRpbWVvdXQ9byhcImVycm9yXCIpLHZvaWQgMCE9PXIub25hYm9ydD9yLm9uYWJvcnQ9YTpyLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1yLnJlYWR5U3RhdGUmJmllLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtvJiZhKCl9KX0sbz1vKFwiYWJvcnRcIik7dHJ5e3Iuc2VuZChpLmhhc0NvbnRlbnQmJmkuZGF0YXx8bnVsbCl9Y2F0Y2goZSl7aWYobyl0aHJvdyBlfX0sYWJvcnQ6ZnVuY3Rpb24oKXtvJiZvKCl9fX0pLGNlLmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24oZSl7ZS5jcm9zc0RvbWFpbiYmKGUuY29udGVudHMuc2NyaXB0PSExKX0pLGNlLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OlwidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHRcIn0sY29udGVudHM6e3NjcmlwdDovXFxiKD86amF2YXxlY21hKXNjcmlwdFxcYi99LGNvbnZlcnRlcnM6e1widGV4dCBzY3JpcHRcIjpmdW5jdGlvbihlKXtyZXR1cm4gY2UuZ2xvYmFsRXZhbChlKSxlfX19KSxjZS5hamF4UHJlZmlsdGVyKFwic2NyaXB0XCIsZnVuY3Rpb24oZSl7dm9pZCAwPT09ZS5jYWNoZSYmKGUuY2FjaGU9ITEpLGUuY3Jvc3NEb21haW4mJihlLnR5cGU9XCJHRVRcIil9KSxjZS5hamF4VHJhbnNwb3J0KFwic2NyaXB0XCIsZnVuY3Rpb24obil7dmFyIHIsaTtpZihuLmNyb3NzRG9tYWlufHxuLnNjcmlwdEF0dHJzKXJldHVybntzZW5kOmZ1bmN0aW9uKGUsdCl7cj1jZShcIjxzY3JpcHQ+XCIpLmF0dHIobi5zY3JpcHRBdHRyc3x8e30pLnByb3Aoe2NoYXJzZXQ6bi5zY3JpcHRDaGFyc2V0LHNyYzpuLnVybH0pLm9uKFwibG9hZCBlcnJvclwiLGk9ZnVuY3Rpb24oZSl7ci5yZW1vdmUoKSxpPW51bGwsZSYmdChcImVycm9yXCI9PT1lLnR5cGU/NDA0OjIwMCxlLnR5cGUpfSksQy5oZWFkLmFwcGVuZENoaWxkKHJbMF0pfSxhYm9ydDpmdW5jdGlvbigpe2kmJmkoKX19fSk7dmFyIEp0LEt0PVtdLFp0PS8oPSlcXD8oPz0mfCQpfFxcP1xcPy87Y2UuYWpheFNldHVwKHtqc29ucDpcImNhbGxiYWNrXCIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPUt0LnBvcCgpfHxjZS5leHBhbmRvK1wiX1wiK2p0Lmd1aWQrKztyZXR1cm4gdGhpc1tlXT0hMCxlfX0pLGNlLmFqYXhQcmVmaWx0ZXIoXCJqc29uIGpzb25wXCIsZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhPSExIT09ZS5qc29ucCYmKFp0LnRlc3QoZS51cmwpP1widXJsXCI6XCJzdHJpbmdcIj09dHlwZW9mIGUuZGF0YSYmMD09PShlLmNvbnRlbnRUeXBlfHxcIlwiKS5pbmRleE9mKFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpJiZadC50ZXN0KGUuZGF0YSkmJlwiZGF0YVwiKTtpZihhfHxcImpzb25wXCI9PT1lLmRhdGFUeXBlc1swXSlyZXR1cm4gcj1lLmpzb25wQ2FsbGJhY2s9dihlLmpzb25wQ2FsbGJhY2spP2UuanNvbnBDYWxsYmFjaygpOmUuanNvbnBDYWxsYmFjayxhP2VbYV09ZVthXS5yZXBsYWNlKFp0LFwiJDFcIityKTohMSE9PWUuanNvbnAmJihlLnVybCs9KEF0LnRlc3QoZS51cmwpP1wiJlwiOlwiP1wiKStlLmpzb25wK1wiPVwiK3IpLGUuY29udmVydGVyc1tcInNjcmlwdCBqc29uXCJdPWZ1bmN0aW9uKCl7cmV0dXJuIG98fGNlLmVycm9yKHIrXCIgd2FzIG5vdCBjYWxsZWRcIiksb1swXX0sZS5kYXRhVHlwZXNbMF09XCJqc29uXCIsaT1pZVtyXSxpZVtyXT1mdW5jdGlvbigpe289YXJndW1lbnRzfSxuLmFsd2F5cyhmdW5jdGlvbigpe3ZvaWQgMD09PWk/Y2UoaWUpLnJlbW92ZVByb3Aocik6aWVbcl09aSxlW3JdJiYoZS5qc29ucENhbGxiYWNrPXQuanNvbnBDYWxsYmFjayxLdC5wdXNoKHIpKSxvJiZ2KGkpJiZpKG9bMF0pLG89aT12b2lkIDB9KSxcInNjcmlwdFwifSksbGUuY3JlYXRlSFRNTERvY3VtZW50PSgoSnQ9Qy5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoXCJcIikuYm9keSkuaW5uZXJIVE1MPVwiPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT5cIiwyPT09SnQuY2hpbGROb2Rlcy5sZW5ndGgpLGNlLnBhcnNlSFRNTD1mdW5jdGlvbihlLHQsbil7cmV0dXJuXCJzdHJpbmdcIiE9dHlwZW9mIGU/W106KFwiYm9vbGVhblwiPT10eXBlb2YgdCYmKG49dCx0PSExKSx0fHwobGUuY3JlYXRlSFRNTERvY3VtZW50Pygocj0odD1DLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudChcIlwiKSkuY3JlYXRlRWxlbWVudChcImJhc2VcIikpLmhyZWY9Qy5sb2NhdGlvbi5ocmVmLHQuaGVhZC5hcHBlbmRDaGlsZChyKSk6dD1DKSxvPSFuJiZbXSwoaT13LmV4ZWMoZSkpP1t0LmNyZWF0ZUVsZW1lbnQoaVsxXSldOihpPUFlKFtlXSx0LG8pLG8mJm8ubGVuZ3RoJiZjZShvKS5yZW1vdmUoKSxjZS5tZXJnZShbXSxpLmNoaWxkTm9kZXMpKSk7dmFyIHIsaSxvfSxjZS5mbi5sb2FkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYT10aGlzLHM9ZS5pbmRleE9mKFwiIFwiKTtyZXR1cm4tMTxzJiYocj1UdChlLnNsaWNlKHMpKSxlPWUuc2xpY2UoMCxzKSksdih0KT8obj10LHQ9dm9pZCAwKTp0JiZcIm9iamVjdFwiPT10eXBlb2YgdCYmKGk9XCJQT1NUXCIpLDA8YS5sZW5ndGgmJmNlLmFqYXgoe3VybDplLHR5cGU6aXx8XCJHRVRcIixkYXRhVHlwZTpcImh0bWxcIixkYXRhOnR9KS5kb25lKGZ1bmN0aW9uKGUpe289YXJndW1lbnRzLGEuaHRtbChyP2NlKFwiPGRpdj5cIikuYXBwZW5kKGNlLnBhcnNlSFRNTChlKSkuZmluZChyKTplKX0pLmFsd2F5cyhuJiZmdW5jdGlvbihlLHQpe2EuZWFjaChmdW5jdGlvbigpe24uYXBwbHkodGhpcyxvfHxbZS5yZXNwb25zZVRleHQsdCxlXSl9KX0pLHRoaXN9LGNlLmV4cHIucHNldWRvcy5hbmltYXRlZD1mdW5jdGlvbih0KXtyZXR1cm4gY2UuZ3JlcChjZS50aW1lcnMsZnVuY3Rpb24oZSl7cmV0dXJuIHQ9PT1lLmVsZW19KS5sZW5ndGh9LGNlLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbD1jZS5jc3MoZSxcInBvc2l0aW9uXCIpLGM9Y2UoZSksZj17fTtcInN0YXRpY1wiPT09bCYmKGUuc3R5bGUucG9zaXRpb249XCJyZWxhdGl2ZVwiKSxzPWMub2Zmc2V0KCksbz1jZS5jc3MoZSxcInRvcFwiKSx1PWNlLmNzcyhlLFwibGVmdFwiKSwoXCJhYnNvbHV0ZVwiPT09bHx8XCJmaXhlZFwiPT09bCkmJi0xPChvK3UpLmluZGV4T2YoXCJhdXRvXCIpPyhhPShyPWMucG9zaXRpb24oKSkudG9wLGk9ci5sZWZ0KTooYT1wYXJzZUZsb2F0KG8pfHwwLGk9cGFyc2VGbG9hdCh1KXx8MCksdih0KSYmKHQ9dC5jYWxsKGUsbixjZS5leHRlbmQoe30scykpKSxudWxsIT10LnRvcCYmKGYudG9wPXQudG9wLXMudG9wK2EpLG51bGwhPXQubGVmdCYmKGYubGVmdD10LmxlZnQtcy5sZWZ0K2kpLFwidXNpbmdcImluIHQ/dC51c2luZy5jYWxsKGUsZik6Yy5jc3MoZil9fSxjZS5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbih0KXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe2NlLm9mZnNldC5zZXRPZmZzZXQodGhpcyx0LGUpfSk7dmFyIGUsbixyPXRoaXNbMF07cmV0dXJuIHI/ci5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8oZT1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49ci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6ZS50b3Arbi5wYWdlWU9mZnNldCxsZWZ0OmUubGVmdCtuLnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH06dm9pZCAwfSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBlLHQsbixyPXRoaXNbMF0saT17dG9wOjAsbGVmdDowfTtpZihcImZpeGVkXCI9PT1jZS5jc3MocixcInBvc2l0aW9uXCIpKXQ9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle3Q9dGhpcy5vZmZzZXQoKSxuPXIub3duZXJEb2N1bWVudCxlPXIub2Zmc2V0UGFyZW50fHxuLmRvY3VtZW50RWxlbWVudDt3aGlsZShlJiYoZT09PW4uYm9keXx8ZT09PW4uZG9jdW1lbnRFbGVtZW50KSYmXCJzdGF0aWNcIj09PWNlLmNzcyhlLFwicG9zaXRpb25cIikpZT1lLnBhcmVudE5vZGU7ZSYmZSE9PXImJjE9PT1lLm5vZGVUeXBlJiYoKGk9Y2UoZSkub2Zmc2V0KCkpLnRvcCs9Y2UuY3NzKGUsXCJib3JkZXJUb3BXaWR0aFwiLCEwKSxpLmxlZnQrPWNlLmNzcyhlLFwiYm9yZGVyTGVmdFdpZHRoXCIsITApKX1yZXR1cm57dG9wOnQudG9wLWkudG9wLWNlLmNzcyhyLFwibWFyZ2luVG9wXCIsITApLGxlZnQ6dC5sZWZ0LWkubGVmdC1jZS5jc3MocixcIm1hcmdpbkxlZnRcIiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnQ7d2hpbGUoZSYmXCJzdGF0aWNcIj09PWNlLmNzcyhlLFwicG9zaXRpb25cIikpZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8Sn0pfX0pLGNlLmVhY2goe3Njcm9sbExlZnQ6XCJwYWdlWE9mZnNldFwiLHNjcm9sbFRvcDpcInBhZ2VZT2Zmc2V0XCJ9LGZ1bmN0aW9uKHQsaSl7dmFyIG89XCJwYWdlWU9mZnNldFwiPT09aTtjZS5mblt0XT1mdW5jdGlvbihlKXtyZXR1cm4gTSh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZih5KGUpP3I9ZTo5PT09ZS5ub2RlVHlwZSYmKHI9ZS5kZWZhdWx0Vmlldyksdm9pZCAwPT09bilyZXR1cm4gcj9yW2ldOmVbdF07cj9yLnNjcm9sbFRvKG8/ci5wYWdlWE9mZnNldDpuLG8/bjpyLnBhZ2VZT2Zmc2V0KTplW3RdPW59LHQsZSxhcmd1bWVudHMubGVuZ3RoKX19KSxjZS5lYWNoKFtcInRvcFwiLFwibGVmdFwiXSxmdW5jdGlvbihlLG4pe2NlLmNzc0hvb2tzW25dPVllKGxlLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oZSx0KXtpZih0KXJldHVybiB0PUdlKGUsbiksX2UudGVzdCh0KT9jZShlKS5wb3NpdGlvbigpW25dK1wicHhcIjp0fSl9KSxjZS5lYWNoKHtIZWlnaHQ6XCJoZWlnaHRcIixXaWR0aDpcIndpZHRoXCJ9LGZ1bmN0aW9uKGEscyl7Y2UuZWFjaCh7cGFkZGluZzpcImlubmVyXCIrYSxjb250ZW50OnMsXCJcIjpcIm91dGVyXCIrYX0sZnVuY3Rpb24ocixvKXtjZS5mbltvXT1mdW5jdGlvbihlLHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGgmJihyfHxcImJvb2xlYW5cIiE9dHlwZW9mIGUpLGk9cnx8KCEwPT09ZXx8ITA9PT10P1wibWFyZ2luXCI6XCJib3JkZXJcIik7cmV0dXJuIE0odGhpcyxmdW5jdGlvbihlLHQsbil7dmFyIHI7cmV0dXJuIHkoZSk/MD09PW8uaW5kZXhPZihcIm91dGVyXCIpP2VbXCJpbm5lclwiK2FdOmUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W1wiY2xpZW50XCIrYV06OT09PWUubm9kZVR5cGU/KHI9ZS5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoZS5ib2R5W1wic2Nyb2xsXCIrYV0scltcInNjcm9sbFwiK2FdLGUuYm9keVtcIm9mZnNldFwiK2FdLHJbXCJvZmZzZXRcIithXSxyW1wiY2xpZW50XCIrYV0pKTp2b2lkIDA9PT1uP2NlLmNzcyhlLHQsaSk6Y2Uuc3R5bGUoZSx0LG4saSl9LHMsbj9lOnZvaWQgMCxuKX19KX0pLGNlLmVhY2goW1wiYWpheFN0YXJ0XCIsXCJhamF4U3RvcFwiLFwiYWpheENvbXBsZXRlXCIsXCJhamF4RXJyb3JcIixcImFqYXhTdWNjZXNzXCIsXCJhamF4U2VuZFwiXSxmdW5jdGlvbihlLHQpe2NlLmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9uKHQsZSl9fSksY2UuZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vbihlLG51bGwsdCxuKX0sdW5iaW5kOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub2ZmKGUsbnVsbCx0KX0sZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMub24odCxlLG4scil9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihlLFwiKipcIik6dGhpcy5vZmYodCxlfHxcIioqXCIsbil9LGhvdmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub24oXCJtb3VzZWVudGVyXCIsZSkub24oXCJtb3VzZWxlYXZlXCIsdHx8ZSl9fSksY2UuZWFjaChcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnVcIi5zcGxpdChcIiBcIiksZnVuY3Rpb24oZSxuKXtjZS5mbltuXT1mdW5jdGlvbihlLHQpe3JldHVybiAwPGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vbihuLG51bGwsZSx0KTp0aGlzLnRyaWdnZXIobil9fSk7dmFyIGVuPS9eW1xcc1xcdUZFRkZcXHhBMF0rfChbXlxcc1xcdUZFRkZcXHhBMF0pW1xcc1xcdUZFRkZcXHhBMF0rJC9nO2NlLnByb3h5PWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpO2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0JiYobj1lW3RdLHQ9ZSxlPW4pLHYoZSkpcmV0dXJuIHI9YWUuY2FsbChhcmd1bWVudHMsMiksKGk9ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0fHx0aGlzLHIuY29uY2F0KGFlLmNhbGwoYXJndW1lbnRzKSkpfSkuZ3VpZD1lLmd1aWQ9ZS5ndWlkfHxjZS5ndWlkKyssaX0sY2UuaG9sZFJlYWR5PWZ1bmN0aW9uKGUpe2U/Y2UucmVhZHlXYWl0Kys6Y2UucmVhZHkoITApfSxjZS5pc0FycmF5PUFycmF5LmlzQXJyYXksY2UucGFyc2VKU09OPUpTT04ucGFyc2UsY2Uubm9kZU5hbWU9ZmUsY2UuaXNGdW5jdGlvbj12LGNlLmlzV2luZG93PXksY2UuY2FtZWxDYXNlPUYsY2UudHlwZT14LGNlLm5vdz1EYXRlLm5vdyxjZS5pc051bWVyaWM9ZnVuY3Rpb24oZSl7dmFyIHQ9Y2UudHlwZShlKTtyZXR1cm4oXCJudW1iZXJcIj09PXR8fFwic3RyaW5nXCI9PT10KSYmIWlzTmFOKGUtcGFyc2VGbG9hdChlKSl9LGNlLnRyaW09ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/XCJcIjooZStcIlwiKS5yZXBsYWNlKGVuLFwiJDFcIil9LFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKFwianF1ZXJ5XCIsW10sZnVuY3Rpb24oKXtyZXR1cm4gY2V9KTt2YXIgdG49aWUualF1ZXJ5LG5uPWllLiQ7cmV0dXJuIGNlLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGllLiQ9PT1jZSYmKGllLiQ9bm4pLGUmJmllLmpRdWVyeT09PWNlJiYoaWUualF1ZXJ5PXRuKSxjZX0sXCJ1bmRlZmluZWRcIj09dHlwZW9mIGUmJihpZS5qUXVlcnk9aWUuJD1jZSksY2V9KTtcbiIsIi8qKlxuICogQSBmYXN0ZXIgYWx0ZXJuYXRpdmUgdG8gYEZ1bmN0aW9uI2FwcGx5YCwgdGhpcyBmdW5jdGlvbiBpbnZva2VzIGBmdW5jYFxuICogd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgIGFuZCB0aGUgYXJndW1lbnRzIG9mIGBhcmdzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5KGZ1bmMsIHRoaXNBcmcsIGFyZ3MpIHtcbiAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnKTtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgfVxuICByZXR1cm4gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcHBseTtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnJlZHVjZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAgYXNcbiAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICBhY2N1bXVsYXRvciA9IGFycmF5WysraW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYWNjdW11bGF0b3IgPSBpdGVyYXRlZShhY2N1bXVsYXRvciwgYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheVJlZHVjZTtcbiIsIi8qKlxuICogQ29udmVydHMgYW4gQVNDSUkgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFzY2lpVG9BcnJheShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5zcGxpdCgnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNjaWlUb0FycmF5O1xuIiwiLyoqIFVzZWQgdG8gbWF0Y2ggd29yZHMgY29tcG9zZWQgb2YgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuICovXG52YXIgcmVBc2NpaVdvcmQgPSAvW15cXHgwMC1cXHgyZlxceDNhLVxceDQwXFx4NWItXFx4NjBcXHg3Yi1cXHg3Zl0rL2c7XG5cbi8qKlxuICogU3BsaXRzIGFuIEFTQ0lJIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAqL1xuZnVuY3Rpb24gYXNjaWlXb3JkcyhzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5tYXRjaChyZUFzY2lpV29yZCkgfHwgW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNjaWlXb3JkcztcbiIsInZhciBiYXNlQXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19iYXNlQXNzaWduVmFsdWUnKSxcbiAgICBlcSA9IHJlcXVpcmUoJy4vZXEnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBBc3NpZ25zIGB2YWx1ZWAgdG8gYGtleWAgb2YgYG9iamVjdGAgaWYgdGhlIGV4aXN0aW5nIHZhbHVlIGlzIG5vdCBlcXVpdmFsZW50XG4gKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgaWYgKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgZXEob2JqVmFsdWUsIHZhbHVlKSkgfHxcbiAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NpZ25WYWx1ZTtcbiIsInZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2RlZmluZVByb3BlcnR5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGFzc2lnblZhbHVlYCBhbmQgYGFzc2lnbk1lcmdlVmFsdWVgIHdpdGhvdXRcbiAqIHZhbHVlIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgPT0gJ19fcHJvdG9fXycgJiYgZGVmaW5lUHJvcGVydHkpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge1xuICAgICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgICAnZW51bWVyYWJsZSc6IHRydWUsXG4gICAgICAndmFsdWUnOiB2YWx1ZSxcbiAgICAgICd3cml0YWJsZSc6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUFzc2lnblZhbHVlO1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb2JqZWN0VG9TdHJpbmc7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmRleE9mYCB3aGljaCBwZXJmb3JtcyBzdHJpY3QgZXF1YWxpdHlcbiAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaWN0SW5kZXhPZjtcbiIsInZhciBvdmVyQXJnID0gcmVxdWlyZSgnLi9fb3ZlckFyZycpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlS2V5cyA9IG92ZXJBcmcoT2JqZWN0LmtleXMsIE9iamVjdCk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF0aXZlS2V5cztcbiIsInZhciBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKSxcbiAgICBvdmVyUmVzdCA9IHJlcXVpcmUoJy4vX292ZXJSZXN0JyksXG4gICAgc2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19zZXRUb1N0cmluZycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlc3RgIHdoaWNoIGRvZXNuJ3QgdmFsaWRhdGUgb3IgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUmVzdChmdW5jLCBzdGFydCkge1xuICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgc3RhcnQsIGlkZW50aXR5KSwgZnVuYyArICcnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUmVzdDtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2xpY2VgIHdpdGhvdXQgYW4gaXRlcmF0ZWUgY2FsbCBndWFyZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNsaWNlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAtc3RhcnQgPiBsZW5ndGggPyAwIDogKGxlbmd0aCArIHN0YXJ0KTtcbiAgfVxuICBlbmQgPSBlbmQgPiBsZW5ndGggPyBsZW5ndGggOiBlbmQ7XG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlbmd0aDtcbiAgfVxuICBsZW5ndGggPSBzdGFydCA+IGVuZCA/IDAgOiAoKGVuZCAtIHN0YXJ0KSA+Pj4gMCk7XG4gIHN0YXJ0ID4+Pj0gMDtcblxuICB2YXIgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gYXJyYXlbaW5kZXggKyBzdGFydF07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlU2xpY2U7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGl0IHJlY2VpdmVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICpcbiAqIGNvbnNvbGUubG9nKF8uaWRlbnRpdHkob2JqZWN0KSA9PT0gb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlkZW50aXR5O1xuIiwidmFyIGJhc2VTbGljZSA9IHJlcXVpcmUoJy4vX2Jhc2VTbGljZScpO1xuXG4vKipcbiAqIENhc3RzIGBhcnJheWAgdG8gYSBzbGljZSBpZiBpdCdzIG5lZWRlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHNsaWNlLlxuICovXG5mdW5jdGlvbiBjYXN0U2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBlbmQ7XG4gIHJldHVybiAoIXN0YXJ0ICYmIGVuZCA+PSBsZW5ndGgpID8gYXJyYXkgOiBiYXNlU2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RTbGljZTtcbiIsInZhciBhc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnblZhbHVlJyksXG4gICAgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyk7XG5cbi8qKlxuICogQ29waWVzIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29waWVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlPYmplY3Qoc291cmNlLCBwcm9wcywgb2JqZWN0LCBjdXN0b21pemVyKSB7XG4gIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gIG9iamVjdCB8fCAob2JqZWN0ID0ge30pO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcblxuICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgID8gY3VzdG9taXplcihvYmplY3Rba2V5XSwgc291cmNlW2tleV0sIGtleSwgb2JqZWN0LCBzb3VyY2UpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXdWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgICBpZiAoaXNOZXcpIHtcbiAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlPYmplY3Q7XG4iLCJ2YXIgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGlzSXRlcmF0ZWVDYWxsID0gcmVxdWlyZSgnLi9faXNJdGVyYXRlZUNhbGwnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5hc3NpZ25gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25lciBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFzc2lnbmVyIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVBc3NpZ25lcihhc3NpZ25lcikge1xuICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2VzKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoLFxuICAgICAgICBjdXN0b21pemVyID0gbGVuZ3RoID4gMSA/IHNvdXJjZXNbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQsXG4gICAgICAgIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICBjdXN0b21pemVyID0gKGFzc2lnbmVyLmxlbmd0aCA+IDMgJiYgdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJylcbiAgICAgID8gKGxlbmd0aC0tLCBjdXN0b21pemVyKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgICBjdXN0b21pemVyID0gbGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IGN1c3RvbWl6ZXI7XG4gICAgICBsZW5ndGggPSAxO1xuICAgIH1cbiAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICBhc3NpZ25lcihvYmplY3QsIHNvdXJjZSwgaW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0O1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVBc3NpZ25lcjtcbiIsInZhciBjYXN0U2xpY2UgPSByZXF1aXJlKCcuL19jYXN0U2xpY2UnKSxcbiAgICBoYXNVbmljb2RlID0gcmVxdWlyZSgnLi9faGFzVW5pY29kZScpLFxuICAgIHN0cmluZ1RvQXJyYXkgPSByZXF1aXJlKCcuL19zdHJpbmdUb0FycmF5JyksXG4gICAgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ubG93ZXJGaXJzdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgU3RyaW5nYCBjYXNlIG1ldGhvZCB0byB1c2UuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXNlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcblxuICAgIHZhciBzdHJTeW1ib2xzID0gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICA/IHN0cmluZ1RvQXJyYXkoc3RyaW5nKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICB2YXIgY2hyID0gc3RyU3ltYm9sc1xuICAgICAgPyBzdHJTeW1ib2xzWzBdXG4gICAgICA6IHN0cmluZy5jaGFyQXQoMCk7XG5cbiAgICB2YXIgdHJhaWxpbmcgPSBzdHJTeW1ib2xzXG4gICAgICA/IGNhc3RTbGljZShzdHJTeW1ib2xzLCAxKS5qb2luKCcnKVxuICAgICAgOiBzdHJpbmcuc2xpY2UoMSk7XG5cbiAgICByZXR1cm4gY2hyW21ldGhvZE5hbWVdKCkgKyB0cmFpbGluZztcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVDYXNlRmlyc3Q7XG4iLCJ2YXIgYXJyYXlSZWR1Y2UgPSByZXF1aXJlKCcuL19hcnJheVJlZHVjZScpLFxuICAgIGRlYnVyciA9IHJlcXVpcmUoJy4vZGVidXJyJyksXG4gICAgd29yZHMgPSByZXF1aXJlKCcuL3dvcmRzJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc0Fwb3MgPSBcIlsnXFx1MjAxOV1cIjtcblxuLyoqIFVzZWQgdG8gbWF0Y2ggYXBvc3Ryb3BoZXMuICovXG52YXIgcmVBcG9zID0gUmVnRXhwKHJzQXBvcywgJ2cnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5jYW1lbENhc2VgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gY29tYmluZSBlYWNoIHdvcmQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3VuZGVyIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVDb21wb3VuZGVyKGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICByZXR1cm4gYXJyYXlSZWR1Y2Uod29yZHMoZGVidXJyKHN0cmluZykucmVwbGFjZShyZUFwb3MsICcnKSksIGNhbGxiYWNrLCAnJyk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQ29tcG91bmRlcjtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIHZhciBmdW5jID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2RlZmluZVByb3BlcnR5Jyk7XG4gICAgZnVuYyh7fSwgJycsIHt9KTtcbiAgICByZXR1cm4gZnVuYztcbiAgfSBjYXRjaCAoZSkge31cbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lUHJvcGVydHk7XG4iLCIvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZyZWVHbG9iYWw7XG4iLCIvKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRWYWx1ZTtcbiIsInZhciBvdmVyQXJnID0gcmVxdWlyZSgnLi9fb3ZlckFyZycpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBnZXRQcm90b3R5cGUgPSBvdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZiwgT2JqZWN0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRQcm90b3R5cGU7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIHVzaW5nIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvYmplY3RUb1N0cmluZztcbiIsIi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbnZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZSxcbiAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZic7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB3aXRoIFt6ZXJvLXdpZHRoIGpvaW5lcnMgb3IgY29kZSBwb2ludHMgZnJvbSB0aGUgYXN0cmFsIHBsYW5lc10oaHR0cDovL2Vldi5lZS9ibG9nLzIwMTUvMDkvMTIvZGFyay1jb3JuZXJzLW9mLXVuaWNvZGUvKS4gKi9cbnZhciByZUhhc1VuaWNvZGUgPSBSZWdFeHAoJ1snICsgcnNaV0ogKyByc0FzdHJhbFJhbmdlICArIHJzQ29tYm9SYW5nZSArIHJzVmFyUmFuZ2UgKyAnXScpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBVbmljb2RlIHN5bWJvbHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgc3ltYm9sIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc1VuaWNvZGUoc3RyaW5nKSB7XG4gIHJldHVybiByZUhhc1VuaWNvZGUudGVzdChzdHJpbmcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc1VuaWNvZGU7XG4iLCIvKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB0aGF0IG5lZWQgYSBtb3JlIHJvYnVzdCByZWdleHAgdG8gbWF0Y2ggd29yZHMuICovXG52YXIgcmVIYXNVbmljb2RlV29yZCA9IC9bYS16XVtBLVpdfFtBLVpdezJ9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBhIHdvcmQgY29tcG9zZWQgb2YgVW5pY29kZSBzeW1ib2xzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhIHdvcmQgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSB7XG4gIHJldHVybiByZUhhc1VuaWNvZGVXb3JkLnRlc3Qoc3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNVbmljb2RlV29yZDtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLnN0dWJGYWxzZSk7XG4gKiAvLyA9PiBbZmFsc2UsIGZhbHNlXVxuICovXG5mdW5jdGlvbiBzdHViRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViRmFsc2U7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICogLy8gPT4gW2ZhbHNlLCBmYWxzZV1cbiAqL1xuZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R1YkZhbHNlO1xuIiwiLyoqXG4gKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlckFyZztcbiIsInZhciBhcHBseSA9IHJlcXVpcmUoJy4vX2FwcGx5Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCB0cmFuc2Zvcm1zIHRoZSByZXN0IGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSByZXN0IGFycmF5IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyUmVzdChmdW5jLCBzdGFydCwgdHJhbnNmb3JtKSB7XG4gIHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0ID09PSB1bmRlZmluZWQgPyAoZnVuYy5sZW5ndGggLSAxKSA6IHN0YXJ0LCAwKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBzdGFydCwgMCksXG4gICAgICAgIGFycmF5ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhcnJheVtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdO1xuICAgIH1cbiAgICBpbmRleCA9IC0xO1xuICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpO1xuICAgIHdoaWxlICgrK2luZGV4IDwgc3RhcnQpIHtcbiAgICAgIG90aGVyQXJnc1tpbmRleF0gPSBhcmdzW2luZGV4XTtcbiAgICB9XG4gICAgb3RoZXJBcmdzW3N0YXJ0XSA9IHRyYW5zZm9ybShhcnJheSk7XG4gICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlclJlc3Q7XG4iLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJvb3Q7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGl0IHJlY2VpdmVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICpcbiAqIGNvbnNvbGUubG9nKF8uaWRlbnRpdHkob2JqZWN0KSA9PT0gb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlkZW50aXR5O1xuIiwidmFyIGFzY2lpVG9BcnJheSA9IHJlcXVpcmUoJy4vX2FzY2lpVG9BcnJheScpLFxuICAgIGhhc1VuaWNvZGUgPSByZXF1aXJlKCcuL19oYXNVbmljb2RlJyksXG4gICAgdW5pY29kZVRvQXJyYXkgPSByZXF1aXJlKCcuL191bmljb2RlVG9BcnJheScpO1xuXG4vKipcbiAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBzdHJpbmdUb0FycmF5KHN0cmluZykge1xuICByZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgPyB1bmljb2RlVG9BcnJheShzdHJpbmcpXG4gICAgOiBhc2NpaVRvQXJyYXkoc3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmdUb0FycmF5O1xuIiwiLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNoYXJhY3RlciBjbGFzc2VzLiAqL1xudmFyIHJzQXN0cmFsUmFuZ2UgPSAnXFxcXHVkODAwLVxcXFx1ZGZmZicsXG4gICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgcmVDb21ib0hhbGZNYXJrc1JhbmdlID0gJ1xcXFx1ZmUyMC1cXFxcdWZlMmYnLFxuICAgIHJzQ29tYm9TeW1ib2xzUmFuZ2UgPSAnXFxcXHUyMGQwLVxcXFx1MjBmZicsXG4gICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgIHJzVmFyUmFuZ2UgPSAnXFxcXHVmZTBlXFxcXHVmZTBmJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xudmFyIHJzQXN0cmFsID0gJ1snICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc0NvbWJvID0gJ1snICsgcnNDb21ib1JhbmdlICsgJ10nLFxuICAgIHJzRml0eiA9ICdcXFxcdWQ4M2NbXFxcXHVkZmZiLVxcXFx1ZGZmZl0nLFxuICAgIHJzTW9kaWZpZXIgPSAnKD86JyArIHJzQ29tYm8gKyAnfCcgKyByc0ZpdHogKyAnKScsXG4gICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc1JlZ2lvbmFsID0gJyg/OlxcXFx1ZDgzY1tcXFxcdWRkZTYtXFxcXHVkZGZmXSl7Mn0nLFxuICAgIHJzU3VyclBhaXIgPSAnW1xcXFx1ZDgwMC1cXFxcdWRiZmZdW1xcXFx1ZGMwMC1cXFxcdWRmZmZdJyxcbiAgICByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbnZhciByZU9wdE1vZCA9IHJzTW9kaWZpZXIgKyAnPycsXG4gICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICByc09wdEpvaW4gPSAnKD86JyArIHJzWldKICsgJyg/OicgKyBbcnNOb25Bc3RyYWwsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzT3B0VmFyICsgcmVPcHRNb2QgKyAnKSonLFxuICAgIHJzU2VxID0gcnNPcHRWYXIgKyByZU9wdE1vZCArIHJzT3B0Sm9pbixcbiAgICByc1N5bWJvbCA9ICcoPzonICsgW3JzTm9uQXN0cmFsICsgcnNDb21ibyArICc/JywgcnNDb21ibywgcnNSZWdpb25hbCwgcnNTdXJyUGFpciwgcnNBc3RyYWxdLmpvaW4oJ3wnKSArICcpJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggW3N0cmluZyBzeW1ib2xzXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlKS4gKi9cbnZhciByZVVuaWNvZGUgPSBSZWdFeHAocnNGaXR6ICsgJyg/PScgKyByc0ZpdHogKyAnKXwnICsgcnNTeW1ib2wgKyByc1NlcSwgJ2cnKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIFVuaWNvZGUgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIHVuaWNvZGVUb0FycmF5KHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLm1hdGNoKHJlVW5pY29kZSkgfHwgW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdW5pY29kZVRvQXJyYXk7XG4iLCIvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG52YXIgcnNBc3RyYWxSYW5nZSA9ICdcXFxcdWQ4MDAtXFxcXHVkZmZmJyxcbiAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgcnNDb21ib1N5bWJvbHNSYW5nZSA9ICdcXFxcdTIwZDAtXFxcXHUyMGZmJyxcbiAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgcnNEaW5nYmF0UmFuZ2UgPSAnXFxcXHUyNzAwLVxcXFx1MjdiZicsXG4gICAgcnNMb3dlclJhbmdlID0gJ2EtelxcXFx4ZGYtXFxcXHhmNlxcXFx4ZjgtXFxcXHhmZicsXG4gICAgcnNNYXRoT3BSYW5nZSA9ICdcXFxceGFjXFxcXHhiMVxcXFx4ZDdcXFxceGY3JyxcbiAgICByc05vbkNoYXJSYW5nZSA9ICdcXFxceDAwLVxcXFx4MmZcXFxceDNhLVxcXFx4NDBcXFxceDViLVxcXFx4NjBcXFxceDdiLVxcXFx4YmYnLFxuICAgIHJzUHVuY3R1YXRpb25SYW5nZSA9ICdcXFxcdTIwMDAtXFxcXHUyMDZmJyxcbiAgICByc1NwYWNlUmFuZ2UgPSAnIFxcXFx0XFxcXHgwYlxcXFxmXFxcXHhhMFxcXFx1ZmVmZlxcXFxuXFxcXHJcXFxcdTIwMjhcXFxcdTIwMjlcXFxcdTE2ODBcXFxcdTE4MGVcXFxcdTIwMDBcXFxcdTIwMDFcXFxcdTIwMDJcXFxcdTIwMDNcXFxcdTIwMDRcXFxcdTIwMDVcXFxcdTIwMDZcXFxcdTIwMDdcXFxcdTIwMDhcXFxcdTIwMDlcXFxcdTIwMGFcXFxcdTIwMmZcXFxcdTIwNWZcXFxcdTMwMDAnLFxuICAgIHJzVXBwZXJSYW5nZSA9ICdBLVpcXFxceGMwLVxcXFx4ZDZcXFxceGQ4LVxcXFx4ZGUnLFxuICAgIHJzVmFyUmFuZ2UgPSAnXFxcXHVmZTBlXFxcXHVmZTBmJyxcbiAgICByc0JyZWFrUmFuZ2UgPSByc01hdGhPcFJhbmdlICsgcnNOb25DaGFyUmFuZ2UgKyByc1B1bmN0dWF0aW9uUmFuZ2UgKyByc1NwYWNlUmFuZ2U7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc0Fwb3MgPSBcIlsnXFx1MjAxOV1cIixcbiAgICByc0JyZWFrID0gJ1snICsgcnNCcmVha1JhbmdlICsgJ10nLFxuICAgIHJzQ29tYm8gPSAnWycgKyByc0NvbWJvUmFuZ2UgKyAnXScsXG4gICAgcnNEaWdpdHMgPSAnXFxcXGQrJyxcbiAgICByc0RpbmdiYXQgPSAnWycgKyByc0RpbmdiYXRSYW5nZSArICddJyxcbiAgICByc0xvd2VyID0gJ1snICsgcnNMb3dlclJhbmdlICsgJ10nLFxuICAgIHJzTWlzYyA9ICdbXicgKyByc0FzdHJhbFJhbmdlICsgcnNCcmVha1JhbmdlICsgcnNEaWdpdHMgKyByc0RpbmdiYXRSYW5nZSArIHJzTG93ZXJSYW5nZSArIHJzVXBwZXJSYW5nZSArICddJyxcbiAgICByc0ZpdHogPSAnXFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdJyxcbiAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgIHJzTm9uQXN0cmFsID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNSZWdpb25hbCA9ICcoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9JyxcbiAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgcnNVcHBlciA9ICdbJyArIHJzVXBwZXJSYW5nZSArICddJyxcbiAgICByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbnZhciByc01pc2NMb3dlciA9ICcoPzonICsgcnNMb3dlciArICd8JyArIHJzTWlzYyArICcpJyxcbiAgICByc01pc2NVcHBlciA9ICcoPzonICsgcnNVcHBlciArICd8JyArIHJzTWlzYyArICcpJyxcbiAgICByc09wdENvbnRyTG93ZXIgPSAnKD86JyArIHJzQXBvcyArICcoPzpkfGxsfG18cmV8c3x0fHZlKSk/JyxcbiAgICByc09wdENvbnRyVXBwZXIgPSAnKD86JyArIHJzQXBvcyArICcoPzpEfExMfE18UkV8U3xUfFZFKSk/JyxcbiAgICByZU9wdE1vZCA9IHJzTW9kaWZpZXIgKyAnPycsXG4gICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICByc09wdEpvaW4gPSAnKD86JyArIHJzWldKICsgJyg/OicgKyBbcnNOb25Bc3RyYWwsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzT3B0VmFyICsgcmVPcHRNb2QgKyAnKSonLFxuICAgIHJzT3JkTG93ZXIgPSAnXFxcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxcXGR0aCkoPz1cXFxcYnxbQS1aX10pJyxcbiAgICByc09yZFVwcGVyID0gJ1xcXFxkKig/OjFTVHwyTkR8M1JEfCg/IVsxMjNdKVxcXFxkVEgpKD89XFxcXGJ8W2Etel9dKScsXG4gICAgcnNTZXEgPSByc09wdFZhciArIHJlT3B0TW9kICsgcnNPcHRKb2luLFxuICAgIHJzRW1vamkgPSAnKD86JyArIFtyc0RpbmdiYXQsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzU2VxO1xuXG4vKiogVXNlZCB0byBtYXRjaCBjb21wbGV4IG9yIGNvbXBvdW5kIHdvcmRzLiAqL1xudmFyIHJlVW5pY29kZVdvcmQgPSBSZWdFeHAoW1xuICByc1VwcGVyICsgJz8nICsgcnNMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlciArICcoPz0nICsgW3JzQnJlYWssIHJzVXBwZXIsICckJ10uam9pbignfCcpICsgJyknLFxuICByc01pc2NVcHBlciArICcrJyArIHJzT3B0Q29udHJVcHBlciArICcoPz0nICsgW3JzQnJlYWssIHJzVXBwZXIgKyByc01pc2NMb3dlciwgJyQnXS5qb2luKCd8JykgKyAnKScsXG4gIHJzVXBwZXIgKyAnPycgKyByc01pc2NMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlcixcbiAgcnNVcHBlciArICcrJyArIHJzT3B0Q29udHJVcHBlcixcbiAgcnNPcmRVcHBlcixcbiAgcnNPcmRMb3dlcixcbiAgcnNEaWdpdHMsXG4gIHJzRW1vamlcbl0uam9pbignfCcpLCAnZycpO1xuXG4vKipcbiAqIFNwbGl0cyBhIFVuaWNvZGUgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICovXG5mdW5jdGlvbiB1bmljb2RlV29yZHMoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlV29yZCkgfHwgW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdW5pY29kZVdvcmRzO1xuIiwidmFyIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAgY3JlYXRlQXNzaWduZXIgPSByZXF1aXJlKCcuL19jcmVhdGVBc3NpZ25lcicpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgb3duIGFuZFxuICogaW5oZXJpdGVkIHNvdXJjZSBwcm9wZXJ0aWVzLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBhbGlhcyBleHRlbmRcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBzZWUgXy5hc3NpZ25cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIEJhcigpIHtcbiAqICAgdGhpcy5jID0gMztcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmIgPSAyO1xuICogQmFyLnByb3RvdHlwZS5kID0gNDtcbiAqXG4gKiBfLmFzc2lnbkluKHsgJ2EnOiAwIH0sIG5ldyBGb28sIG5ldyBCYXIpO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzLCAnZCc6IDQgfVxuICovXG52YXIgYXNzaWduSW4gPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSkge1xuICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBhc3NpZ25JbjtcbiIsInZhciBjYXBpdGFsaXplID0gcmVxdWlyZSgnLi9jYXBpdGFsaXplJyksXG4gICAgY3JlYXRlQ29tcG91bmRlciA9IHJlcXVpcmUoJy4vX2NyZWF0ZUNvbXBvdW5kZXInKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBbY2FtZWwgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2FtZWxDYXNlKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY2FtZWwgY2FzZWQgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmNhbWVsQ2FzZSgnRm9vIEJhcicpO1xuICogLy8gPT4gJ2Zvb0JhcidcbiAqXG4gKiBfLmNhbWVsQ2FzZSgnLS1mb28tYmFyLS0nKTtcbiAqIC8vID0+ICdmb29CYXInXG4gKlxuICogXy5jYW1lbENhc2UoJ19fRk9PX0JBUl9fJyk7XG4gKiAvLyA9PiAnZm9vQmFyJ1xuICovXG52YXIgY2FtZWxDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gIHdvcmQgPSB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyBjYXBpdGFsaXplKHdvcmQpIDogd29yZCk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBjYW1lbENhc2U7XG4iLCJ2YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyksXG4gICAgdXBwZXJGaXJzdCA9IHJlcXVpcmUoJy4vdXBwZXJGaXJzdCcpO1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AgdG8gdXBwZXIgY2FzZSBhbmQgdGhlIHJlbWFpbmluZ1xuICogdG8gbG93ZXIgY2FzZS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjYXBpdGFsaXplLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY2FwaXRhbGl6ZWQgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmNhcGl0YWxpemUoJ0ZSRUQnKTtcbiAqIC8vID0+ICdGcmVkJ1xuICovXG5mdW5jdGlvbiBjYXBpdGFsaXplKHN0cmluZykge1xuICByZXR1cm4gdXBwZXJGaXJzdCh0b1N0cmluZyhzdHJpbmcpLnRvTG93ZXJDYXNlKCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhcGl0YWxpemU7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgbm93ID0gcmVxdWlyZSgnLi9ub3cnKSxcbiAgICB0b051bWJlciA9IHJlcXVpcmUoJy4vdG9OdW1iZXInKTtcblxuLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4LFxuICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWJvdW5jZWQgZnVuY3Rpb24gdGhhdCBkZWxheXMgaW52b2tpbmcgYGZ1bmNgIHVudGlsIGFmdGVyIGB3YWl0YFxuICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gKiBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYCBtZXRob2QgdG8gY2FuY2VsXG4gKiBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0byBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS5cbiAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICogbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZFxuICogd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbi4gU3Vic2VxdWVudFxuICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAqIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8uZGVib3VuY2VgIGFuZCBgXy50aHJvdHRsZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWJvdW5jZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPWZhbHNlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXYWl0XVxuICogIFRoZSBtYXhpbXVtIHRpbWUgYGZ1bmNgIGlzIGFsbG93ZWQgdG8gYmUgZGVsYXllZCBiZWZvcmUgaXQncyBpbnZva2VkLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBkZWJvdW5jZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGNvc3RseSBjYWxjdWxhdGlvbnMgd2hpbGUgdGhlIHdpbmRvdyBzaXplIGlzIGluIGZsdXguXG4gKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICpcbiAqIC8vIEludm9rZSBgc2VuZE1haWxgIHdoZW4gY2xpY2tlZCwgZGVib3VuY2luZyBzdWJzZXF1ZW50IGNhbGxzLlxuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICogICAnbGVhZGluZyc6IHRydWUsXG4gKiAgICd0cmFpbGluZyc6IGZhbHNlXG4gKiB9KSk7XG4gKlxuICogLy8gRW5zdXJlIGBiYXRjaExvZ2AgaXMgaW52b2tlZCBvbmNlIGFmdGVyIDEgc2Vjb25kIG9mIGRlYm91bmNlZCBjYWxscy5cbiAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICogdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL3N0cmVhbScpO1xuICogalF1ZXJ5KHNvdXJjZSkub24oJ21lc3NhZ2UnLCBkZWJvdW5jZWQpO1xuICpcbiAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgZGVib3VuY2VkIGludm9jYXRpb24uXG4gKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCBkZWJvdW5jZWQuY2FuY2VsKTtcbiAqL1xuZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICB2YXIgbGFzdEFyZ3MsXG4gICAgICBsYXN0VGhpcyxcbiAgICAgIG1heFdhaXQsXG4gICAgICByZXN1bHQsXG4gICAgICB0aW1lcklkLFxuICAgICAgbGFzdENhbGxUaW1lLFxuICAgICAgbGFzdEludm9rZVRpbWUgPSAwLFxuICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgbWF4aW5nID0gZmFsc2UsXG4gICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAhIW9wdGlvbnMubGVhZGluZztcbiAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0O1xuICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHtcbiAgICB2YXIgYXJncyA9IGxhc3RBcmdzLFxuICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci5cbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIC8vIEludm9rZSB0aGUgbGVhZGluZyBlZGdlLlxuICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsXG4gICAgICAgIHRpbWVXYWl0aW5nID0gd2FpdCAtIHRpbWVTaW5jZUxhc3RDYWxsO1xuXG4gICAgcmV0dXJuIG1heGluZ1xuICAgICAgPyBuYXRpdmVNaW4odGltZVdhaXRpbmcsIG1heFdhaXQgLSB0aW1lU2luY2VMYXN0SW52b2tlKVxuICAgICAgOiB0aW1lV2FpdGluZztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3VsZEludm9rZSh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuICAgIC8vIEVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCBhY3Rpdml0eSBoYXMgc3RvcHBlZCBhbmQgd2UncmUgYXQgdGhlXG4gICAgLy8gdHJhaWxpbmcgZWRnZSwgdGhlIHN5c3RlbSB0aW1lIGhhcyBnb25lIGJhY2t3YXJkcyBhbmQgd2UncmUgdHJlYXRpbmdcbiAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG4gICAgcmV0dXJuIChsYXN0Q2FsbFRpbWUgPT09IHVuZGVmaW5lZCB8fCAodGltZVNpbmNlTGFzdENhbGwgPj0gd2FpdCkgfHxcbiAgICAgICh0aW1lU2luY2VMYXN0Q2FsbCA8IDApIHx8IChtYXhpbmcgJiYgdGltZVNpbmNlTGFzdEludm9rZSA+PSBtYXhXYWl0KSk7XG4gIH1cblxuICBmdW5jdGlvbiB0aW1lckV4cGlyZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKTtcbiAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG4gICAgICByZXR1cm4gdHJhaWxpbmdFZGdlKHRpbWUpO1xuICAgIH1cbiAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHJlbWFpbmluZ1dhaXQodGltZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcbiAgICB0aW1lcklkID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gT25seSBpbnZva2UgaWYgd2UgaGF2ZSBgbGFzdEFyZ3NgIHdoaWNoIG1lYW5zIGBmdW5jYCBoYXMgYmVlblxuICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuICAgIGlmICh0cmFpbGluZyAmJiBsYXN0QXJncykge1xuICAgICAgcmV0dXJuIGludm9rZUZ1bmModGltZSk7XG4gICAgfVxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICBpZiAodGltZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgfVxuICAgIGxhc3RJbnZva2VUaW1lID0gMDtcbiAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93KCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVib3VuY2VkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCksXG4gICAgICAgIGlzSW52b2tpbmcgPSBzaG91bGRJbnZva2UodGltZSk7XG5cbiAgICBsYXN0QXJncyA9IGFyZ3VtZW50cztcbiAgICBsYXN0VGhpcyA9IHRoaXM7XG4gICAgbGFzdENhbGxUaW1lID0gdGltZTtcblxuICAgIGlmIChpc0ludm9raW5nKSB7XG4gICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBsZWFkaW5nRWRnZShsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgICAgaWYgKG1heGluZykge1xuICAgICAgICAvLyBIYW5kbGUgaW52b2NhdGlvbnMgaW4gYSB0aWdodCBsb29wLlxuICAgICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgIHJldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7XG4gIHJldHVybiBkZWJvdW5jZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVib3VuY2U7XG4iLCJ2YXIgYmFzZVRvU3RyaW5nID0gcmVxdWlyZSgnLi9fYmFzZVRvU3RyaW5nJyk7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZy4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGZvciBgbnVsbGBcbiAqIGFuZCBgdW5kZWZpbmVkYCB2YWx1ZXMuIFRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b1N0cmluZyhudWxsKTtcbiAqIC8vID0+ICcnXG4gKlxuICogXy50b1N0cmluZygtMCk7XG4gKiAvLyA9PiAnLTAnXG4gKlxuICogXy50b1N0cmluZyhbMSwgMiwgM10pO1xuICogLy8gPT4gJzEsMiwzJ1xuICovXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogYmFzZVRvU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1N0cmluZztcbiIsIi8qKlxuICogUGVyZm9ybXMgYVxuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAqXG4gKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKCdhJywgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKE5hTiwgTmFOKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gZXEodmFsdWUsIG90aGVyKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgKHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Fzc2lnbkluJyk7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGl0IHJlY2VpdmVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICpcbiAqIGNvbnNvbGUubG9nKF8uaWRlbnRpdHkob2JqZWN0KSA9PT0gb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlkZW50aXR5O1xuIiwidmFyIGJhc2VJbmRleE9mID0gcmVxdWlyZSgnLi9fYmFzZUluZGV4T2YnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5jbHVkZXNgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogc3BlY2lmeWluZyBhbiBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksIHZhbHVlKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgMCkgPiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUluY2x1ZGVzO1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEzLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRpbWVzKDIsIF8uc3R1YkZhbHNlKTtcbiAqIC8vID0+IFtmYWxzZSwgZmFsc2VdXG4gKi9cbmZ1bmN0aW9uIHN0dWJGYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0dWJGYWxzZTtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXk7XG4iLCJ2YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5TGlrZTtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLnN0dWJGYWxzZSk7XG4gKiAvLyA9PiBbZmFsc2UsIGZhbHNlXVxuICovXG5mdW5jdGlvbiBzdHViRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViRmFsc2U7XG4iLCJ2YXIgYmFzZUtleXMgPSByZXF1aXJlKCcuL19iYXNlS2V5cycpLFxuICAgIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGVtcHR5IG9iamVjdCwgY29sbGVjdGlvbiwgbWFwLCBvciBzZXQuXG4gKlxuICogT2JqZWN0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgbm8gb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkXG4gKiBwcm9wZXJ0aWVzLlxuICpcbiAqIEFycmF5LWxpa2UgdmFsdWVzIHN1Y2ggYXMgYGFyZ3VtZW50c2Agb2JqZWN0cywgYXJyYXlzLCBidWZmZXJzLCBzdHJpbmdzLCBvclxuICogalF1ZXJ5LWxpa2UgY29sbGVjdGlvbnMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYGxlbmd0aGAgb2YgYDBgLlxuICogU2ltaWxhcmx5LCBtYXBzIGFuZCBzZXRzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBhIGBzaXplYCBvZiBgMGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZW1wdHksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0VtcHR5KG51bGwpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNFbXB0eSh0cnVlKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRW1wdHkoMSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0VtcHR5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNFbXB0eSh7ICdhJzogMSB9KTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaXNBcnJheUxpa2UodmFsdWUpICYmXG4gICAgICAoaXNBcnJheSh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZS5zcGxpY2UgPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICBpc0J1ZmZlcih2YWx1ZSkgfHwgaXNUeXBlZEFycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkpKSB7XG4gICAgcmV0dXJuICF2YWx1ZS5sZW5ndGg7XG4gIH1cbiAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSk7XG4gIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICByZXR1cm4gIXZhbHVlLnNpemU7XG4gIH1cbiAgaWYgKGlzUHJvdG90eXBlKHZhbHVlKSkge1xuICAgIHJldHVybiAhYmFzZUtleXModmFsdWUpLmxlbmd0aDtcbiAgfVxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0VtcHR5O1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhc3luY1RhZyA9ICdbb2JqZWN0IEFzeW5jRnVuY3Rpb25dJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHByb3h5VGFnID0gJ1tvYmplY3QgUHJveHldJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oXyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gIC8vIGluIFNhZmFyaSA5IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5cyBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnIHx8IHRhZyA9PSBhc3luY1RhZyB8fCB0YWcgPT0gcHJveHlUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGdW5jdGlvbjtcbiIsIi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBsZW5ndGguXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0xlbmd0aCgzKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aCgnMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJlxuICAgIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0xlbmd0aDtcbiIsInZhciBpc051bWJlciA9IHJlcXVpcmUoJy4vaXNOdW1iZXInKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgTmFOYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAqIFtgTnVtYmVyLmlzTmFOYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzTmFOKSBhbmQgaXMgbm90IHRoZSBzYW1lIGFzXG4gKiBnbG9iYWwgW2Bpc05hTmBdKGh0dHBzOi8vbWRuLmlvL2lzTmFOKSB3aGljaCByZXR1cm5zIGB0cnVlYCBmb3JcbiAqIGB1bmRlZmluZWRgIGFuZCBvdGhlciBub24tbnVtYmVyIHZhbHVlcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTmFOKE5hTik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc05hTihuZXcgTnVtYmVyKE5hTikpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIGlzTmFOKHVuZGVmaW5lZCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc05hTih1bmRlZmluZWQpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOYU4odmFsdWUpIHtcbiAgLy8gQW4gYE5hTmAgcHJpbWl0aXZlIGlzIHRoZSBvbmx5IHZhbHVlIHRoYXQgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi5cbiAgLy8gUGVyZm9ybSB0aGUgYHRvU3RyaW5nVGFnYCBjaGVjayBmaXJzdCB0byBhdm9pZCBlcnJvcnMgd2l0aCBzb21lXG4gIC8vIEFjdGl2ZVggb2JqZWN0cyBpbiBJRS5cbiAgcmV0dXJuIGlzTnVtYmVyKHZhbHVlKSAmJiB2YWx1ZSAhPSArdmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNOYU47XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBOdW1iZXJgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogKipOb3RlOioqIFRvIGV4Y2x1ZGUgYEluZmluaXR5YCwgYC1JbmZpbml0eWAsIGFuZCBgTmFOYCwgd2hpY2ggYXJlXG4gKiBjbGFzc2lmaWVkIGFzIG51bWJlcnMsIHVzZSB0aGUgYF8uaXNGaW5pdGVgIG1ldGhvZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG51bWJlciwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTnVtYmVyKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNOdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcignMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IG51bWJlclRhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNOdW1iZXI7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0TGlrZTtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGdldFByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2dldFByb3RvdHlwZScpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBVc2VkIHRvIGluZmVyIHRoZSBgT2JqZWN0YCBjb25zdHJ1Y3Rvci4gKi9cbnZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgdGhhdCBpcywgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlXG4gKiBgT2JqZWN0YCBjb25zdHJ1Y3RvciBvciBvbmUgd2l0aCBhIGBbW1Byb3RvdHlwZV1dYCBvZiBgbnVsbGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjguMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogfVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChuZXcgRm9vKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgfHwgYmFzZUdldFRhZyh2YWx1ZSkgIT0gb2JqZWN0VGFnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwcm90byA9IGdldFByb3RvdHlwZSh2YWx1ZSk7XG4gIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gIHJldHVybiB0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmXG4gICAgZnVuY1RvU3RyaW5nLmNhbGwoQ3RvcikgPT0gb2JqZWN0Q3RvclN0cmluZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1BsYWluT2JqZWN0O1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEzLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRpbWVzKDIsIF8uc3R1YkZhbHNlKTtcbiAqIC8vID0+IFtmYWxzZSwgZmFsc2VdXG4gKi9cbmZ1bmN0aW9uIHN0dWJGYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0dWJGYWxzZTtcbiIsIi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlXG4gKiBbYE9iamVjdC5rZXlzYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gKiBleGNlcHQgdGhhdCBpdCBpbmNsdWRlcyBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBuYXRpdmVLZXlzSW4ob2JqZWN0KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgaWYgKG9iamVjdCAhPSBudWxsKSB7XG4gICAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUtleXNJbjtcbiIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKipcbiAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IERhdGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICogfSwgXy5ub3coKSk7XG4gKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICovXG52YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiByb290LkRhdGUubm93KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5vdztcbiIsInZhciBkZWJvdW5jZSA9IHJlcXVpcmUoJy4vZGVib3VuY2UnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGZ1bmN0aW9uIHRoYXQgb25seSBpbnZva2VzIGBmdW5jYCBhdCBtb3N0IG9uY2UgcGVyXG4gKiBldmVyeSBgd2FpdGAgbWlsbGlzZWNvbmRzLiBUaGUgdGhyb3R0bGVkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYFxuICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0b1xuICogaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgXG4gKiBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGUgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgXG4gKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlXG4gKiB0aHJvdHRsZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBmdW5jdGlvbiByZXR1cm4gdGhlXG4gKiByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aHJvdHRsZSBpbnZvY2F0aW9ucyB0by5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB0aHJvdHRsZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGV4Y2Vzc2l2ZWx5IHVwZGF0aW5nIHRoZSBwb3NpdGlvbiB3aGlsZSBzY3JvbGxpbmcuXG4gKiBqUXVlcnkod2luZG93KS5vbignc2Nyb2xsJywgXy50aHJvdHRsZSh1cGRhdGVQb3NpdGlvbiwgMTAwKSk7XG4gKlxuICogLy8gSW52b2tlIGByZW5ld1Rva2VuYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgYnV0IG5vdCBtb3JlIHRoYW4gb25jZSBldmVyeSA1IG1pbnV0ZXMuXG4gKiB2YXIgdGhyb3R0bGVkID0gXy50aHJvdHRsZShyZW5ld1Rva2VuLCAzMDAwMDAsIHsgJ3RyYWlsaW5nJzogZmFsc2UgfSk7XG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIHRocm90dGxlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG4gIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7XG4gICAgJ2xlYWRpbmcnOiBsZWFkaW5nLFxuICAgICdtYXhXYWl0Jzogd2FpdCxcbiAgICAndHJhaWxpbmcnOiB0cmFpbGluZ1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0aHJvdHRsZTtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKlxuICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaWRlbnRpdHk7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGl0IHJlY2VpdmVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICpcbiAqIGNvbnNvbGUubG9nKF8uaWRlbnRpdHkob2JqZWN0KSA9PT0gb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlkZW50aXR5O1xuIiwidmFyIGNyZWF0ZUNhc2VGaXJzdCA9IHJlcXVpcmUoJy4vX2NyZWF0ZUNhc2VGaXJzdCcpO1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AgdG8gdXBwZXIgY2FzZS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy51cHBlckZpcnN0KCdmcmVkJyk7XG4gKiAvLyA9PiAnRnJlZCdcbiAqXG4gKiBfLnVwcGVyRmlyc3QoJ0ZSRUQnKTtcbiAqIC8vID0+ICdGUkVEJ1xuICovXG52YXIgdXBwZXJGaXJzdCA9IGNyZWF0ZUNhc2VGaXJzdCgndG9VcHBlckNhc2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB1cHBlckZpcnN0O1xuIiwidmFyIGFzY2lpV29yZHMgPSByZXF1aXJlKCcuL19hc2NpaVdvcmRzJyksXG4gICAgaGFzVW5pY29kZVdvcmQgPSByZXF1aXJlKCcuL19oYXNVbmljb2RlV29yZCcpLFxuICAgIHRvU3RyaW5nID0gcmVxdWlyZSgnLi90b1N0cmluZycpLFxuICAgIHVuaWNvZGVXb3JkcyA9IHJlcXVpcmUoJy4vX3VuaWNvZGVXb3JkcycpO1xuXG4vKipcbiAqIFNwbGl0cyBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBbcGF0dGVybl0gVGhlIHBhdHRlcm4gdG8gbWF0Y2ggd29yZHMuXG4gKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcyddXG4gKlxuICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnLCAvW14sIF0rL2cpO1xuICogLy8gPT4gWydmcmVkJywgJ2Jhcm5leScsICcmJywgJ3BlYmJsZXMnXVxuICovXG5mdW5jdGlvbiB3b3JkcyhzdHJpbmcsIHBhdHRlcm4sIGd1YXJkKSB7XG4gIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gIHBhdHRlcm4gPSBndWFyZCA/IHVuZGVmaW5lZCA6IHBhdHRlcm47XG5cbiAgaWYgKHBhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBoYXNVbmljb2RlV29yZChzdHJpbmcpID8gdW5pY29kZVdvcmRzKHN0cmluZykgOiBhc2NpaVdvcmRzKHN0cmluZyk7XG4gIH1cbiAgcmV0dXJuIHN0cmluZy5tYXRjaChwYXR0ZXJuKSB8fCBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3b3JkcztcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vYWJzJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGguYWJzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9mbG9vcicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBNYXRoLmZsb29yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9pc05hTicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gaXNOYU4oYSkge1xuXHRyZXR1cm4gYSAhPT0gYTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL21heCcpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBNYXRoLm1heDtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vbWluJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgubWluO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9wb3cnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gTWF0aC5wb3c7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3JvdW5kJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgucm91bmQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciAkaXNOYU4gPSByZXF1aXJlKCcuL2lzTmFOJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3NpZ24nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2lnbihudW1iZXIpIHtcblx0aWYgKCRpc05hTihudW1iZXIpIHx8IG51bWJlciA9PT0gMCkge1xuXHRcdHJldHVybiBudW1iZXI7XG5cdH1cblx0cmV0dXJuIG51bWJlciA8IDAgPyAtMSA6ICsxO1xufTtcbiIsIihmdW5jdGlvbihyb290KXtcInVzZSBzdHJpY3RcIjt2YXIgY3NzPVwiLm5hbm9iYXJ7d2lkdGg6MTAwJTtoZWlnaHQ6NHB4O3otaW5kZXg6OTk5OTt0b3A6MH0uYmFye3dpZHRoOjA7aGVpZ2h0OjEwMCU7dHJhbnNpdGlvbjpoZWlnaHQgLjNzO2JhY2tncm91bmQ6IzAwMH1cIjtmdW5jdGlvbiBhZGRDc3MoKXt2YXIgcz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm5hbm9iYXJjc3NcIik7aWYocz09PW51bGwpe3M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO3MudHlwZT1cInRleHQvY3NzXCI7cy5pZD1cIm5hbm9iYXJjc3NcIjtkb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShzLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk7aWYoIXMuc3R5bGVTaGVldClyZXR1cm4gcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtzLnN0eWxlU2hlZXQuY3NzVGV4dD1jc3N9fWZ1bmN0aW9uIGFkZENsYXNzKGVsLGNscyl7aWYoZWwuY2xhc3NMaXN0KWVsLmNsYXNzTGlzdC5hZGQoY2xzKTtlbHNlIGVsLmNsYXNzTmFtZSs9XCIgXCIrY2xzfWZ1bmN0aW9uIGNyZWF0ZUJhcihybSl7dmFyIGVsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksd2lkdGg9MCxoZXJlPTAsb249MCxiYXI9e2VsOmVsLGdvOmdvfTthZGRDbGFzcyhlbCxcImJhclwiKTtmdW5jdGlvbiBtb3ZlKCl7dmFyIGRpc3Q9d2lkdGgtaGVyZTtpZihkaXN0PC4xJiZkaXN0Pi0uMSl7cGxhY2UoaGVyZSk7b249MDtpZih3aWR0aD09PTEwMCl7ZWwuc3R5bGUuaGVpZ2h0PTA7c2V0VGltZW91dChmdW5jdGlvbigpe3JtKGVsKX0sMzAwKX19ZWxzZXtwbGFjZSh3aWR0aC1kaXN0LzQpO3NldFRpbWVvdXQoZ28sMTYpfX1mdW5jdGlvbiBwbGFjZShudW0pe3dpZHRoPW51bTtlbC5zdHlsZS53aWR0aD13aWR0aCtcIiVcIn1mdW5jdGlvbiBnbyhudW0pe2lmKG51bT49MCl7aGVyZT1udW07aWYoIW9uKXtvbj0xO21vdmUoKX19ZWxzZSBpZihvbil7bW92ZSgpfX1yZXR1cm4gYmFyfWZ1bmN0aW9uIE5hbm9iYXIob3B0cyl7b3B0cz1vcHRzfHx7fTt2YXIgZWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxhcHBseUdvLG5hbm9iYXI9e2VsOmVsLGdvOmZ1bmN0aW9uKHApe2FwcGx5R28ocCk7aWYocD09PTEwMCl7aW5pdCgpfX19O2Z1bmN0aW9uIHJtKGNoaWxkKXtlbC5yZW1vdmVDaGlsZChjaGlsZCl9ZnVuY3Rpb24gaW5pdCgpe3ZhciBiYXI9Y3JlYXRlQmFyKHJtKTtlbC5hcHBlbmRDaGlsZChiYXIuZWwpO2FwcGx5R289YmFyLmdvfWFkZENzcygpO2FkZENsYXNzKGVsLFwibmFub2JhclwiKTtpZihvcHRzLmlkKWVsLmlkPW9wdHMuaWQ7aWYob3B0cy5jbGFzc25hbWUpYWRkQ2xhc3MoZWwsb3B0cy5jbGFzc25hbWUpO2lmKG9wdHMudGFyZ2V0KXtlbC5zdHlsZS5wb3NpdGlvbj1cInJlbGF0aXZlXCI7b3B0cy50YXJnZXQuaW5zZXJ0QmVmb3JlKGVsLG9wdHMudGFyZ2V0LmZpcnN0Q2hpbGQpfWVsc2V7ZWwuc3R5bGUucG9zaXRpb249XCJmaXhlZFwiO2RvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKVswXS5hcHBlbmRDaGlsZChlbCl9aW5pdCgpO3JldHVybiBuYW5vYmFyfWlmKHR5cGVvZiBleHBvcnRzPT09XCJvYmplY3RcIil7bW9kdWxlLmV4cG9ydHM9TmFub2Jhcn1lbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT1cImZ1bmN0aW9uXCImJmRlZmluZS5hbWQpe2RlZmluZShbXSxmdW5jdGlvbigpe3JldHVybiBOYW5vYmFyfSl9ZWxzZXtyb290Lk5hbm9iYXI9TmFub2Jhcn19KSh0aGlzKTsiLCJcbi8qKlxuICpcbiAqXG4gKiBub2Qgdi4yLjAuMTJcbiAqIEdvcm0gQ2FzcGVyXG4gKlxuICpcbiAqXG4gKiBUaGlzIGlzIGEgc2hvcnQgYnJlYWtkb3duIG9mIHRoZSBjb2RlIHRvIGhlbHAgeW91IGZpbmQgeW91ciB3YXkgYXJvdW5kLlxuICpcbiAqXG4gKiBBbiBgZWxlbWVudGAgYWx3YXlzIHJlZmVyIHRvIHNvbWUgaW5wdXQgZWxlbWVudCBkZWZpbmVkIGJ5IHRoZSB1c2VyIHZpYSB0aGVcbiAqIGBzZWxlY3RvcmAga2V5LlxuICpcbiAqIEEgYG1ldHJpY2AgaXMgdGhlIHVzZXIgY3JlYXRlZCBvYmplY3RzIHRoYXQgaXMgdXNlZCB0byBhZGQgY2hlY2tzIHRvXG4gKiBub2QuXG4gKlxuICogRWFjaCBgZWxlbWVudGAgd2lsbCBoYXZlIGF0IG1vc3Qgb25lIG9mIGEgYGxpc3RlbmVyYCwgYSBgY2hlY2tlcmAsIGFcbiAqIGBjaGVja0hhbmRsZXJgLCBhbmQgYSBgZG9tTm9kZWAgXCJhdHRhY2hlZFwiIHRvIGl0LiBUaGUgYGxpc3RlbmVyYCBsaXN0ZW5zXG4gKiBmb3IgaW5wdXRzIG9yIGNoYW5nZXMgdG8gdGhlIGBlbGVtZW50YCBhbmQgcGFzc2VzIHRoZSBuZXcgdmFsdWUgb24gdG8gdG8gdGhlXG4gKiBgY2hlY2tlcmAgd2hpY2ggcGVyZm9ybXMgaXRzIGNoZWNrcyBhbmQgcGFzc2VzIHRoZSB0aGUgcmVzdWx0cyBvbiB0byB0aGVcbiAqIGBjaGVja0hhbmRsZXJgIHdoaWNoIGNhbGN1bGF0ZXMgdGhlIG5ldyBzdGF0ZSBvZiB0aGUgYGVsZW1lbnRgIHdoaWNoIGl0XG4gKiBwYXNzZXMgb24gdG8gdGhlIGBkb21Ob2RlYCB3aGljaCB3aWxsIHVwZGF0ZSB0aGUgZG9tLlxuICpcbiAqIFRoZSBmb3VyIG1haW4gcGFydHMsIHRoZSBsaXN0ZW5lciwgdGhlIGNoZWNrZXIsIHRoZSBjaGVja0hhbmRsZXIsIGFuZCB0aGVcbiAqIGRvbU5vZGUgYWxsIGNvbW11bmljYXRlIHRocm91Z2ggdGhlIGBtZWRpYXRvcmAgYnkgZmlyaW5nIGV2ZW50cyBpZGVudGlmaWVkXG4gKiBieSBhIHVuaXF1ZSBpZC4gVGhleSBkbyBub3Qga25vdyBvZiBlYWNoIG90aGVyJ3MgZXhpc3RhbmNlLCBhbmQgc28gbm9cbiAqIGNvbW11bmljYXRpb24gZmxvd3MgZGlyZWN0bHkgYmV0d2VlbiB0aGVtLlxuICpcbiAqIEFsbCBsaXN0ZW5lcnMsIGNoZWNrZXJzLCBoYW5kbGVycywgYW5kIGRvbU5vZGVzIGFyZSBncm91cGVkIHRvZ2V0aGVyIGluXG4gKiBgY29sbGVjdGlvbnNgLCB3aGljaCBhcmUgYmFzaWNhbGx5IGEgZ2xvcmlmaWVkIGFycmF5IHRoYXQgbWFrZXMgaXQgZWFzeVxuICogbm90IHRvIGdldCBkdXBsaWNhdGUgaXRlbXMgZm9yIGVhY2ggZWxlbWVudCAoZm9yIGluc3RhbmNlIHR3byBsaXN0ZW5lcnNcbiAqIGxpc3RlbmluZyB0byB0aGUgc2FtZSBlbGVtZW50KS5cbiAqXG4gKiBUaGUgY29tbXVuaWNhdGlvbiBmbG93IGxvb2tzIGxpa2UgdGhpczpcbiAqIGxpc3RlbmVyIC0+IGNoZWNrZXIgLT4gY2hlY2tIYW5kbGVyIC0+IGRvbU5vZGVcbiAqXG4gKiBCZXR3ZWVuIGVhY2ggcGFydCwgeW91IGhhdmUgdGhlIG1lZGlhdG9yLlxuICpcbiAqXG4gKiBgTWV0cmljc2AgYXJlIGFkZGVkIGJ5IHRoZSB1c2VyLCB3aGljaCBzZXRzIHVwIHRoZSBzeXN0ZW0gYWJvdmUuIE5vdGljZVxuICogdGhhdCBhIG1ldHJpYyBjYW4gdGFyZ2V0IG11bHRpcGxlIGVsZW1lbnRzIGF0IG9uY2UsIGFuZCB0aGF0IHRoZXJlIGNhblxuICogYmUgb3ZlcmxhcHMuIE9uZSBtZXRyaWMgZGVmaW5pdGVseSBkb2VzIG5vdCBlcXVhbCBvbmUgZWxlbWVudCBvciBvbmVcbiAqIGNoZWNrLlxuICpcbiAqL1xuXG5mdW5jdGlvbiBub2QgKGNvbmZpZykge1xuICAgIHZhciBmb3JtLFxuICAgICAgICBjb25maWd1cmF0aW9uICAgPSB7fSxcbiAgICAgICAgbWVkaWF0b3IgICAgICAgID0gbm9kLm1ha2VNZWRpYXRvcigpLFxuICAgICAgICBldmVudEVtaXR0ZXIgICAgPSBub2QubWFrZUV2ZW50RW1pdHRlcihtZWRpYXRvciksXG5cbiAgICAgICAgLy8gQ3JlYXRpbmcgKGVtcHR5KSBjb2xsZWN0aW9uc1xuICAgICAgICBsaXN0ZW5lcnMgICAgICAgPSBub2QubWFrZUNvbGxlY3Rpb24obm9kLm1ha2VMaXN0ZW5lciksXG4gICAgICAgIGNoZWNrZXJzICAgICAgICA9IG5vZC5tYWtlQ29sbGVjdGlvbihub2QubWFrZUNoZWNrZXIpLFxuICAgICAgICBjaGVja0hhbmRsZXJzICAgPSBub2QubWFrZUNvbGxlY3Rpb24obm9kLm1ha2VDaGVja0hhbmRsZXIpLFxuICAgICAgICBkb21Ob2RlcyAgICAgICAgPSBub2QubWFrZUNvbGxlY3Rpb24obm9kLm1ha2VEb21Ob2RlKTtcblxuICAgIC8qKlxuICAgICAqIEVudHJ5IHBvaW50IGZvciB0aGUgdXNlci4gVGhlIHVzZXIgcGFzc2VzIGluIGFuIGFycmF5IG9mIG1ldHJpY3MgKGFuXG4gICAgICogb2JqZWN0IGNvbnRhaW5pbmcgYSBzZWxlY3RvciwgYSB2YWxpZGF0ZSBzdHJpbmcvZnVuY3Rpb24sIGV0Yy4pIGFuZCBpdFxuICAgICAqIGdldHMgcHJvY2Vzc2VkIGZyb20gaGVyZS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24sIGlzIG1vc3RseSBhYm91dCBjbGVhbmluZyB1cCB3aGF0IHRoZSB1c2VyIHBhc3NlZCB1cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhZGRNZXRyaWNzIChtZXRyaWNzKSB7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgZGVhbGluZyB3aXRoIGFuIGFycmF5IG9mIG1ldHJpY3MuXG4gICAgICAgIHZhciBhcnJheU1ldHJpY3MgPSBBcnJheS5pc0FycmF5KG1ldHJpY3MpID8gbWV0cmljcyA6IFttZXRyaWNzXTtcblxuICAgICAgICBhcnJheU1ldHJpY3MuZm9yRWFjaChmdW5jdGlvbiAobWV0cmljKSB7XG4gICAgICAgICAgICB2YXIgdmFsaWRhdGVBcnJheSwgZXJyb3JNZXNzYWdlQXJyYXksXG4gICAgICAgICAgICAgICAgbm90QXJyYXkgPSAhQXJyYXkuaXNBcnJheShtZXRyaWMudmFsaWRhdGUpO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgJ3ZhbGlkYXRlJyBpcyBub3QgYW4gYXJyYXksIHRoZW4gd2UncmUgZ29vZCB0byBnby5cbiAgICAgICAgICAgIGlmIChub3RBcnJheSkge1xuICAgICAgICAgICAgICAgIGFkZE1ldHJpYyhtZXRyaWMpO1xuXG4gICAgICAgICAgICAvLyBJZiBpdCBpcyBhbiBhcnJheSAoZS5nLiwgdmFsaWRhdGU6IFsnZW1haWwnLCAnbWF4LWxlbmd0aDoxMCddKSxcbiAgICAgICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBzcGxpdCB0aGVtIHVwIGludG8gbXVsdGlwbGUgbWV0cmljcywgYW5kIGFkZFxuICAgICAgICAgICAgLy8gdGhlbSBpbmRpdmlkdWFsbHkuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShtZXRyaWMuZXJyb3JNZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3JNc2cgPSAnSWYgeW91IHBhc3MgaW4gYHZhbGlkYXRlOi4uLmAgYXMgYW4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnIGFycmF5LCB0aGVuIGBlcnJvck1lc3NhZ2U6Li4uYCBhbHNvIG5lZWRzIHRvIGJlIGFuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyBhcnJheS4gXCInICsgbWV0cmljLnZhbGlkYXRlICsgJ1wiLCBhbmQgXCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpYy5lcnJvck1lc3NhZ2UgKyAnXCInO1xuXG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGVycm9yTXNnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBXZSBzdG9yZSBlYWNoIGFzIGFycmF5cywgYW5kIHRoZW4gcnVuIHRocm91Z2ggdGhlbSxcbiAgICAgICAgICAgICAgICAvLyBvdmVyd3JpdGluZyBlYWNoIG9mIHRoZSBrZXlzIGFjY29yZGluZ2x5LlxuICAgICAgICAgICAgICAgIHZhbGlkYXRlQXJyYXkgICAgID0gbWV0cmljLnZhbGlkYXRlO1xuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZUFycmF5ID0gbWV0cmljLmVycm9yTWVzc2FnZTtcblxuICAgICAgICAgICAgICAgIHZhbGlkYXRlQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAodmFsaWRhdGUsIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gT3ZlcndyaXRlIHRoZSBhcnJheSB3aXRoIHRoZSBpbmRpdmlkdWFsICd2YWxpZGF0ZScgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vICdlcnJvck1lc3NhZ2UnLlxuICAgICAgICAgICAgICAgICAgICBtZXRyaWMudmFsaWRhdGUgICAgID0gdmFsaWRhdGU7XG4gICAgICAgICAgICAgICAgICAgIG1ldHJpYy5lcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2VBcnJheVtpXTtcblxuICAgICAgICAgICAgICAgICAgICBhZGRNZXRyaWMobWV0cmljKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkTWV0cmljIChtZXRyaWMpIHtcbiAgICAgICAgdmFyIHNwZWNpYWxUcmlnZ2VycyA9IFtdLFxuXG4gICAgICAgICAgICAvLyBUaGUgZnVuY3Rpb24gdGhhdCB3aWxsIGNoZWNrIHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudC5cbiAgICAgICAgICAgIGNoZWNrRnVuY3Rpb24gPSBub2QuZ2V0Q2hlY2tGdW5jdGlvbihtZXRyaWMpLFxuXG4gICAgICAgICAgICAvLyBBIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCB0aGlzIG1ldHJpYyB3aWxsIHRhcmdldC5cbiAgICAgICAgICAgIGVsZW1lbnRzID0gbm9kLmdldEVsZW1lbnRzKG1ldHJpYy5zZWxlY3RvciksXG5cbiAgICAgICAgICAgIC8vIEEgXCJzZXRcIiBoZXJlLCByZWZlcnMgdG8gYW4gb2JqIHdpdGggb25lIGxpc3RlbmVyLCBvbmUgY2hlY2tlcixcbiAgICAgICAgICAgIC8vIGFuZCBvbmUgY2hlY2tIYW5kbGVyLiBPbmx5IGV2ZXJ5IG9uZSBmb3IgZWFjaCBlbGVtZW50IGluIHRoZVxuICAgICAgICAgICAgLy8gZG9tLlxuICAgICAgICAgICAgbWV0cmljU2V0cyA9IGVsZW1lbnRzLm1hcChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyOiAgICAgICBsaXN0ZW5lcnMuZmluZE9yTWFrZShlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWF0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWMudHJpZ2dlckV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24pLFxuICAgICAgICAgICAgICAgICAgICBjaGVja2VyOiAgICAgICAgY2hlY2tlcnMuZmluZE9yTWFrZShlbGVtZW50LCBtZWRpYXRvciksXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrSGFuZGxlcjogICBjaGVja0hhbmRsZXJzLmZpbmRPck1ha2UoZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgZG9tTm9kZTogICAgICAgIGRvbU5vZGVzLmZpbmRPck1ha2UoZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWF0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24pXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNhdmVkIGZvciBsYXRlciByZWZlcmVuY2UgaW4gY2FzZSB0aGUgdXNlciBoYXMgYSBgdGFwYCBmdW5jdGlvblxuICAgICAgICAvLyBkZWZpbmVkLlxuICAgICAgICBjaGVja0Z1bmN0aW9uLnZhbGlkYXRlID0gKHR5cGVvZiBtZXRyaWMudmFsaWRhdGUgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICA/IG1ldHJpYy52YWxpZGF0ZS50b1N0cmluZygpXG4gICAgICAgICAgICA6IG1ldHJpYy52YWxpZGF0ZTtcblxuICAgICAgICAvLyBTcGVjaWFsIGNhc2VzLiBUaGVzZSBgdmFsaWRhdGVzYCBhZmZlY3QgZWFjaCBvdGhlciwgYW5kIHRoZWlyIHN0YXRlXG4gICAgICAgIC8vIG5lZWRzIHRvIHVwZGF0ZSBlYWNoIHRpbWUgZWl0aGVyIG9mIHRoZSBlbGVtZW50cycgdmFsdWVzIGNoYW5nZS5cbiAgICAgICAgaWYgKG1ldHJpYy52YWxpZGF0ZSA9PT0gJ29uZS1vZidcbiAgICAgICAgICAgIHx8IG1ldHJpYy52YWxpZGF0ZSA9PT0gJ29ubHktb25lLW9mJ1xuICAgICAgICAgICAgfHwgbWV0cmljLnZhbGlkYXRlID09PSAnc29tZS1yYWRpbycpIHtcbiAgICAgICAgICAgIHNwZWNpYWxUcmlnZ2Vycy5wdXNoKG1ldHJpYy5zZWxlY3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIG1ldHJpYy52YWxpZGF0ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICYmIG1ldHJpYy52YWxpZGF0ZS5pbmRleE9mKCdzYW1lLWFzJykgPiAtMSkge1xuICAgICAgICAgICAgc3BlY2lhbFRyaWdnZXJzLnB1c2gobWV0cmljLnZhbGlkYXRlLnNwbGl0KCc6JylbMV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9uLCB1c2VkIGluIHRoZSBsb29wIGJlbG93LlxuICAgICAgICBmdW5jdGlvbiBzdWJzY3JpYmVUb1RyaWdnZXJzIChjaGVja2VyLCBzZWxlY3Rvcikge1xuICAgICAgICAgICAgdmFyIHRyaWdnZXJFbGVtZW50cyA9IG5vZC5nZXRFbGVtZW50cyhzZWxlY3Rvcik7XG5cbiAgICAgICAgICAgIHRyaWdnZXJFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzLmZpbmRPck1ha2UoZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24pO1xuXG4gICAgICAgICAgICAgICAgY2hlY2tlci5zdWJzY3JpYmVUbyhsaXN0ZW5lci5pZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhlcmUgd2Ugc2V0IHVwIHRoZSBcImNvbm5lY3Rpb25zXCIgYmV0d2VlbiBlYWNoIG9mIG91ciBtYWluIHBhcnRzLlxuICAgICAgICAvLyBUaGV5IGNvbW11bmljYXRlIG9ubHkgdGhyb3VnaCB0aGUgbWVkaWF0b3IuXG4gICAgICAgIG1ldHJpY1NldHMuZm9yRWFjaChmdW5jdGlvbiAobWV0cmljU2V0KSB7XG4gICAgICAgICAgICAvLyA6OiBMaXN0ZW5lciAtPiBDaGVja2VyXG5cbiAgICAgICAgICAgIC8vIFdlIHdhbnQgb3VyIGNoZWNrZXIgdG8gbGlzdGVuIHRvIHRoZSBsaXN0ZW5lci4gQSBsaXN0ZW5lciBoYXMgYW5cbiAgICAgICAgICAgIC8vIGlkLCB3aGljaCBpdCB1c2VzIHdoZW4gaXQgZmlyZXMgZXZlbnRzIHRvIHRoZSBtZWRpYXRvciAod2hpY2hcbiAgICAgICAgICAgIC8vIHdhcyBzZXQgdXAgd2hlbiB0aGUgbGlzdGVuZXIgd2FzIGNyZWF0ZWQpLlxuICAgICAgICAgICAgbWV0cmljU2V0LmNoZWNrZXIuc3Vic2NyaWJlVG8obWV0cmljU2V0Lmxpc3RlbmVyLmlkKTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIHVzZXIgc2V0IGEgYHRyaWdnZXJlZEJ5YCwgdGhlIGNoZWNrZXIgbmVlZCB0byBsaXN0ZW4gdG9cbiAgICAgICAgICAgIC8vIGNoYW5nZXMgb24gdGhpcyBlbGVtZW50IGFzIHdlbGwuXG4gICAgICAgICAgICAvLyBTYW1lIGdvZXMgZm9yIHNwZWNpYWwgdHJpZ2dlcnMgdGhhdCB3ZSBzZXQuXG4gICAgICAgICAgICBzdWJzY3JpYmVUb1RyaWdnZXJzKG1ldHJpY1NldC5jaGVja2VyLCBtZXRyaWMudHJpZ2dlcmVkQnkpO1xuICAgICAgICAgICAgc3Vic2NyaWJlVG9UcmlnZ2VycyhtZXRyaWNTZXQuY2hlY2tlciwgc3BlY2lhbFRyaWdnZXJzKTtcblxuICAgICAgICAgICAgLy8gOjogQ2hlY2tlciAtPiBjaGVja0hhbmRsZXJcblxuICAgICAgICAgICAgdmFyIGNoZWNrSWQgPSBub2QudW5pcXVlKCk7XG5cbiAgICAgICAgICAgIC8vIFdlIGFkZCB0aGUgY2hlY2sgZnVuY3Rpb24gYXMgb25lIHRvIGJlIGNoZWNrZWQgd2hlbiB0aGUgdXNlclxuICAgICAgICAgICAgLy8gaW5wdXRzIHNvbWV0aGluZy4gKFRoZXJlIG1pZ2h0IGJlIG1vcmUgdGhhbiB0aGlzIG9uZSkuXG4gICAgICAgICAgICBtZXRyaWNTZXQuY2hlY2tlci5hZGRDaGVjayhjaGVja0Z1bmN0aW9uLCBjaGVja0lkKTtcblxuICAgICAgICAgICAgLy8gV2Ugd2FudCB0aGUgY2hlY2sgaGFuZGxlciB0byBsaXN0ZW4gZm9yIHJlc3VsdHMgZnJvbSB0aGUgY2hlY2tlclxuICAgICAgICAgICAgbWV0cmljU2V0LmNoZWNrSGFuZGxlci5zdWJzY3JpYmVUbyhjaGVja0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWMuZXJyb3JNZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWMuZGVmYXVsdFN0YXR1cyk7XG5cbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uLm5vRG9tKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRFbWl0dGVyLnN1YnNjcmliZShtZXRyaWNTZXQuY2hlY2tIYW5kbGVyLmlkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gOjogY2hlY2tIYW5kbGVyIC0+IGRvbU5vZGVcblxuICAgICAgICAgICAgICAgIC8vIFRoZSBjaGVja0hhbmRsZXIgaGFzIGl0cyBvd24gaWQgKGFuZCBvbmx5IGV2ZXIgbmVlZHMgb25lKSwgc29cbiAgICAgICAgICAgICAgICAvLyB3ZSBqdXN0IGFzayB0aGUgZG9tTm9kZSB0byBsaXN0ZW4gZm9yIHRoYXQuXG4gICAgICAgICAgICAgICAgbWV0cmljU2V0LmRvbU5vZGUuc3Vic2NyaWJlVG8obWV0cmljU2V0LmNoZWNrSGFuZGxlci5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFmdGVyIGFsbCBpcyBkb25lLCB3ZSBtYXkgaGF2ZSB0byBlbmFibGUvZGlzYWJsZSBhIHN1Ym1pdCBidXR0b24uXG4gICAgICAgIHRvZ2dsZVN1Ym1pdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIGEgZm9ybSBpcyBhZGRlZCwgd2UgbGlzdGVuIGZvciBzdWJtaXRzLCBhbmQgaWYgdGhlIGhhcyBhbHNvIHNldFxuICAgICAqIGBwcmV2ZW50U3VibWl0YCBpbiB0aGUgY29uZmlndXJhdGlvbiwgdGhlbiB3ZSBzdG9wIHRoZSBjb21taXQgZnJvbVxuICAgICAqIGhhcHBlbmluZyB1bmxlc3MgYWxsIHRoZSBlbGVtZW50cyBhcmUgdmFsaWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWRkRm9ybSAoc2VsZWN0b3IpIHtcbiAgICAgICAgdmFyIGZvcm0gPSBub2QuZ2V0RWxlbWVudChzZWxlY3Rvcik7XG5cbiAgICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBwb3NzaWJsZVByZXZlbnRTdWJtaXQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBQcmV2ZW50IGZ1bmN0aW9uLCB1c2VkIGFib3ZlXG4gICAgZnVuY3Rpb24gcG9zc2libGVQcmV2ZW50U3VibWl0IChldmVudCkge1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5wcmV2ZW50U3VibWl0ICYmICFhcmVBbGwobm9kLmNvbnN0YW50cy5WQUxJRCkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIC8vIFNob3cgZXJyb3JzIHRvIHRoZSB1c2VyXG4gICAgICAgICAgICBjaGVja2Vycy5mb3JFYWNoKGZ1bmN0aW9uIChjaGVja2VyKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tlci5wZXJmb3JtQ2hlY2soe1xuICAgICAgICAgICAgICAgICAgICBldmVudDogZXZlbnRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBGb2N1cyBvbiB0aGUgZmlyc3QgaW52YWxpZCBlbGVtZW50XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gY2hlY2tIYW5kbGVycy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBjaGVja0hhbmRsZXIgPSBjaGVja0hhbmRsZXJzW2ldO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrSGFuZGxlci5nZXRTdGF0dXMoKS5zdGF0dXMgPT09IG5vZC5jb25zdGFudHMuSU5WQUxJRCkge1xuICAgICAgICAgICAgICAgICAgICBjaGVja0hhbmRsZXIuZWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGVsZW1lbnRzIGNvbXBsZXRlbHkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudCAoc2VsZWN0b3IpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRzID0gbm9kLmdldEVsZW1lbnRzKHNlbGVjdG9yKTtcblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnMucmVtb3ZlSXRlbShlbGVtZW50KTtcbiAgICAgICAgICAgIGNoZWNrZXJzLnJlbW92ZUl0ZW0oZWxlbWVudCk7XG4gICAgICAgICAgICBjaGVja0hhbmRsZXJzLnJlbW92ZUl0ZW0oZWxlbWVudCk7XG4gICAgICAgICAgICBkb21Ob2Rlcy5yZW1vdmVJdGVtKGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjb25maWd1cmVcbiAgICAgKlxuICAgICAqIENoYW5nZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHVzZWQgdGhyb3VnaG91dCB0aGUgY29kZSBmb3IgY2xhc3NlcyxcbiAgICAgKiBkZWxheXMsIG1lc3NhZ2VzLCBldGMuXG4gICAgICpcbiAgICAgKiBJdCBjYW4gZWl0aGVyIGJlIGNhbGxlZCB3aXRoIGEga2V5L3ZhbHVlIHBhaXIgKHR3byBhcmd1bWVudHMpLCBvciB3aXRoXG4gICAgICogYW4gb2JqZWN0IHdpdGgga2V5L3ZhbHVlIHBhaXJzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmZpZ3VyZSAoa2V5LCB2YWx1ZSkge1xuICAgICAgICB2YXIgYXR0cmlidXRlcyA9IHt9O1xuXG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgYXR0cmlidXRlc1trZXldID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzID0ga2V5O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgayBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBjb25maWd1cmF0aW9uW2tdID0gYXR0cmlidXRlc1trXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzLnN1Ym1pdCB8fCBhdHRyaWJ1dGVzLmRpc2FibGVTdWJtaXQpIHtcbiAgICAgICAgICAgIHRvZ2dsZVN1Ym1pdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGF0dHJpYnV0ZXMuZm9ybSkge1xuICAgICAgICAgICAgYWRkRm9ybShhdHRyaWJ1dGVzLmZvcm0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdG9nZ2xlU3VibWl0XG4gICAgICpcbiAgICAgKiBUb2dnbGVzIHRoZSBzdWJtaXQgYnV0dG9uIChlbmFibGVkIGlmIGV2ZXJ5IGVsZW1lbnQgaXMgdmFsaWQsIG90aGVyd2lzZVxuICAgICAqIGRpc2FibGVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b2dnbGVTdWJtaXQgKCkge1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5zdWJtaXQgJiYgY29uZmlndXJhdGlvbi5kaXNhYmxlU3VibWl0KSB7XG4gICAgICAgICAgICBub2QuZ2V0RWxlbWVudHMoY29uZmlndXJhdGlvbi5zdWJtaXQpLmZvckVhY2goZnVuY3Rpb24gKHN1Ym1pdEJ0bikge1xuICAgICAgICAgICAgICAgIHN1Ym1pdEJ0bi5kaXNhYmxlZCA9ICFhcmVBbGwobm9kLmNvbnN0YW50cy5WQUxJRCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RlbiB0byBhbGwgY2hlY2tzLCBhbmQgaWYgdGhlIHVzZXIgaGFzIHNldCBpbiB0aGUgY29uZmlndXJhdGlvbiB0b1xuICAgICAqIGVuYWJsZS9kaXNhYmxlZCB0aGUgc3VibWl0IGJ1dHRvbiwgd2UgZG8gdGhhdC5cbiAgICAgKi9cbiAgICBtZWRpYXRvci5zdWJzY3JpYmUoJ2FsbCcsIHRvZ2dsZVN1Ym1pdCk7XG5cbiAgICBmdW5jdGlvbiBhcmVBbGwgKHN0YXR1cykge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gY2hlY2tIYW5kbGVycy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKGNoZWNrSGFuZGxlcnNbaV0uZ2V0U3RhdHVzKCkuc3RhdHVzICE9PSBzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRNZXNzYWdlT3B0aW9ucyAob3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gQXJyYXkuaXNBcnJheShvcHRpb25zKSA/IG9wdGlvbnMgOiBbb3B0aW9uc107XG5cbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgICAgICAgIHZhciBlbGVtZW50cyA9IG5vZC5nZXRFbGVtZW50cyhvcHRpb24uc2VsZWN0b3IpO1xuXG4gICAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGRvbU5vZGUgPSBkb21Ob2Rlcy5maW5kT3JNYWtlKGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uKTtcblxuICAgICAgICAgICAgICAgIGRvbU5vZGUuc2V0TWVzc2FnZU9wdGlvbnMob3B0aW9uLnBhcmVudCwgb3B0aW9uLmVycm9yU3Bhbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIHRvIGFsbCBjaGVja3MgYW5kIGFsbG93IHRoZSB1c2VyIHRvIGxpc3RlbiBpbiwgaWYgaGUgc2V0IGEgYHRhcGBcbiAgICAgKiBmdW5jdGlvbiBpbiB0aGUgY29uZmlndXJhdGlvbi5cbiAgICAgKi9cbiAgICBtZWRpYXRvci5zdWJzY3JpYmUoJ2FsbCcsIGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlndXJhdGlvbi50YXAgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICYmIG9wdGlvbnMudHlwZSA9PT0gJ2NoZWNrJykge1xuICAgICAgICAgICAgY29uZmlndXJhdGlvbi50YXAob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGdldFN0YXR1cyAoc2VsZWN0b3IsIHNob3dFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBub2QuZ2V0RWxlbWVudChzZWxlY3RvciksXG4gICAgICAgICAgICBzdGF0dXMgID0gY2hlY2tIYW5kbGVycy5maW5kT3JNYWtlKGVsZW1lbnQpLmdldFN0YXR1cygpO1xuXG4gICAgICAgIHJldHVybiBzaG93RXJyb3JNZXNzYWdlID8gc3RhdHVzIDogc3RhdHVzLnN0YXR1cztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZXJmb3JtQ2hlY2sgKHNlbGVjdG9yKSB7XG4gICAgICAgIHZhciBjcyA9IHNlbGVjdG9yXG4gICAgICAgICAgICA/IG5vZC5nZXRFbGVtZW50cyhzZWxlY3RvcikubWFwKGNoZWNrZXJzLmZpbmRPck1ha2UpXG4gICAgICAgICAgICA6IGNoZWNrZXJzO1xuXG4gICAgICAgIGNzLmZvckVhY2goZnVuY3Rpb24gKGNoZWNrZXIpIHtcbiAgICAgICAgICAgIGNoZWNrZXIucGVyZm9ybUNoZWNrKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldEludmFsaWQgKHNlbGVjdG9yLCBlcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBub2QuZ2V0RWxlbWVudChzZWxlY3RvciksXG4gICAgICAgICAgICBkb21Ob2RlICA9IGRvbU5vZGVzLmZpbmRPck1ha2UoZWxlbWVudCk7XG5cbiAgICAgICAgZG9tTm9kZS5zZXQoe1xuICAgICAgICAgICAgcmVzdWx0OiBub2QuY29uc3RhbnRzLklOVkFMSUQsXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yTWVzc2FnZSB8fCAnJ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRWYWxpZCAoc2VsZWN0b3IpIHtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBub2QuZ2V0RWxlbWVudChzZWxlY3RvciksXG4gICAgICAgICAgICBkb21Ob2RlICA9IGRvbU5vZGVzLmZpbmRPck1ha2UoZWxlbWVudCk7XG5cbiAgICAgICAgZG9tTm9kZS5zZXQoe1xuICAgICAgICAgICAgcmVzdWx0OiBub2QuY29uc3RhbnRzLlZBTElELFxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiAnJ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRBbGxOb2RlVmFsaWQgKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZG9tTm9kZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHNldFZhbGlkKGRvbU5vZGVzW2ldLmVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgZnVuY3Rpb25zIHRoYXQgYXJlIGV4cG9zZWQgdG8gdGhlIHB1YmxpYy5cbiAgICAgKi9cbiAgICB2YXIgbm9kSW5zdGFjZSA9IHtcbiAgICAgICAgYWRkOiAgICAgICAgICAgICAgICAgICAgYWRkTWV0cmljcyxcbiAgICAgICAgcmVtb3ZlOiAgICAgICAgICAgICAgICAgcmVtb3ZlRWxlbWVudCxcbiAgICAgICAgYXJlQWxsOiAgICAgICAgICAgICAgICAgYXJlQWxsLFxuICAgICAgICBnZXRTdGF0dXM6ICAgICAgICAgICAgICBnZXRTdGF0dXMsXG4gICAgICAgIGNvbmZpZ3VyZTogICAgICAgICAgICAgIGNvbmZpZ3VyZSxcbiAgICAgICAgc2V0TWVzc2FnZU9wdGlvbnM6ICAgICAgc2V0TWVzc2FnZU9wdGlvbnMsXG4gICAgICAgIHBlcmZvcm1DaGVjazogICAgICAgICAgIHBlcmZvcm1DaGVjayxcbiAgICAgICAgc2V0SW52YWxpZDogICAgICAgICAgICAgc2V0SW52YWxpZCxcbiAgICAgICAgc2V0VmFsaWQ6ICAgICAgICAgICAgICAgc2V0VmFsaWQsXG4gICAgICAgIHNldEFsbE5vZGVWYWxpZDogICAgICAgIHNldEFsbE5vZGVWYWxpZFxuICAgIH07XG5cbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgIG5vZEluc3RhY2UuY29uZmlndXJlKGNvbmZpZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZEluc3RhY2U7XG59XG5cbm5vZC5jb25zdGFudHMgPSB7XG4gICAgVkFMSUQ6ICAgICAgICAgICd2YWxpZCcsXG4gICAgSU5WQUxJRDogICAgICAgICdpbnZhbGlkJyxcbiAgICBVTkNIRUNLRUQ6ICAgICAgJ3VuY2hlY2tlZCcsXG5cbiAgICBERUxBWTogICAgICAgICAgNzAwXG59O1xuXG5ub2QuY2xhc3NlcyA9IHtcbiAgICBzdWNjZXNzQ2xhc3M6ICAgICAgICAgJ25vZC1zdWNjZXNzJyxcbiAgICBzdWNjZXNzTWVzc2FnZUNsYXNzOiAgJ25vZC1zdWNjZXNzLW1lc3NhZ2UnLFxuICAgIGVycm9yQ2xhc3M6ICAgICAgICAgICAnbm9kLWVycm9yJyxcbiAgICBlcnJvck1lc3NhZ2VDbGFzczogICAgJ25vZC1lcnJvci1tZXNzYWdlJ1xufTtcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSB1bmlxdWUgaWQnc1xubm9kLnVuaXF1ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHVuaXF1ZUNvdW50ZXIgPSAwO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHVuaXF1ZUNvdW50ZXIrKztcbiAgICB9O1xufSkoKTtcblxuLyoqIG1ha2VNZWRpYXRvclxuICpcbiAqIE1pbmltYWwgaW1wbGVtZW50YXRpb24gb2YgYSBtZWRpYXRvciBwYXR0ZXJuLCB1c2VkIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW5cbiAqIGNoZWNrZXJzIGFuZCBjaGVja0hhbmRsZXJzIChjaGVja2VycyBmaXJlcyBldmVudHMgd2hpY2ggaGFuZGxlcnMgY2FuXG4gKiBzdWJzY3JpYmUgdG8pLiBVbmlxdWUgSUQncyBhcmUgdXNlZCB0byB0ZWxsIGV2ZW50cyBhcGFydC5cbiAqXG4gKiBTdWJzY3JpYmluZyB0byAnYWxsJyB3aWxsIGdpdmUgeW91IGFsbCByZXN1bHRzIGZyb20gYWxsIGNoZWNrcy5cbiAqL1xubm9kLm1ha2VNZWRpYXRvciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3Vic2NyaWJlcnMgPSBbXSxcbiAgICAgICAgYWxsID0gW107XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZSAoaWQsIGZuKSB7XG4gICAgICAgICAgICBpZiAoaWQgPT09ICdhbGwnKSB7XG4gICAgICAgICAgICAgICAgYWxsLnB1c2goZm4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIXN1YnNjcmliZXJzW2lkXSkge1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyc1tpZF0gPSBbXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc3Vic2NyaWJlcnNbaWRdLmluZGV4T2YoZm4pID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyc1tpZF0ucHVzaChmbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGZpcmU6IGZ1bmN0aW9uIGZpcmUgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHZhciBzdWJzY3JpYmVkRnVuY3Rpb25zID0gc3Vic2NyaWJlcnNbb3B0aW9ucy5pZF0uY29uY2F0KGFsbCk7XG5cbiAgICAgICAgICAgIHN1YnNjcmliZWRGdW5jdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlZEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlZEZ1bmN0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufTtcblxubm9kLmZpbmRDb2xsZWN0aW9uSW5kZXggPSBmdW5jdGlvbiAoY29sbGVjdGlvbiwgZWxlbWVudCkge1xuICAgIGZvciAodmFyIGkgaW4gY29sbGVjdGlvbikge1xuICAgICAgICBpZiAoY29sbGVjdGlvbltpXS5lbGVtZW50ID09PSBlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAtMTtcbn07XG5cbi8qKlxuICogbWFrZUNvbGxlY3Rpb25cbiAqXG4gKiBBIG1pbmltYWwgaW1wbGVtZW50YXRpb24gb2YgYSBcImNvbGxlY3Rpb25cIiwgaW5zcGlyZWQgYnkgY29sbGVjdGlvbnMgZnJvbVxuICogQmFja2JvbmVKUy4gVXNlZCBieSBsaXN0ZW5lcnMsIGNoZWNrZXJzLCBhbmQgY2hlY2tIYW5kbGVycy5cbiAqL1xubm9kLm1ha2VDb2xsZWN0aW9uID0gZnVuY3Rpb24gKG1ha2VyKSB7XG4gICAgdmFyIGNvbGxlY3Rpb24gPSBbXTtcblxuICAgIGNvbGxlY3Rpb24uZmluZE9yTWFrZSA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHZhciBpbmRleCA9IG5vZC5maW5kQ29sbGVjdGlvbkluZGV4KGNvbGxlY3Rpb24sIGVsZW1lbnQpO1xuXG4gICAgICAgIC8vIEZvdW5kXG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uW2luZGV4XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vbmUgZm91bmQsIGxldCdzIG1ha2Ugb25lIHRoZW4uXG4gICAgICAgIHZhciBpdGVtID0gbWFrZXIuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcblxuICAgICAgICBjb2xsZWN0aW9uLnB1c2goaXRlbSk7XG5cbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfTtcblxuICAgIGNvbGxlY3Rpb24ucmVtb3ZlSXRlbSA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHZhciBpbmRleCA9IG5vZC5maW5kQ29sbGVjdGlvbkluZGV4KGNvbGxlY3Rpb24sIGVsZW1lbnQpLFxuICAgICAgICAgICAgaXRlbSA9IGNvbGxlY3Rpb25baW5kZXhdO1xuXG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbCAuZGlzcG9zZSgpIGlmIGl0IGV4aXN0c1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW0uZGlzcG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaXRlbS5kaXNwb3NlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgaXRlbVxuICAgICAgICBjb2xsZWN0aW9uLnNwbGljZShpbmRleCwgMSk7XG4gICAgfTtcblxuICAgIHJldHVybiBjb2xsZWN0aW9uO1xufTtcblxuLyoqXG4gKiBtYWtlTGlzdGVuZXJcbiAqXG4gKiBUYWtlcyBjYXJlIG9mIGxpc3RlbmluZyB0byBjaGFuZ2VzIHRvIGl0cyBlbGVtZW50IGFuZCBmaXJlIHRoZW0gb2ZmIGFzXG4gKiBldmVudHMgb24gdGhlIG1lZGlhdG9yIGZvciBjaGVja2VycyB0byBsaXN0ZW4gdG8uXG4gKi9cbm5vZC5tYWtlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgbWVkaWF0b3IsIHRyaWdnZXJFdmVudHMsIGNvbmZpZ3VyYXRpb24pIHtcbiAgICB2YXIgaWQgPSBub2QudW5pcXVlKCksXG4gICAgICAgICRlbGVtZW50O1xuXG4gICAgZnVuY3Rpb24gY2hhbmdlZCAoZXZlbnQpIHtcbiAgICAgICAgbWVkaWF0b3IuZmlyZSh7XG4gICAgICAgICAgICBpZDogICAgIGlkLFxuICAgICAgICAgICAgZXZlbnQ6ICBldmVudCxcbiAgICAgICAgICAgIHR5cGU6ICAgJ2NoYW5nZSdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGNoYW5nZWQsIGZhbHNlKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGNoYW5nZWQsIGZhbHNlKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBjaGFuZ2VkLCBmYWxzZSk7XG5cbiAgICBpZiAoY29uZmlndXJhdGlvbi5qUXVlcnkpIHtcbiAgICAgICAgJGVsZW1lbnQgPSBjb25maWd1cmF0aW9uLmpRdWVyeShlbGVtZW50KTtcblxuICAgICAgICAkZWxlbWVudC5vbigncHJvcGVydHljaGFuZ2UgY2hhbmdlIGNsaWNrIGtleXVwIGlucHV0IHBhc3RlJywgY2hhbmdlZCk7XG4gICAgfVxuXG4gICAgaWYgKHRyaWdnZXJFdmVudHMpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50cyA9IEFycmF5LmlzQXJyYXkodHJpZ2dlckV2ZW50cylcbiAgICAgICAgICAgID8gdHJpZ2dlckV2ZW50c1xuICAgICAgICAgICAgOiBbdHJpZ2dlckV2ZW50c107XG5cbiAgICAgICAgdHJpZ2dlckV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNoYW5nZWQsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGlzcG9zZSAoKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBjaGFuZ2VkLCBmYWxzZSk7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgY2hhbmdlZCwgZmFsc2UpO1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCBjaGFuZ2VkLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKCRlbGVtZW50KSB7XG4gICAgICAgICAgICAkZWxlbWVudC5vZmYoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0cmlnZ2VyRXZlbnRzKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNoYW5nZWQsIGZhbHNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZWxlbWVudDogICAgZWxlbWVudCxcbiAgICAgICAgZGlzcG9zZTogICAgZGlzcG9zZSxcbiAgICAgICAgaWQ6ICAgICAgICAgaWRcbiAgICB9O1xufTtcblxuLyoqXG4gKiBtYWtlQ2hlY2tlclxuICpcbiAqIEFuIFwiY2hlY2tlclwiIGNvbW11bmljYXRlcyBwcmltYXJpbHkgd2l0aCB0aGUgbWVkaWF0b3IuIEl0IGxpc3RlbnMgZm9yIGlucHV0XG4gKiBjaGFuZ2VzIChjb21pbmcgZnJvbSBsaXN0ZW5lcnMpLCBwZXJmb3JtcyBpdHMgY2hlY2tzIGFuZCBmaXJlcyBvZmYgcmVzdWx0c1xuICogYmFjayB0byB0aGUgbWVkaWF0b3IgZm9yIGNoZWNrSGFuZGxlcnMgdG8gaGFuZGxlLlxuICpcbiAqIFRoZSBjaGVja2VyIGhhcyBhIDEgdG8gMSByZWxhdGlvbnNoaXAgd2l0aCBhbiBlbGVtZW50LCBhbiBsaXN0ZW5lcnMsIGFuZCBhblxuICogY2hlY2tIYW5kbGVyOyBhbHRob3VnaCB0aGV5IG1heSBjb21tdW5pY2F0ZSB3aXRoIG90aGVyIFwic2V0c1wiIG9mIGxpc3RlbmVycyxcbiAqIGNoZWNrZXJzIGFuZCBoYW5kbGVycy5cbiAqXG4gKiBDaGVja3MgYXJlIGFkZGVkLCBmcm9tIHRoZSBvdXRzaWRlLCBhbmQgY29uc2lzdHMgb2YgYSBjaGVja0Z1bmN0aW9uIChzZWVcbiAqIG5vZC5jaGVja0Z1bmN0aW9ucykgYW5kIGEgdW5pcXVlIGlkLlxuICovXG5ub2QubWFrZUNoZWNrZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgbWVkaWF0b3IpIHtcbiAgICB2YXIgY2hlY2tzID0gW107XG5cbiAgICBmdW5jdGlvbiBzdWJzY3JpYmVUbyAoaWQpIHtcbiAgICAgICAgbWVkaWF0b3Iuc3Vic2NyaWJlKGlkLCBwZXJmb3JtQ2hlY2spO1xuICAgIH1cblxuICAgIC8vIFJ1biBldmVyeSBjaGVjayBmdW5jdGlvbiBhZ2FpbnN0IHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudC5cbiAgICBmdW5jdGlvbiBwZXJmb3JtQ2hlY2sgKG9wdGlvbnMpIHtcbiAgICAgICAgY2hlY2tzLmZvckVhY2goZnVuY3Rpb24gKGNoZWNrKSB7XG4gICAgICAgICAgICBjaGVjayhvcHRpb25zIHx8IHt9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGEgY2hlY2sgZnVuY3Rpb24gdG8gdGhlIGVsZW1lbnQuIFRoZSByZXN1bHQgd2lsbCBiZSBoYW5kZWQgb2ZmIHRvIHRoZVxuICAgIC8vIG1lZGlhdG9yIChmb3IgY2hlY2tIYW5kbGVycyB0byBldmFsdWF0ZSkuXG4gICAgZnVuY3Rpb24gYWRkQ2hlY2sgKGNoZWNrRnVuY3Rpb24sIGlkKSB7XG4gICAgICAgIGZ1bmN0aW9uIGNhbGxiYWNrIChyZXN1bHQpIHtcbiAgICAgICAgICAgIG1lZGlhdG9yLmZpcmUoe1xuICAgICAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgICAgICB0eXBlOiAnY2hlY2snLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogcmVzdWx0LFxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgdmFsaWRhdGU6IGNoZWNrRnVuY3Rpb24udmFsaWRhdGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hlY2tzLnB1c2goZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIElmIGVsZW1lbnQudmFsdWUgaXMgdW5kZWZpbmVkLCB0aGVuIHdlIG1pZ2h0IGJlIGRlYWxpbmcgd2l0aFxuICAgICAgICAgICAgLy8gYW5vdGhlciB0eXBlIG9mIGVsZW1lbnQ7IGxpa2UgPGRpdiBjb250ZW50ZWRpdGFibGU9J3RydWUnPlxuICAgICAgICAgICAgdmFyIHZhbHVlID0gZWxlbWVudC52YWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBlbGVtZW50LmlubmVySFRNTFxuICAgICAgICAgICAgICAgIDogZWxlbWVudC52YWx1ZTtcblxuICAgICAgICAgICAgb3B0aW9ucy5lbGVtZW50ID0gZWxlbWVudDtcblxuICAgICAgICAgICAgY2hlY2tGdW5jdGlvbihjYWxsYmFjaywgdmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzdWJzY3JpYmVUbzogICAgc3Vic2NyaWJlVG8sXG4gICAgICAgIGFkZENoZWNrOiAgICAgICBhZGRDaGVjayxcbiAgICAgICAgcGVyZm9ybUNoZWNrOiAgIHBlcmZvcm1DaGVjayxcbiAgICAgICAgZWxlbWVudDogICAgICAgIGVsZW1lbnRcbiAgICB9O1xufTtcblxuLyoqXG4gKiBtYWtlQ2hlY2tIYW5kbGVyXG4gKlxuICogSGFuZGxlcyBjaGVja3MgY29taW5nIGluIGZyb20gdGhlIG1lZGlhdG9yIGFuZCB0YWtlcyBjYXJlIG9mIGNhbGN1bGF0aW5nIHRoZVxuICogc3RhdGUgYW5kIGVycm9yIG1lc3NhZ2VzLlxuICpcbiAqIFRoZSBjaGVja0hhbmRsZXJzIGxpdmVzIGluIG9uZSB0byBvbmUgd2l0aCB0aGUgZWxlbWVudCBwYXJzZWQgaW4sIGFuZCBsaXN0ZW5zXG4gKiBmb3IgKHVzdWFsbHkpIG11bHRpcGxlIGVycm9yIGNoZWNrcy5cbiAqL1xubm9kLm1ha2VDaGVja0hhbmRsZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgbWVkaWF0b3IsIGNvbmZpZ3VyYXRpb24pIHtcbiAgICB2YXIgcmVzdWx0cyAgICAgPSB7fSxcbiAgICAgICAgaWQgICAgICAgICAgPSBub2QudW5pcXVlKCk7XG5cbiAgICBmdW5jdGlvbiBzdWJzY3JpYmVUbyAoaWQsIGVycm9yTWVzc2FnZSwgZGVmYXVsdFN0YXR1cykge1xuICAgICAgICAvLyBDcmVhdGUgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZSBvZiBlcnJvciBpbiB0aGUgcmVzdWx0cyBvYmplY3QuXG4gICAgICAgIGlmICghcmVzdWx0c1tpZF0pIHtcbiAgICAgICAgICAgIHJlc3VsdHNbaWRdID0ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogZGVmYXVsdFN0YXR1cyB8fCBub2QuY29uc3RhbnRzLlVOQ0hFQ0tFRCxcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yTWVzc2FnZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN1YnNjcmliZSB0byBlcnJvciBpZC5cbiAgICAgICAgbWVkaWF0b3Iuc3Vic2NyaWJlKGlkLCBjaGVja0hhbmRsZXIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrSGFuZGxlciAocmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdHNbcmVzdWx0LmlkXS5zdGF0dXMgPSByZXN1bHQucmVzdWx0XG4gICAgICAgICAgICA/IG5vZC5jb25zdGFudHMuVkFMSURcbiAgICAgICAgICAgIDogbm9kLmNvbnN0YW50cy5JTlZBTElEO1xuXG4gICAgICAgIG5vdGlmeU1lZGlhdG9yKCk7XG4gICAgfVxuXG4gICAgLy8gUnVucyB0aHJvdWdoIGFsbCByZXN1bHRzIHRvIHNlZSB3aGF0IGtpbmQgb2YgZmVlZGJhY2sgdG8gc2hvdyB0aGUgdXNlci5cbiAgICBmdW5jdGlvbiBub3RpZnlNZWRpYXRvciAoKSB7XG4gICAgICAgIHZhciBzdGF0dXMgPSBnZXRTdGF0dXMoKTtcblxuICAgICAgICAvLyBFdmVudCBpZiBtaWdodCBiZSB2YWxpZCB3ZSBwYXNzIGFsb25nIGFuIHVuZGVmaW5lZCBlcnJvck1lc3NhZ2UuXG4gICAgICAgIG1lZGlhdG9yLmZpcmUoe1xuICAgICAgICAgICAgaWQ6ICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgdHlwZTogICAgICAgICAgICdyZXN1bHQnLFxuICAgICAgICAgICAgcmVzdWx0OiAgICAgICAgIHN0YXR1cy5zdGF0dXMsXG4gICAgICAgICAgICBlbGVtZW50OiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZTogICBzdGF0dXMuZXJyb3JNZXNzYWdlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFN0YXR1cyAoKSB7XG4gICAgICAgIHZhciBzdGF0dXMsIGVycm9yTWVzc2FnZTtcblxuICAgICAgICBmb3IgKHZhciBpZCBpbiByZXN1bHRzKSB7XG4gICAgICAgICAgICBzdGF0dXMgPSByZXN1bHRzW2lkXS5zdGF0dXM7XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHRzW2lkXS5zdGF0dXMgPT09IG5vZC5jb25zdGFudHMuSU5WQUxJRCkge1xuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IHJlc3VsdHNbaWRdLmVycm9yTWVzc2FnZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXM6ICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6ICBlcnJvck1lc3NhZ2VcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogICAgICAgICAgICAgaWQsXG4gICAgICAgIHN1YnNjcmliZVRvOiAgICBzdWJzY3JpYmVUbyxcbiAgICAgICAgY2hlY2tIYW5kbGVyOiAgIGNoZWNrSGFuZGxlcixcbiAgICAgICAgZ2V0U3RhdHVzOiAgICAgIGdldFN0YXR1cyxcbiAgICAgICAgZWxlbWVudDogICAgICAgIGVsZW1lbnRcbiAgICB9O1xufTtcblxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgYG1ha2VEb21Ob2RlYC5cbm5vZC5oYXNDbGFzcyA9IGZ1bmN0aW9uIChjbGFzc05hbWUsIGVsKSB7XG4gICAgaWYgKGVsLmNsYXNzTGlzdCkge1xuICAgICAgICByZXR1cm4gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cCgnKFxcXFxzfF4pJyArIGNsYXNzTmFtZSArICcoXFxcXHN8JCknKTtcbiAgICAgICAgcmV0dXJuICEhZWwuY2xhc3NOYW1lLm1hdGNoKHJlZ2V4KTtcbiAgICB9XG59O1xuXG5ub2QucmVtb3ZlQ2xhc3MgPSBmdW5jdGlvbiAoY2xhc3NOYW1lLCBlbCkge1xuICAgIGlmIChlbC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICAgIH0gZWxzZSBpZiAobm9kLmhhc0NsYXNzKGNsYXNzTmFtZSwgZWwpKSB7XG4gICAgICAgIHZhciByZWdleCA9IG5ldyBSZWdFeHAoJyg/Ol58XFxcXHMpJyArIGNsYXNzTmFtZSArICcoPyFcXFxcUyknKTtcbiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lLnJlcGxhY2UocmVnZXgsICcnKTtcbiAgICB9XG59O1xuXG5ub2QuYWRkQ2xhc3MgPSBmdW5jdGlvbiAoY2xhc3NOYW1lLCBlbCkge1xuICAgIGlmIChlbC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgIH0gZWxzZSBpZiAoIW5vZC5oYXNDbGFzcyhjbGFzc05hbWUsIGVsKSkge1xuICAgICAgICBlbC5jbGFzc05hbWUgKz0gJyAnICsgY2xhc3NOYW1lO1xuICAgIH1cbn07XG5cbm5vZC5nZXRQYXJlbnQgPSBmdW5jdGlvbiAoZWxlbWVudCwgY29uZmlndXJhdGlvbikge1xuICAgIHZhciBrbGFzcyA9IGNvbmZpZ3VyYXRpb24ucGFyZW50Q2xhc3M7XG5cbiAgICBpZiAoa2xhc3MpIHtcbiAgICAgICAga2xhc3MgPSBrbGFzcy5jaGFyQXQoMCkgPT09ICcuJyA/IGtsYXNzLnNsaWNlKDEpIDoga2xhc3M7XG4gICAgICAgIHJldHVybiBub2QuZmluZFBhcmVudFdpdGhDbGFzcyhlbGVtZW50LnBhcmVudE5vZGUsIGtsYXNzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgIH1cbn07XG5cbm5vZC5maW5kUGFyZW50V2l0aENsYXNzID0gZnVuY3Rpb24gKHBhcmVudCwga2xhc3MpIHtcbiAgICAvLyBHdWFyZCAob25seSB0aGUgYHdpbmRvd2AgZG9lcyBub3QgaGF2ZSBhIHBhcmVudCkuXG4gICAgaWYgKCFwYXJlbnQucGFyZW50Tm9kZSkge1xuICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cblxuICAgIC8vIEZvdW5kIGl0XG4gICAgaWYgKG5vZC5oYXNDbGFzcyhrbGFzcywgcGFyZW50KSkge1xuICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cblxuICAgIC8vIFRyeSBuZXh0IHBhcmVudCAocmVjdXJzaW9uKVxuICAgIHJldHVybiBub2QuZmluZFBhcmVudFdpdGhDbGFzcyhwYXJlbnQucGFyZW50Tm9kZSwga2xhc3MpO1xufTtcblxuLyoqXG4gKiBtYWtlRG9tTm9kZVxuICpcbiAqIFRoaXMgY3JlYXRlcyB0aGUgZXJyb3Ivc3VjY2VzcyBtZXNzYWdlIGJlaGluZCB0aGUgaW5wdXQgZWxlbWVudCwgYXMgd2VsbCBhc1xuICogdGFrZXMgY2FyZSBvZiB1cGRhdGluZyBjbGFzc2VzIGFuZCB0YWtpbmcgY2FyZSBvZiBpdHMgb3duIHN0YXRlLlxuICpcbiAqIFRoZSBkb20gbm9kZSBpcyBvd25lZCBieSBjaGVja0hhbmRsZXIsIGFuZCBoYXMgYSBvbmUgdG8gb25lIHJlbGF0aW9uc2hpcCB3aXRoXG4gKiBib3RoIHRoZSBjaGVja0hhbmRsZXIgYW5kIHRoZSBpbnB1dCBlbGVtZW50IGJlaW5nIGNoZWNrZWQuXG4gKlxuICovXG5ub2QubWFrZURvbU5vZGUgPSBmdW5jdGlvbiAoZWxlbWVudCwgbWVkaWF0b3IsIGNvbmZpZ3VyYXRpb24pIHtcbiAgICAvLyBBICdkb21Ob2RlJyBjb25zaXN0cyBvZiB0d28gZWxlbWVudHM6IGEgJ3BhcmVudCcsIGFuZCBhICdzcGFuJy4gVGhlXG4gICAgLy8gcGFyZW50IGlzIGdpdmVuIGFzIGEgcGFyZW1ldGVyLCB3aGlsZSB0aGUgc3BhbiBpcyBjcmVhdGVkIGFuZCBhZGRlZCBhcyBhXG4gICAgLy8gY2hpbGQgdG8gdGhlIHBhcmVudC5cbiAgICB2YXIgcGFyZW50ICAgICAgICAgICAgICA9IG5vZC5nZXRQYXJlbnQoZWxlbWVudCwgY29uZmlndXJhdGlvbiksXG4gICAgICAgIF9zdGF0dXMgICAgICAgICAgICAgPSBub2QuY29uc3RhbnRzLlVOQ0hFQ0tFRCxcbiAgICAgICAgcGVuZGluZ1VwZGF0ZSAgICAgICA9IG51bGwsXG4gICAgICAgIHNwYW4gICAgICAgICAgICAgICAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyksXG4gICAgICAgIGN1c3RvbVNwYW4gICAgICAgICAgPSBmYWxzZTtcblxuICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIGlmICghY29uZmlndXJhdGlvbi5ub0RvbSkge1xuICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlcyB0aGUgY2xhc3Mgb2YgdGhlIHBhcmVudCB0byBtYXRjaCB0aGUgc3RhdHVzIG9mIHRoZSBlbGVtZW50LlxuICAgIGZ1bmN0aW9uIHVwZGF0ZVBhcmVudCAoc3RhdHVzKSB7XG4gICAgICAgIHZhciBzdWNjZXNzQ2xhc3MgPSBjb25maWd1cmF0aW9uLnN1Y2Nlc3NDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbm9kLmNsYXNzZXMuc3VjY2Vzc0NsYXNzLFxuICAgICAgICAgICAgZXJyb3JDbGFzcyA9IGNvbmZpZ3VyYXRpb24uZXJyb3JDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG5vZC5jbGFzc2VzLmVycm9yQ2xhc3M7XG5cbiAgICAgICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgICAgY2FzZSBub2QuY29uc3RhbnRzLlZBTElEOlxuICAgICAgICAgICAgbm9kLnJlbW92ZUNsYXNzKGVycm9yQ2xhc3MsIHBhcmVudCk7XG4gICAgICAgICAgICBub2QuYWRkQ2xhc3Moc3VjY2Vzc0NsYXNzLCBwYXJlbnQpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBub2QuY29uc3RhbnRzLklOVkFMSUQ6XG4gICAgICAgICAgICBub2QucmVtb3ZlQ2xhc3Moc3VjY2Vzc0NsYXNzLCBwYXJlbnQpO1xuICAgICAgICAgICAgbm9kLmFkZENsYXNzKGVycm9yQ2xhc3MsIHBhcmVudCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZXMgdGhlIHRleHQgYW5kIGNsYXNzIGFjY29yZGluZyB0byB0aGUgc3RhdHVzLlxuICAgIGZ1bmN0aW9uIHVwZGF0ZVNwYW4gKHN0YXR1cywgZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgIHZhciBzdWNjZXNzTWVzc2FnZUNsYXNzID0gY29uZmlndXJhdGlvbi5zdWNjZXNzTWVzc2FnZUNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbm9kLmNsYXNzZXMuc3VjY2Vzc01lc3NhZ2VDbGFzcyxcbiAgICAgICAgICBlcnJvck1lc3NhZ2VDbGFzcyAgID0gY29uZmlndXJhdGlvbi5lcnJvck1lc3NhZ2VDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBub2QuY2xhc3Nlcy5lcnJvck1lc3NhZ2VDbGFzcztcblxuICAgICAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgICAgY2FzZSBub2QuY29uc3RhbnRzLlZBTElEOlxuICAgICAgICAgICAgbm9kLnJlbW92ZUNsYXNzKGVycm9yTWVzc2FnZUNsYXNzLCBzcGFuKTtcbiAgICAgICAgICAgIG5vZC5hZGRDbGFzcyhzdWNjZXNzTWVzc2FnZUNsYXNzLCBzcGFuKTtcblxuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uc3VjY2Vzc01lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBzcGFuLnRleHRDb250ZW50ID0gY29uZmlndXJhdGlvbi5zdWNjZXNzTWVzc2FnZTtcbiAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBub2QuY29uc3RhbnRzLklOVkFMSUQ6XG4gICAgICAgICAgICBub2QucmVtb3ZlQ2xhc3Moc3VjY2Vzc01lc3NhZ2VDbGFzcywgc3Bhbik7XG4gICAgICAgICAgICBub2QuYWRkQ2xhc3MoZXJyb3JNZXNzYWdlQ2xhc3MsIHNwYW4pO1xuICAgICAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IGVycm9yTWVzc2FnZTtcbiAgICAgICAgICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXQgKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIHN0YXR1cyAgICAgICAgICAgICAgPSBvcHRpb25zLnJlc3VsdCxcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSAgICAgICAgPSBvcHRpb25zLmVycm9yTWVzc2FnZTtcblxuICAgICAgICAvLyBJZiB0aGUgZG9tIGlzIHNob3dpbmcgYW4gaW52YWxpZCBtZXNzYWdlLCB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgZG9tXG4gICAgICAgIC8vIHJpZ2h0IGF3YXkuXG4gICAgICAgIGlmIChfc3RhdHVzID09PSBub2QuY29uc3RhbnRzLklOVkFMSUQgfHwgY29uZmlndXJhdGlvbi5kZWxheSA9PT0gMCkge1xuICAgICAgICAgICAgX3N0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgICAgIHVwZGF0ZVBhcmVudChzdGF0dXMpO1xuICAgICAgICAgICAgdXBkYXRlU3BhbihzdGF0dXMsIGVycm9yTWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZG9tIHNob3dzIGVpdGhlciBhbiB1bmNoZWNrZWQgb3IgYSB2YWxpZCBzdGF0ZSB3ZSB3b24ndFxuICAgICAgICAgICAgLy8gcnVzaCB0byB0ZWxsIHRoZW0gdGhleSBhcmUgd3JvbmcuIEluc3RlYWQgd2UgdXNlIGEgbWV0aG9kIHNpbWlsYXJcbiAgICAgICAgICAgIC8vIHRvIFwiZGVib3VuY2luZ1wiIHRoZSB1cGRhdGVcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChwZW5kaW5nVXBkYXRlKTtcblxuICAgICAgICAgICAgcGVuZGluZ1VwZGF0ZSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF9zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgICAgICAgICAgdXBkYXRlUGFyZW50KHN0YXR1cyk7XG4gICAgICAgICAgICAgICAgdXBkYXRlU3BhbihzdGF0dXMsIGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcGVuZGluZ1VwZGF0ZSA9IG51bGw7XG4gICAgICAgICAgICB9LCBjb25maWd1cmF0aW9uLmRlbGF5IHx8IG5vZC5jb25zdGFudHMuREVMQVkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3Vic2NyaWJlVG8gKGlkKSB7XG4gICAgICAgIG1lZGlhdG9yLnN1YnNjcmliZShpZCwgc2V0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRNZXNzYWdlT3B0aW9ucyAocGFyZW50Q29udGFpbmVyLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChwYXJlbnRDb250YWluZXIpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IG5vZC5nZXRFbGVtZW50KHBhcmVudENvbnRhaW5lcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICAgICAgc3Bhbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNwYW4pOyAgICAgIC8vIFJlbW92ZSBvbGQgc3Bhbi5cbiAgICAgICAgICAgIHNwYW4gPSBub2QuZ2V0RWxlbWVudChtZXNzYWdlKTsgICAgICAgICAvLyBTZXQgdGhlIG5ldyBvbmUuXG4gICAgICAgICAgICBjdXN0b21TcGFuID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgLy8gU28gd2Ugd29uJ3QgZGVsZXRlIGl0LlxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGlzcG9zZSAoKSB7XG4gICAgICAgIC8vIEZpcnN0IHJlbW92ZSBhbnkgY2xhc3Nlc1xuICAgICAgICBub2QucmVtb3ZlQ2xhc3MoY29uZmlndXJhdGlvbi5lcnJvckNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBub2QuY2xhc3Nlcy5lcnJvckNsYXNzLCBwYXJlbnQpO1xuICAgICAgICBub2QucmVtb3ZlQ2xhc3MoY29uZmlndXJhdGlvbi5zdWNjZXNzQ2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IG5vZC5jbGFzc2VzLnN1Y2Nlc3NDbGFzcywgcGFyZW50KTtcblxuICAgICAgICAvLyBUaGVuIHdlIHJlbW92ZSB0aGUgc3BhbiBpZiBpdCB3YXNuJ3Qgb25lIHRoYXQgd2FzIHNldCBieSB0aGUgdXNlci5cbiAgICAgICAgLy8gSWYgYG5vRG9tYCB3YXMgdXNlZCwgdGhlbiB0aGVyZSB3b24ndCBiZSBhbnkgdG8gcmVtb3ZlLlxuICAgICAgICBpZiAoc3Bhbi5wYXJlbnROb2RlICYmICFjdXN0b21TcGFuKSB7XG4gICAgICAgICAgICBzcGFuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3Bhbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzdWJzY3JpYmVUbzogICAgICAgIHN1YnNjcmliZVRvLFxuICAgICAgICBlbGVtZW50OiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHNldE1lc3NhZ2VPcHRpb25zOiAgc2V0TWVzc2FnZU9wdGlvbnMsXG4gICAgICAgIGRpc3Bvc2U6ICAgICAgICAgICAgZGlzcG9zZSxcbiAgICAgICAgc2V0OiAgICAgICAgICAgICAgICBzZXRcbiAgICB9O1xufTtcblxubm9kLm1ha2VFdmVudEVtaXR0ZXIgPSBmdW5jdGlvbiAobWVkaWF0b3IpIHtcbiAgICB2YXIgY3VzdG9tRXZlbnQ7XG5cbiAgICBmdW5jdGlvbiBlbWl0IChvcHRpb25zKSB7XG4gICAgICAgIGlmIChDdXN0b21FdmVudCkge1xuICAgICAgICAgICAgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ25vZC52YWxpZGF0aW9uJywge2RldGFpbDogb3B0aW9uc30pO1xuXG4gICAgICAgICAgICBvcHRpb25zLmVsZW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgZXJyb3JNc2cgPSAnbm9kLnZhbGlkYXRlIHRyaWVkIHRvIGZpcmUgYSBjdXN0b20gZXZlbnQsIGJ1dCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IEN1c3RvbUV2ZW50XFwncyc7XG5cbiAgICAgICAgICAgIHRocm93IEVycm9yKGVycm9yTXNnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN1YnNjcmliZSAoaWQpIHtcbiAgICAgICAgbWVkaWF0b3Iuc3Vic2NyaWJlKGlkLCBlbWl0KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzdWJzY3JpYmU6IHN1YnNjcmliZVxuICAgIH07XG59O1xuXG4vKipcbiAqIGdldEVsZW1lbnRcbiAqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IHRhcmdldGVkIGJ5IHRoZSBzZWxlY3Rvci4gKHNlZSBgZ2V0RWxlbWVudHNgKVxuICovXG5ub2QuZ2V0RWxlbWVudCA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHJldHVybiBub2QuZ2V0RWxlbWVudHMoc2VsZWN0b3IpWzBdO1xufTtcblxuLyoqXG4gKiBnZXRFbGVtZW50c1xuICpcbiAqIFRha2VzIHNvbWUgc29ydCBvZiBzZWxlY3RvciwgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgZWxlbWVudChzKS4gVGhlIGFwcGxpZWRcbiAqIHNlbGVjdG9yIGNhbiBiZSBvbmUgb2Y6XG4gKlxuICogLSBDc3MgdHlwZSBzZWxlY3RvciAoZS5nLiwgXCIuZm9vXCIpXG4gKiAtIEEgalF1ZXJ5IGVsZW1lbnQgKGUuZy4sICQoJy5mb28pKVxuICogLSBBIHNpbmdsZSByYXcgZG9tIGVsZW1lbnQgKGUuZy4sIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb28nKSlcbiAqIC0gQSBsaXN0IG9mIHJhdyBkb20gZWxlbWVudCAoZS5nLiwgJCgnLmZvbycpLmdldCgpKVxuICovXG5ub2QuZ2V0RWxlbWVudHMgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICBpZiAoIXNlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWwgY3NzIHR5cGUgc2VsZWN0b3IgaXMgYXNzdW1lZFxuICAgIGlmICh0eXBlb2Ygc2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgalF1ZXJ5LCB0aGVuIHdlIHVzZSB0aGF0IHRvIGNyZWF0ZSBhIGRvbSBsaXN0IGZvciB1cy5cbiAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkpIHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cualF1ZXJ5KHNlbGVjdG9yKS5nZXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG5vdCwgdGhlbiB3ZSBkbyBpdCB0aGUgbWFudWFsIHdheS5cbiAgICAgICAgdmFyIG5vZGVMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG5cbiAgICAgICAgcmV0dXJuIFtdLm1hcC5jYWxsKG5vZGVMaXN0LCBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gaWYgdXNlciBnYXZlIHVzIGpRdWVyeSBlbGVtZW50c1xuICAgIGlmIChzZWxlY3Rvci5qcXVlcnkpIHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yLmdldCgpO1xuICAgIH1cblxuICAgIC8vIFJhdyBET00gZWxlbWVudFxuICAgIGlmIChzZWxlY3Rvci5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICByZXR1cm4gW3NlbGVjdG9yXTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3RvcikpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gICAgICAgIHNlbGVjdG9yLmZvckVhY2goZnVuY3Rpb24gKHNlbCkge1xuICAgICAgICAgICAgdmFyIGVsZW1lbnRzID0gbm9kLmdldEVsZW1lbnRzKHNlbCk7XG5cbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoZWxlbWVudHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHRocm93IEVycm9yKCdVbmtub3duIHR5cGUgb2YgZWxlbWVudHMgaW4geW91ciBgc2VsZWN0b3JgOiAnICsgc2VsZWN0b3IpO1xufTtcblxubm9kLmdldENoZWNrRnVuY3Rpb24gPSBmdW5jdGlvbiAobWV0cmljKSB7XG4gICAgaWYgKHR5cGVvZiBtZXRyaWMudmFsaWRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG1ldHJpYy52YWxpZGF0ZTtcbiAgICB9XG5cbiAgICBpZiAobWV0cmljLnZhbGlkYXRlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHJldHVybiBub2QuY2hlY2tGdW5jdGlvbnMucmVnZXhwKG1ldHJpYy52YWxpZGF0ZSk7XG4gICAgfVxuXG4gICAgdmFyIGFyZ3MgICA9IG1ldHJpYy52YWxpZGF0ZS5zcGxpdCgnOicpLFxuICAgICAgICBmbk5hbWUgPSBhcmdzLnNoaWZ0KCk7XG5cbiAgICBpZiAoZm5OYW1lID09PSAnb25lLW9mJyB8fCBmbk5hbWUgPT09ICdvbmx5LW9uZS1vZicgfHxcbiAgICAgICAgZm5OYW1lID09PSAnc2FtZS1hcycgfHwgZm5OYW1lID09PSAnc29tZS1yYWRpbycpIHtcbiAgICAgICAgYXJncy5wdXNoKG1ldHJpYy5zZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBub2QuY2hlY2tGdW5jdGlvbnNbZm5OYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbm9kLmNoZWNrRnVuY3Rpb25zW2ZuTmFtZV0uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGVycm9yTXNnID0gJ0NvdWxkblxcJ3QgZmluZCB5b3VyIHZhbGlkYXRvciBmdW5jdGlvbiBcIicgK1xuICAgICAgICAgICAgICAgICAgICAgICBmbk5hbWUgKyAnXCIgZm9yIFwiJyArIG1ldHJpYy5zZWxlY3RvciArICdcIic7XG5cbiAgICAgICAgdGhyb3cgRXJyb3IoZXJyb3JNc2cpO1xuICAgIH1cbn07XG5cbi8vIENvbGxlY3Rpb24gb2YgYnVpbHQtaW4gY2hlY2sgZnVuY3Rpb25zXG5ub2QuY2hlY2tGdW5jdGlvbnMgPSB7XG4gICAgJ3ByZXNlbmNlJzogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gcHJlc2VuY2UgKGNhbGxiYWNrLCB2YWx1ZSkge1xuICAgICAgICAgICAgY2FsbGJhY2sodmFsdWUubGVuZ3RoID4gMCk7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgICdleGFjdCc6IGZ1bmN0aW9uIChleGFjdFZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBleGFjdCAoY2FsbGJhY2ssIHZhbHVlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayh2YWx1ZSA9PT0gZXhhY3RWYWx1ZSk7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgICdjb250YWlucyc6IGZ1bmN0aW9uIChjb250YWluc1ZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBjb250YWlucyAoY2FsbGJhY2ssIHZhbHVlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayh2YWx1ZS5pbmRleE9mKGNvbnRhaW5zVmFsdWUpID4gLTEpO1xuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAnbm90JzogZnVuY3Rpb24gKGV4YWN0VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5vdCAoY2FsbGJhY2ssIHZhbHVlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayh2YWx1ZSAhPT0gZXhhY3RWYWx1ZSk7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgICdtaW4tbGVuZ3RoJzogZnVuY3Rpb24gKG1pbmltdW1MZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG1pbkxlbmd0aCAoY2FsbGJhY2ssIHZhbHVlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayh2YWx1ZS5sZW5ndGggPj0gbWluaW11bUxlbmd0aCk7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgICdtYXgtbGVuZ3RoJzogZnVuY3Rpb24gKG1heGltdW1MZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG1heExlbmd0aCAoY2FsbGJhY2ssIHZhbHVlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayh2YWx1ZS5sZW5ndGggPD0gbWF4aW11bUxlbmd0aCk7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgICdleGFjdC1sZW5ndGgnOiBmdW5jdGlvbiAoZXhhY3RMZW4pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGV4YWN0TGVuZ3RoIChjYWxsYmFjaywgdmFsdWUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHZhbHVlLmxlbmd0aCA9PT0gK2V4YWN0TGVuKTtcbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgJ2JldHdlZW4tbGVuZ3RoJzogZnVuY3Rpb24gKG1pbmltdW1MZW5ndGgsIG1heGltdW1MZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGJldHdlZW5MZW5ndGggKGNhbGxiYWNrLCB2YWx1ZSkge1xuICAgICAgICAgICAgdmFyIGFib3ZlTWluTGVuZ3RoID0gdmFsdWUubGVuZ3RoID49IG1pbmltdW1MZW5ndGgsXG4gICAgICAgICAgICAgICAgYmVsb3dNYXhMZW5ndGggPSB2YWx1ZS5sZW5ndGggPD0gbWF4aW11bUxlbmd0aDtcblxuICAgICAgICAgICAgY2FsbGJhY2soYWJvdmVNaW5MZW5ndGggJiYgYmVsb3dNYXhMZW5ndGgpO1xuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAnbWF4LW51bWJlcic6IGZ1bmN0aW9uIChtYXhpbXVtTnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBtYXhOdW1iZXIgKGNhbGxiYWNrLCB2YWx1ZSkge1xuICAgICAgICAgICAgY2FsbGJhY2soK3ZhbHVlIDw9IG1heGltdW1OdW1iZXIpO1xuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAnbWluLW51bWJlcic6IGZ1bmN0aW9uIChtaW5pbXVtTnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBtaW5OdW1iZXIgKGNhbGxiYWNrLCB2YWx1ZSkge1xuICAgICAgICAgICAgY2FsbGJhY2soK3ZhbHVlID49IG1pbmltdW1OdW1iZXIpO1xuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAnYmV0d2Vlbi1udW1iZXInOiBmdW5jdGlvbiAobWluaW11bU51bWJlciwgbWF4aW11bU51bWJlcikge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gYmV0d2Vlbk51bWJlciAoY2FsbGJhY2ssIHZhbHVlKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygrdmFsdWUgPj0gbWluaW11bU51bWJlciAmJiArdmFsdWUgPD0gbWF4aW11bU51bWJlcik7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgICdpbnRlZ2VyJzogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNhbGxiYWNrLCB2YWx1ZSkge1xuICAgICAgICAgICAgY2FsbGJhY2soL15cXHMqXFxkK1xccyokLy50ZXN0KHZhbHVlKSk7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgICdmbG9hdCc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjYWxsYmFjaywgdmFsdWUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKC9eWy0rXT9bMC05XSsoXFwuWzAtOV0rKT8kLy50ZXN0KHZhbHVlKSk7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgICdzYW1lLWFzJzogZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgICAgIHZhciBzYW1lQXNFbGVtZW50ID0gbm9kLmdldEVsZW1lbnQoc2VsZWN0b3IpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBzYW1lQXMgKGNhbGxiYWNrLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICAgICAgLy8gJ3NhbWUtYXMnIGlzIHNwZWNpYWwsIGluIHRoYXQgaWYgaXQgaXMgdHJpZ2dlcmVkIGJ5IGFub3RoZXIgZmllbGRcbiAgICAgICAgICAgIC8vICh0aGUgb25lIGl0IHNob3VsZCBiZSBzaW1pbGFyIHRvKSwgYW5kIHRoZSBmaWVsZCBpdHNlbGYgaXMgZW1wdHksXG4gICAgICAgICAgICAvLyB0aGVuIGl0IGJhaWxzIG91dCB3aXRob3V0IGEgY2hlY2suIFRoaXMgaXMgdG8gYXZvaWQgc2hvd2luZyBhblxuICAgICAgICAgICAgLy8gZXJyb3IgbWVzc2FnZSBiZWZvcmUgdGhlIHVzZXIgaGFzIGV2ZW4gcmVhY2hlZCB0aGUgZWxlbWVudC5cbiAgICAgICAgICAgIGlmIChvcHRpb25zICYmXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ldmVudCAmJlxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZXZlbnQudGFyZ2V0ICYmXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ldmVudC50YXJnZXQgIT09IG9wdGlvbnMuZWxlbWVudCAmJlxuICAgICAgICAgICAgICAgIHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FsbGJhY2sodmFsdWUgPT09IHNhbWVBc0VsZW1lbnQudmFsdWUpO1xuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAnb25lLW9mJzogZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgICAgIHZhciBlbGVtZW50cyA9IG5vZC5nZXRFbGVtZW50cyhzZWxlY3Rvcik7XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0VmFsdWVzICgpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWVtbyArICcnICsgKGVsZW1lbnQudmFsdWUgfHwgJycpO1xuICAgICAgICAgICAgfSwgJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG9uZU9mIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2soZ2V0VmFsdWVzKCkudHJpbSgpLmxlbmd0aCA+IDApO1xuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAnb25seS1vbmUtb2YnOiBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRzID0gbm9kLmdldEVsZW1lbnRzKHNlbGVjdG9yKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gb25seU9uZU9mIChjYWxsYmFjaywgdmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBudW1PZlZhbHVlcyA9IDA7XG5cbiAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBudW1PZlZhbHVlcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhudW1PZlZhbHVlcyA9PT0gMSk7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgICdjaGVja2VkJzogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gY2hlY2tlZCAoY2FsbGJhY2ssIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhvcHRpb25zLmVsZW1lbnQuY2hlY2tlZCk7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgICdzb21lLXJhZGlvJzogZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgICAgIHZhciByYWRpb0VsZW1lbnRzID0gbm9kLmdldEVsZW1lbnRzKHNlbGVjdG9yKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gc29tZVJhZGlvIChjYWxsYmFjaywgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSByYWRpb0VsZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAobWVtbywgZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZW1vIHx8IGVsZW1lbnQuY2hlY2tlZDtcbiAgICAgICAgICAgIH0sIGZhbHNlKTtcblxuICAgICAgICAgICAgY2FsbGJhY2socmVzdWx0KTtcbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgJ3JlZ2V4cCc6IGZ1bmN0aW9uIChyZWcpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHJlZ0V4cCAoY2FsbGJhY2ssIHZhbHVlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhyZWcudGVzdCh2YWx1ZSkpO1xuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAnZW1haWwnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBSRkM4MjIgPSAvXihbXlxceDAwLVxceDIwXFx4MjJcXHgyOFxceDI5XFx4MmNcXHgyZVxceDNhLVxceDNjXFx4M2VcXHg0MFxceDViLVxceDVkXFx4N2YtXFx4ZmZdK3xcXHgyMihbXlxceDBkXFx4MjJcXHg1Y1xceDgwLVxceGZmXXxcXHg1Y1tcXHgwMC1cXHg3Zl0pKlxceDIyKShcXHgyZShbXlxceDAwLVxceDIwXFx4MjJcXHgyOFxceDI5XFx4MmNcXHgyZVxceDNhLVxceDNjXFx4M2VcXHg0MFxceDViLVxceDVkXFx4N2YtXFx4ZmZdK3xcXHgyMihbXlxceDBkXFx4MjJcXHg1Y1xceDgwLVxceGZmXXxcXHg1Y1tcXHgwMC1cXHg3Zl0pKlxceDIyKSkqXFx4NDAoW15cXHgwMC1cXHgyMFxceDIyXFx4MjhcXHgyOVxceDJjXFx4MmVcXHgzYS1cXHgzY1xceDNlXFx4NDBcXHg1Yi1cXHg1ZFxceDdmLVxceGZmXSt8XFx4NWIoW15cXHgwZFxceDViLVxceDVkXFx4ODAtXFx4ZmZdfFxceDVjW1xceDAwLVxceDdmXSkqXFx4NWQpKFxceDJlKFteXFx4MDAtXFx4MjBcXHgyMlxceDI4XFx4MjlcXHgyY1xceDJlXFx4M2EtXFx4M2NcXHgzZVxceDQwXFx4NWItXFx4NWRcXHg3Zi1cXHhmZl0rfFxceDViKFteXFx4MGRcXHg1Yi1cXHg1ZFxceDgwLVxceGZmXXxcXHg1Y1tcXHgwMC1cXHg3Zl0pKlxceDVkKSkqJC87XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGVtYWlsIChjYWxsYmFjaywgdmFsdWUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKFJGQzgyMi50ZXN0KHZhbHVlKSk7XG4gICAgICAgIH07XG4gICAgfVxufTtcblxuLy8gQ3VzdG9tRXZlbnQgcG9seWZpbGwgZm9yIG9sZGVyIElFIHZlcnNpb25zLiBUYWtlbiBmcm9tXG4vLyBnaXRodWIuY29tL2Q0dG9jY2hpbmkvY3VzdG9tZXZlbnQtcG9seWZpbGwvYmxvYi9tYXN0ZXIvQ3VzdG9tRXZlbnQuanNcbnRyeSB7XG4gICAgbmV3IEN1c3RvbUV2ZW50KFwidGVzdFwiKTtcbn0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgQ3VzdG9tRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIHBhcmFtcykge1xuICAgICAgICB2YXIgZXZ0O1xuICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge1xuICAgICAgICAgICAgYnViYmxlczogZmFsc2UsXG4gICAgICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGRldGFpbDogdW5kZWZpbmVkXG4gICAgICAgIH07XG5cbiAgICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJDdXN0b21FdmVudFwiKTtcbiAgICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuYnViYmxlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY2FuY2VsYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZGV0YWlsKTtcbiAgICAgICAgcmV0dXJuIGV2dDtcbiAgICB9O1xuXG4gICAgQ3VzdG9tRXZlbnQucHJvdG90eXBlID0gd2luZG93LkV2ZW50LnByb3RvdHlwZTtcbiAgICB3aW5kb3cuQ3VzdG9tRXZlbnQgPSBDdXN0b21FdmVudDtcbn1cblxuLy8gU2FmZWx5IGV4cG9ydCBub2QuXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IG5vZDtcbn1cbiIsInZhciBoYXNNYXAgPSB0eXBlb2YgTWFwID09PSAnZnVuY3Rpb24nICYmIE1hcC5wcm90b3R5cGU7XG52YXIgbWFwU2l6ZURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmIGhhc01hcCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTWFwLnByb3RvdHlwZSwgJ3NpemUnKSA6IG51bGw7XG52YXIgbWFwU2l6ZSA9IGhhc01hcCAmJiBtYXBTaXplRGVzY3JpcHRvciAmJiB0eXBlb2YgbWFwU2l6ZURlc2NyaXB0b3IuZ2V0ID09PSAnZnVuY3Rpb24nID8gbWFwU2l6ZURlc2NyaXB0b3IuZ2V0IDogbnVsbDtcbnZhciBtYXBGb3JFYWNoID0gaGFzTWFwICYmIE1hcC5wcm90b3R5cGUuZm9yRWFjaDtcbnZhciBoYXNTZXQgPSB0eXBlb2YgU2V0ID09PSAnZnVuY3Rpb24nICYmIFNldC5wcm90b3R5cGU7XG52YXIgc2V0U2l6ZURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmIGhhc1NldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoU2V0LnByb3RvdHlwZSwgJ3NpemUnKSA6IG51bGw7XG52YXIgc2V0U2l6ZSA9IGhhc1NldCAmJiBzZXRTaXplRGVzY3JpcHRvciAmJiB0eXBlb2Ygc2V0U2l6ZURlc2NyaXB0b3IuZ2V0ID09PSAnZnVuY3Rpb24nID8gc2V0U2l6ZURlc2NyaXB0b3IuZ2V0IDogbnVsbDtcbnZhciBzZXRGb3JFYWNoID0gaGFzU2V0ICYmIFNldC5wcm90b3R5cGUuZm9yRWFjaDtcbnZhciBoYXNXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgJiYgV2Vha01hcC5wcm90b3R5cGU7XG52YXIgd2Vha01hcEhhcyA9IGhhc1dlYWtNYXAgPyBXZWFrTWFwLnByb3RvdHlwZS5oYXMgOiBudWxsO1xudmFyIGhhc1dlYWtTZXQgPSB0eXBlb2YgV2Vha1NldCA9PT0gJ2Z1bmN0aW9uJyAmJiBXZWFrU2V0LnByb3RvdHlwZTtcbnZhciB3ZWFrU2V0SGFzID0gaGFzV2Vha1NldCA/IFdlYWtTZXQucHJvdG90eXBlLmhhcyA6IG51bGw7XG52YXIgaGFzV2Vha1JlZiA9IHR5cGVvZiBXZWFrUmVmID09PSAnZnVuY3Rpb24nICYmIFdlYWtSZWYucHJvdG90eXBlO1xudmFyIHdlYWtSZWZEZXJlZiA9IGhhc1dlYWtSZWYgPyBXZWFrUmVmLnByb3RvdHlwZS5kZXJlZiA6IG51bGw7XG52YXIgYm9vbGVhblZhbHVlT2YgPSBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mO1xudmFyIG9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBmdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyICRtYXRjaCA9IFN0cmluZy5wcm90b3R5cGUubWF0Y2g7XG52YXIgJHNsaWNlID0gU3RyaW5nLnByb3RvdHlwZS5zbGljZTtcbnZhciAkcmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcbnZhciAkdG9VcHBlckNhc2UgPSBTdHJpbmcucHJvdG90eXBlLnRvVXBwZXJDYXNlO1xudmFyICR0b0xvd2VyQ2FzZSA9IFN0cmluZy5wcm90b3R5cGUudG9Mb3dlckNhc2U7XG52YXIgJHRlc3QgPSBSZWdFeHAucHJvdG90eXBlLnRlc3Q7XG52YXIgJGNvbmNhdCA9IEFycmF5LnByb3RvdHlwZS5jb25jYXQ7XG52YXIgJGpvaW4gPSBBcnJheS5wcm90b3R5cGUuam9pbjtcbnZhciAkYXJyU2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgJGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBiaWdJbnRWYWx1ZU9mID0gdHlwZW9mIEJpZ0ludCA9PT0gJ2Z1bmN0aW9uJyA/IEJpZ0ludC5wcm90b3R5cGUudmFsdWVPZiA6IG51bGw7XG52YXIgZ09QUyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgc3ltVG9TdHJpbmcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnID8gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZyA6IG51bGw7XG52YXIgaGFzU2hhbW1lZFN5bWJvbHMgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdvYmplY3QnO1xuLy8gaWUsIGBoYXMtdG9zdHJpbmd0YWcvc2hhbXNcbnZhciB0b1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnICYmICh0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnID09PSBoYXNTaGFtbWVkU3ltYm9scyA/ICdvYmplY3QnIDogJ3N5bWJvbCcpXG4gICAgPyBTeW1ib2wudG9TdHJpbmdUYWdcbiAgICA6IG51bGw7XG52YXIgaXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxudmFyIGdQTyA9ICh0eXBlb2YgUmVmbGVjdCA9PT0gJ2Z1bmN0aW9uJyA/IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YgOiBPYmplY3QuZ2V0UHJvdG90eXBlT2YpIHx8IChcbiAgICBbXS5fX3Byb3RvX18gPT09IEFycmF5LnByb3RvdHlwZSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvXG4gICAgICAgID8gZnVuY3Rpb24gKE8pIHtcbiAgICAgICAgICAgIHJldHVybiBPLl9fcHJvdG9fXzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b1xuICAgICAgICB9XG4gICAgICAgIDogbnVsbFxuKTtcblxuZnVuY3Rpb24gYWRkTnVtZXJpY1NlcGFyYXRvcihudW0sIHN0cikge1xuICAgIGlmIChcbiAgICAgICAgbnVtID09PSBJbmZpbml0eVxuICAgICAgICB8fCBudW0gPT09IC1JbmZpbml0eVxuICAgICAgICB8fCBudW0gIT09IG51bVxuICAgICAgICB8fCAobnVtICYmIG51bSA+IC0xMDAwICYmIG51bSA8IDEwMDApXG4gICAgICAgIHx8ICR0ZXN0LmNhbGwoL2UvLCBzdHIpXG4gICAgKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIHZhciBzZXBSZWdleCA9IC9bMC05XSg/PSg/OlswLTldezN9KSsoPyFbMC05XSkpL2c7XG4gICAgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInKSB7XG4gICAgICAgIHZhciBpbnQgPSBudW0gPCAwID8gLSRmbG9vcigtbnVtKSA6ICRmbG9vcihudW0pOyAvLyB0cnVuYyhudW0pXG4gICAgICAgIGlmIChpbnQgIT09IG51bSkge1xuICAgICAgICAgICAgdmFyIGludFN0ciA9IFN0cmluZyhpbnQpO1xuICAgICAgICAgICAgdmFyIGRlYyA9ICRzbGljZS5jYWxsKHN0ciwgaW50U3RyLmxlbmd0aCArIDEpO1xuICAgICAgICAgICAgcmV0dXJuICRyZXBsYWNlLmNhbGwoaW50U3RyLCBzZXBSZWdleCwgJyQmXycpICsgJy4nICsgJHJlcGxhY2UuY2FsbCgkcmVwbGFjZS5jYWxsKGRlYywgLyhbMC05XXszfSkvZywgJyQmXycpLCAvXyQvLCAnJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICRyZXBsYWNlLmNhbGwoc3RyLCBzZXBSZWdleCwgJyQmXycpO1xufVxuXG52YXIgdXRpbEluc3BlY3QgPSByZXF1aXJlKCcuL3V0aWwuaW5zcGVjdCcpO1xudmFyIGluc3BlY3RDdXN0b20gPSB1dGlsSW5zcGVjdC5jdXN0b207XG52YXIgaW5zcGVjdFN5bWJvbCA9IGlzU3ltYm9sKGluc3BlY3RDdXN0b20pID8gaW5zcGVjdEN1c3RvbSA6IG51bGw7XG5cbnZhciBxdW90ZXMgPSB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgICdkb3VibGUnOiAnXCInLFxuICAgIHNpbmdsZTogXCInXCJcbn07XG52YXIgcXVvdGVSRXMgPSB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgICdkb3VibGUnOiAvKFtcIlxcXFxdKS9nLFxuICAgIHNpbmdsZTogLyhbJ1xcXFxdKS9nXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluc3BlY3RfKG9iaiwgb3B0aW9ucywgZGVwdGgsIHNlZW4pIHtcbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBpZiAoaGFzKG9wdHMsICdxdW90ZVN0eWxlJykgJiYgIWhhcyhxdW90ZXMsIG9wdHMucXVvdGVTdHlsZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwicXVvdGVTdHlsZVwiIG11c3QgYmUgXCJzaW5nbGVcIiBvciBcImRvdWJsZVwiJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICAgaGFzKG9wdHMsICdtYXhTdHJpbmdMZW5ndGgnKSAmJiAodHlwZW9mIG9wdHMubWF4U3RyaW5nTGVuZ3RoID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgPyBvcHRzLm1heFN0cmluZ0xlbmd0aCA8IDAgJiYgb3B0cy5tYXhTdHJpbmdMZW5ndGggIT09IEluZmluaXR5XG4gICAgICAgICAgICA6IG9wdHMubWF4U3RyaW5nTGVuZ3RoICE9PSBudWxsXG4gICAgICAgIClcbiAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwibWF4U3RyaW5nTGVuZ3RoXCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgSW5maW5pdHksIG9yIGBudWxsYCcpO1xuICAgIH1cbiAgICB2YXIgY3VzdG9tSW5zcGVjdCA9IGhhcyhvcHRzLCAnY3VzdG9tSW5zcGVjdCcpID8gb3B0cy5jdXN0b21JbnNwZWN0IDogdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGN1c3RvbUluc3BlY3QgIT09ICdib29sZWFuJyAmJiBjdXN0b21JbnNwZWN0ICE9PSAnc3ltYm9sJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJjdXN0b21JbnNwZWN0XCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGB0cnVlYCwgYGZhbHNlYCwgb3IgYFxcJ3N5bWJvbFxcJ2AnKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAgIGhhcyhvcHRzLCAnaW5kZW50JylcbiAgICAgICAgJiYgb3B0cy5pbmRlbnQgIT09IG51bGxcbiAgICAgICAgJiYgb3B0cy5pbmRlbnQgIT09ICdcXHQnXG4gICAgICAgICYmICEocGFyc2VJbnQob3B0cy5pbmRlbnQsIDEwKSA9PT0gb3B0cy5pbmRlbnQgJiYgb3B0cy5pbmRlbnQgPiAwKVxuICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJpbmRlbnRcIiBtdXN0IGJlIFwiXFxcXHRcIiwgYW4gaW50ZWdlciA+IDAsIG9yIGBudWxsYCcpO1xuICAgIH1cbiAgICBpZiAoaGFzKG9wdHMsICdudW1lcmljU2VwYXJhdG9yJykgJiYgdHlwZW9mIG9wdHMubnVtZXJpY1NlcGFyYXRvciAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcIm51bWVyaWNTZXBhcmF0b3JcIiwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYHRydWVgIG9yIGBmYWxzZWAnKTtcbiAgICB9XG4gICAgdmFyIG51bWVyaWNTZXBhcmF0b3IgPSBvcHRzLm51bWVyaWNTZXBhcmF0b3I7XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIG9iaiA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpbnNwZWN0U3RyaW5nKG9iaiwgb3B0cyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAob2JqID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gSW5maW5pdHkgLyBvYmogPiAwID8gJzAnIDogJy0wJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RyID0gU3RyaW5nKG9iaik7XG4gICAgICAgIHJldHVybiBudW1lcmljU2VwYXJhdG9yID8gYWRkTnVtZXJpY1NlcGFyYXRvcihvYmosIHN0cikgOiBzdHI7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYmlnaW50Jykge1xuICAgICAgICB2YXIgYmlnSW50U3RyID0gU3RyaW5nKG9iaikgKyAnbic7XG4gICAgICAgIHJldHVybiBudW1lcmljU2VwYXJhdG9yID8gYWRkTnVtZXJpY1NlcGFyYXRvcihvYmosIGJpZ0ludFN0cikgOiBiaWdJbnRTdHI7XG4gICAgfVxuXG4gICAgdmFyIG1heERlcHRoID0gdHlwZW9mIG9wdHMuZGVwdGggPT09ICd1bmRlZmluZWQnID8gNSA6IG9wdHMuZGVwdGg7XG4gICAgaWYgKHR5cGVvZiBkZXB0aCA9PT0gJ3VuZGVmaW5lZCcpIHsgZGVwdGggPSAwOyB9XG4gICAgaWYgKGRlcHRoID49IG1heERlcHRoICYmIG1heERlcHRoID4gMCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gaXNBcnJheShvYmopID8gJ1tBcnJheV0nIDogJ1tPYmplY3RdJztcbiAgICB9XG5cbiAgICB2YXIgaW5kZW50ID0gZ2V0SW5kZW50KG9wdHMsIGRlcHRoKTtcblxuICAgIGlmICh0eXBlb2Ygc2VlbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2VlbiA9IFtdO1xuICAgIH0gZWxzZSBpZiAoaW5kZXhPZihzZWVuLCBvYmopID49IDApIHtcbiAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnNwZWN0KHZhbHVlLCBmcm9tLCBub0luZGVudCkge1xuICAgICAgICBpZiAoZnJvbSkge1xuICAgICAgICAgICAgc2VlbiA9ICRhcnJTbGljZS5jYWxsKHNlZW4pO1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub0luZGVudCkge1xuICAgICAgICAgICAgdmFyIG5ld09wdHMgPSB7XG4gICAgICAgICAgICAgICAgZGVwdGg6IG9wdHMuZGVwdGhcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoaGFzKG9wdHMsICdxdW90ZVN0eWxlJykpIHtcbiAgICAgICAgICAgICAgICBuZXdPcHRzLnF1b3RlU3R5bGUgPSBvcHRzLnF1b3RlU3R5bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW5zcGVjdF8odmFsdWUsIG5ld09wdHMsIGRlcHRoICsgMSwgc2Vlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3BlY3RfKHZhbHVlLCBvcHRzLCBkZXB0aCArIDEsIHNlZW4pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nICYmICFpc1JlZ0V4cChvYmopKSB7IC8vIGluIG9sZGVyIGVuZ2luZXMsIHJlZ2V4ZXMgYXJlIGNhbGxhYmxlXG4gICAgICAgIHZhciBuYW1lID0gbmFtZU9mKG9iaik7XG4gICAgICAgIHZhciBrZXlzID0gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpO1xuICAgICAgICByZXR1cm4gJ1tGdW5jdGlvbicgKyAobmFtZSA/ICc6ICcgKyBuYW1lIDogJyAoYW5vbnltb3VzKScpICsgJ10nICsgKGtleXMubGVuZ3RoID4gMCA/ICcgeyAnICsgJGpvaW4uY2FsbChrZXlzLCAnLCAnKSArICcgfScgOiAnJyk7XG4gICAgfVxuICAgIGlmIChpc1N5bWJvbChvYmopKSB7XG4gICAgICAgIHZhciBzeW1TdHJpbmcgPSBoYXNTaGFtbWVkU3ltYm9scyA/ICRyZXBsYWNlLmNhbGwoU3RyaW5nKG9iaiksIC9eKFN5bWJvbFxcKC4qXFwpKV9bXildKiQvLCAnJDEnKSA6IHN5bVRvU3RyaW5nLmNhbGwob2JqKTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmICFoYXNTaGFtbWVkU3ltYm9scyA/IG1hcmtCb3hlZChzeW1TdHJpbmcpIDogc3ltU3RyaW5nO1xuICAgIH1cbiAgICBpZiAoaXNFbGVtZW50KG9iaikpIHtcbiAgICAgICAgdmFyIHMgPSAnPCcgKyAkdG9Mb3dlckNhc2UuY2FsbChTdHJpbmcob2JqLm5vZGVOYW1lKSk7XG4gICAgICAgIHZhciBhdHRycyA9IG9iai5hdHRyaWJ1dGVzIHx8IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzICs9ICcgJyArIGF0dHJzW2ldLm5hbWUgKyAnPScgKyB3cmFwUXVvdGVzKHF1b3RlKGF0dHJzW2ldLnZhbHVlKSwgJ2RvdWJsZScsIG9wdHMpO1xuICAgICAgICB9XG4gICAgICAgIHMgKz0gJz4nO1xuICAgICAgICBpZiAob2JqLmNoaWxkTm9kZXMgJiYgb2JqLmNoaWxkTm9kZXMubGVuZ3RoKSB7IHMgKz0gJy4uLic7IH1cbiAgICAgICAgcyArPSAnPC8nICsgJHRvTG93ZXJDYXNlLmNhbGwoU3RyaW5nKG9iai5ub2RlTmFtZSkpICsgJz4nO1xuICAgICAgICByZXR1cm4gcztcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgICAgICBpZiAob2JqLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJ1tdJzsgfVxuICAgICAgICB2YXIgeHMgPSBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCk7XG4gICAgICAgIGlmIChpbmRlbnQgJiYgIXNpbmdsZUxpbmVWYWx1ZXMoeHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1snICsgaW5kZW50ZWRKb2luKHhzLCBpbmRlbnQpICsgJ10nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnWyAnICsgJGpvaW4uY2FsbCh4cywgJywgJykgKyAnIF0nO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcihvYmopKSB7XG4gICAgICAgIHZhciBwYXJ0cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgaWYgKCEoJ2NhdXNlJyBpbiBFcnJvci5wcm90b3R5cGUpICYmICdjYXVzZScgaW4gb2JqICYmICFpc0VudW1lcmFibGUuY2FsbChvYmosICdjYXVzZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3sgWycgKyBTdHJpbmcob2JqKSArICddICcgKyAkam9pbi5jYWxsKCRjb25jYXQuY2FsbCgnW2NhdXNlXTogJyArIGluc3BlY3Qob2JqLmNhdXNlKSwgcGFydHMpLCAnLCAnKSArICcgfSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJ1snICsgU3RyaW5nKG9iaikgKyAnXSc7IH1cbiAgICAgICAgcmV0dXJuICd7IFsnICsgU3RyaW5nKG9iaikgKyAnXSAnICsgJGpvaW4uY2FsbChwYXJ0cywgJywgJykgKyAnIH0nO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgY3VzdG9tSW5zcGVjdCkge1xuICAgICAgICBpZiAoaW5zcGVjdFN5bWJvbCAmJiB0eXBlb2Ygb2JqW2luc3BlY3RTeW1ib2xdID09PSAnZnVuY3Rpb24nICYmIHV0aWxJbnNwZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdXRpbEluc3BlY3Qob2JqLCB7IGRlcHRoOiBtYXhEZXB0aCAtIGRlcHRoIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGN1c3RvbUluc3BlY3QgIT09ICdzeW1ib2wnICYmIHR5cGVvZiBvYmouaW5zcGVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIG9iai5pbnNwZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzTWFwKG9iaikpIHtcbiAgICAgICAgdmFyIG1hcFBhcnRzID0gW107XG4gICAgICAgIGlmIChtYXBGb3JFYWNoKSB7XG4gICAgICAgICAgICBtYXBGb3JFYWNoLmNhbGwob2JqLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgICAgIG1hcFBhcnRzLnB1c2goaW5zcGVjdChrZXksIG9iaiwgdHJ1ZSkgKyAnID0+ICcgKyBpbnNwZWN0KHZhbHVlLCBvYmopKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uT2YoJ01hcCcsIG1hcFNpemUuY2FsbChvYmopLCBtYXBQYXJ0cywgaW5kZW50KTtcbiAgICB9XG4gICAgaWYgKGlzU2V0KG9iaikpIHtcbiAgICAgICAgdmFyIHNldFBhcnRzID0gW107XG4gICAgICAgIGlmIChzZXRGb3JFYWNoKSB7XG4gICAgICAgICAgICBzZXRGb3JFYWNoLmNhbGwob2JqLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzZXRQYXJ0cy5wdXNoKGluc3BlY3QodmFsdWUsIG9iaikpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25PZignU2V0Jywgc2V0U2l6ZS5jYWxsKG9iaiksIHNldFBhcnRzLCBpbmRlbnQpO1xuICAgIH1cbiAgICBpZiAoaXNXZWFrTWFwKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHdlYWtDb2xsZWN0aW9uT2YoJ1dlYWtNYXAnKTtcbiAgICB9XG4gICAgaWYgKGlzV2Vha1NldChvYmopKSB7XG4gICAgICAgIHJldHVybiB3ZWFrQ29sbGVjdGlvbk9mKCdXZWFrU2V0Jyk7XG4gICAgfVxuICAgIGlmIChpc1dlYWtSZWYob2JqKSkge1xuICAgICAgICByZXR1cm4gd2Vha0NvbGxlY3Rpb25PZignV2Vha1JlZicpO1xuICAgIH1cbiAgICBpZiAoaXNOdW1iZXIob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGluc3BlY3QoTnVtYmVyKG9iaikpKTtcbiAgICB9XG4gICAgaWYgKGlzQmlnSW50KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtCb3hlZChpbnNwZWN0KGJpZ0ludFZhbHVlT2YuY2FsbChvYmopKSk7XG4gICAgfVxuICAgIGlmIChpc0Jvb2xlYW4ob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGJvb2xlYW5WYWx1ZU9mLmNhbGwob2JqKSk7XG4gICAgfVxuICAgIGlmIChpc1N0cmluZyhvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoaW5zcGVjdChTdHJpbmcob2JqKSkpO1xuICAgIH1cbiAgICAvLyBub3RlOiBpbiBJRSA4LCBzb21ldGltZXMgYGdsb2JhbCAhPT0gd2luZG93YCBidXQgYm90aCBhcmUgdGhlIHByb3RvdHlwZXMgb2YgZWFjaCBvdGhlclxuICAgIC8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBvYmogPT09IHdpbmRvdykge1xuICAgICAgICByZXR1cm4gJ3sgW29iamVjdCBXaW5kb3ddIH0nO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAgICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqID09PSBnbG9iYWxUaGlzKVxuICAgICAgICB8fCAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqID09PSBnbG9iYWwpXG4gICAgKSB7XG4gICAgICAgIHJldHVybiAneyBbb2JqZWN0IGdsb2JhbFRoaXNdIH0nO1xuICAgIH1cbiAgICBpZiAoIWlzRGF0ZShvYmopICYmICFpc1JlZ0V4cChvYmopKSB7XG4gICAgICAgIHZhciB5cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgdmFyIGlzUGxhaW5PYmplY3QgPSBnUE8gPyBnUE8ob2JqKSA9PT0gT2JqZWN0LnByb3RvdHlwZSA6IG9iaiBpbnN0YW5jZW9mIE9iamVjdCB8fCBvYmouY29uc3RydWN0b3IgPT09IE9iamVjdDtcbiAgICAgICAgdmFyIHByb3RvVGFnID0gb2JqIGluc3RhbmNlb2YgT2JqZWN0ID8gJycgOiAnbnVsbCBwcm90b3R5cGUnO1xuICAgICAgICB2YXIgc3RyaW5nVGFnID0gIWlzUGxhaW5PYmplY3QgJiYgdG9TdHJpbmdUYWcgJiYgT2JqZWN0KG9iaikgPT09IG9iaiAmJiB0b1N0cmluZ1RhZyBpbiBvYmogPyAkc2xpY2UuY2FsbCh0b1N0cihvYmopLCA4LCAtMSkgOiBwcm90b1RhZyA/ICdPYmplY3QnIDogJyc7XG4gICAgICAgIHZhciBjb25zdHJ1Y3RvclRhZyA9IGlzUGxhaW5PYmplY3QgfHwgdHlwZW9mIG9iai5jb25zdHJ1Y3RvciAhPT0gJ2Z1bmN0aW9uJyA/ICcnIDogb2JqLmNvbnN0cnVjdG9yLm5hbWUgPyBvYmouY29uc3RydWN0b3IubmFtZSArICcgJyA6ICcnO1xuICAgICAgICB2YXIgdGFnID0gY29uc3RydWN0b3JUYWcgKyAoc3RyaW5nVGFnIHx8IHByb3RvVGFnID8gJ1snICsgJGpvaW4uY2FsbCgkY29uY2F0LmNhbGwoW10sIHN0cmluZ1RhZyB8fCBbXSwgcHJvdG9UYWcgfHwgW10pLCAnOiAnKSArICddICcgOiAnJyk7XG4gICAgICAgIGlmICh5cy5sZW5ndGggPT09IDApIHsgcmV0dXJuIHRhZyArICd7fSc7IH1cbiAgICAgICAgaWYgKGluZGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhZyArICd7JyArIGluZGVudGVkSm9pbih5cywgaW5kZW50KSArICd9JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFnICsgJ3sgJyArICRqb2luLmNhbGwoeXMsICcsICcpICsgJyB9JztcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyhvYmopO1xufTtcblxuZnVuY3Rpb24gd3JhcFF1b3RlcyhzLCBkZWZhdWx0U3R5bGUsIG9wdHMpIHtcbiAgICB2YXIgc3R5bGUgPSBvcHRzLnF1b3RlU3R5bGUgfHwgZGVmYXVsdFN0eWxlO1xuICAgIHZhciBxdW90ZUNoYXIgPSBxdW90ZXNbc3R5bGVdO1xuICAgIHJldHVybiBxdW90ZUNoYXIgKyBzICsgcXVvdGVDaGFyO1xufVxuXG5mdW5jdGlvbiBxdW90ZShzKSB7XG4gICAgcmV0dXJuICRyZXBsYWNlLmNhbGwoU3RyaW5nKHMpLCAvXCIvZywgJyZxdW90OycpO1xufVxuXG5mdW5jdGlvbiBjYW5UcnVzdFRvU3RyaW5nKG9iaikge1xuICAgIHJldHVybiAhdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiAodG9TdHJpbmdUYWcgaW4gb2JqIHx8IHR5cGVvZiBvYmpbdG9TdHJpbmdUYWddICE9PSAndW5kZWZpbmVkJykpO1xufVxuZnVuY3Rpb24gaXNBcnJheShvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEFycmF5XScgJiYgY2FuVHJ1c3RUb1N0cmluZyhvYmopOyB9XG5mdW5jdGlvbiBpc0RhdGUob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBEYXRlXScgJiYgY2FuVHJ1c3RUb1N0cmluZyhvYmopOyB9XG5mdW5jdGlvbiBpc1JlZ0V4cChvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IFJlZ0V4cF0nICYmIGNhblRydXN0VG9TdHJpbmcob2JqKTsgfVxuZnVuY3Rpb24gaXNFcnJvcihvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEVycm9yXScgJiYgY2FuVHJ1c3RUb1N0cmluZyhvYmopOyB9XG5mdW5jdGlvbiBpc1N0cmluZyhvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IFN0cmluZ10nICYmIGNhblRydXN0VG9TdHJpbmcob2JqKTsgfVxuZnVuY3Rpb24gaXNOdW1iZXIob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiBjYW5UcnVzdFRvU3RyaW5nKG9iaik7IH1cbmZ1bmN0aW9uIGlzQm9vbGVhbihvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEJvb2xlYW5dJyAmJiBjYW5UcnVzdFRvU3RyaW5nKG9iaik7IH1cblxuLy8gU3ltYm9sIGFuZCBCaWdJbnQgZG8gaGF2ZSBTeW1ib2wudG9TdHJpbmdUYWcgYnkgc3BlYywgc28gdGhhdCBjYW4ndCBiZSB1c2VkIHRvIGVsaW1pbmF0ZSBmYWxzZSBwb3NpdGl2ZXNcbmZ1bmN0aW9uIGlzU3ltYm9sKG9iaikge1xuICAgIGlmIChoYXNTaGFtbWVkU3ltYm9scykge1xuICAgICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiBpbnN0YW5jZW9mIFN5bWJvbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCAhc3ltVG9TdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBzeW1Ub1N0cmluZy5jYWxsKG9iaik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc0JpZ0ludChvYmopIHtcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCAhYmlnSW50VmFsdWVPZikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGJpZ0ludFZhbHVlT2YuY2FsbChvYmopO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkgfHwgZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5IGluIHRoaXM7IH07XG5mdW5jdGlvbiBoYXMob2JqLCBrZXkpIHtcbiAgICByZXR1cm4gaGFzT3duLmNhbGwob2JqLCBrZXkpO1xufVxuXG5mdW5jdGlvbiB0b1N0cihvYmopIHtcbiAgICByZXR1cm4gb2JqZWN0VG9TdHJpbmcuY2FsbChvYmopO1xufVxuXG5mdW5jdGlvbiBuYW1lT2YoZikge1xuICAgIGlmIChmLm5hbWUpIHsgcmV0dXJuIGYubmFtZTsgfVxuICAgIHZhciBtID0gJG1hdGNoLmNhbGwoZnVuY3Rpb25Ub1N0cmluZy5jYWxsKGYpLCAvXmZ1bmN0aW9uXFxzKihbXFx3JF0rKS8pO1xuICAgIGlmIChtKSB7IHJldHVybiBtWzFdOyB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgICBpZiAoeHMuaW5kZXhPZikgeyByZXR1cm4geHMuaW5kZXhPZih4KTsgfVxuICAgIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmICh4c1tpXSA9PT0geCkgeyByZXR1cm4gaTsgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGlzTWFwKHgpIHtcbiAgICBpZiAoIW1hcFNpemUgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgbWFwU2l6ZS5jYWxsKHgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2V0U2l6ZS5jYWxsKHgpO1xuICAgICAgICB9IGNhdGNoIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIE1hcDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzV2Vha01hcCh4KSB7XG4gICAgaWYgKCF3ZWFrTWFwSGFzIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHdlYWtNYXBIYXMuY2FsbCh4LCB3ZWFrTWFwSGFzKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdlYWtTZXRIYXMuY2FsbCh4LCB3ZWFrU2V0SGFzKTtcbiAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBXZWFrTWFwOyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNXZWFrUmVmKHgpIHtcbiAgICBpZiAoIXdlYWtSZWZEZXJlZiB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICB3ZWFrUmVmRGVyZWYuY2FsbCh4KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzU2V0KHgpIHtcbiAgICBpZiAoIXNldFNpemUgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgc2V0U2l6ZS5jYWxsKHgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbWFwU2l6ZS5jYWxsKHgpO1xuICAgICAgICB9IGNhdGNoIChtKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIFNldDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzV2Vha1NldCh4KSB7XG4gICAgaWYgKCF3ZWFrU2V0SGFzIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHdlYWtTZXRIYXMuY2FsbCh4LCB3ZWFrU2V0SGFzKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdlYWtNYXBIYXMuY2FsbCh4LCB3ZWFrTWFwSGFzKTtcbiAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBXZWFrU2V0OyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNFbGVtZW50KHgpIHtcbiAgICBpZiAoIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmICh0eXBlb2YgSFRNTEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHggaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiB4Lm5vZGVOYW1lID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgeC5nZXRBdHRyaWJ1dGUgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGluc3BlY3RTdHJpbmcoc3RyLCBvcHRzKSB7XG4gICAgaWYgKHN0ci5sZW5ndGggPiBvcHRzLm1heFN0cmluZ0xlbmd0aCkge1xuICAgICAgICB2YXIgcmVtYWluaW5nID0gc3RyLmxlbmd0aCAtIG9wdHMubWF4U3RyaW5nTGVuZ3RoO1xuICAgICAgICB2YXIgdHJhaWxlciA9ICcuLi4gJyArIHJlbWFpbmluZyArICcgbW9yZSBjaGFyYWN0ZXInICsgKHJlbWFpbmluZyA+IDEgPyAncycgOiAnJyk7XG4gICAgICAgIHJldHVybiBpbnNwZWN0U3RyaW5nKCRzbGljZS5jYWxsKHN0ciwgMCwgb3B0cy5tYXhTdHJpbmdMZW5ndGgpLCBvcHRzKSArIHRyYWlsZXI7XG4gICAgfVxuICAgIHZhciBxdW90ZVJFID0gcXVvdGVSRXNbb3B0cy5xdW90ZVN0eWxlIHx8ICdzaW5nbGUnXTtcbiAgICBxdW90ZVJFLmxhc3RJbmRleCA9IDA7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbiAgICB2YXIgcyA9ICRyZXBsYWNlLmNhbGwoJHJlcGxhY2UuY2FsbChzdHIsIHF1b3RlUkUsICdcXFxcJDEnKSwgL1tcXHgwMC1cXHgxZl0vZywgbG93Ynl0ZSk7XG4gICAgcmV0dXJuIHdyYXBRdW90ZXMocywgJ3NpbmdsZScsIG9wdHMpO1xufVxuXG5mdW5jdGlvbiBsb3dieXRlKGMpIHtcbiAgICB2YXIgbiA9IGMuY2hhckNvZGVBdCgwKTtcbiAgICB2YXIgeCA9IHtcbiAgICAgICAgODogJ2InLFxuICAgICAgICA5OiAndCcsXG4gICAgICAgIDEwOiAnbicsXG4gICAgICAgIDEyOiAnZicsXG4gICAgICAgIDEzOiAncidcbiAgICB9W25dO1xuICAgIGlmICh4KSB7IHJldHVybiAnXFxcXCcgKyB4OyB9XG4gICAgcmV0dXJuICdcXFxceCcgKyAobiA8IDB4MTAgPyAnMCcgOiAnJykgKyAkdG9VcHBlckNhc2UuY2FsbChuLnRvU3RyaW5nKDE2KSk7XG59XG5cbmZ1bmN0aW9uIG1hcmtCb3hlZChzdHIpIHtcbiAgICByZXR1cm4gJ09iamVjdCgnICsgc3RyICsgJyknO1xufVxuXG5mdW5jdGlvbiB3ZWFrQ29sbGVjdGlvbk9mKHR5cGUpIHtcbiAgICByZXR1cm4gdHlwZSArICcgeyA/IH0nO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0aW9uT2YodHlwZSwgc2l6ZSwgZW50cmllcywgaW5kZW50KSB7XG4gICAgdmFyIGpvaW5lZEVudHJpZXMgPSBpbmRlbnQgPyBpbmRlbnRlZEpvaW4oZW50cmllcywgaW5kZW50KSA6ICRqb2luLmNhbGwoZW50cmllcywgJywgJyk7XG4gICAgcmV0dXJuIHR5cGUgKyAnICgnICsgc2l6ZSArICcpIHsnICsgam9pbmVkRW50cmllcyArICd9Jztcbn1cblxuZnVuY3Rpb24gc2luZ2xlTGluZVZhbHVlcyh4cykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGluZGV4T2YoeHNbaV0sICdcXG4nKSA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldEluZGVudChvcHRzLCBkZXB0aCkge1xuICAgIHZhciBiYXNlSW5kZW50O1xuICAgIGlmIChvcHRzLmluZGVudCA9PT0gJ1xcdCcpIHtcbiAgICAgICAgYmFzZUluZGVudCA9ICdcXHQnO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdHMuaW5kZW50ID09PSAnbnVtYmVyJyAmJiBvcHRzLmluZGVudCA+IDApIHtcbiAgICAgICAgYmFzZUluZGVudCA9ICRqb2luLmNhbGwoQXJyYXkob3B0cy5pbmRlbnQgKyAxKSwgJyAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmFzZTogYmFzZUluZGVudCxcbiAgICAgICAgcHJldjogJGpvaW4uY2FsbChBcnJheShkZXB0aCArIDEpLCBiYXNlSW5kZW50KVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGluZGVudGVkSm9pbih4cywgaW5kZW50KSB7XG4gICAgaWYgKHhzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJyc7IH1cbiAgICB2YXIgbGluZUpvaW5lciA9ICdcXG4nICsgaW5kZW50LnByZXYgKyBpbmRlbnQuYmFzZTtcbiAgICByZXR1cm4gbGluZUpvaW5lciArICRqb2luLmNhbGwoeHMsICcsJyArIGxpbmVKb2luZXIpICsgJ1xcbicgKyBpbmRlbnQucHJldjtcbn1cblxuZnVuY3Rpb24gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpIHtcbiAgICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iaik7XG4gICAgdmFyIHhzID0gW107XG4gICAgaWYgKGlzQXJyKSB7XG4gICAgICAgIHhzLmxlbmd0aCA9IG9iai5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB4c1tpXSA9IGhhcyhvYmosIGkpID8gaW5zcGVjdChvYmpbaV0sIG9iaikgOiAnJztcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgc3ltcyA9IHR5cGVvZiBnT1BTID09PSAnZnVuY3Rpb24nID8gZ09QUyhvYmopIDogW107XG4gICAgdmFyIHN5bU1hcDtcbiAgICBpZiAoaGFzU2hhbW1lZFN5bWJvbHMpIHtcbiAgICAgICAgc3ltTWFwID0ge307XG4gICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgc3ltcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgc3ltTWFwWyckJyArIHN5bXNba11dID0gc3ltc1trXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICBpZiAoIWhhcyhvYmosIGtleSkpIHsgY29udGludWU7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCwgbm8tY29udGludWVcbiAgICAgICAgaWYgKGlzQXJyICYmIFN0cmluZyhOdW1iZXIoa2V5KSkgPT09IGtleSAmJiBrZXkgPCBvYmoubGVuZ3RoKSB7IGNvbnRpbnVlOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLWNvbnRpbnVlXG4gICAgICAgIGlmIChoYXNTaGFtbWVkU3ltYm9scyAmJiBzeW1NYXBbJyQnICsga2V5XSBpbnN0YW5jZW9mIFN5bWJvbCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyB0byBwcmV2ZW50IHNoYW1tZWQgU3ltYm9scywgd2hpY2ggYXJlIHN0b3JlZCBhcyBzdHJpbmdzLCBmcm9tIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBzdHJpbmcga2V5IHNlY3Rpb25cbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby1jb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKCR0ZXN0LmNhbGwoL1teXFx3JF0vLCBrZXkpKSB7XG4gICAgICAgICAgICB4cy5wdXNoKGluc3BlY3Qoa2V5LCBvYmopICsgJzogJyArIGluc3BlY3Qob2JqW2tleV0sIG9iaikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeHMucHVzaChrZXkgKyAnOiAnICsgaW5zcGVjdChvYmpba2V5XSwgb2JqKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnT1BTID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3ltcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKGlzRW51bWVyYWJsZS5jYWxsKG9iaiwgc3ltc1tqXSkpIHtcbiAgICAgICAgICAgICAgICB4cy5wdXNoKCdbJyArIGluc3BlY3Qoc3ltc1tqXSkgKyAnXTogJyArIGluc3BlY3Qob2JqW3N5bXNbal1dLCBvYmopKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geHM7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciByZXBsYWNlID0gU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlO1xudmFyIHBlcmNlbnRUd2VudGllcyA9IC8lMjAvZztcblxudmFyIEZvcm1hdCA9IHtcbiAgICBSRkMxNzM4OiAnUkZDMTczOCcsXG4gICAgUkZDMzk4NjogJ1JGQzM5ODYnXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAnZGVmYXVsdCc6IEZvcm1hdC5SRkMzOTg2LFxuICAgIGZvcm1hdHRlcnM6IHtcbiAgICAgICAgUkZDMTczODogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbGFjZS5jYWxsKHZhbHVlLCBwZXJjZW50VHdlbnRpZXMsICcrJyk7XG4gICAgICAgIH0sXG4gICAgICAgIFJGQzM5ODY6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFJGQzE3Mzg6IEZvcm1hdC5SRkMxNzM4LFxuICAgIFJGQzM5ODY6IEZvcm1hdC5SRkMzOTg2XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3RyaW5naWZ5ID0gcmVxdWlyZSgnLi9zdHJpbmdpZnknKTtcbnZhciBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKTtcbnZhciBmb3JtYXRzID0gcmVxdWlyZSgnLi9mb3JtYXRzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGZvcm1hdHM6IGZvcm1hdHMsXG4gICAgcGFyc2U6IHBhcnNlLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gICAgYWxsb3dEb3RzOiBmYWxzZSxcbiAgICBhbGxvd0VtcHR5QXJyYXlzOiBmYWxzZSxcbiAgICBhbGxvd1Byb3RvdHlwZXM6IGZhbHNlLFxuICAgIGFsbG93U3BhcnNlOiBmYWxzZSxcbiAgICBhcnJheUxpbWl0OiAyMCxcbiAgICBjaGFyc2V0OiAndXRmLTgnLFxuICAgIGNoYXJzZXRTZW50aW5lbDogZmFsc2UsXG4gICAgY29tbWE6IGZhbHNlLFxuICAgIGRlY29kZURvdEluS2V5czogZmFsc2UsXG4gICAgZGVjb2RlcjogdXRpbHMuZGVjb2RlLFxuICAgIGRlbGltaXRlcjogJyYnLFxuICAgIGRlcHRoOiA1LFxuICAgIGR1cGxpY2F0ZXM6ICdjb21iaW5lJyxcbiAgICBpZ25vcmVRdWVyeVByZWZpeDogZmFsc2UsXG4gICAgaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzOiBmYWxzZSxcbiAgICBwYXJhbWV0ZXJMaW1pdDogMTAwMCxcbiAgICBwYXJzZUFycmF5czogdHJ1ZSxcbiAgICBwbGFpbk9iamVjdHM6IGZhbHNlLFxuICAgIHN0cmljdERlcHRoOiBmYWxzZSxcbiAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IGZhbHNlLFxuICAgIHRocm93T25MaW1pdEV4Y2VlZGVkOiBmYWxzZVxufTtcblxudmFyIGludGVycHJldE51bWVyaWNFbnRpdGllcyA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyYjKFxcZCspOy9nLCBmdW5jdGlvbiAoJDAsIG51bWJlclN0cikge1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChudW1iZXJTdHIsIDEwKSk7XG4gICAgfSk7XG59O1xuXG52YXIgcGFyc2VBcnJheVZhbHVlID0gZnVuY3Rpb24gKHZhbCwgb3B0aW9ucywgY3VycmVudEFycmF5TGVuZ3RoKSB7XG4gICAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJiBvcHRpb25zLmNvbW1hICYmIHZhbC5pbmRleE9mKCcsJykgPiAtMSkge1xuICAgICAgICByZXR1cm4gdmFsLnNwbGl0KCcsJyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMudGhyb3dPbkxpbWl0RXhjZWVkZWQgJiYgY3VycmVudEFycmF5TGVuZ3RoID49IG9wdGlvbnMuYXJyYXlMaW1pdCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXJyYXkgbGltaXQgZXhjZWVkZWQuIE9ubHkgJyArIG9wdGlvbnMuYXJyYXlMaW1pdCArICcgZWxlbWVudCcgKyAob3B0aW9ucy5hcnJheUxpbWl0ID09PSAxID8gJycgOiAncycpICsgJyBhbGxvd2VkIGluIGFuIGFycmF5LicpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWw7XG59O1xuXG4vLyBUaGlzIGlzIHdoYXQgYnJvd3NlcnMgd2lsbCBzdWJtaXQgd2hlbiB0aGUg4pyTIGNoYXJhY3RlciBvY2N1cnMgaW4gYW5cbi8vIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBib2R5IGFuZCB0aGUgZW5jb2Rpbmcgb2YgdGhlIHBhZ2UgY29udGFpbmluZ1xuLy8gdGhlIGZvcm0gaXMgaXNvLTg4NTktMSwgb3Igd2hlbiB0aGUgc3VibWl0dGVkIGZvcm0gaGFzIGFuIGFjY2VwdC1jaGFyc2V0XG4vLyBhdHRyaWJ1dGUgb2YgaXNvLTg4NTktMS4gUHJlc3VtYWJseSBhbHNvIHdpdGggb3RoZXIgY2hhcnNldHMgdGhhdCBkbyBub3QgY29udGFpblxuLy8gdGhlIOKckyBjaGFyYWN0ZXIsIHN1Y2ggYXMgdXMtYXNjaWkuXG52YXIgaXNvU2VudGluZWwgPSAndXRmOD0lMjYlMjMxMDAwMyUzQic7IC8vIGVuY29kZVVSSUNvbXBvbmVudCgnJiMxMDAwMzsnKVxuXG4vLyBUaGVzZSBhcmUgdGhlIHBlcmNlbnQtZW5jb2RlZCB1dGYtOCBvY3RldHMgcmVwcmVzZW50aW5nIGEgY2hlY2ttYXJrLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3QgYWN0dWFsbHkgaXMgdXRmLTggZW5jb2RlZC5cbnZhciBjaGFyc2V0U2VudGluZWwgPSAndXRmOD0lRTIlOUMlOTMnOyAvLyBlbmNvZGVVUklDb21wb25lbnQoJ+KckycpXG5cbnZhciBwYXJzZVZhbHVlcyA9IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdWYWx1ZXMoc3RyLCBvcHRpb25zKSB7XG4gICAgdmFyIG9iaiA9IHsgX19wcm90b19fOiBudWxsIH07XG5cbiAgICB2YXIgY2xlYW5TdHIgPSBvcHRpb25zLmlnbm9yZVF1ZXJ5UHJlZml4ID8gc3RyLnJlcGxhY2UoL15cXD8vLCAnJykgOiBzdHI7XG4gICAgY2xlYW5TdHIgPSBjbGVhblN0ci5yZXBsYWNlKC8lNUIvZ2ksICdbJykucmVwbGFjZSgvJTVEL2dpLCAnXScpO1xuXG4gICAgdmFyIGxpbWl0ID0gb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdCA9PT0gSW5maW5pdHkgPyB1bmRlZmluZWQgOiBvcHRpb25zLnBhcmFtZXRlckxpbWl0O1xuICAgIHZhciBwYXJ0cyA9IGNsZWFuU3RyLnNwbGl0KFxuICAgICAgICBvcHRpb25zLmRlbGltaXRlcixcbiAgICAgICAgb3B0aW9ucy50aHJvd09uTGltaXRFeGNlZWRlZCA/IGxpbWl0ICsgMSA6IGxpbWl0XG4gICAgKTtcblxuICAgIGlmIChvcHRpb25zLnRocm93T25MaW1pdEV4Y2VlZGVkICYmIHBhcnRzLmxlbmd0aCA+IGxpbWl0KSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdQYXJhbWV0ZXIgbGltaXQgZXhjZWVkZWQuIE9ubHkgJyArIGxpbWl0ICsgJyBwYXJhbWV0ZXInICsgKGxpbWl0ID09PSAxID8gJycgOiAncycpICsgJyBhbGxvd2VkLicpO1xuICAgIH1cblxuICAgIHZhciBza2lwSW5kZXggPSAtMTsgLy8gS2VlcCB0cmFjayBvZiB3aGVyZSB0aGUgdXRmOCBzZW50aW5lbCB3YXMgZm91bmRcbiAgICB2YXIgaTtcblxuICAgIHZhciBjaGFyc2V0ID0gb3B0aW9ucy5jaGFyc2V0O1xuICAgIGlmIChvcHRpb25zLmNoYXJzZXRTZW50aW5lbCkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0c1tpXS5pbmRleE9mKCd1dGY4PScpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzW2ldID09PSBjaGFyc2V0U2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9ICd1dGYtOCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0c1tpXSA9PT0gaXNvU2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9ICdpc28tODg1OS0xJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2tpcEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBpID0gcGFydHMubGVuZ3RoOyAvLyBUaGUgZXNsaW50IHNldHRpbmdzIGRvIG5vdCBhbGxvdyBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoaSA9PT0gc2tpcEluZGV4KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFydCA9IHBhcnRzW2ldO1xuXG4gICAgICAgIHZhciBicmFja2V0RXF1YWxzUG9zID0gcGFydC5pbmRleE9mKCddPScpO1xuICAgICAgICB2YXIgcG9zID0gYnJhY2tldEVxdWFsc1BvcyA9PT0gLTEgPyBwYXJ0LmluZGV4T2YoJz0nKSA6IGJyYWNrZXRFcXVhbHNQb3MgKyAxO1xuXG4gICAgICAgIHZhciBrZXk7XG4gICAgICAgIHZhciB2YWw7XG4gICAgICAgIGlmIChwb3MgPT09IC0xKSB7XG4gICAgICAgICAgICBrZXkgPSBvcHRpb25zLmRlY29kZXIocGFydCwgZGVmYXVsdHMuZGVjb2RlciwgY2hhcnNldCwgJ2tleScpO1xuICAgICAgICAgICAgdmFsID0gb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcgPyBudWxsIDogJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBrZXkgPSBvcHRpb25zLmRlY29kZXIocGFydC5zbGljZSgwLCBwb3MpLCBkZWZhdWx0cy5kZWNvZGVyLCBjaGFyc2V0LCAna2V5Jyk7XG5cbiAgICAgICAgICAgIHZhbCA9IHV0aWxzLm1heWJlTWFwKFxuICAgICAgICAgICAgICAgIHBhcnNlQXJyYXlWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgcGFydC5zbGljZShwb3MgKyAxKSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgaXNBcnJheShvYmpba2V5XSkgPyBvYmpba2V5XS5sZW5ndGggOiAwXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZW5jb2RlZFZhbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5kZWNvZGVyKGVuY29kZWRWYWwsIGRlZmF1bHRzLmRlY29kZXIsIGNoYXJzZXQsICd2YWx1ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsICYmIG9wdGlvbnMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzICYmIGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAgICAgdmFsID0gaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzKFN0cmluZyh2YWwpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0LmluZGV4T2YoJ1tdPScpID4gLTEpIHtcbiAgICAgICAgICAgIHZhbCA9IGlzQXJyYXkodmFsKSA/IFt2YWxdIDogdmFsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGV4aXN0aW5nID0gaGFzLmNhbGwob2JqLCBrZXkpO1xuICAgICAgICBpZiAoZXhpc3RpbmcgJiYgb3B0aW9ucy5kdXBsaWNhdGVzID09PSAnY29tYmluZScpIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gdXRpbHMuY29tYmluZShvYmpba2V5XSwgdmFsKTtcbiAgICAgICAgfSBlbHNlIGlmICghZXhpc3RpbmcgfHwgb3B0aW9ucy5kdXBsaWNhdGVzID09PSAnbGFzdCcpIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBwYXJzZU9iamVjdCA9IGZ1bmN0aW9uIChjaGFpbiwgdmFsLCBvcHRpb25zLCB2YWx1ZXNQYXJzZWQpIHtcbiAgICB2YXIgY3VycmVudEFycmF5TGVuZ3RoID0gMDtcbiAgICBpZiAoY2hhaW4ubGVuZ3RoID4gMCAmJiBjaGFpbltjaGFpbi5sZW5ndGggLSAxXSA9PT0gJ1tdJykge1xuICAgICAgICB2YXIgcGFyZW50S2V5ID0gY2hhaW4uc2xpY2UoMCwgLTEpLmpvaW4oJycpO1xuICAgICAgICBjdXJyZW50QXJyYXlMZW5ndGggPSBBcnJheS5pc0FycmF5KHZhbCkgJiYgdmFsW3BhcmVudEtleV0gPyB2YWxbcGFyZW50S2V5XS5sZW5ndGggOiAwO1xuICAgIH1cblxuICAgIHZhciBsZWFmID0gdmFsdWVzUGFyc2VkID8gdmFsIDogcGFyc2VBcnJheVZhbHVlKHZhbCwgb3B0aW9ucywgY3VycmVudEFycmF5TGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSBjaGFpbi5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgb2JqO1xuICAgICAgICB2YXIgcm9vdCA9IGNoYWluW2ldO1xuXG4gICAgICAgIGlmIChyb290ID09PSAnW10nICYmIG9wdGlvbnMucGFyc2VBcnJheXMpIHtcbiAgICAgICAgICAgIG9iaiA9IG9wdGlvbnMuYWxsb3dFbXB0eUFycmF5cyAmJiAobGVhZiA9PT0gJycgfHwgKG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nICYmIGxlYWYgPT09IG51bGwpKVxuICAgICAgICAgICAgICAgID8gW11cbiAgICAgICAgICAgICAgICA6IHV0aWxzLmNvbWJpbmUoW10sIGxlYWYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2JqID0gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyB7IF9fcHJvdG9fXzogbnVsbCB9IDoge307XG4gICAgICAgICAgICB2YXIgY2xlYW5Sb290ID0gcm9vdC5jaGFyQXQoMCkgPT09ICdbJyAmJiByb290LmNoYXJBdChyb290Lmxlbmd0aCAtIDEpID09PSAnXScgPyByb290LnNsaWNlKDEsIC0xKSA6IHJvb3Q7XG4gICAgICAgICAgICB2YXIgZGVjb2RlZFJvb3QgPSBvcHRpb25zLmRlY29kZURvdEluS2V5cyA/IGNsZWFuUm9vdC5yZXBsYWNlKC8lMkUvZywgJy4nKSA6IGNsZWFuUm9vdDtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlSW50KGRlY29kZWRSb290LCAxMCk7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMucGFyc2VBcnJheXMgJiYgZGVjb2RlZFJvb3QgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgb2JqID0geyAwOiBsZWFmIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICFpc05hTihpbmRleClcbiAgICAgICAgICAgICAgICAmJiByb290ICE9PSBkZWNvZGVkUm9vdFxuICAgICAgICAgICAgICAgICYmIFN0cmluZyhpbmRleCkgPT09IGRlY29kZWRSb290XG4gICAgICAgICAgICAgICAgJiYgaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgICYmIChvcHRpb25zLnBhcnNlQXJyYXlzICYmIGluZGV4IDw9IG9wdGlvbnMuYXJyYXlMaW1pdClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG9iaiA9IFtdO1xuICAgICAgICAgICAgICAgIG9ialtpbmRleF0gPSBsZWFmO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkZWNvZGVkUm9vdCAhPT0gJ19fcHJvdG9fXycpIHtcbiAgICAgICAgICAgICAgICBvYmpbZGVjb2RlZFJvb3RdID0gbGVhZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxlYWYgPSBvYmo7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxlYWY7XG59O1xuXG52YXIgcGFyc2VLZXlzID0gZnVuY3Rpb24gcGFyc2VRdWVyeVN0cmluZ0tleXMoZ2l2ZW5LZXksIHZhbCwgb3B0aW9ucywgdmFsdWVzUGFyc2VkKSB7XG4gICAgaWYgKCFnaXZlbktleSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtIGRvdCBub3RhdGlvbiB0byBicmFja2V0IG5vdGF0aW9uXG4gICAgdmFyIGtleSA9IG9wdGlvbnMuYWxsb3dEb3RzID8gZ2l2ZW5LZXkucmVwbGFjZSgvXFwuKFteLltdKykvZywgJ1skMV0nKSA6IGdpdmVuS2V5O1xuXG4gICAgLy8gVGhlIHJlZ2V4IGNodW5rc1xuXG4gICAgdmFyIGJyYWNrZXRzID0gLyhcXFtbXltcXF1dKl0pLztcbiAgICB2YXIgY2hpbGQgPSAvKFxcW1teW1xcXV0qXSkvZztcblxuICAgIC8vIEdldCB0aGUgcGFyZW50XG5cbiAgICB2YXIgc2VnbWVudCA9IG9wdGlvbnMuZGVwdGggPiAwICYmIGJyYWNrZXRzLmV4ZWMoa2V5KTtcbiAgICB2YXIgcGFyZW50ID0gc2VnbWVudCA/IGtleS5zbGljZSgwLCBzZWdtZW50LmluZGV4KSA6IGtleTtcblxuICAgIC8vIFN0YXNoIHRoZSBwYXJlbnQgaWYgaXQgZXhpc3RzXG5cbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgYXJlbid0IHVzaW5nIHBsYWluIG9iamVjdHMsIG9wdGlvbmFsbHkgcHJlZml4IGtleXMgdGhhdCB3b3VsZCBvdmVyd3JpdGUgb2JqZWN0IHByb3RvdHlwZSBwcm9wZXJ0aWVzXG4gICAgICAgIGlmICghb3B0aW9ucy5wbGFpbk9iamVjdHMgJiYgaGFzLmNhbGwoT2JqZWN0LnByb3RvdHlwZSwgcGFyZW50KSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmFsbG93UHJvdG90eXBlcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGtleXMucHVzaChwYXJlbnQpO1xuICAgIH1cblxuICAgIC8vIExvb3AgdGhyb3VnaCBjaGlsZHJlbiBhcHBlbmRpbmcgdG8gdGhlIGFycmF5IHVudGlsIHdlIGhpdCBkZXB0aFxuXG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChvcHRpb25zLmRlcHRoID4gMCAmJiAoc2VnbWVudCA9IGNoaWxkLmV4ZWMoa2V5KSkgIT09IG51bGwgJiYgaSA8IG9wdGlvbnMuZGVwdGgpIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBpZiAoIW9wdGlvbnMucGxhaW5PYmplY3RzICYmIGhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHNlZ21lbnRbMV0uc2xpY2UoMSwgLTEpKSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmFsbG93UHJvdG90eXBlcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBrZXlzLnB1c2goc2VnbWVudFsxXSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUncyBhIHJlbWFpbmRlciwgY2hlY2sgc3RyaWN0RGVwdGggb3B0aW9uIGZvciB0aHJvdywgZWxzZSBqdXN0IGFkZCB3aGF0ZXZlciBpcyBsZWZ0XG5cbiAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICBpZiAob3B0aW9ucy5zdHJpY3REZXB0aCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0lucHV0IGRlcHRoIGV4Y2VlZGVkIGRlcHRoIG9wdGlvbiBvZiAnICsgb3B0aW9ucy5kZXB0aCArICcgYW5kIHN0cmljdERlcHRoIGlzIHRydWUnKTtcbiAgICAgICAgfVxuICAgICAgICBrZXlzLnB1c2goJ1snICsga2V5LnNsaWNlKHNlZ21lbnQuaW5kZXgpICsgJ10nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VPYmplY3Qoa2V5cywgdmFsLCBvcHRpb25zLCB2YWx1ZXNQYXJzZWQpO1xufTtcblxudmFyIG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyhvcHRzKSB7XG4gICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BhbGxvd0VtcHR5QXJyYXlzYCBvcHRpb24gY2FuIG9ubHkgYmUgYHRydWVgIG9yIGBmYWxzZWAsIHdoZW4gcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuZGVjb2RlRG90SW5LZXlzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0cy5kZWNvZGVEb3RJbktleXMgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgZGVjb2RlRG90SW5LZXlzYCBvcHRpb24gY2FuIG9ubHkgYmUgYHRydWVgIG9yIGBmYWxzZWAsIHdoZW4gcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5kZWNvZGVyICE9PSBudWxsICYmIHR5cGVvZiBvcHRzLmRlY29kZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRzLmRlY29kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRGVjb2RlciBoYXMgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuY2hhcnNldCAhPT0gJ3VuZGVmaW5lZCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAndXRmLTgnICYmIG9wdHMuY2hhcnNldCAhPT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBjaGFyc2V0IG9wdGlvbiBtdXN0IGJlIGVpdGhlciB1dGYtOCwgaXNvLTg4NTktMSwgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLnRocm93T25MaW1pdEV4Y2VlZGVkICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0cy50aHJvd09uTGltaXRFeGNlZWRlZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2B0aHJvd09uTGltaXRFeGNlZWRlZGAgb3B0aW9uIG11c3QgYmUgYSBib29sZWFuJyk7XG4gICAgfVxuXG4gICAgdmFyIGNoYXJzZXQgPSB0eXBlb2Ygb3B0cy5jaGFyc2V0ID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRzLmNoYXJzZXQgOiBvcHRzLmNoYXJzZXQ7XG5cbiAgICB2YXIgZHVwbGljYXRlcyA9IHR5cGVvZiBvcHRzLmR1cGxpY2F0ZXMgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuZHVwbGljYXRlcyA6IG9wdHMuZHVwbGljYXRlcztcblxuICAgIGlmIChkdXBsaWNhdGVzICE9PSAnY29tYmluZScgJiYgZHVwbGljYXRlcyAhPT0gJ2ZpcnN0JyAmJiBkdXBsaWNhdGVzICE9PSAnbGFzdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGR1cGxpY2F0ZXMgb3B0aW9uIG11c3QgYmUgZWl0aGVyIGNvbWJpbmUsIGZpcnN0LCBvciBsYXN0Jyk7XG4gICAgfVxuXG4gICAgdmFyIGFsbG93RG90cyA9IHR5cGVvZiBvcHRzLmFsbG93RG90cyA9PT0gJ3VuZGVmaW5lZCcgPyBvcHRzLmRlY29kZURvdEluS2V5cyA9PT0gdHJ1ZSA/IHRydWUgOiBkZWZhdWx0cy5hbGxvd0RvdHMgOiAhIW9wdHMuYWxsb3dEb3RzO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWxsb3dEb3RzOiBhbGxvd0RvdHMsXG4gICAgICAgIGFsbG93RW1wdHlBcnJheXM6IHR5cGVvZiBvcHRzLmFsbG93RW1wdHlBcnJheXMgPT09ICdib29sZWFuJyA/ICEhb3B0cy5hbGxvd0VtcHR5QXJyYXlzIDogZGVmYXVsdHMuYWxsb3dFbXB0eUFycmF5cyxcbiAgICAgICAgYWxsb3dQcm90b3R5cGVzOiB0eXBlb2Ygb3B0cy5hbGxvd1Byb3RvdHlwZXMgPT09ICdib29sZWFuJyA/IG9wdHMuYWxsb3dQcm90b3R5cGVzIDogZGVmYXVsdHMuYWxsb3dQcm90b3R5cGVzLFxuICAgICAgICBhbGxvd1NwYXJzZTogdHlwZW9mIG9wdHMuYWxsb3dTcGFyc2UgPT09ICdib29sZWFuJyA/IG9wdHMuYWxsb3dTcGFyc2UgOiBkZWZhdWx0cy5hbGxvd1NwYXJzZSxcbiAgICAgICAgYXJyYXlMaW1pdDogdHlwZW9mIG9wdHMuYXJyYXlMaW1pdCA9PT0gJ251bWJlcicgPyBvcHRzLmFycmF5TGltaXQgOiBkZWZhdWx0cy5hcnJheUxpbWl0LFxuICAgICAgICBjaGFyc2V0OiBjaGFyc2V0LFxuICAgICAgICBjaGFyc2V0U2VudGluZWw6IHR5cGVvZiBvcHRzLmNoYXJzZXRTZW50aW5lbCA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jaGFyc2V0U2VudGluZWwgOiBkZWZhdWx0cy5jaGFyc2V0U2VudGluZWwsXG4gICAgICAgIGNvbW1hOiB0eXBlb2Ygb3B0cy5jb21tYSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jb21tYSA6IGRlZmF1bHRzLmNvbW1hLFxuICAgICAgICBkZWNvZGVEb3RJbktleXM6IHR5cGVvZiBvcHRzLmRlY29kZURvdEluS2V5cyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5kZWNvZGVEb3RJbktleXMgOiBkZWZhdWx0cy5kZWNvZGVEb3RJbktleXMsXG4gICAgICAgIGRlY29kZXI6IHR5cGVvZiBvcHRzLmRlY29kZXIgPT09ICdmdW5jdGlvbicgPyBvcHRzLmRlY29kZXIgOiBkZWZhdWx0cy5kZWNvZGVyLFxuICAgICAgICBkZWxpbWl0ZXI6IHR5cGVvZiBvcHRzLmRlbGltaXRlciA9PT0gJ3N0cmluZycgfHwgdXRpbHMuaXNSZWdFeHAob3B0cy5kZWxpbWl0ZXIpID8gb3B0cy5kZWxpbWl0ZXIgOiBkZWZhdWx0cy5kZWxpbWl0ZXIsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbXBsaWNpdC1jb2VyY2lvbiwgbm8tZXh0cmEtcGFyZW5zXG4gICAgICAgIGRlcHRoOiAodHlwZW9mIG9wdHMuZGVwdGggPT09ICdudW1iZXInIHx8IG9wdHMuZGVwdGggPT09IGZhbHNlKSA/ICtvcHRzLmRlcHRoIDogZGVmYXVsdHMuZGVwdGgsXG4gICAgICAgIGR1cGxpY2F0ZXM6IGR1cGxpY2F0ZXMsXG4gICAgICAgIGlnbm9yZVF1ZXJ5UHJlZml4OiBvcHRzLmlnbm9yZVF1ZXJ5UHJlZml4ID09PSB0cnVlLFxuICAgICAgICBpbnRlcnByZXROdW1lcmljRW50aXRpZXM6IHR5cGVvZiBvcHRzLmludGVycHJldE51bWVyaWNFbnRpdGllcyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5pbnRlcnByZXROdW1lcmljRW50aXRpZXMgOiBkZWZhdWx0cy5pbnRlcnByZXROdW1lcmljRW50aXRpZXMsXG4gICAgICAgIHBhcmFtZXRlckxpbWl0OiB0eXBlb2Ygb3B0cy5wYXJhbWV0ZXJMaW1pdCA9PT0gJ251bWJlcicgPyBvcHRzLnBhcmFtZXRlckxpbWl0IDogZGVmYXVsdHMucGFyYW1ldGVyTGltaXQsXG4gICAgICAgIHBhcnNlQXJyYXlzOiBvcHRzLnBhcnNlQXJyYXlzICE9PSBmYWxzZSxcbiAgICAgICAgcGxhaW5PYmplY3RzOiB0eXBlb2Ygb3B0cy5wbGFpbk9iamVjdHMgPT09ICdib29sZWFuJyA/IG9wdHMucGxhaW5PYmplY3RzIDogZGVmYXVsdHMucGxhaW5PYmplY3RzLFxuICAgICAgICBzdHJpY3REZXB0aDogdHlwZW9mIG9wdHMuc3RyaWN0RGVwdGggPT09ICdib29sZWFuJyA/ICEhb3B0cy5zdHJpY3REZXB0aCA6IGRlZmF1bHRzLnN0cmljdERlcHRoLFxuICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IHR5cGVvZiBvcHRzLnN0cmljdE51bGxIYW5kbGluZyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgOiBkZWZhdWx0cy5zdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgICAgIHRocm93T25MaW1pdEV4Y2VlZGVkOiB0eXBlb2Ygb3B0cy50aHJvd09uTGltaXRFeGNlZWRlZCA9PT0gJ2Jvb2xlYW4nID8gb3B0cy50aHJvd09uTGltaXRFeGNlZWRlZCA6IGZhbHNlXG4gICAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0ciwgb3B0cykge1xuICAgIHZhciBvcHRpb25zID0gbm9ybWFsaXplUGFyc2VPcHRpb25zKG9wdHMpO1xuXG4gICAgaWYgKHN0ciA9PT0gJycgfHwgc3RyID09PSBudWxsIHx8IHR5cGVvZiBzdHIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnBsYWluT2JqZWN0cyA/IHsgX19wcm90b19fOiBudWxsIH0gOiB7fTtcbiAgICB9XG5cbiAgICB2YXIgdGVtcE9iaiA9IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnID8gcGFyc2VWYWx1ZXMoc3RyLCBvcHRpb25zKSA6IHN0cjtcbiAgICB2YXIgb2JqID0gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyB7IF9fcHJvdG9fXzogbnVsbCB9IDoge307XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGtleXMgYW5kIHNldHVwIHRoZSBuZXcgb2JqZWN0XG5cbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRlbXBPYmopO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgdmFyIG5ld09iaiA9IHBhcnNlS2V5cyhrZXksIHRlbXBPYmpba2V5XSwgb3B0aW9ucywgdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycpO1xuICAgICAgICBvYmogPSB1dGlscy5tZXJnZShvYmosIG5ld09iaiwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYWxsb3dTcGFyc2UgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICByZXR1cm4gdXRpbHMuY29tcGFjdChvYmopO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGdldFNpZGVDaGFubmVsID0gcmVxdWlyZSgnc2lkZS1jaGFubmVsJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgZm9ybWF0cyA9IHJlcXVpcmUoJy4vZm9ybWF0cycpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBhcnJheVByZWZpeEdlbmVyYXRvcnMgPSB7XG4gICAgYnJhY2tldHM6IGZ1bmN0aW9uIGJyYWNrZXRzKHByZWZpeCkge1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgJ1tdJztcbiAgICB9LFxuICAgIGNvbW1hOiAnY29tbWEnLFxuICAgIGluZGljZXM6IGZ1bmN0aW9uIGluZGljZXMocHJlZml4LCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeCArICdbJyArIGtleSArICddJztcbiAgICB9LFxuICAgIHJlcGVhdDogZnVuY3Rpb24gcmVwZWF0KHByZWZpeCkge1xuICAgICAgICByZXR1cm4gcHJlZml4O1xuICAgIH1cbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbnZhciBwdXNoID0gQXJyYXkucHJvdG90eXBlLnB1c2g7XG52YXIgcHVzaFRvQXJyYXkgPSBmdW5jdGlvbiAoYXJyLCB2YWx1ZU9yQXJyYXkpIHtcbiAgICBwdXNoLmFwcGx5KGFyciwgaXNBcnJheSh2YWx1ZU9yQXJyYXkpID8gdmFsdWVPckFycmF5IDogW3ZhbHVlT3JBcnJheV0pO1xufTtcblxudmFyIHRvSVNPID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc7XG5cbnZhciBkZWZhdWx0Rm9ybWF0ID0gZm9ybWF0c1snZGVmYXVsdCddO1xudmFyIGRlZmF1bHRzID0ge1xuICAgIGFkZFF1ZXJ5UHJlZml4OiBmYWxzZSxcbiAgICBhbGxvd0RvdHM6IGZhbHNlLFxuICAgIGFsbG93RW1wdHlBcnJheXM6IGZhbHNlLFxuICAgIGFycmF5Rm9ybWF0OiAnaW5kaWNlcycsXG4gICAgY2hhcnNldDogJ3V0Zi04JyxcbiAgICBjaGFyc2V0U2VudGluZWw6IGZhbHNlLFxuICAgIGNvbW1hUm91bmRUcmlwOiBmYWxzZSxcbiAgICBkZWxpbWl0ZXI6ICcmJyxcbiAgICBlbmNvZGU6IHRydWUsXG4gICAgZW5jb2RlRG90SW5LZXlzOiBmYWxzZSxcbiAgICBlbmNvZGVyOiB1dGlscy5lbmNvZGUsXG4gICAgZW5jb2RlVmFsdWVzT25seTogZmFsc2UsXG4gICAgZmlsdGVyOiB2b2lkIHVuZGVmaW5lZCxcbiAgICBmb3JtYXQ6IGRlZmF1bHRGb3JtYXQsXG4gICAgZm9ybWF0dGVyOiBmb3JtYXRzLmZvcm1hdHRlcnNbZGVmYXVsdEZvcm1hdF0sXG4gICAgLy8gZGVwcmVjYXRlZFxuICAgIGluZGljZXM6IGZhbHNlLFxuICAgIHNlcmlhbGl6ZURhdGU6IGZ1bmN0aW9uIHNlcmlhbGl6ZURhdGUoZGF0ZSkge1xuICAgICAgICByZXR1cm4gdG9JU08uY2FsbChkYXRlKTtcbiAgICB9LFxuICAgIHNraXBOdWxsczogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZVxufTtcblxudmFyIGlzTm9uTnVsbGlzaFByaW1pdGl2ZSA9IGZ1bmN0aW9uIGlzTm9uTnVsbGlzaFByaW1pdGl2ZSh2KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnc3RyaW5nJ1xuICAgICAgICB8fCB0eXBlb2YgdiA9PT0gJ251bWJlcidcbiAgICAgICAgfHwgdHlwZW9mIHYgPT09ICdib29sZWFuJ1xuICAgICAgICB8fCB0eXBlb2YgdiA9PT0gJ3N5bWJvbCdcbiAgICAgICAgfHwgdHlwZW9mIHYgPT09ICdiaWdpbnQnO1xufTtcblxudmFyIHNlbnRpbmVsID0ge307XG5cbnZhciBzdHJpbmdpZnkgPSBmdW5jdGlvbiBzdHJpbmdpZnkoXG4gICAgb2JqZWN0LFxuICAgIHByZWZpeCxcbiAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgIGNvbW1hUm91bmRUcmlwLFxuICAgIGFsbG93RW1wdHlBcnJheXMsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgIHNraXBOdWxscyxcbiAgICBlbmNvZGVEb3RJbktleXMsXG4gICAgZW5jb2RlcixcbiAgICBmaWx0ZXIsXG4gICAgc29ydCxcbiAgICBhbGxvd0RvdHMsXG4gICAgc2VyaWFsaXplRGF0ZSxcbiAgICBmb3JtYXQsXG4gICAgZm9ybWF0dGVyLFxuICAgIGVuY29kZVZhbHVlc09ubHksXG4gICAgY2hhcnNldCxcbiAgICBzaWRlQ2hhbm5lbFxuKSB7XG4gICAgdmFyIG9iaiA9IG9iamVjdDtcblxuICAgIHZhciB0bXBTYyA9IHNpZGVDaGFubmVsO1xuICAgIHZhciBzdGVwID0gMDtcbiAgICB2YXIgZmluZEZsYWcgPSBmYWxzZTtcbiAgICB3aGlsZSAoKHRtcFNjID0gdG1wU2MuZ2V0KHNlbnRpbmVsKSkgIT09IHZvaWQgdW5kZWZpbmVkICYmICFmaW5kRmxhZykge1xuICAgICAgICAvLyBXaGVyZSBvYmplY3QgbGFzdCBhcHBlYXJlZCBpbiB0aGUgcmVmIHRyZWVcbiAgICAgICAgdmFyIHBvcyA9IHRtcFNjLmdldChvYmplY3QpO1xuICAgICAgICBzdGVwICs9IDE7XG4gICAgICAgIGlmICh0eXBlb2YgcG9zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKHBvcyA9PT0gc3RlcCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdDeWNsaWMgb2JqZWN0IHZhbHVlJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbmRGbGFnID0gdHJ1ZTsgLy8gQnJlYWsgd2hpbGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRtcFNjLmdldChzZW50aW5lbCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBzdGVwID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9iaiA9IGZpbHRlcihwcmVmaXgsIG9iaik7XG4gICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIG9iaiA9IHNlcmlhbGl6ZURhdGUob2JqKTtcbiAgICB9IGVsc2UgaWYgKGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgaXNBcnJheShvYmopKSB7XG4gICAgICAgIG9iaiA9IHV0aWxzLm1heWJlTWFwKG9iaiwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZURhdGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICAgIGlmIChzdHJpY3ROdWxsSGFuZGxpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBlbmNvZGVyICYmICFlbmNvZGVWYWx1ZXNPbmx5ID8gZW5jb2RlcihwcmVmaXgsIGRlZmF1bHRzLmVuY29kZXIsIGNoYXJzZXQsICdrZXknLCBmb3JtYXQpIDogcHJlZml4O1xuICAgICAgICB9XG5cbiAgICAgICAgb2JqID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKGlzTm9uTnVsbGlzaFByaW1pdGl2ZShvYmopIHx8IHV0aWxzLmlzQnVmZmVyKG9iaikpIHtcbiAgICAgICAgaWYgKGVuY29kZXIpIHtcbiAgICAgICAgICAgIHZhciBrZXlWYWx1ZSA9IGVuY29kZVZhbHVlc09ubHkgPyBwcmVmaXggOiBlbmNvZGVyKHByZWZpeCwgZGVmYXVsdHMuZW5jb2RlciwgY2hhcnNldCwgJ2tleScsIGZvcm1hdCk7XG4gICAgICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihrZXlWYWx1ZSkgKyAnPScgKyBmb3JtYXR0ZXIoZW5jb2RlcihvYmosIGRlZmF1bHRzLmVuY29kZXIsIGNoYXJzZXQsICd2YWx1ZScsIGZvcm1hdCkpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihwcmVmaXgpICsgJz0nICsgZm9ybWF0dGVyKFN0cmluZyhvYmopKV07XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuXG4gICAgdmFyIG9iaktleXM7XG4gICAgaWYgKGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgaXNBcnJheShvYmopKSB7XG4gICAgICAgIC8vIHdlIG5lZWQgdG8gam9pbiBlbGVtZW50cyBpblxuICAgICAgICBpZiAoZW5jb2RlVmFsdWVzT25seSAmJiBlbmNvZGVyKSB7XG4gICAgICAgICAgICBvYmogPSB1dGlscy5tYXliZU1hcChvYmosIGVuY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIG9iaktleXMgPSBbeyB2YWx1ZTogb2JqLmxlbmd0aCA+IDAgPyBvYmouam9pbignLCcpIHx8IG51bGwgOiB2b2lkIHVuZGVmaW5lZCB9XTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkoZmlsdGVyKSkge1xuICAgICAgICBvYmpLZXlzID0gZmlsdGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgb2JqS2V5cyA9IHNvcnQgPyBrZXlzLnNvcnQoc29ydCkgOiBrZXlzO1xuICAgIH1cblxuICAgIHZhciBlbmNvZGVkUHJlZml4ID0gZW5jb2RlRG90SW5LZXlzID8gU3RyaW5nKHByZWZpeCkucmVwbGFjZSgvXFwuL2csICclMkUnKSA6IFN0cmluZyhwcmVmaXgpO1xuXG4gICAgdmFyIGFkanVzdGVkUHJlZml4ID0gY29tbWFSb3VuZFRyaXAgJiYgaXNBcnJheShvYmopICYmIG9iai5sZW5ndGggPT09IDEgPyBlbmNvZGVkUHJlZml4ICsgJ1tdJyA6IGVuY29kZWRQcmVmaXg7XG5cbiAgICBpZiAoYWxsb3dFbXB0eUFycmF5cyAmJiBpc0FycmF5KG9iaikgJiYgb2JqLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYWRqdXN0ZWRQcmVmaXggKyAnW10nO1xuICAgIH1cblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgb2JqS2V5cy5sZW5ndGg7ICsraikge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tqXTtcbiAgICAgICAgdmFyIHZhbHVlID0gdHlwZW9mIGtleSA9PT0gJ29iamVjdCcgJiYga2V5ICYmIHR5cGVvZiBrZXkudmFsdWUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICA/IGtleS52YWx1ZVxuICAgICAgICAgICAgOiBvYmpba2V5XTtcblxuICAgICAgICBpZiAoc2tpcE51bGxzICYmIHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBlbmNvZGVkS2V5ID0gYWxsb3dEb3RzICYmIGVuY29kZURvdEluS2V5cyA/IFN0cmluZyhrZXkpLnJlcGxhY2UoL1xcLi9nLCAnJTJFJykgOiBTdHJpbmcoa2V5KTtcbiAgICAgICAgdmFyIGtleVByZWZpeCA9IGlzQXJyYXkob2JqKVxuICAgICAgICAgICAgPyB0eXBlb2YgZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2Z1bmN0aW9uJyA/IGdlbmVyYXRlQXJyYXlQcmVmaXgoYWRqdXN0ZWRQcmVmaXgsIGVuY29kZWRLZXkpIDogYWRqdXN0ZWRQcmVmaXhcbiAgICAgICAgICAgIDogYWRqdXN0ZWRQcmVmaXggKyAoYWxsb3dEb3RzID8gJy4nICsgZW5jb2RlZEtleSA6ICdbJyArIGVuY29kZWRLZXkgKyAnXScpO1xuXG4gICAgICAgIHNpZGVDaGFubmVsLnNldChvYmplY3QsIHN0ZXApO1xuICAgICAgICB2YXIgdmFsdWVTaWRlQ2hhbm5lbCA9IGdldFNpZGVDaGFubmVsKCk7XG4gICAgICAgIHZhbHVlU2lkZUNoYW5uZWwuc2V0KHNlbnRpbmVsLCBzaWRlQ2hhbm5lbCk7XG4gICAgICAgIHB1c2hUb0FycmF5KHZhbHVlcywgc3RyaW5naWZ5KFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBrZXlQcmVmaXgsXG4gICAgICAgICAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgICAgICAgICAgY29tbWFSb3VuZFRyaXAsXG4gICAgICAgICAgICBhbGxvd0VtcHR5QXJyYXlzLFxuICAgICAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgICAgICAgICAgc2tpcE51bGxzLFxuICAgICAgICAgICAgZW5jb2RlRG90SW5LZXlzLFxuICAgICAgICAgICAgZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2NvbW1hJyAmJiBlbmNvZGVWYWx1ZXNPbmx5ICYmIGlzQXJyYXkob2JqKSA/IG51bGwgOiBlbmNvZGVyLFxuICAgICAgICAgICAgZmlsdGVyLFxuICAgICAgICAgICAgc29ydCxcbiAgICAgICAgICAgIGFsbG93RG90cyxcbiAgICAgICAgICAgIHNlcmlhbGl6ZURhdGUsXG4gICAgICAgICAgICBmb3JtYXQsXG4gICAgICAgICAgICBmb3JtYXR0ZXIsXG4gICAgICAgICAgICBlbmNvZGVWYWx1ZXNPbmx5LFxuICAgICAgICAgICAgY2hhcnNldCxcbiAgICAgICAgICAgIHZhbHVlU2lkZUNoYW5uZWxcbiAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlcztcbn07XG5cbnZhciBub3JtYWxpemVTdHJpbmdpZnlPcHRpb25zID0gZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5naWZ5T3B0aW9ucyhvcHRzKSB7XG4gICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BhbGxvd0VtcHR5QXJyYXlzYCBvcHRpb24gY2FuIG9ubHkgYmUgYHRydWVgIG9yIGBmYWxzZWAsIHdoZW4gcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuZW5jb2RlRG90SW5LZXlzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0cy5lbmNvZGVEb3RJbktleXMgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgZW5jb2RlRG90SW5LZXlzYCBvcHRpb24gY2FuIG9ubHkgYmUgYHRydWVgIG9yIGBmYWxzZWAsIHdoZW4gcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5lbmNvZGVyICE9PSBudWxsICYmIHR5cGVvZiBvcHRzLmVuY29kZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRzLmVuY29kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRW5jb2RlciBoYXMgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICB2YXIgY2hhcnNldCA9IG9wdHMuY2hhcnNldCB8fCBkZWZhdWx0cy5jaGFyc2V0O1xuICAgIGlmICh0eXBlb2Ygb3B0cy5jaGFyc2V0ICE9PSAndW5kZWZpbmVkJyAmJiBvcHRzLmNoYXJzZXQgIT09ICd1dGYtOCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGNoYXJzZXQgb3B0aW9uIG11c3QgYmUgZWl0aGVyIHV0Zi04LCBpc28tODg1OS0xLCBvciB1bmRlZmluZWQnKTtcbiAgICB9XG5cbiAgICB2YXIgZm9ybWF0ID0gZm9ybWF0c1snZGVmYXVsdCddO1xuICAgIGlmICh0eXBlb2Ygb3B0cy5mb3JtYXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmICghaGFzLmNhbGwoZm9ybWF0cy5mb3JtYXR0ZXJzLCBvcHRzLmZvcm1hdCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZm9ybWF0IG9wdGlvbiBwcm92aWRlZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBmb3JtYXQgPSBvcHRzLmZvcm1hdDtcbiAgICB9XG4gICAgdmFyIGZvcm1hdHRlciA9IGZvcm1hdHMuZm9ybWF0dGVyc1tmb3JtYXRdO1xuXG4gICAgdmFyIGZpbHRlciA9IGRlZmF1bHRzLmZpbHRlcjtcbiAgICBpZiAodHlwZW9mIG9wdHMuZmlsdGVyID09PSAnZnVuY3Rpb24nIHx8IGlzQXJyYXkob3B0cy5maWx0ZXIpKSB7XG4gICAgICAgIGZpbHRlciA9IG9wdHMuZmlsdGVyO1xuICAgIH1cblxuICAgIHZhciBhcnJheUZvcm1hdDtcbiAgICBpZiAob3B0cy5hcnJheUZvcm1hdCBpbiBhcnJheVByZWZpeEdlbmVyYXRvcnMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRzLmFycmF5Rm9ybWF0O1xuICAgIH0gZWxzZSBpZiAoJ2luZGljZXMnIGluIG9wdHMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRzLmluZGljZXMgPyAnaW5kaWNlcycgOiAncmVwZWF0JztcbiAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheUZvcm1hdCA9IGRlZmF1bHRzLmFycmF5Rm9ybWF0O1xuICAgIH1cblxuICAgIGlmICgnY29tbWFSb3VuZFRyaXAnIGluIG9wdHMgJiYgdHlwZW9mIG9wdHMuY29tbWFSb3VuZFRyaXAgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgY29tbWFSb3VuZFRyaXBgIG11c3QgYmUgYSBib29sZWFuLCBvciBhYnNlbnQnKTtcbiAgICB9XG5cbiAgICB2YXIgYWxsb3dEb3RzID0gdHlwZW9mIG9wdHMuYWxsb3dEb3RzID09PSAndW5kZWZpbmVkJyA/IG9wdHMuZW5jb2RlRG90SW5LZXlzID09PSB0cnVlID8gdHJ1ZSA6IGRlZmF1bHRzLmFsbG93RG90cyA6ICEhb3B0cy5hbGxvd0RvdHM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhZGRRdWVyeVByZWZpeDogdHlwZW9mIG9wdHMuYWRkUXVlcnlQcmVmaXggPT09ICdib29sZWFuJyA/IG9wdHMuYWRkUXVlcnlQcmVmaXggOiBkZWZhdWx0cy5hZGRRdWVyeVByZWZpeCxcbiAgICAgICAgYWxsb3dEb3RzOiBhbGxvd0RvdHMsXG4gICAgICAgIGFsbG93RW1wdHlBcnJheXM6IHR5cGVvZiBvcHRzLmFsbG93RW1wdHlBcnJheXMgPT09ICdib29sZWFuJyA/ICEhb3B0cy5hbGxvd0VtcHR5QXJyYXlzIDogZGVmYXVsdHMuYWxsb3dFbXB0eUFycmF5cyxcbiAgICAgICAgYXJyYXlGb3JtYXQ6IGFycmF5Rm9ybWF0LFxuICAgICAgICBjaGFyc2V0OiBjaGFyc2V0LFxuICAgICAgICBjaGFyc2V0U2VudGluZWw6IHR5cGVvZiBvcHRzLmNoYXJzZXRTZW50aW5lbCA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jaGFyc2V0U2VudGluZWwgOiBkZWZhdWx0cy5jaGFyc2V0U2VudGluZWwsXG4gICAgICAgIGNvbW1hUm91bmRUcmlwOiAhIW9wdHMuY29tbWFSb3VuZFRyaXAsXG4gICAgICAgIGRlbGltaXRlcjogdHlwZW9mIG9wdHMuZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRzLmRlbGltaXRlciA6IG9wdHMuZGVsaW1pdGVyLFxuICAgICAgICBlbmNvZGU6IHR5cGVvZiBvcHRzLmVuY29kZSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5lbmNvZGUgOiBkZWZhdWx0cy5lbmNvZGUsXG4gICAgICAgIGVuY29kZURvdEluS2V5czogdHlwZW9mIG9wdHMuZW5jb2RlRG90SW5LZXlzID09PSAnYm9vbGVhbicgPyBvcHRzLmVuY29kZURvdEluS2V5cyA6IGRlZmF1bHRzLmVuY29kZURvdEluS2V5cyxcbiAgICAgICAgZW5jb2RlcjogdHlwZW9mIG9wdHMuZW5jb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG9wdHMuZW5jb2RlciA6IGRlZmF1bHRzLmVuY29kZXIsXG4gICAgICAgIGVuY29kZVZhbHVlc09ubHk6IHR5cGVvZiBvcHRzLmVuY29kZVZhbHVlc09ubHkgPT09ICdib29sZWFuJyA/IG9wdHMuZW5jb2RlVmFsdWVzT25seSA6IGRlZmF1bHRzLmVuY29kZVZhbHVlc09ubHksXG4gICAgICAgIGZpbHRlcjogZmlsdGVyLFxuICAgICAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICAgICAgZm9ybWF0dGVyOiBmb3JtYXR0ZXIsXG4gICAgICAgIHNlcmlhbGl6ZURhdGU6IHR5cGVvZiBvcHRzLnNlcmlhbGl6ZURhdGUgPT09ICdmdW5jdGlvbicgPyBvcHRzLnNlcmlhbGl6ZURhdGUgOiBkZWZhdWx0cy5zZXJpYWxpemVEYXRlLFxuICAgICAgICBza2lwTnVsbHM6IHR5cGVvZiBvcHRzLnNraXBOdWxscyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5za2lwTnVsbHMgOiBkZWZhdWx0cy5za2lwTnVsbHMsXG4gICAgICAgIHNvcnQ6IHR5cGVvZiBvcHRzLnNvcnQgPT09ICdmdW5jdGlvbicgPyBvcHRzLnNvcnQgOiBudWxsLFxuICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IHR5cGVvZiBvcHRzLnN0cmljdE51bGxIYW5kbGluZyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgOiBkZWZhdWx0cy5zdHJpY3ROdWxsSGFuZGxpbmdcbiAgICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBvcHRzKSB7XG4gICAgdmFyIG9iaiA9IG9iamVjdDtcbiAgICB2YXIgb3B0aW9ucyA9IG5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMob3B0cyk7XG5cbiAgICB2YXIgb2JqS2V5cztcbiAgICB2YXIgZmlsdGVyO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmaWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICAgICAgb2JqID0gZmlsdGVyKCcnLCBvYmopO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvcHRpb25zLmZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgICAgIG9iaktleXMgPSBmaWx0ZXI7XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBbXTtcblxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHZhciBnZW5lcmF0ZUFycmF5UHJlZml4ID0gYXJyYXlQcmVmaXhHZW5lcmF0b3JzW29wdGlvbnMuYXJyYXlGb3JtYXRdO1xuICAgIHZhciBjb21tYVJvdW5kVHJpcCA9IGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgb3B0aW9ucy5jb21tYVJvdW5kVHJpcDtcblxuICAgIGlmICghb2JqS2V5cykge1xuICAgICAgICBvYmpLZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zb3J0KSB7XG4gICAgICAgIG9iaktleXMuc29ydChvcHRpb25zLnNvcnQpO1xuICAgIH1cblxuICAgIHZhciBzaWRlQ2hhbm5lbCA9IGdldFNpZGVDaGFubmVsKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmpLZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBrZXkgPSBvYmpLZXlzW2ldO1xuICAgICAgICB2YXIgdmFsdWUgPSBvYmpba2V5XTtcblxuICAgICAgICBpZiAob3B0aW9ucy5za2lwTnVsbHMgJiYgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHB1c2hUb0FycmF5KGtleXMsIHN0cmluZ2lmeShcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgZ2VuZXJhdGVBcnJheVByZWZpeCxcbiAgICAgICAgICAgIGNvbW1hUm91bmRUcmlwLFxuICAgICAgICAgICAgb3B0aW9ucy5hbGxvd0VtcHR5QXJyYXlzLFxuICAgICAgICAgICAgb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgICAgICAgICBvcHRpb25zLnNraXBOdWxscyxcbiAgICAgICAgICAgIG9wdGlvbnMuZW5jb2RlRG90SW5LZXlzLFxuICAgICAgICAgICAgb3B0aW9ucy5lbmNvZGUgPyBvcHRpb25zLmVuY29kZXIgOiBudWxsLFxuICAgICAgICAgICAgb3B0aW9ucy5maWx0ZXIsXG4gICAgICAgICAgICBvcHRpb25zLnNvcnQsXG4gICAgICAgICAgICBvcHRpb25zLmFsbG93RG90cyxcbiAgICAgICAgICAgIG9wdGlvbnMuc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgICAgIG9wdGlvbnMuZm9ybWF0LFxuICAgICAgICAgICAgb3B0aW9ucy5mb3JtYXR0ZXIsXG4gICAgICAgICAgICBvcHRpb25zLmVuY29kZVZhbHVlc09ubHksXG4gICAgICAgICAgICBvcHRpb25zLmNoYXJzZXQsXG4gICAgICAgICAgICBzaWRlQ2hhbm5lbFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICB2YXIgam9pbmVkID0ga2V5cy5qb2luKG9wdGlvbnMuZGVsaW1pdGVyKTtcbiAgICB2YXIgcHJlZml4ID0gb3B0aW9ucy5hZGRRdWVyeVByZWZpeCA9PT0gdHJ1ZSA/ICc/JyA6ICcnO1xuXG4gICAgaWYgKG9wdGlvbnMuY2hhcnNldFNlbnRpbmVsKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAgICAgLy8gZW5jb2RlVVJJQ29tcG9uZW50KCcmIzEwMDAzOycpLCB0aGUgXCJudW1lcmljIGVudGl0eVwiIHJlcHJlc2VudGF0aW9uIG9mIGEgY2hlY2ttYXJrXG4gICAgICAgICAgICBwcmVmaXggKz0gJ3V0Zjg9JTI2JTIzMTAwMDMlM0ImJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGVuY29kZVVSSUNvbXBvbmVudCgn4pyTJylcbiAgICAgICAgICAgIHByZWZpeCArPSAndXRmOD0lRTIlOUMlOTMmJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBqb2luZWQubGVuZ3RoID4gMCA/IHByZWZpeCArIGpvaW5lZCA6ICcnO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGZvcm1hdHMgPSByZXF1aXJlKCcuL2Zvcm1hdHMnKTtcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbnZhciBoZXhUYWJsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgICAgICBhcnJheS5wdXNoKCclJyArICgoaSA8IDE2ID8gJzAnIDogJycpICsgaS50b1N0cmluZygxNikpLnRvVXBwZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBhcnJheTtcbn0oKSk7XG5cbnZhciBjb21wYWN0UXVldWUgPSBmdW5jdGlvbiBjb21wYWN0UXVldWUocXVldWUpIHtcbiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMSkge1xuICAgICAgICB2YXIgaXRlbSA9IHF1ZXVlLnBvcCgpO1xuICAgICAgICB2YXIgb2JqID0gaXRlbS5vYmpbaXRlbS5wcm9wXTtcblxuICAgICAgICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICB2YXIgY29tcGFjdGVkID0gW107XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgb2JqLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmpbal0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBhY3RlZC5wdXNoKG9ialtqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpdGVtLm9ialtpdGVtLnByb3BdID0gY29tcGFjdGVkO1xuICAgICAgICB9XG4gICAgfVxufTtcblxudmFyIGFycmF5VG9PYmplY3QgPSBmdW5jdGlvbiBhcnJheVRvT2JqZWN0KHNvdXJjZSwgb3B0aW9ucykge1xuICAgIHZhciBvYmogPSBvcHRpb25zICYmIG9wdGlvbnMucGxhaW5PYmplY3RzID8geyBfX3Byb3RvX186IG51bGwgfSA6IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlW2ldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb2JqW2ldID0gc291cmNlW2ldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBtZXJnZSA9IGZ1bmN0aW9uIG1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgLyogZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOiAwICovXG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHNvdXJjZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoaXNBcnJheSh0YXJnZXQpKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaChzb3VyY2UpO1xuICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCAmJiB0eXBlb2YgdGFyZ2V0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChvcHRpb25zICYmIChvcHRpb25zLnBsYWluT2JqZWN0cyB8fCBvcHRpb25zLmFsbG93UHJvdG90eXBlcykpXG4gICAgICAgICAgICAgICAgfHwgIWhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHNvdXJjZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtzb3VyY2VdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbdGFyZ2V0LCBzb3VyY2VdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldCB8fCB0eXBlb2YgdGFyZ2V0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gW3RhcmdldF0uY29uY2F0KHNvdXJjZSk7XG4gICAgfVxuXG4gICAgdmFyIG1lcmdlVGFyZ2V0ID0gdGFyZ2V0O1xuICAgIGlmIChpc0FycmF5KHRhcmdldCkgJiYgIWlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICBtZXJnZVRhcmdldCA9IGFycmF5VG9PYmplY3QodGFyZ2V0LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoaXNBcnJheSh0YXJnZXQpICYmIGlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICBzb3VyY2UuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaSkge1xuICAgICAgICAgICAgaWYgKGhhcy5jYWxsKHRhcmdldCwgaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0SXRlbSA9IHRhcmdldFtpXTtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SXRlbSAmJiB0eXBlb2YgdGFyZ2V0SXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2ldID0gbWVyZ2UodGFyZ2V0SXRlbSwgaXRlbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuXG4gICAgICAgIGlmIChoYXMuY2FsbChhY2MsIGtleSkpIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gbWVyZ2UoYWNjW2tleV0sIHZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBtZXJnZVRhcmdldCk7XG59O1xuXG52YXIgYXNzaWduID0gZnVuY3Rpb24gYXNzaWduU2luZ2xlU291cmNlKHRhcmdldCwgc291cmNlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICBhY2Nba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHRhcmdldCk7XG59O1xuXG52YXIgZGVjb2RlID0gZnVuY3Rpb24gKHN0ciwgZGVmYXVsdERlY29kZXIsIGNoYXJzZXQpIHtcbiAgICB2YXIgc3RyV2l0aG91dFBsdXMgPSBzdHIucmVwbGFjZSgvXFwrL2csICcgJyk7XG4gICAgaWYgKGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAvLyB1bmVzY2FwZSBuZXZlciB0aHJvd3MsIG5vIHRyeS4uLmNhdGNoIG5lZWRlZDpcbiAgICAgICAgcmV0dXJuIHN0cldpdGhvdXRQbHVzLnJlcGxhY2UoLyVbMC05YS1mXXsyfS9naSwgdW5lc2NhcGUpO1xuICAgIH1cbiAgICAvLyB1dGYtOFxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoc3RyV2l0aG91dFBsdXMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHN0cldpdGhvdXRQbHVzO1xuICAgIH1cbn07XG5cbnZhciBsaW1pdCA9IDEwMjQ7XG5cbi8qIGVzbGludCBvcGVyYXRvci1saW5lYnJlYWs6IFsyLCBcImJlZm9yZVwiXSAqL1xuXG52YXIgZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKHN0ciwgZGVmYXVsdEVuY29kZXIsIGNoYXJzZXQsIGtpbmQsIGZvcm1hdCkge1xuICAgIC8vIFRoaXMgY29kZSB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IEJyaWFuIFdoaXRlIChtc2NkZXgpIGZvciB0aGUgaW8uanMgY29yZSBxdWVyeXN0cmluZyBsaWJyYXJ5LlxuICAgIC8vIEl0IGhhcyBiZWVuIGFkYXB0ZWQgaGVyZSBmb3Igc3RyaWN0ZXIgYWRoZXJlbmNlIHRvIFJGQyAzOTg2XG4gICAgaWYgKHN0ci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICB2YXIgc3RyaW5nID0gc3RyO1xuICAgIGlmICh0eXBlb2Ygc3RyID09PSAnc3ltYm9sJykge1xuICAgICAgICBzdHJpbmcgPSBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3RyKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHN0cmluZyA9IFN0cmluZyhzdHIpO1xuICAgIH1cblxuICAgIGlmIChjaGFyc2V0ID09PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgcmV0dXJuIGVzY2FwZShzdHJpbmcpLnJlcGxhY2UoLyV1WzAtOWEtZl17NH0vZ2ksIGZ1bmN0aW9uICgkMCkge1xuICAgICAgICAgICAgcmV0dXJuICclMjYlMjMnICsgcGFyc2VJbnQoJDAuc2xpY2UoMiksIDE2KSArICclM0InO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgb3V0ID0gJyc7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzdHJpbmcubGVuZ3RoOyBqICs9IGxpbWl0KSB7XG4gICAgICAgIHZhciBzZWdtZW50ID0gc3RyaW5nLmxlbmd0aCA+PSBsaW1pdCA/IHN0cmluZy5zbGljZShqLCBqICsgbGltaXQpIDogc3RyaW5nO1xuICAgICAgICB2YXIgYXJyID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB2YXIgYyA9IHNlZ21lbnQuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBjID09PSAweDJEIC8vIC1cbiAgICAgICAgICAgICAgICB8fCBjID09PSAweDJFIC8vIC5cbiAgICAgICAgICAgICAgICB8fCBjID09PSAweDVGIC8vIF9cbiAgICAgICAgICAgICAgICB8fCBjID09PSAweDdFIC8vIH5cbiAgICAgICAgICAgICAgICB8fCAoYyA+PSAweDMwICYmIGMgPD0gMHgzOSkgLy8gMC05XG4gICAgICAgICAgICAgICAgfHwgKGMgPj0gMHg0MSAmJiBjIDw9IDB4NUEpIC8vIGEtelxuICAgICAgICAgICAgICAgIHx8IChjID49IDB4NjEgJiYgYyA8PSAweDdBKSAvLyBBLVpcbiAgICAgICAgICAgICAgICB8fCAoZm9ybWF0ID09PSBmb3JtYXRzLlJGQzE3MzggJiYgKGMgPT09IDB4MjggfHwgYyA9PT0gMHgyOSkpIC8vICggKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYXJyW2Fyci5sZW5ndGhdID0gc2VnbWVudC5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgICAgICAgICAgIGFyclthcnIubGVuZ3RoXSA9IGhleFRhYmxlW2NdO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAgICAgICAgICAgYXJyW2Fyci5sZW5ndGhdID0gaGV4VGFibGVbMHhDMCB8IChjID4+IDYpXVxuICAgICAgICAgICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGMgPCAweEQ4MDAgfHwgYyA+PSAweEUwMDApIHtcbiAgICAgICAgICAgICAgICBhcnJbYXJyLmxlbmd0aF0gPSBoZXhUYWJsZVsweEUwIHwgKGMgPj4gMTIpXVxuICAgICAgICAgICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gNikgJiAweDNGKV1cbiAgICAgICAgICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV07XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIGMgPSAweDEwMDAwICsgKCgoYyAmIDB4M0ZGKSA8PCAxMCkgfCAoc2VnbWVudC5jaGFyQ29kZUF0KGkpICYgMHgzRkYpKTtcblxuICAgICAgICAgICAgYXJyW2Fyci5sZW5ndGhdID0gaGV4VGFibGVbMHhGMCB8IChjID4+IDE4KV1cbiAgICAgICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRildXG4gICAgICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDYpICYgMHgzRildXG4gICAgICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV07XG4gICAgICAgIH1cblxuICAgICAgICBvdXQgKz0gYXJyLmpvaW4oJycpO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG52YXIgY29tcGFjdCA9IGZ1bmN0aW9uIGNvbXBhY3QodmFsdWUpIHtcbiAgICB2YXIgcXVldWUgPSBbeyBvYmo6IHsgbzogdmFsdWUgfSwgcHJvcDogJ28nIH1dO1xuICAgIHZhciByZWZzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBpdGVtID0gcXVldWVbaV07XG4gICAgICAgIHZhciBvYmogPSBpdGVtLm9ialtpdGVtLnByb3BdO1xuXG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBrZXlzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0ga2V5c1tqXTtcbiAgICAgICAgICAgIHZhciB2YWwgPSBvYmpba2V5XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgJiYgcmVmcy5pbmRleE9mKHZhbCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcXVldWUucHVzaCh7IG9iajogb2JqLCBwcm9wOiBrZXkgfSk7XG4gICAgICAgICAgICAgICAgcmVmcy5wdXNoKHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wYWN0UXVldWUocXVldWUpO1xuXG4gICAgcmV0dXJuIHZhbHVlO1xufTtcblxudmFyIGlzUmVnRXhwID0gZnVuY3Rpb24gaXNSZWdFeHAob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBSZWdFeHBdJztcbn07XG5cbnZhciBpc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyKG9iaikge1xuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gISEob2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKSk7XG59O1xuXG52YXIgY29tYmluZSA9IGZ1bmN0aW9uIGNvbWJpbmUoYSwgYikge1xuICAgIHJldHVybiBbXS5jb25jYXQoYSwgYik7XG59O1xuXG52YXIgbWF5YmVNYXAgPSBmdW5jdGlvbiBtYXliZU1hcCh2YWwsIGZuKSB7XG4gICAgaWYgKGlzQXJyYXkodmFsKSkge1xuICAgICAgICB2YXIgbWFwcGVkID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBtYXBwZWQucHVzaChmbih2YWxbaV0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFwcGVkO1xuICAgIH1cbiAgICByZXR1cm4gZm4odmFsKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGFycmF5VG9PYmplY3Q6IGFycmF5VG9PYmplY3QsXG4gICAgYXNzaWduOiBhc3NpZ24sXG4gICAgY29tYmluZTogY29tYmluZSxcbiAgICBjb21wYWN0OiBjb21wYWN0LFxuICAgIGRlY29kZTogZGVjb2RlLFxuICAgIGVuY29kZTogZW5jb2RlLFxuICAgIGlzQnVmZmVyOiBpc0J1ZmZlcixcbiAgICBpc1JlZ0V4cDogaXNSZWdFeHAsXG4gICAgbWF5YmVNYXA6IG1heWJlTWFwLFxuICAgIG1lcmdlOiBtZXJnZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGluc3BlY3QgPSByZXF1aXJlKCdvYmplY3QtaW5zcGVjdCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG5cbi8qXG4qIFRoaXMgZnVuY3Rpb24gdHJhdmVyc2VzIHRoZSBsaXN0IHJldHVybmluZyB0aGUgbm9kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBrZXkuXG4qXG4qIFRoYXQgbm9kZSBpcyBhbHNvIG1vdmVkIHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBzbyB0aGF0IGlmIGl0J3MgYWNjZXNzZWQgYWdhaW4gd2UgZG9uJ3QgbmVlZCB0byB0cmF2ZXJzZSB0aGUgd2hvbGUgbGlzdC5cbiogQnkgZG9pbmcgc28sIGFsbCB0aGUgcmVjZW50bHkgdXNlZCBub2RlcyBjYW4gYmUgYWNjZXNzZWQgcmVsYXRpdmVseSBxdWlja2x5LlxuKi9cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2xpc3QuZC50cycpLmxpc3RHZXROb2RlfSAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG52YXIgbGlzdEdldE5vZGUgPSBmdW5jdGlvbiAobGlzdCwga2V5LCBpc0RlbGV0ZSkge1xuXHQvKiogQHR5cGUge3R5cGVvZiBsaXN0IHwgTm9uTnVsbGFibGU8KHR5cGVvZiBsaXN0KVsnbmV4dCddPn0gKi9cblx0dmFyIHByZXYgPSBsaXN0O1xuXHQvKiogQHR5cGUgeyh0eXBlb2YgbGlzdClbJ25leHQnXX0gKi9cblx0dmFyIGN1cnI7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0Zm9yICg7IChjdXJyID0gcHJldi5uZXh0KSAhPSBudWxsOyBwcmV2ID0gY3Vycikge1xuXHRcdGlmIChjdXJyLmtleSA9PT0ga2V5KSB7XG5cdFx0XHRwcmV2Lm5leHQgPSBjdXJyLm5leHQ7XG5cdFx0XHRpZiAoIWlzRGVsZXRlKSB7XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1wYXJlbnNcblx0XHRcdFx0Y3Vyci5uZXh0ID0gLyoqIEB0eXBlIHtOb25OdWxsYWJsZTx0eXBlb2YgbGlzdC5uZXh0Pn0gKi8gKGxpc3QubmV4dCk7XG5cdFx0XHRcdGxpc3QubmV4dCA9IGN1cnI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblx0XHRcdH1cblx0XHRcdHJldHVybiBjdXJyO1xuXHRcdH1cblx0fVxufTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vbGlzdC5kLnRzJykubGlzdEdldH0gKi9cbnZhciBsaXN0R2V0ID0gZnVuY3Rpb24gKG9iamVjdHMsIGtleSkge1xuXHRpZiAoIW9iamVjdHMpIHtcblx0XHRyZXR1cm4gdm9pZCB1bmRlZmluZWQ7XG5cdH1cblx0dmFyIG5vZGUgPSBsaXN0R2V0Tm9kZShvYmplY3RzLCBrZXkpO1xuXHRyZXR1cm4gbm9kZSAmJiBub2RlLnZhbHVlO1xufTtcbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2xpc3QuZC50cycpLmxpc3RTZXR9ICovXG52YXIgbGlzdFNldCA9IGZ1bmN0aW9uIChvYmplY3RzLCBrZXksIHZhbHVlKSB7XG5cdHZhciBub2RlID0gbGlzdEdldE5vZGUob2JqZWN0cywga2V5KTtcblx0aWYgKG5vZGUpIHtcblx0XHRub2RlLnZhbHVlID0gdmFsdWU7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gUHJlcGVuZCB0aGUgbmV3IG5vZGUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdFxuXHRcdG9iamVjdHMubmV4dCA9IC8qKiBAdHlwZSB7aW1wb3J0KCcuL2xpc3QuZC50cycpLkxpc3ROb2RlPHR5cGVvZiB2YWx1ZSwgdHlwZW9mIGtleT59ICovICh7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ24sIG5vLWV4dHJhLXBhcmVuc1xuXHRcdFx0a2V5OiBrZXksXG5cdFx0XHRuZXh0OiBvYmplY3RzLm5leHQsXG5cdFx0XHR2YWx1ZTogdmFsdWVcblx0XHR9KTtcblx0fVxufTtcbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2xpc3QuZC50cycpLmxpc3RIYXN9ICovXG52YXIgbGlzdEhhcyA9IGZ1bmN0aW9uIChvYmplY3RzLCBrZXkpIHtcblx0aWYgKCFvYmplY3RzKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHJldHVybiAhIWxpc3RHZXROb2RlKG9iamVjdHMsIGtleSk7XG59O1xuLyoqIEB0eXBlIHtpbXBvcnQoJy4vbGlzdC5kLnRzJykubGlzdERlbGV0ZX0gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxudmFyIGxpc3REZWxldGUgPSBmdW5jdGlvbiAob2JqZWN0cywga2V5KSB7XG5cdGlmIChvYmplY3RzKSB7XG5cdFx0cmV0dXJuIGxpc3RHZXROb2RlKG9iamVjdHMsIGtleSwgdHJ1ZSk7XG5cdH1cbn07XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFNpZGVDaGFubmVsTGlzdCgpIHtcblx0LyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBnZXRTaWRlQ2hhbm5lbExpc3Q+fSBDaGFubmVsICovXG5cdC8qKiBAdHlwZWRlZiB7UGFyYW1ldGVyczxDaGFubmVsWydnZXQnXT5bMF19IEsgKi9cblx0LyoqIEB0eXBlZGVmIHtQYXJhbWV0ZXJzPENoYW5uZWxbJ3NldCddPlsxXX0gViAqL1xuXG5cdC8qKiBAdHlwZSB7aW1wb3J0KCcuL2xpc3QuZC50cycpLlJvb3ROb2RlPFYsIEs+IHwgdW5kZWZpbmVkfSAqLyB2YXIgJG87XG5cblx0LyoqIEB0eXBlIHtDaGFubmVsfSAqL1xuXHR2YXIgY2hhbm5lbCA9IHtcblx0XHRhc3NlcnQ6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdGlmICghY2hhbm5lbC5oYXMoa2V5KSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignU2lkZSBjaGFubmVsIGRvZXMgbm90IGNvbnRhaW4gJyArIGluc3BlY3Qoa2V5KSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0dmFyIHJvb3QgPSAkbyAmJiAkby5uZXh0O1xuXHRcdFx0dmFyIGRlbGV0ZWROb2RlID0gbGlzdERlbGV0ZSgkbywga2V5KTtcblx0XHRcdGlmIChkZWxldGVkTm9kZSAmJiByb290ICYmIHJvb3QgPT09IGRlbGV0ZWROb2RlKSB7XG5cdFx0XHRcdCRvID0gdm9pZCB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gISFkZWxldGVkTm9kZTtcblx0XHR9LFxuXHRcdGdldDogZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0cmV0dXJuIGxpc3RHZXQoJG8sIGtleSk7XG5cdFx0fSxcblx0XHRoYXM6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdHJldHVybiBsaXN0SGFzKCRvLCBrZXkpO1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuXHRcdFx0aWYgKCEkbykge1xuXHRcdFx0XHQvLyBJbml0aWFsaXplIHRoZSBsaW5rZWQgbGlzdCBhcyBhbiBlbXB0eSBub2RlLCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gc3BlY2lhbC1jYXNlIGhhbmRsaW5nIG9mIHRoZSBmaXJzdCBub2RlOiB3ZSBjYW4gYWx3YXlzIHJlZmVyIHRvIGl0IGFzIChwcmV2aW91cyBub2RlKS5uZXh0LCBpbnN0ZWFkIG9mIHNvbWV0aGluZyBsaWtlIChsaXN0KS5oZWFkXG5cdFx0XHRcdCRvID0ge1xuXHRcdFx0XHRcdG5leHQ6IHZvaWQgdW5kZWZpbmVkXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXh0cmEtcGFyZW5zXG5cdFx0XHRsaXN0U2V0KC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mICRvPn0gKi8gKCRvKSwga2V5LCB2YWx1ZSk7XG5cdFx0fVxuXHR9O1xuXHQvLyBAdHMtZXhwZWN0LWVycm9yIFRPRE86IGZpZ3VyZSBvdXQgd2h5IHRoaXMgaXMgZXJyb3Jpbmdcblx0cmV0dXJuIGNoYW5uZWw7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJ2NhbGwtYm91bmQnKTtcbnZhciBpbnNwZWN0ID0gcmVxdWlyZSgnb2JqZWN0LWluc3BlY3QnKTtcblxudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xudmFyICRNYXAgPSBHZXRJbnRyaW5zaWMoJyVNYXAlJywgdHJ1ZSk7XG5cbi8qKiBAdHlwZSB7PEssIFY+KHRoaXNBcmc6IE1hcDxLLCBWPiwga2V5OiBLKSA9PiBWfSAqL1xudmFyICRtYXBHZXQgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuZ2V0JywgdHJ1ZSk7XG4vKiogQHR5cGUgezxLLCBWPih0aGlzQXJnOiBNYXA8SywgVj4sIGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9ICovXG52YXIgJG1hcFNldCA9IGNhbGxCb3VuZCgnTWFwLnByb3RvdHlwZS5zZXQnLCB0cnVlKTtcbi8qKiBAdHlwZSB7PEssIFY+KHRoaXNBcmc6IE1hcDxLLCBWPiwga2V5OiBLKSA9PiBib29sZWFufSAqL1xudmFyICRtYXBIYXMgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuaGFzJywgdHJ1ZSk7XG4vKiogQHR5cGUgezxLLCBWPih0aGlzQXJnOiBNYXA8SywgVj4sIGtleTogSykgPT4gYm9vbGVhbn0gKi9cbnZhciAkbWFwRGVsZXRlID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLmRlbGV0ZScsIHRydWUpO1xuLyoqIEB0eXBlIHs8SywgVj4odGhpc0FyZzogTWFwPEssIFY+KSA9PiBudW1iZXJ9ICovXG52YXIgJG1hcFNpemUgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuc2l6ZScsIHRydWUpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSAhISRNYXAgJiYgLyoqIEB0eXBlIHtFeGNsdWRlPGltcG9ydCgnLicpLCBmYWxzZT59ICovIGZ1bmN0aW9uIGdldFNpZGVDaGFubmVsTWFwKCkge1xuXHQvKiogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIGdldFNpZGVDaGFubmVsTWFwPn0gQ2hhbm5lbCAqL1xuXHQvKiogQHR5cGVkZWYge1BhcmFtZXRlcnM8Q2hhbm5lbFsnZ2V0J10+WzBdfSBLICovXG5cdC8qKiBAdHlwZWRlZiB7UGFyYW1ldGVyczxDaGFubmVsWydzZXQnXT5bMV19IFYgKi9cblxuXHQvKiogQHR5cGUge01hcDxLLCBWPiB8IHVuZGVmaW5lZH0gKi8gdmFyICRtO1xuXG5cdC8qKiBAdHlwZSB7Q2hhbm5lbH0gKi9cblx0dmFyIGNoYW5uZWwgPSB7XG5cdFx0YXNzZXJ0OiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRpZiAoIWNoYW5uZWwuaGFzKGtleSkpIHtcblx0XHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1NpZGUgY2hhbm5lbCBkb2VzIG5vdCBjb250YWluICcgKyBpbnNwZWN0KGtleSkpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdGlmICgkbSkge1xuXHRcdFx0XHR2YXIgcmVzdWx0ID0gJG1hcERlbGV0ZSgkbSwga2V5KTtcblx0XHRcdFx0aWYgKCRtYXBTaXplKCRtKSA9PT0gMCkge1xuXHRcdFx0XHRcdCRtID0gdm9pZCB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdGdldDogZnVuY3Rpb24gKGtleSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG5cdFx0XHRpZiAoJG0pIHtcblx0XHRcdFx0cmV0dXJuICRtYXBHZXQoJG0sIGtleSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRoYXM6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdGlmICgkbSkge1xuXHRcdFx0XHRyZXR1cm4gJG1hcEhhcygkbSwga2V5KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0XHRcdGlmICghJG0pIHtcblx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUUyBjYW4ndCBoYW5kbGUgbmFycm93aW5nIGEgdmFyaWFibGUgaW5zaWRlIGEgY2xvc3VyZVxuXHRcdFx0XHQkbSA9IG5ldyAkTWFwKCk7XG5cdFx0XHR9XG5cdFx0XHQkbWFwU2V0KCRtLCBrZXksIHZhbHVlKTtcblx0XHR9XG5cdH07XG5cblx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUT0RPOiBmaWd1cmUgb3V0IHdoeSBUUyBpcyBlcnJvcmluZyBoZXJlXG5cdHJldHVybiBjaGFubmVsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcbnZhciBjYWxsQm91bmQgPSByZXF1aXJlKCdjYWxsLWJvdW5kJyk7XG52YXIgaW5zcGVjdCA9IHJlcXVpcmUoJ29iamVjdC1pbnNwZWN0Jyk7XG52YXIgZ2V0U2lkZUNoYW5uZWxNYXAgPSByZXF1aXJlKCdzaWRlLWNoYW5uZWwtbWFwJyk7XG5cbnZhciAkVHlwZUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3R5cGUnKTtcbnZhciAkV2Vha01hcCA9IEdldEludHJpbnNpYygnJVdlYWtNYXAlJywgdHJ1ZSk7XG5cbi8qKiBAdHlwZSB7PEsgZXh0ZW5kcyBvYmplY3QsIFY+KHRoaXNBcmc6IFdlYWtNYXA8SywgVj4sIGtleTogSykgPT4gVn0gKi9cbnZhciAkd2Vha01hcEdldCA9IGNhbGxCb3VuZCgnV2Vha01hcC5wcm90b3R5cGUuZ2V0JywgdHJ1ZSk7XG4vKiogQHR5cGUgezxLIGV4dGVuZHMgb2JqZWN0LCBWPih0aGlzQXJnOiBXZWFrTWFwPEssIFY+LCBrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSAqL1xudmFyICR3ZWFrTWFwU2V0ID0gY2FsbEJvdW5kKCdXZWFrTWFwLnByb3RvdHlwZS5zZXQnLCB0cnVlKTtcbi8qKiBAdHlwZSB7PEsgZXh0ZW5kcyBvYmplY3QsIFY+KHRoaXNBcmc6IFdlYWtNYXA8SywgVj4sIGtleTogSykgPT4gYm9vbGVhbn0gKi9cbnZhciAkd2Vha01hcEhhcyA9IGNhbGxCb3VuZCgnV2Vha01hcC5wcm90b3R5cGUuaGFzJywgdHJ1ZSk7XG4vKiogQHR5cGUgezxLIGV4dGVuZHMgb2JqZWN0LCBWPih0aGlzQXJnOiBXZWFrTWFwPEssIFY+LCBrZXk6IEspID0+IGJvb2xlYW59ICovXG52YXIgJHdlYWtNYXBEZWxldGUgPSBjYWxsQm91bmQoJ1dlYWtNYXAucHJvdG90eXBlLmRlbGV0ZScsIHRydWUpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSAkV2Vha01hcFxuXHQ/IC8qKiBAdHlwZSB7RXhjbHVkZTxpbXBvcnQoJy4nKSwgZmFsc2U+fSAqLyBmdW5jdGlvbiBnZXRTaWRlQ2hhbm5lbFdlYWtNYXAoKSB7XG5cdFx0LyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBnZXRTaWRlQ2hhbm5lbFdlYWtNYXA+fSBDaGFubmVsICovXG5cdFx0LyoqIEB0eXBlZGVmIHtQYXJhbWV0ZXJzPENoYW5uZWxbJ2dldCddPlswXX0gSyAqL1xuXHRcdC8qKiBAdHlwZWRlZiB7UGFyYW1ldGVyczxDaGFubmVsWydzZXQnXT5bMV19IFYgKi9cblxuXHRcdC8qKiBAdHlwZSB7V2Vha01hcDxLICYgb2JqZWN0LCBWPiB8IHVuZGVmaW5lZH0gKi8gdmFyICR3bTtcblx0XHQvKiogQHR5cGUge0NoYW5uZWwgfCB1bmRlZmluZWR9ICovIHZhciAkbTtcblxuXHRcdC8qKiBAdHlwZSB7Q2hhbm5lbH0gKi9cblx0XHR2YXIgY2hhbm5lbCA9IHtcblx0XHRcdGFzc2VydDogZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0XHRpZiAoIWNoYW5uZWwuaGFzKGtleSkpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignU2lkZSBjaGFubmVsIGRvZXMgbm90IGNvbnRhaW4gJyArIGluc3BlY3Qoa2V5KSk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0XHRpZiAoJFdlYWtNYXAgJiYga2V5ICYmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0XHRcdGlmICgkd20pIHtcblx0XHRcdFx0XHRcdHJldHVybiAkd2Vha01hcERlbGV0ZSgkd20sIGtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGdldFNpZGVDaGFubmVsTWFwKSB7XG5cdFx0XHRcdFx0aWYgKCRtKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJG1bJ2RlbGV0ZSddKGtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0sXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdFx0aWYgKCRXZWFrTWFwICYmIGtleSAmJiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIGtleSA9PT0gJ2Z1bmN0aW9uJykpIHtcblx0XHRcdFx0XHRpZiAoJHdtKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJHdlYWtNYXBHZXQoJHdtLCBrZXkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gJG0gJiYgJG0uZ2V0KGtleSk7XG5cdFx0XHR9LFxuXHRcdFx0aGFzOiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRcdGlmICgkV2Vha01hcCAmJiBrZXkgJiYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRcdFx0aWYgKCR3bSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuICR3ZWFrTWFwSGFzKCR3bSwga2V5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuICEhJG0gJiYgJG0uaGFzKGtleSk7XG5cdFx0XHR9LFxuXHRcdFx0c2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuXHRcdFx0XHRpZiAoJFdlYWtNYXAgJiYga2V5ICYmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0XHRcdGlmICghJHdtKSB7XG5cdFx0XHRcdFx0XHQkd20gPSBuZXcgJFdlYWtNYXAoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0JHdlYWtNYXBTZXQoJHdtLCBrZXksIHZhbHVlKTtcblx0XHRcdFx0fSBlbHNlIGlmIChnZXRTaWRlQ2hhbm5lbE1hcCkge1xuXHRcdFx0XHRcdGlmICghJG0pIHtcblx0XHRcdFx0XHRcdCRtID0gZ2V0U2lkZUNoYW5uZWxNYXAoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXBhcmVuc1xuXHRcdFx0XHRcdC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mICRtPn0gKi8gKCRtKS5zZXQoa2V5LCB2YWx1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUT0RPOiBmaWd1cmUgb3V0IHdoeSB0aGlzIGlzIGVycm9yaW5nXG5cdFx0cmV0dXJuIGNoYW5uZWw7XG5cdH1cblx0OiBnZXRTaWRlQ2hhbm5lbE1hcDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xudmFyIGluc3BlY3QgPSByZXF1aXJlKCdvYmplY3QtaW5zcGVjdCcpO1xudmFyIGdldFNpZGVDaGFubmVsTGlzdCA9IHJlcXVpcmUoJ3NpZGUtY2hhbm5lbC1saXN0Jyk7XG52YXIgZ2V0U2lkZUNoYW5uZWxNYXAgPSByZXF1aXJlKCdzaWRlLWNoYW5uZWwtbWFwJyk7XG52YXIgZ2V0U2lkZUNoYW5uZWxXZWFrTWFwID0gcmVxdWlyZSgnc2lkZS1jaGFubmVsLXdlYWttYXAnKTtcblxudmFyIG1ha2VDaGFubmVsID0gZ2V0U2lkZUNoYW5uZWxXZWFrTWFwIHx8IGdldFNpZGVDaGFubmVsTWFwIHx8IGdldFNpZGVDaGFubmVsTGlzdDtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0U2lkZUNoYW5uZWwoKSB7XG5cdC8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgZ2V0U2lkZUNoYW5uZWw+fSBDaGFubmVsICovXG5cblx0LyoqIEB0eXBlIHtDaGFubmVsIHwgdW5kZWZpbmVkfSAqLyB2YXIgJGNoYW5uZWxEYXRhO1xuXG5cdC8qKiBAdHlwZSB7Q2hhbm5lbH0gKi9cblx0dmFyIGNoYW5uZWwgPSB7XG5cdFx0YXNzZXJ0OiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRpZiAoIWNoYW5uZWwuaGFzKGtleSkpIHtcblx0XHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1NpZGUgY2hhbm5lbCBkb2VzIG5vdCBjb250YWluICcgKyBpbnNwZWN0KGtleSkpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdHJldHVybiAhISRjaGFubmVsRGF0YSAmJiAkY2hhbm5lbERhdGFbJ2RlbGV0ZSddKGtleSk7XG5cdFx0fSxcblx0XHRnZXQ6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdHJldHVybiAkY2hhbm5lbERhdGEgJiYgJGNoYW5uZWxEYXRhLmdldChrZXkpO1xuXHRcdH0sXG5cdFx0aGFzOiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRyZXR1cm4gISEkY2hhbm5lbERhdGEgJiYgJGNoYW5uZWxEYXRhLmhhcyhrZXkpO1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuXHRcdFx0aWYgKCEkY2hhbm5lbERhdGEpIHtcblx0XHRcdFx0JGNoYW5uZWxEYXRhID0gbWFrZUNoYW5uZWwoKTtcblx0XHRcdH1cblxuXHRcdFx0JGNoYW5uZWxEYXRhLnNldChrZXksIHZhbHVlKTtcblx0XHR9XG5cdH07XG5cdC8vIEB0cy1leHBlY3QtZXJyb3IgVE9ETzogZmlndXJlIG91dCB3aHkgdGhpcyBpcyBlcnJvcmluZ1xuXHRyZXR1cm4gY2hhbm5lbDtcbn07XG4iLCIhZnVuY3Rpb24oaSl7XCJ1c2Ugc3RyaWN0XCI7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJqcXVlcnlcIl0saSk6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9aShyZXF1aXJlKFwianF1ZXJ5XCIpKTppKGpRdWVyeSl9KGZ1bmN0aW9uKGkpe1widXNlIHN0cmljdFwiO3ZhciBlPXdpbmRvdy5TbGlja3x8e307KGU9ZnVuY3Rpb24oKXt2YXIgZT0wO3JldHVybiBmdW5jdGlvbih0LG8pe3ZhciBzLG49dGhpcztuLmRlZmF1bHRzPXthY2Nlc3NpYmlsaXR5OiEwLGFkYXB0aXZlSGVpZ2h0OiExLGFwcGVuZEFycm93czppKHQpLGFwcGVuZERvdHM6aSh0KSxhcnJvd3M6ITAsYXNOYXZGb3I6bnVsbCxwcmV2QXJyb3c6JzxidXR0b24gY2xhc3M9XCJzbGljay1wcmV2XCIgYXJpYS1sYWJlbD1cIlByZXZpb3VzXCIgdHlwZT1cImJ1dHRvblwiPlByZXZpb3VzPC9idXR0b24+JyxuZXh0QXJyb3c6JzxidXR0b24gY2xhc3M9XCJzbGljay1uZXh0XCIgYXJpYS1sYWJlbD1cIk5leHRcIiB0eXBlPVwiYnV0dG9uXCI+TmV4dDwvYnV0dG9uPicsYXV0b3BsYXk6ITEsYXV0b3BsYXlTcGVlZDozZTMsY2VudGVyTW9kZTohMSxjZW50ZXJQYWRkaW5nOlwiNTBweFwiLGNzc0Vhc2U6XCJlYXNlXCIsY3VzdG9tUGFnaW5nOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGkoJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIC8+JykudGV4dCh0KzEpfSxkb3RzOiExLGRvdHNDbGFzczpcInNsaWNrLWRvdHNcIixkcmFnZ2FibGU6ITAsZWFzaW5nOlwibGluZWFyXCIsZWRnZUZyaWN0aW9uOi4zNSxmYWRlOiExLGZvY3VzT25TZWxlY3Q6ITEsZm9jdXNPbkNoYW5nZTohMSxpbmZpbml0ZTohMCxpbml0aWFsU2xpZGU6MCxsYXp5TG9hZDpcIm9uZGVtYW5kXCIsbW9iaWxlRmlyc3Q6ITEscGF1c2VPbkhvdmVyOiEwLHBhdXNlT25Gb2N1czohMCxwYXVzZU9uRG90c0hvdmVyOiExLHJlc3BvbmRUbzpcIndpbmRvd1wiLHJlc3BvbnNpdmU6bnVsbCxyb3dzOjEscnRsOiExLHNsaWRlOlwiXCIsc2xpZGVzUGVyUm93OjEsc2xpZGVzVG9TaG93OjEsc2xpZGVzVG9TY3JvbGw6MSxzcGVlZDo1MDAsc3dpcGU6ITAsc3dpcGVUb1NsaWRlOiExLHRvdWNoTW92ZTohMCx0b3VjaFRocmVzaG9sZDo1LHVzZUNTUzohMCx1c2VUcmFuc2Zvcm06ITAsdmFyaWFibGVXaWR0aDohMSx2ZXJ0aWNhbDohMSx2ZXJ0aWNhbFN3aXBpbmc6ITEsd2FpdEZvckFuaW1hdGU6ITAsekluZGV4OjFlM30sbi5pbml0aWFscz17YW5pbWF0aW5nOiExLGRyYWdnaW5nOiExLGF1dG9QbGF5VGltZXI6bnVsbCxjdXJyZW50RGlyZWN0aW9uOjAsY3VycmVudExlZnQ6bnVsbCxjdXJyZW50U2xpZGU6MCxkaXJlY3Rpb246MSwkZG90czpudWxsLGxpc3RXaWR0aDpudWxsLGxpc3RIZWlnaHQ6bnVsbCxsb2FkSW5kZXg6MCwkbmV4dEFycm93Om51bGwsJHByZXZBcnJvdzpudWxsLHNjcm9sbGluZzohMSxzbGlkZUNvdW50Om51bGwsc2xpZGVXaWR0aDpudWxsLCRzbGlkZVRyYWNrOm51bGwsJHNsaWRlczpudWxsLHNsaWRpbmc6ITEsc2xpZGVPZmZzZXQ6MCxzd2lwZUxlZnQ6bnVsbCxzd2lwaW5nOiExLCRsaXN0Om51bGwsdG91Y2hPYmplY3Q6e30sdHJhbnNmb3Jtc0VuYWJsZWQ6ITEsdW5zbGlja2VkOiExfSxpLmV4dGVuZChuLG4uaW5pdGlhbHMpLG4uYWN0aXZlQnJlYWtwb2ludD1udWxsLG4uYW5pbVR5cGU9bnVsbCxuLmFuaW1Qcm9wPW51bGwsbi5icmVha3BvaW50cz1bXSxuLmJyZWFrcG9pbnRTZXR0aW5ncz1bXSxuLmNzc1RyYW5zaXRpb25zPSExLG4uZm9jdXNzZWQ9ITEsbi5pbnRlcnJ1cHRlZD0hMSxuLmhpZGRlbj1cImhpZGRlblwiLG4ucGF1c2VkPSEwLG4ucG9zaXRpb25Qcm9wPW51bGwsbi5yZXNwb25kVG89bnVsbCxuLnJvd0NvdW50PTEsbi5zaG91bGRDbGljaz0hMCxuLiRzbGlkZXI9aSh0KSxuLiRzbGlkZXNDYWNoZT1udWxsLG4udHJhbnNmb3JtVHlwZT1udWxsLG4udHJhbnNpdGlvblR5cGU9bnVsbCxuLnZpc2liaWxpdHlDaGFuZ2U9XCJ2aXNpYmlsaXR5Y2hhbmdlXCIsbi53aW5kb3dXaWR0aD0wLG4ud2luZG93VGltZXI9bnVsbCxzPWkodCkuZGF0YShcInNsaWNrXCIpfHx7fSxuLm9wdGlvbnM9aS5leHRlbmQoe30sbi5kZWZhdWx0cyxvLHMpLG4uY3VycmVudFNsaWRlPW4ub3B0aW9ucy5pbml0aWFsU2xpZGUsbi5vcmlnaW5hbFNldHRpbmdzPW4ub3B0aW9ucyx2b2lkIDAhPT1kb2N1bWVudC5tb3pIaWRkZW4/KG4uaGlkZGVuPVwibW96SGlkZGVuXCIsbi52aXNpYmlsaXR5Q2hhbmdlPVwibW96dmlzaWJpbGl0eWNoYW5nZVwiKTp2b2lkIDAhPT1kb2N1bWVudC53ZWJraXRIaWRkZW4mJihuLmhpZGRlbj1cIndlYmtpdEhpZGRlblwiLG4udmlzaWJpbGl0eUNoYW5nZT1cIndlYmtpdHZpc2liaWxpdHljaGFuZ2VcIiksbi5hdXRvUGxheT1pLnByb3h5KG4uYXV0b1BsYXksbiksbi5hdXRvUGxheUNsZWFyPWkucHJveHkobi5hdXRvUGxheUNsZWFyLG4pLG4uYXV0b1BsYXlJdGVyYXRvcj1pLnByb3h5KG4uYXV0b1BsYXlJdGVyYXRvcixuKSxuLmNoYW5nZVNsaWRlPWkucHJveHkobi5jaGFuZ2VTbGlkZSxuKSxuLmNsaWNrSGFuZGxlcj1pLnByb3h5KG4uY2xpY2tIYW5kbGVyLG4pLG4uc2VsZWN0SGFuZGxlcj1pLnByb3h5KG4uc2VsZWN0SGFuZGxlcixuKSxuLnNldFBvc2l0aW9uPWkucHJveHkobi5zZXRQb3NpdGlvbixuKSxuLnN3aXBlSGFuZGxlcj1pLnByb3h5KG4uc3dpcGVIYW5kbGVyLG4pLG4uZHJhZ0hhbmRsZXI9aS5wcm94eShuLmRyYWdIYW5kbGVyLG4pLG4ua2V5SGFuZGxlcj1pLnByb3h5KG4ua2V5SGFuZGxlcixuKSxuLmluc3RhbmNlVWlkPWUrKyxuLmh0bWxFeHByPS9eKD86XFxzKig8W1xcd1xcV10rPilbXj5dKikkLyxuLnJlZ2lzdGVyQnJlYWtwb2ludHMoKSxuLmluaXQoITApfX0oKSkucHJvdG90eXBlLmFjdGl2YXRlQURBPWZ1bmN0aW9uKCl7dGhpcy4kc2xpZGVUcmFjay5maW5kKFwiLnNsaWNrLWFjdGl2ZVwiKS5hdHRyKHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwifSkuZmluZChcImEsIGlucHV0LCBidXR0b24sIHNlbGVjdFwiKS5hdHRyKHt0YWJpbmRleDpcIjBcIn0pfSxlLnByb3RvdHlwZS5hZGRTbGlkZT1lLnByb3RvdHlwZS5zbGlja0FkZD1mdW5jdGlvbihlLHQsbyl7dmFyIHM9dGhpcztpZihcImJvb2xlYW5cIj09dHlwZW9mIHQpbz10LHQ9bnVsbDtlbHNlIGlmKHQ8MHx8dD49cy5zbGlkZUNvdW50KXJldHVybiExO3MudW5sb2FkKCksXCJudW1iZXJcIj09dHlwZW9mIHQ/MD09PXQmJjA9PT1zLiRzbGlkZXMubGVuZ3RoP2koZSkuYXBwZW5kVG8ocy4kc2xpZGVUcmFjayk6bz9pKGUpLmluc2VydEJlZm9yZShzLiRzbGlkZXMuZXEodCkpOmkoZSkuaW5zZXJ0QWZ0ZXIocy4kc2xpZGVzLmVxKHQpKTohMD09PW8/aShlKS5wcmVwZW5kVG8ocy4kc2xpZGVUcmFjayk6aShlKS5hcHBlbmRUbyhzLiRzbGlkZVRyYWNrKSxzLiRzbGlkZXM9cy4kc2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpLHMuJHNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKS5kZXRhY2goKSxzLiRzbGlkZVRyYWNrLmFwcGVuZChzLiRzbGlkZXMpLHMuJHNsaWRlcy5lYWNoKGZ1bmN0aW9uKGUsdCl7aSh0KS5hdHRyKFwiZGF0YS1zbGljay1pbmRleFwiLGUpfSkscy4kc2xpZGVzQ2FjaGU9cy4kc2xpZGVzLHMucmVpbml0KCl9LGUucHJvdG90eXBlLmFuaW1hdGVIZWlnaHQ9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2lmKDE9PT1pLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYhMD09PWkub3B0aW9ucy5hZGFwdGl2ZUhlaWdodCYmITE9PT1pLm9wdGlvbnMudmVydGljYWwpe3ZhciBlPWkuJHNsaWRlcy5lcShpLmN1cnJlbnRTbGlkZSkub3V0ZXJIZWlnaHQoITApO2kuJGxpc3QuYW5pbWF0ZSh7aGVpZ2h0OmV9LGkub3B0aW9ucy5zcGVlZCl9fSxlLnByb3RvdHlwZS5hbmltYXRlU2xpZGU9ZnVuY3Rpb24oZSx0KXt2YXIgbz17fSxzPXRoaXM7cy5hbmltYXRlSGVpZ2h0KCksITA9PT1zLm9wdGlvbnMucnRsJiYhMT09PXMub3B0aW9ucy52ZXJ0aWNhbCYmKGU9LWUpLCExPT09cy50cmFuc2Zvcm1zRW5hYmxlZD8hMT09PXMub3B0aW9ucy52ZXJ0aWNhbD9zLiRzbGlkZVRyYWNrLmFuaW1hdGUoe2xlZnQ6ZX0scy5vcHRpb25zLnNwZWVkLHMub3B0aW9ucy5lYXNpbmcsdCk6cy4kc2xpZGVUcmFjay5hbmltYXRlKHt0b3A6ZX0scy5vcHRpb25zLnNwZWVkLHMub3B0aW9ucy5lYXNpbmcsdCk6ITE9PT1zLmNzc1RyYW5zaXRpb25zPyghMD09PXMub3B0aW9ucy5ydGwmJihzLmN1cnJlbnRMZWZ0PS1zLmN1cnJlbnRMZWZ0KSxpKHthbmltU3RhcnQ6cy5jdXJyZW50TGVmdH0pLmFuaW1hdGUoe2FuaW1TdGFydDplfSx7ZHVyYXRpb246cy5vcHRpb25zLnNwZWVkLGVhc2luZzpzLm9wdGlvbnMuZWFzaW5nLHN0ZXA6ZnVuY3Rpb24oaSl7aT1NYXRoLmNlaWwoaSksITE9PT1zLm9wdGlvbnMudmVydGljYWw/KG9bcy5hbmltVHlwZV09XCJ0cmFuc2xhdGUoXCIraStcInB4LCAwcHgpXCIscy4kc2xpZGVUcmFjay5jc3MobykpOihvW3MuYW5pbVR5cGVdPVwidHJhbnNsYXRlKDBweCxcIitpK1wicHgpXCIscy4kc2xpZGVUcmFjay5jc3MobykpfSxjb21wbGV0ZTpmdW5jdGlvbigpe3QmJnQuY2FsbCgpfX0pKToocy5hcHBseVRyYW5zaXRpb24oKSxlPU1hdGguY2VpbChlKSwhMT09PXMub3B0aW9ucy52ZXJ0aWNhbD9vW3MuYW5pbVR5cGVdPVwidHJhbnNsYXRlM2QoXCIrZStcInB4LCAwcHgsIDBweClcIjpvW3MuYW5pbVR5cGVdPVwidHJhbnNsYXRlM2QoMHB4LFwiK2UrXCJweCwgMHB4KVwiLHMuJHNsaWRlVHJhY2suY3NzKG8pLHQmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtzLmRpc2FibGVUcmFuc2l0aW9uKCksdC5jYWxsKCl9LHMub3B0aW9ucy5zcGVlZCkpfSxlLnByb3RvdHlwZS5nZXROYXZUYXJnZXQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS5vcHRpb25zLmFzTmF2Rm9yO3JldHVybiB0JiZudWxsIT09dCYmKHQ9aSh0KS5ub3QoZS4kc2xpZGVyKSksdH0sZS5wcm90b3R5cGUuYXNOYXZGb3I9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXROYXZUYXJnZXQoKTtudWxsIT09dCYmXCJvYmplY3RcIj09dHlwZW9mIHQmJnQuZWFjaChmdW5jdGlvbigpe3ZhciB0PWkodGhpcykuc2xpY2soXCJnZXRTbGlja1wiKTt0LnVuc2xpY2tlZHx8dC5zbGlkZUhhbmRsZXIoZSwhMCl9KX0sZS5wcm90b3R5cGUuYXBwbHlUcmFuc2l0aW9uPWZ1bmN0aW9uKGkpe3ZhciBlPXRoaXMsdD17fTshMT09PWUub3B0aW9ucy5mYWRlP3RbZS50cmFuc2l0aW9uVHlwZV09ZS50cmFuc2Zvcm1UeXBlK1wiIFwiK2Uub3B0aW9ucy5zcGVlZCtcIm1zIFwiK2Uub3B0aW9ucy5jc3NFYXNlOnRbZS50cmFuc2l0aW9uVHlwZV09XCJvcGFjaXR5IFwiK2Uub3B0aW9ucy5zcGVlZCtcIm1zIFwiK2Uub3B0aW9ucy5jc3NFYXNlLCExPT09ZS5vcHRpb25zLmZhZGU/ZS4kc2xpZGVUcmFjay5jc3ModCk6ZS4kc2xpZGVzLmVxKGkpLmNzcyh0KX0sZS5wcm90b3R5cGUuYXV0b1BsYXk9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2kuYXV0b1BsYXlDbGVhcigpLGkuc2xpZGVDb3VudD5pLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoaS5hdXRvUGxheVRpbWVyPXNldEludGVydmFsKGkuYXV0b1BsYXlJdGVyYXRvcixpLm9wdGlvbnMuYXV0b3BsYXlTcGVlZCkpfSxlLnByb3RvdHlwZS5hdXRvUGxheUNsZWFyPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztpLmF1dG9QbGF5VGltZXImJmNsZWFySW50ZXJ2YWwoaS5hdXRvUGxheVRpbWVyKX0sZS5wcm90b3R5cGUuYXV0b1BsYXlJdGVyYXRvcj1mdW5jdGlvbigpe3ZhciBpPXRoaXMsZT1pLmN1cnJlbnRTbGlkZStpLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw7aS5wYXVzZWR8fGkuaW50ZXJydXB0ZWR8fGkuZm9jdXNzZWR8fCghMT09PWkub3B0aW9ucy5pbmZpbml0ZSYmKDE9PT1pLmRpcmVjdGlvbiYmaS5jdXJyZW50U2xpZGUrMT09PWkuc2xpZGVDb3VudC0xP2kuZGlyZWN0aW9uPTA6MD09PWkuZGlyZWN0aW9uJiYoZT1pLmN1cnJlbnRTbGlkZS1pLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwsaS5jdXJyZW50U2xpZGUtMT09MCYmKGkuZGlyZWN0aW9uPTEpKSksaS5zbGlkZUhhbmRsZXIoZSkpfSxlLnByb3RvdHlwZS5idWlsZEFycm93cz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ITA9PT1lLm9wdGlvbnMuYXJyb3dzJiYoZS4kcHJldkFycm93PWkoZS5vcHRpb25zLnByZXZBcnJvdykuYWRkQ2xhc3MoXCJzbGljay1hcnJvd1wiKSxlLiRuZXh0QXJyb3c9aShlLm9wdGlvbnMubmV4dEFycm93KS5hZGRDbGFzcyhcInNsaWNrLWFycm93XCIpLGUuc2xpZGVDb3VudD5lLm9wdGlvbnMuc2xpZGVzVG9TaG93PyhlLiRwcmV2QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1oaWRkZW5cIikucmVtb3ZlQXR0cihcImFyaWEtaGlkZGVuIHRhYmluZGV4XCIpLGUuJG5leHRBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWhpZGRlblwiKS5yZW1vdmVBdHRyKFwiYXJpYS1oaWRkZW4gdGFiaW5kZXhcIiksZS5odG1sRXhwci50ZXN0KGUub3B0aW9ucy5wcmV2QXJyb3cpJiZlLiRwcmV2QXJyb3cucHJlcGVuZFRvKGUub3B0aW9ucy5hcHBlbmRBcnJvd3MpLGUuaHRtbEV4cHIudGVzdChlLm9wdGlvbnMubmV4dEFycm93KSYmZS4kbmV4dEFycm93LmFwcGVuZFRvKGUub3B0aW9ucy5hcHBlbmRBcnJvd3MpLCEwIT09ZS5vcHRpb25zLmluZmluaXRlJiZlLiRwcmV2QXJyb3cuYWRkQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwidHJ1ZVwiKSk6ZS4kcHJldkFycm93LmFkZChlLiRuZXh0QXJyb3cpLmFkZENsYXNzKFwic2xpY2staGlkZGVuXCIpLmF0dHIoe1wiYXJpYS1kaXNhYmxlZFwiOlwidHJ1ZVwiLHRhYmluZGV4OlwiLTFcIn0pKX0sZS5wcm90b3R5cGUuYnVpbGREb3RzPWZ1bmN0aW9uKCl7dmFyIGUsdCxvPXRoaXM7aWYoITA9PT1vLm9wdGlvbnMuZG90cyl7Zm9yKG8uJHNsaWRlci5hZGRDbGFzcyhcInNsaWNrLWRvdHRlZFwiKSx0PWkoXCI8dWwgLz5cIikuYWRkQ2xhc3Moby5vcHRpb25zLmRvdHNDbGFzcyksZT0wO2U8PW8uZ2V0RG90Q291bnQoKTtlKz0xKXQuYXBwZW5kKGkoXCI8bGkgLz5cIikuYXBwZW5kKG8ub3B0aW9ucy5jdXN0b21QYWdpbmcuY2FsbCh0aGlzLG8sZSkpKTtvLiRkb3RzPXQuYXBwZW5kVG8oby5vcHRpb25zLmFwcGVuZERvdHMpLG8uJGRvdHMuZmluZChcImxpXCIpLmZpcnN0KCkuYWRkQ2xhc3MoXCJzbGljay1hY3RpdmVcIil9fSxlLnByb3RvdHlwZS5idWlsZE91dD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS4kc2xpZGVzPWUuJHNsaWRlci5jaGlsZHJlbihlLm9wdGlvbnMuc2xpZGUrXCI6bm90KC5zbGljay1jbG9uZWQpXCIpLmFkZENsYXNzKFwic2xpY2stc2xpZGVcIiksZS5zbGlkZUNvdW50PWUuJHNsaWRlcy5sZW5ndGgsZS4kc2xpZGVzLmVhY2goZnVuY3Rpb24oZSx0KXtpKHQpLmF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIsZSkuZGF0YShcIm9yaWdpbmFsU3R5bGluZ1wiLGkodCkuYXR0cihcInN0eWxlXCIpfHxcIlwiKX0pLGUuJHNsaWRlci5hZGRDbGFzcyhcInNsaWNrLXNsaWRlclwiKSxlLiRzbGlkZVRyYWNrPTA9PT1lLnNsaWRlQ291bnQ/aSgnPGRpdiBjbGFzcz1cInNsaWNrLXRyYWNrXCIvPicpLmFwcGVuZFRvKGUuJHNsaWRlcik6ZS4kc2xpZGVzLndyYXBBbGwoJzxkaXYgY2xhc3M9XCJzbGljay10cmFja1wiLz4nKS5wYXJlbnQoKSxlLiRsaXN0PWUuJHNsaWRlVHJhY2sud3JhcCgnPGRpdiBjbGFzcz1cInNsaWNrLWxpc3RcIi8+JykucGFyZW50KCksZS4kc2xpZGVUcmFjay5jc3MoXCJvcGFjaXR5XCIsMCksITAhPT1lLm9wdGlvbnMuY2VudGVyTW9kZSYmITAhPT1lLm9wdGlvbnMuc3dpcGVUb1NsaWRlfHwoZS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsPTEpLGkoXCJpbWdbZGF0YS1sYXp5XVwiLGUuJHNsaWRlcikubm90KFwiW3NyY11cIikuYWRkQ2xhc3MoXCJzbGljay1sb2FkaW5nXCIpLGUuc2V0dXBJbmZpbml0ZSgpLGUuYnVpbGRBcnJvd3MoKSxlLmJ1aWxkRG90cygpLGUudXBkYXRlRG90cygpLGUuc2V0U2xpZGVDbGFzc2VzKFwibnVtYmVyXCI9PXR5cGVvZiBlLmN1cnJlbnRTbGlkZT9lLmN1cnJlbnRTbGlkZTowKSwhMD09PWUub3B0aW9ucy5kcmFnZ2FibGUmJmUuJGxpc3QuYWRkQ2xhc3MoXCJkcmFnZ2FibGVcIil9LGUucHJvdG90eXBlLmJ1aWxkUm93cz1mdW5jdGlvbigpe3ZhciBpLGUsdCxvLHMsbixyLGw9dGhpcztpZihvPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxuPWwuJHNsaWRlci5jaGlsZHJlbigpLGwub3B0aW9ucy5yb3dzPjEpe2ZvcihyPWwub3B0aW9ucy5zbGlkZXNQZXJSb3cqbC5vcHRpb25zLnJvd3Mscz1NYXRoLmNlaWwobi5sZW5ndGgvciksaT0wO2k8cztpKyspe3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7Zm9yKGU9MDtlPGwub3B0aW9ucy5yb3dzO2UrKyl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtmb3IodD0wO3Q8bC5vcHRpb25zLnNsaWRlc1BlclJvdzt0Kyspe3ZhciBjPWkqcisoZSpsLm9wdGlvbnMuc2xpZGVzUGVyUm93K3QpO24uZ2V0KGMpJiZhLmFwcGVuZENoaWxkKG4uZ2V0KGMpKX1kLmFwcGVuZENoaWxkKGEpfW8uYXBwZW5kQ2hpbGQoZCl9bC4kc2xpZGVyLmVtcHR5KCkuYXBwZW5kKG8pLGwuJHNsaWRlci5jaGlsZHJlbigpLmNoaWxkcmVuKCkuY2hpbGRyZW4oKS5jc3Moe3dpZHRoOjEwMC9sLm9wdGlvbnMuc2xpZGVzUGVyUm93K1wiJVwiLGRpc3BsYXk6XCJpbmxpbmUtYmxvY2tcIn0pfX0sZS5wcm90b3R5cGUuY2hlY2tSZXNwb25zaXZlPWZ1bmN0aW9uKGUsdCl7dmFyIG8scyxuLHI9dGhpcyxsPSExLGQ9ci4kc2xpZGVyLndpZHRoKCksYT13aW5kb3cuaW5uZXJXaWR0aHx8aSh3aW5kb3cpLndpZHRoKCk7aWYoXCJ3aW5kb3dcIj09PXIucmVzcG9uZFRvP249YTpcInNsaWRlclwiPT09ci5yZXNwb25kVG8/bj1kOlwibWluXCI9PT1yLnJlc3BvbmRUbyYmKG49TWF0aC5taW4oYSxkKSksci5vcHRpb25zLnJlc3BvbnNpdmUmJnIub3B0aW9ucy5yZXNwb25zaXZlLmxlbmd0aCYmbnVsbCE9PXIub3B0aW9ucy5yZXNwb25zaXZlKXtzPW51bGw7Zm9yKG8gaW4gci5icmVha3BvaW50cylyLmJyZWFrcG9pbnRzLmhhc093blByb3BlcnR5KG8pJiYoITE9PT1yLm9yaWdpbmFsU2V0dGluZ3MubW9iaWxlRmlyc3Q/bjxyLmJyZWFrcG9pbnRzW29dJiYocz1yLmJyZWFrcG9pbnRzW29dKTpuPnIuYnJlYWtwb2ludHNbb10mJihzPXIuYnJlYWtwb2ludHNbb10pKTtudWxsIT09cz9udWxsIT09ci5hY3RpdmVCcmVha3BvaW50PyhzIT09ci5hY3RpdmVCcmVha3BvaW50fHx0KSYmKHIuYWN0aXZlQnJlYWtwb2ludD1zLFwidW5zbGlja1wiPT09ci5icmVha3BvaW50U2V0dGluZ3Nbc10/ci51bnNsaWNrKHMpOihyLm9wdGlvbnM9aS5leHRlbmQoe30sci5vcmlnaW5hbFNldHRpbmdzLHIuYnJlYWtwb2ludFNldHRpbmdzW3NdKSwhMD09PWUmJihyLmN1cnJlbnRTbGlkZT1yLm9wdGlvbnMuaW5pdGlhbFNsaWRlKSxyLnJlZnJlc2goZSkpLGw9cyk6KHIuYWN0aXZlQnJlYWtwb2ludD1zLFwidW5zbGlja1wiPT09ci5icmVha3BvaW50U2V0dGluZ3Nbc10/ci51bnNsaWNrKHMpOihyLm9wdGlvbnM9aS5leHRlbmQoe30sci5vcmlnaW5hbFNldHRpbmdzLHIuYnJlYWtwb2ludFNldHRpbmdzW3NdKSwhMD09PWUmJihyLmN1cnJlbnRTbGlkZT1yLm9wdGlvbnMuaW5pdGlhbFNsaWRlKSxyLnJlZnJlc2goZSkpLGw9cyk6bnVsbCE9PXIuYWN0aXZlQnJlYWtwb2ludCYmKHIuYWN0aXZlQnJlYWtwb2ludD1udWxsLHIub3B0aW9ucz1yLm9yaWdpbmFsU2V0dGluZ3MsITA9PT1lJiYoci5jdXJyZW50U2xpZGU9ci5vcHRpb25zLmluaXRpYWxTbGlkZSksci5yZWZyZXNoKGUpLGw9cyksZXx8ITE9PT1sfHxyLiRzbGlkZXIudHJpZ2dlcihcImJyZWFrcG9pbnRcIixbcixsXSl9fSxlLnByb3RvdHlwZS5jaGFuZ2VTbGlkZT1mdW5jdGlvbihlLHQpe3ZhciBvLHMsbixyPXRoaXMsbD1pKGUuY3VycmVudFRhcmdldCk7c3dpdGNoKGwuaXMoXCJhXCIpJiZlLnByZXZlbnREZWZhdWx0KCksbC5pcyhcImxpXCIpfHwobD1sLmNsb3Nlc3QoXCJsaVwiKSksbj1yLnNsaWRlQ291bnQlci5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsIT0wLG89bj8wOihyLnNsaWRlQ291bnQtci5jdXJyZW50U2xpZGUpJXIub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCxlLmRhdGEubWVzc2FnZSl7Y2FzZVwicHJldmlvdXNcIjpzPTA9PT1vP3Iub3B0aW9ucy5zbGlkZXNUb1Njcm9sbDpyLm9wdGlvbnMuc2xpZGVzVG9TaG93LW8sci5zbGlkZUNvdW50PnIub3B0aW9ucy5zbGlkZXNUb1Nob3cmJnIuc2xpZGVIYW5kbGVyKHIuY3VycmVudFNsaWRlLXMsITEsdCk7YnJlYWs7Y2FzZVwibmV4dFwiOnM9MD09PW8/ci5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsOm8sci5zbGlkZUNvdW50PnIub3B0aW9ucy5zbGlkZXNUb1Nob3cmJnIuc2xpZGVIYW5kbGVyKHIuY3VycmVudFNsaWRlK3MsITEsdCk7YnJlYWs7Y2FzZVwiaW5kZXhcIjp2YXIgZD0wPT09ZS5kYXRhLmluZGV4PzA6ZS5kYXRhLmluZGV4fHxsLmluZGV4KCkqci5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsO3Iuc2xpZGVIYW5kbGVyKHIuY2hlY2tOYXZpZ2FibGUoZCksITEsdCksbC5jaGlsZHJlbigpLnRyaWdnZXIoXCJmb2N1c1wiKTticmVhaztkZWZhdWx0OnJldHVybn19LGUucHJvdG90eXBlLmNoZWNrTmF2aWdhYmxlPWZ1bmN0aW9uKGkpe3ZhciBlLHQ7aWYoZT10aGlzLmdldE5hdmlnYWJsZUluZGV4ZXMoKSx0PTAsaT5lW2UubGVuZ3RoLTFdKWk9ZVtlLmxlbmd0aC0xXTtlbHNlIGZvcih2YXIgbyBpbiBlKXtpZihpPGVbb10pe2k9dDticmVha310PWVbb119cmV0dXJuIGl9LGUucHJvdG90eXBlLmNsZWFuVXBFdmVudHM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2Uub3B0aW9ucy5kb3RzJiZudWxsIT09ZS4kZG90cyYmKGkoXCJsaVwiLGUuJGRvdHMpLm9mZihcImNsaWNrLnNsaWNrXCIsZS5jaGFuZ2VTbGlkZSkub2ZmKFwibW91c2VlbnRlci5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMCkpLm9mZihcIm1vdXNlbGVhdmUuc2xpY2tcIixpLnByb3h5KGUuaW50ZXJydXB0LGUsITEpKSwhMD09PWUub3B0aW9ucy5hY2Nlc3NpYmlsaXR5JiZlLiRkb3RzLm9mZihcImtleWRvd24uc2xpY2tcIixlLmtleUhhbmRsZXIpKSxlLiRzbGlkZXIub2ZmKFwiZm9jdXMuc2xpY2sgYmx1ci5zbGlja1wiKSwhMD09PWUub3B0aW9ucy5hcnJvd3MmJmUuc2xpZGVDb3VudD5lLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoZS4kcHJldkFycm93JiZlLiRwcmV2QXJyb3cub2ZmKFwiY2xpY2suc2xpY2tcIixlLmNoYW5nZVNsaWRlKSxlLiRuZXh0QXJyb3cmJmUuJG5leHRBcnJvdy5vZmYoXCJjbGljay5zbGlja1wiLGUuY2hhbmdlU2xpZGUpLCEwPT09ZS5vcHRpb25zLmFjY2Vzc2liaWxpdHkmJihlLiRwcmV2QXJyb3cmJmUuJHByZXZBcnJvdy5vZmYoXCJrZXlkb3duLnNsaWNrXCIsZS5rZXlIYW5kbGVyKSxlLiRuZXh0QXJyb3cmJmUuJG5leHRBcnJvdy5vZmYoXCJrZXlkb3duLnNsaWNrXCIsZS5rZXlIYW5kbGVyKSkpLGUuJGxpc3Qub2ZmKFwidG91Y2hzdGFydC5zbGljayBtb3VzZWRvd24uc2xpY2tcIixlLnN3aXBlSGFuZGxlciksZS4kbGlzdC5vZmYoXCJ0b3VjaG1vdmUuc2xpY2sgbW91c2Vtb3ZlLnNsaWNrXCIsZS5zd2lwZUhhbmRsZXIpLGUuJGxpc3Qub2ZmKFwidG91Y2hlbmQuc2xpY2sgbW91c2V1cC5zbGlja1wiLGUuc3dpcGVIYW5kbGVyKSxlLiRsaXN0Lm9mZihcInRvdWNoY2FuY2VsLnNsaWNrIG1vdXNlbGVhdmUuc2xpY2tcIixlLnN3aXBlSGFuZGxlciksZS4kbGlzdC5vZmYoXCJjbGljay5zbGlja1wiLGUuY2xpY2tIYW5kbGVyKSxpKGRvY3VtZW50KS5vZmYoZS52aXNpYmlsaXR5Q2hhbmdlLGUudmlzaWJpbGl0eSksZS5jbGVhblVwU2xpZGVFdmVudHMoKSwhMD09PWUub3B0aW9ucy5hY2Nlc3NpYmlsaXR5JiZlLiRsaXN0Lm9mZihcImtleWRvd24uc2xpY2tcIixlLmtleUhhbmRsZXIpLCEwPT09ZS5vcHRpb25zLmZvY3VzT25TZWxlY3QmJmkoZS4kc2xpZGVUcmFjaykuY2hpbGRyZW4oKS5vZmYoXCJjbGljay5zbGlja1wiLGUuc2VsZWN0SGFuZGxlciksaSh3aW5kb3cpLm9mZihcIm9yaWVudGF0aW9uY2hhbmdlLnNsaWNrLnNsaWNrLVwiK2UuaW5zdGFuY2VVaWQsZS5vcmllbnRhdGlvbkNoYW5nZSksaSh3aW5kb3cpLm9mZihcInJlc2l6ZS5zbGljay5zbGljay1cIitlLmluc3RhbmNlVWlkLGUucmVzaXplKSxpKFwiW2RyYWdnYWJsZSE9dHJ1ZV1cIixlLiRzbGlkZVRyYWNrKS5vZmYoXCJkcmFnc3RhcnRcIixlLnByZXZlbnREZWZhdWx0KSxpKHdpbmRvdykub2ZmKFwibG9hZC5zbGljay5zbGljay1cIitlLmluc3RhbmNlVWlkLGUuc2V0UG9zaXRpb24pfSxlLnByb3RvdHlwZS5jbGVhblVwU2xpZGVFdmVudHM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuJGxpc3Qub2ZmKFwibW91c2VlbnRlci5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMCkpLGUuJGxpc3Qub2ZmKFwibW91c2VsZWF2ZS5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMSkpfSxlLnByb3RvdHlwZS5jbGVhblVwUm93cz1mdW5jdGlvbigpe3ZhciBpLGU9dGhpcztlLm9wdGlvbnMucm93cz4xJiYoKGk9ZS4kc2xpZGVzLmNoaWxkcmVuKCkuY2hpbGRyZW4oKSkucmVtb3ZlQXR0cihcInN0eWxlXCIpLGUuJHNsaWRlci5lbXB0eSgpLmFwcGVuZChpKSl9LGUucHJvdG90eXBlLmNsaWNrSGFuZGxlcj1mdW5jdGlvbihpKXshMT09PXRoaXMuc2hvdWxkQ2xpY2smJihpLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLGkuc3RvcFByb3BhZ2F0aW9uKCksaS5wcmV2ZW50RGVmYXVsdCgpKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuYXV0b1BsYXlDbGVhcigpLHQudG91Y2hPYmplY3Q9e30sdC5jbGVhblVwRXZlbnRzKCksaShcIi5zbGljay1jbG9uZWRcIix0LiRzbGlkZXIpLmRldGFjaCgpLHQuJGRvdHMmJnQuJGRvdHMucmVtb3ZlKCksdC4kcHJldkFycm93JiZ0LiRwcmV2QXJyb3cubGVuZ3RoJiYodC4kcHJldkFycm93LnJlbW92ZUNsYXNzKFwic2xpY2stZGlzYWJsZWQgc2xpY2stYXJyb3cgc2xpY2staGlkZGVuXCIpLnJlbW92ZUF0dHIoXCJhcmlhLWhpZGRlbiBhcmlhLWRpc2FibGVkIHRhYmluZGV4XCIpLmNzcyhcImRpc3BsYXlcIixcIlwiKSx0Lmh0bWxFeHByLnRlc3QodC5vcHRpb25zLnByZXZBcnJvdykmJnQuJHByZXZBcnJvdy5yZW1vdmUoKSksdC4kbmV4dEFycm93JiZ0LiRuZXh0QXJyb3cubGVuZ3RoJiYodC4kbmV4dEFycm93LnJlbW92ZUNsYXNzKFwic2xpY2stZGlzYWJsZWQgc2xpY2stYXJyb3cgc2xpY2staGlkZGVuXCIpLnJlbW92ZUF0dHIoXCJhcmlhLWhpZGRlbiBhcmlhLWRpc2FibGVkIHRhYmluZGV4XCIpLmNzcyhcImRpc3BsYXlcIixcIlwiKSx0Lmh0bWxFeHByLnRlc3QodC5vcHRpb25zLm5leHRBcnJvdykmJnQuJG5leHRBcnJvdy5yZW1vdmUoKSksdC4kc2xpZGVzJiYodC4kc2xpZGVzLnJlbW92ZUNsYXNzKFwic2xpY2stc2xpZGUgc2xpY2stYWN0aXZlIHNsaWNrLWNlbnRlciBzbGljay12aXNpYmxlIHNsaWNrLWN1cnJlbnRcIikucmVtb3ZlQXR0cihcImFyaWEtaGlkZGVuXCIpLnJlbW92ZUF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIpLmVhY2goZnVuY3Rpb24oKXtpKHRoaXMpLmF0dHIoXCJzdHlsZVwiLGkodGhpcykuZGF0YShcIm9yaWdpbmFsU3R5bGluZ1wiKSl9KSx0LiRzbGlkZVRyYWNrLmNoaWxkcmVuKHRoaXMub3B0aW9ucy5zbGlkZSkuZGV0YWNoKCksdC4kc2xpZGVUcmFjay5kZXRhY2goKSx0LiRsaXN0LmRldGFjaCgpLHQuJHNsaWRlci5hcHBlbmQodC4kc2xpZGVzKSksdC5jbGVhblVwUm93cygpLHQuJHNsaWRlci5yZW1vdmVDbGFzcyhcInNsaWNrLXNsaWRlclwiKSx0LiRzbGlkZXIucmVtb3ZlQ2xhc3MoXCJzbGljay1pbml0aWFsaXplZFwiKSx0LiRzbGlkZXIucmVtb3ZlQ2xhc3MoXCJzbGljay1kb3R0ZWRcIiksdC51bnNsaWNrZWQ9ITAsZXx8dC4kc2xpZGVyLnRyaWdnZXIoXCJkZXN0cm95XCIsW3RdKX0sZS5wcm90b3R5cGUuZGlzYWJsZVRyYW5zaXRpb249ZnVuY3Rpb24oaSl7dmFyIGU9dGhpcyx0PXt9O3RbZS50cmFuc2l0aW9uVHlwZV09XCJcIiwhMT09PWUub3B0aW9ucy5mYWRlP2UuJHNsaWRlVHJhY2suY3NzKHQpOmUuJHNsaWRlcy5lcShpKS5jc3ModCl9LGUucHJvdG90eXBlLmZhZGVTbGlkZT1mdW5jdGlvbihpLGUpe3ZhciB0PXRoaXM7ITE9PT10LmNzc1RyYW5zaXRpb25zPyh0LiRzbGlkZXMuZXEoaSkuY3NzKHt6SW5kZXg6dC5vcHRpb25zLnpJbmRleH0pLHQuJHNsaWRlcy5lcShpKS5hbmltYXRlKHtvcGFjaXR5OjF9LHQub3B0aW9ucy5zcGVlZCx0Lm9wdGlvbnMuZWFzaW5nLGUpKToodC5hcHBseVRyYW5zaXRpb24oaSksdC4kc2xpZGVzLmVxKGkpLmNzcyh7b3BhY2l0eToxLHpJbmRleDp0Lm9wdGlvbnMuekluZGV4fSksZSYmc2V0VGltZW91dChmdW5jdGlvbigpe3QuZGlzYWJsZVRyYW5zaXRpb24oaSksZS5jYWxsKCl9LHQub3B0aW9ucy5zcGVlZCkpfSxlLnByb3RvdHlwZS5mYWRlU2xpZGVPdXQ9ZnVuY3Rpb24oaSl7dmFyIGU9dGhpczshMT09PWUuY3NzVHJhbnNpdGlvbnM/ZS4kc2xpZGVzLmVxKGkpLmFuaW1hdGUoe29wYWNpdHk6MCx6SW5kZXg6ZS5vcHRpb25zLnpJbmRleC0yfSxlLm9wdGlvbnMuc3BlZWQsZS5vcHRpb25zLmVhc2luZyk6KGUuYXBwbHlUcmFuc2l0aW9uKGkpLGUuJHNsaWRlcy5lcShpKS5jc3Moe29wYWNpdHk6MCx6SW5kZXg6ZS5vcHRpb25zLnpJbmRleC0yfSkpfSxlLnByb3RvdHlwZS5maWx0ZXJTbGlkZXM9ZS5wcm90b3R5cGUuc2xpY2tGaWx0ZXI9ZnVuY3Rpb24oaSl7dmFyIGU9dGhpcztudWxsIT09aSYmKGUuJHNsaWRlc0NhY2hlPWUuJHNsaWRlcyxlLnVubG9hZCgpLGUuJHNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKS5kZXRhY2goKSxlLiRzbGlkZXNDYWNoZS5maWx0ZXIoaSkuYXBwZW5kVG8oZS4kc2xpZGVUcmFjayksZS5yZWluaXQoKSl9LGUucHJvdG90eXBlLmZvY3VzSGFuZGxlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS4kc2xpZGVyLm9mZihcImZvY3VzLnNsaWNrIGJsdXIuc2xpY2tcIikub24oXCJmb2N1cy5zbGljayBibHVyLnNsaWNrXCIsXCIqXCIsZnVuY3Rpb24odCl7dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTt2YXIgbz1pKHRoaXMpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9wdGlvbnMucGF1c2VPbkZvY3VzJiYoZS5mb2N1c3NlZD1vLmlzKFwiOmZvY3VzXCIpLGUuYXV0b1BsYXkoKSl9LDApfSl9LGUucHJvdG90eXBlLmdldEN1cnJlbnQ9ZS5wcm90b3R5cGUuc2xpY2tDdXJyZW50U2xpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJyZW50U2xpZGV9LGUucHJvdG90eXBlLmdldERvdENvdW50PWZ1bmN0aW9uKCl7dmFyIGk9dGhpcyxlPTAsdD0wLG89MDtpZighMD09PWkub3B0aW9ucy5pbmZpbml0ZSlpZihpLnNsaWRlQ291bnQ8PWkub3B0aW9ucy5zbGlkZXNUb1Nob3cpKytvO2Vsc2UgZm9yKDtlPGkuc2xpZGVDb3VudDspKytvLGU9dCtpLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwsdCs9aS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsPD1pLm9wdGlvbnMuc2xpZGVzVG9TaG93P2kub3B0aW9ucy5zbGlkZXNUb1Njcm9sbDppLm9wdGlvbnMuc2xpZGVzVG9TaG93O2Vsc2UgaWYoITA9PT1pLm9wdGlvbnMuY2VudGVyTW9kZSlvPWkuc2xpZGVDb3VudDtlbHNlIGlmKGkub3B0aW9ucy5hc05hdkZvcilmb3IoO2U8aS5zbGlkZUNvdW50OykrK28sZT10K2kub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCx0Kz1pLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw8PWkub3B0aW9ucy5zbGlkZXNUb1Nob3c/aS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsOmkub3B0aW9ucy5zbGlkZXNUb1Nob3c7ZWxzZSBvPTErTWF0aC5jZWlsKChpLnNsaWRlQ291bnQtaS5vcHRpb25zLnNsaWRlc1RvU2hvdykvaS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsKTtyZXR1cm4gby0xfSxlLnByb3RvdHlwZS5nZXRMZWZ0PWZ1bmN0aW9uKGkpe3ZhciBlLHQsbyxzLG49dGhpcyxyPTA7cmV0dXJuIG4uc2xpZGVPZmZzZXQ9MCx0PW4uJHNsaWRlcy5maXJzdCgpLm91dGVySGVpZ2h0KCEwKSwhMD09PW4ub3B0aW9ucy5pbmZpbml0ZT8obi5zbGlkZUNvdW50Pm4ub3B0aW9ucy5zbGlkZXNUb1Nob3cmJihuLnNsaWRlT2Zmc2V0PW4uc2xpZGVXaWR0aCpuLm9wdGlvbnMuc2xpZGVzVG9TaG93Ki0xLHM9LTEsITA9PT1uLm9wdGlvbnMudmVydGljYWwmJiEwPT09bi5vcHRpb25zLmNlbnRlck1vZGUmJigyPT09bi5vcHRpb25zLnNsaWRlc1RvU2hvdz9zPS0xLjU6MT09PW4ub3B0aW9ucy5zbGlkZXNUb1Nob3cmJihzPS0yKSkscj10Km4ub3B0aW9ucy5zbGlkZXNUb1Nob3cqcyksbi5zbGlkZUNvdW50JW4ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCE9MCYmaStuLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw+bi5zbGlkZUNvdW50JiZuLnNsaWRlQ291bnQ+bi5vcHRpb25zLnNsaWRlc1RvU2hvdyYmKGk+bi5zbGlkZUNvdW50PyhuLnNsaWRlT2Zmc2V0PShuLm9wdGlvbnMuc2xpZGVzVG9TaG93LShpLW4uc2xpZGVDb3VudCkpKm4uc2xpZGVXaWR0aCotMSxyPShuLm9wdGlvbnMuc2xpZGVzVG9TaG93LShpLW4uc2xpZGVDb3VudCkpKnQqLTEpOihuLnNsaWRlT2Zmc2V0PW4uc2xpZGVDb3VudCVuLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwqbi5zbGlkZVdpZHRoKi0xLHI9bi5zbGlkZUNvdW50JW4ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCp0Ki0xKSkpOmkrbi5vcHRpb25zLnNsaWRlc1RvU2hvdz5uLnNsaWRlQ291bnQmJihuLnNsaWRlT2Zmc2V0PShpK24ub3B0aW9ucy5zbGlkZXNUb1Nob3ctbi5zbGlkZUNvdW50KSpuLnNsaWRlV2lkdGgscj0oaStuLm9wdGlvbnMuc2xpZGVzVG9TaG93LW4uc2xpZGVDb3VudCkqdCksbi5zbGlkZUNvdW50PD1uLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYobi5zbGlkZU9mZnNldD0wLHI9MCksITA9PT1uLm9wdGlvbnMuY2VudGVyTW9kZSYmbi5zbGlkZUNvdW50PD1uLm9wdGlvbnMuc2xpZGVzVG9TaG93P24uc2xpZGVPZmZzZXQ9bi5zbGlkZVdpZHRoKk1hdGguZmxvb3Iobi5vcHRpb25zLnNsaWRlc1RvU2hvdykvMi1uLnNsaWRlV2lkdGgqbi5zbGlkZUNvdW50LzI6ITA9PT1uLm9wdGlvbnMuY2VudGVyTW9kZSYmITA9PT1uLm9wdGlvbnMuaW5maW5pdGU/bi5zbGlkZU9mZnNldCs9bi5zbGlkZVdpZHRoKk1hdGguZmxvb3Iobi5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKS1uLnNsaWRlV2lkdGg6ITA9PT1uLm9wdGlvbnMuY2VudGVyTW9kZSYmKG4uc2xpZGVPZmZzZXQ9MCxuLnNsaWRlT2Zmc2V0Kz1uLnNsaWRlV2lkdGgqTWF0aC5mbG9vcihuLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIpKSxlPSExPT09bi5vcHRpb25zLnZlcnRpY2FsP2kqbi5zbGlkZVdpZHRoKi0xK24uc2xpZGVPZmZzZXQ6aSp0Ki0xK3IsITA9PT1uLm9wdGlvbnMudmFyaWFibGVXaWR0aCYmKG89bi5zbGlkZUNvdW50PD1uLm9wdGlvbnMuc2xpZGVzVG9TaG93fHwhMT09PW4ub3B0aW9ucy5pbmZpbml0ZT9uLiRzbGlkZVRyYWNrLmNoaWxkcmVuKFwiLnNsaWNrLXNsaWRlXCIpLmVxKGkpOm4uJHNsaWRlVHJhY2suY2hpbGRyZW4oXCIuc2xpY2stc2xpZGVcIikuZXEoaStuLm9wdGlvbnMuc2xpZGVzVG9TaG93KSxlPSEwPT09bi5vcHRpb25zLnJ0bD9vWzBdPy0xKihuLiRzbGlkZVRyYWNrLndpZHRoKCktb1swXS5vZmZzZXRMZWZ0LW8ud2lkdGgoKSk6MDpvWzBdPy0xKm9bMF0ub2Zmc2V0TGVmdDowLCEwPT09bi5vcHRpb25zLmNlbnRlck1vZGUmJihvPW4uc2xpZGVDb3VudDw9bi5vcHRpb25zLnNsaWRlc1RvU2hvd3x8ITE9PT1uLm9wdGlvbnMuaW5maW5pdGU/bi4kc2xpZGVUcmFjay5jaGlsZHJlbihcIi5zbGljay1zbGlkZVwiKS5lcShpKTpuLiRzbGlkZVRyYWNrLmNoaWxkcmVuKFwiLnNsaWNrLXNsaWRlXCIpLmVxKGkrbi5vcHRpb25zLnNsaWRlc1RvU2hvdysxKSxlPSEwPT09bi5vcHRpb25zLnJ0bD9vWzBdPy0xKihuLiRzbGlkZVRyYWNrLndpZHRoKCktb1swXS5vZmZzZXRMZWZ0LW8ud2lkdGgoKSk6MDpvWzBdPy0xKm9bMF0ub2Zmc2V0TGVmdDowLGUrPShuLiRsaXN0LndpZHRoKCktby5vdXRlcldpZHRoKCkpLzIpKSxlfSxlLnByb3RvdHlwZS5nZXRPcHRpb249ZS5wcm90b3R5cGUuc2xpY2tHZXRPcHRpb249ZnVuY3Rpb24oaSl7cmV0dXJuIHRoaXMub3B0aW9uc1tpXX0sZS5wcm90b3R5cGUuZ2V0TmF2aWdhYmxlSW5kZXhlcz1mdW5jdGlvbigpe3ZhciBpLGU9dGhpcyx0PTAsbz0wLHM9W107Zm9yKCExPT09ZS5vcHRpb25zLmluZmluaXRlP2k9ZS5zbGlkZUNvdW50Oih0PS0xKmUub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCxvPS0xKmUub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCxpPTIqZS5zbGlkZUNvdW50KTt0PGk7KXMucHVzaCh0KSx0PW8rZS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsLG8rPWUub3B0aW9ucy5zbGlkZXNUb1Njcm9sbDw9ZS5vcHRpb25zLnNsaWRlc1RvU2hvdz9lLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw6ZS5vcHRpb25zLnNsaWRlc1RvU2hvdztyZXR1cm4gc30sZS5wcm90b3R5cGUuZ2V0U2xpY2s9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZS5wcm90b3R5cGUuZ2V0U2xpZGVDb3VudD1mdW5jdGlvbigpe3ZhciBlLHQsbz10aGlzO3JldHVybiB0PSEwPT09by5vcHRpb25zLmNlbnRlck1vZGU/by5zbGlkZVdpZHRoKk1hdGguZmxvb3Ioby5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKTowLCEwPT09by5vcHRpb25zLnN3aXBlVG9TbGlkZT8oby4kc2xpZGVUcmFjay5maW5kKFwiLnNsaWNrLXNsaWRlXCIpLmVhY2goZnVuY3Rpb24ocyxuKXtpZihuLm9mZnNldExlZnQtdCtpKG4pLm91dGVyV2lkdGgoKS8yPi0xKm8uc3dpcGVMZWZ0KXJldHVybiBlPW4sITF9KSxNYXRoLmFicyhpKGUpLmF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIpLW8uY3VycmVudFNsaWRlKXx8MSk6by5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsfSxlLnByb3RvdHlwZS5nb1RvPWUucHJvdG90eXBlLnNsaWNrR29Ubz1mdW5jdGlvbihpLGUpe3RoaXMuY2hhbmdlU2xpZGUoe2RhdGE6e21lc3NhZ2U6XCJpbmRleFwiLGluZGV4OnBhcnNlSW50KGkpfX0sZSl9LGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpKHQuJHNsaWRlcikuaGFzQ2xhc3MoXCJzbGljay1pbml0aWFsaXplZFwiKXx8KGkodC4kc2xpZGVyKS5hZGRDbGFzcyhcInNsaWNrLWluaXRpYWxpemVkXCIpLHQuYnVpbGRSb3dzKCksdC5idWlsZE91dCgpLHQuc2V0UHJvcHMoKSx0LnN0YXJ0TG9hZCgpLHQubG9hZFNsaWRlcigpLHQuaW5pdGlhbGl6ZUV2ZW50cygpLHQudXBkYXRlQXJyb3dzKCksdC51cGRhdGVEb3RzKCksdC5jaGVja1Jlc3BvbnNpdmUoITApLHQuZm9jdXNIYW5kbGVyKCkpLGUmJnQuJHNsaWRlci50cmlnZ2VyKFwiaW5pdFwiLFt0XSksITA9PT10Lm9wdGlvbnMuYWNjZXNzaWJpbGl0eSYmdC5pbml0QURBKCksdC5vcHRpb25zLmF1dG9wbGF5JiYodC5wYXVzZWQ9ITEsdC5hdXRvUGxheSgpKX0sZS5wcm90b3R5cGUuaW5pdEFEQT1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1NYXRoLmNlaWwoZS5zbGlkZUNvdW50L2Uub3B0aW9ucy5zbGlkZXNUb1Nob3cpLG89ZS5nZXROYXZpZ2FibGVJbmRleGVzKCkuZmlsdGVyKGZ1bmN0aW9uKGkpe3JldHVybiBpPj0wJiZpPGUuc2xpZGVDb3VudH0pO2UuJHNsaWRlcy5hZGQoZS4kc2xpZGVUcmFjay5maW5kKFwiLnNsaWNrLWNsb25lZFwiKSkuYXR0cih7XCJhcmlhLWhpZGRlblwiOlwidHJ1ZVwiLHRhYmluZGV4OlwiLTFcIn0pLmZpbmQoXCJhLCBpbnB1dCwgYnV0dG9uLCBzZWxlY3RcIikuYXR0cih7dGFiaW5kZXg6XCItMVwifSksbnVsbCE9PWUuJGRvdHMmJihlLiRzbGlkZXMubm90KGUuJHNsaWRlVHJhY2suZmluZChcIi5zbGljay1jbG9uZWRcIikpLmVhY2goZnVuY3Rpb24odCl7dmFyIHM9by5pbmRleE9mKHQpO2kodGhpcykuYXR0cih7cm9sZTpcInRhYnBhbmVsXCIsaWQ6XCJzbGljay1zbGlkZVwiK2UuaW5zdGFuY2VVaWQrdCx0YWJpbmRleDotMX0pLC0xIT09cyYmaSh0aGlzKS5hdHRyKHtcImFyaWEtZGVzY3JpYmVkYnlcIjpcInNsaWNrLXNsaWRlLWNvbnRyb2xcIitlLmluc3RhbmNlVWlkK3N9KX0pLGUuJGRvdHMuYXR0cihcInJvbGVcIixcInRhYmxpc3RcIikuZmluZChcImxpXCIpLmVhY2goZnVuY3Rpb24ocyl7dmFyIG49b1tzXTtpKHRoaXMpLmF0dHIoe3JvbGU6XCJwcmVzZW50YXRpb25cIn0pLGkodGhpcykuZmluZChcImJ1dHRvblwiKS5maXJzdCgpLmF0dHIoe3JvbGU6XCJ0YWJcIixpZDpcInNsaWNrLXNsaWRlLWNvbnRyb2xcIitlLmluc3RhbmNlVWlkK3MsXCJhcmlhLWNvbnRyb2xzXCI6XCJzbGljay1zbGlkZVwiK2UuaW5zdGFuY2VVaWQrbixcImFyaWEtbGFiZWxcIjpzKzErXCIgb2YgXCIrdCxcImFyaWEtc2VsZWN0ZWRcIjpudWxsLHRhYmluZGV4OlwiLTFcIn0pfSkuZXEoZS5jdXJyZW50U2xpZGUpLmZpbmQoXCJidXR0b25cIikuYXR0cih7XCJhcmlhLXNlbGVjdGVkXCI6XCJ0cnVlXCIsdGFiaW5kZXg6XCIwXCJ9KS5lbmQoKSk7Zm9yKHZhciBzPWUuY3VycmVudFNsaWRlLG49cytlLm9wdGlvbnMuc2xpZGVzVG9TaG93O3M8bjtzKyspZS4kc2xpZGVzLmVxKHMpLmF0dHIoXCJ0YWJpbmRleFwiLDApO2UuYWN0aXZhdGVBREEoKX0sZS5wcm90b3R5cGUuaW5pdEFycm93RXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGk9dGhpczshMD09PWkub3B0aW9ucy5hcnJvd3MmJmkuc2xpZGVDb3VudD5pLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoaS4kcHJldkFycm93Lm9mZihcImNsaWNrLnNsaWNrXCIpLm9uKFwiY2xpY2suc2xpY2tcIix7bWVzc2FnZTpcInByZXZpb3VzXCJ9LGkuY2hhbmdlU2xpZGUpLGkuJG5leHRBcnJvdy5vZmYoXCJjbGljay5zbGlja1wiKS5vbihcImNsaWNrLnNsaWNrXCIse21lc3NhZ2U6XCJuZXh0XCJ9LGkuY2hhbmdlU2xpZGUpLCEwPT09aS5vcHRpb25zLmFjY2Vzc2liaWxpdHkmJihpLiRwcmV2QXJyb3cub24oXCJrZXlkb3duLnNsaWNrXCIsaS5rZXlIYW5kbGVyKSxpLiRuZXh0QXJyb3cub24oXCJrZXlkb3duLnNsaWNrXCIsaS5rZXlIYW5kbGVyKSkpfSxlLnByb3RvdHlwZS5pbml0RG90RXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczshMD09PWUub3B0aW9ucy5kb3RzJiYoaShcImxpXCIsZS4kZG90cykub24oXCJjbGljay5zbGlja1wiLHttZXNzYWdlOlwiaW5kZXhcIn0sZS5jaGFuZ2VTbGlkZSksITA9PT1lLm9wdGlvbnMuYWNjZXNzaWJpbGl0eSYmZS4kZG90cy5vbihcImtleWRvd24uc2xpY2tcIixlLmtleUhhbmRsZXIpKSwhMD09PWUub3B0aW9ucy5kb3RzJiYhMD09PWUub3B0aW9ucy5wYXVzZU9uRG90c0hvdmVyJiZpKFwibGlcIixlLiRkb3RzKS5vbihcIm1vdXNlZW50ZXIuc2xpY2tcIixpLnByb3h5KGUuaW50ZXJydXB0LGUsITApKS5vbihcIm1vdXNlbGVhdmUuc2xpY2tcIixpLnByb3h5KGUuaW50ZXJydXB0LGUsITEpKX0sZS5wcm90b3R5cGUuaW5pdFNsaWRlRXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLm9wdGlvbnMucGF1c2VPbkhvdmVyJiYoZS4kbGlzdC5vbihcIm1vdXNlZW50ZXIuc2xpY2tcIixpLnByb3h5KGUuaW50ZXJydXB0LGUsITApKSxlLiRsaXN0Lm9uKFwibW91c2VsZWF2ZS5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMSkpKX0sZS5wcm90b3R5cGUuaW5pdGlhbGl6ZUV2ZW50cz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5pbml0QXJyb3dFdmVudHMoKSxlLmluaXREb3RFdmVudHMoKSxlLmluaXRTbGlkZUV2ZW50cygpLGUuJGxpc3Qub24oXCJ0b3VjaHN0YXJ0LnNsaWNrIG1vdXNlZG93bi5zbGlja1wiLHthY3Rpb246XCJzdGFydFwifSxlLnN3aXBlSGFuZGxlciksZS4kbGlzdC5vbihcInRvdWNobW92ZS5zbGljayBtb3VzZW1vdmUuc2xpY2tcIix7YWN0aW9uOlwibW92ZVwifSxlLnN3aXBlSGFuZGxlciksZS4kbGlzdC5vbihcInRvdWNoZW5kLnNsaWNrIG1vdXNldXAuc2xpY2tcIix7YWN0aW9uOlwiZW5kXCJ9LGUuc3dpcGVIYW5kbGVyKSxlLiRsaXN0Lm9uKFwidG91Y2hjYW5jZWwuc2xpY2sgbW91c2VsZWF2ZS5zbGlja1wiLHthY3Rpb246XCJlbmRcIn0sZS5zd2lwZUhhbmRsZXIpLGUuJGxpc3Qub24oXCJjbGljay5zbGlja1wiLGUuY2xpY2tIYW5kbGVyKSxpKGRvY3VtZW50KS5vbihlLnZpc2liaWxpdHlDaGFuZ2UsaS5wcm94eShlLnZpc2liaWxpdHksZSkpLCEwPT09ZS5vcHRpb25zLmFjY2Vzc2liaWxpdHkmJmUuJGxpc3Qub24oXCJrZXlkb3duLnNsaWNrXCIsZS5rZXlIYW5kbGVyKSwhMD09PWUub3B0aW9ucy5mb2N1c09uU2VsZWN0JiZpKGUuJHNsaWRlVHJhY2spLmNoaWxkcmVuKCkub24oXCJjbGljay5zbGlja1wiLGUuc2VsZWN0SGFuZGxlciksaSh3aW5kb3cpLm9uKFwib3JpZW50YXRpb25jaGFuZ2Uuc2xpY2suc2xpY2stXCIrZS5pbnN0YW5jZVVpZCxpLnByb3h5KGUub3JpZW50YXRpb25DaGFuZ2UsZSkpLGkod2luZG93KS5vbihcInJlc2l6ZS5zbGljay5zbGljay1cIitlLmluc3RhbmNlVWlkLGkucHJveHkoZS5yZXNpemUsZSkpLGkoXCJbZHJhZ2dhYmxlIT10cnVlXVwiLGUuJHNsaWRlVHJhY2spLm9uKFwiZHJhZ3N0YXJ0XCIsZS5wcmV2ZW50RGVmYXVsdCksaSh3aW5kb3cpLm9uKFwibG9hZC5zbGljay5zbGljay1cIitlLmluc3RhbmNlVWlkLGUuc2V0UG9zaXRpb24pLGkoZS5zZXRQb3NpdGlvbil9LGUucHJvdG90eXBlLmluaXRVST1mdW5jdGlvbigpe3ZhciBpPXRoaXM7ITA9PT1pLm9wdGlvbnMuYXJyb3dzJiZpLnNsaWRlQ291bnQ+aS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmKGkuJHByZXZBcnJvdy5zaG93KCksaS4kbmV4dEFycm93LnNob3coKSksITA9PT1pLm9wdGlvbnMuZG90cyYmaS5zbGlkZUNvdW50Pmkub3B0aW9ucy5zbGlkZXNUb1Nob3cmJmkuJGRvdHMuc2hvdygpfSxlLnByb3RvdHlwZS5rZXlIYW5kbGVyPWZ1bmN0aW9uKGkpe3ZhciBlPXRoaXM7aS50YXJnZXQudGFnTmFtZS5tYXRjaChcIlRFWFRBUkVBfElOUFVUfFNFTEVDVFwiKXx8KDM3PT09aS5rZXlDb2RlJiYhMD09PWUub3B0aW9ucy5hY2Nlc3NpYmlsaXR5P2UuY2hhbmdlU2xpZGUoe2RhdGE6e21lc3NhZ2U6ITA9PT1lLm9wdGlvbnMucnRsP1wibmV4dFwiOlwicHJldmlvdXNcIn19KTozOT09PWkua2V5Q29kZSYmITA9PT1lLm9wdGlvbnMuYWNjZXNzaWJpbGl0eSYmZS5jaGFuZ2VTbGlkZSh7ZGF0YTp7bWVzc2FnZTohMD09PWUub3B0aW9ucy5ydGw/XCJwcmV2aW91c1wiOlwibmV4dFwifX0pKX0sZS5wcm90b3R5cGUubGF6eUxvYWQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2koXCJpbWdbZGF0YS1sYXp5XVwiLGUpLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1pKHRoaXMpLHQ9aSh0aGlzKS5hdHRyKFwiZGF0YS1sYXp5XCIpLG89aSh0aGlzKS5hdHRyKFwiZGF0YS1zcmNzZXRcIikscz1pKHRoaXMpLmF0dHIoXCJkYXRhLXNpemVzXCIpfHxuLiRzbGlkZXIuYXR0cihcImRhdGEtc2l6ZXNcIikscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO3Iub25sb2FkPWZ1bmN0aW9uKCl7ZS5hbmltYXRlKHtvcGFjaXR5OjB9LDEwMCxmdW5jdGlvbigpe28mJihlLmF0dHIoXCJzcmNzZXRcIixvKSxzJiZlLmF0dHIoXCJzaXplc1wiLHMpKSxlLmF0dHIoXCJzcmNcIix0KS5hbmltYXRlKHtvcGFjaXR5OjF9LDIwMCxmdW5jdGlvbigpe2UucmVtb3ZlQXR0cihcImRhdGEtbGF6eSBkYXRhLXNyY3NldCBkYXRhLXNpemVzXCIpLnJlbW92ZUNsYXNzKFwic2xpY2stbG9hZGluZ1wiKX0pLG4uJHNsaWRlci50cmlnZ2VyKFwibGF6eUxvYWRlZFwiLFtuLGUsdF0pfSl9LHIub25lcnJvcj1mdW5jdGlvbigpe2UucmVtb3ZlQXR0cihcImRhdGEtbGF6eVwiKS5yZW1vdmVDbGFzcyhcInNsaWNrLWxvYWRpbmdcIikuYWRkQ2xhc3MoXCJzbGljay1sYXp5bG9hZC1lcnJvclwiKSxuLiRzbGlkZXIudHJpZ2dlcihcImxhenlMb2FkRXJyb3JcIixbbixlLHRdKX0sci5zcmM9dH0pfXZhciB0LG8scyxuPXRoaXM7aWYoITA9PT1uLm9wdGlvbnMuY2VudGVyTW9kZT8hMD09PW4ub3B0aW9ucy5pbmZpbml0ZT9zPShvPW4uY3VycmVudFNsaWRlKyhuLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIrMSkpK24ub3B0aW9ucy5zbGlkZXNUb1Nob3crMjoobz1NYXRoLm1heCgwLG4uY3VycmVudFNsaWRlLShuLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIrMSkpLHM9bi5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKzErMituLmN1cnJlbnRTbGlkZSk6KG89bi5vcHRpb25zLmluZmluaXRlP24ub3B0aW9ucy5zbGlkZXNUb1Nob3crbi5jdXJyZW50U2xpZGU6bi5jdXJyZW50U2xpZGUscz1NYXRoLmNlaWwobytuLm9wdGlvbnMuc2xpZGVzVG9TaG93KSwhMD09PW4ub3B0aW9ucy5mYWRlJiYobz4wJiZvLS0sczw9bi5zbGlkZUNvdW50JiZzKyspKSx0PW4uJHNsaWRlci5maW5kKFwiLnNsaWNrLXNsaWRlXCIpLnNsaWNlKG8scyksXCJhbnRpY2lwYXRlZFwiPT09bi5vcHRpb25zLmxhenlMb2FkKWZvcih2YXIgcj1vLTEsbD1zLGQ9bi4kc2xpZGVyLmZpbmQoXCIuc2xpY2stc2xpZGVcIiksYT0wO2E8bi5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsO2ErKylyPDAmJihyPW4uc2xpZGVDb3VudC0xKSx0PSh0PXQuYWRkKGQuZXEocikpKS5hZGQoZC5lcShsKSksci0tLGwrKztlKHQpLG4uc2xpZGVDb3VudDw9bi5vcHRpb25zLnNsaWRlc1RvU2hvdz9lKG4uJHNsaWRlci5maW5kKFwiLnNsaWNrLXNsaWRlXCIpKTpuLmN1cnJlbnRTbGlkZT49bi5zbGlkZUNvdW50LW4ub3B0aW9ucy5zbGlkZXNUb1Nob3c/ZShuLiRzbGlkZXIuZmluZChcIi5zbGljay1jbG9uZWRcIikuc2xpY2UoMCxuLm9wdGlvbnMuc2xpZGVzVG9TaG93KSk6MD09PW4uY3VycmVudFNsaWRlJiZlKG4uJHNsaWRlci5maW5kKFwiLnNsaWNrLWNsb25lZFwiKS5zbGljZSgtMSpuLm9wdGlvbnMuc2xpZGVzVG9TaG93KSl9LGUucHJvdG90eXBlLmxvYWRTbGlkZXI9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2kuc2V0UG9zaXRpb24oKSxpLiRzbGlkZVRyYWNrLmNzcyh7b3BhY2l0eToxfSksaS4kc2xpZGVyLnJlbW92ZUNsYXNzKFwic2xpY2stbG9hZGluZ1wiKSxpLmluaXRVSSgpLFwicHJvZ3Jlc3NpdmVcIj09PWkub3B0aW9ucy5sYXp5TG9hZCYmaS5wcm9ncmVzc2l2ZUxhenlMb2FkKCl9LGUucHJvdG90eXBlLm5leHQ9ZS5wcm90b3R5cGUuc2xpY2tOZXh0PWZ1bmN0aW9uKCl7dGhpcy5jaGFuZ2VTbGlkZSh7ZGF0YTp7bWVzc2FnZTpcIm5leHRcIn19KX0sZS5wcm90b3R5cGUub3JpZW50YXRpb25DaGFuZ2U9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2kuY2hlY2tSZXNwb25zaXZlKCksaS5zZXRQb3NpdGlvbigpfSxlLnByb3RvdHlwZS5wYXVzZT1lLnByb3RvdHlwZS5zbGlja1BhdXNlPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztpLmF1dG9QbGF5Q2xlYXIoKSxpLnBhdXNlZD0hMH0sZS5wcm90b3R5cGUucGxheT1lLnByb3RvdHlwZS5zbGlja1BsYXk9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2kuYXV0b1BsYXkoKSxpLm9wdGlvbnMuYXV0b3BsYXk9ITAsaS5wYXVzZWQ9ITEsaS5mb2N1c3NlZD0hMSxpLmludGVycnVwdGVkPSExfSxlLnByb3RvdHlwZS5wb3N0U2xpZGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0LnVuc2xpY2tlZHx8KHQuJHNsaWRlci50cmlnZ2VyKFwiYWZ0ZXJDaGFuZ2VcIixbdCxlXSksdC5hbmltYXRpbmc9ITEsdC5zbGlkZUNvdW50PnQub3B0aW9ucy5zbGlkZXNUb1Nob3cmJnQuc2V0UG9zaXRpb24oKSx0LnN3aXBlTGVmdD1udWxsLHQub3B0aW9ucy5hdXRvcGxheSYmdC5hdXRvUGxheSgpLCEwPT09dC5vcHRpb25zLmFjY2Vzc2liaWxpdHkmJih0LmluaXRBREEoKSx0Lm9wdGlvbnMuZm9jdXNPbkNoYW5nZSYmaSh0LiRzbGlkZXMuZ2V0KHQuY3VycmVudFNsaWRlKSkuYXR0cihcInRhYmluZGV4XCIsMCkuZm9jdXMoKSkpfSxlLnByb3RvdHlwZS5wcmV2PWUucHJvdG90eXBlLnNsaWNrUHJldj1mdW5jdGlvbigpe3RoaXMuY2hhbmdlU2xpZGUoe2RhdGE6e21lc3NhZ2U6XCJwcmV2aW91c1wifX0pfSxlLnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbihpKXtpLnByZXZlbnREZWZhdWx0KCl9LGUucHJvdG90eXBlLnByb2dyZXNzaXZlTGF6eUxvYWQ9ZnVuY3Rpb24oZSl7ZT1lfHwxO3ZhciB0LG8scyxuLHIsbD10aGlzLGQ9aShcImltZ1tkYXRhLWxhenldXCIsbC4kc2xpZGVyKTtkLmxlbmd0aD8odD1kLmZpcnN0KCksbz10LmF0dHIoXCJkYXRhLWxhenlcIikscz10LmF0dHIoXCJkYXRhLXNyY3NldFwiKSxuPXQuYXR0cihcImRhdGEtc2l6ZXNcIil8fGwuJHNsaWRlci5hdHRyKFwiZGF0YS1zaXplc1wiKSwocj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpKS5vbmxvYWQ9ZnVuY3Rpb24oKXtzJiYodC5hdHRyKFwic3Jjc2V0XCIscyksbiYmdC5hdHRyKFwic2l6ZXNcIixuKSksdC5hdHRyKFwic3JjXCIsbykucmVtb3ZlQXR0cihcImRhdGEtbGF6eSBkYXRhLXNyY3NldCBkYXRhLXNpemVzXCIpLnJlbW92ZUNsYXNzKFwic2xpY2stbG9hZGluZ1wiKSwhMD09PWwub3B0aW9ucy5hZGFwdGl2ZUhlaWdodCYmbC5zZXRQb3NpdGlvbigpLGwuJHNsaWRlci50cmlnZ2VyKFwibGF6eUxvYWRlZFwiLFtsLHQsb10pLGwucHJvZ3Jlc3NpdmVMYXp5TG9hZCgpfSxyLm9uZXJyb3I9ZnVuY3Rpb24oKXtlPDM/c2V0VGltZW91dChmdW5jdGlvbigpe2wucHJvZ3Jlc3NpdmVMYXp5TG9hZChlKzEpfSw1MDApOih0LnJlbW92ZUF0dHIoXCJkYXRhLWxhenlcIikucmVtb3ZlQ2xhc3MoXCJzbGljay1sb2FkaW5nXCIpLmFkZENsYXNzKFwic2xpY2stbGF6eWxvYWQtZXJyb3JcIiksbC4kc2xpZGVyLnRyaWdnZXIoXCJsYXp5TG9hZEVycm9yXCIsW2wsdCxvXSksbC5wcm9ncmVzc2l2ZUxhenlMb2FkKCkpfSxyLnNyYz1vKTpsLiRzbGlkZXIudHJpZ2dlcihcImFsbEltYWdlc0xvYWRlZFwiLFtsXSl9LGUucHJvdG90eXBlLnJlZnJlc2g9ZnVuY3Rpb24oZSl7dmFyIHQsbyxzPXRoaXM7bz1zLnNsaWRlQ291bnQtcy5vcHRpb25zLnNsaWRlc1RvU2hvdywhcy5vcHRpb25zLmluZmluaXRlJiZzLmN1cnJlbnRTbGlkZT5vJiYocy5jdXJyZW50U2xpZGU9bykscy5zbGlkZUNvdW50PD1zLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYocy5jdXJyZW50U2xpZGU9MCksdD1zLmN1cnJlbnRTbGlkZSxzLmRlc3Ryb3koITApLGkuZXh0ZW5kKHMscy5pbml0aWFscyx7Y3VycmVudFNsaWRlOnR9KSxzLmluaXQoKSxlfHxzLmNoYW5nZVNsaWRlKHtkYXRhOnttZXNzYWdlOlwiaW5kZXhcIixpbmRleDp0fX0sITEpfSxlLnByb3RvdHlwZS5yZWdpc3RlckJyZWFrcG9pbnRzPWZ1bmN0aW9uKCl7dmFyIGUsdCxvLHM9dGhpcyxuPXMub3B0aW9ucy5yZXNwb25zaXZlfHxudWxsO2lmKFwiYXJyYXlcIj09PWkudHlwZShuKSYmbi5sZW5ndGgpe3MucmVzcG9uZFRvPXMub3B0aW9ucy5yZXNwb25kVG98fFwid2luZG93XCI7Zm9yKGUgaW4gbilpZihvPXMuYnJlYWtwb2ludHMubGVuZ3RoLTEsbi5oYXNPd25Qcm9wZXJ0eShlKSl7Zm9yKHQ9bltlXS5icmVha3BvaW50O28+PTA7KXMuYnJlYWtwb2ludHNbb10mJnMuYnJlYWtwb2ludHNbb109PT10JiZzLmJyZWFrcG9pbnRzLnNwbGljZShvLDEpLG8tLTtzLmJyZWFrcG9pbnRzLnB1c2godCkscy5icmVha3BvaW50U2V0dGluZ3NbdF09bltlXS5zZXR0aW5nc31zLmJyZWFrcG9pbnRzLnNvcnQoZnVuY3Rpb24oaSxlKXtyZXR1cm4gcy5vcHRpb25zLm1vYmlsZUZpcnN0P2ktZTplLWl9KX19LGUucHJvdG90eXBlLnJlaW5pdD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS4kc2xpZGVzPWUuJHNsaWRlVHJhY2suY2hpbGRyZW4oZS5vcHRpb25zLnNsaWRlKS5hZGRDbGFzcyhcInNsaWNrLXNsaWRlXCIpLGUuc2xpZGVDb3VudD1lLiRzbGlkZXMubGVuZ3RoLGUuY3VycmVudFNsaWRlPj1lLnNsaWRlQ291bnQmJjAhPT1lLmN1cnJlbnRTbGlkZSYmKGUuY3VycmVudFNsaWRlPWUuY3VycmVudFNsaWRlLWUub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCksZS5zbGlkZUNvdW50PD1lLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoZS5jdXJyZW50U2xpZGU9MCksZS5yZWdpc3RlckJyZWFrcG9pbnRzKCksZS5zZXRQcm9wcygpLGUuc2V0dXBJbmZpbml0ZSgpLGUuYnVpbGRBcnJvd3MoKSxlLnVwZGF0ZUFycm93cygpLGUuaW5pdEFycm93RXZlbnRzKCksZS5idWlsZERvdHMoKSxlLnVwZGF0ZURvdHMoKSxlLmluaXREb3RFdmVudHMoKSxlLmNsZWFuVXBTbGlkZUV2ZW50cygpLGUuaW5pdFNsaWRlRXZlbnRzKCksZS5jaGVja1Jlc3BvbnNpdmUoITEsITApLCEwPT09ZS5vcHRpb25zLmZvY3VzT25TZWxlY3QmJmkoZS4kc2xpZGVUcmFjaykuY2hpbGRyZW4oKS5vbihcImNsaWNrLnNsaWNrXCIsZS5zZWxlY3RIYW5kbGVyKSxlLnNldFNsaWRlQ2xhc3NlcyhcIm51bWJlclwiPT10eXBlb2YgZS5jdXJyZW50U2xpZGU/ZS5jdXJyZW50U2xpZGU6MCksZS5zZXRQb3NpdGlvbigpLGUuZm9jdXNIYW5kbGVyKCksZS5wYXVzZWQ9IWUub3B0aW9ucy5hdXRvcGxheSxlLmF1dG9QbGF5KCksZS4kc2xpZGVyLnRyaWdnZXIoXCJyZUluaXRcIixbZV0pfSxlLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2kod2luZG93KS53aWR0aCgpIT09ZS53aW5kb3dXaWR0aCYmKGNsZWFyVGltZW91dChlLndpbmRvd0RlbGF5KSxlLndpbmRvd0RlbGF5PXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS53aW5kb3dXaWR0aD1pKHdpbmRvdykud2lkdGgoKSxlLmNoZWNrUmVzcG9uc2l2ZSgpLGUudW5zbGlja2VkfHxlLnNldFBvc2l0aW9uKCl9LDUwKSl9LGUucHJvdG90eXBlLnJlbW92ZVNsaWRlPWUucHJvdG90eXBlLnNsaWNrUmVtb3ZlPWZ1bmN0aW9uKGksZSx0KXt2YXIgbz10aGlzO2lmKGk9XCJib29sZWFuXCI9PXR5cGVvZiBpPyEwPT09KGU9aSk/MDpvLnNsaWRlQ291bnQtMTohMD09PWU/LS1pOmksby5zbGlkZUNvdW50PDF8fGk8MHx8aT5vLnNsaWRlQ291bnQtMSlyZXR1cm4hMTtvLnVubG9hZCgpLCEwPT09dD9vLiRzbGlkZVRyYWNrLmNoaWxkcmVuKCkucmVtb3ZlKCk6by4kc2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpLmVxKGkpLnJlbW92ZSgpLG8uJHNsaWRlcz1vLiRzbGlkZVRyYWNrLmNoaWxkcmVuKHRoaXMub3B0aW9ucy5zbGlkZSksby4kc2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpLmRldGFjaCgpLG8uJHNsaWRlVHJhY2suYXBwZW5kKG8uJHNsaWRlcyksby4kc2xpZGVzQ2FjaGU9by4kc2xpZGVzLG8ucmVpbml0KCl9LGUucHJvdG90eXBlLnNldENTUz1mdW5jdGlvbihpKXt2YXIgZSx0LG89dGhpcyxzPXt9OyEwPT09by5vcHRpb25zLnJ0bCYmKGk9LWkpLGU9XCJsZWZ0XCI9PW8ucG9zaXRpb25Qcm9wP01hdGguY2VpbChpKStcInB4XCI6XCIwcHhcIix0PVwidG9wXCI9PW8ucG9zaXRpb25Qcm9wP01hdGguY2VpbChpKStcInB4XCI6XCIwcHhcIixzW28ucG9zaXRpb25Qcm9wXT1pLCExPT09by50cmFuc2Zvcm1zRW5hYmxlZD9vLiRzbGlkZVRyYWNrLmNzcyhzKToocz17fSwhMT09PW8uY3NzVHJhbnNpdGlvbnM/KHNbby5hbmltVHlwZV09XCJ0cmFuc2xhdGUoXCIrZStcIiwgXCIrdCtcIilcIixvLiRzbGlkZVRyYWNrLmNzcyhzKSk6KHNbby5hbmltVHlwZV09XCJ0cmFuc2xhdGUzZChcIitlK1wiLCBcIit0K1wiLCAwcHgpXCIsby4kc2xpZGVUcmFjay5jc3MocykpKX0sZS5wcm90b3R5cGUuc2V0RGltZW5zaW9ucz1mdW5jdGlvbigpe3ZhciBpPXRoaXM7ITE9PT1pLm9wdGlvbnMudmVydGljYWw/ITA9PT1pLm9wdGlvbnMuY2VudGVyTW9kZSYmaS4kbGlzdC5jc3Moe3BhZGRpbmc6XCIwcHggXCIraS5vcHRpb25zLmNlbnRlclBhZGRpbmd9KTooaS4kbGlzdC5oZWlnaHQoaS4kc2xpZGVzLmZpcnN0KCkub3V0ZXJIZWlnaHQoITApKmkub3B0aW9ucy5zbGlkZXNUb1Nob3cpLCEwPT09aS5vcHRpb25zLmNlbnRlck1vZGUmJmkuJGxpc3QuY3NzKHtwYWRkaW5nOmkub3B0aW9ucy5jZW50ZXJQYWRkaW5nK1wiIDBweFwifSkpLGkubGlzdFdpZHRoPWkuJGxpc3Qud2lkdGgoKSxpLmxpc3RIZWlnaHQ9aS4kbGlzdC5oZWlnaHQoKSwhMT09PWkub3B0aW9ucy52ZXJ0aWNhbCYmITE9PT1pLm9wdGlvbnMudmFyaWFibGVXaWR0aD8oaS5zbGlkZVdpZHRoPU1hdGguY2VpbChpLmxpc3RXaWR0aC9pLm9wdGlvbnMuc2xpZGVzVG9TaG93KSxpLiRzbGlkZVRyYWNrLndpZHRoKE1hdGguY2VpbChpLnNsaWRlV2lkdGgqaS4kc2xpZGVUcmFjay5jaGlsZHJlbihcIi5zbGljay1zbGlkZVwiKS5sZW5ndGgpKSk6ITA9PT1pLm9wdGlvbnMudmFyaWFibGVXaWR0aD9pLiRzbGlkZVRyYWNrLndpZHRoKDVlMyppLnNsaWRlQ291bnQpOihpLnNsaWRlV2lkdGg9TWF0aC5jZWlsKGkubGlzdFdpZHRoKSxpLiRzbGlkZVRyYWNrLmhlaWdodChNYXRoLmNlaWwoaS4kc2xpZGVzLmZpcnN0KCkub3V0ZXJIZWlnaHQoITApKmkuJHNsaWRlVHJhY2suY2hpbGRyZW4oXCIuc2xpY2stc2xpZGVcIikubGVuZ3RoKSkpO3ZhciBlPWkuJHNsaWRlcy5maXJzdCgpLm91dGVyV2lkdGgoITApLWkuJHNsaWRlcy5maXJzdCgpLndpZHRoKCk7ITE9PT1pLm9wdGlvbnMudmFyaWFibGVXaWR0aCYmaS4kc2xpZGVUcmFjay5jaGlsZHJlbihcIi5zbGljay1zbGlkZVwiKS53aWR0aChpLnNsaWRlV2lkdGgtZSl9LGUucHJvdG90eXBlLnNldEZhZGU9ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXM7dC4kc2xpZGVzLmVhY2goZnVuY3Rpb24obyxzKXtlPXQuc2xpZGVXaWR0aCpvKi0xLCEwPT09dC5vcHRpb25zLnJ0bD9pKHMpLmNzcyh7cG9zaXRpb246XCJyZWxhdGl2ZVwiLHJpZ2h0OmUsdG9wOjAsekluZGV4OnQub3B0aW9ucy56SW5kZXgtMixvcGFjaXR5OjB9KTppKHMpLmNzcyh7cG9zaXRpb246XCJyZWxhdGl2ZVwiLGxlZnQ6ZSx0b3A6MCx6SW5kZXg6dC5vcHRpb25zLnpJbmRleC0yLG9wYWNpdHk6MH0pfSksdC4kc2xpZGVzLmVxKHQuY3VycmVudFNsaWRlKS5jc3Moe3pJbmRleDp0Lm9wdGlvbnMuekluZGV4LTEsb3BhY2l0eToxfSl9LGUucHJvdG90eXBlLnNldEhlaWdodD1mdW5jdGlvbigpe3ZhciBpPXRoaXM7aWYoMT09PWkub3B0aW9ucy5zbGlkZXNUb1Nob3cmJiEwPT09aS5vcHRpb25zLmFkYXB0aXZlSGVpZ2h0JiYhMT09PWkub3B0aW9ucy52ZXJ0aWNhbCl7dmFyIGU9aS4kc2xpZGVzLmVxKGkuY3VycmVudFNsaWRlKS5vdXRlckhlaWdodCghMCk7aS4kbGlzdC5jc3MoXCJoZWlnaHRcIixlKX19LGUucHJvdG90eXBlLnNldE9wdGlvbj1lLnByb3RvdHlwZS5zbGlja1NldE9wdGlvbj1mdW5jdGlvbigpe3ZhciBlLHQsbyxzLG4scj10aGlzLGw9ITE7aWYoXCJvYmplY3RcIj09PWkudHlwZShhcmd1bWVudHNbMF0pPyhvPWFyZ3VtZW50c1swXSxsPWFyZ3VtZW50c1sxXSxuPVwibXVsdGlwbGVcIik6XCJzdHJpbmdcIj09PWkudHlwZShhcmd1bWVudHNbMF0pJiYobz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sbD1hcmd1bWVudHNbMl0sXCJyZXNwb25zaXZlXCI9PT1hcmd1bWVudHNbMF0mJlwiYXJyYXlcIj09PWkudHlwZShhcmd1bWVudHNbMV0pP249XCJyZXNwb25zaXZlXCI6dm9pZCAwIT09YXJndW1lbnRzWzFdJiYobj1cInNpbmdsZVwiKSksXCJzaW5nbGVcIj09PW4pci5vcHRpb25zW29dPXM7ZWxzZSBpZihcIm11bHRpcGxlXCI9PT1uKWkuZWFjaChvLGZ1bmN0aW9uKGksZSl7ci5vcHRpb25zW2ldPWV9KTtlbHNlIGlmKFwicmVzcG9uc2l2ZVwiPT09bilmb3IodCBpbiBzKWlmKFwiYXJyYXlcIiE9PWkudHlwZShyLm9wdGlvbnMucmVzcG9uc2l2ZSkpci5vcHRpb25zLnJlc3BvbnNpdmU9W3NbdF1dO2Vsc2V7Zm9yKGU9ci5vcHRpb25zLnJlc3BvbnNpdmUubGVuZ3RoLTE7ZT49MDspci5vcHRpb25zLnJlc3BvbnNpdmVbZV0uYnJlYWtwb2ludD09PXNbdF0uYnJlYWtwb2ludCYmci5vcHRpb25zLnJlc3BvbnNpdmUuc3BsaWNlKGUsMSksZS0tO3Iub3B0aW9ucy5yZXNwb25zaXZlLnB1c2goc1t0XSl9bCYmKHIudW5sb2FkKCksci5yZWluaXQoKSl9LGUucHJvdG90eXBlLnNldFBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztpLnNldERpbWVuc2lvbnMoKSxpLnNldEhlaWdodCgpLCExPT09aS5vcHRpb25zLmZhZGU/aS5zZXRDU1MoaS5nZXRMZWZ0KGkuY3VycmVudFNsaWRlKSk6aS5zZXRGYWRlKCksaS4kc2xpZGVyLnRyaWdnZXIoXCJzZXRQb3NpdGlvblwiLFtpXSl9LGUucHJvdG90eXBlLnNldFByb3BzPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcyxlPWRvY3VtZW50LmJvZHkuc3R5bGU7aS5wb3NpdGlvblByb3A9ITA9PT1pLm9wdGlvbnMudmVydGljYWw/XCJ0b3BcIjpcImxlZnRcIixcInRvcFwiPT09aS5wb3NpdGlvblByb3A/aS4kc2xpZGVyLmFkZENsYXNzKFwic2xpY2stdmVydGljYWxcIik6aS4kc2xpZGVyLnJlbW92ZUNsYXNzKFwic2xpY2stdmVydGljYWxcIiksdm9pZCAwPT09ZS5XZWJraXRUcmFuc2l0aW9uJiZ2b2lkIDA9PT1lLk1velRyYW5zaXRpb24mJnZvaWQgMD09PWUubXNUcmFuc2l0aW9ufHwhMD09PWkub3B0aW9ucy51c2VDU1MmJihpLmNzc1RyYW5zaXRpb25zPSEwKSxpLm9wdGlvbnMuZmFkZSYmKFwibnVtYmVyXCI9PXR5cGVvZiBpLm9wdGlvbnMuekluZGV4P2kub3B0aW9ucy56SW5kZXg8MyYmKGkub3B0aW9ucy56SW5kZXg9Myk6aS5vcHRpb25zLnpJbmRleD1pLmRlZmF1bHRzLnpJbmRleCksdm9pZCAwIT09ZS5PVHJhbnNmb3JtJiYoaS5hbmltVHlwZT1cIk9UcmFuc2Zvcm1cIixpLnRyYW5zZm9ybVR5cGU9XCItby10cmFuc2Zvcm1cIixpLnRyYW5zaXRpb25UeXBlPVwiT1RyYW5zaXRpb25cIix2b2lkIDA9PT1lLnBlcnNwZWN0aXZlUHJvcGVydHkmJnZvaWQgMD09PWUud2Via2l0UGVyc3BlY3RpdmUmJihpLmFuaW1UeXBlPSExKSksdm9pZCAwIT09ZS5Nb3pUcmFuc2Zvcm0mJihpLmFuaW1UeXBlPVwiTW96VHJhbnNmb3JtXCIsaS50cmFuc2Zvcm1UeXBlPVwiLW1vei10cmFuc2Zvcm1cIixpLnRyYW5zaXRpb25UeXBlPVwiTW96VHJhbnNpdGlvblwiLHZvaWQgMD09PWUucGVyc3BlY3RpdmVQcm9wZXJ0eSYmdm9pZCAwPT09ZS5Nb3pQZXJzcGVjdGl2ZSYmKGkuYW5pbVR5cGU9ITEpKSx2b2lkIDAhPT1lLndlYmtpdFRyYW5zZm9ybSYmKGkuYW5pbVR5cGU9XCJ3ZWJraXRUcmFuc2Zvcm1cIixpLnRyYW5zZm9ybVR5cGU9XCItd2Via2l0LXRyYW5zZm9ybVwiLGkudHJhbnNpdGlvblR5cGU9XCJ3ZWJraXRUcmFuc2l0aW9uXCIsdm9pZCAwPT09ZS5wZXJzcGVjdGl2ZVByb3BlcnR5JiZ2b2lkIDA9PT1lLndlYmtpdFBlcnNwZWN0aXZlJiYoaS5hbmltVHlwZT0hMSkpLHZvaWQgMCE9PWUubXNUcmFuc2Zvcm0mJihpLmFuaW1UeXBlPVwibXNUcmFuc2Zvcm1cIixpLnRyYW5zZm9ybVR5cGU9XCItbXMtdHJhbnNmb3JtXCIsaS50cmFuc2l0aW9uVHlwZT1cIm1zVHJhbnNpdGlvblwiLHZvaWQgMD09PWUubXNUcmFuc2Zvcm0mJihpLmFuaW1UeXBlPSExKSksdm9pZCAwIT09ZS50cmFuc2Zvcm0mJiExIT09aS5hbmltVHlwZSYmKGkuYW5pbVR5cGU9XCJ0cmFuc2Zvcm1cIixpLnRyYW5zZm9ybVR5cGU9XCJ0cmFuc2Zvcm1cIixpLnRyYW5zaXRpb25UeXBlPVwidHJhbnNpdGlvblwiKSxpLnRyYW5zZm9ybXNFbmFibGVkPWkub3B0aW9ucy51c2VUcmFuc2Zvcm0mJm51bGwhPT1pLmFuaW1UeXBlJiYhMSE9PWkuYW5pbVR5cGV9LGUucHJvdG90eXBlLnNldFNsaWRlQ2xhc3Nlcz1mdW5jdGlvbihpKXt2YXIgZSx0LG8scyxuPXRoaXM7aWYodD1uLiRzbGlkZXIuZmluZChcIi5zbGljay1zbGlkZVwiKS5yZW1vdmVDbGFzcyhcInNsaWNrLWFjdGl2ZSBzbGljay1jZW50ZXIgc2xpY2stY3VycmVudFwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIiksbi4kc2xpZGVzLmVxKGkpLmFkZENsYXNzKFwic2xpY2stY3VycmVudFwiKSwhMD09PW4ub3B0aW9ucy5jZW50ZXJNb2RlKXt2YXIgcj1uLm9wdGlvbnMuc2xpZGVzVG9TaG93JTI9PTA/MTowO2U9TWF0aC5mbG9vcihuLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIpLCEwPT09bi5vcHRpb25zLmluZmluaXRlJiYoaT49ZSYmaTw9bi5zbGlkZUNvdW50LTEtZT9uLiRzbGlkZXMuc2xpY2UoaS1lK3IsaStlKzEpLmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwiZmFsc2VcIik6KG89bi5vcHRpb25zLnNsaWRlc1RvU2hvdytpLHQuc2xpY2Uoby1lKzErcixvK2UrMikuYWRkQ2xhc3MoXCJzbGljay1hY3RpdmVcIikuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJmYWxzZVwiKSksMD09PWk/dC5lcSh0Lmxlbmd0aC0xLW4ub3B0aW9ucy5zbGlkZXNUb1Nob3cpLmFkZENsYXNzKFwic2xpY2stY2VudGVyXCIpOmk9PT1uLnNsaWRlQ291bnQtMSYmdC5lcShuLm9wdGlvbnMuc2xpZGVzVG9TaG93KS5hZGRDbGFzcyhcInNsaWNrLWNlbnRlclwiKSksbi4kc2xpZGVzLmVxKGkpLmFkZENsYXNzKFwic2xpY2stY2VudGVyXCIpfWVsc2UgaT49MCYmaTw9bi5zbGlkZUNvdW50LW4ub3B0aW9ucy5zbGlkZXNUb1Nob3c/bi4kc2xpZGVzLnNsaWNlKGksaStuLm9wdGlvbnMuc2xpZGVzVG9TaG93KS5hZGRDbGFzcyhcInNsaWNrLWFjdGl2ZVwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcImZhbHNlXCIpOnQubGVuZ3RoPD1uLm9wdGlvbnMuc2xpZGVzVG9TaG93P3QuYWRkQ2xhc3MoXCJzbGljay1hY3RpdmVcIikuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJmYWxzZVwiKToocz1uLnNsaWRlQ291bnQlbi5vcHRpb25zLnNsaWRlc1RvU2hvdyxvPSEwPT09bi5vcHRpb25zLmluZmluaXRlP24ub3B0aW9ucy5zbGlkZXNUb1Nob3craTppLG4ub3B0aW9ucy5zbGlkZXNUb1Nob3c9PW4ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCYmbi5zbGlkZUNvdW50LWk8bi5vcHRpb25zLnNsaWRlc1RvU2hvdz90LnNsaWNlKG8tKG4ub3B0aW9ucy5zbGlkZXNUb1Nob3ctcyksbytzKS5hZGRDbGFzcyhcInNsaWNrLWFjdGl2ZVwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcImZhbHNlXCIpOnQuc2xpY2UobyxvK24ub3B0aW9ucy5zbGlkZXNUb1Nob3cpLmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwiZmFsc2VcIikpO1wib25kZW1hbmRcIiE9PW4ub3B0aW9ucy5sYXp5TG9hZCYmXCJhbnRpY2lwYXRlZFwiIT09bi5vcHRpb25zLmxhenlMb2FkfHxuLmxhenlMb2FkKCl9LGUucHJvdG90eXBlLnNldHVwSW5maW5pdGU9ZnVuY3Rpb24oKXt2YXIgZSx0LG8scz10aGlzO2lmKCEwPT09cy5vcHRpb25zLmZhZGUmJihzLm9wdGlvbnMuY2VudGVyTW9kZT0hMSksITA9PT1zLm9wdGlvbnMuaW5maW5pdGUmJiExPT09cy5vcHRpb25zLmZhZGUmJih0PW51bGwscy5zbGlkZUNvdW50PnMub3B0aW9ucy5zbGlkZXNUb1Nob3cpKXtmb3Iobz0hMD09PXMub3B0aW9ucy5jZW50ZXJNb2RlP3Mub3B0aW9ucy5zbGlkZXNUb1Nob3crMTpzLm9wdGlvbnMuc2xpZGVzVG9TaG93LGU9cy5zbGlkZUNvdW50O2U+cy5zbGlkZUNvdW50LW87ZS09MSl0PWUtMSxpKHMuJHNsaWRlc1t0XSkuY2xvbmUoITApLmF0dHIoXCJpZFwiLFwiXCIpLmF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIsdC1zLnNsaWRlQ291bnQpLnByZXBlbmRUbyhzLiRzbGlkZVRyYWNrKS5hZGRDbGFzcyhcInNsaWNrLWNsb25lZFwiKTtmb3IoZT0wO2U8bytzLnNsaWRlQ291bnQ7ZSs9MSl0PWUsaShzLiRzbGlkZXNbdF0pLmNsb25lKCEwKS5hdHRyKFwiaWRcIixcIlwiKS5hdHRyKFwiZGF0YS1zbGljay1pbmRleFwiLHQrcy5zbGlkZUNvdW50KS5hcHBlbmRUbyhzLiRzbGlkZVRyYWNrKS5hZGRDbGFzcyhcInNsaWNrLWNsb25lZFwiKTtzLiRzbGlkZVRyYWNrLmZpbmQoXCIuc2xpY2stY2xvbmVkXCIpLmZpbmQoXCJbaWRdXCIpLmVhY2goZnVuY3Rpb24oKXtpKHRoaXMpLmF0dHIoXCJpZFwiLFwiXCIpfSl9fSxlLnByb3RvdHlwZS5pbnRlcnJ1cHQ9ZnVuY3Rpb24oaSl7dmFyIGU9dGhpcztpfHxlLmF1dG9QbGF5KCksZS5pbnRlcnJ1cHRlZD1pfSxlLnByb3RvdHlwZS5zZWxlY3RIYW5kbGVyPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbz1pKGUudGFyZ2V0KS5pcyhcIi5zbGljay1zbGlkZVwiKT9pKGUudGFyZ2V0KTppKGUudGFyZ2V0KS5wYXJlbnRzKFwiLnNsaWNrLXNsaWRlXCIpLHM9cGFyc2VJbnQoby5hdHRyKFwiZGF0YS1zbGljay1pbmRleFwiKSk7c3x8KHM9MCksdC5zbGlkZUNvdW50PD10Lm9wdGlvbnMuc2xpZGVzVG9TaG93P3Quc2xpZGVIYW5kbGVyKHMsITEsITApOnQuc2xpZGVIYW5kbGVyKHMpfSxlLnByb3RvdHlwZS5zbGlkZUhhbmRsZXI9ZnVuY3Rpb24oaSxlLHQpe3ZhciBvLHMsbixyLGwsZD1udWxsLGE9dGhpcztpZihlPWV8fCExLCEoITA9PT1hLmFuaW1hdGluZyYmITA9PT1hLm9wdGlvbnMud2FpdEZvckFuaW1hdGV8fCEwPT09YS5vcHRpb25zLmZhZGUmJmEuY3VycmVudFNsaWRlPT09aSkpaWYoITE9PT1lJiZhLmFzTmF2Rm9yKGkpLG89aSxkPWEuZ2V0TGVmdChvKSxyPWEuZ2V0TGVmdChhLmN1cnJlbnRTbGlkZSksYS5jdXJyZW50TGVmdD1udWxsPT09YS5zd2lwZUxlZnQ/cjphLnN3aXBlTGVmdCwhMT09PWEub3B0aW9ucy5pbmZpbml0ZSYmITE9PT1hLm9wdGlvbnMuY2VudGVyTW9kZSYmKGk8MHx8aT5hLmdldERvdENvdW50KCkqYS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsKSkhMT09PWEub3B0aW9ucy5mYWRlJiYobz1hLmN1cnJlbnRTbGlkZSwhMCE9PXQ/YS5hbmltYXRlU2xpZGUocixmdW5jdGlvbigpe2EucG9zdFNsaWRlKG8pfSk6YS5wb3N0U2xpZGUobykpO2Vsc2UgaWYoITE9PT1hLm9wdGlvbnMuaW5maW5pdGUmJiEwPT09YS5vcHRpb25zLmNlbnRlck1vZGUmJihpPDB8fGk+YS5zbGlkZUNvdW50LWEub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCkpITE9PT1hLm9wdGlvbnMuZmFkZSYmKG89YS5jdXJyZW50U2xpZGUsITAhPT10P2EuYW5pbWF0ZVNsaWRlKHIsZnVuY3Rpb24oKXthLnBvc3RTbGlkZShvKX0pOmEucG9zdFNsaWRlKG8pKTtlbHNle2lmKGEub3B0aW9ucy5hdXRvcGxheSYmY2xlYXJJbnRlcnZhbChhLmF1dG9QbGF5VGltZXIpLHM9bzwwP2Euc2xpZGVDb3VudCVhLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwhPTA/YS5zbGlkZUNvdW50LWEuc2xpZGVDb3VudCVhLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw6YS5zbGlkZUNvdW50K286bz49YS5zbGlkZUNvdW50P2Euc2xpZGVDb3VudCVhLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwhPTA/MDpvLWEuc2xpZGVDb3VudDpvLGEuYW5pbWF0aW5nPSEwLGEuJHNsaWRlci50cmlnZ2VyKFwiYmVmb3JlQ2hhbmdlXCIsW2EsYS5jdXJyZW50U2xpZGUsc10pLG49YS5jdXJyZW50U2xpZGUsYS5jdXJyZW50U2xpZGU9cyxhLnNldFNsaWRlQ2xhc3NlcyhhLmN1cnJlbnRTbGlkZSksYS5vcHRpb25zLmFzTmF2Rm9yJiYobD0obD1hLmdldE5hdlRhcmdldCgpKS5zbGljayhcImdldFNsaWNrXCIpKS5zbGlkZUNvdW50PD1sLm9wdGlvbnMuc2xpZGVzVG9TaG93JiZsLnNldFNsaWRlQ2xhc3NlcyhhLmN1cnJlbnRTbGlkZSksYS51cGRhdGVEb3RzKCksYS51cGRhdGVBcnJvd3MoKSwhMD09PWEub3B0aW9ucy5mYWRlKXJldHVybiEwIT09dD8oYS5mYWRlU2xpZGVPdXQobiksYS5mYWRlU2xpZGUocyxmdW5jdGlvbigpe2EucG9zdFNsaWRlKHMpfSkpOmEucG9zdFNsaWRlKHMpLHZvaWQgYS5hbmltYXRlSGVpZ2h0KCk7ITAhPT10P2EuYW5pbWF0ZVNsaWRlKGQsZnVuY3Rpb24oKXthLnBvc3RTbGlkZShzKX0pOmEucG9zdFNsaWRlKHMpfX0sZS5wcm90b3R5cGUuc3RhcnRMb2FkPWZ1bmN0aW9uKCl7dmFyIGk9dGhpczshMD09PWkub3B0aW9ucy5hcnJvd3MmJmkuc2xpZGVDb3VudD5pLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoaS4kcHJldkFycm93LmhpZGUoKSxpLiRuZXh0QXJyb3cuaGlkZSgpKSwhMD09PWkub3B0aW9ucy5kb3RzJiZpLnNsaWRlQ291bnQ+aS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmaS4kZG90cy5oaWRlKCksaS4kc2xpZGVyLmFkZENsYXNzKFwic2xpY2stbG9hZGluZ1wiKX0sZS5wcm90b3R5cGUuc3dpcGVEaXJlY3Rpb249ZnVuY3Rpb24oKXt2YXIgaSxlLHQsbyxzPXRoaXM7cmV0dXJuIGk9cy50b3VjaE9iamVjdC5zdGFydFgtcy50b3VjaE9iamVjdC5jdXJYLGU9cy50b3VjaE9iamVjdC5zdGFydFktcy50b3VjaE9iamVjdC5jdXJZLHQ9TWF0aC5hdGFuMihlLGkpLChvPU1hdGgucm91bmQoMTgwKnQvTWF0aC5QSSkpPDAmJihvPTM2MC1NYXRoLmFicyhvKSksbzw9NDUmJm8+PTA/ITE9PT1zLm9wdGlvbnMucnRsP1wibGVmdFwiOlwicmlnaHRcIjpvPD0zNjAmJm8+PTMxNT8hMT09PXMub3B0aW9ucy5ydGw/XCJsZWZ0XCI6XCJyaWdodFwiOm8+PTEzNSYmbzw9MjI1PyExPT09cy5vcHRpb25zLnJ0bD9cInJpZ2h0XCI6XCJsZWZ0XCI6ITA9PT1zLm9wdGlvbnMudmVydGljYWxTd2lwaW5nP28+PTM1JiZvPD0xMzU/XCJkb3duXCI6XCJ1cFwiOlwidmVydGljYWxcIn0sZS5wcm90b3R5cGUuc3dpcGVFbmQ9ZnVuY3Rpb24oaSl7dmFyIGUsdCxvPXRoaXM7aWYoby5kcmFnZ2luZz0hMSxvLnN3aXBpbmc9ITEsby5zY3JvbGxpbmcpcmV0dXJuIG8uc2Nyb2xsaW5nPSExLCExO2lmKG8uaW50ZXJydXB0ZWQ9ITEsby5zaG91bGRDbGljaz0hKG8udG91Y2hPYmplY3Quc3dpcGVMZW5ndGg+MTApLHZvaWQgMD09PW8udG91Y2hPYmplY3QuY3VyWClyZXR1cm4hMTtpZighMD09PW8udG91Y2hPYmplY3QuZWRnZUhpdCYmby4kc2xpZGVyLnRyaWdnZXIoXCJlZGdlXCIsW28sby5zd2lwZURpcmVjdGlvbigpXSksby50b3VjaE9iamVjdC5zd2lwZUxlbmd0aD49by50b3VjaE9iamVjdC5taW5Td2lwZSl7c3dpdGNoKHQ9by5zd2lwZURpcmVjdGlvbigpKXtjYXNlXCJsZWZ0XCI6Y2FzZVwiZG93blwiOmU9by5vcHRpb25zLnN3aXBlVG9TbGlkZT9vLmNoZWNrTmF2aWdhYmxlKG8uY3VycmVudFNsaWRlK28uZ2V0U2xpZGVDb3VudCgpKTpvLmN1cnJlbnRTbGlkZStvLmdldFNsaWRlQ291bnQoKSxvLmN1cnJlbnREaXJlY3Rpb249MDticmVhaztjYXNlXCJyaWdodFwiOmNhc2VcInVwXCI6ZT1vLm9wdGlvbnMuc3dpcGVUb1NsaWRlP28uY2hlY2tOYXZpZ2FibGUoby5jdXJyZW50U2xpZGUtby5nZXRTbGlkZUNvdW50KCkpOm8uY3VycmVudFNsaWRlLW8uZ2V0U2xpZGVDb3VudCgpLG8uY3VycmVudERpcmVjdGlvbj0xfVwidmVydGljYWxcIiE9dCYmKG8uc2xpZGVIYW5kbGVyKGUpLG8udG91Y2hPYmplY3Q9e30sby4kc2xpZGVyLnRyaWdnZXIoXCJzd2lwZVwiLFtvLHRdKSl9ZWxzZSBvLnRvdWNoT2JqZWN0LnN0YXJ0WCE9PW8udG91Y2hPYmplY3QuY3VyWCYmKG8uc2xpZGVIYW5kbGVyKG8uY3VycmVudFNsaWRlKSxvLnRvdWNoT2JqZWN0PXt9KX0sZS5wcm90b3R5cGUuc3dpcGVIYW5kbGVyPWZ1bmN0aW9uKGkpe3ZhciBlPXRoaXM7aWYoISghMT09PWUub3B0aW9ucy5zd2lwZXx8XCJvbnRvdWNoZW5kXCJpbiBkb2N1bWVudCYmITE9PT1lLm9wdGlvbnMuc3dpcGV8fCExPT09ZS5vcHRpb25zLmRyYWdnYWJsZSYmLTEhPT1pLnR5cGUuaW5kZXhPZihcIm1vdXNlXCIpKSlzd2l0Y2goZS50b3VjaE9iamVjdC5maW5nZXJDb3VudD1pLm9yaWdpbmFsRXZlbnQmJnZvaWQgMCE9PWkub3JpZ2luYWxFdmVudC50b3VjaGVzP2kub3JpZ2luYWxFdmVudC50b3VjaGVzLmxlbmd0aDoxLGUudG91Y2hPYmplY3QubWluU3dpcGU9ZS5saXN0V2lkdGgvZS5vcHRpb25zLnRvdWNoVGhyZXNob2xkLCEwPT09ZS5vcHRpb25zLnZlcnRpY2FsU3dpcGluZyYmKGUudG91Y2hPYmplY3QubWluU3dpcGU9ZS5saXN0SGVpZ2h0L2Uub3B0aW9ucy50b3VjaFRocmVzaG9sZCksaS5kYXRhLmFjdGlvbil7Y2FzZVwic3RhcnRcIjplLnN3aXBlU3RhcnQoaSk7YnJlYWs7Y2FzZVwibW92ZVwiOmUuc3dpcGVNb3ZlKGkpO2JyZWFrO2Nhc2VcImVuZFwiOmUuc3dpcGVFbmQoaSl9fSxlLnByb3RvdHlwZS5zd2lwZU1vdmU9ZnVuY3Rpb24oaSl7dmFyIGUsdCxvLHMsbixyLGw9dGhpcztyZXR1cm4gbj12b2lkIDAhPT1pLm9yaWdpbmFsRXZlbnQ/aS5vcmlnaW5hbEV2ZW50LnRvdWNoZXM6bnVsbCwhKCFsLmRyYWdnaW5nfHxsLnNjcm9sbGluZ3x8biYmMSE9PW4ubGVuZ3RoKSYmKGU9bC5nZXRMZWZ0KGwuY3VycmVudFNsaWRlKSxsLnRvdWNoT2JqZWN0LmN1clg9dm9pZCAwIT09bj9uWzBdLnBhZ2VYOmkuY2xpZW50WCxsLnRvdWNoT2JqZWN0LmN1clk9dm9pZCAwIT09bj9uWzBdLnBhZ2VZOmkuY2xpZW50WSxsLnRvdWNoT2JqZWN0LnN3aXBlTGVuZ3RoPU1hdGgucm91bmQoTWF0aC5zcXJ0KE1hdGgucG93KGwudG91Y2hPYmplY3QuY3VyWC1sLnRvdWNoT2JqZWN0LnN0YXJ0WCwyKSkpLHI9TWF0aC5yb3VuZChNYXRoLnNxcnQoTWF0aC5wb3cobC50b3VjaE9iamVjdC5jdXJZLWwudG91Y2hPYmplY3Quc3RhcnRZLDIpKSksIWwub3B0aW9ucy52ZXJ0aWNhbFN3aXBpbmcmJiFsLnN3aXBpbmcmJnI+ND8obC5zY3JvbGxpbmc9ITAsITEpOighMD09PWwub3B0aW9ucy52ZXJ0aWNhbFN3aXBpbmcmJihsLnRvdWNoT2JqZWN0LnN3aXBlTGVuZ3RoPXIpLHQ9bC5zd2lwZURpcmVjdGlvbigpLHZvaWQgMCE9PWkub3JpZ2luYWxFdmVudCYmbC50b3VjaE9iamVjdC5zd2lwZUxlbmd0aD40JiYobC5zd2lwaW5nPSEwLGkucHJldmVudERlZmF1bHQoKSkscz0oITE9PT1sLm9wdGlvbnMucnRsPzE6LTEpKihsLnRvdWNoT2JqZWN0LmN1clg+bC50b3VjaE9iamVjdC5zdGFydFg/MTotMSksITA9PT1sLm9wdGlvbnMudmVydGljYWxTd2lwaW5nJiYocz1sLnRvdWNoT2JqZWN0LmN1clk+bC50b3VjaE9iamVjdC5zdGFydFk/MTotMSksbz1sLnRvdWNoT2JqZWN0LnN3aXBlTGVuZ3RoLGwudG91Y2hPYmplY3QuZWRnZUhpdD0hMSwhMT09PWwub3B0aW9ucy5pbmZpbml0ZSYmKDA9PT1sLmN1cnJlbnRTbGlkZSYmXCJyaWdodFwiPT09dHx8bC5jdXJyZW50U2xpZGU+PWwuZ2V0RG90Q291bnQoKSYmXCJsZWZ0XCI9PT10KSYmKG89bC50b3VjaE9iamVjdC5zd2lwZUxlbmd0aCpsLm9wdGlvbnMuZWRnZUZyaWN0aW9uLGwudG91Y2hPYmplY3QuZWRnZUhpdD0hMCksITE9PT1sLm9wdGlvbnMudmVydGljYWw/bC5zd2lwZUxlZnQ9ZStvKnM6bC5zd2lwZUxlZnQ9ZStvKihsLiRsaXN0LmhlaWdodCgpL2wubGlzdFdpZHRoKSpzLCEwPT09bC5vcHRpb25zLnZlcnRpY2FsU3dpcGluZyYmKGwuc3dpcGVMZWZ0PWUrbypzKSwhMCE9PWwub3B0aW9ucy5mYWRlJiYhMSE9PWwub3B0aW9ucy50b3VjaE1vdmUmJighMD09PWwuYW5pbWF0aW5nPyhsLnN3aXBlTGVmdD1udWxsLCExKTp2b2lkIGwuc2V0Q1NTKGwuc3dpcGVMZWZ0KSkpKX0sZS5wcm90b3R5cGUuc3dpcGVTdGFydD1mdW5jdGlvbihpKXt2YXIgZSx0PXRoaXM7aWYodC5pbnRlcnJ1cHRlZD0hMCwxIT09dC50b3VjaE9iamVjdC5maW5nZXJDb3VudHx8dC5zbGlkZUNvdW50PD10Lm9wdGlvbnMuc2xpZGVzVG9TaG93KXJldHVybiB0LnRvdWNoT2JqZWN0PXt9LCExO3ZvaWQgMCE9PWkub3JpZ2luYWxFdmVudCYmdm9pZCAwIT09aS5vcmlnaW5hbEV2ZW50LnRvdWNoZXMmJihlPWkub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdKSx0LnRvdWNoT2JqZWN0LnN0YXJ0WD10LnRvdWNoT2JqZWN0LmN1clg9dm9pZCAwIT09ZT9lLnBhZ2VYOmkuY2xpZW50WCx0LnRvdWNoT2JqZWN0LnN0YXJ0WT10LnRvdWNoT2JqZWN0LmN1clk9dm9pZCAwIT09ZT9lLnBhZ2VZOmkuY2xpZW50WSx0LmRyYWdnaW5nPSEwfSxlLnByb3RvdHlwZS51bmZpbHRlclNsaWRlcz1lLnByb3RvdHlwZS5zbGlja1VuZmlsdGVyPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztudWxsIT09aS4kc2xpZGVzQ2FjaGUmJihpLnVubG9hZCgpLGkuJHNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKS5kZXRhY2goKSxpLiRzbGlkZXNDYWNoZS5hcHBlbmRUbyhpLiRzbGlkZVRyYWNrKSxpLnJlaW5pdCgpKX0sZS5wcm90b3R5cGUudW5sb2FkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpKFwiLnNsaWNrLWNsb25lZFwiLGUuJHNsaWRlcikucmVtb3ZlKCksZS4kZG90cyYmZS4kZG90cy5yZW1vdmUoKSxlLiRwcmV2QXJyb3cmJmUuaHRtbEV4cHIudGVzdChlLm9wdGlvbnMucHJldkFycm93KSYmZS4kcHJldkFycm93LnJlbW92ZSgpLGUuJG5leHRBcnJvdyYmZS5odG1sRXhwci50ZXN0KGUub3B0aW9ucy5uZXh0QXJyb3cpJiZlLiRuZXh0QXJyb3cucmVtb3ZlKCksZS4kc2xpZGVzLnJlbW92ZUNsYXNzKFwic2xpY2stc2xpZGUgc2xpY2stYWN0aXZlIHNsaWNrLXZpc2libGUgc2xpY2stY3VycmVudFwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIikuY3NzKFwid2lkdGhcIixcIlwiKX0sZS5wcm90b3R5cGUudW5zbGljaz1mdW5jdGlvbihpKXt2YXIgZT10aGlzO2UuJHNsaWRlci50cmlnZ2VyKFwidW5zbGlja1wiLFtlLGldKSxlLmRlc3Ryb3koKX0sZS5wcm90b3R5cGUudXBkYXRlQXJyb3dzPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztNYXRoLmZsb29yKGkub3B0aW9ucy5zbGlkZXNUb1Nob3cvMiksITA9PT1pLm9wdGlvbnMuYXJyb3dzJiZpLnNsaWRlQ291bnQ+aS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmIWkub3B0aW9ucy5pbmZpbml0ZSYmKGkuJHByZXZBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWRpc2FibGVkXCIpLmF0dHIoXCJhcmlhLWRpc2FibGVkXCIsXCJmYWxzZVwiKSxpLiRuZXh0QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwiZmFsc2VcIiksMD09PWkuY3VycmVudFNsaWRlPyhpLiRwcmV2QXJyb3cuYWRkQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwidHJ1ZVwiKSxpLiRuZXh0QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwiZmFsc2VcIikpOmkuY3VycmVudFNsaWRlPj1pLnNsaWRlQ291bnQtaS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmITE9PT1pLm9wdGlvbnMuY2VudGVyTW9kZT8oaS4kbmV4dEFycm93LmFkZENsYXNzKFwic2xpY2stZGlzYWJsZWRcIikuYXR0cihcImFyaWEtZGlzYWJsZWRcIixcInRydWVcIiksaS4kcHJldkFycm93LnJlbW92ZUNsYXNzKFwic2xpY2stZGlzYWJsZWRcIikuYXR0cihcImFyaWEtZGlzYWJsZWRcIixcImZhbHNlXCIpKTppLmN1cnJlbnRTbGlkZT49aS5zbGlkZUNvdW50LTEmJiEwPT09aS5vcHRpb25zLmNlbnRlck1vZGUmJihpLiRuZXh0QXJyb3cuYWRkQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwidHJ1ZVwiKSxpLiRwcmV2QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwiZmFsc2VcIikpKX0sZS5wcm90b3R5cGUudXBkYXRlRG90cz1mdW5jdGlvbigpe3ZhciBpPXRoaXM7bnVsbCE9PWkuJGRvdHMmJihpLiRkb3RzLmZpbmQoXCJsaVwiKS5yZW1vdmVDbGFzcyhcInNsaWNrLWFjdGl2ZVwiKS5lbmQoKSxpLiRkb3RzLmZpbmQoXCJsaVwiKS5lcShNYXRoLmZsb29yKGkuY3VycmVudFNsaWRlL2kub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCkpLmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpKX0sZS5wcm90b3R5cGUudmlzaWJpbGl0eT1mdW5jdGlvbigpe3ZhciBpPXRoaXM7aS5vcHRpb25zLmF1dG9wbGF5JiYoZG9jdW1lbnRbaS5oaWRkZW5dP2kuaW50ZXJydXB0ZWQ9ITA6aS5pbnRlcnJ1cHRlZD0hMSl9LGkuZm4uc2xpY2s9ZnVuY3Rpb24oKXt2YXIgaSx0LG89dGhpcyxzPWFyZ3VtZW50c1swXSxuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxyPW8ubGVuZ3RoO2ZvcihpPTA7aTxyO2krKylpZihcIm9iamVjdFwiPT10eXBlb2Ygc3x8dm9pZCAwPT09cz9vW2ldLnNsaWNrPW5ldyBlKG9baV0scyk6dD1vW2ldLnNsaWNrW3NdLmFwcGx5KG9baV0uc2xpY2ssbiksdm9pZCAwIT09dClyZXR1cm4gdDtyZXR1cm4gb319KTtcbiIsIi8qKlxuICogU1ZHSW5qZWN0b3IgdjEuMS4zIC0gRmFzdCwgY2FjaGluZywgZHluYW1pYyBpbmxpbmUgU1ZHIERPTSBpbmplY3Rpb24gbGlicmFyeVxuICogaHR0cHM6Ly9naXRodWIuY29tL2ljb25pYy9TVkdJbmplY3RvclxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFdheWJ1cnkgPGhlbGxvQHdheWJ1cnkuY29tPlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cbiFmdW5jdGlvbih0LGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHIodCl7dD10LnNwbGl0KFwiIFwiKTtmb3IodmFyIGU9e30scj10Lmxlbmd0aCxuPVtdO3ItLTspZS5oYXNPd25Qcm9wZXJ0eSh0W3JdKXx8KGVbdFtyXV09MSxuLnVuc2hpZnQodFtyXSkpO3JldHVybiBuLmpvaW4oXCIgXCIpfXZhciBuPVwiZmlsZTpcIj09PXQubG9jYXRpb24ucHJvdG9jb2wsaT1lLmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoXCJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0Jhc2ljU3RydWN0dXJlXCIsXCIxLjFcIiksbz1BcnJheS5wcm90b3R5cGUuZm9yRWFjaHx8ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT10aGlzfHxudWxsPT09dGhpc3x8XCJmdW5jdGlvblwiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yO3ZhciByLG49dGhpcy5sZW5ndGg+Pj4wO2ZvcihyPTA7bj5yOysrcilyIGluIHRoaXMmJnQuY2FsbChlLHRoaXNbcl0scix0aGlzKX0sYT17fSxsPTAscz1bXSx1PVtdLGM9e30sZj1mdW5jdGlvbih0KXtyZXR1cm4gdC5jbG9uZU5vZGUoITApfSxwPWZ1bmN0aW9uKHQsZSl7dVt0XT11W3RdfHxbXSx1W3RdLnB1c2goZSl9LGQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAscj11W3RdLmxlbmd0aDtyPmU7ZSsrKSFmdW5jdGlvbihlKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dVt0XVtlXShmKGFbdF0pKX0sMCl9KGUpfSx2PWZ1bmN0aW9uKGUscil7aWYodm9pZCAwIT09YVtlXSlhW2VdaW5zdGFuY2VvZiBTVkdTVkdFbGVtZW50P3IoZihhW2VdKSk6cChlLHIpO2Vsc2V7aWYoIXQuWE1MSHR0cFJlcXVlc3QpcmV0dXJuIHIoXCJCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgWE1MSHR0cFJlcXVlc3RcIiksITE7YVtlXT17fSxwKGUscik7dmFyIGk9bmV3IFhNTEh0dHBSZXF1ZXN0O2kub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoND09PWkucmVhZHlTdGF0ZSl7aWYoNDA0PT09aS5zdGF0dXN8fG51bGw9PT1pLnJlc3BvbnNlWE1MKXJldHVybiByKFwiVW5hYmxlIHRvIGxvYWQgU1ZHIGZpbGU6IFwiK2UpLG4mJnIoXCJOb3RlOiBTVkcgaW5qZWN0aW9uIGFqYXggY2FsbHMgZG8gbm90IHdvcmsgbG9jYWxseSB3aXRob3V0IGFkanVzdGluZyBzZWN1cml0eSBzZXR0aW5nIGluIHlvdXIgYnJvd3Nlci4gT3IgY29uc2lkZXIgdXNpbmcgYSBsb2NhbCB3ZWJzZXJ2ZXIuXCIpLHIoKSwhMTtpZighKDIwMD09PWkuc3RhdHVzfHxuJiYwPT09aS5zdGF0dXMpKXJldHVybiByKFwiVGhlcmUgd2FzIGEgcHJvYmxlbSBpbmplY3RpbmcgdGhlIFNWRzogXCIraS5zdGF0dXMrXCIgXCIraS5zdGF0dXNUZXh0KSwhMTtpZihpLnJlc3BvbnNlWE1MIGluc3RhbmNlb2YgRG9jdW1lbnQpYVtlXT1pLnJlc3BvbnNlWE1MLmRvY3VtZW50RWxlbWVudDtlbHNlIGlmKERPTVBhcnNlciYmRE9NUGFyc2VyIGluc3RhbmNlb2YgRnVuY3Rpb24pe3ZhciB0O3RyeXt2YXIgbz1uZXcgRE9NUGFyc2VyO3Q9by5wYXJzZUZyb21TdHJpbmcoaS5yZXNwb25zZVRleHQsXCJ0ZXh0L3htbFwiKX1jYXRjaChsKXt0PXZvaWQgMH1pZighdHx8dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInBhcnNlcmVycm9yXCIpLmxlbmd0aClyZXR1cm4gcihcIlVuYWJsZSB0byBwYXJzZSBTVkcgZmlsZTogXCIrZSksITE7YVtlXT10LmRvY3VtZW50RWxlbWVudH1kKGUpfX0saS5vcGVuKFwiR0VUXCIsZSksaS5vdmVycmlkZU1pbWVUeXBlJiZpLm92ZXJyaWRlTWltZVR5cGUoXCJ0ZXh0L3htbFwiKSxpLnNlbmQoKX19LGg9ZnVuY3Rpb24oZSxuLGEsdSl7dmFyIGY9ZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXNyY1wiKXx8ZS5nZXRBdHRyaWJ1dGUoXCJzcmNcIik7aWYoIS9cXC5zdmcvaS50ZXN0KGYpKXJldHVybiB2b2lkIHUoXCJBdHRlbXB0ZWQgdG8gaW5qZWN0IGEgZmlsZSB3aXRoIGEgbm9uLXN2ZyBleHRlbnNpb246IFwiK2YpO2lmKCFpKXt2YXIgcD1lLmdldEF0dHJpYnV0ZShcImRhdGEtZmFsbGJhY2tcIil8fGUuZ2V0QXR0cmlidXRlKFwiZGF0YS1wbmdcIik7cmV0dXJuIHZvaWQocD8oZS5zZXRBdHRyaWJ1dGUoXCJzcmNcIixwKSx1KG51bGwpKTphPyhlLnNldEF0dHJpYnV0ZShcInNyY1wiLGErXCIvXCIrZi5zcGxpdChcIi9cIikucG9wKCkucmVwbGFjZShcIi5zdmdcIixcIi5wbmdcIikpLHUobnVsbCkpOnUoXCJUaGlzIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBTVkcgYW5kIG5vIFBORyBmYWxsYmFjayB3YXMgZGVmaW5lZC5cIikpfS0xPT09cy5pbmRleE9mKGUpJiYocy5wdXNoKGUpLGUuc2V0QXR0cmlidXRlKFwic3JjXCIsXCJcIiksdihmLGZ1bmN0aW9uKGkpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBpfHxcInN0cmluZ1wiPT10eXBlb2YgaSlyZXR1cm4gdShpKSwhMTt2YXIgYT1lLmdldEF0dHJpYnV0ZShcImlkXCIpO2EmJmkuc2V0QXR0cmlidXRlKFwiaWRcIixhKTt2YXIgcD1lLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpO3AmJmkuc2V0QXR0cmlidXRlKFwidGl0bGVcIixwKTt2YXIgZD1bXS5jb25jYXQoaS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKXx8W10sXCJpbmplY3RlZC1zdmdcIixlLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpfHxbXSkuam9pbihcIiBcIik7aS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLHIoZCkpO3ZhciB2PWUuZ2V0QXR0cmlidXRlKFwic3R5bGVcIik7diYmaS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLHYpO3ZhciBoPVtdLmZpbHRlci5jYWxsKGUuYXR0cmlidXRlcyxmdW5jdGlvbih0KXtyZXR1cm4vXmRhdGEtXFx3W1xcd1xcLV0qJC8udGVzdCh0Lm5hbWUpfSk7by5jYWxsKGgsZnVuY3Rpb24odCl7dC5uYW1lJiZ0LnZhbHVlJiZpLnNldEF0dHJpYnV0ZSh0Lm5hbWUsdC52YWx1ZSl9KTt2YXIgZyxtLGIseSxBLHc9e2NsaXBQYXRoOltcImNsaXAtcGF0aFwiXSxcImNvbG9yLXByb2ZpbGVcIjpbXCJjb2xvci1wcm9maWxlXCJdLGN1cnNvcjpbXCJjdXJzb3JcIl0sZmlsdGVyOltcImZpbHRlclwiXSxsaW5lYXJHcmFkaWVudDpbXCJmaWxsXCIsXCJzdHJva2VcIl0sbWFya2VyOltcIm1hcmtlclwiLFwibWFya2VyLXN0YXJ0XCIsXCJtYXJrZXItbWlkXCIsXCJtYXJrZXItZW5kXCJdLG1hc2s6W1wibWFza1wiXSxwYXR0ZXJuOltcImZpbGxcIixcInN0cm9rZVwiXSxyYWRpYWxHcmFkaWVudDpbXCJmaWxsXCIsXCJzdHJva2VcIl19O09iamVjdC5rZXlzKHcpLmZvckVhY2goZnVuY3Rpb24odCl7Zz10LGI9d1t0XSxtPWkucXVlcnlTZWxlY3RvckFsbChcImRlZnMgXCIrZytcIltpZF1cIik7Zm9yKHZhciBlPTAscj1tLmxlbmd0aDtyPmU7ZSsrKXt5PW1bZV0uaWQsQT15K1wiLVwiK2w7dmFyIG47by5jYWxsKGIsZnVuY3Rpb24odCl7bj1pLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbXCIrdCsnKj1cIicreSsnXCJdJyk7Zm9yKHZhciBlPTAscj1uLmxlbmd0aDtyPmU7ZSsrKW5bZV0uc2V0QXR0cmlidXRlKHQsXCJ1cmwoI1wiK0ErXCIpXCIpfSksbVtlXS5pZD1BfX0pLGkucmVtb3ZlQXR0cmlidXRlKFwieG1sbnM6YVwiKTtmb3IodmFyIHgsUyxrPWkucXVlcnlTZWxlY3RvckFsbChcInNjcmlwdFwiKSxqPVtdLEc9MCxUPWsubGVuZ3RoO1Q+RztHKyspUz1rW0ddLmdldEF0dHJpYnV0ZShcInR5cGVcIiksUyYmXCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0XCIhPT1TJiZcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiE9PVN8fCh4PWtbR10uaW5uZXJUZXh0fHxrW0ddLnRleHRDb250ZW50LGoucHVzaCh4KSxpLnJlbW92ZUNoaWxkKGtbR10pKTtpZihqLmxlbmd0aD4wJiYoXCJhbHdheXNcIj09PW58fFwib25jZVwiPT09biYmIWNbZl0pKXtmb3IodmFyIE09MCxWPWoubGVuZ3RoO1Y+TTtNKyspbmV3IEZ1bmN0aW9uKGpbTV0pKHQpO2NbZl09ITB9dmFyIEU9aS5xdWVyeVNlbGVjdG9yQWxsKFwic3R5bGVcIik7by5jYWxsKEUsZnVuY3Rpb24odCl7dC50ZXh0Q29udGVudCs9XCJcIn0pLGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaSxlKSxkZWxldGUgc1tzLmluZGV4T2YoZSldLGU9bnVsbCxsKyssdShpKX0pKX0sZz1mdW5jdGlvbih0LGUscil7ZT1lfHx7fTt2YXIgbj1lLmV2YWxTY3JpcHRzfHxcImFsd2F5c1wiLGk9ZS5wbmdGYWxsYmFja3x8ITEsYT1lLmVhY2g7aWYodm9pZCAwIT09dC5sZW5ndGgpe3ZhciBsPTA7by5jYWxsKHQsZnVuY3Rpb24oZSl7aChlLG4saSxmdW5jdGlvbihlKXthJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhJiZhKGUpLHImJnQubGVuZ3RoPT09KytsJiZyKGwpfSl9KX1lbHNlIHQ/aCh0LG4saSxmdW5jdGlvbihlKXthJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhJiZhKGUpLHImJnIoMSksdD1udWxsfSk6ciYmcigwKX07XCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWV4cG9ydHM9ZzpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKGZ1bmN0aW9uKCl7cmV0dXJuIGd9KTpcIm9iamVjdFwiPT10eXBlb2YgdCYmKHQuU1ZHSW5qZWN0b3I9Zyl9KHdpbmRvdyxkb2N1bWVudCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdmctaW5qZWN0b3IubWFwLmpzIiwiIWZ1bmN0aW9uKHQsZSl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZSgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZSk6KHQ9dHx8c2VsZikuU3dlZXRhbGVydDI9ZSgpfSh0aGlzLGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gcih0KXtyZXR1cm4ocj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9ZnVuY3Rpb24gYSh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gbyh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbz1lW25dO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19ZnVuY3Rpb24gYyh0LGUsbil7cmV0dXJuIGUmJm8odC5wcm90b3R5cGUsZSksbiYmbyh0LG4pLHR9ZnVuY3Rpb24gcygpe3JldHVybihzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPWFyZ3VtZW50c1tlXTtmb3IodmFyIG8gaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixvKSYmKHRbb109bltvXSl9cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gdSh0KXtyZXR1cm4odT1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9ZnVuY3Rpb24gbCh0LGUpe3JldHVybihsPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5fX3Byb3RvX189ZSx0fSkodCxlKX1mdW5jdGlvbiBkKCl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX1mdW5jdGlvbiBpKHQsZSxuKXtyZXR1cm4oaT1kKCk/UmVmbGVjdC5jb25zdHJ1Y3Q6ZnVuY3Rpb24odCxlLG4pe3ZhciBvPVtudWxsXTtvLnB1c2guYXBwbHkobyxlKTt2YXIgaT1uZXcoRnVuY3Rpb24uYmluZC5hcHBseSh0LG8pKTtyZXR1cm4gbiYmbChpLG4ucHJvdG90eXBlKSxpfSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfWZ1bmN0aW9uIHAodCxlKXtyZXR1cm4hZXx8XCJvYmplY3RcIiE9dHlwZW9mIGUmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGU/ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7cmV0dXJuIHR9KHQpOmV9ZnVuY3Rpb24gZih0LGUsbil7cmV0dXJuKGY9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFJlZmxlY3QmJlJlZmxlY3QuZ2V0P1JlZmxlY3QuZ2V0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgbz1mdW5jdGlvbih0LGUpe2Zvcig7IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpJiZudWxsIT09KHQ9dSh0KSk7KTtyZXR1cm4gdH0odCxlKTtpZihvKXt2YXIgaT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sZSk7cmV0dXJuIGkuZ2V0P2kuZ2V0LmNhbGwobik6aS52YWx1ZX19KSh0LGUsbnx8dCl9ZnVuY3Rpb24gbShlKXtyZXR1cm4gT2JqZWN0LmtleXMoZSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfSl9ZnVuY3Rpb24gaCh0KXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCl9ZnVuY3Rpb24gZyh0LGUpe3ZhciBuO249J1wiJy5jb25jYXQodCwnXCIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuIFBsZWFzZSB1c2UgXCInKS5jb25jYXQoZSwnXCIgaW5zdGVhZC4nKSwtMT09PXouaW5kZXhPZihuKSYmKHoucHVzaChuKSxfKG4pKX1mdW5jdGlvbiB2KHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiB0LnRvUHJvbWlzZX1mdW5jdGlvbiBiKHQpe3JldHVybiB2KHQpP3QudG9Qcm9taXNlKCk6UHJvbWlzZS5yZXNvbHZlKHQpfWZ1bmN0aW9uIHkodCl7cmV0dXJuIHQmJlByb21pc2UucmVzb2x2ZSh0KT09PXR9ZnVuY3Rpb24gdyh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEVsZW1lbnR8fFwib2JqZWN0XCI9PT1yKGU9dCkmJmUuanF1ZXJ5O3ZhciBlfWZ1bmN0aW9uIHQodCl7dmFyIGU9e307Zm9yKHZhciBuIGluIHQpZVt0W25dXT1cInN3YWwyLVwiK3Rbbl07cmV0dXJuIGV9ZnVuY3Rpb24gQyh0KXt2YXIgZT1RKCk7cmV0dXJuIGU/ZS5xdWVyeVNlbGVjdG9yKHQpOm51bGx9ZnVuY3Rpb24gZSh0KXtyZXR1cm4gQyhcIi5cIi5jb25jYXQodCkpfWZ1bmN0aW9uIG4oKXt2YXIgdD0kKCk7cmV0dXJuIGgodC5xdWVyeVNlbGVjdG9yQWxsKFwiLlwiLmNvbmNhdChZLmljb24pKSl9ZnVuY3Rpb24gaygpe3ZhciB0PW4oKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHZ0KHQpfSk7cmV0dXJuIHQubGVuZ3RoP3RbMF06bnVsbH1mdW5jdGlvbiB4KCl7cmV0dXJuIGUoWS50aXRsZSl9ZnVuY3Rpb24gUCgpe3JldHVybiBlKFkuY29udGVudCl9ZnVuY3Rpb24gQSgpe3JldHVybiBlKFkuaW1hZ2UpfWZ1bmN0aW9uIEIoKXtyZXR1cm4gZShZW1wicHJvZ3Jlc3Mtc3RlcHNcIl0pfWZ1bmN0aW9uIFMoKXtyZXR1cm4gZShZW1widmFsaWRhdGlvbi1tZXNzYWdlXCJdKX1mdW5jdGlvbiBFKCl7cmV0dXJuIEMoXCIuXCIuY29uY2F0KFkuYWN0aW9ucyxcIiAuXCIpLmNvbmNhdChZLmNvbmZpcm0pKX1mdW5jdGlvbiBPKCl7cmV0dXJuIEMoXCIuXCIuY29uY2F0KFkuYWN0aW9ucyxcIiAuXCIpLmNvbmNhdChZLmNhbmNlbCkpfWZ1bmN0aW9uIFQoKXtyZXR1cm4gZShZLmFjdGlvbnMpfWZ1bmN0aW9uIEwoKXtyZXR1cm4gZShZLmhlYWRlcil9ZnVuY3Rpb24gSSgpe3JldHVybiBlKFkuZm9vdGVyKX1mdW5jdGlvbiBqKCl7cmV0dXJuIGUoWVtcInRpbWVyLXByb2dyZXNzLWJhclwiXSl9ZnVuY3Rpb24gcSgpe3JldHVybiBlKFkuY2xvc2UpfWZ1bmN0aW9uIFYoKXt2YXIgdD1oKCQoKS5xdWVyeVNlbGVjdG9yQWxsKCdbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9XCItMVwiXSk6bm90KFt0YWJpbmRleD1cIjBcIl0pJykpLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdD1wYXJzZUludCh0LmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKSwoZT1wYXJzZUludChlLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKSk8dD8xOnQ8ZT8tMTowfSksZT1oKCQoKS5xdWVyeVNlbGVjdG9yQWxsKCdcXG4gIGFbaHJlZl0sXFxuICBhcmVhW2hyZWZdLFxcbiAgaW5wdXQ6bm90KFtkaXNhYmxlZF0pLFxcbiAgc2VsZWN0Om5vdChbZGlzYWJsZWRdKSxcXG4gIHRleHRhcmVhOm5vdChbZGlzYWJsZWRdKSxcXG4gIGJ1dHRvbjpub3QoW2Rpc2FibGVkXSksXFxuICBpZnJhbWUsXFxuICBvYmplY3QsXFxuICBlbWJlZCxcXG4gIFt0YWJpbmRleD1cIjBcIl0sXFxuICBbY29udGVudGVkaXRhYmxlXSxcXG4gIGF1ZGlvW2NvbnRyb2xzXSxcXG4gIHZpZGVvW2NvbnRyb2xzXSxcXG4gIHN1bW1hcnlcXG4nKSkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVyblwiLTFcIiE9PXQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIil9KTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPHQubGVuZ3RoO24rKyktMT09PWUuaW5kZXhPZih0W25dKSYmZS5wdXNoKHRbbl0pO3JldHVybiBlfSh0LmNvbmNhdChlKSkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB2dCh0KX0pfWZ1bmN0aW9uIE0oKXtyZXR1cm4hSigpJiYhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoWVtcIm5vLWJhY2tkcm9wXCJdKX1mdW5jdGlvbiBSKCl7cmV0dXJuICQoKS5oYXNBdHRyaWJ1dGUoXCJkYXRhLWxvYWRpbmdcIil9ZnVuY3Rpb24gSChlLHQpe3ZhciBuO2UudGV4dENvbnRlbnQ9XCJcIix0JiYobj0obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHQsXCJ0ZXh0L2h0bWxcIiksaChuLnF1ZXJ5U2VsZWN0b3IoXCJoZWFkXCIpLmNoaWxkTm9kZXMpLmZvckVhY2goZnVuY3Rpb24odCl7ZS5hcHBlbmRDaGlsZCh0KX0pLGgobi5xdWVyeVNlbGVjdG9yKFwiYm9keVwiKS5jaGlsZE5vZGVzKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UuYXBwZW5kQ2hpbGQodCl9KSl9ZnVuY3Rpb24gRCh0LGUpe2lmKGUpe2Zvcih2YXIgbj1lLnNwbGl0KC9cXHMrLyksbz0wO288bi5sZW5ndGg7bysrKWlmKCF0LmNsYXNzTGlzdC5jb250YWlucyhuW29dKSlyZXR1cm47cmV0dXJuIDF9fWZ1bmN0aW9uIE4odCxlLG4pe3ZhciBvLGk7aWYoaT1lLGgoKG89dCkuY2xhc3NMaXN0KS5mb3JFYWNoKGZ1bmN0aW9uKHQpey0xPT09bShZKS5pbmRleE9mKHQpJiYtMT09PW0oWikuaW5kZXhPZih0KSYmLTE9PT1tKGkuc2hvd0NsYXNzKS5pbmRleE9mKHQpJiZvLmNsYXNzTGlzdC5yZW1vdmUodCl9KSxlLmN1c3RvbUNsYXNzJiZlLmN1c3RvbUNsYXNzW25dKXtpZihcInN0cmluZ1wiIT10eXBlb2YgZS5jdXN0b21DbGFzc1tuXSYmIWUuY3VzdG9tQ2xhc3Nbbl0uZm9yRWFjaClyZXR1cm4gXyhcIkludmFsaWQgdHlwZSBvZiBjdXN0b21DbGFzcy5cIi5jb25jYXQobiwnISBFeHBlY3RlZCBzdHJpbmcgb3IgaXRlcmFibGUgb2JqZWN0LCBnb3QgXCInKS5jb25jYXQocihlLmN1c3RvbUNsYXNzW25dKSwnXCInKSk7bXQodCxlLmN1c3RvbUNsYXNzW25dKX19dmFyIFU9XCJTd2VldEFsZXJ0MjpcIixfPWZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybihcIlwiLmNvbmNhdChVLFwiIFwiKS5jb25jYXQodCkpfSxGPWZ1bmN0aW9uKHQpe2NvbnNvbGUuZXJyb3IoXCJcIi5jb25jYXQoVSxcIiBcIikuY29uY2F0KHQpKX0sej1bXSxXPWZ1bmN0aW9uKHQpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/dCgpOnR9LEs9T2JqZWN0LmZyZWV6ZSh7Y2FuY2VsOlwiY2FuY2VsXCIsYmFja2Ryb3A6XCJiYWNrZHJvcFwiLGNsb3NlOlwiY2xvc2VcIixlc2M6XCJlc2NcIix0aW1lcjpcInRpbWVyXCJ9KSxZPXQoW1wiY29udGFpbmVyXCIsXCJzaG93blwiLFwiaGVpZ2h0LWF1dG9cIixcImlvc2ZpeFwiLFwicG9wdXBcIixcIm1vZGFsXCIsXCJuby1iYWNrZHJvcFwiLFwibm8tdHJhbnNpdGlvblwiLFwidG9hc3RcIixcInRvYXN0LXNob3duXCIsXCJ0b2FzdC1jb2x1bW5cIixcInNob3dcIixcImhpZGVcIixcImNsb3NlXCIsXCJ0aXRsZVwiLFwiaGVhZGVyXCIsXCJjb250ZW50XCIsXCJodG1sLWNvbnRhaW5lclwiLFwiYWN0aW9uc1wiLFwiY29uZmlybVwiLFwiY2FuY2VsXCIsXCJmb290ZXJcIixcImljb25cIixcImljb24tY29udGVudFwiLFwiaW1hZ2VcIixcImlucHV0XCIsXCJmaWxlXCIsXCJyYW5nZVwiLFwic2VsZWN0XCIsXCJyYWRpb1wiLFwiY2hlY2tib3hcIixcImxhYmVsXCIsXCJ0ZXh0YXJlYVwiLFwiaW5wdXRlcnJvclwiLFwidmFsaWRhdGlvbi1tZXNzYWdlXCIsXCJwcm9ncmVzcy1zdGVwc1wiLFwiYWN0aXZlLXByb2dyZXNzLXN0ZXBcIixcInByb2dyZXNzLXN0ZXBcIixcInByb2dyZXNzLXN0ZXAtbGluZVwiLFwibG9hZGluZ1wiLFwic3R5bGVkXCIsXCJ0b3BcIixcInRvcC1zdGFydFwiLFwidG9wLWVuZFwiLFwidG9wLWxlZnRcIixcInRvcC1yaWdodFwiLFwiY2VudGVyXCIsXCJjZW50ZXItc3RhcnRcIixcImNlbnRlci1lbmRcIixcImNlbnRlci1sZWZ0XCIsXCJjZW50ZXItcmlnaHRcIixcImJvdHRvbVwiLFwiYm90dG9tLXN0YXJ0XCIsXCJib3R0b20tZW5kXCIsXCJib3R0b20tbGVmdFwiLFwiYm90dG9tLXJpZ2h0XCIsXCJncm93LXJvd1wiLFwiZ3Jvdy1jb2x1bW5cIixcImdyb3ctZnVsbHNjcmVlblwiLFwicnRsXCIsXCJ0aW1lci1wcm9ncmVzcy1iYXJcIixcInRpbWVyLXByb2dyZXNzLWJhci1jb250YWluZXJcIixcInNjcm9sbGJhci1tZWFzdXJlXCIsXCJpY29uLXN1Y2Nlc3NcIixcImljb24td2FybmluZ1wiLFwiaWNvbi1pbmZvXCIsXCJpY29uLXF1ZXN0aW9uXCIsXCJpY29uLWVycm9yXCJdKSxaPXQoW1wic3VjY2Vzc1wiLFwid2FybmluZ1wiLFwiaW5mb1wiLFwicXVlc3Rpb25cIixcImVycm9yXCJdKSxRPWZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcihcIi5cIi5jb25jYXQoWS5jb250YWluZXIpKX0sJD1mdW5jdGlvbigpe3JldHVybiBlKFkucG9wdXApfSxKPWZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKFlbXCJ0b2FzdC1zaG93blwiXSl9LFg9e3ByZXZpb3VzQm9keVBhZGRpbmc6bnVsbH07ZnVuY3Rpb24gRyh0LGUpe2lmKCFlKXJldHVybiBudWxsO3N3aXRjaChlKXtjYXNlXCJzZWxlY3RcIjpjYXNlXCJ0ZXh0YXJlYVwiOmNhc2VcImZpbGVcIjpyZXR1cm4gZ3QodCxZW2VdKTtjYXNlXCJjaGVja2JveFwiOnJldHVybiB0LnF1ZXJ5U2VsZWN0b3IoXCIuXCIuY29uY2F0KFkuY2hlY2tib3gsXCIgaW5wdXRcIikpO2Nhc2VcInJhZGlvXCI6cmV0dXJuIHQucXVlcnlTZWxlY3RvcihcIi5cIi5jb25jYXQoWS5yYWRpbyxcIiBpbnB1dDpjaGVja2VkXCIpKXx8dC5xdWVyeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChZLnJhZGlvLFwiIGlucHV0OmZpcnN0LWNoaWxkXCIpKTtjYXNlXCJyYW5nZVwiOnJldHVybiB0LnF1ZXJ5U2VsZWN0b3IoXCIuXCIuY29uY2F0KFkucmFuZ2UsXCIgaW5wdXRcIikpO2RlZmF1bHQ6cmV0dXJuIGd0KHQsWS5pbnB1dCl9fWZ1bmN0aW9uIHR0KHQpe3ZhciBlO3QuZm9jdXMoKSxcImZpbGVcIiE9PXQudHlwZSYmKGU9dC52YWx1ZSx0LnZhbHVlPVwiXCIsdC52YWx1ZT1lKX1mdW5jdGlvbiBldCh0LGUsbil7dCYmZSYmKFwic3RyaW5nXCI9PXR5cGVvZiBlJiYoZT1lLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pKSxlLmZvckVhY2goZnVuY3Rpb24oZSl7dC5mb3JFYWNoP3QuZm9yRWFjaChmdW5jdGlvbih0KXtuP3QuY2xhc3NMaXN0LmFkZChlKTp0LmNsYXNzTGlzdC5yZW1vdmUoZSl9KTpuP3QuY2xhc3NMaXN0LmFkZChlKTp0LmNsYXNzTGlzdC5yZW1vdmUoZSl9KSl9ZnVuY3Rpb24gbnQodCxlLG4pe258fDA9PT1wYXJzZUludChuKT90LnN0eWxlW2VdPVwibnVtYmVyXCI9PXR5cGVvZiBuP1wiXCIuY29uY2F0KG4sXCJweFwiKTpuOnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoZSl9ZnVuY3Rpb24gb3QodCxlKXt2YXIgbj0xPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWU/ZTpcImZsZXhcIjt0LnN0eWxlLm9wYWNpdHk9XCJcIix0LnN0eWxlLmRpc3BsYXk9bn1mdW5jdGlvbiBpdCh0KXt0LnN0eWxlLm9wYWNpdHk9XCJcIix0LnN0eWxlLmRpc3BsYXk9XCJub25lXCJ9ZnVuY3Rpb24gcnQodCxlLG4pe2U/b3QodCxuKTppdCh0KX1mdW5jdGlvbiBhdCh0KXtyZXR1cm4hISh0LnNjcm9sbEhlaWdodD50LmNsaWVudEhlaWdodCl9ZnVuY3Rpb24gY3QodCl7dmFyIGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUodCksbj1wYXJzZUZsb2F0KGUuZ2V0UHJvcGVydHlWYWx1ZShcImFuaW1hdGlvbi1kdXJhdGlvblwiKXx8XCIwXCIpLG89cGFyc2VGbG9hdChlLmdldFByb3BlcnR5VmFsdWUoXCJ0cmFuc2l0aW9uLWR1cmF0aW9uXCIpfHxcIjBcIik7cmV0dXJuIDA8bnx8MDxvfWZ1bmN0aW9uIHN0KHQsZSl7dmFyIG49MTxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1lJiZlLG89aigpO3Z0KG8pJiYobiYmKG8uc3R5bGUudHJhbnNpdGlvbj1cIm5vbmVcIixvLnN0eWxlLndpZHRoPVwiMTAwJVwiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7by5zdHlsZS50cmFuc2l0aW9uPVwid2lkdGggXCIuY29uY2F0KHQvMWUzLFwicyBsaW5lYXJcIiksby5zdHlsZS53aWR0aD1cIjAlXCJ9LDEwKSl9ZnVuY3Rpb24gdXQoKXtyZXR1cm5cInVuZGVmaW5lZFwiPT10eXBlb2Ygd2luZG93fHxcInVuZGVmaW5lZFwiPT10eXBlb2YgZG9jdW1lbnR9ZnVuY3Rpb24gbHQodCl7bG4uaXNWaXNpYmxlKCkmJmZ0IT09dC50YXJnZXQudmFsdWUmJmxuLnJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UoKSxmdD10LnRhcmdldC52YWx1ZX1mdW5jdGlvbiBkdCh0LGUpe3QgaW5zdGFuY2VvZiBIVE1MRWxlbWVudD9lLmFwcGVuZENoaWxkKHQpOlwib2JqZWN0XCI9PT1yKHQpP3d0KHQsZSk6dCYmSChlLHQpfWZ1bmN0aW9uIHB0KHQsZSl7dmFyIG49VCgpLG89RSgpLGk9TygpO2Uuc2hvd0NvbmZpcm1CdXR0b258fGUuc2hvd0NhbmNlbEJ1dHRvbnx8aXQobiksTihuLGUsXCJhY3Rpb25zXCIpLHh0KG8sXCJjb25maXJtXCIsZSkseHQoaSxcImNhbmNlbFwiLGUpLGUuYnV0dG9uc1N0eWxpbmc/ZnVuY3Rpb24odCxlLG4pe210KFt0LGVdLFkuc3R5bGVkKSxuLmNvbmZpcm1CdXR0b25Db2xvciYmKHQuc3R5bGUuYmFja2dyb3VuZENvbG9yPW4uY29uZmlybUJ1dHRvbkNvbG9yKTtuLmNhbmNlbEJ1dHRvbkNvbG9yJiYoZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9bi5jYW5jZWxCdXR0b25Db2xvcik7e3ZhciBvO1IoKXx8KG89d2luZG93LmdldENvbXB1dGVkU3R5bGUodCkuZ2V0UHJvcGVydHlWYWx1ZShcImJhY2tncm91bmQtY29sb3JcIiksdC5zdHlsZS5ib3JkZXJMZWZ0Q29sb3I9byx0LnN0eWxlLmJvcmRlclJpZ2h0Q29sb3I9byl9fShvLGksZSk6KGh0KFtvLGldLFkuc3R5bGVkKSxvLnN0eWxlLmJhY2tncm91bmRDb2xvcj1vLnN0eWxlLmJvcmRlckxlZnRDb2xvcj1vLnN0eWxlLmJvcmRlclJpZ2h0Q29sb3I9XCJcIixpLnN0eWxlLmJhY2tncm91bmRDb2xvcj1pLnN0eWxlLmJvcmRlckxlZnRDb2xvcj1pLnN0eWxlLmJvcmRlclJpZ2h0Q29sb3I9XCJcIiksZS5yZXZlcnNlQnV0dG9ucyYmby5wYXJlbnROb2RlLmluc2VydEJlZm9yZShpLG8pfXZhciBmdCxtdD1mdW5jdGlvbih0LGUpe2V0KHQsZSwhMCl9LGh0PWZ1bmN0aW9uKHQsZSl7ZXQodCxlLCExKX0sZ3Q9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHQuY2hpbGROb2Rlcy5sZW5ndGg7bisrKWlmKEQodC5jaGlsZE5vZGVzW25dLGUpKXJldHVybiB0LmNoaWxkTm9kZXNbbl19LHZ0PWZ1bmN0aW9uKHQpe3JldHVybiEoIXR8fCEodC5vZmZzZXRXaWR0aHx8dC5vZmZzZXRIZWlnaHR8fHQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpKX0sYnQ9J1xcbiA8ZGl2IGFyaWEtbGFiZWxsZWRieT1cIicuY29uY2F0KFkudGl0bGUsJ1wiIGFyaWEtZGVzY3JpYmVkYnk9XCInKS5jb25jYXQoWS5jb250ZW50LCdcIiBjbGFzcz1cIicpLmNvbmNhdChZLnBvcHVwLCdcIiB0YWJpbmRleD1cIi0xXCI+XFxuICAgPGRpdiBjbGFzcz1cIicpLmNvbmNhdChZLmhlYWRlciwnXCI+XFxuICAgICA8dWwgY2xhc3M9XCInKS5jb25jYXQoWVtcInByb2dyZXNzLXN0ZXBzXCJdLCdcIj48L3VsPlxcbiAgICAgPGRpdiBjbGFzcz1cIicpLmNvbmNhdChZLmljb24sXCIgXCIpLmNvbmNhdChaLmVycm9yLCdcIj48L2Rpdj5cXG4gICAgIDxkaXYgY2xhc3M9XCInKS5jb25jYXQoWS5pY29uLFwiIFwiKS5jb25jYXQoWi5xdWVzdGlvbiwnXCI+PC9kaXY+XFxuICAgICA8ZGl2IGNsYXNzPVwiJykuY29uY2F0KFkuaWNvbixcIiBcIikuY29uY2F0KFoud2FybmluZywnXCI+PC9kaXY+XFxuICAgICA8ZGl2IGNsYXNzPVwiJykuY29uY2F0KFkuaWNvbixcIiBcIikuY29uY2F0KFouaW5mbywnXCI+PC9kaXY+XFxuICAgICA8ZGl2IGNsYXNzPVwiJykuY29uY2F0KFkuaWNvbixcIiBcIikuY29uY2F0KFouc3VjY2VzcywnXCI+PC9kaXY+XFxuICAgICA8aW1nIGNsYXNzPVwiJykuY29uY2F0KFkuaW1hZ2UsJ1wiIC8+XFxuICAgICA8aDIgY2xhc3M9XCInKS5jb25jYXQoWS50aXRsZSwnXCIgaWQ9XCInKS5jb25jYXQoWS50aXRsZSwnXCI+PC9oMj5cXG4gICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiJykuY29uY2F0KFkuY2xvc2UsJ1wiPjwvYnV0dG9uPlxcbiAgIDwvZGl2PlxcbiAgIDxkaXYgY2xhc3M9XCInKS5jb25jYXQoWS5jb250ZW50LCdcIj5cXG4gICAgIDxkaXYgaWQ9XCInKS5jb25jYXQoWS5jb250ZW50LCdcIiBjbGFzcz1cIicpLmNvbmNhdChZW1wiaHRtbC1jb250YWluZXJcIl0sJ1wiPjwvZGl2PlxcbiAgICAgPGlucHV0IGNsYXNzPVwiJykuY29uY2F0KFkuaW5wdXQsJ1wiIC8+XFxuICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBjbGFzcz1cIicpLmNvbmNhdChZLmZpbGUsJ1wiIC8+XFxuICAgICA8ZGl2IGNsYXNzPVwiJykuY29uY2F0KFkucmFuZ2UsJ1wiPlxcbiAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgLz5cXG4gICAgICAgPG91dHB1dD48L291dHB1dD5cXG4gICAgIDwvZGl2PlxcbiAgICAgPHNlbGVjdCBjbGFzcz1cIicpLmNvbmNhdChZLnNlbGVjdCwnXCI+PC9zZWxlY3Q+XFxuICAgICA8ZGl2IGNsYXNzPVwiJykuY29uY2F0KFkucmFkaW8sJ1wiPjwvZGl2PlxcbiAgICAgPGxhYmVsIGZvcj1cIicpLmNvbmNhdChZLmNoZWNrYm94LCdcIiBjbGFzcz1cIicpLmNvbmNhdChZLmNoZWNrYm94LCdcIj5cXG4gICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIC8+XFxuICAgICAgIDxzcGFuIGNsYXNzPVwiJykuY29uY2F0KFkubGFiZWwsJ1wiPjwvc3Bhbj5cXG4gICAgIDwvbGFiZWw+XFxuICAgICA8dGV4dGFyZWEgY2xhc3M9XCInKS5jb25jYXQoWS50ZXh0YXJlYSwnXCI+PC90ZXh0YXJlYT5cXG4gICAgIDxkaXYgY2xhc3M9XCInKS5jb25jYXQoWVtcInZhbGlkYXRpb24tbWVzc2FnZVwiXSwnXCIgaWQ9XCInKS5jb25jYXQoWVtcInZhbGlkYXRpb24tbWVzc2FnZVwiXSwnXCI+PC9kaXY+XFxuICAgPC9kaXY+XFxuICAgPGRpdiBjbGFzcz1cIicpLmNvbmNhdChZLmFjdGlvbnMsJ1wiPlxcbiAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCInKS5jb25jYXQoWS5jb25maXJtLCdcIj5PSzwvYnV0dG9uPlxcbiAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCInKS5jb25jYXQoWS5jYW5jZWwsJ1wiPkNhbmNlbDwvYnV0dG9uPlxcbiAgIDwvZGl2PlxcbiAgIDxkaXYgY2xhc3M9XCInKS5jb25jYXQoWS5mb290ZXIsJ1wiPjwvZGl2PlxcbiAgIDxkaXYgY2xhc3M9XCInKS5jb25jYXQoWVtcInRpbWVyLXByb2dyZXNzLWJhci1jb250YWluZXJcIl0sJ1wiPlxcbiAgICAgPGRpdiBjbGFzcz1cIicpLmNvbmNhdChZW1widGltZXItcHJvZ3Jlc3MtYmFyXCJdLCdcIj48L2Rpdj5cXG4gICA8L2Rpdj5cXG4gPC9kaXY+XFxuJykucmVwbGFjZSgvKF58XFxuKVxccyovZyxcIlwiKSx5dD1mdW5jdGlvbih0KXt2YXIgZSxuLG8saSxyLGEsYyxzLHUsbCxkLHAsZixtLGgsZz0hIShlPVEoKSkmJihlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSksaHQoW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCxkb2N1bWVudC5ib2R5XSxbWVtcIm5vLWJhY2tkcm9wXCJdLFlbXCJ0b2FzdC1zaG93blwiXSxZW1wiaGFzLWNvbHVtblwiXV0pLCEwKTt1dCgpP0YoXCJTd2VldEFsZXJ0MiByZXF1aXJlcyBkb2N1bWVudCB0byBpbml0aWFsaXplXCIpOigobj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKS5jbGFzc05hbWU9WS5jb250YWluZXIsZyYmbXQobixZW1wibm8tdHJhbnNpdGlvblwiXSksSChuLGJ0KSwobz1cInN0cmluZ1wiPT10eXBlb2YoaT10LnRhcmdldCk/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihpKTppKS5hcHBlbmRDaGlsZChuKSxyPXQsKGE9JCgpKS5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsci50b2FzdD9cImFsZXJ0XCI6XCJkaWFsb2dcIiksYS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxpdmVcIixyLnRvYXN0P1wicG9saXRlXCI6XCJhc3NlcnRpdmVcIiksci50b2FzdHx8YS5zZXRBdHRyaWJ1dGUoXCJhcmlhLW1vZGFsXCIsXCJ0cnVlXCIpLGM9byxcInJ0bFwiPT09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYykuZGlyZWN0aW9uJiZtdChRKCksWS5ydGwpLHM9UCgpLHU9Z3QocyxZLmlucHV0KSxsPWd0KHMsWS5maWxlKSxkPXMucXVlcnlTZWxlY3RvcihcIi5cIi5jb25jYXQoWS5yYW5nZSxcIiBpbnB1dFwiKSkscD1zLnF1ZXJ5U2VsZWN0b3IoXCIuXCIuY29uY2F0KFkucmFuZ2UsXCIgb3V0cHV0XCIpKSxmPWd0KHMsWS5zZWxlY3QpLG09cy5xdWVyeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChZLmNoZWNrYm94LFwiIGlucHV0XCIpKSxoPWd0KHMsWS50ZXh0YXJlYSksdS5vbmlucHV0PWx0LGwub25jaGFuZ2U9bHQsZi5vbmNoYW5nZT1sdCxtLm9uY2hhbmdlPWx0LGgub25pbnB1dD1sdCxkLm9uaW5wdXQ9ZnVuY3Rpb24odCl7bHQodCkscC52YWx1ZT1kLnZhbHVlfSxkLm9uY2hhbmdlPWZ1bmN0aW9uKHQpe2x0KHQpLGQubmV4dFNpYmxpbmcudmFsdWU9ZC52YWx1ZX0pfSx3dD1mdW5jdGlvbih0LGUpe3QuanF1ZXJ5P0N0KGUsdCk6SChlLHQudG9TdHJpbmcoKSl9LEN0PWZ1bmN0aW9uKHQsZSl7aWYodC50ZXh0Q29udGVudD1cIlwiLDAgaW4gZSlmb3IodmFyIG49MDtuIGluIGU7bisrKXQuYXBwZW5kQ2hpbGQoZVtuXS5jbG9uZU5vZGUoITApKTtlbHNlIHQuYXBwZW5kQ2hpbGQoZS5jbG9uZU5vZGUoITApKX0sa3Q9ZnVuY3Rpb24oKXtpZih1dCgpKXJldHVybiExO3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksZT17V2Via2l0QW5pbWF0aW9uOlwid2Via2l0QW5pbWF0aW9uRW5kXCIsT0FuaW1hdGlvbjpcIm9BbmltYXRpb25FbmQgb2FuaW1hdGlvbmVuZFwiLGFuaW1hdGlvbjpcImFuaW1hdGlvbmVuZFwifTtmb3IodmFyIG4gaW4gZSlpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmdm9pZCAwIT09dC5zdHlsZVtuXSlyZXR1cm4gZVtuXTtyZXR1cm4hMX0oKTtmdW5jdGlvbiB4dCh0LGUsbil7dmFyIG87cnQodCxuW1wic2hvd1wiLmNvbmNhdCgobz1lKS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStvLnNsaWNlKDEpLFwiQnV0dG9uXCIpXSxcImlubGluZS1ibG9ja1wiKSxIKHQsbltcIlwiLmNvbmNhdChlLFwiQnV0dG9uVGV4dFwiKV0pLHQuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLG5bXCJcIi5jb25jYXQoZSxcIkJ1dHRvbkFyaWFMYWJlbFwiKV0pLHQuY2xhc3NOYW1lPVlbZV0sTih0LG4sXCJcIi5jb25jYXQoZSxcIkJ1dHRvblwiKSksbXQodCxuW1wiXCIuY29uY2F0KGUsXCJCdXR0b25DbGFzc1wiKV0pfWZ1bmN0aW9uIFB0KHQsZSl7dmFyIG4sbyxpLHIsYSxjLHMsdSxsPVEoKTtsJiYobj1sLFwic3RyaW5nXCI9PXR5cGVvZihvPWUuYmFja2Ryb3ApP24uc3R5bGUuYmFja2dyb3VuZD1vOm98fG10KFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZG9jdW1lbnQuYm9keV0sWVtcIm5vLWJhY2tkcm9wXCJdKSwhZS5iYWNrZHJvcCYmZS5hbGxvd091dHNpZGVDbGljayYmXygnXCJhbGxvd091dHNpZGVDbGlja1wiIHBhcmFtZXRlciByZXF1aXJlcyBgYmFja2Ryb3BgIHBhcmFtZXRlciB0byBiZSBzZXQgdG8gYHRydWVgJyksaT1sLChyPWUucG9zaXRpb24paW4gWT9tdChpLFlbcl0pOihfKCdUaGUgXCJwb3NpdGlvblwiIHBhcmFtZXRlciBpcyBub3QgdmFsaWQsIGRlZmF1bHRpbmcgdG8gXCJjZW50ZXJcIicpLG10KGksWS5jZW50ZXIpKSxhPWwsIShjPWUuZ3Jvdyl8fFwic3RyaW5nXCIhPXR5cGVvZiBjfHwocz1cImdyb3ctXCIuY29uY2F0KGMpKWluIFkmJm10KGEsWVtzXSksTihsLGUsXCJjb250YWluZXJcIiksKHU9ZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXN3YWwyLXF1ZXVlLXN0ZXBcIikpJiYobC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXF1ZXVlLXN0ZXBcIix1KSxkb2N1bWVudC5ib2R5LnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtc3dhbDItcXVldWUtc3RlcFwiKSkpfWZ1bmN0aW9uIEF0KHQsZSl7dC5wbGFjZWhvbGRlciYmIWUuaW5wdXRQbGFjZWhvbGRlcnx8KHQucGxhY2Vob2xkZXI9ZS5pbnB1dFBsYWNlaG9sZGVyKX12YXIgQnQ9e3Byb21pc2U6bmV3IFdlYWtNYXAsaW5uZXJQYXJhbXM6bmV3IFdlYWtNYXAsZG9tQ2FjaGU6bmV3IFdlYWtNYXB9LFN0PVtcImlucHV0XCIsXCJmaWxlXCIsXCJyYW5nZVwiLFwic2VsZWN0XCIsXCJyYWRpb1wiLFwiY2hlY2tib3hcIixcInRleHRhcmVhXCJdLEV0PWZ1bmN0aW9uKHQpe2lmKCFJdFt0LmlucHV0XSlyZXR1cm4gRignVW5leHBlY3RlZCB0eXBlIG9mIGlucHV0ISBFeHBlY3RlZCBcInRleHRcIiwgXCJlbWFpbFwiLCBcInBhc3N3b3JkXCIsIFwibnVtYmVyXCIsIFwidGVsXCIsIFwic2VsZWN0XCIsIFwicmFkaW9cIiwgXCJjaGVja2JveFwiLCBcInRleHRhcmVhXCIsIFwiZmlsZVwiIG9yIFwidXJsXCIsIGdvdCBcIicuY29uY2F0KHQuaW5wdXQsJ1wiJykpO3ZhciBlPUx0KHQuaW5wdXQpLG49SXRbdC5pbnB1dF0oZSx0KTtvdChuKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHQobil9KX0sT3Q9ZnVuY3Rpb24odCxlKXt2YXIgbj1HKFAoKSx0KTtpZihuKWZvcih2YXIgbyBpbiFmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQuYXR0cmlidXRlcy5sZW5ndGg7ZSsrKXt2YXIgbj10LmF0dHJpYnV0ZXNbZV0ubmFtZTstMT09PVtcInR5cGVcIixcInZhbHVlXCIsXCJzdHlsZVwiXS5pbmRleE9mKG4pJiZ0LnJlbW92ZUF0dHJpYnV0ZShuKX19KG4pLGUpXCJyYW5nZVwiPT09dCYmXCJwbGFjZWhvbGRlclwiPT09b3x8bi5zZXRBdHRyaWJ1dGUobyxlW29dKX0sVHQ9ZnVuY3Rpb24odCl7dmFyIGU9THQodC5pbnB1dCk7dC5jdXN0b21DbGFzcyYmbXQoZSx0LmN1c3RvbUNsYXNzLmlucHV0KX0sTHQ9ZnVuY3Rpb24odCl7dmFyIGU9WVt0XT9ZW3RdOlkuaW5wdXQ7cmV0dXJuIGd0KFAoKSxlKX0sSXQ9e307SXQudGV4dD1JdC5lbWFpbD1JdC5wYXNzd29yZD1JdC5udW1iZXI9SXQudGVsPUl0LnVybD1mdW5jdGlvbih0LGUpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiBlLmlucHV0VmFsdWV8fFwibnVtYmVyXCI9PXR5cGVvZiBlLmlucHV0VmFsdWU/dC52YWx1ZT1lLmlucHV0VmFsdWU6eShlLmlucHV0VmFsdWUpfHxfKCdVbmV4cGVjdGVkIHR5cGUgb2YgaW5wdXRWYWx1ZSEgRXhwZWN0ZWQgXCJzdHJpbmdcIiwgXCJudW1iZXJcIiBvciBcIlByb21pc2VcIiwgZ290IFwiJy5jb25jYXQocihlLmlucHV0VmFsdWUpLCdcIicpKSxBdCh0LGUpLHQudHlwZT1lLmlucHV0LHR9LEl0LmZpbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gQXQodCxlKSx0fSxJdC5yYW5nZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQucXVlcnlTZWxlY3RvcihcImlucHV0XCIpLG89dC5xdWVyeVNlbGVjdG9yKFwib3V0cHV0XCIpO3JldHVybiBuLnZhbHVlPWUuaW5wdXRWYWx1ZSxuLnR5cGU9ZS5pbnB1dCxvLnZhbHVlPWUuaW5wdXRWYWx1ZSx0fSxJdC5zZWxlY3Q9ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gdC50ZXh0Q29udGVudD1cIlwiLGUuaW5wdXRQbGFjZWhvbGRlciYmKG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKSxIKG4sZS5pbnB1dFBsYWNlaG9sZGVyKSxuLnZhbHVlPVwiXCIsbi5kaXNhYmxlZD0hMCxuLnNlbGVjdGVkPSEwLHQuYXBwZW5kQ2hpbGQobikpLHR9LEl0LnJhZGlvPWZ1bmN0aW9uKHQpe3JldHVybiB0LnRleHRDb250ZW50PVwiXCIsdH0sSXQuY2hlY2tib3g9ZnVuY3Rpb24odCxlKXt2YXIgbj1HKFAoKSxcImNoZWNrYm94XCIpO24udmFsdWU9MSxuLmlkPVkuY2hlY2tib3gsbi5jaGVja2VkPUJvb2xlYW4oZS5pbnB1dFZhbHVlKTt2YXIgbz10LnF1ZXJ5U2VsZWN0b3IoXCJzcGFuXCIpO3JldHVybiBIKG8sZS5pbnB1dFBsYWNlaG9sZGVyKSx0fSxJdC50ZXh0YXJlYT1mdW5jdGlvbihlLHQpe3ZhciBuLG87cmV0dXJuIGUudmFsdWU9dC5pbnB1dFZhbHVlLEF0KGUsdCksXCJNdXRhdGlvbk9ic2VydmVyXCJpbiB3aW5kb3cmJihuPXBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCQoKSkud2lkdGgpLG89cGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoJCgpKS5wYWRkaW5nTGVmdCkrcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoJCgpKS5wYWRkaW5nUmlnaHQpLG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCl7dmFyIHQ9ZS5vZmZzZXRXaWR0aCtvOyQoKS5zdHlsZS53aWR0aD1uPHQ/XCJcIi5jb25jYXQodCxcInB4XCIpOm51bGx9KS5vYnNlcnZlKGUse2F0dHJpYnV0ZXM6ITAsYXR0cmlidXRlRmlsdGVyOltcInN0eWxlXCJdfSkpLGV9O2Z1bmN0aW9uIGp0KHQsZSl7dmFyIG4sbyxpLHIsYSxjPVAoKS5xdWVyeVNlbGVjdG9yKFwiI1wiLmNvbmNhdChZLmNvbnRlbnQpKTtlLmh0bWw/KGR0KGUuaHRtbCxjKSxvdChjLFwiYmxvY2tcIikpOmUudGV4dD8oYy50ZXh0Q29udGVudD1lLnRleHQsb3QoYyxcImJsb2NrXCIpKTppdChjKSxuPXQsbz1lLGk9UCgpLHI9QnQuaW5uZXJQYXJhbXMuZ2V0KG4pLGE9IXJ8fG8uaW5wdXQhPT1yLmlucHV0LFN0LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9WVt0XSxuPWd0KGksZSk7T3QodCxvLmlucHV0QXR0cmlidXRlcyksbi5jbGFzc05hbWU9ZSxhJiZpdChuKX0pLG8uaW5wdXQmJihhJiZFdChvKSxUdChvKSksTihQKCksZSxcImNvbnRlbnRcIil9ZnVuY3Rpb24gcXQoKXtyZXR1cm4gUSgpJiZRKCkuZ2V0QXR0cmlidXRlKFwiZGF0YS1xdWV1ZS1zdGVwXCIpfWZ1bmN0aW9uIFZ0KHQscyl7dmFyIHU9QigpO2lmKCFzLnByb2dyZXNzU3RlcHN8fDA9PT1zLnByb2dyZXNzU3RlcHMubGVuZ3RoKXJldHVybiBpdCh1KSwwO290KHUpLHUudGV4dENvbnRlbnQ9XCJcIjt2YXIgbD1wYXJzZUludCh2b2lkIDA9PT1zLmN1cnJlbnRQcm9ncmVzc1N0ZXA/cXQoKTpzLmN1cnJlbnRQcm9ncmVzc1N0ZXApO2w+PXMucHJvZ3Jlc3NTdGVwcy5sZW5ndGgmJl8oXCJJbnZhbGlkIGN1cnJlbnRQcm9ncmVzc1N0ZXAgcGFyYW1ldGVyLCBpdCBzaG91bGQgYmUgbGVzcyB0aGFuIHByb2dyZXNzU3RlcHMubGVuZ3RoIChjdXJyZW50UHJvZ3Jlc3NTdGVwIGxpa2UgSlMgYXJyYXlzIHN0YXJ0cyBmcm9tIDApXCIpLHMucHJvZ3Jlc3NTdGVwcy5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dmFyIG4sbyxpLHIsYSxjPShuPXQsbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlcIiksbXQobyxZW1wicHJvZ3Jlc3Mtc3RlcFwiXSksSChvLG4pLG8pO3UuYXBwZW5kQ2hpbGQoYyksZT09PWwmJm10KGMsWVtcImFjdGl2ZS1wcm9ncmVzcy1zdGVwXCJdKSxlIT09cy5wcm9ncmVzc1N0ZXBzLmxlbmd0aC0xJiYocj1zLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpXCIpLG10KGEsWVtcInByb2dyZXNzLXN0ZXAtbGluZVwiXSksci5wcm9ncmVzc1N0ZXBzRGlzdGFuY2UmJihhLnN0eWxlLndpZHRoPXIucHJvZ3Jlc3NTdGVwc0Rpc3RhbmNlKSxpPWEsdS5hcHBlbmRDaGlsZChpKSl9KX1mdW5jdGlvbiBNdCh0LGUpe3ZhciBuLG8saSxyLGEsYyxzLHUsbD1MKCk7TihsLGUsXCJoZWFkZXJcIiksVnQoMCxlKSxuPXQsbz1lLChyPUJ0LmlubmVyUGFyYW1zLmdldChuKSkmJm8uaWNvbj09PXIuaWNvbiYmaygpP04oaygpLG8sXCJpY29uXCIpOihEdCgpLG8uaWNvbiYmKC0xIT09T2JqZWN0LmtleXMoWikuaW5kZXhPZihvLmljb24pPyhpPUMoXCIuXCIuY29uY2F0KFkuaWNvbixcIi5cIikuY29uY2F0KFpbby5pY29uXSkpLG90KGkpLFV0KGksbyksTnQoKSxOKGksbyxcImljb25cIiksbXQoaSxvLnNob3dDbGFzcy5pY29uKSk6RignVW5rbm93biBpY29uISBFeHBlY3RlZCBcInN1Y2Nlc3NcIiwgXCJlcnJvclwiLCBcIndhcm5pbmdcIiwgXCJpbmZvXCIgb3IgXCJxdWVzdGlvblwiLCBnb3QgXCInLmNvbmNhdChvLmljb24sJ1wiJykpKSksZnVuY3Rpb24odCl7dmFyIGU9QSgpO2lmKCF0LmltYWdlVXJsKXJldHVybiBpdChlKTtvdChlLFwiXCIpLGUuc2V0QXR0cmlidXRlKFwic3JjXCIsdC5pbWFnZVVybCksZS5zZXRBdHRyaWJ1dGUoXCJhbHRcIix0LmltYWdlQWx0KSxudChlLFwid2lkdGhcIix0LmltYWdlV2lkdGgpLG50KGUsXCJoZWlnaHRcIix0LmltYWdlSGVpZ2h0KSxlLmNsYXNzTmFtZT1ZLmltYWdlLE4oZSx0LFwiaW1hZ2VcIil9KGUpLGE9ZSxjPXgoKSxydChjLGEudGl0bGV8fGEudGl0bGVUZXh0KSxhLnRpdGxlJiZkdChhLnRpdGxlLGMpLGEudGl0bGVUZXh0JiYoYy5pbm5lclRleHQ9YS50aXRsZVRleHQpLE4oYyxhLFwidGl0bGVcIikscz1lLHU9cSgpLEgodSxzLmNsb3NlQnV0dG9uSHRtbCksTih1LHMsXCJjbG9zZUJ1dHRvblwiKSxydCh1LHMuc2hvd0Nsb3NlQnV0dG9uKSx1LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIixzLmNsb3NlQnV0dG9uQXJpYUxhYmVsKX1mdW5jdGlvbiBSdCh0LGUpe3ZhciBuLG8saSxyO249ZSxvPSQoKSxudChvLFwid2lkdGhcIixuLndpZHRoKSxudChvLFwicGFkZGluZ1wiLG4ucGFkZGluZyksbi5iYWNrZ3JvdW5kJiYoby5zdHlsZS5iYWNrZ3JvdW5kPW4uYmFja2dyb3VuZCksenQobyxuKSxQdCgwLGUpLE10KHQsZSksanQodCxlKSxwdCgwLGUpLGk9ZSxyPUkoKSxydChyLGkuZm9vdGVyKSxpLmZvb3RlciYmZHQoaS5mb290ZXIsciksTihyLGksXCJmb290ZXJcIiksXCJmdW5jdGlvblwiPT10eXBlb2YgZS5vblJlbmRlciYmZS5vblJlbmRlcigkKCkpfWZ1bmN0aW9uIEh0KCl7cmV0dXJuIEUoKSYmRSgpLmNsaWNrKCl9dmFyIER0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW4oKSxlPTA7ZTx0Lmxlbmd0aDtlKyspaXQodFtlXSl9LE50PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PSQoKSxlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLmdldFByb3BlcnR5VmFsdWUoXCJiYWNrZ3JvdW5kLWNvbG9yXCIpLG49dC5xdWVyeVNlbGVjdG9yQWxsKFwiW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVdLCAuc3dhbDItc3VjY2Vzcy1maXhcIiksbz0wO288bi5sZW5ndGg7bysrKW5bb10uc3R5bGUuYmFja2dyb3VuZENvbG9yPWV9LFV0PWZ1bmN0aW9uKHQsZSl7dC50ZXh0Q29udGVudD1cIlwiLGUuaWNvbkh0bWw/SCh0LF90KGUuaWNvbkh0bWwpKTpcInN1Y2Nlc3NcIj09PWUuaWNvbj9IKHQsJ1xcbiAgICAgIDxkaXYgY2xhc3M9XCJzd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmUtbGVmdFwiPjwvZGl2PlxcbiAgICAgIDxzcGFuIGNsYXNzPVwic3dhbDItc3VjY2Vzcy1saW5lLXRpcFwiPjwvc3Bhbj4gPHNwYW4gY2xhc3M9XCJzd2FsMi1zdWNjZXNzLWxpbmUtbG9uZ1wiPjwvc3Bhbj5cXG4gICAgICA8ZGl2IGNsYXNzPVwic3dhbDItc3VjY2Vzcy1yaW5nXCI+PC9kaXY+IDxkaXYgY2xhc3M9XCJzd2FsMi1zdWNjZXNzLWZpeFwiPjwvZGl2PlxcbiAgICAgIDxkaXYgY2xhc3M9XCJzd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmUtcmlnaHRcIj48L2Rpdj5cXG4gICAgJyk6XCJlcnJvclwiPT09ZS5pY29uP0godCwnXFxuICAgICAgPHNwYW4gY2xhc3M9XCJzd2FsMi14LW1hcmtcIj5cXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3dhbDIteC1tYXJrLWxpbmUtbGVmdFwiPjwvc3Bhbj5cXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3dhbDIteC1tYXJrLWxpbmUtcmlnaHRcIj48L3NwYW4+XFxuICAgICAgPC9zcGFuPlxcbiAgICAnKTpIKHQsX3Qoe3F1ZXN0aW9uOlwiP1wiLHdhcm5pbmc6XCIhXCIsaW5mbzpcImlcIn1bZS5pY29uXSkpfSxfdD1mdW5jdGlvbih0KXtyZXR1cm4nPGRpdiBjbGFzcz1cIicuY29uY2F0KFlbXCJpY29uLWNvbnRlbnRcIl0sJ1wiPicpLmNvbmNhdCh0LFwiPC9kaXY+XCIpfSxGdD1bXSx6dD1mdW5jdGlvbih0LGUpe3QuY2xhc3NOYW1lPVwiXCIuY29uY2F0KFkucG9wdXAsXCIgXCIpLmNvbmNhdCh2dCh0KT9lLnNob3dDbGFzcy5wb3B1cDpcIlwiKSxlLnRvYXN0PyhtdChbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLFlbXCJ0b2FzdC1zaG93blwiXSksbXQodCxZLnRvYXN0KSk6bXQodCxZLm1vZGFsKSxOKHQsZSxcInBvcHVwXCIpLFwic3RyaW5nXCI9PXR5cGVvZiBlLmN1c3RvbUNsYXNzJiZtdCh0LGUuY3VzdG9tQ2xhc3MpLGUuaWNvbiYmbXQodCxZW1wiaWNvbi1cIi5jb25jYXQoZS5pY29uKV0pfTtmdW5jdGlvbiBXdCgpe3ZhciB0PSQoKTt0fHxsbi5maXJlKCksdD0kKCk7dmFyIGU9VCgpLG49RSgpO290KGUpLG90KG4sXCJpbmxpbmUtYmxvY2tcIiksbXQoW3QsZV0sWS5sb2FkaW5nKSxuLmRpc2FibGVkPSEwLHQuc2V0QXR0cmlidXRlKFwiZGF0YS1sb2FkaW5nXCIsITApLHQuc2V0QXR0cmlidXRlKFwiYXJpYS1idXN5XCIsITApLHQuZm9jdXMoKX1mdW5jdGlvbiBLdCgpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0KXt2YXIgZT13aW5kb3cuc2Nyb2xsWCxuPXdpbmRvdy5zY3JvbGxZO1h0LnJlc3RvcmVGb2N1c1RpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe1h0LnByZXZpb3VzQWN0aXZlRWxlbWVudCYmWHQucHJldmlvdXNBY3RpdmVFbGVtZW50LmZvY3VzPyhYdC5wcmV2aW91c0FjdGl2ZUVsZW1lbnQuZm9jdXMoKSxYdC5wcmV2aW91c0FjdGl2ZUVsZW1lbnQ9bnVsbCk6ZG9jdW1lbnQuYm9keSYmZG9jdW1lbnQuYm9keS5mb2N1cygpLHQoKX0sMTAwKSx2b2lkIDAhPT1lJiZ2b2lkIDAhPT1uJiZ3aW5kb3cuc2Nyb2xsVG8oZSxuKX0pfWZ1bmN0aW9uIFl0KCl7aWYoWHQudGltZW91dClyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD1qKCksZT1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS53aWR0aCk7dC5zdHlsZS5yZW1vdmVQcm9wZXJ0eShcInRyYW5zaXRpb25cIiksdC5zdHlsZS53aWR0aD1cIjEwMCVcIjt2YXIgbj1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS53aWR0aCksbz1wYXJzZUludChlL24qMTAwKTt0LnN0eWxlLnJlbW92ZVByb3BlcnR5KFwidHJhbnNpdGlvblwiKSx0LnN0eWxlLndpZHRoPVwiXCIuY29uY2F0KG8sXCIlXCIpfSgpLFh0LnRpbWVvdXQuc3RvcCgpfWZ1bmN0aW9uIFp0KCl7aWYoWHQudGltZW91dCl7dmFyIHQ9WHQudGltZW91dC5zdGFydCgpO3JldHVybiBzdCh0KSx0fX1mdW5jdGlvbiBRdCh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEd0LHQpfWZ1bmN0aW9uICR0KHQpe3JldHVybiBlZVt0XX1mdW5jdGlvbiBKdCh0KXtmb3IodmFyIGUgaW4gdClRdChpPWUpfHxfKCdVbmtub3duIHBhcmFtZXRlciBcIicuY29uY2F0KGksJ1wiJykpLHQudG9hc3QmJihvPWUsLTEhPT1uZS5pbmRleE9mKG8pJiZfKCdUaGUgcGFyYW1ldGVyIFwiJy5jb25jYXQobywnXCIgaXMgaW5jb21wYXRpYmxlIHdpdGggdG9hc3RzJykpKSwkdChuPWUpJiZnKG4sJHQobikpO3ZhciBuLG8saX12YXIgWHQ9e30sR3Q9e3RpdGxlOlwiXCIsdGl0bGVUZXh0OlwiXCIsdGV4dDpcIlwiLGh0bWw6XCJcIixmb290ZXI6XCJcIixpY29uOnZvaWQgMCxpY29uSHRtbDp2b2lkIDAsdG9hc3Q6ITEsYW5pbWF0aW9uOiEwLHNob3dDbGFzczp7cG9wdXA6XCJzd2FsMi1zaG93XCIsYmFja2Ryb3A6XCJzd2FsMi1iYWNrZHJvcC1zaG93XCIsaWNvbjpcInN3YWwyLWljb24tc2hvd1wifSxoaWRlQ2xhc3M6e3BvcHVwOlwic3dhbDItaGlkZVwiLGJhY2tkcm9wOlwic3dhbDItYmFja2Ryb3AtaGlkZVwiLGljb246XCJzd2FsMi1pY29uLWhpZGVcIn0sY3VzdG9tQ2xhc3M6dm9pZCAwLHRhcmdldDpcImJvZHlcIixiYWNrZHJvcDohMCxoZWlnaHRBdXRvOiEwLGFsbG93T3V0c2lkZUNsaWNrOiEwLGFsbG93RXNjYXBlS2V5OiEwLGFsbG93RW50ZXJLZXk6ITAsc3RvcEtleWRvd25Qcm9wYWdhdGlvbjohMCxrZXlkb3duTGlzdGVuZXJDYXB0dXJlOiExLHNob3dDb25maXJtQnV0dG9uOiEwLHNob3dDYW5jZWxCdXR0b246ITEscHJlQ29uZmlybTp2b2lkIDAsY29uZmlybUJ1dHRvblRleHQ6XCJPS1wiLGNvbmZpcm1CdXR0b25BcmlhTGFiZWw6XCJcIixjb25maXJtQnV0dG9uQ29sb3I6dm9pZCAwLGNhbmNlbEJ1dHRvblRleHQ6XCJDYW5jZWxcIixjYW5jZWxCdXR0b25BcmlhTGFiZWw6XCJcIixjYW5jZWxCdXR0b25Db2xvcjp2b2lkIDAsYnV0dG9uc1N0eWxpbmc6ITAscmV2ZXJzZUJ1dHRvbnM6ITEsZm9jdXNDb25maXJtOiEwLGZvY3VzQ2FuY2VsOiExLHNob3dDbG9zZUJ1dHRvbjohMSxjbG9zZUJ1dHRvbkh0bWw6XCImdGltZXM7XCIsY2xvc2VCdXR0b25BcmlhTGFiZWw6XCJDbG9zZSB0aGlzIGRpYWxvZ1wiLHNob3dMb2FkZXJPbkNvbmZpcm06ITEsaW1hZ2VVcmw6dm9pZCAwLGltYWdlV2lkdGg6dm9pZCAwLGltYWdlSGVpZ2h0OnZvaWQgMCxpbWFnZUFsdDpcIlwiLHRpbWVyOnZvaWQgMCx0aW1lclByb2dyZXNzQmFyOiExLHdpZHRoOnZvaWQgMCxwYWRkaW5nOnZvaWQgMCxiYWNrZ3JvdW5kOnZvaWQgMCxpbnB1dDp2b2lkIDAsaW5wdXRQbGFjZWhvbGRlcjpcIlwiLGlucHV0VmFsdWU6XCJcIixpbnB1dE9wdGlvbnM6e30saW5wdXRBdXRvVHJpbTohMCxpbnB1dEF0dHJpYnV0ZXM6e30saW5wdXRWYWxpZGF0b3I6dm9pZCAwLHZhbGlkYXRpb25NZXNzYWdlOnZvaWQgMCxncm93OiExLHBvc2l0aW9uOlwiY2VudGVyXCIscHJvZ3Jlc3NTdGVwczpbXSxjdXJyZW50UHJvZ3Jlc3NTdGVwOnZvaWQgMCxwcm9ncmVzc1N0ZXBzRGlzdGFuY2U6dm9pZCAwLG9uQmVmb3JlT3Blbjp2b2lkIDAsb25PcGVuOnZvaWQgMCxvblJlbmRlcjp2b2lkIDAsb25DbG9zZTp2b2lkIDAsb25BZnRlckNsb3NlOnZvaWQgMCxvbkRlc3Ryb3k6dm9pZCAwLHNjcm9sbGJhclBhZGRpbmc6ITB9LHRlPVtcImFsbG93RXNjYXBlS2V5XCIsXCJhbGxvd091dHNpZGVDbGlja1wiLFwiYnV0dG9uc1N0eWxpbmdcIixcImNhbmNlbEJ1dHRvbkFyaWFMYWJlbFwiLFwiY2FuY2VsQnV0dG9uQ29sb3JcIixcImNhbmNlbEJ1dHRvblRleHRcIixcImNsb3NlQnV0dG9uQXJpYUxhYmVsXCIsXCJjbG9zZUJ1dHRvbkh0bWxcIixcImNvbmZpcm1CdXR0b25BcmlhTGFiZWxcIixcImNvbmZpcm1CdXR0b25Db2xvclwiLFwiY29uZmlybUJ1dHRvblRleHRcIixcImN1cnJlbnRQcm9ncmVzc1N0ZXBcIixcImN1c3RvbUNsYXNzXCIsXCJmb290ZXJcIixcImhpZGVDbGFzc1wiLFwiaHRtbFwiLFwiaWNvblwiLFwiaW1hZ2VBbHRcIixcImltYWdlSGVpZ2h0XCIsXCJpbWFnZVVybFwiLFwiaW1hZ2VXaWR0aFwiLFwib25BZnRlckNsb3NlXCIsXCJvbkNsb3NlXCIsXCJvbkRlc3Ryb3lcIixcInByb2dyZXNzU3RlcHNcIixcInJldmVyc2VCdXR0b25zXCIsXCJzaG93Q2FuY2VsQnV0dG9uXCIsXCJzaG93Q2xvc2VCdXR0b25cIixcInNob3dDb25maXJtQnV0dG9uXCIsXCJ0ZXh0XCIsXCJ0aXRsZVwiLFwidGl0bGVUZXh0XCJdLGVlPXthbmltYXRpb246J3Nob3dDbGFzc1wiIGFuZCBcImhpZGVDbGFzcyd9LG5lPVtcImFsbG93T3V0c2lkZUNsaWNrXCIsXCJhbGxvd0VudGVyS2V5XCIsXCJiYWNrZHJvcFwiLFwiZm9jdXNDb25maXJtXCIsXCJmb2N1c0NhbmNlbFwiLFwiaGVpZ2h0QXV0b1wiLFwia2V5ZG93bkxpc3RlbmVyQ2FwdHVyZVwiXSxvZT1PYmplY3QuZnJlZXplKHtpc1ZhbGlkUGFyYW1ldGVyOlF0LGlzVXBkYXRhYmxlUGFyYW1ldGVyOmZ1bmN0aW9uKHQpe3JldHVybi0xIT09dGUuaW5kZXhPZih0KX0saXNEZXByZWNhdGVkUGFyYW1ldGVyOiR0LGFyZ3NUb1BhcmFtczpmdW5jdGlvbihvKXt2YXIgaT17fTtyZXR1cm5cIm9iamVjdFwiIT09cihvWzBdKXx8dyhvWzBdKT9bXCJ0aXRsZVwiLFwiaHRtbFwiLFwiaWNvblwiXS5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dmFyIG49b1tlXTtcInN0cmluZ1wiPT10eXBlb2Ygbnx8dyhuKT9pW3RdPW46dm9pZCAwIT09biYmRihcIlVuZXhwZWN0ZWQgdHlwZSBvZiBcIi5jb25jYXQodCwnISBFeHBlY3RlZCBcInN0cmluZ1wiIG9yIFwiRWxlbWVudFwiLCBnb3QgJykuY29uY2F0KHIobikpKX0pOnMoaSxvWzBdKSxpfSxpc1Zpc2libGU6ZnVuY3Rpb24oKXtyZXR1cm4gdnQoJCgpKX0sY2xpY2tDb25maXJtOkh0LGNsaWNrQ2FuY2VsOmZ1bmN0aW9uKCl7cmV0dXJuIE8oKSYmTygpLmNsaWNrKCl9LGdldENvbnRhaW5lcjpRLGdldFBvcHVwOiQsZ2V0VGl0bGU6eCxnZXRDb250ZW50OlAsZ2V0SHRtbENvbnRhaW5lcjpmdW5jdGlvbigpe3JldHVybiBlKFlbXCJodG1sLWNvbnRhaW5lclwiXSl9LGdldEltYWdlOkEsZ2V0SWNvbjprLGdldEljb25zOm4sZ2V0Q2xvc2VCdXR0b246cSxnZXRBY3Rpb25zOlQsZ2V0Q29uZmlybUJ1dHRvbjpFLGdldENhbmNlbEJ1dHRvbjpPLGdldEhlYWRlcjpMLGdldEZvb3RlcjpJLGdldFRpbWVyUHJvZ3Jlc3NCYXI6aixnZXRGb2N1c2FibGVFbGVtZW50czpWLGdldFZhbGlkYXRpb25NZXNzYWdlOlMsaXNMb2FkaW5nOlIsZmlyZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiBpKHRoaXMsZSl9LG1peGluOmZ1bmN0aW9uKHIpe3JldHVybiBmdW5jdGlvbih0KXshZnVuY3Rpb24odCxlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJmwodCxlKX0oaSx0KTt2YXIgbixvLGU9KG49aSxvPWQoKSxmdW5jdGlvbigpe3ZhciB0LGU9dShuKTtyZXR1cm4gcCh0aGlzLG8/KHQ9dSh0aGlzKS5jb25zdHJ1Y3RvcixSZWZsZWN0LmNvbnN0cnVjdChlLGFyZ3VtZW50cyx0KSk6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSk7ZnVuY3Rpb24gaSgpe3JldHVybiBhKHRoaXMsaSksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIGMoaSxbe2tleTpcIl9tYWluXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIGYodShpLnByb3RvdHlwZSksXCJfbWFpblwiLHRoaXMpLmNhbGwodGhpcyxzKHt9LHIsdCkpfX1dKSxpfSh0aGlzKX0scXVldWU6ZnVuY3Rpb24odCl7dmFyIHI9dGhpcztGdD10O2Z1bmN0aW9uIGEodCxlKXtGdD1bXSx0KGUpfXZhciBjPVtdO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihpKXshZnVuY3Rpb24gZShuLG8pe248RnQubGVuZ3RoPyhkb2N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZShcImRhdGEtc3dhbDItcXVldWUtc3RlcFwiLG4pLHIuZmlyZShGdFtuXSkudGhlbihmdW5jdGlvbih0KXt2b2lkIDAhPT10LnZhbHVlPyhjLnB1c2godC52YWx1ZSksZShuKzEsbykpOmEoaSx7ZGlzbWlzczp0LmRpc21pc3N9KX0pKTphKGkse3ZhbHVlOmN9KX0oMCl9KX0sZ2V0UXVldWVTdGVwOnF0LGluc2VydFF1ZXVlU3RlcDpmdW5jdGlvbih0LGUpe3JldHVybiBlJiZlPEZ0Lmxlbmd0aD9GdC5zcGxpY2UoZSwwLHQpOkZ0LnB1c2godCl9LGRlbGV0ZVF1ZXVlU3RlcDpmdW5jdGlvbih0KXt2b2lkIDAhPT1GdFt0XSYmRnQuc3BsaWNlKHQsMSl9LHNob3dMb2FkaW5nOld0LGVuYWJsZUxvYWRpbmc6V3QsZ2V0VGltZXJMZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIFh0LnRpbWVvdXQmJlh0LnRpbWVvdXQuZ2V0VGltZXJMZWZ0KCl9LHN0b3BUaW1lcjpZdCxyZXN1bWVUaW1lcjpadCx0b2dnbGVUaW1lcjpmdW5jdGlvbigpe3ZhciB0PVh0LnRpbWVvdXQ7cmV0dXJuIHQmJih0LnJ1bm5pbmc/WXQ6WnQpKCl9LGluY3JlYXNlVGltZXI6ZnVuY3Rpb24odCl7aWYoWHQudGltZW91dCl7dmFyIGU9WHQudGltZW91dC5pbmNyZWFzZSh0KTtyZXR1cm4gc3QoZSwhMCksZX19LGlzVGltZXJSdW5uaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIFh0LnRpbWVvdXQmJlh0LnRpbWVvdXQuaXNSdW5uaW5nKCl9fSk7ZnVuY3Rpb24gaWUoKXt2YXIgdCxlPUJ0LmlubmVyUGFyYW1zLmdldCh0aGlzKTtlJiYodD1CdC5kb21DYWNoZS5nZXQodGhpcyksZS5zaG93Q29uZmlybUJ1dHRvbnx8KGl0KHQuY29uZmlybUJ1dHRvbiksZS5zaG93Q2FuY2VsQnV0dG9ufHxpdCh0LmFjdGlvbnMpKSxodChbdC5wb3B1cCx0LmFjdGlvbnNdLFkubG9hZGluZyksdC5wb3B1cC5yZW1vdmVBdHRyaWJ1dGUoXCJhcmlhLWJ1c3lcIiksdC5wb3B1cC5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLWxvYWRpbmdcIiksdC5jb25maXJtQnV0dG9uLmRpc2FibGVkPSExLHQuY2FuY2VsQnV0dG9uLmRpc2FibGVkPSExKX1mdW5jdGlvbiByZSgpe251bGw9PT1YLnByZXZpb3VzQm9keVBhZGRpbmcmJmRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0PndpbmRvdy5pbm5lckhlaWdodCYmKFgucHJldmlvdXNCb2R5UGFkZGluZz1wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZy1yaWdodFwiKSksZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ9XCJcIi5jb25jYXQoWC5wcmV2aW91c0JvZHlQYWRkaW5nK2Z1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTt0LmNsYXNzTmFtZT1ZW1wic2Nyb2xsYmFyLW1lYXN1cmVcIl0sZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KTt2YXIgZT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLXQuY2xpZW50V2lkdGg7cmV0dXJuIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodCksZX0oKSxcInB4XCIpKX1mdW5jdGlvbiBhZSgpe3JldHVybiEhd2luZG93Lk1TSW5wdXRNZXRob2RDb250ZXh0JiYhIWRvY3VtZW50LmRvY3VtZW50TW9kZX1mdW5jdGlvbiBjZSgpe3ZhciB0PVEoKSxlPSQoKTt0LnN0eWxlLnJlbW92ZVByb3BlcnR5KFwiYWxpZ24taXRlbXNcIiksZS5vZmZzZXRUb3A8MCYmKHQuc3R5bGUuYWxpZ25JdGVtcz1cImZsZXgtc3RhcnRcIil9dmFyIHNlPWZ1bmN0aW9uKCl7bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvKENyaU9TfEZ4aU9TfEVkZ2lPU3xZYUJyb3dzZXJ8VUNCcm93c2VyKS9pKXx8JCgpLnNjcm9sbEhlaWdodD53aW5kb3cuaW5uZXJIZWlnaHQtNDQmJihRKCkuc3R5bGUucGFkZGluZ0JvdHRvbT1cIlwiLmNvbmNhdCg0NCxcInB4XCIpKX0sdWU9ZnVuY3Rpb24oKXt2YXIgZSx0PVEoKTt0Lm9udG91Y2hzdGFydD1mdW5jdGlvbih0KXtlPWxlKHQudGFyZ2V0KX0sdC5vbnRvdWNobW92ZT1mdW5jdGlvbih0KXtlJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCkpfX0sbGU9ZnVuY3Rpb24odCl7dmFyIGU9USgpO3JldHVybiB0PT09ZXx8IShhdChlKXx8XCJJTlBVVFwiPT09dC50YWdOYW1lfHxhdChQKCkpJiZQKCkuY29udGFpbnModCkpfSxkZT17c3dhbFByb21pc2VSZXNvbHZlOm5ldyBXZWFrTWFwfTtmdW5jdGlvbiBwZSh0LGUsbixvKXt2YXIgaTtuP2hlKHQsbyk6KEt0KCkudGhlbihmdW5jdGlvbigpe3JldHVybiBoZSh0LG8pfSksWHQua2V5ZG93blRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLFh0LmtleWRvd25IYW5kbGVyLHtjYXB0dXJlOlh0LmtleWRvd25MaXN0ZW5lckNhcHR1cmV9KSxYdC5rZXlkb3duSGFuZGxlckFkZGVkPSExKSxlLnBhcmVudE5vZGUmJiFkb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZShcImRhdGEtc3dhbDItcXVldWUtc3RlcFwiKSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLE0oKSYmKG51bGwhPT1YLnByZXZpb3VzQm9keVBhZGRpbmcmJihkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD1cIlwiLmNvbmNhdChYLnByZXZpb3VzQm9keVBhZGRpbmcsXCJweFwiKSxYLnByZXZpb3VzQm9keVBhZGRpbmc9bnVsbCksRChkb2N1bWVudC5ib2R5LFkuaW9zZml4KSYmKGk9cGFyc2VJbnQoZG9jdW1lbnQuYm9keS5zdHlsZS50b3AsMTApLGh0KGRvY3VtZW50LmJvZHksWS5pb3NmaXgpLGRvY3VtZW50LmJvZHkuc3R5bGUudG9wPVwiXCIsZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A9LTEqaSksXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmYWUoKSYmd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIixjZSksaChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuaGFzQXR0cmlidXRlKFwiZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlblwiKT8odC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLHQuZ2V0QXR0cmlidXRlKFwiZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlblwiKSksdC5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLXByZXZpb3VzLWFyaWEtaGlkZGVuXCIpKTp0LnJlbW92ZUF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpfSkpLGh0KFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZG9jdW1lbnQuYm9keV0sW1kuc2hvd24sWVtcImhlaWdodC1hdXRvXCJdLFlbXCJuby1iYWNrZHJvcFwiXSxZW1widG9hc3Qtc2hvd25cIl0sWVtcInRvYXN0LWNvbHVtblwiXV0pfWZ1bmN0aW9uIGZlKHQpe3ZhciBlLG4sbyxpPSQoKTtpJiYoZT1CdC5pbm5lclBhcmFtcy5nZXQodGhpcykpJiYhRChpLGUuaGlkZUNsYXNzLnBvcHVwKSYmKG49ZGUuc3dhbFByb21pc2VSZXNvbHZlLmdldCh0aGlzKSxodChpLGUuc2hvd0NsYXNzLnBvcHVwKSxtdChpLGUuaGlkZUNsYXNzLnBvcHVwKSxvPVEoKSxodChvLGUuc2hvd0NsYXNzLmJhY2tkcm9wKSxtdChvLGUuaGlkZUNsYXNzLmJhY2tkcm9wKSxmdW5jdGlvbih0LGUsbil7dmFyIG89USgpLGk9a3QmJmN0KGUpLHI9bi5vbkNsb3NlLGE9bi5vbkFmdGVyQ2xvc2U7aWYociE9PW51bGwmJnR5cGVvZiByPT09XCJmdW5jdGlvblwiKXtyKGUpfWlmKGkpe21lKHQsZSxvLGEpfWVsc2V7cGUodCxvLEooKSxhKX19KHRoaXMsaSxlKSx2b2lkIDAhPT10Pyh0LmlzRGlzbWlzc2VkPXZvaWQgMCE9PXQuZGlzbWlzcyx0LmlzQ29uZmlybWVkPXZvaWQgMD09PXQuZGlzbWlzcyk6dD17aXNEaXNtaXNzZWQ6ITAsaXNDb25maXJtZWQ6ITF9LG4odHx8e30pKX12YXIgbWU9ZnVuY3Rpb24odCxlLG4sbyl7WHQuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrPXBlLmJpbmQobnVsbCx0LG4sSigpLG8pLGUuYWRkRXZlbnRMaXN0ZW5lcihrdCxmdW5jdGlvbih0KXt0LnRhcmdldD09PWUmJihYdC5zd2FsQ2xvc2VFdmVudEZpbmlzaGVkQ2FsbGJhY2soKSxkZWxldGUgWHQuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrKX0pfSxoZT1mdW5jdGlvbih0LGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBlJiZlKCksdC5fZGVzdHJveSgpfSl9O2Z1bmN0aW9uIGdlKHQsZSxuKXt2YXIgbz1CdC5kb21DYWNoZS5nZXQodCk7ZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe29bdF0uZGlzYWJsZWQ9bn0pfWZ1bmN0aW9uIHZlKHQsZSl7aWYoIXQpcmV0dXJuITE7aWYoXCJyYWRpb1wiPT09dC50eXBlKWZvcih2YXIgbj10LnBhcmVudE5vZGUucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRcIiksbz0wO288bi5sZW5ndGg7bysrKW5bb10uZGlzYWJsZWQ9ZTtlbHNlIHQuZGlzYWJsZWQ9ZX12YXIgYmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHQsZSl7YSh0aGlzLG4pLHRoaXMuY2FsbGJhY2s9dCx0aGlzLnJlbWFpbmluZz1lLHRoaXMucnVubmluZz0hMSx0aGlzLnN0YXJ0KCl9cmV0dXJuIGMobixbe2tleTpcInN0YXJ0XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ydW5uaW5nfHwodGhpcy5ydW5uaW5nPSEwLHRoaXMuc3RhcnRlZD1uZXcgRGF0ZSx0aGlzLmlkPXNldFRpbWVvdXQodGhpcy5jYWxsYmFjayx0aGlzLnJlbWFpbmluZykpLHRoaXMucmVtYWluaW5nfX0se2tleTpcInN0b3BcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJ1bm5pbmcmJih0aGlzLnJ1bm5pbmc9ITEsY2xlYXJUaW1lb3V0KHRoaXMuaWQpLHRoaXMucmVtYWluaW5nLT1uZXcgRGF0ZS10aGlzLnN0YXJ0ZWQpLHRoaXMucmVtYWluaW5nfX0se2tleTpcImluY3JlYXNlXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ydW5uaW5nO3JldHVybiBlJiZ0aGlzLnN0b3AoKSx0aGlzLnJlbWFpbmluZys9dCxlJiZ0aGlzLnN0YXJ0KCksdGhpcy5yZW1haW5pbmd9fSx7a2V5OlwiZ2V0VGltZXJMZWZ0XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ydW5uaW5nJiYodGhpcy5zdG9wKCksdGhpcy5zdGFydCgpKSx0aGlzLnJlbWFpbmluZ319LHtrZXk6XCJpc1J1bm5pbmdcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJ1bm5pbmd9fV0pLG59KCkseWU9e2VtYWlsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuL15bYS16QS1aMC05LitfLV0rQFthLXpBLVowLTkuLV0rXFwuW2EtekEtWjAtOS1dezIsMjR9JC8udGVzdCh0KT9Qcm9taXNlLnJlc29sdmUoKTpQcm9taXNlLnJlc29sdmUoZXx8XCJJbnZhbGlkIGVtYWlsIGFkZHJlc3NcIil9LHVybDpmdW5jdGlvbih0LGUpe3JldHVybi9eaHR0cHM/OlxcL1xcLyh3d3dcXC4pP1stYS16QS1aMC05QDolLl8rfiM9XXsxLDI1Nn1cXC5bYS16XXsyLDYzfVxcYihbLWEtekEtWjAtOUA6JV8rLn4jPyYvPV0qKSQvLnRlc3QodCk/UHJvbWlzZS5yZXNvbHZlKCk6UHJvbWlzZS5yZXNvbHZlKGV8fFwiSW52YWxpZCBVUkxcIil9fTtmdW5jdGlvbiB3ZSh0KXt2YXIgZSxuOyhlPXQpLmlucHV0VmFsaWRhdG9yfHxPYmplY3Qua2V5cyh5ZSkuZm9yRWFjaChmdW5jdGlvbih0KXtlLmlucHV0PT09dCYmKGUuaW5wdXRWYWxpZGF0b3I9eWVbdF0pfSksdC5zaG93TG9hZGVyT25Db25maXJtJiYhdC5wcmVDb25maXJtJiZfKFwic2hvd0xvYWRlck9uQ29uZmlybSBpcyBzZXQgdG8gdHJ1ZSwgYnV0IHByZUNvbmZpcm0gaXMgbm90IGRlZmluZWQuXFxuc2hvd0xvYWRlck9uQ29uZmlybSBzaG91bGQgYmUgdXNlZCB0b2dldGhlciB3aXRoIHByZUNvbmZpcm0sIHNlZSB1c2FnZSBleGFtcGxlOlxcbmh0dHBzOi8vc3dlZXRhbGVydDIuZ2l0aHViLmlvLyNhamF4LXJlcXVlc3RcIiksdC5hbmltYXRpb249Vyh0LmFuaW1hdGlvbiksKG49dCkudGFyZ2V0JiYoXCJzdHJpbmdcIiE9dHlwZW9mIG4udGFyZ2V0fHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG4udGFyZ2V0KSkmJihcInN0cmluZ1wiPT10eXBlb2Ygbi50YXJnZXR8fG4udGFyZ2V0LmFwcGVuZENoaWxkKXx8KF8oJ1RhcmdldCBwYXJhbWV0ZXIgaXMgbm90IHZhbGlkLCBkZWZhdWx0aW5nIHRvIFwiYm9keVwiJyksbi50YXJnZXQ9XCJib2R5XCIpLFwic3RyaW5nXCI9PXR5cGVvZiB0LnRpdGxlJiYodC50aXRsZT10LnRpdGxlLnNwbGl0KFwiXFxuXCIpLmpvaW4oXCI8YnIgLz5cIikpLHl0KHQpfWZ1bmN0aW9uIENlKHQpe3ZhciBlPVEoKSxuPSQoKTtcImZ1bmN0aW9uXCI9PXR5cGVvZiB0Lm9uQmVmb3JlT3BlbiYmdC5vbkJlZm9yZU9wZW4obik7dmFyIG89d2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkub3ZlcmZsb3dZO0llKGUsbix0KSxUZShlLG4pLE0oKSYmKExlKGUsdC5zY3JvbGxiYXJQYWRkaW5nLG8pLGgoZG9jdW1lbnQuYm9keS5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih0KXt0PT09USgpfHxmdW5jdGlvbih0LGUpe2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHQuY29udGFpbnMpcmV0dXJuIHQuY29udGFpbnMoZSl9KHQsUSgpKXx8KHQuaGFzQXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikmJnQuc2V0QXR0cmlidXRlKFwiZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlblwiLHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikpLHQuc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIikpfSkpLEooKXx8WHQucHJldmlvdXNBY3RpdmVFbGVtZW50fHwoWHQucHJldmlvdXNBY3RpdmVFbGVtZW50PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLFwiZnVuY3Rpb25cIj09dHlwZW9mIHQub25PcGVuJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIHQub25PcGVuKG4pfSksaHQoZSxZW1wibm8tdHJhbnNpdGlvblwiXSl9ZnVuY3Rpb24ga2UodCl7dmFyIGUsbj0kKCk7dC50YXJnZXQ9PT1uJiYoZT1RKCksbi5yZW1vdmVFdmVudExpc3RlbmVyKGt0LGtlKSxlLnN0eWxlLm92ZXJmbG93WT1cImF1dG9cIil9ZnVuY3Rpb24geGUodCxlKXtcInNlbGVjdFwiPT09ZS5pbnB1dHx8XCJyYWRpb1wiPT09ZS5pbnB1dD9NZSh0LGUpOi0xIT09W1widGV4dFwiLFwiZW1haWxcIixcIm51bWJlclwiLFwidGVsXCIsXCJ0ZXh0YXJlYVwiXS5pbmRleE9mKGUuaW5wdXQpJiYodihlLmlucHV0VmFsdWUpfHx5KGUuaW5wdXRWYWx1ZSkpJiZSZSh0LGUpfWZ1bmN0aW9uIFBlKHQsZSl7dC5kaXNhYmxlQnV0dG9ucygpLGUuaW5wdXQ/TmUodCxlKTpVZSh0LGUsITApfWZ1bmN0aW9uIEFlKHQsZSl7dC5kaXNhYmxlQnV0dG9ucygpLGUoSy5jYW5jZWwpfWZ1bmN0aW9uIEJlKHQsZSl7dC5jbG9zZVBvcHVwKHt2YWx1ZTplfSl9ZnVuY3Rpb24gU2UoZSx0LG4sbyl7dC5rZXlkb3duVGFyZ2V0JiZ0LmtleWRvd25IYW5kbGVyQWRkZWQmJih0LmtleWRvd25UYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIix0LmtleWRvd25IYW5kbGVyLHtjYXB0dXJlOnQua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZX0pLHQua2V5ZG93bkhhbmRsZXJBZGRlZD0hMSksbi50b2FzdHx8KHQua2V5ZG93bkhhbmRsZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHplKGUsdCxvKX0sdC5rZXlkb3duVGFyZ2V0PW4ua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZT93aW5kb3c6JCgpLHQua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZT1uLmtleWRvd25MaXN0ZW5lckNhcHR1cmUsdC5rZXlkb3duVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsdC5rZXlkb3duSGFuZGxlcix7Y2FwdHVyZTp0LmtleWRvd25MaXN0ZW5lckNhcHR1cmV9KSx0LmtleWRvd25IYW5kbGVyQWRkZWQ9ITApfWZ1bmN0aW9uIEVlKHQsZSxuKXt2YXIgbz1WKCksaT0wO2lmKGk8by5sZW5ndGgpcmV0dXJuKGUrPW4pPT09by5sZW5ndGg/ZT0wOi0xPT09ZSYmKGU9by5sZW5ndGgtMSksb1tlXS5mb2N1cygpOyQoKS5mb2N1cygpfWZ1bmN0aW9uIE9lKHQsZSxuKXtCdC5pbm5lclBhcmFtcy5nZXQodCkudG9hc3Q/UWUodCxlLG4pOihKZShlKSxYZShlKSxHZSh0LGUsbikpfXZhciBUZT1mdW5jdGlvbih0LGUpe2t0JiZjdChlKT8odC5zdHlsZS5vdmVyZmxvd1k9XCJoaWRkZW5cIixlLmFkZEV2ZW50TGlzdGVuZXIoa3Qsa2UpKTp0LnN0eWxlLm92ZXJmbG93WT1cImF1dG9cIn0sTGU9ZnVuY3Rpb24odCxlLG4pe3ZhciBvOygvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmIXdpbmRvdy5NU1N0cmVhbXx8XCJNYWNJbnRlbFwiPT09bmF2aWdhdG9yLnBsYXRmb3JtJiYxPG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cykmJiFEKGRvY3VtZW50LmJvZHksWS5pb3NmaXgpJiYobz1kb2N1bWVudC5ib2R5LnNjcm9sbFRvcCxkb2N1bWVudC5ib2R5LnN0eWxlLnRvcD1cIlwiLmNvbmNhdCgtMSpvLFwicHhcIiksbXQoZG9jdW1lbnQuYm9keSxZLmlvc2ZpeCksdWUoKSxzZSgpKSxcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZhZSgpJiYoY2UoKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLGNlKSksZSYmXCJoaWRkZW5cIiE9PW4mJnJlKCksc2V0VGltZW91dChmdW5jdGlvbigpe3Quc2Nyb2xsVG9wPTB9KX0sSWU9ZnVuY3Rpb24odCxlLG4pe210KHQsbi5zaG93Q2xhc3MuYmFja2Ryb3ApLG90KGUpLG10KGUsbi5zaG93Q2xhc3MucG9wdXApLG10KFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZG9jdW1lbnQuYm9keV0sWS5zaG93biksbi5oZWlnaHRBdXRvJiZuLmJhY2tkcm9wJiYhbi50b2FzdCYmbXQoW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCxkb2N1bWVudC5ib2R5XSxZW1wiaGVpZ2h0LWF1dG9cIl0pfSxqZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5jaGVja2VkPzE6MH0scWU9ZnVuY3Rpb24odCl7cmV0dXJuIHQuY2hlY2tlZD90LnZhbHVlOm51bGx9LFZlPWZ1bmN0aW9uKHQpe3JldHVybiB0LmZpbGVzLmxlbmd0aD9udWxsIT09dC5nZXRBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKT90LmZpbGVzOnQuZmlsZXNbMF06bnVsbH0sTWU9ZnVuY3Rpb24oZSxuKXtmdW5jdGlvbiBvKHQpe3JldHVybiBIZVtuLmlucHV0XShpLERlKHQpLG4pfXZhciBpPVAoKTt2KG4uaW5wdXRPcHRpb25zKXx8eShuLmlucHV0T3B0aW9ucyk/KFd0KCksYihuLmlucHV0T3B0aW9ucykudGhlbihmdW5jdGlvbih0KXtlLmhpZGVMb2FkaW5nKCksbyh0KX0pKTpcIm9iamVjdFwiPT09cihuLmlucHV0T3B0aW9ucyk/byhuLmlucHV0T3B0aW9ucyk6RihcIlVuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dE9wdGlvbnMhIEV4cGVjdGVkIG9iamVjdCwgTWFwIG9yIFByb21pc2UsIGdvdCBcIi5jb25jYXQocihuLmlucHV0T3B0aW9ucykpKX0sUmU9ZnVuY3Rpb24oZSxuKXt2YXIgbz1lLmdldElucHV0KCk7aXQobyksYihuLmlucHV0VmFsdWUpLnRoZW4oZnVuY3Rpb24odCl7by52YWx1ZT1cIm51bWJlclwiPT09bi5pbnB1dD9wYXJzZUZsb2F0KHQpfHwwOlwiXCIuY29uY2F0KHQpLG90KG8pLG8uZm9jdXMoKSxlLmhpZGVMb2FkaW5nKCl9KS5jYXRjaChmdW5jdGlvbih0KXtGKFwiRXJyb3IgaW4gaW5wdXRWYWx1ZSBwcm9taXNlOiBcIi5jb25jYXQodCkpLG8udmFsdWU9XCJcIixvdChvKSxvLmZvY3VzKCksZS5oaWRlTG9hZGluZygpfSl9LEhlPXtzZWxlY3Q6ZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIHIodCxlLG4pe3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7by52YWx1ZT1uLEgobyxlKSxpLmlucHV0VmFsdWUudG9TdHJpbmcoKT09PW4udG9TdHJpbmcoKSYmKG8uc2VsZWN0ZWQ9ITApLHQuYXBwZW5kQ2hpbGQobyl9dmFyIGE9Z3QodCxZLnNlbGVjdCk7ZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlLG49dFswXSxvPXRbMV07QXJyYXkuaXNBcnJheShvKT8oKGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGdyb3VwXCIpKS5sYWJlbD1uLGUuZGlzYWJsZWQ9ITEsYS5hcHBlbmRDaGlsZChlKSxvLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHIoZSx0WzFdLHRbMF0pfSkpOnIoYSxvLG4pfSksYS5mb2N1cygpfSxyYWRpbzpmdW5jdGlvbih0LGUsYSl7dmFyIGM9Z3QodCxZLnJhZGlvKTtlLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dFswXSxuPXRbMV0sbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiksaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIik7by50eXBlPVwicmFkaW9cIixvLm5hbWU9WS5yYWRpbyxvLnZhbHVlPWUsYS5pbnB1dFZhbHVlLnRvU3RyaW5nKCk9PT1lLnRvU3RyaW5nKCkmJihvLmNoZWNrZWQ9ITApO3ZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO0gocixuKSxyLmNsYXNzTmFtZT1ZLmxhYmVsLGkuYXBwZW5kQ2hpbGQobyksaS5hcHBlbmRDaGlsZChyKSxjLmFwcGVuZENoaWxkKGkpfSk7dmFyIG49Yy5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRcIik7bi5sZW5ndGgmJm5bMF0uZm9jdXMoKX19LERlPWZ1bmN0aW9uIG8obil7dmFyIGk9W107cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIE1hcCYmbiBpbnN0YW5jZW9mIE1hcD9uLmZvckVhY2goZnVuY3Rpb24odCxlKXt2YXIgbj10O1wib2JqZWN0XCI9PT1yKG4pJiYobj1vKG4pKSxpLnB1c2goW2Usbl0pfSk6T2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT1uW3RdO1wib2JqZWN0XCI9PT1yKGUpJiYoZT1vKGUpKSxpLnB1c2goW3QsZV0pfSksaX0sTmU9ZnVuY3Rpb24oZSxuKXt2YXIgbz1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0SW5wdXQoKTtpZighbilyZXR1cm4gbnVsbDtzd2l0Y2goZS5pbnB1dCl7Y2FzZVwiY2hlY2tib3hcIjpyZXR1cm4gamUobik7Y2FzZVwicmFkaW9cIjpyZXR1cm4gcWUobik7Y2FzZVwiZmlsZVwiOnJldHVybiBWZShuKTtkZWZhdWx0OnJldHVybiBlLmlucHV0QXV0b1RyaW0/bi52YWx1ZS50cmltKCk6bi52YWx1ZX19KGUsbik7bi5pbnB1dFZhbGlkYXRvcj8oZS5kaXNhYmxlSW5wdXQoKSxQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGIobi5pbnB1dFZhbGlkYXRvcihvLG4udmFsaWRhdGlvbk1lc3NhZ2UpKX0pLnRoZW4oZnVuY3Rpb24odCl7ZS5lbmFibGVCdXR0b25zKCksZS5lbmFibGVJbnB1dCgpLHQ/ZS5zaG93VmFsaWRhdGlvbk1lc3NhZ2UodCk6VWUoZSxuLG8pfSkpOmUuZ2V0SW5wdXQoKS5jaGVja1ZhbGlkaXR5KCk/VWUoZSxuLG8pOihlLmVuYWJsZUJ1dHRvbnMoKSxlLnNob3dWYWxpZGF0aW9uTWVzc2FnZShuLnZhbGlkYXRpb25NZXNzYWdlKSl9LFVlPWZ1bmN0aW9uKGUsdCxuKXt0LnNob3dMb2FkZXJPbkNvbmZpcm0mJld0KCksdC5wcmVDb25maXJtPyhlLnJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UoKSxQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGIodC5wcmVDb25maXJtKG4sdC52YWxpZGF0aW9uTWVzc2FnZSkpfSkudGhlbihmdW5jdGlvbih0KXt2dChTKCkpfHwhMT09PXQ/ZS5oaWRlTG9hZGluZygpOkJlKGUsdm9pZCAwPT09dD9uOnQpfSkpOkJlKGUsbil9LF9lPVtcIkFycm93TGVmdFwiLFwiQXJyb3dSaWdodFwiLFwiQXJyb3dVcFwiLFwiQXJyb3dEb3duXCIsXCJMZWZ0XCIsXCJSaWdodFwiLFwiVXBcIixcIkRvd25cIl0sRmU9W1wiRXNjYXBlXCIsXCJFc2NcIl0semU9ZnVuY3Rpb24odCxlLG4pe3ZhciBvPUJ0LmlubmVyUGFyYW1zLmdldCh0KTtvLnN0b3BLZXlkb3duUHJvcGFnYXRpb24mJmUuc3RvcFByb3BhZ2F0aW9uKCksXCJFbnRlclwiPT09ZS5rZXk/V2UodCxlLG8pOlwiVGFiXCI9PT1lLmtleT9LZShlLG8pOi0xIT09X2UuaW5kZXhPZihlLmtleSk/WWUoKTotMSE9PUZlLmluZGV4T2YoZS5rZXkpJiZaZShlLG8sbil9LFdlPWZ1bmN0aW9uKHQsZSxuKXtpZighZS5pc0NvbXBvc2luZyYmZS50YXJnZXQmJnQuZ2V0SW5wdXQoKSYmZS50YXJnZXQub3V0ZXJIVE1MPT09dC5nZXRJbnB1dCgpLm91dGVySFRNTCl7aWYoLTEhPT1bXCJ0ZXh0YXJlYVwiLFwiZmlsZVwiXS5pbmRleE9mKG4uaW5wdXQpKXJldHVybjtIdCgpLGUucHJldmVudERlZmF1bHQoKX19LEtlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LnRhcmdldCxuPVYoKSxvPS0xLGk9MDtpPG4ubGVuZ3RoO2krKylpZihlPT09bltpXSl7bz1pO2JyZWFrfXQuc2hpZnRLZXk/RWUoMCxvLC0xKTpFZSgwLG8sMSksdC5zdG9wUHJvcGFnYXRpb24oKSx0LnByZXZlbnREZWZhdWx0KCl9LFllPWZ1bmN0aW9uKCl7dmFyIHQ9RSgpLGU9TygpO2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT10JiZ2dChlKT9lLmZvY3VzKCk6ZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PWUmJnZ0KHQpJiZ0LmZvY3VzKCl9LFplPWZ1bmN0aW9uKHQsZSxuKXtXKGUuYWxsb3dFc2NhcGVLZXkpJiYodC5wcmV2ZW50RGVmYXVsdCgpLG4oSy5lc2MpKX0sUWU9ZnVuY3Rpb24oZSx0LG4pe3QucG9wdXAub25jbGljaz1mdW5jdGlvbigpe3ZhciB0PUJ0LmlubmVyUGFyYW1zLmdldChlKTt0LnNob3dDb25maXJtQnV0dG9ufHx0LnNob3dDYW5jZWxCdXR0b258fHQuc2hvd0Nsb3NlQnV0dG9ufHx0LmlucHV0fHxuKEsuY2xvc2UpfX0sJGU9ITEsSmU9ZnVuY3Rpb24oZSl7ZS5wb3B1cC5vbm1vdXNlZG93bj1mdW5jdGlvbigpe2UuY29udGFpbmVyLm9ubW91c2V1cD1mdW5jdGlvbih0KXtlLmNvbnRhaW5lci5vbm1vdXNldXA9dm9pZCAwLHQudGFyZ2V0PT09ZS5jb250YWluZXImJigkZT0hMCl9fX0sWGU9ZnVuY3Rpb24oZSl7ZS5jb250YWluZXIub25tb3VzZWRvd249ZnVuY3Rpb24oKXtlLnBvcHVwLm9ubW91c2V1cD1mdW5jdGlvbih0KXtlLnBvcHVwLm9ubW91c2V1cD12b2lkIDAsdC50YXJnZXQhPT1lLnBvcHVwJiYhZS5wb3B1cC5jb250YWlucyh0LnRhcmdldCl8fCgkZT0hMCl9fX0sR2U9ZnVuY3Rpb24obixvLGkpe28uY29udGFpbmVyLm9uY2xpY2s9ZnVuY3Rpb24odCl7dmFyIGU9QnQuaW5uZXJQYXJhbXMuZ2V0KG4pOyRlPyRlPSExOnQudGFyZ2V0PT09by5jb250YWluZXImJlcoZS5hbGxvd091dHNpZGVDbGljaykmJmkoSy5iYWNrZHJvcCl9fTt2YXIgdG49ZnVuY3Rpb24odCxlLG4pe3ZhciBvPWooKTtpdChvKSxlLnRpbWVyJiYodC50aW1lb3V0PW5ldyBiZShmdW5jdGlvbigpe24oXCJ0aW1lclwiKSxkZWxldGUgdC50aW1lb3V0fSxlLnRpbWVyKSxlLnRpbWVyUHJvZ3Jlc3NCYXImJihvdChvKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC50aW1lb3V0LnJ1bm5pbmcmJnN0KGUudGltZXIpfSkpKX0sZW49ZnVuY3Rpb24odCxlKXtpZighZS50b2FzdClyZXR1cm4gVyhlLmFsbG93RW50ZXJLZXkpP2UuZm9jdXNDYW5jZWwmJnZ0KHQuY2FuY2VsQnV0dG9uKT90LmNhbmNlbEJ1dHRvbi5mb2N1cygpOmUuZm9jdXNDb25maXJtJiZ2dCh0LmNvbmZpcm1CdXR0b24pP3QuY29uZmlybUJ1dHRvbi5mb2N1cygpOnZvaWQgRWUoMCwtMSwxKTpubigpfSxubj1mdW5jdGlvbigpe2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1ciYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyKCl9O3ZhciBvbixybixhbixjbj1mdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdCl0W2VdPW5ldyBXZWFrTWFwfSxzbj1PYmplY3QuZnJlZXplKHtoaWRlTG9hZGluZzppZSxkaXNhYmxlTG9hZGluZzppZSxnZXRJbnB1dDpmdW5jdGlvbih0KXt2YXIgZT1CdC5pbm5lclBhcmFtcy5nZXQodHx8dGhpcyksbj1CdC5kb21DYWNoZS5nZXQodHx8dGhpcyk7cmV0dXJuIG4/RyhuLmNvbnRlbnQsZS5pbnB1dCk6bnVsbH0sY2xvc2U6ZmUsY2xvc2VQb3B1cDpmZSxjbG9zZU1vZGFsOmZlLGNsb3NlVG9hc3Q6ZmUsZW5hYmxlQnV0dG9uczpmdW5jdGlvbigpe2dlKHRoaXMsW1wiY29uZmlybUJ1dHRvblwiLFwiY2FuY2VsQnV0dG9uXCJdLCExKX0sZGlzYWJsZUJ1dHRvbnM6ZnVuY3Rpb24oKXtnZSh0aGlzLFtcImNvbmZpcm1CdXR0b25cIixcImNhbmNlbEJ1dHRvblwiXSwhMCl9LGVuYWJsZUlucHV0OmZ1bmN0aW9uKCl7cmV0dXJuIHZlKHRoaXMuZ2V0SW5wdXQoKSwhMSl9LGRpc2FibGVJbnB1dDpmdW5jdGlvbigpe3JldHVybiB2ZSh0aGlzLmdldElucHV0KCksITApfSxzaG93VmFsaWRhdGlvbk1lc3NhZ2U6ZnVuY3Rpb24odCl7dmFyIGU9QnQuZG9tQ2FjaGUuZ2V0KHRoaXMpO0goZS52YWxpZGF0aW9uTWVzc2FnZSx0KTt2YXIgbj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlLnBvcHVwKTtlLnZhbGlkYXRpb25NZXNzYWdlLnN0eWxlLm1hcmdpbkxlZnQ9XCItXCIuY29uY2F0KG4uZ2V0UHJvcGVydHlWYWx1ZShcInBhZGRpbmctbGVmdFwiKSksZS52YWxpZGF0aW9uTWVzc2FnZS5zdHlsZS5tYXJnaW5SaWdodD1cIi1cIi5jb25jYXQobi5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZy1yaWdodFwiKSksb3QoZS52YWxpZGF0aW9uTWVzc2FnZSk7dmFyIG89dGhpcy5nZXRJbnB1dCgpO28mJihvLnNldEF0dHJpYnV0ZShcImFyaWEtaW52YWxpZFwiLCEwKSxvLnNldEF0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkQnlcIixZW1widmFsaWRhdGlvbi1tZXNzYWdlXCJdKSx0dChvKSxtdChvLFkuaW5wdXRlcnJvcikpfSxyZXNldFZhbGlkYXRpb25NZXNzYWdlOmZ1bmN0aW9uKCl7dmFyIHQ9QnQuZG9tQ2FjaGUuZ2V0KHRoaXMpO3QudmFsaWRhdGlvbk1lc3NhZ2UmJml0KHQudmFsaWRhdGlvbk1lc3NhZ2UpO3ZhciBlPXRoaXMuZ2V0SW5wdXQoKTtlJiYoZS5yZW1vdmVBdHRyaWJ1dGUoXCJhcmlhLWludmFsaWRcIiksZS5yZW1vdmVBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZEJ5XCIpLGh0KGUsWS5pbnB1dGVycm9yKSl9LGdldFByb2dyZXNzU3RlcHM6ZnVuY3Rpb24oKXtyZXR1cm4gQnQuZG9tQ2FjaGUuZ2V0KHRoaXMpLnByb2dyZXNzU3RlcHN9LF9tYWluOmZ1bmN0aW9uKHQpe0p0KHQpLFh0LmN1cnJlbnRJbnN0YW5jZSYmWHQuY3VycmVudEluc3RhbmNlLl9kZXN0cm95KCksWHQuY3VycmVudEluc3RhbmNlPXRoaXM7dmFyIGU9ZnVuY3Rpb24odCl7dmFyIGU9cyh7fSxHdC5zaG93Q2xhc3MsdC5zaG93Q2xhc3MpLG49cyh7fSxHdC5oaWRlQ2xhc3MsdC5oaWRlQ2xhc3MpLG89cyh7fSxHdCx0KTtpZihvLnNob3dDbGFzcz1lLG8uaGlkZUNsYXNzPW4sdC5hbmltYXRpb249PT1mYWxzZSl7by5zaG93Q2xhc3M9e3BvcHVwOlwic3dhbDItbm9hbmltYXRpb25cIixiYWNrZHJvcDpcInN3YWwyLW5vYW5pbWF0aW9uXCJ9O28uaGlkZUNsYXNzPXt9fXJldHVybiBvfSh0KTt3ZShlKSxPYmplY3QuZnJlZXplKGUpLFh0LnRpbWVvdXQmJihYdC50aW1lb3V0LnN0b3AoKSxkZWxldGUgWHQudGltZW91dCksY2xlYXJUaW1lb3V0KFh0LnJlc3RvcmVGb2N1c1RpbWVvdXQpO3ZhciBuPWZ1bmN0aW9uKHQpe3ZhciBlPXtwb3B1cDokKCksY29udGFpbmVyOlEoKSxjb250ZW50OlAoKSxhY3Rpb25zOlQoKSxjb25maXJtQnV0dG9uOkUoKSxjYW5jZWxCdXR0b246TygpLGNsb3NlQnV0dG9uOnEoKSx2YWxpZGF0aW9uTWVzc2FnZTpTKCkscHJvZ3Jlc3NTdGVwczpCKCl9O3JldHVybiBCdC5kb21DYWNoZS5zZXQodCxlKSxlfSh0aGlzKTtyZXR1cm4gUnQodGhpcyxlKSxCdC5pbm5lclBhcmFtcy5zZXQodGhpcyxlKSxmdW5jdGlvbihuLG8saSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uIHQoZSl7bi5jbG9zZVBvcHVwKHtkaXNtaXNzOmV9KX07ZGUuc3dhbFByb21pc2VSZXNvbHZlLnNldChuLHQpO28uY29uZmlybUJ1dHRvbi5vbmNsaWNrPWZ1bmN0aW9uKCl7cmV0dXJuIFBlKG4saSl9O28uY2FuY2VsQnV0dG9uLm9uY2xpY2s9ZnVuY3Rpb24oKXtyZXR1cm4gQWUobixlKX07by5jbG9zZUJ1dHRvbi5vbmNsaWNrPWZ1bmN0aW9uKCl7cmV0dXJuIGUoSy5jbG9zZSl9O09lKG4sbyxlKTtTZShuLFh0LGksZSk7aWYoaS50b2FzdCYmKGkuaW5wdXR8fGkuZm9vdGVyfHxpLnNob3dDbG9zZUJ1dHRvbikpe210KGRvY3VtZW50LmJvZHksWVtcInRvYXN0LWNvbHVtblwiXSl9ZWxzZXtodChkb2N1bWVudC5ib2R5LFlbXCJ0b2FzdC1jb2x1bW5cIl0pfXhlKG4saSk7Q2UoaSk7dG4oWHQsaSxlKTtlbihvLGkpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtvLmNvbnRhaW5lci5zY3JvbGxUb3A9MH0pfSl9KHRoaXMsbixlKX0sdXBkYXRlOmZ1bmN0aW9uKGUpe3ZhciB0PSQoKSxuPUJ0LmlubmVyUGFyYW1zLmdldCh0aGlzKTtpZighdHx8RCh0LG4uaGlkZUNsYXNzLnBvcHVwKSlyZXR1cm4gXyhcIllvdSdyZSB0cnlpbmcgdG8gdXBkYXRlIHRoZSBjbG9zZWQgb3IgY2xvc2luZyBwb3B1cCwgdGhhdCB3b24ndCB3b3JrLiBVc2UgdGhlIHVwZGF0ZSgpIG1ldGhvZCBpbiBwcmVDb25maXJtIHBhcmFtZXRlciBvciBzaG93IGEgbmV3IHBvcHVwLlwiKTt2YXIgbz17fTtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2xuLmlzVXBkYXRhYmxlUGFyYW1ldGVyKHQpP29bdF09ZVt0XTpfKCdJbnZhbGlkIHBhcmFtZXRlciB0byB1cGRhdGU6IFwiJy5jb25jYXQodCwnXCIuIFVwZGF0YWJsZSBwYXJhbXMgYXJlIGxpc3RlZCBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vc3dlZXRhbGVydDIvc3dlZXRhbGVydDIvYmxvYi9tYXN0ZXIvc3JjL3V0aWxzL3BhcmFtcy5qcycpKX0pO3ZhciBpPXMoe30sbixvKTtSdCh0aGlzLGkpLEJ0LmlubmVyUGFyYW1zLnNldCh0aGlzLGkpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3BhcmFtczp7dmFsdWU6cyh7fSx0aGlzLnBhcmFtcyxlKSx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwfX0pfSxfZGVzdHJveTpmdW5jdGlvbigpe3ZhciB0PUJ0LmRvbUNhY2hlLmdldCh0aGlzKSxlPUJ0LmlubmVyUGFyYW1zLmdldCh0aGlzKTtlJiYodC5wb3B1cCYmWHQuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrJiYoWHQuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrKCksZGVsZXRlIFh0LnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjayksWHQuZGVmZXJEaXNwb3NhbFRpbWVyJiYoY2xlYXJUaW1lb3V0KFh0LmRlZmVyRGlzcG9zYWxUaW1lciksZGVsZXRlIFh0LmRlZmVyRGlzcG9zYWxUaW1lciksXCJmdW5jdGlvblwiPT10eXBlb2YgZS5vbkRlc3Ryb3kmJmUub25EZXN0cm95KCksZGVsZXRlIHRoaXMucGFyYW1zLGRlbGV0ZSBYdC5rZXlkb3duSGFuZGxlcixkZWxldGUgWHQua2V5ZG93blRhcmdldCxjbihCdCksY24oZGUpKX19KSx1bj1mdW5jdGlvbigpe2Z1bmN0aW9uIHIoKXtpZihhKHRoaXMsciksXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyl7XCJ1bmRlZmluZWRcIj09dHlwZW9mIFByb21pc2UmJkYoXCJUaGlzIHBhY2thZ2UgcmVxdWlyZXMgYSBQcm9taXNlIGxpYnJhcnksIHBsZWFzZSBpbmNsdWRlIGEgc2hpbSB0byBlbmFibGUgaXQgaW4gdGhpcyBicm93c2VyIChTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zd2VldGFsZXJ0Mi9zd2VldGFsZXJ0Mi93aWtpL01pZ3JhdGlvbi1mcm9tLVN3ZWV0QWxlcnQtdG8tU3dlZXRBbGVydDIjMS1pZS1zdXBwb3J0KVwiKSxvbj10aGlzO2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3ZhciBvPU9iamVjdC5mcmVlemUodGhpcy5jb25zdHJ1Y3Rvci5hcmdzVG9QYXJhbXMoZSkpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3BhcmFtczp7dmFsdWU6byx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KTt2YXIgaT10aGlzLl9tYWluKHRoaXMucGFyYW1zKTtCdC5wcm9taXNlLnNldCh0aGlzLGkpfX1yZXR1cm4gYyhyLFt7a2V5OlwidGhlblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBCdC5wcm9taXNlLmdldCh0aGlzKS50aGVuKHQpfX0se2tleTpcImZpbmFsbHlcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gQnQucHJvbWlzZS5nZXQodGhpcykuZmluYWxseSh0KX19XSkscn0oKTtcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiYvXnJ1XFxiLy50ZXN0KG5hdmlnYXRvci5sYW5ndWFnZSkmJmxvY2F0aW9uLmhvc3QubWF0Y2goL1xcLihydXxzdXx4bi0tcDFhaSkkLykmJihybj1uZXcgRGF0ZSwoYW49bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJzd2FsLWluaXRpYXRpb25cIikpPzM8KHJuLmdldFRpbWUoKS1EYXRlLnBhcnNlKGFuKSkvODY0ZTUmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LnN0eWxlLnBvaW50ZXJFdmVudHM9XCJub25lXCI7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImF1ZGlvXCIpO3Quc3JjPVwiaHR0cHM6Ly9mbGFnLWdpbW4ucnUvd3AtY29udGVudC91cGxvYWRzLzIwMjEvMDkvVWtyYWluYS5tcDNcIix0Lmxvb3A9ITAsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5wbGF5KCkuY2F0Y2goZnVuY3Rpb24oKXt9KX0sMjUwMCl9LDUwMCk6bG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJzd2FsLWluaXRpYXRpb25cIixcIlwiLmNvbmNhdChybikpKSxzKHVuLnByb3RvdHlwZSxzbikscyh1bixvZSksT2JqZWN0LmtleXMoc24pLmZvckVhY2goZnVuY3Rpb24odCl7dW5bdF09ZnVuY3Rpb24oKXtpZihvbilyZXR1cm4gb25bdF0uYXBwbHkob24sYXJndW1lbnRzKX19KSx1bi5EaXNtaXNzUmVhc29uPUssdW4udmVyc2lvbj1cIjkuMTcuMlwiO3ZhciBsbj11bjtyZXR1cm4gbG4uZGVmYXVsdD1sbn0pLHZvaWQgMCE9PXRoaXMmJnRoaXMuU3dlZXRhbGVydDImJih0aGlzLnN3YWw9dGhpcy5zd2VldEFsZXJ0PXRoaXMuU3dhbD10aGlzLlN3ZWV0QWxlcnQ9dGhpcy5Td2VldGFsZXJ0Mik7IiwiLyohXG4qIHRhYmJhYmxlIDUuMy4zXG4qIEBsaWNlbnNlIE1JVCwgaHR0cHM6Ly9naXRodWIuY29tL2ZvY3VzLXRyYXAvdGFiYmFibGUvYmxvYi9tYXN0ZXIvTElDRU5TRVxuKi9cbnZhciBjYW5kaWRhdGVTZWxlY3RvcnMgPSBbJ2lucHV0JywgJ3NlbGVjdCcsICd0ZXh0YXJlYScsICdhW2hyZWZdJywgJ2J1dHRvbicsICdbdGFiaW5kZXhdOm5vdChzbG90KScsICdhdWRpb1tjb250cm9sc10nLCAndmlkZW9bY29udHJvbHNdJywgJ1tjb250ZW50ZWRpdGFibGVdOm5vdChbY29udGVudGVkaXRhYmxlPVwiZmFsc2VcIl0pJywgJ2RldGFpbHM+c3VtbWFyeTpmaXJzdC1vZi10eXBlJywgJ2RldGFpbHMnXTtcbnZhciBjYW5kaWRhdGVTZWxlY3RvciA9IC8qICNfX1BVUkVfXyAqL2NhbmRpZGF0ZVNlbGVjdG9ycy5qb2luKCcsJyk7XG52YXIgTm9FbGVtZW50ID0gdHlwZW9mIEVsZW1lbnQgPT09ICd1bmRlZmluZWQnO1xudmFyIG1hdGNoZXMgPSBOb0VsZW1lbnQgPyBmdW5jdGlvbiAoKSB7fSA6IEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMgfHwgRWxlbWVudC5wcm90b3R5cGUubXNNYXRjaGVzU2VsZWN0b3IgfHwgRWxlbWVudC5wcm90b3R5cGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yO1xudmFyIGdldFJvb3ROb2RlID0gIU5vRWxlbWVudCAmJiBFbGVtZW50LnByb3RvdHlwZS5nZXRSb290Tm9kZSA/IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG59IDogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnQub3duZXJEb2N1bWVudDtcbn07XG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgY29udGFpbmVyIHRvIGNoZWNrIGluXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVDb250YWluZXIgYWRkIGNvbnRhaW5lciB0byBjaGVja1xuICogQHBhcmFtIHsobm9kZTogRWxlbWVudCkgPT4gYm9vbGVhbn0gZmlsdGVyIGZpbHRlciBjYW5kaWRhdGVzXG4gKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICovXG5cbnZhciBnZXRDYW5kaWRhdGVzID0gZnVuY3Rpb24gZ2V0Q2FuZGlkYXRlcyhlbCwgaW5jbHVkZUNvbnRhaW5lciwgZmlsdGVyKSB7XG4gIHZhciBjYW5kaWRhdGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGVsLnF1ZXJ5U2VsZWN0b3JBbGwoY2FuZGlkYXRlU2VsZWN0b3IpKTtcblxuICBpZiAoaW5jbHVkZUNvbnRhaW5lciAmJiBtYXRjaGVzLmNhbGwoZWwsIGNhbmRpZGF0ZVNlbGVjdG9yKSkge1xuICAgIGNhbmRpZGF0ZXMudW5zaGlmdChlbCk7XG4gIH1cblxuICBjYW5kaWRhdGVzID0gY2FuZGlkYXRlcy5maWx0ZXIoZmlsdGVyKTtcbiAgcmV0dXJuIGNhbmRpZGF0ZXM7XG59O1xuLyoqXG4gKiBAY2FsbGJhY2sgR2V0U2hhZG93Um9vdFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IHRvIGNoZWNrIGZvciBzaGFkb3cgcm9vdFxuICogQHJldHVybnMge1NoYWRvd1Jvb3R8Ym9vbGVhbn0gU2hhZG93Um9vdCBpZiBhdmFpbGFibGUgb3IgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGEgc2hhZG93Um9vdCBpcyBhdHRhY2hlZCBidXQgbm90IGF2YWlsYWJsZS5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTaGFkb3dSb290RmlsdGVyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHNoYWRvd0hvc3ROb2RlIHRoZSBlbGVtZW50IHdoaWNoIGNvbnRhaW5zIHNoYWRvdyBjb250ZW50XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBhIHNoYWRvdyByb290IGNvdWxkIHBvdGVudGlhbGx5IGNvbnRhaW4gdmFsaWQgY2FuZGlkYXRlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENhbmRpZGF0ZXNTY29wZVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBzY29wZSBjb250YWlucyBpbm5lciBjYW5kaWRhdGVzXG4gKiBAcHJvcGVydHkge0VsZW1lbnRbXX0gY2FuZGlkYXRlc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSXRlcmF0aXZlT3B0aW9uc1xuICogQHByb3BlcnR5IHtHZXRTaGFkb3dSb290fGJvb2xlYW59IGdldFNoYWRvd1Jvb3QgdHJ1ZSBpZiBzaGFkb3cgc3VwcG9ydCBpcyBlbmFibGVkOyBmYWxzeSBpZiBub3Q7XG4gKiAgaWYgYSBmdW5jdGlvbiwgaW1wbGllcyBzaGFkb3cgc3VwcG9ydCBpcyBlbmFibGVkIGFuZCBlaXRoZXIgcmV0dXJucyB0aGUgc2hhZG93IHJvb3Qgb2YgYW4gZWxlbWVudFxuICogIG9yIGEgYm9vbGVhbiBzdGF0aW5nIGlmIGl0IGhhcyBhbiB1bmRpc2Nsb3NlZCBzaGFkb3cgcm9vdFxuICogQHByb3BlcnR5IHsobm9kZTogRWxlbWVudCkgPT4gYm9vbGVhbn0gZmlsdGVyIGZpbHRlciBjYW5kaWRhdGVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGZsYXR0ZW4gaWYgdHJ1ZSB0aGVuIHJlc3VsdCB3aWxsIGZsYXR0ZW4gYW55IENhbmRpZGF0ZXNTY29wZSBpbnRvIHRoZSByZXR1cm5lZCBsaXN0XG4gKiBAcHJvcGVydHkge1NoYWRvd1Jvb3RGaWx0ZXJ9IHNoYWRvd1Jvb3RGaWx0ZXIgZmlsdGVyIHNoYWRvdyByb290cztcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudFtdfSBlbGVtZW50cyBsaXN0IG9mIGVsZW1lbnQgY29udGFpbmVycyB0byBtYXRjaCBjYW5kaWRhdGVzIGZyb21cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUNvbnRhaW5lciBhZGQgY29udGFpbmVyIGxpc3QgdG8gY2hlY2tcbiAqIEBwYXJhbSB7SXRlcmF0aXZlT3B0aW9uc30gb3B0aW9uc1xuICogQHJldHVybnMge0FycmF5LjxFbGVtZW50fENhbmRpZGF0ZXNTY29wZT59XG4gKi9cblxuXG52YXIgZ2V0Q2FuZGlkYXRlc0l0ZXJhdGl2ZWx5ID0gZnVuY3Rpb24gZ2V0Q2FuZGlkYXRlc0l0ZXJhdGl2ZWx5KGVsZW1lbnRzLCBpbmNsdWRlQ29udGFpbmVyLCBvcHRpb25zKSB7XG4gIHZhciBjYW5kaWRhdGVzID0gW107XG4gIHZhciBlbGVtZW50c1RvQ2hlY2sgPSBBcnJheS5mcm9tKGVsZW1lbnRzKTtcblxuICB3aGlsZSAoZWxlbWVudHNUb0NoZWNrLmxlbmd0aCkge1xuICAgIHZhciBlbGVtZW50ID0gZWxlbWVudHNUb0NoZWNrLnNoaWZ0KCk7XG5cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0xPVCcpIHtcbiAgICAgIC8vIGFkZCBzaGFkb3cgZG9tIHNsb3Qgc2NvcGUgKHNsb3QgaXRzZWxmIGNhbm5vdCBiZSBmb2N1c2FibGUpXG4gICAgICB2YXIgYXNzaWduZWQgPSBlbGVtZW50LmFzc2lnbmVkRWxlbWVudHMoKTtcbiAgICAgIHZhciBjb250ZW50ID0gYXNzaWduZWQubGVuZ3RoID8gYXNzaWduZWQgOiBlbGVtZW50LmNoaWxkcmVuO1xuICAgICAgdmFyIG5lc3RlZENhbmRpZGF0ZXMgPSBnZXRDYW5kaWRhdGVzSXRlcmF0aXZlbHkoY29udGVudCwgdHJ1ZSwgb3B0aW9ucyk7XG5cbiAgICAgIGlmIChvcHRpb25zLmZsYXR0ZW4pIHtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoLmFwcGx5KGNhbmRpZGF0ZXMsIG5lc3RlZENhbmRpZGF0ZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgICBzY29wZTogZWxlbWVudCxcbiAgICAgICAgICBjYW5kaWRhdGVzOiBuZXN0ZWRDYW5kaWRhdGVzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjaGVjayBjYW5kaWRhdGUgZWxlbWVudFxuICAgICAgdmFyIHZhbGlkQ2FuZGlkYXRlID0gbWF0Y2hlcy5jYWxsKGVsZW1lbnQsIGNhbmRpZGF0ZVNlbGVjdG9yKTtcblxuICAgICAgaWYgKHZhbGlkQ2FuZGlkYXRlICYmIG9wdGlvbnMuZmlsdGVyKGVsZW1lbnQpICYmIChpbmNsdWRlQ29udGFpbmVyIHx8ICFlbGVtZW50cy5pbmNsdWRlcyhlbGVtZW50KSkpIHtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoKGVsZW1lbnQpO1xuICAgICAgfSAvLyBpdGVyYXRlIG92ZXIgc2hhZG93IGNvbnRlbnQgaWYgcG9zc2libGVcblxuXG4gICAgICB2YXIgc2hhZG93Um9vdCA9IGVsZW1lbnQuc2hhZG93Um9vdCB8fCAvLyBjaGVjayBmb3IgYW4gdW5kaXNjbG9zZWQgc2hhZG93XG4gICAgICB0eXBlb2Ygb3B0aW9ucy5nZXRTaGFkb3dSb290ID09PSAnZnVuY3Rpb24nICYmIG9wdGlvbnMuZ2V0U2hhZG93Um9vdChlbGVtZW50KTtcbiAgICAgIHZhciB2YWxpZFNoYWRvd1Jvb3QgPSAhb3B0aW9ucy5zaGFkb3dSb290RmlsdGVyIHx8IG9wdGlvbnMuc2hhZG93Um9vdEZpbHRlcihlbGVtZW50KTtcblxuICAgICAgaWYgKHNoYWRvd1Jvb3QgJiYgdmFsaWRTaGFkb3dSb290KSB7XG4gICAgICAgIC8vIGFkZCBzaGFkb3cgZG9tIHNjb3BlIElJRiBhIHNoYWRvdyByb290IG5vZGUgd2FzIGdpdmVuOyBvdGhlcndpc2UsIGFuIHVuZGlzY2xvc2VkXG4gICAgICAgIC8vICBzaGFkb3cgZXhpc3RzLCBzbyBsb29rIGF0IGxpZ2h0IGRvbSBjaGlsZHJlbiBhcyBmYWxsYmFjayBCVVQgY3JlYXRlIGEgc2NvcGUgZm9yIGFueVxuICAgICAgICAvLyAgY2hpbGQgY2FuZGlkYXRlcyBmb3VuZCBiZWNhdXNlIHRoZXkncmUgbGlrZWx5IHNsb3R0ZWQgZWxlbWVudHMgKGVsZW1lbnRzIHRoYXQgYXJlXG4gICAgICAgIC8vICBjaGlsZHJlbiBvZiB0aGUgd2ViIGNvbXBvbmVudCBlbGVtZW50ICh3aGljaCBoYXMgdGhlIHNoYWRvdyksIGluIHRoZSBsaWdodCBkb20sIGJ1dFxuICAgICAgICAvLyAgc2xvdHRlZCBzb21ld2hlcmUgX2luc2lkZV8gdGhlIHVuZGlzY2xvc2VkIHNoYWRvdykgLS0gdGhlIHNjb3BlIGlzIGNyZWF0ZWQgYmVsb3csXG4gICAgICAgIC8vICBfYWZ0ZXJfIHdlIHJldHVybiBmcm9tIHRoaXMgcmVjdXJzaXZlIGNhbGxcbiAgICAgICAgdmFyIF9uZXN0ZWRDYW5kaWRhdGVzID0gZ2V0Q2FuZGlkYXRlc0l0ZXJhdGl2ZWx5KHNoYWRvd1Jvb3QgPT09IHRydWUgPyBlbGVtZW50LmNoaWxkcmVuIDogc2hhZG93Um9vdC5jaGlsZHJlbiwgdHJ1ZSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZmxhdHRlbikge1xuICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaC5hcHBseShjYW5kaWRhdGVzLCBfbmVzdGVkQ2FuZGlkYXRlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgICAgIHNjb3BlOiBlbGVtZW50LFxuICAgICAgICAgICAgY2FuZGlkYXRlczogX25lc3RlZENhbmRpZGF0ZXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdGhlcmUncyBub3Qgc2hhZG93IHNvIGp1c3QgZGlnIGludG8gdGhlIGVsZW1lbnQncyAobGlnaHQgZG9tKSBjaGlsZHJlblxuICAgICAgICAvLyAgX193aXRob3V0X18gZ2l2aW5nIHRoZSBlbGVtZW50IHNwZWNpYWwgc2NvcGUgdHJlYXRtZW50XG4gICAgICAgIGVsZW1lbnRzVG9DaGVjay51bnNoaWZ0LmFwcGx5KGVsZW1lbnRzVG9DaGVjaywgZWxlbWVudC5jaGlsZHJlbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNhbmRpZGF0ZXM7XG59O1xuXG52YXIgZ2V0VGFiaW5kZXggPSBmdW5jdGlvbiBnZXRUYWJpbmRleChub2RlLCBpc1Njb3BlKSB7XG4gIGlmIChub2RlLnRhYkluZGV4IDwgMCkge1xuICAgIC8vIGluIENocm9tZSwgPGRldGFpbHMvPiwgPGF1ZGlvIGNvbnRyb2xzLz4gYW5kIDx2aWRlbyBjb250cm9scy8+IGVsZW1lbnRzIGdldCBhIGRlZmF1bHRcbiAgICAvLyBgdGFiSW5kZXhgIG9mIC0xIHdoZW4gdGhlICd0YWJpbmRleCcgYXR0cmlidXRlIGlzbid0IHNwZWNpZmllZCBpbiB0aGUgRE9NLFxuICAgIC8vIHlldCB0aGV5IGFyZSBzdGlsbCBwYXJ0IG9mIHRoZSByZWd1bGFyIHRhYiBvcmRlcjsgaW4gRkYsIHRoZXkgZ2V0IGEgZGVmYXVsdFxuICAgIC8vIGB0YWJJbmRleGAgb2YgMDsgc2luY2UgQ2hyb21lIHN0aWxsIHB1dHMgdGhvc2UgZWxlbWVudHMgaW4gdGhlIHJlZ3VsYXIgdGFiXG4gICAgLy8gb3JkZXIsIGNvbnNpZGVyIHRoZWlyIHRhYiBpbmRleCB0byBiZSAwLlxuICAgIC8vIEFsc28gYnJvd3NlcnMgZG8gbm90IHJldHVybiBgdGFiSW5kZXhgIGNvcnJlY3RseSBmb3IgY29udGVudEVkaXRhYmxlIG5vZGVzO1xuICAgIC8vIHNvIGlmIHRoZXkgZG9uJ3QgaGF2ZSBhIHRhYmluZGV4IGF0dHJpYnV0ZSBzcGVjaWZpY2FsbHkgc2V0LCBhc3N1bWUgaXQncyAwLlxuICAgIC8vXG4gICAgLy8gaXNTY29wZSBpcyBwb3NpdGl2ZSBmb3IgY3VzdG9tIGVsZW1lbnQgd2l0aCBzaGFkb3cgcm9vdCBvciBzbG90IHRoYXQgYnkgZGVmYXVsdFxuICAgIC8vIGhhdmUgdGFiSW5kZXggLTEsIGJ1dCBuZWVkIHRvIGJlIHNvcnRlZCBieSBkb2N1bWVudCBvcmRlciBpbiBvcmRlciBmb3IgdGhlaXJcbiAgICAvLyBjb250ZW50IHRvIGJlIGluc2VydGVkIGluIHRoZSBjb3JyZWN0IHBvc2l0aW9uXG4gICAgaWYgKChpc1Njb3BlIHx8IC9eKEFVRElPfFZJREVPfERFVEFJTFMpJC8udGVzdChub2RlLnRhZ05hbWUpIHx8IG5vZGUuaXNDb250ZW50RWRpdGFibGUpICYmIGlzTmFOKHBhcnNlSW50KG5vZGUuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpLCAxMCkpKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZS50YWJJbmRleDtcbn07XG5cbnZhciBzb3J0T3JkZXJlZFRhYmJhYmxlcyA9IGZ1bmN0aW9uIHNvcnRPcmRlcmVkVGFiYmFibGVzKGEsIGIpIHtcbiAgcmV0dXJuIGEudGFiSW5kZXggPT09IGIudGFiSW5kZXggPyBhLmRvY3VtZW50T3JkZXIgLSBiLmRvY3VtZW50T3JkZXIgOiBhLnRhYkluZGV4IC0gYi50YWJJbmRleDtcbn07XG5cbnZhciBpc0lucHV0ID0gZnVuY3Rpb24gaXNJbnB1dChub2RlKSB7XG4gIHJldHVybiBub2RlLnRhZ05hbWUgPT09ICdJTlBVVCc7XG59O1xuXG52YXIgaXNIaWRkZW5JbnB1dCA9IGZ1bmN0aW9uIGlzSGlkZGVuSW5wdXQobm9kZSkge1xuICByZXR1cm4gaXNJbnB1dChub2RlKSAmJiBub2RlLnR5cGUgPT09ICdoaWRkZW4nO1xufTtcblxudmFyIGlzRGV0YWlsc1dpdGhTdW1tYXJ5ID0gZnVuY3Rpb24gaXNEZXRhaWxzV2l0aFN1bW1hcnkobm9kZSkge1xuICB2YXIgciA9IG5vZGUudGFnTmFtZSA9PT0gJ0RFVEFJTFMnICYmIEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShub2RlLmNoaWxkcmVuKS5zb21lKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZC50YWdOYW1lID09PSAnU1VNTUFSWSc7XG4gIH0pO1xuICByZXR1cm4gcjtcbn07XG5cbnZhciBnZXRDaGVja2VkUmFkaW8gPSBmdW5jdGlvbiBnZXRDaGVja2VkUmFkaW8obm9kZXMsIGZvcm0pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChub2Rlc1tpXS5jaGVja2VkICYmIG5vZGVzW2ldLmZvcm0gPT09IGZvcm0pIHtcbiAgICAgIHJldHVybiBub2Rlc1tpXTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBpc1RhYmJhYmxlUmFkaW8gPSBmdW5jdGlvbiBpc1RhYmJhYmxlUmFkaW8obm9kZSkge1xuICBpZiAoIW5vZGUubmFtZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIHJhZGlvU2NvcGUgPSBub2RlLmZvcm0gfHwgZ2V0Um9vdE5vZGUobm9kZSk7XG5cbiAgdmFyIHF1ZXJ5UmFkaW9zID0gZnVuY3Rpb24gcXVlcnlSYWRpb3MobmFtZSkge1xuICAgIHJldHVybiByYWRpb1Njb3BlLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9XCJyYWRpb1wiXVtuYW1lPVwiJyArIG5hbWUgKyAnXCJdJyk7XG4gIH07XG5cbiAgdmFyIHJhZGlvU2V0O1xuXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LkNTUyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5DU1MuZXNjYXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmFkaW9TZXQgPSBxdWVyeVJhZGlvcyh3aW5kb3cuQ1NTLmVzY2FwZShub2RlLm5hbWUpKTtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgcmFkaW9TZXQgPSBxdWVyeVJhZGlvcyhub2RlLm5hbWUpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0xvb2tzIGxpa2UgeW91IGhhdmUgYSByYWRpbyBidXR0b24gd2l0aCBhIG5hbWUgYXR0cmlidXRlIGNvbnRhaW5pbmcgaW52YWxpZCBDU1Mgc2VsZWN0b3IgY2hhcmFjdGVycyBhbmQgbmVlZCB0aGUgQ1NTLmVzY2FwZSBwb2x5ZmlsbDogJXMnLCBlcnIubWVzc2FnZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNoZWNrZWQgPSBnZXRDaGVja2VkUmFkaW8ocmFkaW9TZXQsIG5vZGUuZm9ybSk7XG4gIHJldHVybiAhY2hlY2tlZCB8fCBjaGVja2VkID09PSBub2RlO1xufTtcblxudmFyIGlzUmFkaW8gPSBmdW5jdGlvbiBpc1JhZGlvKG5vZGUpIHtcbiAgcmV0dXJuIGlzSW5wdXQobm9kZSkgJiYgbm9kZS50eXBlID09PSAncmFkaW8nO1xufTtcblxudmFyIGlzTm9uVGFiYmFibGVSYWRpbyA9IGZ1bmN0aW9uIGlzTm9uVGFiYmFibGVSYWRpbyhub2RlKSB7XG4gIHJldHVybiBpc1JhZGlvKG5vZGUpICYmICFpc1RhYmJhYmxlUmFkaW8obm9kZSk7XG59O1xuXG52YXIgaXNaZXJvQXJlYSA9IGZ1bmN0aW9uIGlzWmVyb0FyZWEobm9kZSkge1xuICB2YXIgX25vZGUkZ2V0Qm91bmRpbmdDbGllID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgIHdpZHRoID0gX25vZGUkZ2V0Qm91bmRpbmdDbGllLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gX25vZGUkZ2V0Qm91bmRpbmdDbGllLmhlaWdodDtcblxuICByZXR1cm4gd2lkdGggPT09IDAgJiYgaGVpZ2h0ID09PSAwO1xufTtcblxudmFyIGlzSGlkZGVuID0gZnVuY3Rpb24gaXNIaWRkZW4obm9kZSwgX3JlZikge1xuICB2YXIgZGlzcGxheUNoZWNrID0gX3JlZi5kaXNwbGF5Q2hlY2ssXG4gICAgICBnZXRTaGFkb3dSb290ID0gX3JlZi5nZXRTaGFkb3dSb290O1xuXG4gIC8vIE5PVEU6IHZpc2liaWxpdHkgd2lsbCBiZSBgdW5kZWZpbmVkYCBpZiBub2RlIGlzIGRldGFjaGVkIGZyb20gdGhlIGRvY3VtZW50XG4gIC8vICAoc2VlIG5vdGVzIGFib3V0IHRoaXMgZnVydGhlciBkb3duKSwgd2hpY2ggbWVhbnMgd2Ugd2lsbCBjb25zaWRlciBpdCB2aXNpYmxlXG4gIC8vICAodGhpcyBpcyBsZWdhY3kgYmVoYXZpb3IgZnJvbSBhIHZlcnkgbG9uZyB3YXkgYmFjaylcbiAgLy8gTk9URTogd2UgY2hlY2sgdGhpcyByZWdhcmRsZXNzIG9mIGBkaXNwbGF5Q2hlY2s9XCJub25lXCJgIGJlY2F1c2UgdGhpcyBpcyBhXG4gIC8vICBfdmlzaWJpbGl0eV8gY2hlY2ssIG5vdCBhIF9kaXNwbGF5XyBjaGVja1xuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShub2RlKS52aXNpYmlsaXR5ID09PSAnaGlkZGVuJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIGlzRGlyZWN0U3VtbWFyeSA9IG1hdGNoZXMuY2FsbChub2RlLCAnZGV0YWlscz5zdW1tYXJ5OmZpcnN0LW9mLXR5cGUnKTtcbiAgdmFyIG5vZGVVbmRlckRldGFpbHMgPSBpc0RpcmVjdFN1bW1hcnkgPyBub2RlLnBhcmVudEVsZW1lbnQgOiBub2RlO1xuXG4gIGlmIChtYXRjaGVzLmNhbGwobm9kZVVuZGVyRGV0YWlscywgJ2RldGFpbHM6bm90KFtvcGVuXSkgKicpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gVGhlIHJvb3Qgbm9kZSBpcyB0aGUgc2hhZG93IHJvb3QgaWYgdGhlIG5vZGUgaXMgaW4gYSBzaGFkb3cgRE9NOyBzb21lIGRvY3VtZW50IG90aGVyd2lzZVxuICAvLyAgKGJ1dCBOT1QgX3RoZV8gZG9jdW1lbnQ7IHNlZSBzZWNvbmQgJ0lmJyBjb21tZW50IGJlbG93IGZvciBtb3JlKS5cbiAgLy8gSWYgcm9vdE5vZGUgaXMgc2hhZG93IHJvb3QsIGl0J2xsIGhhdmUgYSBob3N0LCB3aGljaCBpcyB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgc2hhZG93XG4gIC8vICBpcyBhdHRhY2hlZCwgYW5kIHRoZSBvbmUgd2UgbmVlZCB0byBjaGVjayBpZiBpdCdzIGluIHRoZSBkb2N1bWVudCBvciBub3QgKGJlY2F1c2UgdGhlXG4gIC8vICBzaGFkb3csIGFuZCBhbGwgbm9kZXMgaXQgY29udGFpbnMsIGlzIG5ldmVyIGNvbnNpZGVyZWQgaW4gdGhlIGRvY3VtZW50IHNpbmNlIHNoYWRvd3NcbiAgLy8gIGJlaGF2ZSBsaWtlIHNlbGYtY29udGFpbmVkIERPTXM7IGJ1dCBpZiB0aGUgc2hhZG93J3MgSE9TVCwgd2hpY2ggaXMgcGFydCBvZiB0aGUgZG9jdW1lbnQsXG4gIC8vICBpcyBoaWRkZW4sIG9yIGlzIG5vdCBpbiB0aGUgZG9jdW1lbnQgaXRzZWxmIGJ1dCBpcyBkZXRhY2hlZCwgaXQgd2lsbCBhZmZlY3QgdGhlIHNoYWRvdydzXG4gIC8vICB2aXNpYmlsaXR5LCBpbmNsdWRpbmcgYWxsIHRoZSBub2RlcyBpdCBjb250YWlucykuIFRoZSBob3N0IGNvdWxkIGJlIGFueSBub3JtYWwgbm9kZSxcbiAgLy8gIG9yIGEgY3VzdG9tIGVsZW1lbnQgKGkuZS4gd2ViIGNvbXBvbmVudCkuIEVpdGhlciB3YXksIHRoYXQncyB0aGUgb25lIHRoYXQgaXMgY29uc2lkZXJlZFxuICAvLyAgcGFydCBvZiB0aGUgZG9jdW1lbnQsIG5vdCB0aGUgc2hhZG93IHJvb3QsIG5vciBhbnkgb2YgaXRzIGNoaWxkcmVuIChpLmUuIHRoZSBub2RlIGJlaW5nXG4gIC8vICB0ZXN0ZWQpLlxuICAvLyBJZiByb290Tm9kZSBpcyBub3QgYSBzaGFkb3cgcm9vdCwgaXQgd29uJ3QgaGF2ZSBhIGhvc3QsIGFuZCBzbyByb290Tm9kZSBzaG91bGQgYmUgdGhlXG4gIC8vICBkb2N1bWVudCAocGVyIHRoZSBkb2NzKSBhbmQgd2hpbGUgaXQncyBhIERvY3VtZW50LXR5cGUgb2JqZWN0LCB0aGF0IGRvY3VtZW50IGRvZXMgbm90XG4gIC8vICBhcHBlYXIgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIG5vZGUncyBgb3duZXJEb2N1bWVudGAgZm9yIHNvbWUgcmVhc29uLCBzbyBpdCdzIHNhZmVyXG4gIC8vICB0byBpZ25vcmUgdGhlIHJvb3ROb2RlIGF0IHRoaXMgcG9pbnQsIGFuZCB1c2UgYG5vZGUub3duZXJEb2N1bWVudGAuIE90aGVyd2lzZSxcbiAgLy8gIHVzaW5nIGByb290Tm9kZS5jb250YWlucyhub2RlKWAgd2lsbCBfYWx3YXlzXyBiZSB0cnVlIHdlJ2xsIGdldCBmYWxzZS1wb3NpdGl2ZXMgd2hlblxuICAvLyAgbm9kZSBpcyBhY3R1YWxseSBkZXRhY2hlZC5cblxuXG4gIHZhciBub2RlUm9vdEhvc3QgPSBnZXRSb290Tm9kZShub2RlKS5ob3N0O1xuICB2YXIgbm9kZUlzQXR0YWNoZWQgPSAobm9kZVJvb3RIb3N0ID09PSBudWxsIHx8IG5vZGVSb290SG9zdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm9kZVJvb3RIb3N0Lm93bmVyRG9jdW1lbnQuY29udGFpbnMobm9kZVJvb3RIb3N0KSkgfHwgbm9kZS5vd25lckRvY3VtZW50LmNvbnRhaW5zKG5vZGUpO1xuXG4gIGlmICghZGlzcGxheUNoZWNrIHx8IGRpc3BsYXlDaGVjayA9PT0gJ2Z1bGwnKSB7XG4gICAgaWYgKHR5cGVvZiBnZXRTaGFkb3dSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBmaWd1cmUgb3V0IGlmIHdlIHNob3VsZCBjb25zaWRlciB0aGUgbm9kZSB0byBiZSBpbiBhbiB1bmRpc2Nsb3NlZCBzaGFkb3cgYW5kIHVzZSB0aGVcbiAgICAgIC8vICAnbm9uLXplcm8tYXJlYScgZmFsbGJhY2tcbiAgICAgIHZhciBvcmlnaW5hbE5vZGUgPSBub2RlO1xuXG4gICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICB2YXIgcGFyZW50RWxlbWVudCA9IG5vZGUucGFyZW50RWxlbWVudDtcbiAgICAgICAgdmFyIHJvb3ROb2RlID0gZ2V0Um9vdE5vZGUobm9kZSk7XG5cbiAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgJiYgIXBhcmVudEVsZW1lbnQuc2hhZG93Um9vdCAmJiBnZXRTaGFkb3dSb290KHBhcmVudEVsZW1lbnQpID09PSB0cnVlIC8vIGNoZWNrIGlmIHRoZXJlJ3MgYW4gdW5kaXNjbG9zZWQgc2hhZG93XG4gICAgICAgICkge1xuICAgICAgICAgIC8vIG5vZGUgaGFzIGFuIHVuZGlzY2xvc2VkIHNoYWRvdyB3aGljaCBtZWFucyB3ZSBjYW4gb25seSB0cmVhdCBpdCBhcyBhIGJsYWNrIGJveCwgc28gd2VcbiAgICAgICAgICAvLyAgZmFsbCBiYWNrIHRvIGEgbm9uLXplcm8tYXJlYSB0ZXN0XG4gICAgICAgICAgcmV0dXJuIGlzWmVyb0FyZWEobm9kZSk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5hc3NpZ25lZFNsb3QpIHtcbiAgICAgICAgICAvLyBpdGVyYXRlIHVwIHNsb3RcbiAgICAgICAgICBub2RlID0gbm9kZS5hc3NpZ25lZFNsb3Q7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhcmVudEVsZW1lbnQgJiYgcm9vdE5vZGUgIT09IG5vZGUub3duZXJEb2N1bWVudCkge1xuICAgICAgICAgIC8vIGNyb3NzIHNoYWRvdyBib3VuZGFyeVxuICAgICAgICAgIG5vZGUgPSByb290Tm9kZS5ob3N0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGl0ZXJhdGUgdXAgbm9ybWFsIGRvbVxuICAgICAgICAgIG5vZGUgPSBwYXJlbnRFbGVtZW50O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBvcmlnaW5hbE5vZGU7XG4gICAgfSAvLyBlbHNlLCBgZ2V0U2hhZG93Um9vdGAgbWlnaHQgYmUgdHJ1ZSwgYnV0IGFsbCB0aGF0IGRvZXMgaXMgZW5hYmxlIHNoYWRvdyBET00gc3VwcG9ydFxuICAgIC8vICAoaS5lLiBpdCBkb2VzIG5vdCBhbHNvIHByZXN1bWUgdGhhdCBhbGwgbm9kZXMgbWlnaHQgaGF2ZSB1bmRpc2Nsb3NlZCBzaGFkb3dzKTsgb3JcbiAgICAvLyAgaXQgbWlnaHQgYmUgYSBmYWxzeSB2YWx1ZSwgd2hpY2ggbWVhbnMgc2hhZG93IERPTSBzdXBwb3J0IGlzIGRpc2FibGVkXG4gICAgLy8gU2luY2Ugd2UgZGlkbid0IGZpbmQgaXQgc2l0dGluZyBpbiBhbiB1bmRpc2Nsb3NlZCBzaGFkb3cgKG9yIHNoYWRvd3MgYXJlIGRpc2FibGVkKVxuICAgIC8vICBub3cgd2UgY2FuIGp1c3QgdGVzdCB0byBzZWUgaWYgaXQgd291bGQgbm9ybWFsbHkgYmUgdmlzaWJsZSBvciBub3QsIHByb3ZpZGVkIGl0J3NcbiAgICAvLyAgYXR0YWNoZWQgdG8gdGhlIG1haW4gZG9jdW1lbnQuXG4gICAgLy8gTk9URTogV2UgbXVzdCBjb25zaWRlciBjYXNlIHdoZXJlIG5vZGUgaXMgaW5zaWRlIGEgc2hhZG93IERPTSBhbmQgZ2l2ZW4gZGlyZWN0bHkgdG9cbiAgICAvLyAgYGlzVGFiYmFibGUoKWAgb3IgYGlzRm9jdXNhYmxlKClgIC0tIHJlZ2FyZGxlc3Mgb2YgYGdldFNoYWRvd1Jvb3RgIG9wdGlvbiBzZXR0aW5nLlxuXG5cbiAgICBpZiAobm9kZUlzQXR0YWNoZWQpIHtcbiAgICAgIC8vIHRoaXMgd29ya3Mgd2hlcmV2ZXIgdGhlIG5vZGUgaXM6IGlmIHRoZXJlJ3MgYXQgbGVhc3Qgb25lIGNsaWVudCByZWN0LCBpdCdzXG4gICAgICAvLyAgc29tZWhvdyBkaXNwbGF5ZWQ7IGl0IGFsc28gY292ZXJzIHRoZSBDU1MgJ2Rpc3BsYXk6IGNvbnRlbnRzJyBjYXNlIHdoZXJlIHRoZVxuICAgICAgLy8gIG5vZGUgaXRzZWxmIGlzIGhpZGRlbiBpbiBwbGFjZSBvZiBpdHMgY29udGVudHM7IGFuZCB0aGVyZSdzIG5vIG5lZWQgdG8gc2VhcmNoXG4gICAgICAvLyAgdXAgdGhlIGhpZXJhcmNoeSBlaXRoZXJcbiAgICAgIHJldHVybiAhbm9kZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aDtcbiAgICB9IC8vIEVsc2UsIHRoZSBub2RlIGlzbid0IGF0dGFjaGVkIHRvIHRoZSBkb2N1bWVudCwgd2hpY2ggbWVhbnMgdGhlIGBnZXRDbGllbnRSZWN0cygpYFxuICAgIC8vICBBUEkgd2lsbCBfX2Fsd2F5c19fIHJldHVybiB6ZXJvIHJlY3RzICh0aGlzIGNhbiBoYXBwZW4sIGZvciBleGFtcGxlLCBpZiBSZWFjdFxuICAgIC8vICBpcyB1c2VkIHRvIHJlbmRlciBub2RlcyBvbnRvIGEgZGV0YWNoZWQgdHJlZSwgYXMgY29uZmlybWVkIGluIHRoaXMgdGhyZWFkOlxuICAgIC8vICBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzkxMTcjaXNzdWVjb21tZW50LTI4NDIyODg3MClcbiAgICAvL1xuICAgIC8vIEl0IGFsc28gbWVhbnMgdGhhdCBldmVuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpLmRpc3BsYXkgd2lsbCByZXR1cm4gYHVuZGVmaW5lZGBcbiAgICAvLyAgYmVjYXVzZSBzdHlsZXMgYXJlIG9ubHkgY29tcHV0ZWQgZm9yIG5vZGVzIHRoYXQgYXJlIGluIHRoZSBkb2N1bWVudC5cbiAgICAvL1xuICAgIC8vIE5PVEU6IFRISVMgSEFTIEJFRU4gVEhFIENBU0UgRk9SIFlFQVJTLiBJdCBpcyBub3QgbmV3LCBub3IgaXMgaXQgY2F1c2VkIGJ5IHRhYmJhYmxlXG4gICAgLy8gIHNvbWVob3cuIFRob3VnaCBpdCB3YXMgbmV2ZXIgc3RhdGVkIG9mZmljaWFsbHksIGFueW9uZSB3aG8gaGFzIGV2ZXIgdXNlZCB0YWJiYWJsZVxuICAgIC8vICBBUElzIG9uIG5vZGVzIGluIGRldGFjaGVkIGNvbnRhaW5lcnMgaGFzIGFjdHVhbGx5IGltcGxpY2l0bHkgdXNlZCB0YWJiYWJsZSBpbiB3aGF0XG4gICAgLy8gIHdhcyBsYXRlciAoYXMgb2YgdjUuMi4wIG9uIEFwciA5LCAyMDIxKSBjYWxsZWQgYGRpc3BsYXlDaGVjaz1cIm5vbmVcImAgbW9kZSAtLSBlc3NlbnRpYWxseVxuICAgIC8vICBjb25zaWRlcmluZyBfX2V2ZXJ5dGhpbmdfXyB0byBiZSB2aXNpYmxlIGJlY2F1c2Ugb2YgdGhlIGlubmFiaWxpdHkgdG8gZGV0ZXJtaW5lIHN0eWxlcy5cblxuICB9IGVsc2UgaWYgKGRpc3BsYXlDaGVjayA9PT0gJ25vbi16ZXJvLWFyZWEnKSB7XG4gICAgLy8gTk9URTogRXZlbiB0aG91Z2ggdGhpcyB0ZXN0cyB0aGF0IHRoZSBub2RlJ3MgY2xpZW50IHJlY3QgaXMgbm9uLXplcm8gdG8gZGV0ZXJtaW5lXG4gICAgLy8gIHdoZXRoZXIgaXQncyBkaXNwbGF5ZWQsIGFuZCB0aGF0IGEgZGV0YWNoZWQgbm9kZSB3aWxsIF9fYWx3YXlzX18gaGF2ZSBhIHplcm8tYXJlYVxuICAgIC8vICBjbGllbnQgcmVjdCwgd2UgZG9uJ3Qgc3BlY2lhbC1jYXNlIGZvciB3aGV0aGVyIHRoZSBub2RlIGlzIGF0dGFjaGVkIG9yIG5vdC4gSW5cbiAgICAvLyAgdGhpcyBtb2RlLCB3ZSBkbyB3YW50IHRvIGNvbnNpZGVyIG5vZGVzIHRoYXQgaGF2ZSBhIHplcm8gYXJlYSB0byBiZSBoaWRkZW4gYXQgYWxsXG4gICAgLy8gIHRpbWVzLCBhbmQgdGhhdCBpbmNsdWRlcyBhdHRhY2hlZCBvciBub3QuXG4gICAgcmV0dXJuIGlzWmVyb0FyZWEobm9kZSk7XG4gIH0gLy8gdmlzaWJsZSwgYXMgZmFyIGFzIHdlIGNhbiB0ZWxsLCBvciBwZXIgY3VycmVudCBgZGlzcGxheUNoZWNrYCBtb2RlXG5cblxuICByZXR1cm4gZmFsc2U7XG59OyAvLyBmb3JtIGZpZWxkcyAobmVzdGVkKSBpbnNpZGUgYSBkaXNhYmxlZCBmaWVsZHNldCBhcmUgbm90IGZvY3VzYWJsZS90YWJiYWJsZVxuLy8gIHVubGVzcyB0aGV5IGFyZSBpbiB0aGUgX2ZpcnN0XyA8bGVnZW5kPiBlbGVtZW50IG9mIHRoZSB0b3AtbW9zdCBkaXNhYmxlZFxuLy8gIGZpZWxkc2V0XG5cblxudmFyIGlzRGlzYWJsZWRGcm9tRmllbGRzZXQgPSBmdW5jdGlvbiBpc0Rpc2FibGVkRnJvbUZpZWxkc2V0KG5vZGUpIHtcbiAgaWYgKC9eKElOUFVUfEJVVFRPTnxTRUxFQ1R8VEVYVEFSRUEpJC8udGVzdChub2RlLnRhZ05hbWUpKSB7XG4gICAgdmFyIHBhcmVudE5vZGUgPSBub2RlLnBhcmVudEVsZW1lbnQ7IC8vIGNoZWNrIGlmIGBub2RlYCBpcyBjb250YWluZWQgaW4gYSBkaXNhYmxlZCA8ZmllbGRzZXQ+XG5cbiAgICB3aGlsZSAocGFyZW50Tm9kZSkge1xuICAgICAgaWYgKHBhcmVudE5vZGUudGFnTmFtZSA9PT0gJ0ZJRUxEU0VUJyAmJiBwYXJlbnROb2RlLmRpc2FibGVkKSB7XG4gICAgICAgIC8vIGxvb2sgZm9yIHRoZSBmaXJzdCA8bGVnZW5kPiBhbW9uZyB0aGUgY2hpbGRyZW4gb2YgdGhlIGRpc2FibGVkIDxmaWVsZHNldD5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnROb2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGNoaWxkID0gcGFyZW50Tm9kZS5jaGlsZHJlbi5pdGVtKGkpOyAvLyB3aGVuIHRoZSBmaXJzdCA8bGVnZW5kPiAoaW4gZG9jdW1lbnQgb3JkZXIpIGlzIGZvdW5kXG5cbiAgICAgICAgICBpZiAoY2hpbGQudGFnTmFtZSA9PT0gJ0xFR0VORCcpIHtcbiAgICAgICAgICAgIC8vIGlmIGl0cyBwYXJlbnQgPGZpZWxkc2V0PiBpcyBub3QgbmVzdGVkIGluIGFub3RoZXIgZGlzYWJsZWQgPGZpZWxkc2V0PixcbiAgICAgICAgICAgIC8vIHJldHVybiB3aGV0aGVyIGBub2RlYCBpcyBhIGRlc2NlbmRhbnQgb2YgaXRzIGZpcnN0IDxsZWdlbmQ+XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlcy5jYWxsKHBhcmVudE5vZGUsICdmaWVsZHNldFtkaXNhYmxlZF0gKicpID8gdHJ1ZSA6ICFjaGlsZC5jb250YWlucyhub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gdGhlIGRpc2FibGVkIDxmaWVsZHNldD4gY29udGFpbmluZyBgbm9kZWAgaGFzIG5vIDxsZWdlbmQ+XG5cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50RWxlbWVudDtcbiAgICB9XG4gIH0gLy8gZWxzZSwgbm9kZSdzIHRhYmJhYmxlL2ZvY3VzYWJsZSBzdGF0ZSBzaG91bGQgbm90IGJlIGFmZmVjdGVkIGJ5IGEgZmllbGRzZXQnc1xuICAvLyAgZW5hYmxlZC9kaXNhYmxlZCBzdGF0ZVxuXG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxudmFyIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUgPSBmdW5jdGlvbiBpc05vZGVNYXRjaGluZ1NlbGVjdG9yRm9jdXNhYmxlKG9wdGlvbnMsIG5vZGUpIHtcbiAgaWYgKG5vZGUuZGlzYWJsZWQgfHwgaXNIaWRkZW5JbnB1dChub2RlKSB8fCBpc0hpZGRlbihub2RlLCBvcHRpb25zKSB8fCAvLyBGb3IgYSBkZXRhaWxzIGVsZW1lbnQgd2l0aCBhIHN1bW1hcnksIHRoZSBzdW1tYXJ5IGVsZW1lbnQgZ2V0cyB0aGUgZm9jdXNcbiAgaXNEZXRhaWxzV2l0aFN1bW1hcnkobm9kZSkgfHwgaXNEaXNhYmxlZEZyb21GaWVsZHNldChub2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxudmFyIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZSA9IGZ1bmN0aW9uIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZShvcHRpb25zLCBub2RlKSB7XG4gIGlmIChpc05vblRhYmJhYmxlUmFkaW8obm9kZSkgfHwgZ2V0VGFiaW5kZXgobm9kZSkgPCAwIHx8ICFpc05vZGVNYXRjaGluZ1NlbGVjdG9yRm9jdXNhYmxlKG9wdGlvbnMsIG5vZGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG52YXIgaXNWYWxpZFNoYWRvd1Jvb3RUYWJiYWJsZSA9IGZ1bmN0aW9uIGlzVmFsaWRTaGFkb3dSb290VGFiYmFibGUoc2hhZG93SG9zdE5vZGUpIHtcbiAgdmFyIHRhYkluZGV4ID0gcGFyc2VJbnQoc2hhZG93SG9zdE5vZGUuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpLCAxMCk7XG5cbiAgaWYgKGlzTmFOKHRhYkluZGV4KSB8fCB0YWJJbmRleCA+PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gSWYgYSBjdXN0b20gZWxlbWVudCBoYXMgYW4gZXhwbGljaXQgbmVnYXRpdmUgdGFiaW5kZXgsXG4gIC8vIGJyb3dzZXJzIHdpbGwgbm90IGFsbG93IHRhYiB0YXJnZXRpbmcgc2FpZCBlbGVtZW50J3MgY2hpbGRyZW4uXG5cblxuICByZXR1cm4gZmFsc2U7XG59O1xuLyoqXG4gKiBAcGFyYW0ge0FycmF5LjxFbGVtZW50fENhbmRpZGF0ZXNTY29wZT59IGNhbmRpZGF0ZXNcbiAqIEByZXR1cm5zIEVsZW1lbnRbXVxuICovXG5cblxudmFyIHNvcnRCeU9yZGVyID0gZnVuY3Rpb24gc29ydEJ5T3JkZXIoY2FuZGlkYXRlcykge1xuICB2YXIgcmVndWxhclRhYmJhYmxlcyA9IFtdO1xuICB2YXIgb3JkZXJlZFRhYmJhYmxlcyA9IFtdO1xuICBjYW5kaWRhdGVzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGkpIHtcbiAgICB2YXIgaXNTY29wZSA9ICEhaXRlbS5zY29wZTtcbiAgICB2YXIgZWxlbWVudCA9IGlzU2NvcGUgPyBpdGVtLnNjb3BlIDogaXRlbTtcbiAgICB2YXIgY2FuZGlkYXRlVGFiaW5kZXggPSBnZXRUYWJpbmRleChlbGVtZW50LCBpc1Njb3BlKTtcbiAgICB2YXIgZWxlbWVudHMgPSBpc1Njb3BlID8gc29ydEJ5T3JkZXIoaXRlbS5jYW5kaWRhdGVzKSA6IGVsZW1lbnQ7XG5cbiAgICBpZiAoY2FuZGlkYXRlVGFiaW5kZXggPT09IDApIHtcbiAgICAgIGlzU2NvcGUgPyByZWd1bGFyVGFiYmFibGVzLnB1c2guYXBwbHkocmVndWxhclRhYmJhYmxlcywgZWxlbWVudHMpIDogcmVndWxhclRhYmJhYmxlcy5wdXNoKGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcmRlcmVkVGFiYmFibGVzLnB1c2goe1xuICAgICAgICBkb2N1bWVudE9yZGVyOiBpLFxuICAgICAgICB0YWJJbmRleDogY2FuZGlkYXRlVGFiaW5kZXgsXG4gICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgIGlzU2NvcGU6IGlzU2NvcGUsXG4gICAgICAgIGNvbnRlbnQ6IGVsZW1lbnRzXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3JkZXJlZFRhYmJhYmxlcy5zb3J0KHNvcnRPcmRlcmVkVGFiYmFibGVzKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgc29ydGFibGUpIHtcbiAgICBzb3J0YWJsZS5pc1Njb3BlID8gYWNjLnB1c2guYXBwbHkoYWNjLCBzb3J0YWJsZS5jb250ZW50KSA6IGFjYy5wdXNoKHNvcnRhYmxlLmNvbnRlbnQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIFtdKS5jb25jYXQocmVndWxhclRhYmJhYmxlcyk7XG59O1xuXG52YXIgdGFiYmFibGUgPSBmdW5jdGlvbiB0YWJiYWJsZShlbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIGNhbmRpZGF0ZXM7XG5cbiAgaWYgKG9wdGlvbnMuZ2V0U2hhZG93Um9vdCkge1xuICAgIGNhbmRpZGF0ZXMgPSBnZXRDYW5kaWRhdGVzSXRlcmF0aXZlbHkoW2VsXSwgb3B0aW9ucy5pbmNsdWRlQ29udGFpbmVyLCB7XG4gICAgICBmaWx0ZXI6IGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZS5iaW5kKG51bGwsIG9wdGlvbnMpLFxuICAgICAgZmxhdHRlbjogZmFsc2UsXG4gICAgICBnZXRTaGFkb3dSb290OiBvcHRpb25zLmdldFNoYWRvd1Jvb3QsXG4gICAgICBzaGFkb3dSb290RmlsdGVyOiBpc1ZhbGlkU2hhZG93Um9vdFRhYmJhYmxlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgY2FuZGlkYXRlcyA9IGdldENhbmRpZGF0ZXMoZWwsIG9wdGlvbnMuaW5jbHVkZUNvbnRhaW5lciwgaXNOb2RlTWF0Y2hpbmdTZWxlY3RvclRhYmJhYmxlLmJpbmQobnVsbCwgb3B0aW9ucykpO1xuICB9XG5cbiAgcmV0dXJuIHNvcnRCeU9yZGVyKGNhbmRpZGF0ZXMpO1xufTtcblxudmFyIGZvY3VzYWJsZSA9IGZ1bmN0aW9uIGZvY3VzYWJsZShlbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIGNhbmRpZGF0ZXM7XG5cbiAgaWYgKG9wdGlvbnMuZ2V0U2hhZG93Um9vdCkge1xuICAgIGNhbmRpZGF0ZXMgPSBnZXRDYW5kaWRhdGVzSXRlcmF0aXZlbHkoW2VsXSwgb3B0aW9ucy5pbmNsdWRlQ29udGFpbmVyLCB7XG4gICAgICBmaWx0ZXI6IGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUuYmluZChudWxsLCBvcHRpb25zKSxcbiAgICAgIGZsYXR0ZW46IHRydWUsXG4gICAgICBnZXRTaGFkb3dSb290OiBvcHRpb25zLmdldFNoYWRvd1Jvb3RcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjYW5kaWRhdGVzID0gZ2V0Q2FuZGlkYXRlcyhlbCwgb3B0aW9ucy5pbmNsdWRlQ29udGFpbmVyLCBpc05vZGVNYXRjaGluZ1NlbGVjdG9yRm9jdXNhYmxlLmJpbmQobnVsbCwgb3B0aW9ucykpO1xuICB9XG5cbiAgcmV0dXJuIGNhbmRpZGF0ZXM7XG59O1xuXG52YXIgaXNUYWJiYWJsZSA9IGZ1bmN0aW9uIGlzVGFiYmFibGUobm9kZSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICBpZiAoIW5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIG5vZGUgcHJvdmlkZWQnKTtcbiAgfVxuXG4gIGlmIChtYXRjaGVzLmNhbGwobm9kZSwgY2FuZGlkYXRlU2VsZWN0b3IpID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBpc05vZGVNYXRjaGluZ1NlbGVjdG9yVGFiYmFibGUob3B0aW9ucywgbm9kZSk7XG59O1xuXG52YXIgZm9jdXNhYmxlQ2FuZGlkYXRlU2VsZWN0b3IgPSAvKiAjX19QVVJFX18gKi9jYW5kaWRhdGVTZWxlY3RvcnMuY29uY2F0KCdpZnJhbWUnKS5qb2luKCcsJyk7XG5cbnZhciBpc0ZvY3VzYWJsZSA9IGZ1bmN0aW9uIGlzRm9jdXNhYmxlKG5vZGUsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgaWYgKCFub2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBub2RlIHByb3ZpZGVkJyk7XG4gIH1cblxuICBpZiAobWF0Y2hlcy5jYWxsKG5vZGUsIGZvY3VzYWJsZUNhbmRpZGF0ZVNlbGVjdG9yKSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gaXNOb2RlTWF0Y2hpbmdTZWxlY3RvckZvY3VzYWJsZShvcHRpb25zLCBub2RlKTtcbn07XG5cbmV4cG9ydCB7IGZvY3VzYWJsZSwgaXNGb2N1c2FibGUsIGlzVGFiYmFibGUsIHRhYmJhYmxlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20uanMubWFwXG4iLCIvKiEgaHR0cHM6Ly9tdGhzLmJlL3B1bnljb2RlIHYxLjQuMSBieSBAbWF0aGlhcyAqL1xuOyhmdW5jdGlvbihyb290KSB7XG5cblx0LyoqIERldGVjdCBmcmVlIHZhcmlhYmxlcyAqL1xuXHR2YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmXG5cdFx0IWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblx0dmFyIGZyZWVNb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJlxuXHRcdCFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXHR2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsO1xuXHRpZiAoXG5cdFx0ZnJlZUdsb2JhbC5nbG9iYWwgPT09IGZyZWVHbG9iYWwgfHxcblx0XHRmcmVlR2xvYmFsLndpbmRvdyA9PT0gZnJlZUdsb2JhbCB8fFxuXHRcdGZyZWVHbG9iYWwuc2VsZiA9PT0gZnJlZUdsb2JhbFxuXHQpIHtcblx0XHRyb290ID0gZnJlZUdsb2JhbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgYHB1bnljb2RlYCBvYmplY3QuXG5cdCAqIEBuYW1lIHB1bnljb2RlXG5cdCAqIEB0eXBlIE9iamVjdFxuXHQgKi9cblx0dmFyIHB1bnljb2RlLFxuXG5cdC8qKiBIaWdoZXN0IHBvc2l0aXZlIHNpZ25lZCAzMi1iaXQgZmxvYXQgdmFsdWUgKi9cblx0bWF4SW50ID0gMjE0NzQ4MzY0NywgLy8gYWthLiAweDdGRkZGRkZGIG9yIDJeMzEtMVxuXG5cdC8qKiBCb290c3RyaW5nIHBhcmFtZXRlcnMgKi9cblx0YmFzZSA9IDM2LFxuXHR0TWluID0gMSxcblx0dE1heCA9IDI2LFxuXHRza2V3ID0gMzgsXG5cdGRhbXAgPSA3MDAsXG5cdGluaXRpYWxCaWFzID0gNzIsXG5cdGluaXRpYWxOID0gMTI4LCAvLyAweDgwXG5cdGRlbGltaXRlciA9ICctJywgLy8gJ1xceDJEJ1xuXG5cdC8qKiBSZWd1bGFyIGV4cHJlc3Npb25zICovXG5cdHJlZ2V4UHVueWNvZGUgPSAvXnhuLS0vLFxuXHRyZWdleE5vbkFTQ0lJID0gL1teXFx4MjAtXFx4N0VdLywgLy8gdW5wcmludGFibGUgQVNDSUkgY2hhcnMgKyBub24tQVNDSUkgY2hhcnNcblx0cmVnZXhTZXBhcmF0b3JzID0gL1tcXHgyRVxcdTMwMDJcXHVGRjBFXFx1RkY2MV0vZywgLy8gUkZDIDM0OTAgc2VwYXJhdG9yc1xuXG5cdC8qKiBFcnJvciBtZXNzYWdlcyAqL1xuXHRlcnJvcnMgPSB7XG5cdFx0J292ZXJmbG93JzogJ092ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzJyxcblx0XHQnbm90LWJhc2ljJzogJ0lsbGVnYWwgaW5wdXQgPj0gMHg4MCAobm90IGEgYmFzaWMgY29kZSBwb2ludCknLFxuXHRcdCdpbnZhbGlkLWlucHV0JzogJ0ludmFsaWQgaW5wdXQnXG5cdH0sXG5cblx0LyoqIENvbnZlbmllbmNlIHNob3J0Y3V0cyAqL1xuXHRiYXNlTWludXNUTWluID0gYmFzZSAtIHRNaW4sXG5cdGZsb29yID0gTWF0aC5mbG9vcixcblx0c3RyaW5nRnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZSxcblxuXHQvKiogVGVtcG9yYXJ5IHZhcmlhYmxlICovXG5cdGtleTtcblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKipcblx0ICogQSBnZW5lcmljIGVycm9yIHV0aWxpdHkgZnVuY3Rpb24uXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBlcnJvciB0eXBlLlxuXHQgKiBAcmV0dXJucyB7RXJyb3J9IFRocm93cyBhIGBSYW5nZUVycm9yYCB3aXRoIHRoZSBhcHBsaWNhYmxlIGVycm9yIG1lc3NhZ2UuXG5cdCAqL1xuXHRmdW5jdGlvbiBlcnJvcih0eXBlKSB7XG5cdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoZXJyb3JzW3R5cGVdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBIGdlbmVyaWMgYEFycmF5I21hcGAgdXRpbGl0eSBmdW5jdGlvbi5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5IGFycmF5XG5cdCAqIGl0ZW0uXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgYXJyYXkgb2YgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cblx0ICovXG5cdGZ1bmN0aW9uIG1hcChhcnJheSwgZm4pIHtcblx0XHR2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXHRcdHZhciByZXN1bHQgPSBbXTtcblx0XHR3aGlsZSAobGVuZ3RoLS0pIHtcblx0XHRcdHJlc3VsdFtsZW5ndGhdID0gZm4oYXJyYXlbbGVuZ3RoXSk7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogQSBzaW1wbGUgYEFycmF5I21hcGAtbGlrZSB3cmFwcGVyIHRvIHdvcmsgd2l0aCBkb21haW4gbmFtZSBzdHJpbmdzIG9yIGVtYWlsXG5cdCAqIGFkZHJlc3Nlcy5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGRvbWFpbiBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcy5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5XG5cdCAqIGNoYXJhY3Rlci5cblx0ICogQHJldHVybnMge0FycmF5fSBBIG5ldyBzdHJpbmcgb2YgY2hhcmFjdGVycyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2tcblx0ICogZnVuY3Rpb24uXG5cdCAqL1xuXHRmdW5jdGlvbiBtYXBEb21haW4oc3RyaW5nLCBmbikge1xuXHRcdHZhciBwYXJ0cyA9IHN0cmluZy5zcGxpdCgnQCcpO1xuXHRcdHZhciByZXN1bHQgPSAnJztcblx0XHRpZiAocGFydHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Ly8gSW4gZW1haWwgYWRkcmVzc2VzLCBvbmx5IHRoZSBkb21haW4gbmFtZSBzaG91bGQgYmUgcHVueWNvZGVkLiBMZWF2ZVxuXHRcdFx0Ly8gdGhlIGxvY2FsIHBhcnQgKGkuZS4gZXZlcnl0aGluZyB1cCB0byBgQGApIGludGFjdC5cblx0XHRcdHJlc3VsdCA9IHBhcnRzWzBdICsgJ0AnO1xuXHRcdFx0c3RyaW5nID0gcGFydHNbMV07XG5cdFx0fVxuXHRcdC8vIEF2b2lkIGBzcGxpdChyZWdleClgIGZvciBJRTggY29tcGF0aWJpbGl0eS4gU2VlICMxNy5cblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShyZWdleFNlcGFyYXRvcnMsICdcXHgyRScpO1xuXHRcdHZhciBsYWJlbHMgPSBzdHJpbmcuc3BsaXQoJy4nKTtcblx0XHR2YXIgZW5jb2RlZCA9IG1hcChsYWJlbHMsIGZuKS5qb2luKCcuJyk7XG5cdFx0cmV0dXJuIHJlc3VsdCArIGVuY29kZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBudW1lcmljIGNvZGUgcG9pbnRzIG9mIGVhY2ggVW5pY29kZVxuXHQgKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXG5cdCAqIHRoaXMgZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGEgcGFpciBvZiBzdXJyb2dhdGUgaGFsdmVzIChlYWNoIG9mIHdoaWNoXG5cdCAqIFVDUy0yIGV4cG9zZXMgYXMgc2VwYXJhdGUgY2hhcmFjdGVycykgaW50byBhIHNpbmdsZSBjb2RlIHBvaW50LFxuXHQgKiBtYXRjaGluZyBVVEYtMTYuXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZW5jb2RlYFxuXHQgKiBAc2VlIDxodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZz5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcblx0ICogQG5hbWUgZGVjb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgVGhlIFVuaWNvZGUgaW5wdXQgc3RyaW5nIChVQ1MtMikuXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gVGhlIG5ldyBhcnJheSBvZiBjb2RlIHBvaW50cy5cblx0ICovXG5cdGZ1bmN0aW9uIHVjczJkZWNvZGUoc3RyaW5nKSB7XG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBjb3VudGVyID0gMCxcblx0XHQgICAgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aCxcblx0XHQgICAgdmFsdWUsXG5cdFx0ICAgIGV4dHJhO1xuXHRcdHdoaWxlIChjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHR2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGhpZ2ggc3Vycm9nYXRlLCBhbmQgdGhlcmUgaXMgYSBuZXh0IGNoYXJhY3RlclxuXHRcdFx0XHRleHRyYSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRcdGlmICgoZXh0cmEgJiAweEZDMDApID09IDB4REMwMCkgeyAvLyBsb3cgc3Vycm9nYXRlXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2goKCh2YWx1ZSAmIDB4M0ZGKSA8PCAxMCkgKyAoZXh0cmEgJiAweDNGRikgKyAweDEwMDAwKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB1bm1hdGNoZWQgc3Vycm9nYXRlOyBvbmx5IGFwcGVuZCB0aGlzIGNvZGUgdW5pdCwgaW4gY2FzZSB0aGUgbmV4dFxuXHRcdFx0XHRcdC8vIGNvZGUgdW5pdCBpcyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpclxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdFx0XHRjb3VudGVyLS07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgc3RyaW5nIGJhc2VkIG9uIGFuIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZGVjb2RlYFxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuXHQgKiBAbmFtZSBlbmNvZGVcblx0ICogQHBhcmFtIHtBcnJheX0gY29kZVBvaW50cyBUaGUgYXJyYXkgb2YgbnVtZXJpYyBjb2RlIHBvaW50cy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIG5ldyBVbmljb2RlIHN0cmluZyAoVUNTLTIpLlxuXHQgKi9cblx0ZnVuY3Rpb24gdWNzMmVuY29kZShhcnJheSkge1xuXHRcdHJldHVybiBtYXAoYXJyYXksIGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHR2YXIgb3V0cHV0ID0gJyc7XG5cdFx0XHRpZiAodmFsdWUgPiAweEZGRkYpIHtcblx0XHRcdFx0dmFsdWUgLT0gMHgxMDAwMDtcblx0XHRcdFx0b3V0cHV0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCk7XG5cdFx0XHRcdHZhbHVlID0gMHhEQzAwIHwgdmFsdWUgJiAweDNGRjtcblx0XHRcdH1cblx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUodmFsdWUpO1xuXHRcdFx0cmV0dXJuIG91dHB1dDtcblx0XHR9KS5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIGJhc2ljIGNvZGUgcG9pbnQgaW50byBhIGRpZ2l0L2ludGVnZXIuXG5cdCAqIEBzZWUgYGRpZ2l0VG9CYXNpYygpYFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0gY29kZVBvaW50IFRoZSBiYXNpYyBudW1lcmljIGNvZGUgcG9pbnQgdmFsdWUuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludCAoZm9yIHVzZSBpblxuXHQgKiByZXByZXNlbnRpbmcgaW50ZWdlcnMpIGluIHRoZSByYW5nZSBgMGAgdG8gYGJhc2UgLSAxYCwgb3IgYGJhc2VgIGlmXG5cdCAqIHRoZSBjb2RlIHBvaW50IGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbHVlLlxuXHQgKi9cblx0ZnVuY3Rpb24gYmFzaWNUb0RpZ2l0KGNvZGVQb2ludCkge1xuXHRcdGlmIChjb2RlUG9pbnQgLSA0OCA8IDEwKSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gMjI7XG5cdFx0fVxuXHRcdGlmIChjb2RlUG9pbnQgLSA2NSA8IDI2KSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gNjU7XG5cdFx0fVxuXHRcdGlmIChjb2RlUG9pbnQgLSA5NyA8IDI2KSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gOTc7XG5cdFx0fVxuXHRcdHJldHVybiBiYXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgZGlnaXQvaW50ZWdlciBpbnRvIGEgYmFzaWMgY29kZSBwb2ludC5cblx0ICogQHNlZSBgYmFzaWNUb0RpZ2l0KClgXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBkaWdpdCBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBiYXNpYyBjb2RlIHBvaW50IHdob3NlIHZhbHVlICh3aGVuIHVzZWQgZm9yXG5cdCAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaXMgYGRpZ2l0YCwgd2hpY2ggbmVlZHMgdG8gYmUgaW4gdGhlIHJhbmdlXG5cdCAqIGAwYCB0byBgYmFzZSAtIDFgLiBJZiBgZmxhZ2AgaXMgbm9uLXplcm8sIHRoZSB1cHBlcmNhc2UgZm9ybSBpc1xuXHQgKiB1c2VkOyBlbHNlLCB0aGUgbG93ZXJjYXNlIGZvcm0gaXMgdXNlZC4gVGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZFxuXHQgKiBpZiBgZmxhZ2AgaXMgbm9uLXplcm8gYW5kIGBkaWdpdGAgaGFzIG5vIHVwcGVyY2FzZSBmb3JtLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGlnaXRUb0Jhc2ljKGRpZ2l0LCBmbGFnKSB7XG5cdFx0Ly8gIDAuLjI1IG1hcCB0byBBU0NJSSBhLi56IG9yIEEuLlpcblx0XHQvLyAyNi4uMzUgbWFwIHRvIEFTQ0lJIDAuLjlcblx0XHRyZXR1cm4gZGlnaXQgKyAyMiArIDc1ICogKGRpZ2l0IDwgMjYpIC0gKChmbGFnICE9IDApIDw8IDUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJpYXMgYWRhcHRhdGlvbiBmdW5jdGlvbiBhcyBwZXIgc2VjdGlvbiAzLjQgb2YgUkZDIDM0OTIuXG5cdCAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyI3NlY3Rpb24tMy40XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRmdW5jdGlvbiBhZGFwdChkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHtcblx0XHR2YXIgayA9IDA7XG5cdFx0ZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTtcblx0XHRkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7XG5cdFx0Zm9yICgvKiBubyBpbml0aWFsaXphdGlvbiAqLzsgZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxOyBrICs9IGJhc2UpIHtcblx0XHRcdGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzIHRvIGEgc3RyaW5nIG9mIFVuaWNvZGVcblx0ICogc3ltYm9scy5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGVjb2RlKGlucHV0KSB7XG5cdFx0Ly8gRG9uJ3QgdXNlIFVDUy0yXG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCxcblx0XHQgICAgb3V0LFxuXHRcdCAgICBpID0gMCxcblx0XHQgICAgbiA9IGluaXRpYWxOLFxuXHRcdCAgICBiaWFzID0gaW5pdGlhbEJpYXMsXG5cdFx0ICAgIGJhc2ljLFxuXHRcdCAgICBqLFxuXHRcdCAgICBpbmRleCxcblx0XHQgICAgb2xkaSxcblx0XHQgICAgdyxcblx0XHQgICAgayxcblx0XHQgICAgZGlnaXQsXG5cdFx0ICAgIHQsXG5cdFx0ICAgIC8qKiBDYWNoZWQgY2FsY3VsYXRpb24gcmVzdWx0cyAqL1xuXHRcdCAgICBiYXNlTWludXNUO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50czogbGV0IGBiYXNpY2AgYmUgdGhlIG51bWJlciBvZiBpbnB1dCBjb2RlXG5cdFx0Ly8gcG9pbnRzIGJlZm9yZSB0aGUgbGFzdCBkZWxpbWl0ZXIsIG9yIGAwYCBpZiB0aGVyZSBpcyBub25lLCB0aGVuIGNvcHlcblx0XHQvLyB0aGUgZmlyc3QgYmFzaWMgY29kZSBwb2ludHMgdG8gdGhlIG91dHB1dC5cblxuXHRcdGJhc2ljID0gaW5wdXQubGFzdEluZGV4T2YoZGVsaW1pdGVyKTtcblx0XHRpZiAoYmFzaWMgPCAwKSB7XG5cdFx0XHRiYXNpYyA9IDA7XG5cdFx0fVxuXG5cdFx0Zm9yIChqID0gMDsgaiA8IGJhc2ljOyArK2opIHtcblx0XHRcdC8vIGlmIGl0J3Mgbm90IGEgYmFzaWMgY29kZSBwb2ludFxuXHRcdFx0aWYgKGlucHV0LmNoYXJDb2RlQXQoaikgPj0gMHg4MCkge1xuXHRcdFx0XHRlcnJvcignbm90LWJhc2ljJyk7XG5cdFx0XHR9XG5cdFx0XHRvdXRwdXQucHVzaChpbnB1dC5jaGFyQ29kZUF0KGopKTtcblx0XHR9XG5cblx0XHQvLyBNYWluIGRlY29kaW5nIGxvb3A6IHN0YXJ0IGp1c3QgYWZ0ZXIgdGhlIGxhc3QgZGVsaW1pdGVyIGlmIGFueSBiYXNpYyBjb2RlXG5cdFx0Ly8gcG9pbnRzIHdlcmUgY29waWVkOyBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG90aGVyd2lzZS5cblxuXHRcdGZvciAoaW5kZXggPSBiYXNpYyA+IDAgPyBiYXNpYyArIDEgOiAwOyBpbmRleCA8IGlucHV0TGVuZ3RoOyAvKiBubyBmaW5hbCBleHByZXNzaW9uICovKSB7XG5cblx0XHRcdC8vIGBpbmRleGAgaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGNoYXJhY3RlciB0byBiZSBjb25zdW1lZC5cblx0XHRcdC8vIERlY29kZSBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGludG8gYGRlbHRhYCxcblx0XHRcdC8vIHdoaWNoIGdldHMgYWRkZWQgdG8gYGlgLiBUaGUgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZWFzaWVyXG5cdFx0XHQvLyBpZiB3ZSBpbmNyZWFzZSBgaWAgYXMgd2UgZ28sIHRoZW4gc3VidHJhY3Qgb2ZmIGl0cyBzdGFydGluZ1xuXHRcdFx0Ly8gdmFsdWUgYXQgdGhlIGVuZCB0byBvYnRhaW4gYGRlbHRhYC5cblx0XHRcdGZvciAob2xkaSA9IGksIHcgPSAxLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblxuXHRcdFx0XHRpZiAoaW5kZXggPj0gaW5wdXRMZW5ndGgpIHtcblx0XHRcdFx0XHRlcnJvcignaW52YWxpZC1pbnB1dCcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGlnaXQgPSBiYXNpY1RvRGlnaXQoaW5wdXQuY2hhckNvZGVBdChpbmRleCsrKSk7XG5cblx0XHRcdFx0aWYgKGRpZ2l0ID49IGJhc2UgfHwgZGlnaXQgPiBmbG9vcigobWF4SW50IC0gaSkgLyB3KSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aSArPSBkaWdpdCAqIHc7XG5cdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXG5cdFx0XHRcdGlmIChkaWdpdCA8IHQpIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdFx0aWYgKHcgPiBmbG9vcihtYXhJbnQgLyBiYXNlTWludXNUKSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dyAqPSBiYXNlTWludXNUO1xuXG5cdFx0XHR9XG5cblx0XHRcdG91dCA9IG91dHB1dC5sZW5ndGggKyAxO1xuXHRcdFx0YmlhcyA9IGFkYXB0KGkgLSBvbGRpLCBvdXQsIG9sZGkgPT0gMCk7XG5cblx0XHRcdC8vIGBpYCB3YXMgc3VwcG9zZWQgdG8gd3JhcCBhcm91bmQgZnJvbSBgb3V0YCB0byBgMGAsXG5cdFx0XHQvLyBpbmNyZW1lbnRpbmcgYG5gIGVhY2ggdGltZSwgc28gd2UnbGwgZml4IHRoYXQgbm93OlxuXHRcdFx0aWYgKGZsb29yKGkgLyBvdXQpID4gbWF4SW50IC0gbikge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0biArPSBmbG9vcihpIC8gb3V0KTtcblx0XHRcdGkgJT0gb3V0O1xuXG5cdFx0XHQvLyBJbnNlcnQgYG5gIGF0IHBvc2l0aW9uIGBpYCBvZiB0aGUgb3V0cHV0XG5cdFx0XHRvdXRwdXQuc3BsaWNlKGkrKywgMCwgbik7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdWNzMmVuY29kZShvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scyAoZS5nLiBhIGRvbWFpbiBuYW1lIGxhYmVsKSB0byBhXG5cdCAqIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSByZXN1bHRpbmcgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICovXG5cdGZ1bmN0aW9uIGVuY29kZShpbnB1dCkge1xuXHRcdHZhciBuLFxuXHRcdCAgICBkZWx0YSxcblx0XHQgICAgaGFuZGxlZENQQ291bnQsXG5cdFx0ICAgIGJhc2ljTGVuZ3RoLFxuXHRcdCAgICBiaWFzLFxuXHRcdCAgICBqLFxuXHRcdCAgICBtLFxuXHRcdCAgICBxLFxuXHRcdCAgICBrLFxuXHRcdCAgICB0LFxuXHRcdCAgICBjdXJyZW50VmFsdWUsXG5cdFx0ICAgIG91dHB1dCA9IFtdLFxuXHRcdCAgICAvKiogYGlucHV0TGVuZ3RoYCB3aWxsIGhvbGQgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyBpbiBgaW5wdXRgLiAqL1xuXHRcdCAgICBpbnB1dExlbmd0aCxcblx0XHQgICAgLyoqIENhY2hlZCBjYWxjdWxhdGlvbiByZXN1bHRzICovXG5cdFx0ICAgIGhhbmRsZWRDUENvdW50UGx1c09uZSxcblx0XHQgICAgYmFzZU1pbnVzVCxcblx0XHQgICAgcU1pbnVzVDtcblxuXHRcdC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIFVuaWNvZGVcblx0XHRpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpO1xuXG5cdFx0Ly8gQ2FjaGUgdGhlIGxlbmd0aFxuXHRcdGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSB0aGUgc3RhdGVcblx0XHRuID0gaW5pdGlhbE47XG5cdFx0ZGVsdGEgPSAwO1xuXHRcdGJpYXMgPSBpbml0aWFsQmlhcztcblxuXHRcdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHNcblx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0Y3VycmVudFZhbHVlID0gaW5wdXRbal07XG5cdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgMHg4MCkge1xuXHRcdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoY3VycmVudFZhbHVlKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aGFuZGxlZENQQ291bnQgPSBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7XG5cblx0XHQvLyBgaGFuZGxlZENQQ291bnRgIGlzIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgdGhhdCBoYXZlIGJlZW4gaGFuZGxlZDtcblx0XHQvLyBgYmFzaWNMZW5ndGhgIGlzIHRoZSBudW1iZXIgb2YgYmFzaWMgY29kZSBwb2ludHMuXG5cblx0XHQvLyBGaW5pc2ggdGhlIGJhc2ljIHN0cmluZyAtIGlmIGl0IGlzIG5vdCBlbXB0eSAtIHdpdGggYSBkZWxpbWl0ZXJcblx0XHRpZiAoYmFzaWNMZW5ndGgpIHtcblx0XHRcdG91dHB1dC5wdXNoKGRlbGltaXRlcik7XG5cdFx0fVxuXG5cdFx0Ly8gTWFpbiBlbmNvZGluZyBsb29wOlxuXHRcdHdoaWxlIChoYW5kbGVkQ1BDb3VudCA8IGlucHV0TGVuZ3RoKSB7XG5cblx0XHRcdC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHRcblx0XHRcdC8vIGxhcmdlciBvbmU6XG5cdFx0XHRmb3IgKG0gPSBtYXhJbnQsIGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA+PSBuICYmIGN1cnJlbnRWYWx1ZSA8IG0pIHtcblx0XHRcdFx0XHRtID0gY3VycmVudFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluY3JlYXNlIGBkZWx0YWAgZW5vdWdoIHRvIGFkdmFuY2UgdGhlIGRlY29kZXIncyA8bixpPiBzdGF0ZSB0byA8bSwwPixcblx0XHRcdC8vIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93XG5cdFx0XHRoYW5kbGVkQ1BDb3VudFBsdXNPbmUgPSBoYW5kbGVkQ1BDb3VudCArIDE7XG5cdFx0XHRpZiAobSAtIG4gPiBmbG9vcigobWF4SW50IC0gZGVsdGEpIC8gaGFuZGxlZENQQ291bnRQbHVzT25lKSkge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTtcblx0XHRcdG4gPSBtO1xuXG5cdFx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlID09IG4pIHtcblx0XHRcdFx0XHQvLyBSZXByZXNlbnQgZGVsdGEgYXMgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlclxuXHRcdFx0XHRcdGZvciAocSA9IGRlbHRhLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblx0XHRcdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXHRcdFx0XHRcdFx0aWYgKHEgPCB0KSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cU1pbnVzVCA9IHEgLSB0O1xuXHRcdFx0XHRcdFx0YmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goXG5cdFx0XHRcdFx0XHRcdHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWModCArIHFNaW51c1QgJSBiYXNlTWludXNULCAwKSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWMocSwgMCkpKTtcblx0XHRcdFx0XHRiaWFzID0gYWRhcHQoZGVsdGEsIGhhbmRsZWRDUENvdW50UGx1c09uZSwgaGFuZGxlZENQQ291bnQgPT0gYmFzaWNMZW5ndGgpO1xuXHRcdFx0XHRcdGRlbHRhID0gMDtcblx0XHRcdFx0XHQrK2hhbmRsZWRDUENvdW50O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCsrZGVsdGE7XG5cdFx0XHQrK247XG5cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dC5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzXG5cdCAqIHRvIFVuaWNvZGUuIE9ubHkgdGhlIFB1bnljb2RlZCBwYXJ0cyBvZiB0aGUgaW5wdXQgd2lsbCBiZSBjb252ZXJ0ZWQsIGkuZS5cblx0ICogaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgb24gYSBzdHJpbmcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuXG5cdCAqIGNvbnZlcnRlZCB0byBVbmljb2RlLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZWQgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0b1xuXHQgKiBjb252ZXJ0IHRvIFVuaWNvZGUuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBQdW55Y29kZVxuXHQgKiBzdHJpbmcuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b1VuaWNvZGUoaW5wdXQpIHtcblx0XHRyZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdHJldHVybiByZWdleFB1bnljb2RlLnRlc3Qoc3RyaW5nKVxuXHRcdFx0XHQ/IGRlY29kZShzdHJpbmcuc2xpY2UoNCkudG9Mb3dlckNhc2UoKSlcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBVbmljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzIHRvXG5cdCAqIFB1bnljb2RlLiBPbmx5IHRoZSBub24tQVNDSUkgcGFydHMgb2YgdGhlIGRvbWFpbiBuYW1lIHdpbGwgYmUgY29udmVydGVkLFxuXHQgKiBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCdzIGFscmVhZHkgaW5cblx0ICogQVNDSUkuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MgdG8gY29udmVydCwgYXMgYVxuXHQgKiBVbmljb2RlIHN0cmluZy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIFB1bnljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBkb21haW4gbmFtZSBvclxuXHQgKiBlbWFpbCBhZGRyZXNzLlxuXHQgKi9cblx0ZnVuY3Rpb24gdG9BU0NJSShpbnB1dCkge1xuXHRcdHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdFx0cmV0dXJuIHJlZ2V4Tm9uQVNDSUkudGVzdChzdHJpbmcpXG5cdFx0XHRcdD8gJ3huLS0nICsgZW5jb2RlKHN0cmluZylcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKiogRGVmaW5lIHRoZSBwdWJsaWMgQVBJICovXG5cdHB1bnljb2RlID0ge1xuXHRcdC8qKlxuXHRcdCAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBQdW55Y29kZS5qcyB2ZXJzaW9uIG51bWJlci5cblx0XHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0XHQgKiBAdHlwZSBTdHJpbmdcblx0XHQgKi9cblx0XHQndmVyc2lvbic6ICcxLjQuMScsXG5cdFx0LyoqXG5cdFx0ICogQW4gb2JqZWN0IG9mIG1ldGhvZHMgdG8gY29udmVydCBmcm9tIEphdmFTY3JpcHQncyBpbnRlcm5hbCBjaGFyYWN0ZXJcblx0XHQgKiByZXByZXNlbnRhdGlvbiAoVUNTLTIpIHRvIFVuaWNvZGUgY29kZSBwb2ludHMsIGFuZCBiYWNrLlxuXHRcdCAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHRcdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHRcdCAqIEB0eXBlIE9iamVjdFxuXHRcdCAqL1xuXHRcdCd1Y3MyJzoge1xuXHRcdFx0J2RlY29kZSc6IHVjczJkZWNvZGUsXG5cdFx0XHQnZW5jb2RlJzogdWNzMmVuY29kZVxuXHRcdH0sXG5cdFx0J2RlY29kZSc6IGRlY29kZSxcblx0XHQnZW5jb2RlJzogZW5jb2RlLFxuXHRcdCd0b0FTQ0lJJzogdG9BU0NJSSxcblx0XHQndG9Vbmljb2RlJzogdG9Vbmljb2RlXG5cdH07XG5cblx0LyoqIEV4cG9zZSBgcHVueWNvZGVgICovXG5cdC8vIFNvbWUgQU1EIGJ1aWxkIG9wdGltaXplcnMsIGxpa2Ugci5qcywgY2hlY2sgZm9yIHNwZWNpZmljIGNvbmRpdGlvbiBwYXR0ZXJuc1xuXHQvLyBsaWtlIHRoZSBmb2xsb3dpbmc6XG5cdGlmIChcblx0XHR0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJlxuXHRcdGRlZmluZS5hbWRcblx0KSB7XG5cdFx0ZGVmaW5lKCdwdW55Y29kZScsIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHB1bnljb2RlO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKGZyZWVFeHBvcnRzICYmIGZyZWVNb2R1bGUpIHtcblx0XHRpZiAobW9kdWxlLmV4cG9ydHMgPT0gZnJlZUV4cG9ydHMpIHtcblx0XHRcdC8vIGluIE5vZGUuanMsIGlvLmpzLCBvciBSaW5nb0pTIHYwLjguMCtcblx0XHRcdGZyZWVNb2R1bGUuZXhwb3J0cyA9IHB1bnljb2RlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBpbiBOYXJ3aGFsIG9yIFJpbmdvSlMgdjAuNy4wLVxuXHRcdFx0Zm9yIChrZXkgaW4gcHVueWNvZGUpIHtcblx0XHRcdFx0cHVueWNvZGUuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAoZnJlZUV4cG9ydHNba2V5XSA9IHB1bnljb2RlW2tleV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBpbiBSaGlubyBvciBhIHdlYiBicm93c2VyXG5cdFx0cm9vdC5wdW55Y29kZSA9IHB1bnljb2RlO1xuXHR9XG5cbn0odGhpcykpO1xuIiwiLypcbiAqIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4gKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4gKiBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbiAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbiAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbiAqIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuICogZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbiAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1NcbiAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0ZcbiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbiAqIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4gKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4gKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHB1bnljb2RlID0gcmVxdWlyZSgncHVueWNvZGUvJyk7XG5cbmZ1bmN0aW9uIFVybCgpIHtcbiAgdGhpcy5wcm90b2NvbCA9IG51bGw7XG4gIHRoaXMuc2xhc2hlcyA9IG51bGw7XG4gIHRoaXMuYXV0aCA9IG51bGw7XG4gIHRoaXMuaG9zdCA9IG51bGw7XG4gIHRoaXMucG9ydCA9IG51bGw7XG4gIHRoaXMuaG9zdG5hbWUgPSBudWxsO1xuICB0aGlzLmhhc2ggPSBudWxsO1xuICB0aGlzLnNlYXJjaCA9IG51bGw7XG4gIHRoaXMucXVlcnkgPSBudWxsO1xuICB0aGlzLnBhdGhuYW1lID0gbnVsbDtcbiAgdGhpcy5wYXRoID0gbnVsbDtcbiAgdGhpcy5ocmVmID0gbnVsbDtcbn1cblxuLy8gUmVmZXJlbmNlOiBSRkMgMzk4NiwgUkZDIDE4MDgsIFJGQyAyMzk2XG5cbi8qXG4gKiBkZWZpbmUgdGhlc2UgaGVyZSBzbyBhdCBsZWFzdCB0aGV5IG9ubHkgaGF2ZSB0byBiZVxuICogY29tcGlsZWQgb25jZSBvbiB0aGUgZmlyc3QgbW9kdWxlIGxvYWQuXG4gKi9cbnZhciBwcm90b2NvbFBhdHRlcm4gPSAvXihbYS16MC05ListXSs6KS9pLFxuICBwb3J0UGF0dGVybiA9IC86WzAtOV0qJC8sXG5cbiAgLy8gU3BlY2lhbCBjYXNlIGZvciBhIHNpbXBsZSBwYXRoIFVSTFxuICBzaW1wbGVQYXRoUGF0dGVybiA9IC9eKFxcL1xcLz8oPyFcXC8pW14/XFxzXSopKFxcP1teXFxzXSopPyQvLFxuXG4gIC8qXG4gICAqIFJGQyAyMzk2OiBjaGFyYWN0ZXJzIHJlc2VydmVkIGZvciBkZWxpbWl0aW5nIFVSTHMuXG4gICAqIFdlIGFjdHVhbGx5IGp1c3QgYXV0by1lc2NhcGUgdGhlc2UuXG4gICAqL1xuICBkZWxpbXMgPSBbXG4gICAgJzwnLCAnPicsICdcIicsICdgJywgJyAnLCAnXFxyJywgJ1xcbicsICdcXHQnXG4gIF0sXG5cbiAgLy8gUkZDIDIzOTY6IGNoYXJhY3RlcnMgbm90IGFsbG93ZWQgZm9yIHZhcmlvdXMgcmVhc29ucy5cbiAgdW53aXNlID0gW1xuICAgICd7JywgJ30nLCAnfCcsICdcXFxcJywgJ14nLCAnYCdcbiAgXS5jb25jYXQoZGVsaW1zKSxcblxuICAvLyBBbGxvd2VkIGJ5IFJGQ3MsIGJ1dCBjYXVzZSBvZiBYU1MgYXR0YWNrcy4gIEFsd2F5cyBlc2NhcGUgdGhlc2UuXG4gIGF1dG9Fc2NhcGUgPSBbJ1xcJyddLmNvbmNhdCh1bndpc2UpLFxuICAvKlxuICAgKiBDaGFyYWN0ZXJzIHRoYXQgYXJlIG5ldmVyIGV2ZXIgYWxsb3dlZCBpbiBhIGhvc3RuYW1lLlxuICAgKiBOb3RlIHRoYXQgYW55IGludmFsaWQgY2hhcnMgYXJlIGFsc28gaGFuZGxlZCwgYnV0IHRoZXNlXG4gICAqIGFyZSB0aGUgb25lcyB0aGF0IGFyZSAqZXhwZWN0ZWQqIHRvIGJlIHNlZW4sIHNvIHdlIGZhc3QtcGF0aFxuICAgKiB0aGVtLlxuICAgKi9cbiAgbm9uSG9zdENoYXJzID0gW1xuICAgICclJywgJy8nLCAnPycsICc7JywgJyMnXG4gIF0uY29uY2F0KGF1dG9Fc2NhcGUpLFxuICBob3N0RW5kaW5nQ2hhcnMgPSBbXG4gICAgJy8nLCAnPycsICcjJ1xuICBdLFxuICBob3N0bmFtZU1heExlbiA9IDI1NSxcbiAgaG9zdG5hbWVQYXJ0UGF0dGVybiA9IC9eWythLXowLTlBLVpfLV17MCw2M30kLyxcbiAgaG9zdG5hbWVQYXJ0U3RhcnQgPSAvXihbK2EtejAtOUEtWl8tXXswLDYzfSkoLiopJC8sXG4gIC8vIHByb3RvY29scyB0aGF0IGNhbiBhbGxvdyBcInVuc2FmZVwiIGFuZCBcInVud2lzZVwiIGNoYXJzLlxuICB1bnNhZmVQcm90b2NvbCA9IHtcbiAgICBqYXZhc2NyaXB0OiB0cnVlLFxuICAgICdqYXZhc2NyaXB0Oic6IHRydWVcbiAgfSxcbiAgLy8gcHJvdG9jb2xzIHRoYXQgbmV2ZXIgaGF2ZSBhIGhvc3RuYW1lLlxuICBob3N0bGVzc1Byb3RvY29sID0ge1xuICAgIGphdmFzY3JpcHQ6IHRydWUsXG4gICAgJ2phdmFzY3JpcHQ6JzogdHJ1ZVxuICB9LFxuICAvLyBwcm90b2NvbHMgdGhhdCBhbHdheXMgY29udGFpbiBhIC8vIGJpdC5cbiAgc2xhc2hlZFByb3RvY29sID0ge1xuICAgIGh0dHA6IHRydWUsXG4gICAgaHR0cHM6IHRydWUsXG4gICAgZnRwOiB0cnVlLFxuICAgIGdvcGhlcjogdHJ1ZSxcbiAgICBmaWxlOiB0cnVlLFxuICAgICdodHRwOic6IHRydWUsXG4gICAgJ2h0dHBzOic6IHRydWUsXG4gICAgJ2Z0cDonOiB0cnVlLFxuICAgICdnb3BoZXI6JzogdHJ1ZSxcbiAgICAnZmlsZTonOiB0cnVlXG4gIH0sXG4gIHF1ZXJ5c3RyaW5nID0gcmVxdWlyZSgncXMnKTtcblxuZnVuY3Rpb24gdXJsUGFyc2UodXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCkge1xuICBpZiAodXJsICYmIHR5cGVvZiB1cmwgPT09ICdvYmplY3QnICYmIHVybCBpbnN0YW5jZW9mIFVybCkgeyByZXR1cm4gdXJsOyB9XG5cbiAgdmFyIHUgPSBuZXcgVXJsKCk7XG4gIHUucGFyc2UodXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCk7XG4gIHJldHVybiB1O1xufVxuXG5VcmwucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgaWYgKHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlBhcmFtZXRlciAndXJsJyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgXCIgKyB0eXBlb2YgdXJsKTtcbiAgfVxuXG4gIC8qXG4gICAqIENvcHkgY2hyb21lLCBJRSwgb3BlcmEgYmFja3NsYXNoLWhhbmRsaW5nIGJlaGF2aW9yLlxuICAgKiBCYWNrIHNsYXNoZXMgYmVmb3JlIHRoZSBxdWVyeSBzdHJpbmcgZ2V0IGNvbnZlcnRlZCB0byBmb3J3YXJkIHNsYXNoZXNcbiAgICogU2VlOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MjU5MTZcbiAgICovXG4gIHZhciBxdWVyeUluZGV4ID0gdXJsLmluZGV4T2YoJz8nKSxcbiAgICBzcGxpdHRlciA9IHF1ZXJ5SW5kZXggIT09IC0xICYmIHF1ZXJ5SW5kZXggPCB1cmwuaW5kZXhPZignIycpID8gJz8nIDogJyMnLFxuICAgIHVTcGxpdCA9IHVybC5zcGxpdChzcGxpdHRlciksXG4gICAgc2xhc2hSZWdleCA9IC9cXFxcL2c7XG4gIHVTcGxpdFswXSA9IHVTcGxpdFswXS5yZXBsYWNlKHNsYXNoUmVnZXgsICcvJyk7XG4gIHVybCA9IHVTcGxpdC5qb2luKHNwbGl0dGVyKTtcblxuICB2YXIgcmVzdCA9IHVybDtcblxuICAvKlxuICAgKiB0cmltIGJlZm9yZSBwcm9jZWVkaW5nLlxuICAgKiBUaGlzIGlzIHRvIHN1cHBvcnQgcGFyc2Ugc3R1ZmYgbGlrZSBcIiAgaHR0cDovL2Zvby5jb20gIFxcblwiXG4gICAqL1xuICByZXN0ID0gcmVzdC50cmltKCk7XG5cbiAgaWYgKCFzbGFzaGVzRGVub3RlSG9zdCAmJiB1cmwuc3BsaXQoJyMnKS5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBUcnkgZmFzdCBwYXRoIHJlZ2V4cFxuICAgIHZhciBzaW1wbGVQYXRoID0gc2ltcGxlUGF0aFBhdHRlcm4uZXhlYyhyZXN0KTtcbiAgICBpZiAoc2ltcGxlUGF0aCkge1xuICAgICAgdGhpcy5wYXRoID0gcmVzdDtcbiAgICAgIHRoaXMuaHJlZiA9IHJlc3Q7XG4gICAgICB0aGlzLnBhdGhuYW1lID0gc2ltcGxlUGF0aFsxXTtcbiAgICAgIGlmIChzaW1wbGVQYXRoWzJdKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gc2ltcGxlUGF0aFsyXTtcbiAgICAgICAgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnlzdHJpbmcucGFyc2UodGhpcy5zZWFyY2guc3Vic3RyKDEpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5ID0gdGhpcy5zZWFyY2guc3Vic3RyKDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSAnJztcbiAgICAgICAgdGhpcy5xdWVyeSA9IHt9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XG5cbiAgdmFyIHByb3RvID0gcHJvdG9jb2xQYXR0ZXJuLmV4ZWMocmVzdCk7XG4gIGlmIChwcm90bykge1xuICAgIHByb3RvID0gcHJvdG9bMF07XG4gICAgdmFyIGxvd2VyUHJvdG8gPSBwcm90by50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMucHJvdG9jb2wgPSBsb3dlclByb3RvO1xuICAgIHJlc3QgPSByZXN0LnN1YnN0cihwcm90by5sZW5ndGgpO1xuICB9XG5cbiAgLypcbiAgICogZmlndXJlIG91dCBpZiBpdCdzIGdvdCBhIGhvc3RcbiAgICogdXNlckBzZXJ2ZXIgaXMgKmFsd2F5cyogaW50ZXJwcmV0ZWQgYXMgYSBob3N0bmFtZSwgYW5kIHVybFxuICAgKiByZXNvbHV0aW9uIHdpbGwgdHJlYXQgLy9mb28vYmFyIGFzIGhvc3Q9Zm9vLHBhdGg9YmFyIGJlY2F1c2UgdGhhdCdzXG4gICAqIGhvdyB0aGUgYnJvd3NlciByZXNvbHZlcyByZWxhdGl2ZSBVUkxzLlxuICAgKi9cbiAgaWYgKHNsYXNoZXNEZW5vdGVIb3N0IHx8IHByb3RvIHx8IHJlc3QubWF0Y2goL15cXC9cXC9bXkAvXStAW15AL10rLykpIHtcbiAgICB2YXIgc2xhc2hlcyA9IHJlc3Quc3Vic3RyKDAsIDIpID09PSAnLy8nO1xuICAgIGlmIChzbGFzaGVzICYmICEocHJvdG8gJiYgaG9zdGxlc3NQcm90b2NvbFtwcm90b10pKSB7XG4gICAgICByZXN0ID0gcmVzdC5zdWJzdHIoMik7XG4gICAgICB0aGlzLnNsYXNoZXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaG9zdGxlc3NQcm90b2NvbFtwcm90b10gJiYgKHNsYXNoZXMgfHwgKHByb3RvICYmICFzbGFzaGVkUHJvdG9jb2xbcHJvdG9dKSkpIHtcblxuICAgIC8qXG4gICAgICogdGhlcmUncyBhIGhvc3RuYW1lLlxuICAgICAqIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiAvLCA/LCA7LCBvciAjIGVuZHMgdGhlIGhvc3QuXG4gICAgICpcbiAgICAgKiBJZiB0aGVyZSBpcyBhbiBAIGluIHRoZSBob3N0bmFtZSwgdGhlbiBub24taG9zdCBjaGFycyAqYXJlKiBhbGxvd2VkXG4gICAgICogdG8gdGhlIGxlZnQgb2YgdGhlIGxhc3QgQCBzaWduLCB1bmxlc3Mgc29tZSBob3N0LWVuZGluZyBjaGFyYWN0ZXJcbiAgICAgKiBjb21lcyAqYmVmb3JlKiB0aGUgQC1zaWduLlxuICAgICAqIFVSTHMgYXJlIG9ibm94aW91cy5cbiAgICAgKlxuICAgICAqIGV4OlxuICAgICAqIGh0dHA6Ly9hQGJAYy8gPT4gdXNlcjphQGIgaG9zdDpjXG4gICAgICogaHR0cDovL2FAYj9AYyA9PiB1c2VyOmEgaG9zdDpjIHBhdGg6Lz9AY1xuICAgICAqL1xuXG4gICAgLypcbiAgICAgKiB2MC4xMiBUT0RPKGlzYWFjcyk6IFRoaXMgaXMgbm90IHF1aXRlIGhvdyBDaHJvbWUgZG9lcyB0aGluZ3MuXG4gICAgICogUmV2aWV3IG91ciB0ZXN0IGNhc2UgYWdhaW5zdCBicm93c2VycyBtb3JlIGNvbXByZWhlbnNpdmVseS5cbiAgICAgKi9cblxuICAgIC8vIGZpbmQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGFueSBob3N0RW5kaW5nQ2hhcnNcbiAgICB2YXIgaG9zdEVuZCA9IC0xO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaG9zdEVuZGluZ0NoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaGVjID0gcmVzdC5pbmRleE9mKGhvc3RFbmRpbmdDaGFyc1tpXSk7XG4gICAgICBpZiAoaGVjICE9PSAtMSAmJiAoaG9zdEVuZCA9PT0gLTEgfHwgaGVjIDwgaG9zdEVuZCkpIHsgaG9zdEVuZCA9IGhlYzsgfVxuICAgIH1cblxuICAgIC8qXG4gICAgICogYXQgdGhpcyBwb2ludCwgZWl0aGVyIHdlIGhhdmUgYW4gZXhwbGljaXQgcG9pbnQgd2hlcmUgdGhlXG4gICAgICogYXV0aCBwb3J0aW9uIGNhbm5vdCBnbyBwYXN0LCBvciB0aGUgbGFzdCBAIGNoYXIgaXMgdGhlIGRlY2lkZXIuXG4gICAgICovXG4gICAgdmFyIGF1dGgsIGF0U2lnbjtcbiAgICBpZiAoaG9zdEVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIGF0U2lnbiBjYW4gYmUgYW55d2hlcmUuXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qXG4gICAgICAgKiBhdFNpZ24gbXVzdCBiZSBpbiBhdXRoIHBvcnRpb24uXG4gICAgICAgKiBodHRwOi8vYUBiL2NAZCA9PiBob3N0OmIgYXV0aDphIHBhdGg6L2NAZFxuICAgICAgICovXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJywgaG9zdEVuZCk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBOb3cgd2UgaGF2ZSBhIHBvcnRpb24gd2hpY2ggaXMgZGVmaW5pdGVseSB0aGUgYXV0aC5cbiAgICAgKiBQdWxsIHRoYXQgb2ZmLlxuICAgICAqL1xuICAgIGlmIChhdFNpZ24gIT09IC0xKSB7XG4gICAgICBhdXRoID0gcmVzdC5zbGljZSgwLCBhdFNpZ24pO1xuICAgICAgcmVzdCA9IHJlc3Quc2xpY2UoYXRTaWduICsgMSk7XG4gICAgICB0aGlzLmF1dGggPSBkZWNvZGVVUklDb21wb25lbnQoYXV0aCk7XG4gICAgfVxuXG4gICAgLy8gdGhlIGhvc3QgaXMgdGhlIHJlbWFpbmluZyB0byB0aGUgbGVmdCBvZiB0aGUgZmlyc3Qgbm9uLWhvc3QgY2hhclxuICAgIGhvc3RFbmQgPSAtMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vbkhvc3RDaGFycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhlYyA9IHJlc3QuaW5kZXhPZihub25Ib3N0Q2hhcnNbaV0pO1xuICAgICAgaWYgKGhlYyAhPT0gLTEgJiYgKGhvc3RFbmQgPT09IC0xIHx8IGhlYyA8IGhvc3RFbmQpKSB7IGhvc3RFbmQgPSBoZWM7IH1cbiAgICB9XG4gICAgLy8gaWYgd2Ugc3RpbGwgaGF2ZSBub3QgaGl0IGl0LCB0aGVuIHRoZSBlbnRpcmUgdGhpbmcgaXMgYSBob3N0LlxuICAgIGlmIChob3N0RW5kID09PSAtMSkgeyBob3N0RW5kID0gcmVzdC5sZW5ndGg7IH1cblxuICAgIHRoaXMuaG9zdCA9IHJlc3Quc2xpY2UoMCwgaG9zdEVuZCk7XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoaG9zdEVuZCk7XG5cbiAgICAvLyBwdWxsIG91dCBwb3J0LlxuICAgIHRoaXMucGFyc2VIb3N0KCk7XG5cbiAgICAvKlxuICAgICAqIHdlJ3ZlIGluZGljYXRlZCB0aGF0IHRoZXJlIGlzIGEgaG9zdG5hbWUsXG4gICAgICogc28gZXZlbiBpZiBpdCdzIGVtcHR5LCBpdCBoYXMgdG8gYmUgcHJlc2VudC5cbiAgICAgKi9cbiAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZSB8fCAnJztcblxuICAgIC8qXG4gICAgICogaWYgaG9zdG5hbWUgYmVnaW5zIHdpdGggWyBhbmQgZW5kcyB3aXRoIF1cbiAgICAgKiBhc3N1bWUgdGhhdCBpdCdzIGFuIElQdjYgYWRkcmVzcy5cbiAgICAgKi9cbiAgICB2YXIgaXB2Nkhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZVswXSA9PT0gJ1snICYmIHRoaXMuaG9zdG5hbWVbdGhpcy5ob3N0bmFtZS5sZW5ndGggLSAxXSA9PT0gJ10nO1xuXG4gICAgLy8gdmFsaWRhdGUgYSBsaXR0bGUuXG4gICAgaWYgKCFpcHY2SG9zdG5hbWUpIHtcbiAgICAgIHZhciBob3N0cGFydHMgPSB0aGlzLmhvc3RuYW1lLnNwbGl0KC9cXC4vKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gaG9zdHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB2YXIgcGFydCA9IGhvc3RwYXJ0c1tpXTtcbiAgICAgICAgaWYgKCFwYXJ0KSB7IGNvbnRpbnVlOyB9XG4gICAgICAgIGlmICghcGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgIHZhciBuZXdwYXJ0ID0gJyc7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGsgPSBwYXJ0Lmxlbmd0aDsgaiA8IGs7IGorKykge1xuICAgICAgICAgICAgaWYgKHBhcnQuY2hhckNvZGVBdChqKSA+IDEyNykge1xuICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgKiB3ZSByZXBsYWNlIG5vbi1BU0NJSSBjaGFyIHdpdGggYSB0ZW1wb3JhcnkgcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICogd2UgbmVlZCB0aGlzIHRvIG1ha2Ugc3VyZSBzaXplIG9mIGhvc3RuYW1lIGlzIG5vdFxuICAgICAgICAgICAgICAgKiBicm9rZW4gYnkgcmVwbGFjaW5nIG5vbi1BU0NJSSBieSBub3RoaW5nXG4gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICBuZXdwYXJ0ICs9ICd4JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5ld3BhcnQgKz0gcGFydFtqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gd2UgdGVzdCBhZ2FpbiB3aXRoIEFTQ0lJIGNoYXIgb25seVxuICAgICAgICAgIGlmICghbmV3cGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgICAgdmFyIHZhbGlkUGFydHMgPSBob3N0cGFydHMuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICB2YXIgbm90SG9zdCA9IGhvc3RwYXJ0cy5zbGljZShpICsgMSk7XG4gICAgICAgICAgICB2YXIgYml0ID0gcGFydC5tYXRjaChob3N0bmFtZVBhcnRTdGFydCk7XG4gICAgICAgICAgICBpZiAoYml0KSB7XG4gICAgICAgICAgICAgIHZhbGlkUGFydHMucHVzaChiaXRbMV0pO1xuICAgICAgICAgICAgICBub3RIb3N0LnVuc2hpZnQoYml0WzJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub3RIb3N0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXN0ID0gJy8nICsgbm90SG9zdC5qb2luKCcuJykgKyByZXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ob3N0bmFtZSA9IHZhbGlkUGFydHMuam9pbignLicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaG9zdG5hbWUubGVuZ3RoID4gaG9zdG5hbWVNYXhMZW4pIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaG9zdG5hbWVzIGFyZSBhbHdheXMgbG93ZXIgY2FzZS5cbiAgICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFpcHY2SG9zdG5hbWUpIHtcbiAgICAgIC8qXG4gICAgICAgKiBJRE5BIFN1cHBvcnQ6IFJldHVybnMgYSBwdW55Y29kZWQgcmVwcmVzZW50YXRpb24gb2YgXCJkb21haW5cIi5cbiAgICAgICAqIEl0IG9ubHkgY29udmVydHMgcGFydHMgb2YgdGhlIGRvbWFpbiBuYW1lIHRoYXRcbiAgICAgICAqIGhhdmUgbm9uLUFTQ0lJIGNoYXJhY3RlcnMsIGkuZS4gaXQgZG9lc24ndCBtYXR0ZXIgaWZcbiAgICAgICAqIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCBhbHJlYWR5IGlzIEFTQ0lJLW9ubHkuXG4gICAgICAgKi9cbiAgICAgIHRoaXMuaG9zdG5hbWUgPSBwdW55Y29kZS50b0FTQ0lJKHRoaXMuaG9zdG5hbWUpO1xuICAgIH1cblxuICAgIHZhciBwID0gdGhpcy5wb3J0ID8gJzonICsgdGhpcy5wb3J0IDogJyc7XG4gICAgdmFyIGggPSB0aGlzLmhvc3RuYW1lIHx8ICcnO1xuICAgIHRoaXMuaG9zdCA9IGggKyBwO1xuICAgIHRoaXMuaHJlZiArPSB0aGlzLmhvc3Q7XG5cbiAgICAvKlxuICAgICAqIHN0cmlwIFsgYW5kIF0gZnJvbSB0aGUgaG9zdG5hbWVcbiAgICAgKiB0aGUgaG9zdCBmaWVsZCBzdGlsbCByZXRhaW5zIHRoZW0sIHRob3VnaFxuICAgICAqL1xuICAgIGlmIChpcHY2SG9zdG5hbWUpIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnN1YnN0cigxLCB0aGlzLmhvc3RuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgaWYgKHJlc3RbMF0gIT09ICcvJykge1xuICAgICAgICByZXN0ID0gJy8nICsgcmVzdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKlxuICAgKiBub3cgcmVzdCBpcyBzZXQgdG8gdGhlIHBvc3QtaG9zdCBzdHVmZi5cbiAgICogY2hvcCBvZmYgYW55IGRlbGltIGNoYXJzLlxuICAgKi9cbiAgaWYgKCF1bnNhZmVQcm90b2NvbFtsb3dlclByb3RvXSkge1xuXG4gICAgLypcbiAgICAgKiBGaXJzdCwgbWFrZSAxMDAlIHN1cmUgdGhhdCBhbnkgXCJhdXRvRXNjYXBlXCIgY2hhcnMgZ2V0XG4gICAgICogZXNjYXBlZCwgZXZlbiBpZiBlbmNvZGVVUklDb21wb25lbnQgZG9lc24ndCB0aGluayB0aGV5XG4gICAgICogbmVlZCB0byBiZS5cbiAgICAgKi9cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGF1dG9Fc2NhcGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgYWUgPSBhdXRvRXNjYXBlW2ldO1xuICAgICAgaWYgKHJlc3QuaW5kZXhPZihhZSkgPT09IC0xKSB7IGNvbnRpbnVlOyB9XG4gICAgICB2YXIgZXNjID0gZW5jb2RlVVJJQ29tcG9uZW50KGFlKTtcbiAgICAgIGlmIChlc2MgPT09IGFlKSB7XG4gICAgICAgIGVzYyA9IGVzY2FwZShhZSk7XG4gICAgICB9XG4gICAgICByZXN0ID0gcmVzdC5zcGxpdChhZSkuam9pbihlc2MpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNob3Agb2ZmIGZyb20gdGhlIHRhaWwgZmlyc3QuXG4gIHZhciBoYXNoID0gcmVzdC5pbmRleE9mKCcjJyk7XG4gIGlmIChoYXNoICE9PSAtMSkge1xuICAgIC8vIGdvdCBhIGZyYWdtZW50IHN0cmluZy5cbiAgICB0aGlzLmhhc2ggPSByZXN0LnN1YnN0cihoYXNoKTtcbiAgICByZXN0ID0gcmVzdC5zbGljZSgwLCBoYXNoKTtcbiAgfVxuICB2YXIgcW0gPSByZXN0LmluZGV4T2YoJz8nKTtcbiAgaWYgKHFtICE9PSAtMSkge1xuICAgIHRoaXMuc2VhcmNoID0gcmVzdC5zdWJzdHIocW0pO1xuICAgIHRoaXMucXVlcnkgPSByZXN0LnN1YnN0cihxbSArIDEpO1xuICAgIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnlzdHJpbmcucGFyc2UodGhpcy5xdWVyeSk7XG4gICAgfVxuICAgIHJlc3QgPSByZXN0LnNsaWNlKDAsIHFtKTtcbiAgfSBlbHNlIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgLy8gbm8gcXVlcnkgc3RyaW5nLCBidXQgcGFyc2VRdWVyeVN0cmluZyBzdGlsbCByZXF1ZXN0ZWRcbiAgICB0aGlzLnNlYXJjaCA9ICcnO1xuICAgIHRoaXMucXVlcnkgPSB7fTtcbiAgfVxuICBpZiAocmVzdCkgeyB0aGlzLnBhdGhuYW1lID0gcmVzdDsgfVxuICBpZiAoc2xhc2hlZFByb3RvY29sW2xvd2VyUHJvdG9dICYmIHRoaXMuaG9zdG5hbWUgJiYgIXRoaXMucGF0aG5hbWUpIHtcbiAgICB0aGlzLnBhdGhuYW1lID0gJy8nO1xuICB9XG5cbiAgLy8gdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgaWYgKHRoaXMucGF0aG5hbWUgfHwgdGhpcy5zZWFyY2gpIHtcbiAgICB2YXIgcCA9IHRoaXMucGF0aG5hbWUgfHwgJyc7XG4gICAgdmFyIHMgPSB0aGlzLnNlYXJjaCB8fCAnJztcbiAgICB0aGlzLnBhdGggPSBwICsgcztcbiAgfVxuXG4gIC8vIGZpbmFsbHksIHJlY29uc3RydWN0IHRoZSBocmVmIGJhc2VkIG9uIHdoYXQgaGFzIGJlZW4gdmFsaWRhdGVkLlxuICB0aGlzLmhyZWYgPSB0aGlzLmZvcm1hdCgpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGZvcm1hdCBhIHBhcnNlZCBvYmplY3QgaW50byBhIHVybCBzdHJpbmdcbmZ1bmN0aW9uIHVybEZvcm1hdChvYmopIHtcbiAgLypcbiAgICogZW5zdXJlIGl0J3MgYW4gb2JqZWN0LCBhbmQgbm90IGEgc3RyaW5nIHVybC5cbiAgICogSWYgaXQncyBhbiBvYmosIHRoaXMgaXMgYSBuby1vcC5cbiAgICogdGhpcyB3YXksIHlvdSBjYW4gY2FsbCB1cmxfZm9ybWF0KCkgb24gc3RyaW5nc1xuICAgKiB0byBjbGVhbiB1cCBwb3RlbnRpYWxseSB3b25reSB1cmxzLlxuICAgKi9cbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7IG9iaiA9IHVybFBhcnNlKG9iaik7IH1cbiAgaWYgKCEob2JqIGluc3RhbmNlb2YgVXJsKSkgeyByZXR1cm4gVXJsLnByb3RvdHlwZS5mb3JtYXQuY2FsbChvYmopOyB9XG4gIHJldHVybiBvYmouZm9ybWF0KCk7XG59XG5cblVybC5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgYXV0aCA9IHRoaXMuYXV0aCB8fCAnJztcbiAgaWYgKGF1dGgpIHtcbiAgICBhdXRoID0gZW5jb2RlVVJJQ29tcG9uZW50KGF1dGgpO1xuICAgIGF1dGggPSBhdXRoLnJlcGxhY2UoLyUzQS9pLCAnOicpO1xuICAgIGF1dGggKz0gJ0AnO1xuICB9XG5cbiAgdmFyIHByb3RvY29sID0gdGhpcy5wcm90b2NvbCB8fCAnJyxcbiAgICBwYXRobmFtZSA9IHRoaXMucGF0aG5hbWUgfHwgJycsXG4gICAgaGFzaCA9IHRoaXMuaGFzaCB8fCAnJyxcbiAgICBob3N0ID0gZmFsc2UsXG4gICAgcXVlcnkgPSAnJztcblxuICBpZiAodGhpcy5ob3N0KSB7XG4gICAgaG9zdCA9IGF1dGggKyB0aGlzLmhvc3Q7XG4gIH0gZWxzZSBpZiAodGhpcy5ob3N0bmFtZSkge1xuICAgIGhvc3QgPSBhdXRoICsgKHRoaXMuaG9zdG5hbWUuaW5kZXhPZignOicpID09PSAtMSA/IHRoaXMuaG9zdG5hbWUgOiAnWycgKyB0aGlzLmhvc3RuYW1lICsgJ10nKTtcbiAgICBpZiAodGhpcy5wb3J0KSB7XG4gICAgICBob3N0ICs9ICc6JyArIHRoaXMucG9ydDtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5xdWVyeSAmJiB0eXBlb2YgdGhpcy5xdWVyeSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXModGhpcy5xdWVyeSkubGVuZ3RoKSB7XG4gICAgcXVlcnkgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkodGhpcy5xdWVyeSwge1xuICAgICAgYXJyYXlGb3JtYXQ6ICdyZXBlYXQnLFxuICAgICAgYWRkUXVlcnlQcmVmaXg6IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICB2YXIgc2VhcmNoID0gdGhpcy5zZWFyY2ggfHwgKHF1ZXJ5ICYmICgnPycgKyBxdWVyeSkpIHx8ICcnO1xuXG4gIGlmIChwcm90b2NvbCAmJiBwcm90b2NvbC5zdWJzdHIoLTEpICE9PSAnOicpIHsgcHJvdG9jb2wgKz0gJzonOyB9XG5cbiAgLypcbiAgICogb25seSB0aGUgc2xhc2hlZFByb3RvY29scyBnZXQgdGhlIC8vLiAgTm90IG1haWx0bzosIHhtcHA6LCBldGMuXG4gICAqIHVubGVzcyB0aGV5IGhhZCB0aGVtIHRvIGJlZ2luIHdpdGguXG4gICAqL1xuICBpZiAodGhpcy5zbGFzaGVzIHx8ICghcHJvdG9jb2wgfHwgc2xhc2hlZFByb3RvY29sW3Byb3RvY29sXSkgJiYgaG9zdCAhPT0gZmFsc2UpIHtcbiAgICBob3N0ID0gJy8vJyArIChob3N0IHx8ICcnKTtcbiAgICBpZiAocGF0aG5hbWUgJiYgcGF0aG5hbWUuY2hhckF0KDApICE9PSAnLycpIHsgcGF0aG5hbWUgPSAnLycgKyBwYXRobmFtZTsgfVxuICB9IGVsc2UgaWYgKCFob3N0KSB7XG4gICAgaG9zdCA9ICcnO1xuICB9XG5cbiAgaWYgKGhhc2ggJiYgaGFzaC5jaGFyQXQoMCkgIT09ICcjJykgeyBoYXNoID0gJyMnICsgaGFzaDsgfVxuICBpZiAoc2VhcmNoICYmIHNlYXJjaC5jaGFyQXQoMCkgIT09ICc/JykgeyBzZWFyY2ggPSAnPycgKyBzZWFyY2g7IH1cblxuICBwYXRobmFtZSA9IHBhdGhuYW1lLnJlcGxhY2UoL1s/I10vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChtYXRjaCk7XG4gIH0pO1xuICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgnIycsICclMjMnKTtcblxuICByZXR1cm4gcHJvdG9jb2wgKyBob3N0ICsgcGF0aG5hbWUgKyBzZWFyY2ggKyBoYXNoO1xufTtcblxuZnVuY3Rpb24gdXJsUmVzb2x2ZShzb3VyY2UsIHJlbGF0aXZlKSB7XG4gIHJldHVybiB1cmxQYXJzZShzb3VyY2UsIGZhbHNlLCB0cnVlKS5yZXNvbHZlKHJlbGF0aXZlKTtcbn1cblxuVXJsLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24gKHJlbGF0aXZlKSB7XG4gIHJldHVybiB0aGlzLnJlc29sdmVPYmplY3QodXJsUGFyc2UocmVsYXRpdmUsIGZhbHNlLCB0cnVlKSkuZm9ybWF0KCk7XG59O1xuXG5mdW5jdGlvbiB1cmxSZXNvbHZlT2JqZWN0KHNvdXJjZSwgcmVsYXRpdmUpIHtcbiAgaWYgKCFzb3VyY2UpIHsgcmV0dXJuIHJlbGF0aXZlOyB9XG4gIHJldHVybiB1cmxQYXJzZShzb3VyY2UsIGZhbHNlLCB0cnVlKS5yZXNvbHZlT2JqZWN0KHJlbGF0aXZlKTtcbn1cblxuVXJsLnByb3RvdHlwZS5yZXNvbHZlT2JqZWN0ID0gZnVuY3Rpb24gKHJlbGF0aXZlKSB7XG4gIGlmICh0eXBlb2YgcmVsYXRpdmUgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIHJlbCA9IG5ldyBVcmwoKTtcbiAgICByZWwucGFyc2UocmVsYXRpdmUsIGZhbHNlLCB0cnVlKTtcbiAgICByZWxhdGl2ZSA9IHJlbDtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSBuZXcgVXJsKCk7XG4gIHZhciB0a2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpO1xuICBmb3IgKHZhciB0ayA9IDA7IHRrIDwgdGtleXMubGVuZ3RoOyB0aysrKSB7XG4gICAgdmFyIHRrZXkgPSB0a2V5c1t0a107XG4gICAgcmVzdWx0W3RrZXldID0gdGhpc1t0a2V5XTtcbiAgfVxuXG4gIC8qXG4gICAqIGhhc2ggaXMgYWx3YXlzIG92ZXJyaWRkZW4sIG5vIG1hdHRlciB3aGF0LlxuICAgKiBldmVuIGhyZWY9XCJcIiB3aWxsIHJlbW92ZSBpdC5cbiAgICovXG4gIHJlc3VsdC5oYXNoID0gcmVsYXRpdmUuaGFzaDtcblxuICAvLyBpZiB0aGUgcmVsYXRpdmUgdXJsIGlzIGVtcHR5LCB0aGVuIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvIGhlcmUuXG4gIGlmIChyZWxhdGl2ZS5ocmVmID09PSAnJykge1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBocmVmcyBsaWtlIC8vZm9vL2JhciBhbHdheXMgY3V0IHRvIHRoZSBwcm90b2NvbC5cbiAgaWYgKHJlbGF0aXZlLnNsYXNoZXMgJiYgIXJlbGF0aXZlLnByb3RvY29sKSB7XG4gICAgLy8gdGFrZSBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgcHJvdG9jb2wgZnJvbSByZWxhdGl2ZVxuICAgIHZhciBya2V5cyA9IE9iamVjdC5rZXlzKHJlbGF0aXZlKTtcbiAgICBmb3IgKHZhciByayA9IDA7IHJrIDwgcmtleXMubGVuZ3RoOyByaysrKSB7XG4gICAgICB2YXIgcmtleSA9IHJrZXlzW3JrXTtcbiAgICAgIGlmIChya2V5ICE9PSAncHJvdG9jb2wnKSB7IHJlc3VsdFtya2V5XSA9IHJlbGF0aXZlW3JrZXldOyB9XG4gICAgfVxuXG4gICAgLy8gdXJsUGFyc2UgYXBwZW5kcyB0cmFpbGluZyAvIHRvIHVybHMgbGlrZSBodHRwOi8vd3d3LmV4YW1wbGUuY29tXG4gICAgaWYgKHNsYXNoZWRQcm90b2NvbFtyZXN1bHQucHJvdG9jb2xdICYmIHJlc3VsdC5ob3N0bmFtZSAmJiAhcmVzdWx0LnBhdGhuYW1lKSB7XG4gICAgICByZXN1bHQucGF0aG5hbWUgPSAnLyc7XG4gICAgICByZXN1bHQucGF0aCA9IHJlc3VsdC5wYXRobmFtZTtcbiAgICB9XG5cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKHJlbGF0aXZlLnByb3RvY29sICYmIHJlbGF0aXZlLnByb3RvY29sICE9PSByZXN1bHQucHJvdG9jb2wpIHtcbiAgICAvKlxuICAgICAqIGlmIGl0J3MgYSBrbm93biB1cmwgcHJvdG9jb2wsIHRoZW4gY2hhbmdpbmdcbiAgICAgKiB0aGUgcHJvdG9jb2wgZG9lcyB3ZWlyZCB0aGluZ3NcbiAgICAgKiBmaXJzdCwgaWYgaXQncyBub3QgZmlsZTosIHRoZW4gd2UgTVVTVCBoYXZlIGEgaG9zdCxcbiAgICAgKiBhbmQgaWYgdGhlcmUgd2FzIGEgcGF0aFxuICAgICAqIHRvIGJlZ2luIHdpdGgsIHRoZW4gd2UgTVVTVCBoYXZlIGEgcGF0aC5cbiAgICAgKiBpZiBpdCBpcyBmaWxlOiwgdGhlbiB0aGUgaG9zdCBpcyBkcm9wcGVkLFxuICAgICAqIGJlY2F1c2UgdGhhdCdzIGtub3duIHRvIGJlIGhvc3RsZXNzLlxuICAgICAqIGFueXRoaW5nIGVsc2UgaXMgYXNzdW1lZCB0byBiZSBhYnNvbHV0ZS5cbiAgICAgKi9cbiAgICBpZiAoIXNsYXNoZWRQcm90b2NvbFtyZWxhdGl2ZS5wcm90b2NvbF0pIHtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocmVsYXRpdmUpO1xuICAgICAgZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzLmxlbmd0aDsgdisrKSB7XG4gICAgICAgIHZhciBrID0ga2V5c1t2XTtcbiAgICAgICAgcmVzdWx0W2tdID0gcmVsYXRpdmVba107XG4gICAgICB9XG4gICAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmVzdWx0LnByb3RvY29sID0gcmVsYXRpdmUucHJvdG9jb2w7XG4gICAgaWYgKCFyZWxhdGl2ZS5ob3N0ICYmICFob3N0bGVzc1Byb3RvY29sW3JlbGF0aXZlLnByb3RvY29sXSkge1xuICAgICAgdmFyIHJlbFBhdGggPSAocmVsYXRpdmUucGF0aG5hbWUgfHwgJycpLnNwbGl0KCcvJyk7XG4gICAgICB3aGlsZSAocmVsUGF0aC5sZW5ndGggJiYgIShyZWxhdGl2ZS5ob3N0ID0gcmVsUGF0aC5zaGlmdCgpKSkgeyB9XG4gICAgICBpZiAoIXJlbGF0aXZlLmhvc3QpIHsgcmVsYXRpdmUuaG9zdCA9ICcnOyB9XG4gICAgICBpZiAoIXJlbGF0aXZlLmhvc3RuYW1lKSB7IHJlbGF0aXZlLmhvc3RuYW1lID0gJyc7IH1cbiAgICAgIGlmIChyZWxQYXRoWzBdICE9PSAnJykgeyByZWxQYXRoLnVuc2hpZnQoJycpOyB9XG4gICAgICBpZiAocmVsUGF0aC5sZW5ndGggPCAyKSB7IHJlbFBhdGgudW5zaGlmdCgnJyk7IH1cbiAgICAgIHJlc3VsdC5wYXRobmFtZSA9IHJlbFBhdGguam9pbignLycpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucGF0aG5hbWUgPSByZWxhdGl2ZS5wYXRobmFtZTtcbiAgICB9XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICByZXN1bHQuaG9zdCA9IHJlbGF0aXZlLmhvc3QgfHwgJyc7XG4gICAgcmVzdWx0LmF1dGggPSByZWxhdGl2ZS5hdXRoO1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlbGF0aXZlLmhvc3RuYW1lIHx8IHJlbGF0aXZlLmhvc3Q7XG4gICAgcmVzdWx0LnBvcnQgPSByZWxhdGl2ZS5wb3J0O1xuICAgIC8vIHRvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKHJlc3VsdC5wYXRobmFtZSB8fCByZXN1bHQuc2VhcmNoKSB7XG4gICAgICB2YXIgcCA9IHJlc3VsdC5wYXRobmFtZSB8fCAnJztcbiAgICAgIHZhciBzID0gcmVzdWx0LnNlYXJjaCB8fCAnJztcbiAgICAgIHJlc3VsdC5wYXRoID0gcCArIHM7XG4gICAgfVxuICAgIHJlc3VsdC5zbGFzaGVzID0gcmVzdWx0LnNsYXNoZXMgfHwgcmVsYXRpdmUuc2xhc2hlcztcbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdmFyIGlzU291cmNlQWJzID0gcmVzdWx0LnBhdGhuYW1lICYmIHJlc3VsdC5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJyxcbiAgICBpc1JlbEFicyA9IHJlbGF0aXZlLmhvc3QgfHwgcmVsYXRpdmUucGF0aG5hbWUgJiYgcmVsYXRpdmUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycsXG4gICAgbXVzdEVuZEFicyA9IGlzUmVsQWJzIHx8IGlzU291cmNlQWJzIHx8IChyZXN1bHQuaG9zdCAmJiByZWxhdGl2ZS5wYXRobmFtZSksXG4gICAgcmVtb3ZlQWxsRG90cyA9IG11c3RFbmRBYnMsXG4gICAgc3JjUGF0aCA9IHJlc3VsdC5wYXRobmFtZSAmJiByZXN1bHQucGF0aG5hbWUuc3BsaXQoJy8nKSB8fCBbXSxcbiAgICByZWxQYXRoID0gcmVsYXRpdmUucGF0aG5hbWUgJiYgcmVsYXRpdmUucGF0aG5hbWUuc3BsaXQoJy8nKSB8fCBbXSxcbiAgICBwc3ljaG90aWMgPSByZXN1bHQucHJvdG9jb2wgJiYgIXNsYXNoZWRQcm90b2NvbFtyZXN1bHQucHJvdG9jb2xdO1xuXG4gIC8qXG4gICAqIGlmIHRoZSB1cmwgaXMgYSBub24tc2xhc2hlZCB1cmwsIHRoZW4gcmVsYXRpdmVcbiAgICogbGlua3MgbGlrZSAuLi8uLiBzaG91bGQgYmUgYWJsZVxuICAgKiB0byBjcmF3bCB1cCB0byB0aGUgaG9zdG5hbWUsIGFzIHdlbGwuICBUaGlzIGlzIHN0cmFuZ2UuXG4gICAqIHJlc3VsdC5wcm90b2NvbCBoYXMgYWxyZWFkeSBiZWVuIHNldCBieSBub3cuXG4gICAqIExhdGVyIG9uLCBwdXQgdGhlIGZpcnN0IHBhdGggcGFydCBpbnRvIHRoZSBob3N0IGZpZWxkLlxuICAgKi9cbiAgaWYgKHBzeWNob3RpYykge1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9ICcnO1xuICAgIHJlc3VsdC5wb3J0ID0gbnVsbDtcbiAgICBpZiAocmVzdWx0Lmhvc3QpIHtcbiAgICAgIGlmIChzcmNQYXRoWzBdID09PSAnJykgeyBzcmNQYXRoWzBdID0gcmVzdWx0Lmhvc3Q7IH0gZWxzZSB7IHNyY1BhdGgudW5zaGlmdChyZXN1bHQuaG9zdCk7IH1cbiAgICB9XG4gICAgcmVzdWx0Lmhvc3QgPSAnJztcbiAgICBpZiAocmVsYXRpdmUucHJvdG9jb2wpIHtcbiAgICAgIHJlbGF0aXZlLmhvc3RuYW1lID0gbnVsbDtcbiAgICAgIHJlbGF0aXZlLnBvcnQgPSBudWxsO1xuICAgICAgaWYgKHJlbGF0aXZlLmhvc3QpIHtcbiAgICAgICAgaWYgKHJlbFBhdGhbMF0gPT09ICcnKSB7IHJlbFBhdGhbMF0gPSByZWxhdGl2ZS5ob3N0OyB9IGVsc2UgeyByZWxQYXRoLnVuc2hpZnQocmVsYXRpdmUuaG9zdCk7IH1cbiAgICAgIH1cbiAgICAgIHJlbGF0aXZlLmhvc3QgPSBudWxsO1xuICAgIH1cbiAgICBtdXN0RW5kQWJzID0gbXVzdEVuZEFicyAmJiAocmVsUGF0aFswXSA9PT0gJycgfHwgc3JjUGF0aFswXSA9PT0gJycpO1xuICB9XG5cbiAgaWYgKGlzUmVsQWJzKSB7XG4gICAgLy8gaXQncyBhYnNvbHV0ZS5cbiAgICByZXN1bHQuaG9zdCA9IHJlbGF0aXZlLmhvc3QgfHwgcmVsYXRpdmUuaG9zdCA9PT0gJycgPyByZWxhdGl2ZS5ob3N0IDogcmVzdWx0Lmhvc3Q7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdG5hbWUgPT09ICcnID8gcmVsYXRpdmUuaG9zdG5hbWUgOiByZXN1bHQuaG9zdG5hbWU7XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICBzcmNQYXRoID0gcmVsUGF0aDtcbiAgICAvLyBmYWxsIHRocm91Z2ggdG8gdGhlIGRvdC1oYW5kbGluZyBiZWxvdy5cbiAgfSBlbHNlIGlmIChyZWxQYXRoLmxlbmd0aCkge1xuICAgIC8qXG4gICAgICogaXQncyByZWxhdGl2ZVxuICAgICAqIHRocm93IGF3YXkgdGhlIGV4aXN0aW5nIGZpbGUsIGFuZCB0YWtlIHRoZSBuZXcgcGF0aCBpbnN0ZWFkLlxuICAgICAqL1xuICAgIGlmICghc3JjUGF0aCkgeyBzcmNQYXRoID0gW107IH1cbiAgICBzcmNQYXRoLnBvcCgpO1xuICAgIHNyY1BhdGggPSBzcmNQYXRoLmNvbmNhdChyZWxQYXRoKTtcbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICB9IGVsc2UgaWYgKHJlbGF0aXZlLnNlYXJjaCAhPSBudWxsKSB7XG4gICAgLypcbiAgICAgKiBqdXN0IHB1bGwgb3V0IHRoZSBzZWFyY2guXG4gICAgICogbGlrZSBocmVmPSc/Zm9vJy5cbiAgICAgKiBQdXQgdGhpcyBhZnRlciB0aGUgb3RoZXIgdHdvIGNhc2VzIGJlY2F1c2UgaXQgc2ltcGxpZmllcyB0aGUgYm9vbGVhbnNcbiAgICAgKi9cbiAgICBpZiAocHN5Y2hvdGljKSB7XG4gICAgICByZXN1bHQuaG9zdCA9IHNyY1BhdGguc2hpZnQoKTtcbiAgICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlc3VsdC5ob3N0O1xuICAgICAgLypcbiAgICAgICAqIG9jY2F0aW9uYWx5IHRoZSBhdXRoIGNhbiBnZXQgc3R1Y2sgb25seSBpbiBob3N0XG4gICAgICAgKiB0aGlzIGVzcGVjaWFsbHkgaGFwcGVucyBpbiBjYXNlcyBsaWtlXG4gICAgICAgKiB1cmwucmVzb2x2ZU9iamVjdCgnbWFpbHRvOmxvY2FsMUBkb21haW4xJywgJ2xvY2FsMkBkb21haW4yJylcbiAgICAgICAqL1xuICAgICAgdmFyIGF1dGhJbkhvc3QgPSByZXN1bHQuaG9zdCAmJiByZXN1bHQuaG9zdC5pbmRleE9mKCdAJykgPiAwID8gcmVzdWx0Lmhvc3Quc3BsaXQoJ0AnKSA6IGZhbHNlO1xuICAgICAgaWYgKGF1dGhJbkhvc3QpIHtcbiAgICAgICAgcmVzdWx0LmF1dGggPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICAgIHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgICAgcmVzdWx0Lmhvc3QgPSByZXN1bHQuaG9zdG5hbWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gICAgLy8gdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAocmVzdWx0LnBhdGhuYW1lICE9PSBudWxsIHx8IHJlc3VsdC5zZWFyY2ggIT09IG51bGwpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gKHJlc3VsdC5wYXRobmFtZSA/IHJlc3VsdC5wYXRobmFtZSA6ICcnKSArIChyZXN1bHQuc2VhcmNoID8gcmVzdWx0LnNlYXJjaCA6ICcnKTtcbiAgICB9XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmICghc3JjUGF0aC5sZW5ndGgpIHtcbiAgICAvKlxuICAgICAqIG5vIHBhdGggYXQgYWxsLiAgZWFzeS5cbiAgICAgKiB3ZSd2ZSBhbHJlYWR5IGhhbmRsZWQgdGhlIG90aGVyIHN0dWZmIGFib3ZlLlxuICAgICAqL1xuICAgIHJlc3VsdC5wYXRobmFtZSA9IG51bGw7XG4gICAgLy8gdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAocmVzdWx0LnNlYXJjaCkge1xuICAgICAgcmVzdWx0LnBhdGggPSAnLycgKyByZXN1bHQuc2VhcmNoO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucGF0aCA9IG51bGw7XG4gICAgfVxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKlxuICAgKiBpZiBhIHVybCBFTkRzIGluIC4gb3IgLi4sIHRoZW4gaXQgbXVzdCBnZXQgYSB0cmFpbGluZyBzbGFzaC5cbiAgICogaG93ZXZlciwgaWYgaXQgZW5kcyBpbiBhbnl0aGluZyBlbHNlIG5vbi1zbGFzaHksXG4gICAqIHRoZW4gaXQgbXVzdCBOT1QgZ2V0IGEgdHJhaWxpbmcgc2xhc2guXG4gICAqL1xuICB2YXIgbGFzdCA9IHNyY1BhdGguc2xpY2UoLTEpWzBdO1xuICB2YXIgaGFzVHJhaWxpbmdTbGFzaCA9IChyZXN1bHQuaG9zdCB8fCByZWxhdGl2ZS5ob3N0IHx8IHNyY1BhdGgubGVuZ3RoID4gMSkgJiYgKGxhc3QgPT09ICcuJyB8fCBsYXN0ID09PSAnLi4nKSB8fCBsYXN0ID09PSAnJztcblxuICAvKlxuICAgKiBzdHJpcCBzaW5nbGUgZG90cywgcmVzb2x2ZSBkb3VibGUgZG90cyB0byBwYXJlbnQgZGlyXG4gICAqIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gICAqL1xuICB2YXIgdXAgPSAwO1xuICBmb3IgKHZhciBpID0gc3JjUGF0aC5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XG4gICAgbGFzdCA9IHNyY1BhdGhbaV07XG4gICAgaWYgKGxhc3QgPT09ICcuJykge1xuICAgICAgc3JjUGF0aC5zcGxpY2UoaSwgMSk7XG4gICAgfSBlbHNlIGlmIChsYXN0ID09PSAnLi4nKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCkge1xuICAgICAgc3JjUGF0aC5zcGxpY2UoaSwgMSk7XG4gICAgICB1cC0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBwYXRoIGlzIGFsbG93ZWQgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIHJlc3RvcmUgbGVhZGluZyAuLnNcbiAgaWYgKCFtdXN0RW5kQWJzICYmICFyZW1vdmVBbGxEb3RzKSB7XG4gICAgZm9yICg7IHVwLS07IHVwKSB7XG4gICAgICBzcmNQYXRoLnVuc2hpZnQoJy4uJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG11c3RFbmRBYnMgJiYgc3JjUGF0aFswXSAhPT0gJycgJiYgKCFzcmNQYXRoWzBdIHx8IHNyY1BhdGhbMF0uY2hhckF0KDApICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmIChoYXNUcmFpbGluZ1NsYXNoICYmIChzcmNQYXRoLmpvaW4oJy8nKS5zdWJzdHIoLTEpICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC5wdXNoKCcnKTtcbiAgfVxuXG4gIHZhciBpc0Fic29sdXRlID0gc3JjUGF0aFswXSA9PT0gJycgfHwgKHNyY1BhdGhbMF0gJiYgc3JjUGF0aFswXS5jaGFyQXQoMCkgPT09ICcvJyk7XG5cbiAgLy8gcHV0IHRoZSBob3N0IGJhY2tcbiAgaWYgKHBzeWNob3RpYykge1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IGlzQWJzb2x1dGUgPyAnJyA6IHNyY1BhdGgubGVuZ3RoID8gc3JjUGF0aC5zaGlmdCgpIDogJyc7XG4gICAgcmVzdWx0Lmhvc3QgPSByZXN1bHQuaG9zdG5hbWU7XG4gICAgLypcbiAgICAgKiBvY2NhdGlvbmFseSB0aGUgYXV0aCBjYW4gZ2V0IHN0dWNrIG9ubHkgaW4gaG9zdFxuICAgICAqIHRoaXMgZXNwZWNpYWxseSBoYXBwZW5zIGluIGNhc2VzIGxpa2VcbiAgICAgKiB1cmwucmVzb2x2ZU9iamVjdCgnbWFpbHRvOmxvY2FsMUBkb21haW4xJywgJ2xvY2FsMkBkb21haW4yJylcbiAgICAgKi9cbiAgICB2YXIgYXV0aEluSG9zdCA9IHJlc3VsdC5ob3N0ICYmIHJlc3VsdC5ob3N0LmluZGV4T2YoJ0AnKSA+IDAgPyByZXN1bHQuaG9zdC5zcGxpdCgnQCcpIDogZmFsc2U7XG4gICAgaWYgKGF1dGhJbkhvc3QpIHtcbiAgICAgIHJlc3VsdC5hdXRoID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgcmVzdWx0Lmhvc3RuYW1lID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgcmVzdWx0Lmhvc3QgPSByZXN1bHQuaG9zdG5hbWU7XG4gICAgfVxuICB9XG5cbiAgbXVzdEVuZEFicyA9IG11c3RFbmRBYnMgfHwgKHJlc3VsdC5ob3N0ICYmIHNyY1BhdGgubGVuZ3RoKTtcblxuICBpZiAobXVzdEVuZEFicyAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHNyY1BhdGgudW5zaGlmdCgnJyk7XG4gIH1cblxuICBpZiAoc3JjUGF0aC5sZW5ndGggPiAwKSB7XG4gICAgcmVzdWx0LnBhdGhuYW1lID0gc3JjUGF0aC5qb2luKCcvJyk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0LnBhdGhuYW1lID0gbnVsbDtcbiAgICByZXN1bHQucGF0aCA9IG51bGw7XG4gIH1cblxuICAvLyB0byBzdXBwb3J0IHJlcXVlc3QuaHR0cFxuICBpZiAocmVzdWx0LnBhdGhuYW1lICE9PSBudWxsIHx8IHJlc3VsdC5zZWFyY2ggIT09IG51bGwpIHtcbiAgICByZXN1bHQucGF0aCA9IChyZXN1bHQucGF0aG5hbWUgPyByZXN1bHQucGF0aG5hbWUgOiAnJykgKyAocmVzdWx0LnNlYXJjaCA/IHJlc3VsdC5zZWFyY2ggOiAnJyk7XG4gIH1cbiAgcmVzdWx0LmF1dGggPSByZWxhdGl2ZS5hdXRoIHx8IHJlc3VsdC5hdXRoO1xuICByZXN1bHQuc2xhc2hlcyA9IHJlc3VsdC5zbGFzaGVzIHx8IHJlbGF0aXZlLnNsYXNoZXM7XG4gIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuVXJsLnByb3RvdHlwZS5wYXJzZUhvc3QgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBob3N0ID0gdGhpcy5ob3N0O1xuICB2YXIgcG9ydCA9IHBvcnRQYXR0ZXJuLmV4ZWMoaG9zdCk7XG4gIGlmIChwb3J0KSB7XG4gICAgcG9ydCA9IHBvcnRbMF07XG4gICAgaWYgKHBvcnQgIT09ICc6Jykge1xuICAgICAgdGhpcy5wb3J0ID0gcG9ydC5zdWJzdHIoMSk7XG4gICAgfVxuICAgIGhvc3QgPSBob3N0LnN1YnN0cigwLCBob3N0Lmxlbmd0aCAtIHBvcnQubGVuZ3RoKTtcbiAgfVxuICBpZiAoaG9zdCkgeyB0aGlzLmhvc3RuYW1lID0gaG9zdDsgfVxufTtcblxuZXhwb3J0cy5wYXJzZSA9IHVybFBhcnNlO1xuZXhwb3J0cy5yZXNvbHZlID0gdXJsUmVzb2x2ZTtcbmV4cG9ydHMucmVzb2x2ZU9iamVjdCA9IHVybFJlc29sdmVPYmplY3Q7XG5leHBvcnRzLmZvcm1hdCA9IHVybEZvcm1hdDtcblxuZXhwb3J0cy5VcmwgPSBVcmw7XG4iLCJjb25zdCByYW5kb21VVUlEID0gdHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQgJiYgY3J5cHRvLnJhbmRvbVVVSUQuYmluZChjcnlwdG8pO1xuZXhwb3J0IGRlZmF1bHQge1xuICByYW5kb21VVUlEXG59OyIsImV4cG9ydCBkZWZhdWx0IC9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTsiLCIvLyBVbmlxdWUgSUQgY3JlYXRpb24gcmVxdWlyZXMgYSBoaWdoIHF1YWxpdHkgcmFuZG9tICMgZ2VuZXJhdG9yLiBJbiB0aGUgYnJvd3NlciB3ZSB0aGVyZWZvcmVcbi8vIHJlcXVpcmUgdGhlIGNyeXB0byBBUEkgYW5kIGRvIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGZhbGxiYWNrIHRvIGxvd2VyIHF1YWxpdHkgcmFuZG9tIG51bWJlclxuLy8gZ2VuZXJhdG9ycyAobGlrZSBNYXRoLnJhbmRvbSgpKS5cbmxldCBnZXRSYW5kb21WYWx1ZXM7XG5jb25zdCBybmRzOCA9IG5ldyBVaW50OEFycmF5KDE2KTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJuZygpIHtcbiAgLy8gbGF6eSBsb2FkIHNvIHRoYXQgZW52aXJvbm1lbnRzIHRoYXQgbmVlZCB0byBwb2x5ZmlsbCBoYXZlIGEgY2hhbmNlIHRvIGRvIHNvXG4gIGlmICghZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgLy8gZ2V0UmFuZG9tVmFsdWVzIG5lZWRzIHRvIGJlIGludm9rZWQgaW4gYSBjb250ZXh0IHdoZXJlIFwidGhpc1wiIGlzIGEgQ3J5cHRvIGltcGxlbWVudGF0aW9uLlxuICAgIGdldFJhbmRvbVZhbHVlcyA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byk7XG5cbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbi8qKlxuICogQ29udmVydCBhcnJheSBvZiAxNiBieXRlIHZhbHVlcyB0byBVVUlEIHN0cmluZyBmb3JtYXQgb2YgdGhlIGZvcm06XG4gKiBYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFhcbiAqL1xuXG5jb25zdCBieXRlVG9IZXggPSBbXTtcblxuZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICBieXRlVG9IZXgucHVzaCgoaSArIDB4MTAwKS50b1N0cmluZygxNikuc2xpY2UoMSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5zYWZlU3RyaW5naWZ5KGFyciwgb2Zmc2V0ID0gMCkge1xuICAvLyBOb3RlOiBCZSBjYXJlZnVsIGVkaXRpbmcgdGhpcyBjb2RlISAgSXQncyBiZWVuIHR1bmVkIGZvciBwZXJmb3JtYW5jZVxuICAvLyBhbmQgd29ya3MgaW4gd2F5cyB5b3UgbWF5IG5vdCBleHBlY3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQvcHVsbC80MzRcbiAgcmV0dXJuIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgM11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDVdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA3XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDhdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxM11dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNV1dO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnkoYXJyLCBvZmZzZXQgPSAwKSB7XG4gIGNvbnN0IHV1aWQgPSB1bnNhZmVTdHJpbmdpZnkoYXJyLCBvZmZzZXQpOyAvLyBDb25zaXN0ZW5jeSBjaGVjayBmb3IgdmFsaWQgVVVJRC4gIElmIHRoaXMgdGhyb3dzLCBpdCdzIGxpa2VseSBkdWUgdG8gb25lXG4gIC8vIG9mIHRoZSBmb2xsb3dpbmc6XG4gIC8vIC0gT25lIG9yIG1vcmUgaW5wdXQgYXJyYXkgdmFsdWVzIGRvbid0IG1hcCB0byBhIGhleCBvY3RldCAobGVhZGluZyB0b1xuICAvLyBcInVuZGVmaW5lZFwiIGluIHRoZSB1dWlkKVxuICAvLyAtIEludmFsaWQgaW5wdXQgdmFsdWVzIGZvciB0aGUgUkZDIGB2ZXJzaW9uYCBvciBgdmFyaWFudGAgZmllbGRzXG5cbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkJyk7XG4gIH1cblxuICByZXR1cm4gdXVpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RyaW5naWZ5OyIsImltcG9ydCBuYXRpdmUgZnJvbSAnLi9uYXRpdmUuanMnO1xuaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVTdHJpbmdpZnkgfSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5cbmZ1bmN0aW9uIHY0KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIGlmIChuYXRpdmUucmFuZG9tVVVJRCAmJiAhYnVmICYmICFvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5hdGl2ZS5yYW5kb21VVUlEKCk7XG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgY29uc3Qgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBybmcpKCk7IC8vIFBlciA0LjQsIHNldCBiaXRzIGZvciB2ZXJzaW9uIGFuZCBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGBcblxuICBybmRzWzZdID0gcm5kc1s2XSAmIDB4MGYgfCAweDQwO1xuICBybmRzWzhdID0gcm5kc1s4XSAmIDB4M2YgfCAweDgwOyAvLyBDb3B5IGJ5dGVzIHRvIGJ1ZmZlciwgaWYgcHJvdmlkZWRcblxuICBpZiAoYnVmKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHJuZHNbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIHJldHVybiB1bnNhZmVTdHJpbmdpZnkocm5kcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHY0OyIsImltcG9ydCBSRUdFWCBmcm9tICcuL3JlZ2V4LmpzJztcblxuZnVuY3Rpb24gdmFsaWRhdGUodXVpZCkge1xuICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnICYmIFJFR0VYLnRlc3QodXVpZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRlOyIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvdHlwZS1idWlsdGlucyAqL1xudmFyIGcgPVxuICAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbFRoaXMpIHx8XG4gICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZikgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWwpIHx8XG4gIHt9XG5cbnZhciBzdXBwb3J0ID0ge1xuICBzZWFyY2hQYXJhbXM6ICdVUkxTZWFyY2hQYXJhbXMnIGluIGcsXG4gIGl0ZXJhYmxlOiAnU3ltYm9sJyBpbiBnICYmICdpdGVyYXRvcicgaW4gU3ltYm9sLFxuICBibG9iOlxuICAgICdGaWxlUmVhZGVyJyBpbiBnICYmXG4gICAgJ0Jsb2InIGluIGcgJiZcbiAgICAoZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgQmxvYigpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH0pKCksXG4gIGZvcm1EYXRhOiAnRm9ybURhdGEnIGluIGcsXG4gIGFycmF5QnVmZmVyOiAnQXJyYXlCdWZmZXInIGluIGdcbn1cblxuZnVuY3Rpb24gaXNEYXRhVmlldyhvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBEYXRhVmlldy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvYmopXG59XG5cbmlmIChzdXBwb3J0LmFycmF5QnVmZmVyKSB7XG4gIHZhciB2aWV3Q2xhc3NlcyA9IFtcbiAgICAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBGbG9hdDY0QXJyYXldJ1xuICBdXG5cbiAgdmFyIGlzQXJyYXlCdWZmZXJWaWV3ID1cbiAgICBBcnJheUJ1ZmZlci5pc1ZpZXcgfHxcbiAgICBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdmlld0NsYXNzZXMuaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSkgPiAtMVxuICAgIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmFtZShuYW1lKSB7XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICBuYW1lID0gU3RyaW5nKG5hbWUpXG4gIH1cbiAgaWYgKC9bXmEtejAtOVxcLSMkJSYnKisuXl9gfH4hXS9pLnRlc3QobmFtZSkgfHwgbmFtZSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGNoYXJhY3RlciBpbiBoZWFkZXIgZmllbGQgbmFtZTogXCInICsgbmFtZSArICdcIicpXG4gIH1cbiAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgIHZhbHVlID0gU3RyaW5nKHZhbHVlKVxuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG4vLyBCdWlsZCBhIGRlc3RydWN0aXZlIGl0ZXJhdG9yIGZvciB0aGUgdmFsdWUgbGlzdFxuZnVuY3Rpb24gaXRlcmF0b3JGb3IoaXRlbXMpIHtcbiAgdmFyIGl0ZXJhdG9yID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHZhbHVlID0gaXRlbXMuc2hpZnQoKVxuICAgICAgcmV0dXJuIHtkb25lOiB2YWx1ZSA9PT0gdW5kZWZpbmVkLCB2YWx1ZTogdmFsdWV9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuaXRlcmFibGUpIHtcbiAgICBpdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gaXRlcmF0b3JcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXRlcmF0b3Jcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEhlYWRlcnMoaGVhZGVycykge1xuICB0aGlzLm1hcCA9IHt9XG5cbiAgaWYgKGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICB0aGlzLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICB9LCB0aGlzKVxuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVycykpIHtcbiAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24oaGVhZGVyKSB7XG4gICAgICBpZiAoaGVhZGVyLmxlbmd0aCAhPSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0hlYWRlcnMgY29uc3RydWN0b3I6IGV4cGVjdGVkIG5hbWUvdmFsdWUgcGFpciB0byBiZSBsZW5ndGggMiwgZm91bmQnICsgaGVhZGVyLmxlbmd0aClcbiAgICAgIH1cbiAgICAgIHRoaXMuYXBwZW5kKGhlYWRlclswXSwgaGVhZGVyWzFdKVxuICAgIH0sIHRoaXMpXG4gIH0gZWxzZSBpZiAoaGVhZGVycykge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgdGhpcy5hcHBlbmQobmFtZSwgaGVhZGVyc1tuYW1lXSlcbiAgICB9LCB0aGlzKVxuICB9XG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIG5hbWUgPSBub3JtYWxpemVOYW1lKG5hbWUpXG4gIHZhbHVlID0gbm9ybWFsaXplVmFsdWUodmFsdWUpXG4gIHZhciBvbGRWYWx1ZSA9IHRoaXMubWFwW25hbWVdXG4gIHRoaXMubWFwW25hbWVdID0gb2xkVmFsdWUgPyBvbGRWYWx1ZSArICcsICcgKyB2YWx1ZSA6IHZhbHVlXG59XG5cbkhlYWRlcnMucHJvdG90eXBlWydkZWxldGUnXSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgZGVsZXRlIHRoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSlcbiAgcmV0dXJuIHRoaXMuaGFzKG5hbWUpID8gdGhpcy5tYXBbbmFtZV0gOiBudWxsXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMubWFwLmhhc093blByb3BlcnR5KG5vcm1hbGl6ZU5hbWUobmFtZSkpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHRoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldID0gbm9ybWFsaXplVmFsdWUodmFsdWUpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaywgdGhpc0FyZykge1xuICBmb3IgKHZhciBuYW1lIGluIHRoaXMubWFwKSB7XG4gICAgaWYgKHRoaXMubWFwLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHRoaXMubWFwW25hbWVdLCBuYW1lLCB0aGlzKVxuICAgIH1cbiAgfVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IFtdXG4gIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgIGl0ZW1zLnB1c2gobmFtZSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGl0ZW1zID0gW11cbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaXRlbXMucHVzaCh2YWx1ZSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IFtdXG4gIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgIGl0ZW1zLnB1c2goW25hbWUsIHZhbHVlXSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5pZiAoc3VwcG9ydC5pdGVyYWJsZSkge1xuICBIZWFkZXJzLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gSGVhZGVycy5wcm90b3R5cGUuZW50cmllc1xufVxuXG5mdW5jdGlvbiBjb25zdW1lZChib2R5KSB7XG4gIGlmIChib2R5Ll9ub0JvZHkpIHJldHVyblxuICBpZiAoYm9keS5ib2R5VXNlZCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKCdBbHJlYWR5IHJlYWQnKSlcbiAgfVxuICBib2R5LmJvZHlVc2VkID0gdHJ1ZVxufVxuXG5mdW5jdGlvbiBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXNvbHZlKHJlYWRlci5yZXN1bHQpXG4gICAgfVxuICAgIHJlYWRlci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZWplY3QocmVhZGVyLmVycm9yKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2JBc0FycmF5QnVmZmVyKGJsb2IpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKClcbiAgdmFyIHByb21pc2UgPSBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKVxuICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYilcbiAgcmV0dXJuIHByb21pc2Vcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2JBc1RleHQoYmxvYikge1xuICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICB2YXIgcHJvbWlzZSA9IGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpXG4gIHZhciBtYXRjaCA9IC9jaGFyc2V0PShbQS1aYS16MC05Xy1dKykvLmV4ZWMoYmxvYi50eXBlKVxuICB2YXIgZW5jb2RpbmcgPSBtYXRjaCA/IG1hdGNoWzFdIDogJ3V0Zi04J1xuICByZWFkZXIucmVhZEFzVGV4dChibG9iLCBlbmNvZGluZylcbiAgcmV0dXJuIHByb21pc2Vcbn1cblxuZnVuY3Rpb24gcmVhZEFycmF5QnVmZmVyQXNUZXh0KGJ1Zikge1xuICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZilcbiAgdmFyIGNoYXJzID0gbmV3IEFycmF5KHZpZXcubGVuZ3RoKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykge1xuICAgIGNoYXJzW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZSh2aWV3W2ldKVxuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBidWZmZXJDbG9uZShidWYpIHtcbiAgaWYgKGJ1Zi5zbGljZSkge1xuICAgIHJldHVybiBidWYuc2xpY2UoMClcbiAgfSBlbHNlIHtcbiAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zi5ieXRlTGVuZ3RoKVxuICAgIHZpZXcuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZikpXG4gICAgcmV0dXJuIHZpZXcuYnVmZmVyXG4gIH1cbn1cblxuZnVuY3Rpb24gQm9keSgpIHtcbiAgdGhpcy5ib2R5VXNlZCA9IGZhbHNlXG5cbiAgdGhpcy5faW5pdEJvZHkgPSBmdW5jdGlvbihib2R5KSB7XG4gICAgLypcbiAgICAgIGZldGNoLW1vY2sgd3JhcHMgdGhlIFJlc3BvbnNlIG9iamVjdCBpbiBhbiBFUzYgUHJveHkgdG9cbiAgICAgIHByb3ZpZGUgdXNlZnVsIHRlc3QgaGFybmVzcyBmZWF0dXJlcyBzdWNoIGFzIGZsdXNoLiBIb3dldmVyLCBvblxuICAgICAgRVM1IGJyb3dzZXJzIHdpdGhvdXQgZmV0Y2ggb3IgUHJveHkgc3VwcG9ydCBwb2xseWZpbGxzIG11c3QgYmUgdXNlZDtcbiAgICAgIHRoZSBwcm94eS1wb2xseWZpbGwgaXMgdW5hYmxlIHRvIHByb3h5IGFuIGF0dHJpYnV0ZSB1bmxlc3MgaXQgZXhpc3RzXG4gICAgICBvbiB0aGUgb2JqZWN0IGJlZm9yZSB0aGUgUHJveHkgaXMgY3JlYXRlZC4gVGhpcyBjaGFuZ2UgZW5zdXJlc1xuICAgICAgUmVzcG9uc2UuYm9keVVzZWQgZXhpc3RzIG9uIHRoZSBpbnN0YW5jZSwgd2hpbGUgbWFpbnRhaW5pbmcgdGhlXG4gICAgICBzZW1hbnRpYyBvZiBzZXR0aW5nIFJlcXVlc3QuYm9keVVzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGJlZm9yZVxuICAgICAgX2luaXRCb2R5IGlzIGNhbGxlZC5cbiAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWFzc2lnblxuICAgIHRoaXMuYm9keVVzZWQgPSB0aGlzLmJvZHlVc2VkXG4gICAgdGhpcy5fYm9keUluaXQgPSBib2R5XG4gICAgaWYgKCFib2R5KSB7XG4gICAgICB0aGlzLl9ub0JvZHkgPSB0cnVlO1xuICAgICAgdGhpcy5fYm9keVRleHQgPSAnJ1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYmxvYiAmJiBCbG9iLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICB0aGlzLl9ib2R5QmxvYiA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuZm9ybURhdGEgJiYgRm9ybURhdGEucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlGb3JtRGF0YSA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuc2VhcmNoUGFyYW1zICYmIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5LnRvU3RyaW5nKClcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIgJiYgc3VwcG9ydC5ibG9iICYmIGlzRGF0YVZpZXcoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkuYnVmZmVyKVxuICAgICAgLy8gSUUgMTAtMTEgY2FuJ3QgaGFuZGxlIGEgRGF0YVZpZXcgYm9keS5cbiAgICAgIHRoaXMuX2JvZHlJbml0ID0gbmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pXG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyICYmIChBcnJheUJ1ZmZlci5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSB8fCBpc0FycmF5QnVmZmVyVmlldyhib2R5KSkpIHtcbiAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChib2R5KVxuICAgIH1cblxuICAgIGlmICghdGhpcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpIHtcbiAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ3RleHQvcGxhaW47Y2hhcnNldD1VVEYtOCcpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlCbG9iICYmIHRoaXMuX2JvZHlCbG9iLnR5cGUpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgdGhpcy5fYm9keUJsb2IudHlwZSlcbiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5zZWFyY2hQYXJhbXMgJiYgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCcpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuYmxvYikge1xuICAgIHRoaXMuYmxvYiA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0ZWRcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2JvZHlCbG9iKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUJsb2IpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKSlcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyBibG9iJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlUZXh0XSkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGhpcy5hcnJheUJ1ZmZlciA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgIHZhciBpc0NvbnN1bWVkID0gY29uc3VtZWQodGhpcylcbiAgICAgIGlmIChpc0NvbnN1bWVkKSB7XG4gICAgICAgIHJldHVybiBpc0NvbnN1bWVkXG4gICAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ1ZmZlci5zbGljZShcbiAgICAgICAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ5dGVPZmZzZXQgKyB0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmJsb2IpIHtcbiAgICAgIHJldHVybiB0aGlzLmJsb2IoKS50aGVuKHJlYWRCbG9iQXNBcnJheUJ1ZmZlcilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBhcyBBcnJheUJ1ZmZlcicpXG4gICAgfVxuICB9XG5cbiAgdGhpcy50ZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICBpZiAocmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiByZWplY3RlZFxuICAgIH1cblxuICAgIGlmICh0aGlzLl9ib2R5QmxvYikge1xuICAgICAgcmV0dXJuIHJlYWRCbG9iQXNUZXh0KHRoaXMuX2JvZHlCbG9iKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlYWRBcnJheUJ1ZmZlckFzVGV4dCh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgdGV4dCcpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keVRleHQpXG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuZm9ybURhdGEpIHtcbiAgICB0aGlzLmZvcm1EYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihkZWNvZGUpXG4gICAgfVxuICB9XG5cbiAgdGhpcy5qc29uID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oSlNPTi5wYXJzZSlcbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhUVFAgbWV0aG9kcyB3aG9zZSBjYXBpdGFsaXphdGlvbiBzaG91bGQgYmUgbm9ybWFsaXplZFxudmFyIG1ldGhvZHMgPSBbJ0NPTk5FQ1QnLCAnREVMRVRFJywgJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnLCAnUEFUQ0gnLCAnUE9TVCcsICdQVVQnLCAnVFJBQ0UnXVxuXG5mdW5jdGlvbiBub3JtYWxpemVNZXRob2QobWV0aG9kKSB7XG4gIHZhciB1cGNhc2VkID0gbWV0aG9kLnRvVXBwZXJDYXNlKClcbiAgcmV0dXJuIG1ldGhvZHMuaW5kZXhPZih1cGNhc2VkKSA+IC0xID8gdXBjYXNlZCA6IG1ldGhvZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gUmVxdWVzdChpbnB1dCwgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVxdWVzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQbGVhc2UgdXNlIHRoZSBcIm5ld1wiIG9wZXJhdG9yLCB0aGlzIERPTSBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLicpXG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keVxuXG4gIGlmIChpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICBpZiAoaW5wdXQuYm9keVVzZWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpXG4gICAgfVxuICAgIHRoaXMudXJsID0gaW5wdXQudXJsXG4gICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzXG4gICAgaWYgKCFvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKGlucHV0LmhlYWRlcnMpXG4gICAgfVxuICAgIHRoaXMubWV0aG9kID0gaW5wdXQubWV0aG9kXG4gICAgdGhpcy5tb2RlID0gaW5wdXQubW9kZVxuICAgIHRoaXMuc2lnbmFsID0gaW5wdXQuc2lnbmFsXG4gICAgaWYgKCFib2R5ICYmIGlucHV0Ll9ib2R5SW5pdCAhPSBudWxsKSB7XG4gICAgICBib2R5ID0gaW5wdXQuX2JvZHlJbml0XG4gICAgICBpbnB1dC5ib2R5VXNlZCA9IHRydWVcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy51cmwgPSBTdHJpbmcoaW5wdXQpXG4gIH1cblxuICB0aGlzLmNyZWRlbnRpYWxzID0gb3B0aW9ucy5jcmVkZW50aWFscyB8fCB0aGlzLmNyZWRlbnRpYWxzIHx8ICdzYW1lLW9yaWdpbidcbiAgaWYgKG9wdGlvbnMuaGVhZGVycyB8fCAhdGhpcy5oZWFkZXJzKSB7XG4gICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKVxuICB9XG4gIHRoaXMubWV0aG9kID0gbm9ybWFsaXplTWV0aG9kKG9wdGlvbnMubWV0aG9kIHx8IHRoaXMubWV0aG9kIHx8ICdHRVQnKVxuICB0aGlzLm1vZGUgPSBvcHRpb25zLm1vZGUgfHwgdGhpcy5tb2RlIHx8IG51bGxcbiAgdGhpcy5zaWduYWwgPSBvcHRpb25zLnNpZ25hbCB8fCB0aGlzLnNpZ25hbCB8fCAoZnVuY3Rpb24gKCkge1xuICAgIGlmICgnQWJvcnRDb250cm9sbGVyJyBpbiBnKSB7XG4gICAgICB2YXIgY3RybCA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHJldHVybiBjdHJsLnNpZ25hbDtcbiAgICB9XG4gIH0oKSk7XG4gIHRoaXMucmVmZXJyZXIgPSBudWxsXG5cbiAgaWYgKCh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykgJiYgYm9keSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzJylcbiAgfVxuICB0aGlzLl9pbml0Qm9keShib2R5KVxuXG4gIGlmICh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykge1xuICAgIGlmIChvcHRpb25zLmNhY2hlID09PSAnbm8tc3RvcmUnIHx8IG9wdGlvbnMuY2FjaGUgPT09ICduby1jYWNoZScpIHtcbiAgICAgIC8vIFNlYXJjaCBmb3IgYSAnXycgcGFyYW1ldGVyIGluIHRoZSBxdWVyeSBzdHJpbmdcbiAgICAgIHZhciByZVBhcmFtU2VhcmNoID0gLyhbPyZdKV89W14mXSovXG4gICAgICBpZiAocmVQYXJhbVNlYXJjaC50ZXN0KHRoaXMudXJsKSkge1xuICAgICAgICAvLyBJZiBpdCBhbHJlYWR5IGV4aXN0cyB0aGVuIHNldCB0aGUgdmFsdWUgd2l0aCB0aGUgY3VycmVudCB0aW1lXG4gICAgICAgIHRoaXMudXJsID0gdGhpcy51cmwucmVwbGFjZShyZVBhcmFtU2VhcmNoLCAnJDFfPScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSBhZGQgYSBuZXcgJ18nIHBhcmFtZXRlciB0byB0aGUgZW5kIHdpdGggdGhlIGN1cnJlbnQgdGltZVxuICAgICAgICB2YXIgcmVRdWVyeVN0cmluZyA9IC9cXD8vXG4gICAgICAgIHRoaXMudXJsICs9IChyZVF1ZXJ5U3RyaW5nLnRlc3QodGhpcy51cmwpID8gJyYnIDogJz8nKSArICdfPScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFJlcXVlc3QodGhpcywge2JvZHk6IHRoaXMuX2JvZHlJbml0fSlcbn1cblxuZnVuY3Rpb24gZGVjb2RlKGJvZHkpIHtcbiAgdmFyIGZvcm0gPSBuZXcgRm9ybURhdGEoKVxuICBib2R5XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgnJicpXG4gICAgLmZvckVhY2goZnVuY3Rpb24oYnl0ZXMpIHtcbiAgICAgIGlmIChieXRlcykge1xuICAgICAgICB2YXIgc3BsaXQgPSBieXRlcy5zcGxpdCgnPScpXG4gICAgICAgIHZhciBuYW1lID0gc3BsaXQuc2hpZnQoKS5yZXBsYWNlKC9cXCsvZywgJyAnKVxuICAgICAgICB2YXIgdmFsdWUgPSBzcGxpdC5qb2luKCc9JykucmVwbGFjZSgvXFwrL2csICcgJylcbiAgICAgICAgZm9ybS5hcHBlbmQoZGVjb2RlVVJJQ29tcG9uZW50KG5hbWUpLCBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpKVxuICAgICAgfVxuICAgIH0pXG4gIHJldHVybiBmb3JtXG59XG5cbmZ1bmN0aW9uIHBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKSB7XG4gIHZhciBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKVxuICAvLyBSZXBsYWNlIGluc3RhbmNlcyBvZiBcXHJcXG4gYW5kIFxcbiBmb2xsb3dlZCBieSBhdCBsZWFzdCBvbmUgc3BhY2Ugb3IgaG9yaXpvbnRhbCB0YWIgd2l0aCBhIHNwYWNlXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4yXG4gIHZhciBwcmVQcm9jZXNzZWRIZWFkZXJzID0gcmF3SGVhZGVycy5yZXBsYWNlKC9cXHI/XFxuW1xcdCBdKy9nLCAnICcpXG4gIC8vIEF2b2lkaW5nIHNwbGl0IHZpYSByZWdleCB0byB3b3JrIGFyb3VuZCBhIGNvbW1vbiBJRTExIGJ1ZyB3aXRoIHRoZSBjb3JlLWpzIDMuNi4wIHJlZ2V4IHBvbHlmaWxsXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWIvZmV0Y2gvaXNzdWVzLzc0OFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNzUxXG4gIHByZVByb2Nlc3NlZEhlYWRlcnNcbiAgICAuc3BsaXQoJ1xccicpXG4gICAgLm1hcChmdW5jdGlvbihoZWFkZXIpIHtcbiAgICAgIHJldHVybiBoZWFkZXIuaW5kZXhPZignXFxuJykgPT09IDAgPyBoZWFkZXIuc3Vic3RyKDEsIGhlYWRlci5sZW5ndGgpIDogaGVhZGVyXG4gICAgfSlcbiAgICAuZm9yRWFjaChmdW5jdGlvbihsaW5lKSB7XG4gICAgICB2YXIgcGFydHMgPSBsaW5lLnNwbGl0KCc6JylcbiAgICAgIHZhciBrZXkgPSBwYXJ0cy5zaGlmdCgpLnRyaW0oKVxuICAgICAgaWYgKGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5qb2luKCc6JykudHJpbSgpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaGVhZGVycy5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1Jlc3BvbnNlICcgKyBlcnJvci5tZXNzYWdlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgcmV0dXJuIGhlYWRlcnNcbn1cblxuQm9keS5jYWxsKFJlcXVlc3QucHJvdG90eXBlKVxuXG5leHBvcnQgZnVuY3Rpb24gUmVzcG9uc2UoYm9keUluaXQsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlc3BvbnNlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BsZWFzZSB1c2UgdGhlIFwibmV3XCIgb3BlcmF0b3IsIHRoaXMgRE9NIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uJylcbiAgfVxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge31cbiAgfVxuXG4gIHRoaXMudHlwZSA9ICdkZWZhdWx0J1xuICB0aGlzLnN0YXR1cyA9IG9wdGlvbnMuc3RhdHVzID09PSB1bmRlZmluZWQgPyAyMDAgOiBvcHRpb25zLnN0YXR1c1xuICBpZiAodGhpcy5zdGF0dXMgPCAyMDAgfHwgdGhpcy5zdGF0dXMgPiA1OTkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Jlc3BvbnNlJzogVGhlIHN0YXR1cyBwcm92aWRlZCAoMCkgaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzIwMCwgNTk5XS5cIilcbiAgfVxuICB0aGlzLm9rID0gdGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgMzAwXG4gIHRoaXMuc3RhdHVzVGV4dCA9IG9wdGlvbnMuc3RhdHVzVGV4dCA9PT0gdW5kZWZpbmVkID8gJycgOiAnJyArIG9wdGlvbnMuc3RhdHVzVGV4dFxuICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpXG4gIHRoaXMudXJsID0gb3B0aW9ucy51cmwgfHwgJydcbiAgdGhpcy5faW5pdEJvZHkoYm9keUluaXQpXG59XG5cbkJvZHkuY2FsbChSZXNwb25zZS5wcm90b3R5cGUpXG5cblJlc3BvbnNlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuX2JvZHlJbml0LCB7XG4gICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICBzdGF0dXNUZXh0OiB0aGlzLnN0YXR1c1RleHQsXG4gICAgaGVhZGVyczogbmV3IEhlYWRlcnModGhpcy5oZWFkZXJzKSxcbiAgICB1cmw6IHRoaXMudXJsXG4gIH0pXG59XG5cblJlc3BvbnNlLmVycm9yID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZXNwb25zZSA9IG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiAyMDAsIHN0YXR1c1RleHQ6ICcnfSlcbiAgcmVzcG9uc2Uub2sgPSBmYWxzZVxuICByZXNwb25zZS5zdGF0dXMgPSAwXG4gIHJlc3BvbnNlLnR5cGUgPSAnZXJyb3InXG4gIHJldHVybiByZXNwb25zZVxufVxuXG52YXIgcmVkaXJlY3RTdGF0dXNlcyA9IFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF1cblxuUmVzcG9uc2UucmVkaXJlY3QgPSBmdW5jdGlvbih1cmwsIHN0YXR1cykge1xuICBpZiAocmVkaXJlY3RTdGF0dXNlcy5pbmRleE9mKHN0YXR1cykgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgc3RhdHVzIGNvZGUnKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IHtsb2NhdGlvbjogdXJsfX0pXG59XG5cbmV4cG9ydCB2YXIgRE9NRXhjZXB0aW9uID0gZy5ET01FeGNlcHRpb25cbnRyeSB7XG4gIG5ldyBET01FeGNlcHRpb24oKVxufSBjYXRjaCAoZXJyKSB7XG4gIERPTUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UsIG5hbWUpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlXG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHZhciBlcnJvciA9IEVycm9yKG1lc3NhZ2UpXG4gICAgdGhpcy5zdGFjayA9IGVycm9yLnN0YWNrXG4gIH1cbiAgRE9NRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKVxuICBET01FeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRE9NRXhjZXB0aW9uXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaChpbnB1dCwgaW5pdCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgaW5pdClcblxuICAgIGlmIChyZXF1ZXN0LnNpZ25hbCAmJiByZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICByZXR1cm4gcmVqZWN0KG5ldyBET01FeGNlcHRpb24oJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpKVxuICAgIH1cblxuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuXG4gICAgZnVuY3Rpb24gYWJvcnRYaHIoKSB7XG4gICAgICB4aHIuYWJvcnQoKVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBzdGF0dXNUZXh0OiB4aHIuc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogcGFyc2VIZWFkZXJzKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSB8fCAnJylcbiAgICAgIH1cbiAgICAgIC8vIFRoaXMgY2hlY2sgaWYgc3BlY2lmaWNhbGx5IGZvciB3aGVuIGEgdXNlciBmZXRjaGVzIGEgZmlsZSBsb2NhbGx5IGZyb20gdGhlIGZpbGUgc3lzdGVtXG4gICAgICAvLyBPbmx5IGlmIHRoZSBzdGF0dXMgaXMgb3V0IG9mIGEgbm9ybWFsIHJhbmdlXG4gICAgICBpZiAocmVxdWVzdC51cmwuaW5kZXhPZignZmlsZTovLycpID09PSAwICYmICh4aHIuc3RhdHVzIDwgMjAwIHx8IHhoci5zdGF0dXMgPiA1OTkpKSB7XG4gICAgICAgIG9wdGlvbnMuc3RhdHVzID0gMjAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucy5zdGF0dXMgPSB4aHIuc3RhdHVzO1xuICAgICAgfVxuICAgICAgb3B0aW9ucy51cmwgPSAncmVzcG9uc2VVUkwnIGluIHhociA/IHhoci5yZXNwb25zZVVSTCA6IG9wdGlvbnMuaGVhZGVycy5nZXQoJ1gtUmVxdWVzdC1VUkwnKVxuICAgICAgdmFyIGJvZHkgPSAncmVzcG9uc2UnIGluIHhociA/IHhoci5yZXNwb25zZSA6IHhoci5yZXNwb25zZVRleHRcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKGJvZHksIG9wdGlvbnMpKVxuICAgICAgfSwgMClcbiAgICB9XG5cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQnKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCB0aW1lZCBvdXQnKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChuZXcgRE9NRXhjZXB0aW9uKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZml4VXJsKHVybCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVybCA9PT0gJycgJiYgZy5sb2NhdGlvbi5ocmVmID8gZy5sb2NhdGlvbi5ocmVmIDogdXJsXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB1cmxcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub3BlbihyZXF1ZXN0Lm1ldGhvZCwgZml4VXJsKHJlcXVlc3QudXJsKSwgdHJ1ZSlcblxuICAgIGlmIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnaW5jbHVkZScpIHtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnb21pdCcpIHtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmICgncmVzcG9uc2VUeXBlJyBpbiB4aHIpIHtcbiAgICAgIGlmIChzdXBwb3J0LmJsb2IpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdibG9iJ1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgc3VwcG9ydC5hcnJheUJ1ZmZlclxuICAgICAgKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGluaXQgJiYgdHlwZW9mIGluaXQuaGVhZGVycyA9PT0gJ29iamVjdCcgJiYgIShpbml0LmhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzIHx8IChnLkhlYWRlcnMgJiYgaW5pdC5oZWFkZXJzIGluc3RhbmNlb2YgZy5IZWFkZXJzKSkpIHtcbiAgICAgIHZhciBuYW1lcyA9IFtdO1xuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaW5pdC5oZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgbmFtZXMucHVzaChub3JtYWxpemVOYW1lKG5hbWUpKVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCBub3JtYWxpemVWYWx1ZShpbml0LmhlYWRlcnNbbmFtZV0pKVxuICAgICAgfSlcbiAgICAgIHJlcXVlc3QuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGlmIChuYW1lcy5pbmRleE9mKG5hbWUpID09PSAtMSkge1xuICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXF1ZXN0LmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCB2YWx1ZSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3Quc2lnbmFsKSB7XG4gICAgICByZXF1ZXN0LnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0WGhyKVxuXG4gICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIERPTkUgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSlcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgcmVxdWVzdC5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydFhocilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5zZW5kKHR5cGVvZiByZXF1ZXN0Ll9ib2R5SW5pdCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogcmVxdWVzdC5fYm9keUluaXQpXG4gIH0pXG59XG5cbmZldGNoLnBvbHlmaWxsID0gdHJ1ZVxuXG5pZiAoIWcuZmV0Y2gpIHtcbiAgZy5mZXRjaCA9IGZldGNoXG4gIGcuSGVhZGVycyA9IEhlYWRlcnNcbiAgZy5SZXF1ZXN0ID0gUmVxdWVzdFxuICBnLlJlc3BvbnNlID0gUmVzcG9uc2Vcbn1cbiIsIi8qIChpZ25vcmVkKSAqLyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdGxvYWRlZDogZmFsc2UsXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4iLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmFtZE8gPSB7fTsiLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZiA9IHt9O1xuLy8gVGhpcyBmaWxlIGNvbnRhaW5zIG9ubHkgdGhlIGVudHJ5IGNodW5rLlxuLy8gVGhlIGNodW5rIGxvYWRpbmcgZnVuY3Rpb24gZm9yIGFkZGl0aW9uYWwgY2h1bmtzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmUgPSAoY2h1bmtJZCkgPT4ge1xuXHRyZXR1cm4gUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5mKS5yZWR1Y2UoKHByb21pc2VzLCBrZXkpID0+IHtcblx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmZba2V5XShjaHVua0lkLCBwcm9taXNlcyk7XG5cdFx0cmV0dXJuIHByb21pc2VzO1xuXHR9LCBbXSkpO1xufTsiLCIvLyBUaGlzIGZ1bmN0aW9uIGFsbG93IHRvIHJlZmVyZW5jZSBhc3luYyBjaHVua3Ncbl9fd2VicGFja19yZXF1aXJlX18udSA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gXCJ0aGVtZS1idW5kbGUuY2h1bmsuXCIgKyBjaHVua0lkICsgXCIuanNcIjtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmhtZCA9IChtb2R1bGUpID0+IHtcblx0bW9kdWxlID0gT2JqZWN0LmNyZWF0ZShtb2R1bGUpO1xuXHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsICdleHBvcnRzJywge1xuXHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0c2V0OiAoKSA9PiB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0VTIE1vZHVsZXMgbWF5IG5vdCBhc3NpZ24gbW9kdWxlLmV4cG9ydHMgb3IgZXhwb3J0cy4qLCBVc2UgRVNNIGV4cG9ydCBzeW50YXgsIGluc3RlYWQ6ICcgKyBtb2R1bGUuaWQpO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBtb2R1bGU7XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCJ2YXIgaW5Qcm9ncmVzcyA9IHt9O1xudmFyIGRhdGFXZWJwYWNrUHJlZml4ID0gXCJSb290czpcIjtcbi8vIGxvYWRTY3JpcHQgZnVuY3Rpb24gdG8gbG9hZCBhIHNjcmlwdCB2aWEgc2NyaXB0IHRhZ1xuX193ZWJwYWNrX3JlcXVpcmVfXy5sID0gKHVybCwgZG9uZSwga2V5LCBjaHVua0lkKSA9PiB7XG5cdGlmKGluUHJvZ3Jlc3NbdXJsXSkgeyBpblByb2dyZXNzW3VybF0ucHVzaChkb25lKTsgcmV0dXJuOyB9XG5cdHZhciBzY3JpcHQsIG5lZWRBdHRhY2g7XG5cdGlmKGtleSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNjcmlwdFwiKTtcblx0XHRmb3IodmFyIGkgPSAwOyBpIDwgc2NyaXB0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIHMgPSBzY3JpcHRzW2ldO1xuXHRcdFx0aWYocy5nZXRBdHRyaWJ1dGUoXCJzcmNcIikgPT0gdXJsIHx8IHMuZ2V0QXR0cmlidXRlKFwiZGF0YS13ZWJwYWNrXCIpID09IGRhdGFXZWJwYWNrUHJlZml4ICsga2V5KSB7IHNjcmlwdCA9IHM7IGJyZWFrOyB9XG5cdFx0fVxuXHR9XG5cdGlmKCFzY3JpcHQpIHtcblx0XHRuZWVkQXR0YWNoID0gdHJ1ZTtcblx0XHRzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcblxuXHRcdHNjcmlwdC5jaGFyc2V0ID0gJ3V0Zi04Jztcblx0XHRzY3JpcHQudGltZW91dCA9IDEyMDtcblx0XHRpZiAoX193ZWJwYWNrX3JlcXVpcmVfXy5uYykge1xuXHRcdFx0c2NyaXB0LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIF9fd2VicGFja19yZXF1aXJlX18ubmMpO1xuXHRcdH1cblx0XHRzY3JpcHQuc2V0QXR0cmlidXRlKFwiZGF0YS13ZWJwYWNrXCIsIGRhdGFXZWJwYWNrUHJlZml4ICsga2V5KTtcblxuXHRcdHNjcmlwdC5zcmMgPSB1cmw7XG5cdH1cblx0aW5Qcm9ncmVzc1t1cmxdID0gW2RvbmVdO1xuXHR2YXIgb25TY3JpcHRDb21wbGV0ZSA9IChwcmV2LCBldmVudCkgPT4ge1xuXHRcdC8vIGF2b2lkIG1lbSBsZWFrcyBpbiBJRS5cblx0XHRzY3JpcHQub25lcnJvciA9IHNjcmlwdC5vbmxvYWQgPSBudWxsO1xuXHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0XHR2YXIgZG9uZUZucyA9IGluUHJvZ3Jlc3NbdXJsXTtcblx0XHRkZWxldGUgaW5Qcm9ncmVzc1t1cmxdO1xuXHRcdHNjcmlwdC5wYXJlbnROb2RlICYmIHNjcmlwdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG5cdFx0ZG9uZUZucyAmJiBkb25lRm5zLmZvckVhY2goKGZuKSA9PiAoZm4oZXZlbnQpKSk7XG5cdFx0aWYocHJldikgcmV0dXJuIHByZXYoZXZlbnQpO1xuXHR9XG5cdHZhciB0aW1lb3V0ID0gc2V0VGltZW91dChvblNjcmlwdENvbXBsZXRlLmJpbmQobnVsbCwgdW5kZWZpbmVkLCB7IHR5cGU6ICd0aW1lb3V0JywgdGFyZ2V0OiBzY3JpcHQgfSksIDEyMDAwMCk7XG5cdHNjcmlwdC5vbmVycm9yID0gb25TY3JpcHRDb21wbGV0ZS5iaW5kKG51bGwsIHNjcmlwdC5vbmVycm9yKTtcblx0c2NyaXB0Lm9ubG9hZCA9IG9uU2NyaXB0Q29tcGxldGUuYmluZChudWxsLCBzY3JpcHQub25sb2FkKTtcblx0bmVlZEF0dGFjaCAmJiBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG59OyIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubm1kID0gKG1vZHVsZSkgPT4ge1xuXHRtb2R1bGUucGF0aHMgPSBbXTtcblx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRyZXR1cm4gbW9kdWxlO1xufTsiLCJ2YXIgc2NyaXB0VXJsO1xuaWYgKF9fd2VicGFja19yZXF1aXJlX18uZy5pbXBvcnRTY3JpcHRzKSBzY3JpcHRVcmwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLmcubG9jYXRpb24gKyBcIlwiO1xudmFyIGRvY3VtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5nLmRvY3VtZW50O1xuaWYgKCFzY3JpcHRVcmwgJiYgZG9jdW1lbnQpIHtcblx0aWYgKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdTQ1JJUFQnKVxuXHRcdHNjcmlwdFVybCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjO1xuXHRpZiAoIXNjcmlwdFVybCkge1xuXHRcdHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIik7XG5cdFx0aWYoc2NyaXB0cy5sZW5ndGgpIHtcblx0XHRcdHZhciBpID0gc2NyaXB0cy5sZW5ndGggLSAxO1xuXHRcdFx0d2hpbGUgKGkgPiAtMSAmJiAoIXNjcmlwdFVybCB8fCAhL15odHRwKHM/KTovLnRlc3Qoc2NyaXB0VXJsKSkpIHNjcmlwdFVybCA9IHNjcmlwdHNbaS0tXS5zcmM7XG5cdFx0fVxuXHR9XG59XG4vLyBXaGVuIHN1cHBvcnRpbmcgYnJvd3NlcnMgd2hlcmUgYW4gYXV0b21hdGljIHB1YmxpY1BhdGggaXMgbm90IHN1cHBvcnRlZCB5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dC5wdWJsaWNQYXRoIG1hbnVhbGx5IHZpYSBjb25maWd1cmF0aW9uXG4vLyBvciBwYXNzIGFuIGVtcHR5IHN0cmluZyAoXCJcIikgYW5kIHNldCB0aGUgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gdmFyaWFibGUgZnJvbSB5b3VyIGNvZGUgdG8gdXNlIHlvdXIgb3duIGxvZ2ljLlxuaWYgKCFzY3JpcHRVcmwpIHRocm93IG5ldyBFcnJvcihcIkF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyXCIpO1xuc2NyaXB0VXJsID0gc2NyaXB0VXJsLnJlcGxhY2UoL15ibG9iOi8sIFwiXCIpLnJlcGxhY2UoLyMuKiQvLCBcIlwiKS5yZXBsYWNlKC9cXD8uKiQvLCBcIlwiKS5yZXBsYWNlKC9cXC9bXlxcL10rJC8sIFwiL1wiKTtcbl9fd2VicGFja19yZXF1aXJlX18ucCA9IHNjcmlwdFVybDsiLCIvLyBubyBiYXNlVVJJXG5cbi8vIG9iamVjdCB0byBzdG9yZSBsb2FkZWQgYW5kIGxvYWRpbmcgY2h1bmtzXG4vLyB1bmRlZmluZWQgPSBjaHVuayBub3QgbG9hZGVkLCBudWxsID0gY2h1bmsgcHJlbG9hZGVkL3ByZWZldGNoZWRcbi8vIFtyZXNvbHZlLCByZWplY3QsIFByb21pc2VdID0gY2h1bmsgbG9hZGluZywgMCA9IGNodW5rIGxvYWRlZFxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0XCJtYWluXCI6IDBcbn07XG5cbl9fd2VicGFja19yZXF1aXJlX18uZi5qID0gKGNodW5rSWQsIHByb21pc2VzKSA9PiB7XG5cdFx0Ly8gSlNPTlAgY2h1bmsgbG9hZGluZyBmb3IgamF2YXNjcmlwdFxuXHRcdHZhciBpbnN0YWxsZWRDaHVua0RhdGEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm8oaW5zdGFsbGVkQ2h1bmtzLCBjaHVua0lkKSA/IGluc3RhbGxlZENodW5rc1tjaHVua0lkXSA6IHVuZGVmaW5lZDtcblx0XHRpZihpbnN0YWxsZWRDaHVua0RhdGEgIT09IDApIHsgLy8gMCBtZWFucyBcImFscmVhZHkgaW5zdGFsbGVkXCIuXG5cblx0XHRcdC8vIGEgUHJvbWlzZSBtZWFucyBcImN1cnJlbnRseSBsb2FkaW5nXCIuXG5cdFx0XHRpZihpbnN0YWxsZWRDaHVua0RhdGEpIHtcblx0XHRcdFx0cHJvbWlzZXMucHVzaChpbnN0YWxsZWRDaHVua0RhdGFbMl0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYodHJ1ZSkgeyAvLyBhbGwgY2h1bmtzIGhhdmUgSlNcblx0XHRcdFx0XHQvLyBzZXR1cCBQcm9taXNlIGluIGNodW5rIGNhY2hlXG5cdFx0XHRcdFx0dmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiAoaW5zdGFsbGVkQ2h1bmtEYXRhID0gaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gW3Jlc29sdmUsIHJlamVjdF0pKTtcblx0XHRcdFx0XHRwcm9taXNlcy5wdXNoKGluc3RhbGxlZENodW5rRGF0YVsyXSA9IHByb21pc2UpO1xuXG5cdFx0XHRcdFx0Ly8gc3RhcnQgY2h1bmsgbG9hZGluZ1xuXHRcdFx0XHRcdHZhciB1cmwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLnAgKyBfX3dlYnBhY2tfcmVxdWlyZV9fLnUoY2h1bmtJZCk7XG5cdFx0XHRcdFx0Ly8gY3JlYXRlIGVycm9yIGJlZm9yZSBzdGFjayB1bndvdW5kIHRvIGdldCB1c2VmdWwgc3RhY2t0cmFjZSBsYXRlclxuXHRcdFx0XHRcdHZhciBlcnJvciA9IG5ldyBFcnJvcigpO1xuXHRcdFx0XHRcdHZhciBsb2FkaW5nRW5kZWQgPSAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhpbnN0YWxsZWRDaHVua3MsIGNodW5rSWQpKSB7XG5cdFx0XHRcdFx0XHRcdGluc3RhbGxlZENodW5rRGF0YSA9IGluc3RhbGxlZENodW5rc1tjaHVua0lkXTtcblx0XHRcdFx0XHRcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdGlmKGluc3RhbGxlZENodW5rRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBlcnJvclR5cGUgPSBldmVudCAmJiAoZXZlbnQudHlwZSA9PT0gJ2xvYWQnID8gJ21pc3NpbmcnIDogZXZlbnQudHlwZSk7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJlYWxTcmMgPSBldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnNyYztcblx0XHRcdFx0XHRcdFx0XHRlcnJvci5tZXNzYWdlID0gJ0xvYWRpbmcgY2h1bmsgJyArIGNodW5rSWQgKyAnIGZhaWxlZC5cXG4oJyArIGVycm9yVHlwZSArICc6ICcgKyByZWFsU3JjICsgJyknO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLm5hbWUgPSAnQ2h1bmtMb2FkRXJyb3InO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLnR5cGUgPSBlcnJvclR5cGU7XG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3IucmVxdWVzdCA9IHJlYWxTcmM7XG5cdFx0XHRcdFx0XHRcdFx0aW5zdGFsbGVkQ2h1bmtEYXRhWzFdKGVycm9yKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5sKHVybCwgbG9hZGluZ0VuZGVkLCBcImNodW5rLVwiICsgY2h1bmtJZCwgY2h1bmtJZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG59O1xuXG4vLyBubyBwcmVmZXRjaGluZ1xuXG4vLyBubyBwcmVsb2FkZWRcblxuLy8gbm8gSE1SXG5cbi8vIG5vIEhNUiBtYW5pZmVzdFxuXG4vLyBubyBvbiBjaHVua3MgbG9hZGVkXG5cbi8vIGluc3RhbGwgYSBKU09OUCBjYWxsYmFjayBmb3IgY2h1bmsgbG9hZGluZ1xudmFyIHdlYnBhY2tKc29ucENhbGxiYWNrID0gKHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uLCBkYXRhKSA9PiB7XG5cdHZhciBbY2h1bmtJZHMsIG1vcmVNb2R1bGVzLCBydW50aW1lXSA9IGRhdGE7XG5cdC8vIGFkZCBcIm1vcmVNb2R1bGVzXCIgdG8gdGhlIG1vZHVsZXMgb2JqZWN0LFxuXHQvLyB0aGVuIGZsYWcgYWxsIFwiY2h1bmtJZHNcIiBhcyBsb2FkZWQgYW5kIGZpcmUgY2FsbGJhY2tcblx0dmFyIG1vZHVsZUlkLCBjaHVua0lkLCBpID0gMDtcblx0aWYoY2h1bmtJZHMuc29tZSgoaWQpID0+IChpbnN0YWxsZWRDaHVua3NbaWRdICE9PSAwKSkpIHtcblx0XHRmb3IobW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcblx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG5cdFx0XHRcdF9fd2VicGFja19yZXF1aXJlX18ubVttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmKHJ1bnRpbWUpIHZhciByZXN1bHQgPSBydW50aW1lKF9fd2VicGFja19yZXF1aXJlX18pO1xuXHR9XG5cdGlmKHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKSBwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbihkYXRhKTtcblx0Zm9yKDtpIDwgY2h1bmtJZHMubGVuZ3RoOyBpKyspIHtcblx0XHRjaHVua0lkID0gY2h1bmtJZHNbaV07XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGluc3RhbGxlZENodW5rcywgY2h1bmtJZCkgJiYgaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdKSB7XG5cdFx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF1bMF0oKTtcblx0XHR9XG5cdFx0aW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gMDtcblx0fVxuXG59XG5cbnZhciBjaHVua0xvYWRpbmdHbG9iYWwgPSBzZWxmW1wid2VicGFja0NodW5rUm9vdHNcIl0gPSBzZWxmW1wid2VicGFja0NodW5rUm9vdHNcIl0gfHwgW107XG5jaHVua0xvYWRpbmdHbG9iYWwuZm9yRWFjaCh3ZWJwYWNrSnNvbnBDYWxsYmFjay5iaW5kKG51bGwsIDApKTtcbmNodW5rTG9hZGluZ0dsb2JhbC5wdXNoID0gd2VicGFja0pzb25wQ2FsbGJhY2suYmluZChudWxsLCBjaHVua0xvYWRpbmdHbG9iYWwucHVzaC5iaW5kKGNodW5rTG9hZGluZ0dsb2JhbCkpOyIsIl9fd2VicGFja19wdWJsaWNfcGF0aF9fID0gd2luZG93Ll9fd2VicGFja19wdWJsaWNfcGF0aF9fOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXHJcblxyXG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vdGhlbWUvZ2xvYmFsJztcclxuXHJcbmNvbnN0IGdldEFjY291bnQgPSAoKSA9PiBpbXBvcnQoJy4vdGhlbWUvYWNjb3VudCcpO1xyXG5jb25zdCBnZXRMb2dpbiA9ICgpID0+IGltcG9ydCgnLi90aGVtZS9hdXRoJyk7XHJcbmNvbnN0IG5vb3AgPSBudWxsO1xyXG5cclxuY29uc3QgcGFnZUNsYXNzZXMgPSB7XHJcbiAgICBhY2NvdW50X29yZGVyc3RhdHVzOiBnZXRBY2NvdW50LFxyXG4gICAgYWNjb3VudF9vcmRlcjogZ2V0QWNjb3VudCxcclxuICAgIGFjY291bnRfYWRkcmVzc2Jvb2s6IGdldEFjY291bnQsXHJcbiAgICBzaGlwcGluZ2FkZHJlc3Nmb3JtOiBnZXRBY2NvdW50LFxyXG4gICAgYWNjb3VudF9uZXdfcmV0dXJuOiBnZXRBY2NvdW50LFxyXG4gICAgJ2FkZC13aXNobGlzdCc6ICgpID0+IGltcG9ydCgnLi90aGVtZS93aXNobGlzdCcpLFxyXG4gICAgYWNjb3VudF9yZWNlbnRpdGVtczogZ2V0QWNjb3VudCxcclxuICAgIGFjY291bnRfZG93bmxvYWRpdGVtOiBnZXRBY2NvdW50LFxyXG4gICAgZWRpdGFjY291bnQ6IGdldEFjY291bnQsXHJcbiAgICBhY2NvdW50X2luYm94OiBnZXRBY2NvdW50LFxyXG4gICAgYWNjb3VudF9zYXZlZF9yZXR1cm46IGdldEFjY291bnQsXHJcbiAgICBhY2NvdW50X3JldHVybnM6IGdldEFjY291bnQsXHJcbiAgICBhY2NvdW50X3BheW1lbnRtZXRob2RzOiBnZXRBY2NvdW50LFxyXG4gICAgYWNjb3VudF9hZGRwYXltZW50bWV0aG9kOiBnZXRBY2NvdW50LFxyXG4gICAgYWNjb3VudF9lZGl0cGF5bWVudG1ldGhvZDogZ2V0QWNjb3VudCxcclxuICAgIGxvZ2luOiBnZXRMb2dpbixcclxuICAgIGNyZWF0ZWFjY291bnRfdGhhbmtzOiBnZXRMb2dpbixcclxuICAgIGNyZWF0ZWFjY291bnQ6IGdldExvZ2luLFxyXG4gICAgZ2V0bmV3cGFzc3dvcmQ6IGdldExvZ2luLFxyXG4gICAgZm9yZ290cGFzc3dvcmQ6IGdldExvZ2luLFxyXG4gICAgYmxvZzogbm9vcCxcclxuICAgIGJsb2dfcG9zdDogbm9vcCxcclxuICAgIGJyYW5kOiAoKSA9PiBpbXBvcnQoJy4vdGhlbWUvYnJhbmQnKSxcclxuICAgIGJyYW5kczogKCkgPT4gaW1wb3J0KCcuL3RoZW1lL2JyYW5kcycpLFxyXG4gICAgY2FydDogKCkgPT4gaW1wb3J0KCcuL3RoZW1lL2NhcnQnKSxcclxuICAgIGNhdGVnb3J5OiAoKSA9PiBpbXBvcnQoJy4vdGhlbWUvY2F0ZWdvcnknKSxcclxuICAgIGNvbXBhcmU6ICgpID0+IGltcG9ydCgnLi90aGVtZS9jb21wYXJlJyksXHJcbiAgICBwYWdlX2NvbnRhY3RfZm9ybTogKCkgPT4gaW1wb3J0KCcuL3RoZW1lL2NvbnRhY3QtdXMnKSxcclxuICAgIGVycm9yOiBub29wLFxyXG4gICAgNDA0OiBub29wLFxyXG4gICAgZ2lmdGNlcnRpZmljYXRlczogKCkgPT4gaW1wb3J0KCcuL3RoZW1lL2dpZnQtY2VydGlmaWNhdGUnKSxcclxuICAgIGdpZnRjZXJ0aWZpY2F0ZXNfYmFsYW5jZTogKCkgPT4gaW1wb3J0KCcuL3RoZW1lL2dpZnQtY2VydGlmaWNhdGUnKSxcclxuICAgIGdpZnRjZXJ0aWZpY2F0ZXNfcmVkZWVtOiAoKSA9PiBpbXBvcnQoJy4vdGhlbWUvZ2lmdC1jZXJ0aWZpY2F0ZScpLFxyXG4gICAgZGVmYXVsdDogbm9vcCxcclxuICAgIHBhZ2U6IG5vb3AsXHJcbiAgICBwcm9kdWN0OiAoKSA9PiBpbXBvcnQoJy4vdGhlbWUvcHJvZHVjdCcpLFxyXG4gICAgYW1wX3Byb2R1Y3Rfb3B0aW9uczogKCkgPT4gaW1wb3J0KCcuL3RoZW1lL3Byb2R1Y3QnKSxcclxuICAgIHNlYXJjaDogKCkgPT4gaW1wb3J0KCcuL3RoZW1lL3NlYXJjaCcpLFxyXG4gICAgcnNzOiBub29wLFxyXG4gICAgc2l0ZW1hcDogbm9vcCxcclxuICAgIG5ld3NsZXR0ZXJfc3Vic2NyaWJlOiBub29wLFxyXG4gICAgd2lzaGxpc3Q6ICgpID0+IGltcG9ydCgnLi90aGVtZS93aXNobGlzdCcpLFxyXG4gICAgd2lzaGxpc3RzOiAoKSA9PiBpbXBvcnQoJy4vdGhlbWUvd2lzaGxpc3QnKSxcclxufTtcclxuXHJcbmNvbnN0IGN1c3RvbUNsYXNzZXMgPSB7fTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGZ1bmN0aW9uIGdldHMgYWRkZWQgdG8gdGhlIGdsb2JhbCB3aW5kb3cgYW5kIHRoZW4gY2FsbGVkXHJcbiAqIG9uIHBhZ2UgbG9hZCB3aXRoIHRoZSBjdXJyZW50IHRlbXBsYXRlIGxvYWRlZCBhbmQgSlMgQ29udGV4dCBwYXNzZWQgaW5cclxuICogQHBhcmFtIHBhZ2VUeXBlIFN0cmluZ1xyXG4gKiBAcGFyYW0gY29udGV4dEpTT05cclxuICogQHJldHVybnMgeyp9XHJcbiAqL1xyXG53aW5kb3cuc3RlbmNpbEJvb3RzdHJhcCA9IGZ1bmN0aW9uIHN0ZW5jaWxCb290c3RyYXAocGFnZVR5cGUsIGNvbnRleHRKU09OID0gbnVsbCwgbG9hZEdsb2JhbCA9IHRydWUpIHtcclxuICAgIGNvbnN0IGNvbnRleHQgPSBKU09OLnBhcnNlKGNvbnRleHRKU09OIHx8ICd7fScpO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbG9hZCgpIHtcclxuICAgICAgICAgICAgJCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBMb2FkIGdsb2JhbHNcclxuICAgICAgICAgICAgICAgIGlmIChsb2FkR2xvYmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgR2xvYmFsLmxvYWQoY29udGV4dCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgaW1wb3J0UHJvbWlzZXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBhcHByb3ByaWF0ZSBwYWdlIGxvYWRlciBiYXNlZCBvbiBwYWdlVHlwZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZUNsYXNzSW1wb3J0ZXIgPSBwYWdlQ2xhc3Nlc1twYWdlVHlwZV07XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhZ2VDbGFzc0ltcG9ydGVyID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0UHJvbWlzZXMucHVzaChwYWdlQ2xhc3NJbXBvcnRlcigpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYSBwYWdlIGNsYXNzIGRlZmF1bHQgZm9yIGEgY3VzdG9tIHRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21UZW1wbGF0ZUltcG9ydGVyID0gY3VzdG9tQ2xhc3Nlc1tjb250ZXh0LnRlbXBsYXRlXTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3VzdG9tVGVtcGxhdGVJbXBvcnRlciA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGltcG9ydFByb21pc2VzLnB1c2goY3VzdG9tVGVtcGxhdGVJbXBvcnRlcigpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciBpbXBvcnRzIHRvIHJlc29sdmUsIHRoZW4gY2FsbCBsb2FkKCkgb24gdGhlbVxyXG4gICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwoaW1wb3J0UHJvbWlzZXMpLnRoZW4oaW1wb3J0cyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0cy5mb3JFYWNoKGltcG9ydGVkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0ZWQuZGVmYXVsdC5sb2FkKGNvbnRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICB9O1xyXG59O1xyXG4iXSwibmFtZXMiOlsiYXJpYUtleUNvZGVzIiwiUkVUVVJOIiwiU1BBQ0UiLCJMRUZUIiwiVVAiLCJSSUdIVCIsIkRPV04iLCJkZWZhdWx0IiwiaW5pdFJhZGlvT3B0aW9ucyIsInNldENoZWNrZWRSYWRpb0l0ZW0iLCJpdGVtQ29sbGVjdGlvbiIsIml0ZW1JZHgiLCJlYWNoIiwiaWR4IiwiaXRlbSIsIiRpdGVtIiwiJCIsImF0dHIiLCJwcm9wIiwiZm9jdXMiLCJ0cmlnZ2VyIiwiY2FsY3VsYXRlVGFyZ2V0SXRlbVBvc2l0aW9uIiwibGFzdEl0ZW1JZHgiLCJjdXJyZW50SWR4IiwiaGFuZGxlSXRlbUtleURvd24iLCJlIiwia2V5Q29kZSIsImluZGV4IiwiY3VycmVudFRhcmdldCIsImxhc3RDb2xsZWN0aW9uSXRlbUlkeCIsImxlbmd0aCIsIk9iamVjdCIsInZhbHVlcyIsImluY2x1ZGVzIiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJwcmV2SXRlbUlkeCIsImdldCIsIm5leHRJdGVtSWR4IiwiJGNvbnRhaW5lciIsIml0ZW1TZWxlY3RvciIsIiRpdGVtQ29sbGVjdGlvbiIsImZpbmQiLCJvbiIsIkZPQ1VTQUJMRV9FTEVNRU5UU19TRUxFQ1RPUiIsImFjdGl2YXRlUGxheVBhdXNlQnV0dG9uIiwiYW5hbGl6ZVNsaWRlcyIsImFycm93QXJpYUxhYmxpbmciLCJkb3RzU2V0dXAiLCJnZXRBY3RpdmVTbGlkZUlkeEFuZFNsaWRlc1F1YW50aXR5IiwiaGFuZGxlSW1hZ2VBc3BlY3RSYXRpbyIsImhhbmRsZUltYWdlTG9hZCIsInJlZnJlc2hGb2N1cyIsInVwZGF0ZVRleHRXaXRoTGl2ZURhdGEiLCJzZXRDYXJvdXNlbFN0YXRlIiwiX3JlZiIsImNhcm91c2VsT2JqIiwiZGVsZWdhdGVUYXJnZXQiLCJjYXJvdXNlbE9iakN1cnJlbnQiLCJzbGljayIsIiRzbGlkZXIiLCJkYXRhIiwib25Vc2VyQ2Fyb3VzZWxDaGFuZ2UiLCJfcmVmMiIsImNvbnRleHQiLCIkYWN0aXZlU2xpZGVyIiwiJHBhcmVudENvbnRhaW5lciIsImhhc0NsYXNzIiwicGFyZW50IiwiXyRhY3RpdmVTbGlkZXIkZGF0YSIsImFjdGl2ZVNsaWRlSWR4Iiwic2xpZGVzUXVhbnRpdHkiLCIkY2Fyb3VzZWxDb250ZW50RWxlbWVudCIsImNhcm91c2VsQ29udGVudEFubm91bmNlTWVzc2FnZSIsInRleHQiLCJvblNsaWNrQ2Fyb3VzZWxDaGFuZ2UiLCIkZG90cyIsIiRwcmV2QXJyb3ciLCIkbmV4dEFycm93IiwiaW5maW5pdGUiLCJvcHRpb25zIiwiX3JlZjMiLCJjYXJvdXNlbEFycm93QW5kRG90QXJpYUxhYmVsIiwiY2Fyb3VzZWwiLCIkY2Fyb3VzZWwiLCJkb2N1bWVudCIsImRvY3VtZW50RWxlbWVudCIsInN0eWxlIiwib2JqZWN0Rml0Iiwic2xpZGUiLCJhZGRDbGFzcyIsImlzTXVsdGlwbGVTbGlkZXMiLCJjaGlsZHJlbiIsImN1c3RvbVBhZ2luZyIsImFjY2Vzc2liaWxpdHkiLCJhcnJvd3MiLCJkb3RzIiwiUExBWV9BQ1RJT04iLCJQQVVTRV9BQ1RJT04iLCJ1cGRhdGVCdXR0b25MYWJlbHMiLCJjYXJvdXNlbFBsYXlQYXVzZUJ1dHRvblBsYXkiLCJjYXJvdXNlbFBsYXlQYXVzZUJ1dHRvblBhdXNlIiwiY2Fyb3VzZWxQbGF5UGF1c2VCdXR0b25BcmlhUGxheSIsImNhcm91c2VsUGxheVBhdXNlQnV0dG9uQXJpYVBhdXNlIiwiJGJ1dHRvbiIsImFjdGlvbiIsInVwZGF0ZUJ1dHRvbkxhYmVsc1dpdGhDb250ZXh0Iiwic3BlZWQiLCIkcGxheVBhdXNlQnV0dG9uIiwiaW5zZXJ0QmVmb3JlIiwiYXBwZW5kIiwiXyRzbGlkZXIkZGF0YSIsImNzcyIsInR5cGUiLCJvblBsYXlQYXVzZUNsaWNrIiwicGF1c2VkIiwiX3Rocm90dGxlIiwidHJhaWxpbmciLCIkc2xpZGVzIiwiJHNsaWRlIiwidGFiSW5kZXgiLCJpcyIsImNoaWxkIiwidG9vbHRpcFNldHVwIiwiaXNJbmZpbml0ZSIsImFyaWFMYWJlbCIsImFjdGl2ZVNsaWRlTnVtYmVyIiwicHJldlNsaWRlTnVtYmVyIiwiYXJyb3dMZWZ0VGV4dCIsInRhYmluZGV4IiwibmV4dFNsaWRlTnVtYmVyIiwiYXJyb3dSaWdodFRleHQiLCJjYXJvdXNlbEFjdGl2ZURvdEFyaWFMYWJlbCIsImRvdCIsImRvdExhYmVsVGV4dCIsImRvdFNsaWRlU3RhdHVzVGV4dCIsImRvdEFyaWFMYWJlbCIsIiRkb3RCdXR0b24iLCJzbGlkZUNvdW50IiwiX3JlZiRvcHRpb25zIiwic2xpZGVzVG9TaG93Iiwic2xpZGVzVG9TY3JvbGwiLCJsYXN0VmlzaWJsZUlkeCIsInJlZHVjZSIsImFjYyIsImN1cnIiLCJNYXRoIiwiY2VpbCIsImlzQW5hbHl6ZWREYXRhQXR0ciIsIiRhY3RpdmVTbGlkZSIsImlzQW5hbHl6ZWRTbGlkZSIsIiRhY3RpdmVTbGlkZUltZyIsImFjdGl2ZVNsaWRlSW1nTm9kZSIsIiRhY3RpdmVTbGlkZUFuZENsb25lcyIsImdldEFjdGl2ZVNsaWRlSW5mbyIsIklNQUdFX0NMQVNTRVMiLCJ2ZXJ0aWNhbCIsInNxdWFyZSIsIklTX0FOQUxZWkVEX0RBVEFfQVRUUiIsImRlZmluZUFzcGVjdFJhdGlvQ2xhc3MiLCJpbWFnZUFzcGVjdFJhdGlvIiwic2V0QXNwZWN0UmF0aW9DbGFzcyIsImltYWdlTm9kZSIsIm5hdHVyYWxIZWlnaHQiLCJuYXR1cmFsV2lkdGgiLCJfZ2V0QWN0aXZlU2xpZGVJbmZvIiwiY29tcGxldGUiLCJpc0Jyb3dzZXJJRSIsIklNQUdFX0VSUk9SX0NMQVNTIiwiZ2VuZXJhdGVJbWFnZSIsIiRpbWFnZSIsImZpcnN0IiwiJGZpcnN0QWN0aXZlU2xpZGUiLCJUT09MVElQX0RBVEFfU0VMRUNUT1IiLCJUT09MVElQX0NMQVNTIiwiVE9PTFRJUF9OT0RFIiwiJG5vZGUiLCIkZXhpc3RlZFRvb2x0aXAiLCIkdG9vbHRpcCIsIlNMSURFX05VTUJFUiIsIlNMSURFU19RVUFOVElUWSIsInRleHRGb3JDaGFuZ2UiLCJzbGlkZU51bWJlciIsInJlcGxhY2UiLCJDb2xsYXBzaWJsZUV2ZW50cyIsIlBMVUdJTl9LRVkiLCJDb2xsYXBzaWJsZUdyb3VwIiwiJGNvbXBvbmVudCIsIm9wZW5Db2xsYXBzaWJsZSIsIm9uQ29sbGFwc2libGVPcGVuIiwiYmluZCIsIm9uQ29sbGFwc2libGVDbG9zZSIsImJpbmRFdmVudHMiLCJfcHJvdG8iLCJwcm90b3R5cGUiLCJjbG9zZSIsImRpc2FibGVkIiwib3BlbiIsInVuYmluZEV2ZW50cyIsIm9mZiIsImV2ZW50IiwiY29sbGFwc2libGVJbnN0YW5jZSIsImhhc0NvbGxhcHNpYmxlIiwiY29sbGFwc2libGVHcm91cEZhY3RvcnkiLCJzZWxlY3RvciIsIiRncm91cHMiLCIkY29udGV4dCIsImluc3RhbmNlS2V5IiwibWFwIiwiZWxlbWVudCIsIiRncm91cCIsImNhY2hlZEdyb3VwIiwiZ3JvdXAiLCJ0b0FycmF5IiwibWVkaWFRdWVyeUxpc3RGYWN0b3J5IiwidG9nZ2xlIiwiY2xpY2siLCJDb2xsYXBzaWJsZVN0YXRlIiwiY2xvc2VkIiwicHJlcGVuZEhhc2giLCJpZCIsImluZGV4T2YiLCJvcHRpb25zRnJvbURhdGEiLCIkZWxlbWVudCIsImRpc2FibGVkQnJlYWtwb2ludCIsImRpc2FibGVkU3RhdGUiLCJlbmFibGVkU3RhdGUiLCJvcGVuQ2xhc3NOYW1lIiwiQ29sbGFwc2libGUiLCIkdG9nZ2xlIiwiJHRhcmdldCIsIl90ZW1wIiwiX3JlZiRvcGVuQ2xhc3NOYW1lIiwidGFyZ2V0SWQiLCJkaXNhYmxlZE1lZGlhUXVlcnlMaXN0IiwibWF0Y2hlcyIsIm9uQ2xpY2tlZCIsIm9uRGlzYWJsZWRNZWRpYVF1ZXJ5TGlzdE1hdGNoIiwiaXNDb2xsYXBzZWQiLCJfZ2V0VG9nZ2xlQXJpYUxhYmVsVGV4dCIsImlzT3BlbiIsIiR0ZXh0VG9nZ2xlQ2hpbGRyZW4iLCJmaWx0ZXIiLCJfXyIsInRyaW0iLCIkYXJpYUxhYmVsVGFyZ2V0IiwiX3RlbXAyIiwiX3JlZjIkbm90aWZ5Iiwibm90aWZ5IiwiX3RlbXAzIiwiX3JlZjMkbm90aWZ5IiwicmVtb3ZlQ2xhc3MiLCJ0b2dnbGVCeVN0YXRlIiwic3RhdGUiLCJfbGVuIiwiYXJndW1lbnRzIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImFwcGx5IiwidW5kZWZpbmVkIiwiY29udGFpbnMiLCJhZGRMaXN0ZW5lciIsInJlbW92ZUxpc3RlbmVyIiwibWVkaWEiLCJfY3JlYXRlQ2xhc3MiLCJrZXkiLCJfZGlzYWJsZWQiLCJzZXQiLCJjb2xsYXBzaWJsZUZhY3RvcnkiLCJvdmVycmlkZU9wdGlvbnMiLCIkY29sbGFwc2libGVzIiwiY2FjaGVkQ29sbGFwc2libGUiLCJfZXh0ZW5kIiwiY29sbGFwc2libGUiLCJicmVha3BvaW50U2l6ZXMiLCJsYXJnZSIsIm1lZGl1bSIsInNtYWxsIiwiYnJlYWtwb2ludE5hbWUiLCJ3aW5kb3ciLCJtYXRjaE1lZGlhIiwiYnJlYWtwb2ludCIsIm1lZGlhUXVlcnkiLCJtZWRpYVF1ZXJ5TGlzdCIsImZvcm1zIiwiZW1haWwiLCJ2YWx1ZSIsInJlIiwidGVzdCIsInBhc3N3b3JkIiwibm90RW1wdHkiLCJudW1iZXJzT25seSIsInZhbGlkYXRlSW5jcmVhc2VBZ2FpbnN0TWF4Qm91bmRhcnkiLCJtYXgiLCJyYWlzZSIsInZhbGlkYXRlRGVjcmVhc2VBZ2FpbnN0TWluQm91bmRhcnkiLCJtaW4iLCJkZWNsaW5lIiwibWluTWF4VmFsaWRhdGUiLCJtaW5JbnB1dFNlbGVjdG9yIiwibWF4SW5wdXRTZWxlY3RvciIsInZhbGlkYXRlIiwiY2IiLCJtaW5WYWx1ZSIsInBhcnNlRmxvYXQiLCJ2YWwiLCJtYXhWYWx1ZSIsIl9pc05hTiIsIm5vZCIsImNsYXNzZXMiLCJlcnJvckNsYXNzIiwic3VjY2Vzc0NsYXNzIiwiZXJyb3JNZXNzYWdlQ2xhc3MiLCJjaGVja0Z1bmN0aW9ucyIsIldpc2hsaXN0Iiwib3B0aW9uc1R5cGVzTWFwIiwiSU5QVVRfRklMRSIsIklOUFVUX1RFWFQiLCJJTlBVVF9OVU1CRVIiLCJJTlBVVF9DSEVDS0JPWCIsIlRFWFRBUkVBIiwiREFURSIsIlNFVF9TRUxFQ1QiLCJTRVRfUkVDVEFOR0xFIiwiU0VUX1JBRElPIiwiU1dBVENIIiwiUFJPRFVDVF9MSVNUIiwib3B0aW9uQ2hhbmdlRGVjb3JhdG9yIiwiYXJlRGVmYXVsdE90aW9uc1NldCIsIl90aGlzIiwiZXJyIiwicmVzcG9uc2UiLCJhdHRyaWJ1dGVzRGF0YSIsImF0dHJpYnV0ZXNDb250ZW50IiwiY29udGVudCIsInVwZGF0ZVByb2R1Y3RBdHRyaWJ1dGVzIiwidXBkYXRlVmlldyIsInVwZGF0ZURlZmF1bHRBdHRyaWJ1dGVzRm9yT09TIiwiUHJvZHVjdERldGFpbHNCYXNlIiwiJHNjb3BlIiwiX3RoaXMyIiwiaW5pdFJhZGlvQXR0cmlidXRlcyIsImxvYWQiLCJnZXRUYWJSZXF1ZXN0cyIsImdldEF0dHJpYnV0ZSIsIl9tYWtlUHJvZHVjdFZhcmlhbnRBY2Nlc3NpYmxlIiwidmFyaWFudERvbU5vZGUiLCJ2YXJpYW50VHlwZSIsIl90aGlzMyIsImkiLCJyYWRpbyIsIiRyYWRpbyIsIl90aGlzNCIsImJlaGF2aW9yIiwib3V0X29mX3N0b2NrX2JlaGF2aW9yIiwiaW5TdG9ja0lkcyIsImluX3N0b2NrX2F0dHJpYnV0ZXMiLCJvdXRPZlN0b2NrTWVzc2FnZSIsIm91dF9vZl9zdG9ja19tZXNzYWdlIiwiYXR0cmlidXRlIiwiJGF0dHJpYnV0ZSIsImF0dHJJZCIsInBhcnNlSW50IiwiZW5hYmxlQXR0cmlidXRlIiwiZGlzYWJsZUF0dHJpYnV0ZSIsImxvY2F0aW9uIiwiaGFzaCIsIiRhY3RpdmVUYWIiLCJoYXMiLCIkdGFiQ29udGVudCIsInNpYmxpbmdzIiwiZ2V0Vmlld01vZGVsIiwiJHByaWNlV2l0aFRheCIsIiRwcmljZVdpdGhvdXRUYXgiLCJycnBXaXRoVGF4IiwiJGRpdiIsIiRzcGFuIiwicnJwV2l0aG91dFRheCIsIm5vblNhbGVXaXRoVGF4Iiwibm9uU2FsZVdpdGhvdXRUYXgiLCJwcmljZVNhdmVkIiwicHJpY2VOb3dMYWJlbCIsInByaWNlTGFiZWwiLCIkd2VpZ2h0IiwiJGluY3JlbWVudHMiLCIkYWRkVG9DYXJ0IiwiJHdpc2hsaXN0VmFyaWF0aW9uIiwic3RvY2siLCIkaW5wdXQiLCJza3UiLCIkbGFiZWwiLCIkdmFsdWUiLCJ1cGMiLCJxdWFudGl0eSIsIiR0ZXh0IiwiJGJ1bGtQcmljaW5nIiwiJHdhbGxldEJ1dHRvbnMiLCJjbGVhclByaWNpbmdOb3RGb3VuZCIsInZpZXdNb2RlbCIsImhpZGUiLCJzaG93TWVzc2FnZUJveCIsInN0b2NrX21lc3NhZ2UiLCJwdXJjaGFzaW5nX21lc3NhZ2UiLCJfaXNPYmplY3QiLCJwcmljZSIsInVwZGF0ZVByaWNlVmlldyIsIndlaWdodCIsImh0bWwiLCJmb3JtYXR0ZWQiLCJ2YXJpYW50SWQiLCJzaG93IiwiX2lzTnVtYmVyIiwidXBkYXRlV2FsbGV0QnV0dG9uc1ZpZXciLCJidWxrX2Rpc2NvdW50X3JhdGVzIiwiYWRkVG9DYXJ0V3JhcHBlciIsInB1cmNoYXNhYmxlIiwid2l0aF90YXgiLCJ1cGRhdGVkUHJpY2UiLCJwcmljZV9yYW5nZSIsIndpdGhvdXRfdGF4IiwicnJwX3dpdGhfdGF4IiwicnJwX3dpdGhvdXRfdGF4Iiwic2F2ZWQiLCJub25fc2FsZV9wcmljZV93aXRoX3RheCIsIm5vbl9zYWxlX3ByaWNlX3dpdGhvdXRfdGF4IiwibWVzc2FnZSIsIiRtZXNzYWdlQm94IiwiaW5zdG9jayIsInRvZ2dsZVdhbGxldEJ1dHRvbnNWaXNpYmlsaXR5Iiwic2hvdWxkU2hvdyIsImdldEF0dHJpYnV0ZVR5cGUiLCJlbmFibGVTZWxlY3RPcHRpb25BdHRyaWJ1dGUiLCJkaXNhYmxlU2VsZWN0T3B0aW9uQXR0cmlidXRlIiwiJHBhcmVudCIsImNsb3Nlc3QiLCIkc2VsZWN0IiwidG9nZ2xlT3B0aW9uIiwic2VsZWN0ZWRJbmRleCIsInV0aWxzIiwiSW1hZ2VHYWxsZXJ5IiwibW9kYWxGYWN0b3J5IiwiYWxlcnRNb2RhbCIsInNob3dBbGVydE1vZGFsIiwiYW5ub3VuY2VJbnB1dEVycm9yTWVzc2FnZSIsIm5vcm1hbGl6ZUZvcm1EYXRhIiwiY29udmVydEludG9BcnJheSIsImJhbm5lclV0aWxzIiwiUHJvZHVjdERldGFpbHMiLCJfUHJvZHVjdERldGFpbHNCYXNlIiwicHJvZHVjdEF0dHJpYnV0ZXNEYXRhIiwiY2FsbCIsIiRvdmVybGF5IiwiaW1hZ2VHYWxsZXJ5IiwiaW5pdCIsImxpc3RlblF1YW50aXR5Q2hhbmdlIiwiJHN3YXRjaE9wdGlvbk1lc3NhZ2UiLCJzd2F0Y2hJbml0TWVzc2FnZVN0b3JhZ2UiLCJzd2F0Y2hHcm91cElkTGlzdCIsIl8iLCJzdG9yZUluaXRNZXNzYWdlc0ZvclN3YXRjaGVzIiwiJGZvcm0iLCJhZGRUb0NhcnRWYWxpZGF0b3IiLCJzdWJtaXQiLCJ0YXAiLCIkcHJvZHVjdE9wdGlvbnNFbGVtZW50IiwiaGFzT3B0aW9ucyIsImhhc0RlZmF1bHRPcHRpb25zIiwiJHByb2R1Y3RTd2F0Y2hHcm91cCIsIiRwcm9kdWN0U3dhdGNoTGFiZWxzIiwicGxhY2VTd2F0Y2hMYWJlbEltYWdlIiwibGFiZWwiLCIkb3B0aW9uSW1hZ2UiLCJvcHRpb25JbWFnZVdpZHRoIiwib3V0ZXJXaWR0aCIsImV4dGVuZGVkT3B0aW9uSW1hZ2VPZmZzZXRMZWZ0IiwiX2xhYmVsJGdldEJvdW5kaW5nQ2xpIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwicmlnaHQiLCJlbXB0eVNwYWNlVG9TY3JlZW5SaWdodEJvcmRlciIsInNjcmVlbiIsIndpZHRoIiwic2hpZnRWYWx1ZSIsInJlZ2lzdGVyQWRkVG9DYXJ0VmFsaWRhdGlvbiIsInNob3dTd2F0Y2hOYW1lcyIsInRhcmdldCIsInN3YXRjaEdyb3VwRWxlbWVudCIsInBhcmVudE5vZGUiLCJzaG93U3dhdGNoTmFtZU9uT3B0aW9uIiwicHJvZHVjdE9wdGlvbnNDaGFuZ2VkIiwic2V0UHJvZHVjdFZhcmlhbnQiLCJwZXJmb3JtQ2hlY2siLCJhcmVBbGwiLCJhZGRQcm9kdWN0VG9DYXJ0IiwiX2lzRW1wdHkiLCIkcHJvZHVjdElkIiwib3B0aW9uQ2hhbmdlQ2FsbGJhY2siLCJhcGkiLCJwcm9kdWN0QXR0cmlidXRlcyIsIm9wdGlvbkNoYW5nZSIsInNlcmlhbGl6ZSIsImRpc3BhdGNoUHJvZHVjdEJhbm5lckV2ZW50IiwicHJldmlld01vZGFsIiwiX2luaGVyaXRzTG9vc2UiLCJhZGQiLCJyZXN1bHQiLCJlcnJvck1lc3NhZ2UiLCJwcm9kdWN0UXVhbnRpdHlFcnJvck1lc3NhZ2UiLCJzd2F0Y2hHcm91cElkIiwidW5zYXRpc2ZpZWRSZXF1aXJlZEZpZWxkcyIsIm9wdGlvbkxhYmVsIiwiaW5uZXJUZXh0Iiwib3B0aW9uVGl0bGUiLCJzcGxpdCIsInJlcXVpcmVkIiwidG9Mb3dlckNhc2UiLCJxdWVyeVNlbGVjdG9yIiwicHVzaCIsImlzU2F0aXNmaWVkIiwiZnJvbSIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJldmVyeSIsInNlbGVjdCIsImRhdGVTdHJpbmciLCJ4Iiwiam9pbiIsImNoZWNrZWQiLCJnZXRTZWxlY3RlZE9wdGlvbkxhYmVsIiwicHJvZHVjdFZhcmlhbnRzbGlzdCIsIm1hdGNoTGFiZWxGb3JDaGVja2VkSW5wdXQiLCJpbnB0IiwiZGF0YXNldCIsInByb2R1Y3RBdHRyaWJ1dGVWYWx1ZSIsImxhYmVscyIsInRpdGxlIiwicHJvZHVjdFZhcmlhbnQiLCJzb3J0IiwidmlldyIsInByb2R1Y3ROYW1lIiwiY2FyZCIsImlzUnVubmluZ0luSWZyYW1lIiwic2VsZiIsInRvcCIsIiRjaGFuZ2VkT3B0aW9uIiwicGFyZW50cyIsInByb2R1Y3RJZCIsIkZvcm1EYXRhIiwicHJvZHVjdEF0dHJpYnV0ZXNDb250ZW50IiwiY2hlY2tJc1F1aWNrVmlld0NoaWxkIiwiJHN3YXRjaCIsIiRzd2F0Y2hHcm91cCIsInN3YXRjaE5hbWUiLCJhY3RpdmVTd2F0Y2hHcm91cElkIiwic2V0TGl2ZVJlZ2lvbkF0dHJpYnV0ZXMiLCJyb2xlVHlwZSIsImFyaWFMaXZlU3RhdHVzIiwicm9sZSIsInNob3dQcm9kdWN0SW1hZ2UiLCJpbWFnZSIsIl9pc1BsYWluT2JqZWN0Iiwiem9vbUltYWdlVXJsIiwidG9vbHMiLCJpbWFnZVNyY3NldCIsImdldFNyY3NldCIsInpvb21TaXplIiwibWFpbkltYWdlVXJsIiwicHJvZHVjdFNpemUiLCJtYWluSW1hZ2VTcmNzZXQiLCJzZXRBbHRlcm5hdGVJbWFnZSIsInJlc3RvcmVJbWFnZSIsInF1YW50aXR5TWluIiwicXVhbnRpdHlNYXgiLCJxdHkiLCJ3aGljaCIsImZvcm0iLCJfdGhpczUiLCIkYWRkVG9DYXJ0QnRuIiwib3JpZ2luYWxCdG5WYWwiLCJ3YWl0TWVzc2FnZSIsImNhcnQiLCJpdGVtQWRkIiwiZXJyb3IiLCJ0bXAiLCJjcmVhdGVFbGVtZW50IiwiaW5uZXJIVE1MIiwiJHByZU1vZGFsRm9jdXNlZEVsIiwidGV4dENvbnRlbnQiLCJ0aGVtZV9zZXR0aW5ncyIsInNob3dfZmFzdF9jYXJ0IiwiQXBwbGVQYXlTZXNzaW9uIiwiJG1vZGFsIiwidXBkYXRlQ2FydENvbnRlbnQiLCJjYXJ0X2l0ZW0iLCJzZXR1cEZvY3VzVHJhcCIsInJlZGlyZWN0VG8iLCJjYXJ0X3VybCIsInVybHMiLCJuZXh0IiwiZ2V0Q2FydENvbnRlbnQiLCJjYXJ0SXRlbUlkIiwib25Db21wbGV0ZSIsInRlbXBsYXRlIiwicGFyYW1zIiwic3VnZ2VzdCIsImNvbmZpZyIsInN1Z2dlc3Rpb25zIiwibGltaXQiLCJnZXRDb250ZW50IiwidXJsIiwiaWZyYW1lU2RrIiwibW9kYWwiLCJ1cGRhdGVDb250ZW50IiwiJGJvZHkiLCIkY2FydFF1YW50aXR5IiwiJGNvbnRlbnQiLCIkY2FydENvdW50ZXIiLCIkcHJvbW90aW9uQmFubmVyIiwiJGJhY2tUb1Nob3BwcGluZ0J0biIsIiRtb2RhbENsb3NlQnRuIiwiYmFubmVyVXBkYXRlSGFuZGxlciIsIiRwcm9kdWN0Q29udGFpbmVyIiwicmVsb2FkIiwiY3VycmVudFNlbGVjdEVsZW1lbnQiLCJkaXNhYmxlZFNlbGVjdEVsZW1lbnQiLCJzZWxlY3RFbGVtZW50IiwiaW5zZXJ0QWZ0ZXIiLCJzZWxlY3RlZE9wdGlvbiIsInByZXZpb3VzSW5kZXgiLCIkZWxlbWVudE5vd0F0UHJldmlvdXNJbmRleCIsImVxIiwiYXBwZW5kVG8iLCJwcmVwZW5kVG8iLCJmbiIsImZpbHRlckVtcHR5VmFsdWVzRnJvbUZvcm0iLCJmb3JtRGF0YSIsInJlcyIsIl9pdGVyYXRvciIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UiLCJfc3RlcCIsImRvbmUiLCJfc3RlcCR2YWx1ZSIsImNvbnNvbGUiLCJsb2ciLCJmaWx0ZXJFbXB0eUZpbGVzRnJvbUZvcm0iLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwiX3N0ZXAyJHZhbHVlIiwiRmlsZSIsIm5hbWUiLCJzaXplIiwiZXZ0IiwiQ3VzdG9tRXZlbnQiLCJkZXRhaWwiLCJhbW91bnQiLCJkaXNwYXRjaEV2ZW50IiwiaW5wdXRUYWdOYW1lcyIsImNyZWF0ZVBhc3N3b3JkVmFsaWRhdGlvbkVycm9yVGV4dE9iamVjdCIsImVtcHR5IiwiY29uZmlybSIsIm1pc21hdGNoIiwiaW52YWxpZCIsIm9uRW1wdHlQYXNzd29yZEVycm9yVGV4dCIsIm9uQ29uZmlybVBhc3N3b3JkRXJyb3JUZXh0Iiwib25NaXNtYXRjaFBhc3N3b3JkRXJyb3JUZXh0Iiwib25Ob3RWYWxpZFBhc3N3b3JkRXJyb3JUZXh0IiwiY2xhc3NpZnlJbnB1dCIsImlucHV0IiwiZm9ybUZpZWxkQ2xhc3MiLCIkZm9ybUZpZWxkIiwidGFnTmFtZSIsImNsYXNzTmFtZSIsInNwZWNpZmljQ2xhc3NOYW1lIiwiaW5wdXRUeXBlIiwiX2luY2x1ZGVzIiwiX2NhbWVsQ2FzZSIsIl9jYXBpdGFsaXplIiwiY2xhc3NpZnlGb3JtIiwiZm9ybVNlbGVjdG9yIiwiJGlucHV0cyIsIl9vcHRpb25zIiwiX29wdGlvbnMkZm9ybUZpZWxkQ2xhIiwiZ2V0RmllbGRJZCIsIiRmaWVsZCIsImZpZWxkSWQiLCJtYXRjaCIsImluc2VydFN0YXRlSGlkZGVuRmllbGQiLCIkc3RhdGVGaWVsZCIsInN0YXRlRmllbGRBdHRycyIsImFmdGVyIiwiYWN0aXZlSW5wdXRDb250YWluZXIiLCIkZXJyTWVzc2FnZSIsIlZhbGlkYXRvcnMiLCJzZXRFbWFpbFZhbGlkYXRpb24iLCJ2YWxpZGF0b3IiLCJmaWVsZCIsImVycm9yVGV4dCIsInNldFBhc3N3b3JkVmFsaWRhdGlvbiIsInBhc3N3b3JkU2VsZWN0b3IiLCJwYXNzd29yZDJTZWxlY3RvciIsInJlcXVpcmVtZW50cyIsImlzT3B0aW9uYWwiLCIkcGFzc3dvcmQiLCJwYXNzd29yZFZhbGlkYXRpb25zIiwiUmVnRXhwIiwiYWxwaGEiLCJudW1lcmljIiwibWlubGVuZ3RoIiwic2V0TWluTWF4UHJpY2VWYWxpZGF0aW9uIiwic2VsZWN0b3JzIiwicHJpY2VWYWxpZGF0aW9uRXJyb3JUZXh0cyIsImVycm9yU2VsZWN0b3IiLCJmaWVsZHNldFNlbGVjdG9yIiwibWF4UHJpY2VTZWxlY3RvciIsIm1pblByaWNlU2VsZWN0b3IiLCJfcHJpY2VWYWxpZGF0aW9uRXJyb3IiLCJvbk1pblByaWNlRXJyb3IiLCJvbk1heFByaWNlRXJyb3IiLCJtaW5QcmljZU5vdEVudGVyZWQiLCJtYXhQcmljZU5vdEVudGVyZWQiLCJvbkludmFsaWRQcmljZSIsImNvbmZpZ3VyZSIsInByZXZlbnRTdWJtaXQiLCJzZXRNZXNzYWdlT3B0aW9ucyIsImVycm9yU3BhbiIsInNldFN0YXRlQ291bnRyeVZhbGlkYXRpb24iLCJjbGVhblVwU3RhdGVWYWxpZGF0aW9uIiwiJGZpZWxkQ2xhc3NFbGVtZW50Iiwia2V5cyIsImZvckVhY2giLCJkb2N1bWVudE1vZGUiLCJjb2xsZWN0aW9uIiwic2xpY2UiLCJjaGFuZ2VXaXNobGlzdFBhZ2luYXRpb25MaW5rcyIsIndpc2hsaXN0VXJsIiwicGFnaW5hdGlvbkl0ZW1zIiwicGFnaW5hdGlvbkxpbmsiLCJwYWdlTnVtYmVyIiwid2lzaGxpc3RQYWdpbmF0b3JIZWxwZXIiLCIkcGFnaW5hdGlvbkxpc3QiLCIkbmV4dEl0ZW0iLCIkcHJldkl0ZW0iLCJjdXJyZW50SHJlZiIsInBhcnRpYWxQYWdpbmF0aW9uVXJsIiwic2hpZnQiLCJzYWZlU3RyaW5nIiwic3RyIiwiZCIsIkRPTVBhcnNlciIsInBhcnNlRnJvbVN0cmluZyIsImJvZHkiLCJVcmwiLCJ1cmxVdGlscyIsImdldFVybCIsInBhdGhuYW1lIiwic2VhcmNoIiwiZ29Ub1VybCIsImhpc3RvcnkiLCJwdXNoU3RhdGUiLCJyZXBsYWNlUGFyYW1zIiwicGFyc2VkIiwicGFyc2UiLCJwYXJhbSIsImhhc093blByb3BlcnR5IiwicXVlcnkiLCJmb3JtYXQiLCJidWlsZFF1ZXJ5U3RyaW5nIiwicXVlcnlEYXRhIiwib3V0IiwiaXNBcnJheSIsIm5keCIsInN1YnN0cmluZyIsInBhcnNlUXVlcnlQYXJhbXMiLCJ0ZW1wIiwiUGFnZU1hbmFnZXIiLCJxdWlja1NlYXJjaCIsImN1cnJlbmN5U2VsZWN0b3IiLCJtb2JpbGVNZW51VG9nZ2xlIiwibWVudSIsImZvdW5kYXRpb24iLCJxdWlja1ZpZXciLCJjYXJ0UHJldmlldyIsInByaXZhY3lDb29raWVOb3RpZmljYXRpb24iLCJhZG1pbkJhciIsImxvYWRpbmdQcm9ncmVzc0JhciIsInN2Z0luamVjdG9yIiwicm9vdHNMb2FkZWQiLCJHbG9iYWwiLCJfUGFnZU1hbmFnZXIiLCJvblJlYWR5IiwiX3RoaXMkY29udGV4dCIsImNoYW5uZWxJZCIsImNhcnRJZCIsImNhdGVnb3J5SWQiLCJzZWN1cmVCYXNlVXJsIiwibWFpbnRlbmFuY2VNb2RlU2V0dGluZ3MiLCJhZG1pbkJhckxhbmd1YWdlIiwiSlNPTiIsIm1haW50ZW5hbmNlTW9kZSIsImxhbmciLCJ0cmFuc2xhdGlvbnMiLCJpc01haW50ZW5hbmNlTW9kZSIsImhlYWRlciIsImlzSW5JZnJhbWUiLCJnZXRDb250ZXh0dWFsTWF0Y2giLCJkb2VzTm90SGF2ZUFkbWluQ29va2llIiwiY29va2llIiwiVVJMU2VhcmNoUGFyYW1zIiwiVVJMIiwic2VhcmNoUGFyYW1zIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiaHJlZiIsImNvbnRleHR1YWxNYXRjaCIsInJlbW92ZSIsIkNhcnRQcmV2aWV3RXZlbnRzIiwibG9hZGluZ0NsYXNzIiwiJGNhcnQiLCIkY2FydERyb3Bkb3duIiwiJGNhcnRMb2FkaW5nIiwidG9nZ2xlQ2xhc3MiLCJzdG9yYWdlIiwibG9jYWxTdG9yYWdlQXZhaWxhYmxlIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsImdldEl0ZW0iLCJOdW1iZXIiLCJjYXJ0UXR5UHJvbWlzZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZ2V0Q2FydFF1YW50aXR5IiwiYmFzZVVybCIsInRoZW4iLCIkcHJpdmFjeURpYWxvZyIsImRhdGUiLCJEYXRlIiwic2V0RGF0ZSIsImdldERhdGUiLCJ0b0dNVFN0cmluZyIsImhvb2tzIiwiZW1pdCIsInN3YWwiLCJjaGFuZ2VDdXJyZW5jeSIsImN1cnJlbmN5Q29kZSIsImFqYXgiLCJjb250ZW50VHlwZSIsIm1ldGhvZCIsInN0cmluZ2lmeSIsImZhaWwiLCJmaXJlIiwicmVzcG9uc2VUZXh0IiwiaWNvbiIsInNob3dDYW5jZWxCdXR0b24iLCJjdXJyZW5jeVNlc3Npb25Td2l0Y2hlciIsImdldENhcnQiLCJzaG93V2FybmluZyIsImRpc2NvdW50cyIsInNvbWUiLCJkaXNjb3VudCIsImRpc2NvdW50ZWRBbW91bnQiLCJjb3Vwb25zIiwibGluZUl0ZW1zIiwiZ2lmdENlcnRpZmljYXRlcyIsInJldmVhbENsb3NlRmFjdG9yeSIsImRyb3Bkb3duIiwiYWN0aXZlX2NsYXNzIiwicmV2ZWFsIiwiYmdfY2xhc3MiLCJkaXNtaXNzX21vZGFsX2NsYXNzIiwiY2xvc2Vfb25fYmFja2dyb3VuZF9jbGljayIsInRhYiIsInRyYXZlcnNpbmciLCJldmVudHMiLCJvbGREYXRhIiwialF1ZXJ5IiwiZWxlbSIsImN1ckRhdGEiLCJoYXNEYXRhIiwic2FtZUtleXMiLCJjYW1lbENhc2UiLCJvbGRMb2FkIiwiaGFuZGxlciIsInNwbGljZSIsInRyaWdnZXJIYW5kbGVyIiwib2xkSW5pdCIsInJldCIsIm5vZGVUeXBlIiwib2xkRm5GaW5kIiwiTmFub2JhciIsIm5hbm9iYXIiLCJ0aW1lciIsImN1cnJlbnQiLCJjbGVhclRpbWVyIiwiY2xlYXJJbnRlcnZhbCIsInNldFRpbWVyIiwic2V0SW50ZXJ2YWwiLCJnbyIsImFqYXhTZW5kIiwiYWpheENvbXBsZXRlIiwiTWVudSIsIiRtZW51IiwiaGFzTWF4TWVudURpc3BsYXlEZXB0aCIsImNvbGxhcHNpYmxlcyIsImNvbGxhcHNpYmxlR3JvdXBzIiwib25NZW51Q2xpY2siLCJvbkRvY3VtZW50Q2xpY2siLCJjb2xsYXBzZUFsbCIsImNvbGxhcHNlTmVpZ2hib3JzIiwiJG5laWdoYm9ycyIsIiRjb2xsYXBzaWJsZSIsIm1lbnVGYWN0b3J5IiwiY2FjaGVkTWVudSIsIkNBTUVMIiwiU05BS0UiLCJtb2JpbGVNZW51SWQiLCJtZW51U2VsZWN0b3IiLCJNb2JpbGVNZW51VG9nZ2xlIiwiX3JlZiRoZWFkZXJTZWxlY3RvciIsImhlYWRlclNlbGVjdG9yIiwiX3JlZiRtZW51U2VsZWN0b3IiLCJfcmVmJHNjcm9sbFZpZXdTZWxlY3QiLCJzY3JvbGxWaWV3U2VsZWN0b3IiLCIkbmF2TGlzdCIsIiRoZWFkZXIiLCIkc2Nyb2xsVmlldyIsIiRzdWJNZW51cyIsIm1lZGl1bU1lZGlhUXVlcnlMaXN0Iiwib25Ub2dnbGVDbGljayIsIm9uQ2FydFByZXZpZXdPcGVuIiwib25NZWRpdW1NZWRpYVF1ZXJ5TWF0Y2giLCJvblN1Yk1lbnVDbGljayIsInNjcm9sbFRvcCIsInJlc2V0U3ViTWVudXMiLCIkY2xvc2VzdEFjdGlvbiIsIiRwYXJlbnRTaWJsaW5ncyIsIiRwYXJlbnRBY3Rpb24iLCJtb2JpbGVNZW51VG9nZ2xlRmFjdG9yeSIsImNhY2hlZE1vYmlsZU1lbnUiLCJtb2JpbGVNZW51IiwiZm9jdXNUcmFwIiwiYm9keUFjdGl2ZUNsYXNzIiwibG9hZGluZ092ZXJsYXlDbGFzcyIsIm1vZGFsQm9keUNsYXNzIiwibW9kYWxDb250ZW50Q2xhc3MiLCJTaXplQ2xhc3NlcyIsIm5vcm1hbCIsIk1vZGFsRXZlbnRzIiwib3BlbmVkIiwibG9hZGVkIiwiZ2V0U2l6ZUZyb21Nb2RhbCIsImdldFZpZXdwb3J0SGVpZ2h0IiwibXVsdGlwbGVyIiwidmlld3BvcnRIZWlnaHQiLCJoZWlnaHQiLCJ3cmFwTW9kYWxCb2R5IiwiJG1vZGFsQm9keSIsInJlc3RyYWluQ29udGVudEhlaWdodCIsImJvZHlIZWlnaHQiLCJvdXRlckhlaWdodCIsImNvbnRlbnRIZWlnaHQiLCJtYXhIZWlnaHQiLCJjcmVhdGVNb2RhbENvbnRlbnQiLCJleGlzdGluZ0NvbnRlbnQiLCJjcmVhdGVMb2FkaW5nT3ZlcmxheSIsIiRsb2FkaW5nT3ZlcmxheSIsIk1vZGFsIiwiX3JlZiRzaXplIiwiZGVmYXVsdFNpemUiLCJwZW5kaW5nIiwib25Nb2RhbE9wZW4iLCJvbk1vZGFsT3BlbmVkIiwib25Nb2RhbENsb3NlIiwib25Nb2RhbENsb3NlZCIsIl9yZWYyJHBlbmRpbmciLCJfcmVmMiRjbGVhckNvbnRlbnQiLCJjbGVhckNvbnRlbnQiLCJfcmVmMyR3cmFwIiwid3JhcCIsImFjdGl2ZUVsZW1lbnQiLCJjcmVhdGVGb2N1c1RyYXAiLCJlc2NhcGVEZWFjdGl2YXRlcyIsInJldHVybkZvY3VzT25EZWFjdGl2YXRlIiwiYWxsb3dPdXRzaWRlQ2xpY2siLCJmYWxsYmFja0ZvY3VzIiwiZmFsbGJhY2tOb2RlIiwiZGVhY3RpdmF0ZSIsImFjdGl2YXRlIiwib25lIiwiX3BlbmRpbmciLCJfc2l6ZSIsIiRtb2RhbHMiLCJjYWNoZWRNb2RhbCIsImRlZmF1bHRNb2RhbCIsIlN0ZW5jaWxEcm9wRG93biIsIlRPUF9TVFlMSU5HIiwiJHF1aWNrU2VhcmNoUmVzdWx0cyIsIiRxdWlja1NlYXJjaEZvcm1zIiwiJHF1aWNrU2VhcmNoRXhwYW5kIiwiJHNlYXJjaFF1ZXJ5Iiwic3RlbmNpbERyb3BEb3duRXh0ZW5kYWJsZXMiLCJzdGVuY2lsRHJvcERvd24iLCJvbkJvZHlDbGljayIsImRlYm91bmNlV2FpdFRpbWUiLCJkb1NlYXJjaCIsIl9kZWJvdW5jZSIsInNlYXJjaFF1ZXJ5IiwiJHF1aWNrU2VhcmNoUmVzdWx0c0N1cnJlbnQiLCIkbm9SZXN1bHRzTWVzc2FnZSIsIiRxdWlja1NlYXJjaEFyaWFNZXNzYWdlIiwicHJlZGVmaW5lZFRleHQiLCJpdGVtc0ZvdW5kQ291bnQiLCJzZXRUaW1lb3V0Iiwic2VhcmNoVXJsIiwiUmV2aWV3IiwiaGFuZGxlRHJvcGRvd25FeHBhbmQiLCIkZHJvcGRvd25NZW51IiwiZHJvcGRvd25CdG5IZWlnaHQiLCJwcmV2IiwicHJvZHVjdCIsImdldEJ5SWQiLCJyZXZlYWxDbG9zZUF0dHIiLCJyZXZlYWxDbG9zZVNlbGVjdG9yIiwicmV2ZWFsU2VsZWN0b3IiLCJSZXZlYWxDbG9zZSIsIm1vZGFsSWQiLCJvbkNsaWNrIiwiJGJ1dHRvbnMiLCJjYWNoZWRCdXR0b24iLCJidXR0b24iLCJTdGVuY2lsRHJvcGRvd24iLCJleHRlbmRhYmxlcyIsIiRkcm9wRG93biIsIiRkcm9wRG93blRyaWdnZXIiLCJtb2RhbE9wZW5lZCIsInN3ZWV0QWxlcnQiLCJ3ZWFrTWFwIiwiV2Vha01hcCIsIlN3YWwiLCJtaXhpbiIsImJ1dHRvbnNTdHlsaW5nIiwiY3VzdG9tQ2xhc3MiLCJjb25maXJtQnV0dG9uIiwiY2FuY2VsQnV0dG9uIiwiY29uc3RydWN0b3IiLCJwYWdlIiwicmVhZHkiLCIkZ2FsbGVyeSIsIiRtYWluSW1hZ2UiLCIkbWFpbkltYWdlTmVzdGVkIiwiJHNlbGVjdGFibGVJbWFnZXMiLCJjdXJyZW50SW1hZ2UiLCJzZXRJbWFnZVpvb20iLCJzZXRNYWluSW1hZ2UiLCJpbWdPYmoiLCJhc3NpZ24iLCJzZXRBY3RpdmVUaHVtYiIsInN3YXBNYWluSW1hZ2UiLCJzYXZlZEltYWdlIiwiJHNlbGVjdGVkVGh1bWIiLCJzZWxlY3ROZXdJbWFnZSIsIm1haW5JbWFnZUFsdCIsImVhc3l6b29tIiwic3dhcCIsImFsdCIsImZhbGxiYWNrU3R5bGVzSUUiLCJjaGVja0ltYWdlIiwiJGltYWdlQ29udGFpbmVyIiwiY29udGFpbmVySGVpZ2h0IiwiY29udGFpbmVyV2lkdGgiLCIkem9vbSIsImVhc3lab29tIiwib25TaG93IiwiZXJyb3JOb3RpY2UiLCJsb2FkaW5nTm90aWNlIiwiX2RlZmF1bHQiLCIkcmV2aWV3Rm9ybSIsIiRyZXZpZXdUYWJMaW5rIiwiJHJldmlld3NDb250ZW50IiwiJHJldmlld3NDb250ZW50TGlzdCIsImluaXRMaW5rQmluZCIsImluamVjdFBhZ2luYXRpb25MaW5rIiwic2V0dXBSZXZpZXdzIiwiJHByb2R1Y3RSZXZpZXdMaW5rIiwiZXhwYW5kUmV2aWV3cyIsIiRuZXh0TGluayIsIiRwcmV2TGluayIsInJlZ2lzdGVyVmFsaWRhdGlvbiIsInJldmlld1JhdGluZyIsInJldmlld1N1YmplY3QiLCJyZXZpZXdDb21tZW50IiwicmV2aWV3RW1haWwiLCJob3ZlcmludGVudCIsIndpbmRvd1dpZHRoIiwid2luV2lkdGgiLCJpbm5lcldpZHRoIiwiaXNOYU4iLCJjbGllbnRXaWR0aCIsInJlc2l6ZVRpbWVyIiwidG9nZ2xlQWN0aXZlIiwidG91Y2hFeHBhbmQiLCJ1bmJpbmQiLCJtb2JpbGVFeHBhbmQiLCJleHBhbmRHcm91cCIsIm5leHRVbnRpbCIsIm1vYmlsZU5hdlBhZGRpbmciLCJsb2dvSGVpZ2h0IiwiY2FsY0hlYWRlckhlaWdodE1vYmlsZSIsImhlYWRlck5vTmF2SGVpZ2h0Iiwic2VhcmNoSGVpZ2h0IiwibW9iaWxlSGVhZGVySGVpZ2h0IiwicGFnZU9mZnNldCIsInRvZ2dsZUhlYWRlckhlaWdodERlc2t0b3AiLCJoZWFkZXJIZWlnaHQiLCJuYXZIZWlnaHQiLCJuYXZUb2dnbGVXaWR0aCIsImxvZ29XaWR0aCIsImNvbXByZXNzSGVhZGVyRGVza3RvcCIsImV4cGFuZEhlYWRlckRlc2t0b3AiLCJzY3JvbGwiLCJ0b2dnbGVIZWFkZXJIZWlnaHRNb2JpbGUiLCJoZWFkZXJDb21wcmVzcyIsIm51bVBlckNvbHVtbiIsImxpbmtzUGVyQ29sIiwibWVudUNvbHVtbnMiLCJzcGxpdENvbHVtbnMiLCIkY29sbWVudSIsIiRsaXMiLCJjb2xNZW51SHRtbCIsImNvbE1lbnVDb3VudCIsImNvbEdyb3VwIiwiY29sR3JvdXBDb3VudCIsImJ1aWxkQ29sdW1uIiwiJGxpIiwiJGxpQ2xhc3MiLCJwcmVwYXJlTWVudSIsImRyb3Bkb3duUGFkZGluZyIsIm5hdldpZHRoIiwiY29sV2lkdGgiLCJmbG9vciIsImNvdW50Q29scyIsImNvbHMiLCJkcm9wZG93bldpZHRoIiwibmF2T2Zmc2V0Iiwib2Zmc2V0IiwibGVmdCIsInBhcmVudE9mZnNldCIsInNwYWNlQXZhaWxhYmxlIiwicmlnaHRCb3VuZCIsInJlc2V0V2lkdGhzIiwib3B0cyIsImludGVydmFsIiwiZWwiLCJob3ZlckludGVudE92ZXIiLCJob3ZlckludGVudE91dCIsImNsZWFyVGltZW91dCIsImNsb3NlTWluaUNhcnQiLCJhZGRFdmVudExpc3RlbmVyIiwiY29tcGFyZVRvZ2dsZSIsImNoZWNrQ29tcGFyZSIsImF0dHJpYnV0ZXMiLCJjaGlsZExpc3QiLCJzdWJ0cmVlIiwiY2FsbGJhY2siLCJtdXRhdGlvbnNMaXN0Iiwib2JzZXJ2ZXIiLCJNdXRhdGlvbk9ic2VydmVyIiwib2JzZXJ2ZSIsIiR0aGlzIiwiaXNTZWxlY3RlZCIsImNvbXBhcmVMYWJlbCIsInJldmlld3NPZmZzZXQiLCJ0b2dnbGVGb290ZXJCbG9ja3MiLCJXaXNoTGlzdCIsIl9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQiLCJ3aXNobGlzdERlbGV0ZUNvbmZpcm0iLCJjb25maXJtZWQiLCJ3aXNobGlzdERlbGV0ZSIsInJlZ2lzdGVyQWRkV2lzaExpc3RWYWxpZGF0aW9uIiwiJGFkZFdpc2hsaXN0Rm9ybSIsImFkZFdpc2hsaXN0VmFsaWRhdG9yIiwiZW50ZXJXaXNobGlzdE5hbWVFcnJvciIsIiRhZGRXaXNoTGlzdEZvcm0iLCJyZXF1ZXN0IiwidmVyc2lvbiIsInJlbW90ZVZlcnNpb24iLCJyZW1vdGVCYXNlRW5kcG9pbnQiLCJtYWtlUmVxdWVzdCIsInJlbW90ZSIsInJlcXVlc3RPcHRpb25zIiwicmVtb3RlUmVxdWVzdCIsImVuZHBvaW50IiwicmVtb3RlVXJsIiwiQm9kbEV2ZW50c0NhcnQiLCJCYXNlIiwiSG9va3MiLCJfQmFzZSIsImJvZGxFdmVudHNDYXJ0IiwiZ2V0Qm9kbEV2ZW50c0NhcnQiLCJnZXRDYXJ0cyIsImluY2x1ZGVPcHRpb25zIiwiZ2V0Q2FydFN1bW1hcnkiLCJzdGF0dXMiLCJ0b3RhbF9xdWFudGl0eSIsImhhbmRsZUl0ZW1BZGQiLCJlbWl0QWRkSXRlbSIsImVtaXREYXRhIiwiaXRlbVVwZGF0ZSIsIml0ZW1JZCIsImNhbGxiYWNrQXJnIiwiaXRlbXMiLCJ1cGRhdGUiLCJlbWl0UmVtb3ZlSXRlbSIsIml0ZW1SZW1vdmUiLCJoYW5kbGVJdGVtUmVtb3ZlIiwiZ2V0SXRlbUdpZnRXcmFwcGluZ09wdGlvbnMiLCJzdWJtaXRJdGVtR2lmdFdyYXBwaW5nT3B0aW9uIiwicGF5bG9hZCIsInBvc3RGb3JtRGF0YSIsImdldFNoaXBwaW5nUXVvdGVzIiwicmVuZGVyV2l0aCIsInJlbmRlcldpdGhBcmciLCJzdWJtaXRTaGlwcGluZ1F1b3RlIiwicXVvdGVJZCIsInNoaXBwaW5nX21ldGhvZCIsImFwcGx5Q29kZSIsImNvZGUiLCJhcHBseUdpZnRDZXJ0aWZpY2F0ZSIsImdldEJ5TmFtZSIsIkNvdW50cnlBcGkiLCJQcm9kdWN0QXBpIiwiUHJvZHVjdEF0dHJpYnV0ZXNBcGkiLCJTZWFyY2hBcGkiLCJDYXJ0QXBpIiwiaW50ZXJuYWxzIiwiZ2V0UGFnZSIsImdldFBhZ2VCeUdRTCIsInRlbXBsYXRlX25hbWUiLCJjb3VudHJ5Iiwid2lzaGxpc3QiLCJpbkNhcnRFbmRwb2ludCIsInRlbXBsYXRlQXJnIiwiY29uZmlndXJlSW5DYXJ0IiwicGFyYW1zQXJnIiwid2lzaGxpc3RJZCIsImNhbGxiYWNrRm4iLCJnZXRCT0RMRXZlbnRzIiwiYm9kbEV2ZW50cyIsImdldEV2ZW50SWQiLCJpc0JPRExFbmFibGVkIiwiQ2FydCIsIkFkZENhcnRJdGVtRXZlbnQiLCJDUkVBVEUiLCJzaG91bGRFbWl0UmVtb3ZlSXRlbSIsIlJlbW92ZUNhcnRJdGVtRXZlbnQiLCJfcmVzcG9uc2UkZGF0YSRsaW5lX2kiLCJsaW5lX2l0ZW1zIiwiZXZlbnROYW1lIiwicHJlcGFyZVBheWxvYWQiLCJldmVudF9pZCIsImNoYW5uZWxfaWQiLCJjdXJyZW5jeSIsInByb2R1Y3RfdmFsdWUiLCJwcm9kdWN0X2lkIiwiU3RyaW5nIiwidjQiLCJ1dWlkdjQiLCJGYWtlQk9ETEV2ZW50cyIsImFkZEl0ZW0iLCJyZW1vdmVJdGVtIiwiRXZlbnRFbWl0dGVyIiwiX0V2ZW50RW1pdHRlciIsInN1YnNjcmliZSIsImVsZW1lbnRTZWxlY3RvciIsIkJhc2VIb29rcyIsIl9CYXNlSG9va3MiLCJzZWFyY2hFdmVudHMiLCJDYXJ0SG9va3MiLCJDb29raWVIb29rcyIsIkN1cnJlbmN5U2VsZWN0b3JIb29rcyIsIlByb2R1Y3RIb29rcyIsIlNlYXJjaEhvb2tzIiwiRmFjZXRlZFNlYXJjaEhvb2tzIiwiU29ydEJ5SG9va3MiLCJmYWNldGVkU2VhcmNoIiwic29ydEJ5IiwicGFyc2VIb29rcyIsImhvb2tOYW1lIiwiaG9va1R5cGUiLCJFcnJvciIsImhvb2siLCJvcHRpb25zQ2hhbmdlIiwiRWxlbWVudCIsIm1zTWF0Y2hlc1NlbGVjdG9yIiwid2Via2l0TWF0Y2hlc1NlbGVjdG9yIiwic29ydEJ5RXZlbnRzIiwiZGVmYXVsdFByZXZlbnRlZCIsInMiLCJwYXJlbnRFbGVtZW50IiwiZW5jb2RlIiwic3RyaW5nIiwiY2hhckNvZGVBdCIsInRvU3RyaW5nIiwidG9VcHBlckNhc2UiLCJzcGxpdE9uRmlyc3QiLCJzZXBhcmF0b3IiLCJzZXBhcmF0b3JJbmRleCIsInNvcnRCeUtleXMiLCJhIiwiYiIsImdldFBhcnNlZFZhbHVlIiwiYWNjdW11bGF0b3IiLCJjb25jYXQiLCJyZWR1Y2VCeUtleSIsImluY2x1ZGVBcnJheUluZGV4Iiwia2V5T2ZWYWx1ZSIsImNyZWF0ZSIsImlucHV0UGFyc2VkIiwiX3NwbGl0T25GaXJzdCIsImRlY29kZVVSSUNvbXBvbmVudCIsIkJvb2xlYW4iLCJvYmplY3QiLCJmaWx0ZXJWYWx1ZXMiLCJhcnJheUluZGV4Iiwib2JqZWN0Q29weSIsInNob3VsZEZpbHRlciIsImlzVmFsaWRIVFRQTWV0aG9kIiwiaXNVc2luZ1NlY3Rpb25zIiwicmVxdWVzdGVkVGVtcGxhdGUiLCJnZXRUZW1wbGF0ZXMiLCJ0ZW1wbGF0ZXMiLCJyZWxhdGl2ZVVybCIsImRlZmF1bHRPcHRpb25zIiwiaGVhZGVycyIsIkJDRGF0YSIsImNzcmZfdG9rZW4iLCJ1c2luZ1NlY3Rpb25zIiwidXNpbmdUZW1wbGF0ZXMiLCJyZW5kZXJfd2l0aCIsImNyZWRlbnRpYWxzIiwiZGVsaW1pdGVyIiwiZmV0Y2giLCJqc29uIiwiY2xlYW5LZXkiLCJ0ZW1wbGF0ZVZhcmlhYmxlIiwiU3RlbmNpbFV0aWxzIiwicm9vdCIsImRlZmluZSIsImFtZCIsInN0ZW5jaWxVdGlscyIsIm1vZHVsZSIsImV4cG9ydHMiLCJnZXRTcmMiLCJwYXRoIiwiZGltZW5zaW9ucyIsInNpemVSZWdleCIsInNpemVzIiwiZGVzY3JpcHRvclJlZ2V4Iiwic3Jjc2V0cyIsImRlc2NyaXB0b3IiLCJJbWFnZVRvb2wiLCJJbWFnZVNyY3NldFRvb2wiLCJTdG9yYWdlVG9vbHMiLCJzdG9yYWdlQXZhaWxhYmxlIiwiRE9NRXhjZXB0aW9uIiwiX193ZWJwYWNrX3B1YmxpY19wYXRoX18iLCJnZXRBY2NvdW50IiwiZ2V0TG9naW4iLCJub29wIiwicGFnZUNsYXNzZXMiLCJhY2NvdW50X29yZGVyc3RhdHVzIiwiYWNjb3VudF9vcmRlciIsImFjY291bnRfYWRkcmVzc2Jvb2siLCJzaGlwcGluZ2FkZHJlc3Nmb3JtIiwiYWNjb3VudF9uZXdfcmV0dXJuIiwiYWRkV2lzaGxpc3QiLCJhY2NvdW50X3JlY2VudGl0ZW1zIiwiYWNjb3VudF9kb3dubG9hZGl0ZW0iLCJlZGl0YWNjb3VudCIsImFjY291bnRfaW5ib3giLCJhY2NvdW50X3NhdmVkX3JldHVybiIsImFjY291bnRfcmV0dXJucyIsImFjY291bnRfcGF5bWVudG1ldGhvZHMiLCJhY2NvdW50X2FkZHBheW1lbnRtZXRob2QiLCJhY2NvdW50X2VkaXRwYXltZW50bWV0aG9kIiwibG9naW4iLCJjcmVhdGVhY2NvdW50X3RoYW5rcyIsImNyZWF0ZWFjY291bnQiLCJnZXRuZXdwYXNzd29yZCIsImZvcmdvdHBhc3N3b3JkIiwiYmxvZyIsImJsb2dfcG9zdCIsImJyYW5kIiwiYnJhbmRzIiwiY2F0ZWdvcnkiLCJjb21wYXJlIiwicGFnZV9jb250YWN0X2Zvcm0iLCJnaWZ0Y2VydGlmaWNhdGVzIiwiZ2lmdGNlcnRpZmljYXRlc19iYWxhbmNlIiwiZ2lmdGNlcnRpZmljYXRlc19yZWRlZW0iLCJhbXBfcHJvZHVjdF9vcHRpb25zIiwicnNzIiwic2l0ZW1hcCIsIm5ld3NsZXR0ZXJfc3Vic2NyaWJlIiwid2lzaGxpc3RzIiwiY3VzdG9tQ2xhc3NlcyIsInN0ZW5jaWxCb290c3RyYXAiLCJwYWdlVHlwZSIsImNvbnRleHRKU09OIiwibG9hZEdsb2JhbCIsImltcG9ydFByb21pc2VzIiwicGFnZUNsYXNzSW1wb3J0ZXIiLCJjdXN0b21UZW1wbGF0ZUltcG9ydGVyIiwiYWxsIiwiaW1wb3J0cyIsImltcG9ydGVkIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/assets/scss/components/custom/_custom.scss b/assets/scss/components/custom/_custom.scss index d42c300..152285a 100644 --- a/assets/scss/components/custom/_custom.scss +++ b/assets/scss/components/custom/_custom.scss @@ -65,4 +65,42 @@ .productGrid { margin-bottom: 0px !important; - } \ No newline at end of file + } + + // ABOUT US + .text-float1{ + font-size: 2250%; + color: #181A1C; + position: absolute; + top: 350px; + right: -310px; + font-weight: bold; + z-index: 1; + transform: rotate(90deg); +} + +.text-float2{ + font-size: 2250%; + color: #F1ECE3; + position: absolute; + top: 745px; + right: 935px; + font-weight: bold; + z-index: 1; + transform: rotate(90deg); +} +.text-float3{ + font-size: 2250%; + color: #F7F4EE; + position: absolute; + top: 1106px; + right: 190px; + font-weight: bold; + z-index: 1; + transform: rotate(0deg); +} +.spacer{ + margin-top: -40px; + height: 225px; + background-color: #FFFBF6; +} \ No newline at end of file diff --git a/templates/pages/home.html b/templates/pages/home.html index 6fa15a3..c487e85 100644 --- a/templates/pages/home.html +++ b/templates/pages/home.html @@ -22,7 +22,12 @@ {{> components/common/alert/alert-info message}} {{/each}} +

VERO

+

SAR

+

TORIA

+
+
{{#if products.featured}} {{> components/products/featured products=products.featured columns=theme_settings.homepage_featured_products_column_count}}