oxygen-cli 1.22.0 → 1.99.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +0 -50
- package/build/core/OxygenCore.js +56 -145
- package/build/errors/OxygenError.js +5 -15
- package/build/errors/helper.js +45 -49
- package/build/index.js +14 -6
- package/build/lib/cli-util.js +19 -19
- package/build/lib/cli.js +4 -2
- package/build/lib/parallel-launcher.js +333 -0
- package/build/lib/param-manager.js +66 -47
- package/build/lib/util.js +38 -9
- package/build/ox_modules/index.js +1 -97
- package/build/ox_modules/module-assert.js +19 -9
- package/build/ox_modules/module-dns.js +220 -0
- package/build/ox_modules/module-http.js +39 -51
- package/build/ox_modules/module-shell.js +19 -75
- package/build/ox_modules/module-utils.js +1 -108
- package/build/ox_modules/utils.js +1 -357
- package/build/reporter/FileReporterBase.js +5 -5
- package/build/reporter/ReportAggregator.js +127 -4
- package/build/runners/WorkerProcess.js +15 -28
- package/build/runners/index.js +2 -6
- package/build/runners/oxygen/OxygenWorker.js +8 -8
- package/build/runners/oxygen/index.js +17 -18
- package/build/runners/oxygen/worker.js +10 -8
- package/package.json +12 -46
- package/build/lib/img-merge.js +0 -163
- package/build/ox_modules/module-db.js +0 -146
- package/build/ox_modules/module-email.js +0 -212
- package/build/ox_modules/module-eyes.js +0 -189
- package/build/ox_modules/module-mailinator.js +0 -207
- package/build/ox_modules/module-mob/commands/alertAccept.js +0 -35
- package/build/ox_modules/module-mob/commands/alertDismiss.js +0 -35
- package/build/ox_modules/module-mob/commands/assertAlert.js +0 -56
- package/build/ox_modules/module-mob/commands/assertText.js +0 -45
- package/build/ox_modules/module-mob/commands/assertTitle.js +0 -43
- package/build/ox_modules/module-mob/commands/assertValue.js +0 -66
- package/build/ox_modules/module-mob/commands/back.js +0 -27
- package/build/ox_modules/module-mob/commands/clear.js +0 -40
- package/build/ox_modules/module-mob/commands/click.js +0 -35
- package/build/ox_modules/module-mob/commands/clickHidden.js +0 -52
- package/build/ox_modules/module-mob/commands/clickLong.js +0 -34
- package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +0 -37
- package/build/ox_modules/module-mob/commands/closeApp.js +0 -27
- package/build/ox_modules/module-mob/commands/debug.js +0 -26
- package/build/ox_modules/module-mob/commands/dragAndDrop.js +0 -38
- package/build/ox_modules/module-mob/commands/enableNetwork.js +0 -75
- package/build/ox_modules/module-mob/commands/execute.js +0 -32
- package/build/ox_modules/module-mob/commands/findElement.js +0 -36
- package/build/ox_modules/module-mob/commands/findElements.js +0 -39
- package/build/ox_modules/module-mob/commands/getAlertText.js +0 -31
- package/build/ox_modules/module-mob/commands/getAppiumLogs.js +0 -26
- package/build/ox_modules/module-mob/commands/getBrowserLogs.js +0 -66
- package/build/ox_modules/module-mob/commands/getCurrentActivity.js +0 -26
- package/build/ox_modules/module-mob/commands/getCurrentPackage.js +0 -26
- package/build/ox_modules/module-mob/commands/getDeviceLogs.js +0 -57
- package/build/ox_modules/module-mob/commands/getDeviceTime.js +0 -27
- package/build/ox_modules/module-mob/commands/getLocation.js +0 -32
- package/build/ox_modules/module-mob/commands/getSource.js +0 -26
- package/build/ox_modules/module-mob/commands/getText.js +0 -36
- package/build/ox_modules/module-mob/commands/getTitle.js +0 -24
- package/build/ox_modules/module-mob/commands/getUrl.js +0 -28
- package/build/ox_modules/module-mob/commands/getValue.js +0 -50
- package/build/ox_modules/module-mob/commands/getWindowHandles.js +0 -27
- package/build/ox_modules/module-mob/commands/hideKeyboard.js +0 -33
- package/build/ox_modules/module-mob/commands/index.js +0 -594
- package/build/ox_modules/module-mob/commands/installApp.js +0 -28
- package/build/ox_modules/module-mob/commands/isAppInstalled.js +0 -28
- package/build/ox_modules/module-mob/commands/isCheckable.js +0 -31
- package/build/ox_modules/module-mob/commands/isChecked.js +0 -31
- package/build/ox_modules/module-mob/commands/isClickable.js +0 -31
- package/build/ox_modules/module-mob/commands/isExist.js +0 -36
- package/build/ox_modules/module-mob/commands/isSelected.js +0 -36
- package/build/ox_modules/module-mob/commands/isVisible.js +0 -36
- package/build/ox_modules/module-mob/commands/isWebViewContext.js +0 -27
- package/build/ox_modules/module-mob/commands/launchApp.js +0 -26
- package/build/ox_modules/module-mob/commands/longPressKeyCode.js +0 -30
- package/build/ox_modules/module-mob/commands/open.js +0 -43
- package/build/ox_modules/module-mob/commands/pause.js +0 -27
- package/build/ox_modules/module-mob/commands/removeApp.js +0 -28
- package/build/ox_modules/module-mob/commands/resetApp.js +0 -26
- package/build/ox_modules/module-mob/commands/scrollIntoElement.js +0 -86
- package/build/ox_modules/module-mob/commands/scrollIntoView.js +0 -40
- package/build/ox_modules/module-mob/commands/select.js +0 -54
- package/build/ox_modules/module-mob/commands/selectFrame.js +0 -53
- package/build/ox_modules/module-mob/commands/selectWindow.js +0 -149
- package/build/ox_modules/module-mob/commands/sendKeys.js +0 -84
- package/build/ox_modules/module-mob/commands/setContext.js +0 -28
- package/build/ox_modules/module-mob/commands/setNativeContext.js +0 -26
- package/build/ox_modules/module-mob/commands/setTimeout.js +0 -33
- package/build/ox_modules/module-mob/commands/setWebViewContext.js +0 -39
- package/build/ox_modules/module-mob/commands/shake.js +0 -27
- package/build/ox_modules/module-mob/commands/smsClickLink.js +0 -32
- package/build/ox_modules/module-mob/commands/smsGetText.js +0 -45
- package/build/ox_modules/module-mob/commands/swipe.js +0 -58
- package/build/ox_modules/module-mob/commands/swipeElement.js +0 -58
- package/build/ox_modules/module-mob/commands/swipeScreen.js +0 -56
- package/build/ox_modules/module-mob/commands/takeScreenshot.js +0 -27
- package/build/ox_modules/module-mob/commands/tap.js +0 -34
- package/build/ox_modules/module-mob/commands/type.js +0 -67
- package/build/ox_modules/module-mob/commands/unlockPattern.js +0 -92
- package/build/ox_modules/module-mob/commands/waitForExist.js +0 -29
- package/build/ox_modules/module-mob/commands/waitForInteractable.js +0 -42
- package/build/ox_modules/module-mob/commands/waitForVisible.js +0 -28
- package/build/ox_modules/module-mob.js +0 -699
- package/build/ox_modules/module-pdf.js +0 -328
- package/build/ox_modules/module-proxy.js +0 -324
- package/build/ox_modules/module-serial.js +0 -187
- package/build/ox_modules/module-soap.js +0 -260
- package/build/ox_modules/module-twilio.js +0 -192
- package/build/ox_modules/module-web/commands/alertAccept.js +0 -35
- package/build/ox_modules/module-web/commands/alertDismiss.js +0 -35
- package/build/ox_modules/module-web/commands/assertAlert.js +0 -55
- package/build/ox_modules/module-web/commands/assertExist.js +0 -28
- package/build/ox_modules/module-web/commands/assertSelectedLabel.js +0 -51
- package/build/ox_modules/module-web/commands/assertSelectedValue.js +0 -45
- package/build/ox_modules/module-web/commands/assertText.js +0 -45
- package/build/ox_modules/module-web/commands/assertTextNotPresent.js +0 -56
- package/build/ox_modules/module-web/commands/assertTextPresent.js +0 -52
- package/build/ox_modules/module-web/commands/assertTitle.js +0 -42
- package/build/ox_modules/module-web/commands/assertValue.js +0 -44
- package/build/ox_modules/module-web/commands/back.js +0 -27
- package/build/ox_modules/module-web/commands/clear.js +0 -41
- package/build/ox_modules/module-web/commands/click.js +0 -112
- package/build/ox_modules/module-web/commands/clickHidden.js +0 -79
- package/build/ox_modules/module-web/commands/closeWindow.js +0 -25
- package/build/ox_modules/module-web/commands/debug.js +0 -25
- package/build/ox_modules/module-web/commands/deleteCookies.js +0 -22
- package/build/ox_modules/module-web/commands/deselect.js +0 -34
- package/build/ox_modules/module-web/commands/doubleClick.js +0 -65
- package/build/ox_modules/module-web/commands/dragAndDrop.js +0 -36
- package/build/ox_modules/module-web/commands/execute.js +0 -36
- package/build/ox_modules/module-web/commands/fileBrowse.js +0 -72
- package/build/ox_modules/module-web/commands/findElement.js +0 -35
- package/build/ox_modules/module-web/commands/findElements.js +0 -38
- package/build/ox_modules/module-web/commands/fullscreenWindow.js +0 -24
- package/build/ox_modules/module-web/commands/getAlertText.js +0 -30
- package/build/ox_modules/module-web/commands/getAttribute.js +0 -38
- package/build/ox_modules/module-web/commands/getBrowserLogs.js +0 -34
- package/build/ox_modules/module-web/commands/getCookies.js +0 -23
- package/build/ox_modules/module-web/commands/getCssValue.js +0 -38
- package/build/ox_modules/module-web/commands/getElementCount.js +0 -29
- package/build/ox_modules/module-web/commands/getHTML.js +0 -30
- package/build/ox_modules/module-web/commands/getSource.js +0 -26
- package/build/ox_modules/module-web/commands/getText.js +0 -36
- package/build/ox_modules/module-web/commands/getTitle.js +0 -22
- package/build/ox_modules/module-web/commands/getUrl.js +0 -26
- package/build/ox_modules/module-web/commands/getValue.js +0 -43
- package/build/ox_modules/module-web/commands/getWindowHandles.js +0 -26
- package/build/ox_modules/module-web/commands/getWindowSize.js +0 -26
- package/build/ox_modules/module-web/commands/getXMLPageSource.js +0 -51
- package/build/ox_modules/module-web/commands/index.js +0 -634
- package/build/ox_modules/module-web/commands/isAlertPresent.js +0 -31
- package/build/ox_modules/module-web/commands/isChecked.js +0 -30
- package/build/ox_modules/module-web/commands/isExist.js +0 -36
- package/build/ox_modules/module-web/commands/isSelected.js +0 -35
- package/build/ox_modules/module-web/commands/isVisible.js +0 -36
- package/build/ox_modules/module-web/commands/makeVisible.js +0 -74
- package/build/ox_modules/module-web/commands/maximizeWindow.js +0 -24
- package/build/ox_modules/module-web/commands/minimizeWindow.js +0 -24
- package/build/ox_modules/module-web/commands/newWindow.js +0 -27
- package/build/ox_modules/module-web/commands/open.js +0 -42
- package/build/ox_modules/module-web/commands/pause.js +0 -26
- package/build/ox_modules/module-web/commands/point.js +0 -37
- package/build/ox_modules/module-web/commands/pointJS.js +0 -56
- package/build/ox_modules/module-web/commands/refresh.js +0 -26
- package/build/ox_modules/module-web/commands/rightClick.js +0 -61
- package/build/ox_modules/module-web/commands/rightClickActions.js +0 -57
- package/build/ox_modules/module-web/commands/scrollToElement.js +0 -33
- package/build/ox_modules/module-web/commands/select.js +0 -55
- package/build/ox_modules/module-web/commands/selectFrame.js +0 -52
- package/build/ox_modules/module-web/commands/selectWindow.js +0 -148
- package/build/ox_modules/module-web/commands/sendKeys.js +0 -56
- package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +0 -33
- package/build/ox_modules/module-web/commands/setTimeout.js +0 -33
- package/build/ox_modules/module-web/commands/setWindowSize.js +0 -29
- package/build/ox_modules/module-web/commands/takeScreenshot.js +0 -37
- package/build/ox_modules/module-web/commands/type.js +0 -52
- package/build/ox_modules/module-web/commands/waitForAngular.js +0 -83
- package/build/ox_modules/module-web/commands/waitForExist.js +0 -28
- package/build/ox_modules/module-web/commands/waitForInteractable.js +0 -31
- package/build/ox_modules/module-web/commands/waitForNotExist.js +0 -57
- package/build/ox_modules/module-web/commands/waitForNotText.js +0 -45
- package/build/ox_modules/module-web/commands/waitForNotValue.js +0 -45
- package/build/ox_modules/module-web/commands/waitForText.js +0 -45
- package/build/ox_modules/module-web/commands/waitForValue.js +0 -45
- package/build/ox_modules/module-web/commands/waitForVisible.js +0 -28
- package/build/ox_modules/module-web/commands/waitForWindow.js +0 -118
- package/build/ox_modules/module-web.js +0 -909
- package/build/ox_modules/module-win/commands/assertText.js +0 -41
- package/build/ox_modules/module-win/commands/assertTitle.js +0 -38
- package/build/ox_modules/module-win/commands/assertValue.js +0 -62
- package/build/ox_modules/module-win/commands/back.js +0 -21
- package/build/ox_modules/module-win/commands/clear.js +0 -34
- package/build/ox_modules/module-win/commands/click.js +0 -25
- package/build/ox_modules/module-win/commands/clickLong.js +0 -30
- package/build/ox_modules/module-win/commands/clickMultipleTimes.js +0 -33
- package/build/ox_modules/module-win/commands/findElement.js +0 -31
- package/build/ox_modules/module-win/commands/findElements.js +0 -31
- package/build/ox_modules/module-win/commands/getAppiumLogs.js +0 -22
- package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +0 -25
- package/build/ox_modules/module-win/commands/getLocation.js +0 -26
- package/build/ox_modules/module-win/commands/getSource.js +0 -22
- package/build/ox_modules/module-win/commands/getText.js +0 -32
- package/build/ox_modules/module-win/commands/getValue.js +0 -46
- package/build/ox_modules/module-win/commands/getWindowHandles.js +0 -25
- package/build/ox_modules/module-win/commands/index.js +0 -298
- package/build/ox_modules/module-win/commands/isCheckable.js +0 -26
- package/build/ox_modules/module-win/commands/isChecked.js +0 -26
- package/build/ox_modules/module-win/commands/isClickable.js +0 -26
- package/build/ox_modules/module-win/commands/isExist.js +0 -32
- package/build/ox_modules/module-win/commands/isSelected.js +0 -26
- package/build/ox_modules/module-win/commands/isVisible.js +0 -32
- package/build/ox_modules/module-win/commands/open.js +0 -24
- package/build/ox_modules/module-win/commands/pause.js +0 -23
- package/build/ox_modules/module-win/commands/rightClick.js +0 -30
- package/build/ox_modules/module-win/commands/selectWindow.js +0 -97
- package/build/ox_modules/module-win/commands/sendKeys.js +0 -50
- package/build/ox_modules/module-win/commands/setTimeout.js +0 -29
- package/build/ox_modules/module-win/commands/takeScreenshot.js +0 -26
- package/build/ox_modules/module-win/commands/tap.js +0 -29
- package/build/ox_modules/module-win/commands/type.js +0 -38
- package/build/ox_modules/module-win/commands/waitForExist.js +0 -25
- package/build/ox_modules/module-win/commands/waitForInteractable.js +0 -43
- package/build/ox_modules/module-win/commands/waitForVisible.js +0 -24
- package/build/ox_modules/module-win.js +0 -367
- package/build/ox_services/service-devtools/submodule-network.js +0 -338
- package/build/ox_services/service-devtools.js +0 -83
- package/build/runners/cucumber/CucumberEventListener.js +0 -181
- package/build/runners/cucumber/CucumberReporter.js +0 -277
- package/build/runners/cucumber/CucumberWorker.js +0 -337
- package/build/runners/cucumber/index.js +0 -159
- package/build/runners/cucumber/worker.js +0 -184
package/build/core/OxygenCore.js
CHANGED
|
@@ -13,12 +13,6 @@ var _path = _interopRequireDefault(require("path"));
|
|
|
13
13
|
|
|
14
14
|
var _fs = _interopRequireDefault(require("fs"));
|
|
15
15
|
|
|
16
|
-
var _deasync = _interopRequireDefault(require("deasync"));
|
|
17
|
-
|
|
18
|
-
var _future = _interopRequireDefault(require("fibers/future"));
|
|
19
|
-
|
|
20
|
-
var _fibers = _interopRequireDefault(require("fibers"));
|
|
21
|
-
|
|
22
16
|
var _os = require("os");
|
|
23
17
|
|
|
24
18
|
var _stepResult = _interopRequireDefault(require("../model/step-result"));
|
|
@@ -35,8 +29,6 @@ var _helper = _interopRequireDefault(require("../errors/helper"));
|
|
|
35
29
|
|
|
36
30
|
var _status = _interopRequireDefault(require("../model/status.js"));
|
|
37
31
|
|
|
38
|
-
var Modules = _interopRequireWildcard(require("../ox_modules/index"));
|
|
39
|
-
|
|
40
32
|
var _logger2 = _interopRequireWildcard(require("../lib/logger"));
|
|
41
33
|
|
|
42
34
|
var _OxygenSubModule = require("./OxygenSubModule");
|
|
@@ -435,10 +427,10 @@ class Oxygen extends _OxygenEvents.default {
|
|
|
435
427
|
if (Array.isArray(this.opts.modules) && this.opts.modules.length > 0) {
|
|
436
428
|
this.opts.modules.forEach(moduleName => moduleFiles.push(`module-${moduleName}.js`));
|
|
437
429
|
} else {
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
430
|
+
moduleFiles = _glob.default.sync('module-*.js', {
|
|
431
|
+
cwd: oxModulesDirPath
|
|
432
|
+
});
|
|
433
|
+
}
|
|
442
434
|
|
|
443
435
|
for (let moduleFileName of moduleFiles) {
|
|
444
436
|
const moduleName = moduleFileName.match(MODULE_NAME_MATCH_REGEX)[1];
|
|
@@ -469,14 +461,22 @@ class Oxygen extends _OxygenEvents.default {
|
|
|
469
461
|
_loadInternalModules() {
|
|
470
462
|
const excludeUndefinedMods = this.opts.modules && this.opts.modules.length > 0;
|
|
471
463
|
|
|
472
|
-
|
|
464
|
+
const oxModulesDirPath = _util.default.getOxModulesDir();
|
|
465
|
+
|
|
466
|
+
const modulesFiles = _glob.default.sync('module-*.js', {
|
|
467
|
+
cwd: oxModulesDirPath
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
for (let moduleFileName of modulesFiles) {
|
|
471
|
+
const moduleName = moduleFileName.match(MODULE_NAME_MATCH_REGEX)[1];
|
|
472
|
+
|
|
473
473
|
if (excludeUndefinedMods && !this.opts.modules.includes(moduleName)) {
|
|
474
474
|
continue;
|
|
475
475
|
}
|
|
476
476
|
|
|
477
|
-
const
|
|
477
|
+
const modulePath = _path.default.join(oxModulesDirPath, moduleFileName);
|
|
478
478
|
|
|
479
|
-
const
|
|
479
|
+
const ModuleClass = require(modulePath);
|
|
480
480
|
|
|
481
481
|
try {
|
|
482
482
|
const startTime = new Date();
|
|
@@ -528,42 +528,42 @@ class Oxygen extends _OxygenEvents.default {
|
|
|
528
528
|
if (method instanceof _OxygenSubModule.OxygenSubModule) {
|
|
529
529
|
wrapper[methodName] = this._wrapModule(`${name}.${methodName}`, method);
|
|
530
530
|
} else if (DO_NOT_WRAP_METHODS.includes(methodName)) {
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
531
|
+
wrapper[methodName] = module[methodName].bind(module);
|
|
532
|
+
} else if (methodName.indexOf('_') === 0 || methodName.indexOf('on') === 0) {
|
|
533
|
+
wrapper[methodName] = function () {
|
|
534
|
+
var args = Array.prototype.slice.call(arguments);
|
|
535
|
+
|
|
536
|
+
_this.logger.debug('Executing: ' + _util.default.getMethodSignature(name, methodName, args));
|
|
537
|
+
|
|
538
|
+
try {
|
|
539
|
+
return module[methodName].apply(module, args);
|
|
540
|
+
} catch (e) {
|
|
541
|
+
throw _helper.default.getOxygenError(e, name, methodName, args);
|
|
542
|
+
}
|
|
543
|
+
};
|
|
544
|
+
} else {
|
|
545
|
+
if (methodName === 'getCapabilities') {
|
|
546
|
+
wrapper['_getCapabilities'] = method.bind(module);
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
wrapper[methodName] = async (...args) => {
|
|
550
|
+
try {
|
|
551
|
+
return await _this._commandWrapper(methodName, args, module, name);
|
|
552
|
+
} catch (e) {
|
|
553
|
+
if (e instanceof _OxygenError.default) {
|
|
554
|
+
throw e;
|
|
547
555
|
}
|
|
548
556
|
|
|
549
|
-
|
|
550
|
-
try {
|
|
551
|
-
return _this._commandWrapper(methodName, args, module, name);
|
|
552
|
-
} catch (e) {
|
|
553
|
-
if (e instanceof _OxygenError.default) {
|
|
554
|
-
throw e;
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
throw _helper.default.getOxygenError(e, name, methodName, args);
|
|
558
|
-
}
|
|
559
|
-
};
|
|
557
|
+
throw _helper.default.getOxygenError(e, name, methodName, args);
|
|
560
558
|
}
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
561
|
}
|
|
562
562
|
|
|
563
563
|
return wrapper;
|
|
564
564
|
}
|
|
565
565
|
|
|
566
|
-
_commandWrapper(cmdName, cmdArgs, module, moduleName) {
|
|
566
|
+
async _commandWrapper(cmdName, cmdArgs, module, moduleName) {
|
|
567
567
|
if (!module || !module[cmdName]) {
|
|
568
568
|
return undefined;
|
|
569
569
|
}
|
|
@@ -574,7 +574,7 @@ class Oxygen extends _OxygenEvents.default {
|
|
|
574
574
|
const publicMethod = !cmdName.startsWith('_') && cmdName !== 'dispose';
|
|
575
575
|
|
|
576
576
|
if (this.opts.delay && publicMethod && cmdName !== 'init' && cmdName !== 'transaction') {
|
|
577
|
-
|
|
577
|
+
await _util.default.sleep(this.opts.delay * 1000);
|
|
578
578
|
}
|
|
579
579
|
|
|
580
580
|
if (!module.isInitialized && publicMethod && cmdName !== 'init' && cmdName !== 'transaction') {
|
|
@@ -599,28 +599,13 @@ class Oxygen extends _OxygenEvents.default {
|
|
|
599
599
|
|
|
600
600
|
try {
|
|
601
601
|
if (cmdName === 'dispose') {
|
|
602
|
-
this._wrapAsync(this._callServicesOnModuleWillDispose).apply(this, [module]);
|
|
602
|
+
await this._wrapAsync(this._callServicesOnModuleWillDispose).apply(this, [module]);
|
|
603
603
|
}
|
|
604
604
|
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
if (retvalPromise && retvalPromise.then) {
|
|
608
|
-
let promiseDone = false;
|
|
609
|
-
retvalPromise.then(value => {
|
|
610
|
-
retval = value;
|
|
611
|
-
promiseDone = true;
|
|
612
|
-
}, e => {
|
|
613
|
-
error = e;
|
|
614
|
-
promiseDone = true;
|
|
615
|
-
});
|
|
616
|
-
|
|
617
|
-
_deasync.default.loopWhile(() => !promiseDone);
|
|
618
|
-
} else {
|
|
619
|
-
retval = retvalPromise;
|
|
620
|
-
}
|
|
605
|
+
retval = await this._wrapAsync(module[cmdName]).apply(module, decryptedArgs);
|
|
621
606
|
|
|
622
607
|
if (cmdName === 'init') {
|
|
623
|
-
this._wrapAsync(this._callServicesOnModuleInitialized).apply(this, [module]);
|
|
608
|
+
await this._wrapAsync(this._callServicesOnModuleInitialized).apply(this, [module]);
|
|
624
609
|
}
|
|
625
610
|
} catch (e) {
|
|
626
611
|
if (e && e.message && typeof e.message === 'string' && e.message.includes('invalid session id')) {
|
|
@@ -637,14 +622,13 @@ class Oxygen extends _OxygenEvents.default {
|
|
|
637
622
|
const endTime = _util.default.getTimeStamp();
|
|
638
623
|
|
|
639
624
|
let stepResult;
|
|
640
|
-
let done = false;
|
|
641
625
|
|
|
642
626
|
if (publicMethod) {
|
|
643
627
|
const waitId = +new Date();
|
|
644
628
|
|
|
645
629
|
this._waitStepResultList.push(waitId);
|
|
646
630
|
|
|
647
|
-
stepResult = this._getStepResult(module, moduleName, cmdName, cmdArgs, cmdLocation, startTime, endTime, retval, error);
|
|
631
|
+
stepResult = await this._getStepResult(module, moduleName, cmdName, cmdArgs, cmdLocation, startTime, endTime, retval, error);
|
|
648
632
|
|
|
649
633
|
const index = this._waitStepResultList.indexOf(waitId);
|
|
650
634
|
|
|
@@ -652,7 +636,6 @@ class Oxygen extends _OxygenEvents.default {
|
|
|
652
636
|
|
|
653
637
|
this.resultStore.steps.push(stepResult);
|
|
654
638
|
this.emitAfterCommand(cmdName, moduleName, cmdFn, cmdArgs, this.ctx, cmdLocation, endTime, stepResult);
|
|
655
|
-
done = true;
|
|
656
639
|
}
|
|
657
640
|
|
|
658
641
|
if (error && error.isFatal && !this.opts.continueOnError) {
|
|
@@ -667,81 +650,13 @@ class Oxygen extends _OxygenEvents.default {
|
|
|
667
650
|
throw error;
|
|
668
651
|
}
|
|
669
652
|
|
|
670
|
-
if (!publicMethod) {
|
|
671
|
-
done = true;
|
|
672
|
-
}
|
|
673
|
-
|
|
674
|
-
_deasync.default.loopWhile(() => !done && !error);
|
|
675
|
-
|
|
676
653
|
return retval;
|
|
677
654
|
}
|
|
678
655
|
|
|
679
656
|
_wrapAsync(fn, context) {
|
|
680
|
-
return function (...args) {
|
|
657
|
+
return async function (...args) {
|
|
681
658
|
var self = context || this;
|
|
682
|
-
|
|
683
|
-
if (!_fibers.default.current) {
|
|
684
|
-
const retval = fn.apply(self, args);
|
|
685
|
-
let done = false;
|
|
686
|
-
let error = null;
|
|
687
|
-
let finalVal = null;
|
|
688
|
-
|
|
689
|
-
if (retval && retval.then) {
|
|
690
|
-
Promise.resolve(retval).then(val => {
|
|
691
|
-
finalVal = val;
|
|
692
|
-
done = true;
|
|
693
|
-
}).catch(e => {
|
|
694
|
-
error = e;
|
|
695
|
-
done = true;
|
|
696
|
-
});
|
|
697
|
-
} else {
|
|
698
|
-
finalVal = retval;
|
|
699
|
-
done = true;
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
try {
|
|
703
|
-
_deasync.default.loopWhile(() => !done && !error);
|
|
704
|
-
} catch (e) {
|
|
705
|
-
if (e && e.message && typeof e.message === 'string' && e.message.includes('readyState')) {
|
|
706
|
-
return undefined;
|
|
707
|
-
}
|
|
708
|
-
|
|
709
|
-
this.logger.error('deasync.loopWhile() failed:', e);
|
|
710
|
-
return undefined;
|
|
711
|
-
}
|
|
712
|
-
|
|
713
|
-
if (!error) {
|
|
714
|
-
return finalVal;
|
|
715
|
-
}
|
|
716
|
-
|
|
717
|
-
throw error;
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
let error = null;
|
|
721
|
-
let done = false;
|
|
722
|
-
let retval = null;
|
|
723
|
-
|
|
724
|
-
try {
|
|
725
|
-
const future = new _future.default();
|
|
726
|
-
var result = fn.apply(self, args);
|
|
727
|
-
|
|
728
|
-
if (result && typeof result.then === 'function') {
|
|
729
|
-
result.then(val => future.return(val), err => future.throw(err));
|
|
730
|
-
return future.wait();
|
|
731
|
-
}
|
|
732
|
-
|
|
733
|
-
return result;
|
|
734
|
-
} catch (e) {
|
|
735
|
-
error = e;
|
|
736
|
-
}
|
|
737
|
-
|
|
738
|
-
_deasync.default.loopWhile(() => !done && !error);
|
|
739
|
-
|
|
740
|
-
if (!error) {
|
|
741
|
-
return retval;
|
|
742
|
-
}
|
|
743
|
-
|
|
744
|
-
throw error;
|
|
659
|
+
return await fn.apply(self, args);
|
|
745
660
|
};
|
|
746
661
|
}
|
|
747
662
|
|
|
@@ -765,7 +680,7 @@ class Oxygen extends _OxygenEvents.default {
|
|
|
765
680
|
return null;
|
|
766
681
|
}
|
|
767
682
|
|
|
768
|
-
_getStepResult(module, moduleName, methodName, args, location, startTime, endTime, retval, err) {
|
|
683
|
+
async _getStepResult(module, moduleName, methodName, args, location, startTime, endTime, retval, err) {
|
|
769
684
|
var step = new _stepResult.default();
|
|
770
685
|
step.name = _util.default.getMethodSignature(moduleName, methodName, args);
|
|
771
686
|
step.transaction = global._lastTransactionName || null;
|
|
@@ -803,12 +718,12 @@ class Oxygen extends _OxygenEvents.default {
|
|
|
803
718
|
|
|
804
719
|
if (typeof module._takeScreenshotSilent === 'function' && !this.opts.disableScreenshot) {
|
|
805
720
|
try {
|
|
806
|
-
step.screenshot = module._takeScreenshotSilent(methodName);
|
|
721
|
+
step.screenshot = await module._takeScreenshotSilent(methodName);
|
|
807
722
|
} catch (e) {
|
|
808
|
-
|
|
723
|
+
await _util.default.sleep(1000);
|
|
809
724
|
|
|
810
725
|
try {
|
|
811
|
-
step.screenshot = module._takeScreenshotSilent(methodName);
|
|
726
|
+
step.screenshot = await module._takeScreenshotSilent(methodName);
|
|
812
727
|
} catch (e) {}
|
|
813
728
|
}
|
|
814
729
|
}
|
|
@@ -848,11 +763,7 @@ class Oxygen extends _OxygenEvents.default {
|
|
|
848
763
|
|
|
849
764
|
if (mod.dispose) {
|
|
850
765
|
try {
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
if (disposeResult && typeof disposeResult.then === 'function') {
|
|
854
|
-
await disposeResult();
|
|
855
|
-
}
|
|
766
|
+
await mod.dispose(status);
|
|
856
767
|
} catch (e) {
|
|
857
768
|
this.logger.error(`Failed to dispose module '${key}': `, e);
|
|
858
769
|
}
|
|
@@ -1013,4 +924,4 @@ class Oxygen extends _OxygenEvents.default {
|
|
|
1013
924
|
}
|
|
1014
925
|
|
|
1015
926
|
exports.default = Oxygen;
|
|
1016
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL094eWdlbkNvcmUuanMiXSwibmFtZXMiOlsiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnbG9iYWwiLCJnZXQiLCJvcmlnIiwiRXJyb3IiLCJwcmVwYXJlU3RhY2tUcmFjZSIsIl8iLCJzdGFjayIsImVyciIsImNhcHR1cmVTdGFja1RyYWNlIiwiREVGQVVMVF9USU1FT1VUIiwiREVGQVVMVF9PUFRTIiwiYmFja3RyYWNlIiwiY29tcGlsZXIiLCJmYWlsQW1iaWd1b3VzRGVmaW5pdGlvbnMiLCJmYWlsRmFzdCIsImlnbm9yZVVuZGVmaW5lZERlZmluaXRpb25zIiwibmFtZSIsInByb2ZpbGUiLCJyZXF1aXJlIiwib3JkZXIiLCJzbmlwcGV0U3ludGF4IiwidW5kZWZpbmVkIiwic25pcHBldHMiLCJzb3VyY2UiLCJzdHJpY3QiLCJ0YWdFeHByZXNzaW9uIiwidGFnc0luVGl0bGUiLCJ0aW1lb3V0IiwiTU9EVUxFX05BTUVfTUFUQ0hfUkVHRVgiLCJTRVJWSUNFX05BTUVfTUFUQ0hfUkVHRVgiLCJET19OT1RfV1JBUF9NRVRIT0RTIiwiREVGQVVMVF9DVFgiLCJwYXJhbXMiLCJ2YXJzIiwiZW52IiwiY2FwcyIsIkRFRkFVTFRfUkVTVUxUX1NUT1JFIiwic3RlcHMiLCJsb2dzIiwiaGFyIiwiT3h5Z2VuIiwiT3h5Z2VuRXZlbnRzIiwiY29uc3RydWN0b3IiLCJpc0luaXRpYWxpemVkIiwicmVzdWx0U3RvcmUiLCJjdHgiLCJtb2R1bGVzIiwic2VydmljZXMiLCJyZXBvIiwiY2FwYWJpbGl0aWVzIiwib3B0cyIsIm94QmFzZURpciIsInBhdGgiLCJqb2luIiwiX19kaXJuYW1lIiwibG9nZ2VyIiwiX3dyYXBMb2dnZXIiLCJfd2FpdFN0ZXBSZXN1bHRMaXN0IiwiaW5pdCIsIm9wdGlvbnMiLCJyZXN1bHRzIiwiYXNzaWduIiwiY3dkIiwicHJvY2VzcyIsIm1ha2VPeEdsb2JhbCIsIl9sb2FkU2VydmljZXMiLCJfbG9hZE1vZHVsZXMiLCJnbG9iYWxTY29wZSIsIm1ha2VDb250ZXh0QW5kTW9kdWxlc0dsb2JhbCIsImRpc3Bvc2VNb2R1bGVzIiwic3RhdHVzIiwiX2Rpc3Bvc2VNb2R1bGVzIiwiZSIsImNvbnNvbGUiLCJlcnJvciIsImRpc3Bvc2UiLCJfZGlzcG9zZVNlcnZpY2VzIiwiYWRqdXN0U2NyaXB0TGluZSIsImlzSW5EZWJ1Z01vZGUiLCJveHV0aWwiLCJyZXN1bHQiLCJjb250ZXh0Iiwib3giLCJyZXBvc2l0b3J5IiwidHJhbnNTdGVwIiwiaW5jbHVkZXMiLCJ0cmFuc05hbWUiLCJ0cmFuc2FjdGlvbiIsImR1cmF0aW9uIiwic3RlcCIsImVuZFRpbWUiLCJnZXRNb2R1bGVzQ2FwYWJpbGl0aWVzIiwibW9kQ2FwcyIsIm1vZHVsZU5hbWUiLCJtb2R1bGUiLCJfZ2V0Q2FwYWJpbGl0aWVzIiwia2V5cyIsImxlbmd0aCIsInJlc2V0UmVzdWx0cyIsIm9uQmVmb3JlQ2FzZSIsIl9pdGVyYXRpb25TdGFydCIsIm9uQWZ0ZXJDYXNlIiwiX2l0ZXJhdGlvbkVuZCIsImxvYWRQYWdlT2JqZWN0RmlsZSIsInBvUGF0aCIsInBvIiwiX2xvZ2dlciIsImxvZ2dlcldyYXAiLCJpbmZvIiwiYXJncyIsIl9sb2ciLCJkZWJ1ZyIsIndhcm4iLCJ1c2VySW5mbyIsIklTU1VFUlMiLCJVU0VSIiwidXNlckRlYnVnIiwidXNlckVycm9yIiwidXNlcldhcm4iLCJsZXZlbCIsInNyYyIsIkRFRkFVTFRfTE9HR0VSX0lTU1VFUiIsImFwcGx5IiwibWVzc2FnZSIsInN0cmluZ2lmeSIsInRpbWUiLCJnZXRUaW1lU3RhbXAiLCJwdXNoIiwidG9VcHBlckNhc2UiLCJtc2ciLCJzaGlmdCIsImVtaXRMb2ciLCJveFNlcnZpY2VzRGlyUGF0aCIsInJlc29sdmUiLCJzZXJ2aWNlRmlsZXMiLCJnbG9iIiwic3luYyIsImkiLCJzZXJ2aWNlRmlsZU5hbWUiLCJzZXJ2aWNlRmlsZVBhdGgiLCJtYXRjaCIsInNlcnZpY2VOYW1lIiwiQXJyYXkiLCJpc0FycmF5Iiwic2VydmljZSIsIl9sb2FkU2VydmljZSIsIkVPTCIsInN0YWNrdHJhY2UiLCJzZXJ2aWNlUGF0aCIsIlNlcnZpY2VDbGFzcyIsImRlZmF1bHQiLCJzZXJ2aWNlTG9nZ2VyIiwiX2xvYWRJbnRlcm5hbE1vZHVsZXMiLCJfbG9hZEV4dGVybmFsTW9kdWxlcyIsIm1vZHVsZXNGb2xkZXJQYXRoIiwibW9kdWxlc19leHQiLCJveE1vZHVsZXNEaXJQYXRoIiwiZnMiLCJleGlzdHNTeW5jIiwibW9kdWxlRmlsZXMiLCJmb3JFYWNoIiwibW9kdWxlRmlsZU5hbWUiLCJzdGFydFRpbWUiLCJEYXRlIiwibW9kdWxlTG9nZ2VyIiwibW9kIiwiY29yZVV0aWxzIiwibG9hZE1vZHVsZUZyb21GaWxlIiwiX2NhbGxTZXJ2aWNlc09uTW9kdWxlTG9hZGVkIiwiX3dyYXBNb2R1bGUiLCJleGNsdWRlVW5kZWZpbmVkTW9kcyIsIk1vZHVsZXMiLCJNb2R1bGVDbGFzcyIsImdldE94TW9kdWxlc0RpciIsImxvYWRNb2R1bGVGcm9tQ2xhc3MiLCJ3cmFwcGVyIiwiX3RoaXMiLCJtb2R1bGVNZXRob2RzIiwic29tZSIsIngiLCJfZ2V0QWxsUHJvcGVydHlOYW1lcyIsIm1ldGhvZE5hbWUiLCJtZXRob2QiLCJGdW5jdGlvbiIsIk94eWdlblN1Yk1vZHVsZSIsImJpbmQiLCJpbmRleE9mIiwicHJvdG90eXBlIiwic2xpY2UiLCJjYWxsIiwiYXJndW1lbnRzIiwiZ2V0TWV0aG9kU2lnbmF0dXJlIiwiZXJyb3JIZWxwZXIiLCJnZXRPeHlnZW5FcnJvciIsIl9jb21tYW5kV3JhcHBlciIsIk94RXJyb3IiLCJjbWROYW1lIiwiY21kQXJncyIsInJldHZhbCIsImNtZEZuIiwicHVibGljTWV0aG9kIiwic3RhcnRzV2l0aCIsImRlbGF5IiwiZGVhc3luYyIsInNsZWVwIiwiZXJyb3JDb2RlIiwiTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiIsImRlY3J5cHRlZEFyZ3MiLCJfZ2V0RGVjcnlwdGVkQXJnc0ZvckFwcGx5IiwiX3BvcHVsYXRlUGFyYW1ldGVyc1ZhbHVlIiwiY21kTG9jYXRpb24iLCJfZ2V0Q29tbWFuZExvY2F0aW9uIiwiZW1pdEJlZm9yZUNvbW1hbmQiLCJfd3JhcEFzeW5jIiwiX2NhbGxTZXJ2aWNlc09uTW9kdWxlV2lsbERpc3Bvc2UiLCJyZXR2YWxQcm9taXNlIiwidGhlbiIsInByb21pc2VEb25lIiwidmFsdWUiLCJsb29wV2hpbGUiLCJfY2FsbFNlcnZpY2VzT25Nb2R1bGVJbml0aWFsaXplZCIsInN0ZXBSZXN1bHQiLCJkb25lIiwid2FpdElkIiwiX2dldFN0ZXBSZXN1bHQiLCJpbmRleCIsInNwbGljZSIsImVtaXRBZnRlckNvbW1hbmQiLCJpc0ZhdGFsIiwiY29udGludWVPbkVycm9yIiwibG9jYXRpb24iLCJmYWlsdXJlIiwiZm4iLCJzZWxmIiwiRmliZXIiLCJjdXJyZW50IiwiZmluYWxWYWwiLCJQcm9taXNlIiwidmFsIiwiY2F0Y2giLCJmdXR1cmUiLCJGdXR1cmUiLCJyZXR1cm4iLCJ0aHJvdyIsIndhaXQiLCJfX3N0YWNrIiwiY2FsbGVyIiwiX19maWxlbmFtZSIsImdldEZpbGVOYW1lIiwiZ2V0TGluZU51bWJlciIsImdldENvbHVtbk51bWJlciIsIlN0ZXBSZXN1bHQiLCJfbGFzdFRyYW5zYWN0aW9uTmFtZSIsInR5cGUiLCJBU1NFUlRfUEFTU0VEIiwiU1RBVFVTIiwiUEFTU0VEIiwiRkFJTEVEIiwiV0FSTklORyIsImFjdGlvbiIsIl9pc0FjdGlvbiIsIl9nZXRTdGF0cyIsInN0YXRzIiwiU0VMRU5JVU1fU0VTU0lPTl9USU1FT1VUIiwiZ2V0RmFpbHVyZUZyb21FcnJvciIsIl90YWtlU2NyZWVuc2hvdFNpbGVudCIsImRpc2FibGVTY3JlZW5zaG90Iiwic2NyZWVuc2hvdCIsImtleSIsImRpc3Bvc2VSZXN1bHQiLCJvbk1vZHVsZUxvYWRlZCIsIm9uTW9kdWxlSW5pdGlhbGl6ZWQiLCJvbk1vZHVsZVdpbGxEaXNwb3NlIiwiX25ld0FyZ3MiLCJhcmciLCJfcmVwbGFjZVBhcmFtZXRlckluQXJndW1lbnQiLCJnZXREZWNyeXB0UmVzdWx0IiwicGFyYW1OYW1lIiwiaGFzT3duUHJvcGVydHkiLCJwYXJhbVZhbHVlIiwicmVwbGFjZSIsIlJlZ0V4cCIsImVudk5hbWUiLCJlbnZWYWx1ZSIsIm9iaiIsInByb3BzIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInByb3AiLCJnZXRQcm90b3R5cGVPZiIsIl9jaGVja1N0ZXBSZXN1bHQiLCJyZWplY3QiLCJfd2FpdFN0ZXBSZXN1bHQiLCJfZGVjcnlwdFBhcmFtZXRlckZvckFwcGx5SW5Bcmd1bWVudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBQ0E7Ozs7Ozs7O0FBR0FBLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQkMsTUFBdEIsRUFBOEIsU0FBOUIsRUFBeUM7QUFDckNDLEVBQUFBLEdBQUcsRUFBRSxZQUFZO0FBQ2IsUUFBSUMsSUFBSSxHQUFHQyxLQUFLLENBQUNDLGlCQUFqQjs7QUFDQUQsSUFBQUEsS0FBSyxDQUFDQyxpQkFBTixHQUEwQixVQUFVQyxDQUFWLEVBQWFDLEtBQWIsRUFBb0I7QUFBRSxhQUFPQSxLQUFQO0FBQWUsS0FBL0Q7O0FBQ0EsUUFBSUMsR0FBRyxHQUFHLElBQUlKLEtBQUosRUFBVjtBQUNBQSxJQUFBQSxLQUFLLENBQUNLLGlCQUFOLENBQXdCRCxHQUF4QjtBQUNBLFFBQUlELEtBQUssR0FBR0MsR0FBRyxDQUFDRCxLQUFoQjtBQUNBSCxJQUFBQSxLQUFLLENBQUNDLGlCQUFOLEdBQTBCRixJQUExQjtBQUNBLFdBQU9JLEtBQVA7QUFDSDtBQVRvQyxDQUF6QztBQVlBLE1BQU1HLGVBQWUsR0FBRyxLQUF4QjtBQUNBLE1BQU1DLFlBQVksR0FBRztBQUNqQkMsRUFBQUEsU0FBUyxFQUFFLEtBRE07QUFFakJDLEVBQUFBLFFBQVEsRUFBRSxFQUZPO0FBR2pCQyxF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Q0FBQ2dCLElBQUQsSUFBUyxDQUFDaUMsS0FBSyxDQUFDQyxPQUFOLENBQWNsQyxJQUFkLENBQVYsSUFBaUNBLElBQUksQ0FBQ1osTUFBTCxJQUFlLENBQXBELEVBQXVEO0FBQ25ELGFBQU9ZLElBQVA7QUFDSDs7QUFDRCxVQUFNb0ssUUFBUSxHQUFHLEVBQWpCOztBQUNBLFNBQUssSUFBSUMsR0FBVCxJQUFnQnJLLElBQWhCLEVBQXNCO0FBQ2xCb0ssTUFBQUEsUUFBUSxDQUFDbEosSUFBVCxDQUFjLEtBQUtxSyxtQ0FBTCxDQUF5Q2xCLEdBQXpDLEVBQThDckwsVUFBOUMsQ0FBZDtBQUNIOztBQUNELFdBQU9vTCxRQUFQO0FBQ0g7O0FBRURtQixFQUFBQSxtQ0FBbUMsQ0FBQ2xCLEdBQUQsRUFBTXJMLFVBQU4sRUFBa0I7QUFDakQsUUFBSXFMLEdBQUcsSUFBSSxPQUFPQSxHQUFHLENBQUNFLGdCQUFYLEtBQWdDLFVBQTNDLEVBQXVEO0FBQ25ELFVBQUl2TCxVQUFVLEtBQUssS0FBbkIsRUFBMEI7QUFDdEIsZUFBTyxXQUFQO0FBQ0gsT0FGRCxNQUVPO0FBQ0gsZUFBT3FMLEdBQUcsQ0FBQ0UsZ0JBQUosRUFBUDtBQUNIO0FBQ0o7O0FBRUQsV0FBT0YsR0FBUDtBQUNIOztBQTc1QjRDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zICovXHJcbmltcG9ydCBnbG9iIGZyb20gJ2dsb2InO1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcclxuaW1wb3J0IGZzIGZyb20gJ2ZzJztcclxuaW1wb3J0IGRlYXN5bmMgZnJvbSAnZGVhc3luYyc7XHJcbmltcG9ydCBGdXR1cmUgZnJvbSAnZmliZXJzL2Z1dHVyZSc7XHJcbmltcG9ydCBGaWJlciBmcm9tICdmaWJlcnMnO1xyXG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XHJcbmltcG9ydCBTdGVwUmVzdWx0IGZyb20gJy4uL21vZGVsL3N0ZXAtcmVzdWx0JztcclxuaW1wb3J0IE94eWdlbkV2ZW50cyBmcm9tICcuL094eWdlbkV2ZW50cyc7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi4vbGliL3V0aWwnO1xyXG5pbXBvcnQgKiBhcyBjb3JlVXRpbHMgZnJvbSAnLi91dGlscyc7XHJcbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IFNUQVRVUyBmcm9tICcuLi9tb2RlbC9zdGF0dXMuanMnO1xyXG5pbXBvcnQgKiBhcyBNb2R1bGVzIGZyb20gJy4uL294X21vZHVsZXMvaW5kZXgnO1xyXG5cclxuLy8gc2V0dXAgbG9nZ2VyXHJcbmltcG9ydCBsb2dnZXIsIHsgREVGQVVMVF9MT0dHRVJfSVNTVUVSLCBJU1NVRVJTIH0gZnJvbSAnLi4vbGliL2xvZ2dlcic7XHJcbmltcG9ydCB7IE94eWdlblN1Yk1vZHVsZSB9IGZyb20gJy4vT3h5Z2VuU3ViTW9kdWxlJztcclxuXHJcbi8qZ2xvYmFsIF9fc3RhY2sqL1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsLCAnX19zdGFjaycsIHtcclxuICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBvcmlnID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7XHJcbiAgICAgICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBmdW5jdGlvbiAoXywgc3RhY2spIHsgcmV0dXJuIHN0YWNrOyB9O1xyXG4gICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoKTtcclxuICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIpO1xyXG4gICAgICAgIHZhciBzdGFjayA9IGVyci5zdGFjaztcclxuICAgICAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IG9yaWc7XHJcbiAgICAgICAgcmV0dXJuIHN0YWNrO1xyXG4gICAgfVxyXG59KTtcclxuXHJcbmNvbnN0IERFRkFVTFRfVElNRU9VVCA9IDMwMDAwO1xyXG5jb25zdCBERUZBVUxUX09QVFMgPSB7XHJcbiAgICBiYWNrdHJhY2U6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gc2hvdyBmdWxsIGJhY2t0cmFjZSBmb3IgZXJyb3JzXHJcbiAgICBjb21waWxlcjogW10sIC8vIDxzdHJpbmdbXT4gKFwiZXh0ZW5zaW9uOm1vZHVsZVwiKSByZXF1aXJlIGZpbGVzIHdpdGggdGhlIGdpdmVuIEVYVEVOU0lPTiBhZnRlciByZXF1aXJpbmcgTU9EVUxFIChyZXBlYXRhYmxlKVxyXG4gICAgZmFpbEFtYmlndW91c0RlZmluaXRpb25zOiBmYWxzZSwgLy8gPGJvb2xlYW4+IHRyZWF0IGFtYmlndW91cyBkZWZpbml0aW9ucyBhcyBlcnJvcnNcclxuICAgIGZhaWxGYXN0OiBmYWxzZSwgLy8gPGJvb2xlYW4+IGFib3J0IHRoZSBydW4gb24gZmlyc3QgZmFpbHVyZVxyXG4gICAgaWdub3JlVW5kZWZpbmVkRGVmaW5pdGlvbnM6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gdHJlYXQgdW5kZWZpbmVkIGRlZmluaXRpb25zIGFzIHdhcm5pbmdzXHJcbiAgICBuYW1lOiBbXSwgLy8gPFJFR0VYUFtdPiBvbmx5IGV4ZWN1dGUgdGhlIHNjZW5hcmlvcyB3aXRoIG5hbWUgbWF0Y2hpbmcgdGhlIGV4cHJlc3Npb24gKHJlcGVhdGFibGUpXHJcbiAgICBwcm9maWxlOiBbXSwgLy8gPHN0cmluZz4gKG5hbWUpIHNwZWNpZnkgdGhlIHByb2ZpbGUgdG8gdXNlXHJcbiAgICByZXF1aXJlOiBbXSwgLy8gPHN0cmluZz4gKGZpbGUvZGlyL2dsb2IpIHJlcXVpcmUgZmlsZXMgYmVmb3JlIGV4ZWN1dGluZyBmZWF0dXJlc1xyXG4gICAgb3JkZXI6ICdkZWZpbmVkJywgLy8gPHN0cmluZz4gc3dpdGNoIGJldHdlZW4gZGV0ZXJtaW5pc3RpYyAgYW5kIHJhbmRvbSBmZWF0dXJlIGV4ZWN1dGlvbi4gRWl0aGVyIFwiZGVmaW5lZFwiLCBcInJhbmRvbVwiIG9yIFwicmFuZG9tOjQyXCIgd2hlcmVhcyA0MiBpcyB0aGUgc2VlZCBmb3IgcmFuZG9taXphdGlvblxyXG4gICAgc25pcHBldFN5bnRheDogdW5kZWZpbmVkLCAvLyA8c3RyaW5nPiBzcGVjaWZ5IGEgY3VzdG9tIHNuaXBwZXQgc3ludGF4XHJcbiAgICBzbmlwcGV0czogdHJ1ZSwgLy8gPGJvb2xlYW4+IGhpZGUgc3RlcCBkZWZpbml0aW9uIHNuaXBwZXRzIGZvciBwZW5kaW5nIHN0ZXBzXHJcbiAgICBzb3VyY2U6IHRydWUsIC8vIDxib29sZWFuPiBoaWRlIHNvdXJjZSB1cmlzXHJcbiAgICBzdHJpY3Q6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gZmFpbCBpZiB0aGVyZSBhcmUgYW55IHVuZGVmaW5lZCBvciBwZW5kaW5nIHN0ZXBzXHJcbiAgICB0YWdFeHByZXNzaW9uOiAnJywgLy8gPHN0cmluZz4gKGV4cHJlc3Npb24pIG9ubHkgZXhlY3V0ZSB0aGUgZmVhdHVyZXMgb3Igc2NlbmFyaW9zIHdpdGggdGFncyBtYXRjaGluZyB0aGUgZXhwcmVzc2lvblxyXG4gICAgdGFnc0luVGl0bGU6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gYWRkIGN1Y3VtYmVyIHRhZ3MgdG8gZmVhdHVyZSBvciBzY2VuYXJpbyBuYW1lXHJcbiAgICB0aW1lb3V0OiBERUZBVUxUX1RJTUVPVVQgLy8gPG51bWJlcj4gdGltZW91dCBmb3Igc3RlcCBkZWZpbml0aW9ucyBpbiBtaWxsaXNlY29uZHNcclxufTtcclxuY29uc3QgTU9EVUxFX05BTUVfTUFUQ0hfUkVHRVggPSAvXm1vZHVsZS0oLis/KVxcLmpzJC87XHJcbmNvbnN0IFNFUlZJQ0VfTkFNRV9NQVRDSF9SRUdFWCA9IC9ec2VydmljZS0oLis/KVxcLmpzJC87XHJcbmNvbnN0IERPX05PVF9XUkFQX01FVEhPRFMgPSBbJ2RyaXZlcicsICdnZXREcml2ZXInXTtcclxuXHJcbmNvbnN0IERFRkFVTFRfQ1RYID0ge1xyXG4gICAgcGFyYW1zOiB7fSxcclxuICAgIHZhcnM6IHt9LFxyXG4gICAgZW52OiB7fSxcclxuICAgIGNhcHM6IHt9XHJcbn07XHJcbmNvbnN0IERFRkFVTFRfUkVTVUxUX1NUT1JFID0ge1xyXG4gICAgc3RlcHM6IFtdLFxyXG4gICAgbG9nczogW10sXHJcbiAgICBoYXI6IG51bGxcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE94eWdlbiBleHRlbmRzIE94eWdlbkV2ZW50cyB7XHJcbiAgICBjb25zdHJ1Y3RvciAoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnJlc3VsdFN0b3JlID0geyAuLi5ERUZBVUxUX1JFU1VMVF9TVE9SRSB9O1xyXG4gICAgICAgIHRoaXMuY3R4ID0geyAuLi5ERUZBVUxUX0NUWCB9O1xyXG4gICAgICAgIHRoaXMubW9kdWxlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuc2VydmljZXMgPSB7fTtcclxuICAgICAgICB0aGlzLnJlcG8gPSB7fTtcclxuICAgICAgICB0aGlzLmNhcGFiaWxpdGllcyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5vcHRzID0gbnVsbDtcclxuICAgICAgICB0aGlzLm94QmFzZURpciA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8nKTtcclxuICAgICAgICB0aGlzLmxvZ2dlciA9IHRoaXMuX3dyYXBMb2dnZXIobG9nZ2VyKCdPeHlnZW4nKSk7XHJcbiAgICAgICAgdGhpcy5fd2FpdFN0ZXBSZXN1bHRMaXN0ID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdChvcHRpb25zLCBjYXBzLCBjdHggPSB7fSwgcmVzdWx0cyA9IHt9KSB7XHJcbiAgICAgICAgdGhpcy5vcHRzID0gT2JqZWN0LmFzc2lnbihERUZBVUxUX09QVFMsIG9wdGlvbnMpO1xyXG4gICAgICAgIHRoaXMuY3dkID0gdGhpcy5vcHRzLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpO1xyXG4gICAgICAgIHRoaXMuY3R4ID0gT2JqZWN0LmFzc2lnbihERUZBVUxUX0NUWCwgY3R4IHx8IHt9KTtcclxuICAgICAgICB0aGlzLmN0eC5jYXBzID0geyAuLi5jdHguY2FwcyB8fCB7fSwgLi4uY2FwcywgfTtcclxuICAgICAgICB0aGlzLnJlc3VsdFN0b3JlID0gT2JqZWN0LmFzc2lnbihERUZBVUxUX1JFU1VMVF9TVE9SRSwgcmVzdWx0cyB8fCB7fSk7XHJcbiAgICAgICAgdGhpcy5jYXBhYmlsaXRpZXMgPSB0aGlzLmN0eC5jYXBzID0gY2FwcztcclxuXHJcbiAgICAgICAgLy8gZGVmaW5lICdveCcgb2JqZWN0IGluIGdsb2JhbCBKUyBzY29wZVxyXG4gICAgICAgIC8vIHdlIHdpbGwgdXNlIHRoaXMgb2JqZWN0IHRvIGFjY2VzcyBPeHlnZW4gbW9kdWxlcyBhbmQgdGVzdCBjb250ZXh0IGZyb20gbW9kdWxlcyB1c2VkIGluIHRoZSB0ZXN0IChpZiBhbnkpICAgICAgICBcclxuICAgICAgICB0aGlzLm1ha2VPeEdsb2JhbCgpO1xyXG4gICAgICAgIC8vIGxvYWQgc2VydmljZXNcclxuICAgICAgICB0aGlzLl9sb2FkU2VydmljZXMoKTtcclxuICAgICAgICAvLyBsb2FkIG1vZHVsZXNcclxuICAgICAgICB0aGlzLl9sb2FkTW9kdWxlcygpO1xyXG4gICAgICAgIC8vIGlmIG9wdGlvbnMubWFrZU1vZHVsZXNHbG9iYWwgaXMgdHJ1ZSBvciB1bmRlZmluZWQgdGhhbiBkZWZpbmUgJ2N0eCcgY29udGVudCBhbmQgZWFjaCBtb2R1bGUgaW4gZ2xvYmFsIHNjb3BlXHJcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmdsb2JhbFNjb3BlID09PSAndW5kZWZpbmVkJyB8fCBvcHRpb25zLmdsb2JhbFNjb3BlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWFrZUNvbnRleHRBbmRNb2R1bGVzR2xvYmFsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGlzcG9zZU1vZHVsZXMoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2Rpc3Bvc2VNb2R1bGVzKHN0YXR1cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkaXNwb3NlIG1vZHVsZXM6ICcsIGUpO1xyXG4gICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kaXNwb3NlTW9kdWxlcyhzdGF0dXMpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kaXNwb3NlU2VydmljZXMoKTtcclxuICAgICAgICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGlzcG9zZTogJywgZSk7XHJcbiAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBhZGp1c3RTY3JpcHRMaW5lKCkge1xyXG4gICAgICAgIGNvbnN0IGlzSW5EZWJ1Z01vZGUgPSBveHV0aWwuaXNJbkRlYnVnTW9kZSgpO1xyXG4gICAgICAgIC8vIGFkZCBleHRyYSBsaW5lIGlmIHdlIGFyZSBydW5uaW5nIGluIGRlYnVnZ2VyIG1vZGUgKFY4IGRlYnVnZ2VyIGFkZHMgYW4gZXh0cmEgbGluZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlKVxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGlzSW5EZWJ1Z01vZGUgPyAtMSA6IDA7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29udGV4dCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jdHg7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGNvbnRleHQoY3R4KSB7XHJcbiAgICAgICAgdGhpcy5jdHggPSBjdHg7XHJcbiAgICAgICAgaWYgKGdsb2JhbC5veCkge1xyXG4gICAgICAgICAgICBnbG9iYWwub3guY3R4ID0gY3R4O1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0cy5nbG9iYWxTY29wZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5vcHRzLmdsb2JhbFNjb3BlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgXCJwYXJhbXNcIiBhbmQgXCJlbnZcIiBpbiBcIm94XCIgZ2xvYmFsIHZhcmlhYmxlXHJcbiAgICAgICAgICAgICAgICBnbG9iYWwucGFyYW1zID0gY3R4LnBhcmFtcyB8fCB7fTtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5lbnYgPSBjdHguZW52IHx8IHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCByZXBvc2l0b3J5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlcG87XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHJlcG9zaXRvcnkocmVwbykge1xyXG4gICAgICAgIHRoaXMucmVwbyA9IHJlcG87XHJcbiAgICAgICAgaWYgKGdsb2JhbC5veCkge1xyXG4gICAgICAgICAgICBnbG9iYWwub3gucmVwbyA9IHJlcG87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCByZXN1bHRzKCkge1xyXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aW1lIGZvciB0aGUgdHJhbnNhY3Rpb24gaXRzZWxmIC0gc3VtbWFyeSBvZiBkdXJhdGlvbnMgZm9yIGFsbCB0aGUgc3RlcHMgaW4gdGhpcyB0cmFuc2FjdGlvblxyXG4gICAgICAgIC8vIGFsc28gYWRqdXN0IHRyYW5zYWN0aW9uIGVuZCB0aW1lIHRvIG11Y2ggZW5kIHRpbWUgZm9yIHRoZSBsYXN0IGV4ZWN1dGVkIHN0ZXAgd2l0aGluIHRoaXMgdHJhbnNhY3Rpb24uXHJcbiAgICAgICAgZm9yIChjb25zdCB0cmFuc1N0ZXAgb2YgdGhpcy5yZXN1bHRTdG9yZS5zdGVwcykge1xyXG4gICAgICAgICAgICBpZiAodHJhbnNTdGVwLm5hbWUuaW5jbHVkZXMoJy50cmFuc2FjdGlvbicpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc05hbWUgPSB0cmFuc1N0ZXAudHJhbnNhY3Rpb247XHJcbiAgICAgICAgICAgICAgICB0cmFuc1N0ZXAuZHVyYXRpb24gPSAwO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHRoaXMucmVzdWx0U3RvcmUuc3RlcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gJiBpcyBub3QgdGhlIHRyYW5zYWN0aW9uIHN0ZXBcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcC50cmFuc2FjdGlvbiA9PT0gdHJhbnNOYW1lICYmIHN0ZXAgIT09IHRyYW5zU3RlcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1N0ZXAuZHVyYXRpb24gKz0gc3RlcC5kdXJhdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXAuZW5kVGltZSA+IHRyYW5zU3RlcC5lbmRUaW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1N0ZXAuZW5kVGltZSA9IHN0ZXAuZW5kVGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRTdG9yZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNb2R1bGVzQ2FwYWJpbGl0aWVzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5tb2R1bGVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBtb2RDYXBzID0ge307XHJcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdO1xyXG4gICAgICAgICAgICBpZiAobW9kdWxlLm5hbWUgJiYgbW9kdWxlLl9nZXRDYXBhYmlsaXRpZXMgJiYgdHlwZW9mIG1vZHVsZS5fZ2V0Q2FwYWJpbGl0aWVzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjYXBzID0gbW9kdWxlLl9nZXRDYXBhYmlsaXRpZXMoKTtcclxuICAgICAgICAgICAgICAgIC8vIHN0b3JlIG9ubHkgbm9uLWVtcHR5IGNhcHMgcGVyIG1vZHVsZSB0aGF0IGhhcyB0aGlzLmNhcHMgcHJvcGVydHlcclxuICAgICAgICAgICAgICAgIGlmIChjYXBzICYmIHR5cGVvZiBjYXBzID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhjYXBzKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kQ2Fwc1ttb2R1bGUubmFtZV0gPSBjYXBzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtb2RDYXBzO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0UmVzdWx0cygpIHtcclxuICAgICAgICB0aGlzLnJlc3VsdFN0b3JlLnN0ZXBzID0gW107XHJcbiAgICAgICAgdGhpcy5yZXN1bHRTdG9yZS5sb2dzID0gW107XHJcbiAgICAgICAgdGhpcy5oYXIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQmVmb3JlQ2FzZShjb250ZXh0KSB7XHJcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIW1vZHVsZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIG1vZHVsZS5vbkJlZm9yZUNhc2UgJiYgYXdhaXQgbW9kdWxlLm9uQmVmb3JlQ2FzZShjb250ZXh0KTtcclxuICAgICAgICAgICAgICAgIG1vZHVsZS5faXRlcmF0aW9uU3RhcnQgJiYgYXdhaXQgbW9kdWxlLl9pdGVyYXRpb25TdGFydCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNhbGwgXCJvbkJlZm9yZUNhc2VcIiBtZXRob2Qgb2YgJHttb2R1bGVOYW1lfSBtb2R1bGUuYCwgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25BZnRlckNhc2UoZXJyb3IgPSBudWxsKSB7XHJcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIW1vZHVsZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIC8vIGF3YWl0IGZvciBhdm9pZCBzdHVjayBvbiAqLmRpc3Bvc2UgY2FsbFxyXG4gICAgICAgICAgICAgICAgbW9kdWxlLm9uQWZ0ZXJDYXNlICYmIGF3YWl0IG1vZHVsZS5vbkFmdGVyQ2FzZShlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBtb2R1bGUuX2l0ZXJhdGlvbkVuZCAmJiBhd2FpdCBtb2R1bGUuX2l0ZXJhdGlvbkVuZChlcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gY2FsbCBcIm9uQWZ0ZXJDYXNlXCIgbWV0aG9kIG9mICR7bW9kdWxlTmFtZX0gbW9kdWxlLmAsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG1ha2VPeEdsb2JhbCgpIHtcclxuICAgICAgICBpZiAoIWdsb2JhbC5veCkge1xyXG4gICAgICAgICAgICBnbG9iYWwub3ggPSB7XHJcbiAgICAgICAgICAgICAgICBtb2R1bGVzOiB0aGlzLm1vZHVsZXMsXHJcbiAgICAgICAgICAgICAgICBjdHg6IHRoaXMuY3R4LFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRzLFxyXG4gICAgICAgICAgICAgICAgY2FwczogdGhpcy5jYXBhYmlsaXRpZXMsXHJcbiAgICAgICAgICAgICAgICByZXN1bHRTdG9yZTogdGhpcy5yZXN1bHRTdG9yZVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgZ2xvYmFsLnZhcnMgPSB0aGlzLmN0eC52YXJzO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBtYWtlQ29udGV4dEFuZE1vZHVsZXNHbG9iYWwoKSB7XHJcbiAgICAgICAgLy8gbWFrZSBzdXJlICdveCcgaXMgYWxyZWFkeSBnbG9iYWxcclxuICAgICAgICBpZiAoZ2xvYmFsLm94KSB7XHJcbiAgICAgICAgICAgIC8vIGV4cG9zZSBtb2R1bGVzIGFzIGdsb2JhbCB2YXJpYWJsZXNcclxuICAgICAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghZ2xvYmFsW21vZHVsZU5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsW21vZHVsZU5hbWVdID0gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGV4cG9zZSBcImN0eFwiLCBcInBhcmFtc1wiIGFuZCBcImVudlwiIGFzIGdsb2JhbCB2YXJpYWJsZXNcclxuICAgICAgICAgICAgZ2xvYmFsLnBhcmFtcyA9IGdsb2JhbC5veC5jdHgucGFyYW1zO1xyXG4gICAgICAgICAgICBnbG9iYWwuZW52ID0gZ2xvYmFsLm94LmN0eC5lbnY7XHJcbiAgICAgICAgICAgIGdsb2JhbC5jdHggPSBnbG9iYWwub3guY3R4O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsb2FkUGFnZU9iamVjdEZpbGUocG9QYXRoKSB7XHJcbiAgICAgICAgaWYgKCFwb1BhdGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBwbyA9IHJlcXVpcmUocG9QYXRoKTtcclxuICAgICAgICAgICAgLy8gc2V0IHBhZ2Ugb2JqZWN0IHJlcG9zaXRvcnkgYXMgdGhlIG1haW4gb25lXHJcbiAgICAgICAgICAgIHRoaXMucmVwb3NpdG9yeSA9IHBvO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0cy5nbG9iYWxTY29wZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5vcHRzLmdsb2JhbFNjb3BlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwucG8gPSBwbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdHMuZ2xvYmFsU2NvcGUgPT09ICd1bmRlZmluZWQnIHx8IHRoaXMub3B0cy5nbG9iYWxTY29wZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLnBvID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAqIFByaXZhdGUgTWV0aG9kc1xyXG4gICAgICovXHJcbiAgICBfd3JhcExvZ2dlcihfbG9nZ2VyKSB7XHJcbiAgICAgICAgY29uc3QgbG9nZ2VyV3JhcCA9IHtcclxuICAgICAgICAgICAgaW5mbzogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnaW5mbycsIGFyZ3MpLFxyXG4gICAgICAgICAgICBkZWJ1ZzogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnZGVidWcnLCBhcmdzKSxcclxuICAgICAgICAgICAgZXJyb3I6ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ2Vycm9yJywgYXJncyksXHJcbiAgICAgICAgICAgIHdhcm46ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ3dhcm4nLCBhcmdzKSxcclxuICAgICAgICAgICAgdXNlckluZm86ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ2luZm8nLCBhcmdzLCBJU1NVRVJTLlVTRVIpLFxyXG4gICAgICAgICAgICB1c2VyRGVidWc6ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ2RlYnVnJywgYXJncywgSVNTVUVSUy5VU0VSKSxcclxuICAgICAgICAgICAgdXNlckVycm9yOiAoLi4uYXJncykgPT4gdGhpcy5fbG9nKF9sb2dnZXIsICdlcnJvcicsIGFyZ3MsIElTU1VFUlMuVVNFUiksXHJcbiAgICAgICAgICAgIHVzZXJXYXJuOiAoLi4uYXJncykgPT4gdGhpcy5fbG9nKF9sb2dnZXIsICd3YXJuJywgYXJncywgSVNTVUVSUy5VU0VSKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBsb2dnZXJXcmFwO1xyXG4gICAgfVxyXG5cclxuICAgIF9sb2coX2xvZ2dlciwgbGV2ZWwsIGFyZ3MsIHNyYyA9IERFRkFVTFRfTE9HR0VSX0lTU1VFUikge1xyXG4gICAgICAgIGlmICghX2xvZ2dlcltsZXZlbF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBfbG9nZ2VyW2xldmVsXS5hcHBseShfbG9nZ2VyLCBhcmdzKTtcclxuXHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IG94dXRpbC5zdHJpbmdpZnkoYXJncywgMik7XHJcbiAgICAgICAgY29uc3QgdGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICAvLyBhZGQgdGhlIGxvZyBlbnRyeSB0byB0aGUgcmVzdWx0IHN0b3JlXHJcbiAgICAgICAgaWYgKHRoaXMucmVzdWx0U3RvcmUgJiYgdGhpcy5yZXN1bHRTdG9yZS5sb2dzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0U3RvcmUubG9ncy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHRpbWU6IHRpbWUsXHJcbiAgICAgICAgICAgICAgICBsZXZlbDogbGV2ZWwudG9VcHBlckNhc2UoKSxcclxuICAgICAgICAgICAgICAgIG1zZzogbWVzc2FnZSxcclxuICAgICAgICAgICAgICAgIHNyYzogc3JjXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyByZW1vdmUgZmlyc3QgYXJndW1lbnQsIGlmIGl0J3MgYSBtZXNzYWdlXHJcbiAgICAgICAgYXJncyA9IG1lc3NhZ2UgPyBhcmdzLnNoaWZ0KCkgOiBhcmdzO1xyXG4gICAgICAgIHRoaXMuZW1pdExvZyh0aW1lLCBsZXZlbCwgbWVzc2FnZSwgYXJncywgc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBfbG9hZFNlcnZpY2VzKCkge1xyXG4gICAgICAgIGNvbnN0IG94U2VydmljZXNEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMub3hCYXNlRGlyLCAnLi9veF9zZXJ2aWNlcycpO1xyXG4gICAgICAgIGNvbnN0IHNlcnZpY2VGaWxlcyA9IGdsb2Iuc3luYygnc2VydmljZS0qLmpzJywgeyBjd2Q6IG94U2VydmljZXNEaXJQYXRoIH0pO1xyXG4gICAgICAgIC8vIGluaXRpYWxpemUgYWxsIHNlcnZpY2VzXHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgc2VydmljZXMuLi4nKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXJ2aWNlRmlsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VydmljZUZpbGVOYW1lID0gc2VydmljZUZpbGVzW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlRmlsZVBhdGggPSBwYXRoLmpvaW4ob3hTZXJ2aWNlc0RpclBhdGgsIHNlcnZpY2VGaWxlTmFtZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHNlcnZpY2VGaWxlTmFtZS5tYXRjaChTRVJWSUNFX05BTUVfTUFUQ0hfUkVHRVgpO1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHJlc3VsdFsxXTtcclxuXHJcbiAgICAgICAgICAgIC8vIHRoaXMub3B0cy5zZXJ2aWNlcyA9IHVuZGVmaW5lZCBpbiBzaW5nbGUgZmlsZSBtb2RlXHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0cy5zZXJ2aWNlcykgJiYgIXRoaXMub3B0cy5zZXJ2aWNlcy5pbmNsdWRlcyhzZXJ2aWNlTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgc2VydmljZTogJyArIHNlcnZpY2VOYW1lKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLl9sb2FkU2VydmljZShzZXJ2aWNlTmFtZSwgc2VydmljZUZpbGVQYXRoKTtcclxuICAgICAgICAgICAgICAgIHNlcnZpY2UuaW5pdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV0gPSBzZXJ2aWNlO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgaW5pdGlhbGl6aW5nIHNlcnZpY2UgXCInICsgc2VydmljZU5hbWUgKyAnXCI6ICcgKyBlLm1lc3NhZ2UgKyBFT0wgKyAoZS5zdGFja3RyYWNlID8gZS5zdGFja3RyYWNlIDogJycpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIF9sb2FkU2VydmljZShzZXJ2aWNlTmFtZSwgc2VydmljZVBhdGgpIHtcclxuICAgICAgICBsZXQgU2VydmljZUNsYXNzID0gcmVxdWlyZShzZXJ2aWNlUGF0aCk7XHJcbiAgICAgICAgLy8gRVM2IGNsYXNzIHdpbGwgYmUgdW5kZXIgJ2RlZmF1bHQnIHByb3BlcnR5XHJcbiAgICAgICAgaWYgKFNlcnZpY2VDbGFzcy5kZWZhdWx0KSB7XHJcbiAgICAgICAgICAgIFNlcnZpY2VDbGFzcyA9IFNlcnZpY2VDbGFzcy5kZWZhdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzZXJ2aWNlTG9nZ2VyID0gdGhpcy5fd3JhcExvZ2dlcihsb2dnZXIoYFNlcnZpY2U6JHtzZXJ2aWNlTmFtZX1gKSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlQ2xhc3ModGhpcy5vcHRzLCB0aGlzLmN0eCwgdGhpcy5yZXN1bHRTdG9yZSwgc2VydmljZUxvZ2dlcik7XHJcbiAgICB9XHJcblxyXG4gICAgX2xvYWRNb2R1bGVzKCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMb2FkaW5nIGludGVybmFsIG1vZHVsZXMuLi4nKTtcclxuICAgICAgICB0aGlzLl9sb2FkSW50ZXJuYWxNb2R1bGVzKCk7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgZXh0ZXJuYWwgbW9kdWxlcy4uLicpO1xyXG4gICAgICAgIHRoaXMuX2xvYWRFeHRlcm5hbE1vZHVsZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBfbG9hZEV4dGVybmFsTW9kdWxlcygpIHtcclxuICAgICAgICBsZXQgbW9kdWxlc0ZvbGRlclBhdGggPSAnLi9tb2R1bGVzJztcclxuICAgICAgICBpZiAodGhpcy5vcHRzLm1vZHVsZXNfZXh0ICYmIHR5cGVvZiB0aGlzLm9wdHMubW9kdWxlc19leHQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIG1vZHVsZXNGb2xkZXJQYXRoID0gdGhpcy5vcHRzLm1vZHVsZXNfZXh0O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL2NvbnN0IG94TW9kdWxlc0RpclBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5veEJhc2VEaXIsICcuL294X21vZHVsZXMnKTtcclxuICAgICAgICBjb25zdCBveE1vZHVsZXNEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuY3dkLCBtb2R1bGVzRm9sZGVyUGF0aCk7XHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKG94TW9kdWxlc0RpclBhdGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG1vZHVsZUZpbGVzID0gW107XHJcbiAgICAgICAgLy8gaWYgcGFydGljdWxhciBtb2R1bGUgbmFtZXMgYXJlIGRlZmluZWQgaW4gdGhlIGNvbmZpZywgdGhlbiBsb2FkIG9ubHkgdGhlc2UgbW9kdWxlc1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0cy5tb2R1bGVzKSAmJiB0aGlzLm9wdHMubW9kdWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5tb2R1bGVzLmZvckVhY2gobW9kdWxlTmFtZSA9PiBtb2R1bGVGaWxlcy5wdXNoKGBtb2R1bGUtJHttb2R1bGVOYW1lfS5qc2ApKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBsb2FkIGFsbCBhdmFpbGFibGUgbW9kdWxlcyAobWlnaHQgYmUgbW9yZSB0aW1lIGNvbnN1bWluZylcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbW9kdWxlRmlsZXMgPSBnbG9iLnN5bmMoJ21vZHVsZS0qLmpzJywgeyBjd2Q6IG94TW9kdWxlc0RpclBhdGggfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGluaXRpYWxpemUgYWxsIG1vZHVsZXMgICAgICAgIFxyXG4gICAgICAgIGZvciAobGV0IG1vZHVsZUZpbGVOYW1lIG9mIG1vZHVsZUZpbGVzKSB7XHJcbiAgICAgICAgICAgIC8vIGV4dHJhY3QgbmFtZSBmcm9tIHRoZSBtb2R1bGUgZmlsZSBuYW1lIGJhc2VkIG9uIG1vZHVsZSBuYW1lIHBhdHRlcm5cclxuICAgICAgICAgICAgY29uc3QgbW9kdWxlTmFtZSA9IG1vZHVsZUZpbGVOYW1lLm1hdGNoKE1PRFVMRV9OQU1FX01BVENIX1JFR0VYKVsxXTtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBuZXcgbG9nZ2VyIGZvciB0aGUgbW9kdWxlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVMb2dnZXIgPSB0aGlzLl93cmFwTG9nZ2VyKGxvZ2dlcihgTW9kdWxlOiR7bW9kdWxlTmFtZX1gKSk7XHJcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIG5ldyBtb2R1bGUgaW5zdGFuY2VcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZCA9IGNvcmVVdGlscy5sb2FkTW9kdWxlRnJvbUZpbGUobW9kdWxlTmFtZSwgbW9kdWxlRmlsZU5hbWUsIG1vZHVsZUxvZ2dlciwgb3hNb2R1bGVzRGlyUGF0aCwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICAvLyBjYWxsIG9uTW9kdWxlTG9hZGVkIGhvb2tcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxTZXJ2aWNlc09uTW9kdWxlTG9hZGVkKG1vZCk7XHJcbiAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG1vZHVsZSB0byB0aGUgbW9kdWxlIGxpc3RcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlc1ttb2R1bGVOYW1lXSA9IGdsb2JhbC5veC5tb2R1bGVzW21vZHVsZU5hbWVdID0gdGhpcy5fd3JhcE1vZHVsZShtb2R1bGVOYW1lLCBtb2QpO1xyXG4gICAgICAgICAgICAgICAgLy8gd3JhcCB1cFxyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IChlbmRUaW1lIC0gc3RhcnRUaW1lKSAvIDEwMDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9hZGluZyBtb2R1bGU6ICcgKyBtb2R1bGVOYW1lICsgJyBbICcgKyBkdXJhdGlvbiArICcgc2VjIF0nKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIGluaXRpYWxpemluZyBtb2R1bGUgXCInICsgbW9kdWxlTmFtZSArICdcIjogJyArIGUubWVzc2FnZSArIEVPTCArIChlLnN0YWNrdHJhY2UgPyBlLnN0YWNrdHJhY2UgOiAnJykpO1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGFueSBtb2R1bGUgdGhhdCBmYWlsZWQgdG8gbG9hZCwgZXhjZXB0IFdlYiBhbmQgTW9iIG1vZHVsZXNcclxuICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgTW9iIGFuZCBXZWIgbW9kdWxlcyBsb2FkZWQsIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHNoYWxsIGZhaWxcclxuICAgICAgICAgICAgICAgIGlmIChtb2R1bGVOYW1lID09PSAnd2ViJyB8fCBtb2R1bGVOYW1lID09PSAnbW9iJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9sb2FkSW50ZXJuYWxNb2R1bGVzKCkge1xyXG4gICAgICAgIC8vIGlmIGBtb2R1bGVzYCBpcyBlbXB0eSBvciB1bmRlZmluZWQgaW4gb3h5Z2VuLmNvbmYgdGhlbiBsb2FkIGFsbCBtb2R1bGVzXHJcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBsb2FkIG9ubHkgdGhvc2UgaW1wbGljaXRseSBkZWZpbmVkXHJcbiAgICAgICAgY29uc3QgZXhjbHVkZVVuZGVmaW5lZE1vZHMgPSB0aGlzLm9wdHMubW9kdWxlcyAmJiB0aGlzLm9wdHMubW9kdWxlcy5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBtb2R1bGVOYW1lIG9mIE9iamVjdC5rZXlzKE1vZHVsZXMpKSB7XHJcbiAgICAgICAgICAgIGlmIChleGNsdWRlVW5kZWZpbmVkTW9kcyAmJiAhdGhpcy5vcHRzLm1vZHVsZXMuaW5jbHVkZXMobW9kdWxlTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IE1vZHVsZUNsYXNzID0gTW9kdWxlc1ttb2R1bGVOYW1lXTtcclxuICAgICAgICAgICAgY29uc3Qgb3hNb2R1bGVzRGlyUGF0aCA9IG94dXRpbC5nZXRPeE1vZHVsZXNEaXIoKTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIG5ldyBsb2dnZXIgZm9yIHRoZSBtb2R1bGVcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZHVsZUxvZ2dlciA9IHRoaXMuX3dyYXBMb2dnZXIobG9nZ2VyKGBNb2R1bGU6JHttb2R1bGVOYW1lfWApKTtcclxuICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgbmV3IG1vZHVsZSBpbnN0YW5jZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbW9kID0gY29yZVV0aWxzLmxvYWRNb2R1bGVGcm9tQ2xhc3MobW9kdWxlTmFtZSwgTW9kdWxlQ2xhc3MsIG1vZHVsZUxvZ2dlciwgb3hNb2R1bGVzRGlyUGF0aCwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICAvLyBjYWxsIG9uTW9kdWxlTG9hZGVkIGhvb2tcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxTZXJ2aWNlc09uTW9kdWxlTG9hZGVkKG1vZCk7XHJcbiAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG1vZHVsZSB0byB0aGUgbW9kdWxlIGxpc3RcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlc1ttb2R1bGVOYW1lXSA9IGdsb2JhbC5veC5tb2R1bGVzW21vZHVsZU5hbWVdID0gdGhpcy5fd3JhcE1vZHVsZShtb2R1bGVOYW1lLCBtb2QpO1xyXG4gICAgICAgICAgICAgICAgLy8gd3JhcCB1cFxyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IChlbmRUaW1lIC0gc3RhcnRUaW1lKSAvIDEwMDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9hZGluZyBtb2R1bGU6ICcgKyBtb2R1bGVOYW1lICsgJyBbICcgKyBkdXJhdGlvbiArICcgc2VjIF0nKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIGluaXRpYWxpemluZyBtb2R1bGUgXCInICsgbW9kdWxlTmFtZSArICdcIjogJyArIGUubWVzc2FnZSArIEVPTCArIChlLnN0YWNrdHJhY2UgPyBlLnN0YWNrdHJhY2UgOiAnJykpO1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGFueSBtb2R1bGUgdGhhdCBmYWlsZWQgdG8gbG9hZCwgZXhjZXB0IFdlYiBhbmQgTW9iIG1vZHVsZXNcclxuICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgTW9iIGFuZCBXZWIgbW9kdWxlcyBsb2FkZWQsIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHNoYWxsIGZhaWxcclxuICAgICAgICAgICAgICAgIGlmIChtb2R1bGVOYW1lID09PSAnd2ViJyB8fCBtb2R1bGVOYW1lID09PSAnbW9iJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF93cmFwTW9kdWxlKG5hbWUsIG1vZHVsZSkge1xyXG4gICAgICAgIGlmICghbW9kdWxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IG5hbWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgbW9kdWxlTWV0aG9kcyA9IE9iamVjdC5rZXlzKG1vZHVsZSk7XHJcbiAgICAgICAgaWYgKCFtb2R1bGVNZXRob2RzLnNvbWUoeCA9PiB4PT09ICdleHBvcnRzJykpIHtcclxuICAgICAgICAgICAgbW9kdWxlTWV0aG9kcyA9IHRoaXMuX2dldEFsbFByb3BlcnR5TmFtZXMobW9kdWxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgbWV0aG9kTmFtZSBvZiBtb2R1bGVNZXRob2RzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IG1vZHVsZVttZXRob2ROYW1lXTtcclxuICAgICAgICAgICAgLy8gaWdub3JlIGFueSBtb2R1bGUgcHJvcGVydHkgdGhhdCBpcyBub3QgYSBmdW5jdGlvbiBvciBhIE94eWdlblN1Yk1vZHVsZVxyXG4gICAgICAgICAgICBpZiAoKCEobWV0aG9kIGluc3RhbmNlb2YgRnVuY3Rpb24pICYmICEobWV0aG9kIGluc3RhbmNlb2YgT3h5Z2VuU3ViTW9kdWxlKSAmJiB0eXBlb2YgbWV0aG9kICE9PSAnZnVuY3Rpb24nKSB8fCBtZXRob2ROYW1lID09PSAnZXhwb3J0cycgfHwgbWV0aG9kTmFtZSA9PT0gJ19jb21waWxlJykge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gbWFwIGFuZCB3cmFwIHN1Yi1tb2R1bGUgbWV0aG9kcyAocmVjdXJzaXZlIGNhbGwgdG8gX3dyYXBNb2R1bGUpXHJcbiAgICAgICAgICAgIGlmIChtZXRob2QgaW5zdGFuY2VvZiBPeHlnZW5TdWJNb2R1bGUpIHtcclxuICAgICAgICAgICAgICAgIHdyYXBwZXJbbWV0aG9kTmFtZV0gPSB0aGlzLl93cmFwTW9kdWxlKGAke25hbWV9LiR7bWV0aG9kTmFtZX1gLCBtZXRob2QpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGRvIG5vdCB3cmFwIG1ldGhvZHNcclxuICAgICAgICAgICAgZWxzZSBpZiAoRE9fTk9UX1dSQVBfTUVUSE9EUy5pbmNsdWRlcyhtZXRob2ROYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gPT09ICdkcml2ZXInIHx8IG1ldGhvZE5hbWUgPT09ICdnZXREcml2ZXInXHJcbiAgICAgICAgICAgICAgICB3cmFwcGVyW21ldGhvZE5hbWVdID0gbW9kdWxlW21ldGhvZE5hbWVdLmJpbmQobW9kdWxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBwcml2YXRlIG1ldGhvZHMgYW5kIGV2ZW50IGhhbmRsZXJzXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG1ldGhvZE5hbWUuaW5kZXhPZignXycpID09PSAwIHx8IG1ldGhvZE5hbWUuaW5kZXhPZignb24nKSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgd3JhcHBlclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMubG9nZ2VyLmRlYnVnKCdFeGVjdXRpbmc6ICcgKyBveHV0aWwuZ2V0TWV0aG9kU2lnbmF0dXJlKG5hbWUsIG1ldGhvZE5hbWUsIGFyZ3MpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZVttZXRob2ROYW1lXS5hcHBseShtb2R1bGUsIGFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3JIZWxwZXIuZ2V0T3h5Z2VuRXJyb3IoZSwgbmFtZSwgbWV0aG9kTmFtZSwgYXJncyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBpbnRlcm5hbCBfZ2V0Q2FwYWJpbGl0aWVzIG1ldGhvZCBmb3IgaW50ZXJuYWwgT3h5Z2VuIENvcmUgdXNlXHJcbiAgICAgICAgICAgICAgICAvLyBjYWxsaW5nIF9nZXRDYXBhYmlsaXRpZXMgbWV0aG9kIHdvbid0IGJlIHZpc2libGUgaW4gdGhlIHRlc3QgcmVzdWx0c1xyXG4gICAgICAgICAgICAgICAgaWYgKG1ldGhvZE5hbWUgPT09ICdnZXRDYXBhYmlsaXRpZXMnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd3JhcHBlclsnX2dldENhcGFiaWxpdGllcyddID0gbWV0aG9kLmJpbmQobW9kdWxlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHdyYXBwZXJbbWV0aG9kTmFtZV0gPSAoLi4uYXJncykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fY29tbWFuZFdyYXBwZXIobWV0aG9kTmFtZSwgYXJncywgbW9kdWxlLCBuYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBPeEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdUaHJvd2luZyBhZ2FpbjonLCBlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvckhlbHBlci5nZXRPeHlnZW5FcnJvcihlLCBuYW1lLCBtZXRob2ROYW1lLCBhcmdzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB3cmFwcGVyO1xyXG4gICAgfVxyXG5cclxuICAgIF9jb21tYW5kV3JhcHBlcihjbWROYW1lLCBjbWRBcmdzLCBtb2R1bGUsIG1vZHVsZU5hbWUpIHtcclxuICAgICAgICBpZiAoIW1vZHVsZSB8fCAhbW9kdWxlW2NtZE5hbWVdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcmV0dmFsID0gbnVsbDtcclxuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xyXG4gICAgICAgIGNvbnN0IGNtZEZuID0gbW9kdWxlW2NtZE5hbWVdO1xyXG4gICAgICAgIGNvbnN0IHB1YmxpY01ldGhvZCA9ICFjbWROYW1lLnN0YXJ0c1dpdGgoJ18nKSAmJiBjbWROYW1lICE9PSAnZGlzcG9zZSc7XHJcblxyXG4gICAgICAgIC8vIGRlbGF5IHRoZSBjb21tYW5kIGV4ZWN1dGlvbiBpZiByZXF1aXJlZFxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5vcHRzLmRlbGF5ICYmXHJcbiAgICAgICAgICAgIHB1YmxpY01ldGhvZCAmJlxyXG4gICAgICAgICAgICBjbWROYW1lICE9PSAnaW5pdCcgJiZcclxuICAgICAgICAgICAgY21kTmFtZSAhPT0gJ3RyYW5zYWN0aW9uJ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBkZWFzeW5jLnNsZWVwKHRoaXMub3B0cy5kZWxheSAqIDEwMDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gdGhyb3cgaWYgYSBjb21tYW5kIGV4ZWN1dGVkIG9uIHVuaXRpYWxpemVkIG1vZHVsZSAoZXhjZXB0IGludGVybmFsIG1ldGhvZHMgYW5kIGEgZmV3IG90aGVyKVxyXG4gICAgICAgIGlmICghbW9kdWxlLmlzSW5pdGlhbGl6ZWQgJiYgcHVibGljTWV0aG9kICYmIGNtZE5hbWUgIT09ICdpbml0JyAmJiBjbWROYW1lICE9PSAndHJhbnNhY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVycm9ySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnTWlzc2luZyAnICsgbW9kdWxlTmFtZSArICcuaW5pdCgpJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBkZWN0eXB0IGFyZ3VtZW50c1xyXG4gICAgICAgIGxldCBkZWNyeXB0ZWRBcmdzID0gdGhpcy5fZ2V0RGVjcnlwdGVkQXJnc0ZvckFwcGx5KGNtZEFyZ3MsIG1vZHVsZU5hbWUpO1xyXG4gICAgICAgIGRlY3J5cHRlZEFyZ3MgPSB0aGlzLl9wb3B1bGF0ZVBhcmFtZXRlcnNWYWx1ZShkZWNyeXB0ZWRBcmdzKTtcclxuXHJcbiAgICAgICAgLy8gcmVwbGFjZSBwYXJhbWV0ZXJzIGluIG1ldGhvZCBhcmd1bWVudHMgd2l0aCBjb3JyZXNwb25kaW5nIHZhbHVlc1xyXG4gICAgICAgIGNtZEFyZ3MgPSB0aGlzLl9wb3B1bGF0ZVBhcmFtZXRlcnNWYWx1ZShjbWRBcmdzKTtcclxuICAgICAgICAvLyBzdGFydCBtZWFzdXJpbmcgbWV0aG9kIGV4ZWN1dGlvbiB0aW1lXHJcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG5cclxuICAgICAgICAvLyBhZGQgY29tbWFuZCBsb2NhdGlvbiBpbmZvcm1hdGlvbiAoZS5nLiBmaWxlIG5hbWUgYW5kIGNvbW1hbmQgbGluZSlcclxuICAgICAgICBsZXQgY21kTG9jYXRpb24gPSBudWxsO1xyXG4gICAgICAgIC8vIGRvIG5vdCByZXBvcnQgcmVzdWx0cyBvciBsaW5lIHVwZGF0ZXMgb24gaW50ZXJuYWwgbWV0aG9kcyAoc3RhcnRlZCB3aXRoICdfJylcclxuICAgICAgICBpZiAocHVibGljTWV0aG9kKSB7XHJcbiAgICAgICAgICAgIGNtZExvY2F0aW9uID0gdGhpcy5fZ2V0Q29tbWFuZExvY2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdEJlZm9yZUNvbW1hbmQoY21kTmFtZSwgbW9kdWxlTmFtZSwgY21kRm4sIGNtZEFyZ3MsIHRoaXMuY3R4LCBjbWRMb2NhdGlvbiwgc3RhcnRUaW1lKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdFeGVjdXRpbmc6ICcgKyBveHV0aWwuZ2V0TWV0aG9kU2lnbmF0dXJlKG1vZHVsZU5hbWUsIGNtZE5hbWUsIGNtZEFyZ3MpKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gZW1pdCBiZWZvcmUgZXZlbnRzXHJcbiAgICAgICAgICAgIGlmIChjbWROYW1lID09PSAnZGlzcG9zZScpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3dyYXBBc3luYyh0aGlzLl9jYWxsU2VydmljZXNPbk1vZHVsZVdpbGxEaXNwb3NlKS5hcHBseSh0aGlzLCBbbW9kdWxlXSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJldHZhbFByb21pc2UgPSB0aGlzLl93cmFwQXN5bmMobW9kdWxlW2NtZE5hbWVdKS5hcHBseShtb2R1bGUsIGRlY3J5cHRlZEFyZ3MpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJldHZhbFByb21pc2UgJiYgcmV0dmFsUHJvbWlzZS50aGVuKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvbWlzZURvbmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR2YWxQcm9taXNlLnRoZW4oKHZhbHVlKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb21pc2VEb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0sIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb21pc2VEb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGRlYXN5bmMubG9vcFdoaWxlKCgpID0+ICFwcm9taXNlRG9uZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR2YWwgPSByZXR2YWxQcm9taXNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY21kTmFtZSA9PT0gJ2luaXQnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl93cmFwQXN5bmModGhpcy5fY2FsbFNlcnZpY2VzT25Nb2R1bGVJbml0aWFsaXplZCkuYXBwbHkodGhpcywgW21vZHVsZV0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgaWYgKGUgJiYgZS5tZXNzYWdlICYmIHR5cGVvZiBlLm1lc3NhZ2UgPT09ICdzdHJpbmcnICYmIGUubWVzc2FnZS5pbmNsdWRlcygnaW52YWxpZCBzZXNzaW9uIGlkJykpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZyBpZiBlcnJvciBvY3VycmVkIGFmdGVyIHRoZSBtb2R1bGUgd2FzIGRpc3Bvc2VkIChvciBpbiBhIHByb2Nlc3Mgb2YgYmVpbmcgZGlzcG9zZWQpXHJcbiAgICAgICAgICAgICAgICAvLyBleGNlcHQgZm9yIGluaXQgbWV0aG9kcyBvZiBjb3Vyc2VcclxuICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgJiZcclxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIG1vZHVsZS5pc0luaXRpYWxpemVkID09PSAnYm9vbGVhbicgJiYgIW1vZHVsZS5pc0luaXRpYWxpemVkKVxyXG4gICAgICAgICAgICAgICAgICAgICYmIGNtZE5hbWUgIT09ICdpbml0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJz09PT0gZXJyb3IgPT09PScsIGUpXHJcbiAgICAgICAgICAgICAgICBlcnJvciA9IGVycm9ySGVscGVyLmdldE94eWdlbkVycm9yKGUsIG1vZHVsZU5hbWUsIGNtZE5hbWUsIGNtZEFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG5cclxuICAgICAgICBsZXQgc3RlcFJlc3VsdDtcclxuICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAocHVibGljTWV0aG9kKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdhaXRJZCA9ICtuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl93YWl0U3RlcFJlc3VsdExpc3QucHVzaCh3YWl0SWQpO1xyXG5cclxuICAgICAgICAgICAgc3RlcFJlc3VsdCA9IHRoaXMuX2dldFN0ZXBSZXN1bHQobW9kdWxlLCBtb2R1bGVOYW1lLCBjbWROYW1lLCBjbWRBcmdzLCBjbWRMb2NhdGlvbiwgc3RhcnRUaW1lLCBlbmRUaW1lLCByZXR2YWwsIGVycm9yKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fd2FpdFN0ZXBSZXN1bHRMaXN0LmluZGV4T2Yod2FpdElkKTtcclxuICAgICAgICAgICAgdGhpcy5fd2FpdFN0ZXBSZXN1bHRMaXN0LnNwbGljZShpbmRleCwgMSk7XHJcblxyXG4gICAgICAgICAgICAvL3N0ZXBSZXN1bHQubG9jYXRpb24gPSBjbWRMb2NhdGlvbjtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0U3RvcmUuc3RlcHMucHVzaChzdGVwUmVzdWx0KTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0QWZ0ZXJDb21tYW5kKGNtZE5hbWUsIG1vZHVsZU5hbWUsIGNtZEZuLCBjbWRBcmdzLCB0aGlzLmN0eCwgY21kTG9jYXRpb24sIGVuZFRpbWUsIHN0ZXBSZXN1bHQpO1xyXG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5pc0ZhdGFsICYmICF0aGlzLm9wdHMuY29udGludWVPbkVycm9yKSB7XHJcbiAgICAgICAgICAgIGlmICghZXJyb3IubG9jYXRpb24gJiYgY21kTG9jYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGVycm9yLmxvY2F0aW9uID0gY21kTG9jYXRpb247XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzdGVwUmVzdWx0ICYmIHN0ZXBSZXN1bHQuZmFpbHVyZSAmJiBzdGVwUmVzdWx0LmZhaWx1cmUubG9jYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGVycm9yLmxvY2F0aW9uID0gc3RlcFJlc3VsdC5mYWlsdXJlLmxvY2F0aW9uO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghcHVibGljTWV0aG9kKSB7XHJcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGVhc3luYy5sb29wV2hpbGUoKCkgPT4gIWRvbmUgJiYgIWVycm9yKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJldHZhbDtcclxuICAgIH1cclxuXHJcbiAgICBfd3JhcEFzeW5jIChmbiwgY29udGV4dCkge1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xyXG4gICAgICAgICAgICB2YXIgc2VsZiA9IGNvbnRleHQgfHwgdGhpcztcclxuICAgICAgICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgY29kZSBpcyBub3QgcnVubmluZyBpbnNpZGUgdGhlIEZpYmVyIGNvbnRleHQsIHRoZW4gcnVuIGFzeW5jIGNvZGUgYXMgc3luYyB1c2luZyBkZWFzeW5jIG1vZHVsZVxyXG4gICAgICAgICAgICBpZiAoIUZpYmVyLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJldHZhbCA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBkb25lID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsVmFsID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocmV0dmFsICYmIHJldHZhbC50aGVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHJldHZhbClcclxuICAgICAgICAgICAgICAgICAgICAudGhlbigodmFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsVmFsID0gdmFsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmaW5hbFZhbCA9IHJldHZhbDtcclxuICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlYXN5bmMubG9vcFdoaWxlKCgpID0+ICFkb25lICYmICFlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLm1lc3NhZ2UgJiYgdHlwZW9mIGUubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKCdyZWFkeVN0YXRlJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIGVycm9yIGFzIGl0IHVzdWFsbHkgaGFwcGVucyBcclxuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIE94eWdlbiBpcyBkaXNwb3NlZCBhbmQgcHJvY2VzcyBpcyBiZWluZyBraWxsZWRcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignZGVhc3luYy5sb29wV2hpbGUoKSBmYWlsZWQ6JywgZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbmFsVmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBlcnJvciA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBkb25lID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCByZXR2YWwgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGlmIHdlIGFyZSBpbnNpZGUgdGhlIEZpYmVyIGNvbnRleHQsIHRoZW4gdXNlIEZpYmVyJ3MgRnV0dXJlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmdXR1cmUgPSBuZXcgRnV0dXJlKCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWwpID0+IGZ1dHVyZS5yZXR1cm4odmFsKSwgKGVycikgPT4gZnV0dXJlLnRocm93KGVycikpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdXR1cmUud2FpdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuXHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGVycm9yID0gZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZGVhc3luYy5sb29wV2hpbGUoKCkgPT4gIWRvbmUgJiYgIWVycm9yKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyByZXRyaWV2ZSBjdXJyZW50IGxpbmUgYW5kIGZ1bmN0aW9uIG5hbWUgZnJvbSB0aGUgY2FsbCBzdGFja1xyXG4gICAgX2dldENvbW1hbmRMb2NhdGlvbigpIHtcclxuICAgICAgICBjb25zdCBzdGFjayA9IF9fc3RhY2s7XHJcbiAgICAgICAgbGV0IGNhbGxlciA9IG51bGw7XHJcbiAgICAgICAgZm9yIChsZXQgY2FsbCBvZiBzdGFjaykge1xyXG4gICAgICAgICAgICBpZiAoX19maWxlbmFtZSA9PT0gY2FsbC5nZXRGaWxlTmFtZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyByZXR1cm4gdGhlIGZpcnN0IGNhbGxlciwgd2hpY2ggaXMgbm90IHRoZSBjdXJyZW50IGZpbGVcclxuICAgICAgICAgICAgY2FsbGVyID0gY2FsbDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjYWxsZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGAke2NhbGxlci5nZXRGaWxlTmFtZSgpfToke2NhbGxlci5nZXRMaW5lTnVtYmVyKCkgKyB0aGlzLmFkanVzdFNjcmlwdExpbmV9OiR7Y2FsbGVyLmdldENvbHVtbk51bWJlcigpfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIF9nZXRTdGVwUmVzdWx0KG1vZHVsZSwgbW9kdWxlTmFtZSwgbWV0aG9kTmFtZSwgYXJncywgbG9jYXRpb24sIHN0YXJ0VGltZSwgZW5kVGltZSwgcmV0dmFsLCBlcnIpIHtcclxuICAgICAgICB2YXIgc3RlcCA9IG5ldyBTdGVwUmVzdWx0KCk7XHJcblxyXG4gICAgICAgIHN0ZXAubmFtZSA9IG94dXRpbC5nZXRNZXRob2RTaWduYXR1cmUobW9kdWxlTmFtZSwgbWV0aG9kTmFtZSwgYXJncyk7XHJcbiAgICAgICAgc3RlcC50cmFuc2FjdGlvbiA9IGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSB8fCBudWxsOyAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogd2h5IGlzIHRoaXMgaGVyZSBpZiBpdCdzIGFscmVhZHkgcG9wdWxhdGVkIGluIHJzP1xyXG4gICAgICAgIHN0ZXAubG9jYXRpb24gPSBsb2NhdGlvbjtcclxuXHJcbiAgICAgICAgaWYgKGVyciAmJiBlcnIudHlwZSAmJiBlcnIudHlwZSA9PT0gZXJyb3JIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9QQVNTRUQpIHtcclxuICAgICAgICAgICAgc3RlcC5zdGF0dXMgPSBTVEFUVVMuUEFTU0VEO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGRldGVybWluZSBzdGVwIHN0YXR1c1xyXG4gICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyLmlzRmF0YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGVwLnN0YXR1cyA9IFNUQVRVUy5GQUlMRUQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGVwLnN0YXR1cyA9IFNUQVRVUy5XQVJOSU5HO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3RlcC5zdGF0dXMgPSBTVEFUVVMuUEFTU0VEO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdGVwLmFjdGlvbiA9ICh0eXBlb2YgbW9kdWxlLl9pc0FjdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IG1vZHVsZS5faXNBY3Rpb24obWV0aG9kTmFtZSkgOiBmYWxzZSk7XHJcbiAgICAgICAgc3RlcC5zdGFydFRpbWUgPSBzdGFydFRpbWU7XHJcbiAgICAgICAgc3RlcC5lbmRUaW1lID0gZW5kVGltZTtcclxuICAgICAgICBzdGVwLmR1cmF0aW9uID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGUuX2dldFN0YXRzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHN0ZXAuc3RhdHMgPSBtb2R1bGUuX2dldFN0YXRzKG1ldGhvZE5hbWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHN0ZXAuc3RhdHMgPSB7fTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgaWYgKGVyciAmJiBlcnIudHlwZSAmJiBlcnIudHlwZSA9PT0gZXJyb3JIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9QQVNTRUQpIHtcclxuICAgICAgICAgICAgICAgIC8vaWdub3JlXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyICYmIGVyci50eXBlICYmIGVyci50eXBlID09PSBlcnJvckhlbHBlci5lcnJvckNvZGUuU0VMRU5JVU1fU0VTU0lPTl9USU1FT1VUKSB7XHJcbiAgICAgICAgICAgICAgICAvL2lnbm9yZVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3RlcC5mYWlsdXJlID0gZXJyb3JIZWxwZXIuZ2V0RmFpbHVyZUZyb21FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICAgICAgc3RlcC5mYWlsdXJlLmxvY2F0aW9uID0gbG9jYXRpb247XHJcbiAgICAgICAgICAgICAgICAvLyBsZXQgdGhlIG1vZHVsZSBkZWNpZGUgd2hldGhlciBhIHNjcmVlbnNob3Qgc2hvdWxkIGJlIHRha2VuIG9uIGVycm9yIG9yIG5vdFxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbW9kdWxlLl90YWtlU2NyZWVuc2hvdFNpbGVudCA9PT0gJ2Z1bmN0aW9uJyAmJiAhdGhpcy5vcHRzLmRpc2FibGVTY3JlZW5zaG90KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5zY3JlZW5zaG90ID0gbW9kdWxlLl90YWtlU2NyZWVuc2hvdFNpbGVudChtZXRob2ROYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGhlcmUsIHdlIHdlcmUgdW5hYmxlIHRvIGdldCBhIHNjcmVlbnNob3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIHdhaXQgZm9yIGEgbW9tZW50IChpbiBQZXJmZWN0byBDbG91ZCwgdGhlIHNjcmVlbnNob3QgbWlnaHQgbm90IGJlIGltbWlkaWF0ZWx5IGF2YWlsYWJsZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVhc3luYy5zbGVlcCgxMDAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAuc2NyZWVuc2hvdCA9IG1vZHVsZS5fdGFrZVNjcmVlbnNob3RTaWxlbnQobWV0aG9kTmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBpbmRpY2F0ZSB0byB1c2VyIHRoYXQgYW4gYXR0ZW1wdCB0byB0YWtlIGEgc2NyZWVuc2hvdCBoYXMgZmFpbGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0ZXA7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2Rpc3Bvc2VTZXJ2aWNlcygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2VydmljZXMgfHwgdHlwZW9mIHRoaXMuc2VydmljZXMgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMuc2VydmljZXMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuc2VydmljZXNba2V5XTtcclxuICAgICAgICAgICAgaWYgKHNlcnZpY2UuZGlzcG9zZSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzZXJ2aWNlLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHNlcnZpY2UgZGlzcG9zYWwgZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGRpc3Bvc2Ugc2VydmljZSAnJHtrZXl9JzpgLCBlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfZGlzcG9zZU1vZHVsZXMoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIGlmICghdGhpcy5tb2R1bGVzIHx8IHR5cGVvZiB0aGlzLm1vZHVsZXMgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMubW9kdWxlcykge1xyXG4gICAgICAgICAgICBjb25zdCBtb2QgPSB0aGlzLm1vZHVsZXNba2V5XTtcclxuXHJcbiAgICAgICAgICAgIGlmIChtb2QuZGlzcG9zZSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNwb3NlUmVzdWx0ID0gbW9kLmRpc3Bvc2Uoc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGlzcG9zZVJlc3VsdCAmJiB0eXBlb2YgZGlzcG9zZVJlc3VsdC50aGVuID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2JhYmx5IGEgcHJvbWlzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBkaXNwb3NlUmVzdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgbW9kdWxlIGRpc3Bvc2FsIGVycm9yIFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZGlzcG9zZSBtb2R1bGUgJyR7a2V5fSc6IGAsIGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgLypcclxuICAgICAqIFNlcnZpY2VzIEV2ZW50IEVtaXR0ZXJzXHJcbiAgICAgKi9cclxuICAgIF9jYWxsU2VydmljZXNPbk1vZHVsZUxvYWRlZChtb2R1bGUpIHtcclxuICAgICAgICBmb3IgKGxldCBzZXJ2aWNlTmFtZSBpbiB0aGlzLnNlcnZpY2VzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnNlcnZpY2VzW3NlcnZpY2VOYW1lXTtcclxuICAgICAgICAgICAgaWYgKCFzZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgc2VydmljZS5vbk1vZHVsZUxvYWRlZChtb2R1bGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNhbGwgXCJvbk1vZHVsZUxvYWRlZFwiIG1ldGhvZCBvZiAke3NlcnZpY2VOYW1lfSBzZXJ2aWNlLmAsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgX2NhbGxTZXJ2aWNlc09uTW9kdWxlSW5pdGlhbGl6ZWQobW9kdWxlKSB7XHJcbiAgICAgICAgZm9yIChsZXQgc2VydmljZU5hbWUgaW4gdGhpcy5zZXJ2aWNlcykge1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV07XHJcbiAgICAgICAgICAgIGlmICghc2VydmljZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHNlcnZpY2Uub25Nb2R1bGVJbml0aWFsaXplZChtb2R1bGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNhbGwgXCJvbk1vZHVsZUluaXRpYWxpemVkXCIgbWV0aG9kIG9mICR7c2VydmljZU5hbWV9IHNlcnZpY2UuYCwgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBfY2FsbFNlcnZpY2VzT25Nb2R1bGVXaWxsRGlzcG9zZShtb2R1bGUpIHtcclxuICAgICAgICBpZiAoIXRoaXMgfHwgIXRoaXMuc2VydmljZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBzZXJ2aWNlTmFtZSBpbiB0aGlzLnNlcnZpY2VzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnNlcnZpY2VzW3NlcnZpY2VOYW1lXTtcclxuICAgICAgICAgICAgaWYgKCFzZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2Uub25Nb2R1bGVXaWxsRGlzcG9zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Nb2R1bGVXaWxsRGlzcG9zZShtb2R1bGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNhbGwgXCJvbk1vZHVsZVdpbGxEaXNwb3NlXCIgbWV0aG9kIG9mICR7c2VydmljZU5hbWV9IHNlcnZpY2UuYCwgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBfcG9wdWxhdGVQYXJhbWV0ZXJzVmFsdWUoYXJncykge1xyXG4gICAgICAgIGlmICghYXJncyB8fCAhQXJyYXkuaXNBcnJheShhcmdzKSB8fCBhcmdzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhcmdzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBfbmV3QXJncyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGFyZyBvZiBhcmdzKSB7XHJcbiAgICAgICAgICAgIF9uZXdBcmdzLnB1c2godGhpcy5fcmVwbGFjZVBhcmFtZXRlckluQXJndW1lbnQoYXJnKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfbmV3QXJncztcclxuICAgIH1cclxuICAgIF9yZXBsYWNlUGFyYW1ldGVySW5Bcmd1bWVudChhcmcpIHtcclxuICAgICAgICBpZiAoYXJnICYmIHR5cGVvZiBhcmcuZ2V0RGVjcnlwdFJlc3VsdCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICByZXR1cm4gJ0VOQ1JZUFRFRCc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWFyZyB8fCB0eXBlb2YgYXJnICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICByZXR1cm4gYXJnO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyByZXBsYWNlIHVzZXIgcGFyYW1ldGVycyB3aXRoIHZhbHVlc1xyXG4gICAgICAgIC8vIG5vdGU6IHVzZXIgcGFyYW1ldGVyIHdpdGggdGhlIHNhbWUgbmFtZSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgZW52aXJvbm1lbnQgdmFyaWFibGVcclxuICAgICAgICBmb3IgKGxldCBwYXJhbU5hbWUgaW4gdGhpcy5jdHgucGFyYW1zKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN0eC5wYXJhbXMuaGFzT3duUHJvcGVydHkocGFyYW1OYW1lKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1WYWx1ZSA9IHRoaXMuY3R4LnBhcmFtc1twYXJhbU5hbWVdO1xyXG4gICAgICAgICAgICAgICAgYXJnID0gYXJnLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFxcXCR7JyArIHBhcmFtTmFtZSArICd9JywgJ2cnKSwgcGFyYW1WYWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVwbGFjZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2l0aCB2YWx1ZXNcclxuICAgICAgICBmb3IgKGxldCBlbnZOYW1lIGluIHRoaXMuY3R4LmVudikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jdHguZW52Lmhhc093blByb3BlcnR5KGVudk5hbWUpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbnZWYWx1ZSA9IHRoaXMuY3R4LmVudltlbnZOYW1lXTtcclxuICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFwkeycgKyBlbnZOYW1lICsgJ30nLCAnZycpLCBlbnZWYWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFyZztcclxuICAgIH1cclxuICAgIF9nZXRBbGxQcm9wZXJ0eU5hbWVzKCBvYmogKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSBbXTtcclxuXHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyggb2JqICkuZm9yRWFjaChmdW5jdGlvbiAoIHByb3AgKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIHByb3BzLmluZGV4T2YoIHByb3AgKSA9PT0gLTEgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMucHVzaCggcHJvcCApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbmQtYXNzaWduXHJcbiAgICAgICAgfSB3aGlsZSAoIG9iaiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiggb2JqICkgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHByb3BzO1xyXG4gICAgfVxyXG5cclxuICAgIF9jaGVja1N0ZXBSZXN1bHQocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRTdGVwUmVzdWx0TGlzdC5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrU3RlcFJlc3VsdChyZXNvbHZlLCByZWplY3QpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfd2FpdFN0ZXBSZXN1bHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fY2hlY2tTdGVwUmVzdWx0KHJlc29sdmUsIHJlamVjdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2dldERlY3J5cHRlZEFyZ3NGb3JBcHBseShhcmdzLCBtb2R1bGVOYW1lKSB7XHJcbiAgICAgICAgaWYgKCFhcmdzIHx8ICFBcnJheS5pc0FycmF5KGFyZ3MpIHx8IGFyZ3MubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFyZ3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IF9uZXdBcmdzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgYXJnIG9mIGFyZ3MpIHtcclxuICAgICAgICAgICAgX25ld0FyZ3MucHVzaCh0aGlzLl9kZWNyeXB0UGFyYW1ldGVyRm9yQXBwbHlJbkFyZ3VtZW50KGFyZywgbW9kdWxlTmFtZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX25ld0FyZ3M7XHJcbiAgICB9XHJcblxyXG4gICAgX2RlY3J5cHRQYXJhbWV0ZXJGb3JBcHBseUluQXJndW1lbnQoYXJnLCBtb2R1bGVOYW1lKSB7XHJcbiAgICAgICAgaWYgKGFyZyAmJiB0eXBlb2YgYXJnLmdldERlY3J5cHRSZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgaWYgKG1vZHVsZU5hbWUgPT09ICdsb2cnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0VOQ1JZUFRFRCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJnLmdldERlY3J5cHRSZXN1bHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGFyZztcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
927
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL094eWdlbkNvcmUuanMiXSwibmFtZXMiOlsiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnbG9iYWwiLCJnZXQiLCJvcmlnIiwiRXJyb3IiLCJwcmVwYXJlU3RhY2tUcmFjZSIsIl8iLCJzdGFjayIsImVyciIsImNhcHR1cmVTdGFja1RyYWNlIiwiREVGQVVMVF9USU1FT1VUIiwiREVGQVVMVF9PUFRTIiwiYmFja3RyYWNlIiwiY29tcGlsZXIiLCJmYWlsQW1iaWd1b3VzRGVmaW5pdGlvbnMiLCJmYWlsRmFzdCIsImlnbm9yZVVuZGVmaW5lZERlZmluaXRpb25zIiwibmFtZSIsInByb2ZpbGUiLCJyZXF1aXJlIiwib3JkZXIiLCJzbmlwcGV0U3ludGF4IiwidW5kZWZpbmVkIiwic25pcHBldHMiLCJzb3VyY2UiLCJzdHJpY3QiLCJ0YWdFeHByZXNzaW9uIiwidGFnc0luVGl0bGUiLCJ0aW1lb3V0IiwiTU9EVUxFX05BTUVfTUFUQ0hfUkVHRVgiLCJTRVJWSUNFX05BTUVfTUFUQ0hfUkVHRVgiLCJET19OT1RfV1JBUF9NRVRIT0RTIiwiREVGQVVMVF9DVFgiLCJwYXJhbXMiLCJ2YXJzIiwiZW52IiwiY2FwcyIsIkRFRkFVTFRfUkVTVUxUX1NUT1JFIiwic3RlcHMiLCJsb2dzIiwiaGFyIiwiT3h5Z2VuIiwiT3h5Z2VuRXZlbnRzIiwiY29uc3RydWN0b3IiLCJpc0luaXRpYWxpemVkIiwicmVzdWx0U3RvcmUiLCJjdHgiLCJtb2R1bGVzIiwic2VydmljZXMiLCJyZXBvIiwiY2FwYWJpbGl0aWVzIiwib3B0cyIsIm94QmFzZURpciIsInBhdGgiLCJqb2luIiwiX19kaXJuYW1lIiwibG9nZ2VyIiwiX3dyYXBMb2dnZXIiLCJfd2FpdFN0ZXBSZXN1bHRMaXN0IiwiaW5pdCIsIm9wdGlvbnMiLCJyZXN1bHRzIiwiYXNzaWduIiwiY3dkIiwicHJvY2VzcyIsIm1ha2VPeEdsb2JhbCIsIl9sb2FkU2VydmljZXMiLCJfbG9hZE1vZHVsZXMiLCJnbG9iYWxTY29wZSIsIm1ha2VDb250ZXh0QW5kTW9kdWxlc0dsb2JhbCIsImRpc3Bvc2VNb2R1bGVzIiwic3RhdHVzIiwiX2Rpc3Bvc2VNb2R1bGVzIiwiZSIsImNvbnNvbGUiLCJlcnJvciIsImRpc3Bvc2UiLCJfZGlzcG9zZVNlcnZpY2VzIiwiYWRqdXN0U2NyaXB0TGluZSIsImlzSW5EZWJ1Z01vZGUiLCJveHV0aWwiLCJyZXN1bHQiLCJjb250ZXh0Iiwib3giLCJyZXBvc2l0b3J5IiwidHJhbnNTdGVwIiwiaW5jbHVkZXMiLCJ0cmFuc05hbWUiLCJ0cmFuc2FjdGlvbiIsImR1cmF0aW9uIiwic3RlcCIsImVuZFRpbWUiLCJnZXRNb2R1bGVzQ2FwYWJpbGl0aWVzIiwibW9kQ2FwcyIsIm1vZHVsZU5hbWUiLCJtb2R1bGUiLCJfZ2V0Q2FwYWJpbGl0aWVzIiwia2V5cyIsImxlbmd0aCIsInJlc2V0UmVzdWx0cyIsIm9uQmVmb3JlQ2FzZSIsIl9pdGVyYXRpb25TdGFydCIsIm9uQWZ0ZXJDYXNlIiwiX2l0ZXJhdGlvbkVuZCIsImxvYWRQYWdlT2JqZWN0RmlsZSIsInBvUGF0aCIsInBvIiwiX2xvZ2dlciIsImxvZ2dlcldyYXAiLCJpbmZvIiwiYXJncyIsIl9sb2ciLCJkZWJ1ZyIsIndhcm4iLCJ1c2VySW5mbyIsIklTU1VFUlMiLCJVU0VSIiwidXNlckRlYnVnIiwidXNlckVycm9yIiwidXNlcldhcm4iLCJsZXZlbCIsInNyYyIsIkRFRkFVTFRfTE9HR0VSX0lTU1VFUiIsImFwcGx5IiwibWVzc2FnZSIsInN0cmluZ2lmeSIsInRpbWUiLCJnZXRUaW1lU3RhbXAiLCJwdXNoIiwidG9VcHBlckNhc2UiLCJtc2ciLCJzaGlmdCIsImVtaXRMb2ciLCJveFNlcnZpY2VzRGlyUGF0aCIsInJlc29sdmUiLCJzZXJ2aWNlRmlsZXMiLCJnbG9iIiwic3luYyIsImkiLCJzZXJ2aWNlRmlsZU5hbWUiLCJzZXJ2aWNlRmlsZVBhdGgiLCJtYXRjaCIsInNlcnZpY2VOYW1lIiwiQXJyYXkiLCJpc0FycmF5Iiwic2VydmljZSIsIl9sb2FkU2VydmljZSIsIkVPTCIsInN0YWNrdHJhY2UiLCJzZXJ2aWNlUGF0aCIsIlNlcnZpY2VDbGFzcyIsImRlZmF1bHQiLCJzZXJ2aWNlTG9nZ2VyIiwiX2xvYWRJbnRlcm5hbE1vZHVsZXMiLCJfbG9hZEV4dGVybmFsTW9kdWxlcyIsIm1vZHVsZXNGb2xkZXJQYXRoIiwibW9kdWxlc19leHQiLCJveE1vZHVsZXNEaXJQYXRoIiwiZnMiLCJleGlzdHNTeW5jIiwibW9kdWxlRmlsZXMiLCJmb3JFYWNoIiwibW9kdWxlRmlsZU5hbWUiLCJzdGFydFRpbWUiLCJEYXRlIiwibW9kdWxlTG9nZ2VyIiwibW9kIiwiY29yZVV0aWxzIiwibG9hZE1vZHVsZUZyb21GaWxlIiwiX2NhbGxTZXJ2aWNlc09uTW9kdWxlTG9hZGVkIiwiX3dyYXBNb2R1bGUiLCJleGNsdWRlVW5kZWZpbmVkTW9kcyIsImdldE94TW9kdWxlc0RpciIsIm1vZHVsZXNGaWxlcyIsIm1vZHVsZVBhdGgiLCJNb2R1bGVDbGFzcyIsImxvYWRNb2R1bGVGcm9tQ2xhc3MiLCJ3cmFwcGVyIiwiX3RoaXMiLCJtb2R1bGVNZXRob2RzIiwic29tZSIsIngiLCJfZ2V0QWxsUHJvcGVydHlOYW1lcyIsIm1ldGhvZE5hbWUiLCJtZXRob2QiLCJGdW5jdGlvbiIsIk94eWdlblN1Yk1vZHVsZSIsImJpbmQiLCJpbmRleE9mIiwicHJvdG90eXBlIiwic2xpY2UiLCJjYWxsIiwiYXJndW1lbnRzIiwiZ2V0TWV0aG9kU2lnbmF0dXJlIiwiZXJyb3JIZWxwZXIiLCJnZXRPeHlnZW5FcnJvciIsIl9jb21tYW5kV3JhcHBlciIsIk94RXJyb3IiLCJjbWROYW1lIiwiY21kQXJncyIsInJldHZhbCIsImNtZEZuIiwicHVibGljTWV0aG9kIiwic3RhcnRzV2l0aCIsImRlbGF5Iiwic2xlZXAiLCJlcnJvckNvZGUiLCJNT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SIiwiZGVjcnlwdGVkQXJncyIsIl9nZXREZWNyeXB0ZWRBcmdzRm9yQXBwbHkiLCJfcG9wdWxhdGVQYXJhbWV0ZXJzVmFsdWUiLCJjbWRMb2NhdGlvbiIsIl9nZXRDb21tYW5kTG9jYXRpb24iLCJlbWl0QmVmb3JlQ29tbWFuZCIsIl93cmFwQXN5bmMiLCJfY2FsbFNlcnZpY2VzT25Nb2R1bGVXaWxsRGlzcG9zZSIsIl9jYWxsU2VydmljZXNPbk1vZHVsZUluaXRpYWxpemVkIiwic3RlcFJlc3VsdCIsIndhaXRJZCIsIl9nZXRTdGVwUmVzdWx0IiwiaW5kZXgiLCJzcGxpY2UiLCJlbWl0QWZ0ZXJDb21tYW5kIiwiaXNGYXRhbCIsImNvbnRpbnVlT25FcnJvciIsImxvY2F0aW9uIiwiZmFpbHVyZSIsImZuIiwic2VsZiIsIl9fc3RhY2siLCJjYWxsZXIiLCJfX2ZpbGVuYW1lIiwiZ2V0RmlsZU5hbWUiLCJnZXRMaW5lTnVtYmVyIiwiZ2V0Q29sdW1uTnVtYmVyIiwiU3RlcFJlc3VsdCIsIl9sYXN0VHJhbnNhY3Rpb25OYW1lIiwidHlwZSIsIkFTU0VSVF9QQVNTRUQiLCJTVEFUVVMiLCJQQVNTRUQiLCJGQUlMRUQiLCJXQVJOSU5HIiwiYWN0aW9uIiwiX2lzQWN0aW9uIiwiX2dldFN0YXRzIiwic3RhdHMiLCJTRUxFTklVTV9TRVNTSU9OX1RJTUVPVVQiLCJnZXRGYWlsdXJlRnJvbUVycm9yIiwiX3Rha2VTY3JlZW5zaG90U2lsZW50IiwiZGlzYWJsZVNjcmVlbnNob3QiLCJzY3JlZW5zaG90Iiwia2V5Iiwib25Nb2R1bGVMb2FkZWQiLCJvbk1vZHVsZUluaXRpYWxpemVkIiwib25Nb2R1bGVXaWxsRGlzcG9zZSIsIl9uZXdBcmdzIiwiYXJnIiwiX3JlcGxhY2VQYXJhbWV0ZXJJbkFyZ3VtZW50IiwiZ2V0RGVjcnlwdFJlc3VsdCIsInBhcmFtTmFtZSIsImhhc093blByb3BlcnR5IiwicGFyYW1WYWx1ZSIsInJlcGxhY2UiLCJSZWdFeHAiLCJlbnZOYW1lIiwiZW52VmFsdWUiLCJvYmoiLCJwcm9wcyIsImdldE93blByb3BlcnR5TmFtZXMiLCJwcm9wIiwiZ2V0UHJvdG90eXBlT2YiLCJfY2hlY2tTdGVwUmVzdWx0IiwicmVqZWN0IiwiX3dhaXRTdGVwUmVzdWx0IiwiUHJvbWlzZSIsIl9kZWNyeXB0UGFyYW1ldGVyRm9yQXBwbHlJbkFyZ3VtZW50Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7Ozs7Ozs7QUFHQUEsTUFBTSxDQUFDQyxjQUFQLENBQXNCQyxNQUF0QixFQUE4QixTQUE5QixFQUF5QztBQUNyQ0MsRUFBQUEsR0FBRyxFQUFFLFlBQVk7QUFDYixRQUFJQyxJQUFJLEdBQUdDLEtBQUssQ0FBQ0MsaUJBQWpCOztBQUNBRCxJQUFBQSxLQUFLLENBQUNDLGlCQUFOLEdBQTBCLFVBQVVDLENBQVYsRUFBYUMsS0FBYixFQUFvQjtBQUFFLGFBQU9BLEtBQVA7QUFBZSxLQUEvRDs7QUFDQSxRQUFJQyxHQUFHLEdBQUcsSUFBSUosS0FBSixFQUFWO0FBQ0FBLElBQUFBLEtBQUssQ0FBQ0ssaUJBQU4sQ0FBd0JELEdBQXhCO0FBQ0EsUUFBSUQsS0FBSyxHQUFHQyxHQUFHLENBQUNELEtBQWhCO0FBQ0FILElBQUFBLEtBQUssQ0FBQ0MsaUJBQU4sR0FBMEJGLElBQTFCO0FBQ0EsV0FBT0ksS0FBUDtBQUNIO0FBVG9DLENBQXpDO0FBWUEsTUFBTUcsZUFBZSxHQUFHLEtBQXhCO0FBQ0EsTUFBTUMsWUFBWSxHQUFHO0FBQ2pCQyxFQUFBQSxTQUFTLEVBQUUsS0FETTtBQUVqQkMsRUFBQUEsUUFBUSxFQUFFLEVBRk87QUFHakJDLEVBQUFBLHdCQUF3QixFQUFFLEtBSFQ7QUFJakJDLEVBQUFBLFFBQVEsRUFBRSxLQUpPO0FBS2pCQyxFQUFBQSwwQkFBMEIsRUFBRSxLQUxYO0FBTWpCQyxFQUFBQSxJQUFJLEVBQUUsRUFOVztBQU9qQkMsRUFBQUEsT0FBTyxFQUFFLEVBUFE7QUFRakJDLEVBQUFBLE9BQU8sRUFBRSxFQVJRO0FBU2pCQyxFQUFBQSxLQUFL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QUFDbkIsR0FBRCxFQUFNbkssVUFBTixFQUFrQjtBQUNqRCxRQUFJbUssR0FBRyxJQUFJLE9BQU9BLEdBQUcsQ0FBQ0UsZ0JBQVgsS0FBZ0MsVUFBM0MsRUFBdUQ7QUFDbkQsVUFBSXJLLFVBQVUsS0FBSyxLQUFuQixFQUEwQjtBQUN0QixlQUFPLFdBQVA7QUFDSCxPQUZELE1BRU87QUFDSCxlQUFPbUssR0FBRyxDQUFDRSxnQkFBSixFQUFQO0FBQ0g7QUFDSjs7QUFFRCxXQUFPRixHQUFQO0FBQ0g7O0FBbDBCNEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90b3R5cGUtYnVpbHRpbnMgKi9cclxuaW1wb3J0IGdsb2IgZnJvbSAnZ2xvYic7XHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xyXG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XHJcbmltcG9ydCBTdGVwUmVzdWx0IGZyb20gJy4uL21vZGVsL3N0ZXAtcmVzdWx0JztcclxuaW1wb3J0IE94eWdlbkV2ZW50cyBmcm9tICcuL094eWdlbkV2ZW50cyc7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi4vbGliL3V0aWwnO1xyXG5pbXBvcnQgKiBhcyBjb3JlVXRpbHMgZnJvbSAnLi91dGlscyc7XHJcbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IFNUQVRVUyBmcm9tICcuLi9tb2RlbC9zdGF0dXMuanMnO1xyXG5cclxuLy8gc2V0dXAgbG9nZ2VyXHJcbmltcG9ydCBsb2dnZXIsIHsgREVGQVVMVF9MT0dHRVJfSVNTVUVSLCBJU1NVRVJTIH0gZnJvbSAnLi4vbGliL2xvZ2dlcic7XHJcbmltcG9ydCB7IE94eWdlblN1Yk1vZHVsZSB9IGZyb20gJy4vT3h5Z2VuU3ViTW9kdWxlJztcclxuXHJcbi8qZ2xvYmFsIF9fc3RhY2sqL1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsLCAnX19zdGFjaycsIHtcclxuICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBvcmlnID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7XHJcbiAgICAgICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBmdW5jdGlvbiAoXywgc3RhY2spIHsgcmV0dXJuIHN0YWNrOyB9O1xyXG4gICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoKTtcclxuICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIpO1xyXG4gICAgICAgIHZhciBzdGFjayA9IGVyci5zdGFjaztcclxuICAgICAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IG9yaWc7XHJcbiAgICAgICAgcmV0dXJuIHN0YWNrO1xyXG4gICAgfVxyXG59KTtcclxuXHJcbmNvbnN0IERFRkFVTFRfVElNRU9VVCA9IDMwMDAwO1xyXG5jb25zdCBERUZBVUxUX09QVFMgPSB7XHJcbiAgICBiYWNrdHJhY2U6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gc2hvdyBmdWxsIGJhY2t0cmFjZSBmb3IgZXJyb3JzXHJcbiAgICBjb21waWxlcjogW10sIC8vIDxzdHJpbmdbXT4gKFwiZXh0ZW5zaW9uOm1vZHVsZVwiKSByZXF1aXJlIGZpbGVzIHdpdGggdGhlIGdpdmVuIEVYVEVOU0lPTiBhZnRlciByZXF1aXJpbmcgTU9EVUxFIChyZXBlYXRhYmxlKVxyXG4gICAgZmFpbEFtYmlndW91c0RlZmluaXRpb25zOiBmYWxzZSwgLy8gPGJvb2xlYW4+IHRyZWF0IGFtYmlndW91cyBkZWZpbml0aW9ucyBhcyBlcnJvcnNcclxuICAgIGZhaWxGYXN0OiBmYWxzZSwgLy8gPGJvb2xlYW4+IGFib3J0IHRoZSBydW4gb24gZmlyc3QgZmFpbHVyZVxyXG4gICAgaWdub3JlVW5kZWZpbmVkRGVmaW5pdGlvbnM6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gdHJlYXQgdW5kZWZpbmVkIGRlZmluaXRpb25zIGFzIHdhcm5pbmdzXHJcbiAgICBuYW1lOiBbXSwgLy8gPFJFR0VYUFtdPiBvbmx5IGV4ZWN1dGUgdGhlIHNjZW5hcmlvcyB3aXRoIG5hbWUgbWF0Y2hpbmcgdGhlIGV4cHJlc3Npb24gKHJlcGVhdGFibGUpXHJcbiAgICBwcm9maWxlOiBbXSwgLy8gPHN0cmluZz4gKG5hbWUpIHNwZWNpZnkgdGhlIHByb2ZpbGUgdG8gdXNlXHJcbiAgICByZXF1aXJlOiBbXSwgLy8gPHN0cmluZz4gKGZpbGUvZGlyL2dsb2IpIHJlcXVpcmUgZmlsZXMgYmVmb3JlIGV4ZWN1dGluZyBmZWF0dXJlc1xyXG4gICAgb3JkZXI6ICdkZWZpbmVkJywgLy8gPHN0cmluZz4gc3dpdGNoIGJldHdlZW4gZGV0ZXJtaW5pc3RpYyAgYW5kIHJhbmRvbSBmZWF0dXJlIGV4ZWN1dGlvbi4gRWl0aGVyIFwiZGVmaW5lZFwiLCBcInJhbmRvbVwiIG9yIFwicmFuZG9tOjQyXCIgd2hlcmVhcyA0MiBpcyB0aGUgc2VlZCBmb3IgcmFuZG9taXphdGlvblxyXG4gICAgc25pcHBldFN5bnRheDogdW5kZWZpbmVkLCAvLyA8c3RyaW5nPiBzcGVjaWZ5IGEgY3VzdG9tIHNuaXBwZXQgc3ludGF4XHJcbiAgICBzbmlwcGV0czogdHJ1ZSwgLy8gPGJvb2xlYW4+IGhpZGUgc3RlcCBkZWZpbml0aW9uIHNuaXBwZXRzIGZvciBwZW5kaW5nIHN0ZXBzXHJcbiAgICBzb3VyY2U6IHRydWUsIC8vIDxib29sZWFuPiBoaWRlIHNvdXJjZSB1cmlzXHJcbiAgICBzdHJpY3Q6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gZmFpbCBpZiB0aGVyZSBhcmUgYW55IHVuZGVmaW5lZCBvciBwZW5kaW5nIHN0ZXBzXHJcbiAgICB0YWdFeHByZXNzaW9uOiAnJywgLy8gPHN0cmluZz4gKGV4cHJlc3Npb24pIG9ubHkgZXhlY3V0ZSB0aGUgZmVhdHVyZXMgb3Igc2NlbmFyaW9zIHdpdGggdGFncyBtYXRjaGluZyB0aGUgZXhwcmVzc2lvblxyXG4gICAgdGFnc0luVGl0bGU6IGZhbHNlLCAvLyA8Ym9vbGVhbj4gYWRkIGN1Y3VtYmVyIHRhZ3MgdG8gZmVhdHVyZSBvciBzY2VuYXJpbyBuYW1lXHJcbiAgICB0aW1lb3V0OiBERUZBVUxUX1RJTUVPVVQgLy8gPG51bWJlcj4gdGltZW91dCBmb3Igc3RlcCBkZWZpbml0aW9ucyBpbiBtaWxsaXNlY29uZHNcclxufTtcclxuY29uc3QgTU9EVUxFX05BTUVfTUFUQ0hfUkVHRVggPSAvXm1vZHVsZS0oLis/KVxcLmpzJC87XHJcbmNvbnN0IFNFUlZJQ0VfTkFNRV9NQVRDSF9SRUdFWCA9IC9ec2VydmljZS0oLis/KVxcLmpzJC87XHJcbmNvbnN0IERPX05PVF9XUkFQX01FVEhPRFMgPSBbJ2RyaXZlcicsICdnZXREcml2ZXInXTtcclxuXHJcbmNvbnN0IERFRkFVTFRfQ1RYID0ge1xyXG4gICAgcGFyYW1zOiB7fSxcclxuICAgIHZhcnM6IHt9LFxyXG4gICAgZW52OiB7fSxcclxuICAgIGNhcHM6IHt9XHJcbn07XHJcbmNvbnN0IERFRkFVTFRfUkVTVUxUX1NUT1JFID0ge1xyXG4gICAgc3RlcHM6IFtdLFxyXG4gICAgbG9nczogW10sXHJcbiAgICBoYXI6IG51bGxcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE94eWdlbiBleHRlbmRzIE94eWdlbkV2ZW50cyB7XHJcbiAgICBjb25zdHJ1Y3RvciAoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnJlc3VsdFN0b3JlID0geyAuLi5ERUZBVUxUX1JFU1VMVF9TVE9SRSB9O1xyXG4gICAgICAgIHRoaXMuY3R4ID0geyAuLi5ERUZBVUxUX0NUWCB9O1xyXG4gICAgICAgIHRoaXMubW9kdWxlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuc2VydmljZXMgPSB7fTtcclxuICAgICAgICB0aGlzLnJlcG8gPSB7fTtcclxuICAgICAgICB0aGlzLmNhcGFiaWxpdGllcyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5vcHRzID0gbnVsbDtcclxuICAgICAgICB0aGlzLm94QmFzZURpciA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8nKTtcclxuICAgICAgICB0aGlzLmxvZ2dlciA9IHRoaXMuX3dyYXBMb2dnZXIobG9nZ2VyKCdPeHlnZW4nKSk7XHJcbiAgICAgICAgdGhpcy5fd2FpdFN0ZXBSZXN1bHRMaXN0ID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdChvcHRpb25zLCBjYXBzLCBjdHggPSB7fSwgcmVzdWx0cyA9IHt9KSB7XHJcbiAgICAgICAgdGhpcy5vcHRzID0gT2JqZWN0LmFzc2lnbihERUZBVUxUX09QVFMsIG9wdGlvbnMpO1xyXG4gICAgICAgIHRoaXMuY3dkID0gdGhpcy5vcHRzLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpO1xyXG4gICAgICAgIHRoaXMuY3R4ID0gT2JqZWN0LmFzc2lnbihERUZBVUxUX0NUWCwgY3R4IHx8IHt9KTtcclxuICAgICAgICB0aGlzLmN0eC5jYXBzID0geyAuLi5jdHguY2FwcyB8fCB7fSwgLi4uY2FwcywgfTtcclxuICAgICAgICB0aGlzLnJlc3VsdFN0b3JlID0gT2JqZWN0LmFzc2lnbihERUZBVUxUX1JFU1VMVF9TVE9SRSwgcmVzdWx0cyB8fCB7fSk7XHJcbiAgICAgICAgdGhpcy5jYXBhYmlsaXRpZXMgPSB0aGlzLmN0eC5jYXBzID0gY2FwcztcclxuXHJcbiAgICAgICAgLy8gZGVmaW5lICdveCcgb2JqZWN0IGluIGdsb2JhbCBKUyBzY29wZVxyXG4gICAgICAgIC8vIHdlIHdpbGwgdXNlIHRoaXMgb2JqZWN0IHRvIGFjY2VzcyBPeHlnZW4gbW9kdWxlcyBhbmQgdGVzdCBjb250ZXh0IGZyb20gbW9kdWxlcyB1c2VkIGluIHRoZSB0ZXN0IChpZiBhbnkpICAgICAgICBcclxuICAgICAgICB0aGlzLm1ha2VPeEdsb2JhbCgpO1xyXG4gICAgICAgIC8vIGxvYWQgc2VydmljZXNcclxuICAgICAgICB0aGlzLl9sb2FkU2VydmljZXMoKTtcclxuICAgICAgICAvLyBsb2FkIG1vZHVsZXNcclxuICAgICAgICB0aGlzLl9sb2FkTW9kdWxlcygpO1xyXG4gICAgICAgIC8vIGlmIG9wdGlvbnMubWFrZU1vZHVsZXNHbG9iYWwgaXMgdHJ1ZSBvciB1bmRlZmluZWQgdGhhbiBkZWZpbmUgJ2N0eCcgY29udGVudCBhbmQgZWFjaCBtb2R1bGUgaW4gZ2xvYmFsIHNjb3BlXHJcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmdsb2JhbFNjb3BlID09PSAndW5kZWZpbmVkJyB8fCBvcHRpb25zLmdsb2JhbFNjb3BlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWFrZUNvbnRleHRBbmRNb2R1bGVzR2xvYmFsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGlzcG9zZU1vZHVsZXMoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2Rpc3Bvc2VNb2R1bGVzKHN0YXR1cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkaXNwb3NlIG1vZHVsZXM6ICcsIGUpO1xyXG4gICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kaXNwb3NlTW9kdWxlcyhzdGF0dXMpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kaXNwb3NlU2VydmljZXMoKTtcclxuICAgICAgICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGlzcG9zZTogJywgZSk7XHJcbiAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBhZGp1c3RTY3JpcHRMaW5lKCkge1xyXG4gICAgICAgIGNvbnN0IGlzSW5EZWJ1Z01vZGUgPSBveHV0aWwuaXNJbkRlYnVnTW9kZSgpO1xyXG4gICAgICAgIC8vIGFkZCBleHRyYSBsaW5lIGlmIHdlIGFyZSBydW5uaW5nIGluIGRlYnVnZ2VyIG1vZGUgKFY4IGRlYnVnZ2VyIGFkZHMgYW4gZXh0cmEgbGluZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlKVxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGlzSW5EZWJ1Z01vZGUgPyAtMSA6IDA7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29udGV4dCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jdHg7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGNvbnRleHQoY3R4KSB7XHJcbiAgICAgICAgdGhpcy5jdHggPSBjdHg7XHJcbiAgICAgICAgaWYgKGdsb2JhbC5veCkge1xyXG4gICAgICAgICAgICBnbG9iYWwub3guY3R4ID0gY3R4O1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0cy5nbG9iYWxTY29wZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5vcHRzLmdsb2JhbFNjb3BlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgXCJwYXJhbXNcIiBhbmQgXCJlbnZcIiBpbiBcIm94XCIgZ2xvYmFsIHZhcmlhYmxlXHJcbiAgICAgICAgICAgICAgICBnbG9iYWwucGFyYW1zID0gY3R4LnBhcmFtcyB8fCB7fTtcclxuICAgICAgICAgICAgICAgIGdsb2JhbC5lbnYgPSBjdHguZW52IHx8IHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCByZXBvc2l0b3J5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlcG87XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHJlcG9zaXRvcnkocmVwbykge1xyXG4gICAgICAgIHRoaXMucmVwbyA9IHJlcG87XHJcbiAgICAgICAgaWYgKGdsb2JhbC5veCkge1xyXG4gICAgICAgICAgICBnbG9iYWwub3gucmVwbyA9IHJlcG87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCByZXN1bHRzKCkge1xyXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aW1lIGZvciB0aGUgdHJhbnNhY3Rpb24gaXRzZWxmIC0gc3VtbWFyeSBvZiBkdXJhdGlvbnMgZm9yIGFsbCB0aGUgc3RlcHMgaW4gdGhpcyB0cmFuc2FjdGlvblxyXG4gICAgICAgIC8vIGFsc28gYWRqdXN0IHRyYW5zYWN0aW9uIGVuZCB0aW1lIHRvIG11Y2ggZW5kIHRpbWUgZm9yIHRoZSBsYXN0IGV4ZWN1dGVkIHN0ZXAgd2l0aGluIHRoaXMgdHJhbnNhY3Rpb24uXHJcbiAgICAgICAgZm9yIChjb25zdCB0cmFuc1N0ZXAgb2YgdGhpcy5yZXN1bHRTdG9yZS5zdGVwcykge1xyXG4gICAgICAgICAgICBpZiAodHJhbnNTdGVwLm5hbWUuaW5jbHVkZXMoJy50cmFuc2FjdGlvbicpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc05hbWUgPSB0cmFuc1N0ZXAudHJhbnNhY3Rpb247XHJcbiAgICAgICAgICAgICAgICB0cmFuc1N0ZXAuZHVyYXRpb24gPSAwO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHRoaXMucmVzdWx0U3RvcmUuc3RlcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gJiBpcyBub3QgdGhlIHRyYW5zYWN0aW9uIHN0ZXBcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcC50cmFuc2FjdGlvbiA9PT0gdHJhbnNOYW1lICYmIHN0ZXAgIT09IHRyYW5zU3RlcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1N0ZXAuZHVyYXRpb24gKz0gc3RlcC5kdXJhdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXAuZW5kVGltZSA+IHRyYW5zU3RlcC5lbmRUaW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1N0ZXAuZW5kVGltZSA9IHN0ZXAuZW5kVGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRTdG9yZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNb2R1bGVzQ2FwYWJpbGl0aWVzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5tb2R1bGVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBtb2RDYXBzID0ge307XHJcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdO1xyXG4gICAgICAgICAgICBpZiAobW9kdWxlLm5hbWUgJiYgbW9kdWxlLl9nZXRDYXBhYmlsaXRpZXMgJiYgdHlwZW9mIG1vZHVsZS5fZ2V0Q2FwYWJpbGl0aWVzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjYXBzID0gbW9kdWxlLl9nZXRDYXBhYmlsaXRpZXMoKTtcclxuICAgICAgICAgICAgICAgIC8vIHN0b3JlIG9ubHkgbm9uLWVtcHR5IGNhcHMgcGVyIG1vZHVsZSB0aGF0IGhhcyB0aGlzLmNhcHMgcHJvcGVydHlcclxuICAgICAgICAgICAgICAgIGlmIChjYXBzICYmIHR5cGVvZiBjYXBzID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhjYXBzKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kQ2Fwc1ttb2R1bGUubmFtZV0gPSBjYXBzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtb2RDYXBzO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0UmVzdWx0cygpIHtcclxuICAgICAgICB0aGlzLnJlc3VsdFN0b3JlLnN0ZXBzID0gW107XHJcbiAgICAgICAgdGhpcy5yZXN1bHRTdG9yZS5sb2dzID0gW107XHJcbiAgICAgICAgdGhpcy5oYXIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQmVmb3JlQ2FzZShjb250ZXh0KSB7XHJcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIW1vZHVsZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIG1vZHVsZS5vbkJlZm9yZUNhc2UgJiYgYXdhaXQgbW9kdWxlLm9uQmVmb3JlQ2FzZShjb250ZXh0KTtcclxuICAgICAgICAgICAgICAgIG1vZHVsZS5faXRlcmF0aW9uU3RhcnQgJiYgYXdhaXQgbW9kdWxlLl9pdGVyYXRpb25TdGFydCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNhbGwgXCJvbkJlZm9yZUNhc2VcIiBtZXRob2Qgb2YgJHttb2R1bGVOYW1lfSBtb2R1bGUuYCwgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25BZnRlckNhc2UoZXJyb3IgPSBudWxsKSB7XHJcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIW1vZHVsZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIC8vIGF3YWl0IGZvciBhdm9pZCBzdHVjayBvbiAqLmRpc3Bvc2UgY2FsbFxyXG4gICAgICAgICAgICAgICAgbW9kdWxlLm9uQWZ0ZXJDYXNlICYmIGF3YWl0IG1vZHVsZS5vbkFmdGVyQ2FzZShlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBtb2R1bGUuX2l0ZXJhdGlvbkVuZCAmJiBhd2FpdCBtb2R1bGUuX2l0ZXJhdGlvbkVuZChlcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gY2FsbCBcIm9uQWZ0ZXJDYXNlXCIgbWV0aG9kIG9mICR7bW9kdWxlTmFtZX0gbW9kdWxlLmAsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG1ha2VPeEdsb2JhbCgpIHtcclxuICAgICAgICBpZiAoIWdsb2JhbC5veCkge1xyXG4gICAgICAgICAgICBnbG9iYWwub3ggPSB7XHJcbiAgICAgICAgICAgICAgICBtb2R1bGVzOiB0aGlzLm1vZHVsZXMsXHJcbiAgICAgICAgICAgICAgICBjdHg6IHRoaXMuY3R4LFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRzLFxyXG4gICAgICAgICAgICAgICAgY2FwczogdGhpcy5jYXBhYmlsaXRpZXMsXHJcbiAgICAgICAgICAgICAgICByZXN1bHRTdG9yZTogdGhpcy5yZXN1bHRTdG9yZVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgZ2xvYmFsLnZhcnMgPSB0aGlzLmN0eC52YXJzO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBtYWtlQ29udGV4dEFuZE1vZHVsZXNHbG9iYWwoKSB7XHJcbiAgICAgICAgLy8gbWFrZSBzdXJlICdveCcgaXMgYWxyZWFkeSBnbG9iYWxcclxuICAgICAgICBpZiAoZ2xvYmFsLm94KSB7XHJcbiAgICAgICAgICAgIC8vIGV4cG9zZSBtb2R1bGVzIGFzIGdsb2JhbCB2YXJpYWJsZXNcclxuICAgICAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghZ2xvYmFsW21vZHVsZU5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsW21vZHVsZU5hbWVdID0gdGhpcy5tb2R1bGVzW21vZHVsZU5hbWVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGV4cG9zZSBcImN0eFwiLCBcInBhcmFtc1wiIGFuZCBcImVudlwiIGFzIGdsb2JhbCB2YXJpYWJsZXNcclxuICAgICAgICAgICAgZ2xvYmFsLnBhcmFtcyA9IGdsb2JhbC5veC5jdHgucGFyYW1zO1xyXG4gICAgICAgICAgICBnbG9iYWwuZW52ID0gZ2xvYmFsLm94LmN0eC5lbnY7XHJcbiAgICAgICAgICAgIGdsb2JhbC5jdHggPSBnbG9iYWwub3guY3R4O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsb2FkUGFnZU9iamVjdEZpbGUocG9QYXRoKSB7XHJcbiAgICAgICAgaWYgKCFwb1BhdGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBwbyA9IHJlcXVpcmUocG9QYXRoKTtcclxuICAgICAgICAgICAgLy8gc2V0IHBhZ2Ugb2JqZWN0IHJlcG9zaXRvcnkgYXMgdGhlIG1haW4gb25lXHJcbiAgICAgICAgICAgIHRoaXMucmVwb3NpdG9yeSA9IHBvO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0cy5nbG9iYWxTY29wZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5vcHRzLmdsb2JhbFNjb3BlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWwucG8gPSBwbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdHMuZ2xvYmFsU2NvcGUgPT09ICd1bmRlZmluZWQnIHx8IHRoaXMub3B0cy5nbG9iYWxTY29wZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLnBvID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAqIFByaXZhdGUgTWV0aG9kc1xyXG4gICAgICovXHJcbiAgICBfd3JhcExvZ2dlcihfbG9nZ2VyKSB7XHJcbiAgICAgICAgY29uc3QgbG9nZ2VyV3JhcCA9IHtcclxuICAgICAgICAgICAgaW5mbzogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnaW5mbycsIGFyZ3MpLFxyXG4gICAgICAgICAgICBkZWJ1ZzogKC4uLmFyZ3MpID0+IHRoaXMuX2xvZyhfbG9nZ2VyLCAnZGVidWcnLCBhcmdzKSxcclxuICAgICAgICAgICAgZXJyb3I6ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ2Vycm9yJywgYXJncyksXHJcbiAgICAgICAgICAgIHdhcm46ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ3dhcm4nLCBhcmdzKSxcclxuICAgICAgICAgICAgdXNlckluZm86ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ2luZm8nLCBhcmdzLCBJU1NVRVJTLlVTRVIpLFxyXG4gICAgICAgICAgICB1c2VyRGVidWc6ICguLi5hcmdzKSA9PiB0aGlzLl9sb2coX2xvZ2dlciwgJ2RlYnVnJywgYXJncywgSVNTVUVSUy5VU0VSKSxcclxuICAgICAgICAgICAgdXNlckVycm9yOiAoLi4uYXJncykgPT4gdGhpcy5fbG9nKF9sb2dnZXIsICdlcnJvcicsIGFyZ3MsIElTU1VFUlMuVVNFUiksXHJcbiAgICAgICAgICAgIHVzZXJXYXJuOiAoLi4uYXJncykgPT4gdGhpcy5fbG9nKF9sb2dnZXIsICd3YXJuJywgYXJncywgSVNTVUVSUy5VU0VSKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBsb2dnZXJXcmFwO1xyXG4gICAgfVxyXG5cclxuICAgIF9sb2coX2xvZ2dlciwgbGV2ZWwsIGFyZ3MsIHNyYyA9IERFRkFVTFRfTE9HR0VSX0lTU1VFUikge1xyXG4gICAgICAgIGlmICghX2xvZ2dlcltsZXZlbF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBfbG9nZ2VyW2xldmVsXS5hcHBseShfbG9nZ2VyLCBhcmdzKTtcclxuXHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IG94dXRpbC5zdHJpbmdpZnkoYXJncywgMik7XHJcbiAgICAgICAgY29uc3QgdGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICAvLyBhZGQgdGhlIGxvZyBlbnRyeSB0byB0aGUgcmVzdWx0IHN0b3JlXHJcbiAgICAgICAgaWYgKHRoaXMucmVzdWx0U3RvcmUgJiYgdGhpcy5yZXN1bHRTdG9yZS5sb2dzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0U3RvcmUubG9ncy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHRpbWU6IHRpbWUsXHJcbiAgICAgICAgICAgICAgICBsZXZlbDogbGV2ZWwudG9VcHBlckNhc2UoKSxcclxuICAgICAgICAgICAgICAgIG1zZzogbWVzc2FnZSxcclxuICAgICAgICAgICAgICAgIHNyYzogc3JjXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyByZW1vdmUgZmlyc3QgYXJndW1lbnQsIGlmIGl0J3MgYSBtZXNzYWdlXHJcbiAgICAgICAgYXJncyA9IG1lc3NhZ2UgPyBhcmdzLnNoaWZ0KCkgOiBhcmdzO1xyXG4gICAgICAgIHRoaXMuZW1pdExvZyh0aW1lLCBsZXZlbCwgbWVzc2FnZSwgYXJncywgc3JjKTtcclxuICAgIH1cclxuXHJcbiAgICBfbG9hZFNlcnZpY2VzKCkge1xyXG4gICAgICAgIGNvbnN0IG94U2VydmljZXNEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMub3hCYXNlRGlyLCAnLi9veF9zZXJ2aWNlcycpO1xyXG4gICAgICAgIGNvbnN0IHNlcnZpY2VGaWxlcyA9IGdsb2Iuc3luYygnc2VydmljZS0qLmpzJywgeyBjd2Q6IG94U2VydmljZXNEaXJQYXRoIH0pO1xyXG4gICAgICAgIC8vIGluaXRpYWxpemUgYWxsIHNlcnZpY2VzXHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgc2VydmljZXMuLi4nKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXJ2aWNlRmlsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VydmljZUZpbGVOYW1lID0gc2VydmljZUZpbGVzW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlRmlsZVBhdGggPSBwYXRoLmpvaW4ob3hTZXJ2aWNlc0RpclBhdGgsIHNlcnZpY2VGaWxlTmFtZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHNlcnZpY2VGaWxlTmFtZS5tYXRjaChTRVJWSUNFX05BTUVfTUFUQ0hfUkVHRVgpO1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHJlc3VsdFsxXTtcclxuXHJcbiAgICAgICAgICAgIC8vIHRoaXMub3B0cy5zZXJ2aWNlcyA9IHVuZGVmaW5lZCBpbiBzaW5nbGUgZmlsZSBtb2RlXHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0cy5zZXJ2aWNlcykgJiYgIXRoaXMub3B0cy5zZXJ2aWNlcy5pbmNsdWRlcyhzZXJ2aWNlTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgc2VydmljZTogJyArIHNlcnZpY2VOYW1lKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLl9sb2FkU2VydmljZShzZXJ2aWNlTmFtZSwgc2VydmljZUZpbGVQYXRoKTtcclxuICAgICAgICAgICAgICAgIHNlcnZpY2UuaW5pdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV0gPSBzZXJ2aWNlO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgaW5pdGlhbGl6aW5nIHNlcnZpY2UgXCInICsgc2VydmljZU5hbWUgKyAnXCI6ICcgKyBlLm1lc3NhZ2UgKyBFT0wgKyAoZS5zdGFja3RyYWNlID8gZS5zdGFja3RyYWNlIDogJycpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIF9sb2FkU2VydmljZShzZXJ2aWNlTmFtZSwgc2VydmljZVBhdGgpIHtcclxuICAgICAgICBsZXQgU2VydmljZUNsYXNzID0gcmVxdWlyZShzZXJ2aWNlUGF0aCk7XHJcbiAgICAgICAgLy8gRVM2IGNsYXNzIHdpbGwgYmUgdW5kZXIgJ2RlZmF1bHQnIHByb3BlcnR5XHJcbiAgICAgICAgaWYgKFNlcnZpY2VDbGFzcy5kZWZhdWx0KSB7XHJcbiAgICAgICAgICAgIFNlcnZpY2VDbGFzcyA9IFNlcnZpY2VDbGFzcy5kZWZhdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzZXJ2aWNlTG9nZ2VyID0gdGhpcy5fd3JhcExvZ2dlcihsb2dnZXIoYFNlcnZpY2U6JHtzZXJ2aWNlTmFtZX1gKSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlQ2xhc3ModGhpcy5vcHRzLCB0aGlzLmN0eCwgdGhpcy5yZXN1bHRTdG9yZSwgc2VydmljZUxvZ2dlcik7XHJcbiAgICB9XHJcblxyXG4gICAgX2xvYWRNb2R1bGVzKCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMb2FkaW5nIGludGVybmFsIG1vZHVsZXMuLi4nKTtcclxuICAgICAgICB0aGlzLl9sb2FkSW50ZXJuYWxNb2R1bGVzKCk7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgZXh0ZXJuYWwgbW9kdWxlcy4uLicpO1xyXG4gICAgICAgIHRoaXMuX2xvYWRFeHRlcm5hbE1vZHVsZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBfbG9hZEV4dGVybmFsTW9kdWxlcygpIHtcclxuICAgICAgICBsZXQgbW9kdWxlc0ZvbGRlclBhdGggPSAnLi9tb2R1bGVzJztcclxuICAgICAgICBpZiAodGhpcy5vcHRzLm1vZHVsZXNfZXh0ICYmIHR5cGVvZiB0aGlzLm9wdHMubW9kdWxlc19leHQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIG1vZHVsZXNGb2xkZXJQYXRoID0gdGhpcy5vcHRzLm1vZHVsZXNfZXh0O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL2NvbnN0IG94TW9kdWxlc0RpclBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5veEJhc2VEaXIsICcuL294X21vZHVsZXMnKTtcclxuICAgICAgICBjb25zdCBveE1vZHVsZXNEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuY3dkLCBtb2R1bGVzRm9sZGVyUGF0aCk7XHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKG94TW9kdWxlc0RpclBhdGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG1vZHVsZUZpbGVzID0gW107XHJcbiAgICAgICAgLy8gaWYgcGFydGljdWxhciBtb2R1bGUgbmFtZXMgYXJlIGRlZmluZWQgaW4gdGhlIGNvbmZpZywgdGhlbiBsb2FkIG9ubHkgdGhlc2UgbW9kdWxlc1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0cy5tb2R1bGVzKSAmJiB0aGlzLm9wdHMubW9kdWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0cy5tb2R1bGVzLmZvckVhY2gobW9kdWxlTmFtZSA9PiBtb2R1bGVGaWxlcy5wdXNoKGBtb2R1bGUtJHttb2R1bGVOYW1lfS5qc2ApKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBsb2FkIGFsbCBhdmFpbGFibGUgbW9kdWxlcyAobWlnaHQgYmUgbW9yZSB0aW1lIGNvbnN1bWluZylcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbW9kdWxlRmlsZXMgPSBnbG9iLnN5bmMoJ21vZHVsZS0qLmpzJywgeyBjd2Q6IG94TW9kdWxlc0RpclBhdGggfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGluaXRpYWxpemUgYWxsIG1vZHVsZXMgICAgICAgIFxyXG4gICAgICAgIGZvciAobGV0IG1vZHVsZUZpbGVOYW1lIG9mIG1vZHVsZUZpbGVzKSB7XHJcbiAgICAgICAgICAgIC8vIGV4dHJhY3QgbmFtZSBmcm9tIHRoZSBtb2R1bGUgZmlsZSBuYW1lIGJhc2VkIG9uIG1vZHVsZSBuYW1lIHBhdHRlcm5cclxuICAgICAgICAgICAgY29uc3QgbW9kdWxlTmFtZSA9IG1vZHVsZUZpbGVOYW1lLm1hdGNoKE1PRFVMRV9OQU1FX01BVENIX1JFR0VYKVsxXTtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBuZXcgbG9nZ2VyIGZvciB0aGUgbW9kdWxlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVMb2dnZXIgPSB0aGlzLl93cmFwTG9nZ2VyKGxvZ2dlcihgTW9kdWxlOiR7bW9kdWxlTmFtZX1gKSk7XHJcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIG5ldyBtb2R1bGUgaW5zdGFuY2VcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZCA9IGNvcmVVdGlscy5sb2FkTW9kdWxlRnJvbUZpbGUobW9kdWxlTmFtZSwgbW9kdWxlRmlsZU5hbWUsIG1vZHVsZUxvZ2dlciwgb3hNb2R1bGVzRGlyUGF0aCwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICAvLyBjYWxsIG9uTW9kdWxlTG9hZGVkIGhvb2tcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxTZXJ2aWNlc09uTW9kdWxlTG9hZGVkKG1vZCk7XHJcbiAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG1vZHVsZSB0byB0aGUgbW9kdWxlIGxpc3RcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlc1ttb2R1bGVOYW1lXSA9IGdsb2JhbC5veC5tb2R1bGVzW21vZHVsZU5hbWVdID0gdGhpcy5fd3JhcE1vZHVsZShtb2R1bGVOYW1lLCBtb2QpO1xyXG4gICAgICAgICAgICAgICAgLy8gd3JhcCB1cFxyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IChlbmRUaW1lIC0gc3RhcnRUaW1lKSAvIDEwMDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9hZGluZyBtb2R1bGU6ICcgKyBtb2R1bGVOYW1lICsgJyBbICcgKyBkdXJhdGlvbiArICcgc2VjIF0nKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIGluaXRpYWxpemluZyBtb2R1bGUgXCInICsgbW9kdWxlTmFtZSArICdcIjogJyArIGUubWVzc2FnZSArIEVPTCArIChlLnN0YWNrdHJhY2UgPyBlLnN0YWNrdHJhY2UgOiAnJykpO1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGFueSBtb2R1bGUgdGhhdCBmYWlsZWQgdG8gbG9hZCwgZXhjZXB0IFdlYiBhbmQgTW9iIG1vZHVsZXNcclxuICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgTW9iIGFuZCBXZWIgbW9kdWxlcyBsb2FkZWQsIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHNoYWxsIGZhaWxcclxuICAgICAgICAgICAgICAgIGlmIChtb2R1bGVOYW1lID09PSAnd2ViJyB8fCBtb2R1bGVOYW1lID09PSAnbW9iJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9sb2FkSW50ZXJuYWxNb2R1bGVzKCkge1xyXG4gICAgICAgIC8vIGlmIGBtb2R1bGVzYCBpcyBlbXB0eSBvciB1bmRlZmluZWQgaW4gb3h5Z2VuLmNvbmYgdGhlbiBsb2FkIGFsbCBtb2R1bGVzXHJcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBsb2FkIG9ubHkgdGhvc2UgaW1wbGljaXRseSBkZWZpbmVkXHJcbiAgICAgICAgY29uc3QgZXhjbHVkZVVuZGVmaW5lZE1vZHMgPSB0aGlzLm9wdHMubW9kdWxlcyAmJiB0aGlzLm9wdHMubW9kdWxlcy5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICBjb25zdCBveE1vZHVsZXNEaXJQYXRoID0gb3h1dGlsLmdldE94TW9kdWxlc0RpcigpO1xyXG4gICAgICAgIGNvbnN0IG1vZHVsZXNGaWxlcyA9IGdsb2Iuc3luYygnbW9kdWxlLSouanMnLCB7IGN3ZDogb3hNb2R1bGVzRGlyUGF0aCB9KTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgbW9kdWxlRmlsZU5hbWUgb2YgbW9kdWxlc0ZpbGVzKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBtb2R1bGVOYW1lID0gbW9kdWxlRmlsZU5hbWUubWF0Y2goTU9EVUxFX05BTUVfTUFUQ0hfUkVHRVgpWzFdO1xyXG5cclxuICAgICAgICAgICAgaWYgKGV4Y2x1ZGVVbmRlZmluZWRNb2RzICYmICF0aGlzLm9wdHMubW9kdWxlcy5pbmNsdWRlcyhtb2R1bGVOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgbW9kdWxlUGF0aCA9IHBhdGguam9pbihveE1vZHVsZXNEaXJQYXRoLCBtb2R1bGVGaWxlTmFtZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IE1vZHVsZUNsYXNzID0gcmVxdWlyZShtb2R1bGVQYXRoKTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIG5ldyBsb2dnZXIgZm9yIHRoZSBtb2R1bGVcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZHVsZUxvZ2dlciA9IHRoaXMuX3dyYXBMb2dnZXIobG9nZ2VyKGBNb2R1bGU6JHttb2R1bGVOYW1lfWApKTtcclxuICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgbmV3IG1vZHVsZSBpbnN0YW5jZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbW9kID0gY29yZVV0aWxzLmxvYWRNb2R1bGVGcm9tQ2xhc3MobW9kdWxlTmFtZSwgTW9kdWxlQ2xhc3MsIG1vZHVsZUxvZ2dlciwgb3hNb2R1bGVzRGlyUGF0aCwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICAvLyBjYWxsIG9uTW9kdWxlTG9hZGVkIGhvb2tcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxTZXJ2aWNlc09uTW9kdWxlTG9hZGVkKG1vZCk7XHJcbiAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG1vZHVsZSB0byB0aGUgbW9kdWxlIGxpc3RcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlc1ttb2R1bGVOYW1lXSA9IGdsb2JhbC5veC5tb2R1bGVzW21vZHVsZU5hbWVdID0gdGhpcy5fd3JhcE1vZHVsZShtb2R1bGVOYW1lLCBtb2QpO1xyXG4gICAgICAgICAgICAgICAgLy8gd3JhcCB1cFxyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IChlbmRUaW1lIC0gc3RhcnRUaW1lKSAvIDEwMDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9hZGluZyBtb2R1bGU6ICcgKyBtb2R1bGVOYW1lICsgJyBbICcgKyBkdXJhdGlvbiArICcgc2VjIF0nKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIGluaXRpYWxpemluZyBtb2R1bGUgXCInICsgbW9kdWxlTmFtZSArICdcIjogJyArIGUubWVzc2FnZSArIEVPTCArIChlLnN0YWNrdHJhY2UgPyBlLnN0YWNrdHJhY2UgOiAnJykpO1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGFueSBtb2R1bGUgdGhhdCBmYWlsZWQgdG8gbG9hZCwgZXhjZXB0IFdlYiBhbmQgTW9iIG1vZHVsZXNcclxuICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgTW9iIGFuZCBXZWIgbW9kdWxlcyBsb2FkZWQsIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHNoYWxsIGZhaWxcclxuICAgICAgICAgICAgICAgIGlmIChtb2R1bGVOYW1lID09PSAnd2ViJyB8fCBtb2R1bGVOYW1lID09PSAnbW9iJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF93cmFwTW9kdWxlKG5hbWUsIG1vZHVsZSkge1xyXG4gICAgICAgIGlmICghbW9kdWxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IG5hbWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcclxuICAgICAgICBsZXQgbW9kdWxlTWV0aG9kcyA9IE9iamVjdC5rZXlzKG1vZHVsZSk7XHJcbiAgICAgICAgaWYgKCFtb2R1bGVNZXRob2RzLnNvbWUoeCA9PiB4PT09ICdleHBvcnRzJykpIHtcclxuICAgICAgICAgICAgbW9kdWxlTWV0aG9kcyA9IHRoaXMuX2dldEFsbFByb3BlcnR5TmFtZXMobW9kdWxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgbWV0aG9kTmFtZSBvZiBtb2R1bGVNZXRob2RzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IG1vZHVsZVttZXRob2ROYW1lXTtcclxuICAgICAgICAgICAgLy8gaWdub3JlIGFueSBtb2R1bGUgcHJvcGVydHkgdGhhdCBpcyBub3QgYSBmdW5jdGlvbiBvciBhIE94eWdlblN1Yk1vZHVsZVxyXG4gICAgICAgICAgICBpZiAoKCEobWV0aG9kIGluc3RhbmNlb2YgRnVuY3Rpb24pICYmICEobWV0aG9kIGluc3RhbmNlb2YgT3h5Z2VuU3ViTW9kdWxlKSAmJiB0eXBlb2YgbWV0aG9kICE9PSAnZnVuY3Rpb24nKSB8fCBtZXRob2ROYW1lID09PSAnZXhwb3J0cycgfHwgbWV0aG9kTmFtZSA9PT0gJ19jb21waWxlJykge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gbWFwIGFuZCB3cmFwIHN1Yi1tb2R1bGUgbWV0aG9kcyAocmVjdXJzaXZlIGNhbGwgdG8gX3dyYXBNb2R1bGUpXHJcbiAgICAgICAgICAgIGlmIChtZXRob2QgaW5zdGFuY2VvZiBPeHlnZW5TdWJNb2R1bGUpIHtcclxuICAgICAgICAgICAgICAgIHdyYXBwZXJbbWV0aG9kTmFtZV0gPSB0aGlzLl93cmFwTW9kdWxlKGAke25hbWV9LiR7bWV0aG9kTmFtZX1gLCBtZXRob2QpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGRvIG5vdCB3cmFwIG1ldGhvZHNcclxuICAgICAgICAgICAgZWxzZSBpZiAoRE9fTk9UX1dSQVBfTUVUSE9EUy5pbmNsdWRlcyhtZXRob2ROYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gPT09ICdkcml2ZXInIHx8IG1ldGhvZE5hbWUgPT09ICdnZXREcml2ZXInXHJcbiAgICAgICAgICAgICAgICB3cmFwcGVyW21ldGhvZE5hbWVdID0gbW9kdWxlW21ldGhvZE5hbWVdLmJpbmQobW9kdWxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBwcml2YXRlIG1ldGhvZHMgYW5kIGV2ZW50IGhhbmRsZXJzXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG1ldGhvZE5hbWUuaW5kZXhPZignXycpID09PSAwIHx8IG1ldGhvZE5hbWUuaW5kZXhPZignb24nKSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgd3JhcHBlclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMubG9nZ2VyLmRlYnVnKCdFeGVjdXRpbmc6ICcgKyBveHV0aWwuZ2V0TWV0aG9kU2lnbmF0dXJlKG5hbWUsIG1ldGhvZE5hbWUsIGFyZ3MpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZVttZXRob2ROYW1lXS5hcHBseShtb2R1bGUsIGFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3JIZWxwZXIuZ2V0T3h5Z2VuRXJyb3IoZSwgbmFtZSwgbWV0aG9kTmFtZSwgYXJncyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBpbnRlcm5hbCBfZ2V0Q2FwYWJpbGl0aWVzIG1ldGhvZCBmb3IgaW50ZXJuYWwgT3h5Z2VuIENvcmUgdXNlXHJcbiAgICAgICAgICAgICAgICAvLyBjYWxsaW5nIF9nZXRDYXBhYmlsaXRpZXMgbWV0aG9kIHdvbid0IGJlIHZpc2libGUgaW4gdGhlIHRlc3QgcmVzdWx0c1xyXG4gICAgICAgICAgICAgICAgaWYgKG1ldGhvZE5hbWUgPT09ICdnZXRDYXBhYmlsaXRpZXMnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd3JhcHBlclsnX2dldENhcGFiaWxpdGllcyddID0gbWV0aG9kLmJpbmQobW9kdWxlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHdyYXBwZXJbbWV0aG9kTmFtZV0gPSBhc3luYyAoLi4uYXJncykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBfdGhpcy5fY29tbWFuZFdyYXBwZXIobWV0aG9kTmFtZSwgYXJncywgbW9kdWxlLCBuYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBPeEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdUaHJvd2luZyBhZ2FpbjonLCBlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvckhlbHBlci5nZXRPeHlnZW5FcnJvcihlLCBuYW1lLCBtZXRob2ROYW1lLCBhcmdzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB3cmFwcGVyO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9jb21tYW5kV3JhcHBlcihjbWROYW1lLCBjbWRBcmdzLCBtb2R1bGUsIG1vZHVsZU5hbWUpIHtcclxuICAgICAgICBpZiAoIW1vZHVsZSB8fCAhbW9kdWxlW2NtZE5hbWVdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcmV0dmFsID0gbnVsbDtcclxuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xyXG4gICAgICAgIGNvbnN0IGNtZEZuID0gbW9kdWxlW2NtZE5hbWVdO1xyXG4gICAgICAgIGNvbnN0IHB1YmxpY01ldGhvZCA9ICFjbWROYW1lLnN0YXJ0c1dpdGgoJ18nKSAmJiBjbWROYW1lICE9PSAnZGlzcG9zZSc7XHJcblxyXG4gICAgICAgIC8vIGRlbGF5IHRoZSBjb21tYW5kIGV4ZWN1dGlvbiBpZiByZXF1aXJlZFxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5vcHRzLmRlbGF5ICYmXHJcbiAgICAgICAgICAgIHB1YmxpY01ldGhvZCAmJlxyXG4gICAgICAgICAgICBjbWROYW1lICE9PSAnaW5pdCcgJiZcclxuICAgICAgICAgICAgY21kTmFtZSAhPT0gJ3RyYW5zYWN0aW9uJ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBhd2FpdCBveHV0aWwuc2xlZXAodGhpcy5vcHRzLmRlbGF5ICogMTAwMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyB0aHJvdyBpZiBhIGNvbW1hbmQgZXhlY3V0ZWQgb24gdW5pdGlhbGl6ZWQgbW9kdWxlIChleGNlcHQgaW50ZXJuYWwgbWV0aG9kcyBhbmQgYSBmZXcgb3RoZXIpXHJcbiAgICAgICAgaWYgKCFtb2R1bGUuaXNJbml0aWFsaXplZCAmJiBwdWJsaWNNZXRob2QgJiYgY21kTmFtZSAhPT0gJ2luaXQnICYmIGNtZE5hbWUgIT09ICd0cmFuc2FjdGlvbicpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJyb3JIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdNaXNzaW5nICcgKyBtb2R1bGVOYW1lICsgJy5pbml0KCknKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGRlY3R5cHQgYXJndW1lbnRzXHJcbiAgICAgICAgbGV0IGRlY3J5cHRlZEFyZ3MgPSB0aGlzLl9nZXREZWNyeXB0ZWRBcmdzRm9yQXBwbHkoY21kQXJncywgbW9kdWxlTmFtZSk7XHJcbiAgICAgICAgZGVjcnlwdGVkQXJncyA9IHRoaXMuX3BvcHVsYXRlUGFyYW1ldGVyc1ZhbHVlKGRlY3J5cHRlZEFyZ3MpO1xyXG5cclxuICAgICAgICAvLyByZXBsYWNlIHBhcmFtZXRlcnMgaW4gbWV0aG9kIGFyZ3VtZW50cyB3aXRoIGNvcnJlc3BvbmRpbmcgdmFsdWVzXHJcbiAgICAgICAgY21kQXJncyA9IHRoaXMuX3BvcHVsYXRlUGFyYW1ldGVyc1ZhbHVlKGNtZEFyZ3MpO1xyXG4gICAgICAgIC8vIHN0YXJ0IG1lYXN1cmluZyBtZXRob2QgZXhlY3V0aW9uIHRpbWVcclxuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcblxyXG4gICAgICAgIC8vIGFkZCBjb21tYW5kIGxvY2F0aW9uIGluZm9ybWF0aW9uIChlLmcuIGZpbGUgbmFtZSBhbmQgY29tbWFuZCBsaW5lKVxyXG4gICAgICAgIGxldCBjbWRMb2NhdGlvbiA9IG51bGw7XHJcbiAgICAgICAgLy8gZG8gbm90IHJlcG9ydCByZXN1bHRzIG9yIGxpbmUgdXBkYXRlcyBvbiBpbnRlcm5hbCBtZXRob2RzIChzdGFydGVkIHdpdGggJ18nKVxyXG4gICAgICAgIGlmIChwdWJsaWNNZXRob2QpIHtcclxuICAgICAgICAgICAgY21kTG9jYXRpb24gPSB0aGlzLl9nZXRDb21tYW5kTG9jYXRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0QmVmb3JlQ29tbWFuZChjbWROYW1lLCBtb2R1bGVOYW1lLCBjbWRGbiwgY21kQXJncywgdGhpcy5jdHgsIGNtZExvY2F0aW9uLCBzdGFydFRpbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0V4ZWN1dGluZzogJyArIG94dXRpbC5nZXRNZXRob2RTaWduYXR1cmUobW9kdWxlTmFtZSwgY21kTmFtZSwgY21kQXJncykpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyBlbWl0IGJlZm9yZSBldmVudHNcclxuICAgICAgICAgICAgaWYgKGNtZE5hbWUgPT09ICdkaXNwb3NlJykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fd3JhcEFzeW5jKHRoaXMuX2NhbGxTZXJ2aWNlc09uTW9kdWxlV2lsbERpc3Bvc2UpLmFwcGx5KHRoaXMsIFttb2R1bGVdKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dmFsID0gYXdhaXQgdGhpcy5fd3JhcEFzeW5jKG1vZHVsZVtjbWROYW1lXSkuYXBwbHkobW9kdWxlLCBkZWNyeXB0ZWRBcmdzKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjbWROYW1lID09PSAnaW5pdCcpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dyYXBBc3luYyh0aGlzLl9jYWxsU2VydmljZXNPbk1vZHVsZUluaXRpYWxpemVkKS5hcHBseSh0aGlzLCBbbW9kdWxlXSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBpZiAoZSAmJiBlLm1lc3NhZ2UgJiYgdHlwZW9mIGUubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKCdpbnZhbGlkIHNlc3Npb24gaWQnKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nIGlmIGVycm9yIG9jdXJyZWQgYWZ0ZXIgdGhlIG1vZHVsZSB3YXMgZGlzcG9zZWQgKG9yIGluIGEgcHJvY2VzcyBvZiBiZWluZyBkaXNwb3NlZClcclxuICAgICAgICAgICAgICAgIC8vIGV4Y2VwdCBmb3IgaW5pdCBtZXRob2RzIG9mIGNvdXJzZVxyXG4gICAgICAgICAgICAgICAgaWYgKG1vZHVsZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgbW9kdWxlLmlzSW5pdGlhbGl6ZWQgPT09ICdib29sZWFuJyAmJiAhbW9kdWxlLmlzSW5pdGlhbGl6ZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgY21kTmFtZSAhPT0gJ2luaXQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnPT09PSBlcnJvciA9PT09JywgZSlcclxuICAgICAgICAgICAgICAgIGVycm9yID0gZXJyb3JIZWxwZXIuZ2V0T3h5Z2VuRXJyb3IoZSwgbW9kdWxlTmFtZSwgY21kTmFtZSwgY21kQXJncyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVuZFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcblxyXG4gICAgICAgIGxldCBzdGVwUmVzdWx0O1xyXG5cclxuICAgICAgICBpZiAocHVibGljTWV0aG9kKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdhaXRJZCA9ICtuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl93YWl0U3RlcFJlc3VsdExpc3QucHVzaCh3YWl0SWQpO1xyXG5cclxuICAgICAgICAgICAgc3RlcFJlc3VsdCA9IGF3YWl0IHRoaXMuX2dldFN0ZXBSZXN1bHQobW9kdWxlLCBtb2R1bGVOYW1lLCBjbWROYW1lLCBjbWRBcmdzLCBjbWRMb2NhdGlvbiwgc3RhcnRUaW1lLCBlbmRUaW1lLCByZXR2YWwsIGVycm9yKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fd2FpdFN0ZXBSZXN1bHRMaXN0LmluZGV4T2Yod2FpdElkKTtcclxuICAgICAgICAgICAgdGhpcy5fd2FpdFN0ZXBSZXN1bHRMaXN0LnNwbGljZShpbmRleCwgMSk7XHJcblxyXG4gICAgICAgICAgICAvL3N0ZXBSZXN1bHQubG9jYXRpb24gPSBjbWRMb2NhdGlvbjtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0U3RvcmUuc3RlcHMucHVzaChzdGVwUmVzdWx0KTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0QWZ0ZXJDb21tYW5kKGNtZE5hbWUsIG1vZHVsZU5hbWUsIGNtZEZuLCBjbWRBcmdzLCB0aGlzLmN0eCwgY21kTG9jYXRpb24sIGVuZFRpbWUsIHN0ZXBSZXN1bHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLmlzRmF0YWwgJiYgIXRoaXMub3B0cy5jb250aW51ZU9uRXJyb3IpIHtcclxuICAgICAgICAgICAgaWYgKCFlcnJvci5sb2NhdGlvbiAmJiBjbWRMb2NhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgZXJyb3IubG9jYXRpb24gPSBjbWRMb2NhdGlvbjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bHQgJiYgc3RlcFJlc3VsdC5mYWlsdXJlICYmIHN0ZXBSZXN1bHQuZmFpbHVyZS5sb2NhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgZXJyb3IubG9jYXRpb24gPSBzdGVwUmVzdWx0LmZhaWx1cmUubG9jYXRpb247XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJldHZhbDtcclxuICAgIH1cclxuXHJcbiAgICBfd3JhcEFzeW5jIChmbiwgY29udGV4dCkge1xyXG4gICAgICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiAoLi4uYXJncykge1xyXG4gICAgICAgICAgICB2YXIgc2VsZiA9IGNvbnRleHQgfHwgdGhpcztcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcmV0cmlldmUgY3VycmVudCBsaW5lIGFuZCBmdW5jdGlvbiBuYW1lIGZyb20gdGhlIGNhbGwgc3RhY2tcclxuICAgIF9nZXRDb21tYW5kTG9jYXRpb24oKSB7XHJcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBfX3N0YWNrO1xyXG4gICAgICAgIGxldCBjYWxsZXIgPSBudWxsO1xyXG4gICAgICAgIGZvciAobGV0IGNhbGwgb2Ygc3RhY2spIHtcclxuICAgICAgICAgICAgaWYgKF9fZmlsZW5hbWUgPT09IGNhbGwuZ2V0RmlsZU5hbWUoKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBmaXJzdCBjYWxsZXIsIHdoaWNoIGlzIG5vdCB0aGUgY3VycmVudCBmaWxlXHJcbiAgICAgICAgICAgIGNhbGxlciA9IGNhbGw7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2FsbGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBgJHtjYWxsZXIuZ2V0RmlsZU5hbWUoKX06JHtjYWxsZXIuZ2V0TGluZU51bWJlcigpICsgdGhpcy5hZGp1c3RTY3JpcHRMaW5lfToke2NhbGxlci5nZXRDb2x1bW5OdW1iZXIoKX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfZ2V0U3RlcFJlc3VsdChtb2R1bGUsIG1vZHVsZU5hbWUsIG1ldGhvZE5hbWUsIGFyZ3MsIGxvY2F0aW9uLCBzdGFydFRpbWUsIGVuZFRpbWUsIHJldHZhbCwgZXJyKSB7XHJcbiAgICAgICAgdmFyIHN0ZXAgPSBuZXcgU3RlcFJlc3VsdCgpO1xyXG5cclxuICAgICAgICBzdGVwLm5hbWUgPSBveHV0aWwuZ2V0TWV0aG9kU2lnbmF0dXJlKG1vZHVsZU5hbWUsIG1ldGhvZE5hbWUsIGFyZ3MpO1xyXG4gICAgICAgIHN0ZXAudHJhbnNhY3Rpb24gPSBnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWUgfHwgbnVsbDsgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB3aHkgaXMgdGhpcyBoZXJlIGlmIGl0J3MgYWxyZWFkeSBwb3B1bGF0ZWQgaW4gcnM/XHJcbiAgICAgICAgc3RlcC5sb2NhdGlvbiA9IGxvY2F0aW9uO1xyXG5cclxuICAgICAgICBpZiAoZXJyICYmIGVyci50eXBlICYmIGVyci50eXBlID09PSBlcnJvckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX1BBU1NFRCkge1xyXG4gICAgICAgICAgICBzdGVwLnN0YXR1cyA9IFNUQVRVUy5QQVNTRUQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHN0ZXAgc3RhdHVzXHJcbiAgICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnIuaXNGYXRhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0ZXAuc3RhdHVzID0gU1RBVFVTLkZBSUxFRDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0ZXAuc3RhdHVzID0gU1RBVFVTLldBUk5JTkc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdGVwLnN0YXR1cyA9IFNUQVRVUy5QQVNTRUQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN0ZXAuYWN0aW9uID0gKHR5cGVvZiBtb2R1bGUuX2lzQWN0aW9uID09PSAnZnVuY3Rpb24nID8gbW9kdWxlLl9pc0FjdGlvbihtZXRob2ROYW1lKSA6IGZhbHNlKTtcclxuICAgICAgICBzdGVwLnN0YXJ0VGltZSA9IHN0YXJ0VGltZTtcclxuICAgICAgICBzdGVwLmVuZFRpbWUgPSBlbmRUaW1lO1xyXG4gICAgICAgIHN0ZXAuZHVyYXRpb24gPSBlbmRUaW1lIC0gc3RhcnRUaW1lO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIG1vZHVsZS5fZ2V0U3RhdHMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgc3RlcC5zdGF0cyA9IG1vZHVsZS5fZ2V0U3RhdHMobWV0aG9kTmFtZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc3RlcC5zdGF0cyA9IHt9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICBpZiAoZXJyICYmIGVyci50eXBlICYmIGVyci50eXBlID09PSBlcnJvckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX1BBU1NFRCkge1xyXG4gICAgICAgICAgICAgICAgLy9pZ25vcmVcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgJiYgZXJyLnR5cGUgJiYgZXJyLnR5cGUgPT09IGVycm9ySGVscGVyLmVycm9yQ29kZS5TRUxFTklVTV9TRVNTSU9OX1RJTUVPVVQpIHtcclxuICAgICAgICAgICAgICAgIC8vaWdub3JlXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdGVwLmZhaWx1cmUgPSBlcnJvckhlbHBlci5nZXRGYWlsdXJlRnJvbUVycm9yKGVycik7XHJcbiAgICAgICAgICAgICAgICBzdGVwLmZhaWx1cmUubG9jYXRpb24gPSBsb2NhdGlvbjtcclxuICAgICAgICAgICAgICAgIC8vIGxldCB0aGUgbW9kdWxlIGRlY2lkZSB3aGV0aGVyIGEgc2NyZWVuc2hvdCBzaG91bGQgYmUgdGFrZW4gb24gZXJyb3Igb3Igbm90XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGUuX3Rha2VTY3JlZW5zaG90U2lsZW50ID09PSAnZnVuY3Rpb24nICYmICF0aGlzLm9wdHMuZGlzYWJsZVNjcmVlbnNob3QpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwLnNjcmVlbnNob3QgPSBhd2FpdCBtb2R1bGUuX3Rha2VTY3JlZW5zaG90U2lsZW50KG1ldGhvZE5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgaGVyZSwgd2Ugd2VyZSB1bmFibGUgdG8gZ2V0IGEgc2NyZWVuc2hvdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gd2FpdCBmb3IgYSBtb21lbnQgKGluIFBlcmZlY3RvIENsb3VkLCB0aGUgc2NyZWVuc2hvdCBtaWdodCBub3QgYmUgaW1taWRpYXRlbHkgYXZhaWxhYmxlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBveHV0aWwuc2xlZXAoMTAwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwLnNjcmVlbnNob3QgPSBhd2FpdCBtb2R1bGUuX3Rha2VTY3JlZW5zaG90U2lsZW50KG1ldGhvZE5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogaW5kaWNhdGUgdG8gdXNlciB0aGF0IGFuIGF0dGVtcHQgdG8gdGFrZSBhIHNjcmVlbnNob3QgaGFzIGZhaWxlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdGVwO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9kaXNwb3NlU2VydmljZXMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNlcnZpY2VzIHx8IHR5cGVvZiB0aGlzLnNlcnZpY2VzICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLnNlcnZpY2VzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnNlcnZpY2VzW2tleV07XHJcbiAgICAgICAgICAgIGlmIChzZXJ2aWNlLmRpc3Bvc2UpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2VydmljZS5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBzZXJ2aWNlIGRpc3Bvc2FsIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBkaXNwb3NlIHNlcnZpY2UgJyR7a2V5fSc6YCwgZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2Rpc3Bvc2VNb2R1bGVzKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICBpZiAoIXRoaXMubW9kdWxlcyB8fCB0eXBlb2YgdGhpcy5tb2R1bGVzICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLm1vZHVsZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgbW9kID0gdGhpcy5tb2R1bGVzW2tleV07XHJcblxyXG4gICAgICAgICAgICBpZiAobW9kLmRpc3Bvc2UpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbW9kLmRpc3Bvc2Uoc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIG1vZHVsZSBkaXNwb3NhbCBlcnJvciBcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGRpc3Bvc2UgbW9kdWxlICcke2tleX0nOiBgLCBlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8qXHJcbiAgICAgKiBTZXJ2aWNlcyBFdmVudCBFbWl0dGVyc1xyXG4gICAgICovXHJcbiAgICBfY2FsbFNlcnZpY2VzT25Nb2R1bGVMb2FkZWQobW9kdWxlKSB7XHJcbiAgICAgICAgZm9yIChsZXQgc2VydmljZU5hbWUgaW4gdGhpcy5zZXJ2aWNlcykge1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV07XHJcbiAgICAgICAgICAgIGlmICghc2VydmljZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHNlcnZpY2Uub25Nb2R1bGVMb2FkZWQobW9kdWxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBjYWxsIFwib25Nb2R1bGVMb2FkZWRcIiBtZXRob2Qgb2YgJHtzZXJ2aWNlTmFtZX0gc2VydmljZS5gLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIF9jYWxsU2VydmljZXNPbk1vZHVsZUluaXRpYWxpemVkKG1vZHVsZSkge1xyXG4gICAgICAgIGZvciAobGV0IHNlcnZpY2VOYW1lIGluIHRoaXMuc2VydmljZXMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuc2VydmljZXNbc2VydmljZU5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIXNlcnZpY2UpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBzZXJ2aWNlLm9uTW9kdWxlSW5pdGlhbGl6ZWQobW9kdWxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBjYWxsIFwib25Nb2R1bGVJbml0aWFsaXplZFwiIG1ldGhvZCBvZiAke3NlcnZpY2VOYW1lfSBzZXJ2aWNlLmAsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgX2NhbGxTZXJ2aWNlc09uTW9kdWxlV2lsbERpc3Bvc2UobW9kdWxlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzIHx8ICF0aGlzLnNlcnZpY2VzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgc2VydmljZU5hbWUgaW4gdGhpcy5zZXJ2aWNlcykge1xyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV07XHJcbiAgICAgICAgICAgIGlmICghc2VydmljZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlLm9uTW9kdWxlV2lsbERpc3Bvc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm9uTW9kdWxlV2lsbERpc3Bvc2UobW9kdWxlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBjYWxsIFwib25Nb2R1bGVXaWxsRGlzcG9zZVwiIG1ldGhvZCBvZiAke3NlcnZpY2VOYW1lfSBzZXJ2aWNlLmAsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgX3BvcHVsYXRlUGFyYW1ldGVyc1ZhbHVlKGFyZ3MpIHtcclxuICAgICAgICBpZiAoIWFyZ3MgfHwgIUFycmF5LmlzQXJyYXkoYXJncykgfHwgYXJncy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYXJncztcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgX25ld0FyZ3MgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBhcmcgb2YgYXJncykge1xyXG4gICAgICAgICAgICBfbmV3QXJncy5wdXNoKHRoaXMuX3JlcGxhY2VQYXJhbWV0ZXJJbkFyZ3VtZW50KGFyZykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX25ld0FyZ3M7XHJcbiAgICB9XHJcbiAgICBfcmVwbGFjZVBhcmFtZXRlckluQXJndW1lbnQoYXJnKSB7XHJcbiAgICAgICAgaWYgKGFyZyAmJiB0eXBlb2YgYXJnLmdldERlY3J5cHRSZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdFTkNSWVBURUQnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFhcmcgfHwgdHlwZW9mIGFyZyAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFyZztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVwbGFjZSB1c2VyIHBhcmFtZXRlcnMgd2l0aCB2YWx1ZXNcclxuICAgICAgICAvLyBub3RlOiB1c2VyIHBhcmFtZXRlciB3aXRoIHRoZSBzYW1lIG5hbWUgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGVudmlyb25tZW50IHZhcmlhYmxlXHJcbiAgICAgICAgZm9yIChsZXQgcGFyYW1OYW1lIGluIHRoaXMuY3R4LnBhcmFtcykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jdHgucGFyYW1zLmhhc093blByb3BlcnR5KHBhcmFtTmFtZSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtVmFsdWUgPSB0aGlzLmN0eC5wYXJhbXNbcGFyYW1OYW1lXTtcclxuICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFwkeycgKyBwYXJhbU5hbWUgKyAnfScsICdnJyksIHBhcmFtVmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHJlcGxhY2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpdGggdmFsdWVzXHJcbiAgICAgICAgZm9yIChsZXQgZW52TmFtZSBpbiB0aGlzLmN0eC5lbnYpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3R4LmVudi5oYXNPd25Qcm9wZXJ0eShlbnZOYW1lKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZW52VmFsdWUgPSB0aGlzLmN0eC5lbnZbZW52TmFtZV07XHJcbiAgICAgICAgICAgICAgICBhcmcgPSBhcmcucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcJHsnICsgZW52TmFtZSArICd9JywgJ2cnKSwgZW52VmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhcmc7XHJcbiAgICB9XHJcbiAgICBfZ2V0QWxsUHJvcGVydHlOYW1lcyggb2JqICkge1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gW107XHJcblxyXG4gICAgICAgIGRvIHtcclxuICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoIG9iaiApLmZvckVhY2goZnVuY3Rpb24gKCBwcm9wICkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCBwcm9wcy5pbmRleE9mKCBwcm9wICkgPT09IC0xICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnB1c2goIHByb3AgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25kLWFzc2lnblxyXG4gICAgICAgIH0gd2hpbGUgKCBvYmogPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoIG9iaiApICk7XHJcblxyXG4gICAgICAgIHJldHVybiBwcm9wcztcclxuICAgIH1cclxuXHJcbiAgICBfY2hlY2tTdGVwUmVzdWx0KHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGlmICh0aGlzLl93YWl0U3RlcFJlc3VsdExpc3QubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGVja1N0ZXBSZXN1bHQocmVzb2x2ZSwgcmVqZWN0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX3dhaXRTdGVwUmVzdWx0KCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrU3RlcFJlc3VsdChyZXNvbHZlLCByZWplY3QpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9nZXREZWNyeXB0ZWRBcmdzRm9yQXBwbHkoYXJncywgbW9kdWxlTmFtZSkge1xyXG4gICAgICAgIGlmICghYXJncyB8fCAhQXJyYXkuaXNBcnJheShhcmdzKSB8fCBhcmdzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhcmdzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBfbmV3QXJncyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGFyZyBvZiBhcmdzKSB7XHJcbiAgICAgICAgICAgIF9uZXdBcmdzLnB1c2godGhpcy5fZGVjcnlwdFBhcmFtZXRlckZvckFwcGx5SW5Bcmd1bWVudChhcmcsIG1vZHVsZU5hbWUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9uZXdBcmdzO1xyXG4gICAgfVxyXG5cclxuICAgIF9kZWNyeXB0UGFyYW1ldGVyRm9yQXBwbHlJbkFyZ3VtZW50KGFyZywgbW9kdWxlTmFtZSkge1xyXG4gICAgICAgIGlmIChhcmcgJiYgdHlwZW9mIGFyZy5nZXREZWNyeXB0UmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIGlmIChtb2R1bGVOYW1lID09PSAnbG9nJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdFTkNSWVBURUQnO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZy5nZXREZWNyeXB0UmVzdWx0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBhcmc7XHJcbiAgICB9XHJcbn1cclxuIl19
|