oxygen-cli 1.37.8 → 1.37.9
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 +1687 -1687
- package/LICENSE +672 -672
- package/README.md +37 -37
- package/build/core/OxygenCore.js +8 -2
- package/build/core/OxygenEvents.js +4 -2
- package/build/core/OxygenModule.js +1 -1
- package/build/core/OxygenService.js +1 -1
- package/build/core/OxygenSubModule.js +1 -1
- package/build/core/WebDriverModule.js +1 -1
- package/build/core/utils.js +1 -1
- package/build/errors/HookError.js +1 -1
- package/build/errors/ModuleError.js +1 -1
- package/build/errors/ModuleUnavailableError.js +1 -1
- package/build/errors/OxygenError.js +1 -1
- package/build/errors/ScriptNotFound.js +1 -1
- package/build/errors/helper.js +1 -1
- package/build/index.js +1 -1
- package/build/lib/cli-util.js +25 -6
- package/build/lib/cli.js +2 -2
- package/build/lib/debugger.js +1 -1
- package/build/lib/img-merge.js +1 -1
- package/build/lib/launcher.js +1 -1
- package/build/lib/logger.js +43 -43
- package/build/lib/moduleRequire.js +1 -1
- package/build/lib/parallel-launcher.js +1 -1
- package/build/lib/param-manager.js +1 -1
- package/build/lib/param-reader-csv.js +1 -1
- package/build/lib/param-reader-excel.js +1 -1
- package/build/lib/param-reader-json.js +1 -1
- package/build/lib/text-to-image.js +1 -1
- package/build/lib/util.js +2 -2
- package/build/model/case-result.js +1 -1
- package/build/model/failure.js +1 -1
- package/build/model/status.js +1 -1
- package/build/model/step-result.js +1 -1
- package/build/model/suite-result.js +2 -1
- package/build/model/test-result.js +1 -1
- package/build/model/testcase.js +1 -1
- package/build/model/testsuite.js +1 -1
- package/build/ox_modules/index.js +1 -1
- package/build/ox_modules/module-assert.js +37 -37
- package/build/ox_modules/module-date.js +24 -24
- package/build/ox_modules/module-db.js +52 -52
- package/build/ox_modules/module-email.js +59 -59
- package/build/ox_modules/module-eyes.js +34 -34
- package/build/ox_modules/module-http/ntlm-util.js +10 -10
- package/build/ox_modules/module-http/ntlm.js +15 -15
- package/build/ox_modules/module-http.js +132 -132
- package/build/ox_modules/module-log.js +27 -27
- package/build/ox_modules/module-mailinator.js +87 -87
- package/build/ox_modules/module-mob/commands/alertAccept.js +17 -17
- package/build/ox_modules/module-mob/commands/alertDismiss.js +17 -17
- package/build/ox_modules/module-mob/commands/assertAlert.js +20 -20
- package/build/ox_modules/module-mob/commands/assertText.js +21 -21
- package/build/ox_modules/module-mob/commands/assertTitle.js +19 -19
- package/build/ox_modules/module-mob/commands/assertValue.js +18 -18
- package/build/ox_modules/module-mob/commands/back.js +16 -16
- package/build/ox_modules/module-mob/commands/clear.js +19 -19
- package/build/ox_modules/module-mob/commands/click.js +17 -17
- package/build/ox_modules/module-mob/commands/clickHidden.js +17 -17
- package/build/ox_modules/module-mob/commands/clickLong.js +18 -18
- package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +18 -18
- package/build/ox_modules/module-mob/commands/closeApp.js +16 -16
- package/build/ox_modules/module-mob/commands/debug.js +16 -16
- package/build/ox_modules/module-mob/commands/dragAndDrop.js +19 -19
- package/build/ox_modules/module-mob/commands/enableNetwork.js +27 -27
- package/build/ox_modules/module-mob/commands/execute.js +21 -21
- package/build/ox_modules/module-mob/commands/findElement.js +20 -20
- package/build/ox_modules/module-mob/commands/findElements.js +23 -23
- package/build/ox_modules/module-mob/commands/getAlertText.js +17 -17
- package/build/ox_modules/module-mob/commands/getAppiumLogs.js +16 -16
- package/build/ox_modules/module-mob/commands/getBrowserLogs.js +16 -16
- package/build/ox_modules/module-mob/commands/getCurrentActivity.js +15 -15
- package/build/ox_modules/module-mob/commands/getCurrentPackage.js +15 -15
- package/build/ox_modules/module-mob/commands/getDeviceLogs.js +16 -16
- package/build/ox_modules/module-mob/commands/getDeviceTime.js +16 -16
- package/build/ox_modules/module-mob/commands/getLocation.js +20 -20
- package/build/ox_modules/module-mob/commands/getSource.js +16 -16
- package/build/ox_modules/module-mob/commands/getText.js +18 -18
- package/build/ox_modules/module-mob/commands/getTitle.js +13 -13
- package/build/ox_modules/module-mob/commands/getUrl.js +17 -17
- package/build/ox_modules/module-mob/commands/getValue.js +18 -18
- package/build/ox_modules/module-mob/commands/getWindowHandles.js +17 -17
- package/build/ox_modules/module-mob/commands/hideKeyboard.js +21 -21
- package/build/ox_modules/module-mob/commands/index.js +1 -1
- package/build/ox_modules/module-mob/commands/installApp.js +16 -16
- package/build/ox_modules/module-mob/commands/isAppInstalled.js +16 -16
- package/build/ox_modules/module-mob/commands/isCheckable.js +18 -18
- package/build/ox_modules/module-mob/commands/isChecked.js +18 -18
- package/build/ox_modules/module-mob/commands/isClickable.js +18 -18
- package/build/ox_modules/module-mob/commands/isExist.js +19 -19
- package/build/ox_modules/module-mob/commands/isSelected.js +23 -23
- package/build/ox_modules/module-mob/commands/isVisible.js +19 -19
- package/build/ox_modules/module-mob/commands/isWebViewContext.js +16 -16
- package/build/ox_modules/module-mob/commands/launchApp.js +15 -15
- package/build/ox_modules/module-mob/commands/longPressKeyCode.js +18 -18
- package/build/ox_modules/module-mob/commands/open.js +17 -17
- package/build/ox_modules/module-mob/commands/pause.js +16 -16
- package/build/ox_modules/module-mob/commands/removeApp.js +16 -16
- package/build/ox_modules/module-mob/commands/resetApp.js +15 -15
- package/build/ox_modules/module-mob/commands/scrollIntoElement.js +22 -22
- package/build/ox_modules/module-mob/commands/scrollIntoView.js +27 -27
- package/build/ox_modules/module-mob/commands/select.js +24 -24
- package/build/ox_modules/module-mob/commands/selectFrame.js +23 -23
- package/build/ox_modules/module-mob/commands/selectWindow.js +28 -28
- package/build/ox_modules/module-mob/commands/sendKeys.js +29 -29
- package/build/ox_modules/module-mob/commands/setContext.js +16 -16
- package/build/ox_modules/module-mob/commands/setNativeContext.js +15 -15
- package/build/ox_modules/module-mob/commands/setTimeout.js +21 -21
- package/build/ox_modules/module-mob/commands/setWebViewContext.js +16 -16
- package/build/ox_modules/module-mob/commands/shake.js +16 -16
- package/build/ox_modules/module-mob/commands/smsClickLink.js +19 -19
- package/build/ox_modules/module-mob/commands/smsGetText.js +20 -20
- package/build/ox_modules/module-mob/commands/swipe.js +20 -20
- package/build/ox_modules/module-mob/commands/swipeElement.js +20 -20
- package/build/ox_modules/module-mob/commands/swipeScreen.js +20 -20
- package/build/ox_modules/module-mob/commands/takeScreenshot.js +17 -17
- package/build/ox_modules/module-mob/commands/tap.js +17 -17
- package/build/ox_modules/module-mob/commands/type.js +20 -20
- package/build/ox_modules/module-mob/commands/unlockPattern.js +22 -22
- package/build/ox_modules/module-mob/commands/waitForExist.js +18 -18
- package/build/ox_modules/module-mob/commands/waitForInteractable.js +17 -17
- package/build/ox_modules/module-mob/commands/waitForVisible.js +17 -17
- package/build/ox_modules/module-mob.js +74 -74
- package/build/ox_modules/module-pdf.js +35 -35
- package/build/ox_modules/module-proxy.js +77 -77
- package/build/ox_modules/module-serial.js +55 -55
- package/build/ox_modules/module-shell.js +25 -25
- package/build/ox_modules/module-soap.js +72 -72
- package/build/ox_modules/module-twilio.js +41 -41
- package/build/ox_modules/module-utils.js +91 -91
- package/build/ox_modules/module-web/commands/alertAccept.js +17 -17
- package/build/ox_modules/module-web/commands/alertDismiss.js +17 -17
- package/build/ox_modules/module-web/commands/assertAlert.js +20 -20
- package/build/ox_modules/module-web/commands/assertExist.js +17 -17
- package/build/ox_modules/module-web/commands/assertSelectedLabel.js +21 -21
- package/build/ox_modules/module-web/commands/assertSelectedValue.js +21 -21
- package/build/ox_modules/module-web/commands/assertText.js +21 -21
- package/build/ox_modules/module-web/commands/assertTextNotPresent.js +18 -18
- package/build/ox_modules/module-web/commands/assertTextPresent.js +18 -18
- package/build/ox_modules/module-web/commands/assertTitle.js +19 -19
- package/build/ox_modules/module-web/commands/assertValue.js +20 -20
- package/build/ox_modules/module-web/commands/back.js +16 -16
- package/build/ox_modules/module-web/commands/clear.js +18 -18
- package/build/ox_modules/module-web/commands/click.js +25 -25
- package/build/ox_modules/module-web/commands/clickHidden.js +23 -23
- package/build/ox_modules/module-web/commands/closeWindow.js +15 -15
- package/build/ox_modules/module-web/commands/debug.js +15 -15
- package/build/ox_modules/module-web/commands/deleteCookies.js +12 -12
- package/build/ox_modules/module-web/commands/deselect.js +22 -22
- package/build/ox_modules/module-web/commands/doubleClick.js +17 -17
- package/build/ox_modules/module-web/commands/dragAndDrop.js +20 -20
- package/build/ox_modules/module-web/commands/execute.js +24 -24
- package/build/ox_modules/module-web/commands/fileBrowse.js +18 -18
- package/build/ox_modules/module-web/commands/findElement.js +19 -19
- package/build/ox_modules/module-web/commands/findElements.js +22 -22
- package/build/ox_modules/module-web/commands/fullscreenWindow.js +14 -14
- package/build/ox_modules/module-web/commands/getAlertText.js +16 -16
- package/build/ox_modules/module-web/commands/getAttribute.js +19 -19
- package/build/ox_modules/module-web/commands/getBrowserLogs.js +17 -17
- package/build/ox_modules/module-web/commands/getCookies.js +13 -13
- package/build/ox_modules/module-web/commands/getCssValue.js +19 -19
- package/build/ox_modules/module-web/commands/getElementCount.js +17 -17
- package/build/ox_modules/module-web/commands/getHTML.js +17 -17
- package/build/ox_modules/module-web/commands/getSource.js +16 -16
- package/build/ox_modules/module-web/commands/getText.js +18 -18
- package/build/ox_modules/module-web/commands/getTitle.js +12 -12
- package/build/ox_modules/module-web/commands/getUrl.js +16 -16
- package/build/ox_modules/module-web/commands/getValue.js +18 -18
- package/build/ox_modules/module-web/commands/getWindowHandles.js +16 -16
- package/build/ox_modules/module-web/commands/getWindowSize.js +16 -16
- package/build/ox_modules/module-web/commands/getXMLPageSource.js +16 -16
- package/build/ox_modules/module-web/commands/index.js +1 -1
- package/build/ox_modules/module-web/commands/isAlertPresent.js +16 -16
- package/build/ox_modules/module-web/commands/isChecked.js +18 -18
- package/build/ox_modules/module-web/commands/isExist.js +19 -19
- package/build/ox_modules/module-web/commands/isInteractable.js +22 -22
- package/build/ox_modules/module-web/commands/isSelected.js +23 -23
- package/build/ox_modules/module-web/commands/isVisible.js +19 -19
- package/build/ox_modules/module-web/commands/makeVisible.js +25 -25
- package/build/ox_modules/module-web/commands/maximizeWindow.js +14 -14
- package/build/ox_modules/module-web/commands/minimizeWindow.js +14 -14
- package/build/ox_modules/module-web/commands/mock.js +20 -20
- package/build/ox_modules/module-web/commands/mockClearAll.js +12 -12
- package/build/ox_modules/module-web/commands/mockRestoreAll.js +12 -12
- package/build/ox_modules/module-web/commands/newWindow.js +16 -16
- package/build/ox_modules/module-web/commands/open.js +16 -16
- package/build/ox_modules/module-web/commands/pause.js +15 -15
- package/build/ox_modules/module-web/commands/point.js +21 -21
- package/build/ox_modules/module-web/commands/pointJS.js +15 -15
- package/build/ox_modules/module-web/commands/refresh.js +15 -15
- package/build/ox_modules/module-web/commands/rightClick.js +17 -17
- package/build/ox_modules/module-web/commands/rightClickActions.js +19 -19
- package/build/ox_modules/module-web/commands/scrollToElement.js +21 -21
- package/build/ox_modules/module-web/commands/select.js +23 -23
- package/build/ox_modules/module-web/commands/selectFrame.js +24 -24
- package/build/ox_modules/module-web/commands/selectWindow.js +27 -27
- package/build/ox_modules/module-web/commands/sendKeys.js +22 -22
- package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +20 -20
- package/build/ox_modules/module-web/commands/setTimeout.js +21 -21
- package/build/ox_modules/module-web/commands/setWindowSize.js +17 -17
- package/build/ox_modules/module-web/commands/takeScreenshot.js +17 -17
- package/build/ox_modules/module-web/commands/type.js +20 -20
- package/build/ox_modules/module-web/commands/verifyAlert.js +20 -20
- package/build/ox_modules/module-web/commands/verifyExist.js +17 -17
- package/build/ox_modules/module-web/commands/verifySelectedLabel.js +21 -21
- package/build/ox_modules/module-web/commands/verifySelectedValue.js +21 -21
- package/build/ox_modules/module-web/commands/verifyText.js +21 -21
- package/build/ox_modules/module-web/commands/verifyTextNotPresent.js +18 -18
- package/build/ox_modules/module-web/commands/verifyTextPresent.js +18 -18
- package/build/ox_modules/module-web/commands/verifyTitle.js +19 -19
- package/build/ox_modules/module-web/commands/verifyValue.js +20 -20
- package/build/ox_modules/module-web/commands/waitForAngular.js +19 -19
- package/build/ox_modules/module-web/commands/waitForExist.js +17 -17
- package/build/ox_modules/module-web/commands/waitForInteractable.js +17 -17
- package/build/ox_modules/module-web/commands/waitForNotExist.js +17 -17
- package/build/ox_modules/module-web/commands/waitForNotText.js +20 -20
- package/build/ox_modules/module-web/commands/waitForNotValue.js +20 -20
- package/build/ox_modules/module-web/commands/waitForText.js +20 -20
- package/build/ox_modules/module-web/commands/waitForValue.js +20 -20
- package/build/ox_modules/module-web/commands/waitForVisible.js +17 -17
- package/build/ox_modules/module-web/commands/waitForWindow.js +22 -22
- package/build/ox_modules/module-web.js +105 -100
- package/build/ox_modules/module-win/commands/assertText.js +17 -17
- package/build/ox_modules/module-win/commands/assertTitle.js +15 -15
- package/build/ox_modules/module-win/commands/assertValue.js +14 -14
- package/build/ox_modules/module-win/commands/back.js +11 -11
- package/build/ox_modules/module-win/commands/clear.js +13 -13
- package/build/ox_modules/module-win/commands/click.js +13 -13
- package/build/ox_modules/module-win/commands/clickLong.js +14 -14
- package/build/ox_modules/module-win/commands/clickMultipleTimes.js +14 -14
- package/build/ox_modules/module-win/commands/findElement.js +15 -15
- package/build/ox_modules/module-win/commands/findElements.js +15 -15
- package/build/ox_modules/module-win/commands/getAppiumLogs.js +12 -12
- package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +15 -15
- package/build/ox_modules/module-win/commands/getLocation.js +14 -14
- package/build/ox_modules/module-win/commands/getSource.js +12 -12
- package/build/ox_modules/module-win/commands/getText.js +14 -14
- package/build/ox_modules/module-win/commands/getValue.js +14 -14
- package/build/ox_modules/module-win/commands/getWindowHandles.js +15 -15
- package/build/ox_modules/module-win/commands/index.js +1 -1
- package/build/ox_modules/module-win/commands/isCheckable.js +14 -14
- package/build/ox_modules/module-win/commands/isChecked.js +14 -14
- package/build/ox_modules/module-win/commands/isClickable.js +14 -14
- package/build/ox_modules/module-win/commands/isExist.js +15 -15
- package/build/ox_modules/module-win/commands/isSelected.js +14 -14
- package/build/ox_modules/module-win/commands/isVisible.js +15 -15
- package/build/ox_modules/module-win/commands/open.js +13 -13
- package/build/ox_modules/module-win/commands/pause.js +12 -12
- package/build/ox_modules/module-win/commands/rightClick.js +13 -13
- package/build/ox_modules/module-win/commands/selectWindow.js +23 -23
- package/build/ox_modules/module-win/commands/sendKeys.js +22 -22
- package/build/ox_modules/module-win/commands/setTimeout.js +17 -17
- package/build/ox_modules/module-win/commands/takeScreenshot.js +16 -16
- package/build/ox_modules/module-win/commands/tap.js +13 -13
- package/build/ox_modules/module-win/commands/type.js +16 -16
- package/build/ox_modules/module-win/commands/waitForExist.js +14 -14
- package/build/ox_modules/module-win/commands/waitForInteractable.js +16 -16
- package/build/ox_modules/module-win/commands/waitForVisible.js +13 -13
- package/build/ox_modules/module-win.js +47 -47
- package/build/ox_modules/utils.js +8 -8
- package/build/ox_reporters/excel/template.json +48 -48
- package/build/ox_reporters/html/index.ejs +163 -163
- package/build/ox_reporters/html/summary.ejs +77 -77
- package/build/ox_reporters/html/tests-details.ejs +134 -134
- package/build/ox_reporters/html/tests-devices-browsers.ejs +83 -83
- package/build/ox_reporters/reporter-excel.js +1 -1
- package/build/ox_reporters/reporter-html.js +1 -1
- package/build/ox_reporters/reporter-json.js +1 -1
- package/build/ox_reporters/reporter-junit.js +1 -1
- package/build/ox_reporters/reporter-pdf.js +1 -1
- package/build/ox_reporters/reporter-rp.js +376 -0
- package/build/ox_reporters/reporter-xml.js +1 -1
- package/build/ox_services/service-devtools/submodule-network.js +1 -1
- package/build/ox_services/service-devtools.js +1 -1
- package/build/reporter/FileReporterBase.js +1 -1
- package/build/reporter/ReportAggregator.js +110 -43
- package/build/reporter/ReporterBase.js +2 -2
- package/build/runners/WorkerProcess.js +1 -1
- package/build/runners/cucumber/CucumberEventListener.js +1 -1
- package/build/runners/cucumber/CucumberReporter.js +1 -1
- package/build/runners/cucumber/CucumberWorker.js +1 -1
- package/build/runners/cucumber/index.js +1 -1
- package/build/runners/cucumber/worker.js +1 -1
- package/build/runners/index.js +1 -1
- package/build/runners/oxygen/OxygenWorker.js +1 -1
- package/build/runners/oxygen/index.js +37 -22
- package/build/runners/oxygen/worker.js +1 -1
- package/config/default.json +6 -6
- package/log.txt +1614 -0
- package/package.json +136 -135
- package/types/index.d.ts +70 -70
- package/types/module-eyes.d.ts +39 -39
- package/types/module-http.d.ts +163 -163
- package/types/module-log.d.ts +34 -34
- package/types/module-mob.d.ts +966 -966
- package/types/module-pdf.d.ts +40 -40
- package/types/module-proxy.d.ts +100 -100
- package/types/module-shell.d.ts +24 -24
- package/types/module-utils.d.ts +99 -99
- package/types/module-web.d.ts +1053 -1053
- package/types/module-win.d.ts +352 -352
- package/types/oxygen.d.ts +53 -53
|
@@ -29,18 +29,18 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
29
29
|
|
|
30
30
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
31
31
|
|
|
32
|
-
/*
|
|
33
|
-
* Copyright (C) 2015-present CloudBeat Limited
|
|
34
|
-
*
|
|
35
|
-
* This program is free software: you can redistribute it and/or modify
|
|
36
|
-
* it under the terms of the GNU General Public License as published by
|
|
37
|
-
* the Free Software Foundation, either version 3 of the License, or
|
|
38
|
-
* (at your option) any later version.
|
|
32
|
+
/*
|
|
33
|
+
* Copyright (C) 2015-present CloudBeat Limited
|
|
34
|
+
*
|
|
35
|
+
* This program is free software: you can redistribute it and/or modify
|
|
36
|
+
* it under the terms of the GNU General Public License as published by
|
|
37
|
+
* the Free Software Foundation, either version 3 of the License, or
|
|
38
|
+
* (at your option) any later version.
|
|
39
39
|
*/
|
|
40
40
|
|
|
41
|
-
/**
|
|
42
|
-
* @name http
|
|
43
|
-
* @description Provides methods for working with HTTP(S)
|
|
41
|
+
/**
|
|
42
|
+
* @name http
|
|
43
|
+
* @description Provides methods for working with HTTP(S)
|
|
44
44
|
*/
|
|
45
45
|
const http = require('http');
|
|
46
46
|
|
|
@@ -83,31 +83,31 @@ class HttpModule extends _OxygenModule.default {
|
|
|
83
83
|
|
|
84
84
|
this._isInitialized = true;
|
|
85
85
|
}
|
|
86
|
-
/*
|
|
87
|
-
* @summary Gets module name
|
|
88
|
-
* @function name
|
|
89
|
-
* @return {String} Constant value "http".
|
|
86
|
+
/*
|
|
87
|
+
* @summary Gets module name
|
|
88
|
+
* @function name
|
|
89
|
+
* @return {String} Constant value "http".
|
|
90
90
|
*/
|
|
91
91
|
|
|
92
92
|
|
|
93
93
|
get name() {
|
|
94
94
|
return MODULE_NAME;
|
|
95
95
|
}
|
|
96
|
-
/*
|
|
97
|
-
* @summary Returns a new FormData object
|
|
98
|
-
* @function newFormData
|
|
99
|
-
* @return {FormData} new FormData object.
|
|
96
|
+
/*
|
|
97
|
+
* @summary Returns a new FormData object
|
|
98
|
+
* @function newFormData
|
|
99
|
+
* @return {FormData} new FormData object.
|
|
100
100
|
*/
|
|
101
101
|
|
|
102
102
|
|
|
103
103
|
newFormData() {
|
|
104
104
|
return new _formData.default();
|
|
105
105
|
}
|
|
106
|
-
/**
|
|
107
|
-
* @summary Sets user defined HTTP options (such as proxy, decompress and etc.)
|
|
108
|
-
* @function setOptions
|
|
109
|
-
* @param {Object} opts - HTTP request options object, see [Request Options](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md).
|
|
110
|
-
* In addition to the options listed in the linked document, 'deflateRaw' option can be used when server returns Deflate-compressed stream without headers.
|
|
106
|
+
/**
|
|
107
|
+
* @summary Sets user defined HTTP options (such as proxy, decompress and etc.)
|
|
108
|
+
* @function setOptions
|
|
109
|
+
* @param {Object} opts - HTTP request options object, see [Request Options](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md).
|
|
110
|
+
* In addition to the options listed in the linked document, 'deflateRaw' option can be used when server returns Deflate-compressed stream without headers.
|
|
111
111
|
*/
|
|
112
112
|
|
|
113
113
|
|
|
@@ -118,13 +118,13 @@ class HttpModule extends _OxygenModule.default {
|
|
|
118
118
|
this._userHttpOptions.decompress = false; // decompress=true in default options so we override it
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
|
-
/**
|
|
122
|
-
* @summary Sets user credentials for NTLM authentication process
|
|
123
|
-
* @function setNtlmUser
|
|
124
|
-
* @param {String} username - NTLM username.
|
|
125
|
-
* @param {String} password - NTLM password.
|
|
126
|
-
* @param {String=} domain - NTLM domain name, if applicable.
|
|
127
|
-
* In addition to the options listed in the linked document, 'deflateRaw' option can be used when server returns Deflate-compressed stream without headers.
|
|
121
|
+
/**
|
|
122
|
+
* @summary Sets user credentials for NTLM authentication process
|
|
123
|
+
* @function setNtlmUser
|
|
124
|
+
* @param {String} username - NTLM username.
|
|
125
|
+
* @param {String} password - NTLM password.
|
|
126
|
+
* @param {String=} domain - NTLM domain name, if applicable.
|
|
127
|
+
* In addition to the options listed in the linked document, 'deflateRaw' option can be used when server returns Deflate-compressed stream without headers.
|
|
128
128
|
*/
|
|
129
129
|
|
|
130
130
|
|
|
@@ -139,10 +139,10 @@ class HttpModule extends _OxygenModule.default {
|
|
|
139
139
|
this._password = password;
|
|
140
140
|
this._domain = domain;
|
|
141
141
|
}
|
|
142
|
-
/**
|
|
143
|
-
* @summary Sets proxy url to be used for connections with the service.
|
|
144
|
-
* @function setProxy
|
|
145
|
-
* @param {String} url - Proxy server URL. Not passing this argument will reset the proxy settings.
|
|
142
|
+
/**
|
|
143
|
+
* @summary Sets proxy url to be used for connections with the service.
|
|
144
|
+
* @function setProxy
|
|
145
|
+
* @param {String} url - Proxy server URL. Not passing this argument will reset the proxy settings.
|
|
146
146
|
*/
|
|
147
147
|
|
|
148
148
|
|
|
@@ -176,28 +176,28 @@ class HttpModule extends _OxygenModule.default {
|
|
|
176
176
|
global.GLOBAL_AGENT.HTTP_PROXY = false;
|
|
177
177
|
}
|
|
178
178
|
}
|
|
179
|
-
/**
|
|
180
|
-
* @summary Performs HTTP GET
|
|
181
|
-
* @function get
|
|
182
|
-
* @param {String} url - URL.
|
|
183
|
-
* @param {Object=} headers - HTTP headers.
|
|
184
|
-
* @return {Object} Response object.
|
|
185
|
-
* @example <caption>[javascript] Usage example</caption>
|
|
186
|
-
* // Basic usage example:
|
|
187
|
-
* var response = http.get(
|
|
188
|
-
* 'https://api.github.com/repos/oxygenhq/oxygen-ide/releases',
|
|
189
|
-
* {
|
|
190
|
-
* 'Accept-Encoding': 'gzip, deflate',
|
|
191
|
-
* 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0'
|
|
192
|
-
* });
|
|
193
|
-
* log.info(response.body);
|
|
194
|
-
*
|
|
195
|
-
* // If server returns Deflate-compressed stream without headers, `deflateRaw` can be used to decompress the content.
|
|
196
|
-
* http.setOptions({
|
|
197
|
-
* deflateRaw: true
|
|
198
|
-
* });
|
|
199
|
-
* var response = http.get('https://FOO.BAR');
|
|
200
|
-
* log.info(response.body);
|
|
179
|
+
/**
|
|
180
|
+
* @summary Performs HTTP GET
|
|
181
|
+
* @function get
|
|
182
|
+
* @param {String} url - URL.
|
|
183
|
+
* @param {Object=} headers - HTTP headers.
|
|
184
|
+
* @return {Object} Response object.
|
|
185
|
+
* @example <caption>[javascript] Usage example</caption>
|
|
186
|
+
* // Basic usage example:
|
|
187
|
+
* var response = http.get(
|
|
188
|
+
* 'https://api.github.com/repos/oxygenhq/oxygen-ide/releases',
|
|
189
|
+
* {
|
|
190
|
+
* 'Accept-Encoding': 'gzip, deflate',
|
|
191
|
+
* 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0'
|
|
192
|
+
* });
|
|
193
|
+
* log.info(response.body);
|
|
194
|
+
*
|
|
195
|
+
* // If server returns Deflate-compressed stream without headers, `deflateRaw` can be used to decompress the content.
|
|
196
|
+
* http.setOptions({
|
|
197
|
+
* deflateRaw: true
|
|
198
|
+
* });
|
|
199
|
+
* var response = http.get('https://FOO.BAR');
|
|
200
|
+
* log.info(response.body);
|
|
201
201
|
*/
|
|
202
202
|
|
|
203
203
|
|
|
@@ -210,14 +210,14 @@ class HttpModule extends _OxygenModule.default {
|
|
|
210
210
|
};
|
|
211
211
|
return await this._httpRequestSync(httpOpts);
|
|
212
212
|
}
|
|
213
|
-
/**
|
|
214
|
-
* @summary Performs HTTP POST
|
|
215
|
-
* @function post
|
|
216
|
-
* @param {String} url - URL.
|
|
217
|
-
* @param {Object} data - Data.
|
|
218
|
-
* @param {Object=} headers - HTTP headers.
|
|
219
|
-
* @param {Boolean=} isFormData - Indicates if "data" parameter is of URL-encoded form type.
|
|
220
|
-
* @return {Object} Response object.
|
|
213
|
+
/**
|
|
214
|
+
* @summary Performs HTTP POST
|
|
215
|
+
* @function post
|
|
216
|
+
* @param {String} url - URL.
|
|
217
|
+
* @param {Object} data - Data.
|
|
218
|
+
* @param {Object=} headers - HTTP headers.
|
|
219
|
+
* @param {Boolean=} isFormData - Indicates if "data" parameter is of URL-encoded form type.
|
|
220
|
+
* @return {Object} Response object.
|
|
221
221
|
*/
|
|
222
222
|
|
|
223
223
|
|
|
@@ -233,13 +233,13 @@ class HttpModule extends _OxygenModule.default {
|
|
|
233
233
|
};
|
|
234
234
|
return await this._httpRequestSync(httpOpts);
|
|
235
235
|
}
|
|
236
|
-
/**
|
|
237
|
-
* @summary Performs HTTP PUT
|
|
238
|
-
* @function put
|
|
239
|
-
* @param {String} url - URL.
|
|
240
|
-
* @param {Object} data - Data.
|
|
241
|
-
* @param {Object=} headers - HTTP headers.
|
|
242
|
-
* @return {Object} Response object.
|
|
236
|
+
/**
|
|
237
|
+
* @summary Performs HTTP PUT
|
|
238
|
+
* @function put
|
|
239
|
+
* @param {String} url - URL.
|
|
240
|
+
* @param {Object} data - Data.
|
|
241
|
+
* @param {Object=} headers - HTTP headers.
|
|
242
|
+
* @return {Object} Response object.
|
|
243
243
|
*/
|
|
244
244
|
|
|
245
245
|
|
|
@@ -255,13 +255,13 @@ class HttpModule extends _OxygenModule.default {
|
|
|
255
255
|
};
|
|
256
256
|
return await this._httpRequestSync(httpOpts);
|
|
257
257
|
}
|
|
258
|
-
/**
|
|
259
|
-
* @summary Performs HTTP PATCH
|
|
260
|
-
* @function patch
|
|
261
|
-
* @param {String} url - URL.
|
|
262
|
-
* @param {Object} data - Data.
|
|
263
|
-
* @param {Object=} headers - HTTP headers.
|
|
264
|
-
* @return {Object} Response object.
|
|
258
|
+
/**
|
|
259
|
+
* @summary Performs HTTP PATCH
|
|
260
|
+
* @function patch
|
|
261
|
+
* @param {String} url - URL.
|
|
262
|
+
* @param {Object} data - Data.
|
|
263
|
+
* @param {Object=} headers - HTTP headers.
|
|
264
|
+
* @return {Object} Response object.
|
|
265
265
|
*/
|
|
266
266
|
|
|
267
267
|
|
|
@@ -277,13 +277,13 @@ class HttpModule extends _OxygenModule.default {
|
|
|
277
277
|
};
|
|
278
278
|
return await this._httpRequestSync(httpOpts);
|
|
279
279
|
}
|
|
280
|
-
/**
|
|
281
|
-
* @summary Performs HTTP DELETE
|
|
282
|
-
* @function delete
|
|
283
|
-
* @param {String} url - URL.
|
|
284
|
-
* @param {Object=} headers - HTTP headers.
|
|
285
|
-
* @param {Object} data - Data.
|
|
286
|
-
* @return {Object} Response object.
|
|
280
|
+
/**
|
|
281
|
+
* @summary Performs HTTP DELETE
|
|
282
|
+
* @function delete
|
|
283
|
+
* @param {String} url - URL.
|
|
284
|
+
* @param {Object=} headers - HTTP headers.
|
|
285
|
+
* @param {Object} data - Data.
|
|
286
|
+
* @return {Object} Response object.
|
|
287
287
|
*/
|
|
288
288
|
|
|
289
289
|
|
|
@@ -299,30 +299,30 @@ class HttpModule extends _OxygenModule.default {
|
|
|
299
299
|
};
|
|
300
300
|
return await this._httpRequestSync(httpOpts);
|
|
301
301
|
}
|
|
302
|
-
/**
|
|
303
|
-
* @summary Returns last response object
|
|
304
|
-
* @function getResponse
|
|
305
|
-
* @return {Object} Response object.
|
|
302
|
+
/**
|
|
303
|
+
* @summary Returns last response object
|
|
304
|
+
* @function getResponse
|
|
305
|
+
* @return {Object} Response object.
|
|
306
306
|
*/
|
|
307
307
|
|
|
308
308
|
|
|
309
309
|
getResponse() {
|
|
310
310
|
return this._lastResponse;
|
|
311
311
|
}
|
|
312
|
-
/**
|
|
313
|
-
* @summary Returns last response body
|
|
314
|
-
* @function getResponseBody
|
|
315
|
-
* @return {String} Response body.
|
|
312
|
+
/**
|
|
313
|
+
* @summary Returns last response body
|
|
314
|
+
* @function getResponseBody
|
|
315
|
+
* @return {String} Response body.
|
|
316
316
|
*/
|
|
317
317
|
|
|
318
318
|
|
|
319
319
|
getResponseBody() {
|
|
320
320
|
return this._lastResponse && this._lastResponse.body ? this._lastResponse.body : null;
|
|
321
321
|
}
|
|
322
|
-
/**
|
|
323
|
-
* @summary Returns response headers
|
|
324
|
-
* @function getResponseHeaders
|
|
325
|
-
* @return {Object} Response headers.
|
|
322
|
+
/**
|
|
323
|
+
* @summary Returns response headers
|
|
324
|
+
* @function getResponseHeaders
|
|
325
|
+
* @return {Object} Response headers.
|
|
326
326
|
*/
|
|
327
327
|
|
|
328
328
|
|
|
@@ -333,10 +333,10 @@ class HttpModule extends _OxygenModule.default {
|
|
|
333
333
|
|
|
334
334
|
return this._lastResponse.headers;
|
|
335
335
|
}
|
|
336
|
-
/**
|
|
337
|
-
* @summary Returns response URL
|
|
338
|
-
* @function getResponseUrl
|
|
339
|
-
* @return {String} Response URL.
|
|
336
|
+
/**
|
|
337
|
+
* @summary Returns response URL
|
|
338
|
+
* @function getResponseUrl
|
|
339
|
+
* @return {String} Response URL.
|
|
340
340
|
*/
|
|
341
341
|
|
|
342
342
|
|
|
@@ -347,10 +347,10 @@ class HttpModule extends _OxygenModule.default {
|
|
|
347
347
|
|
|
348
348
|
return this._lastResponse.url;
|
|
349
349
|
}
|
|
350
|
-
/**
|
|
351
|
-
* @summary Assert whether the specified pattern is present in the response body.
|
|
352
|
-
* @function assertText
|
|
353
|
-
* @param {String} pattern - Pattern to assert.
|
|
350
|
+
/**
|
|
351
|
+
* @summary Assert whether the specified pattern is present in the response body.
|
|
352
|
+
* @function assertText
|
|
353
|
+
* @param {String} pattern - Pattern to assert.
|
|
354
354
|
*/
|
|
355
355
|
|
|
356
356
|
|
|
@@ -371,21 +371,21 @@ class HttpModule extends _OxygenModule.default {
|
|
|
371
371
|
|
|
372
372
|
return true;
|
|
373
373
|
}
|
|
374
|
-
/**
|
|
375
|
-
* @summary Assert response time
|
|
376
|
-
* @function assertResponseTime
|
|
377
|
-
* @param {Number} maxTime - Maximum response time in milliseconds.
|
|
374
|
+
/**
|
|
375
|
+
* @summary Assert response time
|
|
376
|
+
* @function assertResponseTime
|
|
377
|
+
* @param {Number} maxTime - Maximum response time in milliseconds.
|
|
378
378
|
*/
|
|
379
379
|
|
|
380
380
|
|
|
381
381
|
assertResponseTime(maxTime) {
|
|
382
382
|
throw new Error('Not implemented');
|
|
383
383
|
}
|
|
384
|
-
/**
|
|
385
|
-
* @summary Assert if HTTP header is presented in the response
|
|
386
|
-
* @function assertHeader
|
|
387
|
-
* @param {String} headerName - A HTTP header name.
|
|
388
|
-
* @param {String=} headerValuePattern - An optional HTTP header value pattern.
|
|
384
|
+
/**
|
|
385
|
+
* @summary Assert if HTTP header is presented in the response
|
|
386
|
+
* @function assertHeader
|
|
387
|
+
* @param {String} headerName - A HTTP header name.
|
|
388
|
+
* @param {String=} headerValuePattern - An optional HTTP header value pattern.
|
|
389
389
|
*/
|
|
390
390
|
|
|
391
391
|
|
|
@@ -407,21 +407,21 @@ class HttpModule extends _OxygenModule.default {
|
|
|
407
407
|
}
|
|
408
408
|
}
|
|
409
409
|
}
|
|
410
|
-
/**
|
|
411
|
-
* @summary Assert if HTTP cookie is presented in the response
|
|
412
|
-
* @function assertCookie
|
|
413
|
-
* @param {String} cookieName - A HTTP cookie name.
|
|
414
|
-
* @param {String=} cookieValuePattern - An optional HTTP cookie value pattern.
|
|
410
|
+
/**
|
|
411
|
+
* @summary Assert if HTTP cookie is presented in the response
|
|
412
|
+
* @function assertCookie
|
|
413
|
+
* @param {String} cookieName - A HTTP cookie name.
|
|
414
|
+
* @param {String=} cookieValuePattern - An optional HTTP cookie value pattern.
|
|
415
415
|
*/
|
|
416
416
|
|
|
417
417
|
|
|
418
418
|
assertCookie(cookieName, cookieValuePattern) {
|
|
419
419
|
throw new Error('Not implemented');
|
|
420
420
|
}
|
|
421
|
-
/**
|
|
422
|
-
* @summary Assert the last HTTP response's status code
|
|
423
|
-
* @function assertStatus
|
|
424
|
-
* @param {Number|Array} codeList - A single status code or a list of codes.
|
|
421
|
+
/**
|
|
422
|
+
* @summary Assert the last HTTP response's status code
|
|
423
|
+
* @function assertStatus
|
|
424
|
+
* @param {Number|Array} codeList - A single status code or a list of codes.
|
|
425
425
|
*/
|
|
426
426
|
|
|
427
427
|
|
|
@@ -443,20 +443,20 @@ class HttpModule extends _OxygenModule.default {
|
|
|
443
443
|
|
|
444
444
|
return true;
|
|
445
445
|
}
|
|
446
|
-
/**
|
|
447
|
-
* @summary Assert HTTP 200 OK status
|
|
448
|
-
* @function assertStatusOk
|
|
446
|
+
/**
|
|
447
|
+
* @summary Assert HTTP 200 OK status
|
|
448
|
+
* @function assertStatusOk
|
|
449
449
|
*/
|
|
450
450
|
|
|
451
451
|
|
|
452
452
|
assertStatusOk() {
|
|
453
453
|
return this.assertStatus(200);
|
|
454
454
|
}
|
|
455
|
-
/**
|
|
456
|
-
* @summary Opens new transaction.
|
|
457
|
-
* @description The transaction will persist till a new one is opened. Transaction names must be unique.
|
|
458
|
-
* @function transaction
|
|
459
|
-
* @param {String} name - The transaction name.
|
|
455
|
+
/**
|
|
456
|
+
* @summary Opens new transaction.
|
|
457
|
+
* @description The transaction will persist till a new one is opened. Transaction names must be unique.
|
|
458
|
+
* @function transaction
|
|
459
|
+
* @param {String} name - The transaction name.
|
|
460
460
|
*/
|
|
461
461
|
|
|
462
462
|
|
|
@@ -772,4 +772,4 @@ class HttpModule extends _OxygenModule.default {
|
|
|
772
772
|
}
|
|
773
773
|
|
|
774
774
|
exports.default = HttpModule;
|
|
775
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1odHRwLmpzIl0sIm5hbWVzIjpbImh0dHAiLCJyZXF1aXJlIiwiaHR0cHMiLCJNT0RVTEVfTkFNRSIsIlJFU1BPTlNFX1RJTUVPVVQiLCJEQUZBVUxUX0hUVFAyIiwiREVGQVVMVF9IVFRQX09QVElPTlMiLCJkZWNvbXByZXNzIiwicmVzcG9uc2VUeXBlIiwidGltZW91dCIsImxvb2t1cCIsImNvbm5lY3QiLCJzZWN1cmVDb25uZWN0Iiwic29ja2V0Iiwic2VuZCIsInJlc3BvbnNlIiwiaHR0cDIiLCJyZWplY3RVbmF1dGhvcml6ZWQiLCJkbnNMb29rdXBJcFZlcnNpb24iLCJDT05URU5UX1RZUEVfSEVBREVSIiwiSFRUUF9NRVRIT0RTIiwiSHR0cE1vZHVsZSIsIk94eWdlbk1vZHVsZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsIl9hbHdheXNJbml0aWFsaXplZCIsIl9sYXN0UmVzcG9uc2UiLCJfYmFzZVVybCIsIl91c2VySHR0cE9wdGlvbnMiLCJfdXNlcm5hbWUiLCJ1bmRlZmluZWQiLCJfcGFzc3dvcmQiLCJfZG9tYWluIiwiX2lzSW5pdGlhbGl6ZWQiLCJuYW1lIiwibmV3Rm9ybURhdGEiLCJGb3JtRGF0YSIsInNldE9wdGlvbnMiLCJvcHRzIiwiZGVmbGF0ZVJhdyIsInNldE50bG1Vc2VyIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsImRvbWFpbiIsInNldFByb3h5IiwidXJsIiwiYm9vdHN0cmFwIiwicGFyc2UiLCJwYXJzZWRVcmwiLCJob3N0bmFtZSIsIk94RXJyb3IiLCJlcnJIZWxwZXIiLCJlcnJvckNvZGUiLCJIVFRQX0VSUk9SIiwicG9ydCIsInByb3RvY29sIiwiZ2xvYmFsIiwiR0xPQkFMX0FHRU5UIiwiSFRUUF9QUk9YWSIsImdldCIsImhlYWRlcnMiLCJodHRwT3B0cyIsIm1ldGhvZCIsIl9odHRwUmVxdWVzdFN5bmMiLCJwb3N0IiwiZGF0YSIsImlzRm9ybURhdGEiLCJyZXNvbHZlZERhdGEiLCJfcmVzb2x2ZURhdGEiLCJwdXQiLCJwYXRjaCIsImRlbGV0ZSIsImdldFJlc3BvbnNlIiwiZ2V0UmVzcG9uc2VCb2R5IiwiYm9keSIsImdldFJlc3BvbnNlSGVhZGVycyIsImdldFJlc3BvbnNlVXJsIiwiYXNzZXJ0VGV4dCIsInBhdHRlcm4iLCJBU1NFUlRfRVJST1IiLCJyZXNwQ29udGVudCIsIkpTT04iLCJzdHJpbmdpZnkiLCJtb2RVdGlscyIsIm1hdGNoUGF0dGVybiIsImFzc2VydFJlc3BvbnNlVGltZSIsIm1heFRpbWUiLCJFcnJvciIsImFzc2VydEhlYWRlciIsImhlYWRlck5hbWUiLCJoZWFkZXJWYWx1ZVBhdHRlcm4iLCJsZW5ndGgiLCJ0b0xvd2VyQ2FzZSIsImFjdHVhbEhlYWRlclZhbHVlIiwiYXNzZXJ0Q29va2llIiwiY29va2llTmFtZSIsImNvb2tpZVZhbHVlUGF0dGVybiIsImFzc2VydFN0YXR1cyIsImNvZGVMaXN0IiwiQXJyYXkiLCJpc0FycmF5Iiwic3RhdHVzQ29kZSIsImluY2x1ZGVzIiwiYXNzZXJ0U3RhdHVzT2siLCJ0cmFuc2FjdGlvbiIsInRvU3RyaW5nIiwic2xpY2UiLCJfbGFzdFRyYW5zYWN0aW9uTmFtZSIsImdldFN0ZXBEaXNwbGF5TmFtZSIsIm1ldGhvZE5hbWUiLCJtZXRob2RBcmdzIiwicmV0dmFsIiwiZXJyb3IiLCJfZXh0cmEiLCJyZXF1ZXN0IiwidG9VcHBlckNhc2UiLCJwYXRoIiwiX2FkZFJlcXVlc3RFeHRyYSIsInVwZGF0ZWRPcHRpb25zIiwiVVJMIiwicmVxRXh0cmEiLCJwYXRobmFtZSIsInNlYXJjaCIsImhhc2giLCJxdWVyeVBhcmFtcyIsIl9nZXRRdWVyeVBhcmFtcyIsInNlYXJjaFBhcmFtcyIsImNvbnRlbnRUeXBlIiwiX2dldENvbnRlbnRUeXBlIiwiY29udGVudExlbmd0aCIsIl9nZXRDb250ZW50TGVuZ3RoIiwiZm9ybSIsImZvcm1EYXRhIiwianNvbiIsIk9iamVjdCIsImNvbnRlbnQiLCJtYXRjaCIsImxlbmd0aEFzU3RyIiwicGFyc2VJbnQiLCJmcm9tIiwia2V5cyIsInJlZHVjZSIsInJlY29yZCIsImtleSIsInZhbHVlcyIsImdldEFsbCIsImpvaW4iLCJfYWRkUmVzcG9uc2VFeHRyYSIsInJlc0V4dHJhIiwicmVkaXJlY3RVcmxzIiwic3RhdHVzVGV4dCIsInN0YXR1c01lc3NhZ2UiLCJ2ZXJzaW9uIiwiaHR0cFZlcnNpb24iLCJ0aW1pbmdzIiwicGhhc2VzIiwiZGF0YVJlc29sdmVyIiwiYXNzZXJ0Q2lyY3VsYXIiLCJ3aXRoQXV0aCIsInJlc3VsdCIsImhvb2tzIiwiYmVmb3JlUmVxdWVzdCIsInpsaWIiLCJkZWNvbXAiLCJjcmVhdGVJbmZsYXRlUmF3Iiwid3JpdGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uIiwiZSIsImF1dGhSZXFSZXN1bHQiLCJfaGFuZGxlTnRsbUF1dGhvcml6YXRpb24iLCJlcnJvck1lc3NhZ2UiLCJtZXNzYWdlIiwicmF3Qm9keSIsInVwZ3JhZGUiLCJyZXF1ZXN0VXJsIiwiaXNGcm9tQ2FjaGUiLCJpcCIsInJldHJ5Q291bnQiLCJhdXRoTWV0aG9kcyIsIm9wdHNXaXRoQXV0aCIsInNvbWUiLCJtIiwic3RhcnRzV2l0aCIsInJlcVVybCIsImlzSHR0cHMiLCJrZWVwYWxpdmVBZ2VudCIsIkFnZW50Iiwia2VlcEFsaXZlIiwiYWdlbnQiLCJudGxtT3B0cyIsIndvcmtzdGF0aW9uIiwibnRsbSIsImNyZWF0ZVR5cGUxTWVzc2FnZSIsInRocm93SHR0cEVycm9ycyIsInR5cGUxTXNnUmVzcG9uc2UiLCJ0eXBlMk1zZyIsInBhcnNlVHlwZTJNZXNzYWdlIiwiZm9sbG93UmVkaXJlY3QiLCJjcmVhdGVUeXBlM01lc3NhZ2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQWFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUlBOzs7Ozs7OztBQXZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBWUEsTUFBTUEsSUFBSSxHQUFHQyxPQUFPLENBQUMsTUFBRCxDQUFwQjs7QUFDQSxNQUFNQyxLQUFLLEdBQUdELE9BQU8sQ0FBQyxPQUFELENBQXJCOztBQUVBLE1BQU1FLFdBQVcsR0FBRyxNQUFwQjtBQUNBLE1BQU1DLGdCQUFnQixHQUFHLE9BQU8sRUFBaEMsQyxDQUFzQzs7QUFDdEMsTUFBTUMsYUFBYSxHQUFHLEtBQXRCO0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUc7QUFDekJDLEVBQUFBLFVBQVUsRUFBRSxJQURhO0FBRXpCQyxFQUFBQSxZQUFZLEVBQUUsTUFGVztBQUd6QkMsRUFBQUEsT0FBTyxFQUFFO0FBQ0xDLElBQUFBLE1BQU0sRUFBRSxJQURIO0FBRUxDLElBQUFBLE9BQU8sRUFBRSxHQUZKO0FBR0xDLElBQUFBLGFBQWEsRUFBRSxHQUhWO0FBSUxDLElBQUFBLE1BQU0sRUFBRSxNQUpIO0FBS0xDLElBQUFBLElBQUksRUFBRSxNQUxEO0FBTUxDLElBQUFBLFFBQVEsRUFBRVg7QUFOTCxHQUhnQjtBQVd6QlksRUFBQUEsS0FBSyxFQUFFWCxhQVhrQjtBQVl6QkgsRUFBQUEsS0FBSyxFQUFFO0FBQ0hlLElBQUFBLGtCQUFrQixFQUFFO0FBRGpCLEdBWmtCO0FBZXpCQyxFQUFBQSxrQkFBa0IsRUFBRTtBQWZLLENBQTdCO0FBaUJBLE1BQU1DLG1CQUFtQixHQUFHLGNBQTVCO0FBQ0EsTUFBTUMsWUFBWSxHQUFHLENBQ2pCLEtBRGlCLEVBRWpCLE1BRmlCLEVBR2pCLE9BSGlCLENBQXJCOztBQU1lLE1BQU1DLFVBQU4sU0FBeUJDLHFCQUF6QixDQUFzQztBQUNqREMsRUFBQUEsV0FBVyxDQUFDQyxPQUFELEVBQVVDLE9BQVYsRUFBbUJDLEVBQW5CLEVBQXVCQyxNQUF2QixFQUErQkMsT0FBL0IsRUFBd0NDLFFBQXhDLEVBQWtEO0FBQ3pELFVBQU1MLE9BQU4sRUFBZUMsT0FBZixFQUF3QkMsRUFBeEIsRUFBNEJDLE1BQTVCLEVBQW9DQyxPQUFwQyxFQUE2Q0MsUUFBN0M7QUFDQSxTQUFLQyxrQkFBTCxHQUEwQixJQUExQjtBQUNBLFNBQUtDLGFBQUwsR0FBcUIsSUFBckI7QUFDQSxTQUFLQyxRQUFMLEdBQWdCLElBQWhCO0FBQ0EsU0FBS0MsZ0JBQUwsR0FBd0IsRUFBeEI7QUFDQSxTQUFLQyxTQUFMLEdBQWlCQyxTQUFqQjtBQUNBLFNBQUtDLFNBQUwsR0FBaUJELFNBQWpCO0FBQ0EsU0FBS0UsT0FBTCxHQUFlRixTQUFmLENBUnlELENBU3pEOztBQUNBLFNBQUtHLGNBQUwsR0FBc0IsSUFBdEI7QUFDSDtBQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7OztBQUNZLE1BQUpDLElBQUksR0FBRztBQUNQLFdBQU9wQyxXQUFQO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBOzs7QUFDSXFDLEVBQUFBLFdBQVcsR0FBRztBQUNWLFdBQU8sSUFBSUMsaUJBQUosRUFBUDtBQUNIO0FBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDSUMsRUFBQUEsVUFBVSxDQUFDQyxJQUFELEVBQU87QUFDYixTQUFLVixnQkFBTCxHQUF3QlUsSUFBeEI7O0FBQ0EsUUFBSUEsSUFBSSxDQUFDQyxVQUFULEVBQXFCO0FBQ2pCLFdBQUtYLGdCQUFMLENBQXNCMUIsVUFBdEIsR0FBbUMsS0FBbkMsQ0FEaUIsQ0FDNkI7QUFDakQ7QUFDSjtBQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNJc0MsRUFBQUEsV0FBVyxDQUFDQyxRQUFELEVBQVdDLFFBQVgsRUFBcUJDLE1BQU0sR0FBR2IsU0FBOUIsRUFBeUM7QUFDaEQ7QUFDQSxRQUFJVyxRQUFRLElBQUlYLFNBQWhCLEVBQTJCO0FBQ3ZCLFdBQUtELFNBQUwsR0FBaUIsS0FBS0UsU0FBTCxHQUFpQixLQUFLQyxPQUFMLEdBQWVGLFNBQWpEO0FBQ0E7QUFDSDs7QUFDRCxTQUFLRCxTQUFMLEdBQWlCWSxRQUFqQjtBQUNBLFNBQUtWLFNBQUwsR0FBaUJXLFFBQWpCO0FBQ0EsU0FBS1YsT0FBTCxHQUFlVyxNQUFmO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBOzs7QUFDSUMsRUFBQUEsUUFBUSxDQUFDQyxHQUFELEVBQU07QUFDVixRQUFJQSxHQUFKLEVBQVM7QUFDTCxZQUFNO0FBQ0ZDLFFBQUFBO0FBREUsVUFFRmxELE9BQU8sQ0FBQyxjQUFELENBRlg7O0FBSUEsWUFBTTtBQUFFbUQsUUFBQUE7QUFBRixVQUFZbkQsT0FBTyxDQUFDLEtBQUQsQ0FBekI7O0FBQ0EsWUFBTW9ELFNBQVMsR0FBR0QsS0FBSyxDQUFDRixHQUFELENBQXZCOztBQUVBLFVBQUksQ0FBQ0csU0FBUyxDQUFDQyxRQUFmLEVBQXlCO0FBQ3JCLGNBQU0sSUFBSUMsb0JBQUosQ0FBWUMsZ0JBQVVDLFNBQVYsQ0FBb0JDLFVBQWhDLEVBQTRDLHVCQUE1QyxDQUFOO0FBQ0g7O0FBQ0QsVUFBSSxDQUFDTCxTQUFTLENBQUNNLElBQWYsRUFBcUI7QUFDakIsY0FBTSxJQUFJSixvQkFBSixDQUFZQyxnQkFBVUMsU0FBVixDQUFvQkMsVUFBaEMsRUFBNEMsbUJBQTVDLENBQU47QUFDSDs7QUFDRCxVQUFJLENBQUNMLFNBQVMsQ0FBQ08sUUFBZixFQUF5QjtBQUNyQixjQUFNLElBQUlMLG9CQUFKLENBQVlDLGdCQUFVQyxTQUFWLENBQW9CQyxVQUFoQyxFQUE0Qyx1QkFBNUMsQ0FBTjtBQUNIOztBQUVEUCxNQUFBQSxTQUFTO0FBQ1RVLE1BQUFBLE1BQU0sQ0FBQ0MsWUFBUCxDQUFvQkMsVUFBcEIsR0FBaUNiLEdBQWpDO0FBQ0gsS0FwQkQsTUFvQk87QUFDSFcsTUFBQUEsTUFBTSxDQUFDQyxZQUFQLENBQW9CQyxVQUFwQixHQUFpQyxLQUFqQztBQUNIO0FBQ0o7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDYSxRQUFIQyxHQUFHLENBQUNkLEdBQUQsRUFBTWUsT0FBTixFQUFlO0FBQ3BCLFVBQU1DLFFBQVEsR0FBRyxFQUNiLEdBQUc1RCxvQkFEVTtBQUViLFVBQUcsS0FBSzJCLGdCQUFMLElBQXlCLEVBQTVCLENBRmE7QUFHYmlCLE1BQUFBLEdBQUcsRUFBRUEsR0FIUTtBQUliaUIsTUFBQUEsTUFBTSxFQUFFLEtBSks7QUFLYkYsTUFBQUEsT0FBTyxFQUFFQSxPQUFPLElBQUk7QUFMUCxLQUFqQjtBQU9BLFdBQU8sTUFBTSxLQUFLRyxnQkFBTCxDQUFzQkYsUUFBdEIsQ0FBYjtBQUNIO0FBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDYyxRQUFKRyxJQUFJLENBQUNuQixHQUFELEVBQU1vQixJQUFOLEVBQVlMLE9BQVosRUFBcUJNLFVBQVUsR0FBRyxLQUFsQyxFQUF5QztBQUMvQyxVQUFNQyxZQUFZLEdBQUcsS0FBS0MsWUFBTCxDQUFrQkgsSUFBbEIsRUFBd0JMLE9BQXhCLEVBQWlDTSxVQUFqQyxDQUFyQjs7QUFDQSxVQUFNTCxRQUFRLEdBQUcsRUFDYixHQUFHNUQsb0JBRFU7QUFFYixVQUFHLEtBQUsyQixnQkFBTCxJQUF5QixFQUE1QixDQUZhO0FBR2JpQixNQUFBQSxHQUFHLEVBQUVBLEdBSFE7QUFJYmlCLE1BQUFBLE1BQU0sRUFBRSxNQUpLO0FBS2JGLE1BQUFBLE9BQU8sRUFBRUEsT0FBTyxJQUFJLEVBTFA7QUFNYixTQUFHTztBQU5VLEtBQWpCO0FBUUEsV0FBTyxNQUFNLEtBQUtKLGdCQUFMLENBQXNCRixRQUF0QixDQUFiO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDYSxRQUFIUSxHQUFHLENBQUN4QixHQUFELEVBQU1vQixJQUFOLEVBQVlMLE9BQVosRUFBcUI7QUFDMUIsVUFBTU8sWUFBWSxHQUFHLEtBQUtDLFlBQUwsQ0FBa0JILElBQWxCLENBQXJCOztBQUVBLFVBQU1KLFFBQVEsR0FBRyxFQUNiLEdBQUc1RCxvQkFEVTtBQUViLFVBQUcsS0FBSzJCLGdCQUFMLElBQXlCLEVBQTVCLENBRmE7QUFHYmlCLE1BQUFBLEdBQUcsRUFBRUEsR0FIUTtBQUliaUIsTUFBQUEsTUFBTSxFQUFFLEtBSks7QUFLYkYsTUFBQUEsT0FBTyxFQUFFQSxPQUFPLElBQUksRUFMUDtBQU1iLFNBQUdPO0FBTlUsS0FBakI7QUFRQSxXQUFPLE1BQU0sS0FBS0osZ0JBQUwsQ0FBc0JGLFFBQXRCLENBQWI7QUFDSDtBQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNlLFFBQUxTLEtBQUssQ0FBQ3pCLEdBQUQsRUFBTW9CLElBQU4sRUFBWUwsT0FBWixFQUFxQjtBQUM1QixVQUFNTyxZQUFZLEdBQUcsS0FBS0MsWUFBTCxDQUFrQkgsSUFBbEIsQ0FBckI7O0FBRUEsVUFBTUosUUFBUSxHQUFHLEVBQ2IsR0FBRzVELG9CQURVO0FBRWIsVUFBRyxLQUFLMkIsZ0JBQUwsSUFBeUIsRUFBNUIsQ0FGYTtBQUdiaUIsTUFBQUEsR0FBRyxFQUFFQSxHQUhRO0FBSWJpQixNQUFBQSxNQUFNLEVBQUUsT0FKSztBQUtiRixNQUFBQSxPQUFPLEVBQUVBLE9BQU8sSUFBSSxFQUxQO0FBTWIsU0FBR087QUFOVSxLQUFqQjtBQVFBLFdBQU8sTUFBTSxLQUFLSixnQkFBTCxDQUFzQkYsUUFBdEIsQ0FBYjtBQUNIO0FBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ2dCLFFBQU5VLE1BQU0sQ0FBQzFCLEdBQUQsRUFBTWUsT0FBTixFQUFlSyxJQUFmLEVBQXFCO0FBQzdCLFVBQU1FLFlBQVksR0FBRyxLQUFLQyxZQUFMLENBQWtCSCxJQUFsQixDQUFyQjs7QUFDQSxVQUFNSixRQUFRLEdBQUcsRUFDYixHQUFHNUQsb0JBRFU7QUFFYixVQUFHLEtBQUsyQixnQkFBTCxJQUF5QixFQUE1QixDQUZhO0FBR2JpQixNQUFBQSxHQUFHLEVBQUVBLEdBSFE7QUFJYmlCLE1BQUFBLE1BQU0sRUFBRSxRQUpLO0FBS2JGLE1BQUFBLE9BQU8sRUFBRUEsT0FBTyxJQUFJLEVBTFA7QUFNYixTQUFHTztBQU5VLEtBQWpCO0FBUUEsV0FBTyxNQUFNLEtBQUtKLGdCQUFMLENBQXNCRixRQUF0QixDQUFiO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBOzs7QUFDSVcsRUFBQUEsV0FBVyxHQUFHO0FBQ1YsV0FBTyxLQUFLOUMsYUFBWjtBQUNIO0FBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0krQyxFQUFBQSxlQUFlLEdBQUc7QUFDZCxXQUFPLEtBQUsvQyxhQUFMLElBQXNCLEtBQUtBLGFBQUwsQ0FBbUJnRCxJQUF6QyxHQUFnRCxLQUFLaEQsYUFBTCxDQUFtQmdELElBQW5FLEdBQTBFLElBQWpGO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBOzs7QUFDSUMsRUFBQUEsa0JBQWtCLEdBQUc7QUFDakIsUUFBSSxDQUFDLEtBQUtqRCxhQUFWLEVBQXlCO0FBQ3JCLGFBQU8sSUFBUDtBQUNIOztBQUNELFdBQU8sS0FBS0EsYUFBTCxDQUFtQmtDLE9BQTFCO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBOzs7QUFDSWdCLEVBQUFBLGNBQWMsR0FBRztBQUNiLFFBQUksQ0FBQyxLQUFLbEQsYUFBVixFQUF5QjtBQUNyQixhQUFPLElBQVA7QUFDSDs7QUFDRCxXQUFPLEtBQUtBLGFBQUwsQ0FBbUJtQixHQUExQjtBQUNIO0FBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0lnQyxFQUFBQSxVQUFVLENBQUNDLE9BQUQsRUFBVTtBQUNoQixRQUFJLENBQUMsS0FBS3BELGFBQVYsRUFBeUI7QUFDckIsYUFBTyxLQUFQO0FBQ0g7O0FBQ0QsUUFBSSxDQUFDLEtBQUtBLGFBQUwsQ0FBbUJnRCxJQUF4QixFQUE4QjtBQUMxQixZQUFNLElBQUl4QixvQkFBSixDQUFZQyxnQkFBVUMsU0FBVixDQUFvQjJCLFlBQWhDLEVBQThDLHdCQUE5QyxDQUFOO0FBQ0g7O0FBQ0QsVUFBTUMsV0FBVyxHQUFHLE9BQU8sS0FBS3RELGFBQUwsQ0FBbUJnRCxJQUExQixLQUFtQyxRQUFuQyxHQUE4QyxLQUFLaEQsYUFBTCxDQUFtQmdELElBQWpFLEdBQXdFTyxJQUFJLENBQUNDLFNBQUwsQ0FBZSxLQUFLeEQsYUFBTCxDQUFtQmdELElBQWxDLENBQTVGOztBQUNBLFFBQUksQ0FBQ1MsZUFBU0MsWUFBVCxDQUFzQkosV0FBdEIsRUFBbUNGLE9BQW5DLENBQUwsRUFBa0Q7QUFDOUMsWUFBTSxJQUFJNUIsb0JBQUosQ0FBWUMsZ0JBQVVDLFNBQVYsQ0FBb0IyQixZQUFoQyxFQUErQyw2Q0FBNENELE9BQVEsZUFBY0UsV0FBWSxHQUE3SCxDQUFOO0FBQ0g7O0FBQ0QsV0FBTyxJQUFQO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBOzs7QUFDSUssRUFBQUEsa0JBQWtCLENBQUNDLE9BQUQsRUFBVTtBQUN4QixVQUFNLElBQUlDLEtBQUosQ0FBVSxpQkFBVixDQUFOO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNJQyxFQUFBQSxZQUFZLENBQUNDLFVBQUQsRUFBYUMsa0JBQWtCLEdBQUcsSUFBbEMsRUFBd0M7QUFDaEQsUUFBSSxDQUFDRCxVQUFELElBQWUsT0FBT0EsVUFBUCxLQUFzQixRQUFyQyxJQUFpREEsVUFBVSxDQUFDRSxNQUFYLElBQXFCLENBQTFFLEVBQTZFO0FBQ3pFLGFBQU8sS0FBUDtBQUNIOztBQUNERixJQUFBQSxVQUFVLEdBQUdBLFVBQVUsQ0FBQ0csV0FBWCxFQUFiO0FBQ0EsVUFBTWhDLE9BQU8sR0FBRyxLQUFLbEMsYUFBTCxDQUFtQmtDLE9BQW5DOztBQUNBLFFBQUksQ0FBQ0EsT0FBTyxDQUFDNkIsVUFBRCxDQUFaLEVBQTBCO0FBQ3RCLFlBQU0sSUFBSXZDLG9CQUFKLENBQVlDLGdCQUFVQyxTQUFWLENBQW9CMkIsWUFBaEMsRUFBOEMsb0RBQTlDLENBQU47QUFDSCxLQUZELE1BR0ssSUFBSVcsa0JBQWtCLElBQUksT0FBT0Esa0JBQVAsS0FBOEIsUUFBeEQsRUFBa0U7QUFDbkUsWUFBTUcsaUJBQWlCLEdBQUdqQyxPQUFPLENBQUM2QixVQUFELENBQWpDOztBQUNBLFVBQUksQ0FBQ04sZUFBU0MsWUFBVCxDQUFzQlMsaUJBQXRCLEVBQXlDSCxrQkFBekMsQ0FBTCxFQUFtRTtBQUMvRCxjQUFNLElBQUl4QyxvQkFBSixDQUFZQyxnQkFBVUMsU0FBVixDQUFvQjJCLFlBQWhDLEVBQStDLHlCQUF3QlUsVUFBVyxzQkFBcUJDLGtCQUFtQixlQUFjRyxpQkFBa0IsR0FBMUosQ0FBTjtBQUNIO0FBQ0o7QUFDSjtBQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0lDLEVBQUFBLFlBQVksQ0FBQ0MsVUFBRCxFQUFhQyxrQkFBYixFQUFpQztBQUN6QyxVQUFNLElBQUlULEtBQUosQ0FBVSxpQkFBVixDQUFOO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBOzs7QUFDSVUsRUFBQUEsWUFBWSxDQUFDQyxRQUFELEVBQVc7QUFDbkIsUUFBSSxDQUFDLEtBQUt4RSxhQUFOLElBQXVCLENBQUN3RSxRQUE1QixFQUFzQztBQUNsQyxhQUFPLEtBQVA7QUFDSCxLQUhrQixDQUluQjs7O0FBQ0EsUUFBSSxDQUFDQyxLQUFLLENBQUNDLE9BQU4sQ0FBY0YsUUFBZCxDQUFMLEVBQThCO0FBQzFCQSxNQUFBQSxRQUFRLEdBQUcsQ0FBQ0EsUUFBRCxDQUFYO0FBQ0g7O0FBQ0QsVUFBTUcsVUFBVSxHQUFHLEtBQUszRSxhQUFMLENBQW1CMkUsVUFBdEM7O0FBQ0EsUUFBSSxDQUFDSCxRQUFRLENBQUNJLFFBQVQsQ0FBa0JELFVBQWxCLENBQUwsRUFBb0M7QUFDaEMsWUFBTSxJQUFJbkQsb0JBQUosQ0FBWUMsZ0JBQVVDLFNBQVYsQ0FBb0IyQixZQUFoQyxFQUErQyxnQ0FBK0JtQixRQUFTLGVBQWNHLFVBQVcsR0FBaEgsQ0FBTjtBQUNIOztBQUNELFdBQU8sSUFBUDtBQUNIO0FBRUQ7QUFDSjtBQUNBO0FBQ0E7OztBQUNJRSxFQUFBQSxjQUFjLEdBQUc7QUFDYixXQUFPLEtBQUtOLFlBQUwsQ0FBa0IsR0FBbEIsQ0FBUDtBQUNIO0FBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDcUIsUUFBWE8sV0FBVyxDQUFDdEUsSUFBRCxFQUFPO0FBQ3BCLFFBQUksQ0FBQ0EsSUFBTCxFQUFXO0FBQ1A7QUFDSCxLQUhtQixDQUlwQjs7O0FBQ0FBLElBQUFBLElBQUksR0FBR0EsSUFBSSxDQUFDdUUsUUFBTCxFQUFQLENBTG9CLENBT3BCOztBQUNBdkUsSUFBQUEsSUFBSSxHQUFHQSxJQUFJLENBQUN3RSxLQUFMLENBQVcsQ0FBWCxFQUFjLEdBQWQsQ0FBUDtBQUVBbEQsSUFBQUEsTUFBTSxDQUFDbUQsb0JBQVAsR0FBOEJ6RSxJQUE5QjtBQUNIOztBQUVEMEUsRUFBQUEsa0JBQWtCLENBQUNDLFVBQUQsRUFBYUMsVUFBYixFQUF5QkMsTUFBekIsRUFBaUNDLEtBQWpDLEVBQXdDO0FBQ3RELFFBQUksQ0FBQ2pHLFlBQVksQ0FBQ3VGLFFBQWIsQ0FBc0JPLFVBQXRCLENBQUwsRUFBd0M7QUFDcEMsYUFBTy9FLFNBQVA7QUFDSDs7QUFDRCxRQUFJLENBQUMsS0FBS21GLE1BQU4sSUFBZ0IsQ0FBQyxLQUFLQSxNQUFMLENBQVl0SCxJQUE3QixJQUFxQyxDQUFDLEtBQUtzSCxNQUFMLENBQVl0SCxJQUFaLENBQWlCdUgsT0FBM0QsRUFBb0U7QUFDaEUsYUFBT3BGLFNBQVA7QUFDSDs7QUFDRCxXQUFRLEdBQUUrRSxVQUFVLENBQUNNLFdBQVgsRUFBeUIsSUFBRyxLQUFLRixNQUFMLENBQVl0SCxJQUFaLENBQWlCdUgsT0FBakIsQ0FBeUJFLElBQUssRUFBcEU7QUFDSDs7QUFFREMsRUFBQUEsZ0JBQWdCLENBQUNILE9BQUQsRUFBVUksY0FBVixFQUEwQjtBQUN0QyxVQUFNekUsR0FBRyxHQUFHLElBQUkwRSxHQUFKLENBQVFMLE9BQU8sQ0FBQ3JFLEdBQWhCLENBQVo7QUFDQSxVQUFNMkUsUUFBUSxHQUFHO0FBQ2IzRSxNQUFBQSxHQUFHLEVBQUVxRSxPQUFPLENBQUNyRSxHQURBO0FBRWJ1RSxNQUFBQSxJQUFJLEVBQUcsR0FBRXZFLEdBQUcsQ0FBQzRFLFFBQVMsR0FBRTVFLEdBQUcsQ0FBQzZFLE1BQU8sR0FBRTdFLEdBQUcsQ0FBQzhFLElBQUssRUFGakM7QUFHYkMsTUFBQUEsV0FBVyxFQUFFLEtBQUtDLGVBQUwsQ0FBcUJoRixHQUFHLENBQUNpRixZQUF6QixDQUhBO0FBSWJoRSxNQUFBQSxNQUFNLEVBQUVvRCxPQUFPLENBQUNwRCxNQUpIO0FBS2JGLE1BQUFBLE9BQU8sRUFBRTBELGNBQWMsQ0FBQzFELE9BTFg7QUFNYm1FLE1BQUFBLFdBQVcsRUFBRSxLQUFLQyxlQUFMLENBQXFCVixjQUFjLENBQUMxRCxPQUFwQyxDQU5BO0FBT2JxRSxNQUFBQSxhQUFhLEVBQUUsS0FBS0MsaUJBQUwsQ0FBdUJaLGNBQWMsQ0FBQzFELE9BQXRDO0FBUEYsS0FBakI7O0FBU0EsUUFBSXNELE9BQU8sQ0FBQ2lCLElBQVosRUFBa0I7QUFDZFgsTUFBQUEsUUFBUSxDQUFDWSxRQUFULEdBQW9CbEIsT0FBTyxDQUFDaUIsSUFBNUI7QUFDSCxLQUZELE1BR0ssSUFBSWpCLE9BQU8sQ0FBQ21CLElBQVosRUFBa0I7QUFDbkJiLE1BQUFBLFFBQVEsQ0FBQ08sV0FBVCxHQUF1QixrQkFBdkI7O0FBQ0EsVUFBSWIsT0FBTyxDQUFDbUIsSUFBUixZQUF3QkMsTUFBNUIsRUFBb0M7QUFDaENkLFFBQUFBLFFBQVEsQ0FBQ2UsT0FBVCxHQUFtQnRELElBQUksQ0FBQ0MsU0FBTCxDQUFlZ0MsT0FBTyxDQUFDbUIsSUFBdkIsQ0FBbkI7QUFDSCxPQUZELE1BR0s7QUFDRGIsUUFBQUEsUUFBUSxDQUFDZSxPQUFULEdBQW1CckIsT0FBTyxDQUFDbUIsSUFBM0I7QUFDSDtBQUNKLEtBUkksTUFTQSxJQUFJbkIsT0FBTyxDQUFDeEMsSUFBWixFQUFrQjtBQUNuQjhDLE1BQUFBLFFBQVEsQ0FBQ2UsT0FBVCxHQUFtQnJCLE9BQU8sQ0FBQ3hDLElBQTNCO0FBQ0g7O0FBRUQsUUFBSSxDQUFDLEtBQUt1QyxNQUFMLENBQVl0SCxJQUFqQixFQUF1QjtBQUNuQixXQUFLc0gsTUFBTCxDQUFZdEgsSUFBWixHQUFtQixFQUFuQjtBQUNIOztBQUNELFNBQUtzSCxNQUFMLENBQVl0SCxJQUFaLENBQWlCdUgsT0FBakIsR0FBMkJNLFFBQTNCO0FBQ0g7O0FBRURRLEVBQUFBLGVBQWUsQ0FBQ3BFLE9BQU8sR0FBRyxFQUFYLEVBQWU7QUFDMUIsUUFBSSxDQUFDQSxPQUFMLEVBQWM7QUFDVixhQUFPOUIsU0FBUDtBQUNIOztBQUNELFVBQU1pRyxXQUFXLEdBQUduRSxPQUFPLENBQUMsY0FBRCxDQUEzQjs7QUFDQSxRQUFJLENBQUNtRSxXQUFMLEVBQWtCO0FBQ2QsYUFBT2pHLFNBQVA7QUFDSDs7QUFDRCxVQUFNMEcsS0FBSyxHQUFHVCxXQUFXLENBQUNTLEtBQVosQ0FBa0IsYUFBbEIsQ0FBZDs7QUFDQSxRQUFJLENBQUNBLEtBQUQsSUFBVUEsS0FBSyxDQUFDN0MsTUFBTixHQUFlLENBQTdCLEVBQWdDO0FBQzVCLGFBQU83RCxTQUFQO0FBQ0g7O0FBQ0QsV0FBTzBHLEtBQUssQ0FBQyxDQUFELENBQVo7QUFDSDs7QUFFRE4sRUFBQUEsaUJBQWlCLENBQUN0RSxPQUFPLEdBQUcsRUFBWCxFQUFlO0FBQzVCLFFBQUksQ0FBQ0EsT0FBRCxJQUFZLENBQUNBLE9BQU8sQ0FBQyxnQkFBRCxDQUF4QixFQUE0QztBQUN4QyxhQUFPOUIsU0FBUDtBQUNIOztBQUNELFVBQU0yRyxXQUFXLEdBQUc3RSxPQUFPLENBQUMsZ0JBQUQsQ0FBM0I7QUFDQSxXQUFPOEUsUUFBUSxDQUFDRCxXQUFELENBQWY7QUFDSDs7QUFFRFosRUFBQUEsZUFBZSxDQUFDQyxZQUFELEVBQWU7QUFDMUIsV0FBTzNCLEtBQUssQ0FBQ3dDLElBQU4sQ0FBWWIsWUFBWSxDQUFDYyxJQUFiLEVBQVosRUFBa0NDLE1BQWxDLENBQTBDLENBQUVDLE1BQUYsRUFBVUMsR0FBVixLQUFtQjtBQUNoRSxZQUFNQyxNQUFNLEdBQUdsQixZQUFZLENBQUNtQixNQUFiLENBQW9CRixHQUFwQixDQUFmO0FBQ0EsYUFBTyxFQUFFLEdBQUdELE1BQUw7QUFBYSxTQUFFQyxHQUFGLEdBQVNDLE1BQU0sQ0FBQ3JELE1BQVAsR0FBZ0IsQ0FBaEIsR0FBb0JxRCxNQUFNLENBQUNFLElBQVAsQ0FBWSxHQUFaLENBQXBCLEdBQXVDRixNQUFNLENBQUMsQ0FBRDtBQUFuRSxPQUFQO0FBQ0gsS0FITSxFQUdKLEVBSEksQ0FBUDtBQUlIOztBQUVERyxFQUFBQSxpQkFBaUIsQ0FBQ3pJLFFBQUQsRUFBVztBQUN4QixVQUFNMEksUUFBUSxHQUFHO0FBQ2J2RyxNQUFBQSxHQUFHLEVBQUVuQyxRQUFRLENBQUMySSxZQUFULElBQXlCM0ksUUFBUSxDQUFDMkksWUFBVCxDQUFzQjFELE1BQS9DLElBQXlEakYsUUFBUSxDQUFDMkksWUFBVCxDQUFzQixDQUF0QixDQURqRDtBQUViQyxNQUFBQSxVQUFVLEVBQUU1SSxRQUFRLENBQUM2SSxhQUZSO0FBR2JsRCxNQUFBQSxVQUFVLEVBQUUzRixRQUFRLENBQUMyRixVQUhSO0FBSWIwQixNQUFBQSxXQUFXLEVBQUUsS0FBS0MsZUFBTCxDQUFxQnRILFFBQVEsQ0FBQ2tELE9BQTlCLENBSkE7QUFLYnFFLE1BQUFBLGFBQWEsRUFBRSxLQUFLQyxpQkFBTCxDQUF1QnhILFFBQVEsQ0FBQ2tELE9BQWhDLENBTEY7QUFNYkEsTUFBQUEsT0FBTyxFQUFFbEQsUUFBUSxDQUFDa0QsT0FOTDtBQU9iNEYsTUFBQUEsT0FBTyxFQUFFOUksUUFBUSxDQUFDK0ksV0FQTDtBQVFibEIsTUFBQUEsT0FBTyxFQUFFN0gsUUFBUSxDQUFDZ0U7QUFSTCxLQUFqQjs7QUFVQSxRQUFJLENBQUMsS0FBS3VDLE1BQUwsQ0FBWXRILElBQWpCLEVBQXVCO0FBQ25CLFdBQUtzSCxNQUFMLENBQVl0SCxJQUFaLEdBQW1CLEVBQW5CO0FBQ0g7O0FBQ0QsU0FBS3NILE1BQUwsQ0FBWXRILElBQVosQ0FBaUJlLFFBQWpCLEdBQTRCMEksUUFBNUI7O0FBQ0EsUUFBSTFJLFFBQVEsQ0FBQ2dKLE9BQVQsSUFBb0JoSixRQUFRLENBQUNnSixPQUFULENBQWlCQyxNQUF6QyxFQUFpRDtBQUM3QyxXQUFLMUMsTUFBTCxDQUFZdEgsSUFBWixDQUFpQitKLE9BQWpCLEdBQTJCLEVBQUUsR0FBR2hKLFFBQVEsQ0FBQ2dKLE9BQVQsQ0FBaUJDO0FBQXRCLE9BQTNCO0FBQ0g7QUFFSjs7QUFFRHZGLEVBQUFBLFlBQVksQ0FBQ0gsSUFBRCxFQUFPTCxPQUFQLEVBQWdCTSxVQUFVLEdBQUcsS0FBN0IsRUFBb0M7QUFDNUMsVUFBTTBGLFlBQVksR0FBRyxFQUFyQjs7QUFFQSxRQUFJMUYsVUFBSixFQUFnQjtBQUNaMEYsTUFBQUEsWUFBWSxDQUFDekIsSUFBYixHQUFvQmxFLElBQXBCO0FBQ0gsS0FGRCxNQUdLLElBQUlBLElBQUksWUFBWTdCLGlCQUFwQixFQUE4QjtBQUMvQndILE1BQUFBLFlBQVksQ0FBQ2xGLElBQWIsR0FBb0JULElBQXBCO0FBQ0gsS0FGSSxNQUdBLElBQUlBLElBQUksWUFBWXFFLE1BQXBCLEVBQTRCO0FBQzdCbkQscUJBQVMwRSxjQUFULENBQXdCNUYsSUFBeEI7O0FBQ0EyRixNQUFBQSxZQUFZLENBQUN2QixJQUFiLEdBQW9CcEUsSUFBcEI7QUFDSCxLQUhJLE1BR0U7QUFDSDJGLE1BQUFBLFlBQVksQ0FBQ2xGLElBQWIsR0FBb0JULElBQXBCO0FBQ0g7O0FBRUQsV0FBTzJGLFlBQVA7QUFDSDs7QUFFcUIsUUFBaEI3RixnQkFBZ0IsQ0FBQ0YsUUFBRCxFQUFXaUcsUUFBUSxHQUFHLEtBQXRCLEVBQTZCO0FBQy9DLFFBQUksS0FBSzdDLE1BQUwsQ0FBWXRILElBQWhCLEVBQXNCO0FBQ2xCLGFBQU8sS0FBS3NILE1BQUwsQ0FBWXRILElBQW5CO0FBQ0gsS0FIOEMsQ0FJL0M7OztBQUNBLFFBQUlvSyxNQUFKOztBQUVBLFFBQUk7QUFDQUEsTUFBQUEsTUFBTSxHQUFHLE1BQU0sa0JBQUksRUFBRSxHQUFHbEcsUUFBTDtBQUFlbUcsUUFBQUEsS0FBSyxFQUFFO0FBQ3JDQyxVQUFBQSxhQUFhLEVBQUUsQ0FDWDlJLE9BQU8sSUFBSTtBQUFFLGlCQUFLa0csZ0JBQUwsQ0FBc0J4RCxRQUF0QixFQUFnQzFDLE9BQWhDO0FBQTJDLFdBRDdDO0FBRHNCO0FBQXRCLE9BQUosQ0FBZjs7QUFNQSxVQUFJMEMsUUFBUSxDQUFDdEIsVUFBVCxJQUF1QndILE1BQU0sQ0FBQ25HLE9BQVAsQ0FBZSxrQkFBZixNQUF1QyxTQUFsRSxFQUE2RTtBQUN6RSxjQUFNc0csSUFBSSxHQUFHdEssT0FBTyxDQUFDLE1BQUQsQ0FBcEI7O0FBQ0EsY0FBTXVLLE1BQU0sR0FBR0QsSUFBSSxDQUFDRSxnQkFBTCxFQUFmO0FBQ0FELFFBQUFBLE1BQU0sQ0FBQ0UsS0FBUCxDQUFhTixNQUFNLENBQUNyRixJQUFwQjtBQUNBLGNBQU0sQ0FBQyxNQUFNO0FBQ1QsaUJBQU8sSUFBSTRGLE9BQUosQ0FBWSxDQUFDQyxPQUFELEVBQVVDLE1BQVYsS0FBcUI7QUFDcENMLFlBQUFBLE1BQU0sQ0FBQ00sRUFBUCxDQUFVLE1BQVYsRUFBbUJ4RyxJQUFELElBQVU7QUFDeEI4RixjQUFBQSxNQUFNLENBQUNyRixJQUFQLEdBQWNULElBQUksQ0FBQ3dDLFFBQUwsRUFBZDs7QUFDQSxrQkFBSXNELE1BQU0sQ0FBQ25HLE9BQVAsQ0FBZTlDLG1CQUFmLEtBQXVDaUosTUFBTSxDQUFDbkcsT0FBUCxDQUFlOUMsbUJBQWYsRUFBb0N3RixRQUFwQyxDQUE2QyxrQkFBN0MsQ0FBM0MsRUFBNkc7QUFDekcsb0JBQUk7QUFDQXlELGtCQUFBQSxNQUFNLENBQUNyRixJQUFQLEdBQWNPLElBQUksQ0FBQ2xDLEtBQUwsQ0FBV2dILE1BQU0sQ0FBQ3JGLElBQWxCLENBQWQ7QUFDSCxpQkFGRCxDQUVFLE9BQU9nRyxDQUFQLEVBQVUsQ0FDUjtBQUNIO0FBQ0o7O0FBQ0RILGNBQUFBLE9BQU87QUFDVixhQVZEO0FBV0gsV0FaTSxDQUFQO0FBYUgsU0FkSyxHQUFOO0FBZUgsT0FuQkQsTUFtQk87QUFDSCxZQUFJUixNQUFNLENBQUNuRyxPQUFQLENBQWU5QyxtQkFBZixLQUF1Q2lKLE1BQU0sQ0FBQ25HLE9BQVAsQ0FBZTlDLG1CQUFmLEVBQW9Dd0YsUUFBcEMsQ0FBNkMsa0JBQTdDLENBQTNDLEVBQTZHO0FBQ3pHLGNBQUk7QUFDQXlELFlBQUFBLE1BQU0sQ0FBQ3JGLElBQVAsR0FBY08sSUFBSSxDQUFDbEMsS0FBTCxDQUFXZ0gsTUFBTSxDQUFDckYsSUFBbEIsQ0FBZDtBQUNILFdBRkQsQ0FFRSxPQUFPZ0csQ0FBUCxFQUFVLENBQ1I7QUFDSDtBQUNKO0FBQ0o7QUFDSixLQW5DRCxDQW1DRSxPQUFPQSxDQUFQLEVBQVU7QUFDUlgsTUFBQUEsTUFBTSxHQUFHVyxDQUFUOztBQUNBLFVBQUlBLENBQUMsQ0FBQ2hLLFFBQUYsSUFBY2dLLENBQUMsQ0FBQ2hLLFFBQUYsQ0FBVzJGLFVBQXpCLElBQXVDcUUsQ0FBQyxDQUFDaEssUUFBRixDQUFXMkYsVUFBWCxLQUEwQixHQUFqRSxJQUF3RSxDQUFDeUQsUUFBN0UsRUFBdUY7QUFDbkYsY0FBTWEsYUFBYSxHQUFHLE1BQU0sS0FBS0Msd0JBQUwsQ0FBOEIvRyxRQUE5QixFQUF3QzZHLENBQUMsQ0FBQ2hLLFFBQTFDLENBQTVCOztBQUNBLFlBQUlpSyxhQUFKLEVBQW1CO0FBQ2ZaLFVBQUFBLE1BQU0sR0FBR1ksYUFBVDtBQUNIO0FBQ0o7QUFDSjs7QUFFRCxRQUFJWixNQUFNLFlBQVl4RSxLQUF0QixFQUE2QjtBQUN6QixVQUFJYixJQUFJLEdBQUcsSUFBWDs7QUFDQSxVQUNJcUYsTUFBTSxDQUFDckosUUFBUCxJQUNBcUosTUFBTSxDQUFDckosUUFBUCxDQUFnQmdFLElBRnBCLEVBR0U7QUFDRUEsUUFBQUEsSUFBSSxHQUFHcUYsTUFBTSxDQUFDckosUUFBUCxDQUFnQmdFLElBQXZCOztBQUNBLFlBQUksT0FBT0EsSUFBUCxLQUFnQixRQUFwQixFQUE4QjtBQUMxQixjQUFJO0FBQ0FBLFlBQUFBLElBQUksR0FBR08sSUFBSSxDQUFDbEMsS0FBTCxDQUFXMkIsSUFBWCxDQUFQO0FBQ0gsV0FGRCxDQUVFLE9BQU9nRyxDQUFQLEVBQVU7QUFDUmhHLFlBQUFBLElBQUksR0FBR3FGLE1BQU0sQ0FBQ3JKLFFBQVAsQ0FBZ0JnRSxJQUF2QjtBQUNIO0FBQ0o7QUFDSjs7QUFFRHFGLE1BQUFBLE1BQU0sR0FBRztBQUNMYyxRQUFBQSxZQUFZLEVBQUVkLE1BQU0sQ0FBQ2UsT0FEaEI7QUFFTGxILFFBQUFBLE9BQU8sRUFBRW1HLE1BQU0sQ0FBQ3JKLFFBQVAsR0FBa0JxSixNQUFNLENBQUNySixRQUFQLENBQWdCa0QsT0FBbEMsR0FBNEMsSUFGaEQ7QUFHTHlDLFFBQUFBLFVBQVUsRUFBRTBELE1BQU0sQ0FBQ3JKLFFBQVAsR0FBa0JxSixNQUFNLENBQUNySixRQUFQLENBQWdCMkYsVUFBbEMsR0FBK0MsSUFIdEQ7QUFJTGtELFFBQUFBLGFBQWEsRUFBRVEsTUFBTSxDQUFDckosUUFBUCxHQUFrQnFKLE1BQU0sQ0FBQ3JKLFFBQVAsQ0FBZ0I2SSxhQUFsQyxHQUFrRCxJQUo1RDtBQUtMd0IsUUFBQUEsT0FBTyxFQUFFaEIsTUFBTSxDQUFDckosUUFBUCxHQUFrQnFKLE1BQU0sQ0FBQ3JKLFFBQVAsQ0FBZ0JxSyxPQUFsQyxHQUE0QyxJQUxoRDtBQU1MckcsUUFBQUEsSUFBSSxFQUFFQTtBQU5ELE9BQVQ7QUFRSCxLQXhCRCxNQXdCTztBQUNIcUYsTUFBQUEsTUFBTSxHQUFHO0FBQ0xOLFFBQUFBLFdBQVcsRUFBRU0sTUFBTSxDQUFDTixXQURmO0FBRUw3RixRQUFBQSxPQUFPLEVBQUVtRyxNQUFNLENBQUNuRyxPQUZYO0FBR0xvSCxRQUFBQSxPQUFPLEVBQUVqQixNQUFNLENBQUNpQixPQUhYO0FBSUxuSSxRQUFBQSxHQUFHLEVBQUVrSCxNQUFNLENBQUNsSCxHQUpQO0FBS0xpQixRQUFBQSxNQUFNLEVBQUVpRyxNQUFNLENBQUNqRyxNQUxWO0FBTUx1QyxRQUFBQSxVQUFVLEVBQUUwRCxNQUFNLENBQUMxRCxVQU5kO0FBT0xrRCxRQUFBQSxhQUFhLEVBQUVRLE1BQU0sQ0FBQ1IsYUFQakI7QUFRTEcsUUFBQUEsT0FBTyxFQUFFSyxNQUFNLENBQUNMLE9BUlg7QUFTTHVCLFFBQUFBLFVBQVUsRUFBRWxCLE1BQU0sQ0FBQ2tCLFVBVGQ7QUFVTDVCLFFBQUFBLFlBQVksRUFBRVUsTUFBTSxDQUFDVixZQVZoQjtBQVdMNkIsUUFBQUEsV0FBVyxFQUFFbkIsTUFBTSxDQUFDbUIsV0FYZjtBQVlMQyxRQUFBQSxFQUFFLEVBQUVwQixNQUFNLENBQUNvQixFQVpOO0FBYUxDLFFBQUFBLFVBQVUsRUFBRXJCLE1BQU0sQ0FBQ3FCLFVBYmQ7QUFjTDFHLFFBQUFBLElBQUksRUFBRXFGLE1BQU0sQ0FBQ3JGO0FBZFIsT0FBVDtBQWdCSDs7QUFDRCxTQUFLeUUsaUJBQUwsQ0FBdUJZLE1BQXZCLEVBOUYrQyxDQStGL0M7OztBQUNBLFNBQUtySSxhQUFMLEdBQXFCcUksTUFBckI7QUFFQSxXQUFPQSxNQUFQO0FBQ0g7O0FBRTZCLFFBQXhCYSx3QkFBd0IsQ0FBQy9HLFFBQUQsRUFBV25ELFFBQVgsRUFBcUI7QUFBQTs7QUFDL0MsUUFBSSxDQUFDLEtBQUttQixTQUFWLEVBQXFCO0FBQ2pCLGFBQU9DLFNBQVA7QUFDSDs7QUFDRCxRQUFJdUosV0FBVyxHQUFHLHNDQUF1QjNLLFFBQXZCLENBQWxCO0FBQ0EsVUFBTTRLLFlBQVksR0FBRyxFQUFFLEdBQUd6SDtBQUFMLEtBQXJCOztBQUNBLFFBQUluRCxRQUFRLENBQUMyRixVQUFULEtBQXdCLEdBQXhCLG9CQUErQmdGLFdBQS9CLHlDQUErQixhQUFhRSxJQUFiLENBQWtCQyxDQUFDLElBQUlBLENBQUMsQ0FBQ0MsVUFBRixDQUFhLE9BQWIsQ0FBdkIsQ0FBbkMsRUFBa0Y7QUFDOUVILE1BQUFBLFlBQVksQ0FBQzFILE9BQWIsQ0FBcUIsZUFBckIsSUFBd0Msa0NBQW1CLEtBQUsvQixTQUFMLElBQWtCLEVBQXJDLEVBQXlDLEtBQUtFLFNBQUwsSUFBa0IsRUFBM0QsQ0FBeEM7QUFDQSxhQUFPLE1BQU0sS0FBS2dDLGdCQUFMLENBQXNCdUgsWUFBdEIsRUFBb0MsSUFBcEMsQ0FBYjtBQUNILEtBVDhDLENBVS9DOzs7QUFDQSxVQUFNSSxNQUFNLEdBQUc5TCxPQUFPLENBQUMsS0FBRCxDQUFQLENBQWVtRCxLQUFmLENBQXFCdUksWUFBWSxDQUFDekksR0FBbEMsQ0FBZjs7QUFDQSxVQUFNOEksT0FBTyxHQUFHRCxNQUFNLENBQUNuSSxRQUFQLEtBQW9CLFFBQXBDLENBWitDLENBYS9DOztBQUNBLFVBQU1xSSxjQUFjLEdBQUdELE9BQU8sR0FBRyxJQUFJOUwsS0FBSyxDQUFDZ00sS0FBVixDQUFnQjtBQUFDQyxNQUFBQSxTQUFTLEVBQUU7QUFBWixLQUFoQixDQUFILEdBQ3hCLElBQUluTSxJQUFJLENBQUNrTSxLQUFULENBQWU7QUFBQ0MsTUFBQUEsU0FBUyxFQUFFO0FBQVosS0FBZixDQUROOztBQUVBLFFBQUlILE9BQUosRUFBYTtBQUNUTCxNQUFBQSxZQUFZLENBQUNTLEtBQWIsR0FBcUI7QUFBRWxNLFFBQUFBLEtBQUssRUFBRStMO0FBQVQsT0FBckI7QUFDSCxLQUZELE1BR0s7QUFDRE4sTUFBQUEsWUFBWSxDQUFDUyxLQUFiLEdBQXFCO0FBQUVwTSxRQUFBQSxJQUFJLEVBQUVpTTtBQUFSLE9BQXJCO0FBQ0gsS0FyQjhDLENBc0IvQzs7O0FBQ0EsVUFBTUksUUFBUSxHQUFHO0FBQ2J2SixNQUFBQSxRQUFRLEVBQUUsS0FBS1osU0FERjtBQUViYSxNQUFBQSxRQUFRLEVBQUUsS0FBS1gsU0FGRjtBQUdiWSxNQUFBQSxNQUFNLEVBQUUsRUFISztBQUlic0osTUFBQUEsV0FBVyxFQUFFLEVBSkE7QUFLYnBKLE1BQUFBLEdBQUcsRUFBRXlJLFlBQVksQ0FBQ3pJO0FBTEwsS0FBakI7QUFPQXlJLElBQUFBLFlBQVksQ0FBQzFILE9BQWIsQ0FBcUIsZUFBckIsSUFBd0NzSSxJQUFJLENBQUNDLGtCQUFMLENBQXdCSCxRQUF4QixDQUF4QztBQUNBVixJQUFBQSxZQUFZLENBQUMxSCxPQUFiLENBQXFCLFlBQXJCLElBQXFDLFlBQXJDO0FBQ0EwSCxJQUFBQSxZQUFZLENBQUNjLGVBQWIsR0FBK0IsS0FBL0I7QUFDQSxRQUFJQyxnQkFBZ0IsR0FBRyxNQUFNLGtCQUFJZixZQUFKLENBQTdCO0FBQ0FELElBQUFBLFdBQVcsR0FBRyxzQ0FBdUJnQixnQkFBdkIsQ0FBZCxDQWxDK0MsQ0FtQy9DOztBQUNBLFFBQUlBLGdCQUFnQixDQUFDaEcsVUFBakIsS0FBZ0MsR0FBaEMsSUFBdUNnRixXQUFXLENBQUMxRixNQUFaLEdBQXFCLENBQTVELElBQ0cwRixXQUFXLENBQUMsQ0FBRCxDQUFYLENBQWVJLFVBQWYsQ0FBMEIsTUFBMUIsQ0FEUCxFQUMwQztBQUN0QyxZQUFNYSxRQUFRLEdBQUdKLElBQUksQ0FBQ0ssaUJBQUwsQ0FBdUJGLGdCQUFnQixDQUFDekksT0FBakIsQ0FBeUIsa0JBQXpCLENBQXZCLENBQWpCO0FBQ0EwSCxNQUFBQSxZQUFZLENBQUNrQixjQUFiLEdBQThCLEtBQTlCO0FBQ0FsQixNQUFBQSxZQUFZLENBQUMxSCxPQUFiLENBQXFCLFlBQXJCLElBQXFDLE9BQXJDO0FBQ0EwSCxNQUFBQSxZQUFZLENBQUMxSCxPQUFiLENBQXFCLGVBQXJCLElBQ0lzSSxJQUFJLENBQUNPLGtCQUFMLENBQXdCSCxRQUF4QixFQUFrQ04sUUFBbEMsQ0FESjtBQUVILEtBUEQsTUFRSztBQUNELGFBQU90TCxRQUFQO0FBQ0g7O0FBQ0Q0SyxJQUFBQSxZQUFZLENBQUNjLGVBQWIsR0FBK0IsSUFBL0IsQ0EvQytDLENBZ0QvQzs7QUFDQSxXQUFPLE1BQU0sS0FBS3JJLGdCQUFMLENBQXNCdUgsWUFBdEIsRUFBb0MsSUFBcEMsQ0FBYjtBQUNIOztBQXRuQmdEIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWUgaHR0cFxyXG4gKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIEhUVFAoUylcclxuICovXHJcbmltcG9ydCBnb3QgZnJvbSAnZ290JztcclxuaW1wb3J0IEZvcm1EYXRhIGZyb20gJ2Zvcm0tZGF0YSc7XHJcbmltcG9ydCBPeHlnZW5Nb2R1bGUgZnJvbSAnLi4vY29yZS9PeHlnZW5Nb2R1bGUnO1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5pbXBvcnQgZXJySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xyXG5pbXBvcnQgbW9kVXRpbHMgZnJvbSAnLi91dGlscyc7XHJcbmltcG9ydCB7XHJcbiAgICBnZXRBdXRoZW50aWNhdGVNZXRob2RzLFxyXG4gICAgY3JlYXRlQmFzaWNNZXNzYWdlLFxyXG59IGZyb20gJy4vbW9kdWxlLWh0dHAvbnRsbS11dGlsJztcclxuaW1wb3J0ICogYXMgbnRsbSBmcm9tICcuL21vZHVsZS1odHRwL250bG0nO1xyXG5jb25zdCBodHRwID0gcmVxdWlyZSgnaHR0cCcpO1xyXG5jb25zdCBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7XHJcblxyXG5jb25zdCBNT0RVTEVfTkFNRSA9ICdodHRwJztcclxuY29uc3QgUkVTUE9OU0VfVElNRU9VVCA9IDEwMDAgKiA2MDsgICAvLyBpbiBtc1xyXG5jb25zdCBEQUZBVUxUX0hUVFAyID0gZmFsc2U7XHJcbmNvbnN0IERFRkFVTFRfSFRUUF9PUFRJT05TID0ge1xyXG4gICAgZGVjb21wcmVzczogdHJ1ZSxcclxuICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxyXG4gICAgdGltZW91dDoge1xyXG4gICAgICAgIGxvb2t1cDogMTAwMCxcclxuICAgICAgICBjb25uZWN0OiA1MDAsXHJcbiAgICAgICAgc2VjdXJlQ29ubmVjdDogNTAwLFxyXG4gICAgICAgIHNvY2tldDogMTAwMDAwLFxyXG4gICAgICAgIHNlbmQ6IDEwMDAwMCxcclxuICAgICAgICByZXNwb25zZTogUkVTUE9OU0VfVElNRU9VVFxyXG4gICAgfSxcclxuICAgIGh0dHAyOiBEQUZBVUxUX0hUVFAyLFxyXG4gICAgaHR0cHM6IHtcclxuICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAgZG5zTG9va3VwSXBWZXJzaW9uOiAnaXB2NCdcclxufTtcclxuY29uc3QgQ09OVEVOVF9UWVBFX0hFQURFUiA9ICdjb250ZW50LXR5cGUnO1xyXG5jb25zdCBIVFRQX01FVEhPRFMgPSBbXHJcbiAgICAnZ2V0JyxcclxuICAgICdwb3N0JyxcclxuICAgICdwYXRjaCdcclxuXTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEh0dHBNb2R1bGUgZXh0ZW5kcyBPeHlnZW5Nb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcyk7XHJcbiAgICAgICAgdGhpcy5fYWx3YXlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2xhc3RSZXNwb25zZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fYmFzZVVybCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zID0ge307XHJcbiAgICAgICAgdGhpcy5fdXNlcm5hbWUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fcGFzc3dvcmQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fZG9tYWluID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIC8vIHByZS1pbml0aWFsaXplIHRoZSBtb2R1bGVcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICogQHN1bW1hcnkgR2V0cyBtb2R1bGUgbmFtZVxyXG4gICAgICogQGZ1bmN0aW9uIG5hbWVcclxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gQ29uc3RhbnQgdmFsdWUgXCJodHRwXCIuXHJcbiAgICAgKi9cclxuICAgIGdldCBuYW1lKCkge1xyXG4gICAgICAgIHJldHVybiBNT0RVTEVfTkFNRTtcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBhIG5ldyBGb3JtRGF0YSBvYmplY3RcclxuICAgICAqIEBmdW5jdGlvbiBuZXdGb3JtRGF0YVxyXG4gICAgICogQHJldHVybiB7Rm9ybURhdGF9IG5ldyBGb3JtRGF0YSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIG5ld0Zvcm1EYXRhKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgRm9ybURhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFNldHMgdXNlciBkZWZpbmVkIEhUVFAgb3B0aW9ucyAoc3VjaCBhcyBwcm94eSwgZGVjb21wcmVzcyBhbmQgZXRjLilcclxuICAgICAqIEBmdW5jdGlvbiBzZXRPcHRpb25zXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIEhUVFAgcmVxdWVzdCBvcHRpb25zIG9iamVjdCwgc2VlIFtSZXF1ZXN0IE9wdGlvbnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvZ290L2Jsb2IvbWFpbi9kb2N1bWVudGF0aW9uLzItb3B0aW9ucy5tZCkuIFxyXG4gICAgICogSW4gYWRkaXRpb24gdG8gdGhlIG9wdGlvbnMgbGlzdGVkIGluIHRoZSBsaW5rZWQgZG9jdW1lbnQsICdkZWZsYXRlUmF3JyBvcHRpb24gY2FuIGJlIHVzZWQgd2hlbiBzZXJ2ZXIgcmV0dXJucyBEZWZsYXRlLWNvbXByZXNzZWQgc3RyZWFtIHdpdGhvdXQgaGVhZGVycy5cclxuICAgICAqL1xyXG4gICAgc2V0T3B0aW9ucyhvcHRzKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zID0gb3B0cztcclxuICAgICAgICBpZiAob3B0cy5kZWZsYXRlUmF3KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJIdHRwT3B0aW9ucy5kZWNvbXByZXNzID0gZmFsc2U7ICAgICAvLyBkZWNvbXByZXNzPXRydWUgaW4gZGVmYXVsdCBvcHRpb25zIHNvIHdlIG92ZXJyaWRlIGl0XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU2V0cyB1c2VyIGNyZWRlbnRpYWxzIGZvciBOVExNIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3NcclxuICAgICAqIEBmdW5jdGlvbiBzZXROdGxtVXNlclxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVzZXJuYW1lIC0gTlRMTSB1c2VybmFtZS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYXNzd29yZCAtIE5UTE0gcGFzc3dvcmQuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGRvbWFpbiAtIE5UTE0gZG9tYWluIG5hbWUsIGlmIGFwcGxpY2FibGUuXHJcbiAgICAgKiBJbiBhZGRpdGlvbiB0byB0aGUgb3B0aW9ucyBsaXN0ZWQgaW4gdGhlIGxpbmtlZCBkb2N1bWVudCwgJ2RlZmxhdGVSYXcnIG9wdGlvbiBjYW4gYmUgdXNlZCB3aGVuIHNlcnZlciByZXR1cm5zIERlZmxhdGUtY29tcHJlc3NlZCBzdHJlYW0gd2l0aG91dCBoZWFkZXJzLlxyXG4gICAgICovXHJcbiAgICBzZXROdGxtVXNlcih1c2VybmFtZSwgcGFzc3dvcmQsIGRvbWFpbiA9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIC8vIElmIHVzZXJuYW1lIHdhcyBwYXNzZWQgYXMgdW5kZWZpbmVkLCB0aGVuIHJlbW92ZSBwcmV2aW91c2x5IGRlZmluZWQgTlRMTSBjcmVkZW50aWFsc1xyXG4gICAgICAgIGlmICh1c2VybmFtZSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fdXNlcm5hbWUgPSB0aGlzLl9wYXNzd29yZCA9IHRoaXMuX2RvbWFpbiA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl91c2VybmFtZSA9IHVzZXJuYW1lO1xyXG4gICAgICAgIHRoaXMuX3Bhc3N3b3JkID0gcGFzc3dvcmQ7XHJcbiAgICAgICAgdGhpcy5fZG9tYWluID0gZG9tYWluO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU2V0cyBwcm94eSB1cmwgdG8gYmUgdXNlZCBmb3IgY29ubmVjdGlvbnMgd2l0aCB0aGUgc2VydmljZS5cclxuICAgICAqIEBmdW5jdGlvbiBzZXRQcm94eVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFByb3h5IHNlcnZlciBVUkwuIE5vdCBwYXNzaW5nIHRoaXMgYXJndW1lbnQgd2lsbCByZXNldCB0aGUgcHJveHkgc2V0dGluZ3MuXHJcbiAgICAgKi9cclxuICAgIHNldFByb3h5KHVybCkge1xyXG4gICAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAgICAgYm9vdHN0cmFwXHJcbiAgICAgICAgICAgIH0gPSByZXF1aXJlKCdnbG9iYWwtYWdlbnQnKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHsgcGFyc2UgfSA9IHJlcXVpcmUoJ3VybCcpO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBwYXJzZSh1cmwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFwYXJzZWRVcmwuaG9zdG5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgJ0hvc3RuYW1lIGluIHVuZGVmaW5lZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghcGFyc2VkVXJsLnBvcnQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgJ1BvcnQgaW4gdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFwYXJzZWRVcmwucHJvdG9jb2wpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgJ1Byb3RvY29sIGluIHVuZGVmaW5lZCcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBib290c3RyYXAoKTtcclxuICAgICAgICAgICAgZ2xvYmFsLkdMT0JBTF9BR0VOVC5IVFRQX1BST1hZID0gdXJsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5HTE9CQUxfQUdFTlQuSFRUUF9QUk9YWSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgR0VUXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5bamF2YXNjcmlwdF0gVXNhZ2UgZXhhbXBsZTwvY2FwdGlvbj5cclxuICAgICAqIC8vIEJhc2ljIHVzYWdlIGV4YW1wbGU6XHJcbiAgICAgKiB2YXIgcmVzcG9uc2UgPSBodHRwLmdldChcclxuICAgICAqICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL294eWdlbmhxL294eWdlbi1pZGUvcmVsZWFzZXMnLCBcclxuICAgICAqIHtcclxuICAgICAqICAgJ0FjY2VwdC1FbmNvZGluZyc6ICdnemlwLCBkZWZsYXRlJyxcclxuICAgICAqICAgJ1VzZXItQWdlbnQnOiAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgcnY6ODYuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC84Ni4wJ1xyXG4gICAgICogfSk7XHJcbiAgICAgKiBsb2cuaW5mbyhyZXNwb25zZS5ib2R5KTtcclxuICAgICAqXHJcbiAgICAgKiAvLyBJZiBzZXJ2ZXIgcmV0dXJucyBEZWZsYXRlLWNvbXByZXNzZWQgc3RyZWFtIHdpdGhvdXQgaGVhZGVycywgYGRlZmxhdGVSYXdgIGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgdGhlIGNvbnRlbnQuXHJcbiAgICAgKiBodHRwLnNldE9wdGlvbnMoe1xyXG4gICAgICogICBkZWZsYXRlUmF3OiB0cnVlXHJcbiAgICAgKiB9KTtcclxuICAgICAqIHZhciByZXNwb25zZSA9IGh0dHAuZ2V0KCdodHRwczovL0ZPTy5CQVInKTtcclxuICAgICAqIGxvZy5pbmZvKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXQodXJsLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgUE9TVFxyXG4gICAgICogQGZ1bmN0aW9uIHBvc3RcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBVUkwuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIERhdGEuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdD19IGhlYWRlcnMgLSBIVFRQIGhlYWRlcnMuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW49fSBpc0Zvcm1EYXRhIC0gSW5kaWNhdGVzIGlmIFwiZGF0YVwiIHBhcmFtZXRlciBpcyBvZiBVUkwtZW5jb2RlZCBmb3JtIHR5cGUuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgcG9zdCh1cmwsIGRhdGEsIGhlYWRlcnMsIGlzRm9ybURhdGEgPSBmYWxzZSkge1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkRGF0YSA9IHRoaXMuX3Jlc29sdmVEYXRhKGRhdGEsIGhlYWRlcnMsIGlzRm9ybURhdGEpO1xyXG4gICAgICAgIGNvbnN0IGh0dHBPcHRzID0ge1xyXG4gICAgICAgICAgICAuLi5ERUZBVUxUX0hUVFBfT1BUSU9OUyxcclxuICAgICAgICAgICAgLi4udGhpcy5fdXNlckh0dHBPcHRpb25zIHx8IHt9LFxyXG4gICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgfHwge30sXHJcbiAgICAgICAgICAgIC4uLnJlc29sdmVkRGF0YVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBIVFRQIFBVVFxyXG4gICAgICogQGZ1bmN0aW9uIHB1dFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gRGF0YS5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhc3luYyBwdXQodXJsLCBkYXRhLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWREYXRhID0gdGhpcy5fcmVzb2x2ZURhdGEoZGF0YSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0dHBPcHRzID0ge1xyXG4gICAgICAgICAgICAuLi5ERUZBVUxUX0hUVFBfT1BUSU9OUyxcclxuICAgICAgICAgICAgLi4udGhpcy5fdXNlckh0dHBPcHRpb25zIHx8IHt9LFxyXG4gICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fSxcclxuICAgICAgICAgICAgLi4ucmVzb2x2ZWREYXRhXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgUEFUQ0hcclxuICAgICAqIEBmdW5jdGlvbiBwYXRjaFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gRGF0YS5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhc3luYyBwYXRjaCh1cmwsIGRhdGEsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhKTtcclxuXHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQQVRDSCcsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgfHwge30sXHJcbiAgICAgICAgICAgIC4uLnJlc29sdmVkRGF0YVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBIVFRQIERFTEVURVxyXG4gICAgICogQGZ1bmN0aW9uIGRlbGV0ZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gRGF0YS5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhc3luYyBkZWxldGUodXJsLCBoZWFkZXJzLCBkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWREYXRhID0gdGhpcy5fcmVzb2x2ZURhdGEoZGF0YSk7XHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9LFxyXG4gICAgICAgICAgICAuLi5yZXNvbHZlZERhdGFcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBsYXN0IHJlc3BvbnNlIG9iamVjdFxyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlc3BvbnNlXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RSZXNwb25zZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgbGFzdCByZXNwb25zZSBib2R5XHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVzcG9uc2VCb2R5XHJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFJlc3BvbnNlIGJvZHkuXHJcbiAgICAgKi9cclxuICAgIGdldFJlc3BvbnNlQm9keSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlICYmIHRoaXMuX2xhc3RSZXNwb25zZS5ib2R5ID8gdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyByZXNwb25zZSBoZWFkZXJzXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVzcG9uc2VIZWFkZXJzXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICAgKi9cclxuICAgIGdldFJlc3BvbnNlSGVhZGVycygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2xhc3RSZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RSZXNwb25zZS5oZWFkZXJzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyByZXNwb25zZSBVUkxcclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZVVybFxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBSZXNwb25zZSBVUkwuXHJcbiAgICAgKi9cclxuICAgIGdldFJlc3BvbnNlVXJsKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlLnVybDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcGF0dGVybiBpcyBwcmVzZW50IGluIHRoZSByZXNwb25zZSBib2R5LlxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFRleHRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYXR0ZXJuIC0gUGF0dGVybiB0byBhc3NlcnQuXHJcbiAgICAgKi9cclxuICAgIGFzc2VydFRleHQocGF0dGVybikge1xyXG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgJ1Jlc3BvbnNlIGJvZHkgaXMgZW1wdHknKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzcENvbnRlbnQgPSB0eXBlb2YgdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkgPT09ICdzdHJpbmcnID8gdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkgOiBKU09OLnN0cmluZ2lmeSh0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSk7XHJcbiAgICAgICAgaWYgKCFtb2RVdGlscy5tYXRjaFBhdHRlcm4ocmVzcENvbnRlbnQsIHBhdHRlcm4pKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgRXhwZWN0ZWQgSFRUUCByZXNwb25zZSBjb250ZW50IHRvIG1hdGNoOiBcIiR7cGF0dGVybn1cIiBidXQgZ290OiBcIiR7cmVzcENvbnRlbnR9XCJgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgcmVzcG9uc2UgdGltZVxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFJlc3BvbnNlVGltZVxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG1heFRpbWUgLSBNYXhpbXVtIHJlc3BvbnNlIHRpbWUgaW4gbWlsbGlzZWNvbmRzLlxyXG4gICAgICovXHJcbiAgICBhc3NlcnRSZXNwb25zZVRpbWUobWF4VGltZSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgaWYgSFRUUCBoZWFkZXIgaXMgcHJlc2VudGVkIGluIHRoZSByZXNwb25zZVxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydEhlYWRlclxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGhlYWRlck5hbWUgLSBBIEhUVFAgaGVhZGVyIG5hbWUuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGhlYWRlclZhbHVlUGF0dGVybiAtIEFuIG9wdGlvbmFsIEhUVFAgaGVhZGVyIHZhbHVlIHBhdHRlcm4uXHJcbiAgICAgKi9cclxuICAgIGFzc2VydEhlYWRlcihoZWFkZXJOYW1lLCBoZWFkZXJWYWx1ZVBhdHRlcm4gPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKCFoZWFkZXJOYW1lIHx8IHR5cGVvZiBoZWFkZXJOYW1lICE9PSAnc3RyaW5nJyB8fCBoZWFkZXJOYW1lLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGVhZGVyTmFtZSA9IGhlYWRlck5hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5fbGFzdFJlc3BvbnNlLmhlYWRlcnM7XHJcbiAgICAgICAgaWYgKCFoZWFkZXJzW2hlYWRlck5hbWVdKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCAnRXhwZWN0ZWQgSFRUUCBoZWFkZXIgXCIke2hlYWRlck5hbWV9XCIgdG8gYmUgcHJlc2VudCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChoZWFkZXJWYWx1ZVBhdHRlcm4gJiYgdHlwZW9mIGhlYWRlclZhbHVlUGF0dGVybiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgY29uc3QgYWN0dWFsSGVhZGVyVmFsdWUgPSBoZWFkZXJzW2hlYWRlck5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIW1vZFV0aWxzLm1hdGNoUGF0dGVybihhY3R1YWxIZWFkZXJWYWx1ZSwgaGVhZGVyVmFsdWVQYXR0ZXJuKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBFeHBlY3RlZCBIVFRQIGhlYWRlciBcIiR7aGVhZGVyTmFtZX1cIiB2YWx1ZSB0byBtYXRjaDogXCIke2hlYWRlclZhbHVlUGF0dGVybn1cIiBidXQgZ290OiBcIiR7YWN0dWFsSGVhZGVyVmFsdWV9XCJgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCBpZiBIVFRQIGNvb2tpZSBpcyBwcmVzZW50ZWQgaW4gdGhlIHJlc3BvbnNlXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0Q29va2llXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29va2llTmFtZSAtIEEgSFRUUCBjb29raWUgbmFtZS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gY29va2llVmFsdWVQYXR0ZXJuIC0gQW4gb3B0aW9uYWwgSFRUUCBjb29raWUgdmFsdWUgcGF0dGVybi5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0Q29va2llKGNvb2tpZU5hbWUsIGNvb2tpZVZhbHVlUGF0dGVybikge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgdGhlIGxhc3QgSFRUUCByZXNwb25zZSdzIHN0YXR1cyBjb2RlXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0U3RhdHVzXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcnxBcnJheX0gY29kZUxpc3QgLSBBIHNpbmdsZSBzdGF0dXMgY29kZSBvciBhIGxpc3Qgb2YgY29kZXMuXHJcbiAgICAgKi9cclxuICAgIGFzc2VydFN0YXR1cyhjb2RlTGlzdCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlc3BvbnNlIHx8ICFjb2RlTGlzdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIHdlIGdvdCBhIHNpbmdsZSB2YWx1ZSwgdGhlbiBjb252ZXJ0IGl0IHRvIGFuIGFycmF5XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvZGVMaXN0KSkge1xyXG4gICAgICAgICAgICBjb2RlTGlzdCA9IFtjb2RlTGlzdF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPSB0aGlzLl9sYXN0UmVzcG9uc2Uuc3RhdHVzQ29kZTtcclxuICAgICAgICBpZiAoIWNvZGVMaXN0LmluY2x1ZGVzKHN0YXR1c0NvZGUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgRXhwZWN0ZWQgSFRUUCBzdGF0dXMgdG8gYmU6IFwiJHtjb2RlTGlzdH1cIiBidXQgZ290OiBcIiR7c3RhdHVzQ29kZX1cImApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCBIVFRQIDIwMCBPSyBzdGF0dXNcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRTdGF0dXNPa1xyXG4gICAgICovXHJcbiAgICBhc3NlcnRTdGF0dXNPaygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hc3NlcnRTdGF0dXMoMjAwKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IE9wZW5zIG5ldyB0cmFuc2FjdGlvbi5cclxuICAgICAqIEBkZXNjcmlwdGlvbiBUaGUgdHJhbnNhY3Rpb24gd2lsbCBwZXJzaXN0IHRpbGwgYSBuZXcgb25lIGlzIG9wZW5lZC4gVHJhbnNhY3Rpb24gbmFtZXMgbXVzdCBiZSB1bmlxdWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gdHJhbnNhY3Rpb25cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gVGhlIHRyYW5zYWN0aW9uIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHRyYW5zYWN0aW9uKG5hbWUpIHtcclxuICAgICAgICBpZiAoIW5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBqdXN0IGluIGNhc2UgdXNlciBwYXNzZWQgYSBjb21wbGV4IG9iamVjdCBieSBtaXN0YWtlXHJcbiAgICAgICAgbmFtZSA9IG5hbWUudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgLy8gbGltaXQgdGhlIG5hbWUgbGVuZ3RoIChzaW5jZSB3ZSBjYW4ndCBzdG9yZSB2YWx1ZXMgbGFyZ2VyIHRoYW4gNTEyQiBpbiB0aGUgZGF0YWJhc2UpXHJcbiAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgNTEyKTtcclxuXHJcbiAgICAgICAgZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lID0gbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTdGVwRGlzcGxheU5hbWUobWV0aG9kTmFtZSwgbWV0aG9kQXJncywgcmV0dmFsLCBlcnJvcikge1xyXG4gICAgICAgIGlmICghSFRUUF9NRVRIT0RTLmluY2x1ZGVzKG1ldGhvZE5hbWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5fZXh0cmEgfHwgIXRoaXMuX2V4dHJhLmh0dHAgfHwgIXRoaXMuX2V4dHJhLmh0dHAucmVxdWVzdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYCR7bWV0aG9kTmFtZS50b1VwcGVyQ2FzZSgpfSAke3RoaXMuX2V4dHJhLmh0dHAucmVxdWVzdC5wYXRofWA7XHJcbiAgICB9XHJcblxyXG4gICAgX2FkZFJlcXVlc3RFeHRyYShyZXF1ZXN0LCB1cGRhdGVkT3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpO1xyXG4gICAgICAgIGNvbnN0IHJlcUV4dHJhID0ge1xyXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxyXG4gICAgICAgICAgICBwYXRoOiBgJHt1cmwucGF0aG5hbWV9JHt1cmwuc2VhcmNofSR7dXJsLmhhc2h9YCxcclxuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHRoaXMuX2dldFF1ZXJ5UGFyYW1zKHVybC5zZWFyY2hQYXJhbXMpLFxyXG4gICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiB1cGRhdGVkT3B0aW9ucy5oZWFkZXJzLFxyXG4gICAgICAgICAgICBjb250ZW50VHlwZTogdGhpcy5fZ2V0Q29udGVudFR5cGUodXBkYXRlZE9wdGlvbnMuaGVhZGVycyksXHJcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IHRoaXMuX2dldENvbnRlbnRMZW5ndGgodXBkYXRlZE9wdGlvbnMuaGVhZGVycyksXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAocmVxdWVzdC5mb3JtKSB7XHJcbiAgICAgICAgICAgIHJlcUV4dHJhLmZvcm1EYXRhID0gcmVxdWVzdC5mb3JtO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyZXF1ZXN0Lmpzb24pIHtcclxuICAgICAgICAgICAgcmVxRXh0cmEuY29udGVudFR5cGUgPSAnYXBwbGljYXRpb24vanNvbic7XHJcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0Lmpzb24gaW5zdGFuY2VvZiBPYmplY3QpIHtcclxuICAgICAgICAgICAgICAgIHJlcUV4dHJhLmNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShyZXF1ZXN0Lmpzb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVxRXh0cmEuY29udGVudCA9IHJlcXVlc3QuanNvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyZXF1ZXN0LmJvZHkpIHtcclxuICAgICAgICAgICAgcmVxRXh0cmEuY29udGVudCA9IHJlcXVlc3QuYm9keTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fZXh0cmEuaHR0cCkge1xyXG4gICAgICAgICAgICB0aGlzLl9leHRyYS5odHRwID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2V4dHJhLmh0dHAucmVxdWVzdCA9IHJlcUV4dHJhO1xyXG4gICAgfVxyXG5cclxuICAgIF9nZXRDb250ZW50VHlwZShoZWFkZXJzID0ge30pIHtcclxuICAgICAgICBpZiAoIWhlYWRlcnMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBoZWFkZXJzWydjb250ZW50LXR5cGUnXTtcclxuICAgICAgICBpZiAoIWNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG1hdGNoID0gY29udGVudFR5cGUubWF0Y2goL14oLis/KSg7fCQpLyk7XHJcbiAgICAgICAgaWYgKCFtYXRjaCB8fCBtYXRjaC5sZW5ndGggPCAyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtYXRjaFsxXTtcclxuICAgIH1cclxuXHJcbiAgICBfZ2V0Q29udGVudExlbmd0aChoZWFkZXJzID0ge30pIHtcclxuICAgICAgICBpZiAoIWhlYWRlcnMgfHwgIWhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoQXNTdHIgPSBoZWFkZXJzWydjb250ZW50LWxlbmd0aCddO1xyXG4gICAgICAgIHJldHVybiBwYXJzZUludChsZW5ndGhBc1N0cik7XHJcbiAgICB9XHJcblxyXG4gICAgX2dldFF1ZXJ5UGFyYW1zKHNlYXJjaFBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKCBzZWFyY2hQYXJhbXMua2V5cygpICkucmVkdWNlKCAoIHJlY29yZCwga2V5ICkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBzZWFyY2hQYXJhbXMuZ2V0QWxsKGtleSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7IC4uLnJlY29yZCwgWyBrZXkgXTogdmFsdWVzLmxlbmd0aCA+IDEgPyB2YWx1ZXMuam9pbignLCcpIDogdmFsdWVzWzBdIH07XHJcbiAgICAgICAgfSwge30pO1xyXG4gICAgfVxyXG5cclxuICAgIF9hZGRSZXNwb25zZUV4dHJhKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgY29uc3QgcmVzRXh0cmEgPSB7XHJcbiAgICAgICAgICAgIHVybDogcmVzcG9uc2UucmVkaXJlY3RVcmxzICYmIHJlc3BvbnNlLnJlZGlyZWN0VXJscy5sZW5ndGggJiYgcmVzcG9uc2UucmVkaXJlY3RVcmxzWzBdLFxyXG4gICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNNZXNzYWdlLFxyXG4gICAgICAgICAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNDb2RlLFxyXG4gICAgICAgICAgICBjb250ZW50VHlwZTogdGhpcy5fZ2V0Q29udGVudFR5cGUocmVzcG9uc2UuaGVhZGVycyksXHJcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IHRoaXMuX2dldENvbnRlbnRMZW5ndGgocmVzcG9uc2UuaGVhZGVycyksXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMsXHJcbiAgICAgICAgICAgIHZlcnNpb246IHJlc3BvbnNlLmh0dHBWZXJzaW9uLFxyXG4gICAgICAgICAgICBjb250ZW50OiByZXNwb25zZS5ib2R5LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKCF0aGlzLl9leHRyYS5odHRwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4dHJhLmh0dHAgPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZXh0cmEuaHR0cC5yZXNwb25zZSA9IHJlc0V4dHJhO1xyXG4gICAgICAgIGlmIChyZXNwb25zZS50aW1pbmdzICYmIHJlc3BvbnNlLnRpbWluZ3MucGhhc2VzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4dHJhLmh0dHAudGltaW5ncyA9IHsgLi4ucmVzcG9uc2UudGltaW5ncy5waGFzZXMgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIF9yZXNvbHZlRGF0YShkYXRhLCBoZWFkZXJzLCBpc0Zvcm1EYXRhID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCBkYXRhUmVzb2x2ZXIgPSB7fTtcclxuXHJcbiAgICAgICAgaWYgKGlzRm9ybURhdGEpIHtcclxuICAgICAgICAgICAgZGF0YVJlc29sdmVyLmZvcm0gPSBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcclxuICAgICAgICAgICAgZGF0YVJlc29sdmVyLmJvZHkgPSBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgT2JqZWN0KSB7XHJcbiAgICAgICAgICAgIG1vZFV0aWxzLmFzc2VydENpcmN1bGFyKGRhdGEpO1xyXG4gICAgICAgICAgICBkYXRhUmVzb2x2ZXIuanNvbiA9IGRhdGE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGF0YVJlc29sdmVyLmJvZHkgPSBkYXRhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGFSZXNvbHZlcjtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfaHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzLCB3aXRoQXV0aCA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2V4dHJhLmh0dHApIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2V4dHJhLmh0dHA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vdGhpcy5fYWRkUmVxdWVzdEV4dHJhKGh0dHBPcHRzKTtcclxuICAgICAgICBsZXQgcmVzdWx0O1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBnb3QoeyAuLi5odHRwT3B0cywgaG9va3M6IHtcclxuICAgICAgICAgICAgICAgIGJlZm9yZVJlcXVlc3Q6IFtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0+IHsgdGhpcy5fYWRkUmVxdWVzdEV4dHJhKGh0dHBPcHRzLCBvcHRpb25zKTsgfVxyXG4gICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgfX0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKGh0dHBPcHRzLmRlZmxhdGVSYXcgJiYgcmVzdWx0LmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSA9PT0gJ2RlZmxhdGUnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB6bGliID0gcmVxdWlyZSgnemxpYicpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGVjb21wID0gemxpYi5jcmVhdGVJbmZsYXRlUmF3KCk7XHJcbiAgICAgICAgICAgICAgICBkZWNvbXAud3JpdGUocmVzdWx0LmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXAub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmJvZHkgPSBkYXRhLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmhlYWRlcnNbQ09OVEVOVF9UWVBFX0hFQURFUl0gJiYgcmVzdWx0LmhlYWRlcnNbQ09OVEVOVF9UWVBFX0hFQURFUl0uaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ib2R5ID0gSlNPTi5wYXJzZShyZXN1bHQuYm9keSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBwYXJzaW5nIGZhaWxzIGp1c3QgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSkoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGVhZGVyc1tDT05URU5UX1RZUEVfSEVBREVSXSAmJiByZXN1bHQuaGVhZGVyc1tDT05URU5UX1RZUEVfSEVBREVSXS5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmJvZHkgPSBKU09OLnBhcnNlKHJlc3VsdC5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHBhcnNpbmcgZmFpbHMganVzdCByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gZTtcclxuICAgICAgICAgICAgaWYgKGUucmVzcG9uc2UgJiYgZS5yZXNwb25zZS5zdGF0dXNDb2RlICYmIGUucmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDAxICYmICF3aXRoQXV0aCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXV0aFJlcVJlc3VsdCA9IGF3YWl0IHRoaXMuX2hhbmRsZU50bG1BdXRob3JpemF0aW9uKGh0dHBPcHRzLCBlLnJlc3BvbnNlKTtcclxuICAgICAgICAgICAgICAgIGlmIChhdXRoUmVxUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYXV0aFJlcVJlc3VsdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XHJcbiAgICAgICAgICAgIGxldCBib2R5ID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnJlc3BvbnNlICYmXHJcbiAgICAgICAgICAgICAgICByZXN1bHQucmVzcG9uc2UuYm9keVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGJvZHkgPSByZXN1bHQucmVzcG9uc2UuYm9keTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSByZXN1bHQucmVzcG9uc2UuYm9keTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2UuaGVhZGVycyA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2Uuc3RhdHVzQ29kZSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNNZXNzYWdlOiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2Uuc3RhdHVzTWVzc2FnZSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICByYXdCb2R5OiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2UucmF3Qm9keSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgaHR0cFZlcnNpb246IHJlc3VsdC5odHRwVmVyc2lvbixcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3VsdC5oZWFkZXJzLFxyXG4gICAgICAgICAgICAgICAgdXBncmFkZTogcmVzdWx0LnVwZ3JhZGUsXHJcbiAgICAgICAgICAgICAgICB1cmw6IHJlc3VsdC51cmwsXHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHJlc3VsdC5tZXRob2QsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXN1bHQuc3RhdHVzQ29kZSxcclxuICAgICAgICAgICAgICAgIHN0YXR1c01lc3NhZ2U6IHJlc3VsdC5zdGF0dXNNZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgdGltaW5nczogcmVzdWx0LnRpbWluZ3MsXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0VXJsOiByZXN1bHQucmVxdWVzdFVybCxcclxuICAgICAgICAgICAgICAgIHJlZGlyZWN0VXJsczogcmVzdWx0LnJlZGlyZWN0VXJscyxcclxuICAgICAgICAgICAgICAgIGlzRnJvbUNhY2hlOiByZXN1bHQuaXNGcm9tQ2FjaGUsXHJcbiAgICAgICAgICAgICAgICBpcDogcmVzdWx0LmlwLFxyXG4gICAgICAgICAgICAgICAgcmV0cnlDb3VudDogcmVzdWx0LnJldHJ5Q291bnQsXHJcbiAgICAgICAgICAgICAgICBib2R5OiByZXN1bHQuYm9keVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9hZGRSZXNwb25zZUV4dHJhKHJlc3VsdCk7XHJcbiAgICAgICAgLy8gc3RvcmUgbGFzdCByZXNwb25zZSB0byBhbGxvdyBmdXJ0aGVyIGFzc2VydGlvbnMgYW5kIHZhbGlkYXRpb25zXHJcbiAgICAgICAgdGhpcy5fbGFzdFJlc3BvbnNlID0gcmVzdWx0O1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9oYW5kbGVOdGxtQXV0aG9yaXphdGlvbihodHRwT3B0cywgcmVzcG9uc2UpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3VzZXJuYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBhdXRoTWV0aG9kcyA9IGdldEF1dGhlbnRpY2F0ZU1ldGhvZHMocmVzcG9uc2UpO1xyXG4gICAgICAgIGNvbnN0IG9wdHNXaXRoQXV0aCA9IHsgLi4uaHR0cE9wdHMgfTtcclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDAxICYmIGF1dGhNZXRob2RzPy5zb21lKG0gPT4gbS5zdGFydHNXaXRoKCdiYXNpYycpKSkge1xyXG4gICAgICAgICAgICBvcHRzV2l0aEF1dGguaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gY3JlYXRlQmFzaWNNZXNzYWdlKHRoaXMuX3VzZXJuYW1lIHx8ICcnLCB0aGlzLl9wYXNzd29yZCB8fCAnJyk7XHJcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMob3B0c1dpdGhBdXRoLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSXMgaHR0cHM/XHJcbiAgICAgICAgY29uc3QgcmVxVXJsID0gcmVxdWlyZSgndXJsJykucGFyc2Uob3B0c1dpdGhBdXRoLnVybCk7XHJcbiAgICAgICAgY29uc3QgaXNIdHRwcyA9IHJlcVVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOic7XHJcbiAgICAgICAgLy8gU2V0dXAga2VlcC1hbGl2ZSBhZ2VudCAob3RoZXJ3aXNlIHdlIHdpbGwgZ2V0IEhUVFAgNDAxIGZvciBtZXNzYWdlIHR5cGUgMylcclxuICAgICAgICBjb25zdCBrZWVwYWxpdmVBZ2VudCA9IGlzSHR0cHMgPyBuZXcgaHR0cHMuQWdlbnQoe2tlZXBBbGl2ZTogdHJ1ZX0pXHJcbiAgICAgICAgICAgIDogbmV3IGh0dHAuQWdlbnQoe2tlZXBBbGl2ZTogdHJ1ZX0pO1xyXG4gICAgICAgIGlmIChpc0h0dHBzKSB7XHJcbiAgICAgICAgICAgIG9wdHNXaXRoQXV0aC5hZ2VudCA9IHsgaHR0cHM6IGtlZXBhbGl2ZUFnZW50IH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvcHRzV2l0aEF1dGguYWdlbnQgPSB7IGh0dHA6IGtlZXBhbGl2ZUFnZW50IH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNlbmQgVHlwZSAxIG1lc3NhZ2VcclxuICAgICAgICBjb25zdCBudGxtT3B0cyA9IHtcclxuICAgICAgICAgICAgdXNlcm5hbWU6IHRoaXMuX3VzZXJuYW1lLFxyXG4gICAgICAgICAgICBwYXNzd29yZDogdGhpcy5fcGFzc3dvcmQsXHJcbiAgICAgICAgICAgIGRvbWFpbjogJycsXHJcbiAgICAgICAgICAgIHdvcmtzdGF0aW9uOiAnJyxcclxuICAgICAgICAgICAgdXJsOiBvcHRzV2l0aEF1dGgudXJsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBvcHRzV2l0aEF1dGguaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gbnRsbS5jcmVhdGVUeXBlMU1lc3NhZ2UobnRsbU9wdHMpO1xyXG4gICAgICAgIG9wdHNXaXRoQXV0aC5oZWFkZXJzWydDb25uZWN0aW9uJ10gPSAna2VlcC1hbGl2ZSc7XHJcbiAgICAgICAgb3B0c1dpdGhBdXRoLnRocm93SHR0cEVycm9ycyA9IGZhbHNlO1xyXG4gICAgICAgIGxldCB0eXBlMU1zZ1Jlc3BvbnNlID0gYXdhaXQgZ290KG9wdHNXaXRoQXV0aCk7XHJcbiAgICAgICAgYXV0aE1ldGhvZHMgPSBnZXRBdXRoZW50aWNhdGVNZXRob2RzKHR5cGUxTXNnUmVzcG9uc2UpO1xyXG4gICAgICAgIC8vIFBhcnNlIFR5cGUgMiByZXNwb25zZVxyXG4gICAgICAgIGlmICh0eXBlMU1zZ1Jlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQwMSAmJiBhdXRoTWV0aG9kcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICYmIGF1dGhNZXRob2RzWzBdLnN0YXJ0c1dpdGgoJ250bG0nKSkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlMk1zZyA9IG50bG0ucGFyc2VUeXBlMk1lc3NhZ2UodHlwZTFNc2dSZXNwb25zZS5oZWFkZXJzWyd3d3ctYXV0aGVudGljYXRlJ10pO1xyXG4gICAgICAgICAgICBvcHRzV2l0aEF1dGguZm9sbG93UmVkaXJlY3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgb3B0c1dpdGhBdXRoLmhlYWRlcnNbJ0Nvbm5lY3Rpb24nXSA9ICdjbG9zZSc7XHJcbiAgICAgICAgICAgIG9wdHNXaXRoQXV0aC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPVxyXG4gICAgICAgICAgICAgICAgbnRsbS5jcmVhdGVUeXBlM01lc3NhZ2UodHlwZTJNc2csIG50bG1PcHRzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb3B0c1dpdGhBdXRoLnRocm93SHR0cEVycm9ycyA9IHRydWU7XHJcbiAgICAgICAgLy8gU2VuZCBUeXBlIDMgbWVzc2FnZVxyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMob3B0c1dpdGhBdXRoLCB0cnVlKTtcclxuICAgIH1cclxufSJdfQ==
|
|
775
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1odHRwLmpzIl0sIm5hbWVzIjpbImh0dHAiLCJyZXF1aXJlIiwiaHR0cHMiLCJNT0RVTEVfTkFNRSIsIlJFU1BPTlNFX1RJTUVPVVQiLCJEQUZBVUxUX0hUVFAyIiwiREVGQVVMVF9IVFRQX09QVElPTlMiLCJkZWNvbXByZXNzIiwicmVzcG9uc2VUeXBlIiwidGltZW91dCIsImxvb2t1cCIsImNvbm5lY3QiLCJzZWN1cmVDb25uZWN0Iiwic29ja2V0Iiwic2VuZCIsInJlc3BvbnNlIiwiaHR0cDIiLCJyZWplY3RVbmF1dGhvcml6ZWQiLCJkbnNMb29rdXBJcFZlcnNpb24iLCJDT05URU5UX1RZUEVfSEVBREVSIiwiSFRUUF9NRVRIT0RTIiwiSHR0cE1vZHVsZSIsIk94eWdlbk1vZHVsZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsIl9hbHdheXNJbml0aWFsaXplZCIsIl9sYXN0UmVzcG9uc2UiLCJfYmFzZVVybCIsIl91c2VySHR0cE9wdGlvbnMiLCJfdXNlcm5hbWUiLCJ1bmRlZmluZWQiLCJfcGFzc3dvcmQiLCJfZG9tYWluIiwiX2lzSW5pdGlhbGl6ZWQiLCJuYW1lIiwibmV3Rm9ybURhdGEiLCJGb3JtRGF0YSIsInNldE9wdGlvbnMiLCJvcHRzIiwiZGVmbGF0ZVJhdyIsInNldE50bG1Vc2VyIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsImRvbWFpbiIsInNldFByb3h5IiwidXJsIiwiYm9vdHN0cmFwIiwicGFyc2UiLCJwYXJzZWRVcmwiLCJob3N0bmFtZSIsIk94RXJyb3IiLCJlcnJIZWxwZXIiLCJlcnJvckNvZGUiLCJIVFRQX0VSUk9SIiwicG9ydCIsInByb3RvY29sIiwiZ2xvYmFsIiwiR0xPQkFMX0FHRU5UIiwiSFRUUF9QUk9YWSIsImdldCIsImhlYWRlcnMiLCJodHRwT3B0cyIsIm1ldGhvZCIsIl9odHRwUmVxdWVzdFN5bmMiLCJwb3N0IiwiZGF0YSIsImlzRm9ybURhdGEiLCJyZXNvbHZlZERhdGEiLCJfcmVzb2x2ZURhdGEiLCJwdXQiLCJwYXRjaCIsImRlbGV0ZSIsImdldFJlc3BvbnNlIiwiZ2V0UmVzcG9uc2VCb2R5IiwiYm9keSIsImdldFJlc3BvbnNlSGVhZGVycyIsImdldFJlc3BvbnNlVXJsIiwiYXNzZXJ0VGV4dCIsInBhdHRlcm4iLCJBU1NFUlRfRVJST1IiLCJyZXNwQ29udGVudCIsIkpTT04iLCJzdHJpbmdpZnkiLCJtb2RVdGlscyIsIm1hdGNoUGF0dGVybiIsImFzc2VydFJlc3BvbnNlVGltZSIsIm1heFRpbWUiLCJFcnJvciIsImFzc2VydEhlYWRlciIsImhlYWRlck5hbWUiLCJoZWFkZXJWYWx1ZVBhdHRlcm4iLCJsZW5ndGgiLCJ0b0xvd2VyQ2FzZSIsImFjdHVhbEhlYWRlclZhbHVlIiwiYXNzZXJ0Q29va2llIiwiY29va2llTmFtZSIsImNvb2tpZVZhbHVlUGF0dGVybiIsImFzc2VydFN0YXR1cyIsImNvZGVMaXN0IiwiQXJyYXkiLCJpc0FycmF5Iiwic3RhdHVzQ29kZSIsImluY2x1ZGVzIiwiYXNzZXJ0U3RhdHVzT2siLCJ0cmFuc2FjdGlvbiIsInRvU3RyaW5nIiwic2xpY2UiLCJfbGFzdFRyYW5zYWN0aW9uTmFtZSIsImdldFN0ZXBEaXNwbGF5TmFtZSIsIm1ldGhvZE5hbWUiLCJtZXRob2RBcmdzIiwicmV0dmFsIiwiZXJyb3IiLCJfZXh0cmEiLCJyZXF1ZXN0IiwidG9VcHBlckNhc2UiLCJwYXRoIiwiX2FkZFJlcXVlc3RFeHRyYSIsInVwZGF0ZWRPcHRpb25zIiwiVVJMIiwicmVxRXh0cmEiLCJwYXRobmFtZSIsInNlYXJjaCIsImhhc2giLCJxdWVyeVBhcmFtcyIsIl9nZXRRdWVyeVBhcmFtcyIsInNlYXJjaFBhcmFtcyIsImNvbnRlbnRUeXBlIiwiX2dldENvbnRlbnRUeXBlIiwiY29udGVudExlbmd0aCIsIl9nZXRDb250ZW50TGVuZ3RoIiwiZm9ybSIsImZvcm1EYXRhIiwianNvbiIsIk9iamVjdCIsImNvbnRlbnQiLCJtYXRjaCIsImxlbmd0aEFzU3RyIiwicGFyc2VJbnQiLCJmcm9tIiwia2V5cyIsInJlZHVjZSIsInJlY29yZCIsImtleSIsInZhbHVlcyIsImdldEFsbCIsImpvaW4iLCJfYWRkUmVzcG9uc2VFeHRyYSIsInJlc0V4dHJhIiwicmVkaXJlY3RVcmxzIiwic3RhdHVzVGV4dCIsInN0YXR1c01lc3NhZ2UiLCJ2ZXJzaW9uIiwiaHR0cFZlcnNpb24iLCJ0aW1pbmdzIiwicGhhc2VzIiwiZGF0YVJlc29sdmVyIiwiYXNzZXJ0Q2lyY3VsYXIiLCJ3aXRoQXV0aCIsInJlc3VsdCIsImhvb2tzIiwiYmVmb3JlUmVxdWVzdCIsInpsaWIiLCJkZWNvbXAiLCJjcmVhdGVJbmZsYXRlUmF3Iiwid3JpdGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uIiwiZSIsImF1dGhSZXFSZXN1bHQiLCJfaGFuZGxlTnRsbUF1dGhvcml6YXRpb24iLCJlcnJvck1lc3NhZ2UiLCJtZXNzYWdlIiwicmF3Qm9keSIsInVwZ3JhZGUiLCJyZXF1ZXN0VXJsIiwiaXNGcm9tQ2FjaGUiLCJpcCIsInJldHJ5Q291bnQiLCJhdXRoTWV0aG9kcyIsIm9wdHNXaXRoQXV0aCIsInNvbWUiLCJtIiwic3RhcnRzV2l0aCIsInJlcVVybCIsImlzSHR0cHMiLCJrZWVwYWxpdmVBZ2VudCIsIkFnZW50Iiwia2VlcEFsaXZlIiwiYWdlbnQiLCJudGxtT3B0cyIsIndvcmtzdGF0aW9uIiwibnRsbSIsImNyZWF0ZVR5cGUxTWVzc2FnZSIsInRocm93SHR0cEVycm9ycyIsInR5cGUxTXNnUmVzcG9uc2UiLCJ0eXBlMk1zZyIsInBhcnNlVHlwZTJNZXNzYWdlIiwiZm9sbG93UmVkaXJlY3QiLCJjcmVhdGVUeXBlM01lc3NhZ2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQWFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUlBOzs7Ozs7OztBQXZCQTtBQUNBO0FBQ0E7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R0FBK0IsS0FBL0I7QUFDQSxRQUFJQyxnQkFBZ0IsR0FBRyxNQUFNLGtCQUFJZixZQUFKLENBQTdCO0FBQ0FELElBQUFBLFdBQVcsR0FBRyxzQ0FBdUJnQixnQkFBdkIsQ0FBZCxDQWxDK0MsQ0FtQy9DOztBQUNBLFFBQUlBLGdCQUFnQixDQUFDaEcsVUFBakIsS0FBZ0MsR0FBaEMsSUFBdUNnRixXQUFXLENBQUMxRixNQUFaLEdBQXFCLENBQTVELElBQ0cwRixXQUFXLENBQUMsQ0FBRCxDQUFYLENBQWVJLFVBQWYsQ0FBMEIsTUFBMUIsQ0FEUCxFQUMwQztBQUN0QyxZQUFNYSxRQUFRLEdBQUdKLElBQUksQ0FBQ0ssaUJBQUwsQ0FBdUJGLGdCQUFnQixDQUFDekksT0FBakIsQ0FBeUIsa0JBQXpCLENBQXZCLENBQWpCO0FBQ0EwSCxNQUFBQSxZQUFZLENBQUNrQixjQUFiLEdBQThCLEtBQTlCO0FBQ0FsQixNQUFBQSxZQUFZLENBQUMxSCxPQUFiLENBQXFCLFlBQXJCLElBQXFDLE9BQXJDO0FBQ0EwSCxNQUFBQSxZQUFZLENBQUMxSCxPQUFiLENBQXFCLGVBQXJCLElBQ0lzSSxJQUFJLENBQUNPLGtCQUFMLENBQXdCSCxRQUF4QixFQUFrQ04sUUFBbEMsQ0FESjtBQUVILEtBUEQsTUFRSztBQUNELGFBQU90TCxRQUFQO0FBQ0g7O0FBQ0Q0SyxJQUFBQSxZQUFZLENBQUNjLGVBQWIsR0FBK0IsSUFBL0IsQ0EvQytDLENBZ0QvQzs7QUFDQSxXQUFPLE1BQU0sS0FBS3JJLGdCQUFMLENBQXNCdUgsWUFBdEIsRUFBb0MsSUFBcEMsQ0FBYjtBQUNIOztBQXRuQmdEIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGh0dHBcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggSFRUUChTKVxuICovXG5pbXBvcnQgZ290IGZyb20gJ2dvdCc7XG5pbXBvcnQgRm9ybURhdGEgZnJvbSAnZm9ybS1kYXRhJztcbmltcG9ydCBPeHlnZW5Nb2R1bGUgZnJvbSAnLi4vY29yZS9PeHlnZW5Nb2R1bGUnO1xuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vZXJyb3JzL094eWdlbkVycm9yJztcbmltcG9ydCBlcnJIZWxwZXIgZnJvbSAnLi4vZXJyb3JzL2hlbHBlcic7XG5pbXBvcnQgbW9kVXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge1xuICAgIGdldEF1dGhlbnRpY2F0ZU1ldGhvZHMsXG4gICAgY3JlYXRlQmFzaWNNZXNzYWdlLFxufSBmcm9tICcuL21vZHVsZS1odHRwL250bG0tdXRpbCc7XG5pbXBvcnQgKiBhcyBudGxtIGZyb20gJy4vbW9kdWxlLWh0dHAvbnRsbSc7XG5jb25zdCBodHRwID0gcmVxdWlyZSgnaHR0cCcpO1xuY29uc3QgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpO1xuXG5jb25zdCBNT0RVTEVfTkFNRSA9ICdodHRwJztcbmNvbnN0IFJFU1BPTlNFX1RJTUVPVVQgPSAxMDAwICogNjA7ICAgLy8gaW4gbXNcbmNvbnN0IERBRkFVTFRfSFRUUDIgPSBmYWxzZTtcbmNvbnN0IERFRkFVTFRfSFRUUF9PUFRJT05TID0ge1xuICAgIGRlY29tcHJlc3M6IHRydWUsXG4gICAgcmVzcG9uc2VUeXBlOiAndGV4dCcsXG4gICAgdGltZW91dDoge1xuICAgICAgICBsb29rdXA6IDEwMDAsXG4gICAgICAgIGNvbm5lY3Q6IDUwMCxcbiAgICAgICAgc2VjdXJlQ29ubmVjdDogNTAwLFxuICAgICAgICBzb2NrZXQ6IDEwMDAwMCxcbiAgICAgICAgc2VuZDogMTAwMDAwLFxuICAgICAgICByZXNwb25zZTogUkVTUE9OU0VfVElNRU9VVFxuICAgIH0sXG4gICAgaHR0cDI6IERBRkFVTFRfSFRUUDIsXG4gICAgaHR0cHM6IHtcbiAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZVxuICAgIH0sXG4gICAgZG5zTG9va3VwSXBWZXJzaW9uOiAnaXB2NCdcbn07XG5jb25zdCBDT05URU5UX1RZUEVfSEVBREVSID0gJ2NvbnRlbnQtdHlwZSc7XG5jb25zdCBIVFRQX01FVEhPRFMgPSBbXG4gICAgJ2dldCcsXG4gICAgJ3Bvc3QnLFxuICAgICdwYXRjaCdcbl07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEh0dHBNb2R1bGUgZXh0ZW5kcyBPeHlnZW5Nb2R1bGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKTtcbiAgICAgICAgdGhpcy5fYWx3YXlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9sYXN0UmVzcG9uc2UgPSBudWxsO1xuICAgICAgICB0aGlzLl9iYXNlVXJsID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zID0ge307XG4gICAgICAgIHRoaXMuX3VzZXJuYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9wYXNzd29yZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fZG9tYWluID0gdW5kZWZpbmVkO1xuICAgICAgICAvLyBwcmUtaW5pdGlhbGl6ZSB0aGUgbW9kdWxlXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogQHN1bW1hcnkgR2V0cyBtb2R1bGUgbmFtZVxuICAgICAqIEBmdW5jdGlvbiBuYW1lXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBDb25zdGFudCB2YWx1ZSBcImh0dHBcIi5cbiAgICAgKi9cbiAgICBnZXQgbmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIE1PRFVMRV9OQU1FO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBhIG5ldyBGb3JtRGF0YSBvYmplY3RcbiAgICAgKiBAZnVuY3Rpb24gbmV3Rm9ybURhdGFcbiAgICAgKiBAcmV0dXJuIHtGb3JtRGF0YX0gbmV3IEZvcm1EYXRhIG9iamVjdC5cbiAgICAgKi9cbiAgICBuZXdGb3JtRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtRGF0YSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IFNldHMgdXNlciBkZWZpbmVkIEhUVFAgb3B0aW9ucyAoc3VjaCBhcyBwcm94eSwgZGVjb21wcmVzcyBhbmQgZXRjLilcbiAgICAgKiBAZnVuY3Rpb24gc2V0T3B0aW9uc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gSFRUUCByZXF1ZXN0IG9wdGlvbnMgb2JqZWN0LCBzZWUgW1JlcXVlc3QgT3B0aW9uc10oaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9nb3QvYmxvYi9tYWluL2RvY3VtZW50YXRpb24vMi1vcHRpb25zLm1kKS4gXG4gICAgICogSW4gYWRkaXRpb24gdG8gdGhlIG9wdGlvbnMgbGlzdGVkIGluIHRoZSBsaW5rZWQgZG9jdW1lbnQsICdkZWZsYXRlUmF3JyBvcHRpb24gY2FuIGJlIHVzZWQgd2hlbiBzZXJ2ZXIgcmV0dXJucyBEZWZsYXRlLWNvbXByZXNzZWQgc3RyZWFtIHdpdGhvdXQgaGVhZGVycy5cbiAgICAgKi9cbiAgICBzZXRPcHRpb25zKG9wdHMpIHtcbiAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zID0gb3B0cztcbiAgICAgICAgaWYgKG9wdHMuZGVmbGF0ZVJhdykge1xuICAgICAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zLmRlY29tcHJlc3MgPSBmYWxzZTsgICAgIC8vIGRlY29tcHJlc3M9dHJ1ZSBpbiBkZWZhdWx0IG9wdGlvbnMgc28gd2Ugb3ZlcnJpZGUgaXRcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IFNldHMgdXNlciBjcmVkZW50aWFscyBmb3IgTlRMTSBhdXRoZW50aWNhdGlvbiBwcm9jZXNzXG4gICAgICogQGZ1bmN0aW9uIHNldE50bG1Vc2VyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVzZXJuYW1lIC0gTlRMTSB1c2VybmFtZS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGFzc3dvcmQgLSBOVExNIHBhc3N3b3JkLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gZG9tYWluIC0gTlRMTSBkb21haW4gbmFtZSwgaWYgYXBwbGljYWJsZS5cbiAgICAgKiBJbiBhZGRpdGlvbiB0byB0aGUgb3B0aW9ucyBsaXN0ZWQgaW4gdGhlIGxpbmtlZCBkb2N1bWVudCwgJ2RlZmxhdGVSYXcnIG9wdGlvbiBjYW4gYmUgdXNlZCB3aGVuIHNlcnZlciByZXR1cm5zIERlZmxhdGUtY29tcHJlc3NlZCBzdHJlYW0gd2l0aG91dCBoZWFkZXJzLlxuICAgICAqL1xuICAgIHNldE50bG1Vc2VyKHVzZXJuYW1lLCBwYXNzd29yZCwgZG9tYWluID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIElmIHVzZXJuYW1lIHdhcyBwYXNzZWQgYXMgdW5kZWZpbmVkLCB0aGVuIHJlbW92ZSBwcmV2aW91c2x5IGRlZmluZWQgTlRMTSBjcmVkZW50aWFsc1xuICAgICAgICBpZiAodXNlcm5hbWUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl91c2VybmFtZSA9IHRoaXMuX3Bhc3N3b3JkID0gdGhpcy5fZG9tYWluID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VzZXJuYW1lID0gdXNlcm5hbWU7XG4gICAgICAgIHRoaXMuX3Bhc3N3b3JkID0gcGFzc3dvcmQ7XG4gICAgICAgIHRoaXMuX2RvbWFpbiA9IGRvbWFpbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBTZXRzIHByb3h5IHVybCB0byBiZSB1c2VkIGZvciBjb25uZWN0aW9ucyB3aXRoIHRoZSBzZXJ2aWNlLlxuICAgICAqIEBmdW5jdGlvbiBzZXRQcm94eVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBQcm94eSBzZXJ2ZXIgVVJMLiBOb3QgcGFzc2luZyB0aGlzIGFyZ3VtZW50IHdpbGwgcmVzZXQgdGhlIHByb3h5IHNldHRpbmdzLlxuICAgICAqL1xuICAgIHNldFByb3h5KHVybCkge1xuICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgYm9vdHN0cmFwXG4gICAgICAgICAgICB9ID0gcmVxdWlyZSgnZ2xvYmFsLWFnZW50Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHsgcGFyc2UgfSA9IHJlcXVpcmUoJ3VybCcpO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gcGFyc2UodXJsKTtcblxuICAgICAgICAgICAgaWYgKCFwYXJzZWRVcmwuaG9zdG5hbWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkhUVFBfRVJST1IsICdIb3N0bmFtZSBpbiB1bmRlZmluZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGFyc2VkVXJsLnBvcnQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkhUVFBfRVJST1IsICdQb3J0IGluIHVuZGVmaW5lZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXJzZWRVcmwucHJvdG9jb2wpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkhUVFBfRVJST1IsICdQcm90b2NvbCBpbiB1bmRlZmluZWQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYm9vdHN0cmFwKCk7XG4gICAgICAgICAgICBnbG9iYWwuR0xPQkFMX0FHRU5ULkhUVFBfUFJPWFkgPSB1cmw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbG9iYWwuR0xPQkFMX0FHRU5ULkhUVFBfUFJPWFkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgR0VUXG4gICAgICogQGZ1bmN0aW9uIGdldFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBVUkwuXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPltqYXZhc2NyaXB0XSBVc2FnZSBleGFtcGxlPC9jYXB0aW9uPlxuICAgICAqIC8vIEJhc2ljIHVzYWdlIGV4YW1wbGU6XG4gICAgICogdmFyIHJlc3BvbnNlID0gaHR0cC5nZXQoXG4gICAgICogJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvb3h5Z2VuaHEvb3h5Z2VuLWlkZS9yZWxlYXNlcycsIFxuICAgICAqIHtcbiAgICAgKiAgICdBY2NlcHQtRW5jb2RpbmcnOiAnZ3ppcCwgZGVmbGF0ZScsXG4gICAgICogICAnVXNlci1BZ2VudCc6ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0OyBydjo4Ni4wKSBHZWNrby8yMDEwMDEwMSBGaXJlZm94Lzg2LjAnXG4gICAgICogfSk7XG4gICAgICogbG9nLmluZm8ocmVzcG9uc2UuYm9keSk7XG4gICAgICpcbiAgICAgKiAvLyBJZiBzZXJ2ZXIgcmV0dXJucyBEZWZsYXRlLWNvbXByZXNzZWQgc3RyZWFtIHdpdGhvdXQgaGVhZGVycywgYGRlZmxhdGVSYXdgIGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgdGhlIGNvbnRlbnQuXG4gICAgICogaHR0cC5zZXRPcHRpb25zKHtcbiAgICAgKiAgIGRlZmxhdGVSYXc6IHRydWVcbiAgICAgKiB9KTtcbiAgICAgKiB2YXIgcmVzcG9uc2UgPSBodHRwLmdldCgnaHR0cHM6Ly9GT08uQkFSJyk7XG4gICAgICogbG9nLmluZm8ocmVzcG9uc2UuYm9keSk7XG4gICAgICovXG4gICAgYXN5bmMgZ2V0KHVybCwgaGVhZGVycykge1xuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxuICAgICAgICAgICAgLi4udGhpcy5fdXNlckh0dHBPcHRpb25zIHx8IHt9LFxuICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBIVFRQIFBPU1RcbiAgICAgKiBAZnVuY3Rpb24gcG9zdFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBVUkwuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW49fSBpc0Zvcm1EYXRhIC0gSW5kaWNhdGVzIGlmIFwiZGF0YVwiIHBhcmFtZXRlciBpcyBvZiBVUkwtZW5jb2RlZCBmb3JtIHR5cGUuXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXG4gICAgICovXG4gICAgYXN5bmMgcG9zdCh1cmwsIGRhdGEsIGhlYWRlcnMsIGlzRm9ybURhdGEgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhLCBoZWFkZXJzLCBpc0Zvcm1EYXRhKTtcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XG4gICAgICAgICAgICAuLi5ERUZBVUxUX0hUVFBfT1BUSU9OUyxcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcbiAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9LFxuICAgICAgICAgICAgLi4ucmVzb2x2ZWREYXRhXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgUFVUXG4gICAgICogQGZ1bmN0aW9uIHB1dFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBVUkwuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIG9iamVjdC5cbiAgICAgKi9cbiAgICBhc3luYyBwdXQodXJsLCBkYXRhLCBoZWFkZXJzKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkRGF0YSA9IHRoaXMuX3Jlc29sdmVEYXRhKGRhdGEpO1xuXG4gICAgICAgIGNvbnN0IGh0dHBPcHRzID0ge1xuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXG4gICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9LFxuICAgICAgICAgICAgLi4ucmVzb2x2ZWREYXRhXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgUEFUQ0hcbiAgICAgKiBAZnVuY3Rpb24gcGF0Y2hcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gRGF0YS5cbiAgICAgKiBAcGFyYW0ge09iamVjdD19IGhlYWRlcnMgLSBIVFRQIGhlYWRlcnMuXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXG4gICAgICovXG4gICAgYXN5bmMgcGF0Y2godXJsLCBkYXRhLCBoZWFkZXJzKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkRGF0YSA9IHRoaXMuX3Jlc29sdmVEYXRhKGRhdGEpO1xuXG4gICAgICAgIGNvbnN0IGh0dHBPcHRzID0ge1xuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXG4gICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BBVENIJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgfHwge30sXG4gICAgICAgICAgICAuLi5yZXNvbHZlZERhdGFcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgUGVyZm9ybXMgSFRUUCBERUxFVEVcbiAgICAgKiBAZnVuY3Rpb24gZGVsZXRlXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cbiAgICAgKiBAcGFyYW0ge09iamVjdD19IGhlYWRlcnMgLSBIVFRQIGhlYWRlcnMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZSh1cmwsIGhlYWRlcnMsIGRhdGEpIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWREYXRhID0gdGhpcy5fcmVzb2x2ZURhdGEoZGF0YSk7XG4gICAgICAgIGNvbnN0IGh0dHBPcHRzID0ge1xuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXG4gICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9LFxuICAgICAgICAgICAgLi4ucmVzb2x2ZWREYXRhXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgbGFzdCByZXNwb25zZSBvYmplY3RcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVzcG9uc2VcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIG9iamVjdC5cbiAgICAgKi9cbiAgICBnZXRSZXNwb25zZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RSZXNwb25zZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGxhc3QgcmVzcG9uc2UgYm9keVxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZUJvZHlcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFJlc3BvbnNlIGJvZHkuXG4gICAgICovXG4gICAgZ2V0UmVzcG9uc2VCb2R5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlICYmIHRoaXMuX2xhc3RSZXNwb25zZS5ib2R5ID8gdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgcmVzcG9uc2UgaGVhZGVyc1xuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZUhlYWRlcnNcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIGhlYWRlcnMuXG4gICAgICovXG4gICAgZ2V0UmVzcG9uc2VIZWFkZXJzKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2xhc3RSZXNwb25zZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RSZXNwb25zZS5oZWFkZXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgcmVzcG9uc2UgVVJMXG4gICAgICogQGZ1bmN0aW9uIGdldFJlc3BvbnNlVXJsXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBSZXNwb25zZSBVUkwuXG4gICAgICovXG4gICAgZ2V0UmVzcG9uc2VVcmwoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlc3BvbnNlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlLnVybDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgd2hldGhlciB0aGUgc3BlY2lmaWVkIHBhdHRlcm4gaXMgcHJlc2VudCBpbiB0aGUgcmVzcG9uc2UgYm9keS5cbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0VGV4dFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYXR0ZXJuIC0gUGF0dGVybiB0byBhc3NlcnQuXG4gICAgICovXG4gICAgYXNzZXJ0VGV4dChwYXR0ZXJuKSB7XG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlc3BvbnNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsICdSZXNwb25zZSBib2R5IGlzIGVtcHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcENvbnRlbnQgPSB0eXBlb2YgdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkgPT09ICdzdHJpbmcnID8gdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkgOiBKU09OLnN0cmluZ2lmeSh0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSk7XG4gICAgICAgIGlmICghbW9kVXRpbHMubWF0Y2hQYXR0ZXJuKHJlc3BDb250ZW50LCBwYXR0ZXJuKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBFeHBlY3RlZCBIVFRQIHJlc3BvbnNlIGNvbnRlbnQgdG8gbWF0Y2g6IFwiJHtwYXR0ZXJufVwiIGJ1dCBnb3Q6IFwiJHtyZXNwQ29udGVudH1cImApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCByZXNwb25zZSB0aW1lXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFJlc3BvbnNlVGltZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBtYXhUaW1lIC0gTWF4aW11bSByZXNwb25zZSB0aW1lIGluIG1pbGxpc2Vjb25kcy5cbiAgICAgKi9cbiAgICBhc3NlcnRSZXNwb25zZVRpbWUobWF4VGltZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCBpZiBIVFRQIGhlYWRlciBpcyBwcmVzZW50ZWQgaW4gdGhlIHJlc3BvbnNlXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydEhlYWRlclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBoZWFkZXJOYW1lIC0gQSBIVFRQIGhlYWRlciBuYW1lLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gaGVhZGVyVmFsdWVQYXR0ZXJuIC0gQW4gb3B0aW9uYWwgSFRUUCBoZWFkZXIgdmFsdWUgcGF0dGVybi5cbiAgICAgKi9cbiAgICBhc3NlcnRIZWFkZXIoaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWVQYXR0ZXJuID0gbnVsbCkge1xuICAgICAgICBpZiAoIWhlYWRlck5hbWUgfHwgdHlwZW9mIGhlYWRlck5hbWUgIT09ICdzdHJpbmcnIHx8IGhlYWRlck5hbWUubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBoZWFkZXJOYW1lID0gaGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5fbGFzdFJlc3BvbnNlLmhlYWRlcnM7XG4gICAgICAgIGlmICghaGVhZGVyc1toZWFkZXJOYW1lXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsICdFeHBlY3RlZCBIVFRQIGhlYWRlciBcIiR7aGVhZGVyTmFtZX1cIiB0byBiZSBwcmVzZW50Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaGVhZGVyVmFsdWVQYXR0ZXJuICYmIHR5cGVvZiBoZWFkZXJWYWx1ZVBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBhY3R1YWxIZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyTmFtZV07XG4gICAgICAgICAgICBpZiAoIW1vZFV0aWxzLm1hdGNoUGF0dGVybihhY3R1YWxIZWFkZXJWYWx1ZSwgaGVhZGVyVmFsdWVQYXR0ZXJuKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgRXhwZWN0ZWQgSFRUUCBoZWFkZXIgXCIke2hlYWRlck5hbWV9XCIgdmFsdWUgdG8gbWF0Y2g6IFwiJHtoZWFkZXJWYWx1ZVBhdHRlcm59XCIgYnV0IGdvdDogXCIke2FjdHVhbEhlYWRlclZhbHVlfVwiYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgaWYgSFRUUCBjb29raWUgaXMgcHJlc2VudGVkIGluIHRoZSByZXNwb25zZVxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRDb29raWVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29va2llTmFtZSAtIEEgSFRUUCBjb29raWUgbmFtZS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGNvb2tpZVZhbHVlUGF0dGVybiAtIEFuIG9wdGlvbmFsIEhUVFAgY29va2llIHZhbHVlIHBhdHRlcm4uXG4gICAgICovXG4gICAgYXNzZXJ0Q29va2llKGNvb2tpZU5hbWUsIGNvb2tpZVZhbHVlUGF0dGVybikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCB0aGUgbGFzdCBIVFRQIHJlc3BvbnNlJ3Mgc3RhdHVzIGNvZGVcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0U3RhdHVzXG4gICAgICogQHBhcmFtIHtOdW1iZXJ8QXJyYXl9IGNvZGVMaXN0IC0gQSBzaW5nbGUgc3RhdHVzIGNvZGUgb3IgYSBsaXN0IG9mIGNvZGVzLlxuICAgICAqL1xuICAgIGFzc2VydFN0YXR1cyhjb2RlTGlzdCkge1xuICAgICAgICBpZiAoIXRoaXMuX2xhc3RSZXNwb25zZSB8fCAhY29kZUxpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB3ZSBnb3QgYSBzaW5nbGUgdmFsdWUsIHRoZW4gY29udmVydCBpdCB0byBhbiBhcnJheVxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29kZUxpc3QpKSB7XG4gICAgICAgICAgICBjb2RlTGlzdCA9IFtjb2RlTGlzdF07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IHRoaXMuX2xhc3RSZXNwb25zZS5zdGF0dXNDb2RlO1xuICAgICAgICBpZiAoIWNvZGVMaXN0LmluY2x1ZGVzKHN0YXR1c0NvZGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYEV4cGVjdGVkIEhUVFAgc3RhdHVzIHRvIGJlOiBcIiR7Y29kZUxpc3R9XCIgYnV0IGdvdDogXCIke3N0YXR1c0NvZGV9XCJgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgSFRUUCAyMDAgT0sgc3RhdHVzXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFN0YXR1c09rXG4gICAgICovXG4gICAgYXNzZXJ0U3RhdHVzT2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFzc2VydFN0YXR1cygyMDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IE9wZW5zIG5ldyB0cmFuc2FjdGlvbi5cbiAgICAgKiBAZGVzY3JpcHRpb24gVGhlIHRyYW5zYWN0aW9uIHdpbGwgcGVyc2lzdCB0aWxsIGEgbmV3IG9uZSBpcyBvcGVuZWQuIFRyYW5zYWN0aW9uIG5hbWVzIG11c3QgYmUgdW5pcXVlLlxuICAgICAqIEBmdW5jdGlvbiB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gVGhlIHRyYW5zYWN0aW9uIG5hbWUuXG4gICAgICovXG4gICAgYXN5bmMgdHJhbnNhY3Rpb24obmFtZSkge1xuICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBqdXN0IGluIGNhc2UgdXNlciBwYXNzZWQgYSBjb21wbGV4IG9iamVjdCBieSBtaXN0YWtlXG4gICAgICAgIG5hbWUgPSBuYW1lLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgLy8gbGltaXQgdGhlIG5hbWUgbGVuZ3RoIChzaW5jZSB3ZSBjYW4ndCBzdG9yZSB2YWx1ZXMgbGFyZ2VyIHRoYW4gNTEyQiBpbiB0aGUgZGF0YWJhc2UpXG4gICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIDUxMik7XG5cbiAgICAgICAgZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lID0gbmFtZTtcbiAgICB9XG5cbiAgICBnZXRTdGVwRGlzcGxheU5hbWUobWV0aG9kTmFtZSwgbWV0aG9kQXJncywgcmV0dmFsLCBlcnJvcikge1xuICAgICAgICBpZiAoIUhUVFBfTUVUSE9EUy5pbmNsdWRlcyhtZXRob2ROYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2V4dHJhIHx8ICF0aGlzLl9leHRyYS5odHRwIHx8ICF0aGlzLl9leHRyYS5odHRwLnJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke21ldGhvZE5hbWUudG9VcHBlckNhc2UoKX0gJHt0aGlzLl9leHRyYS5odHRwLnJlcXVlc3QucGF0aH1gO1xuICAgIH1cblxuICAgIF9hZGRSZXF1ZXN0RXh0cmEocmVxdWVzdCwgdXBkYXRlZE9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybCk7XG4gICAgICAgIGNvbnN0IHJlcUV4dHJhID0ge1xuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgICAgIHBhdGg6IGAke3VybC5wYXRobmFtZX0ke3VybC5zZWFyY2h9JHt1cmwuaGFzaH1gLFxuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHRoaXMuX2dldFF1ZXJ5UGFyYW1zKHVybC5zZWFyY2hQYXJhbXMpLFxuICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICAgIGhlYWRlcnM6IHVwZGF0ZWRPcHRpb25zLmhlYWRlcnMsXG4gICAgICAgICAgICBjb250ZW50VHlwZTogdGhpcy5fZ2V0Q29udGVudFR5cGUodXBkYXRlZE9wdGlvbnMuaGVhZGVycyksXG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoOiB0aGlzLl9nZXRDb250ZW50TGVuZ3RoKHVwZGF0ZWRPcHRpb25zLmhlYWRlcnMpLFxuICAgICAgICB9O1xuICAgICAgICBpZiAocmVxdWVzdC5mb3JtKSB7XG4gICAgICAgICAgICByZXFFeHRyYS5mb3JtRGF0YSA9IHJlcXVlc3QuZm9ybTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZXF1ZXN0Lmpzb24pIHtcbiAgICAgICAgICAgIHJlcUV4dHJhLmNvbnRlbnRUeXBlID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3QuanNvbiBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICAgICAgICAgIHJlcUV4dHJhLmNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShyZXF1ZXN0Lmpzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVxRXh0cmEuY29udGVudCA9IHJlcXVlc3QuanNvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZXF1ZXN0LmJvZHkpIHtcbiAgICAgICAgICAgIHJlcUV4dHJhLmNvbnRlbnQgPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX2V4dHJhLmh0dHApIHtcbiAgICAgICAgICAgIHRoaXMuX2V4dHJhLmh0dHAgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9leHRyYS5odHRwLnJlcXVlc3QgPSByZXFFeHRyYTtcbiAgICB9XG5cbiAgICBfZ2V0Q29udGVudFR5cGUoaGVhZGVycyA9IHt9KSB7XG4gICAgICAgIGlmICghaGVhZGVycykge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddO1xuICAgICAgICBpZiAoIWNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1hdGNoID0gY29udGVudFR5cGUubWF0Y2goL14oLis/KSg7fCQpLyk7XG4gICAgICAgIGlmICghbWF0Y2ggfHwgbWF0Y2gubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF0Y2hbMV07XG4gICAgfVxuXG4gICAgX2dldENvbnRlbnRMZW5ndGgoaGVhZGVycyA9IHt9KSB7XG4gICAgICAgIGlmICghaGVhZGVycyB8fCAhaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsZW5ndGhBc1N0ciA9IGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ107XG4gICAgICAgIHJldHVybiBwYXJzZUludChsZW5ndGhBc1N0cik7XG4gICAgfVxuXG4gICAgX2dldFF1ZXJ5UGFyYW1zKHNlYXJjaFBhcmFtcykge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSggc2VhcmNoUGFyYW1zLmtleXMoKSApLnJlZHVjZSggKCByZWNvcmQsIGtleSApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHNlYXJjaFBhcmFtcy5nZXRBbGwoa2V5KTtcbiAgICAgICAgICAgIHJldHVybiB7IC4uLnJlY29yZCwgWyBrZXkgXTogdmFsdWVzLmxlbmd0aCA+IDEgPyB2YWx1ZXMuam9pbignLCcpIDogdmFsdWVzWzBdIH07XG4gICAgICAgIH0sIHt9KTtcbiAgICB9XG5cbiAgICBfYWRkUmVzcG9uc2VFeHRyYShyZXNwb25zZSkge1xuICAgICAgICBjb25zdCByZXNFeHRyYSA9IHtcbiAgICAgICAgICAgIHVybDogcmVzcG9uc2UucmVkaXJlY3RVcmxzICYmIHJlc3BvbnNlLnJlZGlyZWN0VXJscy5sZW5ndGggJiYgcmVzcG9uc2UucmVkaXJlY3RVcmxzWzBdLFxuICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzTWVzc2FnZSxcbiAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1c0NvZGUsXG4gICAgICAgICAgICBjb250ZW50VHlwZTogdGhpcy5fZ2V0Q29udGVudFR5cGUocmVzcG9uc2UuaGVhZGVycyksXG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoOiB0aGlzLl9nZXRDb250ZW50TGVuZ3RoKHJlc3BvbnNlLmhlYWRlcnMpLFxuICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2UuaGVhZGVycyxcbiAgICAgICAgICAgIHZlcnNpb246IHJlc3BvbnNlLmh0dHBWZXJzaW9uLFxuICAgICAgICAgICAgY29udGVudDogcmVzcG9uc2UuYm9keSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCF0aGlzLl9leHRyYS5odHRwKSB7XG4gICAgICAgICAgICB0aGlzLl9leHRyYS5odHRwID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZXh0cmEuaHR0cC5yZXNwb25zZSA9IHJlc0V4dHJhO1xuICAgICAgICBpZiAocmVzcG9uc2UudGltaW5ncyAmJiByZXNwb25zZS50aW1pbmdzLnBoYXNlcykge1xuICAgICAgICAgICAgdGhpcy5fZXh0cmEuaHR0cC50aW1pbmdzID0geyAuLi5yZXNwb25zZS50aW1pbmdzLnBoYXNlcyB9O1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBfcmVzb2x2ZURhdGEoZGF0YSwgaGVhZGVycywgaXNGb3JtRGF0YSA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGRhdGFSZXNvbHZlciA9IHt9O1xuXG4gICAgICAgIGlmIChpc0Zvcm1EYXRhKSB7XG4gICAgICAgICAgICBkYXRhUmVzb2x2ZXIuZm9ybSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIEZvcm1EYXRhKSB7XG4gICAgICAgICAgICBkYXRhUmVzb2x2ZXIuYm9keSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICAgICAgbW9kVXRpbHMuYXNzZXJ0Q2lyY3VsYXIoZGF0YSk7XG4gICAgICAgICAgICBkYXRhUmVzb2x2ZXIuanNvbiA9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRhUmVzb2x2ZXIuYm9keSA9IGRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YVJlc29sdmVyO1xuICAgIH1cblxuICAgIGFzeW5jIF9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMsIHdpdGhBdXRoID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHRoaXMuX2V4dHJhLmh0dHApIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9leHRyYS5odHRwO1xuICAgICAgICB9XG4gICAgICAgIC8vdGhpcy5fYWRkUmVxdWVzdEV4dHJhKGh0dHBPcHRzKTtcbiAgICAgICAgbGV0IHJlc3VsdDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgZ290KHsgLi4uaHR0cE9wdHMsIGhvb2tzOiB7XG4gICAgICAgICAgICAgICAgYmVmb3JlUmVxdWVzdDogW1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0+IHsgdGhpcy5fYWRkUmVxdWVzdEV4dHJhKGh0dHBPcHRzLCBvcHRpb25zKTsgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9fSk7XG5cbiAgICAgICAgICAgIGlmIChodHRwT3B0cy5kZWZsYXRlUmF3ICYmIHJlc3VsdC5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10gPT09ICdkZWZsYXRlJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHpsaWIgPSByZXF1aXJlKCd6bGliJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVjb21wID0gemxpYi5jcmVhdGVJbmZsYXRlUmF3KCk7XG4gICAgICAgICAgICAgICAgZGVjb21wLndyaXRlKHJlc3VsdC5ib2R5KTtcbiAgICAgICAgICAgICAgICBhd2FpdCAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYm9keSA9IGRhdGEudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmhlYWRlcnNbQ09OVEVOVF9UWVBFX0hFQURFUl0gJiYgcmVzdWx0LmhlYWRlcnNbQ09OVEVOVF9UWVBFX0hFQURFUl0uaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmJvZHkgPSBKU09OLnBhcnNlKHJlc3VsdC5ib2R5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgcGFyc2luZyBmYWlscyBqdXN0IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGVhZGVyc1tDT05URU5UX1RZUEVfSEVBREVSXSAmJiByZXN1bHQuaGVhZGVyc1tDT05URU5UX1RZUEVfSEVBREVSXS5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYm9keSA9IEpTT04ucGFyc2UocmVzdWx0LmJvZHkpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBwYXJzaW5nIGZhaWxzIGp1c3QgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gZTtcbiAgICAgICAgICAgIGlmIChlLnJlc3BvbnNlICYmIGUucmVzcG9uc2Uuc3RhdHVzQ29kZSAmJiBlLnJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQwMSAmJiAhd2l0aEF1dGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhdXRoUmVxUmVzdWx0ID0gYXdhaXQgdGhpcy5faGFuZGxlTnRsbUF1dGhvcml6YXRpb24oaHR0cE9wdHMsIGUucmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIGlmIChhdXRoUmVxUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF1dGhSZXFSZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICBsZXQgYm9keSA9IG51bGw7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcmVzdWx0LnJlc3BvbnNlICYmXG4gICAgICAgICAgICAgICAgcmVzdWx0LnJlc3BvbnNlLmJvZHlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGJvZHkgPSByZXN1bHQucmVzcG9uc2UuYm9keTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShib2R5KTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IHJlc3VsdC5yZXNwb25zZS5ib2R5O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiByZXN1bHQubWVzc2FnZSxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2UuaGVhZGVycyA6IG51bGwsXG4gICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzdWx0LnJlc3BvbnNlID8gcmVzdWx0LnJlc3BvbnNlLnN0YXR1c0NvZGUgOiBudWxsLFxuICAgICAgICAgICAgICAgIHN0YXR1c01lc3NhZ2U6IHJlc3VsdC5yZXNwb25zZSA/IHJlc3VsdC5yZXNwb25zZS5zdGF0dXNNZXNzYWdlIDogbnVsbCxcbiAgICAgICAgICAgICAgICByYXdCb2R5OiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2UucmF3Qm9keSA6IG51bGwsXG4gICAgICAgICAgICAgICAgYm9keTogYm9keVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICBodHRwVmVyc2lvbjogcmVzdWx0Lmh0dHBWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3VsdC5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIHVwZ3JhZGU6IHJlc3VsdC51cGdyYWRlLFxuICAgICAgICAgICAgICAgIHVybDogcmVzdWx0LnVybCxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHJlc3VsdC5tZXRob2QsXG4gICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzdWx0LnN0YXR1c0NvZGUsXG4gICAgICAgICAgICAgICAgc3RhdHVzTWVzc2FnZTogcmVzdWx0LnN0YXR1c01lc3NhZ2UsXG4gICAgICAgICAgICAgICAgdGltaW5nczogcmVzdWx0LnRpbWluZ3MsXG4gICAgICAgICAgICAgICAgcmVxdWVzdFVybDogcmVzdWx0LnJlcXVlc3RVcmwsXG4gICAgICAgICAgICAgICAgcmVkaXJlY3RVcmxzOiByZXN1bHQucmVkaXJlY3RVcmxzLFxuICAgICAgICAgICAgICAgIGlzRnJvbUNhY2hlOiByZXN1bHQuaXNGcm9tQ2FjaGUsXG4gICAgICAgICAgICAgICAgaXA6IHJlc3VsdC5pcCxcbiAgICAgICAgICAgICAgICByZXRyeUNvdW50OiByZXN1bHQucmV0cnlDb3VudCxcbiAgICAgICAgICAgICAgICBib2R5OiByZXN1bHQuYm9keVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hZGRSZXNwb25zZUV4dHJhKHJlc3VsdCk7XG4gICAgICAgIC8vIHN0b3JlIGxhc3QgcmVzcG9uc2UgdG8gYWxsb3cgZnVydGhlciBhc3NlcnRpb25zIGFuZCB2YWxpZGF0aW9uc1xuICAgICAgICB0aGlzLl9sYXN0UmVzcG9uc2UgPSByZXN1bHQ7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBhc3luYyBfaGFuZGxlTnRsbUF1dGhvcml6YXRpb24oaHR0cE9wdHMsIHJlc3BvbnNlKSB7XG4gICAgICAgIGlmICghdGhpcy5fdXNlcm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGF1dGhNZXRob2RzID0gZ2V0QXV0aGVudGljYXRlTWV0aG9kcyhyZXNwb25zZSk7XG4gICAgICAgIGNvbnN0IG9wdHNXaXRoQXV0aCA9IHsgLi4uaHR0cE9wdHMgfTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQwMSAmJiBhdXRoTWV0aG9kcz8uc29tZShtID0+IG0uc3RhcnRzV2l0aCgnYmFzaWMnKSkpIHtcbiAgICAgICAgICAgIG9wdHNXaXRoQXV0aC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBjcmVhdGVCYXNpY01lc3NhZ2UodGhpcy5fdXNlcm5hbWUgfHwgJycsIHRoaXMuX3Bhc3N3b3JkIHx8ICcnKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMob3B0c1dpdGhBdXRoLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJcyBodHRwcz9cbiAgICAgICAgY29uc3QgcmVxVXJsID0gcmVxdWlyZSgndXJsJykucGFyc2Uob3B0c1dpdGhBdXRoLnVybCk7XG4gICAgICAgIGNvbnN0IGlzSHR0cHMgPSByZXFVcmwucHJvdG9jb2wgPT09ICdodHRwczonO1xuICAgICAgICAvLyBTZXR1cCBrZWVwLWFsaXZlIGFnZW50IChvdGhlcndpc2Ugd2Ugd2lsbCBnZXQgSFRUUCA0MDEgZm9yIG1lc3NhZ2UgdHlwZSAzKVxuICAgICAgICBjb25zdCBrZWVwYWxpdmVBZ2VudCA9IGlzSHR0cHMgPyBuZXcgaHR0cHMuQWdlbnQoe2tlZXBBbGl2ZTogdHJ1ZX0pXG4gICAgICAgICAgICA6IG5ldyBodHRwLkFnZW50KHtrZWVwQWxpdmU6IHRydWV9KTtcbiAgICAgICAgaWYgKGlzSHR0cHMpIHtcbiAgICAgICAgICAgIG9wdHNXaXRoQXV0aC5hZ2VudCA9IHsgaHR0cHM6IGtlZXBhbGl2ZUFnZW50IH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRzV2l0aEF1dGguYWdlbnQgPSB7IGh0dHA6IGtlZXBhbGl2ZUFnZW50IH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2VuZCBUeXBlIDEgbWVzc2FnZVxuICAgICAgICBjb25zdCBudGxtT3B0cyA9IHtcbiAgICAgICAgICAgIHVzZXJuYW1lOiB0aGlzLl91c2VybmFtZSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiB0aGlzLl9wYXNzd29yZCxcbiAgICAgICAgICAgIGRvbWFpbjogJycsXG4gICAgICAgICAgICB3b3Jrc3RhdGlvbjogJycsXG4gICAgICAgICAgICB1cmw6IG9wdHNXaXRoQXV0aC51cmxcbiAgICAgICAgfTtcbiAgICAgICAgb3B0c1dpdGhBdXRoLmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IG50bG0uY3JlYXRlVHlwZTFNZXNzYWdlKG50bG1PcHRzKTtcbiAgICAgICAgb3B0c1dpdGhBdXRoLmhlYWRlcnNbJ0Nvbm5lY3Rpb24nXSA9ICdrZWVwLWFsaXZlJztcbiAgICAgICAgb3B0c1dpdGhBdXRoLnRocm93SHR0cEVycm9ycyA9IGZhbHNlO1xuICAgICAgICBsZXQgdHlwZTFNc2dSZXNwb25zZSA9IGF3YWl0IGdvdChvcHRzV2l0aEF1dGgpO1xuICAgICAgICBhdXRoTWV0aG9kcyA9IGdldEF1dGhlbnRpY2F0ZU1ldGhvZHModHlwZTFNc2dSZXNwb25zZSk7XG4gICAgICAgIC8vIFBhcnNlIFR5cGUgMiByZXNwb25zZVxuICAgICAgICBpZiAodHlwZTFNc2dSZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MDEgJiYgYXV0aE1ldGhvZHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgJiYgYXV0aE1ldGhvZHNbMF0uc3RhcnRzV2l0aCgnbnRsbScpKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlMk1zZyA9IG50bG0ucGFyc2VUeXBlMk1lc3NhZ2UodHlwZTFNc2dSZXNwb25zZS5oZWFkZXJzWyd3d3ctYXV0aGVudGljYXRlJ10pO1xuICAgICAgICAgICAgb3B0c1dpdGhBdXRoLmZvbGxvd1JlZGlyZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICBvcHRzV2l0aEF1dGguaGVhZGVyc1snQ29ubmVjdGlvbiddID0gJ2Nsb3NlJztcbiAgICAgICAgICAgIG9wdHNXaXRoQXV0aC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPVxuICAgICAgICAgICAgICAgIG50bG0uY3JlYXRlVHlwZTNNZXNzYWdlKHR5cGUyTXNnLCBudGxtT3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgICAgb3B0c1dpdGhBdXRoLnRocm93SHR0cEVycm9ycyA9IHRydWU7XG4gICAgICAgIC8vIFNlbmQgVHlwZSAzIG1lc3NhZ2VcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhvcHRzV2l0aEF1dGgsIHRydWUpO1xuICAgIH1cbn0iXX0=
|