@myop/sdk 0.3.10 → 0.3.11
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/dist/bundled-declarations.d.ts +14 -8
- package/dist/cjs/{_IframeSDK.7bb179ea.js → _IframeSDK.a1d01292.js} +97 -9
- package/dist/cjs/_IframeSDK.a1d01292.js.map +7 -0
- package/dist/cjs/_IframeSDK.f860f582.min.js +1 -0
- package/dist/cjs/{_MyopHelpers.02c01d3a.js → _MyopHelpers.414f44b4.js} +71 -7
- package/dist/cjs/{_MyopHelpers.02c01d3a.js.map → _MyopHelpers.414f44b4.js.map} +2 -2
- package/dist/cjs/_MyopHelpers.982f48e2.min.js +1 -0
- package/dist/cjs/{_WebComponentSDK.91c4a54e.js → _WebComponentSDK.833b1ae4.js} +97 -9
- package/dist/cjs/_WebComponentSDK.833b1ae4.js.map +7 -0
- package/dist/cjs/_WebComponentSDK.d32acfa7.min.js +1 -0
- package/dist/cjs/_hostSDK.726a5b50.min.js +1 -0
- package/dist/cjs/{_hostSDK.878c2ded.js → _hostSDK.eb41becc.js} +97 -9
- package/dist/cjs/_hostSDK.eb41becc.js.map +7 -0
- package/dist/cjs/myop_sdk.js +14 -14
- package/dist/cjs/myop_sdk.js.map +1 -1
- package/dist/cjs/myop_sdk.min.js +1 -1
- package/dist/cjs-bundled/myop_sdk.bundled.js +99 -11
- package/dist/cjs-bundled/myop_sdk.bundled.js.map +2 -2
- package/dist/cjs-bundled/myop_sdk.bundled.min.js +1 -1
- package/dist/module/Iframe/index.js +163 -10
- package/dist/module/Iframe/index.js.map +2 -2
- package/dist/module/SDK.js +164 -11
- package/dist/module/SDK.js.map +2 -2
- package/dist/module/embeddedSDK.js +1 -1
- package/dist/module/helpers/CloudRepository.d.ts +13 -8
- package/dist/module/helpers/index.js +72 -8
- package/dist/module/helpers/index.js.map +2 -2
- package/dist/module/host/embeddedSDK.js +1 -1
- package/dist/module/host/hostSDK.d.ts +1 -0
- package/dist/module/host/index.js +163 -10
- package/dist/module/host/index.js.map +2 -2
- package/dist/module/webcomponent/index.js +163 -10
- package/dist/module/webcomponent/index.js.map +2 -2
- package/package.json +1 -1
- package/dist/cjs/_IframeSDK.4f9dca05.min.js +0 -1
- package/dist/cjs/_IframeSDK.7bb179ea.js.map +0 -7
- package/dist/cjs/_MyopHelpers.abd584e8.min.js +0 -1
- package/dist/cjs/_WebComponentSDK.764eabc3.min.js +0 -1
- package/dist/cjs/_WebComponentSDK.91c4a54e.js.map +0 -7
- package/dist/cjs/_hostSDK.4fda7a3b.min.js +0 -1
- package/dist/cjs/_hostSDK.878c2ded.js.map +0 -7
|
@@ -60,7 +60,7 @@ var MyopSDK = (() => {
|
|
|
60
60
|
var myop_sdk_version_default;
|
|
61
61
|
var init_myop_sdk_version = __esm({
|
|
62
62
|
"version:myop-sdk-version"() {
|
|
63
|
-
myop_sdk_version_default = "0.3.
|
|
63
|
+
myop_sdk_version_default = "0.3.11";
|
|
64
64
|
}
|
|
65
65
|
});
|
|
66
66
|
|
|
@@ -1381,7 +1381,17 @@ var MyopSDK = (() => {
|
|
|
1381
1381
|
const typedLoader = selectedSkin.loader;
|
|
1382
1382
|
if (typedLoader.shadowRootMode === ShadowRootModeType.localFrame) {
|
|
1383
1383
|
const typedPropBehavior = propConfig.behavior;
|
|
1384
|
-
component.element.contentWindow
|
|
1384
|
+
const contentWindow = component.element.contentWindow;
|
|
1385
|
+
const propName = typedPropBehavior.remap || prop;
|
|
1386
|
+
contentWindow[propName] = value;
|
|
1387
|
+
if (propName === "myop_cta_handler" && contentWindow.__myop_cta_queue) {
|
|
1388
|
+
const queue = contentWindow.__myop_cta_queue;
|
|
1389
|
+
contentWindow.__myop_cta_queue = null;
|
|
1390
|
+
queue.forEach((item) => {
|
|
1391
|
+
if (component.markedForDisposed) return;
|
|
1392
|
+
value(item.action, item.payload);
|
|
1393
|
+
});
|
|
1394
|
+
}
|
|
1385
1395
|
return true;
|
|
1386
1396
|
}
|
|
1387
1397
|
}
|
|
@@ -2591,11 +2601,25 @@ var MyopSDK = (() => {
|
|
|
2591
2601
|
_doc.head.insertBefore(_doc.importNode(node, true), _doc.head.firstChild);
|
|
2592
2602
|
}
|
|
2593
2603
|
HTML2Render = _doc.documentElement.outerHTML;
|
|
2604
|
+
} else {
|
|
2605
|
+
const parser = new DOMParser();
|
|
2606
|
+
const _doc = parser.parseFromString(loaderConfig.HTML, "text/html");
|
|
2607
|
+
const myop_preview_script = _doc.getElementById("myop_preview");
|
|
2608
|
+
if (myop_preview_script) {
|
|
2609
|
+
myop_preview_script.remove();
|
|
2610
|
+
HTML2Render = _doc.documentElement.outerHTML;
|
|
2611
|
+
}
|
|
2594
2612
|
}
|
|
2595
2613
|
doc.writeln(HTML2Render);
|
|
2596
2614
|
const sdkScript = HAS_EMBEDDED_SDK ? "<script>".concat(EMBEDDED_SDK_CONTENT, "<\/script>") : '<script src="'.concat(window.myop.__ROOT_SDK_PUBLIC_URL__, '"><\/script>');
|
|
2597
2615
|
const initScript = HAS_EMBEDDED_SDK ? "<script>\n const __myop_init = async () => {\n const iframeModule = await MyopSDK.getIframeModule();\n const IframeSDK = iframeModule.IframeSDK;\n const sdk = new IframeSDK();\n sdk.init();\n }\n __myop_init().then();\n <\/script>" : "<script>\n window.__federation__.__public_path__ = window.__federation__.__public_path__;\n const __myop_init = async () => {\n const {IframeSDK} = (await window.myop.rootSDK.getIframeModule());\n const sdk = new IframeSDK();\n sdk.init();\n }\n __myop_init().then();\n <\/script>";
|
|
2598
2616
|
doc.writeln("".concat(sdkScript).concat(initScript));
|
|
2617
|
+
if ((options == null ? void 0 : options.data) !== void 0) {
|
|
2618
|
+
const ctaQueueScript = "<script>\n window.__myop_cta_queue = [];\n window.myop_cta_handler = function(action, payload) {\n window.__myop_cta_queue.push({action: action, payload: payload});\n };\n <\/script>";
|
|
2619
|
+
const escapedData = JSON.stringify(options.data).replace(/<\/script/gi, "\\u003c/script");
|
|
2620
|
+
const dataScript = '<script id="__myop_init_data_script">\n (function() {\n var data = '.concat(escapedData, ";\n var scriptEl = document.getElementById('__myop_init_data_script');\n\n var callInitInterface = function(fn) {\n var startTime = performance.now();\n // Mark as pre-injected data call for extension tracking\n window.__myop_init_preinjected = true;\n try {\n fn(data);\n } finally {\n window.__myop_init_preinjected = false;\n }\n var duration = performance.now() - startTime;\n\n // Notify extension via postMessage (init* = pre-injected)\n try {\n window.parent.postMessage({\n type: 'MYOP_PREINJECTED_INIT',\n payload: {\n data: data,\n duration: duration,\n timestamp: Date.now()\n }\n }, '*');\n } catch (e) {}\n\n // Cleanup: remove script tag and stored data\n if (scriptEl && scriptEl.parentNode) {\n scriptEl.parentNode.removeChild(scriptEl);\n }\n delete window.__myop_init_data;\n };\n\n if (typeof window.myop_init_interface === 'function') {\n // Function already exists - call immediately\n callInitInterface(window.myop_init_interface);\n } else {\n // Function not yet defined - store data and watch for definition\n window.__myop_init_data = data;\n\n var _original;\n Object.defineProperty(window, 'myop_init_interface', {\n configurable: true,\n enumerable: true,\n set: function(fn) {\n _original = fn;\n if (window.__myop_init_data !== undefined) {\n var storedData = window.__myop_init_data;\n delete window.__myop_init_data;\n callInitInterface(fn);\n }\n },\n get: function() {\n return _original;\n }\n });\n }\n })();\n <\/script>");
|
|
2621
|
+
doc.writeln(ctaQueueScript + dataScript);
|
|
2622
|
+
}
|
|
2599
2623
|
doc.close();
|
|
2600
2624
|
const comp = new MyopIframeComponent(componentDefinition, skin, container, IframeElement, options);
|
|
2601
2625
|
if (loaderConfig.autoHeight) {
|
|
@@ -2871,7 +2895,7 @@ var MyopSDK = (() => {
|
|
|
2871
2895
|
});
|
|
2872
2896
|
|
|
2873
2897
|
// src/helpers/CloudRepository.ts
|
|
2874
|
-
var convertV2VariantToComponentConfig, _CloudRepository, CloudRepository, v2_CloudRepository;
|
|
2898
|
+
var convertV2VariantToComponentConfig, GLOBAL_KEY, getGlobalMain, setGlobalMain, _CloudRepository, CloudRepository, v2_CloudRepository;
|
|
2875
2899
|
var init_CloudRepository = __esm({
|
|
2876
2900
|
"src/helpers/CloudRepository.ts"() {
|
|
2877
2901
|
"use strict";
|
|
@@ -2927,15 +2951,47 @@ var MyopSDK = (() => {
|
|
|
2927
2951
|
name: config.name
|
|
2928
2952
|
};
|
|
2929
2953
|
};
|
|
2954
|
+
GLOBAL_KEY = "__MYOP_CLOUD_REPOSITORY_MAIN__";
|
|
2955
|
+
getGlobalMain = () => {
|
|
2956
|
+
if (typeof window !== "undefined") {
|
|
2957
|
+
return window[GLOBAL_KEY];
|
|
2958
|
+
}
|
|
2959
|
+
if (typeof globalThis !== "undefined") {
|
|
2960
|
+
return globalThis[GLOBAL_KEY];
|
|
2961
|
+
}
|
|
2962
|
+
return void 0;
|
|
2963
|
+
};
|
|
2964
|
+
setGlobalMain = (instance) => {
|
|
2965
|
+
if (typeof window !== "undefined") {
|
|
2966
|
+
window[GLOBAL_KEY] = instance;
|
|
2967
|
+
}
|
|
2968
|
+
if (typeof globalThis !== "undefined") {
|
|
2969
|
+
globalThis[GLOBAL_KEY] = instance;
|
|
2970
|
+
}
|
|
2971
|
+
};
|
|
2930
2972
|
_CloudRepository = class _CloudRepository {
|
|
2931
2973
|
constructor(_baseUrl = "https://cloud.myop.dev") {
|
|
2932
2974
|
this._baseUrl = _baseUrl;
|
|
2933
|
-
// v2 cache
|
|
2975
|
+
// v2 cache - keyed by componentId:env:preview|live
|
|
2934
2976
|
__publicField(this, "variants", {});
|
|
2977
|
+
// Track which components were preloaded and with what params
|
|
2978
|
+
// Key: componentId, Value: { env, preview }
|
|
2979
|
+
__publicField(this, "preloadedComponents", {});
|
|
2935
2980
|
// v1 cache
|
|
2936
2981
|
__publicField(this, "userFlows", {});
|
|
2937
2982
|
__publicField(this, "_defaultEnv", "production");
|
|
2938
2983
|
}
|
|
2984
|
+
static get Main() {
|
|
2985
|
+
const globalMain = getGlobalMain();
|
|
2986
|
+
if (globalMain) {
|
|
2987
|
+
return globalMain;
|
|
2988
|
+
}
|
|
2989
|
+
if (!_CloudRepository._main) {
|
|
2990
|
+
_CloudRepository._main = new _CloudRepository();
|
|
2991
|
+
setGlobalMain(_CloudRepository._main);
|
|
2992
|
+
}
|
|
2993
|
+
return _CloudRepository._main;
|
|
2994
|
+
}
|
|
2939
2995
|
/**
|
|
2940
2996
|
* Set the default environment for this CloudRepository instance
|
|
2941
2997
|
*/
|
|
@@ -2951,23 +3007,55 @@ var MyopSDK = (() => {
|
|
|
2951
3007
|
// ============ V2 Methods (Default) ============
|
|
2952
3008
|
/**
|
|
2953
3009
|
* Check if a component is already cached/preloaded (v2)
|
|
3010
|
+
* If env and preview are not provided, checks if ANY version is preloaded
|
|
2954
3011
|
*/
|
|
2955
3012
|
isPreloaded(componentId, env, preview) {
|
|
2956
|
-
|
|
2957
|
-
|
|
3013
|
+
if (env !== void 0 || preview !== void 0) {
|
|
3014
|
+
const cacheKey = "".concat(componentId, ":").concat(env || this._defaultEnv, ":").concat(preview ? "preview" : "live");
|
|
3015
|
+
return cacheKey in this.variants;
|
|
3016
|
+
}
|
|
3017
|
+
return componentId in this.preloadedComponents;
|
|
3018
|
+
}
|
|
3019
|
+
/**
|
|
3020
|
+
* Get the preloaded params for a component (if preloaded)
|
|
3021
|
+
* Returns undefined if not preloaded
|
|
3022
|
+
*/
|
|
3023
|
+
getPreloadedParams(componentId) {
|
|
3024
|
+
return this.preloadedComponents[componentId];
|
|
2958
3025
|
}
|
|
2959
3026
|
/**
|
|
2960
3027
|
* Fetch a v2 component config
|
|
3028
|
+
* If env/preview not specified and component was preloaded, uses preloaded params
|
|
2961
3029
|
*/
|
|
2962
3030
|
async fetchComponentV2(componentId, environmentIdentifier, preview) {
|
|
2963
|
-
const
|
|
2964
|
-
const
|
|
3031
|
+
const preloaded = this.preloadedComponents[componentId];
|
|
3032
|
+
const hasExplicitParams = environmentIdentifier !== void 0 || preview !== void 0;
|
|
3033
|
+
let env;
|
|
3034
|
+
let usePreview;
|
|
3035
|
+
if (!hasExplicitParams && preloaded) {
|
|
3036
|
+
env = preloaded.env;
|
|
3037
|
+
usePreview = preloaded.preview;
|
|
3038
|
+
} else {
|
|
3039
|
+
env = environmentIdentifier || this._defaultEnv;
|
|
3040
|
+
usePreview = preview != null ? preview : true;
|
|
3041
|
+
}
|
|
3042
|
+
const cacheKey = "".concat(componentId, ":").concat(env, ":").concat(usePreview ? "preview" : "live");
|
|
3043
|
+
console.log("[CloudRepository] fetchComponentV2", {
|
|
3044
|
+
componentId: componentId.slice(0, 8) + "...",
|
|
3045
|
+
env,
|
|
3046
|
+
usePreview,
|
|
3047
|
+
cacheKey,
|
|
3048
|
+
cached: cacheKey in this.variants
|
|
3049
|
+
});
|
|
2965
3050
|
if (!this.variants[cacheKey]) {
|
|
3051
|
+
if (!this.preloadedComponents[componentId]) {
|
|
3052
|
+
this.preloadedComponents[componentId] = { env, preview: usePreview };
|
|
3053
|
+
}
|
|
2966
3054
|
this.variants[cacheKey] = new Promise(
|
|
2967
3055
|
async (resolve, reject) => {
|
|
2968
3056
|
try {
|
|
2969
3057
|
let url = "".concat(this._baseUrl, "/consume?id=").concat(componentId, "&env=").concat(env);
|
|
2970
|
-
if (
|
|
3058
|
+
if (usePreview) {
|
|
2971
3059
|
url += "&preview=true";
|
|
2972
3060
|
}
|
|
2973
3061
|
const res = await fetch(url);
|
|
@@ -3049,7 +3137,7 @@ var MyopSDK = (() => {
|
|
|
3049
3137
|
return this.fetchComponentV1(componentId, flowId);
|
|
3050
3138
|
}
|
|
3051
3139
|
};
|
|
3052
|
-
__publicField(_CloudRepository, "
|
|
3140
|
+
__publicField(_CloudRepository, "_main", null);
|
|
3053
3141
|
CloudRepository = _CloudRepository;
|
|
3054
3142
|
v2_CloudRepository = CloudRepository;
|
|
3055
3143
|
}
|
|
@@ -4110,4 +4198,4 @@ var MyopSDK = (() => {
|
|
|
4110
4198
|
}
|
|
4111
4199
|
return __toCommonJS(SDK_exports);
|
|
4112
4200
|
})();
|
|
4113
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50cyIsICJ2ZXJzaW9uOm15b3Atc2RrLXZlcnNpb24iLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wTWVzc2FnZXMudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvSU15b3BDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvY29tbW9uL0Jhc2VNeW9wU0RLLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vaW5kZXgudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvZ01lc3NhZ2VzLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFJlZkNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRDb3JlLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0lNeW9wTG9hZGVyLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvaWZyYW1lTG9hZGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvY29uc3RzLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvaG9zdC9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL2NvbnN0cy50cyIsICIuLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L3NoYWRvd1Jvb3RSZWYudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L1dlYkNvbXBvbmVudFNESy50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L2VtYmVkZGVkU0RLLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9hcHBseVN0eWxlc2hlZXQudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvaWZyYW1lU2tpblVybFRva2VuaXplci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9jbGFzc0xpc3QudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvY29uZmlnQnVpbGRlci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9DbG91ZFJlcG9zaXRvcnkudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvZXhlYy50cyIsICIuLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyIsICIuLi8uLi9zcmMvaG9zdC9teW9wT3ZlcnJpZGUudHMiLCAiLi4vLi4vc3JjL2hvc3QvaG9zdFNESy50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vdXRpbHMvZG9tT2JzZXJ2ZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9nZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL1NldFJlc2l6ZU9ic2VydmVySGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvSWZyYW1lU0RLLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9NeW9wTWVzc2FnZXMudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvTXlvcEhlbHBlcnMudHMiLCAiLi4vLi4vc3JjL1NESy50cyIsICIuLi8uLi9zcmMvZHluYW1pY0ltcG9ydC9sb2FkX19mZWRlcmF0aW9uX18udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCBjb25zdCBfX2ZlZGVyYXRpb25fXyA9IFwiX19mZWRlcmF0aW9uX19cIlxuZXhwb3J0IGNvbnN0IG9uTG9hZEtleSA9IFwib25Mb2FkXCJcbmV4cG9ydCBjb25zdCBtb2R1bGVJbnN0YW5jZUtleSA9IFwibW9kdWxlSW5zdGFuY2VcIlxuXG5leHBvcnQgY29uc3QgZGVmaW5lRHluYW1pY0ltcG9ydCA9IChnbG9iYWxOYW1lOiBzdHJpbmcsIG1vZHVsZTogYW55KSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh3aW5kb3dbX19mZWRlcmF0aW9uX19dICYmIHdpbmRvd1tfX2ZlZGVyYXRpb25fX11bZ2xvYmFsTmFtZV0gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKHtbZ2xvYmFsTmFtZV06IG1vZHVsZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnX19mZWRlcmF0aW9uX18gbG9hZGVyIG5vdCBkZWZpbmVkIGZvciBtb2R1bGUnLCBtb2R1bGUpO1xuICAgIH1cbn0iLCAiZXhwb3J0IGRlZmF1bHQgJzAuMy4xMCc7IiwgInR5cGUgU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxUPiA9IFQgfCAoc3RyaW5nICYgUmVjb3JkPG5ldmVyLCBuZXZlcj4pO1xuXG5leHBvcnQgdHlwZSBNeW9wTWVzc2FnZUtleSA9IFN0cmluZ1dpdGhBdXRvY29tcGxldGU8a2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcyB8IGtleW9mIHR5cGVvZiBNeW9wTWVzc2FnZXMuSW4+O1xuXG5leHBvcnQgY29uc3QgTXlvcE1lc3NhZ2VzID0ge1xuICAgIC8vaG9zdCB0byBjb21wb25lbnRcbiAgICAnSW5pdFJlcXVlc3QnOiAnSW5pdFJlcXVlc3QnLFxuICAgICdJbml0UmVzcG9uc2UnOiAnSW5pdFJlc3BvbnNlJyxcbiAgICAnSW5pdE1lc3NhZ2UnOiAnSW5pdE1lc3NhZ2UnLFxuICAgICdEaXNwb3NlTWVzc2FnZSc6ICdEaXNwb3NlTWVzc2FnZScsXG5cbiAgICAnQ2hhbmdlVGV4dE1lc3NhZ2UnOiAnQ2hhbmdlVGV4dE1lc3NhZ2UnLFxuICAgICdCaW5kQ2xpY2tNZXNzYWdlJzogJ0JpbmRDbGlja01lc3NhZ2UnLFxuICAgICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJyxcblxuICAgICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc6ICdFeGVjdXRlU2NyaXB0TWVzc2FnZScsXG5cbiAgICAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnOiAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnLFxuICAgICdTZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnOiAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZScsXG4gICAgJ0VudmVsb3BlZE1lc3NhZ2UnOiAnRW52ZWxvcGVkTWVzc2FnZScsXG5cbiAgICAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc6ICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJyxcbiAgICAnR2V0QXR0cmlidXRlTWVzc2FnZSc6ICdHZXRBdHRyaWJ1dGVNZXNzYWdlJyxcblxuICAgICdTZXRJbm5lckh0bWwnOiAnU2V0SW5uZXJIdG1sJyxcblxuICAgIC8vY29tcG9uZW50IG1lc3NhZ2VzXG4gICAgJ0V4ZWN1dGVDb21wb25lbnRNZXRob2QnOiAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCcsXG4gICAgJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJzogJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJyxcbiAgICAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzogJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZScsXG5cbiAgICAnQ2xlYW51cE1lc3NhZ2UnOiAnQ2xlYW51cE1lc3NhZ2UnLFxuXG4gICAgLy8gZXh0ZXJuYWwgdG8gaG9zdCA6XG4gICAgSW46IHtcbiAgICAgICAgJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJzogJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJyxcbiAgICAgICAgJ0NsaWNrUmVwbGF5TWVzc2FnZSc6ICdDbGlja1JlcGxheU1lc3NhZ2UnLFxuICAgICAgICAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSc6ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJyxcblxuICAgICAgICAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSc6ICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJyxcbiAgICAgICAgJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnOiAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZScsXG5cbiAgICAgICAgXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCI6IFwiR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZVwiLFxuICAgICAgICAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnOiAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnLFxuICAgICAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICAgICAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICAgICAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnOiAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnLFxuICAgICAgICAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzogJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSdcbiAgICB9XG59XG4iLCAiLy9UT0RPIDogcmV1c2UgZnJvbSBvbmUgcGxhY2UuXG4vLyBuZWVkcyB0byBiZSB1c2VkIGluIG15b3Atc2RrLCBteW9wLWRhc2hiYW9yZCwgbXlvcC1zZXJ2ZXIsIG15b3AtY2xpIC4uXG5cbmV4cG9ydCBjb25zdCB1dWlkdjQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIFwiMTAwMDAwMDAtMTAwMC00MDAwLTgwMDAtMTAwMDAwMDAwMDAwXCIucmVwbGFjZSgvWzAxOF0vZywgYyA9PlxuICAgICAgICAoK2MgXiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEpKVswXSAmIDE1ID4+ICtjIC8gNCkudG9TdHJpbmcoMTYpXG4gICAgKTtcbn1cblxuLy8gQ29udmVydCBVVUlEIHN0cmluZyB0byBieXRlc1xuZXhwb3J0IGNvbnN0IHV1aWRUb0J5dGVzID0gKHV1aWQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oXG4gICAgICAgIHV1aWQucmVwbGFjZSgvLS9nLCAnJykubWF0Y2goLy57MSwyfS9nKSEubWFwKGJ5dGUgPT4gcGFyc2VJbnQoYnl0ZSwgMTYpKVxuICAgICk7XG59O1xuXG4vLyBDb252ZXJ0IGJ5dGVzIHRvIFVVSUQgc3RyaW5nXG5leHBvcnQgY29uc3QgYnl0ZXNUb1V1aWQgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGhleCA9IFsuLi5ieXRlc10ubWFwKGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgaGV4LnNsaWNlKDAsIDgpLFxuICAgICAgICBoZXguc2xpY2UoOCwgMTIpLFxuICAgICAgICBoZXguc2xpY2UoMTIsIDE2KSxcbiAgICAgICAgaGV4LnNsaWNlKDE2LCAyMCksXG4gICAgICAgIGhleC5zbGljZSgyMClcbiAgICBdLmpvaW4oJy0nKTtcbn07XG5cbi8vIEJhc2U2NCBVUkwtc2FmZSBlbmNvZGVcbmV4cG9ydCBjb25zdCBiYXNlNjRVcmxFbmNvZGUgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGJhc2U2NCA9IGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5ieXRlcykpO1xuICAgIHJldHVybiBiYXNlNjQucmVwbGFjZSgvXFwrL2csICctJykucmVwbGFjZSgvXFwvL2csICdfJykucmVwbGFjZSgvPSskLywgJycpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGRlY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybERlY29kZSA9IChzdHI6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIGxldCBiYXNlNjQgPSBzdHIucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICB3aGlsZSAoYmFzZTY0Lmxlbmd0aCAlIDQpIGJhc2U2NCArPSAnPSc7XG4gICAgY29uc3QgYmluYXJ5ID0gYXRvYihiYXNlNjQpO1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oYmluYXJ5LCBjaGFyID0+IGNoYXIuY2hhckNvZGVBdCgwKSk7XG59O1xuXG4vLyBDb21wcmVzcyBhbiBhcnJheSBvZiBVVUlEcyBpbnRvIGEgc2hvcnQgVVJMLXNhZmUgc3RyaW5nXG5leHBvcnQgY29uc3QgY29tcHJlc3NVVUlEcyA9ICh1dWlkczogc3RyaW5nW10pOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGFsbEJ5dGVzID0gdXVpZHMuZmxhdE1hcCh1dWlkID0+IEFycmF5LmZyb20odXVpZFRvQnl0ZXModXVpZCkpKTtcbiAgICByZXR1cm4gYmFzZTY0VXJsRW5jb2RlKG5ldyBVaW50OEFycmF5KGFsbEJ5dGVzKSk7XG59O1xuXG4vLyBEZWNvbXByZXNzIGZyb20gVVJMLXNhZmUgc3RyaW5nIGJhY2sgdG8gYW4gYXJyYXkgb2YgVVVJRHNcbmV4cG9ydCBjb25zdCBkZWNvbXByZXNzVVVJRHMgPSAoZW5jb2RlZDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gYmFzZTY0VXJsRGVjb2RlKGVuY29kZWQpO1xuICAgIGlmIChieXRlcy5sZW5ndGggJSAxNiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IGxlbmd0aCcpO1xuXG4gICAgY29uc3QgdXVpZHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICAgICAgdXVpZHMucHVzaChieXRlc1RvVXVpZChieXRlcy5zbGljZShpLCBpICsgMTYpKSk7XG4gICAgfVxuICAgIHJldHVybiB1dWlkcztcbn07XG4iLCAiZXhwb3J0ICogZnJvbSAnLi91dWlkLnRzJ1xuXG5leHBvcnQgY29uc3Qgd2FpdCA9IChtczogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcbmltcG9ydCB7SVJlZkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgTWVzc2FnZURpcmVjdGlvbiB7XG4gICAgc3RhdGljIGRvd24gPSAnZG93bicgYXMgY29uc3RcbiAgICBzdGF0aWMgdXAgPSAndXAnIGFzIGNvbnN0XG59XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VEaXJlY3Rpb25PcHRpb24gPSAndXAnIHwgJ2Rvd24nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BNZXNzYWdlPFQgPSBhbnk+IHtcbiAgICBpZCA9IHV1aWR2NCgpXG5cbiAgICBzdGF0aWMgY3JlYXRlPFQsIFUgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxVPikgPT4gVCA9IHR5cGVvZiB0aGlzPihcbiAgICAgICAgdGhpczogVSxcbiAgICAgICAgLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+XG4gICAgKTogSW5zdGFuY2VUeXBlPHR5cGVvZiB0aGlzPiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzKC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdtZWVzYWdlIGlkIGNyZWF0ZWQnLCB0aGlzLmlkLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtcbiAgICB9XG5cbiAgICBteW9wID0gdHJ1ZVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5IHwgc3RyaW5nO1xuXG4gICAgY29udGVudD86IFRcblxuICAgIC8vIFRPRE8gOiBjYW50IGJlIG9wdGlvbmFsIFxuICAgIHNvdXJjZT86IHN0cmluZ1xuICAgIGRlc3RpbmF0aW9uPzogc3RyaW5nXG5cbiAgICByb3V0ZT86IHN0cmluZ1tdXG5cbiAgICByZWY/OiBSZWZcblxuICAgIGRpcmVjdGlvbj86IE1lc3NhZ2VEaXJlY3Rpb25PcHRpb25cblxuICAgIGNsZWFuYWJsZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEVsZW1lbnRNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcj86IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kTWVzc2FnZTxUID0gYW55LCBSIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleTtcblxuICAgIHB1YmxpYyBoYW5kbGVyVW5pcXVlSWQgPSB1dWlkdjQoKVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGhhbmRsZXI6IChtZXNzYWdlOiBSKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWYge1xuICAgIHB1YmxpYyBteW9wID0gdHJ1ZTtcblxuICAgIHB1YmxpYyBfX25vblByb3hpZWQ/OiBSZWY7XG5cbiAgICBzdGF0aWMgY3JlYXRlKHNlbGVjdG9yOiBzdHJpbmcsIHJlZkNvbmZpZz86IElSZWZDb25maWcsIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIGxldCBfcmVmQ29uZmlnID0gcmVmQ29uZmlnO1xuICAgICAgICBpZiAoIV9yZWZDb25maWcpIHtcbiAgICAgICAgICAgIF9yZWZDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgICAgICBzZWxlY3RvclR5cGU6ICdpZC1hdHRyaWJ1dGUnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29kZSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGFzIElSZWZDb25maWdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlZihfcmVmQ29uZmlnLCBjb21wb25lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZDb25maWc6IElSZWZDb25maWcsIHB1YmxpYyBjb21wb25lbnQ/OiBJTXlvcENvbXBvbmVudCkge1xuICAgICAgICB0aGlzLl9fbm9uUHJveGllZCA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMsXG4gICAgICAgICAgICBjb21wb25lbnQ6IG51bGwgLy8gaW4gb3JkZXIgdG8gYmUgc2VyaWFsaXphYmxlXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdDbGlja1JlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBCaW5kQ2xpY2tNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIENsaWNrUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnQmluZENsaWNrTWVzc2FnZSc7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaGFuZGxlcjogKG1lc3NhZ2U6IENsaWNrUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGlja1JlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIENoYW5nZVRleHRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHN0cmluZz4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnQ2hhbmdlVGV4dE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gdGV4dFxuICAgIH1cbn0iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSdcblxuY29uc3QgZnVuY3Rpb25Cb2R5UmVnZXggPSAvKD86ZnVuY3Rpb25cXHMqXFx3KlxccypcXChbXildKlxcKVxccypcXHsoW1xcc1xcU10qPylcXH18KFxcKFteKV0qXFwpXFxzKj0+XFxzKlxceyhbXFxzXFxTXSo/KVxcfSkpXFxzKiQvO1xuY29uc3QgZXhwcmVzc2lvbkJvZHlSZWdleCA9IC9cXChcXHMqW14pXStcXHMqXFwpXFxzKj0+XFxzKiguKykvO1xuXG5leHBvcnQgY29uc3Qgc3RyaXBGdW5jdGlvbiA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBsZXQgbWF0Y2ggPSBjb250ZW50Lm1hdGNoKGZ1bmN0aW9uQm9keVJlZ2V4KTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoWzFdIHx8IG1hdGNoWzNdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZXhwcmVzc2lvbkJvZHlSZWdleCk7XG4gICAgICAgIGlmIChtYXRjaClcbiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXS50cmltKCk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBzY3JpcHRJbnB1dHMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhblxufSB8IHt9O1xuXG5leHBvcnQgdHlwZSBzY3JpcHRWYXJzPFQ+ID0ge1xuICAgIHNlbmQ6IChkYXRhOiBUKSA9PiB2b2lkO1xuICAgIC8vIGNvbXBsZXRlU3RyZWFtOiAoKSA9PiB2b2lkO1xuICAgIHJvb3RSZWY6IFJvb3RSZWY7XG4gICAgbWFrZVNlcmlhbGl6YWJsZTogdHlwZW9mIG1ha2VTZXJpYWxpemFibGVcbn1cblxuZXhwb3J0IHR5cGUgZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEk+ID0ge1xuICAgIFtLIGluIGtleW9mIEldOiBJW0tdO1xufSAmIHNjcmlwdFZhcnM8VD5cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHN0cmluZywgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPj4ge1xuXG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG4gICAgbWVzc2FnZVR5cGUgPSAnRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuICAgIHNjcmlwdDogc3RyaW5nID0gJydcblxuICAgIHN0YXRpYyByZXBsaWVyS2V5ID0gJ3NlbmQnO1xuICAgIHN0YXRpYyBjb21wbGV0ZVN0cmVhbUtleSA9ICdjb21wbGV0ZVN0cmVhbSc7XG5cbiAgICBjb25zdHJ1Y3RvcihzY3JpcHQ6ICh2YXJzOiBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4pID0+IFQsIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgIH0sIHB1YmxpYyBzY3JpcHRJbnB1dHM/OiBJKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgICAgICB0aGlzLnNjcmlwdCA9IHNjcmlwdC50b1N0cmluZygpO1xuXG4gICAgICAgIC8vVE9ETzogY2FuIGJlIHJlbW92ZVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzdHJpcEZ1bmN0aW9uKHRoaXMuY29udGVudCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBjb250ZW50OiBUKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7XG4gICAgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsXG4gICAgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSxcbiAgICBleHRlbmRlZFNjcmlwdFZhcnMsXG4gICAgc2NyaXB0SW5wdXRzLCBzdHJpcEZ1bmN0aW9uXG59IGZyb20gXCIuL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzXCI7XG5cbmV4cG9ydCB0eXBlIGN1c3RvbVJlZlNjcmlwdElucHV0cyA9IHtcbiAgICBlbGVtZW50SWQ6IHN0cmluZyxcbiAgICByZWY/OiBIVE1MRWxlbWVudCxcbiAgICBfc2NyaXB0Pzogc3RyaW5nLFxuICAgIF9fc2NyaXB0SW5wdXRzPzogT2JqZWN0XG59O1xuXG5leHBvcnQgY2xhc3MgQ3VzdG9tUmVmTWVzc2FnZTxUID0gYW55LCBJIGV4dGVuZHMgc2NyaXB0SW5wdXRzID0gY3VzdG9tUmVmU2NyaXB0SW5wdXRzPiBleHRlbmRzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IHtcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzPikgPT4gVCxcbiAgICAgICAgICAgICAgICBwdWJsaWMgc2NyaXB0SW5wdXRzOiBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIH0pIHtcblxuICAgICAgICAvL21vY2sgdmFyc1xuICAgICAgICAvLyBsZXQgcm9vdFJlZiwgZWxlbWVudElkLCBfc2NyaXB0LCBfX3NjcmlwdElucHV0cztcbiAgICAgICAgc3VwZXIoKHtyb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmcyA9IChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLnF1ZXJ5U2VsZWN0b3JBbGwoYFskeydteW9wLWlkJ309JyR7ZWxlbWVudElkfSddYCk7XG4gICAgICAgICAgICBpZiAocmVmcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyAgY29uc3QgcmVmID0gcmVmc1swXTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IGV4cG9zaW5nIFwicmVmc1wiIGFuZCBub3Qgb25seSBcInJlZlwiXG4gICAgICAgICAgICAgICAgLy9mb3IgY2FzZXMgd2hlcmUgdGhlIFJlZiBoYXMgbXVsdGlwbGF0ZSBpbXBsZW1lbnRhdGlvbnNcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBfX3NjcmlwdElucHV0cy5yZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gKCR7X3NjcmlwdH0pKC4uLmFyZ3VtZW50cylgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHluYW1pY0Z1bmN0aW9uKF9fc2NyaXB0SW5wdXRzKTtcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAvL3JldHVybiBGdW5jdGlvbigncmVmJywgJ3Jvb3RSZWYnLCAuLi5PYmplY3Qua2V5cyhfX3NjcmlwdElucHV0cyksIF9zY3JpcHQhKShyZWYsIHJvb3RSZWYsIC4uLk9iamVjdC52YWx1ZXMoX19zY3JpcHRJbnB1dHMpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGwgYXMgVDtcbiAgICAgICAgfSwgaGFuZGxlcik7XG5cbiAgICAgICAgdGhpcy5zY3JpcHRJbnB1dHMgPSB7XG4gICAgICAgICAgICAuLi5zY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAvL19zY3JpcHQ6IHN0cmlwRnVuY3Rpb24oc2NyaXB0LnRvU3RyaW5nKCkpLFxuICAgICAgICAgICAgX3NjcmlwdDogc2NyaXB0LnRvU3RyaW5nKClcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2VyaWFsaXphYmxlLCBTZXJpYWxpemFibGVTa2VsZXRvbn0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPFQgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwID0ga2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcD4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2Uge1xuXG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG4gICAgbWVzc2FnZVR5cGUgPSAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuICAgIGNsZWFuYWJsZSA9IHRydWU7XG4gICAgc2VyaWFsaXphYmxlU2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPEhUTUxFbGVtZW50RXZlbnRNYXBbVF0+ID0gZmFsc2UgLy8ge30gLy8gZW1wdHlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIHR5cGU6IFQsIHB1YmxpYyBoYW5kbGVyOiAobWVzc2FnZTogRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKVxuICAgIH1cblxuICAgIHdpdGhTZXJpYWxpemFibGVTa2VsZXRvbihzZXJpYWxpemFibGVTa2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248SFRNTEVsZW1lbnRFdmVudE1hcFtUXT4pIHtcbiAgICAgICAgdGhpcy5zZXJpYWxpemFibGVTa2VsZXRvbiA9IHNlcmlhbGl6YWJsZVNrZWxldG9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBlOiBTZXJpYWxpemFibGU8RXZlbnQ+KSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgICAgIHRoaXMuY29udGVudCA9IHtcbiAgICAgICAgICAgIGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmLH0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuXG5leHBvcnQgY2xhc3MgU2V0QXR0cmlidXRlTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRBdHRyaWJ1dGVNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXJpYWxpemFibGV9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBoYW5kbGVyOiAobWVzc2FnZTogRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIEZvcm1EYXRhRW50cnkgPSB7XG4gICAgaWQ/OiBzdHJpbmcsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICB2YWx1ZT86IElucHV0RWxlbWVudFZhbHVlLFxuICAgIHJlcXVpcmVkPzogYm9vbGVhbixcbiAgICB2YWxpZGl0eT86IFNlcmlhbGl6YWJsZTxWYWxpZGl0eVN0YXRlPixcbiAgICBteW9wSWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgSW5wdXRFbGVtZW50Rm9ybVZhbHVlID0ge1xuICAgIGZvcm1EYXRhPzogeyBba2V5OiBzdHJpbmddOiBGb3JtRGF0YUVudHJ5IH1cbiAgICB1bm1hcHBlZERhdGE/OiBGb3JtRGF0YUVudHJ5W11cbn07XG5cbmV4cG9ydCB0eXBlIElucHV0RWxlbWVudFZhbHVlID0gc3RyaW5nIHwgSW5wdXRFbGVtZW50Rm9ybVZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZFxuXG5leHBvcnQgY2xhc3MgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGVudDogSW5wdXRFbGVtZW50VmFsdWUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZS50c1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHN0cmluZz4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0SW5uZXJIdG1sJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaW5uZXJIdG1sOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gaW5uZXJIdG1sXG4gICAgfVxufSIsICJpbXBvcnQgeyBCYXNlTXlvcE1lc3NhZ2UgfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG4vLyBzZW50IGJ5IGhvc3QgdG8gY29tcG9uZW50cywgY29udGFpbnMgdGhpZXIgaWQgXG5leHBvcnQgY2xhc3MgSW5pdE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8eyBpZDogc3RyaW5nIH0+IHtcbiAgICBtZXNzYWdlVHlwZSA9ICdJbml0TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgdGhpcy5jb250ZW50ID0geyBpZCB9XG4gICAgfVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cblxuLy8gY29tcG9uZW50IG5vdGlmeSBob3N0IHRoZSBpdCB3YXMgaW5pdGF0ZWQgXG5leHBvcnQgY2xhc3MgSW5pdFJlc3BvbnNlIGV4dGVuZHMgSW5pdE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRSZXNwb25zZSc7XG59XG5cbi8vIGNvbXBvbmVudCBhc2sgdG8gaG9zdCB0byBnZXQgaW5pdGF0ZWQgXG5leHBvcnQgY2xhc3MgSW5pdFJlcXVlc3QgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRSZXF1ZXN0Jztcbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7SUNvbXBvbmVudENvbmZpZywgSVJlZkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdC9ob3N0U0RLLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZDb25maWc6IElSZWZDb25maWcsXG4gICAgICAgICAgICAgICAgcHVibGljIG5lc3RlZENvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgb3B0aW9uczogbG9hZGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UpID0+IHZvaWQsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuXG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBOZXN0ZWRSZWYgPSB7XG4gICAgcmVmTmFtZTogc3RyaW5nLFxuICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBuZXN0ZWRSZWZzOiBOZXN0ZWRSZWZbXSwgcHVibGljIGZhaWxlZD86IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBFbnZlbG9wZWRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdFbnZlbG9wZWRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBkZXN0aW5hdGlvbjogc3RyaW5nLCBwdWJsaWMgbWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgY29uc3QgaW5uZXJFbnZlbG9wZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZSk7XG4gICAgICAgIHRoaXMucm91dGUgPSBbZGVzdGluYXRpb24sIC4uLmlubmVyRW52ZWxvcGVkTWVzc2FnZS5yb3V0ZSA/IGlubmVyRW52ZWxvcGVkTWVzc2FnZS5yb3V0ZSA6IFtdXTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtJRWxlbWVudFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPGFueSwgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnXG4gICAgcmVwbHlNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbn1cblxuZXhwb3J0IGNsYXNzIERldGVjdGVkTXlvcFJlZnNNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPElFbGVtZW50UmVmW10+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgbXlvcEVsZW1lbnRSZWZzOiBJRWxlbWVudFJlZltdKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcilcbiAgICAgICAgdGhpcy5jb250ZW50ID0gbXlvcEVsZW1lbnRSZWZzO1xuICAgIH1cblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlPGFueT4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0dldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZW50OiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxudHlwZSBNZXRob2ROYW1lczxUPiA9IHtcbiAgICAvLyBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gSyA6IG5ldmVyO1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKCkgPT4gdm9pZCA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbi8vIERlZmluZSBhIHR5cGUgdGhhdCBhbGxvd3Mgb25seSBzdHJpbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ldGhvZCBuYW1lcyBvZiBUXG50eXBlIE1ldGhvZFN0cmluZzxUPiA9IE1ldGhvZE5hbWVzPFQ+IGV4dGVuZHMgaW5mZXIgTSA/IE0gZXh0ZW5kcyBzdHJpbmcgPyBNIDogbmV2ZXIgOiBuZXZlcjtcblxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWV0aG9kOiBNZXRob2RTdHJpbmc8SU15b3BDb21wb25lbnQ+KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFNldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnO1xufSIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdDbGVhbnVwUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIENsZWFudXBNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIENsZWFudXBSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdDbGVhbnVwTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY2xlYW51cEZvck1lc3NhZ2VJZDogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogQ2xlYW51cFJlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2xlYW51cFJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGN1c3RvbUNsZWFudXA6IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBEaXNwb3NlTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRGlzcG9zZU1lc3NhZ2UnO1xufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnO1xufVxuXG5leHBvcnQgY2xhc3MgUmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnO1xufSIsICJleHBvcnQgKiBmcm9tICcuL0Jhc2VNZXNzYWdlJztcblxuLy91c2VyJ3MgbWVzc2FnZXNcbmV4cG9ydCAqIGZyb20gJy4vQmluZENsaWNrTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZVRleHRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DdXN0b21SZWZNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9TZXRBdHRyaWJ1dGVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL1NldElubmVySHRtbCc7XG5cbi8vc3lzdGVtIG1lc3NhZ2VzXG5leHBvcnQgKiBmcm9tICcuL0luaXRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0VudmVsb3BlZE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9EZXRlY3RNeW9wUmVmc01lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gICcuL0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL0V4ZWN1dGVDb21wb25lbnRNZXRob2QnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NsZWFudXBNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRGlzcG9zZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOyIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5LCBNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBEaXNwb3NlTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCwgTWVzc2FnZURpcmVjdGlvbixcbiAgICBDbGVhbnVwTWVzc2FnZSwgQ2xlYW51cFJlcGxheU1lc3NhZ2UsXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7SG9zdFNESywgbG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuLyoqXG4gKiBSZXN1bHQgcmV0dXJuZWQgYnkgb2JzZXJ2ZUF1dG9TaXplIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b1NpemVSZXN1bHQge1xuICAgIC8qKiBDdXJyZW50IHdpZHRoIChmcm9tIGNvbnRlbnQpICovXG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICAvKiogQ3VycmVudCBoZWlnaHQgKGZyb20gY29udGVudCkgKi9cbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICAvKiogV2hldGhlciB3aWR0aCBpcyBiZWluZyBhdXRvLXNpemVkICovXG4gICAgYXV0b1NpemluZ1dpZHRoOiBib29sZWFuO1xuICAgIC8qKiBXaGV0aGVyIGhlaWdodCBpcyBiZWluZyBhdXRvLXNpemVkICovXG4gICAgYXV0b1NpemluZ0hlaWdodDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBvYnNlcnZlQXV0b1NpemUgbWV0aG9kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b1NpemVPcHRpb25zIHtcbiAgICAvKiogQ2FsbGJhY2sgY2FsbGVkIHdpdGggc2l6ZSBpbmZvIHdoZW5ldmVyIHNpemUgY2hhbmdlcyAqL1xuICAgIG9uU2l6ZUNoYW5nZT86IChyZXN1bHQ6IEF1dG9TaXplUmVzdWx0KSA9PiB2b2lkO1xuICAgIC8qKiBNaW5pbXVtIHdpZHRoIGNvbnN0cmFpbnQgKi9cbiAgICBtaW5XaWR0aD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWF4aW11bSB3aWR0aCBjb25zdHJhaW50ICovXG4gICAgbWF4V2lkdGg/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIE1pbmltdW0gaGVpZ2h0IGNvbnN0cmFpbnQgKi9cbiAgICBtaW5IZWlnaHQ/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIE1heGltdW0gaGVpZ2h0IGNvbnN0cmFpbnQgKi9cbiAgICBtYXhIZWlnaHQ/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIEV4cGxpY2l0IHdpZHRoIHNldCBieSBob3N0IC0gaWYgZGVmaW5lZCwgZG9uJ3QgYXV0by1zaXplIHdpZHRoICovXG4gICAgZXhwbGljaXRXaWR0aD86IHN0cmluZyB8IG51bWJlcjtcbiAgICAvKiogRXhwbGljaXQgaGVpZ2h0IHNldCBieSBob3N0IC0gaWYgZGVmaW5lZCwgZG9uJ3QgYXV0by1zaXplIGhlaWdodCAqL1xuICAgIGV4cGxpY2l0SGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIC8qKiBGb3JjZSBhdXRvLXNpemUgZXZlbiBpZiBjb250YWluZXIgaGFzIGRpbWVuc2lvbnMgKi9cbiAgICBmb3JjZUF1dG9TaXplPzogYm9vbGVhbjtcbiAgICAvKiogTWluIGhlaWdodCB1c2VkIGJ5IGxvYWRlciB0byBkZXRlY3QgY29sbGFwc2UgKGRlZmF1bHQ6IDUwKSAqL1xuICAgIGxvYWRlck1pbkhlaWdodD86IG51bWJlcjtcbn1cblxuLy9UT0RPIDogY2hhbmdlIElNeW9wQ29tcG9uZW50IHRvIHJlZiBzcGVjaWZpYyBpbXBsXG50eXBlIFJlZlR5cGVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IElNeW9wQ29tcG9uZW50IHwgUmVmXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wQ29tcG9uZW50PFAgPSBhbnksIFIgPSBhbnk+IHtcblxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBpc0luaXRpYXRlZDogYm9vbGVhbjtcblxuICAgIG1hcmtlZEZvckRpc3Bvc2VkOiBib29sZWFuO1xuXG4gICAgc2V0SW5pdGlhdGVkOiAoKSA9PiB2b2lkXG5cbiAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudFxuXG4gICAgLy9yZWYgY29tcG9uZW50cyBjYW4gYmUgZWxlbWVudC1sZXNzXG4gICAgZWxlbWVudD86IEhUTUxFbGVtZW50XG5cbiAgICBzZW5kOiAobXNnOiBCYXNlTXlvcE1lc3NhZ2UpID0+IENsZWFudXBIYW5kbGVyXG5cbiAgICBiaW5kKG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKCkgPT4gYm9vbGVhbik6IHZvaWQ7XG5cbiAgICBiaW5kPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4pOiB2b2lkO1xuXG4gICAgLy8gYm9vbGVhbiByZXR1cm5lZCB2YWx1ZSA9IGhhbmRsZWQgb3Igbm90XG4gICAgb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IEJhc2VNeW9wTWVzc2FnZSkgPT4gYm9vbGVhblxuXG4gICAgaW5pdGlhdGVkOiAoKSA9PiBQcm9taXNlPGFueT47XG5cbiAgICBkaXNwb3NlOiAoKSA9PiB2b2lkXG5cbiAgICBoaWRlKCk6IHZvaWQ7XG5cbiAgICBzaG93KCk6IHZvaWQ7XG5cbiAgICBpbnNwZWN0KCk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZlcyB0aGUgaWZyYW1lIGNvbnRlbnQgc2l6ZSBhbmQgYXV0b21hdGljYWxseSBzeW5jcyBpdCB0byB0aGUgaWZyYW1lIGVsZW1lbnQuXG4gICAgICogT25seSBhdmFpbGFibGUgZm9yIGlmcmFtZS1iYXNlZCBjb21wb25lbnRzLiBVc2VzIGRpcmVjdCBjb250ZW50RG9jdW1lbnQgYWNjZXNzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZyBzaXplIGNoYW5nZSBjYWxsYmFjayBhbmQgbWluL21heCBjb25zdHJhaW50c1xuICAgICAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gc3RvcCBvYnNlcnZpbmdcbiAgICAgKi9cbiAgICBvYnNlcnZlQXV0b1NpemU/OiAob3B0aW9ucz86IEF1dG9TaXplT3B0aW9ucykgPT4gQ2xlYW51cEhhbmRsZXI7XG5cbiAgICBwYXJlbnQ/OiBJTXlvcENvbXBvbmVudDtcblxuICAgIHByb3BzOiBQXG5cbiAgICByZWZzOiBSXG59XG5cbmZ1bmN0aW9uIGlzSW5oZXJpdEZyb20ob2JqOiBhbnksIGJhc2VDbGFzczogYW55KSB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG5cbiAgICBpZiAoIXByb3RvKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAocHJvdG8uY29uc3RydWN0b3IubmFtZSA9PT0gYmFzZUNsYXNzLm5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBpc0luaGVyaXRGcm9tKHByb3RvLCBiYXNlQ2xhc3MpO1xufVxuXG4vLyBUT0RPIDogbW92ZSA6IFxudHlwZSBtZXNzYWdlSGFuZGxlcjxUPiA9IChtZXNzYWdlOiBUKSA9PiBib29sZWFuO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiBleHRlbmRzIFJlZlR5cGVzID0gUmVmVHlwZXM+IGltcGxlbWVudHMgSU15b3BDb21wb25lbnQ8UD4ge1xuICAgIGlkOiBzdHJpbmcgPSAnJ1xuXG4gICAgbWVzc2FnZUhhbmRsZXJzOiBSZWNvcmQ8c3RyaW5nLCBtZXNzYWdlSGFuZGxlcjxhbnk+W10+ID0ge307XG5cbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnRcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICB0aGlzLmlkID0gb3B0aW9ucz8uaWQgfHwgSG9zdFNESy5JbnN0YW5jZSgpLmFzc2lnbklkKGNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucz8udGltZW91dCA/IG9wdGlvbnM/LnRpbWVvdXQgOiA1ICogMTAwMDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWF0ZWQgJiYgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdCAmJiAhdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KGB0aW1lb3V0XyR7dGltZW91dH0gJHt0aGlzLmlkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICAvLyBUT0RPIDogYXV0byBpbnNwZWN0LCBjb250cm9sIGZyb20gY29uZmlnXG4gICAgICAgIHRoaXMuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAod2luZG93Lm15b3AuaG9zdFNESy5pbnNwZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluc3BlY3QoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGdldCBtYXJrZWRGb3JEaXNwb3NlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkO1xuICAgIH1cblxuICAgIHNldCBtYXJrZWRGb3JEaXNwb3NlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbjogVGhlIGNvbXBvbmVudCBpcyBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRpc3Bvc2VkLiBEaXNwb3NlIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGFnYWluIHVudGlsIHRoZSBjdXJyZW50IGRpc3Bvc2FsIHByb2Nlc3MgaXMgY29tcGxldGUuJylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGhpZGUoKTogdm9pZDtcblxuICAgIGFic3RyYWN0IHNob3coKTogdm9pZDtcblxuICAgIGFic3RyYWN0IGluc3BlY3QoKTogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvL1RPRE86IHVzZSBiaW5kV2hlbiB3aXRoIHJldHVybiB0cnVlIHByZWRpY2F0ZSAuLi5cbiAgICBiaW5kID0gPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25cbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0uaW5jbHVkZXMoaGFuZGxlcikpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXS5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZFdoZW4gPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgcHJlZGljYXRlOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbiwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IHZvaWQpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IHVzZSBjb21wb25lbnQuYmluZFdoZW4gd2l0aG91dCBhbiBoYW5kbGVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdID0gW11cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdO1xuXG4gICAgICAgIGNvbnN0IHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyID0gKGU6IFQpID0+IHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vVE9ETyA6IGhhbmRsZSBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uID9cbiAgICAgICAgaGFuZGxlcnMucHVzaChwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGFuZGxlcnMuaW5kZXhPZihwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnb25NZXNzYWdlUmVjZWl2ZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCBpbmNvbWVNZXNzYWdlLCB0aGlzKTtcbiAgICAgICAgLy9UT0RPIDogaGFuZGVsIHNwZWNpYWwgZXZldHMgPyBsaWtlIGluaXRSZXMgP1xuICAgICAgICBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVDb21wb25lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChpbmNvbWVNZXNzYWdlIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpO1xuXG4gICAgICAgICAgICAvL2tlZXBpbmcgdGhpcy5tZXRob2QoKSBzbyB0aGF0IGNvbnRleHQgd2lsbCBzYXZlZFxuICAgICAgICAgICAgaWYgKCh0aGlzIGFzIGFueSlbdHlwZWRNZXNzYWdlLm1ldGhvZF0pIHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpW3R5cGVkTWVzc2FnZS5tZXRob2RdKHR5cGVkTWVzc2FnZS5jb250ZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYG1ldGhvZCBub3QgZm91bmQgJHt0eXBlZE1lc3NhZ2UubWV0aG9kfSBvbiBjb21wb25lbnRgLCB0aGlzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZV07XG4gICAgICAgIGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IGhhbmRsZWQgfHwgaGFuZGxlcihpbmNvbWVNZXNzYWdlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9UT0RPIDogY29uc29sZSBvbmx5IHdoZW4gZGVidWcgY29uZmlnXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdubyBoYW5kbGVycyBmb3VuZCBmb3IgJywgaW5jb21lTWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmlzSW5pdGlhdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUpXG4gICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBfd2hlbkluaXRpYXRlZFJlc29sdmU/OiAodmFsdWU/OiBhbnkpID0+IGFueTtcbiAgICBfd2hlbkluaXRpYXRlZFJlamVjdD86ICh2YWx1ZT86IGFueSkgPT4gYW55O1xuXG4gICAgX3doZW5Jbml0aWF0ZWQ6IFByb21pc2U8YW55PiA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgaW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2hlbkluaXRpYXRlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbmRDbGVhbnVwTWVzc2FnZShtZXNzYWdlOiBDbGVhbnVwTWVzc2FnZSk6IHZvaWQge1xuICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG4gICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSB0aGlzLmlkO1xuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcblxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuYmluZFdoZW4obWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1zZy5yZXBsYXlUb0hhbmRsZXIgPT09IG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgIH0sIChtOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZS5oYW5kbGVyKG0pO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlcjtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBkZWxldGUgbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgdGhpcy5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgc2VuZChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciB7XG4gICAgICAgIC8vbWVzc2FnZXMgdGhhdCBleGV0cmFjdGVkIGZyb20gZW52ZWxvcGUgYWxyZWFkeSBoYXZlIHNvdXJjZSBpbiB0aGVtXG4gICAgICAgIGlmICghbWVzc2FnZS5zb3VyY2UpXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLmRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHRoaXMuaWQ7XG5cbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG5cbiAgICAgICAgbGV0IGNsZWFudXBIYW5kbGVyO1xuICAgICAgICAvLyBUT0RPIDogZml4IGhlYXZ5IG9wLi5cbiAgICAgICAgLy8gIGlmIChpc0luaGVyaXRGcm9tKG1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAobWVzc2FnZS5oYW5kbGVyKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBNeW9wQmluZE1lc3NhZ2UpO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIgPSB0aGlzLmJpbmRXaGVuKHR5cGVkTWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBtc2cucmVwbGF5VG9IYW5kbGVyID09PSB0eXBlZE1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgICAgICB9LCB0eXBlZE1lc3NhZ2UuaGFuZGxlcik7XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlLmhhbmRsZXJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICBpZiAobWVzc2FnZS5yZWYpIHtcbiAgICAgICAgICAgIC8vIHNlcmlhbGl6YWJsZVxuICAgICAgICAgICAgbWVzc2FnZS5yZWYgPSBtZXNzYWdlLnJlZi5fX25vblByb3hpZWQgfHwgbWVzc2FnZS5yZWY7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kQ2xlYW51cE1lc3NhZ2UobmV3IENsZWFudXBNZXNzYWdlKG1lc3NhZ2UuaWQsIChyZXBsYXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nIHJlcGxheT9cbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xlYW51cEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhdGVkKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiB1c2Ugc2RrLmxvZ2dlclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZGlzcG9zaW5nIGJlZm9yZSBpc0luaXRpYXRlZCcsIHRoaXMuaWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdkaXNwb3NpbmcgY29tcG9uZW50JywgdGhpcy5pZCk7XG5cbiAgICAgICAgLy8gLy9UT0RPIDogaW1wbGVtZW50IGRpc3Bvc2UgZmxvd1xuICAgICAgICAvLyBPYmplY3Qua2V5cyh0aGlzLnJlZnMpLmZvckVhY2gocmVmS2V5PT57XG4gICAgICAgIC8vICAgICB0aGlzLnJlZnNbcmVmS2V5XS5kaXNwb3NlKCk7XG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRoZXJlIGlzIGFueSB0aW1lIGZvciB0aGUgb1xuICAgICAgICAvLyB0aGVyIHNpZGUgdG8gcHJvY2Nlc3MgdG8gbWVzc2FnZSBiZWZvcmUgZGllID9cbiAgICAgICAgLy9ub3RpZnkgdGhlIG90aGVyIHNpZGUgU0RLXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRGlzcG9zZU1lc3NhZ2UoKSlcblxuICAgICAgICBjb25zdCBvbkRpc3Bvc2VIYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzWydvbkRpc3Bvc2UnXVxuICAgICAgICBpZiAob25EaXNwb3NlSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIG9uRGlzcG9zZUhhbmRsZXJzLmZvckVhY2goZGlzcG9zZUhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgbnVsbCBvciBmaXggdGhlIHR5cGUgP1xuICAgICAgICAgICAgICAgIGRpc3Bvc2VIYW5kbGVyKG51bGwpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5jb250YWluZXIpO1xuICAgICAgICAvL3RoaXMuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycyA9IHt9XG4gICAgICAgIHRoaXMuaWQgKz0gJ19kaXNwb3NlZCc7XG4gICAgICAgIHRoaXMuaXNJbml0aWF0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm9wczogUCA9IHt9IGFzIHVua25vd24gYXMgUDtcbiAgICByZWZzOiBSID0ge30gYXMgdW5rbm93biBhcyBSO1xufVxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSUVsZW1lbnRSZWYge1xuICAgIG15b3BJZD86IHN0cmluZ1xuICAgIGh0bWxUYWdOYW1lOiBzdHJpbmdcbiAgICBCb3VuZGluZ1JlY3Q/OiBET01SZWN0XG4gICAgb2Zmc2V0VG9wPzogbnVtYmVyXG4gICAgb2Zmc2V0TGVmdD86IG51bWJlclxuXG4gICAgdHlwZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBYUGF0aEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHhQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIGh0bWxUYWdOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIEJvdW5kaW5nUmVjdD86IERPTVJlY3QsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldFRvcD86IG51bWJlcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0TGVmdD86IG51bWJlcikge1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnWFBhdGhFbGVtZW50UmVmJ1xufVxuXG5leHBvcnQgY2xhc3MgTXlvcEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG15b3BJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBodG1sVGFnTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBCb3VuZGluZ1JlY3Q/OiBET01SZWN0LFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRUb3A/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldExlZnQ/OiBudW1iZXIpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnTXlvcEVsZW1lbnRSZWYnXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlcn0gZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IHR5cGUgSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgPSBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+IHwgUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCBjb25zdCBydW5FeGVjdXRvckNsZWFudXAgPSBhc3luYyAodGFzazogSU1lc3NhZ2VFeGVjdXRvckNsZWFudXApID0+IHtcbiAgICBpZiAodHlwZW9mIHRhc2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gSXQncyBhIGZ1bmN0aW9uLCBjYWxsIGl0XG4gICAgICAgIHRhc2soKTtcbiAgICB9IGVsc2UgaWYgKHRhc2sgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIC8vIEl0J3MgYSBQcm9taXNlLCBhd2FpdCBpdFxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXNrO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIGEgZnVuY3Rpb24sIGNhbGwgaXRcbiAgICAgICAgICAgIHJlc3VsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRhc2sgaXMgdm9pZCwgZG8gbm90aGluZ1xufVxuXG50eXBlIElNZXNzYWdlRXhlY3V0b3I8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4gPSAobWVzc2FnZTogVCkgPT4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXA7XG5cbmludGVyZmFjZSBJTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxuXG4gICAgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBpbXBsZW1lbnRzIElNZXNzYWdlSGFuZGxlcjxUPiB7XG5cbiAgICAvL1RPRE8gOiBhZGQgZGlzcG9zZSBtZXRob2RcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZCkge1xuXG4gICAgfVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG4gICAgYWJzdHJhY3QgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnksIEUgPSBhbnk+IGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQsIHB1YmxpYyBjb250ZXh0PzogRSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgcnVuRXhlY3V0b3JDbGVhbnVwfSBmcm9tIFwiLi9pbmRleC50c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL2Jhc2VNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsIENsZWFudXBNZXNzYWdlLCBDbGVhbnVwUmVwbGF5TWVzc2FnZSwgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgRW52ZWxvcGVkTWVzc2FnZSxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVzcG9uc2UsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgSG9zdGVkQ29tcG9uZW50PFQgPSBhbnk+IHtcbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgIH1cblxuICAgIC8vb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IElNeW9wTWVzc2FnZSkgPT4gdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBpZDogc3RyaW5nLCBwdWJsaWMgY29udGV4dD86IFQpIHtcblxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcFNESyB7XG4gICAgaW5pdDogKCkgPT4gdm9pZDtcblxuICAgIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkXG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW107XG5cbiAgICBoYW5kbGVJbmNvbWVNZXNzYWdlczogKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4gdm9pZFxuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50Pjtcbn1cblxuLy8gY29uc3QgbG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzID0gW1xuLy8gICAgIE15b3BNZXNzYWdlcy5Jbml0UmVxdWVzdCxcbi8vICAgICBNeW9wTWVzc2FnZXMuSW5pdFJlc3BvbnNlLFxuLy8gICAgIC8vTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UsXG4vLyBdXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcFNESyBpbXBsZW1lbnRzIElNeW9wU0RLIHtcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdO1xuXG4gICAgbWVzc2FnZVRvSGFuZGxlQWZ0ZXJJbml0OiBCYXNlTXlvcE1lc3NhZ2VbXSA9IFtdO1xuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PiA9IHt9O1xuXG4gICAgYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBtZXNzYWdlQ2xlYW51cENhY2hlOiBSZWNvcmQ8c3RyaW5nLCBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+PiB8IFByb21pc2U8dm9pZD4gPSB7fTtcblxuICAgIGhhbmRsZUluY29tZU1lc3NhZ2VzKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gZXZlbnQuZGF0YSA/IGV2ZW50LmRhdGEgOiBldmVudC5kZXRhaWw7XG5cbiAgICAgICAgaWYgKCFldmVudENvbnRlbnQgfHwgIWV2ZW50Q29udGVudC5teW9wKSB7XG4gICAgICAgICAgICAvLyBub3QgbXlvcCBtYXJrZWQgZXZlbnQgXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGV2ZW50Q29udGVudCBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLmRpcmVjdGlvbiAhPT0gTWVzc2FnZURpcmVjdGlvbi5kb3duKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbWVzc2FnZSBkcm9wcGVkIGluIGJhc2VTREssIGRpcmVjdGlvbiB3YXMgJywgZXZlbnQuZGF0YS5kaXJlY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiAobG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzLmluY2x1ZGVzKG1lc3NhZ2UubWVzc2FnZVR5cGUpKSB7XG4gICAgICAgICAgICAvLyAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyAgICAgLy9UT0RPIDogZml4IGRpcmVjdGlvbiA/IG1lc3NhZ2Ugd2lsbCBub3QgcHJvY2Nlc3Mgb3RoZXJ3aXNlXG4gICAgICAgICAgICAvLyAgICAgd2luZG93Lm15b3AuaG9zdFNESy5zZW5kKG1lc3NhZ2UpXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkRpc3Bvc2VNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNob3VsZCBub3QgYmUgb3B0aW9uYWwsIGZpeCBhbmQgcmVtb3ZlICdpZidcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5kZXN0aW5hdGlvbilcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uXVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gV2UgZ290IG91ciBpZCBmcm9tIG91ciBob3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogU0RLIG1heSBzZXJ2ZSBtb3JlIHRoYW4gMSBjb21wb25lbnQgLi4gdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb21wb25lbnRJZCA9IChtZXNzYWdlIGFzIEluaXRNZXNzYWdlKS5jb250ZW50LmlkO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgRXJyb3IoXCJyZWNoaXZlZCBpbml0IG1lc3NhZ2UgZm9yIGFuIGV4c2lzaW5nIGNvbXBvbmVudC5cIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0gPSBuZXcgSG9zdGVkQ29tcG9uZW50KG5ld0NvbXBvbmVudElkKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlc3BvbnNlKG5ld0NvbXBvbmVudElkKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogaXMgaXQgdHJ1ZSB0byBub3QgcGFzcyBmdXJ0aGVyICggdG8gdGhlIGNvbXBvbmVudCApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBmb3Igc2FtZSBIb3N0U0RLIGNhc2VzXG4gICAgICAgICAgICAvLyB3aGVuIGJvdGggUmVmQ29tcG9uZW50IGFuZCByZWFsQ29tcG9uZW50IGhvc3RlZCBpbiB0aGUgc2FtZSBIb3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnZlbG9wZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXJNZXNzYWdlID0gZW52ZWxvcGVkTWVzc2FnZS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBpbm5lck1lc3NhZ2U7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0IHx8IHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uIV0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkNvbXBvbmVudCA9IG15b3AuaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBpbm5lck1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdGluYXRpb25Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQ29tcG9uZW50LnNlbmQoaW5uZXJNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQgPSBteW9wLmhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gZW52ZWxvcGVkTWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQuc2VuZChpbm5lck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2Upe1xuICAgICAgICAgICAgLy8gICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG4gICAgICAgICAgICAvLyAvLyAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNsZWFudXBNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ2xlYW51cE1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbdHlwZWRNZXNzYWdlLmNsZWFudXBGb3JNZXNzYWdlSWRdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXBNZXNzYWdlID0gbmV3IENsZWFudXBSZXBsYXlNZXNzYWdlKCEhY2xlYW51cCk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXBNZXNzYWdlLmRlc3RpbmF0aW9uID0gbWVzc2FnZS5kZXN0aW5hdGlvbjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoISFjbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW3R5cGVkTWVzc2FnZS5jbGVhbnVwRm9yTWVzc2FnZUlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkV4ZWN1dG9yQ2xlYW51cChjbGVhbnVwKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QoY2xlYW51cE1lc3NhZ2UsIHR5cGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogaGFuZGVsIGVycm9yP1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChjbGVhbnVwTWVzc2FnZSwgdHlwZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGFjdGlvbkhhbmRsZXJGb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zdXBwb3J0ZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlci5tZXNzYWdlVHlwZSA9PT0gbWVzc2FnZS5tZXNzYWdlVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uSGFuZGxlckZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSBoYW5kbGVyLmV4ZWN1dG9yKG1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUgJiYgY2xlYW51cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVttZXNzYWdlLmlkXSA9IGNsZWFudXA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhbnVwICYmICFtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2xlYW51cCBoYW5kbGVyIGdlbmVyYXRlZCBmb3Igbm9uLWNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjbGVhbnVwICYmIG1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjbGVhbnVwIGhhbmRsZXIgZ2VuZXJhdGVkIGZvciBhIGNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbkhhbmRsZXJGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBwcmludCB3aXRoIGRlYnVnIGNvbmZpZyBvbmx5XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25vIG1lc3NhZ2UgaGFuZGxlciB3YXMgZm91bmQgZm9yICcsIG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndW5zdXBwb3J0ZWQgbWVzc2FnZSB0eXBlJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFic3RyYWN0IGluaXQ6ICgpID0+IHZvaWQ7XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCAqIGZyb20gJy4vTXlvcEVsZW1lbnRSZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9iYXNlTWVzc2FnZUhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9CYXNlTXlvcFNESyc7XG5cbmV4cG9ydCB0eXBlIENsZWFudXBIYW5kbGVyID0gKCkgPT4gdm9pZFxuXG5leHBvcnQgdHlwZSBEaWN0aW9uYXJ5PFQ+ID0geyBba2V5OiBzdHJpbmddOiBUOyB9O1xuXG4vL2V4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0gJ0lmcmFtZUxvYWRlcicgfCAnV2ViQ29tcG9uZW50TG9hZGVyJyB8ICdIVE1MTG9hZGVyJyB8IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IFNraW5Mb2FkZXJzID0ge1xuICAgIFwiSWZyYW1lTG9hZGVyXCI6IFwiSWZyYW1lTG9hZGVyXCIsXG4gICAgXCJXZWJDb21wb25lbnRMb2FkZXJcIjogXCJXZWJDb21wb25lbnRMb2FkZXJcIixcbiAgICBcIkhUTUxMb2FkZXJcIjogXCJIVE1MTG9hZGVyXCIsXG4gICAgXCJNaW5pbWl6ZWRMb2FkZXJcIjogXCJNaW5pbWl6ZWRMb2FkZXJcIlxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0ga2V5b2YgdHlwZW9mIFNraW5Mb2FkZXJzO1xuXG5leHBvcnQgdHlwZSBQcm9wVHlwZSA9ICdhbnknIHwgJ3N0cmluZycgfCAnbnVtYmVyJyB8IHN0cmluZzsgLy8gVE9ETyA6IDxcbmV4cG9ydCB0eXBlIFJlZlNlbGVjdG9yVHlwZSA9ICdpZC1hdHRyaWJ1dGUnIHwgJ2Nzcy1zZWxlY3RvcicgfCAneHBhdGgnIHwgc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgTG9hZGVyRnJhbWV3b3JrcyA9IHtcbiAgICBcInJlYWN0XCI6IFwicmVhY3RcIixcbiAgICBcInZ1ZVwiOiBcInZ1ZVwiLFxuICAgIFwiYW5ndWxhclwiOiBcImFuZ3VsYXJcIixcbn0gYXMgY29uc3RcbmV4cG9ydCB0eXBlIExvYWRlckZyYW1ld29ya1R5cGUgPSBrZXlvZiB0eXBlb2YgTG9hZGVyRnJhbWV3b3JrcztcblxuZXhwb3J0IGludGVyZmFjZSBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiV2ViQ29tcG9uZW50TG9hZGVyXCI7XG4gICAgdXJsOiBzdHJpbmcsXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgZnJhbWV3b3JrPzogTG9hZGVyRnJhbWV3b3JrVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElJZnJhbWVMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJJZnJhbWVMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZ1xuICAgIGF1dG9IZWlnaHQ6IGJvb2xlYW5cbiAgICBoZWlnaHQ/OiBzdHJpbmdcbiAgICB3aWR0aD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgU2hhZG93Um9vdE1vZGVUeXBlID0ge1xuICAgIFwib3BlblwiOiBcIm9wZW5cIixcbiAgICBcImNsb3NlZFwiOiBcImNsb3NlZFwiLFxuICAgIFwibm9uZVwiOiBcIm5vbmVcIixcbiAgICBcImxvY2FsRnJhbWVcIjogXCJsb2NhbEZyYW1lXCJcbn0gYXMgY29uc3Q7XG5cblxuZXhwb3J0IGludGVyZmFjZSBJSFRNTExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIkhUTUxMb2FkZXJcIjtcbiAgICBIVE1MOiBzdHJpbmc7XG4gICAgLy9UT0RPOiByZW5hbWUocm9vdE1vZGUvY3VzdG9tRWxlbWVudE1vZGUpICsgZGIgbWlncmF0aW9uXG4gICAgc2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlO1xuICAgIGF1dG9IZWlnaHQ/OiBib29sZWFuO1xuICAgIGhlaWdodD86IHN0cmluZztcbiAgICB3aWR0aD86IHN0cmluZztcbn1cblxuLy9mb3IgaW50ZXJuYWwgZGFzaGJvYXJkIHVzYWdlXG5leHBvcnQgaW50ZXJmYWNlIElNaW5pbWl6ZWRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJNaW5pbWl6ZWRMb2FkZXJcIjtcbn1cblxuaW50ZXJmYWNlIERhc2hib2FyZE9iamVjdCB7XG4gICAgX3RlbXBfY2xpZW50X2lkPzogc3RyaW5nLFxufVxuXG50eXBlIEV4dGVuZDxULCBVPiA9IFQgJiBVO1xuXG50eXBlIEV4dGVuZFJlY3Vyc2l2ZWx5PFQsIEU+ID0ge1xuICAgIFtLIGluIGtleW9mIEVdOiBFW0tdO1xufSAmIHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIG9iamVjdFxuICAgICAgICA/IEV4dGVuZFJlY3Vyc2l2ZWx5PFRbS10sIEU+XG4gICAgICAgIDogVFtLXTtcbn07XG5cbmV4cG9ydCB0eXBlIElEYXNoYm9hcmQ8VD4gPSBFeHRlbmRSZWN1cnNpdmVseTxULCBEYXNoYm9hcmRPYmplY3Q+O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBTa2luTG9hZGVyVHlwZVxuXG4gICAgW2tleTogc3RyaW5nXTogYW55OyAvLyBBbGxvd3MgYW55IGFkZGl0aW9uYWwgcHJvcGVydGllc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lSZWxlYXNlTWV0YWRhdGEge1xuICAgIGVudmlyb25tZW50SWQ6IHN0cmluZztcbiAgICBlbnZpcm9ubWVudElkZW50aWZpZXI6IHN0cmluZztcbiAgICAvL1xuICAgIC8vIHVwZGF0ZWRPbj86IHN0cmluZ1xuICAgIC8vIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lWYXJpYW50Q29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgcmVsZWFzZXM/OiB2Ml9JUmVsZWFzZU1ldGFkYXRhW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBsb2FkZXI6IElTa2luTG9hZGVyQ29uZmlnXG4gICAgY3JlYXRlZEJ5Pzogc3RyaW5nXG4gICAgY3JlYXRlZE9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVNraW5Db25maWcgZXh0ZW5kcyBJU2tpbkNvbmZpZyB7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCaW5kTWVzc2FnZVByb3BDb25maWcgZXh0ZW5kcyBJUHJvcENvbmZpZyB7XG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbn1cblxuZXhwb3J0IGNvbnN0IFByb3BNZXNzYWdlTW9kZXMgPSB7XG4gICAgXCJpbnB1dFwiOiBcImlucHV0XCIsXG4gICAgXCJvdXRwdXRcIjogXCJvdXRwdXRcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFByb3BDb25maWdCZWhhdmlvclR5cGVzID0ge1xuICAgIFwibWVzc2FnZVwiOiBcIm1lc3NhZ2VcIixcbiAgICBcImNvZGVcIjogXCJjb2RlXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbSB7XG4gICAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29kZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJjb2RlXCJcbiAgICByZW1hcD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wTWVzc2FnZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJtZXNzYWdlXCJcbiAgICBtZXNzYWdlOiBNeW9wTWVzc2FnZUtleVxuICAgIHJlZjogc3RyaW5nLCAvL1RPRE8gbWFrZSBpdCBpZFxuICAgIHBhcmFtczogSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbVtdXG4gICAgbW9kZToga2V5b2YgdHlwZW9mIFByb3BNZXNzYWdlTW9kZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcENvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIGJlaGF2aW9yOiBJUHJvcEJlaGF2aW9yXG59XG5cblxuZXhwb3J0IGNsYXNzIFJlZkJlaGF2aW9yVHlwZSB7XG4gICAgc3RhdGljIGNvZGUgPSAnY29kZScgYXMgY29uc3RcbiAgICBzdGF0aWMgY29tcG9uZW50ID0gJ2NvbXBvbmVudCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgSVJlZkJlaGF2aW9yVHlwZSA9ICdjb2RlJyB8ICdjb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogSVJlZkJlaGF2aW9yVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvbXBvbmVudCdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIFByb3BlcnR5IGluc3RhbmNlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICovXG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb2RlUmVmQmVoYXZpb3IgZXh0ZW5kcyBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6ICdjb2RlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgc2VsZWN0b3JUeXBlOiBSZWZTZWxlY3RvclR5cGVcbiAgICBzZWxlY3Rvcjogc3RyaW5nXG4gICAgYmVoYXZpb3I6IElSZWZCZWhhdmlvclxufVxuXG4vKipcbiAqIEV4cGVyaWVuY2Ugc2VnbWVudCBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VTZWdtZW50UnVsZSB7XG4gICAgcHJvcGVydHk6IHN0cmluZztcbiAgICBvcGVyYXRvcjogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBBL0Igc3BsaXQgdmVyc2lvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlQUJTcGxpdFZlcnNpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgcGVyY2VudGFnZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4cGVyaWVuY2UgQS9CIHNwbGl0IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZUFCU3BsaXQge1xuICAgIHZlcnNpb25zOiBJRXhwZXJpZW5jZUFCU3BsaXRWZXJzaW9uW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBzZWdtZW50IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZVNlZ21lbnQge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcnVsZXM6IElFeHBlcmllbmNlU2VnbWVudFJ1bGVbXTtcbiAgICB1c2VBYjogYm9vbGVhbjtcbiAgICBjb21wb25lbnRWYXJpYW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gICAgYWJTcGxpdD86IElFeHBlcmllbmNlQUJTcGxpdDtcbiAgICBzdGlja3lQcm9wZXJ0aWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBkZWZpbml0aW9uIGNvbmZpZyAodjIpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VEZWZpbml0aW9uQ29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIC8qKiBTZWxlY3RlZCBjb21wb25lbnQgSURzICovXG4gICAgY29tcG9uZW50czogc3RyaW5nW107XG4gICAgLyoqIFNlZ21lbnQgY29uZmlndXJhdGlvbnMgKi9cbiAgICBzZWdtZW50czogSUV4cGVyaWVuY2VTZWdtZW50W107XG4gICAgLyoqIEZhbGxiYWNrIHZhcmlhbnQgcGVyIGNvbXBvbmVudCAqL1xuICAgIGZhbGxiYWNrOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIC8qKiBUYWdzICovXG4gICAgdGFnczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgLy8gcHJvcHM6IFJlY29yZDxzdHJpbmcsIElQcm9wQ29uZmlnPiAvL2lkIC0gdHlwZVxuICAgIC8vIHJlZnM6IFJlY29yZDxzdHJpbmcsIElSZWZDb25maWc+LFxuICAgIC8vIHNraW5zOiBSZWNvcmQ8c3RyaW5nLCBJU2tpbkNvbmZpZz5cbiAgICBwcm9wczogSVByb3BDb25maWdbXSxcbiAgICByZWZzOiBJUmVmQ29uZmlnW10sXG4gICAgc2tpbnM6IElTa2luQ29uZmlnW10sXG4gICAgZGVmYXVsdFNraW46IG51bWJlcjtcblxuICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IHRoYXRcbiAgICAvL3Jlc29sdmVkRGVmaW5pdGlvbnM/OiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1tdXG4gICAgLy9UT0RPIDogbW92ZSB0byBiYXNlIGNsYXNzICggSVN0b3JhYmxlSXRlbSBvciBzby4uLilcblxuICAgIGNyZWF0ZWRPbj86IHN0cmluZ1xuICAgIGNyZWF0ZWRCeT86IHN0cmluZ1xuICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lNeW9wU3RvcmVkT2JqZWN0IGV4dGVuZHMgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICB1cGRhdGVkT24/OiBzdHJpbmdcbiAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICB2YXJpYW50c19pZHM6IHN0cmluZ1tdLFxuICAgIERUT3M6IHYyX0lEVE9bXSxcbiAgICB0YWdzOiBzdHJpbmdbXSxcblxuICAgIC8vXG4gICAgdmFyaWFudHNfbmFtZXM6IHN0cmluZ1tdLFxuICAgIHZhcmlhbnRzX2RhdGE6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBpZDogc3RyaW5nXG4gICAgICAgIHVwZGF0ZWRPbj86IHN0cmluZ1xuICAgICAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbiAgICAgICAgaGFzX3JlbGVhc2VzPzogYm9vbGVhblxuICAgIH1bXSxcblxuICAgIHByZXZpZXdfdmFyaWFudDogdjJfSVZhcmlhbnRDb25maWc7XG4gICAgZXh0cmE/OiB7XG4gICAgICAgIGZpcnN0VmFyaWFudDogdjJfSVZhcmlhbnRDb25maWc7IC8vd2hlbiBuZXcgY29tcG9uZW50IGNyZWF0ZXMgYXQgdGhlIGNsaWVudFxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JRFRPIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIGRhdGE6IG9iamVjdFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luSW5zdGFuY2VDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMsXG4gICAgLy9za2luczogSVNraW5JbnN0YW5jZUNvbmZpZ1tdXG59XG5cbmV4cG9ydCBjb25zdCBTZWdtZW50VHlwZSA9IHtcbiAgICBcIkZ1bmN0aW9uUmVzdWx0XCI6IFwiRnVuY3Rpb25SZXN1bHRcIixcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRJbnN0YW5jZSB7XG4gICAgc2VnbWVudElkOiBzdHJpbmc7XG4gICAgc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnREZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBTZWdtZW50VHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElGdW5jdGlvblJlc3VsdHNTZWdtZW50IGV4dGVuZHMgSVNlZ21lbnREZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IHR5cGVvZiBTZWdtZW50VHlwZS5GdW5jdGlvblJlc3VsdFxuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBmdW5jdGlvbjogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBTa2luU2VsZWN0b3JUeXBlcyA9IHtcbiAgICBcIlNlZ21lbnRlZFwiOiBcIlNlZ21lbnRlZFwiLFxuICAgIFwiRGVkaWNhdGVkXCI6IFwiRGVkaWNhdGVkXCIsXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIFNlbGVjdG9yIFR5cGUgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnV0IHdpbGwgYmUgYWRkZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAgICAgKiBQbGVhc2UgY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHVwZGF0ZXMuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIFwiRGVmYXVsdFwiOiBcIkRlZmF1bHRcIlxufSBhcyBjb25zdDtcblxuXG4vKipcbiAqIFRoaXMgU2tpbiBDb25maWcgVHlwZSBpcyBub3QgeWV0IHN1cHBvcnRlZCBidXQgd2lsbCBiZSBhZGRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICogUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB1cGRhdGVzLlxuICpcbiAqIEB0eXBlIHtJRGVmYXVsdFNraW5Db25maWd9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURlZmF1bHRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLkRlZmF1bHQsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRlZFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuU2VnbWVudGVkLFxuICAgIHNlZ21lbnRzOiBJU2VnbWVudEluc3RhbmNlW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGVkaWNhdGVkU2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNraW59IGluc3RlYWQuXG4gICAgICogUHJvcGVydHkgc2tpbnMgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5cbiAgICAgKiBQbGVhc2UgdXBkYXRlIHlvdXIgY29kZSB0byB1c2Uge0BsaW5rIHNraW59IGZvciBiZXR0ZXIgY29tcGF0aWJpbGl0eS5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgc2tpbnM/OiBJU2tpbkluc3RhbmNlQ29uZmlnW10gLy8gZGVwcmVjYXRlZFxuICAgIHNraW46IElTa2luSW5zdGFuY2VDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZztcblxuICAgIC8vVE9ETyA6XG4gICAgLy8gUmVmSUQgPyB0byBzdXBwb3J0IG1vcmUgdGhhbiAxIGNvbXBvbmVudCBmcm9tIHRoZSBzYW1lIHR5cGUgaW4gY29tcG9zaXRlcyA/XG5cbiAgICAvL1RPRE8gOiByZW1vdmVcbiAgICBjb21wb25lbnROYW1lOiBzdHJpbmc7IC8vIDw8IGNoZWNrXG5cbiAgICBza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWdcblxuICAgIC8vIHN0b3JpbmcgdGhlIG5lc3RlZCBjb25maWcgZm9yIHJlZiBjb21wb25lbnRzXG4gICAgbmVzdGVkQ29tcG9uZW50cz86IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1tdXG5cbiAgICAvL29ubHkgb24gR0VUP1xuICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IHRoYXRcbiAgICByZXNvbHZlZEV4cGVyaWVuY2VzPzogSUV4cGVyaWVuY2VbXVxuICAgIC8vIHdpbGwgaW5jbHVkZSBpbnN0YW5jZSBhbmQgZGVmIGNvbmZpZyBpbiBvcmRlciB0byByZW5kZXIgaW4gcHJvZHVjdGlvblxuICAgIHJlc29sdmVkTmVzdGVkQ29tcG9uZW50cz86IElDb21wb25lbnRDb25maWdbXVxufVxuXG5leHBvcnQgY29uc3QgRXhwZXJpZW5jZVR5cGVzID0ge1xuICAgIFwiU2VnbWVudFwiOiBcIlNlZ21lbnRcIixcbiAgICBcIlByb21vXCI6IFwiUHJvbW9cIixcbiAgICBcIkFCXCI6IFwiQUJcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZSB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICAvL3N0aWNraW5lc3NGYWN0b3JcbiAgICAvL0VuZERhdGVcbn1cblxuLy8gZXhwb3J0IGludGVyZmFjZSBJQUJFeHBlcmllbmNlR3JvdXAge1xuLy8gICAgIGlkOiBzdHJpbmdcbi8vICAgICBuYW1lOiBzdHJpbmdcbi8vICAgICBwZXJjZW50YWdlOiBudW1iZXJcbi8vIH1cblxuZXhwb3J0IGludGVyZmFjZSBJQUJFeHBlcmllbmNlIGV4dGVuZHMgSUV4cGVyaWVuY2Uge1xuICAgIHR5cGU6IHR5cGVvZiBFeHBlcmllbmNlVHlwZXMuQUJcbiAgICAvLyBncm91cHM6IElBQkV4cGVyaWVuY2VHcm91cFtdXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICBwZXJjZW50YWdlOiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGF0ZVJhbmdlIHtcbiAgICBpZDogc3RyaW5nXG4gICAgc3RhcnQ6IERhdGVcbiAgICBlbmQ6IERhdGVcbiAgICB0aW1lem9uZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRFeHBlcmllbmNlIGV4dGVuZHMgSUV4cGVyaWVuY2Uge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBFeHBlcmllbmNlVHlwZXNcbiAgICBzZWdtZW50OiBJU2VnbWVudERlZmluaXRpb25cbiAgICBkYXRlUmFuZ2U/OiBJRGF0ZVJhbmdlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJGbG93RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBjb21wb25lbnRzOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdbXTtcbiAgICBvcmlnaW5zOiBzdHJpbmdbXSxcbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIGJyYW5jaD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRDb25maWcge1xuICAgIGluc3RhbmNlOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdcbiAgICB0eXBlOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgLy8gVE9ETyA6IHZlcmlmeSB1bmlxdWVuZXNzIChkYXNoYm9hcmQgJiBzZXJ2ZXIpXG4gICAgbmFtZTogc3RyaW5nXG59XG5cbmludGVyZmFjZSBJQnJhbmNoYWJsZSB7XG4gICAgYnJhbmNoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJGbG93IGV4dGVuZHMgT21pdDxJVXNlckZsb3dEZWZpbml0aW9uLCAnY29tcG9uZW50cyc+LCBJQnJhbmNoYWJsZSB7XG4gICAgY29tcG9uZW50czogSUNvbXBvbmVudENvbmZpZ1tdXG59XG5cbmV4cG9ydCBjbGFzcyBSb290UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHVibGljIHNoYWRvd1Jvb3Q/OiBTaGFkb3dSb290KSB7XG5cbiAgICB9XG5cbiAgICBnZXRSb290RGl2ID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2hhZG93Um9vdCB8fCB0aGlzLmNvbnRhaW5lcikucXVlcnlTZWxlY3RvcignZGl2JylcbiAgICB9XG5cbiAgICBnZXRSb290ID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2hhZG93Um9vdCB8fCB0aGlzLmNvbnRhaW5lcik7XG4gICAgfVxufVxuIiwgImV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZTxUPiA9XG4gICAgVCBleHRlbmRzIEZ1bmN0aW9uID8gbmV2ZXIgOiAvLyBFeGNsdWRlIGZ1bmN0aW9uc1xuICAgICAgICBUIGV4dGVuZHMgQXJyYXk8aW5mZXIgVT4gPyBTZXJpYWxpemFibGU8VT5bXSA6IC8vIEhhbmRsZSBhcnJheXNcbiAgICAgICAgICAgIFQgZXh0ZW5kcyBvYmplY3QgPyB7XG4gICAgICAgICAgICAgICAgW0sgaW4ga2V5b2YgVCBhcyBUW0tdIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IEtdOiBTZXJpYWxpemFibGU8VFtLXT5cbiAgICAgICAgICAgIH0gOiBUOyAvLyBIYW5kbGUgb2JqZWN0c1xuXG5jb25zdCBpc1ByaW1pdGl2ZSA9ICh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gT2JqZWN0KHZhbHVlKTtcbn1cblxuY29uc3QgaXNGdW5jdGlvbiA9ICh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCBjb25zdCBjb250YWluc1ByaW1pdGl2ZXNPbmx5ID0gKG9iaikgPT4ge1xuICAgIGlmIChpc1ByaW1pdGl2ZShvYmopKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgY2hlY2sgaWYgaXQncyBhIG5lc3RlZCBvYmplY3RcbiAgICAgICAgICAgIGlmICghY29udGFpbnNQcmltaXRpdmVzT25seSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgICAgICAgICBjb250aW51ZTsgLy8gSXQncyBhIHByaW1pdGl2ZSwgc28gd2UgY2FuIHNraXAgaXRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gRm91bmQgYSBub24tcHJpbWl0aXZlIHZhbHVlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTsgLy8gQWxsIHZhbHVlcyBhcmUgcHJpbWl0aXZlcyBvciBuZXN0ZWQgb2JqZWN0cyB3aXRoIHByaW1pdGl2ZXNcbn1cblxuLy8gY3VycmVudGx5IHN1cHBvcnQgcm9vdCBsZXZlbCBvbmx5XG4vLyB7eDogMSwgeSA6ICdhJywgeiA6ICgpPT57Li4ufSwgaW5uZXIgOiB7IHg6IDEgLCB5IDogJ2EnfSB9XG4vLyB7eDogMSwgeSA6ICdhJ31cbi8vaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9HbG9zc2FyeS9GYWxzeVxuZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlU2tlbGV0b248VD4gPSBQYXJ0aWFsPFJlY29yZDxrZXlvZiBULCBib29sZWFuIHwgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4+PiB8IGJvb2xlYW47XG5cbmV4cG9ydCBjb25zdCBtYWtlU2VyaWFsaXphYmxlID0gPFQ+KFxuICAgIG9iajogVCxcbiAgICBza2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248VD4gPSB7fSxcbiAgICBpbmNsdWRlRmFsc3lLZXlzOiBib29sZWFuID0gdHJ1ZSwgLy8gVE9ETyA6IHVzZSB0aGF0IGFyZ1xuICAgIHNlZW46IFdlYWtNYXA8b2JqZWN0LCBTZXJpYWxpemFibGU8YW55Pj4gPSBuZXcgV2Vha01hcCgpXG4pOiBTZXJpYWxpemFibGU8VD4gPT4ge1xuXG4gICAgaWYgKGlzUHJpbWl0aXZlKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG9iaiBhcyBTZXJpYWxpemFibGU8VD47IC8vIERpcmVjdGx5IHJldHVybiBwcmltaXRpdmUgdmFsdWVzXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICBpZiAoc2Vlbi5oYXMob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlZW4uZ2V0KG9iaikhOyAvLyBSZXR1cm4gdGhlIGFscmVhZHkgcHJvY2Vzc2VkIG9iamVjdFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGFycmF5IHNlcmlhbGl6YXRpb25cbiAgICAgICAgY29uc3Qgc2VyaWFsaXphYmxlQXJyYXk6IFNlcmlhbGl6YWJsZTxhbnk+W10gPSBbXTtcbiAgICAgICAgc2Vlbi5zZXQob2JqLCBzZXJpYWxpemFibGVBcnJheSk7IC8vIFN0b3JlIHRoZSBhcnJheSBpbiBzZWVuXG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG9iai5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBvYmpbaW5kZXhdO1xuICAgICAgICAgICAgc2VyaWFsaXphYmxlQXJyYXlbaW5kZXhdID0gbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LCBza2VsZXRvbiwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YWJsZUFycmF5IGFzIFNlcmlhbGl6YWJsZTxUPjtcbiAgICB9XG5cbiAgICBpZiAob2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIENoZWNrIGZvciBjeWNsaWMgcmVmZXJlbmNlc1xuICAgICAgICBpZiAoc2Vlbi5oYXMob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlZW4uZ2V0KG9iaikhOyAvLyBSZXR1cm4gdGhlIGFscmVhZHkgcHJvY2Vzc2VkIG9iamVjdFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YWJsZU9iamVjdDogUGFydGlhbDxTZXJpYWxpemFibGU8VD4+ID0ge307XG4gICAgICAgIHNlZW4uc2V0KG9iaiwgc2VyaWFsaXphYmxlT2JqZWN0KTsgLy8gU3RvcmUgdGhlIG9iamVjdCBpbiBzZWVuXG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUga2V5IGlzIGluIHRoZSBza2VsZXRvbiBhbmQgaWYgaXQncyBhIHZhbGlkIGtleSB0byBzZXJpYWxpemVcblxuICAgICAgICAgICAgY29uc3Qga2V5SW5Ta2VsZXRvbiA9IHR5cGVvZiBza2VsZXRvbiA9PSBcImJvb2xlYW5cIiA/IHNrZWxldG9uIDogc2tlbGV0b25ba2V5XTtcblxuICAgICAgICAgICAgaWYgKGtleUluU2tlbGV0b24pIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5SW5Ta2VsZXRvbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2tlbGV0b24gaW5kaWNhdGVzIHRvIHNlcmlhbGl6ZSB0aGlzIGtleVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZUZhbHN5S2V5cyA/IG9ialtrZXldICE9PSB1bmRlZmluZWQgOiBvYmpba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphYmxlT2JqZWN0W2tleV0gPSBtYWtlU2VyaWFsaXphYmxlKG9ialtrZXldLCB0cnVlLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGtleUluU2tlbGV0b24gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBza2VsZXRvbiBpbmRpY2F0ZXMgbmVzdGVkIGtleXMgdG8gc2VyaWFsaXplXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphYmxlT2JqZWN0W2tleV0gPSBtYWtlU2VyaWFsaXphYmxlKG9ialtrZXldLCBrZXlJblNrZWxldG9uLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YWJsZU9iamVjdCBhcyBTZXJpYWxpemFibGU8VD47XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9IGFzIGFueTsgLy8gUmV0dXJuIGFuIGVtcHR5IG9iamVjdCBmb3Igb3RoZXIgY2FzZXNcbn1cbiIsICJleHBvcnQgY29uc3QgRXJyb3JzID0ge1xuICAgIG5vdFNlcmlhbGl6YWJsZVJlZkNhbGw6IChwcm9wLCBhcmcpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcblRoZSBpbnB1dCBwcm92aWRlZCB0byAnJHtwcm9wLnRvU3RyaW5nKCl9JyBpcyBub3Qgc2VyaWFsaXphYmxlLiBTZXJpYWxpemF0aW9uIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGF0IHRoZSBkYXRhIGNhbiBiZSBzYWZlbHkgdHJhbnNmZXJyZWQgdG8gdGhlIHNraW4gaW1wbGVtZW50YXRpb24uIFxuVGhlIGZvbGxvd2luZyB0eXBlcyBvZiBkYXRhIGFyZSBjb25zaWRlcmVkIG5vbi1zZXJpYWxpemFibGUgYW5kIGNhbm5vdCBiZSBwcm9jZXNzZWQ6XG5cbi0gRnVuY3Rpb25zXG4tIERPTSBlbGVtZW50c1xuLSBDbGFzcyBpbnN0YW5jZXNcbi0gQ2lyY3VsYXIgcmVmZXJlbmNlc1xuLSBTeW1ib2xzXG4tIEJpZ0ludCB2YWx1ZXNcblxuSW4gdGhlIGZvbGxvd2luZyBleGVjdXRpb24gd2UgZGV0ZWN0ZWQgOlxufn5+fn5+fn5cbiR7YXJnfSBcbn5+fn5+fn5+XG5hcyBub3Qgc2VyaWFsaXphYmxlLlxuXG5UbyByZXNvbHZlIHRoaXMgaXNzdWUsIHBsZWFzZSBlbnN1cmUgdGhhdCBhbGwgaW5wdXRzIHBhc3NlZCB0byAnJHtwcm9wLnRvU3RyaW5nKCl9JyBhcmUgaW4gYSBzZXJpYWxpemFibGUgZm9ybWF0LlxuVGhpcyB0eXBpY2FsbHkgaW5jbHVkZXMgcHJpbWl0aXZlIHR5cGVzIChzdHJpbmdzLCBudW1iZXJzLCBib29sZWFucyksIGFycmF5cywgYW5kIHBsYWluIG9iamVjdHMuIFxuSWYgeW91IG5lZWQgdG8gaW5jbHVkZSBjb21wbGV4IGRhdGEgdHlwZXMsIGNvbnNpZGVyIGNvbnZlcnRpbmcgdGhlbSB0byBhIHNlcmlhbGl6YWJsZSBzdHJ1Y3R1cmUgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byB0aGUgZnVuY3Rpb24uXG5PciB1c2UgTXlvcCBtZXNzYWdlIHRoYXQgc3VwcG9ydCBpdDogQ3VzdG9tUmVmTWVzc2FnZSwgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2Ugb3IgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UuXG5cblN1Z2dlc3RlZCBGaXg6XG4xLiBSZW1vdmUgb3IgcmVwbGFjZSBub24tc2VyaWFsaXphYmxlIHZhbHVlcyBmcm9tIHlvdXIgaW5wdXQuXG4yLiBJZiB1c2luZyBvYmplY3RzLCBlbnN1cmUgdGhleSBkbyBub3QgY29udGFpbiBhbnkgZnVuY3Rpb25zIG9yIGNpcmN1bGFyIHJlZmVyZW5jZXMuXG4zLiBDb252ZXJ0IGFueSBjbGFzcyBpbnN0YW5jZXMgdG8gcGxhaW4gb2JqZWN0cyBvciBKU09OLWNvbXBhdGlibGUgZm9ybWF0cy5cbjQuIFVzZSBkZWRpY2F0ZWQgTXlvcCBtZXNzYWdlLlxuXG5Gb3IgbW9yZSBkZXRhaWxzIG9uIHNlcmlhbGl6YXRpb24gYW5kIE15b3AgbWVzc2FnZSBleGFtcGxlcywgcmVmZXIgdG8gaHR0cHM6Ly9kb2NzLm15b3AuZGV2XFwuXG5cbmApO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BDb21wb25lbnQsIElNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIEV4ZWN1dGVDb21wb25lbnRNZXRob2R9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFbnZlbG9wZWRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZVwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG5leHBvcnQgY2xhc3MgTXlvcFJlZkNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgcHVibGljIHBhcmVudDogSU15b3BDb21wb25lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIC8vVE9ETyA6IGNoZWNrIHBhcmVudENvbXBvbmVudC5jb250YWluZXIuLi5cbiAgICAgICAgc3VwZXIoY29tcG9uZW50RGVmaW5pdGlvbiwgcGFyZW50LmNvbnRhaW5lciwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgLy90aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoYXJndW1lbnRzLmNhbGxlZS5uYW1lKSk7XG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnaGlkZScpKTtcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ3Nob3cnKSk7XG4gICAgfVxuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgLy9UT0RPIDogc3VwcG9ydCByZWFsIGNsZWFudXBcbiAgICAgICAgLy9jb25zb2xlLmxvZygncmVmIGluc3BlY3QgY2FsbGVkLCBjcmVhdGluZyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kIGluc3BlY3QnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCB0aGlzLmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnaW5zcGVjdCcpKTtcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50KCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCcpKTtcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCcpKTtcbiAgICB9XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgLy8gaWYgKGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScpIHtcbiAgICAgICAgLy8gIGRlYnVnZ2VyO1xuICAgICAgICAvLyAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gfVxuICAgICAgICByZXR1cm4gc3VwZXIub25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZSk7XG4gICAgfVxuXG5cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdyZWYgbWVzc2FnZSBzZW5kaW5nICcsIG1lc3NhZ2UpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBtZXNzYWdlLmhhbmRsZXJcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIC8vIHRoaXMuaWQgd2lsbCBiZSBhdmFpbGFibGUgb24gdGhlIG5lc3RlZCBjb21wb25lbnRcbiAgICAgICAgdGhpcy5wYXJlbnQuc2VuZChuZXcgRW52ZWxvcGVkTWVzc2FnZSh0aGlzLmlkLCBtZXNzYWdlKSk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBtZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9O1xuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNJbml0aWF0ZWQpXG4gICAgICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ2Rpc3Bvc2UnKSk7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICB9XG59XG4iLCAiLy90eXBlIEFDb25zdHJ1Y3RvclR5cGVPZjxUPiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIEN1c3RvbVJlZk1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQgKiBhcyBtZXNzYWdlcyBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQ2xlYW51cEhhbmRsZXIsIElDb21wb25lbnRDb25maWcsXG4gICAgdHlwZSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJQ29tcG9uZW50UmVmQmVoYXZpb3IsIElIVE1MTG9hZGVyQ29uZmlnLCBJUHJvcENvZGVCZWhhdmlvcixcbiAgICBJUHJvcENvbmZpZywgSVNraW5Db25maWcsIFByb3BDb25maWdCZWhhdmlvclR5cGVzLFxuICAgIFJlZkJlaGF2aW9yVHlwZSwgU2hhZG93Um9vdE1vZGVUeXBlLCBTa2luTG9hZGVycywgU2tpbkxvYWRlclR5cGVcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtjb250YWluc1ByaW1pdGl2ZXNPbmx5fSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb25cIjtcbmltcG9ydCB7RXJyb3JzfSBmcm9tIFwiLi9sb2dNZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wUmVmQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL215b3BSZWZDb21wb25lbnRcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4vaG9zdFNES1wiO1xuXG50eXBlIGNvbXBvbmVudERlZmluaXRpb25Qcm9wcyA9IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnWydwcm9wcyddXG5cbmNvbnN0IGNyZWF0ZURlYnVnVGl0bGUgPSAodGV4dDogc3RyaW5nLCB0b3A6IG51bWJlciwgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICBjb25zdCB0aXRsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIHRpdGxlRWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIHRpdGxlRWwuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgIHRpdGxlRWwuc3R5bGUucGFkZGluZyA9ICcwIDVweCc7XG4gICAgdGl0bGVFbC5zdHlsZS5mb250U2l6ZSA9ICcxNHB4JztcbiAgICB0aXRsZUVsLnN0eWxlWyd0b3AnXSA9ICcwJztcbiAgICB0aXRsZUVsLnN0eWxlLnRvcCA9IGAke3RvcH1weGA7XG4gICAgLy90aXRsZUVsLnN0eWxlLmxlZnQgPSAnNTAlJztcbiAgICB0aXRsZUVsLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKC01MCUpJztcbiAgICB0aXRsZUVsLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgIHRpdGxlRWwuaHJlZiA9IGBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5pZH1gXG5cbiAgICByZXR1cm4gdGl0bGVFbDtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXREZWJ1Z1N0eWxlID0gKGlkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRFbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25Db25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG4pOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgLy8jMDA3QkZGIChibHVlKSBvciAjRkY1NzIyIChvcmFuZ2UpXG4gICAgLy8jNENBRjUwIChncmVlbikgb3IgI0ZGQzEwNyAoYW1iZXIpXG4gICAgLy8gY29uc3QgdG9wVGV4dCA9IGNyZWF0ZURlYnVnVGl0bGUoYCR7aWR9IDogJHt0eXBlfWAsIHRvcCwgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyk7XG4gICAgY29uc3QgdG9wVGV4dCA9IGNyZWF0ZURlYnVnVGl0bGUoYCR7Y29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5uYW1lfSA6ICR7dHlwZX1gLCB0b3AsIGNvbXBvbmVudERlZmluaXRpb25Db25maWcpO1xuICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUodG9wVGV4dCwgY29tcG9uZW50RWxlbWVudCk7XG4gICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICMwMDdCRkYnO1xuICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmJvcmRlciA9ICd1bnNldCc7XG4gICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZCh0b3BUZXh0KTtcbiAgICB9XG59XG5cbmNvbnN0IHJlcG9ydEVycm9yID0gKHByb3BDb25maWc6IElQcm9wQ29uZmlnLCBwcm9wTmFtZTogc3RyaW5nLCBjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50PGFueSwgYW55PikgPT4ge1xuICAgIGlmICghcHJvcENvbmZpZykge1xuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAvLyB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXJyb3I6IFVuZGVmaW5lZCBQcm9wXFxuXFxuYCArXG4gICAgICAgICAgICBgSXQgbG9va3MgbGlrZSB5b3UndmUgdHJpZWQgdG8gdXNlIGEgcHJvcCB0aGF0IGhhc24ndCBiZWVuIGRlZmluZWQuXFxuYCArXG4gICAgICAgICAgICBgUGxlYXNlIGNoZWNrIHRoZSBwcm9wIG5hbWUgZm9yIGFueSB0eXBvcyBvciBlbnN1cmUgdGhhdCBpdCBpcyBwcm9wZXJseSBkZWZpbmVkIGluIHRoZSBjb21wb25lbnQncyBwcm9wIGxpc3QuXFxuXFxuYCArXG4gICAgICAgICAgICBgUHJvcCBOYW1lOiAke3Byb3BOYW1lfVxcbmAgK1xuICAgICAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBjb21wb25lbnQgcGFnZSBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9IG9yIGNvbnN1bHQgdGhlIGRldmVsb3BlciBndWlkZS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5jb25zdCByZXBvcnRVbnN1cHBvcnRlZCA9IChwcm9wQ29uZmlnOiBJUHJvcENvbmZpZywgcHJvcE5hbWU6IHN0cmluZywgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudDxhbnksIGFueT4pID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgRXJyb3I6IENvZGUgUHJvcCBOb3QgU3VwcG9ydGVkXFxuXFxuYCArXG4gICAgICAgIGBDdXJyZW50bHksIGNvZGUgcHJvcHMgYXJlIG9ubHkgc3VwcG9ydGVkIGluIGxvY2FsIGZyYW1lIGNvbXBvbmVudHMuXFxuYCArXG4gICAgICAgIGBcdTI2QTBcdUZFMEYgVGhpcyBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MgZmVhdHVyZSBcdTIwMTQgY29kZSBwcm9wcyB3aWxsIGJlIHN1cHBvcnRlZCBpbiB1cGNvbWluZyB2ZXJzaW9ucy5cXG5cXG5gICtcbiAgICAgICAgYEluIHRoZSBtZWFudGltZSwgeW91IGNhbiB1c2UgbWVzc2FnZSBwcm9wcy5cXG5cXG5gICtcbiAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wTmFtZX1cXG5gICtcbiAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgIGBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIGNvbXBvbmVudCBwYWdlIGh0dHBzOi8vZGFzaGJvYXJkLm15b3AuZGV2L2Rhc2hib2FyZC9jb21wb25lbnQvJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH0gb3IgY29uc3VsdCB0aGUgZGV2ZWxvcGVyIGd1aWRlLmBcbiAgICApO1xufVxuXG5leHBvcnQgY29uc3QgY29ubmVjdFByb3BzID0gPFQgZXh0ZW5kcyBjb21wb25lbnREZWZpbml0aW9uUHJvcHM+KGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIHByb3BzQ29uZmlnOiBJUHJvcENvbmZpZ1tdLCBzZWxlY3RlZFNraW46IElTa2luQ29uZmlnKSA9PiB7XG5cbiAgICBjb25zdCBwcm9wc01hcCA9IHByb3BzQ29uZmlnLnJlZHVjZSgocHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5wcmV2aW91c1ZhbHVlLFxuICAgICAgICAgICAgW2N1cnJlbnRWYWx1ZS5uYW1lXTogey4uLmN1cnJlbnRWYWx1ZX1cbiAgICAgICAgfVxuICAgIH0sIHt9KTtcblxuICAgIGNvbnN0IHByb3BzSGFuZGxlciA9IHtcbiAgICAgICAgZ2V0OiAoXzogSU15b3BDb21wb25lbnQsIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgcHJvcENvbmZpZyA9IHByb3BzTWFwW3Byb3BdO1xuXG4gICAgICAgICAgICBpZiAocmVwb3J0RXJyb3IocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSA9PT0gU2tpbkxvYWRlcnMuSFRNTExvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZExvYWRlciA9IHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBsb2NhbCBmcmFtZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTG9hZGVyLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5lbGVtZW50LmNvbnRlbnRXaW5kb3dbdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcG9ydFVuc3VwcG9ydGVkKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5tb2RlID09PSAnb3V0cHV0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlUGFyYW1zOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IGludG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKFJlZi5jcmVhdGUocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCguLi5wcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDdG9yID0gbWVzc2FnZXNbcHJvcENvbmZpZy5iZWhhdmlvci5tZXNzYWdlXTtcblxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgbWVzc2FnZUN0b3IoLi4ubWVzc2FnZVBhcmFtcykpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuICAgICAgICBzZXQ6IChfOiBJTXlvcENvbXBvbmVudCwgcHJvcDogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBwcm9wQ29uZmlnID0gcHJvcHNNYXBbcHJvcF07XG5cbiAgICAgICAgICAgIGlmIChyZXBvcnRFcnJvcihwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSA9PT0gU2tpbkxvYWRlcnMuSFRNTExvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZExvYWRlciA9IHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBsb2NhbCBmcmFtZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTG9hZGVyLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuY29udGVudFdpbmRvd1t0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wXSA9IHZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVwb3J0VW5zdXBwb3J0ZWQocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vaWYocHJvcENvbmZpZy5iZWhhdmlvciA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMubWVzc2FnZSlcbiAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5tb2RlID09PSAnaW5wdXQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgbXVsdGkgYmVoYXZpb3JzXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gJ21lc3NhZ2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlUGFyYW1zOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCBpbnRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKFJlZi5jcmVhdGUocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goLi4ucHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlQ3RvciA9IG1lc3NhZ2VzW3Byb3BDb25maWcuYmVoYXZpb3IubWVzc2FnZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgbWVzc2FnZUN0b3IoLi4ubWVzc2FnZVBhcmFtcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3I6IFVuc3VwcG9ydGVkIEJlaGF2aW9yXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoZSAnYmVoYXZpb3InIGZpZWxkIHByb3ZpZGVkIGlzIG5vdCBzdXBwb3J0ZWQuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBCZWhhdmlvciBGaWVsZDogJHtwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGV9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYENoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB2YWxpZCBiZWhhdmlvciBvcHRpb25zLmBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnQucHJvcHMgPSB7fTtcbiAgICBjb21wb25lbnQucHJvcHMgPSBuZXcgUHJveHkoY29tcG9uZW50LnByb3BzLCBwcm9wc0hhbmRsZXIpO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudCBhcyAoT21pdDxJTXlvcENvbXBvbmVudCwgJ3Byb3BzJz4gJiB7XG4gICAgICAgIHByb3BzOiBwcm9wVHlwZXM8VD5cbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmUHJveHkgPSAodGFyZ2V0OiBSZWYsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHRhcmdldCwge1xuICAgICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG5cbiAgICAgICAgICAgIC8vIGlmIChwcm9wID09PSAnX19ub25Qcm94aWVkJykge1xuICAgICAgICAgICAgLy8gICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh0YXJnZXRbcHJvcF0pIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgZ2V0dGVyRnVuY3Rpb24gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhcmdzLmZvckVhY2goYXJnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGFpbnNQcmltaXRpdmVzT25seShhcmcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLm5vdFNlcmlhbGl6YWJsZVJlZkNhbGwocHJvcCwgYXJnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBwcm9wTmFtZSwgZnVuY3Rpb25BcmdzLCBtYWtlU2VyaWFsaXphYmxlfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlZltwcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWtlU2VyaWFsaXphYmxlKHJlZltwcm9wTmFtZV0oLi4uZnVuY3Rpb25BcmdzKSwgdHJ1ZSkgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbmQgcmV0dXJuIGl0cyByZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWtlU2VyaWFsaXphYmxlKHZhbHVlLCB0cnVlKTsgLy8gUmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IHRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogdGFyZ2V0LnJlZkNvbmZpZy5zZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogcHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFyZ3M6IGFyZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShtc2cuY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vVE9ETzogd2UgY2FuIGltcGxlbWVudCB0aGluZ3MgbGlrZSBhdXRvIHNlcmlhbGl6YXRpb24gYW5kIGJpbmRpbmcgZnVuY3Rpb25zIGhlcmVcbiAgICAgICAgICAgIC8vZ2V0dGVyRnVuY3Rpb24udGVzdCA9ICcxMjMnO1xuXG4gICAgICAgICAgICByZXR1cm4gZ2V0dGVyRnVuY3Rpb247XG5cbiAgICAgICAgICAgIC8vcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCh0YXJnZXQsIHByb3A6IHN0cmluZywgdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBwcm9wTmFtZSwgcHJvcFZhbHVlfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVmKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogZml4IHRoYXRcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiB0YXJnZXQucmVmQ29uZmlnLnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBwcm9wVmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogcHJvcFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBsb2c/XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlZkNvbXBvbmVudCA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4ocmVmOiBSZWYsIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpOiBQcm9taXNlPFQ+ID0+IHtcbiAgICBjb25zdCBjb21wb25lbnQgPSByZWYuY29tcG9uZW50O1xuICAgIGlmICghY29tcG9uZW50KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbnQgY3JlYXRlUmVmQ29tcG9uZW50IHdpdGggZGV0YWNoZWQgcmVmJyk7XG5cbiAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkJywgcmVmLCBjb21wb25lbnRDb25maWcpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gbmV3IE15b3BSZWZDb21wb25lbnQoY29tcG9uZW50Q29uZmlnLnR5cGUsIGNvbXBvbmVudCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbXBvbmVudHMucHVzaChyZWZDb21wb25lbnQpO1xuXG4gICAgICAgIC8vZm9yIGNhc2VzIHdoZXJlIHJlZiBjb21wb25lbnRzIGRlZmluZSBpbiB0aGUgY29tcG9uZW50IGNvbmZpZ1xuICAgICAgICAvLyB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSByb290IGNvbXBvbmVudCB0aGUgYmUgaW5pdGlhdGVkIGJlZm9yZSBpbnRlcmFjdGluZyB3aXRoIGl0XG4gICAgICAgIGF3YWl0IGNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuXG4gICAgICAgIC8vVE9ETyA6XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vcmVqZWN0KCd0aW1lb3V0PycpO1xuICAgICAgICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgICAgIH0sIDUwMDApO1xuXG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlKHJlZi5yZWZDb25maWcsXG4gICAgICAgICAgICBjb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucyA/IG9wdGlvbnMgOiB7fSxcbiAgICAgICAgICAgICAgICBpZDogcmVmQ29tcG9uZW50LmlkLFxuICAgICAgICAgICAgICAgIF9oYXNQYXJlbnQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyAobWVzc2FnZSkgPT4ge1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgaWYgdGltZW91dCBhbHJlYWR5IHBhc3NlZFxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmZhaWxlZCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOlxuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgZmFpbGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCA9IGNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT0gcmVmQ29tcG9uZW50LmlkKTtcblxuICAgICAgICAgICAgICAgIC8vc2FtZSBtZW1vcnkgZW52LCBzYW1lIEhvc3RTREtcbiAgICAgICAgICAgICAgICBpZiAoaW1wbGVtZW50YXRpb25Db21wb25lbnQgIT09IHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBjbGVhbiByZWZDb21wb25lbnQgP1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCBhcyB1bmtub3duIGFzIFQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnNldEluaXRpYXRlZCgpXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogaGVyZSA+XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogd2hhdCBhYm91dCByZWFwdGVycyA/ISBkeW5hbWljID8hXG4gICAgICAgICAgICAgICAgLy8gY29uc3QgZXhzaXN0aW5nUmVmQ29tcG9uZW50ID0gY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSBhcyBNeW9wUmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vIGlmIChleHNpc3RpbmdSZWZDb21wb25lbnQuaWQgJiYgZXhzaXN0aW5nUmVmQ29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gW2NvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0sIHJlZkNvbXBvbmVudF07XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0ucHVzaChyZWZDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7IC8vaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSByZWZDb21wb25lbnQuaWQpITtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBpbiB3ZWJjb21wb25lbnQgY2FzZSB0aGUgc2FtZSBpZCB3aWxsIGFscmVkYXkgYmUgaGVyZSwgd2hpY2ggaXMgZ29vZCAhXG4gICAgICAgICAgICAgICAgLy8gbmFtZTpcbiAgICAgICAgICAgICAgICAvLyAgICAgaWRcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkXG5cbiAgICAgICAgICAgICAgICAvLyBmb3IgaW5uZXIgY29tcG9uZW50cyBpbnNpZGUgcmVmIGNvbXBvbmVudCA6XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5uZXN0ZWRSZWZzLmZvckVhY2gobmVzdGVkUmVmQ29uZmlnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHMhLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpIS50eXBlO1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IG5lc3RlZENvbXBvbmVudERlZmluaXRpb24gPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zPy5maW5kKGRlZiA9PiBkZWYuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpITtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgcmVmQ29uZmlnID0gY29tcG9uZW50Q29uZmlnLnR5cGUucmVmcy5maW5kKHIgPT4gci5uYW1lID09PSBuZXN0ZWRSZWZDb25maWcucmVmTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmICghcmVmQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIHJlZkNvbmZpZyBmb3VuZCBmb3IgbmVzdGVkIHJlZicpO1xuICAgICAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBuZXcgTXlvcFJlZkNvbXBvbmVudChuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uLCByZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICBuZXN0ZWRDb21wb25lbnQuc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5yZWZzW25lc3RlZFJlZkNvbmZpZy5yZWZOYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKG5lc3RlZENvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RSZWZzKHJlZkNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOnVzZSBjb25maWcgY2hlY2sgZm9yIGF1dG8taGlnaHQgYW5kIGNvbnZlcnQgdHlwZSBwcm9wZXJseVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZWZDb21wb25lbnQgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdyBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0UmVmcyA9IGFzeW5jIChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10sIHdpdGhvdXRSZWZDb21wb25lbnRzOiBib29sZWFuID0gZmFsc2UpID0+IHtcblxuICAgIGlmICghY29tcG9uZW50LnJlZnMpXG4gICAgICAgIGNvbXBvbmVudC5yZWZzID0ge307XG5cbiAgICBjb25zdCB3YWl0Rm9yID0gT2JqZWN0LnZhbHVlcyhjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZWZzKS5tYXAocmVmID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWYuYmVoYXZpb3IudHlwZSA9PSBSZWZCZWhhdmlvclR5cGUuY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID1cblxuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0UmVmQ29tcG9uZW50cykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hhbmdlIHRvIGdldCBpdCBmcm9tIHRoZSBmbG93XG4gICAgICAgICAgICAgICAgbGV0IHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmNvbXBvbmVudElkO1xuICAgICAgICAgICAgICAgIGlmICghcmVmQ29tcG9uZW50SWQpXG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmluc3RhbmNlLmNvbXBvbmVudElkXG5cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVqZWN0KG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgLy90aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMhLmZpbmQoY29tcGRlZiA9PiBjb21wZGVmLmlkID09PSByZWZDb21wb25lbnRJZCkhO1xuICAgICAgICAgICAgICAgIC8vIC8vY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGF3YWl0IGdldENvbXBvbmVudERlZmluaXRpb25Db25maWcoY29tcG9uZW50SW5zdGFuY2VDb25maWcuY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJlamVjdChuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE86IGlmIHdlIGhhdmUgdGhlIHNhbWUgY29tcG9uZW50IG1vcmUgdGhhbiBvbmNlIHdlIHdpbGwgbmVlZCBpbnN0YW5jZSBpZCBoZXJlIC4uLlxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudENvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHM/LmZpbmQobmVzdGVkQ29tcG9uZW50ID0+IG5lc3RlZENvbXBvbmVudC50eXBlLmlkID09PSByZWZDb21wb25lbnRJZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIW5lc3RlZENvbXBvbmVudENvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IG5lc3RlZENvbXBvbmVudENvbmZpZyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9jb25zdCBjb21wb25lbnRJbnN0YW5jZUNvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5uZXN0ZWRDb21wb25lbnRzPy5maW5kKGNvbXBvbmVudEluc3RhY2UgPT4gY29tcG9uZW50SW5zdGFjZS5jb21wb25lbnRJZCA9PT0gY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5pZCk7XG4gICAgICAgICAgICAgICAgLy8gaWYoIWNvbXBvbmVudERlZmluaXRpb25Db25maWcpe1xuICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE8gVE9ETyBUT0RPICcpO1xuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDp0aGluayBhYm91dCB0aGF0IDpcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudERlZmluaXRpb25Db25maWcucmVzb2x2ZWREZWZpbml0aW9ucyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnM7XG4gICAgICAgICAgICAgICAgLy8gICBjb25zdCBuZXN0ZWRDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgaW5zdGFuY2U6IG5lc3RlZENvbXBvbmVudENvbmZpZy5pbnN0YW5jZSEsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgdHlwZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLnR5cGUsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgbmFtZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLm5hbWVcbiAgICAgICAgICAgICAgICAvLyAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IF9yZWYgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCduZXN0ZWQgISEgY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBhd2FpdCBjcmVhdGVSZWZDb21wb25lbnQoX3JlZiwgbmVzdGVkQ29tcG9uZW50Q29uZmlnISwgY29tcG9uZW50cylcbiAgICAgICAgICAgICAgICAgICAgLy9URE9PIDogcHV0IHRoYXQgcmVmIGNvbXBvbmVudCBzb21ld2hlcmU/XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBfX25vblByb3hpZWQgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IGNyZWF0ZVJlZlByb3h5KF9fbm9uUHJveGllZCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgnPycpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH0pXG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdEZvcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgIHRocm93IGU7XG4gICAgfVxuXG59XG5cbmV4cG9ydCB0eXBlIHByb3BUeXBlczxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPiA9IHtcbiAgICBbUHJvcGVydHkgaW4ga2V5b2YgVF06XG4gICAgVFtQcm9wZXJ0eV0gZXh0ZW5kcyB7IG1vZGU6ICdpbnB1dCcgfSA/XG4gICAgICAgIFRbUHJvcGVydHldWyd0eXBlJ10gOlxuICAgICAgICBQcm9taXNlPFRbUHJvcGVydHldWyd0eXBlJ10+XG59XG5cbmV4cG9ydCBjb25zdCBleGVjID0gYXN5bmMgKGdldHRlcjogYW55KSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGdldHRlcigpXG59XG5cbmV4cG9ydCBjb25zdCBhY3RBcyA9IDxUPihyZWY6IFJlZikgPT4ge1xuICAgIHJldHVybiByZWYgYXMgdW5rbm93biBhcyBGdW5jdGlvbmlmeVJlZjxUPlxufVxuXG5leHBvcnQgdHlwZSBGdW5jdGlvbmlmeVJlZjxUID0gYW55PiA9IHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSIC8vIElmIGl0J3MgYSBmdW5jdGlvblxuICAgICAgICA/ICguLi5hcmdzOiBBKSA9PiBQcm9taXNlPFI+IC8vIENvbnZlcnQgaXQgdG8gYSBwcm9taXNlZCBmdW5jdGlvblxuICAgICAgICA6IFRbS11cbn07XG4iLCAiaW1wb3J0IHtBdXRvU2l6ZU9wdGlvbnMsIEJhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCxcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgTWVzc2FnZURpcmVjdGlvblxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJSWZyYW1lTG9hZGVyQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzLnRzXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wSWZyYW1lQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHJpdmF0ZSBJZnJhbWVFbGVtZW50OiBIVE1MSUZyYW1lRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoY29tcG9uZW50Q29uZmlnLCBjb250YWluZXIsIG9wdGlvbnMpXG5cbiAgICAgICAgaWYgKChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKS5hdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYXRlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVsZW1lbnQgPSB0aGlzLklmcmFtZUVsZW1lbnQ7XG4gICAgICAgIC8vIHRoaXMuSWZyYW1lRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KVxuICAgICAgICAvLyAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QoYElmcmFtZUVsZW1lbnQgZXJyb3JgKTtcbiAgICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgY2xlYW51cEluc3BlY3Q/OiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIC8vIFRPRE8gOiB1c2UgYmV0dGVyIGNoZWNrIGZvciBpbnNwZWN0IG1vZGVcbiAgICAgICAgaWYgKHRoaXMuY2xlYW51cEluc3BlY3QpIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2luc3BlY3QgY2FsbCBtb3JlIHRoYW4gb25jZScpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cEluc3BlY3RcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gc2V0RGVidWdTdHlsZSh0aGlzLmlkLCAnTXlvcElmcmFtZUNvbXBvbmVudCcsIDEwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5JZnJhbWVFbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCEoKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcxJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3Vuc2V0J1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhbGwnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudH1weGA7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgb2JzZXJ2ZVNpemVCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtzZW5kfSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIHNlbmQoe2hlaWdodCwgd2lkdGh9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5KTtcblxuICAgICAgICAgICAgcmV0dXJuIHtoZWlnaHQsIHdpZHRofVxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtyZXQuY29udGVudC53aWR0aH1weGA7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnQuaGVpZ2h0fXB4YDtcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZlcyB0aGUgaWZyYW1lIGNvbnRlbnQgc2l6ZSBhbmQgYXV0b21hdGljYWxseSBzeW5jcyBpdCB0byB0aGUgaWZyYW1lIGVsZW1lbnQuXG4gICAgICogVXNlcyBkaXJlY3QgY29udGVudERvY3VtZW50IGFjY2VzcyAoc2FtZS1vcmlnaW4gb25seSkgZm9yIGFjY3VyYXRlIG1lYXN1cmVtZW50cy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgc2l6ZSBjaGFuZ2UgY2FsbGJhY2sgYW5kIG1pbi9tYXggY29uc3RyYWludHNcbiAgICAgKiBAcmV0dXJucyBDbGVhbnVwIGZ1bmN0aW9uIHRvIHN0b3Agb2JzZXJ2aW5nXG4gICAgICovXG4gICAgb2JzZXJ2ZUF1dG9TaXplID0gKG9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnMpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMuSWZyYW1lRWxlbWVudDtcbiAgICAgICAgY29uc3QgZG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudDtcblxuICAgICAgICBpZiAoIWRvYykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbTXlvcElmcmFtZUNvbXBvbmVudF0gQ2Fubm90IG9ic2VydmUgYXV0byBzaXplOiBjb250ZW50RG9jdW1lbnQgbm90IGFjY2Vzc2libGUnKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsYW1wID0gKHZhbHVlOiBudW1iZXIsIG1pbj86IG51bWJlciwgbWF4PzogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICAgICAgICAgIGlmIChtaW4gIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA8IG1pbikgcmV0dXJuIG1pbjtcbiAgICAgICAgICAgIGlmIChtYXggIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+IG1heCkgcmV0dXJuIG1heDtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBQYXJzZSBDU1Mgc2l6ZSB2YWx1ZXMgdG8gbnVtYmVyc1xuICAgICAgICBjb25zdCBwYXJzZVNpemUgPSAodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIGlzTmFOKHBhcnNlZCkgPyB1bmRlZmluZWQgOiBwYXJzZWQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgbWluV2lkdGggPSBwYXJzZVNpemUob3B0aW9ucz8ubWluV2lkdGgpO1xuICAgICAgICBjb25zdCBtYXhXaWR0aCA9IHBhcnNlU2l6ZShvcHRpb25zPy5tYXhXaWR0aCk7XG4gICAgICAgIGNvbnN0IG1pbkhlaWdodCA9IHBhcnNlU2l6ZShvcHRpb25zPy5taW5IZWlnaHQpO1xuICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSBwYXJzZVNpemUob3B0aW9ucz8ubWF4SGVpZ2h0KTtcbiAgICAgICAgY29uc3QgbG9hZGVyTWluSGVpZ2h0ID0gb3B0aW9ucz8ubG9hZGVyTWluSGVpZ2h0ID8/IDUwO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGhvc3QgaGFzIGV4cGxpY2l0IGRpbWVuc2lvbnMgc2V0XG4gICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0V2lkdGggPSBvcHRpb25zPy5leHBsaWNpdFdpZHRoICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SGVpZ2h0ID0gb3B0aW9ucz8uZXhwbGljaXRIZWlnaHQgIT09IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBEZXRlY3QgY29sbGFwc2VkIGRpbWVuc2lvbnMgZnJvbSBjb250YWluZXIgKHRoaXMuY29udGFpbmVyKVxuICAgICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGNvbGxhcHNlZFdpZHRoID0gY29udGFpbmVyUmVjdC53aWR0aCA9PT0gMDtcbiAgICAgICAgLy8gQ29uc2lkZXIgY29sbGFwc2VkIGlmIGhlaWdodCBpcyAwIE9SIGVxdWFscyB0aGUgbG9hZGVyIG1pbkhlaWdodFxuICAgICAgICBjb25zdCBjb2xsYXBzZWRIZWlnaHQgPSBjb250YWluZXJSZWN0LmhlaWdodCA9PT0gMCB8fCBjb250YWluZXJSZWN0LmhlaWdodCA9PT0gbG9hZGVyTWluSGVpZ2h0O1xuXG4gICAgICAgIC8vIERldGVybWluZSB3aGljaCBkaW1lbnNpb25zIHRvIGF1dG8tc2l6ZTpcbiAgICAgICAgLy8gLSBJZiBmb3JjZUF1dG9TaXplIGlzIHRydWUsIGF1dG8tc2l6ZSB1bmxlc3MgZXhwbGljaXQgZGltZW5zaW9uIGlzIHNldFxuICAgICAgICAvLyAtIE90aGVyd2lzZSwgYXV0by1zaXplIG9ubHkgaWYgY29sbGFwc2VkXG4gICAgICAgIGNvbnN0IHNob3VsZEF1dG9XaWR0aCA9IG9wdGlvbnM/LmZvcmNlQXV0b1NpemVcbiAgICAgICAgICAgID8gIWhhc0V4cGxpY2l0V2lkdGhcbiAgICAgICAgICAgIDogKGNvbGxhcHNlZFdpZHRoICYmICFoYXNFeHBsaWNpdFdpZHRoKTtcbiAgICAgICAgY29uc3Qgc2hvdWxkQXV0b0hlaWdodCA9IG9wdGlvbnM/LmZvcmNlQXV0b1NpemVcbiAgICAgICAgICAgID8gIWhhc0V4cGxpY2l0SGVpZ2h0XG4gICAgICAgICAgICA6IChjb2xsYXBzZWRIZWlnaHQgJiYgIWhhc0V4cGxpY2l0SGVpZ2h0KTtcblxuICAgICAgICAvLyBJZiBub3RoaW5nIG5lZWRzIGF1dG8tc2l6aW5nLCBza2lwIFJlc2l6ZU9ic2VydmVyIGVudGlyZWx5XG4gICAgICAgIGlmICghc2hvdWxkQXV0b1dpZHRoICYmICFzaG91bGRBdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge307XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cGRhdGVTaXplID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XG4gICAgICAgICAgICBpZiAoY29udGVudERvYykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50V2lkdGggPSBNYXRoLmNlaWwocmVjdC53aWR0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEhlaWdodCA9IE1hdGguY2VpbChyZWN0LmhlaWdodCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBjbGFtcChjb250ZW50V2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gY2xhbXAoY29udGVudEhlaWdodCwgbWluSGVpZ2h0LCBtYXhIZWlnaHQpO1xuXG4gICAgICAgICAgICAgICAgLy8gT25seSBzZXQgZGltZW5zaW9ucyB0aGF0IHNob3VsZCBiZSBhdXRvLXNpemVkXG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZEF1dG9XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzaG91bGRBdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNob3cgc2Nyb2xsYmFyIG9uIGNvbnRlbnQgZG9jdW1lbnQgd2hlbiBjb250ZW50IGV4Y2VlZHMgY29uc3RyYWludHNcbiAgICAgICAgICAgICAgICBjb25zdCBpc1dpZHRoQ29uc3RyYWluZWQgPSBzaG91bGRBdXRvV2lkdGggJiYgbWF4V2lkdGggIT09IHVuZGVmaW5lZCAmJiBjb250ZW50V2lkdGggPiBtYXhXaWR0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0hlaWdodENvbnN0cmFpbmVkID0gc2hvdWxkQXV0b0hlaWdodCAmJiBtYXhIZWlnaHQgIT09IHVuZGVmaW5lZCAmJiBjb250ZW50SGVpZ2h0ID4gbWF4SGVpZ2h0O1xuICAgICAgICAgICAgICAgIGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93WCA9IGlzV2lkdGhDb25zdHJhaW5lZCA/ICdhdXRvJyA6ICdoaWRkZW4nO1xuICAgICAgICAgICAgICAgIGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IGlzSGVpZ2h0Q29uc3RyYWluZWQgPyAnYXV0bycgOiAnaGlkZGVuJztcblxuICAgICAgICAgICAgICAgIG9wdGlvbnM/Lm9uU2l6ZUNoYW5nZT8uKHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgYXV0b1NpemluZ1dpZHRoOiBzaG91bGRBdXRvV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9TaXppbmdIZWlnaHQ6IHNob3VsZEF1dG9IZWlnaHRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBJbml0aWFsIHNpemVcbiAgICAgICAgdXBkYXRlU2l6ZSgpO1xuXG4gICAgICAgIC8vIE9ic2VydmUgZm9yIGNoYW5nZXNcbiAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIodXBkYXRlU2l6ZSk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZG9jLmJvZHkpO1xuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGRvYy5kb2N1bWVudEVsZW1lbnQpO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc2V0U2l6ZUJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICByZXR1cm4ge2hlaWdodCwgd2lkdGh9XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3JldC5jb250ZW50LndpZHRofXB4YDtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudC5oZWlnaHR9cHhgO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyByZXR1cm4gd2luZG93LmRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0ICsgJ3B4JztcblxuXG4gICAgICAgICAgICAvL1RPRE86IGZpeCB0aGF0IGhhY2ssIGtlZXAgdGhlIGZ1bmN0aW9uIGluIHJpZ2h0IGZvcm1hdCB3aGlsZSBtaW5pZmllZCA6KFxuICAgICAgICAgICAgY29uc3Qgbm9PcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUbyBlbnN1cmUgaXQncyBub3Qgb3B0aW1pemVkIGF3YXksIHlvdSBjYW4gY2FsbCBpdCBhdCBsZWFzdCBvbmNlXG4gICAgICAgICAgICBsZXQgeCA9IG5vT3AoKTtcbiAgICAgICAgICAgIHgrKztcbiAgICAgICAgICAgIHgtLTtcblxuICAgICAgICAgICAgLy9yZXR1cm4gYCR7d2luZG93LmRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0fXB4YDtcblxuICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgdGhhdCArMSA/XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KVxuICAgICAgICAgICAgICAgICwgd2luZG93LmRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0KSArIHggKyAncHgnXG5cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IHJldC5jb250ZW50O1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZV8gPSB7Li4ubWVzc2FnZX0gYXMgQmFzZU15b3BNZXNzYWdlO1xuICAgICAgICAvL1RPRE8gOiA/IT8hIHNob3VsZCBpdCBiZSBoZXJlID9cbiAgICAgICAgaWYgKG1lc3NhZ2VfLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCkge1xuICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gKG1lc3NhZ2VfIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpXG4gICAgICAgICAgICB0aGlzW3R5cGVkTWVzc2FnZS5tZXRob2RdKCk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjayA6KFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlclxuXG4gICAgICAgIG1lc3NhZ2VfLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2VfKTtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50Py5jb250ZW50V2luZG93Py5wb3N0TWVzc2FnZShtZXNzYWdlXywgJyonKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9O1xuXG4gICAgb25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW4uTXV0YXRpb25PYnNlcnZlck1lc3NhZ2VcbiAgICAgICAgICAgIHx8IGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbi5SZXNpemVPYnNlcnZlck1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuICAgICAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICAgICAgLy90aGlzLnNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNsZWFudXBJbnNwZWN0KVxuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCgpO1xuXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnBhcmVudE5vZGUhLnJlbW92ZUNoaWxkKHRoaXMuSWZyYW1lRWxlbWVudCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZywgU2tpbkxvYWRlclR5cGV9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcExvYWRlciB7XG4gICAgdHlwZTogU2tpbkxvYWRlclR5cGU7XG4gICAgbG9hZDogKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IFByb21pc2U8SU15b3BDb21wb25lbnQ+O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BMb2FkZXIgaW1wbGVtZW50cyBJTXlvcExvYWRlciB7XG4gICAgYWJzdHJhY3QgdHlwZTogU2tpbkxvYWRlclR5cGU7XG4gICAgYWJzdHJhY3QgbG9hZDogKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IFByb21pc2U8SU15b3BDb21wb25lbnQ+O1xuXG4gICAgYXBwZW5kQ2hpbGQgPSAoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgZWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zLCkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ucmVsYXRpdmUpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlbGF0aXZlLmRpcmVjdGlvbiA9PT0gJ2JlZm9yZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmluc2VydEJlZm9yZShlbGVtZW50LCBvcHRpb25zLnJlbGF0aXZlLmNoaWxkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVsYXRpdmUuZGlyZWN0aW9uID09PSAnYWZ0ZXInKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBvcHRpb25zLnJlbGF0aXZlLmNoaWxkPy5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmluc2VydEJlZm9yZShlbGVtZW50LCBuZXh0U2libGluZyA/IG5leHRTaWJsaW5nIDogbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcElmcmFtZUNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcExvYWRlcn0gZnJvbSBcIi4vSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElJZnJhbWVMb2FkZXJDb25maWcsIElTa2luQ29uZmlnLCBTa2luTG9hZGVyc30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5jb25zdCBhZGRRdWVyeVBhcmFtID0gKHVybDogc3RyaW5nLCBwYXJhbTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgLy8gQ3JlYXRlIGEgVVJMIG9iamVjdFxuICAgIGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKTtcblxuICAgIC8vIEFkZCB0aGUgcXVlcnkgcGFyYW1ldGVyXG4gICAgdXJsT2JqLnNlYXJjaFBhcmFtcy5hcHBlbmQocGFyYW0sIHZhbHVlKTtcblxuICAgIC8vIFJldHVybiB0aGUgdXBkYXRlZCBVUkxcbiAgICByZXR1cm4gdXJsT2JqLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNeW9wSWZyYW1lTG9hZGVyIGV4dGVuZHMgQmFzZU15b3BMb2FkZXIge1xuICAgIHR5cGUgPSBTa2luTG9hZGVycy5JZnJhbWVMb2FkZXJcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcbiAgICAgICAgbGV0IElmcmFtZUVsZW1lbnQ6IEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyQ29uZmlnID0gKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpO1xuXG4gICAgICAgIGlmIChjb250YWluZXI/Lm5vZGVOYW1lID09PSBcIklGUkFNRVwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnbmVlZHMgdG8gbG9hZCBpbnRvIGFuIGV4c2lzdGluZyBJZnJhbWUuLi4nLCB0eXBlZExvYWRlckNvbmZpZy51cmwsIGNvbnRhaW5lcik7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSAoY29udGFpbmVyIGFzIEhUTUxJRnJhbWVFbGVtZW50KVxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zcmMgPSB0eXBlZExvYWRlckNvbmZpZy51cmxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXFJZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgY29uc3QgZG9tSWQgPSBgbXlvcC1jb21wLSR7dW5pcUlkfWBcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgICAgICAvLyBTZXQgYWxsIHN0eWxlcyBCRUZPUkUgYXBwZW5kaW5nIHRvIHByZXZlbnQgZmxhc2ggYXQgd3JvbmcgcG9zaXRpb25cbiAgICAgICAgICAgIGNvbnN0IGlmcmFtZVN0eWxlcyA9IGBcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgaW5zZXQ6IDA7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAke3R5cGVkTG9hZGVyQ29uZmlnLmF1dG9IZWlnaHQgfHwgIXR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodCA/ICcxMDAlJyA6IHR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodH07XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogJHtvcHRpb25zPy5oaWRkZW4gPyAnMCcgOiAnMSd9O1xuICAgICAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiAke29wdGlvbnM/LmhpZGRlbiA/ICdub25lJyA6ICdhbGwnfTtcbiAgICAgICAgICAgIGA7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnN0eWxlLmNzc1RleHQgPSBpZnJhbWVTdHlsZXM7XG5cbiAgICAgICAgICAgIC8vIFNldCBlbGVtZW50IGF0dHJpYnV0ZXMgaWYgcHJvdmlkZWRcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5lbGVtZW50QXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuZWxlbWVudEF0dHJpYnV0ZXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgJycpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpbiBvcmRlciB0byBoYW5kbGUgaXNzdWUgdG8gbG9hZCBpZnJhbWUgaW5zaWRlIGFuIGlmcmFtZSB3aXRoIHRoZSBzYW1lIHVybFxuICAgICAgICAgICAgbGV0IHVybDJsb2FkID0gKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLnVybDtcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5faGFzUGFyZW50KVxuICAgICAgICAgICAgICAgIHVybDJsb2FkID0gYWRkUXVlcnlQYXJhbSh1cmwybG9hZCwgXCJfbXlvcC1jb21wXCIsIHVuaXFJZCk7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3JjID0gdXJsMmxvYWQ7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgICAgIC8vICAgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRvbUlkKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgICAgIC8vTk8gOiBJZnJhbWVFbGVtZW50ID0gY29udGFpbmVyLmxhc3RFbGVtZW50Q2hpbGQgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE15b3BJZnJhbWVDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IG15b3BXZWJjb21wb25lbnRDb25zdHMgPSB7XG4gICAgd2ViY29tcG9uZW50X21lc3NhZ2Vfa2V5OiAnbXlvcF93ZWJjb21wb25lbnRfbWVzc2FnZSdcbn1cbiIsICJpbXBvcnQge215b3BXZWJjb21wb25lbnRDb25zdHN9IGZyb20gXCIuLi8uLi93ZWJjb21wb25lbnQvY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge3NldERlYnVnU3R5bGV9IGZyb20gXCIuLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wV2ViQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHJpdmF0ZSBjdXN0b21FbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoY29tcG9uZW50RGVmaW5pdGlvbiwgY29udGFpbmVyICwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGN1c3RvbUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgY2xlYW51cEluc3BlY3Q6IENsZWFudXBIYW5kbGVyID0gKCkgPT4ge1xuICAgIH1cblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSBzZXREZWJ1Z1N0eWxlKHRoaXMuaWQsICdNeW9wV2ViQ29tcG9uZW50JywgMCwgdGhpcy5jb250YWluZXIsIHRoaXMuY3VzdG9tRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cEluc3BlY3Q7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcxJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3Vuc2V0J1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhbGwnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcnO1xuICAgIH1cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlPGFueT4pID0+IHtcbiAgICAgICAgbGV0IG1lc3NhZ2VfID0gey4uLm1lc3NhZ2V9IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAvL1RPRE8gOiBjYW4gYmUgZG9uZSB3aXRob3V0IGNsb25pbmc/XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9jb25zdCBoYW5kbGVyID0gbWVzc2FnZV8uaGFuZGxlclxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZV8pO1xuXG4gICAgICAgIGNvbnN0IG1zZyA9IG5ldyBDdXN0b21FdmVudDxCYXNlTXlvcE1lc3NhZ2U+KG15b3BXZWJjb21wb25lbnRDb25zdHMud2ViY29tcG9uZW50X21lc3NhZ2Vfa2V5LCB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBkZXRhaWw6IG1lc3NhZ2VfLFxuICAgICAgICAgICAgLy8gYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIC8vIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgLy8gY29tcG9zZWQ6IHRydWVcbiAgICAgICAgfSlcblxuICAgICAgICAvL3RoaXMuY29udGFpbmVyLmRpc3BhdGNoRXZlbnQobXNnKVxuXG4gICAgICAgIC8vc2VuZGluZyBkYXRhIGZyb20gaG9zdCB0byB0aGUgY29tcG9uZW50XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuZGlzcGF0Y2hFdmVudChtc2cpXG4gICAgICAgICAgICAvLyBpZiAodGhpcy5jdXN0b21FbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5jdXN0b21FbGVtZW50LmNoaWxkcmVuWzBdLmRpc3BhdGNoRXZlbnQobXNnKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGRpc3BhdGNoRXZlbnQnLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9tZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH1cblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKHRoaXMuY3VzdG9tRWxlbWVudCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcFdlYkNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcExvYWRlcn0gZnJvbSBcIi4vSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcbmltcG9ydCB7dXVpZHY0LCB3YWl0fSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnLCBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnLCBTa2luTG9hZGVyc30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5jb25zdCBzZWVuOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PiA9IHt9O1xuXG5leHBvcnQgY2xhc3MgV2ViY29tcG9uZW50TG9hZGVyIGV4dGVuZHMgQmFzZU15b3BMb2FkZXIge1xuXG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLldlYkNvbXBvbmVudExvYWRlclxuXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG5cbiAgICAgICAgY29uc3QgbG9hZGVyQ29uZmlnID0gKHNraW4ubG9hZGVyIGFzIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcpO1xuXG4gICAgICAgIGlmICghc2Vlbltsb2FkZXJDb25maWcudXJsXSkge1xuICAgICAgICAgICAgLy8gYXdhaXQgaW1wb3J0KCAvKiBAdml0ZS1pZ25vcmUgKi8gd2ViQ29tcG9uZW50TG9hZFVybCk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbW9kdWxlIGxvYWRlZCcpO1xuICAgICAgICAgICAgc2Vlbltsb2FkZXJDb25maWcudXJsXSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB3ZWJDb21wb25lbnRMb2FkVXJsID0gbG9hZGVyQ29uZmlnLnVybFxuICAgICAgICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICAgICAgICAgIHNjcmlwdC50eXBlID0gJ21vZHVsZSc7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnNyYyA9IHdlYkNvbXBvbmVudExvYWRVcmw7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNjcmlwdC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdNb2R1bGUgYWxyZWRheSBsb2FkZWQgb3IgaW4gbG9hZGluZyBwcm9jZXNzJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBzZWVuW2xvYWRlckNvbmZpZy51cmxdO1xuXG4gICAgICAgIC8vVE9ETyA6IGFkZCByZXRyeSBtZWNoYW5pc20gaW4gZmFpbCBjYXNlLlxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2ssIHNob3VsZCBmaXggdGhlIHJhY2UgY29uZGl0aW9uIGZvciBsb2FkZWQgbW9kdWxlc1xuICAgICAgICBhd2FpdCB3YWl0KDEpO1xuXG4gICAgICAgIGxldCBkb21JZCA9IGBteW9wLWNvbXAtJHt1dWlkdjQoKX1gXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGxvYWRlckNvbmZpZy50YWcpO1xuXG4gICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgLy9lbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgZWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgIGlmIChvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIChjb250YWluZXIuaWQuc3RhcnRzV2l0aCgnbXlvcC1jb21wLScpKSB7XG4gICAgICAgIC8vICAgICAvLyBpbiBwbGFjZSByZXBsYWNlbWVudFxuICAgICAgICAvLyAgICAgY29udGFpbmVyLnJlcGxhY2VXaXRoKGVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgLy9jb250YWluZXIgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQhO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYob3B0aW9ucz8uX2Vudmlyb25tZW50KXtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsZW1lbnQuX215b3BFbnZpcm9ubWVudCA9IG9wdGlvbnM/Ll9lbnZpcm9ubWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICAgICAgLy9lbGVtZW50LmlubmVySFRNTCA9IGA8JHtsb2FkZXJDb25maWcudGFnfSAvPmA7XG4gICAgICAgIHJldHVybiBuZXcgTXlvcFdlYkNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cblxufVxuIiwgImltcG9ydCB7QmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlciwgSG9zdGVkQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHZvaWRcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBleHRlbmRzIEJhc2VDb250ZXh0TWVzc2FnZUhhbmRsZXI8VCwgUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PFNoYWRvd1Jvb3RSZWY+Pj4ge1xuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZVRvSG9zdDogYW55LCBwdWJsaWMgY29udGV4dDogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PFNoYWRvd1Jvb3RSZWY+Pikge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBpbm5lckV4ZWN1dG9yOiAoZXZlbnQ6IFQsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHZvaWQ7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogVCkgPT4ge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICBpZiAoZXZlbnQuZGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gZXZlbnQuZGVzdGluYXRpb247XG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0W2Rlc3RpbmF0aW9uXS5jb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBwYXRjaCB0aGUgc291cmNlIGlkLCB0aGluayBhYm91dCB0aGF0ID9cbiAgICAgICAgICAgICAgICBjb25zdCBfbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBldmVudC5kZXN0aW5hdGlvbiA/IGV2ZW50LmRlc3RpbmF0aW9uIDogZXZlbnQuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb246IGV2ZW50LnNvdXJjZSA/IGV2ZW50LnNvdXJjZSA6IGV2ZW50LmRlc3RpbmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0gYXMgQmFzZU15b3BNZXNzYWdlLCByZXBsYXlUbylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbm5lckV4ZWN1dG9yKGV2ZW50LCB0aGlzLmNvbnRleHRbZGVzdGluYXRpb25dLmNvbnRleHQsIF9tZXNzYWdlVG9Ib3N0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcEF0dHJpYnV0ZXMgPSB7XG4gICAgaWQ6ICdteW9wLWlkJ1xufVxuIiwgImltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHMudHNcIjtcbmltcG9ydCB7UmVmfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRzQnlSZWYgPSAocmVmOiBSZWYsIGVsOiBQYXJlbnROb2RlKSA9PiB7XG4gICAgcmV0dXJuIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtyZWYucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRGaXJzdEVsZW1lbnRCeVJlZiA9IChyZWY6IFJlZiwgZWw6IFBhcmVudE5vZGUpID0+IHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGdldEVsZW1lbnRzQnlSZWYocmVmLCBlbCk7XG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudHMuaXRlbSgwKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCaW5kQ2xpY2tNZXNzYWdlLCBDbGlja1JlcGxheU1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEJpbmRPbkNsaWNrSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxCaW5kQ2xpY2tNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5CaW5kQ2xpY2tNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQmluZENsaWNrTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpXG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogYW55W10gPSBbXTtcblxuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBDbGlja1JlcGxheU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB0YXNrKCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtNeW9wRWxlbWVudE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VUZXh0SGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxNeW9wRWxlbWVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNoYW5nZVRleHRNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogTXlvcEVsZW1lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLnRleHRDb250ZW50ID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTaGFkb3dSb290UmVmIGV4dGVuZHMgUm9vdFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHB1YmxpYyBzaGFkb3dSb290OiBTaGFkb3dSb290KSB7XG4gICAgICAgIHN1cGVyKGNvbnRhaW5lciwgc2hhZG93Um9vdCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEVsZW1lbnRSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7RGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UsIERldGVjdE15b3BSZWZzTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuZXhwb3J0IGNsYXNzIERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8RGV0ZWN0TXlvcFJlZnNNZXNzYWdlPiB7XG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG5cbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgY29uc3QgYWxsTXlvcEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfV1gKTtcblxuICAgICAgICBsZXQgbXlvcFJlZnM6IE15b3BFbGVtZW50UmVmW10gPSBbXTtcblxuICAgICAgICBhbGxNeW9wSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IHRha2UgdGhhdCBiYWNrIHRvIHRoZSBkYXNoYm9hcmQ/XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGl0ZW0sIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuXG4gICAgICAgICAgICBjb25zdCBteW9wSWQgPSBpdGVtLmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG5cbiAgICAgICAgICAgIGlmIChteW9wSWQpIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCd3YyByZWN0JywgIGl0ZW0ucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSlcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgbXlvcFJlZnMucHVzaChuZXcgTXlvcEVsZW1lbnRSZWYobXlvcElkLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGl0ZW0ub2Zmc2V0VG9wLCBpdGVtLm9mZnNldExlZnQpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBteW9wUmVmcykpXG4gICAgfTtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkRldGVjdE15b3BSZWZzTWVzc2FnZTtcblxuXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldEF0dHJpYnV0ZU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBzZXRBdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFNldEF0dHJpYnV0ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldEF0dHJpYnV0ZU1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBTZXRBdHRyaWJ1dGVNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZShldmVudC5uYW1lLCBldmVudC52YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLFxuICAgIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UsXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8QWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6ICgoKSA9PiB2b2lkKVtdID0gW107XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGluIGZhY3Qgd2hlbiBydW5uaW5nIGluIFdlYkNvbXBvbmVudCB3ZSBjYW4gdHJhbnNmZXIgdGhlIG9yaWdpbmFsIGVcbiAgICAgICAgICAgICAgICAvLyBjdXJyZW50bHkgdXNpbmcgbWFrZVNlcmlhbGl6YWJsZSBmb3IgbmVzdGVkIGNhc2VzLCB0aGluayBhYm91dCB0aGF0XG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsICBtYWtlU2VyaWFsaXphYmxlKGUsIGV2ZW50LnNlcmlhbGl6YWJsZVNrZWxldG9uKSkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKGV2ZW50LnR5cGUsIGhhbmRsZXIpO1xuXG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LnR5cGUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtIb3N0U0RLfSBmcm9tIFwiLi4vLi4vaG9zdC9ob3N0U0RLXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZVwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG5cbiAgICAgICAgY29uc3QgY3JlYXRlUmVmID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy9jb25zdCBhbGxJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZj8ucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG4gICAgICAgICAgICBjb25zdCBhbGxJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuXG4gICAgICAgICAgICBpZiAoYWxsSXRlbXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaG9zdFNESyA9IEhvc3RTREsuSW5zdGFuY2UoKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IGhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gZXZlbnQub3B0aW9ucy5pZCkhO1xuICAgICAgICAgICAgICAgIGlmIChyZWZDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8vLz4+Pj5cbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gIGNvbnNvbGUubG9nKGBmYWlsZWQgdG8gZmluZCAke2V2ZW50Lm9wdGlvbnMuaWR9IGluIG1lbSBzY29wZWAsIGhvc3RTREspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL3dlIGhhdmUgdGhlIHJlZiBjb21wb25lbnQgaW4gb3VyIEhvc3RTREsgKHNhbWUgbWVtb3J5IHdoZW4gdXNpbmcgd2ViY29tcG9uZW50KVxuICAgICAgICAgICAgICAgIC8vICByZWZDb21wb25lbnQucGFyZW50ID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgLy9kZWxldGUgdGhlIHJlZiBjb21wb25lbnRcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGhvc3RTREsuY29tcG9uZW50cy5pbmRleE9mKHJlZkNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBob3N0U0RLLmNvbXBvbmVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCByZW1vdmVkIHRlbXAgcmVmIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQgdXNpbmcgdGVtcCByZWYgY29tcG9uZW50Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW1wbGVtZW50YXRpb25Db21wb25lbnQgPSBhd2FpdCBob3N0U0RLLmxvYWRDb21wb25lbnQoZXZlbnQubmVzdGVkQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBhbGxJdGVtcy5pdGVtKDApLFxuICAgICAgICAgICAgICAgICAgICBldmVudC5vcHRpb25zKVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogbm8gbmVlZCB0aGlzLCBwYXNzIG9wdGlvbnMgZnJvbSBwYXJlbnRcbiAgICAgICAgICAgICAgICAvL2ltcGxlbWVudGF0aW9uQ29tcG9uZW50LmlkID0gZXZlbnQucHJlZGVmaW5lZElkO1xuICAgICAgICAgICAgICAgIC8vcmVmQ29tcG9uZW50LmlkICs9ICcuJztcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IG5vdCByZWFsbHkgbmVlZGVkID9cbiAgICAgICAgICAgICAgICAvLyBhd2FpdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZFJlZkNvbmZpZzogYW55W10gPSBbXTtcblxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGltcGxlbWVudGF0aW9uQ29tcG9uZW50LnJlZnMpLmZvckVhY2gocmVmTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWYgPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5yZWZzW3JlZk5hbWVdO1xuICAgICAgICAgICAgICAgICAgICByZWYgPSByZWYuX19ub25Qcm94aWVkIHx8IHJlZjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkUmVmQ29uZmlnLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiAocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBuZXN0ZWRSZWZDb25maWcpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgLSBET00gZWxlbWVudCBub3QgZm91bmQnKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBbXSwgdHJ1ZSkpO1xuXG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjcmVhdGVSZWYoKS50aGVuKClcbiAgICAgICAgLy9yZXR1cm5pbmcgdW5kZWZpbmVkIHNvIGl0IHdvbid0IGFjdCBhcyBhIGNsZWFudXBcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCByZXBsaWVyOiAoZGF0YTogYW55KSA9PiB2b2lkLCByb290UmVmOiBSb290UmVmKSA9PiB7XG4gICAgY29uc3QgX19zY3JpcHRJbnB1dHMgPSBldmVudC5zY3JpcHRJbnB1dHMgPyBldmVudC5zY3JpcHRJbnB1dHMgOiB7fVxuICAgIF9fc2NyaXB0SW5wdXRzLm1ha2VTZXJpYWxpemFibGUgPSBtYWtlU2VyaWFsaXphYmxlO1xuXG4gICAgX19zY3JpcHRJbnB1dHMuc2VuZCA9IHJlcGxpZXI7XG4gICAgX19zY3JpcHRJbnB1dHMucm9vdFJlZiA9IHJvb3RSZWY7XG4gICAgX19zY3JpcHRJbnB1dHMuX19zY3JpcHRJbnB1dHMgPSBfX3NjcmlwdElucHV0cztcblxuICAgIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICgke2V2ZW50LnNjcmlwdH0pKC4uLmFyZ3VtZW50cylgKTtcbiAgICBjb25zdCByZXQgPSBkeW5hbWljRnVuY3Rpb24oX19zY3JpcHRJbnB1dHMpO1xuXG4gICAgLy8gY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gRnVuY3Rpb24oJ3NlbmQnLCAncm9vdFJlZicsJ19fc2NyaXB0SW5wdXRzJywgLi4uT2JqZWN0LmtleXMoX19zY3JpcHRJbnB1dHMpLCBldmVudC5jb250ZW50ID8gZXZlbnQuY29udGVudCA6ICcnKVxuICAgIC8vY29uc3QgcmV0ID0gZHluYW1pY0Z1bmN0aW9uKHJlcGxpZXIsIHJvb3RSZWYsIF9fc2NyaXB0SW5wdXRzLCAuLi5PYmplY3QudmFsdWVzKF9fc2NyaXB0SW5wdXRzKSk7XG4gICAgcmVwbGllcihyZXQpO1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3J9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0SGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxFeGVjdXRlU2NyaXB0TWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVTY3JpcHRNZXNzYWdlXG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCByZXBsaWVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIGRhdGEpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yKGV2ZW50LCByZXBsaWVyLCBzaGFkb3dSb290UmVmKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UsIEZvcm1EYXRhRW50cnksIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIElucHV0RWxlbWVudFZhbHVlLH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHMudHNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IGdldElucHV0VmFsdWUgPSAoZWxlbWVudCk6IElucHV0RWxlbWVudFZhbHVlID0+IHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGZvcm1cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGRhdGFPYmplY3Q6IElucHV0RWxlbWVudFZhbHVlID0ge1xuICAgICAgICAgICAgZm9ybURhdGE6IHt9LFxuICAgICAgICAgICAgdW5tYXBwZWREYXRhOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE1hbnVhbGx5IGFkZCBlbGVtZW50cyB3aXRob3V0IG5hbWVzXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpO1xuICAgICAgICBsZXQgYXV0b05hbWVJbmRleGVyID0gLTE7XG5cbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBgXyR7KCsrYXV0b05hbWVJbmRleGVyKX1gXG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlRGF0YTogRm9ybURhdGFFbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldElucHV0VmFsdWUoZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBlbGVtZW50LnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eTogbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LnZhbGlkaXR5LCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgbXlvcElkLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGF0YU9iamVjdDtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtZW50LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2hlY2tlZCA/IGVsZW1lbnQudmFsdWUgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBpbnB1dCBhbmQgdGV4dGFyZWEgZWxlbWVudHNcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnIHx8IGVsZW1lbnQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc2VsZWN0IGVsZW1lbnRzIChkcm9wZG93bnMpXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGVkaXRhYmxlIGRpdnMgKGNvbnRlbnRFZGl0YWJsZSlcbiAgICBpZiAoZWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5pbm5lclRleHQgfHwgZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGFuIHVuc3VwcG9ydGVkIGVsZW1lbnQgdHlwZVxuICAgIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgR2V0RWxlbWVudFZhbHVlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxHZXRFbGVtZW50VmFsdWVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5HZXRFbGVtZW50VmFsdWVNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZShnZXRJbnB1dFZhbHVlKGl0ZW0pKSwgZXZlbnQpO1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7TXlvcEVsZW1lbnRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxTZXRJbm5lckh0bWw+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldElubmVySHRtbDtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IE15b3BFbGVtZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5pbm5lckhUTUwgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogVGhlIFdlYmNvbXBvbmVudCBTREsgaXMgdGFpbG9yZWQgZm9yIHVzaW5nIE15b3AgY29tcG9uZW50cyBwYWNrYWdlZCBhcyBzZXBhcmF0ZSBidW5kbGVzIGFuZCBleHBvc2VkIGFzIHdlYiBjb21wb25lbnRzLjxici8+XG4gKiBEZXZlbG9wZXJzIGltcG9ydGluZyB0aGlzIFNESyBjYW4gbGV2ZXJhZ2UgQVBJcyBhbmQgdXRpbGl0aWVzIHNwZWNpZmljYWxseSBjcmFmdGVkIHRvIHN1cHBvcnQgdGhlIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGFuZCBjb21tdW5pY2F0aW9uIHBhdHRlcm5zIHJlcXVpcmVkIGZvciB3ZWIgY29tcG9uZW50cyB3aXRoaW4gdGhlIE15b3AgYXJjaGl0ZWN0dXJlLjxici8+XG4gKiBUaGlzIFNESyBwcm9tb3RlcyByZXVzYWJpbGl0eSBhbmQgZW5jYXBzdWxhdGlvbiwgZW5hYmxpbmcgZGV2ZWxvcGVycyB0byBidWlsZCBtb2R1bGFyLCBzZWxmLWNvbnRhaW5lZCBjb21wb25lbnRzIHRoYXQgY2FuIGJlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uJ3MgRE9NIHN0cnVjdHVyZS5cbiAqXG4gKlxuICogT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuICogYGBganNcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7V2ViQ29tcG9uZW50U0RLfSBmcm9tICdAbXlvcC9zZGsvd2ViY29tcG9uZW50JztcbiAqIGBgYFxuICpcbiAqL1xuaW1wb3J0IHtCYXNlTXlvcFNES30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BXZWJjb21wb25lbnRDb25zdHN9IGZyb20gXCIuL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7QmluZE9uQ2xpY2tIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyXCI7XG5pbXBvcnQge0NoYW5nZVRleHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvY2hhbmdlVGV4dEhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVxdWVzdCxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge3NldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIudHNcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0dldEVsZW1lbnRWYWx1ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NldElubmVySHRtbEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzXCI7XG5cbi8qKlxuICogVGhlIFdlYmNvbXBvbmVudCBTREsgaXMgdGFpbG9yZWQgZm9yIHVzaW5nIE15b3AgY29tcG9uZW50cyBwYWNrYWdlZCBhcyBzZXBhcmF0ZSBidW5kbGVzIGFuZCBleHBvc2VkIGFzIHdlYiBjb21wb25lbnRzLjxici8+XG4gKiBEZXZlbG9wZXJzIGltcG9ydGluZyB0aGlzIFNESyBjYW4gbGV2ZXJhZ2UgQVBJcyBhbmQgdXRpbGl0aWVzIHNwZWNpZmljYWxseSBjcmFmdGVkIHRvIHN1cHBvcnQgdGhlIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGFuZCBjb21tdW5pY2F0aW9uIHBhdHRlcm5zIHJlcXVpcmVkIGZvciB3ZWIgY29tcG9uZW50cyB3aXRoaW4gdGhlIE15b3AgYXJjaGl0ZWN0dXJlLjxici8+XG4gKiBUaGlzIFNESyBwcm9tb3RlcyByZXVzYWJpbGl0eSBhbmQgZW5jYXBzdWxhdGlvbiwgZW5hYmxpbmcgZGV2ZWxvcGVycyB0byBidWlsZCBtb2R1bGFyLCBzZWxmLWNvbnRhaW5lZCBjb21wb25lbnRzIHRoYXQgY2FuIGJlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uJ3MgRE9NIHN0cnVjdHVyZS5cbiAqXG4gKlxuICogT25jZSBsb2FkZWQgdGhlIGBSb290IFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiAqIGBgYGpzXG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkNvbXBvbmVudFNESyBleHRlbmRzIEJhc2VNeW9wU0RLIHtcblxuICAgIGFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3QgPSB0cnVlO1xuXG4gICAgLy93aGVuIG5ldyB3ZWIgY29tcG9uZW50IGNyZWF0ZWQuXG4gICAgY29ubmVjdGVkQ2FsbGJhY2sgPSAoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgc2hhZG93OiBTaGFkb3dSb290KSA9PiB7XG4gICAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKG15b3BXZWJjb21wb25lbnRDb25zdHMud2ViY29tcG9uZW50X21lc3NhZ2Vfa2V5LCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gZS5kYXRhID8gZS5kYXRhIDogZS5kZXRhaWw7XG4gICAgICAgICAgICBpZiAoIWV2ZW50Q29udGVudCB8fCAhZXZlbnRDb250ZW50Lm15b3ApIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlY3ZpZWQgd2ViY29tcG9uZW50X21lc3NhZ2Ugd2l0aCB3cm9uZyB0eXBlJylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50Q29udGVudCBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBzZW5kIGNvbnRhaW5lciAvIGNvbXBvZW5udCBpZGVudGlmaWVyIGZvciBtdWx0aWwgY29tcG9uZW50cyBzdXBwb3J0XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlcyhlKVxuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbXBvbmVudElkID0gKG1lc3NhZ2UgYXMgSW5pdE1lc3NhZ2UpLmNvbnRlbnQuaWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0uY29udGV4dCA9IG5ldyBTaGFkb3dSb290UmVmKGNvbnRhaW5lciwgc2hhZG93KVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuc3VwcG9ydGVkSGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGhhbmRsZXIuY29udGV4dCA9IHRoaXMuc2hhZG93Um9vdHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrLiByYWNlIGNvbmRpdGlvbiB3aXRoIGhvc3QubG9hZCB3aGVuIG1vZHVsZSBsb2FkZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXF1ZXN0KCkpXG4gICAgICAgIH0sIDEpXG4gICAgfVxuXG4gICAgbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi51cFxuICAgICAgICAvL21lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZDtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyICYmIHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQpXG4gICAgICAgICAgICBtZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvLmhhbmRsZXJVbmlxdWVJZFxuXG4gICAgICAgIHdpbmRvdy5teW9wLmhvc3RTREsuc2VuZChtZXNzYWdlKVxuICAgIH1cblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJbXSA9IFtcbiAgICAgICAgbmV3IENoYW5nZVRleHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IFNldElubmVySHRtbEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgQmluZE9uQ2xpY2tIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgc2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBBZGRFdmVudExpc3RlbmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBFeGVjdXRlU2NyaXB0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgLy9cbiAgICAgICAgbmV3IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKVxuICAgIF07XG5cbiAgICBwdWJsaWMgaW5pdCA9ICgpID0+IHtcbiAgICAgICAgLy90aGlzLm15Q29tcG9uZW50SWRcbiAgICAgICAgLy90aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzXG4gICAgfVxufVxuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdXZWJDb21wb25lbnRTREsnLCBXZWJDb21wb25lbnRTREspO1xuIiwgImV4cG9ydCAqIGZyb20gXCIuL1dlYkNvbXBvbmVudFNES1wiO1xuIiwgIi8qKlxuICogRW1iZWRkZWQgU0RLIENvbnRlbnQgTW9kdWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIGVtYmVkZGVkIFNESyBjb250ZW50IGZvciBucG0gcGFja2FnZSB1c2Vycy5cbiAqIFRoZSBhY3R1YWwgY29udGVudCBpcyBnZW5lcmF0ZWQgYXQgYnVpbGQgdGltZSBieSBzY3JpcHRzL2J1aWxkLWVtYmVkZGVkLXNkay5qc1xuICpcbiAqIEZvciBkZXZlbG9wbWVudCwgdGhpcyBmaWxlIGV4cG9ydHMgcGxhY2Vob2xkZXJzLlxuICogQWZ0ZXIgYnVpbGQsIHRoZSBkaXN0L21vZHVsZS9lbWJlZGRlZFNESy5qcyB3aWxsIGNvbnRhaW4gdGhlIGFjdHVhbCBTREsgY29udGVudC5cbiAqXG4gKiBVc2FnZSBpbiBIVE1MQ29tcG9uZW50TG9hZGVyOlxuICogLSBJZiBIQVNfRU1CRURERURfU0RLIGlzIHRydWUsIGluamVjdCBTREsgaW5saW5lOiA8c2NyaXB0PiR7RU1CRURERURfU0RLX0NPTlRFTlR9PC9zY3JpcHQ+XG4gKiAtIElmIEhBU19FTUJFRERFRF9TREsgaXMgZmFsc2UsIGZhbGwgYmFjayB0byBDRE46IDxzY3JpcHQgc3JjPVwiJHt1cmx9XCI+PC9zY3JpcHQ+XG4gKi9cblxuLyoqXG4gKiBUaGUgZW1iZWRkZWQgU0RLIGNvbnRlbnQgYXMgYSBtaW5pZmllZCBKYXZhU2NyaXB0IHN0cmluZy5cbiAqIFRoaXMgcGxhY2Vob2xkZXIgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGFjdHVhbCBjb250ZW50IGluIHRoZSBidWlsZCBvdXRwdXQuXG4gKi9cbmV4cG9ydCBjb25zdCBFTUJFRERFRF9TREtfQ09OVEVOVDogc3RyaW5nID0gJyc7XG5cbi8qKlxuICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgZW1iZWRkZWQgU0RLIGNvbnRlbnQgaXMgYXZhaWxhYmxlLlxuICogVGhpcyBpcyBmYWxzZSBpbiBkZXZlbG9wbWVudCwgdHJ1ZSBpbiB0aGUgYnVpbHQgbW9kdWxlLlxuICovXG5leHBvcnQgY29uc3QgSEFTX0VNQkVEREVEX1NESzogYm9vbGVhbiA9IGZhbHNlO1xuIiwgImltcG9ydCB7TXlvcFdlYkNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcExvYWRlcn0gZnJvbSBcIi4vSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7XG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUhUTUxMb2FkZXJDb25maWcsXG4gICAgSVNraW5Db25maWcsIFNoYWRvd1Jvb3RNb2RlVHlwZSxcbiAgICBTa2luTG9hZGVyc1xufSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1dlYkNvbXBvbmVudFNES30gZnJvbSBcIi4uLy4uL3dlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wSWZyYW1lQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50LnRzXCI7XG5pbXBvcnQge0VNQkVEREVEX1NES19DT05URU5ULCBIQVNfRU1CRURERURfU0RLfSBmcm9tIFwiLi4vZW1iZWRkZWRTREsudHNcIjtcbi8vaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gXCIuLi8uLi9TREsudHNcIjtcblxuY29uc3Qgc2Vlbjogc3RyaW5nW10gPSBbXTtcbmxldCBzZGs7XG5jb25zdCBnZXRJbml0aWF0ZWRTZGsgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFzZGspIHtcbiAgICAgICAgLy9jb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpXG4gICAgICAgIHNkayA9IG5ldyBXZWJDb21wb25lbnRTREsoKTtcbiAgICAgICAgc2RrLmluaXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNkaztcbn1cblxuZnVuY3Rpb24gY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sU3RyaW5nOiBzdHJpbmcsIFNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZSk6IG5ldyAoKSA9PiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgY29uc3QgbW9kZSA9IFNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUub3BlbiA/ICdvcGVuJyA6ICdjbG9zZWQnO1xuICAgICAgICAgICAgY29uc3Qgc2hhZG93ID0gdGhpcy5hdHRhY2hTaGFkb3coe21vZGV9KTtcbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayh0aGlzLCBzaGFkb3cpO1xuICAgICAgICAgICAgICAgIHNoYWRvdy5pbm5lckhUTUwgPSBodG1sU3RyaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfTtcbn1cblxuY29uc3QgY3JlYXRlQ3VzdG9tV2ViQ29tcG9uZW50ID0gKGNvbXBvbmVudE5hbWU6IHN0cmluZywgaHRtbDogc3RyaW5nLCBTaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGUpID0+IHtcbiAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoY29tcG9uZW50TmFtZSwgY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sLCBTaGFkb3dSb290TW9kZSkpO1xuICAgIGNvbnNvbGUubG9nKGBkZWZpbmUoJyR7Y29tcG9uZW50TmFtZX0nKSB3YXMgY2FsbGVkLCB3ZWIgY29tcG9uZW50IHJlYWR5IHRvIHVzZWApO1xufVxuXG5jb25zdCB0b1dlYkNvbXBvbmVudE5hbWUgPSAoc3RyKSA9PiB7XG4gICAgcmV0dXJuIHN0clxuICAgICAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxLSQyJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgdXBwZXJjYXNlIGxldHRlcnNcbiAgICAgICAgLnJlcGxhY2UoLyhcXGQrKS9nLCAnLSQxJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgZGlnaXRzXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpOyAvLyBDb252ZXJ0IHRvIGxvd2VyY2FzZVxufVxuXG5jb25zdCB0b0N1c3RvbUVsZW1lbnROYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIG5hbWUgPSB0b1dlYkNvbXBvbmVudE5hbWUobmFtZSk7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvXy9nLCAnLScpO1xufVxuXG5sZXQgcGFyc2VyOiBET01QYXJzZXI7IC8vID0gbmV3IERPTVBhcnNlcigpO1xuXG5leHBvcnQgY2xhc3MgSFRNTENvbXBvbmVudExvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcblxuICAgIHR5cGUgPSBTa2luTG9hZGVycy5IVE1MTG9hZGVyXG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWcpO1xuICAgICAgICBsZXQgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YFxuICAgICAgICBsZXQgZWxlbWVudDtcblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICBsZXQgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgICAgICAvLyBTZXQgYWxsIHN0eWxlcyBCRUZPUkUgYXBwZW5kaW5nIHRvIHByZXZlbnQgZmxhc2ggYXQgd3JvbmcgcG9zaXRpb25cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgaW5zZXQ6IDA7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogJHtvcHRpb25zPy5oaWRkZW4gPyAnMCcgOiAnMSd9O1xuICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICAgICAgICBwb2ludGVyLWV2ZW50czogJHtvcHRpb25zPy5oaWRkZW4gPyAnbm9uZScgOiAnYWxsJ307XG4gICAgICAgICAgICBgO1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vIFdyaXRlIGNvbnRlbnQgaW50byB0aGUgaWZyYW1lXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IElmcmFtZUVsZW1lbnQuY29udGVudERvY3VtZW50IHx8IElmcmFtZUVsZW1lbnQuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgICAgIGRvYy5vcGVuKCk7XG5cblxuICAgICAgICAgICAgbGV0IEhUTUwyUmVuZGVyID0gbG9hZGVyQ29uZmlnLkhUTUw7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5faW5zcGVjdGlvbikge1xuICAgICAgICAgICAgICAgIC8vaW5qZWN0IGluc3BlY3Rpb24gc2NyaXB0IGZvciBwcm9wcyBkZXRlY3Rpb25cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX2RvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobG9hZGVyQ29uZmlnLkhUTUwsICd0ZXh0L2h0bWwnKTtcblxuICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBwYXJ0IG9mIEFJIGNvbXBvbmVudHMsIHRoaW5rIGFib3V0IHRoYXQsIGRvY3VtZW50IGl0LlxuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BfcHJldmlld19zY3JpcHQgPSBfZG9jLmdldEVsZW1lbnRCeUlkKCdteW9wX3ByZXZpZXcnKTtcbiAgICAgICAgICAgICAgICBteW9wX3ByZXZpZXdfc2NyaXB0Py5yZW1vdmVBdHRyaWJ1dGUoJ3R5cGUnKTtcblxuICAgICAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBpbmplY3RlZCBIVE1MIHN0cmluZyBpbnRvIGEgbm9kZVxuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXAgPSBfZG9jLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgpO1xuICAgICAgICAgICAgICAgIHRlbXAuYm9keS5pbm5lckhUTUwgPSBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJlZm9yZUtleXNXaW5kb3cgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHdpbmRvdykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3BTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVLZXlzV2luZG93LFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRlbXAuYm9keS5maXJzdENoaWxkO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgJiYgX2RvYy5oZWFkKSB7XG4gICAgICAgICAgICAgICAgICAgIF9kb2MuaGVhZC5pbnNlcnRCZWZvcmUoX2RvYy5pbXBvcnROb2RlKG5vZGUsIHRydWUpLCBfZG9jLmhlYWQuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgSFRNTDJSZW5kZXIgPSBfZG9jLmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgIC8vIGNvbnN0IF9kb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAvLyBjb25zdCB4ID0gX2RvYy5nZXRFbGVtZW50QnlJZCgnbXlvcF9wcmV2aWV3Jyk7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gaWYoeCl7XG4gICAgICAgICAgICAvLyAgICAgeC5yZW1vdmUoKTtcbiAgICAgICAgICAgIC8vICAgICBIVE1MMlJlbmRlciA9IF9kb2MuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHgpO1xuICAgICAgICAgICAgLy8gZGVidWdnZXI7XG5cblxuICAgICAgICAgICAgZG9jLndyaXRlbG4oSFRNTDJSZW5kZXIpO1xuXG4gICAgICAgICAgICAvLyB3aW5kb3cuX19mZWRlcmF0aW9uX18gPVxuICAgICAgICAgICAgLy8gICAgIHsgLi4ud2luZG93Ll9fZmVkZXJhdGlvbl9fLFxuICAgICAgICAgICAgLy8gICAgICAgICAvL1RPRE8gOiBnZXQgZnJvbSBFTlYgYXQgYnVpbGQgdGltZSxcbiAgICAgICAgICAgIC8vICAgICAgICAgLy8gaW5qZWN0IHZhbHVlIHRvIG1vZHVsZSBhdCBidWlsZCB0aW1lXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vIHRvZGF5IHdlIGRvaW5nIHNvIGp1c3QgZm9yIHRoZSBDSlMgdmVyc2lvblxuICAgICAgICAgICAgLy8gICAgICAgICBfX3B1YmxpY19wYXRoX18gOidodHRwczovL2Nkbi5teW9wLmRldi9zZGsvbmV4dCdcbiAgICAgICAgICAgIC8vICAgICAgICAgLC4uLiR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIHdpbmRvdy5fX2ZlZGVyYXRpb25fXylcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAgICAgfTtcblxuICAgICAgICAgICAgLy8gRm9yIG5wbSBwYWNrYWdlIHVzZXJzIHdpdGggYnVuZGxlcnMgKFZpdGUvV2VicGFjayksIGluamVjdCBTREsgaW5saW5lXG4gICAgICAgICAgICAvLyBGb3IgQ0ROIHVzZXJzIChzY3JpcHQgdGFnKSwgdXNlIENETiBVUkxcbiAgICAgICAgICAgIGNvbnN0IHNka1NjcmlwdCA9IEhBU19FTUJFRERFRF9TREtcbiAgICAgICAgICAgICAgICA/IGA8c2NyaXB0PiR7RU1CRURERURfU0RLX0NPTlRFTlR9PC9zY3JpcHQ+YFxuICAgICAgICAgICAgICAgIDogYDxzY3JpcHQgc3JjPVwiJHt3aW5kb3cubXlvcC5fX1JPT1RfU0RLX1BVQkxJQ19VUkxfX31cIj48L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICAvLyBEaWZmZXJlbnQgaW5pdCBzY3JpcHQgZm9yIGVtYmVkZGVkIHZzIENETiBTREtcbiAgICAgICAgICAgIC8vIC0gRW1iZWRkZWQgKGJ1bmRsZWQgSUlGRSk6IHVzZXMgTXlvcFNESy5nZXRJZnJhbWVNb2R1bGUoKSB3aGljaCByZXR1cm5zIG1vZHVsZSBkaXJlY3RseVxuICAgICAgICAgICAgLy8gLSBDRE4gKGR5bmFtaWMgbG9hZGluZyk6IHVzZXMgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSB3aGljaCB3cmFwcyB3aXRoIC5nZXQoKVxuICAgICAgICAgICAgY29uc3QgaW5pdFNjcmlwdCA9IEhBU19FTUJFRERFRF9TREtcbiAgICAgICAgICAgICAgICA/IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbXlvcF9pbml0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaWZyYW1lTW9kdWxlID0gYXdhaXQgTXlvcFNESy5nZXRJZnJhbWVNb2R1bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElmcmFtZVNESyA9IGlmcmFtZU1vZHVsZS5JZnJhbWVTREs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZGsgPSBuZXcgSWZyYW1lU0RLKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZGsuaW5pdCgpO1xuICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICBfX215b3BfaW5pdCgpLnRoZW4oKTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gXG4gICAgICAgICAgICAgICAgOiBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19mZWRlcmF0aW9uX18uX19wdWJsaWNfcGF0aF9fID0gd2luZG93Ll9fZmVkZXJhdGlvbl9fLl9fcHVibGljX3BhdGhfXztcbiAgICAgICAgICAgICAgICAgICBjb25zdCBfX215b3BfaW5pdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2RrID0gbmV3IElmcmFtZVNESygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2RrLmluaXQoKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgX19teW9wX2luaXQoKS50aGVuKCk7XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgZG9jLndyaXRlbG4oYCR7c2RrU2NyaXB0fSR7aW5pdFNjcmlwdH1gKTtcblxuICAgICAgICAgICAgZG9jLmNsb3NlKCk7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBjb250cm9sIGZyb20gZGFzaGJvYXJkXG4gICAgICAgICAgICAvLyAgKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLmF1dG9IZWlnaHQgPSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBjb21wID0gbmV3IE15b3BJZnJhbWVDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAgICAgaWYgKGxvYWRlckNvbmZpZy5hdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXAub2JzZXJ2ZVNpemVCYXNlZE9uRG9jdW1lbnRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vIGNvbXAucHJvcHMuX2dsb2JhbCA9IGNvbXAuZWxlbWVudC5jb250ZW50V2luZG93O1xuICAgICAgICAgICAgcmV0dXJuIGNvbXA7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5ub25lKSB7XG4gICAgICAgICAgICAvLyBwYXJzZXIgPSBwYXJzZXIgPyBwYXJzZXIgOiBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAvLyBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAvLyBlbGVtZW50ID0gZG9jLmJvZHkuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIC8vZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgZG9tSWQpO1xuXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDsvLy50cmltKCk7XG4gICAgICAgICAgICBlbGVtZW50ID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcblxuICAgICAgICAgICAgLy8gICBjb25zdCBmaXJzdEVsZW1lbnQgPSB0ZW1wbGF0ZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgLy8gICBjb25zdCB6ID0gZmlyc3RFbGVtZW50ID8gZmlyc3RFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA6IG51bGw7XG4gICAgICAgICAgICAvLyAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gICBjb25zb2xlLmxvZyh0ZW1wbGF0ZSwgZmlyc3RFbGVtZW50LCB6KVxuICAgICAgICAgICAgLy8gICBlbGVtZW50ID0gZmlyc3RFbGVtZW50XG5cbiAgICAgICAgICAgIC8vIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Rib2R5Jyk7XG4gICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIGNvbnRhaW5lci5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDtcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgPSBjb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayhlbGVtZW50LCBlbGVtZW50KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21FbGVtZW50TmFtZSA9IHRvQ3VzdG9tRWxlbWVudE5hbWUoY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lICsgc2tpbi5pZCk7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgcmVkZWZpbmUgIVxuICAgICAgICAgICAgaWYgKCFzZWVuLmluY2x1ZGVzKGN1c3RvbUVsZW1lbnROYW1lKSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZUN1c3RvbVdlYkNvbXBvbmVudChjdXN0b21FbGVtZW50TmFtZSwgbG9hZGVyQ29uZmlnLkhUTUwsIGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSk7XG4gICAgICAgICAgICAgICAgc2Vlbi5wdXNoKGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIC8vZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29udGFpbmVyLmlkLnN0YXJ0c1dpdGgoJ215b3AtY29tcC0nKSkge1xuICAgICAgICAvLyAgICAgLy8gaW4gcGxhY2UgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChlbGVtZW50KTtcbiAgICAgICAgLy8gICAgIC8vY29udGFpbmVyID0gZWxlbWVudC5wYXJlbnRFbGVtZW50ITtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2N1c3RvbUVsZW1lbnROYW1lfSAvPmA7XG4gICAgICAgIHJldHVybiBuZXcgTXlvcFdlYkNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSAqIGFzIENTUyBmcm9tIFwiY3NzdHlwZVwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuXG4vLyBpZ25vcmluZyBkb2N1bWVudGF0aW9uXG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGludGVyZmFjZSBDU1NQcm9wZXJ0aWVzIGV4dGVuZHMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPiB7XG59XG5cbmV4cG9ydCB0eXBlIFN0eWxlc2hlZXREZWZpbml0aW9uID0geyBba2V5OiBzdHJpbmddOiBDU1NQcm9wZXJ0aWVzIH07XG5cbmV4cG9ydCBjb25zdCBhcHBseVN0eWxlc2hlZXQgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgc3R5bGVzaGVldDogU3R5bGVzaGVldERlZmluaXRpb24sIGNzcz86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHRhZ0lkID0gYG15b3AtY3NzLSR7dXVpZHY0KCl9YDtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfc3R5bGVzaGVldCwgX3RhZ0lkLCBfY3NzfSkgPT4ge1xuICAgICAgICBjb25zdCBzdHlsZVRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIHN0eWxlVGFnLnR5cGUgPSAndGV4dC9jc3MnO1xuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBDU1Mgc3RyaW5nIGZyb20gdGhlIHN0eWxlcyBvYmplY3RcbiAgICAgICAgbGV0IGNzc1N0cmluZyA9IF9jc3M7XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWxlY3RvciBpbiBfc3R5bGVzaGVldCkge1xuICAgICAgICAgICAgY3NzU3RyaW5nICs9IGAke3NlbGVjdG9yfSB7IGA7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gX3N0eWxlc2hlZXRbc2VsZWN0b3JdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgY3NzU3RyaW5nICs9IGAke3Byb3BlcnR5fTogJHtwcm9wZXJ0aWVzW3Byb3BlcnR5XX07IGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjc3NTdHJpbmcgKz0gJ30gJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgQ1NTIHN0cmluZyBhcyB0aGUgY29udGVudCBvZiB0aGUgPHN0eWxlPiBlbGVtZW50XG4gICAgICAgIHN0eWxlVGFnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzc1N0cmluZykpO1xuICAgICAgICBzdHlsZVRhZy5pZCA9IF90YWdJZDtcbiAgICAgICAgLy8gQXBwZW5kIHRoZSA8c3R5bGU+IGVsZW1lbnRcbiAgICAgICAgKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikuYXBwZW5kQ2hpbGQoc3R5bGVUYWcpO1xuXG4gICAgfSwgKCkgPT4ge1xuICAgIH0sIHtcbiAgICAgICAgX3N0eWxlc2hlZXQ6IHN0eWxlc2hlZXQsXG4gICAgICAgIF9jc3MgOiBjc3MgPyBjc3MgOiAnJyxcbiAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgIH0pKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IGRvY3VtZW50KS5nZXRFbGVtZW50QnlJZChfdGFnSWQpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIF90YWdJZDogdGFnSWRcbiAgICAgICAgfSkpXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgYXBwbHlTdHlsZXNoZWV0TGluayA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBsaW5rOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0YWdJZCA9IGBteW9wLWNzcy0ke3V1aWR2NCgpfWA7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7cm9vdFJlZiwgX3RhZ0lkLCBfbGlua30pID0+IHtcbiAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgIGxpbmtFbGVtZW50LmlkID0gX3RhZ0lkO1xuICAgICAgICBsaW5rRWxlbWVudC5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBfbGluaztcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rRWxlbWVudCk7XG5cbiAgICAgICAgLy8gQXBwZW5kIHRoZSA8c3R5bGU+IGVsZW1lbnRcbiAgICAgICAgKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikuYXBwZW5kQ2hpbGQobGlua0VsZW1lbnQpO1xuICAgIH0sICgpID0+IHtcbiAgICB9LCB7XG4gICAgICAgIF9saW5rIDogbGluayxcbiAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgIH0pKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IGRvY3VtZW50KS5nZXRFbGVtZW50QnlJZChfdGFnSWQpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIF90YWdJZDogdGFnSWRcbiAgICAgICAgfSkpXG4gICAgfVxufVxuIiwgImltcG9ydCB7SUlmcmFtZUxvYWRlckNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IHR5cGUgVG9rZW5NYXAgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8IG51bWJlcj5cblxuY29uc3QgcmVwbGFjZVRva2VucyA9IChpbnB1dDogc3RyaW5nLCB0b2tlbk1hcDogVG9rZW5NYXApOiBzdHJpbmcgPT4ge1xuICAgIC8vIENyZWF0ZSBhIHJlZ2V4IHBhdHRlcm4gZnJvbSB0aGUga2V5cyBvZiB0aGUgdG9rZW5NYXBcbiAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyh0b2tlbk1hcCkuam9pbignfCcpLCAnZycpO1xuXG4gICAgLy8gUmVwbGFjZSB0b2tlbnMgaW4gdGhlIGlucHV0IHN0cmluZyB1c2luZyB0aGUgcmVnZXhcbiAgICByZXR1cm4gaW5wdXQucmVwbGFjZShwYXR0ZXJuLCAobWF0Y2hlZCkgPT4ge1xuICAgICAgICAvLyBSZXR1cm4gdGhlIHJlcGxhY2VtZW50IHZhbHVlIGZyb20gdGhlIHRva2VuTWFwXG4gICAgICAgIHJldHVybiAodG9rZW5NYXBbbWF0Y2hlZF0gfHwgbWF0Y2hlZCkudG9TdHJpbmcoKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUlmcmFtZVNraW5CeVRva2VuaXplciA9IChzZWxlY3RlZFNraW46IElTa2luQ29uZmlnLCB0b2tlbk1hcDogVG9rZW5NYXApID0+IHtcbiAgICBjb25zdCB0eXBlZFNraW5Db25maWcgPSAoc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKVxuICAgIGlmICh0eXBlZFNraW5Db25maWcudHlwZSAhPT0gJ0lmcmFtZUxvYWRlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpZnJhbWVTa2luVXJsVG9rZW5pemVyIHJlY2VpdmVkIHNraW4gd2l0aCBsb2FkZXIgdHlwZSBcIiR7dHlwZWRTa2luQ29uZmlnLnR5cGV9XCIsIGN1cnJlbnRseSBvbmx5IFwiSWZyYW1lTG9hZGVyXCIgaXMgc3VwcG9ydGVkYClcbiAgICB9XG5cbiAgICBzZWxlY3RlZFNraW4ubG9hZGVyID0ge1xuICAgICAgICAuLi5zZWxlY3RlZFNraW4ubG9hZGVyXG4gICAgfVxuXG4gICAgc2VsZWN0ZWRTa2luLmxvYWRlci51cmwgPSByZXBsYWNlVG9rZW5zKHNlbGVjdGVkU2tpbi5sb2FkZXIudXJsLCB0b2tlbk1hcCk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRTa2luO1xufVxuXG5leHBvcnQgY29uc3QgY2hhbmdlU2tpblVybEJ5VG9rZW5pemVyID0gKHRva2VuTWFwOiBUb2tlbk1hcCkgPT4ge1xuICAgIHJldHVybiBhc3luYyAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuICAgICAgICByZXR1cm4gY3JlYXRlSWZyYW1lU2tpbkJ5VG9rZW5pemVyKHNlbGVjdGVkU2tpbiwgdG9rZW5NYXApO1xuICAgIH1cbn0iLCAiaW1wb3J0IHtDdXN0b21SZWZNZXNzYWdlfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9ob3N0XCI7XG5cbi8vIGNvbnN0IHNwYWNlID0gJyAnO1xuLy8gZXhwb3J0IGNvbnN0IGdldENsYXNzZXMgPSBhc3luYyAoY29ubmVjdGVkUmVmOiBSZWYpOiBQcm9taXNlPHN0cmluZ1tdPiA9PiAoYXdhaXQgZXhlYyhhY3RBczxIVE1MRGl2RWxlbWVudD4oY29ubmVjdGVkUmVmKS5jbGFzc0xpc3QpKS52YWx1ZS5zcGxpdChzcGFjZSk7XG4vLyBleHBvcnQgY29uc3QgYWRkQ2xhc3MgPSBhc3luYyAoY29ubmVjdGVkUmVmOiBSZWYsIGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4vLyAgICAgY29uc3QgY2xhc3NlcyA9IGF3YWl0IGdldENsYXNzZXMoY29ubmVjdGVkUmVmKTtcbi8vICAgICBjbGFzc2VzLmluY2x1ZGVzKGNsYXNzTmFtZSkgfHwgY2xhc3Nlcy5wdXNoKGNsYXNzTmFtZSk7XG4vLyAgICAgLy8gQHRzLWlnbm9yZVxuLy8gICAgIGNvbm5lY3RlZFJlZi5jbGFzc0xpc3QgPSBjbGFzc2VzLmpvaW4oc3BhY2UpO1xuLy8gfVxuLy8gZXhwb3J0IGNvbnN0IHJlbW92ZUNsYXNzID0gYXN5bmMgKGNvbm5lY3RlZFJlZjogUmVmLCBjbGFzc05hbWU6IHN0cmluZywpID0+IHtcbi8vICAgICBsZXQgY2xhc3NlcyA9IGF3YWl0IGdldENsYXNzZXMoY29ubmVjdGVkUmVmKTtcbi8vICAgICAvLyBAdHMtaWdub3JlXG4vLyAgICAgY29ubmVjdGVkUmVmLmNsYXNzTGlzdCA9IGNsYXNzZXMuZmlsdGVyKGMgPT4gYyAhPT0gY2xhc3NOYW1lKS5qb2luKHNwYWNlKTtcbi8vIH1cbi8vXG4vL1xuXG5leHBvcnQgY29uc3QgYWRkQ2xhc3MgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgY2xhc3NOYW1lOiBzdHJpbmcsIG15b3BJZDogc3RyaW5nKSA9PiB7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIF9jbGFzc05hbWV9KSA9PiB7XG4gICAgICAgIHJlZj8uY2xhc3NMaXN0LmFkZChfY2xhc3NOYW1lKTtcbiAgICB9LCB7XG4gICAgICAgIGVsZW1lbnRJZDogbXlvcElkLFxuICAgICAgICBfY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgICB9KSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVDbGFzcyA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjbGFzc05hbWU6IHN0cmluZywgbXlvcElkOiBzdHJpbmcpID0+IHtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgX2NsYXNzTmFtZX0pID0+IHtcbiAgICAgICAgcmVmPy5jbGFzc0xpc3QucmVtb3ZlKF9jbGFzc05hbWUpO1xuICAgIH0sIHtcbiAgICAgICAgZWxlbWVudElkOiBteW9wSWQsXG4gICAgICAgIF9jbGFzc05hbWU6IGNsYXNzTmFtZVxuICAgIH0pKTtcbn0iLCAiaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZywgSUhUTUxMb2FkZXJDb25maWcsIElSZWZDb25maWcsXG4gICAgSVNraW5Mb2FkZXJDb25maWcsXG4gICAgSVNraW5TZWxlY3RvckNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZywgSVNraW5Db25maWdcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlscy50c1wiO1xuXG5leHBvcnQgY2xhc3MgU2tpbkNvbmZpZyBpbXBsZW1lbnRzIElTa2luQ29uZmlnIHtcbiAgICBfcnVuVGltZUluc3RhbmNlSWQgPSAncnVudGltZS1pbnN0YW5jZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVJZCA9ICdydW50aW1lLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZU5hbWUgPSAncnVudGltZS1uYW1lLScgKyB1dWlkdjQoKTtcblxuICAgIHN0YXRpYyBjcmVhdGUgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgU2tpbkNvbmZpZygpO1xuICAgIH1cblxuICAgIGlkID0gdGhpcy5fcnVuVGltZUlkO1xuICAgIG5hbWUgPSB0aGlzLl9ydW5UaW1lTmFtZTtcbiAgICBkZXNjcmlwdGlvbiA9ICcnO1xuICAgIGxvYWRlciA9IG51bGwgYXMgdW5rbm93biBhcyBJU2tpbkxvYWRlckNvbmZpZztcblxuICAgIHdpdGhMb2FkZXIgPSAobG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aEhUTUxMb2FkZXIgPSAobG9hZGVyOiBPbWl0PElIVE1MTG9hZGVyQ29uZmlnLCAndHlwZSc+KSA9PiB7XG4gICAgICAgIGxvYWRlci50eXBlID0gJ0hUTUxMb2FkZXInO1xuICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgYnVpbGQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBvbmVudENvbmZpZyBpbXBsZW1lbnRzIElDb21wb25lbnRDb25maWcge1xuICAgIF9ydW5UaW1lSW5zdGFuY2VJZCA9ICdydW50aW1lLWluc3RhbmNlLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZUlkID0gJ3J1bnRpbWUtaWQtJyArIHV1aWR2NCgpO1xuICAgIF9ydW5UaW1lTmFtZSA9ICdydW50aW1lLW5hbWUtJyArIHV1aWR2NCgpO1xuXG4gICAgc3RhdGljIGNyZWF0ZSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRDb25maWcoKTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZSA9IHtcbiAgICAgICAgaWQ6IHRoaXMuX3J1blRpbWVJbnN0YW5jZUlkLFxuICAgICAgICBjb21wb25lbnRJZDogdGhpcy5fcnVuVGltZUlkLFxuICAgICAgICBjb21wb25lbnROYW1lOiB0aGlzLl9ydW5UaW1lTmFtZSxcbiAgICAgICAgc2tpblNlbGVjdG9yOiBudWxsIGFzIHVua25vd24gYXMgSVNraW5TZWxlY3RvckNvbmZpZ1xuICAgIH0gYXMgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnO1xuXG4gICAgbmFtZSA9IHRoaXMuX3J1blRpbWVOYW1lXG4gICAgdHlwZSA9IHtcbiAgICAgICAgaWQ6IHRoaXMuX3J1blRpbWVJZCxcbiAgICAgICAgbmFtZTogdGhpcy5fcnVuVGltZU5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgcHJvcHM6IFtdLFxuICAgICAgICByZWZzOiBbXSxcbiAgICAgICAgc2tpbnM6IFtdLFxuICAgICAgICBkZWZhdWx0U2tpbjogMFxuICAgIH0gYXMgSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcblxuICAgIHdpdGhJbnN0YW5jZSA9IChpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aFR5cGUgPSAodHlwZTogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aE5hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhEZWZhdWx0U2tpbiA9IChkZWZhdWx0U2tpbjogSVNraW5Db25maWcpID0+IHtcbiAgICAgICAgdGhpcy50eXBlLnNraW5zLnB1c2goZGVmYXVsdFNraW4pO1xuICAgICAgICB0aGlzLnR5cGUuZGVmYXVsdFNraW4gPSB0aGlzLnR5cGUuc2tpbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICB0eXBlOiAnRGVkaWNhdGVkJyxcbiAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICBpZDogZGVmYXVsdFNraW4uaWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhSZWYgPSAocmVmOiBJUmVmQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMudHlwZS5yZWZzLnB1c2gocmVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aEJhc2ljUmVmID0gKHJlZlNlbGVjdG9yOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgbmV3QmFzaWNSZWYgPSB7XG4gICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICBuYW1lOiByZWZTZWxlY3RvcixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgIHNlbGVjdG9yVHlwZTogJ2lkLWF0dHJpYnV0ZScsXG4gICAgICAgICAgICBzZWxlY3RvcjogcmVmU2VsZWN0b3IsXG4gICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGFzIElSZWZDb25maWdcblxuICAgICAgICB0aGlzLnR5cGUucmVmcy5wdXNoKG5ld0Jhc2ljUmVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgYnVpbGQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMpKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge1xuICAgIElDb21wb25lbnRDb25maWcsXG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnLFxuICAgIElEZWRpY2F0ZWRTa2luQ29uZmlnLFxuICAgIElQcm9wQ29uZmlnLFxuICAgIElTa2luQ29uZmlnLFxuICAgIElVc2VyRmxvdyxcbiAgICBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyxcbiAgICB2Ml9JVmFyaWFudENvbmZpZ1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmNvbnN0IGNvbnZlcnRWMlZhcmlhbnRUb0NvbXBvbmVudENvbmZpZyA9IChjb25maWc6IHYyX0lWYXJpYW50Q29uZmlnKTogSUNvbXBvbmVudENvbmZpZyA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5zdGFuY2U6IHtcbiAgICAgICAgICAgIGlkOiAnYXV0bycsXG4gICAgICAgICAgICBjb21wb25lbnRJZDogY29uZmlnLmNvbXBvbmVudElkLFxuICAgICAgICAgICAgY29tcG9uZW50TmFtZTogY29uZmlnLm5hbWUsXG5cbiAgICAgICAgICAgIHNraW5TZWxlY3Rvcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdEZWRpY2F0ZWQnLFxuICAgICAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdza2luX2F1dG9fdjJfY29udmVydGVkJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWdcblxuICAgICAgICB9IGFzIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyxcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgaWQ6IGNvbmZpZy5pZCxcbiAgICAgICAgICAgIG5hbWU6IGNvbmZpZy5uYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHByb3BzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ2luX2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ215b3BfaW5pdF9pbnRlcmZhY2UnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYW55JyxcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gYXMgSVByb3BDb25maWcsXG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnb3V0X2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ215b3BfY3RhX2hhbmRsZXInLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYW55JyxcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gYXMgSVByb3BDb25maWdcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZWZzOiBbXSxcbiAgICAgICAgICAgIHNraW5zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ3NraW5fYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhhbmRsZSBlbXB0eSA6XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVyOiBjb25maWcuY29uc3VtZV92YXJpYW50WzBdLmxvYWRlclxuICAgICAgICAgICAgICAgIH0gYXMgSVNraW5Db25maWdcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBkZWZhdWx0U2tpbjogMFxuICAgICAgICB9IGFzIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBuYW1lOiBjb25maWcubmFtZVxuICAgIH0gYXMgSUNvbXBvbmVudENvbmZpZztcbn07XG5cbi8qKlxuICogQ2xvdWRSZXBvc2l0b3J5IC0gVW5pZmllZCBjbG91ZCBkYXRhIGFjY2VzcyBsYXllciBmb3IgTXlvcCBjb21wb25lbnRzXG4gKlxuICogU3VwcG9ydHMgYm90aCB2MiAoZGVmYXVsdCkgYW5kIHYxIG1vZGVzOlxuICogLSB2MjogVXNlcyAvY29uc3VtZSBlbmRwb2ludCBmb3IgZmV0Y2hpbmcgdmFyaWFudHNcbiAqIC0gdjE6IFVzZXMgL2Zsb3cgZW5kcG9pbnQgZm9yIGZldGNoaW5nIHVzZXIgZmxvd3NcbiAqL1xuZXhwb3J0IGNsYXNzIENsb3VkUmVwb3NpdG9yeSB7XG4gICAgc3RhdGljIE1haW4gPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KCk7XG5cbiAgICAvLyB2MiBjYWNoZVxuICAgIHByaXZhdGUgdmFyaWFudHM6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8SUNvbXBvbmVudENvbmZpZz4+ID0ge307XG5cbiAgICAvLyB2MSBjYWNoZVxuICAgIHByaXZhdGUgdXNlckZsb3dzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPElVc2VyRmxvdz4+ID0ge307XG5cbiAgICBwcml2YXRlIF9kZWZhdWx0RW52ID0gJ3Byb2R1Y3Rpb24nO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfYmFzZVVybCA9ICdodHRwczovL2Nsb3VkLm15b3AuZGV2Jykge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZGVmYXVsdCBlbnZpcm9ubWVudCBmb3IgdGhpcyBDbG91ZFJlcG9zaXRvcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZXRFbnZpcm9ubWVudChlbnY6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kZWZhdWx0RW52ID0gZW52O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBkZWZhdWx0IGVudmlyb25tZW50XG4gICAgICovXG4gICAgZ2V0RGVmYXVsdEVudmlyb25tZW50KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0RW52O1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PSBWMiBNZXRob2RzIChEZWZhdWx0KSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgY29tcG9uZW50IGlzIGFscmVhZHkgY2FjaGVkL3ByZWxvYWRlZCAodjIpXG4gICAgICovXG4gICAgaXNQcmVsb2FkZWQoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBjYWNoZUtleSA9IGAke2NvbXBvbmVudElkfToke2VudiB8fCB0aGlzLl9kZWZhdWx0RW52fToke3ByZXZpZXcgPyAncHJldmlldycgOiAnbGl2ZSd9YDtcbiAgICAgICAgcmV0dXJuIGNhY2hlS2V5IGluIHRoaXMudmFyaWFudHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSB2MiBjb21wb25lbnQgY29uZmlnXG4gICAgICovXG4gICAgYXN5bmMgZmV0Y2hDb21wb25lbnRWMihjb21wb25lbnRJZDogc3RyaW5nLCBlbnZpcm9ubWVudElkZW50aWZpZXI/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiB7XG4gICAgICAgIGNvbnN0IGVudiA9IGVudmlyb25tZW50SWRlbnRpZmllciB8fCB0aGlzLl9kZWZhdWx0RW52O1xuICAgICAgICBjb25zdCBjYWNoZUtleSA9IGAke2NvbXBvbmVudElkfToke2Vudn06JHtwcmV2aWV3ID8gJ3ByZXZpZXcnIDogJ2xpdmUnfWA7XG5cbiAgICAgICAgaWYgKCF0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudmFyaWFudHNbY2FjaGVLZXldID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IGAke3RoaXMuX2Jhc2VVcmx9L2NvbnN1bWU/aWQ9JHtjb21wb25lbnRJZH0mZW52PSR7ZW52fWA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlldykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAnJnByZXZpZXc9dHJ1ZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YXJpYW50ID0ganNvbi5pdGVtO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBDb21wb25lbnQgXCIke2NvbXBvbmVudElkfVwiIG5vdCBmb3VuZGApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFudC5jb25zdW1lX3ZhcmlhbnQgfHwgIXZhcmlhbnQuY29uc3VtZV92YXJpYW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvbXBvbmVudCBcIiR7Y29tcG9uZW50SWR9XCIgaGFzIG5vIGltcGxlbWVudGF0aW9uIGZvciBlbnZpcm9ubWVudCBcIiR7ZW52fVwiYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Q29uZmlnID0gY29udmVydFYyVmFyaWFudFRvQ29tcG9uZW50Q29uZmlnKHZhcmlhbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjb21wb25lbnRDb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudmFyaWFudHNbY2FjaGVLZXldO1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PSBWMSBNZXRob2RzIChMZWdhY3kpID09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSB2MSBjb21wb25lbnQgZnJvbSBhIGZsb3dcbiAgICAgKi9cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudFYxKGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZD86IHN0cmluZykge1xuICAgICAgICBpZiAoZmxvd0lkKSB7XG4gICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgdGhpcy5mZXRjaEZsb3coZmxvd0lkKTtcbiAgICAgICAgICAgIHJldHVybiBmbG93LmNvbXBvbmVudHMuZmluZChjID0+IGMudHlwZS5pZCA9PT0gY29tcG9uZW50SWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IHRoaXMuZmV0Y2hBdXRvRmxvdyhjb21wb25lbnRJZCk7XG4gICAgICAgICAgICByZXR1cm4gZmxvdy5jb21wb25lbnRzWzBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hBdXRvRmxvdyhjb21wb25lbnRJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vZmxvdz9pZD0ke2NvbXBvbmVudElkfSZhdXRvPXRydWVgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdO1xuICAgIH1cblxuICAgIGFzeW5jIGZldGNoRmxvdyhmbG93SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMudXNlckZsb3dzW2Zsb3dJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tmbG93SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vZmxvdz9pZD0ke2Zsb3dJZH0mcmVzb2x2ZT1jb21wb25lbnRzYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlckZsb3dzW2Zsb3dJZF07XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZmV0Y2hDb21wb25lbnRWMiBvciBmZXRjaENvbXBvbmVudFYxIGV4cGxpY2l0bHlcbiAgICAgKiBEZWZhdWx0cyB0byB2MSBiZWhhdmlvciBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvZGVcbiAgICAgKi9cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudChjb21wb25lbnRJZDogc3RyaW5nLCBmbG93SWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hDb21wb25lbnRWMShjb21wb25lbnRJZCwgZmxvd0lkKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIENsb3VkUmVwb3NpdG9yeSBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBjb25zdCB2Ml9DbG91ZFJlcG9zaXRvcnkgPSBDbG91ZFJlcG9zaXRvcnk7XG4iLCAiZXhwb3J0IGNvbnN0IGV4ZWMgPSBhc3luYyAoZ2V0dGVyOiBhbnkpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2V0dGVyKClcbn1cbiIsICJleHBvcnQgKiBmcm9tIFwiLi9hcHBseVN0eWxlc2hlZXRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2lmcmFtZVNraW5VcmxUb2tlbml6ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NsYXNzTGlzdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uZmlnQnVpbGRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ2xvdWRSZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leGVjXCI7IiwgImltcG9ydCB7ZGVjb21wcmVzc1VVSURzfSBmcm9tIFwiLi4vdXRpbHMvdXVpZC50c1wiO1xuaW1wb3J0IHtDbG91ZFJlcG9zaXRvcnl9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQge1xuICAgIEV4cGVyaWVuY2VUeXBlcyxcbiAgICBJQ29tcG9uZW50Q29uZmlnLCBJRGVkaWNhdGVkU2tpbkNvbmZpZyxcbiAgICBJU2VnbWVudGVkU2tpbkNvbmZpZyxcbiAgICBJU2VnbWVudEV4cGVyaWVuY2UsIElTa2luSW5zdGFuY2VDb25maWcsXG4gICAgU2tpblNlbGVjdG9yVHlwZXNcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY29uc3QgY2hlY2tNeW9wT3ZlcnJpZGUgPSBhc3luYyAoY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnKTogUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnIHwgbnVsbD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIC8vVE9ETzogc3VwcG9ydCBkaXNhYmxpbmcgdGhlIG1lY2hhbmlzbVxuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmwuc2VhcmNoKTtcbiAgICAgICAgY29uc3QgbXlvcE92ZXJyaWRlID0gcGFyYW1zLmdldCgnbXlvcE92ZXJyaWRlJyk7XG4gICAgICAgIGlmIChteW9wT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IFtzb3VyY2UsIC4uLnV1aWRzXSA9IGRlY29tcHJlc3NVVUlEcyhteW9wT3ZlcnJpZGUpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbXBvbmVudCc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2NvbXBvbmVudElkLCBza2luSWRdID0gdXVpZHM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFRvT3ZlcnJpZGUgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaENvbXBvbmVudChjb21wb25lbnRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RvOiBjaGVjayBmZXRjaEF1dG9GbG93LiBMb29rcyBsaWtlIG9ubHkgb25lIHNraW4gaXMgcmV0dXJuZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNraW4gPSBjb21wb25lbnRUb092ZXJyaWRlLnR5cGUuc2tpbnMuZmluZChza2luID0+IHNraW4uaWQgPT09IHNraW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2tpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZG86IGZvciBub3cganVzdCBzZXQgc2tpbiBpZC4gQ2hlY2sgdGhlIGNsb3VkIGltcGxlbWVudGF0aW9uXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2luOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogc2tpbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgSVNraW5JbnN0YW5jZUNvbmZpZ1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUb092ZXJyaWRlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gICAgY2FzZSAnZmxvdyc6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0IDoge1xuICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IFtmbG93SWQsIGV4cGVyaW1lbnRJZF0gPSB1dWlkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2Zsb3dJZCwgZXhwZXJpbWVudElkXSA9IGRlY29tcHJlc3NVVUlEcyhteW9wT3ZlcnJpZGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hGbG93KGZsb3dJZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFRvT3ZlcnJpZGUgPSBmbG93LmNvbXBvbmVudHMuZmluZChjID0+IGMudHlwZS5pZCA9PT0gY29tcG9uZW50Q29uZmlnLnR5cGUuaWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLnR5cGUgPT09IFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZEV4cGVyaWVuY2UgPSBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnJlc29sdmVkRXhwZXJpZW5jZXMuZmluZChlID0+IGUuaWQgPT09IGV4cGVyaW1lbnRJZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkRXhwZXJpZW5jZT8udHlwZSA9PT0gRXhwZXJpZW5jZVR5cGVzLlNlZ21lbnQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRSZXNvbHZlZEV4cGVyaWVuY2UgPSByZXNvbHZlZEV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2tpblNlbGVjdG9yID0gY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgYXMgSVNlZ21lbnRlZFNraW5Db25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0eXBlZFNraW5TZWxlY3Rvci5zZWdtZW50cy5maW5kKHMgPT4gcy5zZWdtZW50SWQgPT09IHR5cGVkUmVzb2x2ZWRFeHBlcmllbmNlLnNlZ21lbnQuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHNlZ21lbnQ/LnNraW5TZWxlY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50VG9PdmVycmlkZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgSG9zdCBTREsgaXMgZGVzaWduZWQgZm9yIGludGVncmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0aGF0IHNlcnZlcyBhcyB0aGUgY29udGFpbmVyIGZvciBNeW9wICBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIEl0IHByb3ZpZGVzIGVzc2VudGlhbCBmdW5jdGlvbmFsaXRpZXMgYW5kIEFQSXMgZm9yIHJlZ2lzdGVyaW5nLCBtYW5hZ2luZywgYW5kIGNvbW11bmljYXRpbmcgd2l0aCBNeW9wIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogVGhpcyBTREsgZW5hYmxlcyBzZWFtbGVzcyBlbWJlZGRpbmcgb2YgaW5kZXBlbmRlbnRseSBkZXZlbG9wZWQgY29tcG9uZW50cyBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uLCBlbnN1cmluZyBzbW9vdGggaW50ZXJvcGVyYWJpbGl0eSBhbmQgY29uc2lzdGVudCB1c2VyIGV4cGVyaWVuY2UgYWNyb3NzIHZhcmlvdXMgTXlvcCBjb21wb25lbnQgaW1wbGVtZW50YXRpb25zLlxuICovXG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7SU15b3BMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRW52ZWxvcGVkTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVzcG9uc2UsIE1lc3NhZ2VEaXJlY3Rpb24sIFJlZlxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcElmcmFtZUxvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9pZnJhbWVMb2FkZXJcIjtcbmltcG9ydCB7V2ViY29tcG9uZW50TG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlclwiO1xuaW1wb3J0IHR5cGUge0lmcmFtZVNES30gZnJvbSBcIi4uL0lmcmFtZVwiO1xuaW1wb3J0IHtjb25uZWN0UHJvcHMsIGNvbm5lY3RSZWZzLCBjcmVhdGVSZWZDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7XG4gICAgRXhwZXJpZW5jZVR5cGVzLFxuICAgIElDb21wb25lbnRDb25maWcsXG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSURlZGljYXRlZFNraW5Db25maWcsIElFeHBlcmllbmNlLCBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudCwgSVNlZ21lbnRlZFNraW5Db25maWcsIElTZWdtZW50RXhwZXJpZW5jZSxcbiAgICBJU2tpbkNvbmZpZywgSVNraW5TZWxlY3RvckNvbmZpZywgU2tpblNlbGVjdG9yVHlwZXMsXG5cblxufSBmcm9tIFwiLi4vY29tbW9uXCI7XG4vLyBAdHMtaWdub3JlIGhhbmRsZWQgYnkgY3VzdG9tIGVzYnVpbGQgcGx1Z2luXG5pbXBvcnQgdmVyc2lvbiBmcm9tIFwibXlvcC1zZGstdmVyc2lvblwiO1xuaW1wb3J0IHtIVE1MQ29tcG9uZW50TG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL0hUTUxDb21wb25lbnRMb2FkZXJcIjtcbmltcG9ydCB7Y2hlY2tNeW9wT3ZlcnJpZGV9IGZyb20gXCIuL215b3BPdmVycmlkZS50c1wiO1xuXG5pbnRlcmZhY2UgY29tcG9uZW50TG9hZGVyQ3JlYXRvciB7XG4gICAgbmV3KGxvYWRlcnM6IElNeW9wTG9hZGVyW10pOiBhbnk7XG59XG5cbi8vIGNvbnN0IGdldENvbXBvbmVudERlZmluaXRpb25Db25maWcgPSBhc3luYyAoaWQ6IHN0cmluZykgPT4ge1xuLy8gICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGBodHRwOi8vbG9jYWxob3N0OjMwMDAvY29tcG9uZW50P2lkPSR7aWR9YCk7XG4vLyAgICAgY29uc3QgY29tcG9uZW50RGVmOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IChhd2FpdCByZXMuanNvbigpKS5pdGVtO1xuLy8gICAgIHJldHVybiBjb21wb25lbnREZWZcbi8vIH1cblxuLy9jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2RmZGxrMnAxbTE4N3YuY2xvdWRmcm9udC5uZXQvbXlvcF9zZGsubWluLmpzJ1xuY29uc3QgX19ST09UX1NES19QVUJMSUNfVVJMX18gPSAnaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQvbXlvcF9zZGsubWluLmpzJ1xuXG4vKipcbiAqIFRoZSBIb3N0IFNESyBpcyBkZXNpZ25lZCBmb3IgaW50ZWdyYXRpb24gd2l0aGluIHRoZSBob3N0IGFwcGxpY2F0aW9uIHRoYXQgc2VydmVzIGFzIHRoZSBjb250YWluZXIgZm9yIE15b3AgIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogSXQgcHJvdmlkZXMgZXNzZW50aWFsIGZ1bmN0aW9uYWxpdGllcyBhbmQgQVBJcyBmb3IgcmVnaXN0ZXJpbmcsIG1hbmFnaW5nLCBhbmQgY29tbXVuaWNhdGluZyB3aXRoIE15b3AgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBUaGlzIFNESyBlbmFibGVzIHNlYW1sZXNzIGVtYmVkZGluZyBvZiBpbmRlcGVuZGVudGx5IGRldmVsb3BlZCBjb21wb25lbnRzIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24sIGVuc3VyaW5nIHNtb290aCBpbnRlcm9wZXJhYmlsaXR5IGFuZCBjb25zaXN0ZW50IHVzZXIgZXhwZXJpZW5jZSBhY3Jvc3MgdmFyaW91cyBNeW9wIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3N0U0RLIHtcbiAgICBzdGF0aWMgSW5zdGFuY2UgPSAoKSA9PiB3aW5kb3cubXlvcC5ob3N0U0RLO1xuXG4gICAgY29tcG9uZW50czJpbml0OiBJTXlvcENvbXBvbmVudFtdID0gW107XG4gICAgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSA9IFtdO1xuICAgIGNvbXBvbmVudHNMb2FkZXJzOiBJTXlvcExvYWRlcltdID0gW107XG5cbiAgICBwdWJsaWMgaW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgdmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICB0eXBlMkluc3RhbmNlQ291bnQ6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBwdWJsaWMgYXNzaWduSWQgPSAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXSkge1xuICAgICAgICAgICAgdGhpcy50eXBlMkluc3RhbmNlQ291bnRbY29tcG9uZW50RGVmaW5pdGlvbi5pZF0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtjb21wb25lbnREZWZpbml0aW9uLmlkfV8keysrdGhpcy50eXBlMkluc3RhbmNlQ291bnRbY29tcG9uZW50RGVmaW5pdGlvbi5pZF19YDtcbiAgICB9XG5cbiAgICAvL1RPRE8gOiBmaXggdGhlIGluc3BlY3QgaW1wbGVtZW50YXRpb24gaW5zaWRlIHJlZkNvbXBvbmVudFxuICAgIC8vdGhlbiBpbnNwZWN0ZWQgbWF5YmUgY2FuIGJlIGRyb3BwZWRcbiAgICBwcml2YXRlIGluc3BlY3RlZCA9IGZhbHNlO1xuICAgIHB1YmxpYyBpbnNwZWN0ID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbnNwZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5pbnNwZWN0ZWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50Lmluc3BlY3QpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5zcGVjdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbmNvbWluZ01lc3NhZ2VIYW5kbGVyID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQ8QmFzZU15b3BNZXNzYWdlPikgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdpbmNvbWluZ01lc3NhZ2VIYW5kbGVyIEdPVCAnLCBldmVudClcbiAgICAgICAgLy9UT0RPIDogIGlmIChldmVudC5vcmlnaW4gIT09IFwiaHR0cDovL2V4YW1wbGUub3JnOjgwODBcIikgcmV0dXJuO1xuICAgICAgICBpZiAoZXZlbnQub3JpZ2luID09PSBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ0kgS25vdyB0aGF0ICEhIScpO1xuICAgICAgICAgICAgLy8gIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvL2NvbnNvbGUubG9nKFwiZXZlbnQgb24gaG9zdCBzaWRlIFwiLCBldmVudCk7XG5cbiAgICAgICAgaWYgKGV2ZW50LmRhdGEubXlvcCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEuZGlyZWN0aW9uICE9PSBNZXNzYWdlRGlyZWN0aW9uLnVwICYmIGV2ZW50LmRhdGEubWVzc2FnZVR5cGUgIT09IE15b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbWVzc2FnZSBkcm9wcGVkIGluIGhvc3RzZGssIGRpcmVjdGlvbiB3YXMgJywgZXZlbnQuZGF0YS5kaXJlY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJldmVudCBvbiBob3N0IHNpZGUgXCIsIGV2ZW50KTtcblxuICAgICAgICAgICAgY29uc3QgbXlvcE1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSA9IGV2ZW50LmRhdGE7XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRSZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQuZm9yRWFjaChjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgSW5pdE1lc3NhZ2UoY29tcG9uZW50LmlkKSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIGNvbXBvbmVudHMgMiBpbml0XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0ID0gdGhpcy5jb21wb25lbnRzMmluaXQuZmlsdGVyKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgIT09IChteW9wTWVzc2FnZSBhcyBJbml0UmVzcG9uc2UpLmNvbnRlbnQuaWQpXG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWF0ZWRDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSAobXlvcE1lc3NhZ2UgYXMgSW5pdFJlc3BvbnNlKS5jb250ZW50Py5pZCk7XG4gICAgICAgICAgICAgICAgaW5pdGlhdGVkQ29tcG9uZW50Py5zZXRJbml0aWF0ZWQoKVxuICAgICAgICAgICAgICAgIC8vaW5pdGlhdGVkQ29tcG9uZW50Py5wYXJlbnQ/LnNldEluaXRpYXRlZCgpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBpcyBpdCB0cnVlIHRvIG5vdCBwYXNzIGZ1cnRoZXIgKCB0byB0aGUgY29tcG9uZW50IClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IG15b3BNZXNzYWdlIGFzIEVudmVsb3BlZE1lc3NhZ2VcbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSB0eXBlZE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRNZXNzYWdlLmRpcmVjdGlvbiA9PT0gTWVzc2FnZURpcmVjdGlvbi5kb3duKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRNZXNzYWdlLm1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IEV4ZWN1dGVDb21wb25lbnRNZXRob2QubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5vbk1lc3NhZ2VSZWNlaXZlZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlZE1lc3NhZ2UubWVzc2FnZS5yb3V0ZSA9IHR5cGVkTWVzc2FnZS5yb3V0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuc2VuZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbm5lckNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IHR5cGVkTWVzc2FnZS5tZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNvbXBvbmVudC5zZW5kKHR5cGVkTWVzc2FnZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyA6IGxvZyA/XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vY29tcG9uZW50LnJlZnMuYm9keS5vbk1lc3NhZ2VSZWNlaXZlZChteW9wTWVzc2FnZS5tZXNzYWdlKTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gbXlvcE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuXG4gICAgICAgICAgICBpZiAoIWNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIC8vbm8gaW4gbWVtIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIC8vcGFzcyB0byBwYXJlbnQgSG9zdFNESyB0byB0cnkgcHJvY2VzcyB0aGVyZVxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5JZnJhbWVTREspIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLLm1lc3NhZ2VUb0hvc3QobXlvcE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm9uTWVzc2FnZVJlY2VpdmVkKG15b3BNZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9ub3QgcHJvY2Vzc2VkIGluIG9uTWVzc2FnZVJlY2VpdmVkXG4gICAgICAgICAgICAgICAgICAgIC8vcGFzcyB0byBwYXJlbnQgSG9zdFNESyB0byB0cnkgcHJvY2VzcyB0aGVyZVxuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93Lm15b3AuSWZyYW1lU0RLKVxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLLm1lc3NhZ2VUb0hvc3QobXlvcE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGV2ZW50LnNvdXJjZS5wb3N0TWVzc2FnZShcbiAgICAgICAgLy8gICAgIFwiaGkgdGhlcmUgeW91cnNlbGYhICB0aGUgc2VjcmV0IHJlc3BvbnNlIFwiICsgXCJpczogcmhlZWVlZXQhXCIsXG4gICAgICAgIC8vICAgICBldmVudC5vcmlnaW4sXG4gICAgICAgIC8vICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3Qgc3ludGhldGljRXZlbnQgPSBuZXcgTWVzc2FnZUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4oJycsXG4gICAgICAgICAgICB7ZGF0YTogbWVzc2FnZX1cbiAgICAgICAgKVxuXG4gICAgICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlSGFuZGxlcihzeW50aGV0aWNFdmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXQgPSAoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnM/OiBjb21wb25lbnRMb2FkZXJDcmVhdG9yW10pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hvc3RTREsgYWxyZWFkeSBpbml0aWF0ZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhc2ljTG9hZGVycyA9IFtcbiAgICAgICAgICAgIG5ldyBNeW9wSWZyYW1lTG9hZGVyKCksXG4gICAgICAgICAgICBuZXcgV2ViY29tcG9uZW50TG9hZGVyKCksXG4gICAgICAgICAgICBuZXcgSFRNTENvbXBvbmVudExvYWRlcigpXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycyA9IFtcbiAgICAgICAgICAgIC4uLmJhc2ljTG9hZGVyc1xuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycykge1xuICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlckJ5VHlwZTogUmVjb3JkPHN0cmluZywgSU15b3BMb2FkZXI+ID0ge307XG5cbiAgICAgICAgICAgIGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzLmZvckVhY2goY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvciA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tTG9hZGVyID0gbmV3IGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3IodGhpcy5jb21wb25lbnRzTG9hZGVycyk7XG4gICAgICAgICAgICAgICAgbG9hZGVyQnlUeXBlW2N1c3RvbUxvYWRlci50eXBlXSA9IGN1c3RvbUxvYWRlcjtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMuZm9yRWFjaChsb2FkZXIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghbG9hZGVyQnlUeXBlW2xvYWRlci50eXBlXSlcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVyQnlUeXBlW2xvYWRlci50eXBlXSA9IGxvYWRlcjtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMgPSBPYmplY3QudmFsdWVzKGxvYWRlckJ5VHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmNvbW1pbmcgbWVzc2FnZXMgZnJvbSBJRnJhbWVzXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgXCJtZXNzYWdlXCIsXG4gICAgICAgICAgICB0aGlzLmluY29taW5nTWVzc2FnZUhhbmRsZXIsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zb2xlLmxvZygnbXlvcCBob3N0U0RLIGluaXRpYXRlZCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICB0aGlzLmluaXRpYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0U2tpbklkQnlTa2luU2VsZWN0b3IgPSBhc3luYyAoc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnLCBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXSA9IFtdLCBob29rcz86IGxvYWRlckhvb2tzKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gYXN5bmNGaW5kPFQ+KFxuICAgICAgICAgICAgYXJyYXk6IFRbXSxcbiAgICAgICAgICAgIHByZWRpY2F0ZTogKGl0ZW06IFQpID0+IFByb21pc2U8Ym9vbGVhbj5cbiAgICAgICAgKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXJyYXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXdhaXQgcHJlZGljYXRlKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIFJldHVybiB1bmRlZmluZWQgaWYgbm8gbWF0Y2ggaXMgZm91bmRcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoc2tpblNlbGVjdG9yLnR5cGUpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNhc2UgXCJEZWRpY2F0ZWRTa2luXCIgOiAvL2JhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgIGNhc2UgU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkOiB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU2tpbklkID0gKHNraW5TZWxlY3RvciBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZykuc2tpbj8uaWRcbiAgICAgICAgICAgICAgICAgICAgfHwgKHNraW5TZWxlY3RvciBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZykuc2tpbnMhWzBdLmlkO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkU2tpbklkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQ6IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFNraW5TZWxlY3RvciA9IChza2luU2VsZWN0b3IgYXMgSVNlZ21lbnRlZFNraW5Db25maWcpXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IGF3YWl0IGFzeW5jRmluZCh0eXBlZFNraW5TZWxlY3Rvci5zZWdtZW50cywgYXN5bmMgc2VnbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50LnNlZ21lbnRJZCA9PT0gJ0RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cGVyaWVuY2UgPSBleHBlcmllbmNlcy5maW5kKGV4cGVyaWVuY2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVyaWVuY2UudHlwZSA9PT0gRXhwZXJpZW5jZVR5cGVzLlNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlKS5zZWdtZW50LmlkID09PSBzZWdtZW50LnNlZ21lbnRJZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4cGVyaWVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImV4cGVyaWVuY2Ugbm90IGZvdW5kXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRFeHBlcmllbmNlID0gZXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2VnbWVudCA9ICh0eXBlZEV4cGVyaWVuY2Uuc2VnbWVudCBhcyBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudClcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50RnVuY3Rpb24gPSAoaG9va3MgPyBob29rcyA6IHt9KVt0eXBlZFNlZ21lbnQuZnVuY3Rpb25dO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgc2VnbWVudEZ1bmN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybihgc2VnbWVudElkOiR7c2VnbWVudC5zZWdtZW50SWR9LCAke3R5cGVkU2VnbWVudC5mdW5jdGlvbn0gZnVuY3Rpb24gbm90IHByb3ZpZGVkICFgKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTa2luSWRCeVNraW5TZWxlY3RvcihzZWdtZW50LnNraW5TZWxlY3RvciwgZXhwZXJpZW5jZXMpO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnIC8vVE9ET1xuICAgIH1cblxuICAgIHByaXZhdGUgcnVuU2tpblNlbGVjdG9yID0gYXN5bmMgKGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgaG9va3M/OiBsb2FkZXJIb29rcykgPT4ge1xuICAgICAgICBjb25zdCBza2luSWQgPSBhd2FpdCB0aGlzLl9nZXRTa2luSWRCeVNraW5TZWxlY3Rvcihjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLCBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcywgaG9va3MpO1xuICAgICAgICByZXR1cm4gY29tcG9uZW50Q29uZmlnLnR5cGUuc2tpbnMuZmluZChza2luID0+IHNraW4uaWQgPT09IHNraW5JZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRlckhvb2tzPzogbG9hZGVySG9va3M7XG5cbiAgICBwdWJsaWMgbG9hZENvbXBvbmVudCA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4oY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb250YWluZXI/OiBIVE1MRWxlbWVudCB8IFJlZiwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpOlxuICAgICAgICBQcm9taXNlPFQ+ID0+IHtcblxuICAgICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGNvbnRhaW5lciB3YXMgZm91bmQgZm9yIHRoaXMgY29tcG9uZW50Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdmVycmlkZGVuQ29uZmlnID0gYXdhaXQgY2hlY2tNeW9wT3ZlcnJpZGUoY29tcG9uZW50Q29uZmlnKTtcbiAgICAgICAgaWYgKG92ZXJyaWRkZW5Db25maWcpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IGxvZ1xuICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnID0gb3ZlcnJpZGRlbkNvbmZpZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy8gaWYgKCFjb250YWluZXIuX19ub25Qcm94aWVkKSB7XG4gICAgICAgIC8vICAgICBjb25zdCByZWZDb21wb25lbnQgPSAoY29udGFpbmVyIGFzIHVua25vd24gYXMgTXlvcFJlZkNvbXBvbmVudCk7XG4gICAgICAgIC8vICAgICAvL2lmIHdlIGdvdCBsb2FkQ29tcG9uZW50IG92ZXIgTXlvcFJlZkNvbXBvbmVudFxuICAgICAgICAvLyAgICAgaWYgKHJlZkNvbXBvbmVudC5pZCAmJiByZWZDb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMubG9hZENvbXBvbmVudChjb21wb25lbnRDb25maWcsIHJlZkNvbXBvbmVudC5yZWYsIG9wdGlvbnMpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIC8vIGxldCByb290Q29tcG9uZW50OiBJTXlvcENvbXBvbmVudCA9IHJlZkNvbXBvbmVudDtcbiAgICAgICAgLy8gICAgICAgICAvLyB3aGlsZSghcm9vdENvbXBvbmVudC5lbGVtZW50ICYmIHJvb3RDb21wb25lbnQucGFyZW50KXtcbiAgICAgICAgLy8gICAgICAgICAvLyAgICAgcm9vdENvbXBvbmVudCA9IHJvb3RDb21wb25lbnQucGFyZW50XG4gICAgICAgIC8vICAgICAgICAgLy8gfVxuICAgICAgICAvLyAgICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgLy8gcm9vdENvbXBvbmVudC5lbGVtZW50XG4gICAgICAgIC8vICAgICAgICAgLy8gLy93aGF0IG5vdyA/XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICBjb25zdCBob29rcyA9IHsuLi4odGhpcy5sb2FkZXJIb29rcyA/PyB7fSksIC4uLihvcHRpb25zPy5ob29rcyA/PyB7fSl9O1xuXG4gICAgICAgIGNvbnN0IHJlZiA9IGNvbnRhaW5lciBhcyBSZWY7XG4gICAgICAgIGlmIChyZWYubXlvcCkge1xuICAgICAgICAgICAgaWYgKHJlZi5jb21wb25lbnQpIHtcblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZyA9IHsuLi5jb21wb25lbnRDb25maWd9O1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY29tcG9uZW50Q29uZmlnLmluc3RhbmNlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU2tpbiA9IGF3YWl0IHRoaXMucnVuU2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZywgaG9va3MpIVxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRTa2luKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJ1blNraW5TZWxlY3RvciBmYWlsZWQgdG8gY2hvb3NlIHNraW4sIGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWdcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/Lmhvb2tzPy5hZnRlclNraW5TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFNraW4gPSBhd2FpdCBvcHRpb25zLmhvb2tzLmFmdGVyU2tpblNlbGVjdGVkKHsuLi5zZWxlY3RlZFNraW59KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgIHNraW46IHNlbGVjdGVkU2tpblxuICAgICAgICAgICAgICAgICAgICAvLyAgc2tpbnM6IFtzZWxlY3RlZFNraW5dXG4gICAgICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHsuLi5vcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgb3B0aW9ucy5ob29rc1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IGF3YWl0IGNyZWF0ZVJlZkNvbXBvbmVudDxUPihyZWYsIGNvbXBvbmVudENvbmZpZywgdGhpcy5jb21wb25lbnRzLCBvcHRpb25zKTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNvbm5lY3QgcmVmcyBhbmQgcHJvcHMgaW5zb2RlIGNyZWF0ZVJlZkNvbXBvbmVudCwgZWxzZXdoZXJlIGl0cyBub3QgcmVhbGx5IDxUPlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZDb21wb25lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbG9hZCBjb21wb25lbnQgZ290IGEgZGV0YWNoZWQgcmVmLicpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIGNob29zZSBza2luIG9uIHJ1bnRpbWUgLi4uXG4gICAgICAgICAqICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLnR5cGVcbiAgICAgICAgICovXG5cbiAgICAgICAgbGV0IHNlbGVjdGVkU2tpbiA9IGF3YWl0IHRoaXMucnVuU2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZywgaG9va3MpIVxuXG4gICAgICAgIGlmICghc2VsZWN0ZWRTa2luKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJydW5Ta2luU2VsZWN0b3IgZmFpbGVkIHRvIGNob29zZSBza2luLCBjaGVjayB0aGUgcHJvdmlkZWQgY29uZmlnXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/Lmhvb2tzPy5hZnRlclNraW5TZWxlY3RlZCkge1xuICAgICAgICAgICAgc2VsZWN0ZWRTa2luID0gYXdhaXQgb3B0aW9ucy5ob29rcy5hZnRlclNraW5TZWxlY3RlZCh7Li4uc2VsZWN0ZWRTa2lufSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9uZW50TG9hZGVyID0gdGhpcy5jb21wb25lbnRzTG9hZGVycy5maW5kKGxvYWRlciA9PiBsb2FkZXIudHlwZSA9PT0gc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlKTtcblxuICAgICAgICBpZiAoIWNvbXBvbmVudExvYWRlcikge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIGxvYWRlciBcIiR7c2VsZWN0ZWRTa2luLmxvYWRlci50eXBlfVwiIHdhcyBmb3VuZCBmb3IgY29tcG9uZW50YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2ZvciBsb2FkZWQgd2ViY29tcG9uZW50IG1vZHVsZXMgdG8gZm9sbG93aW5nIGxpbmUgY3JlYXRlcyBhIHJhY2UgY29uZGl0aW9uIHdpdGggdGhlIGluaXQgbWVzc2FnZSBmbG93XG4gICAgICAgIGxldCBjb21wb25lbnQgPSBhd2FpdCBjb21wb25lbnRMb2FkZXIubG9hZChjb21wb25lbnRDb25maWcudHlwZSwgc2VsZWN0ZWRTa2luLCBjb250YWluZXIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIFRPRE8gOiB3aGVuIHRoaXMgaXMgbm90IHRydWUgP1xuICAgICAgICBpZiAoIWNvbXBvbmVudC5pc0luaXRpYXRlZClcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0LnB1c2goY29tcG9uZW50KVxuXG4gICAgICAgIGNvbXBvbmVudC5iaW5kKCdvbkRpc3Bvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjb21wb25lbnQgZGlzcG9zZScsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMuZmlsdGVyKGMgPT4gYyAhPT0gY29tcG9uZW50KVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoYyA9PiBjICE9PSBjb21wb25lbnQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuXG4gICAgICAgIC8vIHRydWUgYnkgZGVmYXVsdFxuICAgICAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5jb25uZWN0UHJvcHMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBtYWtlIHR5cGUgZmllbGQgY29uZGl0aW9uYWwgdHlwZSBpbmZlciBcInN0cmluZ1wiID4gc3RyaW5nLCBcIm51bWJlclwiID4gbnVtYmVyLCBldGMuLi5cbiAgICAgICAgICAgIGNvbXBvbmVudCA9IGNvbm5lY3RQcm9wcyhjb21wb25lbnQsIGNvbXBvbmVudENvbmZpZy50eXBlLnByb3BzLCBzZWxlY3RlZFNraW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vVE9ETyA6IG1ha2Ugb3B0aW9uYWw/XG4gICAgICAgICAgICAvL1RPRE8gOiBmaXggaXNzdWVzIHdpdGggdGltZW91dCBhbmQgd3JvbmcgcmVmIG5hbWVzIGZyb20gY29uZmlnIHZzIGN1cnJlbnQgc2tpblxuICAgICAgICAgICAgYXdhaXQgY29ubmVjdFJlZnMoY29tcG9uZW50LCBjb21wb25lbnRDb25maWcsIHRoaXMuY29tcG9uZW50cyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gVE9PRCA6IHRocm93ID9cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdGlvbnM/LnNraXBJbml0KVxuICAgICAgICAgICAgYXdhaXQgY29tcG9uZW50LmluaXRpYXRlZCgpO1xuXG4gICAgICAgIHJldHVybiBjb21wb25lbnQgYXMgVDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmF2aWdhdGUgPSBhc3luYyA8VCBleHRlbmRzIElNeW9wQ29tcG9uZW50ID0gSU15b3BDb21wb25lbnQ+KGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIG5ld0NvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgb3B0aW9ucz86IG5hdmlnYXRpb25PcHRpb25zKSA9PiB7XG4gICAgICAgIGlmIChjb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05hdmlnYXRpbmcgb24gcmVtb3RlIHJlZiBjb21wb25lbnRzIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29tcG9uZW50Lm1hcmtlZEZvckRpc3Bvc2VkID0gdHJ1ZTtcblxuICAgICAgICAvLyBpZiAob3B0aW9ucz8uaW5wbGFjZSkge1xuICAgICAgICAvLyAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgIC8vICAgICAgICAgbGV0IG5ld0NvbXBvbmVudCA9IGF3YWl0IHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5lbGVtZW50KTtcbiAgICAgICAgLy8gICAgICAgICBhd2FpdCBuZXdDb21wb25lbnQuaW5pdGlhdGVkKCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgaWYgKG9wdGlvbnMuaW5pdClcbiAgICAgICAgLy8gICAgICAgICAgICAgYXdhaXQgb3B0aW9ucy5pbml0KG5ld0NvbXBvbmVudCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIG5ld0NvbXBvbmVudDtcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCcuLi4nKVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LnN0YWdlZCkge1xuICAgICAgICAgICAgLy9jb25zdCBzZWxlY3RlZFNraW4gPSB0aGlzLnJ1blNraW5TZWxlY3RvcihuZXdDb21wb25lbnRDb25maWcpXG4gICAgICAgICAgICBsZXQgbmV3Q29tcG9uZW50ID0gYXdhaXQgdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmNvbnRhaW5lciwge1xuICAgICAgICAgICAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZWxhdGl2ZToge2RpcmVjdGlvbjogJ2FmdGVyJywgY2hpbGQ6IGNvbXBvbmVudC5lbGVtZW50IX0sXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmluaXQpXG4gICAgICAgICAgICAgICAgYXdhaXQgb3B0aW9ucy5pbml0KG5ld0NvbXBvbmVudCk7XG5cbiAgICAgICAgICAgIG5ld0NvbXBvbmVudC5zaG93KCk7XG4gICAgICAgICAgICBjb21wb25lbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld0NvbXBvbmVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gY29tcG9uZW50LmVsZW1lbnQhLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICBjb21wb25lbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5jb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICByZWxhdGl2ZToge1xuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246IFwiYmVmb3JlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkOiBuZXh0U2libGluZyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBuYXZpZ2F0aW9uT3B0aW9ucyA9IHtcbiAgICBzdGFnZWQ/OiBib29sZWFuLFxuICAgIC8vaW5wbGFjZT86IGJvb2xlYW4sXG4gICAgaW5pdD86IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50KSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgc2tpcEluaXQ/OiBib29sZWFuXG59ICYgbG9hZGVyT3B0aW9uc1xuXG50eXBlIHJlbGF0aXZlTG9hZENvbmZpZ0RpcmVjdGlvbiA9ICdiZWZvcmUnIHwgJ2FmdGVyJztcblxuXG5leHBvcnQgdHlwZSBsb2FkZXJIb29rcyA9IHtcbiAgICBhZnRlclNraW5TZWxlY3RlZD86IChzZWxlY3RlZFNraW46IElTa2luQ29uZmlnKSA9PiBQcm9taXNlPElTa2luQ29uZmlnPlxufSAmXG4gICAgLy8gc2VnbWVudGF0aW9uIGhvb2tzXG4gICAgKHsgW2tleTogc3RyaW5nXTogKCkgPT4gUHJvbWlzZTxib29sZWFuPiB8IGJvb2xlYW4gfSB8IHt9KVxuXG4vL1RPRE86IHN1cHBvcnQgc2VyaWFsaXphYmxlIHZlcnNpb24gb2YgdGhhdCBvYmplY3RcbmV4cG9ydCBpbnRlcmZhY2UgcmVsYXRpdmVMb2FkQ29uZmlnIHtcbiAgICAvL0lmIHRoaXMgaXMgbnVsbCwgdGhlbiBuZXdOb2RlIGlzIGluc2VydGVkIGF0IHRoZSBlbmQgb2Ygbm9kZSdzIGNoaWxkIG5vZGVzLlxuICAgIC8vaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05vZGUvaW5zZXJ0QmVmb3JlXG4gICAgY2hpbGQ6IENoaWxkTm9kZSB8IG51bGxcbiAgICBkaXJlY3Rpb246IHJlbGF0aXZlTG9hZENvbmZpZ0RpcmVjdGlvblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFbnZpcm9ubWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbnR5cGUgRWxlbWVudEF0dHJpYnV0ZXMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCB8IG51bGw7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIGxvYWRlck9wdGlvbnMge1xuICAgIGlkPzogc3RyaW5nXG4gICAgaGlkZGVuPzogYm9vbGVhblxuICAgIGNvbm5lY3RQcm9wcz86IGJvb2xlYW5cbiAgICB0aW1lb3V0PzogbnVtYmVyXG4gICAgc2tpcEluaXQ/OiBib29sZWFuXG4gICAgcmVsYXRpdmU/OiByZWxhdGl2ZUxvYWRDb25maWdcbiAgICBob29rcz86IGxvYWRlckhvb2tzXG4gICAgZWxlbWVudEF0dHJpYnV0ZXM/OiBFbGVtZW50QXR0cmlidXRlc1xuICAgIF9lbnZpcm9ubWVudD86IElFbnZpcm9ubWVudFxuICAgIF9oYXNQYXJlbnQ/OiBib29sZWFuXG4gICAgX2luc3BlY3Rpb24/OiBib29sZWFuXG59XG5cbmlmICghd2luZG93Lm15b3ApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fXG4gICAgfTtcbn1cblxuaWYgKCF3aW5kb3cubXlvcC5ob3N0U0RLKSB7XG4gICAgY29uc3QgX2hvc3RTREsgPSBuZXcgSG9zdFNESygpO1xuICAgIC8vVE9ETzogZW5hYmxlIGxhenkgaW5pdD9cbiAgICBfaG9zdFNESy5pbml0KCk7XG5cbiAgICBpZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgICAgICB9O1xuICAgIH1cbiAgICB3aW5kb3cubXlvcC5ob3N0U0RLID0gX2hvc3RTREs7XG59XG5cbi8vIEB0cy1pZ25vcmVcbmV4cG9ydCBjb25zdCBob3N0U0RLOiBIb3N0U0RLID0gd2luZG93Lm15b3AuaG9zdFNESztcblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnaG9zdFNESycsIGhvc3RTREspO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIG15b3A6IHtcbiAgICAgICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fOiBzdHJpbmcsXG4gICAgICAgICAgICBob3N0U0RLOiBIb3N0U0RLLFxuICAgICAgICAgICAgSWZyYW1lU0RLOiBJbnN0YW5jZVR5cGU8dHlwZW9mIElmcmFtZVNESz5cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyLCBJRWxlbWVudFJlZiwgTXlvcEVsZW1lbnRSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UsIERldGVjdE15b3BSZWZzTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRGV0ZWN0TXlvcFJlZnNNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAobWVzc2FnZTogRGV0ZWN0TXlvcFJlZnNNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfV1gKTtcbiAgICAgICAgLy9jb25zdCBhbGxNeW9wSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAqYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBJRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgLy9sZXQgY291bnRlcnM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcblxuICAgICAgICBhbGxNeW9wSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgaWYgKG15b3BJZCkge1xuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSlcbiAgICAgICAgICAgIH0gLy9lbHNlIHtcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWNvdW50ZXJzW2l0ZW0udGFnTmFtZV0pIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgY291bnRlcnNbaXRlbS50YWdOYW1lXSA9IDA7XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIGNvdW50ZXJzW2l0ZW0udGFnTmFtZV0gPSBjb3VudGVyc1tpdGVtLnRhZ05hbWVdICsgMTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgICAgbXlvcFJlZnMucHVzaChuZXcgWFBhdGhFbGVtZW50UmVmKGAke2l0ZW0udGFnTmFtZX0oJHtjb3VudGVyc1tpdGVtLnRhZ05hbWVdfSlgLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UobWVzc2FnZS5oYW5kbGVyVW5pcXVlSWQsIG15b3BSZWZzKSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtCaW5kQ2xpY2tNZXNzYWdlLCBDbGlja1JlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBCaW5kQ2xpY2tNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKCksIGV2ZW50KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsZWFuVXBUYXNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goY2xlYW5VcFRhc2spO1xuICAgICAgICB9KTtcblxuICAgICAgICAvL2NsZWFuIHVwXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgTXlvcE1lc3NhZ2VzIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8Q2hhbmdlVGV4dE1lc3NhZ2U+IHtcbiAgXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ2hhbmdlVGV4dE1lc3NhZ2U7XG4gICAgXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IENoYW5nZVRleHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGl0ZW0udGV4dENvbnRlbnQgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXIsIFJvb3RSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRXhlY3V0ZVNjcmlwdE1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCByZXBsaWVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgZGF0YSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IoZXZlbnQsIHJlcGxpZXIsIG5ldyBSb290UmVmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLCBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5BZGRFdmVudExpc3RlbmVyTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKG1lc3NhZ2U6IEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlKSA9PiB7XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKG1lc3NhZ2UucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogYW55W10gPSBbXTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy9UT0RPOiB0aGluayBhYm91dCB0aGF0IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZShtZXNzYWdlLmhhbmRsZXJVbmlxdWVJZCwgbWFrZVNlcmlhbGl6YWJsZShlLCBtZXNzYWdlLnNlcmlhbGl6YWJsZVNrZWxldG9uKSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihtZXNzYWdlLnR5cGUsIGhhbmRsZXIpXG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKG1lc3NhZ2UudHlwZSwgaGFuZGxlcilcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4ge1xuICAgICAgICAgICAgICAgIHRhc2soKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldEF0dHJpYnV0ZU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3Mgc2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxTZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFNldEF0dHJpYnV0ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSwgZXZlbnQudmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7SG9zdFNES30gZnJvbSBcIi4uLy4uL2hvc3QvaG9zdFNES1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UudHNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgY3JlYXRlUmVmID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy9UT0RPIDogdXNlIHJlZiBoZWxwZXIgaGVyZVxuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuICAgICAgICAgICAgaWYgKGFsbEl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RTREsgPSBIb3N0U0RLLkluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gYXdhaXQgaG9zdFNESy5sb2FkQ29tcG9uZW50KGV2ZW50Lm5lc3RlZENvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuaXRlbSgwKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucylcblxuICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgaXQgdG8gcGFzcyB0aGUgYXNzaWduZWQgaWRzXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkUmVmQ29uZmlnOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmVmQ29tcG9uZW50LnJlZnMpLmZvckVhY2gocmVmTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWYgPSByZWZDb21wb25lbnQucmVmc1tyZWZOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgcmVmID0gcmVmLl9fbm9uUHJveGllZCB8fCByZWY7XG5cbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlZkNvbmZpZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbmVzdGVkUmVmQ29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIC0gRE9NIGVsZW1lbnQgbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgW10sIHRydWUpKTtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNyZWF0ZVJlZigpLnRoZW4oKTtcbiAgICAgICAgLy9yZXR1cm5pbmcgdW5kZWZpbmVkIHNvIGl0IHdvbid0IGFjdCBhcyBhIGNsZWFudXBcbiAgICB9XG59XG4iLCAiLy8gQHRzLW5vY2hlY2tcbmV4cG9ydCBjb25zdCBvYnNlcnZlRE9NID0gKG9iajogSFRNTEVsZW1lbnQgfCBudWxsLCBjYWxsYmFjazogKG11dGF0aW9uUmVjb3Jkcz86IE11dGF0aW9uUmVjb3JkW10pID0+IHZvaWQpID0+IHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgICBjb25zb2xlLmxvZygnbicpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBNdXRhdGlvbk9ic2VydmVyID0gd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgfHwgd2luZG93LldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG5cbiAgICBpZiAoIW9iaiB8fCBvYmoubm9kZVR5cGUgIT09IDEpIHJldHVybjtcblxuICAgIGlmIChNdXRhdGlvbk9ic2VydmVyKSB7XG4gICAgICAgIC8vIGRlZmluZSBhIG5ldyBvYnNlcnZlclxuICAgICAgICBjb25zdCBtdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spXG4gICAgICAgIC8vIGhhdmUgdGhlIG9ic2VydmVyIG9ic2VydmUgZm9yIGNoYW5nZXMgaW4gY2hpbGRyZW5cbiAgICAgICAgY29uc3QgY29uZmlnID0ge2F0dHJpYnV0ZXM6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZX07XG4gICAgICAgIG11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZShvYmosIGNvbmZpZylcbiAgICAgICAgcmV0dXJuIG11dGF0aW9uT2JzZXJ2ZXJcbiAgICB9XG5cbiAgICAvLyBicm93c2VyIHN1cHBvcnQgZmFsbGJhY2tcbiAgICBlbHNlIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZUluc2VydGVkJywgY2FsbGJhY2ssIGZhbHNlKVxuICAgICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZVJlbW92ZWQnLCBjYWxsYmFjaywgZmFsc2UpXG4gICAgfVxufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge29ic2VydmVET019IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvZG9tT2JzZXJ2ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFNldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuc291cmNlKSB7XG4gICAgICAgICAgICBvYnNlcnZlRE9NKGRvY3VtZW50LmJvZHksICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlKClcbiAgICAgICAgICAgICAgICAgICAgLy8gIG5ldyBFbnZlbG9wZWRNZXNzYWdlKGV2ZW50LnNvdXJjZSEsIG5ldyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSgpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlLCBGb3JtRGF0YUVudHJ5LCBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBJbnB1dEVsZW1lbnRWYWx1ZSx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5jb25zdCBnZXRJbnB1dFZhbHVlID0gKGVsZW1lbnQpOiBJbnB1dEVsZW1lbnRWYWx1ZSA9PiB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBmb3JtXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBkYXRhT2JqZWN0OiBJbnB1dEVsZW1lbnRWYWx1ZSA9IHtcbiAgICAgICAgICAgIGZvcm1EYXRhOiB7fSxcbiAgICAgICAgICAgIHVubWFwcGVkRGF0YTogW11cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBNYW51YWxseSBhZGQgZWxlbWVudHMgd2l0aG91dCBuYW1lc1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKTtcbiAgICAgICAgbGV0IGF1dG9OYW1lSW5kZXhlciA9IC0xO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcElkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gYF8keygrK2F1dG9OYW1lSW5kZXhlcil9YFxuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZURhdGE6IEZvcm1EYXRhRW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRJbnB1dFZhbHVlKGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZWxlbWVudC5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHk6IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudC52YWxpZGl0eSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgIG15b3BJZCxcbiAgICAgICAgICAgICAgICB9O1xuXG5cbiAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBpZighZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSB8fCAhZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSB8fCBub2RlRGF0YS52YWx1ZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjaGVja2JveCBvciByYWRpbyBidXR0b25cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW1lbnQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jaGVja2VkID8gZWxlbWVudC52YWx1ZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGlucHV0IGFuZCB0ZXh0YXJlYSBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC50YWdOYW1lID09PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWxlY3QgZWxlbWVudHMgKGRyb3Bkb3ducylcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0VMRUNUJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZWRpdGFibGUgZGl2cyAoY29udGVudEVkaXRhYmxlKVxuICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmlubmVyVGV4dCB8fCBlbGVtZW50LnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYW4gdW5zdXBwb3J0ZWQgZWxlbWVudCB0eXBlXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogR2V0RWxlbWVudFZhbHVlTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgZ2V0SW5wdXRWYWx1ZShpdGVtKVxuICAgICAgICAgICAgKSwgZXZlbnQpO1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0dldEF0dHJpYnV0ZU1lc3NhZ2UsIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRGaXJzdEVsZW1lbnRCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgR2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxHZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5HZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEdldEF0dHJpYnV0ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGdldEZpcnN0RWxlbWVudEJ5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpXG4gICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UoaXRlbS5nZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSkpLCBldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtSZXNpemVPYnNlcnZlck1lc3NhZ2UsIFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZX0gZnJvbSAnLi4vLi4vbWVzc2FnZXMnXG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRSZXNpemVPYnNlcnZlckhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8U2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlXG5cbiAgICBleGVjdXRvciA9IChldmVudDogU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICAvL1RPRE8gOiBwYXNzIHRoZSBoZWlnaHRcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVzaXplT2JzZXJ2ZXJNZXNzYWdlKCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5KTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldElubmVySHRtbH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWxIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFNldElubmVySHRtbD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0SW5uZXJIdG1sO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFNldElubmVySHRtbCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpdGVtLmlubmVySFRNTCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgSWZyYW1lIFNESyBpcyBpbnRlbmRlZCBmb3Igc2NlbmFyaW9zIHdoZXJlIGRldmVsb3BlcnMgd2lzaCB0byBpbXBsZW1lbnQgTXlvcCBjb21wb25lbnRzIGFzIHNlcGFyYXRlIHdlYiBhcHBsaWNhdGlvbnMgaG9zdGVkIHdpdGhpbiBpZnJhbWVzLjxici8+PGJyLz5cbiAqIEJ5IGltcG9ydGluZyB0aGUgSWZyYW1lIFNESywgZGV2ZWxvcGVycyBnYWluIGFjY2VzcyB0byB0b29scyBhbmQgdXRpbGl0aWVzIG5lY2Vzc2FyeSBmb3IgaGFuZGxpbmcgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBob3N0IGFwcGxpY2F0aW9uIGFuZCB0aGUgZW1iZWRkZWQgaWZyYW1lLWJhc2VkIE15b3AgY29tcG9uZW50czxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGZhY2lsaXRhdGVzIHNlY3VyZSBpc29sYXRpb24sIGFsbG93aW5nIGNvbXBvbmVudHMgdG8gZnVuY3Rpb24gaW5kZXBlbmRlbnRseSB3aGlsZSBzdGlsbCBiZW5lZml0aW5nIGZyb20gdGhlIG92ZXJhbGwgc3RydWN0dXJlIGFuZCBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyBwcm92aWRlZCBieSB0aGUgaG9zdCBhcHBsaWNhdGlvbi48YnIvPjxici8+XG4gKlxuIE9uY2UgbG9hZGVkIHRoZSBgUm9vdFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiBgYGBqc1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuIG9yXG4gYGBgdHNcbiBpbXBvcnQge2dldElmcmFtZU1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCBnZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gb3JcbiBgYGB0c1xuIGltcG9ydCB7SWZyYW1lU0RLfSBmcm9tICdAbXlvcC9zZGsvaWZyYW1lJztcbiBgYGBcbiAqXG4gKi9cbmltcG9ydCB7QmFzZU15b3BTREt9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7RGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge0JpbmRPbkNsaWNrSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlclwiO1xuaW1wb3J0IHtDaGFuZ2VUZXh0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXJcIjtcbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuaW1wb3J0IHtBZGRFdmVudExpc3RlbmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyXCI7XG5pbXBvcnQge3NldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyXCI7XG5pbXBvcnQge1xuICAgIEluaXRSZXF1ZXN0LFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtTZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL1NldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyXCI7XG5pbXBvcnQge0dldEVsZW1lbnRWYWx1ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzXCI7XG4vLyBAdHMtaWdub3JlIGhhbmRsZWQgYnkgY3VzdG9tIGVzYnVpbGQgcGx1Z2luXG5pbXBvcnQgdmVyc2lvbiBmcm9tIFwibXlvcC1zZGstdmVyc2lvblwiO1xuaW1wb3J0IHtHZXRBdHRyaWJ1dGVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZ2V0QXR0cmlidXRlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTZXRSZXNpemVPYnNlcnZlckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9TZXRSZXNpemVPYnNlcnZlckhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHNcIjtcblxuLyoqXG4gVGhlIElmcmFtZSBTREsgaXMgaW50ZW5kZWQgZm9yIHNjZW5hcmlvcyB3aGVyZSBkZXZlbG9wZXJzIHdpc2ggdG8gaW1wbGVtZW50IE15b3AgY29tcG9uZW50cyBhcyBzZXBhcmF0ZSB3ZWIgYXBwbGljYXRpb25zIGhvc3RlZCB3aXRoaW4gaWZyYW1lcy48YnIvPjxici8+XG4gQnkgaW1wb3J0aW5nIHRoZSBJZnJhbWUgU0RLLCBkZXZlbG9wZXJzIGdhaW4gYWNjZXNzIHRvIHRvb2xzIGFuZCB1dGlsaXRpZXMgbmVjZXNzYXJ5IGZvciBoYW5kbGluZyBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGhvc3QgYXBwbGljYXRpb24gYW5kIHRoZSBlbWJlZGRlZCBpZnJhbWUtYmFzZWQgTXlvcCBjb21wb25lbnRzPGJyLz48YnIvPlxuIFRoaXMgU0RLIGZhY2lsaXRhdGVzIHNlY3VyZSBpc29sYXRpb24sIGFsbG93aW5nIGNvbXBvbmVudHMgdG8gZnVuY3Rpb24gaW5kZXBlbmRlbnRseSB3aGlsZSBzdGlsbCBiZW5lZml0aW5nIGZyb20gdGhlIG92ZXJhbGwgc3RydWN0dXJlIGFuZCBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyBwcm92aWRlZCBieSB0aGUgaG9zdCBhcHBsaWNhdGlvbi48YnIvPjxici8+XG5cbiBPbmNlIGxvYWRlZCB0aGUgYFJvb3RTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gYGBganNcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiBvclxuIGBgYHRzXG4gaW1wb3J0IHtnZXRJZnJhbWVNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuICovXG5leHBvcnQgY2xhc3MgSWZyYW1lU0RLIGV4dGVuZHMgQmFzZU15b3BTREsge1xuXG4gICAgcHVibGljIHZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKCF3aW5kb3cubXlvcCkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgd2luZG93Lm15b3AgPSB7fVxuICAgICAgICB9XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLID0gdGhpcztcbiAgICB9XG5cbiAgICBtZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKCFtZXNzYWdlLnJlcGxheVRvSGFuZGxlciAmJiByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkKVxuICAgICAgICAgICAgbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUby5oYW5kbGVyVW5pcXVlSWRcblxuICAgICAgICBjb25zdCBjb21wb25lbnRJZHMgPSBPYmplY3Qua2V5cyh0aGlzLmNvbXBvbmVudHMpO1xuXG4gICAgICAgIGlmICghbWVzc2FnZS5kZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgaWYgKHJlcGxheVRvPy5yb3V0ZSkge1xuICAgICAgICAgICAgICAgIC8vIHRha2luZyB0aGUgZmlyc3QgY29tcG9uZW50IHRoYXQgaW5pdGlhdGVkIHRoYXQgY3ljbGVcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gcmVwbGF5VG8ucm91dGVbcmVwbGF5VG8ucm91dGUubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSBjb21wb25lbnRJZHNbMF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2Uuc291cmNlKVxuICAgICAgICAgICAgbWVzc2FnZS5zb3VyY2UgPSBjb21wb25lbnRJZHNbMF07XG5cbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLnVwXG5cbiAgICAgICAgd2luZG93LnBhcmVudD8ucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgLi4ubWVzc2FnZVxuICAgICAgICB9LCAnKicpO1xuICAgIH1cblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXSA9IFtcbiAgICAgICAgbmV3IENoYW5nZVRleHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBTZXRJbm5lckh0bWxIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBCaW5kT25DbGlja0hhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEV4ZWN1dGVTY3JpcHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBBZGRFdmVudExpc3RlbmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgc2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgR2V0RWxlbWVudFZhbHVlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IFNldFJlc2l6ZU9ic2VydmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgR2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuXG4gICAgICAgIC8vY29tcG9zaXRlIHN1cHBvcnQgbWVzc2FnZXMgOlxuICAgICAgICBuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KVxuICAgIF07XG5cbiAgICBwdWJsaWMgaW5pdCA9ICgpID0+IHtcbiAgICAgICAgd2luZG93Lm9ubWVzc2FnZSA9IHRoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXMuYmluZCh0aGlzKVxuICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXF1ZXN0KCkpXG4gICAgfVxuXG59XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ0lmcmFtZVNESycsIElmcmFtZVNESyk7XG4iLCAiaW1wb3J0ICogYXMgYWxsIGZyb20gJy4vaW5kZXgnXG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcblxuY29uc3QgTXlvcE1lc3NhZ2VzID0ge1xuICAgIC4uLmFsbFxufVxuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdNeW9wTWVzc2FnZXMnLCBNeW9wTWVzc2FnZXMpO1xuIiwgImltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50c1wiO1xuaW1wb3J0ICogYXMgTXlvcEhlbHBlcnMgZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnTXlvcEhlbHBlcnMnLCBNeW9wSGVscGVycyk7XG4iLCAiaW1wb3J0ICcuL2R5bmFtaWNJbXBvcnQvbG9hZF9fZmVkZXJhdGlvbl9fJztcbi8vIEB0cy1pZ25vcmUgaGFuZGxlZCBieSBjdXN0b20gZXNidWlsZCBwbHVnaW5cbmltcG9ydCB2ZXJzaW9uIGZyb20gXCJteW9wLXNkay12ZXJzaW9uXCI7XG5cbmNvbnNvbGUubG9nKCdteW9wIHJvb3Qgc2RrIC0gbG9hZGVkJywgZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKTtcblxuLy8gVE9ETyA6IHJlYWQgdmFsdWUgZnJvbSB3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ10gP1xuLy9jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2RmZGxrMnAxbTE4N3YuY2xvdWRmcm9udC5uZXQvbXlvcF9zZGsubWluLmpzJ1xuY29uc3QgX19ST09UX1NES19QVUJMSUNfVVJMX18gPSAnaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQvbXlvcF9zZGsubWluLmpzJ1xuXG5jb25zdCBnZXRIb3N0TW9kdWxlID0gKCkgPT4gaW1wb3J0KCcuL2hvc3QvaG9zdFNESycpXG5jb25zdCBnZXRJZnJhbWVNb2R1bGUgPSAoKSA9PiBpbXBvcnQoJy4vSWZyYW1lL0lmcmFtZVNESycpXG5jb25zdCBnZXRXZWJjb21wb25lbnRNb2R1bGUgPSAoKSA9PiBpbXBvcnQoJy4vd2ViY29tcG9uZW50L1dlYkNvbXBvbmVudFNESycpXG5jb25zdCBnZXRNeW9wTWVzc2FnZXMgPSAoKSA9PiBpbXBvcnQoJy4vbWVzc2FnZXMvTXlvcE1lc3NhZ2VzJylcbmNvbnN0IGdldE15b3BIZWxwZXJzID0gKCkgPT4gaW1wb3J0KCcuL2hlbHBlcnMvTXlvcEhlbHBlcnMnKVxuXG5jb25zdCBleHBvc2VHbG9iYWxseSA9IChpbXBvcnRGdW5jdGlvbjogKCkgPT4gUHJvbWlzZTxhbnk+KSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiBhc3luYyAoKSA9PiAoYXdhaXQgaW1wb3J0RnVuY3Rpb24oKSkuZ2V0KClcbn1cblxuLy8gRm9yIHNjcmlwdC9nbG9iYWwgdXNhZ2UgOlxuY29uc3Qgcm9vdFNESyA9IHtcbiAgICB2ZXJzaW9uIDogdmVyc2lvbixcbiAgICBnZXRIb3N0TW9kdWxlOiBleHBvc2VHbG9iYWxseShnZXRIb3N0TW9kdWxlKSxcbiAgICBnZXRJZnJhbWVNb2R1bGU6IGV4cG9zZUdsb2JhbGx5KGdldElmcmFtZU1vZHVsZSksXG4gICAgZ2V0V2ViY29tcG9uZW50TW9kdWxlOiBleHBvc2VHbG9iYWxseShnZXRXZWJjb21wb25lbnRNb2R1bGUpLFxuICAgIGdldE15b3BNZXNzYWdlczogZXhwb3NlR2xvYmFsbHkoZ2V0TXlvcE1lc3NhZ2VzKSxcbiAgICBnZXRNeW9wSGVscGVyczogZXhwb3NlR2xvYmFsbHkoZ2V0TXlvcEhlbHBlcnMpXG59O1xuXG4vLyBAdHMtaWdub3JlXG5pZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgIH1cbn1cblxuLy8gQHRzLWlnbm9yZVxuaWYgKCF3aW5kb3cubXlvcC5yb290U0RLKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJvb3RTREssXG4gICAgICAgIC4uLndpbmRvdy5teW9wXG4gICAgfTtcbn0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coXCJteW9wIHJvb3QgaG9zdCBsb2FkZWQgbW9yZSB0aGFuIG9uY2UuXCIpO1xufVxuXG4vLyBGb3IgYnVuZGxlcnMgdXNhZ2UgOlxuY29uc3Qgc2RrTW9kdWxlID0ge1xuICAgIGdldEhvc3RNb2R1bGUsXG4gICAgZ2V0SWZyYW1lTW9kdWxlLFxuICAgIGdldFdlYmNvbXBvbmVudE1vZHVsZVxufVxuZXhwb3J0IHR5cGUgcm9vdFNES1R5cGUgPSB0eXBlb2Ygc2RrTW9kdWxlO1xuXG5leHBvcnQge1xuICAgIGdldEhvc3RNb2R1bGUsXG4gICAgZ2V0SWZyYW1lTW9kdWxlLFxuICAgIGdldFdlYmNvbXBvbmVudE1vZHVsZVxufVxuXG4vLyBkZWNsYXJlIGdsb2JhbCB7XG4vLyAgICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4vLyAgICAgICAgIG15b3A6IHtcbi8vICAgICAgICAgICAgIHJvb3RTREs6IHR5cGVvZiByb290U0RLXG4vLyAgICAgICAgIH1cbi8vICAgICB9XG4vLyB9XG4iLCAiLy8gQHRzLW5vY2hlY2tcbmltcG9ydCB7bW9kdWxlSW5zdGFuY2VLZXksIG9uTG9hZEtleX0gZnJvbSBcIi4vZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuXG5pZiAoIXdpbmRvd1snX19mZWRlcmF0aW9uX18nXSkge1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHNjcmlwdFNyYyA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/LnNyYztcbiAgICBjb25zdCBfX3B1YmxpY19hdXRvX3BhdGhfXyA9IHNjcmlwdFNyYyA/IHNjcmlwdFNyYy5zcGxpdCgnLycpLnNsaWNlKDAsIC0xKS5qb2luKCcvJykgOiAnJztcblxuICAgIHdpbmRvd1snX19mZWRlcmF0aW9uX18nXSA9IHtcbiAgICAgICAgX19wdWJsaWNfYXV0b19wYXRoX18sXG4gICAgICAgIF9fdXNlX3B1YmxpY19hdXRvX3BhdGhfXzogdHJ1ZSxcbiAgICAgICAgX19wdWJsaWNfcGF0aF9fOiB1bmRlZmluZWQsXG4gICAgICAgIF9fbG9hZGluZ190aW1lb3V0X18gOiA1ICogMTAwMFxuICAgIH07XG59IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKCdfX2ZlZGVyYXRpb25fXyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UuJyk7XG59XG5cbndpbmRvd1snX19mZWRlcmF0aW9uX18nXVsnbG9hZF9fZmVkZXJhdGlvbl9fJ10gPSAoc2NyaXB0RmlsZVBhdGgsIG1vZHVsZU5hbWUsIG9uTG9hZCkgPT4ge1xuXG4gICAgaWYgKCF3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bbW9kdWxlTmFtZV0pIHtcbiAgICAgICAgbGV0IHNjcmlwdFRhZztcblxuICAgICAgICB3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bbW9kdWxlTmFtZV0gPSB7fTtcbiAgICAgICAgd2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdW29uTG9hZEtleV0gPSAobW9kdWxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2NyaXB0VGFnKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChzY3JpcHRUYWcpO1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIHRoYXQ6XG4gICAgICAgICAgICAgICAgc2NyaXB0VGFnID0gbnVsbDtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnc2NyaXB0IHJlbW92ZWQuLi4gJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2cobW9kdWxlKTtcblxuICAgICAgICAgICAgd2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdW21vZHVsZUluc3RhbmNlS2V5XSA9IG1vZHVsZTtcbiAgICAgICAgICAgIG9uTG9hZChtb2R1bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2NyaXB0VGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgIC8vc2NyaXB0VGFnLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JztcbiAgICAgICAgc2NyaXB0VGFnLnR5cGUgPSAnbW9kdWxlJztcbiAgICAgICAgc2NyaXB0VGFnLnNyYyA9IHNjcmlwdEZpbGVQYXRoO1xuXG4gICAgICAgIHNjcmlwdFRhZy5hc3luYyA9IHRydWU7XG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0VGFnKTtcblxuICAgICAgICAvLyBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XG4gICAgICAgIC8vIGxpbmsudHlwZSA9IFwidGV4dC9jc3NcIjtcbiAgICAgICAgLy8gbGluay5yZWwgPSBcInN0eWxlc2hlZXRcIjtcbiAgICAgICAgLy8gbGluay5ocmVmID0gZmlsZU5hbWUucmVwbGFjZSgnLmpzJywgJy5jc3MnKTtcbiAgICAgICAgLy8gZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBfX2ZlZGVyYXRpb25fXyBtb2R1bGUgJHttb2R1bGVOYW1lfSBhbHJlYWR5IGxvYWRlZC5gKVxuICAgICAgICBvbkxvYWQod2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdW21vZHVsZUluc3RhbmNlS2V5XSk7XG4gICAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsTUFBYSxnQkFDQSxXQUNBLG1CQUVBO0FBSmI7QUFBQTtBQUFBO0FBQU8sTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sb0JBQW9CO0FBRTFCLE1BQU0sc0JBQXNCLENBQUMsWUFBb0IsV0FBZ0I7QUFFcEUsWUFBSSxPQUFPLGNBQWMsS0FBSyxPQUFPLGNBQWMsRUFBRSxVQUFVLEtBQUssT0FBTyxjQUFjLEVBQUUsVUFBVSxFQUFFLFNBQVMsR0FBRztBQUUvRyxpQkFBTyxjQUFjLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxFQUFDLENBQUMsVUFBVSxHQUFHLE9BQU0sQ0FBQztBQUFBLFFBQ3hFLE9BQU87QUFB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QUFZLFNBQVM7QUFBQSxJQVF2QyxPQUFPO0FBQ0gsY0FBUSxJQUFJLHlCQUF5QixtQkFBVSxtQkFBa0I7QUFDakUsYUFBTyxPQUFPLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQztBQUFBLElBQ2xFO0FBQUEsRUFDSjs7O0FEdERBO0FBRUEsVUFBUSxJQUFJLDBCQUEwQixTQUFTLFNBQVMsTUFBTTtBQUk5RCxNQUFNQywyQkFBMEI7QUFFaEMsTUFBTSxnQkFBZ0IsTUFBTTtBQUM1QixNQUFNLGtCQUFrQixNQUFNO0FBQzlCLE1BQU0sd0JBQXdCLE1BQU07QUFDcEMsTUFBTSxrQkFBa0IsTUFBTTtBQUM5QixNQUFNLGlCQUFpQixNQUFNO0FBRTdCLE1BQU0saUJBQWlCLENBQUMsbUJBQXVDO0FBRTNELFdBQU8sYUFBYSxNQUFNLGVBQWUsR0FBRyxJQUFJO0FBQUEsRUFDcEQ7QUFHQSxNQUFNLFVBQVU7QUFBQSxJQUNaLFNBQVU7QUFBQSxJQUNWLGVBQWUsZUFBZSxhQUFhO0FBQUEsSUFDM0MsaUJBQWlCLGVBQWUsZUFBZTtBQUFBLElBQy9DLHVCQUF1QixlQUFlLHFCQUFxQjtBQUFBLElBQzNELGlCQUFpQixlQUFlLGVBQWU7QUFBQSxJQUMvQyxnQkFBZ0IsZUFBZSxjQUFjO0FBQUEsRUFDakQ7QUFHQSxNQUFJLENBQUMsT0FBTyxNQUFNO0FBRWQsV0FBTyxPQUFPO0FBQUEsTUFDVix5QkFBQUE7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUdBLE1BQUksQ0FBQyxPQUFPLEtBQUssU0FBUztBQUV0QixXQUFPLE9BQU87QUFBQTtBQUFBLE1BRVY7QUFBQSxPQUNHLE9BQU87QUFBQSxFQUVsQixPQUFPO0FBQ0gsWUFBUSxJQUFJLHVDQUF1QztBQUFBLEVBQ3ZEOyIsCiAgIm5hbWVzIjogWyJSZXBsYXlNZXNzYWdlS2V5IiwgIm1hdGNoIiwgInNjcmlwdElucHV0cyIsICJzY3JpcHRJbnB1dHMiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAic2VlbiIsICJ0YXJnZXQiLCAibWFrZVNlcmlhbGl6YWJsZSIsICJfYSIsICJoZWlnaHQiLCAid2lkdGgiLCAiX2EiLCAiX2EiLCAiX2EiLCAiaW5pdF9jb25zdHMiLCAiaW5pdF9jb25zdHMiLCAiaW5pdF9jb25zdHMiLCAiaW5pdF9jb25zdHMiLCAiaG9zdFNESyIsICJpbml0X2V4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgImluaXRfY29uc3RzIiwgImVsZW1lbnQiLCAiaW5pdF9leGVjdXRlU2NyaXB0SGFuZGxlciIsICJzZGsiLCAic2VlbiIsICJkb21JZCIsICJpbml0X2hlbHBlcnMiLCAiaW5pdF9oZWxwZXJzIiwgInNraW4iLCAiY29tcG9uZW50IiwgIl9hIiwgInNlZ21lbnQiLCAiZXhwZXJpZW5jZSIsICJzZWxlY3RlZFNraW4iLCAiRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJpbml0X0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9jb25zdHMiLCAiQmluZE9uQ2xpY2tIYW5kbGVyIiwgImluaXRfYmluZE9uQ2xpY2tIYW5kbGVyIiwgIkNoYW5nZVRleHRIYW5kbGVyIiwgImluaXRfY2hhbmdlVGV4dEhhbmRsZXIiLCAiRXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiaW5pdF9leGVjdXRlU2NyaXB0SGFuZGxlciIsICJBZGRFdmVudExpc3RlbmVySGFuZGxlciIsICJpbml0X2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgInNldEF0dHJpYnV0ZUhhbmRsZXIiLCAiaW5pdF9zZXRBdHRyaWJ1dGVIYW5kbGVyIiwgIkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIiwgImluaXRfQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9jb25zdHMiLCAiaG9zdFNESyIsICJnZXRJbnB1dFZhbHVlIiwgIkdldEVsZW1lbnRWYWx1ZUhhbmRsZXIiLCAiaW5pdF9HZXRFbGVtZW50VmFsdWVIYW5kbGVyIiwgImluaXRfY29uc3RzIiwgImVsZW1lbnQiLCAiU2V0SW5uZXJIdG1sSGFuZGxlciIsICJpbml0X3NldElubmVySHRtbEhhbmRsZXIiLCAiaW5pdF9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIiwgImluaXRfYmluZE9uQ2xpY2tIYW5kbGVyIiwgImluaXRfY2hhbmdlVGV4dEhhbmRsZXIiLCAiaW5pdF9leGVjdXRlU2NyaXB0SGFuZGxlciIsICJpbml0X2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgImluaXRfc2V0QXR0cmlidXRlSGFuZGxlciIsICJpbml0X0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIiwgImluaXRfR2V0RWxlbWVudFZhbHVlSGFuZGxlciIsICJpbml0X3NldElubmVySHRtbEhhbmRsZXIiLCAiX2EiLCAiQ2hhbmdlVGV4dEhhbmRsZXIiLCAiU2V0SW5uZXJIdG1sSGFuZGxlciIsICJCaW5kT25DbGlja0hhbmRsZXIiLCAiRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJFeGVjdXRlU2NyaXB0SGFuZGxlciIsICJBZGRFdmVudExpc3RlbmVySGFuZGxlciIsICJzZXRBdHRyaWJ1dGVIYW5kbGVyIiwgIkdldEVsZW1lbnRWYWx1ZUhhbmRsZXIiLCAiQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiLCAiTXlvcE1lc3NhZ2VzIiwgImluaXRfTXlvcE1lc3NhZ2VzIiwgImluaXRfaGVscGVycyIsICJfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyJdCn0K
|
|
4201
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50cyIsICJ2ZXJzaW9uOm15b3Atc2RrLXZlcnNpb24iLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wTWVzc2FnZXMudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvSU15b3BDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvY29tbW9uL0Jhc2VNeW9wU0RLLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vaW5kZXgudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvZ01lc3NhZ2VzLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFJlZkNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRDb3JlLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0lNeW9wTG9hZGVyLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvaWZyYW1lTG9hZGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvY29uc3RzLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvaG9zdC9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL2NvbnN0cy50cyIsICIuLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L3NoYWRvd1Jvb3RSZWYudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L1dlYkNvbXBvbmVudFNESy50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L2VtYmVkZGVkU0RLLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9hcHBseVN0eWxlc2hlZXQudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvaWZyYW1lU2tpblVybFRva2VuaXplci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9jbGFzc0xpc3QudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvY29uZmlnQnVpbGRlci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9DbG91ZFJlcG9zaXRvcnkudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvZXhlYy50cyIsICIuLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyIsICIuLi8uLi9zcmMvaG9zdC9teW9wT3ZlcnJpZGUudHMiLCAiLi4vLi4vc3JjL2hvc3QvaG9zdFNESy50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vdXRpbHMvZG9tT2JzZXJ2ZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9nZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL1NldFJlc2l6ZU9ic2VydmVySGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvSWZyYW1lU0RLLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9NeW9wTWVzc2FnZXMudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvTXlvcEhlbHBlcnMudHMiLCAiLi4vLi4vc3JjL1NESy50cyIsICIuLi8uLi9zcmMvZHluYW1pY0ltcG9ydC9sb2FkX19mZWRlcmF0aW9uX18udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCBjb25zdCBfX2ZlZGVyYXRpb25fXyA9IFwiX19mZWRlcmF0aW9uX19cIlxuZXhwb3J0IGNvbnN0IG9uTG9hZEtleSA9IFwib25Mb2FkXCJcbmV4cG9ydCBjb25zdCBtb2R1bGVJbnN0YW5jZUtleSA9IFwibW9kdWxlSW5zdGFuY2VcIlxuXG5leHBvcnQgY29uc3QgZGVmaW5lRHluYW1pY0ltcG9ydCA9IChnbG9iYWxOYW1lOiBzdHJpbmcsIG1vZHVsZTogYW55KSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh3aW5kb3dbX19mZWRlcmF0aW9uX19dICYmIHdpbmRvd1tfX2ZlZGVyYXRpb25fX11bZ2xvYmFsTmFtZV0gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKHtbZ2xvYmFsTmFtZV06IG1vZHVsZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnX19mZWRlcmF0aW9uX18gbG9hZGVyIG5vdCBkZWZpbmVkIGZvciBtb2R1bGUnLCBtb2R1bGUpO1xuICAgIH1cbn0iLCAiZXhwb3J0IGRlZmF1bHQgJzAuMy4xMSc7IiwgInR5cGUgU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxUPiA9IFQgfCAoc3RyaW5nICYgUmVjb3JkPG5ldmVyLCBuZXZlcj4pO1xuXG5leHBvcnQgdHlwZSBNeW9wTWVzc2FnZUtleSA9IFN0cmluZ1dpdGhBdXRvY29tcGxldGU8a2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcyB8IGtleW9mIHR5cGVvZiBNeW9wTWVzc2FnZXMuSW4+O1xuXG5leHBvcnQgY29uc3QgTXlvcE1lc3NhZ2VzID0ge1xuICAgIC8vaG9zdCB0byBjb21wb25lbnRcbiAgICAnSW5pdFJlcXVlc3QnOiAnSW5pdFJlcXVlc3QnLFxuICAgICdJbml0UmVzcG9uc2UnOiAnSW5pdFJlc3BvbnNlJyxcbiAgICAnSW5pdE1lc3NhZ2UnOiAnSW5pdE1lc3NhZ2UnLFxuICAgICdEaXNwb3NlTWVzc2FnZSc6ICdEaXNwb3NlTWVzc2FnZScsXG5cbiAgICAnQ2hhbmdlVGV4dE1lc3NhZ2UnOiAnQ2hhbmdlVGV4dE1lc3NhZ2UnLFxuICAgICdCaW5kQ2xpY2tNZXNzYWdlJzogJ0JpbmRDbGlja01lc3NhZ2UnLFxuICAgICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJyxcblxuICAgICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc6ICdFeGVjdXRlU2NyaXB0TWVzc2FnZScsXG5cbiAgICAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnOiAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnLFxuICAgICdTZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnOiAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZScsXG4gICAgJ0VudmVsb3BlZE1lc3NhZ2UnOiAnRW52ZWxvcGVkTWVzc2FnZScsXG5cbiAgICAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc6ICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJyxcbiAgICAnR2V0QXR0cmlidXRlTWVzc2FnZSc6ICdHZXRBdHRyaWJ1dGVNZXNzYWdlJyxcblxuICAgICdTZXRJbm5lckh0bWwnOiAnU2V0SW5uZXJIdG1sJyxcblxuICAgIC8vY29tcG9uZW50IG1lc3NhZ2VzXG4gICAgJ0V4ZWN1dGVDb21wb25lbnRNZXRob2QnOiAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCcsXG4gICAgJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJzogJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJyxcbiAgICAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzogJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZScsXG5cbiAgICAnQ2xlYW51cE1lc3NhZ2UnOiAnQ2xlYW51cE1lc3NhZ2UnLFxuXG4gICAgLy8gZXh0ZXJuYWwgdG8gaG9zdCA6XG4gICAgSW46IHtcbiAgICAgICAgJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJzogJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJyxcbiAgICAgICAgJ0NsaWNrUmVwbGF5TWVzc2FnZSc6ICdDbGlja1JlcGxheU1lc3NhZ2UnLFxuICAgICAgICAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSc6ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJyxcblxuICAgICAgICAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSc6ICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJyxcbiAgICAgICAgJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnOiAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZScsXG5cbiAgICAgICAgXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCI6IFwiR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZVwiLFxuICAgICAgICAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnOiAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnLFxuICAgICAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICAgICAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICAgICAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnOiAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnLFxuICAgICAgICAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzogJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSdcbiAgICB9XG59XG4iLCAiLy9UT0RPIDogcmV1c2UgZnJvbSBvbmUgcGxhY2UuXG4vLyBuZWVkcyB0byBiZSB1c2VkIGluIG15b3Atc2RrLCBteW9wLWRhc2hiYW9yZCwgbXlvcC1zZXJ2ZXIsIG15b3AtY2xpIC4uXG5cbmV4cG9ydCBjb25zdCB1dWlkdjQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIFwiMTAwMDAwMDAtMTAwMC00MDAwLTgwMDAtMTAwMDAwMDAwMDAwXCIucmVwbGFjZSgvWzAxOF0vZywgYyA9PlxuICAgICAgICAoK2MgXiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEpKVswXSAmIDE1ID4+ICtjIC8gNCkudG9TdHJpbmcoMTYpXG4gICAgKTtcbn1cblxuLy8gQ29udmVydCBVVUlEIHN0cmluZyB0byBieXRlc1xuZXhwb3J0IGNvbnN0IHV1aWRUb0J5dGVzID0gKHV1aWQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oXG4gICAgICAgIHV1aWQucmVwbGFjZSgvLS9nLCAnJykubWF0Y2goLy57MSwyfS9nKSEubWFwKGJ5dGUgPT4gcGFyc2VJbnQoYnl0ZSwgMTYpKVxuICAgICk7XG59O1xuXG4vLyBDb252ZXJ0IGJ5dGVzIHRvIFVVSUQgc3RyaW5nXG5leHBvcnQgY29uc3QgYnl0ZXNUb1V1aWQgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGhleCA9IFsuLi5ieXRlc10ubWFwKGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgaGV4LnNsaWNlKDAsIDgpLFxuICAgICAgICBoZXguc2xpY2UoOCwgMTIpLFxuICAgICAgICBoZXguc2xpY2UoMTIsIDE2KSxcbiAgICAgICAgaGV4LnNsaWNlKDE2LCAyMCksXG4gICAgICAgIGhleC5zbGljZSgyMClcbiAgICBdLmpvaW4oJy0nKTtcbn07XG5cbi8vIEJhc2U2NCBVUkwtc2FmZSBlbmNvZGVcbmV4cG9ydCBjb25zdCBiYXNlNjRVcmxFbmNvZGUgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGJhc2U2NCA9IGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5ieXRlcykpO1xuICAgIHJldHVybiBiYXNlNjQucmVwbGFjZSgvXFwrL2csICctJykucmVwbGFjZSgvXFwvL2csICdfJykucmVwbGFjZSgvPSskLywgJycpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGRlY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybERlY29kZSA9IChzdHI6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIGxldCBiYXNlNjQgPSBzdHIucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICB3aGlsZSAoYmFzZTY0Lmxlbmd0aCAlIDQpIGJhc2U2NCArPSAnPSc7XG4gICAgY29uc3QgYmluYXJ5ID0gYXRvYihiYXNlNjQpO1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oYmluYXJ5LCBjaGFyID0+IGNoYXIuY2hhckNvZGVBdCgwKSk7XG59O1xuXG4vLyBDb21wcmVzcyBhbiBhcnJheSBvZiBVVUlEcyBpbnRvIGEgc2hvcnQgVVJMLXNhZmUgc3RyaW5nXG5leHBvcnQgY29uc3QgY29tcHJlc3NVVUlEcyA9ICh1dWlkczogc3RyaW5nW10pOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGFsbEJ5dGVzID0gdXVpZHMuZmxhdE1hcCh1dWlkID0+IEFycmF5LmZyb20odXVpZFRvQnl0ZXModXVpZCkpKTtcbiAgICByZXR1cm4gYmFzZTY0VXJsRW5jb2RlKG5ldyBVaW50OEFycmF5KGFsbEJ5dGVzKSk7XG59O1xuXG4vLyBEZWNvbXByZXNzIGZyb20gVVJMLXNhZmUgc3RyaW5nIGJhY2sgdG8gYW4gYXJyYXkgb2YgVVVJRHNcbmV4cG9ydCBjb25zdCBkZWNvbXByZXNzVVVJRHMgPSAoZW5jb2RlZDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gYmFzZTY0VXJsRGVjb2RlKGVuY29kZWQpO1xuICAgIGlmIChieXRlcy5sZW5ndGggJSAxNiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IGxlbmd0aCcpO1xuXG4gICAgY29uc3QgdXVpZHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICAgICAgdXVpZHMucHVzaChieXRlc1RvVXVpZChieXRlcy5zbGljZShpLCBpICsgMTYpKSk7XG4gICAgfVxuICAgIHJldHVybiB1dWlkcztcbn07XG4iLCAiZXhwb3J0ICogZnJvbSAnLi91dWlkLnRzJ1xuXG5leHBvcnQgY29uc3Qgd2FpdCA9IChtczogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcbmltcG9ydCB7SVJlZkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgTWVzc2FnZURpcmVjdGlvbiB7XG4gICAgc3RhdGljIGRvd24gPSAnZG93bicgYXMgY29uc3RcbiAgICBzdGF0aWMgdXAgPSAndXAnIGFzIGNvbnN0XG59XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VEaXJlY3Rpb25PcHRpb24gPSAndXAnIHwgJ2Rvd24nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BNZXNzYWdlPFQgPSBhbnk+IHtcbiAgICBpZCA9IHV1aWR2NCgpXG5cbiAgICBzdGF0aWMgY3JlYXRlPFQsIFUgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxVPikgPT4gVCA9IHR5cGVvZiB0aGlzPihcbiAgICAgICAgdGhpczogVSxcbiAgICAgICAgLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+XG4gICAgKTogSW5zdGFuY2VUeXBlPHR5cGVvZiB0aGlzPiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzKC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdtZWVzYWdlIGlkIGNyZWF0ZWQnLCB0aGlzLmlkLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtcbiAgICB9XG5cbiAgICBteW9wID0gdHJ1ZVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5IHwgc3RyaW5nO1xuXG4gICAgY29udGVudD86IFRcblxuICAgIC8vIFRPRE8gOiBjYW50IGJlIG9wdGlvbmFsIFxuICAgIHNvdXJjZT86IHN0cmluZ1xuICAgIGRlc3RpbmF0aW9uPzogc3RyaW5nXG5cbiAgICByb3V0ZT86IHN0cmluZ1tdXG5cbiAgICByZWY/OiBSZWZcblxuICAgIGRpcmVjdGlvbj86IE1lc3NhZ2VEaXJlY3Rpb25PcHRpb25cblxuICAgIGNsZWFuYWJsZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEVsZW1lbnRNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcj86IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kTWVzc2FnZTxUID0gYW55LCBSIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleTtcblxuICAgIHB1YmxpYyBoYW5kbGVyVW5pcXVlSWQgPSB1dWlkdjQoKVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGhhbmRsZXI6IChtZXNzYWdlOiBSKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWYge1xuICAgIHB1YmxpYyBteW9wID0gdHJ1ZTtcblxuICAgIHB1YmxpYyBfX25vblByb3hpZWQ/OiBSZWY7XG5cbiAgICBzdGF0aWMgY3JlYXRlKHNlbGVjdG9yOiBzdHJpbmcsIHJlZkNvbmZpZz86IElSZWZDb25maWcsIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIGxldCBfcmVmQ29uZmlnID0gcmVmQ29uZmlnO1xuICAgICAgICBpZiAoIV9yZWZDb25maWcpIHtcbiAgICAgICAgICAgIF9yZWZDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgICAgICBzZWxlY3RvclR5cGU6ICdpZC1hdHRyaWJ1dGUnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29kZSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGFzIElSZWZDb25maWdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlZihfcmVmQ29uZmlnLCBjb21wb25lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZDb25maWc6IElSZWZDb25maWcsIHB1YmxpYyBjb21wb25lbnQ/OiBJTXlvcENvbXBvbmVudCkge1xuICAgICAgICB0aGlzLl9fbm9uUHJveGllZCA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMsXG4gICAgICAgICAgICBjb21wb25lbnQ6IG51bGwgLy8gaW4gb3JkZXIgdG8gYmUgc2VyaWFsaXphYmxlXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdDbGlja1JlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBCaW5kQ2xpY2tNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIENsaWNrUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnQmluZENsaWNrTWVzc2FnZSc7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaGFuZGxlcjogKG1lc3NhZ2U6IENsaWNrUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGlja1JlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIENoYW5nZVRleHRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHN0cmluZz4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnQ2hhbmdlVGV4dE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gdGV4dFxuICAgIH1cbn0iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSdcblxuY29uc3QgZnVuY3Rpb25Cb2R5UmVnZXggPSAvKD86ZnVuY3Rpb25cXHMqXFx3KlxccypcXChbXildKlxcKVxccypcXHsoW1xcc1xcU10qPylcXH18KFxcKFteKV0qXFwpXFxzKj0+XFxzKlxceyhbXFxzXFxTXSo/KVxcfSkpXFxzKiQvO1xuY29uc3QgZXhwcmVzc2lvbkJvZHlSZWdleCA9IC9cXChcXHMqW14pXStcXHMqXFwpXFxzKj0+XFxzKiguKykvO1xuXG5leHBvcnQgY29uc3Qgc3RyaXBGdW5jdGlvbiA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBsZXQgbWF0Y2ggPSBjb250ZW50Lm1hdGNoKGZ1bmN0aW9uQm9keVJlZ2V4KTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoWzFdIHx8IG1hdGNoWzNdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZXhwcmVzc2lvbkJvZHlSZWdleCk7XG4gICAgICAgIGlmIChtYXRjaClcbiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXS50cmltKCk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBzY3JpcHRJbnB1dHMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhblxufSB8IHt9O1xuXG5leHBvcnQgdHlwZSBzY3JpcHRWYXJzPFQ+ID0ge1xuICAgIHNlbmQ6IChkYXRhOiBUKSA9PiB2b2lkO1xuICAgIC8vIGNvbXBsZXRlU3RyZWFtOiAoKSA9PiB2b2lkO1xuICAgIHJvb3RSZWY6IFJvb3RSZWY7XG4gICAgbWFrZVNlcmlhbGl6YWJsZTogdHlwZW9mIG1ha2VTZXJpYWxpemFibGVcbn1cblxuZXhwb3J0IHR5cGUgZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEk+ID0ge1xuICAgIFtLIGluIGtleW9mIEldOiBJW0tdO1xufSAmIHNjcmlwdFZhcnM8VD5cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHN0cmluZywgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPj4ge1xuXG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG4gICAgbWVzc2FnZVR5cGUgPSAnRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuICAgIHNjcmlwdDogc3RyaW5nID0gJydcblxuICAgIHN0YXRpYyByZXBsaWVyS2V5ID0gJ3NlbmQnO1xuICAgIHN0YXRpYyBjb21wbGV0ZVN0cmVhbUtleSA9ICdjb21wbGV0ZVN0cmVhbSc7XG5cbiAgICBjb25zdHJ1Y3RvcihzY3JpcHQ6ICh2YXJzOiBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4pID0+IFQsIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgIH0sIHB1YmxpYyBzY3JpcHRJbnB1dHM/OiBJKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgICAgICB0aGlzLnNjcmlwdCA9IHNjcmlwdC50b1N0cmluZygpO1xuXG4gICAgICAgIC8vVE9ETzogY2FuIGJlIHJlbW92ZVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzdHJpcEZ1bmN0aW9uKHRoaXMuY29udGVudCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBjb250ZW50OiBUKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7XG4gICAgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsXG4gICAgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSxcbiAgICBleHRlbmRlZFNjcmlwdFZhcnMsXG4gICAgc2NyaXB0SW5wdXRzLCBzdHJpcEZ1bmN0aW9uXG59IGZyb20gXCIuL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzXCI7XG5cbmV4cG9ydCB0eXBlIGN1c3RvbVJlZlNjcmlwdElucHV0cyA9IHtcbiAgICBlbGVtZW50SWQ6IHN0cmluZyxcbiAgICByZWY/OiBIVE1MRWxlbWVudCxcbiAgICBfc2NyaXB0Pzogc3RyaW5nLFxuICAgIF9fc2NyaXB0SW5wdXRzPzogT2JqZWN0XG59O1xuXG5leHBvcnQgY2xhc3MgQ3VzdG9tUmVmTWVzc2FnZTxUID0gYW55LCBJIGV4dGVuZHMgc2NyaXB0SW5wdXRzID0gY3VzdG9tUmVmU2NyaXB0SW5wdXRzPiBleHRlbmRzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IHtcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzPikgPT4gVCxcbiAgICAgICAgICAgICAgICBwdWJsaWMgc2NyaXB0SW5wdXRzOiBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIH0pIHtcblxuICAgICAgICAvL21vY2sgdmFyc1xuICAgICAgICAvLyBsZXQgcm9vdFJlZiwgZWxlbWVudElkLCBfc2NyaXB0LCBfX3NjcmlwdElucHV0cztcbiAgICAgICAgc3VwZXIoKHtyb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmcyA9IChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLnF1ZXJ5U2VsZWN0b3JBbGwoYFskeydteW9wLWlkJ309JyR7ZWxlbWVudElkfSddYCk7XG4gICAgICAgICAgICBpZiAocmVmcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyAgY29uc3QgcmVmID0gcmVmc1swXTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IGV4cG9zaW5nIFwicmVmc1wiIGFuZCBub3Qgb25seSBcInJlZlwiXG4gICAgICAgICAgICAgICAgLy9mb3IgY2FzZXMgd2hlcmUgdGhlIFJlZiBoYXMgbXVsdGlwbGF0ZSBpbXBsZW1lbnRhdGlvbnNcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBfX3NjcmlwdElucHV0cy5yZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gKCR7X3NjcmlwdH0pKC4uLmFyZ3VtZW50cylgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHluYW1pY0Z1bmN0aW9uKF9fc2NyaXB0SW5wdXRzKTtcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAvL3JldHVybiBGdW5jdGlvbigncmVmJywgJ3Jvb3RSZWYnLCAuLi5PYmplY3Qua2V5cyhfX3NjcmlwdElucHV0cyksIF9zY3JpcHQhKShyZWYsIHJvb3RSZWYsIC4uLk9iamVjdC52YWx1ZXMoX19zY3JpcHRJbnB1dHMpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGwgYXMgVDtcbiAgICAgICAgfSwgaGFuZGxlcik7XG5cbiAgICAgICAgdGhpcy5zY3JpcHRJbnB1dHMgPSB7XG4gICAgICAgICAgICAuLi5zY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAvL19zY3JpcHQ6IHN0cmlwRnVuY3Rpb24oc2NyaXB0LnRvU3RyaW5nKCkpLFxuICAgICAgICAgICAgX3NjcmlwdDogc2NyaXB0LnRvU3RyaW5nKClcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2VyaWFsaXphYmxlLCBTZXJpYWxpemFibGVTa2VsZXRvbn0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPFQgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwID0ga2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcD4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2Uge1xuXG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG4gICAgbWVzc2FnZVR5cGUgPSAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuICAgIGNsZWFuYWJsZSA9IHRydWU7XG4gICAgc2VyaWFsaXphYmxlU2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPEhUTUxFbGVtZW50RXZlbnRNYXBbVF0+ID0gZmFsc2UgLy8ge30gLy8gZW1wdHlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIHR5cGU6IFQsIHB1YmxpYyBoYW5kbGVyOiAobWVzc2FnZTogRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKVxuICAgIH1cblxuICAgIHdpdGhTZXJpYWxpemFibGVTa2VsZXRvbihzZXJpYWxpemFibGVTa2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248SFRNTEVsZW1lbnRFdmVudE1hcFtUXT4pIHtcbiAgICAgICAgdGhpcy5zZXJpYWxpemFibGVTa2VsZXRvbiA9IHNlcmlhbGl6YWJsZVNrZWxldG9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBlOiBTZXJpYWxpemFibGU8RXZlbnQ+KSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgICAgIHRoaXMuY29udGVudCA9IHtcbiAgICAgICAgICAgIGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmLH0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuXG5leHBvcnQgY2xhc3MgU2V0QXR0cmlidXRlTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRBdHRyaWJ1dGVNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXJpYWxpemFibGV9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBoYW5kbGVyOiAobWVzc2FnZTogRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIEZvcm1EYXRhRW50cnkgPSB7XG4gICAgaWQ/OiBzdHJpbmcsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICB2YWx1ZT86IElucHV0RWxlbWVudFZhbHVlLFxuICAgIHJlcXVpcmVkPzogYm9vbGVhbixcbiAgICB2YWxpZGl0eT86IFNlcmlhbGl6YWJsZTxWYWxpZGl0eVN0YXRlPixcbiAgICBteW9wSWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgSW5wdXRFbGVtZW50Rm9ybVZhbHVlID0ge1xuICAgIGZvcm1EYXRhPzogeyBba2V5OiBzdHJpbmddOiBGb3JtRGF0YUVudHJ5IH1cbiAgICB1bm1hcHBlZERhdGE/OiBGb3JtRGF0YUVudHJ5W11cbn07XG5cbmV4cG9ydCB0eXBlIElucHV0RWxlbWVudFZhbHVlID0gc3RyaW5nIHwgSW5wdXRFbGVtZW50Rm9ybVZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZFxuXG5leHBvcnQgY2xhc3MgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGVudDogSW5wdXRFbGVtZW50VmFsdWUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZS50c1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHN0cmluZz4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0SW5uZXJIdG1sJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaW5uZXJIdG1sOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gaW5uZXJIdG1sXG4gICAgfVxufSIsICJpbXBvcnQgeyBCYXNlTXlvcE1lc3NhZ2UgfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG4vLyBzZW50IGJ5IGhvc3QgdG8gY29tcG9uZW50cywgY29udGFpbnMgdGhpZXIgaWQgXG5leHBvcnQgY2xhc3MgSW5pdE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8eyBpZDogc3RyaW5nIH0+IHtcbiAgICBtZXNzYWdlVHlwZSA9ICdJbml0TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgdGhpcy5jb250ZW50ID0geyBpZCB9XG4gICAgfVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cblxuLy8gY29tcG9uZW50IG5vdGlmeSBob3N0IHRoZSBpdCB3YXMgaW5pdGF0ZWQgXG5leHBvcnQgY2xhc3MgSW5pdFJlc3BvbnNlIGV4dGVuZHMgSW5pdE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRSZXNwb25zZSc7XG59XG5cbi8vIGNvbXBvbmVudCBhc2sgdG8gaG9zdCB0byBnZXQgaW5pdGF0ZWQgXG5leHBvcnQgY2xhc3MgSW5pdFJlcXVlc3QgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRSZXF1ZXN0Jztcbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7SUNvbXBvbmVudENvbmZpZywgSVJlZkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdC9ob3N0U0RLLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZDb25maWc6IElSZWZDb25maWcsXG4gICAgICAgICAgICAgICAgcHVibGljIG5lc3RlZENvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgb3B0aW9uczogbG9hZGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UpID0+IHZvaWQsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuXG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBOZXN0ZWRSZWYgPSB7XG4gICAgcmVmTmFtZTogc3RyaW5nLFxuICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBuZXN0ZWRSZWZzOiBOZXN0ZWRSZWZbXSwgcHVibGljIGZhaWxlZD86IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBFbnZlbG9wZWRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdFbnZlbG9wZWRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBkZXN0aW5hdGlvbjogc3RyaW5nLCBwdWJsaWMgbWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgY29uc3QgaW5uZXJFbnZlbG9wZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZSk7XG4gICAgICAgIHRoaXMucm91dGUgPSBbZGVzdGluYXRpb24sIC4uLmlubmVyRW52ZWxvcGVkTWVzc2FnZS5yb3V0ZSA/IGlubmVyRW52ZWxvcGVkTWVzc2FnZS5yb3V0ZSA6IFtdXTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtJRWxlbWVudFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPGFueSwgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnXG4gICAgcmVwbHlNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbn1cblxuZXhwb3J0IGNsYXNzIERldGVjdGVkTXlvcFJlZnNNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPElFbGVtZW50UmVmW10+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgbXlvcEVsZW1lbnRSZWZzOiBJRWxlbWVudFJlZltdKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcilcbiAgICAgICAgdGhpcy5jb250ZW50ID0gbXlvcEVsZW1lbnRSZWZzO1xuICAgIH1cblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlPGFueT4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0dldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZW50OiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxudHlwZSBNZXRob2ROYW1lczxUPiA9IHtcbiAgICAvLyBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gSyA6IG5ldmVyO1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKCkgPT4gdm9pZCA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbi8vIERlZmluZSBhIHR5cGUgdGhhdCBhbGxvd3Mgb25seSBzdHJpbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ldGhvZCBuYW1lcyBvZiBUXG50eXBlIE1ldGhvZFN0cmluZzxUPiA9IE1ldGhvZE5hbWVzPFQ+IGV4dGVuZHMgaW5mZXIgTSA/IE0gZXh0ZW5kcyBzdHJpbmcgPyBNIDogbmV2ZXIgOiBuZXZlcjtcblxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWV0aG9kOiBNZXRob2RTdHJpbmc8SU15b3BDb21wb25lbnQ+KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFNldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnO1xufSIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdDbGVhbnVwUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIENsZWFudXBNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIENsZWFudXBSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdDbGVhbnVwTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY2xlYW51cEZvck1lc3NhZ2VJZDogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogQ2xlYW51cFJlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2xlYW51cFJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGN1c3RvbUNsZWFudXA6IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBEaXNwb3NlTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRGlzcG9zZU1lc3NhZ2UnO1xufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnO1xufVxuXG5leHBvcnQgY2xhc3MgUmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnO1xufSIsICJleHBvcnQgKiBmcm9tICcuL0Jhc2VNZXNzYWdlJztcblxuLy91c2VyJ3MgbWVzc2FnZXNcbmV4cG9ydCAqIGZyb20gJy4vQmluZENsaWNrTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZVRleHRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DdXN0b21SZWZNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9TZXRBdHRyaWJ1dGVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL1NldElubmVySHRtbCc7XG5cbi8vc3lzdGVtIG1lc3NhZ2VzXG5leHBvcnQgKiBmcm9tICcuL0luaXRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0VudmVsb3BlZE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9EZXRlY3RNeW9wUmVmc01lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gICcuL0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL0V4ZWN1dGVDb21wb25lbnRNZXRob2QnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NsZWFudXBNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRGlzcG9zZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOyIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5LCBNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBEaXNwb3NlTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCwgTWVzc2FnZURpcmVjdGlvbixcbiAgICBDbGVhbnVwTWVzc2FnZSwgQ2xlYW51cFJlcGxheU1lc3NhZ2UsXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7SG9zdFNESywgbG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuLyoqXG4gKiBSZXN1bHQgcmV0dXJuZWQgYnkgb2JzZXJ2ZUF1dG9TaXplIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b1NpemVSZXN1bHQge1xuICAgIC8qKiBDdXJyZW50IHdpZHRoIChmcm9tIGNvbnRlbnQpICovXG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICAvKiogQ3VycmVudCBoZWlnaHQgKGZyb20gY29udGVudCkgKi9cbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICAvKiogV2hldGhlciB3aWR0aCBpcyBiZWluZyBhdXRvLXNpemVkICovXG4gICAgYXV0b1NpemluZ1dpZHRoOiBib29sZWFuO1xuICAgIC8qKiBXaGV0aGVyIGhlaWdodCBpcyBiZWluZyBhdXRvLXNpemVkICovXG4gICAgYXV0b1NpemluZ0hlaWdodDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBvYnNlcnZlQXV0b1NpemUgbWV0aG9kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b1NpemVPcHRpb25zIHtcbiAgICAvKiogQ2FsbGJhY2sgY2FsbGVkIHdpdGggc2l6ZSBpbmZvIHdoZW5ldmVyIHNpemUgY2hhbmdlcyAqL1xuICAgIG9uU2l6ZUNoYW5nZT86IChyZXN1bHQ6IEF1dG9TaXplUmVzdWx0KSA9PiB2b2lkO1xuICAgIC8qKiBNaW5pbXVtIHdpZHRoIGNvbnN0cmFpbnQgKi9cbiAgICBtaW5XaWR0aD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWF4aW11bSB3aWR0aCBjb25zdHJhaW50ICovXG4gICAgbWF4V2lkdGg/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIE1pbmltdW0gaGVpZ2h0IGNvbnN0cmFpbnQgKi9cbiAgICBtaW5IZWlnaHQ/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIE1heGltdW0gaGVpZ2h0IGNvbnN0cmFpbnQgKi9cbiAgICBtYXhIZWlnaHQ/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIEV4cGxpY2l0IHdpZHRoIHNldCBieSBob3N0IC0gaWYgZGVmaW5lZCwgZG9uJ3QgYXV0by1zaXplIHdpZHRoICovXG4gICAgZXhwbGljaXRXaWR0aD86IHN0cmluZyB8IG51bWJlcjtcbiAgICAvKiogRXhwbGljaXQgaGVpZ2h0IHNldCBieSBob3N0IC0gaWYgZGVmaW5lZCwgZG9uJ3QgYXV0by1zaXplIGhlaWdodCAqL1xuICAgIGV4cGxpY2l0SGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIC8qKiBGb3JjZSBhdXRvLXNpemUgZXZlbiBpZiBjb250YWluZXIgaGFzIGRpbWVuc2lvbnMgKi9cbiAgICBmb3JjZUF1dG9TaXplPzogYm9vbGVhbjtcbiAgICAvKiogTWluIGhlaWdodCB1c2VkIGJ5IGxvYWRlciB0byBkZXRlY3QgY29sbGFwc2UgKGRlZmF1bHQ6IDUwKSAqL1xuICAgIGxvYWRlck1pbkhlaWdodD86IG51bWJlcjtcbn1cblxuLy9UT0RPIDogY2hhbmdlIElNeW9wQ29tcG9uZW50IHRvIHJlZiBzcGVjaWZpYyBpbXBsXG50eXBlIFJlZlR5cGVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IElNeW9wQ29tcG9uZW50IHwgUmVmXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wQ29tcG9uZW50PFAgPSBhbnksIFIgPSBhbnk+IHtcblxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBpc0luaXRpYXRlZDogYm9vbGVhbjtcblxuICAgIG1hcmtlZEZvckRpc3Bvc2VkOiBib29sZWFuO1xuXG4gICAgc2V0SW5pdGlhdGVkOiAoKSA9PiB2b2lkXG5cbiAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudFxuXG4gICAgLy9yZWYgY29tcG9uZW50cyBjYW4gYmUgZWxlbWVudC1sZXNzXG4gICAgZWxlbWVudD86IEhUTUxFbGVtZW50XG5cbiAgICBzZW5kOiAobXNnOiBCYXNlTXlvcE1lc3NhZ2UpID0+IENsZWFudXBIYW5kbGVyXG5cbiAgICBiaW5kKG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKCkgPT4gYm9vbGVhbik6IHZvaWQ7XG5cbiAgICBiaW5kPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4pOiB2b2lkO1xuXG4gICAgLy8gYm9vbGVhbiByZXR1cm5lZCB2YWx1ZSA9IGhhbmRsZWQgb3Igbm90XG4gICAgb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IEJhc2VNeW9wTWVzc2FnZSkgPT4gYm9vbGVhblxuXG4gICAgaW5pdGlhdGVkOiAoKSA9PiBQcm9taXNlPGFueT47XG5cbiAgICBkaXNwb3NlOiAoKSA9PiB2b2lkXG5cbiAgICBoaWRlKCk6IHZvaWQ7XG5cbiAgICBzaG93KCk6IHZvaWQ7XG5cbiAgICBpbnNwZWN0KCk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZlcyB0aGUgaWZyYW1lIGNvbnRlbnQgc2l6ZSBhbmQgYXV0b21hdGljYWxseSBzeW5jcyBpdCB0byB0aGUgaWZyYW1lIGVsZW1lbnQuXG4gICAgICogT25seSBhdmFpbGFibGUgZm9yIGlmcmFtZS1iYXNlZCBjb21wb25lbnRzLiBVc2VzIGRpcmVjdCBjb250ZW50RG9jdW1lbnQgYWNjZXNzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZyBzaXplIGNoYW5nZSBjYWxsYmFjayBhbmQgbWluL21heCBjb25zdHJhaW50c1xuICAgICAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gc3RvcCBvYnNlcnZpbmdcbiAgICAgKi9cbiAgICBvYnNlcnZlQXV0b1NpemU/OiAob3B0aW9ucz86IEF1dG9TaXplT3B0aW9ucykgPT4gQ2xlYW51cEhhbmRsZXI7XG5cbiAgICBwYXJlbnQ/OiBJTXlvcENvbXBvbmVudDtcblxuICAgIHByb3BzOiBQXG5cbiAgICByZWZzOiBSXG59XG5cbmZ1bmN0aW9uIGlzSW5oZXJpdEZyb20ob2JqOiBhbnksIGJhc2VDbGFzczogYW55KSB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG5cbiAgICBpZiAoIXByb3RvKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAocHJvdG8uY29uc3RydWN0b3IubmFtZSA9PT0gYmFzZUNsYXNzLm5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBpc0luaGVyaXRGcm9tKHByb3RvLCBiYXNlQ2xhc3MpO1xufVxuXG4vLyBUT0RPIDogbW92ZSA6IFxudHlwZSBtZXNzYWdlSGFuZGxlcjxUPiA9IChtZXNzYWdlOiBUKSA9PiBib29sZWFuO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiBleHRlbmRzIFJlZlR5cGVzID0gUmVmVHlwZXM+IGltcGxlbWVudHMgSU15b3BDb21wb25lbnQ8UD4ge1xuICAgIGlkOiBzdHJpbmcgPSAnJ1xuXG4gICAgbWVzc2FnZUhhbmRsZXJzOiBSZWNvcmQ8c3RyaW5nLCBtZXNzYWdlSGFuZGxlcjxhbnk+W10+ID0ge307XG5cbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnRcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICB0aGlzLmlkID0gb3B0aW9ucz8uaWQgfHwgSG9zdFNESy5JbnN0YW5jZSgpLmFzc2lnbklkKGNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucz8udGltZW91dCA/IG9wdGlvbnM/LnRpbWVvdXQgOiA1ICogMTAwMDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWF0ZWQgJiYgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdCAmJiAhdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KGB0aW1lb3V0XyR7dGltZW91dH0gJHt0aGlzLmlkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICAvLyBUT0RPIDogYXV0byBpbnNwZWN0LCBjb250cm9sIGZyb20gY29uZmlnXG4gICAgICAgIHRoaXMuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAod2luZG93Lm15b3AuaG9zdFNESy5pbnNwZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluc3BlY3QoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGdldCBtYXJrZWRGb3JEaXNwb3NlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkO1xuICAgIH1cblxuICAgIHNldCBtYXJrZWRGb3JEaXNwb3NlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbjogVGhlIGNvbXBvbmVudCBpcyBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRpc3Bvc2VkLiBEaXNwb3NlIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGFnYWluIHVudGlsIHRoZSBjdXJyZW50IGRpc3Bvc2FsIHByb2Nlc3MgaXMgY29tcGxldGUuJylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGhpZGUoKTogdm9pZDtcblxuICAgIGFic3RyYWN0IHNob3coKTogdm9pZDtcblxuICAgIGFic3RyYWN0IGluc3BlY3QoKTogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvL1RPRE86IHVzZSBiaW5kV2hlbiB3aXRoIHJldHVybiB0cnVlIHByZWRpY2F0ZSAuLi5cbiAgICBiaW5kID0gPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25cbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0uaW5jbHVkZXMoaGFuZGxlcikpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXS5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZFdoZW4gPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgcHJlZGljYXRlOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbiwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IHZvaWQpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IHVzZSBjb21wb25lbnQuYmluZFdoZW4gd2l0aG91dCBhbiBoYW5kbGVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdID0gW11cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdO1xuXG4gICAgICAgIGNvbnN0IHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyID0gKGU6IFQpID0+IHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vVE9ETyA6IGhhbmRsZSBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uID9cbiAgICAgICAgaGFuZGxlcnMucHVzaChwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGFuZGxlcnMuaW5kZXhPZihwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnb25NZXNzYWdlUmVjZWl2ZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCBpbmNvbWVNZXNzYWdlLCB0aGlzKTtcbiAgICAgICAgLy9UT0RPIDogaGFuZGVsIHNwZWNpYWwgZXZldHMgPyBsaWtlIGluaXRSZXMgP1xuICAgICAgICBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVDb21wb25lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChpbmNvbWVNZXNzYWdlIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpO1xuXG4gICAgICAgICAgICAvL2tlZXBpbmcgdGhpcy5tZXRob2QoKSBzbyB0aGF0IGNvbnRleHQgd2lsbCBzYXZlZFxuICAgICAgICAgICAgaWYgKCh0aGlzIGFzIGFueSlbdHlwZWRNZXNzYWdlLm1ldGhvZF0pIHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpW3R5cGVkTWVzc2FnZS5tZXRob2RdKHR5cGVkTWVzc2FnZS5jb250ZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYG1ldGhvZCBub3QgZm91bmQgJHt0eXBlZE1lc3NhZ2UubWV0aG9kfSBvbiBjb21wb25lbnRgLCB0aGlzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZV07XG4gICAgICAgIGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IGhhbmRsZWQgfHwgaGFuZGxlcihpbmNvbWVNZXNzYWdlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9UT0RPIDogY29uc29sZSBvbmx5IHdoZW4gZGVidWcgY29uZmlnXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdubyBoYW5kbGVycyBmb3VuZCBmb3IgJywgaW5jb21lTWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmlzSW5pdGlhdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUpXG4gICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBfd2hlbkluaXRpYXRlZFJlc29sdmU/OiAodmFsdWU/OiBhbnkpID0+IGFueTtcbiAgICBfd2hlbkluaXRpYXRlZFJlamVjdD86ICh2YWx1ZT86IGFueSkgPT4gYW55O1xuXG4gICAgX3doZW5Jbml0aWF0ZWQ6IFByb21pc2U8YW55PiA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgaW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2hlbkluaXRpYXRlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbmRDbGVhbnVwTWVzc2FnZShtZXNzYWdlOiBDbGVhbnVwTWVzc2FnZSk6IHZvaWQge1xuICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG4gICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSB0aGlzLmlkO1xuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcblxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuYmluZFdoZW4obWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1zZy5yZXBsYXlUb0hhbmRsZXIgPT09IG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgIH0sIChtOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZS5oYW5kbGVyKG0pO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlcjtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBkZWxldGUgbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgdGhpcy5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgc2VuZChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciB7XG4gICAgICAgIC8vbWVzc2FnZXMgdGhhdCBleGV0cmFjdGVkIGZyb20gZW52ZWxvcGUgYWxyZWFkeSBoYXZlIHNvdXJjZSBpbiB0aGVtXG4gICAgICAgIGlmICghbWVzc2FnZS5zb3VyY2UpXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLmRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHRoaXMuaWQ7XG5cbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG5cbiAgICAgICAgbGV0IGNsZWFudXBIYW5kbGVyO1xuICAgICAgICAvLyBUT0RPIDogZml4IGhlYXZ5IG9wLi5cbiAgICAgICAgLy8gIGlmIChpc0luaGVyaXRGcm9tKG1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAobWVzc2FnZS5oYW5kbGVyKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBNeW9wQmluZE1lc3NhZ2UpO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIgPSB0aGlzLmJpbmRXaGVuKHR5cGVkTWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBtc2cucmVwbGF5VG9IYW5kbGVyID09PSB0eXBlZE1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgICAgICB9LCB0eXBlZE1lc3NhZ2UuaGFuZGxlcik7XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlLmhhbmRsZXJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICBpZiAobWVzc2FnZS5yZWYpIHtcbiAgICAgICAgICAgIC8vIHNlcmlhbGl6YWJsZVxuICAgICAgICAgICAgbWVzc2FnZS5yZWYgPSBtZXNzYWdlLnJlZi5fX25vblByb3hpZWQgfHwgbWVzc2FnZS5yZWY7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kQ2xlYW51cE1lc3NhZ2UobmV3IENsZWFudXBNZXNzYWdlKG1lc3NhZ2UuaWQsIChyZXBsYXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nIHJlcGxheT9cbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xlYW51cEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhdGVkKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiB1c2Ugc2RrLmxvZ2dlclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZGlzcG9zaW5nIGJlZm9yZSBpc0luaXRpYXRlZCcsIHRoaXMuaWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdkaXNwb3NpbmcgY29tcG9uZW50JywgdGhpcy5pZCk7XG5cbiAgICAgICAgLy8gLy9UT0RPIDogaW1wbGVtZW50IGRpc3Bvc2UgZmxvd1xuICAgICAgICAvLyBPYmplY3Qua2V5cyh0aGlzLnJlZnMpLmZvckVhY2gocmVmS2V5PT57XG4gICAgICAgIC8vICAgICB0aGlzLnJlZnNbcmVmS2V5XS5kaXNwb3NlKCk7XG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRoZXJlIGlzIGFueSB0aW1lIGZvciB0aGUgb1xuICAgICAgICAvLyB0aGVyIHNpZGUgdG8gcHJvY2Nlc3MgdG8gbWVzc2FnZSBiZWZvcmUgZGllID9cbiAgICAgICAgLy9ub3RpZnkgdGhlIG90aGVyIHNpZGUgU0RLXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRGlzcG9zZU1lc3NhZ2UoKSlcblxuICAgICAgICBjb25zdCBvbkRpc3Bvc2VIYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzWydvbkRpc3Bvc2UnXVxuICAgICAgICBpZiAob25EaXNwb3NlSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIG9uRGlzcG9zZUhhbmRsZXJzLmZvckVhY2goZGlzcG9zZUhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgbnVsbCBvciBmaXggdGhlIHR5cGUgP1xuICAgICAgICAgICAgICAgIGRpc3Bvc2VIYW5kbGVyKG51bGwpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5jb250YWluZXIpO1xuICAgICAgICAvL3RoaXMuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycyA9IHt9XG4gICAgICAgIHRoaXMuaWQgKz0gJ19kaXNwb3NlZCc7XG4gICAgICAgIHRoaXMuaXNJbml0aWF0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm9wczogUCA9IHt9IGFzIHVua25vd24gYXMgUDtcbiAgICByZWZzOiBSID0ge30gYXMgdW5rbm93biBhcyBSO1xufVxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSUVsZW1lbnRSZWYge1xuICAgIG15b3BJZD86IHN0cmluZ1xuICAgIGh0bWxUYWdOYW1lOiBzdHJpbmdcbiAgICBCb3VuZGluZ1JlY3Q/OiBET01SZWN0XG4gICAgb2Zmc2V0VG9wPzogbnVtYmVyXG4gICAgb2Zmc2V0TGVmdD86IG51bWJlclxuXG4gICAgdHlwZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBYUGF0aEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHhQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIGh0bWxUYWdOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIEJvdW5kaW5nUmVjdD86IERPTVJlY3QsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldFRvcD86IG51bWJlcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0TGVmdD86IG51bWJlcikge1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnWFBhdGhFbGVtZW50UmVmJ1xufVxuXG5leHBvcnQgY2xhc3MgTXlvcEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG15b3BJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBodG1sVGFnTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBCb3VuZGluZ1JlY3Q/OiBET01SZWN0LFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRUb3A/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldExlZnQ/OiBudW1iZXIpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnTXlvcEVsZW1lbnRSZWYnXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlcn0gZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IHR5cGUgSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgPSBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+IHwgUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCBjb25zdCBydW5FeGVjdXRvckNsZWFudXAgPSBhc3luYyAodGFzazogSU1lc3NhZ2VFeGVjdXRvckNsZWFudXApID0+IHtcbiAgICBpZiAodHlwZW9mIHRhc2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gSXQncyBhIGZ1bmN0aW9uLCBjYWxsIGl0XG4gICAgICAgIHRhc2soKTtcbiAgICB9IGVsc2UgaWYgKHRhc2sgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIC8vIEl0J3MgYSBQcm9taXNlLCBhd2FpdCBpdFxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXNrO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIGEgZnVuY3Rpb24sIGNhbGwgaXRcbiAgICAgICAgICAgIHJlc3VsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRhc2sgaXMgdm9pZCwgZG8gbm90aGluZ1xufVxuXG50eXBlIElNZXNzYWdlRXhlY3V0b3I8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4gPSAobWVzc2FnZTogVCkgPT4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXA7XG5cbmludGVyZmFjZSBJTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxuXG4gICAgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBpbXBsZW1lbnRzIElNZXNzYWdlSGFuZGxlcjxUPiB7XG5cbiAgICAvL1RPRE8gOiBhZGQgZGlzcG9zZSBtZXRob2RcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZCkge1xuXG4gICAgfVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG4gICAgYWJzdHJhY3QgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnksIEUgPSBhbnk+IGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQsIHB1YmxpYyBjb250ZXh0PzogRSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgcnVuRXhlY3V0b3JDbGVhbnVwfSBmcm9tIFwiLi9pbmRleC50c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL2Jhc2VNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsIENsZWFudXBNZXNzYWdlLCBDbGVhbnVwUmVwbGF5TWVzc2FnZSwgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgRW52ZWxvcGVkTWVzc2FnZSxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVzcG9uc2UsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgSG9zdGVkQ29tcG9uZW50PFQgPSBhbnk+IHtcbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgIH1cblxuICAgIC8vb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IElNeW9wTWVzc2FnZSkgPT4gdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBpZDogc3RyaW5nLCBwdWJsaWMgY29udGV4dD86IFQpIHtcblxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcFNESyB7XG4gICAgaW5pdDogKCkgPT4gdm9pZDtcblxuICAgIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkXG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW107XG5cbiAgICBoYW5kbGVJbmNvbWVNZXNzYWdlczogKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4gdm9pZFxuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50Pjtcbn1cblxuLy8gY29uc3QgbG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzID0gW1xuLy8gICAgIE15b3BNZXNzYWdlcy5Jbml0UmVxdWVzdCxcbi8vICAgICBNeW9wTWVzc2FnZXMuSW5pdFJlc3BvbnNlLFxuLy8gICAgIC8vTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UsXG4vLyBdXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcFNESyBpbXBsZW1lbnRzIElNeW9wU0RLIHtcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdO1xuXG4gICAgbWVzc2FnZVRvSGFuZGxlQWZ0ZXJJbml0OiBCYXNlTXlvcE1lc3NhZ2VbXSA9IFtdO1xuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PiA9IHt9O1xuXG4gICAgYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBtZXNzYWdlQ2xlYW51cENhY2hlOiBSZWNvcmQ8c3RyaW5nLCBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+PiB8IFByb21pc2U8dm9pZD4gPSB7fTtcblxuICAgIGhhbmRsZUluY29tZU1lc3NhZ2VzKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gZXZlbnQuZGF0YSA/IGV2ZW50LmRhdGEgOiBldmVudC5kZXRhaWw7XG5cbiAgICAgICAgaWYgKCFldmVudENvbnRlbnQgfHwgIWV2ZW50Q29udGVudC5teW9wKSB7XG4gICAgICAgICAgICAvLyBub3QgbXlvcCBtYXJrZWQgZXZlbnQgXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGV2ZW50Q29udGVudCBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLmRpcmVjdGlvbiAhPT0gTWVzc2FnZURpcmVjdGlvbi5kb3duKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbWVzc2FnZSBkcm9wcGVkIGluIGJhc2VTREssIGRpcmVjdGlvbiB3YXMgJywgZXZlbnQuZGF0YS5kaXJlY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiAobG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzLmluY2x1ZGVzKG1lc3NhZ2UubWVzc2FnZVR5cGUpKSB7XG4gICAgICAgICAgICAvLyAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyAgICAgLy9UT0RPIDogZml4IGRpcmVjdGlvbiA/IG1lc3NhZ2Ugd2lsbCBub3QgcHJvY2Nlc3Mgb3RoZXJ3aXNlXG4gICAgICAgICAgICAvLyAgICAgd2luZG93Lm15b3AuaG9zdFNESy5zZW5kKG1lc3NhZ2UpXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkRpc3Bvc2VNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNob3VsZCBub3QgYmUgb3B0aW9uYWwsIGZpeCBhbmQgcmVtb3ZlICdpZidcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5kZXN0aW5hdGlvbilcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uXVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gV2UgZ290IG91ciBpZCBmcm9tIG91ciBob3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogU0RLIG1heSBzZXJ2ZSBtb3JlIHRoYW4gMSBjb21wb25lbnQgLi4gdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb21wb25lbnRJZCA9IChtZXNzYWdlIGFzIEluaXRNZXNzYWdlKS5jb250ZW50LmlkO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgRXJyb3IoXCJyZWNoaXZlZCBpbml0IG1lc3NhZ2UgZm9yIGFuIGV4c2lzaW5nIGNvbXBvbmVudC5cIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0gPSBuZXcgSG9zdGVkQ29tcG9uZW50KG5ld0NvbXBvbmVudElkKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlc3BvbnNlKG5ld0NvbXBvbmVudElkKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogaXMgaXQgdHJ1ZSB0byBub3QgcGFzcyBmdXJ0aGVyICggdG8gdGhlIGNvbXBvbmVudCApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBmb3Igc2FtZSBIb3N0U0RLIGNhc2VzXG4gICAgICAgICAgICAvLyB3aGVuIGJvdGggUmVmQ29tcG9uZW50IGFuZCByZWFsQ29tcG9uZW50IGhvc3RlZCBpbiB0aGUgc2FtZSBIb3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnZlbG9wZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXJNZXNzYWdlID0gZW52ZWxvcGVkTWVzc2FnZS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBpbm5lck1lc3NhZ2U7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0IHx8IHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uIV0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkNvbXBvbmVudCA9IG15b3AuaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBpbm5lck1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdGluYXRpb25Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQ29tcG9uZW50LnNlbmQoaW5uZXJNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQgPSBteW9wLmhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gZW52ZWxvcGVkTWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQuc2VuZChpbm5lck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2Upe1xuICAgICAgICAgICAgLy8gICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG4gICAgICAgICAgICAvLyAvLyAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNsZWFudXBNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ2xlYW51cE1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbdHlwZWRNZXNzYWdlLmNsZWFudXBGb3JNZXNzYWdlSWRdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXBNZXNzYWdlID0gbmV3IENsZWFudXBSZXBsYXlNZXNzYWdlKCEhY2xlYW51cCk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXBNZXNzYWdlLmRlc3RpbmF0aW9uID0gbWVzc2FnZS5kZXN0aW5hdGlvbjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoISFjbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW3R5cGVkTWVzc2FnZS5jbGVhbnVwRm9yTWVzc2FnZUlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkV4ZWN1dG9yQ2xlYW51cChjbGVhbnVwKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QoY2xlYW51cE1lc3NhZ2UsIHR5cGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogaGFuZGVsIGVycm9yP1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChjbGVhbnVwTWVzc2FnZSwgdHlwZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGFjdGlvbkhhbmRsZXJGb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zdXBwb3J0ZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlci5tZXNzYWdlVHlwZSA9PT0gbWVzc2FnZS5tZXNzYWdlVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uSGFuZGxlckZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSBoYW5kbGVyLmV4ZWN1dG9yKG1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUgJiYgY2xlYW51cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVttZXNzYWdlLmlkXSA9IGNsZWFudXA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhbnVwICYmICFtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2xlYW51cCBoYW5kbGVyIGdlbmVyYXRlZCBmb3Igbm9uLWNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjbGVhbnVwICYmIG1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjbGVhbnVwIGhhbmRsZXIgZ2VuZXJhdGVkIGZvciBhIGNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbkhhbmRsZXJGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBwcmludCB3aXRoIGRlYnVnIGNvbmZpZyBvbmx5XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25vIG1lc3NhZ2UgaGFuZGxlciB3YXMgZm91bmQgZm9yICcsIG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndW5zdXBwb3J0ZWQgbWVzc2FnZSB0eXBlJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFic3RyYWN0IGluaXQ6ICgpID0+IHZvaWQ7XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCAqIGZyb20gJy4vTXlvcEVsZW1lbnRSZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9iYXNlTWVzc2FnZUhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9CYXNlTXlvcFNESyc7XG5cbmV4cG9ydCB0eXBlIENsZWFudXBIYW5kbGVyID0gKCkgPT4gdm9pZFxuXG5leHBvcnQgdHlwZSBEaWN0aW9uYXJ5PFQ+ID0geyBba2V5OiBzdHJpbmddOiBUOyB9O1xuXG4vL2V4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0gJ0lmcmFtZUxvYWRlcicgfCAnV2ViQ29tcG9uZW50TG9hZGVyJyB8ICdIVE1MTG9hZGVyJyB8IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IFNraW5Mb2FkZXJzID0ge1xuICAgIFwiSWZyYW1lTG9hZGVyXCI6IFwiSWZyYW1lTG9hZGVyXCIsXG4gICAgXCJXZWJDb21wb25lbnRMb2FkZXJcIjogXCJXZWJDb21wb25lbnRMb2FkZXJcIixcbiAgICBcIkhUTUxMb2FkZXJcIjogXCJIVE1MTG9hZGVyXCIsXG4gICAgXCJNaW5pbWl6ZWRMb2FkZXJcIjogXCJNaW5pbWl6ZWRMb2FkZXJcIlxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0ga2V5b2YgdHlwZW9mIFNraW5Mb2FkZXJzO1xuXG5leHBvcnQgdHlwZSBQcm9wVHlwZSA9ICdhbnknIHwgJ3N0cmluZycgfCAnbnVtYmVyJyB8IHN0cmluZzsgLy8gVE9ETyA6IDxcbmV4cG9ydCB0eXBlIFJlZlNlbGVjdG9yVHlwZSA9ICdpZC1hdHRyaWJ1dGUnIHwgJ2Nzcy1zZWxlY3RvcicgfCAneHBhdGgnIHwgc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgTG9hZGVyRnJhbWV3b3JrcyA9IHtcbiAgICBcInJlYWN0XCI6IFwicmVhY3RcIixcbiAgICBcInZ1ZVwiOiBcInZ1ZVwiLFxuICAgIFwiYW5ndWxhclwiOiBcImFuZ3VsYXJcIixcbn0gYXMgY29uc3RcbmV4cG9ydCB0eXBlIExvYWRlckZyYW1ld29ya1R5cGUgPSBrZXlvZiB0eXBlb2YgTG9hZGVyRnJhbWV3b3JrcztcblxuZXhwb3J0IGludGVyZmFjZSBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiV2ViQ29tcG9uZW50TG9hZGVyXCI7XG4gICAgdXJsOiBzdHJpbmcsXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgZnJhbWV3b3JrPzogTG9hZGVyRnJhbWV3b3JrVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElJZnJhbWVMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJJZnJhbWVMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZ1xuICAgIGF1dG9IZWlnaHQ6IGJvb2xlYW5cbiAgICBoZWlnaHQ/OiBzdHJpbmdcbiAgICB3aWR0aD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgU2hhZG93Um9vdE1vZGVUeXBlID0ge1xuICAgIFwib3BlblwiOiBcIm9wZW5cIixcbiAgICBcImNsb3NlZFwiOiBcImNsb3NlZFwiLFxuICAgIFwibm9uZVwiOiBcIm5vbmVcIixcbiAgICBcImxvY2FsRnJhbWVcIjogXCJsb2NhbEZyYW1lXCJcbn0gYXMgY29uc3Q7XG5cblxuZXhwb3J0IGludGVyZmFjZSBJSFRNTExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIkhUTUxMb2FkZXJcIjtcbiAgICBIVE1MOiBzdHJpbmc7XG4gICAgLy9UT0RPOiByZW5hbWUocm9vdE1vZGUvY3VzdG9tRWxlbWVudE1vZGUpICsgZGIgbWlncmF0aW9uXG4gICAgc2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlO1xuICAgIGF1dG9IZWlnaHQ/OiBib29sZWFuO1xuICAgIGhlaWdodD86IHN0cmluZztcbiAgICB3aWR0aD86IHN0cmluZztcbn1cblxuLy9mb3IgaW50ZXJuYWwgZGFzaGJvYXJkIHVzYWdlXG5leHBvcnQgaW50ZXJmYWNlIElNaW5pbWl6ZWRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJNaW5pbWl6ZWRMb2FkZXJcIjtcbn1cblxuaW50ZXJmYWNlIERhc2hib2FyZE9iamVjdCB7XG4gICAgX3RlbXBfY2xpZW50X2lkPzogc3RyaW5nLFxufVxuXG50eXBlIEV4dGVuZDxULCBVPiA9IFQgJiBVO1xuXG50eXBlIEV4dGVuZFJlY3Vyc2l2ZWx5PFQsIEU+ID0ge1xuICAgIFtLIGluIGtleW9mIEVdOiBFW0tdO1xufSAmIHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIG9iamVjdFxuICAgICAgICA/IEV4dGVuZFJlY3Vyc2l2ZWx5PFRbS10sIEU+XG4gICAgICAgIDogVFtLXTtcbn07XG5cbmV4cG9ydCB0eXBlIElEYXNoYm9hcmQ8VD4gPSBFeHRlbmRSZWN1cnNpdmVseTxULCBEYXNoYm9hcmRPYmplY3Q+O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBTa2luTG9hZGVyVHlwZVxuXG4gICAgW2tleTogc3RyaW5nXTogYW55OyAvLyBBbGxvd3MgYW55IGFkZGl0aW9uYWwgcHJvcGVydGllc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lSZWxlYXNlTWV0YWRhdGEge1xuICAgIGVudmlyb25tZW50SWQ6IHN0cmluZztcbiAgICBlbnZpcm9ubWVudElkZW50aWZpZXI6IHN0cmluZztcbiAgICAvL1xuICAgIC8vIHVwZGF0ZWRPbj86IHN0cmluZ1xuICAgIC8vIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lWYXJpYW50Q29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgcmVsZWFzZXM/OiB2Ml9JUmVsZWFzZU1ldGFkYXRhW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBsb2FkZXI6IElTa2luTG9hZGVyQ29uZmlnXG4gICAgY3JlYXRlZEJ5Pzogc3RyaW5nXG4gICAgY3JlYXRlZE9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVNraW5Db25maWcgZXh0ZW5kcyBJU2tpbkNvbmZpZyB7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCaW5kTWVzc2FnZVByb3BDb25maWcgZXh0ZW5kcyBJUHJvcENvbmZpZyB7XG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbn1cblxuZXhwb3J0IGNvbnN0IFByb3BNZXNzYWdlTW9kZXMgPSB7XG4gICAgXCJpbnB1dFwiOiBcImlucHV0XCIsXG4gICAgXCJvdXRwdXRcIjogXCJvdXRwdXRcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFByb3BDb25maWdCZWhhdmlvclR5cGVzID0ge1xuICAgIFwibWVzc2FnZVwiOiBcIm1lc3NhZ2VcIixcbiAgICBcImNvZGVcIjogXCJjb2RlXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbSB7XG4gICAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29kZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJjb2RlXCJcbiAgICByZW1hcD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wTWVzc2FnZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJtZXNzYWdlXCJcbiAgICBtZXNzYWdlOiBNeW9wTWVzc2FnZUtleVxuICAgIHJlZjogc3RyaW5nLCAvL1RPRE8gbWFrZSBpdCBpZFxuICAgIHBhcmFtczogSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbVtdXG4gICAgbW9kZToga2V5b2YgdHlwZW9mIFByb3BNZXNzYWdlTW9kZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcENvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIGJlaGF2aW9yOiBJUHJvcEJlaGF2aW9yXG59XG5cblxuZXhwb3J0IGNsYXNzIFJlZkJlaGF2aW9yVHlwZSB7XG4gICAgc3RhdGljIGNvZGUgPSAnY29kZScgYXMgY29uc3RcbiAgICBzdGF0aWMgY29tcG9uZW50ID0gJ2NvbXBvbmVudCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgSVJlZkJlaGF2aW9yVHlwZSA9ICdjb2RlJyB8ICdjb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogSVJlZkJlaGF2aW9yVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvbXBvbmVudCdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIFByb3BlcnR5IGluc3RhbmNlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICovXG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb2RlUmVmQmVoYXZpb3IgZXh0ZW5kcyBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6ICdjb2RlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgc2VsZWN0b3JUeXBlOiBSZWZTZWxlY3RvclR5cGVcbiAgICBzZWxlY3Rvcjogc3RyaW5nXG4gICAgYmVoYXZpb3I6IElSZWZCZWhhdmlvclxufVxuXG4vKipcbiAqIEV4cGVyaWVuY2Ugc2VnbWVudCBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VTZWdtZW50UnVsZSB7XG4gICAgcHJvcGVydHk6IHN0cmluZztcbiAgICBvcGVyYXRvcjogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBBL0Igc3BsaXQgdmVyc2lvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlQUJTcGxpdFZlcnNpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgcGVyY2VudGFnZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4cGVyaWVuY2UgQS9CIHNwbGl0IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZUFCU3BsaXQge1xuICAgIHZlcnNpb25zOiBJRXhwZXJpZW5jZUFCU3BsaXRWZXJzaW9uW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBzZWdtZW50IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZVNlZ21lbnQge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcnVsZXM6IElFeHBlcmllbmNlU2VnbWVudFJ1bGVbXTtcbiAgICB1c2VBYjogYm9vbGVhbjtcbiAgICBjb21wb25lbnRWYXJpYW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gICAgYWJTcGxpdD86IElFeHBlcmllbmNlQUJTcGxpdDtcbiAgICBzdGlja3lQcm9wZXJ0aWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBkZWZpbml0aW9uIGNvbmZpZyAodjIpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VEZWZpbml0aW9uQ29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIC8qKiBTZWxlY3RlZCBjb21wb25lbnQgSURzICovXG4gICAgY29tcG9uZW50czogc3RyaW5nW107XG4gICAgLyoqIFNlZ21lbnQgY29uZmlndXJhdGlvbnMgKi9cbiAgICBzZWdtZW50czogSUV4cGVyaWVuY2VTZWdtZW50W107XG4gICAgLyoqIEZhbGxiYWNrIHZhcmlhbnQgcGVyIGNvbXBvbmVudCAqL1xuICAgIGZhbGxiYWNrOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIC8qKiBUYWdzICovXG4gICAgdGFnczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgLy8gcHJvcHM6IFJlY29yZDxzdHJpbmcsIElQcm9wQ29uZmlnPiAvL2lkIC0gdHlwZVxuICAgIC8vIHJlZnM6IFJlY29yZDxzdHJpbmcsIElSZWZDb25maWc+LFxuICAgIC8vIHNraW5zOiBSZWNvcmQ8c3RyaW5nLCBJU2tpbkNvbmZpZz5cbiAgICBwcm9wczogSVByb3BDb25maWdbXSxcbiAgICByZWZzOiBJUmVmQ29uZmlnW10sXG4gICAgc2tpbnM6IElTa2luQ29uZmlnW10sXG4gICAgZGVmYXVsdFNraW46IG51bWJlcjtcblxuICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IHRoYXRcbiAgICAvL3Jlc29sdmVkRGVmaW5pdGlvbnM/OiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1tdXG4gICAgLy9UT0RPIDogbW92ZSB0byBiYXNlIGNsYXNzICggSVN0b3JhYmxlSXRlbSBvciBzby4uLilcblxuICAgIGNyZWF0ZWRPbj86IHN0cmluZ1xuICAgIGNyZWF0ZWRCeT86IHN0cmluZ1xuICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lNeW9wU3RvcmVkT2JqZWN0IGV4dGVuZHMgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICB1cGRhdGVkT24/OiBzdHJpbmdcbiAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICB2YXJpYW50c19pZHM6IHN0cmluZ1tdLFxuICAgIERUT3M6IHYyX0lEVE9bXSxcbiAgICB0YWdzOiBzdHJpbmdbXSxcblxuICAgIC8vXG4gICAgdmFyaWFudHNfbmFtZXM6IHN0cmluZ1tdLFxuICAgIHZhcmlhbnRzX2RhdGE6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBpZDogc3RyaW5nXG4gICAgICAgIHVwZGF0ZWRPbj86IHN0cmluZ1xuICAgICAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbiAgICAgICAgaGFzX3JlbGVhc2VzPzogYm9vbGVhblxuICAgIH1bXSxcblxuICAgIHByZXZpZXdfdmFyaWFudDogdjJfSVZhcmlhbnRDb25maWc7XG4gICAgZXh0cmE/OiB7XG4gICAgICAgIGZpcnN0VmFyaWFudDogdjJfSVZhcmlhbnRDb25maWc7IC8vd2hlbiBuZXcgY29tcG9uZW50IGNyZWF0ZXMgYXQgdGhlIGNsaWVudFxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JRFRPIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIGRhdGE6IG9iamVjdFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luSW5zdGFuY2VDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMsXG4gICAgLy9za2luczogSVNraW5JbnN0YW5jZUNvbmZpZ1tdXG59XG5cbmV4cG9ydCBjb25zdCBTZWdtZW50VHlwZSA9IHtcbiAgICBcIkZ1bmN0aW9uUmVzdWx0XCI6IFwiRnVuY3Rpb25SZXN1bHRcIixcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRJbnN0YW5jZSB7XG4gICAgc2VnbWVudElkOiBzdHJpbmc7XG4gICAgc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnREZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBTZWdtZW50VHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElGdW5jdGlvblJlc3VsdHNTZWdtZW50IGV4dGVuZHMgSVNlZ21lbnREZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IHR5cGVvZiBTZWdtZW50VHlwZS5GdW5jdGlvblJlc3VsdFxuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBmdW5jdGlvbjogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBTa2luU2VsZWN0b3JUeXBlcyA9IHtcbiAgICBcIlNlZ21lbnRlZFwiOiBcIlNlZ21lbnRlZFwiLFxuICAgIFwiRGVkaWNhdGVkXCI6IFwiRGVkaWNhdGVkXCIsXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIFNlbGVjdG9yIFR5cGUgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnV0IHdpbGwgYmUgYWRkZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAgICAgKiBQbGVhc2UgY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHVwZGF0ZXMuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIFwiRGVmYXVsdFwiOiBcIkRlZmF1bHRcIlxufSBhcyBjb25zdDtcblxuXG4vKipcbiAqIFRoaXMgU2tpbiBDb25maWcgVHlwZSBpcyBub3QgeWV0IHN1cHBvcnRlZCBidXQgd2lsbCBiZSBhZGRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICogUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB1cGRhdGVzLlxuICpcbiAqIEB0eXBlIHtJRGVmYXVsdFNraW5Db25maWd9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURlZmF1bHRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLkRlZmF1bHQsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRlZFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuU2VnbWVudGVkLFxuICAgIHNlZ21lbnRzOiBJU2VnbWVudEluc3RhbmNlW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGVkaWNhdGVkU2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNraW59IGluc3RlYWQuXG4gICAgICogUHJvcGVydHkgc2tpbnMgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5cbiAgICAgKiBQbGVhc2UgdXBkYXRlIHlvdXIgY29kZSB0byB1c2Uge0BsaW5rIHNraW59IGZvciBiZXR0ZXIgY29tcGF0aWJpbGl0eS5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgc2tpbnM/OiBJU2tpbkluc3RhbmNlQ29uZmlnW10gLy8gZGVwcmVjYXRlZFxuICAgIHNraW46IElTa2luSW5zdGFuY2VDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZztcblxuICAgIC8vVE9ETyA6XG4gICAgLy8gUmVmSUQgPyB0byBzdXBwb3J0IG1vcmUgdGhhbiAxIGNvbXBvbmVudCBmcm9tIHRoZSBzYW1lIHR5cGUgaW4gY29tcG9zaXRlcyA/XG5cbiAgICAvL1RPRE8gOiByZW1vdmVcbiAgICBjb21wb25lbnROYW1lOiBzdHJpbmc7IC8vIDw8IGNoZWNrXG5cbiAgICBza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWdcblxuICAgIC8vIHN0b3JpbmcgdGhlIG5lc3RlZCBjb25maWcgZm9yIHJlZiBjb21wb25lbnRzXG4gICAgbmVzdGVkQ29tcG9uZW50cz86IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1tdXG5cbiAgICAvL29ubHkgb24gR0VUP1xuICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IHRoYXRcbiAgICByZXNvbHZlZEV4cGVyaWVuY2VzPzogSUV4cGVyaWVuY2VbXVxuICAgIC8vIHdpbGwgaW5jbHVkZSBpbnN0YW5jZSBhbmQgZGVmIGNvbmZpZyBpbiBvcmRlciB0byByZW5kZXIgaW4gcHJvZHVjdGlvblxuICAgIHJlc29sdmVkTmVzdGVkQ29tcG9uZW50cz86IElDb21wb25lbnRDb25maWdbXVxufVxuXG5leHBvcnQgY29uc3QgRXhwZXJpZW5jZVR5cGVzID0ge1xuICAgIFwiU2VnbWVudFwiOiBcIlNlZ21lbnRcIixcbiAgICBcIlByb21vXCI6IFwiUHJvbW9cIixcbiAgICBcIkFCXCI6IFwiQUJcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZSB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICAvL3N0aWNraW5lc3NGYWN0b3JcbiAgICAvL0VuZERhdGVcbn1cblxuLy8gZXhwb3J0IGludGVyZmFjZSBJQUJFeHBlcmllbmNlR3JvdXAge1xuLy8gICAgIGlkOiBzdHJpbmdcbi8vICAgICBuYW1lOiBzdHJpbmdcbi8vICAgICBwZXJjZW50YWdlOiBudW1iZXJcbi8vIH1cblxuZXhwb3J0IGludGVyZmFjZSBJQUJFeHBlcmllbmNlIGV4dGVuZHMgSUV4cGVyaWVuY2Uge1xuICAgIHR5cGU6IHR5cGVvZiBFeHBlcmllbmNlVHlwZXMuQUJcbiAgICAvLyBncm91cHM6IElBQkV4cGVyaWVuY2VHcm91cFtdXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICBwZXJjZW50YWdlOiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGF0ZVJhbmdlIHtcbiAgICBpZDogc3RyaW5nXG4gICAgc3RhcnQ6IERhdGVcbiAgICBlbmQ6IERhdGVcbiAgICB0aW1lem9uZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRFeHBlcmllbmNlIGV4dGVuZHMgSUV4cGVyaWVuY2Uge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBFeHBlcmllbmNlVHlwZXNcbiAgICBzZWdtZW50OiBJU2VnbWVudERlZmluaXRpb25cbiAgICBkYXRlUmFuZ2U/OiBJRGF0ZVJhbmdlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJGbG93RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBjb21wb25lbnRzOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdbXTtcbiAgICBvcmlnaW5zOiBzdHJpbmdbXSxcbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIGJyYW5jaD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRDb25maWcge1xuICAgIGluc3RhbmNlOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdcbiAgICB0eXBlOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgLy8gVE9ETyA6IHZlcmlmeSB1bmlxdWVuZXNzIChkYXNoYm9hcmQgJiBzZXJ2ZXIpXG4gICAgbmFtZTogc3RyaW5nXG59XG5cbmludGVyZmFjZSBJQnJhbmNoYWJsZSB7XG4gICAgYnJhbmNoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJGbG93IGV4dGVuZHMgT21pdDxJVXNlckZsb3dEZWZpbml0aW9uLCAnY29tcG9uZW50cyc+LCBJQnJhbmNoYWJsZSB7XG4gICAgY29tcG9uZW50czogSUNvbXBvbmVudENvbmZpZ1tdXG59XG5cbmV4cG9ydCBjbGFzcyBSb290UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHVibGljIHNoYWRvd1Jvb3Q/OiBTaGFkb3dSb290KSB7XG5cbiAgICB9XG5cbiAgICBnZXRSb290RGl2ID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2hhZG93Um9vdCB8fCB0aGlzLmNvbnRhaW5lcikucXVlcnlTZWxlY3RvcignZGl2JylcbiAgICB9XG5cbiAgICBnZXRSb290ID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2hhZG93Um9vdCB8fCB0aGlzLmNvbnRhaW5lcik7XG4gICAgfVxufVxuIiwgImV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZTxUPiA9XG4gICAgVCBleHRlbmRzIEZ1bmN0aW9uID8gbmV2ZXIgOiAvLyBFeGNsdWRlIGZ1bmN0aW9uc1xuICAgICAgICBUIGV4dGVuZHMgQXJyYXk8aW5mZXIgVT4gPyBTZXJpYWxpemFibGU8VT5bXSA6IC8vIEhhbmRsZSBhcnJheXNcbiAgICAgICAgICAgIFQgZXh0ZW5kcyBvYmplY3QgPyB7XG4gICAgICAgICAgICAgICAgW0sgaW4ga2V5b2YgVCBhcyBUW0tdIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IEtdOiBTZXJpYWxpemFibGU8VFtLXT5cbiAgICAgICAgICAgIH0gOiBUOyAvLyBIYW5kbGUgb2JqZWN0c1xuXG5jb25zdCBpc1ByaW1pdGl2ZSA9ICh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gT2JqZWN0KHZhbHVlKTtcbn1cblxuY29uc3QgaXNGdW5jdGlvbiA9ICh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCBjb25zdCBjb250YWluc1ByaW1pdGl2ZXNPbmx5ID0gKG9iaikgPT4ge1xuICAgIGlmIChpc1ByaW1pdGl2ZShvYmopKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgY2hlY2sgaWYgaXQncyBhIG5lc3RlZCBvYmplY3RcbiAgICAgICAgICAgIGlmICghY29udGFpbnNQcmltaXRpdmVzT25seSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgICAgICAgICBjb250aW51ZTsgLy8gSXQncyBhIHByaW1pdGl2ZSwgc28gd2UgY2FuIHNraXAgaXRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gRm91bmQgYSBub24tcHJpbWl0aXZlIHZhbHVlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTsgLy8gQWxsIHZhbHVlcyBhcmUgcHJpbWl0aXZlcyBvciBuZXN0ZWQgb2JqZWN0cyB3aXRoIHByaW1pdGl2ZXNcbn1cblxuLy8gY3VycmVudGx5IHN1cHBvcnQgcm9vdCBsZXZlbCBvbmx5XG4vLyB7eDogMSwgeSA6ICdhJywgeiA6ICgpPT57Li4ufSwgaW5uZXIgOiB7IHg6IDEgLCB5IDogJ2EnfSB9XG4vLyB7eDogMSwgeSA6ICdhJ31cbi8vaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9HbG9zc2FyeS9GYWxzeVxuZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlU2tlbGV0b248VD4gPSBQYXJ0aWFsPFJlY29yZDxrZXlvZiBULCBib29sZWFuIHwgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4+PiB8IGJvb2xlYW47XG5cbmV4cG9ydCBjb25zdCBtYWtlU2VyaWFsaXphYmxlID0gPFQ+KFxuICAgIG9iajogVCxcbiAgICBza2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248VD4gPSB7fSxcbiAgICBpbmNsdWRlRmFsc3lLZXlzOiBib29sZWFuID0gdHJ1ZSwgLy8gVE9ETyA6IHVzZSB0aGF0IGFyZ1xuICAgIHNlZW46IFdlYWtNYXA8b2JqZWN0LCBTZXJpYWxpemFibGU8YW55Pj4gPSBuZXcgV2Vha01hcCgpXG4pOiBTZXJpYWxpemFibGU8VD4gPT4ge1xuXG4gICAgaWYgKGlzUHJpbWl0aXZlKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG9iaiBhcyBTZXJpYWxpemFibGU8VD47IC8vIERpcmVjdGx5IHJldHVybiBwcmltaXRpdmUgdmFsdWVzXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICBpZiAoc2Vlbi5oYXMob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlZW4uZ2V0KG9iaikhOyAvLyBSZXR1cm4gdGhlIGFscmVhZHkgcHJvY2Vzc2VkIG9iamVjdFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGFycmF5IHNlcmlhbGl6YXRpb25cbiAgICAgICAgY29uc3Qgc2VyaWFsaXphYmxlQXJyYXk6IFNlcmlhbGl6YWJsZTxhbnk+W10gPSBbXTtcbiAgICAgICAgc2Vlbi5zZXQob2JqLCBzZXJpYWxpemFibGVBcnJheSk7IC8vIFN0b3JlIHRoZSBhcnJheSBpbiBzZWVuXG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG9iai5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBvYmpbaW5kZXhdO1xuICAgICAgICAgICAgc2VyaWFsaXphYmxlQXJyYXlbaW5kZXhdID0gbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LCBza2VsZXRvbiwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YWJsZUFycmF5IGFzIFNlcmlhbGl6YWJsZTxUPjtcbiAgICB9XG5cbiAgICBpZiAob2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIENoZWNrIGZvciBjeWNsaWMgcmVmZXJlbmNlc1xuICAgICAgICBpZiAoc2Vlbi5oYXMob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlZW4uZ2V0KG9iaikhOyAvLyBSZXR1cm4gdGhlIGFscmVhZHkgcHJvY2Vzc2VkIG9iamVjdFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YWJsZU9iamVjdDogUGFydGlhbDxTZXJpYWxpemFibGU8VD4+ID0ge307XG4gICAgICAgIHNlZW4uc2V0KG9iaiwgc2VyaWFsaXphYmxlT2JqZWN0KTsgLy8gU3RvcmUgdGhlIG9iamVjdCBpbiBzZWVuXG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUga2V5IGlzIGluIHRoZSBza2VsZXRvbiBhbmQgaWYgaXQncyBhIHZhbGlkIGtleSB0byBzZXJpYWxpemVcblxuICAgICAgICAgICAgY29uc3Qga2V5SW5Ta2VsZXRvbiA9IHR5cGVvZiBza2VsZXRvbiA9PSBcImJvb2xlYW5cIiA/IHNrZWxldG9uIDogc2tlbGV0b25ba2V5XTtcblxuICAgICAgICAgICAgaWYgKGtleUluU2tlbGV0b24pIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5SW5Ta2VsZXRvbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2tlbGV0b24gaW5kaWNhdGVzIHRvIHNlcmlhbGl6ZSB0aGlzIGtleVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZUZhbHN5S2V5cyA/IG9ialtrZXldICE9PSB1bmRlZmluZWQgOiBvYmpba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphYmxlT2JqZWN0W2tleV0gPSBtYWtlU2VyaWFsaXphYmxlKG9ialtrZXldLCB0cnVlLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGtleUluU2tlbGV0b24gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBza2VsZXRvbiBpbmRpY2F0ZXMgbmVzdGVkIGtleXMgdG8gc2VyaWFsaXplXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphYmxlT2JqZWN0W2tleV0gPSBtYWtlU2VyaWFsaXphYmxlKG9ialtrZXldLCBrZXlJblNrZWxldG9uLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YWJsZU9iamVjdCBhcyBTZXJpYWxpemFibGU8VD47XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9IGFzIGFueTsgLy8gUmV0dXJuIGFuIGVtcHR5IG9iamVjdCBmb3Igb3RoZXIgY2FzZXNcbn1cbiIsICJleHBvcnQgY29uc3QgRXJyb3JzID0ge1xuICAgIG5vdFNlcmlhbGl6YWJsZVJlZkNhbGw6IChwcm9wLCBhcmcpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcblRoZSBpbnB1dCBwcm92aWRlZCB0byAnJHtwcm9wLnRvU3RyaW5nKCl9JyBpcyBub3Qgc2VyaWFsaXphYmxlLiBTZXJpYWxpemF0aW9uIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGF0IHRoZSBkYXRhIGNhbiBiZSBzYWZlbHkgdHJhbnNmZXJyZWQgdG8gdGhlIHNraW4gaW1wbGVtZW50YXRpb24uIFxuVGhlIGZvbGxvd2luZyB0eXBlcyBvZiBkYXRhIGFyZSBjb25zaWRlcmVkIG5vbi1zZXJpYWxpemFibGUgYW5kIGNhbm5vdCBiZSBwcm9jZXNzZWQ6XG5cbi0gRnVuY3Rpb25zXG4tIERPTSBlbGVtZW50c1xuLSBDbGFzcyBpbnN0YW5jZXNcbi0gQ2lyY3VsYXIgcmVmZXJlbmNlc1xuLSBTeW1ib2xzXG4tIEJpZ0ludCB2YWx1ZXNcblxuSW4gdGhlIGZvbGxvd2luZyBleGVjdXRpb24gd2UgZGV0ZWN0ZWQgOlxufn5+fn5+fn5cbiR7YXJnfSBcbn5+fn5+fn5+XG5hcyBub3Qgc2VyaWFsaXphYmxlLlxuXG5UbyByZXNvbHZlIHRoaXMgaXNzdWUsIHBsZWFzZSBlbnN1cmUgdGhhdCBhbGwgaW5wdXRzIHBhc3NlZCB0byAnJHtwcm9wLnRvU3RyaW5nKCl9JyBhcmUgaW4gYSBzZXJpYWxpemFibGUgZm9ybWF0LlxuVGhpcyB0eXBpY2FsbHkgaW5jbHVkZXMgcHJpbWl0aXZlIHR5cGVzIChzdHJpbmdzLCBudW1iZXJzLCBib29sZWFucyksIGFycmF5cywgYW5kIHBsYWluIG9iamVjdHMuIFxuSWYgeW91IG5lZWQgdG8gaW5jbHVkZSBjb21wbGV4IGRhdGEgdHlwZXMsIGNvbnNpZGVyIGNvbnZlcnRpbmcgdGhlbSB0byBhIHNlcmlhbGl6YWJsZSBzdHJ1Y3R1cmUgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byB0aGUgZnVuY3Rpb24uXG5PciB1c2UgTXlvcCBtZXNzYWdlIHRoYXQgc3VwcG9ydCBpdDogQ3VzdG9tUmVmTWVzc2FnZSwgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2Ugb3IgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UuXG5cblN1Z2dlc3RlZCBGaXg6XG4xLiBSZW1vdmUgb3IgcmVwbGFjZSBub24tc2VyaWFsaXphYmxlIHZhbHVlcyBmcm9tIHlvdXIgaW5wdXQuXG4yLiBJZiB1c2luZyBvYmplY3RzLCBlbnN1cmUgdGhleSBkbyBub3QgY29udGFpbiBhbnkgZnVuY3Rpb25zIG9yIGNpcmN1bGFyIHJlZmVyZW5jZXMuXG4zLiBDb252ZXJ0IGFueSBjbGFzcyBpbnN0YW5jZXMgdG8gcGxhaW4gb2JqZWN0cyBvciBKU09OLWNvbXBhdGlibGUgZm9ybWF0cy5cbjQuIFVzZSBkZWRpY2F0ZWQgTXlvcCBtZXNzYWdlLlxuXG5Gb3IgbW9yZSBkZXRhaWxzIG9uIHNlcmlhbGl6YXRpb24gYW5kIE15b3AgbWVzc2FnZSBleGFtcGxlcywgcmVmZXIgdG8gaHR0cHM6Ly9kb2NzLm15b3AuZGV2XFwuXG5cbmApO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BDb21wb25lbnQsIElNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIEV4ZWN1dGVDb21wb25lbnRNZXRob2R9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFbnZlbG9wZWRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZVwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG5leHBvcnQgY2xhc3MgTXlvcFJlZkNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgcHVibGljIHBhcmVudDogSU15b3BDb21wb25lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIC8vVE9ETyA6IGNoZWNrIHBhcmVudENvbXBvbmVudC5jb250YWluZXIuLi5cbiAgICAgICAgc3VwZXIoY29tcG9uZW50RGVmaW5pdGlvbiwgcGFyZW50LmNvbnRhaW5lciwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgLy90aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoYXJndW1lbnRzLmNhbGxlZS5uYW1lKSk7XG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnaGlkZScpKTtcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ3Nob3cnKSk7XG4gICAgfVxuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgLy9UT0RPIDogc3VwcG9ydCByZWFsIGNsZWFudXBcbiAgICAgICAgLy9jb25zb2xlLmxvZygncmVmIGluc3BlY3QgY2FsbGVkLCBjcmVhdGluZyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kIGluc3BlY3QnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCB0aGlzLmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnaW5zcGVjdCcpKTtcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50KCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCcpKTtcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCcpKTtcbiAgICB9XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgLy8gaWYgKGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScpIHtcbiAgICAgICAgLy8gIGRlYnVnZ2VyO1xuICAgICAgICAvLyAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gfVxuICAgICAgICByZXR1cm4gc3VwZXIub25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZSk7XG4gICAgfVxuXG5cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdyZWYgbWVzc2FnZSBzZW5kaW5nICcsIG1lc3NhZ2UpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBtZXNzYWdlLmhhbmRsZXJcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIC8vIHRoaXMuaWQgd2lsbCBiZSBhdmFpbGFibGUgb24gdGhlIG5lc3RlZCBjb21wb25lbnRcbiAgICAgICAgdGhpcy5wYXJlbnQuc2VuZChuZXcgRW52ZWxvcGVkTWVzc2FnZSh0aGlzLmlkLCBtZXNzYWdlKSk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBtZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9O1xuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNJbml0aWF0ZWQpXG4gICAgICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ2Rpc3Bvc2UnKSk7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICB9XG59XG4iLCAiLy90eXBlIEFDb25zdHJ1Y3RvclR5cGVPZjxUPiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIEN1c3RvbVJlZk1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQgKiBhcyBtZXNzYWdlcyBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQ2xlYW51cEhhbmRsZXIsIElDb21wb25lbnRDb25maWcsXG4gICAgdHlwZSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJQ29tcG9uZW50UmVmQmVoYXZpb3IsIElIVE1MTG9hZGVyQ29uZmlnLCBJUHJvcENvZGVCZWhhdmlvcixcbiAgICBJUHJvcENvbmZpZywgSVNraW5Db25maWcsIFByb3BDb25maWdCZWhhdmlvclR5cGVzLFxuICAgIFJlZkJlaGF2aW9yVHlwZSwgU2hhZG93Um9vdE1vZGVUeXBlLCBTa2luTG9hZGVycywgU2tpbkxvYWRlclR5cGVcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtjb250YWluc1ByaW1pdGl2ZXNPbmx5fSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb25cIjtcbmltcG9ydCB7RXJyb3JzfSBmcm9tIFwiLi9sb2dNZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wUmVmQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL215b3BSZWZDb21wb25lbnRcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4vaG9zdFNES1wiO1xuXG50eXBlIGNvbXBvbmVudERlZmluaXRpb25Qcm9wcyA9IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnWydwcm9wcyddXG5cbmNvbnN0IGNyZWF0ZURlYnVnVGl0bGUgPSAodGV4dDogc3RyaW5nLCB0b3A6IG51bWJlciwgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICBjb25zdCB0aXRsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIHRpdGxlRWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIHRpdGxlRWwuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgIHRpdGxlRWwuc3R5bGUucGFkZGluZyA9ICcwIDVweCc7XG4gICAgdGl0bGVFbC5zdHlsZS5mb250U2l6ZSA9ICcxNHB4JztcbiAgICB0aXRsZUVsLnN0eWxlWyd0b3AnXSA9ICcwJztcbiAgICB0aXRsZUVsLnN0eWxlLnRvcCA9IGAke3RvcH1weGA7XG4gICAgLy90aXRsZUVsLnN0eWxlLmxlZnQgPSAnNTAlJztcbiAgICB0aXRsZUVsLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKC01MCUpJztcbiAgICB0aXRsZUVsLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgIHRpdGxlRWwuaHJlZiA9IGBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5pZH1gXG5cbiAgICByZXR1cm4gdGl0bGVFbDtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXREZWJ1Z1N0eWxlID0gKGlkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRFbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25Db25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG4pOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgLy8jMDA3QkZGIChibHVlKSBvciAjRkY1NzIyIChvcmFuZ2UpXG4gICAgLy8jNENBRjUwIChncmVlbikgb3IgI0ZGQzEwNyAoYW1iZXIpXG4gICAgLy8gY29uc3QgdG9wVGV4dCA9IGNyZWF0ZURlYnVnVGl0bGUoYCR7aWR9IDogJHt0eXBlfWAsIHRvcCwgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyk7XG4gICAgY29uc3QgdG9wVGV4dCA9IGNyZWF0ZURlYnVnVGl0bGUoYCR7Y29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5uYW1lfSA6ICR7dHlwZX1gLCB0b3AsIGNvbXBvbmVudERlZmluaXRpb25Db25maWcpO1xuICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUodG9wVGV4dCwgY29tcG9uZW50RWxlbWVudCk7XG4gICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICMwMDdCRkYnO1xuICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmJvcmRlciA9ICd1bnNldCc7XG4gICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZCh0b3BUZXh0KTtcbiAgICB9XG59XG5cbmNvbnN0IHJlcG9ydEVycm9yID0gKHByb3BDb25maWc6IElQcm9wQ29uZmlnLCBwcm9wTmFtZTogc3RyaW5nLCBjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50PGFueSwgYW55PikgPT4ge1xuICAgIGlmICghcHJvcENvbmZpZykge1xuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAvLyB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXJyb3I6IFVuZGVmaW5lZCBQcm9wXFxuXFxuYCArXG4gICAgICAgICAgICBgSXQgbG9va3MgbGlrZSB5b3UndmUgdHJpZWQgdG8gdXNlIGEgcHJvcCB0aGF0IGhhc24ndCBiZWVuIGRlZmluZWQuXFxuYCArXG4gICAgICAgICAgICBgUGxlYXNlIGNoZWNrIHRoZSBwcm9wIG5hbWUgZm9yIGFueSB0eXBvcyBvciBlbnN1cmUgdGhhdCBpdCBpcyBwcm9wZXJseSBkZWZpbmVkIGluIHRoZSBjb21wb25lbnQncyBwcm9wIGxpc3QuXFxuXFxuYCArXG4gICAgICAgICAgICBgUHJvcCBOYW1lOiAke3Byb3BOYW1lfVxcbmAgK1xuICAgICAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBjb21wb25lbnQgcGFnZSBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9IG9yIGNvbnN1bHQgdGhlIGRldmVsb3BlciBndWlkZS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5jb25zdCByZXBvcnRVbnN1cHBvcnRlZCA9IChwcm9wQ29uZmlnOiBJUHJvcENvbmZpZywgcHJvcE5hbWU6IHN0cmluZywgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudDxhbnksIGFueT4pID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgRXJyb3I6IENvZGUgUHJvcCBOb3QgU3VwcG9ydGVkXFxuXFxuYCArXG4gICAgICAgIGBDdXJyZW50bHksIGNvZGUgcHJvcHMgYXJlIG9ubHkgc3VwcG9ydGVkIGluIGxvY2FsIGZyYW1lIGNvbXBvbmVudHMuXFxuYCArXG4gICAgICAgIGBcdTI2QTBcdUZFMEYgVGhpcyBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MgZmVhdHVyZSBcdTIwMTQgY29kZSBwcm9wcyB3aWxsIGJlIHN1cHBvcnRlZCBpbiB1cGNvbWluZyB2ZXJzaW9ucy5cXG5cXG5gICtcbiAgICAgICAgYEluIHRoZSBtZWFudGltZSwgeW91IGNhbiB1c2UgbWVzc2FnZSBwcm9wcy5cXG5cXG5gICtcbiAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wTmFtZX1cXG5gICtcbiAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgIGBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIGNvbXBvbmVudCBwYWdlIGh0dHBzOi8vZGFzaGJvYXJkLm15b3AuZGV2L2Rhc2hib2FyZC9jb21wb25lbnQvJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH0gb3IgY29uc3VsdCB0aGUgZGV2ZWxvcGVyIGd1aWRlLmBcbiAgICApO1xufVxuXG5leHBvcnQgY29uc3QgY29ubmVjdFByb3BzID0gPFQgZXh0ZW5kcyBjb21wb25lbnREZWZpbml0aW9uUHJvcHM+KGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIHByb3BzQ29uZmlnOiBJUHJvcENvbmZpZ1tdLCBzZWxlY3RlZFNraW46IElTa2luQ29uZmlnKSA9PiB7XG5cbiAgICBjb25zdCBwcm9wc01hcCA9IHByb3BzQ29uZmlnLnJlZHVjZSgocHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5wcmV2aW91c1ZhbHVlLFxuICAgICAgICAgICAgW2N1cnJlbnRWYWx1ZS5uYW1lXTogey4uLmN1cnJlbnRWYWx1ZX1cbiAgICAgICAgfVxuICAgIH0sIHt9KTtcblxuICAgIGNvbnN0IHByb3BzSGFuZGxlciA9IHtcbiAgICAgICAgZ2V0OiAoXzogSU15b3BDb21wb25lbnQsIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgcHJvcENvbmZpZyA9IHByb3BzTWFwW3Byb3BdO1xuXG4gICAgICAgICAgICBpZiAocmVwb3J0RXJyb3IocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSA9PT0gU2tpbkxvYWRlcnMuSFRNTExvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZExvYWRlciA9IHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBsb2NhbCBmcmFtZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTG9hZGVyLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5lbGVtZW50LmNvbnRlbnRXaW5kb3dbdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcG9ydFVuc3VwcG9ydGVkKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5tb2RlID09PSAnb3V0cHV0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlUGFyYW1zOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IGludG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKFJlZi5jcmVhdGUocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCguLi5wcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDdG9yID0gbWVzc2FnZXNbcHJvcENvbmZpZy5iZWhhdmlvci5tZXNzYWdlXTtcblxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgbWVzc2FnZUN0b3IoLi4ubWVzc2FnZVBhcmFtcykpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuICAgICAgICBzZXQ6IChfOiBJTXlvcENvbXBvbmVudCwgcHJvcDogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBwcm9wQ29uZmlnID0gcHJvcHNNYXBbcHJvcF07XG5cbiAgICAgICAgICAgIGlmIChyZXBvcnRFcnJvcihwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSA9PT0gU2tpbkxvYWRlcnMuSFRNTExvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZExvYWRlciA9IHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBsb2NhbCBmcmFtZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTG9hZGVyLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudFdpbmRvdyA9IChjb21wb25lbnQuZWxlbWVudCBhcyBIVE1MSUZyYW1lRWxlbWVudCkuY29udGVudFdpbmRvdyBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgcmVhbCBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50V2luZG93W3Byb3BOYW1lXSA9IHZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGbHVzaCBDVEEgcXVldWUgaWYgdGhpcyBpcyBteW9wX2N0YV9oYW5kbGVyIGFuZCBxdWV1ZSBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfY3RhX2hhbmRsZXInICYmIGNvbnRlbnRXaW5kb3cuX19teW9wX2N0YV9xdWV1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXVlID0gY29udGVudFdpbmRvdy5fX215b3BfY3RhX3F1ZXVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRXaW5kb3cuX19teW9wX2N0YV9xdWV1ZSA9IG51bGw7IC8vIENsZWFyIHRvIHByZXZlbnQgZG91YmxlLWZsdXNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUuZm9yRWFjaCgoaXRlbToge2FjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiBhbnl9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgaWYgY29tcG9uZW50IHdhcyBkaXNwb3NlZCBkdXJpbmcgZmx1c2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5tYXJrZWRGb3JEaXNwb3NlZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZShpdGVtLmFjdGlvbiwgaXRlbS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcG9ydFVuc3VwcG9ydGVkKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2lmKHByb3BDb25maWcuYmVoYXZpb3IgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcubW9kZSA9PT0gJ2lucHV0Jykge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IG11bHRpIGJlaGF2aW9yc1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09ICdtZXNzYWdlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVBhcmFtczogYW55W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgaW50byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaChSZWYuY3JlYXRlKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKC4uLnByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUN0b3IgPSBtZXNzYWdlc1twcm9wQ29uZmlnLmJlaGF2aW9yLm1lc3NhZ2VdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IG1lc3NhZ2VDdG9yKC4uLm1lc3NhZ2VQYXJhbXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yOiBVbnN1cHBvcnRlZCBCZWhhdmlvclxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGUgJ2JlaGF2aW9yJyBmaWVsZCBwcm92aWRlZCBpcyBub3Qgc3VwcG9ydGVkLlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcH1cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQmVoYXZpb3IgRmllbGQ6ICR7cHJvcENvbmZpZy5iZWhhdmlvci50eXBlfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdmFsaWQgYmVoYXZpb3Igb3B0aW9ucy5gXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcG9uZW50LnByb3BzID0ge307XG4gICAgY29tcG9uZW50LnByb3BzID0gbmV3IFByb3h5KGNvbXBvbmVudC5wcm9wcywgcHJvcHNIYW5kbGVyKTtcblxuICAgIHJldHVybiBjb21wb25lbnQgYXMgKE9taXQ8SU15b3BDb21wb25lbnQsICdwcm9wcyc+ICYge1xuICAgICAgICBwcm9wczogcHJvcFR5cGVzPFQ+XG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlZlByb3h5ID0gKHRhcmdldDogUmVmLCBjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50KSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQsIHtcbiAgICAgICAgZ2V0KHRhcmdldCwgcHJvcCkge1xuXG4gICAgICAgICAgICAvLyBpZiAocHJvcCA9PT0gJ19fbm9uUHJveGllZCcpIHtcbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAodGFyZ2V0W3Byb3BdKSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGdldHRlckZ1bmN0aW9uID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5mb3JFYWNoKGFyZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5zUHJpbWl0aXZlc09ubHkoYXJnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9ycy5ub3RTZXJpYWxpemFibGVSZWZDYWxsKHByb3AsIGFyZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgcHJvcE5hbWUsIGZ1bmN0aW9uQXJncywgbWFrZVNlcmlhbGl6YWJsZX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWZbcHJvcE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFrZVNlcmlhbGl6YWJsZShyZWZbcHJvcE5hbWVdKC4uLmZ1bmN0aW9uQXJncyksIHRydWUpIC8vIEludm9rZSB0aGUgZnVuY3Rpb24gYW5kIHJldHVybiBpdHMgcmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFrZVNlcmlhbGl6YWJsZSh2YWx1ZSwgdHJ1ZSk7IC8vIFJldHVybiB0aGUgcHJvcGVydHkgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCB0byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IHRhcmdldC5yZWZDb25maWcuc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWU6IHByb3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcmdzOiBhcmdzXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobXNnLmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvL1RPRE86IHdlIGNhbiBpbXBsZW1lbnQgdGhpbmdzIGxpa2UgYXV0byBzZXJpYWxpemF0aW9uIGFuZCBiaW5kaW5nIGZ1bmN0aW9ucyBoZXJlXG4gICAgICAgICAgICAvL2dldHRlckZ1bmN0aW9uLnRlc3QgPSAnMTIzJztcblxuICAgICAgICAgICAgcmV0dXJuIGdldHRlckZ1bmN0aW9uO1xuXG4gICAgICAgICAgICAvL3JldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICBzZXQodGFyZ2V0LCBwcm9wOiBzdHJpbmcsIHZhbHVlKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgcHJvcE5hbWUsIHByb3BWYWx1ZX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZilcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZltwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogdGFyZ2V0LnJlZkNvbmZpZy5zZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgICAgcHJvcFZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWU6IHByb3BcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChtc2cpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nP1xuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZWZDb21wb25lbnQgPSBhc3luYyA8VCBleHRlbmRzIElNeW9wQ29tcG9uZW50ID0gSU15b3BDb21wb25lbnQ+KHJlZjogUmVmLCBjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10sIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gcmVmLmNvbXBvbmVudDtcbiAgICBpZiAoIWNvbXBvbmVudClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW50IGNyZWF0ZVJlZkNvbXBvbmVudCB3aXRoIGRldGFjaGVkIHJlZicpO1xuXG4gICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCcsIHJlZiwgY29tcG9uZW50Q29uZmlnKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IG5ldyBNeW9wUmVmQ29tcG9uZW50KGNvbXBvbmVudENvbmZpZy50eXBlLCBjb21wb25lbnQsIG9wdGlvbnMpO1xuICAgICAgICBjb21wb25lbnRzLnB1c2gocmVmQ29tcG9uZW50KTtcblxuICAgICAgICAvL2ZvciBjYXNlcyB3aGVyZSByZWYgY29tcG9uZW50cyBkZWZpbmUgaW4gdGhlIGNvbXBvbmVudCBjb25maWdcbiAgICAgICAgLy8gd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgcm9vdCBjb21wb25lbnQgdGhlIGJlIGluaXRpYXRlZCBiZWZvcmUgaW50ZXJhY3Rpbmcgd2l0aCBpdFxuICAgICAgICBhd2FpdCBjb21wb25lbnQuaW5pdGlhdGVkKCk7XG5cblxuICAgICAgICAvL1RPRE8gOlxuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvL3JlamVjdCgndGltZW91dD8nKTtcbiAgICAgICAgICAgIHJlamVjdCgndGltZW91dCcpO1xuICAgICAgICB9LCA1MDAwKTtcblxuICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZShyZWYucmVmQ29uZmlnLFxuICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMgPyBvcHRpb25zIDoge30sXG4gICAgICAgICAgICAgICAgaWQ6IHJlZkNvbXBvbmVudC5pZCxcbiAgICAgICAgICAgICAgICBfaGFzUGFyZW50OiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXN5bmMgKG1lc3NhZ2UpID0+IHtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRpbWVvdXQgYWxyZWFkeSBwYXNzZWRcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5mYWlsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDpcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlIGZhaWxlZCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW1wbGVtZW50YXRpb25Db21wb25lbnQgPSBjb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09IHJlZkNvbXBvbmVudC5pZCk7XG5cbiAgICAgICAgICAgICAgICAvL3NhbWUgbWVtb3J5IGVudiwgc2FtZSBIb3N0U0RLXG4gICAgICAgICAgICAgICAgaWYgKGltcGxlbWVudGF0aW9uQ29tcG9uZW50ICE9PSByZWZDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogY2xlYW4gcmVmQ29tcG9uZW50ID9cblxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaW1wbGVtZW50YXRpb25Db21wb25lbnQgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5zZXRJbml0aWF0ZWQoKVxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gcmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhlcmUgPlxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHdoYXQgYWJvdXQgcmVhcHRlcnMgPyEgZHluYW1pYyA/IVxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGV4c2lzdGluZ1JlZkNvbXBvbmVudCA9IGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gYXMgTXlvcFJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAvLyBpZiAoZXhzaXN0aW5nUmVmQ29tcG9uZW50LmlkICYmIGV4c2lzdGluZ1JlZkNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IFtjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdLCByZWZDb21wb25lbnRdO1xuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdKSkge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdLnB1c2gocmVmQ29tcG9uZW50KVxuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gcmVmQ29tcG9uZW50OyAvL2hvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gcmVmQ29tcG9uZW50LmlkKSE7XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogaW4gd2ViY29tcG9uZW50IGNhc2UgdGhlIHNhbWUgaWQgd2lsbCBhbHJlZGF5IGJlIGhlcmUsIHdoaWNoIGlzIGdvb2QgIVxuICAgICAgICAgICAgICAgIC8vIG5hbWU6XG4gICAgICAgICAgICAgICAgLy8gICAgIGlkXG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudERlZmluaXRpb25JZFxuXG4gICAgICAgICAgICAgICAgLy8gZm9yIGlubmVyIGNvbXBvbmVudHMgaW5zaWRlIHJlZiBjb21wb25lbnQgOlxuICAgICAgICAgICAgICAgIG1lc3NhZ2UubmVzdGVkUmVmcy5mb3JFYWNoKG5lc3RlZFJlZkNvbmZpZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudERlZmluaXRpb24gPSBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzIS5maW5kKGMgPT4gYy50eXBlLmlkID09PSBuZXN0ZWRSZWZDb25maWcuY29tcG9uZW50RGVmaW5pdGlvbklkKSEudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uID0gY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucz8uZmluZChkZWYgPT4gZGVmLmlkID09PSBuZXN0ZWRSZWZDb25maWcuY29tcG9uZW50RGVmaW5pdGlvbklkKSE7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IHJlZkNvbmZpZyA9IGNvbXBvbmVudENvbmZpZy50eXBlLnJlZnMuZmluZChyID0+IHIubmFtZSA9PT0gbmVzdGVkUmVmQ29uZmlnLnJlZk5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIXJlZkNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdubyByZWZDb25maWcgZm91bmQgZm9yIG5lc3RlZCByZWYnKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50ID0gbmV3IE15b3BSZWZDb21wb25lbnQobmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiwgcmVmQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgbmVzdGVkQ29tcG9uZW50LnNldEluaXRpYXRlZCgpO1xuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQucmVmc1tuZXN0ZWRSZWZDb25maWcucmVmTmFtZV0gPSBuZXN0ZWRDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucHVzaChuZXN0ZWRDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb25uZWN0UmVmcyhyZWZDb21wb25lbnQsIGNvbXBvbmVudENvbmZpZywgY29tcG9uZW50cywgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDp1c2UgY29uZmlnIGNoZWNrIGZvciBhdXRvLWhpZ2h0IGFuZCBjb252ZXJ0IHR5cGUgcHJvcGVybHlcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVmQ29tcG9uZW50IGFzIHVua25vd24gYXMgVCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3cgZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgY29ubmVjdFJlZnMgPSBhc3luYyAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdLCB3aXRob3V0UmVmQ29tcG9uZW50czogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XG5cbiAgICBpZiAoIWNvbXBvbmVudC5yZWZzKVxuICAgICAgICBjb21wb25lbnQucmVmcyA9IHt9O1xuXG4gICAgY29uc3Qgd2FpdEZvciA9IE9iamVjdC52YWx1ZXMoY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVmcykubWFwKHJlZiA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVmLmJlaGF2aW9yLnR5cGUgPT0gUmVmQmVoYXZpb3JUeXBlLmNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9XG5cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFJlZkNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50LlxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoYW5nZSB0byBnZXQgaXQgZnJvbSB0aGUgZmxvd1xuICAgICAgICAgICAgICAgIGxldCByZWZDb21wb25lbnRJZCA9IChyZWYuYmVoYXZpb3IgYXMgSUNvbXBvbmVudFJlZkJlaGF2aW9yKS5jb21wb25lbnRJZDtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZkNvbXBvbmVudElkKVxuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnRJZCA9IChyZWYuYmVoYXZpb3IgYXMgSUNvbXBvbmVudFJlZkJlaGF2aW9yKS5pbnN0YW5jZS5jb21wb25lbnRJZFxuXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJlamVjdChuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIC8vdGhyb3cgbmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCByZXNvbHZlZERlZmluaXRpb25zIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zIS5maW5kKGNvbXBkZWYgPT4gY29tcGRlZi5pZCA9PT0gcmVmQ29tcG9uZW50SWQpITtcbiAgICAgICAgICAgICAgICAvLyAvL2NvbnN0IGNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSBhd2FpdCBnZXRDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKGNvbXBvbmVudEluc3RhbmNlQ29uZmlnLmNvbXBvbmVudElkKTtcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGlmICghY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykge1xuICAgICAgICAgICAgICAgIC8vICAgICByZWplY3QobmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCByZXNvbHZlZERlZmluaXRpb25zIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0JykpO1xuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPOiBpZiB3ZSBoYXZlIHRoZSBzYW1lIGNvbXBvbmVudCBtb3JlIHRoYW4gb25jZSB3ZSB3aWxsIG5lZWQgaW5zdGFuY2UgaWQgaGVyZSAuLi5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnRDb25maWcgPSBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzPy5maW5kKG5lc3RlZENvbXBvbmVudCA9PiBuZXN0ZWRDb21wb25lbnQudHlwZS5pZCA9PT0gcmVmQ29tcG9uZW50SWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFuZXN0ZWRDb21wb25lbnRDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCBuZXN0ZWRDb21wb25lbnRDb25maWcgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vY29uc3QgY29tcG9uZW50SW5zdGFuY2VDb25maWcgPSBjb21wb25lbnRDb25maWcuaW5zdGFuY2UubmVzdGVkQ29tcG9uZW50cz8uZmluZChjb21wb25lbnRJbnN0YWNlID0+IGNvbXBvbmVudEluc3RhY2UuY29tcG9uZW50SWQgPT09IGNvbXBvbmVudERlZmluaXRpb25Db25maWcuaWQpO1xuICAgICAgICAgICAgICAgIC8vIGlmKCFjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKXtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdUT0RPIFRPRE8gVE9ETyAnKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6dGhpbmsgYWJvdXQgdGhhdCA6XG4gICAgICAgICAgICAgICAgLy8gICBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLnJlc29sdmVkRGVmaW5pdGlvbnMgPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zO1xuICAgICAgICAgICAgICAgIC8vICAgY29uc3QgbmVzdGVkQ29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnID0ge1xuICAgICAgICAgICAgICAgIC8vICAgICAgIGluc3RhbmNlOiBuZXN0ZWRDb21wb25lbnRDb25maWcuaW5zdGFuY2UhLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIHR5cGU6IG5lc3RlZENvbXBvbmVudENvbmZpZy50eXBlLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIG5hbWU6IG5lc3RlZENvbXBvbmVudENvbmZpZy5uYW1lXG4gICAgICAgICAgICAgICAgLy8gICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBfcmVmID0gUmVmLmNyZWF0ZSgnJywgcmVmLCBjb21wb25lbnQpO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbmVzdGVkICEhIGNyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50ID0gYXdhaXQgY3JlYXRlUmVmQ29tcG9uZW50KF9yZWYsIG5lc3RlZENvbXBvbmVudENvbmZpZyEsIGNvbXBvbmVudHMpXG4gICAgICAgICAgICAgICAgICAgIC8vVERPTyA6IHB1dCB0aGF0IHJlZiBjb21wb25lbnQgc29tZXdoZXJlP1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYubmFtZV0gPSBuZXN0ZWRDb21wb25lbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX19ub25Qcm94aWVkID0gUmVmLmNyZWF0ZSgnJywgcmVmLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYubmFtZV0gPSBjcmVhdGVSZWZQcm94eShfX25vblByb3hpZWQsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoJz8nKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9KVxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRGb3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICB0aHJvdyBlO1xuICAgIH1cblxufVxuXG5leHBvcnQgdHlwZSBwcm9wVHlwZXM8VCBleHRlbmRzIGNvbXBvbmVudERlZmluaXRpb25Qcm9wcz4gPSB7XG4gICAgW1Byb3BlcnR5IGluIGtleW9mIFRdOlxuICAgIFRbUHJvcGVydHldIGV4dGVuZHMgeyBtb2RlOiAnaW5wdXQnIH0gP1xuICAgICAgICBUW1Byb3BlcnR5XVsndHlwZSddIDpcbiAgICAgICAgUHJvbWlzZTxUW1Byb3BlcnR5XVsndHlwZSddPlxufVxuXG5leHBvcnQgY29uc3QgZXhlYyA9IGFzeW5jIChnZXR0ZXI6IGFueSkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBnZXR0ZXIoKVxufVxuXG5leHBvcnQgY29uc3QgYWN0QXMgPSA8VD4ocmVmOiBSZWYpID0+IHtcbiAgICByZXR1cm4gcmVmIGFzIHVua25vd24gYXMgRnVuY3Rpb25pZnlSZWY8VD5cbn1cblxuZXhwb3J0IHR5cGUgRnVuY3Rpb25pZnlSZWY8VCA9IGFueT4gPSB7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgQSkgPT4gaW5mZXIgUiAvLyBJZiBpdCdzIGEgZnVuY3Rpb25cbiAgICAgICAgPyAoLi4uYXJnczogQSkgPT4gUHJvbWlzZTxSPiAvLyBDb252ZXJ0IGl0IHRvIGEgcHJvbWlzZWQgZnVuY3Rpb25cbiAgICAgICAgOiBUW0tdXG59O1xuIiwgImltcG9ydCB7QXV0b1NpemVPcHRpb25zLCBCYXNlTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEV4ZWN1dGVDb21wb25lbnRNZXRob2QsXG4gICAgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIE1lc3NhZ2VEaXJlY3Rpb25cbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSUlmcmFtZUxvYWRlckNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlcy50c1wiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG5leHBvcnQgY2xhc3MgTXlvcElmcmFtZUNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnRDb25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHByaXZhdGUgSWZyYW1lRWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudENvbmZpZywgY29udGFpbmVyLCBvcHRpb25zKVxuXG4gICAgICAgIGlmICgoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZykuYXV0b0hlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5pbml0aWF0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbGVtZW50ID0gdGhpcy5JZnJhbWVFbGVtZW50O1xuICAgICAgICAvLyB0aGlzLklmcmFtZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgIC8vICAgICBpZiAodGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdClcbiAgICAgICAgLy8gICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KGBJZnJhbWVFbGVtZW50IGVycm9yYCk7XG4gICAgICAgIC8vIH0pO1xuICAgIH1cblxuICAgIGNsZWFudXBJbnNwZWN0PzogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvLyBUT0RPIDogdXNlIGJldHRlciBjaGVjayBmb3IgaW5zcGVjdCBtb2RlXG4gICAgICAgIGlmICh0aGlzLmNsZWFudXBJbnNwZWN0KSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdpbnNwZWN0IGNhbGwgbW9yZSB0aGFuIG9uY2UnKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BJZnJhbWVDb21wb25lbnQnLCAxMCwgdGhpcy5jb250YWluZXIsIHRoaXMuSWZyYW1lRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QhKCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYWxsJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnR9cHhgO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIG9ic2VydmVTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7c2VuZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBzZW5kKHtoZWlnaHQsIHdpZHRofSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0LCB3aWR0aH1cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmV0LmNvbnRlbnQud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50LmhlaWdodH1weGA7XG4gICAgICAgIH0pKTtcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT2JzZXJ2ZXMgdGhlIGlmcmFtZSBjb250ZW50IHNpemUgYW5kIGF1dG9tYXRpY2FsbHkgc3luY3MgaXQgdG8gdGhlIGlmcmFtZSBlbGVtZW50LlxuICAgICAqIFVzZXMgZGlyZWN0IGNvbnRlbnREb2N1bWVudCBhY2Nlc3MgKHNhbWUtb3JpZ2luIG9ubHkpIGZvciBhY2N1cmF0ZSBtZWFzdXJlbWVudHMuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nIHNpemUgY2hhbmdlIGNhbGxiYWNrIGFuZCBtaW4vbWF4IGNvbnN0cmFpbnRzXG4gICAgICogQHJldHVybnMgQ2xlYW51cCBmdW5jdGlvbiB0byBzdG9wIG9ic2VydmluZ1xuICAgICAqL1xuICAgIG9ic2VydmVBdXRvU2l6ZSA9IChvcHRpb25zPzogQXV0b1NpemVPcHRpb25zKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgICAgICBjb25zdCBpZnJhbWUgPSB0aGlzLklmcmFtZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGRvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XG5cbiAgICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW015b3BJZnJhbWVDb21wb25lbnRdIENhbm5vdCBvYnNlcnZlIGF1dG8gc2l6ZTogY29udGVudERvY3VtZW50IG5vdCBhY2Nlc3NpYmxlJyk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge307XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGFtcCA9ICh2YWx1ZTogbnVtYmVyLCBtaW4/OiBudW1iZXIsIG1heD86IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICAgICAgICBpZiAobWluICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPCBtaW4pIHJldHVybiBtaW47XG4gICAgICAgICAgICBpZiAobWF4ICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPiBtYXgpIHJldHVybiBtYXg7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUGFyc2UgQ1NTIHNpemUgdmFsdWVzIHRvIG51bWJlcnNcbiAgICAgICAgY29uc3QgcGFyc2VTaXplID0gKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBpc05hTihwYXJzZWQpID8gdW5kZWZpbmVkIDogcGFyc2VkO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG1pbldpZHRoID0gcGFyc2VTaXplKG9wdGlvbnM/Lm1pbldpZHRoKTtcbiAgICAgICAgY29uc3QgbWF4V2lkdGggPSBwYXJzZVNpemUob3B0aW9ucz8ubWF4V2lkdGgpO1xuICAgICAgICBjb25zdCBtaW5IZWlnaHQgPSBwYXJzZVNpemUob3B0aW9ucz8ubWluSGVpZ2h0KTtcbiAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gcGFyc2VTaXplKG9wdGlvbnM/Lm1heEhlaWdodCk7XG4gICAgICAgIGNvbnN0IGxvYWRlck1pbkhlaWdodCA9IG9wdGlvbnM/LmxvYWRlck1pbkhlaWdodCA/PyA1MDtcblxuICAgICAgICAvLyBDaGVjayBpZiBob3N0IGhhcyBleHBsaWNpdCBkaW1lbnNpb25zIHNldFxuICAgICAgICBjb25zdCBoYXNFeHBsaWNpdFdpZHRoID0gb3B0aW9ucz8uZXhwbGljaXRXaWR0aCAhPT0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBoYXNFeHBsaWNpdEhlaWdodCA9IG9wdGlvbnM/LmV4cGxpY2l0SGVpZ2h0ICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gRGV0ZWN0IGNvbGxhcHNlZCBkaW1lbnNpb25zIGZyb20gY29udGFpbmVyICh0aGlzLmNvbnRhaW5lcilcbiAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBjb2xsYXBzZWRXaWR0aCA9IGNvbnRhaW5lclJlY3Qud2lkdGggPT09IDA7XG4gICAgICAgIC8vIENvbnNpZGVyIGNvbGxhcHNlZCBpZiBoZWlnaHQgaXMgMCBPUiBlcXVhbHMgdGhlIGxvYWRlciBtaW5IZWlnaHRcbiAgICAgICAgY29uc3QgY29sbGFwc2VkSGVpZ2h0ID0gY29udGFpbmVyUmVjdC5oZWlnaHQgPT09IDAgfHwgY29udGFpbmVyUmVjdC5oZWlnaHQgPT09IGxvYWRlck1pbkhlaWdodDtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggZGltZW5zaW9ucyB0byBhdXRvLXNpemU6XG4gICAgICAgIC8vIC0gSWYgZm9yY2VBdXRvU2l6ZSBpcyB0cnVlLCBhdXRvLXNpemUgdW5sZXNzIGV4cGxpY2l0IGRpbWVuc2lvbiBpcyBzZXRcbiAgICAgICAgLy8gLSBPdGhlcndpc2UsIGF1dG8tc2l6ZSBvbmx5IGlmIGNvbGxhcHNlZFxuICAgICAgICBjb25zdCBzaG91bGRBdXRvV2lkdGggPSBvcHRpb25zPy5mb3JjZUF1dG9TaXplXG4gICAgICAgICAgICA/ICFoYXNFeHBsaWNpdFdpZHRoXG4gICAgICAgICAgICA6IChjb2xsYXBzZWRXaWR0aCAmJiAhaGFzRXhwbGljaXRXaWR0aCk7XG4gICAgICAgIGNvbnN0IHNob3VsZEF1dG9IZWlnaHQgPSBvcHRpb25zPy5mb3JjZUF1dG9TaXplXG4gICAgICAgICAgICA/ICFoYXNFeHBsaWNpdEhlaWdodFxuICAgICAgICAgICAgOiAoY29sbGFwc2VkSGVpZ2h0ICYmICFoYXNFeHBsaWNpdEhlaWdodCk7XG5cbiAgICAgICAgLy8gSWYgbm90aGluZyBuZWVkcyBhdXRvLXNpemluZywgc2tpcCBSZXNpemVPYnNlcnZlciBlbnRpcmVseVxuICAgICAgICBpZiAoIXNob3VsZEF1dG9XaWR0aCAmJiAhc2hvdWxkQXV0b0hlaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXBkYXRlU2l6ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50O1xuICAgICAgICAgICAgaWYgKGNvbnRlbnREb2MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudFdpZHRoID0gTWF0aC5jZWlsKHJlY3Qud2lkdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRIZWlnaHQgPSBNYXRoLmNlaWwocmVjdC5oZWlnaHQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gY2xhbXAoY29udGVudFdpZHRoLCBtaW5XaWR0aCwgbWF4V2lkdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGNsYW1wKGNvbnRlbnRIZWlnaHQsIG1pbkhlaWdodCwgbWF4SGVpZ2h0KTtcblxuICAgICAgICAgICAgICAgIC8vIE9ubHkgc2V0IGRpbWVuc2lvbnMgdGhhdCBzaG91bGQgYmUgYXV0by1zaXplZFxuICAgICAgICAgICAgICAgIGlmIChzaG91bGRBdXRvV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQXV0b0hlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTaG93IHNjcm9sbGJhciBvbiBjb250ZW50IGRvY3VtZW50IHdoZW4gY29udGVudCBleGNlZWRzIGNvbnN0cmFpbnRzXG4gICAgICAgICAgICAgICAgY29uc3QgaXNXaWR0aENvbnN0cmFpbmVkID0gc2hvdWxkQXV0b1dpZHRoICYmIG1heFdpZHRoICE9PSB1bmRlZmluZWQgJiYgY29udGVudFdpZHRoID4gbWF4V2lkdGg7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNIZWlnaHRDb25zdHJhaW5lZCA9IHNob3VsZEF1dG9IZWlnaHQgJiYgbWF4SGVpZ2h0ICE9PSB1bmRlZmluZWQgJiYgY29udGVudEhlaWdodCA+IG1heEhlaWdodDtcbiAgICAgICAgICAgICAgICBjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvd1ggPSBpc1dpZHRoQ29uc3RyYWluZWQgPyAnYXV0bycgOiAnaGlkZGVuJztcbiAgICAgICAgICAgICAgICBjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSBpc0hlaWdodENvbnN0cmFpbmVkID8gJ2F1dG8nIDogJ2hpZGRlbic7XG5cbiAgICAgICAgICAgICAgICBvcHRpb25zPy5vblNpemVDaGFuZ2U/Lih7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9TaXppbmdXaWR0aDogc2hvdWxkQXV0b1dpZHRoLFxuICAgICAgICAgICAgICAgICAgICBhdXRvU2l6aW5nSGVpZ2h0OiBzaG91bGRBdXRvSGVpZ2h0XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gSW5pdGlhbCBzaXplXG4gICAgICAgIHVwZGF0ZVNpemUoKTtcblxuICAgICAgICAvLyBPYnNlcnZlIGZvciBjaGFuZ2VzXG4gICAgICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKHVwZGF0ZVNpemUpO1xuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGRvYy5ib2R5KTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShkb2MuZG9jdW1lbnRFbGVtZW50KTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHNldFNpemVCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHtoZWlnaHQsIHdpZHRofVxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtyZXQuY29udGVudC53aWR0aH1weGA7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnQuaGVpZ2h0fXB4YDtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgLy8gcmV0dXJuIHdpbmRvdy5kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCArICdweCc7XG5cblxuICAgICAgICAgICAgLy9UT0RPOiBmaXggdGhhdCBoYWNrLCBrZWVwIHRoZSBmdW5jdGlvbiBpbiByaWdodCBmb3JtYXQgd2hpbGUgbWluaWZpZWQgOihcbiAgICAgICAgICAgIGNvbnN0IG5vT3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZFxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVG8gZW5zdXJlIGl0J3Mgbm90IG9wdGltaXplZCBhd2F5LCB5b3UgY2FuIGNhbGwgaXQgYXQgbGVhc3Qgb25jZVxuICAgICAgICAgICAgbGV0IHggPSBub09wKCk7XG4gICAgICAgICAgICB4Kys7XG4gICAgICAgICAgICB4LS07XG5cbiAgICAgICAgICAgIC8vcmV0dXJuIGAke3dpbmRvdy5kb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodH1weGA7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIHRoYXQgKzEgP1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodClcbiAgICAgICAgICAgICAgICAsIHdpbmRvdy5kb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCkgKyB4ICsgJ3B4J1xuXG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSByZXQuY29udGVudDtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgbGV0IG1lc3NhZ2VfID0gey4uLm1lc3NhZ2V9IGFzIEJhc2VNeW9wTWVzc2FnZTtcbiAgICAgICAgLy9UT0RPIDogPyE/ISBzaG91bGQgaXQgYmUgaGVyZSA/XG4gICAgICAgIGlmIChtZXNzYWdlXy5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVDb21wb25lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChtZXNzYWdlXyBhcyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKVxuICAgICAgICAgICAgdGhpc1t0eXBlZE1lc3NhZ2UubWV0aG9kXSgpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2sgOihcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL2NvbnN0IGhhbmRsZXIgPSBtZXNzYWdlLmhhbmRsZXJcblxuICAgICAgICBtZXNzYWdlXy5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlXyk7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudD8uY29udGVudFdpbmRvdz8ucG9zdE1lc3NhZ2UobWVzc2FnZV8sICcqJyk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL21lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfTtcblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluLk11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlXG4gICAgICAgICAgICB8fCBpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW4uUmVzaXplT2JzZXJ2ZXJNZXNzYWdlKSB7XG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgICAgIC8vdGhpcy5zZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50KCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdXBlci5vbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jbGVhbnVwSW5zcGVjdClcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QoKTtcblxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5wYXJlbnROb2RlIS5yZW1vdmVDaGlsZCh0aGlzLklmcmFtZUVsZW1lbnQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWcsIFNraW5Mb2FkZXJUeXBlfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BMb2FkZXIge1xuICAgIHR5cGU6IFNraW5Mb2FkZXJUeXBlO1xuICAgIGxvYWQ6IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiBQcm9taXNlPElNeW9wQ29tcG9uZW50Pjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wTG9hZGVyIGltcGxlbWVudHMgSU15b3BMb2FkZXIge1xuICAgIGFic3RyYWN0IHR5cGU6IFNraW5Mb2FkZXJUeXBlO1xuICAgIGFic3RyYWN0IGxvYWQ6IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiBQcm9taXNlPElNeW9wQ29tcG9uZW50PjtcblxuICAgIGFwcGVuZENoaWxkID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucywpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnJlbGF0aXZlKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZS5kaXJlY3Rpb24gPT09ICdiZWZvcmUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoZWxlbWVudCwgb3B0aW9ucy5yZWxhdGl2ZS5jaGlsZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlbGF0aXZlLmRpcmVjdGlvbiA9PT0gJ2FmdGVyJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gb3B0aW9ucy5yZWxhdGl2ZS5jaGlsZD8ubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoZWxlbWVudCwgbmV4dFNpYmxpbmcgPyBuZXh0U2libGluZyA6IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BJZnJhbWVDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJSWZyYW1lTG9hZGVyQ29uZmlnLCBJU2tpbkNvbmZpZywgU2tpbkxvYWRlcnN9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuY29uc3QgYWRkUXVlcnlQYXJhbSA9ICh1cmw6IHN0cmluZywgcGFyYW06IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgIC8vIENyZWF0ZSBhIFVSTCBvYmplY3RcbiAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cbiAgICAvLyBBZGQgdGhlIHF1ZXJ5IHBhcmFtZXRlclxuICAgIHVybE9iai5zZWFyY2hQYXJhbXMuYXBwZW5kKHBhcmFtLCB2YWx1ZSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHVwZGF0ZWQgVVJMXG4gICAgcmV0dXJuIHVybE9iai50b1N0cmluZygpO1xufVxuXG5leHBvcnQgY2xhc3MgTXlvcElmcmFtZUxvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuSWZyYW1lTG9hZGVyXG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG4gICAgICAgIGxldCBJZnJhbWVFbGVtZW50OiBIVE1MSUZyYW1lRWxlbWVudDtcblxuICAgICAgICBjb25zdCB0eXBlZExvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKTtcblxuICAgICAgICBpZiAoY29udGFpbmVyPy5ub2RlTmFtZSA9PT0gXCJJRlJBTUVcIikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ25lZWRzIHRvIGxvYWQgaW50byBhbiBleHNpc3RpbmcgSWZyYW1lLi4uJywgdHlwZWRMb2FkZXJDb25maWcudXJsLCBjb250YWluZXIpO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gKGNvbnRhaW5lciBhcyBIVE1MSUZyYW1lRWxlbWVudClcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3JjID0gdHlwZWRMb2FkZXJDb25maWcudXJsXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB1bmlxSWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgIGNvbnN0IGRvbUlkID0gYG15b3AtY29tcC0ke3VuaXFJZH1gXG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICAgICAgLy8gU2V0IGFsbCBzdHlsZXMgQkVGT1JFIGFwcGVuZGluZyB0byBwcmV2ZW50IGZsYXNoIGF0IHdyb25nIHBvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCBpZnJhbWVTdHlsZXMgPSBgXG4gICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgIGluc2V0OiAwO1xuICAgICAgICAgICAgICAgIGhlaWdodDogJHt0eXBlZExvYWRlckNvbmZpZy5hdXRvSGVpZ2h0IHx8ICF0eXBlZExvYWRlckNvbmZpZy5oZWlnaHQgPyAnMTAwJScgOiB0eXBlZExvYWRlckNvbmZpZy5oZWlnaHR9O1xuICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6ICR7b3B0aW9ucz8uaGlkZGVuID8gJzAnIDogJzEnfTtcbiAgICAgICAgICAgICAgICBwb2ludGVyLWV2ZW50czogJHtvcHRpb25zPy5oaWRkZW4gPyAnbm9uZScgOiAnYWxsJ307XG4gICAgICAgICAgICBgO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gaWZyYW1lU3R5bGVzO1xuXG4gICAgICAgICAgICAvLyBTZXQgZWxlbWVudCBhdHRyaWJ1dGVzIGlmIHByb3ZpZGVkXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uZWxlbWVudEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhvcHRpb25zLmVsZW1lbnRBdHRyaWJ1dGVzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNldEF0dHJpYnV0ZShrZXksICcnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gaGFuZGxlIGlzc3VlIHRvIGxvYWQgaWZyYW1lIGluc2lkZSBhbiBpZnJhbWUgd2l0aCB0aGUgc2FtZSB1cmxcbiAgICAgICAgICAgIGxldCB1cmwybG9hZCA9IChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKS51cmw7XG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uX2hhc1BhcmVudClcbiAgICAgICAgICAgICAgICB1cmwybG9hZCA9IGFkZFF1ZXJ5UGFyYW0odXJsMmxvYWQsIFwiX215b3AtY29tcFwiLCB1bmlxSWQpO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNyYyA9IHVybDJsb2FkO1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgICAgICAvLyAgIElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkb21JZCkgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgICAgICAvL05PIDogSWZyYW1lRWxlbWVudCA9IGNvbnRhaW5lci5sYXN0RWxlbWVudENoaWxkIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wSWZyYW1lQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBteW9wV2ViY29tcG9uZW50Q29uc3RzID0ge1xuICAgIHdlYmNvbXBvbmVudF9tZXNzYWdlX2tleTogJ215b3Bfd2ViY29tcG9uZW50X21lc3NhZ2UnXG59XG4iLCAiaW1wb3J0IHtteW9wV2ViY29tcG9uZW50Q29uc3RzfSBmcm9tIFwiLi4vLi4vd2ViY29tcG9uZW50L2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuXG5leHBvcnQgY2xhc3MgTXlvcFdlYkNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHByaXZhdGUgY3VzdG9tRWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudERlZmluaXRpb24sIGNvbnRhaW5lciAsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBjdXN0b21FbGVtZW50O1xuICAgIH1cblxuICAgIGNsZWFudXBJbnNwZWN0OiBDbGVhbnVwSGFuZGxlciA9ICgpID0+IHtcbiAgICB9XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gc2V0RGVidWdTdHlsZSh0aGlzLmlkLCAnTXlvcFdlYkNvbXBvbmVudCcsIDAsIHRoaXMuY29udGFpbmVyLCB0aGlzLmN1c3RvbUVsZW1lbnQsIHRoaXMuY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYWxsJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnJztcbiAgICB9XG5cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZTxhbnk+KSA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlXyA9IHsuLi5tZXNzYWdlfSBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgLy9UT0RPIDogY2FuIGJlIGRvbmUgd2l0aG91dCBjbG9uaW5nP1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vY29uc3QgaGFuZGxlciA9IG1lc3NhZ2VfLmhhbmRsZXJcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2VfKTtcblxuICAgICAgICBjb25zdCBtc2cgPSBuZXcgQ3VzdG9tRXZlbnQ8QmFzZU15b3BNZXNzYWdlPihteW9wV2ViY29tcG9uZW50Q29uc3RzLndlYmNvbXBvbmVudF9tZXNzYWdlX2tleSwge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZGV0YWlsOiBtZXNzYWdlXyxcbiAgICAgICAgICAgIC8vIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAvLyBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIC8vIGNvbXBvc2VkOiB0cnVlXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy90aGlzLmNvbnRhaW5lci5kaXNwYXRjaEV2ZW50KG1zZylcblxuICAgICAgICAvL3NlbmRpbmcgZGF0YSBmcm9tIGhvc3QgdG8gdGhlIGNvbXBvbmVudFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LmRpc3BhdGNoRXZlbnQobXNnKVxuICAgICAgICAgICAgLy8gaWYgKHRoaXMuY3VzdG9tRWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gICAgIHRoaXMuY3VzdG9tRWxlbWVudC5jaGlsZHJlblswXS5kaXNwYXRjaEV2ZW50KG1zZylcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIHdoaWxlIHRyeWluZyB0byBkaXNwYXRjaEV2ZW50JywgZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLmN1c3RvbUVsZW1lbnQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BXZWJDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5pbXBvcnQge3V1aWR2NCwgd2FpdH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzLnRzXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZywgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZywgU2tpbkxvYWRlcnN9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuY29uc3Qgc2VlbjogUmVjb3JkPHN0cmluZywgUHJvbWlzZTx2b2lkPj4gPSB7fTtcblxuZXhwb3J0IGNsYXNzIFdlYmNvbXBvbmVudExvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcblxuICAgIHR5cGUgPSBTa2luTG9hZGVycy5XZWJDb21wb25lbnRMb2FkZXJcblxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuXG4gICAgICAgIGNvbnN0IGxvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnKTtcblxuICAgICAgICBpZiAoIXNlZW5bbG9hZGVyQ29uZmlnLnVybF0pIHtcbiAgICAgICAgICAgIC8vIGF3YWl0IGltcG9ydCggLyogQHZpdGUtaWdub3JlICovIHdlYkNvbXBvbmVudExvYWRVcmwpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ21vZHVsZSBsb2FkZWQnKTtcbiAgICAgICAgICAgIHNlZW5bbG9hZGVyQ29uZmlnLnVybF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2ViQ29tcG9uZW50TG9hZFVybCA9IGxvYWRlckNvbmZpZy51cmxcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQudHlwZSA9ICdtb2R1bGUnO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5zcmMgPSB3ZWJDb21wb25lbnRMb2FkVXJsO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzY3JpcHQub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnTW9kdWxlIGFscmVkYXkgbG9hZGVkIG9yIGluIGxvYWRpbmcgcHJvY2VzcycpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgc2Vlbltsb2FkZXJDb25maWcudXJsXTtcblxuICAgICAgICAvL1RPRE8gOiBhZGQgcmV0cnkgbWVjaGFuaXNtIGluIGZhaWwgY2FzZS5cblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrLCBzaG91bGQgZml4IHRoZSByYWNlIGNvbmRpdGlvbiBmb3IgbG9hZGVkIG1vZHVsZXNcbiAgICAgICAgYXdhaXQgd2FpdCgxKTtcblxuICAgICAgICBsZXQgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YFxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChsb2FkZXJDb25maWcudGFnKTtcblxuICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIC8vZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29udGFpbmVyLmlkLnN0YXJ0c1dpdGgoJ215b3AtY29tcC0nKSkge1xuICAgICAgICAvLyAgICAgLy8gaW4gcGxhY2UgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChlbGVtZW50KTtcbiAgICAgICAgLy8gICAgIC8vY29udGFpbmVyID0gZWxlbWVudC5wYXJlbnRFbGVtZW50ITtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmKG9wdGlvbnM/Ll9lbnZpcm9ubWVudCl7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBlbGVtZW50Ll9teW9wRW52aXJvbm1lbnQgPSBvcHRpb25zPy5fZW52aXJvbm1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICAgIC8vZWxlbWVudC5pbm5lckhUTUwgPSBgPCR7bG9hZGVyQ29uZmlnLnRhZ30gLz5gO1xuICAgICAgICByZXR1cm4gbmV3IE15b3BXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG5cbn1cbiIsICJpbXBvcnQge0Jhc2VDb250ZXh0TWVzc2FnZUhhbmRsZXIsIEhvc3RlZENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB2b2lkXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSA9IGFueT4gZXh0ZW5kcyBCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyPFQsIFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudDxTaGFkb3dSb290UmVmPj4+IHtcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUeXBlOiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2VUb0hvc3Q6IGFueSwgcHVibGljIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudDxTaGFkb3dSb290UmVmPj4pIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZVRvSG9zdCk7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgaW5uZXJFeGVjdXRvcjogKGV2ZW50OiBULCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB2b2lkO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFQpID0+IHtcbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgaWYgKGV2ZW50LmRlc3RpbmF0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IGV2ZW50LmRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dFtkZXN0aW5hdGlvbl0uY29udGV4dCkge1xuXG4gICAgICAgICAgICAgICAgLy8gcGF0Y2ggdGhlIHNvdXJjZSBpZCwgdGhpbmsgYWJvdXQgdGhhdCA/XG4gICAgICAgICAgICAgICAgY29uc3QgX21lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4ubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZXZlbnQuZGVzdGluYXRpb24gPyBldmVudC5kZXN0aW5hdGlvbiA6IGV2ZW50LnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBldmVudC5zb3VyY2UgPyBldmVudC5zb3VyY2UgOiBldmVudC5kZXN0aW5hdGlvblxuICAgICAgICAgICAgICAgICAgICB9IGFzIEJhc2VNeW9wTWVzc2FnZSwgcmVwbGF5VG8pXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXJFeGVjdXRvcihldmVudCwgdGhpcy5jb250ZXh0W2Rlc3RpbmF0aW9uXS5jb250ZXh0LCBfbWVzc2FnZVRvSG9zdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IG15b3BBdHRyaWJ1dGVzID0ge1xuICAgIGlkOiAnbXlvcC1pZCdcbn1cbiIsICJpbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzLnRzXCI7XG5pbXBvcnQge1JlZn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50c0J5UmVmID0gKHJlZjogUmVmLCBlbDogUGFyZW50Tm9kZSkgPT4ge1xuICAgIHJldHVybiBlbC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7cmVmLnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0Rmlyc3RFbGVtZW50QnlSZWYgPSAocmVmOiBSZWYsIGVsOiBQYXJlbnROb2RlKSA9PiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBnZXRFbGVtZW50c0J5UmVmKHJlZiwgZWwpO1xuICAgIGlmIChlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzLml0ZW0oMCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmluZENsaWNrTWVzc2FnZSwgQ2xpY2tSZXBsYXlNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEJpbmRDbGlja01lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KVxuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6IGFueVtdID0gW107XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7TXlvcEVsZW1lbnRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8TXlvcEVsZW1lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DaGFuZ2VUZXh0TWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IE15b3BFbGVtZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS50ZXh0Q29udGVudCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgU2hhZG93Um9vdFJlZiBleHRlbmRzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdDogU2hhZG93Um9vdCkge1xuICAgICAgICBzdXBlcihjb250YWluZXIsIHNoYWRvd1Jvb3QpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BFbGVtZW50UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlLCBEZXRlY3RNeW9wUmVmc01lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IERldGVjdE15b3BSZWZzTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuXG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH1dYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBNeW9wRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgYWxsTXlvcEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiB0YWtlIHRoYXQgYmFjayB0byB0aGUgZGFzaGJvYXJkP1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhpdGVtLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuXG4gICAgICAgICAgICBpZiAobXlvcElkKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnd2MgcmVjdCcsICBpdGVtLnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBpdGVtLm9mZnNldFRvcCwgaXRlbS5vZmZzZXRMZWZ0KSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IERldGVjdGVkTXlvcFJlZnNNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbXlvcFJlZnMpKVxuICAgIH07XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5EZXRlY3RNeW9wUmVmc01lc3NhZ2U7XG5cblxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRBdHRyaWJ1dGVNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3Mgc2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxTZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogU2V0QXR0cmlidXRlTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSwgZXZlbnQudmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSxcbiAgICBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlLFxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5BZGRFdmVudExpc3RlbmVyTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBpbiBmYWN0IHdoZW4gcnVubmluZyBpbiBXZWJDb21wb25lbnQgd2UgY2FuIHRyYW5zZmVyIHRoZSBvcmlnaW5hbCBlXG4gICAgICAgICAgICAgICAgLy8gY3VycmVudGx5IHVzaW5nIG1ha2VTZXJpYWxpemFibGUgZm9yIG5lc3RlZCBjYXNlcywgdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCAgbWFrZVNlcmlhbGl6YWJsZShlLCBldmVudC5zZXJpYWxpemFibGVTa2VsZXRvbikpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcblxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7SG9zdFNES30gZnJvbSBcIi4uLy4uL2hvc3QvaG9zdFNES1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVJlZiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWY/LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcblxuICAgICAgICAgICAgaWYgKGFsbEl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RTREsgPSBIb3N0U0RLLkluc3RhbmNlKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGV2ZW50Lm9wdGlvbnMuaWQpITtcbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vLy8+Pj4+XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vICBjb25zb2xlLmxvZyhgZmFpbGVkIHRvIGZpbmQgJHtldmVudC5vcHRpb25zLmlkfSBpbiBtZW0gc2NvcGVgLCBob3N0U0RLKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy93ZSBoYXZlIHRoZSByZWYgY29tcG9uZW50IGluIG91ciBIb3N0U0RLIChzYW1lIG1lbW9yeSB3aGVuIHVzaW5nIHdlYmNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAvLyAgcmVmQ29tcG9uZW50LnBhcmVudCA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoZSByZWYgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBob3N0U0RLLmNvbXBvbmVudHMuaW5kZXhPZihyZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdFNESy5jb21wb25lbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQgcmVtb3ZlZCB0ZW1wIHJlZiBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkIHVzaW5nIHRlbXAgcmVmIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50ID0gYXdhaXQgaG9zdFNESy5sb2FkQ29tcG9uZW50KGV2ZW50Lm5lc3RlZENvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuaXRlbSgwKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucylcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IG5vIG5lZWQgdGhpcywgcGFzcyBvcHRpb25zIGZyb20gcGFyZW50XG4gICAgICAgICAgICAgICAgLy9pbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5pZCA9IGV2ZW50LnByZWRlZmluZWRJZDtcbiAgICAgICAgICAgICAgICAvL3JlZkNvbXBvbmVudC5pZCArPSAnLic7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBub3QgcmVhbGx5IG5lZWRlZCA/XG4gICAgICAgICAgICAgICAgLy8gYXdhaXQgaW1wbGVtZW50YXRpb25Db21wb25lbnQuaW5pdGlhdGVkKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRSZWZDb25maWc6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5yZWZzKS5mb3JFYWNoKHJlZk5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVmID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQucmVmc1tyZWZOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgcmVmID0gcmVmLl9fbm9uUHJveGllZCB8fCByZWY7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlZkNvbmZpZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbmVzdGVkUmVmQ29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIC0gRE9NIGVsZW1lbnQgbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgW10sIHRydWUpKTtcblxuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRlUmVmKCkudGhlbigpXG4gICAgICAgIC8vcmV0dXJuaW5nIHVuZGVmaW5lZCBzbyBpdCB3b24ndCBhY3QgYXMgYSBjbGVhbnVwXG4gICAgfVxufVxuIiwgImltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmV4cG9ydCBjb25zdCBFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgcmVwbGllcjogKGRhdGE6IGFueSkgPT4gdm9pZCwgcm9vdFJlZjogUm9vdFJlZikgPT4ge1xuICAgIGNvbnN0IF9fc2NyaXB0SW5wdXRzID0gZXZlbnQuc2NyaXB0SW5wdXRzID8gZXZlbnQuc2NyaXB0SW5wdXRzIDoge31cbiAgICBfX3NjcmlwdElucHV0cy5tYWtlU2VyaWFsaXphYmxlID0gbWFrZVNlcmlhbGl6YWJsZTtcblxuICAgIF9fc2NyaXB0SW5wdXRzLnNlbmQgPSByZXBsaWVyO1xuICAgIF9fc2NyaXB0SW5wdXRzLnJvb3RSZWYgPSByb290UmVmO1xuICAgIF9fc2NyaXB0SW5wdXRzLl9fc2NyaXB0SW5wdXRzID0gX19zY3JpcHRJbnB1dHM7XG5cbiAgICBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAoJHtldmVudC5zY3JpcHR9KSguLi5hcmd1bWVudHMpYCk7XG4gICAgY29uc3QgcmV0ID0gZHluYW1pY0Z1bmN0aW9uKF9fc2NyaXB0SW5wdXRzKTtcblxuICAgIC8vIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IEZ1bmN0aW9uKCdzZW5kJywgJ3Jvb3RSZWYnLCdfX3NjcmlwdElucHV0cycsIC4uLk9iamVjdC5rZXlzKF9fc2NyaXB0SW5wdXRzKSwgZXZlbnQuY29udGVudCA/IGV2ZW50LmNvbnRlbnQgOiAnJylcbiAgICAvL2NvbnN0IHJldCA9IGR5bmFtaWNGdW5jdGlvbihyZXBsaWVyLCByb290UmVmLCBfX3NjcmlwdElucHV0cywgLi4uT2JqZWN0LnZhbHVlcyhfX3NjcmlwdElucHV0cykpO1xuICAgIHJlcGxpZXIocmV0KTtcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50c1wiO1xuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8RXhlY3V0ZVNjcmlwdE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5FeGVjdXRlU2NyaXB0TWVzc2FnZVxuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVwbGllciA9IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBkYXRhKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcihldmVudCwgcmVwbGllciwgc2hhZG93Um9vdFJlZik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlLCBGb3JtRGF0YUVudHJ5LCBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBJbnB1dEVsZW1lbnRWYWx1ZSx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzLnRzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBnZXRJbnB1dFZhbHVlID0gKGVsZW1lbnQpOiBJbnB1dEVsZW1lbnRWYWx1ZSA9PiB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBmb3JtXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBkYXRhT2JqZWN0OiBJbnB1dEVsZW1lbnRWYWx1ZSA9IHtcbiAgICAgICAgICAgIGZvcm1EYXRhOiB7fSxcbiAgICAgICAgICAgIHVubWFwcGVkRGF0YTogW11cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBNYW51YWxseSBhZGQgZWxlbWVudHMgd2l0aG91dCBuYW1lc1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKTtcbiAgICAgICAgbGV0IGF1dG9OYW1lSW5kZXhlciA9IC0xO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcElkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gYF8keygrK2F1dG9OYW1lSW5kZXhlcil9YFxuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZURhdGE6IEZvcm1EYXRhRW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRJbnB1dFZhbHVlKGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZWxlbWVudC5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHk6IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudC52YWxpZGl0eSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgIG15b3BJZCxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2goZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGFPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbWVudC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmNoZWNrZWQgPyBlbGVtZW50LnZhbHVlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgaW5wdXQgYW5kIHRleHRhcmVhIGVsZW1lbnRzXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCBlbGVtZW50LnRhZ05hbWUgPT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNlbGVjdCBlbGVtZW50cyAoZHJvcGRvd25zKVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBlZGl0YWJsZSBkaXZzIChjb250ZW50RWRpdGFibGUpXG4gICAgaWYgKGVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuaW5uZXJUZXh0IHx8IGVsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhbiB1bnN1cHBvcnRlZCBlbGVtZW50IHR5cGVcbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8R2V0RWxlbWVudFZhbHVlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuR2V0RWxlbWVudFZhbHVlTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UoZ2V0SW5wdXRWYWx1ZShpdGVtKSksIGV2ZW50KTtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldElubmVySHRtbH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge015b3BFbGVtZW50TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFNldElubmVySHRtbEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8U2V0SW5uZXJIdG1sPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRJbm5lckh0bWw7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBNeW9wRWxlbWVudE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uaW5uZXJIVE1MID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBXZWJjb21wb25lbnQgU0RLIGlzIHRhaWxvcmVkIGZvciB1c2luZyBNeW9wIGNvbXBvbmVudHMgcGFja2FnZWQgYXMgc2VwYXJhdGUgYnVuZGxlcyBhbmQgZXhwb3NlZCBhcyB3ZWIgY29tcG9uZW50cy48YnIvPlxuICogRGV2ZWxvcGVycyBpbXBvcnRpbmcgdGhpcyBTREsgY2FuIGxldmVyYWdlIEFQSXMgYW5kIHV0aWxpdGllcyBzcGVjaWZpY2FsbHkgY3JhZnRlZCB0byBzdXBwb3J0IHRoZSBsaWZlY3ljbGUgbWFuYWdlbWVudCBhbmQgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyByZXF1aXJlZCBmb3Igd2ViIGNvbXBvbmVudHMgd2l0aGluIHRoZSBNeW9wIGFyY2hpdGVjdHVyZS48YnIvPlxuICogVGhpcyBTREsgcHJvbW90ZXMgcmV1c2FiaWxpdHkgYW5kIGVuY2Fwc3VsYXRpb24sIGVuYWJsaW5nIGRldmVsb3BlcnMgdG8gYnVpbGQgbW9kdWxhciwgc2VsZi1jb250YWluZWQgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBzZWFtbGVzc2x5IGludGVncmF0ZWQgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbidzIERPTSBzdHJ1Y3R1cmUuXG4gKlxuICpcbiAqIE9uY2UgbG9hZGVkIHRoZSBgUm9vdFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiAqIGBgYGpzXG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge1dlYkNvbXBvbmVudFNES30gZnJvbSAnQG15b3Avc2RrL3dlYmNvbXBvbmVudCc7XG4gKiBgYGBcbiAqXG4gKi9cbmltcG9ydCB7QmFzZU15b3BTREt9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wV2ViY29tcG9uZW50Q29uc3RzfSBmcm9tIFwiLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge0JpbmRPbkNsaWNrSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlclwiO1xuaW1wb3J0IHtDaGFuZ2VUZXh0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7RGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgSW5pdE1lc3NhZ2UsXG4gICAgSW5pdFJlcXVlc3QsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtzZXRBdHRyaWJ1dGVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0QXR0cmlidXRlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtBZGRFdmVudExpc3RlbmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50c1wiO1xuaW1wb3J0IHtHZXRFbGVtZW50VmFsdWVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWxIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50c1wiO1xuXG4vKipcbiAqIFRoZSBXZWJjb21wb25lbnQgU0RLIGlzIHRhaWxvcmVkIGZvciB1c2luZyBNeW9wIGNvbXBvbmVudHMgcGFja2FnZWQgYXMgc2VwYXJhdGUgYnVuZGxlcyBhbmQgZXhwb3NlZCBhcyB3ZWIgY29tcG9uZW50cy48YnIvPlxuICogRGV2ZWxvcGVycyBpbXBvcnRpbmcgdGhpcyBTREsgY2FuIGxldmVyYWdlIEFQSXMgYW5kIHV0aWxpdGllcyBzcGVjaWZpY2FsbHkgY3JhZnRlZCB0byBzdXBwb3J0IHRoZSBsaWZlY3ljbGUgbWFuYWdlbWVudCBhbmQgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyByZXF1aXJlZCBmb3Igd2ViIGNvbXBvbmVudHMgd2l0aGluIHRoZSBNeW9wIGFyY2hpdGVjdHVyZS48YnIvPlxuICogVGhpcyBTREsgcHJvbW90ZXMgcmV1c2FiaWxpdHkgYW5kIGVuY2Fwc3VsYXRpb24sIGVuYWJsaW5nIGRldmVsb3BlcnMgdG8gYnVpbGQgbW9kdWxhciwgc2VsZi1jb250YWluZWQgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBzZWFtbGVzc2x5IGludGVncmF0ZWQgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbidzIERPTSBzdHJ1Y3R1cmUuXG4gKlxuICpcbiAqIE9uY2UgbG9hZGVkIHRoZSBgUm9vdCBTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gKiBgYGBqc1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJDb21wb25lbnRTREsgZXh0ZW5kcyBCYXNlTXlvcFNESyB7XG5cbiAgICBhbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0ID0gdHJ1ZTtcblxuICAgIC8vd2hlbiBuZXcgd2ViIGNvbXBvbmVudCBjcmVhdGVkLlxuICAgIGNvbm5lY3RlZENhbGxiYWNrID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHNoYWRvdzogU2hhZG93Um9vdCkgPT4ge1xuICAgICAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihteW9wV2ViY29tcG9uZW50Q29uc3RzLndlYmNvbXBvbmVudF9tZXNzYWdlX2tleSwgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50Q29udGVudCA9IGUuZGF0YSA/IGUuZGF0YSA6IGUuZGV0YWlsO1xuICAgICAgICAgICAgaWYgKCFldmVudENvbnRlbnQgfHwgIWV2ZW50Q29udGVudC5teW9wKSB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZWN2aWVkIHdlYmNvbXBvbmVudF9tZXNzYWdlIHdpdGggd3JvbmcgdHlwZScpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudENvbnRlbnQgYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogc2VuZCBjb250YWluZXIgLyBjb21wb2VubnQgaWRlbnRpZmllciBmb3IgbXVsdGlsIGNvbXBvbmVudHMgc3VwcG9ydFxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXMoZSlcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdDb21wb25lbnRJZCA9IChtZXNzYWdlIGFzIEluaXRNZXNzYWdlKS5jb250ZW50LmlkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbbmV3Q29tcG9uZW50SWRdLmNvbnRleHQgPSBuZXcgU2hhZG93Um9vdFJlZihjb250YWluZXIsIHNoYWRvdylcblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnN1cHBvcnRlZEhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBoYW5kbGVyLmNvbnRleHQgPSB0aGlzLnNoYWRvd1Jvb3RzO1xuICAgICAgICAgICAgICAgICAgICAvLyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjay4gcmFjZSBjb25kaXRpb24gd2l0aCBob3N0LmxvYWQgd2hlbiBtb2R1bGUgbG9hZGVkXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBJbml0UmVxdWVzdCgpKVxuICAgICAgICB9LCAxKVxuICAgIH1cblxuICAgIG1lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4ge1xuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24udXBcbiAgICAgICAgLy9tZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQ7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLnJlcGxheVRvSGFuZGxlciAmJiByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkKVxuICAgICAgICAgICAgbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUby5oYW5kbGVyVW5pcXVlSWRcblxuICAgICAgICB3aW5kb3cubXlvcC5ob3N0U0RLLnNlbmQobWVzc2FnZSlcbiAgICB9XG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyW10gPSBbXG4gICAgICAgIG5ldyBDaGFuZ2VUZXh0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBTZXRJbm5lckh0bWxIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEJpbmRPbkNsaWNrSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IHNldEF0dHJpYnV0ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgRXhlY3V0ZVNjcmlwdEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgR2V0RWxlbWVudFZhbHVlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIC8vXG4gICAgICAgIG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cylcbiAgICBdO1xuXG4gICAgcHVibGljIGluaXQgPSAoKSA9PiB7XG4gICAgICAgIC8vdGhpcy5teUNvbXBvbmVudElkXG4gICAgICAgIC8vdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlc1xuICAgIH1cbn1cblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnV2ViQ29tcG9uZW50U0RLJywgV2ViQ29tcG9uZW50U0RLKTtcbiIsICJleHBvcnQgKiBmcm9tIFwiLi9XZWJDb21wb25lbnRTREtcIjtcbiIsICIvKipcbiAqIEVtYmVkZGVkIFNESyBDb250ZW50IE1vZHVsZVxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBlbWJlZGRlZCBTREsgY29udGVudCBmb3IgbnBtIHBhY2thZ2UgdXNlcnMuXG4gKiBUaGUgYWN0dWFsIGNvbnRlbnQgaXMgZ2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9idWlsZC1lbWJlZGRlZC1zZGsuanNcbiAqXG4gKiBGb3IgZGV2ZWxvcG1lbnQsIHRoaXMgZmlsZSBleHBvcnRzIHBsYWNlaG9sZGVycy5cbiAqIEFmdGVyIGJ1aWxkLCB0aGUgZGlzdC9tb2R1bGUvZW1iZWRkZWRTREsuanMgd2lsbCBjb250YWluIHRoZSBhY3R1YWwgU0RLIGNvbnRlbnQuXG4gKlxuICogVXNhZ2UgaW4gSFRNTENvbXBvbmVudExvYWRlcjpcbiAqIC0gSWYgSEFTX0VNQkVEREVEX1NESyBpcyB0cnVlLCBpbmplY3QgU0RLIGlubGluZTogPHNjcmlwdD4ke0VNQkVEREVEX1NES19DT05URU5UfTwvc2NyaXB0PlxuICogLSBJZiBIQVNfRU1CRURERURfU0RLIGlzIGZhbHNlLCBmYWxsIGJhY2sgdG8gQ0ROOiA8c2NyaXB0IHNyYz1cIiR7dXJsfVwiPjwvc2NyaXB0PlxuICovXG5cbi8qKlxuICogVGhlIGVtYmVkZGVkIFNESyBjb250ZW50IGFzIGEgbWluaWZpZWQgSmF2YVNjcmlwdCBzdHJpbmcuXG4gKiBUaGlzIHBsYWNlaG9sZGVyIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBhY3R1YWwgY29udGVudCBpbiB0aGUgYnVpbGQgb3V0cHV0LlxuICovXG5leHBvcnQgY29uc3QgRU1CRURERURfU0RLX0NPTlRFTlQ6IHN0cmluZyA9ICcnO1xuXG4vKipcbiAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGVtYmVkZGVkIFNESyBjb250ZW50IGlzIGF2YWlsYWJsZS5cbiAqIFRoaXMgaXMgZmFsc2UgaW4gZGV2ZWxvcG1lbnQsIHRydWUgaW4gdGhlIGJ1aWx0IG1vZHVsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEhBU19FTUJFRERFRF9TREs6IGJvb2xlYW4gPSBmYWxzZTtcbiIsICJpbXBvcnQge015b3BXZWJDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzLnRzXCI7XG5pbXBvcnQge1xuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElIVE1MTG9hZGVyQ29uZmlnLFxuICAgIElTa2luQ29uZmlnLCBTaGFkb3dSb290TW9kZVR5cGUsXG4gICAgU2tpbkxvYWRlcnNcbn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtXZWJDb21wb25lbnRTREt9IGZyb20gXCIuLi8uLi93ZWJjb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcElmcmFtZUNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50c1wiO1xuaW1wb3J0IHtFTUJFRERFRF9TREtfQ09OVEVOVCwgSEFTX0VNQkVEREVEX1NES30gZnJvbSBcIi4uL2VtYmVkZGVkU0RLLnRzXCI7XG4vL2ltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tIFwiLi4vLi4vU0RLLnRzXCI7XG5cbmNvbnN0IHNlZW46IHN0cmluZ1tdID0gW107XG5sZXQgc2RrO1xuY29uc3QgZ2V0SW5pdGlhdGVkU2RrID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghc2RrKSB7XG4gICAgICAgIC8vY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSBhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKVxuICAgICAgICBzZGsgPSBuZXcgV2ViQ29tcG9uZW50U0RLKCk7XG4gICAgICAgIHNkay5pbml0KCk7XG4gICAgfVxuICAgIHJldHVybiBzZGs7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhUTUxFbGVtZW50Q29uc3RydWN0b3IoaHRtbFN0cmluZzogc3RyaW5nLCBTaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGUpOiBuZXcgKCkgPT4gSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEhUTUxFbGVtZW50IHtcblxuICAgICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vZGUgPSBTaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLm9wZW4gPyAnb3BlbicgOiAnY2xvc2VkJztcbiAgICAgICAgICAgIGNvbnN0IHNoYWRvdyA9IHRoaXMuYXR0YWNoU2hhZG93KHttb2RlfSk7XG4gICAgICAgICAgICBnZXRJbml0aWF0ZWRTZGsoKS50aGVuKChzZGspID0+IHtcbiAgICAgICAgICAgICAgICBzZGsuY29ubmVjdGVkQ2FsbGJhY2sodGhpcywgc2hhZG93KTtcbiAgICAgICAgICAgICAgICBzaGFkb3cuaW5uZXJIVE1MID0gaHRtbFN0cmluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmNvbnN0IGNyZWF0ZUN1c3RvbVdlYkNvbXBvbmVudCA9IChjb21wb25lbnROYW1lOiBzdHJpbmcsIGh0bWw6IHN0cmluZywgU2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlKSA9PiB7XG4gICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKGNvbXBvbmVudE5hbWUsIGNyZWF0ZUhUTUxFbGVtZW50Q29uc3RydWN0b3IoaHRtbCwgU2hhZG93Um9vdE1vZGUpKTtcbiAgICBjb25zb2xlLmxvZyhgZGVmaW5lKCcke2NvbXBvbmVudE5hbWV9Jykgd2FzIGNhbGxlZCwgd2ViIGNvbXBvbmVudCByZWFkeSB0byB1c2VgKTtcbn1cblxuY29uc3QgdG9XZWJDb21wb25lbnROYW1lID0gKHN0cikgPT4ge1xuICAgIHJldHVybiBzdHJcbiAgICAgICAgLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMS0kMicpIC8vIEFkZCBoeXBoZW4gYmVmb3JlIHVwcGVyY2FzZSBsZXR0ZXJzXG4gICAgICAgIC5yZXBsYWNlKC8oXFxkKykvZywgJy0kMScpIC8vIEFkZCBoeXBoZW4gYmVmb3JlIGRpZ2l0c1xuICAgICAgICAudG9Mb3dlckNhc2UoKTsgLy8gQ29udmVydCB0byBsb3dlcmNhc2Vcbn1cblxuY29uc3QgdG9DdXN0b21FbGVtZW50TmFtZSA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICBuYW1lID0gdG9XZWJDb21wb25lbnROYW1lKG5hbWUpO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoL18vZywgJy0nKTtcbn1cblxubGV0IHBhcnNlcjogRE9NUGFyc2VyOyAvLyA9IG5ldyBET01QYXJzZXIoKTtcblxuZXhwb3J0IGNsYXNzIEhUTUxDb21wb25lbnRMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG5cbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuSFRNTExvYWRlclxuXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG5cbiAgICAgICAgY29uc3QgbG9hZGVyQ29uZmlnID0gKHNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnKTtcbiAgICAgICAgbGV0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWBcbiAgICAgICAgbGV0IGVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXFJZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgY29uc3QgZG9tSWQgPSBgbXlvcC1jb21wLSR7dW5pcUlkfWBcblxuICAgICAgICAgICAgbGV0IElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICAgICAgLy8gU2V0IGFsbCBzdHlsZXMgQkVGT1JFIGFwcGVuZGluZyB0byBwcmV2ZW50IGZsYXNoIGF0IHdyb25nIHBvc2l0aW9uXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgIGluc2V0OiAwO1xuICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6ICR7b3B0aW9ucz8uaGlkZGVuID8gJzAnIDogJzEnfTtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6ICR7b3B0aW9ucz8uaGlkZGVuID8gJ25vbmUnIDogJ2FsbCd9O1xuICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBXcml0ZSBjb250ZW50IGludG8gdGhlIGlmcmFtZVxuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBkb2MgPSBJZnJhbWVFbGVtZW50LmNvbnRlbnREb2N1bWVudCB8fCBJZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgICAgICBkb2Mub3BlbigpO1xuXG5cbiAgICAgICAgICAgIGxldCBIVE1MMlJlbmRlciA9IGxvYWRlckNvbmZpZy5IVE1MO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uX2luc3BlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAvL2luamVjdCBpbnNwZWN0aW9uIHNjcmlwdCBmb3IgcHJvcHMgZGV0ZWN0aW9uXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9kb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogcGFydCBvZiBBSSBjb21wb25lbnRzLCB0aGluayBhYm91dCB0aGF0LCBkb2N1bWVudCBpdC5cbiAgICAgICAgICAgICAgICBjb25zdCBteW9wX3ByZXZpZXdfc2NyaXB0ID0gX2RvYy5nZXRFbGVtZW50QnlJZCgnbXlvcF9wcmV2aWV3Jyk7XG4gICAgICAgICAgICAgICAgbXlvcF9wcmV2aWV3X3NjcmlwdD8ucmVtb3ZlQXR0cmlidXRlKCd0eXBlJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBQYXJzZSB0aGUgaW5qZWN0ZWQgSFRNTCBzdHJpbmcgaW50byBhIG5vZGVcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wID0gX2RvYy5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoKTtcbiAgICAgICAgICAgICAgICB0ZW1wLmJvZHkuaW5uZXJIVE1MID0gYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmVLZXlzV2luZG93ID0gbmV3IFNldChPYmplY3Qua2V5cyh3aW5kb3cpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlS2V5c1dpbmRvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0ZW1wLmJvZHkuZmlyc3RDaGlsZDtcblxuICAgICAgICAgICAgICAgIGlmIChub2RlICYmIF9kb2MuaGVhZCkge1xuICAgICAgICAgICAgICAgICAgICBfZG9jLmhlYWQuaW5zZXJ0QmVmb3JlKF9kb2MuaW1wb3J0Tm9kZShub2RlLCB0cnVlKSwgX2RvYy5oZWFkLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIEhUTUwyUmVuZGVyID0gX2RvYy5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgIC8vVE9ETzogaW1wcm92ZSBieSBkbyBpdCBvbiB0aGUgc2VydmUgb25jZVxuXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIG15b3BfcHJldmlldyBzY3JpcHQgd2hlbiBub3QgaW4gaW5zcGVjdGlvbiBtb2RlXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9kb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcF9wcmV2aWV3X3NjcmlwdCA9IF9kb2MuZ2V0RWxlbWVudEJ5SWQoJ215b3BfcHJldmlldycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG15b3BfcHJldmlld19zY3JpcHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbXlvcF9wcmV2aWV3X3NjcmlwdC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgSFRNTDJSZW5kZXIgPSBfZG9jLmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGRvYy53cml0ZWxuKEhUTUwyUmVuZGVyKTtcblxuICAgICAgICAgICAgLy8gd2luZG93Ll9fZmVkZXJhdGlvbl9fID1cbiAgICAgICAgICAgIC8vICAgICB7IC4uLndpbmRvdy5fX2ZlZGVyYXRpb25fXyxcbiAgICAgICAgICAgIC8vICAgICAgICAgLy9UT0RPIDogZ2V0IGZyb20gRU5WIGF0IGJ1aWxkIHRpbWUsXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vIGluamVjdCB2YWx1ZSB0byBtb2R1bGUgYXQgYnVpbGQgdGltZVxuICAgICAgICAgICAgLy8gICAgICAgICAvLyB0b2RheSB3ZSBkb2luZyBzbyBqdXN0IGZvciB0aGUgQ0pTIHZlcnNpb25cbiAgICAgICAgICAgIC8vICAgICAgICAgX19wdWJsaWNfcGF0aF9fIDonaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQnXG4gICAgICAgICAgICAvLyAgICAgICAgICwuLi4ke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICB3aW5kb3cuX19mZWRlcmF0aW9uX18pXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgIH07XG5cbiAgICAgICAgICAgIC8vIEZvciBucG0gcGFja2FnZSB1c2VycyB3aXRoIGJ1bmRsZXJzIChWaXRlL1dlYnBhY2spLCBpbmplY3QgU0RLIGlubGluZVxuICAgICAgICAgICAgLy8gRm9yIENETiB1c2VycyAoc2NyaXB0IHRhZyksIHVzZSBDRE4gVVJMXG4gICAgICAgICAgICBjb25zdCBzZGtTY3JpcHQgPSBIQVNfRU1CRURERURfU0RLXG4gICAgICAgICAgICAgICAgPyBgPHNjcmlwdD4ke0VNQkVEREVEX1NES19DT05URU5UfTwvc2NyaXB0PmBcbiAgICAgICAgICAgICAgICA6IGA8c2NyaXB0IHNyYz1cIiR7d2luZG93Lm15b3AuX19ST09UX1NES19QVUJMSUNfVVJMX199XCI+PC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgLy8gRGlmZmVyZW50IGluaXQgc2NyaXB0IGZvciBlbWJlZGRlZCB2cyBDRE4gU0RLXG4gICAgICAgICAgICAvLyAtIEVtYmVkZGVkIChidW5kbGVkIElJRkUpOiB1c2VzIE15b3BTREsuZ2V0SWZyYW1lTW9kdWxlKCkgd2hpY2ggcmV0dXJucyBtb2R1bGUgZGlyZWN0bHlcbiAgICAgICAgICAgIC8vIC0gQ0ROIChkeW5hbWljIGxvYWRpbmcpOiB1c2VzIHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkgd2hpY2ggd3JhcHMgd2l0aCAuZ2V0KClcbiAgICAgICAgICAgIGNvbnN0IGluaXRTY3JpcHQgPSBIQVNfRU1CRURERURfU0RLXG4gICAgICAgICAgICAgICAgPyBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICBjb25zdCBfX215b3BfaW5pdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlmcmFtZU1vZHVsZSA9IGF3YWl0IE15b3BTREsuZ2V0SWZyYW1lTW9kdWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJZnJhbWVTREsgPSBpZnJhbWVNb2R1bGUuSWZyYW1lU0RLO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2RrID0gbmV3IElmcmFtZVNESygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2RrLmluaXQoKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgX19teW9wX2luaXQoKS50aGVuKCk7XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YFxuICAgICAgICAgICAgICAgIDogYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgd2luZG93Ll9fZmVkZXJhdGlvbl9fLl9fcHVibGljX3BhdGhfXyA9IHdpbmRvdy5fX2ZlZGVyYXRpb25fXy5fX3B1YmxpY19wYXRoX187XG4gICAgICAgICAgICAgICAgICAgY29uc3QgX19teW9wX2luaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNkayA9IG5ldyBJZnJhbWVTREsoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNkay5pbml0KCk7XG4gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgIF9fbXlvcF9pbml0KCkudGhlbigpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgIGRvYy53cml0ZWxuKGAke3Nka1NjcmlwdH0ke2luaXRTY3JpcHR9YCk7XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBkYXRhIHNjcmlwdCBpZiBkYXRhIG9wdGlvbiBpcyBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIFNldHVwIENUQSBxdWV1ZSAtIGNhcHR1cmVzIGFueSBDVEFzIGVtaXR0ZWQgZHVyaW5nIGluaXQgYmVmb3JlIGhvc3QgcmVnaXN0ZXJzIGhhbmRsZXJcbiAgICAgICAgICAgICAgICBjb25zdCBjdGFRdWV1ZVNjcmlwdCA9IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2N0YV9xdWV1ZSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcF9jdGFfaGFuZGxlciA9IGZ1bmN0aW9uKGFjdGlvbiwgcGF5bG9hZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9jdGFfcXVldWUucHVzaCh7YWN0aW9uOiBhY3Rpb24sIHBheWxvYWQ6IHBheWxvYWR9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICAgICAgLy8gRXNjYXBlIGRhdGEgZm9yIHNhZmUgZW1iZWRkaW5nIGluIHNjcmlwdCB0YWdcbiAgICAgICAgICAgICAgICAvLyBKU09OLnN0cmluZ2lmeSBkb2Vzbid0IGVzY2FwZSA8L3NjcmlwdD4gd2hpY2ggY291bGQgYnJlYWsgSFRNTCBwYXJzaW5nXG4gICAgICAgICAgICAgICAgY29uc3QgZXNjYXBlZERhdGEgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmRhdGEpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC88XFwvc2NyaXB0L2dpLCAnXFxcXHUwMDNjL3NjcmlwdCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gU2VsZi1jb250YWluZWQgZGF0YSBpbmplY3Rpb24gc2NyaXB0IHRoYXQ6XG4gICAgICAgICAgICAgICAgLy8gMS4gQ2FsbHMgbXlvcF9pbml0X2ludGVyZmFjZSBpbW1lZGlhdGVseSBpZiBhbHJlYWR5IGRlZmluZWRcbiAgICAgICAgICAgICAgICAvLyAyLiBXYXRjaGVzIGZvciBsYXRlLWRlZmluZWQgbXlvcF9pbml0X2ludGVyZmFjZSB2aWEgZGVmaW5lUHJvcGVydHlcbiAgICAgICAgICAgICAgICAvLyAzLiBDbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIChyZW1vdmVzIHNjcmlwdCB0YWcgYW5kIHdpbmRvdyBkYXRhKVxuICAgICAgICAgICAgICAgIC8vIDQuIFBvc3RzIG1lc3NhZ2UgdG8gcGFyZW50IGZvciBleHRlbnNpb24gdHJhY2tpbmcgKHByZS1pbmplY3RlZCBpbml0KilcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhU2NyaXB0ID0gYDxzY3JpcHQgaWQ9XCJfX215b3BfaW5pdF9kYXRhX3NjcmlwdFwiPlxuICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9ICR7ZXNjYXBlZERhdGF9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjcmlwdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ19fbXlvcF9pbml0X2RhdGFfc2NyaXB0Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWxsSW5pdEludGVyZmFjZSA9IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgYXMgcHJlLWluamVjdGVkIGRhdGEgY2FsbCBmb3IgZXh0ZW5zaW9uIHRyYWNraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X3ByZWluamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbihkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2luaXRfcHJlaW5qZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RpZnkgZXh0ZW5zaW9uIHZpYSBwb3N0TWVzc2FnZSAoaW5pdCogPSBwcmUtaW5qZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTVlPUF9QUkVJTkpFQ1RFRF9JTklUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJyonKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYW51cDogcmVtb3ZlIHNjcmlwdCB0YWcgYW5kIHN0b3JlZCBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmlwdEVsICYmIHNjcmlwdEVsLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0RWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHRFbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3aW5kb3cuX19teW9wX2luaXRfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdW5jdGlvbiBhbHJlYWR5IGV4aXN0cyAtIGNhbGwgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsSW5pdEludGVyZmFjZSh3aW5kb3cubXlvcF9pbml0X2ludGVyZmFjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZ1bmN0aW9uIG5vdCB5ZXQgZGVmaW5lZCAtIHN0b3JlIGRhdGEgYW5kIHdhdGNoIGZvciBkZWZpbml0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X2RhdGEgPSBkYXRhO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9vcmlnaW5hbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbXlvcF9pbml0X2ludGVyZmFjZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3JpZ2luYWwgPSBmbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuX19teW9wX2luaXRfZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0b3JlZERhdGEgPSB3aW5kb3cuX19teW9wX2luaXRfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2luZG93Ll9fbXlvcF9pbml0X2RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEluaXRJbnRlcmZhY2UoZm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vcmlnaW5hbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG4gICAgICAgICAgICAgICAgZG9jLndyaXRlbG4oY3RhUXVldWVTY3JpcHQgKyBkYXRhU2NyaXB0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9jLmNsb3NlKCk7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBjb250cm9sIGZyb20gZGFzaGJvYXJkXG4gICAgICAgICAgICAvLyAgKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLmF1dG9IZWlnaHQgPSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBjb21wID0gbmV3IE15b3BJZnJhbWVDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAgICAgaWYgKGxvYWRlckNvbmZpZy5hdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXAub2JzZXJ2ZVNpemVCYXNlZE9uRG9jdW1lbnRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vIGNvbXAucHJvcHMuX2dsb2JhbCA9IGNvbXAuZWxlbWVudC5jb250ZW50V2luZG93O1xuICAgICAgICAgICAgcmV0dXJuIGNvbXA7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5ub25lKSB7XG4gICAgICAgICAgICAvLyBwYXJzZXIgPSBwYXJzZXIgPyBwYXJzZXIgOiBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAvLyBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAvLyBlbGVtZW50ID0gZG9jLmJvZHkuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIC8vZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgZG9tSWQpO1xuXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDsvLy50cmltKCk7XG4gICAgICAgICAgICBlbGVtZW50ID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcblxuICAgICAgICAgICAgLy8gICBjb25zdCBmaXJzdEVsZW1lbnQgPSB0ZW1wbGF0ZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgLy8gICBjb25zdCB6ID0gZmlyc3RFbGVtZW50ID8gZmlyc3RFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA6IG51bGw7XG4gICAgICAgICAgICAvLyAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gICBjb25zb2xlLmxvZyh0ZW1wbGF0ZSwgZmlyc3RFbGVtZW50LCB6KVxuICAgICAgICAgICAgLy8gICBlbGVtZW50ID0gZmlyc3RFbGVtZW50XG5cbiAgICAgICAgICAgIC8vIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Rib2R5Jyk7XG4gICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIGNvbnRhaW5lci5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDtcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgPSBjb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayhlbGVtZW50LCBlbGVtZW50KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21FbGVtZW50TmFtZSA9IHRvQ3VzdG9tRWxlbWVudE5hbWUoY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lICsgc2tpbi5pZCk7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgcmVkZWZpbmUgIVxuICAgICAgICAgICAgaWYgKCFzZWVuLmluY2x1ZGVzKGN1c3RvbUVsZW1lbnROYW1lKSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZUN1c3RvbVdlYkNvbXBvbmVudChjdXN0b21FbGVtZW50TmFtZSwgbG9hZGVyQ29uZmlnLkhUTUwsIGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSk7XG4gICAgICAgICAgICAgICAgc2Vlbi5wdXNoKGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIC8vZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29udGFpbmVyLmlkLnN0YXJ0c1dpdGgoJ215b3AtY29tcC0nKSkge1xuICAgICAgICAvLyAgICAgLy8gaW4gcGxhY2UgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChlbGVtZW50KTtcbiAgICAgICAgLy8gICAgIC8vY29udGFpbmVyID0gZWxlbWVudC5wYXJlbnRFbGVtZW50ITtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2N1c3RvbUVsZW1lbnROYW1lfSAvPmA7XG4gICAgICAgIHJldHVybiBuZXcgTXlvcFdlYkNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSAqIGFzIENTUyBmcm9tIFwiY3NzdHlwZVwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuXG4vLyBpZ25vcmluZyBkb2N1bWVudGF0aW9uXG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGludGVyZmFjZSBDU1NQcm9wZXJ0aWVzIGV4dGVuZHMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPiB7XG59XG5cbmV4cG9ydCB0eXBlIFN0eWxlc2hlZXREZWZpbml0aW9uID0geyBba2V5OiBzdHJpbmddOiBDU1NQcm9wZXJ0aWVzIH07XG5cbmV4cG9ydCBjb25zdCBhcHBseVN0eWxlc2hlZXQgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgc3R5bGVzaGVldDogU3R5bGVzaGVldERlZmluaXRpb24sIGNzcz86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHRhZ0lkID0gYG15b3AtY3NzLSR7dXVpZHY0KCl9YDtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfc3R5bGVzaGVldCwgX3RhZ0lkLCBfY3NzfSkgPT4ge1xuICAgICAgICBjb25zdCBzdHlsZVRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIHN0eWxlVGFnLnR5cGUgPSAndGV4dC9jc3MnO1xuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBDU1Mgc3RyaW5nIGZyb20gdGhlIHN0eWxlcyBvYmplY3RcbiAgICAgICAgbGV0IGNzc1N0cmluZyA9IF9jc3M7XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWxlY3RvciBpbiBfc3R5bGVzaGVldCkge1xuICAgICAgICAgICAgY3NzU3RyaW5nICs9IGAke3NlbGVjdG9yfSB7IGA7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gX3N0eWxlc2hlZXRbc2VsZWN0b3JdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgY3NzU3RyaW5nICs9IGAke3Byb3BlcnR5fTogJHtwcm9wZXJ0aWVzW3Byb3BlcnR5XX07IGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjc3NTdHJpbmcgKz0gJ30gJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgQ1NTIHN0cmluZyBhcyB0aGUgY29udGVudCBvZiB0aGUgPHN0eWxlPiBlbGVtZW50XG4gICAgICAgIHN0eWxlVGFnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzc1N0cmluZykpO1xuICAgICAgICBzdHlsZVRhZy5pZCA9IF90YWdJZDtcbiAgICAgICAgLy8gQXBwZW5kIHRoZSA8c3R5bGU+IGVsZW1lbnRcbiAgICAgICAgKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikuYXBwZW5kQ2hpbGQoc3R5bGVUYWcpO1xuXG4gICAgfSwgKCkgPT4ge1xuICAgIH0sIHtcbiAgICAgICAgX3N0eWxlc2hlZXQ6IHN0eWxlc2hlZXQsXG4gICAgICAgIF9jc3MgOiBjc3MgPyBjc3MgOiAnJyxcbiAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgIH0pKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IGRvY3VtZW50KS5nZXRFbGVtZW50QnlJZChfdGFnSWQpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIF90YWdJZDogdGFnSWRcbiAgICAgICAgfSkpXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgYXBwbHlTdHlsZXNoZWV0TGluayA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBsaW5rOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0YWdJZCA9IGBteW9wLWNzcy0ke3V1aWR2NCgpfWA7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7cm9vdFJlZiwgX3RhZ0lkLCBfbGlua30pID0+IHtcbiAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgIGxpbmtFbGVtZW50LmlkID0gX3RhZ0lkO1xuICAgICAgICBsaW5rRWxlbWVudC5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBfbGluaztcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rRWxlbWVudCk7XG5cbiAgICAgICAgLy8gQXBwZW5kIHRoZSA8c3R5bGU+IGVsZW1lbnRcbiAgICAgICAgKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikuYXBwZW5kQ2hpbGQobGlua0VsZW1lbnQpO1xuICAgIH0sICgpID0+IHtcbiAgICB9LCB7XG4gICAgICAgIF9saW5rIDogbGluayxcbiAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgIH0pKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IGRvY3VtZW50KS5nZXRFbGVtZW50QnlJZChfdGFnSWQpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIF90YWdJZDogdGFnSWRcbiAgICAgICAgfSkpXG4gICAgfVxufVxuIiwgImltcG9ydCB7SUlmcmFtZUxvYWRlckNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IHR5cGUgVG9rZW5NYXAgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8IG51bWJlcj5cblxuY29uc3QgcmVwbGFjZVRva2VucyA9IChpbnB1dDogc3RyaW5nLCB0b2tlbk1hcDogVG9rZW5NYXApOiBzdHJpbmcgPT4ge1xuICAgIC8vIENyZWF0ZSBhIHJlZ2V4IHBhdHRlcm4gZnJvbSB0aGUga2V5cyBvZiB0aGUgdG9rZW5NYXBcbiAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyh0b2tlbk1hcCkuam9pbignfCcpLCAnZycpO1xuXG4gICAgLy8gUmVwbGFjZSB0b2tlbnMgaW4gdGhlIGlucHV0IHN0cmluZyB1c2luZyB0aGUgcmVnZXhcbiAgICByZXR1cm4gaW5wdXQucmVwbGFjZShwYXR0ZXJuLCAobWF0Y2hlZCkgPT4ge1xuICAgICAgICAvLyBSZXR1cm4gdGhlIHJlcGxhY2VtZW50IHZhbHVlIGZyb20gdGhlIHRva2VuTWFwXG4gICAgICAgIHJldHVybiAodG9rZW5NYXBbbWF0Y2hlZF0gfHwgbWF0Y2hlZCkudG9TdHJpbmcoKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUlmcmFtZVNraW5CeVRva2VuaXplciA9IChzZWxlY3RlZFNraW46IElTa2luQ29uZmlnLCB0b2tlbk1hcDogVG9rZW5NYXApID0+IHtcbiAgICBjb25zdCB0eXBlZFNraW5Db25maWcgPSAoc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKVxuICAgIGlmICh0eXBlZFNraW5Db25maWcudHlwZSAhPT0gJ0lmcmFtZUxvYWRlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpZnJhbWVTa2luVXJsVG9rZW5pemVyIHJlY2VpdmVkIHNraW4gd2l0aCBsb2FkZXIgdHlwZSBcIiR7dHlwZWRTa2luQ29uZmlnLnR5cGV9XCIsIGN1cnJlbnRseSBvbmx5IFwiSWZyYW1lTG9hZGVyXCIgaXMgc3VwcG9ydGVkYClcbiAgICB9XG5cbiAgICBzZWxlY3RlZFNraW4ubG9hZGVyID0ge1xuICAgICAgICAuLi5zZWxlY3RlZFNraW4ubG9hZGVyXG4gICAgfVxuXG4gICAgc2VsZWN0ZWRTa2luLmxvYWRlci51cmwgPSByZXBsYWNlVG9rZW5zKHNlbGVjdGVkU2tpbi5sb2FkZXIudXJsLCB0b2tlbk1hcCk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRTa2luO1xufVxuXG5leHBvcnQgY29uc3QgY2hhbmdlU2tpblVybEJ5VG9rZW5pemVyID0gKHRva2VuTWFwOiBUb2tlbk1hcCkgPT4ge1xuICAgIHJldHVybiBhc3luYyAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuICAgICAgICByZXR1cm4gY3JlYXRlSWZyYW1lU2tpbkJ5VG9rZW5pemVyKHNlbGVjdGVkU2tpbiwgdG9rZW5NYXApO1xuICAgIH1cbn0iLCAiaW1wb3J0IHtDdXN0b21SZWZNZXNzYWdlfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9ob3N0XCI7XG5cbi8vIGNvbnN0IHNwYWNlID0gJyAnO1xuLy8gZXhwb3J0IGNvbnN0IGdldENsYXNzZXMgPSBhc3luYyAoY29ubmVjdGVkUmVmOiBSZWYpOiBQcm9taXNlPHN0cmluZ1tdPiA9PiAoYXdhaXQgZXhlYyhhY3RBczxIVE1MRGl2RWxlbWVudD4oY29ubmVjdGVkUmVmKS5jbGFzc0xpc3QpKS52YWx1ZS5zcGxpdChzcGFjZSk7XG4vLyBleHBvcnQgY29uc3QgYWRkQ2xhc3MgPSBhc3luYyAoY29ubmVjdGVkUmVmOiBSZWYsIGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4vLyAgICAgY29uc3QgY2xhc3NlcyA9IGF3YWl0IGdldENsYXNzZXMoY29ubmVjdGVkUmVmKTtcbi8vICAgICBjbGFzc2VzLmluY2x1ZGVzKGNsYXNzTmFtZSkgfHwgY2xhc3Nlcy5wdXNoKGNsYXNzTmFtZSk7XG4vLyAgICAgLy8gQHRzLWlnbm9yZVxuLy8gICAgIGNvbm5lY3RlZFJlZi5jbGFzc0xpc3QgPSBjbGFzc2VzLmpvaW4oc3BhY2UpO1xuLy8gfVxuLy8gZXhwb3J0IGNvbnN0IHJlbW92ZUNsYXNzID0gYXN5bmMgKGNvbm5lY3RlZFJlZjogUmVmLCBjbGFzc05hbWU6IHN0cmluZywpID0+IHtcbi8vICAgICBsZXQgY2xhc3NlcyA9IGF3YWl0IGdldENsYXNzZXMoY29ubmVjdGVkUmVmKTtcbi8vICAgICAvLyBAdHMtaWdub3JlXG4vLyAgICAgY29ubmVjdGVkUmVmLmNsYXNzTGlzdCA9IGNsYXNzZXMuZmlsdGVyKGMgPT4gYyAhPT0gY2xhc3NOYW1lKS5qb2luKHNwYWNlKTtcbi8vIH1cbi8vXG4vL1xuXG5leHBvcnQgY29uc3QgYWRkQ2xhc3MgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgY2xhc3NOYW1lOiBzdHJpbmcsIG15b3BJZDogc3RyaW5nKSA9PiB7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIF9jbGFzc05hbWV9KSA9PiB7XG4gICAgICAgIHJlZj8uY2xhc3NMaXN0LmFkZChfY2xhc3NOYW1lKTtcbiAgICB9LCB7XG4gICAgICAgIGVsZW1lbnRJZDogbXlvcElkLFxuICAgICAgICBfY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgICB9KSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVDbGFzcyA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjbGFzc05hbWU6IHN0cmluZywgbXlvcElkOiBzdHJpbmcpID0+IHtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgX2NsYXNzTmFtZX0pID0+IHtcbiAgICAgICAgcmVmPy5jbGFzc0xpc3QucmVtb3ZlKF9jbGFzc05hbWUpO1xuICAgIH0sIHtcbiAgICAgICAgZWxlbWVudElkOiBteW9wSWQsXG4gICAgICAgIF9jbGFzc05hbWU6IGNsYXNzTmFtZVxuICAgIH0pKTtcbn0iLCAiaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZywgSUhUTUxMb2FkZXJDb25maWcsIElSZWZDb25maWcsXG4gICAgSVNraW5Mb2FkZXJDb25maWcsXG4gICAgSVNraW5TZWxlY3RvckNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZywgSVNraW5Db25maWdcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlscy50c1wiO1xuXG5leHBvcnQgY2xhc3MgU2tpbkNvbmZpZyBpbXBsZW1lbnRzIElTa2luQ29uZmlnIHtcbiAgICBfcnVuVGltZUluc3RhbmNlSWQgPSAncnVudGltZS1pbnN0YW5jZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVJZCA9ICdydW50aW1lLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZU5hbWUgPSAncnVudGltZS1uYW1lLScgKyB1dWlkdjQoKTtcblxuICAgIHN0YXRpYyBjcmVhdGUgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgU2tpbkNvbmZpZygpO1xuICAgIH1cblxuICAgIGlkID0gdGhpcy5fcnVuVGltZUlkO1xuICAgIG5hbWUgPSB0aGlzLl9ydW5UaW1lTmFtZTtcbiAgICBkZXNjcmlwdGlvbiA9ICcnO1xuICAgIGxvYWRlciA9IG51bGwgYXMgdW5rbm93biBhcyBJU2tpbkxvYWRlckNvbmZpZztcblxuICAgIHdpdGhMb2FkZXIgPSAobG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aEhUTUxMb2FkZXIgPSAobG9hZGVyOiBPbWl0PElIVE1MTG9hZGVyQ29uZmlnLCAndHlwZSc+KSA9PiB7XG4gICAgICAgIGxvYWRlci50eXBlID0gJ0hUTUxMb2FkZXInO1xuICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgYnVpbGQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBvbmVudENvbmZpZyBpbXBsZW1lbnRzIElDb21wb25lbnRDb25maWcge1xuICAgIF9ydW5UaW1lSW5zdGFuY2VJZCA9ICdydW50aW1lLWluc3RhbmNlLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZUlkID0gJ3J1bnRpbWUtaWQtJyArIHV1aWR2NCgpO1xuICAgIF9ydW5UaW1lTmFtZSA9ICdydW50aW1lLW5hbWUtJyArIHV1aWR2NCgpO1xuXG4gICAgc3RhdGljIGNyZWF0ZSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRDb25maWcoKTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZSA9IHtcbiAgICAgICAgaWQ6IHRoaXMuX3J1blRpbWVJbnN0YW5jZUlkLFxuICAgICAgICBjb21wb25lbnRJZDogdGhpcy5fcnVuVGltZUlkLFxuICAgICAgICBjb21wb25lbnROYW1lOiB0aGlzLl9ydW5UaW1lTmFtZSxcbiAgICAgICAgc2tpblNlbGVjdG9yOiBudWxsIGFzIHVua25vd24gYXMgSVNraW5TZWxlY3RvckNvbmZpZ1xuICAgIH0gYXMgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnO1xuXG4gICAgbmFtZSA9IHRoaXMuX3J1blRpbWVOYW1lXG4gICAgdHlwZSA9IHtcbiAgICAgICAgaWQ6IHRoaXMuX3J1blRpbWVJZCxcbiAgICAgICAgbmFtZTogdGhpcy5fcnVuVGltZU5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgcHJvcHM6IFtdLFxuICAgICAgICByZWZzOiBbXSxcbiAgICAgICAgc2tpbnM6IFtdLFxuICAgICAgICBkZWZhdWx0U2tpbjogMFxuICAgIH0gYXMgSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcblxuICAgIHdpdGhJbnN0YW5jZSA9IChpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aFR5cGUgPSAodHlwZTogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aE5hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhEZWZhdWx0U2tpbiA9IChkZWZhdWx0U2tpbjogSVNraW5Db25maWcpID0+IHtcbiAgICAgICAgdGhpcy50eXBlLnNraW5zLnB1c2goZGVmYXVsdFNraW4pO1xuICAgICAgICB0aGlzLnR5cGUuZGVmYXVsdFNraW4gPSB0aGlzLnR5cGUuc2tpbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICB0eXBlOiAnRGVkaWNhdGVkJyxcbiAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICBpZDogZGVmYXVsdFNraW4uaWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhSZWYgPSAocmVmOiBJUmVmQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMudHlwZS5yZWZzLnB1c2gocmVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aEJhc2ljUmVmID0gKHJlZlNlbGVjdG9yOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgbmV3QmFzaWNSZWYgPSB7XG4gICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICBuYW1lOiByZWZTZWxlY3RvcixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgIHNlbGVjdG9yVHlwZTogJ2lkLWF0dHJpYnV0ZScsXG4gICAgICAgICAgICBzZWxlY3RvcjogcmVmU2VsZWN0b3IsXG4gICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGFzIElSZWZDb25maWdcblxuICAgICAgICB0aGlzLnR5cGUucmVmcy5wdXNoKG5ld0Jhc2ljUmVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgYnVpbGQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMpKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge1xuICAgIElDb21wb25lbnRDb25maWcsXG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnLFxuICAgIElEZWRpY2F0ZWRTa2luQ29uZmlnLFxuICAgIElQcm9wQ29uZmlnLFxuICAgIElTa2luQ29uZmlnLFxuICAgIElVc2VyRmxvdyxcbiAgICBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyxcbiAgICB2Ml9JVmFyaWFudENvbmZpZ1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmNvbnN0IGNvbnZlcnRWMlZhcmlhbnRUb0NvbXBvbmVudENvbmZpZyA9IChjb25maWc6IHYyX0lWYXJpYW50Q29uZmlnKTogSUNvbXBvbmVudENvbmZpZyA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5zdGFuY2U6IHtcbiAgICAgICAgICAgIGlkOiAnYXV0bycsXG4gICAgICAgICAgICBjb21wb25lbnRJZDogY29uZmlnLmNvbXBvbmVudElkLFxuICAgICAgICAgICAgY29tcG9uZW50TmFtZTogY29uZmlnLm5hbWUsXG5cbiAgICAgICAgICAgIHNraW5TZWxlY3Rvcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdEZWRpY2F0ZWQnLFxuICAgICAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdza2luX2F1dG9fdjJfY29udmVydGVkJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWdcblxuICAgICAgICB9IGFzIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyxcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgaWQ6IGNvbmZpZy5pZCxcbiAgICAgICAgICAgIG5hbWU6IGNvbmZpZy5uYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHByb3BzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ2luX2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ215b3BfaW5pdF9pbnRlcmZhY2UnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYW55JyxcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gYXMgSVByb3BDb25maWcsXG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnb3V0X2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ215b3BfY3RhX2hhbmRsZXInLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYW55JyxcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gYXMgSVByb3BDb25maWdcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZWZzOiBbXSxcbiAgICAgICAgICAgIHNraW5zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ3NraW5fYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhhbmRsZSBlbXB0eSA6XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVyOiBjb25maWcuY29uc3VtZV92YXJpYW50WzBdLmxvYWRlclxuICAgICAgICAgICAgICAgIH0gYXMgSVNraW5Db25maWdcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBkZWZhdWx0U2tpbjogMFxuICAgICAgICB9IGFzIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBuYW1lOiBjb25maWcubmFtZVxuICAgIH0gYXMgSUNvbXBvbmVudENvbmZpZztcbn07XG5cbi8qKlxuICogQ2xvdWRSZXBvc2l0b3J5IC0gVW5pZmllZCBjbG91ZCBkYXRhIGFjY2VzcyBsYXllciBmb3IgTXlvcCBjb21wb25lbnRzXG4gKlxuICogU3VwcG9ydHMgYm90aCB2MiAoZGVmYXVsdCkgYW5kIHYxIG1vZGVzOlxuICogLSB2MjogVXNlcyAvY29uc3VtZSBlbmRwb2ludCBmb3IgZmV0Y2hpbmcgdmFyaWFudHNcbiAqIC0gdjE6IFVzZXMgL2Zsb3cgZW5kcG9pbnQgZm9yIGZldGNoaW5nIHVzZXIgZmxvd3NcbiAqL1xuLy8gVXNlIGEgZ2xvYmFsIHNpbmdsZXRvbiB0byBlbnN1cmUgb25seSBvbmUgQ2xvdWRSZXBvc2l0b3J5Lk1haW4gZXhpc3RzXG4vLyBldmVuIHdoZW4gdGhlIG1vZHVsZSBpcyBsb2FkZWQgbXVsdGlwbGUgdGltZXMgYnkgZGlmZmVyZW50IGJ1bmRsZXJzXG5jb25zdCBHTE9CQUxfS0VZID0gJ19fTVlPUF9DTE9VRF9SRVBPU0lUT1JZX01BSU5fXyc7XG5cbmNvbnN0IGdldEdsb2JhbE1haW4gPSAoKTogQ2xvdWRSZXBvc2l0b3J5IHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KVtHTE9CQUxfS0VZXTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gKGdsb2JhbFRoaXMgYXMgYW55KVtHTE9CQUxfS0VZXTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IHNldEdsb2JhbE1haW4gPSAoaW5zdGFuY2U6IENsb3VkUmVwb3NpdG9yeSkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAod2luZG93IGFzIGFueSlbR0xPQkFMX0tFWV0gPSBpbnN0YW5jZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAoZ2xvYmFsVGhpcyBhcyBhbnkpW0dMT0JBTF9LRVldID0gaW5zdGFuY2U7XG4gICAgfVxufTtcblxuZXhwb3J0IGNsYXNzIENsb3VkUmVwb3NpdG9yeSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX21haW46IENsb3VkUmVwb3NpdG9yeSB8IG51bGwgPSBudWxsO1xuXG4gICAgc3RhdGljIGdldCBNYWluKCk6IENsb3VkUmVwb3NpdG9yeSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGEgZ2xvYmFsIGluc3RhbmNlIGFscmVhZHkgZXhpc3RzIChmcm9tIGFub3RoZXIgYnVuZGxlKVxuICAgICAgICBjb25zdCBnbG9iYWxNYWluID0gZ2V0R2xvYmFsTWFpbigpO1xuICAgICAgICBpZiAoZ2xvYmFsTWFpbikge1xuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbE1haW47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgbmV3IGluc3RhbmNlIGlmIG5lZWRlZFxuICAgICAgICBpZiAoIUNsb3VkUmVwb3NpdG9yeS5fbWFpbikge1xuICAgICAgICAgICAgQ2xvdWRSZXBvc2l0b3J5Ll9tYWluID0gbmV3IENsb3VkUmVwb3NpdG9yeSgpO1xuICAgICAgICAgICAgc2V0R2xvYmFsTWFpbihDbG91ZFJlcG9zaXRvcnkuX21haW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDbG91ZFJlcG9zaXRvcnkuX21haW47XG4gICAgfVxuXG4gICAgLy8gdjIgY2FjaGUgLSBrZXllZCBieSBjb21wb25lbnRJZDplbnY6cHJldmlld3xsaXZlXG4gICAgcHJpdmF0ZSB2YXJpYW50czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPj4gPSB7fTtcblxuICAgIC8vIFRyYWNrIHdoaWNoIGNvbXBvbmVudHMgd2VyZSBwcmVsb2FkZWQgYW5kIHdpdGggd2hhdCBwYXJhbXNcbiAgICAvLyBLZXk6IGNvbXBvbmVudElkLCBWYWx1ZTogeyBlbnYsIHByZXZpZXcgfVxuICAgIHByaXZhdGUgcHJlbG9hZGVkQ29tcG9uZW50czogUmVjb3JkPHN0cmluZywgeyBlbnY6IHN0cmluZzsgcHJldmlldzogYm9vbGVhbiB9PiA9IHt9O1xuXG4gICAgLy8gdjEgY2FjaGVcbiAgICBwcml2YXRlIHVzZXJGbG93czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJVXNlckZsb3c+PiA9IHt9O1xuXG4gICAgcHJpdmF0ZSBfZGVmYXVsdEVudiA9ICdwcm9kdWN0aW9uJztcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Jhc2VVcmwgPSAnaHR0cHM6Ly9jbG91ZC5teW9wLmRldicpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQgZm9yIHRoaXMgQ2xvdWRSZXBvc2l0b3J5IGluc3RhbmNlXG4gICAgICovXG4gICAgc2V0RW52aXJvbm1lbnQoZW52OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEVudiA9IGVudjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBlbnZpcm9ubWVudFxuICAgICAqL1xuICAgIGdldERlZmF1bHRFbnZpcm9ubWVudCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdEVudjtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT0gVjIgTWV0aG9kcyAoRGVmYXVsdCkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIGNvbXBvbmVudCBpcyBhbHJlYWR5IGNhY2hlZC9wcmVsb2FkZWQgKHYyKVxuICAgICAqIElmIGVudiBhbmQgcHJldmlldyBhcmUgbm90IHByb3ZpZGVkLCBjaGVja3MgaWYgQU5ZIHZlcnNpb24gaXMgcHJlbG9hZGVkXG4gICAgICovXG4gICAgaXNQcmVsb2FkZWQoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICAvLyBJZiBzcGVjaWZpYyBlbnYvcHJldmlldyByZXF1ZXN0ZWQsIGNoZWNrIGV4YWN0IG1hdGNoXG4gICAgICAgIGlmIChlbnYgIT09IHVuZGVmaW5lZCB8fCBwcmV2aWV3ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7Y29tcG9uZW50SWR9OiR7ZW52IHx8IHRoaXMuX2RlZmF1bHRFbnZ9OiR7cHJldmlldyA/ICdwcmV2aWV3JyA6ICdsaXZlJ31gO1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlS2V5IGluIHRoaXMudmFyaWFudHM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGNoZWNrIGlmIGFueSB2ZXJzaW9uIHdhcyBwcmVsb2FkZWRcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudElkIGluIHRoaXMucHJlbG9hZGVkQ29tcG9uZW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHByZWxvYWRlZCBwYXJhbXMgZm9yIGEgY29tcG9uZW50IChpZiBwcmVsb2FkZWQpXG4gICAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgbm90IHByZWxvYWRlZFxuICAgICAqL1xuICAgIGdldFByZWxvYWRlZFBhcmFtcyhjb21wb25lbnRJZDogc3RyaW5nKTogeyBlbnY6IHN0cmluZzsgcHJldmlldzogYm9vbGVhbiB9IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSB2MiBjb21wb25lbnQgY29uZmlnXG4gICAgICogSWYgZW52L3ByZXZpZXcgbm90IHNwZWNpZmllZCBhbmQgY29tcG9uZW50IHdhcyBwcmVsb2FkZWQsIHVzZXMgcHJlbG9hZGVkIHBhcmFtc1xuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50VjIoY29tcG9uZW50SWQ6IHN0cmluZywgZW52aXJvbm1lbnRJZGVudGlmaWVyPzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IFByb21pc2U8SUNvbXBvbmVudENvbmZpZz4ge1xuICAgICAgICAvLyBJZiBubyBleHBsaWNpdCBlbnYvcHJldmlldyBhbmQgY29tcG9uZW50IHdhcyBwcmVsb2FkZWQsIHVzZSBwcmVsb2FkZWQgcGFyYW1zXG4gICAgICAgIGNvbnN0IHByZWxvYWRlZCA9IHRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF07XG4gICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0UGFyYW1zID0gZW52aXJvbm1lbnRJZGVudGlmaWVyICE9PSB1bmRlZmluZWQgfHwgcHJldmlldyAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBlbnY6IHN0cmluZztcbiAgICAgICAgbGV0IHVzZVByZXZpZXc6IGJvb2xlYW47XG5cbiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdFBhcmFtcyAmJiBwcmVsb2FkZWQpIHtcbiAgICAgICAgICAgIC8vIFVzZSBwcmVsb2FkZWQgcGFyYW1zXG4gICAgICAgICAgICBlbnYgPSBwcmVsb2FkZWQuZW52O1xuICAgICAgICAgICAgdXNlUHJldmlldyA9IHByZWxvYWRlZC5wcmV2aWV3O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVXNlIHByb3ZpZGVkIHBhcmFtcyBvciBkZWZhdWx0c1xuICAgICAgICAgICAgZW52ID0gZW52aXJvbm1lbnRJZGVudGlmaWVyIHx8IHRoaXMuX2RlZmF1bHRFbnY7XG4gICAgICAgICAgICB1c2VQcmV2aWV3ID0gcHJldmlldyA/PyB0cnVlOyAvLyBEZWZhdWx0IHRvIHByZXZpZXcgbW9kZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHtjb21wb25lbnRJZH06JHtlbnZ9OiR7dXNlUHJldmlldyA/ICdwcmV2aWV3JyA6ICdsaXZlJ31gO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ2xvdWRSZXBvc2l0b3J5XSBmZXRjaENvbXBvbmVudFYyJywge1xuICAgICAgICAgICAgY29tcG9uZW50SWQ6IGNvbXBvbmVudElkLnNsaWNlKDAsIDgpICsgJy4uLicsXG4gICAgICAgICAgICBlbnYsXG4gICAgICAgICAgICB1c2VQcmV2aWV3LFxuICAgICAgICAgICAgY2FjaGVLZXksXG4gICAgICAgICAgICBjYWNoZWQ6IGNhY2hlS2V5IGluIHRoaXMudmFyaWFudHNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSkge1xuICAgICAgICAgICAgLy8gVHJhY2sgdGhpcyBhcyBwcmVsb2FkZWQgKGZpcnN0IGZldGNoIGNvdW50cyBhcyBwcmVsb2FkKVxuICAgICAgICAgICAgaWYgKCF0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXSA9IHsgZW52LCBwcmV2aWV3OiB1c2VQcmV2aWV3IH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBgJHt0aGlzLl9iYXNlVXJsfS9jb25zdW1lP2lkPSR7Y29tcG9uZW50SWR9JmVudj0ke2Vudn1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVByZXZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJyZwcmV2aWV3PXRydWUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFyaWFudCA9IGpzb24uaXRlbTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiBub3QgZm91bmRgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhbnQuY29uc3VtZV92YXJpYW50IHx8ICF2YXJpYW50LmNvbnN1bWVfdmFyaWFudC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBDb21wb25lbnQgXCIke2NvbXBvbmVudElkfVwiIGhhcyBubyBpbXBsZW1lbnRhdGlvbiBmb3IgZW52aXJvbm1lbnQgXCIke2Vudn1cImApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudENvbmZpZyA9IGNvbnZlcnRWMlZhcmlhbnRUb0NvbXBvbmVudENvbmZpZyh2YXJpYW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY29tcG9uZW50Q29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT0gVjEgTWV0aG9kcyAoTGVnYWN5KSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGEgdjEgY29tcG9uZW50IGZyb20gYSBmbG93XG4gICAgICovXG4gICAgYXN5bmMgZmV0Y2hDb21wb25lbnRWMShjb21wb25lbnRJZDogc3RyaW5nLCBmbG93SWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGZsb3dJZCkge1xuICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IHRoaXMuZmV0Y2hGbG93KGZsb3dJZCk7XG4gICAgICAgICAgICByZXR1cm4gZmxvdy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IGNvbXBvbmVudElkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoQXV0b0Zsb3coY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50c1swXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGZldGNoQXV0b0Zsb3coY29tcG9uZW50SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuX2Jhc2VVcmx9L2Zsb3c/aWQ9JHtjb21wb25lbnRJZH0mYXV0bz10cnVlYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXTtcbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaEZsb3coZmxvd0lkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJGbG93c1tmbG93SWRdKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy51c2VyRmxvd3NbZmxvd0lkXSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuX2Jhc2VVcmx9L2Zsb3c/aWQ9JHtmbG93SWR9JnJlc29sdmU9Y29tcG9uZW50c2BcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoanNvbi5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVzZXJGbG93c1tmbG93SWRdO1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PSBCYWNrd2FyZCBDb21wYXRpYmlsaXR5ID09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGZldGNoQ29tcG9uZW50VjIgb3IgZmV0Y2hDb21wb25lbnRWMSBleHBsaWNpdGx5XG4gICAgICogRGVmYXVsdHMgdG8gdjEgYmVoYXZpb3IgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBjb2RlXG4gICAgICovXG4gICAgYXN5bmMgZmV0Y2hDb21wb25lbnQoY29tcG9uZW50SWQ6IHN0cmluZywgZmxvd0lkPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoQ29tcG9uZW50VjEoY29tcG9uZW50SWQsIGZsb3dJZCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBDbG91ZFJlcG9zaXRvcnkgaW5zdGVhZFxuICovXG5leHBvcnQgY29uc3QgdjJfQ2xvdWRSZXBvc2l0b3J5ID0gQ2xvdWRSZXBvc2l0b3J5O1xuIiwgImV4cG9ydCBjb25zdCBleGVjID0gYXN5bmMgKGdldHRlcjogYW55KSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGdldHRlcigpXG59XG4iLCAiZXhwb3J0ICogZnJvbSBcIi4vYXBwbHlTdHlsZXNoZWV0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pZnJhbWVTa2luVXJsVG9rZW5pemVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jbGFzc0xpc3RcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbmZpZ0J1aWxkZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0Nsb3VkUmVwb3NpdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXhlY1wiOyIsICJpbXBvcnQge2RlY29tcHJlc3NVVUlEc30gZnJvbSBcIi4uL3V0aWxzL3V1aWQudHNcIjtcbmltcG9ydCB7Q2xvdWRSZXBvc2l0b3J5fSBmcm9tIFwiLi4vaGVscGVyc1wiO1xuaW1wb3J0IHtcbiAgICBFeHBlcmllbmNlVHlwZXMsXG4gICAgSUNvbXBvbmVudENvbmZpZywgSURlZGljYXRlZFNraW5Db25maWcsXG4gICAgSVNlZ21lbnRlZFNraW5Db25maWcsXG4gICAgSVNlZ21lbnRFeHBlcmllbmNlLCBJU2tpbkluc3RhbmNlQ29uZmlnLFxuICAgIFNraW5TZWxlY3RvclR5cGVzXG59IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IGNvbnN0IGNoZWNrTXlvcE92ZXJyaWRlID0gYXN5bmMgKGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyk6IFByb21pc2U8SUNvbXBvbmVudENvbmZpZyB8IG51bGw+ID0+IHtcbiAgICB0cnkge1xuICAgICAgICAvL1RPRE86IHN1cHBvcnQgZGlzYWJsaW5nIHRoZSBtZWNoYW5pc21cbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModXJsLnNlYXJjaCk7XG4gICAgICAgIGNvbnN0IG15b3BPdmVycmlkZSA9IHBhcmFtcy5nZXQoJ215b3BPdmVycmlkZScpO1xuICAgICAgICBpZiAobXlvcE92ZXJyaWRlKSB7XG4gICAgICAgICAgICBjb25zdCBbc291cmNlLCAuLi51dWlkc10gPSBkZWNvbXByZXNzVVVJRHMobXlvcE92ZXJyaWRlKTtcblxuICAgICAgICAgICAgc3dpdGNoIChzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjb21wb25lbnQnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtjb21wb25lbnRJZCwgc2tpbklkXSA9IHV1aWRzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRUb092ZXJyaWRlID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hDb21wb25lbnQoY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9kbzogY2hlY2sgZmV0Y2hBdXRvRmxvdy4gTG9va3MgbGlrZSBvbmx5IG9uZSBza2luIGlzIHJldHVybmVkXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBza2luID0gY29tcG9uZW50VG9PdmVycmlkZS50eXBlLnNraW5zLmZpbmQoc2tpbiA9PiBza2luLmlkID09PSBza2luSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNraW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RvOiBmb3Igbm93IGp1c3Qgc2V0IHNraW4gaWQuIENoZWNrIHRoZSBjbG91ZCBpbXBsZW1lbnRhdGlvblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHNraW5JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIElTa2luSW5zdGFuY2VDb25maWdcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50VG9PdmVycmlkZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vICAgIGNhc2UgJ2Zsb3cnOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdCA6IHtcbiAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBbZmxvd0lkLCBleHBlcmltZW50SWRdID0gdXVpZHM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtmbG93SWQsIGV4cGVyaW1lbnRJZF0gPSBkZWNvbXByZXNzVVVJRHMobXlvcE92ZXJyaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRUb092ZXJyaWRlID0gZmxvdy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IGNvbXBvbmVudENvbmZpZy50eXBlLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3Rvci50eXBlID09PSBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnJlc29sdmVkRXhwZXJpZW5jZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRFeHBlcmllbmNlID0gY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzLmZpbmQoZSA9PiBlLmlkID09PSBleHBlcmltZW50SWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZEV4cGVyaWVuY2U/LnR5cGUgPT09IEV4cGVyaWVuY2VUeXBlcy5TZWdtZW50KSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUmVzb2x2ZWRFeHBlcmllbmNlID0gcmVzb2x2ZWRFeHBlcmllbmNlIGFzIElTZWdtZW50RXhwZXJpZW5jZVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFNraW5TZWxlY3RvciA9IGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yIGFzIElTZWdtZW50ZWRTa2luQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gdHlwZWRTa2luU2VsZWN0b3Iuc2VnbWVudHMuZmluZChzID0+IHMuc2VnbWVudElkID09PSB0eXBlZFJlc29sdmVkRXhwZXJpZW5jZS5zZWdtZW50LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSBzZWdtZW50Py5za2luU2VsZWN0b3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFRvT3ZlcnJpZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsICIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogVGhlIEhvc3QgU0RLIGlzIGRlc2lnbmVkIGZvciBpbnRlZ3JhdGlvbiB3aXRoaW4gdGhlIGhvc3QgYXBwbGljYXRpb24gdGhhdCBzZXJ2ZXMgYXMgdGhlIGNvbnRhaW5lciBmb3IgTXlvcCAgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBJdCBwcm92aWRlcyBlc3NlbnRpYWwgZnVuY3Rpb25hbGl0aWVzIGFuZCBBUElzIGZvciByZWdpc3RlcmluZywgbWFuYWdpbmcsIGFuZCBjb21tdW5pY2F0aW5nIHdpdGggTXlvcCBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGVuYWJsZXMgc2VhbWxlc3MgZW1iZWRkaW5nIG9mIGluZGVwZW5kZW50bHkgZGV2ZWxvcGVkIGNvbXBvbmVudHMgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbiwgZW5zdXJpbmcgc21vb3RoIGludGVyb3BlcmFiaWxpdHkgYW5kIGNvbnNpc3RlbnQgdXNlciBleHBlcmllbmNlIGFjcm9zcyB2YXJpb3VzIE15b3AgY29tcG9uZW50IGltcGxlbWVudGF0aW9ucy5cbiAqL1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge0lNeW9wTG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEVudmVsb3BlZE1lc3NhZ2UsIEV4ZWN1dGVDb21wb25lbnRNZXRob2QsXG4gICAgSW5pdE1lc3NhZ2UsXG4gICAgSW5pdFJlc3BvbnNlLCBNZXNzYWdlRGlyZWN0aW9uLCBSZWZcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BJZnJhbWVMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvaWZyYW1lTG9hZGVyXCI7XG5pbXBvcnQge1dlYmNvbXBvbmVudExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy93ZWJjb21wb25lbnRMb2FkZXJcIjtcbmltcG9ydCB0eXBlIHtJZnJhbWVTREt9IGZyb20gXCIuLi9JZnJhbWVcIjtcbmltcG9ydCB7Y29ubmVjdFByb3BzLCBjb25uZWN0UmVmcywgY3JlYXRlUmVmQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge1xuICAgIEV4cGVyaWVuY2VUeXBlcyxcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElEZWRpY2F0ZWRTa2luQ29uZmlnLCBJRXhwZXJpZW5jZSwgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQsIElTZWdtZW50ZWRTa2luQ29uZmlnLCBJU2VnbWVudEV4cGVyaWVuY2UsXG4gICAgSVNraW5Db25maWcsIElTa2luU2VsZWN0b3JDb25maWcsIFNraW5TZWxlY3RvclR5cGVzLFxuXG5cbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuLy8gQHRzLWlnbm9yZSBoYW5kbGVkIGJ5IGN1c3RvbSBlc2J1aWxkIHBsdWdpblxuaW1wb3J0IHZlcnNpb24gZnJvbSBcIm15b3Atc2RrLXZlcnNpb25cIjtcbmltcG9ydCB7SFRNTENvbXBvbmVudExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9IVE1MQ29tcG9uZW50TG9hZGVyXCI7XG5pbXBvcnQge2NoZWNrTXlvcE92ZXJyaWRlfSBmcm9tIFwiLi9teW9wT3ZlcnJpZGUudHNcIjtcblxuaW50ZXJmYWNlIGNvbXBvbmVudExvYWRlckNyZWF0b3Ige1xuICAgIG5ldyhsb2FkZXJzOiBJTXlvcExvYWRlcltdKTogYW55O1xufVxuXG4vLyBjb25zdCBnZXRDb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gYXN5bmMgKGlkOiBzdHJpbmcpID0+IHtcbi8vICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgaHR0cDovL2xvY2FsaG9zdDozMDAwL2NvbXBvbmVudD9pZD0ke2lkfWApO1xuLy8gICAgIGNvbnN0IGNvbXBvbmVudERlZjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSAoYXdhaXQgcmVzLmpzb24oKSkuaXRlbTtcbi8vICAgICByZXR1cm4gY29tcG9uZW50RGVmXG4vLyB9XG5cbi8vY29uc3QgX19ST09UX1NES19QVUJMSUNfVVJMX18gPSAnaHR0cHM6Ly9kZmRsazJwMW0xODd2LmNsb3VkZnJvbnQubmV0L215b3Bfc2RrLm1pbi5qcydcbmNvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vY2RuLm15b3AuZGV2L3Nkay9uZXh0L215b3Bfc2RrLm1pbi5qcydcblxuLyoqXG4gKiBUaGUgSG9zdCBTREsgaXMgZGVzaWduZWQgZm9yIGludGVncmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0aGF0IHNlcnZlcyBhcyB0aGUgY29udGFpbmVyIGZvciBNeW9wICBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIEl0IHByb3ZpZGVzIGVzc2VudGlhbCBmdW5jdGlvbmFsaXRpZXMgYW5kIEFQSXMgZm9yIHJlZ2lzdGVyaW5nLCBtYW5hZ2luZywgYW5kIGNvbW11bmljYXRpbmcgd2l0aCBNeW9wIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogVGhpcyBTREsgZW5hYmxlcyBzZWFtbGVzcyBlbWJlZGRpbmcgb2YgaW5kZXBlbmRlbnRseSBkZXZlbG9wZWQgY29tcG9uZW50cyBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uLCBlbnN1cmluZyBzbW9vdGggaW50ZXJvcGVyYWJpbGl0eSBhbmQgY29uc2lzdGVudCB1c2VyIGV4cGVyaWVuY2UgYWNyb3NzIHZhcmlvdXMgTXlvcCBjb21wb25lbnQgaW1wbGVtZW50YXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgSG9zdFNESyB7XG4gICAgc3RhdGljIEluc3RhbmNlID0gKCkgPT4gd2luZG93Lm15b3AuaG9zdFNESztcblxuICAgIGNvbXBvbmVudHMyaW5pdDogSU15b3BDb21wb25lbnRbXSA9IFtdO1xuICAgIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10gPSBbXTtcbiAgICBjb21wb25lbnRzTG9hZGVyczogSU15b3BMb2FkZXJbXSA9IFtdO1xuXG4gICAgcHVibGljIGluaXRpYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIHZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gICAgdHlwZTJJbnN0YW5jZUNvdW50OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgcHVibGljIGFzc2lnbklkID0gKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy50eXBlMkluc3RhbmNlQ291bnRbY29tcG9uZW50RGVmaW5pdGlvbi5pZF0pIHtcbiAgICAgICAgICAgIHRoaXMudHlwZTJJbnN0YW5jZUNvdW50W2NvbXBvbmVudERlZmluaXRpb24uaWRdID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7Y29tcG9uZW50RGVmaW5pdGlvbi5pZH1fJHsrK3RoaXMudHlwZTJJbnN0YW5jZUNvdW50W2NvbXBvbmVudERlZmluaXRpb24uaWRdfWA7XG4gICAgfVxuXG4gICAgLy9UT0RPIDogZml4IHRoZSBpbnNwZWN0IGltcGxlbWVudGF0aW9uIGluc2lkZSByZWZDb21wb25lbnRcbiAgICAvL3RoZW4gaW5zcGVjdGVkIG1heWJlIGNhbiBiZSBkcm9wcGVkXG4gICAgcHJpdmF0ZSBpbnNwZWN0ZWQgPSBmYWxzZTtcbiAgICBwdWJsaWMgaW5zcGVjdCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5zcGVjdGVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuaW5zcGVjdGVkID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHMuZm9yRWFjaChjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5pbnNwZWN0KSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50Lmluc3BlY3QoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5jb21pbmdNZXNzYWdlSGFuZGxlciA9IChldmVudDogTWVzc2FnZUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4pID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnaW5jb21pbmdNZXNzYWdlSGFuZGxlciBHT1QgJywgZXZlbnQpXG4gICAgICAgIC8vVE9ETyA6ICBpZiAoZXZlbnQub3JpZ2luICE9PSBcImh0dHA6Ly9leGFtcGxlLm9yZzo4MDgwXCIpIHJldHVybjtcbiAgICAgICAgaWYgKGV2ZW50Lm9yaWdpbiA9PT0gZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdJIEtub3cgdGhhdCAhISEnKTtcbiAgICAgICAgICAgIC8vICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy9jb25zb2xlLmxvZyhcImV2ZW50IG9uIGhvc3Qgc2lkZSBcIiwgZXZlbnQpO1xuXG4gICAgICAgIGlmIChldmVudC5kYXRhLm15b3ApIHtcbiAgICAgICAgICAgIGlmIChldmVudC5kYXRhLmRpcmVjdGlvbiAhPT0gTWVzc2FnZURpcmVjdGlvbi51cCAmJiBldmVudC5kYXRhLm1lc3NhZ2VUeXBlICE9PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ21lc3NhZ2UgZHJvcHBlZCBpbiBob3N0c2RrLCBkaXJlY3Rpb24gd2FzICcsIGV2ZW50LmRhdGEuZGlyZWN0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXZlbnQgb24gaG9zdCBzaWRlIFwiLCBldmVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG15b3BNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UgPSBldmVudC5kYXRhO1xuXG4gICAgICAgICAgICBpZiAobXlvcE1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0UmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0LmZvckVhY2goY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEluaXRNZXNzYWdlKGNvbXBvbmVudC5pZCkpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobXlvcE1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBjb21wb25lbnRzIDIgaW5pdFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdCA9IHRoaXMuY29tcG9uZW50czJpbml0LmZpbHRlcihjb21wb25lbnQgPT4gY29tcG9uZW50LmlkICE9PSAobXlvcE1lc3NhZ2UgYXMgSW5pdFJlc3BvbnNlKS5jb250ZW50LmlkKVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW5pdGlhdGVkQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gKG15b3BNZXNzYWdlIGFzIEluaXRSZXNwb25zZSkuY29udGVudD8uaWQpO1xuICAgICAgICAgICAgICAgIGluaXRpYXRlZENvbXBvbmVudD8uc2V0SW5pdGlhdGVkKClcbiAgICAgICAgICAgICAgICAvL2luaXRpYXRlZENvbXBvbmVudD8ucGFyZW50Py5zZXRJbml0aWF0ZWQoKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogaXMgaXQgdHJ1ZSB0byBub3QgcGFzcyBmdXJ0aGVyICggdG8gdGhlIGNvbXBvbmVudCApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobXlvcE1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSBteW9wTWVzc2FnZSBhcyBFbnZlbG9wZWRNZXNzYWdlXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gdHlwZWRNZXNzYWdlLmRlc3RpbmF0aW9uKTtcblxuICAgICAgICAgICAgICAgIGlmIChyZWZDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTWVzc2FnZS5kaXJlY3Rpb24gPT09IE1lc3NhZ2VEaXJlY3Rpb24uZG93bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTWVzc2FnZS5tZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQub25NZXNzYWdlUmVjZWl2ZWQodHlwZWRNZXNzYWdlLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWRNZXNzYWdlLm1lc3NhZ2Uucm91dGUgPSB0eXBlZE1lc3NhZ2Uucm91dGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnNlbmQodHlwZWRNZXNzYWdlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5uZXJDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSB0eXBlZE1lc3NhZ2UubWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbm5lckNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJDb21wb25lbnQuc2VuZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBsb2cgP1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAvL2NvbXBvbmVudC5yZWZzLmJvZHkub25NZXNzYWdlUmVjZWl2ZWQobXlvcE1lc3NhZ2UubWVzc2FnZSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IG15b3BNZXNzYWdlLmRlc3RpbmF0aW9uKTtcblxuICAgICAgICAgICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAvL25vIGluIG1lbSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAvL3Bhc3MgdG8gcGFyZW50IEhvc3RTREsgdG8gdHJ5IHByb2Nlc3MgdGhlcmVcbiAgICAgICAgICAgICAgICBpZiAod2luZG93Lm15b3AuSWZyYW1lU0RLKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wLklmcmFtZVNESy5tZXNzYWdlVG9Ib3N0KG15b3BNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5vbk1lc3NhZ2VSZWNlaXZlZChteW9wTWVzc2FnZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vbm90IHByb2Nlc3NlZCBpbiBvbk1lc3NhZ2VSZWNlaXZlZFxuICAgICAgICAgICAgICAgICAgICAvL3Bhc3MgdG8gcGFyZW50IEhvc3RTREsgdG8gdHJ5IHByb2Nlc3MgdGhlcmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5teW9wLklmcmFtZVNESylcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wLklmcmFtZVNESy5tZXNzYWdlVG9Ib3N0KG15b3BNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBldmVudC5zb3VyY2UucG9zdE1lc3NhZ2UoXG4gICAgICAgIC8vICAgICBcImhpIHRoZXJlIHlvdXJzZWxmISAgdGhlIHNlY3JldCByZXNwb25zZSBcIiArIFwiaXM6IHJoZWVlZWV0IVwiLFxuICAgICAgICAvLyAgICAgZXZlbnQub3JpZ2luLFxuICAgICAgICAvLyAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHN5bnRoZXRpY0V2ZW50ID0gbmV3IE1lc3NhZ2VFdmVudDxCYXNlTXlvcE1lc3NhZ2U+KCcnLFxuICAgICAgICAgICAge2RhdGE6IG1lc3NhZ2V9XG4gICAgICAgIClcblxuICAgICAgICB0aGlzLmluY29taW5nTWVzc2FnZUhhbmRsZXIoc3ludGhldGljRXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0ID0gKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzPzogY29tcG9uZW50TG9hZGVyQ3JlYXRvcltdKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYXRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdob3N0U0RLIGFscmVhZHkgaW5pdGlhdGVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXNpY0xvYWRlcnMgPSBbXG4gICAgICAgICAgICBuZXcgTXlvcElmcmFtZUxvYWRlcigpLFxuICAgICAgICAgICAgbmV3IFdlYmNvbXBvbmVudExvYWRlcigpLFxuICAgICAgICAgICAgbmV3IEhUTUxDb21wb25lbnRMb2FkZXIoKVxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMgPSBbXG4gICAgICAgICAgICAuLi5iYXNpY0xvYWRlcnNcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMpIHtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICBjb25zdCBsb2FkZXJCeVR5cGU6IFJlY29yZDxzdHJpbmcsIElNeW9wTG9hZGVyPiA9IHt9O1xuXG4gICAgICAgICAgICBjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycy5mb3JFYWNoKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3IgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUxvYWRlciA9IG5ldyBjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9yKHRoaXMuY29tcG9uZW50c0xvYWRlcnMpO1xuICAgICAgICAgICAgICAgIGxvYWRlckJ5VHlwZVtjdXN0b21Mb2FkZXIudHlwZV0gPSBjdXN0b21Mb2FkZXI7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNMb2FkZXJzLmZvckVhY2gobG9hZGVyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWxvYWRlckJ5VHlwZVtsb2FkZXIudHlwZV0pXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlckJ5VHlwZVtsb2FkZXIudHlwZV0gPSBsb2FkZXI7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNMb2FkZXJzID0gT2JqZWN0LnZhbHVlcyhsb2FkZXJCeVR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5jb21taW5nIG1lc3NhZ2VzIGZyb20gSUZyYW1lc1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgIFwibWVzc2FnZVwiLFxuICAgICAgICAgICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VIYW5kbGVyLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ215b3AgaG9zdFNESyBpbml0aWF0ZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgdGhpcy5pbml0aWF0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yID0gYXN5bmMgKHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZywgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW10gPSBbXSwgaG9va3M/OiBsb2FkZXJIb29rcyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIGFzeW5jRmluZDxUPihcbiAgICAgICAgICAgIGFycmF5OiBUW10sXG4gICAgICAgICAgICBwcmVkaWNhdGU6IChpdGVtOiBUKSA9PiBQcm9taXNlPGJvb2xlYW4+XG4gICAgICAgICk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGFycmF5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGF3YWl0IHByZWRpY2F0ZShpdGVtKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBSZXR1cm4gdW5kZWZpbmVkIGlmIG5vIG1hdGNoIGlzIGZvdW5kXG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHNraW5TZWxlY3Rvci50eXBlKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjYXNlIFwiRGVkaWNhdGVkU2tpblwiIDogLy9iYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICBjYXNlIFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZDoge1xuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZFNraW5JZCA9IChza2luU2VsZWN0b3IgYXMgSURlZGljYXRlZFNraW5Db25maWcpLnNraW4/LmlkXG4gICAgICAgICAgICAgICAgICAgIHx8IChza2luU2VsZWN0b3IgYXMgSURlZGljYXRlZFNraW5Db25maWcpLnNraW5zIVswXS5pZDtcblxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFNraW5JZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2tpblNlbGVjdG9yVHlwZXMuU2VnbWVudGVkOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTa2luU2VsZWN0b3IgPSAoc2tpblNlbGVjdG9yIGFzIElTZWdtZW50ZWRTa2luQ29uZmlnKVxuICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSBhd2FpdCBhc3luY0ZpbmQodHlwZWRTa2luU2VsZWN0b3Iuc2VnbWVudHMsIGFzeW5jIHNlZ21lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudC5zZWdtZW50SWQgPT09ICdEZWZhdWx0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBlcmllbmNlID0gZXhwZXJpZW5jZXMuZmluZChleHBlcmllbmNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHBlcmllbmNlLnR5cGUgPT09IEV4cGVyaWVuY2VUeXBlcy5TZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChleHBlcmllbmNlIGFzIElTZWdtZW50RXhwZXJpZW5jZSkuc2VnbWVudC5pZCA9PT0gc2VnbWVudC5zZWdtZW50SWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFleHBlcmllbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJleHBlcmllbmNlIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkRXhwZXJpZW5jZSA9IGV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFNlZ21lbnQgPSAodHlwZWRFeHBlcmllbmNlLnNlZ21lbnQgYXMgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQpXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudEZ1bmN0aW9uID0gKGhvb2tzID8gaG9va3MgOiB7fSlbdHlwZWRTZWdtZW50LmZ1bmN0aW9uXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnRGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHNlZ21lbnRGdW5jdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYHNlZ21lbnRJZDoke3NlZ21lbnQuc2VnbWVudElkfSwgJHt0eXBlZFNlZ21lbnQuZnVuY3Rpb259IGZ1bmN0aW9uIG5vdCBwcm92aWRlZCAhYClcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChzZWdtZW50KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U2tpbklkQnlTa2luU2VsZWN0b3Ioc2VnbWVudC5za2luU2VsZWN0b3IsIGV4cGVyaWVuY2VzKTtcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJyAvL1RPRE9cbiAgICB9XG5cbiAgICBwcml2YXRlIHJ1blNraW5TZWxlY3RvciA9IGFzeW5jIChjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGhvb2tzPzogbG9hZGVySG9va3MpID0+IHtcbiAgICAgICAgY29uc3Qgc2tpbklkID0gYXdhaXQgdGhpcy5fZ2V0U2tpbklkQnlTa2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnNraW5TZWxlY3RvciwgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnJlc29sdmVkRXhwZXJpZW5jZXMsIGhvb2tzKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudENvbmZpZy50eXBlLnNraW5zLmZpbmQoc2tpbiA9PiBza2luLmlkID09PSBza2luSWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkZXJIb29rcz86IGxvYWRlckhvb2tzO1xuXG4gICAgcHVibGljIGxvYWRDb21wb25lbnQgPSBhc3luYyA8VCBleHRlbmRzIElNeW9wQ29tcG9uZW50ID0gSU15b3BDb21wb25lbnQ+KGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgY29udGFpbmVyPzogSFRNTEVsZW1lbnQgfCBSZWYsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKTpcbiAgICAgICAgUHJvbWlzZTxUPiA9PiB7XG5cbiAgICAgICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBjb250YWluZXIgd2FzIGZvdW5kIGZvciB0aGlzIGNvbXBvbmVudCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3ZlcnJpZGRlbkNvbmZpZyA9IGF3YWl0IGNoZWNrTXlvcE92ZXJyaWRlKGNvbXBvbmVudENvbmZpZyk7XG4gICAgICAgIGlmIChvdmVycmlkZGVuQ29uZmlnKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBsb2dcbiAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZyA9IG92ZXJyaWRkZW5Db25maWc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vIGlmICghY29udGFpbmVyLl9fbm9uUHJveGllZCkge1xuICAgICAgICAvLyAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gKGNvbnRhaW5lciBhcyB1bmtub3duIGFzIE15b3BSZWZDb21wb25lbnQpO1xuICAgICAgICAvLyAgICAgLy9pZiB3ZSBnb3QgbG9hZENvbXBvbmVudCBvdmVyIE15b3BSZWZDb21wb25lbnRcbiAgICAgICAgLy8gICAgIGlmIChyZWZDb21wb25lbnQuaWQgJiYgcmVmQ29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiB0aGlzLmxvYWRDb21wb25lbnQoY29tcG9uZW50Q29uZmlnLCByZWZDb21wb25lbnQucmVmLCBvcHRpb25zKTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICAvLyBsZXQgcm9vdENvbXBvbmVudDogSU15b3BDb21wb25lbnQgPSByZWZDb21wb25lbnQ7XG4gICAgICAgIC8vICAgICAgICAgLy8gd2hpbGUoIXJvb3RDb21wb25lbnQuZWxlbWVudCAmJiByb290Q29tcG9uZW50LnBhcmVudCl7XG4gICAgICAgIC8vICAgICAgICAgLy8gICAgIHJvb3RDb21wb25lbnQgPSByb290Q29tcG9uZW50LnBhcmVudFxuICAgICAgICAvLyAgICAgICAgIC8vIH1cbiAgICAgICAgLy8gICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIC8vIHJvb3RDb21wb25lbnQuZWxlbWVudFxuICAgICAgICAvLyAgICAgICAgIC8vIC8vd2hhdCBub3cgP1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgY29uc3QgaG9va3MgPSB7Li4uKHRoaXMubG9hZGVySG9va3MgPz8ge30pLCAuLi4ob3B0aW9ucz8uaG9va3MgPz8ge30pfTtcblxuICAgICAgICBjb25zdCByZWYgPSBjb250YWluZXIgYXMgUmVmO1xuICAgICAgICBpZiAocmVmLm15b3ApIHtcbiAgICAgICAgICAgIGlmIChyZWYuY29tcG9uZW50KSB7XG5cbiAgICAgICAgICAgICAgICBjb21wb25lbnRDb25maWcgPSB7Li4uY29tcG9uZW50Q29uZmlnfTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2UgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNvbXBvbmVudENvbmZpZy5pbnN0YW5jZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZFNraW4gPSBhd2FpdCB0aGlzLnJ1blNraW5TZWxlY3Rvcihjb21wb25lbnRDb25maWcsIGhvb2tzKSFcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGVkU2tpbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJydW5Ta2luU2VsZWN0b3IgZmFpbGVkIHRvIGNob29zZSBza2luLCBjaGVjayB0aGUgcHJvdmlkZWQgY29uZmlnXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zPy5ob29rcz8uYWZ0ZXJTa2luU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRTa2luID0gYXdhaXQgb3B0aW9ucy5ob29rcy5hZnRlclNraW5TZWxlY3RlZCh7Li4uc2VsZWN0ZWRTa2lufSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICBza2luOiBzZWxlY3RlZFNraW5cbiAgICAgICAgICAgICAgICAgICAgLy8gIHNraW5zOiBbc2VsZWN0ZWRTa2luXVxuICAgICAgICAgICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWdcblxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7Li4ub3B0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMuaG9va3NcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBhd2FpdCBjcmVhdGVSZWZDb21wb25lbnQ8VD4ocmVmLCBjb21wb25lbnRDb25maWcsIHRoaXMuY29tcG9uZW50cywgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBjb25uZWN0IHJlZnMgYW5kIHByb3BzIGluc29kZSBjcmVhdGVSZWZDb21wb25lbnQsIGVsc2V3aGVyZSBpdHMgbm90IHJlYWxseSA8VD5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xvYWQgY29tcG9uZW50IGdvdCBhIGRldGFjaGVkIHJlZi4nKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKlxuICAgICAgICAgKiBjaG9vc2Ugc2tpbiBvbiBydW50aW1lIC4uLlxuICAgICAgICAgKiAgICAgICAgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnNraW5TZWxlY3Rvci50eXBlXG4gICAgICAgICAqL1xuXG4gICAgICAgIGxldCBzZWxlY3RlZFNraW4gPSBhd2FpdCB0aGlzLnJ1blNraW5TZWxlY3Rvcihjb21wb25lbnRDb25maWcsIGhvb2tzKSFcblxuICAgICAgICBpZiAoIXNlbGVjdGVkU2tpbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicnVuU2tpblNlbGVjdG9yIGZhaWxlZCB0byBjaG9vc2Ugc2tpbiwgY2hlY2sgdGhlIHByb3ZpZGVkIGNvbmZpZ1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5ob29rcz8uYWZ0ZXJTa2luU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkU2tpbiA9IGF3YWl0IG9wdGlvbnMuaG9va3MuYWZ0ZXJTa2luU2VsZWN0ZWQoey4uLnNlbGVjdGVkU2tpbn0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudExvYWRlciA9IHRoaXMuY29tcG9uZW50c0xvYWRlcnMuZmluZChsb2FkZXIgPT4gbG9hZGVyLnR5cGUgPT09IHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSk7XG5cbiAgICAgICAgaWYgKCFjb21wb25lbnRMb2FkZXIpIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBsb2FkZXIgXCIke3NlbGVjdGVkU2tpbi5sb2FkZXIudHlwZX1cIiB3YXMgZm91bmQgZm9yIGNvbXBvbmVudGApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9mb3IgbG9hZGVkIHdlYmNvbXBvbmVudCBtb2R1bGVzIHRvIGZvbGxvd2luZyBsaW5lIGNyZWF0ZXMgYSByYWNlIGNvbmRpdGlvbiB3aXRoIHRoZSBpbml0IG1lc3NhZ2UgZmxvd1xuICAgICAgICBsZXQgY29tcG9uZW50ID0gYXdhaXQgY29tcG9uZW50TG9hZGVyLmxvYWQoY29tcG9uZW50Q29uZmlnLnR5cGUsIHNlbGVjdGVkU2tpbiwgY29udGFpbmVyLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBUT0RPIDogd2hlbiB0aGlzIGlzIG5vdCB0cnVlID9cbiAgICAgICAgaWYgKCFjb21wb25lbnQuaXNJbml0aWF0ZWQpXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdC5wdXNoKGNvbXBvbmVudClcblxuICAgICAgICBjb21wb25lbnQuYmluZCgnb25EaXNwb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY29tcG9uZW50IGRpc3Bvc2UnLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzLmZpbHRlcihjID0+IGMgIT09IGNvbXBvbmVudClcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0ID0gdGhpcy5jb21wb25lbnRzMmluaXQuZmlsdGVyKGMgPT4gYyAhPT0gY29tcG9uZW50KVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcblxuICAgICAgICAvLyB0cnVlIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMuY29ubmVjdFByb3BzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgLy9UT0RPIDogbWFrZSB0eXBlIGZpZWxkIGNvbmRpdGlvbmFsIHR5cGUgaW5mZXIgXCJzdHJpbmdcIiA+IHN0cmluZywgXCJudW1iZXJcIiA+IG51bWJlciwgZXRjLi4uXG4gICAgICAgICAgICBjb21wb25lbnQgPSBjb25uZWN0UHJvcHMoY29tcG9uZW50LCBjb21wb25lbnRDb25maWcudHlwZS5wcm9wcywgc2VsZWN0ZWRTa2luKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBtYWtlIG9wdGlvbmFsP1xuICAgICAgICAgICAgLy9UT0RPIDogZml4IGlzc3VlcyB3aXRoIHRpbWVvdXQgYW5kIHdyb25nIHJlZiBuYW1lcyBmcm9tIGNvbmZpZyB2cyBjdXJyZW50IHNraW5cbiAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RSZWZzKGNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLCB0aGlzLmNvbXBvbmVudHMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIFRPT0QgOiB0aHJvdyA/XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcHRpb25zPy5za2lwSW5pdClcbiAgICAgICAgICAgIGF3YWl0IGNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuICAgICAgICByZXR1cm4gY29tcG9uZW50IGFzIFQ7XG4gICAgfVxuXG4gICAgcHVibGljIG5hdmlnYXRlID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50Pihjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBuZXdDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIG9wdGlvbnM/OiBuYXZpZ2F0aW9uT3B0aW9ucykgPT4ge1xuICAgICAgICBpZiAoY29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOYXZpZ2F0aW5nIG9uIHJlbW90ZSByZWYgY29tcG9uZW50cyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbXBvbmVudC5tYXJrZWRGb3JEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gaWYgKG9wdGlvbnM/LmlucGxhY2UpIHtcbiAgICAgICAgLy8gICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAvLyAgICAgICAgIGxldCBuZXdDb21wb25lbnQgPSBhd2FpdCB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAgICAgYXdhaXQgbmV3Q29tcG9uZW50LmluaXRpYXRlZCgpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIGlmIChvcHRpb25zLmluaXQpXG4gICAgICAgIC8vICAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMuaW5pdChuZXdDb21wb25lbnQpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiBuZXdDb21wb25lbnQ7XG4gICAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBFcnJvcignLi4uJylcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5zdGFnZWQpIHtcbiAgICAgICAgICAgIC8vY29uc3Qgc2VsZWN0ZWRTa2luID0gdGhpcy5ydW5Ta2luU2VsZWN0b3IobmV3Q29tcG9uZW50Q29uZmlnKVxuICAgICAgICAgICAgbGV0IG5ld0NvbXBvbmVudCA9IGF3YWl0IHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5jb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICBoaWRkZW46IHRydWUsXG4gICAgICAgICAgICAgICAgcmVsYXRpdmU6IHtkaXJlY3Rpb246ICdhZnRlcicsIGNoaWxkOiBjb21wb25lbnQuZWxlbWVudCF9LFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5pbml0KVxuICAgICAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMuaW5pdChuZXdDb21wb25lbnQpO1xuXG4gICAgICAgICAgICBuZXdDb21wb25lbnQuc2hvdygpO1xuICAgICAgICAgICAgY29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdDb21wb25lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IGNvbXBvbmVudC5lbGVtZW50IS5uZXh0U2libGluZztcblxuICAgICAgICAgICAgY29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuY29udGFpbmVyLCB7XG4gICAgICAgICAgICAgICAgcmVsYXRpdmU6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBcImJlZm9yZVwiLFxuICAgICAgICAgICAgICAgICAgICBjaGlsZDogbmV4dFNpYmxpbmcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgbmF2aWdhdGlvbk9wdGlvbnMgPSB7XG4gICAgc3RhZ2VkPzogYm9vbGVhbixcbiAgICAvL2lucGxhY2U/OiBib29sZWFuLFxuICAgIGluaXQ/OiAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCkgPT4gUHJvbWlzZTx2b2lkPlxuICAgIHNraXBJbml0PzogYm9vbGVhblxufSAmIGxvYWRlck9wdGlvbnNcblxudHlwZSByZWxhdGl2ZUxvYWRDb25maWdEaXJlY3Rpb24gPSAnYmVmb3JlJyB8ICdhZnRlcic7XG5cblxuZXhwb3J0IHR5cGUgbG9hZGVySG9va3MgPSB7XG4gICAgYWZ0ZXJTa2luU2VsZWN0ZWQ/OiAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4gUHJvbWlzZTxJU2tpbkNvbmZpZz5cbn0gJlxuICAgIC8vIHNlZ21lbnRhdGlvbiBob29rc1xuICAgICh7IFtrZXk6IHN0cmluZ106ICgpID0+IFByb21pc2U8Ym9vbGVhbj4gfCBib29sZWFuIH0gfCB7fSlcblxuLy9UT0RPOiBzdXBwb3J0IHNlcmlhbGl6YWJsZSB2ZXJzaW9uIG9mIHRoYXQgb2JqZWN0XG5leHBvcnQgaW50ZXJmYWNlIHJlbGF0aXZlTG9hZENvbmZpZyB7XG4gICAgLy9JZiB0aGlzIGlzIG51bGwsIHRoZW4gbmV3Tm9kZSBpcyBpbnNlcnRlZCBhdCB0aGUgZW5kIG9mIG5vZGUncyBjaGlsZCBub2Rlcy5cbiAgICAvL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ob2RlL2luc2VydEJlZm9yZVxuICAgIGNoaWxkOiBDaGlsZE5vZGUgfCBudWxsXG4gICAgZGlyZWN0aW9uOiByZWxhdGl2ZUxvYWRDb25maWdEaXJlY3Rpb25cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRW52aXJvbm1lbnQge1xuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG50eXBlIEVsZW1lbnRBdHRyaWJ1dGVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBsb2FkZXJPcHRpb25zIHtcbiAgICBpZD86IHN0cmluZ1xuICAgIGhpZGRlbj86IGJvb2xlYW5cbiAgICBjb25uZWN0UHJvcHM/OiBib29sZWFuXG4gICAgdGltZW91dD86IG51bWJlclxuICAgIHNraXBJbml0PzogYm9vbGVhblxuICAgIHJlbGF0aXZlPzogcmVsYXRpdmVMb2FkQ29uZmlnXG4gICAgaG9va3M/OiBsb2FkZXJIb29rc1xuICAgIGVsZW1lbnRBdHRyaWJ1dGVzPzogRWxlbWVudEF0dHJpYnV0ZXNcbiAgICBfZW52aXJvbm1lbnQ/OiBJRW52aXJvbm1lbnRcbiAgICBfaGFzUGFyZW50PzogYm9vbGVhblxuICAgIF9pbnNwZWN0aW9uPzogYm9vbGVhblxuICAgIGRhdGE/OiBhbnlcbn1cblxuaWYgKCF3aW5kb3cubXlvcCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3aW5kb3cubXlvcCA9IHtcbiAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX19cbiAgICB9O1xufVxuXG5pZiAoIXdpbmRvdy5teW9wLmhvc3RTREspIHtcbiAgICBjb25zdCBfaG9zdFNESyA9IG5ldyBIb3N0U0RLKCk7XG4gICAgLy9UT0RPOiBlbmFibGUgbGF6eSBpbml0P1xuICAgIF9ob3N0U0RLLmluaXQoKTtcblxuICAgIGlmICghd2luZG93Lm15b3ApIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3cubXlvcCA9IHtcbiAgICAgICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fXG4gICAgICAgIH07XG4gICAgfVxuICAgIHdpbmRvdy5teW9wLmhvc3RTREsgPSBfaG9zdFNESztcbn1cblxuLy8gQHRzLWlnbm9yZVxuZXhwb3J0IGNvbnN0IGhvc3RTREs6IEhvc3RTREsgPSB3aW5kb3cubXlvcC5ob3N0U0RLO1xuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdob3N0U0RLJywgaG9zdFNESyk7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICAgICAgbXlvcDoge1xuICAgICAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX186IHN0cmluZyxcbiAgICAgICAgICAgIGhvc3RTREs6IEhvc3RTREssXG4gICAgICAgICAgICBJZnJhbWVTREs6IEluc3RhbmNlVHlwZTx0eXBlb2YgSWZyYW1lU0RLPlxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXIsIElFbGVtZW50UmVmLCBNeW9wRWxlbWVudFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSwgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IGNsYXNzIERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8RGV0ZWN0TXlvcFJlZnNNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5EZXRlY3RNeW9wUmVmc01lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChtZXNzYWdlOiBEZXRlY3RNeW9wUmVmc01lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgYWxsTXlvcEl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9XWApO1xuICAgICAgICAvL2NvbnN0IGFsbE15b3BJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYCpgKTtcblxuICAgICAgICBsZXQgbXlvcFJlZnM6IElFbGVtZW50UmVmW10gPSBbXTtcblxuICAgICAgICAvL2xldCBjb3VudGVyczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuXG4gICAgICAgIGFsbE15b3BJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBteW9wSWQgPSBpdGVtLmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG4gICAgICAgICAgICBpZiAobXlvcElkKSB7XG4gICAgICAgICAgICAgICAgbXlvcFJlZnMucHVzaChuZXcgTXlvcEVsZW1lbnRSZWYobXlvcElkLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKVxuICAgICAgICAgICAgfSAvL2Vsc2Uge1xuICAgICAgICAgICAgLy8gICAgIGlmICghY291bnRlcnNbaXRlbS50YWdOYW1lXSkge1xuICAgICAgICAgICAgLy8gICAgICAgICBjb3VudGVyc1tpdGVtLnRhZ05hbWVdID0gMDtcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyAgICAgY291bnRlcnNbaXRlbS50YWdOYW1lXSA9IGNvdW50ZXJzW2l0ZW0udGFnTmFtZV0gKyAxO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vICAgICBteW9wUmVmcy5wdXNoKG5ldyBYUGF0aEVsZW1lbnRSZWYoYCR7aXRlbS50YWdOYW1lfSgke2NvdW50ZXJzW2l0ZW0udGFnTmFtZV19KWAsIGl0ZW0udGFnTmFtZSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkpXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZShtZXNzYWdlLmhhbmRsZXJVbmlxdWVJZCwgbXlvcFJlZnMpKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0JpbmRDbGlja01lc3NhZ2UsIENsaWNrUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEJpbmRPbkNsaWNrSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxCaW5kQ2xpY2tNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5CaW5kQ2xpY2tNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEJpbmRDbGlja01lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBDbGlja1JlcGxheU1lc3NhZ2UoKSwgZXZlbnQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcblxuICAgICAgICAgICAgY29uc3QgY2xlYW5VcFRhc2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaChjbGVhblVwVGFzayk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vY2xlYW4gdXBcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBNeW9wTWVzc2FnZXMgfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtDaGFuZ2VUZXh0TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VUZXh0SGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxDaGFuZ2VUZXh0TWVzc2FnZT4ge1xuICBcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DaGFuZ2VUZXh0TWVzc2FnZTtcbiAgICBcbiAgICBleGVjdXRvciA9IChldmVudDogQ2hhbmdlVGV4dE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaXRlbS50ZXh0Q29udGVudCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlciwgUm9vdFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50c1wiO1xuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8RXhlY3V0ZVNjcmlwdE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5FeGVjdXRlU2NyaXB0TWVzc2FnZVxuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcGxpZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBkYXRhKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcihldmVudCwgcmVwbGllciwgbmV3IFJvb3RSZWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7QWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UsIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8QWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAobWVzc2FnZTogQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UpID0+IHtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYobWVzc2FnZS5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiBhbnlbXSA9IFtdO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAvL1RPRE86IHRoaW5rIGFib3V0IHRoYXQgcmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkLCBtYWtlU2VyaWFsaXphYmxlKGUsIG1lc3NhZ2Uuc2VyaWFsaXphYmxlU2tlbGV0b24pKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKG1lc3NhZ2UudHlwZSwgaGFuZGxlcilcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIobWVzc2FnZS50eXBlLCBoYW5kbGVyKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB7XG4gICAgICAgICAgICAgICAgdGFzaygpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0QXR0cmlidXRlTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBzZXRBdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFNldEF0dHJpYnV0ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldEF0dHJpYnV0ZU1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogU2V0QXR0cmlidXRlTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZShldmVudC5uYW1lLCBldmVudC52YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtIb3N0U0RLfSBmcm9tIFwiLi4vLi4vaG9zdC9ob3N0U0RLXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50c1wiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBjcmVhdGVSZWYgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvL1RPRE8gOiB1c2UgcmVmIGhlbHBlciBoZXJlXG4gICAgICAgICAgICBjb25zdCBhbGxJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7ZXZlbnQucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG4gICAgICAgICAgICBpZiAoYWxsSXRlbXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaG9zdFNESyA9IEhvc3RTREsuSW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBhd2FpdCBob3N0U0RLLmxvYWRDb21wb25lbnQoZXZlbnQubmVzdGVkQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBhbGxJdGVtcy5pdGVtKDApLFxuICAgICAgICAgICAgICAgICAgICBldmVudC5vcHRpb25zKVxuXG4gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCBpdCB0byBwYXNzIHRoZSBhc3NpZ25lZCBpZHNcbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRSZWZDb25maWc6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyZWZDb21wb25lbnQucmVmcykuZm9yRWFjaChyZWZOYW1lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZiA9IHJlZkNvbXBvbmVudC5yZWZzW3JlZk5hbWVdO1xuICAgICAgICAgICAgICAgICAgICByZWYgPSByZWYuX19ub25Qcm94aWVkIHx8IHJlZjtcblxuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkUmVmQ29uZmlnLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiAocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBuZXN0ZWRSZWZDb25maWcpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgLSBET00gZWxlbWVudCBub3QgZm91bmQnKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBbXSwgdHJ1ZSkpO1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRlUmVmKCkudGhlbigpO1xuICAgICAgICAvL3JldHVybmluZyB1bmRlZmluZWQgc28gaXQgd29uJ3QgYWN0IGFzIGEgY2xlYW51cFxuICAgIH1cbn1cbiIsICIvLyBAdHMtbm9jaGVja1xuZXhwb3J0IGNvbnN0IG9ic2VydmVET00gPSAob2JqOiBIVE1MRWxlbWVudCB8IG51bGwsIGNhbGxiYWNrOiAobXV0YXRpb25SZWNvcmRzPzogTXV0YXRpb25SZWNvcmRbXSkgPT4gdm9pZCkgPT4ge1xuICAgIGlmICghb2JqKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCduJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IE11dGF0aW9uT2JzZXJ2ZXIgPSB3aW5kb3cuTXV0YXRpb25PYnNlcnZlciB8fCB3aW5kb3cuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcblxuICAgIGlmICghb2JqIHx8IG9iai5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuO1xuXG4gICAgaWYgKE11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgLy8gZGVmaW5lIGEgbmV3IG9ic2VydmVyXG4gICAgICAgIGNvbnN0IG11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjaylcbiAgICAgICAgLy8gaGF2ZSB0aGUgb2JzZXJ2ZXIgb2JzZXJ2ZSBmb3IgY2hhbmdlcyBpbiBjaGlsZHJlblxuICAgICAgICBjb25zdCBjb25maWcgPSB7YXR0cmlidXRlczogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlfTtcbiAgICAgICAgbXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKG9iaiwgY29uZmlnKVxuICAgICAgICByZXR1cm4gbXV0YXRpb25PYnNlcnZlclxuICAgIH1cblxuICAgIC8vIGJyb3dzZXIgc3VwcG9ydCBmYWxsYmFja1xuICAgIGVsc2UgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlSW5zZXJ0ZWQnLCBjYWxsYmFjaywgZmFsc2UpXG4gICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlUmVtb3ZlZCcsIGNhbGxiYWNrLCBmYWxzZSlcbiAgICB9XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7b2JzZXJ2ZURPTX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9kb21PYnNlcnZlclwiO1xuXG5leHBvcnQgY2xhc3MgU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8RXhlY3V0ZVNjcmlwdE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZVxuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGlmIChldmVudC5zb3VyY2UpIHtcbiAgICAgICAgICAgIG9ic2VydmVET00oZG9jdW1lbnQuYm9keSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UoKVxuICAgICAgICAgICAgICAgICAgICAvLyAgbmV3IEVudmVsb3BlZE1lc3NhZ2UoZXZlbnQuc291cmNlISwgbmV3IE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlKCkpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UsIEZvcm1EYXRhRW50cnksIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIElucHV0RWxlbWVudFZhbHVlLH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmNvbnN0IGdldElucHV0VmFsdWUgPSAoZWxlbWVudCk6IElucHV0RWxlbWVudFZhbHVlID0+IHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGZvcm1cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGRhdGFPYmplY3Q6IElucHV0RWxlbWVudFZhbHVlID0ge1xuICAgICAgICAgICAgZm9ybURhdGE6IHt9LFxuICAgICAgICAgICAgdW5tYXBwZWREYXRhOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE1hbnVhbGx5IGFkZCBlbGVtZW50cyB3aXRob3V0IG5hbWVzXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpO1xuICAgICAgICBsZXQgYXV0b05hbWVJbmRleGVyID0gLTE7XG5cbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBgXyR7KCsrYXV0b05hbWVJbmRleGVyKX1gXG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlRGF0YTogRm9ybURhdGFFbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldElucHV0VmFsdWUoZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBlbGVtZW50LnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eTogbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LnZhbGlkaXR5LCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgbXlvcElkLFxuICAgICAgICAgICAgICAgIH07XG5cblxuICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldIHx8ICFkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldLnZhbHVlIHx8IG5vZGVEYXRhLnZhbHVlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFrZXkpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2goZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGFPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbWVudC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmNoZWNrZWQgPyBlbGVtZW50LnZhbHVlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgaW5wdXQgYW5kIHRleHRhcmVhIGVsZW1lbnRzXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCBlbGVtZW50LnRhZ05hbWUgPT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNlbGVjdCBlbGVtZW50cyAoZHJvcGRvd25zKVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBlZGl0YWJsZSBkaXZzIChjb250ZW50RWRpdGFibGUpXG4gICAgaWYgKGVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuaW5uZXJUZXh0IHx8IGVsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhbiB1bnN1cHBvcnRlZCBlbGVtZW50IHR5cGVcbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8R2V0RWxlbWVudFZhbHVlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuR2V0RWxlbWVudFZhbHVlTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBHZXRFbGVtZW50VmFsdWVNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZShcbiAgICAgICAgICAgICAgICBnZXRJbnB1dFZhbHVlKGl0ZW0pXG4gICAgICAgICAgICApLCBldmVudCk7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7R2V0QXR0cmlidXRlTWVzc2FnZSwgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEZpcnN0RWxlbWVudEJ5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEdldEF0dHJpYnV0ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEF0dHJpYnV0ZU1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogR2V0QXR0cmlidXRlTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gZ2V0Rmlyc3RFbGVtZW50QnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudClcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZShpdGVtLmdldEF0dHJpYnV0ZShldmVudC5uYW1lKSksIGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSwgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlfSBmcm9tICcuLi8uLi9tZXNzYWdlcydcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIFNldFJlc2l6ZU9ic2VydmVySGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgICAgICAgIC8vVE9ETyA6IHBhc3MgdGhlIGhlaWdodFxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZXNpemVPYnNlcnZlck1lc3NhZ2UoKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFNldElubmVySHRtbEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8U2V0SW5uZXJIdG1sPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRJbm5lckh0bWw7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogU2V0SW5uZXJIdG1sKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGl0ZW0uaW5uZXJIVE1MID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBJZnJhbWUgU0RLIGlzIGludGVuZGVkIGZvciBzY2VuYXJpb3Mgd2hlcmUgZGV2ZWxvcGVycyB3aXNoIHRvIGltcGxlbWVudCBNeW9wIGNvbXBvbmVudHMgYXMgc2VwYXJhdGUgd2ViIGFwcGxpY2F0aW9ucyBob3N0ZWQgd2l0aGluIGlmcmFtZXMuPGJyLz48YnIvPlxuICogQnkgaW1wb3J0aW5nIHRoZSBJZnJhbWUgU0RLLCBkZXZlbG9wZXJzIGdhaW4gYWNjZXNzIHRvIHRvb2xzIGFuZCB1dGlsaXRpZXMgbmVjZXNzYXJ5IGZvciBoYW5kbGluZyBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGhvc3QgYXBwbGljYXRpb24gYW5kIHRoZSBlbWJlZGRlZCBpZnJhbWUtYmFzZWQgTXlvcCBjb21wb25lbnRzPGJyLz48YnIvPlxuICogVGhpcyBTREsgZmFjaWxpdGF0ZXMgc2VjdXJlIGlzb2xhdGlvbiwgYWxsb3dpbmcgY29tcG9uZW50cyB0byBmdW5jdGlvbiBpbmRlcGVuZGVudGx5IHdoaWxlIHN0aWxsIGJlbmVmaXRpbmcgZnJvbSB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgYW5kIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzIHByb3ZpZGVkIGJ5IHRoZSBob3N0IGFwcGxpY2F0aW9uLjxici8+PGJyLz5cbiAqXG4gT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuIGBgYGpzXG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gb3JcbiBgYGB0c1xuIGltcG9ydCB7Z2V0SWZyYW1lTW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IGdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiBvclxuIGBgYHRzXG4gaW1wb3J0IHtJZnJhbWVTREt9IGZyb20gJ0BteW9wL3Nkay9pZnJhbWUnO1xuIGBgYFxuICpcbiAqL1xuaW1wb3J0IHtCYXNlTXlvcFNES30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7QmluZE9uQ2xpY2tIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyXCI7XG5pbXBvcnQge0NoYW5nZVRleHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvY2hhbmdlVGV4dEhhbmRsZXJcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlclwiO1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJcIjtcbmltcG9ydCB7c2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXJcIjtcbmltcG9ydCB7XG4gICAgSW5pdFJlcXVlc3QsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXJcIjtcbmltcG9ydCB7R2V0RWxlbWVudFZhbHVlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHNcIjtcbi8vIEB0cy1pZ25vcmUgaGFuZGxlZCBieSBjdXN0b20gZXNidWlsZCBwbHVnaW5cbmltcG9ydCB2ZXJzaW9uIGZyb20gXCJteW9wLXNkay12ZXJzaW9uXCI7XG5pbXBvcnQge0dldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9nZXRBdHRyaWJ1dGVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NldFJlc2l6ZU9ic2VydmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL1NldFJlc2l6ZU9ic2VydmVySGFuZGxlci50c1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWxIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50c1wiO1xuXG4vKipcbiBUaGUgSWZyYW1lIFNESyBpcyBpbnRlbmRlZCBmb3Igc2NlbmFyaW9zIHdoZXJlIGRldmVsb3BlcnMgd2lzaCB0byBpbXBsZW1lbnQgTXlvcCBjb21wb25lbnRzIGFzIHNlcGFyYXRlIHdlYiBhcHBsaWNhdGlvbnMgaG9zdGVkIHdpdGhpbiBpZnJhbWVzLjxici8+PGJyLz5cbiBCeSBpbXBvcnRpbmcgdGhlIElmcmFtZSBTREssIGRldmVsb3BlcnMgZ2FpbiBhY2Nlc3MgdG8gdG9vbHMgYW5kIHV0aWxpdGllcyBuZWNlc3NhcnkgZm9yIGhhbmRsaW5nIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiBhbmQgdGhlIGVtYmVkZGVkIGlmcmFtZS1iYXNlZCBNeW9wIGNvbXBvbmVudHM8YnIvPjxici8+XG4gVGhpcyBTREsgZmFjaWxpdGF0ZXMgc2VjdXJlIGlzb2xhdGlvbiwgYWxsb3dpbmcgY29tcG9uZW50cyB0byBmdW5jdGlvbiBpbmRlcGVuZGVudGx5IHdoaWxlIHN0aWxsIGJlbmVmaXRpbmcgZnJvbSB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgYW5kIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzIHByb3ZpZGVkIGJ5IHRoZSBob3N0IGFwcGxpY2F0aW9uLjxici8+PGJyLz5cblxuIE9uY2UgbG9hZGVkIHRoZSBgUm9vdFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiBgYGBqc1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuIG9yXG4gYGBgdHNcbiBpbXBvcnQge2dldElmcmFtZU1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCBnZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJZnJhbWVTREsgZXh0ZW5kcyBCYXNlTXlvcFNESyB7XG5cbiAgICBwdWJsaWMgdmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB3aW5kb3cubXlvcCA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsgPSB0aGlzO1xuICAgIH1cblxuICAgIG1lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAoIW1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyICYmIHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQpXG4gICAgICAgICAgICBtZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvLmhhbmRsZXJVbmlxdWVJZFxuXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudElkcyA9IE9iamVjdC5rZXlzKHRoaXMuY29tcG9uZW50cyk7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLmRlc3RpbmF0aW9uKSB7XG4gICAgICAgICAgICBpZiAocmVwbGF5VG8/LnJvdXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gdGFraW5nIHRoZSBmaXJzdCBjb21wb25lbnQgdGhhdCBpbml0aWF0ZWQgdGhhdCBjeWNsZVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSByZXBsYXlUby5yb3V0ZVtyZXBsYXlUby5yb3V0ZS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IGNvbXBvbmVudElkc1swXVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbWVzc2FnZS5zb3VyY2UpXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IGNvbXBvbmVudElkc1swXTtcblxuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24udXBcblxuICAgICAgICB3aW5kb3cucGFyZW50Py5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAuLi5tZXNzYWdlXG4gICAgICAgIH0sICcqJyk7XG4gICAgfVxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdID0gW1xuICAgICAgICBuZXcgQ2hhbmdlVGV4dEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IFNldElubmVySHRtbEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEJpbmRPbkNsaWNrSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgRXhlY3V0ZVNjcmlwdEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBzZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBTZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBHZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG5cbiAgICAgICAgLy9jb21wb3NpdGUgc3VwcG9ydCBtZXNzYWdlcyA6XG4gICAgICAgIG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpXG4gICAgXTtcblxuICAgIHB1YmxpYyBpbml0ID0gKCkgPT4ge1xuICAgICAgICB3aW5kb3cub25tZXNzYWdlID0gdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlcy5iaW5kKHRoaXMpXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlcXVlc3QoKSlcbiAgICB9XG5cbn1cblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnSWZyYW1lU0RLJywgSWZyYW1lU0RLKTtcbiIsICJpbXBvcnQgKiBhcyBhbGwgZnJvbSAnLi9pbmRleCdcbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuXG5jb25zdCBNeW9wTWVzc2FnZXMgPSB7XG4gICAgLi4uYWxsXG59XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ015b3BNZXNzYWdlcycsIE15b3BNZXNzYWdlcyk7XG4iLCAiaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0LnRzXCI7XG5pbXBvcnQgKiBhcyBNeW9wSGVscGVycyBmcm9tIFwiLi9pbmRleC50c1wiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9pbmRleC50c1wiO1xuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdNeW9wSGVscGVycycsIE15b3BIZWxwZXJzKTtcbiIsICJpbXBvcnQgJy4vZHluYW1pY0ltcG9ydC9sb2FkX19mZWRlcmF0aW9uX18nO1xuLy8gQHRzLWlnbm9yZSBoYW5kbGVkIGJ5IGN1c3RvbSBlc2J1aWxkIHBsdWdpblxuaW1wb3J0IHZlcnNpb24gZnJvbSBcIm15b3Atc2RrLXZlcnNpb25cIjtcblxuY29uc29sZS5sb2coJ215b3Agcm9vdCBzZGsgLSBsb2FkZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pO1xuXG4vLyBUT0RPIDogcmVhZCB2YWx1ZSBmcm9tIHdpbmRvd1snX19mZWRlcmF0aW9uX18nXSA/XG4vL2NvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vZGZkbGsycDFtMTg3di5jbG91ZGZyb250Lm5ldC9teW9wX3Nkay5taW4uanMnXG5jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2Nkbi5teW9wLmRldi9zZGsvbmV4dC9teW9wX3Nkay5taW4uanMnXG5cbmNvbnN0IGdldEhvc3RNb2R1bGUgPSAoKSA9PiBpbXBvcnQoJy4vaG9zdC9ob3N0U0RLJylcbmNvbnN0IGdldElmcmFtZU1vZHVsZSA9ICgpID0+IGltcG9ydCgnLi9JZnJhbWUvSWZyYW1lU0RLJylcbmNvbnN0IGdldFdlYmNvbXBvbmVudE1vZHVsZSA9ICgpID0+IGltcG9ydCgnLi93ZWJjb21wb25lbnQvV2ViQ29tcG9uZW50U0RLJylcbmNvbnN0IGdldE15b3BNZXNzYWdlcyA9ICgpID0+IGltcG9ydCgnLi9tZXNzYWdlcy9NeW9wTWVzc2FnZXMnKVxuY29uc3QgZ2V0TXlvcEhlbHBlcnMgPSAoKSA9PiBpbXBvcnQoJy4vaGVscGVycy9NeW9wSGVscGVycycpXG5cbmNvbnN0IGV4cG9zZUdsb2JhbGx5ID0gKGltcG9ydEZ1bmN0aW9uOiAoKSA9PiBQcm9taXNlPGFueT4pID0+IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIGFzeW5jICgpID0+IChhd2FpdCBpbXBvcnRGdW5jdGlvbigpKS5nZXQoKVxufVxuXG4vLyBGb3Igc2NyaXB0L2dsb2JhbCB1c2FnZSA6XG5jb25zdCByb290U0RLID0ge1xuICAgIHZlcnNpb24gOiB2ZXJzaW9uLFxuICAgIGdldEhvc3RNb2R1bGU6IGV4cG9zZUdsb2JhbGx5KGdldEhvc3RNb2R1bGUpLFxuICAgIGdldElmcmFtZU1vZHVsZTogZXhwb3NlR2xvYmFsbHkoZ2V0SWZyYW1lTW9kdWxlKSxcbiAgICBnZXRXZWJjb21wb25lbnRNb2R1bGU6IGV4cG9zZUdsb2JhbGx5KGdldFdlYmNvbXBvbmVudE1vZHVsZSksXG4gICAgZ2V0TXlvcE1lc3NhZ2VzOiBleHBvc2VHbG9iYWxseShnZXRNeW9wTWVzc2FnZXMpLFxuICAgIGdldE15b3BIZWxwZXJzOiBleHBvc2VHbG9iYWxseShnZXRNeW9wSGVscGVycylcbn07XG5cbi8vIEB0cy1pZ25vcmVcbmlmICghd2luZG93Lm15b3ApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fXG4gICAgfVxufVxuXG4vLyBAdHMtaWdub3JlXG5pZiAoIXdpbmRvdy5teW9wLnJvb3RTREspIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcm9vdFNESyxcbiAgICAgICAgLi4ud2luZG93Lm15b3BcbiAgICB9O1xufSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhcIm15b3Agcm9vdCBob3N0IGxvYWRlZCBtb3JlIHRoYW4gb25jZS5cIik7XG59XG5cbi8vIEZvciBidW5kbGVycyB1c2FnZSA6XG5jb25zdCBzZGtNb2R1bGUgPSB7XG4gICAgZ2V0SG9zdE1vZHVsZSxcbiAgICBnZXRJZnJhbWVNb2R1bGUsXG4gICAgZ2V0V2ViY29tcG9uZW50TW9kdWxlXG59XG5leHBvcnQgdHlwZSByb290U0RLVHlwZSA9IHR5cGVvZiBzZGtNb2R1bGU7XG5cbmV4cG9ydCB7XG4gICAgZ2V0SG9zdE1vZHVsZSxcbiAgICBnZXRJZnJhbWVNb2R1bGUsXG4gICAgZ2V0V2ViY29tcG9uZW50TW9kdWxlXG59XG5cbi8vIGRlY2xhcmUgZ2xvYmFsIHtcbi8vICAgICBpbnRlcmZhY2UgV2luZG93IHtcbi8vICAgICAgICAgbXlvcDoge1xuLy8gICAgICAgICAgICAgcm9vdFNESzogdHlwZW9mIHJvb3RTREtcbi8vICAgICAgICAgfVxuLy8gICAgIH1cbi8vIH1cbiIsICIvLyBAdHMtbm9jaGVja1xuaW1wb3J0IHttb2R1bGVJbnN0YW5jZUtleSwgb25Mb2FkS2V5fSBmcm9tIFwiLi9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5cbmlmICghd2luZG93WydfX2ZlZGVyYXRpb25fXyddKSB7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3Qgc2NyaXB0U3JjID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdD8uc3JjO1xuICAgIGNvbnN0IF9fcHVibGljX2F1dG9fcGF0aF9fID0gc2NyaXB0U3JjID8gc2NyaXB0U3JjLnNwbGl0KCcvJykuc2xpY2UoMCwgLTEpLmpvaW4oJy8nKSA6ICcnO1xuXG4gICAgd2luZG93WydfX2ZlZGVyYXRpb25fXyddID0ge1xuICAgICAgICBfX3B1YmxpY19hdXRvX3BhdGhfXyxcbiAgICAgICAgX191c2VfcHVibGljX2F1dG9fcGF0aF9fOiB0cnVlLFxuICAgICAgICBfX3B1YmxpY19wYXRoX186IHVuZGVmaW5lZCxcbiAgICAgICAgX19sb2FkaW5nX3RpbWVvdXRfXyA6IDUgKiAxMDAwXG4gICAgfTtcbn0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coJ19fZmVkZXJhdGlvbl9fIGxvYWRlZCBtb3JlIHRoYW4gb25jZS4nKTtcbn1cblxud2luZG93WydfX2ZlZGVyYXRpb25fXyddWydsb2FkX19mZWRlcmF0aW9uX18nXSA9IChzY3JpcHRGaWxlUGF0aCwgbW9kdWxlTmFtZSwgb25Mb2FkKSA9PiB7XG5cbiAgICBpZiAoIXdpbmRvd1snX19mZWRlcmF0aW9uX18nXVttb2R1bGVOYW1lXSkge1xuICAgICAgICBsZXQgc2NyaXB0VGFnO1xuXG4gICAgICAgIHdpbmRvd1snX19mZWRlcmF0aW9uX18nXVttb2R1bGVOYW1lXSA9IHt9O1xuICAgICAgICB3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bbW9kdWxlTmFtZV1bb25Mb2FkS2V5XSA9IChtb2R1bGUpID0+IHtcbiAgICAgICAgICAgIGlmIChzY3JpcHRUYWcpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLnJlbW92ZUNoaWxkKHNjcmlwdFRhZyk7XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgdGhhdDpcbiAgICAgICAgICAgICAgICBzY3JpcHRUYWcgPSBudWxsO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdzY3JpcHQgcmVtb3ZlZC4uLiAnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhtb2R1bGUpO1xuXG4gICAgICAgICAgICB3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bbW9kdWxlTmFtZV1bbW9kdWxlSW5zdGFuY2VLZXldID0gbW9kdWxlO1xuICAgICAgICAgICAgb25Mb2FkKG1vZHVsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzY3JpcHRUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgLy9zY3JpcHRUYWcudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xuICAgICAgICBzY3JpcHRUYWcudHlwZSA9ICdtb2R1bGUnO1xuICAgICAgICBzY3JpcHRUYWcuc3JjID0gc2NyaXB0RmlsZVBhdGg7XG5cbiAgICAgICAgc2NyaXB0VGFnLmFzeW5jID0gdHJ1ZTtcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHRUYWcpO1xuXG4gICAgICAgIC8vIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcbiAgICAgICAgLy8gbGluay50eXBlID0gXCJ0ZXh0L2Nzc1wiO1xuICAgICAgICAvLyBsaW5rLnJlbCA9IFwic3R5bGVzaGVldFwiO1xuICAgICAgICAvLyBsaW5rLmhyZWYgPSBmaWxlTmFtZS5yZXBsYWNlKCcuanMnLCAnLmNzcycpO1xuICAgICAgICAvLyBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coYF9fZmVkZXJhdGlvbl9fIG1vZHVsZSAke21vZHVsZU5hbWV9IGFscmVhZHkgbG9hZGVkLmApXG4gICAgICAgIG9uTG9hZCh3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bbW9kdWxlTmFtZV1bbW9kdWxlSW5zdGFuY2VLZXldKTtcbiAgICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxNQUFhLGdCQUNBLFdBQ0EsbUJBRUE7QUFKYjtBQUFBO0FBQUE7QUFBTyxNQUFNLGlCQUFpQjtBQUN2QixNQUFNLFlBQVk7QUFDbEIsTUFBTSxvQkFBb0I7QUFFMUIsTUFBTSxzQkFBc0IsQ0FBQyxZQUFvQixXQUFnQjtBQUVwRSxZQUFJLE9BQU8sY0FBYyxLQUFLLE9BQU8sY0FBYyxFQUFFLFVBQVUsS0FBSyxPQUFPLGNBQWMsRUFBRSxVQUFVLEVBQUUsU0FBUyxHQUFHO0FBRS9HLGlCQUFPLGNBQWMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQUMsQ0FBQyxVQUFVLEdBQUcsT0FBTSxDQUFDO0FBQUEsUUFDeEUsT0FBTztBQUFBLFFBRVA7QUFBQSxNQUNKO0FBQUE7QUFBQTs7O0FDWkEsTUFBTztBQUFQO0FBQUE7QUFBQSxNQUFPLDJCQUFRO0FBQUE7QUFBQTs7O0FDQWYsTUFJYTtBQUpiO0FBQUE7QUFBQTtBQUlPLE1BQU0sZUFBZTtBQUFBO0FBQUEsUUFFeEIsZUFBZTtBQUFBLFFBQ2YsZ0JBQWdCO0FBQUEsUUFDaEIsZUFB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QUFNO0FBQzVCLE1BQU0sa0JBQWtCLE1BQU07QUFDOUIsTUFBTSx3QkFBd0IsTUFBTTtBQUNwQyxNQUFNLGtCQUFrQixNQUFNO0FBQzlCLE1BQU0saUJBQWlCLE1BQU07QUFFN0IsTUFBTSxpQkFBaUIsQ0FBQyxtQkFBdUM7QUFFM0QsV0FBTyxhQUFhLE1BQU0sZUFBZSxHQUFHLElBQUk7QUFBQSxFQUNwRDtBQUdBLE1BQU0sVUFBVTtBQUFBLElBQ1osU0FBVTtBQUFBLElBQ1YsZUFBZSxlQUFlLGFBQWE7QUFBQSxJQUMzQyxpQkFBaUIsZUFBZSxlQUFlO0FBQUEsSUFDL0MsdUJBQXVCLGVBQWUscUJBQXFCO0FBQUEsSUFDM0QsaUJBQWlCLGVBQWUsZUFBZTtBQUFBLElBQy9DLGdCQUFnQixlQUFlLGNBQWM7QUFBQSxFQUNqRDtBQUdBLE1BQUksQ0FBQyxPQUFPLE1BQU07QUFFZCxXQUFPLE9BQU87QUFBQSxNQUNWLHlCQUFBQTtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBR0EsTUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTO0FBRXRCLFdBQU8sT0FBTztBQUFBO0FBQUEsTUFFVjtBQUFBLE9BQ0csT0FBTztBQUFBLEVBRWxCLE9BQU87QUFDSCxZQUFRLElBQUksdUNBQXVDO0FBQUEsRUFDdkQ7IiwKICAibmFtZXMiOiBbIlJlcGxheU1lc3NhZ2VLZXkiLCAibWF0Y2giLCAic2NyaXB0SW5wdXRzIiwgInNjcmlwdElucHV0cyIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJzZWVuIiwgInRhcmdldCIsICJtYWtlU2VyaWFsaXphYmxlIiwgIl9hIiwgImhlaWdodCIsICJ3aWR0aCIsICJfYSIsICJfYSIsICJfYSIsICJpbml0X2NvbnN0cyIsICJpbml0X2NvbnN0cyIsICJpbml0X2NvbnN0cyIsICJpbml0X2NvbnN0cyIsICJob3N0U0RLIiwgImluaXRfZXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiaW5pdF9jb25zdHMiLCAiZWxlbWVudCIsICJpbml0X2V4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgInNkayIsICJzZWVuIiwgImRvbUlkIiwgImluaXRfaGVscGVycyIsICJpbml0X2hlbHBlcnMiLCAic2tpbiIsICJjb21wb25lbnQiLCAiX2EiLCAic2VnbWVudCIsICJleHBlcmllbmNlIiwgInNlbGVjdGVkU2tpbiIsICJEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIiwgImluaXRfRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJpbml0X2NvbnN0cyIsICJCaW5kT25DbGlja0hhbmRsZXIiLCAiaW5pdF9iaW5kT25DbGlja0hhbmRsZXIiLCAiQ2hhbmdlVGV4dEhhbmRsZXIiLCAiaW5pdF9jaGFuZ2VUZXh0SGFuZGxlciIsICJFeGVjdXRlU2NyaXB0SGFuZGxlciIsICJpbml0X2V4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgIkFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgImluaXRfYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIiLCAic2V0QXR0cmlidXRlSGFuZGxlciIsICJpbml0X3NldEF0dHJpYnV0ZUhhbmRsZXIiLCAiQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciIsICJpbml0X2NvbnN0cyIsICJob3N0U0RLIiwgImdldElucHV0VmFsdWUiLCAiR2V0RWxlbWVudFZhbHVlSGFuZGxlciIsICJpbml0X0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIiLCAiaW5pdF9jb25zdHMiLCAiZWxlbWVudCIsICJTZXRJbm5lckh0bWxIYW5kbGVyIiwgImluaXRfc2V0SW5uZXJIdG1sSGFuZGxlciIsICJpbml0X0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9iaW5kT25DbGlja0hhbmRsZXIiLCAiaW5pdF9jaGFuZ2VUZXh0SGFuZGxlciIsICJpbml0X2V4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgImluaXRfYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIiLCAiaW5pdF9zZXRBdHRyaWJ1dGVIYW5kbGVyIiwgImluaXRfQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9HZXRFbGVtZW50VmFsdWVIYW5kbGVyIiwgImluaXRfc2V0SW5uZXJIdG1sSGFuZGxlciIsICJfYSIsICJDaGFuZ2VUZXh0SGFuZGxlciIsICJTZXRJbm5lckh0bWxIYW5kbGVyIiwgIkJpbmRPbkNsaWNrSGFuZGxlciIsICJEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIiwgIkV4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgIkFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgInNldEF0dHJpYnV0ZUhhbmRsZXIiLCAiR2V0RWxlbWVudFZhbHVlSGFuZGxlciIsICJDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciIsICJNeW9wTWVzc2FnZXMiLCAiaW5pdF9NeW9wTWVzc2FnZXMiLCAiaW5pdF9oZWxwZXJzIiwgIl9fUk9PVF9TREtfUFVCTElDX1VSTF9fIl0KfQo=
|