From 2e30af3eb5c61644046173df1f7bd7439a05bda0 Mon Sep 17 00:00:00 2001 From: Shin-Ogata Date: Tue, 21 Nov 2017 17:32:09 +0900 Subject: [PATCH] updated: v0.1.4 - fixed: quote command issues --- dist/@types/cdp-lib/index.d.ts | 2 +- dist/cdp-lib.js | 6 +++--- dist/cdp-lib.min.js | 4 ++-- dist/cdp-lib.min.js.map | 2 +- package.json | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dist/@types/cdp-lib/index.d.ts b/dist/@types/cdp-lib/index.d.ts index 94760cb..3a60c8b 100644 --- a/dist/@types/cdp-lib/index.d.ts +++ b/dist/@types/cdp-lib/index.d.ts @@ -2,7 +2,7 @@ * cdp-lib.d.ts * This file is generated by the CDP package build process. * - * Date: 2017-11-15T03:44:27.505Z + * Date: 2017-11-21T08:28:52.793Z */ // Dependencies for this module: // ../fs-extra diff --git a/dist/cdp-lib.js b/dist/cdp-lib.js index d86f148..0f6deca 100644 --- a/dist/cdp-lib.js +++ b/dist/cdp-lib.js @@ -1,7 +1,7 @@ /*! - * cdp-lib.js 0.1.3 + * cdp-lib.js 0.1.4 * - * Date: 2017-11-15T03:44:26.440Z + * Date: 2017-11-21T08:28:50.840Z */ module.exports = @@ -2313,4 +2313,4 @@ exports.GeneratorBase = GeneratorBase; /***/ }) /******/ ]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgNGM2NTliMGM1MDRjZmY0OGY4OGMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicGF0aFwiIiwiY2RwOi8vL2NkcC1saWIvZ2VuZXJhdG9ycy9iYXNlL2luZGV4LnRzIiwiY2RwOi8vL2NkcC1saWIvdXRpbHMvaW5kZXgudHMiLCJjZHA6Ly8vY2RwLWxpYi91dGlscy9saWJzLnRzIiwid2VicGFjazovLy9leHRlcm5hbCBcIm9zXCIiLCJjZHA6Ly8vY2RwLWxpYi91dGlscy9zZXR0aW5ncy50cyIsImNkcDovLy9jZHAtbGliL2dlbmVyYXRvcnMvbGlicmFyeS9pbmRleC50cyIsImNkcDovLy9jZHAtbGliL2dlbmVyYXRvcnMvbGlicmFyeS9nZW5lcmF0b3ItbW9kdWxlLnRzIiwiY2RwOi8vL2NkcC1saWIvZ2VuZXJhdG9ycy9tb2JpbGUvaW5kZXgudHMiLCJjZHA6Ly8vY2RwLWxpYi9nZW5lcmF0b3JzL21vYmlsZS9nZW5lcmF0b3ItY29yZG92YS50cyIsImNkcDovLy9jZHAtbGliL2dlbmVyYXRvcnMvZGVza3RvcC9pbmRleC50cyIsImNkcDovLy9jZHAtbGliL2dlbmVyYXRvcnMvZGVza3RvcC9nZW5lcmF0b3ItZWxlY3Rvcm9uLnRzIiwiY2RwOi8vL2NkcC1saWIvZ2VuZXJhdG9ycy93ZWIvaW5kZXgudHMiLCJjZHA6Ly8vY2RwLWxpYi9nZW5lcmF0b3JzL3dlYi9nZW5lcmF0b3ItYnJvd3Nlci50cyIsImNkcDovLy9jZHAtbGliL2NkcC1saWIudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJmcy1leHRyYVwiLFwiY29tbW9uanMyXCI6XCJmcy1leHRyYVwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcImdsb2JcIixcImNvbW1vbmpzMlwiOlwiZ2xvYlwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wicm9vdFwiOlwiSG9nYW5cIixcImNvbW1vbmpzXCI6XCJob2dhbi5qc1wiLFwiY29tbW9uanMyXCI6XCJob2dhbi5qc1wiLFwiYW1kXCI6XCJob2dhbi5qc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wicm9vdFwiOlwiX1wiLFwiY29tbW9uanNcIjpcImxvZGFzaFwiLFwiY29tbW9uanMyXCI6XCJsb2Rhc2hcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcIl9cIixcImNvbW1vbmpzXCI6XCJ1bmRlcnNjb3JlLnN0cmluZ1wiLFwiY29tbW9uanMyXCI6XCJ1bmRlcnNjb3JlLnN0cmluZ1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcIndoaWNoXCIsXCJjb21tb25qczJcIjpcIndoaWNoXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qc1wiOlwidXVpZFwiLFwiY29tbW9uanMyXCI6XCJ1dWlkXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qc1wiOlwiY2hhbGtcIixcImNvbW1vbmpzMlwiOlwiY2hhbGtcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJzZW12ZXItcmVnZXhcIixcImNvbW1vbmpzMlwiOlwic2VtdmVyLXJlZ2V4XCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qc1wiOlwiY2xpLXNwaW5uZXJcIixcImNvbW1vbmpzMlwiOlwiY2xpLXNwaW5uZXJcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJqc2RvbVwiLFwiY29tbW9uanMyXCI6XCJqc2RvbVwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcInhtbGRvbVwiLFwiY29tbW9uanMyXCI6XCJ4bWxkb21cIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcImpRdWVyeVwiLFwiY29tbW9uanNcIjpcImpxdWVyeVwiLFwiY29tbW9uanMyXCI6XCJqcXVlcnlcIixcImFtZFwiOlwianF1ZXJ5XCJ9IiwiY2RwOi8vL2NkcC1saWIvdXRpbHMvdG9vbHMudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiY2hpbGRfcHJvY2Vzc1wiIiwiY2RwOi8vL2NkcC1saWIvZ2VuZXJhdG9ycy9pbmRleC50cyIsImNkcDovLy9jZHAtbGliL2dlbmVyYXRvcnMvYmFzZS9pbnRlcmZhY2VzLnRzIiwiY2RwOi8vL2NkcC1saWIvZ2VuZXJhdG9ycy9iYXNlL2dlbmVyYXRvci1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7QUM3REEsaUM7Ozs7Ozs7Ozs7OztBQ0FBLGtDQUE2QjtBQUM3QixrQ0FBaUM7Ozs7Ozs7Ozs7Ozs7QUNEakMsaUNBQXVCO0FBQ3ZCLGtDQUF3QjtBQUN4QixpQ0FBMkI7Ozs7Ozs7Ozs7QUNGM0IsbUNBQStCO0FBeUMzQixnQkFBRTtBQXhDTixxQ0FBNkI7QUF5Q3pCLG9CQUFJO0FBeENSLHNDQUFrQztBQXlDOUIsc0JBQUs7QUF4Q1QsbUNBQTZCO0FBQzdCLG1DQUF3QztBQUN4QyxzQ0FBK0I7QUF5QzNCLHNCQUFLO0FBeENULHFDQUE2QjtBQXlDekIsb0JBQUk7QUF4Q1Isd0NBQTBCO0FBeUN0QixnQkF6Q0csZUFBSyxDQXlDSDtBQXhDVCw0Q0FBNEM7QUF5Q3hDLGtDQUFXO0FBeENmLDhDQUFzQztBQXlDbEMs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QUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQzFCLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSjtBQTNhRCxzQ0EyYUMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxNCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgNGM2NTliMGM1MDRjZmY0OGY4OGMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwicGF0aFwiXG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImV4cG9ydCAqIGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2dlbmVyYXRvci1iYXNlXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vLi4vc3JjL2dlbmVyYXRvcnMvYmFzZS9pbmRleC50cyIsImV4cG9ydCAqIGZyb20gXCIuL2xpYnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Rvb2xzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4uLy4uL3NyYy91dGlscy9pbmRleC50cyIsImltcG9ydCAqIGFzIGZzIGZyb20gXCJmcy1leHRyYVwiO1xuaW1wb3J0ICogYXMgZ2xvYiBmcm9tIFwiZ2xvYlwiO1xuaW1wb3J0ICogYXMgaG9nYW4gZnJvbSBcImhvZ2FuLmpzXCI7XG5pbXBvcnQgKiBhcyBfbCBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgKiBhcyBfcyBmcm9tIFwidW5kZXJzY29yZS5zdHJpbmdcIjtcbmltcG9ydCAqIGFzIHdoaWNoIGZyb20gXCJ3aGljaFwiO1xuaW1wb3J0ICogYXMgdXVpZCBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0ICogYXMgc2VtdmVyUmVnZXggZnJvbSBcInNlbXZlci1yZWdleFwiO1xuaW1wb3J0IHsgU3Bpbm5lciB9IGZyb20gXCJjbGktc3Bpbm5lclwiO1xuXG5jb25zdCAkOiBKUXVlcnlTdGF0aWMgPSAoKCkgPT4ge1xuICAgIGNvbnN0IF93aW5kb3cgPSAoKCkgPT4ge1xuICAgICAgICBjb25zdCBqc2RvbSA9IHJlcXVpcmUoXCJqc2RvbVwiKTtcbiAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGpzZG9tLkpTRE9NKSB7ICAgIC8vIHYxMCtcbiAgICAgICAgICAgIHJldHVybiBuZXcganNkb20uSlNET00oKS53aW5kb3c7XG4gICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdjkuMTIueFxuICAgICAgICAgICAgcmV0dXJuIGpzZG9tLmpzZG9tKCkuZGVmYXVsdFZpZXc7XG4gICAgICAgIH1cbiAgICB9KSgpO1xuXG4gICAgLy8gcGF0Y2ggc2NvcGU6XG4gICAgKChyb290OiBhbnkpID0+IHtcbiAgICAgICAgLypcbiAgICAgICAgICoganNkb20gOS40LjAgLSA5LjEyLjAg44Gr5a6f6KOF44GV44KM44Gm44GE44KLIERPTVBhcnNlciDjga8gWE1MIOOBriBzZXJpYWxpemUg44GM44Gn44GN44Gq44GE44Gf44KBLFxuICAgICAgICAgKiB4bWxkb20g44Gr572u44GN5o+b44GI44KLXG4gICAgICAgICAqIGpzZG9tIDEwLjEuMCDjgb7jgafli5XjgYvjgarjgYTjgZPjgajjgpLnorroqo1cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHhtbGRvbSA9IHJlcXVpcmUoXCJ4bWxkb21cIik7XG4gICAgICAgIHJvb3QuRE9NUGFyc2VyID0geG1sZG9tLkRPTVBhcnNlcjtcbiAgICAgICAgLy8geG1sZG9tIOOBq+OBryBkb20udG9TdHJpbmcoKSDjgYzlrp/oo4XjgZXjgozjgabjgYTjgovjgYzjgIFnbG9iYWwg44Gr44KCIGV4cG9ydCDjgZnjgotcbiAgICAgICAgKDxhbnk+Z2xvYmFsKS5YTUxTZXJpYWxpemVyID0gcm9vdC5YTUxTZXJpYWxpemVyID0geG1sZG9tLlhNTFNlcmlhbGl6ZXI7XG4gICAgfSkoX3dpbmRvdyk7XG5cbiAgICByZXR1cm4gcmVxdWlyZShcImpxdWVyeVwiKShfd2luZG93KTtcbn0pKCk7XG5cbmV4cG9ydCB0eXBlIE1peGluZWRVbmRlcnNjb3JlU3RhdGljID0gdHlwZW9mIF9zICYgdHlwZW9mIF9sO1xuY29uc3QgX206IE1peGluZWRVbmRlcnNjb3JlU3RhdGljID0gPGFueT5fbC5taXhpbig8YW55Pl9zLmV4cG9ydHMoKSk7XG5cbmV4cG9ydCB7XG4gICAgZnMsXG4gICAgZ2xvYixcbiAgICBob2dhbixcbiAgICAkLFxuICAgIF9tIGFzIF8sXG4gICAgd2hpY2gsXG4gICAgdXVpZCxcbiAgICBjaGFsayxcbiAgICBzZW12ZXJSZWdleCxcbiAgICBTcGlubmVyLFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi9zcmMvdXRpbHMvbGlicy50cyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm9zXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwib3NcIlxuLy8gbW9kdWxlIGlkID0gNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBmcywgJCB9IGZyb20gXCIuL2xpYnNcIjtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIElHbG9iYWxTZXR0aW5nc1xuICogQGJyaWVmIOOCsOODreODvOODkOODq+ioreWumuOCpOODs+OCv+ODvOODleOCp+OCpOOCuVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElHbG9iYWxTZXR0aW5ncyB7XG4gICAgZm9yY2U/OiBib29sZWFuOyAgICAgICAgICAgIC8vIOOCqOODqeODvOe2mee2mueUqFxuICAgIHZlcmJvc2U/OiBib29sZWFuOyAgICAgICAgICAvLyDoqbPntLDjg63jgrBcbiAgICBzaWxlbnQ/OiBib29sZWFuOyAgICAgICAgICAgLy8gc2lsZW50IG1vZGVcbiAgICB0YXJnZXREaXI/OiBzdHJpbmc7ICAgICAgICAgLy8g5L2c5qWt44OH44Kj44Os44Kv44OI44OqXG4gICAgbGFuZz86IFwiZW4tVVNcIiB8IFwiamEtSlBcIjtcbn1cblxubGV0IF9zZXR0aW5nczogSUdsb2JhbFNldHRpbmdzID0ge1xuICAgIGZvcmNlOiBmYWxzZSxcbiAgICB2ZXJib3NlOiBmYWxzZSxcbiAgICBzaWxlbnQ6IGZhbHNlLFxuICAgIGxhbmc6IFwiZW4tVVNcIixcbn07XG5cbmxldCBfbGliUGF0aDogc3RyaW5nOyAgIC8vIGNkcC1saWIg44Gu5a2Y5Zyo44GX44Gm44GE44KLIHBhdGhcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIGV4cG9ydHMgbWV0aG9kczpcblxuLyoqXG4gKiDoqK3lrprlj5blvpdcbiAqXG4gKiBAcmV0dXJucyBvcHRpb25zIOODreOCsOOBq+S9v+eUqOOBmeOCi+OCquODl+OCt+ODp+ODs1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2V0dGluZ3MoKTogSUdsb2JhbFNldHRpbmdzIHtcbiAgICByZXR1cm4gJC5leHRlbmQoe30sIF9zZXR0aW5ncyk7XG59XG5cbi8qKlxuICog6Kit5a6a5oyH5a6aXG4gKlxuICogQHBhcmFtIG9wdGlvbnMg44Ot44Kw44Gr5L2/55So44GZ44KL44Kq44OX44K344On44OzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRTZXR0aW5ncyhzZXR0aW5nczogSUdsb2JhbFNldHRpbmdzKTogdm9pZCB7XG4gICAgaWYgKHNldHRpbmdzKSB7XG4gICAgICAgIF9zZXR0aW5ncy5mb3JjZSAgICAgPSBzZXR0aW5ncy5mb3JjZSAgICAgICAgfHwgX3NldHRpbmdzLmZvcmNlO1xuICAgICAgICBfc2V0dGluZ3MudmVyYm9zZSAgID0gc2V0dGluZ3MudmVyYm9zZSAgICAgIHx8IF9zZXR0aW5ncy52ZXJib3NlO1xuICAgICAgICBfc2V0dGluZ3Muc2lsZW50ICAgID0gc2V0dGluZ3Muc2lsZW50ICAgICAgIHx8IF9zZXR0aW5ncy5zaWxlbnQ7XG4gICAgICAgIF9zZXR0aW5ncy50YXJnZXREaXIgPSBzZXR0aW5ncy50YXJnZXREaXIgICAgfHwgX3NldHRpbmdzLnRhcmdldERpcjtcbiAgICAgICAgX3NldHRpbmdzLmxhbmcgICAgICA9IHNldHRpbmdzLmxhbmcgICAgICAgICB8fCBfc2V0dGluZ3MubGFuZztcbiAgICB9IGVsc2Uge1xuICAgICAgICBfc2V0dGluZ3MgPSB7XG4gICAgICAgICAgICBmb3JjZTogZmFsc2UsXG4gICAgICAgICAgICB2ZXJib3NlOiBmYWxzZSxcbiAgICAgICAgICAgIHNpbGVudDogZmFsc2UsXG4gICAgICAgICAgICBsYW5nOiBcImVuLVVTXCIsXG4gICAgICAgIH07XG4gICAgfVxufVxuXG4vKipcbiAqIFwiY2RwLWxpYlwiIOOBjOWtmOWcqOOBmeOCi+ODkeOCueOCkuWPluW+l1xuICpcbiAqIEByZXR1cm5zIGNkcC1saWIg44G444GuIHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExpYlBhdGgoKTogc3RyaW5nIHtcbiAgICBpZiAobnVsbCA9PSBfbGliUGF0aCkge1xuICAgICAgICBjb25zdCBUUllfQ09VTlQgPSAzO1xuICAgICAgICBsZXQgdHJpZWQgPSAwO1xuICAgICAgICBfbGliUGF0aCA9IF9fZGlybmFtZTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGlmIChUUllfQ09VTlQgPD0gdHJpZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcImxpYiBwYXRoIGlzIG5vdCByZXNvbHZlZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfbGliUGF0aCA9IHBhdGguam9pbihfbGliUGF0aCwgXCIuLlwiKTtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrID0gcGF0aC5qb2luKF9saWJQYXRoLCBcImNkcC1saWJcIik7XG4gICAgICAgICAgICBpZiAoZnMucGF0aEV4aXN0c1N5bmMoY2hlY2spKSB7XG4gICAgICAgICAgICAgICAgX2xpYlBhdGggPSBjaGVjaztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyaWVkKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIF9saWJQYXRoO1xufVxuXG4vKipcbiAqIOaMh+WumuOBleOCjOOBnyB0YXJnZXREaXIg44KS5Y+W5b6XXG4gKlxuICogQHJldHVybnMgdGFyZ2V0RGlyIOOBuOOBriBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYXJnZXREaXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gX3NldHRpbmdzLnRhcmdldERpcjtcbn1cblxuLyoqXG4gKiDjg63jgrDlh7rliptcbiAqIGNvbnNvbGUubG9nKCkg44Go5ZCM562JXG4gKlxuICogQHBhcmFtIG1lc3NhZ2UgICAgICAgIOWHuuWKm+ODoeODg+OCu+ODvOOCuFxuICogQHBhcmFtIG9wdGlvbmFsUGFyYW1zIOS7mOWKoOaDheWgsVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nKG1lc3NhZ2U/OiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICghX3NldHRpbmdzLnNpbGVudCkge1xuICAgICAgICBpZiAoMCA8IG9wdGlvbmFsUGFyYW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICog6Kmz57Sw44Ot44Kw5Ye65YqbXG4gKiBjb25zb2xlLmRlYnVnKCkg44Go5ZCM562JXG4gKlxuICogQHBhcmFtIG1lc3NhZ2UgICAgICAgIOWHuuWKm+ODoeODg+OCu+ODvOOCuFxuICogQHBhcmFtIG9wdGlvbmFsUGFyYW1zIOS7mOWKoOaDheWgsVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVidWcobWVzc2FnZT86IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKCFfc2V0dGluZ3Muc2lsZW50ICYmIF9zZXR0aW5ncy52ZXJib3NlKSB7XG4gICAgICAgIGlmICgwIDwgb3B0aW9uYWxQYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiREVCVUc6IFwiICsgbWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkRFQlVHOiBcIiArIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIOaknOiovFxuICogY29uc29sZS5hc3NlcnQoKSDjgajlkIznrYlcbiAqXG4gKiBAcGFyYW0gdGVzdCAgICAgICAgICAg5qSc6Ki844GZ44KL5byPXG4gKiBAcGFyYW0gbWVzc2FnZSAgICAgICAg5Ye65Yqb44Oh44OD44K744O844K4XG4gKiBAcGFyYW0gb3B0aW9uYWxQYXJhbXMg5LuY5Yqg5oOF5aCxXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQodGVzdD86IGJvb2xlYW4sIG1lc3NhZ2U/OiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICghdGVzdCkge1xuICAgICAgICBpZiAoX3NldHRpbmdzLmZvcmNlKSB7XG4gICAgICAgICAgICBpZiAoMCA8IG9wdGlvbmFsUGFyYW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICgwIDwgb3B0aW9uYWxQYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmxldCBfbGFuZzogYW55O1xuXG4vKipcbiAqIOODreODvOOCq+ODqeOCpOOCulxuICpcbiAqIEBwYXJhbSBrZXkg44Kt44O85paH5a2X5YiXXG4gKiBAcmV0dXJucyDnv7voqLPjgZXjgozjgZ/mloflrZfliJdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFfbGFuZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgX2xhbmcgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4oZ2V0TGliUGF0aCgpLCBcInJlcy9sb2NhbGVzXCIsIFwibWVzc2FnZXMuXCIgKyBfc2V0dGluZ3MubGFuZyArIFwiLmpzb25cIiksIFwidXRmOFwiKS50b1N0cmluZygpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJMYW5ndWFnZSByZXNvdXJjZSBKU09OIHBhcnNlIGVycm9yOiBcIiArIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHJlc291Y2UgPSAkLmV4dGVuZCh7fSwgX2xhbmcpO1xuICAgIGNvbnN0IHByb3BzID0ga2V5LnNwbGl0KFwiLlwiKTtcbiAgICB3aGlsZSAoMCA8IHByb3BzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBwcm9wID0gcHJvcHMuc2hpZnQoKTtcbiAgICAgICAgaWYgKHJlc291Y2VbcHJvcF0pIHtcbiAgICAgICAgICAgIHJlc291Y2UgPSByZXNvdWNlW3Byb3BdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBcInJlc291Y2Ugbm90IGZvdW5kLiBrZXk6IFwiICsga2V5KTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXNvdWNlO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4uLy4uL3NyYy91dGlscy9zZXR0aW5ncy50cyIsImltcG9ydCB7IEdlbmVyYXRvckJhc2UsIElQcm9qZWN0Q29uZmlncmF0aW9uIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IEdlbmVyYXRvck1vZHVsZSB9IGZyb20gXCIuL2dlbmVyYXRvci1tb2R1bGVcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZ2VuZXJhdG9yLW1vZHVsZVwiO1xuXG4vKipcbiAqIGdlbmVyYXRvciDnlJ/miJDplqLmlbBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5ld0dlbmVyYXRvckxpYnJhcnkoY29uZmlnOiBJUHJvamVjdENvbmZpZ3JhdGlvbik6IEdlbmVyYXRvckJhc2Uge1xuICAgIHJldHVybiBuZXcgR2VuZXJhdG9yTW9kdWxlKGNvbmZpZyk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGlicmFyeS9pbmRleC50cyIsImltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCAqIGFzIG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHtcbiAgICBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbixcbiAgICBJRGVwZW5kZW5jeSxcbiAgICBJVmlzdWFsU3R1ZGlvQ29uZmlncmF0aW9uLFxuICAgIEdlbmVyYXRvckJhc2UsXG4gICAgVXRpbHMsXG59IGZyb20gXCIuLi9iYXNlXCI7XG5pbXBvcnQgeyBJTGlicmFyeUNvbmZpZ3JhdGlvbiB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcblxuY29uc3QgZnMgICAgICAgICAgICA9IFV0aWxzLmZzO1xuY29uc3QgZ2xvYiAgICAgICAgICA9IFV0aWxzLmdsb2I7XG5jb25zdCAkICAgICAgICAgICAgID0gVXRpbHMuJDtcbmNvbnN0IF8gICAgICAgICAgICAgPSBVdGlscy5fO1xuY29uc3QgZGVidWcgICAgICAgICA9IFV0aWxzLmRlYnVnO1xuY29uc3QgdGVtcGxhdGVQYXRoICA9IFV0aWxzLnRlbXBsYXRlUGF0aDtcbmNvbnN0IGNvcHlUcGwgICAgICAgPSBVdGlscy5jb3B5VHBsO1xuXG4vKipcbiAqIEBjbGFzcyBHZW5lcmF0b3JNb2R1bGVcbiAqIEBicmllZiBMaWJyYXJ5IE1vZHVsZSDnlKggR2VuZXJhdG9yIOOCr+ODqeOCuVxuICovXG5leHBvcnQgY2xhc3MgR2VuZXJhdG9yTW9kdWxlIGV4dGVuZHMgR2VuZXJhdG9yQmFzZSB7XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIGltcHJlbWVudGVzOiBHZW5lcmF0b3JCYXNlXG5cbiAgICAvKipcbiAgICAgKiDml6Llrprjga4gZGlyZWN0b3J5IOani+mAoOOCkui/lOWNtFxuICAgICAqL1xuICAgIGRlZmF1bHRCYXNlU3RydWN0dXJlKCk6IElCYXNlU3RydWN0dXJlQ29uZmlncmF0aW9uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNyYzogXCJzcmNcIixcbiAgICAgICAgICAgIHBrZzogXCJkaXN0XCIsXG4gICAgICAgICAgICBidWlsdDogXCJidWlsdFwiLFxuICAgICAgICAgICAgZG9jOiBcImRvY3NcIixcbiAgICAgICAgICAgIHRhc2s6IFwidGFza3NcIixcbiAgICAgICAgICAgIHRlc3Q6IFwidGVzdHNcIixcbiAgICAgICAgICAgIHR5cGVzOiBcIkB0eXBlc1wiLFxuICAgICAgICAgICAgdGVtcDogXCIudGVtcFwiLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGNyZWF0ZSBhY3Rpb24gZW50cnlcbiAgICAgKiBAcGFyYW0ge0lMaWJyYXJ5Q29uZmlncmF0aW9ufSBjb25maWcg44Kz44Oz44OV44Kj44Kw6Kit5a6aXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZU1vZHVsZVByb3BzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlRGlyZWN0b3J5U3RydWN0dXJlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlUHJvamVjdFNldHRpbmdzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlU291cmNlVGVtcGxhdGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVWaXN1YWxTdHVkaW9Tb2x1dGlvbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOW/heimgeOBqOOBmeOCiyB0YXNrIHNjcmlwdCDkuIDopqfjgpLov5TljbQuIGFjdGlvbjogY3JlYXRlIOOBruOBqOOBjeOBq+WRvOOBsOOCjOOCi1xuICAgICAqL1xuICAgIGdldCB0YXNrTGlzdCgpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBcImJhbm5lci5qc1wiLFxuICAgICAgICAgICAgXCJjbGVhbi5qc1wiLFxuICAgICAgICAgICAgXCJzcmNtYXAuanNcIixcbiAgICAgICAgICAgIFwiYnVuZGxlLWZpbmFsaXplci5qc1wiLFxuICAgICAgICAgICAgXCJyZW1hcC1jb3ZlcmFnZS5qc1wiLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gcHJvdGVjdGVkIG1ldGhvZHM6XG5cbiAgICAvKipcbiAgICAgKiDplovnmbrmmYLjga7kvp3lrZjjg6Ljgrjjg6Xjg7zjg6vjg6rjgrnjg4jjga7lj5blvpdcbiAgICAgKiDlv4XopoHjgavlv5zjgZjjgabjgqrjg7zjg5Djg7zjg6njgqTjg4lcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0lEZXBlbmRlbmN5fVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXQgZGVmYXVsdERldkRlcGVuZGVuY2llcygpOiBJRGVwZW5kZW5jeVtdIHtcbiAgICAgICAgY29uc3QgZGVwZW5kcyA9IHN1cGVyLmRlZmF1bHREZXZEZXBlbmRlbmNpZXMuY29uY2F0KFtcbiAgICAgICAgICAgIHsgbmFtZTogXCJAdHlwZXMvamFzbWluZVwiLCAgICAgICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwiZHRzLWJ1bmRsZVwiLCAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBcInR5cGVzY3JpcHQtZm9ybWF0dGVyXCIsIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgY29uc3QgZXh0cmEgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLm5vZGVqcykge1xuICAgICAgICAgICAgZXh0cmEucHVzaCh7IG5hbWU6IFwiamFzbWluZS1ub2RlXCIsIHZlcnNpb246IFwiXjIuMC4wXCIsIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXh0cmEucHVzaCh7IG5hbWU6IFwicmVxdWlyZWpzXCIsIHZlcnNpb246IHVuZGVmaW5lZCwgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXy5zb3J0QnkoZGVwZW5kcy5jb25jYXQoZXh0cmEpLCAoZGVwZW5kKSA9PiBkZXBlbmQubmFtZSk7XG4gICAgfVxuXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBwcml2YXRlIG1ldGhvZHM6XG5cbiAgICAvKipcbiAgICAgKiBjb25maWdyYXRpb24g44Gr44Ki44Kv44K744K5XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXQgY29uZmlnKCk6IElMaWJyYXJ5Q29uZmlncmF0aW9uIHtcbiAgICAgICAgcmV0dXJuIDxJTGlicmFyeUNvbmZpZ3JhdGlvbj50aGlzLl9jb25maWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbW9kdWxlIOWQjSwgbWFpbiDjg5XjgqHjgqTjg6vlkI3jga7kv53oqLxcbiAgICAgKiAtIDE6IG1vZHVsZU5hbWUg44GM5oyH5a6a44GV44KM44Gm44GE44KL5aC05ZCI44Gv5L2/55So44GZ44KLXG4gICAgICogLSAyOiBwcm9qZWN0TmFtZSDjgYzkvb/nlKjlj6/og73jgarloLTlkIjjga/jgZ3jgozjgpLkvb/nlKjjgZnjgotcbiAgICAgKiAtIDM6IHByb2plY3ROYW1lIOOBjOS9v+eUqOS4jeWPr+OBruWgtOWQiOOBr+OAgVwiLVwiIOOBpOOBquOBjuaWh+Wtl+WIl+OCkueUn+aIkOOBmeOCi1xuICAgICAqL1xuICAgIHByaXZhdGUgZW5zdXJlTW9kdWxlUHJvcHMoKTogdm9pZCB7XG4gICAgICAgIC8vIG1vZHVsZSBuYW1lXG4gICAgICAgIGlmIChudWxsID09IHRoaXMuY29uZmlnLm1vZHVsZU5hbWUpIHtcbiAgICAgICAgICAgIGlmICghL14uKlsoXFxcXHxcXHN8L3w6fCp8P3xcInw8fD58fCldLiokLy50ZXN0KHRoaXMuY29uZmlnLnByb2plY3ROYW1lKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLm1vZHVsZU5hbWUgPSB0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcubW9kdWxlTmFtZSA9IF8udHJpbShfLmRhc2hlcml6ZSh0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZSksIFwiLVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZWJ1ZyhcIm1vZHVsZU5hbWU6IFwiICsgdGhpcy5jb25maWcubW9kdWxlTmFtZSk7XG5cbiAgICAgICAgLy8gbWFpbiBmaWxlIG5hbWVcbiAgICAgICAgaWYgKG51bGwgPT0gdGhpcy5jb25maWcubWFpbkJhc2VOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5tYWluQmFzZU5hbWUgPSB0aGlzLmNvbmZpZy5tb2R1bGVOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGRlYnVnKFwibWFpbkJhc2VOYW1lOiBcIiArIHRoaXMuY29uZmlnLm1haW5CYXNlTmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OH44Kj44Os44Kv44OI44Oq5qeL5oiQ5oOF5aCx44Gu44Kz44OU44O8XG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVEaXJlY3RvcnlTdHJ1Y3R1cmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29weVRwbERpcihcImxpYnJhcnkvc3RydWN0dXJlXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODl+ODreOCuOOCp+OCr+ODiOioreWumuODleOCoeOCpOODq+OBruS9nOaIkFxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlUHJvamVjdFNldHRpbmdzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBwcm9qZWN0LmNvbmZpZy5qc1xuICAgICAgICBjb3B5VHBsKFxuICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcImxpYnJhcnlcIiksIFwiX3Byb2plY3QuY29uZmlnLmpzXCIpLFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJwcm9qZWN0LmNvbmZpZy5qc1wiKSxcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiIH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyB0c2NvbmZpZ1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLm91dHB1dFNhbWVEaXIpIHtcbiAgICAgICAgICAgIC8vIG1haW4gdHNjb25maWcuanNvblxuICAgICAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeVwiKSwgXCJfdHNjb25maWcuanNvblwiKSxcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcInRzY29uZmlnLmpzb25cIiksXG4gICAgICAgICAgICAgICAgdGhpcy5fY29uZmlnLFxuICAgICAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiLCBib206IGZhbHNlLCB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gdGVzdCB0c2NvbmZpZy5qc29uXG4gICAgICAgICAgICBjb3B5VHBsKFxuICAgICAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJsaWJyYXJ5XCIpLCBcIl90c2NvbmZpZy50ZXN0Lmpzb25cIiksXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50ZXN0LCBcInVuaXRcIiwgXCJ0c2NvbmZpZy5qc29uXCIpLFxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcbiAgICAgICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG1haW4gdHNjb25maWcuanNvblxuICAgICAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeVwiKSwgXCJfdHNjb25maWcub3V0cHV0LXNhbWUtZGlyLmpzb25cIiksXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJ0c2NvbmZpZy5qc29uXCIpLFxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcbiAgICAgICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVzbGludHJjLmpzb25cbiAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJsaWJyYXJ5XCIpLCBcIl9lc2xpbnRyYy5qc29uXCIpLFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50ZXN0LCBcImVzbGludFwiLCBcImVzbGludHJjLmpzb25cIiksXG4gICAgICAgICAgICB0aGlzLnF1ZXJ5RXNMaW50RW52UGFyYW0oKSxcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiLCBib206IGZhbHNlLCB9XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gdGVzdGVtXG4gICAgICAgIGlmICghdGhpcy5jb25maWcubm9kZWpzKSB7XG4gICAgICAgICAgICBjb3B5VHBsKFxuICAgICAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJsaWJyYXJ5L3Rvb2xzL3Rlc3RlbVwiKSwgXCJfdGVzdGVtLmpzb25cIiksXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50ZXN0LCBcInJ1bm5lclwiLCBcInRlc3RlbS5qc29uXCIpLFxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcbiAgICAgICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgdGVzdGVtU3R1ZmZQYXRoID0gdGVtcGxhdGVQYXRoKFwibGlicmFyeS90b29scy90ZXN0ZW0vcnVubmVyXCIpO1xuXG4gICAgICAgICAgICBnbG9iLnN5bmMoXCIqKlwiLCB7XG4gICAgICAgICAgICAgICAgY3dkOiB0ZXN0ZW1TdHVmZlBhdGgsXG4gICAgICAgICAgICAgICAgbm9kaXI6IHRydWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZzLmNvcHlTeW5jKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKHRlc3RlbVN0dWZmUGF0aCwgZmlsZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnRlc3QsIFwicnVubmVyXCIsIGZpbGUpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAuZ2l0aWdub3JlXG4gICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeVwiKSwgXCJfZ2l0aWdub3JlXCIpLFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCIuZ2l0aWdub3JlXCIpLFxuICAgICAgICAgICAgdGhpcy5fY29uZmlnLFxuICAgICAgICAgICAgeyBib206IGZhbHNlLCB9XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUkVBRE1FLm1kXG4gICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeVwiKSwgXCJfUkVBRE1FLm1kXCIpLFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJSRUFETUUubWRcIiksXG4gICAgICAgICAgICB0aGlzLl9jb25maWcsXG4gICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiB9XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gcGFja2FnZS5qc29uXG4gICAgICAgIHRoaXMuY29uZmlnLmRldkRlcGVuZGVuY2llcyA9IGF3YWl0IHRoaXMucXVlcnlEZXBlbmRlbmNpZXNQYXJhbSh0aGlzLmNvbmZpZy5kZXZEZXBlbmRlbmNpZXMgfHwgdGhpcy5kZWZhdWx0RGV2RGVwZW5kZW5jaWVzKTtcbiAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJsaWJyYXJ5XCIpLCBcIl9wYWNrYWdlLmpzb25cIiksXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcInBhY2thZ2UuanNvblwiKSxcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiLCBib206IGZhbHNlLCB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44K944O844K544Gu6Zub5b2i5L2c5oiQXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVTb3VyY2VUZW1wbGF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgX21vZHVsZSA9IHBhdGguYmFzZW5hbWUodGhpcy5fY29uZmlnLm1vZHVsZU5hbWUsIFwiLmpzXCIpO1xuICAgICAgICBjb25zdCBwYXJhbSA9IHtcbiAgICAgICAgICAgIHNhbXBsZUNsYXNzOiBfLmNsYXNzaWZ5KF9tb2R1bGUpLFxuICAgICAgICAgICAgc2FtcGxlTW9kdWxlOiBfbW9kdWxlLFxuICAgICAgICAgICAgYnVpbHQ6IHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuYnVpbHQsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyY0NvbmZpZykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyY0NvbmZpZy5zY3JpcHQgfHwgXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9KSgpO1xuXG4gICAgICAgIC8vIGluZGV4LnRzXG4gICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeVwiKSwgXCJzcmNcIiwgXCJfaW5kZXgudHNcIiksXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYywgc2NyaXB0LCBfbW9kdWxlICsgXCIudHNcIiksXG4gICAgICAgICAgICBwYXJhbSxcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiIH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBpbmRleC5zcGVjLnRzXG4gICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeVwiKSwgXCJzcmNcIiwgXCJfaW5kZXguc3BlYy50c1wiKSxcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcudGVzdCwgXCJ1bml0XCIsIF9tb2R1bGUgKyBcIi5zcGVjLnRzXCIpLFxuICAgICAgICAgICAgcGFyYW0sXG4gICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmlzdWFsIFN0dWRpbyDjga7jgr3jg6rjg6Xjg7zjgrfjg6fjg7Pjg5XjgqHjgqTjg6vkvZzmiJBcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGNyZWF0ZVZpc3VhbFN0dWRpb1NvbHV0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB2c1BhcmFtID0gKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZUdVSUQgPSBVdGlscy5jcmVhdGVHVUlEO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJhbTogSVZpc3VhbFN0dWRpb0NvbmZpZ3JhdGlvbiA9IDxhbnk+JC5leHRlbmQoe30sIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcpO1xuXG4gICAgICAgICAgICBwYXJhbS5wcm9qZWN0TmFtZSAgICAgICA9IHRoaXMuX2NvbmZpZy5wcm9qZWN0TmFtZTtcbiAgICAgICAgICAgIHBhcmFtLnByb2plY3RHVUlEICAgICAgID0gY3JlYXRlR1VJRCgpO1xuICAgICAgICAgICAgcGFyYW0udHlwZXMgICAgICAgICAgICAgPSBwYXJhbS50eXBlcy5yZXBsYWNlKFwiQFwiLCBcIiU0MFwiKTsgLy8gZXNjYXBlIFwiQFwiIHRvIFwiJTQwXCJcbiAgICAgICAgICAgIHBhcmFtLm1haW5CYXNlTmFtZSAgICAgID0gdGhpcy5fY29uZmlnLm1haW5CYXNlTmFtZTtcbiAgICAgICAgICAgIHBhcmFtLmxpY2Vuc2UgICAgICAgICAgID0gIXRoaXMuX2NvbmZpZy5wcml2YXRlO1xuXG4gICAgICAgICAgICAvLyB0b29sc1xuICAgICAgICAgICAgcGFyYW0ud2VicGFjayA9IHRoaXMuaXNFbmFibGVUb29sKFwid2VicGFja1wiKTtcbiAgICAgICAgICAgIHBhcmFtLnRlc3RlbSA9ICF0aGlzLmNvbmZpZy5ub2RlanM7XG5cbiAgICAgICAgICAgIHBhcmFtLm91dHB1dFNhbWVEaXIgPSB0aGlzLmNvbmZpZy5vdXRwdXRTYW1lRGlyO1xuXG4gICAgICAgICAgICAvLyBzZXR1cCBidWlsdCBqcyBncm91cFxuICAgICAgICAgICAgcGFyYW0uanNHcm91cCA9IFtdO1xuICAgICAgICAgICAgaWYgKCFwYXJhbS5vdXRwdXRTYW1lRGlyKSB7XG4gICAgICAgICAgICAgICAgcGFyYW0uanNHcm91cC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVQYXRoOiBwYXJhbS5idWlsdCArIFwiXFxcXFwiLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogcGFyYW0ubWFpbkJhc2VOYW1lLFxuICAgICAgICAgICAgICAgICAgICBkZXBlbmRlZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZF90czogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWFwOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBtaW5fbWFwOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5taW5pZnkpIHtcbiAgICAgICAgICAgICAgICAvLyBzZXR1cCBwa2cgZ3JvdXBcbiAgICAgICAgICAgICAgICBwYXJhbS5qc0dyb3VwLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVBhdGg6IHBhcmFtLnBrZyArIFwiXFxcXFwiLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogcGFyYW0ubWFpbkJhc2VOYW1lLFxuICAgICAgICAgICAgICAgICAgICBkZXBlbmRlZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGRfdHM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtYXA6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtaW5fbWFwOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzZXR1cCB0ZXN0IGpzIGdyb3VwXG4gICAgICAgICAgICBwYXJhbS50c0dyb3VwID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVQYXRoOiBwYXJhbS50ZXN0ICsgXCJcXFxcdW5pdFxcXFxcIixcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IHBhcmFtLm1haW5CYXNlTmFtZSArIFwiLnNwZWNcIixcbiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1hcDogdGhpcy5jb25maWcub3V0cHV0U2FtZURpcixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGlmIChwYXJhbS5vdXRwdXRTYW1lRGlyKSB7XG4gICAgICAgICAgICAgICAgcGFyYW0udHNHcm91cC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVQYXRoOiBwYXJhbS5idWlsdCArIFwiXFxcXFwiLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogcGFyYW0ubWFpbkJhc2VOYW1lLFxuICAgICAgICAgICAgICAgICAgICBkZXBlbmRlZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1hcDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHBhcmFtO1xuICAgICAgICB9KSgpO1xuXG4gICAgICAgIC8vIC5zbG5cbiAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJiYXNlL3Zpc3VhbC5zdHVkaW9cIiksIFwiX3NvbHV0aW9uLnNsbi50cGxcIiksXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB2c1BhcmFtLnByb2plY3ROYW1lICsgXCIuc2xuXCIpLFxuICAgICAgICAgICAgdnNQYXJhbSxcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiIH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyAuY3Nwcm9qXG4gICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0b1htbFN0cmluZyA9IChmaWxlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBob2dhbiA9IFV0aWxzLmhvZ2FuO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZVRleHQgPSBVdGlscy5ub3JtYWxpemVUZXh0O1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGVvbDogb3MuRU9MLFxuICAgICAgICAgICAgICAgICAgICBib206IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGRlbGltaXRlcnM6IFwie3sgfX1cIixcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdHBsID0gcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcImJhc2UvdmlzdWFsLnN0dWRpb1wiKSwgZmlsZSk7XG4gICAgICAgICAgICAgICAgY29uc3QganN0ID0gaG9nYW4uY29tcGlsZShub3JtYWxpemVUZXh0KGZzLnJlYWRGaWxlU3luYyh0cGwpLnRvU3RyaW5nKCksIHsgZW9sOiBcIlxcblwiLCBib206IGZhbHNlIH0pLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ganN0LnJlbmRlcih2c1BhcmFtKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHRvWG1sRE9NID0gKGZpbGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAkKCQucGFyc2VYTUwodG9YbWxTdHJpbmcoZmlsZSkpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHRvWG1sTm9kZSA9IChmaWxlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gVXRpbHMuc3RyMlhtbE5vZGUodG9YbWxTdHJpbmcoZmlsZSkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgJHByb2ogPSB0b1htbERPTShcIl9wcm9qZWN0LmNzcHJvai50cGxcIik7XG4gICAgICAgICAgICBjb25zdCAkZ3BUUyA9IHRvWG1sTm9kZShcIl90cy5pdGVtLmdyb3VwLnRwbFwiKTtcbiAgICAgICAgICAgIGNvbnN0ICRncEpTID0gdG9YbWxOb2RlKFwiX2pzLml0ZW0uZ3JvdXAudHBsXCIpO1xuXG4gICAgICAgICAgICAkcHJvalxuICAgICAgICAgICAgICAgIC5maW5kKFwiSXRlbUdyb3VwXCIpXG4gICAgICAgICAgICAgICAgLmxhc3QoKVxuICAgICAgICAgICAgICAgIC5hZnRlcigkZ3BUUylcbiAgICAgICAgICAgICAgICAuYWZ0ZXIoJGdwSlMpXG4gICAgICAgICAgICAgICAgO1xuXG4gICAgICAgICAgICBjb25zdCBmb3JtYXRYTUwgPSBVdGlscy5mb3JtYXRYTUw7XG4gICAgICAgICAgICBjb25zdCBkc3RQYXRoID0gcGF0aC5qb2luKHRoaXMucm9vdERpciwgdnNQYXJhbS5wcm9qZWN0TmFtZSArIFwiLmNzcHJvalwiKTtcbiAgICAgICAgICAgIGRlYnVnKFV0aWxzLnhtbE5vZGUyU3RyKCRwcm9qKSk7XG4gICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRzdFBhdGgsIGZvcm1hdFhNTChVdGlscy54bWxOb2RlMlN0cigkcHJvaikpKTtcbiAgICAgICAgfSkoKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGlicmFyeS9nZW5lcmF0b3ItbW9kdWxlLnRzIiwiaW1wb3J0IHsgR2VuZXJhdG9yQmFzZSwgSVByb2plY3RDb25maWdyYXRpb24gfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IHsgR2VuZXJhdG9yQ29yZG92YSB9IGZyb20gXCIuL2dlbmVyYXRvci1jb3Jkb3ZhXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2dlbmVyYXRvci1jb3Jkb3ZhXCI7XG5cbi8qKlxuICogZ2VuZXJhdG9yIOeUn+aIkOmWouaVsFxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV3R2VuZXJhdG9yTW9iaWxlKGNvbmZpZzogSVByb2plY3RDb25maWdyYXRpb24pOiBHZW5lcmF0b3JCYXNlIHtcbiAgICByZXR1cm4gbmV3IEdlbmVyYXRvckNvcmRvdmEoY29uZmlnKTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi8uLi9zcmMvZ2VuZXJhdG9ycy9tb2JpbGUvaW5kZXgudHMiLCJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCB7XG4gICAgZnMsXG4gICAgZ2xvYixcbiAgICAkLFxuICAgIF8sXG4gICAgaG9nYW4sXG4gICAgZGVidWcsXG4gICAgdGVtcGxhdGVQYXRoLFxuICAgIGNvcHlUcGwsXG4gICAgZXhlY0NvbW1hbmQsXG4gICAgc3RyMlhtbE5vZGUsXG4gICAgeG1sTm9kZTJTdHIsXG4gICAgbm9ybWFsaXplVGV4dCxcbiAgICBmb3JtYXRYTUwsXG4gICAgY3JlYXRlR1VJRCxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5pbXBvcnQge1xuICAgIElCYXNlU3RydWN0dXJlQ29uZmlncmF0aW9uLFxuICAgIElEZXBlbmRlbmN5LFxuICAgIElWaXN1YWxTdHVkaW9Db25maWdyYXRpb24sXG4gICAgR2VuZXJhdG9yQmFzZSxcbn0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IElNb2JpbGVBcHBDb25maWdyYXRpb24gfSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5cbi8qKlxuICogQGNsYXNzIEdlbmVyYXRvckNvcmRvdmFcbiAqIEBicmllZiBNb2JpbGUgQ29yZG92YSDnlKggR2VuZXJhdG9yIOOCr+ODqeOCuVxuICovXG5leHBvcnQgY2xhc3MgR2VuZXJhdG9yQ29yZG92YSBleHRlbmRzIEdlbmVyYXRvckJhc2Uge1xuXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBpbXByZW1lbnRlczogR2VuZXJhdG9yQmFzZVxuXG4gICAgLyoqXG4gICAgICog5pei5a6a44GuIGRpcmVjdG9yeSDmp4vpgKDjgpLov5TljbRcbiAgICAgKi9cbiAgICBkZWZhdWx0QmFzZVN0cnVjdHVyZSgpOiBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzcmM6IFwiYXBwXCIsXG4gICAgICAgICAgICBwa2c6IFwid3d3XCIsXG4gICAgICAgICAgICBidWlsdDogXCJhcHBcIixcbiAgICAgICAgICAgIGRvYzogXCJkb2NzXCIsXG4gICAgICAgICAgICB0YXNrOiBcInRhc2tzXCIsXG4gICAgICAgICAgICB0ZXN0OiBcInRlc3RzXCIsXG4gICAgICAgICAgICB0eXBlczogXCJAdHlwZXNcIixcbiAgICAgICAgICAgIHRlbXA6IFwiLnRlbXBcIixcbiAgICAgICAgICAgIGxpYjogXCJsaWJcIixcbiAgICAgICAgICAgIGV4dGVybmFsOiBcImV4dGVybmFsXCIsXG4gICAgICAgICAgICBwb3J0aW5nOiBcInBvcnRpbmdcIixcbiAgICAgICAgICAgIHJlczogXCJyZXNcIixcbiAgICAgICAgICAgIHNyY0NvbmZpZzoge1xuICAgICAgICAgICAgICAgIHNjcmlwdDogXCJzY3JpcHRzXCIsXG4gICAgICAgICAgICAgICAgc3R5bGVzaGVldDogXCJzdHlsZXNoZWV0c1wiLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBcInRlbXBsYXRlc1wiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjcmVhdGUgYWN0aW9uIGVudHJ5XG4gICAgICogQHBhcmFtIHtJTGlicmFyeUNvbmZpZ3JhdGlvbn0gY29uZmlnIOOCs+ODs+ODleOCo+OCsOioreWumlxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZGVidWcoSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcsIG51bGwsIDQpKTtcblxuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZUNvcmRvdmEoKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGRpcih0aGlzLnJvb3REaXIpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVDb3Jkb3ZhU2NhZmZvbGQoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ29uZmlnWE1MKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkZENvcmRvdmFQbGF0Zm9ybXMoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkQ29yZG92YVBsdWdpbnMoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkQ29yZG92YUV4dGVudGlvbkZpbGVzKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNhY2hlQ29yZG92YVBhY2thZ2VKU09OKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNoZGlyKFwiLi5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZURpcmVjdG9yeVN0cnVjdHVyZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZVByb2plY3RTZXR0aW5ncygpO1xuICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZVNvdXJjZVRlbXBsYXRlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlVmlzdWFsU3R1ZGlvU29sdXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlv4XopoHjgajjgZnjgosgdGFzayBzY3JpcHQg5LiA6Kan44KS6L+U5Y20LiBhY3Rpb246IGNyZWF0ZSDjga7jgajjgY3jgavlkbzjgbDjgozjgotcbiAgICAgKi9cbiAgICBnZXQgdGFza0xpc3QoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgXCJiYW5uZXIuanNcIixcbiAgICAgICAgICAgIFwiY2xlYW4uanNcIixcbiAgICAgICAgICAgIFwiY29tbWFuZC5qc1wiLFxuICAgICAgICAgICAgXCJleHRlcm5hbC1yZWFycmFuZ2UuanNcIixcbiAgICAgICAgICAgIFwibWluaWZ5LmpzXCIsXG4gICAgICAgICAgICBcInNyY21hcC5qc1wiLFxuICAgICAgICAgICAgXCJidW5kbGUtZmluYWxpemVyLmpzXCIsXG4gICAgICAgICAgICBcInJlbWFwLWNvdmVyYWdlLmpzXCIsXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBwcm90ZWN0ZWQgbWV0aG9kczpcblxuICAgIC8qKlxuICAgICAqIOmWi+eZuuaZguOBruS+neWtmOODouOCuOODpeODvOODq+ODquOCueODiOOBruWPluW+l1xuICAgICAqIOW/heimgeOBq+W/nOOBmOOBpuOCquODvOODkOODvOODqeOCpOODiVxuICAgICAqXG4gICAgICogQHJldHVybiB7SURlcGVuZGVuY3l9XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldCBkZWZhdWx0RGV2RGVwZW5kZW5jaWVzKCk6IElEZXBlbmRlbmN5W10ge1xuICAgICAgICBjb25zdCBkZXBlbmRzID0gc3VwZXIuZGVmYXVsdERldkRlcGVuZGVuY2llcy5jb25jYXQoW1xuICAgICAgICAgICAgeyBuYW1lOiBcIkB0eXBlcy9qYXNtaW5lXCIsICAgICAgIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcbiAgICAgICAgICAgIHsgbmFtZTogXCJAdHlwZXMvcmVxdWlyZWpzXCIsICAgICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwiYXV0b3ByZWZpeGVyXCIsICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBcImNsZWFuLWNzc1wiLCAgICAgICAgICAgIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcbiAgICAgICAgICAgIHsgbmFtZTogXCJmcy1leHRyYVwiLCAgICAgICAgICAgICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwiaHRtbC1taW5pZmllclwiLCAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBcIm5vZGUtc2Fzc1wiLCAgICAgICAgICAgIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcbiAgICAgICAgICAgIHsgbmFtZTogXCJwb3N0Y3NzLWNsaVwiLCAgICAgICAgICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwic21hcnR3YXRjaFwiLCAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBjb25zdCBleHRyYSA9IFtdO1xuICAgICAgICB0aGlzLmNvbmZpZy5kZXZEZXBlbmRlbmNpZXMuZm9yRWFjaCgoZGVwZW5kKSA9PiB7XG4gICAgICAgICAgICBleHRyYS5wdXNoKHsgbmFtZTogZGVwZW5kLm5hbWUsIHZlcnNpb246IGRlcGVuZC52ZXJzaW9uLCB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVDb3Jkb3ZhKCkpIHtcbiAgICAgICAgICAgIGV4dHJhLnB1c2goeyBuYW1lOiBcIkB0eXBlcy9jb3Jkb3ZhXCIsIHZlcnNpb246IHVuZGVmaW5lZCwgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXy5zb3J0QnkoZGVwZW5kcy5jb25jYXQoZXh0cmEpLCAoZGVwZW5kKSA9PiBkZXBlbmQubmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZXNsaW50cmMg44Gr5oyH5a6a44GZ44KLIHRlbXBsYXRlIHBhcmFtYWV0ZXIg44KS5Y+W5b6XXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IOODhuODs+ODl+ODrOODvOODiOODkeODqeODoeODvOOCv+OCquODluOCuOOCp+OCr+ODiFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBxdWVyeUVzTGludEVudlBhcmFtKCk6IGFueSB7XG4gICAgICAgIGNvbnN0IGJhc2UgPSBzdXBlci5xdWVyeUVzTGludEVudlBhcmFtKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgICAgLi4ue1xuICAgICAgICAgICAgICAgIGNvcmRvdmE6IHRoaXMuaXNFbmFibGVDb3Jkb3ZhKCksXG4gICAgICAgICAgICAgICAgaGFtbWVyanM6IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJoYW1tZXJqc1wiKSxcbiAgICAgICAgICAgICAgICBpc2Nyb2xsOiB0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaXNjcm9sbFwiKSxcbiAgICAgICAgICAgICAgICBmbGlwc25hcDogdGhpcy5pc0luc3RhbGxhdGlvblRhcmdldChcImZsaXBzbmFwXCIpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0c2NvbmZpZy5iYXNlIOOBq+aMh+WumuOBmeOCiyB0ZW1wbGF0ZSBwYXJhbWFldGVyIOOCkuWPluW+l1xuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fSDjg4bjg7Pjg5fjg6zjg7zjg4jjg5Hjg6njg6Hjg7zjgr/jgqrjg5bjgrjjgqfjgq/jg4hcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcXVlcnlUc0NvbmZpZ0Jhc2VQYXJhbSgpOiBhbnkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4udGhpcy5fY29uZmlnLFxuICAgICAgICAgICAgLi4ue1xuICAgICAgICAgICAgICAgIGNvcmRvdmE6IHRoaXMuaXNFbmFibGVDb3Jkb3ZhKCksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gcHJpdmF0ZSBtZXRob2RzOlxuXG4gICAgLyoqXG4gICAgICog6ZaL55m65pmC44Gu5L6d5a2Y44Oi44K444Ol44O844Or44Oq44K544OI44Gu5Y+W5b6XXG4gICAgICog5b+F6KaB44Gr5b+c44GY44Gm44Kq44O844OQ44O844Op44Kk44OJXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtJRGVwZW5kZW5jeX1cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldCBkZWZhdWx0RGVwZW5kZW5jaWVzKCk6IElEZXBlbmRlbmN5W10ge1xuICAgICAgICBjb25zdCBkZXBlbmRzID0gW1xuICAgICAgICAgICAgeyBuYW1lOiBcIkBjZHAvbW9iaWxlXCIsICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwiYmFja2JvbmVcIiwgICAgIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcbiAgICAgICAgICAgIHsgbmFtZTogXCJqcXVlcnlcIiwgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBcInJlcXVpcmVqc1wiLCAgICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwidW5kZXJzY29yZVwiLCAgIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCBleHRyYSA9IFtdO1xuICAgICAgICB0aGlzLmNvbmZpZy5kZXBlbmRlbmNpZXMuZm9yRWFjaCgoZGVwZW5kKSA9PiB7XG4gICAgICAgICAgICBleHRyYS5wdXNoKHsgbmFtZTogZGVwZW5kLm5hbWUsIHZlcnNpb246IGRlcGVuZC52ZXJzaW9uLCB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIF8uc29ydEJ5KGRlcGVuZHMuY29uY2F0KGV4dHJhKSwgKGRlcGVuZCkgPT4gZGVwZW5kLm5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGNvbmZpZ3JhdGlvbiDjgavjgqLjgq/jgrvjgrlcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldCBjb25maWcoKTogSU1vYmlsZUFwcENvbmZpZ3JhdGlvbiB7XG4gICAgICAgIHJldHVybiA8SU1vYmlsZUFwcENvbmZpZ3JhdGlvbj50aGlzLl9jb25maWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY29yZG92YSDjga7mnInlirkv54Sh5Yq544OB44Kn44OD44KvXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB0cnVlOiDmnInlirkgLyBmYWxzZTog54Sh5Yq5XG4gICAgICovXG4gICAgcHJpdmF0ZSBpc0VuYWJsZUNvcmRvdmEoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoMCA8IHRoaXMuY29uZmlnLnBsYXRmb3Jtcy5sZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGxpYi9wb3J0aW5nIOOBruioreWumueKtuazgeOBruODgeOCp+ODg+OCr1xuICAgICAqXG4gICAgICogQHBhcmFtIHRhcmdldFxuICAgICAqIEByZXR1cm5zIHRydWU6IOioreWumiAvIGZhbHNlOiDmnKroqK3lrppcbiAgICAgKi9cbiAgICBwcml2YXRlIGhhc1N0cnVjdHVyZU9mKHRhcmdldDogXCJsaWJcIiB8IFwicG9ydGluZ1wiKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy5jb25maWcucHJvamVjdFN0cnVjdHVyZSAmJiAwIDw9IHRoaXMuY29uZmlnLnByb2plY3RTdHJ1Y3R1cmUuaW5kZXhPZih0YXJnZXQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgqTjg7Pjgrnjg4jjg7zjg6vlr77osaEv6Z2e5a++6LGh44OB44Kn44OD44KvXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSAgICBbaW5dIOODouOCuOODpeODvOODq+WQjVxuICAgICAqIEBwYXJhbSBkZXBlbmRzIFtpbl0g5qSc57Si5a++6LGhICjml6LlrpogdGhpcy5jb25maWcuZGVwZW5kZW5jaWVzKVxuICAgICAqIEByZXR1cm5zIHRydWU6IOWvvuixoSAvIGZhbHNlOiDpnZ7lr77osaFcbiAgICAgKi9cbiAgICBwcml2YXRlIGlzSW5zdGFsbGF0aW9uVGFyZ2V0KG5hbWU6IHN0cmluZywgZGVwZW5kczogSURlcGVuZGVuY3lbXSA9IHRoaXMuY29uZmlnLmRlcGVuZGVuY2llcyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISFkZXBlbmRzLmZpbmQoKGRlcGVuZCkgPT4gbmFtZSA9PT0gZGVwZW5kLm5hbWUpO1xuICAgIH1cblxuICAgIC8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vXG5cbiAgICAvKipcbiAgICAgKiBjb3Jkb3ZhIOOCkueUqOOBhOOBn+ODl+ODreOCuOOCp+OCr+ODiOS9nOaIkFxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlQ29yZG92YVNjYWZmb2xkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnByb2dyZXNzKFwibW9iaWxlLmNyZWF0ZS5jb3Jkb3ZhLmNyZWF0ZUNvcmRvdmFTY2FmZm9sZFwiKTtcbiAgICAgICAgZGVidWcoXCJjcmVhdGVDb3Jkb3ZhU2NhZmZvbGRcIik7XG5cbiAgICAgICAgLy8gYCQgY29yZG92YSBjcmVhdGUgY29vbC1tb2JpbGUgY29tLnNvbnkuY2RwLmNvb2xtb2JpbGUgXCJDb29sIE1vYmlsZVwiYFxuICAgICAgICBhd2FpdCBleGVjQ29tbWFuZChcImNvcmRvdmFcIiwgW1wiY3JlYXRlXCIsIHRoaXMuY29uZmlnLnByb2plY3ROYW1lLCB0aGlzLmNvbmZpZy5hcHBJZCwgdGhpcy5jb25maWcuYXBwTmFtZV0pO1xuXG4gICAgICAgIC8vIHJlbW92ZSBmaWxlc1xuICAgICAgICBnbG9iLnN5bmMoXCJ3d3cvKiovKlwiLCB7XG4gICAgICAgICAgICBjd2Q6IHRoaXMuY29uZmlnLnByb2plY3ROYW1lLFxuICAgICAgICB9KS5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgICBmcy5yZW1vdmVTeW5jKHBhdGguam9pbih0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZSwgZmlsZSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgZnMucmVtb3ZlU3luYyhwYXRoLmpvaW4odGhpcy5jb25maWcucHJvamVjdE5hbWUsIFwicmVzXCIpKTtcbiAgICAgICAgZnMucmVtb3ZlU3luYyhwYXRoLmpvaW4odGhpcy5jb25maWcucHJvamVjdE5hbWUsIFwiLm5wbWlnbm9yZVwiKSk7XG5cbiAgICAgICAgLy8gbW92ZSByb290IGRpcmVjdG9yeVxuICAgICAgICBmcy5jb3B5U3luYyh0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZSwgXCIuL1wiKTtcbiAgICAgICAgZnMucmVtb3ZlU3luYyh0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY29uZmlnLnhtbCDjga7kv67mraNcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHVwZGF0ZUNvbmZpZ1hNTCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5wcm9ncmVzcyhcIm1vYmlsZS5jcmVhdGUuY29yZG92YS51cGRhdGVDb25maWdYbWxcIik7XG4gICAgICAgIGRlYnVnKFwidXBkYXRlQ29uZmlnWE1MXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbmZpZ1htbFBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJjb25maWcueG1sXCIpO1xuICAgICAgICBjb25zdCAkY29uZmlnWG1sRG9tID0gJChzdHIyWG1sTm9kZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnWG1sUGF0aCkudG9TdHJpbmcoKSkpO1xuXG4gICAgICAgICRjb25maWdYbWxEb21cbiAgICAgICAgICAgIC5maW5kKFwid2lkZ2V0XCIpXG4gICAgICAgICAgICAuYXR0cihcInZlcnNpb25cIiwgdGhpcy5jb25maWcudmVyc2lvbilcbiAgICAgICAgICAgIC5hdHRyKFwiaW9zLUNGQnVuZGxlSWRlbnRpZmllclwiLCB0aGlzLmNvbmZpZy5hcHBJZClcbiAgICAgICAgICAgIC5wcmVwZW5kKHN0cjJYbWxOb2RlKGBcbiAgICAgICAgICAgICAgICA8cHJlZmVyZW5jZSBuYW1lPVwiRGlzYWxsb3dPdmVyc2Nyb2xsXCIgdmFsdWU9XCJ0cnVlXCIvPlxuICAgICAgICAgICAgICAgIDxwcmVmZXJlbmNlIG5hbWU9XCJLZXlib2FyZERpc3BsYXlSZXF1aXJlc1VzZXJBY3Rpb25cIiB2YWx1ZT1cImZhbHNlXCIvPlxuICAgICAgICAgICAgICAgIDxwcmVmZXJlbmNlIG5hbWU9XCJCYWNrZ3JvdW5kQ29sb3JcIiB2YWx1ZT1cIjB4ZmYwMDAwMDBcIiAvPlxuICAgICAgICAgICAgYCkpXG4gICAgICAgICAgICA7XG5cbiAgICAgICAgLy8gcmVtb3ZlIGNvcmRvdmEgdGVhbSBpbmZvcm1hdGlvblxuICAgICAgICAkY29uZmlnWG1sRG9tXG4gICAgICAgICAgICAuZmluZChcImRlc2NyaXB0aW9uXCIpXG4gICAgICAgICAgICAucmVtb3ZlKCk7XG4gICAgICAgICRjb25maWdYbWxEb21cbiAgICAgICAgICAgIC5maW5kKFwiYXV0aG9yXCIpXG4gICAgICAgICAgICAucmVtb3ZlKCk7XG5cbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdYbWxQYXRoLCBmb3JtYXRYTUwoeG1sTm9kZTJTdHIoJGNvbmZpZ1htbERvbSkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBwbGF0Zm9ybSDov73liqBcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGFkZENvcmRvdmFQbGF0Zm9ybXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGRlYnVnKFwiYWRkQ29yZG92YVBsYXRmb3Jtc1wiKTtcblxuICAgICAgICBjb25zdCB0YXJnZXRzID0gdGhpcy5jb25maWcucGxhdGZvcm1zLnNsaWNlKCk7XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSB0YXJnZXRzLmluZGV4T2YoXCJpb3NcIik7XG4gICAgICAgIGlmICgwIDw9IGluZGV4ICYmIFwiZGFyd2luXCIgIT09IHByb2Nlc3MucGxhdGZvcm0pIHtcbiAgICAgICAgICAgIHRoaXMud2FybihcIm1vYmlsZS5jcmVhdGUuY29yZG92YS5pT1NXYXJuaW5nXCIpO1xuICAgICAgICAgICAgdGFyZ2V0cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgaWYgKHRhcmdldHMubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByb2dyZXNzKFwibW9iaWxlLmNyZWF0ZS5jb3Jkb3ZhLmFkZFBsYXRmb3Jtc1wiKTtcblxuICAgICAgICAvLyBgJCBjb3Jkb3ZhIHBsYXRmb3JtIGFkZCBhbmRyb2lkIGlvc2BcbiAgICAgICAgYXdhaXQgZXhlY0NvbW1hbmQoXCJjb3Jkb3ZhXCIsIFtcInBsYXRmb3JtXCIsIFwiYWRkXCJdLmNvbmNhdCh0YXJnZXRzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcGx1Z2luIOi/veWKoFxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgYWRkQ29yZG92YVBsdWdpbnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MoXCJtb2JpbGUuY3JlYXRlLmNvcmRvdmEuYWRkUGx1Z2luc1wiKTtcbiAgICAgICAgZGVidWcoXCJhZGRDb3Jkb3ZhUGx1Z2luc1wiKTtcblxuICAgICAgICAvKlxuICAgICAgICAgKiBJL0Yg44Gv6KSH5pWw44Gu44OX44Op44Kw44Kk44Oz44KS5LiA5ous44Gn6L+95Yqg44GZ44KL44GT44Go44GM5Y+v6IO944Gg44GM44CBXG4gICAgICAgICAqIGNvcmRvdmEgdmVyc2lvbiDjgpLliKTlrprjgZfjgabjgYTjgovjg5fjg6njgrDjgqTjg7Pjga/oqqTliKTlrprjgZnjgovjgZPjgajjgYzjgYLjgovjgZ/jgoHjgIFcbiAgICAgICAgICogMeOBpOOBmuOBpOi/veWKoOOBmeOCi1xuICAgICAgICAgKlxuICAgICAgICAgKiDku6XkuIvjga7kuI3lhbflkIjjgavpoZ7kvLzjgZnjgovnj77osaFcbiAgICAgICAgICogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQi0xMjY2M1xuICAgICAgICAgKi9cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG4gPSB0aGlzLmNvbmZpZy5jb3Jkb3ZhX3BsdWdpbi5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIC8vIGAkIGNvcmRvdmEgcGx1Z2luIGFkZCBjb3Jkb3ZhLXBsdWdpbi1pbmFwcGJyb3dzZXJgXG4gICAgICAgICAgICBhd2FpdCBleGVjQ29tbWFuZChcImNvcmRvdmFcIiwgW1wicGx1Z2luXCIsIFwiYWRkXCIsIHRoaXMuY29uZmlnLmNvcmRvdmFfcGx1Z2luW2ldLm5hbWVdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGNvcmRvdmEgcHJvamVjdCDjgavov73liqDjgZnjgovjg6rjgr3jg7zjgrnjgpLjgrPjg5Tjg7xcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGFkZENvcmRvdmFFeHRlbnRpb25GaWxlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5wcm9ncmVzcyhcIm1vYmlsZS5jcmVhdGUuY29yZG92YS5hZGRFeHRlbnNpb25zXCIpO1xuICAgICAgICBkZWJ1ZyhcImFkZENvcmRvdmFFeHRlbnRpb25GaWxlc1wiKTtcbiAgICAgICAgdGhpcy5jb3B5VHBsRGlyKFwibW9iaWxlL2NvcmRvdmFcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY29yZG92YSDjgYznlJ/miJDjgZfjgZ8gcGFja2FnZS5qc29uIOOCkuOCreODo+ODg+OCt+ODpVxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgY2FjaGVDb3Jkb3ZhUGFja2FnZUpTT04oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKFwiLi9wYWNrYWdlLmpzb25cIikpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmNvcmRvdmFQYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKFwiLi9wYWNrYWdlLmpzb25cIikudG9TdHJpbmcoKSk7XG5cbiAgICAgICAgICAgIC8vIHJlbW92ZSBjb3Jkb3ZhIHRlYW0gaW5mb3JtYXRpb25cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbmZpZy5jb3Jkb3ZhUGFja2FnZUpzb24ubmFtZTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbmZpZy5jb3Jkb3ZhUGFja2FnZUpzb24udmVyc2lvbjtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbmZpZy5jb3Jkb3ZhUGFja2FnZUpzb24uZGlzcGxheU5hbWU7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jb25maWcuY29yZG92YVBhY2thZ2VKc29uLm1haW47XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jb25maWcuY29yZG92YVBhY2thZ2VKc29uLnNjcmlwdHM7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jb25maWcuY29yZG92YVBhY2thZ2VKc29uLmF1dGhvcjtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbmZpZy5jb3Jkb3ZhUGFja2FnZUpzb24uZGVzY3JpcHRpb247XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jb25maWcuY29yZG92YVBhY2thZ2VKc29uLmxpY2Vuc2U7XG5cbiAgICAgICAgICAgIC8vIOODleOCoeOCpOODq+OBr+OBhOOBo+OBn+OCk+WJiumZpFxuICAgICAgICAgICAgZnMucmVtb3ZlU3luYyhcIi4vcGFja2FnZS5qc29uXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLy9cblxuICAgIC8qKlxuICAgICAqIOODh+OCo+ODrOOCr+ODiOODquani+aIkOaDheWgseOBruOCs+ODlOODvFxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlRGlyZWN0b3J5U3RydWN0dXJlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb2dyZXNzKFwibW9iaWxlLmNyZWF0ZS5hcHAuY3JlYXRlRGlyZWN0b3J5U3RydWN0dXJlXCIpO1xuICAgICAgICBkZWJ1ZyhcImNyZWF0ZURpcmVjdG9yeVN0cnVjdHVyZVwiKTtcblxuICAgICAgICAvLyBhcHAgYmFzZSBzdHJ1Y3R1cmVcbiAgICAgICAgdGhpcy5jb3B5VHBsRGlyKFwibW9iaWxlL3N0cnVjdHVyZS9iYXNlXCIpO1xuXG4gICAgICAgIC8vIGxpYlxuICAgICAgICBpZiAodGhpcy5oYXNTdHJ1Y3R1cmVPZihcImxpYlwiKSkge1xuICAgICAgICAgICAgdGhpcy5jb3B5VHBsRGlyKFxuICAgICAgICAgICAgICAgIFwibW9iaWxlL3N0cnVjdHVyZS9saWJcIixcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcubGliKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBvcnRpbmdcbiAgICAgICAgaWYgKHRoaXMuaGFzU3RydWN0dXJlT2YoXCJwb3J0aW5nXCIpKSB7XG4gICAgICAgICAgICB0aGlzLmNvcHlUcGxEaXIoXG4gICAgICAgICAgICAgICAgXCJtb2JpbGUvc3RydWN0dXJlL3BvcnRpbmdcIixcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcucG9ydGluZylcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIGNyZWF0ZTogZGV2L3BvcnRpbmcvQHR5cGVzXG4gICAgICAgICAgICBmcy5jb3B5U3luYyhcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhdGgoXCJiYXNlLy5naXRrZWVwXCIpLFxuICAgICAgICAgICAgICAgIHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290RGlyLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcucG9ydGluZyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnR5cGVzLFxuICAgICAgICAgICAgICAgICAgICBcIi5naXRrZWVwXCJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBQTEFURk9STVNfUk9PVCA9IHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwicGxhdGZvcm1zXCIpO1xuICAgICAgICAgICAgZnMucmVhZGRpclN5bmMoUExBVEZPUk1TX1JPT1QpXG4gICAgICAgICAgICAgICAgLmZvckVhY2goKHBsYXRmb3JtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcy5zdGF0U3luYyhwYXRoLmpvaW4oUExBVEZPUk1TX1JPT1QsIHBsYXRmb3JtKSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3B5VHBsRGlyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibW9iaWxlL3N0cnVjdHVyZS9wb3J0aW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKFBMQVRGT1JNU19ST09ULCBwbGF0Zm9ybSwgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnBvcnRpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3d3dcbiAgICAgICAgY29uc3QgV1dXID0gcGF0aC5qb2luKHRoaXMucm9vdERpciwgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnBrZyk7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhXV1cpKSB7XG4gICAgICAgICAgICBmcy5ta2RpcihXV1cpO1xuICAgICAgICB9XG4gICAgICAgIGZzLmNvcHlTeW5jKHRlbXBsYXRlUGF0aChcImJhc2UvLmdpdGtlZXBcIiksIHBhdGguam9pbihXV1csIFwiLmdpdGtlZXBcIikpO1xuXG4gICAgICAgIC8vIHRhc2tcbiAgICAgICAgZ2xvYi5zeW5jKFwiKiovKlwiLCB7XG4gICAgICAgICAgICBjd2Q6IHRlbXBsYXRlUGF0aChcIm1vYmlsZS90YXNrXCIpLFxuICAgICAgICB9KS5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgICBmcy5jb3B5U3luYyhcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibW9iaWxlL3Rhc2tcIiksIGZpbGUpLFxuICAgICAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50YXNrLCBmaWxlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OX44Ot44K444Kn44Kv44OI6Kit5a6a44OV44Kh44Kk44Or44Gu5L2c5oiQXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVQcm9qZWN0U2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MoXCJtb2JpbGUuY3JlYXRlLmFwcC5jcmVhdGVQcm9qZWN0U2V0dGluZ3NcIik7XG4gICAgICAgIGRlYnVnKFwiY3JlYXRlUHJvamVjdFNldHRpbmdzXCIpO1xuXG4gICAgICAgIC8vIHByb2plY3QuY29uZmlnLmpzXG4gICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibW9iaWxlXCIpLCBcIl9wcm9qZWN0LmNvbmZpZy5qc1wiKSxcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwicHJvamVjdC5jb25maWcuanNcIiksXG4gICAgICAgICAgICAkLmV4dGVuZCh7fSwgdGhpcy5fY29uZmlnLCB7XG4gICAgICAgICAgICAgICAgaG9nYW46IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJob2dhbi5qc1wiKSxcbiAgICAgICAgICAgICAgICBoYW1tZXJqczogdGhpcy5pc0luc3RhbGxhdGlvblRhcmdldChcImhhbW1lcmpzXCIpLFxuICAgICAgICAgICAgICAgIGlzY3JvbGw6IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJpc2Nyb2xsXCIpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiB9XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gdHNjb25maWdcbiAgICAgICAgLy8gdHNjb25maWcuYmFzZS5qc29uXG4gICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibW9iaWxlXCIpLCBcIl90c2NvbmZpZy5iYXNlLmpzb25cIiksXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcInRzY29uZmlnLmJhc2UuanNvblwiKSxcbiAgICAgICAgICAgIHRoaXMucXVlcnlUc0NvbmZpZ0Jhc2VQYXJhbSgpLFxuICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIsIGJvbTogZmFsc2UsIH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBtYWluIHRzY29uZmlnLmpzb25cbiAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJtb2JpbGVcIiksIFwiX3RzY29uZmlnLmpzb25cIiksXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcInRzY29uZmlnLmpzb25cIiksXG4gICAgICAgICAgICB0aGlzLl9jb25maWcsXG4gICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIGVzbGludHJjLmpzb25cbiAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJtb2JpbGVcIiksIFwiX2VzbGludHJjLmpzb25cIiksXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnRlc3QsIFwiZXNsaW50XCIsIFwiZXNsaW50cmMuanNvblwiKSxcbiAgICAgICAgICAgIHRoaXMucXVlcnlFc0xpbnRFbnZQYXJhbSgpLFxuICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIsIGJvbTogZmFsc2UsIH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyB0ZXN0ZW1cbiAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJtb2JpbGUvdG9vbHMvdGVzdGVtXCIpLCBcIl90ZXN0ZW0uanNvblwiKSxcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcudGVzdCwgXCJydW5uZXJcIiwgXCJ0ZXN0ZW0uanNvblwiKSxcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiLCBib206IGZhbHNlLCB9XG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgdGVzdGVtU3R1ZmZQYXRoID0gdGVtcGxhdGVQYXRoKFwibW9iaWxlL3Rvb2xzL3Rlc3RlbS9ydW5uZXJcIik7XG5cbiAgICAgICAgZ2xvYi5zeW5jKFwiKipcIiwge1xuICAgICAgICAgICAgY3dkOiB0ZXN0ZW1TdHVmZlBhdGgsXG4gICAgICAgICAgICBub2RpcjogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgZnMuY29weVN5bmMoXG4gICAgICAgICAgICAgICAgICAgIHBhdGguam9pbih0ZXN0ZW1TdHVmZlBhdGgsIGZpbGUpLFxuICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnRlc3QsIFwicnVubmVyXCIsIGZpbGUpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIC5naXRpZ25vcmVcbiAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJtb2JpbGVcIiksIFwiX2dpdGlnbm9yZVwiKSxcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwiLmdpdGlnbm9yZVwiKSxcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcbiAgICAgICAgICAgIHsgYm9tOiBmYWxzZSwgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFJFQURNRS5tZFxuICAgICAgICBjb3B5VHBsKFxuICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZVwiKSwgXCJfUkVBRE1FLm1kXCIpLFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJSRUFETUUubWRcIiksXG4gICAgICAgICAgICAkLmV4dGVuZCh7fSwgdGhpcy5fY29uZmlnLCB7XG4gICAgICAgICAgICAgICAgY29yZG92YTogdGhpcy5pc0VuYWJsZUNvcmRvdmEoKSxcbiAgICAgICAgICAgICAgICBsaWI6IHRoaXMuaGFzU3RydWN0dXJlT2YoXCJsaWJcIiksXG4gICAgICAgICAgICAgICAgcG9ydGluZzogdGhpcy5oYXNTdHJ1Y3R1cmVPZihcInBvcnRpbmdcIiksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiIH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBUT0RPOiB0ZW1wbGF0ZXMvbW9iaWxlL2FkZG9uIOOBi+OCieOCs+ODlOODvOOBmeOCi+WgtOWQiOOBr+OBk+OBk+OBp+WvvuW/nFxuXG4gICAgICAgIC8vIHBhY2thZ2UuanNvblxuICAgICAgICBjb25zdCByZXNvbHZlZENvbmZpZyA9ICQuZXh0ZW5kKHRydWUsIHt9LCB0aGlzLmNvbmZpZyk7XG4gICAgICAgIHJlc29sdmVkQ29uZmlnLmRlcGVuZGVuY2llcyA9IGF3YWl0IHRoaXMucXVlcnlEZXBlbmRlbmNpZXNQYXJhbSh0aGlzLmRlZmF1bHREZXBlbmRlbmNpZXMpO1xuICAgICAgICByZXNvbHZlZENvbmZpZy5kZXZEZXBlbmRlbmNpZXMgPSBhd2FpdCB0aGlzLnF1ZXJ5RGVwZW5kZW5jaWVzUGFyYW0odGhpcy5kZWZhdWx0RGV2RGVwZW5kZW5jaWVzKTtcbiAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJtb2JpbGVcIiksIFwiX3BhY2thZ2UuanNvblwiKSxcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwicGFja2FnZS5qc29uXCIpLFxuICAgICAgICAgICAgcmVzb2x2ZWRDb25maWcsXG4gICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIGNvcmRvdmFQYWNrYWdlSlNPTiDjgajjg57jg7zjgrhcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmNvcmRvdmFQYWNrYWdlSnNvbikge1xuICAgICAgICAgICAgY29uc3QgUEtHX1BBVEggPSBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcInBhY2thZ2UuanNvblwiKTtcbiAgICAgICAgICAgIGNvbnN0IHBrZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKFBLR19QQVRIKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICQuZXh0ZW5kKHRydWUsIHBrZywgdGhpcy5jb25maWcuY29yZG92YVBhY2thZ2VKc29uKTtcblxuICAgICAgICAgICAgY29uc3Qgc29ydEtleXMgPSAodGFyZ2V0OiBvYmplY3QpOiBvYmplY3QgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRlZCA9IHt9O1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRhcmdldCkuc29ydCgpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzb3J0ZWRba2V5XSA9IHRhcmdldFtrZXldO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBzb3J0ZWQ7XG5cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBwa2cuZGVwZW5kZW5jaWVzICAgID0gc29ydEtleXMocGtnLmRlcGVuZGVuY2llcyk7XG4gICAgICAgICAgICBwa2cuZGV2RGVwZW5kZW5jaWVzID0gc29ydEtleXMocGtnLmRldkRlcGVuZGVuY2llcyk7XG5cbiAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoUEtHX1BBVEgsIEpTT04uc3RyaW5naWZ5KHBrZywgbnVsbCwgMikpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44K944O844K544Gu6Zub5b2i5L2c5oiQXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVTb3VyY2VUZW1wbGF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5wcm9ncmVzcyhcIm1vYmlsZS5jcmVhdGUuYXBwLmNyZWF0ZVNvdXJjZVRlbXBsYXRlXCIpO1xuICAgICAgICBkZWJ1ZyhcImNyZWF0ZVNvdXJjZVRlbXBsYXRlXCIpO1xuXG4gICAgICAgIC8vIGNvcHkgc291cmNlc1xuICAgICAgICB0aGlzLmNvcHlUcGxEaXIoXG4gICAgICAgICAgICBcIm1vYmlsZS9zcmMvc3RydWN0dXJlXCIsXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyKVxuICAgICAgICApO1xuXG4gICAgICAgIHsgLy8gY29uZmlnLnRzXG4gICAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsID0gKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWcuZGVwZW5kZW5jaWVzLmxlbmd0aCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtID0ge1xuICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0OiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RXaXRoQ3VzdG9tTmFtZTogW10sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldHMgPSBbLi4udGhpcy5jb25maWcuZGVwZW5kZW5jaWVzLCAuLi50aGlzLmNvbmZpZy5yZXNvdXJjZV9hZGRvbl07XG4gICAgICAgICAgICAgICAgdGFyZ2V0cy5mb3JFYWNoKChpbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLmZpbGVOYW1lIHx8IGluZm8udmVuZGVyTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uYWRkaXRpb25hbC5saXN0V2l0aEN1c3RvbU5hbWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZTogaW5mby5hbGlhcyB8fCBpbmZvLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZGVyTmFtZTogaW5mby52ZW5kZXJOYW1lIHx8IGluZm8uYWxpYXMgfHwgaW5mby5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBpbmZvLmZpbGVOYW1lIHx8IGluZm8uYWxpYXMgfHwgaW5mby5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5hZGRpdGlvbmFsLmxpc3QucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZTogaW5mby5hbGlhcyB8fCBpbmZvLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgICAgIH0pKCk7XG5cbiAgICAgICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZS9zcmNcIiksIFwiX2NvbmZpZy50c1wiKSxcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjQ29uZmlnLnNjcmlwdCwgXCJjb25maWcudHNcIiksXG4gICAgICAgICAgICAgICAgJC5leHRlbmQoe30sIHRoaXMuX2NvbmZpZywgYWRkaXRpb25hbCksXG4gICAgICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHsgLy8gYXBwLnRzXG4gICAgICAgICAgICBjb25zdCBnbG9iYWxzID0gKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWcuZGVwZW5kZW5jaWVzLmxlbmd0aCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtID0ge1xuICAgICAgICAgICAgICAgICAgICBnbG9iYWxzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRzTGlzdDogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzTGlzdDogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNFeHBvcnRzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0cyA9IFsuLi50aGlzLmNvbmZpZy5kZXBlbmRlbmNpZXMsIC4uLnRoaXMuY29uZmlnLnJlc291cmNlX2FkZG9uXTtcbiAgICAgICAgICAgICAgICB0YXJnZXRzLmZvckVhY2goKGluZm8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uZ2xvYmFsRXhwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5nbG9iYWxzLmV4cG9ydHNMaXN0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbEV4cG9ydDogaW5mby5nbG9iYWxFeHBvcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZTogaW5mby5hbGlhcyB8fCBpbmZvLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmdsb2JhbHMuaW1wb3J0c0xpc3QucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZTogaW5mby5hbGlhcyB8fCBpbmZvLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHBhcmFtLmdsb2JhbHMuaGFzRXhwb3J0cyA9ICgwIDwgcGFyYW0uZ2xvYmFscy5leHBvcnRzTGlzdC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgICAgIH0pKCk7XG5cbiAgICAgICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZS9zcmNcIiksIFwiX2FwcC50c1wiKSxcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjQ29uZmlnLnNjcmlwdCwgXCJhcHAudHNcIiksXG4gICAgICAgICAgICAgICAgZ2xvYmFscyxcbiAgICAgICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgey8vIGxvY2FsaXplIHJlc291cmNlc1xuICAgICAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibW9iaWxlL3NyYy9fbG9jYWxlc1wiKSwgXCJfbWVzc2FnZXMuZW4tVVMuanNvblwiKSxcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdERpcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnJlcyxcbiAgICAgICAgICAgICAgICAgICAgXCJsb2NhbGVzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwibWVzc2FnZXMuZW4tVVMuanNvblwiXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZyxcbiAgICAgICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZS9zcmMvX2xvY2FsZXNcIiksIFwiX21lc3NhZ2VzLmphLUpQLmpzb25cIiksXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3REaXIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5yZXMsXG4gICAgICAgICAgICAgICAgICAgIFwibG9jYWxlc1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzLmphLUpQLmpzb25cIlxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcsXG4gICAgICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIsIGJvbTogZmFsc2UsIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyByZW1vdmUgLmdpdGtlZXBcbiAgICAgICAgICAgIGZzLnVubGlua1N5bmMocGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIHRoaXMucm9vdERpcixcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjLFxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5yZXMsXG4gICAgICAgICAgICAgICAgXCIuZ2l0a2VlcFwiXG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHsvLyBwYXRjaC5kZXBlbmRlbmNpZXNcbiAgICAgICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZS9zcmMvX3BhdGNoLmRlcGVuZGVuY2llc1wiKSwgXCJfaW5kZXguZC50c1wiKSxcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdERpcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLmV4dGVybmFsLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcudHlwZXMsXG4gICAgICAgICAgICAgICAgICAgIFwicGF0Y2guZGVwZW5kZW5jaWVzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiaW5kZXguZC50c1wiXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGhhbW1lcmpzOiB0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaGFtbWVyanNcIiksXG4gICAgICAgICAgICAgICAgICAgIGZsaXBzbmFwOiB0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiZmxpcHNuYXBcIiksXG4gICAgICAgICAgICAgICAgICAgIGlzY3JvbGw6IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJpc2Nyb2xsXCIpLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIGNvcHkgcGF0Y2ggZC50c1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJoYW1tZXJqc1wiKSkge1xuICAgICAgICAgICAgICAgIGZzLmNvcHlTeW5jKHRlbXBsYXRlUGF0aChcIm1vYmlsZS9zcmMvX3BhdGNoLmRlcGVuZGVuY2llcy9qcXVlcnkuaGFtbWVyLmQudHNcIiksXG4gICAgICAgICAgICAgICAgICAgIHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdERpcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuZXh0ZXJuYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcudHlwZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInBhdGNoLmRlcGVuZGVuY2llc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJqcXVlcnkuaGFtbWVyLmQudHNcIlxuICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiZmxpcHNuYXBcIikpIHtcbiAgICAgICAgICAgICAgICBmcy5jb3B5U3luYyh0ZW1wbGF0ZVBhdGgoXCJtb2JpbGUvc3JjL19wYXRjaC5kZXBlbmRlbmNpZXMvZmxpcHNuYXAuZC50c1wiKSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290RGlyLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5leHRlcm5hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50eXBlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicGF0Y2guZGVwZW5kZW5jaWVzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZsaXBzbmFwLmQudHNcIlxuICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaXNjcm9sbFwiKSkge1xuICAgICAgICAgICAgICAgIGZzLmNvcHlTeW5jKHRlbXBsYXRlUGF0aChcIm1vYmlsZS9zcmMvX3BhdGNoLmRlcGVuZGVuY2llcy9pc2Nyb2xsLmQudHNcIiksXG4gICAgICAgICAgICAgICAgICAgIHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdERpcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuZXh0ZXJuYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcudHlwZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInBhdGNoLmRlcGVuZGVuY2llc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJpc2Nyb2xsLmQudHNcIlxuICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcmVtb3ZlIC5naXRrZWVwXG4gICAgICAgICAgICBmcy51bmxpbmtTeW5jKHBhdGguam9pbihcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3REaXIsXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYyxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuZXh0ZXJuYWwsXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnR5cGVzLFxuICAgICAgICAgICAgICAgIFwiLmdpdGtlZXBcIlxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cblxuICAgICAgICB7Ly8gaW5kZXguaHRtbFxuICAgICAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibW9iaWxlL3NyY1wiKSwgXCJfaW5kZXguaHRtbFwiKSxcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjLCBcImluZGV4Lmh0bWxcIiksXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWdcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWaXN1YWwgU3R1ZGlvIOOBruOCveODquODpeODvOOCt+ODp+ODs+ODleOCoeOCpOODq+S9nOaIkFxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlVmlzdWFsU3R1ZGlvU29sdXRpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHZzUGFyYW0gPSAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFyYW06IElWaXN1YWxTdHVkaW9Db25maWdyYXRpb24gPSA8YW55PiQuZXh0ZW5kKHt9LCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnKTtcblxuICAgICAgICAgICAgcGFyYW0ucHJvamVjdE5hbWUgPSB0aGlzLl9jb25maWcucHJvamVjdE5hbWU7XG4gICAgICAgICAgICBwYXJhbS5wcm9qZWN0R1VJRCA9IGNyZWF0ZUdVSUQoKTtcbiAgICAgICAgICAgIHBhcmFtLnR5cGVzID0gcGFyYW0udHlwZXMucmVwbGFjZShcIkBcIiwgXCIlNDBcIik7IC8vIGVzY2FwZSBcIkBcIiB0byBcIiU0MFwiXG4gICAgICAgICAgICBwYXJhbS5saWNlbnNlID0gIXRoaXMuX2NvbmZpZy5wcml2YXRlO1xuXG4gICAgICAgICAgICAvLyBleHRlcm5hbFxuICAgICAgICAgICAgKDxhbnk+cGFyYW0pLmNvcmRvdmEgICAgPSB0aGlzLmlzRW5hYmxlQ29yZG92YSgpO1xuICAgICAgICAgICAgKDxhbnk+cGFyYW0pLmhvZ2FuICAgICAgPSB0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaG9nYW4uanNcIik7XG4gICAgICAgICAgICAoPGFueT5wYXJhbSkuaGFtbWVyanMgICA9IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJoYW1tZXJqc1wiKTtcbiAgICAgICAgICAgICg8YW55PnBhcmFtKS5pc2Nyb2xsICAgID0gdGhpcy5pc0luc3RhbGxhdGlvblRhcmdldChcImlzY3JvbGxcIik7XG4gICAgICAgICAgICAoPGFueT5wYXJhbSkuZmxpcHNuYXAgICA9IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJmbGlwc25hcFwiKTtcblxuICAgICAgICAgICAgLy8gcHJvamVjdCBzdHJ1Y3R1cmVcbiAgICAgICAgICAgICg8YW55PnBhcmFtKS5lbmFibGVMaWIgICAgICA9IHRoaXMuaGFzU3RydWN0dXJlT2YoXCJsaWJcIik7XG4gICAgICAgICAgICAoPGFueT5wYXJhbSkuZW5hYmxlUG9ydGluZyAgPSB0aGlzLmhhc1N0cnVjdHVyZU9mKFwicG9ydGluZ1wiKTtcblxuICAgICAgICAgICAgLy8gcGxhdGZvcm1zXG4gICAgICAgICAgICAoPGFueT5wYXJhbSkucGxhdGZvcm1zID0gWy4uLnRoaXMuY29uZmlnLnBsYXRmb3Jtc107XG5cbiAgICAgICAgICAgIC8vIHNldHVwIGJ1aWx0IHRzIGdyb3VwXG4gICAgICAgICAgICBwYXJhbS50c0dyb3VwID0gW107XG4gICAgICAgICAgICBnbG9iLnN5bmMoXCIqKi8qLnRzXCIsIHtcbiAgICAgICAgICAgICAgICBjd2Q6IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290RGlyLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbS5zcmMsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtLnNyY0NvbmZpZy5zY3JpcHRcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSkuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgICAgcGFyYW0uc3JjLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbS5zcmNDb25maWcuc2NyaXB0LFxuICAgICAgICAgICAgICAgICAgICBwYXRoLmRpcm5hbWUoZmlsZSlcbiAgICAgICAgICAgICAgICApLnJlcGxhY2UoL1xcLy9nLCBcIlxcXFxcIikgKyBcIlxcXFxcIjtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZSwgXCIudHNcIik7XG4gICAgICAgICAgICAgICAgcGFyYW0udHNHcm91cC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVQYXRoOiByZWxhdGl2ZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1hcDogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIHNldHVwIHRlc3QgdHMgZ3JvdXBcbiAgICAgICAgICAgIGdsb2Iuc3luYyhcIioqLyoudHNcIiwge1xuICAgICAgICAgICAgICAgIGN3ZDogcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3REaXIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50ZXN0LFxuICAgICAgICAgICAgICAgICAgICBcInVuaXRcIlxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9KS5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGFyYW0udGVzdCArIFwiXFxcXHVuaXRcXFxcXCI7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGUsIFwiLnRzXCIpO1xuICAgICAgICAgICAgICAgIHBhcmFtLnRzR3JvdXAucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlUGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGRlcGVuZGVlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBtYXA6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgLy8gLnNsblxuICAgICAgICBjb3B5VHBsKFxuICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcImJhc2UvdmlzdWFsLnN0dWRpb1wiKSwgXCJfc29sdXRpb24uc2xuLnRwbFwiKSxcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIHZzUGFyYW0ucHJvamVjdE5hbWUgKyBcIi5zbG5cIiksXG4gICAgICAgICAgICB2c1BhcmFtLFxuICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIC5jc3Byb2pcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRvWG1sU3RyaW5nID0gKGZpbGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGVvbDogb3MuRU9MLFxuICAgICAgICAgICAgICAgICAgICBib206IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGRlbGltaXRlcnM6IFwie3sgfX1cIixcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IGpzdCA9IGhvZ2FuLmNvbXBpbGUobm9ybWFsaXplVGV4dChmcy5yZWFkRmlsZVN5bmMoZmlsZSkudG9TdHJpbmcoKSwgeyBlb2w6IFwiXFxuXCIsIGJvbTogZmFsc2UgfSksIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBqc3QucmVuZGVyKHZzUGFyYW0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgdG9YbWxET00gPSAoZmlsZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICQoJC5wYXJzZVhNTCh0b1htbFN0cmluZyhmaWxlKSkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgdG9YbWxOb2RlID0gKGZpbGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdHIyWG1sTm9kZSh0b1htbFN0cmluZyhmaWxlKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCAkcHJvaiA9IHRvWG1sRE9NKHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJtb2JpbGUvdmlzdWFsLnN0dWRpb1wiKSwgXCJfcHJvamVjdC5jc3Byb2oudHBsXCIpKTtcbiAgICAgICAgICAgIGNvbnN0ICRncFRTID0gdG9YbWxOb2RlKHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJiYXNlL3Zpc3VhbC5zdHVkaW9cIiksIFwiX3RzLml0ZW0uZ3JvdXAudHBsXCIpKTtcblxuICAgICAgICAgICAgJHByb2pcbiAgICAgICAgICAgICAgICAuZmluZChcIkl0ZW1Hcm91cFwiKVxuICAgICAgICAgICAgICAgIC5sYXN0KClcbiAgICAgICAgICAgICAgICAuYWZ0ZXIoJGdwVFMpXG4gICAgICAgICAgICAgICAgO1xuXG4gICAgICAgICAgICBjb25zdCBkc3RQYXRoID0gcGF0aC5qb2luKHRoaXMucm9vdERpciwgdnNQYXJhbS5wcm9qZWN0TmFtZSArIFwiLmNzcHJvalwiKTtcbiAgICAgICAgICAgIGRlYnVnKHhtbE5vZGUyU3RyKCRwcm9qKSk7XG4gICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRzdFBhdGgsIGZvcm1hdFhNTCh4bWxOb2RlMlN0cigkcHJvaikpKTtcbiAgICAgICAgfSkoKTtcblxuICAgICAgICAvLyB3ZWIuY29uZmlnXG4gICAgICAgIGZzLmNvcHlTeW5jKHRlbXBsYXRlUGF0aChcIm1vYmlsZS92aXN1YWwuc3R1ZGlvL193ZWIuY29uZmlnXCIpLCBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcIndlYi5jb25maWdcIikpO1xuICAgICAgICBmcy5jb3B5U3luYyh0ZW1wbGF0ZVBhdGgoXCJtb2JpbGUvdmlzdWFsLnN0dWRpby9fd2ViLkRlYnVnLmNvbmZpZ1wiKSwgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJ3ZWIuRGVidWcuY29uZmlnXCIpKTtcbiAgICAgICAgZnMuY29weVN5bmModGVtcGxhdGVQYXRoKFwibW9iaWxlL3Zpc3VhbC5zdHVkaW8vX3dlYi5SZWxlYXNlLmNvbmZpZ1wiKSwgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJ3ZWIuUmVsZWFzZS5jb25maWdcIikpO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi8uLi9zcmMvZ2VuZXJhdG9ycy9tb2JpbGUvZ2VuZXJhdG9yLWNvcmRvdmEudHMiLCJpbXBvcnQgeyBHZW5lcmF0b3JCYXNlLCBJUHJvamVjdENvbmZpZ3JhdGlvbiB9IGZyb20gXCIuLi9iYXNlXCI7XG5pbXBvcnQgeyBHZW5lcmF0b3JFbGVjdHJvbiB9IGZyb20gXCIuL2dlbmVyYXRvci1lbGVjdG9yb25cIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZ2VuZXJhdG9yLWVsZWN0b3JvblwiO1xuXG4vKipcbiAqIGdlbmVyYXRvciDnlJ/miJDplqLmlbBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5ld0dlbmVyYXRvckRlc2t0b3AoY29uZmlnOiBJUHJvamVjdENvbmZpZ3JhdGlvbik6IEdlbmVyYXRvckJhc2Uge1xuICAgIHJldHVybiBuZXcgR2VuZXJhdG9yRWxlY3Ryb24oY29uZmlnKTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi8uLi9zcmMvZ2VuZXJhdG9ycy9kZXNrdG9wL2luZGV4LnRzIiwiLyogdHNsaW50OmRpc2FibGU6bm8tdW51c2VkLXZhcmlhYmxlIG5vLXVudXNlZC12YXJzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG5pbXBvcnQgeyBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbiwgR2VuZXJhdG9yQmFzZSB9IGZyb20gXCIuLi9iYXNlXCI7XG5pbXBvcnQgeyBJRGVza3RvcEFwcENvbmZpZ3JhdGlvbiB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcblxuLyoqXG4gKiBAY2xhc3MgR2VuZXJhdG9yRWxlY3Ryb25cbiAqIEBicmllZiBEZXNrdG9wIEVsZWN0cm9uIOeUqCBHZW5lcmF0b3Ig44Kv44Op44K5XG4gKi9cbmV4cG9ydCBjbGFzcyBHZW5lcmF0b3JFbGVjdHJvbiBleHRlbmRzIEdlbmVyYXRvckJhc2Uge1xuXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBpbXByZW1lbnRlczogR2VuZXJhdG9yQmFzZVxuXG4gICAgLyoqXG4gICAgICog5pei5a6a44GuIGRpcmVjdG9yeSDmp4vpgKDjgpLov5TljbRcbiAgICAgKi9cbiAgICBkZWZhdWx0QmFzZVN0cnVjdHVyZSgpOiBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzcmM6IFwiYXBwXCIsXG4gICAgICAgICAgICBwa2c6IFwid3d3L2FwcFwiLCAvLyBUT0RPOiDmmqvlrppcbiAgICAgICAgICAgIGJ1aWx0OiBcImFwcFwiLFxuICAgICAgICAgICAgZG9jOiBcImRvY3NcIixcbiAgICAgICAgICAgIHRhc2s6IFwidGFza3NcIixcbiAgICAgICAgICAgIHRlc3Q6IFwidGVzdHNcIixcbiAgICAgICAgICAgIHR5cGVzOiBcIkB0eXBlc1wiLFxuICAgICAgICAgICAgc3JjQ29uZmlnOiB7XG4gICAgICAgICAgICAgICAgc2NyaXB0OiBcInNjcmlwdHNcIixcbiAgICAgICAgICAgICAgICBzdHlsZXNoZWV0OiBcInN0eWxlc2hlZXRzXCIsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IFwidGVtcGxhdGVzXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGNyZWF0ZSBhY3Rpb24gZW50cnlcbiAgICAgKiBAcGFyYW0ge0lEZXNrdG9wQXBwQ29uZmlncmF0aW9ufSBjb25maWcg44Kz44Oz44OV44Kj44Kw6Kit5a6aXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBUT0RPOlxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJ1bmRlciBjb25zdHJ1Y3Rpb24uXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOW/heimgeOBqOOBmeOCiyB0YXNrIHNjcmlwdCDkuIDopqfjgpLov5TljbQuIGFjdGlvbjogY3JlYXRlIOOBruOBqOOBjeOBq+WRvOOBsOOCjOOCi1xuICAgICAqL1xuICAgIGdldCB0YXNrTGlzdCgpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBcImJhbm5lci5qc1wiLFxuICAgICAgICAgICAgXCJjbGVhbi5qc1wiLFxuICAgICAgICAgICAgXCJzcmNtYXAuanNcIixcbiAgICAgICAgICAgIFwiYnVpbGQtdHMtY2xlYW4uanNcIixcbiAgICAgICAgICAgIFwiYnVpbGQtdHMtbm9ybWFsaXplLmpzXCIsXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBwcml2YXRlIG1ldGhvZHM6XG5cbiAgICAvKipcbiAgICAgKiBjb25maWdyYXRpb24g44Gr44Ki44Kv44K744K5XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXQgY29uZmlnKCk6IElEZXNrdG9wQXBwQ29uZmlncmF0aW9uIHtcbiAgICAgICAgcmV0dXJuIDxJRGVza3RvcEFwcENvbmZpZ3JhdGlvbj50aGlzLl9jb25maWc7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4uLy4uLy4uL3NyYy9nZW5lcmF0b3JzL2Rlc2t0b3AvZ2VuZXJhdG9yLWVsZWN0b3Jvbi50cyIsImltcG9ydCB7IEdlbmVyYXRvckJhc2UsIElQcm9qZWN0Q29uZmlncmF0aW9uIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IEdlbmVyYXRvckJyb3dzZXIgfSBmcm9tIFwiLi9nZW5lcmF0b3ItYnJvd3NlclwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0b3ItYnJvd3NlclwiO1xuXG4vKipcbiAqIGdlbmVyYXRvciDnlJ/miJDplqLmlbBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5ld0dlbmVyYXRvcldlYihjb25maWc6IElQcm9qZWN0Q29uZmlncmF0aW9uKTogR2VuZXJhdG9yQmFzZSB7XG4gICAgcmV0dXJuIG5ldyBHZW5lcmF0b3JCcm93c2VyKGNvbmZpZyk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vLi4vc3JjL2dlbmVyYXRvcnMvd2ViL2luZGV4LnRzIiwiLyogdHNsaW50OmRpc2FibGU6bm8tdW51c2VkLXZhcmlhYmxlIG5vLXVudXNlZC12YXJzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG5pbXBvcnQgeyBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbiwgR2VuZXJhdG9yQmFzZSB9IGZyb20gXCIuLi9iYXNlXCI7XG5pbXBvcnQgeyBJV2ViQXBwQ29uZmlncmF0aW9uIH0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xuXG4vKipcbiAqIEBjbGFzcyBHZW5lcmF0b3JCcm93c2VyXG4gKiBAYnJpZWYgV2ViIEJyb3dzZXIg55SoIEdlbmVyYXRvciDjgq/jg6njgrlcbiAqL1xuZXhwb3J0IGNsYXNzIEdlbmVyYXRvckJyb3dzZXIgZXh0ZW5kcyBHZW5lcmF0b3JCYXNlIHtcblxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gaW1wcmVtZW50ZXM6IEdlbmVyYXRvckJhc2VcblxuICAgIC8qKlxuICAgICAqIOaXouWumuOBriBkaXJlY3Rvcnkg5qeL6YCg44KS6L+U5Y20XG4gICAgICovXG4gICAgZGVmYXVsdEJhc2VTdHJ1Y3R1cmUoKTogSUJhc2VTdHJ1Y3R1cmVDb25maWdyYXRpb24ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3JjOiBcImFwcFwiLFxuICAgICAgICAgICAgcGtnOiBcInd3d1wiLFxuICAgICAgICAgICAgYnVpbHQ6IFwiYXBwXCIsXG4gICAgICAgICAgICBkb2M6IFwiZG9jc1wiLFxuICAgICAgICAgICAgdGFzazogXCJ0YXNrc1wiLFxuICAgICAgICAgICAgdGVzdDogXCJ0ZXN0c1wiLFxuICAgICAgICAgICAgdHlwZXM6IFwiQHR5cGVzXCIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY3JlYXRlIGFjdGlvbiBlbnRyeVxuICAgICAqIEBwYXJhbSB7SUxpYnJhcnlDb25maWdyYXRpb259IGNvbmZpZyDjgrPjg7Pjg5XjgqPjgrDoqK3lrppcbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFRPRE86XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcInVuZGVyIGNvbnN0cnVjdGlvbi5cIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5b+F6KaB44Go44GZ44KLIHRhc2sgc2NyaXB0IOS4gOimp+OCkui/lOWNtC4gYWN0aW9uOiBjcmVhdGUg44Gu44Go44GN44Gr5ZG844Gw44KM44KLXG4gICAgICovXG4gICAgZ2V0IHRhc2tMaXN0KCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIFwiYmFubmVyLmpzXCIsXG4gICAgICAgICAgICBcImNsZWFuLmpzXCIsXG4gICAgICAgICAgICBcInNyY21hcC5qc1wiLFxuICAgICAgICAgICAgXCJidWlsZC10cy1jbGVhbi5qc1wiLFxuICAgICAgICAgICAgXCJidWlsZC10cy1ub3JtYWxpemUuanNcIixcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIHByaXZhdGUgbWV0aG9kczpcblxuICAgIC8qKlxuICAgICAqIGNvbmZpZ3JhdGlvbiDjgavjgqLjgq/jgrvjgrlcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldCBjb25maWcoKTogSVdlYkFwcENvbmZpZ3JhdGlvbiB7XG4gICAgICAgIHJldHVybiA8SVdlYkFwcENvbmZpZ3JhdGlvbj50aGlzLl9jb25maWc7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4uLy4uLy4uL3NyYy9nZW5lcmF0b3JzL3dlYi9nZW5lcmF0b3ItYnJvd3Nlci50cyIsImltcG9ydCAqIGFzIFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XG5leHBvcnQgeyBVdGlscyB9O1xuXG5pbXBvcnQge1xuICAgIElTb3VyY2VEaXJjdG9yeUNvbmZpZ3JhdGlvbixcbiAgICBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbixcbiAgICBJUHJvamVjdENvbmZpZ3JhdGlvbixcbiAgICBJQnVpbGRUYXJnZXRDb25maWdyYXRpb24sXG4gICAgSUxpYnJhcnlDb25maWdyYXRpb24sXG4gICAgSUV4dGVybmFsTW9kdWxlSW5mbyxcbiAgICBJRXh0ZXJuYWxNb2R1bGVzLFxuICAgIElNb2JpbGVBcHBDb25maWdyYXRpb24sXG4gICAgSURlc2t0b3BBcHBDb25maWdyYXRpb24sXG4gICAgSVdlYkFwcENvbmZpZ3JhdGlvbixcbiAgICAvLy8vXG4gICAgbmV3R2VuZXJhdG9yXG59IGZyb20gXCIuL2dlbmVyYXRvcnNcIjtcblxuZXhwb3J0IHtcbiAgICBJU291cmNlRGlyY3RvcnlDb25maWdyYXRpb24sXG4gICAgSUJhc2VTdHJ1Y3R1cmVDb25maWdyYXRpb24sXG4gICAgSVByb2plY3RDb25maWdyYXRpb24sXG4gICAgSUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uLFxuICAgIElMaWJyYXJ5Q29uZmlncmF0aW9uLFxuICAgIElFeHRlcm5hbE1vZHVsZUluZm8sXG4gICAgSUV4dGVybmFsTW9kdWxlcyxcbiAgICBJTW9iaWxlQXBwQ29uZmlncmF0aW9uLFxuICAgIElEZXNrdG9wQXBwQ29uZmlncmF0aW9uLFxuICAgIElXZWJBcHBDb25maWdyYXRpb24sXG59O1xuXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vL1xuXG4vKipcbiAqIEBjbGFzcyBDRFBMaWJcbiAqIEBicmllZiBDRFAgYm9pbGVycGxhdGUg55Sf5oiQ5qmf6IO944KS5o+Q5L6b44GZ44KL44Kv44Op44K5XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENEUExpYiB7XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIHB1YmljIG1ldGhvZHM6XG5cbiAgICAvKipcbiAgICAgKiBtYWluIGNvbW1hbmRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGV4ZWN1dGUoY29uZmlnOiBJUHJvamVjdENvbmZpZ3JhdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBVdGlscy5zZXRTZXR0aW5ncyhjb25maWcuc2V0dGluZ3MpO1xuICAgICAgICByZXR1cm4gbmV3R2VuZXJhdG9yKGNvbmZpZykucnVuKCk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4uL3NyYy9jZHAtbGliLnRzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnMtZXh0cmFcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcImZzLWV4dHJhXCIsXCJjb21tb25qczJcIjpcImZzLWV4dHJhXCJ9XG4vLyBtb2R1bGUgaWQgPSAxNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJnbG9iXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJnbG9iXCIsXCJjb21tb25qczJcIjpcImdsb2JcIn1cbi8vIG1vZHVsZSBpZCA9IDE3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcInJvb3RcIjpcIkhvZ2FuXCIsXCJjb21tb25qc1wiOlwiaG9nYW4uanNcIixcImNvbW1vbmpzMlwiOlwiaG9nYW4uanNcIixcImFtZFwiOlwiaG9nYW4uanNcIn1cbi8vIG1vZHVsZSBpZCA9IDE4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJyb290XCI6XCJfXCIsXCJjb21tb25qc1wiOlwibG9kYXNoXCIsXCJjb21tb25qczJcIjpcImxvZGFzaFwifVxuLy8gbW9kdWxlIGlkID0gMTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidW5kZXJzY29yZS5zdHJpbmdcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wicm9vdFwiOlwiX1wiLFwiY29tbW9uanNcIjpcInVuZGVyc2NvcmUuc3RyaW5nXCIsXCJjb21tb25qczJcIjpcInVuZGVyc2NvcmUuc3RyaW5nXCJ9XG4vLyBtb2R1bGUgaWQgPSAyMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ3aGljaFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qc1wiOlwid2hpY2hcIixcImNvbW1vbmpzMlwiOlwid2hpY2hcIn1cbi8vIG1vZHVsZSBpZCA9IDIxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInV1aWRcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcInV1aWRcIixcImNvbW1vbmpzMlwiOlwidXVpZFwifVxuLy8gbW9kdWxlIGlkID0gMjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2hhbGtcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcImNoYWxrXCIsXCJjb21tb25qczJcIjpcImNoYWxrXCJ9XG4vLyBtb2R1bGUgaWQgPSAyM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJzZW12ZXItcmVnZXhcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcInNlbXZlci1yZWdleFwiLFwiY29tbW9uanMyXCI6XCJzZW12ZXItcmVnZXhcIn1cbi8vIG1vZHVsZSBpZCA9IDI0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsaS1zcGlubmVyXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJjbGktc3Bpbm5lclwiLFwiY29tbW9uanMyXCI6XCJjbGktc3Bpbm5lclwifVxuLy8gbW9kdWxlIGlkID0gMjVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwianNkb21cIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcImpzZG9tXCIsXCJjb21tb25qczJcIjpcImpzZG9tXCJ9XG4vLyBtb2R1bGUgaWQgPSAyNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ4bWxkb21cIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcInhtbGRvbVwiLFwiY29tbW9uanMyXCI6XCJ4bWxkb21cIn1cbi8vIG1vZHVsZSBpZCA9IDI3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImpxdWVyeVwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJyb290XCI6XCJqUXVlcnlcIixcImNvbW1vbmpzXCI6XCJqcXVlcnlcIixcImNvbW1vbmpzMlwiOlwianF1ZXJ5XCIsXCJhbWRcIjpcImpxdWVyeVwifVxuLy8gbW9kdWxlIGlkID0gMjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0ICogYXMgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgeyBzcGF3biwgU3Bhd25PcHRpb25zIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcblxuaW1wb3J0IHtcbiAgICBmcyxcbiAgICBob2dhbixcbiAgICAkLFxuICAgIHdoaWNoLFxuICAgIHV1aWQsXG4gICAgU3Bpbm5lcixcbn0gZnJvbSBcIi4vbGlic1wiO1xuXG5pbXBvcnQge1xuICAgIGFzc2VydCxcbiAgICBnZXRMaWJQYXRoLFxufSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gZXhwb3J0cyBtZXRob2RzOlxuXG4vKipcbiAqIEhhbmRsZSBjb21tYW5kIGxpbmUgZXJyb3IgYW5kIGtpbGwgcHJvY2Vzcy5cbiAqIFdoZW4gdGhlIGFwcGxpY2F0aW9uIHJlY2VpdmVkIGVycm9yIGZyb20gY2xpLCBwbGVhc2UgY2FsbCB0aGlzIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZXJyb3IgIGVycm9yIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXJyb3IoZXJyb3I6IHN0cmluZyk6IHZvaWQge1xuICAgIGFzc2VydChmYWxzZSwgZXJyb3IpO1xufVxuXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vL1xuXG4vKipcbiAqIFwidGVtcGxhdGVzXCIg44OH44Kj44Os44Kv44OI44Oq44GL44KJ44Gu44OR44K544KS5Y+W5b6XLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdGFyZ2V0IOOCv+ODvOOCsuODg+ODiOOCkuaMh+Wumi4gbnVsbCDjga7loLTlkIjjga/jgIF0ZW1wbGF0ZXMg44KS6L+U5Y20XG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRlbXBsYXRlcy9ob2dlaG9nZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGVQYXRoKHRhcmdldDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAobnVsbCA9PSB0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguam9pbihnZXRMaWJQYXRoKCksIFwidGVtcGxhdGVzXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4oZ2V0TGliUGF0aCgpLCBcInRlbXBsYXRlc1wiLCB0YXJnZXQpO1xuICAgIH1cbn1cblxuLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLy9cblxuLyoqXG4gKiBHZXQgc3Bpbm5lciBpbnN0YW5jZS5cbiAqIENMSSBoZWxwZXIuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSAgW2Zvcm1hdF0gIHNwaW5uZXIgZm9ybWF0IHN0cmluZy5cbiAqIEBwYXJhbSAge051bWJlcn0gIFtpbmRleF0gICBzcGlubmVyIGluZGV4IGRlZmluZWQgYnkgY2xpLXNwaW5uZXIuIChkZWZhdWx0OiByYW5kb20gWzAtMjldKVxuICogQHJldHVybiB7U3Bpbm5lcn0gY2xpLXNwaW5uZXIgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGlubmVyKGZvcm1hdD86IHN0cmluZywgaW5kZXg/OiBudW1iZXIpOiB7IHN0YXJ0OiAoKSA9PiB2b2lkOyBzdG9wOiAoY2xlYW4/OiBib29sZWFuKSA9PiB2b2lkOyB9IHtcbiAgICBjb25zdCBzcGlubmVycyA9IFtcbiAgICAgICAgXCJ8Ly1cXFxcXCIsXG4gICAgICAgIFwi4pSk4pSY4pS04pSU4pSc4pSM4pSs4pSQXCIsXG4gICAgICAgIFwi4pei4pej4pek4pelXCIsXG4gICAgICAgIFwi4paM4paA4paQ4paEXCIsXG4gICAgICAgIFwi4paJ4paK4paL4paM4paN4paO4paP4paO4paN4paM4paL4paK4paJXCIsXG4gICAgICAgIFwi4paB4paD4paE4paF4paG4paH4paI4paH4paG4paF4paE4paDXCIsXG4gICAgICAgIFwi4pix4piy4pi0XCIsXG4gICAgICAgIFwiLm9PQCpcIixcbiAgICAgICAgXCLil5Dil5Pil5Hil5JcIixcbiAgICAgICAgLy8vL1xuICAgICAgICBcIuKXoeKXoSDiipniipkg4peg4pegXCIsXG4gICAgICAgIFwi4pag4pah4paq4parXCIsXG4gICAgICAgIFwi4oaQ4oaW4oaR4oaX4oaS4oaY4oaT4oaZXCIsXG4gICAgICAgIFwiLm9PwrBPby5cIixcbiAgICBdO1xuICAgIGNvbnN0IGZtdCA9IGZvcm1hdCB8fCBcIiVzXCI7XG4gICAgY29uc3Qgc3Bpbm5lciA9IG5ldyBTcGlubmVyKGZtdCk7XG4gICAgY29uc3QgaWR4ID0gKG51bGwgIT0gaW5kZXggJiYgMCA8PSBpbmRleCAmJiBpbmRleCA8IDE0KSA/IGluZGV4IDogTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTApO1xuICAgIHNwaW5uZXIuc2V0U3Bpbm5lclN0cmluZyhzcGlubmVyc1tpZHhdKTtcbiAgICByZXR1cm4gc3Bpbm5lcjtcbn1cblxuLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLy9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIE5vcm1hbGl6ZVRleHRPcHRpb25zXG4gKiBAYnJpZWYgbm9ybWFsaXplVGV4dCgpIOOBq+aMh+WumuOBmeOCi+OCquODl+OCt+ODp+ODs1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vcm1hbGl6ZVRleHRPcHRpb25zIHtcbiAgICBlb2w/OiBzdHJpbmc7ICAgLy8gZGVmYXVsdDogb3MuRU9MXG4gICAgYm9tPzogYm9vbGVhbjsgIC8vIGRlZmF1bHQ6IHRydWVcbiAgICB0YWI/OiBudW1iZXI7ICAgLy8gdGFiIOOCkuWkieaPm+OBmeOCi+OCueODmuODvOOCueOBruaVsOOCkuaMh+Wumi4gZGVmYXVsdDog5aSJ5o+b44GX44Gq44GEXG59XG5cbi8qKlxuICogTm9ybWFsaXplIHRleHQgbGluZS1mZWVkLlxuICogZm9yIHdpbmRvd3MgZ2l0IHVzZXIuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgICAgIHRleHQgICAgICBpbnB1dCB0ZXh0LlxuICogQHBhcmFtICB7Tm9ybWFsaXplVGV4dE9wdGlvbnN9IFtvcHRpb25zXSBvcHRpb24uXG4gKiBAcmV0dXJuIHtTdHJpbmd9IG5vcm1hbGl6ZWQgdGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVRleHQodGV4dDogc3RyaW5nLCBvcHRpb25zPzogTm9ybWFsaXplVGV4dE9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IG9wdDogTm9ybWFsaXplVGV4dE9wdGlvbnMgPSAkLmV4dGVuZCh7fSwge1xuICAgICAgICBlb2w6IG9zLkVPTCxcbiAgICAgICAgYm9tOiB0cnVlLFxuICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgdGV4dCA9IHRleHRcbiAgICAgICAgLnJlcGxhY2UoL15cXHVmZWZmL2dtLCBcIlwiKSAgIC8vIHJlbW92ZSBib21cbiAgICAgICAgLnJlcGxhY2UoL1xcclxcbi9nbSwgXCJcXG5cIikgICAgLy8gb25jZSBcIlxcblwiXG4gICAgICAgIC5yZXBsYWNlKC9cXHIvZ20sIFwiXFxuXCIpXG4gICAgO1xuXG4gICAgaWYgKG9wdC5ib20pIHtcbiAgICAgICAgdGV4dCA9IFwiXFx1ZmVmZlwiICsgdGV4dDtcbiAgICB9XG4gICAgaWYgKFwiXFxuXCIgIT09IG9wdC5lb2wpIHtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFxuL2dtLCBvcHQuZW9sKTtcbiAgICB9XG4gICAgaWYgKG9wdC50YWIpIHtcbiAgICAgICAgY29uc3Qgc3BhY2VzID0gKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBzID0gXCJcIjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0LnRhYjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcyArPSBcIiBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICB9KSgpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXHQvZ20sIHNwYWNlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRleHQ7XG59XG5cbi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vXG5cbi8qKlxuICogQGludGVyZmFjZSBFeGVjQ29tbWFuZE9wdGlvbnNcbiAqIEBicmllZiBleGVjQ29tbWFuZCgpIOOBq+aMh+WumuOBmeOCi+OCquODl+OCt+ODp+ODs1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNDb21tYW5kT3B0aW9ucyBleHRlbmRzIFNwYXduT3B0aW9ucyB7XG4gICAgc3Bpbm5lcj86IHtcbiAgICAgICAgZm9ybWF0Pzogc3RyaW5nOyAgICAvLyBleCkgXCIlc1wiXG4gICAgICAgIGluZGV4PzogbnVtYmVyOyAgICAgLy8gMCAtIDkg44Gu5pWw5YCk44KS5oyH5a6aXG4gICAgfTtcbiAgICBzdGRvdXQ/OiAoZGF0YTogc3RyaW5nKSA9PiB2b2lkO1xuICAgIHN0ZGVycj86IChkYXRhOiBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogRXhlY3V0ZSBjb21tYW5kIGxpbmUgYnkgc3Bhd24uXG4gKiBjYWxsIHNwYXduLiBpZiBlcnJvciBvY2N1cmVkLCBjdWkgaXMga2lsbGVkIHByb2NjZXNzLlxuICpcbiAqIEBwYXJhbSAgIHtTdHJpbmd9ICAgICAgICAgICAgICAgY29tbWFuZCAgICBtYWluIGNvbW1hbmQuIGV4KSBcImNvcmRvdmFcIlxuICogQHBhcmFtICAge1N0cmluZ1tdfSAgICAgICAgICAgICBhcmdzICAgICAgIGNvbW1hbmQgYXJncy4gZXgpIFtcInBsdWdpblwiLCBcImFkZFwiLCBwbHVnaW5OYW1lXVxuICogQHBhcmFtICAge0V4ZWNDb21tYW5kT3B0aW9uc30gICBbb3B0aW9uc10gIGNsaS1zcGlubmVyXCJzIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBlcnJvciBjb2RlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjQ29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zPzogRXhlY0NvbW1hbmRPcHRpb25zKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBvcHQ6IEV4ZWNDb21tYW5kT3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCB7XG4gICAgICAgICAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gICAgICAgICAgICBzcGlubmVyOiB7IGZvcm1hdDogXCIlc1wiIH0sXG4gICAgICAgICAgICBzdGRvdXQ6IChkYXRhOiBzdHJpbmcpOiB2b2lkID0+IHsgLyogbm9vcCAqLyB9LFxuICAgICAgICAgICAgc3RkZXJyOiAoZGF0YTogc3RyaW5nKTogdm9pZCA9PiB7IC8qIG5vb3AgKi8gfSxcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gb24gd2luMzIsIGNvbW1hbmQgYW5kIGFyZ3MgbmVlZCB0byBiZSBxdW90ZWQgaWYgY29udGFpbmluZyBzcGFjZXNcbiAgICAgICAgY29uc3QgcXVvdGVJZk5lZWRlZCA9IChzdHI6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgICAgICAgICBpZiAoXCJ3aW4zMlwiID09PSBvcy5wbGF0Zm9ybSgpICYmIHN0ci5pbmNsdWRlcyhcIiBcIikpIHtcbiAgICAgICAgICAgICAgICBzdHIgPSBcIlxcXCJcIiArIHN0ciArIFwiXFxcIlwiO1xuICAgICAgICAgICAgICAgIG9wdC5zaGVsbCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgICB9O1xuXG4gICAgICAgIHdoaWNoKGNvbW1hbmQsIChlcnJvciwgcmVzb2x2ZWRDb21tYW5kKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihKU09OLnN0cmluZ2lmeShlcnJvcikpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzcGlubmVyID0gb3B0LnNwaW5uZXIgPyBnZXRTcGlubmVyKG9wdC5zcGlubmVyLmZvcm1hdCwgb3B0LnNwaW5uZXIuaW5kZXgpIDogbnVsbDtcbiAgICAgICAgICAgIGlmIChzcGlubmVyKSB7XG4gICAgICAgICAgICAgICAgc3Bpbm5lci5zdGFydCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlZENvbW1hbmQgPSBxdW90ZUlmTmVlZGVkKHJlc29sdmVkQ29tbWFuZCk7XG4gICAgICAgICAgICBhcmdzID0gYXJncy5tYXAocXVvdGVJZk5lZWRlZCk7XG4gICAgICAgICAgICBjb25zdCBjaGlsZCA9IHNwYXduKHJlc29sdmVkQ29tbWFuZCwgYXJncywgb3B0KVxuICAgICAgICAgICAgICAgIC5vbihcImVycm9yXCIsIGhhbmRsZUVycm9yKVxuICAgICAgICAgICAgICAgIC5vbihcImNsb3NlXCIsIChjb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGlubmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGlubmVyLnN0b3AodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjb2RlKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKFwicGlwZVwiID09PSBvcHQuc3RkaW8pIHtcbiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oXCJkYXRhXCIsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG9wdC5zdGRvdXQoZGF0YS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oXCJkYXRhXCIsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG9wdC5zdGRlcnIoZGF0YS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vXG5cbi8qKlxuICogQGludGVyZmFjZSBDb3B5VGVtcGxhdGVPcHRpb25zXG4gKiBAYnJpZWYgY29weVRwbCgpIOOBq+aMh+WumuOBmeOCi+OCquODl+OCt+ODp+ODs1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcHlUZW1wbGF0ZU9wdGlvbnMgZXh0ZW5kcyBOb3JtYWxpemVUZXh0T3B0aW9ucyB7XG4gICAgZGVsaW1pdGVycz86IFwie3sgfX1cIiB8IFwiPCUgJT5cIjsgLy8gdGVtcGxhdGUg44Gr5L2/55So44GZ44KLIGRlbGltaXRlci4gZGVmYXVsdDogXCJ7eyB9fVwiXG59XG5cbi8qKlxuICogQ29weSB0ZW1wbGF0ZSB3aXRoIGhvZ2FuLlxuICogc3luYyBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSAgICAgICAgICAgICAgIHNyYyAgICAgICBzb3VyY2UgZmlsZSBwYXRoLlxuICogQHBhcmFtIHtTdHJpbmd9ICAgICAgICAgICAgICAgZHN0ICAgICAgIGRlc3RpbmF0aW9uIGZpbGUgcGF0aC5cbiAqIEBwYXJhbSB7T2JqZWN0fSAgICAgICAgICAgICAgIHBhcmFtcyAgICB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLlxuICogQHBhcmFtIHtDb3B5VGVtcGxhdGVPcHRpb25zfSAgW29wdGlvbnNdIG9wdGlvbnMgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weVRwbChzcmM6IHN0cmluZywgZHN0OiBzdHJpbmcsIHBhcmFtczogT2JqZWN0LCBvcHRpb25zPzogQ29weVRlbXBsYXRlT3B0aW9ucyk6IHZvaWQge1xuICAgIGNvbnN0IG9wdCA9ICQuZXh0ZW5kKHt9LCB7XG4gICAgICAgIGVvbDogb3MuRU9MLFxuICAgICAgICBib206IHRydWUsXG4gICAgICAgIGRlbGltaXRlcnM6IFwie3sgfX1cIixcbiAgICB9LCBvcHRpb25zKTtcblxuICAgIGNvbnN0IGpzdCA9IGhvZ2FuLmNvbXBpbGUobm9ybWFsaXplVGV4dChmcy5yZWFkRmlsZVN5bmMoc3JjKS50b1N0cmluZygpLCB7IGVvbDogXCJcXG5cIiwgYm9tOiBmYWxzZSB9KSwgb3B0KTtcbiAgICBjb25zdCBvdXRwdXQgPSBub3JtYWxpemVUZXh0KGpzdC5yZW5kZXIocGFyYW1zKSwgb3B0KTtcblxuICAgIGZzLmVuc3VyZUZpbGVTeW5jKGRzdCk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhkc3QsIG91dHB1dCwgXCJ1dGY4XCIpO1xufVxuXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vL1xuXG4vKipcbiAqIEdVSUQgZ2VuZXJhdGUuXG4gKiByZXR1cm5lZCBhcyBXaW5kb3dzIHJlZ2lzdHJ5IHR5cGUgZm9ybWF0LlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUdVSUQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ7XCIgKyB1dWlkLnY0KCkudG9VcHBlckNhc2UoKSArIFwifVwiO1xufVxuXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vL1xuXG4vKipcbiAqIENyZWF0ZSBYTUwgRE9NIG5vZGUuXG4gKlxuICogQHBhcmFtICAgc3RyICBzdHJpbmcgeG1sIGZvcm1hdC4gZXgpICc8cHJlZmVyZW5jZSBuYW1lPVwiRGlzYWxsb3dPdmVyc2Nyb2xsXCIgdmFsdWU9XCJ0cnVlXCIvPidcbiAqIEByZXR1cm5zIFhNTCBOb2RlIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHIyWG1sTm9kZShzdHI6IHN0cmluZyk6IEpRdWVyeSB7XG4gICAgbGV0IGZ1bGxYTUwgPSB0cnVlO1xuICAgIGlmICghLzw/eG1sL2kudGVzdChzdHIpKSB7XG4gICAgICAgIGZ1bGxYTUwgPSBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgJHhtbCA9ICQoJC5wYXJzZVhNTChzdHIpKTtcbiAgICByZXR1cm4gZnVsbFhNTCA/ICR4bWwgOiAkeG1sLmNoaWxkcmVuKCk7XG59XG5cbi8qKlxuICogQ3JlYXRlIFhNTCBzdHJpbmcgZnJvbSBET00gbm9kZS5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHN0ciAgc3RyaW5nIHhtbCBmb3JtYXQuIGV4KSAnPHByZWZlcmVuY2UgbmFtZT1cIkRpc2FsbG93T3ZlcnNjcm9sbFwiIHZhbHVlPVwidHJ1ZVwiLz4nXG4gKiBAcmV0dXJuIHtqUXVlcnl9IFhNTCBOb2RlIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB4bWxOb2RlMlN0cigkeG1sOiBKUXVlcnkpOiBzdHJpbmcge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgcmV0dXJuIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoJHhtbFswXSk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby11bmRlZiAqL1xufVxuXG4vKipcbiAqIEBpbnRlcmZhY2UgRm9ybWF0WG1sT3B0aW9uc1xuICogQGJyaWVmIGZvcm1hdFhNTCgpIOOBq+aMh+WumuOBmeOCi+OCquODl+OCt+ODp+ODs1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdFhtbE9wdGlvbnMgZXh0ZW5kcyBOb3JtYWxpemVUZXh0T3B0aW9ucyB7XG4gICAgc3RlcD86IG51bWJlcjsgICAvLyDnqbrnmb3jgrnjg5rjg7zjgrnmlbAuIGRlZmF1bHQ6IDJcbn1cblxuLyoqXG4gKiBYTUwgZm9ybWF0dGVyLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIHN0ciAgICAgICBzdHJpbmcgeG1sIGZvcm1hdC4gZXgpICc8cHJlZmVyZW5jZSBuYW1lPVwiRGlzYWxsb3dPdmVyc2Nyb2xsXCIgdmFsdWU9XCJ0cnVlXCIvPidcbiAqIEBwYXJhbSAge0Zvcm1hdFhtbE9wdGlvbnN9IFtvcHRpb25zXSBvcHRpb25zIG9iamVjdC5cbiAqIEByZXR1cm4ge1N0cmluZ30gZm9ybWF0dGVkIFhNTFxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0WE1MKHN0cjogc3RyaW5nLCBvcHRpb25zPzogRm9ybWF0WG1sT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3Qgb3B0OiBGb3JtYXRYbWxPcHRpb25zID0gJC5leHRlbmQoe30sIHtcbiAgICAgICAgZW9sOiBvcy5FT0wsXG4gICAgICAgIGJvbTogdHJ1ZSxcbiAgICAgICAgc3RlcDogMixcbiAgICB9LCBvcHRpb25zKTtcbiAgICBsZXQgeG1sID0gXCJcIjtcbiAgICBsZXQgcGFkID0gMDtcbiAgICBsZXQgaW5kZW50OiBudW1iZXI7XG4gICAgbGV0IG5vZGU6IHN0cmluZztcblxuICAgIGNvbnN0IHN0ckFyciA9IG5vcm1hbGl6ZVRleHQoc3RyLCB7IGVvbDogXCJcXG5cIiB9KVxuICAgICAgICAucmVwbGFjZSgvKD4pKDwpKFxcLyopL2csIFwiJDFcXG4kMiQzXCIpIC8vIGluc2VydCBMRiB0byBlYWNoIG5vZGUgb25jZS5cbiAgICAgICAgLnNwbGl0KFwiXFxuXCIpO1xuXG4gICAgY29uc3Qgc3BhY2VzID0gKGxlbjogbnVtYmVyKSA9PiB7XG4gICAgICAgIGxldCBzID0gXCJcIjtcbiAgICAgICAgY29uc3QgX2luZGVudCA9IGxlbiAqIG9wdC5zdGVwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IF9pbmRlbnQ7IGkrKykge1xuICAgICAgICAgICAgcyArPSBcIiBcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcztcbiAgICB9O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJBcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaW5kZW50ID0gMDtcbiAgICAgICAgbm9kZSA9ICQudHJpbShzdHJBcnJbaV0pO1xuICAgICAgICBpZiAobm9kZS5tYXRjaCgvLis8XFwvXFx3W14+XSo+JC8pKSB7XG4gICAgICAgICAgICBpbmRlbnQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUubWF0Y2goL148XFwvXFx3LykpIHtcbiAgICAgICAgICAgIGlmIChwYWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgcGFkIC09IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5tYXRjaCgvXjxcXHdbXj5dKlteL10+LiokLykpIHtcbiAgICAgICAgICAgIGluZGVudCA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbmRlbnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHhtbCArPSBzcGFjZXMocGFkKSArIG5vZGUgKyBcIlxcblwiO1xuICAgICAgICBwYWQgKz0gaW5kZW50O1xuICAgIH1cblxuICAgIHhtbCA9IHhtbFxuICAgICAgICAucmVwbGFjZSgvXFxuXFxuL2dtLCBcIlxcblwiKVxuICAgICAgICAucmVwbGFjZSgvXiArXFxuL2dtLCBcIlwiKVxuICAgICAgICA7XG5cbiAgICByZXR1cm4gbm9ybWFsaXplVGV4dCh4bWwsIG9wdCk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vc3JjL3V0aWxzL3Rvb2xzLnRzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2hpbGRfcHJvY2Vzc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcImNoaWxkX3Byb2Nlc3NcIlxuLy8gbW9kdWxlIGlkID0gMzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSBcIi4uL3V0aWxzL3NldHRpbmdzXCI7XG5cbmltcG9ydCB7IEdlbmVyYXRvckJhc2UsIElQcm9qZWN0Q29uZmlncmF0aW9uIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgbmV3R2VuZXJhdG9yTGlicmFyeSB9IGZyb20gXCIuL2xpYnJhcnlcIjtcbmltcG9ydCB7IG5ld0dlbmVyYXRvck1vYmlsZSB9IGZyb20gXCIuL21vYmlsZVwiO1xuaW1wb3J0IHsgbmV3R2VuZXJhdG9yRGVza3RvcCB9IGZyb20gXCIuL2Rlc2t0b3BcIjtcbmltcG9ydCB7IG5ld0dlbmVyYXRvcldlYiB9IGZyb20gXCIuL3dlYlwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9iYXNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9saWJyYXJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2JpbGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Rlc2t0b3BcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dlYlwiO1xuXG4vKipcbiAqIGdlbmVyYXRvciDnlJ/miJDplqLmlbBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5ld0dlbmVyYXRvcihjb25maWc6IElQcm9qZWN0Q29uZmlncmF0aW9uKTogR2VuZXJhdG9yQmFzZSB7XG4gICAgc3dpdGNoIChjb25maWcucHJvamVjdFR5cGUpIHtcbiAgICAgICAgY2FzZSBcImxpYnJhcnlcIjpcbiAgICAgICAgICAgIHJldHVybiBuZXdHZW5lcmF0b3JMaWJyYXJ5KGNvbmZpZyk7XG4gICAgICAgIGNhc2UgXCJtb2JpbGVcIjpcbiAgICAgICAgICAgIHJldHVybiBuZXdHZW5lcmF0b3JNb2JpbGUoY29uZmlnKTtcbiAgICAgICAgY2FzZSBcImRlc2t0b3BcIjpcbiAgICAgICAgICAgIHJldHVybiBuZXdHZW5lcmF0b3JEZXNrdG9wKGNvbmZpZyk7XG4gICAgICAgIGNhc2UgXCJ3ZWJcIjpcbiAgICAgICAgICAgIHJldHVybiBuZXdHZW5lcmF0b3JXZWIoY29uZmlnKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGFzc2VydChmYWxzZSwgXCJ1bnN1cHBvcnRlZCBwcm9qZWN0IGtpbmQ6IFwiICsgY29uZmlnLnByb2plY3RUeXBlKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi9zcmMvZ2VuZXJhdG9ycy9pbmRleC50cyIsImltcG9ydCAqIGFzIFV0aWxzIGZyb20gXCIuLi8uLi91dGlsc1wiO1xuZXhwb3J0IHsgVXRpbHMgfTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIElTb3VyY2VEaXJjdG9yeUNvbmZpZ3JhdGlvblxuICogQGJyaWVmIOOCveODvOOCueODh+OCo+ODrOOCr+ODiOODquOBruOCs+ODs+ODleOCo+OCruODpeODrOODvOOCt+ODp+ODs+ioreWumlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElTb3VyY2VEaXJjdG9yeUNvbmZpZ3JhdGlvbiB7XG4gICAgc2NyaXB0Pzogc3RyaW5nOyAgICAgICAgICAgIC8vIGpzKHRzKSDjg5XjgqHjgqTjg6vkv53lrZjlhYhcbiAgICBzdHlsZXNoZWV0Pzogc3RyaW5nOyAgICAgICAgLy8gY3NzKGNzcykg44OV44Kh44Kk44Or5L+d5a2Y5YWIXG4gICAgdGVtcGxhdGU/OiBzdHJpbmc7ICAgICAgICAgIC8vIGh0bWwodGVtcGxhdGUpIOODleOCoeOCpOODq+S/neWtmOWFiFxufVxuXG4vKipcbiAqIEBpbnRlcmZhY2UgSUJhc2VTdHJ1Y3R1cmVDb25maWdyYXRpb25cbiAqIEBicmllZiDjg5fjg63jgrjjgqfjgq/jg4jjg4fjgqPjg6zjgq/jg4jjg6rjga7jgrPjg7Pjg5XjgqPjgq7jg6Xjg6zjg7zjgrfjg6fjg7PoqK3lrppcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbiB7XG4gICAgc3JjPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDjgr3jg7zjgrnjgrPjg7zjg4njga7jg6vjg7zjg4jjg4fjgqPjg6zjgq/jg4jjg6rlkI1cbiAgICBwa2c/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOODkeODg+OCseODvOOCuOWFiOODh+OCo+ODrOOCr+ODiOODquWQjVxuICAgIGJ1aWx0Pzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g44Kz44Oz44OR44Kk44Or5YWI44OH44Kj44Os44Kv44OI44Oq5ZCNXG4gICAgZG9jPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDjg4njgq3jg6Xjg6Hjg7Pjg4jjg4fjgqPjg6zjgq/jg4jjg6rlkI1cbiAgICB0YXNrPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOOCv+OCueOCr+ODh+OCo+ODrOOCr+ODiOODquWQjVxuICAgIHRlc3Q/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g44OG44K544OI44OH44Kj44Os44Kv44OI44Oq5ZCNXG4gICAgdHlwZXM/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUeXBlU2NyaXB0IOWei+Wumue+qeODh+OCo+ODrOOCr+ODiOODquWQjVxuICAgIHRlbXA/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5L2c5qWt44OH44Kj44Os44Kv44OI44Oq5ZCNXG4gICAgc3JjQ29uZmlnPzogSVNvdXJjZURpcmN0b3J5Q29uZmlncmF0aW9uOyAgICAvLyBJU291cmNlRGlyY3RvcnlDb25maWdyYXRpb25cbiAgICBsaWI/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVybmFsIGxpYnJhcnkgbW9kdWxlIOODh+OCo+ODrOOCr+ODiOODquWQjVxuICAgIGV4dGVybmFsPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZXJuYWwgbW9kdWxlIOODh+OCo+ODrOOCr+ODiOODquWQjVxuICAgIHBvcnRpbmc/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9ydGluZyBtb2R1bGUg44OH44Kj44Os44Kv44OI44Oq5ZCNXG4gICAgcmVzPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDjg6rjgr3jg7zjgrnjg4fjgqPjg6zjgq/jg4jjg6rlkI1cbn1cblxuLyoqXG4gKiBAaW50ZXJmYWNlIElEZXBlbmRlbmN5XG4gKiBAYnJpZWYgcGFja2FnZS5qc29uIOOBq+aMh+WumuOBmeOCiyBkZXBlbmRlbmNpZXMg5oOF5aCx44KS5qC857SN44GZ44KL44Kk44Oz44K/44O844OV44Kn44Kk44K5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURlcGVuZGVuY3kge1xuICAgIG5hbWU6IHN0cmluZzsgICAgICAgICAgIC8vIG1vZHVsZSBuYW1lIGV4KSBcInR5cGVzY3JpcHRcIlxuICAgIHZlcnNpb24/OiBzdHJpbmc7ICAgICAgIC8vIOaMh+WumuODkOODvOOCuOODp+ODsy4g54Sh5oyH5a6a44Gu5aC05ZCI44Gv5pyA5paw44OQ44O844K444On44OzXG4gICAgZXM/OiBzdHJpbmdbXTsgICAgICAgICAgLy8g5oyH5a6a44GV44KM44GfIEVTIHZlcnNpb24g44Gu44Go44GN44Gu44G/5pyJ5Yq544Gr44GZ44KLXG4gICAgZ2xvYmFsRXhwb3J0Pzogc3RyaW5nOyAgLy8gZ2xvYmFsIGV4cG9ydCDjgpLlv4XopoHjgajjgZnjgovjgoLjga7jga8gZ2xvYmFsIE9iamVjdCDlkI3jgpLmjIflrppcbiAgICBhbGlhcz86IHN0cmluZzsgICAgICAgICAvLyBhbGlhcyDjgpLoqK3lrprjgZnjgovloLTlkIjjgavmjIflrppcbiAgICB2ZW5kZXJOYW1lPzogc3RyaW5nOyAgICAvLyB2ZW5kZXIg5ZCN44KS6Kit5a6a44GZ44KL5aC05ZCI44Gr5oyH5a6aXG4gICAgZmlsZU5hbWU/OiBzdHJpbmc7ICAgICAgLy8gZmlsZSDlkI3jgpLoqK3lrprjgZnjgovloLTlkIjjgavmjIflrppcbn1cblxuLyoqXG4gKiBAaW50ZXJmYWNlIElQcm9qZWN0Q29uZmlncmF0aW9uXG4gKiBAYnJpZWYg44OX44Ot44K444Kn44Kv44OI5YWx6YCa44Gu44Kz44Oz44OV44Kj44Ku44Ol44Os44O844K344On44Oz6Kit5a6aXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVByb2plY3RDb25maWdyYXRpb24ge1xuICAgIHByb2plY3ROYW1lOiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOODl+ODreOCuOOCp+OCr+ODiOWQjSBleCkgXCJjZHAtbGliXCJcbiAgICBwcm9qZWN0VHlwZTogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDjg5fjg63jgrjjgqfjgq/jg4jnqK7poZ4gZXgpIFwibGlicmFyeVwiXG4gICAgYWN0aW9uOiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXgpIFwiY3JlYXRlXCJcbiAgICB2ZXJzaW9uOiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDjg5Djg7zjgrjjg6fjg7MgZXgpIFwiMS4wLjBcIlxuICAgIGxpY2Vuc2U6IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOODqeOCpOOCu+ODs+OCuSBleCkgXCJBcGFjaGUtMi4wXCJcbiAgICBwcml2YXRlPzogYm9vbGVhbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcml2YXRlIOODkeODg+OCseODvOOCuOOBruWgtOWQiCB0cnVlXG4gICAgc2V0dGluZ3M6IFV0aWxzLklHbG9iYWxTZXR0aW5nczsgICAgICAgICAgICAgICAgLy8g44Ot44Kw44Kq44OX44K344On44OzXG4gICAgbW9kdWxlTmFtZT86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wb3J0IOOBq+aMh+WumuOBmeOCiyDjg6Ljgrjjg6Xjg7zjg6vlkI0gZXgpIFwiY2RwLWxpYlwiXG4gICAgbWFpbkJhc2VOYW1lPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g44Oh44Kk44Oz44OV44Kh44Kk44Or5ZCNIGV4KSBcImNkcC1saWJcIiAvIFwiaW5kZXhcIlxuICAgIG5hbWVzcGFjZT86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOODq+ODvOODiOWQjeWJjeepuumWk1xuICAgIHN0cnVjdHVyZUNvbmZpZz86IElCYXNlU3RydWN0dXJlQ29uZmlncmF0aW9uOyAgIC8vIElCYXNlU3RydWN0dXJlQ29uZmlncmF0aW9uXG4gICAgY29weXJpZ2h0Pzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g44Kz44OU44O844Op44Kk44OI5paH5a2X5YiXIGV4KSBcIkNvcHlyaWdodCAoYykgMjAxNyBTb255IENvcnBvcmF0aW9uXCJcbiAgICBkZXZEZXBlbmRlbmNpZXM/OiBJRGVwZW5kZW5jeVtdOyAgICAgICAgICAgICAgICAvLyDplovnmbrnlKjkvp3lrZjjg6Ljgrjjg6Xjg7zjg6vmg4XloLFcbn1cblxuLyoqXG4gKiBAaW50ZXJmYWNlIElCdWlsZFRhcmdldENvbmZpZ3JhdGlvblxuICogQGJyaWVmIOODk+ODq+ODieOCv+ODvOOCsuODg+ODiOOCs+ODs+ODleOCo+OCruODpeODrOODvOOCt+ODp+ODs+ioreWumlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElCdWlsZFRhcmdldENvbmZpZ3JhdGlvbiB7XG4gICAgZXM/OiBcImVzNVwiIHwgXCJlczIwMTVcIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGVTY3JpcHQg44GuIHRyYW5zcGlsZSB0YXJnZXRcbiAgICBtb2R1bGU/OiBcIm5vbmVcIiB8IFwiY29tbW9uanNcIiB8IFwiYW1kXCIgfCBcInVtZFwiOyAgICAgICAgICAgICAgIC8vIEphdmFTY3JpcHQgbW9kdWxlIHN5c3RlbVxuICAgIGVudj86IFwid2ViXCIgfCBcIm5vZGVcIiB8IFwiZWxlY3Ryb25cIiB8IFwiZWxlY3Ryb24tcmVuZGVyZXJcIjsgICAgLy8g5a6f6KGM55Kw5aKD44GuIHRhcmdldFxuICAgIG5vZGVqcz86IGJvb2xlYW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFwibm9kZVwiIHwgXCJlbGVjdHJvblwiIOOBruWgtOWQiOOBqyB0cnVlXG4gICAgbWluaWZ5PzogYm9vbGVhbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g44Oq44Oq44O844K55pmC44GrIG1pbmlmeSDjgZnjgovloLTlkIjjga8gdHJ1ZVxuICAgIC8vIGJ1aWxkIHRvb2xcbiAgICB0b29scz86IHN0cmluZ1tdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDml6Llrprjga4gYnVpbGQgdG9vbCBleCkgW1wid2VicGFja1wiXVxuICAgIG91dHB1dFNhbWVEaXI/OiBib29sZWFuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYyDjgaggYnVpbHQg44GM5ZCM44GY44OH44Kj44Os44Kv44OI44Oq44Gr44Gq44KL5aC05ZCIIHRydWVcbn1cblxuLyoqXG4gKiBAaW50ZXJmYWNlIElXZWJwYWNrQ29uZmlncmF0aW9uXG4gKiBAYnJpZWYgV2VicGFjayDnlKjjgrPjg7Pjg5XjgqPjgq7jg6Xjg6zjg7zjgrfjg6fjg7PoqK3lrppcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJV2VicGFja0NvbmZpZ3JhdGlvbiB7XG4gICAgbm9kZWpzOiBib29sZWFuOyAgICAvLyBcIm5vZGVcIiB8IFwiZWxlY3Ryb25cIiDjga7loLTlkIjjgasgdHJ1ZVxuICAgIGd1aWRlOiBib29sZWFuOyAgICAgLy8gZ3VpZGUg44Kz44Oh44Oz44OI44KS5LuY5Yqg44GZ44KL5aC05ZCI44GvIHRydWUg44KS5oyH5a6aXG4gICAgdGFza1BhdGg6IHN0cmluZzsgICAvLyAndGFzaycg44OH44Kj44Os44Kv44OI44Oq5ZCNXG59XG5cbi8qKlxuICogQGludGVyZmFjZSBJVmlzdWFsU3R1ZGlvQ29uZmlncmF0aW9uXG4gKiBAYnJpZWYgVmlzdWFsIFN0dWRpbyDnlKjjgrPjg7Pjg5XjgqPjgq7jg6Xjg6zjg7zjgrfjg6fjg7PoqK3lrppcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVmlzdWFsU3R1ZGlvQ29uZmlncmF0aW9uIGV4dGVuZHMgSUJhc2VTdHJ1Y3R1cmVDb25maWdyYXRpb24ge1xuICAgIHByb2plY3ROYW1lOiBzdHJpbmc7ICAgICAgICAvLyDjg5fjg63jgrjjgqfjgq/jg4jlkI0gZXgpIFwiY2RwLWxpYlwiXG4gICAgcHJvamVjdEdVSUQ6IHN0cmluZzsgICAgICAgIC8vIOODl+ODreOCuOOCp+OCr+ODiCBHVUlEIGV4KSB7NTFCNDEzNTktOEQyQy00MkRGLTg0MTQtRTg1QjAyOTkzMjM4fVxuICAgIG1haW5CYXNlTmFtZTogc3RyaW5nOyAgICAgICAvLyDjg6HjgqTjg7Pjg5XjgqHjgqTjg6vlkI0gZXgpIFwiY2RwLWxpYlwiIC8gaW5kZXhcbiAgICBsaWNlbnNlOiBib29sZWFuOyAgICAgICAgICAgLy8gTElDRU5TRSDjgpLov73liqDjgZnjgovloLTlkIjjga8gdHJ1ZVxuICAgIHdlYnBhY2s6IGJvb2xlYW47ICAgICAgICAgICAvLyB3ZWJwYWNrLmNvbmZpZy5qcyDjgpLov73liqDjgZnjgovloLTlkIjjga8gdHJ1ZVxuICAgIHRlc3RlbTogYm9vbGVhbjsgICAgICAgICAgICAvLyB0ZXN0ZW0gcnVubmVyIOOCkui/veWKoOOBmeOCi+WgtOWQiOOBryB0cnVlXG4gICAgb3V0cHV0U2FtZURpcjogYm9vbGVhbjsgICAgIC8vIHNyYyDjgaggYnVpbHQg44GM5ZCM44GY44OH44Kj44Os44Kv44OI44Oq44Gr44Gq44KL5aC05ZCIIHRydWVcbiAgICB0c0dyb3VwOiB7XG4gICAgICAgIHJlbGF0aXZlUGF0aDogc3RyaW5nOyAgIC8vIFwiaG9nZWhvZ2VcXFwiXG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7ICAgICAgIC8vIFwiY2RwLWxpYlwiXG4gICAgICAgIGRlcGVuZGVlOiBib29sZWFuOyAgICAgIC8vIOS+neWtmOWFiOOCkui/veWKoOOBmeOCi+WgtOWQiCB0cnVlXG4gICAgICAgIG1hcDogYm9vbGVhbjsgICAgICAgICAgIC8vIC5tYXAg44OV44Kh44Kk44Or44GM44GC44KL5aC05ZCIIHRydWVcbiAgICB9W107XG4gICAganNHcm91cDoge1xuICAgICAgICByZWxhdGl2ZVBhdGg6IHN0cmluZzsgICAvLyBcImhvZ2Vob2dlXFxcIlxuICAgICAgICBmaWxlTmFtZTogc3RyaW5nOyAgICAgICAvLyBcImNkcC1saWJcIlxuICAgICAgICBkZXBlbmRlZTogYm9vbGVhbjsgICAgICAvLyDkvp3lrZjlhYjjgpLov73liqDjgZnjgovloLTlkIggdHJ1ZVxuICAgICAgICBkX3RzOiBib29sZWFuOyAgICAgICAgICAvLyAuZC50cyDjg5XjgqHjgqTjg6vjgYzjgYLjgovloLTlkIggdHJ1ZVxuICAgICAgICBtYXA6IGJvb2xlYW47ICAgICAgICAgICAvLyAubWFwIOODleOCoeOCpOODq+OBjOOBguOCi+WgtOWQiCB0cnVlXG4gICAgICAgIG1pbl9tYXA6IGJvb2xlYW47ICAgICAgIC8vIC5taW4gLm1hcCDjg5XjgqHjgqTjg6vjgYzjgYLjgovloLTlkIggdHJ1ZVxuICAgIH1bXTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi8uLi9zcmMvZ2VuZXJhdG9ycy9iYXNlL2ludGVyZmFjZXMudHMiLCJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQge1xuICAgIGZzLFxuICAgIGdsb2IsXG4gICAgY2hhbGssXG4gICAgXyxcbiAgICAkLFxuICAgIC8vLy9cbiAgICBleGVjQ29tbWFuZCxcbiAgICBnZXRTcGlubmVyLFxuICAgIGdldFRhcmdldERpcixcbiAgICB0ZW1wbGF0ZVBhdGgsXG4gICAgY29weVRwbCxcbiAgICBsb2csXG4gICAgZGVidWcsXG4gICAgdHJhbnNsYXRlLFxufSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcblxuaW1wb3J0IHtcbiAgICBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbixcbiAgICBJRGVwZW5kZW5jeSxcbiAgICBJUHJvamVjdENvbmZpZ3JhdGlvbixcbiAgICBJQnVpbGRUYXJnZXRDb25maWdyYXRpb24sXG4gICAgSVdlYnBhY2tDb25maWdyYXRpb24sXG59IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcblxuLyoqXG4gKiBAY2xhc3MgR2VuZXJhdG9yQmFzZVxuICogQGJyaWVmIOOBmeOBueOBpuOBriBHZW5lcmF0b3Ig44Gu5pei5a6a44Kv44Op44K5XG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBHZW5lcmF0b3JCYXNlIHtcblxuICAgIHByaXZhdGUgX3Byb2plY3RSb290RGlyOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogQHBhcmFtIHtJUHJvamVjdENvbmZpZ3JhdGlvbn0gY29uZmlnIOOCs+ODs+ODleOCo+OCsFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfY29uZmlnOiBJUHJvamVjdENvbmZpZ3JhdGlvbikge1xuICAgICAgICB0aGlzLl9wcm9qZWN0Um9vdERpciA9IGdldFRhcmdldERpcigpID9cbiAgICAgICAgICAgIGdldFRhcmdldERpcigpIDpcbiAgICAgICAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCB0aGlzLl9jb25maWcucHJvamVjdE5hbWUpO1xuXG4gICAgICAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcgPSAkLmV4dGVuZCh7fSwgdGhpcy5kZWZhdWx0QmFzZVN0cnVjdHVyZSgpLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnKTtcblxuICAgICAgICB0aGlzLl9jb25maWcucHJpdmF0ZSA9IFwiTk9ORVwiID09PSB0aGlzLl9jb25maWcubGljZW5zZTtcblxuICAgICAgICAoPElCdWlsZFRhcmdldENvbmZpZ3JhdGlvbj50aGlzLl9jb25maWcpLm91dHB1dFNhbWVEaXJcbiAgICAgICAgICAgID0gdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMgPT09IHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuYnVpbHQ7XG5cbiAgICAgICAgKDxJQnVpbGRUYXJnZXRDb25maWdyYXRpb24+dGhpcy5fY29uZmlnKS5ub2RlanMgPSAoKGVudjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGVudikge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJub2RlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImVsZWN0cm9uXCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKDxJQnVpbGRUYXJnZXRDb25maWdyYXRpb24+dGhpcy5fY29uZmlnKS5lbnYpO1xuXG4gICAgICAgIGRlYnVnKEpTT04uc3RyaW5naWZ5KHRoaXMuX2NvbmZpZywgbnVsbCwgNCkpO1xuICAgIH1cblxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gcHViaWMgbWV0aG9kczpcblxuICAgIC8qKlxuICAgICAqIOWHpueQhumWi+WniyAo44Ko44Oz44OI44OqKVxuICAgICAqXG4gICAgICovXG4gICAgcHVibGljIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgc3dpdGNoICh0aGlzLl9jb25maWcuYWN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIFwiY3JlYXRlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucnVuQ3JlYXRlKCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcInVua25vd24gYWN0aW9uOiBcIiArIHRoaXMuX2NvbmZpZy5hY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBhYnN0cmFjdCBtZXRob2RzOlxuXG4gICAgLy8g5pei5a6a44GuIGRpcmVjdG9yeSDmp4vpgKDjgpLov5TljbRcbiAgICBhYnN0cmFjdCBkZWZhdWx0QmFzZVN0cnVjdHVyZSgpOiBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbjtcblxuICAgIC8vIGFjdGlvbjogY3JlYXRlIOOBruOBqOOBjeOBq+WRvOOBsOOCjOOCi1xuICAgIGFic3RyYWN0IGFzeW5jIGNyZWF0ZSgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLy8g5b+F6KaB44Go44GZ44KLIHRhc2sgc2NyaXB0IOS4gOimp+OCkui/lOWNtC4gYWN0aW9uOiBjcmVhdGUg44Gu44Go44GN44Gr5ZG844Gw44KM44KLXG4gICAgYWJzdHJhY3QgZ2V0IHRhc2tMaXN0KCk6IHN0cmluZ1tdO1xuXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBwcm90ZWN0ZWQgbWV0aG9kczpcblxuICAgIC8qKlxuICAgICAqIOmAsuaNl+ODhuOCreOCueODiOOCkumAmuefpVxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSDjg63jg7zjgqvjg6njgqTjgrrjg6rjgr3jg7zjgrnjgq3jg7zjgpLmjIflrppcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcHJvZ3Jlc3Moa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgbG9nKGNoYWxrLmN5YW4odHJhbnNsYXRlKGtleSkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorablkYrjg4bjgq3jgrnjg4jjgpLpgJrnn6VcbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkg44Ot44O844Kr44Op44Kk44K644Oq44K944O844K544Kt44O844KS5oyH5a6aXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHdhcm4oa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgbG9nKGNoYWxrLnllbGxvdyh0cmFuc2xhdGUoa2V5KSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHdvcmsgZGlyZWN0b3J5IOOBruWkieabtFxuICAgICAqXG4gICAgICogQHBhcmFtIGRpcmVjdG9yeSB0YXJnZXQgZGlyZWN0b3J5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjaGRpcihkaXJlY3Rvcnk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBwcm9jZXNzLmNoZGlyKGRpcmVjdG9yeSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcHJvamVjdCByb290IGRpcmVjdG9yeSDjga7lj5blvpdcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkaXJlY3RvcnkgdGFyZ2V0IGRpcmVjdG9yeS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IHJvb3REaXIoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2plY3RSb290RGlyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRlbXBsYXRlIGRpcmVjdG9yeSDjgpLmjIflrprjgZfjgabphY3kuIvjga7jg5XjgqHjgqTjg6vjgpLjgrPjg5Tjg7xcbiAgICAgKiBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbiDjga7oqK3lrprjgYzlj43mmKDjgZXjgozjgotcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0YXJnZXQgIOOCv+ODvOOCsuODg+ODiOOCkuaMh+Wumi4gbnVsbCDjga7loLTlkIjjga/jgIF0ZW1wbGF0ZXMg44KS6L+U5Y20XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRzdFJvb3Qg44Kz44OU44O85YWI44KS5oyH5a6aLiDmjIflrprjgYznhKHjgYTloLTlkIjjga8gcm9vdERpciDjgYzoqK3lrppcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29weVRwbERpcih0YXJnZXQ6IHN0cmluZywgZHN0Um9vdD86IHN0cmluZywgb3B0aW9ucz86IGdsb2IuSU9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgZHN0Um9vdCA9IGRzdFJvb3QgfHwgdGhpcy5yb290RGlyO1xuICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe1xuICAgICAgICAgICAgY3dkOiB0ZW1wbGF0ZVBhdGgodGFyZ2V0KSxcbiAgICAgICAgICAgIG5vZGlyOiB0cnVlLFxuICAgICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICBnbG9iLnN5bmMoXCIqKlwiLCBvcHRpb25zKVxuICAgICAgICAgICAgLmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkc3QgPSBwYXRoLmpvaW4oZHN0Um9vdCxcbiAgICAgICAgICAgICAgICAgICAgZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL3NyYy8sICAgICB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9wa2cvLCAgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5wa2cpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvYnVpbHQvLCAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuYnVpbHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvZG9jLywgICAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuZG9jKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL3Rhc2svLCAgICB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnRhc2spXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvdGVzdC8sICAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcudGVzdClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC90eXBlcy8sICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50eXBlcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC90ZW1wXFwvLywgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50ZW1wICsgXCIvXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvbGliLywgICAgICAgICB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLmxpYiB8fCBcImxpYlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL2V4dGVybmFsLywgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5leHRlcm5hbCB8fCBcImV4dGVybmFsXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvcG9ydGluZy8sICAgICB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnBvcnRpbmcgfHwgXCJwb3J0aW5nXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvcmVzLywgICAgICAgICB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnJlcyB8fCBcInJlc1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgL3NjcmlwdC8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmNDb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAodGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmNDb25maWcuc2NyaXB0IHx8IFwic2NyaXB0c1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwic2NyaXB0c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvc3R5bGVzaGVldC8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmNDb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAodGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmNDb25maWcuc3R5bGVzaGVldCB8fCBcInN0eWxlc2hlZXRzXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJzdHlsZXNoZWV0c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvdGVtcGxhdGUvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjQ29uZmlnLnRlbXBsYXRlIHx8IFwidGVtcGxhdGVzXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZW1wbGF0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZnMuY29weVN5bmMocGF0aC5qb2luKHRlbXBsYXRlUGF0aCh0YXJnZXQpLCBmaWxlKSwgZHN0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbm9kZSBtb2R1bGUg44GuIHZlcnNpb24g5Y+W5b6XXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb21pc2U8c3RyaW5nPn0gdmVyc2lvbiB0ZXh0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIHF1ZXJ5Tm9kZU1vZHVsZUxhdGVzdFZlcnNpb24obmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCB2ZXJzaW9uOiBzdHJpbmc7XG4gICAgICAgICAgICBleGVjQ29tbWFuZChcIm5wbVwiLCBbXCJpbmZvXCIsIG5hbWUsIFwidmVyc2lvblwiXSwge1xuICAgICAgICAgICAgICAgIHN0ZGlvOiBcInBpcGVcIixcbiAgICAgICAgICAgICAgICBzcGlubmVyOiBudWxsLFxuICAgICAgICAgICAgICAgIHN0ZG91dDogKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gXy50cmltKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh2ZXJzaW9uKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDml6Llrprjga7plovnmbrmmYLjga7kvp3lrZjjg6Ljgrjjg6Xjg7zjg6vjg6rjgrnjg4jjga7lj5blvpdcbiAgICAgKiDlv4XopoHjgavlv5zjgZjjgabjgqrjg7zjg5Djg7zjg6njgqTjg4lcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0lEZXBlbmRlbmN5fVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXQgZGVmYXVsdERldkRlcGVuZGVuY2llcygpOiBJRGVwZW5kZW5jeVtdIHtcbiAgICAgICAgY29uc3QgYmFzZSA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogXCJjb252ZXJ0LXNvdXJjZS1tYXBcIiwgICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwiZGVsXCIsICAgICAgICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBcImVzbGludFwiLCAgICAgICAgICAgICAgIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcbiAgICAgICAgICAgIHsgbmFtZTogXCJucG0tcnVuLWFsbFwiLCAgICAgICAgICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwicGxhdG9cIiwgICAgICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBcInNvdXJjZS1tYXBcIiwgICAgICAgICAgIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcbiAgICAgICAgICAgIHsgbmFtZTogXCJ0c2xpbnRcIiwgICAgICAgICAgICAgICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwidHlwZWRvY1wiLCAgICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBcInR5cGVzY3JpcHRcIiwgICAgICAgICAgIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgbWluaWZ5ID0gW1xuICAgICAgICAgICAgeyBuYW1lOiBcInVnbGlmeS1qc1wiLCAgICB2ZXJzaW9uOiB1bmRlZmluZWQsIGVzOiBbXCJlczVcIl0sICAgIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwidWdsaWZ5LWVzXCIsICAgIHZlcnNpb246IHVuZGVmaW5lZCwgZXM6IFtcImVzMjAxNVwiXSwgfSxcbiAgICAgICAgXTtcblxuICAgICAgICBsZXQgZXh0cmEgPSBbXTtcbiAgICAgICAgaWYgKCg8SUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uPnRoaXMuX2NvbmZpZykubWluaWZ5KSB7XG4gICAgICAgICAgICBleHRyYSA9IGV4dHJhLmNvbmNhdChtaW5pZnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlVG9vbChcIndlYnBhY2tcIikpIHtcbiAgICAgICAgICAgIGV4dHJhLnB1c2goeyBuYW1lOiBcIndlYnBhY2tcIiwgICAgICAgICAgIHZlcnNpb246IHVuZGVmaW5lZCwgfSk7XG4gICAgICAgICAgICBleHRyYS5wdXNoKHsgbmFtZTogXCJzb3VyY2UtbWFwLWxvYWRlclwiLCB2ZXJzaW9uOiB1bmRlZmluZWQsIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlVG9vbChcIm55Y1wiKSkge1xuICAgICAgICAgICAgZXh0cmEucHVzaCh7IG5hbWU6IFwibnljXCIsIHZlcnNpb246IHVuZGVmaW5lZCwgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVUb29sKFwidGVzdGVtXCIpKSB7XG4gICAgICAgICAgICBleHRyYS5wdXNoKHsgbmFtZTogXCJ0ZXN0ZW1cIiwgdmVyc2lvbjogdW5kZWZpbmVkLCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZVRvb2woXCJwaGFudG9tanMtcHJlYnVpbHRcIikpIHtcbiAgICAgICAgICAgIGV4dHJhLnB1c2goeyBuYW1lOiBcInBoYW50b21qcy1wcmVidWlsdFwiLCB2ZXJzaW9uOiB1bmRlZmluZWQsIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIF8uc29ydEJ5KGJhc2UuY29uY2F0KGV4dHJhKSwgKGRlcGVuZCkgPT4gZGVwZW5kLm5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGRlcGVuZGVuY2llcyDjga4gdGVtcGxhdGUgcGFyYW1hZXRlciDjgpLlj5blvpdcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge0lEZXBlbmRlbmN5W119IGRlcGVuZGVuY2llcyDkvp3lrZjplqLkv4Ljg6rjgrnjg4hcbiAgICAgKiBAcmV0dXJuIHt7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nOyBsYXN0PzogYm9vbGVhbjsgfVtdfSDjg4bjg7Pjg5fjg6zjg7zjg4jjg5Hjg6njg6Hjg7zjgr/jgavmjIflrprjgZnjgovphY3liJdcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXN5bmMgcXVlcnlEZXBlbmRlbmNpZXNQYXJhbShkZXBlbmRlbmNpZXM6IElEZXBlbmRlbmN5W10pOiBQcm9taXNlPHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmc7IGxhc3Q/OiBib29sZWFuIH1bXT4ge1xuICAgICAgICB0aGlzLnByb2dyZXNzKFwiYmFzZS5jcmVhdGUucXVlcnlWZXJzaW9uXCIpO1xuXG4gICAgICAgIGNvbnN0IGRlcGVuZHMgPSA8eyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZzsgbGFzdD86IGJvb2xlYW47IH1bXT5kZXBlbmRlbmNpZXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGRlcGVuZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChudWxsID09IGRlcGVuZC5lcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFkZXBlbmQuZXMuZmluZCgoZXNWZXJzaW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDxJQnVpbGRUYXJnZXRDb25maWdyYXRpb24+dGhpcy5fY29uZmlnKS5lcyA9PT0gZXNWZXJzaW9uO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBkZWJ1ZyhKU09OLnN0cmluZ2lmeShkZXBlbmRzLCBudWxsLCA0KSk7XG5cbiAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSAoY29udGV4dDogYW55KTogYW55ID0+IHtcbiAgICAgICAgICAgIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2YgY29udGV4dCAmJiAhdGhpcy5fY29uZmlnLnNldHRpbmdzLnNpbGVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwaW5uZXIgPSBnZXRTcGlubmVyKGNoYWxrLnllbGxvdyhjb250ZXh0KSwgNSk7XG4gICAgICAgICAgICAgICAgc3Bpbm5lci5zdGFydCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBzcGlubmVyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5zdG9wKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gZGVwZW5kcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChudWxsID09IGRlcGVuZHNbaV0udmVyc2lvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwaW5uZXIgPSBwcm9ncmVzcyhkZXBlbmRzW2ldLm5hbWUpO1xuICAgICAgICAgICAgICAgIGRlcGVuZHNbaV0udmVyc2lvbiA9IFwiXlwiICsgYXdhaXQgdGhpcy5xdWVyeU5vZGVNb2R1bGVMYXRlc3RWZXJzaW9uKGRlcGVuZHNbaV0ubmFtZSk7XG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3Moc3Bpbm5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSA9PT0gbiAtIDEpIHtcbiAgICAgICAgICAgICAgICBkZXBlbmRzW2ldLmxhc3QgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlcGVuZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogd2VicGFjay5jb25maWcuanMg44GuIHRlbXBsYXRlIHBhcmFtYWV0ZXIg44KS5Y+W5b6XXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IGxpYnJhcnlUYXJnZXQg44Gr5oyH5a6a44GZ44KL5paH5a2X5YiXXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHF1ZXJ5V2VicGFja0xpYnJhcnlUYXJnZXQoKTogc3RyaW5nIHtcbiAgICAgICAgc3dpdGNoICgoPElCdWlsZFRhcmdldENvbmZpZ3JhdGlvbj50aGlzLl9jb25maWcpLm1vZHVsZSkge1xuICAgICAgICAgICAgY2FzZSBcImNvbW1vbmpzXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY29tbW9uanMyXCI7XG4gICAgICAgICAgICBjYXNlIFwiYW1kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiYW1kXCI7XG4gICAgICAgICAgICBjYXNlIFwidW1kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwidW1kXCI7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBlc2xpbnRyYyDjga4gZW52IOOBq+aMh+WumuOBmeOCiyB0ZW1wbGF0ZSBwYXJhbWFldGVyIOOCkuWPluW+l1xuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBlbnYg44Gr5oyH5a6a44GZ44KL44OG44Oz44OX44Os44O844OI44OR44Op44Oh44O844K/44Kq44OW44K444Kn44Kv44OIXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHF1ZXJ5RXNMaW50RW52UGFyYW0oKTogYW55IHtcbiAgICAgICAgY29uc3QgY29tcGlsZVNldHRpbmcgPSA8SUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uPnRoaXMuX2NvbmZpZztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVzNjogXCJlczVcIiAhPT0gY29tcGlsZVNldHRpbmcuZXMsXG4gICAgICAgICAgICBub2RlOiBcIndlYlwiICE9PSBjb21waWxlU2V0dGluZy5lbnYsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uLnRvb2xzIOODl+ODreODkeODhuOCo+OBruaMh+WumueKtuazgeOCkuWPluW+l1xuICAgICAqXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgbmFtZSDjg4Tjg7zjg6vlkI3jgpLmjIflrppcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlOiDmjIflrprjgZXjgozjgabjgYTjgosgLyBmYWxzZTog5oyH5a6a44GV44KM44Gm44GE44Gq44GEXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGlzRW5hYmxlVG9vbChuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhKDxJQnVpbGRUYXJnZXRDb25maWdyYXRpb24+dGhpcy5fY29uZmlnKS50b29scy5maW5kKCh0b29sKSA9PiBuYW1lID09PSB0b29sKTtcbiAgICB9XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIHByaXZhdGUgbWV0aG9kczpcblxuICAgIC8qKlxuICAgICAqIGNyZWF0ZSDlh6bnkIbjga7jgqjjg7Pjg4jjg6pcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHJ1bkNyZWF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVCYXNlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlKCk7XG4gICAgfVxuXG4gICAgLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLy9cblxuICAgIC8qKlxuICAgICAqIOWFsemAmuOBriBjcmVhdGUg5Yem55CGXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVCYXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnByb2dyZXNzKFwiYmFzZS5jcmVhdGUuZm91bmRhdGlvblwiKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVQcm9qZWN0RGlyKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29weUJhc2VTdHJ1Y3R1cmUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb3B5Q29tbW9uRmlsZXMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb3B5VGFza1NjcmlwdHMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5fjg63jgrjjgqfjgq/jg4jjg4fjgqPjg6zjgq/jg4jjg6rjga7kvZzmiJBcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVByb2plY3REaXIoKTogdm9pZCB7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHRoaXMucm9vdERpcikpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKHRyYW5zbGF0ZShcImJhc2UuY3JlYXRlLmVycm9yLmFscmVhZHlFeGlzdFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnMubWtkaXJzU3luYyh0aGlzLnJvb3REaXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWFsemAmuani+aIkOaDheWgseOBruOCs+ODlOODvFxuICAgICAqL1xuICAgIHByaXZhdGUgY29weUJhc2VTdHJ1Y3R1cmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29weVRwbERpcihcImJhc2Uvc3RydWN0dXJlXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWfuuacrOODleOCoeOCpOODq+OBruOCs+ODlOODvFxuICAgICAqIHRlbXBsYXRlIOOBruOCs+ODlOODvOOCguihjOOBhlxuICAgICAqL1xuICAgIHByaXZhdGUgY29weUNvbW1vbkZpbGVzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzcmNEaXIgPSB0ZW1wbGF0ZVBhdGgoXCJiYXNlXCIpO1xuICAgICAgICBjb25zdCBkc3REaXIgPSB0aGlzLnJvb3REaXI7XG5cbiAgICAgICAgLy8gLm5wbWlnbm9yZVxuICAgICAgICBjb3B5VHBsKFxuICAgICAgICAgICAgcGF0aC5qb2luKHNyY0RpciwgXCJfbnBtaWdub3JlXCIpLFxuICAgICAgICAgICAgcGF0aC5qb2luKGRzdERpciwgXCIubnBtaWdub3JlXCIpLFxuICAgICAgICAgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZ1xuICAgICAgICApO1xuXG4gICAgICAgIC8vIEJBTk5FUlxuICAgICAgICBmcy5jb3B5U3luYyhcbiAgICAgICAgICAgIHBhdGguam9pbihzcmNEaXIsIFwiX0JBTk5FUlwiKSxcbiAgICAgICAgICAgIHBhdGguam9pbihkc3REaXIsIFwiQkFOTkVSXCIpLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIExJQ0VOU0VcbiAgICAgICAgc3dpdGNoICh0aGlzLl9jb25maWcubGljZW5zZSkge1xuICAgICAgICAgICAgY2FzZSBcIkFwYWNoZS0yLjBcIjpcbiAgICAgICAgICAgICAgICBmcy5jb3B5U3luYyhcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY0RpciwgXCJfTElDRU5TRS5BcGFjaGUtMi4wXCIpLFxuICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4oZHN0RGlyLCBcIkxJQ0VOU0VcIiksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJNSVRcIjpcbiAgICAgICAgICAgICAgICBjb3B5VHBsKFxuICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4oc3JjRGlyLCBcIl9MSUNFTlNFLk1JVFwiKSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKGRzdERpciwgXCJMSUNFTlNFXCIpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25maWcuY29weXJpZ2h0XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOT1RJQ0VcbiAgICAgICAgZnMuY29weVN5bmMoXG4gICAgICAgICAgICBwYXRoLmpvaW4oc3JjRGlyLCBcIl9OT1RJQ0VcIiksXG4gICAgICAgICAgICBwYXRoLmpvaW4oZHN0RGlyLCBcIk5PVElDRVwiKSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBidWlsZCB0b29sczogd2VicGFja1xuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZVRvb2woXCJ3ZWJwYWNrXCIpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhbTogSVdlYnBhY2tDb25maWdyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgbm9kZWpzOiAoPElCdWlsZFRhcmdldENvbmZpZ3JhdGlvbj50aGlzLl9jb25maWcpLm5vZGVqcyxcbiAgICAgICAgICAgICAgICBndWlkZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0YXNrUGF0aDogdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50YXNrLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY0RpciwgXCJ0b29scy93ZWJwYWNrL193ZWJwYWNrLmNvbmZpZy5qc1wiKSxcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4oZHN0RGlyLCBcIndlYnBhY2suY29uZmlnLmpzXCIpLFxuICAgICAgICAgICAgICAgIHBhcmFtLFxuICAgICAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0YXNrIHNjcmlwdCDjga7jgrPjg5Tjg7xcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvcHlUYXNrU2NyaXB0cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3JjRGlyID0gdGVtcGxhdGVQYXRoKFwiYmFzZS90YXNrXCIpO1xuICAgICAgICBjb25zdCBkc3REaXIgPSBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnRhc2spO1xuXG4gICAgICAgIHRoaXMudGFza0xpc3QuZm9yRWFjaCgodGFzaykgPT4ge1xuICAgICAgICAgICAgZnMuY29weVN5bmMoXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY0RpciwgdGFzayksXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKGRzdERpciwgdGFzayksXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vLi4vc3JjL2dlbmVyYXRvcnMvYmFzZS9nZW5lcmF0b3ItYmFzZS50cyJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgZTVlNDA2MTliNjhhN2EwNTU3NjUiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicGF0aFwiIiwiY2RwOi8vL2NkcC1saWIvZ2VuZXJhdG9ycy9iYXNlL2luZGV4LnRzIiwiY2RwOi8vL2NkcC1saWIvdXRpbHMvaW5kZXgudHMiLCJjZHA6Ly8vY2RwLWxpYi91dGlscy9saWJzLnRzIiwid2VicGFjazovLy9leHRlcm5hbCBcIm9zXCIiLCJjZHA6Ly8vY2RwLWxpYi91dGlscy9zZXR0aW5ncy50cyIsImNkcDovLy9jZHAtbGliL2dlbmVyYXRvcnMvbGlicmFyeS9pbmRleC50cyIsImNkcDovLy9jZHAtbGliL2dlbmVyYXRvcnMvbGlicmFyeS9nZW5lcmF0b3ItbW9kdWxlLnRzIiwiY2RwOi8vL2NkcC1saWIvZ2VuZXJhdG9ycy9tb2JpbGUvaW5kZXgudHMiLCJjZHA6Ly8vY2RwLWxpYi9nZW5lcmF0b3JzL21vYmlsZS9nZW5lcmF0b3ItY29yZG92YS50cyIsImNkcDovLy9jZHAtbGliL2dlbmVyYXRvcnMvZGVza3RvcC9pbmRleC50cyIsImNkcDovLy9jZHAtbGliL2dlbmVyYXRvcnMvZGVza3RvcC9nZW5lcmF0b3ItZWxlY3Rvcm9uLnRzIiwiY2RwOi8vL2NkcC1saWIvZ2VuZXJhdG9ycy93ZWIvaW5kZXgudHMiLCJjZHA6Ly8vY2RwLWxpYi9nZW5lcmF0b3JzL3dlYi9nZW5lcmF0b3ItYnJvd3Nlci50cyIsImNkcDovLy9jZHAtbGliL2NkcC1saWIudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJmcy1leHRyYVwiLFwiY29tbW9uanMyXCI6XCJmcy1leHRyYVwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcImdsb2JcIixcImNvbW1vbmpzMlwiOlwiZ2xvYlwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wicm9vdFwiOlwiSG9nYW5cIixcImNvbW1vbmpzXCI6XCJob2dhbi5qc1wiLFwiY29tbW9uanMyXCI6XCJob2dhbi5qc1wiLFwiYW1kXCI6XCJob2dhbi5qc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wicm9vdFwiOlwiX1wiLFwiY29tbW9uanNcIjpcImxvZGFzaFwiLFwiY29tbW9uanMyXCI6XCJsb2Rhc2hcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcIl9cIixcImNvbW1vbmpzXCI6XCJ1bmRlcnNjb3JlLnN0cmluZ1wiLFwiY29tbW9uanMyXCI6XCJ1bmRlcnNjb3JlLnN0cmluZ1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcIndoaWNoXCIsXCJjb21tb25qczJcIjpcIndoaWNoXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qc1wiOlwidXVpZFwiLFwiY29tbW9uanMyXCI6XCJ1dWlkXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qc1wiOlwiY2hhbGtcIixcImNvbW1vbmpzMlwiOlwiY2hhbGtcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJzZW12ZXItcmVnZXhcIixcImNvbW1vbmpzMlwiOlwic2VtdmVyLXJlZ2V4XCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qc1wiOlwiY2xpLXNwaW5uZXJcIixcImNvbW1vbmpzMlwiOlwiY2xpLXNwaW5uZXJcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJqc2RvbVwiLFwiY29tbW9uanMyXCI6XCJqc2RvbVwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcInhtbGRvbVwiLFwiY29tbW9uanMyXCI6XCJ4bWxkb21cIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcImpRdWVyeVwiLFwiY29tbW9uanNcIjpcImpxdWVyeVwiLFwiY29tbW9uanMyXCI6XCJqcXVlcnlcIixcImFtZFwiOlwianF1ZXJ5XCJ9IiwiY2RwOi8vL2NkcC1saWIvdXRpbHMvdG9vbHMudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiY2hpbGRfcHJvY2Vzc1wiIiwiY2RwOi8vL2NkcC1saWIvZ2VuZXJhdG9ycy9pbmRleC50cyIsImNkcDovLy9jZHAtbGliL2dlbmVyYXRvcnMvYmFzZS9pbnRlcmZhY2VzLnRzIiwiY2RwOi8vL2NkcC1saWIvZ2VuZXJhdG9ycy9iYXNlL2dlbmVyYXRvci1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7QUM3REEsaUM7Ozs7Ozs7Ozs7OztBQ0FBLGtDQUE2QjtBQUM3QixrQ0FBaUM7Ozs7Ozs7Ozs7Ozs7QUNEakMsaUNBQXVCO0FBQ3ZCLGtDQUF3QjtBQUN4QixpQ0FBMkI7Ozs7Ozs7Ozs7QUNGM0IsbUNBQStCO0FBeUMzQixnQkFBRTtBQXhDTixxQ0FBNkI7QUF5Q3pCLG9CQUFJO0FBeENSLHNDQUFrQztBQXlDOUIsc0JBQUs7QUF4Q1QsbUNBQTZCO0FBQzdCLG1DQUF3QztBQUN4QyxzQ0FBK0I7QUF5QzNCLHNCQUFLO0FBeENULHFDQUE2QjtBQXlDekIsb0JBQUk7QUF4Q1Isd0NBQTBCO0FBeUN0QixnQkF6Q0csZUFBSyxDQXlDSDtBQXhDVCw0Q0FBNEM7QUF5Q3hDLGtDQUFXO0FBeENmLDhDQUFzQztBQXlDbEMs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QUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQzFCLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSjtBQTNhRCxzQ0EyYUMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxNCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgZTVlNDA2MTliNjhhN2EwNTU3NjUiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwicGF0aFwiXG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImV4cG9ydCAqIGZyb20gXCIuL2ludGVyZmFjZXNcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vZ2VuZXJhdG9yLWJhc2VcIjtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4uLy4uLy4uL3NyYy9nZW5lcmF0b3JzL2Jhc2UvaW5kZXgudHMiLCJleHBvcnQgKiBmcm9tIFwiLi9saWJzXCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL3Rvb2xzXCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL3NldHRpbmdzXCI7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi9zcmMvdXRpbHMvaW5kZXgudHMiLCJpbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnMtZXh0cmFcIjtcclxuaW1wb3J0ICogYXMgZ2xvYiBmcm9tIFwiZ2xvYlwiO1xyXG5pbXBvcnQgKiBhcyBob2dhbiBmcm9tIFwiaG9nYW4uanNcIjtcclxuaW1wb3J0ICogYXMgX2wgZnJvbSBcImxvZGFzaFwiO1xyXG5pbXBvcnQgKiBhcyBfcyBmcm9tIFwidW5kZXJzY29yZS5zdHJpbmdcIjtcclxuaW1wb3J0ICogYXMgd2hpY2ggZnJvbSBcIndoaWNoXCI7XHJcbmltcG9ydCAqIGFzIHV1aWQgZnJvbSBcInV1aWRcIjtcclxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xyXG5pbXBvcnQgKiBhcyBzZW12ZXJSZWdleCBmcm9tIFwic2VtdmVyLXJlZ2V4XCI7XHJcbmltcG9ydCB7IFNwaW5uZXIgfSBmcm9tIFwiY2xpLXNwaW5uZXJcIjtcclxuXHJcbmNvbnN0ICQ6IEpRdWVyeVN0YXRpYyA9ICgoKSA9PiB7XHJcbiAgICBjb25zdCBfd2luZG93ID0gKCgpID0+IHtcclxuICAgICAgICBjb25zdCBqc2RvbSA9IHJlcXVpcmUoXCJqc2RvbVwiKTtcclxuICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YganNkb20uSlNET00pIHsgICAgLy8gdjEwK1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IGpzZG9tLkpTRE9NKCkud2luZG93O1xyXG4gICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdjkuMTIueFxyXG4gICAgICAgICAgICByZXR1cm4ganNkb20uanNkb20oKS5kZWZhdWx0VmlldztcclxuICAgICAgICB9XHJcbiAgICB9KSgpO1xyXG5cclxuICAgIC8vIHBhdGNoIHNjb3BlOlxyXG4gICAgKChyb290OiBhbnkpID0+IHtcclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIGpzZG9tIDkuNC4wIC0gOS4xMi4wIOOBq+Wun+ijheOBleOCjOOBpuOBhOOCiyBET01QYXJzZXIg44GvIFhNTCDjga4gc2VyaWFsaXplIOOBjOOBp+OBjeOBquOBhOOBn+OCgSxcclxuICAgICAgICAgKiB4bWxkb20g44Gr572u44GN5o+b44GI44KLXHJcbiAgICAgICAgICoganNkb20gMTAuMS4wIOOBvuOBp+WLleOBi+OBquOBhOOBk+OBqOOCkueiuuiqjVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IHhtbGRvbSA9IHJlcXVpcmUoXCJ4bWxkb21cIik7XHJcbiAgICAgICAgcm9vdC5ET01QYXJzZXIgPSB4bWxkb20uRE9NUGFyc2VyO1xyXG4gICAgICAgIC8vIHhtbGRvbSDjgavjga8gZG9tLnRvU3RyaW5nKCkg44GM5a6f6KOF44GV44KM44Gm44GE44KL44GM44CBZ2xvYmFsIOOBq+OCgiBleHBvcnQg44GZ44KLXHJcbiAgICAgICAgKDxhbnk+Z2xvYmFsKS5YTUxTZXJpYWxpemVyID0gcm9vdC5YTUxTZXJpYWxpemVyID0geG1sZG9tLlhNTFNlcmlhbGl6ZXI7XHJcbiAgICB9KShfd2luZG93KTtcclxuXHJcbiAgICByZXR1cm4gcmVxdWlyZShcImpxdWVyeVwiKShfd2luZG93KTtcclxufSkoKTtcclxuXHJcbmV4cG9ydCB0eXBlIE1peGluZWRVbmRlcnNjb3JlU3RhdGljID0gdHlwZW9mIF9zICYgdHlwZW9mIF9sO1xyXG5jb25zdCBfbTogTWl4aW5lZFVuZGVyc2NvcmVTdGF0aWMgPSA8YW55Pl9sLm1peGluKDxhbnk+X3MuZXhwb3J0cygpKTtcclxuXHJcbmV4cG9ydCB7XHJcbiAgICBmcyxcclxuICAgIGdsb2IsXHJcbiAgICBob2dhbixcclxuICAgICQsXHJcbiAgICBfbSBhcyBfLFxyXG4gICAgd2hpY2gsXHJcbiAgICB1dWlkLFxyXG4gICAgY2hhbGssXHJcbiAgICBzZW12ZXJSZWdleCxcclxuICAgIFNwaW5uZXIsXHJcbn07XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi9zcmMvdXRpbHMvbGlicy50cyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm9zXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwib3NcIlxuLy8gbW9kdWxlIGlkID0gNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XHJcbmltcG9ydCB7IGZzLCAkIH0gZnJvbSBcIi4vbGlic1wiO1xyXG5cclxuLyoqXHJcbiAqIEBpbnRlcmZhY2UgSUdsb2JhbFNldHRpbmdzXHJcbiAqIEBicmllZiDjgrDjg63jg7zjg5Djg6voqK3lrprjgqTjg7Pjgr/jg7zjg5XjgqfjgqTjgrlcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdsb2JhbFNldHRpbmdzIHtcclxuICAgIGZvcmNlPzogYm9vbGVhbjsgICAgICAgICAgICAvLyDjgqjjg6njg7zntpnntprnlKhcclxuICAgIHZlcmJvc2U/OiBib29sZWFuOyAgICAgICAgICAvLyDoqbPntLDjg63jgrBcclxuICAgIHNpbGVudD86IGJvb2xlYW47ICAgICAgICAgICAvLyBzaWxlbnQgbW9kZVxyXG4gICAgdGFyZ2V0RGlyPzogc3RyaW5nOyAgICAgICAgIC8vIOS9nOalreODh+OCo+ODrOOCr+ODiOODqlxyXG4gICAgbGFuZz86IFwiZW4tVVNcIiB8IFwiamEtSlBcIjtcclxufVxyXG5cclxubGV0IF9zZXR0aW5nczogSUdsb2JhbFNldHRpbmdzID0ge1xyXG4gICAgZm9yY2U6IGZhbHNlLFxyXG4gICAgdmVyYm9zZTogZmFsc2UsXHJcbiAgICBzaWxlbnQ6IGZhbHNlLFxyXG4gICAgbGFuZzogXCJlbi1VU1wiLFxyXG59O1xyXG5cclxubGV0IF9saWJQYXRoOiBzdHJpbmc7ICAgLy8gY2RwLWxpYiDjga7lrZjlnKjjgZfjgabjgYTjgosgcGF0aFxyXG5cclxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuLy8gZXhwb3J0cyBtZXRob2RzOlxyXG5cclxuLyoqXHJcbiAqIOioreWumuWPluW+l1xyXG4gKlxyXG4gKiBAcmV0dXJucyBvcHRpb25zIOODreOCsOOBq+S9v+eUqOOBmeOCi+OCquODl+OCt+ODp+ODs1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFNldHRpbmdzKCk6IElHbG9iYWxTZXR0aW5ncyB7XHJcbiAgICByZXR1cm4gJC5leHRlbmQoe30sIF9zZXR0aW5ncyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDoqK3lrprmjIflrppcclxuICpcclxuICogQHBhcmFtIG9wdGlvbnMg44Ot44Kw44Gr5L2/55So44GZ44KL44Kq44OX44K344On44OzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2V0U2V0dGluZ3Moc2V0dGluZ3M6IElHbG9iYWxTZXR0aW5ncyk6IHZvaWQge1xyXG4gICAgaWYgKHNldHRpbmdzKSB7XHJcbiAgICAgICAgX3NldHRpbmdzLmZvcmNlICAgICA9IHNldHRpbmdzLmZvcmNlICAgICAgICB8fCBfc2V0dGluZ3MuZm9yY2U7XHJcbiAgICAgICAgX3NldHRpbmdzLnZlcmJvc2UgICA9IHNldHRpbmdzLnZlcmJvc2UgICAgICB8fCBfc2V0dGluZ3MudmVyYm9zZTtcclxuICAgICAgICBfc2V0dGluZ3Muc2lsZW50ICAgID0gc2V0dGluZ3Muc2lsZW50ICAgICAgIHx8IF9zZXR0aW5ncy5zaWxlbnQ7XHJcbiAgICAgICAgX3NldHRpbmdzLnRhcmdldERpciA9IHNldHRpbmdzLnRhcmdldERpciAgICB8fCBfc2V0dGluZ3MudGFyZ2V0RGlyO1xyXG4gICAgICAgIF9zZXR0aW5ncy5sYW5nICAgICAgPSBzZXR0aW5ncy5sYW5nICAgICAgICAgfHwgX3NldHRpbmdzLmxhbmc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIF9zZXR0aW5ncyA9IHtcclxuICAgICAgICAgICAgZm9yY2U6IGZhbHNlLFxyXG4gICAgICAgICAgICB2ZXJib3NlOiBmYWxzZSxcclxuICAgICAgICAgICAgc2lsZW50OiBmYWxzZSxcclxuICAgICAgICAgICAgbGFuZzogXCJlbi1VU1wiLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBcImNkcC1saWJcIiDjgYzlrZjlnKjjgZnjgovjg5HjgrnjgpLlj5blvpdcclxuICpcclxuICogQHJldHVybnMgY2RwLWxpYiDjgbjjga4gcGF0aFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldExpYlBhdGgoKTogc3RyaW5nIHtcclxuICAgIGlmIChudWxsID09IF9saWJQYXRoKSB7XHJcbiAgICAgICAgY29uc3QgVFJZX0NPVU5UID0gMztcclxuICAgICAgICBsZXQgdHJpZWQgPSAwO1xyXG4gICAgICAgIF9saWJQYXRoID0gX19kaXJuYW1lO1xyXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgICAgICAgIGlmIChUUllfQ09VTlQgPD0gdHJpZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwibGliIHBhdGggaXMgbm90IHJlc29sdmVkLlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfbGliUGF0aCA9IHBhdGguam9pbihfbGliUGF0aCwgXCIuLlwiKTtcclxuICAgICAgICAgICAgY29uc3QgY2hlY2sgPSBwYXRoLmpvaW4oX2xpYlBhdGgsIFwiY2RwLWxpYlwiKTtcclxuICAgICAgICAgICAgaWYgKGZzLnBhdGhFeGlzdHNTeW5jKGNoZWNrKSkge1xyXG4gICAgICAgICAgICAgICAgX2xpYlBhdGggPSBjaGVjaztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyaWVkKys7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9saWJQYXRoO1xyXG59XHJcblxyXG4vKipcclxuICog5oyH5a6a44GV44KM44GfIHRhcmdldERpciDjgpLlj5blvpdcclxuICpcclxuICogQHJldHVybnMgdGFyZ2V0RGlyIOOBuOOBriBwYXRoXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFyZ2V0RGlyKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gX3NldHRpbmdzLnRhcmdldERpcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIOODreOCsOWHuuWKm1xyXG4gKiBjb25zb2xlLmxvZygpIOOBqOWQjOetiVxyXG4gKlxyXG4gKiBAcGFyYW0gbWVzc2FnZSAgICAgICAg5Ye65Yqb44Oh44OD44K744O844K4XHJcbiAqIEBwYXJhbSBvcHRpb25hbFBhcmFtcyDku5jliqDmg4XloLFcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBsb2cobWVzc2FnZT86IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XHJcbiAgICBpZiAoIV9zZXR0aW5ncy5zaWxlbnQpIHtcclxuICAgICAgICBpZiAoMCA8IG9wdGlvbmFsUGFyYW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICog6Kmz57Sw44Ot44Kw5Ye65YqbXHJcbiAqIGNvbnNvbGUuZGVidWcoKSDjgajlkIznrYlcclxuICpcclxuICogQHBhcmFtIG1lc3NhZ2UgICAgICAgIOWHuuWKm+ODoeODg+OCu+ODvOOCuFxyXG4gKiBAcGFyYW0gb3B0aW9uYWxQYXJhbXMg5LuY5Yqg5oOF5aCxXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGVidWcobWVzc2FnZT86IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XHJcbiAgICBpZiAoIV9zZXR0aW5ncy5zaWxlbnQgJiYgX3NldHRpbmdzLnZlcmJvc2UpIHtcclxuICAgICAgICBpZiAoMCA8IG9wdGlvbmFsUGFyYW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiREVCVUc6IFwiICsgbWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJERUJVRzogXCIgKyBtZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDmpJzoqLxcclxuICogY29uc29sZS5hc3NlcnQoKSDjgajlkIznrYlcclxuICpcclxuICogQHBhcmFtIHRlc3QgICAgICAgICAgIOaknOiovOOBmeOCi+W8j1xyXG4gKiBAcGFyYW0gbWVzc2FnZSAgICAgICAg5Ye65Yqb44Oh44OD44K744O844K4XHJcbiAqIEBwYXJhbSBvcHRpb25hbFBhcmFtcyDku5jliqDmg4XloLFcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQodGVzdD86IGJvb2xlYW4sIG1lc3NhZ2U/OiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgaWYgKCF0ZXN0KSB7XHJcbiAgICAgICAgaWYgKF9zZXR0aW5ncy5mb3JjZSkge1xyXG4gICAgICAgICAgICBpZiAoMCA8IG9wdGlvbmFsUGFyYW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UsIG9wdGlvbmFsUGFyYW1zKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICgwIDwgb3B0aW9uYWxQYXJhbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UsIG9wdGlvbmFsUGFyYW1zKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxubGV0IF9sYW5nOiBhbnk7XHJcblxyXG4vKipcclxuICog44Ot44O844Kr44Op44Kk44K6XHJcbiAqXHJcbiAqIEBwYXJhbSBrZXkg44Kt44O85paH5a2X5YiXXHJcbiAqIEByZXR1cm5zIOe/u+ios+OBleOCjOOBn+aWh+Wtl+WIl1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIV9sYW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgX2xhbmcgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhcclxuICAgICAgICAgICAgICAgIHBhdGguam9pbihnZXRMaWJQYXRoKCksIFwicmVzL2xvY2FsZXNcIiwgXCJtZXNzYWdlcy5cIiArIF9zZXR0aW5ncy5sYW5nICsgXCIuanNvblwiKSwgXCJ1dGY4XCIpLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcIkxhbmd1YWdlIHJlc291cmNlIEpTT04gcGFyc2UgZXJyb3I6IFwiICsgZXJyb3IubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXNvdWNlID0gJC5leHRlbmQoe30sIF9sYW5nKTtcclxuICAgIGNvbnN0IHByb3BzID0ga2V5LnNwbGl0KFwiLlwiKTtcclxuICAgIHdoaWxlICgwIDwgcHJvcHMubGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzLnNoaWZ0KCk7XHJcbiAgICAgICAgaWYgKHJlc291Y2VbcHJvcF0pIHtcclxuICAgICAgICAgICAgcmVzb3VjZSA9IHJlc291Y2VbcHJvcF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBcInJlc291Y2Ugbm90IGZvdW5kLiBrZXk6IFwiICsga2V5KTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc291Y2U7XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4uLy4uL3NyYy91dGlscy9zZXR0aW5ncy50cyIsImltcG9ydCB7IEdlbmVyYXRvckJhc2UsIElQcm9qZWN0Q29uZmlncmF0aW9uIH0gZnJvbSBcIi4uL2Jhc2VcIjtcclxuaW1wb3J0IHsgR2VuZXJhdG9yTW9kdWxlIH0gZnJvbSBcIi4vZ2VuZXJhdG9yLW1vZHVsZVwiO1xyXG5cclxuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0b3ItbW9kdWxlXCI7XHJcblxyXG4vKipcclxuICogZ2VuZXJhdG9yIOeUn+aIkOmWouaVsFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG5ld0dlbmVyYXRvckxpYnJhcnkoY29uZmlnOiBJUHJvamVjdENvbmZpZ3JhdGlvbik6IEdlbmVyYXRvckJhc2Uge1xyXG4gICAgcmV0dXJuIG5ldyBHZW5lcmF0b3JNb2R1bGUoY29uZmlnKTtcclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGlicmFyeS9pbmRleC50cyIsImltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcclxuaW1wb3J0ICogYXMgb3MgZnJvbSBcIm9zXCI7XHJcbmltcG9ydCB7XHJcbiAgICBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbixcclxuICAgIElEZXBlbmRlbmN5LFxyXG4gICAgSVZpc3VhbFN0dWRpb0NvbmZpZ3JhdGlvbixcclxuICAgIEdlbmVyYXRvckJhc2UsXHJcbiAgICBVdGlscyxcclxufSBmcm9tIFwiLi4vYmFzZVwiO1xyXG5pbXBvcnQgeyBJTGlicmFyeUNvbmZpZ3JhdGlvbiB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcclxuXHJcbmNvbnN0IGZzICAgICAgICAgICAgPSBVdGlscy5mcztcclxuY29uc3QgZ2xvYiAgICAgICAgICA9IFV0aWxzLmdsb2I7XHJcbmNvbnN0ICQgICAgICAgICAgICAgPSBVdGlscy4kO1xyXG5jb25zdCBfICAgICAgICAgICAgID0gVXRpbHMuXztcclxuY29uc3QgZGVidWcgICAgICAgICA9IFV0aWxzLmRlYnVnO1xyXG5jb25zdCB0ZW1wbGF0ZVBhdGggID0gVXRpbHMudGVtcGxhdGVQYXRoO1xyXG5jb25zdCBjb3B5VHBsICAgICAgID0gVXRpbHMuY29weVRwbDtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3MgR2VuZXJhdG9yTW9kdWxlXHJcbiAqIEBicmllZiBMaWJyYXJ5IE1vZHVsZSDnlKggR2VuZXJhdG9yIOOCr+ODqeOCuVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEdlbmVyYXRvck1vZHVsZSBleHRlbmRzIEdlbmVyYXRvckJhc2Uge1xyXG5cclxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAvLyBpbXByZW1lbnRlczogR2VuZXJhdG9yQmFzZVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pei5a6a44GuIGRpcmVjdG9yeSDmp4vpgKDjgpLov5TljbRcclxuICAgICAqL1xyXG4gICAgZGVmYXVsdEJhc2VTdHJ1Y3R1cmUoKTogSUJhc2VTdHJ1Y3R1cmVDb25maWdyYXRpb24ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHNyYzogXCJzcmNcIixcclxuICAgICAgICAgICAgcGtnOiBcImRpc3RcIixcclxuICAgICAgICAgICAgYnVpbHQ6IFwiYnVpbHRcIixcclxuICAgICAgICAgICAgZG9jOiBcImRvY3NcIixcclxuICAgICAgICAgICAgdGFzazogXCJ0YXNrc1wiLFxyXG4gICAgICAgICAgICB0ZXN0OiBcInRlc3RzXCIsXHJcbiAgICAgICAgICAgIHR5cGVzOiBcIkB0eXBlc1wiLFxyXG4gICAgICAgICAgICB0ZW1wOiBcIi50ZW1wXCIsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGNyZWF0ZSBhY3Rpb24gZW50cnlcclxuICAgICAqIEBwYXJhbSB7SUxpYnJhcnlDb25maWdyYXRpb259IGNvbmZpZyDjgrPjg7Pjg5XjgqPjgrDoqK3lrppcclxuICAgICAqL1xyXG4gICAgYXN5bmMgY3JlYXRlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTW9kdWxlUHJvcHMoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZURpcmVjdG9yeVN0cnVjdHVyZSgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlUHJvamVjdFNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVTb3VyY2VUZW1wbGF0ZSgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlVmlzdWFsU3R1ZGlvU29sdXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW/heimgeOBqOOBmeOCiyB0YXNrIHNjcmlwdCDkuIDopqfjgpLov5TljbQuIGFjdGlvbjogY3JlYXRlIOOBruOBqOOBjeOBq+WRvOOBsOOCjOOCi1xyXG4gICAgICovXHJcbiAgICBnZXQgdGFza0xpc3QoKTogc3RyaW5nW10ge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIFwiYmFubmVyLmpzXCIsXHJcbiAgICAgICAgICAgIFwiY2xlYW4uanNcIixcclxuICAgICAgICAgICAgXCJzcmNtYXAuanNcIixcclxuICAgICAgICAgICAgXCJidW5kbGUtZmluYWxpemVyLmpzXCIsXHJcbiAgICAgICAgICAgIFwicmVtYXAtY292ZXJhZ2UuanNcIixcclxuICAgICAgICBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAvLyBwcm90ZWN0ZWQgbWV0aG9kczpcclxuXHJcbiAgICAvKipcclxuICAgICAqIOmWi+eZuuaZguOBruS+neWtmOODouOCuOODpeODvOODq+ODquOCueODiOOBruWPluW+l1xyXG4gICAgICog5b+F6KaB44Gr5b+c44GY44Gm44Kq44O844OQ44O844Op44Kk44OJXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7SURlcGVuZGVuY3l9XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgZGVmYXVsdERldkRlcGVuZGVuY2llcygpOiBJRGVwZW5kZW5jeVtdIHtcclxuICAgICAgICBjb25zdCBkZXBlbmRzID0gc3VwZXIuZGVmYXVsdERldkRlcGVuZGVuY2llcy5jb25jYXQoW1xyXG4gICAgICAgICAgICB7IG5hbWU6IFwiQHR5cGVzL2phc21pbmVcIiwgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwiZHRzLWJ1bmRsZVwiLCAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwidHlwZXNjcmlwdC1mb3JtYXR0ZXJcIiwgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICBjb25zdCBleHRyYSA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5ub2RlanMpIHtcclxuICAgICAgICAgICAgZXh0cmEucHVzaCh7IG5hbWU6IFwiamFzbWluZS1ub2RlXCIsIHZlcnNpb246IFwiXjIuMC4wXCIsIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGV4dHJhLnB1c2goeyBuYW1lOiBcInJlcXVpcmVqc1wiLCB2ZXJzaW9uOiB1bmRlZmluZWQsIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIF8uc29ydEJ5KGRlcGVuZHMuY29uY2F0KGV4dHJhKSwgKGRlcGVuZCkgPT4gZGVwZW5kLm5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAvLyBwcml2YXRlIG1ldGhvZHM6XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBjb25maWdyYXRpb24g44Gr44Ki44Kv44K744K5XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0IGNvbmZpZygpOiBJTGlicmFyeUNvbmZpZ3JhdGlvbiB7XHJcbiAgICAgICAgcmV0dXJuIDxJTGlicmFyeUNvbmZpZ3JhdGlvbj50aGlzLl9jb25maWc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBtb2R1bGUg5ZCNLCBtYWluIOODleOCoeOCpOODq+WQjeOBruS/neiovFxyXG4gICAgICogLSAxOiBtb2R1bGVOYW1lIOOBjOaMh+WumuOBleOCjOOBpuOBhOOCi+WgtOWQiOOBr+S9v+eUqOOBmeOCi1xyXG4gICAgICogLSAyOiBwcm9qZWN0TmFtZSDjgYzkvb/nlKjlj6/og73jgarloLTlkIjjga/jgZ3jgozjgpLkvb/nlKjjgZnjgotcclxuICAgICAqIC0gMzogcHJvamVjdE5hbWUg44GM5L2/55So5LiN5Y+v44Gu5aC05ZCI44Gv44CBXCItXCIg44Gk44Gq44GO5paH5a2X5YiX44KS55Sf5oiQ44GZ44KLXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZW5zdXJlTW9kdWxlUHJvcHMoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gbW9kdWxlIG5hbWVcclxuICAgICAgICBpZiAobnVsbCA9PSB0aGlzLmNvbmZpZy5tb2R1bGVOYW1lKSB7XHJcbiAgICAgICAgICAgIGlmICghL14uKlsoXFxcXHxcXHN8L3w6fCp8P3xcInw8fD58fCldLiokLy50ZXN0KHRoaXMuY29uZmlnLnByb2plY3ROYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcubW9kdWxlTmFtZSA9IHRoaXMuY29uZmlnLnByb2plY3ROYW1lO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcubW9kdWxlTmFtZSA9IF8udHJpbShfLmRhc2hlcml6ZSh0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZSksIFwiLVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBkZWJ1ZyhcIm1vZHVsZU5hbWU6IFwiICsgdGhpcy5jb25maWcubW9kdWxlTmFtZSk7XHJcblxyXG4gICAgICAgIC8vIG1haW4gZmlsZSBuYW1lXHJcbiAgICAgICAgaWYgKG51bGwgPT0gdGhpcy5jb25maWcubWFpbkJhc2VOYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLm1haW5CYXNlTmFtZSA9IHRoaXMuY29uZmlnLm1vZHVsZU5hbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlYnVnKFwibWFpbkJhc2VOYW1lOiBcIiArIHRoaXMuY29uZmlnLm1haW5CYXNlTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDjg4fjgqPjg6zjgq/jg4jjg6rmp4vmiJDmg4XloLHjga7jgrPjg5Tjg7xcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVEaXJlY3RvcnlTdHJ1Y3R1cmUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb3B5VHBsRGlyKFwibGlicmFyeS9zdHJ1Y3R1cmVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDjg5fjg63jgrjjgqfjgq/jg4joqK3lrprjg5XjgqHjgqTjg6vjga7kvZzmiJBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVQcm9qZWN0U2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgLy8gcHJvamVjdC5jb25maWcuanNcclxuICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeVwiKSwgXCJfcHJvamVjdC5jb25maWcuanNcIiksXHJcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwicHJvamVjdC5jb25maWcuanNcIiksXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcclxuICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIHRzY29uZmlnXHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5vdXRwdXRTYW1lRGlyKSB7XHJcbiAgICAgICAgICAgIC8vIG1haW4gdHNjb25maWcuanNvblxyXG4gICAgICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcImxpYnJhcnlcIiksIFwiX3RzY29uZmlnLmpzb25cIiksXHJcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcInRzY29uZmlnLmpzb25cIiksXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25maWcsXHJcbiAgICAgICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAvLyB0ZXN0IHRzY29uZmlnLmpzb25cclxuICAgICAgICAgICAgY29weVRwbChcclxuICAgICAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJsaWJyYXJ5XCIpLCBcIl90c2NvbmZpZy50ZXN0Lmpzb25cIiksXHJcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnRlc3QsIFwidW5pdFwiLCBcInRzY29uZmlnLmpzb25cIiksXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25maWcsXHJcbiAgICAgICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIG1haW4gdHNjb25maWcuanNvblxyXG4gICAgICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcImxpYnJhcnlcIiksIFwiX3RzY29uZmlnLm91dHB1dC1zYW1lLWRpci5qc29uXCIpLFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJ0c2NvbmZpZy5qc29uXCIpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIsIGJvbTogZmFsc2UsIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGVzbGludHJjLmpzb25cclxuICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeVwiKSwgXCJfZXNsaW50cmMuanNvblwiKSxcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50ZXN0LCBcImVzbGludFwiLCBcImVzbGludHJjLmpzb25cIiksXHJcbiAgICAgICAgICAgIHRoaXMucXVlcnlFc0xpbnRFbnZQYXJhbSgpLFxyXG4gICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIHRlc3RlbVxyXG4gICAgICAgIGlmICghdGhpcy5jb25maWcubm9kZWpzKSB7XHJcbiAgICAgICAgICAgIGNvcHlUcGwoXHJcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeS90b29scy90ZXN0ZW1cIiksIFwiX3Rlc3RlbS5qc29uXCIpLFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50ZXN0LCBcInJ1bm5lclwiLCBcInRlc3RlbS5qc29uXCIpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIsIGJvbTogZmFsc2UsIH1cclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRlc3RlbVN0dWZmUGF0aCA9IHRlbXBsYXRlUGF0aChcImxpYnJhcnkvdG9vbHMvdGVzdGVtL3J1bm5lclwiKTtcclxuXHJcbiAgICAgICAgICAgIGdsb2Iuc3luYyhcIioqXCIsIHtcclxuICAgICAgICAgICAgICAgIGN3ZDogdGVzdGVtU3R1ZmZQYXRoLFxyXG4gICAgICAgICAgICAgICAgbm9kaXI6IHRydWUsXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuZm9yRWFjaCgoZmlsZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLmNvcHlTeW5jKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGVzdGVtU3R1ZmZQYXRoLCBmaWxlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50ZXN0LCBcInJ1bm5lclwiLCBmaWxlKVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIC5naXRpZ25vcmVcclxuICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeVwiKSwgXCJfZ2l0aWdub3JlXCIpLFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcIi5naXRpZ25vcmVcIiksXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcclxuICAgICAgICAgICAgeyBib206IGZhbHNlLCB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gUkVBRE1FLm1kXHJcbiAgICAgICAgY29weVRwbChcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcImxpYnJhcnlcIiksIFwiX1JFQURNRS5tZFwiKSxcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJSRUFETUUubWRcIiksXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcclxuICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIHBhY2thZ2UuanNvblxyXG4gICAgICAgIHRoaXMuY29uZmlnLmRldkRlcGVuZGVuY2llcyA9IGF3YWl0IHRoaXMucXVlcnlEZXBlbmRlbmNpZXNQYXJhbSh0aGlzLmNvbmZpZy5kZXZEZXBlbmRlbmNpZXMgfHwgdGhpcy5kZWZhdWx0RGV2RGVwZW5kZW5jaWVzKTtcclxuICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeVwiKSwgXCJfcGFja2FnZS5qc29uXCIpLFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcInBhY2thZ2UuanNvblwiKSxcclxuICAgICAgICAgICAgdGhpcy5fY29uZmlnLFxyXG4gICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDjgr3jg7zjgrnjga7pm5vlvaLkvZzmiJBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVTb3VyY2VUZW1wbGF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBfbW9kdWxlID0gcGF0aC5iYXNlbmFtZSh0aGlzLl9jb25maWcubW9kdWxlTmFtZSwgXCIuanNcIik7XHJcbiAgICAgICAgY29uc3QgcGFyYW0gPSB7XHJcbiAgICAgICAgICAgIHNhbXBsZUNsYXNzOiBfLmNsYXNzaWZ5KF9tb2R1bGUpLFxyXG4gICAgICAgICAgICBzYW1wbGVNb2R1bGU6IF9tb2R1bGUsXHJcbiAgICAgICAgICAgIGJ1aWx0OiB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLmJ1aWx0LFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IHNjcmlwdCA9ICgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyY0NvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjQ29uZmlnLnNjcmlwdCB8fCBcIlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgICAgIH0pKCk7XHJcblxyXG4gICAgICAgIC8vIGluZGV4LnRzXHJcbiAgICAgICAgY29weVRwbChcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcImxpYnJhcnlcIiksIFwic3JjXCIsIFwiX2luZGV4LnRzXCIpLFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYywgc2NyaXB0LCBfbW9kdWxlICsgXCIudHNcIiksXHJcbiAgICAgICAgICAgIHBhcmFtLFxyXG4gICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gaW5kZXguc3BlYy50c1xyXG4gICAgICAgIGNvcHlUcGwoXHJcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJsaWJyYXJ5XCIpLCBcInNyY1wiLCBcIl9pbmRleC5zcGVjLnRzXCIpLFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnRlc3QsIFwidW5pdFwiLCBfbW9kdWxlICsgXCIuc3BlYy50c1wiKSxcclxuICAgICAgICAgICAgcGFyYW0sXHJcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmlzdWFsIFN0dWRpbyDjga7jgr3jg6rjg6Xjg7zjgrfjg6fjg7Pjg5XjgqHjgqTjg6vkvZzmiJBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVWaXN1YWxTdHVkaW9Tb2x1dGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCB2c1BhcmFtID0gKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY3JlYXRlR1VJRCA9IFV0aWxzLmNyZWF0ZUdVSUQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBwYXJhbTogSVZpc3VhbFN0dWRpb0NvbmZpZ3JhdGlvbiA9IDxhbnk+JC5leHRlbmQoe30sIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcpO1xyXG5cclxuICAgICAgICAgICAgcGFyYW0ucHJvamVjdE5hbWUgICAgICAgPSB0aGlzLl9jb25maWcucHJvamVjdE5hbWU7XHJcbiAgICAgICAgICAgIHBhcmFtLnByb2plY3RHVUlEICAgICAgID0gY3JlYXRlR1VJRCgpO1xyXG4gICAgICAgICAgICBwYXJhbS50eXBlcyAgICAgICAgICAgICA9IHBhcmFtLnR5cGVzLnJlcGxhY2UoXCJAXCIsIFwiJTQwXCIpOyAvLyBlc2NhcGUgXCJAXCIgdG8gXCIlNDBcIlxyXG4gICAgICAgICAgICBwYXJhbS5tYWluQmFzZU5hbWUgICAgICA9IHRoaXMuX2NvbmZpZy5tYWluQmFzZU5hbWU7XHJcbiAgICAgICAgICAgIHBhcmFtLmxpY2Vuc2UgICAgICAgICAgID0gIXRoaXMuX2NvbmZpZy5wcml2YXRlO1xyXG5cclxuICAgICAgICAgICAgLy8gdG9vbHNcclxuICAgICAgICAgICAgcGFyYW0ud2VicGFjayA9IHRoaXMuaXNFbmFibGVUb29sKFwid2VicGFja1wiKTtcclxuICAgICAgICAgICAgcGFyYW0udGVzdGVtID0gIXRoaXMuY29uZmlnLm5vZGVqcztcclxuXHJcbiAgICAgICAgICAgIHBhcmFtLm91dHB1dFNhbWVEaXIgPSB0aGlzLmNvbmZpZy5vdXRwdXRTYW1lRGlyO1xyXG5cclxuICAgICAgICAgICAgLy8gc2V0dXAgYnVpbHQganMgZ3JvdXBcclxuICAgICAgICAgICAgcGFyYW0uanNHcm91cCA9IFtdO1xyXG4gICAgICAgICAgICBpZiAoIXBhcmFtLm91dHB1dFNhbWVEaXIpIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtLmpzR3JvdXAucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVQYXRoOiBwYXJhbS5idWlsdCArIFwiXFxcXFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBwYXJhbS5tYWluQmFzZU5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZWU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgZF90czogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBtYXA6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgbWluX21hcDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWcubWluaWZ5KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBzZXR1cCBwa2cgZ3JvdXBcclxuICAgICAgICAgICAgICAgIHBhcmFtLmpzR3JvdXAucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVQYXRoOiBwYXJhbS5wa2cgKyBcIlxcXFxcIixcclxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogcGFyYW0ubWFpbkJhc2VOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlcGVuZGVlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBkX3RzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBtYXA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIG1pbl9tYXA6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gc2V0dXAgdGVzdCBqcyBncm91cFxyXG4gICAgICAgICAgICBwYXJhbS50c0dyb3VwID0gW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlUGF0aDogcGFyYW0udGVzdCArIFwiXFxcXHVuaXRcXFxcXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IHBhcmFtLm1haW5CYXNlTmFtZSArIFwiLnNwZWNcIixcclxuICAgICAgICAgICAgICAgICAgICBkZXBlbmRlZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBtYXA6IHRoaXMuY29uZmlnLm91dHB1dFNhbWVEaXIsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICBpZiAocGFyYW0ub3V0cHV0U2FtZURpcikge1xyXG4gICAgICAgICAgICAgICAgcGFyYW0udHNHcm91cC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVBhdGg6IHBhcmFtLmJ1aWx0ICsgXCJcXFxcXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IHBhcmFtLm1haW5CYXNlTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICBkZXBlbmRlZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgbWFwOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcclxuICAgICAgICB9KSgpO1xyXG5cclxuICAgICAgICAvLyAuc2xuXHJcbiAgICAgICAgY29weVRwbChcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcImJhc2UvdmlzdWFsLnN0dWRpb1wiKSwgXCJfc29sdXRpb24uc2xuLnRwbFwiKSxcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgdnNQYXJhbS5wcm9qZWN0TmFtZSArIFwiLnNsblwiKSxcclxuICAgICAgICAgICAgdnNQYXJhbSxcclxuICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIC5jc3Byb2pcclxuICAgICAgICAoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB0b1htbFN0cmluZyA9IChmaWxlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGhvZ2FuID0gVXRpbHMuaG9nYW47XHJcbiAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVUZXh0ID0gVXRpbHMubm9ybWFsaXplVGV4dDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW9sOiBvcy5FT0wsXHJcbiAgICAgICAgICAgICAgICAgICAgYm9tOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlbGltaXRlcnM6IFwie3sgfX1cIixcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgdHBsID0gcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcImJhc2UvdmlzdWFsLnN0dWRpb1wiKSwgZmlsZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBqc3QgPSBob2dhbi5jb21waWxlKG5vcm1hbGl6ZVRleHQoZnMucmVhZEZpbGVTeW5jKHRwbCkudG9TdHJpbmcoKSwgeyBlb2w6IFwiXFxuXCIsIGJvbTogZmFsc2UgfSksIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGpzdC5yZW5kZXIodnNQYXJhbSk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0b1htbERPTSA9IChmaWxlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAkKCQucGFyc2VYTUwodG9YbWxTdHJpbmcoZmlsZSkpKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRvWG1sTm9kZSA9IChmaWxlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBVdGlscy5zdHIyWG1sTm9kZSh0b1htbFN0cmluZyhmaWxlKSk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCAkcHJvaiA9IHRvWG1sRE9NKFwiX3Byb2plY3QuY3Nwcm9qLnRwbFwiKTtcclxuICAgICAgICAgICAgY29uc3QgJGdwVFMgPSB0b1htbE5vZGUoXCJfdHMuaXRlbS5ncm91cC50cGxcIik7XHJcbiAgICAgICAgICAgIGNvbnN0ICRncEpTID0gdG9YbWxOb2RlKFwiX2pzLml0ZW0uZ3JvdXAudHBsXCIpO1xyXG5cclxuICAgICAgICAgICAgJHByb2pcclxuICAgICAgICAgICAgICAgIC5maW5kKFwiSXRlbUdyb3VwXCIpXHJcbiAgICAgICAgICAgICAgICAubGFzdCgpXHJcbiAgICAgICAgICAgICAgICAuYWZ0ZXIoJGdwVFMpXHJcbiAgICAgICAgICAgICAgICAuYWZ0ZXIoJGdwSlMpXHJcbiAgICAgICAgICAgICAgICA7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBmb3JtYXRYTUwgPSBVdGlscy5mb3JtYXRYTUw7XHJcbiAgICAgICAgICAgIGNvbnN0IGRzdFBhdGggPSBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB2c1BhcmFtLnByb2plY3ROYW1lICsgXCIuY3Nwcm9qXCIpO1xyXG4gICAgICAgICAgICBkZWJ1ZyhVdGlscy54bWxOb2RlMlN0cigkcHJvaikpO1xyXG4gICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRzdFBhdGgsIGZvcm1hdFhNTChVdGlscy54bWxOb2RlMlN0cigkcHJvaikpKTtcclxuICAgICAgICB9KSgpO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWJyYXJ5L2dlbmVyYXRvci1tb2R1bGUudHMiLCJpbXBvcnQgeyBHZW5lcmF0b3JCYXNlLCBJUHJvamVjdENvbmZpZ3JhdGlvbiB9IGZyb20gXCIuLi9iYXNlXCI7XHJcbmltcG9ydCB7IEdlbmVyYXRvckNvcmRvdmEgfSBmcm9tIFwiLi9nZW5lcmF0b3ItY29yZG92YVwiO1xyXG5cclxuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0b3ItY29yZG92YVwiO1xyXG5cclxuLyoqXHJcbiAqIGdlbmVyYXRvciDnlJ/miJDplqLmlbBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBuZXdHZW5lcmF0b3JNb2JpbGUoY29uZmlnOiBJUHJvamVjdENvbmZpZ3JhdGlvbik6IEdlbmVyYXRvckJhc2Uge1xyXG4gICAgcmV0dXJuIG5ldyBHZW5lcmF0b3JDb3Jkb3ZhKGNvbmZpZyk7XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4uLy4uLy4uL3NyYy9nZW5lcmF0b3JzL21vYmlsZS9pbmRleC50cyIsImltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcclxuaW1wb3J0ICogYXMgb3MgZnJvbSBcIm9zXCI7XHJcbmltcG9ydCB7XHJcbiAgICBmcyxcclxuICAgIGdsb2IsXHJcbiAgICAkLFxyXG4gICAgXyxcclxuICAgIGhvZ2FuLFxyXG4gICAgZGVidWcsXHJcbiAgICB0ZW1wbGF0ZVBhdGgsXHJcbiAgICBjb3B5VHBsLFxyXG4gICAgZXhlY0NvbW1hbmQsXHJcbiAgICBzdHIyWG1sTm9kZSxcclxuICAgIHhtbE5vZGUyU3RyLFxyXG4gICAgbm9ybWFsaXplVGV4dCxcclxuICAgIGZvcm1hdFhNTCxcclxuICAgIGNyZWF0ZUdVSUQsXHJcbn0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XHJcbmltcG9ydCB7XHJcbiAgICBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbixcclxuICAgIElEZXBlbmRlbmN5LFxyXG4gICAgSVZpc3VhbFN0dWRpb0NvbmZpZ3JhdGlvbixcclxuICAgIEdlbmVyYXRvckJhc2UsXHJcbn0gZnJvbSBcIi4uL2Jhc2VcIjtcclxuaW1wb3J0IHsgSU1vYmlsZUFwcENvbmZpZ3JhdGlvbiB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3MgR2VuZXJhdG9yQ29yZG92YVxyXG4gKiBAYnJpZWYgTW9iaWxlIENvcmRvdmEg55SoIEdlbmVyYXRvciDjgq/jg6njgrlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBHZW5lcmF0b3JDb3Jkb3ZhIGV4dGVuZHMgR2VuZXJhdG9yQmFzZSB7XHJcblxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIC8vIGltcHJlbWVudGVzOiBHZW5lcmF0b3JCYXNlXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDml6Llrprjga4gZGlyZWN0b3J5IOani+mAoOOCkui/lOWNtFxyXG4gICAgICovXHJcbiAgICBkZWZhdWx0QmFzZVN0cnVjdHVyZSgpOiBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc3JjOiBcImFwcFwiLFxyXG4gICAgICAgICAgICBwa2c6IFwid3d3XCIsXHJcbiAgICAgICAgICAgIGJ1aWx0OiBcImFwcFwiLFxyXG4gICAgICAgICAgICBkb2M6IFwiZG9jc1wiLFxyXG4gICAgICAgICAgICB0YXNrOiBcInRhc2tzXCIsXHJcbiAgICAgICAgICAgIHRlc3Q6IFwidGVzdHNcIixcclxuICAgICAgICAgICAgdHlwZXM6IFwiQHR5cGVzXCIsXHJcbiAgICAgICAgICAgIHRlbXA6IFwiLnRlbXBcIixcclxuICAgICAgICAgICAgbGliOiBcImxpYlwiLFxyXG4gICAgICAgICAgICBleHRlcm5hbDogXCJleHRlcm5hbFwiLFxyXG4gICAgICAgICAgICBwb3J0aW5nOiBcInBvcnRpbmdcIixcclxuICAgICAgICAgICAgcmVzOiBcInJlc1wiLFxyXG4gICAgICAgICAgICBzcmNDb25maWc6IHtcclxuICAgICAgICAgICAgICAgIHNjcmlwdDogXCJzY3JpcHRzXCIsXHJcbiAgICAgICAgICAgICAgICBzdHlsZXNoZWV0OiBcInN0eWxlc2hlZXRzXCIsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogXCJ0ZW1wbGF0ZXNcIixcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogY3JlYXRlIGFjdGlvbiBlbnRyeVxyXG4gICAgICogQHBhcmFtIHtJTGlicmFyeUNvbmZpZ3JhdGlvbn0gY29uZmlnIOOCs+ODs+ODleOCo+OCsOioreWumlxyXG4gICAgICovXHJcbiAgICBhc3luYyBjcmVhdGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgZGVidWcoSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcsIG51bGwsIDQpKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVDb3Jkb3ZhKCkpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGRpcih0aGlzLnJvb3REaXIpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZUNvcmRvdmFTY2FmZm9sZCgpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNvbmZpZ1hNTCgpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkZENvcmRvdmFQbGF0Zm9ybXMoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRDb3Jkb3ZhUGx1Z2lucygpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkZENvcmRvdmFFeHRlbnRpb25GaWxlcygpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNhY2hlQ29yZG92YVBhY2thZ2VKU09OKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hkaXIoXCIuLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlRGlyZWN0b3J5U3RydWN0dXJlKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVQcm9qZWN0U2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZVNvdXJjZVRlbXBsYXRlKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVWaXN1YWxTdHVkaW9Tb2x1dGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5b+F6KaB44Go44GZ44KLIHRhc2sgc2NyaXB0IOS4gOimp+OCkui/lOWNtC4gYWN0aW9uOiBjcmVhdGUg44Gu44Go44GN44Gr5ZG844Gw44KM44KLXHJcbiAgICAgKi9cclxuICAgIGdldCB0YXNrTGlzdCgpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgXCJiYW5uZXIuanNcIixcclxuICAgICAgICAgICAgXCJjbGVhbi5qc1wiLFxyXG4gICAgICAgICAgICBcImNvbW1hbmQuanNcIixcclxuICAgICAgICAgICAgXCJleHRlcm5hbC1yZWFycmFuZ2UuanNcIixcclxuICAgICAgICAgICAgXCJtaW5pZnkuanNcIixcclxuICAgICAgICAgICAgXCJzcmNtYXAuanNcIixcclxuICAgICAgICAgICAgXCJidW5kbGUtZmluYWxpemVyLmpzXCIsXHJcbiAgICAgICAgICAgIFwicmVtYXAtY292ZXJhZ2UuanNcIixcclxuICAgICAgICBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAvLyBwcm90ZWN0ZWQgbWV0aG9kczpcclxuXHJcbiAgICAvKipcclxuICAgICAqIOmWi+eZuuaZguOBruS+neWtmOODouOCuOODpeODvOODq+ODquOCueODiOOBruWPluW+l1xyXG4gICAgICog5b+F6KaB44Gr5b+c44GY44Gm44Kq44O844OQ44O844Op44Kk44OJXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7SURlcGVuZGVuY3l9XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgZGVmYXVsdERldkRlcGVuZGVuY2llcygpOiBJRGVwZW5kZW5jeVtdIHtcclxuICAgICAgICBjb25zdCBkZXBlbmRzID0gc3VwZXIuZGVmYXVsdERldkRlcGVuZGVuY2llcy5jb25jYXQoW1xyXG4gICAgICAgICAgICB7IG5hbWU6IFwiQHR5cGVzL2phc21pbmVcIiwgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwiQHR5cGVzL3JlcXVpcmVqc1wiLCAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwiYXV0b3ByZWZpeGVyXCIsICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwiY2xlYW4tY3NzXCIsICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwiZnMtZXh0cmFcIiwgICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwiaHRtbC1taW5pZmllclwiLCAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwibm9kZS1zYXNzXCIsICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwicG9zdGNzcy1jbGlcIiwgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwic21hcnR3YXRjaFwiLCAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICBjb25zdCBleHRyYSA9IFtdO1xyXG4gICAgICAgIHRoaXMuY29uZmlnLmRldkRlcGVuZGVuY2llcy5mb3JFYWNoKChkZXBlbmQpID0+IHtcclxuICAgICAgICAgICAgZXh0cmEucHVzaCh7IG5hbWU6IGRlcGVuZC5uYW1lLCB2ZXJzaW9uOiBkZXBlbmQudmVyc2lvbiwgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlQ29yZG92YSgpKSB7XHJcbiAgICAgICAgICAgIGV4dHJhLnB1c2goeyBuYW1lOiBcIkB0eXBlcy9jb3Jkb3ZhXCIsIHZlcnNpb246IHVuZGVmaW5lZCwgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gXy5zb3J0QnkoZGVwZW5kcy5jb25jYXQoZXh0cmEpLCAoZGVwZW5kKSA9PiBkZXBlbmQubmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBlc2xpbnRyYyDjgavmjIflrprjgZnjgosgdGVtcGxhdGUgcGFyYW1hZXRlciDjgpLlj5blvpdcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IOODhuODs+ODl+ODrOODvOODiOODkeODqeODoeODvOOCv+OCquODluOCuOOCp+OCr+ODiFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgcXVlcnlFc0xpbnRFbnZQYXJhbSgpOiBhbnkge1xyXG4gICAgICAgIGNvbnN0IGJhc2UgPSBzdXBlci5xdWVyeUVzTGludEVudlBhcmFtKCk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uYmFzZSxcclxuICAgICAgICAgICAgLi4ue1xyXG4gICAgICAgICAgICAgICAgY29yZG92YTogdGhpcy5pc0VuYWJsZUNvcmRvdmEoKSxcclxuICAgICAgICAgICAgICAgIGhhbW1lcmpzOiB0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaGFtbWVyanNcIiksXHJcbiAgICAgICAgICAgICAgICBpc2Nyb2xsOiB0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaXNjcm9sbFwiKSxcclxuICAgICAgICAgICAgICAgIGZsaXBzbmFwOiB0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiZmxpcHNuYXBcIiksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHRzY29uZmlnLmJhc2Ug44Gr5oyH5a6a44GZ44KLIHRlbXBsYXRlIHBhcmFtYWV0ZXIg44KS5Y+W5b6XXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSDjg4bjg7Pjg5fjg6zjg7zjg4jjg5Hjg6njg6Hjg7zjgr/jgqrjg5bjgrjjgqfjgq/jg4hcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHF1ZXJ5VHNDb25maWdCYXNlUGFyYW0oKTogYW55IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi50aGlzLl9jb25maWcsXHJcbiAgICAgICAgICAgIC4uLntcclxuICAgICAgICAgICAgICAgIGNvcmRvdmE6IHRoaXMuaXNFbmFibGVDb3Jkb3ZhKCksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgLy8gcHJpdmF0ZSBtZXRob2RzOlxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6ZaL55m65pmC44Gu5L6d5a2Y44Oi44K444Ol44O844Or44Oq44K544OI44Gu5Y+W5b6XXHJcbiAgICAgKiDlv4XopoHjgavlv5zjgZjjgabjgqrjg7zjg5Djg7zjg6njgqTjg4lcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtJRGVwZW5kZW5jeX1cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXQgZGVmYXVsdERlcGVuZGVuY2llcygpOiBJRGVwZW5kZW5jeVtdIHtcclxuICAgICAgICBjb25zdCBkZXBlbmRzID0gW1xyXG4gICAgICAgICAgICB7IG5hbWU6IFwiQGNkcC9tb2JpbGVcIiwgIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiBcImJhY2tib25lXCIsICAgICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogXCJqcXVlcnlcIiwgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwicmVxdWlyZWpzXCIsICAgIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiBcInVuZGVyc2NvcmVcIiwgICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgY29uc3QgZXh0cmEgPSBbXTtcclxuICAgICAgICB0aGlzLmNvbmZpZy5kZXBlbmRlbmNpZXMuZm9yRWFjaCgoZGVwZW5kKSA9PiB7XHJcbiAgICAgICAgICAgIGV4dHJhLnB1c2goeyBuYW1lOiBkZXBlbmQubmFtZSwgdmVyc2lvbjogZGVwZW5kLnZlcnNpb24sIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gXy5zb3J0QnkoZGVwZW5kcy5jb25jYXQoZXh0cmEpLCAoZGVwZW5kKSA9PiBkZXBlbmQubmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBjb25maWdyYXRpb24g44Gr44Ki44Kv44K744K5XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0IGNvbmZpZygpOiBJTW9iaWxlQXBwQ29uZmlncmF0aW9uIHtcclxuICAgICAgICByZXR1cm4gPElNb2JpbGVBcHBDb25maWdyYXRpb24+dGhpcy5fY29uZmlnO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogY29yZG92YSDjga7mnInlirkv54Sh5Yq544OB44Kn44OD44KvXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgdHJ1ZTog5pyJ5Yq5IC8gZmFsc2U6IOeEoeWKuVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGlzRW5hYmxlQ29yZG92YSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKDAgPCB0aGlzLmNvbmZpZy5wbGF0Zm9ybXMubGVuZ3RoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGxpYi9wb3J0aW5nIOOBruioreWumueKtuazgeOBruODgeOCp+ODg+OCr1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB0YXJnZXRcclxuICAgICAqIEByZXR1cm5zIHRydWU6IOioreWumiAvIGZhbHNlOiDmnKroqK3lrppcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBoYXNTdHJ1Y3R1cmVPZih0YXJnZXQ6IFwibGliXCIgfCBcInBvcnRpbmdcIik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5jb25maWcucHJvamVjdFN0cnVjdHVyZSAmJiAwIDw9IHRoaXMuY29uZmlnLnByb2plY3RTdHJ1Y3R1cmUuaW5kZXhPZih0YXJnZXQpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOOCpOODs+OCueODiOODvOODq+WvvuixoS/pnZ7lr77osaHjg4Hjgqfjg4Pjgq9cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbmFtZSAgICBbaW5dIOODouOCuOODpeODvOODq+WQjVxyXG4gICAgICogQHBhcmFtIGRlcGVuZHMgW2luXSDmpJzntKLlr77osaEgKOaXouWumiB0aGlzLmNvbmZpZy5kZXBlbmRlbmNpZXMpXHJcbiAgICAgKiBAcmV0dXJucyB0cnVlOiDlr77osaEgLyBmYWxzZTog6Z2e5a++6LGhXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaXNJbnN0YWxsYXRpb25UYXJnZXQobmFtZTogc3RyaW5nLCBkZXBlbmRzOiBJRGVwZW5kZW5jeVtdID0gdGhpcy5jb25maWcuZGVwZW5kZW5jaWVzKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICEhZGVwZW5kcy5maW5kKChkZXBlbmQpID0+IG5hbWUgPT09IGRlcGVuZC5uYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogY29yZG92YSDjgpLnlKjjgYTjgZ/jg5fjg63jgrjjgqfjgq/jg4jkvZzmiJBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVDb3Jkb3ZhU2NhZmZvbGQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyhcIm1vYmlsZS5jcmVhdGUuY29yZG92YS5jcmVhdGVDb3Jkb3ZhU2NhZmZvbGRcIik7XHJcbiAgICAgICAgZGVidWcoXCJjcmVhdGVDb3Jkb3ZhU2NhZmZvbGRcIik7XHJcblxyXG4gICAgICAgIC8vIGAkIGNvcmRvdmEgY3JlYXRlIGNvb2wtbW9iaWxlIGNvbS5zb255LmNkcC5jb29sbW9iaWxlIFwiQ29vbCBNb2JpbGVcImBcclxuICAgICAgICBhd2FpdCBleGVjQ29tbWFuZChcImNvcmRvdmFcIiwgW1wiY3JlYXRlXCIsIHRoaXMuY29uZmlnLnByb2plY3ROYW1lLCB0aGlzLmNvbmZpZy5hcHBJZCwgdGhpcy5jb25maWcuYXBwTmFtZV0pO1xyXG5cclxuICAgICAgICAvLyByZW1vdmUgZmlsZXNcclxuICAgICAgICBnbG9iLnN5bmMoXCJ3d3cvKiovKlwiLCB7XHJcbiAgICAgICAgICAgIGN3ZDogdGhpcy5jb25maWcucHJvamVjdE5hbWUsXHJcbiAgICAgICAgfSkuZm9yRWFjaCgoZmlsZSkgPT4ge1xyXG4gICAgICAgICAgICBmcy5yZW1vdmVTeW5jKHBhdGguam9pbih0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZSwgZmlsZSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5qb2luKHRoaXMuY29uZmlnLnByb2plY3ROYW1lLCBcInJlc1wiKSk7XHJcbiAgICAgICAgZnMucmVtb3ZlU3luYyhwYXRoLmpvaW4odGhpcy5jb25maWcucHJvamVjdE5hbWUsIFwiLm5wbWlnbm9yZVwiKSk7XHJcblxyXG4gICAgICAgIC8vIG1vdmUgcm9vdCBkaXJlY3RvcnlcclxuICAgICAgICBmcy5jb3B5U3luYyh0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZSwgXCIuL1wiKTtcclxuICAgICAgICBmcy5yZW1vdmVTeW5jKHRoaXMuY29uZmlnLnByb2plY3ROYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGNvbmZpZy54bWwg44Gu5L+u5q2jXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgdXBkYXRlQ29uZmlnWE1MKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MoXCJtb2JpbGUuY3JlYXRlLmNvcmRvdmEudXBkYXRlQ29uZmlnWG1sXCIpO1xyXG4gICAgICAgIGRlYnVnKFwidXBkYXRlQ29uZmlnWE1MXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBjb25maWdYbWxQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiY29uZmlnLnhtbFwiKTtcclxuICAgICAgICBjb25zdCAkY29uZmlnWG1sRG9tID0gJChzdHIyWG1sTm9kZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnWG1sUGF0aCkudG9TdHJpbmcoKSkpO1xyXG5cclxuICAgICAgICAkY29uZmlnWG1sRG9tXHJcbiAgICAgICAgICAgIC5maW5kKFwid2lkZ2V0XCIpXHJcbiAgICAgICAgICAgIC5hdHRyKFwidmVyc2lvblwiLCB0aGlzLmNvbmZpZy52ZXJzaW9uKVxyXG4gICAgICAgICAgICAuYXR0cihcImlvcy1DRkJ1bmRsZUlkZW50aWZpZXJcIiwgdGhpcy5jb25maWcuYXBwSWQpXHJcbiAgICAgICAgICAgIC5wcmVwZW5kKHN0cjJYbWxOb2RlKGBcclxuICAgICAgICAgICAgICAgIDxwcmVmZXJlbmNlIG5hbWU9XCJEaXNhbGxvd092ZXJzY3JvbGxcIiB2YWx1ZT1cInRydWVcIi8+XHJcbiAgICAgICAgICAgICAgICA8cHJlZmVyZW5jZSBuYW1lPVwiS2V5Ym9hcmREaXNwbGF5UmVxdWlyZXNVc2VyQWN0aW9uXCIgdmFsdWU9XCJmYWxzZVwiLz5cclxuICAgICAgICAgICAgICAgIDxwcmVmZXJlbmNlIG5hbWU9XCJCYWNrZ3JvdW5kQ29sb3JcIiB2YWx1ZT1cIjB4ZmYwMDAwMDBcIiAvPlxyXG4gICAgICAgICAgICBgKSlcclxuICAgICAgICAgICAgO1xyXG5cclxuICAgICAgICAvLyByZW1vdmUgY29yZG92YSB0ZWFtIGluZm9ybWF0aW9uXHJcbiAgICAgICAgJGNvbmZpZ1htbERvbVxyXG4gICAgICAgICAgICAuZmluZChcImRlc2NyaXB0aW9uXCIpXHJcbiAgICAgICAgICAgIC5yZW1vdmUoKTtcclxuICAgICAgICAkY29uZmlnWG1sRG9tXHJcbiAgICAgICAgICAgIC5maW5kKFwiYXV0aG9yXCIpXHJcbiAgICAgICAgICAgIC5yZW1vdmUoKTtcclxuXHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdYbWxQYXRoLCBmb3JtYXRYTUwoeG1sTm9kZTJTdHIoJGNvbmZpZ1htbERvbSkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHBsYXRmb3JtIOi/veWKoFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGFkZENvcmRvdmFQbGF0Zm9ybXMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgZGVidWcoXCJhZGRDb3Jkb3ZhUGxhdGZvcm1zXCIpO1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXRzID0gdGhpcy5jb25maWcucGxhdGZvcm1zLnNsaWNlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGFyZ2V0cy5pbmRleE9mKFwiaW9zXCIpO1xyXG4gICAgICAgIGlmICgwIDw9IGluZGV4ICYmIFwiZGFyd2luXCIgIT09IHByb2Nlc3MucGxhdGZvcm0pIHtcclxuICAgICAgICAgICAgdGhpcy53YXJuKFwibW9iaWxlLmNyZWF0ZS5jb3Jkb3ZhLmlPU1dhcm5pbmdcIik7XHJcbiAgICAgICAgICAgIHRhcmdldHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgaWYgKHRhcmdldHMubGVuZ3RoIDw9IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyhcIm1vYmlsZS5jcmVhdGUuY29yZG92YS5hZGRQbGF0Zm9ybXNcIik7XHJcblxyXG4gICAgICAgIC8vIGAkIGNvcmRvdmEgcGxhdGZvcm0gYWRkIGFuZHJvaWQgaW9zYFxyXG4gICAgICAgIGF3YWl0IGV4ZWNDb21tYW5kKFwiY29yZG92YVwiLCBbXCJwbGF0Zm9ybVwiLCBcImFkZFwiXS5jb25jYXQodGFyZ2V0cykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogcGx1Z2luIOi/veWKoFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGFkZENvcmRvdmFQbHVnaW5zKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MoXCJtb2JpbGUuY3JlYXRlLmNvcmRvdmEuYWRkUGx1Z2luc1wiKTtcclxuICAgICAgICBkZWJ1ZyhcImFkZENvcmRvdmFQbHVnaW5zXCIpO1xyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIEkvRiDjga/opIfmlbDjga7jg5fjg6njgrDjgqTjg7PjgpLkuIDmi6zjgafov73liqDjgZnjgovjgZPjgajjgYzlj6/og73jgaDjgYzjgIFcclxuICAgICAgICAgKiBjb3Jkb3ZhIHZlcnNpb24g44KS5Yik5a6a44GX44Gm44GE44KL44OX44Op44Kw44Kk44Oz44Gv6Kqk5Yik5a6a44GZ44KL44GT44Go44GM44GC44KL44Gf44KB44CBXHJcbiAgICAgICAgICogMeOBpOOBmuOBpOi/veWKoOOBmeOCi1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICog5Lul5LiL44Gu5LiN5YW35ZCI44Gr6aGe5Ly844GZ44KL54++6LGhXHJcbiAgICAgICAgICogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQi0xMjY2M1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gdGhpcy5jb25maWcuY29yZG92YV9wbHVnaW4ubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIC8vIGAkIGNvcmRvdmEgcGx1Z2luIGFkZCBjb3Jkb3ZhLXBsdWdpbi1pbmFwcGJyb3dzZXJgXHJcbiAgICAgICAgICAgIGF3YWl0IGV4ZWNDb21tYW5kKFwiY29yZG92YVwiLCBbXCJwbHVnaW5cIiwgXCJhZGRcIiwgdGhpcy5jb25maWcuY29yZG92YV9wbHVnaW5baV0ubmFtZV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGNvcmRvdmEgcHJvamVjdCDjgavov73liqDjgZnjgovjg6rjgr3jg7zjgrnjgpLjgrPjg5Tjg7xcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBhZGRDb3Jkb3ZhRXh0ZW50aW9uRmlsZXMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyhcIm1vYmlsZS5jcmVhdGUuY29yZG92YS5hZGRFeHRlbnNpb25zXCIpO1xyXG4gICAgICAgIGRlYnVnKFwiYWRkQ29yZG92YUV4dGVudGlvbkZpbGVzXCIpO1xyXG4gICAgICAgIHRoaXMuY29weVRwbERpcihcIm1vYmlsZS9jb3Jkb3ZhXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogY29yZG92YSDjgYznlJ/miJDjgZfjgZ8gcGFja2FnZS5qc29uIOOCkuOCreODo+ODg+OCt+ODpVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGNhY2hlQ29yZG92YVBhY2thZ2VKU09OKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKFwiLi9wYWNrYWdlLmpzb25cIikpIHtcclxuICAgICAgICAgICAgdGhpcy5jb25maWcuY29yZG92YVBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoXCIuL3BhY2thZ2UuanNvblwiKS50b1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlbW92ZSBjb3Jkb3ZhIHRlYW0gaW5mb3JtYXRpb25cclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29uZmlnLmNvcmRvdmFQYWNrYWdlSnNvbi5uYW1lO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jb25maWcuY29yZG92YVBhY2thZ2VKc29uLnZlcnNpb247XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbmZpZy5jb3Jkb3ZhUGFja2FnZUpzb24uZGlzcGxheU5hbWU7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbmZpZy5jb3Jkb3ZhUGFja2FnZUpzb24ubWFpbjtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29uZmlnLmNvcmRvdmFQYWNrYWdlSnNvbi5zY3JpcHRzO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jb25maWcuY29yZG92YVBhY2thZ2VKc29uLmF1dGhvcjtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29uZmlnLmNvcmRvdmFQYWNrYWdlSnNvbi5kZXNjcmlwdGlvbjtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29uZmlnLmNvcmRvdmFQYWNrYWdlSnNvbi5saWNlbnNlO1xyXG5cclxuICAgICAgICAgICAgLy8g44OV44Kh44Kk44Or44Gv44GE44Gj44Gf44KT5YmK6ZmkXHJcbiAgICAgICAgICAgIGZzLnJlbW92ZVN5bmMoXCIuL3BhY2thZ2UuanNvblwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLy9cclxuXHJcbiAgICAvKipcclxuICAgICAqIOODh+OCo+ODrOOCr+ODiOODquani+aIkOaDheWgseOBruOCs+ODlOODvFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZURpcmVjdG9yeVN0cnVjdHVyZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnByb2dyZXNzKFwibW9iaWxlLmNyZWF0ZS5hcHAuY3JlYXRlRGlyZWN0b3J5U3RydWN0dXJlXCIpO1xyXG4gICAgICAgIGRlYnVnKFwiY3JlYXRlRGlyZWN0b3J5U3RydWN0dXJlXCIpO1xyXG5cclxuICAgICAgICAvLyBhcHAgYmFzZSBzdHJ1Y3R1cmVcclxuICAgICAgICB0aGlzLmNvcHlUcGxEaXIoXCJtb2JpbGUvc3RydWN0dXJlL2Jhc2VcIik7XHJcblxyXG4gICAgICAgIC8vIGxpYlxyXG4gICAgICAgIGlmICh0aGlzLmhhc1N0cnVjdHVyZU9mKFwibGliXCIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29weVRwbERpcihcclxuICAgICAgICAgICAgICAgIFwibW9iaWxlL3N0cnVjdHVyZS9saWJcIixcclxuICAgICAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMsIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5saWIpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBwb3J0aW5nXHJcbiAgICAgICAgaWYgKHRoaXMuaGFzU3RydWN0dXJlT2YoXCJwb3J0aW5nXCIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29weVRwbERpcihcclxuICAgICAgICAgICAgICAgIFwibW9iaWxlL3N0cnVjdHVyZS9wb3J0aW5nXCIsXHJcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcucG9ydGluZylcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGNyZWF0ZTogZGV2L3BvcnRpbmcvQHR5cGVzXHJcbiAgICAgICAgICAgIGZzLmNvcHlTeW5jKFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVQYXRoKFwiYmFzZS8uZ2l0a2VlcFwiKSxcclxuICAgICAgICAgICAgICAgIHBhdGguam9pbihcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3REaXIsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYyxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcucG9ydGluZyxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcudHlwZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgXCIuZ2l0a2VlcFwiXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBQTEFURk9STVNfUk9PVCA9IHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwicGxhdGZvcm1zXCIpO1xyXG4gICAgICAgICAgICBmcy5yZWFkZGlyU3luYyhQTEFURk9STVNfUk9PVClcclxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKChwbGF0Zm9ybSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmcy5zdGF0U3luYyhwYXRoLmpvaW4oUExBVEZPUk1TX1JPT1QsIHBsYXRmb3JtKSkuaXNEaXJlY3RvcnkoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvcHlUcGxEaXIoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm1vYmlsZS9zdHJ1Y3R1cmUvcG9ydGluZ1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKFBMQVRGT1JNU19ST09ULCBwbGF0Zm9ybSwgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnBvcnRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyB3d3dcclxuICAgICAgICBjb25zdCBXV1cgPSBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcucGtnKTtcclxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoV1dXKSkge1xyXG4gICAgICAgICAgICBmcy5ta2RpcihXV1cpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmcy5jb3B5U3luYyh0ZW1wbGF0ZVBhdGgoXCJiYXNlLy5naXRrZWVwXCIpLCBwYXRoLmpvaW4oV1dXLCBcIi5naXRrZWVwXCIpKTtcclxuXHJcbiAgICAgICAgLy8gdGFza1xyXG4gICAgICAgIGdsb2Iuc3luYyhcIioqLypcIiwge1xyXG4gICAgICAgICAgICBjd2Q6IHRlbXBsYXRlUGF0aChcIm1vYmlsZS90YXNrXCIpLFxyXG4gICAgICAgIH0pLmZvckVhY2goKGZpbGUpID0+IHtcclxuICAgICAgICAgICAgZnMuY29weVN5bmMoXHJcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibW9iaWxlL3Rhc2tcIiksIGZpbGUpLFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnRhc2ssIGZpbGUpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDjg5fjg63jgrjjgqfjgq/jg4joqK3lrprjg5XjgqHjgqTjg6vjga7kvZzmiJBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVQcm9qZWN0U2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyhcIm1vYmlsZS5jcmVhdGUuYXBwLmNyZWF0ZVByb2plY3RTZXR0aW5nc1wiKTtcclxuICAgICAgICBkZWJ1ZyhcImNyZWF0ZVByb2plY3RTZXR0aW5nc1wiKTtcclxuXHJcbiAgICAgICAgLy8gcHJvamVjdC5jb25maWcuanNcclxuICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibW9iaWxlXCIpLCBcIl9wcm9qZWN0LmNvbmZpZy5qc1wiKSxcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJwcm9qZWN0LmNvbmZpZy5qc1wiKSxcclxuICAgICAgICAgICAgJC5leHRlbmQoe30sIHRoaXMuX2NvbmZpZywge1xyXG4gICAgICAgICAgICAgICAgaG9nYW46IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJob2dhbi5qc1wiKSxcclxuICAgICAgICAgICAgICAgIGhhbW1lcmpzOiB0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaGFtbWVyanNcIiksXHJcbiAgICAgICAgICAgICAgICBpc2Nyb2xsOiB0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaXNjcm9sbFwiKSxcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyB0c2NvbmZpZ1xyXG4gICAgICAgIC8vIHRzY29uZmlnLmJhc2UuanNvblxyXG4gICAgICAgIGNvcHlUcGwoXHJcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJtb2JpbGVcIiksIFwiX3RzY29uZmlnLmJhc2UuanNvblwiKSxcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJ0c2NvbmZpZy5iYXNlLmpzb25cIiksXHJcbiAgICAgICAgICAgIHRoaXMucXVlcnlUc0NvbmZpZ0Jhc2VQYXJhbSgpLFxyXG4gICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIG1haW4gdHNjb25maWcuanNvblxyXG4gICAgICAgIGNvcHlUcGwoXHJcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJtb2JpbGVcIiksIFwiX3RzY29uZmlnLmpzb25cIiksXHJcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwidHNjb25maWcuanNvblwiKSxcclxuICAgICAgICAgICAgdGhpcy5fY29uZmlnLFxyXG4gICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIGVzbGludHJjLmpzb25cclxuICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibW9iaWxlXCIpLCBcIl9lc2xpbnRyYy5qc29uXCIpLFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnRlc3QsIFwiZXNsaW50XCIsIFwiZXNsaW50cmMuanNvblwiKSxcclxuICAgICAgICAgICAgdGhpcy5xdWVyeUVzTGludEVudlBhcmFtKCksXHJcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiLCBib206IGZhbHNlLCB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gdGVzdGVtXHJcbiAgICAgICAgY29weVRwbChcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZS90b29scy90ZXN0ZW1cIiksIFwiX3Rlc3RlbS5qc29uXCIpLFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnRlc3QsIFwicnVubmVyXCIsIFwidGVzdGVtLmpzb25cIiksXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcclxuICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIsIGJvbTogZmFsc2UsIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCB0ZXN0ZW1TdHVmZlBhdGggPSB0ZW1wbGF0ZVBhdGgoXCJtb2JpbGUvdG9vbHMvdGVzdGVtL3J1bm5lclwiKTtcclxuXHJcbiAgICAgICAgZ2xvYi5zeW5jKFwiKipcIiwge1xyXG4gICAgICAgICAgICBjd2Q6IHRlc3RlbVN0dWZmUGF0aCxcclxuICAgICAgICAgICAgbm9kaXI6IHRydWUsXHJcbiAgICAgICAgfSlcclxuICAgICAgICAgICAgLmZvckVhY2goKGZpbGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGZzLmNvcHlTeW5jKFxyXG4gICAgICAgICAgICAgICAgICAgIHBhdGguam9pbih0ZXN0ZW1TdHVmZlBhdGgsIGZpbGUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcudGVzdCwgXCJydW5uZXJcIiwgZmlsZSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyAuZ2l0aWdub3JlXHJcbiAgICAgICAgY29weVRwbChcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZVwiKSwgXCJfZ2l0aWdub3JlXCIpLFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcIi5naXRpZ25vcmVcIiksXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcclxuICAgICAgICAgICAgeyBib206IGZhbHNlLCB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gUkVBRE1FLm1kXHJcbiAgICAgICAgY29weVRwbChcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZVwiKSwgXCJfUkVBRE1FLm1kXCIpLFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcIlJFQURNRS5tZFwiKSxcclxuICAgICAgICAgICAgJC5leHRlbmQoe30sIHRoaXMuX2NvbmZpZywge1xyXG4gICAgICAgICAgICAgICAgY29yZG92YTogdGhpcy5pc0VuYWJsZUNvcmRvdmEoKSxcclxuICAgICAgICAgICAgICAgIGxpYjogdGhpcy5oYXNTdHJ1Y3R1cmVPZihcImxpYlwiKSxcclxuICAgICAgICAgICAgICAgIHBvcnRpbmc6IHRoaXMuaGFzU3RydWN0dXJlT2YoXCJwb3J0aW5nXCIpLFxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIFRPRE86IHRlbXBsYXRlcy9tb2JpbGUvYWRkb24g44GL44KJ44Kz44OU44O844GZ44KL5aC05ZCI44Gv44GT44GT44Gn5a++5b+cXHJcblxyXG4gICAgICAgIC8vIHBhY2thZ2UuanNvblxyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkQ29uZmlnID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMuY29uZmlnKTtcclxuICAgICAgICByZXNvbHZlZENvbmZpZy5kZXBlbmRlbmNpZXMgPSBhd2FpdCB0aGlzLnF1ZXJ5RGVwZW5kZW5jaWVzUGFyYW0odGhpcy5kZWZhdWx0RGVwZW5kZW5jaWVzKTtcclxuICAgICAgICByZXNvbHZlZENvbmZpZy5kZXZEZXBlbmRlbmNpZXMgPSBhd2FpdCB0aGlzLnF1ZXJ5RGVwZW5kZW5jaWVzUGFyYW0odGhpcy5kZWZhdWx0RGV2RGVwZW5kZW5jaWVzKTtcclxuICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibW9iaWxlXCIpLCBcIl9wYWNrYWdlLmpzb25cIiksXHJcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwicGFja2FnZS5qc29uXCIpLFxyXG4gICAgICAgICAgICByZXNvbHZlZENvbmZpZyxcclxuICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIsIGJvbTogZmFsc2UsIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyBjb3Jkb3ZhUGFja2FnZUpTT04g44Go44Oe44O844K4XHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmNvcmRvdmFQYWNrYWdlSnNvbikge1xyXG4gICAgICAgICAgICBjb25zdCBQS0dfUEFUSCA9IHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwicGFja2FnZS5qc29uXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhQS0dfUEFUSCkudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICQuZXh0ZW5kKHRydWUsIHBrZywgdGhpcy5jb25maWcuY29yZG92YVBhY2thZ2VKc29uKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNvcnRLZXlzID0gKHRhcmdldDogb2JqZWN0KTogb2JqZWN0ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRlZCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXModGFyZ2V0KS5zb3J0KCkuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc29ydGVkW2tleV0gPSB0YXJnZXRba2V5XTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvcnRlZDtcclxuXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHBrZy5kZXBlbmRlbmNpZXMgICAgPSBzb3J0S2V5cyhwa2cuZGVwZW5kZW5jaWVzKTtcclxuICAgICAgICAgICAgcGtnLmRldkRlcGVuZGVuY2llcyA9IHNvcnRLZXlzKHBrZy5kZXZEZXBlbmRlbmNpZXMpO1xyXG5cclxuICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhQS0dfUEFUSCwgSlNPTi5zdHJpbmdpZnkocGtnLCBudWxsLCAyKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog44K944O844K544Gu6Zub5b2i5L2c5oiQXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlU291cmNlVGVtcGxhdGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyhcIm1vYmlsZS5jcmVhdGUuYXBwLmNyZWF0ZVNvdXJjZVRlbXBsYXRlXCIpO1xyXG4gICAgICAgIGRlYnVnKFwiY3JlYXRlU291cmNlVGVtcGxhdGVcIik7XHJcblxyXG4gICAgICAgIC8vIGNvcHkgc291cmNlc1xyXG4gICAgICAgIHRoaXMuY29weVRwbERpcihcclxuICAgICAgICAgICAgXCJtb2JpbGUvc3JjL3N0cnVjdHVyZVwiLFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHsgLy8gY29uZmlnLnRzXHJcbiAgICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWwgPSAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmRlcGVuZGVuY2llcy5sZW5ndGggPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Q6IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0V2l0aEN1c3RvbU5hbWU6IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldHMgPSBbLi4udGhpcy5jb25maWcuZGVwZW5kZW5jaWVzLCAuLi50aGlzLmNvbmZpZy5yZXNvdXJjZV9hZGRvbl07XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRzLmZvckVhY2goKGluZm8pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5maWxlTmFtZSB8fCBpbmZvLnZlbmRlck5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uYWRkaXRpb25hbC5saXN0V2l0aEN1c3RvbU5hbWUucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lOiBpbmZvLmFsaWFzIHx8IGluZm8ubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRlck5hbWU6IGluZm8udmVuZGVyTmFtZSB8fCBpbmZvLmFsaWFzIHx8IGluZm8ubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBpbmZvLmZpbGVOYW1lIHx8IGluZm8uYWxpYXMgfHwgaW5mby5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5hZGRpdGlvbmFsLmxpc3QucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lOiBpbmZvLmFsaWFzIHx8IGluZm8ubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW07XHJcbiAgICAgICAgICAgIH0pKCk7XHJcblxyXG4gICAgICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZS9zcmNcIiksIFwiX2NvbmZpZy50c1wiKSxcclxuICAgICAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMsIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmNDb25maWcuc2NyaXB0LCBcImNvbmZpZy50c1wiKSxcclxuICAgICAgICAgICAgICAgICQuZXh0ZW5kKHt9LCB0aGlzLl9jb25maWcsIGFkZGl0aW9uYWwpLFxyXG4gICAgICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgeyAvLyBhcHAudHNcclxuICAgICAgICAgICAgY29uc3QgZ2xvYmFscyA9ICgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWcuZGVwZW5kZW5jaWVzLmxlbmd0aCA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbHM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0c0xpc3Q6IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzTGlzdDogW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0V4cG9ydHM6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldHMgPSBbLi4udGhpcy5jb25maWcuZGVwZW5kZW5jaWVzLCAuLi50aGlzLmNvbmZpZy5yZXNvdXJjZV9hZGRvbl07XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRzLmZvckVhY2goKGluZm8pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5nbG9iYWxFeHBvcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZ2xvYmFscy5leHBvcnRzTGlzdC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbEV4cG9ydDogaW5mby5nbG9iYWxFeHBvcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lOiBpbmZvLmFsaWFzIHx8IGluZm8ubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZ2xvYmFscy5pbXBvcnRzTGlzdC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZU5hbWU6IGluZm8uYWxpYXMgfHwgaW5mby5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHBhcmFtLmdsb2JhbHMuaGFzRXhwb3J0cyA9ICgwIDwgcGFyYW0uZ2xvYmFscy5leHBvcnRzTGlzdC5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtO1xyXG4gICAgICAgICAgICB9KSgpO1xyXG5cclxuICAgICAgICAgICAgY29weVRwbChcclxuICAgICAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJtb2JpbGUvc3JjXCIpLCBcIl9hcHAudHNcIiksXHJcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjQ29uZmlnLnNjcmlwdCwgXCJhcHAudHNcIiksXHJcbiAgICAgICAgICAgICAgICBnbG9iYWxzLFxyXG4gICAgICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgey8vIGxvY2FsaXplIHJlc291cmNlc1xyXG4gICAgICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZS9zcmMvX2xvY2FsZXNcIiksIFwiX21lc3NhZ2VzLmVuLVVTLmpzb25cIiksXHJcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4oXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290RGlyLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnJlcyxcclxuICAgICAgICAgICAgICAgICAgICBcImxvY2FsZXNcIixcclxuICAgICAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzLmVuLVVTLmpzb25cIlxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIsIGJvbTogZmFsc2UsIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgY29weVRwbChcclxuICAgICAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJtb2JpbGUvc3JjL19sb2NhbGVzXCIpLCBcIl9tZXNzYWdlcy5qYS1KUC5qc29uXCIpLFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdERpcixcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5yZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsb2NhbGVzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJtZXNzYWdlcy5qYS1KUC5qc29uXCJcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZyxcclxuICAgICAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiLCBib206IGZhbHNlLCB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIC8vIHJlbW92ZSAuZ2l0a2VlcFxyXG4gICAgICAgICAgICBmcy51bmxpbmtTeW5jKHBhdGguam9pbihcclxuICAgICAgICAgICAgICAgIHRoaXMucm9vdERpcixcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcucmVzLFxyXG4gICAgICAgICAgICAgICAgXCIuZ2l0a2VlcFwiXHJcbiAgICAgICAgICAgICkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgey8vIHBhdGNoLmRlcGVuZGVuY2llc1xyXG4gICAgICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZS9zcmMvX3BhdGNoLmRlcGVuZGVuY2llc1wiKSwgXCJfaW5kZXguZC50c1wiKSxcclxuICAgICAgICAgICAgICAgIHBhdGguam9pbihcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3REaXIsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYyxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuZXh0ZXJuYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnR5cGVzLFxyXG4gICAgICAgICAgICAgICAgICAgIFwicGF0Y2guZGVwZW5kZW5jaWVzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJpbmRleC5kLnRzXCJcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaGFtbWVyanM6IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJoYW1tZXJqc1wiKSxcclxuICAgICAgICAgICAgICAgICAgICBmbGlwc25hcDogdGhpcy5pc0luc3RhbGxhdGlvblRhcmdldChcImZsaXBzbmFwXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzY3JvbGw6IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJpc2Nyb2xsXCIpLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgLy8gY29weSBwYXRjaCBkLnRzXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaGFtbWVyanNcIikpIHtcclxuICAgICAgICAgICAgICAgIGZzLmNvcHlTeW5jKHRlbXBsYXRlUGF0aChcIm1vYmlsZS9zcmMvX3BhdGNoLmRlcGVuZGVuY2llcy9qcXVlcnkuaGFtbWVyLmQudHNcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3REaXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5leHRlcm5hbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnR5cGVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInBhdGNoLmRlcGVuZGVuY2llc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImpxdWVyeS5oYW1tZXIuZC50c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJmbGlwc25hcFwiKSkge1xyXG4gICAgICAgICAgICAgICAgZnMuY29weVN5bmModGVtcGxhdGVQYXRoKFwibW9iaWxlL3NyYy9fcGF0Y2guZGVwZW5kZW5jaWVzL2ZsaXBzbmFwLmQudHNcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3REaXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5leHRlcm5hbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnR5cGVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInBhdGNoLmRlcGVuZGVuY2llc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZsaXBzbmFwLmQudHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaXNjcm9sbFwiKSkge1xyXG4gICAgICAgICAgICAgICAgZnMuY29weVN5bmModGVtcGxhdGVQYXRoKFwibW9iaWxlL3NyYy9fcGF0Y2guZGVwZW5kZW5jaWVzL2lzY3JvbGwuZC50c1wiKSxcclxuICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdERpcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLmV4dGVybmFsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcudHlwZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicGF0Y2guZGVwZW5kZW5jaWVzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaXNjcm9sbC5kLnRzXCJcclxuICAgICAgICAgICAgICAgICAgICApKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gcmVtb3ZlIC5naXRrZWVwXHJcbiAgICAgICAgICAgIGZzLnVubGlua1N5bmMocGF0aC5qb2luKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5yb290RGlyLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYyxcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5leHRlcm5hbCxcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50eXBlcyxcclxuICAgICAgICAgICAgICAgIFwiLmdpdGtlZXBcIlxyXG4gICAgICAgICAgICApKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHsvLyBpbmRleC5odG1sXHJcbiAgICAgICAgICAgIGNvcHlUcGwoXHJcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibW9iaWxlL3NyY1wiKSwgXCJfaW5kZXguaHRtbFwiKSxcclxuICAgICAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMsIFwiaW5kZXguaHRtbFwiKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmlzdWFsIFN0dWRpbyDjga7jgr3jg6rjg6Xjg7zjgrfjg6fjg7Pjg5XjgqHjgqTjg6vkvZzmiJBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVWaXN1YWxTdHVkaW9Tb2x1dGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCB2c1BhcmFtID0gKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcGFyYW06IElWaXN1YWxTdHVkaW9Db25maWdyYXRpb24gPSA8YW55PiQuZXh0ZW5kKHt9LCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnKTtcclxuXHJcbiAgICAgICAgICAgIHBhcmFtLnByb2plY3ROYW1lID0gdGhpcy5fY29uZmlnLnByb2plY3ROYW1lO1xyXG4gICAgICAgICAgICBwYXJhbS5wcm9qZWN0R1VJRCA9IGNyZWF0ZUdVSUQoKTtcclxuICAgICAgICAgICAgcGFyYW0udHlwZXMgPSBwYXJhbS50eXBlcy5yZXBsYWNlKFwiQFwiLCBcIiU0MFwiKTsgLy8gZXNjYXBlIFwiQFwiIHRvIFwiJTQwXCJcclxuICAgICAgICAgICAgcGFyYW0ubGljZW5zZSA9ICF0aGlzLl9jb25maWcucHJpdmF0ZTtcclxuXHJcbiAgICAgICAgICAgIC8vIGV4dGVybmFsXHJcbiAgICAgICAgICAgICg8YW55PnBhcmFtKS5jb3Jkb3ZhICAgID0gdGhpcy5pc0VuYWJsZUNvcmRvdmEoKTtcclxuICAgICAgICAgICAgKDxhbnk+cGFyYW0pLmhvZ2FuICAgICAgPSB0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaG9nYW4uanNcIik7XHJcbiAgICAgICAgICAgICg8YW55PnBhcmFtKS5oYW1tZXJqcyAgID0gdGhpcy5pc0luc3RhbGxhdGlvblRhcmdldChcImhhbW1lcmpzXCIpO1xyXG4gICAgICAgICAgICAoPGFueT5wYXJhbSkuaXNjcm9sbCAgICA9IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJpc2Nyb2xsXCIpO1xyXG4gICAgICAgICAgICAoPGFueT5wYXJhbSkuZmxpcHNuYXAgICA9IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJmbGlwc25hcFwiKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHByb2plY3Qgc3RydWN0dXJlXHJcbiAgICAgICAgICAgICg8YW55PnBhcmFtKS5lbmFibGVMaWIgICAgICA9IHRoaXMuaGFzU3RydWN0dXJlT2YoXCJsaWJcIik7XHJcbiAgICAgICAgICAgICg8YW55PnBhcmFtKS5lbmFibGVQb3J0aW5nICA9IHRoaXMuaGFzU3RydWN0dXJlT2YoXCJwb3J0aW5nXCIpO1xyXG5cclxuICAgICAgICAgICAgLy8gcGxhdGZvcm1zXHJcbiAgICAgICAgICAgICg8YW55PnBhcmFtKS5wbGF0Zm9ybXMgPSBbLi4udGhpcy5jb25maWcucGxhdGZvcm1zXTtcclxuXHJcbiAgICAgICAgICAgIC8vIHNldHVwIGJ1aWx0IHRzIGdyb3VwXHJcbiAgICAgICAgICAgIHBhcmFtLnRzR3JvdXAgPSBbXTtcclxuICAgICAgICAgICAgZ2xvYi5zeW5jKFwiKiovKi50c1wiLCB7XHJcbiAgICAgICAgICAgICAgICBjd2Q6IHBhdGguam9pbihcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3REaXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW0uc3JjLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtLnNyY0NvbmZpZy5zY3JpcHRcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIH0pLmZvckVhY2goKGZpbGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGguam9pbihcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbS5zcmMsXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW0uc3JjQ29uZmlnLnNjcmlwdCxcclxuICAgICAgICAgICAgICAgICAgICBwYXRoLmRpcm5hbWUoZmlsZSlcclxuICAgICAgICAgICAgICAgICkucmVwbGFjZSgvXFwvL2csIFwiXFxcXFwiKSArIFwiXFxcXFwiO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGUsIFwiLnRzXCIpO1xyXG4gICAgICAgICAgICAgICAgcGFyYW0udHNHcm91cC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVBhdGg6IHJlbGF0aXZlUGF0aCxcclxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogZmlsZU5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZWU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgbWFwOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gc2V0dXAgdGVzdCB0cyBncm91cFxyXG4gICAgICAgICAgICBnbG9iLnN5bmMoXCIqKi8qLnRzXCIsIHtcclxuICAgICAgICAgICAgICAgIGN3ZDogcGF0aC5qb2luKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdERpcixcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcudGVzdCxcclxuICAgICAgICAgICAgICAgICAgICBcInVuaXRcIlxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgfSkuZm9yRWFjaCgoZmlsZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGFyYW0udGVzdCArIFwiXFxcXHVuaXRcXFxcXCI7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZSwgXCIudHNcIik7XHJcbiAgICAgICAgICAgICAgICBwYXJhbS50c0dyb3VwLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlUGF0aDogcmVsYXRpdmVQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBmaWxlTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICBkZXBlbmRlZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBtYXA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XHJcbiAgICAgICAgfSkoKTtcclxuXHJcbiAgICAgICAgLy8gLnNsblxyXG4gICAgICAgIGNvcHlUcGwoXHJcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJiYXNlL3Zpc3VhbC5zdHVkaW9cIiksIFwiX3NvbHV0aW9uLnNsbi50cGxcIiksXHJcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIHZzUGFyYW0ucHJvamVjdE5hbWUgKyBcIi5zbG5cIiksXHJcbiAgICAgICAgICAgIHZzUGFyYW0sXHJcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyAuY3Nwcm9qXHJcbiAgICAgICAgKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdG9YbWxTdHJpbmcgPSAoZmlsZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGVvbDogb3MuRU9MLFxyXG4gICAgICAgICAgICAgICAgICAgIGJvbTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXJzOiBcInt7IH19XCIsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgY29uc3QganN0ID0gaG9nYW4uY29tcGlsZShub3JtYWxpemVUZXh0KGZzLnJlYWRGaWxlU3luYyhmaWxlKS50b1N0cmluZygpLCB7IGVvbDogXCJcXG5cIiwgYm9tOiBmYWxzZSB9KSwgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ganN0LnJlbmRlcih2c1BhcmFtKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRvWG1sRE9NID0gKGZpbGU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoJC5wYXJzZVhNTCh0b1htbFN0cmluZyhmaWxlKSkpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdG9YbWxOb2RlID0gKGZpbGU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0cjJYbWxOb2RlKHRvWG1sU3RyaW5nKGZpbGUpKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0ICRwcm9qID0gdG9YbWxET00ocGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZS92aXN1YWwuc3R1ZGlvXCIpLCBcIl9wcm9qZWN0LmNzcHJvai50cGxcIikpO1xyXG4gICAgICAgICAgICBjb25zdCAkZ3BUUyA9IHRvWG1sTm9kZShwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwiYmFzZS92aXN1YWwuc3R1ZGlvXCIpLCBcIl90cy5pdGVtLmdyb3VwLnRwbFwiKSk7XHJcblxyXG4gICAgICAgICAgICAkcHJvalxyXG4gICAgICAgICAgICAgICAgLmZpbmQoXCJJdGVtR3JvdXBcIilcclxuICAgICAgICAgICAgICAgIC5sYXN0KClcclxuICAgICAgICAgICAgICAgIC5hZnRlcigkZ3BUUylcclxuICAgICAgICAgICAgICAgIDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRzdFBhdGggPSBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB2c1BhcmFtLnByb2plY3ROYW1lICsgXCIuY3Nwcm9qXCIpO1xyXG4gICAgICAgICAgICBkZWJ1Zyh4bWxOb2RlMlN0cigkcHJvaikpO1xyXG4gICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRzdFBhdGgsIGZvcm1hdFhNTCh4bWxOb2RlMlN0cigkcHJvaikpKTtcclxuICAgICAgICB9KSgpO1xyXG5cclxuICAgICAgICAvLyB3ZWIuY29uZmlnXHJcbiAgICAgICAgZnMuY29weVN5bmModGVtcGxhdGVQYXRoKFwibW9iaWxlL3Zpc3VhbC5zdHVkaW8vX3dlYi5jb25maWdcIiksIHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwid2ViLmNvbmZpZ1wiKSk7XHJcbiAgICAgICAgZnMuY29weVN5bmModGVtcGxhdGVQYXRoKFwibW9iaWxlL3Zpc3VhbC5zdHVkaW8vX3dlYi5EZWJ1Zy5jb25maWdcIiksIHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwid2ViLkRlYnVnLmNvbmZpZ1wiKSk7XHJcbiAgICAgICAgZnMuY29weVN5bmModGVtcGxhdGVQYXRoKFwibW9iaWxlL3Zpc3VhbC5zdHVkaW8vX3dlYi5SZWxlYXNlLmNvbmZpZ1wiKSwgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJ3ZWIuUmVsZWFzZS5jb25maWdcIikpO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi8uLi9zcmMvZ2VuZXJhdG9ycy9tb2JpbGUvZ2VuZXJhdG9yLWNvcmRvdmEudHMiLCJpbXBvcnQgeyBHZW5lcmF0b3JCYXNlLCBJUHJvamVjdENvbmZpZ3JhdGlvbiB9IGZyb20gXCIuLi9iYXNlXCI7XHJcbmltcG9ydCB7IEdlbmVyYXRvckVsZWN0cm9uIH0gZnJvbSBcIi4vZ2VuZXJhdG9yLWVsZWN0b3JvblwiO1xyXG5cclxuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0b3ItZWxlY3Rvcm9uXCI7XHJcblxyXG4vKipcclxuICogZ2VuZXJhdG9yIOeUn+aIkOmWouaVsFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG5ld0dlbmVyYXRvckRlc2t0b3AoY29uZmlnOiBJUHJvamVjdENvbmZpZ3JhdGlvbik6IEdlbmVyYXRvckJhc2Uge1xyXG4gICAgcmV0dXJuIG5ldyBHZW5lcmF0b3JFbGVjdHJvbihjb25maWcpO1xyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi8uLi9zcmMvZ2VuZXJhdG9ycy9kZXNrdG9wL2luZGV4LnRzIiwiLyogdHNsaW50OmRpc2FibGU6bm8tdW51c2VkLXZhcmlhYmxlIG5vLXVudXNlZC12YXJzICovXHJcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXHJcblxyXG5pbXBvcnQgeyBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbiwgR2VuZXJhdG9yQmFzZSB9IGZyb20gXCIuLi9iYXNlXCI7XHJcbmltcG9ydCB7IElEZXNrdG9wQXBwQ29uZmlncmF0aW9uIH0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzcyBHZW5lcmF0b3JFbGVjdHJvblxyXG4gKiBAYnJpZWYgRGVza3RvcCBFbGVjdHJvbiDnlKggR2VuZXJhdG9yIOOCr+ODqeOCuVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEdlbmVyYXRvckVsZWN0cm9uIGV4dGVuZHMgR2VuZXJhdG9yQmFzZSB7XHJcblxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIC8vIGltcHJlbWVudGVzOiBHZW5lcmF0b3JCYXNlXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDml6Llrprjga4gZGlyZWN0b3J5IOani+mAoOOCkui/lOWNtFxyXG4gICAgICovXHJcbiAgICBkZWZhdWx0QmFzZVN0cnVjdHVyZSgpOiBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc3JjOiBcImFwcFwiLFxyXG4gICAgICAgICAgICBwa2c6IFwid3d3L2FwcFwiLCAvLyBUT0RPOiDmmqvlrppcclxuICAgICAgICAgICAgYnVpbHQ6IFwiYXBwXCIsXHJcbiAgICAgICAgICAgIGRvYzogXCJkb2NzXCIsXHJcbiAgICAgICAgICAgIHRhc2s6IFwidGFza3NcIixcclxuICAgICAgICAgICAgdGVzdDogXCJ0ZXN0c1wiLFxyXG4gICAgICAgICAgICB0eXBlczogXCJAdHlwZXNcIixcclxuICAgICAgICAgICAgc3JjQ29uZmlnOiB7XHJcbiAgICAgICAgICAgICAgICBzY3JpcHQ6IFwic2NyaXB0c1wiLFxyXG4gICAgICAgICAgICAgICAgc3R5bGVzaGVldDogXCJzdHlsZXNoZWV0c1wiLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IFwidGVtcGxhdGVzXCIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGNyZWF0ZSBhY3Rpb24gZW50cnlcclxuICAgICAqIEBwYXJhbSB7SURlc2t0b3BBcHBDb25maWdyYXRpb259IGNvbmZpZyDjgrPjg7Pjg5XjgqPjgrDoqK3lrppcclxuICAgICAqL1xyXG4gICAgYXN5bmMgY3JlYXRlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIC8vIFRPRE86XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFwidW5kZXIgY29uc3RydWN0aW9uLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW/heimgeOBqOOBmeOCiyB0YXNrIHNjcmlwdCDkuIDopqfjgpLov5TljbQuIGFjdGlvbjogY3JlYXRlIOOBruOBqOOBjeOBq+WRvOOBsOOCjOOCi1xyXG4gICAgICovXHJcbiAgICBnZXQgdGFza0xpc3QoKTogc3RyaW5nW10ge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIFwiYmFubmVyLmpzXCIsXHJcbiAgICAgICAgICAgIFwiY2xlYW4uanNcIixcclxuICAgICAgICAgICAgXCJzcmNtYXAuanNcIixcclxuICAgICAgICAgICAgXCJidWlsZC10cy1jbGVhbi5qc1wiLFxyXG4gICAgICAgICAgICBcImJ1aWxkLXRzLW5vcm1hbGl6ZS5qc1wiLFxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcblxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIC8vIHByaXZhdGUgbWV0aG9kczpcclxuXHJcbiAgICAvKipcclxuICAgICAqIGNvbmZpZ3JhdGlvbiDjgavjgqLjgq/jgrvjgrlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXQgY29uZmlnKCk6IElEZXNrdG9wQXBwQ29uZmlncmF0aW9uIHtcclxuICAgICAgICByZXR1cm4gPElEZXNrdG9wQXBwQ29uZmlncmF0aW9uPnRoaXMuX2NvbmZpZztcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vLi4vc3JjL2dlbmVyYXRvcnMvZGVza3RvcC9nZW5lcmF0b3ItZWxlY3Rvcm9uLnRzIiwiaW1wb3J0IHsgR2VuZXJhdG9yQmFzZSwgSVByb2plY3RDb25maWdyYXRpb24gfSBmcm9tIFwiLi4vYmFzZVwiO1xyXG5pbXBvcnQgeyBHZW5lcmF0b3JCcm93c2VyIH0gZnJvbSBcIi4vZ2VuZXJhdG9yLWJyb3dzZXJcIjtcclxuXHJcbmV4cG9ydCAqIGZyb20gXCIuL2ludGVyZmFjZXNcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vZ2VuZXJhdG9yLWJyb3dzZXJcIjtcclxuXHJcbi8qKlxyXG4gKiBnZW5lcmF0b3Ig55Sf5oiQ6Zai5pWwXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbmV3R2VuZXJhdG9yV2ViKGNvbmZpZzogSVByb2plY3RDb25maWdyYXRpb24pOiBHZW5lcmF0b3JCYXNlIHtcclxuICAgIHJldHVybiBuZXcgR2VuZXJhdG9yQnJvd3Nlcihjb25maWcpO1xyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi8uLi9zcmMvZ2VuZXJhdG9ycy93ZWIvaW5kZXgudHMiLCIvKiB0c2xpbnQ6ZGlzYWJsZTpuby11bnVzZWQtdmFyaWFibGUgbm8tdW51c2VkLXZhcnMgKi9cclxuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cclxuXHJcbmltcG9ydCB7IElCYXNlU3RydWN0dXJlQ29uZmlncmF0aW9uLCBHZW5lcmF0b3JCYXNlIH0gZnJvbSBcIi4uL2Jhc2VcIjtcclxuaW1wb3J0IHsgSVdlYkFwcENvbmZpZ3JhdGlvbiB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3MgR2VuZXJhdG9yQnJvd3NlclxyXG4gKiBAYnJpZWYgV2ViIEJyb3dzZXIg55SoIEdlbmVyYXRvciDjgq/jg6njgrlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBHZW5lcmF0b3JCcm93c2VyIGV4dGVuZHMgR2VuZXJhdG9yQmFzZSB7XHJcblxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIC8vIGltcHJlbWVudGVzOiBHZW5lcmF0b3JCYXNlXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDml6Llrprjga4gZGlyZWN0b3J5IOani+mAoOOCkui/lOWNtFxyXG4gICAgICovXHJcbiAgICBkZWZhdWx0QmFzZVN0cnVjdHVyZSgpOiBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc3JjOiBcImFwcFwiLFxyXG4gICAgICAgICAgICBwa2c6IFwid3d3XCIsXHJcbiAgICAgICAgICAgIGJ1aWx0OiBcImFwcFwiLFxyXG4gICAgICAgICAgICBkb2M6IFwiZG9jc1wiLFxyXG4gICAgICAgICAgICB0YXNrOiBcInRhc2tzXCIsXHJcbiAgICAgICAgICAgIHRlc3Q6IFwidGVzdHNcIixcclxuICAgICAgICAgICAgdHlwZXM6IFwiQHR5cGVzXCIsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGNyZWF0ZSBhY3Rpb24gZW50cnlcclxuICAgICAqIEBwYXJhbSB7SUxpYnJhcnlDb25maWdyYXRpb259IGNvbmZpZyDjgrPjg7Pjg5XjgqPjgrDoqK3lrppcclxuICAgICAqL1xyXG4gICAgYXN5bmMgY3JlYXRlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIC8vIFRPRE86XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFwidW5kZXIgY29uc3RydWN0aW9uLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW/heimgeOBqOOBmeOCiyB0YXNrIHNjcmlwdCDkuIDopqfjgpLov5TljbQuIGFjdGlvbjogY3JlYXRlIOOBruOBqOOBjeOBq+WRvOOBsOOCjOOCi1xyXG4gICAgICovXHJcbiAgICBnZXQgdGFza0xpc3QoKTogc3RyaW5nW10ge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIFwiYmFubmVyLmpzXCIsXHJcbiAgICAgICAgICAgIFwiY2xlYW4uanNcIixcclxuICAgICAgICAgICAgXCJzcmNtYXAuanNcIixcclxuICAgICAgICAgICAgXCJidWlsZC10cy1jbGVhbi5qc1wiLFxyXG4gICAgICAgICAgICBcImJ1aWxkLXRzLW5vcm1hbGl6ZS5qc1wiLFxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcblxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIC8vIHByaXZhdGUgbWV0aG9kczpcclxuXHJcbiAgICAvKipcclxuICAgICAqIGNvbmZpZ3JhdGlvbiDjgavjgqLjgq/jgrvjgrlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXQgY29uZmlnKCk6IElXZWJBcHBDb25maWdyYXRpb24ge1xyXG4gICAgICAgIHJldHVybiA8SVdlYkFwcENvbmZpZ3JhdGlvbj50aGlzLl9jb25maWc7XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4uLy4uLy4uL3NyYy9nZW5lcmF0b3JzL3dlYi9nZW5lcmF0b3ItYnJvd3Nlci50cyIsImltcG9ydCAqIGFzIFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmV4cG9ydCB7IFV0aWxzIH07XHJcblxyXG5pbXBvcnQge1xyXG4gICAgSVNvdXJjZURpcmN0b3J5Q29uZmlncmF0aW9uLFxyXG4gICAgSUJhc2VTdHJ1Y3R1cmVDb25maWdyYXRpb24sXHJcbiAgICBJUHJvamVjdENvbmZpZ3JhdGlvbixcclxuICAgIElCdWlsZFRhcmdldENvbmZpZ3JhdGlvbixcclxuICAgIElMaWJyYXJ5Q29uZmlncmF0aW9uLFxyXG4gICAgSUV4dGVybmFsTW9kdWxlSW5mbyxcclxuICAgIElFeHRlcm5hbE1vZHVsZXMsXHJcbiAgICBJTW9iaWxlQXBwQ29uZmlncmF0aW9uLFxyXG4gICAgSURlc2t0b3BBcHBDb25maWdyYXRpb24sXHJcbiAgICBJV2ViQXBwQ29uZmlncmF0aW9uLFxyXG4gICAgLy8vL1xyXG4gICAgbmV3R2VuZXJhdG9yXHJcbn0gZnJvbSBcIi4vZ2VuZXJhdG9yc1wiO1xyXG5cclxuZXhwb3J0IHtcclxuICAgIElTb3VyY2VEaXJjdG9yeUNvbmZpZ3JhdGlvbixcclxuICAgIElCYXNlU3RydWN0dXJlQ29uZmlncmF0aW9uLFxyXG4gICAgSVByb2plY3RDb25maWdyYXRpb24sXHJcbiAgICBJQnVpbGRUYXJnZXRDb25maWdyYXRpb24sXHJcbiAgICBJTGlicmFyeUNvbmZpZ3JhdGlvbixcclxuICAgIElFeHRlcm5hbE1vZHVsZUluZm8sXHJcbiAgICBJRXh0ZXJuYWxNb2R1bGVzLFxyXG4gICAgSU1vYmlsZUFwcENvbmZpZ3JhdGlvbixcclxuICAgIElEZXNrdG9wQXBwQ29uZmlncmF0aW9uLFxyXG4gICAgSVdlYkFwcENvbmZpZ3JhdGlvbixcclxufTtcclxuXHJcbi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vXHJcblxyXG4vKipcclxuICogQGNsYXNzIENEUExpYlxyXG4gKiBAYnJpZWYgQ0RQIGJvaWxlcnBsYXRlIOeUn+aIkOapn+iDveOCkuaPkOS+m+OBmeOCi+OCr+ODqeOCuVxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ0RQTGliIHtcclxuXHJcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgLy8gcHViaWMgbWV0aG9kczpcclxuXHJcbiAgICAvKipcclxuICAgICAqIG1haW4gY29tbWFuZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGV4ZWN1dGUoY29uZmlnOiBJUHJvamVjdENvbmZpZ3JhdGlvbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIFV0aWxzLnNldFNldHRpbmdzKGNvbmZpZy5zZXR0aW5ncyk7XHJcbiAgICAgICAgcmV0dXJuIG5ld0dlbmVyYXRvcihjb25maWcpLnJ1bigpO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi9zcmMvY2RwLWxpYi50cyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImZzLWV4dHJhXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJmcy1leHRyYVwiLFwiY29tbW9uanMyXCI6XCJmcy1leHRyYVwifVxuLy8gbW9kdWxlIGlkID0gMTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZ2xvYlwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qc1wiOlwiZ2xvYlwiLFwiY29tbW9uanMyXCI6XCJnbG9iXCJ9XG4vLyBtb2R1bGUgaWQgPSAxN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJyb290XCI6XCJIb2dhblwiLFwiY29tbW9uanNcIjpcImhvZ2FuLmpzXCIsXCJjb21tb25qczJcIjpcImhvZ2FuLmpzXCIsXCJhbWRcIjpcImhvZ2FuLmpzXCJ9XG4vLyBtb2R1bGUgaWQgPSAxOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wicm9vdFwiOlwiX1wiLFwiY29tbW9uanNcIjpcImxvZGFzaFwiLFwiY29tbW9uanMyXCI6XCJsb2Rhc2hcIn1cbi8vIG1vZHVsZSBpZCA9IDE5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInVuZGVyc2NvcmUuc3RyaW5nXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcInJvb3RcIjpcIl9cIixcImNvbW1vbmpzXCI6XCJ1bmRlcnNjb3JlLnN0cmluZ1wiLFwiY29tbW9uanMyXCI6XCJ1bmRlcnNjb3JlLnN0cmluZ1wifVxuLy8gbW9kdWxlIGlkID0gMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwid2hpY2hcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcIndoaWNoXCIsXCJjb21tb25qczJcIjpcIndoaWNoXCJ9XG4vLyBtb2R1bGUgaWQgPSAyMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ1dWlkXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJ1dWlkXCIsXCJjb21tb25qczJcIjpcInV1aWRcIn1cbi8vIG1vZHVsZSBpZCA9IDIyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNoYWxrXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJjaGFsa1wiLFwiY29tbW9uanMyXCI6XCJjaGFsa1wifVxuLy8gbW9kdWxlIGlkID0gMjNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwic2VtdmVyLXJlZ2V4XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJzZW12ZXItcmVnZXhcIixcImNvbW1vbmpzMlwiOlwic2VtdmVyLXJlZ2V4XCJ9XG4vLyBtb2R1bGUgaWQgPSAyNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGktc3Bpbm5lclwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qc1wiOlwiY2xpLXNwaW5uZXJcIixcImNvbW1vbmpzMlwiOlwiY2xpLXNwaW5uZXJcIn1cbi8vIG1vZHVsZSBpZCA9IDI1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImpzZG9tXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJqc2RvbVwiLFwiY29tbW9uanMyXCI6XCJqc2RvbVwifVxuLy8gbW9kdWxlIGlkID0gMjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwieG1sZG9tXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJ4bWxkb21cIixcImNvbW1vbmpzMlwiOlwieG1sZG9tXCJ9XG4vLyBtb2R1bGUgaWQgPSAyN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wicm9vdFwiOlwialF1ZXJ5XCIsXCJjb21tb25qc1wiOlwianF1ZXJ5XCIsXCJjb21tb25qczJcIjpcImpxdWVyeVwiLFwiYW1kXCI6XCJqcXVlcnlcIn1cbi8vIG1vZHVsZSBpZCA9IDI4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcclxuaW1wb3J0ICogYXMgb3MgZnJvbSBcIm9zXCI7XHJcbmltcG9ydCB7IHNwYXduLCBTcGF3bk9wdGlvbnMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIGZzLFxyXG4gICAgaG9nYW4sXHJcbiAgICAkLFxyXG4gICAgd2hpY2gsXHJcbiAgICB1dWlkLFxyXG4gICAgU3Bpbm5lcixcclxufSBmcm9tIFwiLi9saWJzXCI7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgYXNzZXJ0LFxyXG4gICAgZ2V0TGliUGF0aCxcclxufSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xyXG5cclxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuLy8gZXhwb3J0cyBtZXRob2RzOlxyXG5cclxuLyoqXHJcbiAqIEhhbmRsZSBjb21tYW5kIGxpbmUgZXJyb3IgYW5kIGtpbGwgcHJvY2Vzcy5cclxuICogV2hlbiB0aGUgYXBwbGljYXRpb24gcmVjZWl2ZWQgZXJyb3IgZnJvbSBjbGksIHBsZWFzZSBjYWxsIHRoaXMgbWV0aG9kLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZXJyb3IgIGVycm9yIGluZm9ybWF0aW9uLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUVycm9yKGVycm9yOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGFzc2VydChmYWxzZSwgZXJyb3IpO1xyXG59XHJcblxyXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vL1xyXG5cclxuLyoqXHJcbiAqIFwidGVtcGxhdGVzXCIg44OH44Kj44Os44Kv44OI44Oq44GL44KJ44Gu44OR44K544KS5Y+W5b6XLlxyXG4gKlxyXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHRhcmdldCDjgr/jg7zjgrLjg4Pjg4jjgpLmjIflrpouIG51bGwg44Gu5aC05ZCI44Gv44CBdGVtcGxhdGVzIOOCkui/lOWNtFxyXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRlbXBsYXRlcy9ob2dlaG9nZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHRlbXBsYXRlUGF0aCh0YXJnZXQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAobnVsbCA9PSB0YXJnZXQpIHtcclxuICAgICAgICByZXR1cm4gcGF0aC5qb2luKGdldExpYlBhdGgoKSwgXCJ0ZW1wbGF0ZXNcIik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4oZ2V0TGliUGF0aCgpLCBcInRlbXBsYXRlc1wiLCB0YXJnZXQpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vL1xyXG5cclxuLyoqXHJcbiAqIEdldCBzcGlubmVyIGluc3RhbmNlLlxyXG4gKiBDTEkgaGVscGVyLlxyXG4gKlxyXG4gKiBAcGFyYW0gIHtTdHJpbmd9ICBbZm9ybWF0XSAgc3Bpbm5lciBmb3JtYXQgc3RyaW5nLlxyXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICBbaW5kZXhdICAgc3Bpbm5lciBpbmRleCBkZWZpbmVkIGJ5IGNsaS1zcGlubmVyLiAoZGVmYXVsdDogcmFuZG9tIFswLTI5XSlcclxuICogQHJldHVybiB7U3Bpbm5lcn0gY2xpLXNwaW5uZXIgaW5zdGFuY2UuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Bpbm5lcihmb3JtYXQ/OiBzdHJpbmcsIGluZGV4PzogbnVtYmVyKTogeyBzdGFydDogKCkgPT4gdm9pZDsgc3RvcDogKGNsZWFuPzogYm9vbGVhbikgPT4gdm9pZDsgfSB7XHJcbiAgICBjb25zdCBzcGlubmVycyA9IFtcclxuICAgICAgICBcInwvLVxcXFxcIixcclxuICAgICAgICBcIuKUpOKUmOKUtOKUlOKUnOKUjOKUrOKUkFwiLFxyXG4gICAgICAgIFwi4pei4pej4pek4pelXCIsXHJcbiAgICAgICAgXCLiloziloDilpDiloRcIixcclxuICAgICAgICBcIuKWieKWiuKWi+KWjOKWjeKWjuKWj+KWjuKWjeKWjOKWi+KWiuKWiVwiLFxyXG4gICAgICAgIFwi4paB4paD4paE4paF4paG4paH4paI4paH4paG4paF4paE4paDXCIsXHJcbiAgICAgICAgXCLimLHimLLimLRcIixcclxuICAgICAgICBcIi5vT0AqXCIsXHJcbiAgICAgICAgXCLil5Dil5Pil5Hil5JcIixcclxuICAgICAgICAvLy8vXHJcbiAgICAgICAgXCLil6Hil6Eg4oqZ4oqZIOKXoOKXoFwiLFxyXG4gICAgICAgIFwi4pag4pah4paq4parXCIsXHJcbiAgICAgICAgXCLihpDihpbihpHihpfihpLihpjihpPihplcIixcclxuICAgICAgICBcIi5vT8KwT28uXCIsXHJcbiAgICBdO1xyXG4gICAgY29uc3QgZm10ID0gZm9ybWF0IHx8IFwiJXNcIjtcclxuICAgIGNvbnN0IHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihmbXQpO1xyXG4gICAgY29uc3QgaWR4ID0gKG51bGwgIT0gaW5kZXggJiYgMCA8PSBpbmRleCAmJiBpbmRleCA8IDE0KSA/IGluZGV4IDogTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTApO1xyXG4gICAgc3Bpbm5lci5zZXRTcGlubmVyU3RyaW5nKHNwaW5uZXJzW2lkeF0pO1xyXG4gICAgcmV0dXJuIHNwaW5uZXI7XHJcbn1cclxuXHJcbi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vXHJcblxyXG4vKipcclxuICogQGludGVyZmFjZSBOb3JtYWxpemVUZXh0T3B0aW9uc1xyXG4gKiBAYnJpZWYgbm9ybWFsaXplVGV4dCgpIOOBq+aMh+WumuOBmeOCi+OCquODl+OCt+ODp+ODs1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBOb3JtYWxpemVUZXh0T3B0aW9ucyB7XHJcbiAgICBlb2w/OiBzdHJpbmc7ICAgLy8gZGVmYXVsdDogb3MuRU9MXHJcbiAgICBib20/OiBib29sZWFuOyAgLy8gZGVmYXVsdDogdHJ1ZVxyXG4gICAgdGFiPzogbnVtYmVyOyAgIC8vIHRhYiDjgpLlpInmj5vjgZnjgovjgrnjg5rjg7zjgrnjga7mlbDjgpLmjIflrpouIGRlZmF1bHQ6IOWkieaPm+OBl+OBquOBhFxyXG59XHJcblxyXG4vKipcclxuICogTm9ybWFsaXplIHRleHQgbGluZS1mZWVkLlxyXG4gKiBmb3Igd2luZG93cyBnaXQgdXNlci5cclxuICpcclxuICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgICAgIHRleHQgICAgICBpbnB1dCB0ZXh0LlxyXG4gKiBAcGFyYW0gIHtOb3JtYWxpemVUZXh0T3B0aW9uc30gW29wdGlvbnNdIG9wdGlvbi5cclxuICogQHJldHVybiB7U3RyaW5nfSBub3JtYWxpemVkIHRleHQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVGV4dCh0ZXh0OiBzdHJpbmcsIG9wdGlvbnM/OiBOb3JtYWxpemVUZXh0T3B0aW9ucyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBvcHQ6IE5vcm1hbGl6ZVRleHRPcHRpb25zID0gJC5leHRlbmQoe30sIHtcclxuICAgICAgICBlb2w6IG9zLkVPTCxcclxuICAgICAgICBib206IHRydWUsXHJcbiAgICB9LCBvcHRpb25zKTtcclxuXHJcbiAgICB0ZXh0ID0gdGV4dFxyXG4gICAgICAgIC5yZXBsYWNlKC9eXFx1ZmVmZi9nbSwgXCJcIikgICAvLyByZW1vdmUgYm9tXHJcbiAgICAgICAgLnJlcGxhY2UoL1xcclxcbi9nbSwgXCJcXG5cIikgICAgLy8gb25jZSBcIlxcblwiXHJcbiAgICAgICAgLnJlcGxhY2UoL1xcci9nbSwgXCJcXG5cIilcclxuICAgIDtcclxuXHJcbiAgICBpZiAob3B0LmJvbSkge1xyXG4gICAgICAgIHRleHQgPSBcIlxcdWZlZmZcIiArIHRleHQ7XHJcbiAgICB9XHJcbiAgICBpZiAoXCJcXG5cIiAhPT0gb3B0LmVvbCkge1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcbi9nbSwgb3B0LmVvbCk7XHJcbiAgICB9XHJcbiAgICBpZiAob3B0LnRhYikge1xyXG4gICAgICAgIGNvbnN0IHNwYWNlcyA9ICgoKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBzID0gXCJcIjtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHQudGFiOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHMgKz0gXCIgXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHM7XHJcbiAgICAgICAgfSkoKTtcclxuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXHQvZ20sIHNwYWNlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRleHQ7XHJcbn1cclxuXHJcbi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vXHJcblxyXG4vKipcclxuICogQGludGVyZmFjZSBFeGVjQ29tbWFuZE9wdGlvbnNcclxuICogQGJyaWVmIGV4ZWNDb21tYW5kKCkg44Gr5oyH5a6a44GZ44KL44Kq44OX44K344On44OzXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNDb21tYW5kT3B0aW9ucyBleHRlbmRzIFNwYXduT3B0aW9ucyB7XHJcbiAgICBzcGlubmVyPzoge1xyXG4gICAgICAgIGZvcm1hdD86IHN0cmluZzsgICAgLy8gZXgpIFwiJXNcIlxyXG4gICAgICAgIGluZGV4PzogbnVtYmVyOyAgICAgLy8gMCAtIDkg44Gu5pWw5YCk44KS5oyH5a6aXHJcbiAgICB9O1xyXG4gICAgc3Rkb3V0PzogKGRhdGE6IHN0cmluZykgPT4gdm9pZDtcclxuICAgIHN0ZGVycj86IChkYXRhOiBzdHJpbmcpID0+IHZvaWQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFeGVjdXRlIGNvbW1hbmQgbGluZSBieSBzcGF3bi5cclxuICogY2FsbCBzcGF3bi4gaWYgZXJyb3Igb2NjdXJlZCwgY3VpIGlzIGtpbGxlZCBwcm9jY2Vzcy5cclxuICpcclxuICogQHBhcmFtICAge1N0cmluZ30gICAgICAgICAgICAgICBjb21tYW5kICAgIG1haW4gY29tbWFuZC4gZXgpIFwiY29yZG92YVwiXHJcbiAqIEBwYXJhbSAgIHtTdHJpbmdbXX0gICAgICAgICAgICAgYXJncyAgICAgICBjb21tYW5kIGFyZ3MuIGV4KSBbXCJwbHVnaW5cIiwgXCJhZGRcIiwgcGx1Z2luTmFtZV1cclxuICogQHBhcmFtICAge0V4ZWNDb21tYW5kT3B0aW9uc30gICBbb3B0aW9uc10gIGNsaS1zcGlubmVyXCJzIG9wdGlvbnMuXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGVycm9yIGNvZGVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBleGVjQ29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zPzogRXhlY0NvbW1hbmRPcHRpb25zKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb3B0OiBFeGVjQ29tbWFuZE9wdGlvbnMgPSAkLmV4dGVuZCh7fSwge1xyXG4gICAgICAgICAgICBzdGRpbzogXCJpbmhlcml0XCIsXHJcbiAgICAgICAgICAgIHNwaW5uZXI6IHsgZm9ybWF0OiBcIiVzXCIgfSxcclxuICAgICAgICAgICAgc3Rkb3V0OiAoZGF0YTogc3RyaW5nKTogdm9pZCA9PiB7IC8qIG5vb3AgKi8gfSxcclxuICAgICAgICAgICAgc3RkZXJyOiAoZGF0YTogc3RyaW5nKTogdm9pZCA9PiB7IC8qIG5vb3AgKi8gfSxcclxuICAgICAgICB9LCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgLy8gb24gd2luMzIsIGNvbW1hbmQgYW5kIGFyZ3MgbmVlZCB0byBiZSBxdW90ZWQgaWYgY29udGFpbmluZyBzcGFjZXNcclxuICAgICAgICBjb25zdCBxdW90ZUlmTmVlZGVkID0gKHN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICAgICAgICAgICAgaWYgKFwid2luMzJcIiA9PT0gb3MucGxhdGZvcm0oKSAmJiBzdHIuaW5jbHVkZXMoXCIgXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBzdHIgPSBcIlxcXCJcIiArIHN0ciArIFwiXFxcIlwiO1xyXG4gICAgICAgICAgICAgICAgb3B0LnNoZWxsID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHdoaWNoKGNvbW1hbmQsIChlcnJvciwgcmVzb2x2ZWRDb21tYW5kKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgc3Bpbm5lciA9IG9wdC5zcGlubmVyID8gZ2V0U3Bpbm5lcihvcHQuc3Bpbm5lci5mb3JtYXQsIG9wdC5zcGlubmVyLmluZGV4KSA6IG51bGw7XHJcbiAgICAgICAgICAgIGlmIChzcGlubmVyKSB7XHJcbiAgICAgICAgICAgICAgICBzcGlubmVyLnN0YXJ0KCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlc29sdmVkQ29tbWFuZCA9IHF1b3RlSWZOZWVkZWQocmVzb2x2ZWRDb21tYW5kKTtcclxuICAgICAgICAgICAgYXJncyA9IGFyZ3MubWFwKHF1b3RlSWZOZWVkZWQpO1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZCA9IHNwYXduKHJlc29sdmVkQ29tbWFuZCwgYXJncywgb3B0KVxyXG4gICAgICAgICAgICAgICAgLm9uKFwiZXJyb3JcIiwgaGFuZGxlRXJyb3IpXHJcbiAgICAgICAgICAgICAgICAub24oXCJjbG9zZVwiLCAoY29kZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGlubmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5uZXIuc3RvcCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjb2RlKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKFwicGlwZVwiID09PSBvcHQuc3RkaW8pIHtcclxuICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbihcImRhdGFcIiwgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBvcHQuc3Rkb3V0KGRhdGEudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbihcImRhdGFcIiwgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBvcHQuc3RkZXJyKGRhdGEudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vXHJcblxyXG4vKipcclxuICogQGludGVyZmFjZSBDb3B5VGVtcGxhdGVPcHRpb25zXHJcbiAqIEBicmllZiBjb3B5VHBsKCkg44Gr5oyH5a6a44GZ44KL44Kq44OX44K344On44OzXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIENvcHlUZW1wbGF0ZU9wdGlvbnMgZXh0ZW5kcyBOb3JtYWxpemVUZXh0T3B0aW9ucyB7XHJcbiAgICBkZWxpbWl0ZXJzPzogXCJ7eyB9fVwiIHwgXCI8JSAlPlwiOyAvLyB0ZW1wbGF0ZSDjgavkvb/nlKjjgZnjgosgZGVsaW1pdGVyLiBkZWZhdWx0OiBcInt7IH19XCJcclxufVxyXG5cclxuLyoqXHJcbiAqIENvcHkgdGVtcGxhdGUgd2l0aCBob2dhbi5cclxuICogc3luYyBmdW5jdGlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gICAgICAgICAgICAgICBzcmMgICAgICAgc291cmNlIGZpbGUgcGF0aC5cclxuICogQHBhcmFtIHtTdHJpbmd9ICAgICAgICAgICAgICAgZHN0ICAgICAgIGRlc3RpbmF0aW9uIGZpbGUgcGF0aC5cclxuICogQHBhcmFtIHtPYmplY3R9ICAgICAgICAgICAgICAgcGFyYW1zICAgIHRlbXBsYXRlIHBhcmFtZXRlcnMuXHJcbiAqIEBwYXJhbSB7Q29weVRlbXBsYXRlT3B0aW9uc30gIFtvcHRpb25zXSBvcHRpb25zIG9iamVjdC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjb3B5VHBsKHNyYzogc3RyaW5nLCBkc3Q6IHN0cmluZywgcGFyYW1zOiBPYmplY3QsIG9wdGlvbnM/OiBDb3B5VGVtcGxhdGVPcHRpb25zKTogdm9pZCB7XHJcbiAgICBjb25zdCBvcHQgPSAkLmV4dGVuZCh7fSwge1xyXG4gICAgICAgIGVvbDogb3MuRU9MLFxyXG4gICAgICAgIGJvbTogdHJ1ZSxcclxuICAgICAgICBkZWxpbWl0ZXJzOiBcInt7IH19XCIsXHJcbiAgICB9LCBvcHRpb25zKTtcclxuXHJcbiAgICBjb25zdCBqc3QgPSBob2dhbi5jb21waWxlKG5vcm1hbGl6ZVRleHQoZnMucmVhZEZpbGVTeW5jKHNyYykudG9TdHJpbmcoKSwgeyBlb2w6IFwiXFxuXCIsIGJvbTogZmFsc2UgfSksIG9wdCk7XHJcbiAgICBjb25zdCBvdXRwdXQgPSBub3JtYWxpemVUZXh0KGpzdC5yZW5kZXIocGFyYW1zKSwgb3B0KTtcclxuXHJcbiAgICBmcy5lbnN1cmVGaWxlU3luYyhkc3QpO1xyXG4gICAgZnMud3JpdGVGaWxlU3luYyhkc3QsIG91dHB1dCwgXCJ1dGY4XCIpO1xyXG59XHJcblxyXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vL1xyXG5cclxuLyoqXHJcbiAqIEdVSUQgZ2VuZXJhdGUuXHJcbiAqIHJldHVybmVkIGFzIFdpbmRvd3MgcmVnaXN0cnkgdHlwZSBmb3JtYXQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1N0cmluZ31cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHVUlEKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gXCJ7XCIgKyB1dWlkLnY0KCkudG9VcHBlckNhc2UoKSArIFwifVwiO1xyXG59XHJcblxyXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vL1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBYTUwgRE9NIG5vZGUuXHJcbiAqXHJcbiAqIEBwYXJhbSAgIHN0ciAgc3RyaW5nIHhtbCBmb3JtYXQuIGV4KSAnPHByZWZlcmVuY2UgbmFtZT1cIkRpc2FsbG93T3ZlcnNjcm9sbFwiIHZhbHVlPVwidHJ1ZVwiLz4nXHJcbiAqIEByZXR1cm5zIFhNTCBOb2RlIGluc3RhbmNlXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc3RyMlhtbE5vZGUoc3RyOiBzdHJpbmcpOiBKUXVlcnkge1xyXG4gICAgbGV0IGZ1bGxYTUwgPSB0cnVlO1xyXG4gICAgaWYgKCEvPD94bWwvaS50ZXN0KHN0cikpIHtcclxuICAgICAgICBmdWxsWE1MID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCAkeG1sID0gJCgkLnBhcnNlWE1MKHN0cikpO1xyXG4gICAgcmV0dXJuIGZ1bGxYTUwgPyAkeG1sIDogJHhtbC5jaGlsZHJlbigpO1xyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlIFhNTCBzdHJpbmcgZnJvbSBET00gbm9kZS5cclxuICpcclxuICogQHBhcmFtICB7U3RyaW5nfSBzdHIgIHN0cmluZyB4bWwgZm9ybWF0LiBleCkgJzxwcmVmZXJlbmNlIG5hbWU9XCJEaXNhbGxvd092ZXJzY3JvbGxcIiB2YWx1ZT1cInRydWVcIi8+J1xyXG4gKiBAcmV0dXJuIHtqUXVlcnl9IFhNTCBOb2RlIGluc3RhbmNlXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24geG1sTm9kZTJTdHIoJHhtbDogSlF1ZXJ5KTogc3RyaW5nIHtcclxuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXHJcbiAgICByZXR1cm4gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZygkeG1sWzBdKTtcclxuICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW5kZWYgKi9cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcmZhY2UgRm9ybWF0WG1sT3B0aW9uc1xyXG4gKiBAYnJpZWYgZm9ybWF0WE1MKCkg44Gr5oyH5a6a44GZ44KL44Kq44OX44K344On44OzXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdFhtbE9wdGlvbnMgZXh0ZW5kcyBOb3JtYWxpemVUZXh0T3B0aW9ucyB7XHJcbiAgICBzdGVwPzogbnVtYmVyOyAgIC8vIOepuueZveOCueODmuODvOOCueaVsC4gZGVmYXVsdDogMlxyXG59XHJcblxyXG4vKipcclxuICogWE1MIGZvcm1hdHRlci5cclxuICpcclxuICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgc3RyICAgICAgIHN0cmluZyB4bWwgZm9ybWF0LiBleCkgJzxwcmVmZXJlbmNlIG5hbWU9XCJEaXNhbGxvd092ZXJzY3JvbGxcIiB2YWx1ZT1cInRydWVcIi8+J1xyXG4gKiBAcGFyYW0gIHtGb3JtYXRYbWxPcHRpb25zfSBbb3B0aW9uc10gb3B0aW9ucyBvYmplY3QuXHJcbiAqIEByZXR1cm4ge1N0cmluZ30gZm9ybWF0dGVkIFhNTFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFhNTChzdHI6IHN0cmluZywgb3B0aW9ucz86IEZvcm1hdFhtbE9wdGlvbnMpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgb3B0OiBGb3JtYXRYbWxPcHRpb25zID0gJC5leHRlbmQoe30sIHtcclxuICAgICAgICBlb2w6IG9zLkVPTCxcclxuICAgICAgICBib206IHRydWUsXHJcbiAgICAgICAgc3RlcDogMixcclxuICAgIH0sIG9wdGlvbnMpO1xyXG4gICAgbGV0IHhtbCA9IFwiXCI7XHJcbiAgICBsZXQgcGFkID0gMDtcclxuICAgIGxldCBpbmRlbnQ6IG51bWJlcjtcclxuICAgIGxldCBub2RlOiBzdHJpbmc7XHJcblxyXG4gICAgY29uc3Qgc3RyQXJyID0gbm9ybWFsaXplVGV4dChzdHIsIHsgZW9sOiBcIlxcblwiIH0pXHJcbiAgICAgICAgLnJlcGxhY2UoLyg+KSg8KShcXC8qKS9nLCBcIiQxXFxuJDIkM1wiKSAvLyBpbnNlcnQgTEYgdG8gZWFjaCBub2RlIG9uY2UuXHJcbiAgICAgICAgLnNwbGl0KFwiXFxuXCIpO1xyXG5cclxuICAgIGNvbnN0IHNwYWNlcyA9IChsZW46IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGxldCBzID0gXCJcIjtcclxuICAgICAgICBjb25zdCBfaW5kZW50ID0gbGVuICogb3B0LnN0ZXA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBfaW5kZW50OyBpKyspIHtcclxuICAgICAgICAgICAgcyArPSBcIiBcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHM7XHJcbiAgICB9O1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyQXJyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaW5kZW50ID0gMDtcclxuICAgICAgICBub2RlID0gJC50cmltKHN0ckFycltpXSk7XHJcbiAgICAgICAgaWYgKG5vZGUubWF0Y2goLy4rPFxcL1xcd1tePl0qPiQvKSkge1xyXG4gICAgICAgICAgICBpbmRlbnQgPSAwO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5tYXRjaCgvXjxcXC9cXHcvKSkge1xyXG4gICAgICAgICAgICBpZiAocGFkID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcGFkIC09IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKG5vZGUubWF0Y2goL148XFx3W14+XSpbXi9dPi4qJC8pKSB7XHJcbiAgICAgICAgICAgIGluZGVudCA9IDE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaW5kZW50ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgeG1sICs9IHNwYWNlcyhwYWQpICsgbm9kZSArIFwiXFxuXCI7XHJcbiAgICAgICAgcGFkICs9IGluZGVudDtcclxuICAgIH1cclxuXHJcbiAgICB4bWwgPSB4bWxcclxuICAgICAgICAucmVwbGFjZSgvXFxuXFxuL2dtLCBcIlxcblwiKVxyXG4gICAgICAgIC5yZXBsYWNlKC9eICtcXG4vZ20sIFwiXCIpXHJcbiAgICAgICAgO1xyXG5cclxuICAgIHJldHVybiBub3JtYWxpemVUZXh0KHhtbCwgb3B0KTtcclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vc3JjL3V0aWxzL3Rvb2xzLnRzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2hpbGRfcHJvY2Vzc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcImNoaWxkX3Byb2Nlc3NcIlxuLy8gbW9kdWxlIGlkID0gMzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSBcIi4uL3V0aWxzL3NldHRpbmdzXCI7XHJcblxyXG5pbXBvcnQgeyBHZW5lcmF0b3JCYXNlLCBJUHJvamVjdENvbmZpZ3JhdGlvbiB9IGZyb20gXCIuL2Jhc2VcIjtcclxuaW1wb3J0IHsgbmV3R2VuZXJhdG9yTGlicmFyeSB9IGZyb20gXCIuL2xpYnJhcnlcIjtcclxuaW1wb3J0IHsgbmV3R2VuZXJhdG9yTW9iaWxlIH0gZnJvbSBcIi4vbW9iaWxlXCI7XHJcbmltcG9ydCB7IG5ld0dlbmVyYXRvckRlc2t0b3AgfSBmcm9tIFwiLi9kZXNrdG9wXCI7XHJcbmltcG9ydCB7IG5ld0dlbmVyYXRvcldlYiB9IGZyb20gXCIuL3dlYlwiO1xyXG5cclxuZXhwb3J0ICogZnJvbSBcIi4vYmFzZVwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9saWJyYXJ5XCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL21vYmlsZVwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9kZXNrdG9wXCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL3dlYlwiO1xyXG5cclxuLyoqXHJcbiAqIGdlbmVyYXRvciDnlJ/miJDplqLmlbBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBuZXdHZW5lcmF0b3IoY29uZmlnOiBJUHJvamVjdENvbmZpZ3JhdGlvbik6IEdlbmVyYXRvckJhc2Uge1xyXG4gICAgc3dpdGNoIChjb25maWcucHJvamVjdFR5cGUpIHtcclxuICAgICAgICBjYXNlIFwibGlicmFyeVwiOlxyXG4gICAgICAgICAgICByZXR1cm4gbmV3R2VuZXJhdG9yTGlicmFyeShjb25maWcpO1xyXG4gICAgICAgIGNhc2UgXCJtb2JpbGVcIjpcclxuICAgICAgICAgICAgcmV0dXJuIG5ld0dlbmVyYXRvck1vYmlsZShjb25maWcpO1xyXG4gICAgICAgIGNhc2UgXCJkZXNrdG9wXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBuZXdHZW5lcmF0b3JEZXNrdG9wKGNvbmZpZyk7XHJcbiAgICAgICAgY2FzZSBcIndlYlwiOlxyXG4gICAgICAgICAgICByZXR1cm4gbmV3R2VuZXJhdG9yV2ViKGNvbmZpZyk7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBcInVuc3VwcG9ydGVkIHByb2plY3Qga2luZDogXCIgKyBjb25maWcucHJvamVjdFR5cGUpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vc3JjL2dlbmVyYXRvcnMvaW5kZXgudHMiLCJpbXBvcnQgKiBhcyBVdGlscyBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcclxuZXhwb3J0IHsgVXRpbHMgfTtcclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJmYWNlIElTb3VyY2VEaXJjdG9yeUNvbmZpZ3JhdGlvblxyXG4gKiBAYnJpZWYg44K944O844K544OH44Kj44Os44Kv44OI44Oq44Gu44Kz44Oz44OV44Kj44Ku44Ol44Os44O844K344On44Oz6Kit5a6aXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElTb3VyY2VEaXJjdG9yeUNvbmZpZ3JhdGlvbiB7XHJcbiAgICBzY3JpcHQ/OiBzdHJpbmc7ICAgICAgICAgICAgLy8ganModHMpIOODleOCoeOCpOODq+S/neWtmOWFiFxyXG4gICAgc3R5bGVzaGVldD86IHN0cmluZzsgICAgICAgIC8vIGNzcyhjc3MpIOODleOCoeOCpOODq+S/neWtmOWFiFxyXG4gICAgdGVtcGxhdGU/OiBzdHJpbmc7ICAgICAgICAgIC8vIGh0bWwodGVtcGxhdGUpIOODleOCoeOCpOODq+S/neWtmOWFiFxyXG59XHJcblxyXG4vKipcclxuICogQGludGVyZmFjZSBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvblxyXG4gKiBAYnJpZWYg44OX44Ot44K444Kn44Kv44OI44OH44Kj44Os44Kv44OI44Oq44Gu44Kz44Oz44OV44Kj44Ku44Ol44Os44O844K344On44Oz6Kit5a6aXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElCYXNlU3RydWN0dXJlQ29uZmlncmF0aW9uIHtcclxuICAgIHNyYz86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g44K944O844K544Kz44O844OJ44Gu44Or44O844OI44OH44Kj44Os44Kv44OI44Oq5ZCNXHJcbiAgICBwa2c/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOODkeODg+OCseODvOOCuOWFiOODh+OCo+ODrOOCr+ODiOODquWQjVxyXG4gICAgYnVpbHQ/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDjgrPjg7Pjg5HjgqTjg6vlhYjjg4fjgqPjg6zjgq/jg4jjg6rlkI1cclxuICAgIGRvYz86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g44OJ44Kt44Ol44Oh44Oz44OI44OH44Kj44Os44Kv44OI44Oq5ZCNXHJcbiAgICB0YXNrPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOOCv+OCueOCr+ODh+OCo+ODrOOCr+ODiOODquWQjVxyXG4gICAgdGVzdD86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDjg4bjgrnjg4jjg4fjgqPjg6zjgq/jg4jjg6rlkI1cclxuICAgIHR5cGVzPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHlwZVNjcmlwdCDlnovlrprnvqnjg4fjgqPjg6zjgq/jg4jjg6rlkI1cclxuICAgIHRlbXA/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5L2c5qWt44OH44Kj44Os44Kv44OI44Oq5ZCNXHJcbiAgICBzcmNDb25maWc/OiBJU291cmNlRGlyY3RvcnlDb25maWdyYXRpb247ICAgIC8vIElTb3VyY2VEaXJjdG9yeUNvbmZpZ3JhdGlvblxyXG4gICAgbGliPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcm5hbCBsaWJyYXJ5IG1vZHVsZSDjg4fjgqPjg6zjgq/jg4jjg6rlkI1cclxuICAgIGV4dGVybmFsPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZXJuYWwgbW9kdWxlIOODh+OCo+ODrOOCr+ODiOODquWQjVxyXG4gICAgcG9ydGluZz86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3J0aW5nIG1vZHVsZSDjg4fjgqPjg6zjgq/jg4jjg6rlkI1cclxuICAgIHJlcz86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g44Oq44K944O844K544OH44Kj44Os44Kv44OI44Oq5ZCNXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJmYWNlIElEZXBlbmRlbmN5XHJcbiAqIEBicmllZiBwYWNrYWdlLmpzb24g44Gr5oyH5a6a44GZ44KLIGRlcGVuZGVuY2llcyDmg4XloLHjgpLmoLzntI3jgZnjgovjgqTjg7Pjgr/jg7zjg5XjgqfjgqTjgrlcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURlcGVuZGVuY3kge1xyXG4gICAgbmFtZTogc3RyaW5nOyAgICAgICAgICAgLy8gbW9kdWxlIG5hbWUgZXgpIFwidHlwZXNjcmlwdFwiXHJcbiAgICB2ZXJzaW9uPzogc3RyaW5nOyAgICAgICAvLyDmjIflrprjg5Djg7zjgrjjg6fjg7MuIOeEoeaMh+WumuOBruWgtOWQiOOBr+acgOaWsOODkOODvOOCuOODp+ODs1xyXG4gICAgZXM/OiBzdHJpbmdbXTsgICAgICAgICAgLy8g5oyH5a6a44GV44KM44GfIEVTIHZlcnNpb24g44Gu44Go44GN44Gu44G/5pyJ5Yq544Gr44GZ44KLXHJcbiAgICBnbG9iYWxFeHBvcnQ/OiBzdHJpbmc7ICAvLyBnbG9iYWwgZXhwb3J0IOOCkuW/heimgeOBqOOBmeOCi+OCguOBruOBryBnbG9iYWwgT2JqZWN0IOWQjeOCkuaMh+WumlxyXG4gICAgYWxpYXM/OiBzdHJpbmc7ICAgICAgICAgLy8gYWxpYXMg44KS6Kit5a6a44GZ44KL5aC05ZCI44Gr5oyH5a6aXHJcbiAgICB2ZW5kZXJOYW1lPzogc3RyaW5nOyAgICAvLyB2ZW5kZXIg5ZCN44KS6Kit5a6a44GZ44KL5aC05ZCI44Gr5oyH5a6aXHJcbiAgICBmaWxlTmFtZT86IHN0cmluZzsgICAgICAvLyBmaWxlIOWQjeOCkuioreWumuOBmeOCi+WgtOWQiOOBq+aMh+WumlxyXG59XHJcblxyXG4vKipcclxuICogQGludGVyZmFjZSBJUHJvamVjdENvbmZpZ3JhdGlvblxyXG4gKiBAYnJpZWYg44OX44Ot44K444Kn44Kv44OI5YWx6YCa44Gu44Kz44Oz44OV44Kj44Ku44Ol44Os44O844K344On44Oz6Kit5a6aXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElQcm9qZWN0Q29uZmlncmF0aW9uIHtcclxuICAgIHByb2plY3ROYW1lOiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOODl+ODreOCuOOCp+OCr+ODiOWQjSBleCkgXCJjZHAtbGliXCJcclxuICAgIHByb2plY3RUeXBlOiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOODl+ODreOCuOOCp+OCr+ODiOeorumhniBleCkgXCJsaWJyYXJ5XCJcclxuICAgIGFjdGlvbjogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4KSBcImNyZWF0ZVwiXHJcbiAgICB2ZXJzaW9uOiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDjg5Djg7zjgrjjg6fjg7MgZXgpIFwiMS4wLjBcIlxyXG4gICAgbGljZW5zZTogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g44Op44Kk44K744Oz44K5IGV4KSBcIkFwYWNoZS0yLjBcIlxyXG4gICAgcHJpdmF0ZT86IGJvb2xlYW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJpdmF0ZSDjg5Hjg4PjgrHjg7zjgrjjga7loLTlkIggdHJ1ZVxyXG4gICAgc2V0dGluZ3M6IFV0aWxzLklHbG9iYWxTZXR0aW5nczsgICAgICAgICAgICAgICAgLy8g44Ot44Kw44Kq44OX44K344On44OzXHJcbiAgICBtb2R1bGVOYW1lPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbXBvcnQg44Gr5oyH5a6a44GZ44KLIOODouOCuOODpeODvOODq+WQjSBleCkgXCJjZHAtbGliXCJcclxuICAgIG1haW5CYXNlTmFtZT86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOODoeOCpOODs+ODleOCoeOCpOODq+WQjSBleCkgXCJjZHAtbGliXCIgLyBcImluZGV4XCJcclxuICAgIG5hbWVzcGFjZT86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOODq+ODvOODiOWQjeWJjeepuumWk1xyXG4gICAgc3RydWN0dXJlQ29uZmlnPzogSUJhc2VTdHJ1Y3R1cmVDb25maWdyYXRpb247ICAgLy8gSUJhc2VTdHJ1Y3R1cmVDb25maWdyYXRpb25cclxuICAgIGNvcHlyaWdodD86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOOCs+ODlOODvOODqeOCpOODiOaWh+Wtl+WIlyBleCkgXCJDb3B5cmlnaHQgKGMpIDIwMTcgU29ueSBDb3Jwb3JhdGlvblwiXHJcbiAgICBkZXZEZXBlbmRlbmNpZXM/OiBJRGVwZW5kZW5jeVtdOyAgICAgICAgICAgICAgICAvLyDplovnmbrnlKjkvp3lrZjjg6Ljgrjjg6Xjg7zjg6vmg4XloLFcclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcmZhY2UgSUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uXHJcbiAqIEBicmllZiDjg5Pjg6vjg4njgr/jg7zjgrLjg4Pjg4jjgrPjg7Pjg5XjgqPjgq7jg6Xjg6zjg7zjgrfjg6fjg7PoqK3lrppcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uIHtcclxuICAgIGVzPzogXCJlczVcIiB8IFwiZXMyMDE1XCI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUeXBlU2NyaXB0IOOBriB0cmFuc3BpbGUgdGFyZ2V0XHJcbiAgICBtb2R1bGU/OiBcIm5vbmVcIiB8IFwiY29tbW9uanNcIiB8IFwiYW1kXCIgfCBcInVtZFwiOyAgICAgICAgICAgICAgIC8vIEphdmFTY3JpcHQgbW9kdWxlIHN5c3RlbVxyXG4gICAgZW52PzogXCJ3ZWJcIiB8IFwibm9kZVwiIHwgXCJlbGVjdHJvblwiIHwgXCJlbGVjdHJvbi1yZW5kZXJlclwiOyAgICAvLyDlrp/ooYznkrDlooPjga4gdGFyZ2V0XHJcbiAgICBub2RlanM/OiBib29sZWFuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBcIm5vZGVcIiB8IFwiZWxlY3Ryb25cIiDjga7loLTlkIjjgasgdHJ1ZVxyXG4gICAgbWluaWZ5PzogYm9vbGVhbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g44Oq44Oq44O844K55pmC44GrIG1pbmlmeSDjgZnjgovloLTlkIjjga8gdHJ1ZVxyXG4gICAgLy8gYnVpbGQgdG9vbFxyXG4gICAgdG9vbHM/OiBzdHJpbmdbXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5pei5a6a44GuIGJ1aWxkIHRvb2wgZXgpIFtcIndlYnBhY2tcIl1cclxuICAgIG91dHB1dFNhbWVEaXI/OiBib29sZWFuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYyDjgaggYnVpbHQg44GM5ZCM44GY44OH44Kj44Os44Kv44OI44Oq44Gr44Gq44KL5aC05ZCIIHRydWVcclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcmZhY2UgSVdlYnBhY2tDb25maWdyYXRpb25cclxuICogQGJyaWVmIFdlYnBhY2sg55So44Kz44Oz44OV44Kj44Ku44Ol44Os44O844K344On44Oz6Kit5a6aXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElXZWJwYWNrQ29uZmlncmF0aW9uIHtcclxuICAgIG5vZGVqczogYm9vbGVhbjsgICAgLy8gXCJub2RlXCIgfCBcImVsZWN0cm9uXCIg44Gu5aC05ZCI44GrIHRydWVcclxuICAgIGd1aWRlOiBib29sZWFuOyAgICAgLy8gZ3VpZGUg44Kz44Oh44Oz44OI44KS5LuY5Yqg44GZ44KL5aC05ZCI44GvIHRydWUg44KS5oyH5a6aXHJcbiAgICB0YXNrUGF0aDogc3RyaW5nOyAgIC8vICd0YXNrJyDjg4fjgqPjg6zjgq/jg4jjg6rlkI1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcmZhY2UgSVZpc3VhbFN0dWRpb0NvbmZpZ3JhdGlvblxyXG4gKiBAYnJpZWYgVmlzdWFsIFN0dWRpbyDnlKjjgrPjg7Pjg5XjgqPjgq7jg6Xjg6zjg7zjgrfjg6fjg7PoqK3lrppcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVZpc3VhbFN0dWRpb0NvbmZpZ3JhdGlvbiBleHRlbmRzIElCYXNlU3RydWN0dXJlQ29uZmlncmF0aW9uIHtcclxuICAgIHByb2plY3ROYW1lOiBzdHJpbmc7ICAgICAgICAvLyDjg5fjg63jgrjjgqfjgq/jg4jlkI0gZXgpIFwiY2RwLWxpYlwiXHJcbiAgICBwcm9qZWN0R1VJRDogc3RyaW5nOyAgICAgICAgLy8g44OX44Ot44K444Kn44Kv44OIIEdVSUQgZXgpIHs1MUI0MTM1OS04RDJDLTQyREYtODQxNC1FODVCMDI5OTMyMzh9XHJcbiAgICBtYWluQmFzZU5hbWU6IHN0cmluZzsgICAgICAgLy8g44Oh44Kk44Oz44OV44Kh44Kk44Or5ZCNIGV4KSBcImNkcC1saWJcIiAvIGluZGV4XHJcbiAgICBsaWNlbnNlOiBib29sZWFuOyAgICAgICAgICAgLy8gTElDRU5TRSDjgpLov73liqDjgZnjgovloLTlkIjjga8gdHJ1ZVxyXG4gICAgd2VicGFjazogYm9vbGVhbjsgICAgICAgICAgIC8vIHdlYnBhY2suY29uZmlnLmpzIOOCkui/veWKoOOBmeOCi+WgtOWQiOOBryB0cnVlXHJcbiAgICB0ZXN0ZW06IGJvb2xlYW47ICAgICAgICAgICAgLy8gdGVzdGVtIHJ1bm5lciDjgpLov73liqDjgZnjgovloLTlkIjjga8gdHJ1ZVxyXG4gICAgb3V0cHV0U2FtZURpcjogYm9vbGVhbjsgICAgIC8vIHNyYyDjgaggYnVpbHQg44GM5ZCM44GY44OH44Kj44Os44Kv44OI44Oq44Gr44Gq44KL5aC05ZCIIHRydWVcclxuICAgIHRzR3JvdXA6IHtcclxuICAgICAgICByZWxhdGl2ZVBhdGg6IHN0cmluZzsgICAvLyBcImhvZ2Vob2dlXFxcIlxyXG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7ICAgICAgIC8vIFwiY2RwLWxpYlwiXHJcbiAgICAgICAgZGVwZW5kZWU6IGJvb2xlYW47ICAgICAgLy8g5L6d5a2Y5YWI44KS6L+95Yqg44GZ44KL5aC05ZCIIHRydWVcclxuICAgICAgICBtYXA6IGJvb2xlYW47ICAgICAgICAgICAvLyAubWFwIOODleOCoeOCpOODq+OBjOOBguOCi+WgtOWQiCB0cnVlXHJcbiAgICB9W107XHJcbiAgICBqc0dyb3VwOiB7XHJcbiAgICAgICAgcmVsYXRpdmVQYXRoOiBzdHJpbmc7ICAgLy8gXCJob2dlaG9nZVxcXCJcclxuICAgICAgICBmaWxlTmFtZTogc3RyaW5nOyAgICAgICAvLyBcImNkcC1saWJcIlxyXG4gICAgICAgIGRlcGVuZGVlOiBib29sZWFuOyAgICAgIC8vIOS+neWtmOWFiOOCkui/veWKoOOBmeOCi+WgtOWQiCB0cnVlXHJcbiAgICAgICAgZF90czogYm9vbGVhbjsgICAgICAgICAgLy8gLmQudHMg44OV44Kh44Kk44Or44GM44GC44KL5aC05ZCIIHRydWVcclxuICAgICAgICBtYXA6IGJvb2xlYW47ICAgICAgICAgICAvLyAubWFwIOODleOCoeOCpOODq+OBjOOBguOCi+WgtOWQiCB0cnVlXHJcbiAgICAgICAgbWluX21hcDogYm9vbGVhbjsgICAgICAgLy8gLm1pbiAubWFwIOODleOCoeOCpOODq+OBjOOBguOCi+WgtOWQiCB0cnVlXHJcbiAgICB9W107XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4uLy4uLy4uL3NyYy9nZW5lcmF0b3JzL2Jhc2UvaW50ZXJmYWNlcy50cyIsImltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcclxuaW1wb3J0IHtcclxuICAgIGZzLFxyXG4gICAgZ2xvYixcclxuICAgIGNoYWxrLFxyXG4gICAgXyxcclxuICAgICQsXHJcbiAgICAvLy8vXHJcbiAgICBleGVjQ29tbWFuZCxcclxuICAgIGdldFNwaW5uZXIsXHJcbiAgICBnZXRUYXJnZXREaXIsXHJcbiAgICB0ZW1wbGF0ZVBhdGgsXHJcbiAgICBjb3B5VHBsLFxyXG4gICAgbG9nLFxyXG4gICAgZGVidWcsXHJcbiAgICB0cmFuc2xhdGUsXHJcbn0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgSUJhc2VTdHJ1Y3R1cmVDb25maWdyYXRpb24sXHJcbiAgICBJRGVwZW5kZW5jeSxcclxuICAgIElQcm9qZWN0Q29uZmlncmF0aW9uLFxyXG4gICAgSUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uLFxyXG4gICAgSVdlYnBhY2tDb25maWdyYXRpb24sXHJcbn0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzcyBHZW5lcmF0b3JCYXNlXHJcbiAqIEBicmllZiDjgZnjgbnjgabjga4gR2VuZXJhdG9yIOOBruaXouWumuOCr+ODqeOCuVxyXG4gKi9cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEdlbmVyYXRvckJhc2Uge1xyXG5cclxuICAgIHByaXZhdGUgX3Byb2plY3RSb290RGlyOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBjb25zdHJ1Y3RvclxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7SVByb2plY3RDb25maWdyYXRpb259IGNvbmZpZyDjgrPjg7Pjg5XjgqPjgrBcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9jb25maWc6IElQcm9qZWN0Q29uZmlncmF0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5fcHJvamVjdFJvb3REaXIgPSBnZXRUYXJnZXREaXIoKSA/XHJcbiAgICAgICAgICAgIGdldFRhcmdldERpcigpIDpcclxuICAgICAgICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIHRoaXMuX2NvbmZpZy5wcm9qZWN0TmFtZSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcgPSAkLmV4dGVuZCh7fSwgdGhpcy5kZWZhdWx0QmFzZVN0cnVjdHVyZSgpLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnKTtcclxuXHJcbiAgICAgICAgdGhpcy5fY29uZmlnLnByaXZhdGUgPSBcIk5PTkVcIiA9PT0gdGhpcy5fY29uZmlnLmxpY2Vuc2U7XHJcblxyXG4gICAgICAgICg8SUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uPnRoaXMuX2NvbmZpZykub3V0cHV0U2FtZURpclxyXG4gICAgICAgICAgICA9IHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjID09PSB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLmJ1aWx0O1xyXG5cclxuICAgICAgICAoPElCdWlsZFRhcmdldENvbmZpZ3JhdGlvbj50aGlzLl9jb25maWcpLm5vZGVqcyA9ICgoZW52OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgc3dpdGNoIChlbnYpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJub2RlXCI6XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiZWxlY3Ryb25cIjpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkoKDxJQnVpbGRUYXJnZXRDb25maWdyYXRpb24+dGhpcy5fY29uZmlnKS5lbnYpO1xyXG5cclxuICAgICAgICBkZWJ1ZyhKU09OLnN0cmluZ2lmeSh0aGlzLl9jb25maWcsIG51bGwsIDQpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgLy8gcHViaWMgbWV0aG9kczpcclxuXHJcbiAgICAvKipcclxuICAgICAqIOWHpueQhumWi+WniyAo44Ko44Oz44OI44OqKVxyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMuX2NvbmZpZy5hY3Rpb24pIHtcclxuICAgICAgICAgICAgY2FzZSBcImNyZWF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucnVuQ3JlYXRlKCk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJ1bmtub3duIGFjdGlvbjogXCIgKyB0aGlzLl9jb25maWcuYWN0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIC8vIGFic3RyYWN0IG1ldGhvZHM6XHJcblxyXG4gICAgLy8g5pei5a6a44GuIGRpcmVjdG9yeSDmp4vpgKDjgpLov5TljbRcclxuICAgIGFic3RyYWN0IGRlZmF1bHRCYXNlU3RydWN0dXJlKCk6IElCYXNlU3RydWN0dXJlQ29uZmlncmF0aW9uO1xyXG5cclxuICAgIC8vIGFjdGlvbjogY3JlYXRlIOOBruOBqOOBjeOBq+WRvOOBsOOCjOOCi1xyXG4gICAgYWJzdHJhY3QgYXN5bmMgY3JlYXRlKCk6IFByb21pc2U8dm9pZD47XHJcblxyXG4gICAgLy8g5b+F6KaB44Go44GZ44KLIHRhc2sgc2NyaXB0IOS4gOimp+OCkui/lOWNtC4gYWN0aW9uOiBjcmVhdGUg44Gu44Go44GN44Gr5ZG844Gw44KM44KLXHJcbiAgICBhYnN0cmFjdCBnZXQgdGFza0xpc3QoKTogc3RyaW5nW107XHJcblxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIC8vIHByb3RlY3RlZCBtZXRob2RzOlxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6YCy5o2X44OG44Kt44K544OI44KS6YCa55+lXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGtleSDjg63jg7zjgqvjg6njgqTjgrrjg6rjgr3jg7zjgrnjgq3jg7zjgpLmjIflrppcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHByb2dyZXNzKGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgbG9nKGNoYWxrLmN5YW4odHJhbnNsYXRlKGtleSkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOitpuWRiuODhuOCreOCueODiOOCkumAmuefpVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBrZXkg44Ot44O844Kr44Op44Kk44K644Oq44K944O844K544Kt44O844KS5oyH5a6aXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCB3YXJuKGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgbG9nKGNoYWxrLnllbGxvdyh0cmFuc2xhdGUoa2V5KSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogd29yayBkaXJlY3Rvcnkg44Gu5aSJ5pu0XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGRpcmVjdG9yeSB0YXJnZXQgZGlyZWN0b3J5LlxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgY2hkaXIoZGlyZWN0b3J5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBwcm9jZXNzLmNoZGlyKGRpcmVjdG9yeSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5IOOBruWPluW+l1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkaXJlY3RvcnkgdGFyZ2V0IGRpcmVjdG9yeS5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldCByb290RGlyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2plY3RSb290RGlyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogdGVtcGxhdGUgZGlyZWN0b3J5IOOCkuaMh+WumuOBl+OBpumFjeS4i+OBruODleOCoeOCpOODq+OCkuOCs+ODlOODvFxyXG4gICAgICogSUJhc2VTdHJ1Y3R1cmVDb25maWdyYXRpb24g44Gu6Kit5a6a44GM5Y+N5pig44GV44KM44KLXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHRhcmdldCAg44K/44O844Ky44OD44OI44KS5oyH5a6aLiBudWxsIOOBruWgtOWQiOOBr+OAgXRlbXBsYXRlcyDjgpLov5TljbRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkc3RSb290IOOCs+ODlOODvOWFiOOCkuaMh+Wumi4g5oyH5a6a44GM54Sh44GE5aC05ZCI44GvIHJvb3REaXIg44GM6Kit5a6aXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBjb3B5VHBsRGlyKHRhcmdldDogc3RyaW5nLCBkc3RSb290Pzogc3RyaW5nLCBvcHRpb25zPzogZ2xvYi5JT3B0aW9ucyk6IHZvaWQge1xyXG4gICAgICAgIGRzdFJvb3QgPSBkc3RSb290IHx8IHRoaXMucm9vdERpcjtcclxuICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe1xyXG4gICAgICAgICAgICBjd2Q6IHRlbXBsYXRlUGF0aCh0YXJnZXQpLFxyXG4gICAgICAgICAgICBub2RpcjogdHJ1ZSxcclxuICAgICAgICAgICAgZG90OiB0cnVlLFxyXG4gICAgICAgIH0sIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICBnbG9iLnN5bmMoXCIqKlwiLCBvcHRpb25zKVxyXG4gICAgICAgICAgICAuZm9yRWFjaCgoZmlsZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZHN0ID0gcGF0aC5qb2luKGRzdFJvb3QsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvc3JjLywgICAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvcGtnLywgICAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcucGtnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvYnVpbHQvLCAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuYnVpbHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9kb2MvLCAgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5kb2MpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC90YXNrLywgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50YXNrKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvdGVzdC8sICAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcudGVzdClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL3R5cGVzLywgICB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnR5cGVzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvdGVtcFxcLy8sICAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcudGVtcCArIFwiL1wiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvbGliLywgICAgICAgICB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLmxpYiB8fCBcImxpYlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvZXh0ZXJuYWwvLCAgICB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLmV4dGVybmFsIHx8IFwiZXh0ZXJuYWxcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL3BvcnRpbmcvLCAgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5wb3J0aW5nIHx8IFwicG9ydGluZ1wiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvcmVzLywgICAgICAgICB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnJlcyB8fCBcInJlc1wiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9zY3JpcHQvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmNDb25maWdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICh0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyY0NvbmZpZy5zY3JpcHQgfHwgXCJzY3JpcHRzXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcInNjcmlwdHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgL3N0eWxlc2hlZXQvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmNDb25maWdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICh0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyY0NvbmZpZy5zdHlsZXNoZWV0IHx8IFwic3R5bGVzaGVldHNcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwic3R5bGVzaGVldHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgL3RlbXBsYXRlLyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjQ29uZmlnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAodGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmNDb25maWcudGVtcGxhdGUgfHwgXCJ0ZW1wbGF0ZXNcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwidGVtcGxhdGVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGZzLmNvcHlTeW5jKHBhdGguam9pbih0ZW1wbGF0ZVBhdGgodGFyZ2V0KSwgZmlsZSksIGRzdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBub2RlIG1vZHVsZSDjga4gdmVyc2lvbiDlj5blvpdcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1Byb21pc2U8c3RyaW5nPn0gdmVyc2lvbiB0ZXh0XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBxdWVyeU5vZGVNb2R1bGVMYXRlc3RWZXJzaW9uKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgbGV0IHZlcnNpb246IHN0cmluZztcclxuICAgICAgICAgICAgZXhlY0NvbW1hbmQoXCJucG1cIiwgW1wiaW5mb1wiLCBuYW1lLCBcInZlcnNpb25cIl0sIHtcclxuICAgICAgICAgICAgICAgIHN0ZGlvOiBcInBpcGVcIixcclxuICAgICAgICAgICAgICAgIHNwaW5uZXI6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBzdGRvdXQ6IChkYXRhOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gXy50cmltKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZlcnNpb24pO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaXouWumuOBrumWi+eZuuaZguOBruS+neWtmOODouOCuOODpeODvOODq+ODquOCueODiOOBruWPluW+l1xyXG4gICAgICog5b+F6KaB44Gr5b+c44GY44Gm44Kq44O844OQ44O844Op44Kk44OJXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7SURlcGVuZGVuY3l9XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgZGVmYXVsdERldkRlcGVuZGVuY2llcygpOiBJRGVwZW5kZW5jeVtdIHtcclxuICAgICAgICBjb25zdCBiYXNlID0gW1xyXG4gICAgICAgICAgICB7IG5hbWU6IFwiY29udmVydC1zb3VyY2UtbWFwXCIsICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwiZGVsXCIsICAgICAgICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwiZXNsaW50XCIsICAgICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwibnBtLXJ1bi1hbGxcIiwgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwicGxhdG9cIiwgICAgICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwic291cmNlLW1hcFwiLCAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwidHNsaW50XCIsICAgICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwidHlwZWRvY1wiLCAgICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwidHlwZXNjcmlwdFwiLCAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgIF07XHJcbiAgICAgICAgY29uc3QgbWluaWZ5ID0gW1xyXG4gICAgICAgICAgICB7IG5hbWU6IFwidWdsaWZ5LWpzXCIsICAgIHZlcnNpb246IHVuZGVmaW5lZCwgZXM6IFtcImVzNVwiXSwgICAgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiBcInVnbGlmeS1lc1wiLCAgICB2ZXJzaW9uOiB1bmRlZmluZWQsIGVzOiBbXCJlczIwMTVcIl0sIH0sXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgbGV0IGV4dHJhID0gW107XHJcbiAgICAgICAgaWYgKCg8SUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uPnRoaXMuX2NvbmZpZykubWluaWZ5KSB7XHJcbiAgICAgICAgICAgIGV4dHJhID0gZXh0cmEuY29uY2F0KG1pbmlmeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlVG9vbChcIndlYnBhY2tcIikpIHtcclxuICAgICAgICAgICAgZXh0cmEucHVzaCh7IG5hbWU6IFwid2VicGFja1wiLCAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9KTtcclxuICAgICAgICAgICAgZXh0cmEucHVzaCh7IG5hbWU6IFwic291cmNlLW1hcC1sb2FkZXJcIiwgdmVyc2lvbjogdW5kZWZpbmVkLCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVUb29sKFwibnljXCIpKSB7XHJcbiAgICAgICAgICAgIGV4dHJhLnB1c2goeyBuYW1lOiBcIm55Y1wiLCB2ZXJzaW9uOiB1bmRlZmluZWQsIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZVRvb2woXCJ0ZXN0ZW1cIikpIHtcclxuICAgICAgICAgICAgZXh0cmEucHVzaCh7IG5hbWU6IFwidGVzdGVtXCIsIHZlcnNpb246IHVuZGVmaW5lZCwgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlVG9vbChcInBoYW50b21qcy1wcmVidWlsdFwiKSkge1xyXG4gICAgICAgICAgICBleHRyYS5wdXNoKHsgbmFtZTogXCJwaGFudG9tanMtcHJlYnVpbHRcIiwgdmVyc2lvbjogdW5kZWZpbmVkLCB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBfLnNvcnRCeShiYXNlLmNvbmNhdChleHRyYSksIChkZXBlbmQpID0+IGRlcGVuZC5uYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGRlcGVuZGVuY2llcyDjga4gdGVtcGxhdGUgcGFyYW1hZXRlciDjgpLlj5blvpdcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gIHtJRGVwZW5kZW5jeVtdfSBkZXBlbmRlbmNpZXMg5L6d5a2Y6Zai5L+C44Oq44K544OIXHJcbiAgICAgKiBAcmV0dXJuIHt7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nOyBsYXN0PzogYm9vbGVhbjsgfVtdfSDjg4bjg7Pjg5fjg6zjg7zjg4jjg5Hjg6njg6Hjg7zjgr/jgavmjIflrprjgZnjgovphY3liJdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGFzeW5jIHF1ZXJ5RGVwZW5kZW5jaWVzUGFyYW0oZGVwZW5kZW5jaWVzOiBJRGVwZW5kZW5jeVtdKTogUHJvbWlzZTx7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nOyBsYXN0PzogYm9vbGVhbiB9W10+IHtcclxuICAgICAgICB0aGlzLnByb2dyZXNzKFwiYmFzZS5jcmVhdGUucXVlcnlWZXJzaW9uXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBkZXBlbmRzID0gPHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmc7IGxhc3Q/OiBib29sZWFuOyB9W10+ZGVwZW5kZW5jaWVzXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKGRlcGVuZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZGVwZW5kLmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWRlcGVuZC5lcy5maW5kKChlc1ZlcnNpb24pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICg8SUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uPnRoaXMuX2NvbmZpZykuZXMgPT09IGVzVmVyc2lvbjtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRlYnVnKEpTT04uc3RyaW5naWZ5KGRlcGVuZHMsIG51bGwsIDQpKTtcclxuXHJcbiAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSAoY29udGV4dDogYW55KTogYW55ID0+IHtcclxuICAgICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiBjb250ZXh0ICYmICF0aGlzLl9jb25maWcuc2V0dGluZ3Muc2lsZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzcGlubmVyID0gZ2V0U3Bpbm5lcihjaGFsay55ZWxsb3coY29udGV4dCksIDUpO1xyXG4gICAgICAgICAgICAgICAgc3Bpbm5lci5zdGFydCgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNwaW5uZXI7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGV4dCkge1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5zdG9wKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG4gPSBkZXBlbmRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBpZiAobnVsbCA9PSBkZXBlbmRzW2ldLnZlcnNpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNwaW5uZXIgPSBwcm9ncmVzcyhkZXBlbmRzW2ldLm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgZGVwZW5kc1tpXS52ZXJzaW9uID0gXCJeXCIgKyBhd2FpdCB0aGlzLnF1ZXJ5Tm9kZU1vZHVsZUxhdGVzdFZlcnNpb24oZGVwZW5kc1tpXS5uYW1lKTtcclxuICAgICAgICAgICAgICAgIHByb2dyZXNzKHNwaW5uZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpID09PSBuIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgZGVwZW5kc1tpXS5sYXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRlcGVuZHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB3ZWJwYWNrLmNvbmZpZy5qcyDjga4gdGVtcGxhdGUgcGFyYW1hZXRlciDjgpLlj5blvpdcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IGxpYnJhcnlUYXJnZXQg44Gr5oyH5a6a44GZ44KL5paH5a2X5YiXXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBxdWVyeVdlYnBhY2tMaWJyYXJ5VGFyZ2V0KCk6IHN0cmluZyB7XHJcbiAgICAgICAgc3dpdGNoICgoPElCdWlsZFRhcmdldENvbmZpZ3JhdGlvbj50aGlzLl9jb25maWcpLm1vZHVsZSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiY29tbW9uanNcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImNvbW1vbmpzMlwiO1xyXG4gICAgICAgICAgICBjYXNlIFwiYW1kXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJhbWRcIjtcclxuICAgICAgICAgICAgY2FzZSBcInVtZFwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwidW1kXCI7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGVzbGludHJjIOOBriBlbnYg44Gr5oyH5a6a44GZ44KLIHRlbXBsYXRlIHBhcmFtYWV0ZXIg44KS5Y+W5b6XXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBlbnYg44Gr5oyH5a6a44GZ44KL44OG44Oz44OX44Os44O844OI44OR44Op44Oh44O844K/44Kq44OW44K444Kn44Kv44OIXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBxdWVyeUVzTGludEVudlBhcmFtKCk6IGFueSB7XHJcbiAgICAgICAgY29uc3QgY29tcGlsZVNldHRpbmcgPSA8SUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uPnRoaXMuX2NvbmZpZztcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBlczY6IFwiZXM1XCIgIT09IGNvbXBpbGVTZXR0aW5nLmVzLFxyXG4gICAgICAgICAgICBub2RlOiBcIndlYlwiICE9PSBjb21waWxlU2V0dGluZy5lbnYsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIElCdWlsZFRhcmdldENvbmZpZ3JhdGlvbi50b29scyDjg5fjg63jg5Hjg4bjgqPjga7mjIflrprnirbms4HjgpLlj5blvpdcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9ICBuYW1lIOODhOODvOODq+WQjeOCkuaMh+WumlxyXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZTog5oyH5a6a44GV44KM44Gm44GE44KLIC8gZmFsc2U6IOaMh+WumuOBleOCjOOBpuOBhOOBquOBhFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgaXNFbmFibGVUb29sKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAhISg8SUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uPnRoaXMuX2NvbmZpZykudG9vbHMuZmluZCgodG9vbCkgPT4gbmFtZSA9PT0gdG9vbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIC8vIHByaXZhdGUgbWV0aG9kczpcclxuXHJcbiAgICAvKipcclxuICAgICAqIGNyZWF0ZSDlh6bnkIbjga7jgqjjg7Pjg4jjg6pcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBydW5DcmVhdGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVCYXNlKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YWx6YCa44GuIGNyZWF0ZSDlh6bnkIZcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVCYXNlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MoXCJiYXNlLmNyZWF0ZS5mb3VuZGF0aW9uXCIpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlUHJvamVjdERpcigpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY29weUJhc2VTdHJ1Y3R1cmUoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmNvcHlDb21tb25GaWxlcygpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY29weVRhc2tTY3JpcHRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDjg5fjg63jgrjjgqfjgq/jg4jjg4fjgqPjg6zjgq/jg4jjg6rjga7kvZzmiJBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVQcm9qZWN0RGlyKCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHRoaXMucm9vdERpcikpIHtcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IodHJhbnNsYXRlKFwiYmFzZS5jcmVhdGUuZXJyb3IuYWxyZWFkeUV4aXN0XCIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZnMubWtkaXJzU3luYyh0aGlzLnJvb3REaXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YWx6YCa5qeL5oiQ5oOF5aCx44Gu44Kz44OU44O8XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY29weUJhc2VTdHJ1Y3R1cmUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb3B5VHBsRGlyKFwiYmFzZS9zdHJ1Y3R1cmVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDln7rmnKzjg5XjgqHjgqTjg6vjga7jgrPjg5Tjg7xcclxuICAgICAqIHRlbXBsYXRlIOOBruOCs+ODlOODvOOCguihjOOBhlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvcHlDb21tb25GaWxlcygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzcmNEaXIgPSB0ZW1wbGF0ZVBhdGgoXCJiYXNlXCIpO1xyXG4gICAgICAgIGNvbnN0IGRzdERpciA9IHRoaXMucm9vdERpcjtcclxuXHJcbiAgICAgICAgLy8gLm5wbWlnbm9yZVxyXG4gICAgICAgIGNvcHlUcGwoXHJcbiAgICAgICAgICAgIHBhdGguam9pbihzcmNEaXIsIFwiX25wbWlnbm9yZVwiKSxcclxuICAgICAgICAgICAgcGF0aC5qb2luKGRzdERpciwgXCIubnBtaWdub3JlXCIpLFxyXG4gICAgICAgICAgICB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gQkFOTkVSXHJcbiAgICAgICAgZnMuY29weVN5bmMoXHJcbiAgICAgICAgICAgIHBhdGguam9pbihzcmNEaXIsIFwiX0JBTk5FUlwiKSxcclxuICAgICAgICAgICAgcGF0aC5qb2luKGRzdERpciwgXCJCQU5ORVJcIiksXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gTElDRU5TRVxyXG4gICAgICAgIHN3aXRjaCAodGhpcy5fY29uZmlnLmxpY2Vuc2UpIHtcclxuICAgICAgICAgICAgY2FzZSBcIkFwYWNoZS0yLjBcIjpcclxuICAgICAgICAgICAgICAgIGZzLmNvcHlTeW5jKFxyXG4gICAgICAgICAgICAgICAgICAgIHBhdGguam9pbihzcmNEaXIsIFwiX0xJQ0VOU0UuQXBhY2hlLTIuMFwiKSxcclxuICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4oZHN0RGlyLCBcIkxJQ0VOU0VcIiksXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJNSVRcIjpcclxuICAgICAgICAgICAgICAgIGNvcHlUcGwoXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY0RpciwgXCJfTElDRU5TRS5NSVRcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKGRzdERpciwgXCJMSUNFTlNFXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbmZpZy5jb3B5cmlnaHRcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTk9USUNFXHJcbiAgICAgICAgZnMuY29weVN5bmMoXHJcbiAgICAgICAgICAgIHBhdGguam9pbihzcmNEaXIsIFwiX05PVElDRVwiKSxcclxuICAgICAgICAgICAgcGF0aC5qb2luKGRzdERpciwgXCJOT1RJQ0VcIiksXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gYnVpbGQgdG9vbHM6IHdlYnBhY2tcclxuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZVRvb2woXCJ3ZWJwYWNrXCIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtOiBJV2VicGFja0NvbmZpZ3JhdGlvbiA9IHtcclxuICAgICAgICAgICAgICAgIG5vZGVqczogKDxJQnVpbGRUYXJnZXRDb25maWdyYXRpb24+dGhpcy5fY29uZmlnKS5ub2RlanMsXHJcbiAgICAgICAgICAgICAgICBndWlkZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHRhc2tQYXRoOiB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnRhc2ssXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvcHlUcGwoXHJcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4oc3JjRGlyLCBcInRvb2xzL3dlYnBhY2svX3dlYnBhY2suY29uZmlnLmpzXCIpLFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKGRzdERpciwgXCJ3ZWJwYWNrLmNvbmZpZy5qc1wiKSxcclxuICAgICAgICAgICAgICAgIHBhcmFtLFxyXG4gICAgICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHRhc2sgc2NyaXB0IOOBruOCs+ODlOODvFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvcHlUYXNrU2NyaXB0cygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzcmNEaXIgPSB0ZW1wbGF0ZVBhdGgoXCJiYXNlL3Rhc2tcIik7XHJcbiAgICAgICAgY29uc3QgZHN0RGlyID0gcGF0aC5qb2luKHRoaXMucm9vdERpciwgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50YXNrKTtcclxuXHJcbiAgICAgICAgdGhpcy50YXNrTGlzdC5mb3JFYWNoKCh0YXNrKSA9PiB7XHJcbiAgICAgICAgICAgIGZzLmNvcHlTeW5jKFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY0RpciwgdGFzayksXHJcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4oZHN0RGlyLCB0YXNrKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vLi4vc3JjL2dlbmVyYXRvcnMvYmFzZS9nZW5lcmF0b3ItYmFzZS50cyJdfQ== \ No newline at end of file diff --git a/dist/cdp-lib.min.js b/dist/cdp-lib.min.js index 10fc6c0..9b91f14 100644 --- a/dist/cdp-lib.min.js +++ b/dist/cdp-lib.min.js @@ -1,7 +1,7 @@ /*! - * cdp-lib.js 0.1.3 + * cdp-lib.js 0.1.4 * - * Date: 2017-11-15T03:44:26.440Z + * Date: 2017-11-21T08:28:50.840Z */ module.exports=function(modules){var installedModules={};function __webpack_require__(moduleId){if(installedModules[moduleId]){return installedModules[moduleId].exports}var module=installedModules[moduleId]={i:moduleId,l:false,exports:{}};modules[moduleId].call(module.exports,module,module.exports,__webpack_require__);module.l=true;return module.exports}__webpack_require__.m=modules;__webpack_require__.c=installedModules;__webpack_require__.d=function(exports,name,getter){if(!__webpack_require__.o(exports,name)){Object.defineProperty(exports,name,{configurable:false,enumerable:true,get:getter})}};__webpack_require__.n=function(module){var getter=module&&module.__esModule?function getDefault(){return module["default"]}:function getModuleExports(){return module};__webpack_require__.d(getter,"a",getter);return getter};__webpack_require__.o=function(object,property){return Object.prototype.hasOwnProperty.call(object,property)};__webpack_require__.p="";return __webpack_require__(__webpack_require__.s=14)}([function(module,exports){module.exports=require("path")},function(module,exports,__webpack_require__){"use strict";function __export(m){for(var p in m)if(!exports.hasOwnProperty(p))exports[p]=m[p]}Object.defineProperty(exports,"__esModule",{value:true});__export(__webpack_require__(32));__export(__webpack_require__(33))},function(module,exports,__webpack_require__){"use strict";function __export(m){for(var p in m)if(!exports.hasOwnProperty(p))exports[p]=m[p]}Object.defineProperty(exports,"__esModule",{value:true});__export(__webpack_require__(3));__export(__webpack_require__(29));__export(__webpack_require__(5))},function(module,exports,__webpack_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:true});const fs=__webpack_require__(16);exports.fs=fs;const glob=__webpack_require__(17);exports.glob=glob;const hogan=__webpack_require__(18);exports.hogan=hogan;const _l=__webpack_require__(19);const _s=__webpack_require__(20);const which=__webpack_require__(21);exports.which=which;const uuid=__webpack_require__(22);exports.uuid=uuid;const chalk_1=__webpack_require__(23);exports.chalk=chalk_1.default;const semverRegex=__webpack_require__(24);exports.semverRegex=semverRegex;const cli_spinner_1=__webpack_require__(25);exports.Spinner=cli_spinner_1.Spinner;const $=(()=>{const _window=(()=>{const jsdom=__webpack_require__(26);if("function"===typeof jsdom.JSDOM){return(new jsdom.JSDOM).window}else{return jsdom.jsdom().defaultView}})();(root=>{const xmldom=__webpack_require__(27);root.DOMParser=xmldom.DOMParser;global.XMLSerializer=root.XMLSerializer=xmldom.XMLSerializer})(_window);return __webpack_require__(28)(_window)})();exports.$=$;const _m=_l.mixin(_s.exports());exports._=_m},function(module,exports){module.exports=require("os")},function(module,exports,__webpack_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:true});const path=__webpack_require__(0);const libs_1=__webpack_require__(3);let _settings={force:false,verbose:false,silent:false,lang:"en-US"};let _libPath;function getSettings(){return libs_1.$.extend({},_settings)}exports.getSettings=getSettings;function setSettings(settings){if(settings){_settings.force=settings.force||_settings.force;_settings.verbose=settings.verbose||_settings.verbose;_settings.silent=settings.silent||_settings.silent;_settings.targetDir=settings.targetDir||_settings.targetDir;_settings.lang=settings.lang||_settings.lang}else{_settings={force:false,verbose:false,silent:false,lang:"en-US"}}}exports.setSettings=setSettings;function getLibPath(){if(null==_libPath){const TRY_COUNT=3;let tried=0;_libPath=__dirname;while(true){if(TRY_COUNT<=tried){throw Error("lib path is not resolved.")}_libPath=path.join(_libPath,"..");const check=path.join(_libPath,"cdp-lib");if(libs_1.fs.pathExistsSync(check)){_libPath=check;break}tried++}}return _libPath}exports.getLibPath=getLibPath;function getTargetDir(){return _settings.targetDir}exports.getTargetDir=getTargetDir;function log(message,...optionalParams){if(!_settings.silent){if(0depend.name)}get config(){return this._config}ensureModuleProps(){if(null==this.config.moduleName){if(!/^.*[(\\|\s|/|:|*|?|"|<|>||)].*$/.test(this.config.projectName)){this.config.moduleName=this.config.projectName}else{this.config.moduleName=_.trim(_.dasherize(this.config.projectName),"-")}}debug("moduleName: "+this.config.moduleName);if(null==this.config.mainBaseName){this.config.mainBaseName=this.config.moduleName}debug("mainBaseName: "+this.config.mainBaseName)}createDirectoryStructure(){this.copyTplDir("library/structure")}createProjectSettings(){return __awaiter(this,void 0,void 0,function*(){copyTpl(path.join(templatePath("library"),"_project.config.js"),path.join(this.rootDir,"project.config.js"),this._config,{delimiters:"<% %>"});if(!this.config.outputSameDir){copyTpl(path.join(templatePath("library"),"_tsconfig.json"),path.join(this.rootDir,"tsconfig.json"),this._config,{delimiters:"<% %>",bom:false});copyTpl(path.join(templatePath("library"),"_tsconfig.test.json"),path.join(this.rootDir,this._config.structureConfig.test,"unit","tsconfig.json"),this._config,{delimiters:"<% %>",bom:false})}else{copyTpl(path.join(templatePath("library"),"_tsconfig.output-same-dir.json"),path.join(this.rootDir,"tsconfig.json"),this._config,{delimiters:"<% %>",bom:false})}copyTpl(path.join(templatePath("library"),"_eslintrc.json"),path.join(this.rootDir,this._config.structureConfig.test,"eslint","eslintrc.json"),this.queryEsLintEnvParam(),{delimiters:"<% %>",bom:false});if(!this.config.nodejs){copyTpl(path.join(templatePath("library/tools/testem"),"_testem.json"),path.join(this.rootDir,this._config.structureConfig.test,"runner","testem.json"),this._config,{delimiters:"<% %>",bom:false});const testemStuffPath=templatePath("library/tools/testem/runner");glob.sync("**",{cwd:testemStuffPath,nodir:true}).forEach(file=>{fs.copySync(path.join(testemStuffPath,file),path.join(this.rootDir,this._config.structureConfig.test,"runner",file))})}copyTpl(path.join(templatePath("library"),"_gitignore"),path.join(this.rootDir,".gitignore"),this._config,{bom:false});copyTpl(path.join(templatePath("library"),"_README.md"),path.join(this.rootDir,"README.md"),this._config,{delimiters:"<% %>"});this.config.devDependencies=yield this.queryDependenciesParam(this.config.devDependencies||this.defaultDevDependencies);copyTpl(path.join(templatePath("library"),"_package.json"),path.join(this.rootDir,"package.json"),this._config,{delimiters:"<% %>",bom:false})})}createSourceTemplate(){return __awaiter(this,void 0,void 0,function*(){const _module=path.basename(this._config.moduleName,".js");const param={sampleClass:_.classify(_module),sampleModule:_module,built:this._config.structureConfig.built};const script=(()=>{if(this._config.structureConfig.srcConfig){return this._config.structureConfig.srcConfig.script||""}return""})();copyTpl(path.join(templatePath("library"),"src","_index.ts"),path.join(this.rootDir,this._config.structureConfig.src,script,_module+".ts"),param,{delimiters:"<% %>"});copyTpl(path.join(templatePath("library"),"src","_index.spec.ts"),path.join(this.rootDir,this._config.structureConfig.test,"unit",_module+".spec.ts"),param,{delimiters:"<% %>"})})}createVisualStudioSolution(){return __awaiter(this,void 0,void 0,function*(){const vsParam=(()=>{const createGUID=base_1.Utils.createGUID;const param=$.extend({},this._config.structureConfig);param.projectName=this._config.projectName;param.projectGUID=createGUID();param.types=param.types.replace("@","%40");param.mainBaseName=this._config.mainBaseName;param.license=!this._config.private;param.webpack=this.isEnableTool("webpack");param.testem=!this.config.nodejs;param.outputSameDir=this.config.outputSameDir;param.jsGroup=[];if(!param.outputSameDir){param.jsGroup.push({relativePath:param.built+"\\",fileName:param.mainBaseName,dependee:true,d_ts:true,map:true,min_map:false})}if(this.config.minify){param.jsGroup.push({relativePath:param.pkg+"\\",fileName:param.mainBaseName,dependee:false,d_ts:false,map:false,min_map:true})}param.tsGroup=[{relativePath:param.test+"\\unit\\",fileName:param.mainBaseName+".spec",dependee:true,map:this.config.outputSameDir}];if(param.outputSameDir){param.tsGroup.push({relativePath:param.built+"\\",fileName:param.mainBaseName,dependee:false,map:true})}return param})();copyTpl(path.join(templatePath("base/visual.studio"),"_solution.sln.tpl"),path.join(this.rootDir,vsParam.projectName+".sln"),vsParam,{delimiters:"<% %>"});(()=>{const toXmlString=file=>{const hogan=base_1.Utils.hogan;const normalizeText=base_1.Utils.normalizeText;const options={eol:os.EOL,bom:true,delimiters:"{{ }}"};const tpl=path.join(templatePath("base/visual.studio"),file);const jst=hogan.compile(normalizeText(fs.readFileSync(tpl).toString(),{eol:"\n",bom:false}),options);return jst.render(vsParam)};const toXmlDOM=file=>{return $($.parseXML(toXmlString(file)))};const toXmlNode=file=>{return base_1.Utils.str2XmlNode(toXmlString(file))};const $proj=toXmlDOM("_project.csproj.tpl");const $gpTS=toXmlNode("_ts.item.group.tpl");const $gpJS=toXmlNode("_js.item.group.tpl");$proj.find("ItemGroup").last().after($gpTS).after($gpJS);const formatXML=base_1.Utils.formatXML;const dstPath=path.join(this.rootDir,vsParam.projectName+".csproj");debug(base_1.Utils.xmlNode2Str($proj));fs.writeFileSync(dstPath,formatXML(base_1.Utils.xmlNode2Str($proj)))})()})}}exports.GeneratorModule=GeneratorModule},function(module,exports,__webpack_require__){"use strict";function __export(m){for(var p in m)if(!exports.hasOwnProperty(p))exports[p]=m[p]}Object.defineProperty(exports,"__esModule",{value:true});const generator_cordova_1=__webpack_require__(9);__export(__webpack_require__(9));function newGeneratorMobile(config){return new generator_cordova_1.GeneratorCordova(config)}exports.newGeneratorMobile=newGeneratorMobile},function(module,exports,__webpack_require__){"use strict";var __awaiter=this&&this.__awaiter||function(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator["throw"](value))}catch(e){reject(e)}}function step(result){result.done?resolve(result.value):new P(function(resolve){resolve(result.value)}).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})};Object.defineProperty(exports,"__esModule",{value:true});const path=__webpack_require__(0);const os=__webpack_require__(4);const utils_1=__webpack_require__(2);const base_1=__webpack_require__(1);class GeneratorCordova extends base_1.GeneratorBase{defaultBaseStructure(){return{src:"app",pkg:"www",built:"app",doc:"docs",task:"tasks",test:"tests",types:"@types",temp:".temp",lib:"lib",external:"external",porting:"porting",res:"res",srcConfig:{script:"scripts",stylesheet:"stylesheets",template:"templates"}}}create(){return __awaiter(this,void 0,void 0,function*(){utils_1.debug(JSON.stringify(this.config,null,4));if(this.isEnableCordova()){yield this.chdir(this.rootDir);yield this.createCordovaScaffold();yield this.updateConfigXML();yield this.addCordovaPlatforms();yield this.addCordovaPlugins();yield this.addCordovaExtentionFiles();yield this.cacheCordovaPackageJSON();yield this.chdir("..")}yield this.createDirectoryStructure();yield this.createProjectSettings();yield this.createSourceTemplate();yield this.createVisualStudioSolution()})}get taskList(){return["banner.js","clean.js","command.js","external-rearrange.js","minify.js","srcmap.js","bundle-finalizer.js","remap-coverage.js"]}get defaultDevDependencies(){const depends=super.defaultDevDependencies.concat([{name:"@types/jasmine",version:undefined},{name:"@types/requirejs",version:undefined},{name:"autoprefixer",version:undefined},{name:"clean-css",version:undefined},{name:"fs-extra",version:undefined},{name:"html-minifier",version:undefined},{name:"node-sass",version:undefined},{name:"postcss-cli",version:undefined},{name:"smartwatch",version:undefined}]);const extra=[];this.config.devDependencies.forEach(depend=>{extra.push({name:depend.name,version:depend.version})});if(this.isEnableCordova()){extra.push({name:"@types/cordova",version:undefined})}return utils_1._.sortBy(depends.concat(extra),depend=>depend.name)}queryEsLintEnvParam(){const base=super.queryEsLintEnvParam();return Object.assign({},base,{cordova:this.isEnableCordova(),hammerjs:this.isInstallationTarget("hammerjs"),iscroll:this.isInstallationTarget("iscroll"),flipsnap:this.isInstallationTarget("flipsnap")})}queryTsConfigBaseParam(){return Object.assign({},this._config,{cordova:this.isEnableCordova()})}get defaultDependencies(){const depends=[{name:"@cdp/mobile",version:undefined},{name:"backbone",version:undefined},{name:"jquery",version:undefined},{name:"requirejs",version:undefined},{name:"underscore",version:undefined}];const extra=[];this.config.dependencies.forEach(depend=>{extra.push({name:depend.name,version:depend.version})});return utils_1._.sortBy(depends.concat(extra),depend=>depend.name)}get config(){return this._config}isEnableCordova(){return 0name===depend.name)}createCordovaScaffold(){return __awaiter(this,void 0,void 0,function*(){this.progress("mobile.create.cordova.createCordovaScaffold");utils_1.debug("createCordovaScaffold");yield utils_1.execCommand("cordova",["create",this.config.projectName,this.config.appId,this.config.appName]);utils_1.glob.sync("www/**/*",{cwd:this.config.projectName}).forEach(file=>{utils_1.fs.removeSync(path.join(this.config.projectName,file))});utils_1.fs.removeSync(path.join(this.config.projectName,"res"));utils_1.fs.removeSync(path.join(this.config.projectName,".npmignore"));utils_1.fs.copySync(this.config.projectName,"./");utils_1.fs.removeSync(this.config.projectName)})}updateConfigXML(){return __awaiter(this,void 0,void 0,function*(){this.progress("mobile.create.cordova.updateConfigXml");utils_1.debug("updateConfigXML");const configXmlPath=path.join(process.cwd(),"config.xml");const $configXmlDom=utils_1.$(utils_1.str2XmlNode(utils_1.fs.readFileSync(configXmlPath).toString()));$configXmlDom.find("widget").attr("version",this.config.version).attr("ios-CFBundleIdentifier",this.config.appId).prepend(utils_1.str2XmlNode(`\n \n \n \n `));$configXmlDom.find("description").remove();$configXmlDom.find("author").remove();utils_1.fs.writeFileSync(configXmlPath,utils_1.formatXML(utils_1.xmlNode2Str($configXmlDom)))})}addCordovaPlatforms(){return __awaiter(this,void 0,void 0,function*(){utils_1.debug("addCordovaPlatforms");const targets=this.config.platforms.slice();const index=targets.indexOf("ios");if(0<=index&&"darwin"!==process.platform){this.warn("mobile.create.cordova.iOSWarning");targets.splice(index,1);if(targets.length<=0){return Promise.resolve()}}this.progress("mobile.create.cordova.addPlatforms");yield utils_1.execCommand("cordova",["platform","add"].concat(targets))})}addCordovaPlugins(){return __awaiter(this,void 0,void 0,function*(){this.progress("mobile.create.cordova.addPlugins");utils_1.debug("addCordovaPlugins");for(let i=0,n=this.config.cordova_plugin.length;i{if(utils_1.fs.statSync(path.join(PLATFORMS_ROOT,platform)).isDirectory()){this.copyTplDir("mobile/structure/porting",path.join(PLATFORMS_ROOT,platform,this.config.structureConfig.porting))}})}const WWW=path.join(this.rootDir,this.config.structureConfig.pkg);if(!utils_1.fs.existsSync(WWW)){utils_1.fs.mkdir(WWW)}utils_1.fs.copySync(utils_1.templatePath("base/.gitkeep"),path.join(WWW,".gitkeep"));utils_1.glob.sync("**/*",{cwd:utils_1.templatePath("mobile/task")}).forEach(file=>{utils_1.fs.copySync(path.join(utils_1.templatePath("mobile/task"),file),path.join(this.rootDir,this.config.structureConfig.task,file))})}createProjectSettings(){return __awaiter(this,void 0,void 0,function*(){this.progress("mobile.create.app.createProjectSettings");utils_1.debug("createProjectSettings");utils_1.copyTpl(path.join(utils_1.templatePath("mobile"),"_project.config.js"),path.join(this.rootDir,"project.config.js"),utils_1.$.extend({},this._config,{hogan:this.isInstallationTarget("hogan.js"),hammerjs:this.isInstallationTarget("hammerjs"),iscroll:this.isInstallationTarget("iscroll")}),{delimiters:"<% %>"});utils_1.copyTpl(path.join(utils_1.templatePath("mobile"),"_tsconfig.base.json"),path.join(this.rootDir,"tsconfig.base.json"),this.queryTsConfigBaseParam(),{delimiters:"<% %>",bom:false});utils_1.copyTpl(path.join(utils_1.templatePath("mobile"),"_tsconfig.json"),path.join(this.rootDir,"tsconfig.json"),this._config,{delimiters:"<% %>",bom:false});utils_1.copyTpl(path.join(utils_1.templatePath("mobile"),"_eslintrc.json"),path.join(this.rootDir,this._config.structureConfig.test,"eslint","eslintrc.json"),this.queryEsLintEnvParam(),{delimiters:"<% %>",bom:false});utils_1.copyTpl(path.join(utils_1.templatePath("mobile/tools/testem"),"_testem.json"),path.join(this.rootDir,this._config.structureConfig.test,"runner","testem.json"),this._config,{delimiters:"<% %>",bom:false});const testemStuffPath=utils_1.templatePath("mobile/tools/testem/runner");utils_1.glob.sync("**",{cwd:testemStuffPath,nodir:true}).forEach(file=>{utils_1.fs.copySync(path.join(testemStuffPath,file),path.join(this.rootDir,this._config.structureConfig.test,"runner",file))});utils_1.copyTpl(path.join(utils_1.templatePath("mobile"),"_gitignore"),path.join(this.rootDir,".gitignore"),this._config,{bom:false});utils_1.copyTpl(path.join(utils_1.templatePath("mobile"),"_README.md"),path.join(this.rootDir,"README.md"),utils_1.$.extend({},this._config,{cordova:this.isEnableCordova(),lib:this.hasStructureOf("lib"),porting:this.hasStructureOf("porting")}),{delimiters:"<% %>"});const resolvedConfig=utils_1.$.extend(true,{},this.config);resolvedConfig.dependencies=yield this.queryDependenciesParam(this.defaultDependencies);resolvedConfig.devDependencies=yield this.queryDependenciesParam(this.defaultDevDependencies);utils_1.copyTpl(path.join(utils_1.templatePath("mobile"),"_package.json"),path.join(this.rootDir,"package.json"),resolvedConfig,{delimiters:"<% %>",bom:false});if(this.config.cordovaPackageJson){const PKG_PATH=path.join(this.rootDir,"package.json");const pkg=JSON.parse(utils_1.fs.readFileSync(PKG_PATH).toString());utils_1.$.extend(true,pkg,this.config.cordovaPackageJson);const sortKeys=target=>{const sorted={};Object.keys(target).sort().forEach(key=>{sorted[key]=target[key]});return sorted};pkg.dependencies=sortKeys(pkg.dependencies);pkg.devDependencies=sortKeys(pkg.devDependencies);utils_1.fs.writeFileSync(PKG_PATH,JSON.stringify(pkg,null,2))}})}createSourceTemplate(){return __awaiter(this,void 0,void 0,function*(){this.progress("mobile.create.app.createSourceTemplate");utils_1.debug("createSourceTemplate");this.copyTplDir("mobile/src/structure",path.join(this.rootDir));{const additional=(()=>{if(this.config.dependencies.length<0){return null}const param={additional:{list:[],listWithCustomName:[]}};const targets=[...this.config.dependencies,...this.config.resource_addon];targets.forEach(info=>{if(info.fileName||info.venderName){param.additional.listWithCustomName.push({moduleName:info.alias||info.name,venderName:info.venderName||info.alias||info.name,fileName:info.fileName||info.alias||info.name})}else{param.additional.list.push({moduleName:info.alias||info.name})}});return param})();utils_1.copyTpl(path.join(utils_1.templatePath("mobile/src"),"_config.ts"),path.join(this.rootDir,this.config.structureConfig.src,this.config.structureConfig.srcConfig.script,"config.ts"),utils_1.$.extend({},this._config,additional),{delimiters:"<% %>"})}{const globals=(()=>{if(this.config.dependencies.length<0){return null}const param={globals:{importsList:[],exportsList:[],hasExports:false}};const targets=[...this.config.dependencies,...this.config.resource_addon];targets.forEach(info=>{if(info.globalExport){param.globals.exportsList.push({globalExport:info.globalExport,moduleName:info.alias||info.name})}else{param.globals.importsList.push({moduleName:info.alias||info.name})}});param.globals.hasExports=0"})}{utils_1.copyTpl(path.join(utils_1.templatePath("mobile/src/_locales"),"_messages.en-US.json"),path.join(this.rootDir,this.config.structureConfig.src,this.config.structureConfig.res,"locales","messages.en-US.json"),this.config,{delimiters:"<% %>",bom:false});utils_1.copyTpl(path.join(utils_1.templatePath("mobile/src/_locales"),"_messages.ja-JP.json"),path.join(this.rootDir,this.config.structureConfig.src,this.config.structureConfig.res,"locales","messages.ja-JP.json"),this.config,{delimiters:"<% %>",bom:false});utils_1.fs.unlinkSync(path.join(this.rootDir,this.config.structureConfig.src,this.config.structureConfig.res,".gitkeep"))}{utils_1.copyTpl(path.join(utils_1.templatePath("mobile/src/_patch.dependencies"),"_index.d.ts"),path.join(this.rootDir,this.config.structureConfig.src,this.config.structureConfig.external,this.config.structureConfig.types,"patch.dependencies","index.d.ts"),{hammerjs:this.isInstallationTarget("hammerjs"),flipsnap:this.isInstallationTarget("flipsnap"),iscroll:this.isInstallationTarget("iscroll")});if(this.isInstallationTarget("hammerjs")){utils_1.fs.copySync(utils_1.templatePath("mobile/src/_patch.dependencies/jquery.hammer.d.ts"),path.join(this.rootDir,this.config.structureConfig.src,this.config.structureConfig.external,this.config.structureConfig.types,"patch.dependencies","jquery.hammer.d.ts"))}if(this.isInstallationTarget("flipsnap")){utils_1.fs.copySync(utils_1.templatePath("mobile/src/_patch.dependencies/flipsnap.d.ts"),path.join(this.rootDir,this.config.structureConfig.src,this.config.structureConfig.external,this.config.structureConfig.types,"patch.dependencies","flipsnap.d.ts"))}if(this.isInstallationTarget("iscroll")){utils_1.fs.copySync(utils_1.templatePath("mobile/src/_patch.dependencies/iscroll.d.ts"),path.join(this.rootDir,this.config.structureConfig.src,this.config.structureConfig.external,this.config.structureConfig.types,"patch.dependencies","iscroll.d.ts"))}utils_1.fs.unlinkSync(path.join(this.rootDir,this.config.structureConfig.src,this.config.structureConfig.external,this.config.structureConfig.types,".gitkeep"))}{utils_1.copyTpl(path.join(utils_1.templatePath("mobile/src"),"_index.html"),path.join(this.rootDir,this.config.structureConfig.src,"index.html"),this.config)}})}createVisualStudioSolution(){return __awaiter(this,void 0,void 0,function*(){const vsParam=(()=>{const param=utils_1.$.extend({},this._config.structureConfig);param.projectName=this._config.projectName;param.projectGUID=utils_1.createGUID();param.types=param.types.replace("@","%40");param.license=!this._config.private;param.cordova=this.isEnableCordova();param.hogan=this.isInstallationTarget("hogan.js");param.hammerjs=this.isInstallationTarget("hammerjs");param.iscroll=this.isInstallationTarget("iscroll");param.flipsnap=this.isInstallationTarget("flipsnap");param.enableLib=this.hasStructureOf("lib");param.enablePorting=this.hasStructureOf("porting");param.platforms=[...this.config.platforms];param.tsGroup=[];utils_1.glob.sync("**/*.ts",{cwd:path.join(this.rootDir,param.src,param.srcConfig.script)}).forEach(file=>{const relativePath=path.join(param.src,param.srcConfig.script,path.dirname(file)).replace(/\//g,"\\")+"\\";const fileName=path.basename(file,".ts");param.tsGroup.push({relativePath:relativePath,fileName:fileName,dependee:true,map:false})});utils_1.glob.sync("**/*.ts",{cwd:path.join(this.rootDir,this.config.structureConfig.test,"unit")}).forEach(file=>{const relativePath=param.test+"\\unit\\";const fileName=path.basename(file,".ts");param.tsGroup.push({relativePath:relativePath,fileName:fileName,dependee:true,map:false})});return param})();utils_1.copyTpl(path.join(utils_1.templatePath("base/visual.studio"),"_solution.sln.tpl"),path.join(this.rootDir,vsParam.projectName+".sln"),vsParam,{delimiters:"<% %>"});(()=>{const toXmlString=file=>{const options={eol:os.EOL,bom:true,delimiters:"{{ }}"};const jst=utils_1.hogan.compile(utils_1.normalizeText(utils_1.fs.readFileSync(file).toString(),{eol:"\n",bom:false}),options);return jst.render(vsParam)};const toXmlDOM=file=>{return utils_1.$(utils_1.$.parseXML(toXmlString(file)))};const toXmlNode=file=>{return utils_1.str2XmlNode(toXmlString(file))};const $proj=toXmlDOM(path.join(utils_1.templatePath("mobile/visual.studio"),"_project.csproj.tpl"));const $gpTS=toXmlNode(path.join(utils_1.templatePath("base/visual.studio"),"_ts.item.group.tpl"));$proj.find("ItemGroup").last().after($gpTS);const dstPath=path.join(this.rootDir,vsParam.projectName+".csproj");utils_1.debug(utils_1.xmlNode2Str($proj));utils_1.fs.writeFileSync(dstPath,utils_1.formatXML(utils_1.xmlNode2Str($proj)))})();utils_1.fs.copySync(utils_1.templatePath("mobile/visual.studio/_web.config"),path.join(this.rootDir,"web.config"));utils_1.fs.copySync(utils_1.templatePath("mobile/visual.studio/_web.Debug.config"),path.join(this.rootDir,"web.Debug.config"));utils_1.fs.copySync(utils_1.templatePath("mobile/visual.studio/_web.Release.config"),path.join(this.rootDir,"web.Release.config"))})}}exports.GeneratorCordova=GeneratorCordova},function(module,exports,__webpack_require__){"use strict";function __export(m){for(var p in m)if(!exports.hasOwnProperty(p))exports[p]=m[p]}Object.defineProperty(exports,"__esModule",{value:true});const generator_electoron_1=__webpack_require__(11);__export(__webpack_require__(11));function newGeneratorDesktop(config){return new generator_electoron_1.GeneratorElectron(config)}exports.newGeneratorDesktop=newGeneratorDesktop},function(module,exports,__webpack_require__){"use strict";var __awaiter=this&&this.__awaiter||function(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator["throw"](value))}catch(e){reject(e)}}function step(result){result.done?resolve(result.value):new P(function(resolve){resolve(result.value)}).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})};Object.defineProperty(exports,"__esModule",{value:true});const base_1=__webpack_require__(1);class GeneratorElectron extends base_1.GeneratorBase{defaultBaseStructure(){return{src:"app",pkg:"www/app",built:"app",doc:"docs",task:"tasks",test:"tests",types:"@types",srcConfig:{script:"scripts",stylesheet:"stylesheets",template:"templates"}}}create(){return __awaiter(this,void 0,void 0,function*(){return Promise.reject("under construction.")})}get taskList(){return["banner.js","clean.js","srcmap.js","build-ts-clean.js","build-ts-normalize.js"]}get config(){return this._config}}exports.GeneratorElectron=GeneratorElectron},function(module,exports,__webpack_require__){"use strict";function __export(m){for(var p in m)if(!exports.hasOwnProperty(p))exports[p]=m[p]}Object.defineProperty(exports,"__esModule",{value:true});const generator_browser_1=__webpack_require__(13);__export(__webpack_require__(13));function newGeneratorWeb(config){return new generator_browser_1.GeneratorBrowser(config)}exports.newGeneratorWeb=newGeneratorWeb},function(module,exports,__webpack_require__){"use strict";var __awaiter=this&&this.__awaiter||function(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator["throw"](value))}catch(e){reject(e)}}function step(result){result.done?resolve(result.value):new P(function(resolve){resolve(result.value)}).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})};Object.defineProperty(exports,"__esModule",{value:true});const base_1=__webpack_require__(1);class GeneratorBrowser extends base_1.GeneratorBase{defaultBaseStructure(){return{src:"app",pkg:"www",built:"app",doc:"docs",task:"tasks",test:"tests",types:"@types"}}create(){return __awaiter(this,void 0,void 0,function*(){return Promise.reject("under construction.")})}get taskList(){return["banner.js","clean.js","srcmap.js","build-ts-clean.js","build-ts-normalize.js"]}get config(){return this._config}}exports.GeneratorBrowser=GeneratorBrowser},function(module,exports,__webpack_require__){module.exports=__webpack_require__(15)},function(module,exports,__webpack_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:true});const Utils=__webpack_require__(2);exports.Utils=Utils;const generators_1=__webpack_require__(31);class CDPLib{static execute(config){Utils.setSettings(config.settings);return generators_1.newGenerator(config).run()}}exports.default=CDPLib},function(module,exports){module.exports=require("fs-extra")},function(module,exports){module.exports=require("glob")},function(module,exports){module.exports=require("hogan.js")},function(module,exports){module.exports=require("lodash")},function(module,exports){module.exports=require("underscore.string")},function(module,exports){module.exports=require("which")},function(module,exports){module.exports=require("uuid")},function(module,exports){module.exports=require("chalk")},function(module,exports){module.exports=require("semver-regex")},function(module,exports){module.exports=require("cli-spinner")},function(module,exports){module.exports=require("jsdom")},function(module,exports){module.exports=require("xmldom")},function(module,exports){module.exports=require("jquery")},function(module,exports,__webpack_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:true});const path=__webpack_require__(0);const os=__webpack_require__(4);const child_process_1=__webpack_require__(30);const libs_1=__webpack_require__(3);const settings_1=__webpack_require__(5);function handleError(error){settings_1.assert(false,error)}exports.handleError=handleError;function templatePath(target){if(null==target){return path.join(settings_1.getLibPath(),"templates")}else{return path.join(settings_1.getLibPath(),"templates",target)}}exports.templatePath=templatePath;function getSpinner(format,index){const spinners=["|/-\\","┤┘┴└├┌┬┐","◢◣◤◥","▌▀▐▄","▉▊▋▌▍▎▏▎▍▌▋▊▉","▁▃▄▅▆▇█▇▆▅▄▃","☱☲☴",".oO@*","◐◓◑◒","◡◡ ⊙⊙ ◠◠","■□▪▫","←↖↑↗→↘↓↙",".oO°Oo."];const fmt=format||"%s";const spinner=new libs_1.Spinner(fmt);const idx=null!=index&&0<=index&&index<14?index:Math.floor(Math.random()*10);spinner.setSpinnerString(spinners[idx]);return spinner}exports.getSpinner=getSpinner;function normalizeText(text,options){const opt=libs_1.$.extend({},{eol:os.EOL,bom:true},options);text=text.replace(/^\ufeff/gm,"").replace(/\r\n/gm,"\n").replace(/\r/gm,"\n");if(opt.bom){text="\ufeff"+text}if("\n"!==opt.eol){text=text.replace(/\n/gm,opt.eol)}if(opt.tab){const spaces=(()=>{let s="";for(let i=0;i{const opt=libs_1.$.extend({},{stdio:"inherit",spinner:{format:"%s"},stdout:data=>{},stderr:data=>{}},options);const quoteIfNeeded=str=>{if("win32"===os.platform()&&str.includes(" ")){str='"'+str+'"';opt.shell=true}return str};libs_1.which(command,(error,resolvedCommand)=>{if(error){handleError(JSON.stringify(error))}const spinner=opt.spinner?getSpinner(opt.spinner.format,opt.spinner.index):null;if(spinner){spinner.start()}resolvedCommand=quoteIfNeeded(resolvedCommand);args=args.map(quoteIfNeeded);const child=child_process_1.spawn(resolvedCommand,args,opt).on("error",handleError).on("close",code=>{if(spinner){spinner.stop(true)}resolve(code)});if("pipe"===opt.stdio){child.stdout.on("data",data=>{opt.stdout(data.toString())});child.stderr.on("data",data=>{opt.stderr(data.toString())})}})})}exports.execCommand=execCommand;function copyTpl(src,dst,params,options){const opt=libs_1.$.extend({},{eol:os.EOL,bom:true,delimiters:"{{ }}"},options);const jst=libs_1.hogan.compile(normalizeText(libs_1.fs.readFileSync(src).toString(),{eol:"\n",bom:false}),opt);const output=normalizeText(jst.render(params),opt);libs_1.fs.ensureFileSync(dst);libs_1.fs.writeFileSync(dst,output,"utf8")}exports.copyTpl=copyTpl;function createGUID(){return"{"+libs_1.uuid.v4().toUpperCase()+"}"}exports.createGUID=createGUID;function str2XmlNode(str){let fullXML=true;if(!/)(<)(\/*)/g,"$1\n$2$3").split("\n");const spaces=len=>{let s="";const _indent=len*opt.step;for(let i=0;i<_indent;i++){s+=" "}return s};for(let i=0;i]*>$/)){indent=0}else if(node.match(/^<\/\w/)){if(pad>0){pad-=1}}else if(node.match(/^<\w[^>]*[^/]>.*$/)){indent=1}else{indent=0}xml+=spaces(pad)+node+"\n";pad+=indent}xml=xml.replace(/\n\n/gm,"\n").replace(/^ +\n/gm,"");return normalizeText(xml,opt)}exports.formatXML=formatXML},function(module,exports){module.exports=require("child_process")},function(module,exports,__webpack_require__){"use strict";function __export(m){for(var p in m)if(!exports.hasOwnProperty(p))exports[p]=m[p]}Object.defineProperty(exports,"__esModule",{value:true});const settings_1=__webpack_require__(5);const library_1=__webpack_require__(6);const mobile_1=__webpack_require__(8);const desktop_1=__webpack_require__(10);const web_1=__webpack_require__(12);__export(__webpack_require__(1));__export(__webpack_require__(6));__export(__webpack_require__(8));__export(__webpack_require__(10));__export(__webpack_require__(12));function newGenerator(config){switch(config.projectType){case"library":return library_1.newGeneratorLibrary(config);case"mobile":return mobile_1.newGeneratorMobile(config);case"desktop":return desktop_1.newGeneratorDesktop(config);case"web":return web_1.newGeneratorWeb(config);default:settings_1.assert(false,"unsupported project kind: "+config.projectType);return null}}exports.newGenerator=newGenerator},function(module,exports,__webpack_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:true});const Utils=__webpack_require__(2);exports.Utils=Utils},function(module,exports,__webpack_require__){"use strict";var __awaiter=this&&this.__awaiter||function(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator["throw"](value))}catch(e){reject(e)}}function step(result){result.done?resolve(result.value):new P(function(resolve){resolve(result.value)}).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})};Object.defineProperty(exports,"__esModule",{value:true});const path=__webpack_require__(0);const utils_1=__webpack_require__(2);class GeneratorBase{constructor(_config){this._config=_config;this._projectRootDir=utils_1.getTargetDir()?utils_1.getTargetDir():path.join(process.cwd(),this._config.projectName);this._config.structureConfig=utils_1.$.extend({},this.defaultBaseStructure(),this._config.structureConfig);this._config.private="NONE"===this._config.license;this._config.outputSameDir=this._config.structureConfig.src===this._config.structureConfig.built;this._config.nodejs=(env=>{switch(env){case"node":case"electron":return true;default:return false}})(this._config.env);utils_1.debug(JSON.stringify(this._config,null,4))}run(){switch(this._config.action){case"create":return this.runCreate();default:return Promise.reject("unknown action: "+this._config.action)}}progress(key){utils_1.log(utils_1.chalk.cyan(utils_1.translate(key)))}warn(key){utils_1.log(utils_1.chalk.yellow(utils_1.translate(key)))}chdir(directory){process.chdir(directory)}get rootDir(){return this._projectRootDir}copyTplDir(target,dstRoot,options){dstRoot=dstRoot||this.rootDir;options=utils_1.$.extend({cwd:utils_1.templatePath(target),nodir:true,dot:true},options);utils_1.glob.sync("**",options).forEach(file=>{const dst=path.join(dstRoot,file.replace(/src/,this._config.structureConfig.src).replace(/pkg/,this._config.structureConfig.pkg).replace(/built/,this._config.structureConfig.built).replace(/doc/,this._config.structureConfig.doc).replace(/task/,this._config.structureConfig.task).replace(/test/,this._config.structureConfig.test).replace(/types/,this._config.structureConfig.types).replace(/temp\//,this._config.structureConfig.temp+"/").replace(/lib/,this._config.structureConfig.lib||"lib").replace(/external/,this._config.structureConfig.external||"external").replace(/porting/,this._config.structureConfig.porting||"porting").replace(/res/,this._config.structureConfig.res||"res").replace(/script/,this._config.structureConfig.srcConfig?this._config.structureConfig.srcConfig.script||"scripts":"scripts").replace(/stylesheet/,this._config.structureConfig.srcConfig?this._config.structureConfig.srcConfig.stylesheet||"stylesheets":"stylesheets").replace(/template/,this._config.structureConfig.srcConfig?this._config.structureConfig.srcConfig.template||"templates":"templates"));utils_1.fs.copySync(path.join(utils_1.templatePath(target),file),dst)})}queryNodeModuleLatestVersion(name){return new Promise((resolve,reject)=>{let version;utils_1.execCommand("npm",["info",name,"version"],{stdio:"pipe",spinner:null,stdout:data=>{version=utils_1._.trim(data)}}).then(()=>{resolve(version)}).catch(reason=>{reject(reason)})})}get defaultDevDependencies(){const base=[{name:"convert-source-map",version:undefined},{name:"del",version:undefined},{name:"eslint",version:undefined},{name:"npm-run-all",version:undefined},{name:"plato",version:undefined},{name:"source-map",version:undefined},{name:"tslint",version:undefined},{name:"typedoc",version:undefined},{name:"typescript",version:undefined}];const minify=[{name:"uglify-js",version:undefined,es:["es5"]},{name:"uglify-es",version:undefined,es:["es2015"]}];let extra=[];if(this._config.minify){extra=extra.concat(minify)}if(this.isEnableTool("webpack")){extra.push({name:"webpack",version:undefined});extra.push({name:"source-map-loader",version:undefined})}if(this.isEnableTool("nyc")){extra.push({name:"nyc",version:undefined})}if(this.isEnableTool("testem")){extra.push({name:"testem",version:undefined})}if(this.isEnableTool("phantomjs-prebuilt")){extra.push({name:"phantomjs-prebuilt",version:undefined})}return utils_1._.sortBy(base.concat(extra),depend=>depend.name)}queryDependenciesParam(dependencies){return __awaiter(this,void 0,void 0,function*(){this.progress("base.create.queryVersion");const depends=dependencies.filter(depend=>{if(null==depend.es){return true}else{return!!depend.es.find(esVersion=>{return this._config.es===esVersion})}});utils_1.debug(JSON.stringify(depends,null,4));const progress=context=>{if("string"===typeof context&&!this._config.settings.silent){const spinner=utils_1.getSpinner(utils_1.chalk.yellow(context),5);spinner.start();return spinner}else if(context){context.stop(true)}};for(let i=0,n=depends.length;iname===tool)}runCreate(){return __awaiter(this,void 0,void 0,function*(){yield this.createBase();yield this.create()})}createBase(){return __awaiter(this,void 0,void 0,function*(){this.progress("base.create.foundation");yield this.createProjectDir();yield this.copyBaseStructure();yield this.copyCommonFiles();yield this.copyTaskScripts()})}createProjectDir(){if(utils_1.fs.existsSync(this.rootDir)){throw Error(utils_1.translate("base.create.error.alreadyExist"))}utils_1.fs.mkdirsSync(this.rootDir)}copyBaseStructure(){this.copyTplDir("base/structure")}copyCommonFiles(){const srcDir=utils_1.templatePath("base");const dstDir=this.rootDir;utils_1.copyTpl(path.join(srcDir,"_npmignore"),path.join(dstDir,".npmignore"),this._config.structureConfig);utils_1.fs.copySync(path.join(srcDir,"_BANNER"),path.join(dstDir,"BANNER"));switch(this._config.license){case"Apache-2.0":utils_1.fs.copySync(path.join(srcDir,"_LICENSE.Apache-2.0"),path.join(dstDir,"LICENSE"));break;case"MIT":utils_1.copyTpl(path.join(srcDir,"_LICENSE.MIT"),path.join(dstDir,"LICENSE"),this._config.copyright);break;default:break}utils_1.fs.copySync(path.join(srcDir,"_NOTICE"),path.join(dstDir,"NOTICE"));if(this.isEnableTool("webpack")){const param={nodejs:this._config.nodejs,guide:true,taskPath:this._config.structureConfig.task};utils_1.copyTpl(path.join(srcDir,"tools/webpack/_webpack.config.js"),path.join(dstDir,"webpack.config.js"),param,{delimiters:"<% %>"})}}copyTaskScripts(){const srcDir=utils_1.templatePath("base/task");const dstDir=path.join(this.rootDir,this._config.structureConfig.task);this.taskList.forEach(task=>{utils_1.fs.copySync(path.join(srcDir,task),path.join(dstDir,task))})}}exports.GeneratorBase=GeneratorBase}]); //# sourceMappingURL=cdp-lib.min.js.map \ No newline at end of file diff --git a/dist/cdp-lib.min.js.map b/dist/cdp-lib.min.js.map index f7dd75f..85287f8 100644 --- a/dist/cdp-lib.min.js.map +++ b/dist/cdp-lib.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["dist/cdp-lib.js"],"names":["module","exports","modules","installedModules","__webpack_require__","moduleId","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","getDefault","getModuleExports","object","property","prototype","hasOwnProperty","p","s","require","__export","value","fs","glob","hogan","_l","_s","which","uuid","chalk_1","chalk","default","semverRegex","cli_spinner_1","Spinner","$","_window","jsdom","JSDOM","window","defaultView","root","xmldom","DOMParser","global","XMLSerializer","_m","mixin","_","path","libs_1","_settings","force","verbose","silent","lang","_libPath","getSettings","extend","setSettings","settings","targetDir","getLibPath","TRY_COUNT","tried","__dirname","Error","join","check","pathExistsSync","getTargetDir","log","message","optionalParams","length","console","debug","error","assert","test","warn","process","exit","_lang","translate","key","JSON","parse","readFileSync","toString","resouce","props","split","prop","shift","generator_module_1","newGeneratorLibrary","config","GeneratorModule","__awaiter","this","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","e","rejected","result","done","then","apply","os","base_1","Utils","templatePath","copyTpl","GeneratorBase","[object Object]","src","pkg","built","doc","task","types","temp","ensureModuleProps","createDirectoryStructure","createProjectSettings","createSourceTemplate","createVisualStudioSolution","taskList","defaultDevDependencies","depends","super","concat","version","undefined","extra","nodejs","push","sortBy","depend","_config","moduleName","projectName","trim","dasherize","mainBaseName","copyTplDir","rootDir","delimiters","outputSameDir","bom","structureConfig","queryEsLintEnvParam","testemStuffPath","sync","cwd","nodir","forEach","file","copySync","devDependencies","queryDependenciesParam","_module","basename","param","sampleClass","classify","sampleModule","script","srcConfig","vsParam","createGUID","projectGUID","replace","license","private","webpack","isEnableTool","testem","jsGroup","relativePath","fileName","dependee","d_ts","map","min_map","minify","tsGroup","toXmlString","normalizeText","options","eol","EOL","tpl","jst","compile","render","toXmlDOM","parseXML","toXmlNode","str2XmlNode","$proj","$gpTS","$gpJS","find","last","after","formatXML","dstPath","xmlNode2Str","writeFileSync","generator_cordova_1","newGeneratorMobile","GeneratorCordova","utils_1","lib","external","porting","res","stylesheet","template","stringify","isEnableCordova","chdir","createCordovaScaffold","updateConfigXML","addCordovaPlatforms","addCordovaPlugins","addCordovaExtentionFiles","cacheCordovaPackageJSON","base","assign","cordova","hammerjs","isInstallationTarget","iscroll","flipsnap","defaultDependencies","dependencies","platforms","target","projectStructure","indexOf","progress","execCommand","appId","appName","removeSync","configXmlPath","$configXmlDom","attr","prepend","remove","targets","slice","index","platform","splice","cordova_plugin","existsSync","cordovaPackageJson","displayName","main","scripts","author","description","hasStructureOf","PLATFORMS_ROOT","readdirSync","statSync","isDirectory","WWW","mkdir","queryTsConfigBaseParam","resolvedConfig","PKG_PATH","sortKeys","sorted","keys","sort","additional","list","listWithCustomName","resource_addon","info","venderName","alias","globals","importsList","exportsList","hasExports","globalExport","unlinkSync","enableLib","enablePorting","dirname","generator_electoron_1","newGeneratorDesktop","GeneratorElectron","generator_browser_1","newGeneratorWeb","GeneratorBrowser","generators_1","CDPLib","newGenerator","run","child_process_1","settings_1","handleError","getSpinner","format","spinners","fmt","spinner","idx","Math","floor","random","setSpinnerString","text","opt","tab","spaces","command","args","stdio","stdout","data","stderr","quoteIfNeeded","str","includes","shell","resolvedCommand","start","child","spawn","on","code","stop","dst","params","output","ensureFileSync","v4","toUpperCase","fullXML","$xml","children","serializeToString","xml","pad","indent","node","strArr","len","_indent","match","library_1","mobile_1","desktop_1","web_1","projectType","_projectRootDir","defaultBaseStructure","env","action","runCreate","cyan","yellow","directory","dstRoot","dot","catch","reason","es","filter","esVersion","context","queryNodeModuleLatestVersion","compileSetting","es6","tools","tool","createBase","create","createProjectDir","copyBaseStructure","copyCommonFiles","copyTaskScripts","mkdirsSync","srcDir","dstDir","copyright","guide","taskPath"],"mappings":"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","sourcesContent":["/*!\n * cdp-lib.js 0.1.3\n *\n * Date: 2017-11-15T03:44:26.440Z\n */\n\nmodule.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ // The module cache\n/******/ var installedModules = {};\n/******/\n/******/ // The require function\n/******/ function __webpack_require__(moduleId) {\n/******/\n/******/ // Check if module is in cache\n/******/ if(installedModules[moduleId]) {\n/******/ return installedModules[moduleId].exports;\n/******/ }\n/******/ // Create a new module (and put it into the cache)\n/******/ var module = installedModules[moduleId] = {\n/******/ i: moduleId,\n/******/ l: false,\n/******/ exports: {}\n/******/ };\n/******/\n/******/ // Execute the module function\n/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ // Flag the module as loaded\n/******/ module.l = true;\n/******/\n/******/ // Return the exports of the module\n/******/ return module.exports;\n/******/ }\n/******/\n/******/\n/******/ // expose the modules object (__webpack_modules__)\n/******/ __webpack_require__.m = modules;\n/******/\n/******/ // expose the module cache\n/******/ __webpack_require__.c = installedModules;\n/******/\n/******/ // define getter function for harmony exports\n/******/ __webpack_require__.d = function(exports, name, getter) {\n/******/ if(!__webpack_require__.o(exports, name)) {\n/******/ Object.defineProperty(exports, name, {\n/******/ configurable: false,\n/******/ enumerable: true,\n/******/ get: getter\n/******/ });\n/******/ }\n/******/ };\n/******/\n/******/ // getDefaultExport function for compatibility with non-harmony modules\n/******/ __webpack_require__.n = function(module) {\n/******/ var getter = module && module.__esModule ?\n/******/ function getDefault() { return module['default']; } :\n/******/ function getModuleExports() { return module; };\n/******/ __webpack_require__.d(getter, 'a', getter);\n/******/ return getter;\n/******/ };\n/******/\n/******/ // Object.prototype.hasOwnProperty.call\n/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ // __webpack_public_path__\n/******/ __webpack_require__.p = \"\";\n/******/\n/******/ // Load entry module and return exports\n/******/ return __webpack_require__(__webpack_require__.s = 14);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"path\");\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__export(__webpack_require__(32));\n__export(__webpack_require__(33));\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__export(__webpack_require__(3));\n__export(__webpack_require__(29));\n__export(__webpack_require__(5));\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fs = __webpack_require__(16);\nexports.fs = fs;\nconst glob = __webpack_require__(17);\nexports.glob = glob;\nconst hogan = __webpack_require__(18);\nexports.hogan = hogan;\nconst _l = __webpack_require__(19);\nconst _s = __webpack_require__(20);\nconst which = __webpack_require__(21);\nexports.which = which;\nconst uuid = __webpack_require__(22);\nexports.uuid = uuid;\nconst chalk_1 = __webpack_require__(23);\nexports.chalk = chalk_1.default;\nconst semverRegex = __webpack_require__(24);\nexports.semverRegex = semverRegex;\nconst cli_spinner_1 = __webpack_require__(25);\nexports.Spinner = cli_spinner_1.Spinner;\nconst $ = (() => {\n const _window = (() => {\n const jsdom = __webpack_require__(26);\n if (\"function\" === typeof jsdom.JSDOM) {\n return new jsdom.JSDOM().window;\n }\n else {\n return jsdom.jsdom().defaultView;\n }\n })();\n // patch scope:\n ((root) => {\n /*\n * jsdom 9.4.0 - 9.12.0 に実装されている DOMParser は XML の serialize ができないため,\n * xmldom に置き換える\n * jsdom 10.1.0 まで動かないことを確認\n */\n const xmldom = __webpack_require__(27);\n root.DOMParser = xmldom.DOMParser;\n // xmldom には dom.toString() が実装されているが、global にも export する\n global.XMLSerializer = root.XMLSerializer = xmldom.XMLSerializer;\n })(_window);\n return __webpack_require__(28)(_window);\n})();\nexports.$ = $;\nconst _m = _l.mixin(_s.exports());\nexports._ = _m;\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"os\");\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = __webpack_require__(0);\nconst libs_1 = __webpack_require__(3);\nlet _settings = {\n force: false,\n verbose: false,\n silent: false,\n lang: \"en-US\",\n};\nlet _libPath; // cdp-lib の存在している path\n///////////////////////////////////////////////////////////////////////\n// exports methods:\n/**\n * 設定取得\n *\n * @returns options ログに使用するオプション\n */\nfunction getSettings() {\n return libs_1.$.extend({}, _settings);\n}\nexports.getSettings = getSettings;\n/**\n * 設定指定\n *\n * @param options ログに使用するオプション\n */\nfunction setSettings(settings) {\n if (settings) {\n _settings.force = settings.force || _settings.force;\n _settings.verbose = settings.verbose || _settings.verbose;\n _settings.silent = settings.silent || _settings.silent;\n _settings.targetDir = settings.targetDir || _settings.targetDir;\n _settings.lang = settings.lang || _settings.lang;\n }\n else {\n _settings = {\n force: false,\n verbose: false,\n silent: false,\n lang: \"en-US\",\n };\n }\n}\nexports.setSettings = setSettings;\n/**\n * \"cdp-lib\" が存在するパスを取得\n *\n * @returns cdp-lib への path\n */\nfunction getLibPath() {\n if (null == _libPath) {\n const TRY_COUNT = 3;\n let tried = 0;\n _libPath = __dirname;\n while (true) {\n if (TRY_COUNT <= tried) {\n throw Error(\"lib path is not resolved.\");\n }\n _libPath = path.join(_libPath, \"..\");\n const check = path.join(_libPath, \"cdp-lib\");\n if (libs_1.fs.pathExistsSync(check)) {\n _libPath = check;\n break;\n }\n tried++;\n }\n }\n return _libPath;\n}\nexports.getLibPath = getLibPath;\n/**\n * 指定された targetDir を取得\n *\n * @returns targetDir への path\n */\nfunction getTargetDir() {\n return _settings.targetDir;\n}\nexports.getTargetDir = getTargetDir;\n/**\n * ログ出力\n * console.log() と同等\n *\n * @param message 出力メッセージ\n * @param optionalParams 付加情報\n */\nfunction log(message, ...optionalParams) {\n if (!_settings.silent) {\n if (0 < optionalParams.length) {\n console.log(message, optionalParams);\n }\n else {\n console.log(message);\n }\n }\n}\nexports.log = log;\n/**\n * 詳細ログ出力\n * console.debug() と同等\n *\n * @param message 出力メッセージ\n * @param optionalParams 付加情報\n */\nfunction debug(message, ...optionalParams) {\n if (!_settings.silent && _settings.verbose) {\n if (0 < optionalParams.length) {\n console.error(\"DEBUG: \" + message, optionalParams);\n }\n else {\n console.error(\"DEBUG: \" + message);\n }\n }\n}\nexports.debug = debug;\n/**\n * 検証\n * console.assert() と同等\n *\n * @param test 検証する式\n * @param message 出力メッセージ\n * @param optionalParams 付加情報\n */\nfunction assert(test, message, ...optionalParams) {\n if (!test) {\n if (_settings.force) {\n if (0 < optionalParams.length) {\n console.warn(message, optionalParams);\n }\n else {\n console.warn(message);\n }\n }\n else {\n if (0 < optionalParams.length) {\n console.error(message, optionalParams);\n }\n else {\n console.error(message);\n }\n process.exit(1);\n }\n }\n}\nexports.assert = assert;\nlet _lang;\n/**\n * ローカライズ\n *\n * @param key キー文字列\n * @returns 翻訳された文字列\n */\nfunction translate(key) {\n if (!_lang) {\n try {\n _lang = JSON.parse(libs_1.fs.readFileSync(path.join(getLibPath(), \"res/locales\", \"messages.\" + _settings.lang + \".json\"), \"utf8\").toString());\n }\n catch (error) {\n throw Error(\"Language resource JSON parse error: \" + error.message);\n }\n }\n let resouce = libs_1.$.extend({}, _lang);\n const props = key.split(\".\");\n while (0 < props.length) {\n const prop = props.shift();\n if (resouce[prop]) {\n resouce = resouce[prop];\n }\n else {\n assert(false, \"resouce not found. key: \" + key);\n return null;\n }\n }\n return resouce;\n}\nexports.translate = translate;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst generator_module_1 = __webpack_require__(7);\n__export(__webpack_require__(7));\n/**\n * generator 生成関数\n */\nfunction newGeneratorLibrary(config) {\n return new generator_module_1.GeneratorModule(config);\n}\nexports.newGeneratorLibrary = newGeneratorLibrary;\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = __webpack_require__(0);\nconst os = __webpack_require__(4);\nconst base_1 = __webpack_require__(1);\nconst fs = base_1.Utils.fs;\nconst glob = base_1.Utils.glob;\nconst $ = base_1.Utils.$;\nconst _ = base_1.Utils._;\nconst debug = base_1.Utils.debug;\nconst templatePath = base_1.Utils.templatePath;\nconst copyTpl = base_1.Utils.copyTpl;\n/**\n * @class GeneratorModule\n * @brief Library Module 用 Generator クラス\n */\nclass GeneratorModule extends base_1.GeneratorBase {\n ///////////////////////////////////////////////////////////////////////\n // imprementes: GeneratorBase\n /**\n * 既定の directory 構造を返却\n */\n defaultBaseStructure() {\n return {\n src: \"src\",\n pkg: \"dist\",\n built: \"built\",\n doc: \"docs\",\n task: \"tasks\",\n test: \"tests\",\n types: \"@types\",\n temp: \".temp\",\n };\n }\n /**\n * create action entry\n * @param {ILibraryConfigration} config コンフィグ設定\n */\n create() {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.ensureModuleProps();\n yield this.createDirectoryStructure();\n yield this.createProjectSettings();\n yield this.createSourceTemplate();\n yield this.createVisualStudioSolution();\n });\n }\n /**\n * 必要とする task script 一覧を返却. action: create のときに呼ばれる\n */\n get taskList() {\n return [\n \"banner.js\",\n \"clean.js\",\n \"srcmap.js\",\n \"bundle-finalizer.js\",\n \"remap-coverage.js\",\n ];\n }\n ///////////////////////////////////////////////////////////////////////\n // protected methods:\n /**\n * 開発時の依存モジュールリストの取得\n * 必要に応じてオーバーライド\n *\n * @return {IDependency}\n */\n get defaultDevDependencies() {\n const depends = super.defaultDevDependencies.concat([\n { name: \"@types/jasmine\", version: undefined, },\n { name: \"dts-bundle\", version: undefined, },\n { name: \"typescript-formatter\", version: undefined, },\n ]);\n const extra = [];\n if (this.config.nodejs) {\n extra.push({ name: \"jasmine-node\", version: \"^2.0.0\", });\n }\n else {\n extra.push({ name: \"requirejs\", version: undefined, });\n }\n return _.sortBy(depends.concat(extra), (depend) => depend.name);\n }\n ///////////////////////////////////////////////////////////////////////\n // private methods:\n /**\n * configration にアクセス\n */\n get config() {\n return this._config;\n }\n /**\n * module 名, main ファイル名の保証\n * - 1: moduleName が指定されている場合は使用する\n * - 2: projectName が使用可能な場合はそれを使用する\n * - 3: projectName が使用不可の場合は、\"-\" つなぎ文字列を生成する\n */\n ensureModuleProps() {\n // module name\n if (null == this.config.moduleName) {\n if (!/^.*[(\\\\|\\s|/|:|*|?|\"|<|>||)].*$/.test(this.config.projectName)) {\n this.config.moduleName = this.config.projectName;\n }\n else {\n this.config.moduleName = _.trim(_.dasherize(this.config.projectName), \"-\");\n }\n }\n debug(\"moduleName: \" + this.config.moduleName);\n // main file name\n if (null == this.config.mainBaseName) {\n this.config.mainBaseName = this.config.moduleName;\n }\n debug(\"mainBaseName: \" + this.config.mainBaseName);\n }\n /**\n * ディレクトリ構成情報のコピー\n */\n createDirectoryStructure() {\n this.copyTplDir(\"library/structure\");\n }\n /**\n * プロジェクト設定ファイルの作成\n */\n createProjectSettings() {\n return __awaiter(this, void 0, void 0, function* () {\n // project.config.js\n copyTpl(path.join(templatePath(\"library\"), \"_project.config.js\"), path.join(this.rootDir, \"project.config.js\"), this._config, { delimiters: \"<% %>\" });\n // tsconfig\n if (!this.config.outputSameDir) {\n // main tsconfig.json\n copyTpl(path.join(templatePath(\"library\"), \"_tsconfig.json\"), path.join(this.rootDir, \"tsconfig.json\"), this._config, { delimiters: \"<% %>\", bom: false, });\n // test tsconfig.json\n copyTpl(path.join(templatePath(\"library\"), \"_tsconfig.test.json\"), path.join(this.rootDir, this._config.structureConfig.test, \"unit\", \"tsconfig.json\"), this._config, { delimiters: \"<% %>\", bom: false, });\n }\n else {\n // main tsconfig.json\n copyTpl(path.join(templatePath(\"library\"), \"_tsconfig.output-same-dir.json\"), path.join(this.rootDir, \"tsconfig.json\"), this._config, { delimiters: \"<% %>\", bom: false, });\n }\n // eslintrc.json\n copyTpl(path.join(templatePath(\"library\"), \"_eslintrc.json\"), path.join(this.rootDir, this._config.structureConfig.test, \"eslint\", \"eslintrc.json\"), this.queryEsLintEnvParam(), { delimiters: \"<% %>\", bom: false, });\n // testem\n if (!this.config.nodejs) {\n copyTpl(path.join(templatePath(\"library/tools/testem\"), \"_testem.json\"), path.join(this.rootDir, this._config.structureConfig.test, \"runner\", \"testem.json\"), this._config, { delimiters: \"<% %>\", bom: false, });\n const testemStuffPath = templatePath(\"library/tools/testem/runner\");\n glob.sync(\"**\", {\n cwd: testemStuffPath,\n nodir: true,\n })\n .forEach((file) => {\n fs.copySync(path.join(testemStuffPath, file), path.join(this.rootDir, this._config.structureConfig.test, \"runner\", file));\n });\n }\n // .gitignore\n copyTpl(path.join(templatePath(\"library\"), \"_gitignore\"), path.join(this.rootDir, \".gitignore\"), this._config, { bom: false, });\n // README.md\n copyTpl(path.join(templatePath(\"library\"), \"_README.md\"), path.join(this.rootDir, \"README.md\"), this._config, { delimiters: \"<% %>\" });\n // package.json\n this.config.devDependencies = yield this.queryDependenciesParam(this.config.devDependencies || this.defaultDevDependencies);\n copyTpl(path.join(templatePath(\"library\"), \"_package.json\"), path.join(this.rootDir, \"package.json\"), this._config, { delimiters: \"<% %>\", bom: false, });\n });\n }\n /**\n * ソースの雛形作成\n */\n createSourceTemplate() {\n return __awaiter(this, void 0, void 0, function* () {\n const _module = path.basename(this._config.moduleName, \".js\");\n const param = {\n sampleClass: _.classify(_module),\n sampleModule: _module,\n built: this._config.structureConfig.built,\n };\n const script = (() => {\n if (this._config.structureConfig.srcConfig) {\n return this._config.structureConfig.srcConfig.script || \"\";\n }\n return \"\";\n })();\n // index.ts\n copyTpl(path.join(templatePath(\"library\"), \"src\", \"_index.ts\"), path.join(this.rootDir, this._config.structureConfig.src, script, _module + \".ts\"), param, { delimiters: \"<% %>\" });\n // index.spec.ts\n copyTpl(path.join(templatePath(\"library\"), \"src\", \"_index.spec.ts\"), path.join(this.rootDir, this._config.structureConfig.test, \"unit\", _module + \".spec.ts\"), param, { delimiters: \"<% %>\" });\n });\n }\n /**\n * Visual Studio のソリューションファイル作成\n */\n createVisualStudioSolution() {\n return __awaiter(this, void 0, void 0, function* () {\n const vsParam = (() => {\n const createGUID = base_1.Utils.createGUID;\n const param = $.extend({}, this._config.structureConfig);\n param.projectName = this._config.projectName;\n param.projectGUID = createGUID();\n param.types = param.types.replace(\"@\", \"%40\"); // escape \"@\" to \"%40\"\n param.mainBaseName = this._config.mainBaseName;\n param.license = !this._config.private;\n // tools\n param.webpack = this.isEnableTool(\"webpack\");\n param.testem = !this.config.nodejs;\n param.outputSameDir = this.config.outputSameDir;\n // setup built js group\n param.jsGroup = [];\n if (!param.outputSameDir) {\n param.jsGroup.push({\n relativePath: param.built + \"\\\\\",\n fileName: param.mainBaseName,\n dependee: true,\n d_ts: true,\n map: true,\n min_map: false,\n });\n }\n if (this.config.minify) {\n // setup pkg group\n param.jsGroup.push({\n relativePath: param.pkg + \"\\\\\",\n fileName: param.mainBaseName,\n dependee: false,\n d_ts: false,\n map: false,\n min_map: true,\n });\n }\n // setup test js group\n param.tsGroup = [\n {\n relativePath: param.test + \"\\\\unit\\\\\",\n fileName: param.mainBaseName + \".spec\",\n dependee: true,\n map: this.config.outputSameDir,\n },\n ];\n if (param.outputSameDir) {\n param.tsGroup.push({\n relativePath: param.built + \"\\\\\",\n fileName: param.mainBaseName,\n dependee: false,\n map: true,\n });\n }\n return param;\n })();\n // .sln\n copyTpl(path.join(templatePath(\"base/visual.studio\"), \"_solution.sln.tpl\"), path.join(this.rootDir, vsParam.projectName + \".sln\"), vsParam, { delimiters: \"<% %>\" });\n // .csproj\n (() => {\n const toXmlString = (file) => {\n const hogan = base_1.Utils.hogan;\n const normalizeText = base_1.Utils.normalizeText;\n const options = {\n eol: os.EOL,\n bom: true,\n delimiters: \"{{ }}\",\n };\n const tpl = path.join(templatePath(\"base/visual.studio\"), file);\n const jst = hogan.compile(normalizeText(fs.readFileSync(tpl).toString(), { eol: \"\\n\", bom: false }), options);\n return jst.render(vsParam);\n };\n const toXmlDOM = (file) => {\n return $($.parseXML(toXmlString(file)));\n };\n const toXmlNode = (file) => {\n return base_1.Utils.str2XmlNode(toXmlString(file));\n };\n const $proj = toXmlDOM(\"_project.csproj.tpl\");\n const $gpTS = toXmlNode(\"_ts.item.group.tpl\");\n const $gpJS = toXmlNode(\"_js.item.group.tpl\");\n $proj\n .find(\"ItemGroup\")\n .last()\n .after($gpTS)\n .after($gpJS);\n const formatXML = base_1.Utils.formatXML;\n const dstPath = path.join(this.rootDir, vsParam.projectName + \".csproj\");\n debug(base_1.Utils.xmlNode2Str($proj));\n fs.writeFileSync(dstPath, formatXML(base_1.Utils.xmlNode2Str($proj)));\n })();\n });\n }\n}\nexports.GeneratorModule = GeneratorModule;\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst generator_cordova_1 = __webpack_require__(9);\n__export(__webpack_require__(9));\n/**\n * generator 生成関数\n */\nfunction newGeneratorMobile(config) {\n return new generator_cordova_1.GeneratorCordova(config);\n}\nexports.newGeneratorMobile = newGeneratorMobile;\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = __webpack_require__(0);\nconst os = __webpack_require__(4);\nconst utils_1 = __webpack_require__(2);\nconst base_1 = __webpack_require__(1);\n/**\n * @class GeneratorCordova\n * @brief Mobile Cordova 用 Generator クラス\n */\nclass GeneratorCordova extends base_1.GeneratorBase {\n ///////////////////////////////////////////////////////////////////////\n // imprementes: GeneratorBase\n /**\n * 既定の directory 構造を返却\n */\n defaultBaseStructure() {\n return {\n src: \"app\",\n pkg: \"www\",\n built: \"app\",\n doc: \"docs\",\n task: \"tasks\",\n test: \"tests\",\n types: \"@types\",\n temp: \".temp\",\n lib: \"lib\",\n external: \"external\",\n porting: \"porting\",\n res: \"res\",\n srcConfig: {\n script: \"scripts\",\n stylesheet: \"stylesheets\",\n template: \"templates\",\n },\n };\n }\n /**\n * create action entry\n * @param {ILibraryConfigration} config コンフィグ設定\n */\n create() {\n return __awaiter(this, void 0, void 0, function* () {\n utils_1.debug(JSON.stringify(this.config, null, 4));\n if (this.isEnableCordova()) {\n yield this.chdir(this.rootDir);\n yield this.createCordovaScaffold();\n yield this.updateConfigXML();\n yield this.addCordovaPlatforms();\n yield this.addCordovaPlugins();\n yield this.addCordovaExtentionFiles();\n yield this.cacheCordovaPackageJSON();\n yield this.chdir(\"..\");\n }\n yield this.createDirectoryStructure();\n yield this.createProjectSettings();\n yield this.createSourceTemplate();\n yield this.createVisualStudioSolution();\n });\n }\n /**\n * 必要とする task script 一覧を返却. action: create のときに呼ばれる\n */\n get taskList() {\n return [\n \"banner.js\",\n \"clean.js\",\n \"command.js\",\n \"external-rearrange.js\",\n \"minify.js\",\n \"srcmap.js\",\n \"bundle-finalizer.js\",\n \"remap-coverage.js\",\n ];\n }\n ///////////////////////////////////////////////////////////////////////\n // protected methods:\n /**\n * 開発時の依存モジュールリストの取得\n * 必要に応じてオーバーライド\n *\n * @return {IDependency}\n */\n get defaultDevDependencies() {\n const depends = super.defaultDevDependencies.concat([\n { name: \"@types/jasmine\", version: undefined, },\n { name: \"@types/requirejs\", version: undefined, },\n { name: \"autoprefixer\", version: undefined, },\n { name: \"clean-css\", version: undefined, },\n { name: \"fs-extra\", version: undefined, },\n { name: \"html-minifier\", version: undefined, },\n { name: \"node-sass\", version: undefined, },\n { name: \"postcss-cli\", version: undefined, },\n { name: \"smartwatch\", version: undefined, },\n ]);\n const extra = [];\n this.config.devDependencies.forEach((depend) => {\n extra.push({ name: depend.name, version: depend.version, });\n });\n if (this.isEnableCordova()) {\n extra.push({ name: \"@types/cordova\", version: undefined, });\n }\n return utils_1._.sortBy(depends.concat(extra), (depend) => depend.name);\n }\n /**\n * eslintrc に指定する template paramaeter を取得\n *\n * @return {Object} テンプレートパラメータオブジェクト\n */\n queryEsLintEnvParam() {\n const base = super.queryEsLintEnvParam();\n return Object.assign({}, base, {\n cordova: this.isEnableCordova(),\n hammerjs: this.isInstallationTarget(\"hammerjs\"),\n iscroll: this.isInstallationTarget(\"iscroll\"),\n flipsnap: this.isInstallationTarget(\"flipsnap\"),\n });\n }\n /**\n * tsconfig.base に指定する template paramaeter を取得\n *\n * @return {Object} テンプレートパラメータオブジェクト\n */\n queryTsConfigBaseParam() {\n return Object.assign({}, this._config, {\n cordova: this.isEnableCordova(),\n });\n }\n ///////////////////////////////////////////////////////////////////////\n // private methods:\n /**\n * 開発時の依存モジュールリストの取得\n * 必要に応じてオーバーライド\n *\n * @return {IDependency}\n */\n get defaultDependencies() {\n const depends = [\n { name: \"@cdp/mobile\", version: undefined, },\n { name: \"backbone\", version: undefined, },\n { name: \"jquery\", version: undefined, },\n { name: \"requirejs\", version: undefined, },\n { name: \"underscore\", version: undefined, },\n ];\n const extra = [];\n this.config.dependencies.forEach((depend) => {\n extra.push({ name: depend.name, version: depend.version, });\n });\n return utils_1._.sortBy(depends.concat(extra), (depend) => depend.name);\n }\n /**\n * configration にアクセス\n */\n get config() {\n return this._config;\n }\n /**\n * cordova の有効/無効チェック\n *\n * @returns true: 有効 / false: 無効\n */\n isEnableCordova() {\n return (0 < this.config.platforms.length);\n }\n /**\n * lib/porting の設定状況のチェック\n *\n * @param target\n * @returns true: 設定 / false: 未設定\n */\n hasStructureOf(target) {\n return (this.config.projectStructure && 0 <= this.config.projectStructure.indexOf(target));\n }\n /**\n * インストール対象/非対象チェック\n *\n * @param name [in] モジュール名\n * @param depends [in] 検索対象 (既定 this.config.dependencies)\n * @returns true: 対象 / false: 非対象\n */\n isInstallationTarget(name, depends = this.config.dependencies) {\n return !!depends.find((depend) => name === depend.name);\n }\n //___________________________________________________________________________________________________________________//\n /**\n * cordova を用いたプロジェクト作成\n */\n createCordovaScaffold() {\n return __awaiter(this, void 0, void 0, function* () {\n this.progress(\"mobile.create.cordova.createCordovaScaffold\");\n utils_1.debug(\"createCordovaScaffold\");\n // `$ cordova create cool-mobile com.sony.cdp.coolmobile \"Cool Mobile\"`\n yield utils_1.execCommand(\"cordova\", [\"create\", this.config.projectName, this.config.appId, this.config.appName]);\n // remove files\n utils_1.glob.sync(\"www/**/*\", {\n cwd: this.config.projectName,\n }).forEach((file) => {\n utils_1.fs.removeSync(path.join(this.config.projectName, file));\n });\n utils_1.fs.removeSync(path.join(this.config.projectName, \"res\"));\n utils_1.fs.removeSync(path.join(this.config.projectName, \".npmignore\"));\n // move root directory\n utils_1.fs.copySync(this.config.projectName, \"./\");\n utils_1.fs.removeSync(this.config.projectName);\n });\n }\n /**\n * config.xml の修正\n */\n updateConfigXML() {\n return __awaiter(this, void 0, void 0, function* () {\n this.progress(\"mobile.create.cordova.updateConfigXml\");\n utils_1.debug(\"updateConfigXML\");\n const configXmlPath = path.join(process.cwd(), \"config.xml\");\n const $configXmlDom = utils_1.$(utils_1.str2XmlNode(utils_1.fs.readFileSync(configXmlPath).toString()));\n $configXmlDom\n .find(\"widget\")\n .attr(\"version\", this.config.version)\n .attr(\"ios-CFBundleIdentifier\", this.config.appId)\n .prepend(utils_1.str2XmlNode(`\n \n \n \n `));\n // remove cordova team information\n $configXmlDom\n .find(\"description\")\n .remove();\n $configXmlDom\n .find(\"author\")\n .remove();\n utils_1.fs.writeFileSync(configXmlPath, utils_1.formatXML(utils_1.xmlNode2Str($configXmlDom)));\n });\n }\n /**\n * platform 追加\n */\n addCordovaPlatforms() {\n return __awaiter(this, void 0, void 0, function* () {\n utils_1.debug(\"addCordovaPlatforms\");\n const targets = this.config.platforms.slice();\n const index = targets.indexOf(\"ios\");\n if (0 <= index && \"darwin\" !== process.platform) {\n this.warn(\"mobile.create.cordova.iOSWarning\");\n targets.splice(index, 1);\n if (targets.length <= 0) {\n return Promise.resolve();\n }\n }\n this.progress(\"mobile.create.cordova.addPlatforms\");\n // `$ cordova platform add android ios`\n yield utils_1.execCommand(\"cordova\", [\"platform\", \"add\"].concat(targets));\n });\n }\n /**\n * plugin 追加\n */\n addCordovaPlugins() {\n return __awaiter(this, void 0, void 0, function* () {\n this.progress(\"mobile.create.cordova.addPlugins\");\n utils_1.debug(\"addCordovaPlugins\");\n /*\n * I/F は複数のプラグインを一括で追加することが可能だが、\n * cordova version を判定しているプラグインは誤判定することがあるため、\n * 1つずつ追加する\n *\n * 以下の不具合に類似する現象\n * https://issues.apache.org/jira/browse/CB-12663\n */\n for (let i = 0, n = this.config.cordova_plugin.length; i < n; i++) {\n // `$ cordova plugin add cordova-plugin-inappbrowser`\n yield utils_1.execCommand(\"cordova\", [\"plugin\", \"add\", this.config.cordova_plugin[i].name]);\n }\n });\n }\n /**\n * cordova project に追加するリソースをコピー\n */\n addCordovaExtentionFiles() {\n return __awaiter(this, void 0, void 0, function* () {\n this.progress(\"mobile.create.cordova.addExtensions\");\n utils_1.debug(\"addCordovaExtentionFiles\");\n this.copyTplDir(\"mobile/cordova\");\n });\n }\n /**\n * cordova が生成した package.json をキャッシュ\n */\n cacheCordovaPackageJSON() {\n return __awaiter(this, void 0, void 0, function* () {\n if (utils_1.fs.existsSync(\"./package.json\")) {\n this.config.cordovaPackageJson = JSON.parse(utils_1.fs.readFileSync(\"./package.json\").toString());\n // remove cordova team information\n delete this.config.cordovaPackageJson.name;\n delete this.config.cordovaPackageJson.version;\n delete this.config.cordovaPackageJson.displayName;\n delete this.config.cordovaPackageJson.main;\n delete this.config.cordovaPackageJson.scripts;\n delete this.config.cordovaPackageJson.author;\n delete this.config.cordovaPackageJson.description;\n delete this.config.cordovaPackageJson.license;\n // ファイルはいったん削除\n utils_1.fs.removeSync(\"./package.json\");\n }\n });\n }\n //___________________________________________________________________________________________________________________//\n /**\n * ディレクトリ構成情報のコピー\n */\n createDirectoryStructure() {\n this.progress(\"mobile.create.app.createDirectoryStructure\");\n utils_1.debug(\"createDirectoryStructure\");\n // app base structure\n this.copyTplDir(\"mobile/structure/base\");\n // lib\n if (this.hasStructureOf(\"lib\")) {\n this.copyTplDir(\"mobile/structure/lib\", path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.lib));\n }\n // porting\n if (this.hasStructureOf(\"porting\")) {\n this.copyTplDir(\"mobile/structure/porting\", path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.porting));\n // create: dev/porting/@types\n utils_1.fs.copySync(utils_1.templatePath(\"base/.gitkeep\"), path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.porting, this.config.structureConfig.types, \".gitkeep\"));\n const PLATFORMS_ROOT = path.join(this.rootDir, \"platforms\");\n utils_1.fs.readdirSync(PLATFORMS_ROOT)\n .forEach((platform) => {\n if (utils_1.fs.statSync(path.join(PLATFORMS_ROOT, platform)).isDirectory()) {\n this.copyTplDir(\"mobile/structure/porting\", path.join(PLATFORMS_ROOT, platform, this.config.structureConfig.porting));\n }\n });\n }\n // www\n const WWW = path.join(this.rootDir, this.config.structureConfig.pkg);\n if (!utils_1.fs.existsSync(WWW)) {\n utils_1.fs.mkdir(WWW);\n }\n utils_1.fs.copySync(utils_1.templatePath(\"base/.gitkeep\"), path.join(WWW, \".gitkeep\"));\n // task\n utils_1.glob.sync(\"**/*\", {\n cwd: utils_1.templatePath(\"mobile/task\"),\n }).forEach((file) => {\n utils_1.fs.copySync(path.join(utils_1.templatePath(\"mobile/task\"), file), path.join(this.rootDir, this.config.structureConfig.task, file));\n });\n }\n /**\n * プロジェクト設定ファイルの作成\n */\n createProjectSettings() {\n return __awaiter(this, void 0, void 0, function* () {\n this.progress(\"mobile.create.app.createProjectSettings\");\n utils_1.debug(\"createProjectSettings\");\n // project.config.js\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile\"), \"_project.config.js\"), path.join(this.rootDir, \"project.config.js\"), utils_1.$.extend({}, this._config, {\n hogan: this.isInstallationTarget(\"hogan.js\"),\n hammerjs: this.isInstallationTarget(\"hammerjs\"),\n iscroll: this.isInstallationTarget(\"iscroll\"),\n }), { delimiters: \"<% %>\" });\n // tsconfig\n // tsconfig.base.json\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile\"), \"_tsconfig.base.json\"), path.join(this.rootDir, \"tsconfig.base.json\"), this.queryTsConfigBaseParam(), { delimiters: \"<% %>\", bom: false, });\n // main tsconfig.json\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile\"), \"_tsconfig.json\"), path.join(this.rootDir, \"tsconfig.json\"), this._config, { delimiters: \"<% %>\", bom: false, });\n // eslintrc.json\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile\"), \"_eslintrc.json\"), path.join(this.rootDir, this._config.structureConfig.test, \"eslint\", \"eslintrc.json\"), this.queryEsLintEnvParam(), { delimiters: \"<% %>\", bom: false, });\n // testem\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile/tools/testem\"), \"_testem.json\"), path.join(this.rootDir, this._config.structureConfig.test, \"runner\", \"testem.json\"), this._config, { delimiters: \"<% %>\", bom: false, });\n const testemStuffPath = utils_1.templatePath(\"mobile/tools/testem/runner\");\n utils_1.glob.sync(\"**\", {\n cwd: testemStuffPath,\n nodir: true,\n })\n .forEach((file) => {\n utils_1.fs.copySync(path.join(testemStuffPath, file), path.join(this.rootDir, this._config.structureConfig.test, \"runner\", file));\n });\n // .gitignore\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile\"), \"_gitignore\"), path.join(this.rootDir, \".gitignore\"), this._config, { bom: false, });\n // README.md\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile\"), \"_README.md\"), path.join(this.rootDir, \"README.md\"), utils_1.$.extend({}, this._config, {\n cordova: this.isEnableCordova(),\n lib: this.hasStructureOf(\"lib\"),\n porting: this.hasStructureOf(\"porting\"),\n }), { delimiters: \"<% %>\" });\n // TODO: templates/mobile/addon からコピーする場合はここで対応\n // package.json\n const resolvedConfig = utils_1.$.extend(true, {}, this.config);\n resolvedConfig.dependencies = yield this.queryDependenciesParam(this.defaultDependencies);\n resolvedConfig.devDependencies = yield this.queryDependenciesParam(this.defaultDevDependencies);\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile\"), \"_package.json\"), path.join(this.rootDir, \"package.json\"), resolvedConfig, { delimiters: \"<% %>\", bom: false, });\n // cordovaPackageJSON とマージ\n if (this.config.cordovaPackageJson) {\n const PKG_PATH = path.join(this.rootDir, \"package.json\");\n const pkg = JSON.parse(utils_1.fs.readFileSync(PKG_PATH).toString());\n utils_1.$.extend(true, pkg, this.config.cordovaPackageJson);\n const sortKeys = (target) => {\n const sorted = {};\n Object.keys(target).sort().forEach((key) => {\n sorted[key] = target[key];\n });\n return sorted;\n };\n pkg.dependencies = sortKeys(pkg.dependencies);\n pkg.devDependencies = sortKeys(pkg.devDependencies);\n utils_1.fs.writeFileSync(PKG_PATH, JSON.stringify(pkg, null, 2));\n }\n });\n }\n /**\n * ソースの雛形作成\n */\n createSourceTemplate() {\n return __awaiter(this, void 0, void 0, function* () {\n this.progress(\"mobile.create.app.createSourceTemplate\");\n utils_1.debug(\"createSourceTemplate\");\n // copy sources\n this.copyTplDir(\"mobile/src/structure\", path.join(this.rootDir));\n {\n const additional = (() => {\n if (this.config.dependencies.length < 0) {\n return null;\n }\n const param = {\n additional: {\n list: [],\n listWithCustomName: [],\n },\n };\n const targets = [...this.config.dependencies, ...this.config.resource_addon];\n targets.forEach((info) => {\n if (info.fileName || info.venderName) {\n param.additional.listWithCustomName.push({\n moduleName: info.alias || info.name,\n venderName: info.venderName || info.alias || info.name,\n fileName: info.fileName || info.alias || info.name,\n });\n }\n else {\n param.additional.list.push({\n moduleName: info.alias || info.name,\n });\n }\n });\n return param;\n })();\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile/src\"), \"_config.ts\"), path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.srcConfig.script, \"config.ts\"), utils_1.$.extend({}, this._config, additional), { delimiters: \"<% %>\" });\n }\n {\n const globals = (() => {\n if (this.config.dependencies.length < 0) {\n return null;\n }\n const param = {\n globals: {\n importsList: [],\n exportsList: [],\n hasExports: false,\n },\n };\n const targets = [...this.config.dependencies, ...this.config.resource_addon];\n targets.forEach((info) => {\n if (info.globalExport) {\n param.globals.exportsList.push({\n globalExport: info.globalExport,\n moduleName: info.alias || info.name,\n });\n }\n else {\n param.globals.importsList.push({\n moduleName: info.alias || info.name,\n });\n }\n });\n param.globals.hasExports = (0 < param.globals.exportsList.length);\n return param;\n })();\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile/src\"), \"_app.ts\"), path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.srcConfig.script, \"app.ts\"), globals, { delimiters: \"<% %>\" });\n }\n {\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile/src/_locales\"), \"_messages.en-US.json\"), path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.res, \"locales\", \"messages.en-US.json\"), this.config, { delimiters: \"<% %>\", bom: false, });\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile/src/_locales\"), \"_messages.ja-JP.json\"), path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.res, \"locales\", \"messages.ja-JP.json\"), this.config, { delimiters: \"<% %>\", bom: false, });\n // remove .gitkeep\n utils_1.fs.unlinkSync(path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.res, \".gitkeep\"));\n }\n {\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile/src/_patch.dependencies\"), \"_index.d.ts\"), path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.external, this.config.structureConfig.types, \"patch.dependencies\", \"index.d.ts\"), {\n hammerjs: this.isInstallationTarget(\"hammerjs\"),\n flipsnap: this.isInstallationTarget(\"flipsnap\"),\n iscroll: this.isInstallationTarget(\"iscroll\"),\n });\n // copy patch d.ts\n if (this.isInstallationTarget(\"hammerjs\")) {\n utils_1.fs.copySync(utils_1.templatePath(\"mobile/src/_patch.dependencies/jquery.hammer.d.ts\"), path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.external, this.config.structureConfig.types, \"patch.dependencies\", \"jquery.hammer.d.ts\"));\n }\n if (this.isInstallationTarget(\"flipsnap\")) {\n utils_1.fs.copySync(utils_1.templatePath(\"mobile/src/_patch.dependencies/flipsnap.d.ts\"), path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.external, this.config.structureConfig.types, \"patch.dependencies\", \"flipsnap.d.ts\"));\n }\n if (this.isInstallationTarget(\"iscroll\")) {\n utils_1.fs.copySync(utils_1.templatePath(\"mobile/src/_patch.dependencies/iscroll.d.ts\"), path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.external, this.config.structureConfig.types, \"patch.dependencies\", \"iscroll.d.ts\"));\n }\n // remove .gitkeep\n utils_1.fs.unlinkSync(path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.external, this.config.structureConfig.types, \".gitkeep\"));\n }\n {\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile/src\"), \"_index.html\"), path.join(this.rootDir, this.config.structureConfig.src, \"index.html\"), this.config);\n }\n });\n }\n /**\n * Visual Studio のソリューションファイル作成\n */\n createVisualStudioSolution() {\n return __awaiter(this, void 0, void 0, function* () {\n const vsParam = (() => {\n const param = utils_1.$.extend({}, this._config.structureConfig);\n param.projectName = this._config.projectName;\n param.projectGUID = utils_1.createGUID();\n param.types = param.types.replace(\"@\", \"%40\"); // escape \"@\" to \"%40\"\n param.license = !this._config.private;\n // external\n param.cordova = this.isEnableCordova();\n param.hogan = this.isInstallationTarget(\"hogan.js\");\n param.hammerjs = this.isInstallationTarget(\"hammerjs\");\n param.iscroll = this.isInstallationTarget(\"iscroll\");\n param.flipsnap = this.isInstallationTarget(\"flipsnap\");\n // project structure\n param.enableLib = this.hasStructureOf(\"lib\");\n param.enablePorting = this.hasStructureOf(\"porting\");\n // platforms\n param.platforms = [...this.config.platforms];\n // setup built ts group\n param.tsGroup = [];\n utils_1.glob.sync(\"**/*.ts\", {\n cwd: path.join(this.rootDir, param.src, param.srcConfig.script),\n }).forEach((file) => {\n const relativePath = path.join(param.src, param.srcConfig.script, path.dirname(file)).replace(/\\//g, \"\\\\\") + \"\\\\\";\n const fileName = path.basename(file, \".ts\");\n param.tsGroup.push({\n relativePath: relativePath,\n fileName: fileName,\n dependee: true,\n map: false,\n });\n });\n // setup test ts group\n utils_1.glob.sync(\"**/*.ts\", {\n cwd: path.join(this.rootDir, this.config.structureConfig.test, \"unit\"),\n }).forEach((file) => {\n const relativePath = param.test + \"\\\\unit\\\\\";\n const fileName = path.basename(file, \".ts\");\n param.tsGroup.push({\n relativePath: relativePath,\n fileName: fileName,\n dependee: true,\n map: false,\n });\n });\n return param;\n })();\n // .sln\n utils_1.copyTpl(path.join(utils_1.templatePath(\"base/visual.studio\"), \"_solution.sln.tpl\"), path.join(this.rootDir, vsParam.projectName + \".sln\"), vsParam, { delimiters: \"<% %>\" });\n // .csproj\n (() => {\n const toXmlString = (file) => {\n const options = {\n eol: os.EOL,\n bom: true,\n delimiters: \"{{ }}\",\n };\n const jst = utils_1.hogan.compile(utils_1.normalizeText(utils_1.fs.readFileSync(file).toString(), { eol: \"\\n\", bom: false }), options);\n return jst.render(vsParam);\n };\n const toXmlDOM = (file) => {\n return utils_1.$(utils_1.$.parseXML(toXmlString(file)));\n };\n const toXmlNode = (file) => {\n return utils_1.str2XmlNode(toXmlString(file));\n };\n const $proj = toXmlDOM(path.join(utils_1.templatePath(\"mobile/visual.studio\"), \"_project.csproj.tpl\"));\n const $gpTS = toXmlNode(path.join(utils_1.templatePath(\"base/visual.studio\"), \"_ts.item.group.tpl\"));\n $proj\n .find(\"ItemGroup\")\n .last()\n .after($gpTS);\n const dstPath = path.join(this.rootDir, vsParam.projectName + \".csproj\");\n utils_1.debug(utils_1.xmlNode2Str($proj));\n utils_1.fs.writeFileSync(dstPath, utils_1.formatXML(utils_1.xmlNode2Str($proj)));\n })();\n // web.config\n utils_1.fs.copySync(utils_1.templatePath(\"mobile/visual.studio/_web.config\"), path.join(this.rootDir, \"web.config\"));\n utils_1.fs.copySync(utils_1.templatePath(\"mobile/visual.studio/_web.Debug.config\"), path.join(this.rootDir, \"web.Debug.config\"));\n utils_1.fs.copySync(utils_1.templatePath(\"mobile/visual.studio/_web.Release.config\"), path.join(this.rootDir, \"web.Release.config\"));\n });\n }\n}\nexports.GeneratorCordova = GeneratorCordova;\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst generator_electoron_1 = __webpack_require__(11);\n__export(__webpack_require__(11));\n/**\n * generator 生成関数\n */\nfunction newGeneratorDesktop(config) {\n return new generator_electoron_1.GeneratorElectron(config);\n}\nexports.newGeneratorDesktop = newGeneratorDesktop;\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/* tslint:disable:no-unused-variable no-unused-vars */\n/* eslint-disable no-unused-vars */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst base_1 = __webpack_require__(1);\n/**\n * @class GeneratorElectron\n * @brief Desktop Electron 用 Generator クラス\n */\nclass GeneratorElectron extends base_1.GeneratorBase {\n ///////////////////////////////////////////////////////////////////////\n // imprementes: GeneratorBase\n /**\n * 既定の directory 構造を返却\n */\n defaultBaseStructure() {\n return {\n src: \"app\",\n pkg: \"www/app\",\n built: \"app\",\n doc: \"docs\",\n task: \"tasks\",\n test: \"tests\",\n types: \"@types\",\n srcConfig: {\n script: \"scripts\",\n stylesheet: \"stylesheets\",\n template: \"templates\",\n },\n };\n }\n /**\n * create action entry\n * @param {IDesktopAppConfigration} config コンフィグ設定\n */\n create() {\n return __awaiter(this, void 0, void 0, function* () {\n // TODO:\n return Promise.reject(\"under construction.\");\n });\n }\n /**\n * 必要とする task script 一覧を返却. action: create のときに呼ばれる\n */\n get taskList() {\n return [\n \"banner.js\",\n \"clean.js\",\n \"srcmap.js\",\n \"build-ts-clean.js\",\n \"build-ts-normalize.js\",\n ];\n }\n ///////////////////////////////////////////////////////////////////////\n // private methods:\n /**\n * configration にアクセス\n */\n get config() {\n return this._config;\n }\n}\nexports.GeneratorElectron = GeneratorElectron;\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst generator_browser_1 = __webpack_require__(13);\n__export(__webpack_require__(13));\n/**\n * generator 生成関数\n */\nfunction newGeneratorWeb(config) {\n return new generator_browser_1.GeneratorBrowser(config);\n}\nexports.newGeneratorWeb = newGeneratorWeb;\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/* tslint:disable:no-unused-variable no-unused-vars */\n/* eslint-disable no-unused-vars */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst base_1 = __webpack_require__(1);\n/**\n * @class GeneratorBrowser\n * @brief Web Browser 用 Generator クラス\n */\nclass GeneratorBrowser extends base_1.GeneratorBase {\n ///////////////////////////////////////////////////////////////////////\n // imprementes: GeneratorBase\n /**\n * 既定の directory 構造を返却\n */\n defaultBaseStructure() {\n return {\n src: \"app\",\n pkg: \"www\",\n built: \"app\",\n doc: \"docs\",\n task: \"tasks\",\n test: \"tests\",\n types: \"@types\",\n };\n }\n /**\n * create action entry\n * @param {ILibraryConfigration} config コンフィグ設定\n */\n create() {\n return __awaiter(this, void 0, void 0, function* () {\n // TODO:\n return Promise.reject(\"under construction.\");\n });\n }\n /**\n * 必要とする task script 一覧を返却. action: create のときに呼ばれる\n */\n get taskList() {\n return [\n \"banner.js\",\n \"clean.js\",\n \"srcmap.js\",\n \"build-ts-clean.js\",\n \"build-ts-normalize.js\",\n ];\n }\n ///////////////////////////////////////////////////////////////////////\n // private methods:\n /**\n * configration にアクセス\n */\n get config() {\n return this._config;\n }\n}\nexports.GeneratorBrowser = GeneratorBrowser;\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(15);\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Utils = __webpack_require__(2);\nexports.Utils = Utils;\nconst generators_1 = __webpack_require__(31);\n//___________________________________________________________________________________________________________________//\n/**\n * @class CDPLib\n * @brief CDP boilerplate 生成機能を提供するクラス\n */\nclass CDPLib {\n ///////////////////////////////////////////////////////////////////////\n // pubic methods:\n /**\n * main command\n */\n static execute(config) {\n Utils.setSettings(config.settings);\n return generators_1.newGenerator(config).run();\n }\n}\nexports.default = CDPLib;\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"fs-extra\");\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"glob\");\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"hogan.js\");\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"lodash\");\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"underscore.string\");\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"which\");\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"uuid\");\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"chalk\");\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"semver-regex\");\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"cli-spinner\");\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"jsdom\");\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"xmldom\");\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"jquery\");\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = __webpack_require__(0);\nconst os = __webpack_require__(4);\nconst child_process_1 = __webpack_require__(30);\nconst libs_1 = __webpack_require__(3);\nconst settings_1 = __webpack_require__(5);\n///////////////////////////////////////////////////////////////////////\n// exports methods:\n/**\n * Handle command line error and kill process.\n * When the application received error from cli, please call this method.\n *\n * @param {String} error error information.\n */\nfunction handleError(error) {\n settings_1.assert(false, error);\n}\nexports.handleError = handleError;\n//___________________________________________________________________________________________________________________//\n/**\n * \"templates\" ディレクトリからのパスを取得.\n *\n * @param {String} target ターゲットを指定. null の場合は、templates を返却\n * @return {String} templates/hogehoge\n */\nfunction templatePath(target) {\n if (null == target) {\n return path.join(settings_1.getLibPath(), \"templates\");\n }\n else {\n return path.join(settings_1.getLibPath(), \"templates\", target);\n }\n}\nexports.templatePath = templatePath;\n//___________________________________________________________________________________________________________________//\n/**\n * Get spinner instance.\n * CLI helper.\n *\n * @param {String} [format] spinner format string.\n * @param {Number} [index] spinner index defined by cli-spinner. (default: random [0-29])\n * @return {Spinner} cli-spinner instance.\n */\nfunction getSpinner(format, index) {\n const spinners = [\n \"|/-\\\\\",\n \"┤┘┴└├┌┬┐\",\n \"◢◣◤◥\",\n \"▌▀▐▄\",\n \"▉▊▋▌▍▎▏▎▍▌▋▊▉\",\n \"▁▃▄▅▆▇█▇▆▅▄▃\",\n \"☱☲☴\",\n \".oO@*\",\n \"◐◓◑◒\",\n ////\n \"◡◡ ⊙⊙ ◠◠\",\n \"■□▪▫\",\n \"←↖↑↗→↘↓↙\",\n \".oO°Oo.\",\n ];\n const fmt = format || \"%s\";\n const spinner = new libs_1.Spinner(fmt);\n const idx = (null != index && 0 <= index && index < 14) ? index : Math.floor(Math.random() * 10);\n spinner.setSpinnerString(spinners[idx]);\n return spinner;\n}\nexports.getSpinner = getSpinner;\n/**\n * Normalize text line-feed.\n * for windows git user.\n *\n * @param {String} text input text.\n * @param {NormalizeTextOptions} [options] option.\n * @return {String} normalized text.\n */\nfunction normalizeText(text, options) {\n const opt = libs_1.$.extend({}, {\n eol: os.EOL,\n bom: true,\n }, options);\n text = text\n .replace(/^\\ufeff/gm, \"\") // remove bom\n .replace(/\\r\\n/gm, \"\\n\") // once \"\\n\"\n .replace(/\\r/gm, \"\\n\");\n if (opt.bom) {\n text = \"\\ufeff\" + text;\n }\n if (\"\\n\" !== opt.eol) {\n text = text.replace(/\\n/gm, opt.eol);\n }\n if (opt.tab) {\n const spaces = (() => {\n let s = \"\";\n for (let i = 0; i < opt.tab; i++) {\n s += \" \";\n }\n return s;\n })();\n text = text.replace(/\\t/gm, spaces);\n }\n return text;\n}\nexports.normalizeText = normalizeText;\n/**\n * Execute command line by spawn.\n * call spawn. if error occured, cui is killed proccess.\n *\n * @param {String} command main command. ex) \"cordova\"\n * @param {String[]} args command args. ex) [\"plugin\", \"add\", pluginName]\n * @param {ExecCommandOptions} [options] cli-spinner\"s options.\n * @returns {Number} error code\n */\nfunction execCommand(command, args, options) {\n return new Promise((resolve, reject) => {\n const opt = libs_1.$.extend({}, {\n stdio: \"inherit\",\n spinner: { format: \"%s\" },\n stdout: (data) => { },\n stderr: (data) => { },\n }, options);\n // on win32, command and args need to be quoted if containing spaces\n const quoteIfNeeded = (str) => {\n if (\"win32\" === os.platform() && str.includes(\" \")) {\n str = \"\\\"\" + str + \"\\\"\";\n opt.shell = true;\n }\n return str;\n };\n libs_1.which(command, (error, resolvedCommand) => {\n if (error) {\n handleError(JSON.stringify(error));\n }\n const spinner = opt.spinner ? getSpinner(opt.spinner.format, opt.spinner.index) : null;\n if (spinner) {\n spinner.start();\n }\n resolvedCommand = quoteIfNeeded(resolvedCommand);\n args = args.map(quoteIfNeeded);\n const child = child_process_1.spawn(resolvedCommand, args, opt)\n .on(\"error\", handleError)\n .on(\"close\", (code) => {\n if (spinner) {\n spinner.stop(true);\n }\n resolve(code);\n });\n if (\"pipe\" === opt.stdio) {\n child.stdout.on(\"data\", (data) => {\n opt.stdout(data.toString());\n });\n child.stderr.on(\"data\", (data) => {\n opt.stderr(data.toString());\n });\n }\n });\n });\n}\nexports.execCommand = execCommand;\n/**\n * Copy template with hogan.\n * sync function\n *\n * @param {String} src source file path.\n * @param {String} dst destination file path.\n * @param {Object} params template parameters.\n * @param {CopyTemplateOptions} [options] options object.\n */\nfunction copyTpl(src, dst, params, options) {\n const opt = libs_1.$.extend({}, {\n eol: os.EOL,\n bom: true,\n delimiters: \"{{ }}\",\n }, options);\n const jst = libs_1.hogan.compile(normalizeText(libs_1.fs.readFileSync(src).toString(), { eol: \"\\n\", bom: false }), opt);\n const output = normalizeText(jst.render(params), opt);\n libs_1.fs.ensureFileSync(dst);\n libs_1.fs.writeFileSync(dst, output, \"utf8\");\n}\nexports.copyTpl = copyTpl;\n//___________________________________________________________________________________________________________________//\n/**\n * GUID generate.\n * returned as Windows registry type format.\n *\n * @return {String}\n */\nfunction createGUID() {\n return \"{\" + libs_1.uuid.v4().toUpperCase() + \"}\";\n}\nexports.createGUID = createGUID;\n//___________________________________________________________________________________________________________________//\n/**\n * Create XML DOM node.\n *\n * @param str string xml format. ex) ''\n * @returns XML Node instance\n */\nfunction str2XmlNode(str) {\n let fullXML = true;\n if (!/'\n * @return {jQuery} XML Node instance\n */\nfunction xmlNode2Str($xml) {\n /* eslint-disable no-undef */\n return new XMLSerializer().serializeToString($xml[0]);\n /* eslint-enable no-undef */\n}\nexports.xmlNode2Str = xmlNode2Str;\n/**\n * XML formatter.\n *\n * @param {String} str string xml format. ex) ''\n * @param {FormatXmlOptions} [options] options object.\n * @return {String} formatted XML\n */\nfunction formatXML(str, options) {\n const opt = libs_1.$.extend({}, {\n eol: os.EOL,\n bom: true,\n step: 2,\n }, options);\n let xml = \"\";\n let pad = 0;\n let indent;\n let node;\n const strArr = normalizeText(str, { eol: \"\\n\" })\n .replace(/(>)(<)(\\/*)/g, \"$1\\n$2$3\") // insert LF to each node once.\n .split(\"\\n\");\n const spaces = (len) => {\n let s = \"\";\n const _indent = len * opt.step;\n for (let i = 0; i < _indent; i++) {\n s += \" \";\n }\n return s;\n };\n for (let i = 0; i < strArr.length; i++) {\n indent = 0;\n node = libs_1.$.trim(strArr[i]);\n if (node.match(/.+<\\/\\w[^>]*>$/)) {\n indent = 0;\n }\n else if (node.match(/^<\\/\\w/)) {\n if (pad > 0) {\n pad -= 1;\n }\n }\n else if (node.match(/^<\\w[^>]*[^/]>.*$/)) {\n indent = 1;\n }\n else {\n indent = 0;\n }\n xml += spaces(pad) + node + \"\\n\";\n pad += indent;\n }\n xml = xml\n .replace(/\\n\\n/gm, \"\\n\")\n .replace(/^ +\\n/gm, \"\");\n return normalizeText(xml, opt);\n}\nexports.formatXML = formatXML;\n\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"child_process\");\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst settings_1 = __webpack_require__(5);\nconst library_1 = __webpack_require__(6);\nconst mobile_1 = __webpack_require__(8);\nconst desktop_1 = __webpack_require__(10);\nconst web_1 = __webpack_require__(12);\n__export(__webpack_require__(1));\n__export(__webpack_require__(6));\n__export(__webpack_require__(8));\n__export(__webpack_require__(10));\n__export(__webpack_require__(12));\n/**\n * generator 生成関数\n */\nfunction newGenerator(config) {\n switch (config.projectType) {\n case \"library\":\n return library_1.newGeneratorLibrary(config);\n case \"mobile\":\n return mobile_1.newGeneratorMobile(config);\n case \"desktop\":\n return desktop_1.newGeneratorDesktop(config);\n case \"web\":\n return web_1.newGeneratorWeb(config);\n default:\n settings_1.assert(false, \"unsupported project kind: \" + config.projectType);\n return null;\n }\n}\nexports.newGenerator = newGenerator;\n\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Utils = __webpack_require__(2);\nexports.Utils = Utils;\n\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = __webpack_require__(0);\nconst utils_1 = __webpack_require__(2);\n/**\n * @class GeneratorBase\n * @brief すべての Generator の既定クラス\n */\nclass GeneratorBase {\n /**\n * constructor\n *\n * @param {IProjectConfigration} config コンフィグ\n */\n constructor(_config) {\n this._config = _config;\n this._projectRootDir = utils_1.getTargetDir() ?\n utils_1.getTargetDir() :\n path.join(process.cwd(), this._config.projectName);\n this._config.structureConfig = utils_1.$.extend({}, this.defaultBaseStructure(), this._config.structureConfig);\n this._config.private = \"NONE\" === this._config.license;\n this._config.outputSameDir\n = this._config.structureConfig.src === this._config.structureConfig.built;\n this._config.nodejs = ((env) => {\n switch (env) {\n case \"node\":\n case \"electron\":\n return true;\n default:\n return false;\n }\n })(this._config.env);\n utils_1.debug(JSON.stringify(this._config, null, 4));\n }\n ///////////////////////////////////////////////////////////////////////\n // pubic methods:\n /**\n * 処理開始 (エントリ)\n *\n */\n run() {\n switch (this._config.action) {\n case \"create\":\n return this.runCreate();\n default:\n return Promise.reject(\"unknown action: \" + this._config.action);\n }\n }\n ///////////////////////////////////////////////////////////////////////\n // protected methods:\n /**\n * 進捗テキストを通知\n *\n * @param key ローカライズリソースキーを指定\n */\n progress(key) {\n utils_1.log(utils_1.chalk.cyan(utils_1.translate(key)));\n }\n /**\n * 警告テキストを通知\n *\n * @param key ローカライズリソースキーを指定\n */\n warn(key) {\n utils_1.log(utils_1.chalk.yellow(utils_1.translate(key)));\n }\n /**\n * work directory の変更\n *\n * @param directory target directory.\n */\n chdir(directory) {\n process.chdir(directory);\n }\n /**\n * project root directory の取得\n *\n * @param {String} directory target directory.\n */\n get rootDir() {\n return this._projectRootDir;\n }\n /**\n * template directory を指定して配下のファイルをコピー\n * IBaseStructureConfigration の設定が反映される\n *\n * @param {String} target ターゲットを指定. null の場合は、templates を返却\n * @param {String} dstRoot コピー先を指定. 指定が無い場合は rootDir が設定\n */\n copyTplDir(target, dstRoot, options) {\n dstRoot = dstRoot || this.rootDir;\n options = utils_1.$.extend({\n cwd: utils_1.templatePath(target),\n nodir: true,\n dot: true,\n }, options);\n utils_1.glob.sync(\"**\", options)\n .forEach((file) => {\n const dst = path.join(dstRoot, file\n .replace(/src/, this._config.structureConfig.src)\n .replace(/pkg/, this._config.structureConfig.pkg)\n .replace(/built/, this._config.structureConfig.built)\n .replace(/doc/, this._config.structureConfig.doc)\n .replace(/task/, this._config.structureConfig.task)\n .replace(/test/, this._config.structureConfig.test)\n .replace(/types/, this._config.structureConfig.types)\n .replace(/temp\\//, this._config.structureConfig.temp + \"/\")\n .replace(/lib/, this._config.structureConfig.lib || \"lib\")\n .replace(/external/, this._config.structureConfig.external || \"external\")\n .replace(/porting/, this._config.structureConfig.porting || \"porting\")\n .replace(/res/, this._config.structureConfig.res || \"res\")\n .replace(/script/, this._config.structureConfig.srcConfig\n ? (this._config.structureConfig.srcConfig.script || \"scripts\")\n : \"scripts\")\n .replace(/stylesheet/, this._config.structureConfig.srcConfig\n ? (this._config.structureConfig.srcConfig.stylesheet || \"stylesheets\")\n : \"stylesheets\")\n .replace(/template/, this._config.structureConfig.srcConfig\n ? (this._config.structureConfig.srcConfig.template || \"templates\")\n : \"templates\"));\n utils_1.fs.copySync(path.join(utils_1.templatePath(target), file), dst);\n });\n }\n /**\n * node module の version 取得\n *\n * @param {Promise} version text\n */\n queryNodeModuleLatestVersion(name) {\n return new Promise((resolve, reject) => {\n let version;\n utils_1.execCommand(\"npm\", [\"info\", name, \"version\"], {\n stdio: \"pipe\",\n spinner: null,\n stdout: (data) => {\n version = utils_1._.trim(data);\n },\n })\n .then(() => {\n resolve(version);\n })\n .catch((reason) => {\n reject(reason);\n });\n });\n }\n /**\n * 既定の開発時の依存モジュールリストの取得\n * 必要に応じてオーバーライド\n *\n * @return {IDependency}\n */\n get defaultDevDependencies() {\n const base = [\n { name: \"convert-source-map\", version: undefined, },\n { name: \"del\", version: undefined, },\n { name: \"eslint\", version: undefined, },\n { name: \"npm-run-all\", version: undefined, },\n { name: \"plato\", version: undefined, },\n { name: \"source-map\", version: undefined, },\n { name: \"tslint\", version: undefined, },\n { name: \"typedoc\", version: undefined, },\n { name: \"typescript\", version: undefined, },\n ];\n const minify = [\n { name: \"uglify-js\", version: undefined, es: [\"es5\"], },\n { name: \"uglify-es\", version: undefined, es: [\"es2015\"], },\n ];\n let extra = [];\n if (this._config.minify) {\n extra = extra.concat(minify);\n }\n if (this.isEnableTool(\"webpack\")) {\n extra.push({ name: \"webpack\", version: undefined, });\n extra.push({ name: \"source-map-loader\", version: undefined, });\n }\n if (this.isEnableTool(\"nyc\")) {\n extra.push({ name: \"nyc\", version: undefined, });\n }\n if (this.isEnableTool(\"testem\")) {\n extra.push({ name: \"testem\", version: undefined, });\n }\n if (this.isEnableTool(\"phantomjs-prebuilt\")) {\n extra.push({ name: \"phantomjs-prebuilt\", version: undefined, });\n }\n return utils_1._.sortBy(base.concat(extra), (depend) => depend.name);\n }\n /**\n * dependencies の template paramaeter を取得\n *\n * @param {IDependency[]} dependencies 依存関係リスト\n * @return {{ name: string; version: string; last?: boolean; }[]} テンプレートパラメータに指定する配列\n */\n queryDependenciesParam(dependencies) {\n return __awaiter(this, void 0, void 0, function* () {\n this.progress(\"base.create.queryVersion\");\n const depends = dependencies\n .filter((depend) => {\n if (null == depend.es) {\n return true;\n }\n else {\n return !!depend.es.find((esVersion) => {\n return this._config.es === esVersion;\n });\n }\n });\n utils_1.debug(JSON.stringify(depends, null, 4));\n const progress = (context) => {\n if (\"string\" === typeof context && !this._config.settings.silent) {\n const spinner = utils_1.getSpinner(utils_1.chalk.yellow(context), 5);\n spinner.start();\n return spinner;\n }\n else if (context) {\n context.stop(true);\n }\n };\n for (let i = 0, n = depends.length; i < n; i++) {\n if (null == depends[i].version) {\n const spinner = progress(depends[i].name);\n depends[i].version = \"^\" + (yield this.queryNodeModuleLatestVersion(depends[i].name));\n progress(spinner);\n }\n if (i === n - 1) {\n depends[i].last = true;\n }\n }\n return depends;\n });\n }\n /**\n * webpack.config.js の template paramaeter を取得\n *\n * @return {String} libraryTarget に指定する文字列\n */\n queryWebpackLibraryTarget() {\n switch (this._config.module) {\n case \"commonjs\":\n return \"commonjs2\";\n case \"amd\":\n return \"amd\";\n case \"umd\":\n return \"umd\";\n default:\n return undefined;\n }\n }\n /**\n * eslintrc の env に指定する template paramaeter を取得\n *\n * @return {Object} env に指定するテンプレートパラメータオブジェクト\n */\n queryEsLintEnvParam() {\n const compileSetting = this._config;\n return {\n es6: \"es5\" !== compileSetting.es,\n node: \"web\" !== compileSetting.env,\n };\n }\n /**\n * IBuildTargetConfigration.tools プロパティの指定状況を取得\n *\n * @param {String} name ツール名を指定\n * @return {Boolean} true: 指定されている / false: 指定されていない\n */\n isEnableTool(name) {\n return !!this._config.tools.find((tool) => name === tool);\n }\n ///////////////////////////////////////////////////////////////////////\n // private methods:\n /**\n * create 処理のエントリ\n */\n runCreate() {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.createBase();\n yield this.create();\n });\n }\n //___________________________________________________________________________________________________________________//\n /**\n * 共通の create 処理\n */\n createBase() {\n return __awaiter(this, void 0, void 0, function* () {\n this.progress(\"base.create.foundation\");\n yield this.createProjectDir();\n yield this.copyBaseStructure();\n yield this.copyCommonFiles();\n yield this.copyTaskScripts();\n });\n }\n /**\n * プロジェクトディレクトリの作成\n */\n createProjectDir() {\n if (utils_1.fs.existsSync(this.rootDir)) {\n throw Error(utils_1.translate(\"base.create.error.alreadyExist\"));\n }\n utils_1.fs.mkdirsSync(this.rootDir);\n }\n /**\n * 共通構成情報のコピー\n */\n copyBaseStructure() {\n this.copyTplDir(\"base/structure\");\n }\n /**\n * 基本ファイルのコピー\n * template のコピーも行う\n */\n copyCommonFiles() {\n const srcDir = utils_1.templatePath(\"base\");\n const dstDir = this.rootDir;\n // .npmignore\n utils_1.copyTpl(path.join(srcDir, \"_npmignore\"), path.join(dstDir, \".npmignore\"), this._config.structureConfig);\n // BANNER\n utils_1.fs.copySync(path.join(srcDir, \"_BANNER\"), path.join(dstDir, \"BANNER\"));\n // LICENSE\n switch (this._config.license) {\n case \"Apache-2.0\":\n utils_1.fs.copySync(path.join(srcDir, \"_LICENSE.Apache-2.0\"), path.join(dstDir, \"LICENSE\"));\n break;\n case \"MIT\":\n utils_1.copyTpl(path.join(srcDir, \"_LICENSE.MIT\"), path.join(dstDir, \"LICENSE\"), this._config.copyright);\n break;\n default:\n break;\n }\n // NOTICE\n utils_1.fs.copySync(path.join(srcDir, \"_NOTICE\"), path.join(dstDir, \"NOTICE\"));\n // build tools: webpack\n if (this.isEnableTool(\"webpack\")) {\n const param = {\n nodejs: this._config.nodejs,\n guide: true,\n taskPath: this._config.structureConfig.task,\n };\n utils_1.copyTpl(path.join(srcDir, \"tools/webpack/_webpack.config.js\"), path.join(dstDir, \"webpack.config.js\"), param, { delimiters: \"<% %>\" });\n }\n }\n /**\n * task script のコピー\n */\n copyTaskScripts() {\n const srcDir = utils_1.templatePath(\"base/task\");\n const dstDir = path.join(this.rootDir, this._config.structureConfig.task);\n this.taskList.forEach((task) => {\n utils_1.fs.copySync(path.join(srcDir, task), path.join(dstDir, task));\n });\n }\n}\nexports.GeneratorBase = GeneratorBase;\n\n\n/***/ })\n/******/ ]);\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgNGM2NTliMGM1MDRjZmY0OGY4OGMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicGF0aFwiIiwiY2RwOi8vL2NkcC1saWIvZ2VuZXJhdG9ycy9iYXNlL2luZGV4LnRzIiwiY2RwOi8vL2NkcC1saWIvdXRpbHMvaW5kZXgudHMiLCJjZHA6Ly8vY2RwLWxpYi91dGlscy9saWJzLnRzIiwid2VicGFjazovLy9leHRlcm5hbCBcIm9zXCIiLCJjZHA6Ly8vY2RwLWxpYi91dGlscy9zZXR0aW5ncy50cyIsImNkcDovLy9jZHAtbGliL2dlbmVyYXRvcnMvbGlicmFyeS9pbmRleC50cyIsImNkcDovLy9jZHAtbGliL2dlbmVyYXRvcnMvbGlicmFyeS9nZW5lcmF0b3ItbW9kdWxlLnRzIiwiY2RwOi8vL2NkcC1saWIvZ2VuZXJhdG9ycy9tb2JpbGUvaW5kZXgudHMiLCJjZHA6Ly8vY2RwLWxpYi9nZW5lcmF0b3JzL21vYmlsZS9nZW5lcmF0b3ItY29yZG92YS50cyIsImNkcDovLy9jZHAtbGliL2dlbmVyYXRvcnMvZGVza3RvcC9pbmRleC50cyIsImNkcDovLy9jZHAtbGliL2dlbmVyYXRvcnMvZGVza3RvcC9nZW5lcmF0b3ItZWxlY3Rvcm9uLnRzIiwiY2RwOi8vL2NkcC1saWIvZ2VuZXJhdG9ycy93ZWIvaW5kZXgudHMiLCJjZHA6Ly8vY2RwLWxpYi9nZW5lcmF0b3JzL3dlYi9nZW5lcmF0b3ItYnJvd3Nlci50cyIsImNkcDovLy9jZHAtbGliL2NkcC1saWIudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJmcy1leHRyYVwiLFwiY29tbW9uanMyXCI6XCJmcy1leHRyYVwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcImdsb2JcIixcImNvbW1vbmpzMlwiOlwiZ2xvYlwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wicm9vdFwiOlwiSG9nYW5cIixcImNvbW1vbmpzXCI6XCJob2dhbi5qc1wiLFwiY29tbW9uanMyXCI6XCJob2dhbi5qc1wiLFwiYW1kXCI6XCJob2dhbi5qc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wicm9vdFwiOlwiX1wiLFwiY29tbW9uanNcIjpcImxvZGFzaFwiLFwiY29tbW9uanMyXCI6XCJsb2Rhc2hcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcIl9cIixcImNvbW1vbmpzXCI6XCJ1bmRlcnNjb3JlLnN0cmluZ1wiLFwiY29tbW9uanMyXCI6XCJ1bmRlcnNjb3JlLnN0cmluZ1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcIndoaWNoXCIsXCJjb21tb25qczJcIjpcIndoaWNoXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qc1wiOlwidXVpZFwiLFwiY29tbW9uanMyXCI6XCJ1dWlkXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qc1wiOlwiY2hhbGtcIixcImNvbW1vbmpzMlwiOlwiY2hhbGtcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJzZW12ZXItcmVnZXhcIixcImNvbW1vbmpzMlwiOlwic2VtdmVyLXJlZ2V4XCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qc1wiOlwiY2xpLXNwaW5uZXJcIixcImNvbW1vbmpzMlwiOlwiY2xpLXNwaW5uZXJcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJqc2RvbVwiLFwiY29tbW9uanMyXCI6XCJqc2RvbVwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcInhtbGRvbVwiLFwiY29tbW9uanMyXCI6XCJ4bWxkb21cIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcImpRdWVyeVwiLFwiY29tbW9uanNcIjpcImpxdWVyeVwiLFwiY29tbW9uanMyXCI6XCJqcXVlcnlcIixcImFtZFwiOlwianF1ZXJ5XCJ9IiwiY2RwOi8vL2NkcC1saWIvdXRpbHMvdG9vbHMudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiY2hpbGRfcHJvY2Vzc1wiIiwiY2RwOi8vL2NkcC1saWIvZ2VuZXJhdG9ycy9pbmRleC50cyIsImNkcDovLy9jZHAtbGliL2dlbmVyYXRvcnMvYmFzZS9pbnRlcmZhY2VzLnRzIiwiY2RwOi8vL2NkcC1saWIvZ2VuZXJhdG9ycy9iYXNlL2dlbmVyYXRvci1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7QUM3REEsaUM7Ozs7Ozs7Ozs7OztBQ0FBLGtDQUE2QjtBQUM3QixrQ0FBaUM7Ozs7Ozs7Ozs7Ozs7QUNEakMsaUNBQXVCO0FBQ3ZCLGtDQUF3QjtBQUN4QixpQ0FBMkI7Ozs7Ozs7Ozs7QUNGM0IsbUNBQStCO0FBeUMzQixnQkFBRTtBQXhDTixxQ0FBNkI7QUF5Q3pCLG9CQUFJO0FBeENSLHNDQUFrQztBQXlDOUIsc0JBQUs7QUF4Q1QsbUNBQTZCO0FBQzdCLG1DQUF3QztBQUN4QyxzQ0FBK0I7QUF5QzNCLHNCQUFLO0FBeENULHFDQUE2QjtBQXlDekIsb0JBQUk7QUF4Q1Isd0NBQTBCO0FBeUN0QixnQkF6Q0csZUFBSyxDQXlDSDtBQXhDVCw0Q0FBNEM7QUF5Q3hDLGtDQUFXO0FBeENmLDhDQUFzQztBQXlDbEMs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QUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQzFCLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSjtBQTNhRCxzQ0EyYUMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxNCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgNGM2NTliMGM1MDRjZmY0OGY4OGMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwicGF0aFwiXG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImV4cG9ydCAqIGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2dlbmVyYXRvci1iYXNlXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vLi4vc3JjL2dlbmVyYXRvcnMvYmFzZS9pbmRleC50cyIsImV4cG9ydCAqIGZyb20gXCIuL2xpYnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Rvb2xzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4uLy4uL3NyYy91dGlscy9pbmRleC50cyIsImltcG9ydCAqIGFzIGZzIGZyb20gXCJmcy1leHRyYVwiO1xuaW1wb3J0ICogYXMgZ2xvYiBmcm9tIFwiZ2xvYlwiO1xuaW1wb3J0ICogYXMgaG9nYW4gZnJvbSBcImhvZ2FuLmpzXCI7XG5pbXBvcnQgKiBhcyBfbCBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgKiBhcyBfcyBmcm9tIFwidW5kZXJzY29yZS5zdHJpbmdcIjtcbmltcG9ydCAqIGFzIHdoaWNoIGZyb20gXCJ3aGljaFwiO1xuaW1wb3J0ICogYXMgdXVpZCBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0ICogYXMgc2VtdmVyUmVnZXggZnJvbSBcInNlbXZlci1yZWdleFwiO1xuaW1wb3J0IHsgU3Bpbm5lciB9IGZyb20gXCJjbGktc3Bpbm5lclwiO1xuXG5jb25zdCAkOiBKUXVlcnlTdGF0aWMgPSAoKCkgPT4ge1xuICAgIGNvbnN0IF93aW5kb3cgPSAoKCkgPT4ge1xuICAgICAgICBjb25zdCBqc2RvbSA9IHJlcXVpcmUoXCJqc2RvbVwiKTtcbiAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGpzZG9tLkpTRE9NKSB7ICAgIC8vIHYxMCtcbiAgICAgICAgICAgIHJldHVybiBuZXcganNkb20uSlNET00oKS53aW5kb3c7XG4gICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdjkuMTIueFxuICAgICAgICAgICAgcmV0dXJuIGpzZG9tLmpzZG9tKCkuZGVmYXVsdFZpZXc7XG4gICAgICAgIH1cbiAgICB9KSgpO1xuXG4gICAgLy8gcGF0Y2ggc2NvcGU6XG4gICAgKChyb290OiBhbnkpID0+IHtcbiAgICAgICAgLypcbiAgICAgICAgICoganNkb20gOS40LjAgLSA5LjEyLjAg44Gr5a6f6KOF44GV44KM44Gm44GE44KLIERPTVBhcnNlciDjga8gWE1MIOOBriBzZXJpYWxpemUg44GM44Gn44GN44Gq44GE44Gf44KBLFxuICAgICAgICAgKiB4bWxkb20g44Gr572u44GN5o+b44GI44KLXG4gICAgICAgICAqIGpzZG9tIDEwLjEuMCDjgb7jgafli5XjgYvjgarjgYTjgZPjgajjgpLnorroqo1cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHhtbGRvbSA9IHJlcXVpcmUoXCJ4bWxkb21cIik7XG4gICAgICAgIHJvb3QuRE9NUGFyc2VyID0geG1sZG9tLkRPTVBhcnNlcjtcbiAgICAgICAgLy8geG1sZG9tIOOBq+OBryBkb20udG9TdHJpbmcoKSDjgYzlrp/oo4XjgZXjgozjgabjgYTjgovjgYzjgIFnbG9iYWwg44Gr44KCIGV4cG9ydCDjgZnjgotcbiAgICAgICAgKDxhbnk+Z2xvYmFsKS5YTUxTZXJpYWxpemVyID0gcm9vdC5YTUxTZXJpYWxpemVyID0geG1sZG9tLlhNTFNlcmlhbGl6ZXI7XG4gICAgfSkoX3dpbmRvdyk7XG5cbiAgICByZXR1cm4gcmVxdWlyZShcImpxdWVyeVwiKShfd2luZG93KTtcbn0pKCk7XG5cbmV4cG9ydCB0eXBlIE1peGluZWRVbmRlcnNjb3JlU3RhdGljID0gdHlwZW9mIF9zICYgdHlwZW9mIF9sO1xuY29uc3QgX206IE1peGluZWRVbmRlcnNjb3JlU3RhdGljID0gPGFueT5fbC5taXhpbig8YW55Pl9zLmV4cG9ydHMoKSk7XG5cbmV4cG9ydCB7XG4gICAgZnMsXG4gICAgZ2xvYixcbiAgICBob2dhbixcbiAgICAkLFxuICAgIF9tIGFzIF8sXG4gICAgd2hpY2gsXG4gICAgdXVpZCxcbiAgICBjaGFsayxcbiAgICBzZW12ZXJSZWdleCxcbiAgICBTcGlubmVyLFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi9zcmMvdXRpbHMvbGlicy50cyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm9zXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwib3NcIlxuLy8gbW9kdWxlIGlkID0gNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBmcywgJCB9IGZyb20gXCIuL2xpYnNcIjtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIElHbG9iYWxTZXR0aW5nc1xuICogQGJyaWVmIOOCsOODreODvOODkOODq+ioreWumuOCpOODs+OCv+ODvOODleOCp+OCpOOCuVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElHbG9iYWxTZXR0aW5ncyB7XG4gICAgZm9yY2U/OiBib29sZWFuOyAgICAgICAgICAgIC8vIOOCqOODqeODvOe2mee2mueUqFxuICAgIHZlcmJvc2U/OiBib29sZWFuOyAgICAgICAgICAvLyDoqbPntLDjg63jgrBcbiAgICBzaWxlbnQ/OiBib29sZWFuOyAgICAgICAgICAgLy8gc2lsZW50IG1vZGVcbiAgICB0YXJnZXREaXI/OiBzdHJpbmc7ICAgICAgICAgLy8g5L2c5qWt44OH44Kj44Os44Kv44OI44OqXG4gICAgbGFuZz86IFwiZW4tVVNcIiB8IFwiamEtSlBcIjtcbn1cblxubGV0IF9zZXR0aW5nczogSUdsb2JhbFNldHRpbmdzID0ge1xuICAgIGZvcmNlOiBmYWxzZSxcbiAgICB2ZXJib3NlOiBmYWxzZSxcbiAgICBzaWxlbnQ6IGZhbHNlLFxuICAgIGxhbmc6IFwiZW4tVVNcIixcbn07XG5cbmxldCBfbGliUGF0aDogc3RyaW5nOyAgIC8vIGNkcC1saWIg44Gu5a2Y5Zyo44GX44Gm44GE44KLIHBhdGhcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIGV4cG9ydHMgbWV0aG9kczpcblxuLyoqXG4gKiDoqK3lrprlj5blvpdcbiAqXG4gKiBAcmV0dXJucyBvcHRpb25zIOODreOCsOOBq+S9v+eUqOOBmeOCi+OCquODl+OCt+ODp+ODs1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2V0dGluZ3MoKTogSUdsb2JhbFNldHRpbmdzIHtcbiAgICByZXR1cm4gJC5leHRlbmQoe30sIF9zZXR0aW5ncyk7XG59XG5cbi8qKlxuICog6Kit5a6a5oyH5a6aXG4gKlxuICogQHBhcmFtIG9wdGlvbnMg44Ot44Kw44Gr5L2/55So44GZ44KL44Kq44OX44K344On44OzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRTZXR0aW5ncyhzZXR0aW5nczogSUdsb2JhbFNldHRpbmdzKTogdm9pZCB7XG4gICAgaWYgKHNldHRpbmdzKSB7XG4gICAgICAgIF9zZXR0aW5ncy5mb3JjZSAgICAgPSBzZXR0aW5ncy5mb3JjZSAgICAgICAgfHwgX3NldHRpbmdzLmZvcmNlO1xuICAgICAgICBfc2V0dGluZ3MudmVyYm9zZSAgID0gc2V0dGluZ3MudmVyYm9zZSAgICAgIHx8IF9zZXR0aW5ncy52ZXJib3NlO1xuICAgICAgICBfc2V0dGluZ3Muc2lsZW50ICAgID0gc2V0dGluZ3Muc2lsZW50ICAgICAgIHx8IF9zZXR0aW5ncy5zaWxlbnQ7XG4gICAgICAgIF9zZXR0aW5ncy50YXJnZXREaXIgPSBzZXR0aW5ncy50YXJnZXREaXIgICAgfHwgX3NldHRpbmdzLnRhcmdldERpcjtcbiAgICAgICAgX3NldHRpbmdzLmxhbmcgICAgICA9IHNldHRpbmdzLmxhbmcgICAgICAgICB8fCBfc2V0dGluZ3MubGFuZztcbiAgICB9IGVsc2Uge1xuICAgICAgICBfc2V0dGluZ3MgPSB7XG4gICAgICAgICAgICBmb3JjZTogZmFsc2UsXG4gICAgICAgICAgICB2ZXJib3NlOiBmYWxzZSxcbiAgICAgICAgICAgIHNpbGVudDogZmFsc2UsXG4gICAgICAgICAgICBsYW5nOiBcImVuLVVTXCIsXG4gICAgICAgIH07XG4gICAgfVxufVxuXG4vKipcbiAqIFwiY2RwLWxpYlwiIOOBjOWtmOWcqOOBmeOCi+ODkeOCueOCkuWPluW+l1xuICpcbiAqIEByZXR1cm5zIGNkcC1saWIg44G444GuIHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExpYlBhdGgoKTogc3RyaW5nIHtcbiAgICBpZiAobnVsbCA9PSBfbGliUGF0aCkge1xuICAgICAgICBjb25zdCBUUllfQ09VTlQgPSAzO1xuICAgICAgICBsZXQgdHJpZWQgPSAwO1xuICAgICAgICBfbGliUGF0aCA9IF9fZGlybmFtZTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGlmIChUUllfQ09VTlQgPD0gdHJpZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcImxpYiBwYXRoIGlzIG5vdCByZXNvbHZlZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfbGliUGF0aCA9IHBhdGguam9pbihfbGliUGF0aCwgXCIuLlwiKTtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrID0gcGF0aC5qb2luKF9saWJQYXRoLCBcImNkcC1saWJcIik7XG4gICAgICAgICAgICBpZiAoZnMucGF0aEV4aXN0c1N5bmMoY2hlY2spKSB7XG4gICAgICAgICAgICAgICAgX2xpYlBhdGggPSBjaGVjaztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyaWVkKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIF9saWJQYXRoO1xufVxuXG4vKipcbiAqIOaMh+WumuOBleOCjOOBnyB0YXJnZXREaXIg44KS5Y+W5b6XXG4gKlxuICogQHJldHVybnMgdGFyZ2V0RGlyIOOBuOOBriBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYXJnZXREaXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gX3NldHRpbmdzLnRhcmdldERpcjtcbn1cblxuLyoqXG4gKiDjg63jgrDlh7rliptcbiAqIGNvbnNvbGUubG9nKCkg44Go5ZCM562JXG4gKlxuICogQHBhcmFtIG1lc3NhZ2UgICAgICAgIOWHuuWKm+ODoeODg+OCu+ODvOOCuFxuICogQHBhcmFtIG9wdGlvbmFsUGFyYW1zIOS7mOWKoOaDheWgsVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nKG1lc3NhZ2U/OiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICghX3NldHRpbmdzLnNpbGVudCkge1xuICAgICAgICBpZiAoMCA8IG9wdGlvbmFsUGFyYW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICog6Kmz57Sw44Ot44Kw5Ye65YqbXG4gKiBjb25zb2xlLmRlYnVnKCkg44Go5ZCM562JXG4gKlxuICogQHBhcmFtIG1lc3NhZ2UgICAgICAgIOWHuuWKm+ODoeODg+OCu+ODvOOCuFxuICogQHBhcmFtIG9wdGlvbmFsUGFyYW1zIOS7mOWKoOaDheWgsVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVidWcobWVzc2FnZT86IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKCFfc2V0dGluZ3Muc2lsZW50ICYmIF9zZXR0aW5ncy52ZXJib3NlKSB7XG4gICAgICAgIGlmICgwIDwgb3B0aW9uYWxQYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiREVCVUc6IFwiICsgbWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkRFQlVHOiBcIiArIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIOaknOiovFxuICogY29uc29sZS5hc3NlcnQoKSDjgajlkIznrYlcbiAqXG4gKiBAcGFyYW0gdGVzdCAgICAgICAgICAg5qSc6Ki844GZ44KL5byPXG4gKiBAcGFyYW0gbWVzc2FnZSAgICAgICAg5Ye65Yqb44Oh44OD44K744O844K4XG4gKiBAcGFyYW0gb3B0aW9uYWxQYXJhbXMg5LuY5Yqg5oOF5aCxXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQodGVzdD86IGJvb2xlYW4sIG1lc3NhZ2U/OiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICghdGVzdCkge1xuICAgICAgICBpZiAoX3NldHRpbmdzLmZvcmNlKSB7XG4gICAgICAgICAgICBpZiAoMCA8IG9wdGlvbmFsUGFyYW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICgwIDwgb3B0aW9uYWxQYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmxldCBfbGFuZzogYW55O1xuXG4vKipcbiAqIOODreODvOOCq+ODqeOCpOOCulxuICpcbiAqIEBwYXJhbSBrZXkg44Kt44O85paH5a2X5YiXXG4gKiBAcmV0dXJucyDnv7voqLPjgZXjgozjgZ/mloflrZfliJdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFfbGFuZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgX2xhbmcgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4oZ2V0TGliUGF0aCgpLCBcInJlcy9sb2NhbGVzXCIsIFwibWVzc2FnZXMuXCIgKyBfc2V0dGluZ3MubGFuZyArIFwiLmpzb25cIiksIFwidXRmOFwiKS50b1N0cmluZygpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJMYW5ndWFnZSByZXNvdXJjZSBKU09OIHBhcnNlIGVycm9yOiBcIiArIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHJlc291Y2UgPSAkLmV4dGVuZCh7fSwgX2xhbmcpO1xuICAgIGNvbnN0IHByb3BzID0ga2V5LnNwbGl0KFwiLlwiKTtcbiAgICB3aGlsZSAoMCA8IHByb3BzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBwcm9wID0gcHJvcHMuc2hpZnQoKTtcbiAgICAgICAgaWYgKHJlc291Y2VbcHJvcF0pIHtcbiAgICAgICAgICAgIHJlc291Y2UgPSByZXNvdWNlW3Byb3BdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBcInJlc291Y2Ugbm90IGZvdW5kLiBrZXk6IFwiICsga2V5KTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXNvdWNlO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4uLy4uL3NyYy91dGlscy9zZXR0aW5ncy50cyIsImltcG9ydCB7IEdlbmVyYXRvckJhc2UsIElQcm9qZWN0Q29uZmlncmF0aW9uIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IEdlbmVyYXRvck1vZHVsZSB9IGZyb20gXCIuL2dlbmVyYXRvci1tb2R1bGVcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZ2VuZXJhdG9yLW1vZHVsZVwiO1xuXG4vKipcbiAqIGdlbmVyYXRvciDnlJ/miJDplqLmlbBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5ld0dlbmVyYXRvckxpYnJhcnkoY29uZmlnOiBJUHJvamVjdENvbmZpZ3JhdGlvbik6IEdlbmVyYXRvckJhc2Uge1xuICAgIHJldHVybiBuZXcgR2VuZXJhdG9yTW9kdWxlKGNvbmZpZyk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGlicmFyeS9pbmRleC50cyIsImltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCAqIGFzIG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHtcbiAgICBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbixcbiAgICBJRGVwZW5kZW5jeSxcbiAgICBJVmlzdWFsU3R1ZGlvQ29uZmlncmF0aW9uLFxuICAgIEdlbmVyYXRvckJhc2UsXG4gICAgVXRpbHMsXG59IGZyb20gXCIuLi9iYXNlXCI7XG5pbXBvcnQgeyBJTGlicmFyeUNvbmZpZ3JhdGlvbiB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcblxuY29uc3QgZnMgICAgICAgICAgICA9IFV0aWxzLmZzO1xuY29uc3QgZ2xvYiAgICAgICAgICA9IFV0aWxzLmdsb2I7XG5jb25zdCAkICAgICAgICAgICAgID0gVXRpbHMuJDtcbmNvbnN0IF8gICAgICAgICAgICAgPSBVdGlscy5fO1xuY29uc3QgZGVidWcgICAgICAgICA9IFV0aWxzLmRlYnVnO1xuY29uc3QgdGVtcGxhdGVQYXRoICA9IFV0aWxzLnRlbXBsYXRlUGF0aDtcbmNvbnN0IGNvcHlUcGwgICAgICAgPSBVdGlscy5jb3B5VHBsO1xuXG4vKipcbiAqIEBjbGFzcyBHZW5lcmF0b3JNb2R1bGVcbiAqIEBicmllZiBMaWJyYXJ5IE1vZHVsZSDnlKggR2VuZXJhdG9yIOOCr+ODqeOCuVxuICovXG5leHBvcnQgY2xhc3MgR2VuZXJhdG9yTW9kdWxlIGV4dGVuZHMgR2VuZXJhdG9yQmFzZSB7XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIGltcHJlbWVudGVzOiBHZW5lcmF0b3JCYXNlXG5cbiAgICAvKipcbiAgICAgKiDml6Llrprjga4gZGlyZWN0b3J5IOani+mAoOOCkui/lOWNtFxuICAgICAqL1xuICAgIGRlZmF1bHRCYXNlU3RydWN0dXJlKCk6IElCYXNlU3RydWN0dXJlQ29uZmlncmF0aW9uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNyYzogXCJzcmNcIixcbiAgICAgICAgICAgIHBrZzogXCJkaXN0XCIsXG4gICAgICAgICAgICBidWlsdDogXCJidWlsdFwiLFxuICAgICAgICAgICAgZG9jOiBcImRvY3NcIixcbiAgICAgICAgICAgIHRhc2s6IFwidGFza3NcIixcbiAgICAgICAgICAgIHRlc3Q6IFwidGVzdHNcIixcbiAgICAgICAgICAgIHR5cGVzOiBcIkB0eXBlc1wiLFxuICAgICAgICAgICAgdGVtcDogXCIudGVtcFwiLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGNyZWF0ZSBhY3Rpb24gZW50cnlcbiAgICAgKiBAcGFyYW0ge0lMaWJyYXJ5Q29uZmlncmF0aW9ufSBjb25maWcg44Kz44Oz44OV44Kj44Kw6Kit5a6aXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZU1vZHVsZVByb3BzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlRGlyZWN0b3J5U3RydWN0dXJlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlUHJvamVjdFNldHRpbmdzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlU291cmNlVGVtcGxhdGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVWaXN1YWxTdHVkaW9Tb2x1dGlvbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOW/heimgeOBqOOBmeOCiyB0YXNrIHNjcmlwdCDkuIDopqfjgpLov5TljbQuIGFjdGlvbjogY3JlYXRlIOOBruOBqOOBjeOBq+WRvOOBsOOCjOOCi1xuICAgICAqL1xuICAgIGdldCB0YXNrTGlzdCgpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBcImJhbm5lci5qc1wiLFxuICAgICAgICAgICAgXCJjbGVhbi5qc1wiLFxuICAgICAgICAgICAgXCJzcmNtYXAuanNcIixcbiAgICAgICAgICAgIFwiYnVuZGxlLWZpbmFsaXplci5qc1wiLFxuICAgICAgICAgICAgXCJyZW1hcC1jb3ZlcmFnZS5qc1wiLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gcHJvdGVjdGVkIG1ldGhvZHM6XG5cbiAgICAvKipcbiAgICAgKiDplovnmbrmmYLjga7kvp3lrZjjg6Ljgrjjg6Xjg7zjg6vjg6rjgrnjg4jjga7lj5blvpdcbiAgICAgKiDlv4XopoHjgavlv5zjgZjjgabjgqrjg7zjg5Djg7zjg6njgqTjg4lcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0lEZXBlbmRlbmN5fVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXQgZGVmYXVsdERldkRlcGVuZGVuY2llcygpOiBJRGVwZW5kZW5jeVtdIHtcbiAgICAgICAgY29uc3QgZGVwZW5kcyA9IHN1cGVyLmRlZmF1bHREZXZEZXBlbmRlbmNpZXMuY29uY2F0KFtcbiAgICAgICAgICAgIHsgbmFtZTogXCJAdHlwZXMvamFzbWluZVwiLCAgICAgICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwiZHRzLWJ1bmRsZVwiLCAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBcInR5cGVzY3JpcHQtZm9ybWF0dGVyXCIsIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgY29uc3QgZXh0cmEgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLm5vZGVqcykge1xuICAgICAgICAgICAgZXh0cmEucHVzaCh7IG5hbWU6IFwiamFzbWluZS1ub2RlXCIsIHZlcnNpb246IFwiXjIuMC4wXCIsIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXh0cmEucHVzaCh7IG5hbWU6IFwicmVxdWlyZWpzXCIsIHZlcnNpb246IHVuZGVmaW5lZCwgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXy5zb3J0QnkoZGVwZW5kcy5jb25jYXQoZXh0cmEpLCAoZGVwZW5kKSA9PiBkZXBlbmQubmFtZSk7XG4gICAgfVxuXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBwcml2YXRlIG1ldGhvZHM6XG5cbiAgICAvKipcbiAgICAgKiBjb25maWdyYXRpb24g44Gr44Ki44Kv44K744K5XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXQgY29uZmlnKCk6IElMaWJyYXJ5Q29uZmlncmF0aW9uIHtcbiAgICAgICAgcmV0dXJuIDxJTGlicmFyeUNvbmZpZ3JhdGlvbj50aGlzLl9jb25maWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbW9kdWxlIOWQjSwgbWFpbiDjg5XjgqHjgqTjg6vlkI3jga7kv53oqLxcbiAgICAgKiAtIDE6IG1vZHVsZU5hbWUg44GM5oyH5a6a44GV44KM44Gm44GE44KL5aC05ZCI44Gv5L2/55So44GZ44KLXG4gICAgICogLSAyOiBwcm9qZWN0TmFtZSDjgYzkvb/nlKjlj6/og73jgarloLTlkIjjga/jgZ3jgozjgpLkvb/nlKjjgZnjgotcbiAgICAgKiAtIDM6IHByb2plY3ROYW1lIOOBjOS9v+eUqOS4jeWPr+OBruWgtOWQiOOBr+OAgVwiLVwiIOOBpOOBquOBjuaWh+Wtl+WIl+OCkueUn+aIkOOBmeOCi1xuICAgICAqL1xuICAgIHByaXZhdGUgZW5zdXJlTW9kdWxlUHJvcHMoKTogdm9pZCB7XG4gICAgICAgIC8vIG1vZHVsZSBuYW1lXG4gICAgICAgIGlmIChudWxsID09IHRoaXMuY29uZmlnLm1vZHVsZU5hbWUpIHtcbiAgICAgICAgICAgIGlmICghL14uKlsoXFxcXHxcXHN8L3w6fCp8P3xcInw8fD58fCldLiokLy50ZXN0KHRoaXMuY29uZmlnLnByb2plY3ROYW1lKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLm1vZHVsZU5hbWUgPSB0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcubW9kdWxlTmFtZSA9IF8udHJpbShfLmRhc2hlcml6ZSh0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZSksIFwiLVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZWJ1ZyhcIm1vZHVsZU5hbWU6IFwiICsgdGhpcy5jb25maWcubW9kdWxlTmFtZSk7XG5cbiAgICAgICAgLy8gbWFpbiBmaWxlIG5hbWVcbiAgICAgICAgaWYgKG51bGwgPT0gdGhpcy5jb25maWcubWFpbkJhc2VOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5tYWluQmFzZU5hbWUgPSB0aGlzLmNvbmZpZy5tb2R1bGVOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGRlYnVnKFwibWFpbkJhc2VOYW1lOiBcIiArIHRoaXMuY29uZmlnLm1haW5CYXNlTmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OH44Kj44Os44Kv44OI44Oq5qeL5oiQ5oOF5aCx44Gu44Kz44OU44O8XG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVEaXJlY3RvcnlTdHJ1Y3R1cmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29weVRwbERpcihcImxpYnJhcnkvc3RydWN0dXJlXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODl+ODreOCuOOCp+OCr+ODiOioreWumuODleOCoeOCpOODq+OBruS9nOaIkFxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlUHJvamVjdFNldHRpbmdzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBwcm9qZWN0LmNvbmZpZy5qc1xuICAgICAgICBjb3B5VHBsKFxuICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcImxpYnJhcnlcIiksIFwiX3Byb2plY3QuY29uZmlnLmpzXCIpLFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJwcm9qZWN0LmNvbmZpZy5qc1wiKSxcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiIH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyB0c2NvbmZpZ1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLm91dHB1dFNhbWVEaXIpIHtcbiAgICAgICAgICAgIC8vIG1haW4gdHNjb25maWcuanNvblxuICAgICAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeVwiKSwgXCJfdHNjb25maWcuanNvblwiKSxcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcInRzY29uZmlnLmpzb25cIiksXG4gICAgICAgICAgICAgICAgdGhpcy5fY29uZmlnLFxuICAgICAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiLCBib206IGZhbHNlLCB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gdGVzdCB0c2NvbmZpZy5qc29uXG4gICAgICAgICAgICBjb3B5VHBsKFxuICAgICAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJsaWJyYXJ5XCIpLCBcIl90c2NvbmZpZy50ZXN0Lmpzb25cIiksXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50ZXN0LCBcInVuaXRcIiwgXCJ0c2NvbmZpZy5qc29uXCIpLFxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcbiAgICAgICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG1haW4gdHNjb25maWcuanNvblxuICAgICAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeVwiKSwgXCJfdHNjb25maWcub3V0cHV0LXNhbWUtZGlyLmpzb25cIiksXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJ0c2NvbmZpZy5qc29uXCIpLFxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcbiAgICAgICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVzbGludHJjLmpzb25cbiAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJsaWJyYXJ5XCIpLCBcIl9lc2xpbnRyYy5qc29uXCIpLFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50ZXN0LCBcImVzbGludFwiLCBcImVzbGludHJjLmpzb25cIiksXG4gICAgICAgICAgICB0aGlzLnF1ZXJ5RXNMaW50RW52UGFyYW0oKSxcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiLCBib206IGZhbHNlLCB9XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gdGVzdGVtXG4gICAgICAgIGlmICghdGhpcy5jb25maWcubm9kZWpzKSB7XG4gICAgICAgICAgICBjb3B5VHBsKFxuICAgICAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJsaWJyYXJ5L3Rvb2xzL3Rlc3RlbVwiKSwgXCJfdGVzdGVtLmpzb25cIiksXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50ZXN0LCBcInJ1bm5lclwiLCBcInRlc3RlbS5qc29uXCIpLFxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcbiAgICAgICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgdGVzdGVtU3R1ZmZQYXRoID0gdGVtcGxhdGVQYXRoKFwibGlicmFyeS90b29scy90ZXN0ZW0vcnVubmVyXCIpO1xuXG4gICAgICAgICAgICBnbG9iLnN5bmMoXCIqKlwiLCB7XG4gICAgICAgICAgICAgICAgY3dkOiB0ZXN0ZW1TdHVmZlBhdGgsXG4gICAgICAgICAgICAgICAgbm9kaXI6IHRydWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZzLmNvcHlTeW5jKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKHRlc3RlbVN0dWZmUGF0aCwgZmlsZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnRlc3QsIFwicnVubmVyXCIsIGZpbGUpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAuZ2l0aWdub3JlXG4gICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeVwiKSwgXCJfZ2l0aWdub3JlXCIpLFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCIuZ2l0aWdub3JlXCIpLFxuICAgICAgICAgICAgdGhpcy5fY29uZmlnLFxuICAgICAgICAgICAgeyBib206IGZhbHNlLCB9XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUkVBRE1FLm1kXG4gICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeVwiKSwgXCJfUkVBRE1FLm1kXCIpLFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJSRUFETUUubWRcIiksXG4gICAgICAgICAgICB0aGlzLl9jb25maWcsXG4gICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiB9XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gcGFja2FnZS5qc29uXG4gICAgICAgIHRoaXMuY29uZmlnLmRldkRlcGVuZGVuY2llcyA9IGF3YWl0IHRoaXMucXVlcnlEZXBlbmRlbmNpZXNQYXJhbSh0aGlzLmNvbmZpZy5kZXZEZXBlbmRlbmNpZXMgfHwgdGhpcy5kZWZhdWx0RGV2RGVwZW5kZW5jaWVzKTtcbiAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJsaWJyYXJ5XCIpLCBcIl9wYWNrYWdlLmpzb25cIiksXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcInBhY2thZ2UuanNvblwiKSxcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiLCBib206IGZhbHNlLCB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44K944O844K544Gu6Zub5b2i5L2c5oiQXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVTb3VyY2VUZW1wbGF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgX21vZHVsZSA9IHBhdGguYmFzZW5hbWUodGhpcy5fY29uZmlnLm1vZHVsZU5hbWUsIFwiLmpzXCIpO1xuICAgICAgICBjb25zdCBwYXJhbSA9IHtcbiAgICAgICAgICAgIHNhbXBsZUNsYXNzOiBfLmNsYXNzaWZ5KF9tb2R1bGUpLFxuICAgICAgICAgICAgc2FtcGxlTW9kdWxlOiBfbW9kdWxlLFxuICAgICAgICAgICAgYnVpbHQ6IHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuYnVpbHQsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyY0NvbmZpZykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyY0NvbmZpZy5zY3JpcHQgfHwgXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9KSgpO1xuXG4gICAgICAgIC8vIGluZGV4LnRzXG4gICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeVwiKSwgXCJzcmNcIiwgXCJfaW5kZXgudHNcIiksXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYywgc2NyaXB0LCBfbW9kdWxlICsgXCIudHNcIiksXG4gICAgICAgICAgICBwYXJhbSxcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiIH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBpbmRleC5zcGVjLnRzXG4gICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeVwiKSwgXCJzcmNcIiwgXCJfaW5kZXguc3BlYy50c1wiKSxcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcudGVzdCwgXCJ1bml0XCIsIF9tb2R1bGUgKyBcIi5zcGVjLnRzXCIpLFxuICAgICAgICAgICAgcGFyYW0sXG4gICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmlzdWFsIFN0dWRpbyDjga7jgr3jg6rjg6Xjg7zjgrfjg6fjg7Pjg5XjgqHjgqTjg6vkvZzmiJBcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGNyZWF0ZVZpc3VhbFN0dWRpb1NvbHV0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB2c1BhcmFtID0gKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZUdVSUQgPSBVdGlscy5jcmVhdGVHVUlEO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJhbTogSVZpc3VhbFN0dWRpb0NvbmZpZ3JhdGlvbiA9IDxhbnk+JC5leHRlbmQoe30sIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcpO1xuXG4gICAgICAgICAgICBwYXJhbS5wcm9qZWN0TmFtZSAgICAgICA9IHRoaXMuX2NvbmZpZy5wcm9qZWN0TmFtZTtcbiAgICAgICAgICAgIHBhcmFtLnByb2plY3RHVUlEICAgICAgID0gY3JlYXRlR1VJRCgpO1xuICAgICAgICAgICAgcGFyYW0udHlwZXMgICAgICAgICAgICAgPSBwYXJhbS50eXBlcy5yZXBsYWNlKFwiQFwiLCBcIiU0MFwiKTsgLy8gZXNjYXBlIFwiQFwiIHRvIFwiJTQwXCJcbiAgICAgICAgICAgIHBhcmFtLm1haW5CYXNlTmFtZSAgICAgID0gdGhpcy5fY29uZmlnLm1haW5CYXNlTmFtZTtcbiAgICAgICAgICAgIHBhcmFtLmxpY2Vuc2UgICAgICAgICAgID0gIXRoaXMuX2NvbmZpZy5wcml2YXRlO1xuXG4gICAgICAgICAgICAvLyB0b29sc1xuICAgICAgICAgICAgcGFyYW0ud2VicGFjayA9IHRoaXMuaXNFbmFibGVUb29sKFwid2VicGFja1wiKTtcbiAgICAgICAgICAgIHBhcmFtLnRlc3RlbSA9ICF0aGlzLmNvbmZpZy5ub2RlanM7XG5cbiAgICAgICAgICAgIHBhcmFtLm91dHB1dFNhbWVEaXIgPSB0aGlzLmNvbmZpZy5vdXRwdXRTYW1lRGlyO1xuXG4gICAgICAgICAgICAvLyBzZXR1cCBidWlsdCBqcyBncm91cFxuICAgICAgICAgICAgcGFyYW0uanNHcm91cCA9IFtdO1xuICAgICAgICAgICAgaWYgKCFwYXJhbS5vdXRwdXRTYW1lRGlyKSB7XG4gICAgICAgICAgICAgICAgcGFyYW0uanNHcm91cC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVQYXRoOiBwYXJhbS5idWlsdCArIFwiXFxcXFwiLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogcGFyYW0ubWFpbkJhc2VOYW1lLFxuICAgICAgICAgICAgICAgICAgICBkZXBlbmRlZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZF90czogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWFwOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBtaW5fbWFwOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5taW5pZnkpIHtcbiAgICAgICAgICAgICAgICAvLyBzZXR1cCBwa2cgZ3JvdXBcbiAgICAgICAgICAgICAgICBwYXJhbS5qc0dyb3VwLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVBhdGg6IHBhcmFtLnBrZyArIFwiXFxcXFwiLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogcGFyYW0ubWFpbkJhc2VOYW1lLFxuICAgICAgICAgICAgICAgICAgICBkZXBlbmRlZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGRfdHM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtYXA6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtaW5fbWFwOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzZXR1cCB0ZXN0IGpzIGdyb3VwXG4gICAgICAgICAgICBwYXJhbS50c0dyb3VwID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVQYXRoOiBwYXJhbS50ZXN0ICsgXCJcXFxcdW5pdFxcXFxcIixcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IHBhcmFtLm1haW5CYXNlTmFtZSArIFwiLnNwZWNcIixcbiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1hcDogdGhpcy5jb25maWcub3V0cHV0U2FtZURpcixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGlmIChwYXJhbS5vdXRwdXRTYW1lRGlyKSB7XG4gICAgICAgICAgICAgICAgcGFyYW0udHNHcm91cC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVQYXRoOiBwYXJhbS5idWlsdCArIFwiXFxcXFwiLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogcGFyYW0ubWFpbkJhc2VOYW1lLFxuICAgICAgICAgICAgICAgICAgICBkZXBlbmRlZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1hcDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHBhcmFtO1xuICAgICAgICB9KSgpO1xuXG4gICAgICAgIC8vIC5zbG5cbiAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJiYXNlL3Zpc3VhbC5zdHVkaW9cIiksIFwiX3NvbHV0aW9uLnNsbi50cGxcIiksXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB2c1BhcmFtLnByb2plY3ROYW1lICsgXCIuc2xuXCIpLFxuICAgICAgICAgICAgdnNQYXJhbSxcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiIH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyAuY3Nwcm9qXG4gICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0b1htbFN0cmluZyA9IChmaWxlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBob2dhbiA9IFV0aWxzLmhvZ2FuO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZVRleHQgPSBVdGlscy5ub3JtYWxpemVUZXh0O1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGVvbDogb3MuRU9MLFxuICAgICAgICAgICAgICAgICAgICBib206IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGRlbGltaXRlcnM6IFwie3sgfX1cIixcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdHBsID0gcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcImJhc2UvdmlzdWFsLnN0dWRpb1wiKSwgZmlsZSk7XG4gICAgICAgICAgICAgICAgY29uc3QganN0ID0gaG9nYW4uY29tcGlsZShub3JtYWxpemVUZXh0KGZzLnJlYWRGaWxlU3luYyh0cGwpLnRvU3RyaW5nKCksIHsgZW9sOiBcIlxcblwiLCBib206IGZhbHNlIH0pLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ganN0LnJlbmRlcih2c1BhcmFtKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHRvWG1sRE9NID0gKGZpbGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAkKCQucGFyc2VYTUwodG9YbWxTdHJpbmcoZmlsZSkpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHRvWG1sTm9kZSA9IChmaWxlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gVXRpbHMuc3RyMlhtbE5vZGUodG9YbWxTdHJpbmcoZmlsZSkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgJHByb2ogPSB0b1htbERPTShcIl9wcm9qZWN0LmNzcHJvai50cGxcIik7XG4gICAgICAgICAgICBjb25zdCAkZ3BUUyA9IHRvWG1sTm9kZShcIl90cy5pdGVtLmdyb3VwLnRwbFwiKTtcbiAgICAgICAgICAgIGNvbnN0ICRncEpTID0gdG9YbWxOb2RlKFwiX2pzLml0ZW0uZ3JvdXAudHBsXCIpO1xuXG4gICAgICAgICAgICAkcHJvalxuICAgICAgICAgICAgICAgIC5maW5kKFwiSXRlbUdyb3VwXCIpXG4gICAgICAgICAgICAgICAgLmxhc3QoKVxuICAgICAgICAgICAgICAgIC5hZnRlcigkZ3BUUylcbiAgICAgICAgICAgICAgICAuYWZ0ZXIoJGdwSlMpXG4gICAgICAgICAgICAgICAgO1xuXG4gICAgICAgICAgICBjb25zdCBmb3JtYXRYTUwgPSBVdGlscy5mb3JtYXRYTUw7XG4gICAgICAgICAgICBjb25zdCBkc3RQYXRoID0gcGF0aC5qb2luKHRoaXMucm9vdERpciwgdnNQYXJhbS5wcm9qZWN0TmFtZSArIFwiLmNzcHJvalwiKTtcbiAgICAgICAgICAgIGRlYnVnKFV0aWxzLnhtbE5vZGUyU3RyKCRwcm9qKSk7XG4gICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRzdFBhdGgsIGZvcm1hdFhNTChVdGlscy54bWxOb2RlMlN0cigkcHJvaikpKTtcbiAgICAgICAgfSkoKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGlicmFyeS9nZW5lcmF0b3ItbW9kdWxlLnRzIiwiaW1wb3J0IHsgR2VuZXJhdG9yQmFzZSwgSVByb2plY3RDb25maWdyYXRpb24gfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IHsgR2VuZXJhdG9yQ29yZG92YSB9IGZyb20gXCIuL2dlbmVyYXRvci1jb3Jkb3ZhXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2dlbmVyYXRvci1jb3Jkb3ZhXCI7XG5cbi8qKlxuICogZ2VuZXJhdG9yIOeUn+aIkOmWouaVsFxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV3R2VuZXJhdG9yTW9iaWxlKGNvbmZpZzogSVByb2plY3RDb25maWdyYXRpb24pOiBHZW5lcmF0b3JCYXNlIHtcbiAgICByZXR1cm4gbmV3IEdlbmVyYXRvckNvcmRvdmEoY29uZmlnKTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi8uLi9zcmMvZ2VuZXJhdG9ycy9tb2JpbGUvaW5kZXgudHMiLCJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCB7XG4gICAgZnMsXG4gICAgZ2xvYixcbiAgICAkLFxuICAgIF8sXG4gICAgaG9nYW4sXG4gICAgZGVidWcsXG4gICAgdGVtcGxhdGVQYXRoLFxuICAgIGNvcHlUcGwsXG4gICAgZXhlY0NvbW1hbmQsXG4gICAgc3RyMlhtbE5vZGUsXG4gICAgeG1sTm9kZTJTdHIsXG4gICAgbm9ybWFsaXplVGV4dCxcbiAgICBmb3JtYXRYTUwsXG4gICAgY3JlYXRlR1VJRCxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5pbXBvcnQge1xuICAgIElCYXNlU3RydWN0dXJlQ29uZmlncmF0aW9uLFxuICAgIElEZXBlbmRlbmN5LFxuICAgIElWaXN1YWxTdHVkaW9Db25maWdyYXRpb24sXG4gICAgR2VuZXJhdG9yQmFzZSxcbn0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IElNb2JpbGVBcHBDb25maWdyYXRpb24gfSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5cbi8qKlxuICogQGNsYXNzIEdlbmVyYXRvckNvcmRvdmFcbiAqIEBicmllZiBNb2JpbGUgQ29yZG92YSDnlKggR2VuZXJhdG9yIOOCr+ODqeOCuVxuICovXG5leHBvcnQgY2xhc3MgR2VuZXJhdG9yQ29yZG92YSBleHRlbmRzIEdlbmVyYXRvckJhc2Uge1xuXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBpbXByZW1lbnRlczogR2VuZXJhdG9yQmFzZVxuXG4gICAgLyoqXG4gICAgICog5pei5a6a44GuIGRpcmVjdG9yeSDmp4vpgKDjgpLov5TljbRcbiAgICAgKi9cbiAgICBkZWZhdWx0QmFzZVN0cnVjdHVyZSgpOiBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzcmM6IFwiYXBwXCIsXG4gICAgICAgICAgICBwa2c6IFwid3d3XCIsXG4gICAgICAgICAgICBidWlsdDogXCJhcHBcIixcbiAgICAgICAgICAgIGRvYzogXCJkb2NzXCIsXG4gICAgICAgICAgICB0YXNrOiBcInRhc2tzXCIsXG4gICAgICAgICAgICB0ZXN0OiBcInRlc3RzXCIsXG4gICAgICAgICAgICB0eXBlczogXCJAdHlwZXNcIixcbiAgICAgICAgICAgIHRlbXA6IFwiLnRlbXBcIixcbiAgICAgICAgICAgIGxpYjogXCJsaWJcIixcbiAgICAgICAgICAgIGV4dGVybmFsOiBcImV4dGVybmFsXCIsXG4gICAgICAgICAgICBwb3J0aW5nOiBcInBvcnRpbmdcIixcbiAgICAgICAgICAgIHJlczogXCJyZXNcIixcbiAgICAgICAgICAgIHNyY0NvbmZpZzoge1xuICAgICAgICAgICAgICAgIHNjcmlwdDogXCJzY3JpcHRzXCIsXG4gICAgICAgICAgICAgICAgc3R5bGVzaGVldDogXCJzdHlsZXNoZWV0c1wiLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBcInRlbXBsYXRlc1wiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjcmVhdGUgYWN0aW9uIGVudHJ5XG4gICAgICogQHBhcmFtIHtJTGlicmFyeUNvbmZpZ3JhdGlvbn0gY29uZmlnIOOCs+ODs+ODleOCo+OCsOioreWumlxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZGVidWcoSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcsIG51bGwsIDQpKTtcblxuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZUNvcmRvdmEoKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGRpcih0aGlzLnJvb3REaXIpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVDb3Jkb3ZhU2NhZmZvbGQoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ29uZmlnWE1MKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkZENvcmRvdmFQbGF0Zm9ybXMoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkQ29yZG92YVBsdWdpbnMoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkQ29yZG92YUV4dGVudGlvbkZpbGVzKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNhY2hlQ29yZG92YVBhY2thZ2VKU09OKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNoZGlyKFwiLi5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZURpcmVjdG9yeVN0cnVjdHVyZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZVByb2plY3RTZXR0aW5ncygpO1xuICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZVNvdXJjZVRlbXBsYXRlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlVmlzdWFsU3R1ZGlvU29sdXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlv4XopoHjgajjgZnjgosgdGFzayBzY3JpcHQg5LiA6Kan44KS6L+U5Y20LiBhY3Rpb246IGNyZWF0ZSDjga7jgajjgY3jgavlkbzjgbDjgozjgotcbiAgICAgKi9cbiAgICBnZXQgdGFza0xpc3QoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgXCJiYW5uZXIuanNcIixcbiAgICAgICAgICAgIFwiY2xlYW4uanNcIixcbiAgICAgICAgICAgIFwiY29tbWFuZC5qc1wiLFxuICAgICAgICAgICAgXCJleHRlcm5hbC1yZWFycmFuZ2UuanNcIixcbiAgICAgICAgICAgIFwibWluaWZ5LmpzXCIsXG4gICAgICAgICAgICBcInNyY21hcC5qc1wiLFxuICAgICAgICAgICAgXCJidW5kbGUtZmluYWxpemVyLmpzXCIsXG4gICAgICAgICAgICBcInJlbWFwLWNvdmVyYWdlLmpzXCIsXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBwcm90ZWN0ZWQgbWV0aG9kczpcblxuICAgIC8qKlxuICAgICAqIOmWi+eZuuaZguOBruS+neWtmOODouOCuOODpeODvOODq+ODquOCueODiOOBruWPluW+l1xuICAgICAqIOW/heimgeOBq+W/nOOBmOOBpuOCquODvOODkOODvOODqeOCpOODiVxuICAgICAqXG4gICAgICogQHJldHVybiB7SURlcGVuZGVuY3l9XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldCBkZWZhdWx0RGV2RGVwZW5kZW5jaWVzKCk6IElEZXBlbmRlbmN5W10ge1xuICAgICAgICBjb25zdCBkZXBlbmRzID0gc3VwZXIuZGVmYXVsdERldkRlcGVuZGVuY2llcy5jb25jYXQoW1xuICAgICAgICAgICAgeyBuYW1lOiBcIkB0eXBlcy9qYXNtaW5lXCIsICAgICAgIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcbiAgICAgICAgICAgIHsgbmFtZTogXCJAdHlwZXMvcmVxdWlyZWpzXCIsICAgICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwiYXV0b3ByZWZpeGVyXCIsICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBcImNsZWFuLWNzc1wiLCAgICAgICAgICAgIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcbiAgICAgICAgICAgIHsgbmFtZTogXCJmcy1leHRyYVwiLCAgICAgICAgICAgICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwiaHRtbC1taW5pZmllclwiLCAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBcIm5vZGUtc2Fzc1wiLCAgICAgICAgICAgIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcbiAgICAgICAgICAgIHsgbmFtZTogXCJwb3N0Y3NzLWNsaVwiLCAgICAgICAgICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwic21hcnR3YXRjaFwiLCAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBjb25zdCBleHRyYSA9IFtdO1xuICAgICAgICB0aGlzLmNvbmZpZy5kZXZEZXBlbmRlbmNpZXMuZm9yRWFjaCgoZGVwZW5kKSA9PiB7XG4gICAgICAgICAgICBleHRyYS5wdXNoKHsgbmFtZTogZGVwZW5kLm5hbWUsIHZlcnNpb246IGRlcGVuZC52ZXJzaW9uLCB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVDb3Jkb3ZhKCkpIHtcbiAgICAgICAgICAgIGV4dHJhLnB1c2goeyBuYW1lOiBcIkB0eXBlcy9jb3Jkb3ZhXCIsIHZlcnNpb246IHVuZGVmaW5lZCwgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXy5zb3J0QnkoZGVwZW5kcy5jb25jYXQoZXh0cmEpLCAoZGVwZW5kKSA9PiBkZXBlbmQubmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZXNsaW50cmMg44Gr5oyH5a6a44GZ44KLIHRlbXBsYXRlIHBhcmFtYWV0ZXIg44KS5Y+W5b6XXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IOODhuODs+ODl+ODrOODvOODiOODkeODqeODoeODvOOCv+OCquODluOCuOOCp+OCr+ODiFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBxdWVyeUVzTGludEVudlBhcmFtKCk6IGFueSB7XG4gICAgICAgIGNvbnN0IGJhc2UgPSBzdXBlci5xdWVyeUVzTGludEVudlBhcmFtKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgICAgLi4ue1xuICAgICAgICAgICAgICAgIGNvcmRvdmE6IHRoaXMuaXNFbmFibGVDb3Jkb3ZhKCksXG4gICAgICAgICAgICAgICAgaGFtbWVyanM6IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJoYW1tZXJqc1wiKSxcbiAgICAgICAgICAgICAgICBpc2Nyb2xsOiB0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaXNjcm9sbFwiKSxcbiAgICAgICAgICAgICAgICBmbGlwc25hcDogdGhpcy5pc0luc3RhbGxhdGlvblRhcmdldChcImZsaXBzbmFwXCIpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0c2NvbmZpZy5iYXNlIOOBq+aMh+WumuOBmeOCiyB0ZW1wbGF0ZSBwYXJhbWFldGVyIOOCkuWPluW+l1xuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fSDjg4bjg7Pjg5fjg6zjg7zjg4jjg5Hjg6njg6Hjg7zjgr/jgqrjg5bjgrjjgqfjgq/jg4hcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcXVlcnlUc0NvbmZpZ0Jhc2VQYXJhbSgpOiBhbnkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4udGhpcy5fY29uZmlnLFxuICAgICAgICAgICAgLi4ue1xuICAgICAgICAgICAgICAgIGNvcmRvdmE6IHRoaXMuaXNFbmFibGVDb3Jkb3ZhKCksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gcHJpdmF0ZSBtZXRob2RzOlxuXG4gICAgLyoqXG4gICAgICog6ZaL55m65pmC44Gu5L6d5a2Y44Oi44K444Ol44O844Or44Oq44K544OI44Gu5Y+W5b6XXG4gICAgICog5b+F6KaB44Gr5b+c44GY44Gm44Kq44O844OQ44O844Op44Kk44OJXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtJRGVwZW5kZW5jeX1cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldCBkZWZhdWx0RGVwZW5kZW5jaWVzKCk6IElEZXBlbmRlbmN5W10ge1xuICAgICAgICBjb25zdCBkZXBlbmRzID0gW1xuICAgICAgICAgICAgeyBuYW1lOiBcIkBjZHAvbW9iaWxlXCIsICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwiYmFja2JvbmVcIiwgICAgIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcbiAgICAgICAgICAgIHsgbmFtZTogXCJqcXVlcnlcIiwgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBcInJlcXVpcmVqc1wiLCAgICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwidW5kZXJzY29yZVwiLCAgIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCBleHRyYSA9IFtdO1xuICAgICAgICB0aGlzLmNvbmZpZy5kZXBlbmRlbmNpZXMuZm9yRWFjaCgoZGVwZW5kKSA9PiB7XG4gICAgICAgICAgICBleHRyYS5wdXNoKHsgbmFtZTogZGVwZW5kLm5hbWUsIHZlcnNpb246IGRlcGVuZC52ZXJzaW9uLCB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIF8uc29ydEJ5KGRlcGVuZHMuY29uY2F0KGV4dHJhKSwgKGRlcGVuZCkgPT4gZGVwZW5kLm5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGNvbmZpZ3JhdGlvbiDjgavjgqLjgq/jgrvjgrlcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldCBjb25maWcoKTogSU1vYmlsZUFwcENvbmZpZ3JhdGlvbiB7XG4gICAgICAgIHJldHVybiA8SU1vYmlsZUFwcENvbmZpZ3JhdGlvbj50aGlzLl9jb25maWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY29yZG92YSDjga7mnInlirkv54Sh5Yq544OB44Kn44OD44KvXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB0cnVlOiDmnInlirkgLyBmYWxzZTog54Sh5Yq5XG4gICAgICovXG4gICAgcHJpdmF0ZSBpc0VuYWJsZUNvcmRvdmEoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoMCA8IHRoaXMuY29uZmlnLnBsYXRmb3Jtcy5sZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGxpYi9wb3J0aW5nIOOBruioreWumueKtuazgeOBruODgeOCp+ODg+OCr1xuICAgICAqXG4gICAgICogQHBhcmFtIHRhcmdldFxuICAgICAqIEByZXR1cm5zIHRydWU6IOioreWumiAvIGZhbHNlOiDmnKroqK3lrppcbiAgICAgKi9cbiAgICBwcml2YXRlIGhhc1N0cnVjdHVyZU9mKHRhcmdldDogXCJsaWJcIiB8IFwicG9ydGluZ1wiKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy5jb25maWcucHJvamVjdFN0cnVjdHVyZSAmJiAwIDw9IHRoaXMuY29uZmlnLnByb2plY3RTdHJ1Y3R1cmUuaW5kZXhPZih0YXJnZXQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgqTjg7Pjgrnjg4jjg7zjg6vlr77osaEv6Z2e5a++6LGh44OB44Kn44OD44KvXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSAgICBbaW5dIOODouOCuOODpeODvOODq+WQjVxuICAgICAqIEBwYXJhbSBkZXBlbmRzIFtpbl0g5qSc57Si5a++6LGhICjml6LlrpogdGhpcy5jb25maWcuZGVwZW5kZW5jaWVzKVxuICAgICAqIEByZXR1cm5zIHRydWU6IOWvvuixoSAvIGZhbHNlOiDpnZ7lr77osaFcbiAgICAgKi9cbiAgICBwcml2YXRlIGlzSW5zdGFsbGF0aW9uVGFyZ2V0KG5hbWU6IHN0cmluZywgZGVwZW5kczogSURlcGVuZGVuY3lbXSA9IHRoaXMuY29uZmlnLmRlcGVuZGVuY2llcyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISFkZXBlbmRzLmZpbmQoKGRlcGVuZCkgPT4gbmFtZSA9PT0gZGVwZW5kLm5hbWUpO1xuICAgIH1cblxuICAgIC8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vXG5cbiAgICAvKipcbiAgICAgKiBjb3Jkb3ZhIOOCkueUqOOBhOOBn+ODl+ODreOCuOOCp+OCr+ODiOS9nOaIkFxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlQ29yZG92YVNjYWZmb2xkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnByb2dyZXNzKFwibW9iaWxlLmNyZWF0ZS5jb3Jkb3ZhLmNyZWF0ZUNvcmRvdmFTY2FmZm9sZFwiKTtcbiAgICAgICAgZGVidWcoXCJjcmVhdGVDb3Jkb3ZhU2NhZmZvbGRcIik7XG5cbiAgICAgICAgLy8gYCQgY29yZG92YSBjcmVhdGUgY29vbC1tb2JpbGUgY29tLnNvbnkuY2RwLmNvb2xtb2JpbGUgXCJDb29sIE1vYmlsZVwiYFxuICAgICAgICBhd2FpdCBleGVjQ29tbWFuZChcImNvcmRvdmFcIiwgW1wiY3JlYXRlXCIsIHRoaXMuY29uZmlnLnByb2plY3ROYW1lLCB0aGlzLmNvbmZpZy5hcHBJZCwgdGhpcy5jb25maWcuYXBwTmFtZV0pO1xuXG4gICAgICAgIC8vIHJlbW92ZSBmaWxlc1xuICAgICAgICBnbG9iLnN5bmMoXCJ3d3cvKiovKlwiLCB7XG4gICAgICAgICAgICBjd2Q6IHRoaXMuY29uZmlnLnByb2plY3ROYW1lLFxuICAgICAgICB9KS5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgICBmcy5yZW1vdmVTeW5jKHBhdGguam9pbih0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZSwgZmlsZSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgZnMucmVtb3ZlU3luYyhwYXRoLmpvaW4odGhpcy5jb25maWcucHJvamVjdE5hbWUsIFwicmVzXCIpKTtcbiAgICAgICAgZnMucmVtb3ZlU3luYyhwYXRoLmpvaW4odGhpcy5jb25maWcucHJvamVjdE5hbWUsIFwiLm5wbWlnbm9yZVwiKSk7XG5cbiAgICAgICAgLy8gbW92ZSByb290IGRpcmVjdG9yeVxuICAgICAgICBmcy5jb3B5U3luYyh0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZSwgXCIuL1wiKTtcbiAgICAgICAgZnMucmVtb3ZlU3luYyh0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY29uZmlnLnhtbCDjga7kv67mraNcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHVwZGF0ZUNvbmZpZ1hNTCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5wcm9ncmVzcyhcIm1vYmlsZS5jcmVhdGUuY29yZG92YS51cGRhdGVDb25maWdYbWxcIik7XG4gICAgICAgIGRlYnVnKFwidXBkYXRlQ29uZmlnWE1MXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbmZpZ1htbFBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJjb25maWcueG1sXCIpO1xuICAgICAgICBjb25zdCAkY29uZmlnWG1sRG9tID0gJChzdHIyWG1sTm9kZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnWG1sUGF0aCkudG9TdHJpbmcoKSkpO1xuXG4gICAgICAgICRjb25maWdYbWxEb21cbiAgICAgICAgICAgIC5maW5kKFwid2lkZ2V0XCIpXG4gICAgICAgICAgICAuYXR0cihcInZlcnNpb25cIiwgdGhpcy5jb25maWcudmVyc2lvbilcbiAgICAgICAgICAgIC5hdHRyKFwiaW9zLUNGQnVuZGxlSWRlbnRpZmllclwiLCB0aGlzLmNvbmZpZy5hcHBJZClcbiAgICAgICAgICAgIC5wcmVwZW5kKHN0cjJYbWxOb2RlKGBcbiAgICAgICAgICAgICAgICA8cHJlZmVyZW5jZSBuYW1lPVwiRGlzYWxsb3dPdmVyc2Nyb2xsXCIgdmFsdWU9XCJ0cnVlXCIvPlxuICAgICAgICAgICAgICAgIDxwcmVmZXJlbmNlIG5hbWU9XCJLZXlib2FyZERpc3BsYXlSZXF1aXJlc1VzZXJBY3Rpb25cIiB2YWx1ZT1cImZhbHNlXCIvPlxuICAgICAgICAgICAgICAgIDxwcmVmZXJlbmNlIG5hbWU9XCJCYWNrZ3JvdW5kQ29sb3JcIiB2YWx1ZT1cIjB4ZmYwMDAwMDBcIiAvPlxuICAgICAgICAgICAgYCkpXG4gICAgICAgICAgICA7XG5cbiAgICAgICAgLy8gcmVtb3ZlIGNvcmRvdmEgdGVhbSBpbmZvcm1hdGlvblxuICAgICAgICAkY29uZmlnWG1sRG9tXG4gICAgICAgICAgICAuZmluZChcImRlc2NyaXB0aW9uXCIpXG4gICAgICAgICAgICAucmVtb3ZlKCk7XG4gICAgICAgICRjb25maWdYbWxEb21cbiAgICAgICAgICAgIC5maW5kKFwiYXV0aG9yXCIpXG4gICAgICAgICAgICAucmVtb3ZlKCk7XG5cbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdYbWxQYXRoLCBmb3JtYXRYTUwoeG1sTm9kZTJTdHIoJGNvbmZpZ1htbERvbSkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBwbGF0Zm9ybSDov73liqBcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGFkZENvcmRvdmFQbGF0Zm9ybXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGRlYnVnKFwiYWRkQ29yZG92YVBsYXRmb3Jtc1wiKTtcblxuICAgICAgICBjb25zdCB0YXJnZXRzID0gdGhpcy5jb25maWcucGxhdGZvcm1zLnNsaWNlKCk7XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSB0YXJnZXRzLmluZGV4T2YoXCJpb3NcIik7XG4gICAgICAgIGlmICgwIDw9IGluZGV4ICYmIFwiZGFyd2luXCIgIT09IHByb2Nlc3MucGxhdGZvcm0pIHtcbiAgICAgICAgICAgIHRoaXMud2FybihcIm1vYmlsZS5jcmVhdGUuY29yZG92YS5pT1NXYXJuaW5nXCIpO1xuICAgICAgICAgICAgdGFyZ2V0cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgaWYgKHRhcmdldHMubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByb2dyZXNzKFwibW9iaWxlLmNyZWF0ZS5jb3Jkb3ZhLmFkZFBsYXRmb3Jtc1wiKTtcblxuICAgICAgICAvLyBgJCBjb3Jkb3ZhIHBsYXRmb3JtIGFkZCBhbmRyb2lkIGlvc2BcbiAgICAgICAgYXdhaXQgZXhlY0NvbW1hbmQoXCJjb3Jkb3ZhXCIsIFtcInBsYXRmb3JtXCIsIFwiYWRkXCJdLmNvbmNhdCh0YXJnZXRzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcGx1Z2luIOi/veWKoFxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgYWRkQ29yZG92YVBsdWdpbnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MoXCJtb2JpbGUuY3JlYXRlLmNvcmRvdmEuYWRkUGx1Z2luc1wiKTtcbiAgICAgICAgZGVidWcoXCJhZGRDb3Jkb3ZhUGx1Z2luc1wiKTtcblxuICAgICAgICAvKlxuICAgICAgICAgKiBJL0Yg44Gv6KSH5pWw44Gu44OX44Op44Kw44Kk44Oz44KS5LiA5ous44Gn6L+95Yqg44GZ44KL44GT44Go44GM5Y+v6IO944Gg44GM44CBXG4gICAgICAgICAqIGNvcmRvdmEgdmVyc2lvbiDjgpLliKTlrprjgZfjgabjgYTjgovjg5fjg6njgrDjgqTjg7Pjga/oqqTliKTlrprjgZnjgovjgZPjgajjgYzjgYLjgovjgZ/jgoHjgIFcbiAgICAgICAgICogMeOBpOOBmuOBpOi/veWKoOOBmeOCi1xuICAgICAgICAgKlxuICAgICAgICAgKiDku6XkuIvjga7kuI3lhbflkIjjgavpoZ7kvLzjgZnjgovnj77osaFcbiAgICAgICAgICogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQi0xMjY2M1xuICAgICAgICAgKi9cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG4gPSB0aGlzLmNvbmZpZy5jb3Jkb3ZhX3BsdWdpbi5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIC8vIGAkIGNvcmRvdmEgcGx1Z2luIGFkZCBjb3Jkb3ZhLXBsdWdpbi1pbmFwcGJyb3dzZXJgXG4gICAgICAgICAgICBhd2FpdCBleGVjQ29tbWFuZChcImNvcmRvdmFcIiwgW1wicGx1Z2luXCIsIFwiYWRkXCIsIHRoaXMuY29uZmlnLmNvcmRvdmFfcGx1Z2luW2ldLm5hbWVdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGNvcmRvdmEgcHJvamVjdCDjgavov73liqDjgZnjgovjg6rjgr3jg7zjgrnjgpLjgrPjg5Tjg7xcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGFkZENvcmRvdmFFeHRlbnRpb25GaWxlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5wcm9ncmVzcyhcIm1vYmlsZS5jcmVhdGUuY29yZG92YS5hZGRFeHRlbnNpb25zXCIpO1xuICAgICAgICBkZWJ1ZyhcImFkZENvcmRvdmFFeHRlbnRpb25GaWxlc1wiKTtcbiAgICAgICAgdGhpcy5jb3B5VHBsRGlyKFwibW9iaWxlL2NvcmRvdmFcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY29yZG92YSDjgYznlJ/miJDjgZfjgZ8gcGFja2FnZS5qc29uIOOCkuOCreODo+ODg+OCt+ODpVxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgY2FjaGVDb3Jkb3ZhUGFja2FnZUpTT04oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKFwiLi9wYWNrYWdlLmpzb25cIikpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmNvcmRvdmFQYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKFwiLi9wYWNrYWdlLmpzb25cIikudG9TdHJpbmcoKSk7XG5cbiAgICAgICAgICAgIC8vIHJlbW92ZSBjb3Jkb3ZhIHRlYW0gaW5mb3JtYXRpb25cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbmZpZy5jb3Jkb3ZhUGFja2FnZUpzb24ubmFtZTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbmZpZy5jb3Jkb3ZhUGFja2FnZUpzb24udmVyc2lvbjtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbmZpZy5jb3Jkb3ZhUGFja2FnZUpzb24uZGlzcGxheU5hbWU7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jb25maWcuY29yZG92YVBhY2thZ2VKc29uLm1haW47XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jb25maWcuY29yZG92YVBhY2thZ2VKc29uLnNjcmlwdHM7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jb25maWcuY29yZG92YVBhY2thZ2VKc29uLmF1dGhvcjtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbmZpZy5jb3Jkb3ZhUGFja2FnZUpzb24uZGVzY3JpcHRpb247XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jb25maWcuY29yZG92YVBhY2thZ2VKc29uLmxpY2Vuc2U7XG5cbiAgICAgICAgICAgIC8vIOODleOCoeOCpOODq+OBr+OBhOOBo+OBn+OCk+WJiumZpFxuICAgICAgICAgICAgZnMucmVtb3ZlU3luYyhcIi4vcGFja2FnZS5qc29uXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLy9cblxuICAgIC8qKlxuICAgICAqIOODh+OCo+ODrOOCr+ODiOODquani+aIkOaDheWgseOBruOCs+ODlOODvFxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlRGlyZWN0b3J5U3RydWN0dXJlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb2dyZXNzKFwibW9iaWxlLmNyZWF0ZS5hcHAuY3JlYXRlRGlyZWN0b3J5U3RydWN0dXJlXCIpO1xuICAgICAgICBkZWJ1ZyhcImNyZWF0ZURpcmVjdG9yeVN0cnVjdHVyZVwiKTtcblxuICAgICAgICAvLyBhcHAgYmFzZSBzdHJ1Y3R1cmVcbiAgICAgICAgdGhpcy5jb3B5VHBsRGlyKFwibW9iaWxlL3N0cnVjdHVyZS9iYXNlXCIpO1xuXG4gICAgICAgIC8vIGxpYlxuICAgICAgICBpZiAodGhpcy5oYXNTdHJ1Y3R1cmVPZihcImxpYlwiKSkge1xuICAgICAgICAgICAgdGhpcy5jb3B5VHBsRGlyKFxuICAgICAgICAgICAgICAgIFwibW9iaWxlL3N0cnVjdHVyZS9saWJcIixcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcubGliKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBvcnRpbmdcbiAgICAgICAgaWYgKHRoaXMuaGFzU3RydWN0dXJlT2YoXCJwb3J0aW5nXCIpKSB7XG4gICAgICAgICAgICB0aGlzLmNvcHlUcGxEaXIoXG4gICAgICAgICAgICAgICAgXCJtb2JpbGUvc3RydWN0dXJlL3BvcnRpbmdcIixcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcucG9ydGluZylcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIGNyZWF0ZTogZGV2L3BvcnRpbmcvQHR5cGVzXG4gICAgICAgICAgICBmcy5jb3B5U3luYyhcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhdGgoXCJiYXNlLy5naXRrZWVwXCIpLFxuICAgICAgICAgICAgICAgIHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290RGlyLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcucG9ydGluZyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnR5cGVzLFxuICAgICAgICAgICAgICAgICAgICBcIi5naXRrZWVwXCJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBQTEFURk9STVNfUk9PVCA9IHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwicGxhdGZvcm1zXCIpO1xuICAgICAgICAgICAgZnMucmVhZGRpclN5bmMoUExBVEZPUk1TX1JPT1QpXG4gICAgICAgICAgICAgICAgLmZvckVhY2goKHBsYXRmb3JtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcy5zdGF0U3luYyhwYXRoLmpvaW4oUExBVEZPUk1TX1JPT1QsIHBsYXRmb3JtKSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3B5VHBsRGlyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibW9iaWxlL3N0cnVjdHVyZS9wb3J0aW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKFBMQVRGT1JNU19ST09ULCBwbGF0Zm9ybSwgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnBvcnRpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3d3dcbiAgICAgICAgY29uc3QgV1dXID0gcGF0aC5qb2luKHRoaXMucm9vdERpciwgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnBrZyk7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhXV1cpKSB7XG4gICAgICAgICAgICBmcy5ta2RpcihXV1cpO1xuICAgICAgICB9XG4gICAgICAgIGZzLmNvcHlTeW5jKHRlbXBsYXRlUGF0aChcImJhc2UvLmdpdGtlZXBcIiksIHBhdGguam9pbihXV1csIFwiLmdpdGtlZXBcIikpO1xuXG4gICAgICAgIC8vIHRhc2tcbiAgICAgICAgZ2xvYi5zeW5jKFwiKiovKlwiLCB7XG4gICAgICAgICAgICBjd2Q6IHRlbXBsYXRlUGF0aChcIm1vYmlsZS90YXNrXCIpLFxuICAgICAgICB9KS5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgICBmcy5jb3B5U3luYyhcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibW9iaWxlL3Rhc2tcIiksIGZpbGUpLFxuICAgICAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50YXNrLCBmaWxlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OX44Ot44K444Kn44Kv44OI6Kit5a6a44OV44Kh44Kk44Or44Gu5L2c5oiQXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVQcm9qZWN0U2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MoXCJtb2JpbGUuY3JlYXRlLmFwcC5jcmVhdGVQcm9qZWN0U2V0dGluZ3NcIik7XG4gICAgICAgIGRlYnVnKFwiY3JlYXRlUHJvamVjdFNldHRpbmdzXCIpO1xuXG4gICAgICAgIC8vIHByb2plY3QuY29uZmlnLmpzXG4gICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibW9iaWxlXCIpLCBcIl9wcm9qZWN0LmNvbmZpZy5qc1wiKSxcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwicHJvamVjdC5jb25maWcuanNcIiksXG4gICAgICAgICAgICAkLmV4dGVuZCh7fSwgdGhpcy5fY29uZmlnLCB7XG4gICAgICAgICAgICAgICAgaG9nYW46IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJob2dhbi5qc1wiKSxcbiAgICAgICAgICAgICAgICBoYW1tZXJqczogdGhpcy5pc0luc3RhbGxhdGlvblRhcmdldChcImhhbW1lcmpzXCIpLFxuICAgICAgICAgICAgICAgIGlzY3JvbGw6IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJpc2Nyb2xsXCIpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiB9XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gdHNjb25maWdcbiAgICAgICAgLy8gdHNjb25maWcuYmFzZS5qc29uXG4gICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibW9iaWxlXCIpLCBcIl90c2NvbmZpZy5iYXNlLmpzb25cIiksXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcInRzY29uZmlnLmJhc2UuanNvblwiKSxcbiAgICAgICAgICAgIHRoaXMucXVlcnlUc0NvbmZpZ0Jhc2VQYXJhbSgpLFxuICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIsIGJvbTogZmFsc2UsIH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBtYWluIHRzY29uZmlnLmpzb25cbiAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJtb2JpbGVcIiksIFwiX3RzY29uZmlnLmpzb25cIiksXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcInRzY29uZmlnLmpzb25cIiksXG4gICAgICAgICAgICB0aGlzLl9jb25maWcsXG4gICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIGVzbGludHJjLmpzb25cbiAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJtb2JpbGVcIiksIFwiX2VzbGludHJjLmpzb25cIiksXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnRlc3QsIFwiZXNsaW50XCIsIFwiZXNsaW50cmMuanNvblwiKSxcbiAgICAgICAgICAgIHRoaXMucXVlcnlFc0xpbnRFbnZQYXJhbSgpLFxuICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIsIGJvbTogZmFsc2UsIH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyB0ZXN0ZW1cbiAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJtb2JpbGUvdG9vbHMvdGVzdGVtXCIpLCBcIl90ZXN0ZW0uanNvblwiKSxcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcudGVzdCwgXCJydW5uZXJcIiwgXCJ0ZXN0ZW0uanNvblwiKSxcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiLCBib206IGZhbHNlLCB9XG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgdGVzdGVtU3R1ZmZQYXRoID0gdGVtcGxhdGVQYXRoKFwibW9iaWxlL3Rvb2xzL3Rlc3RlbS9ydW5uZXJcIik7XG5cbiAgICAgICAgZ2xvYi5zeW5jKFwiKipcIiwge1xuICAgICAgICAgICAgY3dkOiB0ZXN0ZW1TdHVmZlBhdGgsXG4gICAgICAgICAgICBub2RpcjogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgZnMuY29weVN5bmMoXG4gICAgICAgICAgICAgICAgICAgIHBhdGguam9pbih0ZXN0ZW1TdHVmZlBhdGgsIGZpbGUpLFxuICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnRlc3QsIFwicnVubmVyXCIsIGZpbGUpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIC5naXRpZ25vcmVcbiAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJtb2JpbGVcIiksIFwiX2dpdGlnbm9yZVwiKSxcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwiLmdpdGlnbm9yZVwiKSxcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcbiAgICAgICAgICAgIHsgYm9tOiBmYWxzZSwgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFJFQURNRS5tZFxuICAgICAgICBjb3B5VHBsKFxuICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZVwiKSwgXCJfUkVBRE1FLm1kXCIpLFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJSRUFETUUubWRcIiksXG4gICAgICAgICAgICAkLmV4dGVuZCh7fSwgdGhpcy5fY29uZmlnLCB7XG4gICAgICAgICAgICAgICAgY29yZG92YTogdGhpcy5pc0VuYWJsZUNvcmRvdmEoKSxcbiAgICAgICAgICAgICAgICBsaWI6IHRoaXMuaGFzU3RydWN0dXJlT2YoXCJsaWJcIiksXG4gICAgICAgICAgICAgICAgcG9ydGluZzogdGhpcy5oYXNTdHJ1Y3R1cmVPZihcInBvcnRpbmdcIiksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiIH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBUT0RPOiB0ZW1wbGF0ZXMvbW9iaWxlL2FkZG9uIOOBi+OCieOCs+ODlOODvOOBmeOCi+WgtOWQiOOBr+OBk+OBk+OBp+WvvuW/nFxuXG4gICAgICAgIC8vIHBhY2thZ2UuanNvblxuICAgICAgICBjb25zdCByZXNvbHZlZENvbmZpZyA9ICQuZXh0ZW5kKHRydWUsIHt9LCB0aGlzLmNvbmZpZyk7XG4gICAgICAgIHJlc29sdmVkQ29uZmlnLmRlcGVuZGVuY2llcyA9IGF3YWl0IHRoaXMucXVlcnlEZXBlbmRlbmNpZXNQYXJhbSh0aGlzLmRlZmF1bHREZXBlbmRlbmNpZXMpO1xuICAgICAgICByZXNvbHZlZENvbmZpZy5kZXZEZXBlbmRlbmNpZXMgPSBhd2FpdCB0aGlzLnF1ZXJ5RGVwZW5kZW5jaWVzUGFyYW0odGhpcy5kZWZhdWx0RGV2RGVwZW5kZW5jaWVzKTtcbiAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJtb2JpbGVcIiksIFwiX3BhY2thZ2UuanNvblwiKSxcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwicGFja2FnZS5qc29uXCIpLFxuICAgICAgICAgICAgcmVzb2x2ZWRDb25maWcsXG4gICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIGNvcmRvdmFQYWNrYWdlSlNPTiDjgajjg57jg7zjgrhcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmNvcmRvdmFQYWNrYWdlSnNvbikge1xuICAgICAgICAgICAgY29uc3QgUEtHX1BBVEggPSBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcInBhY2thZ2UuanNvblwiKTtcbiAgICAgICAgICAgIGNvbnN0IHBrZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKFBLR19QQVRIKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICQuZXh0ZW5kKHRydWUsIHBrZywgdGhpcy5jb25maWcuY29yZG92YVBhY2thZ2VKc29uKTtcblxuICAgICAgICAgICAgY29uc3Qgc29ydEtleXMgPSAodGFyZ2V0OiBvYmplY3QpOiBvYmplY3QgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRlZCA9IHt9O1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRhcmdldCkuc29ydCgpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzb3J0ZWRba2V5XSA9IHRhcmdldFtrZXldO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBzb3J0ZWQ7XG5cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBwa2cuZGVwZW5kZW5jaWVzICAgID0gc29ydEtleXMocGtnLmRlcGVuZGVuY2llcyk7XG4gICAgICAgICAgICBwa2cuZGV2RGVwZW5kZW5jaWVzID0gc29ydEtleXMocGtnLmRldkRlcGVuZGVuY2llcyk7XG5cbiAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoUEtHX1BBVEgsIEpTT04uc3RyaW5naWZ5KHBrZywgbnVsbCwgMikpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44K944O844K544Gu6Zub5b2i5L2c5oiQXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVTb3VyY2VUZW1wbGF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5wcm9ncmVzcyhcIm1vYmlsZS5jcmVhdGUuYXBwLmNyZWF0ZVNvdXJjZVRlbXBsYXRlXCIpO1xuICAgICAgICBkZWJ1ZyhcImNyZWF0ZVNvdXJjZVRlbXBsYXRlXCIpO1xuXG4gICAgICAgIC8vIGNvcHkgc291cmNlc1xuICAgICAgICB0aGlzLmNvcHlUcGxEaXIoXG4gICAgICAgICAgICBcIm1vYmlsZS9zcmMvc3RydWN0dXJlXCIsXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyKVxuICAgICAgICApO1xuXG4gICAgICAgIHsgLy8gY29uZmlnLnRzXG4gICAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsID0gKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWcuZGVwZW5kZW5jaWVzLmxlbmd0aCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtID0ge1xuICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0OiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RXaXRoQ3VzdG9tTmFtZTogW10sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldHMgPSBbLi4udGhpcy5jb25maWcuZGVwZW5kZW5jaWVzLCAuLi50aGlzLmNvbmZpZy5yZXNvdXJjZV9hZGRvbl07XG4gICAgICAgICAgICAgICAgdGFyZ2V0cy5mb3JFYWNoKChpbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLmZpbGVOYW1lIHx8IGluZm8udmVuZGVyTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uYWRkaXRpb25hbC5saXN0V2l0aEN1c3RvbU5hbWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZTogaW5mby5hbGlhcyB8fCBpbmZvLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZGVyTmFtZTogaW5mby52ZW5kZXJOYW1lIHx8IGluZm8uYWxpYXMgfHwgaW5mby5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBpbmZvLmZpbGVOYW1lIHx8IGluZm8uYWxpYXMgfHwgaW5mby5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5hZGRpdGlvbmFsLmxpc3QucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZTogaW5mby5hbGlhcyB8fCBpbmZvLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgICAgIH0pKCk7XG5cbiAgICAgICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZS9zcmNcIiksIFwiX2NvbmZpZy50c1wiKSxcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjQ29uZmlnLnNjcmlwdCwgXCJjb25maWcudHNcIiksXG4gICAgICAgICAgICAgICAgJC5leHRlbmQoe30sIHRoaXMuX2NvbmZpZywgYWRkaXRpb25hbCksXG4gICAgICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHsgLy8gYXBwLnRzXG4gICAgICAgICAgICBjb25zdCBnbG9iYWxzID0gKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWcuZGVwZW5kZW5jaWVzLmxlbmd0aCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtID0ge1xuICAgICAgICAgICAgICAgICAgICBnbG9iYWxzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRzTGlzdDogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzTGlzdDogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNFeHBvcnRzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0cyA9IFsuLi50aGlzLmNvbmZpZy5kZXBlbmRlbmNpZXMsIC4uLnRoaXMuY29uZmlnLnJlc291cmNlX2FkZG9uXTtcbiAgICAgICAgICAgICAgICB0YXJnZXRzLmZvckVhY2goKGluZm8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uZ2xvYmFsRXhwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5nbG9iYWxzLmV4cG9ydHNMaXN0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbEV4cG9ydDogaW5mby5nbG9iYWxFeHBvcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZTogaW5mby5hbGlhcyB8fCBpbmZvLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmdsb2JhbHMuaW1wb3J0c0xpc3QucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZTogaW5mby5hbGlhcyB8fCBpbmZvLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHBhcmFtLmdsb2JhbHMuaGFzRXhwb3J0cyA9ICgwIDwgcGFyYW0uZ2xvYmFscy5leHBvcnRzTGlzdC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgICAgIH0pKCk7XG5cbiAgICAgICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZS9zcmNcIiksIFwiX2FwcC50c1wiKSxcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjQ29uZmlnLnNjcmlwdCwgXCJhcHAudHNcIiksXG4gICAgICAgICAgICAgICAgZ2xvYmFscyxcbiAgICAgICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgey8vIGxvY2FsaXplIHJlc291cmNlc1xuICAgICAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibW9iaWxlL3NyYy9fbG9jYWxlc1wiKSwgXCJfbWVzc2FnZXMuZW4tVVMuanNvblwiKSxcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdERpcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnJlcyxcbiAgICAgICAgICAgICAgICAgICAgXCJsb2NhbGVzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwibWVzc2FnZXMuZW4tVVMuanNvblwiXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZyxcbiAgICAgICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZS9zcmMvX2xvY2FsZXNcIiksIFwiX21lc3NhZ2VzLmphLUpQLmpzb25cIiksXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3REaXIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5yZXMsXG4gICAgICAgICAgICAgICAgICAgIFwibG9jYWxlc1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzLmphLUpQLmpzb25cIlxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcsXG4gICAgICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIsIGJvbTogZmFsc2UsIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyByZW1vdmUgLmdpdGtlZXBcbiAgICAgICAgICAgIGZzLnVubGlua1N5bmMocGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIHRoaXMucm9vdERpcixcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjLFxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5yZXMsXG4gICAgICAgICAgICAgICAgXCIuZ2l0a2VlcFwiXG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHsvLyBwYXRjaC5kZXBlbmRlbmNpZXNcbiAgICAgICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZS9zcmMvX3BhdGNoLmRlcGVuZGVuY2llc1wiKSwgXCJfaW5kZXguZC50c1wiKSxcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdERpcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLmV4dGVybmFsLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcudHlwZXMsXG4gICAgICAgICAgICAgICAgICAgIFwicGF0Y2guZGVwZW5kZW5jaWVzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiaW5kZXguZC50c1wiXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGhhbW1lcmpzOiB0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaGFtbWVyanNcIiksXG4gICAgICAgICAgICAgICAgICAgIGZsaXBzbmFwOiB0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiZmxpcHNuYXBcIiksXG4gICAgICAgICAgICAgICAgICAgIGlzY3JvbGw6IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJpc2Nyb2xsXCIpLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIGNvcHkgcGF0Y2ggZC50c1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJoYW1tZXJqc1wiKSkge1xuICAgICAgICAgICAgICAgIGZzLmNvcHlTeW5jKHRlbXBsYXRlUGF0aChcIm1vYmlsZS9zcmMvX3BhdGNoLmRlcGVuZGVuY2llcy9qcXVlcnkuaGFtbWVyLmQudHNcIiksXG4gICAgICAgICAgICAgICAgICAgIHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdERpcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuZXh0ZXJuYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcudHlwZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInBhdGNoLmRlcGVuZGVuY2llc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJqcXVlcnkuaGFtbWVyLmQudHNcIlxuICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiZmxpcHNuYXBcIikpIHtcbiAgICAgICAgICAgICAgICBmcy5jb3B5U3luYyh0ZW1wbGF0ZVBhdGgoXCJtb2JpbGUvc3JjL19wYXRjaC5kZXBlbmRlbmNpZXMvZmxpcHNuYXAuZC50c1wiKSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290RGlyLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5leHRlcm5hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50eXBlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicGF0Y2guZGVwZW5kZW5jaWVzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZsaXBzbmFwLmQudHNcIlxuICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaXNjcm9sbFwiKSkge1xuICAgICAgICAgICAgICAgIGZzLmNvcHlTeW5jKHRlbXBsYXRlUGF0aChcIm1vYmlsZS9zcmMvX3BhdGNoLmRlcGVuZGVuY2llcy9pc2Nyb2xsLmQudHNcIiksXG4gICAgICAgICAgICAgICAgICAgIHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdERpcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuZXh0ZXJuYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcudHlwZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInBhdGNoLmRlcGVuZGVuY2llc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJpc2Nyb2xsLmQudHNcIlxuICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcmVtb3ZlIC5naXRrZWVwXG4gICAgICAgICAgICBmcy51bmxpbmtTeW5jKHBhdGguam9pbihcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3REaXIsXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYyxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuZXh0ZXJuYWwsXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnR5cGVzLFxuICAgICAgICAgICAgICAgIFwiLmdpdGtlZXBcIlxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cblxuICAgICAgICB7Ly8gaW5kZXguaHRtbFxuICAgICAgICAgICAgY29weVRwbChcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibW9iaWxlL3NyY1wiKSwgXCJfaW5kZXguaHRtbFwiKSxcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjLCBcImluZGV4Lmh0bWxcIiksXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWdcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWaXN1YWwgU3R1ZGlvIOOBruOCveODquODpeODvOOCt+ODp+ODs+ODleOCoeOCpOODq+S9nOaIkFxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlVmlzdWFsU3R1ZGlvU29sdXRpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHZzUGFyYW0gPSAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFyYW06IElWaXN1YWxTdHVkaW9Db25maWdyYXRpb24gPSA8YW55PiQuZXh0ZW5kKHt9LCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnKTtcblxuICAgICAgICAgICAgcGFyYW0ucHJvamVjdE5hbWUgPSB0aGlzLl9jb25maWcucHJvamVjdE5hbWU7XG4gICAgICAgICAgICBwYXJhbS5wcm9qZWN0R1VJRCA9IGNyZWF0ZUdVSUQoKTtcbiAgICAgICAgICAgIHBhcmFtLnR5cGVzID0gcGFyYW0udHlwZXMucmVwbGFjZShcIkBcIiwgXCIlNDBcIik7IC8vIGVzY2FwZSBcIkBcIiB0byBcIiU0MFwiXG4gICAgICAgICAgICBwYXJhbS5saWNlbnNlID0gIXRoaXMuX2NvbmZpZy5wcml2YXRlO1xuXG4gICAgICAgICAgICAvLyBleHRlcm5hbFxuICAgICAgICAgICAgKDxhbnk+cGFyYW0pLmNvcmRvdmEgICAgPSB0aGlzLmlzRW5hYmxlQ29yZG92YSgpO1xuICAgICAgICAgICAgKDxhbnk+cGFyYW0pLmhvZ2FuICAgICAgPSB0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaG9nYW4uanNcIik7XG4gICAgICAgICAgICAoPGFueT5wYXJhbSkuaGFtbWVyanMgICA9IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJoYW1tZXJqc1wiKTtcbiAgICAgICAgICAgICg8YW55PnBhcmFtKS5pc2Nyb2xsICAgID0gdGhpcy5pc0luc3RhbGxhdGlvblRhcmdldChcImlzY3JvbGxcIik7XG4gICAgICAgICAgICAoPGFueT5wYXJhbSkuZmxpcHNuYXAgICA9IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJmbGlwc25hcFwiKTtcblxuICAgICAgICAgICAgLy8gcHJvamVjdCBzdHJ1Y3R1cmVcbiAgICAgICAgICAgICg8YW55PnBhcmFtKS5lbmFibGVMaWIgICAgICA9IHRoaXMuaGFzU3RydWN0dXJlT2YoXCJsaWJcIik7XG4gICAgICAgICAgICAoPGFueT5wYXJhbSkuZW5hYmxlUG9ydGluZyAgPSB0aGlzLmhhc1N0cnVjdHVyZU9mKFwicG9ydGluZ1wiKTtcblxuICAgICAgICAgICAgLy8gcGxhdGZvcm1zXG4gICAgICAgICAgICAoPGFueT5wYXJhbSkucGxhdGZvcm1zID0gWy4uLnRoaXMuY29uZmlnLnBsYXRmb3Jtc107XG5cbiAgICAgICAgICAgIC8vIHNldHVwIGJ1aWx0IHRzIGdyb3VwXG4gICAgICAgICAgICBwYXJhbS50c0dyb3VwID0gW107XG4gICAgICAgICAgICBnbG9iLnN5bmMoXCIqKi8qLnRzXCIsIHtcbiAgICAgICAgICAgICAgICBjd2Q6IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290RGlyLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbS5zcmMsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtLnNyY0NvbmZpZy5zY3JpcHRcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSkuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgICAgcGFyYW0uc3JjLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbS5zcmNDb25maWcuc2NyaXB0LFxuICAgICAgICAgICAgICAgICAgICBwYXRoLmRpcm5hbWUoZmlsZSlcbiAgICAgICAgICAgICAgICApLnJlcGxhY2UoL1xcLy9nLCBcIlxcXFxcIikgKyBcIlxcXFxcIjtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZSwgXCIudHNcIik7XG4gICAgICAgICAgICAgICAgcGFyYW0udHNHcm91cC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVQYXRoOiByZWxhdGl2ZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1hcDogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIHNldHVwIHRlc3QgdHMgZ3JvdXBcbiAgICAgICAgICAgIGdsb2Iuc3luYyhcIioqLyoudHNcIiwge1xuICAgICAgICAgICAgICAgIGN3ZDogcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3REaXIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50ZXN0LFxuICAgICAgICAgICAgICAgICAgICBcInVuaXRcIlxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9KS5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGFyYW0udGVzdCArIFwiXFxcXHVuaXRcXFxcXCI7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGUsIFwiLnRzXCIpO1xuICAgICAgICAgICAgICAgIHBhcmFtLnRzR3JvdXAucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlUGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGRlcGVuZGVlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBtYXA6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgLy8gLnNsblxuICAgICAgICBjb3B5VHBsKFxuICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcImJhc2UvdmlzdWFsLnN0dWRpb1wiKSwgXCJfc29sdXRpb24uc2xuLnRwbFwiKSxcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIHZzUGFyYW0ucHJvamVjdE5hbWUgKyBcIi5zbG5cIiksXG4gICAgICAgICAgICB2c1BhcmFtLFxuICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIC5jc3Byb2pcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRvWG1sU3RyaW5nID0gKGZpbGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGVvbDogb3MuRU9MLFxuICAgICAgICAgICAgICAgICAgICBib206IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGRlbGltaXRlcnM6IFwie3sgfX1cIixcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IGpzdCA9IGhvZ2FuLmNvbXBpbGUobm9ybWFsaXplVGV4dChmcy5yZWFkRmlsZVN5bmMoZmlsZSkudG9TdHJpbmcoKSwgeyBlb2w6IFwiXFxuXCIsIGJvbTogZmFsc2UgfSksIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBqc3QucmVuZGVyKHZzUGFyYW0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgdG9YbWxET00gPSAoZmlsZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICQoJC5wYXJzZVhNTCh0b1htbFN0cmluZyhmaWxlKSkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgdG9YbWxOb2RlID0gKGZpbGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdHIyWG1sTm9kZSh0b1htbFN0cmluZyhmaWxlKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCAkcHJvaiA9IHRvWG1sRE9NKHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJtb2JpbGUvdmlzdWFsLnN0dWRpb1wiKSwgXCJfcHJvamVjdC5jc3Byb2oudHBsXCIpKTtcbiAgICAgICAgICAgIGNvbnN0ICRncFRTID0gdG9YbWxOb2RlKHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJiYXNlL3Zpc3VhbC5zdHVkaW9cIiksIFwiX3RzLml0ZW0uZ3JvdXAudHBsXCIpKTtcblxuICAgICAgICAgICAgJHByb2pcbiAgICAgICAgICAgICAgICAuZmluZChcIkl0ZW1Hcm91cFwiKVxuICAgICAgICAgICAgICAgIC5sYXN0KClcbiAgICAgICAgICAgICAgICAuYWZ0ZXIoJGdwVFMpXG4gICAgICAgICAgICAgICAgO1xuXG4gICAgICAgICAgICBjb25zdCBkc3RQYXRoID0gcGF0aC5qb2luKHRoaXMucm9vdERpciwgdnNQYXJhbS5wcm9qZWN0TmFtZSArIFwiLmNzcHJvalwiKTtcbiAgICAgICAgICAgIGRlYnVnKHhtbE5vZGUyU3RyKCRwcm9qKSk7XG4gICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRzdFBhdGgsIGZvcm1hdFhNTCh4bWxOb2RlMlN0cigkcHJvaikpKTtcbiAgICAgICAgfSkoKTtcblxuICAgICAgICAvLyB3ZWIuY29uZmlnXG4gICAgICAgIGZzLmNvcHlTeW5jKHRlbXBsYXRlUGF0aChcIm1vYmlsZS92aXN1YWwuc3R1ZGlvL193ZWIuY29uZmlnXCIpLCBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcIndlYi5jb25maWdcIikpO1xuICAgICAgICBmcy5jb3B5U3luYyh0ZW1wbGF0ZVBhdGgoXCJtb2JpbGUvdmlzdWFsLnN0dWRpby9fd2ViLkRlYnVnLmNvbmZpZ1wiKSwgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJ3ZWIuRGVidWcuY29uZmlnXCIpKTtcbiAgICAgICAgZnMuY29weVN5bmModGVtcGxhdGVQYXRoKFwibW9iaWxlL3Zpc3VhbC5zdHVkaW8vX3dlYi5SZWxlYXNlLmNvbmZpZ1wiKSwgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJ3ZWIuUmVsZWFzZS5jb25maWdcIikpO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi8uLi9zcmMvZ2VuZXJhdG9ycy9tb2JpbGUvZ2VuZXJhdG9yLWNvcmRvdmEudHMiLCJpbXBvcnQgeyBHZW5lcmF0b3JCYXNlLCBJUHJvamVjdENvbmZpZ3JhdGlvbiB9IGZyb20gXCIuLi9iYXNlXCI7XG5pbXBvcnQgeyBHZW5lcmF0b3JFbGVjdHJvbiB9IGZyb20gXCIuL2dlbmVyYXRvci1lbGVjdG9yb25cIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZ2VuZXJhdG9yLWVsZWN0b3JvblwiO1xuXG4vKipcbiAqIGdlbmVyYXRvciDnlJ/miJDplqLmlbBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5ld0dlbmVyYXRvckRlc2t0b3AoY29uZmlnOiBJUHJvamVjdENvbmZpZ3JhdGlvbik6IEdlbmVyYXRvckJhc2Uge1xuICAgIHJldHVybiBuZXcgR2VuZXJhdG9yRWxlY3Ryb24oY29uZmlnKTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi8uLi9zcmMvZ2VuZXJhdG9ycy9kZXNrdG9wL2luZGV4LnRzIiwiLyogdHNsaW50OmRpc2FibGU6bm8tdW51c2VkLXZhcmlhYmxlIG5vLXVudXNlZC12YXJzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG5pbXBvcnQgeyBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbiwgR2VuZXJhdG9yQmFzZSB9IGZyb20gXCIuLi9iYXNlXCI7XG5pbXBvcnQgeyBJRGVza3RvcEFwcENvbmZpZ3JhdGlvbiB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcblxuLyoqXG4gKiBAY2xhc3MgR2VuZXJhdG9yRWxlY3Ryb25cbiAqIEBicmllZiBEZXNrdG9wIEVsZWN0cm9uIOeUqCBHZW5lcmF0b3Ig44Kv44Op44K5XG4gKi9cbmV4cG9ydCBjbGFzcyBHZW5lcmF0b3JFbGVjdHJvbiBleHRlbmRzIEdlbmVyYXRvckJhc2Uge1xuXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBpbXByZW1lbnRlczogR2VuZXJhdG9yQmFzZVxuXG4gICAgLyoqXG4gICAgICog5pei5a6a44GuIGRpcmVjdG9yeSDmp4vpgKDjgpLov5TljbRcbiAgICAgKi9cbiAgICBkZWZhdWx0QmFzZVN0cnVjdHVyZSgpOiBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzcmM6IFwiYXBwXCIsXG4gICAgICAgICAgICBwa2c6IFwid3d3L2FwcFwiLCAvLyBUT0RPOiDmmqvlrppcbiAgICAgICAgICAgIGJ1aWx0OiBcImFwcFwiLFxuICAgICAgICAgICAgZG9jOiBcImRvY3NcIixcbiAgICAgICAgICAgIHRhc2s6IFwidGFza3NcIixcbiAgICAgICAgICAgIHRlc3Q6IFwidGVzdHNcIixcbiAgICAgICAgICAgIHR5cGVzOiBcIkB0eXBlc1wiLFxuICAgICAgICAgICAgc3JjQ29uZmlnOiB7XG4gICAgICAgICAgICAgICAgc2NyaXB0OiBcInNjcmlwdHNcIixcbiAgICAgICAgICAgICAgICBzdHlsZXNoZWV0OiBcInN0eWxlc2hlZXRzXCIsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IFwidGVtcGxhdGVzXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGNyZWF0ZSBhY3Rpb24gZW50cnlcbiAgICAgKiBAcGFyYW0ge0lEZXNrdG9wQXBwQ29uZmlncmF0aW9ufSBjb25maWcg44Kz44Oz44OV44Kj44Kw6Kit5a6aXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBUT0RPOlxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJ1bmRlciBjb25zdHJ1Y3Rpb24uXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOW/heimgeOBqOOBmeOCiyB0YXNrIHNjcmlwdCDkuIDopqfjgpLov5TljbQuIGFjdGlvbjogY3JlYXRlIOOBruOBqOOBjeOBq+WRvOOBsOOCjOOCi1xuICAgICAqL1xuICAgIGdldCB0YXNrTGlzdCgpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBcImJhbm5lci5qc1wiLFxuICAgICAgICAgICAgXCJjbGVhbi5qc1wiLFxuICAgICAgICAgICAgXCJzcmNtYXAuanNcIixcbiAgICAgICAgICAgIFwiYnVpbGQtdHMtY2xlYW4uanNcIixcbiAgICAgICAgICAgIFwiYnVpbGQtdHMtbm9ybWFsaXplLmpzXCIsXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBwcml2YXRlIG1ldGhvZHM6XG5cbiAgICAvKipcbiAgICAgKiBjb25maWdyYXRpb24g44Gr44Ki44Kv44K744K5XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXQgY29uZmlnKCk6IElEZXNrdG9wQXBwQ29uZmlncmF0aW9uIHtcbiAgICAgICAgcmV0dXJuIDxJRGVza3RvcEFwcENvbmZpZ3JhdGlvbj50aGlzLl9jb25maWc7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4uLy4uLy4uL3NyYy9nZW5lcmF0b3JzL2Rlc2t0b3AvZ2VuZXJhdG9yLWVsZWN0b3Jvbi50cyIsImltcG9ydCB7IEdlbmVyYXRvckJhc2UsIElQcm9qZWN0Q29uZmlncmF0aW9uIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IEdlbmVyYXRvckJyb3dzZXIgfSBmcm9tIFwiLi9nZW5lcmF0b3ItYnJvd3NlclwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0b3ItYnJvd3NlclwiO1xuXG4vKipcbiAqIGdlbmVyYXRvciDnlJ/miJDplqLmlbBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5ld0dlbmVyYXRvcldlYihjb25maWc6IElQcm9qZWN0Q29uZmlncmF0aW9uKTogR2VuZXJhdG9yQmFzZSB7XG4gICAgcmV0dXJuIG5ldyBHZW5lcmF0b3JCcm93c2VyKGNvbmZpZyk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vLi4vc3JjL2dlbmVyYXRvcnMvd2ViL2luZGV4LnRzIiwiLyogdHNsaW50OmRpc2FibGU6bm8tdW51c2VkLXZhcmlhYmxlIG5vLXVudXNlZC12YXJzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG5pbXBvcnQgeyBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbiwgR2VuZXJhdG9yQmFzZSB9IGZyb20gXCIuLi9iYXNlXCI7XG5pbXBvcnQgeyBJV2ViQXBwQ29uZmlncmF0aW9uIH0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xuXG4vKipcbiAqIEBjbGFzcyBHZW5lcmF0b3JCcm93c2VyXG4gKiBAYnJpZWYgV2ViIEJyb3dzZXIg55SoIEdlbmVyYXRvciDjgq/jg6njgrlcbiAqL1xuZXhwb3J0IGNsYXNzIEdlbmVyYXRvckJyb3dzZXIgZXh0ZW5kcyBHZW5lcmF0b3JCYXNlIHtcblxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gaW1wcmVtZW50ZXM6IEdlbmVyYXRvckJhc2VcblxuICAgIC8qKlxuICAgICAqIOaXouWumuOBriBkaXJlY3Rvcnkg5qeL6YCg44KS6L+U5Y20XG4gICAgICovXG4gICAgZGVmYXVsdEJhc2VTdHJ1Y3R1cmUoKTogSUJhc2VTdHJ1Y3R1cmVDb25maWdyYXRpb24ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3JjOiBcImFwcFwiLFxuICAgICAgICAgICAgcGtnOiBcInd3d1wiLFxuICAgICAgICAgICAgYnVpbHQ6IFwiYXBwXCIsXG4gICAgICAgICAgICBkb2M6IFwiZG9jc1wiLFxuICAgICAgICAgICAgdGFzazogXCJ0YXNrc1wiLFxuICAgICAgICAgICAgdGVzdDogXCJ0ZXN0c1wiLFxuICAgICAgICAgICAgdHlwZXM6IFwiQHR5cGVzXCIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY3JlYXRlIGFjdGlvbiBlbnRyeVxuICAgICAqIEBwYXJhbSB7SUxpYnJhcnlDb25maWdyYXRpb259IGNvbmZpZyDjgrPjg7Pjg5XjgqPjgrDoqK3lrppcbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFRPRE86XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcInVuZGVyIGNvbnN0cnVjdGlvbi5cIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5b+F6KaB44Go44GZ44KLIHRhc2sgc2NyaXB0IOS4gOimp+OCkui/lOWNtC4gYWN0aW9uOiBjcmVhdGUg44Gu44Go44GN44Gr5ZG844Gw44KM44KLXG4gICAgICovXG4gICAgZ2V0IHRhc2tMaXN0KCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIFwiYmFubmVyLmpzXCIsXG4gICAgICAgICAgICBcImNsZWFuLmpzXCIsXG4gICAgICAgICAgICBcInNyY21hcC5qc1wiLFxuICAgICAgICAgICAgXCJidWlsZC10cy1jbGVhbi5qc1wiLFxuICAgICAgICAgICAgXCJidWlsZC10cy1ub3JtYWxpemUuanNcIixcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIHByaXZhdGUgbWV0aG9kczpcblxuICAgIC8qKlxuICAgICAqIGNvbmZpZ3JhdGlvbiDjgavjgqLjgq/jgrvjgrlcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldCBjb25maWcoKTogSVdlYkFwcENvbmZpZ3JhdGlvbiB7XG4gICAgICAgIHJldHVybiA8SVdlYkFwcENvbmZpZ3JhdGlvbj50aGlzLl9jb25maWc7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4uLy4uLy4uL3NyYy9nZW5lcmF0b3JzL3dlYi9nZW5lcmF0b3ItYnJvd3Nlci50cyIsImltcG9ydCAqIGFzIFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XG5leHBvcnQgeyBVdGlscyB9O1xuXG5pbXBvcnQge1xuICAgIElTb3VyY2VEaXJjdG9yeUNvbmZpZ3JhdGlvbixcbiAgICBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbixcbiAgICBJUHJvamVjdENvbmZpZ3JhdGlvbixcbiAgICBJQnVpbGRUYXJnZXRDb25maWdyYXRpb24sXG4gICAgSUxpYnJhcnlDb25maWdyYXRpb24sXG4gICAgSUV4dGVybmFsTW9kdWxlSW5mbyxcbiAgICBJRXh0ZXJuYWxNb2R1bGVzLFxuICAgIElNb2JpbGVBcHBDb25maWdyYXRpb24sXG4gICAgSURlc2t0b3BBcHBDb25maWdyYXRpb24sXG4gICAgSVdlYkFwcENvbmZpZ3JhdGlvbixcbiAgICAvLy8vXG4gICAgbmV3R2VuZXJhdG9yXG59IGZyb20gXCIuL2dlbmVyYXRvcnNcIjtcblxuZXhwb3J0IHtcbiAgICBJU291cmNlRGlyY3RvcnlDb25maWdyYXRpb24sXG4gICAgSUJhc2VTdHJ1Y3R1cmVDb25maWdyYXRpb24sXG4gICAgSVByb2plY3RDb25maWdyYXRpb24sXG4gICAgSUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uLFxuICAgIElMaWJyYXJ5Q29uZmlncmF0aW9uLFxuICAgIElFeHRlcm5hbE1vZHVsZUluZm8sXG4gICAgSUV4dGVybmFsTW9kdWxlcyxcbiAgICBJTW9iaWxlQXBwQ29uZmlncmF0aW9uLFxuICAgIElEZXNrdG9wQXBwQ29uZmlncmF0aW9uLFxuICAgIElXZWJBcHBDb25maWdyYXRpb24sXG59O1xuXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vL1xuXG4vKipcbiAqIEBjbGFzcyBDRFBMaWJcbiAqIEBicmllZiBDRFAgYm9pbGVycGxhdGUg55Sf5oiQ5qmf6IO944KS5o+Q5L6b44GZ44KL44Kv44Op44K5XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENEUExpYiB7XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIHB1YmljIG1ldGhvZHM6XG5cbiAgICAvKipcbiAgICAgKiBtYWluIGNvbW1hbmRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGV4ZWN1dGUoY29uZmlnOiBJUHJvamVjdENvbmZpZ3JhdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBVdGlscy5zZXRTZXR0aW5ncyhjb25maWcuc2V0dGluZ3MpO1xuICAgICAgICByZXR1cm4gbmV3R2VuZXJhdG9yKGNvbmZpZykucnVuKCk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4uL3NyYy9jZHAtbGliLnRzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnMtZXh0cmFcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcImZzLWV4dHJhXCIsXCJjb21tb25qczJcIjpcImZzLWV4dHJhXCJ9XG4vLyBtb2R1bGUgaWQgPSAxNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJnbG9iXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJnbG9iXCIsXCJjb21tb25qczJcIjpcImdsb2JcIn1cbi8vIG1vZHVsZSBpZCA9IDE3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImhvZ2FuLmpzXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcInJvb3RcIjpcIkhvZ2FuXCIsXCJjb21tb25qc1wiOlwiaG9nYW4uanNcIixcImNvbW1vbmpzMlwiOlwiaG9nYW4uanNcIixcImFtZFwiOlwiaG9nYW4uanNcIn1cbi8vIG1vZHVsZSBpZCA9IDE4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJyb290XCI6XCJfXCIsXCJjb21tb25qc1wiOlwibG9kYXNoXCIsXCJjb21tb25qczJcIjpcImxvZGFzaFwifVxuLy8gbW9kdWxlIGlkID0gMTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidW5kZXJzY29yZS5zdHJpbmdcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wicm9vdFwiOlwiX1wiLFwiY29tbW9uanNcIjpcInVuZGVyc2NvcmUuc3RyaW5nXCIsXCJjb21tb25qczJcIjpcInVuZGVyc2NvcmUuc3RyaW5nXCJ9XG4vLyBtb2R1bGUgaWQgPSAyMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ3aGljaFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qc1wiOlwid2hpY2hcIixcImNvbW1vbmpzMlwiOlwid2hpY2hcIn1cbi8vIG1vZHVsZSBpZCA9IDIxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInV1aWRcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcInV1aWRcIixcImNvbW1vbmpzMlwiOlwidXVpZFwifVxuLy8gbW9kdWxlIGlkID0gMjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2hhbGtcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcImNoYWxrXCIsXCJjb21tb25qczJcIjpcImNoYWxrXCJ9XG4vLyBtb2R1bGUgaWQgPSAyM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJzZW12ZXItcmVnZXhcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcInNlbXZlci1yZWdleFwiLFwiY29tbW9uanMyXCI6XCJzZW12ZXItcmVnZXhcIn1cbi8vIG1vZHVsZSBpZCA9IDI0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsaS1zcGlubmVyXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJjbGktc3Bpbm5lclwiLFwiY29tbW9uanMyXCI6XCJjbGktc3Bpbm5lclwifVxuLy8gbW9kdWxlIGlkID0gMjVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwianNkb21cIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcImpzZG9tXCIsXCJjb21tb25qczJcIjpcImpzZG9tXCJ9XG4vLyBtb2R1bGUgaWQgPSAyNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ4bWxkb21cIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcInhtbGRvbVwiLFwiY29tbW9uanMyXCI6XCJ4bWxkb21cIn1cbi8vIG1vZHVsZSBpZCA9IDI3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImpxdWVyeVwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJyb290XCI6XCJqUXVlcnlcIixcImNvbW1vbmpzXCI6XCJqcXVlcnlcIixcImNvbW1vbmpzMlwiOlwianF1ZXJ5XCIsXCJhbWRcIjpcImpxdWVyeVwifVxuLy8gbW9kdWxlIGlkID0gMjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0ICogYXMgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgeyBzcGF3biwgU3Bhd25PcHRpb25zIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcblxuaW1wb3J0IHtcbiAgICBmcyxcbiAgICBob2dhbixcbiAgICAkLFxuICAgIHdoaWNoLFxuICAgIHV1aWQsXG4gICAgU3Bpbm5lcixcbn0gZnJvbSBcIi4vbGlic1wiO1xuXG5pbXBvcnQge1xuICAgIGFzc2VydCxcbiAgICBnZXRMaWJQYXRoLFxufSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gZXhwb3J0cyBtZXRob2RzOlxuXG4vKipcbiAqIEhhbmRsZSBjb21tYW5kIGxpbmUgZXJyb3IgYW5kIGtpbGwgcHJvY2Vzcy5cbiAqIFdoZW4gdGhlIGFwcGxpY2F0aW9uIHJlY2VpdmVkIGVycm9yIGZyb20gY2xpLCBwbGVhc2UgY2FsbCB0aGlzIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZXJyb3IgIGVycm9yIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXJyb3IoZXJyb3I6IHN0cmluZyk6IHZvaWQge1xuICAgIGFzc2VydChmYWxzZSwgZXJyb3IpO1xufVxuXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vL1xuXG4vKipcbiAqIFwidGVtcGxhdGVzXCIg44OH44Kj44Os44Kv44OI44Oq44GL44KJ44Gu44OR44K544KS5Y+W5b6XLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdGFyZ2V0IOOCv+ODvOOCsuODg+ODiOOCkuaMh+Wumi4gbnVsbCDjga7loLTlkIjjga/jgIF0ZW1wbGF0ZXMg44KS6L+U5Y20XG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRlbXBsYXRlcy9ob2dlaG9nZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGVQYXRoKHRhcmdldDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAobnVsbCA9PSB0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguam9pbihnZXRMaWJQYXRoKCksIFwidGVtcGxhdGVzXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4oZ2V0TGliUGF0aCgpLCBcInRlbXBsYXRlc1wiLCB0YXJnZXQpO1xuICAgIH1cbn1cblxuLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLy9cblxuLyoqXG4gKiBHZXQgc3Bpbm5lciBpbnN0YW5jZS5cbiAqIENMSSBoZWxwZXIuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSAgW2Zvcm1hdF0gIHNwaW5uZXIgZm9ybWF0IHN0cmluZy5cbiAqIEBwYXJhbSAge051bWJlcn0gIFtpbmRleF0gICBzcGlubmVyIGluZGV4IGRlZmluZWQgYnkgY2xpLXNwaW5uZXIuIChkZWZhdWx0OiByYW5kb20gWzAtMjldKVxuICogQHJldHVybiB7U3Bpbm5lcn0gY2xpLXNwaW5uZXIgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGlubmVyKGZvcm1hdD86IHN0cmluZywgaW5kZXg/OiBudW1iZXIpOiB7IHN0YXJ0OiAoKSA9PiB2b2lkOyBzdG9wOiAoY2xlYW4/OiBib29sZWFuKSA9PiB2b2lkOyB9IHtcbiAgICBjb25zdCBzcGlubmVycyA9IFtcbiAgICAgICAgXCJ8Ly1cXFxcXCIsXG4gICAgICAgIFwi4pSk4pSY4pS04pSU4pSc4pSM4pSs4pSQXCIsXG4gICAgICAgIFwi4pei4pej4pek4pelXCIsXG4gICAgICAgIFwi4paM4paA4paQ4paEXCIsXG4gICAgICAgIFwi4paJ4paK4paL4paM4paN4paO4paP4paO4paN4paM4paL4paK4paJXCIsXG4gICAgICAgIFwi4paB4paD4paE4paF4paG4paH4paI4paH4paG4paF4paE4paDXCIsXG4gICAgICAgIFwi4pix4piy4pi0XCIsXG4gICAgICAgIFwiLm9PQCpcIixcbiAgICAgICAgXCLil5Dil5Pil5Hil5JcIixcbiAgICAgICAgLy8vL1xuICAgICAgICBcIuKXoeKXoSDiipniipkg4peg4pegXCIsXG4gICAgICAgIFwi4pag4pah4paq4parXCIsXG4gICAgICAgIFwi4oaQ4oaW4oaR4oaX4oaS4oaY4oaT4oaZXCIsXG4gICAgICAgIFwiLm9PwrBPby5cIixcbiAgICBdO1xuICAgIGNvbnN0IGZtdCA9IGZvcm1hdCB8fCBcIiVzXCI7XG4gICAgY29uc3Qgc3Bpbm5lciA9IG5ldyBTcGlubmVyKGZtdCk7XG4gICAgY29uc3QgaWR4ID0gKG51bGwgIT0gaW5kZXggJiYgMCA8PSBpbmRleCAmJiBpbmRleCA8IDE0KSA/IGluZGV4IDogTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTApO1xuICAgIHNwaW5uZXIuc2V0U3Bpbm5lclN0cmluZyhzcGlubmVyc1tpZHhdKTtcbiAgICByZXR1cm4gc3Bpbm5lcjtcbn1cblxuLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLy9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIE5vcm1hbGl6ZVRleHRPcHRpb25zXG4gKiBAYnJpZWYgbm9ybWFsaXplVGV4dCgpIOOBq+aMh+WumuOBmeOCi+OCquODl+OCt+ODp+ODs1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vcm1hbGl6ZVRleHRPcHRpb25zIHtcbiAgICBlb2w/OiBzdHJpbmc7ICAgLy8gZGVmYXVsdDogb3MuRU9MXG4gICAgYm9tPzogYm9vbGVhbjsgIC8vIGRlZmF1bHQ6IHRydWVcbiAgICB0YWI/OiBudW1iZXI7ICAgLy8gdGFiIOOCkuWkieaPm+OBmeOCi+OCueODmuODvOOCueOBruaVsOOCkuaMh+Wumi4gZGVmYXVsdDog5aSJ5o+b44GX44Gq44GEXG59XG5cbi8qKlxuICogTm9ybWFsaXplIHRleHQgbGluZS1mZWVkLlxuICogZm9yIHdpbmRvd3MgZ2l0IHVzZXIuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgICAgIHRleHQgICAgICBpbnB1dCB0ZXh0LlxuICogQHBhcmFtICB7Tm9ybWFsaXplVGV4dE9wdGlvbnN9IFtvcHRpb25zXSBvcHRpb24uXG4gKiBAcmV0dXJuIHtTdHJpbmd9IG5vcm1hbGl6ZWQgdGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVRleHQodGV4dDogc3RyaW5nLCBvcHRpb25zPzogTm9ybWFsaXplVGV4dE9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IG9wdDogTm9ybWFsaXplVGV4dE9wdGlvbnMgPSAkLmV4dGVuZCh7fSwge1xuICAgICAgICBlb2w6IG9zLkVPTCxcbiAgICAgICAgYm9tOiB0cnVlLFxuICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgdGV4dCA9IHRleHRcbiAgICAgICAgLnJlcGxhY2UoL15cXHVmZWZmL2dtLCBcIlwiKSAgIC8vIHJlbW92ZSBib21cbiAgICAgICAgLnJlcGxhY2UoL1xcclxcbi9nbSwgXCJcXG5cIikgICAgLy8gb25jZSBcIlxcblwiXG4gICAgICAgIC5yZXBsYWNlKC9cXHIvZ20sIFwiXFxuXCIpXG4gICAgO1xuXG4gICAgaWYgKG9wdC5ib20pIHtcbiAgICAgICAgdGV4dCA9IFwiXFx1ZmVmZlwiICsgdGV4dDtcbiAgICB9XG4gICAgaWYgKFwiXFxuXCIgIT09IG9wdC5lb2wpIHtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFxuL2dtLCBvcHQuZW9sKTtcbiAgICB9XG4gICAgaWYgKG9wdC50YWIpIHtcbiAgICAgICAgY29uc3Qgc3BhY2VzID0gKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBzID0gXCJcIjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0LnRhYjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcyArPSBcIiBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICB9KSgpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXHQvZ20sIHNwYWNlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRleHQ7XG59XG5cbi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vXG5cbi8qKlxuICogQGludGVyZmFjZSBFeGVjQ29tbWFuZE9wdGlvbnNcbiAqIEBicmllZiBleGVjQ29tbWFuZCgpIOOBq+aMh+WumuOBmeOCi+OCquODl+OCt+ODp+ODs1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNDb21tYW5kT3B0aW9ucyBleHRlbmRzIFNwYXduT3B0aW9ucyB7XG4gICAgc3Bpbm5lcj86IHtcbiAgICAgICAgZm9ybWF0Pzogc3RyaW5nOyAgICAvLyBleCkgXCIlc1wiXG4gICAgICAgIGluZGV4PzogbnVtYmVyOyAgICAgLy8gMCAtIDkg44Gu5pWw5YCk44KS5oyH5a6aXG4gICAgfTtcbiAgICBzdGRvdXQ/OiAoZGF0YTogc3RyaW5nKSA9PiB2b2lkO1xuICAgIHN0ZGVycj86IChkYXRhOiBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogRXhlY3V0ZSBjb21tYW5kIGxpbmUgYnkgc3Bhd24uXG4gKiBjYWxsIHNwYXduLiBpZiBlcnJvciBvY2N1cmVkLCBjdWkgaXMga2lsbGVkIHByb2NjZXNzLlxuICpcbiAqIEBwYXJhbSAgIHtTdHJpbmd9ICAgICAgICAgICAgICAgY29tbWFuZCAgICBtYWluIGNvbW1hbmQuIGV4KSBcImNvcmRvdmFcIlxuICogQHBhcmFtICAge1N0cmluZ1tdfSAgICAgICAgICAgICBhcmdzICAgICAgIGNvbW1hbmQgYXJncy4gZXgpIFtcInBsdWdpblwiLCBcImFkZFwiLCBwbHVnaW5OYW1lXVxuICogQHBhcmFtICAge0V4ZWNDb21tYW5kT3B0aW9uc30gICBbb3B0aW9uc10gIGNsaS1zcGlubmVyXCJzIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBlcnJvciBjb2RlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjQ29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zPzogRXhlY0NvbW1hbmRPcHRpb25zKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBvcHQ6IEV4ZWNDb21tYW5kT3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCB7XG4gICAgICAgICAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gICAgICAgICAgICBzcGlubmVyOiB7IGZvcm1hdDogXCIlc1wiIH0sXG4gICAgICAgICAgICBzdGRvdXQ6IChkYXRhOiBzdHJpbmcpOiB2b2lkID0+IHsgLyogbm9vcCAqLyB9LFxuICAgICAgICAgICAgc3RkZXJyOiAoZGF0YTogc3RyaW5nKTogdm9pZCA9PiB7IC8qIG5vb3AgKi8gfSxcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gb24gd2luMzIsIGNvbW1hbmQgYW5kIGFyZ3MgbmVlZCB0byBiZSBxdW90ZWQgaWYgY29udGFpbmluZyBzcGFjZXNcbiAgICAgICAgY29uc3QgcXVvdGVJZk5lZWRlZCA9IChzdHI6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgICAgICAgICBpZiAoXCJ3aW4zMlwiID09PSBvcy5wbGF0Zm9ybSgpICYmIHN0ci5pbmNsdWRlcyhcIiBcIikpIHtcbiAgICAgICAgICAgICAgICBzdHIgPSBcIlxcXCJcIiArIHN0ciArIFwiXFxcIlwiO1xuICAgICAgICAgICAgICAgIG9wdC5zaGVsbCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgICB9O1xuXG4gICAgICAgIHdoaWNoKGNvbW1hbmQsIChlcnJvciwgcmVzb2x2ZWRDb21tYW5kKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihKU09OLnN0cmluZ2lmeShlcnJvcikpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzcGlubmVyID0gb3B0LnNwaW5uZXIgPyBnZXRTcGlubmVyKG9wdC5zcGlubmVyLmZvcm1hdCwgb3B0LnNwaW5uZXIuaW5kZXgpIDogbnVsbDtcbiAgICAgICAgICAgIGlmIChzcGlubmVyKSB7XG4gICAgICAgICAgICAgICAgc3Bpbm5lci5zdGFydCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlZENvbW1hbmQgPSBxdW90ZUlmTmVlZGVkKHJlc29sdmVkQ29tbWFuZCk7XG4gICAgICAgICAgICBhcmdzID0gYXJncy5tYXAocXVvdGVJZk5lZWRlZCk7XG4gICAgICAgICAgICBjb25zdCBjaGlsZCA9IHNwYXduKHJlc29sdmVkQ29tbWFuZCwgYXJncywgb3B0KVxuICAgICAgICAgICAgICAgIC5vbihcImVycm9yXCIsIGhhbmRsZUVycm9yKVxuICAgICAgICAgICAgICAgIC5vbihcImNsb3NlXCIsIChjb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGlubmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGlubmVyLnN0b3AodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjb2RlKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKFwicGlwZVwiID09PSBvcHQuc3RkaW8pIHtcbiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oXCJkYXRhXCIsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG9wdC5zdGRvdXQoZGF0YS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oXCJkYXRhXCIsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG9wdC5zdGRlcnIoZGF0YS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vXG5cbi8qKlxuICogQGludGVyZmFjZSBDb3B5VGVtcGxhdGVPcHRpb25zXG4gKiBAYnJpZWYgY29weVRwbCgpIOOBq+aMh+WumuOBmeOCi+OCquODl+OCt+ODp+ODs1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcHlUZW1wbGF0ZU9wdGlvbnMgZXh0ZW5kcyBOb3JtYWxpemVUZXh0T3B0aW9ucyB7XG4gICAgZGVsaW1pdGVycz86IFwie3sgfX1cIiB8IFwiPCUgJT5cIjsgLy8gdGVtcGxhdGUg44Gr5L2/55So44GZ44KLIGRlbGltaXRlci4gZGVmYXVsdDogXCJ7eyB9fVwiXG59XG5cbi8qKlxuICogQ29weSB0ZW1wbGF0ZSB3aXRoIGhvZ2FuLlxuICogc3luYyBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSAgICAgICAgICAgICAgIHNyYyAgICAgICBzb3VyY2UgZmlsZSBwYXRoLlxuICogQHBhcmFtIHtTdHJpbmd9ICAgICAgICAgICAgICAgZHN0ICAgICAgIGRlc3RpbmF0aW9uIGZpbGUgcGF0aC5cbiAqIEBwYXJhbSB7T2JqZWN0fSAgICAgICAgICAgICAgIHBhcmFtcyAgICB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLlxuICogQHBhcmFtIHtDb3B5VGVtcGxhdGVPcHRpb25zfSAgW29wdGlvbnNdIG9wdGlvbnMgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weVRwbChzcmM6IHN0cmluZywgZHN0OiBzdHJpbmcsIHBhcmFtczogT2JqZWN0LCBvcHRpb25zPzogQ29weVRlbXBsYXRlT3B0aW9ucyk6IHZvaWQge1xuICAgIGNvbnN0IG9wdCA9ICQuZXh0ZW5kKHt9LCB7XG4gICAgICAgIGVvbDogb3MuRU9MLFxuICAgICAgICBib206IHRydWUsXG4gICAgICAgIGRlbGltaXRlcnM6IFwie3sgfX1cIixcbiAgICB9LCBvcHRpb25zKTtcblxuICAgIGNvbnN0IGpzdCA9IGhvZ2FuLmNvbXBpbGUobm9ybWFsaXplVGV4dChmcy5yZWFkRmlsZVN5bmMoc3JjKS50b1N0cmluZygpLCB7IGVvbDogXCJcXG5cIiwgYm9tOiBmYWxzZSB9KSwgb3B0KTtcbiAgICBjb25zdCBvdXRwdXQgPSBub3JtYWxpemVUZXh0KGpzdC5yZW5kZXIocGFyYW1zKSwgb3B0KTtcblxuICAgIGZzLmVuc3VyZUZpbGVTeW5jKGRzdCk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhkc3QsIG91dHB1dCwgXCJ1dGY4XCIpO1xufVxuXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vL1xuXG4vKipcbiAqIEdVSUQgZ2VuZXJhdGUuXG4gKiByZXR1cm5lZCBhcyBXaW5kb3dzIHJlZ2lzdHJ5IHR5cGUgZm9ybWF0LlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUdVSUQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ7XCIgKyB1dWlkLnY0KCkudG9VcHBlckNhc2UoKSArIFwifVwiO1xufVxuXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vL1xuXG4vKipcbiAqIENyZWF0ZSBYTUwgRE9NIG5vZGUuXG4gKlxuICogQHBhcmFtICAgc3RyICBzdHJpbmcgeG1sIGZvcm1hdC4gZXgpICc8cHJlZmVyZW5jZSBuYW1lPVwiRGlzYWxsb3dPdmVyc2Nyb2xsXCIgdmFsdWU9XCJ0cnVlXCIvPidcbiAqIEByZXR1cm5zIFhNTCBOb2RlIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHIyWG1sTm9kZShzdHI6IHN0cmluZyk6IEpRdWVyeSB7XG4gICAgbGV0IGZ1bGxYTUwgPSB0cnVlO1xuICAgIGlmICghLzw/eG1sL2kudGVzdChzdHIpKSB7XG4gICAgICAgIGZ1bGxYTUwgPSBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgJHhtbCA9ICQoJC5wYXJzZVhNTChzdHIpKTtcbiAgICByZXR1cm4gZnVsbFhNTCA/ICR4bWwgOiAkeG1sLmNoaWxkcmVuKCk7XG59XG5cbi8qKlxuICogQ3JlYXRlIFhNTCBzdHJpbmcgZnJvbSBET00gbm9kZS5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHN0ciAgc3RyaW5nIHhtbCBmb3JtYXQuIGV4KSAnPHByZWZlcmVuY2UgbmFtZT1cIkRpc2FsbG93T3ZlcnNjcm9sbFwiIHZhbHVlPVwidHJ1ZVwiLz4nXG4gKiBAcmV0dXJuIHtqUXVlcnl9IFhNTCBOb2RlIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB4bWxOb2RlMlN0cigkeG1sOiBKUXVlcnkpOiBzdHJpbmcge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgcmV0dXJuIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoJHhtbFswXSk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby11bmRlZiAqL1xufVxuXG4vKipcbiAqIEBpbnRlcmZhY2UgRm9ybWF0WG1sT3B0aW9uc1xuICogQGJyaWVmIGZvcm1hdFhNTCgpIOOBq+aMh+WumuOBmeOCi+OCquODl+OCt+ODp+ODs1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdFhtbE9wdGlvbnMgZXh0ZW5kcyBOb3JtYWxpemVUZXh0T3B0aW9ucyB7XG4gICAgc3RlcD86IG51bWJlcjsgICAvLyDnqbrnmb3jgrnjg5rjg7zjgrnmlbAuIGRlZmF1bHQ6IDJcbn1cblxuLyoqXG4gKiBYTUwgZm9ybWF0dGVyLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIHN0ciAgICAgICBzdHJpbmcgeG1sIGZvcm1hdC4gZXgpICc8cHJlZmVyZW5jZSBuYW1lPVwiRGlzYWxsb3dPdmVyc2Nyb2xsXCIgdmFsdWU9XCJ0cnVlXCIvPidcbiAqIEBwYXJhbSAge0Zvcm1hdFhtbE9wdGlvbnN9IFtvcHRpb25zXSBvcHRpb25zIG9iamVjdC5cbiAqIEByZXR1cm4ge1N0cmluZ30gZm9ybWF0dGVkIFhNTFxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0WE1MKHN0cjogc3RyaW5nLCBvcHRpb25zPzogRm9ybWF0WG1sT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3Qgb3B0OiBGb3JtYXRYbWxPcHRpb25zID0gJC5leHRlbmQoe30sIHtcbiAgICAgICAgZW9sOiBvcy5FT0wsXG4gICAgICAgIGJvbTogdHJ1ZSxcbiAgICAgICAgc3RlcDogMixcbiAgICB9LCBvcHRpb25zKTtcbiAgICBsZXQgeG1sID0gXCJcIjtcbiAgICBsZXQgcGFkID0gMDtcbiAgICBsZXQgaW5kZW50OiBudW1iZXI7XG4gICAgbGV0IG5vZGU6IHN0cmluZztcblxuICAgIGNvbnN0IHN0ckFyciA9IG5vcm1hbGl6ZVRleHQoc3RyLCB7IGVvbDogXCJcXG5cIiB9KVxuICAgICAgICAucmVwbGFjZSgvKD4pKDwpKFxcLyopL2csIFwiJDFcXG4kMiQzXCIpIC8vIGluc2VydCBMRiB0byBlYWNoIG5vZGUgb25jZS5cbiAgICAgICAgLnNwbGl0KFwiXFxuXCIpO1xuXG4gICAgY29uc3Qgc3BhY2VzID0gKGxlbjogbnVtYmVyKSA9PiB7XG4gICAgICAgIGxldCBzID0gXCJcIjtcbiAgICAgICAgY29uc3QgX2luZGVudCA9IGxlbiAqIG9wdC5zdGVwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IF9pbmRlbnQ7IGkrKykge1xuICAgICAgICAgICAgcyArPSBcIiBcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcztcbiAgICB9O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJBcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaW5kZW50ID0gMDtcbiAgICAgICAgbm9kZSA9ICQudHJpbShzdHJBcnJbaV0pO1xuICAgICAgICBpZiAobm9kZS5tYXRjaCgvLis8XFwvXFx3W14+XSo+JC8pKSB7XG4gICAgICAgICAgICBpbmRlbnQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUubWF0Y2goL148XFwvXFx3LykpIHtcbiAgICAgICAgICAgIGlmIChwYWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgcGFkIC09IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5tYXRjaCgvXjxcXHdbXj5dKlteL10+LiokLykpIHtcbiAgICAgICAgICAgIGluZGVudCA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbmRlbnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHhtbCArPSBzcGFjZXMocGFkKSArIG5vZGUgKyBcIlxcblwiO1xuICAgICAgICBwYWQgKz0gaW5kZW50O1xuICAgIH1cblxuICAgIHhtbCA9IHhtbFxuICAgICAgICAucmVwbGFjZSgvXFxuXFxuL2dtLCBcIlxcblwiKVxuICAgICAgICAucmVwbGFjZSgvXiArXFxuL2dtLCBcIlwiKVxuICAgICAgICA7XG5cbiAgICByZXR1cm4gbm9ybWFsaXplVGV4dCh4bWwsIG9wdCk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vc3JjL3V0aWxzL3Rvb2xzLnRzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2hpbGRfcHJvY2Vzc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcImNoaWxkX3Byb2Nlc3NcIlxuLy8gbW9kdWxlIGlkID0gMzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSBcIi4uL3V0aWxzL3NldHRpbmdzXCI7XG5cbmltcG9ydCB7IEdlbmVyYXRvckJhc2UsIElQcm9qZWN0Q29uZmlncmF0aW9uIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgbmV3R2VuZXJhdG9yTGlicmFyeSB9IGZyb20gXCIuL2xpYnJhcnlcIjtcbmltcG9ydCB7IG5ld0dlbmVyYXRvck1vYmlsZSB9IGZyb20gXCIuL21vYmlsZVwiO1xuaW1wb3J0IHsgbmV3R2VuZXJhdG9yRGVza3RvcCB9IGZyb20gXCIuL2Rlc2t0b3BcIjtcbmltcG9ydCB7IG5ld0dlbmVyYXRvcldlYiB9IGZyb20gXCIuL3dlYlwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9iYXNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9saWJyYXJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2JpbGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Rlc2t0b3BcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dlYlwiO1xuXG4vKipcbiAqIGdlbmVyYXRvciDnlJ/miJDplqLmlbBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5ld0dlbmVyYXRvcihjb25maWc6IElQcm9qZWN0Q29uZmlncmF0aW9uKTogR2VuZXJhdG9yQmFzZSB7XG4gICAgc3dpdGNoIChjb25maWcucHJvamVjdFR5cGUpIHtcbiAgICAgICAgY2FzZSBcImxpYnJhcnlcIjpcbiAgICAgICAgICAgIHJldHVybiBuZXdHZW5lcmF0b3JMaWJyYXJ5KGNvbmZpZyk7XG4gICAgICAgIGNhc2UgXCJtb2JpbGVcIjpcbiAgICAgICAgICAgIHJldHVybiBuZXdHZW5lcmF0b3JNb2JpbGUoY29uZmlnKTtcbiAgICAgICAgY2FzZSBcImRlc2t0b3BcIjpcbiAgICAgICAgICAgIHJldHVybiBuZXdHZW5lcmF0b3JEZXNrdG9wKGNvbmZpZyk7XG4gICAgICAgIGNhc2UgXCJ3ZWJcIjpcbiAgICAgICAgICAgIHJldHVybiBuZXdHZW5lcmF0b3JXZWIoY29uZmlnKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGFzc2VydChmYWxzZSwgXCJ1bnN1cHBvcnRlZCBwcm9qZWN0IGtpbmQ6IFwiICsgY29uZmlnLnByb2plY3RUeXBlKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi9zcmMvZ2VuZXJhdG9ycy9pbmRleC50cyIsImltcG9ydCAqIGFzIFV0aWxzIGZyb20gXCIuLi8uLi91dGlsc1wiO1xuZXhwb3J0IHsgVXRpbHMgfTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIElTb3VyY2VEaXJjdG9yeUNvbmZpZ3JhdGlvblxuICogQGJyaWVmIOOCveODvOOCueODh+OCo+ODrOOCr+ODiOODquOBruOCs+ODs+ODleOCo+OCruODpeODrOODvOOCt+ODp+ODs+ioreWumlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElTb3VyY2VEaXJjdG9yeUNvbmZpZ3JhdGlvbiB7XG4gICAgc2NyaXB0Pzogc3RyaW5nOyAgICAgICAgICAgIC8vIGpzKHRzKSDjg5XjgqHjgqTjg6vkv53lrZjlhYhcbiAgICBzdHlsZXNoZWV0Pzogc3RyaW5nOyAgICAgICAgLy8gY3NzKGNzcykg44OV44Kh44Kk44Or5L+d5a2Y5YWIXG4gICAgdGVtcGxhdGU/OiBzdHJpbmc7ICAgICAgICAgIC8vIGh0bWwodGVtcGxhdGUpIOODleOCoeOCpOODq+S/neWtmOWFiFxufVxuXG4vKipcbiAqIEBpbnRlcmZhY2UgSUJhc2VTdHJ1Y3R1cmVDb25maWdyYXRpb25cbiAqIEBicmllZiDjg5fjg63jgrjjgqfjgq/jg4jjg4fjgqPjg6zjgq/jg4jjg6rjga7jgrPjg7Pjg5XjgqPjgq7jg6Xjg6zjg7zjgrfjg6fjg7PoqK3lrppcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbiB7XG4gICAgc3JjPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDjgr3jg7zjgrnjgrPjg7zjg4njga7jg6vjg7zjg4jjg4fjgqPjg6zjgq/jg4jjg6rlkI1cbiAgICBwa2c/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOODkeODg+OCseODvOOCuOWFiOODh+OCo+ODrOOCr+ODiOODquWQjVxuICAgIGJ1aWx0Pzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g44Kz44Oz44OR44Kk44Or5YWI44OH44Kj44Os44Kv44OI44Oq5ZCNXG4gICAgZG9jPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDjg4njgq3jg6Xjg6Hjg7Pjg4jjg4fjgqPjg6zjgq/jg4jjg6rlkI1cbiAgICB0YXNrPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOOCv+OCueOCr+ODh+OCo+ODrOOCr+ODiOODquWQjVxuICAgIHRlc3Q/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g44OG44K544OI44OH44Kj44Os44Kv44OI44Oq5ZCNXG4gICAgdHlwZXM/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUeXBlU2NyaXB0IOWei+Wumue+qeODh+OCo+ODrOOCr+ODiOODquWQjVxuICAgIHRlbXA/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5L2c5qWt44OH44Kj44Os44Kv44OI44Oq5ZCNXG4gICAgc3JjQ29uZmlnPzogSVNvdXJjZURpcmN0b3J5Q29uZmlncmF0aW9uOyAgICAvLyBJU291cmNlRGlyY3RvcnlDb25maWdyYXRpb25cbiAgICBsaWI/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVybmFsIGxpYnJhcnkgbW9kdWxlIOODh+OCo+ODrOOCr+ODiOODquWQjVxuICAgIGV4dGVybmFsPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZXJuYWwgbW9kdWxlIOODh+OCo+ODrOOCr+ODiOODquWQjVxuICAgIHBvcnRpbmc/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9ydGluZyBtb2R1bGUg44OH44Kj44Os44Kv44OI44Oq5ZCNXG4gICAgcmVzPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDjg6rjgr3jg7zjgrnjg4fjgqPjg6zjgq/jg4jjg6rlkI1cbn1cblxuLyoqXG4gKiBAaW50ZXJmYWNlIElEZXBlbmRlbmN5XG4gKiBAYnJpZWYgcGFja2FnZS5qc29uIOOBq+aMh+WumuOBmeOCiyBkZXBlbmRlbmNpZXMg5oOF5aCx44KS5qC857SN44GZ44KL44Kk44Oz44K/44O844OV44Kn44Kk44K5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURlcGVuZGVuY3kge1xuICAgIG5hbWU6IHN0cmluZzsgICAgICAgICAgIC8vIG1vZHVsZSBuYW1lIGV4KSBcInR5cGVzY3JpcHRcIlxuICAgIHZlcnNpb24/OiBzdHJpbmc7ICAgICAgIC8vIOaMh+WumuODkOODvOOCuOODp+ODsy4g54Sh5oyH5a6a44Gu5aC05ZCI44Gv5pyA5paw44OQ44O844K444On44OzXG4gICAgZXM/OiBzdHJpbmdbXTsgICAgICAgICAgLy8g5oyH5a6a44GV44KM44GfIEVTIHZlcnNpb24g44Gu44Go44GN44Gu44G/5pyJ5Yq544Gr44GZ44KLXG4gICAgZ2xvYmFsRXhwb3J0Pzogc3RyaW5nOyAgLy8gZ2xvYmFsIGV4cG9ydCDjgpLlv4XopoHjgajjgZnjgovjgoLjga7jga8gZ2xvYmFsIE9iamVjdCDlkI3jgpLmjIflrppcbiAgICBhbGlhcz86IHN0cmluZzsgICAgICAgICAvLyBhbGlhcyDjgpLoqK3lrprjgZnjgovloLTlkIjjgavmjIflrppcbiAgICB2ZW5kZXJOYW1lPzogc3RyaW5nOyAgICAvLyB2ZW5kZXIg5ZCN44KS6Kit5a6a44GZ44KL5aC05ZCI44Gr5oyH5a6aXG4gICAgZmlsZU5hbWU/OiBzdHJpbmc7ICAgICAgLy8gZmlsZSDlkI3jgpLoqK3lrprjgZnjgovloLTlkIjjgavmjIflrppcbn1cblxuLyoqXG4gKiBAaW50ZXJmYWNlIElQcm9qZWN0Q29uZmlncmF0aW9uXG4gKiBAYnJpZWYg44OX44Ot44K444Kn44Kv44OI5YWx6YCa44Gu44Kz44Oz44OV44Kj44Ku44Ol44Os44O844K344On44Oz6Kit5a6aXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVByb2plY3RDb25maWdyYXRpb24ge1xuICAgIHByb2plY3ROYW1lOiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOODl+ODreOCuOOCp+OCr+ODiOWQjSBleCkgXCJjZHAtbGliXCJcbiAgICBwcm9qZWN0VHlwZTogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDjg5fjg63jgrjjgqfjgq/jg4jnqK7poZ4gZXgpIFwibGlicmFyeVwiXG4gICAgYWN0aW9uOiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXgpIFwiY3JlYXRlXCJcbiAgICB2ZXJzaW9uOiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDjg5Djg7zjgrjjg6fjg7MgZXgpIFwiMS4wLjBcIlxuICAgIGxpY2Vuc2U6IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOODqeOCpOOCu+ODs+OCuSBleCkgXCJBcGFjaGUtMi4wXCJcbiAgICBwcml2YXRlPzogYm9vbGVhbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcml2YXRlIOODkeODg+OCseODvOOCuOOBruWgtOWQiCB0cnVlXG4gICAgc2V0dGluZ3M6IFV0aWxzLklHbG9iYWxTZXR0aW5nczsgICAgICAgICAgICAgICAgLy8g44Ot44Kw44Kq44OX44K344On44OzXG4gICAgbW9kdWxlTmFtZT86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wb3J0IOOBq+aMh+WumuOBmeOCiyDjg6Ljgrjjg6Xjg7zjg6vlkI0gZXgpIFwiY2RwLWxpYlwiXG4gICAgbWFpbkJhc2VOYW1lPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g44Oh44Kk44Oz44OV44Kh44Kk44Or5ZCNIGV4KSBcImNkcC1saWJcIiAvIFwiaW5kZXhcIlxuICAgIG5hbWVzcGFjZT86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOODq+ODvOODiOWQjeWJjeepuumWk1xuICAgIHN0cnVjdHVyZUNvbmZpZz86IElCYXNlU3RydWN0dXJlQ29uZmlncmF0aW9uOyAgIC8vIElCYXNlU3RydWN0dXJlQ29uZmlncmF0aW9uXG4gICAgY29weXJpZ2h0Pzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g44Kz44OU44O844Op44Kk44OI5paH5a2X5YiXIGV4KSBcIkNvcHlyaWdodCAoYykgMjAxNyBTb255IENvcnBvcmF0aW9uXCJcbiAgICBkZXZEZXBlbmRlbmNpZXM/OiBJRGVwZW5kZW5jeVtdOyAgICAgICAgICAgICAgICAvLyDplovnmbrnlKjkvp3lrZjjg6Ljgrjjg6Xjg7zjg6vmg4XloLFcbn1cblxuLyoqXG4gKiBAaW50ZXJmYWNlIElCdWlsZFRhcmdldENvbmZpZ3JhdGlvblxuICogQGJyaWVmIOODk+ODq+ODieOCv+ODvOOCsuODg+ODiOOCs+ODs+ODleOCo+OCruODpeODrOODvOOCt+ODp+ODs+ioreWumlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElCdWlsZFRhcmdldENvbmZpZ3JhdGlvbiB7XG4gICAgZXM/OiBcImVzNVwiIHwgXCJlczIwMTVcIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGVTY3JpcHQg44GuIHRyYW5zcGlsZSB0YXJnZXRcbiAgICBtb2R1bGU/OiBcIm5vbmVcIiB8IFwiY29tbW9uanNcIiB8IFwiYW1kXCIgfCBcInVtZFwiOyAgICAgICAgICAgICAgIC8vIEphdmFTY3JpcHQgbW9kdWxlIHN5c3RlbVxuICAgIGVudj86IFwid2ViXCIgfCBcIm5vZGVcIiB8IFwiZWxlY3Ryb25cIiB8IFwiZWxlY3Ryb24tcmVuZGVyZXJcIjsgICAgLy8g5a6f6KGM55Kw5aKD44GuIHRhcmdldFxuICAgIG5vZGVqcz86IGJvb2xlYW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFwibm9kZVwiIHwgXCJlbGVjdHJvblwiIOOBruWgtOWQiOOBqyB0cnVlXG4gICAgbWluaWZ5PzogYm9vbGVhbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g44Oq44Oq44O844K55pmC44GrIG1pbmlmeSDjgZnjgovloLTlkIjjga8gdHJ1ZVxuICAgIC8vIGJ1aWxkIHRvb2xcbiAgICB0b29scz86IHN0cmluZ1tdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDml6Llrprjga4gYnVpbGQgdG9vbCBleCkgW1wid2VicGFja1wiXVxuICAgIG91dHB1dFNhbWVEaXI/OiBib29sZWFuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYyDjgaggYnVpbHQg44GM5ZCM44GY44OH44Kj44Os44Kv44OI44Oq44Gr44Gq44KL5aC05ZCIIHRydWVcbn1cblxuLyoqXG4gKiBAaW50ZXJmYWNlIElXZWJwYWNrQ29uZmlncmF0aW9uXG4gKiBAYnJpZWYgV2VicGFjayDnlKjjgrPjg7Pjg5XjgqPjgq7jg6Xjg6zjg7zjgrfjg6fjg7PoqK3lrppcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJV2VicGFja0NvbmZpZ3JhdGlvbiB7XG4gICAgbm9kZWpzOiBib29sZWFuOyAgICAvLyBcIm5vZGVcIiB8IFwiZWxlY3Ryb25cIiDjga7loLTlkIjjgasgdHJ1ZVxuICAgIGd1aWRlOiBib29sZWFuOyAgICAgLy8gZ3VpZGUg44Kz44Oh44Oz44OI44KS5LuY5Yqg44GZ44KL5aC05ZCI44GvIHRydWUg44KS5oyH5a6aXG4gICAgdGFza1BhdGg6IHN0cmluZzsgICAvLyAndGFzaycg44OH44Kj44Os44Kv44OI44Oq5ZCNXG59XG5cbi8qKlxuICogQGludGVyZmFjZSBJVmlzdWFsU3R1ZGlvQ29uZmlncmF0aW9uXG4gKiBAYnJpZWYgVmlzdWFsIFN0dWRpbyDnlKjjgrPjg7Pjg5XjgqPjgq7jg6Xjg6zjg7zjgrfjg6fjg7PoqK3lrppcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVmlzdWFsU3R1ZGlvQ29uZmlncmF0aW9uIGV4dGVuZHMgSUJhc2VTdHJ1Y3R1cmVDb25maWdyYXRpb24ge1xuICAgIHByb2plY3ROYW1lOiBzdHJpbmc7ICAgICAgICAvLyDjg5fjg63jgrjjgqfjgq/jg4jlkI0gZXgpIFwiY2RwLWxpYlwiXG4gICAgcHJvamVjdEdVSUQ6IHN0cmluZzsgICAgICAgIC8vIOODl+ODreOCuOOCp+OCr+ODiCBHVUlEIGV4KSB7NTFCNDEzNTktOEQyQy00MkRGLTg0MTQtRTg1QjAyOTkzMjM4fVxuICAgIG1haW5CYXNlTmFtZTogc3RyaW5nOyAgICAgICAvLyDjg6HjgqTjg7Pjg5XjgqHjgqTjg6vlkI0gZXgpIFwiY2RwLWxpYlwiIC8gaW5kZXhcbiAgICBsaWNlbnNlOiBib29sZWFuOyAgICAgICAgICAgLy8gTElDRU5TRSDjgpLov73liqDjgZnjgovloLTlkIjjga8gdHJ1ZVxuICAgIHdlYnBhY2s6IGJvb2xlYW47ICAgICAgICAgICAvLyB3ZWJwYWNrLmNvbmZpZy5qcyDjgpLov73liqDjgZnjgovloLTlkIjjga8gdHJ1ZVxuICAgIHRlc3RlbTogYm9vbGVhbjsgICAgICAgICAgICAvLyB0ZXN0ZW0gcnVubmVyIOOCkui/veWKoOOBmeOCi+WgtOWQiOOBryB0cnVlXG4gICAgb3V0cHV0U2FtZURpcjogYm9vbGVhbjsgICAgIC8vIHNyYyDjgaggYnVpbHQg44GM5ZCM44GY44OH44Kj44Os44Kv44OI44Oq44Gr44Gq44KL5aC05ZCIIHRydWVcbiAgICB0c0dyb3VwOiB7XG4gICAgICAgIHJlbGF0aXZlUGF0aDogc3RyaW5nOyAgIC8vIFwiaG9nZWhvZ2VcXFwiXG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7ICAgICAgIC8vIFwiY2RwLWxpYlwiXG4gICAgICAgIGRlcGVuZGVlOiBib29sZWFuOyAgICAgIC8vIOS+neWtmOWFiOOCkui/veWKoOOBmeOCi+WgtOWQiCB0cnVlXG4gICAgICAgIG1hcDogYm9vbGVhbjsgICAgICAgICAgIC8vIC5tYXAg44OV44Kh44Kk44Or44GM44GC44KL5aC05ZCIIHRydWVcbiAgICB9W107XG4gICAganNHcm91cDoge1xuICAgICAgICByZWxhdGl2ZVBhdGg6IHN0cmluZzsgICAvLyBcImhvZ2Vob2dlXFxcIlxuICAgICAgICBmaWxlTmFtZTogc3RyaW5nOyAgICAgICAvLyBcImNkcC1saWJcIlxuICAgICAgICBkZXBlbmRlZTogYm9vbGVhbjsgICAgICAvLyDkvp3lrZjlhYjjgpLov73liqDjgZnjgovloLTlkIggdHJ1ZVxuICAgICAgICBkX3RzOiBib29sZWFuOyAgICAgICAgICAvLyAuZC50cyDjg5XjgqHjgqTjg6vjgYzjgYLjgovloLTlkIggdHJ1ZVxuICAgICAgICBtYXA6IGJvb2xlYW47ICAgICAgICAgICAvLyAubWFwIOODleOCoeOCpOODq+OBjOOBguOCi+WgtOWQiCB0cnVlXG4gICAgICAgIG1pbl9tYXA6IGJvb2xlYW47ICAgICAgIC8vIC5taW4gLm1hcCDjg5XjgqHjgqTjg6vjgYzjgYLjgovloLTlkIggdHJ1ZVxuICAgIH1bXTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi8uLi9zcmMvZ2VuZXJhdG9ycy9iYXNlL2ludGVyZmFjZXMudHMiLCJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQge1xuICAgIGZzLFxuICAgIGdsb2IsXG4gICAgY2hhbGssXG4gICAgXyxcbiAgICAkLFxuICAgIC8vLy9cbiAgICBleGVjQ29tbWFuZCxcbiAgICBnZXRTcGlubmVyLFxuICAgIGdldFRhcmdldERpcixcbiAgICB0ZW1wbGF0ZVBhdGgsXG4gICAgY29weVRwbCxcbiAgICBsb2csXG4gICAgZGVidWcsXG4gICAgdHJhbnNsYXRlLFxufSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcblxuaW1wb3J0IHtcbiAgICBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbixcbiAgICBJRGVwZW5kZW5jeSxcbiAgICBJUHJvamVjdENvbmZpZ3JhdGlvbixcbiAgICBJQnVpbGRUYXJnZXRDb25maWdyYXRpb24sXG4gICAgSVdlYnBhY2tDb25maWdyYXRpb24sXG59IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcblxuLyoqXG4gKiBAY2xhc3MgR2VuZXJhdG9yQmFzZVxuICogQGJyaWVmIOOBmeOBueOBpuOBriBHZW5lcmF0b3Ig44Gu5pei5a6a44Kv44Op44K5XG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBHZW5lcmF0b3JCYXNlIHtcblxuICAgIHByaXZhdGUgX3Byb2plY3RSb290RGlyOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogQHBhcmFtIHtJUHJvamVjdENvbmZpZ3JhdGlvbn0gY29uZmlnIOOCs+ODs+ODleOCo+OCsFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfY29uZmlnOiBJUHJvamVjdENvbmZpZ3JhdGlvbikge1xuICAgICAgICB0aGlzLl9wcm9qZWN0Um9vdERpciA9IGdldFRhcmdldERpcigpID9cbiAgICAgICAgICAgIGdldFRhcmdldERpcigpIDpcbiAgICAgICAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCB0aGlzLl9jb25maWcucHJvamVjdE5hbWUpO1xuXG4gICAgICAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcgPSAkLmV4dGVuZCh7fSwgdGhpcy5kZWZhdWx0QmFzZVN0cnVjdHVyZSgpLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnKTtcblxuICAgICAgICB0aGlzLl9jb25maWcucHJpdmF0ZSA9IFwiTk9ORVwiID09PSB0aGlzLl9jb25maWcubGljZW5zZTtcblxuICAgICAgICAoPElCdWlsZFRhcmdldENvbmZpZ3JhdGlvbj50aGlzLl9jb25maWcpLm91dHB1dFNhbWVEaXJcbiAgICAgICAgICAgID0gdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMgPT09IHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuYnVpbHQ7XG5cbiAgICAgICAgKDxJQnVpbGRUYXJnZXRDb25maWdyYXRpb24+dGhpcy5fY29uZmlnKS5ub2RlanMgPSAoKGVudjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGVudikge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJub2RlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImVsZWN0cm9uXCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKDxJQnVpbGRUYXJnZXRDb25maWdyYXRpb24+dGhpcy5fY29uZmlnKS5lbnYpO1xuXG4gICAgICAgIGRlYnVnKEpTT04uc3RyaW5naWZ5KHRoaXMuX2NvbmZpZywgbnVsbCwgNCkpO1xuICAgIH1cblxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gcHViaWMgbWV0aG9kczpcblxuICAgIC8qKlxuICAgICAqIOWHpueQhumWi+WniyAo44Ko44Oz44OI44OqKVxuICAgICAqXG4gICAgICovXG4gICAgcHVibGljIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgc3dpdGNoICh0aGlzLl9jb25maWcuYWN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIFwiY3JlYXRlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucnVuQ3JlYXRlKCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcInVua25vd24gYWN0aW9uOiBcIiArIHRoaXMuX2NvbmZpZy5hY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBhYnN0cmFjdCBtZXRob2RzOlxuXG4gICAgLy8g5pei5a6a44GuIGRpcmVjdG9yeSDmp4vpgKDjgpLov5TljbRcbiAgICBhYnN0cmFjdCBkZWZhdWx0QmFzZVN0cnVjdHVyZSgpOiBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbjtcblxuICAgIC8vIGFjdGlvbjogY3JlYXRlIOOBruOBqOOBjeOBq+WRvOOBsOOCjOOCi1xuICAgIGFic3RyYWN0IGFzeW5jIGNyZWF0ZSgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLy8g5b+F6KaB44Go44GZ44KLIHRhc2sgc2NyaXB0IOS4gOimp+OCkui/lOWNtC4gYWN0aW9uOiBjcmVhdGUg44Gu44Go44GN44Gr5ZG844Gw44KM44KLXG4gICAgYWJzdHJhY3QgZ2V0IHRhc2tMaXN0KCk6IHN0cmluZ1tdO1xuXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBwcm90ZWN0ZWQgbWV0aG9kczpcblxuICAgIC8qKlxuICAgICAqIOmAsuaNl+ODhuOCreOCueODiOOCkumAmuefpVxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSDjg63jg7zjgqvjg6njgqTjgrrjg6rjgr3jg7zjgrnjgq3jg7zjgpLmjIflrppcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcHJvZ3Jlc3Moa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgbG9nKGNoYWxrLmN5YW4odHJhbnNsYXRlKGtleSkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorablkYrjg4bjgq3jgrnjg4jjgpLpgJrnn6VcbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkg44Ot44O844Kr44Op44Kk44K644Oq44K944O844K544Kt44O844KS5oyH5a6aXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHdhcm4oa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgbG9nKGNoYWxrLnllbGxvdyh0cmFuc2xhdGUoa2V5KSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHdvcmsgZGlyZWN0b3J5IOOBruWkieabtFxuICAgICAqXG4gICAgICogQHBhcmFtIGRpcmVjdG9yeSB0YXJnZXQgZGlyZWN0b3J5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjaGRpcihkaXJlY3Rvcnk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBwcm9jZXNzLmNoZGlyKGRpcmVjdG9yeSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcHJvamVjdCByb290IGRpcmVjdG9yeSDjga7lj5blvpdcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkaXJlY3RvcnkgdGFyZ2V0IGRpcmVjdG9yeS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IHJvb3REaXIoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2plY3RSb290RGlyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRlbXBsYXRlIGRpcmVjdG9yeSDjgpLmjIflrprjgZfjgabphY3kuIvjga7jg5XjgqHjgqTjg6vjgpLjgrPjg5Tjg7xcbiAgICAgKiBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbiDjga7oqK3lrprjgYzlj43mmKDjgZXjgozjgotcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0YXJnZXQgIOOCv+ODvOOCsuODg+ODiOOCkuaMh+Wumi4gbnVsbCDjga7loLTlkIjjga/jgIF0ZW1wbGF0ZXMg44KS6L+U5Y20XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRzdFJvb3Qg44Kz44OU44O85YWI44KS5oyH5a6aLiDmjIflrprjgYznhKHjgYTloLTlkIjjga8gcm9vdERpciDjgYzoqK3lrppcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29weVRwbERpcih0YXJnZXQ6IHN0cmluZywgZHN0Um9vdD86IHN0cmluZywgb3B0aW9ucz86IGdsb2IuSU9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgZHN0Um9vdCA9IGRzdFJvb3QgfHwgdGhpcy5yb290RGlyO1xuICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe1xuICAgICAgICAgICAgY3dkOiB0ZW1wbGF0ZVBhdGgodGFyZ2V0KSxcbiAgICAgICAgICAgIG5vZGlyOiB0cnVlLFxuICAgICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICBnbG9iLnN5bmMoXCIqKlwiLCBvcHRpb25zKVxuICAgICAgICAgICAgLmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkc3QgPSBwYXRoLmpvaW4oZHN0Um9vdCxcbiAgICAgICAgICAgICAgICAgICAgZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL3NyYy8sICAgICB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9wa2cvLCAgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5wa2cpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvYnVpbHQvLCAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuYnVpbHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvZG9jLywgICAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuZG9jKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL3Rhc2svLCAgICB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnRhc2spXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvdGVzdC8sICAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcudGVzdClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC90eXBlcy8sICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50eXBlcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC90ZW1wXFwvLywgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50ZW1wICsgXCIvXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvbGliLywgICAgICAgICB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLmxpYiB8fCBcImxpYlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL2V4dGVybmFsLywgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5leHRlcm5hbCB8fCBcImV4dGVybmFsXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvcG9ydGluZy8sICAgICB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnBvcnRpbmcgfHwgXCJwb3J0aW5nXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvcmVzLywgICAgICAgICB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnJlcyB8fCBcInJlc1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgL3NjcmlwdC8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmNDb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAodGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmNDb25maWcuc2NyaXB0IHx8IFwic2NyaXB0c1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwic2NyaXB0c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvc3R5bGVzaGVldC8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmNDb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAodGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmNDb25maWcuc3R5bGVzaGVldCB8fCBcInN0eWxlc2hlZXRzXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJzdHlsZXNoZWV0c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvdGVtcGxhdGUvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjQ29uZmlnLnRlbXBsYXRlIHx8IFwidGVtcGxhdGVzXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZW1wbGF0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZnMuY29weVN5bmMocGF0aC5qb2luKHRlbXBsYXRlUGF0aCh0YXJnZXQpLCBmaWxlKSwgZHN0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbm9kZSBtb2R1bGUg44GuIHZlcnNpb24g5Y+W5b6XXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb21pc2U8c3RyaW5nPn0gdmVyc2lvbiB0ZXh0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIHF1ZXJ5Tm9kZU1vZHVsZUxhdGVzdFZlcnNpb24obmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCB2ZXJzaW9uOiBzdHJpbmc7XG4gICAgICAgICAgICBleGVjQ29tbWFuZChcIm5wbVwiLCBbXCJpbmZvXCIsIG5hbWUsIFwidmVyc2lvblwiXSwge1xuICAgICAgICAgICAgICAgIHN0ZGlvOiBcInBpcGVcIixcbiAgICAgICAgICAgICAgICBzcGlubmVyOiBudWxsLFxuICAgICAgICAgICAgICAgIHN0ZG91dDogKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gXy50cmltKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh2ZXJzaW9uKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDml6Llrprjga7plovnmbrmmYLjga7kvp3lrZjjg6Ljgrjjg6Xjg7zjg6vjg6rjgrnjg4jjga7lj5blvpdcbiAgICAgKiDlv4XopoHjgavlv5zjgZjjgabjgqrjg7zjg5Djg7zjg6njgqTjg4lcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0lEZXBlbmRlbmN5fVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXQgZGVmYXVsdERldkRlcGVuZGVuY2llcygpOiBJRGVwZW5kZW5jeVtdIHtcbiAgICAgICAgY29uc3QgYmFzZSA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogXCJjb252ZXJ0LXNvdXJjZS1tYXBcIiwgICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwiZGVsXCIsICAgICAgICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBcImVzbGludFwiLCAgICAgICAgICAgICAgIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcbiAgICAgICAgICAgIHsgbmFtZTogXCJucG0tcnVuLWFsbFwiLCAgICAgICAgICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwicGxhdG9cIiwgICAgICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBcInNvdXJjZS1tYXBcIiwgICAgICAgICAgIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcbiAgICAgICAgICAgIHsgbmFtZTogXCJ0c2xpbnRcIiwgICAgICAgICAgICAgICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwidHlwZWRvY1wiLCAgICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxuICAgICAgICAgICAgeyBuYW1lOiBcInR5cGVzY3JpcHRcIiwgICAgICAgICAgIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgbWluaWZ5ID0gW1xuICAgICAgICAgICAgeyBuYW1lOiBcInVnbGlmeS1qc1wiLCAgICB2ZXJzaW9uOiB1bmRlZmluZWQsIGVzOiBbXCJlczVcIl0sICAgIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwidWdsaWZ5LWVzXCIsICAgIHZlcnNpb246IHVuZGVmaW5lZCwgZXM6IFtcImVzMjAxNVwiXSwgfSxcbiAgICAgICAgXTtcblxuICAgICAgICBsZXQgZXh0cmEgPSBbXTtcbiAgICAgICAgaWYgKCg8SUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uPnRoaXMuX2NvbmZpZykubWluaWZ5KSB7XG4gICAgICAgICAgICBleHRyYSA9IGV4dHJhLmNvbmNhdChtaW5pZnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlVG9vbChcIndlYnBhY2tcIikpIHtcbiAgICAgICAgICAgIGV4dHJhLnB1c2goeyBuYW1lOiBcIndlYnBhY2tcIiwgICAgICAgICAgIHZlcnNpb246IHVuZGVmaW5lZCwgfSk7XG4gICAgICAgICAgICBleHRyYS5wdXNoKHsgbmFtZTogXCJzb3VyY2UtbWFwLWxvYWRlclwiLCB2ZXJzaW9uOiB1bmRlZmluZWQsIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlVG9vbChcIm55Y1wiKSkge1xuICAgICAgICAgICAgZXh0cmEucHVzaCh7IG5hbWU6IFwibnljXCIsIHZlcnNpb246IHVuZGVmaW5lZCwgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVUb29sKFwidGVzdGVtXCIpKSB7XG4gICAgICAgICAgICBleHRyYS5wdXNoKHsgbmFtZTogXCJ0ZXN0ZW1cIiwgdmVyc2lvbjogdW5kZWZpbmVkLCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZVRvb2woXCJwaGFudG9tanMtcHJlYnVpbHRcIikpIHtcbiAgICAgICAgICAgIGV4dHJhLnB1c2goeyBuYW1lOiBcInBoYW50b21qcy1wcmVidWlsdFwiLCB2ZXJzaW9uOiB1bmRlZmluZWQsIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIF8uc29ydEJ5KGJhc2UuY29uY2F0KGV4dHJhKSwgKGRlcGVuZCkgPT4gZGVwZW5kLm5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGRlcGVuZGVuY2llcyDjga4gdGVtcGxhdGUgcGFyYW1hZXRlciDjgpLlj5blvpdcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge0lEZXBlbmRlbmN5W119IGRlcGVuZGVuY2llcyDkvp3lrZjplqLkv4Ljg6rjgrnjg4hcbiAgICAgKiBAcmV0dXJuIHt7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nOyBsYXN0PzogYm9vbGVhbjsgfVtdfSDjg4bjg7Pjg5fjg6zjg7zjg4jjg5Hjg6njg6Hjg7zjgr/jgavmjIflrprjgZnjgovphY3liJdcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXN5bmMgcXVlcnlEZXBlbmRlbmNpZXNQYXJhbShkZXBlbmRlbmNpZXM6IElEZXBlbmRlbmN5W10pOiBQcm9taXNlPHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmc7IGxhc3Q/OiBib29sZWFuIH1bXT4ge1xuICAgICAgICB0aGlzLnByb2dyZXNzKFwiYmFzZS5jcmVhdGUucXVlcnlWZXJzaW9uXCIpO1xuXG4gICAgICAgIGNvbnN0IGRlcGVuZHMgPSA8eyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZzsgbGFzdD86IGJvb2xlYW47IH1bXT5kZXBlbmRlbmNpZXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGRlcGVuZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChudWxsID09IGRlcGVuZC5lcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFkZXBlbmQuZXMuZmluZCgoZXNWZXJzaW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDxJQnVpbGRUYXJnZXRDb25maWdyYXRpb24+dGhpcy5fY29uZmlnKS5lcyA9PT0gZXNWZXJzaW9uO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBkZWJ1ZyhKU09OLnN0cmluZ2lmeShkZXBlbmRzLCBudWxsLCA0KSk7XG5cbiAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSAoY29udGV4dDogYW55KTogYW55ID0+IHtcbiAgICAgICAgICAgIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2YgY29udGV4dCAmJiAhdGhpcy5fY29uZmlnLnNldHRpbmdzLnNpbGVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwaW5uZXIgPSBnZXRTcGlubmVyKGNoYWxrLnllbGxvdyhjb250ZXh0KSwgNSk7XG4gICAgICAgICAgICAgICAgc3Bpbm5lci5zdGFydCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBzcGlubmVyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5zdG9wKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gZGVwZW5kcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChudWxsID09IGRlcGVuZHNbaV0udmVyc2lvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwaW5uZXIgPSBwcm9ncmVzcyhkZXBlbmRzW2ldLm5hbWUpO1xuICAgICAgICAgICAgICAgIGRlcGVuZHNbaV0udmVyc2lvbiA9IFwiXlwiICsgYXdhaXQgdGhpcy5xdWVyeU5vZGVNb2R1bGVMYXRlc3RWZXJzaW9uKGRlcGVuZHNbaV0ubmFtZSk7XG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3Moc3Bpbm5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSA9PT0gbiAtIDEpIHtcbiAgICAgICAgICAgICAgICBkZXBlbmRzW2ldLmxhc3QgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlcGVuZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogd2VicGFjay5jb25maWcuanMg44GuIHRlbXBsYXRlIHBhcmFtYWV0ZXIg44KS5Y+W5b6XXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IGxpYnJhcnlUYXJnZXQg44Gr5oyH5a6a44GZ44KL5paH5a2X5YiXXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHF1ZXJ5V2VicGFja0xpYnJhcnlUYXJnZXQoKTogc3RyaW5nIHtcbiAgICAgICAgc3dpdGNoICgoPElCdWlsZFRhcmdldENvbmZpZ3JhdGlvbj50aGlzLl9jb25maWcpLm1vZHVsZSkge1xuICAgICAgICAgICAgY2FzZSBcImNvbW1vbmpzXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY29tbW9uanMyXCI7XG4gICAgICAgICAgICBjYXNlIFwiYW1kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiYW1kXCI7XG4gICAgICAgICAgICBjYXNlIFwidW1kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwidW1kXCI7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBlc2xpbnRyYyDjga4gZW52IOOBq+aMh+WumuOBmeOCiyB0ZW1wbGF0ZSBwYXJhbWFldGVyIOOCkuWPluW+l1xuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBlbnYg44Gr5oyH5a6a44GZ44KL44OG44Oz44OX44Os44O844OI44OR44Op44Oh44O844K/44Kq44OW44K444Kn44Kv44OIXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHF1ZXJ5RXNMaW50RW52UGFyYW0oKTogYW55IHtcbiAgICAgICAgY29uc3QgY29tcGlsZVNldHRpbmcgPSA8SUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uPnRoaXMuX2NvbmZpZztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVzNjogXCJlczVcIiAhPT0gY29tcGlsZVNldHRpbmcuZXMsXG4gICAgICAgICAgICBub2RlOiBcIndlYlwiICE9PSBjb21waWxlU2V0dGluZy5lbnYsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uLnRvb2xzIOODl+ODreODkeODhuOCo+OBruaMh+WumueKtuazgeOCkuWPluW+l1xuICAgICAqXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgbmFtZSDjg4Tjg7zjg6vlkI3jgpLmjIflrppcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlOiDmjIflrprjgZXjgozjgabjgYTjgosgLyBmYWxzZTog5oyH5a6a44GV44KM44Gm44GE44Gq44GEXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGlzRW5hYmxlVG9vbChuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhKDxJQnVpbGRUYXJnZXRDb25maWdyYXRpb24+dGhpcy5fY29uZmlnKS50b29scy5maW5kKCh0b29sKSA9PiBuYW1lID09PSB0b29sKTtcbiAgICB9XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIHByaXZhdGUgbWV0aG9kczpcblxuICAgIC8qKlxuICAgICAqIGNyZWF0ZSDlh6bnkIbjga7jgqjjg7Pjg4jjg6pcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHJ1bkNyZWF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVCYXNlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlKCk7XG4gICAgfVxuXG4gICAgLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLy9cblxuICAgIC8qKlxuICAgICAqIOWFsemAmuOBriBjcmVhdGUg5Yem55CGXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVCYXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnByb2dyZXNzKFwiYmFzZS5jcmVhdGUuZm91bmRhdGlvblwiKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVQcm9qZWN0RGlyKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29weUJhc2VTdHJ1Y3R1cmUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb3B5Q29tbW9uRmlsZXMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb3B5VGFza1NjcmlwdHMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5fjg63jgrjjgqfjgq/jg4jjg4fjgqPjg6zjgq/jg4jjg6rjga7kvZzmiJBcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVByb2plY3REaXIoKTogdm9pZCB7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHRoaXMucm9vdERpcikpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKHRyYW5zbGF0ZShcImJhc2UuY3JlYXRlLmVycm9yLmFscmVhZHlFeGlzdFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnMubWtkaXJzU3luYyh0aGlzLnJvb3REaXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWFsemAmuani+aIkOaDheWgseOBruOCs+ODlOODvFxuICAgICAqL1xuICAgIHByaXZhdGUgY29weUJhc2VTdHJ1Y3R1cmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29weVRwbERpcihcImJhc2Uvc3RydWN0dXJlXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWfuuacrOODleOCoeOCpOODq+OBruOCs+ODlOODvFxuICAgICAqIHRlbXBsYXRlIOOBruOCs+ODlOODvOOCguihjOOBhlxuICAgICAqL1xuICAgIHByaXZhdGUgY29weUNvbW1vbkZpbGVzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzcmNEaXIgPSB0ZW1wbGF0ZVBhdGgoXCJiYXNlXCIpO1xuICAgICAgICBjb25zdCBkc3REaXIgPSB0aGlzLnJvb3REaXI7XG5cbiAgICAgICAgLy8gLm5wbWlnbm9yZVxuICAgICAgICBjb3B5VHBsKFxuICAgICAgICAgICAgcGF0aC5qb2luKHNyY0RpciwgXCJfbnBtaWdub3JlXCIpLFxuICAgICAgICAgICAgcGF0aC5qb2luKGRzdERpciwgXCIubnBtaWdub3JlXCIpLFxuICAgICAgICAgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZ1xuICAgICAgICApO1xuXG4gICAgICAgIC8vIEJBTk5FUlxuICAgICAgICBmcy5jb3B5U3luYyhcbiAgICAgICAgICAgIHBhdGguam9pbihzcmNEaXIsIFwiX0JBTk5FUlwiKSxcbiAgICAgICAgICAgIHBhdGguam9pbihkc3REaXIsIFwiQkFOTkVSXCIpLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIExJQ0VOU0VcbiAgICAgICAgc3dpdGNoICh0aGlzLl9jb25maWcubGljZW5zZSkge1xuICAgICAgICAgICAgY2FzZSBcIkFwYWNoZS0yLjBcIjpcbiAgICAgICAgICAgICAgICBmcy5jb3B5U3luYyhcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY0RpciwgXCJfTElDRU5TRS5BcGFjaGUtMi4wXCIpLFxuICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4oZHN0RGlyLCBcIkxJQ0VOU0VcIiksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJNSVRcIjpcbiAgICAgICAgICAgICAgICBjb3B5VHBsKFxuICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4oc3JjRGlyLCBcIl9MSUNFTlNFLk1JVFwiKSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKGRzdERpciwgXCJMSUNFTlNFXCIpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25maWcuY29weXJpZ2h0XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOT1RJQ0VcbiAgICAgICAgZnMuY29weVN5bmMoXG4gICAgICAgICAgICBwYXRoLmpvaW4oc3JjRGlyLCBcIl9OT1RJQ0VcIiksXG4gICAgICAgICAgICBwYXRoLmpvaW4oZHN0RGlyLCBcIk5PVElDRVwiKSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBidWlsZCB0b29sczogd2VicGFja1xuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZVRvb2woXCJ3ZWJwYWNrXCIpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhbTogSVdlYnBhY2tDb25maWdyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgbm9kZWpzOiAoPElCdWlsZFRhcmdldENvbmZpZ3JhdGlvbj50aGlzLl9jb25maWcpLm5vZGVqcyxcbiAgICAgICAgICAgICAgICBndWlkZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0YXNrUGF0aDogdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50YXNrLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvcHlUcGwoXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY0RpciwgXCJ0b29scy93ZWJwYWNrL193ZWJwYWNrLmNvbmZpZy5qc1wiKSxcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4oZHN0RGlyLCBcIndlYnBhY2suY29uZmlnLmpzXCIpLFxuICAgICAgICAgICAgICAgIHBhcmFtLFxuICAgICAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0YXNrIHNjcmlwdCDjga7jgrPjg5Tjg7xcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvcHlUYXNrU2NyaXB0cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3JjRGlyID0gdGVtcGxhdGVQYXRoKFwiYmFzZS90YXNrXCIpO1xuICAgICAgICBjb25zdCBkc3REaXIgPSBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnRhc2spO1xuXG4gICAgICAgIHRoaXMudGFza0xpc3QuZm9yRWFjaCgodGFzaykgPT4ge1xuICAgICAgICAgICAgZnMuY29weVN5bmMoXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY0RpciwgdGFzayksXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKGRzdERpciwgdGFzayksXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vLi4vc3JjL2dlbmVyYXRvcnMvYmFzZS9nZW5lcmF0b3ItYmFzZS50cyJdfQ=="]} \ No newline at end of file +{"version":3,"sources":["dist/cdp-lib.js"],"names":["module","exports","modules","installedModules","__webpack_require__","moduleId","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","getDefault","getModuleExports","object","property","prototype","hasOwnProperty","p","s","require","__export","value","fs","glob","hogan","_l","_s","which","uuid","chalk_1","chalk","default","semverRegex","cli_spinner_1","Spinner","$","_window","jsdom","JSDOM","window","defaultView","root","xmldom","DOMParser","global","XMLSerializer","_m","mixin","_","path","libs_1","_settings","force","verbose","silent","lang","_libPath","getSettings","extend","setSettings","settings","targetDir","getLibPath","TRY_COUNT","tried","__dirname","Error","join","check","pathExistsSync","getTargetDir","log","message","optionalParams","length","console","debug","error","assert","test","warn","process","exit","_lang","translate","key","JSON","parse","readFileSync","toString","resouce","props","split","prop","shift","generator_module_1","newGeneratorLibrary","config","GeneratorModule","__awaiter","this","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","e","rejected","result","done","then","apply","os","base_1","Utils","templatePath","copyTpl","GeneratorBase","[object Object]","src","pkg","built","doc","task","types","temp","ensureModuleProps","createDirectoryStructure","createProjectSettings","createSourceTemplate","createVisualStudioSolution","taskList","defaultDevDependencies","depends","super","concat","version","undefined","extra","nodejs","push","sortBy","depend","_config","moduleName","projectName","trim","dasherize","mainBaseName","copyTplDir","rootDir","delimiters","outputSameDir","bom","structureConfig","queryEsLintEnvParam","testemStuffPath","sync","cwd","nodir","forEach","file","copySync","devDependencies","queryDependenciesParam","_module","basename","param","sampleClass","classify","sampleModule","script","srcConfig","vsParam","createGUID","projectGUID","replace","license","private","webpack","isEnableTool","testem","jsGroup","relativePath","fileName","dependee","d_ts","map","min_map","minify","tsGroup","toXmlString","normalizeText","options","eol","EOL","tpl","jst","compile","render","toXmlDOM","parseXML","toXmlNode","str2XmlNode","$proj","$gpTS","$gpJS","find","last","after","formatXML","dstPath","xmlNode2Str","writeFileSync","generator_cordova_1","newGeneratorMobile","GeneratorCordova","utils_1","lib","external","porting","res","stylesheet","template","stringify","isEnableCordova","chdir","createCordovaScaffold","updateConfigXML","addCordovaPlatforms","addCordovaPlugins","addCordovaExtentionFiles","cacheCordovaPackageJSON","base","assign","cordova","hammerjs","isInstallationTarget","iscroll","flipsnap","defaultDependencies","dependencies","platforms","target","projectStructure","indexOf","progress","execCommand","appId","appName","removeSync","configXmlPath","$configXmlDom","attr","prepend","remove","targets","slice","index","platform","splice","cordova_plugin","existsSync","cordovaPackageJson","displayName","main","scripts","author","description","hasStructureOf","PLATFORMS_ROOT","readdirSync","statSync","isDirectory","WWW","mkdir","queryTsConfigBaseParam","resolvedConfig","PKG_PATH","sortKeys","sorted","keys","sort","additional","list","listWithCustomName","resource_addon","info","venderName","alias","globals","importsList","exportsList","hasExports","globalExport","unlinkSync","enableLib","enablePorting","dirname","generator_electoron_1","newGeneratorDesktop","GeneratorElectron","generator_browser_1","newGeneratorWeb","GeneratorBrowser","generators_1","CDPLib","newGenerator","run","child_process_1","settings_1","handleError","getSpinner","format","spinners","fmt","spinner","idx","Math","floor","random","setSpinnerString","text","opt","tab","spaces","command","args","stdio","stdout","data","stderr","quoteIfNeeded","str","includes","shell","resolvedCommand","start","child","spawn","on","code","stop","dst","params","output","ensureFileSync","v4","toUpperCase","fullXML","$xml","children","serializeToString","xml","pad","indent","node","strArr","len","_indent","match","library_1","mobile_1","desktop_1","web_1","projectType","_projectRootDir","defaultBaseStructure","env","action","runCreate","cyan","yellow","directory","dstRoot","dot","catch","reason","es","filter","esVersion","context","queryNodeModuleLatestVersion","compileSetting","es6","tools","tool","createBase","create","createProjectDir","copyBaseStructure","copyCommonFiles","copyTaskScripts","mkdirsSync","srcDir","dstDir","copyright","guide","taskPath"],"mappings":"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","sourcesContent":["/*!\n * cdp-lib.js 0.1.4\n *\n * Date: 2017-11-21T08:28:50.840Z\n */\n\nmodule.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ // The module cache\n/******/ var installedModules = {};\n/******/\n/******/ // The require function\n/******/ function __webpack_require__(moduleId) {\n/******/\n/******/ // Check if module is in cache\n/******/ if(installedModules[moduleId]) {\n/******/ return installedModules[moduleId].exports;\n/******/ }\n/******/ // Create a new module (and put it into the cache)\n/******/ var module = installedModules[moduleId] = {\n/******/ i: moduleId,\n/******/ l: false,\n/******/ exports: {}\n/******/ };\n/******/\n/******/ // Execute the module function\n/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ // Flag the module as loaded\n/******/ module.l = true;\n/******/\n/******/ // Return the exports of the module\n/******/ return module.exports;\n/******/ }\n/******/\n/******/\n/******/ // expose the modules object (__webpack_modules__)\n/******/ __webpack_require__.m = modules;\n/******/\n/******/ // expose the module cache\n/******/ __webpack_require__.c = installedModules;\n/******/\n/******/ // define getter function for harmony exports\n/******/ __webpack_require__.d = function(exports, name, getter) {\n/******/ if(!__webpack_require__.o(exports, name)) {\n/******/ Object.defineProperty(exports, name, {\n/******/ configurable: false,\n/******/ enumerable: true,\n/******/ get: getter\n/******/ });\n/******/ }\n/******/ };\n/******/\n/******/ // getDefaultExport function for compatibility with non-harmony modules\n/******/ __webpack_require__.n = function(module) {\n/******/ var getter = module && module.__esModule ?\n/******/ function getDefault() { return module['default']; } :\n/******/ function getModuleExports() { return module; };\n/******/ __webpack_require__.d(getter, 'a', getter);\n/******/ return getter;\n/******/ };\n/******/\n/******/ // Object.prototype.hasOwnProperty.call\n/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ // __webpack_public_path__\n/******/ __webpack_require__.p = \"\";\n/******/\n/******/ // Load entry module and return exports\n/******/ return __webpack_require__(__webpack_require__.s = 14);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"path\");\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__export(__webpack_require__(32));\n__export(__webpack_require__(33));\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__export(__webpack_require__(3));\n__export(__webpack_require__(29));\n__export(__webpack_require__(5));\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fs = __webpack_require__(16);\nexports.fs = fs;\nconst glob = __webpack_require__(17);\nexports.glob = glob;\nconst hogan = __webpack_require__(18);\nexports.hogan = hogan;\nconst _l = __webpack_require__(19);\nconst _s = __webpack_require__(20);\nconst which = __webpack_require__(21);\nexports.which = which;\nconst uuid = __webpack_require__(22);\nexports.uuid = uuid;\nconst chalk_1 = __webpack_require__(23);\nexports.chalk = chalk_1.default;\nconst semverRegex = __webpack_require__(24);\nexports.semverRegex = semverRegex;\nconst cli_spinner_1 = __webpack_require__(25);\nexports.Spinner = cli_spinner_1.Spinner;\nconst $ = (() => {\n const _window = (() => {\n const jsdom = __webpack_require__(26);\n if (\"function\" === typeof jsdom.JSDOM) {\n return new jsdom.JSDOM().window;\n }\n else {\n return jsdom.jsdom().defaultView;\n }\n })();\n // patch scope:\n ((root) => {\n /*\n * jsdom 9.4.0 - 9.12.0 に実装されている DOMParser は XML の serialize ができないため,\n * xmldom に置き換える\n * jsdom 10.1.0 まで動かないことを確認\n */\n const xmldom = __webpack_require__(27);\n root.DOMParser = xmldom.DOMParser;\n // xmldom には dom.toString() が実装されているが、global にも export する\n global.XMLSerializer = root.XMLSerializer = xmldom.XMLSerializer;\n })(_window);\n return __webpack_require__(28)(_window);\n})();\nexports.$ = $;\nconst _m = _l.mixin(_s.exports());\nexports._ = _m;\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"os\");\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = __webpack_require__(0);\nconst libs_1 = __webpack_require__(3);\nlet _settings = {\n force: false,\n verbose: false,\n silent: false,\n lang: \"en-US\",\n};\nlet _libPath; // cdp-lib の存在している path\n///////////////////////////////////////////////////////////////////////\n// exports methods:\n/**\n * 設定取得\n *\n * @returns options ログに使用するオプション\n */\nfunction getSettings() {\n return libs_1.$.extend({}, _settings);\n}\nexports.getSettings = getSettings;\n/**\n * 設定指定\n *\n * @param options ログに使用するオプション\n */\nfunction setSettings(settings) {\n if (settings) {\n _settings.force = settings.force || _settings.force;\n _settings.verbose = settings.verbose || _settings.verbose;\n _settings.silent = settings.silent || _settings.silent;\n _settings.targetDir = settings.targetDir || _settings.targetDir;\n _settings.lang = settings.lang || _settings.lang;\n }\n else {\n _settings = {\n force: false,\n verbose: false,\n silent: false,\n lang: \"en-US\",\n };\n }\n}\nexports.setSettings = setSettings;\n/**\n * \"cdp-lib\" が存在するパスを取得\n *\n * @returns cdp-lib への path\n */\nfunction getLibPath() {\n if (null == _libPath) {\n const TRY_COUNT = 3;\n let tried = 0;\n _libPath = __dirname;\n while (true) {\n if (TRY_COUNT <= tried) {\n throw Error(\"lib path is not resolved.\");\n }\n _libPath = path.join(_libPath, \"..\");\n const check = path.join(_libPath, \"cdp-lib\");\n if (libs_1.fs.pathExistsSync(check)) {\n _libPath = check;\n break;\n }\n tried++;\n }\n }\n return _libPath;\n}\nexports.getLibPath = getLibPath;\n/**\n * 指定された targetDir を取得\n *\n * @returns targetDir への path\n */\nfunction getTargetDir() {\n return _settings.targetDir;\n}\nexports.getTargetDir = getTargetDir;\n/**\n * ログ出力\n * console.log() と同等\n *\n * @param message 出力メッセージ\n * @param optionalParams 付加情報\n */\nfunction log(message, ...optionalParams) {\n if (!_settings.silent) {\n if (0 < optionalParams.length) {\n console.log(message, optionalParams);\n }\n else {\n console.log(message);\n }\n }\n}\nexports.log = log;\n/**\n * 詳細ログ出力\n * console.debug() と同等\n *\n * @param message 出力メッセージ\n * @param optionalParams 付加情報\n */\nfunction debug(message, ...optionalParams) {\n if (!_settings.silent && _settings.verbose) {\n if (0 < optionalParams.length) {\n console.error(\"DEBUG: \" + message, optionalParams);\n }\n else {\n console.error(\"DEBUG: \" + message);\n }\n }\n}\nexports.debug = debug;\n/**\n * 検証\n * console.assert() と同等\n *\n * @param test 検証する式\n * @param message 出力メッセージ\n * @param optionalParams 付加情報\n */\nfunction assert(test, message, ...optionalParams) {\n if (!test) {\n if (_settings.force) {\n if (0 < optionalParams.length) {\n console.warn(message, optionalParams);\n }\n else {\n console.warn(message);\n }\n }\n else {\n if (0 < optionalParams.length) {\n console.error(message, optionalParams);\n }\n else {\n console.error(message);\n }\n process.exit(1);\n }\n }\n}\nexports.assert = assert;\nlet _lang;\n/**\n * ローカライズ\n *\n * @param key キー文字列\n * @returns 翻訳された文字列\n */\nfunction translate(key) {\n if (!_lang) {\n try {\n _lang = JSON.parse(libs_1.fs.readFileSync(path.join(getLibPath(), \"res/locales\", \"messages.\" + _settings.lang + \".json\"), \"utf8\").toString());\n }\n catch (error) {\n throw Error(\"Language resource JSON parse error: \" + error.message);\n }\n }\n let resouce = libs_1.$.extend({}, _lang);\n const props = key.split(\".\");\n while (0 < props.length) {\n const prop = props.shift();\n if (resouce[prop]) {\n resouce = resouce[prop];\n }\n else {\n assert(false, \"resouce not found. key: \" + key);\n return null;\n }\n }\n return resouce;\n}\nexports.translate = translate;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst generator_module_1 = __webpack_require__(7);\n__export(__webpack_require__(7));\n/**\n * generator 生成関数\n */\nfunction newGeneratorLibrary(config) {\n return new generator_module_1.GeneratorModule(config);\n}\nexports.newGeneratorLibrary = newGeneratorLibrary;\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = __webpack_require__(0);\nconst os = __webpack_require__(4);\nconst base_1 = __webpack_require__(1);\nconst fs = base_1.Utils.fs;\nconst glob = base_1.Utils.glob;\nconst $ = base_1.Utils.$;\nconst _ = base_1.Utils._;\nconst debug = base_1.Utils.debug;\nconst templatePath = base_1.Utils.templatePath;\nconst copyTpl = base_1.Utils.copyTpl;\n/**\n * @class GeneratorModule\n * @brief Library Module 用 Generator クラス\n */\nclass GeneratorModule extends base_1.GeneratorBase {\n ///////////////////////////////////////////////////////////////////////\n // imprementes: GeneratorBase\n /**\n * 既定の directory 構造を返却\n */\n defaultBaseStructure() {\n return {\n src: \"src\",\n pkg: \"dist\",\n built: \"built\",\n doc: \"docs\",\n task: \"tasks\",\n test: \"tests\",\n types: \"@types\",\n temp: \".temp\",\n };\n }\n /**\n * create action entry\n * @param {ILibraryConfigration} config コンフィグ設定\n */\n create() {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.ensureModuleProps();\n yield this.createDirectoryStructure();\n yield this.createProjectSettings();\n yield this.createSourceTemplate();\n yield this.createVisualStudioSolution();\n });\n }\n /**\n * 必要とする task script 一覧を返却. action: create のときに呼ばれる\n */\n get taskList() {\n return [\n \"banner.js\",\n \"clean.js\",\n \"srcmap.js\",\n \"bundle-finalizer.js\",\n \"remap-coverage.js\",\n ];\n }\n ///////////////////////////////////////////////////////////////////////\n // protected methods:\n /**\n * 開発時の依存モジュールリストの取得\n * 必要に応じてオーバーライド\n *\n * @return {IDependency}\n */\n get defaultDevDependencies() {\n const depends = super.defaultDevDependencies.concat([\n { name: \"@types/jasmine\", version: undefined, },\n { name: \"dts-bundle\", version: undefined, },\n { name: \"typescript-formatter\", version: undefined, },\n ]);\n const extra = [];\n if (this.config.nodejs) {\n extra.push({ name: \"jasmine-node\", version: \"^2.0.0\", });\n }\n else {\n extra.push({ name: \"requirejs\", version: undefined, });\n }\n return _.sortBy(depends.concat(extra), (depend) => depend.name);\n }\n ///////////////////////////////////////////////////////////////////////\n // private methods:\n /**\n * configration にアクセス\n */\n get config() {\n return this._config;\n }\n /**\n * module 名, main ファイル名の保証\n * - 1: moduleName が指定されている場合は使用する\n * - 2: projectName が使用可能な場合はそれを使用する\n * - 3: projectName が使用不可の場合は、\"-\" つなぎ文字列を生成する\n */\n ensureModuleProps() {\n // module name\n if (null == this.config.moduleName) {\n if (!/^.*[(\\\\|\\s|/|:|*|?|\"|<|>||)].*$/.test(this.config.projectName)) {\n this.config.moduleName = this.config.projectName;\n }\n else {\n this.config.moduleName = _.trim(_.dasherize(this.config.projectName), \"-\");\n }\n }\n debug(\"moduleName: \" + this.config.moduleName);\n // main file name\n if (null == this.config.mainBaseName) {\n this.config.mainBaseName = this.config.moduleName;\n }\n debug(\"mainBaseName: \" + this.config.mainBaseName);\n }\n /**\n * ディレクトリ構成情報のコピー\n */\n createDirectoryStructure() {\n this.copyTplDir(\"library/structure\");\n }\n /**\n * プロジェクト設定ファイルの作成\n */\n createProjectSettings() {\n return __awaiter(this, void 0, void 0, function* () {\n // project.config.js\n copyTpl(path.join(templatePath(\"library\"), \"_project.config.js\"), path.join(this.rootDir, \"project.config.js\"), this._config, { delimiters: \"<% %>\" });\n // tsconfig\n if (!this.config.outputSameDir) {\n // main tsconfig.json\n copyTpl(path.join(templatePath(\"library\"), \"_tsconfig.json\"), path.join(this.rootDir, \"tsconfig.json\"), this._config, { delimiters: \"<% %>\", bom: false, });\n // test tsconfig.json\n copyTpl(path.join(templatePath(\"library\"), \"_tsconfig.test.json\"), path.join(this.rootDir, this._config.structureConfig.test, \"unit\", \"tsconfig.json\"), this._config, { delimiters: \"<% %>\", bom: false, });\n }\n else {\n // main tsconfig.json\n copyTpl(path.join(templatePath(\"library\"), \"_tsconfig.output-same-dir.json\"), path.join(this.rootDir, \"tsconfig.json\"), this._config, { delimiters: \"<% %>\", bom: false, });\n }\n // eslintrc.json\n copyTpl(path.join(templatePath(\"library\"), \"_eslintrc.json\"), path.join(this.rootDir, this._config.structureConfig.test, \"eslint\", \"eslintrc.json\"), this.queryEsLintEnvParam(), { delimiters: \"<% %>\", bom: false, });\n // testem\n if (!this.config.nodejs) {\n copyTpl(path.join(templatePath(\"library/tools/testem\"), \"_testem.json\"), path.join(this.rootDir, this._config.structureConfig.test, \"runner\", \"testem.json\"), this._config, { delimiters: \"<% %>\", bom: false, });\n const testemStuffPath = templatePath(\"library/tools/testem/runner\");\n glob.sync(\"**\", {\n cwd: testemStuffPath,\n nodir: true,\n })\n .forEach((file) => {\n fs.copySync(path.join(testemStuffPath, file), path.join(this.rootDir, this._config.structureConfig.test, \"runner\", file));\n });\n }\n // .gitignore\n copyTpl(path.join(templatePath(\"library\"), \"_gitignore\"), path.join(this.rootDir, \".gitignore\"), this._config, { bom: false, });\n // README.md\n copyTpl(path.join(templatePath(\"library\"), \"_README.md\"), path.join(this.rootDir, \"README.md\"), this._config, { delimiters: \"<% %>\" });\n // package.json\n this.config.devDependencies = yield this.queryDependenciesParam(this.config.devDependencies || this.defaultDevDependencies);\n copyTpl(path.join(templatePath(\"library\"), \"_package.json\"), path.join(this.rootDir, \"package.json\"), this._config, { delimiters: \"<% %>\", bom: false, });\n });\n }\n /**\n * ソースの雛形作成\n */\n createSourceTemplate() {\n return __awaiter(this, void 0, void 0, function* () {\n const _module = path.basename(this._config.moduleName, \".js\");\n const param = {\n sampleClass: _.classify(_module),\n sampleModule: _module,\n built: this._config.structureConfig.built,\n };\n const script = (() => {\n if (this._config.structureConfig.srcConfig) {\n return this._config.structureConfig.srcConfig.script || \"\";\n }\n return \"\";\n })();\n // index.ts\n copyTpl(path.join(templatePath(\"library\"), \"src\", \"_index.ts\"), path.join(this.rootDir, this._config.structureConfig.src, script, _module + \".ts\"), param, { delimiters: \"<% %>\" });\n // index.spec.ts\n copyTpl(path.join(templatePath(\"library\"), \"src\", \"_index.spec.ts\"), path.join(this.rootDir, this._config.structureConfig.test, \"unit\", _module + \".spec.ts\"), param, { delimiters: \"<% %>\" });\n });\n }\n /**\n * Visual Studio のソリューションファイル作成\n */\n createVisualStudioSolution() {\n return __awaiter(this, void 0, void 0, function* () {\n const vsParam = (() => {\n const createGUID = base_1.Utils.createGUID;\n const param = $.extend({}, this._config.structureConfig);\n param.projectName = this._config.projectName;\n param.projectGUID = createGUID();\n param.types = param.types.replace(\"@\", \"%40\"); // escape \"@\" to \"%40\"\n param.mainBaseName = this._config.mainBaseName;\n param.license = !this._config.private;\n // tools\n param.webpack = this.isEnableTool(\"webpack\");\n param.testem = !this.config.nodejs;\n param.outputSameDir = this.config.outputSameDir;\n // setup built js group\n param.jsGroup = [];\n if (!param.outputSameDir) {\n param.jsGroup.push({\n relativePath: param.built + \"\\\\\",\n fileName: param.mainBaseName,\n dependee: true,\n d_ts: true,\n map: true,\n min_map: false,\n });\n }\n if (this.config.minify) {\n // setup pkg group\n param.jsGroup.push({\n relativePath: param.pkg + \"\\\\\",\n fileName: param.mainBaseName,\n dependee: false,\n d_ts: false,\n map: false,\n min_map: true,\n });\n }\n // setup test js group\n param.tsGroup = [\n {\n relativePath: param.test + \"\\\\unit\\\\\",\n fileName: param.mainBaseName + \".spec\",\n dependee: true,\n map: this.config.outputSameDir,\n },\n ];\n if (param.outputSameDir) {\n param.tsGroup.push({\n relativePath: param.built + \"\\\\\",\n fileName: param.mainBaseName,\n dependee: false,\n map: true,\n });\n }\n return param;\n })();\n // .sln\n copyTpl(path.join(templatePath(\"base/visual.studio\"), \"_solution.sln.tpl\"), path.join(this.rootDir, vsParam.projectName + \".sln\"), vsParam, { delimiters: \"<% %>\" });\n // .csproj\n (() => {\n const toXmlString = (file) => {\n const hogan = base_1.Utils.hogan;\n const normalizeText = base_1.Utils.normalizeText;\n const options = {\n eol: os.EOL,\n bom: true,\n delimiters: \"{{ }}\",\n };\n const tpl = path.join(templatePath(\"base/visual.studio\"), file);\n const jst = hogan.compile(normalizeText(fs.readFileSync(tpl).toString(), { eol: \"\\n\", bom: false }), options);\n return jst.render(vsParam);\n };\n const toXmlDOM = (file) => {\n return $($.parseXML(toXmlString(file)));\n };\n const toXmlNode = (file) => {\n return base_1.Utils.str2XmlNode(toXmlString(file));\n };\n const $proj = toXmlDOM(\"_project.csproj.tpl\");\n const $gpTS = toXmlNode(\"_ts.item.group.tpl\");\n const $gpJS = toXmlNode(\"_js.item.group.tpl\");\n $proj\n .find(\"ItemGroup\")\n .last()\n .after($gpTS)\n .after($gpJS);\n const formatXML = base_1.Utils.formatXML;\n const dstPath = path.join(this.rootDir, vsParam.projectName + \".csproj\");\n debug(base_1.Utils.xmlNode2Str($proj));\n fs.writeFileSync(dstPath, formatXML(base_1.Utils.xmlNode2Str($proj)));\n })();\n });\n }\n}\nexports.GeneratorModule = GeneratorModule;\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst generator_cordova_1 = __webpack_require__(9);\n__export(__webpack_require__(9));\n/**\n * generator 生成関数\n */\nfunction newGeneratorMobile(config) {\n return new generator_cordova_1.GeneratorCordova(config);\n}\nexports.newGeneratorMobile = newGeneratorMobile;\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = __webpack_require__(0);\nconst os = __webpack_require__(4);\nconst utils_1 = __webpack_require__(2);\nconst base_1 = __webpack_require__(1);\n/**\n * @class GeneratorCordova\n * @brief Mobile Cordova 用 Generator クラス\n */\nclass GeneratorCordova extends base_1.GeneratorBase {\n ///////////////////////////////////////////////////////////////////////\n // imprementes: GeneratorBase\n /**\n * 既定の directory 構造を返却\n */\n defaultBaseStructure() {\n return {\n src: \"app\",\n pkg: \"www\",\n built: \"app\",\n doc: \"docs\",\n task: \"tasks\",\n test: \"tests\",\n types: \"@types\",\n temp: \".temp\",\n lib: \"lib\",\n external: \"external\",\n porting: \"porting\",\n res: \"res\",\n srcConfig: {\n script: \"scripts\",\n stylesheet: \"stylesheets\",\n template: \"templates\",\n },\n };\n }\n /**\n * create action entry\n * @param {ILibraryConfigration} config コンフィグ設定\n */\n create() {\n return __awaiter(this, void 0, void 0, function* () {\n utils_1.debug(JSON.stringify(this.config, null, 4));\n if (this.isEnableCordova()) {\n yield this.chdir(this.rootDir);\n yield this.createCordovaScaffold();\n yield this.updateConfigXML();\n yield this.addCordovaPlatforms();\n yield this.addCordovaPlugins();\n yield this.addCordovaExtentionFiles();\n yield this.cacheCordovaPackageJSON();\n yield this.chdir(\"..\");\n }\n yield this.createDirectoryStructure();\n yield this.createProjectSettings();\n yield this.createSourceTemplate();\n yield this.createVisualStudioSolution();\n });\n }\n /**\n * 必要とする task script 一覧を返却. action: create のときに呼ばれる\n */\n get taskList() {\n return [\n \"banner.js\",\n \"clean.js\",\n \"command.js\",\n \"external-rearrange.js\",\n \"minify.js\",\n \"srcmap.js\",\n \"bundle-finalizer.js\",\n \"remap-coverage.js\",\n ];\n }\n ///////////////////////////////////////////////////////////////////////\n // protected methods:\n /**\n * 開発時の依存モジュールリストの取得\n * 必要に応じてオーバーライド\n *\n * @return {IDependency}\n */\n get defaultDevDependencies() {\n const depends = super.defaultDevDependencies.concat([\n { name: \"@types/jasmine\", version: undefined, },\n { name: \"@types/requirejs\", version: undefined, },\n { name: \"autoprefixer\", version: undefined, },\n { name: \"clean-css\", version: undefined, },\n { name: \"fs-extra\", version: undefined, },\n { name: \"html-minifier\", version: undefined, },\n { name: \"node-sass\", version: undefined, },\n { name: \"postcss-cli\", version: undefined, },\n { name: \"smartwatch\", version: undefined, },\n ]);\n const extra = [];\n this.config.devDependencies.forEach((depend) => {\n extra.push({ name: depend.name, version: depend.version, });\n });\n if (this.isEnableCordova()) {\n extra.push({ name: \"@types/cordova\", version: undefined, });\n }\n return utils_1._.sortBy(depends.concat(extra), (depend) => depend.name);\n }\n /**\n * eslintrc に指定する template paramaeter を取得\n *\n * @return {Object} テンプレートパラメータオブジェクト\n */\n queryEsLintEnvParam() {\n const base = super.queryEsLintEnvParam();\n return Object.assign({}, base, {\n cordova: this.isEnableCordova(),\n hammerjs: this.isInstallationTarget(\"hammerjs\"),\n iscroll: this.isInstallationTarget(\"iscroll\"),\n flipsnap: this.isInstallationTarget(\"flipsnap\"),\n });\n }\n /**\n * tsconfig.base に指定する template paramaeter を取得\n *\n * @return {Object} テンプレートパラメータオブジェクト\n */\n queryTsConfigBaseParam() {\n return Object.assign({}, this._config, {\n cordova: this.isEnableCordova(),\n });\n }\n ///////////////////////////////////////////////////////////////////////\n // private methods:\n /**\n * 開発時の依存モジュールリストの取得\n * 必要に応じてオーバーライド\n *\n * @return {IDependency}\n */\n get defaultDependencies() {\n const depends = [\n { name: \"@cdp/mobile\", version: undefined, },\n { name: \"backbone\", version: undefined, },\n { name: \"jquery\", version: undefined, },\n { name: \"requirejs\", version: undefined, },\n { name: \"underscore\", version: undefined, },\n ];\n const extra = [];\n this.config.dependencies.forEach((depend) => {\n extra.push({ name: depend.name, version: depend.version, });\n });\n return utils_1._.sortBy(depends.concat(extra), (depend) => depend.name);\n }\n /**\n * configration にアクセス\n */\n get config() {\n return this._config;\n }\n /**\n * cordova の有効/無効チェック\n *\n * @returns true: 有効 / false: 無効\n */\n isEnableCordova() {\n return (0 < this.config.platforms.length);\n }\n /**\n * lib/porting の設定状況のチェック\n *\n * @param target\n * @returns true: 設定 / false: 未設定\n */\n hasStructureOf(target) {\n return (this.config.projectStructure && 0 <= this.config.projectStructure.indexOf(target));\n }\n /**\n * インストール対象/非対象チェック\n *\n * @param name [in] モジュール名\n * @param depends [in] 検索対象 (既定 this.config.dependencies)\n * @returns true: 対象 / false: 非対象\n */\n isInstallationTarget(name, depends = this.config.dependencies) {\n return !!depends.find((depend) => name === depend.name);\n }\n //___________________________________________________________________________________________________________________//\n /**\n * cordova を用いたプロジェクト作成\n */\n createCordovaScaffold() {\n return __awaiter(this, void 0, void 0, function* () {\n this.progress(\"mobile.create.cordova.createCordovaScaffold\");\n utils_1.debug(\"createCordovaScaffold\");\n // `$ cordova create cool-mobile com.sony.cdp.coolmobile \"Cool Mobile\"`\n yield utils_1.execCommand(\"cordova\", [\"create\", this.config.projectName, this.config.appId, this.config.appName]);\n // remove files\n utils_1.glob.sync(\"www/**/*\", {\n cwd: this.config.projectName,\n }).forEach((file) => {\n utils_1.fs.removeSync(path.join(this.config.projectName, file));\n });\n utils_1.fs.removeSync(path.join(this.config.projectName, \"res\"));\n utils_1.fs.removeSync(path.join(this.config.projectName, \".npmignore\"));\n // move root directory\n utils_1.fs.copySync(this.config.projectName, \"./\");\n utils_1.fs.removeSync(this.config.projectName);\n });\n }\n /**\n * config.xml の修正\n */\n updateConfigXML() {\n return __awaiter(this, void 0, void 0, function* () {\n this.progress(\"mobile.create.cordova.updateConfigXml\");\n utils_1.debug(\"updateConfigXML\");\n const configXmlPath = path.join(process.cwd(), \"config.xml\");\n const $configXmlDom = utils_1.$(utils_1.str2XmlNode(utils_1.fs.readFileSync(configXmlPath).toString()));\n $configXmlDom\n .find(\"widget\")\n .attr(\"version\", this.config.version)\n .attr(\"ios-CFBundleIdentifier\", this.config.appId)\n .prepend(utils_1.str2XmlNode(`\n \n \n \n `));\n // remove cordova team information\n $configXmlDom\n .find(\"description\")\n .remove();\n $configXmlDom\n .find(\"author\")\n .remove();\n utils_1.fs.writeFileSync(configXmlPath, utils_1.formatXML(utils_1.xmlNode2Str($configXmlDom)));\n });\n }\n /**\n * platform 追加\n */\n addCordovaPlatforms() {\n return __awaiter(this, void 0, void 0, function* () {\n utils_1.debug(\"addCordovaPlatforms\");\n const targets = this.config.platforms.slice();\n const index = targets.indexOf(\"ios\");\n if (0 <= index && \"darwin\" !== process.platform) {\n this.warn(\"mobile.create.cordova.iOSWarning\");\n targets.splice(index, 1);\n if (targets.length <= 0) {\n return Promise.resolve();\n }\n }\n this.progress(\"mobile.create.cordova.addPlatforms\");\n // `$ cordova platform add android ios`\n yield utils_1.execCommand(\"cordova\", [\"platform\", \"add\"].concat(targets));\n });\n }\n /**\n * plugin 追加\n */\n addCordovaPlugins() {\n return __awaiter(this, void 0, void 0, function* () {\n this.progress(\"mobile.create.cordova.addPlugins\");\n utils_1.debug(\"addCordovaPlugins\");\n /*\n * I/F は複数のプラグインを一括で追加することが可能だが、\n * cordova version を判定しているプラグインは誤判定することがあるため、\n * 1つずつ追加する\n *\n * 以下の不具合に類似する現象\n * https://issues.apache.org/jira/browse/CB-12663\n */\n for (let i = 0, n = this.config.cordova_plugin.length; i < n; i++) {\n // `$ cordova plugin add cordova-plugin-inappbrowser`\n yield utils_1.execCommand(\"cordova\", [\"plugin\", \"add\", this.config.cordova_plugin[i].name]);\n }\n });\n }\n /**\n * cordova project に追加するリソースをコピー\n */\n addCordovaExtentionFiles() {\n return __awaiter(this, void 0, void 0, function* () {\n this.progress(\"mobile.create.cordova.addExtensions\");\n utils_1.debug(\"addCordovaExtentionFiles\");\n this.copyTplDir(\"mobile/cordova\");\n });\n }\n /**\n * cordova が生成した package.json をキャッシュ\n */\n cacheCordovaPackageJSON() {\n return __awaiter(this, void 0, void 0, function* () {\n if (utils_1.fs.existsSync(\"./package.json\")) {\n this.config.cordovaPackageJson = JSON.parse(utils_1.fs.readFileSync(\"./package.json\").toString());\n // remove cordova team information\n delete this.config.cordovaPackageJson.name;\n delete this.config.cordovaPackageJson.version;\n delete this.config.cordovaPackageJson.displayName;\n delete this.config.cordovaPackageJson.main;\n delete this.config.cordovaPackageJson.scripts;\n delete this.config.cordovaPackageJson.author;\n delete this.config.cordovaPackageJson.description;\n delete this.config.cordovaPackageJson.license;\n // ファイルはいったん削除\n utils_1.fs.removeSync(\"./package.json\");\n }\n });\n }\n //___________________________________________________________________________________________________________________//\n /**\n * ディレクトリ構成情報のコピー\n */\n createDirectoryStructure() {\n this.progress(\"mobile.create.app.createDirectoryStructure\");\n utils_1.debug(\"createDirectoryStructure\");\n // app base structure\n this.copyTplDir(\"mobile/structure/base\");\n // lib\n if (this.hasStructureOf(\"lib\")) {\n this.copyTplDir(\"mobile/structure/lib\", path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.lib));\n }\n // porting\n if (this.hasStructureOf(\"porting\")) {\n this.copyTplDir(\"mobile/structure/porting\", path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.porting));\n // create: dev/porting/@types\n utils_1.fs.copySync(utils_1.templatePath(\"base/.gitkeep\"), path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.porting, this.config.structureConfig.types, \".gitkeep\"));\n const PLATFORMS_ROOT = path.join(this.rootDir, \"platforms\");\n utils_1.fs.readdirSync(PLATFORMS_ROOT)\n .forEach((platform) => {\n if (utils_1.fs.statSync(path.join(PLATFORMS_ROOT, platform)).isDirectory()) {\n this.copyTplDir(\"mobile/structure/porting\", path.join(PLATFORMS_ROOT, platform, this.config.structureConfig.porting));\n }\n });\n }\n // www\n const WWW = path.join(this.rootDir, this.config.structureConfig.pkg);\n if (!utils_1.fs.existsSync(WWW)) {\n utils_1.fs.mkdir(WWW);\n }\n utils_1.fs.copySync(utils_1.templatePath(\"base/.gitkeep\"), path.join(WWW, \".gitkeep\"));\n // task\n utils_1.glob.sync(\"**/*\", {\n cwd: utils_1.templatePath(\"mobile/task\"),\n }).forEach((file) => {\n utils_1.fs.copySync(path.join(utils_1.templatePath(\"mobile/task\"), file), path.join(this.rootDir, this.config.structureConfig.task, file));\n });\n }\n /**\n * プロジェクト設定ファイルの作成\n */\n createProjectSettings() {\n return __awaiter(this, void 0, void 0, function* () {\n this.progress(\"mobile.create.app.createProjectSettings\");\n utils_1.debug(\"createProjectSettings\");\n // project.config.js\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile\"), \"_project.config.js\"), path.join(this.rootDir, \"project.config.js\"), utils_1.$.extend({}, this._config, {\n hogan: this.isInstallationTarget(\"hogan.js\"),\n hammerjs: this.isInstallationTarget(\"hammerjs\"),\n iscroll: this.isInstallationTarget(\"iscroll\"),\n }), { delimiters: \"<% %>\" });\n // tsconfig\n // tsconfig.base.json\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile\"), \"_tsconfig.base.json\"), path.join(this.rootDir, \"tsconfig.base.json\"), this.queryTsConfigBaseParam(), { delimiters: \"<% %>\", bom: false, });\n // main tsconfig.json\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile\"), \"_tsconfig.json\"), path.join(this.rootDir, \"tsconfig.json\"), this._config, { delimiters: \"<% %>\", bom: false, });\n // eslintrc.json\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile\"), \"_eslintrc.json\"), path.join(this.rootDir, this._config.structureConfig.test, \"eslint\", \"eslintrc.json\"), this.queryEsLintEnvParam(), { delimiters: \"<% %>\", bom: false, });\n // testem\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile/tools/testem\"), \"_testem.json\"), path.join(this.rootDir, this._config.structureConfig.test, \"runner\", \"testem.json\"), this._config, { delimiters: \"<% %>\", bom: false, });\n const testemStuffPath = utils_1.templatePath(\"mobile/tools/testem/runner\");\n utils_1.glob.sync(\"**\", {\n cwd: testemStuffPath,\n nodir: true,\n })\n .forEach((file) => {\n utils_1.fs.copySync(path.join(testemStuffPath, file), path.join(this.rootDir, this._config.structureConfig.test, \"runner\", file));\n });\n // .gitignore\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile\"), \"_gitignore\"), path.join(this.rootDir, \".gitignore\"), this._config, { bom: false, });\n // README.md\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile\"), \"_README.md\"), path.join(this.rootDir, \"README.md\"), utils_1.$.extend({}, this._config, {\n cordova: this.isEnableCordova(),\n lib: this.hasStructureOf(\"lib\"),\n porting: this.hasStructureOf(\"porting\"),\n }), { delimiters: \"<% %>\" });\n // TODO: templates/mobile/addon からコピーする場合はここで対応\n // package.json\n const resolvedConfig = utils_1.$.extend(true, {}, this.config);\n resolvedConfig.dependencies = yield this.queryDependenciesParam(this.defaultDependencies);\n resolvedConfig.devDependencies = yield this.queryDependenciesParam(this.defaultDevDependencies);\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile\"), \"_package.json\"), path.join(this.rootDir, \"package.json\"), resolvedConfig, { delimiters: \"<% %>\", bom: false, });\n // cordovaPackageJSON とマージ\n if (this.config.cordovaPackageJson) {\n const PKG_PATH = path.join(this.rootDir, \"package.json\");\n const pkg = JSON.parse(utils_1.fs.readFileSync(PKG_PATH).toString());\n utils_1.$.extend(true, pkg, this.config.cordovaPackageJson);\n const sortKeys = (target) => {\n const sorted = {};\n Object.keys(target).sort().forEach((key) => {\n sorted[key] = target[key];\n });\n return sorted;\n };\n pkg.dependencies = sortKeys(pkg.dependencies);\n pkg.devDependencies = sortKeys(pkg.devDependencies);\n utils_1.fs.writeFileSync(PKG_PATH, JSON.stringify(pkg, null, 2));\n }\n });\n }\n /**\n * ソースの雛形作成\n */\n createSourceTemplate() {\n return __awaiter(this, void 0, void 0, function* () {\n this.progress(\"mobile.create.app.createSourceTemplate\");\n utils_1.debug(\"createSourceTemplate\");\n // copy sources\n this.copyTplDir(\"mobile/src/structure\", path.join(this.rootDir));\n {\n const additional = (() => {\n if (this.config.dependencies.length < 0) {\n return null;\n }\n const param = {\n additional: {\n list: [],\n listWithCustomName: [],\n },\n };\n const targets = [...this.config.dependencies, ...this.config.resource_addon];\n targets.forEach((info) => {\n if (info.fileName || info.venderName) {\n param.additional.listWithCustomName.push({\n moduleName: info.alias || info.name,\n venderName: info.venderName || info.alias || info.name,\n fileName: info.fileName || info.alias || info.name,\n });\n }\n else {\n param.additional.list.push({\n moduleName: info.alias || info.name,\n });\n }\n });\n return param;\n })();\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile/src\"), \"_config.ts\"), path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.srcConfig.script, \"config.ts\"), utils_1.$.extend({}, this._config, additional), { delimiters: \"<% %>\" });\n }\n {\n const globals = (() => {\n if (this.config.dependencies.length < 0) {\n return null;\n }\n const param = {\n globals: {\n importsList: [],\n exportsList: [],\n hasExports: false,\n },\n };\n const targets = [...this.config.dependencies, ...this.config.resource_addon];\n targets.forEach((info) => {\n if (info.globalExport) {\n param.globals.exportsList.push({\n globalExport: info.globalExport,\n moduleName: info.alias || info.name,\n });\n }\n else {\n param.globals.importsList.push({\n moduleName: info.alias || info.name,\n });\n }\n });\n param.globals.hasExports = (0 < param.globals.exportsList.length);\n return param;\n })();\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile/src\"), \"_app.ts\"), path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.srcConfig.script, \"app.ts\"), globals, { delimiters: \"<% %>\" });\n }\n {\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile/src/_locales\"), \"_messages.en-US.json\"), path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.res, \"locales\", \"messages.en-US.json\"), this.config, { delimiters: \"<% %>\", bom: false, });\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile/src/_locales\"), \"_messages.ja-JP.json\"), path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.res, \"locales\", \"messages.ja-JP.json\"), this.config, { delimiters: \"<% %>\", bom: false, });\n // remove .gitkeep\n utils_1.fs.unlinkSync(path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.res, \".gitkeep\"));\n }\n {\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile/src/_patch.dependencies\"), \"_index.d.ts\"), path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.external, this.config.structureConfig.types, \"patch.dependencies\", \"index.d.ts\"), {\n hammerjs: this.isInstallationTarget(\"hammerjs\"),\n flipsnap: this.isInstallationTarget(\"flipsnap\"),\n iscroll: this.isInstallationTarget(\"iscroll\"),\n });\n // copy patch d.ts\n if (this.isInstallationTarget(\"hammerjs\")) {\n utils_1.fs.copySync(utils_1.templatePath(\"mobile/src/_patch.dependencies/jquery.hammer.d.ts\"), path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.external, this.config.structureConfig.types, \"patch.dependencies\", \"jquery.hammer.d.ts\"));\n }\n if (this.isInstallationTarget(\"flipsnap\")) {\n utils_1.fs.copySync(utils_1.templatePath(\"mobile/src/_patch.dependencies/flipsnap.d.ts\"), path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.external, this.config.structureConfig.types, \"patch.dependencies\", \"flipsnap.d.ts\"));\n }\n if (this.isInstallationTarget(\"iscroll\")) {\n utils_1.fs.copySync(utils_1.templatePath(\"mobile/src/_patch.dependencies/iscroll.d.ts\"), path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.external, this.config.structureConfig.types, \"patch.dependencies\", \"iscroll.d.ts\"));\n }\n // remove .gitkeep\n utils_1.fs.unlinkSync(path.join(this.rootDir, this.config.structureConfig.src, this.config.structureConfig.external, this.config.structureConfig.types, \".gitkeep\"));\n }\n {\n utils_1.copyTpl(path.join(utils_1.templatePath(\"mobile/src\"), \"_index.html\"), path.join(this.rootDir, this.config.structureConfig.src, \"index.html\"), this.config);\n }\n });\n }\n /**\n * Visual Studio のソリューションファイル作成\n */\n createVisualStudioSolution() {\n return __awaiter(this, void 0, void 0, function* () {\n const vsParam = (() => {\n const param = utils_1.$.extend({}, this._config.structureConfig);\n param.projectName = this._config.projectName;\n param.projectGUID = utils_1.createGUID();\n param.types = param.types.replace(\"@\", \"%40\"); // escape \"@\" to \"%40\"\n param.license = !this._config.private;\n // external\n param.cordova = this.isEnableCordova();\n param.hogan = this.isInstallationTarget(\"hogan.js\");\n param.hammerjs = this.isInstallationTarget(\"hammerjs\");\n param.iscroll = this.isInstallationTarget(\"iscroll\");\n param.flipsnap = this.isInstallationTarget(\"flipsnap\");\n // project structure\n param.enableLib = this.hasStructureOf(\"lib\");\n param.enablePorting = this.hasStructureOf(\"porting\");\n // platforms\n param.platforms = [...this.config.platforms];\n // setup built ts group\n param.tsGroup = [];\n utils_1.glob.sync(\"**/*.ts\", {\n cwd: path.join(this.rootDir, param.src, param.srcConfig.script),\n }).forEach((file) => {\n const relativePath = path.join(param.src, param.srcConfig.script, path.dirname(file)).replace(/\\//g, \"\\\\\") + \"\\\\\";\n const fileName = path.basename(file, \".ts\");\n param.tsGroup.push({\n relativePath: relativePath,\n fileName: fileName,\n dependee: true,\n map: false,\n });\n });\n // setup test ts group\n utils_1.glob.sync(\"**/*.ts\", {\n cwd: path.join(this.rootDir, this.config.structureConfig.test, \"unit\"),\n }).forEach((file) => {\n const relativePath = param.test + \"\\\\unit\\\\\";\n const fileName = path.basename(file, \".ts\");\n param.tsGroup.push({\n relativePath: relativePath,\n fileName: fileName,\n dependee: true,\n map: false,\n });\n });\n return param;\n })();\n // .sln\n utils_1.copyTpl(path.join(utils_1.templatePath(\"base/visual.studio\"), \"_solution.sln.tpl\"), path.join(this.rootDir, vsParam.projectName + \".sln\"), vsParam, { delimiters: \"<% %>\" });\n // .csproj\n (() => {\n const toXmlString = (file) => {\n const options = {\n eol: os.EOL,\n bom: true,\n delimiters: \"{{ }}\",\n };\n const jst = utils_1.hogan.compile(utils_1.normalizeText(utils_1.fs.readFileSync(file).toString(), { eol: \"\\n\", bom: false }), options);\n return jst.render(vsParam);\n };\n const toXmlDOM = (file) => {\n return utils_1.$(utils_1.$.parseXML(toXmlString(file)));\n };\n const toXmlNode = (file) => {\n return utils_1.str2XmlNode(toXmlString(file));\n };\n const $proj = toXmlDOM(path.join(utils_1.templatePath(\"mobile/visual.studio\"), \"_project.csproj.tpl\"));\n const $gpTS = toXmlNode(path.join(utils_1.templatePath(\"base/visual.studio\"), \"_ts.item.group.tpl\"));\n $proj\n .find(\"ItemGroup\")\n .last()\n .after($gpTS);\n const dstPath = path.join(this.rootDir, vsParam.projectName + \".csproj\");\n utils_1.debug(utils_1.xmlNode2Str($proj));\n utils_1.fs.writeFileSync(dstPath, utils_1.formatXML(utils_1.xmlNode2Str($proj)));\n })();\n // web.config\n utils_1.fs.copySync(utils_1.templatePath(\"mobile/visual.studio/_web.config\"), path.join(this.rootDir, \"web.config\"));\n utils_1.fs.copySync(utils_1.templatePath(\"mobile/visual.studio/_web.Debug.config\"), path.join(this.rootDir, \"web.Debug.config\"));\n utils_1.fs.copySync(utils_1.templatePath(\"mobile/visual.studio/_web.Release.config\"), path.join(this.rootDir, \"web.Release.config\"));\n });\n }\n}\nexports.GeneratorCordova = GeneratorCordova;\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst generator_electoron_1 = __webpack_require__(11);\n__export(__webpack_require__(11));\n/**\n * generator 生成関数\n */\nfunction newGeneratorDesktop(config) {\n return new generator_electoron_1.GeneratorElectron(config);\n}\nexports.newGeneratorDesktop = newGeneratorDesktop;\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/* tslint:disable:no-unused-variable no-unused-vars */\n/* eslint-disable no-unused-vars */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst base_1 = __webpack_require__(1);\n/**\n * @class GeneratorElectron\n * @brief Desktop Electron 用 Generator クラス\n */\nclass GeneratorElectron extends base_1.GeneratorBase {\n ///////////////////////////////////////////////////////////////////////\n // imprementes: GeneratorBase\n /**\n * 既定の directory 構造を返却\n */\n defaultBaseStructure() {\n return {\n src: \"app\",\n pkg: \"www/app\",\n built: \"app\",\n doc: \"docs\",\n task: \"tasks\",\n test: \"tests\",\n types: \"@types\",\n srcConfig: {\n script: \"scripts\",\n stylesheet: \"stylesheets\",\n template: \"templates\",\n },\n };\n }\n /**\n * create action entry\n * @param {IDesktopAppConfigration} config コンフィグ設定\n */\n create() {\n return __awaiter(this, void 0, void 0, function* () {\n // TODO:\n return Promise.reject(\"under construction.\");\n });\n }\n /**\n * 必要とする task script 一覧を返却. action: create のときに呼ばれる\n */\n get taskList() {\n return [\n \"banner.js\",\n \"clean.js\",\n \"srcmap.js\",\n \"build-ts-clean.js\",\n \"build-ts-normalize.js\",\n ];\n }\n ///////////////////////////////////////////////////////////////////////\n // private methods:\n /**\n * configration にアクセス\n */\n get config() {\n return this._config;\n }\n}\nexports.GeneratorElectron = GeneratorElectron;\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst generator_browser_1 = __webpack_require__(13);\n__export(__webpack_require__(13));\n/**\n * generator 生成関数\n */\nfunction newGeneratorWeb(config) {\n return new generator_browser_1.GeneratorBrowser(config);\n}\nexports.newGeneratorWeb = newGeneratorWeb;\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/* tslint:disable:no-unused-variable no-unused-vars */\n/* eslint-disable no-unused-vars */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst base_1 = __webpack_require__(1);\n/**\n * @class GeneratorBrowser\n * @brief Web Browser 用 Generator クラス\n */\nclass GeneratorBrowser extends base_1.GeneratorBase {\n ///////////////////////////////////////////////////////////////////////\n // imprementes: GeneratorBase\n /**\n * 既定の directory 構造を返却\n */\n defaultBaseStructure() {\n return {\n src: \"app\",\n pkg: \"www\",\n built: \"app\",\n doc: \"docs\",\n task: \"tasks\",\n test: \"tests\",\n types: \"@types\",\n };\n }\n /**\n * create action entry\n * @param {ILibraryConfigration} config コンフィグ設定\n */\n create() {\n return __awaiter(this, void 0, void 0, function* () {\n // TODO:\n return Promise.reject(\"under construction.\");\n });\n }\n /**\n * 必要とする task script 一覧を返却. action: create のときに呼ばれる\n */\n get taskList() {\n return [\n \"banner.js\",\n \"clean.js\",\n \"srcmap.js\",\n \"build-ts-clean.js\",\n \"build-ts-normalize.js\",\n ];\n }\n ///////////////////////////////////////////////////////////////////////\n // private methods:\n /**\n * configration にアクセス\n */\n get config() {\n return this._config;\n }\n}\nexports.GeneratorBrowser = GeneratorBrowser;\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(15);\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Utils = __webpack_require__(2);\nexports.Utils = Utils;\nconst generators_1 = __webpack_require__(31);\n//___________________________________________________________________________________________________________________//\n/**\n * @class CDPLib\n * @brief CDP boilerplate 生成機能を提供するクラス\n */\nclass CDPLib {\n ///////////////////////////////////////////////////////////////////////\n // pubic methods:\n /**\n * main command\n */\n static execute(config) {\n Utils.setSettings(config.settings);\n return generators_1.newGenerator(config).run();\n }\n}\nexports.default = CDPLib;\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"fs-extra\");\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"glob\");\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"hogan.js\");\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"lodash\");\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"underscore.string\");\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"which\");\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"uuid\");\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"chalk\");\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"semver-regex\");\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"cli-spinner\");\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"jsdom\");\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"xmldom\");\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"jquery\");\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = __webpack_require__(0);\nconst os = __webpack_require__(4);\nconst child_process_1 = __webpack_require__(30);\nconst libs_1 = __webpack_require__(3);\nconst settings_1 = __webpack_require__(5);\n///////////////////////////////////////////////////////////////////////\n// exports methods:\n/**\n * Handle command line error and kill process.\n * When the application received error from cli, please call this method.\n *\n * @param {String} error error information.\n */\nfunction handleError(error) {\n settings_1.assert(false, error);\n}\nexports.handleError = handleError;\n//___________________________________________________________________________________________________________________//\n/**\n * \"templates\" ディレクトリからのパスを取得.\n *\n * @param {String} target ターゲットを指定. null の場合は、templates を返却\n * @return {String} templates/hogehoge\n */\nfunction templatePath(target) {\n if (null == target) {\n return path.join(settings_1.getLibPath(), \"templates\");\n }\n else {\n return path.join(settings_1.getLibPath(), \"templates\", target);\n }\n}\nexports.templatePath = templatePath;\n//___________________________________________________________________________________________________________________//\n/**\n * Get spinner instance.\n * CLI helper.\n *\n * @param {String} [format] spinner format string.\n * @param {Number} [index] spinner index defined by cli-spinner. (default: random [0-29])\n * @return {Spinner} cli-spinner instance.\n */\nfunction getSpinner(format, index) {\n const spinners = [\n \"|/-\\\\\",\n \"┤┘┴└├┌┬┐\",\n \"◢◣◤◥\",\n \"▌▀▐▄\",\n \"▉▊▋▌▍▎▏▎▍▌▋▊▉\",\n \"▁▃▄▅▆▇█▇▆▅▄▃\",\n \"☱☲☴\",\n \".oO@*\",\n \"◐◓◑◒\",\n ////\n \"◡◡ ⊙⊙ ◠◠\",\n \"■□▪▫\",\n \"←↖↑↗→↘↓↙\",\n \".oO°Oo.\",\n ];\n const fmt = format || \"%s\";\n const spinner = new libs_1.Spinner(fmt);\n const idx = (null != index && 0 <= index && index < 14) ? index : Math.floor(Math.random() * 10);\n spinner.setSpinnerString(spinners[idx]);\n return spinner;\n}\nexports.getSpinner = getSpinner;\n/**\n * Normalize text line-feed.\n * for windows git user.\n *\n * @param {String} text input text.\n * @param {NormalizeTextOptions} [options] option.\n * @return {String} normalized text.\n */\nfunction normalizeText(text, options) {\n const opt = libs_1.$.extend({}, {\n eol: os.EOL,\n bom: true,\n }, options);\n text = text\n .replace(/^\\ufeff/gm, \"\") // remove bom\n .replace(/\\r\\n/gm, \"\\n\") // once \"\\n\"\n .replace(/\\r/gm, \"\\n\");\n if (opt.bom) {\n text = \"\\ufeff\" + text;\n }\n if (\"\\n\" !== opt.eol) {\n text = text.replace(/\\n/gm, opt.eol);\n }\n if (opt.tab) {\n const spaces = (() => {\n let s = \"\";\n for (let i = 0; i < opt.tab; i++) {\n s += \" \";\n }\n return s;\n })();\n text = text.replace(/\\t/gm, spaces);\n }\n return text;\n}\nexports.normalizeText = normalizeText;\n/**\n * Execute command line by spawn.\n * call spawn. if error occured, cui is killed proccess.\n *\n * @param {String} command main command. ex) \"cordova\"\n * @param {String[]} args command args. ex) [\"plugin\", \"add\", pluginName]\n * @param {ExecCommandOptions} [options] cli-spinner\"s options.\n * @returns {Number} error code\n */\nfunction execCommand(command, args, options) {\n return new Promise((resolve, reject) => {\n const opt = libs_1.$.extend({}, {\n stdio: \"inherit\",\n spinner: { format: \"%s\" },\n stdout: (data) => { },\n stderr: (data) => { },\n }, options);\n // on win32, command and args need to be quoted if containing spaces\n const quoteIfNeeded = (str) => {\n if (\"win32\" === os.platform() && str.includes(\" \")) {\n str = \"\\\"\" + str + \"\\\"\";\n opt.shell = true;\n }\n return str;\n };\n libs_1.which(command, (error, resolvedCommand) => {\n if (error) {\n handleError(JSON.stringify(error));\n }\n const spinner = opt.spinner ? getSpinner(opt.spinner.format, opt.spinner.index) : null;\n if (spinner) {\n spinner.start();\n }\n resolvedCommand = quoteIfNeeded(resolvedCommand);\n args = args.map(quoteIfNeeded);\n const child = child_process_1.spawn(resolvedCommand, args, opt)\n .on(\"error\", handleError)\n .on(\"close\", (code) => {\n if (spinner) {\n spinner.stop(true);\n }\n resolve(code);\n });\n if (\"pipe\" === opt.stdio) {\n child.stdout.on(\"data\", (data) => {\n opt.stdout(data.toString());\n });\n child.stderr.on(\"data\", (data) => {\n opt.stderr(data.toString());\n });\n }\n });\n });\n}\nexports.execCommand = execCommand;\n/**\n * Copy template with hogan.\n * sync function\n *\n * @param {String} src source file path.\n * @param {String} dst destination file path.\n * @param {Object} params template parameters.\n * @param {CopyTemplateOptions} [options] options object.\n */\nfunction copyTpl(src, dst, params, options) {\n const opt = libs_1.$.extend({}, {\n eol: os.EOL,\n bom: true,\n delimiters: \"{{ }}\",\n }, options);\n const jst = libs_1.hogan.compile(normalizeText(libs_1.fs.readFileSync(src).toString(), { eol: \"\\n\", bom: false }), opt);\n const output = normalizeText(jst.render(params), opt);\n libs_1.fs.ensureFileSync(dst);\n libs_1.fs.writeFileSync(dst, output, \"utf8\");\n}\nexports.copyTpl = copyTpl;\n//___________________________________________________________________________________________________________________//\n/**\n * GUID generate.\n * returned as Windows registry type format.\n *\n * @return {String}\n */\nfunction createGUID() {\n return \"{\" + libs_1.uuid.v4().toUpperCase() + \"}\";\n}\nexports.createGUID = createGUID;\n//___________________________________________________________________________________________________________________//\n/**\n * Create XML DOM node.\n *\n * @param str string xml format. ex) ''\n * @returns XML Node instance\n */\nfunction str2XmlNode(str) {\n let fullXML = true;\n if (!/'\n * @return {jQuery} XML Node instance\n */\nfunction xmlNode2Str($xml) {\n /* eslint-disable no-undef */\n return new XMLSerializer().serializeToString($xml[0]);\n /* eslint-enable no-undef */\n}\nexports.xmlNode2Str = xmlNode2Str;\n/**\n * XML formatter.\n *\n * @param {String} str string xml format. ex) ''\n * @param {FormatXmlOptions} [options] options object.\n * @return {String} formatted XML\n */\nfunction formatXML(str, options) {\n const opt = libs_1.$.extend({}, {\n eol: os.EOL,\n bom: true,\n step: 2,\n }, options);\n let xml = \"\";\n let pad = 0;\n let indent;\n let node;\n const strArr = normalizeText(str, { eol: \"\\n\" })\n .replace(/(>)(<)(\\/*)/g, \"$1\\n$2$3\") // insert LF to each node once.\n .split(\"\\n\");\n const spaces = (len) => {\n let s = \"\";\n const _indent = len * opt.step;\n for (let i = 0; i < _indent; i++) {\n s += \" \";\n }\n return s;\n };\n for (let i = 0; i < strArr.length; i++) {\n indent = 0;\n node = libs_1.$.trim(strArr[i]);\n if (node.match(/.+<\\/\\w[^>]*>$/)) {\n indent = 0;\n }\n else if (node.match(/^<\\/\\w/)) {\n if (pad > 0) {\n pad -= 1;\n }\n }\n else if (node.match(/^<\\w[^>]*[^/]>.*$/)) {\n indent = 1;\n }\n else {\n indent = 0;\n }\n xml += spaces(pad) + node + \"\\n\";\n pad += indent;\n }\n xml = xml\n .replace(/\\n\\n/gm, \"\\n\")\n .replace(/^ +\\n/gm, \"\");\n return normalizeText(xml, opt);\n}\nexports.formatXML = formatXML;\n\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"child_process\");\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst settings_1 = __webpack_require__(5);\nconst library_1 = __webpack_require__(6);\nconst mobile_1 = __webpack_require__(8);\nconst desktop_1 = __webpack_require__(10);\nconst web_1 = __webpack_require__(12);\n__export(__webpack_require__(1));\n__export(__webpack_require__(6));\n__export(__webpack_require__(8));\n__export(__webpack_require__(10));\n__export(__webpack_require__(12));\n/**\n * generator 生成関数\n */\nfunction newGenerator(config) {\n switch (config.projectType) {\n case \"library\":\n return library_1.newGeneratorLibrary(config);\n case \"mobile\":\n return mobile_1.newGeneratorMobile(config);\n case \"desktop\":\n return desktop_1.newGeneratorDesktop(config);\n case \"web\":\n return web_1.newGeneratorWeb(config);\n default:\n settings_1.assert(false, \"unsupported project kind: \" + config.projectType);\n return null;\n }\n}\nexports.newGenerator = newGenerator;\n\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Utils = __webpack_require__(2);\nexports.Utils = Utils;\n\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = __webpack_require__(0);\nconst utils_1 = __webpack_require__(2);\n/**\n * @class GeneratorBase\n * @brief すべての Generator の既定クラス\n */\nclass GeneratorBase {\n /**\n * constructor\n *\n * @param {IProjectConfigration} config コンフィグ\n */\n constructor(_config) {\n this._config = _config;\n this._projectRootDir = utils_1.getTargetDir() ?\n utils_1.getTargetDir() :\n path.join(process.cwd(), this._config.projectName);\n this._config.structureConfig = utils_1.$.extend({}, this.defaultBaseStructure(), this._config.structureConfig);\n this._config.private = \"NONE\" === this._config.license;\n this._config.outputSameDir\n = this._config.structureConfig.src === this._config.structureConfig.built;\n this._config.nodejs = ((env) => {\n switch (env) {\n case \"node\":\n case \"electron\":\n return true;\n default:\n return false;\n }\n })(this._config.env);\n utils_1.debug(JSON.stringify(this._config, null, 4));\n }\n ///////////////////////////////////////////////////////////////////////\n // pubic methods:\n /**\n * 処理開始 (エントリ)\n *\n */\n run() {\n switch (this._config.action) {\n case \"create\":\n return this.runCreate();\n default:\n return Promise.reject(\"unknown action: \" + this._config.action);\n }\n }\n ///////////////////////////////////////////////////////////////////////\n // protected methods:\n /**\n * 進捗テキストを通知\n *\n * @param key ローカライズリソースキーを指定\n */\n progress(key) {\n utils_1.log(utils_1.chalk.cyan(utils_1.translate(key)));\n }\n /**\n * 警告テキストを通知\n *\n * @param key ローカライズリソースキーを指定\n */\n warn(key) {\n utils_1.log(utils_1.chalk.yellow(utils_1.translate(key)));\n }\n /**\n * work directory の変更\n *\n * @param directory target directory.\n */\n chdir(directory) {\n process.chdir(directory);\n }\n /**\n * project root directory の取得\n *\n * @param {String} directory target directory.\n */\n get rootDir() {\n return this._projectRootDir;\n }\n /**\n * template directory を指定して配下のファイルをコピー\n * IBaseStructureConfigration の設定が反映される\n *\n * @param {String} target ターゲットを指定. null の場合は、templates を返却\n * @param {String} dstRoot コピー先を指定. 指定が無い場合は rootDir が設定\n */\n copyTplDir(target, dstRoot, options) {\n dstRoot = dstRoot || this.rootDir;\n options = utils_1.$.extend({\n cwd: utils_1.templatePath(target),\n nodir: true,\n dot: true,\n }, options);\n utils_1.glob.sync(\"**\", options)\n .forEach((file) => {\n const dst = path.join(dstRoot, file\n .replace(/src/, this._config.structureConfig.src)\n .replace(/pkg/, this._config.structureConfig.pkg)\n .replace(/built/, this._config.structureConfig.built)\n .replace(/doc/, this._config.structureConfig.doc)\n .replace(/task/, this._config.structureConfig.task)\n .replace(/test/, this._config.structureConfig.test)\n .replace(/types/, this._config.structureConfig.types)\n .replace(/temp\\//, this._config.structureConfig.temp + \"/\")\n .replace(/lib/, this._config.structureConfig.lib || \"lib\")\n .replace(/external/, this._config.structureConfig.external || \"external\")\n .replace(/porting/, this._config.structureConfig.porting || \"porting\")\n .replace(/res/, this._config.structureConfig.res || \"res\")\n .replace(/script/, this._config.structureConfig.srcConfig\n ? (this._config.structureConfig.srcConfig.script || \"scripts\")\n : \"scripts\")\n .replace(/stylesheet/, this._config.structureConfig.srcConfig\n ? (this._config.structureConfig.srcConfig.stylesheet || \"stylesheets\")\n : \"stylesheets\")\n .replace(/template/, this._config.structureConfig.srcConfig\n ? (this._config.structureConfig.srcConfig.template || \"templates\")\n : \"templates\"));\n utils_1.fs.copySync(path.join(utils_1.templatePath(target), file), dst);\n });\n }\n /**\n * node module の version 取得\n *\n * @param {Promise} version text\n */\n queryNodeModuleLatestVersion(name) {\n return new Promise((resolve, reject) => {\n let version;\n utils_1.execCommand(\"npm\", [\"info\", name, \"version\"], {\n stdio: \"pipe\",\n spinner: null,\n stdout: (data) => {\n version = utils_1._.trim(data);\n },\n })\n .then(() => {\n resolve(version);\n })\n .catch((reason) => {\n reject(reason);\n });\n });\n }\n /**\n * 既定の開発時の依存モジュールリストの取得\n * 必要に応じてオーバーライド\n *\n * @return {IDependency}\n */\n get defaultDevDependencies() {\n const base = [\n { name: \"convert-source-map\", version: undefined, },\n { name: \"del\", version: undefined, },\n { name: \"eslint\", version: undefined, },\n { name: \"npm-run-all\", version: undefined, },\n { name: \"plato\", version: undefined, },\n { name: \"source-map\", version: undefined, },\n { name: \"tslint\", version: undefined, },\n { name: \"typedoc\", version: undefined, },\n { name: \"typescript\", version: undefined, },\n ];\n const minify = [\n { name: \"uglify-js\", version: undefined, es: [\"es5\"], },\n { name: \"uglify-es\", version: undefined, es: [\"es2015\"], },\n ];\n let extra = [];\n if (this._config.minify) {\n extra = extra.concat(minify);\n }\n if (this.isEnableTool(\"webpack\")) {\n extra.push({ name: \"webpack\", version: undefined, });\n extra.push({ name: \"source-map-loader\", version: undefined, });\n }\n if (this.isEnableTool(\"nyc\")) {\n extra.push({ name: \"nyc\", version: undefined, });\n }\n if (this.isEnableTool(\"testem\")) {\n extra.push({ name: \"testem\", version: undefined, });\n }\n if (this.isEnableTool(\"phantomjs-prebuilt\")) {\n extra.push({ name: \"phantomjs-prebuilt\", version: undefined, });\n }\n return utils_1._.sortBy(base.concat(extra), (depend) => depend.name);\n }\n /**\n * dependencies の template paramaeter を取得\n *\n * @param {IDependency[]} dependencies 依存関係リスト\n * @return {{ name: string; version: string; last?: boolean; }[]} テンプレートパラメータに指定する配列\n */\n queryDependenciesParam(dependencies) {\n return __awaiter(this, void 0, void 0, function* () {\n this.progress(\"base.create.queryVersion\");\n const depends = dependencies\n .filter((depend) => {\n if (null == depend.es) {\n return true;\n }\n else {\n return !!depend.es.find((esVersion) => {\n return this._config.es === esVersion;\n });\n }\n });\n utils_1.debug(JSON.stringify(depends, null, 4));\n const progress = (context) => {\n if (\"string\" === typeof context && !this._config.settings.silent) {\n const spinner = utils_1.getSpinner(utils_1.chalk.yellow(context), 5);\n spinner.start();\n return spinner;\n }\n else if (context) {\n context.stop(true);\n }\n };\n for (let i = 0, n = depends.length; i < n; i++) {\n if (null == depends[i].version) {\n const spinner = progress(depends[i].name);\n depends[i].version = \"^\" + (yield this.queryNodeModuleLatestVersion(depends[i].name));\n progress(spinner);\n }\n if (i === n - 1) {\n depends[i].last = true;\n }\n }\n return depends;\n });\n }\n /**\n * webpack.config.js の template paramaeter を取得\n *\n * @return {String} libraryTarget に指定する文字列\n */\n queryWebpackLibraryTarget() {\n switch (this._config.module) {\n case \"commonjs\":\n return \"commonjs2\";\n case \"amd\":\n return \"amd\";\n case \"umd\":\n return \"umd\";\n default:\n return undefined;\n }\n }\n /**\n * eslintrc の env に指定する template paramaeter を取得\n *\n * @return {Object} env に指定するテンプレートパラメータオブジェクト\n */\n queryEsLintEnvParam() {\n const compileSetting = this._config;\n return {\n es6: \"es5\" !== compileSetting.es,\n node: \"web\" !== compileSetting.env,\n };\n }\n /**\n * IBuildTargetConfigration.tools プロパティの指定状況を取得\n *\n * @param {String} name ツール名を指定\n * @return {Boolean} true: 指定されている / false: 指定されていない\n */\n isEnableTool(name) {\n return !!this._config.tools.find((tool) => name === tool);\n }\n ///////////////////////////////////////////////////////////////////////\n // private methods:\n /**\n * create 処理のエントリ\n */\n runCreate() {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.createBase();\n yield this.create();\n });\n }\n //___________________________________________________________________________________________________________________//\n /**\n * 共通の create 処理\n */\n createBase() {\n return __awaiter(this, void 0, void 0, function* () {\n this.progress(\"base.create.foundation\");\n yield this.createProjectDir();\n yield this.copyBaseStructure();\n yield this.copyCommonFiles();\n yield this.copyTaskScripts();\n });\n }\n /**\n * プロジェクトディレクトリの作成\n */\n createProjectDir() {\n if (utils_1.fs.existsSync(this.rootDir)) {\n throw Error(utils_1.translate(\"base.create.error.alreadyExist\"));\n }\n utils_1.fs.mkdirsSync(this.rootDir);\n }\n /**\n * 共通構成情報のコピー\n */\n copyBaseStructure() {\n this.copyTplDir(\"base/structure\");\n }\n /**\n * 基本ファイルのコピー\n * template のコピーも行う\n */\n copyCommonFiles() {\n const srcDir = utils_1.templatePath(\"base\");\n const dstDir = this.rootDir;\n // .npmignore\n utils_1.copyTpl(path.join(srcDir, \"_npmignore\"), path.join(dstDir, \".npmignore\"), this._config.structureConfig);\n // BANNER\n utils_1.fs.copySync(path.join(srcDir, \"_BANNER\"), path.join(dstDir, \"BANNER\"));\n // LICENSE\n switch (this._config.license) {\n case \"Apache-2.0\":\n utils_1.fs.copySync(path.join(srcDir, \"_LICENSE.Apache-2.0\"), path.join(dstDir, \"LICENSE\"));\n break;\n case \"MIT\":\n utils_1.copyTpl(path.join(srcDir, \"_LICENSE.MIT\"), path.join(dstDir, \"LICENSE\"), this._config.copyright);\n break;\n default:\n break;\n }\n // NOTICE\n utils_1.fs.copySync(path.join(srcDir, \"_NOTICE\"), path.join(dstDir, \"NOTICE\"));\n // build tools: webpack\n if (this.isEnableTool(\"webpack\")) {\n const param = {\n nodejs: this._config.nodejs,\n guide: true,\n taskPath: this._config.structureConfig.task,\n };\n utils_1.copyTpl(path.join(srcDir, \"tools/webpack/_webpack.config.js\"), path.join(dstDir, \"webpack.config.js\"), param, { delimiters: \"<% %>\" });\n }\n }\n /**\n * task script のコピー\n */\n copyTaskScripts() {\n const srcDir = utils_1.templatePath(\"base/task\");\n const dstDir = path.join(this.rootDir, this._config.structureConfig.task);\n this.taskList.forEach((task) => {\n utils_1.fs.copySync(path.join(srcDir, task), path.join(dstDir, task));\n });\n }\n}\nexports.GeneratorBase = GeneratorBase;\n\n\n/***/ })\n/******/ ]);\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgZTVlNDA2MTliNjhhN2EwNTU3NjUiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicGF0aFwiIiwiY2RwOi8vL2NkcC1saWIvZ2VuZXJhdG9ycy9iYXNlL2luZGV4LnRzIiwiY2RwOi8vL2NkcC1saWIvdXRpbHMvaW5kZXgudHMiLCJjZHA6Ly8vY2RwLWxpYi91dGlscy9saWJzLnRzIiwid2VicGFjazovLy9leHRlcm5hbCBcIm9zXCIiLCJjZHA6Ly8vY2RwLWxpYi91dGlscy9zZXR0aW5ncy50cyIsImNkcDovLy9jZHAtbGliL2dlbmVyYXRvcnMvbGlicmFyeS9pbmRleC50cyIsImNkcDovLy9jZHAtbGliL2dlbmVyYXRvcnMvbGlicmFyeS9nZW5lcmF0b3ItbW9kdWxlLnRzIiwiY2RwOi8vL2NkcC1saWIvZ2VuZXJhdG9ycy9tb2JpbGUvaW5kZXgudHMiLCJjZHA6Ly8vY2RwLWxpYi9nZW5lcmF0b3JzL21vYmlsZS9nZW5lcmF0b3ItY29yZG92YS50cyIsImNkcDovLy9jZHAtbGliL2dlbmVyYXRvcnMvZGVza3RvcC9pbmRleC50cyIsImNkcDovLy9jZHAtbGliL2dlbmVyYXRvcnMvZGVza3RvcC9nZW5lcmF0b3ItZWxlY3Rvcm9uLnRzIiwiY2RwOi8vL2NkcC1saWIvZ2VuZXJhdG9ycy93ZWIvaW5kZXgudHMiLCJjZHA6Ly8vY2RwLWxpYi9nZW5lcmF0b3JzL3dlYi9nZW5lcmF0b3ItYnJvd3Nlci50cyIsImNkcDovLy9jZHAtbGliL2NkcC1saWIudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJmcy1leHRyYVwiLFwiY29tbW9uanMyXCI6XCJmcy1leHRyYVwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcImdsb2JcIixcImNvbW1vbmpzMlwiOlwiZ2xvYlwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wicm9vdFwiOlwiSG9nYW5cIixcImNvbW1vbmpzXCI6XCJob2dhbi5qc1wiLFwiY29tbW9uanMyXCI6XCJob2dhbi5qc1wiLFwiYW1kXCI6XCJob2dhbi5qc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wicm9vdFwiOlwiX1wiLFwiY29tbW9uanNcIjpcImxvZGFzaFwiLFwiY29tbW9uanMyXCI6XCJsb2Rhc2hcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcIl9cIixcImNvbW1vbmpzXCI6XCJ1bmRlcnNjb3JlLnN0cmluZ1wiLFwiY29tbW9uanMyXCI6XCJ1bmRlcnNjb3JlLnN0cmluZ1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcIndoaWNoXCIsXCJjb21tb25qczJcIjpcIndoaWNoXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qc1wiOlwidXVpZFwiLFwiY29tbW9uanMyXCI6XCJ1dWlkXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qc1wiOlwiY2hhbGtcIixcImNvbW1vbmpzMlwiOlwiY2hhbGtcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJzZW12ZXItcmVnZXhcIixcImNvbW1vbmpzMlwiOlwic2VtdmVyLXJlZ2V4XCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qc1wiOlwiY2xpLXNwaW5uZXJcIixcImNvbW1vbmpzMlwiOlwiY2xpLXNwaW5uZXJcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJqc2RvbVwiLFwiY29tbW9uanMyXCI6XCJqc2RvbVwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcInhtbGRvbVwiLFwiY29tbW9uanMyXCI6XCJ4bWxkb21cIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcImpRdWVyeVwiLFwiY29tbW9uanNcIjpcImpxdWVyeVwiLFwiY29tbW9uanMyXCI6XCJqcXVlcnlcIixcImFtZFwiOlwianF1ZXJ5XCJ9IiwiY2RwOi8vL2NkcC1saWIvdXRpbHMvdG9vbHMudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiY2hpbGRfcHJvY2Vzc1wiIiwiY2RwOi8vL2NkcC1saWIvZ2VuZXJhdG9ycy9pbmRleC50cyIsImNkcDovLy9jZHAtbGliL2dlbmVyYXRvcnMvYmFzZS9pbnRlcmZhY2VzLnRzIiwiY2RwOi8vL2NkcC1saWIvZ2VuZXJhdG9ycy9iYXNlL2dlbmVyYXRvci1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7QUM3REEsaUM7Ozs7Ozs7Ozs7OztBQ0FBLGtDQUE2QjtBQUM3QixrQ0FBaUM7Ozs7Ozs7Ozs7Ozs7QUNEakMsaUNBQXVCO0FBQ3ZCLGtDQUF3QjtBQUN4QixpQ0FBMkI7Ozs7Ozs7Ozs7QUNGM0IsbUNBQStCO0FBeUMzQixnQkFBRTtBQXhDTixxQ0FBNkI7QUF5Q3pCLG9CQUFJO0FBeENSLHNDQUFrQztBQXlDOUIsc0JBQUs7QUF4Q1QsbUNBQTZCO0FBQzdCLG1DQUF3QztBQUN4QyxzQ0FBK0I7QUF5QzNCLHNCQUFLO0FBeENULHFDQUE2QjtBQXlDekIsb0JBQUk7QUF4Q1Isd0NBQTBCO0FBeUN0QixnQkF6Q0csZUFBSyxDQXlDSDtBQXhDVCw0Q0FBNEM7QUF5Q3hDLGtDQUFXO0FBeENmLDhDQUFzQztBQXlDbEMs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QUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQzFCLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSjtBQTNhRCxzQ0EyYUMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxNCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgZTVlNDA2MTliNjhhN2EwNTU3NjUiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwicGF0aFwiXG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImV4cG9ydCAqIGZyb20gXCIuL2ludGVyZmFjZXNcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vZ2VuZXJhdG9yLWJhc2VcIjtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4uLy4uLy4uL3NyYy9nZW5lcmF0b3JzL2Jhc2UvaW5kZXgudHMiLCJleHBvcnQgKiBmcm9tIFwiLi9saWJzXCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL3Rvb2xzXCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL3NldHRpbmdzXCI7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi9zcmMvdXRpbHMvaW5kZXgudHMiLCJpbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnMtZXh0cmFcIjtcclxuaW1wb3J0ICogYXMgZ2xvYiBmcm9tIFwiZ2xvYlwiO1xyXG5pbXBvcnQgKiBhcyBob2dhbiBmcm9tIFwiaG9nYW4uanNcIjtcclxuaW1wb3J0ICogYXMgX2wgZnJvbSBcImxvZGFzaFwiO1xyXG5pbXBvcnQgKiBhcyBfcyBmcm9tIFwidW5kZXJzY29yZS5zdHJpbmdcIjtcclxuaW1wb3J0ICogYXMgd2hpY2ggZnJvbSBcIndoaWNoXCI7XHJcbmltcG9ydCAqIGFzIHV1aWQgZnJvbSBcInV1aWRcIjtcclxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xyXG5pbXBvcnQgKiBhcyBzZW12ZXJSZWdleCBmcm9tIFwic2VtdmVyLXJlZ2V4XCI7XHJcbmltcG9ydCB7IFNwaW5uZXIgfSBmcm9tIFwiY2xpLXNwaW5uZXJcIjtcclxuXHJcbmNvbnN0ICQ6IEpRdWVyeVN0YXRpYyA9ICgoKSA9PiB7XHJcbiAgICBjb25zdCBfd2luZG93ID0gKCgpID0+IHtcclxuICAgICAgICBjb25zdCBqc2RvbSA9IHJlcXVpcmUoXCJqc2RvbVwiKTtcclxuICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YganNkb20uSlNET00pIHsgICAgLy8gdjEwK1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IGpzZG9tLkpTRE9NKCkud2luZG93O1xyXG4gICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdjkuMTIueFxyXG4gICAgICAgICAgICByZXR1cm4ganNkb20uanNkb20oKS5kZWZhdWx0VmlldztcclxuICAgICAgICB9XHJcbiAgICB9KSgpO1xyXG5cclxuICAgIC8vIHBhdGNoIHNjb3BlOlxyXG4gICAgKChyb290OiBhbnkpID0+IHtcclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIGpzZG9tIDkuNC4wIC0gOS4xMi4wIOOBq+Wun+ijheOBleOCjOOBpuOBhOOCiyBET01QYXJzZXIg44GvIFhNTCDjga4gc2VyaWFsaXplIOOBjOOBp+OBjeOBquOBhOOBn+OCgSxcclxuICAgICAgICAgKiB4bWxkb20g44Gr572u44GN5o+b44GI44KLXHJcbiAgICAgICAgICoganNkb20gMTAuMS4wIOOBvuOBp+WLleOBi+OBquOBhOOBk+OBqOOCkueiuuiqjVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IHhtbGRvbSA9IHJlcXVpcmUoXCJ4bWxkb21cIik7XHJcbiAgICAgICAgcm9vdC5ET01QYXJzZXIgPSB4bWxkb20uRE9NUGFyc2VyO1xyXG4gICAgICAgIC8vIHhtbGRvbSDjgavjga8gZG9tLnRvU3RyaW5nKCkg44GM5a6f6KOF44GV44KM44Gm44GE44KL44GM44CBZ2xvYmFsIOOBq+OCgiBleHBvcnQg44GZ44KLXHJcbiAgICAgICAgKDxhbnk+Z2xvYmFsKS5YTUxTZXJpYWxpemVyID0gcm9vdC5YTUxTZXJpYWxpemVyID0geG1sZG9tLlhNTFNlcmlhbGl6ZXI7XHJcbiAgICB9KShfd2luZG93KTtcclxuXHJcbiAgICByZXR1cm4gcmVxdWlyZShcImpxdWVyeVwiKShfd2luZG93KTtcclxufSkoKTtcclxuXHJcbmV4cG9ydCB0eXBlIE1peGluZWRVbmRlcnNjb3JlU3RhdGljID0gdHlwZW9mIF9zICYgdHlwZW9mIF9sO1xyXG5jb25zdCBfbTogTWl4aW5lZFVuZGVyc2NvcmVTdGF0aWMgPSA8YW55Pl9sLm1peGluKDxhbnk+X3MuZXhwb3J0cygpKTtcclxuXHJcbmV4cG9ydCB7XHJcbiAgICBmcyxcclxuICAgIGdsb2IsXHJcbiAgICBob2dhbixcclxuICAgICQsXHJcbiAgICBfbSBhcyBfLFxyXG4gICAgd2hpY2gsXHJcbiAgICB1dWlkLFxyXG4gICAgY2hhbGssXHJcbiAgICBzZW12ZXJSZWdleCxcclxuICAgIFNwaW5uZXIsXHJcbn07XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi9zcmMvdXRpbHMvbGlicy50cyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm9zXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwib3NcIlxuLy8gbW9kdWxlIGlkID0gNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XHJcbmltcG9ydCB7IGZzLCAkIH0gZnJvbSBcIi4vbGlic1wiO1xyXG5cclxuLyoqXHJcbiAqIEBpbnRlcmZhY2UgSUdsb2JhbFNldHRpbmdzXHJcbiAqIEBicmllZiDjgrDjg63jg7zjg5Djg6voqK3lrprjgqTjg7Pjgr/jg7zjg5XjgqfjgqTjgrlcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdsb2JhbFNldHRpbmdzIHtcclxuICAgIGZvcmNlPzogYm9vbGVhbjsgICAgICAgICAgICAvLyDjgqjjg6njg7zntpnntprnlKhcclxuICAgIHZlcmJvc2U/OiBib29sZWFuOyAgICAgICAgICAvLyDoqbPntLDjg63jgrBcclxuICAgIHNpbGVudD86IGJvb2xlYW47ICAgICAgICAgICAvLyBzaWxlbnQgbW9kZVxyXG4gICAgdGFyZ2V0RGlyPzogc3RyaW5nOyAgICAgICAgIC8vIOS9nOalreODh+OCo+ODrOOCr+ODiOODqlxyXG4gICAgbGFuZz86IFwiZW4tVVNcIiB8IFwiamEtSlBcIjtcclxufVxyXG5cclxubGV0IF9zZXR0aW5nczogSUdsb2JhbFNldHRpbmdzID0ge1xyXG4gICAgZm9yY2U6IGZhbHNlLFxyXG4gICAgdmVyYm9zZTogZmFsc2UsXHJcbiAgICBzaWxlbnQ6IGZhbHNlLFxyXG4gICAgbGFuZzogXCJlbi1VU1wiLFxyXG59O1xyXG5cclxubGV0IF9saWJQYXRoOiBzdHJpbmc7ICAgLy8gY2RwLWxpYiDjga7lrZjlnKjjgZfjgabjgYTjgosgcGF0aFxyXG5cclxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuLy8gZXhwb3J0cyBtZXRob2RzOlxyXG5cclxuLyoqXHJcbiAqIOioreWumuWPluW+l1xyXG4gKlxyXG4gKiBAcmV0dXJucyBvcHRpb25zIOODreOCsOOBq+S9v+eUqOOBmeOCi+OCquODl+OCt+ODp+ODs1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFNldHRpbmdzKCk6IElHbG9iYWxTZXR0aW5ncyB7XHJcbiAgICByZXR1cm4gJC5leHRlbmQoe30sIF9zZXR0aW5ncyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDoqK3lrprmjIflrppcclxuICpcclxuICogQHBhcmFtIG9wdGlvbnMg44Ot44Kw44Gr5L2/55So44GZ44KL44Kq44OX44K344On44OzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2V0U2V0dGluZ3Moc2V0dGluZ3M6IElHbG9iYWxTZXR0aW5ncyk6IHZvaWQge1xyXG4gICAgaWYgKHNldHRpbmdzKSB7XHJcbiAgICAgICAgX3NldHRpbmdzLmZvcmNlICAgICA9IHNldHRpbmdzLmZvcmNlICAgICAgICB8fCBfc2V0dGluZ3MuZm9yY2U7XHJcbiAgICAgICAgX3NldHRpbmdzLnZlcmJvc2UgICA9IHNldHRpbmdzLnZlcmJvc2UgICAgICB8fCBfc2V0dGluZ3MudmVyYm9zZTtcclxuICAgICAgICBfc2V0dGluZ3Muc2lsZW50ICAgID0gc2V0dGluZ3Muc2lsZW50ICAgICAgIHx8IF9zZXR0aW5ncy5zaWxlbnQ7XHJcbiAgICAgICAgX3NldHRpbmdzLnRhcmdldERpciA9IHNldHRpbmdzLnRhcmdldERpciAgICB8fCBfc2V0dGluZ3MudGFyZ2V0RGlyO1xyXG4gICAgICAgIF9zZXR0aW5ncy5sYW5nICAgICAgPSBzZXR0aW5ncy5sYW5nICAgICAgICAgfHwgX3NldHRpbmdzLmxhbmc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIF9zZXR0aW5ncyA9IHtcclxuICAgICAgICAgICAgZm9yY2U6IGZhbHNlLFxyXG4gICAgICAgICAgICB2ZXJib3NlOiBmYWxzZSxcclxuICAgICAgICAgICAgc2lsZW50OiBmYWxzZSxcclxuICAgICAgICAgICAgbGFuZzogXCJlbi1VU1wiLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBcImNkcC1saWJcIiDjgYzlrZjlnKjjgZnjgovjg5HjgrnjgpLlj5blvpdcclxuICpcclxuICogQHJldHVybnMgY2RwLWxpYiDjgbjjga4gcGF0aFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldExpYlBhdGgoKTogc3RyaW5nIHtcclxuICAgIGlmIChudWxsID09IF9saWJQYXRoKSB7XHJcbiAgICAgICAgY29uc3QgVFJZX0NPVU5UID0gMztcclxuICAgICAgICBsZXQgdHJpZWQgPSAwO1xyXG4gICAgICAgIF9saWJQYXRoID0gX19kaXJuYW1lO1xyXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgICAgICAgIGlmIChUUllfQ09VTlQgPD0gdHJpZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwibGliIHBhdGggaXMgbm90IHJlc29sdmVkLlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfbGliUGF0aCA9IHBhdGguam9pbihfbGliUGF0aCwgXCIuLlwiKTtcclxuICAgICAgICAgICAgY29uc3QgY2hlY2sgPSBwYXRoLmpvaW4oX2xpYlBhdGgsIFwiY2RwLWxpYlwiKTtcclxuICAgICAgICAgICAgaWYgKGZzLnBhdGhFeGlzdHNTeW5jKGNoZWNrKSkge1xyXG4gICAgICAgICAgICAgICAgX2xpYlBhdGggPSBjaGVjaztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyaWVkKys7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9saWJQYXRoO1xyXG59XHJcblxyXG4vKipcclxuICog5oyH5a6a44GV44KM44GfIHRhcmdldERpciDjgpLlj5blvpdcclxuICpcclxuICogQHJldHVybnMgdGFyZ2V0RGlyIOOBuOOBriBwYXRoXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFyZ2V0RGlyKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gX3NldHRpbmdzLnRhcmdldERpcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIOODreOCsOWHuuWKm1xyXG4gKiBjb25zb2xlLmxvZygpIOOBqOWQjOetiVxyXG4gKlxyXG4gKiBAcGFyYW0gbWVzc2FnZSAgICAgICAg5Ye65Yqb44Oh44OD44K744O844K4XHJcbiAqIEBwYXJhbSBvcHRpb25hbFBhcmFtcyDku5jliqDmg4XloLFcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBsb2cobWVzc2FnZT86IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XHJcbiAgICBpZiAoIV9zZXR0aW5ncy5zaWxlbnQpIHtcclxuICAgICAgICBpZiAoMCA8IG9wdGlvbmFsUGFyYW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICog6Kmz57Sw44Ot44Kw5Ye65YqbXHJcbiAqIGNvbnNvbGUuZGVidWcoKSDjgajlkIznrYlcclxuICpcclxuICogQHBhcmFtIG1lc3NhZ2UgICAgICAgIOWHuuWKm+ODoeODg+OCu+ODvOOCuFxyXG4gKiBAcGFyYW0gb3B0aW9uYWxQYXJhbXMg5LuY5Yqg5oOF5aCxXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGVidWcobWVzc2FnZT86IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XHJcbiAgICBpZiAoIV9zZXR0aW5ncy5zaWxlbnQgJiYgX3NldHRpbmdzLnZlcmJvc2UpIHtcclxuICAgICAgICBpZiAoMCA8IG9wdGlvbmFsUGFyYW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiREVCVUc6IFwiICsgbWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJERUJVRzogXCIgKyBtZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDmpJzoqLxcclxuICogY29uc29sZS5hc3NlcnQoKSDjgajlkIznrYlcclxuICpcclxuICogQHBhcmFtIHRlc3QgICAgICAgICAgIOaknOiovOOBmeOCi+W8j1xyXG4gKiBAcGFyYW0gbWVzc2FnZSAgICAgICAg5Ye65Yqb44Oh44OD44K744O844K4XHJcbiAqIEBwYXJhbSBvcHRpb25hbFBhcmFtcyDku5jliqDmg4XloLFcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQodGVzdD86IGJvb2xlYW4sIG1lc3NhZ2U/OiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgaWYgKCF0ZXN0KSB7XHJcbiAgICAgICAgaWYgKF9zZXR0aW5ncy5mb3JjZSkge1xyXG4gICAgICAgICAgICBpZiAoMCA8IG9wdGlvbmFsUGFyYW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UsIG9wdGlvbmFsUGFyYW1zKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICgwIDwgb3B0aW9uYWxQYXJhbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UsIG9wdGlvbmFsUGFyYW1zKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxubGV0IF9sYW5nOiBhbnk7XHJcblxyXG4vKipcclxuICog44Ot44O844Kr44Op44Kk44K6XHJcbiAqXHJcbiAqIEBwYXJhbSBrZXkg44Kt44O85paH5a2X5YiXXHJcbiAqIEByZXR1cm5zIOe/u+ios+OBleOCjOOBn+aWh+Wtl+WIl1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIV9sYW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgX2xhbmcgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhcclxuICAgICAgICAgICAgICAgIHBhdGguam9pbihnZXRMaWJQYXRoKCksIFwicmVzL2xvY2FsZXNcIiwgXCJtZXNzYWdlcy5cIiArIF9zZXR0aW5ncy5sYW5nICsgXCIuanNvblwiKSwgXCJ1dGY4XCIpLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcIkxhbmd1YWdlIHJlc291cmNlIEpTT04gcGFyc2UgZXJyb3I6IFwiICsgZXJyb3IubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXNvdWNlID0gJC5leHRlbmQoe30sIF9sYW5nKTtcclxuICAgIGNvbnN0IHByb3BzID0ga2V5LnNwbGl0KFwiLlwiKTtcclxuICAgIHdoaWxlICgwIDwgcHJvcHMubGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzLnNoaWZ0KCk7XHJcbiAgICAgICAgaWYgKHJlc291Y2VbcHJvcF0pIHtcclxuICAgICAgICAgICAgcmVzb3VjZSA9IHJlc291Y2VbcHJvcF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBcInJlc291Y2Ugbm90IGZvdW5kLiBrZXk6IFwiICsga2V5KTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc291Y2U7XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4uLy4uL3NyYy91dGlscy9zZXR0aW5ncy50cyIsImltcG9ydCB7IEdlbmVyYXRvckJhc2UsIElQcm9qZWN0Q29uZmlncmF0aW9uIH0gZnJvbSBcIi4uL2Jhc2VcIjtcclxuaW1wb3J0IHsgR2VuZXJhdG9yTW9kdWxlIH0gZnJvbSBcIi4vZ2VuZXJhdG9yLW1vZHVsZVwiO1xyXG5cclxuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0b3ItbW9kdWxlXCI7XHJcblxyXG4vKipcclxuICogZ2VuZXJhdG9yIOeUn+aIkOmWouaVsFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG5ld0dlbmVyYXRvckxpYnJhcnkoY29uZmlnOiBJUHJvamVjdENvbmZpZ3JhdGlvbik6IEdlbmVyYXRvckJhc2Uge1xyXG4gICAgcmV0dXJuIG5ldyBHZW5lcmF0b3JNb2R1bGUoY29uZmlnKTtcclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGlicmFyeS9pbmRleC50cyIsImltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcclxuaW1wb3J0ICogYXMgb3MgZnJvbSBcIm9zXCI7XHJcbmltcG9ydCB7XHJcbiAgICBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbixcclxuICAgIElEZXBlbmRlbmN5LFxyXG4gICAgSVZpc3VhbFN0dWRpb0NvbmZpZ3JhdGlvbixcclxuICAgIEdlbmVyYXRvckJhc2UsXHJcbiAgICBVdGlscyxcclxufSBmcm9tIFwiLi4vYmFzZVwiO1xyXG5pbXBvcnQgeyBJTGlicmFyeUNvbmZpZ3JhdGlvbiB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcclxuXHJcbmNvbnN0IGZzICAgICAgICAgICAgPSBVdGlscy5mcztcclxuY29uc3QgZ2xvYiAgICAgICAgICA9IFV0aWxzLmdsb2I7XHJcbmNvbnN0ICQgICAgICAgICAgICAgPSBVdGlscy4kO1xyXG5jb25zdCBfICAgICAgICAgICAgID0gVXRpbHMuXztcclxuY29uc3QgZGVidWcgICAgICAgICA9IFV0aWxzLmRlYnVnO1xyXG5jb25zdCB0ZW1wbGF0ZVBhdGggID0gVXRpbHMudGVtcGxhdGVQYXRoO1xyXG5jb25zdCBjb3B5VHBsICAgICAgID0gVXRpbHMuY29weVRwbDtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3MgR2VuZXJhdG9yTW9kdWxlXHJcbiAqIEBicmllZiBMaWJyYXJ5IE1vZHVsZSDnlKggR2VuZXJhdG9yIOOCr+ODqeOCuVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEdlbmVyYXRvck1vZHVsZSBleHRlbmRzIEdlbmVyYXRvckJhc2Uge1xyXG5cclxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAvLyBpbXByZW1lbnRlczogR2VuZXJhdG9yQmFzZVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pei5a6a44GuIGRpcmVjdG9yeSDmp4vpgKDjgpLov5TljbRcclxuICAgICAqL1xyXG4gICAgZGVmYXVsdEJhc2VTdHJ1Y3R1cmUoKTogSUJhc2VTdHJ1Y3R1cmVDb25maWdyYXRpb24ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHNyYzogXCJzcmNcIixcclxuICAgICAgICAgICAgcGtnOiBcImRpc3RcIixcclxuICAgICAgICAgICAgYnVpbHQ6IFwiYnVpbHRcIixcclxuICAgICAgICAgICAgZG9jOiBcImRvY3NcIixcclxuICAgICAgICAgICAgdGFzazogXCJ0YXNrc1wiLFxyXG4gICAgICAgICAgICB0ZXN0OiBcInRlc3RzXCIsXHJcbiAgICAgICAgICAgIHR5cGVzOiBcIkB0eXBlc1wiLFxyXG4gICAgICAgICAgICB0ZW1wOiBcIi50ZW1wXCIsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGNyZWF0ZSBhY3Rpb24gZW50cnlcclxuICAgICAqIEBwYXJhbSB7SUxpYnJhcnlDb25maWdyYXRpb259IGNvbmZpZyDjgrPjg7Pjg5XjgqPjgrDoqK3lrppcclxuICAgICAqL1xyXG4gICAgYXN5bmMgY3JlYXRlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTW9kdWxlUHJvcHMoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZURpcmVjdG9yeVN0cnVjdHVyZSgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlUHJvamVjdFNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVTb3VyY2VUZW1wbGF0ZSgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlVmlzdWFsU3R1ZGlvU29sdXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW/heimgeOBqOOBmeOCiyB0YXNrIHNjcmlwdCDkuIDopqfjgpLov5TljbQuIGFjdGlvbjogY3JlYXRlIOOBruOBqOOBjeOBq+WRvOOBsOOCjOOCi1xyXG4gICAgICovXHJcbiAgICBnZXQgdGFza0xpc3QoKTogc3RyaW5nW10ge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIFwiYmFubmVyLmpzXCIsXHJcbiAgICAgICAgICAgIFwiY2xlYW4uanNcIixcclxuICAgICAgICAgICAgXCJzcmNtYXAuanNcIixcclxuICAgICAgICAgICAgXCJidW5kbGUtZmluYWxpemVyLmpzXCIsXHJcbiAgICAgICAgICAgIFwicmVtYXAtY292ZXJhZ2UuanNcIixcclxuICAgICAgICBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAvLyBwcm90ZWN0ZWQgbWV0aG9kczpcclxuXHJcbiAgICAvKipcclxuICAgICAqIOmWi+eZuuaZguOBruS+neWtmOODouOCuOODpeODvOODq+ODquOCueODiOOBruWPluW+l1xyXG4gICAgICog5b+F6KaB44Gr5b+c44GY44Gm44Kq44O844OQ44O844Op44Kk44OJXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7SURlcGVuZGVuY3l9XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgZGVmYXVsdERldkRlcGVuZGVuY2llcygpOiBJRGVwZW5kZW5jeVtdIHtcclxuICAgICAgICBjb25zdCBkZXBlbmRzID0gc3VwZXIuZGVmYXVsdERldkRlcGVuZGVuY2llcy5jb25jYXQoW1xyXG4gICAgICAgICAgICB7IG5hbWU6IFwiQHR5cGVzL2phc21pbmVcIiwgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwiZHRzLWJ1bmRsZVwiLCAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwidHlwZXNjcmlwdC1mb3JtYXR0ZXJcIiwgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICBjb25zdCBleHRyYSA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5ub2RlanMpIHtcclxuICAgICAgICAgICAgZXh0cmEucHVzaCh7IG5hbWU6IFwiamFzbWluZS1ub2RlXCIsIHZlcnNpb246IFwiXjIuMC4wXCIsIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGV4dHJhLnB1c2goeyBuYW1lOiBcInJlcXVpcmVqc1wiLCB2ZXJzaW9uOiB1bmRlZmluZWQsIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIF8uc29ydEJ5KGRlcGVuZHMuY29uY2F0KGV4dHJhKSwgKGRlcGVuZCkgPT4gZGVwZW5kLm5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAvLyBwcml2YXRlIG1ldGhvZHM6XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBjb25maWdyYXRpb24g44Gr44Ki44Kv44K744K5XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0IGNvbmZpZygpOiBJTGlicmFyeUNvbmZpZ3JhdGlvbiB7XHJcbiAgICAgICAgcmV0dXJuIDxJTGlicmFyeUNvbmZpZ3JhdGlvbj50aGlzLl9jb25maWc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBtb2R1bGUg5ZCNLCBtYWluIOODleOCoeOCpOODq+WQjeOBruS/neiovFxyXG4gICAgICogLSAxOiBtb2R1bGVOYW1lIOOBjOaMh+WumuOBleOCjOOBpuOBhOOCi+WgtOWQiOOBr+S9v+eUqOOBmeOCi1xyXG4gICAgICogLSAyOiBwcm9qZWN0TmFtZSDjgYzkvb/nlKjlj6/og73jgarloLTlkIjjga/jgZ3jgozjgpLkvb/nlKjjgZnjgotcclxuICAgICAqIC0gMzogcHJvamVjdE5hbWUg44GM5L2/55So5LiN5Y+v44Gu5aC05ZCI44Gv44CBXCItXCIg44Gk44Gq44GO5paH5a2X5YiX44KS55Sf5oiQ44GZ44KLXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZW5zdXJlTW9kdWxlUHJvcHMoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gbW9kdWxlIG5hbWVcclxuICAgICAgICBpZiAobnVsbCA9PSB0aGlzLmNvbmZpZy5tb2R1bGVOYW1lKSB7XHJcbiAgICAgICAgICAgIGlmICghL14uKlsoXFxcXHxcXHN8L3w6fCp8P3xcInw8fD58fCldLiokLy50ZXN0KHRoaXMuY29uZmlnLnByb2plY3ROYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcubW9kdWxlTmFtZSA9IHRoaXMuY29uZmlnLnByb2plY3ROYW1lO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcubW9kdWxlTmFtZSA9IF8udHJpbShfLmRhc2hlcml6ZSh0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZSksIFwiLVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBkZWJ1ZyhcIm1vZHVsZU5hbWU6IFwiICsgdGhpcy5jb25maWcubW9kdWxlTmFtZSk7XHJcblxyXG4gICAgICAgIC8vIG1haW4gZmlsZSBuYW1lXHJcbiAgICAgICAgaWYgKG51bGwgPT0gdGhpcy5jb25maWcubWFpbkJhc2VOYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLm1haW5CYXNlTmFtZSA9IHRoaXMuY29uZmlnLm1vZHVsZU5hbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlYnVnKFwibWFpbkJhc2VOYW1lOiBcIiArIHRoaXMuY29uZmlnLm1haW5CYXNlTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDjg4fjgqPjg6zjgq/jg4jjg6rmp4vmiJDmg4XloLHjga7jgrPjg5Tjg7xcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVEaXJlY3RvcnlTdHJ1Y3R1cmUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb3B5VHBsRGlyKFwibGlicmFyeS9zdHJ1Y3R1cmVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDjg5fjg63jgrjjgqfjgq/jg4joqK3lrprjg5XjgqHjgqTjg6vjga7kvZzmiJBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVQcm9qZWN0U2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgLy8gcHJvamVjdC5jb25maWcuanNcclxuICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeVwiKSwgXCJfcHJvamVjdC5jb25maWcuanNcIiksXHJcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwicHJvamVjdC5jb25maWcuanNcIiksXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcclxuICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIHRzY29uZmlnXHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5vdXRwdXRTYW1lRGlyKSB7XHJcbiAgICAgICAgICAgIC8vIG1haW4gdHNjb25maWcuanNvblxyXG4gICAgICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcImxpYnJhcnlcIiksIFwiX3RzY29uZmlnLmpzb25cIiksXHJcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcInRzY29uZmlnLmpzb25cIiksXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25maWcsXHJcbiAgICAgICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAvLyB0ZXN0IHRzY29uZmlnLmpzb25cclxuICAgICAgICAgICAgY29weVRwbChcclxuICAgICAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJsaWJyYXJ5XCIpLCBcIl90c2NvbmZpZy50ZXN0Lmpzb25cIiksXHJcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnRlc3QsIFwidW5pdFwiLCBcInRzY29uZmlnLmpzb25cIiksXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25maWcsXHJcbiAgICAgICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIG1haW4gdHNjb25maWcuanNvblxyXG4gICAgICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcImxpYnJhcnlcIiksIFwiX3RzY29uZmlnLm91dHB1dC1zYW1lLWRpci5qc29uXCIpLFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJ0c2NvbmZpZy5qc29uXCIpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIsIGJvbTogZmFsc2UsIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGVzbGludHJjLmpzb25cclxuICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeVwiKSwgXCJfZXNsaW50cmMuanNvblwiKSxcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50ZXN0LCBcImVzbGludFwiLCBcImVzbGludHJjLmpzb25cIiksXHJcbiAgICAgICAgICAgIHRoaXMucXVlcnlFc0xpbnRFbnZQYXJhbSgpLFxyXG4gICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIHRlc3RlbVxyXG4gICAgICAgIGlmICghdGhpcy5jb25maWcubm9kZWpzKSB7XHJcbiAgICAgICAgICAgIGNvcHlUcGwoXHJcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeS90b29scy90ZXN0ZW1cIiksIFwiX3Rlc3RlbS5qc29uXCIpLFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50ZXN0LCBcInJ1bm5lclwiLCBcInRlc3RlbS5qc29uXCIpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIsIGJvbTogZmFsc2UsIH1cclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRlc3RlbVN0dWZmUGF0aCA9IHRlbXBsYXRlUGF0aChcImxpYnJhcnkvdG9vbHMvdGVzdGVtL3J1bm5lclwiKTtcclxuXHJcbiAgICAgICAgICAgIGdsb2Iuc3luYyhcIioqXCIsIHtcclxuICAgICAgICAgICAgICAgIGN3ZDogdGVzdGVtU3R1ZmZQYXRoLFxyXG4gICAgICAgICAgICAgICAgbm9kaXI6IHRydWUsXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuZm9yRWFjaCgoZmlsZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLmNvcHlTeW5jKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGVzdGVtU3R1ZmZQYXRoLCBmaWxlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50ZXN0LCBcInJ1bm5lclwiLCBmaWxlKVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIC5naXRpZ25vcmVcclxuICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeVwiKSwgXCJfZ2l0aWdub3JlXCIpLFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcIi5naXRpZ25vcmVcIiksXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcclxuICAgICAgICAgICAgeyBib206IGZhbHNlLCB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gUkVBRE1FLm1kXHJcbiAgICAgICAgY29weVRwbChcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcImxpYnJhcnlcIiksIFwiX1JFQURNRS5tZFwiKSxcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJSRUFETUUubWRcIiksXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcclxuICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIHBhY2thZ2UuanNvblxyXG4gICAgICAgIHRoaXMuY29uZmlnLmRldkRlcGVuZGVuY2llcyA9IGF3YWl0IHRoaXMucXVlcnlEZXBlbmRlbmNpZXNQYXJhbSh0aGlzLmNvbmZpZy5kZXZEZXBlbmRlbmNpZXMgfHwgdGhpcy5kZWZhdWx0RGV2RGVwZW5kZW5jaWVzKTtcclxuICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibGlicmFyeVwiKSwgXCJfcGFja2FnZS5qc29uXCIpLFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcInBhY2thZ2UuanNvblwiKSxcclxuICAgICAgICAgICAgdGhpcy5fY29uZmlnLFxyXG4gICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDjgr3jg7zjgrnjga7pm5vlvaLkvZzmiJBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVTb3VyY2VUZW1wbGF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBfbW9kdWxlID0gcGF0aC5iYXNlbmFtZSh0aGlzLl9jb25maWcubW9kdWxlTmFtZSwgXCIuanNcIik7XHJcbiAgICAgICAgY29uc3QgcGFyYW0gPSB7XHJcbiAgICAgICAgICAgIHNhbXBsZUNsYXNzOiBfLmNsYXNzaWZ5KF9tb2R1bGUpLFxyXG4gICAgICAgICAgICBzYW1wbGVNb2R1bGU6IF9tb2R1bGUsXHJcbiAgICAgICAgICAgIGJ1aWx0OiB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLmJ1aWx0LFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IHNjcmlwdCA9ICgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyY0NvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjQ29uZmlnLnNjcmlwdCB8fCBcIlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgICAgIH0pKCk7XHJcblxyXG4gICAgICAgIC8vIGluZGV4LnRzXHJcbiAgICAgICAgY29weVRwbChcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcImxpYnJhcnlcIiksIFwic3JjXCIsIFwiX2luZGV4LnRzXCIpLFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYywgc2NyaXB0LCBfbW9kdWxlICsgXCIudHNcIiksXHJcbiAgICAgICAgICAgIHBhcmFtLFxyXG4gICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gaW5kZXguc3BlYy50c1xyXG4gICAgICAgIGNvcHlUcGwoXHJcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJsaWJyYXJ5XCIpLCBcInNyY1wiLCBcIl9pbmRleC5zcGVjLnRzXCIpLFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnRlc3QsIFwidW5pdFwiLCBfbW9kdWxlICsgXCIuc3BlYy50c1wiKSxcclxuICAgICAgICAgICAgcGFyYW0sXHJcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmlzdWFsIFN0dWRpbyDjga7jgr3jg6rjg6Xjg7zjgrfjg6fjg7Pjg5XjgqHjgqTjg6vkvZzmiJBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVWaXN1YWxTdHVkaW9Tb2x1dGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCB2c1BhcmFtID0gKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY3JlYXRlR1VJRCA9IFV0aWxzLmNyZWF0ZUdVSUQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBwYXJhbTogSVZpc3VhbFN0dWRpb0NvbmZpZ3JhdGlvbiA9IDxhbnk+JC5leHRlbmQoe30sIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcpO1xyXG5cclxuICAgICAgICAgICAgcGFyYW0ucHJvamVjdE5hbWUgICAgICAgPSB0aGlzLl9jb25maWcucHJvamVjdE5hbWU7XHJcbiAgICAgICAgICAgIHBhcmFtLnByb2plY3RHVUlEICAgICAgID0gY3JlYXRlR1VJRCgpO1xyXG4gICAgICAgICAgICBwYXJhbS50eXBlcyAgICAgICAgICAgICA9IHBhcmFtLnR5cGVzLnJlcGxhY2UoXCJAXCIsIFwiJTQwXCIpOyAvLyBlc2NhcGUgXCJAXCIgdG8gXCIlNDBcIlxyXG4gICAgICAgICAgICBwYXJhbS5tYWluQmFzZU5hbWUgICAgICA9IHRoaXMuX2NvbmZpZy5tYWluQmFzZU5hbWU7XHJcbiAgICAgICAgICAgIHBhcmFtLmxpY2Vuc2UgICAgICAgICAgID0gIXRoaXMuX2NvbmZpZy5wcml2YXRlO1xyXG5cclxuICAgICAgICAgICAgLy8gdG9vbHNcclxuICAgICAgICAgICAgcGFyYW0ud2VicGFjayA9IHRoaXMuaXNFbmFibGVUb29sKFwid2VicGFja1wiKTtcclxuICAgICAgICAgICAgcGFyYW0udGVzdGVtID0gIXRoaXMuY29uZmlnLm5vZGVqcztcclxuXHJcbiAgICAgICAgICAgIHBhcmFtLm91dHB1dFNhbWVEaXIgPSB0aGlzLmNvbmZpZy5vdXRwdXRTYW1lRGlyO1xyXG5cclxuICAgICAgICAgICAgLy8gc2V0dXAgYnVpbHQganMgZ3JvdXBcclxuICAgICAgICAgICAgcGFyYW0uanNHcm91cCA9IFtdO1xyXG4gICAgICAgICAgICBpZiAoIXBhcmFtLm91dHB1dFNhbWVEaXIpIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtLmpzR3JvdXAucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVQYXRoOiBwYXJhbS5idWlsdCArIFwiXFxcXFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBwYXJhbS5tYWluQmFzZU5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZWU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgZF90czogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBtYXA6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgbWluX21hcDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWcubWluaWZ5KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBzZXR1cCBwa2cgZ3JvdXBcclxuICAgICAgICAgICAgICAgIHBhcmFtLmpzR3JvdXAucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVQYXRoOiBwYXJhbS5wa2cgKyBcIlxcXFxcIixcclxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogcGFyYW0ubWFpbkJhc2VOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlcGVuZGVlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBkX3RzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBtYXA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIG1pbl9tYXA6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gc2V0dXAgdGVzdCBqcyBncm91cFxyXG4gICAgICAgICAgICBwYXJhbS50c0dyb3VwID0gW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlUGF0aDogcGFyYW0udGVzdCArIFwiXFxcXHVuaXRcXFxcXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IHBhcmFtLm1haW5CYXNlTmFtZSArIFwiLnNwZWNcIixcclxuICAgICAgICAgICAgICAgICAgICBkZXBlbmRlZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBtYXA6IHRoaXMuY29uZmlnLm91dHB1dFNhbWVEaXIsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICBpZiAocGFyYW0ub3V0cHV0U2FtZURpcikge1xyXG4gICAgICAgICAgICAgICAgcGFyYW0udHNHcm91cC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVBhdGg6IHBhcmFtLmJ1aWx0ICsgXCJcXFxcXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IHBhcmFtLm1haW5CYXNlTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICBkZXBlbmRlZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgbWFwOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcclxuICAgICAgICB9KSgpO1xyXG5cclxuICAgICAgICAvLyAuc2xuXHJcbiAgICAgICAgY29weVRwbChcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcImJhc2UvdmlzdWFsLnN0dWRpb1wiKSwgXCJfc29sdXRpb24uc2xuLnRwbFwiKSxcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgdnNQYXJhbS5wcm9qZWN0TmFtZSArIFwiLnNsblwiKSxcclxuICAgICAgICAgICAgdnNQYXJhbSxcclxuICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIC5jc3Byb2pcclxuICAgICAgICAoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB0b1htbFN0cmluZyA9IChmaWxlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGhvZ2FuID0gVXRpbHMuaG9nYW47XHJcbiAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVUZXh0ID0gVXRpbHMubm9ybWFsaXplVGV4dDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW9sOiBvcy5FT0wsXHJcbiAgICAgICAgICAgICAgICAgICAgYm9tOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlbGltaXRlcnM6IFwie3sgfX1cIixcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgdHBsID0gcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcImJhc2UvdmlzdWFsLnN0dWRpb1wiKSwgZmlsZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBqc3QgPSBob2dhbi5jb21waWxlKG5vcm1hbGl6ZVRleHQoZnMucmVhZEZpbGVTeW5jKHRwbCkudG9TdHJpbmcoKSwgeyBlb2w6IFwiXFxuXCIsIGJvbTogZmFsc2UgfSksIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGpzdC5yZW5kZXIodnNQYXJhbSk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0b1htbERPTSA9IChmaWxlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAkKCQucGFyc2VYTUwodG9YbWxTdHJpbmcoZmlsZSkpKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRvWG1sTm9kZSA9IChmaWxlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBVdGlscy5zdHIyWG1sTm9kZSh0b1htbFN0cmluZyhmaWxlKSk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCAkcHJvaiA9IHRvWG1sRE9NKFwiX3Byb2plY3QuY3Nwcm9qLnRwbFwiKTtcclxuICAgICAgICAgICAgY29uc3QgJGdwVFMgPSB0b1htbE5vZGUoXCJfdHMuaXRlbS5ncm91cC50cGxcIik7XHJcbiAgICAgICAgICAgIGNvbnN0ICRncEpTID0gdG9YbWxOb2RlKFwiX2pzLml0ZW0uZ3JvdXAudHBsXCIpO1xyXG5cclxuICAgICAgICAgICAgJHByb2pcclxuICAgICAgICAgICAgICAgIC5maW5kKFwiSXRlbUdyb3VwXCIpXHJcbiAgICAgICAgICAgICAgICAubGFzdCgpXHJcbiAgICAgICAgICAgICAgICAuYWZ0ZXIoJGdwVFMpXHJcbiAgICAgICAgICAgICAgICAuYWZ0ZXIoJGdwSlMpXHJcbiAgICAgICAgICAgICAgICA7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBmb3JtYXRYTUwgPSBVdGlscy5mb3JtYXRYTUw7XHJcbiAgICAgICAgICAgIGNvbnN0IGRzdFBhdGggPSBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB2c1BhcmFtLnByb2plY3ROYW1lICsgXCIuY3Nwcm9qXCIpO1xyXG4gICAgICAgICAgICBkZWJ1ZyhVdGlscy54bWxOb2RlMlN0cigkcHJvaikpO1xyXG4gICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRzdFBhdGgsIGZvcm1hdFhNTChVdGlscy54bWxOb2RlMlN0cigkcHJvaikpKTtcclxuICAgICAgICB9KSgpO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWJyYXJ5L2dlbmVyYXRvci1tb2R1bGUudHMiLCJpbXBvcnQgeyBHZW5lcmF0b3JCYXNlLCBJUHJvamVjdENvbmZpZ3JhdGlvbiB9IGZyb20gXCIuLi9iYXNlXCI7XHJcbmltcG9ydCB7IEdlbmVyYXRvckNvcmRvdmEgfSBmcm9tIFwiLi9nZW5lcmF0b3ItY29yZG92YVwiO1xyXG5cclxuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0b3ItY29yZG92YVwiO1xyXG5cclxuLyoqXHJcbiAqIGdlbmVyYXRvciDnlJ/miJDplqLmlbBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBuZXdHZW5lcmF0b3JNb2JpbGUoY29uZmlnOiBJUHJvamVjdENvbmZpZ3JhdGlvbik6IEdlbmVyYXRvckJhc2Uge1xyXG4gICAgcmV0dXJuIG5ldyBHZW5lcmF0b3JDb3Jkb3ZhKGNvbmZpZyk7XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4uLy4uLy4uL3NyYy9nZW5lcmF0b3JzL21vYmlsZS9pbmRleC50cyIsImltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcclxuaW1wb3J0ICogYXMgb3MgZnJvbSBcIm9zXCI7XHJcbmltcG9ydCB7XHJcbiAgICBmcyxcclxuICAgIGdsb2IsXHJcbiAgICAkLFxyXG4gICAgXyxcclxuICAgIGhvZ2FuLFxyXG4gICAgZGVidWcsXHJcbiAgICB0ZW1wbGF0ZVBhdGgsXHJcbiAgICBjb3B5VHBsLFxyXG4gICAgZXhlY0NvbW1hbmQsXHJcbiAgICBzdHIyWG1sTm9kZSxcclxuICAgIHhtbE5vZGUyU3RyLFxyXG4gICAgbm9ybWFsaXplVGV4dCxcclxuICAgIGZvcm1hdFhNTCxcclxuICAgIGNyZWF0ZUdVSUQsXHJcbn0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XHJcbmltcG9ydCB7XHJcbiAgICBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbixcclxuICAgIElEZXBlbmRlbmN5LFxyXG4gICAgSVZpc3VhbFN0dWRpb0NvbmZpZ3JhdGlvbixcclxuICAgIEdlbmVyYXRvckJhc2UsXHJcbn0gZnJvbSBcIi4uL2Jhc2VcIjtcclxuaW1wb3J0IHsgSU1vYmlsZUFwcENvbmZpZ3JhdGlvbiB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3MgR2VuZXJhdG9yQ29yZG92YVxyXG4gKiBAYnJpZWYgTW9iaWxlIENvcmRvdmEg55SoIEdlbmVyYXRvciDjgq/jg6njgrlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBHZW5lcmF0b3JDb3Jkb3ZhIGV4dGVuZHMgR2VuZXJhdG9yQmFzZSB7XHJcblxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIC8vIGltcHJlbWVudGVzOiBHZW5lcmF0b3JCYXNlXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDml6Llrprjga4gZGlyZWN0b3J5IOani+mAoOOCkui/lOWNtFxyXG4gICAgICovXHJcbiAgICBkZWZhdWx0QmFzZVN0cnVjdHVyZSgpOiBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc3JjOiBcImFwcFwiLFxyXG4gICAgICAgICAgICBwa2c6IFwid3d3XCIsXHJcbiAgICAgICAgICAgIGJ1aWx0OiBcImFwcFwiLFxyXG4gICAgICAgICAgICBkb2M6IFwiZG9jc1wiLFxyXG4gICAgICAgICAgICB0YXNrOiBcInRhc2tzXCIsXHJcbiAgICAgICAgICAgIHRlc3Q6IFwidGVzdHNcIixcclxuICAgICAgICAgICAgdHlwZXM6IFwiQHR5cGVzXCIsXHJcbiAgICAgICAgICAgIHRlbXA6IFwiLnRlbXBcIixcclxuICAgICAgICAgICAgbGliOiBcImxpYlwiLFxyXG4gICAgICAgICAgICBleHRlcm5hbDogXCJleHRlcm5hbFwiLFxyXG4gICAgICAgICAgICBwb3J0aW5nOiBcInBvcnRpbmdcIixcclxuICAgICAgICAgICAgcmVzOiBcInJlc1wiLFxyXG4gICAgICAgICAgICBzcmNDb25maWc6IHtcclxuICAgICAgICAgICAgICAgIHNjcmlwdDogXCJzY3JpcHRzXCIsXHJcbiAgICAgICAgICAgICAgICBzdHlsZXNoZWV0OiBcInN0eWxlc2hlZXRzXCIsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogXCJ0ZW1wbGF0ZXNcIixcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogY3JlYXRlIGFjdGlvbiBlbnRyeVxyXG4gICAgICogQHBhcmFtIHtJTGlicmFyeUNvbmZpZ3JhdGlvbn0gY29uZmlnIOOCs+ODs+ODleOCo+OCsOioreWumlxyXG4gICAgICovXHJcbiAgICBhc3luYyBjcmVhdGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgZGVidWcoSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcsIG51bGwsIDQpKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVDb3Jkb3ZhKCkpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGRpcih0aGlzLnJvb3REaXIpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZUNvcmRvdmFTY2FmZm9sZCgpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNvbmZpZ1hNTCgpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkZENvcmRvdmFQbGF0Zm9ybXMoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRDb3Jkb3ZhUGx1Z2lucygpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkZENvcmRvdmFFeHRlbnRpb25GaWxlcygpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNhY2hlQ29yZG92YVBhY2thZ2VKU09OKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hkaXIoXCIuLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlRGlyZWN0b3J5U3RydWN0dXJlKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVQcm9qZWN0U2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZVNvdXJjZVRlbXBsYXRlKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVWaXN1YWxTdHVkaW9Tb2x1dGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5b+F6KaB44Go44GZ44KLIHRhc2sgc2NyaXB0IOS4gOimp+OCkui/lOWNtC4gYWN0aW9uOiBjcmVhdGUg44Gu44Go44GN44Gr5ZG844Gw44KM44KLXHJcbiAgICAgKi9cclxuICAgIGdldCB0YXNrTGlzdCgpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgXCJiYW5uZXIuanNcIixcclxuICAgICAgICAgICAgXCJjbGVhbi5qc1wiLFxyXG4gICAgICAgICAgICBcImNvbW1hbmQuanNcIixcclxuICAgICAgICAgICAgXCJleHRlcm5hbC1yZWFycmFuZ2UuanNcIixcclxuICAgICAgICAgICAgXCJtaW5pZnkuanNcIixcclxuICAgICAgICAgICAgXCJzcmNtYXAuanNcIixcclxuICAgICAgICAgICAgXCJidW5kbGUtZmluYWxpemVyLmpzXCIsXHJcbiAgICAgICAgICAgIFwicmVtYXAtY292ZXJhZ2UuanNcIixcclxuICAgICAgICBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAvLyBwcm90ZWN0ZWQgbWV0aG9kczpcclxuXHJcbiAgICAvKipcclxuICAgICAqIOmWi+eZuuaZguOBruS+neWtmOODouOCuOODpeODvOODq+ODquOCueODiOOBruWPluW+l1xyXG4gICAgICog5b+F6KaB44Gr5b+c44GY44Gm44Kq44O844OQ44O844Op44Kk44OJXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7SURlcGVuZGVuY3l9XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgZGVmYXVsdERldkRlcGVuZGVuY2llcygpOiBJRGVwZW5kZW5jeVtdIHtcclxuICAgICAgICBjb25zdCBkZXBlbmRzID0gc3VwZXIuZGVmYXVsdERldkRlcGVuZGVuY2llcy5jb25jYXQoW1xyXG4gICAgICAgICAgICB7IG5hbWU6IFwiQHR5cGVzL2phc21pbmVcIiwgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwiQHR5cGVzL3JlcXVpcmVqc1wiLCAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwiYXV0b3ByZWZpeGVyXCIsICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwiY2xlYW4tY3NzXCIsICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwiZnMtZXh0cmFcIiwgICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwiaHRtbC1taW5pZmllclwiLCAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwibm9kZS1zYXNzXCIsICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwicG9zdGNzcy1jbGlcIiwgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwic21hcnR3YXRjaFwiLCAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICBjb25zdCBleHRyYSA9IFtdO1xyXG4gICAgICAgIHRoaXMuY29uZmlnLmRldkRlcGVuZGVuY2llcy5mb3JFYWNoKChkZXBlbmQpID0+IHtcclxuICAgICAgICAgICAgZXh0cmEucHVzaCh7IG5hbWU6IGRlcGVuZC5uYW1lLCB2ZXJzaW9uOiBkZXBlbmQudmVyc2lvbiwgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlQ29yZG92YSgpKSB7XHJcbiAgICAgICAgICAgIGV4dHJhLnB1c2goeyBuYW1lOiBcIkB0eXBlcy9jb3Jkb3ZhXCIsIHZlcnNpb246IHVuZGVmaW5lZCwgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gXy5zb3J0QnkoZGVwZW5kcy5jb25jYXQoZXh0cmEpLCAoZGVwZW5kKSA9PiBkZXBlbmQubmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBlc2xpbnRyYyDjgavmjIflrprjgZnjgosgdGVtcGxhdGUgcGFyYW1hZXRlciDjgpLlj5blvpdcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IOODhuODs+ODl+ODrOODvOODiOODkeODqeODoeODvOOCv+OCquODluOCuOOCp+OCr+ODiFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgcXVlcnlFc0xpbnRFbnZQYXJhbSgpOiBhbnkge1xyXG4gICAgICAgIGNvbnN0IGJhc2UgPSBzdXBlci5xdWVyeUVzTGludEVudlBhcmFtKCk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uYmFzZSxcclxuICAgICAgICAgICAgLi4ue1xyXG4gICAgICAgICAgICAgICAgY29yZG92YTogdGhpcy5pc0VuYWJsZUNvcmRvdmEoKSxcclxuICAgICAgICAgICAgICAgIGhhbW1lcmpzOiB0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaGFtbWVyanNcIiksXHJcbiAgICAgICAgICAgICAgICBpc2Nyb2xsOiB0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaXNjcm9sbFwiKSxcclxuICAgICAgICAgICAgICAgIGZsaXBzbmFwOiB0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiZmxpcHNuYXBcIiksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHRzY29uZmlnLmJhc2Ug44Gr5oyH5a6a44GZ44KLIHRlbXBsYXRlIHBhcmFtYWV0ZXIg44KS5Y+W5b6XXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSDjg4bjg7Pjg5fjg6zjg7zjg4jjg5Hjg6njg6Hjg7zjgr/jgqrjg5bjgrjjgqfjgq/jg4hcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHF1ZXJ5VHNDb25maWdCYXNlUGFyYW0oKTogYW55IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi50aGlzLl9jb25maWcsXHJcbiAgICAgICAgICAgIC4uLntcclxuICAgICAgICAgICAgICAgIGNvcmRvdmE6IHRoaXMuaXNFbmFibGVDb3Jkb3ZhKCksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgLy8gcHJpdmF0ZSBtZXRob2RzOlxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6ZaL55m65pmC44Gu5L6d5a2Y44Oi44K444Ol44O844Or44Oq44K544OI44Gu5Y+W5b6XXHJcbiAgICAgKiDlv4XopoHjgavlv5zjgZjjgabjgqrjg7zjg5Djg7zjg6njgqTjg4lcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtJRGVwZW5kZW5jeX1cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXQgZGVmYXVsdERlcGVuZGVuY2llcygpOiBJRGVwZW5kZW5jeVtdIHtcclxuICAgICAgICBjb25zdCBkZXBlbmRzID0gW1xyXG4gICAgICAgICAgICB7IG5hbWU6IFwiQGNkcC9tb2JpbGVcIiwgIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiBcImJhY2tib25lXCIsICAgICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogXCJqcXVlcnlcIiwgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwicmVxdWlyZWpzXCIsICAgIHZlcnNpb246IHVuZGVmaW5lZCwgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiBcInVuZGVyc2NvcmVcIiwgICB2ZXJzaW9uOiB1bmRlZmluZWQsIH0sXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgY29uc3QgZXh0cmEgPSBbXTtcclxuICAgICAgICB0aGlzLmNvbmZpZy5kZXBlbmRlbmNpZXMuZm9yRWFjaCgoZGVwZW5kKSA9PiB7XHJcbiAgICAgICAgICAgIGV4dHJhLnB1c2goeyBuYW1lOiBkZXBlbmQubmFtZSwgdmVyc2lvbjogZGVwZW5kLnZlcnNpb24sIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gXy5zb3J0QnkoZGVwZW5kcy5jb25jYXQoZXh0cmEpLCAoZGVwZW5kKSA9PiBkZXBlbmQubmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBjb25maWdyYXRpb24g44Gr44Ki44Kv44K744K5XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0IGNvbmZpZygpOiBJTW9iaWxlQXBwQ29uZmlncmF0aW9uIHtcclxuICAgICAgICByZXR1cm4gPElNb2JpbGVBcHBDb25maWdyYXRpb24+dGhpcy5fY29uZmlnO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogY29yZG92YSDjga7mnInlirkv54Sh5Yq544OB44Kn44OD44KvXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgdHJ1ZTog5pyJ5Yq5IC8gZmFsc2U6IOeEoeWKuVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGlzRW5hYmxlQ29yZG92YSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKDAgPCB0aGlzLmNvbmZpZy5wbGF0Zm9ybXMubGVuZ3RoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGxpYi9wb3J0aW5nIOOBruioreWumueKtuazgeOBruODgeOCp+ODg+OCr1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB0YXJnZXRcclxuICAgICAqIEByZXR1cm5zIHRydWU6IOioreWumiAvIGZhbHNlOiDmnKroqK3lrppcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBoYXNTdHJ1Y3R1cmVPZih0YXJnZXQ6IFwibGliXCIgfCBcInBvcnRpbmdcIik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5jb25maWcucHJvamVjdFN0cnVjdHVyZSAmJiAwIDw9IHRoaXMuY29uZmlnLnByb2plY3RTdHJ1Y3R1cmUuaW5kZXhPZih0YXJnZXQpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOOCpOODs+OCueODiOODvOODq+WvvuixoS/pnZ7lr77osaHjg4Hjgqfjg4Pjgq9cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbmFtZSAgICBbaW5dIOODouOCuOODpeODvOODq+WQjVxyXG4gICAgICogQHBhcmFtIGRlcGVuZHMgW2luXSDmpJzntKLlr77osaEgKOaXouWumiB0aGlzLmNvbmZpZy5kZXBlbmRlbmNpZXMpXHJcbiAgICAgKiBAcmV0dXJucyB0cnVlOiDlr77osaEgLyBmYWxzZTog6Z2e5a++6LGhXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaXNJbnN0YWxsYXRpb25UYXJnZXQobmFtZTogc3RyaW5nLCBkZXBlbmRzOiBJRGVwZW5kZW5jeVtdID0gdGhpcy5jb25maWcuZGVwZW5kZW5jaWVzKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICEhZGVwZW5kcy5maW5kKChkZXBlbmQpID0+IG5hbWUgPT09IGRlcGVuZC5uYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogY29yZG92YSDjgpLnlKjjgYTjgZ/jg5fjg63jgrjjgqfjgq/jg4jkvZzmiJBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVDb3Jkb3ZhU2NhZmZvbGQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyhcIm1vYmlsZS5jcmVhdGUuY29yZG92YS5jcmVhdGVDb3Jkb3ZhU2NhZmZvbGRcIik7XHJcbiAgICAgICAgZGVidWcoXCJjcmVhdGVDb3Jkb3ZhU2NhZmZvbGRcIik7XHJcblxyXG4gICAgICAgIC8vIGAkIGNvcmRvdmEgY3JlYXRlIGNvb2wtbW9iaWxlIGNvbS5zb255LmNkcC5jb29sbW9iaWxlIFwiQ29vbCBNb2JpbGVcImBcclxuICAgICAgICBhd2FpdCBleGVjQ29tbWFuZChcImNvcmRvdmFcIiwgW1wiY3JlYXRlXCIsIHRoaXMuY29uZmlnLnByb2plY3ROYW1lLCB0aGlzLmNvbmZpZy5hcHBJZCwgdGhpcy5jb25maWcuYXBwTmFtZV0pO1xyXG5cclxuICAgICAgICAvLyByZW1vdmUgZmlsZXNcclxuICAgICAgICBnbG9iLnN5bmMoXCJ3d3cvKiovKlwiLCB7XHJcbiAgICAgICAgICAgIGN3ZDogdGhpcy5jb25maWcucHJvamVjdE5hbWUsXHJcbiAgICAgICAgfSkuZm9yRWFjaCgoZmlsZSkgPT4ge1xyXG4gICAgICAgICAgICBmcy5yZW1vdmVTeW5jKHBhdGguam9pbih0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZSwgZmlsZSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5qb2luKHRoaXMuY29uZmlnLnByb2plY3ROYW1lLCBcInJlc1wiKSk7XHJcbiAgICAgICAgZnMucmVtb3ZlU3luYyhwYXRoLmpvaW4odGhpcy5jb25maWcucHJvamVjdE5hbWUsIFwiLm5wbWlnbm9yZVwiKSk7XHJcblxyXG4gICAgICAgIC8vIG1vdmUgcm9vdCBkaXJlY3RvcnlcclxuICAgICAgICBmcy5jb3B5U3luYyh0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZSwgXCIuL1wiKTtcclxuICAgICAgICBmcy5yZW1vdmVTeW5jKHRoaXMuY29uZmlnLnByb2plY3ROYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGNvbmZpZy54bWwg44Gu5L+u5q2jXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgdXBkYXRlQ29uZmlnWE1MKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MoXCJtb2JpbGUuY3JlYXRlLmNvcmRvdmEudXBkYXRlQ29uZmlnWG1sXCIpO1xyXG4gICAgICAgIGRlYnVnKFwidXBkYXRlQ29uZmlnWE1MXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBjb25maWdYbWxQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiY29uZmlnLnhtbFwiKTtcclxuICAgICAgICBjb25zdCAkY29uZmlnWG1sRG9tID0gJChzdHIyWG1sTm9kZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnWG1sUGF0aCkudG9TdHJpbmcoKSkpO1xyXG5cclxuICAgICAgICAkY29uZmlnWG1sRG9tXHJcbiAgICAgICAgICAgIC5maW5kKFwid2lkZ2V0XCIpXHJcbiAgICAgICAgICAgIC5hdHRyKFwidmVyc2lvblwiLCB0aGlzLmNvbmZpZy52ZXJzaW9uKVxyXG4gICAgICAgICAgICAuYXR0cihcImlvcy1DRkJ1bmRsZUlkZW50aWZpZXJcIiwgdGhpcy5jb25maWcuYXBwSWQpXHJcbiAgICAgICAgICAgIC5wcmVwZW5kKHN0cjJYbWxOb2RlKGBcclxuICAgICAgICAgICAgICAgIDxwcmVmZXJlbmNlIG5hbWU9XCJEaXNhbGxvd092ZXJzY3JvbGxcIiB2YWx1ZT1cInRydWVcIi8+XHJcbiAgICAgICAgICAgICAgICA8cHJlZmVyZW5jZSBuYW1lPVwiS2V5Ym9hcmREaXNwbGF5UmVxdWlyZXNVc2VyQWN0aW9uXCIgdmFsdWU9XCJmYWxzZVwiLz5cclxuICAgICAgICAgICAgICAgIDxwcmVmZXJlbmNlIG5hbWU9XCJCYWNrZ3JvdW5kQ29sb3JcIiB2YWx1ZT1cIjB4ZmYwMDAwMDBcIiAvPlxyXG4gICAgICAgICAgICBgKSlcclxuICAgICAgICAgICAgO1xyXG5cclxuICAgICAgICAvLyByZW1vdmUgY29yZG92YSB0ZWFtIGluZm9ybWF0aW9uXHJcbiAgICAgICAgJGNvbmZpZ1htbERvbVxyXG4gICAgICAgICAgICAuZmluZChcImRlc2NyaXB0aW9uXCIpXHJcbiAgICAgICAgICAgIC5yZW1vdmUoKTtcclxuICAgICAgICAkY29uZmlnWG1sRG9tXHJcbiAgICAgICAgICAgIC5maW5kKFwiYXV0aG9yXCIpXHJcbiAgICAgICAgICAgIC5yZW1vdmUoKTtcclxuXHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdYbWxQYXRoLCBmb3JtYXRYTUwoeG1sTm9kZTJTdHIoJGNvbmZpZ1htbERvbSkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHBsYXRmb3JtIOi/veWKoFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGFkZENvcmRvdmFQbGF0Zm9ybXMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgZGVidWcoXCJhZGRDb3Jkb3ZhUGxhdGZvcm1zXCIpO1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXRzID0gdGhpcy5jb25maWcucGxhdGZvcm1zLnNsaWNlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGFyZ2V0cy5pbmRleE9mKFwiaW9zXCIpO1xyXG4gICAgICAgIGlmICgwIDw9IGluZGV4ICYmIFwiZGFyd2luXCIgIT09IHByb2Nlc3MucGxhdGZvcm0pIHtcclxuICAgICAgICAgICAgdGhpcy53YXJuKFwibW9iaWxlLmNyZWF0ZS5jb3Jkb3ZhLmlPU1dhcm5pbmdcIik7XHJcbiAgICAgICAgICAgIHRhcmdldHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgaWYgKHRhcmdldHMubGVuZ3RoIDw9IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyhcIm1vYmlsZS5jcmVhdGUuY29yZG92YS5hZGRQbGF0Zm9ybXNcIik7XHJcblxyXG4gICAgICAgIC8vIGAkIGNvcmRvdmEgcGxhdGZvcm0gYWRkIGFuZHJvaWQgaW9zYFxyXG4gICAgICAgIGF3YWl0IGV4ZWNDb21tYW5kKFwiY29yZG92YVwiLCBbXCJwbGF0Zm9ybVwiLCBcImFkZFwiXS5jb25jYXQodGFyZ2V0cykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogcGx1Z2luIOi/veWKoFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGFkZENvcmRvdmFQbHVnaW5zKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MoXCJtb2JpbGUuY3JlYXRlLmNvcmRvdmEuYWRkUGx1Z2luc1wiKTtcclxuICAgICAgICBkZWJ1ZyhcImFkZENvcmRvdmFQbHVnaW5zXCIpO1xyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIEkvRiDjga/opIfmlbDjga7jg5fjg6njgrDjgqTjg7PjgpLkuIDmi6zjgafov73liqDjgZnjgovjgZPjgajjgYzlj6/og73jgaDjgYzjgIFcclxuICAgICAgICAgKiBjb3Jkb3ZhIHZlcnNpb24g44KS5Yik5a6a44GX44Gm44GE44KL44OX44Op44Kw44Kk44Oz44Gv6Kqk5Yik5a6a44GZ44KL44GT44Go44GM44GC44KL44Gf44KB44CBXHJcbiAgICAgICAgICogMeOBpOOBmuOBpOi/veWKoOOBmeOCi1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICog5Lul5LiL44Gu5LiN5YW35ZCI44Gr6aGe5Ly844GZ44KL54++6LGhXHJcbiAgICAgICAgICogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQi0xMjY2M1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gdGhpcy5jb25maWcuY29yZG92YV9wbHVnaW4ubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIC8vIGAkIGNvcmRvdmEgcGx1Z2luIGFkZCBjb3Jkb3ZhLXBsdWdpbi1pbmFwcGJyb3dzZXJgXHJcbiAgICAgICAgICAgIGF3YWl0IGV4ZWNDb21tYW5kKFwiY29yZG92YVwiLCBbXCJwbHVnaW5cIiwgXCJhZGRcIiwgdGhpcy5jb25maWcuY29yZG92YV9wbHVnaW5baV0ubmFtZV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGNvcmRvdmEgcHJvamVjdCDjgavov73liqDjgZnjgovjg6rjgr3jg7zjgrnjgpLjgrPjg5Tjg7xcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBhZGRDb3Jkb3ZhRXh0ZW50aW9uRmlsZXMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyhcIm1vYmlsZS5jcmVhdGUuY29yZG92YS5hZGRFeHRlbnNpb25zXCIpO1xyXG4gICAgICAgIGRlYnVnKFwiYWRkQ29yZG92YUV4dGVudGlvbkZpbGVzXCIpO1xyXG4gICAgICAgIHRoaXMuY29weVRwbERpcihcIm1vYmlsZS9jb3Jkb3ZhXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogY29yZG92YSDjgYznlJ/miJDjgZfjgZ8gcGFja2FnZS5qc29uIOOCkuOCreODo+ODg+OCt+ODpVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGNhY2hlQ29yZG92YVBhY2thZ2VKU09OKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKFwiLi9wYWNrYWdlLmpzb25cIikpIHtcclxuICAgICAgICAgICAgdGhpcy5jb25maWcuY29yZG92YVBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoXCIuL3BhY2thZ2UuanNvblwiKS50b1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlbW92ZSBjb3Jkb3ZhIHRlYW0gaW5mb3JtYXRpb25cclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29uZmlnLmNvcmRvdmFQYWNrYWdlSnNvbi5uYW1lO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jb25maWcuY29yZG92YVBhY2thZ2VKc29uLnZlcnNpb247XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbmZpZy5jb3Jkb3ZhUGFja2FnZUpzb24uZGlzcGxheU5hbWU7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbmZpZy5jb3Jkb3ZhUGFja2FnZUpzb24ubWFpbjtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29uZmlnLmNvcmRvdmFQYWNrYWdlSnNvbi5zY3JpcHRzO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jb25maWcuY29yZG92YVBhY2thZ2VKc29uLmF1dGhvcjtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29uZmlnLmNvcmRvdmFQYWNrYWdlSnNvbi5kZXNjcmlwdGlvbjtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29uZmlnLmNvcmRvdmFQYWNrYWdlSnNvbi5saWNlbnNlO1xyXG5cclxuICAgICAgICAgICAgLy8g44OV44Kh44Kk44Or44Gv44GE44Gj44Gf44KT5YmK6ZmkXHJcbiAgICAgICAgICAgIGZzLnJlbW92ZVN5bmMoXCIuL3BhY2thZ2UuanNvblwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLy9cclxuXHJcbiAgICAvKipcclxuICAgICAqIOODh+OCo+ODrOOCr+ODiOODquani+aIkOaDheWgseOBruOCs+ODlOODvFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZURpcmVjdG9yeVN0cnVjdHVyZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnByb2dyZXNzKFwibW9iaWxlLmNyZWF0ZS5hcHAuY3JlYXRlRGlyZWN0b3J5U3RydWN0dXJlXCIpO1xyXG4gICAgICAgIGRlYnVnKFwiY3JlYXRlRGlyZWN0b3J5U3RydWN0dXJlXCIpO1xyXG5cclxuICAgICAgICAvLyBhcHAgYmFzZSBzdHJ1Y3R1cmVcclxuICAgICAgICB0aGlzLmNvcHlUcGxEaXIoXCJtb2JpbGUvc3RydWN0dXJlL2Jhc2VcIik7XHJcblxyXG4gICAgICAgIC8vIGxpYlxyXG4gICAgICAgIGlmICh0aGlzLmhhc1N0cnVjdHVyZU9mKFwibGliXCIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29weVRwbERpcihcclxuICAgICAgICAgICAgICAgIFwibW9iaWxlL3N0cnVjdHVyZS9saWJcIixcclxuICAgICAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMsIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5saWIpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBwb3J0aW5nXHJcbiAgICAgICAgaWYgKHRoaXMuaGFzU3RydWN0dXJlT2YoXCJwb3J0aW5nXCIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29weVRwbERpcihcclxuICAgICAgICAgICAgICAgIFwibW9iaWxlL3N0cnVjdHVyZS9wb3J0aW5nXCIsXHJcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcucG9ydGluZylcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGNyZWF0ZTogZGV2L3BvcnRpbmcvQHR5cGVzXHJcbiAgICAgICAgICAgIGZzLmNvcHlTeW5jKFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVQYXRoKFwiYmFzZS8uZ2l0a2VlcFwiKSxcclxuICAgICAgICAgICAgICAgIHBhdGguam9pbihcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3REaXIsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYyxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcucG9ydGluZyxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcudHlwZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgXCIuZ2l0a2VlcFwiXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBQTEFURk9STVNfUk9PVCA9IHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwicGxhdGZvcm1zXCIpO1xyXG4gICAgICAgICAgICBmcy5yZWFkZGlyU3luYyhQTEFURk9STVNfUk9PVClcclxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKChwbGF0Zm9ybSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmcy5zdGF0U3luYyhwYXRoLmpvaW4oUExBVEZPUk1TX1JPT1QsIHBsYXRmb3JtKSkuaXNEaXJlY3RvcnkoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvcHlUcGxEaXIoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm1vYmlsZS9zdHJ1Y3R1cmUvcG9ydGluZ1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKFBMQVRGT1JNU19ST09ULCBwbGF0Zm9ybSwgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnBvcnRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyB3d3dcclxuICAgICAgICBjb25zdCBXV1cgPSBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcucGtnKTtcclxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoV1dXKSkge1xyXG4gICAgICAgICAgICBmcy5ta2RpcihXV1cpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmcy5jb3B5U3luYyh0ZW1wbGF0ZVBhdGgoXCJiYXNlLy5naXRrZWVwXCIpLCBwYXRoLmpvaW4oV1dXLCBcIi5naXRrZWVwXCIpKTtcclxuXHJcbiAgICAgICAgLy8gdGFza1xyXG4gICAgICAgIGdsb2Iuc3luYyhcIioqLypcIiwge1xyXG4gICAgICAgICAgICBjd2Q6IHRlbXBsYXRlUGF0aChcIm1vYmlsZS90YXNrXCIpLFxyXG4gICAgICAgIH0pLmZvckVhY2goKGZpbGUpID0+IHtcclxuICAgICAgICAgICAgZnMuY29weVN5bmMoXHJcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibW9iaWxlL3Rhc2tcIiksIGZpbGUpLFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnRhc2ssIGZpbGUpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDjg5fjg63jgrjjgqfjgq/jg4joqK3lrprjg5XjgqHjgqTjg6vjga7kvZzmiJBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVQcm9qZWN0U2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyhcIm1vYmlsZS5jcmVhdGUuYXBwLmNyZWF0ZVByb2plY3RTZXR0aW5nc1wiKTtcclxuICAgICAgICBkZWJ1ZyhcImNyZWF0ZVByb2plY3RTZXR0aW5nc1wiKTtcclxuXHJcbiAgICAgICAgLy8gcHJvamVjdC5jb25maWcuanNcclxuICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibW9iaWxlXCIpLCBcIl9wcm9qZWN0LmNvbmZpZy5qc1wiKSxcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJwcm9qZWN0LmNvbmZpZy5qc1wiKSxcclxuICAgICAgICAgICAgJC5leHRlbmQoe30sIHRoaXMuX2NvbmZpZywge1xyXG4gICAgICAgICAgICAgICAgaG9nYW46IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJob2dhbi5qc1wiKSxcclxuICAgICAgICAgICAgICAgIGhhbW1lcmpzOiB0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaGFtbWVyanNcIiksXHJcbiAgICAgICAgICAgICAgICBpc2Nyb2xsOiB0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaXNjcm9sbFwiKSxcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyB0c2NvbmZpZ1xyXG4gICAgICAgIC8vIHRzY29uZmlnLmJhc2UuanNvblxyXG4gICAgICAgIGNvcHlUcGwoXHJcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJtb2JpbGVcIiksIFwiX3RzY29uZmlnLmJhc2UuanNvblwiKSxcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJ0c2NvbmZpZy5iYXNlLmpzb25cIiksXHJcbiAgICAgICAgICAgIHRoaXMucXVlcnlUc0NvbmZpZ0Jhc2VQYXJhbSgpLFxyXG4gICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIG1haW4gdHNjb25maWcuanNvblxyXG4gICAgICAgIGNvcHlUcGwoXHJcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJtb2JpbGVcIiksIFwiX3RzY29uZmlnLmpzb25cIiksXHJcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwidHNjb25maWcuanNvblwiKSxcclxuICAgICAgICAgICAgdGhpcy5fY29uZmlnLFxyXG4gICAgICAgICAgICB7IGRlbGltaXRlcnM6IFwiPCUgJT5cIiwgYm9tOiBmYWxzZSwgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIGVzbGludHJjLmpzb25cclxuICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibW9iaWxlXCIpLCBcIl9lc2xpbnRyYy5qc29uXCIpLFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnRlc3QsIFwiZXNsaW50XCIsIFwiZXNsaW50cmMuanNvblwiKSxcclxuICAgICAgICAgICAgdGhpcy5xdWVyeUVzTGludEVudlBhcmFtKCksXHJcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiLCBib206IGZhbHNlLCB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gdGVzdGVtXHJcbiAgICAgICAgY29weVRwbChcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZS90b29scy90ZXN0ZW1cIiksIFwiX3Rlc3RlbS5qc29uXCIpLFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnRlc3QsIFwicnVubmVyXCIsIFwidGVzdGVtLmpzb25cIiksXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcclxuICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIsIGJvbTogZmFsc2UsIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCB0ZXN0ZW1TdHVmZlBhdGggPSB0ZW1wbGF0ZVBhdGgoXCJtb2JpbGUvdG9vbHMvdGVzdGVtL3J1bm5lclwiKTtcclxuXHJcbiAgICAgICAgZ2xvYi5zeW5jKFwiKipcIiwge1xyXG4gICAgICAgICAgICBjd2Q6IHRlc3RlbVN0dWZmUGF0aCxcclxuICAgICAgICAgICAgbm9kaXI6IHRydWUsXHJcbiAgICAgICAgfSlcclxuICAgICAgICAgICAgLmZvckVhY2goKGZpbGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGZzLmNvcHlTeW5jKFxyXG4gICAgICAgICAgICAgICAgICAgIHBhdGguam9pbih0ZXN0ZW1TdHVmZlBhdGgsIGZpbGUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcudGVzdCwgXCJydW5uZXJcIiwgZmlsZSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyAuZ2l0aWdub3JlXHJcbiAgICAgICAgY29weVRwbChcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZVwiKSwgXCJfZ2l0aWdub3JlXCIpLFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcIi5naXRpZ25vcmVcIiksXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyxcclxuICAgICAgICAgICAgeyBib206IGZhbHNlLCB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gUkVBRE1FLm1kXHJcbiAgICAgICAgY29weVRwbChcclxuICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZVwiKSwgXCJfUkVBRE1FLm1kXCIpLFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCBcIlJFQURNRS5tZFwiKSxcclxuICAgICAgICAgICAgJC5leHRlbmQoe30sIHRoaXMuX2NvbmZpZywge1xyXG4gICAgICAgICAgICAgICAgY29yZG92YTogdGhpcy5pc0VuYWJsZUNvcmRvdmEoKSxcclxuICAgICAgICAgICAgICAgIGxpYjogdGhpcy5oYXNTdHJ1Y3R1cmVPZihcImxpYlwiKSxcclxuICAgICAgICAgICAgICAgIHBvcnRpbmc6IHRoaXMuaGFzU3RydWN0dXJlT2YoXCJwb3J0aW5nXCIpLFxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIFRPRE86IHRlbXBsYXRlcy9tb2JpbGUvYWRkb24g44GL44KJ44Kz44OU44O844GZ44KL5aC05ZCI44Gv44GT44GT44Gn5a++5b+cXHJcblxyXG4gICAgICAgIC8vIHBhY2thZ2UuanNvblxyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkQ29uZmlnID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMuY29uZmlnKTtcclxuICAgICAgICByZXNvbHZlZENvbmZpZy5kZXBlbmRlbmNpZXMgPSBhd2FpdCB0aGlzLnF1ZXJ5RGVwZW5kZW5jaWVzUGFyYW0odGhpcy5kZWZhdWx0RGVwZW5kZW5jaWVzKTtcclxuICAgICAgICByZXNvbHZlZENvbmZpZy5kZXZEZXBlbmRlbmNpZXMgPSBhd2FpdCB0aGlzLnF1ZXJ5RGVwZW5kZW5jaWVzUGFyYW0odGhpcy5kZWZhdWx0RGV2RGVwZW5kZW5jaWVzKTtcclxuICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibW9iaWxlXCIpLCBcIl9wYWNrYWdlLmpzb25cIiksXHJcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwicGFja2FnZS5qc29uXCIpLFxyXG4gICAgICAgICAgICByZXNvbHZlZENvbmZpZyxcclxuICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIsIGJvbTogZmFsc2UsIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyBjb3Jkb3ZhUGFja2FnZUpTT04g44Go44Oe44O844K4XHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmNvcmRvdmFQYWNrYWdlSnNvbikge1xyXG4gICAgICAgICAgICBjb25zdCBQS0dfUEFUSCA9IHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwicGFja2FnZS5qc29uXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhQS0dfUEFUSCkudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICQuZXh0ZW5kKHRydWUsIHBrZywgdGhpcy5jb25maWcuY29yZG92YVBhY2thZ2VKc29uKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNvcnRLZXlzID0gKHRhcmdldDogb2JqZWN0KTogb2JqZWN0ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRlZCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXModGFyZ2V0KS5zb3J0KCkuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc29ydGVkW2tleV0gPSB0YXJnZXRba2V5XTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvcnRlZDtcclxuXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHBrZy5kZXBlbmRlbmNpZXMgICAgPSBzb3J0S2V5cyhwa2cuZGVwZW5kZW5jaWVzKTtcclxuICAgICAgICAgICAgcGtnLmRldkRlcGVuZGVuY2llcyA9IHNvcnRLZXlzKHBrZy5kZXZEZXBlbmRlbmNpZXMpO1xyXG5cclxuICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhQS0dfUEFUSCwgSlNPTi5zdHJpbmdpZnkocGtnLCBudWxsLCAyKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog44K944O844K544Gu6Zub5b2i5L2c5oiQXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlU291cmNlVGVtcGxhdGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyhcIm1vYmlsZS5jcmVhdGUuYXBwLmNyZWF0ZVNvdXJjZVRlbXBsYXRlXCIpO1xyXG4gICAgICAgIGRlYnVnKFwiY3JlYXRlU291cmNlVGVtcGxhdGVcIik7XHJcblxyXG4gICAgICAgIC8vIGNvcHkgc291cmNlc1xyXG4gICAgICAgIHRoaXMuY29weVRwbERpcihcclxuICAgICAgICAgICAgXCJtb2JpbGUvc3JjL3N0cnVjdHVyZVwiLFxyXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHsgLy8gY29uZmlnLnRzXHJcbiAgICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWwgPSAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmRlcGVuZGVuY2llcy5sZW5ndGggPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Q6IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0V2l0aEN1c3RvbU5hbWU6IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldHMgPSBbLi4udGhpcy5jb25maWcuZGVwZW5kZW5jaWVzLCAuLi50aGlzLmNvbmZpZy5yZXNvdXJjZV9hZGRvbl07XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRzLmZvckVhY2goKGluZm8pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5maWxlTmFtZSB8fCBpbmZvLnZlbmRlck5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uYWRkaXRpb25hbC5saXN0V2l0aEN1c3RvbU5hbWUucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lOiBpbmZvLmFsaWFzIHx8IGluZm8ubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRlck5hbWU6IGluZm8udmVuZGVyTmFtZSB8fCBpbmZvLmFsaWFzIHx8IGluZm8ubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBpbmZvLmZpbGVOYW1lIHx8IGluZm8uYWxpYXMgfHwgaW5mby5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5hZGRpdGlvbmFsLmxpc3QucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lOiBpbmZvLmFsaWFzIHx8IGluZm8ubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW07XHJcbiAgICAgICAgICAgIH0pKCk7XHJcblxyXG4gICAgICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZS9zcmNcIiksIFwiX2NvbmZpZy50c1wiKSxcclxuICAgICAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMsIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmNDb25maWcuc2NyaXB0LCBcImNvbmZpZy50c1wiKSxcclxuICAgICAgICAgICAgICAgICQuZXh0ZW5kKHt9LCB0aGlzLl9jb25maWcsIGFkZGl0aW9uYWwpLFxyXG4gICAgICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgeyAvLyBhcHAudHNcclxuICAgICAgICAgICAgY29uc3QgZ2xvYmFscyA9ICgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWcuZGVwZW5kZW5jaWVzLmxlbmd0aCA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbHM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0c0xpc3Q6IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzTGlzdDogW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0V4cG9ydHM6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldHMgPSBbLi4udGhpcy5jb25maWcuZGVwZW5kZW5jaWVzLCAuLi50aGlzLmNvbmZpZy5yZXNvdXJjZV9hZGRvbl07XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRzLmZvckVhY2goKGluZm8pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5nbG9iYWxFeHBvcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZ2xvYmFscy5leHBvcnRzTGlzdC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbEV4cG9ydDogaW5mby5nbG9iYWxFeHBvcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lOiBpbmZvLmFsaWFzIHx8IGluZm8ubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZ2xvYmFscy5pbXBvcnRzTGlzdC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZU5hbWU6IGluZm8uYWxpYXMgfHwgaW5mby5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHBhcmFtLmdsb2JhbHMuaGFzRXhwb3J0cyA9ICgwIDwgcGFyYW0uZ2xvYmFscy5leHBvcnRzTGlzdC5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtO1xyXG4gICAgICAgICAgICB9KSgpO1xyXG5cclxuICAgICAgICAgICAgY29weVRwbChcclxuICAgICAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJtb2JpbGUvc3JjXCIpLCBcIl9hcHAudHNcIiksXHJcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjLCB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjQ29uZmlnLnNjcmlwdCwgXCJhcHAudHNcIiksXHJcbiAgICAgICAgICAgICAgICBnbG9iYWxzLFxyXG4gICAgICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgey8vIGxvY2FsaXplIHJlc291cmNlc1xyXG4gICAgICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZS9zcmMvX2xvY2FsZXNcIiksIFwiX21lc3NhZ2VzLmVuLVVTLmpzb25cIiksXHJcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4oXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290RGlyLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnJlcyxcclxuICAgICAgICAgICAgICAgICAgICBcImxvY2FsZXNcIixcclxuICAgICAgICAgICAgICAgICAgICBcIm1lc3NhZ2VzLmVuLVVTLmpzb25cIlxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIsIGJvbTogZmFsc2UsIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgY29weVRwbChcclxuICAgICAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJtb2JpbGUvc3JjL19sb2NhbGVzXCIpLCBcIl9tZXNzYWdlcy5qYS1KUC5qc29uXCIpLFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdERpcixcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5yZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsb2NhbGVzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJtZXNzYWdlcy5qYS1KUC5qc29uXCJcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZyxcclxuICAgICAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiLCBib206IGZhbHNlLCB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIC8vIHJlbW92ZSAuZ2l0a2VlcFxyXG4gICAgICAgICAgICBmcy51bmxpbmtTeW5jKHBhdGguam9pbihcclxuICAgICAgICAgICAgICAgIHRoaXMucm9vdERpcixcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcucmVzLFxyXG4gICAgICAgICAgICAgICAgXCIuZ2l0a2VlcFwiXHJcbiAgICAgICAgICAgICkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgey8vIHBhdGNoLmRlcGVuZGVuY2llc1xyXG4gICAgICAgICAgICBjb3B5VHBsKFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZS9zcmMvX3BhdGNoLmRlcGVuZGVuY2llc1wiKSwgXCJfaW5kZXguZC50c1wiKSxcclxuICAgICAgICAgICAgICAgIHBhdGguam9pbihcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3REaXIsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYyxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcuZXh0ZXJuYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnR5cGVzLFxyXG4gICAgICAgICAgICAgICAgICAgIFwicGF0Y2guZGVwZW5kZW5jaWVzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJpbmRleC5kLnRzXCJcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaGFtbWVyanM6IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJoYW1tZXJqc1wiKSxcclxuICAgICAgICAgICAgICAgICAgICBmbGlwc25hcDogdGhpcy5pc0luc3RhbGxhdGlvblRhcmdldChcImZsaXBzbmFwXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzY3JvbGw6IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJpc2Nyb2xsXCIpLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgLy8gY29weSBwYXRjaCBkLnRzXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaGFtbWVyanNcIikpIHtcclxuICAgICAgICAgICAgICAgIGZzLmNvcHlTeW5jKHRlbXBsYXRlUGF0aChcIm1vYmlsZS9zcmMvX3BhdGNoLmRlcGVuZGVuY2llcy9qcXVlcnkuaGFtbWVyLmQudHNcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3REaXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5leHRlcm5hbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnR5cGVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInBhdGNoLmRlcGVuZGVuY2llc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImpxdWVyeS5oYW1tZXIuZC50c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJmbGlwc25hcFwiKSkge1xyXG4gICAgICAgICAgICAgICAgZnMuY29weVN5bmModGVtcGxhdGVQYXRoKFwibW9iaWxlL3NyYy9fcGF0Y2guZGVwZW5kZW5jaWVzL2ZsaXBzbmFwLmQudHNcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3REaXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5leHRlcm5hbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnR5cGVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInBhdGNoLmRlcGVuZGVuY2llc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZsaXBzbmFwLmQudHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaXNjcm9sbFwiKSkge1xyXG4gICAgICAgICAgICAgICAgZnMuY29weVN5bmModGVtcGxhdGVQYXRoKFwibW9iaWxlL3NyYy9fcGF0Y2guZGVwZW5kZW5jaWVzL2lzY3JvbGwuZC50c1wiKSxcclxuICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdERpcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLmV4dGVybmFsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcudHlwZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicGF0Y2guZGVwZW5kZW5jaWVzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaXNjcm9sbC5kLnRzXCJcclxuICAgICAgICAgICAgICAgICAgICApKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gcmVtb3ZlIC5naXRrZWVwXHJcbiAgICAgICAgICAgIGZzLnVubGlua1N5bmMocGF0aC5qb2luKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5yb290RGlyLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyYyxcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5leHRlcm5hbCxcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50eXBlcyxcclxuICAgICAgICAgICAgICAgIFwiLmdpdGtlZXBcIlxyXG4gICAgICAgICAgICApKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHsvLyBpbmRleC5odG1sXHJcbiAgICAgICAgICAgIGNvcHlUcGwoXHJcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwibW9iaWxlL3NyY1wiKSwgXCJfaW5kZXguaHRtbFwiKSxcclxuICAgICAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIHRoaXMuY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmMsIFwiaW5kZXguaHRtbFwiKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmlzdWFsIFN0dWRpbyDjga7jgr3jg6rjg6Xjg7zjgrfjg6fjg7Pjg5XjgqHjgqTjg6vkvZzmiJBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVWaXN1YWxTdHVkaW9Tb2x1dGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCB2c1BhcmFtID0gKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcGFyYW06IElWaXN1YWxTdHVkaW9Db25maWdyYXRpb24gPSA8YW55PiQuZXh0ZW5kKHt9LCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnKTtcclxuXHJcbiAgICAgICAgICAgIHBhcmFtLnByb2plY3ROYW1lID0gdGhpcy5fY29uZmlnLnByb2plY3ROYW1lO1xyXG4gICAgICAgICAgICBwYXJhbS5wcm9qZWN0R1VJRCA9IGNyZWF0ZUdVSUQoKTtcclxuICAgICAgICAgICAgcGFyYW0udHlwZXMgPSBwYXJhbS50eXBlcy5yZXBsYWNlKFwiQFwiLCBcIiU0MFwiKTsgLy8gZXNjYXBlIFwiQFwiIHRvIFwiJTQwXCJcclxuICAgICAgICAgICAgcGFyYW0ubGljZW5zZSA9ICF0aGlzLl9jb25maWcucHJpdmF0ZTtcclxuXHJcbiAgICAgICAgICAgIC8vIGV4dGVybmFsXHJcbiAgICAgICAgICAgICg8YW55PnBhcmFtKS5jb3Jkb3ZhICAgID0gdGhpcy5pc0VuYWJsZUNvcmRvdmEoKTtcclxuICAgICAgICAgICAgKDxhbnk+cGFyYW0pLmhvZ2FuICAgICAgPSB0aGlzLmlzSW5zdGFsbGF0aW9uVGFyZ2V0KFwiaG9nYW4uanNcIik7XHJcbiAgICAgICAgICAgICg8YW55PnBhcmFtKS5oYW1tZXJqcyAgID0gdGhpcy5pc0luc3RhbGxhdGlvblRhcmdldChcImhhbW1lcmpzXCIpO1xyXG4gICAgICAgICAgICAoPGFueT5wYXJhbSkuaXNjcm9sbCAgICA9IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJpc2Nyb2xsXCIpO1xyXG4gICAgICAgICAgICAoPGFueT5wYXJhbSkuZmxpcHNuYXAgICA9IHRoaXMuaXNJbnN0YWxsYXRpb25UYXJnZXQoXCJmbGlwc25hcFwiKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHByb2plY3Qgc3RydWN0dXJlXHJcbiAgICAgICAgICAgICg8YW55PnBhcmFtKS5lbmFibGVMaWIgICAgICA9IHRoaXMuaGFzU3RydWN0dXJlT2YoXCJsaWJcIik7XHJcbiAgICAgICAgICAgICg8YW55PnBhcmFtKS5lbmFibGVQb3J0aW5nICA9IHRoaXMuaGFzU3RydWN0dXJlT2YoXCJwb3J0aW5nXCIpO1xyXG5cclxuICAgICAgICAgICAgLy8gcGxhdGZvcm1zXHJcbiAgICAgICAgICAgICg8YW55PnBhcmFtKS5wbGF0Zm9ybXMgPSBbLi4udGhpcy5jb25maWcucGxhdGZvcm1zXTtcclxuXHJcbiAgICAgICAgICAgIC8vIHNldHVwIGJ1aWx0IHRzIGdyb3VwXHJcbiAgICAgICAgICAgIHBhcmFtLnRzR3JvdXAgPSBbXTtcclxuICAgICAgICAgICAgZ2xvYi5zeW5jKFwiKiovKi50c1wiLCB7XHJcbiAgICAgICAgICAgICAgICBjd2Q6IHBhdGguam9pbihcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3REaXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW0uc3JjLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtLnNyY0NvbmZpZy5zY3JpcHRcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIH0pLmZvckVhY2goKGZpbGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGguam9pbihcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbS5zcmMsXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW0uc3JjQ29uZmlnLnNjcmlwdCxcclxuICAgICAgICAgICAgICAgICAgICBwYXRoLmRpcm5hbWUoZmlsZSlcclxuICAgICAgICAgICAgICAgICkucmVwbGFjZSgvXFwvL2csIFwiXFxcXFwiKSArIFwiXFxcXFwiO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGUsIFwiLnRzXCIpO1xyXG4gICAgICAgICAgICAgICAgcGFyYW0udHNHcm91cC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVBhdGg6IHJlbGF0aXZlUGF0aCxcclxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogZmlsZU5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZWU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgbWFwOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gc2V0dXAgdGVzdCB0cyBncm91cFxyXG4gICAgICAgICAgICBnbG9iLnN5bmMoXCIqKi8qLnRzXCIsIHtcclxuICAgICAgICAgICAgICAgIGN3ZDogcGF0aC5qb2luKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdERpcixcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zdHJ1Y3R1cmVDb25maWcudGVzdCxcclxuICAgICAgICAgICAgICAgICAgICBcInVuaXRcIlxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgfSkuZm9yRWFjaCgoZmlsZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGFyYW0udGVzdCArIFwiXFxcXHVuaXRcXFxcXCI7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZSwgXCIudHNcIik7XHJcbiAgICAgICAgICAgICAgICBwYXJhbS50c0dyb3VwLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlUGF0aDogcmVsYXRpdmVQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBmaWxlTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICBkZXBlbmRlZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBtYXA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XHJcbiAgICAgICAgfSkoKTtcclxuXHJcbiAgICAgICAgLy8gLnNsblxyXG4gICAgICAgIGNvcHlUcGwoXHJcbiAgICAgICAgICAgIHBhdGguam9pbih0ZW1wbGF0ZVBhdGgoXCJiYXNlL3Zpc3VhbC5zdHVkaW9cIiksIFwiX3NvbHV0aW9uLnNsbi50cGxcIiksXHJcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLnJvb3REaXIsIHZzUGFyYW0ucHJvamVjdE5hbWUgKyBcIi5zbG5cIiksXHJcbiAgICAgICAgICAgIHZzUGFyYW0sXHJcbiAgICAgICAgICAgIHsgZGVsaW1pdGVyczogXCI8JSAlPlwiIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyAuY3Nwcm9qXHJcbiAgICAgICAgKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdG9YbWxTdHJpbmcgPSAoZmlsZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGVvbDogb3MuRU9MLFxyXG4gICAgICAgICAgICAgICAgICAgIGJvbTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXJzOiBcInt7IH19XCIsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgY29uc3QganN0ID0gaG9nYW4uY29tcGlsZShub3JtYWxpemVUZXh0KGZzLnJlYWRGaWxlU3luYyhmaWxlKS50b1N0cmluZygpLCB7IGVvbDogXCJcXG5cIiwgYm9tOiBmYWxzZSB9KSwgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ganN0LnJlbmRlcih2c1BhcmFtKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRvWG1sRE9NID0gKGZpbGU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoJC5wYXJzZVhNTCh0b1htbFN0cmluZyhmaWxlKSkpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdG9YbWxOb2RlID0gKGZpbGU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0cjJYbWxOb2RlKHRvWG1sU3RyaW5nKGZpbGUpKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0ICRwcm9qID0gdG9YbWxET00ocGF0aC5qb2luKHRlbXBsYXRlUGF0aChcIm1vYmlsZS92aXN1YWwuc3R1ZGlvXCIpLCBcIl9wcm9qZWN0LmNzcHJvai50cGxcIikpO1xyXG4gICAgICAgICAgICBjb25zdCAkZ3BUUyA9IHRvWG1sTm9kZShwYXRoLmpvaW4odGVtcGxhdGVQYXRoKFwiYmFzZS92aXN1YWwuc3R1ZGlvXCIpLCBcIl90cy5pdGVtLmdyb3VwLnRwbFwiKSk7XHJcblxyXG4gICAgICAgICAgICAkcHJvalxyXG4gICAgICAgICAgICAgICAgLmZpbmQoXCJJdGVtR3JvdXBcIilcclxuICAgICAgICAgICAgICAgIC5sYXN0KClcclxuICAgICAgICAgICAgICAgIC5hZnRlcigkZ3BUUylcclxuICAgICAgICAgICAgICAgIDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRzdFBhdGggPSBwYXRoLmpvaW4odGhpcy5yb290RGlyLCB2c1BhcmFtLnByb2plY3ROYW1lICsgXCIuY3Nwcm9qXCIpO1xyXG4gICAgICAgICAgICBkZWJ1Zyh4bWxOb2RlMlN0cigkcHJvaikpO1xyXG4gICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRzdFBhdGgsIGZvcm1hdFhNTCh4bWxOb2RlMlN0cigkcHJvaikpKTtcclxuICAgICAgICB9KSgpO1xyXG5cclxuICAgICAgICAvLyB3ZWIuY29uZmlnXHJcbiAgICAgICAgZnMuY29weVN5bmModGVtcGxhdGVQYXRoKFwibW9iaWxlL3Zpc3VhbC5zdHVkaW8vX3dlYi5jb25maWdcIiksIHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwid2ViLmNvbmZpZ1wiKSk7XHJcbiAgICAgICAgZnMuY29weVN5bmModGVtcGxhdGVQYXRoKFwibW9iaWxlL3Zpc3VhbC5zdHVkaW8vX3dlYi5EZWJ1Zy5jb25maWdcIiksIHBhdGguam9pbih0aGlzLnJvb3REaXIsIFwid2ViLkRlYnVnLmNvbmZpZ1wiKSk7XHJcbiAgICAgICAgZnMuY29weVN5bmModGVtcGxhdGVQYXRoKFwibW9iaWxlL3Zpc3VhbC5zdHVkaW8vX3dlYi5SZWxlYXNlLmNvbmZpZ1wiKSwgcGF0aC5qb2luKHRoaXMucm9vdERpciwgXCJ3ZWIuUmVsZWFzZS5jb25maWdcIikpO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi8uLi9zcmMvZ2VuZXJhdG9ycy9tb2JpbGUvZ2VuZXJhdG9yLWNvcmRvdmEudHMiLCJpbXBvcnQgeyBHZW5lcmF0b3JCYXNlLCBJUHJvamVjdENvbmZpZ3JhdGlvbiB9IGZyb20gXCIuLi9iYXNlXCI7XHJcbmltcG9ydCB7IEdlbmVyYXRvckVsZWN0cm9uIH0gZnJvbSBcIi4vZ2VuZXJhdG9yLWVsZWN0b3JvblwiO1xyXG5cclxuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0b3ItZWxlY3Rvcm9uXCI7XHJcblxyXG4vKipcclxuICogZ2VuZXJhdG9yIOeUn+aIkOmWouaVsFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG5ld0dlbmVyYXRvckRlc2t0b3AoY29uZmlnOiBJUHJvamVjdENvbmZpZ3JhdGlvbik6IEdlbmVyYXRvckJhc2Uge1xyXG4gICAgcmV0dXJuIG5ldyBHZW5lcmF0b3JFbGVjdHJvbihjb25maWcpO1xyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi8uLi9zcmMvZ2VuZXJhdG9ycy9kZXNrdG9wL2luZGV4LnRzIiwiLyogdHNsaW50OmRpc2FibGU6bm8tdW51c2VkLXZhcmlhYmxlIG5vLXVudXNlZC12YXJzICovXHJcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXHJcblxyXG5pbXBvcnQgeyBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbiwgR2VuZXJhdG9yQmFzZSB9IGZyb20gXCIuLi9iYXNlXCI7XHJcbmltcG9ydCB7IElEZXNrdG9wQXBwQ29uZmlncmF0aW9uIH0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzcyBHZW5lcmF0b3JFbGVjdHJvblxyXG4gKiBAYnJpZWYgRGVza3RvcCBFbGVjdHJvbiDnlKggR2VuZXJhdG9yIOOCr+ODqeOCuVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEdlbmVyYXRvckVsZWN0cm9uIGV4dGVuZHMgR2VuZXJhdG9yQmFzZSB7XHJcblxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIC8vIGltcHJlbWVudGVzOiBHZW5lcmF0b3JCYXNlXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDml6Llrprjga4gZGlyZWN0b3J5IOani+mAoOOCkui/lOWNtFxyXG4gICAgICovXHJcbiAgICBkZWZhdWx0QmFzZVN0cnVjdHVyZSgpOiBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc3JjOiBcImFwcFwiLFxyXG4gICAgICAgICAgICBwa2c6IFwid3d3L2FwcFwiLCAvLyBUT0RPOiDmmqvlrppcclxuICAgICAgICAgICAgYnVpbHQ6IFwiYXBwXCIsXHJcbiAgICAgICAgICAgIGRvYzogXCJkb2NzXCIsXHJcbiAgICAgICAgICAgIHRhc2s6IFwidGFza3NcIixcclxuICAgICAgICAgICAgdGVzdDogXCJ0ZXN0c1wiLFxyXG4gICAgICAgICAgICB0eXBlczogXCJAdHlwZXNcIixcclxuICAgICAgICAgICAgc3JjQ29uZmlnOiB7XHJcbiAgICAgICAgICAgICAgICBzY3JpcHQ6IFwic2NyaXB0c1wiLFxyXG4gICAgICAgICAgICAgICAgc3R5bGVzaGVldDogXCJzdHlsZXNoZWV0c1wiLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IFwidGVtcGxhdGVzXCIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGNyZWF0ZSBhY3Rpb24gZW50cnlcclxuICAgICAqIEBwYXJhbSB7SURlc2t0b3BBcHBDb25maWdyYXRpb259IGNvbmZpZyDjgrPjg7Pjg5XjgqPjgrDoqK3lrppcclxuICAgICAqL1xyXG4gICAgYXN5bmMgY3JlYXRlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIC8vIFRPRE86XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFwidW5kZXIgY29uc3RydWN0aW9uLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW/heimgeOBqOOBmeOCiyB0YXNrIHNjcmlwdCDkuIDopqfjgpLov5TljbQuIGFjdGlvbjogY3JlYXRlIOOBruOBqOOBjeOBq+WRvOOBsOOCjOOCi1xyXG4gICAgICovXHJcbiAgICBnZXQgdGFza0xpc3QoKTogc3RyaW5nW10ge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIFwiYmFubmVyLmpzXCIsXHJcbiAgICAgICAgICAgIFwiY2xlYW4uanNcIixcclxuICAgICAgICAgICAgXCJzcmNtYXAuanNcIixcclxuICAgICAgICAgICAgXCJidWlsZC10cy1jbGVhbi5qc1wiLFxyXG4gICAgICAgICAgICBcImJ1aWxkLXRzLW5vcm1hbGl6ZS5qc1wiLFxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcblxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIC8vIHByaXZhdGUgbWV0aG9kczpcclxuXHJcbiAgICAvKipcclxuICAgICAqIGNvbmZpZ3JhdGlvbiDjgavjgqLjgq/jgrvjgrlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXQgY29uZmlnKCk6IElEZXNrdG9wQXBwQ29uZmlncmF0aW9uIHtcclxuICAgICAgICByZXR1cm4gPElEZXNrdG9wQXBwQ29uZmlncmF0aW9uPnRoaXMuX2NvbmZpZztcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vLi4vc3JjL2dlbmVyYXRvcnMvZGVza3RvcC9nZW5lcmF0b3ItZWxlY3Rvcm9uLnRzIiwiaW1wb3J0IHsgR2VuZXJhdG9yQmFzZSwgSVByb2plY3RDb25maWdyYXRpb24gfSBmcm9tIFwiLi4vYmFzZVwiO1xyXG5pbXBvcnQgeyBHZW5lcmF0b3JCcm93c2VyIH0gZnJvbSBcIi4vZ2VuZXJhdG9yLWJyb3dzZXJcIjtcclxuXHJcbmV4cG9ydCAqIGZyb20gXCIuL2ludGVyZmFjZXNcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vZ2VuZXJhdG9yLWJyb3dzZXJcIjtcclxuXHJcbi8qKlxyXG4gKiBnZW5lcmF0b3Ig55Sf5oiQ6Zai5pWwXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbmV3R2VuZXJhdG9yV2ViKGNvbmZpZzogSVByb2plY3RDb25maWdyYXRpb24pOiBHZW5lcmF0b3JCYXNlIHtcclxuICAgIHJldHVybiBuZXcgR2VuZXJhdG9yQnJvd3Nlcihjb25maWcpO1xyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi8uLi8uLi9zcmMvZ2VuZXJhdG9ycy93ZWIvaW5kZXgudHMiLCIvKiB0c2xpbnQ6ZGlzYWJsZTpuby11bnVzZWQtdmFyaWFibGUgbm8tdW51c2VkLXZhcnMgKi9cclxuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cclxuXHJcbmltcG9ydCB7IElCYXNlU3RydWN0dXJlQ29uZmlncmF0aW9uLCBHZW5lcmF0b3JCYXNlIH0gZnJvbSBcIi4uL2Jhc2VcIjtcclxuaW1wb3J0IHsgSVdlYkFwcENvbmZpZ3JhdGlvbiB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3MgR2VuZXJhdG9yQnJvd3NlclxyXG4gKiBAYnJpZWYgV2ViIEJyb3dzZXIg55SoIEdlbmVyYXRvciDjgq/jg6njgrlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBHZW5lcmF0b3JCcm93c2VyIGV4dGVuZHMgR2VuZXJhdG9yQmFzZSB7XHJcblxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIC8vIGltcHJlbWVudGVzOiBHZW5lcmF0b3JCYXNlXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDml6Llrprjga4gZGlyZWN0b3J5IOani+mAoOOCkui/lOWNtFxyXG4gICAgICovXHJcbiAgICBkZWZhdWx0QmFzZVN0cnVjdHVyZSgpOiBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvbiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc3JjOiBcImFwcFwiLFxyXG4gICAgICAgICAgICBwa2c6IFwid3d3XCIsXHJcbiAgICAgICAgICAgIGJ1aWx0OiBcImFwcFwiLFxyXG4gICAgICAgICAgICBkb2M6IFwiZG9jc1wiLFxyXG4gICAgICAgICAgICB0YXNrOiBcInRhc2tzXCIsXHJcbiAgICAgICAgICAgIHRlc3Q6IFwidGVzdHNcIixcclxuICAgICAgICAgICAgdHlwZXM6IFwiQHR5cGVzXCIsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGNyZWF0ZSBhY3Rpb24gZW50cnlcclxuICAgICAqIEBwYXJhbSB7SUxpYnJhcnlDb25maWdyYXRpb259IGNvbmZpZyDjgrPjg7Pjg5XjgqPjgrDoqK3lrppcclxuICAgICAqL1xyXG4gICAgYXN5bmMgY3JlYXRlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIC8vIFRPRE86XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFwidW5kZXIgY29uc3RydWN0aW9uLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW/heimgeOBqOOBmeOCiyB0YXNrIHNjcmlwdCDkuIDopqfjgpLov5TljbQuIGFjdGlvbjogY3JlYXRlIOOBruOBqOOBjeOBq+WRvOOBsOOCjOOCi1xyXG4gICAgICovXHJcbiAgICBnZXQgdGFza0xpc3QoKTogc3RyaW5nW10ge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIFwiYmFubmVyLmpzXCIsXHJcbiAgICAgICAgICAgIFwiY2xlYW4uanNcIixcclxuICAgICAgICAgICAgXCJzcmNtYXAuanNcIixcclxuICAgICAgICAgICAgXCJidWlsZC10cy1jbGVhbi5qc1wiLFxyXG4gICAgICAgICAgICBcImJ1aWxkLXRzLW5vcm1hbGl6ZS5qc1wiLFxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcblxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIC8vIHByaXZhdGUgbWV0aG9kczpcclxuXHJcbiAgICAvKipcclxuICAgICAqIGNvbmZpZ3JhdGlvbiDjgavjgqLjgq/jgrvjgrlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXQgY29uZmlnKCk6IElXZWJBcHBDb25maWdyYXRpb24ge1xyXG4gICAgICAgIHJldHVybiA8SVdlYkFwcENvbmZpZ3JhdGlvbj50aGlzLl9jb25maWc7XHJcbiAgICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4uLy4uLy4uL3NyYy9nZW5lcmF0b3JzL3dlYi9nZW5lcmF0b3ItYnJvd3Nlci50cyIsImltcG9ydCAqIGFzIFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmV4cG9ydCB7IFV0aWxzIH07XHJcblxyXG5pbXBvcnQge1xyXG4gICAgSVNvdXJjZURpcmN0b3J5Q29uZmlncmF0aW9uLFxyXG4gICAgSUJhc2VTdHJ1Y3R1cmVDb25maWdyYXRpb24sXHJcbiAgICBJUHJvamVjdENvbmZpZ3JhdGlvbixcclxuICAgIElCdWlsZFRhcmdldENvbmZpZ3JhdGlvbixcclxuICAgIElMaWJyYXJ5Q29uZmlncmF0aW9uLFxyXG4gICAgSUV4dGVybmFsTW9kdWxlSW5mbyxcclxuICAgIElFeHRlcm5hbE1vZHVsZXMsXHJcbiAgICBJTW9iaWxlQXBwQ29uZmlncmF0aW9uLFxyXG4gICAgSURlc2t0b3BBcHBDb25maWdyYXRpb24sXHJcbiAgICBJV2ViQXBwQ29uZmlncmF0aW9uLFxyXG4gICAgLy8vL1xyXG4gICAgbmV3R2VuZXJhdG9yXHJcbn0gZnJvbSBcIi4vZ2VuZXJhdG9yc1wiO1xyXG5cclxuZXhwb3J0IHtcclxuICAgIElTb3VyY2VEaXJjdG9yeUNvbmZpZ3JhdGlvbixcclxuICAgIElCYXNlU3RydWN0dXJlQ29uZmlncmF0aW9uLFxyXG4gICAgSVByb2plY3RDb25maWdyYXRpb24sXHJcbiAgICBJQnVpbGRUYXJnZXRDb25maWdyYXRpb24sXHJcbiAgICBJTGlicmFyeUNvbmZpZ3JhdGlvbixcclxuICAgIElFeHRlcm5hbE1vZHVsZUluZm8sXHJcbiAgICBJRXh0ZXJuYWxNb2R1bGVzLFxyXG4gICAgSU1vYmlsZUFwcENvbmZpZ3JhdGlvbixcclxuICAgIElEZXNrdG9wQXBwQ29uZmlncmF0aW9uLFxyXG4gICAgSVdlYkFwcENvbmZpZ3JhdGlvbixcclxufTtcclxuXHJcbi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vXHJcblxyXG4vKipcclxuICogQGNsYXNzIENEUExpYlxyXG4gKiBAYnJpZWYgQ0RQIGJvaWxlcnBsYXRlIOeUn+aIkOapn+iDveOCkuaPkOS+m+OBmeOCi+OCr+ODqeOCuVxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ0RQTGliIHtcclxuXHJcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgLy8gcHViaWMgbWV0aG9kczpcclxuXHJcbiAgICAvKipcclxuICAgICAqIG1haW4gY29tbWFuZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGV4ZWN1dGUoY29uZmlnOiBJUHJvamVjdENvbmZpZ3JhdGlvbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIFV0aWxzLnNldFNldHRpbmdzKGNvbmZpZy5zZXR0aW5ncyk7XHJcbiAgICAgICAgcmV0dXJuIG5ld0dlbmVyYXRvcihjb25maWcpLnJ1bigpO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLi9zcmMvY2RwLWxpYi50cyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImZzLWV4dHJhXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJmcy1leHRyYVwiLFwiY29tbW9uanMyXCI6XCJmcy1leHRyYVwifVxuLy8gbW9kdWxlIGlkID0gMTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZ2xvYlwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qc1wiOlwiZ2xvYlwiLFwiY29tbW9uanMyXCI6XCJnbG9iXCJ9XG4vLyBtb2R1bGUgaWQgPSAxN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJob2dhbi5qc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJyb290XCI6XCJIb2dhblwiLFwiY29tbW9uanNcIjpcImhvZ2FuLmpzXCIsXCJjb21tb25qczJcIjpcImhvZ2FuLmpzXCIsXCJhbWRcIjpcImhvZ2FuLmpzXCJ9XG4vLyBtb2R1bGUgaWQgPSAxOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wicm9vdFwiOlwiX1wiLFwiY29tbW9uanNcIjpcImxvZGFzaFwiLFwiY29tbW9uanMyXCI6XCJsb2Rhc2hcIn1cbi8vIG1vZHVsZSBpZCA9IDE5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInVuZGVyc2NvcmUuc3RyaW5nXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcInJvb3RcIjpcIl9cIixcImNvbW1vbmpzXCI6XCJ1bmRlcnNjb3JlLnN0cmluZ1wiLFwiY29tbW9uanMyXCI6XCJ1bmRlcnNjb3JlLnN0cmluZ1wifVxuLy8gbW9kdWxlIGlkID0gMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwid2hpY2hcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcIndoaWNoXCIsXCJjb21tb25qczJcIjpcIndoaWNoXCJ9XG4vLyBtb2R1bGUgaWQgPSAyMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ1dWlkXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJ1dWlkXCIsXCJjb21tb25qczJcIjpcInV1aWRcIn1cbi8vIG1vZHVsZSBpZCA9IDIyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNoYWxrXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJjaGFsa1wiLFwiY29tbW9uanMyXCI6XCJjaGFsa1wifVxuLy8gbW9kdWxlIGlkID0gMjNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwic2VtdmVyLXJlZ2V4XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJzZW12ZXItcmVnZXhcIixcImNvbW1vbmpzMlwiOlwic2VtdmVyLXJlZ2V4XCJ9XG4vLyBtb2R1bGUgaWQgPSAyNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGktc3Bpbm5lclwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qc1wiOlwiY2xpLXNwaW5uZXJcIixcImNvbW1vbmpzMlwiOlwiY2xpLXNwaW5uZXJcIn1cbi8vIG1vZHVsZSBpZCA9IDI1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImpzZG9tXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJqc2RvbVwiLFwiY29tbW9uanMyXCI6XCJqc2RvbVwifVxuLy8gbW9kdWxlIGlkID0gMjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwieG1sZG9tXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJ4bWxkb21cIixcImNvbW1vbmpzMlwiOlwieG1sZG9tXCJ9XG4vLyBtb2R1bGUgaWQgPSAyN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wicm9vdFwiOlwialF1ZXJ5XCIsXCJjb21tb25qc1wiOlwianF1ZXJ5XCIsXCJjb21tb25qczJcIjpcImpxdWVyeVwiLFwiYW1kXCI6XCJqcXVlcnlcIn1cbi8vIG1vZHVsZSBpZCA9IDI4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcclxuaW1wb3J0ICogYXMgb3MgZnJvbSBcIm9zXCI7XHJcbmltcG9ydCB7IHNwYXduLCBTcGF3bk9wdGlvbnMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIGZzLFxyXG4gICAgaG9nYW4sXHJcbiAgICAkLFxyXG4gICAgd2hpY2gsXHJcbiAgICB1dWlkLFxyXG4gICAgU3Bpbm5lcixcclxufSBmcm9tIFwiLi9saWJzXCI7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgYXNzZXJ0LFxyXG4gICAgZ2V0TGliUGF0aCxcclxufSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xyXG5cclxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuLy8gZXhwb3J0cyBtZXRob2RzOlxyXG5cclxuLyoqXHJcbiAqIEhhbmRsZSBjb21tYW5kIGxpbmUgZXJyb3IgYW5kIGtpbGwgcHJvY2Vzcy5cclxuICogV2hlbiB0aGUgYXBwbGljYXRpb24gcmVjZWl2ZWQgZXJyb3IgZnJvbSBjbGksIHBsZWFzZSBjYWxsIHRoaXMgbWV0aG9kLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZXJyb3IgIGVycm9yIGluZm9ybWF0aW9uLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUVycm9yKGVycm9yOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGFzc2VydChmYWxzZSwgZXJyb3IpO1xyXG59XHJcblxyXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vL1xyXG5cclxuLyoqXHJcbiAqIFwidGVtcGxhdGVzXCIg44OH44Kj44Os44Kv44OI44Oq44GL44KJ44Gu44OR44K544KS5Y+W5b6XLlxyXG4gKlxyXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHRhcmdldCDjgr/jg7zjgrLjg4Pjg4jjgpLmjIflrpouIG51bGwg44Gu5aC05ZCI44Gv44CBdGVtcGxhdGVzIOOCkui/lOWNtFxyXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRlbXBsYXRlcy9ob2dlaG9nZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHRlbXBsYXRlUGF0aCh0YXJnZXQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAobnVsbCA9PSB0YXJnZXQpIHtcclxuICAgICAgICByZXR1cm4gcGF0aC5qb2luKGdldExpYlBhdGgoKSwgXCJ0ZW1wbGF0ZXNcIik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4oZ2V0TGliUGF0aCgpLCBcInRlbXBsYXRlc1wiLCB0YXJnZXQpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vL1xyXG5cclxuLyoqXHJcbiAqIEdldCBzcGlubmVyIGluc3RhbmNlLlxyXG4gKiBDTEkgaGVscGVyLlxyXG4gKlxyXG4gKiBAcGFyYW0gIHtTdHJpbmd9ICBbZm9ybWF0XSAgc3Bpbm5lciBmb3JtYXQgc3RyaW5nLlxyXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICBbaW5kZXhdICAgc3Bpbm5lciBpbmRleCBkZWZpbmVkIGJ5IGNsaS1zcGlubmVyLiAoZGVmYXVsdDogcmFuZG9tIFswLTI5XSlcclxuICogQHJldHVybiB7U3Bpbm5lcn0gY2xpLXNwaW5uZXIgaW5zdGFuY2UuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Bpbm5lcihmb3JtYXQ/OiBzdHJpbmcsIGluZGV4PzogbnVtYmVyKTogeyBzdGFydDogKCkgPT4gdm9pZDsgc3RvcDogKGNsZWFuPzogYm9vbGVhbikgPT4gdm9pZDsgfSB7XHJcbiAgICBjb25zdCBzcGlubmVycyA9IFtcclxuICAgICAgICBcInwvLVxcXFxcIixcclxuICAgICAgICBcIuKUpOKUmOKUtOKUlOKUnOKUjOKUrOKUkFwiLFxyXG4gICAgICAgIFwi4pei4pej4pek4pelXCIsXHJcbiAgICAgICAgXCLiloziloDilpDiloRcIixcclxuICAgICAgICBcIuKWieKWiuKWi+KWjOKWjeKWjuKWj+KWjuKWjeKWjOKWi+KWiuKWiVwiLFxyXG4gICAgICAgIFwi4paB4paD4paE4paF4paG4paH4paI4paH4paG4paF4paE4paDXCIsXHJcbiAgICAgICAgXCLimLHimLLimLRcIixcclxuICAgICAgICBcIi5vT0AqXCIsXHJcbiAgICAgICAgXCLil5Dil5Pil5Hil5JcIixcclxuICAgICAgICAvLy8vXHJcbiAgICAgICAgXCLil6Hil6Eg4oqZ4oqZIOKXoOKXoFwiLFxyXG4gICAgICAgIFwi4pag4pah4paq4parXCIsXHJcbiAgICAgICAgXCLihpDihpbihpHihpfihpLihpjihpPihplcIixcclxuICAgICAgICBcIi5vT8KwT28uXCIsXHJcbiAgICBdO1xyXG4gICAgY29uc3QgZm10ID0gZm9ybWF0IHx8IFwiJXNcIjtcclxuICAgIGNvbnN0IHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihmbXQpO1xyXG4gICAgY29uc3QgaWR4ID0gKG51bGwgIT0gaW5kZXggJiYgMCA8PSBpbmRleCAmJiBpbmRleCA8IDE0KSA/IGluZGV4IDogTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTApO1xyXG4gICAgc3Bpbm5lci5zZXRTcGlubmVyU3RyaW5nKHNwaW5uZXJzW2lkeF0pO1xyXG4gICAgcmV0dXJuIHNwaW5uZXI7XHJcbn1cclxuXHJcbi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vXHJcblxyXG4vKipcclxuICogQGludGVyZmFjZSBOb3JtYWxpemVUZXh0T3B0aW9uc1xyXG4gKiBAYnJpZWYgbm9ybWFsaXplVGV4dCgpIOOBq+aMh+WumuOBmeOCi+OCquODl+OCt+ODp+ODs1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBOb3JtYWxpemVUZXh0T3B0aW9ucyB7XHJcbiAgICBlb2w/OiBzdHJpbmc7ICAgLy8gZGVmYXVsdDogb3MuRU9MXHJcbiAgICBib20/OiBib29sZWFuOyAgLy8gZGVmYXVsdDogdHJ1ZVxyXG4gICAgdGFiPzogbnVtYmVyOyAgIC8vIHRhYiDjgpLlpInmj5vjgZnjgovjgrnjg5rjg7zjgrnjga7mlbDjgpLmjIflrpouIGRlZmF1bHQ6IOWkieaPm+OBl+OBquOBhFxyXG59XHJcblxyXG4vKipcclxuICogTm9ybWFsaXplIHRleHQgbGluZS1mZWVkLlxyXG4gKiBmb3Igd2luZG93cyBnaXQgdXNlci5cclxuICpcclxuICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgICAgIHRleHQgICAgICBpbnB1dCB0ZXh0LlxyXG4gKiBAcGFyYW0gIHtOb3JtYWxpemVUZXh0T3B0aW9uc30gW29wdGlvbnNdIG9wdGlvbi5cclxuICogQHJldHVybiB7U3RyaW5nfSBub3JtYWxpemVkIHRleHQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVGV4dCh0ZXh0OiBzdHJpbmcsIG9wdGlvbnM/OiBOb3JtYWxpemVUZXh0T3B0aW9ucyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBvcHQ6IE5vcm1hbGl6ZVRleHRPcHRpb25zID0gJC5leHRlbmQoe30sIHtcclxuICAgICAgICBlb2w6IG9zLkVPTCxcclxuICAgICAgICBib206IHRydWUsXHJcbiAgICB9LCBvcHRpb25zKTtcclxuXHJcbiAgICB0ZXh0ID0gdGV4dFxyXG4gICAgICAgIC5yZXBsYWNlKC9eXFx1ZmVmZi9nbSwgXCJcIikgICAvLyByZW1vdmUgYm9tXHJcbiAgICAgICAgLnJlcGxhY2UoL1xcclxcbi9nbSwgXCJcXG5cIikgICAgLy8gb25jZSBcIlxcblwiXHJcbiAgICAgICAgLnJlcGxhY2UoL1xcci9nbSwgXCJcXG5cIilcclxuICAgIDtcclxuXHJcbiAgICBpZiAob3B0LmJvbSkge1xyXG4gICAgICAgIHRleHQgPSBcIlxcdWZlZmZcIiArIHRleHQ7XHJcbiAgICB9XHJcbiAgICBpZiAoXCJcXG5cIiAhPT0gb3B0LmVvbCkge1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcbi9nbSwgb3B0LmVvbCk7XHJcbiAgICB9XHJcbiAgICBpZiAob3B0LnRhYikge1xyXG4gICAgICAgIGNvbnN0IHNwYWNlcyA9ICgoKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBzID0gXCJcIjtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHQudGFiOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHMgKz0gXCIgXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHM7XHJcbiAgICAgICAgfSkoKTtcclxuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXHQvZ20sIHNwYWNlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRleHQ7XHJcbn1cclxuXHJcbi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vXHJcblxyXG4vKipcclxuICogQGludGVyZmFjZSBFeGVjQ29tbWFuZE9wdGlvbnNcclxuICogQGJyaWVmIGV4ZWNDb21tYW5kKCkg44Gr5oyH5a6a44GZ44KL44Kq44OX44K344On44OzXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNDb21tYW5kT3B0aW9ucyBleHRlbmRzIFNwYXduT3B0aW9ucyB7XHJcbiAgICBzcGlubmVyPzoge1xyXG4gICAgICAgIGZvcm1hdD86IHN0cmluZzsgICAgLy8gZXgpIFwiJXNcIlxyXG4gICAgICAgIGluZGV4PzogbnVtYmVyOyAgICAgLy8gMCAtIDkg44Gu5pWw5YCk44KS5oyH5a6aXHJcbiAgICB9O1xyXG4gICAgc3Rkb3V0PzogKGRhdGE6IHN0cmluZykgPT4gdm9pZDtcclxuICAgIHN0ZGVycj86IChkYXRhOiBzdHJpbmcpID0+IHZvaWQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFeGVjdXRlIGNvbW1hbmQgbGluZSBieSBzcGF3bi5cclxuICogY2FsbCBzcGF3bi4gaWYgZXJyb3Igb2NjdXJlZCwgY3VpIGlzIGtpbGxlZCBwcm9jY2Vzcy5cclxuICpcclxuICogQHBhcmFtICAge1N0cmluZ30gICAgICAgICAgICAgICBjb21tYW5kICAgIG1haW4gY29tbWFuZC4gZXgpIFwiY29yZG92YVwiXHJcbiAqIEBwYXJhbSAgIHtTdHJpbmdbXX0gICAgICAgICAgICAgYXJncyAgICAgICBjb21tYW5kIGFyZ3MuIGV4KSBbXCJwbHVnaW5cIiwgXCJhZGRcIiwgcGx1Z2luTmFtZV1cclxuICogQHBhcmFtICAge0V4ZWNDb21tYW5kT3B0aW9uc30gICBbb3B0aW9uc10gIGNsaS1zcGlubmVyXCJzIG9wdGlvbnMuXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGVycm9yIGNvZGVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBleGVjQ29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zPzogRXhlY0NvbW1hbmRPcHRpb25zKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb3B0OiBFeGVjQ29tbWFuZE9wdGlvbnMgPSAkLmV4dGVuZCh7fSwge1xyXG4gICAgICAgICAgICBzdGRpbzogXCJpbmhlcml0XCIsXHJcbiAgICAgICAgICAgIHNwaW5uZXI6IHsgZm9ybWF0OiBcIiVzXCIgfSxcclxuICAgICAgICAgICAgc3Rkb3V0OiAoZGF0YTogc3RyaW5nKTogdm9pZCA9PiB7IC8qIG5vb3AgKi8gfSxcclxuICAgICAgICAgICAgc3RkZXJyOiAoZGF0YTogc3RyaW5nKTogdm9pZCA9PiB7IC8qIG5vb3AgKi8gfSxcclxuICAgICAgICB9LCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgLy8gb24gd2luMzIsIGNvbW1hbmQgYW5kIGFyZ3MgbmVlZCB0byBiZSBxdW90ZWQgaWYgY29udGFpbmluZyBzcGFjZXNcclxuICAgICAgICBjb25zdCBxdW90ZUlmTmVlZGVkID0gKHN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICAgICAgICAgICAgaWYgKFwid2luMzJcIiA9PT0gb3MucGxhdGZvcm0oKSAmJiBzdHIuaW5jbHVkZXMoXCIgXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBzdHIgPSBcIlxcXCJcIiArIHN0ciArIFwiXFxcIlwiO1xyXG4gICAgICAgICAgICAgICAgb3B0LnNoZWxsID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHdoaWNoKGNvbW1hbmQsIChlcnJvciwgcmVzb2x2ZWRDb21tYW5kKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgc3Bpbm5lciA9IG9wdC5zcGlubmVyID8gZ2V0U3Bpbm5lcihvcHQuc3Bpbm5lci5mb3JtYXQsIG9wdC5zcGlubmVyLmluZGV4KSA6IG51bGw7XHJcbiAgICAgICAgICAgIGlmIChzcGlubmVyKSB7XHJcbiAgICAgICAgICAgICAgICBzcGlubmVyLnN0YXJ0KCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlc29sdmVkQ29tbWFuZCA9IHF1b3RlSWZOZWVkZWQocmVzb2x2ZWRDb21tYW5kKTtcclxuICAgICAgICAgICAgYXJncyA9IGFyZ3MubWFwKHF1b3RlSWZOZWVkZWQpO1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZCA9IHNwYXduKHJlc29sdmVkQ29tbWFuZCwgYXJncywgb3B0KVxyXG4gICAgICAgICAgICAgICAgLm9uKFwiZXJyb3JcIiwgaGFuZGxlRXJyb3IpXHJcbiAgICAgICAgICAgICAgICAub24oXCJjbG9zZVwiLCAoY29kZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGlubmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5uZXIuc3RvcCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjb2RlKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKFwicGlwZVwiID09PSBvcHQuc3RkaW8pIHtcclxuICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbihcImRhdGFcIiwgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBvcHQuc3Rkb3V0KGRhdGEudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbihcImRhdGFcIiwgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBvcHQuc3RkZXJyKGRhdGEudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vXHJcblxyXG4vKipcclxuICogQGludGVyZmFjZSBDb3B5VGVtcGxhdGVPcHRpb25zXHJcbiAqIEBicmllZiBjb3B5VHBsKCkg44Gr5oyH5a6a44GZ44KL44Kq44OX44K344On44OzXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIENvcHlUZW1wbGF0ZU9wdGlvbnMgZXh0ZW5kcyBOb3JtYWxpemVUZXh0T3B0aW9ucyB7XHJcbiAgICBkZWxpbWl0ZXJzPzogXCJ7eyB9fVwiIHwgXCI8JSAlPlwiOyAvLyB0ZW1wbGF0ZSDjgavkvb/nlKjjgZnjgosgZGVsaW1pdGVyLiBkZWZhdWx0OiBcInt7IH19XCJcclxufVxyXG5cclxuLyoqXHJcbiAqIENvcHkgdGVtcGxhdGUgd2l0aCBob2dhbi5cclxuICogc3luYyBmdW5jdGlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gICAgICAgICAgICAgICBzcmMgICAgICAgc291cmNlIGZpbGUgcGF0aC5cclxuICogQHBhcmFtIHtTdHJpbmd9ICAgICAgICAgICAgICAgZHN0ICAgICAgIGRlc3RpbmF0aW9uIGZpbGUgcGF0aC5cclxuICogQHBhcmFtIHtPYmplY3R9ICAgICAgICAgICAgICAgcGFyYW1zICAgIHRlbXBsYXRlIHBhcmFtZXRlcnMuXHJcbiAqIEBwYXJhbSB7Q29weVRlbXBsYXRlT3B0aW9uc30gIFtvcHRpb25zXSBvcHRpb25zIG9iamVjdC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjb3B5VHBsKHNyYzogc3RyaW5nLCBkc3Q6IHN0cmluZywgcGFyYW1zOiBPYmplY3QsIG9wdGlvbnM/OiBDb3B5VGVtcGxhdGVPcHRpb25zKTogdm9pZCB7XHJcbiAgICBjb25zdCBvcHQgPSAkLmV4dGVuZCh7fSwge1xyXG4gICAgICAgIGVvbDogb3MuRU9MLFxyXG4gICAgICAgIGJvbTogdHJ1ZSxcclxuICAgICAgICBkZWxpbWl0ZXJzOiBcInt7IH19XCIsXHJcbiAgICB9LCBvcHRpb25zKTtcclxuXHJcbiAgICBjb25zdCBqc3QgPSBob2dhbi5jb21waWxlKG5vcm1hbGl6ZVRleHQoZnMucmVhZEZpbGVTeW5jKHNyYykudG9TdHJpbmcoKSwgeyBlb2w6IFwiXFxuXCIsIGJvbTogZmFsc2UgfSksIG9wdCk7XHJcbiAgICBjb25zdCBvdXRwdXQgPSBub3JtYWxpemVUZXh0KGpzdC5yZW5kZXIocGFyYW1zKSwgb3B0KTtcclxuXHJcbiAgICBmcy5lbnN1cmVGaWxlU3luYyhkc3QpO1xyXG4gICAgZnMud3JpdGVGaWxlU3luYyhkc3QsIG91dHB1dCwgXCJ1dGY4XCIpO1xyXG59XHJcblxyXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vL1xyXG5cclxuLyoqXHJcbiAqIEdVSUQgZ2VuZXJhdGUuXHJcbiAqIHJldHVybmVkIGFzIFdpbmRvd3MgcmVnaXN0cnkgdHlwZSBmb3JtYXQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1N0cmluZ31cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHVUlEKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gXCJ7XCIgKyB1dWlkLnY0KCkudG9VcHBlckNhc2UoKSArIFwifVwiO1xyXG59XHJcblxyXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vL1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBYTUwgRE9NIG5vZGUuXHJcbiAqXHJcbiAqIEBwYXJhbSAgIHN0ciAgc3RyaW5nIHhtbCBmb3JtYXQuIGV4KSAnPHByZWZlcmVuY2UgbmFtZT1cIkRpc2FsbG93T3ZlcnNjcm9sbFwiIHZhbHVlPVwidHJ1ZVwiLz4nXHJcbiAqIEByZXR1cm5zIFhNTCBOb2RlIGluc3RhbmNlXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc3RyMlhtbE5vZGUoc3RyOiBzdHJpbmcpOiBKUXVlcnkge1xyXG4gICAgbGV0IGZ1bGxYTUwgPSB0cnVlO1xyXG4gICAgaWYgKCEvPD94bWwvaS50ZXN0KHN0cikpIHtcclxuICAgICAgICBmdWxsWE1MID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCAkeG1sID0gJCgkLnBhcnNlWE1MKHN0cikpO1xyXG4gICAgcmV0dXJuIGZ1bGxYTUwgPyAkeG1sIDogJHhtbC5jaGlsZHJlbigpO1xyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlIFhNTCBzdHJpbmcgZnJvbSBET00gbm9kZS5cclxuICpcclxuICogQHBhcmFtICB7U3RyaW5nfSBzdHIgIHN0cmluZyB4bWwgZm9ybWF0LiBleCkgJzxwcmVmZXJlbmNlIG5hbWU9XCJEaXNhbGxvd092ZXJzY3JvbGxcIiB2YWx1ZT1cInRydWVcIi8+J1xyXG4gKiBAcmV0dXJuIHtqUXVlcnl9IFhNTCBOb2RlIGluc3RhbmNlXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24geG1sTm9kZTJTdHIoJHhtbDogSlF1ZXJ5KTogc3RyaW5nIHtcclxuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXHJcbiAgICByZXR1cm4gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZygkeG1sWzBdKTtcclxuICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW5kZWYgKi9cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcmZhY2UgRm9ybWF0WG1sT3B0aW9uc1xyXG4gKiBAYnJpZWYgZm9ybWF0WE1MKCkg44Gr5oyH5a6a44GZ44KL44Kq44OX44K344On44OzXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdFhtbE9wdGlvbnMgZXh0ZW5kcyBOb3JtYWxpemVUZXh0T3B0aW9ucyB7XHJcbiAgICBzdGVwPzogbnVtYmVyOyAgIC8vIOepuueZveOCueODmuODvOOCueaVsC4gZGVmYXVsdDogMlxyXG59XHJcblxyXG4vKipcclxuICogWE1MIGZvcm1hdHRlci5cclxuICpcclxuICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgc3RyICAgICAgIHN0cmluZyB4bWwgZm9ybWF0LiBleCkgJzxwcmVmZXJlbmNlIG5hbWU9XCJEaXNhbGxvd092ZXJzY3JvbGxcIiB2YWx1ZT1cInRydWVcIi8+J1xyXG4gKiBAcGFyYW0gIHtGb3JtYXRYbWxPcHRpb25zfSBbb3B0aW9uc10gb3B0aW9ucyBvYmplY3QuXHJcbiAqIEByZXR1cm4ge1N0cmluZ30gZm9ybWF0dGVkIFhNTFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFhNTChzdHI6IHN0cmluZywgb3B0aW9ucz86IEZvcm1hdFhtbE9wdGlvbnMpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgb3B0OiBGb3JtYXRYbWxPcHRpb25zID0gJC5leHRlbmQoe30sIHtcclxuICAgICAgICBlb2w6IG9zLkVPTCxcclxuICAgICAgICBib206IHRydWUsXHJcbiAgICAgICAgc3RlcDogMixcclxuICAgIH0sIG9wdGlvbnMpO1xyXG4gICAgbGV0IHhtbCA9IFwiXCI7XHJcbiAgICBsZXQgcGFkID0gMDtcclxuICAgIGxldCBpbmRlbnQ6IG51bWJlcjtcclxuICAgIGxldCBub2RlOiBzdHJpbmc7XHJcblxyXG4gICAgY29uc3Qgc3RyQXJyID0gbm9ybWFsaXplVGV4dChzdHIsIHsgZW9sOiBcIlxcblwiIH0pXHJcbiAgICAgICAgLnJlcGxhY2UoLyg+KSg8KShcXC8qKS9nLCBcIiQxXFxuJDIkM1wiKSAvLyBpbnNlcnQgTEYgdG8gZWFjaCBub2RlIG9uY2UuXHJcbiAgICAgICAgLnNwbGl0KFwiXFxuXCIpO1xyXG5cclxuICAgIGNvbnN0IHNwYWNlcyA9IChsZW46IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGxldCBzID0gXCJcIjtcclxuICAgICAgICBjb25zdCBfaW5kZW50ID0gbGVuICogb3B0LnN0ZXA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBfaW5kZW50OyBpKyspIHtcclxuICAgICAgICAgICAgcyArPSBcIiBcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHM7XHJcbiAgICB9O1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyQXJyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaW5kZW50ID0gMDtcclxuICAgICAgICBub2RlID0gJC50cmltKHN0ckFycltpXSk7XHJcbiAgICAgICAgaWYgKG5vZGUubWF0Y2goLy4rPFxcL1xcd1tePl0qPiQvKSkge1xyXG4gICAgICAgICAgICBpbmRlbnQgPSAwO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5tYXRjaCgvXjxcXC9cXHcvKSkge1xyXG4gICAgICAgICAgICBpZiAocGFkID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcGFkIC09IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKG5vZGUubWF0Y2goL148XFx3W14+XSpbXi9dPi4qJC8pKSB7XHJcbiAgICAgICAgICAgIGluZGVudCA9IDE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaW5kZW50ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgeG1sICs9IHNwYWNlcyhwYWQpICsgbm9kZSArIFwiXFxuXCI7XHJcbiAgICAgICAgcGFkICs9IGluZGVudDtcclxuICAgIH1cclxuXHJcbiAgICB4bWwgPSB4bWxcclxuICAgICAgICAucmVwbGFjZSgvXFxuXFxuL2dtLCBcIlxcblwiKVxyXG4gICAgICAgIC5yZXBsYWNlKC9eICtcXG4vZ20sIFwiXCIpXHJcbiAgICAgICAgO1xyXG5cclxuICAgIHJldHVybiBub3JtYWxpemVUZXh0KHhtbCwgb3B0KTtcclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vc3JjL3V0aWxzL3Rvb2xzLnRzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2hpbGRfcHJvY2Vzc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcImNoaWxkX3Byb2Nlc3NcIlxuLy8gbW9kdWxlIGlkID0gMzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSBcIi4uL3V0aWxzL3NldHRpbmdzXCI7XHJcblxyXG5pbXBvcnQgeyBHZW5lcmF0b3JCYXNlLCBJUHJvamVjdENvbmZpZ3JhdGlvbiB9IGZyb20gXCIuL2Jhc2VcIjtcclxuaW1wb3J0IHsgbmV3R2VuZXJhdG9yTGlicmFyeSB9IGZyb20gXCIuL2xpYnJhcnlcIjtcclxuaW1wb3J0IHsgbmV3R2VuZXJhdG9yTW9iaWxlIH0gZnJvbSBcIi4vbW9iaWxlXCI7XHJcbmltcG9ydCB7IG5ld0dlbmVyYXRvckRlc2t0b3AgfSBmcm9tIFwiLi9kZXNrdG9wXCI7XHJcbmltcG9ydCB7IG5ld0dlbmVyYXRvcldlYiB9IGZyb20gXCIuL3dlYlwiO1xyXG5cclxuZXhwb3J0ICogZnJvbSBcIi4vYmFzZVwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9saWJyYXJ5XCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL21vYmlsZVwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9kZXNrdG9wXCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL3dlYlwiO1xyXG5cclxuLyoqXHJcbiAqIGdlbmVyYXRvciDnlJ/miJDplqLmlbBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBuZXdHZW5lcmF0b3IoY29uZmlnOiBJUHJvamVjdENvbmZpZ3JhdGlvbik6IEdlbmVyYXRvckJhc2Uge1xyXG4gICAgc3dpdGNoIChjb25maWcucHJvamVjdFR5cGUpIHtcclxuICAgICAgICBjYXNlIFwibGlicmFyeVwiOlxyXG4gICAgICAgICAgICByZXR1cm4gbmV3R2VuZXJhdG9yTGlicmFyeShjb25maWcpO1xyXG4gICAgICAgIGNhc2UgXCJtb2JpbGVcIjpcclxuICAgICAgICAgICAgcmV0dXJuIG5ld0dlbmVyYXRvck1vYmlsZShjb25maWcpO1xyXG4gICAgICAgIGNhc2UgXCJkZXNrdG9wXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBuZXdHZW5lcmF0b3JEZXNrdG9wKGNvbmZpZyk7XHJcbiAgICAgICAgY2FzZSBcIndlYlwiOlxyXG4gICAgICAgICAgICByZXR1cm4gbmV3R2VuZXJhdG9yV2ViKGNvbmZpZyk7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBcInVuc3VwcG9ydGVkIHByb2plY3Qga2luZDogXCIgKyBjb25maWcucHJvamVjdFR5cGUpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vc3JjL2dlbmVyYXRvcnMvaW5kZXgudHMiLCJpbXBvcnQgKiBhcyBVdGlscyBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcclxuZXhwb3J0IHsgVXRpbHMgfTtcclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJmYWNlIElTb3VyY2VEaXJjdG9yeUNvbmZpZ3JhdGlvblxyXG4gKiBAYnJpZWYg44K944O844K544OH44Kj44Os44Kv44OI44Oq44Gu44Kz44Oz44OV44Kj44Ku44Ol44Os44O844K344On44Oz6Kit5a6aXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElTb3VyY2VEaXJjdG9yeUNvbmZpZ3JhdGlvbiB7XHJcbiAgICBzY3JpcHQ/OiBzdHJpbmc7ICAgICAgICAgICAgLy8ganModHMpIOODleOCoeOCpOODq+S/neWtmOWFiFxyXG4gICAgc3R5bGVzaGVldD86IHN0cmluZzsgICAgICAgIC8vIGNzcyhjc3MpIOODleOCoeOCpOODq+S/neWtmOWFiFxyXG4gICAgdGVtcGxhdGU/OiBzdHJpbmc7ICAgICAgICAgIC8vIGh0bWwodGVtcGxhdGUpIOODleOCoeOCpOODq+S/neWtmOWFiFxyXG59XHJcblxyXG4vKipcclxuICogQGludGVyZmFjZSBJQmFzZVN0cnVjdHVyZUNvbmZpZ3JhdGlvblxyXG4gKiBAYnJpZWYg44OX44Ot44K444Kn44Kv44OI44OH44Kj44Os44Kv44OI44Oq44Gu44Kz44Oz44OV44Kj44Ku44Ol44Os44O844K344On44Oz6Kit5a6aXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElCYXNlU3RydWN0dXJlQ29uZmlncmF0aW9uIHtcclxuICAgIHNyYz86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g44K944O844K544Kz44O844OJ44Gu44Or44O844OI44OH44Kj44Os44Kv44OI44Oq5ZCNXHJcbiAgICBwa2c/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOODkeODg+OCseODvOOCuOWFiOODh+OCo+ODrOOCr+ODiOODquWQjVxyXG4gICAgYnVpbHQ/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDjgrPjg7Pjg5HjgqTjg6vlhYjjg4fjgqPjg6zjgq/jg4jjg6rlkI1cclxuICAgIGRvYz86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g44OJ44Kt44Ol44Oh44Oz44OI44OH44Kj44Os44Kv44OI44Oq5ZCNXHJcbiAgICB0YXNrPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOOCv+OCueOCr+ODh+OCo+ODrOOCr+ODiOODquWQjVxyXG4gICAgdGVzdD86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDjg4bjgrnjg4jjg4fjgqPjg6zjgq/jg4jjg6rlkI1cclxuICAgIHR5cGVzPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHlwZVNjcmlwdCDlnovlrprnvqnjg4fjgqPjg6zjgq/jg4jjg6rlkI1cclxuICAgIHRlbXA/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5L2c5qWt44OH44Kj44Os44Kv44OI44Oq5ZCNXHJcbiAgICBzcmNDb25maWc/OiBJU291cmNlRGlyY3RvcnlDb25maWdyYXRpb247ICAgIC8vIElTb3VyY2VEaXJjdG9yeUNvbmZpZ3JhdGlvblxyXG4gICAgbGliPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcm5hbCBsaWJyYXJ5IG1vZHVsZSDjg4fjgqPjg6zjgq/jg4jjg6rlkI1cclxuICAgIGV4dGVybmFsPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZXJuYWwgbW9kdWxlIOODh+OCo+ODrOOCr+ODiOODquWQjVxyXG4gICAgcG9ydGluZz86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3J0aW5nIG1vZHVsZSDjg4fjgqPjg6zjgq/jg4jjg6rlkI1cclxuICAgIHJlcz86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g44Oq44K944O844K544OH44Kj44Os44Kv44OI44Oq5ZCNXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJmYWNlIElEZXBlbmRlbmN5XHJcbiAqIEBicmllZiBwYWNrYWdlLmpzb24g44Gr5oyH5a6a44GZ44KLIGRlcGVuZGVuY2llcyDmg4XloLHjgpLmoLzntI3jgZnjgovjgqTjg7Pjgr/jg7zjg5XjgqfjgqTjgrlcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURlcGVuZGVuY3kge1xyXG4gICAgbmFtZTogc3RyaW5nOyAgICAgICAgICAgLy8gbW9kdWxlIG5hbWUgZXgpIFwidHlwZXNjcmlwdFwiXHJcbiAgICB2ZXJzaW9uPzogc3RyaW5nOyAgICAgICAvLyDmjIflrprjg5Djg7zjgrjjg6fjg7MuIOeEoeaMh+WumuOBruWgtOWQiOOBr+acgOaWsOODkOODvOOCuOODp+ODs1xyXG4gICAgZXM/OiBzdHJpbmdbXTsgICAgICAgICAgLy8g5oyH5a6a44GV44KM44GfIEVTIHZlcnNpb24g44Gu44Go44GN44Gu44G/5pyJ5Yq544Gr44GZ44KLXHJcbiAgICBnbG9iYWxFeHBvcnQ/OiBzdHJpbmc7ICAvLyBnbG9iYWwgZXhwb3J0IOOCkuW/heimgeOBqOOBmeOCi+OCguOBruOBryBnbG9iYWwgT2JqZWN0IOWQjeOCkuaMh+WumlxyXG4gICAgYWxpYXM/OiBzdHJpbmc7ICAgICAgICAgLy8gYWxpYXMg44KS6Kit5a6a44GZ44KL5aC05ZCI44Gr5oyH5a6aXHJcbiAgICB2ZW5kZXJOYW1lPzogc3RyaW5nOyAgICAvLyB2ZW5kZXIg5ZCN44KS6Kit5a6a44GZ44KL5aC05ZCI44Gr5oyH5a6aXHJcbiAgICBmaWxlTmFtZT86IHN0cmluZzsgICAgICAvLyBmaWxlIOWQjeOCkuioreWumuOBmeOCi+WgtOWQiOOBq+aMh+WumlxyXG59XHJcblxyXG4vKipcclxuICogQGludGVyZmFjZSBJUHJvamVjdENvbmZpZ3JhdGlvblxyXG4gKiBAYnJpZWYg44OX44Ot44K444Kn44Kv44OI5YWx6YCa44Gu44Kz44Oz44OV44Kj44Ku44Ol44Os44O844K344On44Oz6Kit5a6aXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElQcm9qZWN0Q29uZmlncmF0aW9uIHtcclxuICAgIHByb2plY3ROYW1lOiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOODl+ODreOCuOOCp+OCr+ODiOWQjSBleCkgXCJjZHAtbGliXCJcclxuICAgIHByb2plY3RUeXBlOiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOODl+ODreOCuOOCp+OCr+ODiOeorumhniBleCkgXCJsaWJyYXJ5XCJcclxuICAgIGFjdGlvbjogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4KSBcImNyZWF0ZVwiXHJcbiAgICB2ZXJzaW9uOiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDjg5Djg7zjgrjjg6fjg7MgZXgpIFwiMS4wLjBcIlxyXG4gICAgbGljZW5zZTogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g44Op44Kk44K744Oz44K5IGV4KSBcIkFwYWNoZS0yLjBcIlxyXG4gICAgcHJpdmF0ZT86IGJvb2xlYW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJpdmF0ZSDjg5Hjg4PjgrHjg7zjgrjjga7loLTlkIggdHJ1ZVxyXG4gICAgc2V0dGluZ3M6IFV0aWxzLklHbG9iYWxTZXR0aW5nczsgICAgICAgICAgICAgICAgLy8g44Ot44Kw44Kq44OX44K344On44OzXHJcbiAgICBtb2R1bGVOYW1lPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbXBvcnQg44Gr5oyH5a6a44GZ44KLIOODouOCuOODpeODvOODq+WQjSBleCkgXCJjZHAtbGliXCJcclxuICAgIG1haW5CYXNlTmFtZT86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOODoeOCpOODs+ODleOCoeOCpOODq+WQjSBleCkgXCJjZHAtbGliXCIgLyBcImluZGV4XCJcclxuICAgIG5hbWVzcGFjZT86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOODq+ODvOODiOWQjeWJjeepuumWk1xyXG4gICAgc3RydWN0dXJlQ29uZmlnPzogSUJhc2VTdHJ1Y3R1cmVDb25maWdyYXRpb247ICAgLy8gSUJhc2VTdHJ1Y3R1cmVDb25maWdyYXRpb25cclxuICAgIGNvcHlyaWdodD86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOOCs+ODlOODvOODqeOCpOODiOaWh+Wtl+WIlyBleCkgXCJDb3B5cmlnaHQgKGMpIDIwMTcgU29ueSBDb3Jwb3JhdGlvblwiXHJcbiAgICBkZXZEZXBlbmRlbmNpZXM/OiBJRGVwZW5kZW5jeVtdOyAgICAgICAgICAgICAgICAvLyDplovnmbrnlKjkvp3lrZjjg6Ljgrjjg6Xjg7zjg6vmg4XloLFcclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcmZhY2UgSUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uXHJcbiAqIEBicmllZiDjg5Pjg6vjg4njgr/jg7zjgrLjg4Pjg4jjgrPjg7Pjg5XjgqPjgq7jg6Xjg6zjg7zjgrfjg6fjg7PoqK3lrppcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uIHtcclxuICAgIGVzPzogXCJlczVcIiB8IFwiZXMyMDE1XCI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUeXBlU2NyaXB0IOOBriB0cmFuc3BpbGUgdGFyZ2V0XHJcbiAgICBtb2R1bGU/OiBcIm5vbmVcIiB8IFwiY29tbW9uanNcIiB8IFwiYW1kXCIgfCBcInVtZFwiOyAgICAgICAgICAgICAgIC8vIEphdmFTY3JpcHQgbW9kdWxlIHN5c3RlbVxyXG4gICAgZW52PzogXCJ3ZWJcIiB8IFwibm9kZVwiIHwgXCJlbGVjdHJvblwiIHwgXCJlbGVjdHJvbi1yZW5kZXJlclwiOyAgICAvLyDlrp/ooYznkrDlooPjga4gdGFyZ2V0XHJcbiAgICBub2RlanM/OiBib29sZWFuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBcIm5vZGVcIiB8IFwiZWxlY3Ryb25cIiDjga7loLTlkIjjgasgdHJ1ZVxyXG4gICAgbWluaWZ5PzogYm9vbGVhbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g44Oq44Oq44O844K55pmC44GrIG1pbmlmeSDjgZnjgovloLTlkIjjga8gdHJ1ZVxyXG4gICAgLy8gYnVpbGQgdG9vbFxyXG4gICAgdG9vbHM/OiBzdHJpbmdbXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5pei5a6a44GuIGJ1aWxkIHRvb2wgZXgpIFtcIndlYnBhY2tcIl1cclxuICAgIG91dHB1dFNhbWVEaXI/OiBib29sZWFuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYyDjgaggYnVpbHQg44GM5ZCM44GY44OH44Kj44Os44Kv44OI44Oq44Gr44Gq44KL5aC05ZCIIHRydWVcclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcmZhY2UgSVdlYnBhY2tDb25maWdyYXRpb25cclxuICogQGJyaWVmIFdlYnBhY2sg55So44Kz44Oz44OV44Kj44Ku44Ol44Os44O844K344On44Oz6Kit5a6aXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElXZWJwYWNrQ29uZmlncmF0aW9uIHtcclxuICAgIG5vZGVqczogYm9vbGVhbjsgICAgLy8gXCJub2RlXCIgfCBcImVsZWN0cm9uXCIg44Gu5aC05ZCI44GrIHRydWVcclxuICAgIGd1aWRlOiBib29sZWFuOyAgICAgLy8gZ3VpZGUg44Kz44Oh44Oz44OI44KS5LuY5Yqg44GZ44KL5aC05ZCI44GvIHRydWUg44KS5oyH5a6aXHJcbiAgICB0YXNrUGF0aDogc3RyaW5nOyAgIC8vICd0YXNrJyDjg4fjgqPjg6zjgq/jg4jjg6rlkI1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcmZhY2UgSVZpc3VhbFN0dWRpb0NvbmZpZ3JhdGlvblxyXG4gKiBAYnJpZWYgVmlzdWFsIFN0dWRpbyDnlKjjgrPjg7Pjg5XjgqPjgq7jg6Xjg6zjg7zjgrfjg6fjg7PoqK3lrppcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVZpc3VhbFN0dWRpb0NvbmZpZ3JhdGlvbiBleHRlbmRzIElCYXNlU3RydWN0dXJlQ29uZmlncmF0aW9uIHtcclxuICAgIHByb2plY3ROYW1lOiBzdHJpbmc7ICAgICAgICAvLyDjg5fjg63jgrjjgqfjgq/jg4jlkI0gZXgpIFwiY2RwLWxpYlwiXHJcbiAgICBwcm9qZWN0R1VJRDogc3RyaW5nOyAgICAgICAgLy8g44OX44Ot44K444Kn44Kv44OIIEdVSUQgZXgpIHs1MUI0MTM1OS04RDJDLTQyREYtODQxNC1FODVCMDI5OTMyMzh9XHJcbiAgICBtYWluQmFzZU5hbWU6IHN0cmluZzsgICAgICAgLy8g44Oh44Kk44Oz44OV44Kh44Kk44Or5ZCNIGV4KSBcImNkcC1saWJcIiAvIGluZGV4XHJcbiAgICBsaWNlbnNlOiBib29sZWFuOyAgICAgICAgICAgLy8gTElDRU5TRSDjgpLov73liqDjgZnjgovloLTlkIjjga8gdHJ1ZVxyXG4gICAgd2VicGFjazogYm9vbGVhbjsgICAgICAgICAgIC8vIHdlYnBhY2suY29uZmlnLmpzIOOCkui/veWKoOOBmeOCi+WgtOWQiOOBryB0cnVlXHJcbiAgICB0ZXN0ZW06IGJvb2xlYW47ICAgICAgICAgICAgLy8gdGVzdGVtIHJ1bm5lciDjgpLov73liqDjgZnjgovloLTlkIjjga8gdHJ1ZVxyXG4gICAgb3V0cHV0U2FtZURpcjogYm9vbGVhbjsgICAgIC8vIHNyYyDjgaggYnVpbHQg44GM5ZCM44GY44OH44Kj44Os44Kv44OI44Oq44Gr44Gq44KL5aC05ZCIIHRydWVcclxuICAgIHRzR3JvdXA6IHtcclxuICAgICAgICByZWxhdGl2ZVBhdGg6IHN0cmluZzsgICAvLyBcImhvZ2Vob2dlXFxcIlxyXG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7ICAgICAgIC8vIFwiY2RwLWxpYlwiXHJcbiAgICAgICAgZGVwZW5kZWU6IGJvb2xlYW47ICAgICAgLy8g5L6d5a2Y5YWI44KS6L+95Yqg44GZ44KL5aC05ZCIIHRydWVcclxuICAgICAgICBtYXA6IGJvb2xlYW47ICAgICAgICAgICAvLyAubWFwIOODleOCoeOCpOODq+OBjOOBguOCi+WgtOWQiCB0cnVlXHJcbiAgICB9W107XHJcbiAgICBqc0dyb3VwOiB7XHJcbiAgICAgICAgcmVsYXRpdmVQYXRoOiBzdHJpbmc7ICAgLy8gXCJob2dlaG9nZVxcXCJcclxuICAgICAgICBmaWxlTmFtZTogc3RyaW5nOyAgICAgICAvLyBcImNkcC1saWJcIlxyXG4gICAgICAgIGRlcGVuZGVlOiBib29sZWFuOyAgICAgIC8vIOS+neWtmOWFiOOCkui/veWKoOOBmeOCi+WgtOWQiCB0cnVlXHJcbiAgICAgICAgZF90czogYm9vbGVhbjsgICAgICAgICAgLy8gLmQudHMg44OV44Kh44Kk44Or44GM44GC44KL5aC05ZCIIHRydWVcclxuICAgICAgICBtYXA6IGJvb2xlYW47ICAgICAgICAgICAvLyAubWFwIOODleOCoeOCpOODq+OBjOOBguOCi+WgtOWQiCB0cnVlXHJcbiAgICAgICAgbWluX21hcDogYm9vbGVhbjsgICAgICAgLy8gLm1pbiAubWFwIOODleOCoeOCpOODq+OBjOOBguOCi+WgtOWQiCB0cnVlXHJcbiAgICB9W107XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4uLy4uLy4uL3NyYy9nZW5lcmF0b3JzL2Jhc2UvaW50ZXJmYWNlcy50cyIsImltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcclxuaW1wb3J0IHtcclxuICAgIGZzLFxyXG4gICAgZ2xvYixcclxuICAgIGNoYWxrLFxyXG4gICAgXyxcclxuICAgICQsXHJcbiAgICAvLy8vXHJcbiAgICBleGVjQ29tbWFuZCxcclxuICAgIGdldFNwaW5uZXIsXHJcbiAgICBnZXRUYXJnZXREaXIsXHJcbiAgICB0ZW1wbGF0ZVBhdGgsXHJcbiAgICBjb3B5VHBsLFxyXG4gICAgbG9nLFxyXG4gICAgZGVidWcsXHJcbiAgICB0cmFuc2xhdGUsXHJcbn0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgSUJhc2VTdHJ1Y3R1cmVDb25maWdyYXRpb24sXHJcbiAgICBJRGVwZW5kZW5jeSxcclxuICAgIElQcm9qZWN0Q29uZmlncmF0aW9uLFxyXG4gICAgSUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uLFxyXG4gICAgSVdlYnBhY2tDb25maWdyYXRpb24sXHJcbn0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzcyBHZW5lcmF0b3JCYXNlXHJcbiAqIEBicmllZiDjgZnjgbnjgabjga4gR2VuZXJhdG9yIOOBruaXouWumuOCr+ODqeOCuVxyXG4gKi9cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEdlbmVyYXRvckJhc2Uge1xyXG5cclxuICAgIHByaXZhdGUgX3Byb2plY3RSb290RGlyOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBjb25zdHJ1Y3RvclxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7SVByb2plY3RDb25maWdyYXRpb259IGNvbmZpZyDjgrPjg7Pjg5XjgqPjgrBcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9jb25maWc6IElQcm9qZWN0Q29uZmlncmF0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5fcHJvamVjdFJvb3REaXIgPSBnZXRUYXJnZXREaXIoKSA/XHJcbiAgICAgICAgICAgIGdldFRhcmdldERpcigpIDpcclxuICAgICAgICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIHRoaXMuX2NvbmZpZy5wcm9qZWN0TmFtZSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcgPSAkLmV4dGVuZCh7fSwgdGhpcy5kZWZhdWx0QmFzZVN0cnVjdHVyZSgpLCB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnKTtcclxuXHJcbiAgICAgICAgdGhpcy5fY29uZmlnLnByaXZhdGUgPSBcIk5PTkVcIiA9PT0gdGhpcy5fY29uZmlnLmxpY2Vuc2U7XHJcblxyXG4gICAgICAgICg8SUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uPnRoaXMuX2NvbmZpZykub3V0cHV0U2FtZURpclxyXG4gICAgICAgICAgICA9IHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjID09PSB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLmJ1aWx0O1xyXG5cclxuICAgICAgICAoPElCdWlsZFRhcmdldENvbmZpZ3JhdGlvbj50aGlzLl9jb25maWcpLm5vZGVqcyA9ICgoZW52OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgc3dpdGNoIChlbnYpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJub2RlXCI6XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiZWxlY3Ryb25cIjpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkoKDxJQnVpbGRUYXJnZXRDb25maWdyYXRpb24+dGhpcy5fY29uZmlnKS5lbnYpO1xyXG5cclxuICAgICAgICBkZWJ1ZyhKU09OLnN0cmluZ2lmeSh0aGlzLl9jb25maWcsIG51bGwsIDQpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgLy8gcHViaWMgbWV0aG9kczpcclxuXHJcbiAgICAvKipcclxuICAgICAqIOWHpueQhumWi+WniyAo44Ko44Oz44OI44OqKVxyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMuX2NvbmZpZy5hY3Rpb24pIHtcclxuICAgICAgICAgICAgY2FzZSBcImNyZWF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucnVuQ3JlYXRlKCk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJ1bmtub3duIGFjdGlvbjogXCIgKyB0aGlzLl9jb25maWcuYWN0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIC8vIGFic3RyYWN0IG1ldGhvZHM6XHJcblxyXG4gICAgLy8g5pei5a6a44GuIGRpcmVjdG9yeSDmp4vpgKDjgpLov5TljbRcclxuICAgIGFic3RyYWN0IGRlZmF1bHRCYXNlU3RydWN0dXJlKCk6IElCYXNlU3RydWN0dXJlQ29uZmlncmF0aW9uO1xyXG5cclxuICAgIC8vIGFjdGlvbjogY3JlYXRlIOOBruOBqOOBjeOBq+WRvOOBsOOCjOOCi1xyXG4gICAgYWJzdHJhY3QgYXN5bmMgY3JlYXRlKCk6IFByb21pc2U8dm9pZD47XHJcblxyXG4gICAgLy8g5b+F6KaB44Go44GZ44KLIHRhc2sgc2NyaXB0IOS4gOimp+OCkui/lOWNtC4gYWN0aW9uOiBjcmVhdGUg44Gu44Go44GN44Gr5ZG844Gw44KM44KLXHJcbiAgICBhYnN0cmFjdCBnZXQgdGFza0xpc3QoKTogc3RyaW5nW107XHJcblxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIC8vIHByb3RlY3RlZCBtZXRob2RzOlxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6YCy5o2X44OG44Kt44K544OI44KS6YCa55+lXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGtleSDjg63jg7zjgqvjg6njgqTjgrrjg6rjgr3jg7zjgrnjgq3jg7zjgpLmjIflrppcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHByb2dyZXNzKGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgbG9nKGNoYWxrLmN5YW4odHJhbnNsYXRlKGtleSkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOitpuWRiuODhuOCreOCueODiOOCkumAmuefpVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBrZXkg44Ot44O844Kr44Op44Kk44K644Oq44K944O844K544Kt44O844KS5oyH5a6aXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCB3YXJuKGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgbG9nKGNoYWxrLnllbGxvdyh0cmFuc2xhdGUoa2V5KSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogd29yayBkaXJlY3Rvcnkg44Gu5aSJ5pu0XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGRpcmVjdG9yeSB0YXJnZXQgZGlyZWN0b3J5LlxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgY2hkaXIoZGlyZWN0b3J5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBwcm9jZXNzLmNoZGlyKGRpcmVjdG9yeSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5IOOBruWPluW+l1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkaXJlY3RvcnkgdGFyZ2V0IGRpcmVjdG9yeS5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldCByb290RGlyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2plY3RSb290RGlyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogdGVtcGxhdGUgZGlyZWN0b3J5IOOCkuaMh+WumuOBl+OBpumFjeS4i+OBruODleOCoeOCpOODq+OCkuOCs+ODlOODvFxyXG4gICAgICogSUJhc2VTdHJ1Y3R1cmVDb25maWdyYXRpb24g44Gu6Kit5a6a44GM5Y+N5pig44GV44KM44KLXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHRhcmdldCAg44K/44O844Ky44OD44OI44KS5oyH5a6aLiBudWxsIOOBruWgtOWQiOOBr+OAgXRlbXBsYXRlcyDjgpLov5TljbRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkc3RSb290IOOCs+ODlOODvOWFiOOCkuaMh+Wumi4g5oyH5a6a44GM54Sh44GE5aC05ZCI44GvIHJvb3REaXIg44GM6Kit5a6aXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBjb3B5VHBsRGlyKHRhcmdldDogc3RyaW5nLCBkc3RSb290Pzogc3RyaW5nLCBvcHRpb25zPzogZ2xvYi5JT3B0aW9ucyk6IHZvaWQge1xyXG4gICAgICAgIGRzdFJvb3QgPSBkc3RSb290IHx8IHRoaXMucm9vdERpcjtcclxuICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe1xyXG4gICAgICAgICAgICBjd2Q6IHRlbXBsYXRlUGF0aCh0YXJnZXQpLFxyXG4gICAgICAgICAgICBub2RpcjogdHJ1ZSxcclxuICAgICAgICAgICAgZG90OiB0cnVlLFxyXG4gICAgICAgIH0sIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICBnbG9iLnN5bmMoXCIqKlwiLCBvcHRpb25zKVxyXG4gICAgICAgICAgICAuZm9yRWFjaCgoZmlsZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZHN0ID0gcGF0aC5qb2luKGRzdFJvb3QsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvc3JjLywgICAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvcGtnLywgICAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcucGtnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvYnVpbHQvLCAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuYnVpbHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9kb2MvLCAgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5kb2MpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC90YXNrLywgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50YXNrKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvdGVzdC8sICAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcudGVzdClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL3R5cGVzLywgICB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnR5cGVzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvdGVtcFxcLy8sICAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcudGVtcCArIFwiL1wiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvbGliLywgICAgICAgICB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLmxpYiB8fCBcImxpYlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvZXh0ZXJuYWwvLCAgICB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLmV4dGVybmFsIHx8IFwiZXh0ZXJuYWxcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL3BvcnRpbmcvLCAgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5wb3J0aW5nIHx8IFwicG9ydGluZ1wiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvcmVzLywgICAgICAgICB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnJlcyB8fCBcInJlc1wiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9zY3JpcHQvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmNDb25maWdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICh0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyY0NvbmZpZy5zY3JpcHQgfHwgXCJzY3JpcHRzXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcInNjcmlwdHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgL3N0eWxlc2hlZXQvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmNDb25maWdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICh0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnNyY0NvbmZpZy5zdHlsZXNoZWV0IHx8IFwic3R5bGVzaGVldHNcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwic3R5bGVzaGVldHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgL3RlbXBsYXRlLyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbmZpZy5zdHJ1Y3R1cmVDb25maWcuc3JjQ29uZmlnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAodGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy5zcmNDb25maWcudGVtcGxhdGUgfHwgXCJ0ZW1wbGF0ZXNcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwidGVtcGxhdGVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGZzLmNvcHlTeW5jKHBhdGguam9pbih0ZW1wbGF0ZVBhdGgodGFyZ2V0KSwgZmlsZSksIGRzdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBub2RlIG1vZHVsZSDjga4gdmVyc2lvbiDlj5blvpdcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1Byb21pc2U8c3RyaW5nPn0gdmVyc2lvbiB0ZXh0XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBxdWVyeU5vZGVNb2R1bGVMYXRlc3RWZXJzaW9uKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgbGV0IHZlcnNpb246IHN0cmluZztcclxuICAgICAgICAgICAgZXhlY0NvbW1hbmQoXCJucG1cIiwgW1wiaW5mb1wiLCBuYW1lLCBcInZlcnNpb25cIl0sIHtcclxuICAgICAgICAgICAgICAgIHN0ZGlvOiBcInBpcGVcIixcclxuICAgICAgICAgICAgICAgIHNwaW5uZXI6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBzdGRvdXQ6IChkYXRhOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gXy50cmltKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZlcnNpb24pO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaXouWumuOBrumWi+eZuuaZguOBruS+neWtmOODouOCuOODpeODvOODq+ODquOCueODiOOBruWPluW+l1xyXG4gICAgICog5b+F6KaB44Gr5b+c44GY44Gm44Kq44O844OQ44O844Op44Kk44OJXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7SURlcGVuZGVuY3l9XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgZGVmYXVsdERldkRlcGVuZGVuY2llcygpOiBJRGVwZW5kZW5jeVtdIHtcclxuICAgICAgICBjb25zdCBiYXNlID0gW1xyXG4gICAgICAgICAgICB7IG5hbWU6IFwiY29udmVydC1zb3VyY2UtbWFwXCIsICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwiZGVsXCIsICAgICAgICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwiZXNsaW50XCIsICAgICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwibnBtLXJ1bi1hbGxcIiwgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwicGxhdG9cIiwgICAgICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwic291cmNlLW1hcFwiLCAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwidHNsaW50XCIsICAgICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwidHlwZWRvY1wiLCAgICAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6IFwidHlwZXNjcmlwdFwiLCAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9LFxyXG4gICAgICAgIF07XHJcbiAgICAgICAgY29uc3QgbWluaWZ5ID0gW1xyXG4gICAgICAgICAgICB7IG5hbWU6IFwidWdsaWZ5LWpzXCIsICAgIHZlcnNpb246IHVuZGVmaW5lZCwgZXM6IFtcImVzNVwiXSwgICAgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiBcInVnbGlmeS1lc1wiLCAgICB2ZXJzaW9uOiB1bmRlZmluZWQsIGVzOiBbXCJlczIwMTVcIl0sIH0sXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgbGV0IGV4dHJhID0gW107XHJcbiAgICAgICAgaWYgKCg8SUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uPnRoaXMuX2NvbmZpZykubWluaWZ5KSB7XHJcbiAgICAgICAgICAgIGV4dHJhID0gZXh0cmEuY29uY2F0KG1pbmlmeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlVG9vbChcIndlYnBhY2tcIikpIHtcclxuICAgICAgICAgICAgZXh0cmEucHVzaCh7IG5hbWU6IFwid2VicGFja1wiLCAgICAgICAgICAgdmVyc2lvbjogdW5kZWZpbmVkLCB9KTtcclxuICAgICAgICAgICAgZXh0cmEucHVzaCh7IG5hbWU6IFwic291cmNlLW1hcC1sb2FkZXJcIiwgdmVyc2lvbjogdW5kZWZpbmVkLCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVUb29sKFwibnljXCIpKSB7XHJcbiAgICAgICAgICAgIGV4dHJhLnB1c2goeyBuYW1lOiBcIm55Y1wiLCB2ZXJzaW9uOiB1bmRlZmluZWQsIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZVRvb2woXCJ0ZXN0ZW1cIikpIHtcclxuICAgICAgICAgICAgZXh0cmEucHVzaCh7IG5hbWU6IFwidGVzdGVtXCIsIHZlcnNpb246IHVuZGVmaW5lZCwgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlVG9vbChcInBoYW50b21qcy1wcmVidWlsdFwiKSkge1xyXG4gICAgICAgICAgICBleHRyYS5wdXNoKHsgbmFtZTogXCJwaGFudG9tanMtcHJlYnVpbHRcIiwgdmVyc2lvbjogdW5kZWZpbmVkLCB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBfLnNvcnRCeShiYXNlLmNvbmNhdChleHRyYSksIChkZXBlbmQpID0+IGRlcGVuZC5uYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGRlcGVuZGVuY2llcyDjga4gdGVtcGxhdGUgcGFyYW1hZXRlciDjgpLlj5blvpdcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gIHtJRGVwZW5kZW5jeVtdfSBkZXBlbmRlbmNpZXMg5L6d5a2Y6Zai5L+C44Oq44K544OIXHJcbiAgICAgKiBAcmV0dXJuIHt7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nOyBsYXN0PzogYm9vbGVhbjsgfVtdfSDjg4bjg7Pjg5fjg6zjg7zjg4jjg5Hjg6njg6Hjg7zjgr/jgavmjIflrprjgZnjgovphY3liJdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGFzeW5jIHF1ZXJ5RGVwZW5kZW5jaWVzUGFyYW0oZGVwZW5kZW5jaWVzOiBJRGVwZW5kZW5jeVtdKTogUHJvbWlzZTx7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nOyBsYXN0PzogYm9vbGVhbiB9W10+IHtcclxuICAgICAgICB0aGlzLnByb2dyZXNzKFwiYmFzZS5jcmVhdGUucXVlcnlWZXJzaW9uXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBkZXBlbmRzID0gPHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmc7IGxhc3Q/OiBib29sZWFuOyB9W10+ZGVwZW5kZW5jaWVzXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKGRlcGVuZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZGVwZW5kLmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWRlcGVuZC5lcy5maW5kKChlc1ZlcnNpb24pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICg8SUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uPnRoaXMuX2NvbmZpZykuZXMgPT09IGVzVmVyc2lvbjtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRlYnVnKEpTT04uc3RyaW5naWZ5KGRlcGVuZHMsIG51bGwsIDQpKTtcclxuXHJcbiAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSAoY29udGV4dDogYW55KTogYW55ID0+IHtcclxuICAgICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiBjb250ZXh0ICYmICF0aGlzLl9jb25maWcuc2V0dGluZ3Muc2lsZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzcGlubmVyID0gZ2V0U3Bpbm5lcihjaGFsay55ZWxsb3coY29udGV4dCksIDUpO1xyXG4gICAgICAgICAgICAgICAgc3Bpbm5lci5zdGFydCgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNwaW5uZXI7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGV4dCkge1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5zdG9wKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG4gPSBkZXBlbmRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBpZiAobnVsbCA9PSBkZXBlbmRzW2ldLnZlcnNpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNwaW5uZXIgPSBwcm9ncmVzcyhkZXBlbmRzW2ldLm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgZGVwZW5kc1tpXS52ZXJzaW9uID0gXCJeXCIgKyBhd2FpdCB0aGlzLnF1ZXJ5Tm9kZU1vZHVsZUxhdGVzdFZlcnNpb24oZGVwZW5kc1tpXS5uYW1lKTtcclxuICAgICAgICAgICAgICAgIHByb2dyZXNzKHNwaW5uZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpID09PSBuIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgZGVwZW5kc1tpXS5sYXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRlcGVuZHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB3ZWJwYWNrLmNvbmZpZy5qcyDjga4gdGVtcGxhdGUgcGFyYW1hZXRlciDjgpLlj5blvpdcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IGxpYnJhcnlUYXJnZXQg44Gr5oyH5a6a44GZ44KL5paH5a2X5YiXXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBxdWVyeVdlYnBhY2tMaWJyYXJ5VGFyZ2V0KCk6IHN0cmluZyB7XHJcbiAgICAgICAgc3dpdGNoICgoPElCdWlsZFRhcmdldENvbmZpZ3JhdGlvbj50aGlzLl9jb25maWcpLm1vZHVsZSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiY29tbW9uanNcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImNvbW1vbmpzMlwiO1xyXG4gICAgICAgICAgICBjYXNlIFwiYW1kXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJhbWRcIjtcclxuICAgICAgICAgICAgY2FzZSBcInVtZFwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwidW1kXCI7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGVzbGludHJjIOOBriBlbnYg44Gr5oyH5a6a44GZ44KLIHRlbXBsYXRlIHBhcmFtYWV0ZXIg44KS5Y+W5b6XXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBlbnYg44Gr5oyH5a6a44GZ44KL44OG44Oz44OX44Os44O844OI44OR44Op44Oh44O844K/44Kq44OW44K444Kn44Kv44OIXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBxdWVyeUVzTGludEVudlBhcmFtKCk6IGFueSB7XHJcbiAgICAgICAgY29uc3QgY29tcGlsZVNldHRpbmcgPSA8SUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uPnRoaXMuX2NvbmZpZztcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBlczY6IFwiZXM1XCIgIT09IGNvbXBpbGVTZXR0aW5nLmVzLFxyXG4gICAgICAgICAgICBub2RlOiBcIndlYlwiICE9PSBjb21waWxlU2V0dGluZy5lbnYsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIElCdWlsZFRhcmdldENvbmZpZ3JhdGlvbi50b29scyDjg5fjg63jg5Hjg4bjgqPjga7mjIflrprnirbms4HjgpLlj5blvpdcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9ICBuYW1lIOODhOODvOODq+WQjeOCkuaMh+WumlxyXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZTog5oyH5a6a44GV44KM44Gm44GE44KLIC8gZmFsc2U6IOaMh+WumuOBleOCjOOBpuOBhOOBquOBhFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgaXNFbmFibGVUb29sKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAhISg8SUJ1aWxkVGFyZ2V0Q29uZmlncmF0aW9uPnRoaXMuX2NvbmZpZykudG9vbHMuZmluZCgodG9vbCkgPT4gbmFtZSA9PT0gdG9vbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIC8vIHByaXZhdGUgbWV0aG9kczpcclxuXHJcbiAgICAvKipcclxuICAgICAqIGNyZWF0ZSDlh6bnkIbjga7jgqjjg7Pjg4jjg6pcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBydW5DcmVhdGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVCYXNlKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YWx6YCa44GuIGNyZWF0ZSDlh6bnkIZcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVCYXNlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MoXCJiYXNlLmNyZWF0ZS5mb3VuZGF0aW9uXCIpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlUHJvamVjdERpcigpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY29weUJhc2VTdHJ1Y3R1cmUoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmNvcHlDb21tb25GaWxlcygpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY29weVRhc2tTY3JpcHRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDjg5fjg63jgrjjgqfjgq/jg4jjg4fjgqPjg6zjgq/jg4jjg6rjga7kvZzmiJBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVQcm9qZWN0RGlyKCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHRoaXMucm9vdERpcikpIHtcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IodHJhbnNsYXRlKFwiYmFzZS5jcmVhdGUuZXJyb3IuYWxyZWFkeUV4aXN0XCIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZnMubWtkaXJzU3luYyh0aGlzLnJvb3REaXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YWx6YCa5qeL5oiQ5oOF5aCx44Gu44Kz44OU44O8XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY29weUJhc2VTdHJ1Y3R1cmUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb3B5VHBsRGlyKFwiYmFzZS9zdHJ1Y3R1cmVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDln7rmnKzjg5XjgqHjgqTjg6vjga7jgrPjg5Tjg7xcclxuICAgICAqIHRlbXBsYXRlIOOBruOCs+ODlOODvOOCguihjOOBhlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvcHlDb21tb25GaWxlcygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzcmNEaXIgPSB0ZW1wbGF0ZVBhdGgoXCJiYXNlXCIpO1xyXG4gICAgICAgIGNvbnN0IGRzdERpciA9IHRoaXMucm9vdERpcjtcclxuXHJcbiAgICAgICAgLy8gLm5wbWlnbm9yZVxyXG4gICAgICAgIGNvcHlUcGwoXHJcbiAgICAgICAgICAgIHBhdGguam9pbihzcmNEaXIsIFwiX25wbWlnbm9yZVwiKSxcclxuICAgICAgICAgICAgcGF0aC5qb2luKGRzdERpciwgXCIubnBtaWdub3JlXCIpLFxyXG4gICAgICAgICAgICB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gQkFOTkVSXHJcbiAgICAgICAgZnMuY29weVN5bmMoXHJcbiAgICAgICAgICAgIHBhdGguam9pbihzcmNEaXIsIFwiX0JBTk5FUlwiKSxcclxuICAgICAgICAgICAgcGF0aC5qb2luKGRzdERpciwgXCJCQU5ORVJcIiksXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gTElDRU5TRVxyXG4gICAgICAgIHN3aXRjaCAodGhpcy5fY29uZmlnLmxpY2Vuc2UpIHtcclxuICAgICAgICAgICAgY2FzZSBcIkFwYWNoZS0yLjBcIjpcclxuICAgICAgICAgICAgICAgIGZzLmNvcHlTeW5jKFxyXG4gICAgICAgICAgICAgICAgICAgIHBhdGguam9pbihzcmNEaXIsIFwiX0xJQ0VOU0UuQXBhY2hlLTIuMFwiKSxcclxuICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4oZHN0RGlyLCBcIkxJQ0VOU0VcIiksXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJNSVRcIjpcclxuICAgICAgICAgICAgICAgIGNvcHlUcGwoXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY0RpciwgXCJfTElDRU5TRS5NSVRcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKGRzdERpciwgXCJMSUNFTlNFXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbmZpZy5jb3B5cmlnaHRcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTk9USUNFXHJcbiAgICAgICAgZnMuY29weVN5bmMoXHJcbiAgICAgICAgICAgIHBhdGguam9pbihzcmNEaXIsIFwiX05PVElDRVwiKSxcclxuICAgICAgICAgICAgcGF0aC5qb2luKGRzdERpciwgXCJOT1RJQ0VcIiksXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gYnVpbGQgdG9vbHM6IHdlYnBhY2tcclxuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZVRvb2woXCJ3ZWJwYWNrXCIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtOiBJV2VicGFja0NvbmZpZ3JhdGlvbiA9IHtcclxuICAgICAgICAgICAgICAgIG5vZGVqczogKDxJQnVpbGRUYXJnZXRDb25maWdyYXRpb24+dGhpcy5fY29uZmlnKS5ub2RlanMsXHJcbiAgICAgICAgICAgICAgICBndWlkZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHRhc2tQYXRoOiB0aGlzLl9jb25maWcuc3RydWN0dXJlQ29uZmlnLnRhc2ssXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvcHlUcGwoXHJcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4oc3JjRGlyLCBcInRvb2xzL3dlYnBhY2svX3dlYnBhY2suY29uZmlnLmpzXCIpLFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKGRzdERpciwgXCJ3ZWJwYWNrLmNvbmZpZy5qc1wiKSxcclxuICAgICAgICAgICAgICAgIHBhcmFtLFxyXG4gICAgICAgICAgICAgICAgeyBkZWxpbWl0ZXJzOiBcIjwlICU+XCIgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHRhc2sgc2NyaXB0IOOBruOCs+ODlOODvFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvcHlUYXNrU2NyaXB0cygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzcmNEaXIgPSB0ZW1wbGF0ZVBhdGgoXCJiYXNlL3Rhc2tcIik7XHJcbiAgICAgICAgY29uc3QgZHN0RGlyID0gcGF0aC5qb2luKHRoaXMucm9vdERpciwgdGhpcy5fY29uZmlnLnN0cnVjdHVyZUNvbmZpZy50YXNrKTtcclxuXHJcbiAgICAgICAgdGhpcy50YXNrTGlzdC5mb3JFYWNoKCh0YXNrKSA9PiB7XHJcbiAgICAgICAgICAgIGZzLmNvcHlTeW5jKFxyXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY0RpciwgdGFzayksXHJcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4oZHN0RGlyLCB0YXNrKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi4vLi4vLi4vc3JjL2dlbmVyYXRvcnMvYmFzZS9nZW5lcmF0b3ItYmFzZS50cyJdfQ=="]} \ No newline at end of file diff --git a/package.json b/package.json index a01f9c6..70a0691 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cdp-lib", - "version": "0.1.3", + "version": "0.1.4", "description": "Contains npm modules used primarily by cdp boilerplate generator.", "main": "dist/cdp-lib.min.js", "types": "dist/@types/cdp-lib/index.d.ts",