hotstaq 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dockerignore +123 -0
- package/.eslintignore +17 -0
- package/.eslintrc.js +11 -0
- package/.vscode/launch.json +201 -0
- package/.vscode/settings.json +2 -0
- package/.vscode/tasks.json +88 -0
- package/CONTRIBUTING.md +157 -0
- package/LICENSE +21 -0
- package/README.md +128 -0
- package/bin/hotstaq +3 -0
- package/bin/hotstaq.cmd +1 -0
- package/build/src/Hot.d.ts +167 -0
- package/build/src/Hot.d.ts.map +1 -0
- package/build/src/Hot.js +365 -0
- package/build/src/Hot.js.map +1 -0
- package/build/src/HotAPI.d.ts +137 -0
- package/build/src/HotAPI.d.ts.map +1 -0
- package/build/src/HotAPI.js +353 -0
- package/build/src/HotAPI.js.map +1 -0
- package/build/src/HotAgentAPI.d.ts +22 -0
- package/build/src/HotAgentAPI.d.ts.map +1 -0
- package/build/src/HotAgentAPI.js +85 -0
- package/build/src/HotAgentAPI.js.map +1 -0
- package/build/src/HotAgentRoute.d.ts +17 -0
- package/build/src/HotAgentRoute.d.ts.map +1 -0
- package/build/src/HotAgentRoute.js +109 -0
- package/build/src/HotAgentRoute.js.map +1 -0
- package/build/src/HotBuilder.d.ts +52 -0
- package/build/src/HotBuilder.d.ts.map +1 -0
- package/build/src/HotBuilder.js +242 -0
- package/build/src/HotBuilder.js.map +1 -0
- package/build/src/HotClient.d.ts +31 -0
- package/build/src/HotClient.d.ts.map +1 -0
- package/build/src/HotClient.js +19 -0
- package/build/src/HotClient.js.map +1 -0
- package/build/src/HotComponent.d.ts +118 -0
- package/build/src/HotComponent.d.ts.map +1 -0
- package/build/src/HotComponent.js +89 -0
- package/build/src/HotComponent.js.map +1 -0
- package/build/src/HotCreator.d.ts +88 -0
- package/build/src/HotCreator.d.ts.map +1 -0
- package/build/src/HotCreator.js +445 -0
- package/build/src/HotCreator.js.map +1 -0
- package/build/src/HotDB.d.ts +69 -0
- package/build/src/HotDB.d.ts.map +1 -0
- package/build/src/HotDB.js +29 -0
- package/build/src/HotDB.js.map +1 -0
- package/build/src/HotDBConnectionInterface.d.ts +40 -0
- package/build/src/HotDBConnectionInterface.d.ts.map +1 -0
- package/build/src/HotDBConnectionInterface.js +3 -0
- package/build/src/HotDBConnectionInterface.js.map +1 -0
- package/build/src/HotFile.d.ts +134 -0
- package/build/src/HotFile.d.ts.map +1 -0
- package/build/src/HotFile.js +454 -0
- package/build/src/HotFile.js.map +1 -0
- package/build/src/HotGenerator.d.ts +80 -0
- package/build/src/HotGenerator.d.ts.map +1 -0
- package/build/src/HotGenerator.js +342 -0
- package/build/src/HotGenerator.js.map +1 -0
- package/build/src/HotHTTPServer.d.ts +162 -0
- package/build/src/HotHTTPServer.d.ts.map +1 -0
- package/build/src/HotHTTPServer.js +863 -0
- package/build/src/HotHTTPServer.js.map +1 -0
- package/build/src/HotIO.d.ts +47 -0
- package/build/src/HotIO.d.ts.map +1 -0
- package/build/src/HotIO.js +232 -0
- package/build/src/HotIO.js.map +1 -0
- package/build/src/HotLog.d.ts +60 -0
- package/build/src/HotLog.d.ts.map +1 -0
- package/build/src/HotLog.js +126 -0
- package/build/src/HotLog.js.map +1 -0
- package/build/src/HotPage.d.ts +125 -0
- package/build/src/HotPage.d.ts.map +1 -0
- package/build/src/HotPage.js +178 -0
- package/build/src/HotPage.js.map +1 -0
- package/build/src/HotRoute.d.ts +82 -0
- package/build/src/HotRoute.d.ts.map +1 -0
- package/build/src/HotRoute.js +83 -0
- package/build/src/HotRoute.js.map +1 -0
- package/build/src/HotRouteMethod.d.ts +129 -0
- package/build/src/HotRouteMethod.d.ts.map +1 -0
- package/build/src/HotRouteMethod.js +84 -0
- package/build/src/HotRouteMethod.js.map +1 -0
- package/build/src/HotServer.d.ts +152 -0
- package/build/src/HotServer.d.ts.map +1 -0
- package/build/src/HotServer.js +109 -0
- package/build/src/HotServer.js.map +1 -0
- package/build/src/HotSetAsWeb.d.ts +2 -0
- package/build/src/HotSetAsWeb.d.ts.map +1 -0
- package/build/src/HotSetAsWeb.js +5 -0
- package/build/src/HotSetAsWeb.js.map +1 -0
- package/build/src/HotStaq.d.ts +603 -0
- package/build/src/HotStaq.d.ts.map +1 -0
- package/build/src/HotStaq.js +1260 -0
- package/build/src/HotStaq.js.map +1 -0
- package/build/src/HotStaqWeb.d.ts +18 -0
- package/build/src/HotStaqWeb.d.ts.map +1 -0
- package/build/src/HotStaqWeb.js +44 -0
- package/build/src/HotStaqWeb.js.map +1 -0
- package/build/src/HotTestDriver.d.ts +63 -0
- package/build/src/HotTestDriver.d.ts.map +1 -0
- package/build/src/HotTestDriver.js +187 -0
- package/build/src/HotTestDriver.js.map +1 -0
- package/build/src/HotTestElement.d.ts +71 -0
- package/build/src/HotTestElement.d.ts.map +1 -0
- package/build/src/HotTestElement.js +37 -0
- package/build/src/HotTestElement.js.map +1 -0
- package/build/src/HotTestMap.d.ts +83 -0
- package/build/src/HotTestMap.d.ts.map +1 -0
- package/build/src/HotTestMap.js +58 -0
- package/build/src/HotTestMap.js.map +1 -0
- package/build/src/HotTestSeleniumDriver.d.ts +86 -0
- package/build/src/HotTestSeleniumDriver.d.ts.map +1 -0
- package/build/src/HotTestSeleniumDriver.js +400 -0
- package/build/src/HotTestSeleniumDriver.js.map +1 -0
- package/build/src/HotTester.d.ts +188 -0
- package/build/src/HotTester.d.ts.map +1 -0
- package/build/src/HotTester.js +622 -0
- package/build/src/HotTester.js.map +1 -0
- package/build/src/HotTesterAPI.d.ts +15 -0
- package/build/src/HotTesterAPI.d.ts.map +1 -0
- package/build/src/HotTesterAPI.js +161 -0
- package/build/src/HotTesterAPI.js.map +1 -0
- package/build/src/HotTesterMocha.d.ts +50 -0
- package/build/src/HotTesterMocha.d.ts.map +1 -0
- package/build/src/HotTesterMocha.js +205 -0
- package/build/src/HotTesterMocha.js.map +1 -0
- package/build/src/HotTesterMochaSelenium.d.ts +70 -0
- package/build/src/HotTesterMochaSelenium.d.ts.map +1 -0
- package/build/src/HotTesterMochaSelenium.js +257 -0
- package/build/src/HotTesterMochaSelenium.js.map +1 -0
- package/build/src/HotTesterServer.d.ts +114 -0
- package/build/src/HotTesterServer.d.ts.map +1 -0
- package/build/src/HotTesterServer.js +575 -0
- package/build/src/HotTesterServer.js.map +1 -0
- package/build/src/api copy.d.ts +2 -0
- package/build/src/api copy.d.ts.map +1 -0
- package/build/src/api copy.js +153 -0
- package/build/src/api copy.js.map +1 -0
- package/build/src/api-web.d.ts +2 -0
- package/build/src/api-web.d.ts.map +1 -0
- package/build/src/api-web.js +45 -0
- package/build/src/api-web.js.map +1 -0
- package/build/src/api.d.ts +33 -0
- package/build/src/api.d.ts.map +1 -0
- package/build/src/api.js +78 -0
- package/build/src/api.js.map +1 -0
- package/build/src/cli.d.ts +2 -0
- package/build/src/cli.d.ts.map +1 -0
- package/build/src/cli.js +1040 -0
- package/build/src/cli.js.map +1 -0
- package/build/src/schemas/HotDBInflux.d.ts +63 -0
- package/build/src/schemas/HotDBInflux.d.ts.map +1 -0
- package/build/src/schemas/HotDBInflux.js +239 -0
- package/build/src/schemas/HotDBInflux.js.map +1 -0
- package/build/src/schemas/HotDBMigration.d.ts +19 -0
- package/build/src/schemas/HotDBMigration.d.ts.map +1 -0
- package/build/src/schemas/HotDBMigration.js +15 -0
- package/build/src/schemas/HotDBMigration.js.map +1 -0
- package/build/src/schemas/HotDBMySQL.d.ts +65 -0
- package/build/src/schemas/HotDBMySQL.d.ts.map +1 -0
- package/build/src/schemas/HotDBMySQL.js +387 -0
- package/build/src/schemas/HotDBMySQL.js.map +1 -0
- package/build/src/schemas/HotDBSchema.d.ts +15 -0
- package/build/src/schemas/HotDBSchema.d.ts.map +1 -0
- package/build/src/schemas/HotDBSchema.js +19 -0
- package/build/src/schemas/HotDBSchema.js.map +1 -0
- package/build/src/schemas/influx/InfluxSchema.d.ts +14 -0
- package/build/src/schemas/influx/InfluxSchema.d.ts.map +1 -0
- package/build/src/schemas/influx/InfluxSchema.js +33 -0
- package/build/src/schemas/influx/InfluxSchema.js.map +1 -0
- package/build/src/schemas/mysql/MySQLSchema.d.ts +39 -0
- package/build/src/schemas/mysql/MySQLSchema.d.ts.map +1 -0
- package/build/src/schemas/mysql/MySQLSchema.js +151 -0
- package/build/src/schemas/mysql/MySQLSchema.js.map +1 -0
- package/build/src/schemas/mysql/MySQLSchemaField.d.ts +168 -0
- package/build/src/schemas/mysql/MySQLSchemaField.d.ts.map +1 -0
- package/build/src/schemas/mysql/MySQLSchemaField.js +260 -0
- package/build/src/schemas/mysql/MySQLSchemaField.js.map +1 -0
- package/build/src/schemas/mysql/MySQLSchemaTable.d.ts +49 -0
- package/build/src/schemas/mysql/MySQLSchemaTable.d.ts.map +1 -0
- package/build/src/schemas/mysql/MySQLSchemaTable.js +310 -0
- package/build/src/schemas/mysql/MySQLSchemaTable.js.map +1 -0
- package/build-web/HotStaq.js +2 -0
- package/build-web/HotStaq.min.js +119 -0
- package/build-web/HotStaqTests_HelloWorldAPI.js +133 -0
- package/builder/docker/Dockerfile.linux.gen +42 -0
- package/builder/docker/README.md +36 -0
- package/builder/docker/app/start.sh +8 -0
- package/builder/docker/dockerignore +3 -0
- package/builder/docker/scripts/build.bat +11 -0
- package/builder/docker/scripts/build.sh +11 -0
- package/builder/docker/scripts/start-app.bat +7 -0
- package/builder/docker/scripts/start-app.sh +7 -0
- package/builder/docker/scripts/stop-app.bat +5 -0
- package/builder/docker/scripts/stop-app.sh +5 -0
- package/builder/docker-compose/docker-compose.gen.yaml +41 -0
- package/builder/docker-compose/env-skeleton +4 -0
- package/creator/project/.vscode/launch.json +59 -0
- package/creator/project/README.md +20 -0
- package/creator/project/gitignore +118 -0
- package/creator/project/npmignore +118 -0
- package/creator/public/api-test.hott +28 -0
- package/creator/public/index.hott +12 -0
- package/creator/ts/src/AppAPI.ts +30 -0
- package/creator/ts/src/HelloWorld.ts +39 -0
- package/creator/ts/src/WebExport.ts +7 -0
- package/creator/ts/tsconfig-web.json +73 -0
- package/creator/ts/tsconfig.json +73 -0
- package/creator/ts/webpack-api.config.js +57 -0
- package/dbstart.sh +19 -0
- package/dbstop.sh +4 -0
- package/docs/.nojekyll +1 -0
- package/docs/README.md +130 -0
- package/docs/classes/Hot.md +477 -0
- package/docs/classes/HotAPI.md +369 -0
- package/docs/classes/HotClient.md +95 -0
- package/docs/classes/HotComponent.md +279 -0
- package/docs/classes/HotDB.md +247 -0
- package/docs/classes/HotDBInflux.md +404 -0
- package/docs/classes/HotDBMigration.md +80 -0
- package/docs/classes/HotDBMySQL.md +310 -0
- package/docs/classes/HotDBSchema.md +51 -0
- package/docs/classes/HotFile.md +353 -0
- package/docs/classes/HotHTTPServer.md +700 -0
- package/docs/classes/HotLog.md +162 -0
- package/docs/classes/HotPage.md +357 -0
- package/docs/classes/HotRoute.md +312 -0
- package/docs/classes/HotRouteMethod.md +271 -0
- package/docs/classes/HotServer.md +311 -0
- package/docs/classes/HotStaq.md +1155 -0
- package/docs/classes/HotTestDestination.md +58 -0
- package/docs/classes/HotTestDriver.md +332 -0
- package/docs/classes/HotTestElement.md +88 -0
- package/docs/classes/HotTestElementOptions.md +71 -0
- package/docs/classes/HotTestMap.md +92 -0
- package/docs/classes/HotTestSeleniumDriver.md +542 -0
- package/docs/classes/HotTester.md +653 -0
- package/docs/classes/HotTesterAPI.md +493 -0
- package/docs/classes/HotTesterMocha.md +843 -0
- package/docs/classes/HotTesterMochaSelenium.md +896 -0
- package/docs/classes/HotTesterServer.md +633 -0
- package/docs/classes/InfluxSchema.md +74 -0
- package/docs/classes/MySQLSchema.md +199 -0
- package/docs/classes/MySQLSchemaField.md +330 -0
- package/docs/classes/MySQLSchemaTable.md +176 -0
- package/docs/enums/ConnectionStatus.md +43 -0
- package/docs/enums/DeveloperMode.md +38 -0
- package/docs/enums/EventExecutionType.md +43 -0
- package/docs/enums/HTTPMethod.md +32 -0
- package/docs/enums/HotDBGenerationType.md +30 -0
- package/docs/enums/HotLogLevel.md +88 -0
- package/docs/interfaces/HotDBConnectionInterface.md +116 -0
- package/docs/interfaces/HotDestination.md +62 -0
- package/docs/interfaces/HotSite.md +187 -0
- package/docs/interfaces/HotSiteMapPath.md +37 -0
- package/docs/interfaces/HotSiteRoute.md +79 -0
- package/docs/interfaces/HotStartOptions.md +115 -0
- package/docs/interfaces/HotTestPage.md +44 -0
- package/docs/interfaces/HotTestStop.md +62 -0
- package/docs/interfaces/IHotComponent.md +135 -0
- package/docs/interfaces/IHotStaq.md +118 -0
- package/docs/interfaces/IHotTestElement.md +54 -0
- package/docs/interfaces/IHotTestElementOptions.md +43 -0
- package/docs/interfaces/MySQLResults.md +43 -0
- package/docs/interfaces/MySQLSchemaFieldResult.md +75 -0
- package/docs/modules.md +182 -0
- package/package.json +65 -0
- package/selenium-start.sh +7 -0
- package/selenium-stop.sh +3 -0
- package/src/Hot.ts +319 -0
- package/src/HotAPI.ts +386 -0
- package/src/HotAgentAPI.ts +43 -0
- package/src/HotAgentRoute.ts +44 -0
- package/src/HotBuilder.ts +221 -0
- package/src/HotClient.ts +40 -0
- package/src/HotComponent.ts +158 -0
- package/src/HotCreator.ts +470 -0
- package/src/HotDB.ts +79 -0
- package/src/HotDBConnectionInterface.ts +40 -0
- package/src/HotFile.ts +617 -0
- package/src/HotGenerator.ts +446 -0
- package/src/HotHTTPServer.ts +954 -0
- package/src/HotIO.ts +160 -0
- package/src/HotLog.ts +158 -0
- package/src/HotPage.ts +206 -0
- package/src/HotRoute.ts +137 -0
- package/src/HotRouteMethod.ts +216 -0
- package/src/HotServer.ts +211 -0
- package/src/HotSetAsWeb.ts +3 -0
- package/src/HotStaq.ts +1881 -0
- package/src/HotTestDriver.ts +171 -0
- package/src/HotTestElement.ts +97 -0
- package/src/HotTestMap.ts +130 -0
- package/src/HotTestSeleniumDriver.ts +381 -0
- package/src/HotTester.ts +696 -0
- package/src/HotTesterAPI.ts +126 -0
- package/src/HotTesterMocha.ts +133 -0
- package/src/HotTesterMochaSelenium.ts +189 -0
- package/src/HotTesterServer.ts +551 -0
- package/src/api-web.ts +48 -0
- package/src/api.ts +103 -0
- package/src/cli.ts +1225 -0
- package/src/schemas/HotDBInflux.ts +211 -0
- package/src/schemas/HotDBMigration.ts +24 -0
- package/src/schemas/HotDBMySQL.ts +312 -0
- package/src/schemas/HotDBSchema.ts +21 -0
- package/src/schemas/influx/InfluxSchema.ts +19 -0
- package/src/schemas/mysql/MySQLSchema.ts +90 -0
- package/src/schemas/mysql/MySQLSchemaField.ts +408 -0
- package/src/schemas/mysql/MySQLSchemaTable.ts +353 -0
- package/temp/HotStaqWeb.ts +59 -0
- package/tsconfig-generator.json +17 -0
- package/tsconfig-web.json +74 -0
- package/tsconfig.json +73 -0
- package/webpack.config.generator.js +41 -0
- package/webpack.config.js +53 -0
- package/webpack.config.tests.js +56 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var HotStaqWeb=function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=16)}([function(module,exports,__webpack_require__){"use strict";(function(process){var __createBinding=this&&this.__createBinding||(Object.create?function(t,e,n,r){void 0===r&&(r=n),Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,r){void 0===r&&(r=n),t[r]=e[n]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),__importStar=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&__createBinding(e,t,n);return __setModuleDefault(e,t),e},__awaiter=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))},__importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.HotStaq=void 0;const fs=__importStar(__webpack_require__(4)),ppath=__importStar(__webpack_require__(4)),cross_fetch_1=__importDefault(__webpack_require__(2)),validate_npm_package_name_1=__importDefault(__webpack_require__(17)),HotPage_1=__webpack_require__(10),HotFile_1=__webpack_require__(5),HotLog_1=__webpack_require__(11),Hot_1=__webpack_require__(1),HotClient_1=__webpack_require__(12),HotTesterAPI_1=__webpack_require__(13),HotTestMap_1=__webpack_require__(15);var HotTesterMocha=null,HotTesterMochaSelenium=null,HotTestSeleniumDriver=null;class HotStaq{constructor(t={}){this.api=t.api||null,this.testerAPI=t.testerAPI||null,this.mode=t.mode||Hot_1.DeveloperMode.Production,this.pages=t.pages||{},this.components=t.components||{},this.files=t.files||{},this.hotSite=t.hotSite||null,this.apiContent="\n\t\t\tvar %api_name% = %api_exported_name%.%api_name%;\n\t\t\tvar newHotClient = new HotClient (processor);\n\t\t\tvar newapi = new %api_name% (%base_url%, newHotClient);\n\t\t\tnewHotClient.api = newapi;\n\t\t\tprocessor.api = newapi;",this.testerApiContent="\n\t\t\tvar HotTesterAPI = HotStaqWeb.HotTesterAPI;\n\t\t\tvar newHotTesterClient = new HotClient (processor);\n\t\t\tvar newtesterapi = new HotTesterAPI (%base_tester_url%, newHotTesterClient);\n\t\t\tnewHotTesterClient.testerAPI = newtesterapi;\n\t\t\tprocessor.testerAPI = newtesterapi;",this.pageContent='<!DOCTYPE html>\n<html>\n\n<head>\n\t<title>%title%</title>\n\n\t<script type = "text/javascript" src = "%hotstaq_js_src%"><\/script>\n\t<script type = "text/javascript">\n\t\twindow.HotStaq = HotStaqWeb.HotStaq;\n\t\twindow.HotClient = HotStaqWeb.HotClient;\n\t\twindow.HotAPI = HotStaqWeb.HotAPI;\n\t\twindow.Hot = HotStaqWeb.Hot;\n\t<\/script>\n\n%apis_to_load%\n\n\t<script type = "text/javascript">\n\t\tfunction hotstaq_startApp ()\n\t\t{\n\t\t\tlet tempMode = 0;\n\n\t\t\tif (window["Hot"] != null)\n\t\t\t\ttempMode = Hot.Mode;\n\n\t\t\t%load_hot_site%\n\n\t\t\tvar processor = new HotStaq ();\n\t\t\tvar promises = [];\n\t\t\t%developer_mode%\n\n\t\t\t%api_code%\n\n\t\t\t%public_secrets%\n\t\t\t%tester_api%\n\t\t\t%load_files%\n\n\t\t\tprocessor.mode = tempMode;\n\n\t\t\tPromise.all (promises).then (function ()\n\t\t\t\t{\n\t\t\t\t\tHotStaq.displayUrl ({\n\t\t\t\t\t\t\turl: "%url%",\n\t\t\t\t\t\t\tname: "%title%",\n\t\t\t\t\t\t\tprocessor: processor,\n\t\t\t\t\t\t\targs: %args%,\n\t\t\t\t\t\t\ttesterName: %tester_name%,\n\t\t\t\t\t\t\ttesterMap: %tester_map%,\n\t\t\t\t\t\t\ttesterAPIBaseUrl: %tester_api_base_url%,\n\t\t\t\t\t\t\ttesterLaunchpadUrl: %tester_launchpad_url%\n\t\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\n\t\thotstaq_startApp ();\n\t<\/script>\n</head>\n\n<body>\n</body>\n\n</html>',this.logger=new HotLog_1.HotLog(HotLog_1.HotLogLevel.None),this.publicSecrets={},this.testers={}}static parseBoolean(t){if("true"===(t=t.toLowerCase()))return!0;if("false"===t)return!1;if("yes"===t)return!0;if("no"===t)return!1;if("yep"===t)return!0;if("nah"===t)return!1;try{if(0!=parseInt(t))return!0}catch(t){}return!1}static getParam(t,e,n=!0,r=!0){let o=e[t];if(null==o&&!0===n&&!0===r)throw new Error(`Missing required parameter ${t}.`);if("string"==typeof o&&!0===n&&""===o&&!0===r)throw new Error(`Missing required parameter ${t}.`);return o}static getParamDefault(t,e,n){let r=e[t];return null==r||"string"==typeof r&&""===r?n:r}static wait(t){return __awaiter(this,void 0,void 0,(function*(){return yield new Promise((e,n)=>{setTimeout(()=>{e()},t)})}))}addPage(t){this.pages[t.name]=t}getPage(t){return this.pages[t]}addFile(t){let e=t.name;""===e&&(e=t.localFile),""===e&&(e=t.url),this.files[e]=t}getFile(t){if(null==this.files[t])throw new Error("Unable to find file "+t);return this.files[t]}addComponent(t){this.components[t.name]=t,this.registerComponent(t)}registerComponent(t){customElements.define(t.tag,class extends HTMLElement{constructor(){super(),(()=>{__awaiter(this,void 0,void 0,(function*(){this.onclick=t.click.bind(t);for(let e in t.events){let n=t.events[e];this.addEventListener(n.type,n.func,n.options)}if(t.htmlElement=yield t.onCreated(this),null!=t.handleAttributes)yield t.handleAttributes(this.attributes);else for(let e=0;e<this.attributes.length;e++){let n=this.attributes[e],r=n.name.toLowerCase(),o=n.value;"id"===r&&(t.name=o),"name"===r&&(t.name=o),"value"===r&&(t.value=o)}let e=yield t.output(),n=(new DOMParser).parseFromString(e,"text/html"),r=this.attachShadow({mode:"open"});for(let t=0;t<n.body.children.length;t++){let e=n.body.children[t];r.appendChild(e)}}))})()}},t.elementOptions)}getComponent(t){return this.components[t]}static addHtml(t,e){let n=null;if(n="string"==typeof t?document.querySelector(t):t,null==n)throw new Error(`Unable to find parent ${t}!`);let r=null;if("string"==typeof e){let t=(new DOMParser).parseFromString(e,"text/html"),r=[];for(let e=0;e<t.body.children.length;e++){let o=t.body.children[e];r.push(n.appendChild(o))}return r}return r=n.appendChild(e),r}static checkHotSiteName(t,e=!1){let n=(0,validate_npm_package_name_1.default)(t);return null!=n.errors&&n.errors.length>0&&(()=>{if(!0===e)throw new Error(`HotSite ${t} has an invalid name! The name cannot be empty and must have a valid NPM module name.`)})(),!0}static replaceKey(t,e,n){return t.replace(new RegExp(`\\$\\{${e}\\}`,"g"),n)}static getValueFromHotSiteObj(t,e){let n=null;if(null!=t){let r=t;for(let t=0;t<e.length;t++){let n=e[t];if(null==r[n]){r=null;break}r=r[n]}null!=r&&(n=r)}return n}loadHotSite(path){return __awaiter(this,void 0,void 0,(function*(){let jsonStr="";if(!0===HotStaq.isWeb){this.logger.info("Retrieving HotSite "+path);let t=yield(0,cross_fetch_1.default)(path);this.logger.info("Retrieved site "+path),jsonStr=t.text()}else path=ppath.normalize(path),this.logger.info("Retrieving HotSite "+path),jsonStr=yield new Promise((t,e)=>{fs.readFile(path,(e,n)=>{if(null!=e)throw e;let r=n.toString();this.logger.info("Retrieved site "+path),t(r)})});this.hotSite=JSON.parse(jsonStr),HotStaq.checkHotSiteName(this.hotSite.name,!0),this.hotSite.hotsitePath=path;let routes=this.hotSite.routes,testerUrl="http://127.0.0.1:8182",tester=null,driver=null;if(!1===HotStaq.isWeb&&this.mode===Hot_1.DeveloperMode.Development&&null!=this.hotSite.testing){let t=t=>{let e=!0;null!=t.createNewTester&&(e=t.createNewTester);let n="Tester";null!=t.tester&&(n=t.tester),null!=t.testerName&&(n=t.testerName),!0===e?(HotTesterMocha=__webpack_require__(!function(){var t=new Error("Cannot find module './HotTesterMocha'");throw t.code="MODULE_NOT_FOUND",t}()).HotTesterMocha,HotTesterMochaSelenium=__webpack_require__(!function(){var t=new Error("Cannot find module './HotTesterMochaSelenium'");throw t.code="MODULE_NOT_FOUND",t}()).HotTesterMochaSelenium,HotTestSeleniumDriver=__webpack_require__(!function(){var t=new Error("Cannot find module './HotTestSeleniumDriver'");throw t.code="MODULE_NOT_FOUND",t}()).HotTestSeleniumDriver,""===t.testerAPIUrl&&(testerUrl=t.testerAPIUrl),"HotTestSeleniumDriver"===t.driver&&(driver=new HotTestSeleniumDriver),"HotTesterMocha"===t.tester&&(tester=new HotTesterMocha(this,n,testerUrl,driver)),"HotTesterMochaSelenium"===t.tester&&(tester=new HotTesterMochaSelenium(this,n,testerUrl))):tester=this.testers[n]};null!=this.hotSite.testing.web&&t(this.hotSite.testing.web),null!=this.hotSite.testing.api&&t(this.hotSite.testing.api)}if(null!=routes)for(let t in routes){let e=routes[t],n=new HotFile_1.HotFile(e),r=new HotPage_1.HotPage({processor:this,name:e.name||"",route:t,files:[n]});if(null!=tester&&this.mode===Hot_1.DeveloperMode.Development){let t=e.name,n=null;if(null!=e.map){if("string"==typeof e.map){if(null==tester.testMaps[e.map])throw new Error(`Test map ${e.map} does not exist!`);tester.testMaps[t]=tester.testMaps[e.map]}else{n=new HotTestMap_1.HotTestMap;let t=null;if(e.map instanceof Array){t=[];for(let n=0;n<e.map.length;n++){let r=e.map[n];t.push(new HotTestMap_1.HotTestDestination(r))}}else{t={};for(let n in e.map){let r=e.map[n];t[n]=new HotTestMap_1.HotTestDestination(r)}}n.destinations=t}tester.testMaps[t]=n}null!=e.destinationOrder&&(tester.testMaps[t].destinationOrder=e.destinationOrder)}this.addPage(r)}if(null!=this.hotSite.apis)for(let t in this.hotSite.apis){let e=this.hotSite.apis[t];if(null!=e.map&&(!1===HotStaq.isWeb&&this.mode===Hot_1.DeveloperMode.Development)){let n=t,r=new HotTestMap_1.HotTestMap;r.destinations=[];for(let t=0;t<e.map.length;t++){let n=e.map[t];r.destinations.push(new HotTestMap_1.HotTestDestination(n))}if(null==tester)throw new Error("A tester was not created first! You must specify one in the CLI or in HotSite.json.");tester.testMaps[n]=r}}if(!0===HotStaq.isWeb)for(let key in this.hotSite.components){let component=this.hotSite.components[key],componentUrl=component.url,res=yield(0,cross_fetch_1.default)(componentUrl),newComponent=eval(res);this.addComponent(newComponent)}null==this.hotSite.routes&&(this.hotSite.routes={}),yield this.loadHotFiles(this.hotSite.files),null!=tester&&this.addTester(tester)}))}loadHotFiles(t,e=!1){return __awaiter(this,void 0,void 0,(function*(){for(let n in t){let r=t[n],o=null;o=(HotStaq.isWeb,new HotFile_1.HotFile({name:n})),null!=r.url&&(o.url=r.url),!1===HotStaq.isWeb&&null!=r.localFile&&(o.localFile=r.localFile);let s=!0;null!=r.content&&(o.content=r.content,s=!1),!0===e&&(s=!0),!0===s&&(yield o.load()),this.addFile(o)}}))}generateContent(t,e="",n="./",r="./js/HotStaq.js",o=!0,s=null){let i="",a="",l="";if(null!=this.hotSite){if(null!=this.hotSite.server.globalApi&&""!==this.hotSite.server.globalApi){const t=this.hotSite.apis[this.hotSite.server.globalApi];if(null==t)this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't exist!`);else{let e=!0;if(null==t.jsapi&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a jsapi set. Will not send js content to client.`)),null==t.libraryName&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a libraryName set. Will not send js content to client.`)),null==t.apiName&&(e=!1,this.logger.warning(`API with name ${this.hotSite.server.globalApi} doesn't have a apiName set. Will not send js content to client.`)),!0===e){i+=`\t<script type = "text/javascript" src = "${t.jsapi}"><\/script>\n`;let e='""';null!=this.api&&(e=`"${this.api.baseUrl}"`);let n=this.apiContent;n=n.replace(/\%api\_name\%/g,t.apiName),n=n.replace(/\%api\_exported\_name\%/g,t.libraryName),n=n.replace(/\%base\_url\%/g,e),a+=n}}}if(null!=this.hotSite.apis){let e=this.hotSite.routes[t];if(null!=e&&null!=e.api){let t=this.hotSite.apis[e.api];if(null==t)throw new Error("Unable to find API "+e.api);let n=!0;if(null==t.jsapi&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a jsapi set. Will not send js content to client.`)),null==t.libraryName&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a libraryName set. Will not send js content to client.`)),null==t.apiName&&(n=!1,this.logger.warning(`API with name ${e.api} doesn't have a apiName set. Will not send js content to client.`)),!0===n){let e=t.jsapi;i+=`\t<script type = "text/javascript" src = "${e}"><\/script>\n`;let n='""';null!=this.api&&(n=`"${this.api.baseUrl}"`);let r=this.apiContent;r=r.replace(/\%api\_name\%/g,t.apiName),r=r.replace(/\%api\_exported\_name\%/g,t.libraryName),r=r.replace(/\%base\_url\%/g,n),a+=r}}}if(null!=this.hotSite.server&&null!=this.hotSite.server.jsSrcPath&&(r=this.hotSite.server.jsSrcPath),null!=this.hotSite.publicSecrets)for(let t in this.hotSite.publicSecrets){let e=this.hotSite.publicSecrets[t],n=void 0;if("string"==typeof e)n=JSON.stringify(e);else if(!1===HotStaq.isWeb){if(null!=this.api){if(null==this.api.connection)throw new Error("Cannot pass secrets from the API if there's no connection!");let r=this.api.connection;null!=e.passSecretFromAPI&&(n=JSON.stringify(r.secrets[t]))}if(null!=e.env){const t=e.env;n=JSON.stringify(process.env[t])}}l+=`processor.publicSecrets["${t}"] = ${n};\n`}}let u=this.pageContent;return u=(u=>{let h="",c="";this.mode===Hot_1.DeveloperMode.Development&&(h="tempMode = HotStaqWeb.DeveloperMode.Development;",c=this.testerApiContent,null!=this.hotSite&&null!=this.hotSite.testing&&(null==this.hotSite.testing.web.testerAPIUrl&&(this.hotSite.testing.web.testerAPIUrl="http://127.0.0.1:8182"),c=c.replace(/\%base\_tester\_url\%/g,`"${this.hotSite.testing.web.testerAPIUrl}"`)));let p="";if(Object.keys(this.files).length>0){p+="var files = {};\n\n";for(let t in this.files){let e=this.files[t],n=`"${e.url}"`,r="";if(""!==e.content){let t=JSON.stringify(e.content);t=t.replace(new RegExp("\\<script","gmi"),'<scr" + "ipt'),t=t.replace(new RegExp("\\<\\/script","gmi"),'</scr" + "ipt'),r=', "content": '+t}p+=`\t\t\tfiles["${t}"] = { "url": ${n}${r} };\n`}p+="\t\t\tpromises.push (processor.loadHotFiles (files));\n"}u=u.replace(/\%title\%/g,e),!0===o&&(u=u.replace(/\%args\%/g,"Hot.Arguments")),null!=s&&(u=u.replace(/\%args\%/g,JSON.stringify(s)));let d=t,f="",m="",g="Tester";if(null!=this.hotSite&&(null!=this.hotSite.testing&&(null!=this.hotSite.testing.web.tester&&(g=this.hotSite.testing.web.tester),null!=this.hotSite.testing.web.testerName&&(g=this.hotSite.testing.web.testerName),null!=this.hotSite.testing.web.testerAPIUrl&&(f=this.hotSite.testing.web.testerAPIUrl),null!=this.hotSite.testing.web.launchpadUrl&&(m=this.hotSite.testing.web.launchpadUrl)),null!=this.hotSite.routes&&null!=this.hotSite.routes[t])){d=this.hotSite.routes[t].name}return u=(u=(u=(u=(u=(u=(u=(u=(u=(u=(u=(u=(u=u.replace(/\%hotstaq\_js\_src\%/g,r)).replace(/\%developer\_mode\%/g,h)).replace(/\%tester\_api\%/g,c)).replace(/\%apis\_to\_load\%/g,i)).replace(/\%load\_hot\_site\%/g,"")).replace(/\%load\_files\%/g,p)).replace(/\%api\_code\%/g,a)).replace(/\%public\_secrets\%/g,l)).replace(/\%url\%/g,n)).replace(/\%tester\_name\%/g,`"${g}"`)).replace(/\%tester\_map\%/g,`"${d}"`)).replace(/\%tester\_api\_base\_url\%/g,`"${f}"`)).replace(/\%tester\_launchpad\_url\%/g,`"${m}"`)})(u),u}createExpressRoutes(t,e="./js/HotStaq.js"){for(let n in this.pages){let r=this.pages[n];const o=this.generateContent(r.route,r.name,r.files[0].url,e);t.get(r.route,(t,e)=>{e.send(o)})}}addTester(t){this.testers[t.name]=t}getWebTestingMaps(){if(null==this.hotSite)throw new Error("No HotSite was loaded!");if(null==this.hotSite.testing)throw new Error("The HotSite does not have a testing object!");if(null==this.hotSite.testing.web)throw new Error("The HotSite does not have a testing web object!");if(null==this.hotSite.testing.web.maps)throw new Error("The HotSite testing object does not have any maps!");return this.hotSite.testing.web.maps}getAPITestingMaps(){if(null==this.hotSite)throw new Error("No HotSite was loaded!");if(null==this.hotSite.testing)throw new Error("The HotSite does not have a testing object!");if(null==this.hotSite.testing.api)throw new Error("The HotSite does not have a testing api object!");if(null==this.hotSite.testing.api.maps)throw new Error("The HotSite testing object does not have any maps!");return this.hotSite.testing.api.maps}getRouteKeyFromName(t){let e="";if(null!=this.hotSite&&null!=this.hotSite.routes)for(let n in this.hotSite.routes){if(this.hotSite.routes[n].name===t){e=n;break}}return e}getRouteFromName(t){let e=null,n=this.getRouteKeyFromName(t);return""!==n&&(e=this.hotSite.routes[n]),e}executeTests(t,e){return __awaiter(this,void 0,void 0,(function*(){let n=this.testers[t];if(null==n)throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);return n.execute(e)}))}executeAllWebTests(t){return __awaiter(this,void 0,void 0,(function*(){let e=this.getWebTestingMaps();if(null==this.testers[t])throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);for(let n=0;n<e.length;n++){let r=e[n];yield this.executeTests(t,r)}}))}executeAllAPITests(t){return __awaiter(this,void 0,void 0,(function*(){let e=this.getAPITestingMaps();if(null==this.testers[t])throw new Error(`Unable to execute tests. Tester ${t} does not exist!`);for(let n=0;n<e.length;n++){let r=e[n];yield this.executeTests(t,r)}}))}process(t,e=null){return __awaiter(this,void 0,void 0,(function*(){let n=this.getPage(t);return yield n.process(e)}))}static processLocalFile(t,e=t,n=null){return __awaiter(this,void 0,void 0,(function*(){let r=new HotStaq,o=new HotFile_1.HotFile({localFile:t});yield o.load();let s=new HotPage_1.HotPage({processor:r,name:e,files:[o]});return r.addPage(s),yield r.process(e,n)}))}static processUrl(t){return __awaiter(this,void 0,void 0,(function*(){let e=new HotFile_1.HotFile({url:t.url});yield e.load();let n=new HotPage_1.HotPage({processor:t.processor,name:t.name,files:[e],testerName:t.testerName,testerMap:t.testerMap});return t.processor.addPage(n),yield t.processor.process(t.name,t.args)}))}static processContent(t,e,n,r=null){return __awaiter(this,void 0,void 0,(function*(){let o=new HotFile_1.HotFile({content:e});yield o.load();let s=new HotPage_1.HotPage({processor:t,name:n,files:[o]});return t.addPage(s),yield t.process(n,r)}))}static onReady(t){"complete"===document.readyState||"interactive"===document.readyState?t():window.addEventListener("load",t)}static useOutput(t){document.open(),document.write(t),document.close()}static waitForTesters(){return __awaiter(this,void 0,void 0,(function*(){for(;!1===HotStaq.isReadyForTesting;)yield HotStaq.wait(10);null!=HotStaq.onReadyForTesting&&(yield HotStaq.onReadyForTesting())}))}static displayUrl(t,e=null,n=null,r=null){return __awaiter(this,void 0,void 0,(function*(){return new Promise((o,s)=>{HotStaq.onReady(()=>__awaiter(this,void 0,void 0,(function*(){let s={url:""};if(s.name=null==e?"string"==typeof t?t:t.name:e,""===s.name&&(s.name="string"==typeof t?t:t.name),"string"==typeof t?s.url=t:(s.url=t.url,null==n&&null!=t.processor&&(n=t.processor),null==r&&null!=t.args&&(r=t.args),null!=t.testerMap&&(s.testerMap=t.testerMap),null!=t.testerName&&(s.testerName=t.testerName),null!=t.testerAPIBaseUrl&&(s.testerAPIBaseUrl=t.testerAPIBaseUrl)),null==n&&(n=new HotStaq),n.mode===Hot_1.DeveloperMode.Development&&null==n.testerAPI){null==s.testerAPIBaseUrl&&(s.testerAPIBaseUrl=""),""===s.testerAPIBaseUrl&&(s.testerAPIBaseUrl="http://127.0.0.1:8182");let t=new HotClient_1.HotClient(n),e=new HotTesterAPI_1.HotTesterAPI(s.testerAPIBaseUrl,t);e.connection.api=e,n.testerAPI=e}s.processor=n,s.args=r;let i=yield HotStaq.processUrl(s);n.mode===Hot_1.DeveloperMode.Development&&(i+='<script type = "text/javascript">\n\tfunction hotstaq_isDocumentReady ()\n\t{\n\t\tif (window["Hot"] != null)\n\t\t{\n\t\t\tif (Hot.Mode === HotStaqWeb.DeveloperMode.Development)\n\t\t\t{\n\t\t\t\tlet func = function ()\n\t\t\t\t\t{\n\t\t\t\t\t\tif (Hot.TesterAPI != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlet testPaths = {};\n\t\t\t\t\t\t\tlet testElements = JSON.stringify (Hot.CurrentPage.testElements);\n\t\t\t\t\t\t\tlet testMaps = JSON.stringify (Hot.CurrentPage.testMaps);\n\n\t\t\t\t\t\t\tfor (let key in Hot.CurrentPage.testPaths)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlet testPath = Hot.CurrentPage.testPaths[key];\n\n\t\t\t\t\t\t\t\ttestPaths[key] = testPath.toString ();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlet testPathsStr = JSON.stringify (testPaths);\n\n\t\t\t\t\t\t\tHot.TesterAPI.tester.pageLoaded ({\n\t\t\t\t\t\t\t\t\ttesterName: Hot.CurrentPage.testerName,\n\t\t\t\t\t\t\t\t\ttesterMap: Hot.CurrentPage.testerMap,\n\t\t\t\t\t\t\t\t\tpageName: Hot.CurrentPage.name,\n\t\t\t\t\t\t\t\t\ttestElements: testElements,\n\t\t\t\t\t\t\t\t\ttestPaths: testPathsStr\n\t\t\t\t\t\t\t\t}).then (function (resp)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tif (resp.error != null)\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tif (resp.error !== "")\n\t\t\t\t\t\t\t\t\t\t\t\tthrow new Error (resp.error);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tHotStaqWeb.HotStaq.isReadyForTesting = true;\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\tif ((document.readyState === "complete") || (document.readyState === "interactive"))\n\t\t\t\t\tfunc ();\n\t\t\t\telse\n\t\t\t\t\tdocument.addEventListener ("DOMContentLoaded", func);\n\t\t\t}\n\t\t}\n\t}\n\n\thotstaq_isDocumentReady ();\n<\/script>'),HotStaq.useOutput(i),o(n)})))})}))}static displayContent(t,e,n=null){return __awaiter(this,void 0,void 0,(function*(){return new Promise((r,o)=>{HotStaq.onReady(()=>__awaiter(this,void 0,void 0,(function*(){null==n&&(n=new HotStaq);let o=yield HotStaq.processContent(n,t,e);HotStaq.useOutput(o),r(n)})))})}))}}exports.HotStaq=HotStaq,HotStaq.isWeb=!1,HotStaq.isReadyForTesting=!1,HotStaq.onReadyForTesting=null}).call(this,__webpack_require__(9))},function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))},o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Hot=e.DeveloperMode=void 0;const s=n(5),i=n(0),a=n(6),l=o(n(19)),u=o(n(2));var h;!function(t){t[t.Production=0]="Production",t[t.Development=1]="Development"}(h=e.DeveloperMode||(e.DeveloperMode={}));class c{static include(t,e=null){return r(this,void 0,void 0,(function*(){if(!0===i.HotStaq.isWeb&&"string"==typeof t){const e=t.toLowerCase();e.indexOf(".hott")>-1&&e.indexOf("nahfam")<0&&(t+="?hpserve=nahfam")}c.echo(yield c.getFile(t,e))}))}static runFile(t,e=null){return r(this,void 0,void 0,(function*(){let n=c.CurrentPage.processor.getFile(t);n.page=this.CurrentPage;let r=yield n.process(e);c.echo(r)}))}static getFile(t,e=null){return r(this,void 0,void 0,(function*(){let n=null;return"string"==typeof t?(n=new s.HotFile,!0===i.HotStaq.isWeb?n.url=t:n.localFile=t):n=t,yield n.load(),n.page=this.CurrentPage,yield n.process(e)}))}static apiCall(t,e=null,n="POST"){return r(this,void 0,void 0,(function*(){let r=null;if(null==c.CurrentPage)throw new Error("Current page is null!");if(null==c.CurrentPage.processor)throw new Error("Current page's processor is null!");if(null==c.CurrentPage.processor.api)throw new Error("Current page's processor api is null!");return null!=c.CurrentPage.processor.api&&(r=yield c.CurrentPage.processor.api.makeCall(t,e,n)),r}))}static jsonRequest(t,e=null,n="POST"){return r(this,void 0,void 0,(function*(){try{let r=yield(0,u.default)(t,{method:n,headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(e)});if(!1===r.ok)throw new Error(`${r.status}: ${r.statusText}`);return yield r.json()}catch(e){return JSON.stringify({error:`${e.message} - Could not fetch ${t}`})}}))}static httpRequest(t,e){return r(this,void 0,void 0,(function*(){return yield(0,u.default)(t,e)}))}static echo(t){c.Output+=t}static displayCSS(){for(let t=0;t<c.CSS.length;t++){let e=c.CSS[t],n=c.cssStr;n=n.replace(/\%CSS_FILE\%/g,e),c.echo(n)}}static displayJSFiles(){for(let t=0;t<c.JSFiles.length;t++){let e=c.JSFiles[t],n=c.jsFileStr;n=n.replace(/\%JS_FILE\%/g,e),c.echo(n)}}static displayJSScripts(){for(let t=0;t<c.JSScripts.length;t++){let e=c.JSScripts[t],n=c.jsScriptsStr;n=n.replace(/\%JS_CODE\%/g,e),c.echo(n)}}}e.Hot=c,c.CurrentPage=null,c.Arguments=null,c.DeveloperMode=h,c.HotTestElement=a.HotTestElement,c.Mode=h.Production,c.API=null,c.TesterAPI=null,c.Output="",c.Data={},c.Cookies=l.default,c.PublicSecrets={},c.cssStr='<link rel = "stylesheet" href = "%CSS_FILE%" />',c.CSS=[],c.JSFiles=[],c.JSScripts=[],c.jsFileStr='<script type = "text/javascript" src = "%JS_FILE%"><\/script>',c.jsScriptsStr='<script type = "text/javascript">%JS_CODE%<\/script>'},function(t,e){var n="undefined"!=typeof self?self:this,r=function(){function t(){this.fetch=!1,this.DOMException=n.DOMException}return t.prototype=n,new t}();!function(t){!function(e){var n="URLSearchParams"in t,r="Symbol"in t&&"iterator"in Symbol,o="FileReader"in t&&"Blob"in t&&function(){try{return new Blob,!0}catch(t){return!1}}(),s="FormData"in t,i="ArrayBuffer"in t;if(i)var a=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],l=ArrayBuffer.isView||function(t){return t&&a.indexOf(Object.prototype.toString.call(t))>-1};function u(t){if("string"!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(t))throw new TypeError("Invalid character in header field name");return t.toLowerCase()}function h(t){return"string"!=typeof t&&(t=String(t)),t}function c(t){var e={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return r&&(e[Symbol.iterator]=function(){return e}),e}function p(t){this.map={},t instanceof p?t.forEach((function(t,e){this.append(e,t)}),this):Array.isArray(t)?t.forEach((function(t){this.append(t[0],t[1])}),this):t&&Object.getOwnPropertyNames(t).forEach((function(e){this.append(e,t[e])}),this)}function d(t){if(t.bodyUsed)return Promise.reject(new TypeError("Already read"));t.bodyUsed=!0}function f(t){return new Promise((function(e,n){t.onload=function(){e(t.result)},t.onerror=function(){n(t.error)}}))}function m(t){var e=new FileReader,n=f(e);return e.readAsArrayBuffer(t),n}function g(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t)),e.buffer}function v(){return this.bodyUsed=!1,this._initBody=function(t){var e;this._bodyInit=t,t?"string"==typeof t?this._bodyText=t:o&&Blob.prototype.isPrototypeOf(t)?this._bodyBlob=t:s&&FormData.prototype.isPrototypeOf(t)?this._bodyFormData=t:n&&URLSearchParams.prototype.isPrototypeOf(t)?this._bodyText=t.toString():i&&o&&((e=t)&&DataView.prototype.isPrototypeOf(e))?(this._bodyArrayBuffer=g(t.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):i&&(ArrayBuffer.prototype.isPrototypeOf(t)||l(t))?this._bodyArrayBuffer=g(t):this._bodyText=t=Object.prototype.toString.call(t):this._bodyText="",this.headers.get("content-type")||("string"==typeof t?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):n&&URLSearchParams.prototype.isPrototypeOf(t)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},o&&(this.blob=function(){var t=d(this);if(t)return t;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?d(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(m)}),this.text=function(){var t,e,n,r=d(this);if(r)return r;if(this._bodyBlob)return t=this._bodyBlob,e=new FileReader,n=f(e),e.readAsText(t),n;if(this._bodyArrayBuffer)return Promise.resolve(function(t){for(var e=new Uint8Array(t),n=new Array(e.length),r=0;r<e.length;r++)n[r]=String.fromCharCode(e[r]);return n.join("")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},s&&(this.formData=function(){return this.text().then(_)}),this.json=function(){return this.text().then(JSON.parse)},this}p.prototype.append=function(t,e){t=u(t),e=h(e);var n=this.map[t];this.map[t]=n?n+", "+e:e},p.prototype.delete=function(t){delete this.map[u(t)]},p.prototype.get=function(t){return t=u(t),this.has(t)?this.map[t]:null},p.prototype.has=function(t){return this.map.hasOwnProperty(u(t))},p.prototype.set=function(t,e){this.map[u(t)]=h(e)},p.prototype.forEach=function(t,e){for(var n in this.map)this.map.hasOwnProperty(n)&&t.call(e,this.map[n],n,this)},p.prototype.keys=function(){var t=[];return this.forEach((function(e,n){t.push(n)})),c(t)},p.prototype.values=function(){var t=[];return this.forEach((function(e){t.push(e)})),c(t)},p.prototype.entries=function(){var t=[];return this.forEach((function(e,n){t.push([n,e])})),c(t)},r&&(p.prototype[Symbol.iterator]=p.prototype.entries);var y=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];function w(t,e){var n,r,o=(e=e||{}).body;if(t instanceof w){if(t.bodyUsed)throw new TypeError("Already read");this.url=t.url,this.credentials=t.credentials,e.headers||(this.headers=new p(t.headers)),this.method=t.method,this.mode=t.mode,this.signal=t.signal,o||null==t._bodyInit||(o=t._bodyInit,t.bodyUsed=!0)}else this.url=String(t);if(this.credentials=e.credentials||this.credentials||"same-origin",!e.headers&&this.headers||(this.headers=new p(e.headers)),this.method=(n=e.method||this.method||"GET",r=n.toUpperCase(),y.indexOf(r)>-1?r:n),this.mode=e.mode||this.mode||null,this.signal=e.signal||this.signal,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&o)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(o)}function _(t){var e=new FormData;return t.trim().split("&").forEach((function(t){if(t){var n=t.split("="),r=n.shift().replace(/\+/g," "),o=n.join("=").replace(/\+/g," ");e.append(decodeURIComponent(r),decodeURIComponent(o))}})),e}function b(t,e){e||(e={}),this.type="default",this.status=void 0===e.status?200:e.status,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in e?e.statusText:"OK",this.headers=new p(e.headers),this.url=e.url||"",this._initBody(t)}w.prototype.clone=function(){return new w(this,{body:this._bodyInit})},v.call(w.prototype),v.call(b.prototype),b.prototype.clone=function(){return new b(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new p(this.headers),url:this.url})},b.error=function(){var t=new b(null,{status:0,statusText:""});return t.type="error",t};var H=[301,302,303,307,308];b.redirect=function(t,e){if(-1===H.indexOf(e))throw new RangeError("Invalid status code");return new b(null,{status:e,headers:{location:t}})},e.DOMException=t.DOMException;try{new e.DOMException}catch(t){e.DOMException=function(t,e){this.message=t,this.name=e;var n=Error(t);this.stack=n.stack},e.DOMException.prototype=Object.create(Error.prototype),e.DOMException.prototype.constructor=e.DOMException}function S(t,n){return new Promise((function(r,s){var i=new w(t,n);if(i.signal&&i.signal.aborted)return s(new e.DOMException("Aborted","AbortError"));var a=new XMLHttpRequest;function l(){a.abort()}a.onload=function(){var t,e,n={status:a.status,statusText:a.statusText,headers:(t=a.getAllResponseHeaders()||"",e=new p,t.replace(/\r?\n[\t ]+/g," ").split(/\r?\n/).forEach((function(t){var n=t.split(":"),r=n.shift().trim();if(r){var o=n.join(":").trim();e.append(r,o)}})),e)};n.url="responseURL"in a?a.responseURL:n.headers.get("X-Request-URL");var o="response"in a?a.response:a.responseText;r(new b(o,n))},a.onerror=function(){s(new TypeError("Network request failed"))},a.ontimeout=function(){s(new TypeError("Network request failed"))},a.onabort=function(){s(new e.DOMException("Aborted","AbortError"))},a.open(i.method,i.url,!0),"include"===i.credentials?a.withCredentials=!0:"omit"===i.credentials&&(a.withCredentials=!1),"responseType"in a&&o&&(a.responseType="blob"),i.headers.forEach((function(t,e){a.setRequestHeader(e,t)})),i.signal&&(i.signal.addEventListener("abort",l),a.onreadystatechange=function(){4===a.readyState&&i.signal.removeEventListener("abort",l)}),a.send(void 0===i._bodyInit?null:i._bodyInit)}))}S.polyfill=!0,t.fetch||(t.fetch=S,t.Headers=p,t.Request=w,t.Response=b),e.Headers=p,e.Request=w,e.Response=b,e.fetch=S,Object.defineProperty(e,"__esModule",{value:!0})}({})}(r),r.fetch.ponyfill=!0,delete r.fetch.polyfill;var o=r;(e=o.fetch).default=o.fetch,e.fetch=o.fetch,e.Headers=o.Headers,e.Request=o.Request,e.Response=o.Response,t.exports=e},function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotServer=e.HotServerType=void 0;const o=n(0);var s;!function(t){t[t.HTTP=0]="HTTP",t[t.WebSockets=1]="WebSockets"}(s=e.HotServerType||(e.HotServerType={}));e.HotServer=class{constructor(t){t instanceof o.HotStaq?(this.processor=t,this.serverType="Server",this.api=null,this.listenAddress="0.0.0.0",this.ports={http:80,https:443},this.ssl={cert:"",key:"",ca:""},this.redirectHTTPtoHTTPS=!0,this.type=s.HTTP,this.logger=t.logger,this.secrets={}):(this.processor=t.processor,this.serverType=t.serverType||"Server",this.api=t.api||null,this.listenAddress=t.listenAddress||"0.0.0.0",this.ports=t.ports||{http:80,https:443},this.ssl=t.ssl||{cert:"",key:"",ca:""},this.redirectHTTPtoHTTPS=null==t.redirectHTTPtoHTTPS||t.redirectHTTPtoHTTPS,this.type=t.type||s.HTTP,this.logger=t.logger,this.secrets=t.secrets||{})}setAPI(t){return r(this,void 0,void 0,(function*(){this.processor.api=t,this.api=t}))}}},function(t,e){},function(t,e,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(t,e,n,r){void 0===r&&(r=n),Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,r){void 0===r&&(r=n),t[r]=e[n]}),o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),s=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&r(e,t,n);return o(e,t),e},i=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))},a=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.HotFile=void 0;const l=s(n(4)),u=a(n(2)),h=n(1);class c{constructor(t={}){this.page=t.page||null,this.name=t.name||"",this.url=t.url||"",this.localFile=t.localFile||"",this.content=t.content||"",this.throwAllErrors=t.throwAllErrors||!1}setContent(t){this.content=t}getContent(){return this.content}static httpGet(t){return i(this,void 0,void 0,(function*(){try{let e=yield(0,u.default)(t);if(!1===e.ok)throw new Error(`${e.status}: ${e.statusText}`);return yield e.text()}catch(e){return JSON.stringify({error:`${e.message} - Could not fetch ${t}`})}}))}loadUrl(){return i(this,void 0,void 0,(function*(){return this.content=yield c.httpGet(this.url),this.content}))}loadLocalFile(){return i(this,void 0,void 0,(function*(){return new Promise((t,e)=>{l.readFile(this.localFile,(e,n)=>{if(null!=e)throw e;let r=n.toString();this.content=r,t(this.content)})})}))}load(){return i(this,void 0,void 0,(function*(){let t="";return""!==this.url&&(t=yield this.loadUrl()),""!==this.localFile&&(t=yield this.loadLocalFile()),t}))}static processContent(t,e,n,r,o=2,s=2){let i=e.exec(t),a=0,l="";for(;null!=i;){let u=i.index-o,h=e.lastIndex+s,c=t.substr(a,u-a);a=h,l+=r(c),l+=n(i[0]),i=e.exec(t)}return l+=r(t.substr(a)),l}static processNestedContent(t,e,n,r,o,s,i=2,a=1){let l=t.indexOf(e),u=0,h=t.indexOf(r,l),c="";for(;l>-1;){let p=t.indexOf(n,l),d=0;if(""!==r){let e=t.lastIndexOf(r,p-a);for(;e>-1&&e!==h;)e=t.lastIndexOf(r,e-a),d++}if(d>0){let r=t.indexOf(n,p+a),o=r;for(;r>-1&&d>0&&!(o<0);){if(t.lastIndexOf(e,o-a)>r)break;r=o,o=t.indexOf(n,r+a),d--}p=r}c+=s(t.substr(u,l-u)),c+=o(t.substr(l+i,p-(l+i))),l=t.indexOf(e,p+a),h=t.indexOf(r,l),u=p+a}return c+=s(t.substr(u)),c}process(t=null){return i(this,void 0,void 0,(function*(){let e="",n=this.content;h.Hot.Mode=this.page.processor.mode,h.Hot.Arguments=t,h.Hot.CurrentPage=this.page,h.Hot.PublicSecrets=this.page.processor.publicSecrets,h.Hot.API=this.page.getAPI(),h.Hot.TesterAPI=this.page.getTesterAPI(),e=c.processContent(n,new RegExp("(?=\\<\\*)([\\s\\S]*?)(?=\\*\\>)","g"),t=>""+(t=t.substr(2)),t=>{if(""===t)return"";let e=c.processNestedContent(t,"!{","}","{",t=>`*&&%*%@#@!${t}*&!#%@!@*!`,t=>t),n=c.processNestedContent(e,"STR{","}","{",t=>`*&&%*%@#@!echoOutput (JSON.stringify(${t}), ${this.throwAllErrors});*&!#%@!@*!`,t=>t,4,1),r=c.processNestedContent(n,"${","}","{",t=>{let e=`*&&%*%@#@!try { Hot.echo (${t}); }catch (ex){Hot.echo ("");}*&!#%@!@*!`;return!0===this.throwAllErrors&&(e=`*&&%*%@#@!Hot.echo (${t});*&!#%@!@*!`),e},t=>t),o="";h.Hot.Mode===h.DeveloperMode.Production&&(o=c.processNestedContent(r,"?(",")","(",t=>"",t=>t)),h.Hot.Mode===h.DeveloperMode.Development&&(o=c.processNestedContent(r,"?(",")","(",t=>{let e="";try{JSON.parse(t),e=JSON.stringify(t)}catch(n){e=""+t}return`*&&%*%@#@!{\nconst testElm = createTestElement (${e});\nHot.echo (\`data-test-object-name = "\${testElm.name}" data-test-object-func = "\${testElm.func}" data-test-object-value = "\${testElm.value}"\`);\n}*&!#%@!@*!\n`},t=>t));let s=c.processNestedContent(o,"*&&%*%@#@!","*&!#%@!@*!","*&&%*%@#@!",t=>t,t=>`echoOutput (${JSON.stringify(t)}, ${this.throwAllErrors});\n`,"*&&%*%@#@!".length,"*&!#%@!@*!".length);return s=s.replace(/\*\&\&\%\*\%\@\#\@\!/g,""),s=s.replace(/\*\&\!\#\%\@\!\@\*\!/g,""),s},0);let r=null;try{let n="\n\t\t\tvar Hot = arguments[0];\n\t\t\tvar PassedHotFile = arguments[1];\n\n\t\t\t";if("string"==typeof t)throw new Error("The passing arguments cannot be a string!");for(let e in t){let r="",o=t[e];r=`var ${e} = ${JSON.stringify(o)};\n`,n+=r}let o=this.name;""===o&&(o=this.localFile),""===o&&(o=this.url),n+='\n\n\t\t\tfunction echoOutput (content, throwErrors)\n\t\t\t{\n\t\t\t\tif (throwErrors == null)\n\t\t\t\t\tthrowErrors = true;\n\n\t\t\t\tif (throwErrors === true)\n\t\t\t\t{\n\t\t\t\t\tHot.echo (content);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tHot.echo (content);\n\t\t\t\t}\n\t\t\t\tcatch (ex)\n\t\t\t\t{\n\t\t\t\t\tHot.echo ("");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction createTestElement (foundStr)\n\t\t\t{\n\t\t\t\tlet testElm = null;\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tlet obj = foundStr;\n\n\t\t\t\t\tif (typeof (foundStr) === "string")\n\t\t\t\t\t\tobj = JSON.parse (foundStr);\n\n\t\t\t\t\tif (typeof (obj) === "string")\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj);\n\n\t\t\t\t\tif (obj instanceof Array)\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj[0], obj[1], obj[2]);\n\n\t\t\t\t\tif (obj["name"] != null)\n\t\t\t\t\t\ttestElm = new Hot.HotTestElement (obj);\n\n\t\t\t\t\tif (Hot.CurrentPage.testElements[testElm.name] != null)\n\t\t\t\t\t\tthrow new Error (`Test element ${testElm.name} already exists!`);\n\n\t\t\t\t\tHot.CurrentPage.addTestElement (testElm);\n\t\t\t\t}\n\t\t\t\tcatch (ex)\n\t\t\t\t{\n\t\t\t\t\tthrow new Error (\n\t\t\t`Error processing test element ${foundStr} in ${Hot.CurrentPage.name}. Error: ${ex.message}`\n\t\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn (testElm);\n\t\t\t}\n\n\t\t\tasync function runContent (CurrentHotFile)\n\t\t\t{\n',n+=e,n+="\n\t\t\t}\n\n\t\t\treturn (runContent (PassedHotFile).then (() =>\n\t\t\t{\n\t\t\t\treturn ({\n\t\t\t\t\t\thot: Hot,\n\t\t\t\t\t\toutput: Hot.Output,\n\t\t\t\t\t\tdata: JSON.stringify (Hot.Data)\n\t\t\t\t\t});\n\t\t\t}));";let s=new Function(n);r=yield s.apply(this,[h.Hot,this])}catch(t){throw SyntaxError,t}h.Hot.Data=r.hot.Data;let o=r.output;return h.Hot.Output="",o}))}}e.HotFile=c},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestElement=e.HotTestElementOptions=void 0;e.HotTestElementOptions=class{constructor(t={}){this.mustBeVisible=t.mustBeVisible||!0,this.ignoreMissingElementError=t.ignoreMissingElementError||!1}};e.HotTestElement=class{constructor(t,e="",n=null){"string"==typeof t?(this.name=t,this.func=e,this.value=n):(this.name=t.name,this.func=t.func||e,this.value=t.value||n)}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotRoute=void 0;const r=n(8);class o{constructor(t,e,n=[]){this.onPreRegister=null,this.onRegister=null,this.onPostRegister=null,this.onAuthorizeUser=null,this.connection=t,this.logger=null,null!=this.connection&&null!=this.connection.processor&&(this.logger=this.connection.processor.logger),this.route=e,this.version="v1",this.prefix="",this.authCredentials=null,this.methods=n,this.errors={not_authorized:o.createError("Not authorized.")}}static createError(t){return{error:t}}addMethod(t,e=null,n=r.HTTPMethod.POST,o=null){"string"==typeof t&&(t=new r.HotRouteMethod(this,t,e,n,null,null,null,o)),this.methods.push(t)}getMethod(t){let e=null;for(let n=0;n<this.methods.length;n++){let r=this.methods[n];if(r.name===t){e=r;break}}return e}}e.HotRoute=o},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotRouteMethod=e.HTTPMethod=void 0;const r=n(1),o=n(3);var s;!function(t){t.GET="get",t.POST="post"}(s=e.HTTPMethod||(e.HTTPMethod={}));e.HotRouteMethod=class{constructor(t,e,n=null,i=s.POST,a=null,l=null,u=null,h=null){if(this.parentRoute=t,this.name=e,this.type=i,this.isRegistered=!1,this.executeSetup=!1,this.authCredentials=u,this.onServerAuthorize=a,this.onRegister=l,this.testCases={},this.parentRoute.connection.processor.mode===r.DeveloperMode.Development&&null!=h)for(let t=0;t<h.length;t++){let e=h[t];if("string"==typeof e){const n=e,r=h[t+1];this.addTestCase(n,r),t++}else this.addTestCase(e)}this.parentRoute.connection instanceof o.HotServer&&(this.onServerExecute=n)}addTestCase(t,e=null){if("string"==typeof t){const n=t,r=e;return void(this.testCases[n]={name:n,func:r})}if("function"==typeof t){const e=Object.keys(this.testCases).length,n=`${this.parentRoute.route}/${this.name} test case ${e}`,r=t;return void(this.testCases[n]={name:n,func:r})}const n=t;this.testCases[n.name]=n}}},function(t,e){var n,r,o=t.exports={};function s(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function a(t){if(n===setTimeout)return setTimeout(t,0);if((n===s||!n)&&setTimeout)return n=setTimeout,setTimeout(t,0);try{return n(t,0)}catch(e){try{return n.call(null,t,0)}catch(e){return n.call(this,t,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:s}catch(t){n=s}try{r="function"==typeof clearTimeout?clearTimeout:i}catch(t){r=i}}();var l,u=[],h=!1,c=-1;function p(){h&&l&&(h=!1,l.length?u=l.concat(u):c=-1,u.length&&d())}function d(){if(!h){var t=a(p);h=!0;for(var e=u.length;e;){for(l=u,u=[];++c<e;)l&&l[c].run();c=-1,e=u.length}l=null,h=!1,function(t){if(r===clearTimeout)return clearTimeout(t);if((r===i||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(t);try{r(t)}catch(e){try{return r.call(null,t)}catch(e){return r.call(this,t)}}}(t)}}function f(t,e){this.fun=t,this.array=e}function m(){}o.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)e[n-1]=arguments[n];u.push(new f(t,e)),1!==u.length||h||a(d)},f.prototype.run=function(){this.fun.apply(null,this.array)},o.title="browser",o.browser=!0,o.env={},o.argv=[],o.version="",o.versions={},o.on=m,o.addListener=m,o.once=m,o.off=m,o.removeListener=m,o.removeAllListeners=m,o.emit=m,o.prependListener=m,o.prependOnceListener=m,o.listeners=function(t){return[]},o.binding=function(t){throw new Error("process.binding is not supported")},o.cwd=function(){return"/"},o.chdir=function(t){throw new Error("process.chdir is not supported")},o.umask=function(){return 0}},function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotPage=void 0;const o=n(1),s=n(0);e.HotPage=class{constructor(t){t instanceof s.HotStaq?(this.processor=t,this.name="",this.testerName="",this.testerMap="",this.route="",this.files=[],this.testElements={},this.testPaths={}):(this.processor=t.processor,this.name=t.name||"",this.testerName=t.testerName||"",this.testerMap=t.testerMap||"",this.route=t.route||"",this.files=t.files||[],this.testElements=t.testElements||{},this.testPaths=t.testPaths||{})}addFile(t){return r(this,void 0,void 0,(function*(){t.page=this,this.files.push(t)}))}getAPI(){return this.processor.api}getTesterAPI(){return this.processor.testerAPI}load(t){return r(this,void 0,void 0,(function*(){for(let t=0;t<this.files.length;t++){let e=this.files[t];yield e.load()}}))}process(t=null){return r(this,void 0,void 0,(function*(){let e="";for(let n=0;n<this.files.length;n++){let r=this.files[n];o.Hot.Output="",r.page=this,e+=(yield r.process(t))}return e}))}addTestElement(t){if(null!=this.testElements[t.name])throw new Error(`Test element ${t.name} already exists!`);this.testElements[t.name]=t}getTestElement(t){if(null==this.testElements[t])throw new Error(`Test element ${t} doest not exist!`);return this.testElements[t]}createTestPath(t,e){if(null!=this.testPaths[t])throw new Error(`Test path ${t} already exists!`);this.testPaths[t]=e}}},function(t,e,n){"use strict";var r;Object.defineProperty(e,"__esModule",{value:!0}),e.HotLog=e.HotLogLevel=void 0,function(t){t[t.Info=0]="Info",t[t.Warning=1]="Warning",t[t.Error=2]="Error",t[t.Verbose=3]="Verbose",t[t.All=4]="All",t[t.None=5]="None"}(r=e.HotLogLevel||(e.HotLogLevel={}));e.HotLog=class{constructor(t=r.All){this.logLevel=t}log(t,e){this.logLevel===r.Verbose&&(t===r.Error&&this.error(e),t===r.Warning&&this.warning(e),t!==r.Info&&t!==r.Verbose||this.info(e)),this.logLevel===r.All&&(t===r.Error&&this.error(e),t===r.Warning&&this.warning(e),t===r.Info&&this.info(e)),this.logLevel===r.Error&&t===r.Error&&this.error(e),this.logLevel===r.Warning&&t===r.Warning&&this.warning(e),this.logLevel===r.Info&&t===r.Info&&this.info(e)}verbose(t){this.logLevel===r.Verbose&&console.info(t)}info(t){this.logLevel!==r.All&&this.logLevel!==r.Verbose&&this.logLevel!==r.Info||console.info(t)}warning(t){this.logLevel!==r.All&&this.logLevel!==r.Verbose&&this.logLevel!==r.Warning||console.warn(t)}error(t){if(this.logLevel===r.All||this.logLevel===r.Verbose||this.logLevel===r.Error){let e="";"string"==typeof t?e=t:(null!=t.message&&(e=t.message),null!=t.stack&&(e=t.stack)),console.error(e)}}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotClient=void 0;const r=n(3);e.HotClient=class{constructor(t){this.processor=t,this.api=null,this.testerAPI=null,this.type=r.HotServerType.HTTP,this.logger=t.logger}}},function(module,exports,__webpack_require__){"use strict";var __awaiter=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.HotTesterAPI=void 0;const HotAPI_1=__webpack_require__(14),HotRoute_1=__webpack_require__(7);class HotTesterAPI extends HotAPI_1.HotAPI{constructor(t,e=null,n=null){super(t,e,n),this.executeEventsUsing=HotAPI_1.EventExecutionType.HotAPI;let r=new HotRoute_1.HotRoute(e,"tester");r.addMethod("pageLoaded",this.pageLoaded),r.addMethod("executeTests",this.executeTests),this.addRoute(r)}pageLoaded(req,res,authorizedValue,jsonObj,queryObj){return __awaiter(this,void 0,void 0,(function*(){let testerObj={testerName:jsonObj.testerName,testerMap:jsonObj.testerMap,pageName:jsonObj.pageName,testElements:jsonObj.testElements,testPathsStrs:jsonObj.testPaths};for(let t in testerObj){let e=testerObj[t],n=!1;if(null==e&&(n=!0),""!=testerObj.testerName&&""!==testerObj.testerMap&&""!==testerObj.testElements&&""!==testerObj.testPathsStrs||(n=!0),!0===n)throw new Error(`TesterAPI: Object ${t} was not passed.`)}testerObj.testElements=JSON.parse(testerObj.testElements),testerObj.testPathsStrs=JSON.parse(testerObj.testPathsStrs);let testPaths={};for(let key in testerObj.testPathsStrs){let testPath=eval(testerObj.testPathsStrs[key]);testPaths[key]=testPath}let tester=this.connection.processor.testers[testerObj.testerName];if(null==tester)throw new Error(`TesterAPI: Tester ${testerObj.testerMap} does not exist!`);let testMap=tester.testMaps[testerObj.testerMap];if(null==testMap)throw new Error(`TesterAPI: Tester map ${testerObj.testerMap} does not exist!`);return testMap.pages[testerObj.pageName]={testElements:{},testPaths:{}},testMap.pages[testerObj.pageName].testElements=testerObj.testElements,testMap.pages[testerObj.pageName].testPaths=testPaths,tester.finishedLoading=!0,null!=tester.onFinishedLoading&&(yield tester.onFinishedLoading()),!0}))}executeTests(t,e,n,r,o){return __awaiter(this,void 0,void 0,(function*(){let t=r.testerName,e=r.testerMap;if(null==t||null==e)throw new Error("TesterAPI: Not all required json objects were passed.");if(""===t||""===e)throw new Error("TesterAPI: Not all required json objects were passed.");let n=this.connection;return null!=n.executeTests&&(yield n.executeTests(t,e)),!0}))}}exports.HotTesterAPI=HotTesterAPI},function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))},o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.HotAPI=e.EventExecutionType=void 0;const s=o(n(2)),i=n(3),a=n(7),l=n(8);var u;!function(t){t[t.HotRoute=0]="HotRoute",t[t.HotMethod=1]="HotMethod",t[t.HotAPI=2]="HotAPI"}(u=e.EventExecutionType||(e.EventExecutionType={}));e.HotAPI=class{constructor(t,e=null,n=null){this.connection=e,this.baseUrl=t,this.createFunctions=!0,this.executeEventsUsing=u.HotRoute,this.db=n,this.authCredentials=null,this.userAuth=null,this.routes={},this.onPreRegister=null,this.onPostRegister=null}setDBSchema(t){if(null==this.connection.api)throw new Error("No API has been set!");if(null==this.connection.api.db)throw new Error("No database has been set for API base url "+this.connection.api.baseUrl);this.connection.api.db.schema=t}getDB(){if(null==this.connection.api.db)throw new Error("No database has been set for API base url "+this.connection.api.baseUrl);return this.connection.api.db}getDBSchema(){if(null==this.connection.api.db)throw new Error("No database has been set for API base url "+this.connection.api.baseUrl);return this.connection.api.db.schema}addRoute(t,e=null,n=null){let r="";if(t instanceof a.HotRoute?(r=t.route,this.routes[t.route]=t):(r=t,null==this.routes[r]&&(this.routes[r]=new a.HotRoute(this.connection,r)),e instanceof l.HotRouteMethod?this.routes[r].addMethod(e):this.routes[r].addMethod(new l.HotRouteMethod(this.routes[r],e,n))),this.routes[r].connection=this.connection,!0===this.createFunctions){let t=this[r];null==t&&(t={});for(let e=0;e<this.routes[r].methods.length;e++){let n=this.routes[r],o=this.routes[r].methods[e];t[o.name]=t=>{let e=o.type,r="";""!==n.version&&(r+="/"+n.version),""!==n.route&&(r+="/"+n.route),""!==o.name&&(r+="/"+o.name);let s=null;if(null!=this.authCredentials&&(s=this.authCredentials),null!=o.authCredentials?s=o.authCredentials:null!=o.parentRoute.authCredentials&&(s=o.parentRoute.authCredentials),null==s&&"undefined"!=typeof Hot&&null!=Hot&&null!=Hot.API&&null!=Hot.API[n.route]&&null!=Hot.API[n.route].authCredentials&&(s=Hot.API[n.route].authCredentials),null!=s)for(let e in s){let n=s[e];null==t[e]&&(t[e]=n)}let i=[r,t,e];return this.makeCall.apply(this,i)}}this[r]=t}}registerRoute(t){return r(this,void 0,void 0,(function*(){this.connection instanceof i.HotServer&&(yield this.connection.registerRoute(t))}))}registerRoutes(){return r(this,void 0,void 0,(function*(){for(let t in this.routes){let e=this.routes[t];yield this.registerRoute(e)}}))}makeCall(t,e,n="POST"){return r(this,void 0,void 0,(function*(){let r=this.baseUrl;"/"===r[r.length-1]&&(r=r.substr(0,r.length-1)),"/"!==t[0]&&(r+="/"),r+=t;let o={method:n=n.toUpperCase(),headers:{Accept:"application/json","Content-Type":"application/json"}};"GET"!==n&&"HEAD"!==n&&(o.body=JSON.stringify(e));let i=null;try{i=yield(0,s.default)(r,o)}catch(t){throw t}return yield i.json()}))}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestMap=e.HotTestDestination=void 0;class r{constructor(t="",e=!0){"string"==typeof t?(this.destination=t,this.autoStart=e):t instanceof r?(this.destination=t.destination,this.autoStart=t.autoStart):(this.destination=t.path,this.autoStart=t.autoStart)}}e.HotTestDestination=r;e.HotTestMap=class{constructor(t=[],e={},n=[]){if(t instanceof Array){this.destinations=[];for(let e=0;e<t.length;e++){let n=t[e];this.destinations.push(new r(n))}}else{this.destinations={};for(let e in t){let n=t[e];this.destinations[e]=new r(n)}}this.destinationOrder=n,this.pages=e}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});const r=n(0),o=n(1),s=n(20),i=n(5),a=n(11),l=n(10),u=n(14),h=n(7),c=n(8),p=n(3),d=n(12),f=n(21),m=n(6),g=n(22),v=n(13),y=n(15);r.HotStaq.isWeb=!0,t.exports.HotStaq=r.HotStaq,t.exports.Hot=o.Hot,t.exports.DeveloperMode=o.DeveloperMode,t.exports.HotComponent=s.HotComponent,t.exports.HotAPI=u.HotAPI,t.exports.EventExecutionType=u.EventExecutionType,t.exports.HotFile=i.HotFile,t.exports.HotLog=a.HotLog,t.exports.HotLogLevel=a.HotLogLevel,t.exports.HotPage=l.HotPage,t.exports.HotRoute=h.HotRoute,t.exports.HotRouteMethod=c.HotRouteMethod,t.exports.HTTPMethod=c.HTTPMethod,t.exports.HotServer=p.HotServer,t.exports.HotClient=d.HotClient,t.exports.HotTester=g.HotTester,t.exports.HotTesterAPI=v.HotTesterAPI,t.exports.HotTestMap=y.HotTestMap,t.exports.HotTestDestination=y.HotTestDestination,t.exports.HotTestElement=m.HotTestElement,t.exports.HotTestElementOptions=m.HotTestElementOptions,t.exports.HotTestDriver=f.HotTestDriver},function(t,e,n){"use strict";var r=new RegExp("^(?:@([^/]+?)[/])?([^/]+?)$"),o=n(18),s=["node_modules","favicon.ico"];(t.exports=function(t){var e=[],n=[];if(null===t)return n.push("name cannot be null"),i(e,n);if(void 0===t)return n.push("name cannot be undefined"),i(e,n);if("string"!=typeof t)return n.push("name must be a string"),i(e,n);if(t.length||n.push("name length must be greater than zero"),t.match(/^\./)&&n.push("name cannot start with a period"),t.match(/^_/)&&n.push("name cannot start with an underscore"),t.trim()!==t&&n.push("name cannot contain leading or trailing spaces"),s.forEach((function(e){t.toLowerCase()===e&&n.push(e+" is a blacklisted name")})),o.forEach((function(n){t.toLowerCase()===n&&e.push(n+" is a core module name")})),t.length>214&&e.push("name can no longer contain more than 214 characters"),t.toLowerCase()!==t&&e.push("name can no longer contain capital letters"),/[~'!()*]/.test(t.split("/").slice(-1)[0])&&e.push('name can no longer contain special characters ("~\'!()*")'),encodeURIComponent(t)!==t){var a=t.match(r);if(a){var l=a[1],u=a[2];if(encodeURIComponent(l)===l&&encodeURIComponent(u)===u)return i(e,n)}n.push("name can only contain URL-friendly characters")}return i(e,n)}).scopedPackagePattern=r;var i=function(t,e){var n={validForNewPackages:0===e.length&&0===t.length,validForOldPackages:0===e.length,warnings:t,errors:e};return n.warnings.length||delete n.warnings,n.errors.length||delete n.errors,n}},function(t){t.exports=JSON.parse('["assert","buffer","child_process","cluster","console","constants","crypto","dgram","dns","domain","events","fs","http","https","module","net","os","path","process","punycode","querystring","readline","repl","stream","string_decoder","timers","tls","tty","url","util","v8","vm","zlib"]')},function(t,e,n){t.exports=function(){"use strict";function t(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)t[r]=n[r]}return t}return function e(n,r){function o(e,o,s){if("undefined"!=typeof document){"number"==typeof(s=t({},r,s)).expires&&(s.expires=new Date(Date.now()+864e5*s.expires)),s.expires&&(s.expires=s.expires.toUTCString()),e=encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var i="";for(var a in s)s[a]&&(i+="; "+a,!0!==s[a]&&(i+="="+s[a].split(";")[0]));return document.cookie=e+"="+n.write(o,e)+i}}return Object.create({set:o,get:function(t){if("undefined"!=typeof document&&(!arguments.length||t)){for(var e=document.cookie?document.cookie.split("; "):[],r={},o=0;o<e.length;o++){var s=e[o].split("="),i=s.slice(1).join("=");try{var a=decodeURIComponent(s[0]);if(r[a]=n.read(i,a),t===a)break}catch(t){}}return t?r[t]:r}},remove:function(e,n){o(e,"",t({},n,{expires:-1}))},withAttributes:function(n){return e(this.converter,t({},this.attributes,n))},withConverter:function(n){return e(t({},this.converter,n),this.attributes)}},{attributes:{value:Object.freeze(r)},converter:{value:Object.freeze(n)}})}({read:function(t){return'"'===t[0]&&(t=t.slice(1,-1)),t.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(t){return encodeURIComponent(t).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}},{path:"/"})}()},function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotComponent=void 0;const o=n(0);e.HotComponent=class{constructor(t,e=null){t instanceof o.HotStaq?(this.processor=t,this.htmlElement=null,this.name="",this.tag="",this.api=null,this.elementOptions=void 0,this.type="",this.value=null,this.events={}):(this.processor=t.processor,this.htmlElement=t.htmlElement||null,this.name=t.name||"",this.tag=t.tag||this.name,this.api=t.api||null,this.elementOptions=t.elementOptions||void 0,this.type=t.type||"",this.value=t.value||null,this.events={}),null!=e&&(this.api=e)}onCreated(t){return r(this,void 0,void 0,(function*(){return t}))}}},function(t,e,n){"use strict";(function(t){var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotTestDriver=void 0;const o=n(6);e.HotTestDriver=class{constructor(t=null){this.page=t}parseTestObject(t){let e=t.indexOf("*"),n="";e>-1&&(t=t.replace(/\*/,""),n="*");let r=`[data-test-object-name${n}='${t}']`;return e=t.indexOf(">"),e>-1&&(r=t=t.replace(/\>/,"")),r}wait(t){return r(this,void 0,void 0,(function*(){return yield new Promise((e,n)=>{setTimeout(()=>{e()},t)})}))}print(e){return r(this,void 0,void 0,(function*(){t.stdout.write(e)}))}println(t){return r(this,void 0,void 0,(function*(){yield this.print(t+"\n")}))}assert(t,e=""){return r(this,void 0,void 0,(function*(){if(!t)throw new Error(e)}))}run(t){return r(this,void 0,void 0,(function*(){let e=[];for(let n=0;n<t.length;n++){let r=t[n],s=null,i="",a="";if("string"==typeof r){if(s=this.page.testElements[r],null==s)throw new Error("HotTestDriver: Unable to find test element "+r);i=s.func,a=s.value}if(r instanceof Array){let t=r[0];s=this.page.testElements[t],null==s?(s=new o.HotTestElement(t),i=r[1],a=r[2]):(i=s.func,a=s.value,r.length>1&&(i=r[1]),r.length>2&&(a=r[2]))}s.func=i,s.value=a,e.push(yield this.runCommand(s))}return e}))}}}).call(this,n(9))},function(t,e,n){"use strict";var r=this&&this.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,s){function i(t){try{l(r.next(t))}catch(t){s(t)}}function a(t){try{l(r.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,a)}l((r=r.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.HotTester=void 0;const o=n(0);class s{constructor(t,e,n,r,o={}){this.processor=t,this.name=e,this.baseUrl=n,this.testMaps=o,this.driver=r,this.finishedLoading=!1,this.hasBeenSetup=!1,this.hasBeenDestroyed=!1}waitForData(){return r(this,void 0,void 0,(function*(){for(;!1===this.finishedLoading;)yield o.HotStaq.wait(10)}))}getTestPage(t){return this.testMaps[t.mapName].pages[t.page]}getTestPath(t,e){return this.testMaps[t.mapName].pages[t.page].testPaths[e]}static interpretDestination(t,e){let n={mapName:t,page:"",api:"",paths:[]},r=e.destination.split(/\-\>/g),o=r[0],s=(t,e)=>{let n=t.indexOf(e),r="";return n>-1&&(r=t.substr(n+e.length),r=r.trim()),r};n.page=s(o,"page:"),n.api=s(o,"api:");for(let t=1;t<r.length;t++){let e=r[t],o={cmd:"",dest:"",path:""};e=e.trim(),o.dest=s(e,"dest:"),o.cmd=s(e,"cmd:"),o.path=s(e,"path:"),""==o.dest&&""==o.cmd&&""==o.path&&(o.path=e),n.paths.push(o)}return n}executeTestAPIPath(t,e,n,o=!1,s=!1){return r(this,void 0,void 0,(function*(){let r=!0;!1===o&&null!=this.onTestAPIPathStart&&(r=yield this.onTestAPIPathStart(t,e,n,s));let i=null;if(!0===r){let t=e.testCases[n];if(null==t)throw new Error(`HotTester: Test case object ${n} does not exist!`);i=yield t.func(this.driver)}return!1===o&&null!=this.onTestAPIPathEnd&&(yield this.onTestAPIPathEnd(t,e,n,i,s)),i}))}executeTestAPIPaths(t){return r(this,void 0,void 0,(function*(){let e=[];if(null==this.testMaps[t.mapName])throw new Error(`HotTester: Map ${t.mapName} does not exist!`);if(null==this.processor.api)throw new Error("HotTester: Associated processor does not have an API!");let n=this.processor.api.routes[t.api];if(null==n)throw new Error(`HotTester: API does not have route ${t.api}!`);for(let r=0;r<t.paths.length;r+=2){let o=t.paths[r].path,s=n.getMethod(o),i=t.paths[r+1].path,a=yield this.executeTestAPIPath(t,s,i);e.push(a)}return e}))}executeTestPagePath(t,e,n=!1,o=!1){return r(this,void 0,void 0,(function*(){let r=!0,s=this.testMaps[t.mapName];if(null==s)throw new Error(`HotTester: Map ${t.mapName} does not exist!`);let i=s.pages[t.page];if(null==i)throw new Error(`HotTester: Page ${t.page} does not exist!`);this.driver.page=i;let a=e.path,l=i.testPaths[a];!1===n&&null!=this.onTestPagePathStart&&(r=yield this.onTestPagePathStart(t,i,e,o));let u=null;if(!0===r){if(null==l)throw new Error(`HotTester: Test path ${a} does not have a function!`);u=yield l(this.driver)}return!1===n&&null!=this.onTestPagePathEnd&&(yield this.onTestPagePathEnd(t,l,u,o)),u}))}executeCommand(t,e,n,s){return r(this,void 0,void 0,(function*(){let i=(t,e,r)=>{let o=!1;n.cmd===e&&(o=!0);const s=n.cmd.indexOf("(");if(s>-1){n.cmd.substr(0,s)===e&&(o=!0)}return o},a=t=>{let e=[],n=t.match(/(?=\()(.*?)(?=\))/g);if(null!=n){let t=n[0];t=t.substr(2,t.length),e.push(t)}if(e.length<1)throw new Error(`HotTester: Command ${t} requires arguments, but none were supplied.`);return e},l=null,u=[];if(!0===i(n.cmd,"waitForTesterAPIData")&&(l=t=>r(this,void 0,void 0,(function*(){this.finishedLoading=!1,yield this.waitForData()}))),!0===i(n.cmd,"wait")&&(u=a(n.cmd),l=t=>r(this,void 0,void 0,(function*(){let e=parseInt(t[0]);yield o.HotStaq.wait(e)}))),!0===i(n.cmd,"url")&&(u=a(n.cmd),l=t=>r(this,void 0,void 0,(function*(){let e=t[0];yield this.driver.navigateToUrl(e)}))),!0===i(n.cmd,"print")&&(u=a(n.cmd),l=t=>r(this,void 0,void 0,(function*(){let e=t[0];yield this.driver.print(e)}))),!0===i(n.cmd,"println")&&(u=a(n.cmd),l=t=>r(this,void 0,void 0,(function*(){let e=t[0];yield this.driver.println(e)}))),!0===i(n.cmd,"waitForTestObject")&&(u=a(n.cmd),l=t=>r(this,void 0,void 0,(function*(){let e=JSON.parse(t[0]);yield this.driver.waitForTestElement(e)}))),null==l)throw new Error(`HotTester: Command ${n.cmd} does not exist!`);yield this.onCommand(t,e,n,s,u,l)}))}executeTestPagePaths(t,e=!1){return r(this,void 0,void 0,(function*(){let n=[],r=this.testMaps[t.mapName];if(null==r)throw new Error(`HotTester: Map ${t.mapName} does not exist!`);for(let o=0;o<t.paths.length;o++){let i=t.paths[o],a=null,l=r.pages[t.page];if(null==l)throw new Error(`HotTester: Page ${t.page} does not exist!`);if(""!==i.dest){if(r.destinations instanceof Array)throw new Error(`HotTester: When using type 'dest' in a destination string, all destinations in map ${t.mapName} must be named.`);let e=r.destinations[i.dest],n=s.interpretDestination(t.mapName,e);a=yield this.executeTestPagePaths(n)}""!==i.cmd&&(yield this.executeCommand(t,l,i,i.cmd)),""!==i.path&&(a=yield this.executeTestPagePath(t,i,!1,e)),n.push(a)}return n}))}execute(t){return r(this,void 0,void 0,(function*(){let e=this.testMaps[t];if(null==e)throw new Error(`HotTester: Map ${t} does not exist!`);let n=this.processor.getRouteKeyFromName(t),o="";""!==n&&(o=`${this.baseUrl}${n}`);let i=(e,n="")=>r(this,void 0,void 0,(function*(){if(!1===e.autoStart)return;let r=s.interpretDestination(t,e),i=!1,a=!0;""!==r.page&&(i=!0),null!=this.setup&&!1===this.hasBeenSetup&&(yield this.setup(i,o,n),this.hasBeenSetup=!0,this.hasBeenDestroyed=!1),null!=this.onTestStart&&(a=yield this.onTestStart(r,o,n)),!0===a&&(""!==r.page&&(yield this.executeTestPagePaths(r)),""!==r.api&&(yield this.executeTestAPIPaths(r))),null!=this.onTestEnd&&(yield this.onTestEnd(r)),null!=this.destroy&&!1===this.hasBeenDestroyed&&(yield this.destroy(),this.hasBeenDestroyed=!0,this.hasBeenSetup=!1)}));if(e.destinations instanceof Array)for(let t=0;t<e.destinations.length;t++){let n=e.destinations[t];yield i(n)}else if(e.destinationOrder.length>0){let t=[];for(let n=0;n<e.destinationOrder.length;n++){let r=e.destinationOrder[n],o=e.destinations[r];if(null==o)throw new Error(`HotTester: Destination ${r} does not exist!`);t.push(r),yield i(o,r)}for(let n in e.destinations){let r=!0;for(let e=0;e<t.length;e++){if(t[e]===n){r=!1;break}}if(!0===r){let t=e.destinations[n];yield i(t,n)}}}else for(let t in e.destinations){let n=e.destinations[t];yield i(n,t)}}))}}e.HotTester=s}]);
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ib3RTdGFxV2ViL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90U3RhcS50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vbm9kZV9tb2R1bGVzL2Nyb3NzLWZldGNoL2Rpc3QvYnJvd3Nlci1wb255ZmlsbC5qcyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFNlcnZlci50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdEZpbGUudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RUZXN0RWxlbWVudC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFJvdXRlLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90Um91dGVNZXRob2QudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL3NyYy9Ib3RQYWdlLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90TG9nLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90Q2xpZW50LnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90VGVzdGVyQVBJLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90QVBJLnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90VGVzdE1hcC50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL2FwaS13ZWIudHMiLCJ3ZWJwYWNrOi8vSG90U3RhcVdlYi8uL25vZGVfbW9kdWxlcy92YWxpZGF0ZS1ucG0tcGFja2FnZS1uYW1lL2luZGV4LmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9ub2RlX21vZHVsZXMvanMtY29va2llL2Rpc3QvanMuY29va2llLmpzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90Q29tcG9uZW50LnRzIiwid2VicGFjazovL0hvdFN0YXFXZWIvLi9zcmMvSG90VGVzdERyaXZlci50cyIsIndlYnBhY2s6Ly9Ib3RTdGFxV2ViLy4vc3JjL0hvdFRlc3Rlci50cyJdLCJuYW1lcyI6WyJpbnN0YWxsZWRNb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiZXhwb3J0cyIsIm1vZHVsZSIsImkiLCJsIiwibW9kdWxlcyIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsIkhvdFRlc3Rlck1vY2hhIiwiSG90VGVzdGVyTW9jaGFTZWxlbml1bSIsIkhvdFRlc3RTZWxlbml1bURyaXZlciIsIkhvdFN0YXEiLCJjb3B5IiwidGhpcyIsImFwaSIsInRlc3RlckFQSSIsIkRldmVsb3Blck1vZGUiLCJQcm9kdWN0aW9uIiwicGFnZXMiLCJjb21wb25lbnRzIiwiZmlsZXMiLCJob3RTaXRlIiwiYXBpQ29udGVudCIsInRlc3RlckFwaUNvbnRlbnQiLCJwYWdlQ29udGVudCIsImxvZ2dlciIsIkhvdExvZyIsIkhvdExvZ0xldmVsIiwiTm9uZSIsInB1YmxpY1NlY3JldHMiLCJ0ZXN0ZXJzIiwidG9Mb3dlckNhc2UiLCJwYXJzZUludCIsImV4Iiwib2JqV2l0aFBhcmFtIiwicmVxdWlyZWQiLCJ0aHJvd0V4Y2VwdGlvbiIsIkVycm9yIiwiZGVmYXVsdFZhbHVlIiwibnVtTWlsbGlzZWNvbmRzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJzZXRUaW1lb3V0IiwicGFnZSIsInBhZ2VOYW1lIiwiZmlsZSIsImxvY2FsRmlsZSIsInVybCIsImNvbXBvbmVudCIsInJlZ2lzdGVyQ29tcG9uZW50IiwiY3VzdG9tRWxlbWVudHMiLCJkZWZpbmUiLCJ0YWciLCJIVE1MRWxlbWVudCIsInN1cGVyIiwib25jbGljayIsImNsaWNrIiwiZXZlbnRzIiwiZXZlbnQiLCJhZGRFdmVudExpc3RlbmVyIiwidHlwZSIsImZ1bmMiLCJvcHRpb25zIiwiaHRtbEVsZW1lbnQiLCJvbkNyZWF0ZWQiLCJoYW5kbGVBdHRyaWJ1dGVzIiwiYXR0cmlidXRlcyIsImlJZHgiLCJsZW5ndGgiLCJhdHRyIiwiYXR0ck5hbWUiLCJhdHRyVmFsdWUiLCJzdHIiLCJvdXRwdXQiLCJuZXdET00iLCJET01QYXJzZXIiLCJwYXJzZUZyb21TdHJpbmciLCJzaGFkb3ciLCJhdHRhY2hTaGFkb3ciLCJib2R5IiwiY2hpbGRyZW4iLCJjaGlsZCIsImFwcGVuZENoaWxkIiwiZWxlbWVudE9wdGlvbnMiLCJwYXJlbnQiLCJodG1sIiwiZm91bmRQYXJlbnQiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJyZXN1bHQiLCJyZXN1bHRzIiwicHVzaCIsImhvdHNpdGVOYW1lIiwiZXJyb3JzIiwidGhyb3dUaGVFeGNlcHRpb24iLCJjb250ZW50IiwicmVwbGFjZSIsIlJlZ0V4cCIsImhvdHNpdGUiLCJwYXJhbXMiLCJwcmV2VmFsdWUiLCJwYXJhbSIsInBhdGgiLCJqc29uU3RyIiwiaXNXZWIiLCJpbmZvIiwicmVzIiwidGV4dCIsInBwYXRoIiwibm9ybWFsaXplIiwiZnMiLCJyZWFkRmlsZSIsImVyciIsImRhdGEiLCJ0b1N0cmluZyIsIkpTT04iLCJwYXJzZSIsImNoZWNrSG90U2l0ZU5hbWUiLCJob3RzaXRlUGF0aCIsInJvdXRlcyIsInRlc3RlclVybCIsInRlc3RlciIsImRyaXZlciIsIkRldmVsb3BtZW50IiwidGVzdGluZyIsInNldHVwVGVzdGVyIiwicGFyZW50T2JqIiwiY3JlYXRlTmV3VGVzdGVyIiwidGVzdGVyTmFtZSIsInRlc3RlckFQSVVybCIsIndlYiIsInJvdXRlIiwiSG90RmlsZSIsIkhvdFBhZ2UiLCJwcm9jZXNzb3IiLCJtYXBOYW1lIiwidGVzdE1hcCIsIm1hcCIsInRlc3RNYXBzIiwiSG90VGVzdE1hcCIsImRlc3RpbmF0aW9ucyIsIkFycmF5IiwiZGVzdCIsIkhvdFRlc3REZXN0aW5hdGlvbiIsImtleTIiLCJkZXN0aW5hdGlvbk9yZGVyIiwiYWRkUGFnZSIsImFwaXMiLCJjb21wb25lbnRVcmwiLCJuZXdDb21wb25lbnQiLCJldmFsIiwiYWRkQ29tcG9uZW50IiwibG9hZEhvdEZpbGVzIiwiYWRkVGVzdGVyIiwiZm9yY2VDb250ZW50TG9hZGluZyIsIm5ld0ZpbGUiLCJsb2FkQ29udGVudCIsImxvYWQiLCJhZGRGaWxlIiwicm91dGVLZXkiLCJqc1NyY1BhdGgiLCJwYXNzQXJncyIsImFyZ3MiLCJhcGlTY3JpcHRzIiwiYXBpQ29kZSIsInNlcnZlciIsImdsb2JhbEFwaSIsIndhcm5pbmciLCJzZW5kSlNDb250ZW50IiwianNhcGkiLCJsaWJyYXJ5TmFtZSIsImFwaU5hbWUiLCJiYXNlVXJsIiwidGVtcEFQSUNvbnRlbnQiLCJqc2FwaXBhdGgiLCJzZWNyZXQiLCJ1bmRlZmluZWQiLCJzdHJpbmdpZnkiLCJjb25uZWN0aW9uIiwic2VydmVyQ29ubiIsInBhc3NTZWNyZXRGcm9tQVBJIiwic2VjcmV0cyIsImVudiIsImVudktleSIsInByb2Nlc3MiLCJ0ZW1wQ29udGVudCIsImRldmVsb3Blck1vZGVTdHIiLCJ0ZXN0ZXJBUElTdHIiLCJsb2FkRmlsZXMiLCJrZXlzIiwiZmlsZVVybCIsImZpbGVDb250ZW50IiwiZXNjYXBlZENvbnRlbnQiLCJ0ZXN0ZXJNYXAiLCJ0ZXN0ZXJMYXVuY2hwYWRVcmwiLCJsYXVuY2hwYWRVcmwiLCJmaXhDb250ZW50IiwiZXhwcmVzc0FwcCIsImdlbmVyYXRlQ29udGVudCIsInJlcSIsInNlbmQiLCJtYXBzIiwiZm91bmRLZXkiLCJmb3VuZFJvdXRlIiwiZ2V0Um91dGVLZXlGcm9tTmFtZSIsImV4ZWN1dGUiLCJnZXRXZWJUZXN0aW5nTWFwcyIsImV4ZWN1dGVUZXN0cyIsImdldEFQSVRlc3RpbmdNYXBzIiwiZ2V0UGFnZSIsImxvY2FsRmlsZXBhdGgiLCJyZWFkeUZ1bmMiLCJyZWFkeVN0YXRlIiwid2luZG93Iiwib3BlbiIsIndyaXRlIiwiY2xvc2UiLCJpc1JlYWR5Rm9yVGVzdGluZyIsIndhaXQiLCJvblJlYWR5Rm9yVGVzdGluZyIsIm9uUmVhZHkiLCJ0ZXN0ZXJBUElCYXNlVXJsIiwiY2xpZW50IiwiSG90Q2xpZW50IiwiSG90VGVzdGVyQVBJIiwicHJvY2Vzc1VybCIsInVzZU91dHB1dCIsInByb2Nlc3NDb250ZW50IiwiSG90IiwibG93ZXJGaWxlIiwiaW5kZXhPZiIsImVjaG8iLCJnZXRGaWxlIiwiZmlsZU5hbWUiLCJ0ZW1wRmlsZSIsIkN1cnJlbnRQYWdlIiwiaHR0cE1ldGhvZCIsIm1ha2VDYWxsIiwib2siLCJzdGF0dXMiLCJzdGF0dXNUZXh0IiwianNvbiIsIm1lc3NhZ2UiLCJyZXF1ZXN0SW5pdCIsIk91dHB1dCIsIkNTUyIsImNzc0ZpbGUiLCJjc3NPdXQiLCJjc3NTdHIiLCJKU0ZpbGVzIiwianNGaWxlIiwianNGaWxlT3V0IiwianNGaWxlU3RyIiwiSlNTY3JpcHRzIiwianNTY3JpcHQiLCJqc1NjcmlwdE91dCIsImpzU2NyaXB0c1N0ciIsIkFyZ3VtZW50cyIsIkhvdFRlc3RFbGVtZW50IiwiTW9kZSIsIkFQSSIsIlRlc3RlckFQSSIsIkRhdGEiLCJDb29raWVzIiwiUHVibGljU2VjcmV0cyIsImdsb2JhbCIsInNlbGYiLCJfX3NlbGZfXyIsIkYiLCJmZXRjaCIsIkRPTUV4Y2VwdGlvbiIsInN1cHBvcnQiLCJCbG9iIiwiZSIsInZpZXdDbGFzc2VzIiwiaXNBcnJheUJ1ZmZlclZpZXciLCJBcnJheUJ1ZmZlciIsImlzVmlldyIsIm9iaiIsIm5vcm1hbGl6ZU5hbWUiLCJTdHJpbmciLCJ0ZXN0IiwiVHlwZUVycm9yIiwibm9ybWFsaXplVmFsdWUiLCJpdGVyYXRvckZvciIsIml0ZW1zIiwiaXRlcmF0b3IiLCJuZXh0Iiwic2hpZnQiLCJkb25lIiwiSGVhZGVycyIsImhlYWRlcnMiLCJmb3JFYWNoIiwiYXBwZW5kIiwiaXNBcnJheSIsImhlYWRlciIsImdldE93blByb3BlcnR5TmFtZXMiLCJjb25zdW1lZCIsImJvZHlVc2VkIiwiZmlsZVJlYWRlclJlYWR5IiwicmVhZGVyIiwib25sb2FkIiwib25lcnJvciIsImVycm9yIiwicmVhZEJsb2JBc0FycmF5QnVmZmVyIiwiYmxvYiIsIkZpbGVSZWFkZXIiLCJwcm9taXNlIiwicmVhZEFzQXJyYXlCdWZmZXIiLCJidWZmZXJDbG9uZSIsImJ1ZiIsInNsaWNlIiwidmlldyIsIlVpbnQ4QXJyYXkiLCJieXRlTGVuZ3RoIiwic2V0IiwiYnVmZmVyIiwiQm9keSIsIl9pbml0Qm9keSIsIl9ib2R5SW5pdCIsIl9ib2R5VGV4dCIsImlzUHJvdG90eXBlT2YiLCJfYm9keUJsb2IiLCJGb3JtRGF0YSIsIl9ib2R5Rm9ybURhdGEiLCJVUkxTZWFyY2hQYXJhbXMiLCJEYXRhVmlldyIsIl9ib2R5QXJyYXlCdWZmZXIiLCJyZWplY3RlZCIsImFycmF5QnVmZmVyIiwidGhlbiIsInJlYWRBc1RleHQiLCJjaGFycyIsImZyb21DaGFyQ29kZSIsImpvaW4iLCJyZWFkQXJyYXlCdWZmZXJBc1RleHQiLCJmb3JtRGF0YSIsImRlY29kZSIsIm9sZFZhbHVlIiwiaGFzIiwiY2FsbGJhY2siLCJ0aGlzQXJnIiwidmFsdWVzIiwiZW50cmllcyIsIm1ldGhvZHMiLCJSZXF1ZXN0IiwiaW5wdXQiLCJtZXRob2QiLCJ1cGNhc2VkIiwiY3JlZGVudGlhbHMiLCJzaWduYWwiLCJ0b1VwcGVyQ2FzZSIsInJlZmVycmVyIiwiZm9ybSIsInRyaW0iLCJzcGxpdCIsImJ5dGVzIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiUmVzcG9uc2UiLCJib2R5SW5pdCIsImNsb25lIiwicmVzcG9uc2UiLCJyZWRpcmVjdFN0YXR1c2VzIiwicmVkaXJlY3QiLCJSYW5nZUVycm9yIiwibG9jYXRpb24iLCJzdGFjayIsImNvbnN0cnVjdG9yIiwiaW5pdCIsInJlcXVlc3QiLCJhYm9ydGVkIiwieGhyIiwiWE1MSHR0cFJlcXVlc3QiLCJhYm9ydFhociIsImFib3J0IiwicmF3SGVhZGVycyIsImdldEFsbFJlc3BvbnNlSGVhZGVycyIsImxpbmUiLCJwYXJ0cyIsInJlc3BvbnNlVVJMIiwicmVzcG9uc2VUZXh0Iiwib250aW1lb3V0Iiwib25hYm9ydCIsIndpdGhDcmVkZW50aWFscyIsInJlc3BvbnNlVHlwZSIsInNldFJlcXVlc3RIZWFkZXIiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwicG9seWZpbGwiLCJwb255ZmlsbCIsImN0eCIsImRlZmF1bHQiLCJIb3RTZXJ2ZXJUeXBlIiwic2VydmVyVHlwZSIsImxpc3RlbkFkZHJlc3MiLCJwb3J0cyIsImh0dHAiLCJodHRwcyIsInNzbCIsImNlcnQiLCJjYSIsInJlZGlyZWN0SFRUUHRvSFRUUFMiLCJIVFRQIiwidGhyb3dBbGxFcnJvcnMiLCJodHRwR2V0IiwibG9hZFVybCIsImxvYWRMb2NhbEZpbGUiLCJjb250ZW50UmVnZXgiLCJjb250ZW50UHJvY2Vzc29yIiwib2ZmQ29udGVudFByb2Nlc3NvciIsIm51bVJlbW92ZUZyb21CZWdpbm5pbmciLCJudW1SZW1vdmVGcm9tRW5kIiwiZXhlYyIsInByZXZpb3VzSW5kZXgiLCJzdGFydCIsImluZGV4IiwiZW5kIiwibGFzdEluZGV4IiwicHJldkNvbnRlbnQiLCJzdWJzdHIiLCJzdGFydENoYXJzIiwiZW5kQ2hhcnMiLCJ0cmlnZ2VyQ2hhciIsInBvcyIsInN0YXJ0VHJpZ2dlclBvcyIsIm5lc3RlZENvdW50ZXIiLCJycG9zIiwibGFzdEluZGV4T2YiLCJlcG9zIiwidGVtcGVwb3MiLCJ0aGlzQ29udGVudCIsImdldEFQSSIsImdldFRlc3RlckFQSSIsInJlZ2V4Rm91bmQiLCJvZmZDb250ZW50IiwidGVtcE91dHB1dCIsInByb2Nlc3NOZXN0ZWRDb250ZW50IiwicmVnZXhGb3VuZDIiLCJvZmZDb250ZW50MyIsInRlbXBPdXRwdXQyIiwidGVtcE91dHB1dDMiLCJvdXQiLCJ0ZW1wT3V0cHV0NCIsImZvdW5kU3RyIiwidGVtcE91dHB1dDUiLCJyZXR1cm5lZE91dHB1dCIsImV4ZWN1dGlvbkNvbnRlbnQiLCJuZXdWYXIiLCJuZXdWYXJWYWx1ZSIsImNvbnRlbnROYW1lIiwiRnVuY3Rpb24iLCJhcHBseSIsIlN5bnRheEVycm9yIiwiaG90IiwiZmluYWxPdXRwdXQiLCJtdXN0QmVWaXNpYmxlIiwiaWdub3JlTWlzc2luZ0VsZW1lbnRFcnJvciIsIkhvdFJvdXRlIiwib25QcmVSZWdpc3RlciIsIm9uUmVnaXN0ZXIiLCJvblBvc3RSZWdpc3RlciIsIm9uQXV0aG9yaXplVXNlciIsInZlcnNpb24iLCJwcmVmaXgiLCJhdXRoQ3JlZGVudGlhbHMiLCJjcmVhdGVFcnJvciIsImV4ZWN1dGVGdW5jdGlvbiIsIkhUVFBNZXRob2QiLCJQT1NUIiwidGVzdENhc2VzIiwiSG90Um91dGVNZXRob2QiLCJmb3VuZE1ldGhvZCIsIm9uRXhlY3V0ZSIsIm9uU2VydmVyQXV0aG9yaXplIiwicGFyZW50Um91dGUiLCJpc1JlZ2lzdGVyZWQiLCJleGVjdXRlU2V0dXAiLCJhZGRUZXN0Q2FzZSIsIkhvdFNlcnZlciIsIm9uU2VydmVyRXhlY3V0ZSIsIm5ld1Rlc3RDYXNlIiwidGVzdENhc2VGdW5jdGlvbiIsInRlc3RDYXNlSWQiLCJ0ZXN0Q2FzZSIsImNhY2hlZFNldFRpbWVvdXQiLCJjYWNoZWRDbGVhclRpbWVvdXQiLCJkZWZhdWx0U2V0VGltb3V0IiwiZGVmYXVsdENsZWFyVGltZW91dCIsInJ1blRpbWVvdXQiLCJmdW4iLCJjbGVhclRpbWVvdXQiLCJjdXJyZW50UXVldWUiLCJxdWV1ZSIsImRyYWluaW5nIiwicXVldWVJbmRleCIsImNsZWFuVXBOZXh0VGljayIsImNvbmNhdCIsImRyYWluUXVldWUiLCJ0aW1lb3V0IiwibGVuIiwicnVuIiwibWFya2VyIiwicnVuQ2xlYXJUaW1lb3V0IiwiSXRlbSIsImFycmF5Iiwibm9vcCIsIm5leHRUaWNrIiwiYXJndW1lbnRzIiwidGl0bGUiLCJicm93c2VyIiwiYXJndiIsInZlcnNpb25zIiwib24iLCJhZGRMaXN0ZW5lciIsIm9uY2UiLCJvZmYiLCJyZW1vdmVMaXN0ZW5lciIsInJlbW92ZUFsbExpc3RlbmVycyIsImVtaXQiLCJwcmVwZW5kTGlzdGVuZXIiLCJwcmVwZW5kT25jZUxpc3RlbmVyIiwibGlzdGVuZXJzIiwiYmluZGluZyIsImN3ZCIsImNoZGlyIiwiZGlyIiwidW1hc2siLCJ0ZXN0RWxlbWVudHMiLCJ0ZXN0UGF0aHMiLCJlbG0iLCJwYXRoTmFtZSIsImRyaXZlckZ1bmMiLCJsb2dMZXZlbCIsIkFsbCIsImxldmVsIiwiVmVyYm9zZSIsIldhcm5pbmciLCJJbmZvIiwiY29uc29sZSIsIndhcm4iLCJtc2ciLCJIb3RBUEkiLCJkYiIsImV4ZWN1dGVFdmVudHNVc2luZyIsIkV2ZW50RXhlY3V0aW9uVHlwZSIsImFkZE1ldGhvZCIsInBhZ2VMb2FkZWQiLCJhZGRSb3V0ZSIsImF1dGhvcml6ZWRWYWx1ZSIsImpzb25PYmoiLCJxdWVyeU9iaiIsInRlc3Rlck9iaiIsInRlc3RQYXRoc1N0cnMiLCJ0ZXN0T2JqIiwidGhyb3dFcnJvciIsInRlc3RQYXRoIiwiZmluaXNoZWRMb2FkaW5nIiwib25GaW5pc2hlZExvYWRpbmciLCJjcmVhdGVGdW5jdGlvbnMiLCJ1c2VyQXV0aCIsInNjaGVtYSIsInJvdXRlTWV0aG9kIiwicm91dGVOYW1lIiwibmV3Um91dGUiLCJjdXJyZW50Um91dGUiLCJuZXdSb3V0ZU1ldGhvZCIsInJvdXRlU3RyIiwiYXV0aENyZWRlbnRpYWwiLCJyZWdpc3RlclJvdXRlIiwiZmV0Y2hPYmoiLCJkZXN0aW5hdGlvbiIsImF1dG9TdGFydCIsIkhvdENvbXBvbmVudCIsIkhvdFRlc3RlciIsIkhvdFRlc3RFbGVtZW50T3B0aW9ucyIsIkhvdFRlc3REcml2ZXIiLCJzY29wZWRQYWNrYWdlUGF0dGVybiIsImJ1aWx0aW5zIiwiYmxhY2tsaXN0Iiwid2FybmluZ3MiLCJtYXRjaCIsImJsYWNrbGlzdGVkTmFtZSIsImJ1aWx0aW4iLCJlbmNvZGVVUklDb21wb25lbnQiLCJuYW1lTWF0Y2giLCJ1c2VyIiwicGtnIiwidmFsaWRGb3JOZXdQYWNrYWdlcyIsInZhbGlkRm9yT2xkUGFja2FnZXMiLCJhc3NpZ24iLCJ0YXJnZXQiLCJzb3VyY2UiLCJjb252ZXJ0ZXIiLCJkZWZhdWx0QXR0cmlidXRlcyIsImV4cGlyZXMiLCJEYXRlIiwibm93IiwidG9VVENTdHJpbmciLCJlc2NhcGUiLCJzdHJpbmdpZmllZEF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVOYW1lIiwiY29va2llIiwiY29va2llcyIsImphciIsInJlYWQiLCJyZW1vdmUiLCJ3aXRoQXR0cmlidXRlcyIsIndpdGhDb252ZXJ0ZXIiLCJmcmVlemUiLCJmYWN0b3J5IiwiZWxlbWVudCIsIndpbGRjYXJkIiwic2VsZWN0b3IiLCJzdGRvdXQiLCJwcmludCIsImVycm9yTWVzc2FnZSIsImV4ZWN1dGlvbnMiLCJleGVjdXRpb24iLCJ0ZXN0RWxtIiwicnVuQ29tbWFuZCIsImhhc0JlZW5TZXR1cCIsImhhc0JlZW5EZXN0cm95ZWQiLCJ0ZXN0RGVzdCIsIm5ld0Rlc3RpbmF0aW9uIiwicGF0aHMiLCJzdHJzIiwiZ2V0VHlwZSIsInR5cGVTdHIiLCJ0eXBlRGVsaW1pdGVyIiwidHlwZVZhbHVlIiwibmV3UGF0aFN0ciIsIm5ld1BhdGgiLCJjbWQiLCJ0ZXN0TmFtZSIsInNraXBFdmVudENhbGxzIiwiY29udGludWVXaGVuVGVzdElzQ29tcGxldGUiLCJydW5UZXN0UGF0aCIsIm9uVGVzdEFQSVBhdGhTdGFydCIsInRlc3RDYXNlT2JqZWN0Iiwib25UZXN0QVBJUGF0aEVuZCIsImdldE1ldGhvZCIsImV4ZWN1dGVUZXN0QVBJUGF0aCIsInN0b3AiLCJ0ZXN0UGF0aE5hbWUiLCJvblRlc3RQYWdlUGF0aFN0YXJ0Iiwib25UZXN0UGFnZVBhdGhFbmQiLCJoYXNDbWQiLCJoYXNBcmd1bWVudHMiLCJnZXRDbWRBcmdzIiwibWF0Y2hlcyIsInRlbXBNYXRjaCIsImNtZEZ1bmMiLCJjbWRBcmdzIiwid2FpdEZvckRhdGEiLCJuYXZpZ2F0ZVRvVXJsIiwicHJpbnRsbiIsInRlc3RPYmplY3QiLCJ3YWl0Rm9yVGVzdEVsZW1lbnQiLCJvbkNvbW1hbmQiLCJpbnRlcnByZXREZXN0aW5hdGlvbiIsImV4ZWN1dGVUZXN0UGFnZVBhdGhzIiwiZXhlY3V0ZUNvbW1hbmQiLCJleGVjdXRlVGVzdFBhZ2VQYXRoIiwiZXhlY3V0ZURlc3RpbmF0aW9uIiwiZGVzdGluYXRpb25LZXkiLCJpc1dlYlJvdXRlIiwicnVuVGVzdFBhdGhzIiwic2V0dXAiLCJvblRlc3RTdGFydCIsImV4ZWN1dGVUZXN0QVBJUGF0aHMiLCJvblRlc3RFbmQiLCJkZXN0cm95IiwiaGFzRXhlY3V0ZWRLZXlzIiwib3JkZXJLZXkiLCJleGVjdXRlRGVzdCJdLCJtYXBwaW5ncyI6IjJCQUNFLElBQUlBLEVBQW1CLEdBR3ZCLFNBQVNDLEVBQW9CQyxHQUc1QixHQUFHRixFQUFpQkUsR0FDbkIsT0FBT0YsRUFBaUJFLEdBQVVDLFFBR25DLElBQUlDLEVBQVNKLEVBQWlCRSxHQUFZLENBQ3pDRyxFQUFHSCxFQUNISSxHQUFHLEVBQ0hILFFBQVMsSUFVVixPQU5BSSxFQUFRTCxHQUFVTSxLQUFLSixFQUFPRCxRQUFTQyxFQUFRQSxFQUFPRCxRQUFTRixHQUcvREcsRUFBT0UsR0FBSSxFQUdKRixFQUFPRCxRQTBEZixPQXJEQUYsRUFBb0JRLEVBQUlGLEVBR3hCTixFQUFvQlMsRUFBSVYsRUFHeEJDLEVBQW9CVSxFQUFJLFNBQVNSLEVBQVNTLEVBQU1DLEdBQzNDWixFQUFvQmEsRUFBRVgsRUFBU1MsSUFDbENHLE9BQU9DLGVBQWViLEVBQVNTLEVBQU0sQ0FBRUssWUFBWSxFQUFNQyxJQUFLTCxLQUtoRVosRUFBb0JrQixFQUFJLFNBQVNoQixHQUNY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Q3hCam1CLEtBQUtnbUIsY0FBZSxNQU14QixHQUFJbmUsRUFBSUcsd0JBQXdCQyxNQUUvQixJQUFLLElBQUkxRSxFQUFPLEVBQUdBLEVBQU9zRSxFQUFJRyxhQUFheEUsT0FBUUQsSUFDbkQsQ0FDQyxJQUFJMmlCLEVBQStCcmUsRUFBSUcsYUFBYXpFLFNBRTlDb2xCLEVBQW9CekMsUUFNM0IsR0FBSXJlLEVBQUlRLGlCQUFpQjdFLE9BQVMsRUFDbEMsQ0FDQyxJQUFJNGxCLEVBQTRCLEdBR2hDLElBQUssSUFBSTdsQixFQUFPLEVBQUdBLEVBQU9zRSxFQUFJUSxpQkFBaUI3RSxPQUFRRCxJQUN2RCxDQUNDLElBQUk4bEIsRUFBbUJ4aEIsRUFBSVEsaUJBQWlCOUUsR0FDeEMyaUIsRUFBK0JyZSxFQUFJRyxhQUFhcWhCLEdBRXBELEdBQWdCLE1BQVpuRCxFQUNILE1BQU0sSUFBSTFrQixNQUFPLDBCQUEwQjZuQixxQkFFNUNELEVBQWdCcmtCLEtBQU1za0IsU0FDaEJWLEVBQW9CekMsRUFBVW1ELEdBSXJDLElBQUssSUFBSW5xQixLQUFPMkksRUFBSUcsYUFDcEIsQ0FDQyxJQUFJc2hCLEdBQXVCLEVBRTNCLElBQUssSUFBSS9sQixFQUFPLEVBQUdBLEVBQU82bEIsRUFBZ0I1bEIsT0FBUUQsSUFDbEQsQ0FHQyxHQUYwQjZsQixFQUFnQjdsQixLQUV0QnJFLEVBQ3BCLENBQ0NvcUIsR0FBYyxFQUVkLE9BSUYsSUFBb0IsSUFBaEJBLEVBQ0osQ0FDQyxJQUFJcEQsRUFBK0JyZSxFQUFJRyxhQUFhOUksU0FFOUN5cEIsRUFBb0J6QyxFQUFVaG5CLFVBT3RDLElBQUssSUFBSUEsS0FBTzJJLEVBQUlHLGFBQ3BCLENBQ0MsSUFBSWtlLEVBQStCcmUsRUFBSUcsYUFBYTlJLFNBRTlDeXBCLEVBQW9CekMsRUFBVWhuQixRQTdtQnpDIiwiZmlsZSI6IkhvdFN0YXEuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMTYpO1xuIiwiaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgZmV0Y2ggZnJvbSBcImNyb3NzLWZldGNoXCI7XG5pbXBvcnQgdmFsaWRhdGVNb2R1bGVOYW1lIGZyb20gXCJ2YWxpZGF0ZS1ucG0tcGFja2FnZS1uYW1lXCI7XG5cbmltcG9ydCB7IEhvdFBhZ2UgfSBmcm9tIFwiLi9Ib3RQYWdlXCI7XG5pbXBvcnQgeyBIb3RGaWxlIH0gZnJvbSBcIi4vSG90RmlsZVwiO1xuXG5pbXBvcnQgeyBIb3RDb21wb25lbnQgfSBmcm9tIFwiLi9Ib3RDb21wb25lbnRcIjtcbmltcG9ydCB7IEhvdExvZywgSG90TG9nTGV2ZWwgfSBmcm9tIFwiLi9Ib3RMb2dcIjtcbmltcG9ydCB7IEhvdEFQSSB9IGZyb20gXCIuL0hvdEFQSVwiO1xuaW1wb3J0IHsgSG90U2VydmVyIH0gZnJvbSBcIi4vSG90U2VydmVyXCI7XG5pbXBvcnQgeyBEZXZlbG9wZXJNb2RlIH0gZnJvbSBcIi4vSG90XCI7XG5pbXBvcnQgeyBIb3RDbGllbnQgfSBmcm9tIFwiLi9Ib3RDbGllbnRcIjtcblxuaW1wb3J0IHsgSG90VGVzdGVyIH0gZnJvbSBcIi4vSG90VGVzdGVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0ZXJBUEkgfSBmcm9tIFwiLi9Ib3RUZXN0ZXJBUElcIjtcbmltcG9ydCB7IEhvdFRlc3REcml2ZXIgfSBmcm9tIFwiLi9Ib3RUZXN0RHJpdmVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0RGVzdGluYXRpb24sIEhvdFRlc3RNYXAgfSBmcm9tIFwiLi9Ib3RUZXN0TWFwXCI7XG5cbnZhciBIb3RUZXN0ZXJNb2NoYTogYW55ID0gbnVsbDtcbnZhciBIb3RUZXN0ZXJNb2NoYVNlbGVuaXVtOiBhbnkgPSBudWxsO1xudmFyIEhvdFRlc3RTZWxlbml1bURyaXZlcjogYW55ID0gbnVsbDtcblxuLyoqXG4gKiBBIG1hcCBwYXRoIGZvciB0ZXN0aW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvdFNpdGVNYXBQYXRoXG57XG5cdC8qKlxuXHQgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyB3aWxsIHN0YXJ0IGF1dG9tYXRpY2FsbHkgd2hlbiB0ZXN0cyBzdGFydC5cblx0ICogVGhlIGRlZmF1bHQgaXMgdHJ1ZS5cblx0ICovXG5cdGF1dG9TdGFydD86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgcGF0aCB0byB0aGUgXG5cdCAqL1xuXHRwYXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcm91dGUgdXNlZCBpbiBhIEhvdFNpdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG90U2l0ZVJvdXRlXG57XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcm91dGUuIFdpbGwgYXBwZWFyIGluIHRoZSB0aXRsZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB1cmwgdG8gdGhlIGZpbGUgdG8gbG9hZC5cblx0ICovXG5cdHVybDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIEFQSSB0byBpbnRlcmZhY2Ugd2l0aC5cblx0ICovXG5cdGFwaT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBvcmRlciBpbiB3aGljaCBkZXN0aW5hdGlvbnMgYXJlIHN1cHBvc2VkIHRvIGV4ZWN1dGUuIFRoaXMgaXMgXG5cdCAqIGlnbm9yZWQgaWYgdGhlIGRlc3RpbmF0aW9ucyBhcmUgYW4gYXJyYXkuXG5cdCAqL1xuXHRkZXN0aW5hdGlvbk9yZGVyPzogc3RyaW5nW107XG5cdC8qKlxuXHQgKiBUaGUgSG90VGVzdGVyTWFwIHRvIHVzZS4gVGhpcyBjYW4gYmUgdGhlIG5hbWUgb2YgYW4gXG5cdCAqIGV4aXN0aW5nIG9uZSBhdHRhY2hlZCB0byB0aGUgc2VsZWN0ZWQgdGVzdGVyLCBvciBcblx0ICogY2FuIGJlIGFuIGFycmF5IG9mIGRlc3RpbmF0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCB0byBcblx0ICogY3JlYXRlIGEgbmV3IG1hcC5cblx0ICovXG5cdG1hcD86IHN0cmluZyB8IHN0cmluZ1tdIHwgeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgSG90U2l0ZU1hcFBhdGg7IH0gfCBIb3RTaXRlTWFwUGF0aFtdO1xufVxuXG4vKipcbiAqIEEgSG90U2l0ZSB0byBsb2FkLiBUaGlzIFNIT1VMRCBOT1QgY29udGFpbiBhbnkgcHJpdmF0ZSBzZWNyZXQga2V5cywgcGFzc3dvcmRzLCBcbiAqIG9yIGRhdGFiYXNlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgc2VydmVyLiBBcyBzdWNoLCBmdXR1cmUgXG4gKiB2ZXJzaW9ucyBvZiB0aGUgSG90U2l0ZSBpbnRlcmZhY2Ugc2hvdWxkIG5vdCBjb250YWluIGFueSBkYXRhYmFzZSByZWxhdGVkIFxuICogY29ubmVjdGlvbiBpbmZvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvdFNpdGVcbntcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoaXMgSG90U2l0ZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IEhvdFNpdGUuIFRoaXMgaXMgZmlsbGVkIGluIGR1cmluZyBwYXJzaW5nLlxuXHQgKi9cblx0aG90c2l0ZVBhdGg/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBBZGRpdGlvbmFsIHdlYiBzZXJ2ZXIgY29uZmlndXJhdGlvbi5cblx0ICovXG5cdHNlcnZlcj86IHtcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIGRlZmF1bHQgbmFtZSBmb3IgYSBzZXJ2ZWQgSG90dCBmaWxlLlxuXHRcdFx0ICovXG5cdFx0XHRuYW1lPzogc3RyaW5nO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBTZXJ2ZSBob3R0IGZpbGVzIHdoZW4gcmVxdWVzdGVkLlxuXHRcdFx0ICovXG5cdFx0XHRzZXJ2ZUhvdHRGaWxlcz86IGJvb2xlYW47XG5cdFx0XHQvKipcblx0XHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBBUEkgdG8gaW50ZXJmYWNlIHdpdGggYWNyb3NzIGFsbCBwYWdlcy5cblx0XHRcdCAqL1xuXHRcdFx0Z2xvYmFsQXBpPzogc3RyaW5nO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgYmFzZSB1cmwgZm9yIHRoZSBzZXJ2ZXIuXG5cdFx0XHQgKi9cblx0XHRcdHVybD86IHN0cmluZztcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIEphdmFTY3JpcHQgc291cmNlIHBhdGguXG5cdFx0XHQgKi9cblx0XHRcdGpzU3JjUGF0aD86IHN0cmluZztcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIHBvcnRzIHRvIHVzZS5cblx0XHRcdCAqL1xuXHRcdFx0cG9ydHM/OiB7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIEhUVFAgcG9ydCB0byBzZXJ2ZSBvbi5cblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRodHRwPzogbnVtYmVyO1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIFRoZSBIVFRQUyBwb3J0IHRvIHNlcnZlIG9uLlxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdGh0dHBzPzogbnVtYmVyO1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIElmIHNldCB0byB0cnVlLCB0aGlzIHdpbGwgcmVkaXJlY3QgZnJvbSBIVFRQIHRvIEhUVFBTLlxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdHJlZGlyZWN0SFRUUHRvSFRUUFM/OiBib29sZWFuO1xuXHRcdFx0XHR9O1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgbGlzdCBvZiBkaXJlY3RvcnkgdG8gc2VydmUgdG8gdGhlIGNsaWVudCBmcm9tIHRoZSBzZXJ2ZXIuXG5cdFx0XHQgKi9cblx0XHRcdHNlcnZlRGlyZWN0b3JpZXM/OiB7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIHdlYiByb3V0ZSB0byB0YWtlLlxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdHJvdXRlOiBzdHJpbmc7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIGxvY2FsIGZpbGVzeXN0ZW0gcGF0aCB0byBzZXJ2ZSBwYWdlcyBmcm9tLlxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdGxvY2FsUGF0aDogc3RyaW5nO1xuXHRcdFx0XHR9W107XG5cdFx0fTtcblx0LyoqXG5cdCAqIFRlc3RpbmcgcmVsYXRlZCBmdW5jdGlvbmFsaXR5LlxuXHQgKi9cblx0dGVzdGluZz86IHtcblx0XHRcdHdlYj86IHtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSB0ZXN0ZXIgY2xhc3MgdG8gdXNlLiBFWDogSG90VGVzdGVyTW9jaGFTZWxlbml1bVxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGVzdGVyPzogc3RyaW5nO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogVGhlIG5hbWUgb2YgdGhlIHRlc3RlciB0byB1c2UuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHR0ZXN0ZXJOYW1lPzogc3RyaW5nO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogSWYgc2V0IHRvIHRydWUsIHRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgdGVzdGVyLlxuXHRcdFx0XHQgKiBEZWZhdWx0IFZhbHVlOiB0cnVlXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRjcmVhdGVOZXdUZXN0ZXI/OiBib29sZWFuO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogVGhlIHVybCB0aGF0IGNvbm5lY3RzIHRvIHRoZSB0ZXN0ZXIgYXBpIHNlcnZlci5cblx0XHRcdFx0ICovXG5cdFx0XHRcdHRlc3RlckFQSVVybD86IHN0cmluZztcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0IGRyaXZlciB0byB1c2UuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRkcml2ZXI/OiBzdHJpbmc7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgdXJsIHRvIHRoZSBodG1sIHRoYXQgbG9hZHMgdGhlIGhvdHQgZmlsZXMuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRsYXVuY2hwYWRVcmw/OiBzdHJpbmc7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgbWFwcyB0byB0ZXN0IGluIG9yZGVyLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0bWFwcz86IHN0cmluZ1tdO1xuXHRcdFx0fSxcblx0XHRcdGFwaT86IHtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSB0ZXN0ZXIgY2xhc3MgdG8gdXNlLiBFWDogSG90VGVzdGVyTW9jaGFcblx0XHRcdFx0ICovXG5cdFx0XHRcdHRlc3Rlcj86IHN0cmluZztcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0ZXIgdG8gdXNlLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGVzdGVyTmFtZT86IHN0cmluZztcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIElmIHNldCB0byB0cnVlLCB0aGlzIHdpbGwgY3JlYXRlIGEgbmV3IHRlc3Rlci5cblx0XHRcdFx0ICogRGVmYXVsdCBWYWx1ZTogdHJ1ZVxuXHRcdFx0XHQgKi9cblx0XHRcdFx0Y3JlYXRlTmV3VGVzdGVyPzogYm9vbGVhbjtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSB1cmwgdGhhdCBjb25uZWN0cyB0byB0aGUgdGVzdGVyIGFwaSBzZXJ2ZXIuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHR0ZXN0ZXJBUElVcmw/OiBzdHJpbmc7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgdGVzdCBkcml2ZXIgdG8gdXNlLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0ZHJpdmVyPzogc3RyaW5nO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogVGhlIHVybCB0byB0aGUgaHRtbCB0aGF0IGxvYWRzIHRoZSBob3R0IGZpbGVzLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0bGF1bmNocGFkVXJsPzogc3RyaW5nO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogVGhlIG1hcHMgdG8gdGVzdCBpbiBvcmRlci5cblx0XHRcdFx0ICovXG5cdFx0XHRcdG1hcHM/OiBzdHJpbmdbXTtcblx0XHRcdH1cblx0XHR9O1xuXHQvKipcblx0ICogVGhlIHJvdXRlcyB0byBsb2FkLlxuXHQgKi9cblx0cm91dGVzPzoge1xuXHRcdFx0W3JvdXRlTmFtZTogc3RyaW5nXTogSG90U2l0ZVJvdXRlO1xuXHRcdH07XG5cdC8qKlxuXHQgKiBUaGUgYXZhaWxhYmxlIEFQSXMgb24gdGhlIHNlcnZlci4gVGhlIHNlcnZlciBtdXN0IGFscmVhZHkgaGF2ZSB0aGVzZSBcblx0ICogbG9hZGVkLlxuXHQgKi9cblx0YXBpcz86IHtcblx0XHRcdFtuYW1lOiBzdHJpbmddOiB7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIEpTIEFQSSBmaWxlIHRvIGxvYWQuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0anNhcGk/OiBzdHJpbmc7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIGV4cG9ydGVkIEpTIGxpYnJhcnkgbmFtZSB0byB1c2UuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0bGlicmFyeU5hbWU/OiBzdHJpbmc7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIG5hbWUgb2YgdGhlIGFwaSB0byB1c2UuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0YXBpTmFtZT86IHN0cmluZztcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgcG9ydCB0byB1c2UuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0cG9ydD86IG51bWJlcjtcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgcHVibGljIGJhc2UgdXJsIGZvciB0aGUgYXBpLlxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdHVybD86IHN0cmluZztcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBUaGUgc2VydmVyLXNpZGUgZmlsZXBhdGggZm9yIHRoZSBhcGkuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0ZmlsZXBhdGg/OiBzdHJpbmc7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIG1hcHMgdG8gdGVzdCBpbiBvcmRlci5cblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRtYXA/OiBzdHJpbmdbXTtcblx0XHRcdFx0fTtcblx0XHR9O1xuXHQvKipcblx0ICogU2VjcmV0cyB0aGF0IGNhbiBiZSBwdWJsaWNseSBlbWJlZGRlZCBpbnRvIHRoZSBwYWdlLlxuXHQgKi9cblx0cHVibGljU2VjcmV0cz86IHtcblx0XHRcdFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCB7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIGtleSBvZiBhbiBBUEkgc2VjcmV0IHRvIHBhc3MgdG8gdGhlIHNpdGUgdG8gXG5cdFx0XHRcdFx0ICogYmUgdXNlZCBwdWJsaWNseS5cblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRwYXNzU2VjcmV0RnJvbUFQST86IHN0cmluZztcblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBHZXQgdGhlIHB1YmxpYyBzZWNyZXQgZnJvbSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS5cblx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRlbnY/OiBzdHJpbmc7XG5cdFx0XHRcdH07XG5cdFx0fTtcblx0LyoqXG5cdCAqIFRoZSBjb21wb25lbnRzIHRvIGxvYWQgYW5kIHJlZ2lzdGVyLlxuXHQgKi9cblx0Y29tcG9uZW50cz86IHtcblx0XHRcdFtuYW1lOiBzdHJpbmddOiB7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIHVybCB0byB0aGUgY29tcG9uZW50IHRvIGxvYWQgYW5kIHJlZ2lzdGVyLlxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdHVybDogc3RyaW5nO1xuXHRcdFx0XHR9O1xuXHRcdH07XG5cdC8qKlxuXHQgKiBUaGUgZmlsZXMgdG8gbG9hZCBhbmQgc2F2ZSBpbiBtZW1vcnkuXG5cdCAqL1xuXHRmaWxlcz86IHtcblx0XHRcdFtuYW1lOiBzdHJpbmddOiB7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogVGhlIHVybCB0byB0aGUgZmlsZSB0byBsb2FkLlxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdHVybDogc3RyaW5nO1xuXHRcdFx0XHR9O1xuXHRcdH07XG59XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgdG8gdXNlIHdoZW4gc3RhcnRpbmcgYSBwYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvdFN0YXJ0T3B0aW9uc1xue1xuXHQvKipcblx0ICogVGhlIEhvdHQgc2l0ZSB0byBsb2FkLlxuXHQgKi9cblx0dXJsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcGFnZSB0byBsb2FkLlxuXHQgKi9cblx0bmFtZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBwcm9jZXNzb3IgdG8gdXNlIHRvIGxvYWQgdGhlIHBhZ2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I/OiBIb3RTdGFxO1xuXHQvKipcblx0ICogQW55IGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBuZXcgcGFnZS5cblx0ICovXG5cdGFyZ3M/OiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgdGVzdGVyIHRvIHVzZS5cblx0ICovXG5cdHRlc3Rlck5hbWU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgdGVzdGVyIG1hcCB0byB1c2UuXG5cdCAqL1xuXHR0ZXN0ZXJNYXA/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYmFzZSB1cmwgZm9yIHRoZSB0ZXN0ZXIgYXBpLlxuXHQgKi9cblx0dGVzdGVyQVBJQmFzZVVybD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB1cmwgdG8gdGhlIGh0bWwgdGhhdCBsb2FkcyB0aGUgaG90dCBmaWxlIHRoYXQncyBcblx0ICogcG9pbnRlZCBhdCB0aGUgdXJsIGFib3ZlLlxuXHQgKi9cblx0dGVzdGVyTGF1bmNocGFkVXJsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBtYWluIGNsYXNzIHRoYXQgaGFuZGxlcyBhbGwgSFRNTCBwcmVwcm9jZXNzaW5nLCB0aGVuIG91dHB1dHMgdGhlIFxuICogcmVzdWx0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG90U3RhcVxue1xuXHQvKipcblx0ICogVGhlIGFwaSB0aGF0J3MgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoLlxuXHQgKi9cblx0YXBpPzogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIHRlc3RlciBhcGkgdGhhdCdzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aC5cblx0ICovXG5cdHRlc3RlckFQST86IEhvdEFQSTtcblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGF0IHR5cGUgb2YgZXhlY3V0aW9uIHRoaXMgaXMuXG5cdCAqL1xuXHRtb2RlPzogRGV2ZWxvcGVyTW9kZTtcblx0LyoqXG5cdCAqIFRoZSBwYWdlcyB0aGF0IGNhbiBiZSBjb25zdHJ1Y3RlZC5cblx0ICovXG5cdHBhZ2VzPzogeyBbbmFtZTogc3RyaW5nXTogSG90UGFnZSB9O1xuXHQvKipcblx0ICogVGhlIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgY29uc3RydWN0ZWQuXG5cdCAqL1xuXHRjb21wb25lbnRzPzogeyBbbmFtZTogc3RyaW5nXTogSG90Q29tcG9uZW50IH07XG5cdC8qKlxuXHQgKiBUaGUgZmlsZXMgdGhhdCBjYW4gYmUgc3RvcmVkIGZvciBsYXRlciB1c2UuXG5cdCAqL1xuXHRmaWxlcz86IHsgW25hbWU6IHN0cmluZ106IEhvdEZpbGUgfTtcblx0LyoqXG5cdCAqIFRoZSBsb2FkZWQgaG90c2l0ZS5cblx0ICovXG5cdGhvdFNpdGU/OiBIb3RTaXRlO1xufVxuXG4vKipcbiAqIFRoZSBtYWluIGNsYXNzIHRoYXQgaGFuZGxlcyBhbGwgSFRNTCBwcmVwcm9jZXNzaW5nLCB0aGVuIG91dHB1dHMgdGhlIFxuICogcmVzdWx0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFN0YXEgaW1wbGVtZW50cyBJSG90U3RhcVxue1xuXHQvKipcblx0ICogSW5kaWNhdGVzIGlmIHRoaXMgaXMgYSB3ZWIgYnVpbGQuXG5cdCAqL1xuXHRzdGF0aWMgaXNXZWI6IGJvb2xlYW4gPSBmYWxzZTtcblx0LyoqXG5cdCAqIEluZGljYXRlcyBpZiB0aGlzIGlzIHJlYWR5IGZvciB0ZXN0aW5nLlxuXHQgKi9cblx0c3RhdGljIGlzUmVhZHlGb3JUZXN0aW5nOiBib29sZWFuID0gZmFsc2U7XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB0aGlzIGV2ZW50IHdoZW4gdGhpcyBwYWdlIGlzIHJlYWR5IGZvciB0ZXN0aW5nLlxuXHQgKi9cblx0c3RhdGljIG9uUmVhZHlGb3JUZXN0aW5nOiAoKSA9PiBQcm9taXNlPHZvaWQ+ID0gbnVsbDtcblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGF0IHR5cGUgb2YgZXhlY3V0aW9uIHRoaXMgaXMuXG5cdCAqL1xuXHRtb2RlOiBEZXZlbG9wZXJNb2RlO1xuXHQvKipcblx0ICogVGhlIGFwaSB0aGF0J3MgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoLlxuXHQgKi9cblx0YXBpOiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgdGVzdGVyIGFwaSB0aGF0J3MgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoLlxuXHQgKi9cblx0dGVzdGVyQVBJOiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgcGFnZXMgdGhhdCBjYW4gYmUgY29uc3RydWN0ZWQuXG5cdCAqL1xuXHRwYWdlczogeyBbbmFtZTogc3RyaW5nXTogSG90UGFnZSB9O1xuXHQvKipcblx0ICogVGhlIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgY29uc3RydWN0ZWQuXG5cdCAqL1xuXHRjb21wb25lbnRzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RDb21wb25lbnQgfTtcblx0LyoqXG5cdCAqIFRoZSBmaWxlcyB0aGF0IGNhbiBiZSBzdG9yZWQgZm9yIGxhdGVyIHVzZS5cblx0ICovXG5cdGZpbGVzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RGaWxlIH07XG5cdC8qKlxuXHQgKiBUaGUgbG9hZGVkIGhvdHNpdGUuXG5cdCAqL1xuXHRob3RTaXRlOiBIb3RTaXRlO1xuXHQvKipcblx0ICogVGhlIGFwaSBjb250ZW50IHRvIHVzZSB3aGVuIGFib3V0IHRvIGxvYWQgSG90U3RhcS5cblx0ICovXG5cdGFwaUNvbnRlbnQ6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB0ZXN0ZXIgYXBpIGNvbnRlbnQgdG8gdXNlIHdoZW4gYWJvdXQgdG8gbG9hZCBIb3RTdGFxLlxuXHQgKi9cblx0dGVzdGVyQXBpQ29udGVudDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHBhZ2UgY29udGVudCB0byB1c2Ugd2hlbiBhYm91dCB0byBsb2FkIEhvdFN0YXEuXG5cdCAqL1xuXHRwYWdlQ29udGVudDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGxvZ2dlci5cblx0ICovXG5cdGxvZ2dlcjogSG90TG9nO1xuXHQvKipcblx0ICogVGhlIHNlY3JldHMgdGhhdCBjYW4gYmUgZXhwb3NlZCBwdWJsaWNseS5cblx0ICovXG5cdHB1YmxpY1NlY3JldHM6IGFueTtcblx0LyoqXG5cdCAqIFRoZSBzZWNyZXRzIHRoYXQgY2FuIGJlIGV4cG9zZWQgcHVibGljbHkuXG5cdCAqL1xuXHR0ZXN0ZXJzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0ZXIgfTtcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSUhvdFN0YXEgPSB7fSlcblx0e1xuXHRcdHRoaXMuYXBpID0gY29weS5hcGkgfHwgbnVsbDtcblx0XHR0aGlzLnRlc3RlckFQSSA9IGNvcHkudGVzdGVyQVBJIHx8IG51bGw7XG5cdFx0dGhpcy5tb2RlID0gY29weS5tb2RlIHx8IERldmVsb3Blck1vZGUuUHJvZHVjdGlvbjtcblx0XHR0aGlzLnBhZ2VzID0gY29weS5wYWdlcyB8fCB7fTtcblx0XHR0aGlzLmNvbXBvbmVudHMgPSBjb3B5LmNvbXBvbmVudHMgfHwge307XG5cdFx0dGhpcy5maWxlcyA9IGNvcHkuZmlsZXMgfHwge307XG5cdFx0dGhpcy5ob3RTaXRlID0gY29weS5ob3RTaXRlIHx8IG51bGw7XG5cdFx0dGhpcy5hcGlDb250ZW50ID0gYFxuXHRcdFx0dmFyICVhcGlfbmFtZSUgPSAlYXBpX2V4cG9ydGVkX25hbWUlLiVhcGlfbmFtZSU7XG5cdFx0XHR2YXIgbmV3SG90Q2xpZW50ID0gbmV3IEhvdENsaWVudCAocHJvY2Vzc29yKTtcblx0XHRcdHZhciBuZXdhcGkgPSBuZXcgJWFwaV9uYW1lJSAoJWJhc2VfdXJsJSwgbmV3SG90Q2xpZW50KTtcblx0XHRcdG5ld0hvdENsaWVudC5hcGkgPSBuZXdhcGk7XG5cdFx0XHRwcm9jZXNzb3IuYXBpID0gbmV3YXBpO2A7XG5cdFx0dGhpcy50ZXN0ZXJBcGlDb250ZW50ID0gYFxuXHRcdFx0dmFyIEhvdFRlc3RlckFQSSA9IEhvdFN0YXFXZWIuSG90VGVzdGVyQVBJO1xuXHRcdFx0dmFyIG5ld0hvdFRlc3RlckNsaWVudCA9IG5ldyBIb3RDbGllbnQgKHByb2Nlc3Nvcik7XG5cdFx0XHR2YXIgbmV3dGVzdGVyYXBpID0gbmV3IEhvdFRlc3RlckFQSSAoJWJhc2VfdGVzdGVyX3VybCUsIG5ld0hvdFRlc3RlckNsaWVudCk7XG5cdFx0XHRuZXdIb3RUZXN0ZXJDbGllbnQudGVzdGVyQVBJID0gbmV3dGVzdGVyYXBpO1xuXHRcdFx0cHJvY2Vzc29yLnRlc3RlckFQSSA9IG5ld3Rlc3RlcmFwaTtgO1xuXHRcdHRoaXMucGFnZUNvbnRlbnQgPSBcbmA8IURPQ1RZUEUgaHRtbD5cbjxodG1sPlxuXG48aGVhZD5cblx0PHRpdGxlPiV0aXRsZSU8L3RpdGxlPlxuXG5cdDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCIgc3JjID0gXCIlaG90c3RhcV9qc19zcmMlXCI+PC9zY3JpcHQ+XG5cdDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI+XG5cdFx0d2luZG93LkhvdFN0YXEgPSBIb3RTdGFxV2ViLkhvdFN0YXE7XG5cdFx0d2luZG93LkhvdENsaWVudCA9IEhvdFN0YXFXZWIuSG90Q2xpZW50O1xuXHRcdHdpbmRvdy5Ib3RBUEkgPSBIb3RTdGFxV2ViLkhvdEFQSTtcblx0XHR3aW5kb3cuSG90ID0gSG90U3RhcVdlYi5Ib3Q7XG5cdDwvc2NyaXB0PlxuXG4lYXBpc190b19sb2FkJVxuXG5cdDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI+XG5cdFx0ZnVuY3Rpb24gaG90c3RhcV9zdGFydEFwcCAoKVxuXHRcdHtcblx0XHRcdGxldCB0ZW1wTW9kZSA9IDA7XG5cblx0XHRcdGlmICh3aW5kb3dbXCJIb3RcIl0gIT0gbnVsbClcblx0XHRcdFx0dGVtcE1vZGUgPSBIb3QuTW9kZTtcblxuXHRcdFx0JWxvYWRfaG90X3NpdGUlXG5cblx0XHRcdHZhciBwcm9jZXNzb3IgPSBuZXcgSG90U3RhcSAoKTtcblx0XHRcdHZhciBwcm9taXNlcyA9IFtdO1xuXHRcdFx0JWRldmVsb3Blcl9tb2RlJVxuXG5cdFx0XHQlYXBpX2NvZGUlXG5cblx0XHRcdCVwdWJsaWNfc2VjcmV0cyVcblx0XHRcdCV0ZXN0ZXJfYXBpJVxuXHRcdFx0JWxvYWRfZmlsZXMlXG5cblx0XHRcdHByb2Nlc3Nvci5tb2RlID0gdGVtcE1vZGU7XG5cblx0XHRcdFByb21pc2UuYWxsIChwcm9taXNlcykudGhlbiAoZnVuY3Rpb24gKClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdEhvdFN0YXEuZGlzcGxheVVybCAoe1xuXHRcdFx0XHRcdFx0XHR1cmw6IFwiJXVybCVcIixcblx0XHRcdFx0XHRcdFx0bmFtZTogXCIldGl0bGUlXCIsXG5cdFx0XHRcdFx0XHRcdHByb2Nlc3NvcjogcHJvY2Vzc29yLFxuXHRcdFx0XHRcdFx0XHRhcmdzOiAlYXJncyUsXG5cdFx0XHRcdFx0XHRcdHRlc3Rlck5hbWU6ICV0ZXN0ZXJfbmFtZSUsXG5cdFx0XHRcdFx0XHRcdHRlc3Rlck1hcDogJXRlc3Rlcl9tYXAlLFxuXHRcdFx0XHRcdFx0XHR0ZXN0ZXJBUElCYXNlVXJsOiAldGVzdGVyX2FwaV9iYXNlX3VybCUsXG5cdFx0XHRcdFx0XHRcdHRlc3RlckxhdW5jaHBhZFVybDogJXRlc3Rlcl9sYXVuY2hwYWRfdXJsJVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGhvdHN0YXFfc3RhcnRBcHAgKCk7XG5cdDwvc2NyaXB0PlxuPC9oZWFkPlxuXG48Ym9keT5cbjwvYm9keT5cblxuPC9odG1sPmA7XG5cdFx0dGhpcy5sb2dnZXIgPSBuZXcgSG90TG9nIChIb3RMb2dMZXZlbC5Ob25lKTtcblx0XHR0aGlzLnB1YmxpY1NlY3JldHMgPSB7fTtcblx0XHR0aGlzLnRlc3RlcnMgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQYXJzZSBhIGJvb2xlYW4gdmFsdWUuXG5cdCAqL1xuXHRzdGF0aWMgcGFyc2VCb29sZWFuICh2YWx1ZTogc3RyaW5nKTogYm9vbGVhblxuXHR7XG5cdFx0dmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSAoKTtcblxuXHRcdGlmICh2YWx1ZSA9PT0gXCJ0cnVlXCIpXG5cdFx0XHRyZXR1cm4gKHRydWUpO1xuXG5cdFx0aWYgKHZhbHVlID09PSBcImZhbHNlXCIpXG5cdFx0XHRyZXR1cm4gKGZhbHNlKTtcblxuXHRcdGlmICh2YWx1ZSA9PT0gXCJ5ZXNcIilcblx0XHRcdHJldHVybiAodHJ1ZSk7XG5cblx0XHRpZiAodmFsdWUgPT09IFwibm9cIilcblx0XHRcdHJldHVybiAoZmFsc2UpO1xuXG5cdFx0aWYgKHZhbHVlID09PSBcInllcFwiKVxuXHRcdFx0cmV0dXJuICh0cnVlKTtcblxuXHRcdGlmICh2YWx1ZSA9PT0gXCJuYWhcIilcblx0XHRcdHJldHVybiAoZmFsc2UpO1xuXG5cdFx0dHJ5XG5cdFx0e1xuXHRcdFx0aWYgKHBhcnNlSW50ICh2YWx1ZSkgIT0gMClcblx0XHRcdFx0cmV0dXJuICh0cnVlKTtcblx0XHR9XG5cdFx0Y2F0Y2ggKGV4KVxuXHRcdHtcblx0XHR9XG5cblx0XHRyZXR1cm4gKGZhbHNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBhIHJlcXVpcmVkIHBhcmFtZXRlciBleGlzdHMgaW5zaWRlIGFuIG9iamVjdC4gSWYgaXQgZXhpc3RzLCByZXR1cm4gdGhlIHZhbHVlLlxuXHQgKi9cblx0c3RhdGljIGdldFBhcmFtIChuYW1lOiBzdHJpbmcsIG9ialdpdGhQYXJhbTogYW55LCByZXF1aXJlZDogYm9vbGVhbiA9IHRydWUsIHRocm93RXhjZXB0aW9uOiBib29sZWFuID0gdHJ1ZSk6IGFueVxuXHR7XG5cdFx0bGV0IHZhbHVlOiBhbnkgPSBvYmpXaXRoUGFyYW1bbmFtZV07XG5cblx0XHRpZiAodmFsdWUgPT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAocmVxdWlyZWQgPT09IHRydWUpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0aHJvd0V4Y2VwdGlvbiA9PT0gdHJ1ZSlcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciAke25hbWV9LmApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHRpZiAocmVxdWlyZWQgPT09IHRydWUpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh2YWx1ZSA9PT0gXCJcIilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0aHJvd0V4Y2VwdGlvbiA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYE1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyICR7bmFtZX0uYCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gKHZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBhIHJlcXVpcmVkIHBhcmFtZXRlciBleGlzdHMgaW5zaWRlIGFuIG9iamVjdC4gSWYgaXQgZXhpc3RzLCByZXR1cm4gdGhlIHZhbHVlLlxuXHQgKiBJZiBpdCBkb2VzIG5vdCBleGlzdCwgcmV0dXJuIGEgZGVmYXVsdCB2YWx1ZSBpbnN0ZWFkLlxuXHQgKi9cblx0c3RhdGljIGdldFBhcmFtRGVmYXVsdCAobmFtZTogc3RyaW5nLCBvYmpXaXRoUGFyYW06IGFueSwgZGVmYXVsdFZhbHVlOiBhbnkpOiBhbnlcblx0e1xuXHRcdGxldCB2YWx1ZTogYW55ID0gb2JqV2l0aFBhcmFtW25hbWVdO1xuXG5cdFx0aWYgKHZhbHVlID09IG51bGwpXG5cdFx0XHRyZXR1cm4gKGRlZmF1bHRWYWx1ZSk7XG5cblx0XHRpZiAodHlwZW9mICh2YWx1ZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0aWYgKHZhbHVlID09PSBcIlwiKVxuXHRcdFx0XHRyZXR1cm4gKGRlZmF1bHRWYWx1ZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICh2YWx1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogV2FpdCBmb3IgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIHdhaXQgKG51bU1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0cmV0dXJuIChhd2FpdCBuZXcgUHJvbWlzZSAoKHJlc29sdmUsIHJlamVjdCkgPT5cblx0XHRcdHtcblx0XHRcdFx0c2V0VGltZW91dCAoKCkgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXNvbHZlICgpO1xuXHRcdFx0XHRcdH0sIG51bU1pbGxpc2Vjb25kcyk7XG5cdFx0XHR9KSk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgcGFnZS5cblx0ICovXG5cdGFkZFBhZ2UgKHBhZ2U6IEhvdFBhZ2UpOiB2b2lkXG5cdHtcblx0XHR0aGlzLnBhZ2VzW3BhZ2UubmFtZV0gPSBwYWdlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHBhZ2UgdG8gcHJvY2Vzcy5cblx0ICovXG5cdGdldFBhZ2UgKHBhZ2VOYW1lOiBzdHJpbmcpOiBIb3RQYWdlXG5cdHtcblx0XHRyZXR1cm4gKHRoaXMucGFnZXNbcGFnZU5hbWVdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSBmaWxlLlxuXHQgKi9cblx0YWRkRmlsZSAoZmlsZTogSG90RmlsZSk6IHZvaWRcblx0e1xuXHRcdGxldCBuYW1lOiBzdHJpbmcgPSBmaWxlLm5hbWU7XG5cblx0XHRpZiAobmFtZSA9PT0gXCJcIilcblx0XHRcdG5hbWUgPSBmaWxlLmxvY2FsRmlsZTtcblxuXHRcdGlmIChuYW1lID09PSBcIlwiKVxuXHRcdFx0bmFtZSA9IGZpbGUudXJsO1xuXG5cdFx0dGhpcy5maWxlc1tuYW1lXSA9IGZpbGU7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgZmlsZS5cblx0ICovXG5cdGdldEZpbGUgKG5hbWU6IHN0cmluZyk6IEhvdEZpbGVcblx0e1xuXHRcdGlmICh0aGlzLmZpbGVzW25hbWVdID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBVbmFibGUgdG8gZmluZCBmaWxlICR7bmFtZX1gKTtcblxuXHRcdHJldHVybiAodGhpcy5maWxlc1tuYW1lXSk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGFuZCByZWdpc3RlciBhIGNvbXBvbmVudC5cblx0ICovXG5cdGFkZENvbXBvbmVudCAoY29tcG9uZW50OiBIb3RDb21wb25lbnQpOiB2b2lkXG5cdHtcblx0XHR0aGlzLmNvbXBvbmVudHNbY29tcG9uZW50Lm5hbWVdID0gY29tcG9uZW50O1xuXHRcdHRoaXMucmVnaXN0ZXJDb21wb25lbnQgKGNvbXBvbmVudCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVnaXN0ZXIgYSBjb21wb25lbnQgZm9yIHVzZSBhcyBhIEhUTUwgdGFnLlxuXHQgKi9cblx0cmVnaXN0ZXJDb21wb25lbnQgKGNvbXBvbmVudDogSG90Q29tcG9uZW50KTogdm9pZFxuXHR7XG5cdFx0Y3VzdG9tRWxlbWVudHMuZGVmaW5lIChjb21wb25lbnQudGFnLCBjbGFzcyBleHRlbmRzIEhUTUxFbGVtZW50XG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0cnVjdG9yICgpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRzdXBlciAoKTtcblxuXHRcdFx0XHRcdC8vLyBAZml4bWUgSXMgdGhpcyBiYWQ/IENvdWxkIGNyZWF0ZSByYWNlIGNvbmRpdGlvbnMuXG5cdFx0XHRcdFx0KGFzeW5jICgpID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dGhpcy5vbmNsaWNrID0gY29tcG9uZW50LmNsaWNrLmJpbmQgKGNvbXBvbmVudCk7XG5cblx0XHRcdFx0XHRcdGZvciAobGV0IGtleSBpbiBjb21wb25lbnQuZXZlbnRzKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRsZXQgZXZlbnQgPSBjb21wb25lbnQuZXZlbnRzW2tleV07XG5cblx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHR0aGlzLmFkZEV2ZW50TGlzdGVuZXIgKGV2ZW50LnR5cGUsIGV2ZW50LmZ1bmMsIGV2ZW50Lm9wdGlvbnMpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjb21wb25lbnQuaHRtbEVsZW1lbnQgPSBhd2FpdCBjb21wb25lbnQub25DcmVhdGVkICh0aGlzKTtcblxuXHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudC5oYW5kbGVBdHRyaWJ1dGVzICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdGF3YWl0IGNvbXBvbmVudC5oYW5kbGVBdHRyaWJ1dGVzICh0aGlzLmF0dHJpYnV0ZXMpO1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxldCBhdHRyOiBBdHRyID0gdGhpcy5hdHRyaWJ1dGVzW2lJZHhdO1xuXHRcdFx0XHRcdFx0XHRcdGxldCBhdHRyTmFtZTogc3RyaW5nID0gYXR0ci5uYW1lLnRvTG93ZXJDYXNlICgpO1xuXHRcdFx0XHRcdFx0XHRcdGxldCBhdHRyVmFsdWU6IHN0cmluZyA9IGF0dHIudmFsdWU7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoYXR0ck5hbWUgPT09IFwiaWRcIilcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudC5uYW1lID0gYXR0clZhbHVlO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGF0dHJOYW1lID09PSBcIm5hbWVcIilcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudC5uYW1lID0gYXR0clZhbHVlO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGF0dHJOYW1lID09PSBcInZhbHVlXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wb25lbnQudmFsdWUgPSBhdHRyVmFsdWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0bGV0IHN0cjogc3RyaW5nID0gYXdhaXQgY29tcG9uZW50Lm91dHB1dCAoKTtcblx0XHRcdFx0XHRcdGxldCBuZXdET006IERvY3VtZW50ID0gbmV3IERPTVBhcnNlciAoKS5wYXJzZUZyb21TdHJpbmcgKHN0ciwgXCJ0ZXh0L2h0bWxcIik7XG5cdFx0XHRcdFx0XHRsZXQgc2hhZG93OiBTaGFkb3dSb290ID0gdGhpcy5hdHRhY2hTaGFkb3cgKHsgbW9kZTogXCJvcGVuXCIgfSk7XG5cblx0XHRcdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgbmV3RE9NLmJvZHkuY2hpbGRyZW4ubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBjaGlsZCA9IG5ld0RPTS5ib2R5LmNoaWxkcmVuW2lJZHhdO1xuXHRcdFx0XHRcdFx0XHRzaGFkb3cuYXBwZW5kQ2hpbGQgKGNoaWxkKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCBjb21wb25lbnQuZWxlbWVudE9wdGlvbnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIGNvbXBvbmVudCB0byBwcm9jZXNzLlxuXHQgKi9cblx0Z2V0Q29tcG9uZW50IChuYW1lOiBzdHJpbmcpOiBIb3RDb21wb25lbnRcblx0e1xuXHRcdHJldHVybiAodGhpcy5jb21wb25lbnRzW25hbWVdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSBuZXcgSFRNTCBlbGVtZW50KHMpIHRvIHRoZSBjdXJyZW50IGRvY3VtZW50LlxuXHQgKi9cblx0c3RhdGljIGFkZEh0bWwgKHBhcmVudDogc3RyaW5nIHwgSFRNTEVsZW1lbnQsIGh0bWw6IHN0cmluZyB8IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQgfCBIVE1MRWxlbWVudFtdXG5cdHtcblx0XHRsZXQgZm91bmRQYXJlbnQ6IEhUTUxFbGVtZW50ID0gbnVsbDtcblxuXHRcdGlmICh0eXBlb2YgKHBhcmVudCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRmb3VuZFBhcmVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgKHBhcmVudCk7XG5cdFx0ZWxzZVxuXHRcdFx0Zm91bmRQYXJlbnQgPSBwYXJlbnQ7XG5cblx0XHRpZiAoZm91bmRQYXJlbnQgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYFVuYWJsZSB0byBmaW5kIHBhcmVudCAke3BhcmVudH0hYCk7XG5cblx0XHRsZXQgcmVzdWx0OiBIVE1MRWxlbWVudCA9IG51bGw7XG5cblx0XHRpZiAodHlwZW9mIChodG1sKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHRsZXQgbmV3RE9NOiBEb2N1bWVudCA9IG5ldyBET01QYXJzZXIgKCkucGFyc2VGcm9tU3RyaW5nIChodG1sLCBcInRleHQvaHRtbFwiKTtcblx0XHRcdGxldCByZXN1bHRzOiBIVE1MRWxlbWVudFtdID0gW107XG5cblx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgbmV3RE9NLmJvZHkuY2hpbGRyZW4ubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBjaGlsZDogSFRNTEVsZW1lbnQgPSAoPEhUTUxFbGVtZW50Pm5ld0RPTS5ib2R5LmNoaWxkcmVuW2lJZHhdKTtcblxuXHRcdFx0XHRyZXN1bHRzLnB1c2ggKGZvdW5kUGFyZW50LmFwcGVuZENoaWxkIChjaGlsZCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKHJlc3VsdHMpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHRyZXN1bHQgPSBmb3VuZFBhcmVudC5hcHBlbmRDaGlsZCAoaHRtbCk7XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2sgaWYgYSBIb3RTaXRlJ3MgbmFtZSBpcyB2YWxpZC5cblx0ICovXG5cdHN0YXRpYyBjaGVja0hvdFNpdGVOYW1lIChob3RzaXRlTmFtZTogc3RyaW5nLCB0aHJvd0V4Y2VwdGlvbjogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhblxuXHR7XG5cdFx0bGV0IHRocm93VGhlRXhjZXB0aW9uID0gKCkgPT5cblx0XHRcdHtcblx0XHRcdFx0aWYgKHRocm93RXhjZXB0aW9uID09PSB0cnVlKVxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFNpdGUgJHtob3RzaXRlTmFtZX0gaGFzIGFuIGludmFsaWQgbmFtZSEgVGhlIG5hbWUgY2Fubm90IGJlIGVtcHR5IGFuZCBtdXN0IGhhdmUgYSB2YWxpZCBOUE0gbW9kdWxlIG5hbWUuYCk7XG5cdFx0XHR9O1xuXG5cdFx0bGV0IHJlc3VsdHMgPSB2YWxpZGF0ZU1vZHVsZU5hbWUgKGhvdHNpdGVOYW1lKTtcblxuXHRcdGlmIChyZXN1bHRzLmVycm9ycyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmIChyZXN1bHRzLmVycm9ycy5sZW5ndGggPiAwKVxuXHRcdFx0XHR0aHJvd1RoZUV4Y2VwdGlvbiAoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluIHRoZSBzdXBwbGllZCBjb250ZW50LCByZXBsYWNlIGEga2V5IGluIGEgJHtLRVl9IHdpdGggYSB2YWx1ZS5cblx0ICogXG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZW50IHdpdGggdGhlIGNvcnJlY3QgdmFsdWVzLlxuXHQgKi9cblx0c3RhdGljIHJlcGxhY2VLZXkgKGNvbnRlbnQ6IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmdcblx0e1xuXHRcdGNvbnN0IGZpbmFsU3RyOiBzdHJpbmcgPSBjb250ZW50LnJlcGxhY2UgKG5ldyBSZWdFeHAgKGBcXFxcJFxcXFx7JHtrZXl9XFxcXH1gLCBcImdcIiksIHZhbHVlKTtcblxuXHRcdHJldHVybiAoZmluYWxTdHIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHZhbHVlIGZyb20gYSBIb3RTaXRlIG9iamVjdC5cblx0ICogXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHZhbHVlIGZyb20gdGhlIGhvdHNpdGUgb2JqZWN0LiBSZXR1cm5zIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHN0YXRpYyBnZXRWYWx1ZUZyb21Ib3RTaXRlT2JqIChob3RzaXRlOiBIb3RTaXRlLCBwYXJhbXM6IHN0cmluZ1tdKTogYW55XG5cdHtcblx0XHRsZXQgdmFsdWU6IGFueSA9IG51bGw7XG5cblx0XHRpZiAoaG90c2l0ZSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGxldCBwcmV2VmFsdWU6IGFueSA9IGhvdHNpdGU7XG5cblx0XHRcdC8vIEdvIHRocm91Z2ggZWFjaCBvYmplY3QgaW4gdGhlIGxpc3Qgb2YgcGFyYW1ldGVycyBhbmQgXG5cdFx0XHQvLyBnZXQgdGhlIHZhbHVlIG9mIHRoZSBmaW5hbCBwYXJhbWV0ZXIuXG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHBhcmFtcy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IHBhcmFtOiBzdHJpbmcgPSBwYXJhbXNbaUlkeF07XG5cblx0XHRcdFx0aWYgKHByZXZWYWx1ZVtwYXJhbV0gPT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHByZXZWYWx1ZSA9IG51bGw7XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHByZXZWYWx1ZSA9IHByZXZWYWx1ZVtwYXJhbV07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwcmV2VmFsdWUgIT0gbnVsbClcblx0XHRcdFx0dmFsdWUgPSBwcmV2VmFsdWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICh2YWx1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCBmcm9tIGEgSG90U2l0ZS5qc29uIGZpbGUuIEJlIHN1cmUgdG8gbG9hZCBhbmQgYXR0YWNoIGFueSB0ZXN0ZXJzIGJlZm9yZSBcblx0ICogbG9hZGluZyBhIEhvdFNpdGUuXG5cdCAqL1xuXHRhc3luYyBsb2FkSG90U2l0ZSAocGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IGpzb25TdHI6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHR0aGlzLmxvZ2dlci5pbmZvIChgUmV0cmlldmluZyBIb3RTaXRlICR7cGF0aH1gKTtcblxuXHRcdFx0bGV0IHJlczogYW55ID0gYXdhaXQgZmV0Y2ggKHBhdGgpO1xuXG5cdFx0XHR0aGlzLmxvZ2dlci5pbmZvIChgUmV0cmlldmVkIHNpdGUgJHtwYXRofWApO1xuXG5cdFx0XHRqc29uU3RyID0gcmVzLnRleHQgKCk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRwYXRoID0gcHBhdGgubm9ybWFsaXplIChwYXRoKTtcblxuXHRcdFx0dGhpcy5sb2dnZXIuaW5mbyAoYFJldHJpZXZpbmcgSG90U2l0ZSAke3BhdGh9YCk7XG5cblx0XHRcdGpzb25TdHIgPSBhd2FpdCBuZXcgUHJvbWlzZSAoXG5cdFx0XHRcdChyZXNvbHZlOiBhbnksIHJlamVjdDogYW55KTogdm9pZCA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZnMucmVhZEZpbGUgKHBhdGgsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbiwgZGF0YTogQnVmZmVyKTogdm9pZCA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAoZXJyICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0dGhyb3cgZXJyO1xuXHRcblx0XHRcdFx0XHRcdFx0bGV0IGNvbnRlbnQ6IHN0cmluZyA9IGRhdGEudG9TdHJpbmcgKCk7XG5cblx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIuaW5mbyAoYFJldHJpZXZlZCBzaXRlICR7cGF0aH1gKTtcblx0XG5cdFx0XHRcdFx0XHRcdHJlc29sdmUgKGNvbnRlbnQpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHRoaXMuaG90U2l0ZSA9IEpTT04ucGFyc2UgKGpzb25TdHIpO1xuXG5cdFx0SG90U3RhcS5jaGVja0hvdFNpdGVOYW1lICh0aGlzLmhvdFNpdGUubmFtZSwgdHJ1ZSk7XG5cblx0XHR0aGlzLmhvdFNpdGUuaG90c2l0ZVBhdGggPSBwYXRoO1xuXHRcdGxldCByb3V0ZXMgPSB0aGlzLmhvdFNpdGUucm91dGVzO1xuXHRcdGxldCB0ZXN0ZXJVcmw6IHN0cmluZyA9IFwiaHR0cDovLzEyNy4wLjAuMTo4MTgyXCI7XG5cdFx0bGV0IHRlc3RlcjogSG90VGVzdGVyID0gbnVsbDtcblx0XHRsZXQgZHJpdmVyOiBIb3RUZXN0RHJpdmVyID0gbnVsbDtcblxuXHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSBmYWxzZSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3RpbmcgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBzZXR1cFRlc3RlciA9IChwYXJlbnRPYmo6IGFueSkgPT4gXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBjcmVhdGVOZXdUZXN0ZXI6IGJvb2xlYW4gPSB0cnVlO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRpZiAocGFyZW50T2JqLmNyZWF0ZU5ld1Rlc3RlciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdGNyZWF0ZU5ld1Rlc3RlciA9IHBhcmVudE9iai5jcmVhdGVOZXdUZXN0ZXI7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdGxldCB0ZXN0ZXJOYW1lOiBzdHJpbmcgPSBcIlRlc3RlclwiO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRpZiAocGFyZW50T2JqLnRlc3RlciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdHRlc3Rlck5hbWUgPSBwYXJlbnRPYmoudGVzdGVyO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRpZiAocGFyZW50T2JqLnRlc3Rlck5hbWUgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXJOYW1lID0gcGFyZW50T2JqLnRlc3Rlck5hbWU7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdGlmIChjcmVhdGVOZXdUZXN0ZXIgPT09IHRydWUpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHQvLy8gQGZpeG1lIEZpbmQgYSB3YXkgdG8gc2VjdXJlbHkgYWxsb3cgZGV2cyB0byB1c2UgdGhlaXIgb3duIGRyaXZlcnMgYW5kIHRlc3RlcnMuLi5cblx0XHRcdFx0XHRcdFx0XHQvLy8gQGZpeG1lIEhhY2sgZm9yIGRlYWxpbmcgd2l0aCBXZWJQYWNrJ3MgYnMuXG5cdFx0XHRcdFx0XHRcdFx0SG90VGVzdGVyTW9jaGEgPSByZXF1aXJlIChcIi4vSG90VGVzdGVyTW9jaGFcIikuSG90VGVzdGVyTW9jaGE7XG5cdFx0XHRcdFx0XHRcdFx0SG90VGVzdGVyTW9jaGFTZWxlbml1bSA9IHJlcXVpcmUgKFwiLi9Ib3RUZXN0ZXJNb2NoYVNlbGVuaXVtXCIpLkhvdFRlc3Rlck1vY2hhU2VsZW5pdW07XG5cdFx0XHRcdFx0XHRcdFx0SG90VGVzdFNlbGVuaXVtRHJpdmVyID0gcmVxdWlyZSAoXCIuL0hvdFRlc3RTZWxlbml1bURyaXZlclwiKS5Ib3RUZXN0U2VsZW5pdW1Ecml2ZXI7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBhcmVudE9iai50ZXN0ZXJBUElVcmwgPT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXJVcmwgPSBwYXJlbnRPYmoudGVzdGVyQVBJVXJsO1xuXHRcdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChwYXJlbnRPYmouZHJpdmVyID09PSBcIkhvdFRlc3RTZWxlbml1bURyaXZlclwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0ZHJpdmVyID0gbmV3IEhvdFRlc3RTZWxlbml1bURyaXZlciAoKTtcblx0XHRcblx0XHRcdFx0XHRcdFx0XHRpZiAocGFyZW50T2JqLnRlc3RlciA9PT0gXCJIb3RUZXN0ZXJNb2NoYVwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0dGVzdGVyID0gbmV3IEhvdFRlc3Rlck1vY2hhICh0aGlzLCB0ZXN0ZXJOYW1lLCB0ZXN0ZXJVcmwsIGRyaXZlcik7XG5cdFx0XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBhcmVudE9iai50ZXN0ZXIgPT09IFwiSG90VGVzdGVyTW9jaGFTZWxlbml1bVwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0dGVzdGVyID0gbmV3IEhvdFRlc3Rlck1vY2hhU2VsZW5pdW0gKHRoaXMsIHRlc3Rlck5hbWUsIHRlc3RlclVybCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdHRlc3RlciA9IHRoaXMudGVzdGVyc1t0ZXN0ZXJOYW1lXTtcblx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViICE9IG51bGwpXG5cdFx0XHRcdFx0XHRzZXR1cFRlc3RlciAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViKTtcblxuXHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy5hcGkgIT0gbnVsbClcblx0XHRcdFx0XHRcdHNldHVwVGVzdGVyICh0aGlzLmhvdFNpdGUudGVzdGluZy5hcGkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHJvdXRlcyAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGZvciAobGV0IGtleSBpbiByb3V0ZXMpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCByb3V0ZTogSG90U2l0ZVJvdXRlID0gcm91dGVzW2tleV07XG5cdFx0XHRcdGxldCBmaWxlOiBIb3RGaWxlID0gbmV3IEhvdEZpbGUgKHJvdXRlKTtcblx0XHRcdFx0bGV0IHBhZ2U6IEhvdFBhZ2UgPSBuZXcgSG90UGFnZSAoe1xuXHRcdFx0XHRcdFx0cHJvY2Vzc29yOiB0aGlzLFxuXHRcdFx0XHRcdFx0bmFtZTogcm91dGUubmFtZSB8fCBcIlwiLFxuXHRcdFx0XHRcdFx0cm91dGU6IGtleSxcblx0XHRcdFx0XHRcdGZpbGVzOiBbZmlsZV1cblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAodGVzdGVyICE9IG51bGwpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAodGhpcy5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBtYXBOYW1lOiBzdHJpbmcgPSByb3V0ZS5uYW1lO1xuXHRcdFx0XHRcdFx0bGV0IHRlc3RNYXA6IEhvdFRlc3RNYXAgPSBudWxsO1xuXG5cdFx0XHRcdFx0XHRpZiAocm91dGUubWFwICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKHJvdXRlLm1hcCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodGVzdGVyLnRlc3RNYXBzW3JvdXRlLm1hcF0gPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYFRlc3QgbWFwICR7cm91dGUubWFwfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdFx0XHRcdFx0XHRcdHRlc3Rlci50ZXN0TWFwc1ttYXBOYW1lXSA9IHRlc3Rlci50ZXN0TWFwc1tyb3V0ZS5tYXBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHRlc3RNYXAgPSBuZXcgSG90VGVzdE1hcCAoKTtcblx0XHRcdFx0XHRcdFx0XHRsZXQgZGVzdGluYXRpb25zOiBIb3RUZXN0RGVzdGluYXRpb25bXSB8IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3REZXN0aW5hdGlvbiB9ID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChyb3V0ZS5tYXAgaW5zdGFuY2VvZiBBcnJheSlcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRkZXN0aW5hdGlvbnMgPSBbXTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCByb3V0ZS5tYXAubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBkZXN0ID0gcm91dGUubWFwW2lJZHhdO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlc3RpbmF0aW9ucy5wdXNoIChuZXcgSG90VGVzdERlc3RpbmF0aW9uIChkZXN0KSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRkZXN0aW5hdGlvbnMgPSB7fTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQga2V5MiBpbiByb3V0ZS5tYXApXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBkZXN0ID0gcm91dGUubWFwW2tleTJdO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlc3RpbmF0aW9uc1trZXkyXSA9IG5ldyBIb3RUZXN0RGVzdGluYXRpb24gKGRlc3QpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdHRlc3RNYXAuZGVzdGluYXRpb25zID0gZGVzdGluYXRpb25zO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0dGVzdGVyLnRlc3RNYXBzW21hcE5hbWVdID0gdGVzdE1hcDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHJvdXRlLmRlc3RpbmF0aW9uT3JkZXIgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0dGVzdGVyLnRlc3RNYXBzW21hcE5hbWVdLmRlc3RpbmF0aW9uT3JkZXIgPSByb3V0ZS5kZXN0aW5hdGlvbk9yZGVyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuYWRkUGFnZSAocGFnZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS5hcGlzICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0Zm9yIChsZXQga2V5IGluIHRoaXMuaG90U2l0ZS5hcGlzKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgYXBpID0gdGhpcy5ob3RTaXRlLmFwaXNba2V5XTtcblxuXHRcdFx0XHRpZiAoYXBpLm1hcCA9PSBudWxsKVxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSBmYWxzZSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0aGlzLm1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG1hcE5hbWU6IHN0cmluZyA9IGtleTtcblx0XHRcdFx0XHRcdGxldCB0ZXN0TWFwOiBIb3RUZXN0TWFwID0gbmV3IEhvdFRlc3RNYXAgKCk7XG5cblx0XHRcdFx0XHRcdHRlc3RNYXAuZGVzdGluYXRpb25zID0gW107XG5cblx0XHRcdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgYXBpLm1hcC5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IG1hcDogc3RyaW5nID0gYXBpLm1hcFtpSWR4XTtcblxuXHRcdFx0XHRcdFx0XHR0ZXN0TWFwLmRlc3RpbmF0aW9ucy5wdXNoIChuZXcgSG90VGVzdERlc3RpbmF0aW9uIChtYXApKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHRlc3RlciA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBBIHRlc3RlciB3YXMgbm90IGNyZWF0ZWQgZmlyc3QhIFlvdSBtdXN0IHNwZWNpZnkgb25lIGluIHRoZSBDTEkgb3IgaW4gSG90U2l0ZS5qc29uLmApO1xuXG5cdFx0XHRcdFx0XHR0ZXN0ZXIudGVzdE1hcHNbbWFwTmFtZV0gPSB0ZXN0TWFwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vLyBAZml4bWUgQWxsb3cgdGhpcyB0byB3b3JrIGZvciBzZXJ2ZXItc2lkZSBhcyB3ZWxsLi4uXG5cdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0Zm9yIChsZXQga2V5IGluIHRoaXMuaG90U2l0ZS5jb21wb25lbnRzKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgY29tcG9uZW50ID0gdGhpcy5ob3RTaXRlLmNvbXBvbmVudHNba2V5XTtcblx0XHRcdFx0bGV0IGNvbXBvbmVudFVybDogc3RyaW5nID0gY29tcG9uZW50LnVybDtcblxuXHRcdFx0XHQvLy8gQGZpeG1lIENyZWF0ZSB1bml0IHRlc3QgZm9yIGZldGNoaW5nLCBsb2FkaW5nLCBhbmQgcmVnaXN0ZXJpbmcuXG5cdFx0XHRcdGxldCByZXM6IGFueSA9IGF3YWl0IGZldGNoIChjb21wb25lbnRVcmwpO1xuXHRcdFx0XHRsZXQgbmV3Q29tcG9uZW50OiBIb3RDb21wb25lbnQgPSBldmFsIChyZXMpO1xuXG5cdFx0XHRcdHRoaXMuYWRkQ29tcG9uZW50IChuZXdDb21wb25lbnQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmhvdFNpdGUucm91dGVzID09IG51bGwpXG5cdFx0XHR0aGlzLmhvdFNpdGUucm91dGVzID0ge307XG5cblx0XHRhd2FpdCB0aGlzLmxvYWRIb3RGaWxlcyAodGhpcy5ob3RTaXRlLmZpbGVzKTtcblxuXHRcdGlmICh0ZXN0ZXIgIT0gbnVsbClcblx0XHRcdHRoaXMuYWRkVGVzdGVyICh0ZXN0ZXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgYW4gYXJyYXkgb2YgZmlsZXMuIElmIGEgZmlsZSBhbHJlYWR5IGhhcyBjb250ZW50LCBpdCB3aWxsIG5vdCBiZSByZWxvYWRlZCBcblx0ICogdW5sZXNzIGZvcmNlQ29udGVudExvYWRpbmcgaXMgc2V0IHRvIHRydWUuXG5cdCAqL1xuXHRhc3luYyBsb2FkSG90RmlsZXMgKGZpbGVzOiB7IFtuYW1lOiBzdHJpbmddOiB7IHVybD86IHN0cmluZzsgbG9jYWxGaWxlPzogc3RyaW5nOyBjb250ZW50Pzogc3RyaW5nOyB9IH0sIFxuXHRcdFx0Zm9yY2VDb250ZW50TG9hZGluZzogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0Zm9yIChsZXQga2V5IGluIGZpbGVzKVxuXHRcdHtcblx0XHRcdGxldCBmaWxlID0gZmlsZXNba2V5XTtcblx0XHRcdGxldCBuZXdGaWxlOiBIb3RGaWxlID0gbnVsbDtcblxuXHRcdFx0aWYgKEhvdFN0YXEuaXNXZWIgPT09IHRydWUpXG5cdFx0XHR7XG5cdFx0XHRcdG5ld0ZpbGUgPSBuZXcgSG90RmlsZSAoe1xuXHRcdFx0XHRcdFx0XCJuYW1lXCI6IGtleVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHRuZXdGaWxlID0gbmV3IEhvdEZpbGUgKHtcblx0XHRcdFx0XHRcdFwibmFtZVwiOiBrZXlcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGZpbGUudXJsICE9IG51bGwpXG5cdFx0XHRcdG5ld0ZpbGUudXJsID0gZmlsZS51cmw7XG5cblx0XHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSBmYWxzZSlcblx0XHRcdHtcblx0XHRcdFx0aWYgKGZpbGUubG9jYWxGaWxlICE9IG51bGwpXG5cdFx0XHRcdFx0bmV3RmlsZS5sb2NhbEZpbGUgPSBmaWxlLmxvY2FsRmlsZTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IGxvYWRDb250ZW50OiBib29sZWFuID0gdHJ1ZTtcblxuXHRcdFx0aWYgKGZpbGUuY29udGVudCAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRuZXdGaWxlLmNvbnRlbnQgPSBmaWxlLmNvbnRlbnQ7XG5cdFx0XHRcdGxvYWRDb250ZW50ID0gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChmb3JjZUNvbnRlbnRMb2FkaW5nID09PSB0cnVlKVxuXHRcdFx0XHRsb2FkQ29udGVudCA9IHRydWU7XG5cblx0XHRcdGlmIChsb2FkQ29udGVudCA9PT0gdHJ1ZSlcblx0XHRcdFx0YXdhaXQgbmV3RmlsZS5sb2FkICgpO1xuXG5cdFx0XHR0aGlzLmFkZEZpbGUgKG5ld0ZpbGUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZSB0aGUgY29udGVudCB0byBzZW5kIHRvIGEgY2xpZW50LlxuXHQgKi9cblx0Z2VuZXJhdGVDb250ZW50IChyb3V0ZUtleTogc3RyaW5nLCBuYW1lOiBzdHJpbmcgPSBcIlwiLCB1cmw6IHN0cmluZyA9IFwiLi9cIixcblx0XHRcdGpzU3JjUGF0aDogc3RyaW5nID0gXCIuL2pzL0hvdFN0YXEuanNcIiwgcGFzc0FyZ3M6IGJvb2xlYW4gPSB0cnVlLCBcblx0XHRcdGFyZ3M6IGFueSA9IG51bGwpOiBzdHJpbmdcblx0e1xuXHRcdGxldCBhcGlTY3JpcHRzOiBzdHJpbmcgPSBcIlwiO1xuXHRcdGxldCBhcGlDb2RlOiBzdHJpbmcgPSBcIlwiO1xuXHRcdGxldCBwdWJsaWNTZWNyZXRzOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0Ly8vIEB0b2RvIE9wdGltaXplIHRoaXMgZnVuY3Rpb24gYXMgbXVjaCBhcyBwb3NzaWJsZS5cblxuXHRcdC8vIExvYWQgdGhlIEFQSSBzdHJpbmcuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLmhvdFNpdGUuc2VydmVyLmdsb2JhbEFwaSAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnNlcnZlci5nbG9iYWxBcGkgIT09IFwiXCIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjb25zdCBnbG9iYWxBcGkgPSB0aGlzLmhvdFNpdGUuYXBpc1t0aGlzLmhvdFNpdGUuc2VydmVyLmdsb2JhbEFwaV07XG5cblx0XHRcdFx0XHRpZiAoZ2xvYmFsQXBpID09IG51bGwpXG5cdFx0XHRcdFx0XHR0aGlzLmxvZ2dlci53YXJuaW5nIChgQVBJIHdpdGggbmFtZSAke3RoaXMuaG90U2l0ZS5zZXJ2ZXIuZ2xvYmFsQXBpfSBkb2Vzbid0IGV4aXN0IWApO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgc2VuZEpTQ29udGVudDogYm9vbGVhbiA9IHRydWU7XG5cblx0XHRcdFx0XHRcdGlmIChnbG9iYWxBcGkuanNhcGkgPT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0c2VuZEpTQ29udGVudCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmxvZ2dlci53YXJuaW5nIChgQVBJIHdpdGggbmFtZSAke3RoaXMuaG90U2l0ZS5zZXJ2ZXIuZ2xvYmFsQXBpfSBkb2Vzbid0IGhhdmUgYSBqc2FwaSBzZXQuIFdpbGwgbm90IHNlbmQganMgY29udGVudCB0byBjbGllbnQuYCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChnbG9iYWxBcGkubGlicmFyeU5hbWUgPT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0c2VuZEpTQ29udGVudCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmxvZ2dlci53YXJuaW5nIChgQVBJIHdpdGggbmFtZSAke3RoaXMuaG90U2l0ZS5zZXJ2ZXIuZ2xvYmFsQXBpfSBkb2Vzbid0IGhhdmUgYSBsaWJyYXJ5TmFtZSBzZXQuIFdpbGwgbm90IHNlbmQganMgY29udGVudCB0byBjbGllbnQuYCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChnbG9iYWxBcGkuYXBpTmFtZSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRzZW5kSlNDb250ZW50ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdHRoaXMubG9nZ2VyLndhcm5pbmcgKGBBUEkgd2l0aCBuYW1lICR7dGhpcy5ob3RTaXRlLnNlcnZlci5nbG9iYWxBcGl9IGRvZXNuJ3QgaGF2ZSBhIGFwaU5hbWUgc2V0LiBXaWxsIG5vdCBzZW5kIGpzIGNvbnRlbnQgdG8gY2xpZW50LmApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoc2VuZEpTQ29udGVudCA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0YXBpU2NyaXB0cyArPSBgXFx0PHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmMgPSBcIiR7Z2xvYmFsQXBpLmpzYXBpfVwiPjwvc2NyaXB0PlxcbmA7XG5cblx0XHRcdFx0XHRcdFx0bGV0IGJhc2VVcmw6IHN0cmluZyA9IFwiXFxcIlxcXCJcIjtcblxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5hcGkgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRiYXNlVXJsID0gYFxcXCIke3RoaXMuYXBpLmJhc2VVcmx9XFxcImA7XG5cblx0XHRcdFx0XHRcdFx0bGV0IHRlbXBBUElDb250ZW50OiBzdHJpbmcgPSB0aGlzLmFwaUNvbnRlbnQ7XG5cdFx0XHRcdFx0XHRcdHRlbXBBUElDb250ZW50ID0gdGVtcEFQSUNvbnRlbnQucmVwbGFjZSAoL1xcJWFwaVxcX25hbWVcXCUvZywgZ2xvYmFsQXBpLmFwaU5hbWUpO1xuXHRcdFx0XHRcdFx0XHR0ZW1wQVBJQ29udGVudCA9IHRlbXBBUElDb250ZW50LnJlcGxhY2UgKC9cXCVhcGlcXF9leHBvcnRlZFxcX25hbWVcXCUvZywgZ2xvYmFsQXBpLmxpYnJhcnlOYW1lKTtcblx0XHRcdFx0XHRcdFx0dGVtcEFQSUNvbnRlbnQgPSB0ZW1wQVBJQ29udGVudC5yZXBsYWNlICgvXFwlYmFzZVxcX3VybFxcJS9nLCBiYXNlVXJsKTtcblxuXHRcdFx0XHRcdFx0XHRhcGlDb2RlICs9IHRlbXBBUElDb250ZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5ob3RTaXRlLmFwaXMgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0bGV0IHJvdXRlID0gdGhpcy5ob3RTaXRlLnJvdXRlc1tyb3V0ZUtleV07XG5cblx0XHRcdFx0aWYgKHJvdXRlICE9IG51bGwpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAocm91dGUuYXBpICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IGFwaSA9IHRoaXMuaG90U2l0ZS5hcGlzW3JvdXRlLmFwaV07XG5cblx0XHRcdFx0XHRcdGlmIChhcGkgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVW5hYmxlIHRvIGZpbmQgQVBJICR7cm91dGUuYXBpfWApO1xuXG5cdFx0XHRcdFx0XHRsZXQgc2VuZEpTQ29udGVudDogYm9vbGVhbiA9IHRydWU7XG5cblx0XHRcdFx0XHRcdGlmIChhcGkuanNhcGkgPT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0c2VuZEpTQ29udGVudCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmxvZ2dlci53YXJuaW5nIChgQVBJIHdpdGggbmFtZSAke3JvdXRlLmFwaX0gZG9lc24ndCBoYXZlIGEganNhcGkgc2V0LiBXaWxsIG5vdCBzZW5kIGpzIGNvbnRlbnQgdG8gY2xpZW50LmApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoYXBpLmxpYnJhcnlOYW1lID09IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHNlbmRKU0NvbnRlbnQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoYEFQSSB3aXRoIG5hbWUgJHtyb3V0ZS5hcGl9IGRvZXNuJ3QgaGF2ZSBhIGxpYnJhcnlOYW1lIHNldC4gV2lsbCBub3Qgc2VuZCBqcyBjb250ZW50IHRvIGNsaWVudC5gKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKGFwaS5hcGlOYW1lID09IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHNlbmRKU0NvbnRlbnQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0dGhpcy5sb2dnZXIud2FybmluZyAoYEFQSSB3aXRoIG5hbWUgJHtyb3V0ZS5hcGl9IGRvZXNuJ3QgaGF2ZSBhIGFwaU5hbWUgc2V0LiBXaWxsIG5vdCBzZW5kIGpzIGNvbnRlbnQgdG8gY2xpZW50LmApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoc2VuZEpTQ29udGVudCA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IGpzYXBpcGF0aCA9IGFwaS5qc2FwaTtcblx0XHRcdFx0XHRcdFx0YXBpU2NyaXB0cyArPSBgXFx0PHNjcmlwdCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmMgPSBcIiR7anNhcGlwYXRofVwiPjwvc2NyaXB0PlxcbmA7XG5cblx0XHRcdFx0XHRcdFx0bGV0IGJhc2VVcmw6IHN0cmluZyA9IFwiXFxcIlxcXCJcIjtcblxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5hcGkgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRiYXNlVXJsID0gYFxcXCIke3RoaXMuYXBpLmJhc2VVcmx9XFxcImA7XG5cblx0XHRcdFx0XHRcdFx0bGV0IHRlbXBBUElDb250ZW50OiBzdHJpbmcgPSB0aGlzLmFwaUNvbnRlbnQ7XG5cdFx0XHRcdFx0XHRcdHRlbXBBUElDb250ZW50ID0gdGVtcEFQSUNvbnRlbnQucmVwbGFjZSAoL1xcJWFwaVxcX25hbWVcXCUvZywgYXBpLmFwaU5hbWUpO1xuXHRcdFx0XHRcdFx0XHR0ZW1wQVBJQ29udGVudCA9IHRlbXBBUElDb250ZW50LnJlcGxhY2UgKC9cXCVhcGlcXF9leHBvcnRlZFxcX25hbWVcXCUvZywgYXBpLmxpYnJhcnlOYW1lKTtcblx0XHRcdFx0XHRcdFx0dGVtcEFQSUNvbnRlbnQgPSB0ZW1wQVBJQ29udGVudC5yZXBsYWNlICgvXFwlYmFzZVxcX3VybFxcJS9nLCBiYXNlVXJsKTtcblxuXHRcdFx0XHRcdFx0XHRhcGlDb2RlICs9IHRlbXBBUElDb250ZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5ob3RTaXRlLnNlcnZlciAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnNlcnZlci5qc1NyY1BhdGggIT0gbnVsbClcblx0XHRcdFx0XHRqc1NyY1BhdGggPSB0aGlzLmhvdFNpdGUuc2VydmVyLmpzU3JjUGF0aDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuaG90U2l0ZS5wdWJsaWNTZWNyZXRzICE9IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGZvciAobGV0IGtleSBpbiB0aGlzLmhvdFNpdGUucHVibGljU2VjcmV0cylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBzZWNyZXQgPSB0aGlzLmhvdFNpdGUucHVibGljU2VjcmV0c1trZXldO1xuXHRcdFx0XHRcdGxldCB2YWx1ZTogc3RyaW5nID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiAoc2VjcmV0KSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdHZhbHVlID0gSlNPTi5zdHJpbmdpZnkgKHNlY3JldCk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSBmYWxzZSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuYXBpICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5hcGkuY29ubmVjdGlvbiA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgQ2Fubm90IHBhc3Mgc2VjcmV0cyBmcm9tIHRoZSBBUEkgaWYgdGhlcmUncyBubyBjb25uZWN0aW9uIWApO1xuXG5cdFx0XHRcdFx0XHRcdFx0bGV0IHNlcnZlckNvbm46IEhvdFNlcnZlciA9ICg8SG90U2VydmVyPnRoaXMuYXBpLmNvbm5lY3Rpb24pO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNlY3JldC5wYXNzU2VjcmV0RnJvbUFQSSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBKU09OLnN0cmluZ2lmeSAoc2VydmVyQ29ubi5zZWNyZXRzW2tleV0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKHNlY3JldC5lbnYgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdC8vLyBAZml4bWUgQHNlY3Z1bCBJcyB0aGlzIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eT8gTmVlZCB0byB2ZXJpZnkgdGhhdCBcblx0XHRcdFx0XHRcdFx0XHQvLy8gb25seSB0aGUgc2VydmVyIGhhcyBhY2Nlc3MgdG8gdGhpcy4gQXQgdGhpcyBwb2ludCwgSSB0aGluayBvbmx5IHRoZSBcblx0XHRcdFx0XHRcdFx0XHQvLy8gc2VydmVyIGhhcyBhY2Nlc3MuXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgZW52S2V5OiBzdHJpbmcgPSBzZWNyZXQuZW52O1xuXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBKU09OLnN0cmluZ2lmeSAocHJvY2Vzcy5lbnZbZW52S2V5XSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRwdWJsaWNTZWNyZXRzICs9IGBwcm9jZXNzb3IucHVibGljU2VjcmV0c1tcIiR7a2V5fVwiXSA9ICR7dmFsdWV9O1xcbmA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRsZXQgY29udGVudDogc3RyaW5nID0gdGhpcy5wYWdlQ29udGVudDtcblx0XHRsZXQgZml4Q29udGVudCA9ICh0ZW1wQ29udGVudDogc3RyaW5nKSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgZGV2ZWxvcGVyTW9kZVN0cjogc3RyaW5nID0gXCJcIjtcblx0XHRcdFx0bGV0IHRlc3RlckFQSVN0cjogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRpZiAodGhpcy5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZGV2ZWxvcGVyTW9kZVN0ciA9IGB0ZW1wTW9kZSA9IEhvdFN0YXFXZWIuRGV2ZWxvcGVyTW9kZS5EZXZlbG9wbWVudDtgO1xuXHRcdFx0XHRcdHRlc3RlckFQSVN0ciA9IHRoaXMudGVzdGVyQXBpQ29udGVudDtcblxuXHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUgIT0gbnVsbClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3RpbmcgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi50ZXN0ZXJBUElVcmwgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyQVBJVXJsID0gXCJodHRwOi8vMTI3LjAuMC4xOjgxODJcIjtcblxuXHRcdFx0XHRcdFx0XHR0ZXN0ZXJBUElTdHIgPSB0ZXN0ZXJBUElTdHIucmVwbGFjZSAoL1xcJWJhc2VcXF90ZXN0ZXJcXF91cmxcXCUvZywgYFxcXCIke3RoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi50ZXN0ZXJBUElVcmx9XFxcImApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCBsb2FkRmlsZXM6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0aWYgKE9iamVjdC5rZXlzICh0aGlzLmZpbGVzKS5sZW5ndGggPiAwKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bG9hZEZpbGVzICs9IGB2YXIgZmlsZXMgPSB7fTtcXG5cXG5gO1xuXG5cdFx0XHRcdFx0Zm9yIChsZXQga2V5IGluIHRoaXMuZmlsZXMpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IGZpbGUgPSB0aGlzLmZpbGVzW2tleV07XG5cdFx0XHRcdFx0XHRsZXQgZmlsZVVybDogc3RyaW5nID0gYFwiJHtmaWxlLnVybH1cImA7XG5cdFx0XHRcdFx0XHRsZXQgZmlsZUNvbnRlbnQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdFx0XHRcdGlmIChmaWxlLmNvbnRlbnQgIT09IFwiXCIpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCBlc2NhcGVkQ29udGVudDogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkgKGZpbGUuY29udGVudCk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gRmluZCBhbnkgc2NyaXB0IHRhZ3MgYW5kIGludGVycnVwdCB0aGVtIHNvIHRoZSBIVE1MIHBhcnNlcnMgXG5cdFx0XHRcdFx0XHRcdC8vIGRvbid0IGdldCBjb25mdXNlZC5cblx0XHRcdFx0XHRcdFx0ZXNjYXBlZENvbnRlbnQgPSBlc2NhcGVkQ29udGVudC5yZXBsYWNlIChuZXcgUmVnRXhwIChcIlxcXFw8c2NyaXB0XCIsIFwiZ21pXCIpLCBcIjxzY3JcXFwiICsgXFxcImlwdFwiKTtcblx0XHRcdFx0XHRcdFx0ZXNjYXBlZENvbnRlbnQgPSBlc2NhcGVkQ29udGVudC5yZXBsYWNlIChuZXcgUmVnRXhwIChcIlxcXFw8XFxcXC9zY3JpcHRcIiwgXCJnbWlcIiksIFwiPC9zY3JcXFwiICsgXFxcImlwdFwiKTtcblxuXHRcdFx0XHRcdFx0XHRmaWxlQ29udGVudCA9IGAsIFwiY29udGVudFwiOiAke2VzY2FwZWRDb250ZW50fWA7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGxvYWRGaWxlcyArPSBgXFx0XFx0XFx0ZmlsZXNbXCIke2tleX1cIl0gPSB7IFwidXJsXCI6ICR7ZmlsZVVybH0ke2ZpbGVDb250ZW50fSB9O1xcbmA7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0bG9hZEZpbGVzICs9IGBcXHRcXHRcXHRwcm9taXNlcy5wdXNoIChwcm9jZXNzb3IubG9hZEhvdEZpbGVzIChmaWxlcykpO1xcbmA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCV0aXRsZVxcJS9nLCBuYW1lKTtcblxuXHRcdFx0XHRpZiAocGFzc0FyZ3MgPT09IHRydWUpXG5cdFx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlYXJnc1xcJS9nLCBcIkhvdC5Bcmd1bWVudHNcIik7XG5cblx0XHRcdFx0aWYgKGFyZ3MgIT0gbnVsbClcblx0XHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVhcmdzXFwlL2csIEpTT04uc3RyaW5naWZ5IChhcmdzKSk7XG5cblx0XHRcdFx0bGV0IHRlc3Rlck1hcDogc3RyaW5nID0gcm91dGVLZXk7XG5cdFx0XHRcdGxldCB0ZXN0ZXJVcmw6IHN0cmluZyA9IFwiXCI7XG5cdFx0XHRcdGxldCB0ZXN0ZXJMYXVuY2hwYWRVcmw6IHN0cmluZyA9IFwiXCI7XG5cdFx0XHRcdGxldCB0ZXN0ZXJOYW1lOiBzdHJpbmcgPSBcIlRlc3RlclwiO1xuXG5cdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZyAhPSBudWxsKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdHRlc3Rlck5hbWUgPSB0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyO1xuXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3Rlck5hbWUgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0dGVzdGVyTmFtZSA9IHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi50ZXN0ZXJOYW1lO1xuXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLnRlc3RlckFQSVVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHR0ZXN0ZXJVcmwgPSB0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIudGVzdGVyQVBJVXJsO1xuXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3Rpbmcud2ViLmxhdW5jaHBhZFVybCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHR0ZXN0ZXJMYXVuY2hwYWRVcmwgPSB0aGlzLmhvdFNpdGUudGVzdGluZy53ZWIubGF1bmNocGFkVXJsO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICh0aGlzLmhvdFNpdGUucm91dGVzICE9IG51bGwpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuaG90U2l0ZS5yb3V0ZXNbcm91dGVLZXldICE9IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGxldCByb3V0ZSA9IHRoaXMuaG90U2l0ZS5yb3V0ZXNbcm91dGVLZXldO1xuXHRcdFx0XHRcdFx0XHR0ZXN0ZXJNYXAgPSByb3V0ZS5uYW1lO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJWhvdHN0YXFcXF9qc1xcX3NyY1xcJS9nLCBqc1NyY1BhdGgpO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVkZXZlbG9wZXJcXF9tb2RlXFwlL2csIGRldmVsb3Blck1vZGVTdHIpO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCV0ZXN0ZXJcXF9hcGlcXCUvZywgdGVzdGVyQVBJU3RyKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlYXBpc1xcX3RvXFxfbG9hZFxcJS9nLCBhcGlTY3JpcHRzKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlbG9hZFxcX2hvdFxcX3NpdGVcXCUvZywgXCJcIik7IC8vLyBAZml4bWUgU2hvdWxkIHRoaXMgb25seSBiZSBkb25lIHNlcnZlci1zaWRlP1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCVsb2FkXFxfZmlsZXNcXCUvZywgbG9hZEZpbGVzKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlYXBpXFxfY29kZVxcJS9nLCBhcGlDb2RlKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwlcHVibGljXFxfc2VjcmV0c1xcJS9nLCBwdWJsaWNTZWNyZXRzKTtcblx0XHRcdFx0dGVtcENvbnRlbnQgPSB0ZW1wQ29udGVudC5yZXBsYWNlICgvXFwldXJsXFwlL2csIHVybCk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRlc3RlclxcX25hbWVcXCUvZywgYFwiJHt0ZXN0ZXJOYW1lfVwiYCk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRlc3RlclxcX21hcFxcJS9nLCBgXCIke3Rlc3Rlck1hcH1cImApO1xuXHRcdFx0XHR0ZW1wQ29udGVudCA9IHRlbXBDb250ZW50LnJlcGxhY2UgKC9cXCV0ZXN0ZXJcXF9hcGlcXF9iYXNlXFxfdXJsXFwlL2csIGBcIiR7dGVzdGVyVXJsfVwiYCk7XG5cdFx0XHRcdHRlbXBDb250ZW50ID0gdGVtcENvbnRlbnQucmVwbGFjZSAoL1xcJXRlc3RlclxcX2xhdW5jaHBhZFxcX3VybFxcJS9nLCBgXCIke3Rlc3RlckxhdW5jaHBhZFVybH1cImApO1xuXG5cdFx0XHRcdHJldHVybiAodGVtcENvbnRlbnQpO1xuXHRcdFx0fTtcblx0XHRjb250ZW50ID0gZml4Q29udGVudCAoY29udGVudCk7XG5cblx0XHRyZXR1cm4gKGNvbnRlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSB0aGUgRXhwcmVzcyByb3V0ZXMgZnJvbSB0aGUgZ2l2ZW4gcGFnZXMuIEJlIHN1cmUgdG8gbG9hZCB0aGUgXG5cdCAqIHBhZ2VzIGZpcnN0IGJlZm9yZSBkb2luZyB0aGlzLiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBiZSB1c2VkIGZvciBcblx0ICogY3VzdG9taXplZCBFeHByZXNzIGFwcGxpY2F0aW9ucy4gSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBsb2FkZWQgcm91dGVzIFxuXHQgKiBmcm9tIHRoaXMgSG90U3RhcSBvYmplY3Qgd2l0aCBIb3RIVFRQU2VydmVyLCBiZSBzdXJlIHRvIHVzZSBcblx0ICogdGhlIGxvYWRIb3RTaXRlIG1ldGhvZCBpbiBIb3RIVFRQU2VydmVyLlxuXHQgKi9cblx0Y3JlYXRlRXhwcmVzc1JvdXRlcyAoZXhwcmVzc0FwcDogYW55LCBqc1NyY1BhdGg6IHN0cmluZyA9IFwiLi9qcy9Ib3RTdGFxLmpzXCIpOiB2b2lkXG5cdHtcblx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy5wYWdlcylcblx0XHR7XG5cdFx0XHRsZXQgcGFnZTogSG90UGFnZSA9IHRoaXMucGFnZXNba2V5XTtcblx0XHRcdGNvbnN0IGNvbnRlbnQ6IHN0cmluZyA9IHRoaXMuZ2VuZXJhdGVDb250ZW50IChwYWdlLnJvdXRlLCBwYWdlLm5hbWUsIHBhZ2UuZmlsZXNbMF0udXJsLCBqc1NyY1BhdGgpO1xuXG5cdFx0XHRleHByZXNzQXBwLmdldCAocGFnZS5yb3V0ZSwgKHJlcTogYW55LCByZXM6IGFueSkgPT5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdHJlcy5zZW5kIChjb250ZW50KTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIHRlc3RlciBmb3IgdXNlIGxhdGVyLlxuXHQgKi9cblx0YWRkVGVzdGVyICh0ZXN0ZXI6IEhvdFRlc3Rlcik6IHZvaWRcblx0e1xuXHRcdHRoaXMudGVzdGVyc1t0ZXN0ZXIubmFtZV0gPSB0ZXN0ZXI7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBsaXN0IG9mIG1hcHMgZm9yIHRlc3RpbmcgZnJvbSB0aGUgSG90U2l0ZS5cblx0ICovXG5cdGdldFdlYlRlc3RpbmdNYXBzICgpOiBzdHJpbmdbXVxuXHR7XG5cdFx0aWYgKHRoaXMuaG90U2l0ZSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIk5vIEhvdFNpdGUgd2FzIGxvYWRlZCFcIik7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3RpbmcgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUaGUgSG90U2l0ZSBkb2VzIG5vdCBoYXZlIGEgdGVzdGluZyBvYmplY3QhXCIpO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYiA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIlRoZSBIb3RTaXRlIGRvZXMgbm90IGhhdmUgYSB0ZXN0aW5nIHdlYiBvYmplY3QhXCIpO1xuXG5cdFx0aWYgKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi5tYXBzID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGhlIEhvdFNpdGUgdGVzdGluZyBvYmplY3QgZG9lcyBub3QgaGF2ZSBhbnkgbWFwcyFcIik7XG5cblx0XHRyZXR1cm4gKHRoaXMuaG90U2l0ZS50ZXN0aW5nLndlYi5tYXBzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGxpc3Qgb2YgbWFwcyBmb3IgdGVzdGluZyBmcm9tIHRoZSBIb3RTaXRlLlxuXHQgKi9cblx0Z2V0QVBJVGVzdGluZ01hcHMgKCk6IHN0cmluZ1tdXG5cdHtcblx0XHRpZiAodGhpcy5ob3RTaXRlID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiTm8gSG90U2l0ZSB3YXMgbG9hZGVkIVwiKTtcblxuXHRcdGlmICh0aGlzLmhvdFNpdGUudGVzdGluZyA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIlRoZSBIb3RTaXRlIGRvZXMgbm90IGhhdmUgYSB0ZXN0aW5nIG9iamVjdCFcIik7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3RpbmcuYXBpID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGhlIEhvdFNpdGUgZG9lcyBub3QgaGF2ZSBhIHRlc3RpbmcgYXBpIG9iamVjdCFcIik7XG5cblx0XHRpZiAodGhpcy5ob3RTaXRlLnRlc3RpbmcuYXBpLm1hcHMgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUaGUgSG90U2l0ZSB0ZXN0aW5nIG9iamVjdCBkb2VzIG5vdCBoYXZlIGFueSBtYXBzIVwiKTtcblxuXHRcdHJldHVybiAodGhpcy5ob3RTaXRlLnRlc3RpbmcuYXBpLm1hcHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHJvdXRlJ3Mga2V5IGZyb20gYSByb3V0ZSdzIG5hbWUuXG5cdCAqL1xuXHRnZXRSb3V0ZUtleUZyb21OYW1lIChuYW1lOiBzdHJpbmcpOiBzdHJpbmdcblx0e1xuXHRcdGxldCBmb3VuZEtleTogc3RyaW5nID0gXCJcIjtcblxuXHRcdGlmICh0aGlzLmhvdFNpdGUgIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5ob3RTaXRlLnJvdXRlcyAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy5ob3RTaXRlLnJvdXRlcylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCByb3V0ZTogSG90U2l0ZVJvdXRlID0gdGhpcy5ob3RTaXRlLnJvdXRlc1trZXldO1xuXG5cdFx0XHRcdFx0aWYgKHJvdXRlLm5hbWUgPT09IG5hbWUpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Zm91bmRLZXkgPSBrZXk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAoZm91bmRLZXkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHJvdXRlIGZyb20gYSByb3V0ZSdzIG5hbWUuXG5cdCAqL1xuXHRnZXRSb3V0ZUZyb21OYW1lIChuYW1lOiBzdHJpbmcpOiBIb3RTaXRlUm91dGVcblx0e1xuXHRcdGxldCBmb3VuZFJvdXRlOiBIb3RTaXRlUm91dGUgPSBudWxsO1xuXHRcdGxldCBmb3VuZEtleTogc3RyaW5nID0gdGhpcy5nZXRSb3V0ZUtleUZyb21OYW1lIChuYW1lKTtcblxuXHRcdGlmIChmb3VuZEtleSAhPT0gXCJcIilcblx0XHRcdGZvdW5kUm91dGUgPSB0aGlzLmhvdFNpdGUucm91dGVzW2ZvdW5kS2V5XTtcblxuXHRcdHJldHVybiAoZm91bmRSb3V0ZSk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSB0ZXN0cy5cblx0ICogXG5cdCAqIEBwYXJhbSB0ZXN0ZXJOYW1lIFRoZSB0ZXN0ZXIgdG8gdXNlIHRvIGV4ZWN1dGUgdGVzdHMuXG5cdCAqIEBwYXJhbSBtYXBOYW1lIFRoZSBtYXAgb3IgbWFwcyB0byB1c2UgdG8gbmF2aWdhdGUgdGhyb3VnaCB0ZXN0cy5cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVUZXN0cyAodGVzdGVyTmFtZTogc3RyaW5nLCBtYXBOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRsZXQgdGVzdGVyOiBIb3RUZXN0ZXIgPSB0aGlzLnRlc3RlcnNbdGVzdGVyTmFtZV07XG5cblx0XHRpZiAodGVzdGVyID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBVbmFibGUgdG8gZXhlY3V0ZSB0ZXN0cy4gVGVzdGVyICR7dGVzdGVyTmFtZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRyZXR1cm4gKHRlc3Rlci5leGVjdXRlIChtYXBOYW1lKSk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhbGwgd2ViIHRlc3RzIGZyb20gdGhlIEhvdFNpdGUgdGVzdGluZyB3ZWIgb2JqZWN0LlxuXHQgKiBcblx0ICogQHBhcmFtIHRlc3Rlck5hbWUgVGhlIHRlc3RlciB0byB1c2UgdG8gZXhlY3V0ZSB0ZXN0cy5cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVBbGxXZWJUZXN0cyAodGVzdGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IG1hcHM6IHN0cmluZ1tdID0gdGhpcy5nZXRXZWJUZXN0aW5nTWFwcyAoKTtcblx0XHRsZXQgdGVzdGVyOiBIb3RUZXN0ZXIgPSB0aGlzLnRlc3RlcnNbdGVzdGVyTmFtZV07XG5cblx0XHRpZiAodGVzdGVyID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBVbmFibGUgdG8gZXhlY3V0ZSB0ZXN0cy4gVGVzdGVyICR7dGVzdGVyTmFtZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG1hcHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IG1hcE5hbWU6IHN0cmluZyA9IG1hcHNbaUlkeF07XG5cblx0XHRcdGF3YWl0IHRoaXMuZXhlY3V0ZVRlc3RzICh0ZXN0ZXJOYW1lLCBtYXBOYW1lKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhbGwgYXBpIHRlc3RzIGZyb20gdGhlIEhvdFNpdGUgdGVzdGluZyBhcGkgb2JqZWN0LlxuXHQgKiBcblx0ICogQHBhcmFtIHRlc3Rlck5hbWUgVGhlIHRlc3RlciB0byB1c2UgdG8gZXhlY3V0ZSB0ZXN0cy5cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVBbGxBUElUZXN0cyAodGVzdGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IG1hcHM6IHN0cmluZ1tdID0gdGhpcy5nZXRBUElUZXN0aW5nTWFwcyAoKTtcblx0XHRsZXQgdGVzdGVyOiBIb3RUZXN0ZXIgPSB0aGlzLnRlc3RlcnNbdGVzdGVyTmFtZV07XG5cblx0XHRpZiAodGVzdGVyID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBVbmFibGUgdG8gZXhlY3V0ZSB0ZXN0cy4gVGVzdGVyICR7dGVzdGVyTmFtZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IG1hcHMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IG1hcE5hbWU6IHN0cmluZyA9IG1hcHNbaUlkeF07XG5cblx0XHRcdGF3YWl0IHRoaXMuZXhlY3V0ZVRlc3RzICh0ZXN0ZXJOYW1lLCBtYXBOYW1lKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhIHBhZ2UgYW5kIGdldCB0aGUgcmVzdWx0LlxuXHQgKi9cblx0YXN5bmMgcHJvY2VzcyAocGFnZU5hbWU6IHN0cmluZywgYXJnczogYW55ID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IHBhZ2U6IEhvdFBhZ2UgPSB0aGlzLmdldFBhZ2UgKHBhZ2VOYW1lKTtcblx0XHRsZXQgcmVzdWx0OiBzdHJpbmcgPSBhd2FpdCBwYWdlLnByb2Nlc3MgKGFyZ3MpO1xuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYSBsb2NhbCBmaWxlIGFuZCBnZXQgdGhlIHJlc3VsdC5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBwcm9jZXNzTG9jYWxGaWxlIChsb2NhbEZpbGVwYXRoOiBzdHJpbmcsIG5hbWU6IHN0cmluZyA9IGxvY2FsRmlsZXBhdGgsIGFyZ3M6IGFueSA9IG51bGwpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdGxldCBwcm9jZXNzb3I6IEhvdFN0YXEgPSBuZXcgSG90U3RhcSAoKTtcblx0XHRsZXQgZmlsZTogSG90RmlsZSA9IG5ldyBIb3RGaWxlICh7XG5cdFx0XHRcImxvY2FsRmlsZVwiOiBsb2NhbEZpbGVwYXRoXG5cdFx0fSk7XG5cdFx0YXdhaXQgZmlsZS5sb2FkICgpO1xuXHRcdGxldCBwYWdlOiBIb3RQYWdlID0gbmV3IEhvdFBhZ2UgKHtcblx0XHRcdFx0XCJwcm9jZXNzb3JcIjogcHJvY2Vzc29yLFxuXHRcdFx0XHRcIm5hbWVcIjogbmFtZSxcblx0XHRcdFx0XCJmaWxlc1wiOiBbZmlsZV1cblx0XHRcdH0pO1xuXHRcdHByb2Nlc3Nvci5hZGRQYWdlIChwYWdlKTtcblx0XHRsZXQgcmVzdWx0OiBzdHJpbmcgPSBhd2FpdCBwcm9jZXNzb3IucHJvY2VzcyAobmFtZSwgYXJncyk7XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhIHVybCBhbmQgZ2V0IHRoZSByZXN1bHQuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgcHJvY2Vzc1VybCAob3B0aW9uczogSG90U3RhcnRPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgZmlsZTogSG90RmlsZSA9IG5ldyBIb3RGaWxlICh7XG5cdFx0XHRcInVybFwiOiBvcHRpb25zLnVybFxuXHRcdH0pO1xuXG5cdFx0YXdhaXQgZmlsZS5sb2FkICgpO1xuXHRcdGxldCBwYWdlOiBIb3RQYWdlID0gbmV3IEhvdFBhZ2UgKHtcblx0XHRcdFx0XCJwcm9jZXNzb3JcIjogb3B0aW9ucy5wcm9jZXNzb3IsXG5cdFx0XHRcdFwibmFtZVwiOiBvcHRpb25zLm5hbWUsXG5cdFx0XHRcdFwiZmlsZXNcIjogW2ZpbGVdLFxuXHRcdFx0XHRcInRlc3Rlck5hbWVcIjogb3B0aW9ucy50ZXN0ZXJOYW1lLFxuXHRcdFx0XHRcInRlc3Rlck1hcFwiOiBvcHRpb25zLnRlc3Rlck1hcFxuXHRcdFx0fSk7XG5cdFx0b3B0aW9ucy5wcm9jZXNzb3IuYWRkUGFnZSAocGFnZSk7XG5cdFx0bGV0IHJlc3VsdDogc3RyaW5nID0gYXdhaXQgb3B0aW9ucy5wcm9jZXNzb3IucHJvY2VzcyAob3B0aW9ucy5uYW1lLCBvcHRpb25zLmFyZ3MpO1xuXG5cdFx0cmV0dXJuIChyZXN1bHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgY29udGVudCBhbmQgZ2V0IHRoZSByZXN1bHQuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgcHJvY2Vzc0NvbnRlbnQgKHByb2Nlc3NvcjogSG90U3RhcSwgXG5cdFx0Y29udGVudDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGFyZ3M6IGFueSA9IG51bGwpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdGxldCBmaWxlOiBIb3RGaWxlID0gbmV3IEhvdEZpbGUgKHtcblx0XHRcdFwiY29udGVudFwiOiBjb250ZW50XG5cdFx0fSk7XG5cdFx0YXdhaXQgZmlsZS5sb2FkICgpO1xuXHRcdGxldCBwYWdlOiBIb3RQYWdlID0gbmV3IEhvdFBhZ2UgKHtcblx0XHRcdFx0XCJwcm9jZXNzb3JcIjogcHJvY2Vzc29yLFxuXHRcdFx0XHRcIm5hbWVcIjogbmFtZSxcblx0XHRcdFx0XCJmaWxlc1wiOiBbZmlsZV1cblx0XHRcdH0pO1xuXHRcdHByb2Nlc3Nvci5hZGRQYWdlIChwYWdlKTtcblx0XHRsZXQgcmVzdWx0OiBzdHJpbmcgPSBhd2FpdCBwcm9jZXNzb3IucHJvY2VzcyAobmFtZSwgYXJncyk7XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogV2hlbiB0aGUgd2luZG93IGhhcyBmaW5pc2hlZCBsb2FkaW5nLCBleGVjdXRlIHRoZSBmdW5jdGlvbi5cblx0ICogVGhpcyBpcyBtZWFudCBmb3Igd2ViIGJyb3dzZXIgdXNlIG9ubHkuXG5cdCAqL1xuXHRzdGF0aWMgb25SZWFkeSAocmVhZHlGdW5jOiAoKSA9PiB2b2lkKTogdm9pZFxuXHR7XG5cdFx0aWYgKChkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIpIHx8IChkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImludGVyYWN0aXZlXCIpKVxuXHRcdFx0cmVhZHlGdW5jICgpO1xuXHRcdGVsc2Vcblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyIChcImxvYWRcIiwgcmVhZHlGdW5jKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXBsYWNlIHRoZSBjdXJyZW50IEhUTUwgcGFnZSB3aXRoIHRoZSBvdXRwdXQuXG5cdCAqIFRoaXMgaXMgbWVhbnQgZm9yIHdlYiBicm93c2VyIHVzZSBvbmx5LlxuXHQgKi9cblx0c3RhdGljIHVzZU91dHB1dCAob3V0cHV0OiBzdHJpbmcpOiB2b2lkXG5cdHtcblx0XHRkb2N1bWVudC5vcGVuICgpO1xuXHRcdGRvY3VtZW50LndyaXRlIChvdXRwdXQpO1xuXHRcdGRvY3VtZW50LmNsb3NlICgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdhaXQgZm9yIHRlc3RlcnMgdG8gbG9hZC5cblx0ICogXG5cdCAqIEBmaXhtZSBUaGlzIGRvZXMgbm90IHdhaXQgZm9yIEFMTCB0ZXN0ZXJzIHRvIGZpbmlzaCBsb2FkaW5nLiBPbmx5IFxuXHQgKiB0aGUgZmlyc3Qgb25lLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIHdhaXRGb3JUZXN0ZXJzICgpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHR3aGlsZSAoSG90U3RhcS5pc1JlYWR5Rm9yVGVzdGluZyA9PT0gZmFsc2UpXG5cdFx0XHRhd2FpdCBIb3RTdGFxLndhaXQgKDEwKTtcblxuXHRcdGlmIChIb3RTdGFxLm9uUmVhZHlGb3JUZXN0aW5nICE9IG51bGwpXG5cdFx0XHRhd2FpdCBIb3RTdGFxLm9uUmVhZHlGb3JUZXN0aW5nICgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgYW5kIHJlcGxhY2UgdGhlIGN1cnJlbnQgSFRNTCBwYWdlIHdpdGggdGhlIGhvdHQgc2NyaXB0IGZyb20gdGhlIGdpdmVuIHVybC5cblx0ICogVGhpcyBpcyBtZWFudCBmb3Igd2ViIGJyb3dzZXIgdXNlIG9ubHkuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgZGlzcGxheVVybCAodXJsOiBzdHJpbmcgfCBIb3RTdGFydE9wdGlvbnMsIG5hbWU6IHN0cmluZyA9IG51bGwsIFxuXHRcdHByb2Nlc3NvcjogSG90U3RhcSA9IG51bGwsIGFyZ3M6IGFueSA9IG51bGwpOiBQcm9taXNlPEhvdFN0YXE+XG5cdHtcblx0XHRyZXR1cm4gKG5ldyBQcm9taXNlPEhvdFN0YXE+ICgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRIb3RTdGFxLm9uUmVhZHkgKGFzeW5jICgpID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bGV0IG9wdGlvbnM6IEhvdFN0YXJ0T3B0aW9ucyA9IHtcblx0XHRcdFx0XHRcdFx0XHRcInVybFwiOiBcIlwiXG5cdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdGlmIChuYW1lID09IG51bGwpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKHVybCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gdXJsO1xuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gdXJsLm5hbWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMubmFtZSA9IG5hbWU7XG5cblx0XHRcdFx0XHRcdGlmIChvcHRpb25zLm5hbWUgPT09IFwiXCIpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKHVybCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gdXJsO1xuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5uYW1lID0gdXJsLm5hbWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgKHVybCkgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMudXJsID0gdXJsO1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRvcHRpb25zLnVybCA9IHVybC51cmw7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHByb2Nlc3NvciA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHVybC5wcm9jZXNzb3IgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NvciA9IHVybC5wcm9jZXNzb3I7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoYXJncyA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHVybC5hcmdzICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRhcmdzID0gdXJsLmFyZ3M7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAodXJsLnRlc3Rlck1hcCAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMudGVzdGVyTWFwID0gdXJsLnRlc3Rlck1hcDtcblxuXHRcdFx0XHRcdFx0XHRpZiAodXJsLnRlc3Rlck5hbWUgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLnRlc3Rlck5hbWUgPSB1cmwudGVzdGVyTmFtZTtcblxuXHRcdFx0XHRcdFx0XHRpZiAodXJsLnRlc3RlckFQSUJhc2VVcmwgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLnRlc3RlckFQSUJhc2VVcmwgPSB1cmwudGVzdGVyQVBJQmFzZVVybDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHByb2Nlc3NvciA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRwcm9jZXNzb3IgPSBuZXcgSG90U3RhcSAoKTtcblxuXHRcdFx0XHRcdFx0aWYgKHByb2Nlc3Nvci5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRpZiAocHJvY2Vzc29yLnRlc3RlckFQSSA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMudGVzdGVyQVBJQmFzZVVybCA9PSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0b3B0aW9ucy50ZXN0ZXJBUElCYXNlVXJsID0gXCJcIjtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChvcHRpb25zLnRlc3RlckFQSUJhc2VVcmwgPT09IFwiXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLnRlc3RlckFQSUJhc2VVcmwgPSBcImh0dHA6Ly8xMjcuMC4wLjE6ODE4MlwiO1xuXG5cdFx0XHRcdFx0XHRcdFx0bGV0IGNsaWVudDogSG90Q2xpZW50ID0gbmV3IEhvdENsaWVudCAocHJvY2Vzc29yKTtcblx0XHRcdFx0XHRcdFx0XHRsZXQgdGVzdGVyQVBJOiBIb3RUZXN0ZXJBUEkgPSBuZXcgSG90VGVzdGVyQVBJIChvcHRpb25zLnRlc3RlckFQSUJhc2VVcmwsIGNsaWVudCk7XG5cdFx0XHRcdFx0XHRcdFx0dGVzdGVyQVBJLmNvbm5lY3Rpb24uYXBpID0gdGVzdGVyQVBJO1xuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3Nvci50ZXN0ZXJBUEkgPSB0ZXN0ZXJBUEk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0b3B0aW9ucy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7XG5cdFx0XHRcdFx0XHRvcHRpb25zLmFyZ3MgPSBhcmdzO1xuXG5cdFx0XHRcdFx0XHRsZXQgb3V0cHV0OiBzdHJpbmcgPSBhd2FpdCBIb3RTdGFxLnByb2Nlc3NVcmwgKG9wdGlvbnMpO1xuXG5cdFx0XHRcdFx0XHRpZiAocHJvY2Vzc29yLm1vZGUgPT09IERldmVsb3Blck1vZGUuRGV2ZWxvcG1lbnQpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG91dHB1dCArPSBcbmA8c2NyaXB0IHR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiPlxuXHRmdW5jdGlvbiBob3RzdGFxX2lzRG9jdW1lbnRSZWFkeSAoKVxuXHR7XG5cdFx0aWYgKHdpbmRvd1tcIkhvdFwiXSAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGlmIChIb3QuTW9kZSA9PT0gSG90U3RhcVdlYi5EZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgZnVuYyA9IGZ1bmN0aW9uICgpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKEhvdC5UZXN0ZXJBUEkgIT0gbnVsbClcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IHRlc3RQYXRocyA9IHt9O1xuXHRcdFx0XHRcdFx0XHRsZXQgdGVzdEVsZW1lbnRzID0gSlNPTi5zdHJpbmdpZnkgKEhvdC5DdXJyZW50UGFnZS50ZXN0RWxlbWVudHMpO1xuXHRcdFx0XHRcdFx0XHRsZXQgdGVzdE1hcHMgPSBKU09OLnN0cmluZ2lmeSAoSG90LkN1cnJlbnRQYWdlLnRlc3RNYXBzKTtcblxuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gSG90LkN1cnJlbnRQYWdlLnRlc3RQYXRocylcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxldCB0ZXN0UGF0aCA9IEhvdC5DdXJyZW50UGFnZS50ZXN0UGF0aHNba2V5XTtcblxuXHRcdFx0XHRcdFx0XHRcdHRlc3RQYXRoc1trZXldID0gdGVzdFBhdGgudG9TdHJpbmcgKCk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRsZXQgdGVzdFBhdGhzU3RyID0gSlNPTi5zdHJpbmdpZnkgKHRlc3RQYXRocyk7XG5cblx0XHRcdFx0XHRcdFx0SG90LlRlc3RlckFQSS50ZXN0ZXIucGFnZUxvYWRlZCAoe1xuXHRcdFx0XHRcdFx0XHRcdFx0dGVzdGVyTmFtZTogSG90LkN1cnJlbnRQYWdlLnRlc3Rlck5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHR0ZXN0ZXJNYXA6IEhvdC5DdXJyZW50UGFnZS50ZXN0ZXJNYXAsXG5cdFx0XHRcdFx0XHRcdFx0XHRwYWdlTmFtZTogSG90LkN1cnJlbnRQYWdlLm5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHR0ZXN0RWxlbWVudHM6IHRlc3RFbGVtZW50cyxcblx0XHRcdFx0XHRcdFx0XHRcdHRlc3RQYXRoczogdGVzdFBhdGhzU3RyXG5cdFx0XHRcdFx0XHRcdFx0fSkudGhlbiAoZnVuY3Rpb24gKHJlc3ApXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChyZXNwLmVycm9yICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAocmVzcC5lcnJvciAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAocmVzcC5lcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRIb3RTdGFxV2ViLkhvdFN0YXEuaXNSZWFkeUZvclRlc3RpbmcgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRpZiAoKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIikgfHwgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiaW50ZXJhY3RpdmVcIikpXG5cdFx0XHRcdFx0ZnVuYyAoKTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgKFwiRE9NQ29udGVudExvYWRlZFwiLCBmdW5jKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRob3RzdGFxX2lzRG9jdW1lbnRSZWFkeSAoKTtcbjwvc2NyaXB0PmA7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdEhvdFN0YXEudXNlT3V0cHV0IChvdXRwdXQpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSAocHJvY2Vzc29yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIGFuZCByZXBsYWNlIHRoZSBjdXJyZW50IEhUTUwgcGFnZSB3aXRoIHRoZSBob3R0IHNjcmlwdC5cblx0ICogVGhpcyBpcyBtZWFudCBmb3Igd2ViIGJyb3dzZXIgdXNlIG9ubHkuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgZGlzcGxheUNvbnRlbnQgKGNvbnRlbnQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBwcm9jZXNzb3I6IEhvdFN0YXEgPSBudWxsKTogUHJvbWlzZTxIb3RTdGFxPlxuXHR7XG5cdFx0cmV0dXJuIChuZXcgUHJvbWlzZTxIb3RTdGFxPiAoKHJlc29sdmUsIHJlamVjdCkgPT5cblx0XHRcdHtcblx0XHRcdFx0SG90U3RhcS5vblJlYWR5IChhc3luYyAoKSA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmIChwcm9jZXNzb3IgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0cHJvY2Vzc29yID0gbmV3IEhvdFN0YXEgKCk7XG5cblx0XHRcdFx0XHRcdGxldCBvdXRwdXQ6IHN0cmluZyA9IGF3YWl0IEhvdFN0YXEucHJvY2Vzc0NvbnRlbnQgKHByb2Nlc3NvciwgY29udGVudCwgbmFtZSk7XG5cblx0XHRcdFx0XHRcdEhvdFN0YXEudXNlT3V0cHV0IChvdXRwdXQpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSAocHJvY2Vzc29yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pKTtcblx0fVxufVxuXG4iLCJpbXBvcnQgeyBIb3RGaWxlIH0gZnJvbSBcIi4vSG90RmlsZVwiO1xuaW1wb3J0IHsgSG90UGFnZSB9IGZyb20gXCIuL0hvdFBhZ2VcIjtcbmltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5pbXBvcnQgeyBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFRlc3RFbGVtZW50IH0gZnJvbSBcIi4vSG90VGVzdEVsZW1lbnRcIjtcblxuaW1wb3J0IENvb2tpZXMgZnJvbSBcImpzLWNvb2tpZVwiO1xuaW1wb3J0IGZldGNoIGZyb20gXCJjcm9zcy1mZXRjaFwiO1xuXG4vKipcbiAqIFRoZSBhdmFpbGFibGUgZGV2ZWxvcGVyIG1vZGVzLlxuICovXG5leHBvcnQgZW51bSBEZXZlbG9wZXJNb2RlXG57XG5cdC8qKlxuXHQgKiBUaGUgZGVmYXVsdCBkZXZlbG9wZXIgbW9kZS4gTm8gdGVzdHMgd2lsbCBiZSBleGVjdXRlZCBhbmQgXG5cdCAqIGFueSB0ZXN0IHJlbGF0ZWQgZGF0YSB3aWxsIGJlIGlnbm9yZWQuXG5cdCAqL1xuXHRQcm9kdWN0aW9uLFxuXHQvKipcblx0ICogRm9yIHVzZSBkdXJpbmcgZGV2ZWxvcG1lbnQvZGVidWdnaW5nLiBBbGwgdGVzdCBkYXRhIHdpbGwgXG5cdCAqIGJlIGNvbGxlY3RlZCBhbmQgZXhlY3V0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKi9cblx0RGV2ZWxvcG1lbnRcbn1cblxuLyoqXG4gKiBBIENTUyBvYmplY3QgdG8gZW1iZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTT2JqZWN0XG57XG5cdC8qKlxuXHQgKiBUaGUgdXJsIHRvIHRoZSBDU1MgZmlsZSB0byBlbWJlZC5cblx0ICovXG5cdHVybDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGludGVncml0eSBoYXNoIHRvIGdlbmVyYXRlIGR1cmluZyBpbml0aWFsIGNvbXBpbGF0aW9uLlxuXHQgKi9cblx0aW50ZWdyaXR5SGFzaDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBhcGkgdXNlZCBkdXJpbmcgcHJvY2Vzc2luZy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFxue1xuXHQvKipcblx0ICogVGhlIGN1cnJlbnRseSBnZW5lcmF0ZWQgcGFnZSBiZWluZyBkaXNwbGF5ZWQuIFRoaXMgaXMgY2xlYXJlZCBiZXR3ZWVuIGV2ZXJ5IGZpbGUgcHJvY2Vzc2VkLlxuXHQgKi9cblx0c3RhdGljIEN1cnJlbnRQYWdlOiBIb3RQYWdlID0gbnVsbDtcblx0LyoqXG5cdCAqIFRoZSBhcmd1bWVudHMgcGFzc2VkLlxuXHQgKi9cblx0c3RhdGljIEFyZ3VtZW50czogYW55ID0gbnVsbDtcblx0LyoqXG5cdCAqIFRoZSBtb2RlIGluIHdoaWNoIHRoaXMgYXBwbGljYXRpb24gaXMgcnVubmluZy4gSWYgaXQncyBzZXQgdG8gZGV2ZWxvcG1lbnQgbW9kZSwgYWxsIHRlc3Rpbmdcblx0ICogcmVsYXRlZCBkYXRhIHdpbGwgYmUgY29sbGVjdGVkLCBwYXJzZWQsIGFuZCBleGVjdXRlZCBpZiBuZWNlc3NhcnkuXG5cdCAqL1xuXHRzdGF0aWMgRGV2ZWxvcGVyTW9kZSA9IERldmVsb3Blck1vZGU7XG5cdC8qKlxuXHQgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGlzIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIElmIGl0J3Mgc2V0IHRvIGRldmVsb3BtZW50IG1vZGUsIGFsbCB0ZXN0aW5nXG5cdCAqIHJlbGF0ZWQgZGF0YSB3aWxsIGJlIGNvbGxlY3RlZCwgcGFyc2VkLCBhbmQgZXhlY3V0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKi9cblx0c3RhdGljIEhvdFRlc3RFbGVtZW50ID0gSG90VGVzdEVsZW1lbnQ7XG5cdC8qKlxuXHQgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGlzIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIElmIGl0J3Mgc2V0IHRvIGRldmVsb3BtZW50IG1vZGUsIGFsbCB0ZXN0aW5nXG5cdCAqIHJlbGF0ZWQgZGF0YSB3aWxsIGJlIGNvbGxlY3RlZCwgcGFyc2VkLCBhbmQgZXhlY3V0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKi9cblx0c3RhdGljIE1vZGU6IERldmVsb3Blck1vZGUgPSBEZXZlbG9wZXJNb2RlLlByb2R1Y3Rpb247XG5cdC8qKlxuXHQgKlRoZSBjdXJyZW50IEFQSSB1c2VkIG9uIHRoaXMgcGFnZS4gVGhpcyBpcyBjbGVhcmVkIGJldHdlZW4gZXZlcnkgZmlsZSBwcm9jZXNzZWQuXG5cdCAqL1xuXHRzdGF0aWMgQVBJOiBIb3RBUEkgPSBudWxsO1xuXHQvKipcblx0ICogVGhlIEFQSSBiZWluZyB1c2VkIGJ5IHRoZSB0ZXN0ZXIuXG5cdCAqL1xuXHRzdGF0aWMgVGVzdGVyQVBJOiBIb3RBUEkgPSBudWxsO1xuXHQvKipcblx0ICogQ29udGFpbnMgdGhlIGJ1ZmZlciB0byBvdXRwdXQuIFRoaXMgaXMgY2xlYXJlZCBiZXR3ZWVuIGV2ZXJ5IGZpbGUgcHJvY2Vzc2VkLlxuXHQgKi9cblx0c3RhdGljIE91dHB1dDogc3RyaW5nID0gXCJcIjtcblx0LyoqXG5cdCAqIFRoZSBkYXRhIHRvIHNoYXJlIGFjcm9zcyBhbGwgdGhlIGRpZmZlcmVudCBmaWxlcyBhbmQgcGFnZXMuIFRoaXMgZGF0YSB3aWxsIGJlIHB1YmxpYy5cblx0ICovXG5cdHN0YXRpYyBEYXRhOiBhbnkgPSB7fTtcblx0LyoqXG5cdCAqIFRoZSBjb29raWVzIHRvIHVzZSBiZXR3ZWVuIHBhZ2VzLlxuXHQgKi9cblx0c3RhdGljIENvb2tpZXM6IENvb2tpZXMuQ29va2llc1N0YXRpYyA9IENvb2tpZXM7XG5cdC8qKlxuXHQgKiBBbnkgc2VjcmV0cyB0aGF0IGNhbiBiZSBzaG93biBwdWJsaWNseS4gVGhlc2UgY2FuIGJlIHBhc3NlZCBmcm9tIEhvdFNpdGUuanNvbi5cblx0ICovXG5cdHN0YXRpYyBQdWJsaWNTZWNyZXRzOiBhbnkgPSB7fTtcblx0LyoqXG5cdCAqIFRoZSBDU1Mgc3RyaW5nIHRvIHVzZSB3aGVuIGVjaG9pbmcgb3V0IHRoZSBDU1MgZmlsZXMuXG5cdCAqL1xuXHRzdGF0aWMgY3NzU3RyOiBzdHJpbmcgPSBgPGxpbmsgcmVsID0gXCJzdHlsZXNoZWV0XCIgaHJlZiA9IFwiJUNTU19GSUxFJVwiIC8+YDtcblx0LyoqXG5cdCAqIFRoZSBDU1MgZmlsZXMgdG8gdXNlIGluIHRoZSBjdXJyZW50IHBhZ2UgYmVpbmcgZ2VuZXJhdGVkLlxuXHQgKiBcblx0ICogQHRvZG8gTWFrZSB0aGlzIGEgXCJzdHJpbmcgfCBDU1NPYmplY3RcIiBkYXRhIHR5cGUgc28gaXQgY2FuIGFsc28gaW5jbHVkZSBcblx0ICogdGhlIGludGVncml0eSBoYXNoZXMgYXMgd2VsbC5cblx0ICovXG5cdHN0YXRpYyBDU1M6IHN0cmluZ1tdID0gW107XG5cdC8qKlxuXHQgKiBUaGUgSmF2YVNjcmlwdCBmaWxlcyB0byB1c2UgaW4gdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqIFxuXHQgKiBAdG9kbyBNYWtlIHRoaXMgYSBcInN0cmluZyB8IEpTRmlsZU9iamVjdFwiIGRhdGEgdHlwZSBzbyBpdCBjYW4gYWxzbyBpbmNsdWRlIFxuXHQgKiB0aGUgaW50ZWdyaXR5IGhhc2hlcyBhcyB3ZWxsLlxuXHQgKi9cblx0c3RhdGljIEpTRmlsZXM6IGFueVtdID0gW107XG5cdC8qKlxuXHQgKiBUaGUgSmF2YVNjcmlwdCBpbmxpbmUgY29kZSB0byB1c2UgaW4gdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqL1xuXHRzdGF0aWMgSlNTY3JpcHRzOiBhbnlbXSA9IFtdO1xuXHQvKipcblx0ICogVGhlIEphdmFTY3JpcHQgc3RyaW5nIHRvIHVzZSB3aGVuIGVjaG9pbmcgb3V0IHRoZSBTY3JpcHRzIGZpbGVzLlxuXHQgKi9cblx0c3RhdGljIGpzRmlsZVN0cjogc3RyaW5nID0gYDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCIgc3JjID0gXCIlSlNfRklMRSVcIj48L3NjcmlwdD5gO1xuXHQvKipcblx0ICogVGhlIEphdmFTY3JpcHQgc3RyaW5nIHRvIHVzZSB3aGVuIGVjaG9pbmcgb3V0IHRoZSBTY3JpcHRzIGZpbGVzLlxuXHQgKi9cblx0c3RhdGljIGpzU2NyaXB0c1N0cjogc3RyaW5nID0gYDxzY3JpcHQgdHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI+JUpTX0NPREUlPC9zY3JpcHQ+YDtcblxuXHQvKipcblx0ICogUmV0cmlldmUgYSBmaWxlIGFuZCBlY2hvIG91dCBpdCdzIGNvbnRlbnRzLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGluY2x1ZGUgKGZpbGU6IEhvdEZpbGUgfCBzdHJpbmcsIGFyZ3M6IGFueVtdID0gbnVsbCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGlmIChIb3RTdGFxLmlzV2ViID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGlmICh0eXBlb2YgKGZpbGUpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBsb3dlckZpbGU6IHN0cmluZyA9IGZpbGUudG9Mb3dlckNhc2UgKCk7XG5cblx0XHRcdFx0Ly8gSWYgdGhlIGZpbGUgdG8gYmUgaW5jbHVkZWQgZG9lcyBub3QgaGF2ZSBhIG5haGZhbSwgYWRkIGl0LiBUaGlzIFxuXHRcdFx0XHQvLyB3aWxsIGVuc3VyZSB0aGUgc2VydmVyIHNlbmRzIG9ubHkgdGhlIGZpbGUgY29udGVudC5cblx0XHRcdFx0aWYgKGxvd2VyRmlsZS5pbmRleE9mIChcIi5ob3R0XCIpID4gLTEpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAobG93ZXJGaWxlLmluZGV4T2YgKFwibmFoZmFtXCIpIDwgMClcblx0XHRcdFx0XHRcdGZpbGUgKz0gXCI/aHBzZXJ2ZT1uYWhmYW1cIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdEhvdC5lY2hvIChhd2FpdCBIb3QuZ2V0RmlsZSAoZmlsZSwgYXJncykpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJ1biBhbiBhbHJlYWR5IGxvYWRlZCBmaWxlIGFuZCBlY2hvIG91dCBpdCdzIGNvbnRlbnRzLlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIHJ1bkZpbGUgKGZpbGVOYW1lOiBzdHJpbmcsIGFyZ3M6IGFueVtdID0gbnVsbCk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGxldCBmaWxlOiBIb3RGaWxlID0gSG90LkN1cnJlbnRQYWdlLnByb2Nlc3Nvci5nZXRGaWxlIChmaWxlTmFtZSk7XG5cdFx0Ly8vIEBmaXhtZSBEb2VzIHRoZSBmaWxlIG5lZWQgdG8gYmUgZGVlcCBjbG9uZWQgZmlyc3Q/XG5cdFx0Ly9sZXQgY2xvbmVkRmlsZTogSG90RmlsZSA9IG5ldyBIb3RGaWxlIChPYmplY3QuYXNzaWduICh7fSwgZmlsZSkpO1xuXHRcdGxldCB0ZW1wRmlsZTogSG90RmlsZSA9IGZpbGU7XG5cblx0XHR0ZW1wRmlsZS5wYWdlID0gdGhpcy5DdXJyZW50UGFnZTtcblx0XHRsZXQgY29udGVudDogc3RyaW5nID0gYXdhaXQgdGVtcEZpbGUucHJvY2VzcyAoYXJncyk7XG5cblx0XHRIb3QuZWNobyAoY29udGVudCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBjb250ZW50IG9mIGEgZmlsZS5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBnZXRGaWxlIChwYXRoOiBIb3RGaWxlIHwgc3RyaW5nLCBhcmdzOiBhbnlbXSA9IG51bGwpOiBQcm9taXNlPHN0cmluZz5cblx0e1xuXHRcdGxldCB0ZW1wRmlsZTogSG90RmlsZSA9IG51bGw7XG5cblx0XHRpZiAodHlwZW9mIChwYXRoKSA9PT0gXCJzdHJpbmdcIilcblx0XHR7XG5cdFx0XHR0ZW1wRmlsZSA9IG5ldyBIb3RGaWxlICgpO1xuXG5cdFx0XHRpZiAoSG90U3RhcS5pc1dlYiA9PT0gdHJ1ZSlcblx0XHRcdFx0dGVtcEZpbGUudXJsID0gcGF0aDtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGVtcEZpbGUubG9jYWxGaWxlID0gcGF0aDtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGVtcEZpbGUgPSBwYXRoO1xuXG5cdFx0YXdhaXQgdGVtcEZpbGUubG9hZCAoKTtcblxuXHRcdHRlbXBGaWxlLnBhZ2UgPSB0aGlzLkN1cnJlbnRQYWdlO1xuXHRcdGxldCBjb250ZW50OiBzdHJpbmcgPSBhd2FpdCB0ZW1wRmlsZS5wcm9jZXNzIChhcmdzKTtcblxuXHRcdHJldHVybiAoY29udGVudCk7XG5cdH1cblxuXHQvKipcblx0ICogTWFrZSBhbiBhcGkgY2FsbC5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBhcGlDYWxsIChyb3V0ZTogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsLCBodHRwTWV0aG9kOiBzdHJpbmcgPSBcIlBPU1RcIik6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0bGV0IHJlc3VsdDogYW55ID0gbnVsbDtcblxuXHRcdGlmIChIb3QuQ3VycmVudFBhZ2UgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJDdXJyZW50IHBhZ2UgaXMgbnVsbCFcIik7XG5cblx0XHRpZiAoSG90LkN1cnJlbnRQYWdlLnByb2Nlc3NvciA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIkN1cnJlbnQgcGFnZSdzIHByb2Nlc3NvciBpcyBudWxsIVwiKTtcblxuXHRcdGlmIChIb3QuQ3VycmVudFBhZ2UucHJvY2Vzc29yLmFwaSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChcIkN1cnJlbnQgcGFnZSdzIHByb2Nlc3NvciBhcGkgaXMgbnVsbCFcIik7XG5cblx0XHRpZiAoSG90LkN1cnJlbnRQYWdlLnByb2Nlc3Nvci5hcGkgIT0gbnVsbClcblx0XHRcdHJlc3VsdCA9IGF3YWl0IEhvdC5DdXJyZW50UGFnZS5wcm9jZXNzb3IuYXBpLm1ha2VDYWxsIChyb3V0ZSwgZGF0YSwgaHR0cE1ldGhvZCk7XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogTWFrZSBhIEhUVFAgSlNPTiByZXF1ZXN0LlxuXHQgKiBcblx0ICogQHBhcmFtIHVybCBUaGUgZnVsbCB1cmwgdG8gbWFrZSB0aGUgSFRUUCBjYWxsLlxuXHQgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBKU09OLnN0cmluZ2lmeSBhbmQgc2VuZC5cblx0ICogQHBhcmFtIGh0dHBNZXRob2QgVGhlIEhUVFAgbWV0aG9kIHRvIHVzZSB0byBzZW5kIHRoZSBkYXRhLlxuXHQgKiBcblx0ICogQHJldHVybnMgVGhlIHBhcnNlZCBKU09OIG9iamVjdC5cblx0ICovXG5cdHN0YXRpYyBhc3luYyBqc29uUmVxdWVzdCAodXJsOiBzdHJpbmcsIGRhdGE6IGFueSA9IG51bGwsIGh0dHBNZXRob2Q6IHN0cmluZyA9IFwiUE9TVFwiKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHR0cnlcblx0XHR7XG5cdFx0XHRsZXQgcmVzOiBSZXNwb25zZSA9IGF3YWl0IGZldGNoICh1cmwsIHtcblx0XHRcdFx0XHRcIm1ldGhvZFwiOiBodHRwTWV0aG9kLFxuXHRcdFx0XHRcdFwiaGVhZGVyc1wiOiB7XG5cdFx0XHRcdFx0XHRcdFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuXHRcdFx0XHRcdFx0XHRcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcImJvZHlcIjogSlNPTi5zdHJpbmdpZnkgKGRhdGEpXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRpZiAocmVzLm9rID09PSBmYWxzZSlcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgJHtyZXMuc3RhdHVzfTogJHtyZXMuc3RhdHVzVGV4dH1gKTtcblxuXHRcdFx0bGV0IHJlc3VsdDogYW55ID0gYXdhaXQgcmVzLmpzb24gKCk7XG5cblx0XHRcdHJldHVybiAocmVzdWx0KTtcblx0XHR9XG5cdFx0Y2F0Y2ggKGV4KVxuXHRcdHtcblx0XHRcdHJldHVybiAoSlNPTi5zdHJpbmdpZnkgKHsgXCJlcnJvclwiOiBgJHtleC5tZXNzYWdlfSAtIENvdWxkIG5vdCBmZXRjaCAke3VybH1gIH0pKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWFrZSBhIEhUVFAgcmVxdWVzdC4gVGhpcyBpcyBiYXNpY2FsbHkganVzdCBhIHdyYXBwZXIgZm9yIGZldGNoLlxuXHQgKiBcblx0ICogQHBhcmFtIHVybCBUaGUgZnVsbCB1cmwgdG8gbWFrZSB0aGUgSFRUUCBjYWxsLlxuXHQgKiBAcGFyYW0gcmVxdWVzdEluaXQgVGhlIHJlcXVlc3QgcGFyYW1ldGVycyB0byBzZW5kLlxuXHQgKiBcblx0ICogQHJldHVybnMgVGhlIEhUVFAgcmVzcG9uc2UuXG5cdCAqL1xuXHRzdGF0aWMgYXN5bmMgaHR0cFJlcXVlc3QgKHVybDogc3RyaW5nLCByZXF1ZXN0SW5pdDogUmVxdWVzdEluaXQgPSB1bmRlZmluZWQpOiBQcm9taXNlPFJlc3BvbnNlPlxuXHR7XG5cdFx0bGV0IHJlczogUmVzcG9uc2UgPSBhd2FpdCBmZXRjaCAodXJsLCByZXF1ZXN0SW5pdCk7XG5cblx0XHRyZXR1cm4gKHJlcyk7XG5cdH1cblxuXHQvKipcblx0ICogRWNobyBvdXQgc29tZSBvdXRwdXQuXG5cdCAqL1xuXHRzdGF0aWMgZWNobyAobWVzc2FnZTogc3RyaW5nKTogdm9pZFxuXHR7XG5cdFx0SG90Lk91dHB1dCArPSBtZXNzYWdlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEVjaG8gb3V0IHRoZSBDU1MgZm9yIHRoZSBjdXJyZW50IHBhZ2UgYmVpbmcgZ2VuZXJhdGVkLlxuXHQgKi9cblx0c3RhdGljIGRpc3BsYXlDU1MgKCk6IHZvaWRcblx0e1xuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgSG90LkNTUy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgY3NzRmlsZTogc3RyaW5nID0gSG90LkNTU1tpSWR4XTtcblx0XHRcdGxldCBjc3NPdXQ6IHN0cmluZyA9IEhvdC5jc3NTdHI7XG5cblx0XHRcdGNzc091dCA9IGNzc091dC5yZXBsYWNlICgvXFwlQ1NTX0ZJTEVcXCUvZywgY3NzRmlsZSk7XG5cblx0XHRcdEhvdC5lY2hvIChjc3NPdXQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFY2hvIG91dCB0aGUgSlMgZmlsZXMgZm9yIHRoZSBjdXJyZW50IHBhZ2UgYmVpbmcgZ2VuZXJhdGVkLlxuXHQgKi9cblx0c3RhdGljIGRpc3BsYXlKU0ZpbGVzICgpOiB2b2lkXG5cdHtcblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IEhvdC5KU0ZpbGVzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBqc0ZpbGU6IHN0cmluZyA9IEhvdC5KU0ZpbGVzW2lJZHhdO1xuXHRcdFx0bGV0IGpzRmlsZU91dDogc3RyaW5nID0gSG90LmpzRmlsZVN0cjtcblxuXHRcdFx0anNGaWxlT3V0ID0ganNGaWxlT3V0LnJlcGxhY2UgKC9cXCVKU19GSUxFXFwlL2csIGpzRmlsZSk7XG5cblx0XHRcdEhvdC5lY2hvIChqc0ZpbGVPdXQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFY2hvIG91dCB0aGUgSlMgc2NyaXB0cyBmb3IgdGhlIGN1cnJlbnQgcGFnZSBiZWluZyBnZW5lcmF0ZWQuXG5cdCAqL1xuXHRzdGF0aWMgZGlzcGxheUpTU2NyaXB0cyAoKTogdm9pZFxuXHR7XG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBIb3QuSlNTY3JpcHRzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBqc1NjcmlwdDogc3RyaW5nID0gSG90LkpTU2NyaXB0c1tpSWR4XTtcblx0XHRcdGxldCBqc1NjcmlwdE91dDogc3RyaW5nID0gSG90LmpzU2NyaXB0c1N0cjtcblxuXHRcdFx0anNTY3JpcHRPdXQgPSBqc1NjcmlwdE91dC5yZXBsYWNlICgvXFwlSlNfQ09ERVxcJS9nLCBqc1NjcmlwdCk7XG5cblx0XHRcdEhvdC5lY2hvIChqc1NjcmlwdE91dCk7XG5cdFx0fVxuXHR9XG59IiwidmFyIGdsb2JhbCA9IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0aGlzO1xudmFyIF9fc2VsZl9fID0gKGZ1bmN0aW9uICgpIHtcbmZ1bmN0aW9uIEYoKSB7XG50aGlzLmZldGNoID0gZmFsc2U7XG50aGlzLkRPTUV4Y2VwdGlvbiA9IGdsb2JhbC5ET01FeGNlcHRpb25cbn1cbkYucHJvdG90eXBlID0gZ2xvYmFsO1xucmV0dXJuIG5ldyBGKCk7XG59KSgpO1xuKGZ1bmN0aW9uKHNlbGYpIHtcblxudmFyIGlycmVsZXZhbnQgPSAoZnVuY3Rpb24gKGV4cG9ydHMpIHtcblxuICB2YXIgc3VwcG9ydCA9IHtcbiAgICBzZWFyY2hQYXJhbXM6ICdVUkxTZWFyY2hQYXJhbXMnIGluIHNlbGYsXG4gICAgaXRlcmFibGU6ICdTeW1ib2wnIGluIHNlbGYgJiYgJ2l0ZXJhdG9yJyBpbiBTeW1ib2wsXG4gICAgYmxvYjpcbiAgICAgICdGaWxlUmVhZGVyJyBpbiBzZWxmICYmXG4gICAgICAnQmxvYicgaW4gc2VsZiAmJlxuICAgICAgKGZ1bmN0aW9uKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG5ldyBCbG9iKCk7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgIGZvcm1EYXRhOiAnRm9ybURhdGEnIGluIHNlbGYsXG4gICAgYXJyYXlCdWZmZXI6ICdBcnJheUJ1ZmZlcicgaW4gc2VsZlxuICB9O1xuXG4gIGZ1bmN0aW9uIGlzRGF0YVZpZXcob2JqKSB7XG4gICAgcmV0dXJuIG9iaiAmJiBEYXRhVmlldy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvYmopXG4gIH1cblxuICBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlcikge1xuICAgIHZhciB2aWV3Q2xhc3NlcyA9IFtcbiAgICAgICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgICAgJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgICAgJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICAgICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICAgICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgICAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgICAnW29iamVjdCBVaW50MzJBcnJheV0nLFxuICAgICAgJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgICAnW29iamVjdCBGbG9hdDY0QXJyYXldJ1xuICAgIF07XG5cbiAgICB2YXIgaXNBcnJheUJ1ZmZlclZpZXcgPVxuICAgICAgQXJyYXlCdWZmZXIuaXNWaWV3IHx8XG4gICAgICBmdW5jdGlvbihvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiAmJiB2aWV3Q2xhc3Nlcy5pbmRleE9mKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopKSA+IC0xXG4gICAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gbm9ybWFsaXplTmFtZShuYW1lKSB7XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgbmFtZSA9IFN0cmluZyhuYW1lKTtcbiAgICB9XG4gICAgaWYgKC9bXmEtejAtOVxcLSMkJSYnKisuXl9gfH5dL2kudGVzdChuYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGVhZGVyIGZpZWxkIG5hbWUnKVxuICAgIH1cbiAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpXG4gIH1cblxuICBmdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLy8gQnVpbGQgYSBkZXN0cnVjdGl2ZSBpdGVyYXRvciBmb3IgdGhlIHZhbHVlIGxpc3RcbiAgZnVuY3Rpb24gaXRlcmF0b3JGb3IoaXRlbXMpIHtcbiAgICB2YXIgaXRlcmF0b3IgPSB7XG4gICAgICBuZXh0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gaXRlbXMuc2hpZnQoKTtcbiAgICAgICAgcmV0dXJuIHtkb25lOiB2YWx1ZSA9PT0gdW5kZWZpbmVkLCB2YWx1ZTogdmFsdWV9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChzdXBwb3J0Lml0ZXJhYmxlKSB7XG4gICAgICBpdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvclxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlcmF0b3JcbiAgfVxuXG4gIGZ1bmN0aW9uIEhlYWRlcnMoaGVhZGVycykge1xuICAgIHRoaXMubWFwID0ge307XG5cbiAgICBpZiAoaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICAgIGhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICB0aGlzLmFwcGVuZChuYW1lLCB2YWx1ZSk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVycykpIHtcbiAgICAgIGhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbihoZWFkZXIpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoaGVhZGVyWzBdLCBoZWFkZXJbMV0pO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfSBlbHNlIGlmIChoZWFkZXJzKSB7XG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhoZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobmFtZSwgaGVhZGVyc1tuYW1lXSk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9XG4gIH1cblxuICBIZWFkZXJzLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgIG5hbWUgPSBub3JtYWxpemVOYW1lKG5hbWUpO1xuICAgIHZhbHVlID0gbm9ybWFsaXplVmFsdWUodmFsdWUpO1xuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMubWFwW25hbWVdO1xuICAgIHRoaXMubWFwW25hbWVdID0gb2xkVmFsdWUgPyBvbGRWYWx1ZSArICcsICcgKyB2YWx1ZSA6IHZhbHVlO1xuICB9O1xuXG4gIEhlYWRlcnMucHJvdG90eXBlWydkZWxldGUnXSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5tYXBbbm9ybWFsaXplTmFtZShuYW1lKV07XG4gIH07XG5cbiAgSGVhZGVycy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24obmFtZSkge1xuICAgIG5hbWUgPSBub3JtYWxpemVOYW1lKG5hbWUpO1xuICAgIHJldHVybiB0aGlzLmhhcyhuYW1lKSA/IHRoaXMubWFwW25hbWVdIDogbnVsbFxuICB9O1xuXG4gIEhlYWRlcnMucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuaGFzT3duUHJvcGVydHkobm9ybWFsaXplTmFtZShuYW1lKSlcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgIHRoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldID0gbm9ybWFsaXplVmFsdWUodmFsdWUpO1xuICB9O1xuXG4gIEhlYWRlcnMucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcy5tYXApIHtcbiAgICAgIGlmICh0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHRoaXMubWFwW25hbWVdLCBuYW1lLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgSGVhZGVycy5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtcyA9IFtdO1xuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgaXRlbXMucHVzaChuYW1lKTtcbiAgICB9KTtcbiAgICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG4gIH07XG5cbiAgSGVhZGVycy5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW1zID0gW107XG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBpdGVtcy5wdXNoKHZhbHVlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG4gIH07XG5cbiAgSGVhZGVycy5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtcyA9IFtdO1xuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgaXRlbXMucHVzaChbbmFtZSwgdmFsdWVdKTtcbiAgICB9KTtcbiAgICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG4gIH07XG5cbiAgaWYgKHN1cHBvcnQuaXRlcmFibGUpIHtcbiAgICBIZWFkZXJzLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gSGVhZGVycy5wcm90b3R5cGUuZW50cmllcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnN1bWVkKGJvZHkpIHtcbiAgICBpZiAoYm9keS5ib2R5VXNlZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpKVxuICAgIH1cbiAgICBib2R5LmJvZHlVc2VkID0gdHJ1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlc29sdmUocmVhZGVyLnJlc3VsdCk7XG4gICAgICB9O1xuICAgICAgcmVhZGVyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KHJlYWRlci5lcnJvcik7XG4gICAgICB9O1xuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiByZWFkQmxvYkFzQXJyYXlCdWZmZXIoYmxvYikge1xuICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHZhciBwcm9taXNlID0gZmlsZVJlYWRlclJlYWR5KHJlYWRlcik7XG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICAgIHJldHVybiBwcm9taXNlXG4gIH1cblxuICBmdW5jdGlvbiByZWFkQmxvYkFzVGV4dChibG9iKSB7XG4gICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgdmFyIHByb21pc2UgPSBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKTtcbiAgICByZWFkZXIucmVhZEFzVGV4dChibG9iKTtcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZEFycmF5QnVmZmVyQXNUZXh0KGJ1Zikge1xuICAgIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICB2YXIgY2hhcnMgPSBuZXcgQXJyYXkodmlldy5sZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aWV3Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGFyc1tpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUodmlld1tpXSk7XG4gICAgfVxuICAgIHJldHVybiBjaGFycy5qb2luKCcnKVxuICB9XG5cbiAgZnVuY3Rpb24gYnVmZmVyQ2xvbmUoYnVmKSB7XG4gICAgaWYgKGJ1Zi5zbGljZSkge1xuICAgICAgcmV0dXJuIGJ1Zi5zbGljZSgwKVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zi5ieXRlTGVuZ3RoKTtcbiAgICAgIHZpZXcuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZikpO1xuICAgICAgcmV0dXJuIHZpZXcuYnVmZmVyXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gQm9keSgpIHtcbiAgICB0aGlzLmJvZHlVc2VkID0gZmFsc2U7XG5cbiAgICB0aGlzLl9pbml0Qm9keSA9IGZ1bmN0aW9uKGJvZHkpIHtcbiAgICAgIHRoaXMuX2JvZHlJbml0ID0gYm9keTtcbiAgICAgIGlmICghYm9keSkge1xuICAgICAgICB0aGlzLl9ib2R5VGV4dCA9ICcnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5O1xuICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LmJsb2IgJiYgQmxvYi5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgICB0aGlzLl9ib2R5QmxvYiA9IGJvZHk7XG4gICAgICB9IGVsc2UgaWYgKHN1cHBvcnQuZm9ybURhdGEgJiYgRm9ybURhdGEucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgICAgdGhpcy5fYm9keUZvcm1EYXRhID0gYm9keTtcbiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5zZWFyY2hQYXJhbXMgJiYgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keS50b1N0cmluZygpO1xuICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyICYmIHN1cHBvcnQuYmxvYiAmJiBpc0RhdGFWaWV3KGJvZHkpKSB7XG4gICAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkuYnVmZmVyKTtcbiAgICAgICAgLy8gSUUgMTAtMTEgY2FuJ3QgaGFuZGxlIGEgRGF0YVZpZXcgYm9keS5cbiAgICAgICAgdGhpcy5fYm9keUluaXQgPSBuZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSk7XG4gICAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIgJiYgKEFycmF5QnVmZmVyLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpIHx8IGlzQXJyYXlCdWZmZXJWaWV3KGJvZHkpKSkge1xuICAgICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIgPSBidWZmZXJDbG9uZShib2R5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChib2R5KTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSkge1xuICAgICAgICBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ3RleHQvcGxhaW47Y2hhcnNldD1VVEYtOCcpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlCbG9iICYmIHRoaXMuX2JvZHlCbG9iLnR5cGUpIHtcbiAgICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCB0aGlzLl9ib2R5QmxvYi50eXBlKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LnNlYXJjaFBhcmFtcyAmJiBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoc3VwcG9ydC5ibG9iKSB7XG4gICAgICB0aGlzLmJsb2IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcyk7XG4gICAgICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgICAgIHJldHVybiByZWplY3RlZFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2JvZHlCbG9iKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QmxvYilcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKSlcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5Rm9ybURhdGEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgYmxvYicpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keVRleHRdKSlcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdGhpcy5hcnJheUJ1ZmZlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnN1bWVkKHRoaXMpIHx8IFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmxvYigpLnRoZW4ocmVhZEJsb2JBc0FycmF5QnVmZmVyKVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMudGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcyk7XG4gICAgICBpZiAocmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdGVkXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9ib2R5QmxvYikge1xuICAgICAgICByZXR1cm4gcmVhZEJsb2JBc1RleHQodGhpcy5fYm9keUJsb2IpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlYWRBcnJheUJ1ZmZlckFzVGV4dCh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5Rm9ybURhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIHRleHQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5VGV4dClcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHN1cHBvcnQuZm9ybURhdGEpIHtcbiAgICAgIHRoaXMuZm9ybURhdGEgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oZGVjb2RlKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLmpzb24gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHQoKS50aGVuKEpTT04ucGFyc2UpXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvLyBIVFRQIG1ldGhvZHMgd2hvc2UgY2FwaXRhbGl6YXRpb24gc2hvdWxkIGJlIG5vcm1hbGl6ZWRcbiAgdmFyIG1ldGhvZHMgPSBbJ0RFTEVURScsICdHRVQnLCAnSEVBRCcsICdPUFRJT05TJywgJ1BPU1QnLCAnUFVUJ107XG5cbiAgZnVuY3Rpb24gbm9ybWFsaXplTWV0aG9kKG1ldGhvZCkge1xuICAgIHZhciB1cGNhc2VkID0gbWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gICAgcmV0dXJuIG1ldGhvZHMuaW5kZXhPZih1cGNhc2VkKSA+IC0xID8gdXBjYXNlZCA6IG1ldGhvZFxuICB9XG5cbiAgZnVuY3Rpb24gUmVxdWVzdChpbnB1dCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHZhciBib2R5ID0gb3B0aW9ucy5ib2R5O1xuXG4gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgICAgaWYgKGlucHV0LmJvZHlVc2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpXG4gICAgICB9XG4gICAgICB0aGlzLnVybCA9IGlucHV0LnVybDtcbiAgICAgIHRoaXMuY3JlZGVudGlhbHMgPSBpbnB1dC5jcmVkZW50aWFscztcbiAgICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKGlucHV0LmhlYWRlcnMpO1xuICAgICAgfVxuICAgICAgdGhpcy5tZXRob2QgPSBpbnB1dC5tZXRob2Q7XG4gICAgICB0aGlzLm1vZGUgPSBpbnB1dC5tb2RlO1xuICAgICAgdGhpcy5zaWduYWwgPSBpbnB1dC5zaWduYWw7XG4gICAgICBpZiAoIWJvZHkgJiYgaW5wdXQuX2JvZHlJbml0ICE9IG51bGwpIHtcbiAgICAgICAgYm9keSA9IGlucHV0Ll9ib2R5SW5pdDtcbiAgICAgICAgaW5wdXQuYm9keVVzZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVybCA9IFN0cmluZyhpbnB1dCk7XG4gICAgfVxuXG4gICAgdGhpcy5jcmVkZW50aWFscyA9IG9wdGlvbnMuY3JlZGVudGlhbHMgfHwgdGhpcy5jcmVkZW50aWFscyB8fCAnc2FtZS1vcmlnaW4nO1xuICAgIGlmIChvcHRpb25zLmhlYWRlcnMgfHwgIXRoaXMuaGVhZGVycykge1xuICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKTtcbiAgICB9XG4gICAgdGhpcy5tZXRob2QgPSBub3JtYWxpemVNZXRob2Qob3B0aW9ucy5tZXRob2QgfHwgdGhpcy5tZXRob2QgfHwgJ0dFVCcpO1xuICAgIHRoaXMubW9kZSA9IG9wdGlvbnMubW9kZSB8fCB0aGlzLm1vZGUgfHwgbnVsbDtcbiAgICB0aGlzLnNpZ25hbCA9IG9wdGlvbnMuc2lnbmFsIHx8IHRoaXMuc2lnbmFsO1xuICAgIHRoaXMucmVmZXJyZXIgPSBudWxsO1xuXG4gICAgaWYgKCh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykgJiYgYm9keSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9keSBub3QgYWxsb3dlZCBmb3IgR0VUIG9yIEhFQUQgcmVxdWVzdHMnKVxuICAgIH1cbiAgICB0aGlzLl9pbml0Qm9keShib2R5KTtcbiAgfVxuXG4gIFJlcXVlc3QucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBSZXF1ZXN0KHRoaXMsIHtib2R5OiB0aGlzLl9ib2R5SW5pdH0pXG4gIH07XG5cbiAgZnVuY3Rpb24gZGVjb2RlKGJvZHkpIHtcbiAgICB2YXIgZm9ybSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGJvZHlcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgnJicpXG4gICAgICAuZm9yRWFjaChmdW5jdGlvbihieXRlcykge1xuICAgICAgICBpZiAoYnl0ZXMpIHtcbiAgICAgICAgICB2YXIgc3BsaXQgPSBieXRlcy5zcGxpdCgnPScpO1xuICAgICAgICAgIHZhciBuYW1lID0gc3BsaXQuc2hpZnQoKS5yZXBsYWNlKC9cXCsvZywgJyAnKTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBzcGxpdC5qb2luKCc9JykucmVwbGFjZSgvXFwrL2csICcgJyk7XG4gICAgICAgICAgZm9ybS5hcHBlbmQoZGVjb2RlVVJJQ29tcG9uZW50KG5hbWUpLCBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgcmV0dXJuIGZvcm1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKSB7XG4gICAgdmFyIGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICAgIC8vIFJlcGxhY2UgaW5zdGFuY2VzIG9mIFxcclxcbiBhbmQgXFxuIGZvbGxvd2VkIGJ5IGF0IGxlYXN0IG9uZSBzcGFjZSBvciBob3Jpem9udGFsIHRhYiB3aXRoIGEgc3BhY2VcbiAgICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMlxuICAgIHZhciBwcmVQcm9jZXNzZWRIZWFkZXJzID0gcmF3SGVhZGVycy5yZXBsYWNlKC9cXHI/XFxuW1xcdCBdKy9nLCAnICcpO1xuICAgIHByZVByb2Nlc3NlZEhlYWRlcnMuc3BsaXQoL1xccj9cXG4vKS5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgIHZhciBwYXJ0cyA9IGxpbmUuc3BsaXQoJzonKTtcbiAgICAgIHZhciBrZXkgPSBwYXJ0cy5zaGlmdCgpLnRyaW0oKTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gcGFydHMuam9pbignOicpLnRyaW0oKTtcbiAgICAgICAgaGVhZGVycy5hcHBlbmQoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGhlYWRlcnNcbiAgfVxuXG4gIEJvZHkuY2FsbChSZXF1ZXN0LnByb3RvdHlwZSk7XG5cbiAgZnVuY3Rpb24gUmVzcG9uc2UoYm9keUluaXQsIG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICB0aGlzLnR5cGUgPSAnZGVmYXVsdCc7XG4gICAgdGhpcy5zdGF0dXMgPSBvcHRpb25zLnN0YXR1cyA9PT0gdW5kZWZpbmVkID8gMjAwIDogb3B0aW9ucy5zdGF0dXM7XG4gICAgdGhpcy5vayA9IHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDMwMDtcbiAgICB0aGlzLnN0YXR1c1RleHQgPSAnc3RhdHVzVGV4dCcgaW4gb3B0aW9ucyA/IG9wdGlvbnMuc3RhdHVzVGV4dCA6ICdPSyc7XG4gICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKTtcbiAgICB0aGlzLnVybCA9IG9wdGlvbnMudXJsIHx8ICcnO1xuICAgIHRoaXMuX2luaXRCb2R5KGJvZHlJbml0KTtcbiAgfVxuXG4gIEJvZHkuY2FsbChSZXNwb25zZS5wcm90b3R5cGUpO1xuXG4gIFJlc3BvbnNlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5fYm9keUluaXQsIHtcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBzdGF0dXNUZXh0OiB0aGlzLnN0YXR1c1RleHQsXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh0aGlzLmhlYWRlcnMpLFxuICAgICAgdXJsOiB0aGlzLnVybFxuICAgIH0pXG4gIH07XG5cbiAgUmVzcG9uc2UuZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UobnVsbCwge3N0YXR1czogMCwgc3RhdHVzVGV4dDogJyd9KTtcbiAgICByZXNwb25zZS50eXBlID0gJ2Vycm9yJztcbiAgICByZXR1cm4gcmVzcG9uc2VcbiAgfTtcblxuICB2YXIgcmVkaXJlY3RTdGF0dXNlcyA9IFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF07XG5cbiAgUmVzcG9uc2UucmVkaXJlY3QgPSBmdW5jdGlvbih1cmwsIHN0YXR1cykge1xuICAgIGlmIChyZWRpcmVjdFN0YXR1c2VzLmluZGV4T2Yoc3RhdHVzKSA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHN0YXR1cyBjb2RlJylcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKG51bGwsIHtzdGF0dXM6IHN0YXR1cywgaGVhZGVyczoge2xvY2F0aW9uOiB1cmx9fSlcbiAgfTtcblxuICBleHBvcnRzLkRPTUV4Y2VwdGlvbiA9IHNlbGYuRE9NRXhjZXB0aW9uO1xuICB0cnkge1xuICAgIG5ldyBleHBvcnRzLkRPTUV4Y2VwdGlvbigpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBleHBvcnRzLkRPTUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UsIG5hbWUpIHtcbiAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgdmFyIGVycm9yID0gRXJyb3IobWVzc2FnZSk7XG4gICAgICB0aGlzLnN0YWNrID0gZXJyb3Iuc3RhY2s7XG4gICAgfTtcbiAgICBleHBvcnRzLkRPTUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG4gICAgZXhwb3J0cy5ET01FeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gZXhwb3J0cy5ET01FeGNlcHRpb247XG4gIH1cblxuICBmdW5jdGlvbiBmZXRjaChpbnB1dCwgaW5pdCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoaW5wdXQsIGluaXQpO1xuXG4gICAgICBpZiAocmVxdWVzdC5zaWduYWwgJiYgcmVxdWVzdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBleHBvcnRzLkRPTUV4Y2VwdGlvbignQWJvcnRlZCcsICdBYm9ydEVycm9yJykpXG4gICAgICB9XG5cbiAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgICAgZnVuY3Rpb24gYWJvcnRYaHIoKSB7XG4gICAgICAgIHhoci5hYm9ydCgpO1xuICAgICAgfVxuXG4gICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgIHN0YXR1czogeGhyLnN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiB4aHIuc3RhdHVzVGV4dCxcbiAgICAgICAgICBoZWFkZXJzOiBwYXJzZUhlYWRlcnMoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpIHx8ICcnKVxuICAgICAgICB9O1xuICAgICAgICBvcHRpb25zLnVybCA9ICdyZXNwb25zZVVSTCcgaW4geGhyID8geGhyLnJlc3BvbnNlVVJMIDogb3B0aW9ucy5oZWFkZXJzLmdldCgnWC1SZXF1ZXN0LVVSTCcpO1xuICAgICAgICB2YXIgYm9keSA9ICdyZXNwb25zZScgaW4geGhyID8geGhyLnJlc3BvbnNlIDogeGhyLnJlc3BvbnNlVGV4dDtcbiAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UoYm9keSwgb3B0aW9ucykpO1xuICAgICAgfTtcblxuICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQnKSk7XG4gICAgICB9O1xuXG4gICAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKCdOZXR3b3JrIHJlcXVlc3QgZmFpbGVkJykpO1xuICAgICAgfTtcblxuICAgICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBleHBvcnRzLkRPTUV4Y2VwdGlvbignQWJvcnRlZCcsICdBYm9ydEVycm9yJykpO1xuICAgICAgfTtcblxuICAgICAgeGhyLm9wZW4ocmVxdWVzdC5tZXRob2QsIHJlcXVlc3QudXJsLCB0cnVlKTtcblxuICAgICAgaWYgKHJlcXVlc3QuY3JlZGVudGlhbHMgPT09ICdpbmNsdWRlJykge1xuICAgICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5jcmVkZW50aWFscyA9PT0gJ29taXQnKSB7XG4gICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCdyZXNwb25zZVR5cGUnIGluIHhociAmJiBzdXBwb3J0LmJsb2IpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdibG9iJztcbiAgICAgIH1cblxuICAgICAgcmVxdWVzdC5oZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXF1ZXN0LnNpZ25hbCkge1xuICAgICAgICByZXF1ZXN0LnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0WGhyKTtcblxuICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgLy8gRE9ORSAoc3VjY2VzcyBvciBmYWlsdXJlKVxuICAgICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgICAgcmVxdWVzdC5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydFhocik7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB4aHIuc2VuZCh0eXBlb2YgcmVxdWVzdC5fYm9keUluaXQgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IHJlcXVlc3QuX2JvZHlJbml0KTtcbiAgICB9KVxuICB9XG5cbiAgZmV0Y2gucG9seWZpbGwgPSB0cnVlO1xuXG4gIGlmICghc2VsZi5mZXRjaCkge1xuICAgIHNlbGYuZmV0Y2ggPSBmZXRjaDtcbiAgICBzZWxmLkhlYWRlcnMgPSBIZWFkZXJzO1xuICAgIHNlbGYuUmVxdWVzdCA9IFJlcXVlc3Q7XG4gICAgc2VsZi5SZXNwb25zZSA9IFJlc3BvbnNlO1xuICB9XG5cbiAgZXhwb3J0cy5IZWFkZXJzID0gSGVhZGVycztcbiAgZXhwb3J0cy5SZXF1ZXN0ID0gUmVxdWVzdDtcbiAgZXhwb3J0cy5SZXNwb25zZSA9IFJlc3BvbnNlO1xuICBleHBvcnRzLmZldGNoID0gZmV0Y2g7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuICByZXR1cm4gZXhwb3J0cztcblxufSh7fSkpO1xufSkoX19zZWxmX18pO1xuX19zZWxmX18uZmV0Y2gucG9ueWZpbGwgPSB0cnVlO1xuLy8gUmVtb3ZlIFwicG9seWZpbGxcIiBwcm9wZXJ0eSBhZGRlZCBieSB3aGF0d2ctZmV0Y2hcbmRlbGV0ZSBfX3NlbGZfXy5mZXRjaC5wb2x5ZmlsbDtcbi8vIENob29zZSBiZXR3ZWVuIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiAoZ2xvYmFsKSBvciBjdXN0b20gaW1wbGVtZW50YXRpb24gKF9fc2VsZl9fKVxuLy8gdmFyIGN0eCA9IGdsb2JhbC5mZXRjaCA/IGdsb2JhbCA6IF9fc2VsZl9fO1xudmFyIGN0eCA9IF9fc2VsZl9fOyAvLyB0aGlzIGxpbmUgZGlzYWJsZSBzZXJ2aWNlIHdvcmtlciBzdXBwb3J0IHRlbXBvcmFyaWx5XG5leHBvcnRzID0gY3R4LmZldGNoIC8vIFRvIGVuYWJsZTogaW1wb3J0IGZldGNoIGZyb20gJ2Nyb3NzLWZldGNoJ1xuZXhwb3J0cy5kZWZhdWx0ID0gY3R4LmZldGNoIC8vIEZvciBUeXBlU2NyaXB0IGNvbnN1bWVycyB3aXRob3V0IGVzTW9kdWxlSW50ZXJvcC5cbmV4cG9ydHMuZmV0Y2ggPSBjdHguZmV0Y2ggLy8gVG8gZW5hYmxlOiBpbXBvcnQge2ZldGNofSBmcm9tICdjcm9zcy1mZXRjaCdcbmV4cG9ydHMuSGVhZGVycyA9IGN0eC5IZWFkZXJzXG5leHBvcnRzLlJlcXVlc3QgPSBjdHguUmVxdWVzdFxuZXhwb3J0cy5SZXNwb25zZSA9IGN0eC5SZXNwb25zZVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzXG4iLCJpbXBvcnQgeyBIb3RTdGFxIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuaW1wb3J0IHsgSG90TG9nIH0gZnJvbSBcIi4vSG90TG9nXCI7XG5pbXBvcnQgeyBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBlbnVtIEhvdFNlcnZlclR5cGVcbntcblx0SFRUUCxcblx0V2ViU29ja2V0c1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUhvdFNlcnZlclxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgc2VydmVyIHR5cGUuXG5cdCAqL1xuXHRzZXJ2ZXJUeXBlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgQVBJIHRvIHVzZS5cblx0ICovXG5cdGFwaTogSG90QVBJO1xuXHQvKipcblx0ICogVGhlIG5ldHdvcmsgYWRkcmVzcyB0byBsaXN0ZW4gb24uXG5cdCAqL1xuXHRsaXN0ZW5BZGRyZXNzOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcG9ydHMgdG8gdXNlLlxuXHQgKi9cblx0cG9ydHM6IHtcblx0XHRcdGh0dHA6IG51bWJlcjtcblx0XHRcdGh0dHBzOiBudW1iZXI7XG5cdFx0fTtcblx0LyoqXG5cdCAqIFNTTCBzZXR0aW5ncy5cblx0ICovXG5cdHNzbDoge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgU1NMIGNlcnRpZmljYXRlIHRvIHVzZS5cblx0XHRcdCAqL1xuXHRcdFx0Y2VydDogc3RyaW5nO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgU1NMIGNlcnRpZmljYXRlIGtleSB0byB1c2UuXG5cdFx0XHQgKi9cblx0XHRcdGtleTogc3RyaW5nO1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgU1NMIGNlcnRpZmljYXRlIENBIHRvIHVzZS5cblx0XHRcdCAqL1xuXHRcdFx0Y2E6IHN0cmluZztcblx0XHR9O1xuXHQvKipcblx0ICogUmVkaXJlY3QgSFRUUCB0cmFmZmljIHRvIEhUVFBTLlxuXHQgKi9cblx0cmVkaXJlY3RIVFRQdG9IVFRQUzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFRoZSB0eXBlIG9mIHNlcnZlci5cblx0ICovXG5cdHR5cGU6IEhvdFNlcnZlclR5cGU7XG5cdC8qKlxuXHQgKiBUaGUgbG9nZ2VyLlxuXHQgKi9cblx0bG9nZ2VyOiBIb3RMb2c7XG5cdC8qKlxuXHQgKiBBbnkgc2VjcmV0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2ZXIuXG5cdCAqL1xuXHRzZWNyZXRzOiBhbnk7XG59XG5cbi8qKlxuICogVGhlIHNlcnZlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFNlcnZlciBpbXBsZW1lbnRzIElIb3RTZXJ2ZXJcbntcblx0LyoqXG5cdCAqIFRoZSBwcm9jZXNzb3IgdG8gdXNlLlxuXHQgKi9cblx0cHJvY2Vzc29yOiBIb3RTdGFxO1xuXHQvKipcblx0ICogVGhlIHNlcnZlciB0eXBlLlxuXHQgKi9cblx0c2VydmVyVHlwZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIEFQSSB0byB1c2UuXG5cdCAqL1xuXHRhcGk6IEhvdEFQSTtcblx0LyoqXG5cdCAqIFRoZSBuZXR3b3JrIGFkZHJlc3MgdG8gbGlzdGVuIG9uLlxuXHQgKi9cblx0bGlzdGVuQWRkcmVzczogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHBvcnRzIHRvIHVzZS5cblx0ICovXG5cdHBvcnRzOiB7XG5cdFx0XHRodHRwOiBudW1iZXI7XG5cdFx0XHRodHRwczogbnVtYmVyO1xuXHRcdH07XG5cdC8qKlxuXHQgKiBTU0wgc2V0dGluZ3MuXG5cdCAqL1xuXHRzc2w6IHtcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIFNTTCBjZXJ0aWZpY2F0ZSB0byB1c2UuXG5cdFx0XHQgKi9cblx0XHRcdGNlcnQ6IHN0cmluZztcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIFNTTCBjZXJ0aWZpY2F0ZSBrZXkgdG8gdXNlLlxuXHRcdFx0ICovXG5cdFx0XHRrZXk6IHN0cmluZztcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIFNTTCBjZXJ0aWZpY2F0ZSBDQSB0byB1c2UuXG5cdFx0XHQgKi9cblx0XHRcdGNhOiBzdHJpbmc7XG5cdFx0fTtcblx0LyoqXG5cdCAqIFJlZGlyZWN0IEhUVFAgdHJhZmZpYyB0byBIVFRQUy5cblx0ICovXG5cdHJlZGlyZWN0SFRUUHRvSFRUUFM6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgdHlwZSBvZiBzZXJ2ZXIuXG5cdCAqL1xuXHR0eXBlOiBIb3RTZXJ2ZXJUeXBlO1xuXHQvKipcblx0ICogVGhlIGxvZ2dlci5cblx0ICovXG5cdGxvZ2dlcjogSG90TG9nO1xuXHQvKipcblx0ICogQW55IHNlY3JldHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmVyLlxuXHQgKi9cblx0c2VjcmV0czogYW55O1xuXG5cdGNvbnN0cnVjdG9yIChwcm9jZXNzb3I6IEhvdFN0YXEgfCBIb3RTZXJ2ZXIpXG5cdHtcblx0XHRpZiAocHJvY2Vzc29yIGluc3RhbmNlb2YgSG90U3RhcSlcblx0XHR7XG5cdFx0XHR0aGlzLnByb2Nlc3NvciA9IHByb2Nlc3Nvcjtcblx0XHRcdHRoaXMuc2VydmVyVHlwZSA9IFwiU2VydmVyXCI7XG5cdFx0XHR0aGlzLmFwaSA9IG51bGw7XG5cdFx0XHR0aGlzLmxpc3RlbkFkZHJlc3MgPSBcIjAuMC4wLjBcIjtcblx0XHRcdHRoaXMucG9ydHMgPSB7XG5cdFx0XHRcdFx0aHR0cDogODAsXG5cdFx0XHRcdFx0aHR0cHM6IDQ0M1xuXHRcdFx0XHR9O1xuXHRcdFx0dGhpcy5zc2wgPSB7XG5cdFx0XHRcdFx0Y2VydDogXCJcIixcblx0XHRcdFx0XHRrZXk6IFwiXCIsXG5cdFx0XHRcdFx0Y2E6IFwiXCJcblx0XHRcdFx0fTtcblx0XHRcdHRoaXMucmVkaXJlY3RIVFRQdG9IVFRQUyA9IHRydWU7XG5cdFx0XHR0aGlzLnR5cGUgPSBIb3RTZXJ2ZXJUeXBlLkhUVFA7XG5cdFx0XHR0aGlzLmxvZ2dlciA9IHByb2Nlc3Nvci5sb2dnZXI7XG5cdFx0XHR0aGlzLnNlY3JldHMgPSB7fTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMucHJvY2Vzc29yID0gcHJvY2Vzc29yLnByb2Nlc3Nvcjtcblx0XHRcdHRoaXMuc2VydmVyVHlwZSA9IHByb2Nlc3Nvci5zZXJ2ZXJUeXBlIHx8IFwiU2VydmVyXCI7XG5cdFx0XHR0aGlzLmFwaSA9IHByb2Nlc3Nvci5hcGkgfHwgbnVsbDtcblx0XHRcdHRoaXMubGlzdGVuQWRkcmVzcyA9IHByb2Nlc3Nvci5saXN0ZW5BZGRyZXNzIHx8IFwiMC4wLjAuMFwiO1xuXHRcdFx0dGhpcy5wb3J0cyA9IHByb2Nlc3Nvci5wb3J0cyB8fCB7XG5cdFx0XHRcdFx0aHR0cDogODAsXG5cdFx0XHRcdFx0aHR0cHM6IDQ0M1xuXHRcdFx0XHR9O1xuXHRcdFx0dGhpcy5zc2wgPSBwcm9jZXNzb3Iuc3NsIHx8IHtcblx0XHRcdFx0XHRjZXJ0OiBcIlwiLFxuXHRcdFx0XHRcdGtleTogXCJcIixcblx0XHRcdFx0XHRjYTogXCJcIlxuXHRcdFx0XHR9O1xuXHRcdFx0dGhpcy5yZWRpcmVjdEhUVFB0b0hUVFBTID0gcHJvY2Vzc29yLnJlZGlyZWN0SFRUUHRvSFRUUFMgIT0gbnVsbCA/IHByb2Nlc3Nvci5yZWRpcmVjdEhUVFB0b0hUVFBTIDogdHJ1ZTtcblx0XHRcdHRoaXMudHlwZSA9IHByb2Nlc3Nvci50eXBlIHx8IEhvdFNlcnZlclR5cGUuSFRUUDtcblx0XHRcdHRoaXMubG9nZ2VyID0gcHJvY2Vzc29yLmxvZ2dlcjtcblx0XHRcdHRoaXMuc2VjcmV0cyA9IHByb2Nlc3Nvci5zZWNyZXRzIHx8IHt9O1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgYW4gQVBJIHRvIHRoaXMgc2VydmVyLiBUaGlzIHdpbGwgYWxzbyBzZXQgdGhlIGFzc29jaWF0ZWQgXG5cdCAqIHByb2Nlc3NvciB0byB0aGlzIEFQSSBhcyB3ZWxsLlxuXHQgKi9cblx0YXN5bmMgc2V0QVBJIChhcGk6IEhvdEFQSSk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdHRoaXMucHJvY2Vzc29yLmFwaSA9IGFwaTtcblx0XHR0aGlzLmFwaSA9IGFwaTtcblxuXHRcdC8vaWYgKHJlZ2lzdGVyUm91dGVzID09PSB0cnVlKVxuXHRcdFx0Ly9hd2FpdCB0aGlzLmFwaS5yZWdpc3RlclJvdXRlcyAoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWdpc3RlciBhIHJvdXRlIHdpdGggdGhlIHNlcnZlci5cblx0ICovXG5cdGFzeW5jIHJlZ2lzdGVyUm91dGU/IChyb3V0ZTogSG90Um91dGUpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBTdGFydCBsaXN0ZW5pbmcgZm9yIHJlcXVlc3RzLlxuXHQgKi9cblx0YXN5bmMgbGlzdGVuPyAoKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogU2h1dGRvd24gdGhlIHNlcnZlci5cblx0ICovXG5cdGFzeW5jIHNodXRkb3duPyAoKTogUHJvbWlzZTx2b2lkPjtcbn0iLCJpbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcblxuaW1wb3J0IGZldGNoIGZyb20gXCJjcm9zcy1mZXRjaFwiO1xuXG5pbXBvcnQgeyBEZXZlbG9wZXJNb2RlLCBIb3QgfSBmcm9tIFwiLi9Ib3RcIjtcbmltcG9ydCB7IEhvdFBhZ2UgfSBmcm9tIFwiLi9Ib3RQYWdlXCI7XG5pbXBvcnQgeyBIb3RUZXN0RWxlbWVudCB9IGZyb20gXCIuL0hvdFRlc3RFbGVtZW50XCI7XG5cbi8qKlxuICogQSBmaWxlIHRvIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUhvdEZpbGVcbntcblx0LyoqXG5cdCAqIFRoZSBwYXJlbnQgcGFnZS5cblx0ICovXG5cdHBhZ2U/OiBIb3RQYWdlO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGZpbGUuXG5cdCAqL1xuXHRuYW1lPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHVybCB0byB0aGUgZmlsZSB0byBnZXQuXG5cdCAqL1xuXHR1cmw/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGF0aCB0byB0aGUgbG9jYWwgZmlsZSB0byBnZXQuXG5cdCAqL1xuXHRsb2NhbEZpbGU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgY29udGVudCBvZiB0aGUgZmlsZSB0byBwcm9jZXNzLlxuXHQgKi9cblx0Y29udGVudD86IHN0cmluZztcblx0LyoqXG5cdCAqIEZvcmNlIGFsbCBlcnJvcnMgdG8gYmUgdGhyb3duLlxuXHQgKi9cblx0dGhyb3dBbGxFcnJvcnM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgZmlsZSB0byBwcm9jZXNzLlxuICovXG5leHBvcnQgY2xhc3MgSG90RmlsZSBpbXBsZW1lbnRzIElIb3RGaWxlXG57XG5cdC8qKlxuXHQgKiBUaGUgcGFyZW50IHBhZ2UuXG5cdCAqL1xuXHRwYWdlOiBIb3RQYWdlO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGZpbGUuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdXJsIHRvIHRoZSBmaWxlIHRvIGdldC5cblx0ICovXG5cdHVybDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHBhdGggdG8gdGhlIGxvY2FsIGZpbGUgdG8gZ2V0LlxuXHQgKi9cblx0bG9jYWxGaWxlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgY29udGVudCBvZiB0aGUgZmlsZSB0byBwcm9jZXNzLlxuXHQgKi9cblx0Y29udGVudDogc3RyaW5nO1xuXHQvKipcblx0ICogRm9yY2UgYWxsIGVycm9ycyB0byBiZSB0aHJvd24uXG5cdCAqL1xuXHR0aHJvd0FsbEVycm9yczogYm9vbGVhbjtcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSUhvdEZpbGUgPSB7fSlcblx0e1xuXHRcdHRoaXMucGFnZSA9IGNvcHkucGFnZSB8fCBudWxsO1xuXHRcdHRoaXMubmFtZSA9IGNvcHkubmFtZSB8fCBcIlwiO1xuXHRcdHRoaXMudXJsID0gY29weS51cmwgfHwgXCJcIjtcblx0XHR0aGlzLmxvY2FsRmlsZSA9IGNvcHkubG9jYWxGaWxlIHx8IFwiXCI7XG5cdFx0dGhpcy5jb250ZW50ID0gY29weS5jb250ZW50IHx8IFwiXCI7XG5cdFx0dGhpcy50aHJvd0FsbEVycm9ycyA9IGNvcHkudGhyb3dBbGxFcnJvcnMgfHwgZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IHRoZSBjb250ZW50IG9mIHRoaXMgZmlsZS5cblx0ICovXG5cdHNldENvbnRlbnQgKGNvbnRlbnQ6IHN0cmluZyk6IHZvaWRcblx0e1xuXHRcdHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBjb250ZW50IG9mIHRoaXMgZmlsZS5cblx0ICovXG5cdGdldENvbnRlbnQgKCk6IHN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuICh0aGlzLmNvbnRlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ha2UgYSBIVFRQIGdldCByZXF1ZXN0LlxuXHQgKi9cblx0c3RhdGljIGFzeW5jIGh0dHBHZXQgKHVybDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHR0cnlcblx0XHR7XG5cdFx0XHRsZXQgcmVzOiBSZXNwb25zZSA9IGF3YWl0IGZldGNoICh1cmwpO1xuXG5cdFx0XHRpZiAocmVzLm9rID09PSBmYWxzZSlcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgJHtyZXMuc3RhdHVzfTogJHtyZXMuc3RhdHVzVGV4dH1gKTtcblxuXHRcdFx0bGV0IGNvbnRlbnQ6IHN0cmluZyA9IGF3YWl0IHJlcy50ZXh0ICgpO1xuXG5cdFx0XHRyZXR1cm4gKGNvbnRlbnQpO1xuXHRcdH1cblx0XHRjYXRjaCAoZXgpXG5cdFx0e1xuXHRcdFx0cmV0dXJuIChKU09OLnN0cmluZ2lmeSAoeyBcImVycm9yXCI6IGAke2V4Lm1lc3NhZ2V9IC0gQ291bGQgbm90IGZldGNoICR7dXJsfWAgfSkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkIGNvbnRlbnQgZnJvbSBhIHVybC5cblx0ICovXG5cdGFzeW5jIGxvYWRVcmwgKCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0dGhpcy5jb250ZW50ID0gYXdhaXQgSG90RmlsZS5odHRwR2V0ICh0aGlzLnVybCk7XG5cblx0XHRyZXR1cm4gKHRoaXMuY29udGVudCk7XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCBjb250ZW50IGZyb20gYSBsb2NhbCBmaWxlLlxuXHQgKi9cblx0YXN5bmMgbG9hZExvY2FsRmlsZSAoKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRsZXQgcHJvbWlzZTogUHJvbWlzZTxzdHJpbmc+ID0gbmV3IFByb21pc2UgKFxuXHRcdFx0KHJlc29sdmU6IGFueSwgcmVqZWN0OiBhbnkpOiB2b2lkID0+XG5cdFx0XHR7XG5cdFx0XHRcdGZzLnJlYWRGaWxlICh0aGlzLmxvY2FsRmlsZSwgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uLCBkYXRhOiBCdWZmZXIpOiB2b2lkID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWYgKGVyciAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHR0aHJvdyBlcnI7XG5cblx0XHRcdFx0XHRcdGxldCBjb250ZW50OiBzdHJpbmcgPSBkYXRhLnRvU3RyaW5nICgpO1xuXHRcdFx0XHRcdFx0dGhpcy5jb250ZW50ID0gY29udGVudDtcblxuXHRcdFx0XHRcdFx0cmVzb2x2ZSAodGhpcy5jb250ZW50KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0cmV0dXJuIChwcm9taXNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZS5cblx0ICovXG5cdGFzeW5jIGxvYWQgKCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IGNvbnRlbnQ6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAodGhpcy51cmwgIT09IFwiXCIpXG5cdFx0XHRjb250ZW50ID0gYXdhaXQgdGhpcy5sb2FkVXJsICgpO1xuXG5cdFx0aWYgKHRoaXMubG9jYWxGaWxlICE9PSBcIlwiKVxuXHRcdFx0Y29udGVudCA9IGF3YWl0IHRoaXMubG9hZExvY2FsRmlsZSAoKTtcblxuXHRcdHJldHVybiAoY29udGVudCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBzdHJpbmcgY29udGVudC4gVGhpcyB3aWxsIHRha2UgaW4gYSByZWd1bGFyIGV4cHJlc3Npb24gYW5kIFxuXHQgKiBwYXJzZSB0aGUgY29udGVudCBiYXNlZCBvbiB0aGUgcmVnZXguIFdoZW4gdGhlIHJlZ2V4IGNvbnRlbnQgaXMgZm91bmQgXG5cdCAqIGNvbnRlbnRQcm9jZXNzb3Igd2lsbCBiZSBleGVjdXRlZCB3aXRoIHRoZSByZWdleCBjb250ZW50IGZvdW5kLiBXaGVuIFxuXHQgKiB0aGUgcmVnZXggY29udGVudCBpcyBub3QgZm91bmQsIG9mZkNvbnRlbnRQcm9jZXNzb3Igd2lsbCBiZSBjYWxsZWQgd2l0aCBcblx0ICogdGhlIGNvbnRlbnQgb3V0c2lkZSBvZiB0aGUgcmVnZXguXG5cdCAqIFxuXHQgKiBAcGFyYW0gY29udGVudCBUaGUgY29udGVudCB0byBwYXJzZS5cblx0ICogQHBhcmFtIGNvbnRlbnRSZWdleCBUaGUgcmVnZXggdG8gdXNlIHRvIHBhcnNlIHRoZSBjb250ZW50LlxuXHQgKiBAcGFyYW0gY29udGVudFByb2Nlc3NvciBUaGUgY29udGVudCBmb3VuZCBpbnNpZGUgdGhlIHJlZ2V4LlxuXHQgKiBAcGFyYW0gb2ZmQ29udGVudFByb2Nlc3NvciBUaGUgY29udGVudCBmb3VuZCBvdXRzaWRlIG9mIHRoZSByZWdleC5cblx0ICogQHBhcmFtIG51bVJlbW92ZUZyb21CZWdpbm5pbmcgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlbW92ZSBmcm9tIHRoZSBcblx0ICogYmVnaW5uaW5nIG9mIHRoZSBmb3VuZCBjb250ZW50LlxuXHQgKiBAcGFyYW0gbnVtUmVtb3ZlRnJvbUVuZCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVtb3ZlIGZyb20gdGhlIGVuZCBvZiBcblx0ICogdGhlIGZvdW5kIGNvbnRlbnQuXG5cdCAqL1xuXHRzdGF0aWMgcHJvY2Vzc0NvbnRlbnQgKGNvbnRlbnQ6IHN0cmluZywgY29udGVudFJlZ2V4OiBSZWdFeHAsXG5cdFx0Y29udGVudFByb2Nlc3NvcjogKHJlZ2V4Rm91bmQ6IHN0cmluZykgPT4gc3RyaW5nLFxuXHRcdG9mZkNvbnRlbnRQcm9jZXNzb3I6IChvZmZDb250ZW50OiBzdHJpbmcpID0+IHN0cmluZyxcblx0XHRudW1SZW1vdmVGcm9tQmVnaW5uaW5nOiBudW1iZXIgPSAyLFxuXHRcdG51bVJlbW92ZUZyb21FbmQ6IG51bWJlciA9IDIpOiBzdHJpbmdcblx0e1xuXHRcdGxldCByZXN1bHQ6IFJlZ0V4cEV4ZWNBcnJheSA9IGNvbnRlbnRSZWdleC5leGVjIChjb250ZW50KTtcblx0XHRsZXQgcHJldmlvdXNJbmRleDogbnVtYmVyID0gMDtcblx0XHRsZXQgb3V0cHV0OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0d2hpbGUgKHJlc3VsdCAhPSBudWxsKVxuXHRcdHtcblx0XHRcdGxldCBzdGFydDogbnVtYmVyID0gcmVzdWx0LmluZGV4IC0gbnVtUmVtb3ZlRnJvbUJlZ2lubmluZztcblx0XHRcdGxldCBlbmQ6IG51bWJlciA9IGNvbnRlbnRSZWdleC5sYXN0SW5kZXggKyBudW1SZW1vdmVGcm9tRW5kO1xuXG5cdFx0XHQvLyBHZXQgdGhlIHByZXZpb3VzIHNlY3Rpb24uXG5cdFx0XHRsZXQgcHJldkNvbnRlbnQ6IHN0cmluZyA9IGNvbnRlbnQuc3Vic3RyIChwcmV2aW91c0luZGV4LCAoc3RhcnQgLSBwcmV2aW91c0luZGV4KSk7XG5cdFx0XHRwcmV2aW91c0luZGV4ID0gZW5kO1xuXG5cdFx0XHRvdXRwdXQgKz0gb2ZmQ29udGVudFByb2Nlc3NvciAocHJldkNvbnRlbnQpO1xuXG5cdFx0XHQvLyBQcm9jZXNzIHRoZSBjb250ZW50IGZvdW5kIGZyb20gdGhlIHJlZ2V4XG5cdFx0XHRsZXQgY29udGVudEZvdW5kOiBzdHJpbmcgPSByZXN1bHRbMF07XG5cdFx0XHRvdXRwdXQgKz0gY29udGVudFByb2Nlc3NvciAoY29udGVudEZvdW5kKTtcblxuXHRcdFx0Ly8gTW92ZSBvbiB0byB0aGUgbmV4dCBzZWN0aW9uIHRvIHBhcnNlLlxuXHRcdFx0cmVzdWx0ID0gY29udGVudFJlZ2V4LmV4ZWMgKGNvbnRlbnQpO1xuXHRcdH1cblxuXHRcdC8vIEFwcGVuZCB3aGF0ZXZlciBlbHNlIGlzIGFmdGVyIHRoZSBsYXN0IHBhcnNlZCBzZWN0aW9uLlxuXHRcdGxldCBsYXN0Q29udGVudDogc3RyaW5nID0gY29udGVudC5zdWJzdHIgKHByZXZpb3VzSW5kZXgpO1xuXG5cdFx0b3V0cHV0ICs9IG9mZkNvbnRlbnRQcm9jZXNzb3IgKGxhc3RDb250ZW50KTtcblxuXHRcdHJldHVybiAob3V0cHV0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIGFueSBjb250ZW50IHRoYXQgY291bGQgaGF2ZSBuZXN0ZWQgdmFsdWVzLiBUaGlzIHdpbGwgXG5cdCAqIHRha2UgaW4gYSByZWd1bGFyIGV4cHJlc3Npb24gYW5kIFxuXHQgKiBwYXJzZSB0aGUgY29udGVudCBiYXNlZCBvbiB0aGUgcmVnZXguIFdoZW4gdGhlIHJlZ2V4IGNvbnRlbnQgaXMgZm91bmQgXG5cdCAqIGNvbnRlbnRQcm9jZXNzb3Igd2lsbCBiZSBleGVjdXRlZCB3aXRoIHRoZSByZWdleCBjb250ZW50IGZvdW5kLiBXaGVuIFxuXHQgKiB0aGUgcmVnZXggY29udGVudCBpcyBub3QgZm91bmQsIG9mZkNvbnRlbnRQcm9jZXNzb3Igd2lsbCBiZSBjYWxsZWQgd2l0aCBcblx0ICogdGhlIGNvbnRlbnQgb3V0c2lkZSBvZiB0aGUgcmVnZXguXG5cdCAqIFxuXHQgKiBAZml4bWUgTmVlZHMgdG8gYmUgYWJsZSB0byBpZ25vcmUgYW55IGNoYXJhY3RlcnMgZm91bmQgaW5zaWRlIGNvbW1lbnRzIFxuXHQgKiBvciBhIHN0cmluZy4gRm9yIGV4YW1wbGUsIGlmIHRoZSBmb2xsb3dpbmcgaXMgdXNlZCBgYGAke1wiVGVzdCB9XCJ9YGBgIEl0IFxuXHQgKiB3aWxsIGVycm9yIG91dC5cblx0ICogXG5cdCAqIEBwYXJhbSBjb250ZW50IFRoZSBjb250ZW50IHRvIHBhcnNlLlxuXHQgKiBAcGFyYW0gY29udGVudFJlZ2V4IFRoZSByZWdleCB0byB1c2UgdG8gcGFyc2UgdGhlIGNvbnRlbnQuXG5cdCAqIEBwYXJhbSBjb250ZW50UHJvY2Vzc29yIFRoZSBjb250ZW50IGZvdW5kIGluc2lkZSB0aGUgcmVnZXguXG5cdCAqIEBwYXJhbSBvZmZDb250ZW50UHJvY2Vzc29yIFRoZSBjb250ZW50IGZvdW5kIG91dHNpZGUgb2YgdGhlIHJlZ2V4LlxuXHQgKiBAcGFyYW0gbnVtUmVtb3ZlRnJvbUJlZ2lubmluZyBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVtb3ZlIGZyb20gdGhlIFxuXHQgKiBiZWdpbm5pbmcgb2YgdGhlIGZvdW5kIGNvbnRlbnQuXG5cdCAqIEBwYXJhbSBudW1SZW1vdmVGcm9tRW5kIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZW1vdmUgZnJvbSB0aGUgZW5kIG9mIFxuXHQgKiB0aGUgZm91bmQgY29udGVudC5cblx0ICovXG5cdHN0YXRpYyBwcm9jZXNzTmVzdGVkQ29udGVudCAoY29udGVudDogc3RyaW5nLCBzdGFydENoYXJzOiBzdHJpbmcsIGVuZENoYXJzOiBzdHJpbmcsIFxuXHRcdHRyaWdnZXJDaGFyOiBzdHJpbmcsIGNvbnRlbnRQcm9jZXNzb3I6IChyZWdleEZvdW5kOiBzdHJpbmcpID0+IHN0cmluZyxcblx0XHRvZmZDb250ZW50UHJvY2Vzc29yOiAob2ZmQ29udGVudDogc3RyaW5nKSA9PiBzdHJpbmcsXG5cdFx0bnVtUmVtb3ZlRnJvbUJlZ2lubmluZzogbnVtYmVyID0gMixcblx0XHRudW1SZW1vdmVGcm9tRW5kOiBudW1iZXIgPSAxKTogc3RyaW5nXG5cdHtcblx0XHRsZXQgcG9zOiBudW1iZXIgPSBjb250ZW50LmluZGV4T2YgKHN0YXJ0Q2hhcnMpO1xuXHRcdGxldCBwcmV2aW91c0luZGV4OiBudW1iZXIgPSAwO1xuXHRcdGxldCBzdGFydFRyaWdnZXJQb3M6IG51bWJlciA9IGNvbnRlbnQuaW5kZXhPZiAodHJpZ2dlckNoYXIsIHBvcyk7XG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gXCJcIjtcblxuXHRcdHdoaWxlIChwb3MgPiAtMSlcblx0XHR7XG5cdFx0XHRsZXQgZW5kOiBudW1iZXIgPSBjb250ZW50LmluZGV4T2YgKGVuZENoYXJzLCBwb3MpO1xuXHRcdFx0bGV0IG5lc3RlZENvdW50ZXI6IG51bWJlciA9IDA7XG5cblx0XHRcdGlmICh0cmlnZ2VyQ2hhciAhPT0gXCJcIilcblx0XHRcdHtcblx0XHRcdFx0Ly8gUmV2ZXJzZSBzZWFyY2ggdGhlIHRyaWdnZXIgY2hhcmFjdGVycyBhbmQgY291bnQgdGhlIG51bWJlciBvZiBcblx0XHRcdFx0Ly8gb2NjdXJyZW5jZXMuXG5cdFx0XHRcdGxldCBycG9zOiBudW1iZXIgPSBjb250ZW50Lmxhc3RJbmRleE9mICh0cmlnZ2VyQ2hhciwgZW5kIC0gbnVtUmVtb3ZlRnJvbUVuZCk7XG5cblx0XHRcdFx0d2hpbGUgKHJwb3MgPiAtMSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmIChycG9zID09PSBzdGFydFRyaWdnZXJQb3MpXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdHJwb3MgPSBjb250ZW50Lmxhc3RJbmRleE9mICh0cmlnZ2VyQ2hhciwgcnBvcyAtIG51bVJlbW92ZUZyb21FbmQpO1xuXHRcdFx0XHRcdG5lc3RlZENvdW50ZXIrKztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGVyZSdzIG5lc3RlZCB0cmlnZ2VyIGNoYXJhY3RlcnMsIGdldCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIFxuXHRcdFx0Ly8gdGhlIGVuZCBjaGFyYWN0ZXIuXG5cdFx0XHRpZiAobmVzdGVkQ291bnRlciA+IDApXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBlcG9zOiBudW1iZXIgPSBjb250ZW50LmluZGV4T2YgKGVuZENoYXJzLCBlbmQgKyBudW1SZW1vdmVGcm9tRW5kKTtcblx0XHRcdFx0bGV0IHRlbXBlcG9zOiBudW1iZXIgPSBlcG9zO1xuXG5cdFx0XHRcdHdoaWxlICgoZXBvcyA+IC0xKSAmJiAobmVzdGVkQ291bnRlciA+IDApKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWYgKHRlbXBlcG9zIDwgMClcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Ly8gTWFrZSBzdXJlIHdlIGFyZW4ndCBkaXNjb3ZlcmluZyBlbmRDaGFycyB0aGF0IHdlIHNob3VsZG4ndCBiZS5cblx0XHRcdFx0XHRsZXQgcG9zT3V0c2lkZU9mQ29udGVudDogbnVtYmVyID0gY29udGVudC5sYXN0SW5kZXhPZiAoc3RhcnRDaGFycywgdGVtcGVwb3MgLSBudW1SZW1vdmVGcm9tRW5kKTtcblxuXHRcdFx0XHRcdGlmIChwb3NPdXRzaWRlT2ZDb250ZW50ID4gZXBvcylcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0ZXBvcyA9IHRlbXBlcG9zO1xuXG5cdFx0XHRcdFx0dGVtcGVwb3MgPSBjb250ZW50LmluZGV4T2YgKGVuZENoYXJzLCBlcG9zICsgbnVtUmVtb3ZlRnJvbUVuZCk7XG5cdFx0XHRcdFx0bmVzdGVkQ291bnRlci0tO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZW5kID0gZXBvcztcblx0XHRcdH1cblxuXHRcdFx0bGV0IG9mZkNvbnRlbnRTdHI6IHN0cmluZyA9IGNvbnRlbnQuc3Vic3RyIChwcmV2aW91c0luZGV4LCAocG9zIC0gcHJldmlvdXNJbmRleCkpO1xuXHRcdFx0b3V0cHV0ICs9IG9mZkNvbnRlbnRQcm9jZXNzb3IgKG9mZkNvbnRlbnRTdHIpO1xuXG5cdFx0XHRsZXQgZm91bmRDb250ZW50OiBzdHJpbmcgPSBjb250ZW50LnN1YnN0ciAoXG5cdFx0XHRcdHBvcyArIG51bVJlbW92ZUZyb21CZWdpbm5pbmcsIChlbmQgLSAocG9zICsgbnVtUmVtb3ZlRnJvbUJlZ2lubmluZykpKTtcblx0XHRcdG91dHB1dCArPSBjb250ZW50UHJvY2Vzc29yIChmb3VuZENvbnRlbnQpO1xuXG5cdFx0XHQvLyBHZXQgdGhlIG5leHQgY29udGVudFxuXHRcdFx0cG9zID0gY29udGVudC5pbmRleE9mIChzdGFydENoYXJzLCBlbmQgKyBudW1SZW1vdmVGcm9tRW5kKTtcblx0XHRcdHN0YXJ0VHJpZ2dlclBvcyA9IGNvbnRlbnQuaW5kZXhPZiAodHJpZ2dlckNoYXIsIHBvcyk7XG5cdFx0XHRwcmV2aW91c0luZGV4ID0gZW5kICsgbnVtUmVtb3ZlRnJvbUVuZDtcblx0XHR9XG5cblx0XHQvLyBBcHBlbmQgd2hhdGV2ZXIgZWxzZSBpcyBhZnRlciB0aGUgbGFzdCBwYXJzZWQgc2VjdGlvbi5cblx0XHRsZXQgbGFzdENvbnRlbnQ6IHN0cmluZyA9IGNvbnRlbnQuc3Vic3RyIChwcmV2aW91c0luZGV4KTtcblxuXHRcdG91dHB1dCArPSBvZmZDb250ZW50UHJvY2Vzc29yIChsYXN0Q29udGVudCk7XG5cblx0XHRyZXR1cm4gKG91dHB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyB0aGUgY29udGVudCBpbiB0aGlzIGZpbGUuIFRoaXMgdHJlYXRzIGVhY2ggZmlsZSBhcyBvbmUgbGFyZ2UgSmF2YVNjcmlwdFxuXHQgKiBmaWxlLiBBbnkgdGV4dCBvdXRzaWRlIG9mIHRoZSA8KiAqPiBhcmVhcyB3aWxsIGJlIHRyZWF0ZWQgYXM6XG5cdCAqIFxuXHQgKiBcdFx0SG90LmVjaG8gKFwidGV4dFwiKTtcblx0ICogXG5cdCAqIEBmaXhtZSBUaGUgcmVnZXgncyBpbiB0aGUgb2ZmQ29udGVudCBmdW5jdGlvbnMgbmVlZCB0byBiZSBmaXhlZC4gVGhlcmUncyBzZXZlcmFsIFxuXHQgKiB0ZXN0IGNhc2VzIHdoZXJlIHRoZXkgd2lsbCBmYWlsLlxuXHQgKi9cblx0YXN5bmMgcHJvY2VzcyAoYXJnczogYW55ID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gXCJcIjtcblx0XHRsZXQgdGhpc0NvbnRlbnQ6IHN0cmluZyA9IHRoaXMuY29udGVudDtcblxuXHRcdEhvdC5Nb2RlID0gdGhpcy5wYWdlLnByb2Nlc3Nvci5tb2RlO1xuXHRcdEhvdC5Bcmd1bWVudHMgPSBhcmdzO1xuXHRcdEhvdC5DdXJyZW50UGFnZSA9IHRoaXMucGFnZTtcblx0XHRIb3QuUHVibGljU2VjcmV0cyA9IHRoaXMucGFnZS5wcm9jZXNzb3IucHVibGljU2VjcmV0cztcblx0XHRIb3QuQVBJID0gdGhpcy5wYWdlLmdldEFQSSAoKTtcblx0XHRIb3QuVGVzdGVyQVBJID0gdGhpcy5wYWdlLmdldFRlc3RlckFQSSAoKTtcblxuXHRcdC8vIEFzc2VtYmxlIHRoZSBKUyB0byBldmFsdWF0ZS4gVGhpcyB3aWxsIHRha2UgYWxsIGNvbnRlbnQgb3V0c2lkZSBvZiBcblx0XHQvLyA8KiBhbmQgKj4gYW5kIHdyYXAgYSBIb3QuZWNobyBhcm91bmQgaXQuIEFueSBKUyBmb3VuZCBpbnNpZGUgb2YgdGhlIFxuXHRcdC8vIDwqIGFuZCAqPiB3aWxsIGJlIGV4ZWN1dGVkIGFzIGlzLlxuXHRcdG91dHB1dCA9IEhvdEZpbGUucHJvY2Vzc0NvbnRlbnQgKHRoaXNDb250ZW50LCBcblx0XHRcdG5ldyBSZWdFeHAgKFwiKD89XFxcXDxcXFxcKikoW1xcXFxzXFxcXFNdKj8pKD89XFxcXCpcXFxcPilcIiwgXCJnXCIpLCBcblx0XHRcdChyZWdleEZvdW5kOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdHtcblx0XHRcdFx0Ly8gQSBsaXR0bGUgaGFjaywgc2luY2UgSSBzdWNrIGF0IFJlZ2V4IDooXG5cdFx0XHRcdHJlZ2V4Rm91bmQgPSByZWdleEZvdW5kLnN1YnN0ciAoMik7XG5cblx0XHRcdFx0cmV0dXJuIChgJHtyZWdleEZvdW5kfWApO1xuXHRcdFx0fSwgXG5cdFx0XHQob2ZmQ29udGVudDogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHR7XG5cdFx0XHRcdGlmIChvZmZDb250ZW50ID09PSBcIlwiKVxuXHRcdFx0XHRcdHJldHVybiAoXCJcIik7XG5cblx0XHRcdFx0bGV0IHRlbXBPdXRwdXQ6IHN0cmluZyA9IEhvdEZpbGUucHJvY2Vzc05lc3RlZENvbnRlbnQgKFxuXHRcdFx0XHRcdG9mZkNvbnRlbnQsIFwiIXtcIiwgXCJ9XCIsIFwie1wiLCBcblx0XHRcdFx0XHQocmVnZXhGb3VuZDI6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBvdXQ6IHN0cmluZyA9IGAqJiYlKiVAI0AhJHtyZWdleEZvdW5kMn0qJiEjJUAhQCohYDtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIChvdXQpO1xuXHRcdFx0XHRcdH0sIFxuXHRcdFx0XHRcdChvZmZDb250ZW50Mzogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cmV0dXJuIChvZmZDb250ZW50Myk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdGxldCB0ZW1wT3V0cHV0Mjogc3RyaW5nID0gSG90RmlsZS5wcm9jZXNzTmVzdGVkQ29udGVudCAoXG5cdFx0XHRcdFx0dGVtcE91dHB1dCwgXCJTVFJ7XCIsIFwifVwiLCBcIntcIiwgXG5cdFx0XHRcdFx0KHJlZ2V4Rm91bmQyOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgb3V0OiBzdHJpbmcgPSBcblx0XHRcdFx0XHRcdGAqJiYlKiVAI0AhZWNob091dHB1dCAoSlNPTi5zdHJpbmdpZnkoJHtyZWdleEZvdW5kMn0pLCAke3RoaXMudGhyb3dBbGxFcnJvcnN9KTsqJiEjJUAhQCohYDtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIChvdXQpO1xuXHRcdFx0XHRcdH0sIFxuXHRcdFx0XHRcdChvZmZDb250ZW50Mzogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cmV0dXJuIChvZmZDb250ZW50Myk7XG5cdFx0XHRcdFx0fSwgNCwgMSk7XG5cdFx0XHRcdGxldCB0ZW1wT3V0cHV0Mzogc3RyaW5nID0gSG90RmlsZS5wcm9jZXNzTmVzdGVkQ29udGVudCAoXG5cdFx0XHRcdFx0dGVtcE91dHB1dDIsIFwiJHtcIiwgXCJ9XCIsIFwie1wiLCBcblx0XHRcdFx0XHQocmVnZXhGb3VuZDI6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBvdXQ6IHN0cmluZyA9IGAqJiYlKiVAI0AhdHJ5IHsgSG90LmVjaG8gKCR7cmVnZXhGb3VuZDJ9KTsgfWNhdGNoIChleCl7SG90LmVjaG8gKFwiXCIpO30qJiEjJUAhQCohYDtcblxuXHRcdFx0XHRcdFx0aWYgKHRoaXMudGhyb3dBbGxFcnJvcnMgPT09IHRydWUpXG5cdFx0XHRcdFx0XHRcdG91dCA9IGAqJiYlKiVAI0AhSG90LmVjaG8gKCR7cmVnZXhGb3VuZDJ9KTsqJiEjJUAhQCohYDtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIChvdXQpO1xuXHRcdFx0XHRcdH0sIFxuXHRcdFx0XHRcdChvZmZDb250ZW50Mzogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cmV0dXJuIChvZmZDb250ZW50Myk7XG5cdFx0XHRcdFx0XHQvKmxldCBlc2NhcGVkQ29udGVudDogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkgKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHRcdGxldCBvdXQ6IHN0cmluZyA9IGBlY2hvT3V0cHV0ICgke2VzY2FwZWRDb250ZW50fSwgJHt0aGlzLnRocm93QWxsRXJyb3JzfSk7XFxuYDtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIChvdXQpOyovXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0bGV0IHRlbXBPdXRwdXQ0OiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdGlmIChIb3QuTW9kZSA9PT0gRGV2ZWxvcGVyTW9kZS5Qcm9kdWN0aW9uKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGVtcE91dHB1dDQgPSBIb3RGaWxlLnByb2Nlc3NOZXN0ZWRDb250ZW50IChcblx0XHRcdFx0XHRcdHRlbXBPdXRwdXQzLCBcIj8oXCIsIFwiKVwiLCBcIihcIiwgXG5cdFx0XHRcdFx0XHQocmVnZXhGb3VuZDI6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKFwiXCIpO1xuXHRcdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0XHQob2ZmQ29udGVudDM6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG9mZkNvbnRlbnQzKTtcblx0XHRcdFx0XHRcdFx0LypsZXQgb3V0OiBzdHJpbmcgPSBgZWNob091dHB1dCAoJHtvZmZDb250ZW50M30sICR7dGhpcy50aHJvd0FsbEVycm9yc30pO1xcbmA7XG5cblx0XHRcdFx0XHRcdFx0cmV0dXJuIChvdXQpOyovXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChIb3QuTW9kZSA9PT0gRGV2ZWxvcGVyTW9kZS5EZXZlbG9wbWVudClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRlbXBPdXRwdXQ0ID0gSG90RmlsZS5wcm9jZXNzTmVzdGVkQ29udGVudCAoXG5cdFx0XHRcdFx0XHR0ZW1wT3V0cHV0MywgXCI/KFwiLCBcIilcIiwgXCIoXCIsIFxuXHRcdFx0XHRcdFx0KHJlZ2V4Rm91bmQyOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bGV0IGZvdW5kU3RyOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRcdFx0XHRcdHRyeVxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ2hlY2sgdG8gc2VlIGlmIGl0IGJlIHBhcnNlZC4gSWYgc28sIHN0cmluZ2lmeSBpdC5cblx0XHRcdFx0XHRcdFx0XHRKU09OLnBhcnNlIChyZWdleEZvdW5kMik7XG5cdFx0XHRcdFx0XHRcdFx0Zm91bmRTdHIgPSBKU09OLnN0cmluZ2lmeSAocmVnZXhGb3VuZDIpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGNhdGNoIChleClcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdC8vIElmIHZhbGlkIEpTT04gaXMgbm90IHJlY2VpdmVkLCBkb24ndCB3b3JyeSBhYm91dCBpdCwgcGFzcyBpdCBcblx0XHRcdFx0XHRcdFx0XHQvLyBhbG9uZyB0byB0aGUgZnVuY3Rpb24gYmVsb3cgZm9yIGl0IHRvIGJlIHBhcnNlZCBpbiB0aGUgcGFnZS5cblx0XHRcdFx0XHRcdFx0XHQvLyBUaGUgZXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gdGhlcmUgaW5zdGVhZC5cblx0XHRcdFx0XHRcdFx0XHRmb3VuZFN0ciA9IGAke3JlZ2V4Rm91bmQyfWA7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLy8gQGZpeG1lIE1ha2UgdGhpcyBhIGNhbGxhYmxlIGZ1bmN0aW9uIGFuZCBwYXNzIGZvdW5kU3RyLCBldGMuXG5cdFx0XHRcdFx0XHRcdGxldCBvdXQ6IHN0cmluZyA9IFxuYComJiUqJUAjQCF7XG5jb25zdCB0ZXN0RWxtID0gY3JlYXRlVGVzdEVsZW1lbnQgKCR7Zm91bmRTdHJ9KTtcbkhvdC5lY2hvIChcXGBkYXRhLXRlc3Qtb2JqZWN0LW5hbWUgPSBcIlxcJHt0ZXN0RWxtLm5hbWV9XCIgZGF0YS10ZXN0LW9iamVjdC1mdW5jID0gXCJcXCR7dGVzdEVsbS5mdW5jfVwiIGRhdGEtdGVzdC1vYmplY3QtdmFsdWUgPSBcIlxcJHt0ZXN0RWxtLnZhbHVlfVwiXFxgKTtcbn0qJiEjJUAhQCohXFxuYDtcblxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7XG5cdFx0XHRcdFx0XHR9LCBcblx0XHRcdFx0XHRcdChvZmZDb250ZW50Mzogc3RyaW5nKTogc3RyaW5nID0+XG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHJldHVybiAob2ZmQ29udGVudDMpO1xuXHRcdFx0XHRcdFx0XHQvKmxldCBvdXQ6IHN0cmluZyA9IGBlY2hvT3V0cHV0ICgke29mZkNvbnRlbnQzfSwgJHt0aGlzLnRocm93QWxsRXJyb3JzfSk7XFxuYDtcblxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7Ki9cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IHRlbXBPdXRwdXQ1OiBzdHJpbmcgPSBIb3RGaWxlLnByb2Nlc3NOZXN0ZWRDb250ZW50IChcblx0XHRcdFx0XHR0ZW1wT3V0cHV0NCwgXCIqJiYlKiVAI0AhXCIsIFwiKiYhIyVAIUAqIVwiLCBcIiomJiUqJUAjQCFcIiwgXG5cdFx0XHRcdFx0KHJlZ2V4Rm91bmQ6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHJldHVybiAocmVnZXhGb3VuZCk7XG5cdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0KG9mZkNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCBlc2NhcGVkQ29udGVudDogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkgKG9mZkNvbnRlbnQpO1xuXHRcdFx0XHRcdFx0bGV0IG91dDogc3RyaW5nID0gYGVjaG9PdXRwdXQgKCR7ZXNjYXBlZENvbnRlbnR9LCAke3RoaXMudGhyb3dBbGxFcnJvcnN9KTtcXG5gO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gKG91dCk7XG5cdFx0XHRcdFx0fSwgXG5cdFx0XHRcdFx0XCIqJiYlKiVAI0AhXCIubGVuZ3RoLCBcIiomISMlQCFAKiFcIi5sZW5ndGgpO1xuXG5cdFx0XHRcdC8vLyBAZml4bWUgVGVtcG9yYXJ5IGhhY2suIFRoZXNlIGRlbGltaXRlcnMgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0ZW1wT3V0cHV0IHdoZW4gXG5cdFx0XHRcdC8vLyBleGVjdXRpbmcgcHJvY2Vzc05lc3RlZENvbnRlbnQuXG5cdFx0XHRcdHRlbXBPdXRwdXQ1ID0gdGVtcE91dHB1dDUucmVwbGFjZSAoL1xcKlxcJlxcJlxcJVxcKlxcJVxcQFxcI1xcQFxcIS9nLCBcIlwiKTtcblx0XHRcdFx0dGVtcE91dHB1dDUgPSB0ZW1wT3V0cHV0NS5yZXBsYWNlICgvXFwqXFwmXFwhXFwjXFwlXFxAXFwhXFxAXFwqXFwhL2csIFwiXCIpO1xuXG5cdFx0XHRcdHJldHVybiAodGVtcE91dHB1dDUpO1xuXHRcdFx0fSwgMCk7XG5cblx0XHQvLyBFeGVjdXRlIHRoZSBhc3NlbWJsZWQgSlMgZmlsZS5cblx0XHRsZXQgcmV0dXJuZWRPdXRwdXQ6IGFueSA9IG51bGw7XG5cblx0XHR0cnlcblx0XHR7XG5cdFx0XHRsZXQgZXhlY3V0aW9uQ29udGVudDogc3RyaW5nID0gYFxuXHRcdFx0dmFyIEhvdCA9IGFyZ3VtZW50c1swXTtcblx0XHRcdHZhciBQYXNzZWRIb3RGaWxlID0gYXJndW1lbnRzWzFdO1xuXG5cdFx0XHRgO1xuXG5cdFx0XHRpZiAodHlwZW9mIChhcmdzKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVGhlIHBhc3NpbmcgYXJndW1lbnRzIGNhbm5vdCBiZSBhIHN0cmluZyFgKTtcblxuXHRcdFx0Zm9yIChsZXQga2V5IGluIGFyZ3MpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBuZXdWYXI6IHN0cmluZyA9IFwiXCI7XG5cdFx0XHRcdGxldCBuZXdWYXJWYWx1ZTogYW55ID0gYXJnc1trZXldO1xuXHRcdFx0XHRsZXQgbmV3VmFyVmFsdWVTdHI6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5IChuZXdWYXJWYWx1ZSk7XG5cblx0XHRcdFx0bmV3VmFyID0gYHZhciAke2tleX0gPSAke25ld1ZhclZhbHVlU3RyfTtcXG5gO1xuXG5cdFx0XHRcdGV4ZWN1dGlvbkNvbnRlbnQgKz0gbmV3VmFyO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgY29udGVudE5hbWU6IHN0cmluZyA9IHRoaXMubmFtZTtcblxuXHRcdFx0aWYgKGNvbnRlbnROYW1lID09PSBcIlwiKVxuXHRcdFx0XHRjb250ZW50TmFtZSA9IHRoaXMubG9jYWxGaWxlO1xuXG5cdFx0XHRpZiAoY29udGVudE5hbWUgPT09IFwiXCIpXG5cdFx0XHRcdGNvbnRlbnROYW1lID0gdGhpcy51cmw7XG5cblx0XHRcdGV4ZWN1dGlvbkNvbnRlbnQgKz0gYFxuXG5cdFx0XHRmdW5jdGlvbiBlY2hvT3V0cHV0IChjb250ZW50LCB0aHJvd0Vycm9ycylcblx0XHRcdHtcblx0XHRcdFx0aWYgKHRocm93RXJyb3JzID09IG51bGwpXG5cdFx0XHRcdFx0dGhyb3dFcnJvcnMgPSB0cnVlO1xuXG5cdFx0XHRcdGlmICh0aHJvd0Vycm9ycyA9PT0gdHJ1ZSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdEhvdC5lY2hvIChjb250ZW50KTtcblxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRyeVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0SG90LmVjaG8gKGNvbnRlbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNhdGNoIChleClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdEhvdC5lY2hvIChcIlwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBjcmVhdGVUZXN0RWxlbWVudCAoZm91bmRTdHIpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCB0ZXN0RWxtID0gbnVsbDtcblxuXHRcdFx0XHR0cnlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBvYmogPSBmb3VuZFN0cjtcblxuXHRcdFx0XHRcdGlmICh0eXBlb2YgKGZvdW5kU3RyKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHRcdG9iaiA9IEpTT04ucGFyc2UgKGZvdW5kU3RyKTtcblxuXHRcdFx0XHRcdGlmICh0eXBlb2YgKG9iaikgPT09IFwic3RyaW5nXCIpXG5cdFx0XHRcdFx0XHR0ZXN0RWxtID0gbmV3IEhvdC5Ib3RUZXN0RWxlbWVudCAob2JqKTtcblxuXHRcdFx0XHRcdGlmIChvYmogaW5zdGFuY2VvZiBBcnJheSlcblx0XHRcdFx0XHRcdHRlc3RFbG0gPSBuZXcgSG90LkhvdFRlc3RFbGVtZW50IChvYmpbMF0sIG9ialsxXSwgb2JqWzJdKTtcblxuXHRcdFx0XHRcdGlmIChvYmpbXCJuYW1lXCJdICE9IG51bGwpXG5cdFx0XHRcdFx0XHR0ZXN0RWxtID0gbmV3IEhvdC5Ib3RUZXN0RWxlbWVudCAob2JqKTtcblxuXHRcdFx0XHRcdGlmIChIb3QuQ3VycmVudFBhZ2UudGVzdEVsZW1lbnRzW3Rlc3RFbG0ubmFtZV0gIT0gbnVsbClcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoXFxgVGVzdCBlbGVtZW50IFxcJHt0ZXN0RWxtLm5hbWV9IGFscmVhZHkgZXhpc3RzIVxcYCk7XG5cblx0XHRcdFx0XHRIb3QuQ3VycmVudFBhZ2UuYWRkVGVzdEVsZW1lbnQgKHRlc3RFbG0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNhdGNoIChleClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoXG5cdFx0XHRcXGBFcnJvciBwcm9jZXNzaW5nIHRlc3QgZWxlbWVudCBcXCR7Zm91bmRTdHJ9IGluIFxcJHtIb3QuQ3VycmVudFBhZ2UubmFtZX0uIEVycm9yOiBcXCR7ZXgubWVzc2FnZX1cXGBcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gKHRlc3RFbG0pO1xuXHRcdFx0fVxuXG5cdFx0XHRhc3luYyBmdW5jdGlvbiBydW5Db250ZW50IChDdXJyZW50SG90RmlsZSlcblx0XHRcdHtcXG5gO1xuXHRcdFx0ZXhlY3V0aW9uQ29udGVudCArPSBvdXRwdXQ7XG5cdFx0XHRleGVjdXRpb25Db250ZW50ICs9IGBcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIChydW5Db250ZW50IChQYXNzZWRIb3RGaWxlKS50aGVuICgoKSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRyZXR1cm4gKHtcblx0XHRcdFx0XHRcdGhvdDogSG90LFxuXHRcdFx0XHRcdFx0b3V0cHV0OiBIb3QuT3V0cHV0LFxuXHRcdFx0XHRcdFx0ZGF0YTogSlNPTi5zdHJpbmdpZnkgKEhvdC5EYXRhKVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSkpO2A7XG5cblx0XHRcdC8vLyBAZml4bWUgUHJpb3IgdG8gZXhlY3V0aW9uIGNvbXBpbGUgYW55IFR5cGVTY3JpcHQgYW5kIG1ha2UgaXQgRVM1IGNvbXBhdGlibGUuXG5cdFx0XHRsZXQgZnVuYzogRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24gKGV4ZWN1dGlvbkNvbnRlbnQpO1xuXHRcdFx0cmV0dXJuZWRPdXRwdXQgPSBhd2FpdCBmdW5jLmFwcGx5ICh0aGlzLCBbSG90LCB0aGlzXSk7XG5cdFx0fVxuXHRcdGNhdGNoIChleClcblx0XHR7XG5cdFx0XHRpZiAoZXggaW5zdGFuY2VvZiBTeW50YXhFcnJvcilcblx0XHRcdHtcblx0XHRcdFx0Ly8vIEBmaXhtZSBQdXQgd2hhdCdzIGluIHRoZSBjb250ZW50IHZhcmlhYmxlIGludG8gYSBwcmV2IGNvbnRlbnQgdmFyaWFibGU/XG5cdFx0XHRcdC8vLyBUaGVuIG9uY2UgdGhlcmUncyBubyBsb25nZXIgYW55IHN5bnRheCBlcnJvcnMgYmVpbmcgdGhyb3duLCBleGVjdXRlIHRoZSBcblx0XHRcdFx0Ly8vIGNvZGU/IFRoaXMgd291bGQgYWxzbyByZXF1aXJlIHNhdmluZyBhbnkgSFRNTCBvdXRzaWRlIG9mIHRoZSAqPiBhbmQgPCogXG5cdFx0XHRcdC8vLyB0aGVuIGVjaG9pbmcgaXQgb3V0LiBUaGUgdGhyb3cgYmVsb3cgd291bGQgaGF2ZSB0byBiZSByZW1vdmVkIGFzIHdlbGwuXG5cdFx0XHRcdHRocm93IGV4O1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aHJvdyBleDtcblx0XHR9XG5cblx0XHRIb3QuRGF0YSA9IHJldHVybmVkT3V0cHV0LmhvdC5EYXRhO1xuXHRcdGxldCBmaW5hbE91dHB1dDogc3RyaW5nID0gcmV0dXJuZWRPdXRwdXQub3V0cHV0O1xuXHRcdEhvdC5PdXRwdXQgPSBcIlwiO1xuXG5cdFx0cmV0dXJuIChmaW5hbE91dHB1dCk7XG5cdH1cbn0iLCIvKipcbiAqIEhvdCB0ZXN0IGVsZW1lbnQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSG90VGVzdEVsZW1lbnRPcHRpb25zXG57XG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgdGVzdCBlbGVtZW50IG11c3QgYmUgdmlzaWJsZSBpbiBcblx0ICogb3JkZXIgdG8gc2VsZWN0IGl0LlxuXHQgKi9cblx0bXVzdEJlVmlzaWJsZT86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBJZiB0aGUgdGVzdCBlbGVtZW50IGlzIG1pc3NpbmcsIGlnbm9yZSB0aGUgZXJyb3IuIFRoaXMgXG5cdCAqIHdpbGwgY2F1c2UgdGhlIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uIHRvIHJldHVybiBpbW1lZGlhdGVseSBcblx0ICogd2l0aG91dCBhbnkgZXhjZXB0aW9ucyBiZWluZyB0aHJvd24uXG5cdCAqL1xuXHRpZ25vcmVNaXNzaW5nRWxlbWVudEVycm9yPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBIb3QgdGVzdCBlbGVtZW50IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RUZXN0RWxlbWVudE9wdGlvbnMgaW1wbGVtZW50cyBJSG90VGVzdEVsZW1lbnRPcHRpb25zXG57XG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgdGVzdCBlbGVtZW50IG11c3QgYmUgdmlzaWJsZSBpbiBcblx0ICogb3JkZXIgdG8gc2VsZWN0IGl0LlxuXHQgKi9cblx0bXVzdEJlVmlzaWJsZTogYm9vbGVhbjtcblx0LyoqXG5cdCAqIElmIHRoZSB0ZXN0IGVsZW1lbnQgaXMgbWlzc2luZywgaWdub3JlIHRoZSBlcnJvci4gVGhpcyBcblx0ICogd2lsbCBjYXVzZSB0aGUgcmVzdCBvZiB0aGUgZnVuY3Rpb24gdG8gcmV0dXJuIGltbWVkaWF0ZWx5IFxuXHQgKiB3aXRob3V0IGFueSBleGNlcHRpb25zIGJlaW5nIHRocm93bi5cblx0ICovXG5cdGlnbm9yZU1pc3NpbmdFbGVtZW50RXJyb3I6IGJvb2xlYW47XG5cblx0Y29uc3RydWN0b3IgKGNvcHk6IElIb3RUZXN0RWxlbWVudE9wdGlvbnMgPSB7fSlcblx0e1xuXHRcdHRoaXMubXVzdEJlVmlzaWJsZSA9IGNvcHkubXVzdEJlVmlzaWJsZSB8fCB0cnVlO1xuXHRcdHRoaXMuaWdub3JlTWlzc2luZ0VsZW1lbnRFcnJvciA9IGNvcHkuaWdub3JlTWlzc2luZ0VsZW1lbnRFcnJvciB8fCBmYWxzZTtcblx0fVxufVxuXG4vKipcbiAqIEEgdGVzdCBlbGVtZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RUZXN0RWxlbWVudFxue1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBcblx0ICogd2hpbGUgZXhlY3V0aW5nIHRoZSB0ZXN0LlxuXHQgKi9cblx0ZnVuYz86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSB2YWx1ZSB0byB1c2UuXG5cdCAqL1xuXHR2YWx1ZT86IGFueTtcbn1cblxuLyoqXG4gKiBBIHRlc3QgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFRlc3RFbGVtZW50IGltcGxlbWVudHMgSUhvdFRlc3RFbGVtZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudC5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBleGVjdXRlIFxuXHQgKiB3aGlsZSBleGVjdXRpbmcgdGhlIHRlc3QuXG5cdCAqL1xuXHRmdW5jOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdmFsdWUgdG8gdXNlLlxuXHQgKi9cblx0dmFsdWU6IGFueTtcblxuXHRjb25zdHJ1Y3RvciAobmFtZTogc3RyaW5nIHwgSUhvdFRlc3RFbGVtZW50LCBmdW5jOiBzdHJpbmcgPSBcIlwiLCB2YWx1ZTogYW55ID0gbnVsbClcblx0e1xuXHRcdGlmICh0eXBlb2YgKG5hbWUpID09PSBcInN0cmluZ1wiKVxuXHRcdHtcblx0XHRcdHRoaXMubmFtZSA9IG5hbWU7XG5cdFx0XHR0aGlzLmZ1bmMgPSBmdW5jO1xuXHRcdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5uYW1lID0gbmFtZS5uYW1lO1xuXHRcdFx0dGhpcy5mdW5jID0gbmFtZS5mdW5jIHx8IGZ1bmM7XG5cdFx0XHR0aGlzLnZhbHVlID0gbmFtZS52YWx1ZSB8fCB2YWx1ZTtcblx0XHR9XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3RTZXJ2ZXIgfSBmcm9tIFwiLi9Ib3RTZXJ2ZXJcIjtcbmltcG9ydCB7IEhvdFJvdXRlTWV0aG9kLCBIVFRQTWV0aG9kLCBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbiwgVGVzdENhc2VGdW5jdGlvbiwgVGVzdENhc2VPYmplY3QgfSBmcm9tIFwiLi9Ib3RSb3V0ZU1ldGhvZFwiO1xuaW1wb3J0IHsgSG90Q2xpZW50IH0gZnJvbSBcIi4vSG90Q2xpZW50XCI7XG5pbXBvcnQgeyBIb3RMb2cgfSBmcm9tIFwiLi9Ib3RMb2dcIjtcblxuLyoqXG4gKiBUaGUgcm91dGUgdG8gdXNlLlxuICovXG5leHBvcnQgY2xhc3MgSG90Um91dGVcbntcblx0LyoqXG5cdCAqIFRoZSBzZXJ2ZXIgdGhhdCBtYWludGFpbnMgdGhlIGNvbm5lY3Rpb25zLlxuXHQgKi9cblx0Y29ubmVjdGlvbjogSG90U2VydmVyIHwgSG90Q2xpZW50O1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgbG9nZ2VyLlxuXHQgKi9cblx0bG9nZ2VyOiBIb3RMb2c7XG5cdC8qKlxuXHQgKiBUaGUgcm91dGUuXG5cdCAqL1xuXHRyb3V0ZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHZlcnNpb24uXG5cdCAqL1xuXHR2ZXJzaW9uOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcHJlZml4IHRvIGFkZCB0byB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcm91dGUgbWV0aG9kLlxuXHQgKi9cblx0cHJlZml4OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYXV0aG9yaXphdGlvbiBjcmVkZW50aWFscyB0byBiZSB1c2VkIGJ5IHRoZSBjbGllbnQgXG5cdCAqIHdoZW4gY29ubmVjdGluZyB0byB0aGUgc2VydmVyLlxuXHQgKi9cblx0YXV0aENyZWRlbnRpYWxzOiBhbnk7XG5cdC8qKlxuXHQgKiBUaGUgY2FsbHMgdGhhdCBjYW4gYmUgbWFkZS5cblx0ICovXG5cdG1ldGhvZHM6IEhvdFJvdXRlTWV0aG9kW107XG5cdC8qKlxuXHQgKiBUaGUgZXJyb3JzIGFuZCB0aGVpciBKU09OIHRoYXQgY2FuIGJlIHRocm93bi4gQ2FuIGJlOlxuXHQgKiAqIG5vdF9hdXRob3JpemVkXG5cdCAqL1xuXHRlcnJvcnM6IHsgW2Vycm9yOiBzdHJpbmddOiBhbnkgfTtcblxuXHRjb25zdHJ1Y3RvciAoY29ubmVjdGlvbjogSG90U2VydmVyIHwgSG90Q2xpZW50LCByb3V0ZTogc3RyaW5nLCBtZXRob2RzOiBIb3RSb3V0ZU1ldGhvZFtdID0gW10pXG5cdHtcblx0XHR0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuXHRcdHRoaXMubG9nZ2VyID0gbnVsbDtcblxuXHRcdGlmICh0aGlzLmNvbm5lY3Rpb24gIT0gbnVsbClcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5jb25uZWN0aW9uLnByb2Nlc3NvciAhPSBudWxsKVxuXHRcdFx0XHR0aGlzLmxvZ2dlciA9IHRoaXMuY29ubmVjdGlvbi5wcm9jZXNzb3IubG9nZ2VyO1xuXHRcdH1cblxuXHRcdHRoaXMucm91dGUgPSByb3V0ZTtcblx0XHR0aGlzLnZlcnNpb24gPSBcInYxXCI7XG5cdFx0dGhpcy5wcmVmaXggPSBcIlwiO1xuXHRcdHRoaXMuYXV0aENyZWRlbnRpYWxzID0gbnVsbDtcblx0XHR0aGlzLm1ldGhvZHMgPSBtZXRob2RzO1xuXHRcdHRoaXMuZXJyb3JzID0ge1xuXHRcdFx0XHRcIm5vdF9hdXRob3JpemVkXCI6IEhvdFJvdXRlLmNyZWF0ZUVycm9yIChcIk5vdCBhdXRob3JpemVkLlwiKVxuXHRcdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgYW4gZXJyb3IgSlNPTiBvYmplY3QuXG5cdCAqL1xuXHRzdGF0aWMgY3JlYXRlRXJyb3IgKG1lc3NhZ2U6IHN0cmluZyk6IGFueVxuXHR7XG5cdFx0cmV0dXJuICh7IGVycm9yOiBtZXNzYWdlIH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhbiBBUEkgbWV0aG9kIHRvIHRoaXMgcm91dGUuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbWV0aG9kIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gYWRkLiBJZiBhIEhvdFJvdXRlTWV0aG9kIGlzIHN1cHBsaWVkLCB0aGUgXG5cdCAqIHJlc3Qgb2YgdGhlIGFyZ3VtZW50cyBzdXBwbGllZCB3aWxsIGJlIGlnbm9yZWQuXG5cdCAqL1xuXHRhZGRNZXRob2QgKFxuXHRcdG1ldGhvZDogSG90Um91dGVNZXRob2QgfCBzdHJpbmcsXG5cdFx0ZXhlY3V0ZUZ1bmN0aW9uOiBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbiA9IG51bGwsXG5cdFx0dHlwZTogSFRUUE1ldGhvZCA9IEhUVFBNZXRob2QuUE9TVCxcblx0XHR0ZXN0Q2FzZXM6IChzdHJpbmcgfCBUZXN0Q2FzZUZ1bmN0aW9uKVtdIHwgVGVzdENhc2VGdW5jdGlvbltdIHwgVGVzdENhc2VPYmplY3RbXSA9IG51bGxcblx0XHQpOiB2b2lkXG5cdHtcblx0XHRpZiAodHlwZW9mIChtZXRob2QpID09PSBcInN0cmluZ1wiKVxuXHRcdFx0bWV0aG9kID0gbmV3IEhvdFJvdXRlTWV0aG9kICh0aGlzLCBtZXRob2QsIGV4ZWN1dGVGdW5jdGlvbiwgdHlwZSwgbnVsbCwgbnVsbCwgbnVsbCwgdGVzdENhc2VzKTtcblxuXHRcdHRoaXMubWV0aG9kcy5wdXNoIChtZXRob2QpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIG1ldGhvZCBieSBpdCdzIG5hbWUuXG5cdCAqL1xuXHRnZXRNZXRob2QgKG5hbWU6IHN0cmluZyk6IEhvdFJvdXRlTWV0aG9kXG5cdHtcblx0XHRsZXQgZm91bmRNZXRob2Q6IEhvdFJvdXRlTWV0aG9kID0gbnVsbDtcblxuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5tZXRob2RzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBtZXRob2Q6IEhvdFJvdXRlTWV0aG9kID0gdGhpcy5tZXRob2RzW2lJZHhdO1xuXG5cdFx0XHRpZiAobWV0aG9kLm5hbWUgPT09IG5hbWUpXG5cdFx0XHR7XG5cdFx0XHRcdGZvdW5kTWV0aG9kID0gbWV0aG9kO1xuXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAoZm91bmRNZXRob2QpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGJlZm9yZSBhbGwgcm91dGVzIGhhdmUgYmVlbiByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25QcmVSZWdpc3RlcjogKCkgPT4gUHJvbWlzZTx2b2lkPiA9IG51bGw7XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIGZpcnN0IHJlZ2lzdGVyaW5nIHRoaXMgcm91dGUgd2l0aCBFeHByZXNzLiBJZiBcblx0ICogdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgcm91dGUgd2lsbCBub3QgYmUgcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUmVnaXN0ZXI6ICgpID0+IFByb21pc2U8Ym9vbGVhbj4gPSBudWxsO1xuXHQvKipcblx0ICogRXhlY3V0ZXMgYWZ0ZXIgYWxsIHJvdXRlcyBoYXZlIGJlZW4gcmVnaXN0ZXJlZC5cblx0ICovXG5cdG9uUG9zdFJlZ2lzdGVyOiAoKSA9PiBQcm9taXNlPHZvaWQ+ID0gbnVsbDtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBhdXRob3JpemluZyBhIGNhbGxlZCBtZXRob2QuXG5cdCAqIFRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGhlcmUgd2lsbCBiZSBwYXNzZWQgdG8gb25FeGVjdXRlIGluIHRoZSBcblx0ICogY2FsbGVkIEhvdFJvdXRlTWV0aG9kLiBVbmRlZmluZWQgcmV0dXJuaW5nIGZyb20gaGVyZSB3aWxsIG1lYW4gXG5cdCAqIHRoZSBhdXRob3JpemF0aW9uIGZhaWxlZC5cblx0ICovXG5cdG9uQXV0aG9yaXplVXNlcjogKHJlcTogYW55LCByZXM6IGFueSkgPT4gUHJvbWlzZTxhbnk+ID0gbnVsbDtcbn0iLCJpbXBvcnQgeyBEZXZlbG9wZXJNb2RlIH0gZnJvbSBcIi4vSG90XCI7XG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuaW1wb3J0IHsgSG90Um91dGUgfSBmcm9tIFwiLi9Ib3RSb3V0ZVwiO1xuaW1wb3J0IHsgSG90U2VydmVyIH0gZnJvbSBcIi4vSG90U2VydmVyXCI7XG5cbi8qKlxuICogQXZhaWxhYmxlIEhUVFAgbWV0aG9kcy5cbiAqL1xuZXhwb3J0IGVudW0gSFRUUE1ldGhvZFxue1xuXHRHRVQgPSBcImdldFwiLFxuXHRQT1NUID0gXCJwb3N0XCJcbn1cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSB0aGUgc2VydmVyIHdoZW4gZmlyc3QgcmVnaXN0ZXJpbmcgd2l0aCBFeHByZXNzLlxuICogSWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGlzIHJvdXRlIG1ldGhvZCB3aWxsIG5vdCBiZSByZWdpc3RlcmVkLlxuICovXG5leHBvcnQgdHlwZSBTZXJ2ZXJSZWdpc3RyYXRpb25GdW5jdGlvbiA9ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IHRoZSBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCB0eXBlIFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uID0gXG5cdChyZXE6IGFueSwgcmVzOiBhbnksIGF1dGhvcml6ZWRWYWx1ZTogYW55LCBqc29uT2JqOiBhbnksIHF1ZXJ5T2JqOiBhbnkpID0+IFByb21pc2U8YW55Pjtcbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgdGhlIGNsaWVudC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2xpZW50RXhlY3V0aW9uRnVuY3Rpb24gPSAoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8YW55Pjtcbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgdGhlIHNlcnZlciBmb3IgYXV0aG9yaXphdGlvbi4gQW55IHZhbHVlIFxuICogcmV0dXJuZWQgZnJvbSB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbi5cbiAqIElmIGFuIHVuZGVmaW5lZCB2YWx1ZSBpcyByZXR1cm5lZCwgdGhpcyBpbmRpY2F0ZXMgdGhlIHNlcnZlciB3YXMgbm90IGFibGUgXG4gKiB0byBhdXRoZW50aWNhdGUgdGhlIHVzZXIsIHNvIHRoZSBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbiB3aWxsIG5vdCBiZSBcbiAqIGV4ZWN1dGVkLlxuICovXG5leHBvcnQgdHlwZSBTZXJ2ZXJBdXRob3JpemF0aW9uRnVuY3Rpb24gPSAocmVxOiBhbnksIHJlczogYW55LCBqc29uT2JqOiBhbnksIHF1ZXJ5T2JqOiBhbnkpID0+IFByb21pc2U8YW55Pjtcbi8qKlxuICogVGhlIHRlc3QgY2FzZSBmdW5jdGlvbiB0byBleGVjdXRlLlxuICovXG5leHBvcnQgdHlwZSBUZXN0Q2FzZUZ1bmN0aW9uID0gKChkcml2ZXI6IEhvdFRlc3REcml2ZXIpID0+IFByb21pc2U8YW55PikgfCAoKGRyaXZlcjogSG90VGVzdERyaXZlcikgPT4gYW55KTtcbi8qKlxuICogVGhlIHRlc3QgY2FzZSBvYmplY3QgdG8gcGFzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXN0Q2FzZU9iamVjdFxue1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBmdW5jdGlvbiB0byBleGVjdXRlLlxuXHQgKi9cblx0ZnVuYzogVGVzdENhc2VGdW5jdGlvbjtcbn1cblxuLyoqXG4gKiBBbiBBUEkgbWV0aG9kIHRvIG1ha2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RSb3V0ZU1ldGhvZFxue1xuXHQvKipcblx0ICogVGhlIHBhcmVudCByb3V0ZS5cblx0ICovXG5cdHBhcmVudFJvdXRlOiBIb3RSb3V0ZTtcblx0LyoqXG5cdCAqIFRoZSBhcGkgY2FsbCBuYW1lLlxuXHQgKi9cblx0bmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGFwaSBjYWxsIG5hbWUuXG5cdCAqL1xuXHR0eXBlOiBIVFRQTWV0aG9kO1xuXHQvKipcblx0ICogSGFzIHRoaXMgbWV0aG9kIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBzZXJ2ZXI/IFRoaXMgXG5cdCAqIHByZXZlbnRzIHRoZSBtZXRob2QgZnJvbSBiZWluZyByZXJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRpc1JlZ2lzdGVyZWQ6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBIYXMgdGhpcyBtZXRob2QgYmVlbiByZWdpc3RlcmVkIHdpdGggdGhlIHNlcnZlcj8gVGhpcyBcblx0ICogcHJldmVudHMgdGhlIG1ldGhvZCBmcm9tIGJlaW5nIHJlcmVnaXN0ZXJlZC5cblx0ICovXG5cdGV4ZWN1dGVTZXR1cDogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzIHRvIGJlIHVzZWQgYnkgdGhlIGNsaWVudCBcblx0ICogd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBzZXJ2ZXIuXG5cdCAqL1xuXHRhdXRoQ3JlZGVudGlhbHM6IGFueTtcblx0LyoqXG5cdCAqIFRoZSB0ZXN0IGNhc2Ugb2JqZWN0cyB0byBleGVjdXRlIGR1cmluZyB0ZXN0cy5cblx0ICovXG5cdHRlc3RDYXNlczoge1xuXHRcdFx0W25hbWU6IHN0cmluZ106IFRlc3RDYXNlT2JqZWN0O1xuXHRcdH07XG5cblx0Y29uc3RydWN0b3IgKHJvdXRlOiBIb3RSb3V0ZSwgbmFtZTogc3RyaW5nLCBcblx0XHRvbkV4ZWN1dGU6IFNlcnZlckV4ZWN1dGlvbkZ1bmN0aW9uIHwgQ2xpZW50RXhlY3V0aW9uRnVuY3Rpb24gPSBudWxsLCBcblx0XHR0eXBlOiBIVFRQTWV0aG9kID0gSFRUUE1ldGhvZC5QT1NULCBvblNlcnZlckF1dGhvcml6ZTogU2VydmVyQXV0aG9yaXphdGlvbkZ1bmN0aW9uID0gbnVsbCwgXG5cdFx0b25SZWdpc3RlcjogU2VydmVyUmVnaXN0cmF0aW9uRnVuY3Rpb24gPSBudWxsLCBhdXRoQ3JlZGVudGlhbHM6IGFueSA9IG51bGwsIFxuXHRcdHRlc3RDYXNlczogKHN0cmluZyB8IFRlc3RDYXNlRnVuY3Rpb24pW10gfCBUZXN0Q2FzZUZ1bmN0aW9uW10gfCBUZXN0Q2FzZU9iamVjdFtdID0gbnVsbClcblx0e1xuXHRcdHRoaXMucGFyZW50Um91dGUgPSByb3V0ZTtcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xuXHRcdHRoaXMudHlwZSA9IHR5cGU7XG5cdFx0dGhpcy5pc1JlZ2lzdGVyZWQgPSBmYWxzZTtcblx0XHR0aGlzLmV4ZWN1dGVTZXR1cCA9IGZhbHNlO1xuXHRcdHRoaXMuYXV0aENyZWRlbnRpYWxzID0gYXV0aENyZWRlbnRpYWxzO1xuXHRcdHRoaXMub25TZXJ2ZXJBdXRob3JpemUgPSBvblNlcnZlckF1dGhvcml6ZTtcblx0XHR0aGlzLm9uUmVnaXN0ZXIgPSBvblJlZ2lzdGVyO1xuXHRcdHRoaXMudGVzdENhc2VzID0ge307XG5cblx0XHRpZiAodGhpcy5wYXJlbnRSb3V0ZS5jb25uZWN0aW9uLnByb2Nlc3Nvci5tb2RlID09PSBEZXZlbG9wZXJNb2RlLkRldmVsb3BtZW50KVxuXHRcdHtcblx0XHRcdGlmICh0ZXN0Q2FzZXMgIT0gbnVsbClcblx0XHRcdHtcblx0XHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB0ZXN0Q2FzZXMubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgb2JqID0gdGVzdENhc2VzW2lJZHhdO1xuXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiAob2JqKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjb25zdCBuYW1lOiBzdHJpbmcgPSBvYmo7XG5cdFx0XHRcdFx0XHRjb25zdCBmdW5jOiBUZXN0Q2FzZUZ1bmN0aW9uID0gKDxUZXN0Q2FzZUZ1bmN0aW9uPnRlc3RDYXNlc1tpSWR4ICsgMV0pO1xuXG5cdFx0XHRcdFx0XHR0aGlzLmFkZFRlc3RDYXNlIChuYW1lLCBmdW5jKTtcblx0XHRcdFx0XHRcdGlJZHgrKztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0dGhpcy5hZGRUZXN0Q2FzZSAob2JqKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLnBhcmVudFJvdXRlLmNvbm5lY3Rpb24gaW5zdGFuY2VvZiBIb3RTZXJ2ZXIpXG5cdFx0XHR0aGlzLm9uU2VydmVyRXhlY3V0ZSA9IG9uRXhlY3V0ZTtcblx0XHQvL2Vsc2Vcblx0XHRcdC8vdGhpcy5vbkNsaWVudEV4ZWN1dGUgPSBvbkV4ZWN1dGU7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZXMgYmVmb3JlIGFsbCByb3V0ZXMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblByZVJlZ2lzdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHdoZW4gZmlyc3QgcmVnaXN0ZXJpbmcgdGhpcyBtZXRob2Qgd2l0aCBFeHByZXNzLiBJZiBcblx0ICogdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgbWV0aG9kIHdpbGwgbm90IGJlIHJlZ2lzdGVyZWQuXG5cdCAqL1xuXHRvblJlZ2lzdGVyPzogU2VydmVyUmVnaXN0cmF0aW9uRnVuY3Rpb247XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBhZnRlciBhbGwgcm91dGVzIGhhdmUgYmVlbiByZWdpc3RlcmVkLlxuXHQgKi9cblx0b25Qb3N0UmVnaXN0ZXI/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIGF1dGhvcml6aW5nIGEgY2FsbGVkIG1ldGhvZC4gSWYgdGhpcyBtZXRob2QgXG5cdCAqIGlzIHNldCwgdGhpcyB3aWxsIG5vdCBjYWxsIG9uQXV0aG9yaXplIGZvciB0aGUgcGFyZW50IEhvdFJvdXRlLlxuXHQgKiBUaGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBoZXJlIHdpbGwgYmUgcGFzc2VkIHRvIG9uRXhlY3V0ZS4gXG5cdCAqIFVuZGVmaW5lZCByZXR1cm5pbmcgZnJvbSBoZXJlIHdpbGwgbWVhbiB0aGUgYXV0aG9yaXphdGlvbiBmYWlsZWQuXG5cdCAqIElmIGFueSBleGNlcHRpb25zIGFyZSB0aHJvd24gZnJvbSB0aGlzIGZ1bmN0aW9uLCB0aGV5IHdpbGwgYmUgc2VudCBcblx0ICogdG8gdGhlIHNlcnZlciBhcyBhbiB7IGVycm9yOiBzdHJpbmc7IH0gb2JqZWN0IHdpdGggdGhlIGV4Y2VwdGlvbiBcblx0ICogbWVzc2FnZSBhcyB0aGUgZXJyb3IuXG5cdCAqL1xuXHRvblNlcnZlckF1dGhvcml6ZT86IFNlcnZlckF1dGhvcml6YXRpb25GdW5jdGlvbjtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgd2hlbiBleGVjdXRpbmcgYSBjYWxsZWQgbWV0aG9kIGZyb20gdGhlIHNlcnZlciBzaWRlLiBcblx0ICogVGhpcyB3aWxsIHN0cmluZ2lmeSBhbnkgSlNPTiBvYmplY3QgYW5kIHNlbmQgaXQgYXMgYSBKU09OIHJlc3BvbnNlLiBcblx0ICogSWYgdW5kZWZpbmVkIGlzIHJldHVybmVkIG5vIHJlc3BvbnNlIHdpbGwgYmUgc2VudCB0byB0aGUgc2VydmVyLiBcblx0ICogU28gdGhlIGRldmVsb3BlciB3b3VsZCBoYXZlIHRvIHNlbmQgYSByZXNwb25zZSB1c2luZyBcInJlc1wiLlxuXHQgKiBJZiBhbnkgZXhjZXB0aW9ucyBhcmUgdGhyb3duIGZyb20gdGhpcyBmdW5jdGlvbiwgdGhleSB3aWxsIGJlIHNlbnQgXG5cdCAqIHRvIHRoZSBzZXJ2ZXIgYXMgYW4geyBlcnJvcjogc3RyaW5nOyB9IG9iamVjdCB3aXRoIHRoZSBleGNlcHRpb24gXG5cdCAqIG1lc3NhZ2UgYXMgdGhlIGVycm9yLlxuXHQgKi9cblx0b25TZXJ2ZXJFeGVjdXRlPzogU2VydmVyRXhlY3V0aW9uRnVuY3Rpb247XG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB3aGVuIGV4ZWN1dGluZyBhIGNhbGxlZCBtZXRob2QgZnJvbSB0aGUgY2xpZW50IHNpZGUuXG5cdCAqIEBmaXhtZSBJcyB0aGlzIG5lY2Vzc2FyeT9cblx0ICovXG5cdG9uQ2xpZW50RXhlY3V0ZT86IENsaWVudEV4ZWN1dGlvbkZ1bmN0aW9uO1xuXG5cdC8qKlxuXHQgKiBBZGQgYSBuZXcgdGVzdCBjYXNlLlxuXHQgKi9cblx0YWRkVGVzdENhc2UgKG5ld1Rlc3RDYXNlOiBUZXN0Q2FzZU9iamVjdCB8IHN0cmluZyB8IFRlc3RDYXNlRnVuY3Rpb24sIFxuXHRcdFx0dGVzdENhc2VGdW5jdGlvbjogVGVzdENhc2VGdW5jdGlvbiA9IG51bGwpOiB2b2lkXG5cdHtcblx0XHRpZiAodHlwZW9mIChuZXdUZXN0Q2FzZSkgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0Y29uc3QgbmFtZTogc3RyaW5nID0gbmV3VGVzdENhc2U7XG5cdFx0XHRjb25zdCBmdW5jOiBUZXN0Q2FzZUZ1bmN0aW9uID0gdGVzdENhc2VGdW5jdGlvbjtcblxuXHRcdFx0dGhpcy50ZXN0Q2FzZXNbbmFtZV0gPSB7XG5cdFx0XHRcdFx0bmFtZTogbmFtZSxcblx0XHRcdFx0XHRmdW5jOiBmdW5jXG5cdFx0XHRcdH07XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIChuZXdUZXN0Q2FzZSkgPT09IFwiZnVuY3Rpb25cIilcblx0XHR7XG5cdFx0XHRjb25zdCB0ZXN0Q2FzZUlkOiBudW1iZXIgPSBPYmplY3Qua2V5cyAodGhpcy50ZXN0Q2FzZXMpLmxlbmd0aDtcblx0XHRcdGNvbnN0IG5hbWU6IHN0cmluZyA9IGAke3RoaXMucGFyZW50Um91dGUucm91dGV9LyR7dGhpcy5uYW1lfSB0ZXN0IGNhc2UgJHt0ZXN0Q2FzZUlkfWA7XG5cdFx0XHRjb25zdCBmdW5jOiBUZXN0Q2FzZUZ1bmN0aW9uID0gKDxUZXN0Q2FzZUZ1bmN0aW9uPm5ld1Rlc3RDYXNlKTtcblxuXHRcdFx0dGhpcy50ZXN0Q2FzZXNbbmFtZV0gPSB7XG5cdFx0XHRcdFx0bmFtZTogbmFtZSxcblx0XHRcdFx0XHRmdW5jOiBmdW5jXG5cdFx0XHRcdH07XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCB0ZXN0Q2FzZTogVGVzdENhc2VPYmplY3QgPSAoPFRlc3RDYXNlT2JqZWN0Pm5ld1Rlc3RDYXNlKTtcblx0XHR0aGlzLnRlc3RDYXNlc1t0ZXN0Q2FzZS5uYW1lXSA9IHRlc3RDYXNlO1xuXHR9XG59IiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsImltcG9ydCB7IEhvdCB9IGZyb20gXCIuL0hvdFwiO1xuaW1wb3J0IHsgSG90RmlsZSB9IGZyb20gXCIuL0hvdEZpbGVcIjtcbmltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5pbXBvcnQgeyBIb3RBUEkgfSBmcm9tIFwiLi9Ib3RBUElcIjtcbmltcG9ydCB7IEhvdFRlc3RFbGVtZW50IH0gZnJvbSBcIi4vSG90VGVzdEVsZW1lbnRcIjtcbmltcG9ydCB7IEhvdFRlc3RNYXAsIEhvdFRlc3RQYXRoIH0gZnJvbSBcIi4vSG90VGVzdE1hcFwiO1xuXG4vKipcbiAqIEEgcGFnZSB0byBwcmVwcm9jZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElIb3RQYWdlXG57XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBwYWdlLlxuXHQgKi9cblx0bmFtZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSByb3V0ZSB1c2VkIHRvIGdldCB0byB0aGlzIHBhZ2UuXG5cdCAqL1xuXHRyb3V0ZT86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSBwYWdlLiBGaWxlIG9yZGVyaW5nIG1hdHRlcnMgaGVyZS5cblx0ICogRXZlcnkgZmlsZSBpcyBwcm9jZXNzZWQgaW5jcmVtZW50YWxseS5cblx0ICovXG5cdGZpbGVzPzogSG90RmlsZVtdO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgdGVzdGVyIG5hbWUuXG5cdCAqL1xuXHR0ZXN0ZXJOYW1lPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgdGVzdGVyIG1hcC5cblx0ICovXG5cdHRlc3Rlck1hcD86IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBlbGVtZW50cyB0byB0ZXN0IG9uIHRoaXMgcGFnZS5cblx0ICovXG5cdHRlc3RFbGVtZW50cz86IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RFbGVtZW50OyB9O1xuXHQvKipcblx0ICogVGhlIHRlc3QgcGF0aHMgdG8gdGVzdCBvbiB0aGlzIHBhZ2UuXG5cdCAqL1xuXHR0ZXN0UGF0aHM/OiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0UGF0aDsgfTtcbn1cblxuLyoqXG4gKiBBIHBhZ2UgdG8gcHJlcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdFBhZ2UgaW1wbGVtZW50cyBJSG90UGFnZVxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcGFnZS5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSByb3V0ZSB1c2VkIHRvIGdldCB0byB0aGlzIHBhZ2UuXG5cdCAqL1xuXHRyb3V0ZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIHBhZ2UuIEZpbGUgb3JkZXJpbmcgbWF0dGVycyBoZXJlLlxuXHQgKiBFdmVyeSBmaWxlIGlzIHByb2Nlc3NlZCBpbmNyZW1lbnRhbGx5LlxuXHQgKi9cblx0ZmlsZXM6IEhvdEZpbGVbXTtcblx0LyoqXG5cdCAqIFRoZSBhc3NvY2lhdGVkIHRlc3RlciBuYW1lLlxuXHQgKi9cblx0dGVzdGVyTmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgdGVzdGVyIG1hcC5cblx0ICovXG5cdHRlc3Rlck1hcDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGVsZW1lbnRzIHRvIHRlc3Qgb24gdGhpcyBwYWdlLlxuXHQgKi9cblx0dGVzdEVsZW1lbnRzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0RWxlbWVudDsgfTtcblx0LyoqXG5cdCAqIFRoZSB0ZXN0IHBhdGhzIHRvIHRlc3Qgb24gdGhpcyBwYWdlLlxuXHQgKi9cblx0dGVzdFBhdGhzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0UGF0aDsgfTtcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSUhvdFBhZ2UgfCBIb3RTdGFxKVxuXHR7XG5cdFx0aWYgKGNvcHkgaW5zdGFuY2VvZiBIb3RTdGFxKVxuXHRcdHtcblx0XHRcdHRoaXMucHJvY2Vzc29yID0gY29weTtcblx0XHRcdHRoaXMubmFtZSA9IFwiXCI7XG5cdFx0XHR0aGlzLnRlc3Rlck5hbWUgPSBcIlwiO1xuXHRcdFx0dGhpcy50ZXN0ZXJNYXAgPSBcIlwiO1xuXHRcdFx0dGhpcy5yb3V0ZSA9IFwiXCI7XG5cdFx0XHR0aGlzLmZpbGVzID0gW107XG5cdFx0XHR0aGlzLnRlc3RFbGVtZW50cyA9IHt9O1xuXHRcdFx0dGhpcy50ZXN0UGF0aHMgPSB7fTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMucHJvY2Vzc29yID0gY29weS5wcm9jZXNzb3I7XG5cdFx0XHR0aGlzLm5hbWUgPSBjb3B5Lm5hbWUgfHwgXCJcIjtcblx0XHRcdHRoaXMudGVzdGVyTmFtZSA9IGNvcHkudGVzdGVyTmFtZSB8fCBcIlwiO1xuXHRcdFx0dGhpcy50ZXN0ZXJNYXAgPSBjb3B5LnRlc3Rlck1hcCB8fCBcIlwiO1xuXHRcdFx0dGhpcy5yb3V0ZSA9IGNvcHkucm91dGUgfHwgXCJcIjtcblx0XHRcdHRoaXMuZmlsZXMgPSBjb3B5LmZpbGVzIHx8IFtdO1xuXHRcdFx0dGhpcy50ZXN0RWxlbWVudHMgPSBjb3B5LnRlc3RFbGVtZW50cyB8fCB7fTtcblx0XHRcdHRoaXMudGVzdFBhdGhzID0gY29weS50ZXN0UGF0aHMgfHwge307XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIGZpbGUgdG8gcHJvY2Vzcy4gSXQncyByZWNvbW1lbmQgdG8gbG9hZCB0aGUgZmlsZSBwcmlvciB0byBcblx0ICogYWRkaW5nIGl0IHRvIGEgcGFnZSBpZiBpdCdzIGFib3V0IHRvIGJlIHVzZWQuXG5cdCAqL1xuXHRhc3luYyBhZGRGaWxlIChmaWxlOiBIb3RGaWxlKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0ZmlsZS5wYWdlID0gdGhpcztcblxuXHRcdHRoaXMuZmlsZXMucHVzaCAoZmlsZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBBUEkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFnZS5cblx0ICovXG5cdGdldEFQSSAoKTogSG90QVBJXG5cdHtcblx0XHRyZXR1cm4gKHRoaXMucHJvY2Vzc29yLmFwaSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSB0ZXN0ZXIgQVBJIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhZ2UuXG5cdCAqL1xuXHRnZXRUZXN0ZXJBUEkgKCk6IEhvdEFQSVxuXHR7XG5cdFx0cmV0dXJuICh0aGlzLnByb2Nlc3Nvci50ZXN0ZXJBUEkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhbGwgZmlsZXMgaW4gdGhlIHBhZ2UuIENvdWxkIGRlY3JlYXNlIHBhZ2UgbG9hZGluZyBwZXJmb3JtYW5jZS5cblx0ICogSXQncyByZWNvbW1lbmQgdG8gbG9hZCB0aGUgZmlsZSBwcmlvciB0byBhZGRpbmcgaXQgdG8gYSBwYWdlLlxuXHQgKi9cblx0YXN5bmMgbG9hZCAoZmlsZTogSG90RmlsZSk6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5maWxlcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgZmlsZTogSG90RmlsZSA9IHRoaXMuZmlsZXNbaUlkeF07XG5cblx0XHRcdGF3YWl0IGZpbGUubG9hZCAoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBhIHBhZ2UgYW5kIGdldCB0aGUgcmVzdWx0LlxuXHQgKi9cblx0YXN5bmMgcHJvY2VzcyAoYXJnczogYW55ID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPlxuXHR7XG5cdFx0bGV0IG91dHB1dDogc3RyaW5nID0gXCJcIjtcblxuXHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5maWxlcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgZmlsZTogSG90RmlsZSA9IHRoaXMuZmlsZXNbaUlkeF07XG5cblx0XHRcdEhvdC5PdXRwdXQgPSBcIlwiO1xuXHRcdFx0ZmlsZS5wYWdlID0gdGhpcztcblxuXHRcdFx0b3V0cHV0ICs9IGF3YWl0IGZpbGUucHJvY2VzcyAoYXJncyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIHRlc3QgZWxlbWVudC5cblx0ICovXG5cdGFkZFRlc3RFbGVtZW50IChlbG06IEhvdFRlc3RFbGVtZW50KTogdm9pZFxuXHR7XG5cdFx0aWYgKHRoaXMudGVzdEVsZW1lbnRzW2VsbS5uYW1lXSAhPSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVGVzdCBlbGVtZW50ICR7ZWxtLm5hbWV9IGFscmVhZHkgZXhpc3RzIWApO1xuXG5cdFx0dGhpcy50ZXN0RWxlbWVudHNbZWxtLm5hbWVdID0gZWxtO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHRlc3QgZWxlbWVudC5cblx0ICovXG5cdGdldFRlc3RFbGVtZW50IChuYW1lOiBzdHJpbmcpOiBIb3RUZXN0RWxlbWVudFxuXHR7XG5cdFx0aWYgKHRoaXMudGVzdEVsZW1lbnRzW25hbWVdID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0IGVsZW1lbnQgJHtuYW1lfSBkb2VzdCBub3QgZXhpc3QhYCk7XG5cblx0XHRyZXR1cm4gKHRoaXMudGVzdEVsZW1lbnRzW25hbWVdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgYSB0ZXN0IHBhdGguXG5cdCAqL1xuXHRjcmVhdGVUZXN0UGF0aCAocGF0aE5hbWU6IHN0cmluZywgZHJpdmVyRnVuYzogSG90VGVzdFBhdGgpOiB2b2lkXG5cdHtcblx0XHRpZiAodGhpcy50ZXN0UGF0aHNbcGF0aE5hbWVdICE9IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0IHBhdGggJHtwYXRoTmFtZX0gYWxyZWFkeSBleGlzdHMhYCk7XG5cblx0XHR0aGlzLnRlc3RQYXRoc1twYXRoTmFtZV0gPSBkcml2ZXJGdW5jO1xuXHR9XG59IiwiLyoqXG4gKiBUaGUgbG9nZ2luZyBsZXZlbC5cbiAqL1xuZXhwb3J0IGVudW0gSG90TG9nTGV2ZWxcbntcblx0LyoqXG5cdCAqIFByaW50cyBvbmx5IGluZm8gbWVzc2FnZXMuXG5cdCAqL1xuXHRJbmZvLFxuXHQvKipcblx0ICogUHJpbnRzIG9ubHkgd2FybmluZyBtZXNzYWdlcy5cblx0ICovXG5cdFdhcm5pbmcsXG5cdC8qKlxuXHQgKiBQcmludHMgb25seSBlcnJvciBtZXNzYWdlcy5cblx0ICovXG5cdEVycm9yLFxuXHQvKipcblx0ICogUHJpbnRzIGFsbCBtZXNzYWdlcy5cblx0ICovXG5cdFZlcmJvc2UsXG5cdC8qKlxuXHQgKiBQcmludHMgYWxsIG1lc3NhZ2VzLCBleGNlcHQgdmVyYm9zZS5cblx0ICovXG5cdEFsbCxcblx0LyoqXG5cdCAqIERvZXNuJ3QgcHJpbnQgYW55IG1lc3NhZ2UuXG5cdCAqL1xuXHROb25lXG59XG5cbi8qKlxuICogVGhlIGxvZ2dlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdExvZ1xue1xuXHQvKipcblx0ICogVGhlIGxvZ2dpbmcgbGV2ZWwuXG5cdCAqL1xuXHRsb2dMZXZlbDogSG90TG9nTGV2ZWw7XG5cblx0Y29uc3RydWN0b3IgKGxvZ0xldmVsOiBIb3RMb2dMZXZlbCA9IEhvdExvZ0xldmVsLkFsbClcblx0e1xuXHRcdHRoaXMubG9nTGV2ZWwgPSBsb2dMZXZlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2cgYSBtZXNzYWdlLlxuXHQgKi9cblx0bG9nIChsZXZlbDogSG90TG9nTGV2ZWwsIG1lc3NhZ2U6IHN0cmluZylcblx0e1xuXHRcdGlmICh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5WZXJib3NlKVxuXHRcdHtcblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuRXJyb3IpXG5cdFx0XHRcdHRoaXMuZXJyb3IgKG1lc3NhZ2UpO1xuXG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLldhcm5pbmcpXG5cdFx0XHRcdHRoaXMud2FybmluZyAobWVzc2FnZSk7XG5cblx0XHRcdGlmICgobGV2ZWwgPT09IEhvdExvZ0xldmVsLkluZm8pIHx8IFxuXHRcdFx0XHQobGV2ZWwgPT09IEhvdExvZ0xldmVsLlZlcmJvc2UpKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLmluZm8gKG1lc3NhZ2UpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5BbGwpXG5cdFx0e1xuXHRcdFx0aWYgKGxldmVsID09PSBIb3RMb2dMZXZlbC5FcnJvcilcblx0XHRcdFx0dGhpcy5lcnJvciAobWVzc2FnZSk7XG5cblx0XHRcdGlmIChsZXZlbCA9PT0gSG90TG9nTGV2ZWwuV2FybmluZylcblx0XHRcdFx0dGhpcy53YXJuaW5nIChtZXNzYWdlKTtcblxuXHRcdFx0aWYgKGxldmVsID09PSBIb3RMb2dMZXZlbC5JbmZvKVxuXHRcdFx0XHR0aGlzLmluZm8gKG1lc3NhZ2UpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5FcnJvcilcblx0XHR7XG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLkVycm9yKVxuXHRcdFx0XHR0aGlzLmVycm9yIChtZXNzYWdlKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuV2FybmluZylcblx0XHR7XG5cdFx0XHRpZiAobGV2ZWwgPT09IEhvdExvZ0xldmVsLldhcm5pbmcpXG5cdFx0XHRcdHRoaXMud2FybmluZyAobWVzc2FnZSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkluZm8pXG5cdFx0e1xuXHRcdFx0aWYgKGxldmVsID09PSBIb3RMb2dMZXZlbC5JbmZvKVxuXHRcdFx0XHR0aGlzLmluZm8gKG1lc3NhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2cgYSB2ZXJib3NlIG1lc3NhZ2UuXG5cdCAqL1xuXHR2ZXJib3NlIChtZXNzYWdlOiBzdHJpbmcpXG5cdHtcblx0XHRpZiAodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuVmVyYm9zZSlcblx0XHRcdGNvbnNvbGUuaW5mbyAobWVzc2FnZSk7XG5cdH1cblxuXHQvKipcblx0ICogTG9nIGEgbWVzc2FnZS5cblx0ICovXG5cdGluZm8gKG1lc3NhZ2U6IHN0cmluZylcblx0e1xuXHRcdGlmICgodGhpcy5sb2dMZXZlbCA9PT0gSG90TG9nTGV2ZWwuQWxsKSB8fCBcblx0XHRcdCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5WZXJib3NlKSB8fCBcblx0XHRcdCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5JbmZvKSlcblx0XHR7XG5cdFx0XHRjb25zb2xlLmluZm8gKG1lc3NhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2cgYSB3YXJuaW5nLlxuXHQgKi9cblx0d2FybmluZyAobWVzc2FnZTogc3RyaW5nKVxuXHR7XG5cdFx0aWYgKCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5BbGwpIHx8IFxuXHRcdFx0KHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLlZlcmJvc2UpIHx8IFxuXHRcdFx0KHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLldhcm5pbmcpKVxuXHRcdHtcblx0XHRcdGNvbnNvbGUud2FybiAobWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvZyBhbiBlcnJvciBtZXNzYWdlLlxuXHQgKi9cblx0ZXJyb3IgKG1lc3NhZ2U6IHN0cmluZyB8IEVycm9yKVxuXHR7XG5cdFx0aWYgKCh0aGlzLmxvZ0xldmVsID09PSBIb3RMb2dMZXZlbC5BbGwpIHx8IFxuXHRcdFx0KHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLlZlcmJvc2UpIHx8IFxuXHRcdFx0KHRoaXMubG9nTGV2ZWwgPT09IEhvdExvZ0xldmVsLkVycm9yKSlcblx0XHR7XG5cdFx0XHRsZXQgbXNnOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0XHRpZiAodHlwZW9mIChtZXNzYWdlKSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdFx0bXNnID0gbWVzc2FnZTtcblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0aWYgKG1lc3NhZ2UubWVzc2FnZSAhPSBudWxsKVxuXHRcdFx0XHRcdG1zZyA9IG1lc3NhZ2UubWVzc2FnZTtcblxuXHRcdFx0XHRpZiAobWVzc2FnZS5zdGFjayAhPSBudWxsKVxuXHRcdFx0XHRcdG1zZyA9IG1lc3NhZ2Uuc3RhY2s7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IgKG1zZyk7XG5cdFx0fVxuXHR9XG59IiwiaW1wb3J0IHsgSG90U3RhcSB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdEFQSSB9IGZyb20gXCIuL0hvdEFQSVwiO1xuaW1wb3J0IHsgSG90U2VydmVyVHlwZSB9IGZyb20gXCIuL0hvdFNlcnZlclwiO1xuaW1wb3J0IHsgSG90TG9nIH0gZnJvbSBcIi4vSG90TG9nXCI7XG5cbi8qKlxuICogQSBjbGllbnQgY29ubmVjdGVkIHRvIGEgc2VydmVyLlxuICovXG5leHBvcnQgY2xhc3MgSG90Q2xpZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBBUEkgdG8gdXNlLlxuXHQgKi9cblx0YXBpOiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgdGVzdGVyIEFQSSB0byB1c2UuXG5cdCAqL1xuXHR0ZXN0ZXJBUEk6IEhvdEFQSTtcblx0LyoqXG5cdCAqIFRoZSB0eXBlIG9mIHNlcnZlci5cblx0ICovXG5cdHR5cGU6IEhvdFNlcnZlclR5cGU7XG5cdC8qKlxuXHQgKiBUaGUgbG9nZ2VyLlxuXHQgKi9cblx0bG9nZ2VyOiBIb3RMb2c7XG5cblx0Y29uc3RydWN0b3IgKHByb2Nlc3NvcjogSG90U3RhcSlcblx0e1xuXHRcdHRoaXMucHJvY2Vzc29yID0gcHJvY2Vzc29yO1xuXHRcdHRoaXMuYXBpID0gbnVsbDtcblx0XHR0aGlzLnRlc3RlckFQSSA9IG51bGw7XG5cdFx0dGhpcy50eXBlID0gSG90U2VydmVyVHlwZS5IVFRQO1xuXHRcdHRoaXMubG9nZ2VyID0gcHJvY2Vzc29yLmxvZ2dlcjtcblx0fVxufSIsImltcG9ydCB7IEV2ZW50RXhlY3V0aW9uVHlwZSwgSG90QVBJIH0gZnJvbSBcIi4vSG90QVBJXCI7XG5pbXBvcnQgeyBIb3RSb3V0ZSB9IGZyb20gXCIuL0hvdFJvdXRlXCI7XG5pbXBvcnQgeyBIb3RDbGllbnQgfSBmcm9tIFwiLi9Ib3RDbGllbnRcIjtcbmltcG9ydCB7IEhvdFNlcnZlciB9IGZyb20gXCIuL0hvdFNlcnZlclwiO1xuaW1wb3J0IHsgSG90VGVzdERyaXZlciB9IGZyb20gXCIuL0hvdFRlc3REcml2ZXJcIjtcbmltcG9ydCB7IEhvdFRlc3RlciB9IGZyb20gXCIuL0hvdFRlc3RlclwiO1xuaW1wb3J0IHsgSG90VGVzdE1hcCwgSG90VGVzdFBhdGgsIEhvdFRlc3RQYWdlIH0gZnJvbSBcIi4vSG90VGVzdE1hcFwiO1xuXG5leHBvcnQgY2xhc3MgSG90VGVzdGVyQVBJIGV4dGVuZHMgSG90QVBJXG57XG5cdGNvbnN0cnVjdG9yIChiYXNlVXJsOiBzdHJpbmcsIGNvbm5lY3Rpb246IEhvdFNlcnZlciB8IEhvdENsaWVudCA9IG51bGwsIGRiOiBhbnkgPSBudWxsKVxuXHR7XG5cdFx0c3VwZXIoYmFzZVVybCwgY29ubmVjdGlvbiwgZGIpO1xuXG5cdFx0dGhpcy5leGVjdXRlRXZlbnRzVXNpbmcgPSBFdmVudEV4ZWN1dGlvblR5cGUuSG90QVBJO1xuXG5cdFx0bGV0IHJvdXRlOiBIb3RSb3V0ZSA9IG5ldyBIb3RSb3V0ZSAoY29ubmVjdGlvbiwgXCJ0ZXN0ZXJcIik7XG5cdFx0cm91dGUuYWRkTWV0aG9kIChcInBhZ2VMb2FkZWRcIiwgdGhpcy5wYWdlTG9hZGVkKTtcblx0XHRyb3V0ZS5hZGRNZXRob2QgKFwiZXhlY3V0ZVRlc3RzXCIsIHRoaXMuZXhlY3V0ZVRlc3RzKTtcblx0XHR0aGlzLmFkZFJvdXRlIChyb3V0ZSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgcGFnZSBoYXMgZmluaXNoZWQgbG9hZGluZyBpbiBkZXZlbG9wbWVudCBtb2RlLlxuXHQgKi9cblx0YXN5bmMgcGFnZUxvYWRlZCAocmVxOiBhbnksIHJlczogYW55LCBhdXRob3JpemVkVmFsdWU6IGFueSwganNvbk9iajogYW55LCBxdWVyeU9iajogYW55KTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRsZXQgdGVzdGVyT2JqOiB7XG5cdFx0XHRcdHRlc3Rlck5hbWU6IHN0cmluZztcblx0XHRcdFx0dGVzdGVyTWFwOiBzdHJpbmc7XG5cdFx0XHRcdHBhZ2VOYW1lOiBzdHJpbmc7XG5cdFx0XHRcdHRlc3RFbGVtZW50czogYW55O1xuXHRcdFx0XHR0ZXN0UGF0aHNTdHJzOiBhbnk7XG5cdFx0XHR9ID0ge1xuXHRcdFx0XHR0ZXN0ZXJOYW1lOiBqc29uT2JqW1widGVzdGVyTmFtZVwiXSxcblx0XHRcdFx0dGVzdGVyTWFwOiBqc29uT2JqW1widGVzdGVyTWFwXCJdLFxuXHRcdFx0XHRwYWdlTmFtZToganNvbk9ialtcInBhZ2VOYW1lXCJdLFxuXHRcdFx0XHR0ZXN0RWxlbWVudHM6IGpzb25PYmpbXCJ0ZXN0RWxlbWVudHNcIl0sXG5cdFx0XHRcdHRlc3RQYXRoc1N0cnM6IGpzb25PYmpbXCJ0ZXN0UGF0aHNcIl1cblx0XHRcdH07XG5cblx0XHRmb3IgKGxldCBrZXkgaW4gdGVzdGVyT2JqKVxuXHRcdHtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdGxldCB0ZXN0T2JqOiBhbnkgPSB0ZXN0ZXJPYmpba2V5XTtcblx0XHRcdGxldCB0aHJvd0Vycm9yOiBib29sZWFuID0gZmFsc2U7XG5cblx0XHRcdGlmICh0ZXN0T2JqID09IG51bGwpXG5cdFx0XHRcdHRocm93RXJyb3IgPSB0cnVlO1xuXG5cdFx0XHRpZiAoKHRlc3Rlck9iai50ZXN0ZXJOYW1lID09IFwiXCIpIHx8IFxuXHRcdFx0XHQodGVzdGVyT2JqLnRlc3Rlck1hcCA9PT0gXCJcIikgfHwgXG5cdFx0XHRcdCh0ZXN0ZXJPYmoudGVzdEVsZW1lbnRzID09PSBcIlwiKSB8fCBcblx0XHRcdFx0KHRlc3Rlck9iai50ZXN0UGF0aHNTdHJzID09PSBcIlwiKSlcblx0XHRcdHtcblx0XHRcdFx0dGhyb3dFcnJvciA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aHJvd0Vycm9yID09PSB0cnVlKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0ZXJBUEk6IE9iamVjdCAke2tleX0gd2FzIG5vdCBwYXNzZWQuYCk7XG5cdFx0fVxuXG5cdFx0dGVzdGVyT2JqLnRlc3RFbGVtZW50cyA9IEpTT04ucGFyc2UgKHRlc3Rlck9iai50ZXN0RWxlbWVudHMpO1xuXHRcdHRlc3Rlck9iai50ZXN0UGF0aHNTdHJzID0gSlNPTi5wYXJzZSAodGVzdGVyT2JqLnRlc3RQYXRoc1N0cnMpO1xuXG5cdFx0bGV0IHRlc3RQYXRoczogeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdFBhdGg7IH0gPSB7fTtcblxuXHRcdGZvciAobGV0IGtleSBpbiB0ZXN0ZXJPYmoudGVzdFBhdGhzU3Rycylcblx0XHR7XG5cdFx0XHRsZXQgdGVzdFBhdGg6IChkcml2ZXI6IEhvdFRlc3REcml2ZXIsIC4uLmFyZ3M6IGFueSkgPT4gUHJvbWlzZTxhbnk+ID0gXG5cdFx0XHRcdGV2YWwgKHRlc3Rlck9iai50ZXN0UGF0aHNTdHJzW2tleV0pO1xuXG5cdFx0XHR0ZXN0UGF0aHNba2V5XSA9IHRlc3RQYXRoO1xuXHRcdH1cblxuXHRcdGxldCB0ZXN0ZXI6IEhvdFRlc3RlciA9IHRoaXMuY29ubmVjdGlvbi5wcm9jZXNzb3IudGVzdGVyc1t0ZXN0ZXJPYmoudGVzdGVyTmFtZV07XG5cblx0XHRpZiAodGVzdGVyID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBUZXN0ZXJBUEk6IFRlc3RlciAke3Rlc3Rlck9iai50ZXN0ZXJNYXB9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0bGV0IHRlc3RNYXA6IEhvdFRlc3RNYXAgPSB0ZXN0ZXIudGVzdE1hcHNbdGVzdGVyT2JqLnRlc3Rlck1hcF07XG5cblx0XHRpZiAodGVzdE1hcCA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgVGVzdGVyQVBJOiBUZXN0ZXIgbWFwICR7dGVzdGVyT2JqLnRlc3Rlck1hcH0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHR0ZXN0TWFwLnBhZ2VzW3Rlc3Rlck9iai5wYWdlTmFtZV0gPSB7XG5cdFx0XHRcdFwidGVzdEVsZW1lbnRzXCI6IHt9LFxuXHRcdFx0XHRcInRlc3RQYXRoc1wiOiB7fVxuXHRcdFx0fTtcblx0XHR0ZXN0TWFwLnBhZ2VzW3Rlc3Rlck9iai5wYWdlTmFtZV0udGVzdEVsZW1lbnRzID0gdGVzdGVyT2JqLnRlc3RFbGVtZW50cztcblx0XHR0ZXN0TWFwLnBhZ2VzW3Rlc3Rlck9iai5wYWdlTmFtZV0udGVzdFBhdGhzID0gdGVzdFBhdGhzO1xuXG5cdFx0dGVzdGVyLmZpbmlzaGVkTG9hZGluZyA9IHRydWU7XG5cblx0XHRpZiAodGVzdGVyLm9uRmluaXNoZWRMb2FkaW5nICE9IG51bGwpXG5cdFx0XHRhd2FpdCB0ZXN0ZXIub25GaW5pc2hlZExvYWRpbmcgKCk7XG5cblx0XHRyZXR1cm4gKHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgdGhlIHRlc3RzIGZvciBhIHBhZ2UuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlVGVzdHMgKHJlcTogYW55LCByZXM6IGFueSwgYXV0aG9yaXplZFZhbHVlOiBhbnksIGpzb25PYmo6IGFueSwgcXVlcnlPYmo6IGFueSk6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0bGV0IHRlc3Rlck5hbWU6IHN0cmluZyA9IGpzb25PYmpbXCJ0ZXN0ZXJOYW1lXCJdO1xuXHRcdGxldCB0ZXN0ZXJNYXA6IHN0cmluZyA9IGpzb25PYmpbXCJ0ZXN0ZXJNYXBcIl07XG5cblx0XHRpZiAoKHRlc3Rlck5hbWUgPT0gbnVsbCkgfHwgKHRlc3Rlck1hcCA9PSBudWxsKSlcblx0XHRcdHRocm93IG5ldyBFcnJvciAoXCJUZXN0ZXJBUEk6IE5vdCBhbGwgcmVxdWlyZWQganNvbiBvYmplY3RzIHdlcmUgcGFzc2VkLlwiKTtcblxuXHRcdGlmICgodGVzdGVyTmFtZSA9PT0gXCJcIikgfHwgKHRlc3Rlck1hcCA9PT0gXCJcIikpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiVGVzdGVyQVBJOiBOb3QgYWxsIHJlcXVpcmVkIGpzb24gb2JqZWN0cyB3ZXJlIHBhc3NlZC5cIik7XG5cblx0XHRsZXQgc2VydmVyOiBIb3RTZXJ2ZXIgPSAoPEhvdFNlcnZlcj50aGlzLmNvbm5lY3Rpb24pO1xuXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGlmIChzZXJ2ZXIuZXhlY3V0ZVRlc3RzICE9IG51bGwpXG5cdFx0e1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0YXdhaXQgc2VydmVyLmV4ZWN1dGVUZXN0cyAodGVzdGVyTmFtZSwgdGVzdGVyTWFwKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHRydWUpO1xuXHR9XG59IiwiaW1wb3J0IGZldGNoIGZyb20gXCJjcm9zcy1mZXRjaFwiO1xuXG5pbXBvcnQgeyBIb3RTZXJ2ZXIgfSBmcm9tIFwiLi9Ib3RTZXJ2ZXJcIjtcbmltcG9ydCB7IEhvdFJvdXRlIH0gZnJvbSBcIi4vSG90Um91dGVcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuaW1wb3J0IHsgSG90Um91dGVNZXRob2QsIFNlcnZlckF1dGhvcml6YXRpb25GdW5jdGlvbiB9IGZyb20gXCIuL0hvdFJvdXRlTWV0aG9kXCI7XG5pbXBvcnQgeyBIb3REQiB9IGZyb20gXCIuL0hvdERCXCI7XG5cbmltcG9ydCB7IEhvdERCU2NoZW1hIH0gZnJvbSBcIi4vc2NoZW1hcy9Ib3REQlNjaGVtYVwiO1xuXG4vKipcbiAqIFRoZSBBUEkgdG8gbG9hZC5cbiAqL1xuZXhwb3J0IHR5cGUgQVBJdG9Mb2FkID0ge1xuXHRleHBvcnRlZENsYXNzTmFtZTogc3RyaW5nO1xuXHRwYXRoOiBzdHJpbmc7XG4gfTtcblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBvYmplY3QgdG8gdXNlIGR1cmluZyBldmVudCBleGVjdXRpb25zLlxuICovXG5leHBvcnQgZW51bSBFdmVudEV4ZWN1dGlvblR5cGVcbntcblx0SG90Um91dGUsXG5cdEhvdE1ldGhvZCxcblx0SG90QVBJXG59XG5cbi8qKlxuICogVGhlIEFQSSB0byB1c2UuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBIb3RBUElcbntcblx0LyoqXG5cdCAqIFRoZSBzZXJ2ZXIgY29ubmVjdGlvbi5cblx0ICovXG5cdGNvbm5lY3Rpb246IEhvdFNlcnZlciB8IEhvdENsaWVudDtcblx0LyoqXG5cdCAqIFRoZSBiYXNlIHVybCBmb3IgdGhlIHNlcnZlci5cblx0ICovXG5cdGJhc2VVcmw6IHN0cmluZztcblx0LyoqXG5cdCAqIElmIHNldCwgdGhpcyB3aWxsIGNyZWF0ZSB0aGUgcm91dGUgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZm9yIFxuXHQgKiBlYXN5IGNsaWVudC9zZXJ2ZXIgY2FsbGluZy5cblx0ICovXG5cdGNyZWF0ZUZ1bmN0aW9uczogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFRoZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuXHQgKi9cblx0ZXhlY3V0ZUV2ZW50c1VzaW5nOiBFdmVudEV4ZWN1dGlvblR5cGU7XG5cdC8qKlxuXHQgKiBUaGUgZGF0YWJhc2UgY29ubmVjdGlvbi5cblx0ICovXG5cdGRiOiBIb3REQjtcblx0LyoqXG5cdCAqIFRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzIHRvIHVzZSB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbi5cblx0ICovXG5cdGF1dGhDcmVkZW50aWFsczogYW55O1xuXHQvKipcblx0ICogVGhlIGZ1bmN0aW9uIHVzZWQgZm9yIHVzZXIgYXV0aGVudGljYXRpb24uXG5cdCAqL1xuXHR1c2VyQXV0aDogU2VydmVyQXV0aG9yaXphdGlvbkZ1bmN0aW9uO1xuXHQvKipcblx0ICogVGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRyb3V0ZXM6IHsgW25hbWU6IHN0cmluZ106IEhvdFJvdXRlIH07XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHRoZSBBUEkgaXMgYWJvdXQgdG8gc3RhcnQgcmVnaXN0ZXJpbmcgcm91dGVzLiBJZiBcblx0ICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgc2VydmVyIHdpbGwgbm90IHN0YXJ0LlxuXHQgKi9cblx0b25QcmVSZWdpc3RlcjogKCkgPT4gUHJvbWlzZTxib29sZWFuPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gdGhlIEFQSSBoYXMgZmluaXNoZWQgcmVnaXN0ZXJpbmcgcm91dGVzLiBJZiBcblx0ICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgc2VydmVyIHdpbGwgbm90IHN0YXJ0LlxuXHQgKi9cblx0b25Qb3N0UmVnaXN0ZXI6ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG5cblx0Y29uc3RydWN0b3IgKGJhc2VVcmw6IHN0cmluZywgY29ubmVjdGlvbjogSG90U2VydmVyIHwgSG90Q2xpZW50ID0gbnVsbCwgZGI6IEhvdERCID0gbnVsbClcblx0e1xuXHRcdHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG5cdFx0dGhpcy5iYXNlVXJsID0gYmFzZVVybDtcblx0XHR0aGlzLmNyZWF0ZUZ1bmN0aW9ucyA9IHRydWU7XG5cdFx0dGhpcy5leGVjdXRlRXZlbnRzVXNpbmcgPSBFdmVudEV4ZWN1dGlvblR5cGUuSG90Um91dGU7XG5cdFx0dGhpcy5kYiA9IGRiO1xuXHRcdHRoaXMuYXV0aENyZWRlbnRpYWxzID0gbnVsbDtcblx0XHR0aGlzLnVzZXJBdXRoID0gbnVsbDtcblx0XHR0aGlzLnJvdXRlcyA9IHt9O1xuXHRcdHRoaXMub25QcmVSZWdpc3RlciA9IG51bGw7XG5cdFx0dGhpcy5vblBvc3RSZWdpc3RlciA9IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IHRoZSBkYXRhYmFzZSBzY2hlbWEgZm9yIHVzZS5cblx0ICovXG5cdHNldERCU2NoZW1hIChzY2hlbWE6IEhvdERCU2NoZW1hKTogdm9pZFxuXHR7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGlvbi5hcGkgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYE5vIEFQSSBoYXMgYmVlbiBzZXQhYCk7XG5cblx0XHRpZiAodGhpcy5jb25uZWN0aW9uLmFwaS5kYiA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgTm8gZGF0YWJhc2UgaGFzIGJlZW4gc2V0IGZvciBBUEkgYmFzZSB1cmwgJHt0aGlzLmNvbm5lY3Rpb24uYXBpLmJhc2VVcmx9YCk7XG5cblx0XHR0aGlzLmNvbm5lY3Rpb24uYXBpLmRiLnNjaGVtYSA9IHNjaGVtYTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGRhdGFiYXNlIGJlaW5nIHVzZWQuXG5cdCAqL1xuXHRnZXREQiAoKTogSG90REJcblx0e1xuXHRcdGlmICh0aGlzLmNvbm5lY3Rpb24uYXBpLmRiID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBObyBkYXRhYmFzZSBoYXMgYmVlbiBzZXQgZm9yIEFQSSBiYXNlIHVybCAke3RoaXMuY29ubmVjdGlvbi5hcGkuYmFzZVVybH1gKTtcblxuXHRcdHJldHVybiAodGhpcy5jb25uZWN0aW9uLmFwaS5kYik7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBkYXRhYmFzZSBzY2hlbWEgYmVpbmcgdXNlZC5cblx0ICovXG5cdGdldERCU2NoZW1hICgpOiBIb3REQlNjaGVtYVxuXHR7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGlvbi5hcGkuZGIgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYE5vIGRhdGFiYXNlIGhhcyBiZWVuIHNldCBmb3IgQVBJIGJhc2UgdXJsICR7dGhpcy5jb25uZWN0aW9uLmFwaS5iYXNlVXJsfWApO1xuXG5cdFx0cmV0dXJuICh0aGlzLmNvbm5lY3Rpb24uYXBpLmRiLnNjaGVtYSk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIGEgcm91dGUuIElmIHRoaXMuY3JlYXRlRnVuY3Rpb25zIGlzIHNldCB0byB0cnVlLCB0aGlzIHdpbGwgdGFrZSB0aGUgaW5jb21pbmcgXG5cdCAqIHJvdXRlIGFuZCBjcmVhdGUgYW4gb2JqZWN0IGluIHRoaXMgSG90QVBJIG9iamVjdCB1c2luZyB0aGUgbmFtZSBvZiB0aGUgcm91dGUuIElmIHRoZXJlJ3MgXG5cdCAqIGFueSBIb3RSb3V0ZU1ldGhvZHMgaW5zaWRlIG9mIHRoZSBpbmNvbWluZyBIb3RSb3V0ZSwgaXQgd2lsbCBjcmVhdGUgdGhlIG1ldGhvZHMgXG5cdCAqIGFuZCBhdHRhY2ggdGhlbSB0byB0aGUgbmV3bHkgY3JlYXRlZCBIb3RSb3V0ZSBvYmplY3QuXG5cdCAqIFxuXHQgKiBFeGFtcGxlOlxuXHQgKiBgYGBcblx0ICogZXhwb3J0IGNsYXNzIFVzZXJzIGV4dGVuZHMgSG90Um91dGVcblx0ICoge1xuXHQgKiBcdFx0Y29uc3RydWN0b3IgKGFwaTogRnJlZUxpZ2h0QVBJKVxuXHQgKiBcdFx0e1xuXHQgKiBcdFx0XHRzdXBlciAoYXBpLmNvbm5lY3Rpb24sIFwidXNlclwiKTtcblx0ICogXG5cdCAqIFx0XHRcdHRoaXMuYWRkTWV0aG9kIChcImNyZWF0ZVwiLCB0aGlzLl9jcmVhdGUsIEhUVFBNZXRob2QuUE9TVCk7XG5cdCAqIFx0XHR9XG5cdCAqIFxuXHQgKiBcdFx0cHJvdGVjdGVkIGFzeW5jIF9jcmVhdGUgKHJlcTogYW55LCByZXM6IGFueSwgYXV0aG9yaXplZFZhbHVlOiBhbnksIGpzb25PYmo6IGFueSwgcXVlcnlPYmo6IGFueSk6IFByb21pc2U8YW55PlxuXHQgKiBcdFx0e1xuXHQgKiBcdFx0XHRyZXR1cm4gKHRydWUpO1xuXHQgKiBcdFx0fVxuXHQgKiB9XG5cdCAqIGBgYFxuXHQgKiBcblx0ICogVGhpcyBpbiB0dXJuIGNvdWxkIGJlIHVzZWQgbGlrZSBzbzpcblx0ICogYGBgXG5cdCAqIEhvdC5BUEkudXNlci5jcmVhdGUgKHt9KTtcblx0ICogYGBgXG5cdCAqIFxuXHQgKiBBZGRpdGlvbmFsbHkgaXQgd291bGQgY3JlYXRlIHRoZSBlbmRwb2ludDogYGBgaHR0cDovLzEyNy4wLjAuMTo4MDgwL3YxL3VzZXIvY3JlYXRlYGBgXG5cdCAqIFxuXHQgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRvIGFkZC4gQ2FuIGJlIGVpdGhlciBhIGZ1bGwgSG90Um91dGUgb2JqZWN0LCBvciBqdXN0IFxuXHQgKiB0aGUgcm91dGUncyBuYW1lLiBJZiBhIEhvdFJvdXRlIG9iamVjdCBpcyBzdXBwbGllZCwgdGhlIHJlc3Qgb2YgdGhlIHBhcmFtZXRlcnMgXG5cdCAqIHdpbGwgYmUgaWdub3JlZC5cblx0ICogQHBhcmFtIHJvdXRlTWV0aG9kIFRoZSByb3V0ZSdzIG1ldGhvZCB0byBhZGQuIElmIHRoZSByb3V0ZSBwYXJhbWV0ZXIgaXMgYSBzdHJpbmcsIFxuXHQgKiBpdCB3aWxsIGJlIGludGVycHJldGVkIGFzIHRoZSByb3V0ZSdzIG5hbWUsIGFuZCB0aGlzIHdpbGwgYmUgdGhlIG1ldGhvZCBhZGRlZCB0byBcblx0ICogdGhlIG5ldyByb3V0ZS5cblx0ICogQHBhcmFtIGV4ZWN1dGVGdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHJvdXRlTWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgQVBJLlxuXHQgKi9cblx0YWRkUm91dGUgKFxuXHRcdHJvdXRlOiBIb3RSb3V0ZSB8IHN0cmluZyxcblx0XHRyb3V0ZU1ldGhvZDogSG90Um91dGVNZXRob2QgfCBzdHJpbmcgPSBudWxsLFxuXHRcdGV4ZWN1dGVGdW5jdGlvbjogKHJlcTogYW55LCByZXM6IGFueSwgYXV0aG9yaXplZFZhbHVlOiBhbnksIGpzb25PYmo6IGFueSwgcXVlcnlPYmo6IGFueSkgPT4gUHJvbWlzZTxhbnk+ID0gbnVsbFxuXHRcdCk6IHZvaWRcblx0e1xuXHRcdGxldCByb3V0ZU5hbWU6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAocm91dGUgaW5zdGFuY2VvZiBIb3RSb3V0ZSlcblx0XHR7XG5cdFx0XHRyb3V0ZU5hbWUgPSByb3V0ZS5yb3V0ZTtcblx0XHRcdHRoaXMucm91dGVzW3JvdXRlLnJvdXRlXSA9IHJvdXRlO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0cm91dGVOYW1lID0gcm91dGU7XG5cblx0XHRcdGlmICh0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdID09IG51bGwpXG5cdFx0XHRcdHRoaXMucm91dGVzW3JvdXRlTmFtZV0gPSBuZXcgSG90Um91dGUgKHRoaXMuY29ubmVjdGlvbiwgcm91dGVOYW1lKTtcblxuXHRcdFx0aWYgKHJvdXRlTWV0aG9kIGluc3RhbmNlb2YgSG90Um91dGVNZXRob2QpXG5cdFx0XHRcdHRoaXMucm91dGVzW3JvdXRlTmFtZV0uYWRkTWV0aG9kIChyb3V0ZU1ldGhvZCk7XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMucm91dGVzW3JvdXRlTmFtZV0uYWRkTWV0aG9kIChuZXcgSG90Um91dGVNZXRob2QgKFxuXHRcdFx0XHRcdHRoaXMucm91dGVzW3JvdXRlTmFtZV0sIHJvdXRlTWV0aG9kLCBleGVjdXRlRnVuY3Rpb24pKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdLmNvbm5lY3Rpb24gPSB0aGlzLmNvbm5lY3Rpb247XG5cblx0XHQvLyBDcmVhdGUgdGhlIHJvdXRlIGZ1bmN0aW9ucyBmb3IgdGhlIHNlcnZlci9jbGllbnQuXG5cdFx0aWYgKHRoaXMuY3JlYXRlRnVuY3Rpb25zID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdGxldCBuZXdSb3V0ZTogeyBbbmFtZTogc3RyaW5nXTogRnVuY3Rpb24gfSA9IHRoaXNbcm91dGVOYW1lXTtcblxuXHRcdFx0aWYgKG5ld1JvdXRlID09IG51bGwpXG5cdFx0XHRcdG5ld1JvdXRlID0ge307XG5cblx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgdGhpcy5yb3V0ZXNbcm91dGVOYW1lXS5tZXRob2RzLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgY3VycmVudFJvdXRlOiBIb3RSb3V0ZSA9IHRoaXMucm91dGVzW3JvdXRlTmFtZV07XG5cdFx0XHRcdGxldCBuZXdSb3V0ZU1ldGhvZDogSG90Um91dGVNZXRob2QgPSB0aGlzLnJvdXRlc1tyb3V0ZU5hbWVdLm1ldGhvZHNbaUlkeF07XG5cblx0XHRcdFx0Lypcblx0XHRcdFx0Ly8vIEBmaXhtZSBJcyB0aGlzIHJlYWxseSBuZWNlc3Nhcnk/IEEgSFRUUCBjYWxsIGlzIG11Y2ggbW9yZSBwcmVmZXJhYmxlLCBcblx0XHRcdFx0Ly8vIGVzcGVjaWFsbHkgZm9yIGFjY3J1YXRlIHRlc3RpbmcuXG5cdFx0XHRcdGlmICh0aGlzLmNvbm5lY3Rpb24gaW5zdGFuY2VvZiBIb3RTZXJ2ZXIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpZiAobmV3Um91dGVNZXRob2Qub25TZXJ2ZXJFeGVjdXRlICE9IG51bGwpXG5cdFx0XHRcdFx0XHRuZXdSb3V0ZVtuZXdSb3V0ZU1ldGhvZC5uYW1lXSA9IG5ld1JvdXRlTWV0aG9kLm9uU2VydmVyRXhlY3V0ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlKi9cblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8qXG5cdFx0XHRcdFx0Ly8vIEBmaXhtZSBJcyBvbkNsaWVudEV4ZWN1dGUgbmVjZXNzYXJ5PyBJJ20gdGhpbmtpbmcgdGhlIGRldiBjYW4ganVzdCBzaW1wbHkgY3JlYXRlIFxuXHRcdFx0XHRcdC8vLyB0aGVpciBvd24gZnVuY3Rpb24gdG8gY2FsbC5cblx0XHRcdFx0XHRpZiAobmV3Um91dGVNZXRob2Qub25DbGllbnRFeGVjdXRlICE9IG51bGwpXG5cdFx0XHRcdFx0XHRuZXdSb3V0ZVtuZXdSb3V0ZU1ldGhvZC5uYW1lXSA9IG5ld1JvdXRlTWV0aG9kLm9uQ2xpZW50RXhlY3V0ZTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0eyovXG5cdFx0XHRcdFx0XHRuZXdSb3V0ZVtuZXdSb3V0ZU1ldGhvZC5uYW1lXSA9IChkYXRhOiBhbnkpOiBhbnkgPT5cblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxldCBodHRwTWV0aG9kOiBzdHJpbmcgPSBuZXdSb3V0ZU1ldGhvZC50eXBlO1xuXHRcdFx0XHRcdFx0XHRcdC8vIENvbnN0cnVjdCB0aGUgdXJsIGhlcmUuIEJhc2UgKyByb3V0ZSArIHJvdXRlIG1ldGhvZFxuXHRcdFx0XHRcdFx0XHRcdGxldCByb3V0ZVN0cjogc3RyaW5nID0gXCJcIjtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChjdXJyZW50Um91dGUudmVyc2lvbiAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0XHRcdHJvdXRlU3RyICs9IGAvJHtjdXJyZW50Um91dGUudmVyc2lvbn1gO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGN1cnJlbnRSb3V0ZS5yb3V0ZSAhPT0gXCJcIilcblx0XHRcdFx0XHRcdFx0XHRcdHJvdXRlU3RyICs9IGAvJHtjdXJyZW50Um91dGUucm91dGV9YDtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChuZXdSb3V0ZU1ldGhvZC5uYW1lICE9PSBcIlwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0cm91dGVTdHIgKz0gYC8ke25ld1JvdXRlTWV0aG9kLm5hbWV9YDtcblxuXHRcdFx0XHRcdFx0XHRcdGxldCBhdXRoQ3JlZGVudGlhbHM6IGFueSA9IG51bGw7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBHZXR0aW5nIHRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzIGZyb20gdGhlIEFQSSBpcyB0aGUgbG93ZXN0IFxuXHRcdFx0XHRcdFx0XHRcdC8vIHByaW9yaXR5IGZvciBnZXR0aW5nIGNyZWRlbnRpYWxzLiBUaGUgcHJpb3JpdGllcyBhcmUgaW4gdGhpcyBvcmRlcjogXG5cdFx0XHRcdFx0XHRcdFx0Ly8gMS4gSG90Um91dGVNZXRob2Rcblx0XHRcdFx0XHRcdFx0XHQvLyAyLiBIb3RSb3V0ZVxuXHRcdFx0XHRcdFx0XHRcdC8vIDMuIEhvdEFQSVxuXHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLmF1dGhDcmVkZW50aWFscyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0YXV0aENyZWRlbnRpYWxzID0gdGhpcy5hdXRoQ3JlZGVudGlhbHM7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGaW5kIHRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzLiBQcmlvcml0aXplIHRoZW0gd2hlbiB0aGV5J3JlIFxuXHRcdFx0XHRcdFx0XHRcdC8vIGluIHRoZSBtZXRob2QuIE9ubHkgYWRkIHRoZSBvbmVzIGZyb20gdGhlIHJvdXRlIGlmIHRoZSBvbmVzIGZyb20gXG5cdFx0XHRcdFx0XHRcdFx0Ly8gdGhlIG1ldGhvZCBhcmUgbWlzc2luZy5cblx0XHRcdFx0XHRcdFx0XHRpZiAobmV3Um91dGVNZXRob2QuYXV0aENyZWRlbnRpYWxzICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0XHRhdXRoQ3JlZGVudGlhbHMgPSBuZXdSb3V0ZU1ldGhvZC5hdXRoQ3JlZGVudGlhbHM7XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChuZXdSb3V0ZU1ldGhvZC5wYXJlbnRSb3V0ZS5hdXRoQ3JlZGVudGlhbHMgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0YXV0aENyZWRlbnRpYWxzID0gbmV3Um91dGVNZXRob2QucGFyZW50Um91dGUuYXV0aENyZWRlbnRpYWxzO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdGlmIChhdXRoQ3JlZGVudGlhbHMgPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIChIb3QpICE9PSBcInVuZGVmaW5lZFwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChIb3QgIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoSG90LkFQSSAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChIb3QuQVBJW2N1cnJlbnRSb3V0ZS5yb3V0ZV0gIT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoSG90LkFQSVtjdXJyZW50Um91dGUucm91dGVdLmF1dGhDcmVkZW50aWFscyAhPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGF1dGhDcmVkZW50aWFscyA9IEhvdC5BUElbY3VycmVudFJvdXRlLnJvdXRlXS5hdXRoQ3JlZGVudGlhbHM7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoYXV0aENyZWRlbnRpYWxzICE9IG51bGwpXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQWRkIHRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzIHRvIHRoZSBkYXRhIGJlaW5nIHNlbnQuXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gYXV0aENyZWRlbnRpYWxzKVxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgYXV0aENyZWRlbnRpYWw6IGFueSA9IGF1dGhDcmVkZW50aWFsc1trZXldO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIERvIG5vdCBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIGtleXMgaW4gdGhlIGRhdGEgYWJvdXQgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHRvIGJlIHNlbnQuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChkYXRhW2tleV0gPT0gbnVsbClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhW2tleV0gPSBhdXRoQ3JlZGVudGlhbDtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRsZXQgYXJnczogYW55W10gPSBbcm91dGVTdHIsIGRhdGEsIGh0dHBNZXRob2RdO1xuXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuICh0aGlzLm1ha2VDYWxsLmFwcGx5ICh0aGlzLCBhcmdzKSk7XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Ly99XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0dGhpc1tyb3V0ZU5hbWVdID0gbmV3Um91dGU7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVyIGEgcm91dGUgd2l0aCB0aGUgc2VydmVyLlxuXHQgKi9cblx0YXN5bmMgcmVnaXN0ZXJSb3V0ZSAocm91dGU6IEhvdFJvdXRlKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGlvbiBpbnN0YW5jZW9mIEhvdFNlcnZlcilcblx0XHRcdGF3YWl0IHRoaXMuY29ubmVjdGlvbi5yZWdpc3RlclJvdXRlIChyb3V0ZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVnaXN0ZXIgYWxsIHJvdXRlcyB3aXRoIHRoZSBzZXJ2ZXIuXG5cdCAqL1xuXHRhc3luYyByZWdpc3RlclJvdXRlcyAoKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0Zm9yIChsZXQga2V5IGluIHRoaXMucm91dGVzKVxuXHRcdHtcblx0XHRcdGxldCByb3V0ZTogSG90Um91dGUgPSB0aGlzLnJvdXRlc1trZXldO1xuXG5cdFx0XHRhd2FpdCB0aGlzLnJlZ2lzdGVyUm91dGUgKHJvdXRlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWFrZSBhIGNhbGwgdG8gdGhlIEFQSS5cblx0ICovXG5cdGFzeW5jIG1ha2VDYWxsIChyb3V0ZTogc3RyaW5nLCBkYXRhOiBhbnksIGh0dHBNZXRob2Q6IHN0cmluZyA9IFwiUE9TVFwiKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmJhc2VVcmw7XG5cblx0XHRpZiAodXJsWyh1cmwubGVuZ3RoIC0gMSldID09PSBcIi9cIilcblx0XHRcdHVybCA9IHVybC5zdWJzdHIgKDAsICh1cmwubGVuZ3RoIC0gMSkpO1xuXG5cdFx0aWYgKHJvdXRlWzBdICE9PSBcIi9cIilcblx0XHRcdHVybCArPSBcIi9cIjtcblxuXHRcdHVybCArPSByb3V0ZTtcblxuXHRcdGh0dHBNZXRob2QgPSBodHRwTWV0aG9kLnRvVXBwZXJDYXNlICgpO1xuXG5cdFx0bGV0IGZldGNoT2JqOiBhbnkgPSB7XG5cdFx0XHRcdG1ldGhvZDogaHR0cE1ldGhvZCxcblx0XHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHRcdFx0XCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG5cdFx0XHRcdFx0XHRcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuXHRcdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRpZiAoKGh0dHBNZXRob2QgIT09IFwiR0VUXCIpICYmIFxuXHRcdFx0KGh0dHBNZXRob2QgIT09IFwiSEVBRFwiKSlcblx0XHR7XG5cdFx0XHRmZXRjaE9ialtcImJvZHlcIl0gPSBKU09OLnN0cmluZ2lmeSAoZGF0YSk7XG5cdFx0fVxuXG5cdFx0bGV0IHJlczogYW55ID0gbnVsbDtcblx0XHRcblx0XHR0cnlcblx0XHR7XG5cdFx0XHRyZXMgPSBhd2FpdCBmZXRjaCAodXJsLCBmZXRjaE9iaik7XG5cdFx0fVxuXHRcdGNhdGNoIChleClcblx0XHR7XG5cdFx0XHR0aHJvdyBleDtcblx0XHR9XG5cblx0XHRsZXQganNvbk9iajogYW55ID0gYXdhaXQgcmVzLmpzb24gKCk7XG5cblx0XHRyZXR1cm4gKGpzb25PYmopO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBIb3RUZXN0RWxlbWVudCB9IGZyb20gXCIuL0hvdFRlc3RFbGVtZW50XCI7XG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuaW1wb3J0IHsgSG90U2l0ZU1hcFBhdGggfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5cbi8qKlxuICogQ3JlYXRlIGEgdGVzdCBwYXRoIGZvciBsYXRlciBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIEhvdFRlc3RQYXRoID0gKGRyaXZlcjogSG90VGVzdERyaXZlciwgLi4uYXJnczogYW55KSA9PiBQcm9taXNlPGFueT47XG5cbi8qKlxuICogVGhlIGRlc3RpbmF0aW9uIHRvIHRha2UgaW4gYSBtYXAuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RUZXN0RGVzdGluYXRpb25cbntcblx0LyoqXG5cdCAqIFRoZSBkZXN0aW5hdGlvbiB0byB0YWtlLlxuXHQgKi9cblx0ZGVzdGluYXRpb246IHN0cmluZztcblx0LyoqXG5cdCAqIElmIHNldCB0byB0cnVlLCB0aGlzIHdpbGwgYXV0b21hdGljYWxseSBzdGFydCBleGVjdXRpbmcgaXQncyBcblx0ICogdGVzdHMgd2hlbiBpdCdzIHRpbWUuXG5cdCAqL1xuXHRhdXRvU3RhcnQ6IGJvb2xlYW47XG5cblx0Y29uc3RydWN0b3IgKGRlc3RpbmF0aW9uOiBzdHJpbmcgfCBIb3RUZXN0RGVzdGluYXRpb24gfCBIb3RTaXRlTWFwUGF0aCA9IFwiXCIsIGF1dG9TdGFydDogYm9vbGVhbiA9IHRydWUpXG5cdHtcblx0XHRpZiAodHlwZW9mIChkZXN0aW5hdGlvbikgPT09IFwic3RyaW5nXCIpXG5cdFx0e1xuXHRcdFx0dGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uO1xuXHRcdFx0dGhpcy5hdXRvU3RhcnQgPSBhdXRvU3RhcnQ7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBIb3RUZXN0RGVzdGluYXRpb24pXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbi5kZXN0aW5hdGlvbjtcblx0XHRcdFx0dGhpcy5hdXRvU3RhcnQgPSBkZXN0aW5hdGlvbi5hdXRvU3RhcnQ7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbi5wYXRoO1xuXHRcdFx0XHR0aGlzLmF1dG9TdGFydCA9IGRlc3RpbmF0aW9uLmF1dG9TdGFydDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBBIHBhZ2UgY29udGFpbmluZyBvbmx5IHRlc3QgcmVsYXRlZCBpbmZvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvdFRlc3RQYWdlXG57XG5cdC8qKlxuXHQgKiBUaGUgZWxlbWVudHMgdG8gdGVzdCBvbiB0aGlzIG1hcC5cblx0ICovXG5cdHRlc3RFbGVtZW50czogeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdEVsZW1lbnQ7IH07XG5cdC8qKlxuXHQgKiBUaGUgdGVzdCBwYXRocyB0byB0ZXN0IG9uIHRoaXMgbWFwLlxuXHQgKi9cblx0dGVzdFBhdGhzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0UGF0aDsgfTtcbn1cblxuLyoqXG4gKiBNYXBzIHRoZSBwYXRocyB0aGF0IGFyZSB0YWtlbiB0byBjb21wbGV0ZSBhIHRlc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3RUZXN0TWFwXG57XG5cdC8qKlxuXHQgKiBUaGUgb3JkZXIgaW4gd2hpY2ggcGF0aHMgYXJlIHRvIGJlIHRha2VuLiBFYWNoIGRlc3RpbmF0aW9uIGlzIGEgc3RyaW5nIFxuXHQgKiBpbiBhIHR5cGUgLT4gcGF0aCBvcmRlci4gVGhlIHR5cGUgY291bGQgYmUgZWl0aGVyIGEgcGFnZSBvciBhcGkgcm91dGUuIFxuXHQgKiBGb3IgZXhhbXBsZTpcblx0ICogYGBgXG5cdCAqIFtcblx0ICogICAgICBcInBhZ2U6c2lnbmluX3BhZ2UgLT4gc2lnbmluX3BhdGhcIixcblx0ICogICAgICBcInBhZ2U6YWNjb3VudF9wYWdlIC0+IGNoYW5nZV91c2VybmFtZV9wYXRoXCIsXG5cdCAqICAgICAgXCJwYWdlOmFjY291bnRfcGFnZSAtPiBjaGFuZ2VfcGFzc3dvcmRfcGF0aFwiLFxuXHQgKiAgICAgIFwicGFnZTphY2NvdW50X3BhZ2UgLT4gY2hhbmdlX25hbWVfcGF0aCAtPiBjaGFuZ2VfYWRkcmVzc19wYXRoXCIsXG5cdCAqIFx0XHRcInBhZ2U6YWNjb3VudF9wYWdlIC0+IHNpZ25vdXRfcGF0aFwiLFxuXHQgKiBcdFx0XCJhcGk6YWNjb3VudF9hcGlfcm91dGUgLT4gc2lnbm91dF9yb3V0ZV9tZXRob2QgLT4gc2lnbm91dF90ZXN0X3BhdGhcIlxuXHQgKiBdXG5cdCAqIGBgYFxuXHQgKiBcblx0ICogVGhlIGZpcnN0IHN0cmluZyB0byB0aGUgbGVmdCBvZiB0aGUgLT4gd2lsbCBhbHdheXMgYmUgdGhlIHR5cGUsIHN1Y2ggYXMgYSBcblx0ICogcGFnZSBvciBhbiBhcGkgcm91dGUuIEFueSBzdHJpbmdzIHRvIHRoZSByaWdodCBvZiB0aGUgLT4gd2lsbCBiZSBhIHBhdGgsIGV2ZW4gXG5cdCAqIHdoZW4gY2hhaW5pbmcgYWRkdGlvbmFsIC0+J3MuXG5cdCAqL1xuXHRkZXN0aW5hdGlvbnM6IEhvdFRlc3REZXN0aW5hdGlvbltdIHwgeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdERlc3RpbmF0aW9uOyB9O1xuXHQvKipcblx0ICogVGhlIG9yZGVyIGluIHdoaWNoIGRlc3RpbmF0aW9ucyBhcmUgc3VwcG9zZWQgdG8gZXhlY3V0ZS4gVGhpcyBpcyBcblx0ICogaWdub3JlZCBpZiB0aGUgZGVzdGluYXRpb25zIGFyZSBhbiBhcnJheS5cblx0ICovXG5cdGRlc3RpbmF0aW9uT3JkZXI6IHN0cmluZ1tdO1xuXHQvKipcblx0ICogVGhlIHRlc3QgcGFnZXMgdG8gZXhlY3V0ZS5cblx0ICovXG5cdHBhZ2VzOiB7XG5cdFx0XHRbbmFtZTogc3RyaW5nXTogSG90VGVzdFBhZ2Vcblx0XHR9O1xuXG5cdGNvbnN0cnVjdG9yIChkZXN0aW5hdGlvbnM6IHN0cmluZ1tdIHwgSG90VGVzdERlc3RpbmF0aW9uW10gfCB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCBIb3RUZXN0RGVzdGluYXRpb247IH0gPSBbXSwgXG5cdFx0cGFnZXM6IHsgW25hbWU6IHN0cmluZ106IEhvdFRlc3RQYWdlIH0gPSB7fSwgZGVzdGluYXRpb25PcmRlcjogc3RyaW5nW10gPSBbXSlcblx0e1xuXHRcdC8vIEdvIHRocm91Z2ggYW5kIGNvbnZlcnQgYW55IHN0cmluZ3MgaW50byBIb3RUZXN0RGVzdGluYXRpb25zLlxuXHRcdGlmIChkZXN0aW5hdGlvbnMgaW5zdGFuY2VvZiBBcnJheSlcblx0XHR7XG5cdFx0XHR0aGlzLmRlc3RpbmF0aW9ucyA9IFtdO1xuXG5cdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGRlc3RpbmF0aW9ucy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGRlc3QgPSBkZXN0aW5hdGlvbnNbaUlkeF07XG5cblx0XHRcdFx0dGhpcy5kZXN0aW5hdGlvbnMucHVzaCAobmV3IEhvdFRlc3REZXN0aW5hdGlvbiAoZGVzdCkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy5kZXN0aW5hdGlvbnMgPSB7fTtcblxuXHRcdFx0Zm9yIChsZXQga2V5IGluIGRlc3RpbmF0aW9ucylcblx0XHRcdHtcblx0XHRcdFx0bGV0IGRlc3QgPSBkZXN0aW5hdGlvbnNba2V5XTtcblxuXHRcdFx0XHR0aGlzLmRlc3RpbmF0aW9uc1trZXldID0gbmV3IEhvdFRlc3REZXN0aW5hdGlvbiAoZGVzdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5kZXN0aW5hdGlvbk9yZGVyID0gZGVzdGluYXRpb25PcmRlcjtcblx0XHR0aGlzLnBhZ2VzID0gcGFnZXM7XG5cdH1cbn0iLCJpbXBvcnQgeyBIb3RTdGFxLCBIb3RTdGFydE9wdGlvbnMsIElIb3RTdGFxLCBcblx0SG90U2l0ZSwgSG90U2l0ZVJvdXRlLCBIb3RTaXRlTWFwUGF0aCB9IGZyb20gXCIuL0hvdFN0YXFcIjtcbmltcG9ydCB7IEhvdCwgRGV2ZWxvcGVyTW9kZSB9IGZyb20gXCIuL0hvdFwiO1xuaW1wb3J0IHsgSG90Q29tcG9uZW50LCBJSG90Q29tcG9uZW50IH0gZnJvbSBcIi4vSG90Q29tcG9uZW50XCI7XG5pbXBvcnQgeyBIb3RGaWxlIH0gZnJvbSBcIi4vSG90RmlsZVwiO1xuaW1wb3J0IHsgSG90TG9nLCBIb3RMb2dMZXZlbCB9IGZyb20gXCIuL0hvdExvZ1wiO1xuaW1wb3J0IHsgSG90UGFnZSB9IGZyb20gXCIuL0hvdFBhZ2VcIjtcblxuLy8gU2VydmVyIHN0dWZmXG5pbXBvcnQgeyBIb3RBUEksIEV2ZW50RXhlY3V0aW9uVHlwZSwgQVBJdG9Mb2FkIH0gZnJvbSBcIi4vSG90QVBJXCI7XG5pbXBvcnQgeyBIb3RSb3V0ZSB9IGZyb20gXCIuL0hvdFJvdXRlXCI7XG5pbXBvcnQgeyBIb3RSb3V0ZU1ldGhvZCwgSFRUUE1ldGhvZCwgU2VydmVyQXV0aG9yaXphdGlvbkZ1bmN0aW9uLCBTZXJ2ZXJFeGVjdXRpb25GdW5jdGlvbiB9IGZyb20gXCIuL0hvdFJvdXRlTWV0aG9kXCI7XG5pbXBvcnQgeyBIb3RTZXJ2ZXIgfSBmcm9tIFwiLi9Ib3RTZXJ2ZXJcIjtcbmltcG9ydCB7IEhvdENsaWVudCB9IGZyb20gXCIuL0hvdENsaWVudFwiO1xuXG4vLyBUZXN0aW5nIHN0dWZmXG5pbXBvcnQgeyBIb3RUZXN0RHJpdmVyIH0gZnJvbSBcIi4vSG90VGVzdERyaXZlclwiO1xuaW1wb3J0IHsgSUhvdFRlc3RFbGVtZW50LCBIb3RUZXN0RWxlbWVudCwgSG90VGVzdEVsZW1lbnRPcHRpb25zLCBJSG90VGVzdEVsZW1lbnRPcHRpb25zIH0gZnJvbSBcIi4vSG90VGVzdEVsZW1lbnRcIjtcbmltcG9ydCB7IEhvdFRlc3RlciwgSG90VGVzdFN0b3AsIEhvdERlc3RpbmF0aW9uIH0gZnJvbSBcIi4vSG90VGVzdGVyXCI7XG5pbXBvcnQgeyBIb3RUZXN0ZXJBUEkgfSBmcm9tIFwiLi9Ib3RUZXN0ZXJBUElcIjtcbmltcG9ydCB7IEhvdFRlc3RNYXAsIEhvdFRlc3REZXN0aW5hdGlvbiwgSG90VGVzdFBhdGgsIEhvdFRlc3RQYWdlIH0gZnJvbSBcIi4vSG90VGVzdE1hcFwiO1xuXG5Ib3RTdGFxLmlzV2ViID0gdHJ1ZTtcblxuLy8gQ2FuJ3QgZXhwb3J0IGludGVyZmFjZXMgZnJvbSBoZXJlIDooXG5cbm1vZHVsZS5leHBvcnRzW1wiSG90U3RhcVwiXSA9IEhvdFN0YXE7XG5tb2R1bGUuZXhwb3J0c1tcIkhvdFwiXSA9IEhvdDtcbm1vZHVsZS5leHBvcnRzW1wiRGV2ZWxvcGVyTW9kZVwiXSA9IERldmVsb3Blck1vZGU7XG5tb2R1bGUuZXhwb3J0c1tcIkhvdENvbXBvbmVudFwiXSA9IEhvdENvbXBvbmVudDtcbm1vZHVsZS5leHBvcnRzW1wiSG90QVBJXCJdID0gSG90QVBJO1xubW9kdWxlLmV4cG9ydHNbXCJFdmVudEV4ZWN1dGlvblR5cGVcIl0gPSBFdmVudEV4ZWN1dGlvblR5cGU7XG5tb2R1bGUuZXhwb3J0c1tcIkhvdEZpbGVcIl0gPSBIb3RGaWxlO1xubW9kdWxlLmV4cG9ydHNbXCJIb3RMb2dcIl0gPSBIb3RMb2c7XG5tb2R1bGUuZXhwb3J0c1tcIkhvdExvZ0xldmVsXCJdID0gSG90TG9nTGV2ZWw7XG5tb2R1bGUuZXhwb3J0c1tcIkhvdFBhZ2VcIl0gPSBIb3RQYWdlO1xubW9kdWxlLmV4cG9ydHNbXCJIb3RSb3V0ZVwiXSA9IEhvdFJvdXRlO1xubW9kdWxlLmV4cG9ydHNbXCJIb3RSb3V0ZU1ldGhvZFwiXSA9IEhvdFJvdXRlTWV0aG9kO1xubW9kdWxlLmV4cG9ydHNbXCJIVFRQTWV0aG9kXCJdID0gSFRUUE1ldGhvZDtcbm1vZHVsZS5leHBvcnRzW1wiSG90U2VydmVyXCJdID0gSG90U2VydmVyO1xubW9kdWxlLmV4cG9ydHNbXCJIb3RDbGllbnRcIl0gPSBIb3RDbGllbnQ7XG5tb2R1bGUuZXhwb3J0c1tcIkhvdFRlc3RlclwiXSA9IEhvdFRlc3Rlcjtcbm1vZHVsZS5leHBvcnRzW1wiSG90VGVzdGVyQVBJXCJdID0gSG90VGVzdGVyQVBJO1xubW9kdWxlLmV4cG9ydHNbXCJIb3RUZXN0TWFwXCJdID0gSG90VGVzdE1hcDtcbm1vZHVsZS5leHBvcnRzW1wiSG90VGVzdERlc3RpbmF0aW9uXCJdID0gSG90VGVzdERlc3RpbmF0aW9uO1xubW9kdWxlLmV4cG9ydHNbXCJIb3RUZXN0RWxlbWVudFwiXSA9IEhvdFRlc3RFbGVtZW50O1xubW9kdWxlLmV4cG9ydHNbXCJIb3RUZXN0RWxlbWVudE9wdGlvbnNcIl0gPSBIb3RUZXN0RWxlbWVudE9wdGlvbnM7XG5tb2R1bGUuZXhwb3J0c1tcIkhvdFRlc3REcml2ZXJcIl0gPSBIb3RUZXN0RHJpdmVyOyIsIid1c2Ugc3RyaWN0J1xuXG52YXIgc2NvcGVkUGFja2FnZVBhdHRlcm4gPSBuZXcgUmVnRXhwKCdeKD86QChbXi9dKz8pWy9dKT8oW14vXSs/KSQnKVxudmFyIGJ1aWx0aW5zID0gcmVxdWlyZSgnYnVpbHRpbnMnKVxudmFyIGJsYWNrbGlzdCA9IFtcbiAgJ25vZGVfbW9kdWxlcycsXG4gICdmYXZpY29uLmljbydcbl1cblxudmFyIHZhbGlkYXRlID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICB2YXIgd2FybmluZ3MgPSBbXVxuICB2YXIgZXJyb3JzID0gW11cblxuICBpZiAobmFtZSA9PT0gbnVsbCkge1xuICAgIGVycm9ycy5wdXNoKCduYW1lIGNhbm5vdCBiZSBudWxsJylcbiAgICByZXR1cm4gZG9uZSh3YXJuaW5ncywgZXJyb3JzKVxuICB9XG5cbiAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIGVycm9ycy5wdXNoKCduYW1lIGNhbm5vdCBiZSB1bmRlZmluZWQnKVxuICAgIHJldHVybiBkb25lKHdhcm5pbmdzLCBlcnJvcnMpXG4gIH1cblxuICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgZXJyb3JzLnB1c2goJ25hbWUgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgcmV0dXJuIGRvbmUod2FybmluZ3MsIGVycm9ycylcbiAgfVxuXG4gIGlmICghbmFtZS5sZW5ndGgpIHtcbiAgICBlcnJvcnMucHVzaCgnbmFtZSBsZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybycpXG4gIH1cblxuICBpZiAobmFtZS5tYXRjaCgvXlxcLi8pKSB7XG4gICAgZXJyb3JzLnB1c2goJ25hbWUgY2Fubm90IHN0YXJ0IHdpdGggYSBwZXJpb2QnKVxuICB9XG5cbiAgaWYgKG5hbWUubWF0Y2goL15fLykpIHtcbiAgICBlcnJvcnMucHVzaCgnbmFtZSBjYW5ub3Qgc3RhcnQgd2l0aCBhbiB1bmRlcnNjb3JlJylcbiAgfVxuXG4gIGlmIChuYW1lLnRyaW0oKSAhPT0gbmFtZSkge1xuICAgIGVycm9ycy5wdXNoKCduYW1lIGNhbm5vdCBjb250YWluIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzJylcbiAgfVxuXG4gIC8vIE5vIGZ1bm55IGJ1c2luZXNzXG4gIGJsYWNrbGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChibGFja2xpc3RlZE5hbWUpIHtcbiAgICBpZiAobmFtZS50b0xvd2VyQ2FzZSgpID09PSBibGFja2xpc3RlZE5hbWUpIHtcbiAgICAgIGVycm9ycy5wdXNoKGJsYWNrbGlzdGVkTmFtZSArICcgaXMgYSBibGFja2xpc3RlZCBuYW1lJylcbiAgICB9XG4gIH0pXG5cbiAgLy8gR2VuZXJhdGUgd2FybmluZ3MgZm9yIHN0dWZmIHRoYXQgdXNlZCB0byBiZSBhbGxvd2VkXG5cbiAgLy8gY29yZSBtb2R1bGUgbmFtZXMgbGlrZSBodHRwLCBldmVudHMsIHV0aWwsIGV0Y1xuICBidWlsdGlucy5mb3JFYWNoKGZ1bmN0aW9uIChidWlsdGluKSB7XG4gICAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYnVpbHRpbikge1xuICAgICAgd2FybmluZ3MucHVzaChidWlsdGluICsgJyBpcyBhIGNvcmUgbW9kdWxlIG5hbWUnKVxuICAgIH1cbiAgfSlcblxuICAvLyByZWFsbHktbG9uZy1wYWNrYWdlLW5hbWVzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXN1Y2gtLWxlbmd0aC0tLS0tbWFueS0tLXdvd1xuICAvLyB0aGUgdGhpc2lzYXJlYWxseXJlYWxseWxvbmdwYWNrYWdlbmFtZWl0c2hvdWxkcHVibGlzaGRvd2Vub3doYXZlYWxpbWl0dG90aGVsZW5ndGhvZnBhY2thZ2VuYW1lcy1wb2NoLlxuICBpZiAobmFtZS5sZW5ndGggPiAyMTQpIHtcbiAgICB3YXJuaW5ncy5wdXNoKCduYW1lIGNhbiBubyBsb25nZXIgY29udGFpbiBtb3JlIHRoYW4gMjE0IGNoYXJhY3RlcnMnKVxuICB9XG5cbiAgLy8gbUl4ZUQgQ2FTZSBuQU1Fc1xuICBpZiAobmFtZS50b0xvd2VyQ2FzZSgpICE9PSBuYW1lKSB7XG4gICAgd2FybmluZ3MucHVzaCgnbmFtZSBjYW4gbm8gbG9uZ2VyIGNvbnRhaW4gY2FwaXRhbCBsZXR0ZXJzJylcbiAgfVxuXG4gIGlmICgvW34nISgpKl0vLnRlc3QobmFtZS5zcGxpdCgnLycpLnNsaWNlKC0xKVswXSkpIHtcbiAgICB3YXJuaW5ncy5wdXNoKCduYW1lIGNhbiBubyBsb25nZXIgY29udGFpbiBzcGVjaWFsIGNoYXJhY3RlcnMgKFwiflxcJyEoKSpcIiknKVxuICB9XG5cbiAgaWYgKGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSAhPT0gbmFtZSkge1xuICAgIC8vIE1heWJlIGl0J3MgYSBzY29wZWQgcGFja2FnZSBuYW1lLCBsaWtlIEB1c2VyL3BhY2thZ2VcbiAgICB2YXIgbmFtZU1hdGNoID0gbmFtZS5tYXRjaChzY29wZWRQYWNrYWdlUGF0dGVybilcbiAgICBpZiAobmFtZU1hdGNoKSB7XG4gICAgICB2YXIgdXNlciA9IG5hbWVNYXRjaFsxXVxuICAgICAgdmFyIHBrZyA9IG5hbWVNYXRjaFsyXVxuICAgICAgaWYgKGVuY29kZVVSSUNvbXBvbmVudCh1c2VyKSA9PT0gdXNlciAmJiBlbmNvZGVVUklDb21wb25lbnQocGtnKSA9PT0gcGtnKSB7XG4gICAgICAgIHJldHVybiBkb25lKHdhcm5pbmdzLCBlcnJvcnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZXJyb3JzLnB1c2goJ25hbWUgY2FuIG9ubHkgY29udGFpbiBVUkwtZnJpZW5kbHkgY2hhcmFjdGVycycpXG4gIH1cblxuICByZXR1cm4gZG9uZSh3YXJuaW5ncywgZXJyb3JzKVxufVxuXG52YWxpZGF0ZS5zY29wZWRQYWNrYWdlUGF0dGVybiA9IHNjb3BlZFBhY2thZ2VQYXR0ZXJuXG5cbnZhciBkb25lID0gZnVuY3Rpb24gKHdhcm5pbmdzLCBlcnJvcnMpIHtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICB2YWxpZEZvck5ld1BhY2thZ2VzOiBlcnJvcnMubGVuZ3RoID09PSAwICYmIHdhcm5pbmdzLmxlbmd0aCA9PT0gMCxcbiAgICB2YWxpZEZvck9sZFBhY2thZ2VzOiBlcnJvcnMubGVuZ3RoID09PSAwLFxuICAgIHdhcm5pbmdzOiB3YXJuaW5ncyxcbiAgICBlcnJvcnM6IGVycm9yc1xuICB9XG4gIGlmICghcmVzdWx0Lndhcm5pbmdzLmxlbmd0aCkgZGVsZXRlIHJlc3VsdC53YXJuaW5nc1xuICBpZiAoIXJlc3VsdC5lcnJvcnMubGVuZ3RoKSBkZWxldGUgcmVzdWx0LmVycm9yc1xuICByZXR1cm4gcmVzdWx0XG59XG4iLCIvKiEganMtY29va2llIHYzLjAuMSB8IE1JVCAqL1xuO1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gZ2xvYmFsIHx8IHNlbGYsIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBnbG9iYWwuQ29va2llcztcbiAgICB2YXIgZXhwb3J0cyA9IGdsb2JhbC5Db29raWVzID0gZmFjdG9yeSgpO1xuICAgIGV4cG9ydHMubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHsgZ2xvYmFsLkNvb2tpZXMgPSBjdXJyZW50OyByZXR1cm4gZXhwb3J0czsgfTtcbiAgfSgpKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICAvKiBlc2xpbnQtZGlzYWJsZSBuby12YXIgKi9cbiAgZnVuY3Rpb24gYXNzaWduICh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldFxuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tdmFyICovXG5cbiAgLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG4gIHZhciBkZWZhdWx0Q29udmVydGVyID0ge1xuICAgIHJlYWQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlWzBdID09PSAnXCInKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSwgLTEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLyglW1xcZEEtRl17Mn0pKy9naSwgZGVjb2RlVVJJQ29tcG9uZW50KVxuICAgIH0sXG4gICAgd3JpdGU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkucmVwbGFjZShcbiAgICAgICAgLyUoMlszNDZCRl18M1tBQy1GXXw0MHw1W0JERV18NjB8N1tCQ0RdKS9nLFxuICAgICAgICBkZWNvZGVVUklDb21wb25lbnRcbiAgICAgIClcbiAgICB9XG4gIH07XG4gIC8qIGVzbGludC1lbmFibGUgbm8tdmFyICovXG5cbiAgLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5cbiAgZnVuY3Rpb24gaW5pdCAoY29udmVydGVyLCBkZWZhdWx0QXR0cmlidXRlcykge1xuICAgIGZ1bmN0aW9uIHNldCAoa2V5LCB2YWx1ZSwgYXR0cmlidXRlcykge1xuICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGF0dHJpYnV0ZXMgPSBhc3NpZ24oe30sIGRlZmF1bHRBdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzKTtcblxuICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmV4cGlyZXMgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMuZXhwaXJlcyA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBhdHRyaWJ1dGVzLmV4cGlyZXMgKiA4NjRlNSk7XG4gICAgICB9XG4gICAgICBpZiAoYXR0cmlidXRlcy5leHBpcmVzKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMuZXhwaXJlcyA9IGF0dHJpYnV0ZXMuZXhwaXJlcy50b1VUQ1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSBlbmNvZGVVUklDb21wb25lbnQoa2V5KVxuICAgICAgICAucmVwbGFjZSgvJSgyWzM0NkJdfDVFfDYwfDdDKS9nLCBkZWNvZGVVUklDb21wb25lbnQpXG4gICAgICAgIC5yZXBsYWNlKC9bKCldL2csIGVzY2FwZSk7XG5cbiAgICAgIHZhciBzdHJpbmdpZmllZEF0dHJpYnV0ZXMgPSAnJztcbiAgICAgIGZvciAodmFyIGF0dHJpYnV0ZU5hbWUgaW4gYXR0cmlidXRlcykge1xuICAgICAgICBpZiAoIWF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgc3RyaW5naWZpZWRBdHRyaWJ1dGVzICs9ICc7ICcgKyBhdHRyaWJ1dGVOYW1lO1xuXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdID09PSB0cnVlKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnNpZGVycyBSRkMgNjI2NSBzZWN0aW9uIDUuMjpcbiAgICAgICAgLy8gLi4uXG4gICAgICAgIC8vIDMuICBJZiB0aGUgcmVtYWluaW5nIHVucGFyc2VkLWF0dHJpYnV0ZXMgY29udGFpbnMgYSAleDNCIChcIjtcIilcbiAgICAgICAgLy8gICAgIGNoYXJhY3RlcjpcbiAgICAgICAgLy8gQ29uc3VtZSB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdW5wYXJzZWQtYXR0cmlidXRlcyB1cCB0byxcbiAgICAgICAgLy8gbm90IGluY2x1ZGluZywgdGhlIGZpcnN0ICV4M0IgKFwiO1wiKSBjaGFyYWN0ZXIuXG4gICAgICAgIC8vIC4uLlxuICAgICAgICBzdHJpbmdpZmllZEF0dHJpYnV0ZXMgKz0gJz0nICsgYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXS5zcGxpdCgnOycpWzBdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKGRvY3VtZW50LmNvb2tpZSA9XG4gICAgICAgIGtleSArICc9JyArIGNvbnZlcnRlci53cml0ZSh2YWx1ZSwga2V5KSArIHN0cmluZ2lmaWVkQXR0cmlidXRlcylcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXQgKGtleSkge1xuICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgKGFyZ3VtZW50cy5sZW5ndGggJiYgIWtleSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIFRvIHByZXZlbnQgdGhlIGZvciBsb29wIGluIHRoZSBmaXJzdCBwbGFjZSBhc3NpZ24gYW4gZW1wdHkgYXJyYXlcbiAgICAgIC8vIGluIGNhc2UgdGhlcmUgYXJlIG5vIGNvb2tpZXMgYXQgYWxsLlxuICAgICAgdmFyIGNvb2tpZXMgPSBkb2N1bWVudC5jb29raWUgPyBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsgJykgOiBbXTtcbiAgICAgIHZhciBqYXIgPSB7fTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29va2llcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcGFydHMgPSBjb29raWVzW2ldLnNwbGl0KCc9Jyk7XG4gICAgICAgIHZhciB2YWx1ZSA9IHBhcnRzLnNsaWNlKDEpLmpvaW4oJz0nKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBmb3VuZEtleSA9IGRlY29kZVVSSUNvbXBvbmVudChwYXJ0c1swXSk7XG4gICAgICAgICAgamFyW2ZvdW5kS2V5XSA9IGNvbnZlcnRlci5yZWFkKHZhbHVlLCBmb3VuZEtleSk7XG5cbiAgICAgICAgICBpZiAoa2V5ID09PSBmb3VuZEtleSkge1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBrZXkgPyBqYXJba2V5XSA6IGphclxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuY3JlYXRlKFxuICAgICAge1xuICAgICAgICBzZXQ6IHNldCxcbiAgICAgICAgZ2V0OiBnZXQsXG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gKGtleSwgYXR0cmlidXRlcykge1xuICAgICAgICAgIHNldChcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgYXNzaWduKHt9LCBhdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgICAgIGV4cGlyZXM6IC0xXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHdpdGhBdHRyaWJ1dGVzOiBmdW5jdGlvbiAoYXR0cmlidXRlcykge1xuICAgICAgICAgIHJldHVybiBpbml0KHRoaXMuY29udmVydGVyLCBhc3NpZ24oe30sIHRoaXMuYXR0cmlidXRlcywgYXR0cmlidXRlcykpXG4gICAgICAgIH0sXG4gICAgICAgIHdpdGhDb252ZXJ0ZXI6IGZ1bmN0aW9uIChjb252ZXJ0ZXIpIHtcbiAgICAgICAgICByZXR1cm4gaW5pdChhc3NpZ24oe30sIHRoaXMuY29udmVydGVyLCBjb252ZXJ0ZXIpLCB0aGlzLmF0dHJpYnV0ZXMpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGF0dHJpYnV0ZXM6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUoZGVmYXVsdEF0dHJpYnV0ZXMpIH0sXG4gICAgICAgIGNvbnZlcnRlcjogeyB2YWx1ZTogT2JqZWN0LmZyZWV6ZShjb252ZXJ0ZXIpIH1cbiAgICAgIH1cbiAgICApXG4gIH1cblxuICB2YXIgYXBpID0gaW5pdChkZWZhdWx0Q29udmVydGVyLCB7IHBhdGg6ICcvJyB9KTtcbiAgLyogZXNsaW50LWVuYWJsZSBuby12YXIgKi9cblxuICByZXR1cm4gYXBpO1xuXG59KSkpO1xuIiwiaW1wb3J0IHsgSG90QVBJIH0gZnJvbSBcIi4vSG90QVBJXCI7XG5pbXBvcnQgeyBIb3RTdGFxIH0gZnJvbSBcIi4vSG90U3RhcVwiO1xuXG4vKipcbiAqIEEgY29tcG9uZW50IHRvIHByZXByb2Nlc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUhvdENvbXBvbmVudFxue1xuXHQvKipcblx0ICogVGhlIHByb2Nlc3NvciB0byB1c2UuXG5cdCAqL1xuXHRwcm9jZXNzb3I6IEhvdFN0YXE7XG5cdC8qKlxuXHQgKiBUaGUgYXNzb2NpYXRlZCBIVE1MRWxlbWVudC5cblx0ICovXG5cdGh0bWxFbGVtZW50PzogSFRNTEVsZW1lbnQ7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgcGFnZS5cblx0ICovXG5cdG5hbWU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgdGFnLlxuXHQgKi9cblx0dGFnPzogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGNvbm5lY3RlZCBBUEkuXG5cdCAqL1xuXHRhcGk/OiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgb3B0aW9ucyB0byBpbmNsdWRlIHdpdGggcmVnaXN0ZXJpbmcgdGhpcyBjb21wb25lbnQuXG5cdCAqL1xuXHRlbGVtZW50T3B0aW9ucz86IEVsZW1lbnREZWZpbml0aW9uT3B0aW9ucztcblx0LyoqXG5cdCAqIFRoZSB0eXBlIG9mIGNvbXBvbmVudC5cblx0ICovXG5cdHR5cGU/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudC5cblx0ICovXG5cdHZhbHVlPzogYW55O1xuXHQvKipcblx0ICogVGhlIGV2ZW50cyB0byB0cmlnZ2VyLlxuXHQgKi9cblx0ZXZlbnRzPzoge1xuXHRcdFx0W25hbWU6IHN0cmluZ106IHtcblx0XHRcdFx0dHlwZTogc3RyaW5nO1xuXHRcdFx0XHRmdW5jOiBGdW5jdGlvbjtcblx0XHRcdFx0b3B0aW9ucz86IGFueTtcblx0XHRcdH1cblx0XHR9O1xufVxuXG4vKipcbiAqIEEgY29tcG9uZW50IHRvIHByZXByb2Nlc3MuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBIb3RDb21wb25lbnQgaW1wbGVtZW50cyBJSG90Q29tcG9uZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgcHJvY2Vzc29yIHRvIHVzZS5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSBhc3NvY2lhdGVkIEhUTUxFbGVtZW50LlxuXHQgKi9cblx0aHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXHQvKipcblx0ICogVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudC5cblx0ICovXG5cdG5hbWU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBuYW1lIG9mIHRoZSB0YWcuXG5cdCAqL1xuXHR0YWc6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBjb25uZWN0ZWQgQVBJLlxuXHQgKi9cblx0YXBpOiBIb3RBUEk7XG5cdC8qKlxuXHQgKiBUaGUgb3B0aW9ucyB0byBpbmNsdWRlIHdpdGggcmVnaXN0ZXJpbmcgdGhpcyBjb21wb25lbnQuXG5cdCAqL1xuXHRlbGVtZW50T3B0aW9uczogRWxlbWVudERlZmluaXRpb25PcHRpb25zO1xuXHQvKipcblx0ICogVGhlIHR5cGUgb2YgY29tcG9uZW50LlxuXHQgKi9cblx0dHlwZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQuXG5cdCAqL1xuXHR2YWx1ZTogYW55O1xuXHQvKipcblx0ICogVGhlIGV2ZW50cyB0byB0cmlnZ2VyLlxuXHQgKi9cblx0ZXZlbnRzOiB7XG5cdFx0W25hbWU6IHN0cmluZ106IHtcblx0XHRcdFx0dHlwZTogc3RyaW5nO1xuXHRcdFx0XHRmdW5jOiBGdW5jdGlvbjtcblx0XHRcdFx0b3B0aW9uczogYW55O1xuXHRcdFx0fVxuXHRcdH07XG5cblx0Y29uc3RydWN0b3IgKGNvcHk6IElIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk6IEhvdEFQSSA9IG51bGwpXG5cdHtcblx0XHRpZiAoY29weSBpbnN0YW5jZW9mIEhvdFN0YXEpXG5cdFx0e1xuXHRcdFx0dGhpcy5wcm9jZXNzb3IgPSBjb3B5O1xuXHRcdFx0dGhpcy5odG1sRWxlbWVudCA9IG51bGw7XG5cdFx0XHR0aGlzLm5hbWUgPSBcIlwiO1xuXHRcdFx0dGhpcy50YWcgPSBcIlwiO1xuXHRcdFx0dGhpcy5hcGkgPSBudWxsO1xuXHRcdFx0dGhpcy5lbGVtZW50T3B0aW9ucyA9IHVuZGVmaW5lZDtcblx0XHRcdHRoaXMudHlwZSA9IFwiXCI7XG5cdFx0XHR0aGlzLnZhbHVlID0gbnVsbDtcblx0XHRcdHRoaXMuZXZlbnRzID0ge307XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHR0aGlzLnByb2Nlc3NvciA9IGNvcHkucHJvY2Vzc29yO1xuXHRcdFx0dGhpcy5odG1sRWxlbWVudCA9IGNvcHkuaHRtbEVsZW1lbnQgfHwgbnVsbDtcblx0XHRcdHRoaXMubmFtZSA9IGNvcHkubmFtZSB8fCBcIlwiO1xuXHRcdFx0dGhpcy50YWcgPSBjb3B5LnRhZyB8fCB0aGlzLm5hbWU7XG5cdFx0XHR0aGlzLmFwaSA9IGNvcHkuYXBpIHx8IG51bGw7XG5cdFx0XHR0aGlzLmVsZW1lbnRPcHRpb25zID0gY29weS5lbGVtZW50T3B0aW9ucyB8fCB1bmRlZmluZWQ7XG5cdFx0XHR0aGlzLnR5cGUgPSBjb3B5LnR5cGUgfHwgXCJcIjtcblx0XHRcdHRoaXMudmFsdWUgPSBjb3B5LnZhbHVlIHx8IG51bGw7XG5cdFx0XHR0aGlzLmV2ZW50cyA9IHt9O1xuXHRcdH1cblxuXHRcdGlmIChhcGkgIT0gbnVsbClcblx0XHRcdHRoaXMuYXBpID0gYXBpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV2ZW50IHRoYXQncyBjYWxsZWQgd2hlbiB0aGlzIGNvbXBvbmVudCBpcyBjcmVhdGVkLiBUaGlzIGlzIFxuXHQgKiBjYWxsZWQgYmVmb3JlIG91dHB1dCBpcyBjYWxsZWQuIFJpZ2h0IGFmdGVyIHRoaXMgaXMgY2FsbGVkLCBcblx0ICogdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgSFRNTEVsZW1lbnQgd2lsbCBiZSBwcm9jZXNzZWQuIElmIFxuXHQgKiB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgYXR0cmlidXRlcyBwcm9jZXNzaW5nIG5lZWQgdG8gYmUgXG5cdCAqIG92ZXJ3cml0dGVuLCB1c2UgdGhlIGhhbmRsZUF0dHJpYnV0ZXMgbWV0aG9kIHRvIGhhbmRsZSB0aGVtLlxuXHQgKi9cblx0YXN5bmMgb25DcmVhdGVkIChlbGVtZW50OiBIVE1MRWxlbWVudCk6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0cmV0dXJuIChlbGVtZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGUgdGhlIGF0dHJpYnV0ZXMgbWFudWFsbHkuXG5cdCAqL1xuXHRhc3luYyBoYW5kbGVBdHRyaWJ1dGVzPyAoYXR0cmlidXRlczogTmFtZWROb2RlTWFwKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogSGFuZGxlIGEgY2xpY2sgZXZlbnQuXG5cdCAqL1xuXHRhYnN0cmFjdCBjbGljayAoKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogT3V0cHV0IHRoZSBjb21wb25lbnQuXG5cdCAqL1xuXHRhYnN0cmFjdCBvdXRwdXQgKCk6IFByb21pc2U8c3RyaW5nPjtcbn0iLCJpbXBvcnQgeyBIb3RUZXN0RWxlbWVudCwgSG90VGVzdEVsZW1lbnRPcHRpb25zIH0gZnJvbSBcIi4vSG90VGVzdEVsZW1lbnRcIjtcbmltcG9ydCB7IEhvdFRlc3RQYWdlIH0gZnJvbSBcIi4vSG90VGVzdE1hcFwiO1xuXG4vKipcbiAqIFRoaXMgYWN0dWFsbHkgZXhlY3V0ZXMgdGhlIHRlc3RzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSG90VGVzdERyaXZlclxue1xuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgcGFnZS5cblx0ICovXG5cdHBhZ2U6IEhvdFRlc3RQYWdlO1xuXG5cdGNvbnN0cnVjdG9yIChwYWdlOiBIb3RUZXN0UGFnZSA9IG51bGwpXG5cdHtcblx0XHR0aGlzLnBhZ2UgPSBwYWdlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHRlc3Qgb2JqZWN0IGJ5IGl0J3MgbmFtZS4gSWYgYSAqIGlzIHVzZWQsIGl0IHdpbGwgYmUgdXNlZCBhcyBhIFxuXHQgKiB3aWxkY2FyZCBmb3IgdGhlIG9iamVjdCdzIG5hbWUuIElmIGEgPiBpcyB1c2VkLCB0aGVuIHRoZSBuYW1lIHdpbGwgXG5cdCAqIGJlIHRyZWF0ZWQgYXMgYSBDU1Mgc2VsZWN0b3IuXG5cdCAqL1xuXHRwYXJzZVRlc3RPYmplY3QgKG5hbWU6IHN0cmluZyk6IHN0cmluZ1xuXHR7XG5cdFx0bGV0IHBvczogbnVtYmVyID0gbmFtZS5pbmRleE9mIChcIipcIik7XG5cdFx0bGV0IHdpbGRjYXJkOiBzdHJpbmcgPSBcIlwiO1xuXG5cdFx0aWYgKHBvcyA+IC0xKVxuXHRcdHtcblx0XHRcdG5hbWUgPSBuYW1lLnJlcGxhY2UgKC9cXCovLCBcIlwiKTtcblx0XHRcdHdpbGRjYXJkID0gXCIqXCI7XG5cdFx0fVxuXG5cdFx0bGV0IHNlbGVjdG9yOiBzdHJpbmcgPSBgW2RhdGEtdGVzdC1vYmplY3QtbmFtZSR7d2lsZGNhcmR9PScke25hbWV9J11gO1xuXHRcdHBvcyA9IG5hbWUuaW5kZXhPZiAoXCI+XCIpO1xuXG5cdFx0aWYgKHBvcyA+IC0xKVxuXHRcdHtcblx0XHRcdG5hbWUgPSBuYW1lLnJlcGxhY2UgKC9cXD4vLCBcIlwiKTtcblx0XHRcdHNlbGVjdG9yID0gbmFtZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHNlbGVjdG9yKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXYWl0IGZvciBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG5cdCAqL1xuXHRhc3luYyB3YWl0IChudW1NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD5cblx0e1xuXHRcdHJldHVybiAoYXdhaXQgbmV3IFByb21pc2UgKChyZXNvbHZlLCByZWplY3QpID0+XG5cdFx0XHR7XG5cdFx0XHRcdHNldFRpbWVvdXQgKCgpID0+XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSAoKTtcblx0XHRcdFx0XHR9LCBudW1NaWxsaXNlY29uZHMpO1xuXHRcdFx0fSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByaW50IGEgbWVzc2FnZS5cblx0ICovXG5cdGFzeW5jIHByaW50IChtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRwcm9jZXNzLnN0ZG91dC53cml0ZSAobWVzc2FnZSk7XG5cdH1cblxuXHQvKipcblx0ICogUHJpbnQgYSBtZXNzYWdlIGxpbmUuXG5cdCAqL1xuXHRhc3luYyBwcmludGxuIChtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHRhd2FpdCB0aGlzLnByaW50IChgJHttZXNzYWdlfVxcbmApO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc2Nvbm5lY3QgdGhpcyBzZXJ2ZXIgb3IgZGVzdHJveSBhbnl0aGluZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBIb3RUZXN0RHJpdmVyLlxuXHQgKi9cblx0YWJzdHJhY3QgZGVzdHJveSAoKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogTmF2aWdhdGUgdG8gYSB1cmwuXG5cdCAqL1xuXHRhYnN0cmFjdCBuYXZpZ2F0ZVRvVXJsICh1cmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG5cdC8qKlxuXHQgKiBXYWl0IGZvciBhIEhvdFRlc3RFbGVtZW50IHRvIGxvYWQuXG5cdCAqL1xuXHRhYnN0cmFjdCB3YWl0Rm9yVGVzdEVsZW1lbnQgKG5hbWU6IHN0cmluZyB8IEhvdFRlc3RFbGVtZW50LCBvcHRpb25zPzogSG90VGVzdEVsZW1lbnRPcHRpb25zKTogUHJvbWlzZTxhbnk+O1xuXHQvKipcblx0ICogRmluZCBhIEhvdFRlc3RFbGVtZW50IHRvIHV0aWxpemUuXG5cdCAqL1xuXHRhYnN0cmFjdCBmaW5kVGVzdEVsZW1lbnQgKG5hbWU6IHN0cmluZyB8IEhvdFRlc3RFbGVtZW50LCBvcHRpb25zPzogSG90VGVzdEVsZW1lbnRPcHRpb25zKTogUHJvbWlzZTxhbnk+O1xuXHQvKipcblx0ICogUnVuIGEgSG90VGVzdEVsZW1lbnQgY29tbWFuZC5cblx0ICovXG5cdGFic3RyYWN0IHJ1bkNvbW1hbmQgKHRlc3RFbG06IHN0cmluZyB8IEhvdFRlc3RFbGVtZW50LCBmdW5jTmFtZT86IHN0cmluZywgdmFsdWVTdHI/OiBzdHJpbmcpOiBQcm9taXNlPGFueT47XG5cdC8qKlxuXHQgKiBBbiBleHByZXNzaW9uIHRvIHRlc3QuXG5cdCAqL1xuXHRhYnN0cmFjdCBhc3NlcnRFbGVtZW50VmFsdWUgKG5hbWU6IHN0cmluZyB8IEhvdFRlc3RFbGVtZW50LCB2YWx1ZTogYW55LCBcblx0XHRlcnJvck1lc3NhZ2U/OiBzdHJpbmcsIG9wdGlvbnM/OiBIb3RUZXN0RWxlbWVudE9wdGlvbnMpOiBQcm9taXNlPGFueT47XG5cdC8qKlxuXHQgKiBBbiBleHByZXNzaW9uIHRvIHRlc3QuXG5cdCAqL1xuXHRhc3luYyBhc3NlcnQgKHZhbHVlOiBhbnksIGVycm9yTWVzc2FnZTogc3RyaW5nID0gXCJcIik6IFByb21pc2U8YW55PlxuXHR7XG5cdFx0aWYgKCEgKHZhbHVlKSlcblx0XHRcdHRocm93IG5ldyBFcnJvciAoZXJyb3JNZXNzYWdlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSdW4gYSBzZXJpZXMgb2YgdGVzdCBlbGVtZW50cy5cblx0ICovXG5cdGFzeW5jIHJ1biAoZXhlY3V0aW9uczogc3RyaW5nW10gfCBzdHJpbmdbXVtdKTogUHJvbWlzZTxhbnlbXT5cblx0e1xuXHRcdGxldCByZXN1bHRzOiBhbnlbXSA9IFtdO1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBleGVjdXRpb25zLmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBleGVjdXRpb246IGFueSA9IGV4ZWN1dGlvbnNbaUlkeF07XG5cdFx0XHRsZXQgdGVzdEVsbTogSG90VGVzdEVsZW1lbnQgPSBudWxsO1xuXHRcdFx0bGV0IGZ1bmM6IHN0cmluZyA9IFwiXCI7XG5cdFx0XHRsZXQgdmFsdWU6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRcdGlmICh0eXBlb2YgKGV4ZWN1dGlvbikgPT09IFwic3RyaW5nXCIpXG5cdFx0XHR7XG5cdFx0XHRcdHRlc3RFbG0gPSB0aGlzLnBhZ2UudGVzdEVsZW1lbnRzW2V4ZWN1dGlvbl07XG5cblx0XHRcdFx0Ly8vIEBmaXhtZSBUaGlzIGlzIGdvaW5nIHRvIHdyZWNrIHNlbGVjdGluZyB0ZXN0IGVsZW1lbnRzIGJ5IHdpbGRjYXJkcy5cblx0XHRcdFx0aWYgKHRlc3RFbG0gPT0gbnVsbClcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0RHJpdmVyOiBVbmFibGUgdG8gZmluZCB0ZXN0IGVsZW1lbnQgJHtleGVjdXRpb259YCk7XG5cblx0XHRcdFx0ZnVuYyA9IHRlc3RFbG0uZnVuYztcblx0XHRcdFx0dmFsdWUgPSB0ZXN0RWxtLnZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZXhlY3V0aW9uIGluc3RhbmNlb2YgQXJyYXkpXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBuYW1lOiBzdHJpbmcgPSBleGVjdXRpb25bMF07XG5cdFx0XHRcdHRlc3RFbG0gPSB0aGlzLnBhZ2UudGVzdEVsZW1lbnRzW25hbWVdO1xuXG5cdFx0XHRcdC8vIFRoaXMgbnVsbCBjYXRjaCBpcyBzcGVjaWZpY2FsbHkgdG8gaGVscCBmaW5kIHdpbGRjYXJkIHRlc3QgZWxlbWVudHMuXG5cdFx0XHRcdGlmICh0ZXN0RWxtID09IG51bGwpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0ZXN0RWxtID0gbmV3IEhvdFRlc3RFbGVtZW50IChuYW1lKTtcblx0XHRcdFx0XHRmdW5jID0gZXhlY3V0aW9uWzFdO1xuXHRcdFx0XHRcdHZhbHVlID0gZXhlY3V0aW9uWzJdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGZ1bmMgPSB0ZXN0RWxtLmZ1bmM7XG5cdFx0XHRcdFx0dmFsdWUgPSB0ZXN0RWxtLnZhbHVlO1xuXG5cdFx0XHRcdFx0aWYgKGV4ZWN1dGlvbi5sZW5ndGggPiAxKVxuXHRcdFx0XHRcdFx0ZnVuYyA9IGV4ZWN1dGlvblsxXTtcblxuXHRcdFx0XHRcdGlmIChleGVjdXRpb24ubGVuZ3RoID4gMilcblx0XHRcdFx0XHRcdHZhbHVlID0gZXhlY3V0aW9uWzJdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRlc3RFbG0uZnVuYyA9IGZ1bmM7XG5cdFx0XHR0ZXN0RWxtLnZhbHVlID0gdmFsdWU7XG5cblx0XHRcdHJlc3VsdHMucHVzaCAoYXdhaXQgdGhpcy5ydW5Db21tYW5kICh0ZXN0RWxtKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChyZXN1bHRzKTtcblx0fVxufSIsImltcG9ydCB7IEhvdFN0YXEgfSBmcm9tIFwiLi9Ib3RTdGFxXCI7XG5pbXBvcnQgeyBIb3RSb3V0ZSB9IGZyb20gXCIuL0hvdFJvdXRlXCI7XG5pbXBvcnQgeyBIb3RSb3V0ZU1ldGhvZCwgVGVzdENhc2VPYmplY3QgfSBmcm9tIFwiLi9Ib3RSb3V0ZU1ldGhvZFwiO1xuaW1wb3J0IHsgSG90VGVzdERyaXZlciB9IGZyb20gXCIuL0hvdFRlc3REcml2ZXJcIjtcbmltcG9ydCB7IEhvdFRlc3REZXN0aW5hdGlvbiwgSG90VGVzdE1hcCwgSG90VGVzdFBhZ2UsIEhvdFRlc3RQYXRoIH0gZnJvbSBcIi4vSG90VGVzdE1hcFwiO1xuXG4vKipcbiAqIFRoZSB0ZXN0IHN0b3AgdGhhdCBpcyBleGVjdXRlZCBhcyBlaXRoZXIgYSBkZXN0aW5hdGlvbiBvciBcbiAqIGEgcGF0aC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3RUZXN0U3RvcFxue1xuXHQvKipcblx0ICogQSBjb21tYW5kIHRvIGV4ZWN1dGUuIENhbiBiZTpcblx0ICogKiBwcmludCh4KVxuXHQgKiAgICogUHJpbnQgYSBtZXNzYWdlIHRvIHRoZSBzZXJ2ZXIncyBjb25zb2xlLlxuXHQgKiAqIHByaW50bG4oeClcblx0ICogICAqIFByaW50IGEgbWVzc2FnZSB3aXRoIGEgbmV3IGxpbmUgdG8gdGhlIHNlcnZlcidzIGNvbnNvbGUuXG5cdCAqICogdXJsKHgpXG5cdCAqICAgKiBPcGVuIGEgdXJsLiBNdXN0IGJlIGFuIGFic29sdXRlIHVybC5cblx0ICogKiB3YWl0Rm9yVGVzdGVyQVBJRGF0YVxuXHQgKiAgICogVGhpcyB3aWxsIHdhaXQgZm9yIHRoZSB0ZXN0ZXIgQVBJIHRvIHJlY2VpdmUgZGF0YS5cblx0ICogKiB3YWl0KHgpXG5cdCAqICAgKiBUaGlzIHdpbGwgd2FpdCBmb3IgeCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuXHQgKiAqIHdhaXRGb3JUZXN0T2JqZWN0KHgpXG5cdCAqICAgKiBUaGlzIHdpbGwgd2FpdCBmb3IgYSB0ZXN0IG9iamVjdCB0byBiZSBsb2FkZWQuXG5cdCAqL1xuXHRjbWQ6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBkZXN0aW5hdGlvbiB0byBleGVjdXRlLlxuXHQgKi9cblx0ZGVzdDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHBhdGggdG8gZXhlY3V0ZS5cblx0ICovXG5cdHBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgZGVzdGluYXRpb24gZm9yIGEgdGVzdCB0byB0YWtlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvdERlc3RpbmF0aW9uXG57XG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgbWFwLlxuXHQgKi9cblx0bWFwTmFtZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIHBhZ2UgdG8gc3RhcnQgYXQuXG5cdCAqL1xuXHRwYWdlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgQVBJIHJvdXRlIHRvIHN0YXJ0IHVzaW5nLlxuXHQgKi9cblx0YXBpOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgcGF0aHMgdG8gdGFrZSBvbiB0aGUgcGFnZS5cblx0ICovXG5cdHBhdGhzOiBIb3RUZXN0U3RvcFtdO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHRlc3RzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSG90VGVzdGVyXG57XG5cdC8qKlxuXHQgKiBUaGUgdGVzdGVyIG5hbWUuXG5cdCAqL1xuXHRuYW1lOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYmFzZSB1cmwgdGhhdCB3aWxsIGNvbnN0cnVjdCBmdXR1cmUgdXJscy5cblx0ICovXG5cdGJhc2VVcmw6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBhc3NvY2lhdGVkIHByb2Nlc3Nvci5cblx0ICovXG5cdHByb2Nlc3NvcjogSG90U3RhcTtcblx0LyoqXG5cdCAqIFRoZSB0ZXN0IG1hcHMgdG8gdGVzdC5cblx0ICovXG5cdHRlc3RNYXBzOiB7IFtuYW1lOiBzdHJpbmddOiBIb3RUZXN0TWFwOyB9O1xuXHQvKipcblx0ICogVGhlIGRyaXZlciB0byB1c2Ugd2hlbiBydW5uaW5nIHRlc3RzLlxuXHQgKi9cblx0ZHJpdmVyOiBIb3RUZXN0RHJpdmVyO1xuXHQvKipcblx0ICogSGFzIHRoaXMgdGVzdGVyIGZpbmlzaGVkIGxvYWRpbmc/XG5cdCAqL1xuXHRmaW5pc2hlZExvYWRpbmc6IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBIYXMgdGhpcyB0ZXN0ZXIgZmluaXNoZWQgc2V0dGluZyB1cD9cblx0ICovXG5cdGhhc0JlZW5TZXR1cDogYm9vbGVhbjtcblx0LyoqXG5cdCAqIEhhcyB0aGlzIHRlc3RlciBmaW5pc2hlZCBzZXR0aW5nIHVwP1xuXHQgKi9cblx0aGFzQmVlbkRlc3Ryb3llZDogYm9vbGVhbjtcblxuXHRjb25zdHJ1Y3RvciAocHJvY2Vzc29yOiBIb3RTdGFxLCBuYW1lOiBzdHJpbmcsIGJhc2VVcmw6IHN0cmluZywgXG5cdFx0ZHJpdmVyOiBIb3RUZXN0RHJpdmVyLCB0ZXN0TWFwczogeyBbbmFtZTogc3RyaW5nXTogSG90VGVzdE1hcDsgfSA9IHt9KVxuXHR7XG5cdFx0dGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7XG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcblx0XHR0aGlzLmJhc2VVcmwgPSBiYXNlVXJsO1xuXHRcdHRoaXMudGVzdE1hcHMgPSB0ZXN0TWFwcztcblx0XHR0aGlzLmRyaXZlciA9IGRyaXZlcjtcblx0XHR0aGlzLmZpbmlzaGVkTG9hZGluZyA9IGZhbHNlO1xuXHRcdHRoaXMuaGFzQmVlblNldHVwID0gZmFsc2U7XG5cdFx0dGhpcy5oYXNCZWVuRGVzdHJveWVkID0gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBzZXR0aW5nIHVwIHRoZSB0ZXN0ZXIuXG5cdCAqL1xuXHRhYnN0cmFjdCBzZXR1cCAoaXNXZWJSb3V0ZTogYm9vbGVhbiwgdXJsOiBzdHJpbmcsIGRlc3RpbmF0aW9uS2V5Pzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gZGVzdHJveWluZyB1cCB0aGUgdGVzdGVyLlxuXHQgKi9cblx0YWJzdHJhY3QgZGVzdHJveSAoKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiB0ZXN0cyBhcmUgc3RhcnRlZC4gSWYgdGhpcyByZXR1cm5zIHRydWUsIGl0IHdpbGwgXG5cdCAqIGNvbnRpbnVlIGFuZCBleGVjdXRlIGFsbCB0ZXN0IHBhdGhzLiBJZiB0aGlzIHJldHVybnMgaXQgd2lsbCBcblx0ICogc2tpcCBhbGwgdGVzdCBwYXRocyBhbmQgZXhlY3V0ZSBvblRlc3RFbmQgaW5zdGVhZC5cblx0ICovXG5cdGFzeW5jIG9uVGVzdFN0YXJ0PyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCB1cmw6IHN0cmluZywgZGVzdGluYXRpb25LZXk/OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBhbiBBUEkgdGVzdCBwYXRoIGhhcyBzdGFydGVkLiBJZiB0aGlzIHJldHVybnMgZmFsc2UsIFxuXHQgKiB0aGUgdGVzdFBhdGggd2lsbCBub3QgYmUgaW1tZWRpYXRlbHkgZXhlY3V0ZWQgYWZ0ZXJ3YXJkcy5cblx0ICovXG5cdGFzeW5jIG9uVGVzdEFQSVBhdGhTdGFydD8gKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgbWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCwgXG5cdFx0dGVzdE5hbWU6IHN0cmluZywgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU/OiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gYW4gQVBJIHRlc3QgcGF0aCBoYXMgZW5kZWQuXG5cdCAqL1xuXHRhc3luYyBvblRlc3RBUElQYXRoRW5kPyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBtZXRob2Q6IEhvdFJvdXRlTWV0aG9kLCBcblx0XHR0ZXN0TmFtZTogc3RyaW5nLCByZXN1bHQ6IGFueSwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gcGFnZSB0ZXN0cyBhcmUgc3RhcnRlZC4gSWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgdGVzdFBhdGggd2lsbCBub3QgYmUgXG5cdCAqIGltbWVkaWF0ZWx5IGV4ZWN1dGVkIGFmdGVyd2FyZHMuXG5cdCAqL1xuXHRhc3luYyBvblRlc3RQYWdlUGF0aFN0YXJ0PyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBwYWdlOiBIb3RUZXN0UGFnZSwgXG5cdFx0c3RvcDogSG90VGVzdFN0b3AsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlPzogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIGEgcGFnZSB0ZXN0IGhhcyBlbmRlZC5cblx0ICovXG5cdGFzeW5jIG9uVGVzdFBhZ2VQYXRoRW5kPyAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCB0ZXN0UGF0aDogSG90VGVzdFBhdGgsIFxuXHRcdHJlc3VsdDogYW55LCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+O1xuXHQvKipcblx0ICogRXhlY3V0ZWQgd2hlbiBhIGNvbW1hbmQgaXMgZXhlY3V0ZWQuXG5cdCAqL1xuXHRhc3luYyBvbkNvbW1hbmQ/IChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIHBhZ2U6IEhvdFRlc3RQYWdlLCBzdG9wOiBIb3RUZXN0U3RvcCwgXG5cdFx0Y21kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjbWRGdW5jOiAoKGNtZEFyZ3M6IHN0cmluZ1tdKSA9PiBQcm9taXNlPHZvaWQ+KSk6IFByb21pc2U8dm9pZD47XG5cdC8qKlxuXHQgKiBFeGVjdXRlZCB3aGVuIHRlc3RzIGFyZSBmaW5pc2hlZC5cblx0ICovXG5cdGFzeW5jIG9uVGVzdEVuZD8gKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbik6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gdGhpcyB0ZXN0ZXIgaGFzIGJlZW4gZXhlY3V0ZWQgZnJvbSB0aGUgQVBJLlxuXHQgKi9cblx0YXN5bmMgb25FeGVjdXRlPyAoKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGVkIHdoZW4gdGhpcyB0ZXN0ZXIgaGFzIGZpbmlzaGVkIGxvYWRpbmcgYWxsIGRhdGEgZnJvbSB0aGUgQVBJLlxuXHQgKi9cblx0YXN5bmMgb25GaW5pc2hlZExvYWRpbmc/ICgpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBXYWl0cyBmb3IgdGhlIEFQSSB0byBmaW5pc2ggbG9hZGluZyBhbGwgZGF0YS5cblx0ICovXG5cdGFzeW5jIHdhaXRGb3JEYXRhICgpOiBQcm9taXNlPHZvaWQ+XG5cdHtcblx0XHR3aGlsZSAodGhpcy5maW5pc2hlZExvYWRpbmcgPT09IGZhbHNlKVxuXHRcdFx0YXdhaXQgSG90U3RhcS53YWl0ICgxMCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGEgdGVzdCBwYWdlLlxuXHQgKi9cblx0Z2V0VGVzdFBhZ2UgKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbik6IEhvdFRlc3RQYWdlXG5cdHtcblx0XHRsZXQgcGFnZSA9IHRoaXMudGVzdE1hcHNbZGVzdGluYXRpb24ubWFwTmFtZV0ucGFnZXNbZGVzdGluYXRpb24ucGFnZV07XG5cblx0XHRyZXR1cm4gKHBhZ2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIHRlc3QgcGF0aC5cblx0ICovXG5cdGdldFRlc3RQYXRoIChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIHBhdGhOYW1lOiBzdHJpbmcpOiBIb3RUZXN0UGF0aFxuXHR7XG5cdFx0bGV0IHBhZ2UgPSB0aGlzLnRlc3RNYXBzW2Rlc3RpbmF0aW9uLm1hcE5hbWVdLnBhZ2VzW2Rlc3RpbmF0aW9uLnBhZ2VdO1xuXG5cdFx0cmV0dXJuIChwYWdlLnRlc3RQYXRoc1twYXRoTmFtZV0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhIGRlc3RpbmF0aW9uIEpTT04gb2JqZWN0IHRvIHVzZS5cblx0ICovXG5cdHN0YXRpYyBpbnRlcnByZXREZXN0aW5hdGlvbiAobWFwTmFtZTogc3RyaW5nLCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uKTogSG90RGVzdGluYXRpb25cblx0e1xuXHRcdGxldCBkZXN0aW5hdGlvbjogc3RyaW5nID0gdGVzdERlc3QuZGVzdGluYXRpb247XG5cdFx0bGV0IG5ld0Rlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiA9IHtcblx0XHRcdFx0bWFwTmFtZTogbWFwTmFtZSxcblx0XHRcdFx0cGFnZTogXCJcIixcblx0XHRcdFx0YXBpOiBcIlwiLFxuXHRcdFx0XHRwYXRoczogW11cblx0XHRcdH07XG5cdFx0bGV0IHN0cnM6IHN0cmluZ1tdID0gZGVzdGluYXRpb24uc3BsaXQgKC9cXC1cXD4vZyk7XG5cdFx0bGV0IHR5cGU6IHN0cmluZyA9IHN0cnNbMF07XG5cdFx0bGV0IGdldFR5cGU6ICh0eXBlU3RyOiBzdHJpbmcsIHR5cGVEZWxpbWl0ZXI6IHN0cmluZykgPT4gc3RyaW5nID0gXG5cdFx0XHQodHlwZVN0cjogc3RyaW5nLCB0eXBlRGVsaW1pdGVyOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0XHRcdHtcblx0XHRcdFx0bGV0IHBvczogbnVtYmVyID0gdHlwZVN0ci5pbmRleE9mICh0eXBlRGVsaW1pdGVyKTtcblx0XHRcdFx0bGV0IHR5cGVWYWx1ZTogc3RyaW5nID0gXCJcIjtcblx0XHRcblx0XHRcdFx0aWYgKHBvcyA+IC0xKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dHlwZVZhbHVlID0gdHlwZVN0ci5zdWJzdHIgKHBvcyArIHR5cGVEZWxpbWl0ZXIubGVuZ3RoKTtcblx0XHRcdFx0XHR0eXBlVmFsdWUgPSB0eXBlVmFsdWUudHJpbSAoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAodHlwZVZhbHVlKTtcblx0XHRcdH07XG5cblx0XHRuZXdEZXN0aW5hdGlvbi5wYWdlID0gZ2V0VHlwZSAodHlwZSwgXCJwYWdlOlwiKTtcblx0XHRuZXdEZXN0aW5hdGlvbi5hcGkgPSBnZXRUeXBlICh0eXBlLCBcImFwaTpcIik7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMTsgaUlkeCA8IHN0cnMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IG5ld1BhdGhTdHI6IHN0cmluZyA9IHN0cnNbaUlkeF07XG5cdFx0XHRsZXQgbmV3UGF0aDogSG90VGVzdFN0b3AgPSB7XG5cdFx0XHRcdFx0Y21kOiBcIlwiLFxuXHRcdFx0XHRcdGRlc3Q6IFwiXCIsXG5cdFx0XHRcdFx0cGF0aDogXCJcIlxuXHRcdFx0XHR9O1xuXG5cdFx0XHRuZXdQYXRoU3RyID0gbmV3UGF0aFN0ci50cmltICgpO1xuXHRcdFx0bmV3UGF0aC5kZXN0ID0gZ2V0VHlwZSAobmV3UGF0aFN0ciwgXCJkZXN0OlwiKTtcblx0XHRcdG5ld1BhdGguY21kID0gZ2V0VHlwZSAobmV3UGF0aFN0ciwgXCJjbWQ6XCIpO1xuXHRcdFx0bmV3UGF0aC5wYXRoID0gZ2V0VHlwZSAobmV3UGF0aFN0ciwgXCJwYXRoOlwiKTtcblxuXHRcdFx0aWYgKChuZXdQYXRoLmRlc3QgPT0gXCJcIikgJiYgKG5ld1BhdGguY21kID09IFwiXCIpICYmIChuZXdQYXRoLnBhdGggPT0gXCJcIikpXG5cdFx0XHRcdG5ld1BhdGgucGF0aCA9IG5ld1BhdGhTdHI7XG5cblx0XHRcdG5ld0Rlc3RpbmF0aW9uLnBhdGhzLnB1c2ggKG5ld1BhdGgpO1xuXHRcdH1cblxuXHRcdHJldHVybiAobmV3RGVzdGluYXRpb24pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgYW4gQVBJJ3MgdGVzdCBwYXRoLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZVRlc3RBUElQYXRoIChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24sIG1ldGhvZDogSG90Um91dGVNZXRob2QsIFxuXHRcdHRlc3ROYW1lOiBzdHJpbmcsIHNraXBFdmVudENhbGxzOiBib29sZWFuID0gZmFsc2UsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCBydW5UZXN0UGF0aDogYm9vbGVhbiA9IHRydWU7XG5cblx0XHQvLyBBIGR1bWIgaGFjayB0byBwcmV2ZW50IGFueSByZWN1cnNpb24gdGhhdCBjb3VsZCBvY2N1ci5cblx0XHRpZiAoc2tpcEV2ZW50Q2FsbHMgPT09IGZhbHNlKVxuXHRcdHtcblx0XHRcdGlmICh0aGlzLm9uVGVzdEFQSVBhdGhTdGFydCAhPSBudWxsKVxuXHRcdFx0XHRydW5UZXN0UGF0aCA9IGF3YWl0IHRoaXMub25UZXN0QVBJUGF0aFN0YXJ0IChkZXN0aW5hdGlvbiwgbWV0aG9kLCB0ZXN0TmFtZSwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGUpO1xuXHRcdH1cblxuXHRcdGxldCByZXN1bHQ6IGFueSA9IG51bGw7XG5cblx0XHRpZiAocnVuVGVzdFBhdGggPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0bGV0IHRlc3RDYXNlT2JqZWN0OiBUZXN0Q2FzZU9iamVjdCA9IG1ldGhvZC50ZXN0Q2FzZXNbdGVzdE5hbWVdO1xuXG5cdFx0XHRpZiAodGVzdENhc2VPYmplY3QgPT0gbnVsbClcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBUZXN0IGNhc2Ugb2JqZWN0ICR7dGVzdE5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0XHRyZXN1bHQgPSBhd2FpdCB0ZXN0Q2FzZU9iamVjdC5mdW5jICh0aGlzLmRyaXZlcik7XG5cdFx0fVxuXG5cdFx0aWYgKHNraXBFdmVudENhbGxzID09PSBmYWxzZSlcblx0XHR7XG5cdFx0XHRpZiAodGhpcy5vblRlc3RBUElQYXRoRW5kICE9IG51bGwpXG5cdFx0XHRcdGF3YWl0IHRoaXMub25UZXN0QVBJUGF0aEVuZCAoZGVzdGluYXRpb24sIG1ldGhvZCwgdGVzdE5hbWUsIHJlc3VsdCwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGUpO1xuXHRcdH1cblxuXHRcdHJldHVybiAocmVzdWx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIGFsbCB0ZXN0IHBhdGhzIGluIGFuIEFQSSByb3V0ZS5cblx0ICogXG5cdCAqIEBmaXhtZSBUaGlzIG5lZWRzIGEgYmV0dGVyIGltcGxlbWVudGF0aW9uLi4uXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlVGVzdEFQSVBhdGhzIChkZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24pOiBQcm9taXNlPGFueVtdPlxuXHR7XG5cdFx0bGV0IHJlc3VsdHM6IGFueVtdID0gW107XG5cdFx0bGV0IHRlc3RNYXA6IEhvdFRlc3RNYXAgPSB0aGlzLnRlc3RNYXBzW2Rlc3RpbmF0aW9uLm1hcE5hbWVdO1xuXG5cdFx0aWYgKHRlc3RNYXAgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogTWFwICR7ZGVzdGluYXRpb24ubWFwTmFtZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRpZiAodGhpcy5wcm9jZXNzb3IuYXBpID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IEFzc29jaWF0ZWQgcHJvY2Vzc29yIGRvZXMgbm90IGhhdmUgYW4gQVBJIWApO1xuXG5cdFx0bGV0IHJvdXRlOiBIb3RSb3V0ZSA9IHRoaXMucHJvY2Vzc29yLmFwaS5yb3V0ZXNbZGVzdGluYXRpb24uYXBpXTtcblxuXHRcdGlmIChyb3V0ZSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBBUEkgZG9lcyBub3QgaGF2ZSByb3V0ZSAke2Rlc3RpbmF0aW9uLmFwaX0hYCk7XG5cblx0XHQvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBwYXRoIGluIHRoZSBkZXN0aW5hdGlvbiB1bnRpbCBjb21wbGV0ZS5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGRlc3RpbmF0aW9uLnBhdGhzLmxlbmd0aDsgaUlkeCArPSAyKVxuXHRcdHtcblx0XHRcdGxldCBzdG9wOiBIb3RUZXN0U3RvcCA9IGRlc3RpbmF0aW9uLnBhdGhzW2lJZHhdO1xuXHRcdFx0bGV0IHBhdGhOYW1lOiBzdHJpbmcgPSBzdG9wLnBhdGg7XG5cdFx0XHRsZXQgbWV0aG9kOiBIb3RSb3V0ZU1ldGhvZCA9IHJvdXRlLmdldE1ldGhvZCAocGF0aE5hbWUpO1xuXHRcdFx0bGV0IG5leHRTdG9wOiBIb3RUZXN0U3RvcCA9IGRlc3RpbmF0aW9uLnBhdGhzW2lJZHggKyAxXTtcblx0XHRcdGxldCB0ZXN0TmFtZTogc3RyaW5nID0gbmV4dFN0b3AucGF0aDtcblx0XHRcdGxldCByZXN1bHQ6IGFueSA9IGF3YWl0IHRoaXMuZXhlY3V0ZVRlc3RBUElQYXRoIChkZXN0aW5hdGlvbiwgbWV0aG9kLCB0ZXN0TmFtZSk7XG5cblx0XHRcdHJlc3VsdHMucHVzaCAocmVzdWx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHJlc3VsdHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgYSB0ZXN0IHBhZ2UgcGF0aC5cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVUZXN0UGFnZVBhdGggKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgc3RvcDogSG90VGVzdFN0b3AsIFxuXHRcdHNraXBFdmVudENhbGxzOiBib29sZWFuID0gZmFsc2UsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPGFueT5cblx0e1xuXHRcdGxldCBydW5UZXN0UGF0aDogYm9vbGVhbiA9IHRydWU7XG5cdFx0bGV0IHRlc3RNYXA6IEhvdFRlc3RNYXAgPSB0aGlzLnRlc3RNYXBzW2Rlc3RpbmF0aW9uLm1hcE5hbWVdO1xuXG5cdFx0Ly8vIEBmaXhtZSBGb3Igc29tZSByZWFzb24gdGhlIGVycm9ycyBiZWluZyB0aHJvd24gaGVyZSBhcmUgbm90IGJlaW5nIHRocm93bi5cblx0XHRpZiAodGVzdE1hcCA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBNYXAgJHtkZXN0aW5hdGlvbi5tYXBOYW1lfSBkb2VzIG5vdCBleGlzdCFgKTtcblxuXHRcdGxldCBwYWdlOiBIb3RUZXN0UGFnZSA9IHRlc3RNYXAucGFnZXNbZGVzdGluYXRpb24ucGFnZV07XG5cblx0XHRpZiAocGFnZSA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBQYWdlICR7ZGVzdGluYXRpb24ucGFnZX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHR0aGlzLmRyaXZlci5wYWdlID0gcGFnZTtcblxuXHRcdGxldCB0ZXN0UGF0aE5hbWU6IHN0cmluZyA9IHN0b3AucGF0aDtcblx0XHRsZXQgdGVzdFBhdGg6IEhvdFRlc3RQYXRoID0gcGFnZS50ZXN0UGF0aHNbdGVzdFBhdGhOYW1lXTtcblxuXHRcdC8vIEEgZHVtYiBoYWNrIHRvIHByZXZlbnQgYW55IHJlY3Vyc2lvbiB0aGF0IGNvdWxkIG9jY3VyLlxuXHRcdGlmIChza2lwRXZlbnRDYWxscyA9PT0gZmFsc2UpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMub25UZXN0UGFnZVBhdGhTdGFydCAhPSBudWxsKVxuXHRcdFx0XHRydW5UZXN0UGF0aCA9IGF3YWl0IHRoaXMub25UZXN0UGFnZVBhdGhTdGFydCAoZGVzdGluYXRpb24sIHBhZ2UsIHN0b3AsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlKTtcblx0XHR9XG5cblx0XHRsZXQgcmVzdWx0OiBhbnkgPSBudWxsO1xuXG5cdFx0aWYgKHJ1blRlc3RQYXRoID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGlmICh0ZXN0UGF0aCA9PSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IFRlc3QgcGF0aCAke3Rlc3RQYXRoTmFtZX0gZG9lcyBub3QgaGF2ZSBhIGZ1bmN0aW9uIWApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHQgPSBhd2FpdCB0ZXN0UGF0aCAodGhpcy5kcml2ZXIpO1xuXHRcdH1cblxuXHRcdGlmIChza2lwRXZlbnRDYWxscyA9PT0gZmFsc2UpXG5cdFx0e1xuXHRcdFx0aWYgKHRoaXMub25UZXN0UGFnZVBhdGhFbmQgIT0gbnVsbClcblx0XHRcdFx0YXdhaXQgdGhpcy5vblRlc3RQYWdlUGF0aEVuZCAoZGVzdGluYXRpb24sIHRlc3RQYXRoLCByZXN1bHQsIGNvbnRpbnVlV2hlblRlc3RJc0NvbXBsZXRlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBhIGNvbW1hbmQuXG5cdCAqL1xuXHRhc3luYyBleGVjdXRlQ29tbWFuZCAoZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uLCBwYWdlOiBIb3RUZXN0UGFnZSwgc3RvcDogSG90VGVzdFN0b3AsIGNtZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0LyoqXG5cdFx0ICogQ2hlY2sgaWYgdGhlIGlucHV0IGNvbW1hbmQgbWF0Y2hlcy5cblx0XHQgKi9cblx0XHRsZXQgaGFzQ21kOiAoaW5wdXQ6IHN0cmluZywgY21kOiBzdHJpbmcsIGhhc0FyZ3VtZW50czogYm9vbGVhbikgPT4gYm9vbGVhbiA9IFxuXHRcdFx0KGlucHV0OiBzdHJpbmcsIGNtZDogc3RyaW5nLCBoYXNBcmd1bWVudHM6IGJvb2xlYW4pOiBib29sZWFuID0+XG5cdFx0XHR7XG5cdFx0XHRcdGxldCByZXN1bHQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRcdFx0XHRpZiAoc3RvcC5jbWQgPT09IGNtZClcblx0XHRcdFx0XHRyZXN1bHQgPSB0cnVlO1xuXG5cdFx0XHRcdGNvbnN0IHBvczogbnVtYmVyID0gc3RvcC5jbWQuaW5kZXhPZiAoXCIoXCIpO1xuXG5cdFx0XHRcdC8vIElmIHRoZXJlJ3MgcGFyZW50aGVzaXMsIGdldCB0aGUgaW5jb21pbmcgY29tbWFuZC5cblx0XHRcdFx0aWYgKHBvcyA+IC0xKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGlucHV0Q21kOiBzdHJpbmcgPSBzdG9wLmNtZC5zdWJzdHIgKDAsIHBvcyk7XG5cblx0XHRcdFx0XHRpZiAoaW5wdXRDbWQgPT09IGNtZClcblx0XHRcdFx0XHRcdHJlc3VsdCA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gKHJlc3VsdCk7XG5cdFx0XHR9O1xuXHRcdC8qKlxuXHRcdCAqIEdldCB0aGUgYXJndW1lbnRzIGluIGEgY29tbWFuZC4gVGhpcyB3aWxsIG9ubHkgcmV0dXJuIGEgXG5cdFx0ICogc2luZ2xlIGFyZ3VtZW50IGZvciBub3cuXG5cdFx0ICogXG5cdFx0ICogQGZpeG1lIEFkZCBzdXBwb3J0IGZvciBtdWx0aXBsZSBhcmd1bWVudHMuXG5cdFx0ICovXG5cdFx0bGV0IGdldENtZEFyZ3M6IChpbnB1dDogc3RyaW5nKSA9PiBzdHJpbmdbXSA9IFxuXHRcdFx0KGlucHV0OiBzdHJpbmcpOiBzdHJpbmdbXSA9PlxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgcmVzdWx0czogc3RyaW5nW10gPSBbXTtcblx0XHRcdFx0bGV0IG1hdGNoZXMgPSBpbnB1dC5tYXRjaCAoLyg/PVxcKCkoLio/KSg/PVxcKSkvZyk7XG5cblx0XHRcdFx0aWYgKG1hdGNoZXMgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCB0ZW1wTWF0Y2ggPSBtYXRjaGVzWzBdO1xuXG5cdFx0XHRcdFx0Ly8gQSBsaXR0bGUgaGFjaywgc2luY2UgSSBzdWNrIGF0IFJlZ2V4IDooXG5cdFx0XHRcdFx0dGVtcE1hdGNoID0gdGVtcE1hdGNoLnN1YnN0ciAoMiwgdGVtcE1hdGNoLmxlbmd0aCk7XG5cblx0XHRcdFx0XHRyZXN1bHRzLnB1c2ggKHRlbXBNYXRjaCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmVzdWx0cy5sZW5ndGggPCAxKVxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogQ29tbWFuZCAke2lucHV0fSByZXF1aXJlcyBhcmd1bWVudHMsIGJ1dCBub25lIHdlcmUgc3VwcGxpZWQuYCk7XG5cblx0XHRcdFx0cmV0dXJuIChyZXN1bHRzKTtcblx0XHRcdH07XG5cblx0XHRsZXQgY21kRnVuYzogKChjbWRBcmdzOiBzdHJpbmdbXSkgPT4gUHJvbWlzZTx2b2lkPikgPSBudWxsO1xuXHRcdGxldCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0aWYgKGhhc0NtZCAoc3RvcC5jbWQsIFwid2FpdEZvclRlc3RlckFQSURhdGFcIiwgZmFsc2UpID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGNtZEZ1bmMgPSBhc3luYyAoY21kQXJnczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+ID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aGlzLmZpbmlzaGVkTG9hZGluZyA9IGZhbHNlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMud2FpdEZvckRhdGEgKCk7XG5cdFx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKGhhc0NtZCAoc3RvcC5jbWQsIFwid2FpdFwiLCB0cnVlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRhcmdzID0gZ2V0Q21kQXJncyAoc3RvcC5jbWQpO1xuXG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IG51bU1pbGxpc2Vjb25kczogbnVtYmVyID0gcGFyc2VJbnQgKGNtZEFyZ3NbMF0pO1xuXG5cdFx0XHRcdFx0YXdhaXQgSG90U3RhcS53YWl0IChudW1NaWxsaXNlY29uZHMpO1xuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcInVybFwiLCB0cnVlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRhcmdzID0gZ2V0Q21kQXJncyAoc3RvcC5jbWQpO1xuXG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IGlucHV0OiBzdHJpbmcgPSBjbWRBcmdzWzBdO1xuXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5kcml2ZXIubmF2aWdhdGVUb1VybCAoaW5wdXQpO1xuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcInByaW50XCIsIHRydWUpID09PSB0cnVlKVxuXHRcdHtcblx0XHRcdGFyZ3MgPSBnZXRDbWRBcmdzIChzdG9wLmNtZCk7XG5cblx0XHRcdGNtZEZ1bmMgPSBhc3luYyAoY21kQXJnczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+ID0+XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgaW5wdXQ6IHN0cmluZyA9IGNtZEFyZ3NbMF07XG5cblx0XHRcdFx0XHRhd2FpdCB0aGlzLmRyaXZlci5wcmludCAoaW5wdXQpO1xuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNDbWQgKHN0b3AuY21kLCBcInByaW50bG5cIiwgdHJ1ZSkgPT09IHRydWUpXG5cdFx0e1xuXHRcdFx0YXJncyA9IGdldENtZEFyZ3MgKHN0b3AuY21kKTtcblxuXHRcdFx0Y21kRnVuYyA9IGFzeW5jIChjbWRBcmdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4gPT5cblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBpbnB1dDogc3RyaW5nID0gY21kQXJnc1swXTtcblxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuZHJpdmVyLnByaW50bG4gKGlucHV0KTtcblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoaGFzQ21kIChzdG9wLmNtZCwgXCJ3YWl0Rm9yVGVzdE9iamVjdFwiLCB0cnVlKSA9PT0gdHJ1ZSlcblx0XHR7XG5cdFx0XHRhcmdzID0gZ2V0Q21kQXJncyAoc3RvcC5jbWQpO1xuXG5cdFx0XHRjbWRGdW5jID0gYXN5bmMgKGNtZEFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiA9PlxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGV0IHRlc3RPYmplY3Q6IHN0cmluZyA9IEpTT04ucGFyc2UgKGNtZEFyZ3NbMF0pO1xuXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5kcml2ZXIud2FpdEZvclRlc3RFbGVtZW50ICh0ZXN0T2JqZWN0KTtcblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoY21kRnVuYyA9PSBudWxsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yIChgSG90VGVzdGVyOiBDb21tYW5kICR7c3RvcC5jbWR9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0YXdhaXQgdGhpcy5vbkNvbW1hbmQgKGRlc3RpbmF0aW9uLCBwYWdlLCBzdG9wLCBjbWQsIGFyZ3MsIGNtZEZ1bmMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgYWxsIHRlc3QgcGF0aHMgaW4gYSBwYWdlLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZVRlc3RQYWdlUGF0aHMgKGRlc3RpbmF0aW9uOiBIb3REZXN0aW5hdGlvbiwgY29udGludWVXaGVuVGVzdElzQ29tcGxldGU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8YW55W10+XG5cdHtcblx0XHRsZXQgcmVzdWx0czogYW55W10gPSBbXTtcblx0XHRsZXQgdGVzdE1hcDogSG90VGVzdE1hcCA9IHRoaXMudGVzdE1hcHNbZGVzdGluYXRpb24ubWFwTmFtZV07XG5cblx0XHQvLy8gQGZpeG1lIEZvciBzb21lIHJlYXNvbiB0aGUgZXJyb3JzIGJlaW5nIHRocm93biBoZXJlIGFyZSBub3QgYmVpbmcgdGhyb3duLlxuXHRcdGlmICh0ZXN0TWFwID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IE1hcCAke2Rlc3RpbmF0aW9uLm1hcE5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0Ly8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggcGF0aCBpbiB0aGUgZGVzdGluYXRpb24gdW50aWwgY29tcGxldGUuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBkZXN0aW5hdGlvbi5wYXRocy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgc3RvcDogSG90VGVzdFN0b3AgPSBkZXN0aW5hdGlvbi5wYXRoc1tpSWR4XTtcblx0XHRcdGxldCByZXN1bHQ6IGFueSA9IG51bGw7XG5cdFx0XHRsZXQgcGFnZTogSG90VGVzdFBhZ2UgPSB0ZXN0TWFwLnBhZ2VzW2Rlc3RpbmF0aW9uLnBhZ2VdO1xuXHRcblx0XHRcdGlmIChwYWdlID09IG51bGwpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogUGFnZSAke2Rlc3RpbmF0aW9uLnBhZ2V9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0XHRpZiAoc3RvcC5kZXN0ICE9PSBcIlwiKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodGVzdE1hcC5kZXN0aW5hdGlvbnMgaW5zdGFuY2VvZiBBcnJheSlcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IFdoZW4gdXNpbmcgdHlwZSAnZGVzdCcgaW4gYSBkZXN0aW5hdGlvbiBzdHJpbmcsIGFsbCBkZXN0aW5hdGlvbnMgaW4gbWFwICR7ZGVzdGluYXRpb24ubWFwTmFtZX0gbXVzdCBiZSBuYW1lZC5gKTtcblxuXHRcdFx0XHRsZXQgdGVzdERlc3Q6IEhvdFRlc3REZXN0aW5hdGlvbiA9IHRlc3RNYXAuZGVzdGluYXRpb25zW3N0b3AuZGVzdF07XG5cdFx0XHRcdGxldCBuZXdEZXN0aW5hdGlvbjogSG90RGVzdGluYXRpb24gPSBIb3RUZXN0ZXIuaW50ZXJwcmV0RGVzdGluYXRpb24gKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZXN0aW5hdGlvbi5tYXBOYW1lLCB0ZXN0RGVzdCk7XG5cblx0XHRcdFx0cmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlVGVzdFBhZ2VQYXRocyAobmV3RGVzdGluYXRpb24pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc3RvcC5jbWQgIT09IFwiXCIpXG5cdFx0XHRcdGF3YWl0IHRoaXMuZXhlY3V0ZUNvbW1hbmQgKGRlc3RpbmF0aW9uLCBwYWdlLCBzdG9wLCBzdG9wLmNtZCk7XG5cblx0XHRcdGlmIChzdG9wLnBhdGggIT09IFwiXCIpXG5cdFx0XHRcdHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVRlc3RQYWdlUGF0aCAoZGVzdGluYXRpb24sIHN0b3AsIGZhbHNlLCBjb250aW51ZVdoZW5UZXN0SXNDb21wbGV0ZSk7XG5cblx0XHRcdHJlc3VsdHMucHVzaCAocmVzdWx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKHJlc3VsdHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgdGhlIHRlc3RzLlxuXHQgKi9cblx0YXN5bmMgZXhlY3V0ZSAobWFwTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxuXHR7XG5cdFx0bGV0IG1hcDogSG90VGVzdE1hcCA9IHRoaXMudGVzdE1hcHNbbWFwTmFtZV07XG5cblx0XHRpZiAobWFwID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBIb3RUZXN0ZXI6IE1hcCAke21hcE5hbWV9IGRvZXMgbm90IGV4aXN0IWApO1xuXG5cdFx0Ly8gUHJvY2VzcyByb3V0ZXMgdGVzdGluZyBmaXJzdC5cblx0XHRsZXQgcm91dGVLZXk6IHN0cmluZyA9IHRoaXMucHJvY2Vzc29yLmdldFJvdXRlS2V5RnJvbU5hbWUgKG1hcE5hbWUpO1xuXHRcdGxldCB1cmw6IHN0cmluZyA9IFwiXCI7XG5cblx0XHRpZiAocm91dGVLZXkgIT09IFwiXCIpXG5cdFx0XHR1cmwgPSBgJHt0aGlzLmJhc2VVcmx9JHtyb3V0ZUtleX1gO1xuXG5cdFx0bGV0IGV4ZWN1dGVEZXN0aW5hdGlvbjogKHRlc3REZXN0OiBIb3RUZXN0RGVzdGluYXRpb24sIGRlc3RpbmF0aW9uS2V5Pzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+ID0gXG5cdFx0XHRhc3luYyAodGVzdERlc3Q6IEhvdFRlc3REZXN0aW5hdGlvbiwgZGVzdGluYXRpb25LZXk6IHN0cmluZyA9IFwiXCIpID0+XG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0ZXN0RGVzdC5hdXRvU3RhcnQgPT09IGZhbHNlKVxuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRsZXQgZGVzdGluYXRpb246IEhvdERlc3RpbmF0aW9uID0gSG90VGVzdGVyLmludGVycHJldERlc3RpbmF0aW9uIChtYXBOYW1lLCB0ZXN0RGVzdCk7XG5cdFx0XHRcdGxldCBpc1dlYlJvdXRlOiBib29sZWFuID0gZmFsc2U7XG5cdFx0XHRcdGxldCBydW5UZXN0UGF0aHM6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdFx0XHRcdGlmIChkZXN0aW5hdGlvbi5wYWdlICE9PSBcIlwiKVxuXHRcdFx0XHRcdGlzV2ViUm91dGUgPSB0cnVlO1xuXHRcblx0XHRcdFx0aWYgKHRoaXMuc2V0dXAgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0aGlzLmhhc0JlZW5TZXR1cCA9PT0gZmFsc2UpXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5zZXR1cCAoaXNXZWJSb3V0ZSwgdXJsLCBkZXN0aW5hdGlvbktleSk7XG5cdFx0XHRcdFx0XHR0aGlzLmhhc0JlZW5TZXR1cCA9IHRydWU7XG5cdFx0XHRcdFx0XHR0aGlzLmhhc0JlZW5EZXN0cm95ZWQgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XG5cdFx0XHRcdGlmICh0aGlzLm9uVGVzdFN0YXJ0ICE9IG51bGwpXG5cdFx0XHRcdFx0cnVuVGVzdFBhdGhzID0gYXdhaXQgdGhpcy5vblRlc3RTdGFydCAoZGVzdGluYXRpb24sIHVybCwgZGVzdGluYXRpb25LZXkpO1xuXHRcblx0XHRcdFx0aWYgKHJ1blRlc3RQYXRocyA9PT0gdHJ1ZSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmIChkZXN0aW5hdGlvbi5wYWdlICE9PSBcIlwiKVxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5leGVjdXRlVGVzdFBhZ2VQYXRocyAoZGVzdGluYXRpb24pO1xuXHRcblx0XHRcdFx0XHRpZiAoZGVzdGluYXRpb24uYXBpICE9PSBcIlwiKVxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5leGVjdXRlVGVzdEFQSVBhdGhzIChkZXN0aW5hdGlvbik7XG5cdFx0XHRcdH1cblx0XHRcblx0XHRcdFx0aWYgKHRoaXMub25UZXN0RW5kICE9IG51bGwpXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5vblRlc3RFbmQgKGRlc3RpbmF0aW9uKTtcblx0XG5cdFx0XHRcdGlmICh0aGlzLmRlc3Ryb3kgIT0gbnVsbClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlmICh0aGlzLmhhc0JlZW5EZXN0cm95ZWQgPT09IGZhbHNlKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuZGVzdHJveSAoKTtcblx0XHRcdFx0XHRcdHRoaXMuaGFzQmVlbkRlc3Ryb3llZCA9IHRydWU7XG5cdFx0XHRcdFx0XHR0aGlzLmhhc0JlZW5TZXR1cCA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdC8vIElmIHRoZSBtYXAgZGVzdGluYXRpb25zIGFyZSBpbiBhbiBhcnJheSwganVzdCBleGVjdXRlIHRob3NlIGluIG9yZGVyLlxuXHRcdGlmIChtYXAuZGVzdGluYXRpb25zIGluc3RhbmNlb2YgQXJyYXkpXG5cdFx0e1xuXHRcdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBtYXAuZGVzdGluYXRpb25zLmxlbmd0aDsgaUlkeCsrKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgdGVzdERlc3Q6IEhvdFRlc3REZXN0aW5hdGlvbiA9IG1hcC5kZXN0aW5hdGlvbnNbaUlkeF07XG5cblx0XHRcdFx0YXdhaXQgZXhlY3V0ZURlc3RpbmF0aW9uICh0ZXN0RGVzdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHQvLyBJZiB0aGVyZSdzIGEgZGVzdGluYXRpb24gb3JkZXIsIHVzZSB0aGF0LlxuXHRcdFx0aWYgKG1hcC5kZXN0aW5hdGlvbk9yZGVyLmxlbmd0aCA+IDApXG5cdFx0XHR7XG5cdFx0XHRcdGxldCBoYXNFeGVjdXRlZEtleXM6IHN0cmluZ1tdID0gW107XG5cblx0XHRcdFx0Ly8gR28gdGhyb3VnaCB0aGUgZGVzdGluYXRpb24gb3JkZXIgYW5kIGV4ZWN1dGUgZWFjaCBvbmUuXG5cdFx0XHRcdGZvciAobGV0IGlJZHggPSAwOyBpSWR4IDwgbWFwLmRlc3RpbmF0aW9uT3JkZXIubGVuZ3RoOyBpSWR4KyspXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRsZXQgb3JkZXJLZXk6IHN0cmluZyA9IG1hcC5kZXN0aW5hdGlvbk9yZGVyW2lJZHhdO1xuXHRcdFx0XHRcdGxldCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uID0gbWFwLmRlc3RpbmF0aW9uc1tvcmRlcktleV07XG5cblx0XHRcdFx0XHRpZiAodGVzdERlc3QgPT0gbnVsbClcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciAoYEhvdFRlc3RlcjogRGVzdGluYXRpb24gJHtvcmRlcktleX0gZG9lcyBub3QgZXhpc3QhYCk7XG5cblx0XHRcdFx0XHRoYXNFeGVjdXRlZEtleXMucHVzaCAob3JkZXJLZXkpO1xuXHRcdFx0XHRcdGF3YWl0IGV4ZWN1dGVEZXN0aW5hdGlvbiAodGVzdERlc3QsIG9yZGVyS2V5KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEV4ZWN1dGUgdGhlIHJlc3Qgb2YgdGhlIGRlc3RpbmF0aW9ucyB0aGF0IGhhdmUgbm90IGJlZW4gZXhlY3V0ZWQgeWV0LlxuXHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gbWFwLmRlc3RpbmF0aW9ucylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCBleGVjdXRlRGVzdDogYm9vbGVhbiA9IHRydWU7XG5cblx0XHRcdFx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IGhhc0V4ZWN1dGVkS2V5cy5sZW5ndGg7IGlJZHgrKylcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRsZXQgZXhlY3V0ZWRLZXk6IHN0cmluZyA9IGhhc0V4ZWN1dGVkS2V5c1tpSWR4XTtcblxuXHRcdFx0XHRcdFx0aWYgKGV4ZWN1dGVkS2V5ID09PSBrZXkpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdGV4ZWN1dGVEZXN0ID0gZmFsc2U7XG5cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGV4ZWN1dGVEZXN0ID09PSB0cnVlKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGxldCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uID0gbWFwLmRlc3RpbmF0aW9uc1trZXldO1xuXG5cdFx0XHRcdFx0XHRhd2FpdCBleGVjdXRlRGVzdGluYXRpb24gKHRlc3REZXN0LCBrZXkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBFeGVjdXRlIHRoZSBkZXN0aW5hdGlvbnMgaW4gYW55IG9yZGVyLlxuXHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gbWFwLmRlc3RpbmF0aW9ucylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGxldCB0ZXN0RGVzdDogSG90VGVzdERlc3RpbmF0aW9uID0gbWFwLmRlc3RpbmF0aW9uc1trZXldO1xuXG5cdFx0XHRcdFx0YXdhaXQgZXhlY3V0ZURlc3RpbmF0aW9uICh0ZXN0RGVzdCwga2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEVuZCBvZiByb3V0ZXMgdGVzdGluZ1xuXG5cdFx0Ly8gU3RhcnQgb2YgQVBJIHRlc3RpbmdcblxuXHR9XG59Il0sInNvdXJjZVJvb3QiOiIifQ==
|