babylonjs-ktx2decoder 7.31.1 → 7.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1889,6 +1889,8 @@ ZSTDDecoder.WasmModuleURL = "https://cdn.babylonjs.com/zstddec.wasm";
1889
1889
  /******/
1890
1890
  /************************************************************************/
1891
1891
  var __webpack_exports__ = {};
1892
+ // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
1893
+ (() => {
1892
1894
  /*!**********************!*\
1893
1895
  !*** ./src/index.ts ***!
1894
1896
  \**********************/
@@ -1902,9 +1904,11 @@ __webpack_require__.r(__webpack_exports__);
1902
1904
 
1903
1905
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ktx2decoder_legacy_legacy__WEBPACK_IMPORTED_MODULE_0__);
1904
1906
 
1907
+ })();
1908
+
1905
1909
  __webpack_exports__ = __webpack_exports__["default"];
1906
1910
  /******/ return __webpack_exports__;
1907
1911
  /******/ })()
1908
1912
  ;
1909
1913
  });
1910
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbi5rdHgyRGVjb2Rlci5tYXguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ1ZBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNoQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0SUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUdBOztBQUVBO0FBQ0E7QUFBQTs7QUFFQTtBQTJGQTtBQXRGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBV0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFPQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFNQTtBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0R0E7QUFFQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBeEJBOztBQUVBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBT0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeEJBO0FBRUE7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQXhCQTs7QUFFQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQU9BOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3hCQTtBQUVBO0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBV0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQTNDQTs7QUFFQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQU1BOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3hCQTtBQUVBO0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBV0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQTNDQTs7QUFFQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQU1BOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3hCQTtBQUVBO0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBV0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQTNDQTs7QUFFQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQU1BOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3hCQTtBQUVBO0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBV0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQTNDQTs7QUFFQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQU1BOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4QkE7QUFFQTtBQUVBO0FBTUE7O0FBRUE7QUFDQTtBQXdCQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFXQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQXZLQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBRUE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNSQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7QUFHQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUExSUE7QUE2SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeExBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFtRkE7QUFPQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOztBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDelhBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDM1BBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFXQTtBQUNBOztBQW5DQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ2pCQTtBQUdBO0FBRUE7O0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQXBEQTtBQU1BOzs7Ozs7Ozs7Ozs7Ozs7QUNiQTs7QUFFQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQXpFQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUNUQTtBQUVBO0FBY0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUF2REE7QUEwREE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErQkE7Ozs7Ozs7QUN6SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNQQTs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9LVFgyREVDT0RFUi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vS1RYMkRFQ09ERVIvLi4vLi4vLi4vZGV2L2NvcmUvc3JjL01hdGVyaWFscy9UZXh0dXJlcy9rdHgyZGVjb2RlclR5cGVzLnRzIiwid2VicGFjazovL0tUWDJERUNPREVSLy4uLy4uLy4uL3Rvb2xzL2t0eDJEZWNvZGVyL3NyYy9NaXNjL2RhdGFSZWFkZXIudHMiLCJ3ZWJwYWNrOi8vS1RYMkRFQ09ERVIvLi4vLi4vLi4vdG9vbHMva3R4MkRlY29kZXIvc3JjL01pc2MvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vS1RYMkRFQ09ERVIvLi4vLi4vLi4vdG9vbHMva3R4MkRlY29kZXIvc3JjL1RyYW5zY29kZXJzL2luZGV4LnRzIiwid2VicGFjazovL0tUWDJERUNPREVSLy4uLy4uLy4uL3Rvb2xzL2t0eDJEZWNvZGVyL3NyYy9UcmFuc2NvZGVycy9saXRlVHJhbnNjb2Rlci50cyIsIndlYnBhY2s6Ly9LVFgyREVDT0RFUi8uLi8uLi8uLi90b29scy9rdHgyRGVjb2Rlci9zcmMvVHJhbnNjb2RlcnMvbGl0ZVRyYW5zY29kZXJfVUFTVENfQVNUQy50cyIsIndlYnBhY2s6Ly9LVFgyREVDT0RFUi8uLi8uLi8uLi90b29scy9rdHgyRGVjb2Rlci9zcmMvVHJhbnNjb2RlcnMvbGl0ZVRyYW5zY29kZXJfVUFTVENfQkM3LnRzIiwid2VicGFjazovL0tUWDJERUNPREVSLy4uLy4uLy4uL3Rvb2xzL2t0eDJEZWNvZGVyL3NyYy9UcmFuc2NvZGVycy9saXRlVHJhbnNjb2Rlcl9VQVNUQ19SOF9VTk9STS50cyIsIndlYnBhY2s6Ly9LVFgyREVDT0RFUi8uLi8uLi8uLi90b29scy9rdHgyRGVjb2Rlci9zcmMvVHJhbnNjb2RlcnMvbGl0ZVRyYW5zY29kZXJfVUFTVENfUkc4X1VOT1JNLnRzIiwid2VicGFjazovL0tUWDJERUNPREVSLy4uLy4uLy4uL3Rvb2xzL2t0eDJEZWNvZGVyL3NyYy9UcmFuc2NvZGVycy9saXRlVHJhbnNjb2Rlcl9VQVNUQ19SR0JBX1NSR0IudHMiLCJ3ZWJwYWNrOi8vS1RYMkRFQ09ERVIvLi4vLi4vLi4vdG9vbHMva3R4MkRlY29kZXIvc3JjL1RyYW5zY29kZXJzL2xpdGVUcmFuc2NvZGVyX1VBU1RDX1JHQkFfVU5PUk0udHMiLCJ3ZWJwYWNrOi8vS1RYMkRFQ09ERVIvLi4vLi4vLi4vdG9vbHMva3R4MkRlY29kZXIvc3JjL1RyYW5zY29kZXJzL21zY1RyYW5zY29kZXIudHMiLCJ3ZWJwYWNrOi8vS1RYMkRFQ09ERVIvLi4vLi4vLi4vdG9vbHMva3R4MkRlY29kZXIvc3JjL2luZGV4LnRzIiwid2VicGFjazovL0tUWDJERUNPREVSLy4uLy4uLy4uL3Rvb2xzL2t0eDJEZWNvZGVyL3NyYy9rdHgyRGVjb2Rlci50cyIsIndlYnBhY2s6Ly9LVFgyREVDT0RFUi8uLi8uLi8uLi90b29scy9rdHgyRGVjb2Rlci9zcmMva3R4MkZpbGVSZWFkZXIudHMiLCJ3ZWJwYWNrOi8vS1RYMkRFQ09ERVIvLi4vLi4vLi4vdG9vbHMva3R4MkRlY29kZXIvc3JjL2xlZ2FjeS9sZWdhY3kudHMiLCJ3ZWJwYWNrOi8vS1RYMkRFQ09ERVIvLi4vLi4vLi4vdG9vbHMva3R4MkRlY29kZXIvc3JjL3RyYW5zY29kZURlY2lzaW9uVHJlZS50cyIsIndlYnBhY2s6Ly9LVFgyREVDT0RFUi8uLi8uLi8uLi90b29scy9rdHgyRGVjb2Rlci9zcmMvdHJhbnNjb2Rlci50cyIsIndlYnBhY2s6Ly9LVFgyREVDT0RFUi8uLi8uLi8uLi90b29scy9rdHgyRGVjb2Rlci9zcmMvdHJhbnNjb2Rlck1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vS1RYMkRFQ09ERVIvLi4vLi4vLi4vdG9vbHMva3R4MkRlY29kZXIvc3JjL3dhc21NZW1vcnlNYW5hZ2VyLnRzIiwid2VicGFjazovL0tUWDJERUNPREVSLy4uLy4uLy4uL3Rvb2xzL2t0eDJEZWNvZGVyL3NyYy96c3RkZGVjLnRzIiwid2VicGFjazovL0tUWDJERUNPREVSL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0tUWDJERUNPREVSL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9LVFgyREVDT0RFUi93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL0tUWDJERUNPREVSL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vS1RYMkRFQ09ERVIvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9LVFgyREVDT0RFUi8uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcImJhYnlsb25qcy1rdHgyZGVjb2RlclwiLCBbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJiYWJ5bG9uanMta3R4MmRlY29kZXJcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiS1RYMkRFQ09ERVJcIl0gPSBmYWN0b3J5KCk7XG59KSgodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHRoaXMpLCAoKSA9PiB7XG5yZXR1cm4gIiwiZXhwb3J0IGVudW0gU291cmNlVGV4dHVyZUZvcm1hdCB7XHJcbiAgICBFVEMxUyxcclxuICAgIFVBU1RDNHg0LFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBUcmFuc2NvZGVUYXJnZXQge1xyXG4gICAgQVNUQ180WDRfUkdCQSxcclxuICAgIEJDN19SR0JBLFxyXG4gICAgQkMzX1JHQkEsXHJcbiAgICBCQzFfUkdCLFxyXG4gICAgUFZSVEMxXzRfUkdCQSxcclxuICAgIFBWUlRDMV80X1JHQixcclxuICAgIEVUQzJfUkdCQSxcclxuICAgIEVUQzFfUkdCLFxyXG4gICAgUkdCQTMyLFxyXG4gICAgUjgsXHJcbiAgICBSRzgsXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBlbnVtIEVuZ2luZUZvcm1hdCB7XHJcbiAgICBDT01QUkVTU0VEX1JHQkFfQlBUQ19VTk9STV9FWFQgPSAweDhlOGMsXHJcbiAgICBDT01QUkVTU0VEX1JHQkFfQVNUQ180WDRfS0hSID0gMHg5M2IwLFxyXG4gICAgQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCA9IDB4ODNmMCxcclxuICAgIENPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUID0gMHg4M2YzLFxyXG4gICAgQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzRCUFBWMV9JTUcgPSAweDhjMDIsXHJcbiAgICBDT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HID0gMHg4YzAwLFxyXG4gICAgQ09NUFJFU1NFRF9SR0JBOF9FVEMyX0VBQyA9IDB4OTI3OCxcclxuICAgIENPTVBSRVNTRURfUkdCOF9FVEMyID0gMHg5Mjc0LFxyXG4gICAgQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTCA9IDB4OGQ2NCxcclxuICAgIFJHQkE4Rm9ybWF0ID0gMHg4MDU4LFxyXG4gICAgUjhGb3JtYXQgPSAweDgyMjksXHJcbiAgICBSRzhGb3JtYXQgPSAweDgyMmIsXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBMZWFmIG5vZGUgb2YgYSBkZWNpc2lvbiB0cmVlXHJcbiAqIEl0IGRlZmluZXMgdGhlIHRyYW5zY29kaW5nIGZvcm1hdCB0byB1c2UgdG8gdHJhbnNjb2RlIHRoZSB0ZXh0dXJlIGFzIHdlbGwgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybWF0IHRvIHVzZSBhdCB0aGUgZW5naW5lIGxldmVsIHdoZW4gY3JlYXRpbmcgdGhlIHRleHR1cmVcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUxlYWYge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZm9ybWF0IHRvIHRyYW5zY29kZSB0b1xyXG4gICAgICovXHJcbiAgICB0cmFuc2NvZGVGb3JtYXQ6IFRyYW5zY29kZVRhcmdldDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmb3JtYXQgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGhlIHRleHR1cmUgYXQgdGhlIGVuZ2luZSBsZXZlbCBhZnRlciBpdCBoYXMgYmVlbiB0cmFuc2NvZGVkIHRvIHRyYW5zY29kZUZvcm1hdFxyXG4gICAgICovXHJcbiAgICBlbmdpbmVGb3JtYXQ6IEVuZ2luZUZvcm1hdDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgdGhlIHRleHR1cmUgbXVzdCBiZSByb3VuZGVkIHRvIGEgbXVsdGlwbGUgb2YgNCAoc2hvdWxkIG5vcm1hbGx5IGJlIHRoZSBjYXNlIGZvciBhbGwgY29tcHJlc3NlZCBmb3JtYXRzKS4gRGVmYXVsdDogdHJ1ZVxyXG4gICAgICovXHJcbiAgICByb3VuZFRvTXVsdGlwbGU0PzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlZ3VsYXIgbm9kZSBvZiBhIGRlY2lzaW9uIHRyZWVcclxuICpcclxuICogRWFjaCBwcm9wZXJ0eSAoZXhjZXB0IGZvciBcInllc1wiIGFuZCBcIm5vXCIpLCBpZiBub3QgZW1wdHksIHdpbGwgYmUgY2hlY2tlZCBpbiBvcmRlciB0byBkZXRlcm1pbmUgdGhlIG5leHQgbm9kZSB0byBzZWxlY3QuXHJcbiAqIElmIGFsbCBjaGVja3MgYXJlIHN1Y2Nlc3NmdWwsIHRoZSBcInllc1wiIG5vZGUgd2lsbCBiZSBzZWxlY3RlZCwgZWxzZSB0aGUgXCJub1wiIG5vZGUgd2lsbCBiZSBzZWxlY3RlZC5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU5vZGUge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY2FwYWJpbGl0eSB0byBjaGVjay4gQ2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxyXG4gICAgICogICAgICBhc3RjXHJcbiAgICAgKiAgICAgIGJwdGNcclxuICAgICAqICAgICAgczN0Y1xyXG4gICAgICogICAgICBwdnJ0Y1xyXG4gICAgICogICAgICBldGMyXHJcbiAgICAgKiAgICAgIGV0YzFcclxuICAgICAqL1xyXG4gICAgY2FwPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIG9wdGlvbiB0byBjaGVjayBmcm9tIHRoZSBvcHRpb25zIG9iamVjdCBwYXNzZWQgdG8gdGhlIEtUWDIgZGVjb2RlIGZ1bmN0aW9uLiB7QGxpbmsgSUtUWDJEZWNvZGVyT3B0aW9uc31cclxuICAgICAqL1xyXG4gICAgb3B0aW9uPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIGFscGhhIGlzIHByZXNlbnQgaW4gdGhlIHRleHR1cmVcclxuICAgICAqL1xyXG4gICAgYWxwaGE/OiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdHJhbnNjb2RpbmcgZm9ybWF0LlxyXG4gICAgICovXHJcbiAgICB0cmFuc2NvZGVGb3JtYXQ/OiBUcmFuc2NvZGVUYXJnZXQgfCBUcmFuc2NvZGVUYXJnZXRbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB0aGF0IHRoZSB0ZXh0dXJlIGlzIGEgcG93ZXIgb2YgdHdvXHJcbiAgICAgKi9cclxuICAgIG5lZWRzUG93ZXJPZlR3bz86IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbm9kZSB0byBzZWxlY3QgaWYgYWxsIGNoZWNrcyBhcmUgc3VjY2Vzc2Z1bFxyXG4gICAgICovXHJcbiAgICB5ZXM/OiBJTm9kZSB8IElMZWFmO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG5vZGUgdG8gc2VsZWN0IGlmIGF0IGxlYXN0IG9uZSBjaGVjayBpcyBub3Qgc3VjY2Vzc2Z1bFxyXG4gICAgICovXHJcbiAgICBubz86IElOb2RlIHwgSUxlYWY7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZWNpc2lvbiB0cmVlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB0cmFuc2NvZGluZyBmb3JtYXQgdG8gdXNlIGZvciBhIGdpdmVuIHNvdXJjZSB0ZXh0dXJlIGZvcm1hdFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBJRGVjaXNpb25UcmVlIHtcclxuICAgIC8qKlxyXG4gICAgICogdGV4dHVyZUZvcm1hdCBjYW4gYmUgZWl0aGVyIFVBU1RDIG9yIEVUQzFTXHJcbiAgICAgKi9cclxuICAgIFt0ZXh0dXJlRm9ybWF0OiBzdHJpbmddOiBJTm9kZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlc3VsdCBvZiB0aGUgS1RYMiBkZWNvZGUgZnVuY3Rpb25cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURlY29kZWREYXRhIHtcclxuICAgIC8qKlxyXG4gICAgICogV2lkdGggb2YgdGhlIHRleHR1cmVcclxuICAgICAqL1xyXG4gICAgd2lkdGg6IG51bWJlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEhlaWdodCBvZiB0aGUgdGV4dHVyZVxyXG4gICAgICovXHJcbiAgICBoZWlnaHQ6IG51bWJlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmb3JtYXQgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGhlIHRleHR1cmUgYXQgdGhlIGVuZ2luZSBsZXZlbFxyXG4gICAgICogVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgZW5naW5lRm9ybWF0IHByb3BlcnR5IG9mIHRoZSBsZWFmIG5vZGUgb2YgdGhlIGRlY2lzaW9uIHRyZWVcclxuICAgICAqL1xyXG4gICAgdHJhbnNjb2RlZEZvcm1hdDogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGlzdCBvZiBtaXBtYXAgbGV2ZWxzLlxyXG4gICAgICogVGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIGJhc2UgbGV2ZWwsIHRoZSBsYXN0IGVsZW1lbnQgaXMgdGhlIHNtYWxsZXN0IG1pcG1hcCBsZXZlbCAoaWYgbW9yZSB0aGFuIG9uZSBtaXBtYXAgbGV2ZWwgaXMgcHJlc2VudClcclxuICAgICAqL1xyXG4gICAgbWlwbWFwczogQXJyYXk8SU1pcG1hcD47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRoZSB0ZXh0dXJlIGRhdGEgaXMgaW4gZ2FtbWEgc3BhY2Ugb3Igbm90XHJcbiAgICAgKi9cclxuICAgIGlzSW5HYW1tYVNwYWNlOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0aGUgdGV4dHVyZSBoYXMgYW4gYWxwaGEgY2hhbm5lbCBvciBub3RcclxuICAgICAqL1xyXG4gICAgaGFzQWxwaGE6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgdHJhbnNjb2RlciB1c2VkIHRvIHRyYW5zY29kZSB0aGUgdGV4dHVyZVxyXG4gICAgICovXHJcbiAgICB0cmFuc2NvZGVyTmFtZTogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGVycm9ycyAoaWYgYW55KSBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIGRlY29kaW5nIHByb2Nlc3NcclxuICAgICAqL1xyXG4gICAgZXJyb3JzPzogc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICogRGVmaW5lcyBhIG1pcG1hcCBsZXZlbFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBJTWlwbWFwIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRhdGEgb2YgdGhlIG1pcG1hcCBsZXZlbFxyXG4gICAgICovXHJcbiAgICBkYXRhOiBVaW50OEFycmF5IHwgbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgbWlwbWFwIGxldmVsXHJcbiAgICAgKi9cclxuICAgIHdpZHRoOiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBtaXBtYXAgbGV2ZWxcclxuICAgICAqL1xyXG4gICAgaGVpZ2h0OiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IHRoZSBicm93c2VyXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElDb21wcmVzc2VkRm9ybWF0Q2FwYWJpbGl0aWVzIHtcclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0aGUgYnJvd3NlciBzdXBwb3J0cyBBU1RDXHJcbiAgICAgKi9cclxuICAgIGFzdGM/OiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0aGUgYnJvd3NlciBzdXBwb3J0cyBCUFRDXHJcbiAgICAgKi9cclxuICAgIGJwdGM/OiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0aGUgYnJvd3NlciBzdXBwb3J0cyBTM1RDXHJcbiAgICAgKi9cclxuICAgIHMzdGM/OiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0aGUgYnJvd3NlciBzdXBwb3J0cyBQVlJUQ1xyXG4gICAgICovXHJcbiAgICBwdnJ0Yz86IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRoZSBicm93c2VyIHN1cHBvcnRzIEVUQzJcclxuICAgICAqL1xyXG4gICAgZXRjMj86IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRoZSBicm93c2VyIHN1cHBvcnRzIEVUQzFcclxuICAgICAqL1xyXG4gICAgZXRjMT86IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBPcHRpb25zIHBhc3NlZCB0byB0aGUgS1RYMiBkZWNvZGUgZnVuY3Rpb25cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUtUWDJEZWNvZGVyT3B0aW9ucyB7XHJcbiAgICAvKiogdXNlIFJHQkEgZm9ybWF0IGlmIEFTVEMgYW5kIEJDNyBhcmUgbm90IGF2YWlsYWJsZSBhcyB0cmFuc2NvZGVkIGZvcm1hdCAqL1xyXG4gICAgdXNlUkdCQUlmQVNUQ0JDN05vdEF2YWlsYWJsZVdoZW5VQVNUQz86IGJvb2xlYW47XHJcblxyXG4gICAgLyoqIGZvcmNlIHRvIGFsd2F5cyB1c2UgKHVuY29tcHJlc3NlZCkgUkdCQSBmb3IgdHJhbnNjb2RlZCBmb3JtYXQgKi9cclxuICAgIGZvcmNlUkdCQT86IGJvb2xlYW47XHJcblxyXG4gICAgLyoqIGZvcmNlIHRvIGFsd2F5cyB1c2UgKHVuY29tcHJlc3NlZCkgUjggZm9yIHRyYW5zY29kZWQgZm9ybWF0ICovXHJcbiAgICBmb3JjZVI4PzogYm9vbGVhbjtcclxuXHJcbiAgICAvKiogZm9yY2UgdG8gYWx3YXlzIHVzZSAodW5jb21wcmVzc2VkKSBSRzggZm9yIHRyYW5zY29kZWQgZm9ybWF0ICovXHJcbiAgICBmb3JjZVJHOD86IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBsaXN0IG9mIHRyYW5zY29kZXJzIHRvIGJ5cGFzcyB3aGVuIGxvb2tpbmcgZm9yIGEgc3VpdGFibGUgdHJhbnNjb2Rlci4gVGhlIGF2YWlsYWJsZSB0cmFuc2NvZGVycyBhcmU6XHJcbiAgICAgKiAgICAgIFVuaXZlcnNhbFRyYW5zY29kZXJfVUFTVENfQVNUQ1xyXG4gICAgICogICAgICBVbml2ZXJzYWxUcmFuc2NvZGVyX1VBU1RDX0JDN1xyXG4gICAgICogICAgICBVbml2ZXJzYWxUcmFuc2NvZGVyX1VBU1RDX1JHQkFfVU5PUk1cclxuICAgICAqICAgICAgVW5pdmVyc2FsVHJhbnNjb2Rlcl9VQVNUQ19SR0JBX1NSR0JcclxuICAgICAqICAgICAgVW5pdmVyc2FsVHJhbnNjb2Rlcl9VQVNUQ19SOF9VTk9STVxyXG4gICAgICogICAgICBVbml2ZXJzYWxUcmFuc2NvZGVyX1VBU1RDX1JHOF9VTk9STVxyXG4gICAgICogICAgICBNU0NUcmFuc2NvZGVyXHJcbiAgICAgKi9cclxuICAgIGJ5cGFzc1RyYW5zY29kZXJzPzogc3RyaW5nW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDdXN0b20gZGVjaXNpb24gdHJlZSB0byBhcHBseSBhZnRlciB0aGUgZGVmYXVsdCBkZWNpc2lvbiB0cmVlIGhhcyBzZWxlY3RlZCBhIHRyYW5zY29kaW5nIGZvcm1hdC5cclxuICAgICAqIEFsbG93cyB0aGUgdXNlciB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBkZWNpc2lvbiB0cmVlIHNlbGVjdGlvbi5cclxuICAgICAqIFRoZSBkZWNpc2lvbiB0cmVlIGNhbiB1c2UgdGhlIElOb2RlLnRyYW5zY29kZUZvcm1hdCBwcm9wZXJ0eSB0byBiYXNlIGl0cyBkZWNpc2lvbiBvbiB0aGUgdHJhbnNjb2RpbmcgZm9ybWF0IHNlbGVjdGVkIGJ5IHRoZSBkZWZhdWx0IGRlY2lzaW9uIHRyZWUuXHJcbiAgICAgKi9cclxuICAgIHRyYW5zY29kZUZvcm1hdERlY2lzaW9uVHJlZT86IElEZWNpc2lvblRyZWU7XHJcbn1cclxuIiwiLyoqXHJcbiAqIFV0aWxpdHkgY2xhc3MgZm9yIHJlYWRpbmcgZnJvbSBhIGRhdGEgYnVmZmVyXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGF0YVJlYWRlciB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjdXJyZW50IGJ5dGUgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF0YSBidWZmZXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgYnl0ZU9mZnNldCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YUJ5dGVPZmZzZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZGF0YVZpZXc6IERhdGFWaWV3O1xyXG4gICAgcHJpdmF0ZSBfZGF0YUJ5dGVPZmZzZXQ6IG51bWJlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVjdG9yXHJcbiAgICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBidWZmZXIgdG8gc2V0XHJcbiAgICAgKiBAcGFyYW0gYnl0ZU9mZnNldCBUaGUgc3RhcnRpbmcgb2Zmc2V0IGluIHRoZSBidWZmZXJcclxuICAgICAqIEBwYXJhbSBieXRlTGVuZ3RoIFRoZSBieXRlIGxlbmd0aCBvZiB0aGUgYnVmZmVyXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcjogQXJyYXlCdWZmZXIgfCBBcnJheUJ1ZmZlclZpZXcsIGJ5dGVPZmZzZXQ/OiBudW1iZXIsIGJ5dGVMZW5ndGg/OiBudW1iZXIpIHtcclxuICAgICAgICBpZiAoKGJ1ZmZlciBhcyBBcnJheUJ1ZmZlclZpZXcpLmJ1ZmZlcikge1xyXG4gICAgICAgICAgICB0aGlzLl9kYXRhVmlldyA9IG5ldyBEYXRhVmlldyhcclxuICAgICAgICAgICAgICAgIChidWZmZXIgYXMgQXJyYXlCdWZmZXJWaWV3KS5idWZmZXIsXHJcbiAgICAgICAgICAgICAgICAoYnVmZmVyIGFzIEFycmF5QnVmZmVyVmlldykuYnl0ZU9mZnNldCArIChieXRlT2Zmc2V0ID8/IDApLFxyXG4gICAgICAgICAgICAgICAgYnl0ZUxlbmd0aCA/PyAoYnVmZmVyIGFzIEFycmF5QnVmZmVyVmlldykuYnl0ZUxlbmd0aFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlciBhcyBBcnJheUJ1ZmZlciwgYnl0ZU9mZnNldCA/PyAwLCBieXRlTGVuZ3RoID8/IChidWZmZXIgYXMgQXJyYXlCdWZmZXIpLmJ5dGVMZW5ndGgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGF0YUJ5dGVPZmZzZXQgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVhZCBhIHVuc2lnbmVkIDgtYml0IGludGVnZXIgZnJvbSB0aGUgY3VycmVudGx5IGxvYWRlZCBkYXRhIHJhbmdlLlxyXG4gICAgICogQHJldHVybnMgVGhlIDgtYml0IGludGVnZXIgcmVhZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVhZFVpbnQ4KCk6IG51bWJlciB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9kYXRhVmlldy5nZXRVaW50OCh0aGlzLl9kYXRhQnl0ZU9mZnNldCk7XHJcbiAgICAgICAgdGhpcy5fZGF0YUJ5dGVPZmZzZXQgKz0gMTtcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWFkIGEgc2lnbmVkIDgtYml0IGludGVnZXIgZnJvbSB0aGUgY3VycmVudGx5IGxvYWRlZCBkYXRhIHJhbmdlLlxyXG4gICAgICogQHJldHVybnMgVGhlIDgtYml0IGludGVnZXIgcmVhZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVhZEludDgoKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2RhdGFWaWV3LmdldEludDgodGhpcy5fZGF0YUJ5dGVPZmZzZXQpO1xyXG4gICAgICAgIHRoaXMuX2RhdGFCeXRlT2Zmc2V0ICs9IDE7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVhZCBhIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIGZyb20gdGhlIGN1cnJlbnRseSBsb2FkZWQgZGF0YSByYW5nZS5cclxuICAgICAqIEByZXR1cm5zIFRoZSAxNi1iaXQgaW50ZWdlciByZWFkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWFkVWludDE2KCk6IG51bWJlciB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9kYXRhVmlldy5nZXRVaW50MTYodGhpcy5fZGF0YUJ5dGVPZmZzZXQsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuX2RhdGFCeXRlT2Zmc2V0ICs9IDI7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVhZCBhIHNpZ25lZCAxNi1iaXQgaW50ZWdlciBmcm9tIHRoZSBjdXJyZW50bHkgbG9hZGVkIGRhdGEgcmFuZ2UuXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgMTYtYml0IGludGVnZXIgcmVhZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVhZEludDE2KCk6IG51bWJlciB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9kYXRhVmlldy5nZXRJbnQxNih0aGlzLl9kYXRhQnl0ZU9mZnNldCwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fZGF0YUJ5dGVPZmZzZXQgKz0gMjtcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWFkIGEgdW5zaWduZWQgMzItYml0IGludGVnZXIgZnJvbSB0aGUgY3VycmVudGx5IGxvYWRlZCBkYXRhIHJhbmdlLlxyXG4gICAgICogQHJldHVybnMgVGhlIDMyLWJpdCBpbnRlZ2VyIHJlYWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlYWRVaW50MzIoKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2RhdGFWaWV3LmdldFVpbnQzMih0aGlzLl9kYXRhQnl0ZU9mZnNldCwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fZGF0YUJ5dGVPZmZzZXQgKz0gNDtcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWFkIGEgc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIGZyb20gdGhlIGN1cnJlbnRseSBsb2FkZWQgZGF0YSByYW5nZS5cclxuICAgICAqIEByZXR1cm5zIFRoZSAzMi1iaXQgaW50ZWdlciByZWFkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWFkSW50MzIoKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2RhdGFWaWV3LmdldEludDMyKHRoaXMuX2RhdGFCeXRlT2Zmc2V0LCB0cnVlKTtcclxuICAgICAgICB0aGlzLl9kYXRhQnl0ZU9mZnNldCArPSA0O1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYWQgYSB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciBmcm9tIHRoZSBjdXJyZW50bHkgbG9hZGVkIGRhdGEgcmFuZ2UuXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgMzItYml0IGludGVnZXIgcmVhZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVhZFVpbnQ2NCgpOiBudW1iZXIge1xyXG4gICAgICAgIC8vIHNwbGl0IDY0LWJpdCBudW1iZXIgaW50byB0d28gMzItYml0ICg0LWJ5dGUpIHBhcnRzXHJcbiAgICAgICAgY29uc3QgbGVmdCA9IHRoaXMuX2RhdGFWaWV3LmdldFVpbnQzMih0aGlzLl9kYXRhQnl0ZU9mZnNldCwgdHJ1ZSk7XHJcbiAgICAgICAgY29uc3QgcmlnaHQgPSB0aGlzLl9kYXRhVmlldy5nZXRVaW50MzIodGhpcy5fZGF0YUJ5dGVPZmZzZXQgKyA0LCB0cnVlKTtcclxuXHJcbiAgICAgICAgLy8gY29tYmluZSB0aGUgdHdvIDMyLWJpdCB2YWx1ZXNcclxuICAgICAgICBjb25zdCBjb21iaW5lZCA9IGxlZnQgKyAyICoqIDMyICogcmlnaHQ7IC8vIFRoYXQgd2FzIHdlaXJkLi5LZWVwaW5nIGl0IGZvciBwb3N0ZXJpdHk6IHRydWUgPyBsZWZ0ICsgMiAqKiAzMiAqIHJpZ2h0IDogMiAqKiAzMiAqIGxlZnQgKyByaWdodDtcclxuXHJcbiAgICAgICAgLyppZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGNvbWJpbmVkKSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0RhdGFSZWFkZXI6ICcgKyBjb21iaW5lZCArICcgZXhjZWVkcyBNQVhfU0FGRV9JTlRFR0VSLiBQcmVjaXNpb24gbWF5IGJlIGxvc3QuJyk7XHJcbiAgICAgICAgfSovXHJcblxyXG4gICAgICAgIHRoaXMuX2RhdGFCeXRlT2Zmc2V0ICs9IDg7XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVhZCBhIGJ5dGUgYXJyYXkgZnJvbSB0aGUgY3VycmVudGx5IGxvYWRlZCBkYXRhIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIGJ5dGVMZW5ndGggVGhlIGJ5dGUgbGVuZ3RoIHRvIHJlYWRcclxuICAgICAqIEByZXR1cm5zIFRoZSBieXRlIGFycmF5IHJlYWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlYWRVaW50OEFycmF5KGJ5dGVMZW5ndGg6IG51bWJlcik6IFVpbnQ4QXJyYXkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fZGF0YVZpZXcuYnVmZmVyLCB0aGlzLl9kYXRhVmlldy5ieXRlT2Zmc2V0ICsgdGhpcy5fZGF0YUJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpO1xyXG4gICAgICAgIHRoaXMuX2RhdGFCeXRlT2Zmc2V0ICs9IGJ5dGVMZW5ndGg7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2tpcHMgdGhlIGdpdmVuIGJ5dGUgbGVuZ3RoIHRoZSBjdXJyZW50bHkgbG9hZGVkIGRhdGEgcmFuZ2UuXHJcbiAgICAgKiBAcGFyYW0gYnl0ZUxlbmd0aCBUaGUgYnl0ZSBsZW5ndGggdG8gc2tpcFxyXG4gICAgICogQHJldHVybnMgVGhpcyBpbnN0YW5jZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2tpcEJ5dGVzKGJ5dGVMZW5ndGg6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2RhdGFCeXRlT2Zmc2V0ICs9IGJ5dGVMZW5ndGg7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbn1cclxuIiwiZXhwb3J0ICogZnJvbSBcIi4vZGF0YVJlYWRlclwiO1xyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi9saXRlVHJhbnNjb2RlclwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9saXRlVHJhbnNjb2Rlcl9VQVNUQ19BU1RDXCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL2xpdGVUcmFuc2NvZGVyX1VBU1RDX0JDN1wiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9saXRlVHJhbnNjb2Rlcl9VQVNUQ19SOF9VTk9STVwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9saXRlVHJhbnNjb2Rlcl9VQVNUQ19SRzhfVU5PUk1cIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vbGl0ZVRyYW5zY29kZXJfVUFTVENfUkdCQV9VTk9STVwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9saXRlVHJhbnNjb2Rlcl9VQVNUQ19SR0JBX1NSR0JcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vbXNjVHJhbnNjb2RlclwiO1xyXG4iLCJpbXBvcnQgdHlwZSAqIGFzIEtUWDIgZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL2t0eDJkZWNvZGVyVHlwZXNcIjtcclxuXHJcbmltcG9ydCB7IFRyYW5zY29kZXIgfSBmcm9tIFwiLi4vdHJhbnNjb2RlclwiO1xyXG5pbXBvcnQgeyBXQVNNTWVtb3J5TWFuYWdlciB9IGZyb20gXCIuLi93YXNtTWVtb3J5TWFuYWdlclwiO1xyXG5pbXBvcnQgdHlwZSB7IEtUWDJGaWxlUmVhZGVyLCBJS1RYMl9JbWFnZURlc2MgfSBmcm9tIFwiLi4va3R4MkZpbGVSZWFkZXJcIjtcclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBjbGFzcyBMaXRlVHJhbnNjb2RlciBleHRlbmRzIFRyYW5zY29kZXIge1xyXG4gICAgcHJpdmF0ZSBfbW9kdWxlUGF0aDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfd2FzbUJpbmFyeTogQXJyYXlCdWZmZXIgfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgX21vZHVsZVByb21pc2U6IFByb21pc2U8eyBtb2R1bGU6IGFueSB9PjtcclxuICAgIHByaXZhdGUgX21lbW9yeU1hbmFnZXI6IFdBU01NZW1vcnlNYW5hZ2VyO1xyXG4gICAgcHJvdGVjdGVkIF90cmFuc2NvZGVJblBsYWNlOiBib29sZWFuO1xyXG5cclxuICAgIHByaXZhdGUgX2luc3RhbnRpYXRlV2ViQXNzZW1ibHkod2FzbUJpbmFyeTogQXJyYXlCdWZmZXIpOiBQcm9taXNlPHsgbW9kdWxlOiBhbnkgfT4ge1xyXG4gICAgICAgIHJldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZSh3YXNtQmluYXJ5IGFzIEFycmF5QnVmZmVyLCB7IGVudjogeyBtZW1vcnk6IHRoaXMuX21lbW9yeU1hbmFnZXIud2FzbU1lbW9yeSB9IH0pLnRoZW4oKG1vZHVsZVdyYXBwZXIpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBtb2R1bGVXcmFwcGVyLmluc3RhbmNlLmV4cG9ydHMgfTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2xvYWRNb2R1bGUod2FzbUJpbmFyeTogQXJyYXlCdWZmZXIgfCBudWxsID0gdGhpcy5fd2FzbUJpbmFyeSk6IFByb21pc2U8eyBtb2R1bGU6IGFueSB9PiB7XHJcbiAgICAgICAgdGhpcy5fbW9kdWxlUHJvbWlzZSA9XHJcbiAgICAgICAgICAgIHRoaXMuX21vZHVsZVByb21pc2UgfHxcclxuICAgICAgICAgICAgKHdhc21CaW5hcnkgPyBQcm9taXNlLnJlc29sdmUod2FzbUJpbmFyeSkgOiBXQVNNTWVtb3J5TWFuYWdlci5Mb2FkV0FTTSh0aGlzLl9tb2R1bGVQYXRoKSkudGhlbigod2FzbUJpbmFyeSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbnRpYXRlV2ViQXNzZW1ibHkod2FzbUJpbmFyeSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tb2R1bGVQcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cclxuICAgIHByb3RlY3RlZCBnZXQgbWVtb3J5TWFuYWdlcigpOiBXQVNNTWVtb3J5TWFuYWdlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lbW9yeU1hbmFnZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxyXG4gICAgcHJvdGVjdGVkIHNldE1vZHVsZVBhdGgobW9kdWxlUGF0aDogc3RyaW5nLCB3YXNtQmluYXJ5OiBBcnJheUJ1ZmZlciB8IG51bGwpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9tb2R1bGVQYXRoID0gVHJhbnNjb2Rlci5HZXRXYXNtVXJsKG1vZHVsZVBhdGgpO1xyXG4gICAgICAgIHRoaXMuX3dhc21CaW5hcnkgPSB3YXNtQmluYXJ5O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSBpbml0aWFsaXplKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RyYW5zY29kZUluUGxhY2UgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSBuZWVkTWVtb3J5TWFuYWdlcigpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgc2V0TWVtb3J5TWFuYWdlcihtZW1vcnlNZ3I6IFdBU01NZW1vcnlNYW5hZ2VyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fbWVtb3J5TWFuYWdlciA9IG1lbW9yeU1ncjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgdHJhbnNjb2RlKFxyXG4gICAgICAgIHNyYzogS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LFxyXG4gICAgICAgIGRzdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQsXHJcbiAgICAgICAgbGV2ZWw6IG51bWJlcixcclxuICAgICAgICB3aWR0aDogbnVtYmVyLFxyXG4gICAgICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgICAgIHVuY29tcHJlc3NlZEJ5dGVMZW5ndGg6IG51bWJlcixcclxuICAgICAgICBrdHgyUmVhZGVyOiBLVFgyRmlsZVJlYWRlcixcclxuICAgICAgICBpbWFnZURlc2M6IElLVFgyX0ltYWdlRGVzYyB8IG51bGwsXHJcbiAgICAgICAgZW5jb2RlZERhdGE6IFVpbnQ4QXJyYXlcclxuICAgICk6IFByb21pc2U8VWludDhBcnJheSB8IG51bGw+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZE1vZHVsZSgpLnRoZW4oKG1vZHVsZVdyYXBwZXI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB0cmFuc2NvZGVyOiBhbnkgPSBtb2R1bGVXcmFwcGVyLm1vZHVsZTtcclxuICAgICAgICAgICAgY29uc3QgW3RleHR1cmVWaWV3LCB1bmNvbXByZXNzZWRUZXh0dXJlVmlldywgbkJsb2Nrc10gPSB0aGlzLl9wcmVwYXJlVHJhbnNjb2Rpbmcod2lkdGgsIGhlaWdodCwgdW5jb21wcmVzc2VkQnl0ZUxlbmd0aCwgZW5jb2RlZERhdGEpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRyYW5zY29kZXIudHJhbnNjb2RlKG5CbG9ja3MpID09PSAwID8gKHRoaXMuX3RyYW5zY29kZUluUGxhY2UgPyB0ZXh0dXJlVmlldy5zbGljZSgpIDogdW5jb21wcmVzc2VkVGV4dHVyZVZpZXchLnNsaWNlKCkpIDogbnVsbDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3ByZXBhcmVUcmFuc2NvZGluZyhcclxuICAgICAgICB3aWR0aDogbnVtYmVyLFxyXG4gICAgICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgICAgIHVuY29tcHJlc3NlZEJ5dGVMZW5ndGg6IG51bWJlcixcclxuICAgICAgICBlbmNvZGVkRGF0YTogVWludDhBcnJheSxcclxuICAgICAgICB1bmNvbXByZXNzZWROdW1Db21wb25lbnRzPzogbnVtYmVyXHJcbiAgICApOiBbVWludDhBcnJheSwgVWludDhBcnJheSB8IG51bGwsIG51bWJlcl0ge1xyXG4gICAgICAgIGNvbnN0IG5CbG9ja3MgPSAoKHdpZHRoICsgMykgPj4gMikgKiAoKGhlaWdodCArIDMpID4+IDIpO1xyXG5cclxuICAgICAgICBpZiAodW5jb21wcmVzc2VkTnVtQ29tcG9uZW50cyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHVuY29tcHJlc3NlZEJ5dGVMZW5ndGggPSB3aWR0aCAqICgoaGVpZ2h0ICsgMykgPj4gMikgKiA0ICogdW5jb21wcmVzc2VkTnVtQ29tcG9uZW50cztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHRleE1lbW9yeVBhZ2VzID0gKChuQmxvY2tzICogMTYgKyA2NTUzNSArICh0aGlzLl90cmFuc2NvZGVJblBsYWNlID8gMCA6IHVuY29tcHJlc3NlZEJ5dGVMZW5ndGgpKSA+PiAxNikgKyAxO1xyXG5cclxuICAgICAgICBjb25zdCB0ZXh0dXJlVmlldyA9IHRoaXMubWVtb3J5TWFuYWdlci5nZXRNZW1vcnlWaWV3KHRleE1lbW9yeVBhZ2VzLCA2NTUzNiwgbkJsb2NrcyAqIDE2KTtcclxuXHJcbiAgICAgICAgY29uc3QgdW5jb21wcmVzc2VkVGV4dHVyZVZpZXcgPSB0aGlzLl90cmFuc2NvZGVJblBsYWNlXHJcbiAgICAgICAgICAgID8gbnVsbFxyXG4gICAgICAgICAgICA6IG5ldyBVaW50OEFycmF5KFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9tZW1vcnlNYW5hZ2VyLndhc21NZW1vcnkuYnVmZmVyLFxyXG4gICAgICAgICAgICAgICAgICA2NTUzNiArIG5CbG9ja3MgKiAxNixcclxuICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkTnVtQ29tcG9uZW50cyAhPT0gdW5kZWZpbmVkID8gd2lkdGggKiBoZWlnaHQgKiB1bmNvbXByZXNzZWROdW1Db21wb25lbnRzIDogdW5jb21wcmVzc2VkQnl0ZUxlbmd0aFxyXG4gICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgIHRleHR1cmVWaWV3LnNldChlbmNvZGVkRGF0YSk7XHJcblxyXG4gICAgICAgIHJldHVybiBbdGV4dHVyZVZpZXcsIHVuY29tcHJlc3NlZFRleHR1cmVWaWV3LCBuQmxvY2tzXTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgKiBhcyBLVFgyIGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9rdHgyZGVjb2RlclR5cGVzXCI7XHJcblxyXG5pbXBvcnQgeyBMaXRlVHJhbnNjb2RlciB9IGZyb20gXCIuL2xpdGVUcmFuc2NvZGVyXCI7XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXHJcbmV4cG9ydCBjbGFzcyBMaXRlVHJhbnNjb2Rlcl9VQVNUQ19BU1RDIGV4dGVuZHMgTGl0ZVRyYW5zY29kZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBVUkwgdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgd2FzbSBtb2R1bGUgZm9yIHRoZSB0cmFuc2NvZGVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgV2FzbU1vZHVsZVVSTCA9IFwiaHR0cHM6Ly9jZG4uYmFieWxvbmpzLmNvbS9rdHgyVHJhbnNjb2RlcnMvMS91YXN0Y19hc3RjLndhc21cIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEJpbmFyeSBkYXRhIG9mIHRoZSB3YXNtIG1vZHVsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFdhc21CaW5hcnk6IEFycmF5QnVmZmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBDYW5UcmFuc2NvZGUoc3JjOiBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXQsIGRzdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQsIGlzSW5HYW1tYVNwYWNlOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHNyYyA9PT0gS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LlVBU1RDNHg0ICYmIGRzdCA9PT0gS1RYMi5UcmFuc2NvZGVUYXJnZXQuQVNUQ180WDRfUkdCQTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIE5hbWUgPSBcIlVuaXZlcnNhbFRyYW5zY29kZXJfVUFTVENfQVNUQ1wiO1xyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSBnZXROYW1lKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIExpdGVUcmFuc2NvZGVyX1VBU1RDX0FTVEMuTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XHJcbiAgICAgICAgdGhpcy5zZXRNb2R1bGVQYXRoKExpdGVUcmFuc2NvZGVyX1VBU1RDX0FTVEMuV2FzbU1vZHVsZVVSTCwgTGl0ZVRyYW5zY29kZXJfVUFTVENfQVNUQy5XYXNtQmluYXJ5KTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgKiBhcyBLVFgyIGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9rdHgyZGVjb2RlclR5cGVzXCI7XHJcblxyXG5pbXBvcnQgeyBMaXRlVHJhbnNjb2RlciB9IGZyb20gXCIuL2xpdGVUcmFuc2NvZGVyXCI7XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXHJcbmV4cG9ydCBjbGFzcyBMaXRlVHJhbnNjb2Rlcl9VQVNUQ19CQzcgZXh0ZW5kcyBMaXRlVHJhbnNjb2RlciB7XHJcbiAgICAvKipcclxuICAgICAqIFVSTCB0byB1c2Ugd2hlbiBsb2FkaW5nIHRoZSB3YXNtIG1vZHVsZSBmb3IgdGhlIHRyYW5zY29kZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBXYXNtTW9kdWxlVVJMID0gXCJodHRwczovL2Nkbi5iYWJ5bG9uanMuY29tL2t0eDJUcmFuc2NvZGVycy8xL3Vhc3RjX2JjNy53YXNtXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCaW5hcnkgZGF0YSBvZiB0aGUgd2FzbSBtb2R1bGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBXYXNtQmluYXJ5OiBBcnJheUJ1ZmZlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgQ2FuVHJhbnNjb2RlKHNyYzogS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LCBkc3Q6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LCBpc0luR2FtbWFTcGFjZTogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBzcmMgPT09IEtUWDIuU291cmNlVGV4dHVyZUZvcm1hdC5VQVNUQzR4NCAmJiBkc3QgPT09IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LkJDN19SR0JBO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgTmFtZSA9IFwiVW5pdmVyc2FsVHJhbnNjb2Rlcl9VQVNUQ19CQzdcIjtcclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0TmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBMaXRlVHJhbnNjb2Rlcl9VQVNUQ19CQzcuTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XHJcbiAgICAgICAgdGhpcy5zZXRNb2R1bGVQYXRoKExpdGVUcmFuc2NvZGVyX1VBU1RDX0JDNy5XYXNtTW9kdWxlVVJMLCBMaXRlVHJhbnNjb2Rlcl9VQVNUQ19CQzcuV2FzbUJpbmFyeSk7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0ICogYXMgS1RYMiBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMva3R4MmRlY29kZXJUeXBlc1wiO1xyXG5cclxuaW1wb3J0IHsgTGl0ZVRyYW5zY29kZXIgfSBmcm9tIFwiLi9saXRlVHJhbnNjb2RlclwiO1xyXG5pbXBvcnQgdHlwZSB7IEtUWDJGaWxlUmVhZGVyLCBJS1RYMl9JbWFnZURlc2MgfSBmcm9tIFwiLi4va3R4MkZpbGVSZWFkZXJcIjtcclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cclxuZXhwb3J0IGNsYXNzIExpdGVUcmFuc2NvZGVyX1VBU1RDX1I4X1VOT1JNIGV4dGVuZHMgTGl0ZVRyYW5zY29kZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBVUkwgdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgd2FzbSBtb2R1bGUgZm9yIHRoZSB0cmFuc2NvZGVyICh1bm9ybSlcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBXYXNtTW9kdWxlVVJMID0gXCJodHRwczovL2Nkbi5iYWJ5bG9uanMuY29tL2t0eDJUcmFuc2NvZGVycy8xL3Vhc3RjX3I4X3Vub3JtLndhc21cIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEJpbmFyeSBkYXRhIG9mIHRoZSB3YXNtIG1vZHVsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFdhc21CaW5hcnk6IEFycmF5QnVmZmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBDYW5UcmFuc2NvZGUoc3JjOiBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXQsIGRzdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQsIGlzSW5HYW1tYVNwYWNlOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHNyYyA9PT0gS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LlVBU1RDNHg0ICYmIGRzdCA9PT0gS1RYMi5UcmFuc2NvZGVUYXJnZXQuUjg7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBOYW1lID0gXCJVbml2ZXJzYWxUcmFuc2NvZGVyX1VBU1RDX1I4X1VOT1JNXCI7XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIGdldE5hbWUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gTGl0ZVRyYW5zY29kZXJfVUFTVENfUjhfVU5PUk0uTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNjb2RlSW5QbGFjZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2V0TW9kdWxlUGF0aChMaXRlVHJhbnNjb2Rlcl9VQVNUQ19SOF9VTk9STS5XYXNtTW9kdWxlVVJMLCBMaXRlVHJhbnNjb2Rlcl9VQVNUQ19SOF9VTk9STS5XYXNtQmluYXJ5KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgdHJhbnNjb2RlKFxyXG4gICAgICAgIHNyYzogS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LFxyXG4gICAgICAgIGRzdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQsXHJcbiAgICAgICAgbGV2ZWw6IG51bWJlcixcclxuICAgICAgICB3aWR0aDogbnVtYmVyLFxyXG4gICAgICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgICAgIHVuY29tcHJlc3NlZEJ5dGVMZW5ndGg6IG51bWJlcixcclxuICAgICAgICBrdHgyUmVhZGVyOiBLVFgyRmlsZVJlYWRlcixcclxuICAgICAgICBpbWFnZURlc2M6IElLVFgyX0ltYWdlRGVzYyB8IG51bGwsXHJcbiAgICAgICAgZW5jb2RlZERhdGE6IFVpbnQ4QXJyYXlcclxuICAgICk6IFByb21pc2U8VWludDhBcnJheSB8IG51bGw+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZE1vZHVsZSgpLnRoZW4oKG1vZHVsZVdyYXBwZXI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB0cmFuc2NvZGVyOiBhbnkgPSBtb2R1bGVXcmFwcGVyLm1vZHVsZTtcclxuICAgICAgICAgICAgY29uc3QgWywgdW5jb21wcmVzc2VkVGV4dHVyZVZpZXddID0gdGhpcy5fcHJlcGFyZVRyYW5zY29kaW5nKHdpZHRoLCBoZWlnaHQsIHVuY29tcHJlc3NlZEJ5dGVMZW5ndGgsIGVuY29kZWREYXRhLCAxKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2NvZGVyLmRlY29kZSh3aWR0aCwgaGVpZ2h0KSA9PT0gMCA/IHVuY29tcHJlc3NlZFRleHR1cmVWaWV3IS5zbGljZSgpIDogbnVsbDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgKiBhcyBLVFgyIGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9rdHgyZGVjb2RlclR5cGVzXCI7XHJcblxyXG5pbXBvcnQgeyBMaXRlVHJhbnNjb2RlciB9IGZyb20gXCIuL2xpdGVUcmFuc2NvZGVyXCI7XHJcbmltcG9ydCB0eXBlIHsgS1RYMkZpbGVSZWFkZXIsIElLVFgyX0ltYWdlRGVzYyB9IGZyb20gXCIuLi9rdHgyRmlsZVJlYWRlclwiO1xyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxyXG5leHBvcnQgY2xhc3MgTGl0ZVRyYW5zY29kZXJfVUFTVENfUkc4X1VOT1JNIGV4dGVuZHMgTGl0ZVRyYW5zY29kZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBVUkwgdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgd2FzbSBtb2R1bGUgZm9yIHRoZSB0cmFuc2NvZGVyICh1bm9ybSlcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBXYXNtTW9kdWxlVVJMID0gXCJodHRwczovL2Nkbi5iYWJ5bG9uanMuY29tL2t0eDJUcmFuc2NvZGVycy8xL3Vhc3RjX3JnOF91bm9ybS53YXNtXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCaW5hcnkgZGF0YSBvZiB0aGUgd2FzbSBtb2R1bGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBXYXNtQmluYXJ5OiBBcnJheUJ1ZmZlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgQ2FuVHJhbnNjb2RlKHNyYzogS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LCBkc3Q6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LCBpc0luR2FtbWFTcGFjZTogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBzcmMgPT09IEtUWDIuU291cmNlVGV4dHVyZUZvcm1hdC5VQVNUQzR4NCAmJiBkc3QgPT09IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LlJHODtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIE5hbWUgPSBcIlVuaXZlcnNhbFRyYW5zY29kZXJfVUFTVENfUkc4X1VOT1JNXCI7XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIGdldE5hbWUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gTGl0ZVRyYW5zY29kZXJfVUFTVENfUkc4X1VOT1JNLk5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIGluaXRpYWxpemUoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zY29kZUluUGxhY2UgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNldE1vZHVsZVBhdGgoTGl0ZVRyYW5zY29kZXJfVUFTVENfUkc4X1VOT1JNLldhc21Nb2R1bGVVUkwsIExpdGVUcmFuc2NvZGVyX1VBU1RDX1JHOF9VTk9STS5XYXNtQmluYXJ5KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgdHJhbnNjb2RlKFxyXG4gICAgICAgIHNyYzogS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LFxyXG4gICAgICAgIGRzdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQsXHJcbiAgICAgICAgbGV2ZWw6IG51bWJlcixcclxuICAgICAgICB3aWR0aDogbnVtYmVyLFxyXG4gICAgICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgICAgIHVuY29tcHJlc3NlZEJ5dGVMZW5ndGg6IG51bWJlcixcclxuICAgICAgICBrdHgyUmVhZGVyOiBLVFgyRmlsZVJlYWRlcixcclxuICAgICAgICBpbWFnZURlc2M6IElLVFgyX0ltYWdlRGVzYyB8IG51bGwsXHJcbiAgICAgICAgZW5jb2RlZERhdGE6IFVpbnQ4QXJyYXlcclxuICAgICk6IFByb21pc2U8VWludDhBcnJheSB8IG51bGw+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZE1vZHVsZSgpLnRoZW4oKG1vZHVsZVdyYXBwZXI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB0cmFuc2NvZGVyOiBhbnkgPSBtb2R1bGVXcmFwcGVyLm1vZHVsZTtcclxuICAgICAgICAgICAgY29uc3QgWywgdW5jb21wcmVzc2VkVGV4dHVyZVZpZXddID0gdGhpcy5fcHJlcGFyZVRyYW5zY29kaW5nKHdpZHRoLCBoZWlnaHQsIHVuY29tcHJlc3NlZEJ5dGVMZW5ndGgsIGVuY29kZWREYXRhLCAyKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2NvZGVyLmRlY29kZSh3aWR0aCwgaGVpZ2h0KSA9PT0gMCA/IHVuY29tcHJlc3NlZFRleHR1cmVWaWV3IS5zbGljZSgpIDogbnVsbDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgKiBhcyBLVFgyIGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9rdHgyZGVjb2RlclR5cGVzXCI7XHJcblxyXG5pbXBvcnQgeyBMaXRlVHJhbnNjb2RlciB9IGZyb20gXCIuL2xpdGVUcmFuc2NvZGVyXCI7XHJcbmltcG9ydCB0eXBlIHsgS1RYMkZpbGVSZWFkZXIsIElLVFgyX0ltYWdlRGVzYyB9IGZyb20gXCIuLi9rdHgyRmlsZVJlYWRlclwiO1xyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxyXG5leHBvcnQgY2xhc3MgTGl0ZVRyYW5zY29kZXJfVUFTVENfUkdCQV9TUkdCIGV4dGVuZHMgTGl0ZVRyYW5zY29kZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBVUkwgdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgd2FzbSBtb2R1bGUgZm9yIHRoZSB0cmFuc2NvZGVyIChzcmdiKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFdhc21Nb2R1bGVVUkwgPSBcImh0dHBzOi8vY2RuLmJhYnlsb25qcy5jb20va3R4MlRyYW5zY29kZXJzLzEvdWFzdGNfcmdiYThfc3JnYl92Mi53YXNtXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCaW5hcnkgZGF0YSBvZiB0aGUgd2FzbSBtb2R1bGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBXYXNtQmluYXJ5OiBBcnJheUJ1ZmZlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgQ2FuVHJhbnNjb2RlKHNyYzogS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LCBkc3Q6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LCBpc0luR2FtbWFTcGFjZTogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBzcmMgPT09IEtUWDIuU291cmNlVGV4dHVyZUZvcm1hdC5VQVNUQzR4NCAmJiBkc3QgPT09IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LlJHQkEzMiAmJiBpc0luR2FtbWFTcGFjZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIE5hbWUgPSBcIlVuaXZlcnNhbFRyYW5zY29kZXJfVUFTVENfUkdCQV9TUkdCXCI7XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIGdldE5hbWUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gTGl0ZVRyYW5zY29kZXJfVUFTVENfUkdCQV9TUkdCLk5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIGluaXRpYWxpemUoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zY29kZUluUGxhY2UgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNldE1vZHVsZVBhdGgoTGl0ZVRyYW5zY29kZXJfVUFTVENfUkdCQV9TUkdCLldhc21Nb2R1bGVVUkwsIExpdGVUcmFuc2NvZGVyX1VBU1RDX1JHQkFfU1JHQi5XYXNtQmluYXJ5KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgdHJhbnNjb2RlKFxyXG4gICAgICAgIHNyYzogS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LFxyXG4gICAgICAgIGRzdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQsXHJcbiAgICAgICAgbGV2ZWw6IG51bWJlcixcclxuICAgICAgICB3aWR0aDogbnVtYmVyLFxyXG4gICAgICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgICAgIHVuY29tcHJlc3NlZEJ5dGVMZW5ndGg6IG51bWJlcixcclxuICAgICAgICBrdHgyUmVhZGVyOiBLVFgyRmlsZVJlYWRlcixcclxuICAgICAgICBpbWFnZURlc2M6IElLVFgyX0ltYWdlRGVzYyB8IG51bGwsXHJcbiAgICAgICAgZW5jb2RlZERhdGE6IFVpbnQ4QXJyYXlcclxuICAgICk6IFByb21pc2U8VWludDhBcnJheSB8IG51bGw+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZE1vZHVsZSgpLnRoZW4oKG1vZHVsZVdyYXBwZXI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB0cmFuc2NvZGVyOiBhbnkgPSBtb2R1bGVXcmFwcGVyLm1vZHVsZTtcclxuICAgICAgICAgICAgY29uc3QgWywgdW5jb21wcmVzc2VkVGV4dHVyZVZpZXddID0gdGhpcy5fcHJlcGFyZVRyYW5zY29kaW5nKHdpZHRoLCBoZWlnaHQsIHVuY29tcHJlc3NlZEJ5dGVMZW5ndGgsIGVuY29kZWREYXRhLCA0KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2NvZGVyLmRlY29kZSh3aWR0aCwgaGVpZ2h0KSA9PT0gMCA/IHVuY29tcHJlc3NlZFRleHR1cmVWaWV3IS5zbGljZSgpIDogbnVsbDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgKiBhcyBLVFgyIGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9rdHgyZGVjb2RlclR5cGVzXCI7XHJcblxyXG5pbXBvcnQgeyBMaXRlVHJhbnNjb2RlciB9IGZyb20gXCIuL2xpdGVUcmFuc2NvZGVyXCI7XHJcbmltcG9ydCB0eXBlIHsgS1RYMkZpbGVSZWFkZXIsIElLVFgyX0ltYWdlRGVzYyB9IGZyb20gXCIuLi9rdHgyRmlsZVJlYWRlclwiO1xyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxyXG5leHBvcnQgY2xhc3MgTGl0ZVRyYW5zY29kZXJfVUFTVENfUkdCQV9VTk9STSBleHRlbmRzIExpdGVUcmFuc2NvZGVyIHtcclxuICAgIC8qKlxyXG4gICAgICogVVJMIHRvIHVzZSB3aGVuIGxvYWRpbmcgdGhlIHdhc20gbW9kdWxlIGZvciB0aGUgdHJhbnNjb2RlciAodW5vcm0pXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgV2FzbU1vZHVsZVVSTCA9IFwiaHR0cHM6Ly9jZG4uYmFieWxvbmpzLmNvbS9rdHgyVHJhbnNjb2RlcnMvMS91YXN0Y19yZ2JhOF91bm9ybV92Mi53YXNtXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCaW5hcnkgZGF0YSBvZiB0aGUgd2FzbSBtb2R1bGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBXYXNtQmluYXJ5OiBBcnJheUJ1ZmZlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgQ2FuVHJhbnNjb2RlKHNyYzogS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LCBkc3Q6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LCBpc0luR2FtbWFTcGFjZTogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBzcmMgPT09IEtUWDIuU291cmNlVGV4dHVyZUZvcm1hdC5VQVNUQzR4NCAmJiBkc3QgPT09IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LlJHQkEzMiAmJiAhaXNJbkdhbW1hU3BhY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBOYW1lID0gXCJVbml2ZXJzYWxUcmFuc2NvZGVyX1VBU1RDX1JHQkFfVU5PUk1cIjtcclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0TmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBMaXRlVHJhbnNjb2Rlcl9VQVNUQ19SR0JBX1VOT1JNLk5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIGluaXRpYWxpemUoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zY29kZUluUGxhY2UgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNldE1vZHVsZVBhdGgoTGl0ZVRyYW5zY29kZXJfVUFTVENfUkdCQV9VTk9STS5XYXNtTW9kdWxlVVJMLCBMaXRlVHJhbnNjb2Rlcl9VQVNUQ19SR0JBX1VOT1JNLldhc21CaW5hcnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSB0cmFuc2NvZGUoXHJcbiAgICAgICAgc3JjOiBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXQsXHJcbiAgICAgICAgZHN0OiBLVFgyLlRyYW5zY29kZVRhcmdldCxcclxuICAgICAgICBsZXZlbDogbnVtYmVyLFxyXG4gICAgICAgIHdpZHRoOiBudW1iZXIsXHJcbiAgICAgICAgaGVpZ2h0OiBudW1iZXIsXHJcbiAgICAgICAgdW5jb21wcmVzc2VkQnl0ZUxlbmd0aDogbnVtYmVyLFxyXG4gICAgICAgIGt0eDJSZWFkZXI6IEtUWDJGaWxlUmVhZGVyLFxyXG4gICAgICAgIGltYWdlRGVzYzogSUtUWDJfSW1hZ2VEZXNjIHwgbnVsbCxcclxuICAgICAgICBlbmNvZGVkRGF0YTogVWludDhBcnJheVxyXG4gICAgKTogUHJvbWlzZTxVaW50OEFycmF5IHwgbnVsbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkTW9kdWxlKCkudGhlbigobW9kdWxlV3JhcHBlcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zY29kZXI6IGFueSA9IG1vZHVsZVdyYXBwZXIubW9kdWxlO1xyXG4gICAgICAgICAgICBjb25zdCBbLCB1bmNvbXByZXNzZWRUZXh0dXJlVmlld10gPSB0aGlzLl9wcmVwYXJlVHJhbnNjb2Rpbmcod2lkdGgsIGhlaWdodCwgdW5jb21wcmVzc2VkQnl0ZUxlbmd0aCwgZW5jb2RlZERhdGEsIDQpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRyYW5zY29kZXIuZGVjb2RlKHdpZHRoLCBoZWlnaHQpID09PSAwID8gdW5jb21wcmVzc2VkVGV4dHVyZVZpZXchLnNsaWNlKCkgOiBudWxsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCAqIGFzIEtUWDIgZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL2t0eDJkZWNvZGVyVHlwZXNcIjtcclxuXHJcbmltcG9ydCB7IFRyYW5zY29kZXIgfSBmcm9tIFwiLi4vdHJhbnNjb2RlclwiO1xyXG5pbXBvcnQgdHlwZSB7IEtUWDJGaWxlUmVhZGVyLCBJS1RYMl9JbWFnZURlc2MgfSBmcm9tIFwiLi4va3R4MkZpbGVSZWFkZXJcIjtcclxuaW1wb3J0IHsgV0FTTU1lbW9yeU1hbmFnZXIgfSBmcm9tIFwiLi4vd2FzbU1lbW9yeU1hbmFnZXJcIjtcclxuXHJcbmRlY2xhcmUgbGV0IE1TQ19UUkFOU0NPREVSOiBhbnk7XHJcblxyXG5kZWNsYXJlIGZ1bmN0aW9uIGltcG9ydFNjcmlwdHMoLi4udXJsczogc3RyaW5nW10pOiB2b2lkO1xyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1TQ1RyYW5zY29kZXIgZXh0ZW5kcyBUcmFuc2NvZGVyIHtcclxuICAgIC8qKlxyXG4gICAgICogVVJMIHRvIHVzZSB3aGVuIGxvYWRpbmcgdGhlIE1TQyB0cmFuc2NvZGVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgSlNNb2R1bGVVUkwgPSBcImh0dHBzOi8vY2RuLmJhYnlsb25qcy5jb20va3R4MlRyYW5zY29kZXJzLzEvbXNjX2Jhc2lzX3RyYW5zY29kZXIuanNcIjtcclxuICAgIC8qKlxyXG4gICAgICogVVJMIHRvIHVzZSB3aGVuIGxvYWRpbmcgdGhlIHdhc20gbW9kdWxlIGZvciB0aGUgdHJhbnNjb2RlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFdhc21Nb2R1bGVVUkwgPSBcImh0dHBzOi8vY2RuLmJhYnlsb25qcy5jb20va3R4MlRyYW5zY29kZXJzLzEvbXNjX2Jhc2lzX3RyYW5zY29kZXIud2FzbVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQmluYXJ5IGRhdGEgb2YgdGhlIHdhc20gbW9kdWxlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgV2FzbUJpbmFyeTogQXJyYXlCdWZmZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1TQyB0cmFuc2NvZGVyIG1vZHVsZSwgaWYgcHJvdmlkZWQgZXh0ZXJuYWxseVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIEpTTW9kdWxlOiBhbnkgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgVXNlRnJvbVdvcmtlclRocmVhZCA9IHRydWU7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBOYW1lID0gXCJNU0NUcmFuc2NvZGVyXCI7XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIGdldE5hbWUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gTVNDVHJhbnNjb2Rlci5OYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX21zY0Jhc2lzVHJhbnNjb2RlclByb21pc2U6IFByb21pc2U8dm9pZD47XHJcbiAgICBwcml2YXRlIF9tc2NCYXNpc01vZHVsZTogYW55O1xyXG5cclxuICAgIHByaXZhdGUgX2dldE1TQ0Jhc2lzVHJhbnNjb2RlcigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAodGhpcy5fbXNjQmFzaXNUcmFuc2NvZGVyUHJvbWlzZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbXNjQmFzaXNUcmFuc2NvZGVyUHJvbWlzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX21zY0Jhc2lzVHJhbnNjb2RlclByb21pc2UgPSAoXHJcbiAgICAgICAgICAgIE1TQ1RyYW5zY29kZXIuV2FzbUJpbmFyeSA/IFByb21pc2UucmVzb2x2ZShNU0NUcmFuc2NvZGVyLldhc21CaW5hcnkpIDogV0FTTU1lbW9yeU1hbmFnZXIuTG9hZFdBU00oVHJhbnNjb2Rlci5HZXRXYXNtVXJsKE1TQ1RyYW5zY29kZXIuV2FzbU1vZHVsZVVSTCkpXHJcbiAgICAgICAgKS50aGVuKCh3YXNtQmluYXJ5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChNU0NUcmFuc2NvZGVyLkpTTW9kdWxlICYmIHR5cGVvZiBNU0NfVFJBTlNDT0RFUiA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBtdXN0IGJlIHNldCBvbiB0aGUgZ2xvYmFsIHNjb3BlIGZvciB0aGUgTVNDIHRyYW5zY29kZXIgdG8gd29yay4gTWFpbmx5IGR1ZSB0byBiYWNrLWNvbXBhdCB3aXRoIHRoZSBvbGQgd2F5IG9mIGxvYWRpbmcgdGhlIE1TQyB0cmFuc2NvZGVyLlxyXG4gICAgICAgICAgICAgICAgKGdsb2JhbFRoaXMgYXMgYW55KS5NU0NfVFJBTlNDT0RFUiA9IE1TQ1RyYW5zY29kZXIuSlNNb2R1bGU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoTVNDVHJhbnNjb2Rlci5Vc2VGcm9tV29ya2VyVGhyZWFkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0U2NyaXB0cyhUcmFuc2NvZGVyLkdldFdhc21VcmwoTVNDVHJhbnNjb2Rlci5KU01vZHVsZVVSTCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gV29ya2VyIE51bWJlciA9IDAgYW5kIE1TQ19UUkFOU0NPREVSIGhhcyBub3QgYmVlbiBsb2FkZWQgeWV0LlxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIE1TQ19UUkFOU0NPREVSID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0LnNldEF0dHJpYnV0ZShcInR5cGVcIiwgXCJ0ZXh0L2phdmFzY3JpcHRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgVHJhbnNjb2Rlci5HZXRXYXNtVXJsKE1TQ1RyYW5zY29kZXIuSlNNb2R1bGVVUkwpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZlbnNpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTVNDX1RSQU5TQ09ERVIgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoXCJNU0NfVFJBTlNDT0RFUiBzY3JpcHQgbG9hZGVkIGJ1dCBNU0NfVFJBTlNDT0RFUiBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNU0NfVFJBTlNDT0RFUiBhcyBhbnkpKHsgd2FzbUJpbmFyeSB9KS50aGVuKChiYXNpc01vZHVsZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaXNNb2R1bGUuaW5pdFRyYW5zY29kZXJzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXNjQmFzaXNNb2R1bGUgPSBiYXNpc01vZHVsZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5vbmVycm9yID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwiQ2FuIG5vdCBsb2FkIE1TQ19UUkFOU0NPREVSIHNjcmlwdC5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgTVNDX1RSQU5TQ09ERVIoeyB3YXNtQmluYXJ5IH0pLnRoZW4oKGJhc2lzTW9kdWxlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBiYXNpc01vZHVsZS5pbml0VHJhbnNjb2RlcnMoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tc2NCYXNpc01vZHVsZSA9IGJhc2lzTW9kdWxlO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21zY0Jhc2lzVHJhbnNjb2RlclByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBDYW5UcmFuc2NvZGUoc3JjOiBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXQsIGRzdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQsIGlzSW5HYW1tYVNwYWNlOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIHRyYW5zY29kZShcclxuICAgICAgICBzcmM6IEtUWDIuU291cmNlVGV4dHVyZUZvcm1hdCxcclxuICAgICAgICBkc3Q6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LFxyXG4gICAgICAgIGxldmVsOiBudW1iZXIsXHJcbiAgICAgICAgd2lkdGg6IG51bWJlcixcclxuICAgICAgICBoZWlnaHQ6IG51bWJlcixcclxuICAgICAgICB1bmNvbXByZXNzZWRCeXRlTGVuZ3RoOiBudW1iZXIsXHJcbiAgICAgICAga3R4MlJlYWRlcjogS1RYMkZpbGVSZWFkZXIsXHJcbiAgICAgICAgaW1hZ2VEZXNjOiBJS1RYMl9JbWFnZURlc2MgfCBudWxsLFxyXG4gICAgICAgIGVuY29kZWREYXRhOiBVaW50OEFycmF5XHJcbiAgICApOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCBudWxsPiB7XHJcbiAgICAgICAgY29uc3QgaXNWaWRlbyA9IGZhbHNlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TVNDQmFzaXNUcmFuc2NvZGVyKCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJhc2lzTW9kdWxlID0gdGhpcy5fbXNjQmFzaXNNb2R1bGU7XHJcblxyXG4gICAgICAgICAgICBsZXQgdHJhbnNjb2RlcjogYW55O1xyXG4gICAgICAgICAgICBsZXQgaW1hZ2VJbmZvOiBhbnk7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQ6IGFueTtcclxuICAgICAgICAgICAgbGV0IHRleHR1cmVEYXRhOiBhbnkgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRyYW5zY29kZXIgPSBzcmMgPT09IEtUWDIuU291cmNlVGV4dHVyZUZvcm1hdC5VQVNUQzR4NCA/IG5ldyBiYXNpc01vZHVsZS5VYXN0Y0ltYWdlVHJhbnNjb2RlcigpIDogbmV3IGJhc2lzTW9kdWxlLkJhc2lzTHpFdGMxc0ltYWdlVHJhbnNjb2RlcigpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGV4Rm9ybWF0ID0gc3JjID09PSBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXQuVUFTVEM0eDQgPyBiYXNpc01vZHVsZS5UZXh0dXJlRm9ybWF0LlVBU1RDNHg0IDogYmFzaXNNb2R1bGUuVGV4dHVyZUZvcm1hdC5FVEMxUztcclxuXHJcbiAgICAgICAgICAgICAgICBpbWFnZUluZm8gPSBuZXcgYmFzaXNNb2R1bGUuSW1hZ2VJbmZvKHRleEZvcm1hdCwgd2lkdGgsIGhlaWdodCwgbGV2ZWwpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldEZvcm1hdCA9IGJhc2lzTW9kdWxlLlRyYW5zY29kZVRhcmdldFtLVFgyLlRyYW5zY29kZVRhcmdldFtkc3RdXTsgLy8gd29ya3MgYmVjYXVzZSB0aGUgbGFiZWxzIG9mIHRoZSBzb3VyY2VUZXh0dXJlRm9ybWF0IGVudW0gYXJlIHRoZSBzYW1lIGFzIHRoZSBwcm9wZXJ0eSBuYW1lcyB1c2VkIGluIFRyYW5zY29kZVRhcmdldCFcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWJhc2lzTW9kdWxlLmlzRm9ybWF0U3VwcG9ydGVkKHRhcmdldEZvcm1hdCwgdGV4Rm9ybWF0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgYE1TQ1RyYW5zY29kZXI6IFRyYW5zY29kaW5nIGZyb20gXCIke0tUWDIuU291cmNlVGV4dHVyZUZvcm1hdFtzcmNdfVwiIHRvIFwiJHtLVFgyLlRyYW5zY29kZVRhcmdldFtkc3RdfVwiIG5vdCBzdXBwb3J0ZWQgYnkgY3VycmVudCB0cmFuc2NvZGVyIGJ1aWxkLmBcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzcmMgPT09IEtUWDIuU291cmNlVGV4dHVyZUZvcm1hdC5FVEMxUykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNnZCA9IGt0eDJSZWFkZXIuc3VwZXJjb21wcmVzc2lvbkdsb2JhbERhdGE7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zY29kZXIuZGVjb2RlUGFsZXR0ZXMoc2dkLmVuZHBvaW50Q291bnQsIHNnZC5lbmRwb2ludHNEYXRhLCBzZ2Quc2VsZWN0b3JDb3VudCwgc2dkLnNlbGVjdG9yc0RhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zY29kZXIuZGVjb2RlVGFibGVzKHNnZC50YWJsZXNEYXRhKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLmZsYWdzID0gaW1hZ2VEZXNjIS5pbWFnZUZsYWdzO1xyXG4gICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby5yZ2JCeXRlT2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8ucmdiQnl0ZUxlbmd0aCA9IGltYWdlRGVzYyEucmdiU2xpY2VCeXRlTGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby5hbHBoYUJ5dGVPZmZzZXQgPSBpbWFnZURlc2MhLmFscGhhU2xpY2VCeXRlT2Zmc2V0ID4gMCA/IGltYWdlRGVzYyEucmdiU2xpY2VCeXRlTGVuZ3RoIDogMDtcclxuICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8uYWxwaGFCeXRlTGVuZ3RoID0gaW1hZ2VEZXNjIS5hbHBoYVNsaWNlQnl0ZUxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJhbnNjb2Rlci50cmFuc2NvZGVJbWFnZSh0YXJnZXRGb3JtYXQsIGVuY29kZWREYXRhLCBpbWFnZUluZm8sIDAsIGlzVmlkZW8pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8uZmxhZ3MgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby5yZ2JCeXRlT2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8ucmdiQnl0ZUxlbmd0aCA9IHVuY29tcHJlc3NlZEJ5dGVMZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLmFscGhhQnl0ZU9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLmFscGhhQnl0ZUxlbmd0aCA9IDA7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRyYW5zY29kZXIudHJhbnNjb2RlSW1hZ2UodGFyZ2V0Rm9ybWF0LCBlbmNvZGVkRGF0YSwgaW1hZ2VJbmZvLCAwLCBrdHgyUmVhZGVyLmhhc0FscGhhLCBpc1ZpZGVvKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgIGlmICh0cmFuc2NvZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2Rlci5kZWxldGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaW1hZ2VJbmZvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLmRlbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LnRyYW5zY29kZWRJbWFnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHR1cmVEYXRhID0gcmVzdWx0LnRyYW5zY29kZWRJbWFnZS5nZXRfdHlwZWRfbWVtb3J5X3ZpZXcoKS5zbGljZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC50cmFuc2NvZGVkSW1hZ2UuZGVsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlRGF0YTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8taW50ZXJuYWwtbW9kdWxlcyAqL1xyXG5leHBvcnQgKiBmcm9tIFwiLi9rdHgyRGVjb2RlclwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9rdHgyRmlsZVJlYWRlclwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi90cmFuc2NvZGVyXCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL3RyYW5zY29kZXJNYW5hZ2VyXCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL3dhc21NZW1vcnlNYW5hZ2VyXCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL3pzdGRkZWNcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vTWlzYy9pbmRleFwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9UcmFuc2NvZGVycy9pbmRleFwiO1xyXG4iLCIvKipcclxuICogUmVzb3VyY2VzIHVzZWQgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbjpcclxuICogIC0gM2pzIEtUWDIgbG9hZGVyOiBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzL2Jsb2IvZGZiNWMyM2NlMTI2ZWM4NDVlNGFhMjQwNTk5OTE1ZmVmNTM3NTc5Ny9leGFtcGxlcy9qc20vbG9hZGVycy9LVFgyTG9hZGVyLmpzXHJcbiAqICAtIFVuaXZlcnNhbCBUZXh0dXJlIFRyYW5zY29kZXJzOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1VuaXZlcnNhbC1UZXh0dXJlLVRyYW5zY29kZXJzXHJcbiAqICAtIEtUWDIgc3BlY2lmaWNhdGlvbjogaHR0cDovL2dpdGh1Yi5raHJvbm9zLm9yZy9LVFgtU3BlY2lmaWNhdGlvbi9cclxuICogIC0gS1RYMiBiaW5hcmllcyB0byBjb252ZXJ0IGZpbGVzOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL0tUWC1Tb2Z0d2FyZS9yZWxlYXNlc1xyXG4gKiAgLSBLVFggc3BlY2lmaWNhdGlvbjogaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvRGF0YUZvcm1hdC9zcGVjcy8xLjMvZGF0YWZvcm1hdC4xLjMuaHRtbFxyXG4gKiAgLSBLVFgtU29mdHdhcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvS1RYLVNvZnR3YXJlXHJcbiAqL1xyXG5pbXBvcnQgKiBhcyBLVFgyIGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9rdHgyZGVjb2RlclR5cGVzXCI7XHJcblxyXG5pbXBvcnQgdHlwZSB7IElLVFgyX0ltYWdlRGVzYyB9IGZyb20gXCIuL2t0eDJGaWxlUmVhZGVyXCI7XHJcbmltcG9ydCB7IEtUWDJGaWxlUmVhZGVyLCBTdXBlcmNvbXByZXNzaW9uU2NoZW1lIH0gZnJvbSBcIi4va3R4MkZpbGVSZWFkZXJcIjtcclxuaW1wb3J0IHsgVHJhbnNjb2Rlck1hbmFnZXIgfSBmcm9tIFwiLi90cmFuc2NvZGVyTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBMaXRlVHJhbnNjb2Rlcl9VQVNUQ19BU1RDIH0gZnJvbSBcIi4vVHJhbnNjb2RlcnMvbGl0ZVRyYW5zY29kZXJfVUFTVENfQVNUQ1wiO1xyXG5pbXBvcnQgeyBMaXRlVHJhbnNjb2Rlcl9VQVNUQ19CQzcgfSBmcm9tIFwiLi9UcmFuc2NvZGVycy9saXRlVHJhbnNjb2Rlcl9VQVNUQ19CQzdcIjtcclxuaW1wb3J0IHsgTGl0ZVRyYW5zY29kZXJfVUFTVENfUkdCQV9VTk9STSB9IGZyb20gXCIuL1RyYW5zY29kZXJzL2xpdGVUcmFuc2NvZGVyX1VBU1RDX1JHQkFfVU5PUk1cIjtcclxuaW1wb3J0IHsgTGl0ZVRyYW5zY29kZXJfVUFTVENfUkdCQV9TUkdCIH0gZnJvbSBcIi4vVHJhbnNjb2RlcnMvbGl0ZVRyYW5zY29kZXJfVUFTVENfUkdCQV9TUkdCXCI7XHJcbmltcG9ydCB7IExpdGVUcmFuc2NvZGVyX1VBU1RDX1I4X1VOT1JNIH0gZnJvbSBcIi4vVHJhbnNjb2RlcnMvbGl0ZVRyYW5zY29kZXJfVUFTVENfUjhfVU5PUk1cIjtcclxuaW1wb3J0IHsgTGl0ZVRyYW5zY29kZXJfVUFTVENfUkc4X1VOT1JNIH0gZnJvbSBcIi4vVHJhbnNjb2RlcnMvbGl0ZVRyYW5zY29kZXJfVUFTVENfUkc4X1VOT1JNXCI7XHJcbmltcG9ydCB7IE1TQ1RyYW5zY29kZXIgfSBmcm9tIFwiLi9UcmFuc2NvZGVycy9tc2NUcmFuc2NvZGVyXCI7XHJcbmltcG9ydCB7IFpTVEREZWNvZGVyIH0gZnJvbSBcIi4venN0ZGRlY1wiO1xyXG5pbXBvcnQgeyBUcmFuc2NvZGVEZWNpc2lvblRyZWUgfSBmcm9tIFwiLi90cmFuc2NvZGVEZWNpc2lvblRyZWVcIjtcclxuXHJcbmNvbnN0IGlzUG93ZXJPZlR3byA9ICh2YWx1ZTogbnVtYmVyKSA9PiB7XHJcbiAgICByZXR1cm4gKHZhbHVlICYgKHZhbHVlIC0gMSkpID09PSAwICYmIHZhbHVlICE9PSAwO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIGZvciBkZWNvZGluZyBLVFgyIGZpbGVzXHJcbiAqXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgS1RYMkRlY29kZXIge1xyXG4gICAgcHJpdmF0ZSBfdHJhbnNjb2Rlck1ncjogVHJhbnNjb2Rlck1hbmFnZXI7XHJcbiAgICBwcml2YXRlIF96c3RkRGVjb2RlcjogWlNURERlY29kZXI7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBEZWZhdWx0RGVjb2Rlck9wdGlvbnM6IEtUWDIuSUtUWDJEZWNvZGVyT3B0aW9ucyA9IHt9O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuX3RyYW5zY29kZXJNZ3IgPSBuZXcgVHJhbnNjb2Rlck1hbmFnZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVjb2RlKGRhdGE6IFVpbnQ4QXJyYXksIGNhcHM6IEtUWDIuSUNvbXByZXNzZWRGb3JtYXRDYXBhYmlsaXRpZXMsIG9wdGlvbnM/OiBLVFgyLklLVFgyRGVjb2Rlck9wdGlvbnMpOiBQcm9taXNlPEtUWDIuSURlY29kZWREYXRhPiB7XHJcbiAgICAgICAgY29uc3QgZmluYWxPcHRpb25zID0geyAuLi5vcHRpb25zLCAuLi5LVFgyRGVjb2Rlci5EZWZhdWx0RGVjb2Rlck9wdGlvbnMgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBrZnIgPSBuZXcgS1RYMkZpbGVSZWFkZXIoZGF0YSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWtmci5pc1ZhbGlkKCkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgS1QyIGZpbGU6IHdyb25nIHNpZ25hdHVyZVwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAga2ZyLnBhcnNlKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoa2ZyLm5lZWRaU1RERGVjb2Rlcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl96c3RkRGVjb2Rlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3pzdGREZWNvZGVyID0gbmV3IFpTVEREZWNvZGVyKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pzdGREZWNvZGVyLmluaXQoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVjb2RlRGF0YShrZnIsIGNhcHMsIGZpbmFsT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlY29kZURhdGEoa2ZyLCBjYXBzLCBmaW5hbE9wdGlvbnMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2RlY29kZURhdGEoa2ZyOiBLVFgyRmlsZVJlYWRlciwgY2FwczogS1RYMi5JQ29tcHJlc3NlZEZvcm1hdENhcGFiaWxpdGllcywgb3B0aW9ucz86IEtUWDIuSUtUWDJEZWNvZGVyT3B0aW9ucyk6IFByb21pc2U8S1RYMi5JRGVjb2RlZERhdGE+IHtcclxuICAgICAgICBjb25zdCB3aWR0aCA9IGtmci5oZWFkZXIucGl4ZWxXaWR0aDtcclxuICAgICAgICBjb25zdCBoZWlnaHQgPSBrZnIuaGVhZGVyLnBpeGVsSGVpZ2h0O1xyXG4gICAgICAgIGNvbnN0IHNyY1RleEZvcm1hdCA9IGtmci50ZXh0dXJlRm9ybWF0O1xyXG5cclxuICAgICAgICBjb25zdCBkZWNpc2lvblRyZWUgPSBuZXcgVHJhbnNjb2RlRGVjaXNpb25UcmVlKHNyY1RleEZvcm1hdCwga2ZyLmhhc0FscGhhLCBpc1Bvd2VyT2ZUd28od2lkdGgpICYmIGlzUG93ZXJPZlR3byhoZWlnaHQpLCBjYXBzLCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnM/LnRyYW5zY29kZUZvcm1hdERlY2lzaW9uVHJlZSkge1xyXG4gICAgICAgICAgICBkZWNpc2lvblRyZWUucGFyc2VUcmVlKG9wdGlvbnM/LnRyYW5zY29kZUZvcm1hdERlY2lzaW9uVHJlZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0cmFuc2NvZGVGb3JtYXQgPSBkZWNpc2lvblRyZWUudHJhbnNjb2RlRm9ybWF0O1xyXG4gICAgICAgIGNvbnN0IGVuZ2luZUZvcm1hdCA9IGRlY2lzaW9uVHJlZS5lbmdpbmVGb3JtYXQ7XHJcbiAgICAgICAgY29uc3Qgcm91bmRUb011bHRpcGxlNCA9IGRlY2lzaW9uVHJlZS5yb3VuZFRvTXVsdGlwbGU0O1xyXG5cclxuICAgICAgICBjb25zdCB0cmFuc2NvZGVyID0gdGhpcy5fdHJhbnNjb2Rlck1nci5maW5kVHJhbnNjb2RlcihzcmNUZXhGb3JtYXQsIHRyYW5zY29kZUZvcm1hdCwga2ZyLmlzSW5HYW1tYVNwYWNlLCBvcHRpb25zPy5ieXBhc3NUcmFuc2NvZGVycyk7XHJcblxyXG4gICAgICAgIGlmICh0cmFuc2NvZGVyID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICAgIGBubyB0cmFuc2NvZGVyIGZvdW5kIHRvIHRyYW5zY29kZSBzb3VyY2UgdGV4dHVyZSBmb3JtYXQgXCIke0tUWDIuU291cmNlVGV4dHVyZUZvcm1hdFtzcmNUZXhGb3JtYXRdfVwiIHRvIGZvcm1hdCBcIiR7S1RYMi5UcmFuc2NvZGVUYXJnZXRbdHJhbnNjb2RlRm9ybWF0XX1cImBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG1pcG1hcHM6IEFycmF5PEtUWDIuSU1pcG1hcD4gPSBbXTtcclxuICAgICAgICBjb25zdCBkYXRhUHJvbWlzZXM6IEFycmF5PFByb21pc2U8VWludDhBcnJheSB8IG51bGw+PiA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGRlY29kZWREYXRhOiBLVFgyLklEZWNvZGVkRGF0YSA9IHtcclxuICAgICAgICAgICAgd2lkdGg6IDAsXHJcbiAgICAgICAgICAgIGhlaWdodDogMCxcclxuICAgICAgICAgICAgdHJhbnNjb2RlZEZvcm1hdDogZW5naW5lRm9ybWF0LFxyXG4gICAgICAgICAgICBtaXBtYXBzLFxyXG4gICAgICAgICAgICBpc0luR2FtbWFTcGFjZToga2ZyLmlzSW5HYW1tYVNwYWNlLFxyXG4gICAgICAgICAgICBoYXNBbHBoYToga2ZyLmhhc0FscGhhLFxyXG4gICAgICAgICAgICB0cmFuc2NvZGVyTmFtZTogdHJhbnNjb2Rlci5nZXROYW1lKCksXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbGV0IGZpcnN0SW1hZ2VEZXNjSW5kZXggPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBsZXZlbCA9IDA7IGxldmVsIDwga2ZyLmhlYWRlci5sZXZlbENvdW50OyBsZXZlbCsrKSB7XHJcbiAgICAgICAgICAgIGlmIChsZXZlbCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGZpcnN0SW1hZ2VEZXNjSW5kZXggKz0gTWF0aC5tYXgoa2ZyLmhlYWRlci5sYXllckNvdW50LCAxKSAqIGtmci5oZWFkZXIuZmFjZUNvdW50ICogTWF0aC5tYXgoa2ZyLmhlYWRlci5waXhlbERlcHRoID4+IChsZXZlbCAtIDEpLCAxKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgbGV2ZWxXaWR0aCA9IE1hdGguZmxvb3Iod2lkdGggLyAoMSA8PCBsZXZlbCkpIHx8IDE7XHJcbiAgICAgICAgICAgIGNvbnN0IGxldmVsSGVpZ2h0ID0gTWF0aC5mbG9vcihoZWlnaHQgLyAoMSA8PCBsZXZlbCkpIHx8IDE7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBudW1JbWFnZXNJbkxldmVsID0ga2ZyLmhlYWRlci5mYWNlQ291bnQ7IC8vIG5vdGUgdGhhdCBjdWJlbWFwIGFyZSBub3Qgc3VwcG9ydGVkIHlldCAoc2VlIEtUWDJGaWxlUmVhZGVyKSwgc28gZmFjZUNvdW50ID09IDFcclxuICAgICAgICAgICAgY29uc3QgbGV2ZWxJbWFnZUJ5dGVMZW5ndGggPSAoKGxldmVsV2lkdGggKyAzKSA+PiAyKSAqICgobGV2ZWxIZWlnaHQgKyAzKSA+PiAyKSAqIGtmci5kZmRCbG9jay5ieXRlc1BsYW5lWzBdO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgbGV2ZWxVbmNvbXByZXNzZWRCeXRlTGVuZ3RoID0ga2ZyLmxldmVsc1tsZXZlbF0udW5jb21wcmVzc2VkQnl0ZUxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgIGxldCBsZXZlbERhdGFCdWZmZXIgPSBrZnIuZGF0YS5idWZmZXI7XHJcblxyXG4gICAgICAgICAgICBsZXQgbGV2ZWxEYXRhT2Zmc2V0ID0ga2ZyLmxldmVsc1tsZXZlbF0uYnl0ZU9mZnNldCArIGtmci5kYXRhLmJ5dGVPZmZzZXQ7XHJcbiAgICAgICAgICAgIGxldCBpbWFnZU9mZnNldEluTGV2ZWwgPSAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKGtmci5oZWFkZXIuc3VwZXJjb21wcmVzc2lvblNjaGVtZSA9PT0gU3VwZXJjb21wcmVzc2lvblNjaGVtZS5aU3RhbmRhcmQpIHtcclxuICAgICAgICAgICAgICAgIGxldmVsRGF0YUJ1ZmZlciA9IHRoaXMuX3pzdGREZWNvZGVyLmRlY29kZShuZXcgVWludDhBcnJheShsZXZlbERhdGFCdWZmZXIsIGxldmVsRGF0YU9mZnNldCwga2ZyLmxldmVsc1tsZXZlbF0uYnl0ZUxlbmd0aCksIGxldmVsVW5jb21wcmVzc2VkQnl0ZUxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICBsZXZlbERhdGFPZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobGV2ZWwgPT09IDApIHtcclxuICAgICAgICAgICAgICAgIGRlY29kZWREYXRhLndpZHRoID0gcm91bmRUb011bHRpcGxlNCA/IChsZXZlbFdpZHRoICsgMykgJiB+MyA6IGxldmVsV2lkdGg7XHJcbiAgICAgICAgICAgICAgICBkZWNvZGVkRGF0YS5oZWlnaHQgPSByb3VuZFRvTXVsdGlwbGU0ID8gKGxldmVsSGVpZ2h0ICsgMykgJiB+MyA6IGxldmVsSGVpZ2h0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpbWFnZUluZGV4ID0gMDsgaW1hZ2VJbmRleCA8IG51bUltYWdlc0luTGV2ZWw7IGltYWdlSW5kZXgrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGVuY29kZWREYXRhOiBVaW50OEFycmF5O1xyXG4gICAgICAgICAgICAgICAgbGV0IGltYWdlRGVzYzogSUtUWDJfSW1hZ2VEZXNjIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGtmci5oZWFkZXIuc3VwZXJjb21wcmVzc2lvblNjaGVtZSA9PT0gU3VwZXJjb21wcmVzc2lvblNjaGVtZS5CYXNpc0xaKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VEZXNjID0ga2ZyLnN1cGVyY29tcHJlc3Npb25HbG9iYWxEYXRhLmltYWdlRGVzY3MhW2ZpcnN0SW1hZ2VEZXNjSW5kZXggKyBpbWFnZUluZGV4XTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZW5jb2RlZERhdGEgPSBuZXcgVWludDhBcnJheShsZXZlbERhdGFCdWZmZXIsIGxldmVsRGF0YU9mZnNldCArIGltYWdlRGVzYy5yZ2JTbGljZUJ5dGVPZmZzZXQsIGltYWdlRGVzYy5yZ2JTbGljZUJ5dGVMZW5ndGggKyBpbWFnZURlc2MuYWxwaGFTbGljZUJ5dGVMZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmNvZGVkRGF0YSA9IG5ldyBVaW50OEFycmF5KGxldmVsRGF0YUJ1ZmZlciwgbGV2ZWxEYXRhT2Zmc2V0ICsgaW1hZ2VPZmZzZXRJbkxldmVsLCBsZXZlbEltYWdlQnl0ZUxlbmd0aCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGltYWdlT2Zmc2V0SW5MZXZlbCArPSBsZXZlbEltYWdlQnl0ZUxlbmd0aDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBtaXBtYXA6IEtUWDIuSU1pcG1hcCA9IHtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBsZXZlbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogbGV2ZWxIZWlnaHQsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zY29kZWREYXRhID0gdHJhbnNjb2RlclxyXG4gICAgICAgICAgICAgICAgICAgIC50cmFuc2NvZGUoc3JjVGV4Rm9ybWF0LCB0cmFuc2NvZGVGb3JtYXQsIGxldmVsLCBsZXZlbFdpZHRoLCBsZXZlbEhlaWdodCwgbGV2ZWxVbmNvbXByZXNzZWRCeXRlTGVuZ3RoLCBrZnIsIGltYWdlRGVzYywgZW5jb2RlZERhdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWlwbWFwLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWREYXRhLmVycm9ycyA9IGRlY29kZWREYXRhLmVycm9ycyA/PyBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkRGF0YS5lcnJvcnMgKz0gcmVhc29uICsgXCJcXG5cIiArIHJlYXNvbi5zdGFjayArIFwiXFxuXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGRhdGFQcm9taXNlcy5wdXNoKHRyYW5zY29kZWREYXRhKTtcclxuXHJcbiAgICAgICAgICAgICAgICBtaXBtYXBzLnB1c2gobWlwbWFwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGRhdGFQcm9taXNlcykudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBkZWNvZGVkRGF0YTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cclxuLy8gUHV0IGluIHRoZSBvcmRlciB5b3Ugd2FudCB0aGUgdHJhbnNjb2RlcnMgdG8gYmUgdXNlZCBpbiBwcmlvcml0eVxyXG5UcmFuc2NvZGVyTWFuYWdlci5SZWdpc3RlclRyYW5zY29kZXIoTGl0ZVRyYW5zY29kZXJfVUFTVENfQVNUQyk7XHJcblRyYW5zY29kZXJNYW5hZ2VyLlJlZ2lzdGVyVHJhbnNjb2RlcihMaXRlVHJhbnNjb2Rlcl9VQVNUQ19CQzcpO1xyXG5UcmFuc2NvZGVyTWFuYWdlci5SZWdpc3RlclRyYW5zY29kZXIoTGl0ZVRyYW5zY29kZXJfVUFTVENfUkdCQV9VTk9STSk7XHJcblRyYW5zY29kZXJNYW5hZ2VyLlJlZ2lzdGVyVHJhbnNjb2RlcihMaXRlVHJhbnNjb2Rlcl9VQVNUQ19SR0JBX1NSR0IpO1xyXG5UcmFuc2NvZGVyTWFuYWdlci5SZWdpc3RlclRyYW5zY29kZXIoTGl0ZVRyYW5zY29kZXJfVUFTVENfUjhfVU5PUk0pO1xyXG5UcmFuc2NvZGVyTWFuYWdlci5SZWdpc3RlclRyYW5zY29kZXIoTGl0ZVRyYW5zY29kZXJfVUFTVENfUkc4X1VOT1JNKTtcclxuVHJhbnNjb2Rlck1hbmFnZXIuUmVnaXN0ZXJUcmFuc2NvZGVyKE1TQ1RyYW5zY29kZXIpOyAvLyBjYXRjaCBhbGwgdHJhbnNjb2RlciAtIHdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGZvcm1hdCBjYW4ndCBiZSB0cmFuc2NvZGVkXHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xyXG5pbXBvcnQgKiBhcyBLVFgyIGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9rdHgyZGVjb2RlclR5cGVzXCI7XHJcblxyXG5pbXBvcnQgeyBEYXRhUmVhZGVyIH0gZnJvbSBcIi4vTWlzYy9kYXRhUmVhZGVyXCI7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBlbnVtIFN1cGVyY29tcHJlc3Npb25TY2hlbWUge1xyXG4gICAgTm9uZSA9IDAsXHJcbiAgICBCYXNpc0xaID0gMSxcclxuICAgIFpTdGFuZGFyZCA9IDIsXHJcbiAgICBaTGliID0gMyxcclxufVxyXG5cclxuY29uc3QgZW51bSBERkRNb2RlbCB7XHJcbiAgICBFVEMxUyA9IDE2MyxcclxuICAgIFVBU1RDID0gMTY2LFxyXG59XHJcblxyXG5jb25zdCBlbnVtIERGRENoYW5uZWxfRVRDMVMge1xyXG4gICAgUkdCID0gMCxcclxuICAgIFJSUiA9IDMsXHJcbiAgICBHR0cgPSA0LFxyXG4gICAgQUFBID0gMTUsXHJcbn1cclxuXHJcbmNvbnN0IGVudW0gREZEQ2hhbm5lbF9VQVNUQyB7XHJcbiAgICBSR0IgPSAwLFxyXG4gICAgUkdCQSA9IDMsXHJcbiAgICBSUlIgPSA0LFxyXG4gICAgUlJSRyA9IDUsXHJcbn1cclxuXHJcbmNvbnN0IGVudW0gREZEVHJhbnNmZXJGdW5jdGlvbiB7XHJcbiAgICBsaW5lYXIgPSAxLFxyXG4gICAgc1JHQiA9IDIsXHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGludGVyZmFjZSBJS1RYMl9IZWFkZXIge1xyXG4gICAgdmtGb3JtYXQ6IG51bWJlcjtcclxuICAgIHR5cGVTaXplOiBudW1iZXI7XHJcbiAgICBwaXhlbFdpZHRoOiBudW1iZXI7XHJcbiAgICBwaXhlbEhlaWdodDogbnVtYmVyO1xyXG4gICAgcGl4ZWxEZXB0aDogbnVtYmVyO1xyXG4gICAgbGF5ZXJDb3VudDogbnVtYmVyO1xyXG4gICAgZmFjZUNvdW50OiBudW1iZXI7XHJcbiAgICBsZXZlbENvdW50OiBudW1iZXI7XHJcbiAgICBzdXBlcmNvbXByZXNzaW9uU2NoZW1lOiBudW1iZXI7XHJcbiAgICBkZmRCeXRlT2Zmc2V0OiBudW1iZXI7XHJcbiAgICBkZmRCeXRlTGVuZ3RoOiBudW1iZXI7XHJcbiAgICBrdmRCeXRlT2Zmc2V0OiBudW1iZXI7XHJcbiAgICBrdmRCeXRlTGVuZ3RoOiBudW1iZXI7XHJcbiAgICBzZ2RCeXRlT2Zmc2V0OiBudW1iZXI7XHJcbiAgICBzZ2RCeXRlTGVuZ3RoOiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGludGVyZmFjZSBJS1RYMl9MZXZlbCB7XHJcbiAgICBieXRlT2Zmc2V0OiBudW1iZXI7XHJcbiAgICBieXRlTGVuZ3RoOiBudW1iZXI7XHJcbiAgICB1bmNvbXByZXNzZWRCeXRlTGVuZ3RoOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJS1RYMl9TYW1wbGUge1xyXG4gICAgYml0T2Zmc2V0OiBudW1iZXI7XHJcbiAgICBiaXRMZW5ndGg6IG51bWJlcjtcclxuICAgIGNoYW5uZWxUeXBlOiBudW1iZXI7XHJcbiAgICBjaGFubmVsRmxhZ3M6IG51bWJlcjtcclxuICAgIHNhbXBsZVBvc2l0aW9uOiBudW1iZXJbXTtcclxuICAgIHNhbXBsZUxvd2VyOiBudW1iZXI7XHJcbiAgICBzYW1wbGVVcHBlcjogbnVtYmVyO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUtUWDJfREZEIHtcclxuICAgIHZlbmRvcklkOiBudW1iZXI7XHJcbiAgICBkZXNjcmlwdG9yVHlwZTogbnVtYmVyO1xyXG4gICAgdmVyc2lvbk51bWJlcjogbnVtYmVyO1xyXG4gICAgZGVzY3JpcHRvckJsb2NrU2l6ZTogbnVtYmVyO1xyXG4gICAgY29sb3JNb2RlbDogbnVtYmVyO1xyXG4gICAgY29sb3JQcmltYXJpZXM6IG51bWJlcjtcclxuICAgIHRyYW5zZmVyRnVuY3Rpb246IG51bWJlcjtcclxuICAgIGZsYWdzOiBudW1iZXI7XHJcbiAgICB0ZXhlbEJsb2NrRGltZW5zaW9uOiB7XHJcbiAgICAgICAgeDogbnVtYmVyO1xyXG4gICAgICAgIHk6IG51bWJlcjtcclxuICAgICAgICB6OiBudW1iZXI7XHJcbiAgICAgICAgdzogbnVtYmVyO1xyXG4gICAgfTtcclxuICAgIGJ5dGVzUGxhbmU6IEFycmF5PG51bWJlcj47XHJcbiAgICBudW1TYW1wbGVzOiBudW1iZXI7XHJcbiAgICBzYW1wbGVzOiBBcnJheTxJS1RYMl9TYW1wbGU+O1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUtUWDJfSW1hZ2VEZXNjIHtcclxuICAgIGltYWdlRmxhZ3M6IG51bWJlcjtcclxuICAgIHJnYlNsaWNlQnl0ZU9mZnNldDogbnVtYmVyO1xyXG4gICAgcmdiU2xpY2VCeXRlTGVuZ3RoOiBudW1iZXI7XHJcbiAgICBhbHBoYVNsaWNlQnl0ZU9mZnNldDogbnVtYmVyO1xyXG4gICAgYWxwaGFTbGljZUJ5dGVMZW5ndGg6IG51bWJlcjtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElLVFgyX1N1cGVyY29tcHJlc3Npb25HbG9iYWxEYXRhIHtcclxuICAgIGVuZHBvaW50Q291bnQ/OiBudW1iZXI7XHJcbiAgICBzZWxlY3RvckNvdW50PzogbnVtYmVyO1xyXG4gICAgZW5kcG9pbnRzQnl0ZUxlbmd0aD86IG51bWJlcjtcclxuICAgIHNlbGVjdG9yc0J5dGVMZW5ndGg/OiBudW1iZXI7XHJcbiAgICB0YWJsZXNCeXRlTGVuZ3RoPzogbnVtYmVyO1xyXG4gICAgZXh0ZW5kZWRCeXRlTGVuZ3RoPzogbnVtYmVyO1xyXG4gICAgaW1hZ2VEZXNjcz86IEFycmF5PElLVFgyX0ltYWdlRGVzYz47XHJcbiAgICBlbmRwb2ludHNEYXRhPzogVWludDhBcnJheTtcclxuICAgIHNlbGVjdG9yc0RhdGE/OiBVaW50OEFycmF5O1xyXG4gICAgdGFibGVzRGF0YT86IFVpbnQ4QXJyYXk7XHJcbiAgICBleHRlbmRlZERhdGE/OiBVaW50OEFycmF5O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgS1RYMkZpbGVSZWFkZXIge1xyXG4gICAgcHJpdmF0ZSBfZGF0YTogVWludDhBcnJheTtcclxuICAgIHByaXZhdGUgX2hlYWRlcjogSUtUWDJfSGVhZGVyO1xyXG4gICAgcHJpdmF0ZSBfbGV2ZWxzOiBBcnJheTxJS1RYMl9MZXZlbD47XHJcbiAgICBwcml2YXRlIF9kZmRCbG9jazogSUtUWDJfREZEO1xyXG4gICAgcHJpdmF0ZSBfc3VwZXJjb21wcmVzc2lvbkdsb2JhbERhdGE6IElLVFgyX1N1cGVyY29tcHJlc3Npb25HbG9iYWxEYXRhO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGZpbGUgY2FuJ3QgYmUgcGFyc2VkXHJcbiAgICAgKiBAcGFyYW0gZGF0YVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBVaW50OEFycmF5KSB7XHJcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBkYXRhKCk6IFVpbnQ4QXJyYXkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaGVhZGVyKCk6IElLVFgyX0hlYWRlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWRlcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGxldmVscygpOiBBcnJheTxJS1RYMl9MZXZlbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sZXZlbHM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBkZmRCbG9jaygpOiBJS1RYMl9ERkQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZmRCbG9jaztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHN1cGVyY29tcHJlc3Npb25HbG9iYWxEYXRhKCk6IElLVFgyX1N1cGVyY29tcHJlc3Npb25HbG9iYWxEYXRhIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXJjb21wcmVzc2lvbkdsb2JhbERhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzVmFsaWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEtUWDJGaWxlUmVhZGVyLklzVmFsaWQodGhpcy5fZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHBhcnNlKCkge1xyXG4gICAgICAgIGxldCBvZmZzZXRJbkZpbGUgPSAxMjsgLy8gc2tpcCB0aGUgaGVhZGVyXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEdldCB0aGUgaGVhZGVyXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgaGRyUmVhZGVyID0gbmV3IERhdGFSZWFkZXIodGhpcy5fZGF0YSwgb2Zmc2V0SW5GaWxlLCAxNyAqIDQpO1xyXG5cclxuICAgICAgICBjb25zdCBoZWFkZXIgPSAodGhpcy5faGVhZGVyID0ge1xyXG4gICAgICAgICAgICB2a0Zvcm1hdDogaGRyUmVhZGVyLnJlYWRVaW50MzIoKSxcclxuICAgICAgICAgICAgdHlwZVNpemU6IGhkclJlYWRlci5yZWFkVWludDMyKCksXHJcbiAgICAgICAgICAgIHBpeGVsV2lkdGg6IGhkclJlYWRlci5yZWFkVWludDMyKCksXHJcbiAgICAgICAgICAgIHBpeGVsSGVpZ2h0OiBoZHJSZWFkZXIucmVhZFVpbnQzMigpLFxyXG4gICAgICAgICAgICBwaXhlbERlcHRoOiBoZHJSZWFkZXIucmVhZFVpbnQzMigpLFxyXG4gICAgICAgICAgICBsYXllckNvdW50OiBoZHJSZWFkZXIucmVhZFVpbnQzMigpLFxyXG4gICAgICAgICAgICBmYWNlQ291bnQ6IGhkclJlYWRlci5yZWFkVWludDMyKCksXHJcbiAgICAgICAgICAgIGxldmVsQ291bnQ6IGhkclJlYWRlci5yZWFkVWludDMyKCksXHJcbiAgICAgICAgICAgIHN1cGVyY29tcHJlc3Npb25TY2hlbWU6IGhkclJlYWRlci5yZWFkVWludDMyKCksXHJcblxyXG4gICAgICAgICAgICBkZmRCeXRlT2Zmc2V0OiBoZHJSZWFkZXIucmVhZFVpbnQzMigpLFxyXG4gICAgICAgICAgICBkZmRCeXRlTGVuZ3RoOiBoZHJSZWFkZXIucmVhZFVpbnQzMigpLFxyXG4gICAgICAgICAgICBrdmRCeXRlT2Zmc2V0OiBoZHJSZWFkZXIucmVhZFVpbnQzMigpLFxyXG4gICAgICAgICAgICBrdmRCeXRlTGVuZ3RoOiBoZHJSZWFkZXIucmVhZFVpbnQzMigpLFxyXG4gICAgICAgICAgICBzZ2RCeXRlT2Zmc2V0OiBoZHJSZWFkZXIucmVhZFVpbnQ2NCgpLFxyXG4gICAgICAgICAgICBzZ2RCeXRlTGVuZ3RoOiBoZHJSZWFkZXIucmVhZFVpbnQ2NCgpLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoaGVhZGVyLnBpeGVsRGVwdGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlIEtUWDIgZmlsZSAtIE9ubHkgMkQgdGV4dHVyZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuYCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaGVhZGVyLmxheWVyQ291bnQgPiAxKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlIEtUWDIgZmlsZSAtIEFycmF5IHRleHR1cmVzIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZC5gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChoZWFkZXIuZmFjZUNvdW50ID4gMSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSBLVFgyIGZpbGUgLSBDdWJlIHRleHR1cmVzIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZC5gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG9mZnNldEluRmlsZSArPSBoZHJSZWFkZXIuYnl0ZU9mZnNldDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogR2V0IHRoZSBsZXZlbHNcclxuICAgICAgICAgKi9cclxuICAgICAgICBsZXQgbGV2ZWxDb3VudCA9IE1hdGgubWF4KDEsIGhlYWRlci5sZXZlbENvdW50KTtcclxuXHJcbiAgICAgICAgY29uc3QgbGV2ZWxSZWFkZXIgPSBuZXcgRGF0YVJlYWRlcih0aGlzLl9kYXRhLCBvZmZzZXRJbkZpbGUsIGxldmVsQ291bnQgKiAzICogKDIgKiA0KSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxldmVsczogQXJyYXk8SUtUWDJfTGV2ZWw+ID0gKHRoaXMuX2xldmVscyA9IFtdKTtcclxuXHJcbiAgICAgICAgd2hpbGUgKGxldmVsQ291bnQtLSkge1xyXG4gICAgICAgICAgICBsZXZlbHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBieXRlT2Zmc2V0OiBsZXZlbFJlYWRlci5yZWFkVWludDY0KCksXHJcbiAgICAgICAgICAgICAgICBieXRlTGVuZ3RoOiBsZXZlbFJlYWRlci5yZWFkVWludDY0KCksXHJcbiAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWRCeXRlTGVuZ3RoOiBsZXZlbFJlYWRlci5yZWFkVWludDY0KCksXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgb2Zmc2V0SW5GaWxlICs9IGxldmVsUmVhZGVyLmJ5dGVPZmZzZXQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEdldCB0aGUgZGF0YSBmb3JtYXQgZGVzY3JpcHRvciAoREZEKSBibG9ja3NcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBkZmRSZWFkZXIgPSBuZXcgRGF0YVJlYWRlcih0aGlzLl9kYXRhLCBoZWFkZXIuZGZkQnl0ZU9mZnNldCwgaGVhZGVyLmRmZEJ5dGVMZW5ndGgpO1xyXG5cclxuICAgICAgICBjb25zdCBkZmRCbG9jayA9ICh0aGlzLl9kZmRCbG9jayA9IHtcclxuICAgICAgICAgICAgdmVuZG9ySWQ6IGRmZFJlYWRlci5za2lwQnl0ZXMoNCAvKiBza2lwIHRvdGFsU2l6ZSAqLykucmVhZFVpbnQxNigpLFxyXG4gICAgICAgICAgICBkZXNjcmlwdG9yVHlwZTogZGZkUmVhZGVyLnJlYWRVaW50MTYoKSxcclxuICAgICAgICAgICAgdmVyc2lvbk51bWJlcjogZGZkUmVhZGVyLnJlYWRVaW50MTYoKSxcclxuICAgICAgICAgICAgZGVzY3JpcHRvckJsb2NrU2l6ZTogZGZkUmVhZGVyLnJlYWRVaW50MTYoKSxcclxuICAgICAgICAgICAgY29sb3JNb2RlbDogZGZkUmVhZGVyLnJlYWRVaW50OCgpLFxyXG4gICAgICAgICAgICBjb2xvclByaW1hcmllczogZGZkUmVhZGVyLnJlYWRVaW50OCgpLFxyXG4gICAgICAgICAgICB0cmFuc2ZlckZ1bmN0aW9uOiBkZmRSZWFkZXIucmVhZFVpbnQ4KCksXHJcbiAgICAgICAgICAgIGZsYWdzOiBkZmRSZWFkZXIucmVhZFVpbnQ4KCksXHJcbiAgICAgICAgICAgIHRleGVsQmxvY2tEaW1lbnNpb246IHtcclxuICAgICAgICAgICAgICAgIHg6IGRmZFJlYWRlci5yZWFkVWludDgoKSArIDEsXHJcbiAgICAgICAgICAgICAgICB5OiBkZmRSZWFkZXIucmVhZFVpbnQ4KCkgKyAxLFxyXG4gICAgICAgICAgICAgICAgejogZGZkUmVhZGVyLnJlYWRVaW50OCgpICsgMSxcclxuICAgICAgICAgICAgICAgIHc6IGRmZFJlYWRlci5yZWFkVWludDgoKSArIDEsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGJ5dGVzUGxhbmU6IFtcclxuICAgICAgICAgICAgICAgIGRmZFJlYWRlci5yZWFkVWludDgoKSAvKiBieXRlc1BsYW5lMCAqLyxcclxuICAgICAgICAgICAgICAgIGRmZFJlYWRlci5yZWFkVWludDgoKSAvKiBieXRlc1BsYW5lMSAqLyxcclxuICAgICAgICAgICAgICAgIGRmZFJlYWRlci5yZWFkVWludDgoKSAvKiBieXRlc1BsYW5lMiAqLyxcclxuICAgICAgICAgICAgICAgIGRmZFJlYWRlci5yZWFkVWludDgoKSAvKiBieXRlc1BsYW5lMyAqLyxcclxuICAgICAgICAgICAgICAgIGRmZFJlYWRlci5yZWFkVWludDgoKSAvKiBieXRlc1BsYW5lNCAqLyxcclxuICAgICAgICAgICAgICAgIGRmZFJlYWRlci5yZWFkVWludDgoKSAvKiBieXRlc1BsYW5lNSAqLyxcclxuICAgICAgICAgICAgICAgIGRmZFJlYWRlci5yZWFkVWludDgoKSAvKiBieXRlc1BsYW5lNiAqLyxcclxuICAgICAgICAgICAgICAgIGRmZFJlYWRlci5yZWFkVWludDgoKSAvKiBieXRlc1BsYW5lNyAqLyxcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgbnVtU2FtcGxlczogMCxcclxuICAgICAgICAgICAgc2FtcGxlczogbmV3IEFycmF5PElLVFgyX1NhbXBsZT4oKSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZGZkQmxvY2subnVtU2FtcGxlcyA9IChkZmRCbG9jay5kZXNjcmlwdG9yQmxvY2tTaXplIC0gMjQpIC8gMTY7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGZkQmxvY2subnVtU2FtcGxlczsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNhbXBsZSA9IHtcclxuICAgICAgICAgICAgICAgIGJpdE9mZnNldDogZGZkUmVhZGVyLnJlYWRVaW50MTYoKSxcclxuICAgICAgICAgICAgICAgIGJpdExlbmd0aDogZGZkUmVhZGVyLnJlYWRVaW50OCgpICsgMSxcclxuICAgICAgICAgICAgICAgIGNoYW5uZWxUeXBlOiBkZmRSZWFkZXIucmVhZFVpbnQ4KCksXHJcbiAgICAgICAgICAgICAgICBjaGFubmVsRmxhZ3M6IDAsXHJcbiAgICAgICAgICAgICAgICBzYW1wbGVQb3NpdGlvbjogW1xyXG4gICAgICAgICAgICAgICAgICAgIGRmZFJlYWRlci5yZWFkVWludDgoKSAvKiBzYW1wbGVQb3NpdGlvbjAgKi8sXHJcbiAgICAgICAgICAgICAgICAgICAgZGZkUmVhZGVyLnJlYWRVaW50OCgpIC8qIHNhbXBsZVBvc2l0aW9uMSAqLyxcclxuICAgICAgICAgICAgICAgICAgICBkZmRSZWFkZXIucmVhZFVpbnQ4KCkgLyogc2FtcGxlUG9zaXRpb24yICovLFxyXG4gICAgICAgICAgICAgICAgICAgIGRmZFJlYWRlci5yZWFkVWludDgoKSAvKiBzYW1wbGVQb3NpdGlvbjMgKi8sXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgc2FtcGxlTG93ZXI6IGRmZFJlYWRlci5yZWFkVWludDMyKCksXHJcbiAgICAgICAgICAgICAgICBzYW1wbGVVcHBlcjogZGZkUmVhZGVyLnJlYWRVaW50MzIoKSxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHNhbXBsZS5jaGFubmVsRmxhZ3MgPSAoc2FtcGxlLmNoYW5uZWxUeXBlICYgMHhmMCkgPj4gNDtcclxuICAgICAgICAgICAgc2FtcGxlLmNoYW5uZWxUeXBlID0gc2FtcGxlLmNoYW5uZWxUeXBlICYgMHgwZjtcclxuXHJcbiAgICAgICAgICAgIGRmZEJsb2NrLnNhbXBsZXMucHVzaChzYW1wbGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogR2V0IHRoZSBTdXBlcmNvbXByZXNzaW9uIEdsb2JhbCBEYXRhIChzZ2QpXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3Qgc2dkOiBJS1RYMl9TdXBlcmNvbXByZXNzaW9uR2xvYmFsRGF0YSA9ICh0aGlzLl9zdXBlcmNvbXByZXNzaW9uR2xvYmFsRGF0YSA9IHt9KTtcclxuXHJcbiAgICAgICAgaWYgKGhlYWRlci5zZ2RCeXRlTGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBzZ2RSZWFkZXIgPSBuZXcgRGF0YVJlYWRlcih0aGlzLl9kYXRhLCBoZWFkZXIuc2dkQnl0ZU9mZnNldCwgaGVhZGVyLnNnZEJ5dGVMZW5ndGgpO1xyXG5cclxuICAgICAgICAgICAgc2dkLmVuZHBvaW50Q291bnQgPSBzZ2RSZWFkZXIucmVhZFVpbnQxNigpO1xyXG4gICAgICAgICAgICBzZ2Quc2VsZWN0b3JDb3VudCA9IHNnZFJlYWRlci5yZWFkVWludDE2KCk7XHJcbiAgICAgICAgICAgIHNnZC5lbmRwb2ludHNCeXRlTGVuZ3RoID0gc2dkUmVhZGVyLnJlYWRVaW50MzIoKTtcclxuICAgICAgICAgICAgc2dkLnNlbGVjdG9yc0J5dGVMZW5ndGggPSBzZ2RSZWFkZXIucmVhZFVpbnQzMigpO1xyXG4gICAgICAgICAgICBzZ2QudGFibGVzQnl0ZUxlbmd0aCA9IHNnZFJlYWRlci5yZWFkVWludDMyKCk7XHJcbiAgICAgICAgICAgIHNnZC5leHRlbmRlZEJ5dGVMZW5ndGggPSBzZ2RSZWFkZXIucmVhZFVpbnQzMigpO1xyXG4gICAgICAgICAgICBzZ2QuaW1hZ2VEZXNjcyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgaW1hZ2VDb3VudCA9IHRoaXMuX2dldEltYWdlQ291bnQoKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW1hZ2VDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBzZ2QuaW1hZ2VEZXNjcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBpbWFnZUZsYWdzOiBzZ2RSZWFkZXIucmVhZFVpbnQzMigpLFxyXG4gICAgICAgICAgICAgICAgICAgIHJnYlNsaWNlQnl0ZU9mZnNldDogc2dkUmVhZGVyLnJlYWRVaW50MzIoKSxcclxuICAgICAgICAgICAgICAgICAgICByZ2JTbGljZUJ5dGVMZW5ndGg6IHNnZFJlYWRlci5yZWFkVWludDMyKCksXHJcbiAgICAgICAgICAgICAgICAgICAgYWxwaGFTbGljZUJ5dGVPZmZzZXQ6IHNnZFJlYWRlci5yZWFkVWludDMyKCksXHJcbiAgICAgICAgICAgICAgICAgICAgYWxwaGFTbGljZUJ5dGVMZW5ndGg6IHNnZFJlYWRlci5yZWFkVWludDMyKCksXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgZW5kcG9pbnRzQnl0ZU9mZnNldCA9IGhlYWRlci5zZ2RCeXRlT2Zmc2V0ICsgc2dkUmVhZGVyLmJ5dGVPZmZzZXQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yc0J5dGVPZmZzZXQgPSBlbmRwb2ludHNCeXRlT2Zmc2V0ICsgc2dkLmVuZHBvaW50c0J5dGVMZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlc0J5dGVPZmZzZXQgPSBzZWxlY3RvcnNCeXRlT2Zmc2V0ICsgc2dkLnNlbGVjdG9yc0J5dGVMZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGV4dGVuZGVkQnl0ZU9mZnNldCA9IHRhYmxlc0J5dGVPZmZzZXQgKyBzZ2QudGFibGVzQnl0ZUxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgIHNnZC5lbmRwb2ludHNEYXRhID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fZGF0YS5idWZmZXIsIHRoaXMuX2RhdGEuYnl0ZU9mZnNldCArIGVuZHBvaW50c0J5dGVPZmZzZXQsIHNnZC5lbmRwb2ludHNCeXRlTGVuZ3RoKTtcclxuICAgICAgICAgICAgc2dkLnNlbGVjdG9yc0RhdGEgPSBuZXcgVWludDhBcnJheSh0aGlzLl9kYXRhLmJ1ZmZlciwgdGhpcy5fZGF0YS5ieXRlT2Zmc2V0ICsgc2VsZWN0b3JzQnl0ZU9mZnNldCwgc2dkLnNlbGVjdG9yc0J5dGVMZW5ndGgpO1xyXG4gICAgICAgICAgICBzZ2QudGFibGVzRGF0YSA9IG5ldyBVaW50OEFycmF5KHRoaXMuX2RhdGEuYnVmZmVyLCB0aGlzLl9kYXRhLmJ5dGVPZmZzZXQgKyB0YWJsZXNCeXRlT2Zmc2V0LCBzZ2QudGFibGVzQnl0ZUxlbmd0aCk7XHJcbiAgICAgICAgICAgIHNnZC5leHRlbmRlZERhdGEgPSBuZXcgVWludDhBcnJheSh0aGlzLl9kYXRhLmJ1ZmZlciwgdGhpcy5fZGF0YS5ieXRlT2Zmc2V0ICsgZXh0ZW5kZWRCeXRlT2Zmc2V0LCBzZ2QuZXh0ZW5kZWRCeXRlTGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZ2V0SW1hZ2VDb3VudCgpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBsYXllclBpeGVsRGVwdGggPSBNYXRoLm1heCh0aGlzLl9oZWFkZXIucGl4ZWxEZXB0aCwgMSk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLl9oZWFkZXIubGV2ZWxDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxheWVyUGl4ZWxEZXB0aCArPSBNYXRoLm1heCh0aGlzLl9oZWFkZXIucGl4ZWxEZXB0aCA+PiBpLCAxKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLl9oZWFkZXIubGF5ZXJDb3VudCwgMSkgKiB0aGlzLl9oZWFkZXIuZmFjZUNvdW50ICogbGF5ZXJQaXhlbERlcHRoO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGV4dHVyZUZvcm1hdCgpOiBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZmRCbG9jay5jb2xvck1vZGVsID09PSBERkRNb2RlbC5VQVNUQyA/IEtUWDIuU291cmNlVGV4dHVyZUZvcm1hdC5VQVNUQzR4NCA6IEtUWDIuU291cmNlVGV4dHVyZUZvcm1hdC5FVEMxUztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGhhc0FscGhhKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IHRmb3JtYXQgPSB0aGlzLnRleHR1cmVGb3JtYXQ7XHJcblxyXG4gICAgICAgIHN3aXRjaCAodGZvcm1hdCkge1xyXG4gICAgICAgICAgICBjYXNlIEtUWDIuU291cmNlVGV4dHVyZUZvcm1hdC5FVEMxUzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGZkQmxvY2subnVtU2FtcGxlcyA9PT0gMiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLl9kZmRCbG9jay5zYW1wbGVzWzBdLmNoYW5uZWxUeXBlID09PSBERkRDaGFubmVsX0VUQzFTLkFBQSB8fCB0aGlzLl9kZmRCbG9jay5zYW1wbGVzWzFdLmNoYW5uZWxUeXBlID09PSBERkRDaGFubmVsX0VUQzFTLkFBQSlcclxuICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBjYXNlIEtUWDIuU291cmNlVGV4dHVyZUZvcm1hdC5VQVNUQzR4NDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZmRCbG9jay5zYW1wbGVzWzBdLmNoYW5uZWxUeXBlID09PSBERkRDaGFubmVsX1VBU1RDLlJHQkE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBuZWVkWlNURERlY29kZXIoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWRlci5zdXBlcmNvbXByZXNzaW9uU2NoZW1lID09PSBTdXBlcmNvbXByZXNzaW9uU2NoZW1lLlpTdGFuZGFyZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGlzSW5HYW1tYVNwYWNlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZmRCbG9jay50cmFuc2ZlckZ1bmN0aW9uID09PSBERkRUcmFuc2ZlckZ1bmN0aW9uLnNSR0I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBJc1ZhbGlkKGRhdGE6IEFycmF5QnVmZmVyVmlldyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChkYXRhLmJ5dGVMZW5ndGggPj0gMTIpIHtcclxuICAgICAgICAgICAgLy8gJ8KrJywgJ0snLCAnVCcsICdYJywgJyAnLCAnMicsICcwJywgJ8K7JywgJ1xccicsICdcXG4nLCAnXFx4MUEnLCAnXFxuJ1xyXG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgMTIpO1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyWzBdID09PSAweGFiICYmXHJcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyWzFdID09PSAweDRiICYmXHJcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyWzJdID09PSAweDU0ICYmXHJcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyWzNdID09PSAweDU4ICYmXHJcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyWzRdID09PSAweDIwICYmXHJcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyWzVdID09PSAweDMyICYmXHJcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyWzZdID09PSAweDMwICYmXHJcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyWzddID09PSAweGJiICYmXHJcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyWzhdID09PSAweDBkICYmXHJcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyWzldID09PSAweDBhICYmXHJcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyWzEwXSA9PT0gMHgxYSAmJlxyXG4gICAgICAgICAgICAgICAgaWRlbnRpZmllclsxMV0gPT09IDB4MGFcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG59XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1pbnRlcm5hbC1tb2R1bGVzICovXHJcbmltcG9ydCB7IEtUWDJEZWNvZGVyIH0gZnJvbSBcIi4uL2luZGV4XCI7XHJcblxyXG5jb25zdCBnbG9iYWxPYmplY3QgPSB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHVuZGVmaW5lZDtcclxuaWYgKHR5cGVvZiBnbG9iYWxPYmplY3QgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICg8YW55Pmdsb2JhbE9iamVjdCkuS1RYMkRFQ09ERVIgPSBLVFgyRGVjb2RlcjtcclxufVxyXG5cclxuZXhwb3J0ICogZnJvbSBcIi4uL2luZGV4XCI7XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xyXG5pbXBvcnQgKiBhcyBLVFgyIGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9rdHgyZGVjb2RlclR5cGVzXCI7XHJcblxyXG5jb25zdCBEZWNpc2lvblRyZWU6IEtUWDIuSURlY2lzaW9uVHJlZSA9IHtcclxuICAgIEVUQzFTOiB7XHJcbiAgICAgICAgb3B0aW9uOiBcImZvcmNlUkdCQVwiLFxyXG4gICAgICAgIHllczoge1xyXG4gICAgICAgICAgICB0cmFuc2NvZGVGb3JtYXQ6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LlJHQkEzMixcclxuICAgICAgICAgICAgZW5naW5lRm9ybWF0OiBLVFgyLkVuZ2luZUZvcm1hdC5SR0JBOEZvcm1hdCxcclxuICAgICAgICAgICAgcm91bmRUb011bHRpcGxlNDogZmFsc2UsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBubzoge1xyXG4gICAgICAgICAgICBjYXA6IFwiZXRjMlwiLFxyXG4gICAgICAgICAgICB5ZXM6IHtcclxuICAgICAgICAgICAgICAgIGFscGhhOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgeWVzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2RlRm9ybWF0OiBLVFgyLlRyYW5zY29kZVRhcmdldC5FVEMyX1JHQkEsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5naW5lRm9ybWF0OiBLVFgyLkVuZ2luZUZvcm1hdC5DT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG5vOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2RlRm9ybWF0OiBLVFgyLlRyYW5zY29kZVRhcmdldC5FVEMxX1JHQixcclxuICAgICAgICAgICAgICAgICAgICBlbmdpbmVGb3JtYXQ6IEtUWDIuRW5naW5lRm9ybWF0LkNPTVBSRVNTRURfUkdCOF9FVEMyLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbm86IHtcclxuICAgICAgICAgICAgICAgIGNhcDogXCJldGMxXCIsXHJcbiAgICAgICAgICAgICAgICBhbHBoYTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB5ZXM6IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2NvZGVGb3JtYXQ6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LkVUQzFfUkdCLFxyXG4gICAgICAgICAgICAgICAgICAgIGVuZ2luZUZvcm1hdDogS1RYMi5FbmdpbmVGb3JtYXQuQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTCxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBubzoge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhcDogXCJicHRjXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgeWVzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zY29kZUZvcm1hdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQuQkM3X1JHQkEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZUZvcm1hdDogS1RYMi5FbmdpbmVGb3JtYXQuQ09NUFJFU1NFRF9SR0JBX0JQVENfVU5PUk1fRVhULFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgbm86IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FwOiBcInMzdGNcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgeWVzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zY29kZUZvcm1hdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQuQkMzX1JHQkEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lRm9ybWF0OiBLVFgyLkVuZ2luZUZvcm1hdC5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBubzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zY29kZUZvcm1hdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQuQkMxX1JHQixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmVGb3JtYXQ6IEtUWDIuRW5naW5lRm9ybWF0LkNPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBubzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwOiBcInB2cnRjXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkc1Bvd2VyT2ZUd286IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2RlRm9ybWF0OiBLVFgyLlRyYW5zY29kZVRhcmdldC5QVlJUQzFfNF9SR0JBLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmVGb3JtYXQ6IEtUWDIuRW5naW5lRm9ybWF0LkNPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm86IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2RlRm9ybWF0OiBLVFgyLlRyYW5zY29kZVRhcmdldC5QVlJUQzFfNF9SR0IsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZUZvcm1hdDogS1RYMi5FbmdpbmVGb3JtYXQuQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2RlRm9ybWF0OiBLVFgyLlRyYW5zY29kZVRhcmdldC5SR0JBMzIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lRm9ybWF0OiBLVFgyLkVuZ2luZUZvcm1hdC5SR0JBOEZvcm1hdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZFRvTXVsdGlwbGU0OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgIH0sXHJcblxyXG4gICAgVUFTVEM6IHtcclxuICAgICAgICBvcHRpb246IFwiZm9yY2VSR0JBXCIsXHJcbiAgICAgICAgeWVzOiB7XHJcbiAgICAgICAgICAgIHRyYW5zY29kZUZvcm1hdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQuUkdCQTMyLFxyXG4gICAgICAgICAgICBlbmdpbmVGb3JtYXQ6IEtUWDIuRW5naW5lRm9ybWF0LlJHQkE4Rm9ybWF0LFxyXG4gICAgICAgICAgICByb3VuZFRvTXVsdGlwbGU0OiBmYWxzZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIG5vOiB7XHJcbiAgICAgICAgICAgIG9wdGlvbjogXCJmb3JjZVI4XCIsXHJcbiAgICAgICAgICAgIHllczoge1xyXG4gICAgICAgICAgICAgICAgdHJhbnNjb2RlRm9ybWF0OiBLVFgyLlRyYW5zY29kZVRhcmdldC5SOCxcclxuICAgICAgICAgICAgICAgIGVuZ2luZUZvcm1hdDogS1RYMi5FbmdpbmVGb3JtYXQuUjhGb3JtYXQsXHJcbiAgICAgICAgICAgICAgICByb3VuZFRvTXVsdGlwbGU0OiBmYWxzZSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbm86IHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbjogXCJmb3JjZVJHOFwiLFxyXG4gICAgICAgICAgICAgICAgeWVzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2RlRm9ybWF0OiBLVFgyLlRyYW5zY29kZVRhcmdldC5SRzgsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5naW5lRm9ybWF0OiBLVFgyLkVuZ2luZUZvcm1hdC5SRzhGb3JtYXQsXHJcbiAgICAgICAgICAgICAgICAgICAgcm91bmRUb011bHRpcGxlNDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgbm86IHtcclxuICAgICAgICAgICAgICAgICAgICBjYXA6IFwiYXN0Y1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIHllczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2NvZGVGb3JtYXQ6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LkFTVENfNFg0X1JHQkEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZUZvcm1hdDogS1RYMi5FbmdpbmVGb3JtYXQuQ09NUFJFU1NFRF9SR0JBX0FTVENfNFg0X0tIUixcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIG5vOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcDogXCJicHRjXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHllczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2RlRm9ybWF0OiBLVFgyLlRyYW5zY29kZVRhcmdldC5CQzdfUkdCQSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZUZvcm1hdDogS1RYMi5FbmdpbmVGb3JtYXQuQ09NUFJFU1NFRF9SR0JBX0JQVENfVU5PUk1fRVhULFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBubzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uOiBcInVzZVJHQkFJZkFTVENCQzdOb3RBdmFpbGFibGVXaGVuVUFTVENcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zY29kZUZvcm1hdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQuUkdCQTMyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZUZvcm1hdDogS1RYMi5FbmdpbmVGb3JtYXQuUkdCQThGb3JtYXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRUb011bHRpcGxlNDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm86IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXA6IFwiZXRjMlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2NvZGVGb3JtYXQ6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LkVUQzJfUkdCQSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZUZvcm1hdDogS1RYMi5FbmdpbmVGb3JtYXQuQ09NUFJFU1NFRF9SR0JBOF9FVEMyX0VBQyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm86IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zY29kZUZvcm1hdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQuRVRDMV9SR0IsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmVGb3JtYXQ6IEtUWDIuRW5naW5lRm9ybWF0LkNPTVBSRVNTRURfUkdCOF9FVEMyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm86IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwOiBcImV0YzFcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2NvZGVGb3JtYXQ6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LkVUQzFfUkdCLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lRm9ybWF0OiBLVFgyLkVuZ2luZUZvcm1hdC5DT01QUkVTU0VEX1JHQl9FVEMxX1dFQkdMLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwOiBcInMzdGNcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2NvZGVGb3JtYXQ6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LkJDM19SR0JBLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmVGb3JtYXQ6IEtUWDIuRW5naW5lRm9ybWF0LkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhULFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm86IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2RlRm9ybWF0OiBLVFgyLlRyYW5zY29kZVRhcmdldC5CQzFfUkdCLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmVGb3JtYXQ6IEtUWDIuRW5naW5lRm9ybWF0LkNPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcDogXCJwdnJ0Y1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzUG93ZXJPZlR3bzogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGE6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2RlRm9ybWF0OiBLVFgyLlRyYW5zY29kZVRhcmdldC5QVlJUQzFfNF9SR0JBLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lRm9ybWF0OiBLVFgyLkVuZ2luZUZvcm1hdC5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm86IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zY29kZUZvcm1hdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQuUFZSVEMxXzRfUkdCLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lRm9ybWF0OiBLVFgyLkVuZ2luZUZvcm1hdC5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm86IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2RlRm9ybWF0OiBLVFgyLlRyYW5zY29kZVRhcmdldC5SR0JBMzIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZUZvcm1hdDogS1RYMi5FbmdpbmVGb3JtYXQuUkdCQThGb3JtYXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kVG9NdWx0aXBsZTQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICB9LFxyXG59O1xyXG5cclxuZXhwb3J0IGNsYXNzIFRyYW5zY29kZURlY2lzaW9uVHJlZSB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBfSXNMZWFmTm9kZShub2RlOiBLVFgyLklOb2RlIHwgS1RYMi5JTGVhZik6IG5vZGUgaXMgS1RYMi5JTGVhZiB7XHJcbiAgICAgICAgcmV0dXJuIChub2RlIGFzIEtUWDIuSUxlYWYpLmVuZ2luZUZvcm1hdCAhPT0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3RleHR1cmVGb3JtYXQ6IEtUWDIuU291cmNlVGV4dHVyZUZvcm1hdDtcclxuICAgIHByaXZhdGUgX2hhc0FscGhhOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfaXNQb3dlck9mVHdvOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfY2FwczogS1RYMi5JQ29tcHJlc3NlZEZvcm1hdENhcGFiaWxpdGllcztcclxuICAgIHByaXZhdGUgX29wdGlvbnM6IEtUWDIuSUtUWDJEZWNvZGVyT3B0aW9ucztcclxuICAgIHByaXZhdGUgX3RyYW5zY29kZUZvcm1hdDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfZW5naW5lRm9ybWF0OiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9yb3VuZFRvTXVsdGlwbGU0OiBib29sZWFuO1xyXG5cclxuICAgIHB1YmxpYyBnZXQgdHJhbnNjb2RlRm9ybWF0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2NvZGVGb3JtYXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBlbmdpbmVGb3JtYXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VuZ2luZUZvcm1hdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHJvdW5kVG9NdWx0aXBsZTQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvdW5kVG9NdWx0aXBsZTQ7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IodGV4dHVyZUZvcm1hdDogS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LCBoYXNBbHBoYTogYm9vbGVhbiwgaXNQb3dlck9mVHdvOiBib29sZWFuLCBjYXBzOiBLVFgyLklDb21wcmVzc2VkRm9ybWF0Q2FwYWJpbGl0aWVzLCBvcHRpb25zPzogS1RYMi5JS1RYMkRlY29kZXJPcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5fdGV4dHVyZUZvcm1hdCA9IHRleHR1cmVGb3JtYXQ7XHJcbiAgICAgICAgdGhpcy5faGFzQWxwaGEgPSBoYXNBbHBoYTtcclxuICAgICAgICB0aGlzLl9pc1Bvd2VyT2ZUd28gPSBpc1Bvd2VyT2ZUd287XHJcbiAgICAgICAgdGhpcy5fY2FwcyA9IGNhcHM7XHJcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnMgPz8ge307XHJcblxyXG4gICAgICAgIHRoaXMucGFyc2VUcmVlKERlY2lzaW9uVHJlZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHBhcnNlVHJlZSh0cmVlOiBLVFgyLklEZWNpc2lvblRyZWUpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5fdGV4dHVyZUZvcm1hdCA9PT0gS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LlVBU1RDNHg0ID8gdHJlZS5VQVNUQyA6IHRyZWUuRVRDMVM7XHJcbiAgICAgICAgaWYgKG5vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fcGFyc2VOb2RlKG5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbm9kZSAhPT0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3BhcnNlTm9kZShub2RlOiBLVFgyLklOb2RlIHwgS1RYMi5JTGVhZiB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghbm9kZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoVHJhbnNjb2RlRGVjaXNpb25UcmVlLl9Jc0xlYWZOb2RlKG5vZGUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zY29kZUZvcm1hdCA9IG5vZGUudHJhbnNjb2RlRm9ybWF0O1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdpbmVGb3JtYXQgPSBub2RlLmVuZ2luZUZvcm1hdDtcclxuICAgICAgICAgICAgdGhpcy5fcm91bmRUb011bHRpcGxlNCA9IG5vZGUucm91bmRUb011bHRpcGxlNCA/PyB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBjb25kaXRpb24gPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKG5vZGUuY2FwICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbiAmJiAhIXRoaXMuX2NhcHNbbm9kZS5jYXAgYXMga2V5b2YgdHlwZW9mIHRoaXMuX2NhcHNdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChub2RlLm9wdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25kaXRpb24gPSBjb25kaXRpb24gJiYgISF0aGlzLl9vcHRpb25zW25vZGUub3B0aW9uIGFzIGtleW9mIHR5cGVvZiB0aGlzLl9vcHRpb25zXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobm9kZS5hbHBoYSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25kaXRpb24gPSBjb25kaXRpb24gJiYgdGhpcy5faGFzQWxwaGEgPT09IG5vZGUuYWxwaGE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG5vZGUubmVlZHNQb3dlck9mVHdvICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbiAmJiB0aGlzLl9pc1Bvd2VyT2ZUd28gPT09IG5vZGUubmVlZHNQb3dlck9mVHdvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChub2RlLnRyYW5zY29kZUZvcm1hdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlLnRyYW5zY29kZUZvcm1hdCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gPSBjb25kaXRpb24gJiYgbm9kZS50cmFuc2NvZGVGb3JtYXQuaW5kZXhPZih0aGlzLl90cmFuc2NvZGVGb3JtYXQpICE9PSAtMTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uICYmIG5vZGUudHJhbnNjb2RlRm9ybWF0ID09PSB0aGlzLl90cmFuc2NvZGVGb3JtYXQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3BhcnNlTm9kZShjb25kaXRpb24gPyBub2RlLnllcyEgOiBub2RlLm5vISk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24gKi9cclxuaW1wb3J0IHR5cGUgKiBhcyBLVFgyIGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9rdHgyZGVjb2RlclR5cGVzXCI7XHJcblxyXG5pbXBvcnQgdHlwZSB7IFdBU01NZW1vcnlNYW5hZ2VyIH0gZnJvbSBcIi4vd2FzbU1lbW9yeU1hbmFnZXJcIjtcclxuaW1wb3J0IHR5cGUgeyBLVFgyRmlsZVJlYWRlciwgSUtUWDJfSW1hZ2VEZXNjIH0gZnJvbSBcIi4va3R4MkZpbGVSZWFkZXJcIjtcclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBjbGFzcyBUcmFuc2NvZGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgQ2FuVHJhbnNjb2RlKHNyYzogS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LCBkc3Q6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LCBpc0luR2FtbWFTcGFjZTogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIE5hbWUgPSBcIlRyYW5zY29kZXJcIjtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFdhc21CYXNlVXJsID0gXCJcIjtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIEdldFdhc21Vcmwod2FzbVVybDogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKFRyYW5zY29kZXIuV2FzbUJhc2VVcmwgJiYgd2FzbVVybC5zdGFydHNXaXRoKFwiaHR0cHM6Ly9jZG4uYmFieWxvbmpzLmNvbS9cIikpIHtcclxuICAgICAgICAgICAgd2FzbVVybCA9IHdhc21VcmwucmVwbGFjZShcImh0dHBzOi8vY2RuLmJhYnlsb25qcy5jb20vXCIsIFRyYW5zY29kZXIuV2FzbUJhc2VVcmwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gd2FzbVVybDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBUcmFuc2NvZGVyLk5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXRpYWxpemUoKTogdm9pZCB7fVxyXG5cclxuICAgIHB1YmxpYyBuZWVkTWVtb3J5TWFuYWdlcigpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldE1lbW9yeU1hbmFnZXIobWVtb3J5TWdyOiBXQVNNTWVtb3J5TWFuYWdlcik6IHZvaWQge31cclxuXHJcbiAgICBwdWJsaWMgdHJhbnNjb2RlKFxyXG4gICAgICAgIHNyYzogS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LFxyXG4gICAgICAgIGRzdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQsXHJcbiAgICAgICAgbGV2ZWw6IG51bWJlcixcclxuICAgICAgICB3aWR0aDogbnVtYmVyLFxyXG4gICAgICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgICAgIHVuY29tcHJlc3NlZEJ5dGVMZW5ndGg6IG51bWJlcixcclxuICAgICAgICBrdHgyUmVhZGVyOiBLVFgyRmlsZVJlYWRlcixcclxuICAgICAgICBpbWFnZURlc2M6IElLVFgyX0ltYWdlRGVzYyB8IG51bGwsXHJcbiAgICAgICAgZW5jb2RlZERhdGE6IFVpbnQ4QXJyYXlcclxuICAgICk6IFByb21pc2U8VWludDhBcnJheSB8IG51bGw+IHtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCAqIGFzIEtUWDIgZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL2t0eDJkZWNvZGVyVHlwZXNcIjtcclxuXHJcbmltcG9ydCB0eXBlIHsgVHJhbnNjb2RlciB9IGZyb20gXCIuL3RyYW5zY29kZXJcIjtcclxuaW1wb3J0IHsgV0FTTU1lbW9yeU1hbmFnZXIgfSBmcm9tIFwiLi93YXNtTWVtb3J5TWFuYWdlclwiO1xyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRyYW5zY29kZXJNYW5hZ2VyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgX1RyYW5zY29kZXJzOiBBcnJheTx0eXBlb2YgVHJhbnNjb2Rlcj4gPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFJlZ2lzdGVyVHJhbnNjb2Rlcih0cmFuc2NvZGVyOiB0eXBlb2YgVHJhbnNjb2Rlcikge1xyXG4gICAgICAgIFRyYW5zY29kZXJNYW5hZ2VyLl9UcmFuc2NvZGVycy5wdXNoKHRyYW5zY29kZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIF9UcmFuc2NvZGVySW5zdGFuY2VzOiB7IFtrZXk6IHN0cmluZ106IEFycmF5PFRyYW5zY29kZXI+IH0gPSB7fTtcclxuXHJcbiAgICBwcml2YXRlIF93YXNtTWVtb3J5TWFuYWdlcjogV0FTTU1lbW9yeU1hbmFnZXI7XHJcblxyXG4gICAgcHVibGljIGZpbmRUcmFuc2NvZGVyKHNyYzogS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LCBkc3Q6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LCBpc0luR2FtbWFTcGFjZTogYm9vbGVhbiwgYnlwYXNzPzogc3RyaW5nW10pOiBUcmFuc2NvZGVyIHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IHRyYW5zY29kZXI6IFRyYW5zY29kZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAgICAgY29uc3Qga2V5ID0gS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0W3NyY10gKyBcIl9cIiArIEtUWDIuVHJhbnNjb2RlVGFyZ2V0W2RzdF07XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgVHJhbnNjb2Rlck1hbmFnZXIuX1RyYW5zY29kZXJzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgICAgIGlmIChUcmFuc2NvZGVyTWFuYWdlci5fVHJhbnNjb2RlcnNbaV0uQ2FuVHJhbnNjb2RlKHNyYywgZHN0LCBpc0luR2FtbWFTcGFjZSkgJiYgKCFieXBhc3MgfHwgYnlwYXNzLmluZGV4T2YoVHJhbnNjb2Rlck1hbmFnZXIuX1RyYW5zY29kZXJzW2ldLk5hbWUpIDwgMCkpIHtcclxuICAgICAgICAgICAgICAgIHRyYW5zY29kZXIgPSB0aGlzLl9nZXRFeGlzdGluZ1RyYW5zY29kZXIoa2V5LCBUcmFuc2NvZGVyTWFuYWdlci5fVHJhbnNjb2RlcnNbaV0uTmFtZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRyYW5zY29kZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2NvZGVyID0gbmV3IFRyYW5zY29kZXJNYW5hZ2VyLl9UcmFuc2NvZGVyc1tpXSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zY29kZXIhLmluaXRpYWxpemUoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNjb2RlciEubmVlZE1lbW9yeU1hbmFnZXIoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3dhc21NZW1vcnlNYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl93YXNtTWVtb3J5TWFuYWdlciA9IG5ldyBXQVNNTWVtb3J5TWFuYWdlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zY29kZXIhLnNldE1lbW9yeU1hbmFnZXIodGhpcy5fd2FzbU1lbW9yeU1hbmFnZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIVRyYW5zY29kZXJNYW5hZ2VyLl9UcmFuc2NvZGVySW5zdGFuY2VzW2tleV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNjb2Rlck1hbmFnZXIuX1RyYW5zY29kZXJJbnN0YW5jZXNba2V5XSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBUcmFuc2NvZGVyTWFuYWdlci5fVHJhbnNjb2Rlckluc3RhbmNlc1trZXldLnB1c2godHJhbnNjb2Rlcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRyYW5zY29kZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZ2V0RXhpc3RpbmdUcmFuc2NvZGVyKGtleTogc3RyaW5nLCB0cmFuc2NvZGVyTmFtZTogc3RyaW5nKTogVHJhbnNjb2RlciB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IHRyYW5zY29kZXJzID0gVHJhbnNjb2Rlck1hbmFnZXIuX1RyYW5zY29kZXJJbnN0YW5jZXNba2V5XTtcclxuXHJcbiAgICAgICAgaWYgKHRyYW5zY29kZXJzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgdHJhbnNjb2RlcnMubGVuZ3RoOyArK3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zY29kZXIgPSB0cmFuc2NvZGVyc1t0XTtcclxuICAgICAgICAgICAgICAgIGlmICh0cmFuc2NvZGVyTmFtZSA9PT0gdHJhbnNjb2Rlci5nZXROYW1lKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNjb2RlcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cclxuIiwiZGVjbGFyZSBmdW5jdGlvbiBwb3N0TWVzc2FnZShtZXNzYWdlOiBhbnksIHRyYW5zZmVyPzogYW55W10pOiB2b2lkO1xyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFdBU01NZW1vcnlNYW5hZ2VyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgTG9hZEJpbmFyaWVzRnJvbUN1cnJlbnRUaHJlYWQgPSB0cnVlO1xyXG4gICAgcHVibGljIHN0YXRpYyBJbml0aWFsTWVtb3J5UGFnZXMgPSAoMSAqIDEwMjQgKiAxMDI0KSA+PiAxNjsgLy8gMSBNYnl0ZXNcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBfUmVxdWVzdElkID0gMDtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIExvYWRXQVNNKHBhdGg6IHN0cmluZyk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcclxuICAgICAgICBpZiAodGhpcy5Mb2FkQmluYXJpZXNGcm9tQ3VycmVudFRocmVhZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZmV0Y2gocGF0aClcclxuICAgICAgICAgICAgICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmZXRjaCB0aGUgd2FzbSBjb21wb25lbnQgZnJvbSBcIiR7cGF0aH1cIjogJHtyZXNwb25zZS5zdGF0dXN9IC0gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHdhc21CaW5hcnkpID0+IHJlc29sdmUod2FzbUJpbmFyeSkpXHJcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLl9SZXF1ZXN0SWQrKztcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdhc21Mb2FkZWRIYW5kbGVyID0gKG1zZzogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAobXNnLmRhdGEuYWN0aW9uID09PSBcIndhc21Mb2FkZWRcIiAmJiBtc2cuZGF0YS5pZCA9PT0gaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHdhc21Mb2FkZWRIYW5kbGVyKTtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG1zZy5kYXRhLndhc21CaW5hcnkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB3YXNtTG9hZGVkSGFuZGxlcik7XHJcblxyXG4gICAgICAgICAgICBwb3N0TWVzc2FnZSh7IGFjdGlvbjogXCJsb2FkV0FTTVwiLCBwYXRoOiBwYXRoLCBpZDogaWQgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbWVtb3J5OiBXZWJBc3NlbWJseS5NZW1vcnk7XHJcbiAgICBwcml2YXRlIF9udW1QYWdlczogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfbWVtb3J5VmlldzogVWludDhBcnJheTtcclxuICAgIHByaXZhdGUgX21lbW9yeVZpZXdCeXRlTGVuZ3RoOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9tZW1vcnlWaWV3T2Zmc2V0OiBudW1iZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaW5pdGlhbE1lbW9yeVBhZ2VzOiBudW1iZXIgPSBXQVNNTWVtb3J5TWFuYWdlci5Jbml0aWFsTWVtb3J5UGFnZXMpIHtcclxuICAgICAgICB0aGlzLl9udW1QYWdlcyA9IGluaXRpYWxNZW1vcnlQYWdlcztcclxuXHJcbiAgICAgICAgdGhpcy5fbWVtb3J5ID0gbmV3IFdlYkFzc2VtYmx5Lk1lbW9yeSh7IGluaXRpYWw6IHRoaXMuX251bVBhZ2VzIH0pO1xyXG4gICAgICAgIHRoaXMuX21lbW9yeVZpZXdCeXRlTGVuZ3RoID0gdGhpcy5fbnVtUGFnZXMgPDwgMTY7XHJcbiAgICAgICAgdGhpcy5fbWVtb3J5Vmlld09mZnNldCA9IDA7XHJcbiAgICAgICAgdGhpcy5fbWVtb3J5VmlldyA9IG5ldyBVaW50OEFycmF5KHRoaXMuX21lbW9yeS5idWZmZXIsIHRoaXMuX21lbW9yeVZpZXdPZmZzZXQsIHRoaXMuX21lbW9yeVZpZXdCeXRlTGVuZ3RoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHdhc21NZW1vcnkoKTogV2ViQXNzZW1ibHkuTWVtb3J5IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbWVtb3J5O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRNZW1vcnlWaWV3KG51bVBhZ2VzOiBudW1iZXIsIG9mZnNldDogbnVtYmVyID0gMCwgYnl0ZUxlbmd0aD86IG51bWJlcik6IFVpbnQ4QXJyYXkge1xyXG4gICAgICAgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID8/IG51bVBhZ2VzIDw8IDE2O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fbnVtUGFnZXMgPCBudW1QYWdlcykge1xyXG4gICAgICAgICAgICB0aGlzLl9tZW1vcnkuZ3JvdyhudW1QYWdlcyAtIHRoaXMuX251bVBhZ2VzKTtcclxuICAgICAgICAgICAgdGhpcy5fbnVtUGFnZXMgPSBudW1QYWdlcztcclxuICAgICAgICAgICAgdGhpcy5fbWVtb3J5VmlldyA9IG5ldyBVaW50OEFycmF5KHRoaXMuX21lbW9yeS5idWZmZXIsIG9mZnNldCwgYnl0ZUxlbmd0aCk7XHJcbiAgICAgICAgICAgIHRoaXMuX21lbW9yeVZpZXdCeXRlTGVuZ3RoID0gYnl0ZUxlbmd0aDtcclxuICAgICAgICAgICAgdGhpcy5fbWVtb3J5Vmlld09mZnNldCA9IG9mZnNldDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9tZW1vcnlWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fbWVtb3J5LmJ1ZmZlciwgb2Zmc2V0LCBieXRlTGVuZ3RoKTtcclxuICAgICAgICAgICAgdGhpcy5fbWVtb3J5Vmlld0J5dGVMZW5ndGggPSBieXRlTGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLl9tZW1vcnlWaWV3T2Zmc2V0ID0gb2Zmc2V0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lbW9yeVZpZXc7XHJcbiAgICB9XHJcbn1cclxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uICovXHJcblxyXG5pbXBvcnQgeyBUcmFuc2NvZGVyIH0gZnJvbSBcIi4vdHJhbnNjb2RlclwiO1xyXG5cclxuLyoqXHJcbiAqIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL2Rvbm1jY3VyZHkvenN0ZGRlYyBieSBEb24gTWNDdXJkeVxyXG4gKi9cclxuaW50ZXJmYWNlIERlY29kZXJFeHBvcnRzIHtcclxuICAgIG1lbW9yeTogVWludDhBcnJheTtcclxuXHJcbiAgICBaU1REX2ZpbmREZWNvbXByZXNzZWRTaXplOiAoY29tcHJlc3NlZFB0cjogbnVtYmVyLCBjb21wcmVzc2VkU2l6ZTogbnVtYmVyKSA9PiBudW1iZXI7XHJcbiAgICBaU1REX2RlY29tcHJlc3M6ICh1bmNvbXByZXNzZWRQdHI6IG51bWJlciwgdW5jb21wcmVzc2VkU2l6ZTogbnVtYmVyLCBjb21wcmVzc2VkUHRyOiBudW1iZXIsIGNvbXByZXNzZWRTaXplOiBudW1iZXIpID0+IG51bWJlcjtcclxuICAgIG1hbGxvYzogKHB0cjogbnVtYmVyKSA9PiBudW1iZXI7XHJcbiAgICBmcmVlOiAocHRyOiBudW1iZXIpID0+IHZvaWQ7XHJcbn1cclxuXHJcbmxldCBpbml0OiBQcm9taXNlPHZvaWQ+O1xyXG5sZXQgaW5zdGFuY2U6IHsgZXhwb3J0czogRGVjb2RlckV4cG9ydHMgfTtcclxubGV0IGhlYXA6IFVpbnQ4QXJyYXk7XHJcblxyXG5jb25zdCBJTVBPUlRfT0JKRUNUID0ge1xyXG4gICAgZW52OiB7XHJcbiAgICAgICAgZW1zY3JpcHRlbl9ub3RpZnlfbWVtb3J5X2dyb3d0aDogZnVuY3Rpb24gKCk6IHZvaWQge1xyXG4gICAgICAgICAgICBoZWFwID0gbmV3IFVpbnQ4QXJyYXkoaW5zdGFuY2UuZXhwb3J0cy5tZW1vcnkuYnVmZmVyKTtcclxuICAgICAgICB9LFxyXG4gICAgfSxcclxufTtcclxuXHJcbi8qKlxyXG4gKiBaU1REIChac3RhbmRhcmQpIGRlY29kZXIuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgWlNURERlY29kZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyBXYXNtTW9kdWxlVVJMID0gXCJodHRwczovL2Nkbi5iYWJ5bG9uanMuY29tL3pzdGRkZWMud2FzbVwiO1xyXG5cclxuICAgIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgaWYgKGluaXQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGluaXQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIGZldGNoICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIC8vIFdlYi5cclxuXHJcbiAgICAgICAgICAgIGluaXQgPSBmZXRjaChUcmFuc2NvZGVyLkdldFdhc21VcmwoWlNURERlY29kZXIuV2FzbU1vZHVsZVVSTCkpXHJcbiAgICAgICAgICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZldGNoIHRoZSB3YXNtIGNvbXBvbmVudCBmb3IgdGhlIFpzdGFuZGFyZCBkZWNvbXByZXNzaW9uIGxpYjogJHtyZXNwb25zZS5zdGF0dXN9IC0gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC50aGVuKChhcnJheUJ1ZmZlcikgPT4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYXJyYXlCdWZmZXIsIElNUE9SVF9PQkpFQ1QpKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4odGhpcy5faW5pdCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gTm9kZS5qcy5cclxuXHJcbiAgICAgICAgICAgIGluaXQgPSBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhmZXRjaChaU1RERGVjb2Rlci5XYXNtTW9kdWxlVVJMKSwgSU1QT1JUX09CSkVDVCkudGhlbih0aGlzLl9pbml0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpbml0O1xyXG4gICAgfVxyXG5cclxuICAgIF9pbml0KHJlc3VsdDogV2ViQXNzZW1ibHkuV2ViQXNzZW1ibHlJbnN0YW50aWF0ZWRTb3VyY2UpOiB2b2lkIHtcclxuICAgICAgICBpbnN0YW5jZSA9IHJlc3VsdC5pbnN0YW5jZSBhcyB1bmtub3duIGFzIHsgZXhwb3J0czogRGVjb2RlckV4cG9ydHMgfTtcclxuXHJcbiAgICAgICAgSU1QT1JUX09CSkVDVC5lbnYuZW1zY3JpcHRlbl9ub3RpZnlfbWVtb3J5X2dyb3d0aCgpOyAvLyBpbml0aWFsaXplIGhlYXAuXHJcbiAgICB9XHJcblxyXG4gICAgZGVjb2RlKGFycmF5OiBVaW50OEFycmF5LCB1bmNvbXByZXNzZWRTaXplID0gMCk6IFVpbnQ4QXJyYXkge1xyXG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBaU1RERGVjb2RlcjogQXdhaXQgLmluaXQoKSBiZWZvcmUgZGVjb2RpbmcuYCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBXcml0ZSBjb21wcmVzc2VkIGRhdGEgaW50byBXQVNNIG1lbW9yeS5cclxuICAgICAgICBjb25zdCBjb21wcmVzc2VkU2l6ZSA9IGFycmF5LmJ5dGVMZW5ndGg7XHJcbiAgICAgICAgY29uc3QgY29tcHJlc3NlZFB0ciA9IGluc3RhbmNlLmV4cG9ydHMubWFsbG9jKGNvbXByZXNzZWRTaXplKTtcclxuICAgICAgICBoZWFwLnNldChhcnJheSwgY29tcHJlc3NlZFB0cik7XHJcblxyXG4gICAgICAgIC8vIERlY29tcHJlc3MgaW50byBXQVNNIG1lbW9yeS5cclxuICAgICAgICB1bmNvbXByZXNzZWRTaXplID0gdW5jb21wcmVzc2VkU2l6ZSB8fCBOdW1iZXIoaW5zdGFuY2UuZXhwb3J0cy5aU1REX2ZpbmREZWNvbXByZXNzZWRTaXplKGNvbXByZXNzZWRQdHIsIGNvbXByZXNzZWRTaXplKSk7XHJcbiAgICAgICAgY29uc3QgdW5jb21wcmVzc2VkUHRyID0gaW5zdGFuY2UuZXhwb3J0cy5tYWxsb2ModW5jb21wcmVzc2VkU2l6ZSk7XHJcbiAgICAgICAgY29uc3QgYWN0dWFsU2l6ZSA9IGluc3RhbmNlLmV4cG9ydHMuWlNURF9kZWNvbXByZXNzKHVuY29tcHJlc3NlZFB0ciwgdW5jb21wcmVzc2VkU2l6ZSwgY29tcHJlc3NlZFB0ciwgY29tcHJlc3NlZFNpemUpO1xyXG5cclxuICAgICAgICAvLyBSZWFkIGRlY29tcHJlc3NlZCBkYXRhIGFuZCBmcmVlIFdBU00gbWVtb3J5LlxyXG4gICAgICAgIGNvbnN0IGRlYyA9IGhlYXAuc2xpY2UodW5jb21wcmVzc2VkUHRyLCB1bmNvbXByZXNzZWRQdHIgKyBhY3R1YWxTaXplKTtcclxuICAgICAgICBpbnN0YW5jZS5leHBvcnRzLmZyZWUoY29tcHJlc3NlZFB0cik7XHJcbiAgICAgICAgaW5zdGFuY2UuZXhwb3J0cy5mcmVlKHVuY29tcHJlc3NlZFB0cik7XHJcblxyXG4gICAgICAgIHJldHVybiBkZWM7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCU0QgTGljZW5zZVxyXG4gKlxyXG4gKiBGb3IgWnN0YW5kYXJkIHNvZnR3YXJlXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxNi1wcmVzZW50LCBZYW5uIENvbGxldCwgRmFjZWJvb2ssIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICpcclxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbixcclxuICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxyXG4gKlxyXG4gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcclxuICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXHJcbiAqXHJcbiAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcclxuICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxyXG4gKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cclxuICpcclxuICogICogTmVpdGhlciB0aGUgbmFtZSBGYWNlYm9vayBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG9cclxuICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWNcclxuICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxyXG4gKlxyXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcclxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcclxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxyXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUlxyXG4gKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcclxuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xyXG4gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05cclxuICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcclxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcclxuICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXHJcbiAqL1xyXG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0ICogYXMga3R4MmRlY29kZXIgZnJvbSBcImt0eDJkZWNvZGVyL2xlZ2FjeS9sZWdhY3lcIjtcclxuXHJcbmV4cG9ydCB7IGt0eDJkZWNvZGVyIH07XHJcbmV4cG9ydCBkZWZhdWx0IGt0eDJkZWNvZGVyO1xyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
1914
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbi5rdHgyRGVjb2Rlci5tYXguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ1ZBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNoQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0SUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTEE7QUFDQTtBQUdBOztBQUVBO0FBQ0E7QUFBQTs7QUFFQTtBQTJGQTtBQXRGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBV0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFPQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFNQTtBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0R0E7QUFFQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBeEJBOztBQUVBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBT0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeEJBO0FBRUE7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQXhCQTs7QUFFQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQU9BOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3hCQTtBQUVBO0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBV0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQTNDQTs7QUFFQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQU1BOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3hCQTtBQUVBO0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBV0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQTNDQTs7QUFFQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQU1BOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3hCQTtBQUVBO0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBV0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQTNDQTs7QUFFQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQU1BOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3hCQTtBQUVBO0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBV0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQTNDQTs7QUFFQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQU1BOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4QkE7QUFFQTtBQUVBO0FBTUE7O0FBRUE7QUFDQTtBQXdCQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFXQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQXZLQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBRUE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNSQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7QUFHQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUExSUE7QUE2SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeExBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFtRkE7QUFPQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOztBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDelhBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDM1BBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFXQTtBQUNBOztBQW5DQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ2pCQTtBQUdBO0FBRUE7O0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQXBEQTtBQU1BOzs7Ozs7Ozs7Ozs7Ozs7QUNiQTs7QUFFQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQXpFQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUNUQTtBQUVBO0FBY0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUF2REE7QUEwREE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErQkE7Ozs7Ozs7QUN6SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNQQTs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ05BO0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0tUWDJERUNPREVSL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9LVFgyREVDT0RFUi8uLi8uLi8uLi9kZXYvY29yZS9zcmMvTWF0ZXJpYWxzL1RleHR1cmVzL2t0eDJkZWNvZGVyVHlwZXMudHMiLCJ3ZWJwYWNrOi8vS1RYMkRFQ09ERVIvLi4vLi4vLi4vdG9vbHMva3R4MkRlY29kZXIvc3JjL01pc2MvZGF0YVJlYWRlci50cyIsIndlYnBhY2s6Ly9LVFgyREVDT0RFUi8uLi8uLi8uLi90b29scy9rdHgyRGVjb2Rlci9zcmMvTWlzYy9pbmRleC50cyIsIndlYnBhY2s6Ly9LVFgyREVDT0RFUi8uLi8uLi8uLi90b29scy9rdHgyRGVjb2Rlci9zcmMvVHJhbnNjb2RlcnMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vS1RYMkRFQ09ERVIvLi4vLi4vLi4vdG9vbHMva3R4MkRlY29kZXIvc3JjL1RyYW5zY29kZXJzL2xpdGVUcmFuc2NvZGVyLnRzIiwid2VicGFjazovL0tUWDJERUNPREVSLy4uLy4uLy4uL3Rvb2xzL2t0eDJEZWNvZGVyL3NyYy9UcmFuc2NvZGVycy9saXRlVHJhbnNjb2Rlcl9VQVNUQ19BU1RDLnRzIiwid2VicGFjazovL0tUWDJERUNPREVSLy4uLy4uLy4uL3Rvb2xzL2t0eDJEZWNvZGVyL3NyYy9UcmFuc2NvZGVycy9saXRlVHJhbnNjb2Rlcl9VQVNUQ19CQzcudHMiLCJ3ZWJwYWNrOi8vS1RYMkRFQ09ERVIvLi4vLi4vLi4vdG9vbHMva3R4MkRlY29kZXIvc3JjL1RyYW5zY29kZXJzL2xpdGVUcmFuc2NvZGVyX1VBU1RDX1I4X1VOT1JNLnRzIiwid2VicGFjazovL0tUWDJERUNPREVSLy4uLy4uLy4uL3Rvb2xzL2t0eDJEZWNvZGVyL3NyYy9UcmFuc2NvZGVycy9saXRlVHJhbnNjb2Rlcl9VQVNUQ19SRzhfVU5PUk0udHMiLCJ3ZWJwYWNrOi8vS1RYMkRFQ09ERVIvLi4vLi4vLi4vdG9vbHMva3R4MkRlY29kZXIvc3JjL1RyYW5zY29kZXJzL2xpdGVUcmFuc2NvZGVyX1VBU1RDX1JHQkFfU1JHQi50cyIsIndlYnBhY2s6Ly9LVFgyREVDT0RFUi8uLi8uLi8uLi90b29scy9rdHgyRGVjb2Rlci9zcmMvVHJhbnNjb2RlcnMvbGl0ZVRyYW5zY29kZXJfVUFTVENfUkdCQV9VTk9STS50cyIsIndlYnBhY2s6Ly9LVFgyREVDT0RFUi8uLi8uLi8uLi90b29scy9rdHgyRGVjb2Rlci9zcmMvVHJhbnNjb2RlcnMvbXNjVHJhbnNjb2Rlci50cyIsIndlYnBhY2s6Ly9LVFgyREVDT0RFUi8uLi8uLi8uLi90b29scy9rdHgyRGVjb2Rlci9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vS1RYMkRFQ09ERVIvLi4vLi4vLi4vdG9vbHMva3R4MkRlY29kZXIvc3JjL2t0eDJEZWNvZGVyLnRzIiwid2VicGFjazovL0tUWDJERUNPREVSLy4uLy4uLy4uL3Rvb2xzL2t0eDJEZWNvZGVyL3NyYy9rdHgyRmlsZVJlYWRlci50cyIsIndlYnBhY2s6Ly9LVFgyREVDT0RFUi8uLi8uLi8uLi90b29scy9rdHgyRGVjb2Rlci9zcmMvbGVnYWN5L2xlZ2FjeS50cyIsIndlYnBhY2s6Ly9LVFgyREVDT0RFUi8uLi8uLi8uLi90b29scy9rdHgyRGVjb2Rlci9zcmMvdHJhbnNjb2RlRGVjaXNpb25UcmVlLnRzIiwid2VicGFjazovL0tUWDJERUNPREVSLy4uLy4uLy4uL3Rvb2xzL2t0eDJEZWNvZGVyL3NyYy90cmFuc2NvZGVyLnRzIiwid2VicGFjazovL0tUWDJERUNPREVSLy4uLy4uLy4uL3Rvb2xzL2t0eDJEZWNvZGVyL3NyYy90cmFuc2NvZGVyTWFuYWdlci50cyIsIndlYnBhY2s6Ly9LVFgyREVDT0RFUi8uLi8uLi8uLi90b29scy9rdHgyRGVjb2Rlci9zcmMvd2FzbU1lbW9yeU1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vS1RYMkRFQ09ERVIvLi4vLi4vLi4vdG9vbHMva3R4MkRlY29kZXIvc3JjL3pzdGRkZWMudHMiLCJ3ZWJwYWNrOi8vS1RYMkRFQ09ERVIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vS1RYMkRFQ09ERVIvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL0tUWDJERUNPREVSL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vS1RYMkRFQ09ERVIvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9LVFgyREVDT0RFUi93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL0tUWDJERUNPREVSLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiYmFieWxvbmpzLWt0eDJkZWNvZGVyXCIsIFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImJhYnlsb25qcy1rdHgyZGVjb2RlclwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJLVFgyREVDT0RFUlwiXSA9IGZhY3RvcnkoKTtcbn0pKCh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdGhpcyksICgpID0+IHtcbnJldHVybiAiLCJleHBvcnQgZW51bSBTb3VyY2VUZXh0dXJlRm9ybWF0IHtcclxuICAgIEVUQzFTLFxyXG4gICAgVUFTVEM0eDQsXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFRyYW5zY29kZVRhcmdldCB7XHJcbiAgICBBU1RDXzRYNF9SR0JBLFxyXG4gICAgQkM3X1JHQkEsXHJcbiAgICBCQzNfUkdCQSxcclxuICAgIEJDMV9SR0IsXHJcbiAgICBQVlJUQzFfNF9SR0JBLFxyXG4gICAgUFZSVEMxXzRfUkdCLFxyXG4gICAgRVRDMl9SR0JBLFxyXG4gICAgRVRDMV9SR0IsXHJcbiAgICBSR0JBMzIsXHJcbiAgICBSOCxcclxuICAgIFJHOCxcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGVudW0gRW5naW5lRm9ybWF0IHtcclxuICAgIENPTVBSRVNTRURfUkdCQV9CUFRDX1VOT1JNX0VYVCA9IDB4OGU4YyxcclxuICAgIENPTVBSRVNTRURfUkdCQV9BU1RDXzRYNF9LSFIgPSAweDkzYjAsXHJcbiAgICBDT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUID0gMHg4M2YwLFxyXG4gICAgQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQgPSAweDgzZjMsXHJcbiAgICBDT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRyA9IDB4OGMwMixcclxuICAgIENPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUcgPSAweDhjMDAsXHJcbiAgICBDT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDID0gMHg5Mjc4LFxyXG4gICAgQ09NUFJFU1NFRF9SR0I4X0VUQzIgPSAweDkyNzQsXHJcbiAgICBDT01QUkVTU0VEX1JHQl9FVEMxX1dFQkdMID0gMHg4ZDY0LFxyXG4gICAgUkdCQThGb3JtYXQgPSAweDgwNTgsXHJcbiAgICBSOEZvcm1hdCA9IDB4ODIyOSxcclxuICAgIFJHOEZvcm1hdCA9IDB4ODIyYixcclxufVxyXG5cclxuLyoqXHJcbiAqIExlYWYgbm9kZSBvZiBhIGRlY2lzaW9uIHRyZWVcclxuICogSXQgZGVmaW5lcyB0aGUgdHJhbnNjb2RpbmcgZm9ybWF0IHRvIHVzZSB0byB0cmFuc2NvZGUgdGhlIHRleHR1cmUgYXMgd2VsbCBhcyB0aGUgY29ycmVzcG9uZGluZyBmb3JtYXQgdG8gdXNlIGF0IHRoZSBlbmdpbmUgbGV2ZWwgd2hlbiBjcmVhdGluZyB0aGUgdGV4dHVyZVxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBJTGVhZiB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmb3JtYXQgdG8gdHJhbnNjb2RlIHRvXHJcbiAgICAgKi9cclxuICAgIHRyYW5zY29kZUZvcm1hdDogVHJhbnNjb2RlVGFyZ2V0O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZvcm1hdCB0byB1c2Ugd2hlbiBjcmVhdGluZyB0aGUgdGV4dHVyZSBhdCB0aGUgZW5naW5lIGxldmVsIGFmdGVyIGl0IGhhcyBiZWVuIHRyYW5zY29kZWQgdG8gdHJhbnNjb2RlRm9ybWF0XHJcbiAgICAgKi9cclxuICAgIGVuZ2luZUZvcm1hdDogRW5naW5lRm9ybWF0O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0aGUgdGV4dHVyZSBtdXN0IGJlIHJvdW5kZWQgdG8gYSBtdWx0aXBsZSBvZiA0IChzaG91bGQgbm9ybWFsbHkgYmUgdGhlIGNhc2UgZm9yIGFsbCBjb21wcmVzc2VkIGZvcm1hdHMpLiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgKi9cclxuICAgIHJvdW5kVG9NdWx0aXBsZTQ/OiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuICogUmVndWxhciBub2RlIG9mIGEgZGVjaXNpb24gdHJlZVxyXG4gKlxyXG4gKiBFYWNoIHByb3BlcnR5IChleGNlcHQgZm9yIFwieWVzXCIgYW5kIFwibm9cIiksIGlmIG5vdCBlbXB0eSwgd2lsbCBiZSBjaGVja2VkIGluIG9yZGVyIHRvIGRldGVybWluZSB0aGUgbmV4dCBub2RlIHRvIHNlbGVjdC5cclxuICogSWYgYWxsIGNoZWNrcyBhcmUgc3VjY2Vzc2Z1bCwgdGhlIFwieWVzXCIgbm9kZSB3aWxsIGJlIHNlbGVjdGVkLCBlbHNlIHRoZSBcIm5vXCIgbm9kZSB3aWxsIGJlIHNlbGVjdGVkLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBJTm9kZSB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjYXBhYmlsaXR5IHRvIGNoZWNrLiBDYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6XHJcbiAgICAgKiAgICAgIGFzdGNcclxuICAgICAqICAgICAgYnB0Y1xyXG4gICAgICogICAgICBzM3RjXHJcbiAgICAgKiAgICAgIHB2cnRjXHJcbiAgICAgKiAgICAgIGV0YzJcclxuICAgICAqICAgICAgZXRjMVxyXG4gICAgICovXHJcbiAgICBjYXA/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgb3B0aW9uIHRvIGNoZWNrIGZyb20gdGhlIG9wdGlvbnMgb2JqZWN0IHBhc3NlZCB0byB0aGUgS1RYMiBkZWNvZGUgZnVuY3Rpb24uIHtAbGluayBJS1RYMkRlY29kZXJPcHRpb25zfVxyXG4gICAgICovXHJcbiAgICBvcHRpb24/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgYWxwaGEgaXMgcHJlc2VudCBpbiB0aGUgdGV4dHVyZVxyXG4gICAgICovXHJcbiAgICBhbHBoYT86IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0cmFuc2NvZGluZyBmb3JtYXQuXHJcbiAgICAgKi9cclxuICAgIHRyYW5zY29kZUZvcm1hdD86IFRyYW5zY29kZVRhcmdldCB8IFRyYW5zY29kZVRhcmdldFtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIHRoYXQgdGhlIHRleHR1cmUgaXMgYSBwb3dlciBvZiB0d29cclxuICAgICAqL1xyXG4gICAgbmVlZHNQb3dlck9mVHdvPzogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBub2RlIHRvIHNlbGVjdCBpZiBhbGwgY2hlY2tzIGFyZSBzdWNjZXNzZnVsXHJcbiAgICAgKi9cclxuICAgIHllcz86IElOb2RlIHwgSUxlYWY7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbm9kZSB0byBzZWxlY3QgaWYgYXQgbGVhc3Qgb25lIGNoZWNrIGlzIG5vdCBzdWNjZXNzZnVsXHJcbiAgICAgKi9cclxuICAgIG5vPzogSU5vZGUgfCBJTGVhZjtcclxufVxyXG5cclxuLyoqXHJcbiAqIERlY2lzaW9uIHRyZWUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHRyYW5zY29kaW5nIGZvcm1hdCB0byB1c2UgZm9yIGEgZ2l2ZW4gc291cmNlIHRleHR1cmUgZm9ybWF0XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElEZWNpc2lvblRyZWUge1xyXG4gICAgLyoqXHJcbiAgICAgKiB0ZXh0dXJlRm9ybWF0IGNhbiBiZSBlaXRoZXIgVUFTVEMgb3IgRVRDMVNcclxuICAgICAqL1xyXG4gICAgW3RleHR1cmVGb3JtYXQ6IHN0cmluZ106IElOb2RlO1xyXG59XHJcblxyXG4vKipcclxuICogUmVzdWx0IG9mIHRoZSBLVFgyIGRlY29kZSBmdW5jdGlvblxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBJRGVjb2RlZERhdGEge1xyXG4gICAgLyoqXHJcbiAgICAgKiBXaWR0aCBvZiB0aGUgdGV4dHVyZVxyXG4gICAgICovXHJcbiAgICB3aWR0aDogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVpZ2h0IG9mIHRoZSB0ZXh0dXJlXHJcbiAgICAgKi9cclxuICAgIGhlaWdodDogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZvcm1hdCB0byB1c2Ugd2hlbiBjcmVhdGluZyB0aGUgdGV4dHVyZSBhdCB0aGUgZW5naW5lIGxldmVsXHJcbiAgICAgKiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBlbmdpbmVGb3JtYXQgcHJvcGVydHkgb2YgdGhlIGxlYWYgbm9kZSBvZiB0aGUgZGVjaXNpb24gdHJlZVxyXG4gICAgICovXHJcbiAgICB0cmFuc2NvZGVkRm9ybWF0OiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMaXN0IG9mIG1pcG1hcCBsZXZlbHMuXHJcbiAgICAgKiBUaGUgZmlyc3QgZWxlbWVudCBpcyB0aGUgYmFzZSBsZXZlbCwgdGhlIGxhc3QgZWxlbWVudCBpcyB0aGUgc21hbGxlc3QgbWlwbWFwIGxldmVsIChpZiBtb3JlIHRoYW4gb25lIG1pcG1hcCBsZXZlbCBpcyBwcmVzZW50KVxyXG4gICAgICovXHJcbiAgICBtaXBtYXBzOiBBcnJheTxJTWlwbWFwPjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgdGhlIHRleHR1cmUgZGF0YSBpcyBpbiBnYW1tYSBzcGFjZSBvciBub3RcclxuICAgICAqL1xyXG4gICAgaXNJbkdhbW1hU3BhY2U6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRoZSB0ZXh0dXJlIGhhcyBhbiBhbHBoYSBjaGFubmVsIG9yIG5vdFxyXG4gICAgICovXHJcbiAgICBoYXNBbHBoYTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSB0cmFuc2NvZGVyIHVzZWQgdG8gdHJhbnNjb2RlIHRoZSB0ZXh0dXJlXHJcbiAgICAgKi9cclxuICAgIHRyYW5zY29kZXJOYW1lOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZXJyb3JzIChpZiBhbnkpIGVuY291bnRlcmVkIGR1cmluZyB0aGUgZGVjb2RpbmcgcHJvY2Vzc1xyXG4gICAgICovXHJcbiAgICBlcnJvcnM/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZWZpbmVzIGEgbWlwbWFwIGxldmVsXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElNaXBtYXAge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGF0YSBvZiB0aGUgbWlwbWFwIGxldmVsXHJcbiAgICAgKi9cclxuICAgIGRhdGE6IFVpbnQ4QXJyYXkgfCBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHdpZHRoIG9mIHRoZSBtaXBtYXAgbGV2ZWxcclxuICAgICAqL1xyXG4gICAgd2lkdGg6IG51bWJlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIG1pcG1hcCBsZXZlbFxyXG4gICAgICovXHJcbiAgICBoZWlnaHQ6IG51bWJlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0cyBzdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXJcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXByZXNzZWRGb3JtYXRDYXBhYmlsaXRpZXMge1xyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRoZSBicm93c2VyIHN1cHBvcnRzIEFTVENcclxuICAgICAqL1xyXG4gICAgYXN0Yz86IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRoZSBicm93c2VyIHN1cHBvcnRzIEJQVENcclxuICAgICAqL1xyXG4gICAgYnB0Yz86IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRoZSBicm93c2VyIHN1cHBvcnRzIFMzVENcclxuICAgICAqL1xyXG4gICAgczN0Yz86IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRoZSBicm93c2VyIHN1cHBvcnRzIFBWUlRDXHJcbiAgICAgKi9cclxuICAgIHB2cnRjPzogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgdGhlIGJyb3dzZXIgc3VwcG9ydHMgRVRDMlxyXG4gICAgICovXHJcbiAgICBldGMyPzogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgdGhlIGJyb3dzZXIgc3VwcG9ydHMgRVRDMVxyXG4gICAgICovXHJcbiAgICBldGMxPzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIE9wdGlvbnMgcGFzc2VkIHRvIHRoZSBLVFgyIGRlY29kZSBmdW5jdGlvblxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBJS1RYMkRlY29kZXJPcHRpb25zIHtcclxuICAgIC8qKiB1c2UgUkdCQSBmb3JtYXQgaWYgQVNUQyBhbmQgQkM3IGFyZSBub3QgYXZhaWxhYmxlIGFzIHRyYW5zY29kZWQgZm9ybWF0ICovXHJcbiAgICB1c2VSR0JBSWZBU1RDQkM3Tm90QXZhaWxhYmxlV2hlblVBU1RDPzogYm9vbGVhbjtcclxuXHJcbiAgICAvKiogZm9yY2UgdG8gYWx3YXlzIHVzZSAodW5jb21wcmVzc2VkKSBSR0JBIGZvciB0cmFuc2NvZGVkIGZvcm1hdCAqL1xyXG4gICAgZm9yY2VSR0JBPzogYm9vbGVhbjtcclxuXHJcbiAgICAvKiogZm9yY2UgdG8gYWx3YXlzIHVzZSAodW5jb21wcmVzc2VkKSBSOCBmb3IgdHJhbnNjb2RlZCBmb3JtYXQgKi9cclxuICAgIGZvcmNlUjg/OiBib29sZWFuO1xyXG5cclxuICAgIC8qKiBmb3JjZSB0byBhbHdheXMgdXNlICh1bmNvbXByZXNzZWQpIFJHOCBmb3IgdHJhbnNjb2RlZCBmb3JtYXQgKi9cclxuICAgIGZvcmNlUkc4PzogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGxpc3Qgb2YgdHJhbnNjb2RlcnMgdG8gYnlwYXNzIHdoZW4gbG9va2luZyBmb3IgYSBzdWl0YWJsZSB0cmFuc2NvZGVyLiBUaGUgYXZhaWxhYmxlIHRyYW5zY29kZXJzIGFyZTpcclxuICAgICAqICAgICAgVW5pdmVyc2FsVHJhbnNjb2Rlcl9VQVNUQ19BU1RDXHJcbiAgICAgKiAgICAgIFVuaXZlcnNhbFRyYW5zY29kZXJfVUFTVENfQkM3XHJcbiAgICAgKiAgICAgIFVuaXZlcnNhbFRyYW5zY29kZXJfVUFTVENfUkdCQV9VTk9STVxyXG4gICAgICogICAgICBVbml2ZXJzYWxUcmFuc2NvZGVyX1VBU1RDX1JHQkFfU1JHQlxyXG4gICAgICogICAgICBVbml2ZXJzYWxUcmFuc2NvZGVyX1VBU1RDX1I4X1VOT1JNXHJcbiAgICAgKiAgICAgIFVuaXZlcnNhbFRyYW5zY29kZXJfVUFTVENfUkc4X1VOT1JNXHJcbiAgICAgKiAgICAgIE1TQ1RyYW5zY29kZXJcclxuICAgICAqL1xyXG4gICAgYnlwYXNzVHJhbnNjb2RlcnM/OiBzdHJpbmdbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEN1c3RvbSBkZWNpc2lvbiB0cmVlIHRvIGFwcGx5IGFmdGVyIHRoZSBkZWZhdWx0IGRlY2lzaW9uIHRyZWUgaGFzIHNlbGVjdGVkIGEgdHJhbnNjb2RpbmcgZm9ybWF0LlxyXG4gICAgICogQWxsb3dzIHRoZSB1c2VyIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGRlY2lzaW9uIHRyZWUgc2VsZWN0aW9uLlxyXG4gICAgICogVGhlIGRlY2lzaW9uIHRyZWUgY2FuIHVzZSB0aGUgSU5vZGUudHJhbnNjb2RlRm9ybWF0IHByb3BlcnR5IHRvIGJhc2UgaXRzIGRlY2lzaW9uIG9uIHRoZSB0cmFuc2NvZGluZyBmb3JtYXQgc2VsZWN0ZWQgYnkgdGhlIGRlZmF1bHQgZGVjaXNpb24gdHJlZS5cclxuICAgICAqL1xyXG4gICAgdHJhbnNjb2RlRm9ybWF0RGVjaXNpb25UcmVlPzogSURlY2lzaW9uVHJlZTtcclxufVxyXG4iLCIvKipcclxuICogVXRpbGl0eSBjbGFzcyBmb3IgcmVhZGluZyBmcm9tIGEgZGF0YSBidWZmZXJcclxuICovXHJcbmV4cG9ydCBjbGFzcyBEYXRhUmVhZGVyIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGN1cnJlbnQgYnl0ZSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhIGJ1ZmZlci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBieXRlT2Zmc2V0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhQnl0ZU9mZnNldDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9kYXRhVmlldzogRGF0YVZpZXc7XHJcbiAgICBwcml2YXRlIF9kYXRhQnl0ZU9mZnNldDogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29uc3RydWN0b3JcclxuICAgICAqIEBwYXJhbSBidWZmZXIgVGhlIGJ1ZmZlciB0byBzZXRcclxuICAgICAqIEBwYXJhbSBieXRlT2Zmc2V0IFRoZSBzdGFydGluZyBvZmZzZXQgaW4gdGhlIGJ1ZmZlclxyXG4gICAgICogQHBhcmFtIGJ5dGVMZW5ndGggVGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBidWZmZXJcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoYnVmZmVyOiBBcnJheUJ1ZmZlciB8IEFycmF5QnVmZmVyVmlldywgYnl0ZU9mZnNldD86IG51bWJlciwgYnl0ZUxlbmd0aD86IG51bWJlcikge1xyXG4gICAgICAgIGlmICgoYnVmZmVyIGFzIEFycmF5QnVmZmVyVmlldykuYnVmZmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RhdGFWaWV3ID0gbmV3IERhdGFWaWV3KFxyXG4gICAgICAgICAgICAgICAgKGJ1ZmZlciBhcyBBcnJheUJ1ZmZlclZpZXcpLmJ1ZmZlcixcclxuICAgICAgICAgICAgICAgIChidWZmZXIgYXMgQXJyYXlCdWZmZXJWaWV3KS5ieXRlT2Zmc2V0ICsgKGJ5dGVPZmZzZXQgPz8gMCksXHJcbiAgICAgICAgICAgICAgICBieXRlTGVuZ3RoID8/IChidWZmZXIgYXMgQXJyYXlCdWZmZXJWaWV3KS5ieXRlTGVuZ3RoXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoYnVmZmVyIGFzIEFycmF5QnVmZmVyLCBieXRlT2Zmc2V0ID8/IDAsIGJ5dGVMZW5ndGggPz8gKGJ1ZmZlciBhcyBBcnJheUJ1ZmZlcikuYnl0ZUxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9kYXRhQnl0ZU9mZnNldCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWFkIGEgdW5zaWduZWQgOC1iaXQgaW50ZWdlciBmcm9tIHRoZSBjdXJyZW50bHkgbG9hZGVkIGRhdGEgcmFuZ2UuXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgOC1iaXQgaW50ZWdlciByZWFkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWFkVWludDgoKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2RhdGFWaWV3LmdldFVpbnQ4KHRoaXMuX2RhdGFCeXRlT2Zmc2V0KTtcclxuICAgICAgICB0aGlzLl9kYXRhQnl0ZU9mZnNldCArPSAxO1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYWQgYSBzaWduZWQgOC1iaXQgaW50ZWdlciBmcm9tIHRoZSBjdXJyZW50bHkgbG9hZGVkIGRhdGEgcmFuZ2UuXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgOC1iaXQgaW50ZWdlciByZWFkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWFkSW50OCgpOiBudW1iZXIge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZGF0YVZpZXcuZ2V0SW50OCh0aGlzLl9kYXRhQnl0ZU9mZnNldCk7XHJcbiAgICAgICAgdGhpcy5fZGF0YUJ5dGVPZmZzZXQgKz0gMTtcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWFkIGEgdW5zaWduZWQgMTYtYml0IGludGVnZXIgZnJvbSB0aGUgY3VycmVudGx5IGxvYWRlZCBkYXRhIHJhbmdlLlxyXG4gICAgICogQHJldHVybnMgVGhlIDE2LWJpdCBpbnRlZ2VyIHJlYWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlYWRVaW50MTYoKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2RhdGFWaWV3LmdldFVpbnQxNih0aGlzLl9kYXRhQnl0ZU9mZnNldCwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fZGF0YUJ5dGVPZmZzZXQgKz0gMjtcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWFkIGEgc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIGZyb20gdGhlIGN1cnJlbnRseSBsb2FkZWQgZGF0YSByYW5nZS5cclxuICAgICAqIEByZXR1cm5zIFRoZSAxNi1iaXQgaW50ZWdlciByZWFkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWFkSW50MTYoKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2RhdGFWaWV3LmdldEludDE2KHRoaXMuX2RhdGFCeXRlT2Zmc2V0LCB0cnVlKTtcclxuICAgICAgICB0aGlzLl9kYXRhQnl0ZU9mZnNldCArPSAyO1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYWQgYSB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciBmcm9tIHRoZSBjdXJyZW50bHkgbG9hZGVkIGRhdGEgcmFuZ2UuXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgMzItYml0IGludGVnZXIgcmVhZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVhZFVpbnQzMigpOiBudW1iZXIge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZGF0YVZpZXcuZ2V0VWludDMyKHRoaXMuX2RhdGFCeXRlT2Zmc2V0LCB0cnVlKTtcclxuICAgICAgICB0aGlzLl9kYXRhQnl0ZU9mZnNldCArPSA0O1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYWQgYSBzaWduZWQgMzItYml0IGludGVnZXIgZnJvbSB0aGUgY3VycmVudGx5IGxvYWRlZCBkYXRhIHJhbmdlLlxyXG4gICAgICogQHJldHVybnMgVGhlIDMyLWJpdCBpbnRlZ2VyIHJlYWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlYWRJbnQzMigpOiBudW1iZXIge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZGF0YVZpZXcuZ2V0SW50MzIodGhpcy5fZGF0YUJ5dGVPZmZzZXQsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuX2RhdGFCeXRlT2Zmc2V0ICs9IDQ7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVhZCBhIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIGZyb20gdGhlIGN1cnJlbnRseSBsb2FkZWQgZGF0YSByYW5nZS5cclxuICAgICAqIEByZXR1cm5zIFRoZSAzMi1iaXQgaW50ZWdlciByZWFkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWFkVWludDY0KCk6IG51bWJlciB7XHJcbiAgICAgICAgLy8gc3BsaXQgNjQtYml0IG51bWJlciBpbnRvIHR3byAzMi1iaXQgKDQtYnl0ZSkgcGFydHNcclxuICAgICAgICBjb25zdCBsZWZ0ID0gdGhpcy5fZGF0YVZpZXcuZ2V0VWludDMyKHRoaXMuX2RhdGFCeXRlT2Zmc2V0LCB0cnVlKTtcclxuICAgICAgICBjb25zdCByaWdodCA9IHRoaXMuX2RhdGFWaWV3LmdldFVpbnQzMih0aGlzLl9kYXRhQnl0ZU9mZnNldCArIDQsIHRydWUpO1xyXG5cclxuICAgICAgICAvLyBjb21iaW5lIHRoZSB0d28gMzItYml0IHZhbHVlc1xyXG4gICAgICAgIGNvbnN0IGNvbWJpbmVkID0gbGVmdCArIDIgKiogMzIgKiByaWdodDsgLy8gVGhhdCB3YXMgd2VpcmQuLktlZXBpbmcgaXQgZm9yIHBvc3Rlcml0eTogdHJ1ZSA/IGxlZnQgKyAyICoqIDMyICogcmlnaHQgOiAyICoqIDMyICogbGVmdCArIHJpZ2h0O1xyXG5cclxuICAgICAgICAvKmlmICghTnVtYmVyLmlzU2FmZUludGVnZXIoY29tYmluZWQpKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRGF0YVJlYWRlcjogJyArIGNvbWJpbmVkICsgJyBleGNlZWRzIE1BWF9TQUZFX0lOVEVHRVIuIFByZWNpc2lvbiBtYXkgYmUgbG9zdC4nKTtcclxuICAgICAgICB9Ki9cclxuXHJcbiAgICAgICAgdGhpcy5fZGF0YUJ5dGVPZmZzZXQgKz0gODtcclxuICAgICAgICByZXR1cm4gY29tYmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWFkIGEgYnl0ZSBhcnJheSBmcm9tIHRoZSBjdXJyZW50bHkgbG9hZGVkIGRhdGEgcmFuZ2UuXHJcbiAgICAgKiBAcGFyYW0gYnl0ZUxlbmd0aCBUaGUgYnl0ZSBsZW5ndGggdG8gcmVhZFxyXG4gICAgICogQHJldHVybnMgVGhlIGJ5dGUgYXJyYXkgcmVhZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVhZFVpbnQ4QXJyYXkoYnl0ZUxlbmd0aDogbnVtYmVyKTogVWludDhBcnJheSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBuZXcgVWludDhBcnJheSh0aGlzLl9kYXRhVmlldy5idWZmZXIsIHRoaXMuX2RhdGFWaWV3LmJ5dGVPZmZzZXQgKyB0aGlzLl9kYXRhQnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCk7XHJcbiAgICAgICAgdGhpcy5fZGF0YUJ5dGVPZmZzZXQgKz0gYnl0ZUxlbmd0aDtcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTa2lwcyB0aGUgZ2l2ZW4gYnl0ZSBsZW5ndGggdGhlIGN1cnJlbnRseSBsb2FkZWQgZGF0YSByYW5nZS5cclxuICAgICAqIEBwYXJhbSBieXRlTGVuZ3RoIFRoZSBieXRlIGxlbmd0aCB0byBza2lwXHJcbiAgICAgKiBAcmV0dXJucyBUaGlzIGluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBza2lwQnl0ZXMoYnl0ZUxlbmd0aDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fZGF0YUJ5dGVPZmZzZXQgKz0gYnl0ZUxlbmd0aDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxufVxyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi9kYXRhUmVhZGVyXCI7XHJcbiIsImV4cG9ydCAqIGZyb20gXCIuL2xpdGVUcmFuc2NvZGVyXCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL2xpdGVUcmFuc2NvZGVyX1VBU1RDX0FTVENcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vbGl0ZVRyYW5zY29kZXJfVUFTVENfQkM3XCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL2xpdGVUcmFuc2NvZGVyX1VBU1RDX1I4X1VOT1JNXCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL2xpdGVUcmFuc2NvZGVyX1VBU1RDX1JHOF9VTk9STVwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9saXRlVHJhbnNjb2Rlcl9VQVNUQ19SR0JBX1VOT1JNXCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL2xpdGVUcmFuc2NvZGVyX1VBU1RDX1JHQkFfU1JHQlwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9tc2NUcmFuc2NvZGVyXCI7XHJcbiIsImltcG9ydCB0eXBlICogYXMgS1RYMiBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMva3R4MmRlY29kZXJUeXBlc1wiO1xyXG5cclxuaW1wb3J0IHsgVHJhbnNjb2RlciB9IGZyb20gXCIuLi90cmFuc2NvZGVyXCI7XHJcbmltcG9ydCB7IFdBU01NZW1vcnlNYW5hZ2VyIH0gZnJvbSBcIi4uL3dhc21NZW1vcnlNYW5hZ2VyXCI7XHJcbmltcG9ydCB0eXBlIHsgS1RYMkZpbGVSZWFkZXIsIElLVFgyX0ltYWdlRGVzYyB9IGZyb20gXCIuLi9rdHgyRmlsZVJlYWRlclwiO1xyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIExpdGVUcmFuc2NvZGVyIGV4dGVuZHMgVHJhbnNjb2RlciB7XHJcbiAgICBwcml2YXRlIF9tb2R1bGVQYXRoOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF93YXNtQmluYXJ5OiBBcnJheUJ1ZmZlciB8IG51bGwgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBfbW9kdWxlUHJvbWlzZTogUHJvbWlzZTx7IG1vZHVsZTogYW55IH0+O1xyXG4gICAgcHJpdmF0ZSBfbWVtb3J5TWFuYWdlcjogV0FTTU1lbW9yeU1hbmFnZXI7XHJcbiAgICBwcm90ZWN0ZWQgX3RyYW5zY29kZUluUGxhY2U6IGJvb2xlYW47XHJcblxyXG4gICAgcHJpdmF0ZSBfaW5zdGFudGlhdGVXZWJBc3NlbWJseSh3YXNtQmluYXJ5OiBBcnJheUJ1ZmZlcik6IFByb21pc2U8eyBtb2R1bGU6IGFueSB9PiB7XHJcbiAgICAgICAgcmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHdhc21CaW5hcnkgYXMgQXJyYXlCdWZmZXIsIHsgZW52OiB7IG1lbW9yeTogdGhpcy5fbWVtb3J5TWFuYWdlci53YXNtTWVtb3J5IH0gfSkudGhlbigobW9kdWxlV3JhcHBlcikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IG1vZHVsZVdyYXBwZXIuaW5zdGFuY2UuZXhwb3J0cyB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfbG9hZE1vZHVsZSh3YXNtQmluYXJ5OiBBcnJheUJ1ZmZlciB8IG51bGwgPSB0aGlzLl93YXNtQmluYXJ5KTogUHJvbWlzZTx7IG1vZHVsZTogYW55IH0+IHtcclxuICAgICAgICB0aGlzLl9tb2R1bGVQcm9taXNlID1cclxuICAgICAgICAgICAgdGhpcy5fbW9kdWxlUHJvbWlzZSB8fFxyXG4gICAgICAgICAgICAod2FzbUJpbmFyeSA/IFByb21pc2UucmVzb2x2ZSh3YXNtQmluYXJ5KSA6IFdBU01NZW1vcnlNYW5hZ2VyLkxvYWRXQVNNKHRoaXMuX21vZHVsZVBhdGgpKS50aGVuKCh3YXNtQmluYXJ5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFudGlhdGVXZWJBc3NlbWJseSh3YXNtQmluYXJ5KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vZHVsZVByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxyXG4gICAgcHJvdGVjdGVkIGdldCBtZW1vcnlNYW5hZ2VyKCk6IFdBU01NZW1vcnlNYW5hZ2VyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbWVtb3J5TWFuYWdlcjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXHJcbiAgICBwcm90ZWN0ZWQgc2V0TW9kdWxlUGF0aChtb2R1bGVQYXRoOiBzdHJpbmcsIHdhc21CaW5hcnk6IEFycmF5QnVmZmVyIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX21vZHVsZVBhdGggPSBUcmFuc2NvZGVyLkdldFdhc21VcmwobW9kdWxlUGF0aCk7XHJcbiAgICAgICAgdGhpcy5fd2FzbUJpbmFyeSA9IHdhc21CaW5hcnk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIGluaXRpYWxpemUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNjb2RlSW5QbGFjZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIG5lZWRNZW1vcnlNYW5hZ2VyKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXRNZW1vcnlNYW5hZ2VyKG1lbW9yeU1ncjogV0FTTU1lbW9yeU1hbmFnZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9tZW1vcnlNYW5hZ2VyID0gbWVtb3J5TWdyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSB0cmFuc2NvZGUoXHJcbiAgICAgICAgc3JjOiBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXQsXHJcbiAgICAgICAgZHN0OiBLVFgyLlRyYW5zY29kZVRhcmdldCxcclxuICAgICAgICBsZXZlbDogbnVtYmVyLFxyXG4gICAgICAgIHdpZHRoOiBudW1iZXIsXHJcbiAgICAgICAgaGVpZ2h0OiBudW1iZXIsXHJcbiAgICAgICAgdW5jb21wcmVzc2VkQnl0ZUxlbmd0aDogbnVtYmVyLFxyXG4gICAgICAgIGt0eDJSZWFkZXI6IEtUWDJGaWxlUmVhZGVyLFxyXG4gICAgICAgIGltYWdlRGVzYzogSUtUWDJfSW1hZ2VEZXNjIHwgbnVsbCxcclxuICAgICAgICBlbmNvZGVkRGF0YTogVWludDhBcnJheVxyXG4gICAgKTogUHJvbWlzZTxVaW50OEFycmF5IHwgbnVsbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkTW9kdWxlKCkudGhlbigobW9kdWxlV3JhcHBlcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zY29kZXI6IGFueSA9IG1vZHVsZVdyYXBwZXIubW9kdWxlO1xyXG4gICAgICAgICAgICBjb25zdCBbdGV4dHVyZVZpZXcsIHVuY29tcHJlc3NlZFRleHR1cmVWaWV3LCBuQmxvY2tzXSA9IHRoaXMuX3ByZXBhcmVUcmFuc2NvZGluZyh3aWR0aCwgaGVpZ2h0LCB1bmNvbXByZXNzZWRCeXRlTGVuZ3RoLCBlbmNvZGVkRGF0YSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdHJhbnNjb2Rlci50cmFuc2NvZGUobkJsb2NrcykgPT09IDAgPyAodGhpcy5fdHJhbnNjb2RlSW5QbGFjZSA/IHRleHR1cmVWaWV3LnNsaWNlKCkgOiB1bmNvbXByZXNzZWRUZXh0dXJlVmlldyEuc2xpY2UoKSkgOiBudWxsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfcHJlcGFyZVRyYW5zY29kaW5nKFxyXG4gICAgICAgIHdpZHRoOiBudW1iZXIsXHJcbiAgICAgICAgaGVpZ2h0OiBudW1iZXIsXHJcbiAgICAgICAgdW5jb21wcmVzc2VkQnl0ZUxlbmd0aDogbnVtYmVyLFxyXG4gICAgICAgIGVuY29kZWREYXRhOiBVaW50OEFycmF5LFxyXG4gICAgICAgIHVuY29tcHJlc3NlZE51bUNvbXBvbmVudHM/OiBudW1iZXJcclxuICAgICk6IFtVaW50OEFycmF5LCBVaW50OEFycmF5IHwgbnVsbCwgbnVtYmVyXSB7XHJcbiAgICAgICAgY29uc3QgbkJsb2NrcyA9ICgod2lkdGggKyAzKSA+PiAyKSAqICgoaGVpZ2h0ICsgMykgPj4gMik7XHJcblxyXG4gICAgICAgIGlmICh1bmNvbXByZXNzZWROdW1Db21wb25lbnRzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdW5jb21wcmVzc2VkQnl0ZUxlbmd0aCA9IHdpZHRoICogKChoZWlnaHQgKyAzKSA+PiAyKSAqIDQgKiB1bmNvbXByZXNzZWROdW1Db21wb25lbnRzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGV4TWVtb3J5UGFnZXMgPSAoKG5CbG9ja3MgKiAxNiArIDY1NTM1ICsgKHRoaXMuX3RyYW5zY29kZUluUGxhY2UgPyAwIDogdW5jb21wcmVzc2VkQnl0ZUxlbmd0aCkpID4+IDE2KSArIDE7XHJcblxyXG4gICAgICAgIGNvbnN0IHRleHR1cmVWaWV3ID0gdGhpcy5tZW1vcnlNYW5hZ2VyLmdldE1lbW9yeVZpZXcodGV4TWVtb3J5UGFnZXMsIDY1NTM2LCBuQmxvY2tzICogMTYpO1xyXG5cclxuICAgICAgICBjb25zdCB1bmNvbXByZXNzZWRUZXh0dXJlVmlldyA9IHRoaXMuX3RyYW5zY29kZUluUGxhY2VcclxuICAgICAgICAgICAgPyBudWxsXHJcbiAgICAgICAgICAgIDogbmV3IFVpbnQ4QXJyYXkoXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX21lbW9yeU1hbmFnZXIud2FzbU1lbW9yeS5idWZmZXIsXHJcbiAgICAgICAgICAgICAgICAgIDY1NTM2ICsgbkJsb2NrcyAqIDE2LFxyXG4gICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWROdW1Db21wb25lbnRzICE9PSB1bmRlZmluZWQgPyB3aWR0aCAqIGhlaWdodCAqIHVuY29tcHJlc3NlZE51bUNvbXBvbmVudHMgOiB1bmNvbXByZXNzZWRCeXRlTGVuZ3RoXHJcbiAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGV4dHVyZVZpZXcuc2V0KGVuY29kZWREYXRhKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFt0ZXh0dXJlVmlldywgdW5jb21wcmVzc2VkVGV4dHVyZVZpZXcsIG5CbG9ja3NdO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCAqIGFzIEtUWDIgZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL2t0eDJkZWNvZGVyVHlwZXNcIjtcclxuXHJcbmltcG9ydCB7IExpdGVUcmFuc2NvZGVyIH0gZnJvbSBcIi4vbGl0ZVRyYW5zY29kZXJcIjtcclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cclxuZXhwb3J0IGNsYXNzIExpdGVUcmFuc2NvZGVyX1VBU1RDX0FTVEMgZXh0ZW5kcyBMaXRlVHJhbnNjb2RlciB7XHJcbiAgICAvKipcclxuICAgICAqIFVSTCB0byB1c2Ugd2hlbiBsb2FkaW5nIHRoZSB3YXNtIG1vZHVsZSBmb3IgdGhlIHRyYW5zY29kZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBXYXNtTW9kdWxlVVJMID0gXCJodHRwczovL2Nkbi5iYWJ5bG9uanMuY29tL2t0eDJUcmFuc2NvZGVycy8xL3Vhc3RjX2FzdGMud2FzbVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQmluYXJ5IGRhdGEgb2YgdGhlIHdhc20gbW9kdWxlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgV2FzbUJpbmFyeTogQXJyYXlCdWZmZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIENhblRyYW5zY29kZShzcmM6IEtUWDIuU291cmNlVGV4dHVyZUZvcm1hdCwgZHN0OiBLVFgyLlRyYW5zY29kZVRhcmdldCwgaXNJbkdhbW1hU3BhY2U6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gc3JjID09PSBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXQuVUFTVEM0eDQgJiYgZHN0ID09PSBLVFgyLlRyYW5zY29kZVRhcmdldC5BU1RDXzRYNF9SR0JBO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgTmFtZSA9IFwiVW5pdmVyc2FsVHJhbnNjb2Rlcl9VQVNUQ19BU1RDXCI7XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIGdldE5hbWUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gTGl0ZVRyYW5zY29kZXJfVUFTVENfQVNUQy5OYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSBpbml0aWFsaXplKCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLmluaXRpYWxpemUoKTtcclxuICAgICAgICB0aGlzLnNldE1vZHVsZVBhdGgoTGl0ZVRyYW5zY29kZXJfVUFTVENfQVNUQy5XYXNtTW9kdWxlVVJMLCBMaXRlVHJhbnNjb2Rlcl9VQVNUQ19BU1RDLldhc21CaW5hcnkpO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCAqIGFzIEtUWDIgZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL2t0eDJkZWNvZGVyVHlwZXNcIjtcclxuXHJcbmltcG9ydCB7IExpdGVUcmFuc2NvZGVyIH0gZnJvbSBcIi4vbGl0ZVRyYW5zY29kZXJcIjtcclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cclxuZXhwb3J0IGNsYXNzIExpdGVUcmFuc2NvZGVyX1VBU1RDX0JDNyBleHRlbmRzIExpdGVUcmFuc2NvZGVyIHtcclxuICAgIC8qKlxyXG4gICAgICogVVJMIHRvIHVzZSB3aGVuIGxvYWRpbmcgdGhlIHdhc20gbW9kdWxlIGZvciB0aGUgdHJhbnNjb2RlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFdhc21Nb2R1bGVVUkwgPSBcImh0dHBzOi8vY2RuLmJhYnlsb25qcy5jb20va3R4MlRyYW5zY29kZXJzLzEvdWFzdGNfYmM3Lndhc21cIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEJpbmFyeSBkYXRhIG9mIHRoZSB3YXNtIG1vZHVsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFdhc21CaW5hcnk6IEFycmF5QnVmZmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBDYW5UcmFuc2NvZGUoc3JjOiBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXQsIGRzdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQsIGlzSW5HYW1tYVNwYWNlOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHNyYyA9PT0gS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LlVBU1RDNHg0ICYmIGRzdCA9PT0gS1RYMi5UcmFuc2NvZGVUYXJnZXQuQkM3X1JHQkE7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBOYW1lID0gXCJVbml2ZXJzYWxUcmFuc2NvZGVyX1VBU1RDX0JDN1wiO1xyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSBnZXROYW1lKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIExpdGVUcmFuc2NvZGVyX1VBU1RDX0JDNy5OYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSBpbml0aWFsaXplKCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLmluaXRpYWxpemUoKTtcclxuICAgICAgICB0aGlzLnNldE1vZHVsZVBhdGgoTGl0ZVRyYW5zY29kZXJfVUFTVENfQkM3Lldhc21Nb2R1bGVVUkwsIExpdGVUcmFuc2NvZGVyX1VBU1RDX0JDNy5XYXNtQmluYXJ5KTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgKiBhcyBLVFgyIGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9rdHgyZGVjb2RlclR5cGVzXCI7XHJcblxyXG5pbXBvcnQgeyBMaXRlVHJhbnNjb2RlciB9IGZyb20gXCIuL2xpdGVUcmFuc2NvZGVyXCI7XHJcbmltcG9ydCB0eXBlIHsgS1RYMkZpbGVSZWFkZXIsIElLVFgyX0ltYWdlRGVzYyB9IGZyb20gXCIuLi9rdHgyRmlsZVJlYWRlclwiO1xyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxyXG5leHBvcnQgY2xhc3MgTGl0ZVRyYW5zY29kZXJfVUFTVENfUjhfVU5PUk0gZXh0ZW5kcyBMaXRlVHJhbnNjb2RlciB7XHJcbiAgICAvKipcclxuICAgICAqIFVSTCB0byB1c2Ugd2hlbiBsb2FkaW5nIHRoZSB3YXNtIG1vZHVsZSBmb3IgdGhlIHRyYW5zY29kZXIgKHVub3JtKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFdhc21Nb2R1bGVVUkwgPSBcImh0dHBzOi8vY2RuLmJhYnlsb25qcy5jb20va3R4MlRyYW5zY29kZXJzLzEvdWFzdGNfcjhfdW5vcm0ud2FzbVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQmluYXJ5IGRhdGEgb2YgdGhlIHdhc20gbW9kdWxlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgV2FzbUJpbmFyeTogQXJyYXlCdWZmZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIENhblRyYW5zY29kZShzcmM6IEtUWDIuU291cmNlVGV4dHVyZUZvcm1hdCwgZHN0OiBLVFgyLlRyYW5zY29kZVRhcmdldCwgaXNJbkdhbW1hU3BhY2U6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gc3JjID09PSBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXQuVUFTVEM0eDQgJiYgZHN0ID09PSBLVFgyLlRyYW5zY29kZVRhcmdldC5SODtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIE5hbWUgPSBcIlVuaXZlcnNhbFRyYW5zY29kZXJfVUFTVENfUjhfVU5PUk1cIjtcclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0TmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBMaXRlVHJhbnNjb2Rlcl9VQVNUQ19SOF9VTk9STS5OYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSBpbml0aWFsaXplKCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLmluaXRpYWxpemUoKTtcclxuICAgICAgICB0aGlzLl90cmFuc2NvZGVJblBsYWNlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZXRNb2R1bGVQYXRoKExpdGVUcmFuc2NvZGVyX1VBU1RDX1I4X1VOT1JNLldhc21Nb2R1bGVVUkwsIExpdGVUcmFuc2NvZGVyX1VBU1RDX1I4X1VOT1JNLldhc21CaW5hcnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSB0cmFuc2NvZGUoXHJcbiAgICAgICAgc3JjOiBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXQsXHJcbiAgICAgICAgZHN0OiBLVFgyLlRyYW5zY29kZVRhcmdldCxcclxuICAgICAgICBsZXZlbDogbnVtYmVyLFxyXG4gICAgICAgIHdpZHRoOiBudW1iZXIsXHJcbiAgICAgICAgaGVpZ2h0OiBudW1iZXIsXHJcbiAgICAgICAgdW5jb21wcmVzc2VkQnl0ZUxlbmd0aDogbnVtYmVyLFxyXG4gICAgICAgIGt0eDJSZWFkZXI6IEtUWDJGaWxlUmVhZGVyLFxyXG4gICAgICAgIGltYWdlRGVzYzogSUtUWDJfSW1hZ2VEZXNjIHwgbnVsbCxcclxuICAgICAgICBlbmNvZGVkRGF0YTogVWludDhBcnJheVxyXG4gICAgKTogUHJvbWlzZTxVaW50OEFycmF5IHwgbnVsbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkTW9kdWxlKCkudGhlbigobW9kdWxlV3JhcHBlcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zY29kZXI6IGFueSA9IG1vZHVsZVdyYXBwZXIubW9kdWxlO1xyXG4gICAgICAgICAgICBjb25zdCBbLCB1bmNvbXByZXNzZWRUZXh0dXJlVmlld10gPSB0aGlzLl9wcmVwYXJlVHJhbnNjb2Rpbmcod2lkdGgsIGhlaWdodCwgdW5jb21wcmVzc2VkQnl0ZUxlbmd0aCwgZW5jb2RlZERhdGEsIDEpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRyYW5zY29kZXIuZGVjb2RlKHdpZHRoLCBoZWlnaHQpID09PSAwID8gdW5jb21wcmVzc2VkVGV4dHVyZVZpZXchLnNsaWNlKCkgOiBudWxsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCAqIGFzIEtUWDIgZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL2t0eDJkZWNvZGVyVHlwZXNcIjtcclxuXHJcbmltcG9ydCB7IExpdGVUcmFuc2NvZGVyIH0gZnJvbSBcIi4vbGl0ZVRyYW5zY29kZXJcIjtcclxuaW1wb3J0IHR5cGUgeyBLVFgyRmlsZVJlYWRlciwgSUtUWDJfSW1hZ2VEZXNjIH0gZnJvbSBcIi4uL2t0eDJGaWxlUmVhZGVyXCI7XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXHJcbmV4cG9ydCBjbGFzcyBMaXRlVHJhbnNjb2Rlcl9VQVNUQ19SRzhfVU5PUk0gZXh0ZW5kcyBMaXRlVHJhbnNjb2RlciB7XHJcbiAgICAvKipcclxuICAgICAqIFVSTCB0byB1c2Ugd2hlbiBsb2FkaW5nIHRoZSB3YXNtIG1vZHVsZSBmb3IgdGhlIHRyYW5zY29kZXIgKHVub3JtKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFdhc21Nb2R1bGVVUkwgPSBcImh0dHBzOi8vY2RuLmJhYnlsb25qcy5jb20va3R4MlRyYW5zY29kZXJzLzEvdWFzdGNfcmc4X3Vub3JtLndhc21cIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEJpbmFyeSBkYXRhIG9mIHRoZSB3YXNtIG1vZHVsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFdhc21CaW5hcnk6IEFycmF5QnVmZmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBDYW5UcmFuc2NvZGUoc3JjOiBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXQsIGRzdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQsIGlzSW5HYW1tYVNwYWNlOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHNyYyA9PT0gS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LlVBU1RDNHg0ICYmIGRzdCA9PT0gS1RYMi5UcmFuc2NvZGVUYXJnZXQuUkc4O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgTmFtZSA9IFwiVW5pdmVyc2FsVHJhbnNjb2Rlcl9VQVNUQ19SRzhfVU5PUk1cIjtcclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0TmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBMaXRlVHJhbnNjb2Rlcl9VQVNUQ19SRzhfVU5PUk0uTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNjb2RlSW5QbGFjZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2V0TW9kdWxlUGF0aChMaXRlVHJhbnNjb2Rlcl9VQVNUQ19SRzhfVU5PUk0uV2FzbU1vZHVsZVVSTCwgTGl0ZVRyYW5zY29kZXJfVUFTVENfUkc4X1VOT1JNLldhc21CaW5hcnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSB0cmFuc2NvZGUoXHJcbiAgICAgICAgc3JjOiBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXQsXHJcbiAgICAgICAgZHN0OiBLVFgyLlRyYW5zY29kZVRhcmdldCxcclxuICAgICAgICBsZXZlbDogbnVtYmVyLFxyXG4gICAgICAgIHdpZHRoOiBudW1iZXIsXHJcbiAgICAgICAgaGVpZ2h0OiBudW1iZXIsXHJcbiAgICAgICAgdW5jb21wcmVzc2VkQnl0ZUxlbmd0aDogbnVtYmVyLFxyXG4gICAgICAgIGt0eDJSZWFkZXI6IEtUWDJGaWxlUmVhZGVyLFxyXG4gICAgICAgIGltYWdlRGVzYzogSUtUWDJfSW1hZ2VEZXNjIHwgbnVsbCxcclxuICAgICAgICBlbmNvZGVkRGF0YTogVWludDhBcnJheVxyXG4gICAgKTogUHJvbWlzZTxVaW50OEFycmF5IHwgbnVsbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkTW9kdWxlKCkudGhlbigobW9kdWxlV3JhcHBlcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zY29kZXI6IGFueSA9IG1vZHVsZVdyYXBwZXIubW9kdWxlO1xyXG4gICAgICAgICAgICBjb25zdCBbLCB1bmNvbXByZXNzZWRUZXh0dXJlVmlld10gPSB0aGlzLl9wcmVwYXJlVHJhbnNjb2Rpbmcod2lkdGgsIGhlaWdodCwgdW5jb21wcmVzc2VkQnl0ZUxlbmd0aCwgZW5jb2RlZERhdGEsIDIpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRyYW5zY29kZXIuZGVjb2RlKHdpZHRoLCBoZWlnaHQpID09PSAwID8gdW5jb21wcmVzc2VkVGV4dHVyZVZpZXchLnNsaWNlKCkgOiBudWxsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCAqIGFzIEtUWDIgZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL2t0eDJkZWNvZGVyVHlwZXNcIjtcclxuXHJcbmltcG9ydCB7IExpdGVUcmFuc2NvZGVyIH0gZnJvbSBcIi4vbGl0ZVRyYW5zY29kZXJcIjtcclxuaW1wb3J0IHR5cGUgeyBLVFgyRmlsZVJlYWRlciwgSUtUWDJfSW1hZ2VEZXNjIH0gZnJvbSBcIi4uL2t0eDJGaWxlUmVhZGVyXCI7XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXHJcbmV4cG9ydCBjbGFzcyBMaXRlVHJhbnNjb2Rlcl9VQVNUQ19SR0JBX1NSR0IgZXh0ZW5kcyBMaXRlVHJhbnNjb2RlciB7XHJcbiAgICAvKipcclxuICAgICAqIFVSTCB0byB1c2Ugd2hlbiBsb2FkaW5nIHRoZSB3YXNtIG1vZHVsZSBmb3IgdGhlIHRyYW5zY29kZXIgKHNyZ2IpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgV2FzbU1vZHVsZVVSTCA9IFwiaHR0cHM6Ly9jZG4uYmFieWxvbmpzLmNvbS9rdHgyVHJhbnNjb2RlcnMvMS91YXN0Y19yZ2JhOF9zcmdiX3YyLndhc21cIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEJpbmFyeSBkYXRhIG9mIHRoZSB3YXNtIG1vZHVsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFdhc21CaW5hcnk6IEFycmF5QnVmZmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBDYW5UcmFuc2NvZGUoc3JjOiBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXQsIGRzdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQsIGlzSW5HYW1tYVNwYWNlOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHNyYyA9PT0gS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LlVBU1RDNHg0ICYmIGRzdCA9PT0gS1RYMi5UcmFuc2NvZGVUYXJnZXQuUkdCQTMyICYmIGlzSW5HYW1tYVNwYWNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgTmFtZSA9IFwiVW5pdmVyc2FsVHJhbnNjb2Rlcl9VQVNUQ19SR0JBX1NSR0JcIjtcclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0TmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBMaXRlVHJhbnNjb2Rlcl9VQVNUQ19SR0JBX1NSR0IuTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNjb2RlSW5QbGFjZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2V0TW9kdWxlUGF0aChMaXRlVHJhbnNjb2Rlcl9VQVNUQ19SR0JBX1NSR0IuV2FzbU1vZHVsZVVSTCwgTGl0ZVRyYW5zY29kZXJfVUFTVENfUkdCQV9TUkdCLldhc21CaW5hcnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSB0cmFuc2NvZGUoXHJcbiAgICAgICAgc3JjOiBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXQsXHJcbiAgICAgICAgZHN0OiBLVFgyLlRyYW5zY29kZVRhcmdldCxcclxuICAgICAgICBsZXZlbDogbnVtYmVyLFxyXG4gICAgICAgIHdpZHRoOiBudW1iZXIsXHJcbiAgICAgICAgaGVpZ2h0OiBudW1iZXIsXHJcbiAgICAgICAgdW5jb21wcmVzc2VkQnl0ZUxlbmd0aDogbnVtYmVyLFxyXG4gICAgICAgIGt0eDJSZWFkZXI6IEtUWDJGaWxlUmVhZGVyLFxyXG4gICAgICAgIGltYWdlRGVzYzogSUtUWDJfSW1hZ2VEZXNjIHwgbnVsbCxcclxuICAgICAgICBlbmNvZGVkRGF0YTogVWludDhBcnJheVxyXG4gICAgKTogUHJvbWlzZTxVaW50OEFycmF5IHwgbnVsbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkTW9kdWxlKCkudGhlbigobW9kdWxlV3JhcHBlcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zY29kZXI6IGFueSA9IG1vZHVsZVdyYXBwZXIubW9kdWxlO1xyXG4gICAgICAgICAgICBjb25zdCBbLCB1bmNvbXByZXNzZWRUZXh0dXJlVmlld10gPSB0aGlzLl9wcmVwYXJlVHJhbnNjb2Rpbmcod2lkdGgsIGhlaWdodCwgdW5jb21wcmVzc2VkQnl0ZUxlbmd0aCwgZW5jb2RlZERhdGEsIDQpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRyYW5zY29kZXIuZGVjb2RlKHdpZHRoLCBoZWlnaHQpID09PSAwID8gdW5jb21wcmVzc2VkVGV4dHVyZVZpZXchLnNsaWNlKCkgOiBudWxsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCAqIGFzIEtUWDIgZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL2t0eDJkZWNvZGVyVHlwZXNcIjtcclxuXHJcbmltcG9ydCB7IExpdGVUcmFuc2NvZGVyIH0gZnJvbSBcIi4vbGl0ZVRyYW5zY29kZXJcIjtcclxuaW1wb3J0IHR5cGUgeyBLVFgyRmlsZVJlYWRlciwgSUtUWDJfSW1hZ2VEZXNjIH0gZnJvbSBcIi4uL2t0eDJGaWxlUmVhZGVyXCI7XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXHJcbmV4cG9ydCBjbGFzcyBMaXRlVHJhbnNjb2Rlcl9VQVNUQ19SR0JBX1VOT1JNIGV4dGVuZHMgTGl0ZVRyYW5zY29kZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBVUkwgdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgd2FzbSBtb2R1bGUgZm9yIHRoZSB0cmFuc2NvZGVyICh1bm9ybSlcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBXYXNtTW9kdWxlVVJMID0gXCJodHRwczovL2Nkbi5iYWJ5bG9uanMuY29tL2t0eDJUcmFuc2NvZGVycy8xL3Vhc3RjX3JnYmE4X3Vub3JtX3YyLndhc21cIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEJpbmFyeSBkYXRhIG9mIHRoZSB3YXNtIG1vZHVsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFdhc21CaW5hcnk6IEFycmF5QnVmZmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBDYW5UcmFuc2NvZGUoc3JjOiBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXQsIGRzdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQsIGlzSW5HYW1tYVNwYWNlOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHNyYyA9PT0gS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LlVBU1RDNHg0ICYmIGRzdCA9PT0gS1RYMi5UcmFuc2NvZGVUYXJnZXQuUkdCQTMyICYmICFpc0luR2FtbWFTcGFjZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIE5hbWUgPSBcIlVuaXZlcnNhbFRyYW5zY29kZXJfVUFTVENfUkdCQV9VTk9STVwiO1xyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSBnZXROYW1lKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIExpdGVUcmFuc2NvZGVyX1VBU1RDX1JHQkFfVU5PUk0uTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNjb2RlSW5QbGFjZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2V0TW9kdWxlUGF0aChMaXRlVHJhbnNjb2Rlcl9VQVNUQ19SR0JBX1VOT1JNLldhc21Nb2R1bGVVUkwsIExpdGVUcmFuc2NvZGVyX1VBU1RDX1JHQkFfVU5PUk0uV2FzbUJpbmFyeSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIHRyYW5zY29kZShcclxuICAgICAgICBzcmM6IEtUWDIuU291cmNlVGV4dHVyZUZvcm1hdCxcclxuICAgICAgICBkc3Q6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LFxyXG4gICAgICAgIGxldmVsOiBudW1iZXIsXHJcbiAgICAgICAgd2lkdGg6IG51bWJlcixcclxuICAgICAgICBoZWlnaHQ6IG51bWJlcixcclxuICAgICAgICB1bmNvbXByZXNzZWRCeXRlTGVuZ3RoOiBudW1iZXIsXHJcbiAgICAgICAga3R4MlJlYWRlcjogS1RYMkZpbGVSZWFkZXIsXHJcbiAgICAgICAgaW1hZ2VEZXNjOiBJS1RYMl9JbWFnZURlc2MgfCBudWxsLFxyXG4gICAgICAgIGVuY29kZWREYXRhOiBVaW50OEFycmF5XHJcbiAgICApOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCBudWxsPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRNb2R1bGUoKS50aGVuKChtb2R1bGVXcmFwcGVyOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdHJhbnNjb2RlcjogYW55ID0gbW9kdWxlV3JhcHBlci5tb2R1bGU7XHJcbiAgICAgICAgICAgIGNvbnN0IFssIHVuY29tcHJlc3NlZFRleHR1cmVWaWV3XSA9IHRoaXMuX3ByZXBhcmVUcmFuc2NvZGluZyh3aWR0aCwgaGVpZ2h0LCB1bmNvbXByZXNzZWRCeXRlTGVuZ3RoLCBlbmNvZGVkRGF0YSwgNCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdHJhbnNjb2Rlci5kZWNvZGUod2lkdGgsIGhlaWdodCkgPT09IDAgPyB1bmNvbXByZXNzZWRUZXh0dXJlVmlldyEuc2xpY2UoKSA6IG51bGw7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0ICogYXMgS1RYMiBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMva3R4MmRlY29kZXJUeXBlc1wiO1xyXG5cclxuaW1wb3J0IHsgVHJhbnNjb2RlciB9IGZyb20gXCIuLi90cmFuc2NvZGVyXCI7XHJcbmltcG9ydCB0eXBlIHsgS1RYMkZpbGVSZWFkZXIsIElLVFgyX0ltYWdlRGVzYyB9IGZyb20gXCIuLi9rdHgyRmlsZVJlYWRlclwiO1xyXG5pbXBvcnQgeyBXQVNNTWVtb3J5TWFuYWdlciB9IGZyb20gXCIuLi93YXNtTWVtb3J5TWFuYWdlclwiO1xyXG5cclxuZGVjbGFyZSBsZXQgTVNDX1RSQU5TQ09ERVI6IGFueTtcclxuXHJcbmRlY2xhcmUgZnVuY3Rpb24gaW1wb3J0U2NyaXB0cyguLi51cmxzOiBzdHJpbmdbXSk6IHZvaWQ7XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTVNDVHJhbnNjb2RlciBleHRlbmRzIFRyYW5zY29kZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBVUkwgdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgTVNDIHRyYW5zY29kZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBKU01vZHVsZVVSTCA9IFwiaHR0cHM6Ly9jZG4uYmFieWxvbmpzLmNvbS9rdHgyVHJhbnNjb2RlcnMvMS9tc2NfYmFzaXNfdHJhbnNjb2Rlci5qc1wiO1xyXG4gICAgLyoqXHJcbiAgICAgKiBVUkwgdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgd2FzbSBtb2R1bGUgZm9yIHRoZSB0cmFuc2NvZGVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgV2FzbU1vZHVsZVVSTCA9IFwiaHR0cHM6Ly9jZG4uYmFieWxvbmpzLmNvbS9rdHgyVHJhbnNjb2RlcnMvMS9tc2NfYmFzaXNfdHJhbnNjb2Rlci53YXNtXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCaW5hcnkgZGF0YSBvZiB0aGUgd2FzbSBtb2R1bGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBXYXNtQmluYXJ5OiBBcnJheUJ1ZmZlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTVNDIHRyYW5zY29kZXIgbW9kdWxlLCBpZiBwcm92aWRlZCBleHRlcm5hbGx5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgSlNNb2R1bGU6IGFueSA9IG51bGw7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBVc2VGcm9tV29ya2VyVGhyZWFkID0gdHJ1ZTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIE5hbWUgPSBcIk1TQ1RyYW5zY29kZXJcIjtcclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0TmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBNU0NUcmFuc2NvZGVyLk5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbXNjQmFzaXNUcmFuc2NvZGVyUHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcclxuICAgIHByaXZhdGUgX21zY0Jhc2lzTW9kdWxlOiBhbnk7XHJcblxyXG4gICAgcHJpdmF0ZSBfZ2V0TVNDQmFzaXNUcmFuc2NvZGVyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmICh0aGlzLl9tc2NCYXNpc1RyYW5zY29kZXJQcm9taXNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tc2NCYXNpc1RyYW5zY29kZXJQcm9taXNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fbXNjQmFzaXNUcmFuc2NvZGVyUHJvbWlzZSA9IChcclxuICAgICAgICAgICAgTVNDVHJhbnNjb2Rlci5XYXNtQmluYXJ5ID8gUHJvbWlzZS5yZXNvbHZlKE1TQ1RyYW5zY29kZXIuV2FzbUJpbmFyeSkgOiBXQVNNTWVtb3J5TWFuYWdlci5Mb2FkV0FTTShUcmFuc2NvZGVyLkdldFdhc21VcmwoTVNDVHJhbnNjb2Rlci5XYXNtTW9kdWxlVVJMKSlcclxuICAgICAgICApLnRoZW4oKHdhc21CaW5hcnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKE1TQ1RyYW5zY29kZXIuSlNNb2R1bGUgJiYgdHlwZW9mIE1TQ19UUkFOU0NPREVSID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzIG11c3QgYmUgc2V0IG9uIHRoZSBnbG9iYWwgc2NvcGUgZm9yIHRoZSBNU0MgdHJhbnNjb2RlciB0byB3b3JrLiBNYWlubHkgZHVlIHRvIGJhY2stY29tcGF0IHdpdGggdGhlIG9sZCB3YXkgb2YgbG9hZGluZyB0aGUgTVNDIHRyYW5zY29kZXIuXHJcbiAgICAgICAgICAgICAgICAoZ2xvYmFsVGhpcyBhcyBhbnkpLk1TQ19UUkFOU0NPREVSID0gTVNDVHJhbnNjb2Rlci5KU01vZHVsZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChNU0NUcmFuc2NvZGVyLlVzZUZyb21Xb3JrZXJUaHJlYWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRTY3JpcHRzKFRyYW5zY29kZXIuR2V0V2FzbVVybChNU0NUcmFuc2NvZGVyLkpTTW9kdWxlVVJMKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBXb3JrZXIgTnVtYmVyID0gMCBhbmQgTVNDX1RSQU5TQ09ERVIgaGFzIG5vdCBiZWVuIGxvYWRlZCB5ZXQuXHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgTVNDX1RSQU5TQ09ERVIgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQuc2V0QXR0cmlidXRlKFwidHlwZVwiLCBcInRleHQvamF2YXNjcmlwdFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0LnNldEF0dHJpYnV0ZShcInNyY1wiLCBUcmFuc2NvZGVyLkdldFdhc21VcmwoTVNDVHJhbnNjb2Rlci5KU01vZHVsZVVSTCkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmVuc2l2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBNU0NfVFJBTlNDT0RFUiA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChcIk1TQ19UUkFOU0NPREVSIHNjcmlwdCBsb2FkZWQgYnV0IE1TQ19UUkFOU0NPREVSIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1TQ19UUkFOU0NPREVSIGFzIGFueSkoeyB3YXNtQmluYXJ5IH0pLnRoZW4oKGJhc2lzTW9kdWxlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpc01vZHVsZS5pbml0VHJhbnNjb2RlcnMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tc2NCYXNpc01vZHVsZSA9IGJhc2lzTW9kdWxlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoXCJDYW4gbm90IGxvYWQgTVNDX1RSQU5TQ09ERVIgc2NyaXB0LlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBNU0NfVFJBTlNDT0RFUih7IHdhc21CaW5hcnkgfSkudGhlbigoYmFzaXNNb2R1bGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGJhc2lzTW9kdWxlLmluaXRUcmFuc2NvZGVycygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21zY0Jhc2lzTW9kdWxlID0gYmFzaXNNb2R1bGU7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbXNjQmFzaXNUcmFuc2NvZGVyUHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIENhblRyYW5zY29kZShzcmM6IEtUWDIuU291cmNlVGV4dHVyZUZvcm1hdCwgZHN0OiBLVFgyLlRyYW5zY29kZVRhcmdldCwgaXNJbkdhbW1hU3BhY2U6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgdHJhbnNjb2RlKFxyXG4gICAgICAgIHNyYzogS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LFxyXG4gICAgICAgIGRzdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQsXHJcbiAgICAgICAgbGV2ZWw6IG51bWJlcixcclxuICAgICAgICB3aWR0aDogbnVtYmVyLFxyXG4gICAgICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgICAgIHVuY29tcHJlc3NlZEJ5dGVMZW5ndGg6IG51bWJlcixcclxuICAgICAgICBrdHgyUmVhZGVyOiBLVFgyRmlsZVJlYWRlcixcclxuICAgICAgICBpbWFnZURlc2M6IElLVFgyX0ltYWdlRGVzYyB8IG51bGwsXHJcbiAgICAgICAgZW5jb2RlZERhdGE6IFVpbnQ4QXJyYXlcclxuICAgICk6IFByb21pc2U8VWludDhBcnJheSB8IG51bGw+IHtcclxuICAgICAgICBjb25zdCBpc1ZpZGVvID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRNU0NCYXNpc1RyYW5zY29kZXIoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgYmFzaXNNb2R1bGUgPSB0aGlzLl9tc2NCYXNpc01vZHVsZTtcclxuXHJcbiAgICAgICAgICAgIGxldCB0cmFuc2NvZGVyOiBhbnk7XHJcbiAgICAgICAgICAgIGxldCBpbWFnZUluZm86IGFueTtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdDogYW55O1xyXG4gICAgICAgICAgICBsZXQgdGV4dHVyZURhdGE6IGFueSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdHJhbnNjb2RlciA9IHNyYyA9PT0gS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LlVBU1RDNHg0ID8gbmV3IGJhc2lzTW9kdWxlLlVhc3RjSW1hZ2VUcmFuc2NvZGVyKCkgOiBuZXcgYmFzaXNNb2R1bGUuQmFzaXNMekV0YzFzSW1hZ2VUcmFuc2NvZGVyKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXhGb3JtYXQgPSBzcmMgPT09IEtUWDIuU291cmNlVGV4dHVyZUZvcm1hdC5VQVNUQzR4NCA/IGJhc2lzTW9kdWxlLlRleHR1cmVGb3JtYXQuVUFTVEM0eDQgOiBiYXNpc01vZHVsZS5UZXh0dXJlRm9ybWF0LkVUQzFTO1xyXG5cclxuICAgICAgICAgICAgICAgIGltYWdlSW5mbyA9IG5ldyBiYXNpc01vZHVsZS5JbWFnZUluZm8odGV4Rm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBsZXZlbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0Rm9ybWF0ID0gYmFzaXNNb2R1bGUuVHJhbnNjb2RlVGFyZ2V0W0tUWDIuVHJhbnNjb2RlVGFyZ2V0W2RzdF1dOyAvLyB3b3JrcyBiZWNhdXNlIHRoZSBsYWJlbHMgb2YgdGhlIHNvdXJjZVRleHR1cmVGb3JtYXQgZW51bSBhcmUgdGhlIHNhbWUgYXMgdGhlIHByb3BlcnR5IG5hbWVzIHVzZWQgaW4gVHJhbnNjb2RlVGFyZ2V0IVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICghYmFzaXNNb2R1bGUuaXNGb3JtYXRTdXBwb3J0ZWQodGFyZ2V0Rm9ybWF0LCB0ZXhGb3JtYXQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgTVNDVHJhbnNjb2RlcjogVHJhbnNjb2RpbmcgZnJvbSBcIiR7S1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0W3NyY119XCIgdG8gXCIke0tUWDIuVHJhbnNjb2RlVGFyZ2V0W2RzdF19XCIgbm90IHN1cHBvcnRlZCBieSBjdXJyZW50IHRyYW5zY29kZXIgYnVpbGQuYFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNyYyA9PT0gS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LkVUQzFTKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2dkID0ga3R4MlJlYWRlci5zdXBlcmNvbXByZXNzaW9uR2xvYmFsRGF0YTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2Rlci5kZWNvZGVQYWxldHRlcyhzZ2QuZW5kcG9pbnRDb3VudCwgc2dkLmVuZHBvaW50c0RhdGEsIHNnZC5zZWxlY3RvckNvdW50LCBzZ2Quc2VsZWN0b3JzRGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2Rlci5kZWNvZGVUYWJsZXMoc2dkLnRhYmxlc0RhdGEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8uZmxhZ3MgPSBpbWFnZURlc2MhLmltYWdlRmxhZ3M7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLnJnYkJ5dGVPZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby5yZ2JCeXRlTGVuZ3RoID0gaW1hZ2VEZXNjIS5yZ2JTbGljZUJ5dGVMZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLmFscGhhQnl0ZU9mZnNldCA9IGltYWdlRGVzYyEuYWxwaGFTbGljZUJ5dGVPZmZzZXQgPiAwID8gaW1hZ2VEZXNjIS5yZ2JTbGljZUJ5dGVMZW5ndGggOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby5hbHBoYUJ5dGVMZW5ndGggPSBpbWFnZURlc2MhLmFscGhhU2xpY2VCeXRlTGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cmFuc2NvZGVyLnRyYW5zY29kZUltYWdlKHRhcmdldEZvcm1hdCwgZW5jb2RlZERhdGEsIGltYWdlSW5mbywgMCwgaXNWaWRlbyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby5mbGFncyA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLnJnYkJ5dGVPZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby5yZ2JCeXRlTGVuZ3RoID0gdW5jb21wcmVzc2VkQnl0ZUxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8uYWxwaGFCeXRlT2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8uYWxwaGFCeXRlTGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJhbnNjb2Rlci50cmFuc2NvZGVJbWFnZSh0YXJnZXRGb3JtYXQsIGVuY29kZWREYXRhLCBpbWFnZUluZm8sIDAsIGt0eDJSZWFkZXIuaGFzQWxwaGEsIGlzVmlkZW8pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zY29kZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2NvZGVyLmRlbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpbWFnZUluZm8pIHtcclxuICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8uZGVsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQudHJhbnNjb2RlZEltYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZURhdGEgPSByZXN1bHQudHJhbnNjb2RlZEltYWdlLmdldF90eXBlZF9tZW1vcnlfdmlldygpLnNsaWNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnRyYW5zY29kZWRJbWFnZS5kZWxldGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRleHR1cmVEYXRhO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1pbnRlcm5hbC1tb2R1bGVzICovXHJcbmV4cG9ydCAqIGZyb20gXCIuL2t0eDJEZWNvZGVyXCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL2t0eDJGaWxlUmVhZGVyXCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL3RyYW5zY29kZXJcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vdHJhbnNjb2Rlck1hbmFnZXJcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vd2FzbU1lbW9yeU1hbmFnZXJcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4venN0ZGRlY1wiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9NaXNjL2luZGV4XCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL1RyYW5zY29kZXJzL2luZGV4XCI7XHJcbiIsIi8qKlxyXG4gKiBSZXNvdXJjZXMgdXNlZCBmb3IgdGhlIGltcGxlbWVudGF0aW9uOlxyXG4gKiAgLSAzanMgS1RYMiBsb2FkZXI6IGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvdGhyZWUuanMvYmxvYi9kZmI1YzIzY2UxMjZlYzg0NWU0YWEyNDA1OTk5MTVmZWY1Mzc1Nzk3L2V4YW1wbGVzL2pzbS9sb2FkZXJzL0tUWDJMb2FkZXIuanNcclxuICogIC0gVW5pdmVyc2FsIFRleHR1cmUgVHJhbnNjb2RlcnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvVW5pdmVyc2FsLVRleHR1cmUtVHJhbnNjb2RlcnNcclxuICogIC0gS1RYMiBzcGVjaWZpY2F0aW9uOiBodHRwOi8vZ2l0aHViLmtocm9ub3Mub3JnL0tUWC1TcGVjaWZpY2F0aW9uL1xyXG4gKiAgLSBLVFgyIGJpbmFyaWVzIHRvIGNvbnZlcnQgZmlsZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvS1RYLVNvZnR3YXJlL3JlbGVhc2VzXHJcbiAqICAtIEtUWCBzcGVjaWZpY2F0aW9uOiBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9EYXRhRm9ybWF0L3NwZWNzLzEuMy9kYXRhZm9ybWF0LjEuMy5odG1sXHJcbiAqICAtIEtUWC1Tb2Z0d2FyZTogaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9LVFgtU29mdHdhcmVcclxuICovXHJcbmltcG9ydCAqIGFzIEtUWDIgZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL2t0eDJkZWNvZGVyVHlwZXNcIjtcclxuXHJcbmltcG9ydCB0eXBlIHsgSUtUWDJfSW1hZ2VEZXNjIH0gZnJvbSBcIi4va3R4MkZpbGVSZWFkZXJcIjtcclxuaW1wb3J0IHsgS1RYMkZpbGVSZWFkZXIsIFN1cGVyY29tcHJlc3Npb25TY2hlbWUgfSBmcm9tIFwiLi9rdHgyRmlsZVJlYWRlclwiO1xyXG5pbXBvcnQgeyBUcmFuc2NvZGVyTWFuYWdlciB9IGZyb20gXCIuL3RyYW5zY29kZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IExpdGVUcmFuc2NvZGVyX1VBU1RDX0FTVEMgfSBmcm9tIFwiLi9UcmFuc2NvZGVycy9saXRlVHJhbnNjb2Rlcl9VQVNUQ19BU1RDXCI7XHJcbmltcG9ydCB7IExpdGVUcmFuc2NvZGVyX1VBU1RDX0JDNyB9IGZyb20gXCIuL1RyYW5zY29kZXJzL2xpdGVUcmFuc2NvZGVyX1VBU1RDX0JDN1wiO1xyXG5pbXBvcnQgeyBMaXRlVHJhbnNjb2Rlcl9VQVNUQ19SR0JBX1VOT1JNIH0gZnJvbSBcIi4vVHJhbnNjb2RlcnMvbGl0ZVRyYW5zY29kZXJfVUFTVENfUkdCQV9VTk9STVwiO1xyXG5pbXBvcnQgeyBMaXRlVHJhbnNjb2Rlcl9VQVNUQ19SR0JBX1NSR0IgfSBmcm9tIFwiLi9UcmFuc2NvZGVycy9saXRlVHJhbnNjb2Rlcl9VQVNUQ19SR0JBX1NSR0JcIjtcclxuaW1wb3J0IHsgTGl0ZVRyYW5zY29kZXJfVUFTVENfUjhfVU5PUk0gfSBmcm9tIFwiLi9UcmFuc2NvZGVycy9saXRlVHJhbnNjb2Rlcl9VQVNUQ19SOF9VTk9STVwiO1xyXG5pbXBvcnQgeyBMaXRlVHJhbnNjb2Rlcl9VQVNUQ19SRzhfVU5PUk0gfSBmcm9tIFwiLi9UcmFuc2NvZGVycy9saXRlVHJhbnNjb2Rlcl9VQVNUQ19SRzhfVU5PUk1cIjtcclxuaW1wb3J0IHsgTVNDVHJhbnNjb2RlciB9IGZyb20gXCIuL1RyYW5zY29kZXJzL21zY1RyYW5zY29kZXJcIjtcclxuaW1wb3J0IHsgWlNURERlY29kZXIgfSBmcm9tIFwiLi96c3RkZGVjXCI7XHJcbmltcG9ydCB7IFRyYW5zY29kZURlY2lzaW9uVHJlZSB9IGZyb20gXCIuL3RyYW5zY29kZURlY2lzaW9uVHJlZVwiO1xyXG5cclxuY29uc3QgaXNQb3dlck9mVHdvID0gKHZhbHVlOiBudW1iZXIpID0+IHtcclxuICAgIHJldHVybiAodmFsdWUgJiAodmFsdWUgLSAxKSkgPT09IDAgJiYgdmFsdWUgIT09IDA7XHJcbn07XHJcblxyXG4vKipcclxuICogQ2xhc3MgZm9yIGRlY29kaW5nIEtUWDIgZmlsZXNcclxuICpcclxuICovXHJcbmV4cG9ydCBjbGFzcyBLVFgyRGVjb2RlciB7XHJcbiAgICBwcml2YXRlIF90cmFuc2NvZGVyTWdyOiBUcmFuc2NvZGVyTWFuYWdlcjtcclxuICAgIHByaXZhdGUgX3pzdGREZWNvZGVyOiBaU1RERGVjb2RlcjtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIERlZmF1bHREZWNvZGVyT3B0aW9uczogS1RYMi5JS1RYMkRlY29kZXJPcHRpb25zID0ge307XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNjb2Rlck1nciA9IG5ldyBUcmFuc2NvZGVyTWFuYWdlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZWNvZGUoZGF0YTogVWludDhBcnJheSwgY2FwczogS1RYMi5JQ29tcHJlc3NlZEZvcm1hdENhcGFiaWxpdGllcywgb3B0aW9ucz86IEtUWDIuSUtUWDJEZWNvZGVyT3B0aW9ucyk6IFByb21pc2U8S1RYMi5JRGVjb2RlZERhdGE+IHtcclxuICAgICAgICBjb25zdCBmaW5hbE9wdGlvbnMgPSB7IC4uLm9wdGlvbnMsIC4uLktUWDJEZWNvZGVyLkRlZmF1bHREZWNvZGVyT3B0aW9ucyB9O1xyXG5cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtmciA9IG5ldyBLVFgyRmlsZVJlYWRlcihkYXRhKTtcclxuXHJcbiAgICAgICAgICAgIGlmICgha2ZyLmlzVmFsaWQoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBLVDIgZmlsZTogd3Jvbmcgc2lnbmF0dXJlXCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBrZnIucGFyc2UoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChrZnIubmVlZFpTVEREZWNvZGVyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3pzdGREZWNvZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fenN0ZERlY29kZXIgPSBuZXcgWlNURERlY29kZXIoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fenN0ZERlY29kZXIuaW5pdCgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWNvZGVEYXRhKGtmciwgY2FwcywgZmluYWxPcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVjb2RlRGF0YShrZnIsIGNhcHMsIGZpbmFsT3B0aW9ucyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZGVjb2RlRGF0YShrZnI6IEtUWDJGaWxlUmVhZGVyLCBjYXBzOiBLVFgyLklDb21wcmVzc2VkRm9ybWF0Q2FwYWJpbGl0aWVzLCBvcHRpb25zPzogS1RYMi5JS1RYMkRlY29kZXJPcHRpb25zKTogUHJvbWlzZTxLVFgyLklEZWNvZGVkRGF0YT4ge1xyXG4gICAgICAgIGNvbnN0IHdpZHRoID0ga2ZyLmhlYWRlci5waXhlbFdpZHRoO1xyXG4gICAgICAgIGNvbnN0IGhlaWdodCA9IGtmci5oZWFkZXIucGl4ZWxIZWlnaHQ7XHJcbiAgICAgICAgY29uc3Qgc3JjVGV4Rm9ybWF0ID0ga2ZyLnRleHR1cmVGb3JtYXQ7XHJcblxyXG4gICAgICAgIGNvbnN0IGRlY2lzaW9uVHJlZSA9IG5ldyBUcmFuc2NvZGVEZWNpc2lvblRyZWUoc3JjVGV4Rm9ybWF0LCBrZnIuaGFzQWxwaGEsIGlzUG93ZXJPZlR3byh3aWR0aCkgJiYgaXNQb3dlck9mVHdvKGhlaWdodCksIGNhcHMsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICBpZiAob3B0aW9ucz8udHJhbnNjb2RlRm9ybWF0RGVjaXNpb25UcmVlKSB7XHJcbiAgICAgICAgICAgIGRlY2lzaW9uVHJlZS5wYXJzZVRyZWUob3B0aW9ucz8udHJhbnNjb2RlRm9ybWF0RGVjaXNpb25UcmVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHRyYW5zY29kZUZvcm1hdCA9IGRlY2lzaW9uVHJlZS50cmFuc2NvZGVGb3JtYXQ7XHJcbiAgICAgICAgY29uc3QgZW5naW5lRm9ybWF0ID0gZGVjaXNpb25UcmVlLmVuZ2luZUZvcm1hdDtcclxuICAgICAgICBjb25zdCByb3VuZFRvTXVsdGlwbGU0ID0gZGVjaXNpb25UcmVlLnJvdW5kVG9NdWx0aXBsZTQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHRyYW5zY29kZXIgPSB0aGlzLl90cmFuc2NvZGVyTWdyLmZpbmRUcmFuc2NvZGVyKHNyY1RleEZvcm1hdCwgdHJhbnNjb2RlRm9ybWF0LCBrZnIuaXNJbkdhbW1hU3BhY2UsIG9wdGlvbnM/LmJ5cGFzc1RyYW5zY29kZXJzKTtcclxuXHJcbiAgICAgICAgaWYgKHRyYW5zY29kZXIgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgYG5vIHRyYW5zY29kZXIgZm91bmQgdG8gdHJhbnNjb2RlIHNvdXJjZSB0ZXh0dXJlIGZvcm1hdCBcIiR7S1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0W3NyY1RleEZvcm1hdF19XCIgdG8gZm9ybWF0IFwiJHtLVFgyLlRyYW5zY29kZVRhcmdldFt0cmFuc2NvZGVGb3JtYXRdfVwiYFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbWlwbWFwczogQXJyYXk8S1RYMi5JTWlwbWFwPiA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGRhdGFQcm9taXNlczogQXJyYXk8UHJvbWlzZTxVaW50OEFycmF5IHwgbnVsbD4+ID0gW107XHJcbiAgICAgICAgY29uc3QgZGVjb2RlZERhdGE6IEtUWDIuSURlY29kZWREYXRhID0ge1xyXG4gICAgICAgICAgICB3aWR0aDogMCxcclxuICAgICAgICAgICAgaGVpZ2h0OiAwLFxyXG4gICAgICAgICAgICB0cmFuc2NvZGVkRm9ybWF0OiBlbmdpbmVGb3JtYXQsXHJcbiAgICAgICAgICAgIG1pcG1hcHMsXHJcbiAgICAgICAgICAgIGlzSW5HYW1tYVNwYWNlOiBrZnIuaXNJbkdhbW1hU3BhY2UsXHJcbiAgICAgICAgICAgIGhhc0FscGhhOiBrZnIuaGFzQWxwaGEsXHJcbiAgICAgICAgICAgIHRyYW5zY29kZXJOYW1lOiB0cmFuc2NvZGVyLmdldE5hbWUoKSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgZmlyc3RJbWFnZURlc2NJbmRleCA9IDA7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGxldmVsID0gMDsgbGV2ZWwgPCBrZnIuaGVhZGVyLmxldmVsQ291bnQ7IGxldmVsKyspIHtcclxuICAgICAgICAgICAgaWYgKGxldmVsID4gMCkge1xyXG4gICAgICAgICAgICAgICAgZmlyc3RJbWFnZURlc2NJbmRleCArPSBNYXRoLm1heChrZnIuaGVhZGVyLmxheWVyQ291bnQsIDEpICoga2ZyLmhlYWRlci5mYWNlQ291bnQgKiBNYXRoLm1heChrZnIuaGVhZGVyLnBpeGVsRGVwdGggPj4gKGxldmVsIC0gMSksIDEpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBsZXZlbFdpZHRoID0gTWF0aC5mbG9vcih3aWR0aCAvICgxIDw8IGxldmVsKSkgfHwgMTtcclxuICAgICAgICAgICAgY29uc3QgbGV2ZWxIZWlnaHQgPSBNYXRoLmZsb29yKGhlaWdodCAvICgxIDw8IGxldmVsKSkgfHwgMTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG51bUltYWdlc0luTGV2ZWwgPSBrZnIuaGVhZGVyLmZhY2VDb3VudDsgLy8gbm90ZSB0aGF0IGN1YmVtYXAgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0IChzZWUgS1RYMkZpbGVSZWFkZXIpLCBzbyBmYWNlQ291bnQgPT0gMVxyXG4gICAgICAgICAgICBjb25zdCBsZXZlbEltYWdlQnl0ZUxlbmd0aCA9ICgobGV2ZWxXaWR0aCArIDMpID4+IDIpICogKChsZXZlbEhlaWdodCArIDMpID4+IDIpICoga2ZyLmRmZEJsb2NrLmJ5dGVzUGxhbmVbMF07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBsZXZlbFVuY29tcHJlc3NlZEJ5dGVMZW5ndGggPSBrZnIubGV2ZWxzW2xldmVsXS51bmNvbXByZXNzZWRCeXRlTGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgbGV0IGxldmVsRGF0YUJ1ZmZlciA9IGtmci5kYXRhLmJ1ZmZlcjtcclxuXHJcbiAgICAgICAgICAgIGxldCBsZXZlbERhdGFPZmZzZXQgPSBrZnIubGV2ZWxzW2xldmVsXS5ieXRlT2Zmc2V0ICsga2ZyLmRhdGEuYnl0ZU9mZnNldDtcclxuICAgICAgICAgICAgbGV0IGltYWdlT2Zmc2V0SW5MZXZlbCA9IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAoa2ZyLmhlYWRlci5zdXBlcmNvbXByZXNzaW9uU2NoZW1lID09PSBTdXBlcmNvbXByZXNzaW9uU2NoZW1lLlpTdGFuZGFyZCkge1xyXG4gICAgICAgICAgICAgICAgbGV2ZWxEYXRhQnVmZmVyID0gdGhpcy5fenN0ZERlY29kZXIuZGVjb2RlKG5ldyBVaW50OEFycmF5KGxldmVsRGF0YUJ1ZmZlciwgbGV2ZWxEYXRhT2Zmc2V0LCBrZnIubGV2ZWxzW2xldmVsXS5ieXRlTGVuZ3RoKSwgbGV2ZWxVbmNvbXByZXNzZWRCeXRlTGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIGxldmVsRGF0YU9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChsZXZlbCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgZGVjb2RlZERhdGEud2lkdGggPSByb3VuZFRvTXVsdGlwbGU0ID8gKGxldmVsV2lkdGggKyAzKSAmIH4zIDogbGV2ZWxXaWR0aDtcclxuICAgICAgICAgICAgICAgIGRlY29kZWREYXRhLmhlaWdodCA9IHJvdW5kVG9NdWx0aXBsZTQgPyAobGV2ZWxIZWlnaHQgKyAzKSAmIH4zIDogbGV2ZWxIZWlnaHQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGltYWdlSW5kZXggPSAwOyBpbWFnZUluZGV4IDwgbnVtSW1hZ2VzSW5MZXZlbDsgaW1hZ2VJbmRleCsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZW5jb2RlZERhdGE6IFVpbnQ4QXJyYXk7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW1hZ2VEZXNjOiBJS1RYMl9JbWFnZURlc2MgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoa2ZyLmhlYWRlci5zdXBlcmNvbXByZXNzaW9uU2NoZW1lID09PSBTdXBlcmNvbXByZXNzaW9uU2NoZW1lLkJhc2lzTFopIHtcclxuICAgICAgICAgICAgICAgICAgICBpbWFnZURlc2MgPSBrZnIuc3VwZXJjb21wcmVzc2lvbkdsb2JhbERhdGEuaW1hZ2VEZXNjcyFbZmlyc3RJbWFnZURlc2NJbmRleCArIGltYWdlSW5kZXhdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBlbmNvZGVkRGF0YSA9IG5ldyBVaW50OEFycmF5KGxldmVsRGF0YUJ1ZmZlciwgbGV2ZWxEYXRhT2Zmc2V0ICsgaW1hZ2VEZXNjLnJnYlNsaWNlQnl0ZU9mZnNldCwgaW1hZ2VEZXNjLnJnYlNsaWNlQnl0ZUxlbmd0aCArIGltYWdlRGVzYy5hbHBoYVNsaWNlQnl0ZUxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuY29kZWREYXRhID0gbmV3IFVpbnQ4QXJyYXkobGV2ZWxEYXRhQnVmZmVyLCBsZXZlbERhdGFPZmZzZXQgKyBpbWFnZU9mZnNldEluTGV2ZWwsIGxldmVsSW1hZ2VCeXRlTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VPZmZzZXRJbkxldmVsICs9IGxldmVsSW1hZ2VCeXRlTGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IG1pcG1hcDogS1RYMi5JTWlwbWFwID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGxldmVsV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBsZXZlbEhlaWdodCxcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNjb2RlZERhdGEgPSB0cmFuc2NvZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgLnRyYW5zY29kZShzcmNUZXhGb3JtYXQsIHRyYW5zY29kZUZvcm1hdCwgbGV2ZWwsIGxldmVsV2lkdGgsIGxldmVsSGVpZ2h0LCBsZXZlbFVuY29tcHJlc3NlZEJ5dGVMZW5ndGgsIGtmciwgaW1hZ2VEZXNjLCBlbmNvZGVkRGF0YSlcclxuICAgICAgICAgICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtaXBtYXAuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZERhdGEuZXJyb3JzID0gZGVjb2RlZERhdGEuZXJyb3JzID8/IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWREYXRhLmVycm9ycyArPSByZWFzb24gKyBcIlxcblwiICsgcmVhc29uLnN0YWNrICsgXCJcXG5cIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgZGF0YVByb21pc2VzLnB1c2godHJhbnNjb2RlZERhdGEpO1xyXG5cclxuICAgICAgICAgICAgICAgIG1pcG1hcHMucHVzaChtaXBtYXApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZGF0YVByb21pc2VzKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGRlY29kZWREYXRhO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBQdXQgaW4gdGhlIG9yZGVyIHlvdSB3YW50IHRoZSB0cmFuc2NvZGVycyB0byBiZSB1c2VkIGluIHByaW9yaXR5XHJcblRyYW5zY29kZXJNYW5hZ2VyLlJlZ2lzdGVyVHJhbnNjb2RlcihMaXRlVHJhbnNjb2Rlcl9VQVNUQ19BU1RDKTtcclxuVHJhbnNjb2Rlck1hbmFnZXIuUmVnaXN0ZXJUcmFuc2NvZGVyKExpdGVUcmFuc2NvZGVyX1VBU1RDX0JDNyk7XHJcblRyYW5zY29kZXJNYW5hZ2VyLlJlZ2lzdGVyVHJhbnNjb2RlcihMaXRlVHJhbnNjb2Rlcl9VQVNUQ19SR0JBX1VOT1JNKTtcclxuVHJhbnNjb2Rlck1hbmFnZXIuUmVnaXN0ZXJUcmFuc2NvZGVyKExpdGVUcmFuc2NvZGVyX1VBU1RDX1JHQkFfU1JHQik7XHJcblRyYW5zY29kZXJNYW5hZ2VyLlJlZ2lzdGVyVHJhbnNjb2RlcihMaXRlVHJhbnNjb2Rlcl9VQVNUQ19SOF9VTk9STSk7XHJcblRyYW5zY29kZXJNYW5hZ2VyLlJlZ2lzdGVyVHJhbnNjb2RlcihMaXRlVHJhbnNjb2Rlcl9VQVNUQ19SRzhfVU5PUk0pO1xyXG5UcmFuc2NvZGVyTWFuYWdlci5SZWdpc3RlclRyYW5zY29kZXIoTVNDVHJhbnNjb2Rlcik7IC8vIGNhdGNoIGFsbCB0cmFuc2NvZGVyIC0gd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB0aGUgZm9ybWF0IGNhbid0IGJlIHRyYW5zY29kZWRcclxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uICovXHJcbmltcG9ydCAqIGFzIEtUWDIgZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL2t0eDJkZWNvZGVyVHlwZXNcIjtcclxuXHJcbmltcG9ydCB7IERhdGFSZWFkZXIgfSBmcm9tIFwiLi9NaXNjL2RhdGFSZWFkZXJcIjtcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGVudW0gU3VwZXJjb21wcmVzc2lvblNjaGVtZSB7XHJcbiAgICBOb25lID0gMCxcclxuICAgIEJhc2lzTFogPSAxLFxyXG4gICAgWlN0YW5kYXJkID0gMixcclxuICAgIFpMaWIgPSAzLFxyXG59XHJcblxyXG5jb25zdCBlbnVtIERGRE1vZGVsIHtcclxuICAgIEVUQzFTID0gMTYzLFxyXG4gICAgVUFTVEMgPSAxNjYsXHJcbn1cclxuXHJcbmNvbnN0IGVudW0gREZEQ2hhbm5lbF9FVEMxUyB7XHJcbiAgICBSR0IgPSAwLFxyXG4gICAgUlJSID0gMyxcclxuICAgIEdHRyA9IDQsXHJcbiAgICBBQUEgPSAxNSxcclxufVxyXG5cclxuY29uc3QgZW51bSBERkRDaGFubmVsX1VBU1RDIHtcclxuICAgIFJHQiA9IDAsXHJcbiAgICBSR0JBID0gMyxcclxuICAgIFJSUiA9IDQsXHJcbiAgICBSUlJHID0gNSxcclxufVxyXG5cclxuY29uc3QgZW51bSBERkRUcmFuc2ZlckZ1bmN0aW9uIHtcclxuICAgIGxpbmVhciA9IDEsXHJcbiAgICBzUkdCID0gMixcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElLVFgyX0hlYWRlciB7XHJcbiAgICB2a0Zvcm1hdDogbnVtYmVyO1xyXG4gICAgdHlwZVNpemU6IG51bWJlcjtcclxuICAgIHBpeGVsV2lkdGg6IG51bWJlcjtcclxuICAgIHBpeGVsSGVpZ2h0OiBudW1iZXI7XHJcbiAgICBwaXhlbERlcHRoOiBudW1iZXI7XHJcbiAgICBsYXllckNvdW50OiBudW1iZXI7XHJcbiAgICBmYWNlQ291bnQ6IG51bWJlcjtcclxuICAgIGxldmVsQ291bnQ6IG51bWJlcjtcclxuICAgIHN1cGVyY29tcHJlc3Npb25TY2hlbWU6IG51bWJlcjtcclxuICAgIGRmZEJ5dGVPZmZzZXQ6IG51bWJlcjtcclxuICAgIGRmZEJ5dGVMZW5ndGg6IG51bWJlcjtcclxuICAgIGt2ZEJ5dGVPZmZzZXQ6IG51bWJlcjtcclxuICAgIGt2ZEJ5dGVMZW5ndGg6IG51bWJlcjtcclxuICAgIHNnZEJ5dGVPZmZzZXQ6IG51bWJlcjtcclxuICAgIHNnZEJ5dGVMZW5ndGg6IG51bWJlcjtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElLVFgyX0xldmVsIHtcclxuICAgIGJ5dGVPZmZzZXQ6IG51bWJlcjtcclxuICAgIGJ5dGVMZW5ndGg6IG51bWJlcjtcclxuICAgIHVuY29tcHJlc3NlZEJ5dGVMZW5ndGg6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElLVFgyX1NhbXBsZSB7XHJcbiAgICBiaXRPZmZzZXQ6IG51bWJlcjtcclxuICAgIGJpdExlbmd0aDogbnVtYmVyO1xyXG4gICAgY2hhbm5lbFR5cGU6IG51bWJlcjtcclxuICAgIGNoYW5uZWxGbGFnczogbnVtYmVyO1xyXG4gICAgc2FtcGxlUG9zaXRpb246IG51bWJlcltdO1xyXG4gICAgc2FtcGxlTG93ZXI6IG51bWJlcjtcclxuICAgIHNhbXBsZVVwcGVyOiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGludGVyZmFjZSBJS1RYMl9ERkQge1xyXG4gICAgdmVuZG9ySWQ6IG51bWJlcjtcclxuICAgIGRlc2NyaXB0b3JUeXBlOiBudW1iZXI7XHJcbiAgICB2ZXJzaW9uTnVtYmVyOiBudW1iZXI7XHJcbiAgICBkZXNjcmlwdG9yQmxvY2tTaXplOiBudW1iZXI7XHJcbiAgICBjb2xvck1vZGVsOiBudW1iZXI7XHJcbiAgICBjb2xvclByaW1hcmllczogbnVtYmVyO1xyXG4gICAgdHJhbnNmZXJGdW5jdGlvbjogbnVtYmVyO1xyXG4gICAgZmxhZ3M6IG51bWJlcjtcclxuICAgIHRleGVsQmxvY2tEaW1lbnNpb246IHtcclxuICAgICAgICB4OiBudW1iZXI7XHJcbiAgICAgICAgeTogbnVtYmVyO1xyXG4gICAgICAgIHo6IG51bWJlcjtcclxuICAgICAgICB3OiBudW1iZXI7XHJcbiAgICB9O1xyXG4gICAgYnl0ZXNQbGFuZTogQXJyYXk8bnVtYmVyPjtcclxuICAgIG51bVNhbXBsZXM6IG51bWJlcjtcclxuICAgIHNhbXBsZXM6IEFycmF5PElLVFgyX1NhbXBsZT47XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGludGVyZmFjZSBJS1RYMl9JbWFnZURlc2Mge1xyXG4gICAgaW1hZ2VGbGFnczogbnVtYmVyO1xyXG4gICAgcmdiU2xpY2VCeXRlT2Zmc2V0OiBudW1iZXI7XHJcbiAgICByZ2JTbGljZUJ5dGVMZW5ndGg6IG51bWJlcjtcclxuICAgIGFscGhhU2xpY2VCeXRlT2Zmc2V0OiBudW1iZXI7XHJcbiAgICBhbHBoYVNsaWNlQnl0ZUxlbmd0aDogbnVtYmVyO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUtUWDJfU3VwZXJjb21wcmVzc2lvbkdsb2JhbERhdGEge1xyXG4gICAgZW5kcG9pbnRDb3VudD86IG51bWJlcjtcclxuICAgIHNlbGVjdG9yQ291bnQ/OiBudW1iZXI7XHJcbiAgICBlbmRwb2ludHNCeXRlTGVuZ3RoPzogbnVtYmVyO1xyXG4gICAgc2VsZWN0b3JzQnl0ZUxlbmd0aD86IG51bWJlcjtcclxuICAgIHRhYmxlc0J5dGVMZW5ndGg/OiBudW1iZXI7XHJcbiAgICBleHRlbmRlZEJ5dGVMZW5ndGg/OiBudW1iZXI7XHJcbiAgICBpbWFnZURlc2NzPzogQXJyYXk8SUtUWDJfSW1hZ2VEZXNjPjtcclxuICAgIGVuZHBvaW50c0RhdGE/OiBVaW50OEFycmF5O1xyXG4gICAgc2VsZWN0b3JzRGF0YT86IFVpbnQ4QXJyYXk7XHJcbiAgICB0YWJsZXNEYXRhPzogVWludDhBcnJheTtcclxuICAgIGV4dGVuZGVkRGF0YT86IFVpbnQ4QXJyYXk7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBLVFgyRmlsZVJlYWRlciB7XHJcbiAgICBwcml2YXRlIF9kYXRhOiBVaW50OEFycmF5O1xyXG4gICAgcHJpdmF0ZSBfaGVhZGVyOiBJS1RYMl9IZWFkZXI7XHJcbiAgICBwcml2YXRlIF9sZXZlbHM6IEFycmF5PElLVFgyX0xldmVsPjtcclxuICAgIHByaXZhdGUgX2RmZEJsb2NrOiBJS1RYMl9ERkQ7XHJcbiAgICBwcml2YXRlIF9zdXBlcmNvbXByZXNzaW9uR2xvYmFsRGF0YTogSUtUWDJfU3VwZXJjb21wcmVzc2lvbkdsb2JhbERhdGE7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmlsZSBjYW4ndCBiZSBwYXJzZWRcclxuICAgICAqIEBwYXJhbSBkYXRhXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFVpbnQ4QXJyYXkpIHtcclxuICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGRhdGEoKTogVWludDhBcnJheSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBoZWFkZXIoKTogSUtUWDJfSGVhZGVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faGVhZGVyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgbGV2ZWxzKCk6IEFycmF5PElLVFgyX0xldmVsPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xldmVscztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGRmZEJsb2NrKCk6IElLVFgyX0RGRCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RmZEJsb2NrO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgc3VwZXJjb21wcmVzc2lvbkdsb2JhbERhdGEoKTogSUtUWDJfU3VwZXJjb21wcmVzc2lvbkdsb2JhbERhdGEge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdXBlcmNvbXByZXNzaW9uR2xvYmFsRGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNWYWxpZCgpIHtcclxuICAgICAgICByZXR1cm4gS1RYMkZpbGVSZWFkZXIuSXNWYWxpZCh0aGlzLl9kYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcGFyc2UoKSB7XHJcbiAgICAgICAgbGV0IG9mZnNldEluRmlsZSA9IDEyOyAvLyBza2lwIHRoZSBoZWFkZXJcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogR2V0IHRoZSBoZWFkZXJcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBoZHJSZWFkZXIgPSBuZXcgRGF0YVJlYWRlcih0aGlzLl9kYXRhLCBvZmZzZXRJbkZpbGUsIDE3ICogNCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhlYWRlciA9ICh0aGlzLl9oZWFkZXIgPSB7XHJcbiAgICAgICAgICAgIHZrRm9ybWF0OiBoZHJSZWFkZXIucmVhZFVpbnQzMigpLFxyXG4gICAgICAgICAgICB0eXBlU2l6ZTogaGRyUmVhZGVyLnJlYWRVaW50MzIoKSxcclxuICAgICAgICAgICAgcGl4ZWxXaWR0aDogaGRyUmVhZGVyLnJlYWRVaW50MzIoKSxcclxuICAgICAgICAgICAgcGl4ZWxIZWlnaHQ6IGhkclJlYWRlci5yZWFkVWludDMyKCksXHJcbiAgICAgICAgICAgIHBpeGVsRGVwdGg6IGhkclJlYWRlci5yZWFkVWludDMyKCksXHJcbiAgICAgICAgICAgIGxheWVyQ291bnQ6IGhkclJlYWRlci5yZWFkVWludDMyKCksXHJcbiAgICAgICAgICAgIGZhY2VDb3VudDogaGRyUmVhZGVyLnJlYWRVaW50MzIoKSxcclxuICAgICAgICAgICAgbGV2ZWxDb3VudDogaGRyUmVhZGVyLnJlYWRVaW50MzIoKSxcclxuICAgICAgICAgICAgc3VwZXJjb21wcmVzc2lvblNjaGVtZTogaGRyUmVhZGVyLnJlYWRVaW50MzIoKSxcclxuXHJcbiAgICAgICAgICAgIGRmZEJ5dGVPZmZzZXQ6IGhkclJlYWRlci5yZWFkVWludDMyKCksXHJcbiAgICAgICAgICAgIGRmZEJ5dGVMZW5ndGg6IGhkclJlYWRlci5yZWFkVWludDMyKCksXHJcbiAgICAgICAgICAgIGt2ZEJ5dGVPZmZzZXQ6IGhkclJlYWRlci5yZWFkVWludDMyKCksXHJcbiAgICAgICAgICAgIGt2ZEJ5dGVMZW5ndGg6IGhkclJlYWRlci5yZWFkVWludDMyKCksXHJcbiAgICAgICAgICAgIHNnZEJ5dGVPZmZzZXQ6IGhkclJlYWRlci5yZWFkVWludDY0KCksXHJcbiAgICAgICAgICAgIHNnZEJ5dGVMZW5ndGg6IGhkclJlYWRlci5yZWFkVWludDY0KCksXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChoZWFkZXIucGl4ZWxEZXB0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgS1RYMiBmaWxlIC0gT25seSAyRCB0ZXh0dXJlcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC5gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChoZWFkZXIubGF5ZXJDb3VudCA+IDEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgS1RYMiBmaWxlIC0gQXJyYXkgdGV4dHVyZXMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLmApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGhlYWRlci5mYWNlQ291bnQgPiAxKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlIEtUWDIgZmlsZSAtIEN1YmUgdGV4dHVyZXMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLmApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgb2Zmc2V0SW5GaWxlICs9IGhkclJlYWRlci5ieXRlT2Zmc2V0O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBHZXQgdGhlIGxldmVsc1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGxldCBsZXZlbENvdW50ID0gTWF0aC5tYXgoMSwgaGVhZGVyLmxldmVsQ291bnQpO1xyXG5cclxuICAgICAgICBjb25zdCBsZXZlbFJlYWRlciA9IG5ldyBEYXRhUmVhZGVyKHRoaXMuX2RhdGEsIG9mZnNldEluRmlsZSwgbGV2ZWxDb3VudCAqIDMgKiAoMiAqIDQpKTtcclxuXHJcbiAgICAgICAgY29uc3QgbGV2ZWxzOiBBcnJheTxJS1RYMl9MZXZlbD4gPSAodGhpcy5fbGV2ZWxzID0gW10pO1xyXG5cclxuICAgICAgICB3aGlsZSAobGV2ZWxDb3VudC0tKSB7XHJcbiAgICAgICAgICAgIGxldmVscy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGJ5dGVPZmZzZXQ6IGxldmVsUmVhZGVyLnJlYWRVaW50NjQoKSxcclxuICAgICAgICAgICAgICAgIGJ5dGVMZW5ndGg6IGxldmVsUmVhZGVyLnJlYWRVaW50NjQoKSxcclxuICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZEJ5dGVMZW5ndGg6IGxldmVsUmVhZGVyLnJlYWRVaW50NjQoKSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBvZmZzZXRJbkZpbGUgKz0gbGV2ZWxSZWFkZXIuYnl0ZU9mZnNldDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogR2V0IHRoZSBkYXRhIGZvcm1hdCBkZXNjcmlwdG9yIChERkQpIGJsb2Nrc1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGRmZFJlYWRlciA9IG5ldyBEYXRhUmVhZGVyKHRoaXMuX2RhdGEsIGhlYWRlci5kZmRCeXRlT2Zmc2V0LCBoZWFkZXIuZGZkQnl0ZUxlbmd0aCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRmZEJsb2NrID0gKHRoaXMuX2RmZEJsb2NrID0ge1xyXG4gICAgICAgICAgICB2ZW5kb3JJZDogZGZkUmVhZGVyLnNraXBCeXRlcyg0IC8qIHNraXAgdG90YWxTaXplICovKS5yZWFkVWludDE2KCksXHJcbiAgICAgICAgICAgIGRlc2NyaXB0b3JUeXBlOiBkZmRSZWFkZXIucmVhZFVpbnQxNigpLFxyXG4gICAgICAgICAgICB2ZXJzaW9uTnVtYmVyOiBkZmRSZWFkZXIucmVhZFVpbnQxNigpLFxyXG4gICAgICAgICAgICBkZXNjcmlwdG9yQmxvY2tTaXplOiBkZmRSZWFkZXIucmVhZFVpbnQxNigpLFxyXG4gICAgICAgICAgICBjb2xvck1vZGVsOiBkZmRSZWFkZXIucmVhZFVpbnQ4KCksXHJcbiAgICAgICAgICAgIGNvbG9yUHJpbWFyaWVzOiBkZmRSZWFkZXIucmVhZFVpbnQ4KCksXHJcbiAgICAgICAgICAgIHRyYW5zZmVyRnVuY3Rpb246IGRmZFJlYWRlci5yZWFkVWludDgoKSxcclxuICAgICAgICAgICAgZmxhZ3M6IGRmZFJlYWRlci5yZWFkVWludDgoKSxcclxuICAgICAgICAgICAgdGV4ZWxCbG9ja0RpbWVuc2lvbjoge1xyXG4gICAgICAgICAgICAgICAgeDogZGZkUmVhZGVyLnJlYWRVaW50OCgpICsgMSxcclxuICAgICAgICAgICAgICAgIHk6IGRmZFJlYWRlci5yZWFkVWludDgoKSArIDEsXHJcbiAgICAgICAgICAgICAgICB6OiBkZmRSZWFkZXIucmVhZFVpbnQ4KCkgKyAxLFxyXG4gICAgICAgICAgICAgICAgdzogZGZkUmVhZGVyLnJlYWRVaW50OCgpICsgMSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgYnl0ZXNQbGFuZTogW1xyXG4gICAgICAgICAgICAgICAgZGZkUmVhZGVyLnJlYWRVaW50OCgpIC8qIGJ5dGVzUGxhbmUwICovLFxyXG4gICAgICAgICAgICAgICAgZGZkUmVhZGVyLnJlYWRVaW50OCgpIC8qIGJ5dGVzUGxhbmUxICovLFxyXG4gICAgICAgICAgICAgICAgZGZkUmVhZGVyLnJlYWRVaW50OCgpIC8qIGJ5dGVzUGxhbmUyICovLFxyXG4gICAgICAgICAgICAgICAgZGZkUmVhZGVyLnJlYWRVaW50OCgpIC8qIGJ5dGVzUGxhbmUzICovLFxyXG4gICAgICAgICAgICAgICAgZGZkUmVhZGVyLnJlYWRVaW50OCgpIC8qIGJ5dGVzUGxhbmU0ICovLFxyXG4gICAgICAgICAgICAgICAgZGZkUmVhZGVyLnJlYWRVaW50OCgpIC8qIGJ5dGVzUGxhbmU1ICovLFxyXG4gICAgICAgICAgICAgICAgZGZkUmVhZGVyLnJlYWRVaW50OCgpIC8qIGJ5dGVzUGxhbmU2ICovLFxyXG4gICAgICAgICAgICAgICAgZGZkUmVhZGVyLnJlYWRVaW50OCgpIC8qIGJ5dGVzUGxhbmU3ICovLFxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICBudW1TYW1wbGVzOiAwLFxyXG4gICAgICAgICAgICBzYW1wbGVzOiBuZXcgQXJyYXk8SUtUWDJfU2FtcGxlPigpLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkZmRCbG9jay5udW1TYW1wbGVzID0gKGRmZEJsb2NrLmRlc2NyaXB0b3JCbG9ja1NpemUgLSAyNCkgLyAxNjtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZmRCbG9jay5udW1TYW1wbGVzOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qgc2FtcGxlID0ge1xyXG4gICAgICAgICAgICAgICAgYml0T2Zmc2V0OiBkZmRSZWFkZXIucmVhZFVpbnQxNigpLFxyXG4gICAgICAgICAgICAgICAgYml0TGVuZ3RoOiBkZmRSZWFkZXIucmVhZFVpbnQ4KCkgKyAxLFxyXG4gICAgICAgICAgICAgICAgY2hhbm5lbFR5cGU6IGRmZFJlYWRlci5yZWFkVWludDgoKSxcclxuICAgICAgICAgICAgICAgIGNoYW5uZWxGbGFnczogMCxcclxuICAgICAgICAgICAgICAgIHNhbXBsZVBvc2l0aW9uOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgZGZkUmVhZGVyLnJlYWRVaW50OCgpIC8qIHNhbXBsZVBvc2l0aW9uMCAqLyxcclxuICAgICAgICAgICAgICAgICAgICBkZmRSZWFkZXIucmVhZFVpbnQ4KCkgLyogc2FtcGxlUG9zaXRpb24xICovLFxyXG4gICAgICAgICAgICAgICAgICAgIGRmZFJlYWRlci5yZWFkVWludDgoKSAvKiBzYW1wbGVQb3NpdGlvbjIgKi8sXHJcbiAgICAgICAgICAgICAgICAgICAgZGZkUmVhZGVyLnJlYWRVaW50OCgpIC8qIHNhbXBsZVBvc2l0aW9uMyAqLyxcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICBzYW1wbGVMb3dlcjogZGZkUmVhZGVyLnJlYWRVaW50MzIoKSxcclxuICAgICAgICAgICAgICAgIHNhbXBsZVVwcGVyOiBkZmRSZWFkZXIucmVhZFVpbnQzMigpLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgc2FtcGxlLmNoYW5uZWxGbGFncyA9IChzYW1wbGUuY2hhbm5lbFR5cGUgJiAweGYwKSA+PiA0O1xyXG4gICAgICAgICAgICBzYW1wbGUuY2hhbm5lbFR5cGUgPSBzYW1wbGUuY2hhbm5lbFR5cGUgJiAweDBmO1xyXG5cclxuICAgICAgICAgICAgZGZkQmxvY2suc2FtcGxlcy5wdXNoKHNhbXBsZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBHZXQgdGhlIFN1cGVyY29tcHJlc3Npb24gR2xvYmFsIERhdGEgKHNnZClcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBzZ2Q6IElLVFgyX1N1cGVyY29tcHJlc3Npb25HbG9iYWxEYXRhID0gKHRoaXMuX3N1cGVyY29tcHJlc3Npb25HbG9iYWxEYXRhID0ge30pO1xyXG5cclxuICAgICAgICBpZiAoaGVhZGVyLnNnZEJ5dGVMZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNnZFJlYWRlciA9IG5ldyBEYXRhUmVhZGVyKHRoaXMuX2RhdGEsIGhlYWRlci5zZ2RCeXRlT2Zmc2V0LCBoZWFkZXIuc2dkQnl0ZUxlbmd0aCk7XHJcblxyXG4gICAgICAgICAgICBzZ2QuZW5kcG9pbnRDb3VudCA9IHNnZFJlYWRlci5yZWFkVWludDE2KCk7XHJcbiAgICAgICAgICAgIHNnZC5zZWxlY3RvckNvdW50ID0gc2dkUmVhZGVyLnJlYWRVaW50MTYoKTtcclxuICAgICAgICAgICAgc2dkLmVuZHBvaW50c0J5dGVMZW5ndGggPSBzZ2RSZWFkZXIucmVhZFVpbnQzMigpO1xyXG4gICAgICAgICAgICBzZ2Quc2VsZWN0b3JzQnl0ZUxlbmd0aCA9IHNnZFJlYWRlci5yZWFkVWludDMyKCk7XHJcbiAgICAgICAgICAgIHNnZC50YWJsZXNCeXRlTGVuZ3RoID0gc2dkUmVhZGVyLnJlYWRVaW50MzIoKTtcclxuICAgICAgICAgICAgc2dkLmV4dGVuZGVkQnl0ZUxlbmd0aCA9IHNnZFJlYWRlci5yZWFkVWludDMyKCk7XHJcbiAgICAgICAgICAgIHNnZC5pbWFnZURlc2NzID0gW107XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpbWFnZUNvdW50ID0gdGhpcy5fZ2V0SW1hZ2VDb3VudCgpO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWFnZUNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHNnZC5pbWFnZURlc2NzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIGltYWdlRmxhZ3M6IHNnZFJlYWRlci5yZWFkVWludDMyKCksXHJcbiAgICAgICAgICAgICAgICAgICAgcmdiU2xpY2VCeXRlT2Zmc2V0OiBzZ2RSZWFkZXIucmVhZFVpbnQzMigpLFxyXG4gICAgICAgICAgICAgICAgICAgIHJnYlNsaWNlQnl0ZUxlbmd0aDogc2dkUmVhZGVyLnJlYWRVaW50MzIoKSxcclxuICAgICAgICAgICAgICAgICAgICBhbHBoYVNsaWNlQnl0ZU9mZnNldDogc2dkUmVhZGVyLnJlYWRVaW50MzIoKSxcclxuICAgICAgICAgICAgICAgICAgICBhbHBoYVNsaWNlQnl0ZUxlbmd0aDogc2dkUmVhZGVyLnJlYWRVaW50MzIoKSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBlbmRwb2ludHNCeXRlT2Zmc2V0ID0gaGVhZGVyLnNnZEJ5dGVPZmZzZXQgKyBzZ2RSZWFkZXIuYnl0ZU9mZnNldDtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3JzQnl0ZU9mZnNldCA9IGVuZHBvaW50c0J5dGVPZmZzZXQgKyBzZ2QuZW5kcG9pbnRzQnl0ZUxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgdGFibGVzQnl0ZU9mZnNldCA9IHNlbGVjdG9yc0J5dGVPZmZzZXQgKyBzZ2Quc2VsZWN0b3JzQnl0ZUxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgZXh0ZW5kZWRCeXRlT2Zmc2V0ID0gdGFibGVzQnl0ZU9mZnNldCArIHNnZC50YWJsZXNCeXRlTGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgc2dkLmVuZHBvaW50c0RhdGEgPSBuZXcgVWludDhBcnJheSh0aGlzLl9kYXRhLmJ1ZmZlciwgdGhpcy5fZGF0YS5ieXRlT2Zmc2V0ICsgZW5kcG9pbnRzQnl0ZU9mZnNldCwgc2dkLmVuZHBvaW50c0J5dGVMZW5ndGgpO1xyXG4gICAgICAgICAgICBzZ2Quc2VsZWN0b3JzRGF0YSA9IG5ldyBVaW50OEFycmF5KHRoaXMuX2RhdGEuYnVmZmVyLCB0aGlzLl9kYXRhLmJ5dGVPZmZzZXQgKyBzZWxlY3RvcnNCeXRlT2Zmc2V0LCBzZ2Quc2VsZWN0b3JzQnl0ZUxlbmd0aCk7XHJcbiAgICAgICAgICAgIHNnZC50YWJsZXNEYXRhID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fZGF0YS5idWZmZXIsIHRoaXMuX2RhdGEuYnl0ZU9mZnNldCArIHRhYmxlc0J5dGVPZmZzZXQsIHNnZC50YWJsZXNCeXRlTGVuZ3RoKTtcclxuICAgICAgICAgICAgc2dkLmV4dGVuZGVkRGF0YSA9IG5ldyBVaW50OEFycmF5KHRoaXMuX2RhdGEuYnVmZmVyLCB0aGlzLl9kYXRhLmJ5dGVPZmZzZXQgKyBleHRlbmRlZEJ5dGVPZmZzZXQsIHNnZC5leHRlbmRlZEJ5dGVMZW5ndGgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9nZXRJbWFnZUNvdW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IGxheWVyUGl4ZWxEZXB0aCA9IE1hdGgubWF4KHRoaXMuX2hlYWRlci5waXhlbERlcHRoLCAxKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuX2hlYWRlci5sZXZlbENvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgbGF5ZXJQaXhlbERlcHRoICs9IE1hdGgubWF4KHRoaXMuX2hlYWRlci5waXhlbERlcHRoID4+IGksIDEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuX2hlYWRlci5sYXllckNvdW50LCAxKSAqIHRoaXMuX2hlYWRlci5mYWNlQ291bnQgKiBsYXllclBpeGVsRGVwdGg7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB0ZXh0dXJlRm9ybWF0KCk6IEtUWDIuU291cmNlVGV4dHVyZUZvcm1hdCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RmZEJsb2NrLmNvbG9yTW9kZWwgPT09IERGRE1vZGVsLlVBU1RDID8gS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LlVBU1RDNHg0IDogS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LkVUQzFTO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaGFzQWxwaGEoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgdGZvcm1hdCA9IHRoaXMudGV4dHVyZUZvcm1hdDtcclxuXHJcbiAgICAgICAgc3dpdGNoICh0Zm9ybWF0KSB7XHJcbiAgICAgICAgICAgIGNhc2UgS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LkVUQzFTOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZmRCbG9jay5udW1TYW1wbGVzID09PSAyICYmXHJcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuX2RmZEJsb2NrLnNhbXBsZXNbMF0uY2hhbm5lbFR5cGUgPT09IERGRENoYW5uZWxfRVRDMVMuQUFBIHx8IHRoaXMuX2RmZEJsb2NrLnNhbXBsZXNbMV0uY2hhbm5lbFR5cGUgPT09IERGRENoYW5uZWxfRVRDMVMuQUFBKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0LlVBU1RDNHg0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RmZEJsb2NrLnNhbXBsZXNbMF0uY2hhbm5lbFR5cGUgPT09IERGRENoYW5uZWxfVUFTVEMuUkdCQTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IG5lZWRaU1RERGVjb2RlcigpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faGVhZGVyLnN1cGVyY29tcHJlc3Npb25TY2hlbWUgPT09IFN1cGVyY29tcHJlc3Npb25TY2hlbWUuWlN0YW5kYXJkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaXNJbkdhbW1hU3BhY2UoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RmZEJsb2NrLnRyYW5zZmVyRnVuY3Rpb24gPT09IERGRFRyYW5zZmVyRnVuY3Rpb24uc1JHQjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIElzVmFsaWQoZGF0YTogQXJyYXlCdWZmZXJWaWV3KTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKGRhdGEuYnl0ZUxlbmd0aCA+PSAxMikge1xyXG4gICAgICAgICAgICAvLyAnwqsnLCAnSycsICdUJywgJ1gnLCAnICcsICcyJywgJzAnLCAnwrsnLCAnXFxyJywgJ1xcbicsICdcXHgxQScsICdcXG4nXHJcbiAgICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBuZXcgVWludDhBcnJheShkYXRhLmJ1ZmZlciwgZGF0YS5ieXRlT2Zmc2V0LCAxMik7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIGlkZW50aWZpZXJbMF0gPT09IDB4YWIgJiZcclxuICAgICAgICAgICAgICAgIGlkZW50aWZpZXJbMV0gPT09IDB4NGIgJiZcclxuICAgICAgICAgICAgICAgIGlkZW50aWZpZXJbMl0gPT09IDB4NTQgJiZcclxuICAgICAgICAgICAgICAgIGlkZW50aWZpZXJbM10gPT09IDB4NTggJiZcclxuICAgICAgICAgICAgICAgIGlkZW50aWZpZXJbNF0gPT09IDB4MjAgJiZcclxuICAgICAgICAgICAgICAgIGlkZW50aWZpZXJbNV0gPT09IDB4MzIgJiZcclxuICAgICAgICAgICAgICAgIGlkZW50aWZpZXJbNl0gPT09IDB4MzAgJiZcclxuICAgICAgICAgICAgICAgIGlkZW50aWZpZXJbN10gPT09IDB4YmIgJiZcclxuICAgICAgICAgICAgICAgIGlkZW50aWZpZXJbOF0gPT09IDB4MGQgJiZcclxuICAgICAgICAgICAgICAgIGlkZW50aWZpZXJbOV0gPT09IDB4MGEgJiZcclxuICAgICAgICAgICAgICAgIGlkZW50aWZpZXJbMTBdID09PSAweDFhICYmXHJcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyWzExXSA9PT0gMHgwYVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn1cclxuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWludGVybmFsLW1vZHVsZXMgKi9cclxuaW1wb3J0IHsgS1RYMkRlY29kZXIgfSBmcm9tIFwiLi4vaW5kZXhcIjtcclxuXHJcbmNvbnN0IGdsb2JhbE9iamVjdCA9IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogdW5kZWZpbmVkO1xyXG5pZiAodHlwZW9mIGdsb2JhbE9iamVjdCAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgKDxhbnk+Z2xvYmFsT2JqZWN0KS5LVFgyREVDT0RFUiA9IEtUWDJEZWNvZGVyO1xyXG59XHJcblxyXG5leHBvcnQgKiBmcm9tIFwiLi4vaW5kZXhcIjtcclxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uICovXHJcbmltcG9ydCAqIGFzIEtUWDIgZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL2t0eDJkZWNvZGVyVHlwZXNcIjtcclxuXHJcbmNvbnN0IERlY2lzaW9uVHJlZTogS1RYMi5JRGVjaXNpb25UcmVlID0ge1xyXG4gICAgRVRDMVM6IHtcclxuICAgICAgICBvcHRpb246IFwiZm9yY2VSR0JBXCIsXHJcbiAgICAgICAgeWVzOiB7XHJcbiAgICAgICAgICAgIHRyYW5zY29kZUZvcm1hdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQuUkdCQTMyLFxyXG4gICAgICAgICAgICBlbmdpbmVGb3JtYXQ6IEtUWDIuRW5naW5lRm9ybWF0LlJHQkE4Rm9ybWF0LFxyXG4gICAgICAgICAgICByb3VuZFRvTXVsdGlwbGU0OiBmYWxzZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIG5vOiB7XHJcbiAgICAgICAgICAgIGNhcDogXCJldGMyXCIsXHJcbiAgICAgICAgICAgIHllczoge1xyXG4gICAgICAgICAgICAgICAgYWxwaGE6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB5ZXM6IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2NvZGVGb3JtYXQ6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LkVUQzJfUkdCQSxcclxuICAgICAgICAgICAgICAgICAgICBlbmdpbmVGb3JtYXQ6IEtUWDIuRW5naW5lRm9ybWF0LkNPTVBSRVNTRURfUkdCQThfRVRDMl9FQUMsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgbm86IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2NvZGVGb3JtYXQ6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LkVUQzFfUkdCLFxyXG4gICAgICAgICAgICAgICAgICAgIGVuZ2luZUZvcm1hdDogS1RYMi5FbmdpbmVGb3JtYXQuQ09NUFJFU1NFRF9SR0I4X0VUQzIsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBubzoge1xyXG4gICAgICAgICAgICAgICAgY2FwOiBcImV0YzFcIixcclxuICAgICAgICAgICAgICAgIGFscGhhOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHllczoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zY29kZUZvcm1hdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQuRVRDMV9SR0IsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5naW5lRm9ybWF0OiBLVFgyLkVuZ2luZUZvcm1hdC5DT01QUkVTU0VEX1JHQl9FVEMxX1dFQkdMLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG5vOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FwOiBcImJwdGNcIixcclxuICAgICAgICAgICAgICAgICAgICB5ZXM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2RlRm9ybWF0OiBLVFgyLlRyYW5zY29kZVRhcmdldC5CQzdfUkdCQSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lRm9ybWF0OiBLVFgyLkVuZ2luZUZvcm1hdC5DT01QUkVTU0VEX1JHQkFfQlBUQ19VTk9STV9FWFQsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBubzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXA6IFwiczN0Y1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB5ZXM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2RlRm9ybWF0OiBLVFgyLlRyYW5zY29kZVRhcmdldC5CQzNfUkdCQSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmVGb3JtYXQ6IEtUWDIuRW5naW5lRm9ybWF0LkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhULFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2RlRm9ybWF0OiBLVFgyLlRyYW5zY29kZVRhcmdldC5CQzFfUkdCLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZUZvcm1hdDogS1RYMi5FbmdpbmVGb3JtYXQuQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXA6IFwicHZydGNcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzUG93ZXJPZlR3bzogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2NvZGVGb3JtYXQ6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LlBWUlRDMV80X1JHQkEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZUZvcm1hdDogS1RYMi5FbmdpbmVGb3JtYXQuQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzRCUFBWMV9JTUcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2NvZGVGb3JtYXQ6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LlBWUlRDMV80X1JHQixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lRm9ybWF0OiBLVFgyLkVuZ2luZUZvcm1hdC5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm86IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2NvZGVGb3JtYXQ6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LlJHQkEzMixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmVGb3JtYXQ6IEtUWDIuRW5naW5lRm9ybWF0LlJHQkE4Rm9ybWF0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kVG9NdWx0aXBsZTQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgfSxcclxuXHJcbiAgICBVQVNUQzoge1xyXG4gICAgICAgIG9wdGlvbjogXCJmb3JjZVJHQkFcIixcclxuICAgICAgICB5ZXM6IHtcclxuICAgICAgICAgICAgdHJhbnNjb2RlRm9ybWF0OiBLVFgyLlRyYW5zY29kZVRhcmdldC5SR0JBMzIsXHJcbiAgICAgICAgICAgIGVuZ2luZUZvcm1hdDogS1RYMi5FbmdpbmVGb3JtYXQuUkdCQThGb3JtYXQsXHJcbiAgICAgICAgICAgIHJvdW5kVG9NdWx0aXBsZTQ6IGZhbHNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbm86IHtcclxuICAgICAgICAgICAgb3B0aW9uOiBcImZvcmNlUjhcIixcclxuICAgICAgICAgICAgeWVzOiB7XHJcbiAgICAgICAgICAgICAgICB0cmFuc2NvZGVGb3JtYXQ6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LlI4LFxyXG4gICAgICAgICAgICAgICAgZW5naW5lRm9ybWF0OiBLVFgyLkVuZ2luZUZvcm1hdC5SOEZvcm1hdCxcclxuICAgICAgICAgICAgICAgIHJvdW5kVG9NdWx0aXBsZTQ6IGZhbHNlLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBubzoge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9uOiBcImZvcmNlUkc4XCIsXHJcbiAgICAgICAgICAgICAgICB5ZXM6IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2NvZGVGb3JtYXQ6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LlJHOCxcclxuICAgICAgICAgICAgICAgICAgICBlbmdpbmVGb3JtYXQ6IEtUWDIuRW5naW5lRm9ybWF0LlJHOEZvcm1hdCxcclxuICAgICAgICAgICAgICAgICAgICByb3VuZFRvTXVsdGlwbGU0OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBubzoge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhcDogXCJhc3RjXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgeWVzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zY29kZUZvcm1hdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQuQVNUQ180WDRfUkdCQSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lRm9ybWF0OiBLVFgyLkVuZ2luZUZvcm1hdC5DT01QUkVTU0VEX1JHQkFfQVNUQ180WDRfS0hSLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgbm86IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FwOiBcImJwdGNcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgeWVzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2NvZGVGb3JtYXQ6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LkJDN19SR0JBLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lRm9ybWF0OiBLVFgyLkVuZ2luZUZvcm1hdC5DT01QUkVTU0VEX1JHQkFfQlBUQ19VTk9STV9FWFQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb246IFwidXNlUkdCQUlmQVNUQ0JDN05vdEF2YWlsYWJsZVdoZW5VQVNUQ1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2RlRm9ybWF0OiBLVFgyLlRyYW5zY29kZVRhcmdldC5SR0JBMzIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lRm9ybWF0OiBLVFgyLkVuZ2luZUZvcm1hdC5SR0JBOEZvcm1hdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZFRvTXVsdGlwbGU0OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBubzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcDogXCJldGMyXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zY29kZUZvcm1hdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQuRVRDMl9SR0JBLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lRm9ybWF0OiBLVFgyLkVuZ2luZUZvcm1hdC5DT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2RlRm9ybWF0OiBLVFgyLlRyYW5zY29kZVRhcmdldC5FVEMxX1JHQixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZUZvcm1hdDogS1RYMi5FbmdpbmVGb3JtYXQuQ09NUFJFU1NFRF9SR0I4X0VUQzIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXA6IFwiZXRjMVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zY29kZUZvcm1hdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQuRVRDMV9SR0IsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmVGb3JtYXQ6IEtUWDIuRW5naW5lRm9ybWF0LkNPTVBSRVNTRURfUkdCX0VUQzFfV0VCR0wsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXA6IFwiczN0Y1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGE6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zY29kZUZvcm1hdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQuQkMzX1JHQkEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZUZvcm1hdDogS1RYMi5FbmdpbmVGb3JtYXQuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2NvZGVGb3JtYXQ6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LkJDMV9SR0IsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZUZvcm1hdDogS1RYMi5FbmdpbmVGb3JtYXQuQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwOiBcInB2cnRjXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZHNQb3dlck9mVHdvOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2NvZGVGb3JtYXQ6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LlBWUlRDMV80X1JHQkEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmVGb3JtYXQ6IEtUWDIuRW5naW5lRm9ybWF0LkNPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2RlRm9ybWF0OiBLVFgyLlRyYW5zY29kZVRhcmdldC5QVlJUQzFfNF9SR0IsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmVGb3JtYXQ6IEtUWDIuRW5naW5lRm9ybWF0LkNPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2NvZGVGb3JtYXQ6IEtUWDIuVHJhbnNjb2RlVGFyZ2V0LlJHQkEzMixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lRm9ybWF0OiBLVFgyLkVuZ2luZUZvcm1hdC5SR0JBOEZvcm1hdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRUb011bHRpcGxlNDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgIH0sXHJcbn07XHJcblxyXG5leHBvcnQgY2xhc3MgVHJhbnNjb2RlRGVjaXNpb25UcmVlIHtcclxuICAgIHByaXZhdGUgc3RhdGljIF9Jc0xlYWZOb2RlKG5vZGU6IEtUWDIuSU5vZGUgfCBLVFgyLklMZWFmKTogbm9kZSBpcyBLVFgyLklMZWFmIHtcclxuICAgICAgICByZXR1cm4gKG5vZGUgYXMgS1RYMi5JTGVhZikuZW5naW5lRm9ybWF0ICE9PSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdGV4dHVyZUZvcm1hdDogS1RYMi5Tb3VyY2VUZXh0dXJlRm9ybWF0O1xyXG4gICAgcHJpdmF0ZSBfaGFzQWxwaGE6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIF9pc1Bvd2VyT2ZUd286IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIF9jYXBzOiBLVFgyLklDb21wcmVzc2VkRm9ybWF0Q2FwYWJpbGl0aWVzO1xyXG4gICAgcHJpdmF0ZSBfb3B0aW9uczogS1RYMi5JS1RYMkRlY29kZXJPcHRpb25zO1xyXG4gICAgcHJpdmF0ZSBfdHJhbnNjb2RlRm9ybWF0OiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9lbmdpbmVGb3JtYXQ6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX3JvdW5kVG9NdWx0aXBsZTQ6IGJvb2xlYW47XHJcblxyXG4gICAgcHVibGljIGdldCB0cmFuc2NvZGVGb3JtYXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zY29kZUZvcm1hdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGVuZ2luZUZvcm1hdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZW5naW5lRm9ybWF0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgcm91bmRUb011bHRpcGxlNCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcm91bmRUb011bHRpcGxlNDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih0ZXh0dXJlRm9ybWF0OiBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXQsIGhhc0FscGhhOiBib29sZWFuLCBpc1Bvd2VyT2ZUd286IGJvb2xlYW4sIGNhcHM6IEtUWDIuSUNvbXByZXNzZWRGb3JtYXRDYXBhYmlsaXRpZXMsIG9wdGlvbnM/OiBLVFgyLklLVFgyRGVjb2Rlck9wdGlvbnMpIHtcclxuICAgICAgICB0aGlzLl90ZXh0dXJlRm9ybWF0ID0gdGV4dHVyZUZvcm1hdDtcclxuICAgICAgICB0aGlzLl9oYXNBbHBoYSA9IGhhc0FscGhhO1xyXG4gICAgICAgIHRoaXMuX2lzUG93ZXJPZlR3byA9IGlzUG93ZXJPZlR3bztcclxuICAgICAgICB0aGlzLl9jYXBzID0gY2FwcztcclxuICAgICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucyA/PyB7fTtcclxuXHJcbiAgICAgICAgdGhpcy5wYXJzZVRyZWUoRGVjaXNpb25UcmVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcGFyc2VUcmVlKHRyZWU6IEtUWDIuSURlY2lzaW9uVHJlZSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLl90ZXh0dXJlRm9ybWF0ID09PSBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXQuVUFTVEM0eDQgPyB0cmVlLlVBU1RDIDogdHJlZS5FVEMxUztcclxuICAgICAgICBpZiAobm9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9wYXJzZU5vZGUobm9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBub2RlICE9PSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcGFyc2VOb2RlKG5vZGU6IEtUWDIuSU5vZGUgfCBLVFgyLklMZWFmIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFub2RlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChUcmFuc2NvZGVEZWNpc2lvblRyZWUuX0lzTGVhZk5vZGUobm9kZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5fdHJhbnNjb2RlRm9ybWF0ID0gbm9kZS50cmFuc2NvZGVGb3JtYXQ7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2luZUZvcm1hdCA9IG5vZGUuZW5naW5lRm9ybWF0O1xyXG4gICAgICAgICAgICB0aGlzLl9yb3VuZFRvTXVsdGlwbGU0ID0gbm9kZS5yb3VuZFRvTXVsdGlwbGU0ID8/IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGNvbmRpdGlvbiA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBpZiAobm9kZS5jYXAgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uICYmICEhdGhpcy5fY2Fwc1tub2RlLmNhcCBhcyBrZXlvZiB0eXBlb2YgdGhpcy5fY2Fwc107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG5vZGUub3B0aW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbiAmJiAhIXRoaXMuX29wdGlvbnNbbm9kZS5vcHRpb24gYXMga2V5b2YgdHlwZW9mIHRoaXMuX29wdGlvbnNdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChub2RlLmFscGhhICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbiAmJiB0aGlzLl9oYXNBbHBoYSA9PT0gbm9kZS5hbHBoYTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobm9kZS5uZWVkc1Bvd2VyT2ZUd28gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uICYmIHRoaXMuX2lzUG93ZXJPZlR3byA9PT0gbm9kZS5uZWVkc1Bvd2VyT2ZUd287XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG5vZGUudHJhbnNjb2RlRm9ybWF0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUudHJhbnNjb2RlRm9ybWF0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbiAmJiBub2RlLnRyYW5zY29kZUZvcm1hdC5pbmRleE9mKHRoaXMuX3RyYW5zY29kZUZvcm1hdCkgIT09IC0xO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gPSBjb25kaXRpb24gJiYgbm9kZS50cmFuc2NvZGVGb3JtYXQgPT09IHRoaXMuX3RyYW5zY29kZUZvcm1hdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fcGFyc2VOb2RlKGNvbmRpdGlvbiA/IG5vZGUueWVzISA6IG5vZGUubm8hKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXHJcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xyXG5pbXBvcnQgdHlwZSAqIGFzIEtUWDIgZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL2t0eDJkZWNvZGVyVHlwZXNcIjtcclxuXHJcbmltcG9ydCB0eXBlIHsgV0FTTU1lbW9yeU1hbmFnZXIgfSBmcm9tIFwiLi93YXNtTWVtb3J5TWFuYWdlclwiO1xyXG5pbXBvcnQgdHlwZSB7IEtUWDJGaWxlUmVhZGVyLCBJS1RYMl9JbWFnZURlc2MgfSBmcm9tIFwiLi9rdHgyRmlsZVJlYWRlclwiO1xyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRyYW5zY29kZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyBDYW5UcmFuc2NvZGUoc3JjOiBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXQsIGRzdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQsIGlzSW5HYW1tYVNwYWNlOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgTmFtZSA9IFwiVHJhbnNjb2RlclwiO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgV2FzbUJhc2VVcmwgPSBcIlwiO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgR2V0V2FzbVVybCh3YXNtVXJsOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoVHJhbnNjb2Rlci5XYXNtQmFzZVVybCAmJiB3YXNtVXJsLnN0YXJ0c1dpdGgoXCJodHRwczovL2Nkbi5iYWJ5bG9uanMuY29tL1wiKSkge1xyXG4gICAgICAgICAgICB3YXNtVXJsID0gd2FzbVVybC5yZXBsYWNlKFwiaHR0cHM6Ly9jZG4uYmFieWxvbmpzLmNvbS9cIiwgVHJhbnNjb2Rlci5XYXNtQmFzZVVybCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB3YXNtVXJsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXROYW1lKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIFRyYW5zY29kZXIuTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdGlhbGl6ZSgpOiB2b2lkIHt9XHJcblxyXG4gICAgcHVibGljIG5lZWRNZW1vcnlNYW5hZ2VyKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0TWVtb3J5TWFuYWdlcihtZW1vcnlNZ3I6IFdBU01NZW1vcnlNYW5hZ2VyKTogdm9pZCB7fVxyXG5cclxuICAgIHB1YmxpYyB0cmFuc2NvZGUoXHJcbiAgICAgICAgc3JjOiBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXQsXHJcbiAgICAgICAgZHN0OiBLVFgyLlRyYW5zY29kZVRhcmdldCxcclxuICAgICAgICBsZXZlbDogbnVtYmVyLFxyXG4gICAgICAgIHdpZHRoOiBudW1iZXIsXHJcbiAgICAgICAgaGVpZ2h0OiBudW1iZXIsXHJcbiAgICAgICAgdW5jb21wcmVzc2VkQnl0ZUxlbmd0aDogbnVtYmVyLFxyXG4gICAgICAgIGt0eDJSZWFkZXI6IEtUWDJGaWxlUmVhZGVyLFxyXG4gICAgICAgIGltYWdlRGVzYzogSUtUWDJfSW1hZ2VEZXNjIHwgbnVsbCxcclxuICAgICAgICBlbmNvZGVkRGF0YTogVWludDhBcnJheVxyXG4gICAgKTogUHJvbWlzZTxVaW50OEFycmF5IHwgbnVsbD4ge1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0ICogYXMgS1RYMiBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMva3R4MmRlY29kZXJUeXBlc1wiO1xyXG5cclxuaW1wb3J0IHR5cGUgeyBUcmFuc2NvZGVyIH0gZnJvbSBcIi4vdHJhbnNjb2RlclwiO1xyXG5pbXBvcnQgeyBXQVNNTWVtb3J5TWFuYWdlciB9IGZyb20gXCIuL3dhc21NZW1vcnlNYW5hZ2VyXCI7XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVHJhbnNjb2Rlck1hbmFnZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyBfVHJhbnNjb2RlcnM6IEFycmF5PHR5cGVvZiBUcmFuc2NvZGVyPiA9IFtdO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgUmVnaXN0ZXJUcmFuc2NvZGVyKHRyYW5zY29kZXI6IHR5cGVvZiBUcmFuc2NvZGVyKSB7XHJcbiAgICAgICAgVHJhbnNjb2Rlck1hbmFnZXIuX1RyYW5zY29kZXJzLnB1c2godHJhbnNjb2Rlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX1RyYW5zY29kZXJJbnN0YW5jZXM6IHsgW2tleTogc3RyaW5nXTogQXJyYXk8VHJhbnNjb2Rlcj4gfSA9IHt9O1xyXG5cclxuICAgIHByaXZhdGUgX3dhc21NZW1vcnlNYW5hZ2VyOiBXQVNNTWVtb3J5TWFuYWdlcjtcclxuXHJcbiAgICBwdWJsaWMgZmluZFRyYW5zY29kZXIoc3JjOiBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXQsIGRzdDogS1RYMi5UcmFuc2NvZGVUYXJnZXQsIGlzSW5HYW1tYVNwYWNlOiBib29sZWFuLCBieXBhc3M/OiBzdHJpbmdbXSk6IFRyYW5zY29kZXIgfCBudWxsIHtcclxuICAgICAgICBsZXQgdHJhbnNjb2RlcjogVHJhbnNjb2RlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgICBjb25zdCBrZXkgPSBLVFgyLlNvdXJjZVRleHR1cmVGb3JtYXRbc3JjXSArIFwiX1wiICsgS1RYMi5UcmFuc2NvZGVUYXJnZXRbZHN0XTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUcmFuc2NvZGVyTWFuYWdlci5fVHJhbnNjb2RlcnMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgICAgICAgaWYgKFRyYW5zY29kZXJNYW5hZ2VyLl9UcmFuc2NvZGVyc1tpXS5DYW5UcmFuc2NvZGUoc3JjLCBkc3QsIGlzSW5HYW1tYVNwYWNlKSAmJiAoIWJ5cGFzcyB8fCBieXBhc3MuaW5kZXhPZihUcmFuc2NvZGVyTWFuYWdlci5fVHJhbnNjb2RlcnNbaV0uTmFtZSkgPCAwKSkge1xyXG4gICAgICAgICAgICAgICAgdHJhbnNjb2RlciA9IHRoaXMuX2dldEV4aXN0aW5nVHJhbnNjb2RlcihrZXksIFRyYW5zY29kZXJNYW5hZ2VyLl9UcmFuc2NvZGVyc1tpXS5OYW1lKTtcclxuICAgICAgICAgICAgICAgIGlmICghdHJhbnNjb2Rlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zY29kZXIgPSBuZXcgVHJhbnNjb2Rlck1hbmFnZXIuX1RyYW5zY29kZXJzW2ldKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2RlciEuaW5pdGlhbGl6ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2NvZGVyIS5uZWVkTWVtb3J5TWFuYWdlcigpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fd2FzbU1lbW9yeU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3dhc21NZW1vcnlNYW5hZ2VyID0gbmV3IFdBU01NZW1vcnlNYW5hZ2VyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2RlciEuc2V0TWVtb3J5TWFuYWdlcih0aGlzLl93YXNtTWVtb3J5TWFuYWdlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghVHJhbnNjb2Rlck1hbmFnZXIuX1RyYW5zY29kZXJJbnN0YW5jZXNba2V5XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2NvZGVyTWFuYWdlci5fVHJhbnNjb2Rlckluc3RhbmNlc1trZXldID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIFRyYW5zY29kZXJNYW5hZ2VyLl9UcmFuc2NvZGVySW5zdGFuY2VzW2tleV0ucHVzaCh0cmFuc2NvZGVyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJhbnNjb2RlcjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9nZXRFeGlzdGluZ1RyYW5zY29kZXIoa2V5OiBzdHJpbmcsIHRyYW5zY29kZXJOYW1lOiBzdHJpbmcpOiBUcmFuc2NvZGVyIHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgdHJhbnNjb2RlcnMgPSBUcmFuc2NvZGVyTWFuYWdlci5fVHJhbnNjb2Rlckluc3RhbmNlc1trZXldO1xyXG5cclxuICAgICAgICBpZiAodHJhbnNjb2RlcnMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0cmFuc2NvZGVycy5sZW5ndGg7ICsrdCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNjb2RlciA9IHRyYW5zY29kZXJzW3RdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zY29kZXJOYW1lID09PSB0cmFuc2NvZGVyLmdldE5hbWUoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2NvZGVyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxyXG4iLCJkZWNsYXJlIGZ1bmN0aW9uIHBvc3RNZXNzYWdlKG1lc3NhZ2U6IGFueSwgdHJhbnNmZXI/OiBhbnlbXSk6IHZvaWQ7XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgV0FTTU1lbW9yeU1hbmFnZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyBMb2FkQmluYXJpZXNGcm9tQ3VycmVudFRocmVhZCA9IHRydWU7XHJcbiAgICBwdWJsaWMgc3RhdGljIEluaXRpYWxNZW1vcnlQYWdlcyA9ICgxICogMTAyNCAqIDEwMjQpID4+IDE2OyAvLyAxIE1ieXRlc1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIF9SZXF1ZXN0SWQgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgTG9hZFdBU00ocGF0aDogc3RyaW5nKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4ge1xyXG4gICAgICAgIGlmICh0aGlzLkxvYWRCaW5hcmllc0Zyb21DdXJyZW50VGhyZWFkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBmZXRjaChwYXRoKVxyXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZldGNoIHRoZSB3YXNtIGNvbXBvbmVudCBmcm9tIFwiJHtwYXRofVwiOiAke3Jlc3BvbnNlLnN0YXR1c30gLSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAudGhlbigod2FzbUJpbmFyeSkgPT4gcmVzb2x2ZSh3YXNtQmluYXJ5KSlcclxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBpZCA9IHRoaXMuX1JlcXVlc3RJZCsrO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgd2FzbUxvYWRlZEhhbmRsZXIgPSAobXNnOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChtc2cuZGF0YS5hY3Rpb24gPT09IFwid2FzbUxvYWRlZFwiICYmIG1zZy5kYXRhLmlkID09PSBpZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgd2FzbUxvYWRlZEhhbmRsZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUobXNnLmRhdGEud2FzbUJpbmFyeSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHdhc21Mb2FkZWRIYW5kbGVyKTtcclxuXHJcbiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsgYWN0aW9uOiBcImxvYWRXQVNNXCIsIHBhdGg6IHBhdGgsIGlkOiBpZCB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9tZW1vcnk6IFdlYkFzc2VtYmx5Lk1lbW9yeTtcclxuICAgIHByaXZhdGUgX251bVBhZ2VzOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9tZW1vcnlWaWV3OiBVaW50OEFycmF5O1xyXG4gICAgcHJpdmF0ZSBfbWVtb3J5Vmlld0J5dGVMZW5ndGg6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX21lbW9yeVZpZXdPZmZzZXQ6IG51bWJlcjtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihpbml0aWFsTWVtb3J5UGFnZXM6IG51bWJlciA9IFdBU01NZW1vcnlNYW5hZ2VyLkluaXRpYWxNZW1vcnlQYWdlcykge1xyXG4gICAgICAgIHRoaXMuX251bVBhZ2VzID0gaW5pdGlhbE1lbW9yeVBhZ2VzO1xyXG5cclxuICAgICAgICB0aGlzLl9tZW1vcnkgPSBuZXcgV2ViQXNzZW1ibHkuTWVtb3J5KHsgaW5pdGlhbDogdGhpcy5fbnVtUGFnZXMgfSk7XHJcbiAgICAgICAgdGhpcy5fbWVtb3J5Vmlld0J5dGVMZW5ndGggPSB0aGlzLl9udW1QYWdlcyA8PCAxNjtcclxuICAgICAgICB0aGlzLl9tZW1vcnlWaWV3T2Zmc2V0ID0gMDtcclxuICAgICAgICB0aGlzLl9tZW1vcnlWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fbWVtb3J5LmJ1ZmZlciwgdGhpcy5fbWVtb3J5Vmlld09mZnNldCwgdGhpcy5fbWVtb3J5Vmlld0J5dGVMZW5ndGgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgd2FzbU1lbW9yeSgpOiBXZWJBc3NlbWJseS5NZW1vcnkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZW1vcnk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE1lbW9yeVZpZXcobnVtUGFnZXM6IG51bWJlciwgb2Zmc2V0OiBudW1iZXIgPSAwLCBieXRlTGVuZ3RoPzogbnVtYmVyKTogVWludDhBcnJheSB7XHJcbiAgICAgICAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPz8gbnVtUGFnZXMgPDwgMTY7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9udW1QYWdlcyA8IG51bVBhZ2VzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21lbW9yeS5ncm93KG51bVBhZ2VzIC0gdGhpcy5fbnVtUGFnZXMpO1xyXG4gICAgICAgICAgICB0aGlzLl9udW1QYWdlcyA9IG51bVBhZ2VzO1xyXG4gICAgICAgICAgICB0aGlzLl9tZW1vcnlWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fbWVtb3J5LmJ1ZmZlciwgb2Zmc2V0LCBieXRlTGVuZ3RoKTtcclxuICAgICAgICAgICAgdGhpcy5fbWVtb3J5Vmlld0J5dGVMZW5ndGggPSBieXRlTGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLl9tZW1vcnlWaWV3T2Zmc2V0ID0gb2Zmc2V0O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21lbW9yeVZpZXcgPSBuZXcgVWludDhBcnJheSh0aGlzLl9tZW1vcnkuYnVmZmVyLCBvZmZzZXQsIGJ5dGVMZW5ndGgpO1xyXG4gICAgICAgICAgICB0aGlzLl9tZW1vcnlWaWV3Qnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGg7XHJcbiAgICAgICAgICAgIHRoaXMuX21lbW9yeVZpZXdPZmZzZXQgPSBvZmZzZXQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbWVtb3J5VmlldztcclxuICAgIH1cclxufVxyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24gKi9cclxuXHJcbmltcG9ydCB7IFRyYW5zY29kZXIgfSBmcm9tIFwiLi90cmFuc2NvZGVyXCI7XHJcblxyXG4vKipcclxuICogRnJvbSBodHRwczovL2dpdGh1Yi5jb20vZG9ubWNjdXJkeS96c3RkZGVjIGJ5IERvbiBNY0N1cmR5XHJcbiAqL1xyXG5pbnRlcmZhY2UgRGVjb2RlckV4cG9ydHMge1xyXG4gICAgbWVtb3J5OiBVaW50OEFycmF5O1xyXG5cclxuICAgIFpTVERfZmluZERlY29tcHJlc3NlZFNpemU6IChjb21wcmVzc2VkUHRyOiBudW1iZXIsIGNvbXByZXNzZWRTaXplOiBudW1iZXIpID0+IG51bWJlcjtcclxuICAgIFpTVERfZGVjb21wcmVzczogKHVuY29tcHJlc3NlZFB0cjogbnVtYmVyLCB1bmNvbXByZXNzZWRTaXplOiBudW1iZXIsIGNvbXByZXNzZWRQdHI6IG51bWJlciwgY29tcHJlc3NlZFNpemU6IG51bWJlcikgPT4gbnVtYmVyO1xyXG4gICAgbWFsbG9jOiAocHRyOiBudW1iZXIpID0+IG51bWJlcjtcclxuICAgIGZyZWU6IChwdHI6IG51bWJlcikgPT4gdm9pZDtcclxufVxyXG5cclxubGV0IGluaXQ6IFByb21pc2U8dm9pZD47XHJcbmxldCBpbnN0YW5jZTogeyBleHBvcnRzOiBEZWNvZGVyRXhwb3J0cyB9O1xyXG5sZXQgaGVhcDogVWludDhBcnJheTtcclxuXHJcbmNvbnN0IElNUE9SVF9PQkpFQ1QgPSB7XHJcbiAgICBlbnY6IHtcclxuICAgICAgICBlbXNjcmlwdGVuX25vdGlmeV9tZW1vcnlfZ3Jvd3RoOiBmdW5jdGlvbiAoKTogdm9pZCB7XHJcbiAgICAgICAgICAgIGhlYXAgPSBuZXcgVWludDhBcnJheShpbnN0YW5jZS5leHBvcnRzLm1lbW9yeS5idWZmZXIpO1xyXG4gICAgICAgIH0sXHJcbiAgICB9LFxyXG59O1xyXG5cclxuLyoqXHJcbiAqIFpTVEQgKFpzdGFuZGFyZCkgZGVjb2Rlci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBaU1RERGVjb2RlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIFdhc21Nb2R1bGVVUkwgPSBcImh0dHBzOi8vY2RuLmJhYnlsb25qcy5jb20venN0ZGRlYy53YXNtXCI7XHJcblxyXG4gICAgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAoaW5pdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gaW5pdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgZmV0Y2ggIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgLy8gV2ViLlxyXG5cclxuICAgICAgICAgICAgaW5pdCA9IGZldGNoKFRyYW5zY29kZXIuR2V0V2FzbVVybChaU1RERGVjb2Rlci5XYXNtTW9kdWxlVVJMKSlcclxuICAgICAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmV0Y2ggdGhlIHdhc20gY29tcG9uZW50IGZvciB0aGUgWnN0YW5kYXJkIGRlY29tcHJlc3Npb24gbGliOiAke3Jlc3BvbnNlLnN0YXR1c30gLSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oKGFycmF5QnVmZmVyKSA9PiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShhcnJheUJ1ZmZlciwgSU1QT1JUX09CSkVDVCkpXHJcbiAgICAgICAgICAgICAgICAudGhlbih0aGlzLl9pbml0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBOb2RlLmpzLlxyXG5cclxuICAgICAgICAgICAgaW5pdCA9IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKGZldGNoKFpTVEREZWNvZGVyLldhc21Nb2R1bGVVUkwpLCBJTVBPUlRfT0JKRUNUKS50aGVuKHRoaXMuX2luaXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGluaXQ7XHJcbiAgICB9XHJcblxyXG4gICAgX2luaXQocmVzdWx0OiBXZWJBc3NlbWJseS5XZWJBc3NlbWJseUluc3RhbnRpYXRlZFNvdXJjZSk6IHZvaWQge1xyXG4gICAgICAgIGluc3RhbmNlID0gcmVzdWx0Lmluc3RhbmNlIGFzIHVua25vd24gYXMgeyBleHBvcnRzOiBEZWNvZGVyRXhwb3J0cyB9O1xyXG5cclxuICAgICAgICBJTVBPUlRfT0JKRUNULmVudi5lbXNjcmlwdGVuX25vdGlmeV9tZW1vcnlfZ3Jvd3RoKCk7IC8vIGluaXRpYWxpemUgaGVhcC5cclxuICAgIH1cclxuXHJcbiAgICBkZWNvZGUoYXJyYXk6IFVpbnQ4QXJyYXksIHVuY29tcHJlc3NlZFNpemUgPSAwKTogVWludDhBcnJheSB7XHJcbiAgICAgICAgaWYgKCFpbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFpTVEREZWNvZGVyOiBBd2FpdCAuaW5pdCgpIGJlZm9yZSBkZWNvZGluZy5gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFdyaXRlIGNvbXByZXNzZWQgZGF0YSBpbnRvIFdBU00gbWVtb3J5LlxyXG4gICAgICAgIGNvbnN0IGNvbXByZXNzZWRTaXplID0gYXJyYXkuYnl0ZUxlbmd0aDtcclxuICAgICAgICBjb25zdCBjb21wcmVzc2VkUHRyID0gaW5zdGFuY2UuZXhwb3J0cy5tYWxsb2MoY29tcHJlc3NlZFNpemUpO1xyXG4gICAgICAgIGhlYXAuc2V0KGFycmF5LCBjb21wcmVzc2VkUHRyKTtcclxuXHJcbiAgICAgICAgLy8gRGVjb21wcmVzcyBpbnRvIFdBU00gbWVtb3J5LlxyXG4gICAgICAgIHVuY29tcHJlc3NlZFNpemUgPSB1bmNvbXByZXNzZWRTaXplIHx8IE51bWJlcihpbnN0YW5jZS5leHBvcnRzLlpTVERfZmluZERlY29tcHJlc3NlZFNpemUoY29tcHJlc3NlZFB0ciwgY29tcHJlc3NlZFNpemUpKTtcclxuICAgICAgICBjb25zdCB1bmNvbXByZXNzZWRQdHIgPSBpbnN0YW5jZS5leHBvcnRzLm1hbGxvYyh1bmNvbXByZXNzZWRTaXplKTtcclxuICAgICAgICBjb25zdCBhY3R1YWxTaXplID0gaW5zdGFuY2UuZXhwb3J0cy5aU1REX2RlY29tcHJlc3ModW5jb21wcmVzc2VkUHRyLCB1bmNvbXByZXNzZWRTaXplLCBjb21wcmVzc2VkUHRyLCBjb21wcmVzc2VkU2l6ZSk7XHJcblxyXG4gICAgICAgIC8vIFJlYWQgZGVjb21wcmVzc2VkIGRhdGEgYW5kIGZyZWUgV0FTTSBtZW1vcnkuXHJcbiAgICAgICAgY29uc3QgZGVjID0gaGVhcC5zbGljZSh1bmNvbXByZXNzZWRQdHIsIHVuY29tcHJlc3NlZFB0ciArIGFjdHVhbFNpemUpO1xyXG4gICAgICAgIGluc3RhbmNlLmV4cG9ydHMuZnJlZShjb21wcmVzc2VkUHRyKTtcclxuICAgICAgICBpbnN0YW5jZS5leHBvcnRzLmZyZWUodW5jb21wcmVzc2VkUHRyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRlYztcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEJTRCBMaWNlbnNlXHJcbiAqXHJcbiAqIEZvciBac3RhbmRhcmQgc29mdHdhcmVcclxuICpcclxuICogQ29weXJpZ2h0IChjKSAyMDE2LXByZXNlbnQsIFlhbm4gQ29sbGV0LCBGYWNlYm9vaywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKlxyXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxyXG4gKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XHJcbiAqXHJcbiAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xyXG4gKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cclxuICpcclxuICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxyXG4gKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXHJcbiAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxyXG4gKlxyXG4gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEZhY2Vib29rIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0b1xyXG4gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpY1xyXG4gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxyXG4gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxyXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXHJcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SXHJcbiAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xyXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XHJcbiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTlxyXG4gKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxyXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xyXG4gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICovXHJcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJpbXBvcnQgKiBhcyBrdHgyZGVjb2RlciBmcm9tIFwia3R4MmRlY29kZXIvbGVnYWN5L2xlZ2FjeVwiO1xyXG5cclxuZXhwb3J0IHsga3R4MmRlY29kZXIgfTtcclxuZXhwb3J0IGRlZmF1bHQga3R4MmRlY29kZXI7XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "babylonjs-ktx2decoder",
3
- "version": "7.31.1",
3
+ "version": "7.32.0",
4
4
  "main": "babylon.ktx2Decoder.js",
5
5
  "types": "babylon.ktx2Decoder.module.d.ts",
6
6
  "files": [
@@ -14,7 +14,7 @@
14
14
  "clean": "rimraf dist && rimraf babylon*.* -g"
15
15
  },
16
16
  "dependencies": {
17
- "babylonjs": "^7.31.1"
17
+ "babylonjs": "^7.32.0"
18
18
  },
19
19
  "devDependencies": {
20
20
  "@dev/build-tools": "1.0.0",