@myop/sdk 0.4.0-beta.4 → 0.4.0-beta.6

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.
Files changed (48) hide show
  1. package/README.md +13 -0
  2. package/dist/bundled-declarations.d.ts +87 -4
  3. package/dist/cjs/{_IframeSDK.3a412cd4.js → _IframeSDK.49662e01.js} +97 -18
  4. package/dist/cjs/_IframeSDK.49662e01.js.map +7 -0
  5. package/dist/cjs/_IframeSDK.d4a97876.min.js +1 -0
  6. package/dist/cjs/_MyopHelpers.12acc780.min.js +1 -0
  7. package/dist/cjs/{_MyopHelpers.efed13e4.js → _MyopHelpers.2c449e7a.js} +78 -15
  8. package/dist/cjs/_MyopHelpers.2c449e7a.js.map +7 -0
  9. package/dist/cjs/_WebComponentSDK.1addf28b.min.js +1 -0
  10. package/dist/cjs/{_WebComponentSDK.4b6ac803.js → _WebComponentSDK.d5f9105b.js} +97 -18
  11. package/dist/cjs/_WebComponentSDK.d5f9105b.js.map +7 -0
  12. package/dist/cjs/_hostSDK.6dab59cb.min.js +1 -0
  13. package/dist/cjs/{_hostSDK.e9b70e44.js → _hostSDK.8cf37510.js} +97 -18
  14. package/dist/cjs/_hostSDK.8cf37510.js.map +7 -0
  15. package/dist/cjs/myop_sdk.js +14 -14
  16. package/dist/cjs/myop_sdk.js.map +1 -1
  17. package/dist/cjs/myop_sdk.min.js +1 -1
  18. package/dist/cjs-bundled/myop_sdk.bundled.js +107 -21
  19. package/dist/cjs-bundled/myop_sdk.bundled.js.map +3 -3
  20. package/dist/cjs-bundled/myop_sdk.bundled.min.js +1 -1
  21. package/dist/module/Iframe/index.js +98 -19
  22. package/dist/module/Iframe/index.js.map +2 -2
  23. package/dist/module/SDK.js +107 -21
  24. package/dist/module/SDK.js.map +3 -3
  25. package/dist/module/common/index.d.ts +5 -0
  26. package/dist/module/common/index.js +1 -1
  27. package/dist/module/common/index.js.map +2 -2
  28. package/dist/module/embeddedSDK.js +1 -1
  29. package/dist/module/helpers/CloudRepository.d.ts +36 -1
  30. package/dist/module/helpers/cloudRepositoryHelpers.d.ts +42 -2
  31. package/dist/module/helpers/index.js +77 -16
  32. package/dist/module/helpers/index.js.map +2 -2
  33. package/dist/module/host/components/IMyopComponent.d.ts +3 -0
  34. package/dist/module/host/embeddedSDK.js +1 -1
  35. package/dist/module/host/hostSDK.d.ts +1 -1
  36. package/dist/module/host/index.js +98 -19
  37. package/dist/module/host/index.js.map +2 -2
  38. package/dist/module/webcomponent/index.js +98 -19
  39. package/dist/module/webcomponent/index.js.map +2 -2
  40. package/package.json +1 -1
  41. package/dist/cjs/_IframeSDK.3a412cd4.js.map +0 -7
  42. package/dist/cjs/_IframeSDK.9338575d.min.js +0 -1
  43. package/dist/cjs/_MyopHelpers.91004b19.min.js +0 -1
  44. package/dist/cjs/_MyopHelpers.efed13e4.js.map +0 -7
  45. package/dist/cjs/_WebComponentSDK.4b6ac803.js.map +0 -7
  46. package/dist/cjs/_WebComponentSDK.4e78d94a.min.js +0 -1
  47. package/dist/cjs/_hostSDK.34f770f6.min.js +0 -1
  48. package/dist/cjs/_hostSDK.e9b70e44.js.map +0 -7
@@ -1045,6 +1045,10 @@ var BaseMyopComponent = class {
1045
1045
  }
1046
1046
  });
1047
1047
  }
1048
+ get uiTags() {
1049
+ var _a;
1050
+ return ((_a = this.componentDefinition) == null ? void 0 : _a.uiTags) || [];
1051
+ }
1048
1052
  get markedForDisposed() {
1049
1053
  return this._markedForDisposed;
1050
1054
  }
@@ -2180,6 +2184,21 @@ var addQueryParam = (url, param, value) => {
2180
2184
  urlObj.searchParams.append(param, value);
2181
2185
  return urlObj.toString();
2182
2186
  };
2187
+ var showsSamePage = (frame, url) => {
2188
+ const current = frame.getAttribute("src");
2189
+ if (!current || !url) return false;
2190
+ const norm = (u) => {
2191
+ const x = new URL(u, document.baseURI);
2192
+ x.hash = "";
2193
+ if (x.pathname.length > 1) x.pathname = x.pathname.replace(/\/$/, "");
2194
+ return x.href;
2195
+ };
2196
+ try {
2197
+ return norm(current) === norm(url);
2198
+ } catch (e) {
2199
+ return false;
2200
+ }
2201
+ };
2183
2202
  var MyopIframeLoader = class extends BaseMyopLoader {
2184
2203
  constructor() {
2185
2204
  super(...arguments);
@@ -2189,9 +2208,10 @@ var MyopIframeLoader = class extends BaseMyopLoader {
2189
2208
  let IframeElement;
2190
2209
  const typedLoaderConfig = skin.loader;
2191
2210
  if ((container == null ? void 0 : container.nodeName) === "IFRAME") {
2192
- console.log("needs to load into an exsisting Iframe...", typedLoaderConfig.url, container);
2193
2211
  IframeElement = container;
2194
- IframeElement.src = typedLoaderConfig.url;
2212
+ if (!showsSamePage(IframeElement, typedLoaderConfig.url)) {
2213
+ IframeElement.src = typedLoaderConfig.url;
2214
+ }
2195
2215
  } else {
2196
2216
  const uniqId = uuidv4();
2197
2217
  const domId = `myop-comp-${uniqId}`;
@@ -2345,7 +2365,7 @@ var WebcomponentLoader = class extends BaseMyopLoader {
2345
2365
  };
2346
2366
 
2347
2367
  // version:myop-sdk-version
2348
- var myop_sdk_version_default = "0.4.0-beta.4";
2368
+ var myop_sdk_version_default = "0.4.0-beta.6";
2349
2369
 
2350
2370
  // src/helpers/deliveryStore.ts
2351
2371
  var DB_NAME = "myop-delivery";
@@ -2510,7 +2530,10 @@ var convertV2VariantToComponentConfig = (config) => {
2510
2530
  loader: config.consume_variant[0].loader
2511
2531
  }
2512
2532
  ],
2513
- defaultSkin: 0
2533
+ defaultSkin: 0,
2534
+ // Only `ui:` tags ever reach the client; the server filters, absent = none.
2535
+ // @ts-ignore
2536
+ uiTags: Array.isArray(config.uiTags) ? config.uiTags : []
2514
2537
  },
2515
2538
  name: config.name
2516
2539
  };
@@ -2552,7 +2575,7 @@ var _CloudRepository = class _CloudRepository {
2552
2575
  * Opt-in delivery settings, set by myop.delivery(). Off means: this file behaves
2553
2576
  * EXACTLY as it did before — same host, same URL, same everything.
2554
2577
  */
2555
- __publicField(this, "_delivery", { minify: false, host: null, cache: false });
2578
+ __publicField(this, "_delivery", { minify: false, host: null, cache: false, flow: false });
2556
2579
  /**
2557
2580
  * What actually happened, for myop.delivery.stats(). `fellBack` is the number that
2558
2581
  * matters: it is how you find out the lane is unhealthy without waiting for a
@@ -2587,6 +2610,9 @@ var _CloudRepository = class _CloudRepository {
2587
2610
  */
2588
2611
  __publicField(this, "_localServes", /* @__PURE__ */ new Map());
2589
2612
  __publicField(this, "_flushBound", false);
2613
+ // ============ V1 Methods (Legacy) ============
2614
+ /** ids seeded by hydrateV1Component whose first use has not been counted yet */
2615
+ __publicField(this, "_hydratedV1", /* @__PURE__ */ new Set());
2590
2616
  }
2591
2617
  static get Main() {
2592
2618
  const globalMain = getGlobalMain();
@@ -2622,34 +2648,48 @@ var _CloudRepository = class _CloudRepository {
2622
2648
  * Deliberately mutates THIS instance rather than constructing a new repository:
2623
2649
  * CloudRepository.Main is a global singleton shared across bundles (see getGlobalMain),
2624
2650
  * so a second instance would be ignored by every component already using the first.
2651
+ *
2652
+ * @internal
2625
2653
  */
2626
2654
  setDelivery(opts = {}) {
2627
2655
  if (opts.minify !== void 0) this._delivery.minify = !!opts.minify;
2628
2656
  if (opts.host !== void 0) this._delivery.host = opts.host;
2629
2657
  if (opts.cache !== void 0) this._delivery.cache = !!opts.cache;
2658
+ if (opts.flow !== void 0) this._delivery.flow = !!opts.flow;
2630
2659
  }
2660
+ /** @internal */
2631
2661
  deliveryStats() {
2632
2662
  var _a;
2633
2663
  return __spreadProps(__spreadValues({}, this._deliveryStats), {
2634
2664
  host: (_a = this._delivery.host) != null ? _a : _CloudRepository.DEFAULT_HOST,
2635
2665
  minify: this._delivery.minify,
2636
- cache: this._delivery.cache
2666
+ cache: this._delivery.cache,
2667
+ flow: this._delivery.flow
2637
2668
  });
2638
2669
  }
2639
2670
  /**
2640
2671
  * Forget what this browser holds, so the next load asks the server.
2641
2672
  * `refresh()` with no ids drops everything; the counterpart to the window for the case
2642
2673
  * where a change has to be visible on THIS load — right after someone publishes.
2674
+ *
2675
+ * @internal
2643
2676
  */
2644
2677
  refreshDelivery() {
2645
2678
  return __async(this, null, function* () {
2646
2679
  yield deliveryStore.clear();
2647
2680
  });
2648
2681
  }
2649
- noteLocalServe(componentId, env) {
2650
- const cur = this._localServes.get(componentId);
2682
+ /**
2683
+ * `source: 'h'` = the view was served from a config the page's SERVER embedded
2684
+ * (hydrateV1Component), not from this browser's cache window. Reported as a 4th batch
2685
+ * field (`id:env:n:h`) so our usage data can tell server-rendered views apart; a server
2686
+ * that predates it reads the first three fields and counts the view all the same.
2687
+ */
2688
+ noteLocalServe(componentId, env, source) {
2689
+ const key = source ? `${componentId}:${source}` : componentId;
2690
+ const cur = this._localServes.get(key);
2651
2691
  if (cur) cur.count++;
2652
- else this._localServes.set(componentId, { env, count: 1 });
2692
+ else this._localServes.set(key, { id: componentId, env, count: 1, source });
2653
2693
  this.bindFlush();
2654
2694
  }
2655
2695
  /** Report on page-hide, which is the only event that reliably fires on mobile. */
@@ -2669,7 +2709,7 @@ var _CloudRepository = class _CloudRepository {
2669
2709
  */
2670
2710
  flushLocalServes() {
2671
2711
  if (!this._localServes.size) return;
2672
- const batch = [...this._localServes.entries()].map(([id, v]) => `${id}:${v.env}:${v.count}`).join(",");
2712
+ const batch = [...this._localServes.entries()].map(([, v]) => `${v.id}:${v.env}:${v.count}${v.source ? ":" + v.source : ""}`).join(",");
2673
2713
  this._localServes.clear();
2674
2714
  try {
2675
2715
  const url = `${this.deliveryHost()}/clientUsage?b=${encodeURIComponent(batch)}`;
@@ -2720,7 +2760,7 @@ var _CloudRepository = class _CloudRepository {
2720
2760
  /**
2721
2761
  * Enable static mode for self-hosted component registries.
2722
2762
  * In static mode, URLs are constructed as file paths instead of query params:
2723
- * ${baseUrl}/components/${componentId}/${env}.json
2763
+ * `${baseUrl}/components/${componentId}/${env}.json`
2724
2764
  */
2725
2765
  enableStaticMode() {
2726
2766
  this._staticMode = true;
@@ -2933,6 +2973,14 @@ var _CloudRepository = class _CloudRepository {
2933
2973
  const { cacheKey } = this.resolveParams(componentId, env, preview);
2934
2974
  return ((_a = this.variants[cacheKey]) == null ? void 0 : _a.resolved) || null;
2935
2975
  }
2976
+ /**
2977
+ * The `ui:` tags of an already-resolved component (`[]` if it has none or is not
2978
+ * resolved yet). Synchronous, no request: tags arrive with the component itself.
2979
+ */
2980
+ getComponentTags(componentId, env, preview) {
2981
+ var _a, _b;
2982
+ return ((_b = (_a = this.getResolvedConfig(componentId, env, preview)) == null ? void 0 : _a.type) == null ? void 0 : _b.uiTags) || [];
2983
+ }
2936
2984
  /**
2937
2985
  * Resolve which (env, preview) pair — and therefore which cache key — a call
2938
2986
  * for `componentId` refers to.
@@ -2977,7 +3025,27 @@ var _CloudRepository = class _CloudRepository {
2977
3025
  this.variants[cacheKey] = promise;
2978
3026
  this.preloadedComponents[componentId] = { env: resolvedEnv, preview: usePreview };
2979
3027
  }
2980
- // ============ V1 Methods (Legacy) ============
3028
+ /**
3029
+ * Seed a v1 component's config, so `fetchComponentV1(componentId)` answers from memory
3030
+ * with no request. The v1 counterpart of {@link hydrateComponent}.
3031
+ *
3032
+ * `flow` is what `GET /flow?id=<componentId>&auto=true` returns: either the whole body
3033
+ * (`{item: {...}}`) or its `item`. Typical use is a server that fetched it (with
3034
+ * `&prefetch=1`, so the fetch is not counted as a view) and embedded it in the page.
3035
+ *
3036
+ * The view IS counted: the first time the seeded config is used, it is reported through
3037
+ * /clientUsage (flagged `:h`, recorded as deliveryPath 'hydrated'), so hydrating never makes
3038
+ * usage disappear and server-rendered views stay distinguishable.
3039
+ */
3040
+ hydrateV1Component(componentId, flow) {
3041
+ var _a, _b;
3042
+ const item = (_a = flow == null ? void 0 : flow.item) != null ? _a : flow;
3043
+ if (!((_b = item == null ? void 0 : item.components) == null ? void 0 : _b.length)) {
3044
+ throw new Error(`hydrateV1Component(${componentId}): not a /flow?auto=true response`);
3045
+ }
3046
+ this.userFlows[componentId] = Promise.resolve(item);
3047
+ this._hydratedV1.add(componentId);
3048
+ }
2981
3049
  /**
2982
3050
  * Fetch a v1 component from a flow
2983
3051
  */
@@ -2994,13 +3062,15 @@ var _CloudRepository = class _CloudRepository {
2994
3062
  }
2995
3063
  fetchAutoFlow(componentId) {
2996
3064
  return __async(this, null, function* () {
3065
+ if (this._hydratedV1.delete(componentId)) {
3066
+ this.noteLocalServe(componentId, "v1_auto_flow", "h");
3067
+ }
2997
3068
  if (!this.userFlows[componentId]) {
2998
3069
  this.userFlows[componentId] = new Promise(
2999
3070
  (resolve, reject) => __async(this, null, function* () {
3000
3071
  try {
3001
- const res = yield fetch(
3002
- `${this._baseUrl}/flow?id=${componentId}&auto=true`
3003
- );
3072
+ const path = `/flow?id=${componentId}&auto=true`;
3073
+ const res = this._delivery.flow && this._delivery.host ? yield this.deliveryFetch(path) : yield fetch(`${this._baseUrl}${path}`);
3004
3074
  const json = yield res.json();
3005
3075
  resolve(json.item);
3006
3076
  } catch (e) {
@@ -3054,11 +3124,12 @@ var CloudRepository = _CloudRepository;
3054
3124
  var _cloudRepository = CloudRepository.Main;
3055
3125
  var DELIVERY_HOST = "https://delivery.myop.dev";
3056
3126
  var delivery = (opts = {}) => {
3057
- var _a, _b;
3058
- const wantsLane = opts.minify !== false || opts.cache === true;
3127
+ var _a, _b, _c;
3128
+ const wantsLane = opts.minify !== false || opts.cache === true || opts.flow === true;
3059
3129
  _cloudRepository.setDelivery({
3060
3130
  minify: (_a = opts.minify) != null ? _a : false,
3061
3131
  cache: (_b = opts.cache) != null ? _b : false,
3132
+ flow: (_c = opts.flow) != null ? _c : false,
3062
3133
  host: opts.host !== void 0 ? opts.host : wantsLane ? DELIVERY_HOST : null
3063
3134
  });
3064
3135
  return deliveryStats();
@@ -3069,9 +3140,14 @@ var deliveryRefresh = () => __async(void 0, null, function* () {
3069
3140
  });
3070
3141
  var deliveryStats = () => _cloudRepository.deliveryStats();
3071
3142
  var deliveryOff = () => {
3072
- _cloudRepository.setDelivery({ minify: false, cache: false, host: null });
3143
+ _cloudRepository.setDelivery({ minify: false, cache: false, flow: false, host: null });
3073
3144
  return deliveryStats();
3074
3145
  };
3146
+ var hydrateV1Components = (flows) => {
3147
+ for (const [id, flow] of Object.entries(flows)) {
3148
+ _cloudRepository.hydrateV1Component(id, flow);
3149
+ }
3150
+ };
3075
3151
 
3076
3152
  // src/webcomponent/messageHandlers/BaseWebComponentMessageHandler.ts
3077
3153
  var BaseWebComponentMessageHandler = class extends BaseContextMessageHandler {
@@ -4294,6 +4370,9 @@ if (window.myop && !window.myop.delivery) {
4294
4370
  api.refresh = deliveryRefresh;
4295
4371
  window.myop.delivery = api;
4296
4372
  }
4373
+ if (window.myop && !window.myop.hydrateV1) {
4374
+ window.myop.hydrateV1 = hydrateV1Components;
4375
+ }
4297
4376
  var hostSDK = window.myop.hostSDK;
4298
4377
  defineDynamicImport("hostSDK", hostSDK);
4299
4378
 
@@ -4580,4 +4659,4 @@ defineDynamicImport("IframeSDK", IframeSDK);
4580
4659
  export {
4581
4660
  IframeSDK
4582
4661
  };
4583
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL015b3BNZXNzYWdlcy50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9CYXNlTXlvcFNESy50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9jb25zdHMudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvSU15b3BDb21wb25lbnQudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbG9nTWVzc2FnZXMudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wUmVmQ29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9jb21wb25lbnRDb3JlLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0lNeW9wTG9hZGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvaWZyYW1lTG9hZGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvY29uc3RzLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlci50cyIsICJ2ZXJzaW9uOm15b3Atc2RrLXZlcnNpb24iLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvZGVsaXZlcnlTdG9yZS50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9DbG91ZFJlcG9zaXRvcnkudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvY2xvdWRSZXBvc2l0b3J5SGVscGVycy50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvc2hhZG93Um9vdFJlZi50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvV2ViQ29tcG9uZW50U0RLLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlci50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9teW9wT3ZlcnJpZGUudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvaG9zdFNESy50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL3V0aWxzL2RvbU9ic2VydmVyLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL1NldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvZ2V0QXR0cmlidXRlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9TZXRSZXNpemVPYnNlcnZlckhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL0lmcmFtZVNESy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGludGVyZmFjZSBJRWxlbWVudFJlZiB7XG4gICAgbXlvcElkPzogc3RyaW5nXG4gICAgaHRtbFRhZ05hbWU6IHN0cmluZ1xuICAgIEJvdW5kaW5nUmVjdD86IERPTVJlY3RcbiAgICBvZmZzZXRUb3A/OiBudW1iZXJcbiAgICBvZmZzZXRMZWZ0PzogbnVtYmVyXG5cbiAgICB0eXBlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFhQYXRoRWxlbWVudFJlZiBpbXBsZW1lbnRzIElFbGVtZW50UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgeFBhdGg6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgaHRtbFRhZ05hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgQm91bmRpbmdSZWN0PzogRE9NUmVjdCxcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0VG9wPzogbnVtYmVyLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRMZWZ0PzogbnVtYmVyKSB7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IHN0cmluZyA9ICdYUGF0aEVsZW1lbnRSZWYnXG59XG5cbmV4cG9ydCBjbGFzcyBNeW9wRWxlbWVudFJlZiBpbXBsZW1lbnRzIElFbGVtZW50UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbXlvcElkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIGh0bWxUYWdOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIEJvdW5kaW5nUmVjdD86IERPTVJlY3QsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldFRvcD86IG51bWJlcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0TGVmdD86IG51bWJlcikge1xuXG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IHN0cmluZyA9ICdNeW9wRWxlbWVudFJlZidcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyfSBmcm9tIFwiLi9pbmRleC50c1wiO1xuXG5leHBvcnQgdHlwZSBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCA9IENsZWFudXBIYW5kbGVyIHwgUHJvbWlzZTxDbGVhbnVwSGFuZGxlcj4gfCBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcblxuZXhwb3J0IGNvbnN0IHJ1bkV4ZWN1dG9yQ2xlYW51cCA9IGFzeW5jICh0YXNrOiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCkgPT4ge1xuICAgIGlmICh0eXBlb2YgdGFzayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBJdCdzIGEgZnVuY3Rpb24sIGNhbGwgaXRcbiAgICAgICAgdGFzaygpO1xuICAgIH0gZWxzZSBpZiAodGFzayBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgLy8gSXQncyBhIFByb21pc2UsIGF3YWl0IGl0XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhc2s7XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSByZXN1bHQgaXMgYSBmdW5jdGlvbiwgY2FsbCBpdFxuICAgICAgICAgICAgcmVzdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgdGFzayBpcyB2b2lkLCBkbyBub3RoaW5nXG59XG5cbnR5cGUgSU1lc3NhZ2VFeGVjdXRvcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPiA9IChtZXNzYWdlOiBUKSA9PiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cDtcblxuaW50ZXJmYWNlIElNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG5cbiAgICBleGVjdXRvcjogSU1lc3NhZ2VFeGVjdXRvcjxUPjtcblxuICAgIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnk+IGltcGxlbWVudHMgSU1lc3NhZ2VIYW5kbGVyPFQ+IHtcblxuICAgIC8vVE9ETyA6IGFkZCBkaXNwb3NlIG1ldGhvZFxuXG4gICAgY29uc3RydWN0b3IocHVibGljIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkKSB7XG5cbiAgICB9XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbiAgICBhYnN0cmFjdCBleGVjdXRvcjogSU1lc3NhZ2VFeGVjdXRvcjxUPjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VDb250ZXh0TWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSA9IGFueSwgRSA9IGFueT4gZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZCwgcHVibGljIGNvbnRleHQ/OiBFKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2VUb0hvc3QpO1xuICAgIH1cbn1cbiIsICJ0eXBlIFN0cmluZ1dpdGhBdXRvY29tcGxldGU8VD4gPSBUIHwgKHN0cmluZyAmIFJlY29yZDxuZXZlciwgbmV2ZXI+KTtcblxuZXhwb3J0IHR5cGUgTXlvcE1lc3NhZ2VLZXkgPSBTdHJpbmdXaXRoQXV0b2NvbXBsZXRlPGtleW9mIHR5cGVvZiBNeW9wTWVzc2FnZXMgfCBrZXlvZiB0eXBlb2YgTXlvcE1lc3NhZ2VzLkluPjtcblxuZXhwb3J0IGNvbnN0IE15b3BNZXNzYWdlcyA9IHtcbiAgICAvL2hvc3QgdG8gY29tcG9uZW50XG4gICAgJ0luaXRSZXF1ZXN0JzogJ0luaXRSZXF1ZXN0JyxcbiAgICAnSW5pdFJlc3BvbnNlJzogJ0luaXRSZXNwb25zZScsXG4gICAgJ0luaXRNZXNzYWdlJzogJ0luaXRNZXNzYWdlJyxcbiAgICAnRGlzcG9zZU1lc3NhZ2UnOiAnRGlzcG9zZU1lc3NhZ2UnLFxuXG4gICAgJ0NoYW5nZVRleHRNZXNzYWdlJzogJ0NoYW5nZVRleHRNZXNzYWdlJyxcbiAgICAnQmluZENsaWNrTWVzc2FnZSc6ICdCaW5kQ2xpY2tNZXNzYWdlJyxcbiAgICAnRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJzogJ0RldGVjdE15b3BSZWZzTWVzc2FnZScsXG5cbiAgICAnRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnOiAnRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnLFxuXG4gICAgJ0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlJzogJ0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlJyxcbiAgICAnU2V0QXR0cmlidXRlTWVzc2FnZSc6ICdTZXRBdHRyaWJ1dGVNZXNzYWdlJyxcblxuICAgICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJzogJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnLFxuICAgICdFbnZlbG9wZWRNZXNzYWdlJzogJ0VudmVsb3BlZE1lc3NhZ2UnLFxuXG4gICAgJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnOiAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZScsXG4gICAgJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnOiAnR2V0QXR0cmlidXRlTWVzc2FnZScsXG5cbiAgICAnU2V0SW5uZXJIdG1sJzogJ1NldElubmVySHRtbCcsXG5cbiAgICAvL2NvbXBvbmVudCBtZXNzYWdlc1xuICAgICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJzogJ0V4ZWN1dGVDb21wb25lbnRNZXRob2QnLFxuICAgICdTZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc6ICdTZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScsXG4gICAgJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc6ICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnLFxuXG4gICAgJ0NsZWFudXBNZXNzYWdlJzogJ0NsZWFudXBNZXNzYWdlJyxcblxuICAgIC8vIGV4dGVybmFsIHRvIGhvc3QgOlxuICAgIEluOiB7XG4gICAgICAgICdEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSc6ICdEZXRlY3RlZE15b3BSZWZzTWVzc2FnZScsXG4gICAgICAgICdDbGlja1JlcGxheU1lc3NhZ2UnOiAnQ2xpY2tSZXBsYXlNZXNzYWdlJyxcbiAgICAgICAgJ0V4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UnOiAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZScsXG5cbiAgICAgICAgJ0V2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UnOiAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZScsXG4gICAgICAgICdFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlJzogJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnLFxuXG4gICAgICAgIFwiR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZVwiOiBcIkdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2VcIixcbiAgICAgICAgJ1JlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlJzogJ1JlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlJyxcbiAgICAgICAgJ0VudmVsb3BlZE1lc3NhZ2UnOiAnRW52ZWxvcGVkTWVzc2FnZScsXG5cbiAgICAgICAgJ011dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJzogJ011dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJyxcbiAgICAgICAgJ0NsZWFudXBSZXBsYXlNZXNzYWdlJzogJ0NsZWFudXBSZXBsYXlNZXNzYWdlJyxcbiAgICAgICAgJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSc6ICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnXG4gICAgfVxufVxuIiwgImV4cG9ydCAqIGZyb20gJy4vQmFzZU1lc3NhZ2UnO1xuXG4vL3VzZXIncyBtZXNzYWdlc1xuZXhwb3J0ICogZnJvbSAnLi9CaW5kQ2xpY2tNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhbmdlVGV4dE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FeGVjdXRlU2NyaXB0TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0N1c3RvbVJlZk1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BZGRFdmVudExpc3RlbmVyTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL1NldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vU2V0SW5uZXJIdG1sJztcblxuLy9zeXN0ZW0gbWVzc2FnZXNcbmV4cG9ydCAqIGZyb20gJy4vSW5pdE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRW52ZWxvcGVkTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0RldGVjdE15b3BSZWZzTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAgJy4vR2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50TWVzc2FnZXMvRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ2xlYW51cE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9EaXNwb3NlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc7IiwgIi8vVE9ETyA6IHJldXNlIGZyb20gb25lIHBsYWNlLlxuLy8gbmVlZHMgdG8gYmUgdXNlZCBpbiBteW9wLXNkaywgbXlvcC1kYXNoYmFvcmQsIG15b3Atc2VydmVyLCBteW9wLWNsaSAuLlxuXG5leHBvcnQgY29uc3QgdXVpZHY0ID0gKCkgPT4ge1xuICAgIHJldHVybiBcIjEwMDAwMDAwLTEwMDAtNDAwMC04MDAwLTEwMDAwMDAwMDAwMFwiLnJlcGxhY2UoL1swMThdL2csIGMgPT5cbiAgICAgICAgKCtjIF4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxKSlbMF0gJiAxNSA+PiArYyAvIDQpLnRvU3RyaW5nKDE2KVxuICAgICk7XG59XG5cbi8vIENvbnZlcnQgVVVJRCBzdHJpbmcgdG8gYnl0ZXNcbmV4cG9ydCBjb25zdCB1dWlkVG9CeXRlcyA9ICh1dWlkOiBzdHJpbmcpOiBVaW50OEFycmF5ID0+IHtcbiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKFxuICAgICAgICB1dWlkLnJlcGxhY2UoLy0vZywgJycpLm1hdGNoKC8uezEsMn0vZykhLm1hcChieXRlID0+IHBhcnNlSW50KGJ5dGUsIDE2KSlcbiAgICApO1xufTtcblxuLy8gQ29udmVydCBieXRlcyB0byBVVUlEIHN0cmluZ1xuZXhwb3J0IGNvbnN0IGJ5dGVzVG9VdWlkID0gKGJ5dGVzOiBVaW50OEFycmF5KTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBoZXggPSBbLi4uYnl0ZXNdLm1hcChiID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpO1xuICAgIHJldHVybiBbXG4gICAgICAgIGhleC5zbGljZSgwLCA4KSxcbiAgICAgICAgaGV4LnNsaWNlKDgsIDEyKSxcbiAgICAgICAgaGV4LnNsaWNlKDEyLCAxNiksXG4gICAgICAgIGhleC5zbGljZSgxNiwgMjApLFxuICAgICAgICBoZXguc2xpY2UoMjApXG4gICAgXS5qb2luKCctJyk7XG59O1xuXG4vLyBCYXNlNjQgVVJMLXNhZmUgZW5jb2RlXG5leHBvcnQgY29uc3QgYmFzZTY0VXJsRW5jb2RlID0gKGJ5dGVzOiBVaW50OEFycmF5KTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBiYXNlNjQgPSBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uYnl0ZXMpKTtcbiAgICByZXR1cm4gYmFzZTY0LnJlcGxhY2UoL1xcKy9nLCAnLScpLnJlcGxhY2UoL1xcLy9nLCAnXycpLnJlcGxhY2UoLz0rJC8sICcnKTtcbn07XG5cbi8vIEJhc2U2NCBVUkwtc2FmZSBkZWNvZGVcbmV4cG9ydCBjb25zdCBiYXNlNjRVcmxEZWNvZGUgPSAoc3RyOiBzdHJpbmcpOiBVaW50OEFycmF5ID0+IHtcbiAgICBsZXQgYmFzZTY0ID0gc3RyLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJyk7XG4gICAgd2hpbGUgKGJhc2U2NC5sZW5ndGggJSA0KSBiYXNlNjQgKz0gJz0nO1xuICAgIGNvbnN0IGJpbmFyeSA9IGF0b2IoYmFzZTY0KTtcbiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKGJpbmFyeSwgY2hhciA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpO1xufTtcblxuLy8gQ29tcHJlc3MgYW4gYXJyYXkgb2YgVVVJRHMgaW50byBhIHNob3J0IFVSTC1zYWZlIHN0cmluZ1xuZXhwb3J0IGNvbnN0IGNvbXByZXNzVVVJRHMgPSAodXVpZHM6IHN0cmluZ1tdKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBhbGxCeXRlcyA9IHV1aWRzLmZsYXRNYXAodXVpZCA9PiBBcnJheS5mcm9tKHV1aWRUb0J5dGVzKHV1aWQpKSk7XG4gICAgcmV0dXJuIGJhc2U2NFVybEVuY29kZShuZXcgVWludDhBcnJheShhbGxCeXRlcykpO1xufTtcblxuLy8gRGVjb21wcmVzcyBmcm9tIFVSTC1zYWZlIHN0cmluZyBiYWNrIHRvIGFuIGFycmF5IG9mIFVVSURzXG5leHBvcnQgY29uc3QgZGVjb21wcmVzc1VVSURzID0gKGVuY29kZWQ6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgICBjb25zdCBieXRlcyA9IGJhc2U2NFVybERlY29kZShlbmNvZGVkKTtcbiAgICBpZiAoYnl0ZXMubGVuZ3RoICUgMTYgIT09IDApIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBpbnB1dCBsZW5ndGgnKTtcblxuICAgIGNvbnN0IHV1aWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDE2KSB7XG4gICAgICAgIHV1aWRzLnB1c2goYnl0ZXNUb1V1aWQoYnl0ZXMuc2xpY2UoaSwgaSArIDE2KSkpO1xuICAgIH1cbiAgICByZXR1cm4gdXVpZHM7XG59O1xuIiwgImV4cG9ydCAqIGZyb20gJy4vdXVpZC50cydcblxuZXhwb3J0IGNvbnN0IHdhaXQgPSAobXM6IG51bWJlcikgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9ob3N0XCI7XG5pbXBvcnQge0lSZWZDb25maWd9IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VEaXJlY3Rpb24ge1xuICAgIHN0YXRpYyBkb3duID0gJ2Rvd24nIGFzIGNvbnN0XG4gICAgc3RhdGljIHVwID0gJ3VwJyBhcyBjb25zdFxufVxuXG5leHBvcnQgdHlwZSBNZXNzYWdlRGlyZWN0aW9uT3B0aW9uID0gJ3VwJyB8ICdkb3duJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wTWVzc2FnZTxUID0gYW55PiB7XG4gICAgaWQgPSB1dWlkdjQoKVxuXG4gICAgc3RhdGljIGNyZWF0ZTxULCBVIGV4dGVuZHMgbmV3ICguLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VT4pID0+IFQgPSB0eXBlb2YgdGhpcz4oXG4gICAgICAgIHRoaXM6IFUsXG4gICAgICAgIC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxVPlxuICAgICk6IEluc3RhbmNlVHlwZTx0eXBlb2YgdGhpcz4ge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBuZXcgdGhpcyguLi5hcmdzKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnbWVlc2FnZSBpZCBjcmVhdGVkJywgdGhpcy5pZCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZik7XG4gICAgfVxuXG4gICAgbXlvcCA9IHRydWVcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSB8IHN0cmluZztcblxuICAgIGNvbnRlbnQ/OiBUXG5cbiAgICAvLyBUT0RPIDogY2FudCBiZSBvcHRpb25hbCBcbiAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICBkZXN0aW5hdGlvbj86IHN0cmluZ1xuXG4gICAgcm91dGU/OiBzdHJpbmdbXVxuXG4gICAgcmVmPzogUmVmXG5cbiAgICBkaXJlY3Rpb24/OiBNZXNzYWdlRGlyZWN0aW9uT3B0aW9uXG5cbiAgICBjbGVhbmFibGU6IGJvb2xlYW4gPSBmYWxzZVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BFbGVtZW50TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wQmluZE1lc3NhZ2U8VCA9IGFueSwgUiBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuXG4gICAgcHVibGljIGFic3RyYWN0IHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXk7XG5cbiAgICBwdWJsaWMgaGFuZGxlclVuaXF1ZUlkID0gdXVpZHY0KClcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBoYW5kbGVyOiAobWVzc2FnZTogUikgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVmIHtcbiAgICBwdWJsaWMgbXlvcCA9IHRydWU7XG5cbiAgICBwdWJsaWMgX19ub25Qcm94aWVkPzogUmVmO1xuXG4gICAgc3RhdGljIGNyZWF0ZShzZWxlY3Rvcjogc3RyaW5nLCByZWZDb25maWc/OiBJUmVmQ29uZmlnLCBjb21wb25lbnQ/OiBJTXlvcENvbXBvbmVudCkge1xuICAgICAgICBsZXQgX3JlZkNvbmZpZyA9IHJlZkNvbmZpZztcbiAgICAgICAgaWYgKCFfcmVmQ29uZmlnKSB7XG4gICAgICAgICAgICBfcmVmQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGlkOiAnJyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3JUeXBlOiAnaWQtYXR0cmlidXRlJyxcbiAgICAgICAgICAgICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NvZGUnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBhcyBJUmVmQ29uZmlnXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZWYoX3JlZkNvbmZpZywgY29tcG9uZW50KTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmQ29uZmlnOiBJUmVmQ29uZmlnLCBwdWJsaWMgY29tcG9uZW50PzogSU15b3BDb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5fX25vblByb3hpZWQgPSB7XG4gICAgICAgICAgICAuLi50aGlzLFxuICAgICAgICAgICAgY29tcG9uZW50OiBudWxsIC8vIGluIG9yZGVyIHRvIGJlIHNlcmlhbGl6YWJsZVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnQ2xpY2tSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQmluZENsaWNrTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTx2b2lkLCBDbGlja1JlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0JpbmRDbGlja01lc3NhZ2UnO1xuICAgIGNsZWFuYWJsZSA9IHRydWU7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIGhhbmRsZXI6IChtZXNzYWdlOiBDbGlja1JlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2xpY2tSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VUZXh0TWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxzdHJpbmc+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gJ0NoYW5nZVRleHRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY29udGVudCA9IHRleHRcbiAgICB9XG59IiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0V4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UnXG5cbmNvbnN0IGZ1bmN0aW9uQm9keVJlZ2V4ID0gLyg/OmZ1bmN0aW9uXFxzKlxcdypcXHMqXFwoW14pXSpcXClcXHMqXFx7KFtcXHNcXFNdKj8pXFx9fChcXChbXildKlxcKVxccyo9PlxccypcXHsoW1xcc1xcU10qPylcXH0pKVxccyokLztcbmNvbnN0IGV4cHJlc3Npb25Cb2R5UmVnZXggPSAvXFwoXFxzKlteKV0rXFxzKlxcKVxccyo9PlxccyooLispLztcblxuZXhwb3J0IGNvbnN0IHN0cmlwRnVuY3Rpb24gPSAoY29udGVudDogc3RyaW5nKSA9PiB7XG4gICAgbGV0IG1hdGNoID0gY29udGVudC5tYXRjaChmdW5jdGlvbkJvZHlSZWdleCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiBtYXRjaFsxXSB8fCBtYXRjaFszXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgbWF0Y2ggPSBjb250ZW50Lm1hdGNoKGV4cHJlc3Npb25Cb2R5UmVnZXgpO1xuICAgICAgICBpZiAobWF0Y2gpXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV0udHJpbSgpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgc2NyaXB0SW5wdXRzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW5cbn0gfCB7fTtcblxuZXhwb3J0IHR5cGUgc2NyaXB0VmFyczxUPiA9IHtcbiAgICBzZW5kOiAoZGF0YTogVCkgPT4gdm9pZDtcbiAgICAvLyBjb21wbGV0ZVN0cmVhbTogKCkgPT4gdm9pZDtcbiAgICByb290UmVmOiBSb290UmVmO1xuICAgIG1ha2VTZXJpYWxpemFibGU6IHR5cGVvZiBtYWtlU2VyaWFsaXphYmxlXG59XG5cbmV4cG9ydCB0eXBlIGV4dGVuZGVkU2NyaXB0VmFyczxULCBJPiA9IHtcbiAgICBbSyBpbiBrZXlvZiBJXTogSVtLXTtcbn0gJiBzY3JpcHRWYXJzPFQ+XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0TWVzc2FnZTxUID0gYW55LCBJIGV4dGVuZHMgc2NyaXB0SW5wdXRzID0gYW55PiBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTxzdHJpbmcsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4+IHtcblxuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5O1xuICAgIG1lc3NhZ2VUeXBlID0gJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJztcbiAgICBzY3JpcHQ6IHN0cmluZyA9ICcnXG5cbiAgICBzdGF0aWMgcmVwbGllcktleSA9ICdzZW5kJztcbiAgICBzdGF0aWMgY29tcGxldGVTdHJlYW1LZXkgPSAnY29tcGxldGVTdHJlYW0nO1xuXG4gICAgY29uc3RydWN0b3Ioc2NyaXB0OiAodmFyczogZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEk+KSA9PiBULCBoYW5kbGVyOiAobWVzc2FnZTogRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPikgPT4gdm9pZCA9ICgpID0+IHtcbiAgICB9LCBwdWJsaWMgc2NyaXB0SW5wdXRzPzogSSkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICAgICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQudG9TdHJpbmcoKTtcblxuICAgICAgICAvL1RPRE86IGNhbiBiZSByZW1vdmVcbiAgICAgICAgdGhpcy5jb250ZW50ID0gc2NyaXB0LnRvU3RyaW5nKClcbiAgICAgICAgdGhpcy5jb250ZW50ID0gc3RyaXBGdW5jdGlvbih0aGlzLmNvbnRlbnQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8VD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBwdWJsaWMgY29udGVudDogVCkge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge1xuICAgIEV4ZWN1dGVTY3JpcHRNZXNzYWdlLFxuICAgIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UsXG4gICAgZXh0ZW5kZWRTY3JpcHRWYXJzLFxuICAgIHNjcmlwdElucHV0cywgc3RyaXBGdW5jdGlvblxufSBmcm9tIFwiLi9FeGVjdXRlU2NyaXB0TWVzc2FnZS50c1wiO1xuXG5leHBvcnQgdHlwZSBjdXN0b21SZWZTY3JpcHRJbnB1dHMgPSB7XG4gICAgZWxlbWVudElkOiBzdHJpbmcsXG4gICAgcmVmPzogSFRNTEVsZW1lbnQsXG4gICAgX3NjcmlwdD86IHN0cmluZyxcbiAgICBfX3NjcmlwdElucHV0cz86IE9iamVjdFxufTtcblxuZXhwb3J0IGNsYXNzIEN1c3RvbVJlZk1lc3NhZ2U8VCA9IGFueSwgSSBleHRlbmRzIHNjcmlwdElucHV0cyA9IGN1c3RvbVJlZlNjcmlwdElucHV0cz4gZXh0ZW5kcyBFeGVjdXRlU2NyaXB0TWVzc2FnZTxULCBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzPiB7XG5cbiAgICBjb25zdHJ1Y3RvcihzY3JpcHQ6ICh2YXJzOiBleHRlbmRlZFNjcmlwdFZhcnM8VCwgSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cz4pID0+IFQsXG4gICAgICAgICAgICAgICAgcHVibGljIHNjcmlwdElucHV0czogSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cyxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPikgPT4gdm9pZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB9KSB7XG5cbiAgICAgICAgLy9tb2NrIHZhcnNcbiAgICAgICAgLy8gbGV0IHJvb3RSZWYsIGVsZW1lbnRJZCwgX3NjcmlwdCwgX19zY3JpcHRJbnB1dHM7XG4gICAgICAgIHN1cGVyKCh7cm9vdFJlZiwgZWxlbWVudElkLCBfc2NyaXB0LCBfX3NjcmlwdElucHV0c30pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlZnMgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IHJvb3RSZWYuY29udGFpbmVyKS5xdWVyeVNlbGVjdG9yQWxsKGBbJHsnbXlvcC1pZCd9PScke2VsZW1lbnRJZH0nXWApO1xuICAgICAgICAgICAgaWYgKHJlZnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gIGNvbnN0IHJlZiA9IHJlZnNbMF07XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiB0aGluayBhYm91dCBleHBvc2luZyBcInJlZnNcIiBhbmQgbm90IG9ubHkgXCJyZWZcIlxuICAgICAgICAgICAgICAgIC8vZm9yIGNhc2VzIHdoZXJlIHRoZSBSZWYgaGFzIG11bHRpcGxhdGUgaW1wbGVtZW50YXRpb25zXG5cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgX19zY3JpcHRJbnB1dHMucmVmID0gcmVmc1swXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICgke19zY3JpcHR9KSguLi5hcmd1bWVudHMpYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWNGdW5jdGlvbihfX3NjcmlwdElucHV0cyk7XG5cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gRnVuY3Rpb24oJ3JlZicsICdyb290UmVmJywgLi4uT2JqZWN0LmtleXMoX19zY3JpcHRJbnB1dHMpLCBfc2NyaXB0ISkocmVmLCByb290UmVmLCAuLi5PYmplY3QudmFsdWVzKF9fc2NyaXB0SW5wdXRzKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsIGFzIFQ7XG4gICAgICAgIH0sIGhhbmRsZXIpO1xuXG4gICAgICAgIHRoaXMuc2NyaXB0SW5wdXRzID0ge1xuICAgICAgICAgICAgLi4uc2NyaXB0SW5wdXRzLFxuICAgICAgICAgICAgLy9fc2NyaXB0OiBzdHJpcEZ1bmN0aW9uKHNjcmlwdC50b1N0cmluZygpKSxcbiAgICAgICAgICAgIF9zY3JpcHQ6IHNjcmlwdC50b1N0cmluZygpXG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NlcmlhbGl6YWJsZSwgU2VyaWFsaXphYmxlU2tlbGV0b259IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0V2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBBZGRFdmVudExpc3RlbmVyTWVzc2FnZTxUIGV4dGVuZHMga2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCA9IGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXA+IGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlIHtcblxuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5O1xuICAgIG1lc3NhZ2VUeXBlID0gJ0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlJztcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuICAgIHNlcmlhbGl6YWJsZVNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxIVE1MRWxlbWVudEV2ZW50TWFwW1RdPiA9IGZhbHNlIC8vIHt9IC8vIGVtcHR5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHB1YmxpYyB0eXBlOiBULCBwdWJsaWMgaGFuZGxlcjogKG1lc3NhZ2U6IEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcilcbiAgICB9XG5cbiAgICB3aXRoU2VyaWFsaXphYmxlU2tlbGV0b24oc2VyaWFsaXphYmxlU2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPEhUTUxFbGVtZW50RXZlbnRNYXBbVF0+KSB7XG4gICAgICAgIHRoaXMuc2VyaWFsaXphYmxlU2tlbGV0b24gPSBzZXJpYWxpemFibGVTa2VsZXRvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBwdWJsaWMgZTogU2VyaWFsaXphYmxlPEV2ZW50Pikge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSB7XG4gICAgICAgICAgICBlXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIFJlZix9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cblxuZXhwb3J0IGNsYXNzIFNldEF0dHJpYnV0ZU1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyB2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgR2V0RWxlbWVudFZhbHVlTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTx2b2lkLCBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaGFuZGxlcjogKG1lc3NhZ2U6IEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBGb3JtRGF0YUVudHJ5ID0ge1xuICAgIGlkPzogc3RyaW5nLFxuICAgIG5hbWU/OiBzdHJpbmcsXG4gICAgdmFsdWU/OiBJbnB1dEVsZW1lbnRWYWx1ZSxcbiAgICByZXF1aXJlZD86IGJvb2xlYW4sXG4gICAgdmFsaWRpdHk/OiBTZXJpYWxpemFibGU8VmFsaWRpdHlTdGF0ZT4sXG4gICAgbXlvcElkPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIElucHV0RWxlbWVudEZvcm1WYWx1ZSA9IHtcbiAgICBmb3JtRGF0YT86IHsgW2tleTogc3RyaW5nXTogRm9ybURhdGFFbnRyeSB9XG4gICAgdW5tYXBwZWREYXRhPzogRm9ybURhdGFFbnRyeVtdXG59O1xuXG5leHBvcnQgdHlwZSBJbnB1dEVsZW1lbnRWYWx1ZSA9IHN0cmluZyB8IElucHV0RWxlbWVudEZvcm1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWRcblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRlbnQ6IElucHV0RWxlbWVudFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2UudHNcIjtcblxuZXhwb3J0IGNsYXNzIFNldElubmVySHRtbCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxzdHJpbmc+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gJ1NldElubmVySHRtbCc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIGlubmVySHRtbDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY29udGVudCA9IGlubmVySHRtbFxuICAgIH1cbn0iLCAiaW1wb3J0IHsgQmFzZU15b3BNZXNzYWdlIH0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuLy8gc2VudCBieSBob3N0IHRvIGNvbXBvbmVudHMsIGNvbnRhaW5zIHRoaWVyIGlkIFxuZXhwb3J0IGNsYXNzIEluaXRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHsgaWQ6IHN0cmluZyB9PiB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpXG4gICAgICAgIHRoaXMuY29udGVudCA9IHsgaWQgfVxuICAgIH1cblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtc2cubWVzc2FnZVR5cGUgPT09IHRoaXMubWVzc2FnZVR5cGVcbiAgICB9XG59XG5cbi8vIGNvbXBvbmVudCBub3RpZnkgaG9zdCB0aGUgaXQgd2FzIGluaXRhdGVkIFxuZXhwb3J0IGNsYXNzIEluaXRSZXNwb25zZSBleHRlbmRzIEluaXRNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdJbml0UmVzcG9uc2UnO1xufVxuXG4vLyBjb21wb25lbnQgYXNrIHRvIGhvc3QgdG8gZ2V0IGluaXRhdGVkIFxuZXhwb3J0IGNsYXNzIEluaXRSZXF1ZXN0IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdJbml0UmVxdWVzdCc7XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0lDb21wb25lbnRDb25maWcsIElSZWZDb25maWd9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3QvaG9zdFNESy50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ1JlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTx2b2lkLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmQ29uZmlnOiBJUmVmQ29uZmlnLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBuZXN0ZWRDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICAgICAgcHVibGljIG9wdGlvbnM6IGxvYWRlck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKSA9PiB2b2lkLFxuICAgICkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcblxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgTmVzdGVkUmVmID0ge1xuICAgIHJlZk5hbWU6IHN0cmluZyxcbiAgICBjb21wb25lbnREZWZpbml0aW9uSWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBwdWJsaWMgbmVzdGVkUmVmczogTmVzdGVkUmVmW10sIHB1YmxpYyBmYWlsZWQ/OiBib29sZWFuKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgRW52ZWxvcGVkTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRW52ZWxvcGVkTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZGVzdGluYXRpb246IHN0cmluZywgcHVibGljIG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGNvbnN0IGlubmVyRW52ZWxvcGVkTWVzc2FnZSA9IChtZXNzYWdlIGFzIEVudmVsb3BlZE1lc3NhZ2UpO1xuICAgICAgICB0aGlzLnJvdXRlID0gW2Rlc3RpbmF0aW9uLCAuLi5pbm5lckVudmVsb3BlZE1lc3NhZ2Uucm91dGUgPyBpbm5lckVudmVsb3BlZE1lc3NhZ2Uucm91dGUgOiBbXV07XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7SUVsZW1lbnRSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIERldGVjdE15b3BSZWZzTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTxhbnksIERldGVjdGVkTXlvcFJlZnNNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJ1xuICAgIHJlcGx5TWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG59XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxJRWxlbWVudFJlZltdPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIG15b3BFbGVtZW50UmVmczogSUVsZW1lbnRSZWZbXSkge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpXG4gICAgICAgIHRoaXMuY29udGVudCA9IG15b3BFbGVtZW50UmVmcztcbiAgICB9XG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZTxhbnk+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtc2cubWVzc2FnZVR5cGUgPT09IHRoaXMubWVzc2FnZVR5cGVcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgR2V0QXR0cmlidXRlTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTx2b2lkLCBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdHZXRBdHRyaWJ1dGVNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIG5hbWU6IHN0cmluZywgaGFuZGxlcjogKG1lc3NhZ2U6IEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGVudDogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbnR5cGUgTWV0aG9kTmFtZXM8VD4gPSB7XG4gICAgLy8gW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IEsgOiBuZXZlcjtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICgpID0+IHZvaWQgPyBLIDogbmV2ZXI7XG59W2tleW9mIFRdO1xuXG4vLyBEZWZpbmUgYSB0eXBlIHRoYXQgYWxsb3dzIG9ubHkgc3RyaW5ncyBjb3JyZXNwb25kaW5nIHRvIHRoZSBtZXRob2QgbmFtZXMgb2YgVFxudHlwZSBNZXRob2RTdHJpbmc8VD4gPSBNZXRob2ROYW1lczxUPiBleHRlbmRzIGluZmVyIE0gPyBNIGV4dGVuZHMgc3RyaW5nID8gTSA6IG5ldmVyIDogbmV2ZXI7XG5cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0V4ZWN1dGVDb21wb25lbnRNZXRob2QnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIG1ldGhvZDogTWV0aG9kU3RyaW5nPElNeW9wQ29tcG9uZW50Pikge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnO1xufVxuXG5leHBvcnQgY2xhc3MgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ011dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbn0iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBDbGVhbnVwTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTx2b2lkLCBDbGVhbnVwUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnQ2xlYW51cE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNsZWFudXBGb3JNZXNzYWdlSWQ6IHN0cmluZywgaGFuZGxlcjogKG1lc3NhZ2U6IENsZWFudXBSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsZWFudXBSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjdXN0b21DbGVhbnVwOiBib29sZWFuKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgRGlzcG9zZU1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0Rpc3Bvc2VNZXNzYWdlJztcbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIGNsZWFuYWJsZSA9IHRydWU7XG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJztcbn1cblxuZXhwb3J0IGNsYXNzIFJlc2l6ZU9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJztcbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgcnVuRXhlY3V0b3JDbGVhbnVwfSBmcm9tIFwiLi9pbmRleC50c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL2Jhc2VNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsIENsZWFudXBNZXNzYWdlLCBDbGVhbnVwUmVwbGF5TWVzc2FnZSwgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgRW52ZWxvcGVkTWVzc2FnZSxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVzcG9uc2UsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgSG9zdGVkQ29tcG9uZW50PFQgPSBhbnk+IHtcbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgIH1cblxuICAgIC8vb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IElNeW9wTWVzc2FnZSkgPT4gdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBpZDogc3RyaW5nLCBwdWJsaWMgY29udGV4dD86IFQpIHtcblxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcFNESyB7XG4gICAgaW5pdDogKCkgPT4gdm9pZDtcblxuICAgIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkXG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW107XG5cbiAgICBoYW5kbGVJbmNvbWVNZXNzYWdlczogKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4gdm9pZFxuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50Pjtcbn1cblxuLy8gY29uc3QgbG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzID0gW1xuLy8gICAgIE15b3BNZXNzYWdlcy5Jbml0UmVxdWVzdCxcbi8vICAgICBNeW9wTWVzc2FnZXMuSW5pdFJlc3BvbnNlLFxuLy8gICAgIC8vTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UsXG4vLyBdXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcFNESyBpbXBsZW1lbnRzIElNeW9wU0RLIHtcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdO1xuXG4gICAgbWVzc2FnZVRvSGFuZGxlQWZ0ZXJJbml0OiBCYXNlTXlvcE1lc3NhZ2VbXSA9IFtdO1xuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PiA9IHt9O1xuXG4gICAgYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBtZXNzYWdlQ2xlYW51cENhY2hlOiBSZWNvcmQ8c3RyaW5nLCBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+PiB8IFByb21pc2U8dm9pZD4gPSB7fTtcblxuICAgIGhhbmRsZUluY29tZU1lc3NhZ2VzKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gZXZlbnQuZGF0YSA/IGV2ZW50LmRhdGEgOiBldmVudC5kZXRhaWw7XG5cbiAgICAgICAgaWYgKCFldmVudENvbnRlbnQgfHwgIWV2ZW50Q29udGVudC5teW9wKSB7XG4gICAgICAgICAgICAvLyBub3QgbXlvcCBtYXJrZWQgZXZlbnQgXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGV2ZW50Q29udGVudCBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLmRpcmVjdGlvbiAhPT0gTWVzc2FnZURpcmVjdGlvbi5kb3duKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbWVzc2FnZSBkcm9wcGVkIGluIGJhc2VTREssIGRpcmVjdGlvbiB3YXMgJywgZXZlbnQuZGF0YS5kaXJlY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiAobG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzLmluY2x1ZGVzKG1lc3NhZ2UubWVzc2FnZVR5cGUpKSB7XG4gICAgICAgICAgICAvLyAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyAgICAgLy9UT0RPIDogZml4IGRpcmVjdGlvbiA/IG1lc3NhZ2Ugd2lsbCBub3QgcHJvY2Nlc3Mgb3RoZXJ3aXNlXG4gICAgICAgICAgICAvLyAgICAgd2luZG93Lm15b3AuaG9zdFNESy5zZW5kKG1lc3NhZ2UpXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkRpc3Bvc2VNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNob3VsZCBub3QgYmUgb3B0aW9uYWwsIGZpeCBhbmQgcmVtb3ZlICdpZidcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5kZXN0aW5hdGlvbilcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uXVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gV2UgZ290IG91ciBpZCBmcm9tIG91ciBob3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogU0RLIG1heSBzZXJ2ZSBtb3JlIHRoYW4gMSBjb21wb25lbnQgLi4gdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb21wb25lbnRJZCA9IChtZXNzYWdlIGFzIEluaXRNZXNzYWdlKS5jb250ZW50LmlkO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgRXJyb3IoXCJyZWNoaXZlZCBpbml0IG1lc3NhZ2UgZm9yIGFuIGV4c2lzaW5nIGNvbXBvbmVudC5cIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0gPSBuZXcgSG9zdGVkQ29tcG9uZW50KG5ld0NvbXBvbmVudElkKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlc3BvbnNlKG5ld0NvbXBvbmVudElkKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogaXMgaXQgdHJ1ZSB0byBub3QgcGFzcyBmdXJ0aGVyICggdG8gdGhlIGNvbXBvbmVudCApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBmb3Igc2FtZSBIb3N0U0RLIGNhc2VzXG4gICAgICAgICAgICAvLyB3aGVuIGJvdGggUmVmQ29tcG9uZW50IGFuZCByZWFsQ29tcG9uZW50IGhvc3RlZCBpbiB0aGUgc2FtZSBIb3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnZlbG9wZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXJNZXNzYWdlID0gZW52ZWxvcGVkTWVzc2FnZS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBpbm5lck1lc3NhZ2U7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0IHx8IHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uIV0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkNvbXBvbmVudCA9IG15b3AuaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBpbm5lck1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdGluYXRpb25Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQ29tcG9uZW50LnNlbmQoaW5uZXJNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQgPSBteW9wLmhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gZW52ZWxvcGVkTWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQuc2VuZChpbm5lck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2Upe1xuICAgICAgICAgICAgLy8gICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG4gICAgICAgICAgICAvLyAvLyAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNsZWFudXBNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ2xlYW51cE1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbdHlwZWRNZXNzYWdlLmNsZWFudXBGb3JNZXNzYWdlSWRdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXBNZXNzYWdlID0gbmV3IENsZWFudXBSZXBsYXlNZXNzYWdlKCEhY2xlYW51cCk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXBNZXNzYWdlLmRlc3RpbmF0aW9uID0gbWVzc2FnZS5kZXN0aW5hdGlvbjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoISFjbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW3R5cGVkTWVzc2FnZS5jbGVhbnVwRm9yTWVzc2FnZUlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkV4ZWN1dG9yQ2xlYW51cChjbGVhbnVwKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QoY2xlYW51cE1lc3NhZ2UsIHR5cGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogaGFuZGVsIGVycm9yP1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChjbGVhbnVwTWVzc2FnZSwgdHlwZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGFjdGlvbkhhbmRsZXJGb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zdXBwb3J0ZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlci5tZXNzYWdlVHlwZSA9PT0gbWVzc2FnZS5tZXNzYWdlVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uSGFuZGxlckZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSBoYW5kbGVyLmV4ZWN1dG9yKG1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUgJiYgY2xlYW51cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVttZXNzYWdlLmlkXSA9IGNsZWFudXA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhbnVwICYmICFtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2xlYW51cCBoYW5kbGVyIGdlbmVyYXRlZCBmb3Igbm9uLWNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjbGVhbnVwICYmIG1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjbGVhbnVwIGhhbmRsZXIgZ2VuZXJhdGVkIGZvciBhIGNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbkhhbmRsZXJGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBwcmludCB3aXRoIGRlYnVnIGNvbmZpZyBvbmx5XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25vIG1lc3NhZ2UgaGFuZGxlciB3YXMgZm91bmQgZm9yICcsIG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndW5zdXBwb3J0ZWQgbWVzc2FnZSB0eXBlJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFic3RyYWN0IGluaXQ6ICgpID0+IHZvaWQ7XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCAqIGZyb20gJy4vTXlvcEVsZW1lbnRSZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9iYXNlTWVzc2FnZUhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9CYXNlTXlvcFNESyc7XG5cbmV4cG9ydCB0eXBlIENsZWFudXBIYW5kbGVyID0gKCkgPT4gdm9pZFxuXG5leHBvcnQgdHlwZSBEaWN0aW9uYXJ5PFQ+ID0geyBba2V5OiBzdHJpbmddOiBUOyB9O1xuXG4vL2V4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0gJ0lmcmFtZUxvYWRlcicgfCAnV2ViQ29tcG9uZW50TG9hZGVyJyB8ICdIVE1MTG9hZGVyJyB8IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IFNraW5Mb2FkZXJzID0ge1xuICAgIFwiSWZyYW1lTG9hZGVyXCI6IFwiSWZyYW1lTG9hZGVyXCIsXG4gICAgXCJXZWJDb21wb25lbnRMb2FkZXJcIjogXCJXZWJDb21wb25lbnRMb2FkZXJcIixcbiAgICBcIkhUTUxMb2FkZXJcIjogXCJIVE1MTG9hZGVyXCIsXG4gICAgXCJNaW5pbWl6ZWRMb2FkZXJcIjogXCJNaW5pbWl6ZWRMb2FkZXJcIlxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0ga2V5b2YgdHlwZW9mIFNraW5Mb2FkZXJzO1xuXG5leHBvcnQgdHlwZSBQcm9wVHlwZSA9ICdhbnknIHwgJ3N0cmluZycgfCAnbnVtYmVyJyB8IHN0cmluZzsgLy8gVE9ETyA6IDxcbmV4cG9ydCB0eXBlIFJlZlNlbGVjdG9yVHlwZSA9ICdpZC1hdHRyaWJ1dGUnIHwgJ2Nzcy1zZWxlY3RvcicgfCAneHBhdGgnIHwgc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgTG9hZGVyRnJhbWV3b3JrcyA9IHtcbiAgICBcInJlYWN0XCI6IFwicmVhY3RcIixcbiAgICBcInZ1ZVwiOiBcInZ1ZVwiLFxuICAgIFwiYW5ndWxhclwiOiBcImFuZ3VsYXJcIixcbn0gYXMgY29uc3RcbmV4cG9ydCB0eXBlIExvYWRlckZyYW1ld29ya1R5cGUgPSBrZXlvZiB0eXBlb2YgTG9hZGVyRnJhbWV3b3JrcztcblxuZXhwb3J0IGludGVyZmFjZSBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiV2ViQ29tcG9uZW50TG9hZGVyXCI7XG4gICAgdXJsOiBzdHJpbmcsXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgZnJhbWV3b3JrPzogTG9hZGVyRnJhbWV3b3JrVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElJZnJhbWVMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJJZnJhbWVMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZ1xuICAgIGF1dG9IZWlnaHQ6IGJvb2xlYW5cbiAgICBoZWlnaHQ/OiBzdHJpbmdcbiAgICB3aWR0aD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgU2hhZG93Um9vdE1vZGVUeXBlID0ge1xuICAgIFwib3BlblwiOiBcIm9wZW5cIixcbiAgICBcImNsb3NlZFwiOiBcImNsb3NlZFwiLFxuICAgIFwibm9uZVwiOiBcIm5vbmVcIixcbiAgICBcImxvY2FsRnJhbWVcIjogXCJsb2NhbEZyYW1lXCJcbn0gYXMgY29uc3Q7XG5cblxuZXhwb3J0IGludGVyZmFjZSBJSFRNTExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIkhUTUxMb2FkZXJcIjtcbiAgICBIVE1MOiBzdHJpbmc7XG4gICAgLy9UT0RPOiByZW5hbWUocm9vdE1vZGUvY3VzdG9tRWxlbWVudE1vZGUpICsgZGIgbWlncmF0aW9uXG4gICAgc2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlO1xuICAgIGF1dG9IZWlnaHQ/OiBib29sZWFuO1xuICAgIGhlaWdodD86IHN0cmluZztcbiAgICB3aWR0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIGFuIGlubGluZS1IVE1MIChsb2NhbEZyYW1lKSBjb21wb25lbnQgaXMgcmVuZGVyZWQgaW4gYSBzYW5kYm94ZWQsXG4gICAgICogY3Jvc3Mtb3JpZ2luIGlmcmFtZSB3aXRoIE5PIGFjY2VzcyB0byB0aGUgaG9zdCBkb2N1bWVudCAodW50cnVzdGVkIGNvZGUpLlxuICAgICAqIFRoZSBob3N0IHJlbmRlciBwb2xpY3kgY2FuIGFsc28gZm9yY2UgdGhpcyByZWdhcmRsZXNzIG9mIHRoZSBjb25maWcgdmFsdWUuXG4gICAgICovXG4gICAgaXNvbGF0aW9uPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBIb3cgYSBjb21wb25lbnQgaXMgcmVuZGVyZWQgb24gdGhlIGhvc3QgcGFnZSwgaW4gYXNjZW5kaW5nIGlzb2xhdGlvbjpcbiAqICAtICd3ZWJDb21wb25lbnQnICAgXHUyMDE0IGN1c3RvbSBlbGVtZW50IG9uIHRoZSBob3N0IGRvY3VtZW50IChtb3N0IHByaXZpbGVnZWQpXG4gKiAgLSAnaWZyYW1lJyAgICAgICAgIFx1MjAxNCBzYW1lLW9yaWdpbiBpbmxpbmUtSFRNTCBpZnJhbWUgKHRvZGF5J3MgZGVmYXVsdClcbiAqICAtICdpc29sYXRlZElmcmFtZScgXHUyMDE0IHNhbmRib3hlZCwgY3Jvc3Mtb3JpZ2luIGlmcmFtZSAodW50cnVzdGVkIGNvZGUpXG4gKi9cbmV4cG9ydCB0eXBlIFJlbmRlck1vZGUgPSAnd2ViQ29tcG9uZW50JyB8ICdpZnJhbWUnIHwgJ2lzb2xhdGVkSWZyYW1lJztcblxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJQb2xpY3lDb250ZXh0IHtcbiAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZztcbiAgICBza2luOiBJU2tpbkNvbmZpZztcbiAgICAvKiogV2hhdCB0aGUgY29tcG9uZW50IGFza2VkIGZvciAobWFya2VyIFx1MjFEMiAnd2ViQ29tcG9uZW50JywgY29uZmlnLmlzb2xhdGlvbiBcdTIxRDIgJ2lzb2xhdGVkSWZyYW1lJykuICovXG4gICAgcmVxdWVzdGVkTW9kZTogUmVuZGVyTW9kZTtcbiAgICAvKiogV2hldGhlciB0aGUgSFRNTCBjYXJyaWVzIHRoZSBgPCEtLSBteW9wLXdlYi1jb21wb25lbnQgLS0+YCBtYXJrZXIuICovXG4gICAgaXNXZWJDb21wb25lbnQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogSG9zdC1zdXBwbGllZCBnYXRlIGRlY2lkaW5nIGhvdyAob3Igd2hldGhlcikgYSBjb21wb25lbnQgcmVuZGVycy4gUmV0dXJuIGFcbiAqIFJlbmRlck1vZGUgdG8gdXNlLCBvciBgZmFsc2VgIHRvIGJsb2NrIHJlbmRlcmluZyBlbnRpcmVseS5cbiAqL1xuZXhwb3J0IHR5cGUgUmVuZGVyUG9saWN5ID1cbiAgICAoY3R4OiBSZW5kZXJQb2xpY3lDb250ZXh0KSA9PiBSZW5kZXJNb2RlIHwgZmFsc2UgfCBQcm9taXNlPFJlbmRlck1vZGUgfCBmYWxzZT47XG5cbi8vZm9yIGludGVybmFsIGRhc2hib2FyZCB1c2FnZVxuZXhwb3J0IGludGVyZmFjZSBJTWluaW1pemVkTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiTWluaW1pemVkTG9hZGVyXCI7XG59XG5cbmludGVyZmFjZSBEYXNoYm9hcmRPYmplY3Qge1xuICAgIF90ZW1wX2NsaWVudF9pZD86IHN0cmluZyxcbn1cblxudHlwZSBFeHRlbmQ8VCwgVT4gPSBUICYgVTtcblxudHlwZSBFeHRlbmRSZWN1cnNpdmVseTxULCBFPiA9IHtcbiAgICBbSyBpbiBrZXlvZiBFXTogRVtLXTtcbn0gJiB7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBvYmplY3RcbiAgICAgICAgPyBFeHRlbmRSZWN1cnNpdmVseTxUW0tdLCBFPlxuICAgICAgICA6IFRbS107XG59O1xuXG5leHBvcnQgdHlwZSBJRGFzaGJvYXJkPFQ+ID0gRXh0ZW5kUmVjdXJzaXZlbHk8VCwgRGFzaGJvYXJkT2JqZWN0PjtcblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogU2tpbkxvYWRlclR5cGVcblxuICAgIFtrZXk6IHN0cmluZ106IGFueTsgLy8gQWxsb3dzIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JUmVsZWFzZU1ldGFkYXRhIHtcbiAgICBlbnZpcm9ubWVudElkOiBzdHJpbmc7XG4gICAgZW52aXJvbm1lbnRJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgcmVsZWFzZWRPbj86IHN0cmluZztcbiAgICByZWxlYXNlZEJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lWYXJpYW50Q29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgcmVsZWFzZXM/OiB2Ml9JUmVsZWFzZU1ldGFkYXRhW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBsb2FkZXI6IElTa2luTG9hZGVyQ29uZmlnXG4gICAgY3JlYXRlZEJ5Pzogc3RyaW5nXG4gICAgY3JlYXRlZE9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVNraW5Db25maWcgZXh0ZW5kcyBJU2tpbkNvbmZpZyB7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCaW5kTWVzc2FnZVByb3BDb25maWcgZXh0ZW5kcyBJUHJvcENvbmZpZyB7XG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbn1cblxuZXhwb3J0IGNvbnN0IFByb3BNZXNzYWdlTW9kZXMgPSB7XG4gICAgXCJpbnB1dFwiOiBcImlucHV0XCIsXG4gICAgXCJvdXRwdXRcIjogXCJvdXRwdXRcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFByb3BDb25maWdCZWhhdmlvclR5cGVzID0ge1xuICAgIFwibWVzc2FnZVwiOiBcIm1lc3NhZ2VcIixcbiAgICBcImNvZGVcIjogXCJjb2RlXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbSB7XG4gICAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29kZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJjb2RlXCJcbiAgICByZW1hcD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wTWVzc2FnZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJtZXNzYWdlXCJcbiAgICBtZXNzYWdlOiBNeW9wTWVzc2FnZUtleVxuICAgIHJlZjogc3RyaW5nLCAvL1RPRE8gbWFrZSBpdCBpZFxuICAgIHBhcmFtczogSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbVtdXG4gICAgbW9kZToga2V5b2YgdHlwZW9mIFByb3BNZXNzYWdlTW9kZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcENvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIGJlaGF2aW9yOiBJUHJvcEJlaGF2aW9yXG59XG5cblxuZXhwb3J0IGNsYXNzIFJlZkJlaGF2aW9yVHlwZSB7XG4gICAgc3RhdGljIGNvZGUgPSAnY29kZScgYXMgY29uc3RcbiAgICBzdGF0aWMgY29tcG9uZW50ID0gJ2NvbXBvbmVudCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgSVJlZkJlaGF2aW9yVHlwZSA9ICdjb2RlJyB8ICdjb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogSVJlZkJlaGF2aW9yVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvbXBvbmVudCdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIFByb3BlcnR5IGluc3RhbmNlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICovXG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb2RlUmVmQmVoYXZpb3IgZXh0ZW5kcyBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6ICdjb2RlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgc2VsZWN0b3JUeXBlOiBSZWZTZWxlY3RvclR5cGVcbiAgICBzZWxlY3Rvcjogc3RyaW5nXG4gICAgYmVoYXZpb3I6IElSZWZCZWhhdmlvclxufVxuXG4vKipcbiAqIEV4cGVyaWVuY2Ugc2VnbWVudCBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VTZWdtZW50UnVsZSB7XG4gICAgcHJvcGVydHk6IHN0cmluZztcbiAgICBvcGVyYXRvcjogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBBL0Igc3BsaXQgdmVyc2lvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlQUJTcGxpdFZlcnNpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgcGVyY2VudGFnZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4cGVyaWVuY2UgQS9CIHNwbGl0IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZUFCU3BsaXQge1xuICAgIHZlcnNpb25zOiBJRXhwZXJpZW5jZUFCU3BsaXRWZXJzaW9uW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBzZWdtZW50IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZVNlZ21lbnQge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcnVsZXM6IElFeHBlcmllbmNlU2VnbWVudFJ1bGVbXTtcbiAgICB1c2VBYjogYm9vbGVhbjtcbiAgICBjb21wb25lbnRWYXJpYW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gICAgYWJTcGxpdD86IElFeHBlcmllbmNlQUJTcGxpdDtcbiAgICBzdGlja3lQcm9wZXJ0aWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBkZWZpbml0aW9uIGNvbmZpZyAodjIpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VEZWZpbml0aW9uQ29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIC8qKiBTZWxlY3RlZCBjb21wb25lbnQgSURzICovXG4gICAgY29tcG9uZW50czogc3RyaW5nW107XG4gICAgLyoqIFNlZ21lbnQgY29uZmlndXJhdGlvbnMgKi9cbiAgICBzZWdtZW50czogSUV4cGVyaWVuY2VTZWdtZW50W107XG4gICAgLyoqIEZhbGxiYWNrIHZhcmlhbnQgcGVyIGNvbXBvbmVudCAqL1xuICAgIGZhbGxiYWNrOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIC8qKiBUYWdzICovXG4gICAgdGFnczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgLy8gcHJvcHM6IFJlY29yZDxzdHJpbmcsIElQcm9wQ29uZmlnPiAvL2lkIC0gdHlwZVxuICAgIC8vIHJlZnM6IFJlY29yZDxzdHJpbmcsIElSZWZDb25maWc+LFxuICAgIC8vIHNraW5zOiBSZWNvcmQ8c3RyaW5nLCBJU2tpbkNvbmZpZz5cbiAgICBwcm9wczogSVByb3BDb25maWdbXSxcbiAgICByZWZzOiBJUmVmQ29uZmlnW10sXG4gICAgc2tpbnM6IElTa2luQ29uZmlnW10sXG4gICAgZGVmYXVsdFNraW46IG51bWJlcjtcblxuICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IHRoYXRcbiAgICAvL3Jlc29sdmVkRGVmaW5pdGlvbnM/OiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1tdXG4gICAgLy9UT0RPIDogbW92ZSB0byBiYXNlIGNsYXNzICggSVN0b3JhYmxlSXRlbSBvciBzby4uLilcblxuICAgIGNyZWF0ZWRPbj86IHN0cmluZ1xuICAgIGNyZWF0ZWRCeT86IHN0cmluZ1xuICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lNeW9wU3RvcmVkT2JqZWN0IGV4dGVuZHMgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICB1cGRhdGVkT24/OiBzdHJpbmdcbiAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRBY2Nlc3Mge1xuICAgIHZpc2liaWxpdHk6ICdwcml2YXRlJyB8ICd1bmxpc3RlZCcgfCAncHVibGljJztcbiAgICB1bmxpc3RlZD86IHtcbiAgICAgICAgc2x1Zzogc3RyaW5nO1xuICAgIH07XG4gICAgbWFya2V0cGxhY2U/OiB7XG4gICAgICAgIHN0YXR1czogJ2RyYWZ0JyB8ICdzdWJtaXR0ZWQnIHwgJ2NsYWltZWQnIHwgJ2Nsb3NlZCc7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIGNvbnRhY3RFbWFpbDogc3RyaW5nO1xuICAgICAgICBkZWFkbGluZTogc3RyaW5nO1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSUNvbXBvbmVudERlZmluaXRpb25Db25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgdmFyaWFudHNfaWRzOiBzdHJpbmdbXSxcbiAgICBEVE9zOiB2Ml9JRFRPW10sXG4gICAgdGFnczogc3RyaW5nW10sXG4gICAgYWNjZXNzPzogQ29tcG9uZW50QWNjZXNzLFxuXG4gICAgLy9cbiAgICB2YXJpYW50c19uYW1lczogc3RyaW5nW10sXG4gICAgdmFyaWFudHNfZGF0YToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGlkOiBzdHJpbmdcbiAgICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgICAgICAgdXBkYXRlZE9uPzogc3RyaW5nXG4gICAgICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xuICAgICAgICBoYXNfcmVsZWFzZXM/OiBib29sZWFuXG4gICAgfVtdLFxuXG4gICAgcHJldmlld192YXJpYW50OiB2Ml9JVmFyaWFudENvbmZpZztcbiAgICBleHRyYT86IHtcbiAgICAgICAgZmlyc3RWYXJpYW50OiB2Ml9JVmFyaWFudENvbmZpZzsgLy93aGVuIG5ldyBjb21wb25lbnQgY3JlYXRlcyBhdCB0aGUgY2xpZW50XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lEVE8gZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgZGF0YTogb2JqZWN0XG4gICAgbWV0aG9kTmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5JbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcyxcbiAgICAvL3NraW5zOiBJU2tpbkluc3RhbmNlQ29uZmlnW11cbn1cblxuZXhwb3J0IGNvbnN0IFNlZ21lbnRUeXBlID0ge1xuICAgIFwiRnVuY3Rpb25SZXN1bHRcIjogXCJGdW5jdGlvblJlc3VsdFwiLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEluc3RhbmNlIHtcbiAgICBzZWdtZW50SWQ6IHN0cmluZztcbiAgICBza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFNlZ21lbnRUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQgZXh0ZW5kcyBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTogdHlwZW9mIFNlZ21lbnRUeXBlLkZ1bmN0aW9uUmVzdWx0XG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGZ1bmN0aW9uOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IFNraW5TZWxlY3RvclR5cGVzID0ge1xuICAgIFwiU2VnbWVudGVkXCI6IFwiU2VnbWVudGVkXCIsXG4gICAgXCJEZWRpY2F0ZWRcIjogXCJEZWRpY2F0ZWRcIixcblxuICAgIC8qKlxuICAgICAqIFRoaXMgU2VsZWN0b3IgVHlwZSBpcyBub3QgeWV0IHN1cHBvcnRlZCBidXQgd2lsbCBiZSBhZGRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICAgICAqIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgXCJEZWZhdWx0XCI6IFwiRGVmYXVsdFwiXG59IGFzIGNvbnN0O1xuXG5cbi8qKlxuICogVGhpcyBTa2luIENvbmZpZyBUeXBlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ1dCB3aWxsIGJlIGFkZGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gKiBQbGVhc2UgY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHVwZGF0ZXMuXG4gKlxuICogQHR5cGUge0lEZWZhdWx0U2tpbkNvbmZpZ31cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRGVmYXVsdFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuRGVmYXVsdCxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudGVkU2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQsXG4gICAgc2VnbWVudHM6IElTZWdtZW50SW5zdGFuY2VbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEZWRpY2F0ZWRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2tpbn0gaW5zdGVhZC5cbiAgICAgKiBQcm9wZXJ0eSBza2lucyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLlxuICAgICAqIFBsZWFzZSB1cGRhdGUgeW91ciBjb2RlIHRvIHVzZSB7QGxpbmsgc2tpbn0gZm9yIGJldHRlciBjb21wYXRpYmlsaXR5LlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBza2lucz86IElTa2luSW5zdGFuY2VDb25maWdbXSAvLyBkZXByZWNhdGVkXG4gICAgc2tpbjogSVNraW5JbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgLy9UT0RPIDpcbiAgICAvLyBSZWZJRCA/IHRvIHN1cHBvcnQgbW9yZSB0aGFuIDEgY29tcG9uZW50IGZyb20gdGhlIHNhbWUgdHlwZSBpbiBjb21wb3NpdGVzID9cblxuICAgIC8vVE9ETyA6IHJlbW92ZVxuICAgIGNvbXBvbmVudE5hbWU6IHN0cmluZzsgLy8gPDwgY2hlY2tcblxuICAgIHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZ1xuXG4gICAgLy8gc3RvcmluZyB0aGUgbmVzdGVkIGNvbmZpZyBmb3IgcmVmIGNvbXBvbmVudHNcbiAgICBuZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnW11cblxuICAgIC8vb25seSBvbiBHRVQ/XG4gICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgdGhhdFxuICAgIHJlc29sdmVkRXhwZXJpZW5jZXM/OiBJRXhwZXJpZW5jZVtdXG4gICAgLy8gd2lsbCBpbmNsdWRlIGluc3RhbmNlIGFuZCBkZWYgY29uZmlnIGluIG9yZGVyIHRvIHJlbmRlciBpbiBwcm9kdWN0aW9uXG4gICAgcmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudENvbmZpZ1tdXG59XG5cbmV4cG9ydCBjb25zdCBFeHBlcmllbmNlVHlwZXMgPSB7XG4gICAgXCJTZWdtZW50XCI6IFwiU2VnbWVudFwiLFxuICAgIFwiUHJvbW9cIjogXCJQcm9tb1wiLFxuICAgIFwiQUJcIjogXCJBQlwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBFeHBlcmllbmNlVHlwZXNcbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIC8vc3RpY2tpbmVzc0ZhY3RvclxuICAgIC8vRW5kRGF0ZVxufVxuXG4vLyBleHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2VHcm91cCB7XG4vLyAgICAgaWQ6IHN0cmluZ1xuLy8gICAgIG5hbWU6IHN0cmluZ1xuLy8gICAgIHBlcmNlbnRhZ2U6IG51bWJlclxuLy8gfVxuXG5leHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZTogdHlwZW9mIEV4cGVyaWVuY2VUeXBlcy5BQlxuICAgIC8vIGdyb3VwczogSUFCRXhwZXJpZW5jZUdyb3VwW11cbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIHBlcmNlbnRhZ2U6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEYXRlUmFuZ2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBzdGFydDogRGF0ZVxuICAgIGVuZDogRGF0ZVxuICAgIHRpbWV6b25lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIEV4cGVyaWVuY2VUeXBlc1xuICAgIHNlZ21lbnQ6IElTZWdtZW50RGVmaW5pdGlvblxuICAgIGRhdGVSYW5nZT86IElEYXRlUmFuZ2Vcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3dEZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGNvbXBvbmVudHM6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1tdO1xuICAgIG9yaWdpbnM6IHN0cmluZ1tdLFxuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgYnJhbmNoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudENvbmZpZyB7XG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xuICAgIHR5cGU6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICAvLyBUT0RPIDogdmVyaWZ5IHVuaXF1ZW5lc3MgKGRhc2hib2FyZCAmIHNlcnZlcilcbiAgICBuYW1lOiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIElCcmFuY2hhYmxlIHtcbiAgICBicmFuY2g/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3cgZXh0ZW5kcyBPbWl0PElVc2VyRmxvd0RlZmluaXRpb24sICdjb21wb25lbnRzJz4sIElCcmFuY2hhYmxlIHtcbiAgICBjb21wb25lbnRzOiBJQ29tcG9uZW50Q29uZmlnW11cbn1cblxuZXhwb3J0IGNsYXNzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdD86IFNoYWRvd1Jvb3QpIHtcblxuICAgIH1cblxuICAgIGdldFJvb3REaXYgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKS5xdWVyeVNlbGVjdG9yKCdkaXYnKVxuICAgIH1cblxuICAgIGdldFJvb3QgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IG15b3BBdHRyaWJ1dGVzID0ge1xuICAgIGlkOiAnbXlvcC1pZCdcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyLCBJRWxlbWVudFJlZiwgTXlvcEVsZW1lbnRSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UsIERldGVjdE15b3BSZWZzTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRGV0ZWN0TXlvcFJlZnNNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAobWVzc2FnZTogRGV0ZWN0TXlvcFJlZnNNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfV1gKTtcbiAgICAgICAgLy9jb25zdCBhbGxNeW9wSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAqYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBJRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgLy9sZXQgY291bnRlcnM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcblxuICAgICAgICBhbGxNeW9wSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgaWYgKG15b3BJZCkge1xuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSlcbiAgICAgICAgICAgIH0gLy9lbHNlIHtcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWNvdW50ZXJzW2l0ZW0udGFnTmFtZV0pIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgY291bnRlcnNbaXRlbS50YWdOYW1lXSA9IDA7XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIGNvdW50ZXJzW2l0ZW0udGFnTmFtZV0gPSBjb3VudGVyc1tpdGVtLnRhZ05hbWVdICsgMTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgICAgbXlvcFJlZnMucHVzaChuZXcgWFBhdGhFbGVtZW50UmVmKGAke2l0ZW0udGFnTmFtZX0oJHtjb3VudGVyc1tpdGVtLnRhZ05hbWVdfSlgLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UobWVzc2FnZS5oYW5kbGVyVW5pcXVlSWQsIG15b3BSZWZzKSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0cy50c1wiO1xuaW1wb3J0IHtSZWZ9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudHNCeVJlZiA9IChyZWY6IFJlZiwgZWw6IFBhcmVudE5vZGUpID0+IHtcbiAgICByZXR1cm4gZWwucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke3JlZi5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEZpcnN0RWxlbWVudEJ5UmVmID0gKHJlZjogUmVmLCBlbDogUGFyZW50Tm9kZSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZ2V0RWxlbWVudHNCeVJlZihyZWYsIGVsKTtcbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50cy5pdGVtKDApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtCaW5kQ2xpY2tNZXNzYWdlLCBDbGlja1JlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBCaW5kQ2xpY2tNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKCksIGV2ZW50KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsZWFuVXBUYXNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goY2xlYW5VcFRhc2spO1xuICAgICAgICB9KTtcblxuICAgICAgICAvL2NsZWFuIHVwXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgTXlvcE1lc3NhZ2VzIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8Q2hhbmdlVGV4dE1lc3NhZ2U+IHtcbiAgXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ2hhbmdlVGV4dE1lc3NhZ2U7XG4gICAgXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IENoYW5nZVRleHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGl0ZW0udGV4dENvbnRlbnQgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJleHBvcnQgdHlwZSBTZXJpYWxpemFibGU8VD4gPVxuICAgIFQgZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogLy8gRXhjbHVkZSBmdW5jdGlvbnNcbiAgICAgICAgVCBleHRlbmRzIEFycmF5PGluZmVyIFU+ID8gU2VyaWFsaXphYmxlPFU+W10gOiAvLyBIYW5kbGUgYXJyYXlzXG4gICAgICAgICAgICBUIGV4dGVuZHMgb2JqZWN0ID8ge1xuICAgICAgICAgICAgICAgIFtLIGluIGtleW9mIFQgYXMgVFtLXSBleHRlbmRzIEZ1bmN0aW9uID8gbmV2ZXIgOiBLXTogU2VyaWFsaXphYmxlPFRbS10+XG4gICAgICAgICAgICB9IDogVDsgLy8gSGFuZGxlIG9iamVjdHNcblxuY29uc3QgaXNQcmltaXRpdmUgPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdmFsdWUgIT09IE9iamVjdCh2YWx1ZSk7XG59XG5cbmNvbnN0IGlzRnVuY3Rpb24gPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgY29uc3QgY29udGFpbnNQcmltaXRpdmVzT25seSA9IChvYmopID0+IHtcbiAgICBpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihvYmopKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNoZWNrIGlmIGl0J3MgYSBuZXN0ZWQgb2JqZWN0XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5zUHJpbWl0aXZlc09ubHkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgICAgICAgICAgY29udGludWU7IC8vIEl0J3MgYSBwcmltaXRpdmUsIHNvIHdlIGNhbiBza2lwIGl0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEZvdW5kIGEgbm9uLXByaW1pdGl2ZSB2YWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7IC8vIEFsbCB2YWx1ZXMgYXJlIHByaW1pdGl2ZXMgb3IgbmVzdGVkIG9iamVjdHMgd2l0aCBwcmltaXRpdmVzXG59XG5cbi8vIGN1cnJlbnRseSBzdXBwb3J0IHJvb3QgbGV2ZWwgb25seVxuLy8ge3g6IDEsIHkgOiAnYScsIHogOiAoKT0+ey4uLn0sIGlubmVyIDogeyB4OiAxICwgeSA6ICdhJ30gfVxuLy8ge3g6IDEsIHkgOiAnYSd9XG4vL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvR2xvc3NhcnkvRmFsc3lcbmV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZVNrZWxldG9uPFQ+ID0gUGFydGlhbDxSZWNvcmQ8a2V5b2YgVCwgYm9vbGVhbiB8IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+Pj4gfCBib29sZWFuO1xuXG5leHBvcnQgY29uc3QgbWFrZVNlcmlhbGl6YWJsZSA9IDxUPihcbiAgICBvYmo6IFQsXG4gICAgc2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPFQ+ID0ge30sXG4gICAgaW5jbHVkZUZhbHN5S2V5czogYm9vbGVhbiA9IHRydWUsIC8vIFRPRE8gOiB1c2UgdGhhdCBhcmdcbiAgICBzZWVuOiBXZWFrTWFwPG9iamVjdCwgU2VyaWFsaXphYmxlPGFueT4+ID0gbmV3IFdlYWtNYXAoKVxuKTogU2VyaWFsaXphYmxlPFQ+ID0+IHtcblxuICAgIGlmIChpc1ByaW1pdGl2ZShvYmopKSB7XG4gICAgICAgIHJldHVybiBvYmogYXMgU2VyaWFsaXphYmxlPFQ+OyAvLyBEaXJlY3RseSByZXR1cm4gcHJpbWl0aXZlIHZhbHVlc1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWVuLmdldChvYmopITsgLy8gUmV0dXJuIHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBhcnJheSBzZXJpYWxpemF0aW9uXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YWJsZUFycmF5OiBTZXJpYWxpemFibGU8YW55PltdID0gW107XG4gICAgICAgIHNlZW4uc2V0KG9iaiwgc2VyaWFsaXphYmxlQXJyYXkpOyAvLyBTdG9yZSB0aGUgYXJyYXkgaW4gc2VlblxuXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBvYmoubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gb2JqW2luZGV4XTtcbiAgICAgICAgICAgIHNlcmlhbGl6YWJsZUFycmF5W2luZGV4XSA9IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudCwgc2tlbGV0b24sIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemFibGVBcnJheSBhcyBTZXJpYWxpemFibGU8VD47XG4gICAgfVxuXG4gICAgaWYgKG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBDaGVjayBmb3IgY3ljbGljIHJlZmVyZW5jZXNcbiAgICAgICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWVuLmdldChvYmopITsgLy8gUmV0dXJuIHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXJpYWxpemFibGVPYmplY3Q6IFBhcnRpYWw8U2VyaWFsaXphYmxlPFQ+PiA9IHt9O1xuICAgICAgICBzZWVuLnNldChvYmosIHNlcmlhbGl6YWJsZU9iamVjdCk7IC8vIFN0b3JlIHRoZSBvYmplY3QgaW4gc2VlblxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGtleSBpcyBpbiB0aGUgc2tlbGV0b24gYW5kIGlmIGl0J3MgYSB2YWxpZCBrZXkgdG8gc2VyaWFsaXplXG5cbiAgICAgICAgICAgIGNvbnN0IGtleUluU2tlbGV0b24gPSB0eXBlb2Ygc2tlbGV0b24gPT0gXCJib29sZWFuXCIgPyBza2VsZXRvbiA6IHNrZWxldG9uW2tleV07XG5cbiAgICAgICAgICAgIGlmIChrZXlJblNrZWxldG9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleUluU2tlbGV0b24gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNrZWxldG9uIGluZGljYXRlcyB0byBzZXJpYWxpemUgdGhpcyBrZXlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVGYWxzeUtleXMgPyBvYmpba2V5XSAhPT0gdW5kZWZpbmVkIDogb2JqW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YWJsZU9iamVjdFtrZXldID0gbWFrZVNlcmlhbGl6YWJsZShvYmpba2V5XSwgdHJ1ZSwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBrZXlJblNrZWxldG9uID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2tlbGV0b24gaW5kaWNhdGVzIG5lc3RlZCBrZXlzIHRvIHNlcmlhbGl6ZVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YWJsZU9iamVjdFtrZXldID0gbWFrZVNlcmlhbGl6YWJsZShvYmpba2V5XSwga2V5SW5Ta2VsZXRvbiwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemFibGVPYmplY3QgYXMgU2VyaWFsaXphYmxlPFQ+O1xuICAgIH1cblxuICAgIHJldHVybiB7fSBhcyBhbnk7IC8vIFJldHVybiBhbiBlbXB0eSBvYmplY3QgZm9yIG90aGVyIGNhc2VzXG59XG4iLCAiaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCByZXBsaWVyOiAoZGF0YTogYW55KSA9PiB2b2lkLCByb290UmVmOiBSb290UmVmKSA9PiB7XG4gICAgY29uc3QgX19zY3JpcHRJbnB1dHMgPSBldmVudC5zY3JpcHRJbnB1dHMgPyBldmVudC5zY3JpcHRJbnB1dHMgOiB7fVxuICAgIF9fc2NyaXB0SW5wdXRzLm1ha2VTZXJpYWxpemFibGUgPSBtYWtlU2VyaWFsaXphYmxlO1xuXG4gICAgX19zY3JpcHRJbnB1dHMuc2VuZCA9IHJlcGxpZXI7XG4gICAgX19zY3JpcHRJbnB1dHMucm9vdFJlZiA9IHJvb3RSZWY7XG4gICAgX19zY3JpcHRJbnB1dHMuX19zY3JpcHRJbnB1dHMgPSBfX3NjcmlwdElucHV0cztcblxuICAgIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICgke2V2ZW50LnNjcmlwdH0pKC4uLmFyZ3VtZW50cylgKTtcbiAgICBjb25zdCByZXQgPSBkeW5hbWljRnVuY3Rpb24oX19zY3JpcHRJbnB1dHMpO1xuXG4gICAgLy8gY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gRnVuY3Rpb24oJ3NlbmQnLCAncm9vdFJlZicsJ19fc2NyaXB0SW5wdXRzJywgLi4uT2JqZWN0LmtleXMoX19zY3JpcHRJbnB1dHMpLCBldmVudC5jb250ZW50ID8gZXZlbnQuY29udGVudCA6ICcnKVxuICAgIC8vY29uc3QgcmV0ID0gZHluYW1pY0Z1bmN0aW9uKHJlcGxpZXIsIHJvb3RSZWYsIF9fc2NyaXB0SW5wdXRzLCAuLi5PYmplY3QudmFsdWVzKF9fc2NyaXB0SW5wdXRzKSk7XG4gICAgcmVwbGllcihyZXQpO1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlciwgUm9vdFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50c1wiO1xuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8RXhlY3V0ZVNjcmlwdE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5FeGVjdXRlU2NyaXB0TWVzc2FnZVxuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcGxpZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBkYXRhKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcihldmVudCwgcmVwbGllciwgbmV3IFJvb3RSZWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSk7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBfX2ZlZGVyYXRpb25fXyA9IFwiX19mZWRlcmF0aW9uX19cIlxuZXhwb3J0IGNvbnN0IG9uTG9hZEtleSA9IFwib25Mb2FkXCJcbmV4cG9ydCBjb25zdCBtb2R1bGVJbnN0YW5jZUtleSA9IFwibW9kdWxlSW5zdGFuY2VcIlxuXG5leHBvcnQgY29uc3QgZGVmaW5lRHluYW1pY0ltcG9ydCA9IChnbG9iYWxOYW1lOiBzdHJpbmcsIG1vZHVsZTogYW55KSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh3aW5kb3dbX19mZWRlcmF0aW9uX19dICYmIHdpbmRvd1tfX2ZlZGVyYXRpb25fX11bZ2xvYmFsTmFtZV0gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKHtbZ2xvYmFsTmFtZV06IG1vZHVsZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnX19mZWRlcmF0aW9uX18gbG9hZGVyIG5vdCBkZWZpbmVkIGZvciBtb2R1bGUnLCBtb2R1bGUpO1xuICAgIH1cbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtBZGRFdmVudExpc3RlbmVyTWVzc2FnZSwgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBBZGRFdmVudExpc3RlbmVySGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxBZGRFdmVudExpc3RlbmVyTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChtZXNzYWdlOiBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihtZXNzYWdlLnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6IGFueVtdID0gW107XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgdGhhdCByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UobWVzc2FnZS5oYW5kbGVyVW5pcXVlSWQsIG1ha2VTZXJpYWxpemFibGUoZSwgbWVzc2FnZS5zZXJpYWxpemFibGVTa2VsZXRvbikpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIobWVzc2FnZS50eXBlLCBoYW5kbGVyKVxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihtZXNzYWdlLnR5cGUsIGhhbmRsZXIpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHtcbiAgICAgICAgICAgICAgICB0YXNrKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRBdHRyaWJ1dGVNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIHNldEF0dHJpYnV0ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8U2V0QXR0cmlidXRlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0QXR0cmlidXRlTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBTZXRBdHRyaWJ1dGVNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKGV2ZW50Lm5hbWUsIGV2ZW50LnZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5LCBNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBEaXNwb3NlTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCwgTWVzc2FnZURpcmVjdGlvbixcbiAgICBDbGVhbnVwTWVzc2FnZSwgQ2xlYW51cFJlcGxheU1lc3NhZ2UsXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7SG9zdFNESywgbG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuLyoqXG4gKiBSZXN1bHQgcmV0dXJuZWQgYnkgb2JzZXJ2ZUF1dG9TaXplIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b1NpemVSZXN1bHQge1xuICAgIC8qKiBDdXJyZW50IHdpZHRoIChmcm9tIGNvbnRlbnQpICovXG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICAvKiogQ3VycmVudCBoZWlnaHQgKGZyb20gY29udGVudCkgKi9cbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICAvKiogV2hldGhlciB3aWR0aCBpcyBiZWluZyBhdXRvLXNpemVkICovXG4gICAgYXV0b1NpemluZ1dpZHRoOiBib29sZWFuO1xuICAgIC8qKiBXaGV0aGVyIGhlaWdodCBpcyBiZWluZyBhdXRvLXNpemVkICovXG4gICAgYXV0b1NpemluZ0hlaWdodDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBvYnNlcnZlQXV0b1NpemUgbWV0aG9kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b1NpemVPcHRpb25zIHtcbiAgICAvKiogQ2FsbGJhY2sgY2FsbGVkIHdpdGggc2l6ZSBpbmZvIHdoZW5ldmVyIHNpemUgY2hhbmdlcyAqL1xuICAgIG9uU2l6ZUNoYW5nZT86IChyZXN1bHQ6IEF1dG9TaXplUmVzdWx0KSA9PiB2b2lkO1xuICAgIC8qKiBNaW5pbXVtIHdpZHRoIGNvbnN0cmFpbnQgKi9cbiAgICBtaW5XaWR0aD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWF4aW11bSB3aWR0aCBjb25zdHJhaW50ICovXG4gICAgbWF4V2lkdGg/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIE1pbmltdW0gaGVpZ2h0IGNvbnN0cmFpbnQgKi9cbiAgICBtaW5IZWlnaHQ/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIE1heGltdW0gaGVpZ2h0IGNvbnN0cmFpbnQgKi9cbiAgICBtYXhIZWlnaHQ/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIEV4cGxpY2l0IHdpZHRoIHNldCBieSBob3N0IC0gaWYgZGVmaW5lZCwgZG9uJ3QgYXV0by1zaXplIHdpZHRoICovXG4gICAgZXhwbGljaXRXaWR0aD86IHN0cmluZyB8IG51bWJlcjtcbiAgICAvKiogRXhwbGljaXQgaGVpZ2h0IHNldCBieSBob3N0IC0gaWYgZGVmaW5lZCwgZG9uJ3QgYXV0by1zaXplIGhlaWdodCAqL1xuICAgIGV4cGxpY2l0SGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIC8qKiBGb3JjZSBhdXRvLXNpemUgZXZlbiBpZiBjb250YWluZXIgaGFzIGRpbWVuc2lvbnMgKi9cbiAgICBmb3JjZUF1dG9TaXplPzogYm9vbGVhbjtcbiAgICAvKiogTWluIGhlaWdodCB1c2VkIGJ5IGxvYWRlciB0byBkZXRlY3QgY29sbGFwc2UgKGRlZmF1bHQ6IDUwKSAqL1xuICAgIGxvYWRlck1pbkhlaWdodD86IG51bWJlcjtcbn1cblxuLy9UT0RPIDogY2hhbmdlIElNeW9wQ29tcG9uZW50IHRvIHJlZiBzcGVjaWZpYyBpbXBsXG50eXBlIFJlZlR5cGVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IElNeW9wQ29tcG9uZW50IHwgUmVmXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wQ29tcG9uZW50PFAgPSBhbnksIFIgPSBhbnk+IHtcblxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBpc0luaXRpYXRlZDogYm9vbGVhbjtcblxuICAgIG1hcmtlZEZvckRpc3Bvc2VkOiBib29sZWFuO1xuXG4gICAgc2V0SW5pdGlhdGVkOiAoKSA9PiB2b2lkXG5cbiAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudFxuXG4gICAgLy9yZWYgY29tcG9uZW50cyBjYW4gYmUgZWxlbWVudC1sZXNzXG4gICAgZWxlbWVudD86IEhUTUxFbGVtZW50XG5cbiAgICBzZW5kOiAobXNnOiBCYXNlTXlvcE1lc3NhZ2UpID0+IENsZWFudXBIYW5kbGVyXG5cbiAgICBiaW5kKG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKCkgPT4gYm9vbGVhbik6IHZvaWQ7XG5cbiAgICBiaW5kPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4pOiB2b2lkO1xuXG4gICAgLy8gYm9vbGVhbiByZXR1cm5lZCB2YWx1ZSA9IGhhbmRsZWQgb3Igbm90XG4gICAgb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IEJhc2VNeW9wTWVzc2FnZSkgPT4gYm9vbGVhblxuXG4gICAgaW5pdGlhdGVkOiAoKSA9PiBQcm9taXNlPGFueT47XG5cbiAgICBkaXNwb3NlOiAoKSA9PiB2b2lkXG5cbiAgICBoaWRlKCk6IHZvaWQ7XG5cbiAgICBzaG93KCk6IHZvaWQ7XG5cbiAgICBpbnNwZWN0KCk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZlcyB0aGUgaWZyYW1lIGNvbnRlbnQgc2l6ZSBhbmQgYXV0b21hdGljYWxseSBzeW5jcyBpdCB0byB0aGUgaWZyYW1lIGVsZW1lbnQuXG4gICAgICogT25seSBhdmFpbGFibGUgZm9yIGlmcmFtZS1iYXNlZCBjb21wb25lbnRzLiBVc2VzIGRpcmVjdCBjb250ZW50RG9jdW1lbnQgYWNjZXNzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZyBzaXplIGNoYW5nZSBjYWxsYmFjayBhbmQgbWluL21heCBjb25zdHJhaW50c1xuICAgICAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gc3RvcCBvYnNlcnZpbmdcbiAgICAgKi9cbiAgICBvYnNlcnZlQXV0b1NpemU/OiAob3B0aW9ucz86IEF1dG9TaXplT3B0aW9ucykgPT4gQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZWQgbXlvcDpzaXplIG1ldGEgdGFnIGZyb20gdGhlIGNvbXBvbmVudCBIVE1MLlxuICAgICAqIFNldCBieSBIVE1MQ29tcG9uZW50TG9hZGVyIGJlZm9yZSBpZnJhbWUgY3JlYXRpb24uXG4gICAgICogVXNlZCBieSB0aGUgUmVhY3QgaG9zdCB0byBkZXRlcm1pbmUgc2l6aW5nIG1vZGUgKGZpbGwgdnMgY29udGVudCkuXG4gICAgICovXG4gICAgc2l6ZU1ldGE/OiB7IHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyOyBoZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7IG1pbldpZHRoPzogbnVtYmVyOyBtYXhXaWR0aD86IG51bWJlcjsgbWluSGVpZ2h0PzogbnVtYmVyOyBtYXhIZWlnaHQ/OiBudW1iZXIgfSB8IG51bGw7XG5cbiAgICBwYXJlbnQ/OiBJTXlvcENvbXBvbmVudDtcblxuICAgIHByb3BzOiBQXG5cbiAgICByZWZzOiBSXG59XG5cbmZ1bmN0aW9uIGlzSW5oZXJpdEZyb20ob2JqOiBhbnksIGJhc2VDbGFzczogYW55KSB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG5cbiAgICBpZiAoIXByb3RvKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAocHJvdG8uY29uc3RydWN0b3IubmFtZSA9PT0gYmFzZUNsYXNzLm5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBpc0luaGVyaXRGcm9tKHByb3RvLCBiYXNlQ2xhc3MpO1xufVxuXG4vLyBUT0RPIDogbW92ZSA6IFxudHlwZSBtZXNzYWdlSGFuZGxlcjxUPiA9IChtZXNzYWdlOiBUKSA9PiBib29sZWFuO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiBleHRlbmRzIFJlZlR5cGVzID0gUmVmVHlwZXM+IGltcGxlbWVudHMgSU15b3BDb21wb25lbnQ8UD4ge1xuICAgIGlkOiBzdHJpbmcgPSAnJ1xuXG4gICAgbWVzc2FnZUhhbmRsZXJzOiBSZWNvcmQ8c3RyaW5nLCBtZXNzYWdlSGFuZGxlcjxhbnk+W10+ID0ge307XG5cbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnRcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICB0aGlzLmlkID0gb3B0aW9ucz8uaWQgfHwgSG9zdFNESy5JbnN0YW5jZSgpLmFzc2lnbklkKGNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucz8udGltZW91dCA/IG9wdGlvbnM/LnRpbWVvdXQgOiA1ICogMTAwMDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWF0ZWQgJiYgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdCAmJiAhdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KGB0aW1lb3V0XyR7dGltZW91dH0gJHt0aGlzLmlkfWApO1xuXG4gICAgICAgICAgICAgICAgLy8gQSBUSU1FRC1PVVQgQ09NUE9ORU5UIE1VU1QgVU5SRUdJU1RFUiBJVFNFTEYgLS0gTk9CT0RZIEVMU0UgQ0FOLlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaG9zdFNESy5sb2FkQ29tcG9uZW50IHJlamVjdHMgd2l0aCB0aGlzIHNhbWUgZXJyb3IsIHNvIHRoZSBjYWxsZXIgbmV2ZXJcbiAgICAgICAgICAgICAgICAvLyByZWNlaXZlcyB0aGUgY29tcG9uZW50IGFuZCBoYXMgbm8gaGFuZGxlIHRvIGRpc3Bvc2UuIFdpdGhvdXQgdGhpcyB0aGVcbiAgICAgICAgICAgICAgICAvLyBob3N0IGtlZXBzIGl0IGluIGBjb21wb25lbnRzYCBBTkQgYGNvbXBvbmVudHMyaW5pdGAgZm9yIHRoZSBsaWZlIG9mIHRoZVxuICAgICAgICAgICAgICAgIC8vIHBhZ2UsIGFuZCB0aGF0IGNvc3QgY29tcG91bmRzOiBgY29tcG9uZW50czJpbml0YCBpcyB3YWxrZWQgb24gZXZlcnlcbiAgICAgICAgICAgICAgICAvLyBJbml0UmVxdWVzdCwgYGlzVHJ1c3RlZFNvdXJjZWAgd2Fsa3MgYm90aCBhcnJheXMgb24gZXZlcnkgbWVzc2FnZSwgYW5kIGFcbiAgICAgICAgICAgICAgICAvLyBVSSB0aGF0IHJldHJpZXMgLS0gYSByZWVsIHBpY2tlciwgYSBkaWFsb2cgcmVvcGVuZWQgcGVyIHRlbXBsYXRlIC0tIGFkZHNcbiAgICAgICAgICAgICAgICAvLyBhIGRlYWQgZW50cnkgZWFjaCBhdHRlbXB0LlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gZGlzcG9zZSgpIGlzIHRoZSBjb2hlcmVudCBlbmQgc3RhdGU6IGl0IHVucmVnaXN0ZXJzIHRocm91Z2ggdGhlIGhvc3Qnc1xuICAgICAgICAgICAgICAgIC8vICdvbkRpc3Bvc2UnIGhhbmRsZXIgYW5kIGRyb3BzIHRoZSBmcmFtZSB0aGF0IG5ldmVyIGFuc3dlcmVkLlxuICAgICAgICAgICAgICAgIHRoaXMuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICAvLyBUT0RPIDogYXV0byBpbnNwZWN0LCBjb250cm9sIGZyb20gY29uZmlnXG4gICAgICAgIHRoaXMuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAod2luZG93Lm15b3AuaG9zdFNESy5pbnNwZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluc3BlY3QoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGdldCBtYXJrZWRGb3JEaXNwb3NlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkO1xuICAgIH1cblxuICAgIHNldCBtYXJrZWRGb3JEaXNwb3NlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbjogVGhlIGNvbXBvbmVudCBpcyBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRpc3Bvc2VkLiBEaXNwb3NlIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGFnYWluIHVudGlsIHRoZSBjdXJyZW50IGRpc3Bvc2FsIHByb2Nlc3MgaXMgY29tcGxldGUuJylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGhpZGUoKTogdm9pZDtcblxuICAgIGFic3RyYWN0IHNob3coKTogdm9pZDtcblxuICAgIGFic3RyYWN0IGluc3BlY3QoKTogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvL1RPRE86IHVzZSBiaW5kV2hlbiB3aXRoIHJldHVybiB0cnVlIHByZWRpY2F0ZSAuLi5cbiAgICBiaW5kID0gPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25cbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0uaW5jbHVkZXMoaGFuZGxlcikpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXS5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZFdoZW4gPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgcHJlZGljYXRlOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbiwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IHZvaWQpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IHVzZSBjb21wb25lbnQuYmluZFdoZW4gd2l0aG91dCBhbiBoYW5kbGVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdID0gW11cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdO1xuXG4gICAgICAgIGNvbnN0IHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyID0gKGU6IFQpID0+IHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vVE9ETyA6IGhhbmRsZSBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uID9cbiAgICAgICAgaGFuZGxlcnMucHVzaChwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGFuZGxlcnMuaW5kZXhPZihwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnb25NZXNzYWdlUmVjZWl2ZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCBpbmNvbWVNZXNzYWdlLCB0aGlzKTtcbiAgICAgICAgLy9UT0RPIDogaGFuZGVsIHNwZWNpYWwgZXZldHMgPyBsaWtlIGluaXRSZXMgP1xuICAgICAgICBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVDb21wb25lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChpbmNvbWVNZXNzYWdlIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpO1xuXG4gICAgICAgICAgICAvL2tlZXBpbmcgdGhpcy5tZXRob2QoKSBzbyB0aGF0IGNvbnRleHQgd2lsbCBzYXZlZFxuICAgICAgICAgICAgaWYgKCh0aGlzIGFzIGFueSlbdHlwZWRNZXNzYWdlLm1ldGhvZF0pIHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpW3R5cGVkTWVzc2FnZS5tZXRob2RdKHR5cGVkTWVzc2FnZS5jb250ZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYG1ldGhvZCBub3QgZm91bmQgJHt0eXBlZE1lc3NhZ2UubWV0aG9kfSBvbiBjb21wb25lbnRgLCB0aGlzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZV07XG4gICAgICAgIGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IGhhbmRsZWQgfHwgaGFuZGxlcihpbmNvbWVNZXNzYWdlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9UT0RPIDogY29uc29sZSBvbmx5IHdoZW4gZGVidWcgY29uZmlnXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdubyBoYW5kbGVycyBmb3VuZCBmb3IgJywgaW5jb21lTWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmlzSW5pdGlhdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUpXG4gICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBfd2hlbkluaXRpYXRlZFJlc29sdmU/OiAodmFsdWU/OiBhbnkpID0+IGFueTtcbiAgICBfd2hlbkluaXRpYXRlZFJlamVjdD86ICh2YWx1ZT86IGFueSkgPT4gYW55O1xuXG4gICAgX3doZW5Jbml0aWF0ZWQ6IFByb21pc2U8YW55PiA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgaW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2hlbkluaXRpYXRlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbmRDbGVhbnVwTWVzc2FnZShtZXNzYWdlOiBDbGVhbnVwTWVzc2FnZSk6IHZvaWQge1xuICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG4gICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSB0aGlzLmlkO1xuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcblxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuYmluZFdoZW4obWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1zZy5yZXBsYXlUb0hhbmRsZXIgPT09IG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgIH0sIChtOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZS5oYW5kbGVyKG0pO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlcjtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBkZWxldGUgbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgdGhpcy5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgc2VuZChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciB7XG4gICAgICAgIC8vbWVzc2FnZXMgdGhhdCBleGV0cmFjdGVkIGZyb20gZW52ZWxvcGUgYWxyZWFkeSBoYXZlIHNvdXJjZSBpbiB0aGVtXG4gICAgICAgIGlmICghbWVzc2FnZS5zb3VyY2UpXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLmRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHRoaXMuaWQ7XG5cbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG5cbiAgICAgICAgbGV0IGNsZWFudXBIYW5kbGVyO1xuICAgICAgICAvLyBUT0RPIDogZml4IGhlYXZ5IG9wLi5cbiAgICAgICAgLy8gIGlmIChpc0luaGVyaXRGcm9tKG1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAobWVzc2FnZS5oYW5kbGVyKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBNeW9wQmluZE1lc3NhZ2UpO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIgPSB0aGlzLmJpbmRXaGVuKHR5cGVkTWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBtc2cucmVwbGF5VG9IYW5kbGVyID09PSB0eXBlZE1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgICAgICB9LCB0eXBlZE1lc3NhZ2UuaGFuZGxlcik7XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlLmhhbmRsZXJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICBpZiAobWVzc2FnZS5yZWYpIHtcbiAgICAgICAgICAgIC8vIHNlcmlhbGl6YWJsZVxuICAgICAgICAgICAgbWVzc2FnZS5yZWYgPSBtZXNzYWdlLnJlZi5fX25vblByb3hpZWQgfHwgbWVzc2FnZS5yZWY7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kQ2xlYW51cE1lc3NhZ2UobmV3IENsZWFudXBNZXNzYWdlKG1lc3NhZ2UuaWQsIChyZXBsYXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nIHJlcGxheT9cbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xlYW51cEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFJ1bnMgdGhlICdvbkRpc3Bvc2UnIGhhbmRsZXJzIG9uY2UuIGhvc3RTREsgcmVnaXN0ZXJzIHRoZSBvbmUgdGhhdCB1bnJlZ2lzdGVyc1xuICAgICAqICB0aGlzIGNvbXBvbmVudCwgc28gaXQgaGFzIHRvIHJ1biBvbiBFVkVSWSBkaXNwb3NlIHBhdGgsIGluaXRpYXRlZCBvciBub3QuICovXG4gICAgcHJpdmF0ZSBydW5EaXNwb3NlSGFuZGxlcnMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9uRGlzcG9zZUhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbJ29uRGlzcG9zZSddO1xuICAgICAgICBpZiAob25EaXNwb3NlSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIG9uRGlzcG9zZUhhbmRsZXJzLmZvckVhY2goZGlzcG9zZUhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgbnVsbCBvciBmaXggdGhlIHR5cGUgP1xuICAgICAgICAgICAgICAgIGRpc3Bvc2VIYW5kbGVyKG51bGwpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFya2VkRm9yRGlzcG9zZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICghdGhpcy5pc0luaXRpYXRlZCkge1xuICAgICAgICAgICAgLy8gQSBDT01QT05FTlQgVEhBVCBORVZFUiBJTklUSUFURUQgU1RJTEwgSEFTIFRPIEJFIFVOUkVHSVNURVJFRC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUaGlzIHVzZWQgdG8gYHJldHVybmAgaGVyZSwgd2hpY2ggbGVha2VkOiBob3N0U0RLIHRyYWNrcyBldmVyeSBjb21wb25lbnQgYnlcbiAgICAgICAgICAgIC8vIGJpbmRpbmcgYW4gJ29uRGlzcG9zZScgaGFuZGxlciB0aGF0IHJlbW92ZXMgaXQgZnJvbSBgY29tcG9uZW50c2AgYW5kXG4gICAgICAgICAgICAvLyBgY29tcG9uZW50czJpbml0YCwgYW5kIHRob3NlIGhhbmRsZXJzIGxpdmUgYmVsb3cgdGhpcyBsaW5lLiBTbyBhIGNvbXBvbmVudFxuICAgICAgICAgICAgLy8gdGhhdCB0aW1lZCBvdXQgYW5kIHdhcyB0aGVuIGRpc3Bvc2VkIGhhZCBpdHMgaWZyYW1lIHB1bGxlZCBmcm9tIHRoZSBET01cbiAgICAgICAgICAgIC8vIChteW9wSWZyYW1lQ29tcG9uZW50LmRpc3Bvc2UgZG9lcyB0aGF0IGFmdGVyIHN1cGVyLmRpc3Bvc2UpIHdoaWxlIHN0YXlpbmcgaW5cbiAgICAgICAgICAgIC8vIGJvdGggaG9zdCBhcnJheXMgZm9yZXZlci5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUaGF0IGlzIG5vdCBhIHNsb3cgbGVhaywgaXQgY29tcG91bmRzOiBgY29tcG9uZW50czJpbml0YCBpcyB3YWxrZWQgb24gZXZlcnlcbiAgICAgICAgICAgIC8vIEluaXRSZXF1ZXN0IGFuZCBgaXNUcnVzdGVkU291cmNlYCB3YWxrcyBib3RoIGFycmF5cyBvbiBldmVyeSBtZXNzYWdlLCBzbyBlYWNoXG4gICAgICAgICAgICAvLyBkZWFkIGVudHJ5IGNvc3RzIGEgYHNlbmQoKWAgaW50byBhIHJlbW92ZWQgZnJhbWUgb24gZXZlcnkgZnV0dXJlIGhhbmRzaGFrZS5cbiAgICAgICAgICAgIC8vIFJlLW9wZW5pbmcgYSBkaWFsb2cgdGhhdCBtb3VudHMgY29tcG9uZW50cyAtLSBQaWMtVGltZSdzIHJlZWwgcGlja2VyIC0tIGFkZHNcbiAgICAgICAgICAgIC8vIG9uZSBkZWFkIGVudHJ5IHBlciBhdHRlbXB0LlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIE9ubHkgdGhlIERpc3Bvc2VNZXNzYWdlIGlzIGdlbnVpbmVseSBjb25kaXRpb25hbDogdGhlcmUgaXMgbm8gbGl2ZSBmcmFtZSB0b1xuICAgICAgICAgICAgLy8gdGVsbC4gRXZlcnl0aGluZyBlbHNlIG11c3QgcnVuLlxuICAgICAgICAgICAgdGhpcy5ydW5EaXNwb3NlSGFuZGxlcnMoKTtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzID0ge307XG4gICAgICAgICAgICB0aGlzLmlkICs9ICdfZGlzcG9zZWQnO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdkaXNwb3NpbmcgY29tcG9uZW50JywgdGhpcy5pZCk7XG5cbiAgICAgICAgLy8gLy9UT0RPIDogaW1wbGVtZW50IGRpc3Bvc2UgZmxvd1xuICAgICAgICAvLyBPYmplY3Qua2V5cyh0aGlzLnJlZnMpLmZvckVhY2gocmVmS2V5PT57XG4gICAgICAgIC8vICAgICB0aGlzLnJlZnNbcmVmS2V5XS5kaXNwb3NlKCk7XG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRoZXJlIGlzIGFueSB0aW1lIGZvciB0aGUgb1xuICAgICAgICAvLyB0aGVyIHNpZGUgdG8gcHJvY2Nlc3MgdG8gbWVzc2FnZSBiZWZvcmUgZGllID9cbiAgICAgICAgLy9ub3RpZnkgdGhlIG90aGVyIHNpZGUgU0RLXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRGlzcG9zZU1lc3NhZ2UoKSlcblxuICAgICAgICB0aGlzLnJ1bkRpc3Bvc2VIYW5kbGVycygpO1xuXG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5jb250YWluZXIpO1xuICAgICAgICAvL3RoaXMuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycyA9IHt9XG4gICAgICAgIHRoaXMuaWQgKz0gJ19kaXNwb3NlZCc7XG4gICAgICAgIHRoaXMuaXNJbml0aWF0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm9wczogUCA9IHt9IGFzIHVua25vd24gYXMgUDtcbiAgICByZWZzOiBSID0ge30gYXMgdW5rbm93biBhcyBSO1xufVxuIiwgImV4cG9ydCBjb25zdCBFcnJvcnMgPSB7XG4gICAgbm90U2VyaWFsaXphYmxlUmVmQ2FsbDogKHByb3AsIGFyZykgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxuVGhlIGlucHV0IHByb3ZpZGVkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGlzIG5vdCBzZXJpYWxpemFibGUuIFNlcmlhbGl6YXRpb24gaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGRhdGEgY2FuIGJlIHNhZmVseSB0cmFuc2ZlcnJlZCB0byB0aGUgc2tpbiBpbXBsZW1lbnRhdGlvbi4gXG5UaGUgZm9sbG93aW5nIHR5cGVzIG9mIGRhdGEgYXJlIGNvbnNpZGVyZWQgbm9uLXNlcmlhbGl6YWJsZSBhbmQgY2Fubm90IGJlIHByb2Nlc3NlZDpcblxuLSBGdW5jdGlvbnNcbi0gRE9NIGVsZW1lbnRzXG4tIENsYXNzIGluc3RhbmNlc1xuLSBDaXJjdWxhciByZWZlcmVuY2VzXG4tIFN5bWJvbHNcbi0gQmlnSW50IHZhbHVlc1xuXG5JbiB0aGUgZm9sbG93aW5nIGV4ZWN1dGlvbiB3ZSBkZXRlY3RlZCA6XG5+fn5+fn5+flxuJHthcmd9IFxufn5+fn5+fn5cbmFzIG5vdCBzZXJpYWxpemFibGUuXG5cblRvIHJlc29sdmUgdGhpcyBpc3N1ZSwgcGxlYXNlIGVuc3VyZSB0aGF0IGFsbCBpbnB1dHMgcGFzc2VkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGFyZSBpbiBhIHNlcmlhbGl6YWJsZSBmb3JtYXQuXG5UaGlzIHR5cGljYWxseSBpbmNsdWRlcyBwcmltaXRpdmUgdHlwZXMgKHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zKSwgYXJyYXlzLCBhbmQgcGxhaW4gb2JqZWN0cy4gXG5JZiB5b3UgbmVlZCB0byBpbmNsdWRlIGNvbXBsZXggZGF0YSB0eXBlcywgY29uc2lkZXIgY29udmVydGluZyB0aGVtIHRvIGEgc2VyaWFsaXphYmxlIHN0cnVjdHVyZSBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZSBmdW5jdGlvbi5cbk9yIHVzZSBNeW9wIG1lc3NhZ2UgdGhhdCBzdXBwb3J0IGl0OiBDdXN0b21SZWZNZXNzYWdlLCBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSBvciBFeGVjdXRlU2NyaXB0TWVzc2FnZS5cblxuU3VnZ2VzdGVkIEZpeDpcbjEuIFJlbW92ZSBvciByZXBsYWNlIG5vbi1zZXJpYWxpemFibGUgdmFsdWVzIGZyb20geW91ciBpbnB1dC5cbjIuIElmIHVzaW5nIG9iamVjdHMsIGVuc3VyZSB0aGV5IGRvIG5vdCBjb250YWluIGFueSBmdW5jdGlvbnMgb3IgY2lyY3VsYXIgcmVmZXJlbmNlcy5cbjMuIENvbnZlcnQgYW55IGNsYXNzIGluc3RhbmNlcyB0byBwbGFpbiBvYmplY3RzIG9yIEpTT04tY29tcGF0aWJsZSBmb3JtYXRzLlxuNC4gVXNlIGRlZGljYXRlZCBNeW9wIG1lc3NhZ2UuXG5cbkZvciBtb3JlIGRldGFpbHMgb24gc2VyaWFsaXphdGlvbiBhbmQgTXlvcCBtZXNzYWdlIGV4YW1wbGVzLCByZWZlciB0byBodHRwczovL2RvY3MubXlvcC5kZXZcXC5cblxuYCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudCwgSU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0VudmVsb3BlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9FbnZlbG9wZWRNZXNzYWdlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wUmVmQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBwdWJsaWMgcGFyZW50OiBJTXlvcENvbXBvbmVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgLy9UT0RPIDogY2hlY2sgcGFyZW50Q29tcG9uZW50LmNvbnRhaW5lci4uLlxuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBwYXJlbnQuY29udGFpbmVyLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICAvL3RoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZChhcmd1bWVudHMuY2FsbGVlLm5hbWUpKTtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdoaWRlJykpO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2hvdycpKTtcbiAgICB9XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IHJlYWwgY2xlYW51cFxuICAgICAgICAvL2NvbnNvbGUubG9nKCdyZWYgaW5zcGVjdCBjYWxsZWQsIGNyZWF0aW5nIEV4ZWN1dGVDb21wb25lbnRNZXRob2QgaW5zcGVjdCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYsIHRoaXMuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdpbnNwZWN0JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0JykpO1xuICAgIH1cblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gJ011dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJykge1xuICAgICAgICAvLyAgZGVidWdnZXI7XG4gICAgICAgIC8vICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyB9XG4gICAgICAgIHJldHVybiBzdXBlci5vbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlKTtcbiAgICB9XG5cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ3JlZiBtZXNzYWdlIHNlbmRpbmcgJywgbWVzc2FnZSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlclxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgLy8gdGhpcy5pZCB3aWxsIGJlIGF2YWlsYWJsZSBvbiB0aGUgbmVzdGVkIGNvbXBvbmVudFxuICAgICAgICB0aGlzLnBhcmVudC5zZW5kKG5ldyBFbnZlbG9wZWRNZXNzYWdlKHRoaXMuaWQsIG1lc3NhZ2UpKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH07XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0luaXRpYXRlZClcbiAgICAgICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnZGlzcG9zZScpKTtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0F1dG9TaXplT3B0aW9ucywgQmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcblxuLyoqXG4gKiBDb21wb25lbnQgd3JhcHBlciBmb3IgTXlvcCBXZWIgQ29tcG9uZW50cyB0aGF0IGFyZSBleHRyYWN0ZWQgZnJvbSBIVE1MXG4gKiBhbmQgcnVuIGRpcmVjdGx5IG9uIHRoZSBob3N0IGRvY3VtZW50IChub3QgaW4gYW4gaWZyYW1lKS5cbiAqXG4gKiBUaGVzZSBjb21wb25lbnRzIHVzZSB0aGUgbmF0aXZlIFdlYiBDb21wb25lbnRzIEFQSSAoQ3VzdG9tIEVsZW1lbnRzICsgU2hhZG93IERPTSlcbiAqIGFuZCBjb21tdW5pY2F0ZSB2aWEgZGlyZWN0IG1ldGhvZCBjYWxscyBhbmQgQ3VzdG9tRXZlbnRzIGluc3RlYWQgb2YgcG9zdE1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuICAgIHByaXZhdGUgY3RhQ2xlYW51cD86ICgpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfY3RhSGFuZGxlcj86IChhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93bikgPT4gdm9pZDtcbiAgICBwcml2YXRlIF9jdGFRdWV1ZTogQXJyYXk8e2FjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3dufT4gPSBbXTtcblxuICAgIC8vIEEgc2luZ2xlICdteW9wLWN0YScgbGlzdGVuZXIsIGF0dGFjaGVkIGF0IGNvbnN0cnVjdGlvbiBzbyBDVEFzIGEgY29tcG9uZW50XG4gICAgLy8gZGlzcGF0Y2hlcyBkdXJpbmcgaXRzIGZpcnN0IGluaXRXaXRoRGF0YSgpIHJlbmRlciBcdTIwMTQgYmVmb3JlIHRoZSBob3N0IGF0dGFjaGVzXG4gICAgLy8gYSBoYW5kbGVyIFx1MjAxNCBhcmUgYnVmZmVyZWQgKGFuZCBmbHVzaGVkIG9uIHNldEN0YUhhbmRsZXIpLCBtYXRjaGluZyB0aGUgaWZyYW1lXG4gICAgLy8gcGF0aCdzIHByZS1oYW5kbGVyIENUQSBxdWV1ZS5cbiAgICBwcml2YXRlIF9jdGFMaXN0ZW5lciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBkZXRhaWwgPSAoZSBhcyBDdXN0b21FdmVudCkuZGV0YWlsO1xuICAgICAgICBpZiAoIWRldGFpbD8uYWN0aW9uKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLl9jdGFIYW5kbGVyICYmICF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9jdGFIYW5kbGVyKGRldGFpbC5hY3Rpb24sIGRldGFpbC5wYXlsb2FkKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5fY3RhSGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5fY3RhUXVldWUucHVzaCh7IGFjdGlvbjogZGV0YWlsLmFjdGlvbiwgcGF5bG9hZDogZGV0YWlsLnBheWxvYWQgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBza2luOiBJU2tpbkNvbmZpZyxcbiAgICAgICAgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgICAgIHByaXZhdGUgY3VzdG9tRWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgIHByaXZhdGUgdGFnTmFtZTogc3RyaW5nLFxuICAgICAgICBvcHRpb25zPzogbG9hZGVyT3B0aW9uc1xuICAgICkge1xuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBjb250YWluZXIsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBjdXN0b21FbGVtZW50O1xuXG4gICAgICAgIC8vIExpc3RlbiBCRUZPUkUgYW55IGluaXRXaXRoRGF0YSByZW5kZXIgc28gaW5pdC10aW1lIENUQXMgYXJlbid0IGxvc3QuXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdteW9wLWN0YScsIHRoaXMuX2N0YUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5jdGFDbGVhbnVwID0gKCkgPT4gdGhpcy5jdXN0b21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ215b3AtY3RhJywgdGhpcy5fY3RhTGlzdGVuZXIpO1xuXG4gICAgICAgIC8vIFdlYiBjb21wb25lbnRzIGFyZSBpbml0aWF0ZWQgaW1tZWRpYXRlbHkgKG5vIHBvc3RNZXNzYWdlIGhhbmRzaGFrZSBuZWVkZWQpXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhdGVkKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYXV0b1NpemVPcHRpb25zPzogQXV0b1NpemVPcHRpb25zO1xuXG4gICAgLyoqXG4gICAgICogRGF0YS1vdXQgZm9yIHNpemUgXHUyMDE0IHRoZSBleHRyYWN0ZWQgY291bnRlcnBhcnQgb2YgdGhlIGlmcmFtZSBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIFRISVMgRVhJU1RFRCBPTkxZIE9OIE15b3BJZnJhbWVDb21wb25lbnQsIGFuZCB0aGF0IHdhcyBpbnZpc2libGUgZm9yIGFzIGxvbmcgYXNcbiAgICAgKiBtaW5pZmljYXRpb24gd2FzIHNlbmRpbmcgZXZlcnkgdjIgY29tcG9uZW50IGRvd24gdGhlIGlmcmFtZSBwYXRoLiBSZXN0b3JpbmcgdjJcbiAgICAgKiBkZXRlY3Rpb24gbW92ZXMgdGhlbSB0byB0aGlzIGNsYXNzLCBhbmQgYEBteW9wL3JlYWN0YCBkcml2ZXMgYm90aCB0aHJvdWdoIG9uZVxuICAgICAqIHdyYXBwZXI6IGluIGNvbnRlbnQgbW9kZSBpdCBoaWRlcyBpdHMgbG9hZGVyIGZyb20gdGhlIEZJUlNUIG9uU2l6ZUNoYW5nZSwgc28gYVxuICAgICAqIGNvbXBvbmVudCB3aG9zZSBjbGFzcyBoYXMgbm8gb2JzZXJ2ZUF1dG9TaXplIGxlYXZlcyBhIFJlYWN0IGhvc3Qgb24gYSBsb2FkZXJcbiAgICAgKiBmb3JldmVyLiBQaWMtVGltZSdzIHNpemVNZXRhIGlzIHdpZHRoOjEwMCUgd2l0aCBubyBoZWlnaHQsIHdoaWNoIGlzIGV4YWN0bHkgY29udGVudFxuICAgICAqIG1vZGUuIENhdWdodCBieSB2Mi1kYXRhLWNvbnRyYWN0IEQ4IChBUEkgcGFyaXR5KS5cbiAgICAgKlxuICAgICAqIEl0IFJFUE9SVFMgcmF0aGVyIHRoYW4gaW1wb3Nlcy4gQW4gaWZyYW1lIGhhcyBubyBpbnRyaW5zaWMgc2l6ZSBhbmQgbXVzdCBiZVxuICAgICAqIG1lYXN1cmVkIGluc2lkZSBhbmQgdGhlbiBzZXQgZnJvbSBvdXRzaWRlOyBhIGN1c3RvbSBlbGVtZW50IHNpemVzIGl0c2VsZiBmcm9tIGl0c1xuICAgICAqIG93biBjb250ZW50LCBzbyB0aGUgaG9uZXN0IHRoaW5nIGlzIHRvIG1lYXN1cmUgaXQgYW5kIHRlbGwgdGhlIGhvc3QsIGFuZCBsZXQgdGhlXG4gICAgICogaG9zdCBkZWNpZGUuIFJlYWN0IHRoZW4gdXNlcyB3aWR0aDoxMDAlIGFuZCB0aGUgbWVhc3VyZWQgaGVpZ2h0LlxuICAgICAqXG4gICAgICogVGhlIG9uZSB0aGluZyBpdCBkb2VzIGltcG9zZSBpcyBgZGlzcGxheTogYmxvY2tgIHdoZW4gdGhlIGVsZW1lbnQgY29tcHV0ZXMgdG9cbiAgICAgKiBgaW5saW5lYCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQgZm9yIGEgY3VzdG9tIGVsZW1lbnQgYW5kIG1lYXN1cmVzIGFzIHplcm8gaGVpZ2h0IG5vXG4gICAgICogbWF0dGVyIHdoYXQgaXQgY29udGFpbnMuIFRoZSBpZnJhbWUgcGF0aCBmb3JjZXMgd2lkdGg6MTAwJSBmb3IgdGhlIHNhbWUgcmVhc29uIFx1MjAxNFxuICAgICAqIHdpdGhvdXQgaXQgdGhlIGZpcnN0IG1lYXN1cmVtZW50IGlzIDAgYW5kIHRoZSBob3N0IHNpemVzIHRoZSBjb21wb25lbnQgdG8gbm90aGluZy5cbiAgICAgKi9cbiAgICBvYnNlcnZlQXV0b1NpemUgPSAob3B0aW9ucz86IEF1dG9TaXplT3B0aW9ucyk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgdGhpcy5fYXV0b1NpemVPcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLmN1c3RvbUVsZW1lbnQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKGVsKS5kaXNwbGF5ID09PSAnaW5saW5lJykgZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBkZXRhY2hlZCBvciBubyBsYXlvdXQgeWV0OyB0aGUgb2JzZXJ2ZXIgd2lsbCByZXBvcnQgb25jZSBpdCBoYXMgb25lICovIH1cblxuICAgICAgICBjb25zdCBwYXJzZSA9ICh2OiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ251bWJlcicpIHJldHVybiB2O1xuICAgICAgICAgICAgY29uc3QgbiA9IHBhcnNlRmxvYXQodik7XG4gICAgICAgICAgICByZXR1cm4gaXNOYU4obikgPyB1bmRlZmluZWQgOiBuO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBjbGFtcCA9ICh2OiBudW1iZXIsIG1pbj86IG51bWJlciwgbWF4PzogbnVtYmVyKSA9PlxuICAgICAgICAgICAgbWluICE9PSB1bmRlZmluZWQgJiYgdiA8IG1pbiA/IG1pbiA6IChtYXggIT09IHVuZGVmaW5lZCAmJiB2ID4gbWF4ID8gbWF4IDogdik7XG5cbiAgICAgICAgY29uc3QgcmVwb3J0ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMuX2F1dG9TaXplT3B0aW9ucztcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGF1dG9IZWlnaHQgPSBvcHRzPy5leHBsaWNpdEhlaWdodCA9PT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgb3B0cz8ub25TaXplQ2hhbmdlPy4oe1xuICAgICAgICAgICAgICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogYXV0b0hlaWdodFxuICAgICAgICAgICAgICAgICAgICA/IGNsYW1wKHJlY3QuaGVpZ2h0LCBwYXJzZShvcHRzPy5taW5IZWlnaHQpLCBwYXJzZShvcHRzPy5tYXhIZWlnaHQpKVxuICAgICAgICAgICAgICAgICAgICA6IHJlY3QuaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGF1dG9TaXppbmdXaWR0aDogZmFsc2UsICAgLy8gYSB3ZWIgY29tcG9uZW50IGZpbGxzIGl0cyBjb250YWluZXIncyB3aWR0aFxuICAgICAgICAgICAgICAgIGF1dG9TaXppbmdIZWlnaHQ6IGF1dG9IZWlnaHQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgcm86IFJlc2l6ZU9ic2VydmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcm8gPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gcmVwb3J0KCkpO1xuICAgICAgICAgICAgcm8ub2JzZXJ2ZShlbCk7XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBubyBSZXNpemVPYnNlcnZlcjogdGhlIG9uZS1zaG90IHJlcG9ydCBiZWxvdyBzdGlsbCB1bmJsb2NrcyB0aGUgaG9zdCAqLyB9XG5cbiAgICAgICAgLy8gRmlyZSBvbmNlIGltbWVkaWF0ZWx5LiBIb3N0cyBnYXRlIHRoZWlyIGxvYWRlciBvbiB0aGUgRklSU1QgbWVhc3VyZW1lbnQsIHNvIGFcbiAgICAgICAgLy8gY29tcG9uZW50IHRoYXQgbmV2ZXIgcmVzaXplcyBtdXN0IHN0aWxsIHByb2R1Y2Ugb25lLlxuICAgICAgICByZXBvcnQoKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4geyBybz8uZGlzY29ubmVjdCgpOyB0aGlzLl9hdXRvU2l6ZU9wdGlvbnMgPSB1bmRlZmluZWQ7IH07XG4gICAgfVxuXG4gICAgY2xlYW51cEluc3BlY3Q6IENsZWFudXBIYW5kbGVyID0gKCkgPT4ge307XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gc2V0RGVidWdTdHlsZSh0aGlzLmlkLCAnTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudCcsIDAsIHRoaXMuY29udGFpbmVyLCB0aGlzLmN1c3RvbUVsZW1lbnQsIHRoaXMuY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJzAnO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhbGwnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSBjb21wb25lbnQgd2l0aCBkYXRhIGJ5IGNhbGxpbmcgbXlvcF9pbml0X2ludGVyZmFjZSBkaXJlY3RseVxuICAgICAqL1xuICAgIGluaXRXaXRoRGF0YShkYXRhOiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICh0aGlzLmN1c3RvbUVsZW1lbnQgYXMgYW55KS5teW9wX2luaXRfaW50ZXJmYWNlKGRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGN1cnJlbnQgZGF0YSBmcm9tIHRoZSBjb21wb25lbnRcbiAgICAgKi9cbiAgICBnZXREYXRhKCk6IHVua25vd24ge1xuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmN1c3RvbUVsZW1lbnQgYXMgYW55KS5teW9wX2luaXRfaW50ZXJmYWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBDVEEgaGFuZGxlciAtIHVuaWZpZWQgQVBJIHdpdGggaWZyYW1lIGNvbXBvbmVudHMuXG4gICAgICogQ2FsbGVkIHZpYSBwcm9wcy5teW9wX2N0YV9oYW5kbGVyID0gaGFuZGxlclxuICAgICAqL1xuICAgIHNldEN0YUhhbmRsZXIoaGFuZGxlcjogKGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIC8vIFRoZSAnbXlvcC1jdGEnIGxpc3RlbmVyIGlzIGF0dGFjaGVkIGluIHRoZSBjb25zdHJ1Y3Rvciwgc28gd2Ugb25seSBzZXQgdGhlXG4gICAgICAgIC8vIGhhbmRsZXIgYW5kIGZsdXNoIGFueXRoaW5nIHRoZSBjb21wb25lbnQgZW1pdHRlZCBiZWZvcmUgbm93IChlLmcuIGR1cmluZyB0aGVcbiAgICAgICAgLy8gZmlyc3QgaW5pdFdpdGhEYXRhIHJlbmRlcikuXG4gICAgICAgIHRoaXMuX2N0YUhhbmRsZXIgPSBoYW5kbGVyO1xuXG4gICAgICAgIGlmICh0aGlzLl9jdGFRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBxdWV1ZSA9IFsuLi50aGlzLl9jdGFRdWV1ZV07XG4gICAgICAgICAgICB0aGlzLl9jdGFRdWV1ZSA9IFtdO1xuICAgICAgICAgICAgcXVldWUuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcihpdGVtLmFjdGlvbiwgaXRlbS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvciBjb21wYXRpYmlsaXR5IHdpdGggbWVzc2FnZS1iYXNlZCBjb21wb25lbnRzLlxuICAgICAqIFdlYiBjb21wb25lbnRzIGRvbid0IHVzZSBwb3N0TWVzc2FnZSwgc28gdGhpcyBpcyBhIG5vLW9wIGZvciBtb3N0IG1lc3NhZ2VzLlxuICAgICAqL1xuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlPGFueT4pID0+IHtcbiAgICAgICAgLy8gV2ViIGNvbXBvbmVudHMgZG9uJ3QgdXNlIHRoZSBwb3N0TWVzc2FnZSBzeXN0ZW1cbiAgICAgICAgLy8gSW5zdGVhZCwgaW50ZXJhY3QgZGlyZWN0bHkgdmlhIHByb3BzLm15b3BfaW5pdF9pbnRlcmZhY2UgYW5kIHByb3BzLm15b3BfY3RhX2hhbmRsZXJcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIC8vIExvZyBmb3IgZGVidWdnaW5nXG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ1tNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50XSBzZW5kKCkgY2FsbGVkIC0gd2ViIGNvbXBvbmVudHMgdXNlIGRpcmVjdCBBUEkgaW5zdGVhZCcsIG1lc3NhZ2UpO1xuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jdGFDbGVhbnVwKSB7XG4gICAgICAgICAgICB0aGlzLmN0YUNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLmN1c3RvbUVsZW1lbnQpO1xuICAgIH1cbn1cbiIsICIvL3R5cGUgQUNvbnN0cnVjdG9yVHlwZU9mPFQ+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgQ3VzdG9tUmVmTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCAqIGFzIG1lc3NhZ2VzIGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudENvbmZpZyxcbiAgICB0eXBlIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRSZWZCZWhhdmlvciwgSUhUTUxMb2FkZXJDb25maWcsIElQcm9wQ29kZUJlaGF2aW9yLFxuICAgIElQcm9wQ29uZmlnLCBJU2tpbkNvbmZpZywgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMsXG4gICAgUmVmQmVoYXZpb3JUeXBlLCBTaGFkb3dSb290TW9kZVR5cGUsIFNraW5Mb2FkZXJzLCBTa2luTG9hZGVyVHlwZVxufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge2NvbnRhaW5zUHJpbWl0aXZlc09ubHl9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvblwiO1xuaW1wb3J0IHtFcnJvcnN9IGZyb20gXCIuL2xvZ01lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BSZWZDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvbXlvcFJlZkNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL215b3BFeHRyYWN0ZWRXZWJDb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcElmcmFtZUNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50XCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuL2hvc3RTREtcIjtcblxudHlwZSBjb21wb25lbnREZWZpbml0aW9uUHJvcHMgPSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1sncHJvcHMnXVxuXG5jb25zdCBjcmVhdGVEZWJ1Z1RpdGxlID0gKHRleHQ6IHN0cmluZywgdG9wOiBudW1iZXIsIGNvbXBvbmVudERlZmluaXRpb25Db25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICB0aXRsZUVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICB0aXRsZUVsLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB0aXRsZUVsLnN0eWxlLnBhZGRpbmcgPSAnMCA1cHgnO1xuICAgIHRpdGxlRWwuc3R5bGUuZm9udFNpemUgPSAnMTRweCc7XG4gICAgdGl0bGVFbC5zdHlsZVsndG9wJ10gPSAnMCc7XG4gICAgdGl0bGVFbC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgIC8vdGl0bGVFbC5zdHlsZS5sZWZ0ID0gJzUwJSc7XG4gICAgdGl0bGVFbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgtNTAlKSc7XG4gICAgdGl0bGVFbC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICB0aXRsZUVsLmhyZWYgPSBgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudERlZmluaXRpb25Db25maWcuaWR9YFxuXG4gICAgcmV0dXJuIHRpdGxlRWw7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RGVidWdTdHlsZSA9IChpZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgIC8vIzAwN0JGRiAoYmx1ZSkgb3IgI0ZGNTcyMiAob3JhbmdlKVxuICAgIC8vIzRDQUY1MCAoZ3JlZW4pIG9yICNGRkMxMDcgKGFtYmVyKVxuICAgIC8vIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2lkfSA6ICR7dHlwZX1gLCB0b3AsIGNvbXBvbmVudERlZmluaXRpb25Db25maWcpO1xuICAgIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2NvbXBvbmVudERlZmluaXRpb25Db25maWcubmFtZX0gOiAke3R5cGV9YCwgdG9wLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKTtcbiAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHRvcFRleHQsIGNvbXBvbmVudEVsZW1lbnQpO1xuICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjMDA3QkZGJztcbiAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5ib3JkZXIgPSAndW5zZXQnO1xuICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQodG9wVGV4dCk7XG4gICAgfVxufVxuXG5jb25zdCByZXBvcnRFcnJvciA9IChwcm9wQ29uZmlnOiBJUHJvcENvbmZpZywgcHJvcE5hbWU6IHN0cmluZywgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudDxhbnksIGFueT4pID0+IHtcbiAgICBpZiAoIXByb3BDb25maWcpIHtcblxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEVycm9yOiBVbmRlZmluZWQgUHJvcFxcblxcbmAgK1xuICAgICAgICAgICAgYEl0IGxvb2tzIGxpa2UgeW91J3ZlIHRyaWVkIHRvIHVzZSBhIHByb3AgdGhhdCBoYXNuJ3QgYmVlbiBkZWZpbmVkLlxcbmAgK1xuICAgICAgICAgICAgYFBsZWFzZSBjaGVjayB0aGUgcHJvcCBuYW1lIGZvciBhbnkgdHlwb3Mgb3IgZW5zdXJlIHRoYXQgaXQgaXMgcHJvcGVybHkgZGVmaW5lZCBpbiB0aGUgY29tcG9uZW50J3MgcHJvcCBsaXN0LlxcblxcbmAgK1xuICAgICAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wTmFtZX1cXG5gICtcbiAgICAgICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICAgICAgYEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgY29tcG9uZW50IHBhZ2UgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfSBvciBjb25zdWx0IHRoZSBkZXZlbG9wZXIgZ3VpZGUuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuY29uc3QgcmVwb3J0VW5zdXBwb3J0ZWQgPSAocHJvcENvbmZpZzogSVByb3BDb25maWcsIHByb3BOYW1lOiBzdHJpbmcsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQ8YW55LCBhbnk+KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEVycm9yOiBDb2RlIFByb3AgTm90IFN1cHBvcnRlZFxcblxcbmAgK1xuICAgICAgICBgQ3VycmVudGx5LCBjb2RlIHByb3BzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBsb2NhbCBmcmFtZSBjb21wb25lbnRzLlxcbmAgK1xuICAgICAgICBgXHUyNkEwXHVGRTBGIFRoaXMgaXMgYSB3b3JrIGluIHByb2dyZXNzIGZlYXR1cmUgXHUyMDE0IGNvZGUgcHJvcHMgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gdXBjb21pbmcgdmVyc2lvbnMuXFxuXFxuYCArXG4gICAgICAgIGBJbiB0aGUgbWVhbnRpbWUsIHlvdSBjYW4gdXNlIG1lc3NhZ2UgcHJvcHMuXFxuXFxuYCArXG4gICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcE5hbWV9XFxuYCArXG4gICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBjb21wb25lbnQgcGFnZSBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9IG9yIGNvbnN1bHQgdGhlIGRldmVsb3BlciBndWlkZS5gXG4gICAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbm5lY3RQcm9wcyA9IDxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPihjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBwcm9wc0NvbmZpZzogSVByb3BDb25maWdbXSwgc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuXG4gICAgY29uc3QgcHJvcHNNYXAgPSBwcm9wc0NvbmZpZy5yZWR1Y2UoKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucHJldmlvdXNWYWx1ZSxcbiAgICAgICAgICAgIFtjdXJyZW50VmFsdWUubmFtZV06IHsuLi5jdXJyZW50VmFsdWV9XG4gICAgICAgIH1cbiAgICB9LCB7fSk7XG5cbiAgICBjb25zdCBwcm9wc0hhbmRsZXIgPSB7XG4gICAgICAgIGdldDogKF86IElNeW9wQ29tcG9uZW50LCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHByb3BDb25maWcgPSBwcm9wc01hcFtwcm9wXTtcblxuICAgICAgICAgICAgaWYgKHJlcG9ydEVycm9yKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZXh0cmFjdGVkIHdlYiBjb21wb25lbnRzIEZJUlNUXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9pbml0X2ludGVyZmFjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBhIGZ1bmN0aW9uIHRoYXQgZ2V0cy9zZXRzIGRhdGEgKG1hdGNoZXMgaWZyYW1lIGJlaGF2aW9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkYXRhPzogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG15b3BfY3RhX2hhbmRsZXIsIHJldHVybiB1bmRlZmluZWQgKGl0J3Mgd3JpdGUtb25seSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJc29sYXRlZCBpZnJhbWU6IG5vIHNhbWUtb3JpZ2luIGFjY2VzcyBcdTIwMTQgdXNlIHRoZSBwb3N0TWVzc2FnZSBicmlkZ2VcbiAgICAgICAgICAgICAgICAvLyAoc2FtZSBtZXRob2Qgc3VyZmFjZSBhcyB0aGUgZXh0cmFjdGVkLVdDIGJyYW5jaCBhYm92ZSkuXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BJZnJhbWVDb21wb25lbnQgJiYgY29tcG9uZW50Lmlzb2xhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2luaXRfaW50ZXJmYWNlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkYXRhPzogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHJldHVybiBjb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIG15b3BfY3RhX2hhbmRsZXIgaXMgd3JpdGUtb25seVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEZvciBpZnJhbWUgKGxvY2FsRnJhbWUpIGNvbXBvbmVudHNcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlID09PSBTa2luTG9hZGVycy5IVE1MTG9hZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyID0gc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTG9hZGVyLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5lbGVtZW50LmNvbnRlbnRXaW5kb3dbdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcG9ydFVuc3VwcG9ydGVkKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5tb2RlID09PSAnb3V0cHV0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlUGFyYW1zOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IGludG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKFJlZi5jcmVhdGUocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCguLi5wcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDdG9yID0gbWVzc2FnZXNbcHJvcENvbmZpZy5iZWhhdmlvci5tZXNzYWdlXTtcblxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgbWVzc2FnZUN0b3IoLi4ubWVzc2FnZVBhcmFtcykpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuICAgICAgICBzZXQ6IChfOiBJTXlvcENvbXBvbmVudCwgcHJvcDogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBwcm9wQ29uZmlnID0gcHJvcHNNYXBbcHJvcF07XG5cbiAgICAgICAgICAgIGlmIChyZXBvcnRFcnJvcihwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGV4dHJhY3RlZCB3ZWIgY29tcG9uZW50cyBGSVJTVCAoYmVmb3JlIGxvY2FsRnJhbWUgY2hlY2spXG4gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudHMgbWF5IGhhdmUgc2hhZG93Um9vdE1vZGU6IGxvY2FsRnJhbWUgaW4gdGhlaXIgY29uZmlnXG4gICAgICAgICAgICAgICAgLy8gYnV0IHRoZXkgcnVuIGRpcmVjdGx5IG9uIHRoZSBob3N0IGRvY3VtZW50LCBub3QgaW4gYW4gaWZyYW1lXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9jdGFfaGFuZGxlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZXRDdGFIYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9pbml0X2ludGVyZmFjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJc29sYXRlZCBpZnJhbWU6IHJvdXRlIHZpYSB0aGUgcG9zdE1lc3NhZ2UgYnJpZGdlIChubyBzYW1lLW9yaWdpbiBhY2Nlc3MpLlxuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBNeW9wSWZyYW1lQ29tcG9uZW50ICYmIGNvbXBvbmVudC5pc29sYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9jdGFfaGFuZGxlcicpIHsgY29tcG9uZW50LnNldEN0YUhhbmRsZXIodmFsdWUpOyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2luaXRfaW50ZXJmYWNlJykgeyBjb21wb25lbnQuaW5pdFdpdGhEYXRhKHZhbHVlKTsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBGb3IgaWZyYW1lIChsb2NhbEZyYW1lKSBjb21wb25lbnRzXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSA9PT0gU2tpbkxvYWRlcnMuSFRNTExvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZExvYWRlciA9IHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZExvYWRlci5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRXaW5kb3cgPSAoY29tcG9uZW50LmVsZW1lbnQgYXMgSFRNTElGcmFtZUVsZW1lbnQpLmNvbnRlbnRXaW5kb3cgYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHJlYWwgaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFdpbmRvd1twcm9wTmFtZV0gPSB2YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmx1c2ggQ1RBIHF1ZXVlIGlmIHRoaXMgaXMgbXlvcF9jdGFfaGFuZGxlciBhbmQgcXVldWUgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2N0YV9oYW5kbGVyJyAmJiBjb250ZW50V2luZG93Ll9fbXlvcF9jdGFfcXVldWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWV1ZSA9IGNvbnRlbnRXaW5kb3cuX19teW9wX2N0YV9xdWV1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50V2luZG93Ll9fbXlvcF9jdGFfcXVldWUgPSBudWxsOyAvLyBDbGVhciB0byBwcmV2ZW50IGRvdWJsZS1mbHVzaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLmZvckVhY2goKGl0ZW06IHthY3Rpb246IHN0cmluZywgcGF5bG9hZDogYW55fSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIGNvbXBvbmVudCB3YXMgZGlzcG9zZWQgZHVyaW5nIGZsdXNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQubWFya2VkRm9yRGlzcG9zZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUoaXRlbS5hY3Rpb24sIGl0ZW0ucGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXBvcnRVbnN1cHBvcnRlZChwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9pZihwcm9wQ29uZmlnLmJlaGF2aW9yID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5tZXNzYWdlKVxuICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLm1vZGUgPT09ICdpbnB1dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogc3VwcG9ydCBtdWx0aSBiZWhhdmlvcnNcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSAnbWVzc2FnZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VQYXJhbXM6IGFueVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IGludG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goUmVmLmNyZWF0ZShwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCguLi5wcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDdG9yID0gbWVzc2FnZXNbcHJvcENvbmZpZy5iZWhhdmlvci5tZXNzYWdlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBtZXNzYWdlQ3RvciguLi5tZXNzYWdlUGFyYW1zKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvcjogVW5zdXBwb3J0ZWQgQmVoYXZpb3JcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhlICdiZWhhdmlvcicgZmllbGQgcHJvdmlkZWQgaXMgbm90IHN1cHBvcnRlZC5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQ29tcG9uZW50OiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLm5hbWV9LCBJRDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgUHJvcCBOYW1lOiAke3Byb3B9XFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEJlaGF2aW9yIEZpZWxkOiAke3Byb3BDb25maWcuYmVoYXZpb3IudHlwZX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQ2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHZhbGlkIGJlaGF2aW9yIG9wdGlvbnMuYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudC5wcm9wcyA9IHt9O1xuICAgIGNvbXBvbmVudC5wcm9wcyA9IG5ldyBQcm94eShjb21wb25lbnQucHJvcHMsIHByb3BzSGFuZGxlcik7XG5cbiAgICByZXR1cm4gY29tcG9uZW50IGFzIChPbWl0PElNeW9wQ29tcG9uZW50LCAncHJvcHMnPiAmIHtcbiAgICAgICAgcHJvcHM6IHByb3BUeXBlczxUPlxuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZWZQcm94eSA9ICh0YXJnZXQ6IFJlZiwgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCB7XG4gICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHtcblxuICAgICAgICAgICAgLy8gaWYgKHByb3AgPT09ICdfX25vblByb3hpZWQnKSB7XG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaWYgKHRhcmdldFtwcm9wXSkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3BdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBnZXR0ZXJGdW5jdGlvbiA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MuZm9yRWFjaChhcmcgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250YWluc1ByaW1pdGl2ZXNPbmx5KGFyZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMubm90U2VyaWFsaXphYmxlUmVmQ2FsbChwcm9wLCBhcmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIHByb3BOYW1lLCBmdW5jdGlvbkFyZ3MsIG1ha2VTZXJpYWxpemFibGV9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVmW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VTZXJpYWxpemFibGUocmVmW3Byb3BOYW1lXSguLi5mdW5jdGlvbkFyZ3MpLCB0cnVlKSAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuZCByZXR1cm4gaXRzIHJlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VTZXJpYWxpemFibGUodmFsdWUsIHRydWUpOyAvLyBSZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgdG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiB0YXJnZXQucmVmQ29uZmlnLnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBwcm9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJnczogYXJnc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChtc2cpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG1zZy5jb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy9UT0RPOiB3ZSBjYW4gaW1wbGVtZW50IHRoaW5ncyBsaWtlIGF1dG8gc2VyaWFsaXphdGlvbiBhbmQgYmluZGluZyBmdW5jdGlvbnMgaGVyZVxuICAgICAgICAgICAgLy9nZXR0ZXJGdW5jdGlvbi50ZXN0ID0gJzEyMyc7XG5cbiAgICAgICAgICAgIHJldHVybiBnZXR0ZXJGdW5jdGlvbjtcblxuICAgICAgICAgICAgLy9yZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHRhcmdldCwgcHJvcDogc3RyaW5nLCB2YWx1ZSkge1xuICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIHByb3BOYW1lLCBwcm9wVmFsdWV9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWYpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBmaXggdGhhdFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IHRhcmdldC5yZWZDb25maWcuc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIHByb3BWYWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBwcm9wXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGxvZz9cbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmQ29tcG9uZW50ID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50PihyZWY6IFJlZiwgY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdLCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucyk6IFByb21pc2U8VD4gPT4ge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHJlZi5jb21wb25lbnQ7XG4gICAgaWYgKCFjb21wb25lbnQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FudCBjcmVhdGVSZWZDb21wb25lbnQgd2l0aCBkZXRhY2hlZCByZWYnKTtcblxuICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQnLCByZWYsIGNvbXBvbmVudENvbmZpZyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBuZXcgTXlvcFJlZkNvbXBvbmVudChjb21wb25lbnRDb25maWcudHlwZSwgY29tcG9uZW50LCBvcHRpb25zKTtcbiAgICAgICAgY29tcG9uZW50cy5wdXNoKHJlZkNvbXBvbmVudCk7XG5cbiAgICAgICAgLy8gQSBGQUlMRUQgUkVGIE1VU1QgTk9UIEtFRVAgSVRTIFBMQUNFSE9MREVSLlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGUgcGxhY2Vob2xkZXIgaXMgcmVnaXN0ZXJlZCBhYm92ZSwgYmVmb3JlIHdlIGtub3cgd2hldGhlciB0aGUgZnJhbWUgY2FuXG4gICAgICAgIC8vIGFjdHVhbGx5IGNyZWF0ZSB0aGUgY29tcG9uZW50LCBhbmQgYm90aCBmYWlsdXJlIHBhdGhzIGJlbG93IHVzZWQgdG8gcmVqZWN0XG4gICAgICAgIC8vIHdpdGhvdXQgcmVtb3ZpbmcgaXQuIFRoZSBjYWxsZXIgZ2V0cyBhIHJlamVjdGlvbiBhbmQgbm8gaGFuZGxlLCBzbyBub2JvZHkgZWxzZVxuICAgICAgICAvLyBjYW4gY2xlYW4gaXQgdXAgZWl0aGVyIC0tIGV4YWN0bHkgdGhlIHNoYXBlIG9mIHRoZSB0aW1lb3V0IGxlYWsgaW5cbiAgICAgICAgLy8gQmFzZU15b3BDb21wb25lbnQuIEl0IGlzIHBlcm1hbmVudCBhbmQgaXQgY29tcG91bmRzOiBldmVyeSByZXRyeSBvZiBhIHJlZiB0aGF0XG4gICAgICAgIC8vIGNhbm5vdCBiZSBjcmVhdGVkIChhIHNlbGVjdG9yIHRoYXQgbWF0Y2hlcyBub3RoaW5nLCBhIGZyYW1lIHRoYXQgbmV2ZXIgYW5zd2VycylcbiAgICAgICAgLy8gYWRkcyBhbm90aGVyIGRlYWQgZW50cnkgdG8gdGhlIGFycmF5IHRoYXQgaXNUcnVzdGVkU291cmNlIHdhbGtzIG9uIGV2ZXJ5XG4gICAgICAgIC8vIG1lc3NhZ2UuIENhdWdodCBieSB0ZXN0L2NvbXBvc2l0ZS1yZWYuZTJlLm1qcyBjYXNlIFIzLlxuICAgICAgICBjb25zdCB1bnJlZ2lzdGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXQgPSBjb21wb25lbnRzLmluZGV4T2YocmVmQ29tcG9uZW50KTtcbiAgICAgICAgICAgIGlmIChhdCAhPT0gLTEpIGNvbXBvbmVudHMuc3BsaWNlKGF0LCAxKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvL2ZvciBjYXNlcyB3aGVyZSByZWYgY29tcG9uZW50cyBkZWZpbmUgaW4gdGhlIGNvbXBvbmVudCBjb25maWdcbiAgICAgICAgLy8gd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgcm9vdCBjb21wb25lbnQgdGhlIGJlIGluaXRpYXRlZCBiZWZvcmUgaW50ZXJhY3Rpbmcgd2l0aCBpdFxuICAgICAgICBhd2FpdCBjb21wb25lbnQuaW5pdGlhdGVkKCk7XG5cblxuICAgICAgICAvL1RPRE8gOlxuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvL3JlamVjdCgndGltZW91dD8nKTtcbiAgICAgICAgICAgIHVucmVnaXN0ZXIoKTtcbiAgICAgICAgICAgIHJlamVjdCgndGltZW91dCcpO1xuICAgICAgICB9LCA1MDAwKTtcblxuICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZShyZWYucmVmQ29uZmlnLFxuICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMgPyBvcHRpb25zIDoge30sXG4gICAgICAgICAgICAgICAgaWQ6IHJlZkNvbXBvbmVudC5pZCxcbiAgICAgICAgICAgICAgICBfaGFzUGFyZW50OiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXN5bmMgKG1lc3NhZ2UpID0+IHtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRpbWVvdXQgYWxyZWFkeSBwYXNzZWRcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5mYWlsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDpcbiAgICAgICAgICAgICAgICAgICAgdW5yZWdpc3RlcigpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgZmFpbGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCA9IGNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT0gcmVmQ29tcG9uZW50LmlkKTtcblxuICAgICAgICAgICAgICAgIC8vc2FtZSBtZW1vcnkgZW52LCBzYW1lIEhvc3RTREtcbiAgICAgICAgICAgICAgICBpZiAoaW1wbGVtZW50YXRpb25Db21wb25lbnQgJiYgaW1wbGVtZW50YXRpb25Db21wb25lbnQgIT09IHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUSEUgUExBQ0VIT0xERVIgSVMgUkVEVU5EQU5UIEhFUkUsIFNPIERST1AgSVQuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYnJhbmNoIG1lYW5zIHRoZSBmcmFtZSBtb3VudGVkIGludG8gT1VSIHJlZ2lzdHJ5IHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgIC8vIGl0cyBvd24gLS0gdGhlIHNhbWUtd2luZG93IGNhc2UgdGhlIHdlYmNvbXBvbmVudCBoYW5kbGVyIGNhbGxzXG4gICAgICAgICAgICAgICAgICAgIC8vIFwic2FtZSBtZW1vcnkgd2hlbiB1c2luZyB3ZWJjb21wb25lbnRcIi4gQm90aCB0aGUgcGxhY2Vob2xkZXIgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyByZWFsIGNvbXBvbmVudCB3ZXJlIHRoZW4gcmVnaXN0ZXJlZCB1bmRlciB0aGUgU0FNRSBpZCwgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBwbGFjZWhvbGRlciB3YXMgbGVmdCBiZWhpbmQgKHRoZSBgVE9ETyA6IGNsZWFuIHJlZkNvbXBvbmVudCA/YCB0aGF0XG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgdG8gc2l0IGhlcmUpLiBUd28gZW50cmllcywgb25lIGlkLCBvbmUgb2YgdGhlbSBkZWFkLlxuICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGltcGxlbWVudGF0aW9uQ29tcG9uZW50IGFzIHVua25vd24gYXMgVCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBgZmluZGAgQ0FOIENPTUUgQkFDSyBFTVBUWSwgQU5EIHVuZGVmaW5lZCAhPT0gcmVmQ29tcG9uZW50IElTIFRSVUUuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhlIGd1YXJkIGFib3ZlLCB0aGF0IHJlc29sdmVkIHRoZSBjYWxsZXIncyBwcm9taXNlIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgLy8gYHVuZGVmaW5lZGA6IG5vIGVycm9yLCBubyBjb21wb25lbnQsIGFuZCB0aGUgcGxhY2Vob2xkZXIgbGVmdCBpblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVnaXN0cnkuIFJlcHJvZHVjZWQgYnkgY3JlYXRpbmcgYSByZWYgZnJvbSBhIHdlYiBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50IChjb21wb3NpdGUtcmVmIGNhc2UgUjUpLCB3aGVyZSB0aGUgcmVhbCBjb21wb25lbnQgaXMgcHVzaGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIGludG8gYSByZWdpc3RyeSB0aGUgY2FwdHVyZWQgYXJyYXkgbm8gbG9uZ2VyIHJlZmxlY3RzLiBGYWxsaW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggdG8gdGhlIHBsYWNlaG9sZGVyIGdpdmVzIHRoZSBjYWxsZXIgYSB1c2FibGUgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2Ygc2lsZW5jZS5cbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnNldEluaXRpYXRlZCgpXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogaGVyZSA+XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogd2hhdCBhYm91dCByZWFwdGVycyA/ISBkeW5hbWljID8hXG4gICAgICAgICAgICAgICAgLy8gY29uc3QgZXhzaXN0aW5nUmVmQ29tcG9uZW50ID0gY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSBhcyBNeW9wUmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vIGlmIChleHNpc3RpbmdSZWZDb21wb25lbnQuaWQgJiYgZXhzaXN0aW5nUmVmQ29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gW2NvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0sIHJlZkNvbXBvbmVudF07XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0ucHVzaChyZWZDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7IC8vaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSByZWZDb21wb25lbnQuaWQpITtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBpbiB3ZWJjb21wb25lbnQgY2FzZSB0aGUgc2FtZSBpZCB3aWxsIGFscmVkYXkgYmUgaGVyZSwgd2hpY2ggaXMgZ29vZCAhXG4gICAgICAgICAgICAgICAgLy8gbmFtZTpcbiAgICAgICAgICAgICAgICAvLyAgICAgaWRcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkXG5cbiAgICAgICAgICAgICAgICAvLyBmb3IgaW5uZXIgY29tcG9uZW50cyBpbnNpZGUgcmVmIGNvbXBvbmVudCA6XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5uZXN0ZWRSZWZzLmZvckVhY2gobmVzdGVkUmVmQ29uZmlnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHMhLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpIS50eXBlO1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IG5lc3RlZENvbXBvbmVudERlZmluaXRpb24gPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zPy5maW5kKGRlZiA9PiBkZWYuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpITtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgcmVmQ29uZmlnID0gY29tcG9uZW50Q29uZmlnLnR5cGUucmVmcy5maW5kKHIgPT4gci5uYW1lID09PSBuZXN0ZWRSZWZDb25maWcucmVmTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmICghcmVmQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIHJlZkNvbmZpZyBmb3VuZCBmb3IgbmVzdGVkIHJlZicpO1xuICAgICAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBuZXcgTXlvcFJlZkNvbXBvbmVudChuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uLCByZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICBuZXN0ZWRDb21wb25lbnQuc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5yZWZzW25lc3RlZFJlZkNvbmZpZy5yZWZOYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKG5lc3RlZENvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RSZWZzKHJlZkNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOnVzZSBjb25maWcgY2hlY2sgZm9yIGF1dG8taGlnaHQgYW5kIGNvbnZlcnQgdHlwZSBwcm9wZXJseVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZWZDb21wb25lbnQgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdyBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0UmVmcyA9IGFzeW5jIChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10sIHdpdGhvdXRSZWZDb21wb25lbnRzOiBib29sZWFuID0gZmFsc2UpID0+IHtcblxuICAgIGlmICghY29tcG9uZW50LnJlZnMpXG4gICAgICAgIGNvbXBvbmVudC5yZWZzID0ge307XG5cbiAgICBjb25zdCB3YWl0Rm9yID0gT2JqZWN0LnZhbHVlcyhjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZWZzKS5tYXAocmVmID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWYuYmVoYXZpb3IudHlwZSA9PSBSZWZCZWhhdmlvclR5cGUuY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID1cblxuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0UmVmQ29tcG9uZW50cykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hhbmdlIHRvIGdldCBpdCBmcm9tIHRoZSBmbG93XG4gICAgICAgICAgICAgICAgbGV0IHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmNvbXBvbmVudElkO1xuICAgICAgICAgICAgICAgIGlmICghcmVmQ29tcG9uZW50SWQpXG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmluc3RhbmNlLmNvbXBvbmVudElkXG5cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVqZWN0KG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgLy90aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMhLmZpbmQoY29tcGRlZiA9PiBjb21wZGVmLmlkID09PSByZWZDb21wb25lbnRJZCkhO1xuICAgICAgICAgICAgICAgIC8vIC8vY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGF3YWl0IGdldENvbXBvbmVudERlZmluaXRpb25Db25maWcoY29tcG9uZW50SW5zdGFuY2VDb25maWcuY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJlamVjdChuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE86IGlmIHdlIGhhdmUgdGhlIHNhbWUgY29tcG9uZW50IG1vcmUgdGhhbiBvbmNlIHdlIHdpbGwgbmVlZCBpbnN0YW5jZSBpZCBoZXJlIC4uLlxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudENvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHM/LmZpbmQobmVzdGVkQ29tcG9uZW50ID0+IG5lc3RlZENvbXBvbmVudC50eXBlLmlkID09PSByZWZDb21wb25lbnRJZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIW5lc3RlZENvbXBvbmVudENvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IG5lc3RlZENvbXBvbmVudENvbmZpZyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9jb25zdCBjb21wb25lbnRJbnN0YW5jZUNvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5uZXN0ZWRDb21wb25lbnRzPy5maW5kKGNvbXBvbmVudEluc3RhY2UgPT4gY29tcG9uZW50SW5zdGFjZS5jb21wb25lbnRJZCA9PT0gY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5pZCk7XG4gICAgICAgICAgICAgICAgLy8gaWYoIWNvbXBvbmVudERlZmluaXRpb25Db25maWcpe1xuICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE8gVE9ETyBUT0RPICcpO1xuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDp0aGluayBhYm91dCB0aGF0IDpcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudERlZmluaXRpb25Db25maWcucmVzb2x2ZWREZWZpbml0aW9ucyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnM7XG4gICAgICAgICAgICAgICAgLy8gICBjb25zdCBuZXN0ZWRDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgaW5zdGFuY2U6IG5lc3RlZENvbXBvbmVudENvbmZpZy5pbnN0YW5jZSEsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgdHlwZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLnR5cGUsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgbmFtZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLm5hbWVcbiAgICAgICAgICAgICAgICAvLyAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IF9yZWYgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCduZXN0ZWQgISEgY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBhd2FpdCBjcmVhdGVSZWZDb21wb25lbnQoX3JlZiwgbmVzdGVkQ29tcG9uZW50Q29uZmlnISwgY29tcG9uZW50cylcbiAgICAgICAgICAgICAgICAgICAgLy9URE9PIDogcHV0IHRoYXQgcmVmIGNvbXBvbmVudCBzb21ld2hlcmU/XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBfX25vblByb3hpZWQgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IGNyZWF0ZVJlZlByb3h5KF9fbm9uUHJveGllZCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgnPycpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH0pXG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdEZvcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgIHRocm93IGU7XG4gICAgfVxuXG59XG5cbmV4cG9ydCB0eXBlIHByb3BUeXBlczxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPiA9IHtcbiAgICBbUHJvcGVydHkgaW4ga2V5b2YgVF06XG4gICAgVFtQcm9wZXJ0eV0gZXh0ZW5kcyB7IG1vZGU6ICdpbnB1dCcgfSA/XG4gICAgICAgIFRbUHJvcGVydHldWyd0eXBlJ10gOlxuICAgICAgICBQcm9taXNlPFRbUHJvcGVydHldWyd0eXBlJ10+XG59XG5cbmV4cG9ydCBjb25zdCBleGVjID0gYXN5bmMgKGdldHRlcjogYW55KSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGdldHRlcigpXG59XG5cbmV4cG9ydCBjb25zdCBhY3RBcyA9IDxUPihyZWY6IFJlZikgPT4ge1xuICAgIHJldHVybiByZWYgYXMgdW5rbm93biBhcyBGdW5jdGlvbmlmeVJlZjxUPlxufVxuXG5leHBvcnQgdHlwZSBGdW5jdGlvbmlmeVJlZjxUID0gYW55PiA9IHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSIC8vIElmIGl0J3MgYSBmdW5jdGlvblxuICAgICAgICA/ICguLi5hcmdzOiBBKSA9PiBQcm9taXNlPFI+IC8vIENvbnZlcnQgaXQgdG8gYSBwcm9taXNlZCBmdW5jdGlvblxuICAgICAgICA6IFRbS11cbn07XG4iLCAiaW1wb3J0IHtBdXRvU2l6ZU9wdGlvbnMsIEJhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCxcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgTWVzc2FnZURpcmVjdGlvbiwgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge3NldERlYnVnU3R5bGV9IGZyb20gXCIuLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXMudHNcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BJZnJhbWVDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBwcml2YXRlIF9hdXRvU2l6ZUNsZWFudXA/OiBDbGVhbnVwSGFuZGxlcjtcbiAgICBwcml2YXRlIF9hdXRvU2l6ZU9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnM7XG4gICAgcHJpdmF0ZSBfYXV0b1NpemVVcGRhdGU/OiAoKSA9PiB2b2lkO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIElzb2xhdGlvbiAoc2FuZGJveGVkIGNyb3NzLW9yaWdpbiBmcmFtZSkgXHUyMDE0IHBvc3RNZXNzYWdlIGJyaWRnZSwgaG9zdCBzaWRlIFx1MjUwMFx1MjUwMFxuICAgIHB1YmxpYyBpc29sYXRlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2xhc3REYXRhPzogdW5rbm93bjsgICAgICAgICAgICAgICAvLyBjYWNoZWQgbGFzdC1zZW50IGRhdGEgKHN5bmMgZ2V0RGF0YSlcbiAgICBwcml2YXRlIF9jdGFIYW5kbGVyPzogKGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgX2N0YVF1ZXVlOiBBcnJheTx7IGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duIH0+ID0gW107XG4gICAgcHJpdmF0ZSBfaXNvTXNnSGFuZGxlcj86IChlOiBNZXNzYWdlRXZlbnQpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfaXNvU2l6ZU9wdHM/OiBBdXRvU2l6ZU9wdGlvbnM7XG4gICAgcHJpdmF0ZSBfaXNvQXV0b1NpemUgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnJpZGdlIHNpemluZyBvbmx5IHdoZW4gYXV0by1zaXplIGlzIG9uXG4gICAgcHJpdmF0ZSBfaXNvTGFzdFNpemU/OiB7IGhlaWdodDogbnVtYmVyLCB3aWR0aD86IG51bWJlciB9OyAgLy8gbGFzdCByZXBvcnRlZCBzaXplIChmb3IgdGhlIGVuYWJsZSByYWNlKVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHJpdmF0ZSBJZnJhbWVFbGVtZW50OiBIVE1MSUZyYW1lRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoY29tcG9uZW50Q29uZmlnLCBjb250YWluZXIsIG9wdGlvbnMpXG5cbiAgICAgICAgdGhpcy5lbGVtZW50ID0gdGhpcy5JZnJhbWVFbGVtZW50O1xuICAgICAgICB0aGlzLl9sYXN0RGF0YSA9IG9wdGlvbnM/LmRhdGE7XG4gICAgICAgIC8vIHRoaXMuSWZyYW1lRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KVxuICAgICAgICAvLyAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QoYElmcmFtZUVsZW1lbnQgZXJyb3JgKTtcbiAgICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgc2l6ZU1ldGE/OiB7IHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyOyBoZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7IG1pbldpZHRoPzogbnVtYmVyOyBtYXhXaWR0aD86IG51bWJlcjsgbWluSGVpZ2h0PzogbnVtYmVyOyBtYXhIZWlnaHQ/OiBudW1iZXIgfSB8IG51bGw7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgSXNvbGF0aW9uIGJyaWRnZSAoaG9zdCBzaWRlKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvKiogQXR0YWNoIHRoZSBob3N0LXNpZGUgcG9zdE1lc3NhZ2UgbGlzdGVuZXIgZm9yIGEgc2FuZGJveGVkIGZyYW1lLiAqL1xuICAgIGVuYWJsZUlzb2xhdGlvbigpIHtcbiAgICAgICAgdGhpcy5pc29sYXRlZCA9IHRydWU7XG4gICAgICAgIC8vIElzb2xhdGVkIGZyYW1lcyBkb24ndCBydW4gdGhlIElmcmFtZVNESyBoYW5kc2hha2UgKG5vIHNhbWUtb3JpZ2luIGluaXQpLFxuICAgICAgICAvLyBzbyBtYXJrIGluaXRpYXRlZCBpbW1lZGlhdGVseSBcdTIwMTQgbGlrZSB0aGUgZXh0cmFjdGVkIHdlYiBjb21wb25lbnQgZG9lcy5cbiAgICAgICAgdGhpcy5zZXRJbml0aWF0ZWQoKTtcbiAgICAgICAgdGhpcy5faXNvTXNnSGFuZGxlciA9IChlOiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlLnNvdXJjZSAhPT0gdGhpcy5JZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGQ6IGFueSA9IGUuZGF0YTtcbiAgICAgICAgICAgIGlmICghZCB8fCBkLl9fbXlvcCAhPT0gdHJ1ZSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKGQudHlwZSA9PT0gJ215b3A6Y3RhJykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jdGFIYW5kbGVyICYmICF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSB0aGlzLl9jdGFIYW5kbGVyKGQuYWN0aW9uLCBkLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLl9jdGFIYW5kbGVyKSB0aGlzLl9jdGFRdWV1ZS5wdXNoKHsgYWN0aW9uOiBkLmFjdGlvbiwgcGF5bG9hZDogZC5wYXlsb2FkIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkLnR5cGUgPT09ICdteW9wOnNpemUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlJc29TaXplKGQuaGVpZ2h0LCBkLndpZHRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9pc29Nc2dIYW5kbGVyKTtcbiAgICB9XG5cbiAgICAvKiogRGF0YS1pbiBcdTIwMTQgdW5pZmllZCB3aXRoIHRoZSBleHRyYWN0ZWQtV0MgQVBJLiBQb3N0cyBpbml0IG92ZXIgdGhlIGJyaWRnZS4gKi9cbiAgICBpbml0V2l0aERhdGEoZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICB0aGlzLl9sYXN0RGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudD8uY29udGVudFdpbmRvdz8ucG9zdE1lc3NhZ2UoeyBfX215b3A6IHRydWUsIHR5cGU6ICdteW9wOmluaXQnLCBkYXRhIH0sICcqJyk7XG4gICAgfVxuXG4gICAgLyoqIERhdGEtaW4gZ2V0dGVyIFx1MjAxNCByZXR1cm5zIHRoZSBsYXN0IGRhdGEgdGhlIGhvc3Qgc2VudCAoY2FjaGVkLCBzeW5jaHJvbm91cykuICovXG4gICAgZ2V0RGF0YSgpOiB1bmtub3duIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3REYXRhO1xuICAgIH1cblxuICAgIC8qKiBEYXRhLW91dCBcdTIwMTQgdW5pZmllZCB3aXRoIHRoZSBleHRyYWN0ZWQtV0MgQVBJLiBGbHVzaGVzIENUQXMgcXVldWVkIHByZS1oYW5kbGVyLiAqL1xuICAgIHNldEN0YUhhbmRsZXIoaGFuZGxlcjogKGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2N0YUhhbmRsZXIgPSBoYW5kbGVyO1xuICAgICAgICBpZiAodGhpcy5fY3RhUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcXVldWUgPSBbLi4udGhpcy5fY3RhUXVldWVdO1xuICAgICAgICAgICAgdGhpcy5fY3RhUXVldWUgPSBbXTtcbiAgICAgICAgICAgIHF1ZXVlLmZvckVhY2goaXRlbSA9PiB7IGlmICghdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCkgaGFuZGxlcihpdGVtLmFjdGlvbiwgaXRlbS5wYXlsb2FkKTsgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9hcHBseUlzb1NpemUoaGVpZ2h0OiBudW1iZXIsIHdpZHRoPzogbnVtYmVyKSB7XG4gICAgICAgIGlmICghaGVpZ2h0IHx8IE51bWJlci5pc05hTihoZWlnaHQpKSByZXR1cm47XG4gICAgICAgIC8vIEFsd2F5cyByZW1lbWJlciB0aGUgbGF0ZXN0IHJlcG9ydGVkIHNpemUgc28gaXQgY2FuIGJlIGFwcGxpZWQgaWYvd2hlblxuICAgICAgICAvLyBhdXRvLXNpemluZyBpcyBlbmFibGVkIGFmdGVyIHRoZSBmaXJzdCBtZXNzYWdlIGFycml2ZXMuXG4gICAgICAgIHRoaXMuX2lzb0xhc3RTaXplID0geyBoZWlnaHQsIHdpZHRoIH07XG4gICAgICAgIC8vIFJlc3BlY3QgYXV0b1NpemU6ZmFsc2UgXHUyMDE0IHRoZSBob3N0IG93bnMgZGltZW5zaW9ucywgc28gZG9uJ3QgdG91Y2ggdGhlbS5cbiAgICAgICAgaWYgKCF0aGlzLl9pc29BdXRvU2l6ZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5faXNvU2l6ZU9wdHM7XG4gICAgICAgIGNvbnN0IHRvTnVtID0gKHY6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCA9PlxuICAgICAgICAgICAgdiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogKHR5cGVvZiB2ID09PSAnbnVtYmVyJyA/IHYgOiAoaXNOYU4ocGFyc2VGbG9hdCh2KSkgPyB1bmRlZmluZWQgOiBwYXJzZUZsb2F0KHYpKSk7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRvTnVtKG9wdHM/Lm1pbkhlaWdodCksIG1heCA9IHRvTnVtKG9wdHM/Lm1heEhlaWdodCk7XG4gICAgICAgIGxldCBoID0gaGVpZ2h0O1xuICAgICAgICBpZiAobWluICE9PSB1bmRlZmluZWQgJiYgaCA8IG1pbikgaCA9IG1pbjtcbiAgICAgICAgaWYgKG1heCAhPT0gdW5kZWZpbmVkICYmIGggPiBtYXgpIGggPSBtYXg7XG4gICAgICAgIC8vIFRyYW5zaXRpb24gZnJvbSBhYnNvbHV0ZSBvdmVybGF5IHRvIGRvY3VtZW50IGZsb3cgYXQgdGhlIG1lYXN1cmVkIGhlaWdodC5cbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmluc2V0ID0gJ2F1dG8nO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gaCArICdweCc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgICAgb3B0cz8ub25TaXplQ2hhbmdlPy4oeyB3aWR0aDogd2lkdGggPz8gdGhpcy5JZnJhbWVFbGVtZW50LmNsaWVudFdpZHRoLCBoZWlnaHQ6IGgsIGF1dG9TaXppbmdXaWR0aDogZmFsc2UsIGF1dG9TaXppbmdIZWlnaHQ6IHRydWUgfSBhcyBhbnkpO1xuICAgIH1cblxuICAgIGNsZWFudXBJbnNwZWN0PzogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvLyBUT0RPIDogdXNlIGJldHRlciBjaGVjayBmb3IgaW5zcGVjdCBtb2RlXG4gICAgICAgIGlmICh0aGlzLmNsZWFudXBJbnNwZWN0KSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdpbnNwZWN0IGNhbGwgbW9yZSB0aGFuIG9uY2UnKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BJZnJhbWVDb21wb25lbnQnLCAxMCwgdGhpcy5jb250YWluZXIsIHRoaXMuSWZyYW1lRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QhKCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYWxsJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnR9cHhgO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIG9ic2VydmVTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7c2VuZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBzZW5kKHtoZWlnaHQsIHdpZHRofSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0LCB3aWR0aH1cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmV0LmNvbnRlbnQud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50LmhlaWdodH1weGA7XG4gICAgICAgIH0pKTtcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT2JzZXJ2ZXMgdGhlIGlmcmFtZSBjb250ZW50IHNpemUgYW5kIGF1dG9tYXRpY2FsbHkgc3luY3MgaXQgdG8gdGhlIGlmcmFtZSBlbGVtZW50LlxuICAgICAqIFVzZXMgZGlyZWN0IGNvbnRlbnREb2N1bWVudCBhY2Nlc3MgKHNhbWUtb3JpZ2luIG9ubHkpIGZvciBhY2N1cmF0ZSBtZWFzdXJlbWVudHMuXG4gICAgICpcbiAgICAgKiBSZWVudHJhbnQ6IHdoZW4gY2FsbGVkIGFnYWluIHdoaWxlIG9ic2VydmVycyBhbHJlYWR5IGV4aXN0LCB1cGRhdGVzIG9wdGlvbnMgYW5kXG4gICAgICogcmUtZXZhbHVhdGVzIHNpemluZyB3aXRob3V0IHJlY3JlYXRpbmcgb2JzZXJ2ZXJzLiBDbGVhbnVwICsgcmUtY2FsbCAoZS5nLiBSZWFjdFxuICAgICAqIHJlLXJlbmRlcikgY3JlYXRlcyBmcmVzaCBvYnNlcnZlcnMgc2luY2UgY2xlYW51cCBjbGVhcnMgdGhlIGV4aXN0aW5nIG9uZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgc2l6ZSBjaGFuZ2UgY2FsbGJhY2sgYW5kIG1pbi9tYXggY29uc3RyYWludHNcbiAgICAgKiBAcmV0dXJucyBDbGVhbnVwIGZ1bmN0aW9uIHRvIHN0b3Agb2JzZXJ2aW5nXG4gICAgICovXG4gICAgb2JzZXJ2ZUF1dG9TaXplID0gKG9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnMpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIC8vIFN0b3JlIG9wdGlvbnMgc28gdXBkYXRlU2l6ZSBhbHdheXMgcmVhZHMgdGhlIGxhdGVzdFxuICAgICAgICB0aGlzLl9hdXRvU2l6ZU9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICAgIC8vIElzb2xhdGVkIGZyYW1lcyBjYW4ndCBiZSBtZWFzdXJlZCBjcm9zcy1vcmlnaW4gXHUyMDE0IHNpemluZyBpcyBkcml2ZW4gYnlcbiAgICAgICAgLy8gJ215b3A6c2l6ZScgcG9zdE1lc3NhZ2VzIGZyb20gdGhlIGJyaWRnZSAoc2VlIF9hcHBseUlzb1NpemUpLlxuICAgICAgICBpZiAodGhpcy5pc29sYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNvU2l6ZU9wdHMgPSBvcHRpb25zO1xuICAgICAgICAgICAgdGhpcy5faXNvQXV0b1NpemUgPSB0cnVlO1xuICAgICAgICAgICAgLy8gQXBwbHkgdGhlIG1vc3QgcmVjZW50IGJyaWRnZS1yZXBvcnRlZCBzaXplIChpdCBtYXkgaGF2ZSBhcnJpdmVkIGJlZm9yZVxuICAgICAgICAgICAgLy8gYXV0by1zaXppbmcgd2FzIHR1cm5lZCBvbikuXG4gICAgICAgICAgICBpZiAodGhpcy5faXNvTGFzdFNpemUpIHRoaXMuX2FwcGx5SXNvU2l6ZSh0aGlzLl9pc29MYXN0U2l6ZS5oZWlnaHQsIHRoaXMuX2lzb0xhc3RTaXplLndpZHRoKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7IHRoaXMuX2lzb0F1dG9TaXplID0gZmFsc2U7IHRoaXMuX2lzb1NpemVPcHRzID0gdW5kZWZpbmVkOyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgb2JzZXJ2ZXJzIGFscmVhZHkgZXhpc3QsIHJlLWV2YWx1YXRlIHdpdGggbmV3IG9wdGlvbnMgYW5kIHJldXNlIHRoZW1cbiAgICAgICAgaWYgKHRoaXMuX2F1dG9TaXplQ2xlYW51cCAmJiB0aGlzLl9hdXRvU2l6ZVVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVVcGRhdGUoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdXRvU2l6ZUNsZWFudXA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpZnJhbWUgPSB0aGlzLklmcmFtZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGRvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XG5cbiAgICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgICAgIC8vIENyb3NzLW9yaWdpbiAodjEgY29tcG9uZW50cyBvbiB0aGUgY3VzdG9tZXIncyBkb21haW4pOiBtZWFzdXJlIGluc2lkZSB0aGUgZnJhbWUuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZlSGVpZ2h0VmlhQnJpZGdlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGFtcCA9ICh2YWx1ZTogbnVtYmVyLCBtaW4/OiBudW1iZXIsIG1heD86IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICAgICAgICBpZiAobWluICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPCBtaW4pIHJldHVybiBtaW47XG4gICAgICAgICAgICBpZiAobWF4ICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPiBtYXgpIHJldHVybiBtYXg7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUGFyc2UgQ1NTIHNpemUgdmFsdWVzIHRvIG51bWJlcnNcbiAgICAgICAgY29uc3QgcGFyc2VTaXplID0gKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBpc05hTihwYXJzZWQpID8gdW5kZWZpbmVkIDogcGFyc2VkO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHVwZGF0ZVNpemUgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudDtcbiAgICAgICAgICAgIGlmICghY29udGVudERvYykgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5fYXV0b1NpemVPcHRpb25zO1xuXG4gICAgICAgICAgICBjb25zdCBtaW5XaWR0aCA9IHBhcnNlU2l6ZShvcHRzPy5taW5XaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBtYXhXaWR0aCA9IHBhcnNlU2l6ZShvcHRzPy5tYXhXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBtaW5IZWlnaHQgPSBwYXJzZVNpemUob3B0cz8ubWluSGVpZ2h0KTtcbiAgICAgICAgICAgIGNvbnN0IG1heEhlaWdodCA9IHBhcnNlU2l6ZShvcHRzPy5tYXhIZWlnaHQpO1xuICAgICAgICAgICAgY29uc3QgbG9hZGVyTWluSGVpZ2h0ID0gb3B0cz8ubG9hZGVyTWluSGVpZ2h0ID8/IDUwO1xuXG4gICAgICAgICAgICAvLyBSZXNvbHZlIGV4cGxpY2l0IGRpbWVuc2lvbnM6IGhvc3Qgb3B0aW9ucyBcdTIxOTIgc2l6ZU1ldGEgZmlsbCBtb2RlIFx1MjE5MiB3aWR0aCBkZWZhdWx0cyB0byBcIjEwMCVcIlxuICAgICAgICAgICAgLy8gV2lkdGggZGVmYXVsdHMgdG8gXCIxMDAlXCIgKGJsb2NrIGVsZW1lbnQgYmVoYXZpb3IpIHRvIHByZXZlbnQgdGhlIHNocmluay10by0wIG1lYXN1cmVtZW50IGJ1Zy5cbiAgICAgICAgICAgIC8vIEhlaWdodCBoYXMgbm8gZGVmYXVsdCBzbyBpdCBhdXRvLXNpemVzIHRvIGNvbnRlbnQuXG4gICAgICAgICAgICAvLyBPbmx5IHNpemVNZXRhIFwiMTAwJVwiIChmaWxsIG1vZGUpIGlzIHRyZWF0ZWQgYXMgZXhwbGljaXQgYW5kIGRpc2FibGVzIGF1dG8tc2l6aW5nLlxuICAgICAgICAgICAgLy8gUGl4ZWwgc2l6ZU1ldGEgdmFsdWVzIChlLmcuLCBoZWlnaHQ6IDIwMCkgYXJlIGluaXRpYWwgaGludHMsIE5PVCBleHBsaWNpdCBjb25zdHJhaW50cy5cbiAgICAgICAgICAgIGNvbnN0IHNpemVNZXRhRmlsbFdpZHRoID0gdGhpcy5zaXplTWV0YT8ud2lkdGggPT09IFwiMTAwJVwiID8gXCIxMDAlXCIgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBzaXplTWV0YUZpbGxIZWlnaHQgPSB0aGlzLnNpemVNZXRhPy5oZWlnaHQgPT09IFwiMTAwJVwiID8gXCIxMDAlXCIgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZEV4cGxpY2l0V2lkdGggPSBvcHRzPy5leHBsaWNpdFdpZHRoID8/IHNpemVNZXRhRmlsbFdpZHRoID8/IFwiMTAwJVwiO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA9IG9wdHM/LmV4cGxpY2l0SGVpZ2h0ID8/IHNpemVNZXRhRmlsbEhlaWdodDtcbiAgICAgICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0V2lkdGggPSByZXNvbHZlZEV4cGxpY2l0V2lkdGggIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SGVpZ2h0ID0gcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAvLyBEZXRlY3QgY29sbGFwc2VkIGRpbWVuc2lvbnMgZnJvbSBjb250YWluZXIgKHRoaXMuY29udGFpbmVyKVxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgY29sbGFwc2VkV2lkdGggPSBjb250YWluZXJSZWN0LndpZHRoID09PSAwO1xuICAgICAgICAgICAgLy8gQ29uc2lkZXIgY29sbGFwc2VkIGlmIGhlaWdodCBpcyAwIE9SIGVxdWFscyB0aGUgbG9hZGVyIG1pbkhlaWdodFxuICAgICAgICAgICAgY29uc3QgY29sbGFwc2VkSGVpZ2h0ID0gY29udGFpbmVyUmVjdC5oZWlnaHQgPT09IDAgfHwgY29udGFpbmVyUmVjdC5oZWlnaHQgPT09IGxvYWRlck1pbkhlaWdodDtcblxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGRpbWVuc2lvbnMgdG8gYXV0by1zaXplOlxuICAgICAgICAgICAgLy8gLSBJZiBmb3JjZUF1dG9TaXplIGlzIHRydWUsIGF1dG8tc2l6ZSB1bmxlc3MgZXhwbGljaXQgZGltZW5zaW9uIGlzIHNldFxuICAgICAgICAgICAgLy8gLSBPdGhlcndpc2UsIGF1dG8tc2l6ZSBvbmx5IGlmIGNvbGxhcHNlZFxuICAgICAgICAgICAgY29uc3Qgc2hvdWxkQXV0b1dpZHRoID0gb3B0cz8uZm9yY2VBdXRvU2l6ZVxuICAgICAgICAgICAgICAgID8gIWhhc0V4cGxpY2l0V2lkdGhcbiAgICAgICAgICAgICAgICA6IChjb2xsYXBzZWRXaWR0aCAmJiAhaGFzRXhwbGljaXRXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRBdXRvSGVpZ2h0ID0gb3B0cz8uZm9yY2VBdXRvU2l6ZVxuICAgICAgICAgICAgICAgID8gIWhhc0V4cGxpY2l0SGVpZ2h0XG4gICAgICAgICAgICAgICAgOiAoY29sbGFwc2VkSGVpZ2h0ICYmICFoYXNFeHBsaWNpdEhlaWdodCk7XG5cbiAgICAgICAgICAgIC8vIElmIG5vdGhpbmcgbmVlZHMgYXV0by1zaXppbmcsIGFwcGx5IGV4cGxpY2l0L3BlcmNlbnRhZ2UgZGltZW5zaW9uc1xuICAgICAgICAgICAgaWYgKCFzaG91bGRBdXRvV2lkdGggJiYgIXNob3VsZEF1dG9IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUud2lkdGggPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdFdpZHRoID09PSAnbnVtYmVyJyA/IGAke3Jlc29sdmVkRXhwbGljaXRXaWR0aH1weGAgOiAnMTAwJSc7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ID09PSAnbnVtYmVyJyA/IGAke3Jlc29sdmVkRXhwbGljaXRIZWlnaHR9cHhgIDogJzEwMCUnO1xuXG4gICAgICAgICAgICAgICAgb3B0cz8ub25TaXplQ2hhbmdlPy4oe1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogdHlwZW9mIHJlc29sdmVkRXhwbGljaXRXaWR0aCA9PT0gJ251bWJlcicgPyByZXNvbHZlZEV4cGxpY2l0V2lkdGggOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogdHlwZW9mIHJlc29sdmVkRXhwbGljaXRIZWlnaHQgPT09ICdudW1iZXInID8gcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgYXV0b1NpemluZ1dpZHRoOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgYXV0b1NpemluZ0hlaWdodDogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEaXNhYmxlIENTUyB0cmFuc2l0aW9ucyBvbiBpZnJhbWUgYW5kIGNvbnRhaW5lciBmb3IgdGhlIGVudGlyZVxuICAgICAgICAgICAgLy8gbWVhc3VyZW1lbnQgKyBoZWlnaHQtc2V0dGluZyBjeWNsZS4gSG9zdCBhcHBzIG1heSBzZXQgYHRyYW5zaXRpb246IGFsbGBcbiAgICAgICAgICAgIC8vIHdoaWNoIHdvdWxkIGFuaW1hdGUgdGhlIDBweCBjb2xsYXBzZSBhbmQgZmluYWwgaGVpZ2h0IGNoYW5nZSwgY2F1c2luZ1xuICAgICAgICAgICAgLy8gdmlzaWJsZSBqdW1wcyBkdXJpbmcgc2Nyb2xsLlxuICAgICAgICAgICAgY29uc3QgcHJldlRyYW5zaXRpb24gPSBpZnJhbWUuc3R5bGUudHJhbnNpdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyO1xuICAgICAgICAgICAgY29uc3QgcHJldkNvbnRhaW5lclRyYW5zaXRpb24gPSBjb250YWluZXIuc3R5bGUudHJhbnNpdGlvbjtcbiAgICAgICAgICAgIGlmcmFtZS5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7XG5cbiAgICAgICAgICAgIC8vIFF1aWNrIHByZS1jaGVjazogcmVhZCBzY3JvbGxIZWlnaHQvV2lkdGggQkVGT1JFIGNvbGxhcHNpbmcgdGhlIGlmcmFtZS5cbiAgICAgICAgICAgIC8vIElmIGNvbnRlbnQgb25seSBncmV3IChzY3JvbGxIZWlnaHQgPiBpZnJhbWUgaGVpZ2h0KSwgd2UgY2FuIHNraXAgdGhlXG4gICAgICAgICAgICAvLyAwcHggY29sbGFwc2UgXHUyMDE0IHNjcm9sbEhlaWdodCBuYXR1cmFsbHkgZXhwYW5kcyBiZXlvbmQgdGhlIGlmcmFtZS5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJZnJhbWVIZWlnaHQgPSBpZnJhbWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudElmcmFtZVdpZHRoID0gaWZyYW1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICAgICAgY29uc3QgcHJlU2Nyb2xsSGVpZ2h0ID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkpO1xuICAgICAgICAgICAgY29uc3QgcHJlU2Nyb2xsV2lkdGggPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKSk7XG5cbiAgICAgICAgICAgIGxldCBjb250ZW50V2lkdGggPSBwcmVTY3JvbGxXaWR0aDtcbiAgICAgICAgICAgIGxldCBjb250ZW50SGVpZ2h0ID0gcHJlU2Nyb2xsSGVpZ2h0O1xuXG4gICAgICAgICAgICBjb25zdCBoZWlnaHRHcmV3ID0gc2hvdWxkQXV0b0hlaWdodCAmJiBwcmVTY3JvbGxIZWlnaHQgPiBjdXJyZW50SWZyYW1lSGVpZ2h0ICsgMTtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoR3JldyA9IHNob3VsZEF1dG9XaWR0aCAmJiBwcmVTY3JvbGxXaWR0aCA+IGN1cnJlbnRJZnJhbWVXaWR0aCArIDE7XG5cbiAgICAgICAgICAgIC8vIEZvciBub24tZ3JvdyBjYXNlcyAoc2hyaW5rIG9yIG5vLWNoYW5nZSksIHdlIG11c3QgY29sbGFwc2UgdG8gMHB4IHRvXG4gICAgICAgICAgICAvLyBtZWFzdXJlIHRoZSB0cnVlIGNvbnRlbnQgaGVpZ2h0LiBzY3JvbGxIZWlnaHQgY2FuIG5ldmVyIGRlY3JlYXNlIGJlbG93XG4gICAgICAgICAgICAvLyB0aGUgaWZyYW1lJ3MgY2xpZW50SGVpZ2h0LCBzbyBzaHJpbmsgaXMgdW5kZXRlY3RhYmxlIHdpdGhvdXQgY29sbGFwc2luZy5cbiAgICAgICAgICAgIC8vIFdpdGggdHJhbnNpdGlvbnMgZGlzYWJsZWQgKyBjb250YWluZXIgbWluLWhlaWdodCBoZWxkLCB0aGUgY29sbGFwc2VcbiAgICAgICAgICAgIC8vIGlzIGludmlzaWJsZSAobm8gbGF5b3V0IHNoaWZ0LCBubyBhbmltYXRpb24pLlxuICAgICAgICAgICAgY29uc3QgbmVlZHNIZWlnaHRDb2xsYXBzZSA9IHNob3VsZEF1dG9IZWlnaHQgJiYgIWhlaWdodEdyZXc7XG4gICAgICAgICAgICBjb25zdCBuZWVkc1dpZHRoQ29sbGFwc2UgPSBzaG91bGRBdXRvV2lkdGggJiYgIXdpZHRoR3JldztcblxuICAgICAgICAgICAgaWYgKG5lZWRzSGVpZ2h0Q29sbGFwc2UgfHwgbmVlZHNXaWR0aENvbGxhcHNlKSB7XG4gICAgICAgICAgICAgICAgLy8gSG9sZCB0aGUgY29udGFpbmVyJ3MgbWluLWhlaWdodC93aWR0aCBkdXJpbmcgbWVhc3VyZW1lbnQgdG8gcHJldmVudFxuICAgICAgICAgICAgICAgIC8vIGxheW91dCBzaGlmdCAoZWxlbWVudHMgYmVsb3cgdGhlIGlmcmFtZSB3b24ndCBqdW1wKS5cbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2TWluSGVpZ2h0ID0gY29udGFpbmVyLnN0eWxlLm1pbkhlaWdodDtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2TWluV2lkdGggPSBjb250YWluZXIuc3R5bGUubWluV2lkdGg7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzSGVpZ2h0Q29sbGFwc2UpIGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQgPSBgJHtjdXJyZW50SWZyYW1lSGVpZ2h0fXB4YDtcbiAgICAgICAgICAgICAgICBpZiAobmVlZHNXaWR0aENvbGxhcHNlKSBjb250YWluZXIuc3R5bGUubWluV2lkdGggPSBgJHtjdXJyZW50SWZyYW1lV2lkdGh9cHhgO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzSGVpZ2h0Q29sbGFwc2UpIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSAnMHB4JztcbiAgICAgICAgICAgICAgICBpZiAobmVlZHNXaWR0aENvbGxhcHNlKSBpZnJhbWUuc3R5bGUud2lkdGggPSAnMHB4JztcblxuICAgICAgICAgICAgICAgIGNvbnRlbnRXaWR0aCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpKTtcbiAgICAgICAgICAgICAgICBjb250ZW50SGVpZ2h0ID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkpO1xuXG4gICAgICAgICAgICAgICAgLy8gRmFsbGJhY2s6IGlmIGNvbGxhcHNpbmcgdG8gMHB4IGdhdmUgYSBuZWFyLXplcm8gbWVhc3VyZW1lbnQsIHRoZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAvLyBsaWtlbHkgaGFzIGBoZWlnaHQ6IDEwMCVgIGNoYWlucyAoaHRtbCA+IGJvZHkgPiAuYXBwLWNvbnRhaW5lcikgdGhhdCBjYXNjYWRlZFxuICAgICAgICAgICAgICAgIC8vIHRoZSBjb2xsYXBzZSBpbnRvIGFsbCBjaGlsZHJlbi4gUmV0cnkgd2l0aCBhIG51Y2xlYXIgb3ZlcnJpZGUgdGhhdCBmb3JjZXMgYWxsXG4gICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgdG8gaW50cmluc2ljIHNpemluZy4gVGhpcyBpcyBvbmx5IGEgZmFsbGJhY2sgYmVjYXVzZSB0aGUgb3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAvLyBicmVha3MgZXhwbGljaXQgcGl4ZWwgaGVpZ2h0cyAoZS5nLiA4cHggaW5kaWNhdG9yIGRvdHMgXHUyMTkyIDBweCkuXG4gICAgICAgICAgICAgICAgY29uc3QgbmVlZHNOdWNsZWFySGVpZ2h0ID0gbmVlZHNIZWlnaHRDb2xsYXBzZSAmJiBjb250ZW50SGVpZ2h0IDwgMjtcbiAgICAgICAgICAgICAgICBjb25zdCBuZWVkc051Y2xlYXJXaWR0aCA9IG5lZWRzV2lkdGhDb2xsYXBzZSAmJiBjb250ZW50V2lkdGggPCAyO1xuICAgICAgICAgICAgICAgIGlmIChuZWVkc051Y2xlYXJIZWlnaHQgfHwgbmVlZHNOdWNsZWFyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVhc3VyZVN0eWxlID0gY29udGVudERvYy5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlU3R5bGUuaWQgPSAnX19teW9wX21lYXN1cmUnO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBydWxlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRzTnVjbGVhckhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXMucHVzaCgnaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQnLCAnbWluLWhlaWdodDogMCAhaW1wb3J0YW50JywgJ21heC1oZWlnaHQ6IG5vbmUgIWltcG9ydGFudCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZWVkc051Y2xlYXJXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXMucHVzaCgnd2lkdGg6IGF1dG8gIWltcG9ydGFudCcsICdtaW4td2lkdGg6IDAgIWltcG9ydGFudCcsICdtYXgtd2lkdGg6IG5vbmUgIWltcG9ydGFudCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVTdHlsZS50ZXh0Q29udGVudCA9IGAqLCAqOjpiZWZvcmUsICo6OmFmdGVyIHsgJHtydWxlcy5qb2luKCc7ICcpfTsgZmxleC1iYXNpczogYXV0byAhaW1wb3J0YW50OyBmbGV4LWdyb3c6IDAgIWltcG9ydGFudDsgfWA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnREb2MuaGVhZC5hcHBlbmRDaGlsZChtZWFzdXJlU3R5bGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRXaWR0aCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEhlaWdodCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpKTtcblxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlU3R5bGUucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBjb250YWluZXIgY29uc3RyYWludHMgaW1tZWRpYXRlbHkgKHNhbWUgZnJhbWUsIGJlZm9yZSBwYWludClcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUubWluSGVpZ2h0ID0gcHJldk1pbkhlaWdodDtcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUubWluV2lkdGggPSBwcmV2TWluV2lkdGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gY2xhbXAoY29udGVudFdpZHRoLCBtaW5XaWR0aCwgbWF4V2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gY2xhbXAoY29udGVudEhlaWdodCwgbWluSGVpZ2h0LCBtYXhIZWlnaHQpO1xuXG4gICAgICAgICAgICAvLyBTZXQgYXV0by1zaXplZCBkaW1lbnNpb25zIHRvIG1lYXN1cmVkIHZhbHVlcywgbm9uLWF1dG8gdG8gZXhwbGljaXQvMTAwJVxuICAgICAgICAgICAgaWYgKHNob3VsZEF1dG9XaWR0aCkge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gdHlwZW9mIHJlc29sdmVkRXhwbGljaXRXaWR0aCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0V2lkdGh9cHhgIDogJzEwMCUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNob3VsZEF1dG9IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ID09PSAnbnVtYmVyJyA/IGAke3Jlc29sdmVkRXhwbGljaXRIZWlnaHR9cHhgIDogJzEwMCUnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGb3JjZSByZWZsb3cgc28gdGhlIGZpbmFsIGRpbWVuc2lvbnMgYXJlIGFwcGxpZWQgd2l0aG91dCB0cmFuc2l0aW9uLFxuICAgICAgICAgICAgLy8gdGhlbiByZXN0b3JlIHRoZSBvcmlnaW5hbCB0cmFuc2l0aW9ucy5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgIGlmcmFtZS5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICBpZnJhbWUuc3R5bGUudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnRyYW5zaXRpb24gPSBwcmV2Q29udGFpbmVyVHJhbnNpdGlvbjtcblxuICAgICAgICAgICAgLy8gRG9uJ3QgZm9yY2Ugb3ZlcmZsb3cgXHUyMDE0IGxldCB0aGUgY29tcG9uZW50L3BhcmVudCBjb250cm9sIHNjcm9sbGluZy5cbiAgICAgICAgICAgIC8vIE9ubHkgc2V0IG92ZXJmbG93OiBhdXRvIHdoZW4gY29udGVudCBleGNlZWRzIG1heCBjb25zdHJhaW50cy5cbiAgICAgICAgICAgIGNvbnN0IGlzV2lkdGhDb25zdHJhaW5lZCA9IHNob3VsZEF1dG9XaWR0aCAmJiBtYXhXaWR0aCAhPT0gdW5kZWZpbmVkICYmIGNvbnRlbnRXaWR0aCA+IG1heFdpZHRoO1xuICAgICAgICAgICAgY29uc3QgaXNIZWlnaHRDb25zdHJhaW5lZCA9IHNob3VsZEF1dG9IZWlnaHQgJiYgbWF4SGVpZ2h0ICE9PSB1bmRlZmluZWQgJiYgY29udGVudEhlaWdodCA+IG1heEhlaWdodDtcbiAgICAgICAgICAgIGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93WCA9IGlzV2lkdGhDb25zdHJhaW5lZCA/ICdhdXRvJyA6ICcnO1xuICAgICAgICAgICAgY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gaXNIZWlnaHRDb25zdHJhaW5lZCA/ICdhdXRvJyA6ICcnO1xuXG4gICAgICAgICAgICBvcHRzPy5vblNpemVDaGFuZ2U/Lih7XG4gICAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGF1dG9TaXppbmdXaWR0aDogc2hvdWxkQXV0b1dpZHRoLFxuICAgICAgICAgICAgICAgIGF1dG9TaXppbmdIZWlnaHQ6IHNob3VsZEF1dG9IZWlnaHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEluaXRpYWwgc2l6ZSAocnVuIHN5bmNocm9ub3VzbHksIG5vdCBkZWJvdW5jZWQpXG4gICAgICAgIHVwZGF0ZVNpemUoKTtcblxuICAgICAgICAvLyBTdG9yZSB1cGRhdGVTaXplIGZvciByZWVudHJhbnQgY2FsbHNcbiAgICAgICAgdGhpcy5fYXV0b1NpemVVcGRhdGUgPSB1cGRhdGVTaXplO1xuXG4gICAgICAgIC8vIERlYm91bmNlIG9ic2VydmVyIGNhbGxiYWNrcyB2aWEgckFGIFx1MjAxNCBhdCBtb3N0IG9uZSB1cGRhdGVTaXplIHBlciBmcmFtZS5cbiAgICAgICAgLy8gUHJldmVudHMgbGF5b3V0IHRocmFzaGluZyBmcm9tIGhpZ2gtZnJlcXVlbmN5IG11dGF0aW9ucyAoZS5nLiBDU1MgYW5pbWF0aW9ucykuXG4gICAgICAgIGxldCByYWZJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzY2hlZHVsZVVwZGF0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChyYWZJZCAhPT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgICAgICByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmFmSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdXBkYXRlU2l6ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gT2JzZXJ2ZSBmb3IgY2hhbmdlc1xuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiBzY2hlZHVsZVVwZGF0ZSgpKTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShkb2MuYm9keSk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZG9jLmRvY3VtZW50RWxlbWVudCk7XG5cbiAgICAgICAgLy8gTXV0YXRpb25PYnNlcnZlciBjYXRjaGVzIERPTSBjb250ZW50IGNoYW5nZXMgKGUuZy4gcmVtb3ZpbmcgbGlzdCBpdGVtcywgdG9nZ2xpbmcgdmlld3MpXG4gICAgICAgIC8vIHRoYXQgZG9uJ3QgdHJpZ2dlciBSZXNpemVPYnNlcnZlciBiZWNhdXNlIHRoZSBib2R5IGJveC1zaXplIHN0YXlzIHRoZSBzYW1lXG4gICAgICAgIC8vIChib2R5IGZpbGxzIGlmcmFtZSwgaWZyYW1lIGhhc24ndCBzaHJ1bmsgeWV0KS5cbiAgICAgICAgLy8gYGF0dHJpYnV0ZXM6IHRydWVgIGNhdGNoZXMgQ1NTIGNsYXNzL3N0eWxlIGNoYW5nZXMgKGUuZy4gZGlzcGxheTpub25lIHRvZ2dsaW5nIHZpZXdzKS5cbiAgICAgICAgY29uc3QgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHNjaGVkdWxlVXBkYXRlKCkpO1xuICAgICAgICBtdXRhdGlvbk9ic2VydmVyLm9ic2VydmUoZG9jLmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlLCBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuXG4gICAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICBtdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIGlmIChyYWZJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpO1xuICAgICAgICAgICAgICAgIHJhZklkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVVcGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2F1dG9TaXplQ2xlYW51cCA9IGNsZWFudXA7XG4gICAgICAgIHJldHVybiBjbGVhbnVwO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2JyaWRnZVNpemVDbGVhbnVwPzogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvKipcbiAgICAgKiBBdXRvLWhlaWdodCBmb3IgYSBmcmFtZSB0aGUgaG9zdCBjYW4ndCByZWFkIChjcm9zcy1vcmlnaW4pLiBSdW5zIGFmdGVyIHRoZSBJZnJhbWVTREtcbiAgICAgKiBoYW5kc2hha2U6IHRoZSBmcmFtZSByZXBvcnRzIGJvZHkgcmVzaXplcyBhbmQgdGhlIGhvc3QgcmUtcmVhZHMgdGhlIHNjcm9sbCBoZWlnaHQuXG4gICAgICovXG4gICAgb2JzZXJ2ZUhlaWdodFZpYUJyaWRnZSA9ICgpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9icmlkZ2VTaXplQ2xlYW51cCkgcmV0dXJuIHRoaXMuX2JyaWRnZVNpemVDbGVhbnVwO1xuXG4gICAgICAgIGxldCBvYnNlcnZlckNsZWFudXA6IENsZWFudXBIYW5kbGVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgICBvYnNlcnZlckNsZWFudXA/LigpO1xuICAgICAgICAgICAgdGhpcy5fYnJpZGdlU2l6ZUNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2JyaWRnZVNpemVDbGVhbnVwID0gY2xlYW51cDtcblxuICAgICAgICB0aGlzLmluaXRpYXRlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0b3BwZWQgfHwgdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCkgcmV0dXJuO1xuICAgICAgICAgICAgLy8gTGVhdmUgdGhlIGFic29sdXRlIDEwMCUgb3ZlcmxheSBhbmQgdGFrZSBwYXJ0IGluIHRoZSBjb250YWluZXIncyBsYXlvdXQuXG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmluc2V0ID0gJ2F1dG8nO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgICAgICBvYnNlcnZlckNsZWFudXAgPSB0aGlzLnNlbmQobmV3IFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSgpKTtcbiAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIC8vIE5vdCBmYXRhbDogdGhlIGNvbXBvbmVudCBzdGlsbCByZW5kZXJzLCBpdCBqdXN0IG5ldmVyIGdldHMgYSBoZWlnaHQgYW5kIHNpdHNcbiAgICAgICAgICAgIC8vIGF0IHRoZSBpZnJhbWUgZGVmYXVsdC4gV2l0aG91dCB0aGlzIGxpbmUgdGhhdCBpcyBjb21wbGV0ZWx5IGludmlzaWJsZSAtLVxuICAgICAgICAgICAgLy8gbm90aGluZyB0aHJvd3MsIG5vdGhpbmcgbG9ncywgYW5kIHRoZSBvbmx5IHN5bXB0b20gaXMgYSAxNTBweCBmcmFtZS4gQVxuICAgICAgICAgICAgLy8gc2lsZW50IHNpemluZyBmYWlsdXJlIG9mIGV4YWN0bHkgdGhpcyBzaGFwZSBpcyB3aGF0IG1hZGUgdGhlIGluaXQgcmFjZVxuICAgICAgICAgICAgLy8gKDIwMjYtMTAtMTcsIHNlZSBJTklULUhBTkRTSEFLRS5tZCkgdGFrZSBmb3VyIGRheXMgdG8gZmluZDogaW5pdGlhdGVkKClcbiAgICAgICAgICAgIC8vIHJlamVjdGVkLCB0aGlzIGNhdGNoIHN3YWxsb3dlZCBpdCwgYW5kIGF1dG8taGVpZ2h0IHNpbXBseSBuZXZlciBoYXBwZW5lZC5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgW015b3BJZnJhbWVDb21wb25lbnRdIGF1dG8taGVpZ2h0IHNraXBwZWQgZm9yICR7dGhpcy5pZH06ICR7ZX1gKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXA7XG4gICAgfVxuXG4gICAgc2V0U2l6ZUJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICByZXR1cm4ge2hlaWdodCwgd2lkdGh9XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3JldC5jb250ZW50LndpZHRofXB4YDtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudC5oZWlnaHR9cHhgO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyByZXR1cm4gd2luZG93LmRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0ICsgJ3B4JztcblxuXG4gICAgICAgICAgICAvL1RPRE86IGZpeCB0aGF0IGhhY2ssIGtlZXAgdGhlIGZ1bmN0aW9uIGluIHJpZ2h0IGZvcm1hdCB3aGlsZSBtaW5pZmllZCA6KFxuICAgICAgICAgICAgY29uc3Qgbm9PcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUbyBlbnN1cmUgaXQncyBub3Qgb3B0aW1pemVkIGF3YXksIHlvdSBjYW4gY2FsbCBpdCBhdCBsZWFzdCBvbmNlXG4gICAgICAgICAgICBsZXQgeCA9IG5vT3AoKTtcbiAgICAgICAgICAgIHgrKztcbiAgICAgICAgICAgIHgtLTtcblxuICAgICAgICAgICAgLy9yZXR1cm4gYCR7d2luZG93LmRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0fXB4YDtcblxuICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgdGhhdCArMSA/XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KVxuICAgICAgICAgICAgICAgICwgd2luZG93LmRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0KSArIHggKyAncHgnXG5cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IHJldC5jb250ZW50O1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZV8gPSB7Li4ubWVzc2FnZX0gYXMgQmFzZU15b3BNZXNzYWdlO1xuICAgICAgICAvL1RPRE8gOiA/IT8hIHNob3VsZCBpdCBiZSBoZXJlID9cbiAgICAgICAgaWYgKG1lc3NhZ2VfLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCkge1xuICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gKG1lc3NhZ2VfIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpXG4gICAgICAgICAgICB0aGlzW3R5cGVkTWVzc2FnZS5tZXRob2RdKCk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjayA6KFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlclxuXG4gICAgICAgIG1lc3NhZ2VfLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2VfKTtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50Py5jb250ZW50V2luZG93Py5wb3N0TWVzc2FnZShtZXNzYWdlXywgJyonKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9O1xuXG4gICAgb25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW4uTXV0YXRpb25PYnNlcnZlck1lc3NhZ2VcbiAgICAgICAgICAgIHx8IGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbi5SZXNpemVPYnNlcnZlck1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuICAgICAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICAgICAgLy90aGlzLnNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2JyaWRnZVNpemVDbGVhbnVwPy4oKTtcbiAgICAgICAgaWYgKHRoaXMuX2F1dG9TaXplQ2xlYW51cCkge1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVDbGVhbnVwKCk7XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2lzb01zZ0hhbmRsZXIpIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5faXNvTXNnSGFuZGxlcik7XG4gICAgICAgICAgICB0aGlzLl9pc29Nc2dIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNsZWFudXBJbnNwZWN0KVxuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCgpO1xuXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgLy8gT3B0aW9uYWwtY2hhaW5lZDogZGlzcG9zZSBub3cgYWxzbyBydW5zIGZvciBjb21wb25lbnRzIHRoYXQgbmV2ZXIgaW5pdGlhdGVkLCBhbmRcbiAgICAgICAgLy8gZm9yIHRob3NlIHRoZSBmcmFtZSBtYXkgYWxyZWFkeSBiZSBnb25lIC0tIHRoZSBkaWFsb2cgdGhhdCBjb250YWluZWQgaXQgd2FzIHRvcm5cbiAgICAgICAgLy8gZG93biwgb3IgaXQgd2FzIG5ldmVyIGF0dGFjaGVkLiBBIHRocm93IGhlcmUgd291bGQgYWJvcnQgdGhlIHJlc3Qgb2YgdGhlIGNsZWFudXAuXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLklmcmFtZUVsZW1lbnQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWcsIFNraW5Mb2FkZXJUeXBlfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BMb2FkZXIge1xuICAgIHR5cGU6IFNraW5Mb2FkZXJUeXBlO1xuICAgIGxvYWQ6IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiBQcm9taXNlPElNeW9wQ29tcG9uZW50Pjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wTG9hZGVyIGltcGxlbWVudHMgSU15b3BMb2FkZXIge1xuICAgIGFic3RyYWN0IHR5cGU6IFNraW5Mb2FkZXJUeXBlO1xuICAgIGFic3RyYWN0IGxvYWQ6IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiBQcm9taXNlPElNeW9wQ29tcG9uZW50PjtcblxuICAgIGFwcGVuZENoaWxkID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucywpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnJlbGF0aXZlKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZS5kaXJlY3Rpb24gPT09ICdiZWZvcmUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoZWxlbWVudCwgb3B0aW9ucy5yZWxhdGl2ZS5jaGlsZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlbGF0aXZlLmRpcmVjdGlvbiA9PT0gJ2FmdGVyJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gb3B0aW9ucy5yZWxhdGl2ZS5jaGlsZD8ubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoZWxlbWVudCwgbmV4dFNpYmxpbmcgPyBuZXh0U2libGluZyA6IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BJZnJhbWVDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJSWZyYW1lTG9hZGVyQ29uZmlnLCBJU2tpbkNvbmZpZywgU2tpbkxvYWRlcnN9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuY29uc3QgYWRkUXVlcnlQYXJhbSA9ICh1cmw6IHN0cmluZywgcGFyYW06IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgIC8vIENyZWF0ZSBhIFVSTCBvYmplY3RcbiAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cbiAgICAvLyBBZGQgdGhlIHF1ZXJ5IHBhcmFtZXRlclxuICAgIHVybE9iai5zZWFyY2hQYXJhbXMuYXBwZW5kKHBhcmFtLCB2YWx1ZSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHVwZGF0ZWQgVVJMXG4gICAgcmV0dXJuIHVybE9iai50b1N0cmluZygpO1xufVxuXG5leHBvcnQgY2xhc3MgTXlvcElmcmFtZUxvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuSWZyYW1lTG9hZGVyXG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG4gICAgICAgIGxldCBJZnJhbWVFbGVtZW50OiBIVE1MSUZyYW1lRWxlbWVudDtcblxuICAgICAgICBjb25zdCB0eXBlZExvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKTtcblxuICAgICAgICBpZiAoY29udGFpbmVyPy5ub2RlTmFtZSA9PT0gXCJJRlJBTUVcIikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ25lZWRzIHRvIGxvYWQgaW50byBhbiBleHNpc3RpbmcgSWZyYW1lLi4uJywgdHlwZWRMb2FkZXJDb25maWcudXJsLCBjb250YWluZXIpO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gKGNvbnRhaW5lciBhcyBIVE1MSUZyYW1lRWxlbWVudClcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3JjID0gdHlwZWRMb2FkZXJDb25maWcudXJsXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB1bmlxSWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgIGNvbnN0IGRvbUlkID0gYG15b3AtY29tcC0ke3VuaXFJZH1gXG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICAgICAgLy8gU2V0IGFsbCBzdHlsZXMgQkVGT1JFIGFwcGVuZGluZyB0byBwcmV2ZW50IGZsYXNoIGF0IHdyb25nIHBvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCBpZnJhbWVTdHlsZXMgPSBgXG4gICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgIGluc2V0OiAwO1xuICAgICAgICAgICAgICAgIGhlaWdodDogJHt0eXBlZExvYWRlckNvbmZpZy5hdXRvSGVpZ2h0IHx8ICF0eXBlZExvYWRlckNvbmZpZy5oZWlnaHQgPyAnMTAwJScgOiB0eXBlZExvYWRlckNvbmZpZy5oZWlnaHR9O1xuICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6ICR7b3B0aW9ucz8uaGlkZGVuID8gJzAnIDogJzEnfTtcbiAgICAgICAgICAgICAgICBwb2ludGVyLWV2ZW50czogJHtvcHRpb25zPy5oaWRkZW4gPyAnbm9uZScgOiAnYWxsJ307XG4gICAgICAgICAgICBgO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gaWZyYW1lU3R5bGVzO1xuXG4gICAgICAgICAgICAvLyBTZXQgZWxlbWVudCBhdHRyaWJ1dGVzIGlmIHByb3ZpZGVkXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uZWxlbWVudEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhvcHRpb25zLmVsZW1lbnRBdHRyaWJ1dGVzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNldEF0dHJpYnV0ZShrZXksICcnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gaGFuZGxlIGlzc3VlIHRvIGxvYWQgaWZyYW1lIGluc2lkZSBhbiBpZnJhbWUgd2l0aCB0aGUgc2FtZSB1cmxcbiAgICAgICAgICAgIGxldCB1cmwybG9hZCA9IChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKS51cmw7XG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uX2hhc1BhcmVudClcbiAgICAgICAgICAgICAgICB1cmwybG9hZCA9IGFkZFF1ZXJ5UGFyYW0odXJsMmxvYWQsIFwiX215b3AtY29tcFwiLCB1bmlxSWQpO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNyYyA9IHVybDJsb2FkO1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgICAgICAvLyAgIElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkb21JZCkgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgICAgICAvL05PIDogSWZyYW1lRWxlbWVudCA9IGNvbnRhaW5lci5sYXN0RWxlbWVudENoaWxkIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IE15b3BJZnJhbWVDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAvLyBgYXV0b0hlaWdodGAgaW4gdGhlIHYxIGNvbmZpZyB1c2VkIHRvIG9ubHkgc2V0IGhlaWdodDoxMDAlIG9uIGFuIGFic29sdXRlIGZyYW1lLCBzbyBpbiBhblxuICAgICAgICAvLyB1bnNpemVkIGNvbnRhaW5lciB0aGUgZnJhbWUgc3RheWVkIGF0IHRoZSAxNTBweCBDU1MgZGVmYXVsdC5cbiAgICAgICAgaWYgKHR5cGVkTG9hZGVyQ29uZmlnLmF1dG9IZWlnaHQgJiYgb3B0aW9ucz8uYXV0b1NpemUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjb21wb25lbnQub2JzZXJ2ZUhlaWdodFZpYUJyaWRnZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IG15b3BXZWJjb21wb25lbnRDb25zdHMgPSB7XG4gICAgd2ViY29tcG9uZW50X21lc3NhZ2Vfa2V5OiAnbXlvcF93ZWJjb21wb25lbnRfbWVzc2FnZSdcbn1cbiIsICJpbXBvcnQge215b3BXZWJjb21wb25lbnRDb25zdHN9IGZyb20gXCIuLi8uLi93ZWJjb21wb25lbnQvY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge3NldERlYnVnU3R5bGV9IGZyb20gXCIuLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wV2ViQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHJpdmF0ZSBjdXN0b21FbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoY29tcG9uZW50RGVmaW5pdGlvbiwgY29udGFpbmVyICwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGN1c3RvbUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgY2xlYW51cEluc3BlY3Q6IENsZWFudXBIYW5kbGVyID0gKCkgPT4ge1xuICAgIH1cblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSBzZXREZWJ1Z1N0eWxlKHRoaXMuaWQsICdNeW9wV2ViQ29tcG9uZW50JywgMCwgdGhpcy5jb250YWluZXIsIHRoaXMuY3VzdG9tRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cEluc3BlY3Q7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcxJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3Vuc2V0J1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhbGwnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcnO1xuICAgIH1cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlPGFueT4pID0+IHtcbiAgICAgICAgbGV0IG1lc3NhZ2VfID0gey4uLm1lc3NhZ2V9IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAvL1RPRE8gOiBjYW4gYmUgZG9uZSB3aXRob3V0IGNsb25pbmc/XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9jb25zdCBoYW5kbGVyID0gbWVzc2FnZV8uaGFuZGxlclxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZV8pO1xuXG4gICAgICAgIGNvbnN0IG1zZyA9IG5ldyBDdXN0b21FdmVudDxCYXNlTXlvcE1lc3NhZ2U+KG15b3BXZWJjb21wb25lbnRDb25zdHMud2ViY29tcG9uZW50X21lc3NhZ2Vfa2V5LCB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBkZXRhaWw6IG1lc3NhZ2VfLFxuICAgICAgICAgICAgLy8gYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIC8vIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgLy8gY29tcG9zZWQ6IHRydWVcbiAgICAgICAgfSlcblxuICAgICAgICAvL3RoaXMuY29udGFpbmVyLmRpc3BhdGNoRXZlbnQobXNnKVxuXG4gICAgICAgIC8vc2VuZGluZyBkYXRhIGZyb20gaG9zdCB0byB0aGUgY29tcG9uZW50XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuZGlzcGF0Y2hFdmVudChtc2cpXG4gICAgICAgICAgICAvLyBpZiAodGhpcy5jdXN0b21FbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5jdXN0b21FbGVtZW50LmNoaWxkcmVuWzBdLmRpc3BhdGNoRXZlbnQobXNnKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGRpc3BhdGNoRXZlbnQnLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9tZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH1cblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKHRoaXMuY3VzdG9tRWxlbWVudCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcFdlYkNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcExvYWRlcn0gZnJvbSBcIi4vSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcbmltcG9ydCB7dXVpZHY0LCB3YWl0fSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnLCBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnLCBTa2luTG9hZGVyc30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5jb25zdCBzZWVuOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PiA9IHt9O1xuXG5leHBvcnQgY2xhc3MgV2ViY29tcG9uZW50TG9hZGVyIGV4dGVuZHMgQmFzZU15b3BMb2FkZXIge1xuXG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLldlYkNvbXBvbmVudExvYWRlclxuXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG5cbiAgICAgICAgY29uc3QgbG9hZGVyQ29uZmlnID0gKHNraW4ubG9hZGVyIGFzIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcpO1xuXG4gICAgICAgIGlmICghc2Vlbltsb2FkZXJDb25maWcudXJsXSkge1xuICAgICAgICAgICAgLy8gYXdhaXQgaW1wb3J0KCAvKiBAdml0ZS1pZ25vcmUgKi8gd2ViQ29tcG9uZW50TG9hZFVybCk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbW9kdWxlIGxvYWRlZCcpO1xuICAgICAgICAgICAgc2Vlbltsb2FkZXJDb25maWcudXJsXSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB3ZWJDb21wb25lbnRMb2FkVXJsID0gbG9hZGVyQ29uZmlnLnVybFxuICAgICAgICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICAgICAgICAgIHNjcmlwdC50eXBlID0gJ21vZHVsZSc7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnNyYyA9IHdlYkNvbXBvbmVudExvYWRVcmw7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNjcmlwdC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdNb2R1bGUgYWxyZWRheSBsb2FkZWQgb3IgaW4gbG9hZGluZyBwcm9jZXNzJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBzZWVuW2xvYWRlckNvbmZpZy51cmxdO1xuXG4gICAgICAgIC8vVE9ETyA6IGFkZCByZXRyeSBtZWNoYW5pc20gaW4gZmFpbCBjYXNlLlxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2ssIHNob3VsZCBmaXggdGhlIHJhY2UgY29uZGl0aW9uIGZvciBsb2FkZWQgbW9kdWxlc1xuICAgICAgICBhd2FpdCB3YWl0KDEpO1xuXG4gICAgICAgIGxldCBkb21JZCA9IGBteW9wLWNvbXAtJHt1dWlkdjQoKX1gXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGxvYWRlckNvbmZpZy50YWcpO1xuXG4gICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgLy9lbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgZWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgIGlmIChvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIChjb250YWluZXIuaWQuc3RhcnRzV2l0aCgnbXlvcC1jb21wLScpKSB7XG4gICAgICAgIC8vICAgICAvLyBpbiBwbGFjZSByZXBsYWNlbWVudFxuICAgICAgICAvLyAgICAgY29udGFpbmVyLnJlcGxhY2VXaXRoKGVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgLy9jb250YWluZXIgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQhO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYob3B0aW9ucz8uX2Vudmlyb25tZW50KXtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsZW1lbnQuX215b3BFbnZpcm9ubWVudCA9IG9wdGlvbnM/Ll9lbnZpcm9ubWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICAgICAgLy9lbGVtZW50LmlubmVySFRNTCA9IGA8JHtsb2FkZXJDb25maWcudGFnfSAvPmA7XG4gICAgICAgIHJldHVybiBuZXcgTXlvcFdlYkNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cblxufVxuIiwgImV4cG9ydCBkZWZhdWx0ICcwLjQuMC1iZXRhLjQnOyIsICIvKipcbiAqIFRoZSBjbGllbnQgd2luZG93OiB3aGF0IGEgcmV0dXJuaW5nIHZpc2l0b3IgZG9lcyBOT1QgYXNrIGZvci5cbiAqXG4gKiBBIGNvbXBvbmVudCB0aGUgYnJvd3NlciBhbHJlYWR5IGhvbGRzLCBzdGlsbCBpbnNpZGUgaXRzIGZyZXNobmVzcyB3aW5kb3csIGlzIHJlbmRlcmVkXG4gKiB3aXRoIG5vIG5ldHdvcmsgYXQgYWxsLiBPbmNlIHRoZSB3aW5kb3cgZW5kcyB0aGUgYnJvd3NlciBkb2VzIG5vdCByZS1kb3dubG9hZCBpdCBlaXRoZXJcbiAqIFx1MjAxNCBpdCBzZW5kcyBiYWNrIHRoZSB2ZXJzaW9uIGl0IGhvbGRzIGFuZCBpcyB1c3VhbGx5IHRvbGQgXCJ1bmNoYW5nZWRcIiBpbiBhIGZldyBodW5kcmVkXG4gKiBieXRlcy5cbiAqXG4gKiBUSEUgV0lORE9XIElTIFRIRSBTRVJWRVInUywgTk9UIE9VUlMuIEl0IGNvbWVzIGZyb20gdGhlIHJlc3BvbnNlOiBgcy1tYXhhZ2VgIGlzIHRoZVxuICogZnJlc2huZXNzIHRoZSBzZXJ2ZXIgcHJvbWlzZWQsIGFuZCBgQWdlYCBpcyBob3cgbXVjaCBvZiBpdCBhIENETiBhbHJlYWR5IHNwZW50IGJlZm9yZVxuICogdGhlIGJ5dGVzIHJlYWNoZWQgdXMuIFRoZSB3aW5kb3cgd2UgbWF5IGtlZXAgaXMgdGhlcmVmb3JlIGBzLW1heGFnZSAtIEFnZWAsIG5ldmVyXG4gKiBgcy1tYXhhZ2VgIFx1MjAxNCBvdGhlcndpc2UgYSBjb3B5IHRoYXQgc2F0IGF0IHRoZSBlZGdlIGZvciA1NSBvZiBpdHMgNjAgc2Vjb25kcyB3b3VsZCBiZVxuICogaGVsZCBmb3IgYW5vdGhlciA2MCBoZXJlLCBhbmQgYSBwdWJsaXNoIHdvdWxkIHRha2UgdHdpY2UgYXMgbG9uZyB0byBiZSBzZWVuIGFzIHByb21pc2VkLlxuICogVGhpcyBpcyB0aGUgc2luZ2xlIGVhc2llc3QgdGhpbmcgdG8gZ2V0IHdyb25nIGluIGEgY2xpZW50IGNhY2hlLCBhbmQgaXQgaXMgaW52aXNpYmxlIGluXG4gKiB0ZXN0aW5nIGJlY2F1c2UgaXQgb25seSBzaG93cyB1cCBhcyBcInNvbWV0aW1lcyBzdGFsZVwiLlxuICpcbiAqIEluZGV4ZWREQiwgbm90IGxvY2FsU3RvcmFnZTogY29tcG9uZW50cyBydW4gdG8gaHVuZHJlZHMgb2YgS0IsIGxvY2FsU3RvcmFnZSBjYXBzIGFyb3VuZFxuICogNSBNQiBhbmQgYmxvY2tzIHRoZSBtYWluIHRocmVhZC4gRXZlcnkgcGF0aCBkZWdyYWRlcyB0byB0aGUgbmV0d29yayBcdTIwMTQgYSBicm93c2VyIGluXG4gKiBwcml2YXRlIG1vZGUsIHdpdGggc3RvcmFnZSBkaXNhYmxlZCBvciBvdmVyIHF1b3RhLCBtdXN0IHJlbmRlciB0aGUgcGFnZSwgbm90IGZhaWwgaXQuXG4gKi9cblxuY29uc3QgREJfTkFNRSA9ICdteW9wLWRlbGl2ZXJ5JztcbmNvbnN0IFNUT1JFID0gJ2NvbXBvbmVudHMnO1xuY29uc3QgREJfVkVSU0lPTiA9IDE7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmVkRW50cnkge1xuICAgIGtleTogc3RyaW5nO1xuICAgIC8qKiB0aGUgcmVzb2x2ZWQgY29tcG9uZW50IGNvbmZpZywgZXhhY3RseSBhcyB0aGUgbmV0d29yayBwYXRoIHByb2R1Y2VzIGl0ICovXG4gICAgY29uZmlnOiBhbnk7XG4gICAgLyoqIHRoZSBzZXJ2ZXIncyB2ZXJzaW9uIHRva2VuIGZvciB0aGVzZSBieXRlczogYDxyZXY+fjxvcHQ+YCAqL1xuICAgIHRhZzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogd2hlbiB0aGlzIGJyb3dzZXIgc3RvcmVkIGl0ICovXG4gICAgc3RvcmVkQXQ6IG51bWJlcjtcbiAgICAvKiogaG93IGxvbmcgaXQgbWF5IGJlIHVzZWQgd2l0aG91dCBhc2tpbmcsIGluIG1zIChhbHJlYWR5IEFnZS1hZGp1c3RlZCkgKi9cbiAgICB3aW5kb3dNczogbnVtYmVyO1xuICAgIC8qKiB3aGljaCBob3N0IHByb2R1Y2VkIGl0IFx1MjAxNCBhIGtleSBmcm9tIGFub3RoZXIgaG9zdCBpcyBuZXZlciByZXVzZWQgKi9cbiAgICBob3N0OiBzdHJpbmc7XG4gICAgLyoqIHdpcmUgc2l6ZSBvZiB0aGUgcmVzcG9uc2UgaXQgY2FtZSBmcm9tLCBzbyBzdGF0cyBjYW4gc2F5IHdoYXQgdGhlIHdpbmRvdyBzYXZlZCAqL1xuICAgIGJ5dGVzPzogbnVtYmVyO1xufVxuXG5sZXQgZGJQcm9taXNlOiBQcm9taXNlPElEQkRhdGFiYXNlIHwgbnVsbD4gfCBudWxsID0gbnVsbDtcblxuZnVuY3Rpb24gb3BlbkRiKCk6IFByb21pc2U8SURCRGF0YWJhc2UgfCBudWxsPiB7XG4gICAgaWYgKGRiUHJvbWlzZSkgcmV0dXJuIGRiUHJvbWlzZTtcbiAgICBkYlByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbmRleGVkREIgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcSA9IGluZGV4ZWREQi5vcGVuKERCX05BTUUsIERCX1ZFUlNJT04pO1xuICAgICAgICAgICAgcmVxLm9udXBncmFkZW5lZWRlZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYiA9IHJlcS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKFNUT1JFKSkgZGIuY3JlYXRlT2JqZWN0U3RvcmUoU1RPUkUsIHsga2V5UGF0aDogJ2tleScgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUocmVxLnJlc3VsdCk7XG4gICAgICAgICAgICByZXEub25lcnJvciA9ICgpID0+IHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICAvLyBBIGJsb2NrZWQgdXBncmFkZSBtdXN0IG5vdCBoYW5nIHRoZSBwYWdlIGxvYWQuXG4gICAgICAgICAgICByZXEub25ibG9ja2VkID0gKCkgPT4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRiUHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gdHg8VD4obW9kZTogSURCVHJhbnNhY3Rpb25Nb2RlLCBmbjogKHN0b3JlOiBJREJPYmplY3RTdG9yZSkgPT4gSURCUmVxdWVzdCk6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgICByZXR1cm4gb3BlbkRiKCkudGhlbihkYiA9PiBuZXcgUHJvbWlzZTxUIHwgbnVsbD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgaWYgKCFkYikgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZGIudHJhbnNhY3Rpb24oU1RPUkUsIG1vZGUpO1xuICAgICAgICAgICAgY29uc3QgcmVxID0gZm4odC5vYmplY3RTdG9yZShTVE9SRSkpO1xuICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUocmVxLnJlc3VsdCBhcyBUKTtcbiAgICAgICAgICAgIHJlcS5vbmVycm9yID0gKCkgPT4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgIHQub25hYm9ydCA9ICgpID0+IHJlc29sdmUobnVsbCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgfVxuICAgIH0pKTtcbn1cblxuLyoqXG4gKiBBIFNZTkNIUk9OT1VTIHNoYWRvdyBvZiB3aGF0IHdlIGhvbGQsIGZvciBjb2RlIHRoYXQgcnVucyBiZWZvcmUgSW5kZXhlZERCIGNhbiBhbnN3ZXIuXG4gKlxuICogVGhlIHBhZ2UncyBIVE1MIGNhbiBzdGFydCB0aGUgY29tcG9uZW50IHJlcXVlc3Qgd2hpbGUgdGhlIEpTIGJ1bmRsZSBpcyBzdGlsbCBkb3dubG9hZGluZ1xuICogXHUyMDE0IGJ1dCBvbmx5IGlmIGl0IGtub3dzLCBhdCBwYXJzZSB0aW1lLCB3aGV0aGVyIGEgcmVxdWVzdCBpcyBuZWVkZWQgYXQgYWxsIGFuZCB3aGljaCBvbmUuXG4gKiBJbmRleGVkREIgaXMgYXN5bmMsIHNvIGFuIGlubGluZSBzY3JpcHQgY2Fubm90IGFzayBpdC4gbG9jYWxTdG9yYWdlIGNhbiBiZSByZWFkXG4gKiBzeW5jaHJvbm91c2x5LCBzbyBlYWNoIGVudHJ5IG1pcnJvcnMgdHdvIHRpbnkgZmFjdHMgaGVyZTogdGhlIHZlcnNpb24gdGFnIGFuZCB3aGVuIHRoZVxuICogd2luZG93IGVuZHMuIE5vdGhpbmcgZWxzZSBcdTIwMTQgdGhlIGNvbXBvbmVudCBpdHNlbGYgc3RheXMgaW4gSW5kZXhlZERCIHdoZXJlIGl0IGJlbG9uZ3MuXG4gKlxuICogV2l0aG91dCB0aGlzIHRoZSBwcmVsb2FkIGhpbnQgaXMgYWN0aXZlbHkgaGFybWZ1bDogaXQgZG93bmxvYWRzIHRoZSB3aG9sZSBjb21wb25lbnRcbiAqIGV2ZXJ5IHRpbWUsIGluY2x1ZGluZyBvbiB0aGUgdmlzaXRzIHdoZXJlIHRoZSBzdG9yZWQgY29weSB3YXMgZ29pbmcgdG8gYW5zd2VyIGZvciBmcmVlLlxuICogTWVhc3VyZWQgb24gbXlvcC5kZXYgYmVmb3JlIGl0IGV4aXN0ZWQgXHUyMDE0IDk4IEtCIGZldGNoZWQsIHRoZW4gZGlzY2FyZGVkLCBvbiBldmVyeSByZWxvYWQuXG4gKi9cbmNvbnN0IEhJTlRfUFJFRklYID0gJ215b3AuZC4nO1xuXG5mdW5jdGlvbiB3cml0ZUhpbnQoa2V5OiBzdHJpbmcsIHRhZzogc3RyaW5nIHwgbnVsbCwgZXhwaXJlc0F0OiBudW1iZXIpIHtcbiAgICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShISU5UX1BSRUZJWCArIGtleSwgSlNPTi5zdHJpbmdpZnkoeyB0OiB0YWcsIGU6IGV4cGlyZXNBdCB9KSk7IH1cbiAgICBjYXRjaCB7IC8qIHByaXZhdGUgbW9kZSwgcXVvdGEsIGRpc2FibGVkIFx1MjAxNCB0aGUgaGludCBpcyBhbiBvcHRpbWlzYXRpb24sIG5ldmVyIGEgcmVxdWlyZW1lbnQgKi8gfVxufVxuXG5mdW5jdGlvbiBjbGVhckhpbnQoa2V5OiBzdHJpbmcpIHtcbiAgICB0cnkgeyBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShISU5UX1BSRUZJWCArIGtleSk7IH0gY2F0Y2ggeyAvKiBhcyBhYm92ZSAqLyB9XG59XG5cbi8qKiBBIG1lbW9yeSBsYXllciBpbiBmcm9udCBvZiBzdG9yYWdlOiBhIHNlY29uZCBjb21wb25lbnQgb24gdGhlIHNhbWUgcGFnZSBtdXN0IG5vdCB3YWl0IG9uIElPLiAqL1xuY29uc3QgbWVtb3J5ID0gbmV3IE1hcDxzdHJpbmcsIFN0b3JlZEVudHJ5PigpO1xuXG5leHBvcnQgY29uc3QgZGVsaXZlcnlTdG9yZSA9IHtcbiAgICBrZXkoaG9zdDogc3RyaW5nLCBjb21wb25lbnRJZDogc3RyaW5nLCBlbnY6IHN0cmluZywgcHJldmlldzogYm9vbGVhbiwgb3B0OiBzdHJpbmcpIHtcbiAgICAgICAgLy8gVGhlIEhPU1QgaXMgcGFydCBvZiB0aGUga2V5LiBUd28gc3RhY2tzIGNhbiBzZXJ2ZSB0aGUgc2FtZSBjb21wb25lbnQgd2l0aFxuICAgICAgICAvLyBkaWZmZXJlbnQgZnJlc2huZXNzLCBhbmQgZW50cmllcyBmcm9tIG9uZSBtdXN0IG5ldmVyIGJlIHJlYWQgYXMgdGhlIG90aGVyJ3MuXG4gICAgICAgIHJldHVybiBgJHtob3N0fXwke2NvbXBvbmVudElkfXwke2Vudn18JHtwcmV2aWV3ID8gJ3ByZXZpZXcnIDogJ2xpdmUnfXwke29wdCB8fCAncmF3J31gO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPFN0b3JlZEVudHJ5IHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBtID0gbWVtb3J5LmdldChrZXkpO1xuICAgICAgICBpZiAobSkgcmV0dXJuIG07XG4gICAgICAgIGNvbnN0IGUgPSBhd2FpdCB0eDxTdG9yZWRFbnRyeT4oJ3JlYWRvbmx5JywgcyA9PiBzLmdldChrZXkpKTtcbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIG1lbW9yeS5zZXQoa2V5LCBlKTtcbiAgICAgICAgICAgIC8vIFNFTEYtSEVBTC4gVGhlIHR3byBzdG9yZXMgY2FuIGRpc2FncmVlOiBhbiBlbnRyeSB3cml0dGVuIGJlZm9yZSB0aGUgaGludFxuICAgICAgICAgICAgLy8gZXhpc3RlZCwgYSBicm93c2VyIHRoYXQgZXZpY3RlZCBsb2NhbFN0b3JhZ2UgYnV0IG5vdCBJbmRleGVkREIsIGEgdXNlciB3aG9cbiAgICAgICAgICAgIC8vIGNsZWFyZWQgb25lLiBBIG1pc3NpbmcgaGludCBtYWtlcyB0aGUgcHJlbG9hZCBmYWxsIGJhY2sgdG8gdGhlIEZVTEwgY29tcG9uZW50XG4gICAgICAgICAgICAvLyB3aGlsZSB0aGUgU0RLLCB3aGljaCBjYW4gc2VlIEluZGV4ZWREQiwgb25seSB3YW50cyB0aGUgdmVyc2lvbiBjaGVjayAtLSB0d29cbiAgICAgICAgICAgIC8vIHJlcXVlc3RzIHdoZXJlIHRoZXJlIHNob3VsZCBiZSBvbmUuIFNlZW4gaW4gdGhlIHdpbGQgb24gdGhlIGZpcnN0IGxvYWQgYWZ0ZXJcbiAgICAgICAgICAgIC8vIHRoZSBoaW50IHNoaXBwZWQuIFJld3JpdGluZyBpdCBoZXJlIGNvc3RzIG5vdGhpbmcgYW5kIGNsb3NlcyB0aGUgZ2FwIGZvciBnb29kLlxuICAgICAgICAgICAgd3JpdGVIaW50KGtleSwgZS50YWcsIGUuc3RvcmVkQXQgKyBlLndpbmRvd01zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZTtcbiAgICB9LFxuXG4gICAgYXN5bmMgcHV0KGVudHJ5OiBTdG9yZWRFbnRyeSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBtZW1vcnkuc2V0KGVudHJ5LmtleSwgZW50cnkpO1xuICAgICAgICB3cml0ZUhpbnQoZW50cnkua2V5LCBlbnRyeS50YWcsIGVudHJ5LnN0b3JlZEF0ICsgZW50cnkud2luZG93TXMpO1xuICAgICAgICBhd2FpdCB0eCgncmVhZHdyaXRlJywgcyA9PiBzLnB1dChlbnRyeSkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBkcm9wKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIG1lbW9yeS5kZWxldGUoa2V5KTtcbiAgICAgICAgY2xlYXJIaW50KGtleSk7XG4gICAgICAgIGF3YWl0IHR4KCdyZWFkd3JpdGUnLCBzID0+IHMuZGVsZXRlKGtleSkpO1xuICAgIH0sXG5cbiAgICAvKiogU3RpbGwgdXNhYmxlIHdpdGhvdXQgYXNraW5nIHRoZSBzZXJ2ZXI/ICovXG4gICAgZnJlc2goZTogU3RvcmVkRW50cnkgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIWUgJiYgKERhdGUubm93KCkgLSBlLnN0b3JlZEF0KSA8IGUud2luZG93TXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB3aW5kb3cgdGhpcyByZXNwb25zZSBsaWNlbnNlczogdGhlIHNlcnZlcidzIGZyZXNobmVzcyBtaW51cyB3aGF0IGEgQ0ROIGFscmVhZHlcbiAgICAgKiBzcGVudC4gUmV0dXJucyAwIHdoZW4gdGhlIHNlcnZlciBzYWlkIG5vdGhpbmcgYWJvdXQgY2FjaGluZywgd2hpY2ggbWVhbnMgXCJkbyBub3RcbiAgICAgKiBob2xkIHRoaXNcIiBcdTIwMTQgdGhlIHNhZmUgcmVhZGluZywgYW5kIHdoYXQgcHJvZHVjdGlvbiBzZW5kcyB0b2RheS5cbiAgICAgKi9cbiAgICB3aW5kb3dGcm9tKGhlYWRlcnM6IEhlYWRlcnMpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBjYyA9IGhlYWRlcnMuZ2V0KCdjYWNoZS1jb250cm9sJykgfHwgJyc7XG4gICAgICAgIGlmICgvbm8tc3RvcmV8bm8tY2FjaGUvaS50ZXN0KGNjKSkgcmV0dXJuIDA7XG4gICAgICAgIGNvbnN0IG0gPSAvcy1tYXhhZ2VcXHMqPVxccyooXFxkKykvaS5leGVjKGNjKSB8fCAvbWF4LWFnZVxccyo9XFxzKihcXGQrKS9pLmV4ZWMoY2MpO1xuICAgICAgICBpZiAoIW0pIHJldHVybiAwO1xuICAgICAgICBjb25zdCB0b3RhbCA9IE51bWJlcihtWzFdKTtcbiAgICAgICAgY29uc3QgYWdlID0gTnVtYmVyKGhlYWRlcnMuZ2V0KCdhZ2UnKSB8fCAwKTtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsICh0b3RhbCAtIChpc05hTihhZ2UpID8gMCA6IGFnZSkpKSAqIDEwMDA7XG4gICAgfSxcblxuICAgIC8qKiBGb3IgdGVzdHMgYW5kIGZvciBgcmVmcmVzaCgpYDogZm9yZ2V0IGV2ZXJ5dGhpbmcgdGhpcyBicm93c2VyIGhvbGRzLiAqL1xuICAgIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBtZW1vcnkuY2xlYXIoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBsb2NhbFN0b3JhZ2UubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrID0gbG9jYWxTdG9yYWdlLmtleShpKTtcbiAgICAgICAgICAgICAgICBpZiAoayAmJiBrLnN0YXJ0c1dpdGgoSElOVF9QUkVGSVgpKSBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7IC8qIG5vdGhpbmcgdG8gY2xlYW4gdXAgaWYgaXQgd2FzIG5ldmVyIHdyaXRhYmxlICovIH1cbiAgICAgICAgYXdhaXQgdHgoJ3JlYWR3cml0ZScsIHMgPT4gcy5jbGVhcigpKTtcbiAgICB9LFxufTtcbiIsICJpbXBvcnQge1xuICAgIElDb21wb25lbnRDb25maWcsXG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnLFxuICAgIElEZWRpY2F0ZWRTa2luQ29uZmlnLFxuICAgIElQcm9wQ29uZmlnLFxuICAgIElTa2luQ29uZmlnLFxuICAgIElVc2VyRmxvdyxcbiAgICBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyxcbiAgICB2Ml9JVmFyaWFudENvbmZpZ1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQgeyBkZWxpdmVyeVN0b3JlIH0gZnJvbSBcIi4vZGVsaXZlcnlTdG9yZVwiO1xuXG5jb25zdCBjb252ZXJ0VjJWYXJpYW50VG9Db21wb25lbnRDb25maWcgPSAoY29uZmlnOiB2Ml9JVmFyaWFudENvbmZpZyk6IElDb21wb25lbnRDb25maWcgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIGluc3RhbmNlOiB7XG4gICAgICAgICAgICBpZDogJ2F1dG8nLFxuICAgICAgICAgICAgY29tcG9uZW50SWQ6IGNvbmZpZy5jb21wb25lbnRJZCxcbiAgICAgICAgICAgIGNvbXBvbmVudE5hbWU6IGNvbmZpZy5uYW1lLFxuXG4gICAgICAgICAgICBza2luU2VsZWN0b3I6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnRGVkaWNhdGVkJyxcbiAgICAgICAgICAgICAgICBza2luOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnc2tpbl9hdXRvX3YyX2NvbnZlcnRlZCdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnXG5cbiAgICAgICAgfSBhcyBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIGlkOiBjb25maWcuaWQsXG4gICAgICAgICAgICBuYW1lOiBjb25maWcubmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBjb25maWcuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBwcm9wczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdpbl9hdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdteW9wX2luaXRfaW50ZXJmYWNlJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FueScsXG4gICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGFzIElQcm9wQ29uZmlnLFxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ291dF9hdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdteW9wX2N0YV9oYW5kbGVyJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FueScsXG4gICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGFzIElQcm9wQ29uZmlnXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVmczogW10sXG4gICAgICAgICAgICBza2luczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdza2luX2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBoYW5kbGUgZW1wdHkgOlxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlcjogY29uZmlnLmNvbnN1bWVfdmFyaWFudFswXS5sb2FkZXJcbiAgICAgICAgICAgICAgICB9IGFzIElTa2luQ29uZmlnXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgZGVmYXVsdFNraW46IDBcbiAgICAgICAgfSBhcyBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICAgICAgbmFtZTogY29uZmlnLm5hbWVcbiAgICB9IGFzIElDb21wb25lbnRDb25maWc7XG59O1xuXG4vKipcbiAqIENsb3VkUmVwb3NpdG9yeSAtIFVuaWZpZWQgY2xvdWQgZGF0YSBhY2Nlc3MgbGF5ZXIgZm9yIE15b3AgY29tcG9uZW50c1xuICpcbiAqIFN1cHBvcnRzIGJvdGggdjIgKGRlZmF1bHQpIGFuZCB2MSBtb2RlczpcbiAqIC0gdjI6IFVzZXMgL2NvbnN1bWUgZW5kcG9pbnQgZm9yIGZldGNoaW5nIHZhcmlhbnRzXG4gKiAtIHYxOiBVc2VzIC9mbG93IGVuZHBvaW50IGZvciBmZXRjaGluZyB1c2VyIGZsb3dzXG4gKi9cbi8vIFVzZSBhIGdsb2JhbCBzaW5nbGV0b24gdG8gZW5zdXJlIG9ubHkgb25lIENsb3VkUmVwb3NpdG9yeS5NYWluIGV4aXN0c1xuLy8gZXZlbiB3aGVuIHRoZSBtb2R1bGUgaXMgbG9hZGVkIG11bHRpcGxlIHRpbWVzIGJ5IGRpZmZlcmVudCBidW5kbGVyc1xuY29uc3QgR0xPQkFMX0tFWSA9ICdfX01ZT1BfQ0xPVURfUkVQT1NJVE9SWV9NQUlOX18nO1xuXG5jb25zdCBnZXRHbG9iYWxNYWluID0gKCk6IENsb3VkUmVwb3NpdG9yeSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiAod2luZG93IGFzIGFueSlbR0xPQkFMX0tFWV07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIGFueSlbR0xPQkFMX0tFWV07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCBzZXRHbG9iYWxNYWluID0gKGluc3RhbmNlOiBDbG91ZFJlcG9zaXRvcnkpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgKHdpbmRvdyBhcyBhbnkpW0dMT0JBTF9LRVldID0gaW5zdGFuY2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgKGdsb2JhbFRoaXMgYXMgYW55KVtHTE9CQUxfS0VZXSA9IGluc3RhbmNlO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjbGFzcyBDbG91ZFJlcG9zaXRvcnkge1xuICAgIHByaXZhdGUgc3RhdGljIF9tYWluOiBDbG91ZFJlcG9zaXRvcnkgfCBudWxsID0gbnVsbDtcblxuICAgIHN0YXRpYyBnZXQgTWFpbigpOiBDbG91ZFJlcG9zaXRvcnkge1xuICAgICAgICAvLyBDaGVjayBpZiBhIGdsb2JhbCBpbnN0YW5jZSBhbHJlYWR5IGV4aXN0cyAoZnJvbSBhbm90aGVyIGJ1bmRsZSlcbiAgICAgICAgY29uc3QgZ2xvYmFsTWFpbiA9IGdldEdsb2JhbE1haW4oKTtcbiAgICAgICAgaWYgKGdsb2JhbE1haW4pIHtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWxNYWluO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIG5ldyBpbnN0YW5jZSBpZiBuZWVkZWRcbiAgICAgICAgaWYgKCFDbG91ZFJlcG9zaXRvcnkuX21haW4pIHtcbiAgICAgICAgICAgIENsb3VkUmVwb3NpdG9yeS5fbWFpbiA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoKTtcbiAgICAgICAgICAgIHNldEdsb2JhbE1haW4oQ2xvdWRSZXBvc2l0b3J5Ll9tYWluKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ2xvdWRSZXBvc2l0b3J5Ll9tYWluO1xuICAgIH1cblxuICAgIC8vIHYyIGNhY2hlIC0ga2V5ZWQgYnkgY29tcG9uZW50SWQ6ZW52OnByZXZpZXd8bGl2ZVxuICAgIC8vIEVhY2ggUHJvbWlzZSBpcyB0YWdnZWQgd2l0aCBhIGByZXNvbHZlZGAgcHJvcGVydHkgYWZ0ZXIgc2V0dGxpbmcgKHNlZSBmZXRjaENvbXBvbmVudFYyKS5cbiAgICBwcml2YXRlIHZhcmlhbnRzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPElDb21wb25lbnRDb25maWc+ICYgeyByZXNvbHZlZD86IElDb21wb25lbnRDb25maWcgfT4gPSB7fTtcblxuICAgIC8vIFRyYWNrIHdoaWNoIGNvbXBvbmVudHMgd2VyZSBwcmVsb2FkZWQgYW5kIHdpdGggd2hhdCBwYXJhbXNcbiAgICAvLyBLZXk6IGNvbXBvbmVudElkLCBWYWx1ZTogeyBlbnYsIHByZXZpZXcgfVxuICAgIHByaXZhdGUgcHJlbG9hZGVkQ29tcG9uZW50czogUmVjb3JkPHN0cmluZywgeyBlbnY6IHN0cmluZzsgcHJldmlldzogYm9vbGVhbiB9PiA9IHt9O1xuXG4gICAgLy8gdjEgY2FjaGVcbiAgICBwcml2YXRlIHVzZXJGbG93czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJVXNlckZsb3c+PiA9IHt9O1xuXG4gICAgcHJpdmF0ZSBfZGVmYXVsdEVudiA9ICdwcm9kdWN0aW9uJztcbiAgICBwcml2YXRlIF9lbnZFeHBsaWNpdGx5U2V0ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfc3RhdGljTW9kZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3F1ZXJ5UGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9iYXNlVXJsID0gJ2h0dHBzOi8vY2xvdWQubXlvcC5kZXYnKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSG93IGJpZyB0aGUgY29tcG9uZW50IHdlIGFyZSBOT1QgcmUtZG93bmxvYWRpbmcgaXMuIERlbGliZXJhdGVseSBtZWFzdXJlZCBmcm9tIHdoYXRcbiAgICAgKiB3ZSBob2xkIHJhdGhlciB0aGFuIGZyb20gQ29udGVudC1MZW5ndGg6IG9uY2UgYSByZXNwb25zZSBpcyBjb21wcmVzc2VkIHRoZSBoZWFkZXIgaXNcbiAgICAgKiBub3QgcmVhZGFibGUgY3Jvc3Mtb3JpZ2luLCBzbyByZWFkaW5nIGl0IHRoZXJlIHJlcG9ydGVkIDAgZXZlcnkgc2luZ2xlIHRpbWUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgc2l6ZU9mSGVsZChlOiBhbnkpOiBudW1iZXIge1xuICAgICAgICB0cnkgeyByZXR1cm4gKGU/LmNvbmZpZz8udHlwZT8uc2tpbnM/LlswXT8ubG9hZGVyPy5IVE1MIHx8ICcnKS5sZW5ndGg7IH0gY2F0Y2ggeyByZXR1cm4gMDsgfVxuICAgIH1cblxuICAgIC8qKiBUaGUgaG9zdCBldmVyeSByZXF1ZXN0IGdvZXMgdG8gdW5sZXNzIGRlbGl2ZXJ5KCkgbW92ZWQgaXQuIE5ldmVyIGNoYW5nZXMuICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9IT1NUID0gJ2h0dHBzOi8vY2xvdWQubXlvcC5kZXYnO1xuXG4gICAgLyoqXG4gICAgICogT3B0LWluIGRlbGl2ZXJ5IHNldHRpbmdzLCBzZXQgYnkgbXlvcC5kZWxpdmVyeSgpLiBPZmYgbWVhbnM6IHRoaXMgZmlsZSBiZWhhdmVzXG4gICAgICogRVhBQ1RMWSBhcyBpdCBkaWQgYmVmb3JlIFx1MjAxNCBzYW1lIGhvc3QsIHNhbWUgVVJMLCBzYW1lIGV2ZXJ5dGhpbmcuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZGVsaXZlcnk6IHsgbWluaWZ5OiBib29sZWFuOyBob3N0OiBzdHJpbmcgfCBudWxsOyBjYWNoZTogYm9vbGVhbiB9ID1cbiAgICAgICAgeyBtaW5pZnk6IGZhbHNlLCBob3N0OiBudWxsLCBjYWNoZTogZmFsc2UgfTtcblxuICAgIC8qKlxuICAgICAqIFdoYXQgYWN0dWFsbHkgaGFwcGVuZWQsIGZvciBteW9wLmRlbGl2ZXJ5LnN0YXRzKCkuIGBmZWxsQmFja2AgaXMgdGhlIG51bWJlciB0aGF0XG4gICAgICogbWF0dGVyczogaXQgaXMgaG93IHlvdSBmaW5kIG91dCB0aGUgbGFuZSBpcyB1bmhlYWx0aHkgd2l0aG91dCB3YWl0aW5nIGZvciBhXG4gICAgICogYnVnIHJlcG9ydCwgYmVjYXVzZSBhIGZhbGxiYWNrIGlzIElOVklTSUJMRSB0byB0aGUgcGFnZSAoaXQgc3RpbGwgcmVuZGVycykuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZGVsaXZlcnlTdGF0cyA9IHtcbiAgICAgICAgcmVxdWVzdHM6IDAsIHZpYURlbGl2ZXJ5OiAwLCBmZWxsQmFjazogMCwgbGFzdEVycm9yOiBudWxsIGFzIHN0cmluZyB8IG51bGwsXG4gICAgICAgIC8qKiB3aGVyZSB0aGUgbGFzdCBsb2FkcyB3ZXJlIGFuc3dlcmVkIGZyb20gXHUyMDE0IHRoZSBudW1iZXIgdGhlIGNsaWVudCB3aW5kb3cgZXhpc3RzIHRvIG1vdmUgKi9cbiAgICAgICAgZnJvbU1lbW9yeTogMCwgZnJvbVN0b3JhZ2U6IDAsIGZyb21OZXR3b3JrOiAwLFxuICAgICAgICAvKiogcmUtY2hlY2tzIGFmdGVyIHRoZSB3aW5kb3cgZW5kZWQsIGFuZCBob3cgbWFueSB3ZXJlIGFuc3dlcmVkIFwibm90aGluZyBjaGFuZ2VkXCIgKi9cbiAgICAgICAgcmV2YWxpZGF0aW9uczogMCwgdW5jaGFuZ2VkOiAwLCBieXRlc1NhdmVkOiAwLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUdXJuIG9uIHRoZSBvcHQtaW4gZGVsaXZlcnkgcGF0aC5cbiAgICAgKlxuICAgICAqIE9wdGluZyBpbiBJUyBjaG9vc2luZyB0aGUgZGVsaXZlcnkgc3RhY2s6IHRoaXMgcG9pbnRzIC9jb25zdW1lIGF0IGBob3N0YCAoYSBzZWNvbmQsXG4gICAgICogY29tcGxldGUgc3RhY2sgcmVhZGluZyB0aGUgc2FtZSBkYXRhKSBhbmQgYXNrcyBmb3IgdGhlIG1pbmlmaWVkIGFydGlmYWN0LiBMZWF2ZSB0aGlzXG4gICAgICogdW5jYWxsZWQgYW5kIG5vdGhpbmcgYWJvdXQgdGhlIFNESyBjaGFuZ2VzLlxuICAgICAqXG4gICAgICogRGVsaWJlcmF0ZWx5IG11dGF0ZXMgVEhJUyBpbnN0YW5jZSByYXRoZXIgdGhhbiBjb25zdHJ1Y3RpbmcgYSBuZXcgcmVwb3NpdG9yeTpcbiAgICAgKiBDbG91ZFJlcG9zaXRvcnkuTWFpbiBpcyBhIGdsb2JhbCBzaW5nbGV0b24gc2hhcmVkIGFjcm9zcyBidW5kbGVzIChzZWUgZ2V0R2xvYmFsTWFpbiksXG4gICAgICogc28gYSBzZWNvbmQgaW5zdGFuY2Ugd291bGQgYmUgaWdub3JlZCBieSBldmVyeSBjb21wb25lbnQgYWxyZWFkeSB1c2luZyB0aGUgZmlyc3QuXG4gICAgICovXG4gICAgc2V0RGVsaXZlcnkob3B0czogeyBtaW5pZnk/OiBib29sZWFuOyBob3N0Pzogc3RyaW5nIHwgbnVsbDsgY2FjaGU/OiBib29sZWFuIH0gPSB7fSkge1xuICAgICAgICBpZiAob3B0cy5taW5pZnkgIT09IHVuZGVmaW5lZCkgdGhpcy5fZGVsaXZlcnkubWluaWZ5ID0gISFvcHRzLm1pbmlmeTtcbiAgICAgICAgaWYgKG9wdHMuaG9zdCAhPT0gdW5kZWZpbmVkKSB0aGlzLl9kZWxpdmVyeS5ob3N0ID0gb3B0cy5ob3N0O1xuICAgICAgICBpZiAob3B0cy5jYWNoZSAhPT0gdW5kZWZpbmVkKSB0aGlzLl9kZWxpdmVyeS5jYWNoZSA9ICEhb3B0cy5jYWNoZTtcbiAgICB9XG5cbiAgICBkZWxpdmVyeVN0YXRzKCkge1xuICAgICAgICByZXR1cm4geyAuLi50aGlzLl9kZWxpdmVyeVN0YXRzLCBob3N0OiB0aGlzLl9kZWxpdmVyeS5ob3N0ID8/IENsb3VkUmVwb3NpdG9yeS5ERUZBVUxUX0hPU1QsXG4gICAgICAgICAgICAgICAgIG1pbmlmeTogdGhpcy5fZGVsaXZlcnkubWluaWZ5LCBjYWNoZTogdGhpcy5fZGVsaXZlcnkuY2FjaGUgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JnZXQgd2hhdCB0aGlzIGJyb3dzZXIgaG9sZHMsIHNvIHRoZSBuZXh0IGxvYWQgYXNrcyB0aGUgc2VydmVyLlxuICAgICAqIGByZWZyZXNoKClgIHdpdGggbm8gaWRzIGRyb3BzIGV2ZXJ5dGhpbmc7IHRoZSBjb3VudGVycGFydCB0byB0aGUgd2luZG93IGZvciB0aGUgY2FzZVxuICAgICAqIHdoZXJlIGEgY2hhbmdlIGhhcyB0byBiZSB2aXNpYmxlIG9uIFRISVMgbG9hZCBcdTIwMTQgcmlnaHQgYWZ0ZXIgc29tZW9uZSBwdWJsaXNoZXMuXG4gICAgICovXG4gICAgYXN5bmMgcmVmcmVzaERlbGl2ZXJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBkZWxpdmVyeVN0b3JlLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9jYWwgc2VydmVzIHdhaXRpbmcgdG8gYmUgcmVwb3J0ZWQ6IGNvbXBvbmVudElkIC0+IHtlbnYsIGNvdW50fS5cbiAgICAgKlxuICAgICAqIFRIRSBNRUFTVVJFTUVOVCBQUk9CTEVNIFRISVMgU09MVkVTLiBUaGUgYmV0dGVyIHRoaXMgY2FjaGUgd29ya3MsIHRoZSBtb3JlIHVzYWdlXG4gICAgICogdmFuaXNoZXM6IGEgdmlzaXRvciBpbnNpZGUgdGhlaXIgZnJlc2huZXNzIHdpbmRvdyByZW5kZXJzIHRoZSBwYWdlIHdpdGggbm8gcmVxdWVzdCxcbiAgICAgKiBzbyBuZWl0aGVyIHRoZSBzZXJ2ZXIgbm9yIHRoZSBDRE4gY2FuIHNlZSB0aGVtLiBMZWZ0IGFsb25lLCBhIHN1Y2Nlc3NmdWwgcm9sbG91dFxuICAgICAqIGxvb2tzIGluIHRoZSBsZWRnZXIgZXhhY3RseSBsaWtlIGN1c3RvbWVycyBsZWF2aW5nLlxuICAgICAqXG4gICAgICogU28gbG9jYWwgc2VydmVzIGFyZSBjb3VudGVkIGhlcmUgYW5kIHJlcG9ydGVkIGFmdGVyd2FyZHMsIGJhdGNoZWQsIG9uIGEgcGF0aCB0aGF0XG4gICAgICogbmV2ZXIgYmxvY2tzIHJlbmRlcmluZzogZmx1c2hlZCB3aGVuIHRoZSBwYWdlIGlzIGhpZGRlbiAoa2VlcGFsaXZlLCBzbyBpdCBzdXJ2aXZlc1xuICAgICAqIHRoZSB0YWIgY2xvc2luZykgYW5kIG9wcG9ydHVuaXN0aWNhbGx5IHdoZW5ldmVyIHRoZSBTREsgaXMgdGFsa2luZyB0byB0aGUgc2VydmVyXG4gICAgICogYW55d2F5LiBOb3RoaW5nIGlzIHNlbnQgd2hpbGUgdGhlIHBhZ2UgaXMgbG9hZGluZywgd2hpY2ggaXMgdGhlIHBvaW50IG9mIHRoZSB3aW5kb3cuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfbG9jYWxTZXJ2ZXMgPSBuZXcgTWFwPHN0cmluZywge2Vudjogc3RyaW5nOyBjb3VudDogbnVtYmVyfT4oKTtcbiAgICBwcml2YXRlIF9mbHVzaEJvdW5kID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIG5vdGVMb2NhbFNlcnZlKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudjogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGN1ciA9IHRoaXMuX2xvY2FsU2VydmVzLmdldChjb21wb25lbnRJZCk7XG4gICAgICAgIGlmIChjdXIpIGN1ci5jb3VudCsrO1xuICAgICAgICBlbHNlIHRoaXMuX2xvY2FsU2VydmVzLnNldChjb21wb25lbnRJZCwge2VudiwgY291bnQ6IDF9KTtcbiAgICAgICAgdGhpcy5iaW5kRmx1c2goKTtcbiAgICB9XG5cbiAgICAvKiogUmVwb3J0IG9uIHBhZ2UtaGlkZSwgd2hpY2ggaXMgdGhlIG9ubHkgZXZlbnQgdGhhdCByZWxpYWJseSBmaXJlcyBvbiBtb2JpbGUuICovXG4gICAgcHJpdmF0ZSBiaW5kRmx1c2goKSB7XG4gICAgICAgIGlmICh0aGlzLl9mbHVzaEJvdW5kIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZmx1c2hCb3VuZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IG9uSGlkZSA9ICgpID0+IHsgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ2hpZGRlbicpIHRoaXMuZmx1c2hMb2NhbFNlcnZlcygpOyB9O1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgb25IaWRlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VoaWRlJywgKCkgPT4gdGhpcy5mbHVzaExvY2FsU2VydmVzKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmQgd2hhdCB3ZSBoYXZlLiBga2VlcGFsaXZlYCBpcyB3aGF0IG1ha2VzIHRoaXMgd29yayBhdCBwYWdlLWhpZGU6IHRoZSByZXF1ZXN0XG4gICAgICogb3V0bGl2ZXMgdGhlIGRvY3VtZW50LiBGYWlsdXJlIGlzIGlnbm9yZWQgXHUyMDE0IGEgbG9zdCB1c2FnZSByZXBvcnQgbXVzdCBuZXZlciBiZVxuICAgICAqIHZpc2libGUgdG8gYSB2aXNpdG9yLCBhbmQgdGhlIG5leHQgcGFnZSBsb2FkIHdpbGwgcmVwb3J0IGl0cyBvd24uXG4gICAgICovXG4gICAgZmx1c2hMb2NhbFNlcnZlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sb2NhbFNlcnZlcy5zaXplKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGJhdGNoID0gWy4uLnRoaXMuX2xvY2FsU2VydmVzLmVudHJpZXMoKV1cbiAgICAgICAgICAgIC5tYXAoKFtpZCwgdl0pID0+IGAke2lkfToke3YuZW52fToke3YuY291bnR9YCkuam9pbignLCcpO1xuICAgICAgICB0aGlzLl9sb2NhbFNlcnZlcy5jbGVhcigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5kZWxpdmVyeUhvc3QoKX0vY2xpZW50VXNhZ2U/Yj0ke2VuY29kZVVSSUNvbXBvbmVudChiYXRjaCl9YDtcbiAgICAgICAgICAgIGZldGNoKHVybCwge2tlZXBhbGl2ZTogdHJ1ZSwgbW9kZTogJ2NvcnMnLCBjcmVkZW50aWFsczogJ29taXQnfSkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICB9IGNhdGNoIHsgLyogbmV2ZXIgdGhlIHZpc2l0b3IncyBwcm9ibGVtICovIH1cbiAgICB9XG5cbiAgICAvKiogV2hlcmUgL2NvbnN1bWUgc2hvdWxkIGJlIGZldGNoZWQgZnJvbSByaWdodCBub3cuICovXG4gICAgcHJpdmF0ZSBkZWxpdmVyeUhvc3QoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGl2ZXJ5Lmhvc3QgfHwgdGhpcy5fYmFzZVVybDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIGRlbGl2ZXJ5IFVSTCB3aXRoIE9ORSBmYWxsYmFjayB0byB0aGUgZGVmYXVsdCBob3N0LlxuICAgICAqXG4gICAgICogVGhlIGZhbGxiYWNrIGlzIHRoZSBraWxsIHN3aXRjaDogYnJlYWsgb3IgZGlzYWJsZSB0aGUgbGFuZSBhbmQgZXZlcnkgY2xpZW50IGRyaWZ0c1xuICAgICAqIGJhY2sgdG8gY2xvdWQubXlvcC5kZXYgb24gaXRzIG93biwgd2l0aCBubyBjdXN0b21lciBkZXBsb3kuIEl0IG11c3QgdGhlcmVmb3JlIGJlXG4gICAgICogZ2VudWluZWx5IHNpbGVudCB0byB0aGUgcGFnZSBhbmQgZ2VudWluZWx5IExPVUQgaW4gc3RhdHMoKSBcdTIwMTQgYSBmYWxsYmFjayB0aGF0IG5vYm9keVxuICAgICAqIGNvdW50cyBpcyBhbiBvdXRhZ2Ugbm9ib2R5IG5vdGljZXMuXG4gICAgICpcbiAgICAgKiBPbmx5IHRyYW5zcG9ydCBmYWlsdXJlcyBhbmQgNXh4IGZhbGwgYmFjay4gQSA0MDQgaXMgYW4gYW5zd2VyOiB0aGUgY29tcG9uZW50IHJlYWxseVxuICAgICAqIGlzIG1pc3NpbmcsIGFuZCByZXRyeWluZyBlbHNld2hlcmUgd291bGQgb25seSBoaWRlIGl0LlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgZGVsaXZlcnlGZXRjaChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgICAgIC8vIFdlIGFyZSBhYm91dCB0byB1c2UgdGhlIG5ldHdvcmsgYW55d2F5OiBhIGdvb2QgbW9tZW50IHRvIGhhbmQgb3ZlciB3aGF0ZXZlciB0aGVcbiAgICAgICAgLy8gd2luZG93IHNlcnZlZCBvZmZsaW5lLCByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciB0aGUgcGFnZSB0byBiZSBjbG9zZWQuXG4gICAgICAgIGlmICh0aGlzLl9sb2NhbFNlcnZlcy5zaXplKSB0aGlzLmZsdXNoTG9jYWxTZXJ2ZXMoKTtcbiAgICAgICAgY29uc3QgaG9zdCA9IHRoaXMuZGVsaXZlcnlIb3N0KCk7XG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBgJHtob3N0fSR7cGF0aH1gO1xuICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLnJlcXVlc3RzKys7XG4gICAgICAgIGNvbnN0IHVzaW5nTGFuZSA9IGhvc3QgIT09IHRoaXMuX2Jhc2VVcmw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChwcmltYXJ5KTtcbiAgICAgICAgICAgIGlmIChyZXMub2sgfHwgcmVzLnN0YXR1cyA8IDUwMCB8fCAhdXNpbmdMYW5lKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVzaW5nTGFuZSAmJiByZXMub2spIHRoaXMuX2RlbGl2ZXJ5U3RhdHMudmlhRGVsaXZlcnkrKztcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy5sYXN0RXJyb3IgPSBgSFRUUCAke3Jlcy5zdGF0dXN9IGZyb20gJHtob3N0fWA7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgaWYgKCF1c2luZ0xhbmUpIHRocm93IGU7XG4gICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLmxhc3RFcnJvciA9IFN0cmluZyhlPy5tZXNzYWdlID8/IGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMuZmVsbEJhY2srKztcbiAgICAgICAgY29uc29sZS53YXJuKGBbbXlvcF0gZGVsaXZlcnkgaG9zdCBmYWlsZWQgKCR7dGhpcy5fZGVsaXZlcnlTdGF0cy5sYXN0RXJyb3J9KSBcdTIwMTQgZmFsbGluZyBiYWNrIHRvICR7dGhpcy5fYmFzZVVybH1gKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZldGNoKGAke3RoaXMuX2Jhc2VVcmx9JHtwYXRofWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSBzdGF0aWMgbW9kZSBmb3Igc2VsZi1ob3N0ZWQgY29tcG9uZW50IHJlZ2lzdHJpZXMuXG4gICAgICogSW4gc3RhdGljIG1vZGUsIFVSTHMgYXJlIGNvbnN0cnVjdGVkIGFzIGZpbGUgcGF0aHMgaW5zdGVhZCBvZiBxdWVyeSBwYXJhbXM6XG4gICAgICogICAke2Jhc2VVcmx9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vJHtlbnZ9Lmpzb25cbiAgICAgKi9cbiAgICBlbmFibGVTdGF0aWNNb2RlKCkge1xuICAgICAgICB0aGlzLl9zdGF0aWNNb2RlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcXVlcnkgcGFyYW1ldGVycyB0byBhcHBlbmQgdG8gYWxsIGZldGNoIFVSTHMgKGUuZy4gZm9yIENETiBjYWNoZSBidXN0aW5nKS5cbiAgICAgKiBFeGFtcGxlOiBgc2V0UXVlcnlQYXJhbXMoeyBsYXN0dXBkYXRlOiAnMTExMTIwMjYnIH0pYFxuICAgICAqL1xuICAgIHNldFF1ZXJ5UGFyYW1zKHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICAgICAgICB0aGlzLl9xdWVyeVBhcmFtcyA9IHBhcmFtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQgZm9yIHRoaXMgQ2xvdWRSZXBvc2l0b3J5IGluc3RhbmNlXG4gICAgICovXG4gICAgc2V0RW52aXJvbm1lbnQoZW52OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEVudiA9IGVudjtcbiAgICAgICAgdGhpcy5fZW52RXhwbGljaXRseVNldCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgZW52aXJvbm1lbnRcbiAgICAgKi9cbiAgICBnZXREZWZhdWx0RW52aXJvbm1lbnQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRFbnY7XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IFYyIE1ldGhvZHMgKERlZmF1bHQpID09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBjb21wb25lbnQgaXMgYWxyZWFkeSBjYWNoZWQvcHJlbG9hZGVkICh2MilcbiAgICAgKiBJZiBlbnYgYW5kIHByZXZpZXcgYXJlIG5vdCBwcm92aWRlZCwgY2hlY2tzIGlmIEFOWSB2ZXJzaW9uIGlzIHByZWxvYWRlZFxuICAgICAqL1xuICAgIGlzUHJlbG9hZGVkKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgLy8gSWYgc3BlY2lmaWMgZW52L3ByZXZpZXcgcmVxdWVzdGVkLCBjaGVjayBleGFjdCBtYXRjaFxuICAgICAgICBpZiAoZW52ICE9PSB1bmRlZmluZWQgfHwgcHJldmlldyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZUtleSA9IGAke2NvbXBvbmVudElkfToke2VudiB8fCB0aGlzLl9kZWZhdWx0RW52fToke3ByZXZpZXcgPyAncHJldmlldycgOiAnbGl2ZSd9YDtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZUtleSBpbiB0aGlzLnZhcmlhbnRzO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSBjaGVjayBpZiBhbnkgdmVyc2lvbiB3YXMgcHJlbG9hZGVkXG4gICAgICAgIHJldHVybiBjb21wb25lbnRJZCBpbiB0aGlzLnByZWxvYWRlZENvbXBvbmVudHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwcmVsb2FkZWQgcGFyYW1zIGZvciBhIGNvbXBvbmVudCAoaWYgcHJlbG9hZGVkKVxuICAgICAqIFJldHVybnMgdW5kZWZpbmVkIGlmIG5vdCBwcmVsb2FkZWRcbiAgICAgKi9cbiAgICBnZXRQcmVsb2FkZWRQYXJhbXMoY29tcG9uZW50SWQ6IHN0cmluZyk6IHsgZW52OiBzdHJpbmc7IHByZXZpZXc6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgYSBjb21wb25lbnQgY29uZmlnOiBmZXRjaCBpdCBvbmNlLCB0aGVuIHNlcnZlIGl0IGZyb20gdGhpc1xuICAgICAqIHJlcG9zaXRvcnkncyBjYWNoZS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdGhlIG5hbWUgdG8gdXNlLiBgZmV0Y2hDb21wb25lbnRWMmAgaXMgdGhlIHNhbWUgbWV0aG9kIHVuZGVyIGl0c1xuICAgICAqIHZlcnNpb25lZCBuYW1lIGFuZCBzdGF5cyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBcdTIwMTQgbm90ZSB0aGF0IHRoZVxuICAgICAqIHVudmVyc2lvbmVkIGBmZXRjaENvbXBvbmVudGAgaXMgYSAqZGVwcmVjYXRlZCB2MSogQVBJIGFuZCBpcyBOT1QgdGhpcy5cbiAgICAgKlxuICAgICAqIENvbXBsZXRlcyB0aGUgdHJpbyB3aXRoIHtAbGluayBnZXRSZXNvbHZlZENvbmZpZ30gKHN5bmNocm9ub3VzIHJlYWQgb2YgYW5cbiAgICAgKiBhbHJlYWR5LXJlc29sdmVkIGNvbmZpZykgYW5kIHtAbGluayBoeWRyYXRlQ29tcG9uZW50fSAoc2VlZCBvbmUgeW91XG4gICAgICogYWxyZWFkeSBob2xkKS5cbiAgICAgKlxuICAgICAqIFByZWZlciB0aGUgbW9kdWxlLWxldmVsIGBwcmVsb2FkQ29tcG9uZW50cyhbaWRdKWAgaW4gYXBwIGNvZGU7IHJlYWNoIGZvclxuICAgICAqIHRoaXMgd2hlbiB5b3UgbmVlZCBhbiBpc29sYXRlZCByZXBvc2l0b3J5IGluc3RhbmNlIHdob3NlIGNhY2hlIGxpZmV0aW1lXG4gICAgICogeW91IGNvbnRyb2wgXHUyMDE0IGEgc2VydmVyIHdpdGggaXRzIG93biBUVEwsIGZvciBleGFtcGxlLlxuICAgICAqL1xuICAgIGFzeW5jIHJlc29sdmVDb21wb25lbnQoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IFByb21pc2U8SUNvbXBvbmVudENvbmZpZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaENvbXBvbmVudFYyKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGEgdjIgY29tcG9uZW50IGNvbmZpZ1xuICAgICAqIElmIGVudi9wcmV2aWV3IG5vdCBzcGVjaWZpZWQgYW5kIGNvbXBvbmVudCB3YXMgcHJlbG9hZGVkLCB1c2VzIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgKlxuICAgICAqIEBzZWUgcmVzb2x2ZUNvbXBvbmVudCBcdTIwMTQgdGhlIHVudmVyc2lvbmVkIG5hbWUgZm9yIHRoaXMgbWV0aG9kXG4gICAgICovXG4gICAgYXN5bmMgZmV0Y2hDb21wb25lbnRWMihjb21wb25lbnRJZDogc3RyaW5nLCBlbnZpcm9ubWVudElkZW50aWZpZXI/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiB7XG4gICAgICAgIGNvbnN0IHsgZW52LCB1c2VQcmV2aWV3LCBjYWNoZUtleSB9ID0gdGhpcy5yZXNvbHZlUGFyYW1zKGNvbXBvbmVudElkLCBlbnZpcm9ubWVudElkZW50aWZpZXIsIHByZXZpZXcpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ2xvdWRSZXBvc2l0b3J5XSBmZXRjaENvbXBvbmVudFYyJywge1xuICAgICAgICAgICAgY29tcG9uZW50SWQ6IGNvbXBvbmVudElkLnNsaWNlKDAsIDgpICsgJy4uLicsXG4gICAgICAgICAgICBlbnYsXG4gICAgICAgICAgICB1c2VQcmV2aWV3LFxuICAgICAgICAgICAgY2FjaGVLZXksXG4gICAgICAgICAgICBjYWNoZWQ6IGNhY2hlS2V5IGluIHRoaXMudmFyaWFudHNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSkge1xuICAgICAgICAgICAgLy8gVHJhY2sgdGhpcyBhcyBwcmVsb2FkZWQgKGZpcnN0IGZldGNoIGNvdW50cyBhcyBwcmVsb2FkKVxuICAgICAgICAgICAgaWYgKCF0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXSA9IHsgZW52LCBwcmV2aWV3OiB1c2VQcmV2aWV3IH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmw6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0aWNNb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IHVzZVByZXZpZXcgPyAncHJldmlldycgOiBlbnY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gYCR7dGhpcy5fYmFzZVVybH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS8ke2ZpbGV9Lmpzb25gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHFzID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh0aGlzLl9xdWVyeVBhcmFtcykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocXMpIHVybCArPSBgPyR7cXN9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gYC9jb25zdW1lP2lkPSR7Y29tcG9uZW50SWR9JmVudj0ke2Vudn1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VQcmV2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAnJnByZXZpZXc9dHJ1ZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgcHJldmlldyBpcyBuZXZlciBtaW5pZmllZDogdGhlIGFydGlmYWN0IGlzIGJ1aWx0IGZyb20gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsZWFzZWQgdmFyaWFudCwgYW5kIGFuIGF1dGhvciBtdXN0IHNlZSB0aGVpciBvd24gZWRpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZGVsaXZlcnkubWluaWZ5ICYmICF1c2VQcmV2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAnJm9wdD1taW4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gLS0tLSB0aGUgY2xpZW50IHdpbmRvdyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHByZXZpZXcgaXMgbmV2ZXIgaGVsZDogYW4gYXV0aG9yIGhhcyB0byBzZWUgdGhlaXIgb3duIGVkaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWNoZWFibGUgPSB0aGlzLl9kZWxpdmVyeS5jYWNoZSAmJiAhdGhpcy5fc3RhdGljTW9kZSAmJiAhdXNlUHJldmlldztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0b3JlS2V5ID0gY2FjaGVhYmxlID8gZGVsaXZlcnlTdG9yZS5rZXkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxpdmVyeUhvc3QoKSwgY29tcG9uZW50SWQsIGVudixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VQcmV2aWV3LCB0aGlzLl9kZWxpdmVyeS5taW5pZnkgPyAnbWluJyA6ICdyYXcnKSA6ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhlbGQgPSBjYWNoZWFibGUgPyBhd2FpdCBkZWxpdmVyeVN0b3JlLmdldChzdG9yZUtleSkgOiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVsZCAmJiBkZWxpdmVyeVN0b3JlLmZyZXNoKGhlbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5zaWRlIHRoZSB3aW5kb3c6IG5vIHJlcXVlc3QgYXQgYWxsLiBDb3VudGVkIGxvY2FsbHkgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0ZWQgbGF0ZXIsIG9yIHRoaXMgdmlzaXQgaXMgaW52aXNpYmxlIHRvIHRoZSBsZWRnZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy5mcm9tU3RvcmFnZSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90ZUxvY2FsU2VydmUoY29tcG9uZW50SWQsIGVudik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMudmFyaWFudHNbY2FjaGVLZXldIGFzIGFueSkucmVzb2x2ZWQgPSBoZWxkLmNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGhlbGQuY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWxkICYmIGhlbGQudGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHdpbmRvdyBlbmRlZC4gU2VuZCBiYWNrIHRoZSB2ZXJzaW9uIHdlIGhvbGQgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1kb3dubG9hZGluZzogdGhlIGFuc3dlciBpcyB1c3VhbGx5IGEgZmV3IGh1bmRyZWQgYnl0ZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgdGhlIGBpZHM9YC9gaGF2ZT1gIHJvdXRlIGFuZCBOT1QgSWYtTm9uZS1NYXRjaDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHJlcXVlc3QgaGVhZGVyIHRyaWdnZXJzIGEgQ09SUyBwcmVmbGlnaHQsIHRoZXJlIGlzIG5vIE9QVElPTlNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByb3V0ZSwgYW5kIGl0IGZhaWxzIGluIGEgYnJvd3NlciB3aGlsZSB3b3JraW5nIHBlcmZlY3RseSBpbiBjdXJsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB2YWxpZGF0b3IgdHJhdmVscyBpbiB0aGUgcXVlcnkgc3RyaW5nLCBzbyBpdCBpcyBhIHBsYWluIEdFVC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja1VybCA9IGAvY29uc3VtZT9pZHM9JHtjb21wb25lbnRJZH0mZW52PSR7ZW52fWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5fZGVsaXZlcnkubWluaWZ5ID8gJyZvcHQ9bWluJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAmaGF2ZT0ke2VuY29kZVVSSUNvbXBvbmVudChoZWxkLnRhZyl9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLnJldmFsaWRhdGlvbnMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVjayA9IGF3YWl0IHRoaXMuZGVsaXZlcnlGZXRjaChjaGVja1VybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVjay5vaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IGNoZWNrLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYm9keS51bmNoYW5nZWQgfHwgW10pLmluY2x1ZGVzKGNvbXBvbmVudElkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMudW5jaGFuZ2VkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy5ieXRlc1NhdmVkICs9IENsb3VkUmVwb3NpdG9yeS5zaXplT2ZIZWxkKGhlbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbGQuc3RvcmVkQXQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbGQud2luZG93TXMgPSBkZWxpdmVyeVN0b3JlLndpbmRvd0Zyb20oY2hlY2suaGVhZGVycykgfHwgaGVsZC53aW5kb3dNcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxpdmVyeVN0b3JlLnB1dChoZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy52YXJpYW50c1tjYWNoZUtleV0gYXMgYW55KS5yZXNvbHZlZCA9IGhlbGQuY29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaGVsZC5jb25maWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0IGNoYW5nZWQuIFRoZSBhbnN3ZXIgYWxyZWFkeSBjYXJyaWVzIHRoZSBuZXcgYnl0ZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gKGJvZHkuaXRlbXMgfHwgW10pWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjZmcgPSBjb252ZXJ0VjJWYXJpYW50VG9Db21wb25lbnRDb25maWcoaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy5mcm9tTmV0d29yaysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlbGl2ZXJ5U3RvcmUucHV0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBzdG9yZUtleSwgY29uZmlnOiBjZmcsIHRhZzogaXRlbS50YWcgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd01zOiBkZWxpdmVyeVN0b3JlLndpbmRvd0Zyb20oY2hlY2suaGVhZGVycyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Q6IHRoaXMuZGVsaXZlcnlIb3N0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBhbnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSBhcyBhbnkpLnJlc29sdmVkID0gY2ZnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY2ZnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBmYWlsZWQgcmUtY2hlY2sgbXVzdCBub3QgZmFpbCB0aGUgcGFnZTogZmFsbCB0aHJvdWdoIHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBvcmRpbmFyeSBmZXRjaCBiZWxvdy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IHRoaXMuX3N0YXRpY01vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGF3YWl0IGZldGNoKHVybClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF3YWl0IHRoaXMuZGVsaXZlcnlGZXRjaCh1cmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBjb21wb25lbnQgXCIke2NvbXBvbmVudElkfVwiICgke3Jlcy5zdGF0dXN9JHt0aGlzLl9zdGF0aWNNb2RlID8gYCBmcm9tICR7dXJsfWAgOiAnJ30pYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFyaWFudCA9IGpzb24uaXRlbTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiBub3QgZm91bmRgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhbnQuY29uc3VtZV92YXJpYW50IHx8ICF2YXJpYW50LmNvbnN1bWVfdmFyaWFudC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBDb21wb25lbnQgXCIke2NvbXBvbmVudElkfVwiIGhhcyBubyBpbXBsZW1lbnRhdGlvbiBmb3IgZW52aXJvbm1lbnQgXCIke2Vudn1cImApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudENvbmZpZyA9IGNvbnZlcnRWMlZhcmlhbnRUb0NvbXBvbmVudENvbmZpZyh2YXJpYW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMuZnJvbU5ldHdvcmsrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIb2xkIGl0IGZvciBleGFjdGx5IGFzIGxvbmcgYXMgdGhlIHNlcnZlciBzYWlkLCBtaW51cyB3aGF0IGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDRE4gYWxyZWFkeSBzcGVudCAoZGVsaXZlcnlTdG9yZS53aW5kb3dGcm9tKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxpdmVyeVN0b3JlLnB1dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogc3RvcmVLZXksIGNvbmZpZzogY29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWc6ICh2YXJpYW50IGFzIGFueSkudGFnIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dNczogZGVsaXZlcnlTdG9yZS53aW5kb3dGcm9tKHJlcy5oZWFkZXJzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdDogdGhpcy5kZWxpdmVyeUhvc3QoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIGFueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUYWcgdGhlIFByb21pc2Ugc28gZ2V0UmVzb2x2ZWRDb25maWcgY2FuIHJlYWQgaXQgc3luY2hyb25vdXNseVxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMudmFyaWFudHNbY2FjaGVLZXldIGFzIGFueSkucmVzb2x2ZWQgPSBjb21wb25lbnRDb25maWc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvbXBvbmVudENvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBjYWNoZWQgcmVqZWN0ZWQgcHJvbWlzZSBzbyB0aGUgbmV4dCBjYWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlcyBhIGZyZXNoIHJlcXVlc3QgKGUuZy4gYWZ0ZXIgbmV0d29yayByZWNvdmVyeSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy52YXJpYW50c1tjYWNoZUtleV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3luY2hyb25vdXMgdmVyc2lvbiBvZiBmZXRjaENvbXBvbmVudFYyIFx1MjAxNCByZXR1cm5zIHRoZSBjb25maWcgb25seSBpZlxuICAgICAqIHRoZSBmZXRjaCBhbHJlYWR5IGNvbXBsZXRlZCwgbnVsbCBvdGhlcndpc2UuXG4gICAgICpcbiAgICAgKiBVc2VzIHRoZSBzYW1lIGB0aGlzLnZhcmlhbnRzYCBjYWNoZSB0aGF0IGZldGNoQ29tcG9uZW50VjIvcHJlbG9hZENvbXBvbmVudHNcbiAgICAgKiBwb3B1bGF0ZS4gRWFjaCBjYWNoZWQgUHJvbWlzZSBpcyB0YWdnZWQgd2l0aCBhIGAucmVzb2x2ZWRgIHByb3BlcnR5IHdoZW5cbiAgICAgKiBpdCBzZXR0bGVzIFx1MjAxNCB0aGlzIG1ldGhvZCBqdXN0IHJlYWRzIHRoYXQgcHJvcGVydHkuIE5vIHNlcGFyYXRlIGNhY2hlLlxuICAgICAqXG4gICAgICogV2h5IHRoaXMgZXhpc3RzOiBSZWFjdCBOYXRpdmUgbmVlZHMgdGhlIGNvbmZpZyBhdCByZW5kZXIgdGltZSB0byBlbWJlZCBpdFxuICAgICAqIGluIHRoZSBXZWJWaWV3IEhUTUwgKGNhbid0IGF3YWl0IGluIHVzZVN0YXRlKS4gSWYgcHJlbG9hZENvbXBvbmVudHMgcmFuXG4gICAgICogZWFybGllciBhbmQgdGhlIGZldGNoIGNvbXBsZXRlZCwgdGhpcyByZXR1cm5zIHRoZSByZXN1bHQgc3luY2hyb25vdXNseSxcbiAgICAgKiBza2lwcGluZyB0aGUgV0VCVklFV19SRUFEWSBcdTIxOTIgZmV0Y2ggXHUyMTkyIGluamVjdCByb3VuZCB0cmlwIGVudGlyZWx5LlxuICAgICAqL1xuICAgIGdldFJlc29sdmVkQ29uZmlnKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBJQ29tcG9uZW50Q29uZmlnIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHsgY2FjaGVLZXkgfSA9IHRoaXMucmVzb2x2ZVBhcmFtcyhjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFyaWFudHNbY2FjaGVLZXldPy5yZXNvbHZlZCB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgd2hpY2ggKGVudiwgcHJldmlldykgcGFpciBcdTIwMTQgYW5kIHRoZXJlZm9yZSB3aGljaCBjYWNoZSBrZXkgXHUyMDE0IGEgY2FsbFxuICAgICAqIGZvciBgY29tcG9uZW50SWRgIHJlZmVycyB0by5cbiAgICAgKlxuICAgICAqIFNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIGZldGNoQ29tcG9uZW50VjIsIGdldFJlc29sdmVkQ29uZmlnIGFuZFxuICAgICAqIGh5ZHJhdGVDb21wb25lbnQsIHNvIGEgaHlkcmF0ZWQgY29uZmlnIGFsd2F5cyBsYW5kcyBvbiB0aGUga2V5IGEgbGF0ZXJcbiAgICAgKiBmZXRjaCB3aWxsIGxvb2sgdW5kZXIuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZXNvbHZlUGFyYW1zKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudmlyb25tZW50SWRlbnRpZmllcj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pIHtcbiAgICAgICAgLy8gSWYgbm8gZXhwbGljaXQgZW52L3ByZXZpZXcgYW5kIGNvbXBvbmVudCB3YXMgcHJlbG9hZGVkLCB1c2UgcHJlbG9hZGVkIHBhcmFtc1xuICAgICAgICBjb25zdCBwcmVsb2FkZWQgPSB0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdO1xuICAgICAgICBjb25zdCBoYXNFeHBsaWNpdFBhcmFtcyA9IGVudmlyb25tZW50SWRlbnRpZmllciAhPT0gdW5kZWZpbmVkIHx8IHByZXZpZXcgIT09IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgZW52OiBzdHJpbmc7XG4gICAgICAgIGxldCB1c2VQcmV2aWV3OiBib29sZWFuO1xuXG4gICAgICAgIGlmICghaGFzRXhwbGljaXRQYXJhbXMgJiYgcHJlbG9hZGVkKSB7XG4gICAgICAgICAgICAvLyBVc2UgcHJlbG9hZGVkIHBhcmFtc1xuICAgICAgICAgICAgZW52ID0gcHJlbG9hZGVkLmVudjtcbiAgICAgICAgICAgIHVzZVByZXZpZXcgPSBwcmVsb2FkZWQucHJldmlldztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFVzZSBwcm92aWRlZCBwYXJhbXMgb3IgZGVmYXVsdHNcbiAgICAgICAgICAgIGVudiA9IGVudmlyb25tZW50SWRlbnRpZmllciB8fCB0aGlzLl9kZWZhdWx0RW52O1xuICAgICAgICAgICAgLy8gSWYgcHJldmlldyBleHBsaWNpdGx5IHRydWUgXHUyMTkyIHRydWVcbiAgICAgICAgICAgIC8vIElmIHByZXZpZXcgZXhwbGljaXRseSBmYWxzZSBcdTIxOTIgZmFsc2VcbiAgICAgICAgICAgIC8vIElmIHByZXZpZXcgdW5kZWZpbmVkOiBlbnYgd2FzIHNwZWNpZmllZCAodmlhIHBhcmFtIG9yIHNldEVudmlyb25tZW50KSBcdTIxOTIgZmFsc2UsIG90aGVyd2lzZSBcdTIxOTIgdHJ1ZVxuICAgICAgICAgICAgY29uc3QgaGFzRWZmZWN0aXZlRW52ID0gZW52aXJvbm1lbnRJZGVudGlmaWVyIHx8IHRoaXMuX2VudkV4cGxpY2l0bHlTZXQ7XG4gICAgICAgICAgICB1c2VQcmV2aWV3ID0gcHJldmlldyA9PT0gdHJ1ZSA/IHRydWUgOiAocHJldmlldyA9PT0gZmFsc2UgPyBmYWxzZSA6ICFoYXNFZmZlY3RpdmVFbnYpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgZW52LCB1c2VQcmV2aWV3LCBjYWNoZUtleTogYCR7Y29tcG9uZW50SWR9OiR7ZW52fToke3VzZVByZXZpZXcgPyAncHJldmlldycgOiAnbGl2ZSd9YCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlZWQgYW4gYWxyZWFkeS1yZXNvbHZlZCBjb21wb25lbnQgY29uZmlnIGludG8gdGhlIGNhY2hlLCB3aXRob3V0IGFueVxuICAgICAqIG5ldHdvcmsgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIFRoZSBjb3VudGVycGFydCB0byB7QGxpbmsgZmV0Y2hDb21wb25lbnRWMn06IHVzZSBpdCB3aGVuIHRoZSBjb25maWcgd2FzXG4gICAgICogcmVzb2x2ZWQgc29tZXdoZXJlIGVsc2UgXHUyMDE0IG1vc3Qgb2Z0ZW4gb24gYSBzZXJ2ZXIsIHRoZW4gZW1iZWRkZWQgaW4gdGhlXG4gICAgICogcGFnZSBcdTIwMTQgc28gdGhlIGJyb3dzZXIgY2FuIHJlbmRlciB0aGUgY29tcG9uZW50IHdpdGggbm8gcm91bmQgdHJpcC5cbiAgICAgKlxuICAgICAqIEFmdGVyIGh5ZHJhdGluZywgYGZldGNoQ29tcG9uZW50VjJgLCBgZ2V0UmVzb2x2ZWRDb25maWdgIGFuZCBgaXNQcmVsb2FkZWRgXG4gICAgICogYWxsIGFuc3dlciBmb3IgdGhpcyBjb21wb25lbnQgZnJvbSBtZW1vcnkuXG4gICAgICpcbiAgICAgKiBQYXNzIHRoZSBzYW1lIGBlbnZgIC8gYHByZXZpZXdgIHRoZSBjb25maWcgd2FzIHJlc29sdmVkIHdpdGg7IHRoZSBkZWZhdWx0c1xuICAgICAqIG1hdGNoIHdoYXQgYSBwbGFpbiBgZmV0Y2hDb21wb25lbnRWMihjb21wb25lbnRJZClgIHdvdWxkIGhhdmUgdXNlZC5cbiAgICAgKi9cbiAgICBoeWRyYXRlQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGNvbmZpZzogSUNvbXBvbmVudENvbmZpZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGVudjogcmVzb2x2ZWRFbnYsIHVzZVByZXZpZXcsIGNhY2hlS2V5IH0gPSB0aGlzLnJlc29sdmVQYXJhbXMoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk7XG5cbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShjb25maWcpIGFzIFByb21pc2U8SUNvbXBvbmVudENvbmZpZz4gJiB7IHJlc29sdmVkPzogSUNvbXBvbmVudENvbmZpZyB9O1xuICAgICAgICAvLyBUYWcgaXQgdGhlIHNhbWUgd2F5IGZldGNoQ29tcG9uZW50VjIgZG9lcywgc28gZ2V0UmVzb2x2ZWRDb25maWcgY2FuXG4gICAgICAgIC8vIHJlYWQgaXQgc3luY2hyb25vdXNseS5cbiAgICAgICAgcHJvbWlzZS5yZXNvbHZlZCA9IGNvbmZpZztcblxuICAgICAgICB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSA9IHByb21pc2U7XG4gICAgICAgIHRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF0gPSB7IGVudjogcmVzb2x2ZWRFbnYsIHByZXZpZXc6IHVzZVByZXZpZXcgfTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT0gVjEgTWV0aG9kcyAoTGVnYWN5KSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGEgdjEgY29tcG9uZW50IGZyb20gYSBmbG93XG4gICAgICovXG4gICAgYXN5bmMgZmV0Y2hDb21wb25lbnRWMShjb21wb25lbnRJZDogc3RyaW5nLCBmbG93SWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGZsb3dJZCkge1xuICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IHRoaXMuZmV0Y2hGbG93KGZsb3dJZCk7XG4gICAgICAgICAgICByZXR1cm4gZmxvdy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IGNvbXBvbmVudElkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoQXV0b0Zsb3coY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50c1swXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGZldGNoQXV0b0Zsb3coY29tcG9uZW50SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuX2Jhc2VVcmx9L2Zsb3c/aWQ9JHtjb21wb25lbnRJZH0mYXV0bz10cnVlYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF07XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hGbG93KGZsb3dJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VyRmxvd3NbZmxvd0lkXSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudXNlckZsb3dzW2Zsb3dJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Zmxvd0lkfSZyZXNvbHZlPWNvbXBvbmVudHNgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnVzZXJGbG93c1tmbG93SWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVzZXJGbG93c1tmbG93SWRdO1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PSBCYWNrd2FyZCBDb21wYXRpYmlsaXR5ID09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGZldGNoQ29tcG9uZW50VjIgb3IgZmV0Y2hDb21wb25lbnRWMSBleHBsaWNpdGx5XG4gICAgICogRGVmYXVsdHMgdG8gdjEgYmVoYXZpb3IgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBjb2RlXG4gICAgICovXG4gICAgYXN5bmMgZmV0Y2hDb21wb25lbnQoY29tcG9uZW50SWQ6IHN0cmluZywgZmxvd0lkPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoQ29tcG9uZW50VjEoY29tcG9uZW50SWQsIGZsb3dJZCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBDbG91ZFJlcG9zaXRvcnkgaW5zdGVhZFxuICovXG5leHBvcnQgY29uc3QgdjJfQ2xvdWRSZXBvc2l0b3J5ID0gQ2xvdWRSZXBvc2l0b3J5O1xuIiwgImltcG9ydCB7IENsb3VkUmVwb3NpdG9yeSB9IGZyb20gXCIuL0Nsb3VkUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgSUNvbXBvbmVudENvbmZpZyB9IGZyb20gXCIuLi9jb21tb25cIjtcblxubGV0IF9jbG91ZFJlcG9zaXRvcnkgPSBDbG91ZFJlcG9zaXRvcnkuTWFpbjtcblxuZXhwb3J0IGNvbnN0IGdldENsb3VkUmVwb3NpdG9yeSA9ICgpID0+IF9jbG91ZFJlcG9zaXRvcnk7XG5cbmV4cG9ydCBjb25zdCBpc1ByZWxvYWRlZCA9IChjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIF9jbG91ZFJlcG9zaXRvcnkuaXNQcmVsb2FkZWQoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UHJlbG9hZGVkUGFyYW1zID0gKGNvbXBvbmVudElkOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gX2Nsb3VkUmVwb3NpdG9yeS5nZXRQcmVsb2FkZWRQYXJhbXMoY29tcG9uZW50SWQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGVuYWJsZUxvY2FsRGV2ID0gKCkgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkgPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KFwiaHR0cDovL2xvY2FsaG9zdDo5MjkyXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldENsb3VkUmVwb3NpdG9yeVVybCA9ICh1cmw6IHN0cmluZykgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkgPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KHVybCk7XG59O1xuXG4vKipcbiAqIENvbmZpZ3VyZSB0aGUgU0RLIHRvIGZldGNoIGNvbXBvbmVudHMgZnJvbSBhIHNlbGYtaG9zdGVkIHN0YXRpYyByZWdpc3RyeSAoUzMsIENETiwgZXRjLilcbiAqIGluc3RlYWQgb2YgdGhlIE15b3AgY2xvdWQuIENvbXBvbmVudHMgYXJlIHNlcnZlZCBhcyBzdGF0aWMgSlNPTiBmaWxlczpcbiAqICAgYCR7Y2RuVXJsfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9LyR7ZW52aXJvbm1lbnR9Lmpzb25gXG4gKi9cbmV4cG9ydCBjb25zdCBlbmFibGVTZWxmSG9zdGVkID0gKGNkblVybDogc3RyaW5nLCBxdWVyeVBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5ID0gbmV3IENsb3VkUmVwb3NpdG9yeShjZG5VcmwpO1xuICAgIF9jbG91ZFJlcG9zaXRvcnkuZW5hYmxlU3RhdGljTW9kZSgpO1xuICAgIGlmIChxdWVyeVBhcmFtcykge1xuICAgICAgICBfY2xvdWRSZXBvc2l0b3J5LnNldFF1ZXJ5UGFyYW1zKHF1ZXJ5UGFyYW1zKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIFRIRSBPUFQtSU4uIE9uZSBjYWxsLCBhbmQgbm90aGluZyBjaGFuZ2VzIGZvciBhbnlvbmUgd2hvIGRvZXMgbm90IG1ha2UgaXQuXG4gKlxuICogICBteW9wLmRlbGl2ZXJ5KHsgbWluaWZ5OiB0cnVlIH0pO1xuICpcbiAqIE9wdGluZyBpbiBJUyBjaG9vc2luZyB0aGUgZGVsaXZlcnkgbGFuZTogYSBzZWNvbmQsIGNvbXBsZXRlIE15b3Agc3RhY2sgKGl0cyBvd24gc2VydmVyXG4gKiBhbmQgQ0ROKSByZWFkaW5nIHRoZSBzYW1lIGNvbXBvbmVudCBkYXRhLiBTbyB0aGlzIGNhbGwgZG9lcyB0d28gdGhpbmdzIGF0IG9uY2UgXHUyMDE0IGl0XG4gKiBwb2ludHMgYC9jb25zdW1lYCBhdCB0aGF0IHN0YWNrIGFuZCBhc2tzIGl0IGZvciB0aGUgbWluaWZpZWQgYXJ0aWZhY3QgXHUyMDE0IHdoaWNoIGlzIHdoeVxuICogdHVybmluZyB0aGUgZmVhdHVyZSBvZmYgaXMgYSBjb25maWcgdmFsdWUgb24gb3VyIHNpZGUgb3Igb25lIGxpbmUgb24geW91cnMsIGFuZCBuZXZlclxuICogYSBETlMgY2hhbmdlLlxuICpcbiAqIFNhZmV0eSBwcm9wZXJ0aWVzLCBhbGwgZGVsaWJlcmF0ZTpcbiAqICAgLSBJZiB0aGUgbGFuZSBmYWlscyAodHJhbnNwb3J0IGVycm9yIG9yIDV4eCksIHRoZSBTREsgcmV0cmllcyBPTkNFIGFnYWluc3RcbiAqICAgICBjbG91ZC5teW9wLmRldiBhbmQgdGhlIHBhZ2UgcmVuZGVycyBhbnl3YXkuIGBkZWxpdmVyeS5zdGF0cygpLmZlbGxCYWNrYCBjb3VudHMgaXQuXG4gKiAgIC0gYGNhY2hlOiB0cnVlYCBhZGRzIHRoZSBjbGllbnQgd2luZG93OiBhIGNvbXBvbmVudCB0aGlzIGJyb3dzZXIgYWxyZWFkeSBob2xkcywgc3RpbGxcbiAqICAgICBpbnNpZGUgdGhlIGZyZXNobmVzcyB0aGUgc2VydmVyIHByb21pc2VkLCBpcyByZW5kZXJlZCB3aXRoIE5PIHJlcXVlc3QuIE9uY2UgdGhlXG4gKiAgICAgd2luZG93IGVuZHMgdGhlIGJyb3dzZXIgc2VuZHMgYmFjayB0aGUgdmVyc2lvbiBpdCBob2xkcyBpbnN0ZWFkIG9mIHJlLWRvd25sb2FkaW5nLlxuICogICAtIEEgcHJldmlldyBpcyBuZXZlciBtaW5pZmllZCBhbmQgbmV2ZXIgY2FjaGVkLlxuICogICAtIE9ubHkgL2NvbnN1bWUgbW92ZXMuIEV2ZXJ5dGhpbmcgZWxzZSBrZWVwcyB0aGUgaG9zdCBpdCBoYXMgdG9kYXkuXG4gKiAgIC0gQXNraW5nIGZvciBgbWluaWZ5YCBkb2VzIG5vdCBmb3JjZSBpdDogdGhlIHNlcnZlciBkZWNpZGVzIHBlciBjb21wb25lbnQsIGFuZCBhXG4gKiAgICAgY29tcG9uZW50IHRoYXQgaXMgbm90IGVuYWJsZWQgaXMgc2VydmVkIHJhdywgd2hpY2ggaXMgbm90IGFuIGVycm9yLlxuICpcbiAqIGBob3N0YCBpcyBmb3IgdXMgKGEgc3RhZ2luZyBsYW5lLCBhIGxvY2FsIHNlcnZlcik7IGxlYXZlIGl0IG91dC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFTElWRVJZX0hPU1QgPSAnaHR0cHM6Ly9kZWxpdmVyeS5teW9wLmRldic7XG5cbmV4cG9ydCBjb25zdCBkZWxpdmVyeSA9IChvcHRzOiB7IG1pbmlmeT86IGJvb2xlYW47IGNhY2hlPzogYm9vbGVhbjsgaG9zdD86IHN0cmluZyB8IG51bGwgfSA9IHt9KSA9PiB7XG4gICAgY29uc3Qgd2FudHNMYW5lID0gb3B0cy5taW5pZnkgIT09IGZhbHNlIHx8IG9wdHMuY2FjaGUgPT09IHRydWU7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeS5zZXREZWxpdmVyeSh7XG4gICAgICAgIG1pbmlmeTogb3B0cy5taW5pZnkgPz8gZmFsc2UsXG4gICAgICAgIGNhY2hlOiBvcHRzLmNhY2hlID8/IGZhbHNlLFxuICAgICAgICBob3N0OiBvcHRzLmhvc3QgIT09IHVuZGVmaW5lZCA/IG9wdHMuaG9zdCA6ICh3YW50c0xhbmUgPyBERUxJVkVSWV9IT1NUIDogbnVsbCksXG4gICAgfSk7XG4gICAgcmV0dXJuIGRlbGl2ZXJ5U3RhdHMoKTtcbn07XG5cbi8qKlxuICogRm9yZ2V0IHdoYXQgdGhpcyBicm93c2VyIGhvbGRzLCBzbyB0aGUgbmV4dCBsb2FkIGFza3MgdGhlIHNlcnZlci4gVXNlIGl0IHdoZW4gYSBjaGFuZ2VcbiAqIGhhcyB0byBiZSB2aXNpYmxlIG9uIFRISVMgbG9hZCBcdTIwMTQgcmlnaHQgYWZ0ZXIgc29tZW9uZSBwdWJsaXNoZXMgXHUyMDE0IHJhdGhlciB0aGFuIHdpdGhpbiB0aGVcbiAqIGZyZXNobmVzcyB3aW5kb3cuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWxpdmVyeVJlZnJlc2ggPSBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgX2Nsb3VkUmVwb3NpdG9yeS5yZWZyZXNoRGVsaXZlcnkoKTtcbiAgICByZXR1cm4gZGVsaXZlcnlTdGF0cygpO1xufTtcblxuLyoqXG4gKiBXaGF0IGFuc3dlcmVkIHRoZSBsYXN0IHJlcXVlc3RzLCBhbmQgXHUyMDE0IHRoZSBudW1iZXIgd29ydGggd2F0Y2hpbmcgXHUyMDE0IGhvdyBtYW55IHRpbWVzIHRoZVxuICogU0RLIGhhZCB0byBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgaG9zdCBiZWNhdXNlIHRoZSBsYW5lIGRpZCBub3QgYW5zd2VyLlxuICovXG5leHBvcnQgY29uc3QgZGVsaXZlcnlTdGF0cyA9ICgpID0+IF9jbG91ZFJlcG9zaXRvcnkuZGVsaXZlcnlTdGF0cygpO1xuXG4vKiogVW5kbyBkZWxpdmVyeSgpOiBiYWNrIHRvIHRoZSBkZWZhdWx0IGhvc3QgYW5kIHJhdyBieXRlcywgd2l0aCBubyByZWxvYWQuICovXG5leHBvcnQgY29uc3QgZGVsaXZlcnlPZmYgPSAoKSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeS5zZXREZWxpdmVyeSh7IG1pbmlmeTogZmFsc2UsIGNhY2hlOiBmYWxzZSwgaG9zdDogbnVsbCB9KTtcbiAgICByZXR1cm4gZGVsaXZlcnlTdGF0cygpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldENsb3VkUmVwb3NpdG9yeSA9IChyZXBvc2l0b3J5OiBDbG91ZFJlcG9zaXRvcnkpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5ID0gcmVwb3NpdG9yeTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRFbnZpcm9ubWVudCA9IChlbnY6IHN0cmluZykgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkuc2V0RW52aXJvbm1lbnQoZW52KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZXNvbHZlZENvbmZpZyA9IChjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKSA9PiB7XG4gICAgcmV0dXJuIF9jbG91ZFJlcG9zaXRvcnkuZ2V0UmVzb2x2ZWRDb25maWcoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk7XG59O1xuXG5leHBvcnQgY29uc3QgcHJlbG9hZENvbXBvbmVudHMgPSBhc3luYyAoaWRzOiBzdHJpbmdbXSwgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbikgPT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICAgIGlkcy5tYXAoKGlkKSA9PiBfY2xvdWRSZXBvc2l0b3J5LmZldGNoQ29tcG9uZW50VjIoaWQsIGVudiwgcHJldmlldykpLFxuICAgICk7XG59O1xuXG4vKipcbiAqIFNlZWQgYWxyZWFkeS1yZXNvbHZlZCBjb21wb25lbnQgY29uZmlncyBpbnRvIHRoZSBTREsgY2FjaGUsIHdpdGggbm8gbmV0d29ya1xuICogcmVxdWVzdC4gVGhlIGNvdW50ZXJwYXJ0IHRvIHtAbGluayBwcmVsb2FkQ29tcG9uZW50c30uXG4gKlxuICogVXNlIGl0IHdoZW4gdGhlIGNvbmZpZ3Mgd2VyZSByZXNvbHZlZCBzb21ld2hlcmUgZWxzZSBcdTIwMTQgdHlwaWNhbGx5IG9uIGEgc2VydmVyXG4gKiBhbmQgZW1iZWRkZWQgaW4gdGhlIHBhZ2UgXHUyMDE0IHNvIHRoZSBjb21wb25lbnQgcmVuZGVycyB3aXRoIHplcm8gcm91bmQgdHJpcHM6XG4gKlxuICogYGBgdHNcbiAqIC8vIHNlcnZlcjogY29uc3QgY29uZmlncyA9IHsgW2lkXTogYXdhaXQgbmV3IENsb3VkUmVwb3NpdG9yeSgpLmZldGNoQ29tcG9uZW50VjIoaWQpIH1cbiAqIC8vIGNsaWVudDpcbiAqIGh5ZHJhdGVDb21wb25lbnRzKGNvbmZpZ3MpO1xuICogLy8gPE15b3BDb21wb25lbnQgY29tcG9uZW50SWQ9e2lkfSAvPiBub3cgcmVuZGVycyB3aXRob3V0IGZldGNoaW5nXG4gKiBgYGBcbiAqXG4gKiBQYXNzIHRoZSBzYW1lIGBlbnZgIC8gYHByZXZpZXdgIHRoZSBjb25maWdzIHdlcmUgcmVzb2x2ZWQgd2l0aDsgdGhlIGRlZmF1bHRzXG4gKiBtYXRjaCB3aGF0IGEgcGxhaW4gYHByZWxvYWRDb21wb25lbnRzKFtpZF0pYCB3b3VsZCBoYXZlIHVzZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBoeWRyYXRlQ29tcG9uZW50cyA9IChcbiAgICBjb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBJQ29tcG9uZW50Q29uZmlnPixcbiAgICBlbnY/OiBzdHJpbmcsXG4gICAgcHJldmlldz86IGJvb2xlYW4sXG4pID0+IHtcbiAgICBmb3IgKGNvbnN0IFtpZCwgY29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdzKSkge1xuICAgICAgICBfY2xvdWRSZXBvc2l0b3J5Lmh5ZHJhdGVDb21wb25lbnQoaWQsIGNvbmZpZywgZW52LCBwcmV2aWV3KTtcbiAgICB9XG59O1xuIiwgImltcG9ydCB7QmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlciwgSG9zdGVkQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHZvaWRcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBleHRlbmRzIEJhc2VDb250ZXh0TWVzc2FnZUhhbmRsZXI8VCwgUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PFNoYWRvd1Jvb3RSZWY+Pj4ge1xuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZVRvSG9zdDogYW55LCBwdWJsaWMgY29udGV4dDogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PFNoYWRvd1Jvb3RSZWY+Pikge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBpbm5lckV4ZWN1dG9yOiAoZXZlbnQ6IFQsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHZvaWQ7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogVCkgPT4ge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICBpZiAoZXZlbnQuZGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gZXZlbnQuZGVzdGluYXRpb247XG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0W2Rlc3RpbmF0aW9uXS5jb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBwYXRjaCB0aGUgc291cmNlIGlkLCB0aGluayBhYm91dCB0aGF0ID9cbiAgICAgICAgICAgICAgICBjb25zdCBfbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBldmVudC5kZXN0aW5hdGlvbiA/IGV2ZW50LmRlc3RpbmF0aW9uIDogZXZlbnQuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb246IGV2ZW50LnNvdXJjZSA/IGV2ZW50LnNvdXJjZSA6IGV2ZW50LmRlc3RpbmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0gYXMgQmFzZU15b3BNZXNzYWdlLCByZXBsYXlUbylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbm5lckV4ZWN1dG9yKGV2ZW50LCB0aGlzLmNvbnRleHRbZGVzdGluYXRpb25dLmNvbnRleHQsIF9tZXNzYWdlVG9Ib3N0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmluZENsaWNrTWVzc2FnZSwgQ2xpY2tSZXBsYXlNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEJpbmRDbGlja01lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KVxuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6IGFueVtdID0gW107XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7TXlvcEVsZW1lbnRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8TXlvcEVsZW1lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DaGFuZ2VUZXh0TWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IE15b3BFbGVtZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS50ZXh0Q29udGVudCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgU2hhZG93Um9vdFJlZiBleHRlbmRzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdDogU2hhZG93Um9vdCkge1xuICAgICAgICBzdXBlcihjb250YWluZXIsIHNoYWRvd1Jvb3QpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BFbGVtZW50UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlLCBEZXRlY3RNeW9wUmVmc01lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IERldGVjdE15b3BSZWZzTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuXG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH1dYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBNeW9wRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgYWxsTXlvcEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiB0YWtlIHRoYXQgYmFjayB0byB0aGUgZGFzaGJvYXJkP1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhpdGVtLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuXG4gICAgICAgICAgICBpZiAobXlvcElkKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnd2MgcmVjdCcsICBpdGVtLnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBpdGVtLm9mZnNldFRvcCwgaXRlbS5vZmZzZXRMZWZ0KSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IERldGVjdGVkTXlvcFJlZnNNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbXlvcFJlZnMpKVxuICAgIH07XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5EZXRlY3RNeW9wUmVmc01lc3NhZ2U7XG5cblxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRBdHRyaWJ1dGVNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3Mgc2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxTZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogU2V0QXR0cmlidXRlTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSwgZXZlbnQudmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSxcbiAgICBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlLFxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5BZGRFdmVudExpc3RlbmVyTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBpbiBmYWN0IHdoZW4gcnVubmluZyBpbiBXZWJDb21wb25lbnQgd2UgY2FuIHRyYW5zZmVyIHRoZSBvcmlnaW5hbCBlXG4gICAgICAgICAgICAgICAgLy8gY3VycmVudGx5IHVzaW5nIG1ha2VTZXJpYWxpemFibGUgZm9yIG5lc3RlZCBjYXNlcywgdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCAgbWFrZVNlcmlhbGl6YWJsZShlLCBldmVudC5zZXJpYWxpemFibGVTa2VsZXRvbikpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcblxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7SG9zdFNES30gZnJvbSBcIi4uLy4uL2hvc3QvaG9zdFNES1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVJlZiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWY/LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcblxuICAgICAgICAgICAgaWYgKGFsbEl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RTREsgPSBIb3N0U0RLLkluc3RhbmNlKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGV2ZW50Lm9wdGlvbnMuaWQpITtcbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vLy8+Pj4+XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vICBjb25zb2xlLmxvZyhgZmFpbGVkIHRvIGZpbmQgJHtldmVudC5vcHRpb25zLmlkfSBpbiBtZW0gc2NvcGVgLCBob3N0U0RLKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy93ZSBoYXZlIHRoZSByZWYgY29tcG9uZW50IGluIG91ciBIb3N0U0RLIChzYW1lIG1lbW9yeSB3aGVuIHVzaW5nIHdlYmNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAvLyAgcmVmQ29tcG9uZW50LnBhcmVudCA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoZSByZWYgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBob3N0U0RLLmNvbXBvbmVudHMuaW5kZXhPZihyZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdFNESy5jb21wb25lbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQgcmVtb3ZlZCB0ZW1wIHJlZiBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkIHVzaW5nIHRlbXAgcmVmIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50ID0gYXdhaXQgaG9zdFNESy5sb2FkQ29tcG9uZW50KGV2ZW50Lm5lc3RlZENvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuaXRlbSgwKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucylcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IG5vIG5lZWQgdGhpcywgcGFzcyBvcHRpb25zIGZyb20gcGFyZW50XG4gICAgICAgICAgICAgICAgLy9pbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5pZCA9IGV2ZW50LnByZWRlZmluZWRJZDtcbiAgICAgICAgICAgICAgICAvL3JlZkNvbXBvbmVudC5pZCArPSAnLic7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBub3QgcmVhbGx5IG5lZWRlZCA/XG4gICAgICAgICAgICAgICAgLy8gYXdhaXQgaW1wbGVtZW50YXRpb25Db21wb25lbnQuaW5pdGlhdGVkKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRSZWZDb25maWc6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5yZWZzKS5mb3JFYWNoKHJlZk5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVmID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQucmVmc1tyZWZOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgcmVmID0gcmVmLl9fbm9uUHJveGllZCB8fCByZWY7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlZkNvbmZpZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbmVzdGVkUmVmQ29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIC0gRE9NIGVsZW1lbnQgbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgW10sIHRydWUpKTtcblxuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRlUmVmKCkudGhlbigpXG4gICAgICAgIC8vcmV0dXJuaW5nIHVuZGVmaW5lZCBzbyBpdCB3b24ndCBhY3QgYXMgYSBjbGVhbnVwXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3J9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0SGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxFeGVjdXRlU2NyaXB0TWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVTY3JpcHRNZXNzYWdlXG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCByZXBsaWVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIGRhdGEpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yKGV2ZW50LCByZXBsaWVyLCBzaGFkb3dSb290UmVmKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UsIEZvcm1EYXRhRW50cnksIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIElucHV0RWxlbWVudFZhbHVlLH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHMudHNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IGdldElucHV0VmFsdWUgPSAoZWxlbWVudCk6IElucHV0RWxlbWVudFZhbHVlID0+IHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGZvcm1cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGRhdGFPYmplY3Q6IElucHV0RWxlbWVudFZhbHVlID0ge1xuICAgICAgICAgICAgZm9ybURhdGE6IHt9LFxuICAgICAgICAgICAgdW5tYXBwZWREYXRhOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE1hbnVhbGx5IGFkZCBlbGVtZW50cyB3aXRob3V0IG5hbWVzXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpO1xuICAgICAgICBsZXQgYXV0b05hbWVJbmRleGVyID0gLTE7XG5cbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBgXyR7KCsrYXV0b05hbWVJbmRleGVyKX1gXG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlRGF0YTogRm9ybURhdGFFbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldElucHV0VmFsdWUoZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBlbGVtZW50LnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eTogbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LnZhbGlkaXR5LCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgbXlvcElkLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGF0YU9iamVjdDtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtZW50LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2hlY2tlZCA/IGVsZW1lbnQudmFsdWUgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBpbnB1dCBhbmQgdGV4dGFyZWEgZWxlbWVudHNcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnIHx8IGVsZW1lbnQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc2VsZWN0IGVsZW1lbnRzIChkcm9wZG93bnMpXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGVkaXRhYmxlIGRpdnMgKGNvbnRlbnRFZGl0YWJsZSlcbiAgICBpZiAoZWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5pbm5lclRleHQgfHwgZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGFuIHVuc3VwcG9ydGVkIGVsZW1lbnQgdHlwZVxuICAgIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgR2V0RWxlbWVudFZhbHVlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxHZXRFbGVtZW50VmFsdWVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5HZXRFbGVtZW50VmFsdWVNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZShnZXRJbnB1dFZhbHVlKGl0ZW0pKSwgZXZlbnQpO1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7TXlvcEVsZW1lbnRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxTZXRJbm5lckh0bWw+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldElubmVySHRtbDtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IE15b3BFbGVtZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5pbm5lckhUTUwgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogVGhlIFdlYmNvbXBvbmVudCBTREsgaXMgdGFpbG9yZWQgZm9yIHVzaW5nIE15b3AgY29tcG9uZW50cyBwYWNrYWdlZCBhcyBzZXBhcmF0ZSBidW5kbGVzIGFuZCBleHBvc2VkIGFzIHdlYiBjb21wb25lbnRzLjxici8+XG4gKiBEZXZlbG9wZXJzIGltcG9ydGluZyB0aGlzIFNESyBjYW4gbGV2ZXJhZ2UgQVBJcyBhbmQgdXRpbGl0aWVzIHNwZWNpZmljYWxseSBjcmFmdGVkIHRvIHN1cHBvcnQgdGhlIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGFuZCBjb21tdW5pY2F0aW9uIHBhdHRlcm5zIHJlcXVpcmVkIGZvciB3ZWIgY29tcG9uZW50cyB3aXRoaW4gdGhlIE15b3AgYXJjaGl0ZWN0dXJlLjxici8+XG4gKiBUaGlzIFNESyBwcm9tb3RlcyByZXVzYWJpbGl0eSBhbmQgZW5jYXBzdWxhdGlvbiwgZW5hYmxpbmcgZGV2ZWxvcGVycyB0byBidWlsZCBtb2R1bGFyLCBzZWxmLWNvbnRhaW5lZCBjb21wb25lbnRzIHRoYXQgY2FuIGJlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uJ3MgRE9NIHN0cnVjdHVyZS5cbiAqXG4gKlxuICogT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuICogYGBganNcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7V2ViQ29tcG9uZW50U0RLfSBmcm9tICdAbXlvcC9zZGsvd2ViY29tcG9uZW50JztcbiAqIGBgYFxuICpcbiAqL1xuaW1wb3J0IHtCYXNlTXlvcFNES30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BXZWJjb21wb25lbnRDb25zdHN9IGZyb20gXCIuL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7QmluZE9uQ2xpY2tIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyXCI7XG5pbXBvcnQge0NoYW5nZVRleHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvY2hhbmdlVGV4dEhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVxdWVzdCxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge3NldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIudHNcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0dldEVsZW1lbnRWYWx1ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NldElubmVySHRtbEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzXCI7XG5cbi8qKlxuICogVGhlIFdlYmNvbXBvbmVudCBTREsgaXMgdGFpbG9yZWQgZm9yIHVzaW5nIE15b3AgY29tcG9uZW50cyBwYWNrYWdlZCBhcyBzZXBhcmF0ZSBidW5kbGVzIGFuZCBleHBvc2VkIGFzIHdlYiBjb21wb25lbnRzLjxici8+XG4gKiBEZXZlbG9wZXJzIGltcG9ydGluZyB0aGlzIFNESyBjYW4gbGV2ZXJhZ2UgQVBJcyBhbmQgdXRpbGl0aWVzIHNwZWNpZmljYWxseSBjcmFmdGVkIHRvIHN1cHBvcnQgdGhlIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGFuZCBjb21tdW5pY2F0aW9uIHBhdHRlcm5zIHJlcXVpcmVkIGZvciB3ZWIgY29tcG9uZW50cyB3aXRoaW4gdGhlIE15b3AgYXJjaGl0ZWN0dXJlLjxici8+XG4gKiBUaGlzIFNESyBwcm9tb3RlcyByZXVzYWJpbGl0eSBhbmQgZW5jYXBzdWxhdGlvbiwgZW5hYmxpbmcgZGV2ZWxvcGVycyB0byBidWlsZCBtb2R1bGFyLCBzZWxmLWNvbnRhaW5lZCBjb21wb25lbnRzIHRoYXQgY2FuIGJlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uJ3MgRE9NIHN0cnVjdHVyZS5cbiAqXG4gKlxuICogT25jZSBsb2FkZWQgdGhlIGBSb290IFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiAqIGBgYGpzXG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkNvbXBvbmVudFNESyBleHRlbmRzIEJhc2VNeW9wU0RLIHtcblxuICAgIGFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3QgPSB0cnVlO1xuXG4gICAgLy93aGVuIG5ldyB3ZWIgY29tcG9uZW50IGNyZWF0ZWQuXG4gICAgY29ubmVjdGVkQ2FsbGJhY2sgPSAoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgc2hhZG93OiBTaGFkb3dSb290KSA9PiB7XG4gICAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKG15b3BXZWJjb21wb25lbnRDb25zdHMud2ViY29tcG9uZW50X21lc3NhZ2Vfa2V5LCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gZS5kYXRhID8gZS5kYXRhIDogZS5kZXRhaWw7XG4gICAgICAgICAgICBpZiAoIWV2ZW50Q29udGVudCB8fCAhZXZlbnRDb250ZW50Lm15b3ApIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlY3ZpZWQgd2ViY29tcG9uZW50X21lc3NhZ2Ugd2l0aCB3cm9uZyB0eXBlJylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50Q29udGVudCBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBzZW5kIGNvbnRhaW5lciAvIGNvbXBvZW5udCBpZGVudGlmaWVyIGZvciBtdWx0aWwgY29tcG9uZW50cyBzdXBwb3J0XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlcyhlKVxuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbXBvbmVudElkID0gKG1lc3NhZ2UgYXMgSW5pdE1lc3NhZ2UpLmNvbnRlbnQuaWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0uY29udGV4dCA9IG5ldyBTaGFkb3dSb290UmVmKGNvbnRhaW5lciwgc2hhZG93KVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuc3VwcG9ydGVkSGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGhhbmRsZXIuY29udGV4dCA9IHRoaXMuc2hhZG93Um9vdHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrLiByYWNlIGNvbmRpdGlvbiB3aXRoIGhvc3QubG9hZCB3aGVuIG1vZHVsZSBsb2FkZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXF1ZXN0KCkpXG4gICAgICAgIH0sIDEpXG4gICAgfVxuXG4gICAgbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi51cFxuICAgICAgICAvL21lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZDtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyICYmIHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQpXG4gICAgICAgICAgICBtZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvLmhhbmRsZXJVbmlxdWVJZFxuXG4gICAgICAgIHdpbmRvdy5teW9wLmhvc3RTREsuc2VuZChtZXNzYWdlKVxuICAgIH1cblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJbXSA9IFtcbiAgICAgICAgbmV3IENoYW5nZVRleHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IFNldElubmVySHRtbEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgQmluZE9uQ2xpY2tIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgc2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBBZGRFdmVudExpc3RlbmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBFeGVjdXRlU2NyaXB0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgLy9cbiAgICAgICAgbmV3IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKVxuICAgIF07XG5cbiAgICBwdWJsaWMgaW5pdCA9ICgpID0+IHtcbiAgICAgICAgLy90aGlzLm15Q29tcG9uZW50SWRcbiAgICAgICAgLy90aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzXG4gICAgfVxufVxuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdXZWJDb21wb25lbnRTREsnLCBXZWJDb21wb25lbnRTREspO1xuIiwgImltcG9ydCB7TXlvcFdlYkNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJSFRNTExvYWRlckNvbmZpZyxcbiAgICBJU2tpbkNvbmZpZywgU2hhZG93Um9vdE1vZGVUeXBlLFxuICAgIFNraW5Mb2FkZXJzLFxuICAgIFJlbmRlck1vZGUsIFJlbmRlclBvbGljeVxufSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1dlYkNvbXBvbmVudFNES30gZnJvbSBcIi4uLy4uL3dlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wSWZyYW1lQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50LnRzXCI7XG5pbXBvcnQge0VNQkVEREVEX1NES19DT05URU5ULCBIQVNfRU1CRURERURfU0RLfSBmcm9tIFwiLi4vZW1iZWRkZWRTREsudHNcIjtcbi8vaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gXCIuLi8uLi9TREsudHNcIjtcblxuY29uc3QgTVlPUF9XRUJfQ09NUE9ORU5UX01BUktFUiA9ICc8IS0tIG15b3Atd2ViLWNvbXBvbmVudCAtLT4nO1xuY29uc3QgTVlPUF9XRUJfQ09NUE9ORU5UX1NDUklQVF9JRCA9ICdteW9wLXdlYi1jb21wb25lbnQnO1xuXG4vLyBUcmFjayBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudCBzY3JpcHRzIHRvIHByZXZlbnQgZG91YmxlIHJlZ2lzdHJhdGlvbi5cbi8vIE1hcHMgc2NyaXB0SWQgLT4gdGhlIHRhZyBuYW1lIHRoYXQgc2NyaXB0IHJlZ2lzdGVyZWQuIFRoZSB0YWcgTVVTVCBiZSByZW1lbWJlcmVkIHBlclxuLy8gc2NyaXB0OiB3aW5kb3cuX19NWU9QX1RBR19OQU1FX18gaXMgYSBzaW5nbGUgZ2xvYmFsIHNsb3QgdGhhdCBldmVyeSBleHRyYWN0ZWQgY29tcG9uZW50XG4vLyBvdmVyd3JpdGVzLCBzbyBvbiBhIHJlLW1vdW50IChzY3JpcHQgc2tpcHBlZCkgaXQgaG9sZHMgd2hpY2hldmVyIGNvbXBvbmVudCByYW4gbGFzdC5cbmNvbnN0IGV4dHJhY3RlZFdlYkNvbXBvbmVudFNjcmlwdHM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG5cbmNvbnN0IHNlZW46IHN0cmluZ1tdID0gW107XG5sZXQgc2RrO1xuY29uc3QgZ2V0SW5pdGlhdGVkU2RrID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghc2RrKSB7XG4gICAgICAgIC8vY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSBhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKVxuICAgICAgICBzZGsgPSBuZXcgV2ViQ29tcG9uZW50U0RLKCk7XG4gICAgICAgIHNkay5pbml0KCk7XG4gICAgfVxuICAgIHJldHVybiBzZGs7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhUTUxFbGVtZW50Q29uc3RydWN0b3IoaHRtbFN0cmluZzogc3RyaW5nLCBTaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGUpOiBuZXcgKCkgPT4gSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEhUTUxFbGVtZW50IHtcblxuICAgICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vZGUgPSBTaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLm9wZW4gPyAnb3BlbicgOiAnY2xvc2VkJztcbiAgICAgICAgICAgIGNvbnN0IHNoYWRvdyA9IHRoaXMuYXR0YWNoU2hhZG93KHttb2RlfSk7XG4gICAgICAgICAgICBnZXRJbml0aWF0ZWRTZGsoKS50aGVuKChzZGspID0+IHtcbiAgICAgICAgICAgICAgICBzZGsuY29ubmVjdGVkQ2FsbGJhY2sodGhpcywgc2hhZG93KTtcbiAgICAgICAgICAgICAgICBzaGFkb3cuaW5uZXJIVE1MID0gaHRtbFN0cmluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmNvbnN0IGNyZWF0ZUN1c3RvbVdlYkNvbXBvbmVudCA9IChjb21wb25lbnROYW1lOiBzdHJpbmcsIGh0bWw6IHN0cmluZywgU2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlKSA9PiB7XG4gICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKGNvbXBvbmVudE5hbWUsIGNyZWF0ZUhUTUxFbGVtZW50Q29uc3RydWN0b3IoaHRtbCwgU2hhZG93Um9vdE1vZGUpKTtcbiAgICBjb25zb2xlLmxvZyhgZGVmaW5lKCcke2NvbXBvbmVudE5hbWV9Jykgd2FzIGNhbGxlZCwgd2ViIGNvbXBvbmVudCByZWFkeSB0byB1c2VgKTtcbn1cblxuY29uc3QgdG9XZWJDb21wb25lbnROYW1lID0gKHN0cikgPT4ge1xuICAgIHJldHVybiBzdHJcbiAgICAgICAgLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMS0kMicpIC8vIEFkZCBoeXBoZW4gYmVmb3JlIHVwcGVyY2FzZSBsZXR0ZXJzXG4gICAgICAgIC5yZXBsYWNlKC8oXFxkKykvZywgJy0kMScpIC8vIEFkZCBoeXBoZW4gYmVmb3JlIGRpZ2l0c1xuICAgICAgICAudG9Mb3dlckNhc2UoKTsgLy8gQ29udmVydCB0byBsb3dlcmNhc2Vcbn1cblxuY29uc3QgdG9DdXN0b21FbGVtZW50TmFtZSA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICBuYW1lID0gdG9XZWJDb21wb25lbnROYW1lKG5hbWUpO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoL18vZywgJy0nKTtcbn1cblxubGV0IHBhcnNlcjogRE9NUGFyc2VyOyAvLyA9IG5ldyBET01QYXJzZXIoKTtcblxuZXhwb3J0IGNsYXNzIEhUTUxDb21wb25lbnRMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG5cbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuSFRNTExvYWRlclxuXG4gICAgLyoqXG4gICAgICogRGV0ZWN0IGlmIEhUTUwgaXMgYSBNeW9wIFdlYiBDb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBUSEUgTUFSS0VSIENPTU1FTlQgQUxPTkUgSVMgTk9UIEEgU0FGRSBTSUdOQUwsIEJFQ0FVU0UgTUlOSUZJRVJTIERFTEVURSBDT01NRU5UUy5cbiAgICAgKlxuICAgICAqIFRoaXMgdXNlZCB0byBiZSBgc3RhcnRzV2l0aChNWU9QX1dFQl9DT01QT05FTlRfTUFSS0VSKWAgYW5kIG5vdGhpbmcgZWxzZS4gVGhlXG4gICAgICogZGVsaXZlcnkgbGFuZSBtaW5pZmllcyB3aXRoIGByZW1vdmVDb21tZW50czogdHJ1ZWAgKG15b3Atc2VydmVyIGRlcml2ZS50cyBNSU5fQ0ZHKSxcbiAgICAgKiBzbyB0aGUgc3RvcmVkIGBtaW5gIGFydGlmYWN0IG9mIGV2ZXJ5IHYyIHdlYiBjb21wb25lbnQgbG9zZXMgaXRzIGxlYWRpbmdcbiAgICAgKiBgPCEtLSBteW9wLXdlYi1jb21wb25lbnQgLS0+YC4gRGV0ZWN0aW9uIHRoZW4gcmV0dXJuZWQgZmFsc2UsIHRoZSBjb21wb25lbnQgZmVsbFxuICAgICAqIGJhY2sgdG8gcGxhaW4gaWZyYW1lIHJlbmRlcmluZywgYW5kIHRoZSB3aG9sZSBhdXRob3JlZCBkb2N1bWVudCB3YXMgc2hvd24gLS1cbiAgICAgKiBpbmNsdWRpbmcgdGhlIHYyIGF1dGhvcmluZyB3cmFwcGVyLCBzbyBQaWMtVGltZSdzIHByb2R1Y3Rpb24gZGFzaGJvYXJkIGRpc3BsYXllZCB0aGVcbiAgICAgKiBwcmV2aWV3IGNocm9tZSAoXCJXZWIgQ29tcG9uZW50IHYyXCIsIGEgdGFnLW5hbWUgYmFkZ2UgcmVhZGluZyBgbG9hZGluZy4uLmAsIFNJWkUgL1xuICAgICAqIE9WRVJGTE9XIC8gQkcgY29udHJvbHMpIGluc3RlYWQgb2YgdGhlaXIgY29tcG9uZW50LiBSZXBvcnRlZCAyMDI2LTEwLTE4OyB0aGUgc2VydmVkXG4gICAgICogSFRNTCBtZWFzdXJlZCAzMjgsMDcxIGJ5dGVzIGFnYWluc3QgOTUxLDEzMCBhdCBvcmlnaW4sIHdpdGggemVybyBgPCEtLWAgbGVmdCBpbiBpdC5cbiAgICAgKlxuICAgICAqIFRoZSBzY3JpcHQgaWQgaXMgdGhlIHNpZ25hbCB0aGF0IHN1cnZpdmVzLCBhbmQgaXQgaXMgdGhlIG9uZSBgZXh0cmFjdFdlYkNvbXBvbmVudFNjcmlwdGBcbiAgICAgKiBhbHJlYWR5IGRlcGVuZHMgb246IGlmIHRoYXQgZWxlbWVudCBpcyBwcmVzZW50LCBleHRyYWN0aW9uIHdvcmtzLCBzbyBkZXRlY3Rpb25cbiAgICAgKiBzaG91bGQgYWdyZWUuIENoZWNrZWQgd2l0aCBhIHJlZ2V4IHJhdGhlciB0aGFuIERPTVBhcnNlciAtLSB0aGlzIHJ1bnMgZm9yIGV2ZXJ5XG4gICAgICogSFRNTCBjb21wb25lbnQsIGFuZCBwYXJzaW5nIGEgMzAwIEtCIGRvY3VtZW50IHRvIGFuc3dlciBhIHllcy9ubyBxdWVzdGlvbiBpcyBub3RcbiAgICAgKiB3b3J0aCBpdC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlzTXlvcFdlYkNvbXBvbmVudChodG1sOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGh0bWwudHJpbVN0YXJ0KCkuc3RhcnRzV2l0aChNWU9QX1dFQl9DT01QT05FTlRfTUFSS0VSKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGA8c2NyaXB0W14+XSpcXFxcc2lkPVtcIiddPyR7TVlPUF9XRUJfQ09NUE9ORU5UX1NDUklQVF9JRH1bXCInXFxcXHM+XWAsICdpJykudGVzdChodG1sKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIGhvdyB0aGlzIGNvbXBvbmVudCBzaG91bGQgcmVuZGVyLCBhcHBseWluZyB0aGUgaG9zdCByZW5kZXIgcG9saWN5LlxuICAgICAqIFByZWNlZGVuY2U6IG9wdGlvbnMucmVuZGVyUG9saWN5IChwZXItY2FsbCkgZnVsbHkgcmVwbGFjZXMgdGhlIGdsb2JhbFxuICAgICAqIGhvc3RTREsuc2V0UmVuZGVyUG9saWN5IFx1MjAxNCBzbyBhbiBhcHAgY2FuIHJlc3RyaWN0IGdsb2JhbGx5IGFuZCBhbGxvdyBzcGVjaWZpY3MuXG4gICAgICogV2l0aCBubyBwb2xpY3kgc2V0LCBiZWhhdmlvciBpcyB1bmNoYW5nZWQgZnJvbSBiZWZvcmUgKG1hcmtlciBcdTIxRDIgd2ViIGNvbXBvbmVudCkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyByZXNvbHZlUmVuZGVyTW9kZShcbiAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIHNraW46IElTa2luQ29uZmlnLFxuICAgICAgICBsb2FkZXJDb25maWc6IElIVE1MTG9hZGVyQ29uZmlnLFxuICAgICAgICBpc1dlYkNvbXBvbmVudDogYm9vbGVhbixcbiAgICAgICAgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTx7IG1vZGU6IFJlbmRlck1vZGUgfCBmYWxzZTsgaXNvbGF0ZTogYm9vbGVhbiB9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZE1vZGU6IFJlbmRlck1vZGUgPSBpc1dlYkNvbXBvbmVudFxuICAgICAgICAgICAgPyAnd2ViQ29tcG9uZW50J1xuICAgICAgICAgICAgOiAoKGxvYWRlckNvbmZpZy5pc29sYXRpb24gfHwgb3B0aW9ucz8uaXNvbGF0aW9uKSA/ICdpc29sYXRlZElmcmFtZScgOiAnaWZyYW1lJyk7XG5cbiAgICAgICAgLy8gcGVyLWNhbGwgcG9saWN5IHdpbnM7IGVsc2UgZ2xvYmFsIHBvbGljeSBvbiB0aGUgaG9zdCBTREsgc2luZ2xldG9uLlxuICAgICAgICBjb25zdCBwb2xpY3k6IFJlbmRlclBvbGljeSB8IHVuZGVmaW5lZCA9XG4gICAgICAgICAgICBvcHRpb25zPy5yZW5kZXJQb2xpY3kgPz8gKHdpbmRvdyBhcyBhbnkpPy5teW9wPy5ob3N0U0RLPy5nZXRSZW5kZXJQb2xpY3k/LigpO1xuXG4gICAgICAgIGNvbnN0IG1vZGU6IFJlbmRlck1vZGUgfCBmYWxzZSA9IHBvbGljeVxuICAgICAgICAgICAgPyBhd2FpdCBwb2xpY3koeyBjb21wb25lbnREZWZpbml0aW9uLCBza2luLCByZXF1ZXN0ZWRNb2RlLCBpc1dlYkNvbXBvbmVudCB9KVxuICAgICAgICAgICAgOiByZXF1ZXN0ZWRNb2RlO1xuXG4gICAgICAgIHJldHVybiB7IG1vZGUsIGlzb2xhdGU6IG1vZGUgPT09ICdpc29sYXRlZElmcmFtZScgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW4tZnJhbWUgYnJpZGdlIGZvciBpc29sYXRlZCBjb21wb25lbnRzLiBSdW5zIGluc2lkZSB0aGUgc2FuZGJveGVkXG4gICAgICogKG9wYXF1ZS1vcmlnaW4pIGlmcmFtZSwgdHJhbnNsYXRpbmcgdGhlIHNhbWUgYXV0aG9yLWZhY2luZyBjb250cmFjdCB0by9mcm9tXG4gICAgICogcG9zdE1lc3NhZ2Ugc2luY2UgdGhlIGhvc3QgaGFzIG5vIHNhbWUtb3JpZ2luIGFjY2VzczpcbiAgICAgKiAgIFx1MjAyMiBkYXRhLWluIDogcGFyZW50IHBvc3RzIHt0eXBlOidteW9wOmluaXQnfSBcdTIxOTIgY2FsbHMgd2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2VcbiAgICAgKiAgICAgICAgICAgICAgIChwbHVzIGEgYmFrZWQgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGZpcnN0IHJlbmRlcilcbiAgICAgKiAgIFx1MjAyMiBkYXRhLW91dDogd2luZG93Lm15b3BfY3RhX2hhbmRsZXIgXHUyMTkyIHBhcmVudC5wb3N0TWVzc2FnZSh7dHlwZTonbXlvcDpjdGEnfSlcbiAgICAgKiAgIFx1MjAyMiByZXNpemUgIDogUmVzaXplT2JzZXJ2ZXIgXHUyMTkyIHBhcmVudC5wb3N0TWVzc2FnZSh7dHlwZTonbXlvcDpzaXplJ30pXG4gICAgICpcbiAgICAgKiBUT0RPKGRldi1leHRlbnNpb24pOiB0aGUgaXNvbGF0ZWQgcGF0aCBkZWxpYmVyYXRlbHkgc2tpcHMgdGhlIHNhbWUtb3JpZ2luXG4gICAgICogZGF0YVNjcmlwdCwgc28gaXQgbmV2ZXIgcG9zdHMgdGhlIGBNWU9QX1BSRUlOSkVDVEVEX0lOSVRgIG1lc3NhZ2UgdGhlIE15b3AgZGV2XG4gICAgICogZXh0ZW5zaW9uIGxpc3RlbnMgZm9yIHRvIGxvZyB0aGUgSU5JVElBTCByZW5kZXIgKGBpbml0KmApLiBMYXRlciBpbml0IHVwZGF0ZXMgYW5kXG4gICAgICogYWxsIENUQXMgYXJlIHN0aWxsIHRyYWNrZWQgKHRoZSBleHRlbnNpb24gd3JhcHMgYGNvbXAucHJvcHNgLCB3aGljaCBvdXIgaXNvbGF0ZWRcbiAgICAgKiBjb25uZWN0UHJvcHMgYnJhbmNoIHJvdXRlcyB0aHJvdWdoKSwgc28gb25seSB0aGUgZmlyc3QtcmVuZGVyIHBheWxvYWQgaXMgbWlzc2luZ1xuICAgICAqIGZyb20gdGhlIGV4dGVuc2lvbidzIGFjdGl2aXR5IGxvZyBmb3IgaXNvbGF0ZWQgY29tcG9uZW50cy4gQ2xvc2luZyB0aGlzIHdvdWxkIGJlIGFcbiAgICAgKiB+MS1saW5lIGBwYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6J01ZT1BfUFJFSU5KRUNURURfSU5JVCcsIHBheWxvYWQ6e2RhdGF9fSlgIGluc2lkZVxuICAgICAqIGZsdXNoSW5pdGlhbCgpIGJlbG93IFx1MjAxNCBpbnRlbnRpb25hbGx5IE5PVCBkb25lIGZvciBub3cgdG8gYXZvaWQgYWRkaW5nIGV4dGVuc2lvbi1vbmx5XG4gICAgICogdHJhZmZpYyB0byB0aGUgY29tcG9uZW50IHJ1bnRpbWUuIFdlYiBjb21wb25lbnRzIGhhdmUgdGhlIHNhbWUgaW5pdGlhbC1pbml0IGdhcFxuICAgICAqIChpbml0V2l0aERhdGEgaXMgY2FsbGVkIG9uIHRoZSBlbGVtZW50LCBub3QgdmlhIGNvbXAucHJvcHMpIGFuZCBpdCBwcmVkYXRlcyB0aGlzLlxuICAgICAqL1xuICAgIHByaXZhdGUgYnVpbGRJc29sYXRpb25CcmlkZ2UoaW5pdGlhbERhdGFMaXRlcmFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYDxzY3JpcHQ+XG4gICAgICAgICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBfX2luaXRpYWwgPSAke2luaXRpYWxEYXRhTGl0ZXJhbH07XG4gICAgICAgICAgICAgICAgdmFyIF9fcGVuZGluZztcbiAgICAgICAgICAgICAgICAvLyBkYXRhLW91dCAoY3RhKVxuICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wX2N0YV9oYW5kbGVyID0gZnVuY3Rpb24gKGFjdGlvbiwgcGF5bG9hZCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkgeyBwYXJlbnQucG9zdE1lc3NhZ2UoeyBfX215b3A6IHRydWUsIHR5cGU6ICdteW9wOmN0YScsIGFjdGlvbjogYWN0aW9uLCBwYXlsb2FkOiBwYXlsb2FkIH0sICcqJyk7IH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjYWxsSW5pdChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHsgd2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2UoZGF0YSk7IHJldHVybiB0cnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZGF0YS1pbiAoaW5pdCB1cGRhdGVzKVxuICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBlLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZCB8fCBkLl9fbXlvcCAhPT0gdHJ1ZSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZC50eXBlID09PSAnbXlvcDppbml0JykgeyBpZiAoIWNhbGxJbml0KGQuZGF0YSkpIF9fcGVuZGluZyA9IGQuZGF0YTsgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIGZpcnN0IHJlbmRlcjogdXNlIGEgcGVuZGluZyB1cGRhdGUgaWYgb25lIGFycml2ZWQsIGVsc2UgdGhlIGJha2VkIGluaXRpYWwgZGF0YVxuICAgICAgICAgICAgICAgIChmdW5jdGlvbiBmbHVzaEluaXRpYWwoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gKF9fcGVuZGluZyAhPT0gdW5kZWZpbmVkKSA/IF9fcGVuZGluZyA6IF9faW5pdGlhbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbEluaXQoZGF0YSkpIHsgX19wZW5kaW5nID0gdW5kZWZpbmVkOyBfX2luaXRpYWwgPSB1bmRlZmluZWQ7IH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZmx1c2hJbml0aWFsKTtcbiAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICAgIC8vIHJlc2l6ZSAocmVwb3J0IGNvbnRlbnQgc2l6ZSlcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjb250ZW50SGVpZ2h0KCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNZWFzdXJlIHRoZSBCT0RZIChjb250ZW50IGJveCkuIGRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQgaW5jbHVkZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGlmcmFtZSB2aWV3cG9ydCBcdTIwMTQgd2hpY2ggd2UncmUgZHJpdmluZyBcdTIwMTQgc28gaXQgd291bGQgcmVwb3J0IHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGZyYW1lIGhlaWdodCwgbm90IHRoZSBjb250ZW50LCBhbmQgbmV2ZXIgc2hyaW5rLlxuICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGRvY3VtZW50LmJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiKSByZXR1cm4gTWF0aC5tYXgoYi5zY3JvbGxIZWlnaHQsIGIub2Zmc2V0SGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHBvc3RTaXplKCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX215b3A6IHRydWUsIHR5cGU6ICdteW9wOnNpemUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogY29udGVudEhlaWdodCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sICcqJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE9ic2VydmUgdGhlIEJPRFkgKHJlZmxvd3Mgd2l0aCBjb250ZW50KSBcdTIwMTQgbm90IGRvY3VtZW50RWxlbWVudCwgd2hvc2UgYm94IGlzXG4gICAgICAgICAgICAgICAgLy8gdGhlIGlmcmFtZSB2aWV3cG9ydCBhbmQgd291bGQgZmVlZCBiYWNrIGludG8gYSByZXNpemUgbG9vcC4gQSBNdXRhdGlvbk9ic2VydmVyXG4gICAgICAgICAgICAgICAgLy8gY2F0Y2hlcyBjb250ZW50IHN3YXBzIChlLmcuIGlubmVySFRNTCByZS1yZW5kZXIpIHRoYXQgZG9uJ3QgY2hhbmdlIGJvZHkncyBib3guXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5SZXNpemVPYnNlcnZlcikge1xuICAgICAgICAgICAgICAgICAgICB0cnkgeyB2YXIgX19ybyA9IG5ldyBSZXNpemVPYnNlcnZlcihwb3N0U2l6ZSk7IGlmIChkb2N1bWVudC5ib2R5KSBfX3JvLm9ic2VydmUoZG9jdW1lbnQuYm9keSk7IH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuTXV0YXRpb25PYnNlcnZlciAmJiBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7IG5ldyBNdXRhdGlvbk9ic2VydmVyKHBvc3RTaXplKS5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlLCBhdHRyaWJ1dGVzOiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pOyB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHBvc3RTaXplKTtcbiAgICAgICAgICAgICAgICBwb3N0U2l6ZSgpO1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgPC9zY3JpcHQ+YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0IHRoZSB3ZWIgY29tcG9uZW50IHNjcmlwdCBjb250ZW50IGZyb20gSFRNTFxuICAgICAqL1xuICAgIHByaXZhdGUgZXh0cmFjdFdlYkNvbXBvbmVudFNjcmlwdChodG1sOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jLmdldEVsZW1lbnRCeUlkKE1ZT1BfV0VCX0NPTVBPTkVOVF9TQ1JJUFRfSUQpO1xuICAgICAgICByZXR1cm4gc2NyaXB0Py50ZXh0Q29udGVudCB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgdGhlIHdlYiBjb21wb25lbnQgc2NyaXB0IG9uIHRoZSBob3N0IGRvY3VtZW50LlxuICAgICAqIFJldHVybnMgdGhlIGN1c3RvbSBlbGVtZW50IHRhZyBuYW1lIHRoaXMgc2NyaXB0IHJlZ2lzdGVyZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBleGVjdXRlV2ViQ29tcG9uZW50U2NyaXB0KHNjcmlwdENvbnRlbnQ6IHN0cmluZywgc2NyaXB0SWQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgZXhlY3V0ZWQgKGJ5IHNjcmlwdCBjb250ZW50IGhhc2gpXG4gICAgICAgIGNvbnN0IGNhY2hlZFRhZ05hbWUgPSBleHRyYWN0ZWRXZWJDb21wb25lbnRTY3JpcHRzLmdldChzY3JpcHRJZCk7XG4gICAgICAgIGlmIChjYWNoZWRUYWdOYW1lKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW015b3BXZWJDb21wb25lbnRdIFNjcmlwdCBhbHJlYWR5IGV4ZWN1dGVkIGZvciAke3NjcmlwdElkfSwgcmV1c2luZyA8JHtjYWNoZWRUYWdOYW1lfT5gKTtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRUYWdOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgIHNjcmlwdC50ZXh0Q29udGVudCA9IHNjcmlwdENvbnRlbnQ7XG4gICAgICAgIHNjcmlwdC5pZCA9IGBteW9wLWV4dHJhY3RlZC0ke3NjcmlwdElkfWA7XG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBnbG9iYWwgaW1tZWRpYXRlbHk6IHRoZSBuZXh0IGV4dHJhY3RlZCBzY3JpcHQgdG8gcnVuIHdpbGwgb3ZlcndyaXRlIGl0LlxuICAgICAgICBjb25zdCB0YWdOYW1lID0gKHdpbmRvdyBhcyBhbnkpLl9fTVlPUF9UQUdfTkFNRV9fO1xuICAgICAgICBpZiAodGFnTmFtZSkge1xuICAgICAgICAgICAgZXh0cmFjdGVkV2ViQ29tcG9uZW50U2NyaXB0cy5zZXQoc2NyaXB0SWQsIHRhZ05hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBbTXlvcFdlYkNvbXBvbmVudF0gRXhlY3V0ZWQgd2ViIGNvbXBvbmVudCBzY3JpcHQ6ICR7c2NyaXB0SWR9IC0+IDwke3RhZ05hbWV9PmApO1xuICAgICAgICByZXR1cm4gdGFnTmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgTXlvcCBXZWIgQ29tcG9uZW50IChleHRyYWN0ZWQgYW5kIHJ1biBvbiBob3N0IGRvY3VtZW50KVxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbG9hZEV4dHJhY3RlZFdlYkNvbXBvbmVudChcbiAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIHNraW46IElTa2luQ29uZmlnLFxuICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICBodG1sOiBzdHJpbmcsXG4gICAgICAgIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zXG4gICAgKTogUHJvbWlzZTxNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50PiB7XG4gICAgICAgIGNvbnN0IHNjcmlwdENvbnRlbnQgPSB0aGlzLmV4dHJhY3RXZWJDb21wb25lbnRTY3JpcHQoaHRtbCk7XG5cbiAgICAgICAgaWYgKCFzY3JpcHRDb250ZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tNeW9wV2ViQ29tcG9uZW50XSBObyA8c2NyaXB0IGlkPVwibXlvcC13ZWItY29tcG9uZW50XCI+IGZvdW5kIGluIEhUTUwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSBjb21wb25lbnQgZGVmaW5pdGlvbiBpZCBhcyBzY3JpcHQgaWRlbnRpZmllciBmb3IgZGVkdXBsaWNhdGlvblxuICAgICAgICBjb25zdCBzY3JpcHRJZCA9IGAke2NvbXBvbmVudERlZmluaXRpb24uaWR9LSR7c2tpbi5pZH1gO1xuXG4gICAgICAgIC8vIEV4ZWN1dGUgdGhlIHNjcmlwdCBvbiB0aGUgaG9zdCBkb2N1bWVudCwgb3IgcmV1c2UgdGhlIHRhZyBpdCByZWdpc3RlcmVkIGVhcmxpZXIuXG4gICAgICAgIC8vIE5ldmVyIHJlLXJlYWQgd2luZG93Ll9fTVlPUF9UQUdfTkFNRV9fIGhlcmU6IG9uIGEgcmUtbW91bnQgdGhlIHNjcmlwdCBpcyBza2lwcGVkIGFuZFxuICAgICAgICAvLyB0aGUgZ2xvYmFsIHN0aWxsIHBvaW50cyBhdCB3aGljaGV2ZXIgY29tcG9uZW50J3Mgc2NyaXB0IHJhbiBsYXN0LCB3aGljaCB3b3VsZCBidWlsZFxuICAgICAgICAvLyB0aGlzIGNvbnRhaW5lcidzIGVsZW1lbnQgZnJvbSBhbm90aGVyIGNvbXBvbmVudCdzIHRhZy5cbiAgICAgICAgY29uc3QgdGFnTmFtZSA9IHRoaXMuZXhlY3V0ZVdlYkNvbXBvbmVudFNjcmlwdChzY3JpcHRDb250ZW50LCBzY3JpcHRJZCk7XG5cbiAgICAgICAgaWYgKCF0YWdOYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tNeW9wV2ViQ29tcG9uZW50XSBTY3JpcHQgZGlkIG5vdCBzZXQgd2luZG93Ll9fTVlPUF9UQUdfTkFNRV9fJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgdGhlIGN1c3RvbSBlbGVtZW50XG4gICAgICAgIGNvbnN0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWA7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFyIGNvbnRhaW5lciBpZiBuZWVkZWRcbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSkge1xuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ09OU1RSVUNUIEJFRk9SRSBBUFBFTkRJTkcuIEFwcGVuZGluZyBpcyB3aGF0IGNvbm5lY3RzIHRoZSBlbGVtZW50IGFuZCBmaXJlcyBpdHNcbiAgICAgICAgLy8gY29ubmVjdGVkQ2FsbGJhY2ssIGFuZCB0aGUgd3JhcHBlcidzIGNvbnN0cnVjdG9yIGlzIHdoZXJlIHRoZSBzaW5nbGUgJ215b3AtY3RhJ1xuICAgICAgICAvLyBsaXN0ZW5lciBpcyBhdHRhY2hlZC4gV2l0aCB0aGUgYXBwZW5kIGZpcnN0LCBhbnkgQ1RBIGEgY29tcG9uZW50IGVtaXRzIGZyb21cbiAgICAgICAgLy8gY29ubmVjdGVkQ2FsbGJhY2sgLS0gYSBzZWFyY2ggYm94IGFubm91bmNpbmcgaXRzIGluaXRpYWwgc3RhdGUsIGEgd2lkZ2V0XG4gICAgICAgIC8vIHJlcG9ydGluZyBhIGRlZmF1bHQgc2VsZWN0aW9uIC0tIHdhcyBkaXNwYXRjaGVkIGJlZm9yZSBhbnl0aGluZyB3YXMgbGlzdGVuaW5nXG4gICAgICAgIC8vIGFuZCBzaWxlbnRseSBsb3N0LiBUaGUgd3JhcHBlciBvbmx5IG5lZWRzIHRoZSBlbGVtZW50IHJlZmVyZW5jZSwgbm90IGEgY29ubmVjdGVkXG4gICAgICAgIC8vIGVsZW1lbnQsIHNvIGNvbnN0cnVjdGluZyBmaXJzdCBjb3N0cyBub3RoaW5nIGFuZCBtYWtlcyB0aGUgYnVmZmVyIGNvdmVyIHRoZVxuICAgICAgICAvLyB3aG9sZSBmaXJzdCByZW5kZXIgcmF0aGVyIHRoYW4gb25seSB0aGUgaW5pdFdpdGhEYXRhIHBhcnQgb2YgaXQuXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50KFxuICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbixcbiAgICAgICAgICAgIHNraW4sXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgdGFnTmFtZSxcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGRhdGEgaWYgcHJvdmlkZWQuIGBudWxsYCBpcyBub3QgZGF0YSAtLSBzZWUgdGhlIGRhdGEgc2NyaXB0XG4gICAgICAgIC8vIGd1YXJkIGluIHRoZSBIVE1MIHBhdGggZm9yIHdoeSBjYWxsaW5nIGFuIGluaXQgaW50ZXJmYWNlIHdpdGggbnVsbCBpcyB3b3JzZVxuICAgICAgICAvLyB0aGFuIG5vdCBjYWxsaW5nIGl0LlxuICAgICAgICBpZiAob3B0aW9ucz8uZGF0YSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnM/LmRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEob3B0aW9ucy5kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBbTXlvcFdlYkNvbXBvbmVudF0gTG9hZGVkIDwke3RhZ05hbWV9PiBpbnRvIGNvbnRhaW5lcmApO1xuXG4gICAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxuXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG5cbiAgICAgICAgY29uc3QgbG9hZGVyQ29uZmlnID0gKHNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnKTtcblxuICAgICAgICBjb25zdCBpc1dDID0gdGhpcy5pc015b3BXZWJDb21wb25lbnQobG9hZGVyQ29uZmlnLkhUTUwpO1xuICAgICAgICBjb25zdCB7IG1vZGUsIGlzb2xhdGUgfSA9IGF3YWl0IHRoaXMucmVzb2x2ZVJlbmRlck1vZGUoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgbG9hZGVyQ29uZmlnLCBpc1dDLCBvcHRpb25zKTtcblxuICAgICAgICBpZiAobW9kZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW015b3BdIFJlbmRlcmluZyBibG9ja2VkIGJ5IHJlbmRlciBwb2xpY3kgZm9yIGNvbXBvbmVudCBcIiR7Y29tcG9uZW50RGVmaW5pdGlvbi5pZH1cImApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzV0MpIHtcbiAgICAgICAgICAgIC8vIFdlYi1jb21wb25lbnQgSFRNTCBvbmx5IHN1cHBvcnRzIHRoZSB3ZWItY29tcG9uZW50IGNvbnRyYWN0OyBhIHBvbGljeSB0aGF0XG4gICAgICAgICAgICAvLyBkZW5pZXMgaXQgaGFzIG5vIGlmcmFtZSBmYWxsYmFjayAoc2VlIHBsYW4gXHUwMEE3My4zKSBcdTIwMTQgYmxvY2sgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgIC8vIHNpbGVudGx5IHJlbmRlciBicm9rZW4uIFVudHJ1c3RlZCBjb250cmlidXRvcnMgbXVzdCBzaGlwIGlmcmFtZSBjb21wb25lbnRzLlxuICAgICAgICAgICAgaWYgKG1vZGUgIT09ICd3ZWJDb21wb25lbnQnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbTXlvcF0gV2ViLWNvbXBvbmVudCByZW5kZXJpbmcgZGVuaWVkIGJ5IHJlbmRlciBwb2xpY3kgZm9yIGNvbXBvbmVudCBcIiR7Y29tcG9uZW50RGVmaW5pdGlvbi5pZH1cImApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZEV4dHJhY3RlZFdlYkNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIGxvYWRlckNvbmZpZy5IVE1MLCBvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkb21JZCA9IGBteW9wLWNvbXAtJHt1dWlkdjQoKX1gXG4gICAgICAgIGxldCBlbGVtZW50O1xuXG4gICAgICAgIGlmIChsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5sb2NhbEZyYW1lKSB7XG4gICAgICAgICAgICBjb25zdCB1bmlxSWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgIGNvbnN0IGRvbUlkID0gYG15b3AtY29tcC0ke3VuaXFJZH1gXG5cbiAgICAgICAgICAgIGxldCBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgICAgIC8vIEZ1bGwgaXNvbGF0aW9uOiBhIHNhbmRib3ggV0lUSE9VVCBhbGxvdy1zYW1lLW9yaWdpbiBnaXZlcyB0aGUgZnJhbWUgYW5cbiAgICAgICAgICAgIC8vIG9wYXF1ZSBvcmlnaW4gXHUyMDE0IG5vIGhvc3QgRE9NL2Nvb2tpZXMvcGFyZW50IGFjY2Vzcy4gTXVzdCBiZSBzZXQgYmVmb3JlXG4gICAgICAgICAgICAvLyB0aGUgZnJhbWUgbmF2aWdhdGVzIChpLmUuIGJlZm9yZSBzcmNkb2MgLyBhcHBlbmQpLlxuICAgICAgICAgICAgaWYgKGlzb2xhdGUpIHtcbiAgICAgICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNldEF0dHJpYnV0ZSgnc2FuZGJveCcsICdhbGxvdy1zY3JpcHRzIGFsbG93LWZvcm1zIGFsbG93LXBvcHVwcycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTZXQgYWxsIHN0eWxlcyBCRUZPUkUgYXBwZW5kaW5nIHRvIHByZXZlbnQgZmxhc2ggYXQgd3JvbmcgcG9zaXRpb25cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgaW5zZXQ6IDA7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogJHtvcHRpb25zPy5oaWRkZW4gPyAnMCcgOiAnMSd9O1xuICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICAgICAgICBwb2ludGVyLWV2ZW50czogJHtvcHRpb25zPy5oaWRkZW4gPyAnbm9uZScgOiAnYWxsJ307XG4gICAgICAgICAgICBgO1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vIFdyaXRlIGNvbnRlbnQgaW50byB0aGUgaWZyYW1lLiBBbiBpc29sYXRlZCAoc2FuZGJveGVkLCBvcGFxdWUtb3JpZ2luKSBmcmFtZVxuICAgICAgICAgICAgLy8gY2FuJ3QgYmUgZG9jLndyaXRlKCknbiBmcm9tIHRoZSBob3N0LCBzbyBhY2N1bXVsYXRlIHRoZSBtYXJrdXAgYW5kIHNldCBpdCB2aWFcbiAgICAgICAgICAgIC8vIHNyY2RvYyBvbiBjbG9zZSgpLiBOb24taXNvbGF0ZWQgZnJhbWVzIGtlZXAgdGhlIHNhbWUtb3JpZ2luIGRvYy53cml0ZSBwYXRoLlxuICAgICAgICAgICAgY29uc3QgX19zcmNQYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGRvYzogeyBvcGVuKCk6IHZvaWQ7IHdyaXRlbG4oczogc3RyaW5nKTogdm9pZDsgY2xvc2UoKTogdm9pZCB9ID0gaXNvbGF0ZVxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBvcGVuKCkge30sXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlbG4oczogc3RyaW5nKSB7IF9fc3JjUGFydHMucHVzaChzKTsgfSxcbiAgICAgICAgICAgICAgICAgICAgY2xvc2UoKSB7IElmcmFtZUVsZW1lbnQuc3JjZG9jID0gX19zcmNQYXJ0cy5qb2luKCdcXG4nKTsgfSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZCA9IElmcmFtZUVsZW1lbnQuY29udGVudERvY3VtZW50IHx8IElmcmFtZUVsZW1lbnQuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgICAgICAgICAgICAgZC5vcGVuKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkO1xuICAgICAgICAgICAgICAgIH0pKCk7XG5cblxuICAgICAgICAgICAgLy8gUGFyc2UgbXlvcDpzaXplIG1ldGEgdGFnIGJlZm9yZSBpZnJhbWUgY3JlYXRpb24gKHNhbWUgRE9NUGFyc2VyIHBhc3MgcGF0dGVybiBhcyBteW9wX3ByZXZpZXcgcmVtb3ZhbCkuXG4gICAgICAgICAgICAvLyBUaGlzIGxldHMgdGhlIFJlYWN0IGhvc3QgZGV0ZXJtaW5lIHNpemluZyBtb2RlIChmaWxsIHZzIGNvbnRlbnQpIGZyb20gdGhlIHN0YXJ0LlxuICAgICAgICAgICAgbGV0IHBhcnNlZFNpemVNZXRhOiB7IHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyOyBoZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7IG1pbldpZHRoPzogbnVtYmVyOyBtYXhXaWR0aD86IG51bWJlcjsgbWluSGVpZ2h0PzogbnVtYmVyOyBtYXhIZWlnaHQ/OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9wcmVQYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX3ByZURvYyA9IF9wcmVQYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZU1ldGEgPSBfcHJlRG9jLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cIm15b3A6c2l6ZVwiXScpO1xuICAgICAgICAgICAgICAgIGlmIChzaXplTWV0YSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkgeyBwYXJzZWRTaXplTWV0YSA9IEpTT04ucGFyc2Uoc2l6ZU1ldGEuZ2V0QXR0cmlidXRlKCdjb250ZW50JykgfHwgJ3t9Jyk7IH0gY2F0Y2gge31cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBIVE1MMlJlbmRlciA9IGxvYWRlckNvbmZpZy5IVE1MO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uX2luc3BlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAvL2luamVjdCBpbnNwZWN0aW9uIHNjcmlwdCBmb3IgcHJvcHMgZGV0ZWN0aW9uXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9kb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogcGFydCBvZiBBSSBjb21wb25lbnRzLCB0aGluayBhYm91dCB0aGF0LCBkb2N1bWVudCBpdC5cbiAgICAgICAgICAgICAgICBjb25zdCBteW9wX3ByZXZpZXdfc2NyaXB0ID0gX2RvYy5nZXRFbGVtZW50QnlJZCgnbXlvcF9wcmV2aWV3Jyk7XG4gICAgICAgICAgICAgICAgbXlvcF9wcmV2aWV3X3NjcmlwdD8ucmVtb3ZlQXR0cmlidXRlKCd0eXBlJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBQYXJzZSB0aGUgaW5qZWN0ZWQgSFRNTCBzdHJpbmcgaW50byBhIG5vZGVcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wID0gX2RvYy5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoKTtcbiAgICAgICAgICAgICAgICB0ZW1wLmJvZHkuaW5uZXJIVE1MID0gYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmVLZXlzV2luZG93ID0gbmV3IFNldChPYmplY3Qua2V5cyh3aW5kb3cpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlS2V5c1dpbmRvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0ZW1wLmJvZHkuZmlyc3RDaGlsZDtcblxuICAgICAgICAgICAgICAgIGlmIChub2RlICYmIF9kb2MuaGVhZCkge1xuICAgICAgICAgICAgICAgICAgICBfZG9jLmhlYWQuaW5zZXJ0QmVmb3JlKF9kb2MuaW1wb3J0Tm9kZShub2RlLCB0cnVlKSwgX2RvYy5oZWFkLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFByZXBlbmQgRE9DVFlQRTogZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTCByZXR1cm5zIG9ubHkgPGh0bWw+Li4uPC9odG1sPlxuICAgICAgICAgICAgICAgIC8vIGFuZCBkcm9wcyB0aGUgZG9jdHlwZSwgd2hpY2ggd291bGQgcHV0IHRoZSBpZnJhbWUgaW4gcXVpcmtzIG1vZGUuXG4gICAgICAgICAgICAgICAgLy8gUXVpcmtzIG1vZGUgYnJlYWtzIGF1dG8tc2l6aW5nIGJlY2F1c2UgPGJvZHk+IHN0cmV0Y2hlcyB0byB0aGUgaWZyYW1lXG4gICAgICAgICAgICAgICAgLy8gdmlld3BvcnQgaW5zdGVhZCBvZiBzaHJpbmtpbmcgdG8gY29udGVudCwgc28gUmVzaXplT2JzZXJ2ZXIgb24gYm9keVxuICAgICAgICAgICAgICAgIC8vIG5ldmVyIGZpcmVzIHdoZW4gY29udGVudCByZWZsb3dzIChlLmcuIGFmdGVyIGZvbnQgc3dhcCkuXG4gICAgICAgICAgICAgICAgSFRNTDJSZW5kZXIgPSAnPCFET0NUWVBFIGh0bWw+JyArIF9kb2MuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE86IGltcHJvdmUgYnkgZG8gaXQgb24gdGhlIHNlcnZlIG9uY2VcblxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBteW9wX3ByZXZpZXcgc2NyaXB0IHdoZW4gbm90IGluIGluc3BlY3Rpb24gbW9kZVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BfcHJldmlld19zY3JpcHQgPSBfZG9jLmdldEVsZW1lbnRCeUlkKCdteW9wX3ByZXZpZXcnKTtcblxuICAgICAgICAgICAgICAgIGlmIChteW9wX3ByZXZpZXdfc2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgICAgIG15b3BfcHJldmlld19zY3JpcHQucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlZSBub3RlIGFib3ZlOiBwcmVwZW5kIERPQ1RZUEUgdG8ga2VlcCB0aGUgaWZyYW1lIGluIHN0YW5kYXJkcyBtb2RlLlxuICAgICAgICAgICAgICAgICAgICBIVE1MMlJlbmRlciA9ICc8IURPQ1RZUEUgaHRtbD4nICsgX2RvYy5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSW5qZWN0IGhvc3QtcHJvdmlkZWQgQ1NTIGJlZm9yZSB0aGUgaWZyYW1lIGlzIHdyaXR0ZW4gc28gc3R5bGVzIGFyZVxuICAgICAgICAgICAgLy8gcHJlc2VudCBvbiBmaXJzdCBwYWludCAobm8gRk9VQykuIEFwcGVuZGVkIGxhc3QgaW4gPGhlYWQ+IHNvIGl0IHdpbnNcbiAgICAgICAgICAgIC8vIG92ZXIgdGhlIGNvbXBvbmVudCdzIG93biBzdHlsZXMgdmlhIG5vcm1hbCBjYXNjYWRlIG9yZGVyLlxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmluamVjdENzcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhIVE1MMlJlbmRlciwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlVGFnID0gX2RvYy5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgICAgIHN0eWxlVGFnLnNldEF0dHJpYnV0ZSgnZGF0YS1teW9wLWluamVjdGVkJywgJ3RydWUnKTtcbiAgICAgICAgICAgICAgICAvLyA8c3R5bGU+IGlzIGFuIEhUTUwgcmF3LXRleHQgZWxlbWVudDogdGhlIHNlcmlhbGl6ZXIgYmVsb3cgd3JpdGVzIGl0c1xuICAgICAgICAgICAgICAgIC8vIGNvbnRlbnRzIExJVEVSQUxMWSwgd2l0aG91dCBlc2NhcGluZy4gQ1NTIGNvbnRhaW5pbmcgXCI8L3N0eWxlPlwiIHdvdWxkXG4gICAgICAgICAgICAgICAgLy8gdGhlcmVmb3JlIGNsb3NlIHRoZSB0YWcgYW5kIGluamVjdCBsaXZlIG1hcmt1cCBpbnRvIHRoZSBpZnJhbWUsIHdoaWNoXG4gICAgICAgICAgICAgICAgLy8gZXhlY3V0ZXMgc2FtZS1vcmlnaW4gd2l0aCB0aGlzIHBhZ2UuIE5ldXRyYWxpemUgdGhlIHNlcXVlbmNlIFx1MjAxNCBubyByZWFsXG4gICAgICAgICAgICAgICAgLy8gc3R5bGVzaGVldCBjb250YWlucyBpdC4gKFNhbWUgY2xhc3Mgb2YgYnVnIGFzIHRoZSA8L3NjcmlwdD4gZXNjYXBlIGluXG4gICAgICAgICAgICAgICAgLy8gdGhlIGRhdGEgcGF5bG9hZCBiZWxvdy4pXG4gICAgICAgICAgICAgICAgc3R5bGVUYWcudGV4dENvbnRlbnQgPSBvcHRpb25zLmluamVjdENzcy5yZXBsYWNlKC88XFxzKlxcL1xccypzdHlsZS9naSwgJzxcXFxcL3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgKF9kb2MuaGVhZCB8fCBfZG9jLmRvY3VtZW50RWxlbWVudCkuYXBwZW5kQ2hpbGQoc3R5bGVUYWcpO1xuICAgICAgICAgICAgICAgIC8vIFNlZSBub3RlIGFib3ZlOiBwcmVwZW5kIERPQ1RZUEUgdG8ga2VlcCB0aGUgaWZyYW1lIGluIHN0YW5kYXJkcyBtb2RlLlxuICAgICAgICAgICAgICAgIEhUTUwyUmVuZGVyID0gJzwhRE9DVFlQRSBodG1sPicgKyBfZG9jLmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgZG9jLndyaXRlbG4oSFRNTDJSZW5kZXIpO1xuXG4gICAgICAgICAgICAvLyB3aW5kb3cuX19mZWRlcmF0aW9uX18gPVxuICAgICAgICAgICAgLy8gICAgIHsgLi4ud2luZG93Ll9fZmVkZXJhdGlvbl9fLFxuICAgICAgICAgICAgLy8gICAgICAgICAvL1RPRE8gOiBnZXQgZnJvbSBFTlYgYXQgYnVpbGQgdGltZSxcbiAgICAgICAgICAgIC8vICAgICAgICAgLy8gaW5qZWN0IHZhbHVlIHRvIG1vZHVsZSBhdCBidWlsZCB0aW1lXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vIHRvZGF5IHdlIGRvaW5nIHNvIGp1c3QgZm9yIHRoZSBDSlMgdmVyc2lvblxuICAgICAgICAgICAgLy8gICAgICAgICBfX3B1YmxpY19wYXRoX18gOidodHRwczovL2Nkbi5teW9wLmRldi9zZGsvbmV4dCdcbiAgICAgICAgICAgIC8vICAgICAgICAgLC4uLiR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIHdpbmRvdy5fX2ZlZGVyYXRpb25fXylcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAgICAgfTtcblxuICAgICAgICAgICAgLy8gRm9yIG5wbSBwYWNrYWdlIHVzZXJzIHdpdGggYnVuZGxlcnMgKFZpdGUvV2VicGFjayksIGluamVjdCBTREsgaW5saW5lXG4gICAgICAgICAgICAvLyBGb3IgQ0ROIHVzZXJzIChzY3JpcHQgdGFnKSwgdXNlIENETiBVUkxcbiAgICAgICAgICAgIGNvbnN0IHNka1NjcmlwdCA9IEhBU19FTUJFRERFRF9TREtcbiAgICAgICAgICAgICAgICA/IGA8c2NyaXB0PiR7RU1CRURERURfU0RLX0NPTlRFTlR9PC9zY3JpcHQ+YFxuICAgICAgICAgICAgICAgIDogYDxzY3JpcHQgc3JjPVwiJHt3aW5kb3cubXlvcC5fX1JPT1RfU0RLX1BVQkxJQ19VUkxfX31cIj48L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICAvLyBEaWZmZXJlbnQgaW5pdCBzY3JpcHQgZm9yIGVtYmVkZGVkIHZzIENETiBTREtcbiAgICAgICAgICAgIC8vIC0gRW1iZWRkZWQgKGJ1bmRsZWQgSUlGRSk6IHVzZXMgTXlvcFNESy5nZXRJZnJhbWVNb2R1bGUoKSB3aGljaCByZXR1cm5zIG1vZHVsZSBkaXJlY3RseVxuICAgICAgICAgICAgLy8gLSBDRE4gKGR5bmFtaWMgbG9hZGluZyk6IHVzZXMgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSB3aGljaCB3cmFwcyB3aXRoIC5nZXQoKVxuICAgICAgICAgICAgY29uc3QgaW5pdFNjcmlwdCA9IEhBU19FTUJFRERFRF9TREtcbiAgICAgICAgICAgICAgICA/IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbXlvcF9pbml0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaWZyYW1lTW9kdWxlID0gYXdhaXQgTXlvcFNESy5nZXRJZnJhbWVNb2R1bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElmcmFtZVNESyA9IGlmcmFtZU1vZHVsZS5JZnJhbWVTREs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZGsgPSBuZXcgSWZyYW1lU0RLKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZGsuaW5pdCgpO1xuICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICBfX215b3BfaW5pdCgpLnRoZW4oKTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gXG4gICAgICAgICAgICAgICAgOiBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19mZWRlcmF0aW9uX18uX19wdWJsaWNfcGF0aF9fID0gd2luZG93Ll9fZmVkZXJhdGlvbl9fLl9fcHVibGljX3BhdGhfXztcbiAgICAgICAgICAgICAgICAgICBjb25zdCBfX215b3BfaW5pdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2RrID0gbmV3IElmcmFtZVNESygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2RrLmluaXQoKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgX19teW9wX2luaXQoKS50aGVuKCk7XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgLy8gSXNvbGF0ZWQgZnJhbWVzIHVzZSB0aGUgcG9zdE1lc3NhZ2UgYnJpZGdlIGluc3RlYWQgb2YgdGhlIHNhbWUtb3JpZ2luXG4gICAgICAgICAgICAvLyBJZnJhbWVTREsgKyBkYXRhLWluamVjdGlvbiBzY3JpcHRzICh3aGljaCByZWx5IG9uIGhvc3RcdTIxOTRmcmFtZSBhY2Nlc3MpLlxuICAgICAgICAgICAgaWYgKCFpc29sYXRlKSB7XG4gICAgICAgICAgICAgICAgZG9jLndyaXRlbG4oYCR7c2RrU2NyaXB0fSR7aW5pdFNjcmlwdH1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSW5qZWN0IGRhdGEgc2NyaXB0IGlmIGRhdGEgb3B0aW9uIGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIGBudWxsYCBDT1VOVFMgQVMgTk8gREFUQSwgTk9UIEFTIERBVEEuIFRoZSBjaGVjayB1c2VkIHRvIGJlIGAhPT0gdW5kZWZpbmVkYCxcbiAgICAgICAgICAgIC8vIGFuZCBgbnVsbCAhPT0gdW5kZWZpbmVkYCBpcyB0cnVlIC0tIHNvIGEgaG9zdCB0aGF0IHBhc3NlcyBgZGF0YTogbnVsbGAgKHRoZVxuICAgICAgICAgICAgLy8gbmF0dXJhbCB3YXkgdG8gc2F5IFwibm90aGluZyB0byBzZW5kIHlldFwiKSBnb3QgdGhlIHdob2xlIGRhdGEgc2NyaXB0IGluamVjdGVkXG4gICAgICAgICAgICAvLyBhbmQgdGhlIGNvbXBvbmVudCdzIG93biBgbXlvcF9pbml0X2ludGVyZmFjZWAgaW52b2tlZCB3aXRoIG51bGwuIEEgY29tcG9uZW50XG4gICAgICAgICAgICAvLyB0aGF0IHZhbGlkYXRlcyBpdHMgaW5wdXQgdGhlbiByZWplY3RzIGl0LCB3aGljaCBpcyB3aGVyZSBQaWMtVGltZSdzIGNvbnNvbGVcbiAgICAgICAgICAgIC8vIGVycm9yIGBteW9wX2luaXRfaW50ZXJmYWNlOiBJbnZhbGlkIGNvbmZpZyBwcm92aWRlZC5gIGNhbWUgZnJvbTogbWVhc3VyZWQgb25cbiAgICAgICAgICAgIC8vIHRoZWlyIHBhZ2UgMjAyNi0xMC0xOCwgQUxMIDEzIGNvbXBvbmVudHMgYXJlIG1vdW50ZWQgd2l0aCBgZGF0YTogbnVsbGAsIHNvXG4gICAgICAgICAgICAvLyBldmVyeSBvbmUgb2YgdGhlbSBwYWlkIGZvciBhbiBpbmplY3RlZCBzY3JpcHQgYW5kIGEgbWVhbmluZ2xlc3MgaW5pdCBjYWxsLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIEluaXRpYWxpc2luZyBhIGNvbXBvbmVudCB3aXRoIG51bGwgY2FuIG5ldmVyIHRlbGwgaXQgYW55dGhpbmcgdGhhdCBvbWl0dGluZ1xuICAgICAgICAgICAgLy8gdGhlIGNhbGwgZG9lcyBub3QsIHNvIHRoZSB0d28gYXJlIG5vdyB0cmVhdGVkIHRoZSBzYW1lLlxuICAgICAgICAgICAgaWYgKCFpc29sYXRlICYmIG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zPy5kYXRhICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gU2V0dXAgQ1RBIHF1ZXVlIC0gY2FwdHVyZXMgYW55IENUQXMgZW1pdHRlZCBkdXJpbmcgaW5pdCBiZWZvcmUgaG9zdCByZWdpc3RlcnMgaGFuZGxlclxuICAgICAgICAgICAgICAgIGNvbnN0IGN0YVF1ZXVlU2NyaXB0ID0gYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX215b3BfY3RhX3F1ZXVlID0gW107XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wX2N0YV9oYW5kbGVyID0gZnVuY3Rpb24oYWN0aW9uLCBwYXlsb2FkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2N0YV9xdWV1ZS5wdXNoKHthY3Rpb246IGFjdGlvbiwgcGF5bG9hZDogcGF5bG9hZH0pO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgICAgICAvLyBFc2NhcGUgZGF0YSBmb3Igc2FmZSBlbWJlZGRpbmcgaW4gc2NyaXB0IHRhZ1xuICAgICAgICAgICAgICAgIC8vIEpTT04uc3RyaW5naWZ5IGRvZXNuJ3QgZXNjYXBlIDwvc2NyaXB0PiB3aGljaCBjb3VsZCBicmVhayBIVE1MIHBhcnNpbmdcbiAgICAgICAgICAgICAgICBjb25zdCBlc2NhcGVkRGF0YSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLzxcXC9zY3JpcHQvZ2ksICdcXFxcdTAwM2Mvc2NyaXB0Jyk7XG5cbiAgICAgICAgICAgICAgICAvLyBTZWxmLWNvbnRhaW5lZCBkYXRhIGluamVjdGlvbiBzY3JpcHQgdGhhdDpcbiAgICAgICAgICAgICAgICAvLyAxLiBDYWxscyBteW9wX2luaXRfaW50ZXJmYWNlIGltbWVkaWF0ZWx5IGlmIGFscmVhZHkgZGVmaW5lZFxuICAgICAgICAgICAgICAgIC8vIDIuIFdhdGNoZXMgZm9yIGxhdGUtZGVmaW5lZCBteW9wX2luaXRfaW50ZXJmYWNlIHZpYSBkZWZpbmVQcm9wZXJ0eVxuICAgICAgICAgICAgICAgIC8vIDMuIENsZWFucyB1cCBhZnRlciBpdHNlbGYgKHJlbW92ZXMgc2NyaXB0IHRhZyBhbmQgd2luZG93IGRhdGEpXG4gICAgICAgICAgICAgICAgLy8gNC4gUG9zdHMgbWVzc2FnZSB0byBwYXJlbnQgZm9yIGV4dGVuc2lvbiB0cmFja2luZyAocHJlLWluamVjdGVkIGluaXQqKVxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFTY3JpcHQgPSBgPHNjcmlwdCBpZD1cIl9fbXlvcF9pbml0X2RhdGFfc2NyaXB0XCI+XG4gICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gJHtlc2NhcGVkRGF0YX07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NyaXB0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnX19teW9wX2luaXRfZGF0YV9zY3JpcHQnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxJbml0SW50ZXJmYWNlID0gZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFyayBhcyBwcmUtaW5qZWN0ZWQgZGF0YSBjYWxsIGZvciBleHRlbnNpb24gdHJhY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2luaXRfcHJlaW5qZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX215b3BfaW5pdF9wcmVpbmplY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHVyYXRpb24gPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGlmeSBleHRlbnNpb24gdmlhIHBvc3RNZXNzYWdlIChpbml0KiA9IHByZS1pbmplY3RlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdNWU9QX1BSRUlOSkVDVEVEX0lOSVQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAnKicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhbnVwOiByZW1vdmUgc2NyaXB0IHRhZyBhbmQgc3RvcmVkIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NyaXB0RWwgJiYgc2NyaXB0RWwucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdEVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHdpbmRvdy5fX215b3BfaW5pdF9kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cubXlvcF9pbml0X2ludGVyZmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZ1bmN0aW9uIGFscmVhZHkgZXhpc3RzIC0gY2FsbCBpbW1lZGlhdGVseVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxJbml0SW50ZXJmYWNlKHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRnVuY3Rpb24gbm90IHlldCBkZWZpbmVkIC0gc3RvcmUgZGF0YSBhbmQgd2F0Y2ggZm9yIGRlZmluaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2luaXRfZGF0YSA9IGRhdGE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29yaWdpbmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdteW9wX2luaXRfaW50ZXJmYWNlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vcmlnaW5hbCA9IGZuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5fX215b3BfaW5pdF9kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RvcmVkRGF0YSA9IHdpbmRvdy5fX215b3BfaW5pdF9kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3aW5kb3cuX19teW9wX2luaXRfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsSW5pdEludGVyZmFjZShmbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX29yaWdpbmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YDtcbiAgICAgICAgICAgICAgICBkb2Mud3JpdGVsbihjdGFRdWV1ZVNjcmlwdCArIGRhdGFTY3JpcHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJc29sYXRlZCBmcmFtZXM6IGluamVjdCB0aGUgcG9zdE1lc3NhZ2UgYnJpZGdlIChpbml0IGluIC8gY3RhIG91dCAvIHNpemUgb3V0KS5cbiAgICAgICAgICAgIGlmIChpc29sYXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gU2FtZSBydWxlIGFzIHRoZSBub24taXNvbGF0ZWQgcGF0aCBhYm92ZTogbnVsbCBpcyBubyBkYXRhLlxuICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FwZWREYXRhID0gb3B0aW9ucz8uZGF0YSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnM/LmRhdGEgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShvcHRpb25zLmRhdGEpLnJlcGxhY2UoLzxcXC9zY3JpcHQvZ2ksICdcXFxcdTAwM2Mvc2NyaXB0JylcbiAgICAgICAgICAgICAgICAgICAgOiAndW5kZWZpbmVkJztcbiAgICAgICAgICAgICAgICBkb2Mud3JpdGVsbih0aGlzLmJ1aWxkSXNvbGF0aW9uQnJpZGdlKGVzY2FwZWREYXRhKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvYy5jbG9zZSgpO1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogY29udHJvbCBmcm9tIGRhc2hib2FyZFxuICAgICAgICAgICAgLy8gIChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKS5hdXRvSGVpZ2h0ID0gdHJ1ZTtcblxuICAgICAgICAgICAgY29uc3QgY29tcCA9IG5ldyBNeW9wSWZyYW1lQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgIC8vIElzb2xhdGVkOiB3aXJlIHRoZSBob3N0IHNpZGUgb2YgdGhlIHBvc3RNZXNzYWdlIGJyaWRnZSAoY3RhIGluLCBzaXplIGluLCBpbml0IG91dCkuXG4gICAgICAgICAgICBpZiAoaXNvbGF0ZSkgY29tcC5lbmFibGVJc29sYXRpb24oKTtcblxuICAgICAgICAgICAgLy8gU3RvcmUgcGFyc2VkIHNpemVNZXRhIG9uIHRoZSBjb21wb25lbnQgc28gdGhlIFJlYWN0IGhvc3QgY2FuIHJlYWQgaXRcbiAgICAgICAgICAgIGNvbXAuc2l6ZU1ldGEgPSBwYXJzZWRTaXplTWV0YTtcblxuICAgICAgICAgICAgLy8gQXV0by1zaXplOiBvYnNlcnZlIGNvbnRlbnQgc2l6ZSBhbmQgc3luYyB0byBpZnJhbWUgZGltZW5zaW9ucy5cbiAgICAgICAgICAgIC8vIFRoaXMgd29ya3MgZm9yIGFsbCBob3N0cyAodmFuaWxsYSBTREssIFJlYWN0LCBWdWUsIEFuZ3VsYXIpLlxuICAgICAgICAgICAgLy8gSWYgYSBmcmFtZXdvcmsgaG9zdCAoZS5nLiBAbXlvcC9yZWFjdCkgYWxzbyBjYWxscyBvYnNlcnZlQXV0b1NpemUoKSxcbiAgICAgICAgICAgIC8vIGl0IGNsZWFubHkgcmVwbGFjZXMgdGhlc2Ugb2JzZXJ2ZXJzIHZpYSBfYXV0b1NpemVDbGVhbnVwIHRyYWNraW5nLlxuICAgICAgICAgICAgY29tcC5pbml0aWF0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8uYXV0b1NpemUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vIGF1dG8tc2l6aW5nLiBJZnJhbWUgc3RheXMgcG9zaXRpb246YWJzb2x1dGUgZmlsbGluZyBjb250YWluZXIuXG4gICAgICAgICAgICAgICAgICAgIC8vIEhvc3QgaXMgZnVsbHkgcmVzcG9uc2libGUgZm9yIGNvbnRhaW5lciBkaW1lbnNpb25zIChlLmcuIFJlYWN0IE5hdGl2ZSBXZWJWaWV3KS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgc2hvd24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb21wLm9ic2VydmVBdXRvU2l6ZSh7XG4gICAgICAgICAgICAgICAgICAgIGZvcmNlQXV0b1NpemU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG9uU2l6ZUNoYW5nZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyBhZnRlciBmaXJzdCBtZWFzdXJlbWVudCBjb21wbGV0ZXMgKG5vdCBiZWZvcmUpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGlmcmFtZSB0cmFuc2l0aW9ucyBmcm9tIGFic29sdXRlIG92ZXJsYXkgdG8gZG9jdW1lbnQgZmxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhlIG1lYXN1cmVkIGhlaWdodCwgcHJldmVudGluZyBmbGFzaCBhdCB3cm9uZyBzaXplLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93biAmJiAhb3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAuc2hvdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vIGNvbXAucHJvcHMuX2dsb2JhbCA9IGNvbXAuZWxlbWVudC5jb250ZW50V2luZG93O1xuICAgICAgICAgICAgcmV0dXJuIGNvbXA7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5ub25lKSB7XG4gICAgICAgICAgICAvLyBwYXJzZXIgPSBwYXJzZXIgPyBwYXJzZXIgOiBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAvLyBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAvLyBlbGVtZW50ID0gZG9jLmJvZHkuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIC8vZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgZG9tSWQpO1xuXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDsvLy50cmltKCk7XG4gICAgICAgICAgICBlbGVtZW50ID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcblxuICAgICAgICAgICAgLy8gICBjb25zdCBmaXJzdEVsZW1lbnQgPSB0ZW1wbGF0ZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgLy8gICBjb25zdCB6ID0gZmlyc3RFbGVtZW50ID8gZmlyc3RFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA6IG51bGw7XG4gICAgICAgICAgICAvLyAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gICBjb25zb2xlLmxvZyh0ZW1wbGF0ZSwgZmlyc3RFbGVtZW50LCB6KVxuICAgICAgICAgICAgLy8gICBlbGVtZW50ID0gZmlyc3RFbGVtZW50XG5cbiAgICAgICAgICAgIC8vIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Rib2R5Jyk7XG4gICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIGNvbnRhaW5lci5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDtcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgPSBjb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayhlbGVtZW50LCBlbGVtZW50KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21FbGVtZW50TmFtZSA9IHRvQ3VzdG9tRWxlbWVudE5hbWUoY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lICsgc2tpbi5pZCk7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgcmVkZWZpbmUgIVxuICAgICAgICAgICAgaWYgKCFzZWVuLmluY2x1ZGVzKGN1c3RvbUVsZW1lbnROYW1lKSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZUN1c3RvbVdlYkNvbXBvbmVudChjdXN0b21FbGVtZW50TmFtZSwgbG9hZGVyQ29uZmlnLkhUTUwsIGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSk7XG4gICAgICAgICAgICAgICAgc2Vlbi5wdXNoKGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIC8vZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29udGFpbmVyLmlkLnN0YXJ0c1dpdGgoJ215b3AtY29tcC0nKSkge1xuICAgICAgICAvLyAgICAgLy8gaW4gcGxhY2UgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChlbGVtZW50KTtcbiAgICAgICAgLy8gICAgIC8vY29udGFpbmVyID0gZWxlbWVudC5wYXJlbnRFbGVtZW50ITtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2N1c3RvbUVsZW1lbnROYW1lfSAvPmA7XG4gICAgICAgIHJldHVybiBuZXcgTXlvcFdlYkNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge2RlY29tcHJlc3NVVUlEc30gZnJvbSBcIi4uL3V0aWxzL3V1aWQudHNcIjtcbmltcG9ydCB7Q2xvdWRSZXBvc2l0b3J5fSBmcm9tIFwiLi4vaGVscGVyc1wiO1xuaW1wb3J0IHtcbiAgICBFeHBlcmllbmNlVHlwZXMsXG4gICAgSUNvbXBvbmVudENvbmZpZywgSURlZGljYXRlZFNraW5Db25maWcsXG4gICAgSVNlZ21lbnRlZFNraW5Db25maWcsXG4gICAgSVNlZ21lbnRFeHBlcmllbmNlLCBJU2tpbkluc3RhbmNlQ29uZmlnLFxuICAgIFNraW5TZWxlY3RvclR5cGVzXG59IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IGNvbnN0IGNoZWNrTXlvcE92ZXJyaWRlID0gYXN5bmMgKGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyk6IFByb21pc2U8SUNvbXBvbmVudENvbmZpZyB8IG51bGw+ID0+IHtcbiAgICB0cnkge1xuICAgICAgICAvL1RPRE86IHN1cHBvcnQgZGlzYWJsaW5nIHRoZSBtZWNoYW5pc21cbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModXJsLnNlYXJjaCk7XG4gICAgICAgIGNvbnN0IG15b3BPdmVycmlkZSA9IHBhcmFtcy5nZXQoJ215b3BPdmVycmlkZScpO1xuICAgICAgICBpZiAobXlvcE92ZXJyaWRlKSB7XG4gICAgICAgICAgICBjb25zdCBbc291cmNlLCAuLi51dWlkc10gPSBkZWNvbXByZXNzVVVJRHMobXlvcE92ZXJyaWRlKTtcblxuICAgICAgICAgICAgc3dpdGNoIChzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjb21wb25lbnQnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtjb21wb25lbnRJZCwgc2tpbklkXSA9IHV1aWRzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRUb092ZXJyaWRlID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hDb21wb25lbnQoY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9kbzogY2hlY2sgZmV0Y2hBdXRvRmxvdy4gTG9va3MgbGlrZSBvbmx5IG9uZSBza2luIGlzIHJldHVybmVkXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBza2luID0gY29tcG9uZW50VG9PdmVycmlkZS50eXBlLnNraW5zLmZpbmQoc2tpbiA9PiBza2luLmlkID09PSBza2luSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNraW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RvOiBmb3Igbm93IGp1c3Qgc2V0IHNraW4gaWQuIENoZWNrIHRoZSBjbG91ZCBpbXBsZW1lbnRhdGlvblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHNraW5JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIElTa2luSW5zdGFuY2VDb25maWdcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50VG9PdmVycmlkZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vICAgIGNhc2UgJ2Zsb3cnOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdCA6IHtcbiAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBbZmxvd0lkLCBleHBlcmltZW50SWRdID0gdXVpZHM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtmbG93SWQsIGV4cGVyaW1lbnRJZF0gPSBkZWNvbXByZXNzVVVJRHMobXlvcE92ZXJyaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRUb092ZXJyaWRlID0gZmxvdy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IGNvbXBvbmVudENvbmZpZy50eXBlLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3Rvci50eXBlID09PSBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnJlc29sdmVkRXhwZXJpZW5jZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRFeHBlcmllbmNlID0gY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzLmZpbmQoZSA9PiBlLmlkID09PSBleHBlcmltZW50SWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZEV4cGVyaWVuY2U/LnR5cGUgPT09IEV4cGVyaWVuY2VUeXBlcy5TZWdtZW50KSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUmVzb2x2ZWRFeHBlcmllbmNlID0gcmVzb2x2ZWRFeHBlcmllbmNlIGFzIElTZWdtZW50RXhwZXJpZW5jZVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFNraW5TZWxlY3RvciA9IGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yIGFzIElTZWdtZW50ZWRTa2luQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gdHlwZWRTa2luU2VsZWN0b3Iuc2VnbWVudHMuZmluZChzID0+IHMuc2VnbWVudElkID09PSB0eXBlZFJlc29sdmVkRXhwZXJpZW5jZS5zZWdtZW50LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSBzZWdtZW50Py5za2luU2VsZWN0b3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFRvT3ZlcnJpZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsICIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogVGhlIEhvc3QgU0RLIGlzIGRlc2lnbmVkIGZvciBpbnRlZ3JhdGlvbiB3aXRoaW4gdGhlIGhvc3QgYXBwbGljYXRpb24gdGhhdCBzZXJ2ZXMgYXMgdGhlIGNvbnRhaW5lciBmb3IgTXlvcCAgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBJdCBwcm92aWRlcyBlc3NlbnRpYWwgZnVuY3Rpb25hbGl0aWVzIGFuZCBBUElzIGZvciByZWdpc3RlcmluZywgbWFuYWdpbmcsIGFuZCBjb21tdW5pY2F0aW5nIHdpdGggTXlvcCBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGVuYWJsZXMgc2VhbWxlc3MgZW1iZWRkaW5nIG9mIGluZGVwZW5kZW50bHkgZGV2ZWxvcGVkIGNvbXBvbmVudHMgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbiwgZW5zdXJpbmcgc21vb3RoIGludGVyb3BlcmFiaWxpdHkgYW5kIGNvbnNpc3RlbnQgdXNlciBleHBlcmllbmNlIGFjcm9zcyB2YXJpb3VzIE15b3AgY29tcG9uZW50IGltcGxlbWVudGF0aW9ucy5cbiAqL1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge0lNeW9wTG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEVudmVsb3BlZE1lc3NhZ2UsIEV4ZWN1dGVDb21wb25lbnRNZXRob2QsXG4gICAgSW5pdE1lc3NhZ2UsXG4gICAgSW5pdFJlc3BvbnNlLCBNZXNzYWdlRGlyZWN0aW9uLCBSZWZcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BJZnJhbWVMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvaWZyYW1lTG9hZGVyXCI7XG5pbXBvcnQge1dlYmNvbXBvbmVudExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy93ZWJjb21wb25lbnRMb2FkZXJcIjtcbmltcG9ydCB7UmVuZGVyUG9saWN5fSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7SWZyYW1lU0RLfSBmcm9tIFwiLi4vSWZyYW1lXCI7XG5pbXBvcnQge2Nvbm5lY3RQcm9wcywgY29ubmVjdFJlZnMsIGNyZWF0ZVJlZkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtcbiAgICBFeHBlcmllbmNlVHlwZXMsXG4gICAgSUNvbXBvbmVudENvbmZpZyxcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZywgSUV4cGVyaWVuY2UsIElGdW5jdGlvblJlc3VsdHNTZWdtZW50LCBJU2VnbWVudGVkU2tpbkNvbmZpZywgSVNlZ21lbnRFeHBlcmllbmNlLFxuICAgIElTa2luQ29uZmlnLCBJU2tpblNlbGVjdG9yQ29uZmlnLCBTa2luU2VsZWN0b3JUeXBlcyxcblxuXG59IGZyb20gXCIuLi9jb21tb25cIjtcbi8vIEB0cy1pZ25vcmUgaGFuZGxlZCBieSBjdXN0b20gZXNidWlsZCBwbHVnaW5cbmltcG9ydCB2ZXJzaW9uIGZyb20gXCJteW9wLXNkay12ZXJzaW9uXCI7XG5pbXBvcnQge2RlbGl2ZXJ5LCBkZWxpdmVyeU9mZiwgZGVsaXZlcnlSZWZyZXNoLCBkZWxpdmVyeVN0YXRzfSBmcm9tIFwiLi4vaGVscGVycy9jbG91ZFJlcG9zaXRvcnlIZWxwZXJzXCI7XG5pbXBvcnQge0hUTUxDb21wb25lbnRMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlclwiO1xuaW1wb3J0IHtjaGVja015b3BPdmVycmlkZX0gZnJvbSBcIi4vbXlvcE92ZXJyaWRlLnRzXCI7XG5cbmludGVyZmFjZSBjb21wb25lbnRMb2FkZXJDcmVhdG9yIHtcbiAgICBuZXcobG9hZGVyczogSU15b3BMb2FkZXJbXSk6IGFueTtcbn1cblxuLy8gY29uc3QgZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGFzeW5jIChpZDogc3RyaW5nKSA9PiB7XG4vLyAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYGh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9jb21wb25lbnQ/aWQ9JHtpZH1gKTtcbi8vICAgICBjb25zdCBjb21wb25lbnREZWY6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gKGF3YWl0IHJlcy5qc29uKCkpLml0ZW07XG4vLyAgICAgcmV0dXJuIGNvbXBvbmVudERlZlxuLy8gfVxuXG4vL2NvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vZGZkbGsycDFtMTg3di5jbG91ZGZyb250Lm5ldC9teW9wX3Nkay5taW4uanMnXG5jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2Nkbi5teW9wLmRldi9zZGsvbmV4dC9teW9wX3Nkay5taW4uanMnXG5cbi8qKlxuICogVGhlIEhvc3QgU0RLIGlzIGRlc2lnbmVkIGZvciBpbnRlZ3JhdGlvbiB3aXRoaW4gdGhlIGhvc3QgYXBwbGljYXRpb24gdGhhdCBzZXJ2ZXMgYXMgdGhlIGNvbnRhaW5lciBmb3IgTXlvcCAgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBJdCBwcm92aWRlcyBlc3NlbnRpYWwgZnVuY3Rpb25hbGl0aWVzIGFuZCBBUElzIGZvciByZWdpc3RlcmluZywgbWFuYWdpbmcsIGFuZCBjb21tdW5pY2F0aW5nIHdpdGggTXlvcCBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGVuYWJsZXMgc2VhbWxlc3MgZW1iZWRkaW5nIG9mIGluZGVwZW5kZW50bHkgZGV2ZWxvcGVkIGNvbXBvbmVudHMgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbiwgZW5zdXJpbmcgc21vb3RoIGludGVyb3BlcmFiaWxpdHkgYW5kIGNvbnNpc3RlbnQgdXNlciBleHBlcmllbmNlIGFjcm9zcyB2YXJpb3VzIE15b3AgY29tcG9uZW50IGltcGxlbWVudGF0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvc3RTREsge1xuICAgIHN0YXRpYyBJbnN0YW5jZSA9ICgpID0+IHdpbmRvdy5teW9wLmhvc3RTREs7XG5cbiAgICBjb21wb25lbnRzMmluaXQ6IElNeW9wQ29tcG9uZW50W10gPSBbXTtcbiAgICBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdID0gW107XG4gICAgY29tcG9uZW50c0xvYWRlcnM6IElNeW9wTG9hZGVyW10gPSBbXTtcblxuICAgIC8vIEdsb2JhbCByZW5kZXIgcG9saWN5IChhbGxvdy9kZW55L21vZGUgZ2F0ZSkuIEEgcGVyLWNhbGwgb3B0aW9ucy5yZW5kZXJQb2xpY3lcbiAgICAvLyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhpcyBcdTIwMTQgc2VlIEhUTUxDb21wb25lbnRMb2FkZXIucmVzb2x2ZVJlbmRlck1vZGUuXG4gICAgcHJpdmF0ZSBfcmVuZGVyUG9saWN5PzogUmVuZGVyUG9saWN5O1xuICAgIHB1YmxpYyBzZXRSZW5kZXJQb2xpY3kgPSAocG9saWN5PzogUmVuZGVyUG9saWN5KSA9PiB7IHRoaXMuX3JlbmRlclBvbGljeSA9IHBvbGljeTsgfTtcbiAgICBwdWJsaWMgZ2V0UmVuZGVyUG9saWN5ID0gKCk6IFJlbmRlclBvbGljeSB8IHVuZGVmaW5lZCA9PiB0aGlzLl9yZW5kZXJQb2xpY3k7XG5cbiAgICBwdWJsaWMgaW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgdmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICB0eXBlMkluc3RhbmNlQ291bnQ6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBwdWJsaWMgYXNzaWduSWQgPSAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXSkge1xuICAgICAgICAgICAgdGhpcy50eXBlMkluc3RhbmNlQ291bnRbY29tcG9uZW50RGVmaW5pdGlvbi5pZF0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtjb21wb25lbnREZWZpbml0aW9uLmlkfV8keysrdGhpcy50eXBlMkluc3RhbmNlQ291bnRbY29tcG9uZW50RGVmaW5pdGlvbi5pZF19YDtcbiAgICB9XG5cbiAgICAvL1RPRE8gOiBmaXggdGhlIGluc3BlY3QgaW1wbGVtZW50YXRpb24gaW5zaWRlIHJlZkNvbXBvbmVudFxuICAgIC8vdGhlbiBpbnNwZWN0ZWQgbWF5YmUgY2FuIGJlIGRyb3BwZWRcbiAgICBwcml2YXRlIGluc3BlY3RlZCA9IGZhbHNlO1xuICAgIHB1YmxpYyBpbnNwZWN0ID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbnNwZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5pbnNwZWN0ZWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50Lmluc3BlY3QpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5zcGVjdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gQSBjb21wb25lbnQncyBvcmlnaW4gaXMgd2hhdGV2ZXIgaXRzIGlmcmFtZSBVUkwgaXMsIHNvIGFuIG9yaWdpbiBhbGxvd2xpc3QgY2FuJ3Qgd29yayBoZXJlLlxuICAgIC8vIEluc3RlYWQgb25seSBmcmFtZXMgdGhpcyBTREsgY3JlYXRlZCAob3IgYWRvcHRlZCkgbWF5IHRhbGsgdG8gaXQuIGBzZW5kKClgIGRpc3BhdGNoZXNcbiAgICAvLyBzeW50aGV0aWMgZXZlbnRzLCB3aGljaCBoYXZlIG5vIHNvdXJjZS5cbiAgICBwcml2YXRlIGlzVHJ1c3RlZFNvdXJjZSA9IChzb3VyY2U6IE1lc3NhZ2VFdmVudFNvdXJjZSB8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKCFzb3VyY2UgfHwgc291cmNlID09PSB3aW5kb3cpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBpc093bkZyYW1lID0gKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb21wb25lbnQuZWxlbWVudCBhcyBIVE1MSUZyYW1lRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50Py5ub2RlTmFtZSA9PT0gJ0lGUkFNRScgJiYgZWxlbWVudC5jb250ZW50V2luZG93ID09PSBzb3VyY2U7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudHMuc29tZShpc093bkZyYW1lKSB8fCB0aGlzLmNvbXBvbmVudHMyaW5pdC5zb21lKGlzT3duRnJhbWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5jb21pbmdNZXNzYWdlSGFuZGxlciA9IChldmVudDogTWVzc2FnZUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4pID0+IHtcbiAgICAgICAgaWYgKCFldmVudC5kYXRhPy5teW9wKSByZXR1cm47XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVHJ1c3RlZFNvdXJjZShldmVudC5zb3VyY2UpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuZGF0YS5teW9wKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5kaXJlY3Rpb24gIT09IE1lc3NhZ2VEaXJlY3Rpb24udXAgJiYgZXZlbnQuZGF0YS5tZXNzYWdlVHlwZSAhPT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdtZXNzYWdlIGRyb3BwZWQgaW4gaG9zdHNkaywgZGlyZWN0aW9uIHdhcyAnLCBldmVudC5kYXRhLmRpcmVjdGlvbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImV2ZW50IG9uIGhvc3Qgc2lkZSBcIiwgZXZlbnQpO1xuXG4gICAgICAgICAgICBjb25zdCBteW9wTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlID0gZXZlbnQuZGF0YTtcblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdFJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICAvLyBBTlNXRVIgVEhFIEZSQU1FIFRIQVQgQVNLRUQsIE5PVCBFVkVSWSBQRU5ESU5HIENPTVBPTkVOVC5cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGBldmVudC5zb3VyY2VgIG5hbWVzIHRoZSBhc2tpbmcgZnJhbWUsIGFuZCBpZ25vcmluZyBpdCBtYWRlIHRoZSBhbnN3ZXIgYVxuICAgICAgICAgICAgICAgIC8vIGJyb2FkY2FzdDogbiBjb21wb25lbnRzIGVhY2ggYW5ub3VuY2Ugb25jZSwgYW5kIGVhY2ggYW5ub3VuY2UgcmUtc2VudFxuICAgICAgICAgICAgICAgIC8vIEluaXRNZXNzYWdlIHRvIGFsbCBuIHBlbmRpbmcsIHNvIGEgcGFnZSBwYWlkIG5eMiBwb3N0TWVzc2FnZXMgZHVyaW5nIHRoZVxuICAgICAgICAgICAgICAgIC8vIGV4YWN0IHdpbmRvdyBpdCB3YXMgYnVzaWVzdCBib290aW5nIGZyYW1lcy4gTWVhc3VyZWQgb24gYSAxMi1jb21wb25lbnRcbiAgICAgICAgICAgICAgICAvLyBwYWdlIChQaWMtVGltZSdzIHNoYXBlKTogMTQ0IEluaXRNZXNzYWdlcyB3aGVyZSAxMiB3ZXJlIG5lZWRlZC5cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIChBIGZyYW1lLXNpZGUgcmV0cnkgbG9vcCBicmllZmx5IGV4aXN0ZWQgaGVyZSB0b287IGl0IHdhcyByZW1vdmVkIGFzXG4gICAgICAgICAgICAgICAgLy8gZGVhZCB3ZWlnaHQgb25jZSBmaXggMSBsYW5kZWQuIFRhcmdldGluZyBtZWFucyBhIHJlcGVhdCBhbm5vdW5jZSwgZnJvbVxuICAgICAgICAgICAgICAgIC8vIGFueSBmdXR1cmUgc291cmNlLCBjb3N0cyBvbmUgbWVzc2FnZSByYXRoZXIgdGhhbiBuLilcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIEZBTEwgQkFDSyBUTyBUSEUgQlJPQURDQVNUIHdoZW4gdGhlIHNvdXJjZSBjYW5ub3QgYmUgbWF0Y2hlZCB0byBhIGZyYW1lLlxuICAgICAgICAgICAgICAgIC8vIGBzZW5kKClgIGRpc3BhdGNoZXMgc3ludGhldGljIGV2ZW50cywgd2hpY2ggY2Fycnkgbm8gc291cmNlLCBhbmQgYSB3ZWJcbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQncyBJbml0UmVxdWVzdCBjb21lcyBmcm9tIGB3aW5kb3dgIGl0c2VsZiAtLSBuZWl0aGVyIGhhcyBhXG4gICAgICAgICAgICAgICAgLy8gY29udGVudFdpbmRvdyB0byBtYXRjaCwgYW5kIGJvdGggbXVzdCBrZWVwIHdvcmtpbmcgZXhhY3RseSBhcyBiZWZvcmUuXG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbUFza2luZ0ZyYW1lID0gdGhpcy5jb21wb25lbnRzMmluaXQuZmlsdGVyKGNvbXBvbmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb21wb25lbnQuZWxlbWVudCBhcyBIVE1MSUZyYW1lRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ/Lm5vZGVOYW1lID09PSAnSUZSQU1FJyAmJiBlbGVtZW50LmNvbnRlbnRXaW5kb3cgPT09IGV2ZW50LnNvdXJjZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRzID0gZnJvbUFza2luZ0ZyYW1lLmxlbmd0aCA/IGZyb21Bc2tpbmdGcmFtZSA6IHRoaXMuY29tcG9uZW50czJpbml0O1xuICAgICAgICAgICAgICAgIHRhcmdldHMuZm9yRWFjaChjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgSW5pdE1lc3NhZ2UoY29tcG9uZW50LmlkKSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIGNvbXBvbmVudHMgMiBpbml0XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0ID0gdGhpcy5jb21wb25lbnRzMmluaXQuZmlsdGVyKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgIT09IChteW9wTWVzc2FnZSBhcyBJbml0UmVzcG9uc2UpLmNvbnRlbnQuaWQpXG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWF0ZWRDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSAobXlvcE1lc3NhZ2UgYXMgSW5pdFJlc3BvbnNlKS5jb250ZW50Py5pZCk7XG4gICAgICAgICAgICAgICAgaW5pdGlhdGVkQ29tcG9uZW50Py5zZXRJbml0aWF0ZWQoKVxuICAgICAgICAgICAgICAgIC8vaW5pdGlhdGVkQ29tcG9uZW50Py5wYXJlbnQ/LnNldEluaXRpYXRlZCgpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBpcyBpdCB0cnVlIHRvIG5vdCBwYXNzIGZ1cnRoZXIgKCB0byB0aGUgY29tcG9uZW50IClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IG15b3BNZXNzYWdlIGFzIEVudmVsb3BlZE1lc3NhZ2VcbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSB0eXBlZE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRNZXNzYWdlLmRpcmVjdGlvbiA9PT0gTWVzc2FnZURpcmVjdGlvbi5kb3duKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRNZXNzYWdlLm1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IEV4ZWN1dGVDb21wb25lbnRNZXRob2QubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5vbk1lc3NhZ2VSZWNlaXZlZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlZE1lc3NhZ2UubWVzc2FnZS5yb3V0ZSA9IHR5cGVkTWVzc2FnZS5yb3V0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuc2VuZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbm5lckNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IHR5cGVkTWVzc2FnZS5tZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNvbXBvbmVudC5zZW5kKHR5cGVkTWVzc2FnZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyA6IGxvZyA/XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vY29tcG9uZW50LnJlZnMuYm9keS5vbk1lc3NhZ2VSZWNlaXZlZChteW9wTWVzc2FnZS5tZXNzYWdlKTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gbXlvcE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuXG4gICAgICAgICAgICBpZiAoIWNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIC8vbm8gaW4gbWVtIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIC8vcGFzcyB0byBwYXJlbnQgSG9zdFNESyB0byB0cnkgcHJvY2VzcyB0aGVyZVxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5JZnJhbWVTREspIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLLm1lc3NhZ2VUb0hvc3QobXlvcE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm9uTWVzc2FnZVJlY2VpdmVkKG15b3BNZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9ub3QgcHJvY2Vzc2VkIGluIG9uTWVzc2FnZVJlY2VpdmVkXG4gICAgICAgICAgICAgICAgICAgIC8vcGFzcyB0byBwYXJlbnQgSG9zdFNESyB0byB0cnkgcHJvY2VzcyB0aGVyZVxuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93Lm15b3AuSWZyYW1lU0RLKVxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLLm1lc3NhZ2VUb0hvc3QobXlvcE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGV2ZW50LnNvdXJjZS5wb3N0TWVzc2FnZShcbiAgICAgICAgLy8gICAgIFwiaGkgdGhlcmUgeW91cnNlbGYhICB0aGUgc2VjcmV0IHJlc3BvbnNlIFwiICsgXCJpczogcmhlZWVlZXQhXCIsXG4gICAgICAgIC8vICAgICBldmVudC5vcmlnaW4sXG4gICAgICAgIC8vICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3Qgc3ludGhldGljRXZlbnQgPSBuZXcgTWVzc2FnZUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4oJycsXG4gICAgICAgICAgICB7ZGF0YTogbWVzc2FnZX1cbiAgICAgICAgKVxuXG4gICAgICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlSGFuZGxlcihzeW50aGV0aWNFdmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXQgPSAoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnM/OiBjb21wb25lbnRMb2FkZXJDcmVhdG9yW10pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhdGVkKSB7XG4gICAgICAgICAgICAvLyBnZXRIb3N0TW9kdWxlKCkgYWxyZWFkeSBpbml0aWF0ZXMgdGhlIFNESywgYW5kIHRoZSBSRUFETUUgdGVsbHMgaG9zdHMgdG8gY2FsbCBpbml0KClcbiAgICAgICAgICAgIC8vIGFmdGVyIGl0LiBPbmx5IG1lcmdlIGN1c3RvbSBsb2FkZXJzOyB0aGUgbWVzc2FnZSBsaXN0ZW5lciBpcyBhbHJlYWR5IGF0dGFjaGVkLlxuICAgICAgICAgICAgaWYgKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlckxvYWRlcnMoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFzaWNMb2FkZXJzID0gW1xuICAgICAgICAgICAgbmV3IE15b3BJZnJhbWVMb2FkZXIoKSxcbiAgICAgICAgICAgIG5ldyBXZWJjb21wb25lbnRMb2FkZXIoKSxcbiAgICAgICAgICAgIG5ldyBIVE1MQ29tcG9uZW50TG9hZGVyKClcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHNMb2FkZXJzID0gW1xuICAgICAgICAgICAgLi4uYmFzaWNMb2FkZXJzXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RlckxvYWRlcnMoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5jb21taW5nIG1lc3NhZ2VzIGZyb20gSUZyYW1lc1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgIFwibWVzc2FnZVwiLFxuICAgICAgICAgICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VIYW5kbGVyLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ215b3AgaG9zdFNESyBpbml0aWF0ZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgdGhpcy5pbml0aWF0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlZ2lzdGVyTG9hZGVycyA9IChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9yczogY29tcG9uZW50TG9hZGVyQ3JlYXRvcltdKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvYWRlckJ5VHlwZTogUmVjb3JkPHN0cmluZywgSU15b3BMb2FkZXI+ID0ge307XG5cbiAgICAgICAgY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMuZm9yRWFjaChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9yID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUxvYWRlciA9IG5ldyBjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9yKHRoaXMuY29tcG9uZW50c0xvYWRlcnMpO1xuICAgICAgICAgICAgbG9hZGVyQnlUeXBlW2N1c3RvbUxvYWRlci50eXBlXSA9IGN1c3RvbUxvYWRlcjtcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHNMb2FkZXJzLmZvckVhY2gobG9hZGVyID0+IHtcbiAgICAgICAgICAgIGlmICghbG9hZGVyQnlUeXBlW2xvYWRlci50eXBlXSlcbiAgICAgICAgICAgICAgICBsb2FkZXJCeVR5cGVbbG9hZGVyLnR5cGVdID0gbG9hZGVyO1xuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMgPSBPYmplY3QudmFsdWVzKGxvYWRlckJ5VHlwZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0U2tpbklkQnlTa2luU2VsZWN0b3IgPSBhc3luYyAoc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnLCBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXSA9IFtdLCBob29rcz86IGxvYWRlckhvb2tzKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gYXN5bmNGaW5kPFQ+KFxuICAgICAgICAgICAgYXJyYXk6IFRbXSxcbiAgICAgICAgICAgIHByZWRpY2F0ZTogKGl0ZW06IFQpID0+IFByb21pc2U8Ym9vbGVhbj5cbiAgICAgICAgKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXJyYXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXdhaXQgcHJlZGljYXRlKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIFJldHVybiB1bmRlZmluZWQgaWYgbm8gbWF0Y2ggaXMgZm91bmRcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoc2tpblNlbGVjdG9yLnR5cGUpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNhc2UgXCJEZWRpY2F0ZWRTa2luXCIgOiAvL2JhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgIGNhc2UgU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkOiB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU2tpbklkID0gKHNraW5TZWxlY3RvciBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZykuc2tpbj8uaWRcbiAgICAgICAgICAgICAgICAgICAgfHwgKHNraW5TZWxlY3RvciBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZykuc2tpbnMhWzBdLmlkO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkU2tpbklkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQ6IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFNraW5TZWxlY3RvciA9IChza2luU2VsZWN0b3IgYXMgSVNlZ21lbnRlZFNraW5Db25maWcpXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IGF3YWl0IGFzeW5jRmluZCh0eXBlZFNraW5TZWxlY3Rvci5zZWdtZW50cywgYXN5bmMgc2VnbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50LnNlZ21lbnRJZCA9PT0gJ0RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cGVyaWVuY2UgPSBleHBlcmllbmNlcy5maW5kKGV4cGVyaWVuY2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVyaWVuY2UudHlwZSA9PT0gRXhwZXJpZW5jZVR5cGVzLlNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlKS5zZWdtZW50LmlkID09PSBzZWdtZW50LnNlZ21lbnRJZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4cGVyaWVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImV4cGVyaWVuY2Ugbm90IGZvdW5kXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRFeHBlcmllbmNlID0gZXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2VnbWVudCA9ICh0eXBlZEV4cGVyaWVuY2Uuc2VnbWVudCBhcyBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudClcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50RnVuY3Rpb24gPSAoaG9va3MgPyBob29rcyA6IHt9KVt0eXBlZFNlZ21lbnQuZnVuY3Rpb25dO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgc2VnbWVudEZ1bmN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybihgc2VnbWVudElkOiR7c2VnbWVudC5zZWdtZW50SWR9LCAke3R5cGVkU2VnbWVudC5mdW5jdGlvbn0gZnVuY3Rpb24gbm90IHByb3ZpZGVkICFgKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTa2luSWRCeVNraW5TZWxlY3RvcihzZWdtZW50LnNraW5TZWxlY3RvciwgZXhwZXJpZW5jZXMpO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnIC8vVE9ET1xuICAgIH1cblxuICAgIHByaXZhdGUgcnVuU2tpblNlbGVjdG9yID0gYXN5bmMgKGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgaG9va3M/OiBsb2FkZXJIb29rcykgPT4ge1xuICAgICAgICBjb25zdCBza2luSWQgPSBhd2FpdCB0aGlzLl9nZXRTa2luSWRCeVNraW5TZWxlY3Rvcihjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLCBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcywgaG9va3MpO1xuICAgICAgICByZXR1cm4gY29tcG9uZW50Q29uZmlnLnR5cGUuc2tpbnMuZmluZChza2luID0+IHNraW4uaWQgPT09IHNraW5JZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRlckhvb2tzPzogbG9hZGVySG9va3M7XG5cbiAgICBwdWJsaWMgbG9hZENvbXBvbmVudCA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4oY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb250YWluZXI/OiBIVE1MRWxlbWVudCB8IFJlZiwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpOlxuICAgICAgICBQcm9taXNlPFQ+ID0+IHtcblxuICAgICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGNvbnRhaW5lciB3YXMgZm91bmQgZm9yIHRoaXMgY29tcG9uZW50Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdmVycmlkZGVuQ29uZmlnID0gYXdhaXQgY2hlY2tNeW9wT3ZlcnJpZGUoY29tcG9uZW50Q29uZmlnKTtcbiAgICAgICAgaWYgKG92ZXJyaWRkZW5Db25maWcpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IGxvZ1xuICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnID0gb3ZlcnJpZGRlbkNvbmZpZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy8gaWYgKCFjb250YWluZXIuX19ub25Qcm94aWVkKSB7XG4gICAgICAgIC8vICAgICBjb25zdCByZWZDb21wb25lbnQgPSAoY29udGFpbmVyIGFzIHVua25vd24gYXMgTXlvcFJlZkNvbXBvbmVudCk7XG4gICAgICAgIC8vICAgICAvL2lmIHdlIGdvdCBsb2FkQ29tcG9uZW50IG92ZXIgTXlvcFJlZkNvbXBvbmVudFxuICAgICAgICAvLyAgICAgaWYgKHJlZkNvbXBvbmVudC5pZCAmJiByZWZDb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMubG9hZENvbXBvbmVudChjb21wb25lbnRDb25maWcsIHJlZkNvbXBvbmVudC5yZWYsIG9wdGlvbnMpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIC8vIGxldCByb290Q29tcG9uZW50OiBJTXlvcENvbXBvbmVudCA9IHJlZkNvbXBvbmVudDtcbiAgICAgICAgLy8gICAgICAgICAvLyB3aGlsZSghcm9vdENvbXBvbmVudC5lbGVtZW50ICYmIHJvb3RDb21wb25lbnQucGFyZW50KXtcbiAgICAgICAgLy8gICAgICAgICAvLyAgICAgcm9vdENvbXBvbmVudCA9IHJvb3RDb21wb25lbnQucGFyZW50XG4gICAgICAgIC8vICAgICAgICAgLy8gfVxuICAgICAgICAvLyAgICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgLy8gcm9vdENvbXBvbmVudC5lbGVtZW50XG4gICAgICAgIC8vICAgICAgICAgLy8gLy93aGF0IG5vdyA/XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICBjb25zdCBob29rcyA9IHsuLi4odGhpcy5sb2FkZXJIb29rcyA/PyB7fSksIC4uLihvcHRpb25zPy5ob29rcyA/PyB7fSl9O1xuXG4gICAgICAgIGNvbnN0IHJlZiA9IGNvbnRhaW5lciBhcyBSZWY7XG4gICAgICAgIGlmIChyZWYubXlvcCkge1xuICAgICAgICAgICAgaWYgKHJlZi5jb21wb25lbnQpIHtcblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZyA9IHsuLi5jb21wb25lbnRDb25maWd9O1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY29tcG9uZW50Q29uZmlnLmluc3RhbmNlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU2tpbiA9IGF3YWl0IHRoaXMucnVuU2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZywgaG9va3MpIVxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRTa2luKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJ1blNraW5TZWxlY3RvciBmYWlsZWQgdG8gY2hvb3NlIHNraW4sIGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWdcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/Lmhvb2tzPy5hZnRlclNraW5TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFNraW4gPSBhd2FpdCBvcHRpb25zLmhvb2tzLmFmdGVyU2tpblNlbGVjdGVkKHsuLi5zZWxlY3RlZFNraW59KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgIHNraW46IHNlbGVjdGVkU2tpblxuICAgICAgICAgICAgICAgICAgICAvLyAgc2tpbnM6IFtzZWxlY3RlZFNraW5dXG4gICAgICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHsuLi5vcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgb3B0aW9ucy5ob29rc1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IGF3YWl0IGNyZWF0ZVJlZkNvbXBvbmVudDxUPihyZWYsIGNvbXBvbmVudENvbmZpZywgdGhpcy5jb21wb25lbnRzLCBvcHRpb25zKTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNvbm5lY3QgcmVmcyBhbmQgcHJvcHMgaW5zb2RlIGNyZWF0ZVJlZkNvbXBvbmVudCwgZWxzZXdoZXJlIGl0cyBub3QgcmVhbGx5IDxUPlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZDb21wb25lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbG9hZCBjb21wb25lbnQgZ290IGEgZGV0YWNoZWQgcmVmLicpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIGNob29zZSBza2luIG9uIHJ1bnRpbWUgLi4uXG4gICAgICAgICAqICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLnR5cGVcbiAgICAgICAgICovXG5cbiAgICAgICAgbGV0IHNlbGVjdGVkU2tpbiA9IGF3YWl0IHRoaXMucnVuU2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZywgaG9va3MpIVxuXG4gICAgICAgIGlmICghc2VsZWN0ZWRTa2luKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJydW5Ta2luU2VsZWN0b3IgZmFpbGVkIHRvIGNob29zZSBza2luLCBjaGVjayB0aGUgcHJvdmlkZWQgY29uZmlnXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/Lmhvb2tzPy5hZnRlclNraW5TZWxlY3RlZCkge1xuICAgICAgICAgICAgc2VsZWN0ZWRTa2luID0gYXdhaXQgb3B0aW9ucy5ob29rcy5hZnRlclNraW5TZWxlY3RlZCh7Li4uc2VsZWN0ZWRTa2lufSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9uZW50TG9hZGVyID0gdGhpcy5jb21wb25lbnRzTG9hZGVycy5maW5kKGxvYWRlciA9PiBsb2FkZXIudHlwZSA9PT0gc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlKTtcblxuICAgICAgICBpZiAoIWNvbXBvbmVudExvYWRlcikge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIGxvYWRlciBcIiR7c2VsZWN0ZWRTa2luLmxvYWRlci50eXBlfVwiIHdhcyBmb3VuZCBmb3IgY29tcG9uZW50YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2ZvciBsb2FkZWQgd2ViY29tcG9uZW50IG1vZHVsZXMgdG8gZm9sbG93aW5nIGxpbmUgY3JlYXRlcyBhIHJhY2UgY29uZGl0aW9uIHdpdGggdGhlIGluaXQgbWVzc2FnZSBmbG93XG4gICAgICAgIGxldCBjb21wb25lbnQgPSBhd2FpdCBjb21wb25lbnRMb2FkZXIubG9hZChjb21wb25lbnRDb25maWcudHlwZSwgc2VsZWN0ZWRTa2luLCBjb250YWluZXIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIFRPRE8gOiB3aGVuIHRoaXMgaXMgbm90IHRydWUgP1xuICAgICAgICBpZiAoIWNvbXBvbmVudC5pc0luaXRpYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQucHVzaChjb21wb25lbnQpXG4gICAgICAgIH1cblxuICAgICAgICBjb21wb25lbnQuYmluZCgnb25EaXNwb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY29tcG9uZW50IGRpc3Bvc2UnLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzLmZpbHRlcihjID0+IGMgIT09IGNvbXBvbmVudClcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0ID0gdGhpcy5jb21wb25lbnRzMmluaXQuZmlsdGVyKGMgPT4gYyAhPT0gY29tcG9uZW50KVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcblxuICAgICAgICAvLyBETyBOT1QgV0FJVCBUTyBCRSBBU0tFRCAtLSBCVVQgT05MWSBPTkNFIEZVTExZIFJFR0lTVEVSRUQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoZSBjb21wb25lbnQgYW5ub3VuY2VzIGl0c2VsZiBhcyBzb29uIGFzIGl0IGJvb3RzLCBhbmQgd2UgYW5zd2VyIGJ5IGxvb2tpbmcgaXRcbiAgICAgICAgLy8gdXAuIEJ1dCBpdCBvbmx5IGxhbmRzIGluIG91ciBsaXN0cyBIRVJFLCBhZnRlciB0aGUgYXdhaXQgYWJvdmUsIHdoaWNoIHRoZVxuICAgICAgICAvLyBjb21tZW50IG9uIHRoYXQgbGluZSBhbHJlYWR5IGNhbGxzIGEgcmFjZTogYSBjb21wb25lbnQgdGhhdCBib290ZWQgaW5zaWRlIHRoZVxuICAgICAgICAvLyBhd2FpdCBhbm5vdW5jZWQgaW50byBhbiBlbXB0eSBsaXN0LCBpdHMgSW5pdFJlcXVlc3Qgd2FzIGRyb3BwZWQsIGFuZCBub3RoaW5nXG4gICAgICAgIC8vIGV2ZXIgc2VudCB0aGUgSW5pdE1lc3NhZ2UgaXQgd2FzIGJsb2NrZWQgb24gLS0gaW5pdGlhdGVkKCkgdGhlbiByZWplY3RlZCB3aXRoXG4gICAgICAgIC8vIHRpbWVvdXRfPG1zPi4gTWluaWZpY2F0aW9uIG1hZGUgdGhhdCBjb21tb24gYnkgYm9vdGluZyBmcmFtZXMgc29vbmVyLiBSZXBvcnRlZFxuICAgICAgICAvLyBieSBQaWMtVGltZSAyMDI2LTEwLTE3LiBTZW5kaW5nIGhlcmUgY2xvc2VzIHRoZSBvcmRlcmluZyBob2xlIGluc3RlYWQgb2YgaG9waW5nXG4gICAgICAgIC8vIHRvIHN1cnZpdmUgaXQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRISVMgTVVTVCBDT01FIEFGVEVSIGBjb21wb25lbnRzLnB1c2hgLCBOT1QgQkVGT1JFIElULiBUaGUgdHdvIGNvbXBvbmVudCBjbGFzc2VzXG4gICAgICAgIC8vIGRvIG5vdCBzaGFyZSBhIHRyYW5zcG9ydDogYW4gaWZyYW1lIGlzIG1lc3NhZ2VkIHdpdGggcG9zdE1lc3NhZ2UsIHdoaWNoIGlzXG4gICAgICAgIC8vIGFzeW5jLCBzbyByZWdpc3RyYXRpb24gYWx3YXlzIHdvbiB0aGUgcmFjZSBieSBsdWNrLiBBIHdlYiBjb21wb25lbnQgaXMgbWVzc2FnZWRcbiAgICAgICAgLy8gd2l0aCBhIFNZTkNIUk9OT1VTIGN1c3RvbUVsZW1lbnQuZGlzcGF0Y2hFdmVudCwgc28gaXQgcmVnaXN0ZXJzIGFuZCByZXBsaWVzIHdpdGhcbiAgICAgICAgLy8gSW5pdFJlc3BvbnNlICppbnNpZGUqIHRoaXMgY2FsbCAtLSBhbmQgdGhlIEluaXRSZXNwb25zZSBoYW5kbGVyIHJlc29sdmVzIHRoZVxuICAgICAgICAvLyBjb21wb25lbnQgb3V0IG9mIGB0aGlzLmNvbXBvbmVudHNgLiBTZW5kaW5nIHdoaWxlIHRoYXQgYXJyYXkgd2FzIHN0aWxsIG1pc3NpbmdcbiAgICAgICAgLy8gdGhlIGNvbXBvbmVudCBtZWFudCB0aGUgbG9va3VwIGZvdW5kIG5vdGhpbmcsIHNldEluaXRpYXRlZCgpIG5ldmVyIHJhbiwgYW5kXG4gICAgICAgIC8vIHNpbmNlIGNvbXBvbmVudHMyaW5pdCBoYWQgYWxyZWFkeSBiZWVuIGZpbHRlcmVkIHRoZSBjb21wb25lbnQgY291bGQgbmV2ZXIgYmVcbiAgICAgICAgLy8gcmVjb3ZlcmVkOiBldmVyeSB3ZWIgY29tcG9uZW50IGh1bmcgdW50aWwgdGltZW91dC4gQ2F1Z2h0IGJ5XG4gICAgICAgIC8vIHRlc3QvaW5pdC13ZWJjb21wb25lbnQuZTJlLm1qcy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQSBmcmFtZSB0aGF0IGhhcyBub3QgYm9vdGVkIHlldCBoYXMgYSBudWxsIGNvbnRlbnRXaW5kb3csIHNvIGBzZW5kYCBpcyBhIG5vLW9wXG4gICAgICAgIC8vIChpdCBpcyBvcHRpb25hbC1jaGFpbmVkKSBhbmQgdGhhdCBjb21wb25lbnQncyBvd24gSW5pdFJlcXVlc3QgaXMgYW5zd2VyZWRcbiAgICAgICAgLy8gbm9ybWFsbHkgLS0gd2UgYXJlIHJlZ2lzdGVyZWQgYnkgdGhlbi5cbiAgICAgICAgaWYgKCFjb21wb25lbnQuaXNJbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBJbml0TWVzc2FnZShjb21wb25lbnQuaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdHJ1ZSBieSBkZWZhdWx0XG4gICAgICAgIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLmNvbm5lY3RQcm9wcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IG1ha2UgdHlwZSBmaWVsZCBjb25kaXRpb25hbCB0eXBlIGluZmVyIFwic3RyaW5nXCIgPiBzdHJpbmcsIFwibnVtYmVyXCIgPiBudW1iZXIsIGV0Yy4uLlxuICAgICAgICAgICAgY29tcG9uZW50ID0gY29ubmVjdFByb3BzKGNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLnR5cGUucHJvcHMsIHNlbGVjdGVkU2tpbik7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy9UT0RPIDogbWFrZSBvcHRpb25hbD9cbiAgICAgICAgICAgIC8vVE9ETyA6IGZpeCBpc3N1ZXMgd2l0aCB0aW1lb3V0IGFuZCB3cm9uZyByZWYgbmFtZXMgZnJvbSBjb25maWcgdnMgY3VycmVudCBza2luXG4gICAgICAgICAgICBhd2FpdCBjb25uZWN0UmVmcyhjb21wb25lbnQsIGNvbXBvbmVudENvbmZpZywgdGhpcy5jb21wb25lbnRzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAvLyBUT09EIDogdGhyb3cgP1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucz8uc2tpcEluaXQpXG4gICAgICAgICAgICBhd2FpdCBjb21wb25lbnQuaW5pdGlhdGVkKCk7XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudCBhcyBUO1xuICAgIH1cblxuICAgIHB1YmxpYyBuYXZpZ2F0ZSA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4oY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgbmV3Q29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBvcHRpb25zPzogbmF2aWdhdGlvbk9wdGlvbnMpID0+IHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmF2aWdhdGluZyBvbiByZW1vdGUgcmVmIGNvbXBvbmVudHMgaXMgbm90IGltcGxlbWVudGVkIHlldCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21wb25lbnQubWFya2VkRm9yRGlzcG9zZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIGlmIChvcHRpb25zPy5pbnBsYWNlKSB7XG4gICAgICAgIC8vICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgLy8gICAgICAgICBsZXQgbmV3Q29tcG9uZW50ID0gYXdhaXQgdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgICAgIGF3YWl0IG5ld0NvbXBvbmVudC5pbml0aWF0ZWQoKTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICBpZiAob3B0aW9ucy5pbml0KVxuICAgICAgICAvLyAgICAgICAgICAgICBhd2FpdCBvcHRpb25zLmluaXQobmV3Q29tcG9uZW50KTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50O1xuICAgICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJy4uLicpXG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uc3RhZ2VkKSB7XG4gICAgICAgICAgICAvL2NvbnN0IHNlbGVjdGVkU2tpbiA9IHRoaXMucnVuU2tpblNlbGVjdG9yKG5ld0NvbXBvbmVudENvbmZpZylcbiAgICAgICAgICAgIGxldCBuZXdDb21wb25lbnQgPSBhd2FpdCB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuY29udGFpbmVyLCB7XG4gICAgICAgICAgICAgICAgaGlkZGVuOiB0cnVlLFxuICAgICAgICAgICAgICAgIHJlbGF0aXZlOiB7ZGlyZWN0aW9uOiAnYWZ0ZXInLCBjaGlsZDogY29tcG9uZW50LmVsZW1lbnQhfSxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaW5pdClcbiAgICAgICAgICAgICAgICBhd2FpdCBvcHRpb25zLmluaXQobmV3Q29tcG9uZW50KTtcblxuICAgICAgICAgICAgbmV3Q29tcG9uZW50LnNob3coKTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBjb21wb25lbnQuZWxlbWVudCEubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgIGNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmNvbnRhaW5lciwge1xuICAgICAgICAgICAgICAgIHJlbGF0aXZlOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiZWZvcmVcIixcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQ6IG5leHRTaWJsaW5nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIG5hdmlnYXRpb25PcHRpb25zID0ge1xuICAgIHN0YWdlZD86IGJvb2xlYW4sXG4gICAgLy9pbnBsYWNlPzogYm9vbGVhbixcbiAgICBpbml0PzogKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQpID0+IFByb21pc2U8dm9pZD5cbiAgICBza2lwSW5pdD86IGJvb2xlYW5cbn0gJiBsb2FkZXJPcHRpb25zXG5cbnR5cGUgcmVsYXRpdmVMb2FkQ29uZmlnRGlyZWN0aW9uID0gJ2JlZm9yZScgfCAnYWZ0ZXInO1xuXG5cbmV4cG9ydCB0eXBlIGxvYWRlckhvb2tzID0ge1xuICAgIGFmdGVyU2tpblNlbGVjdGVkPzogKHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcpID0+IFByb21pc2U8SVNraW5Db25maWc+XG59ICZcbiAgICAvLyBzZWdtZW50YXRpb24gaG9va3NcbiAgICAoeyBba2V5OiBzdHJpbmddOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbiB9IHwge30pXG5cbi8vVE9ETzogc3VwcG9ydCBzZXJpYWxpemFibGUgdmVyc2lvbiBvZiB0aGF0IG9iamVjdFxuZXhwb3J0IGludGVyZmFjZSByZWxhdGl2ZUxvYWRDb25maWcge1xuICAgIC8vSWYgdGhpcyBpcyBudWxsLCB0aGVuIG5ld05vZGUgaXMgaW5zZXJ0ZWQgYXQgdGhlIGVuZCBvZiBub2RlJ3MgY2hpbGQgbm9kZXMuXG4gICAgLy9odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTm9kZS9pbnNlcnRCZWZvcmVcbiAgICBjaGlsZDogQ2hpbGROb2RlIHwgbnVsbFxuICAgIGRpcmVjdGlvbjogcmVsYXRpdmVMb2FkQ29uZmlnRGlyZWN0aW9uXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUVudmlyb25tZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxudHlwZSBFbGVtZW50QXR0cmlidXRlcyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgbG9hZGVyT3B0aW9ucyB7XG4gICAgaWQ/OiBzdHJpbmdcbiAgICBoaWRkZW4/OiBib29sZWFuXG4gICAgY29ubmVjdFByb3BzPzogYm9vbGVhblxuICAgIHRpbWVvdXQ/OiBudW1iZXJcbiAgICBza2lwSW5pdD86IGJvb2xlYW5cbiAgICByZWxhdGl2ZT86IHJlbGF0aXZlTG9hZENvbmZpZ1xuICAgIGhvb2tzPzogbG9hZGVySG9va3NcbiAgICBlbGVtZW50QXR0cmlidXRlcz86IEVsZW1lbnRBdHRyaWJ1dGVzXG4gICAgX2Vudmlyb25tZW50PzogSUVudmlyb25tZW50XG4gICAgX2hhc1BhcmVudD86IGJvb2xlYW5cbiAgICBfaW5zcGVjdGlvbj86IGJvb2xlYW5cbiAgICBkYXRhPzogYW55XG4gICAgLyoqXG4gICAgICogUmF3IENTUyBpbmplY3RlZCBpbnRvIHRoZSBjb21wb25lbnQncyBpZnJhbWUgPGhlYWQ+IGJlZm9yZSBmaXJzdCBwYWludC5cbiAgICAgKiBBcHBlbmRlZCBsYXN0IHNvIGl0IG92ZXJyaWRlcyB0aGUgY29tcG9uZW50J3Mgb3duIHN0eWxlcyB2aWEgY2FzY2FkZSBvcmRlci5cbiAgICAgKiBVc2VmdWwgZm9yIHRoZW1pbmcgdjIgKEhUTUwpIGNvbXBvbmVudHMgXHUyMDE0IGNvbG9ycywgZm9udHMsIHNwYWNpbmcsIGV0Yy5cbiAgICAgKi9cbiAgICBpbmplY3RDc3M/OiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBDb250cm9sIGlmcmFtZSBhdXRvLXNpemluZyBiZWhhdmlvci5cbiAgICAgKiAtIHRydWUgKGRlZmF1bHQpOiBpZnJhbWUgYXV0by1zaXplcyB0byBjb250ZW50IGhlaWdodCwgd2lkdGggZmlsbHMgcGFyZW50LlxuICAgICAqIC0gZmFsc2U6IG5vIHNpemluZyBsb2dpYyBydW5zLiBObyBvYnNlcnZlcnMsIG5vIG1lYXN1cmVtZW50cywgbm8gc3R5bGUgY2hhbmdlcy5cbiAgICAgKiAgIFRoZSBpZnJhbWUgc3RheXMgYXQgcG9zaXRpb246YWJzb2x1dGUgZmlsbGluZyB0aGUgY29udGFpbmVyLlxuICAgICAqICAgVGhlIGhvc3QgaXMgZnVsbHkgcmVzcG9uc2libGUgZm9yIGNvbnRhaW5lciBkaW1lbnNpb25zLlxuICAgICAqL1xuICAgIGF1dG9TaXplPzogYm9vbGVhblxuXG4gICAgLyoqXG4gICAgICogUGVyLWNhbGwgcmVuZGVyIHBvbGljeS4gVGFrZXMgcHJlY2VkZW5jZSBvdmVyIGhvc3RTREsuc2V0UmVuZGVyUG9saWN5IFx1MjAxNCBsZXRzIGFuXG4gICAgICogYXBwIHJlc3RyaWN0IGdsb2JhbGx5IGFuZCBhbGxvdyAob3IgZnVydGhlciByZXN0cmljdCkgc3BlY2lmaWMgbG9hZENvbXBvbmVudCBjYWxscy5cbiAgICAgKi9cbiAgICByZW5kZXJQb2xpY3k/OiBSZW5kZXJQb2xpY3lcblxuICAgIC8qKlxuICAgICAqIEZvcmNlIGZ1bGwgaXNvbGF0aW9uIGZvciBhbiBpbmxpbmUtSFRNTCAobG9jYWxGcmFtZSkgY29tcG9uZW50OiBzYW5kYm94ZWQsXG4gICAgICogY3Jvc3Mtb3JpZ2luIGlmcmFtZSB3aXRoIG5vIGhvc3QtZG9jdW1lbnQgYWNjZXNzLiBBIHJlbmRlciBwb2xpY3kgcmV0dXJuaW5nXG4gICAgICogJ2lzb2xhdGVkSWZyYW1lJyBoYXMgdGhlIHNhbWUgZWZmZWN0LlxuICAgICAqL1xuICAgIGlzb2xhdGlvbj86IGJvb2xlYW5cbn1cblxuaWYgKCF3aW5kb3cubXlvcCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3aW5kb3cubXlvcCA9IHtcbiAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX19cbiAgICB9O1xufVxuXG5pZiAoIXdpbmRvdy5teW9wLmhvc3RTREspIHtcbiAgICBjb25zdCBfaG9zdFNESyA9IG5ldyBIb3N0U0RLKCk7XG4gICAgLy9UT0RPOiBlbmFibGUgbGF6eSBpbml0P1xuICAgIF9ob3N0U0RLLmluaXQoKTtcblxuICAgIGlmICghd2luZG93Lm15b3ApIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3cubXlvcCA9IHtcbiAgICAgICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fXG4gICAgICAgIH07XG4gICAgfVxuICAgIHdpbmRvdy5teW9wLmhvc3RTREsgPSBfaG9zdFNESztcbn1cblxuLy8gVGhlIG9wdC1pbiwgcmVhY2hhYmxlIHdpdGggbm8gaW1wb3J0IGFuZCBubyBidWlsZCBjaGFuZ2Ugb24gdGhlIGhvc3QgcGFnZTpcbi8vXG4vLyAgIG15b3AuZGVsaXZlcnkoeyBtaW5pZnk6IHRydWUsIGNhY2hlOiB0cnVlIH0pOyAgIC8vIGxhbmUgKyB0aGUgY2xpZW50IHdpbmRvd1xuLy8gICBteW9wLmRlbGl2ZXJ5LnN0YXRzKCk7ICAgICAgICAgICAgICAgIC8vIHdoYXQgYW5zd2VyZWQsIGFuZCBob3cgb2Z0ZW4gaXQgZmVsbCBiYWNrXG4vLyAgIG15b3AuZGVsaXZlcnkub2ZmKCk7ICAgICAgICAgICAgICAgICAgLy8gYmFjayB0byB0b2RheSdzIGhvc3QsIG5vIHJlbG9hZFxuLy9cbi8vIEF0dGFjaGVkIGhlcmUgcmF0aGVyIHRoYW4gZXhwb3J0ZWQgb25seSBhcyBhIG1vZHVsZSBmdW5jdGlvbiBiZWNhdXNlIHRoZSBob3N0IGFwcCB0aGF0XG4vLyBvcHRzIGluIGlzIG9mdGVuIGxvYWRpbmcgdGhlIFNESyBmcm9tIGEgc2NyaXB0IHRhZywgd2hlcmUgYGltcG9ydGAgaXMgbm90IGF2YWlsYWJsZS5cbmlmICh3aW5kb3cubXlvcCAmJiAhKHdpbmRvdy5teW9wIGFzIGFueSkuZGVsaXZlcnkpIHtcbiAgICBjb25zdCBhcGk6IGFueSA9IChvcHRzPzoge21pbmlmeT86IGJvb2xlYW47IGhvc3Q/OiBzdHJpbmcgfCBudWxsfSkgPT4gZGVsaXZlcnkob3B0cyk7XG4gICAgYXBpLnN0YXRzID0gZGVsaXZlcnlTdGF0cztcbiAgICBhcGkub2ZmID0gZGVsaXZlcnlPZmY7XG4gICAgYXBpLnJlZnJlc2ggPSBkZWxpdmVyeVJlZnJlc2g7XG4gICAgKHdpbmRvdy5teW9wIGFzIGFueSkuZGVsaXZlcnkgPSBhcGk7XG59XG5cbi8vIEB0cy1pZ25vcmVcbmV4cG9ydCBjb25zdCBob3N0U0RLOiBIb3N0U0RLID0gd2luZG93Lm15b3AuaG9zdFNESztcblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnaG9zdFNESycsIGhvc3RTREspO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIG15b3A6IHtcbiAgICAgICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fOiBzdHJpbmcsXG4gICAgICAgICAgICBob3N0U0RLOiBIb3N0U0RLLFxuICAgICAgICAgICAgSWZyYW1lU0RLOiBJbnN0YW5jZVR5cGU8dHlwZW9mIElmcmFtZVNESz5cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0hvc3RTREt9IGZyb20gXCIuLi8uLi9ob3N0L2hvc3RTREtcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLnRzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vaG9zdFwiO1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZVJlZiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vVE9ETyA6IHVzZSByZWYgaGVscGVyIGhlcmVcbiAgICAgICAgICAgIGNvbnN0IGFsbEl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbiAgICAgICAgICAgIGlmIChhbGxJdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBob3N0U0RLID0gSG9zdFNESy5JbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IGF3YWl0IGhvc3RTREsubG9hZENvbXBvbmVudChldmVudC5uZXN0ZWRDb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICAgIGFsbEl0ZW1zLml0ZW0oMCksXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Lm9wdGlvbnMpXG5cbiAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIGl0IHRvIHBhc3MgdGhlIGFzc2lnbmVkIGlkc1xuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZFJlZkNvbmZpZzogYW55W10gPSBbXTtcblxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHJlZkNvbXBvbmVudC5yZWZzKS5mb3JFYWNoKHJlZk5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVmID0gcmVmQ29tcG9uZW50LnJlZnNbcmVmTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIHJlZiA9IHJlZi5fX25vblByb3hpZWQgfHwgcmVmO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRSZWZDb25maWcucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uSWQ6IChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIG5lc3RlZFJlZkNvbmZpZykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciAtIERPTSBlbGVtZW50IG5vdCBmb3VuZCcpXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIFtdLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjcmVhdGVSZWYoKS50aGVuKCk7XG4gICAgICAgIC8vcmV0dXJuaW5nIHVuZGVmaW5lZCBzbyBpdCB3b24ndCBhY3QgYXMgYSBjbGVhbnVwXG4gICAgfVxufVxuIiwgIi8vIEB0cy1ub2NoZWNrXG5leHBvcnQgY29uc3Qgb2JzZXJ2ZURPTSA9IChvYmo6IEhUTUxFbGVtZW50IHwgbnVsbCwgY2FsbGJhY2s6IChtdXRhdGlvblJlY29yZHM/OiBNdXRhdGlvblJlY29yZFtdKSA9PiB2b2lkKSA9PiB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgICAgY29uc29sZS5sb2coJ24nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgTXV0YXRpb25PYnNlcnZlciA9IHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyIHx8IHdpbmRvdy5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xuXG4gICAgaWYgKCFvYmogfHwgb2JqLm5vZGVUeXBlICE9PSAxKSByZXR1cm47XG5cbiAgICBpZiAoTXV0YXRpb25PYnNlcnZlcikge1xuICAgICAgICAvLyBkZWZpbmUgYSBuZXcgb2JzZXJ2ZXJcbiAgICAgICAgY29uc3QgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKVxuICAgICAgICAvLyBoYXZlIHRoZSBvYnNlcnZlciBvYnNlcnZlIGZvciBjaGFuZ2VzIGluIGNoaWxkcmVuXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHthdHRyaWJ1dGVzOiB0cnVlLCBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWV9O1xuICAgICAgICBtdXRhdGlvbk9ic2VydmVyLm9ic2VydmUob2JqLCBjb25maWcpXG4gICAgICAgIHJldHVybiBtdXRhdGlvbk9ic2VydmVyXG4gICAgfVxuXG4gICAgLy8gYnJvd3NlciBzdXBwb3J0IGZhbGxiYWNrXG4gICAgZWxzZSBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU5vZGVJbnNlcnRlZCcsIGNhbGxiYWNrLCBmYWxzZSlcbiAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU5vZGVSZW1vdmVkJywgY2FsbGJhY2ssIGZhbHNlKVxuICAgIH1cbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlLCBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtvYnNlcnZlRE9NfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL2RvbU9ic2VydmVyXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxFeGVjdXRlU2NyaXB0TWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlXG5cbiAgICBleGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSkge1xuICAgICAgICAgICAgb2JzZXJ2ZURPTShkb2N1bWVudC5ib2R5LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSgpXG4gICAgICAgICAgICAgICAgICAgIC8vICBuZXcgRW52ZWxvcGVkTWVzc2FnZShldmVudC5zb3VyY2UhLCBuZXcgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UoKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSwgRm9ybURhdGFFbnRyeSwgR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgSW5wdXRFbGVtZW50VmFsdWUsfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuY29uc3QgZ2V0SW5wdXRWYWx1ZSA9IChlbGVtZW50KTogSW5wdXRFbGVtZW50VmFsdWUgPT4ge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgZm9ybVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgZGF0YU9iamVjdDogSW5wdXRFbGVtZW50VmFsdWUgPSB7XG4gICAgICAgICAgICBmb3JtRGF0YToge30sXG4gICAgICAgICAgICB1bm1hcHBlZERhdGE6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gTWFudWFsbHkgYWRkIGVsZW1lbnRzIHdpdGhvdXQgbmFtZXNcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJyk7XG4gICAgICAgIGxldCBhdXRvTmFtZUluZGV4ZXIgPSAtMTtcblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcblxuICAgICAgICAgICAgICAgIC8vIGBfJHsoKythdXRvTmFtZUluZGV4ZXIpfWBcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVEYXRhOiBGb3JtRGF0YUVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICBpZDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZ2V0SW5wdXRWYWx1ZShlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGVsZW1lbnQucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5OiBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQudmFsaWRpdHksIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICBteW9wSWQsXG4gICAgICAgICAgICAgICAgfTtcblxuXG4gICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gfHwgIWRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUgfHwgbm9kZURhdGEudmFsdWUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWtleSkge1xuICAgICAgICAgICAgICAgIC8vICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGF0YU9iamVjdDtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtZW50LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2hlY2tlZCA/IGVsZW1lbnQudmFsdWUgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBpbnB1dCBhbmQgdGV4dGFyZWEgZWxlbWVudHNcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnIHx8IGVsZW1lbnQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc2VsZWN0IGVsZW1lbnRzIChkcm9wZG93bnMpXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGVkaXRhYmxlIGRpdnMgKGNvbnRlbnRFZGl0YWJsZSlcbiAgICBpZiAoZWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5pbm5lclRleHQgfHwgZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGFuIHVuc3VwcG9ydGVkIGVsZW1lbnQgdHlwZVxuICAgIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgR2V0RWxlbWVudFZhbHVlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxHZXRFbGVtZW50VmFsdWVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5HZXRFbGVtZW50VmFsdWVNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKFxuICAgICAgICAgICAgICAgIGdldElucHV0VmFsdWUoaXRlbSlcbiAgICAgICAgICAgICksIGV2ZW50KTtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtHZXRBdHRyaWJ1dGVNZXNzYWdlLCBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0Rmlyc3RFbGVtZW50QnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8R2V0QXR0cmlidXRlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuR2V0QXR0cmlidXRlTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBHZXRBdHRyaWJ1dGVNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBnZXRGaXJzdEVsZW1lbnRCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KVxuICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlKGl0ZW0uZ2V0QXR0cmlidXRlKGV2ZW50Lm5hbWUpKSwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7UmVzaXplT2JzZXJ2ZXJNZXNzYWdlLCBTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2V9IGZyb20gJy4uLy4uL21lc3NhZ2VzJ1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZVxuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgICAgICAgICAgLy9UT0RPIDogcGFzcyB0aGUgaGVpZ2h0XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlc2l6ZU9ic2VydmVyTWVzc2FnZSgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxTZXRJbm5lckh0bWw+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldElubmVySHRtbDtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBTZXRJbm5lckh0bWwpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaXRlbS5pbm5lckhUTUwgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogVGhlIElmcmFtZSBTREsgaXMgaW50ZW5kZWQgZm9yIHNjZW5hcmlvcyB3aGVyZSBkZXZlbG9wZXJzIHdpc2ggdG8gaW1wbGVtZW50IE15b3AgY29tcG9uZW50cyBhcyBzZXBhcmF0ZSB3ZWIgYXBwbGljYXRpb25zIGhvc3RlZCB3aXRoaW4gaWZyYW1lcy48YnIvPjxici8+XG4gKiBCeSBpbXBvcnRpbmcgdGhlIElmcmFtZSBTREssIGRldmVsb3BlcnMgZ2FpbiBhY2Nlc3MgdG8gdG9vbHMgYW5kIHV0aWxpdGllcyBuZWNlc3NhcnkgZm9yIGhhbmRsaW5nIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiBhbmQgdGhlIGVtYmVkZGVkIGlmcmFtZS1iYXNlZCBNeW9wIGNvbXBvbmVudHM8YnIvPjxici8+XG4gKiBUaGlzIFNESyBmYWNpbGl0YXRlcyBzZWN1cmUgaXNvbGF0aW9uLCBhbGxvd2luZyBjb21wb25lbnRzIHRvIGZ1bmN0aW9uIGluZGVwZW5kZW50bHkgd2hpbGUgc3RpbGwgYmVuZWZpdGluZyBmcm9tIHRoZSBvdmVyYWxsIHN0cnVjdHVyZSBhbmQgbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMgcHJvdmlkZWQgYnkgdGhlIGhvc3QgYXBwbGljYXRpb24uPGJyLz48YnIvPlxuICpcbiBPbmNlIGxvYWRlZCB0aGUgYFJvb3RTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gYGBganNcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiBvclxuIGBgYHRzXG4gaW1wb3J0IHtnZXRJZnJhbWVNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuIG9yXG4gYGBgdHNcbiBpbXBvcnQge0lmcmFtZVNES30gZnJvbSAnQG15b3Avc2RrL2lmcmFtZSc7XG4gYGBgXG4gKlxuICovXG5pbXBvcnQge0Jhc2VNeW9wU0RLfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge0JpbmRPbkNsaWNrSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlclwiO1xuaW1wb3J0IHtDaGFuZ2VUZXh0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXJcIjtcbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuaW1wb3J0IHtBZGRFdmVudExpc3RlbmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyXCI7XG5pbXBvcnQge3NldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyXCI7XG5pbXBvcnQge1xuICAgIEluaXRSZXF1ZXN0LFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtTZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL1NldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyXCI7XG5pbXBvcnQge0dldEVsZW1lbnRWYWx1ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzXCI7XG4vLyBAdHMtaWdub3JlIGhhbmRsZWQgYnkgY3VzdG9tIGVzYnVpbGQgcGx1Z2luXG5pbXBvcnQgdmVyc2lvbiBmcm9tIFwibXlvcC1zZGstdmVyc2lvblwiO1xuaW1wb3J0IHtHZXRBdHRyaWJ1dGVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZ2V0QXR0cmlidXRlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTZXRSZXNpemVPYnNlcnZlckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9TZXRSZXNpemVPYnNlcnZlckhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHNcIjtcblxuLyoqXG4gVGhlIElmcmFtZSBTREsgaXMgaW50ZW5kZWQgZm9yIHNjZW5hcmlvcyB3aGVyZSBkZXZlbG9wZXJzIHdpc2ggdG8gaW1wbGVtZW50IE15b3AgY29tcG9uZW50cyBhcyBzZXBhcmF0ZSB3ZWIgYXBwbGljYXRpb25zIGhvc3RlZCB3aXRoaW4gaWZyYW1lcy48YnIvPjxici8+XG4gQnkgaW1wb3J0aW5nIHRoZSBJZnJhbWUgU0RLLCBkZXZlbG9wZXJzIGdhaW4gYWNjZXNzIHRvIHRvb2xzIGFuZCB1dGlsaXRpZXMgbmVjZXNzYXJ5IGZvciBoYW5kbGluZyBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGhvc3QgYXBwbGljYXRpb24gYW5kIHRoZSBlbWJlZGRlZCBpZnJhbWUtYmFzZWQgTXlvcCBjb21wb25lbnRzPGJyLz48YnIvPlxuIFRoaXMgU0RLIGZhY2lsaXRhdGVzIHNlY3VyZSBpc29sYXRpb24sIGFsbG93aW5nIGNvbXBvbmVudHMgdG8gZnVuY3Rpb24gaW5kZXBlbmRlbnRseSB3aGlsZSBzdGlsbCBiZW5lZml0aW5nIGZyb20gdGhlIG92ZXJhbGwgc3RydWN0dXJlIGFuZCBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyBwcm92aWRlZCBieSB0aGUgaG9zdCBhcHBsaWNhdGlvbi48YnIvPjxici8+XG5cbiBPbmNlIGxvYWRlZCB0aGUgYFJvb3RTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gYGBganNcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiBvclxuIGBgYHRzXG4gaW1wb3J0IHtnZXRJZnJhbWVNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuICovXG5leHBvcnQgY2xhc3MgSWZyYW1lU0RLIGV4dGVuZHMgQmFzZU15b3BTREsge1xuXG4gICAgcHVibGljIHZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKCF3aW5kb3cubXlvcCkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgd2luZG93Lm15b3AgPSB7fVxuICAgICAgICB9XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLID0gdGhpcztcbiAgICB9XG5cbiAgICBtZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKCFtZXNzYWdlLnJlcGxheVRvSGFuZGxlciAmJiByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkKVxuICAgICAgICAgICAgbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUby5oYW5kbGVyVW5pcXVlSWRcblxuICAgICAgICBjb25zdCBjb21wb25lbnRJZHMgPSBPYmplY3Qua2V5cyh0aGlzLmNvbXBvbmVudHMpO1xuXG4gICAgICAgIGlmICghbWVzc2FnZS5kZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgaWYgKHJlcGxheVRvPy5yb3V0ZSkge1xuICAgICAgICAgICAgICAgIC8vIHRha2luZyB0aGUgZmlyc3QgY29tcG9uZW50IHRoYXQgaW5pdGlhdGVkIHRoYXQgY3ljbGVcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gcmVwbGF5VG8ucm91dGVbcmVwbGF5VG8ucm91dGUubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSBjb21wb25lbnRJZHNbMF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2Uuc291cmNlKVxuICAgICAgICAgICAgbWVzc2FnZS5zb3VyY2UgPSBjb21wb25lbnRJZHNbMF07XG5cbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLnVwO1xuXG4gICAgICAgIC8vIGBob3N0V2luZG93YCwgbm90IGB3aW5kb3cucGFyZW50YCAtLSBzZWUgdGhlIGZpZWxkJ3MgY29tbWVudC4gRm9yIGEgY29tcG9uZW50XG4gICAgICAgIC8vIG1vdW50ZWQgaW50byBhbm90aGVyIGNvbXBvbmVudCdzIGRvY3VtZW50IHRoZSBwYXJlbnQgaXMgYW4gaW50ZXJtZWRpYXRlIGZyYW1lXG4gICAgICAgIC8vIHRoYXQgZHJvcHMgY2hpbGQgbWVzc2FnZXMsIHNvIGFuIEluaXRSZXNwb25zZSBzZW50IHRoZXJlIG5ldmVyIHJlYWNoZXMgdGhlIGhvc3RcbiAgICAgICAgLy8gYW5kIHRoZSBjb21wb25lbnQgc3RheXMgcGVuZGluZyB1bnRpbCBpdCB0aW1lcyBvdXQuXG4gICAgICAgICh0aGlzLmhvc3RXaW5kb3cgPz8gd2luZG93LnBhcmVudCk/LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIC4uLm1lc3NhZ2VcbiAgICAgICAgfSwgJyonKTtcbiAgICB9XG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW10gPSBbXG4gICAgICAgIG5ldyBDaGFuZ2VUZXh0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgU2V0SW5uZXJIdG1sSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgQmluZE9uQ2xpY2tIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBFeGVjdXRlU2NyaXB0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IHNldEF0dHJpYnV0ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IFNldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBTZXRSZXNpemVPYnNlcnZlckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEdldEF0dHJpYnV0ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcblxuICAgICAgICAvL2NvbXBvc2l0ZSBzdXBwb3J0IG1lc3NhZ2VzIDpcbiAgICAgICAgbmV3IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdClcbiAgICBdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHdpbmRvdyB0aGlzIGZyYW1lIGFuc3dlcnMgdG8uIERlZmF1bHRzIHRvIHRoZSBwYXJlbnQsIHdoaWNoIGlzIGNvcnJlY3QgZm9yIGFcbiAgICAgKiBjb21wb25lbnQgbW91bnRlZCBkaXJlY3RseSBieSB0aGUgcGFnZSdzIG93biBob3N0LlxuICAgICAqXG4gICAgICogSVQgSVMgTk9UIEFMV0FZUyBUSEUgUEFSRU5ULiBBIGhvc3QgY2FuIG1vdW50IGEgY29tcG9uZW50IGludG8gYSBjb250YWluZXIgdGhhdFxuICAgICAqIGxpdmVzIGluc2lkZSBBTk9USEVSIGNvbXBvbmVudCdzIGRvY3VtZW50IC0tIFBpYy1UaW1lJ3MgcmVlbCB0ZW1wbGF0ZXMgYXJlIG1vdW50ZWRcbiAgICAgKiBieSB0aGUgdG9wLWxldmVsIGhvc3QgaW50byBgI3JlZWxTbG90YCBpbnNpZGUgdGhlIHJlZWwgZGlhbG9nJ3MgZnJhbWUuIFRoZSByZWFsIGhvc3RcbiAgICAgKiBpcyB0aGVuIGEgR1JBTkRwYXJlbnQsIGFuZCBgd2luZG93LnBhcmVudGAgaXMgYSBmcmFtZSB0aGF0IGtub3dzIG5vdGhpbmcgYWJvdXQgdGhpc1xuICAgICAqIGNvbXBvbmVudDogaXRzIG5lc3RlZCBob3N0U0RLIGhhcyBubyBlbnRyeSBmb3IgaXQgYW5kIGl0cyBJZnJhbWVTREsgZHJvcHMgbWVzc2FnZXNcbiAgICAgKiBmcm9tIGEgY2hpbGQuIFJlcGxpZXMgc2VudCB0byB0aGUgcGFyZW50IGFyZSBzaW1wbHkgbG9zdC5cbiAgICAgKlxuICAgICAqIFNvIHdlIGFkb3B0IHdob2V2ZXIgYWN0dWFsbHkgdGFsa3MgdG8gdXMsIHRoZSBmaXJzdCB0aW1lIGFuIGFuY2VzdG9yIGRvZXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBob3N0V2luZG93OiBXaW5kb3cgfCBudWxsID0gd2luZG93LnBhcmVudDtcblxuICAgIC8qKlxuICAgICAqIENvbW1hbmRzIChpbmNsdWRpbmcgRXhlY3V0ZVNjcmlwdCkgbXVzdCBjb21lIGZyb20gYSB3aW5kb3cgdGhpcyBmcmFtZSBpcyBhY3R1YWxseVxuICAgICAqIG5lc3RlZCBpbnNpZGUgLS0gbmV2ZXIgZnJvbSBhbiBvcGVuZXIgb3IgYSBzaWJsaW5nIHRoYXQgbWVyZWx5IGhvbGRzIGEgcmVmZXJlbmNlLlxuICAgICAqXG4gICAgICogVEhJUyBVU0VEIFRPIENPTVBBUkUgQUdBSU5TVCBgd2luZG93LnBhcmVudGAgQUxPTkUsIGFuZCB0aGF0IHdhcyBhIHJlZ3Jlc3Npb24gSVxuICAgICAqIHNoaXBwZWQgaW4gMC40LjAtYmV0YTogaXQgc2lsZW50bHkgZHJvcHBlZCB0aGUgaG9zdCdzIEluaXRNZXNzYWdlIGZvciBhbnkgY29tcG9uZW50XG4gICAgICogbW91bnRlZCBjcm9zcy1kb2N1bWVudCwgYmVjYXVzZSB0aGUgaG9zdCBpcyBhIGdyYW5kcGFyZW50IHRoZXJlLiBUaGUgZnJhbWUgdGhlblxuICAgICAqIGFubm91bmNlZCBmb3IgaXRzIGZ1bGwgMTBzIGJ1ZGdldCBpbnRvIGEgcGFyZW50IHRoYXQgbmV2ZXIgYW5zd2VycyBhbmQgcmVqZWN0ZWQgd2l0aFxuICAgICAqIHRpbWVvdXRfMTAwMDAgaGF2aW5nIHJlZ2lzdGVyZWQgbm90aGluZy4gUmVwcm9kdWNlZCBsaXZlIG9uIFBpYy1UaW1lJ3MgUUEgcGFnZVxuICAgICAqIDIwMjYtMTAtMTc6IDE1IEluaXRSZXF1ZXN0cywgMCBJbml0UmVzcG9uc2VzLCBgSWZyYW1lU0RLLmNvbXBvbmVudHNgIGVtcHR5LlxuICAgICAqIDAuMy4zNiBoYWQgbm8gZ3VhcmQgYXQgYWxsLCB3aGljaCBpcyB3aHkgaXQgd29ya2VkLlxuICAgICAqXG4gICAgICogV2Fsa2luZyB0aGUgYW5jZXN0b3IgY2hhaW4ga2VlcHMgdGhlIHNlY3VyaXR5IHByb3BlcnR5IC0tIGFuIG9wZW5lciBvciBhIHNpYmxpbmcgaXNcbiAgICAgKiBub3QgYW4gYW5jZXN0b3IgLS0gd2hpbGUgYWxsb3dpbmcgYSBob3N0IGFueSBudW1iZXIgb2YgZnJhbWVzIHVwLiBUaGUgd2FsayBpc1xuICAgICAqIGJvdW5kZWQsIGFuZCByZWFkaW5nIGAucGFyZW50YCBhY3Jvc3Mgb3JpZ2lucyBpcyBhbGxvd2VkIChvbmx5IHRoZSByZWZlcmVuY2UgaXNcbiAgICAgKiBjb21wYXJlZCwgbmV2ZXIgdG91Y2hlZCkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc0Zyb21Ib3N0Q2hhaW4gPSAoc291cmNlOiBNZXNzYWdlRXZlbnRTb3VyY2UgfCBudWxsKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmICghc291cmNlKSByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgLy8gc3ludGhldGljIGRpc3BhdGNoIGNhcnJpZXMgbm8gc291cmNlXG4gICAgICAgIGlmIChzb3VyY2UgPT09IHdpbmRvdykgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgbGV0IGN1cnJlbnQ6IFdpbmRvdyA9IHdpbmRvdztcbiAgICAgICAgZm9yIChsZXQgZGVwdGggPSAwOyBkZXB0aCA8IDMyOyBkZXB0aCsrKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICAgICAgICAgIGlmICghcGFyZW50IHx8IHBhcmVudCA9PT0gY3VycmVudCkgcmV0dXJuIGZhbHNlOyAgIC8vIHJlYWNoZWQgdGhlIHRvcFxuICAgICAgICAgICAgaWYgKHNvdXJjZSA9PT0gcGFyZW50KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGN1cnJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0ID0gKCkgPT4ge1xuICAgICAgICB3aW5kb3cub25tZXNzYWdlID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0Zyb21Ib3N0Q2hhaW4oZXZlbnQuc291cmNlKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBBRE9QVCBPTkxZIE9OIEluaXRNZXNzYWdlLCBOT1QgT04gQU5ZIEFOQ0VTVE9SIE1FU1NBR0UuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gSW5pdE1lc3NhZ2UgaXMgdGhlIG9uZSBtZXNzYWdlIHRoYXQgZXN0YWJsaXNoZXMgd2hvIG93bnMgdGhpcyBjb21wb25lbnQsIHNvXG4gICAgICAgICAgICAvLyBpdCBpcyB0aGUgb25seSBzYWZlIHNpZ25hbC4gQWRvcHRpbmcgb24gYW55IGFjY2VwdGVkIG1lc3NhZ2UgbGV0IGFuXG4gICAgICAgICAgICAvLyBpbnRlcm1lZGlhdGUgYW5jZXN0b3IgLS0gdGhlIHJlZWwgZGlhbG9nLCB3aGljaCBpcyBpdHNlbGYgYSBjb21wb25lbnQgYW5kXG4gICAgICAgICAgICAvLyBtYXkgbGVnaXRpbWF0ZWx5IHBvc3QgdG8gaXRzIG93biBzdWJ0cmVlIC0tIGJlY29tZSBgaG9zdFdpbmRvd2AgYW5kIHNpbGVudGx5XG4gICAgICAgICAgICAvLyB0YWtlIG92ZXIgdGhlIHJlcGx5IGNoYW5uZWwsIHB1dHRpbmcgdXMgYmFjayB0byBJbml0UmVzcG9uc2VzIGdvaW5nIHRvIGFcbiAgICAgICAgICAgIC8vIGZyYW1lIHRoYXQgZHJvcHMgdGhlbS5cbiAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2VcbiAgICAgICAgICAgICAgICAmJiBldmVudC5zb3VyY2UgIT09IHdpbmRvd1xuICAgICAgICAgICAgICAgICYmIGV2ZW50LmRhdGE/Lm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3RXaW5kb3cgPSBldmVudC5zb3VyY2UgYXMgV2luZG93O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXF1ZXN0KCkpO1xuICAgIH1cblxufVxuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdJZnJhbWVTREsnLCBJZnJhbWVTREspO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCTyxJQUFNLGlCQUFOLE1BQTRDO0FBQUEsRUFDL0MsWUFBbUIsUUFDQSxhQUNBLGNBQ0EsV0FDQSxZQUFxQjtBQUpyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSW5CLHdCQUFnQixRQUFlO0FBQUEsRUFGL0I7QUFHSjs7O0FDekJPLElBQU0scUJBQXFCLENBQU8sU0FBa0M7QUFDdkUsTUFBSSxPQUFPLFNBQVMsWUFBWTtBQUU1QixTQUFLO0FBQUEsRUFDVCxXQUFXLGdCQUFnQixTQUFTO0FBRWhDLFVBQU0sU0FBUyxNQUFNO0FBRXJCLFFBQUksT0FBTyxXQUFXLFlBQVk7QUFFOUIsYUFBTztBQUFBLElBQ1g7QUFBQSxFQUNKO0FBRUo7QUFZTyxJQUFlLHFCQUFmLE1BQWlHO0FBQUE7QUFBQSxFQUlwRyxZQUFtQixlQUFxRjtBQUFyRjtBQUFBLEVBRW5CO0FBSUo7QUFFTyxJQUFlLDRCQUFmLGNBQTJGLG1CQUFzQjtBQUFBLEVBQ3BILFlBQW1CLGVBQTRGLFNBQWE7QUFDeEgsVUFBTSxhQUFhO0FBREo7QUFBNEY7QUFBQSxFQUUvRztBQUNKOzs7QUM1Q08sSUFBTSxlQUFlO0FBQUE7QUFBQSxFQUV4QixlQUFlO0FBQUEsRUFDZixnQkFBZ0I7QUFBQSxFQUNoQixlQUFlO0FBQUEsRUFDZixrQkFBa0I7QUFBQSxFQUVsQixxQkFBcUI7QUFBQSxFQUNyQixvQkFB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WUFBWSxDQUFDLFVBQXdCO0FBeEtwRDtBQXlLWSxZQUFJLENBQUMsS0FBSyxnQkFBZ0IsTUFBTSxNQUFNLEVBQUc7QUFVekMsWUFBSSxNQUFNLFVBQ0gsTUFBTSxXQUFXLFlBQ2pCLFdBQU0sU0FBTixtQkFBWSxpQkFBZ0IsYUFBYSxhQUFhO0FBQ3pELGVBQUssYUFBYSxNQUFNO0FBQUEsUUFDNUI7QUFFQSxhQUFLLHFCQUFxQixLQUFLO0FBQUEsTUFDbkM7QUFDQSxXQUFLLGNBQWMsSUFBSSxZQUFZLENBQUM7QUFBQSxJQUN4QztBQXhISSxRQUFJLENBQUMsT0FBTyxNQUFNO0FBRWQsYUFBTyxPQUFPLENBQUM7QUFBQSxJQUNuQjtBQUVBLFdBQU8sS0FBSyxZQUFZO0FBQUEsRUFDNUI7QUFvSEo7QUFFQSxvQkFBb0IsYUFBYSxTQUFTOyIsCiAgIm5hbWVzIjogWyJSZXBsYXlNZXNzYWdlS2V5IiwgIm1hdGNoIiwgInNjcmlwdElucHV0cyIsICJzY3JpcHRJbnB1dHMiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAic2VlbiIsICJ0YXJnZXQiLCAibWFrZVNlcmlhbGl6YWJsZSIsICJoZWlnaHQiLCAid2lkdGgiLCAiZSIsICJCaW5kT25DbGlja0hhbmRsZXIiLCAiQ2hhbmdlVGV4dEhhbmRsZXIiLCAiRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJzZXRBdHRyaWJ1dGVIYW5kbGVyIiwgIkFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgImhvc3RTREsiLCAiRXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiZWxlbWVudCIsICJDaGFuZ2VUZXh0SGFuZGxlciIsICJCaW5kT25DbGlja0hhbmRsZXIiLCAiRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJzZXRBdHRyaWJ1dGVIYW5kbGVyIiwgIkFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgIkV4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgInNlZW4iLCAic2RrIiwgImRvbUlkIiwgInNkayIsICJzZWVuIiwgInNraW4iLCAiY29tcG9uZW50IiwgIl9hIiwgInNlZ21lbnQiLCAiZXhwZXJpZW5jZSIsICJzZWxlY3RlZFNraW4iLCAiQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiLCAiaG9zdFNESyIsICJNdXRhdGlvbk9ic2VydmVyIiwgImdldElucHV0VmFsdWUiLCAiZWxlbWVudCIsICJHZXRFbGVtZW50VmFsdWVIYW5kbGVyIiwgIlNldElubmVySHRtbEhhbmRsZXIiLCAiU2V0SW5uZXJIdG1sSGFuZGxlciIsICJHZXRFbGVtZW50VmFsdWVIYW5kbGVyIiwgIkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIl0KfQo=
4662
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL015b3BNZXNzYWdlcy50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9CYXNlTXlvcFNESy50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9jb25zdHMudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvSU15b3BDb21wb25lbnQudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbG9nTWVzc2FnZXMudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wUmVmQ29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9jb21wb25lbnRDb3JlLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0lNeW9wTG9hZGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvaWZyYW1lTG9hZGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvY29uc3RzLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlci50cyIsICJ2ZXJzaW9uOm15b3Atc2RrLXZlcnNpb24iLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvZGVsaXZlcnlTdG9yZS50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9DbG91ZFJlcG9zaXRvcnkudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvY2xvdWRSZXBvc2l0b3J5SGVscGVycy50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvc2hhZG93Um9vdFJlZi50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvV2ViQ29tcG9uZW50U0RLLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlci50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9teW9wT3ZlcnJpZGUudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvaG9zdFNESy50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL3V0aWxzL2RvbU9ic2VydmVyLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL1NldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvZ2V0QXR0cmlidXRlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9TZXRSZXNpemVPYnNlcnZlckhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL0lmcmFtZVNESy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IGludGVyZmFjZSBJRWxlbWVudFJlZiB7XG4gICAgbXlvcElkPzogc3RyaW5nXG4gICAgaHRtbFRhZ05hbWU6IHN0cmluZ1xuICAgIEJvdW5kaW5nUmVjdD86IERPTVJlY3RcbiAgICBvZmZzZXRUb3A/OiBudW1iZXJcbiAgICBvZmZzZXRMZWZ0PzogbnVtYmVyXG5cbiAgICB0eXBlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFhQYXRoRWxlbWVudFJlZiBpbXBsZW1lbnRzIElFbGVtZW50UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgeFBhdGg6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgaHRtbFRhZ05hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgQm91bmRpbmdSZWN0PzogRE9NUmVjdCxcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0VG9wPzogbnVtYmVyLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRMZWZ0PzogbnVtYmVyKSB7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IHN0cmluZyA9ICdYUGF0aEVsZW1lbnRSZWYnXG59XG5cbmV4cG9ydCBjbGFzcyBNeW9wRWxlbWVudFJlZiBpbXBsZW1lbnRzIElFbGVtZW50UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbXlvcElkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIGh0bWxUYWdOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIEJvdW5kaW5nUmVjdD86IERPTVJlY3QsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldFRvcD86IG51bWJlcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0TGVmdD86IG51bWJlcikge1xuXG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IHN0cmluZyA9ICdNeW9wRWxlbWVudFJlZidcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyfSBmcm9tIFwiLi9pbmRleC50c1wiO1xuXG5leHBvcnQgdHlwZSBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCA9IENsZWFudXBIYW5kbGVyIHwgUHJvbWlzZTxDbGVhbnVwSGFuZGxlcj4gfCBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcblxuZXhwb3J0IGNvbnN0IHJ1bkV4ZWN1dG9yQ2xlYW51cCA9IGFzeW5jICh0YXNrOiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCkgPT4ge1xuICAgIGlmICh0eXBlb2YgdGFzayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBJdCdzIGEgZnVuY3Rpb24sIGNhbGwgaXRcbiAgICAgICAgdGFzaygpO1xuICAgIH0gZWxzZSBpZiAodGFzayBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgLy8gSXQncyBhIFByb21pc2UsIGF3YWl0IGl0XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhc2s7XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSByZXN1bHQgaXMgYSBmdW5jdGlvbiwgY2FsbCBpdFxuICAgICAgICAgICAgcmVzdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgdGFzayBpcyB2b2lkLCBkbyBub3RoaW5nXG59XG5cbnR5cGUgSU1lc3NhZ2VFeGVjdXRvcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPiA9IChtZXNzYWdlOiBUKSA9PiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cDtcblxuaW50ZXJmYWNlIElNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG5cbiAgICBleGVjdXRvcjogSU1lc3NhZ2VFeGVjdXRvcjxUPjtcblxuICAgIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnk+IGltcGxlbWVudHMgSU1lc3NhZ2VIYW5kbGVyPFQ+IHtcblxuICAgIC8vVE9ETyA6IGFkZCBkaXNwb3NlIG1ldGhvZFxuXG4gICAgY29uc3RydWN0b3IocHVibGljIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkKSB7XG5cbiAgICB9XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbiAgICBhYnN0cmFjdCBleGVjdXRvcjogSU1lc3NhZ2VFeGVjdXRvcjxUPjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VDb250ZXh0TWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSA9IGFueSwgRSA9IGFueT4gZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZCwgcHVibGljIGNvbnRleHQ/OiBFKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2VUb0hvc3QpO1xuICAgIH1cbn1cbiIsICJ0eXBlIFN0cmluZ1dpdGhBdXRvY29tcGxldGU8VD4gPSBUIHwgKHN0cmluZyAmIFJlY29yZDxuZXZlciwgbmV2ZXI+KTtcblxuZXhwb3J0IHR5cGUgTXlvcE1lc3NhZ2VLZXkgPSBTdHJpbmdXaXRoQXV0b2NvbXBsZXRlPGtleW9mIHR5cGVvZiBNeW9wTWVzc2FnZXMgfCBrZXlvZiB0eXBlb2YgTXlvcE1lc3NhZ2VzLkluPjtcblxuZXhwb3J0IGNvbnN0IE15b3BNZXNzYWdlcyA9IHtcbiAgICAvL2hvc3QgdG8gY29tcG9uZW50XG4gICAgJ0luaXRSZXF1ZXN0JzogJ0luaXRSZXF1ZXN0JyxcbiAgICAnSW5pdFJlc3BvbnNlJzogJ0luaXRSZXNwb25zZScsXG4gICAgJ0luaXRNZXNzYWdlJzogJ0luaXRNZXNzYWdlJyxcbiAgICAnRGlzcG9zZU1lc3NhZ2UnOiAnRGlzcG9zZU1lc3NhZ2UnLFxuXG4gICAgJ0NoYW5nZVRleHRNZXNzYWdlJzogJ0NoYW5nZVRleHRNZXNzYWdlJyxcbiAgICAnQmluZENsaWNrTWVzc2FnZSc6ICdCaW5kQ2xpY2tNZXNzYWdlJyxcbiAgICAnRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJzogJ0RldGVjdE15b3BSZWZzTWVzc2FnZScsXG5cbiAgICAnRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnOiAnRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnLFxuXG4gICAgJ0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlJzogJ0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlJyxcbiAgICAnU2V0QXR0cmlidXRlTWVzc2FnZSc6ICdTZXRBdHRyaWJ1dGVNZXNzYWdlJyxcblxuICAgICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJzogJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnLFxuICAgICdFbnZlbG9wZWRNZXNzYWdlJzogJ0VudmVsb3BlZE1lc3NhZ2UnLFxuXG4gICAgJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnOiAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZScsXG4gICAgJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnOiAnR2V0QXR0cmlidXRlTWVzc2FnZScsXG5cbiAgICAnU2V0SW5uZXJIdG1sJzogJ1NldElubmVySHRtbCcsXG5cbiAgICAvL2NvbXBvbmVudCBtZXNzYWdlc1xuICAgICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJzogJ0V4ZWN1dGVDb21wb25lbnRNZXRob2QnLFxuICAgICdTZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc6ICdTZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScsXG4gICAgJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc6ICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnLFxuXG4gICAgJ0NsZWFudXBNZXNzYWdlJzogJ0NsZWFudXBNZXNzYWdlJyxcblxuICAgIC8vIGV4dGVybmFsIHRvIGhvc3QgOlxuICAgIEluOiB7XG4gICAgICAgICdEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSc6ICdEZXRlY3RlZE15b3BSZWZzTWVzc2FnZScsXG4gICAgICAgICdDbGlja1JlcGxheU1lc3NhZ2UnOiAnQ2xpY2tSZXBsYXlNZXNzYWdlJyxcbiAgICAgICAgJ0V4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UnOiAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZScsXG5cbiAgICAgICAgJ0V2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UnOiAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZScsXG4gICAgICAgICdFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlJzogJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnLFxuXG4gICAgICAgIFwiR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZVwiOiBcIkdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2VcIixcbiAgICAgICAgJ1JlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlJzogJ1JlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlJyxcbiAgICAgICAgJ0VudmVsb3BlZE1lc3NhZ2UnOiAnRW52ZWxvcGVkTWVzc2FnZScsXG5cbiAgICAgICAgJ011dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJzogJ011dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJyxcbiAgICAgICAgJ0NsZWFudXBSZXBsYXlNZXNzYWdlJzogJ0NsZWFudXBSZXBsYXlNZXNzYWdlJyxcbiAgICAgICAgJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSc6ICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnXG4gICAgfVxufVxuIiwgImV4cG9ydCAqIGZyb20gJy4vQmFzZU1lc3NhZ2UnO1xuXG4vL3VzZXIncyBtZXNzYWdlc1xuZXhwb3J0ICogZnJvbSAnLi9CaW5kQ2xpY2tNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhbmdlVGV4dE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FeGVjdXRlU2NyaXB0TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0N1c3RvbVJlZk1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BZGRFdmVudExpc3RlbmVyTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL1NldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vU2V0SW5uZXJIdG1sJztcblxuLy9zeXN0ZW0gbWVzc2FnZXNcbmV4cG9ydCAqIGZyb20gJy4vSW5pdE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRW52ZWxvcGVkTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0RldGVjdE15b3BSZWZzTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAgJy4vR2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50TWVzc2FnZXMvRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ2xlYW51cE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9EaXNwb3NlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc7IiwgIi8vVE9ETyA6IHJldXNlIGZyb20gb25lIHBsYWNlLlxuLy8gbmVlZHMgdG8gYmUgdXNlZCBpbiBteW9wLXNkaywgbXlvcC1kYXNoYmFvcmQsIG15b3Atc2VydmVyLCBteW9wLWNsaSAuLlxuXG5leHBvcnQgY29uc3QgdXVpZHY0ID0gKCkgPT4ge1xuICAgIHJldHVybiBcIjEwMDAwMDAwLTEwMDAtNDAwMC04MDAwLTEwMDAwMDAwMDAwMFwiLnJlcGxhY2UoL1swMThdL2csIGMgPT5cbiAgICAgICAgKCtjIF4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxKSlbMF0gJiAxNSA+PiArYyAvIDQpLnRvU3RyaW5nKDE2KVxuICAgICk7XG59XG5cbi8vIENvbnZlcnQgVVVJRCBzdHJpbmcgdG8gYnl0ZXNcbmV4cG9ydCBjb25zdCB1dWlkVG9CeXRlcyA9ICh1dWlkOiBzdHJpbmcpOiBVaW50OEFycmF5ID0+IHtcbiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKFxuICAgICAgICB1dWlkLnJlcGxhY2UoLy0vZywgJycpLm1hdGNoKC8uezEsMn0vZykhLm1hcChieXRlID0+IHBhcnNlSW50KGJ5dGUsIDE2KSlcbiAgICApO1xufTtcblxuLy8gQ29udmVydCBieXRlcyB0byBVVUlEIHN0cmluZ1xuZXhwb3J0IGNvbnN0IGJ5dGVzVG9VdWlkID0gKGJ5dGVzOiBVaW50OEFycmF5KTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBoZXggPSBbLi4uYnl0ZXNdLm1hcChiID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpO1xuICAgIHJldHVybiBbXG4gICAgICAgIGhleC5zbGljZSgwLCA4KSxcbiAgICAgICAgaGV4LnNsaWNlKDgsIDEyKSxcbiAgICAgICAgaGV4LnNsaWNlKDEyLCAxNiksXG4gICAgICAgIGhleC5zbGljZSgxNiwgMjApLFxuICAgICAgICBoZXguc2xpY2UoMjApXG4gICAgXS5qb2luKCctJyk7XG59O1xuXG4vLyBCYXNlNjQgVVJMLXNhZmUgZW5jb2RlXG5leHBvcnQgY29uc3QgYmFzZTY0VXJsRW5jb2RlID0gKGJ5dGVzOiBVaW50OEFycmF5KTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBiYXNlNjQgPSBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uYnl0ZXMpKTtcbiAgICByZXR1cm4gYmFzZTY0LnJlcGxhY2UoL1xcKy9nLCAnLScpLnJlcGxhY2UoL1xcLy9nLCAnXycpLnJlcGxhY2UoLz0rJC8sICcnKTtcbn07XG5cbi8vIEJhc2U2NCBVUkwtc2FmZSBkZWNvZGVcbmV4cG9ydCBjb25zdCBiYXNlNjRVcmxEZWNvZGUgPSAoc3RyOiBzdHJpbmcpOiBVaW50OEFycmF5ID0+IHtcbiAgICBsZXQgYmFzZTY0ID0gc3RyLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJyk7XG4gICAgd2hpbGUgKGJhc2U2NC5sZW5ndGggJSA0KSBiYXNlNjQgKz0gJz0nO1xuICAgIGNvbnN0IGJpbmFyeSA9IGF0b2IoYmFzZTY0KTtcbiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKGJpbmFyeSwgY2hhciA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpO1xufTtcblxuLy8gQ29tcHJlc3MgYW4gYXJyYXkgb2YgVVVJRHMgaW50byBhIHNob3J0IFVSTC1zYWZlIHN0cmluZ1xuZXhwb3J0IGNvbnN0IGNvbXByZXNzVVVJRHMgPSAodXVpZHM6IHN0cmluZ1tdKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBhbGxCeXRlcyA9IHV1aWRzLmZsYXRNYXAodXVpZCA9PiBBcnJheS5mcm9tKHV1aWRUb0J5dGVzKHV1aWQpKSk7XG4gICAgcmV0dXJuIGJhc2U2NFVybEVuY29kZShuZXcgVWludDhBcnJheShhbGxCeXRlcykpO1xufTtcblxuLy8gRGVjb21wcmVzcyBmcm9tIFVSTC1zYWZlIHN0cmluZyBiYWNrIHRvIGFuIGFycmF5IG9mIFVVSURzXG5leHBvcnQgY29uc3QgZGVjb21wcmVzc1VVSURzID0gKGVuY29kZWQ6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgICBjb25zdCBieXRlcyA9IGJhc2U2NFVybERlY29kZShlbmNvZGVkKTtcbiAgICBpZiAoYnl0ZXMubGVuZ3RoICUgMTYgIT09IDApIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBpbnB1dCBsZW5ndGgnKTtcblxuICAgIGNvbnN0IHV1aWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDE2KSB7XG4gICAgICAgIHV1aWRzLnB1c2goYnl0ZXNUb1V1aWQoYnl0ZXMuc2xpY2UoaSwgaSArIDE2KSkpO1xuICAgIH1cbiAgICByZXR1cm4gdXVpZHM7XG59O1xuIiwgImV4cG9ydCAqIGZyb20gJy4vdXVpZC50cydcblxuZXhwb3J0IGNvbnN0IHdhaXQgPSAobXM6IG51bWJlcikgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9ob3N0XCI7XG5pbXBvcnQge0lSZWZDb25maWd9IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VEaXJlY3Rpb24ge1xuICAgIHN0YXRpYyBkb3duID0gJ2Rvd24nIGFzIGNvbnN0XG4gICAgc3RhdGljIHVwID0gJ3VwJyBhcyBjb25zdFxufVxuXG5leHBvcnQgdHlwZSBNZXNzYWdlRGlyZWN0aW9uT3B0aW9uID0gJ3VwJyB8ICdkb3duJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wTWVzc2FnZTxUID0gYW55PiB7XG4gICAgaWQgPSB1dWlkdjQoKVxuXG4gICAgc3RhdGljIGNyZWF0ZTxULCBVIGV4dGVuZHMgbmV3ICguLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VT4pID0+IFQgPSB0eXBlb2YgdGhpcz4oXG4gICAgICAgIHRoaXM6IFUsXG4gICAgICAgIC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxVPlxuICAgICk6IEluc3RhbmNlVHlwZTx0eXBlb2YgdGhpcz4ge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBuZXcgdGhpcyguLi5hcmdzKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnbWVlc2FnZSBpZCBjcmVhdGVkJywgdGhpcy5pZCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZik7XG4gICAgfVxuXG4gICAgbXlvcCA9IHRydWVcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSB8IHN0cmluZztcblxuICAgIGNvbnRlbnQ/OiBUXG5cbiAgICAvLyBUT0RPIDogY2FudCBiZSBvcHRpb25hbCBcbiAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICBkZXN0aW5hdGlvbj86IHN0cmluZ1xuXG4gICAgcm91dGU/OiBzdHJpbmdbXVxuXG4gICAgcmVmPzogUmVmXG5cbiAgICBkaXJlY3Rpb24/OiBNZXNzYWdlRGlyZWN0aW9uT3B0aW9uXG5cbiAgICBjbGVhbmFibGU6IGJvb2xlYW4gPSBmYWxzZVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BFbGVtZW50TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wQmluZE1lc3NhZ2U8VCA9IGFueSwgUiBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuXG4gICAgcHVibGljIGFic3RyYWN0IHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXk7XG5cbiAgICBwdWJsaWMgaGFuZGxlclVuaXF1ZUlkID0gdXVpZHY0KClcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBoYW5kbGVyOiAobWVzc2FnZTogUikgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVmIHtcbiAgICBwdWJsaWMgbXlvcCA9IHRydWU7XG5cbiAgICBwdWJsaWMgX19ub25Qcm94aWVkPzogUmVmO1xuXG4gICAgc3RhdGljIGNyZWF0ZShzZWxlY3Rvcjogc3RyaW5nLCByZWZDb25maWc/OiBJUmVmQ29uZmlnLCBjb21wb25lbnQ/OiBJTXlvcENvbXBvbmVudCkge1xuICAgICAgICBsZXQgX3JlZkNvbmZpZyA9IHJlZkNvbmZpZztcbiAgICAgICAgaWYgKCFfcmVmQ29uZmlnKSB7XG4gICAgICAgICAgICBfcmVmQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGlkOiAnJyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3JUeXBlOiAnaWQtYXR0cmlidXRlJyxcbiAgICAgICAgICAgICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NvZGUnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBhcyBJUmVmQ29uZmlnXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZWYoX3JlZkNvbmZpZywgY29tcG9uZW50KTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmQ29uZmlnOiBJUmVmQ29uZmlnLCBwdWJsaWMgY29tcG9uZW50PzogSU15b3BDb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5fX25vblByb3hpZWQgPSB7XG4gICAgICAgICAgICAuLi50aGlzLFxuICAgICAgICAgICAgY29tcG9uZW50OiBudWxsIC8vIGluIG9yZGVyIHRvIGJlIHNlcmlhbGl6YWJsZVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnQ2xpY2tSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQmluZENsaWNrTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTx2b2lkLCBDbGlja1JlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0JpbmRDbGlja01lc3NhZ2UnO1xuICAgIGNsZWFuYWJsZSA9IHRydWU7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIGhhbmRsZXI6IChtZXNzYWdlOiBDbGlja1JlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2xpY2tSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VUZXh0TWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxzdHJpbmc+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gJ0NoYW5nZVRleHRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY29udGVudCA9IHRleHRcbiAgICB9XG59IiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0V4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UnXG5cbmNvbnN0IGZ1bmN0aW9uQm9keVJlZ2V4ID0gLyg/OmZ1bmN0aW9uXFxzKlxcdypcXHMqXFwoW14pXSpcXClcXHMqXFx7KFtcXHNcXFNdKj8pXFx9fChcXChbXildKlxcKVxccyo9PlxccypcXHsoW1xcc1xcU10qPylcXH0pKVxccyokLztcbmNvbnN0IGV4cHJlc3Npb25Cb2R5UmVnZXggPSAvXFwoXFxzKlteKV0rXFxzKlxcKVxccyo9PlxccyooLispLztcblxuZXhwb3J0IGNvbnN0IHN0cmlwRnVuY3Rpb24gPSAoY29udGVudDogc3RyaW5nKSA9PiB7XG4gICAgbGV0IG1hdGNoID0gY29udGVudC5tYXRjaChmdW5jdGlvbkJvZHlSZWdleCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiBtYXRjaFsxXSB8fCBtYXRjaFszXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgbWF0Y2ggPSBjb250ZW50Lm1hdGNoKGV4cHJlc3Npb25Cb2R5UmVnZXgpO1xuICAgICAgICBpZiAobWF0Y2gpXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV0udHJpbSgpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgc2NyaXB0SW5wdXRzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW5cbn0gfCB7fTtcblxuZXhwb3J0IHR5cGUgc2NyaXB0VmFyczxUPiA9IHtcbiAgICBzZW5kOiAoZGF0YTogVCkgPT4gdm9pZDtcbiAgICAvLyBjb21wbGV0ZVN0cmVhbTogKCkgPT4gdm9pZDtcbiAgICByb290UmVmOiBSb290UmVmO1xuICAgIG1ha2VTZXJpYWxpemFibGU6IHR5cGVvZiBtYWtlU2VyaWFsaXphYmxlXG59XG5cbmV4cG9ydCB0eXBlIGV4dGVuZGVkU2NyaXB0VmFyczxULCBJPiA9IHtcbiAgICBbSyBpbiBrZXlvZiBJXTogSVtLXTtcbn0gJiBzY3JpcHRWYXJzPFQ+XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0TWVzc2FnZTxUID0gYW55LCBJIGV4dGVuZHMgc2NyaXB0SW5wdXRzID0gYW55PiBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTxzdHJpbmcsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4+IHtcblxuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5O1xuICAgIG1lc3NhZ2VUeXBlID0gJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJztcbiAgICBzY3JpcHQ6IHN0cmluZyA9ICcnXG5cbiAgICBzdGF0aWMgcmVwbGllcktleSA9ICdzZW5kJztcbiAgICBzdGF0aWMgY29tcGxldGVTdHJlYW1LZXkgPSAnY29tcGxldGVTdHJlYW0nO1xuXG4gICAgY29uc3RydWN0b3Ioc2NyaXB0OiAodmFyczogZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEk+KSA9PiBULCBoYW5kbGVyOiAobWVzc2FnZTogRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPikgPT4gdm9pZCA9ICgpID0+IHtcbiAgICB9LCBwdWJsaWMgc2NyaXB0SW5wdXRzPzogSSkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICAgICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQudG9TdHJpbmcoKTtcblxuICAgICAgICAvL1RPRE86IGNhbiBiZSByZW1vdmVcbiAgICAgICAgdGhpcy5jb250ZW50ID0gc2NyaXB0LnRvU3RyaW5nKClcbiAgICAgICAgdGhpcy5jb250ZW50ID0gc3RyaXBGdW5jdGlvbih0aGlzLmNvbnRlbnQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8VD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBwdWJsaWMgY29udGVudDogVCkge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge1xuICAgIEV4ZWN1dGVTY3JpcHRNZXNzYWdlLFxuICAgIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UsXG4gICAgZXh0ZW5kZWRTY3JpcHRWYXJzLFxuICAgIHNjcmlwdElucHV0cywgc3RyaXBGdW5jdGlvblxufSBmcm9tIFwiLi9FeGVjdXRlU2NyaXB0TWVzc2FnZS50c1wiO1xuXG5leHBvcnQgdHlwZSBjdXN0b21SZWZTY3JpcHRJbnB1dHMgPSB7XG4gICAgZWxlbWVudElkOiBzdHJpbmcsXG4gICAgcmVmPzogSFRNTEVsZW1lbnQsXG4gICAgX3NjcmlwdD86IHN0cmluZyxcbiAgICBfX3NjcmlwdElucHV0cz86IE9iamVjdFxufTtcblxuZXhwb3J0IGNsYXNzIEN1c3RvbVJlZk1lc3NhZ2U8VCA9IGFueSwgSSBleHRlbmRzIHNjcmlwdElucHV0cyA9IGN1c3RvbVJlZlNjcmlwdElucHV0cz4gZXh0ZW5kcyBFeGVjdXRlU2NyaXB0TWVzc2FnZTxULCBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzPiB7XG5cbiAgICBjb25zdHJ1Y3RvcihzY3JpcHQ6ICh2YXJzOiBleHRlbmRlZFNjcmlwdFZhcnM8VCwgSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cz4pID0+IFQsXG4gICAgICAgICAgICAgICAgcHVibGljIHNjcmlwdElucHV0czogSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cyxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPikgPT4gdm9pZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB9KSB7XG5cbiAgICAgICAgLy9tb2NrIHZhcnNcbiAgICAgICAgLy8gbGV0IHJvb3RSZWYsIGVsZW1lbnRJZCwgX3NjcmlwdCwgX19zY3JpcHRJbnB1dHM7XG4gICAgICAgIHN1cGVyKCh7cm9vdFJlZiwgZWxlbWVudElkLCBfc2NyaXB0LCBfX3NjcmlwdElucHV0c30pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlZnMgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IHJvb3RSZWYuY29udGFpbmVyKS5xdWVyeVNlbGVjdG9yQWxsKGBbJHsnbXlvcC1pZCd9PScke2VsZW1lbnRJZH0nXWApO1xuICAgICAgICAgICAgaWYgKHJlZnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gIGNvbnN0IHJlZiA9IHJlZnNbMF07XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiB0aGluayBhYm91dCBleHBvc2luZyBcInJlZnNcIiBhbmQgbm90IG9ubHkgXCJyZWZcIlxuICAgICAgICAgICAgICAgIC8vZm9yIGNhc2VzIHdoZXJlIHRoZSBSZWYgaGFzIG11bHRpcGxhdGUgaW1wbGVtZW50YXRpb25zXG5cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgX19zY3JpcHRJbnB1dHMucmVmID0gcmVmc1swXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICgke19zY3JpcHR9KSguLi5hcmd1bWVudHMpYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWNGdW5jdGlvbihfX3NjcmlwdElucHV0cyk7XG5cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gRnVuY3Rpb24oJ3JlZicsICdyb290UmVmJywgLi4uT2JqZWN0LmtleXMoX19zY3JpcHRJbnB1dHMpLCBfc2NyaXB0ISkocmVmLCByb290UmVmLCAuLi5PYmplY3QudmFsdWVzKF9fc2NyaXB0SW5wdXRzKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsIGFzIFQ7XG4gICAgICAgIH0sIGhhbmRsZXIpO1xuXG4gICAgICAgIHRoaXMuc2NyaXB0SW5wdXRzID0ge1xuICAgICAgICAgICAgLi4uc2NyaXB0SW5wdXRzLFxuICAgICAgICAgICAgLy9fc2NyaXB0OiBzdHJpcEZ1bmN0aW9uKHNjcmlwdC50b1N0cmluZygpKSxcbiAgICAgICAgICAgIF9zY3JpcHQ6IHNjcmlwdC50b1N0cmluZygpXG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NlcmlhbGl6YWJsZSwgU2VyaWFsaXphYmxlU2tlbGV0b259IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0V2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBBZGRFdmVudExpc3RlbmVyTWVzc2FnZTxUIGV4dGVuZHMga2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCA9IGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXA+IGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlIHtcblxuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5O1xuICAgIG1lc3NhZ2VUeXBlID0gJ0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlJztcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuICAgIHNlcmlhbGl6YWJsZVNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxIVE1MRWxlbWVudEV2ZW50TWFwW1RdPiA9IGZhbHNlIC8vIHt9IC8vIGVtcHR5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHB1YmxpYyB0eXBlOiBULCBwdWJsaWMgaGFuZGxlcjogKG1lc3NhZ2U6IEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcilcbiAgICB9XG5cbiAgICB3aXRoU2VyaWFsaXphYmxlU2tlbGV0b24oc2VyaWFsaXphYmxlU2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPEhUTUxFbGVtZW50RXZlbnRNYXBbVF0+KSB7XG4gICAgICAgIHRoaXMuc2VyaWFsaXphYmxlU2tlbGV0b24gPSBzZXJpYWxpemFibGVTa2VsZXRvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBwdWJsaWMgZTogU2VyaWFsaXphYmxlPEV2ZW50Pikge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSB7XG4gICAgICAgICAgICBlXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIFJlZix9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cblxuZXhwb3J0IGNsYXNzIFNldEF0dHJpYnV0ZU1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyB2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgR2V0RWxlbWVudFZhbHVlTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTx2b2lkLCBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaGFuZGxlcjogKG1lc3NhZ2U6IEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBGb3JtRGF0YUVudHJ5ID0ge1xuICAgIGlkPzogc3RyaW5nLFxuICAgIG5hbWU/OiBzdHJpbmcsXG4gICAgdmFsdWU/OiBJbnB1dEVsZW1lbnRWYWx1ZSxcbiAgICByZXF1aXJlZD86IGJvb2xlYW4sXG4gICAgdmFsaWRpdHk/OiBTZXJpYWxpemFibGU8VmFsaWRpdHlTdGF0ZT4sXG4gICAgbXlvcElkPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIElucHV0RWxlbWVudEZvcm1WYWx1ZSA9IHtcbiAgICBmb3JtRGF0YT86IHsgW2tleTogc3RyaW5nXTogRm9ybURhdGFFbnRyeSB9XG4gICAgdW5tYXBwZWREYXRhPzogRm9ybURhdGFFbnRyeVtdXG59O1xuXG5leHBvcnQgdHlwZSBJbnB1dEVsZW1lbnRWYWx1ZSA9IHN0cmluZyB8IElucHV0RWxlbWVudEZvcm1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWRcblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRlbnQ6IElucHV0RWxlbWVudFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2UudHNcIjtcblxuZXhwb3J0IGNsYXNzIFNldElubmVySHRtbCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxzdHJpbmc+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gJ1NldElubmVySHRtbCc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIGlubmVySHRtbDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY29udGVudCA9IGlubmVySHRtbFxuICAgIH1cbn0iLCAiaW1wb3J0IHsgQmFzZU15b3BNZXNzYWdlIH0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuLy8gc2VudCBieSBob3N0IHRvIGNvbXBvbmVudHMsIGNvbnRhaW5zIHRoaWVyIGlkIFxuZXhwb3J0IGNsYXNzIEluaXRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHsgaWQ6IHN0cmluZyB9PiB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpXG4gICAgICAgIHRoaXMuY29udGVudCA9IHsgaWQgfVxuICAgIH1cblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtc2cubWVzc2FnZVR5cGUgPT09IHRoaXMubWVzc2FnZVR5cGVcbiAgICB9XG59XG5cbi8vIGNvbXBvbmVudCBub3RpZnkgaG9zdCB0aGUgaXQgd2FzIGluaXRhdGVkIFxuZXhwb3J0IGNsYXNzIEluaXRSZXNwb25zZSBleHRlbmRzIEluaXRNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdJbml0UmVzcG9uc2UnO1xufVxuXG4vLyBjb21wb25lbnQgYXNrIHRvIGhvc3QgdG8gZ2V0IGluaXRhdGVkIFxuZXhwb3J0IGNsYXNzIEluaXRSZXF1ZXN0IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdJbml0UmVxdWVzdCc7XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0lDb21wb25lbnRDb25maWcsIElSZWZDb25maWd9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3QvaG9zdFNESy50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ1JlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTx2b2lkLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmQ29uZmlnOiBJUmVmQ29uZmlnLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBuZXN0ZWRDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICAgICAgcHVibGljIG9wdGlvbnM6IGxvYWRlck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKSA9PiB2b2lkLFxuICAgICkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcblxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgTmVzdGVkUmVmID0ge1xuICAgIHJlZk5hbWU6IHN0cmluZyxcbiAgICBjb21wb25lbnREZWZpbml0aW9uSWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBwdWJsaWMgbmVzdGVkUmVmczogTmVzdGVkUmVmW10sIHB1YmxpYyBmYWlsZWQ/OiBib29sZWFuKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgRW52ZWxvcGVkTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRW52ZWxvcGVkTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZGVzdGluYXRpb246IHN0cmluZywgcHVibGljIG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGNvbnN0IGlubmVyRW52ZWxvcGVkTWVzc2FnZSA9IChtZXNzYWdlIGFzIEVudmVsb3BlZE1lc3NhZ2UpO1xuICAgICAgICB0aGlzLnJvdXRlID0gW2Rlc3RpbmF0aW9uLCAuLi5pbm5lckVudmVsb3BlZE1lc3NhZ2Uucm91dGUgPyBpbm5lckVudmVsb3BlZE1lc3NhZ2Uucm91dGUgOiBbXV07XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7SUVsZW1lbnRSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIERldGVjdE15b3BSZWZzTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTxhbnksIERldGVjdGVkTXlvcFJlZnNNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJ1xuICAgIHJlcGx5TWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG59XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxJRWxlbWVudFJlZltdPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIG15b3BFbGVtZW50UmVmczogSUVsZW1lbnRSZWZbXSkge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpXG4gICAgICAgIHRoaXMuY29udGVudCA9IG15b3BFbGVtZW50UmVmcztcbiAgICB9XG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZTxhbnk+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtc2cubWVzc2FnZVR5cGUgPT09IHRoaXMubWVzc2FnZVR5cGVcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgR2V0QXR0cmlidXRlTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTx2b2lkLCBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdHZXRBdHRyaWJ1dGVNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIG5hbWU6IHN0cmluZywgaGFuZGxlcjogKG1lc3NhZ2U6IEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGVudDogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbnR5cGUgTWV0aG9kTmFtZXM8VD4gPSB7XG4gICAgLy8gW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IEsgOiBuZXZlcjtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICgpID0+IHZvaWQgPyBLIDogbmV2ZXI7XG59W2tleW9mIFRdO1xuXG4vLyBEZWZpbmUgYSB0eXBlIHRoYXQgYWxsb3dzIG9ubHkgc3RyaW5ncyBjb3JyZXNwb25kaW5nIHRvIHRoZSBtZXRob2QgbmFtZXMgb2YgVFxudHlwZSBNZXRob2RTdHJpbmc8VD4gPSBNZXRob2ROYW1lczxUPiBleHRlbmRzIGluZmVyIE0gPyBNIGV4dGVuZHMgc3RyaW5nID8gTSA6IG5ldmVyIDogbmV2ZXI7XG5cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0V4ZWN1dGVDb21wb25lbnRNZXRob2QnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIG1ldGhvZDogTWV0aG9kU3RyaW5nPElNeW9wQ29tcG9uZW50Pikge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnO1xufVxuXG5leHBvcnQgY2xhc3MgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ011dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbn0iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBDbGVhbnVwTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTx2b2lkLCBDbGVhbnVwUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnQ2xlYW51cE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNsZWFudXBGb3JNZXNzYWdlSWQ6IHN0cmluZywgaGFuZGxlcjogKG1lc3NhZ2U6IENsZWFudXBSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsZWFudXBSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjdXN0b21DbGVhbnVwOiBib29sZWFuKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgRGlzcG9zZU1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0Rpc3Bvc2VNZXNzYWdlJztcbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIGNsZWFuYWJsZSA9IHRydWU7XG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJztcbn1cblxuZXhwb3J0IGNsYXNzIFJlc2l6ZU9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJztcbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgcnVuRXhlY3V0b3JDbGVhbnVwfSBmcm9tIFwiLi9pbmRleC50c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL2Jhc2VNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsIENsZWFudXBNZXNzYWdlLCBDbGVhbnVwUmVwbGF5TWVzc2FnZSwgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgRW52ZWxvcGVkTWVzc2FnZSxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVzcG9uc2UsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgSG9zdGVkQ29tcG9uZW50PFQgPSBhbnk+IHtcbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgIH1cblxuICAgIC8vb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IElNeW9wTWVzc2FnZSkgPT4gdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBpZDogc3RyaW5nLCBwdWJsaWMgY29udGV4dD86IFQpIHtcblxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcFNESyB7XG4gICAgaW5pdDogKCkgPT4gdm9pZDtcblxuICAgIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkXG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW107XG5cbiAgICBoYW5kbGVJbmNvbWVNZXNzYWdlczogKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4gdm9pZFxuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50Pjtcbn1cblxuLy8gY29uc3QgbG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzID0gW1xuLy8gICAgIE15b3BNZXNzYWdlcy5Jbml0UmVxdWVzdCxcbi8vICAgICBNeW9wTWVzc2FnZXMuSW5pdFJlc3BvbnNlLFxuLy8gICAgIC8vTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UsXG4vLyBdXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcFNESyBpbXBsZW1lbnRzIElNeW9wU0RLIHtcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdO1xuXG4gICAgbWVzc2FnZVRvSGFuZGxlQWZ0ZXJJbml0OiBCYXNlTXlvcE1lc3NhZ2VbXSA9IFtdO1xuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PiA9IHt9O1xuXG4gICAgYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBtZXNzYWdlQ2xlYW51cENhY2hlOiBSZWNvcmQ8c3RyaW5nLCBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+PiB8IFByb21pc2U8dm9pZD4gPSB7fTtcblxuICAgIGhhbmRsZUluY29tZU1lc3NhZ2VzKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gZXZlbnQuZGF0YSA/IGV2ZW50LmRhdGEgOiBldmVudC5kZXRhaWw7XG5cbiAgICAgICAgaWYgKCFldmVudENvbnRlbnQgfHwgIWV2ZW50Q29udGVudC5teW9wKSB7XG4gICAgICAgICAgICAvLyBub3QgbXlvcCBtYXJrZWQgZXZlbnQgXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGV2ZW50Q29udGVudCBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLmRpcmVjdGlvbiAhPT0gTWVzc2FnZURpcmVjdGlvbi5kb3duKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbWVzc2FnZSBkcm9wcGVkIGluIGJhc2VTREssIGRpcmVjdGlvbiB3YXMgJywgZXZlbnQuZGF0YS5kaXJlY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiAobG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzLmluY2x1ZGVzKG1lc3NhZ2UubWVzc2FnZVR5cGUpKSB7XG4gICAgICAgICAgICAvLyAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyAgICAgLy9UT0RPIDogZml4IGRpcmVjdGlvbiA/IG1lc3NhZ2Ugd2lsbCBub3QgcHJvY2Nlc3Mgb3RoZXJ3aXNlXG4gICAgICAgICAgICAvLyAgICAgd2luZG93Lm15b3AuaG9zdFNESy5zZW5kKG1lc3NhZ2UpXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkRpc3Bvc2VNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNob3VsZCBub3QgYmUgb3B0aW9uYWwsIGZpeCBhbmQgcmVtb3ZlICdpZidcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5kZXN0aW5hdGlvbilcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uXVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gV2UgZ290IG91ciBpZCBmcm9tIG91ciBob3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogU0RLIG1heSBzZXJ2ZSBtb3JlIHRoYW4gMSBjb21wb25lbnQgLi4gdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb21wb25lbnRJZCA9IChtZXNzYWdlIGFzIEluaXRNZXNzYWdlKS5jb250ZW50LmlkO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgRXJyb3IoXCJyZWNoaXZlZCBpbml0IG1lc3NhZ2UgZm9yIGFuIGV4c2lzaW5nIGNvbXBvbmVudC5cIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0gPSBuZXcgSG9zdGVkQ29tcG9uZW50KG5ld0NvbXBvbmVudElkKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlc3BvbnNlKG5ld0NvbXBvbmVudElkKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogaXMgaXQgdHJ1ZSB0byBub3QgcGFzcyBmdXJ0aGVyICggdG8gdGhlIGNvbXBvbmVudCApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBmb3Igc2FtZSBIb3N0U0RLIGNhc2VzXG4gICAgICAgICAgICAvLyB3aGVuIGJvdGggUmVmQ29tcG9uZW50IGFuZCByZWFsQ29tcG9uZW50IGhvc3RlZCBpbiB0aGUgc2FtZSBIb3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnZlbG9wZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXJNZXNzYWdlID0gZW52ZWxvcGVkTWVzc2FnZS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBpbm5lck1lc3NhZ2U7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0IHx8IHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uIV0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkNvbXBvbmVudCA9IG15b3AuaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBpbm5lck1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdGluYXRpb25Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQ29tcG9uZW50LnNlbmQoaW5uZXJNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQgPSBteW9wLmhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gZW52ZWxvcGVkTWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQuc2VuZChpbm5lck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2Upe1xuICAgICAgICAgICAgLy8gICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG4gICAgICAgICAgICAvLyAvLyAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNsZWFudXBNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ2xlYW51cE1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbdHlwZWRNZXNzYWdlLmNsZWFudXBGb3JNZXNzYWdlSWRdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXBNZXNzYWdlID0gbmV3IENsZWFudXBSZXBsYXlNZXNzYWdlKCEhY2xlYW51cCk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXBNZXNzYWdlLmRlc3RpbmF0aW9uID0gbWVzc2FnZS5kZXN0aW5hdGlvbjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoISFjbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW3R5cGVkTWVzc2FnZS5jbGVhbnVwRm9yTWVzc2FnZUlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkV4ZWN1dG9yQ2xlYW51cChjbGVhbnVwKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QoY2xlYW51cE1lc3NhZ2UsIHR5cGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogaGFuZGVsIGVycm9yP1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChjbGVhbnVwTWVzc2FnZSwgdHlwZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGFjdGlvbkhhbmRsZXJGb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zdXBwb3J0ZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlci5tZXNzYWdlVHlwZSA9PT0gbWVzc2FnZS5tZXNzYWdlVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uSGFuZGxlckZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSBoYW5kbGVyLmV4ZWN1dG9yKG1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUgJiYgY2xlYW51cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVttZXNzYWdlLmlkXSA9IGNsZWFudXA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhbnVwICYmICFtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2xlYW51cCBoYW5kbGVyIGdlbmVyYXRlZCBmb3Igbm9uLWNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjbGVhbnVwICYmIG1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjbGVhbnVwIGhhbmRsZXIgZ2VuZXJhdGVkIGZvciBhIGNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbkhhbmRsZXJGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBwcmludCB3aXRoIGRlYnVnIGNvbmZpZyBvbmx5XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25vIG1lc3NhZ2UgaGFuZGxlciB3YXMgZm91bmQgZm9yICcsIG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndW5zdXBwb3J0ZWQgbWVzc2FnZSB0eXBlJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFic3RyYWN0IGluaXQ6ICgpID0+IHZvaWQ7XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCAqIGZyb20gJy4vTXlvcEVsZW1lbnRSZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9iYXNlTWVzc2FnZUhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9CYXNlTXlvcFNESyc7XG5cbmV4cG9ydCB0eXBlIENsZWFudXBIYW5kbGVyID0gKCkgPT4gdm9pZFxuXG5leHBvcnQgdHlwZSBEaWN0aW9uYXJ5PFQ+ID0geyBba2V5OiBzdHJpbmddOiBUOyB9O1xuXG4vL2V4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0gJ0lmcmFtZUxvYWRlcicgfCAnV2ViQ29tcG9uZW50TG9hZGVyJyB8ICdIVE1MTG9hZGVyJyB8IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IFNraW5Mb2FkZXJzID0ge1xuICAgIFwiSWZyYW1lTG9hZGVyXCI6IFwiSWZyYW1lTG9hZGVyXCIsXG4gICAgXCJXZWJDb21wb25lbnRMb2FkZXJcIjogXCJXZWJDb21wb25lbnRMb2FkZXJcIixcbiAgICBcIkhUTUxMb2FkZXJcIjogXCJIVE1MTG9hZGVyXCIsXG4gICAgXCJNaW5pbWl6ZWRMb2FkZXJcIjogXCJNaW5pbWl6ZWRMb2FkZXJcIlxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0ga2V5b2YgdHlwZW9mIFNraW5Mb2FkZXJzO1xuXG5leHBvcnQgdHlwZSBQcm9wVHlwZSA9ICdhbnknIHwgJ3N0cmluZycgfCAnbnVtYmVyJyB8IHN0cmluZzsgLy8gVE9ETyA6IDxcbmV4cG9ydCB0eXBlIFJlZlNlbGVjdG9yVHlwZSA9ICdpZC1hdHRyaWJ1dGUnIHwgJ2Nzcy1zZWxlY3RvcicgfCAneHBhdGgnIHwgc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgTG9hZGVyRnJhbWV3b3JrcyA9IHtcbiAgICBcInJlYWN0XCI6IFwicmVhY3RcIixcbiAgICBcInZ1ZVwiOiBcInZ1ZVwiLFxuICAgIFwiYW5ndWxhclwiOiBcImFuZ3VsYXJcIixcbn0gYXMgY29uc3RcbmV4cG9ydCB0eXBlIExvYWRlckZyYW1ld29ya1R5cGUgPSBrZXlvZiB0eXBlb2YgTG9hZGVyRnJhbWV3b3JrcztcblxuZXhwb3J0IGludGVyZmFjZSBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiV2ViQ29tcG9uZW50TG9hZGVyXCI7XG4gICAgdXJsOiBzdHJpbmcsXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgZnJhbWV3b3JrPzogTG9hZGVyRnJhbWV3b3JrVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElJZnJhbWVMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJJZnJhbWVMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZ1xuICAgIGF1dG9IZWlnaHQ6IGJvb2xlYW5cbiAgICBoZWlnaHQ/OiBzdHJpbmdcbiAgICB3aWR0aD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgU2hhZG93Um9vdE1vZGVUeXBlID0ge1xuICAgIFwib3BlblwiOiBcIm9wZW5cIixcbiAgICBcImNsb3NlZFwiOiBcImNsb3NlZFwiLFxuICAgIFwibm9uZVwiOiBcIm5vbmVcIixcbiAgICBcImxvY2FsRnJhbWVcIjogXCJsb2NhbEZyYW1lXCJcbn0gYXMgY29uc3Q7XG5cblxuZXhwb3J0IGludGVyZmFjZSBJSFRNTExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIkhUTUxMb2FkZXJcIjtcbiAgICBIVE1MOiBzdHJpbmc7XG4gICAgLy9UT0RPOiByZW5hbWUocm9vdE1vZGUvY3VzdG9tRWxlbWVudE1vZGUpICsgZGIgbWlncmF0aW9uXG4gICAgc2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlO1xuICAgIGF1dG9IZWlnaHQ/OiBib29sZWFuO1xuICAgIGhlaWdodD86IHN0cmluZztcbiAgICB3aWR0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIGFuIGlubGluZS1IVE1MIChsb2NhbEZyYW1lKSBjb21wb25lbnQgaXMgcmVuZGVyZWQgaW4gYSBzYW5kYm94ZWQsXG4gICAgICogY3Jvc3Mtb3JpZ2luIGlmcmFtZSB3aXRoIE5PIGFjY2VzcyB0byB0aGUgaG9zdCBkb2N1bWVudCAodW50cnVzdGVkIGNvZGUpLlxuICAgICAqIFRoZSBob3N0IHJlbmRlciBwb2xpY3kgY2FuIGFsc28gZm9yY2UgdGhpcyByZWdhcmRsZXNzIG9mIHRoZSBjb25maWcgdmFsdWUuXG4gICAgICovXG4gICAgaXNvbGF0aW9uPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBIb3cgYSBjb21wb25lbnQgaXMgcmVuZGVyZWQgb24gdGhlIGhvc3QgcGFnZSwgaW4gYXNjZW5kaW5nIGlzb2xhdGlvbjpcbiAqICAtICd3ZWJDb21wb25lbnQnICAgXHUyMDE0IGN1c3RvbSBlbGVtZW50IG9uIHRoZSBob3N0IGRvY3VtZW50IChtb3N0IHByaXZpbGVnZWQpXG4gKiAgLSAnaWZyYW1lJyAgICAgICAgIFx1MjAxNCBzYW1lLW9yaWdpbiBpbmxpbmUtSFRNTCBpZnJhbWUgKHRvZGF5J3MgZGVmYXVsdClcbiAqICAtICdpc29sYXRlZElmcmFtZScgXHUyMDE0IHNhbmRib3hlZCwgY3Jvc3Mtb3JpZ2luIGlmcmFtZSAodW50cnVzdGVkIGNvZGUpXG4gKi9cbmV4cG9ydCB0eXBlIFJlbmRlck1vZGUgPSAnd2ViQ29tcG9uZW50JyB8ICdpZnJhbWUnIHwgJ2lzb2xhdGVkSWZyYW1lJztcblxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJQb2xpY3lDb250ZXh0IHtcbiAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZztcbiAgICBza2luOiBJU2tpbkNvbmZpZztcbiAgICAvKiogV2hhdCB0aGUgY29tcG9uZW50IGFza2VkIGZvciAobWFya2VyIFx1MjFEMiAnd2ViQ29tcG9uZW50JywgY29uZmlnLmlzb2xhdGlvbiBcdTIxRDIgJ2lzb2xhdGVkSWZyYW1lJykuICovXG4gICAgcmVxdWVzdGVkTW9kZTogUmVuZGVyTW9kZTtcbiAgICAvKiogV2hldGhlciB0aGUgSFRNTCBjYXJyaWVzIHRoZSBgPCEtLSBteW9wLXdlYi1jb21wb25lbnQgLS0+YCBtYXJrZXIuICovXG4gICAgaXNXZWJDb21wb25lbnQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogSG9zdC1zdXBwbGllZCBnYXRlIGRlY2lkaW5nIGhvdyAob3Igd2hldGhlcikgYSBjb21wb25lbnQgcmVuZGVycy4gUmV0dXJuIGFcbiAqIFJlbmRlck1vZGUgdG8gdXNlLCBvciBgZmFsc2VgIHRvIGJsb2NrIHJlbmRlcmluZyBlbnRpcmVseS5cbiAqL1xuZXhwb3J0IHR5cGUgUmVuZGVyUG9saWN5ID1cbiAgICAoY3R4OiBSZW5kZXJQb2xpY3lDb250ZXh0KSA9PiBSZW5kZXJNb2RlIHwgZmFsc2UgfCBQcm9taXNlPFJlbmRlck1vZGUgfCBmYWxzZT47XG5cbi8vZm9yIGludGVybmFsIGRhc2hib2FyZCB1c2FnZVxuZXhwb3J0IGludGVyZmFjZSBJTWluaW1pemVkTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiTWluaW1pemVkTG9hZGVyXCI7XG59XG5cbmludGVyZmFjZSBEYXNoYm9hcmRPYmplY3Qge1xuICAgIF90ZW1wX2NsaWVudF9pZD86IHN0cmluZyxcbn1cblxudHlwZSBFeHRlbmQ8VCwgVT4gPSBUICYgVTtcblxudHlwZSBFeHRlbmRSZWN1cnNpdmVseTxULCBFPiA9IHtcbiAgICBbSyBpbiBrZXlvZiBFXTogRVtLXTtcbn0gJiB7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBvYmplY3RcbiAgICAgICAgPyBFeHRlbmRSZWN1cnNpdmVseTxUW0tdLCBFPlxuICAgICAgICA6IFRbS107XG59O1xuXG5leHBvcnQgdHlwZSBJRGFzaGJvYXJkPFQ+ID0gRXh0ZW5kUmVjdXJzaXZlbHk8VCwgRGFzaGJvYXJkT2JqZWN0PjtcblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogU2tpbkxvYWRlclR5cGVcblxuICAgIFtrZXk6IHN0cmluZ106IGFueTsgLy8gQWxsb3dzIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JUmVsZWFzZU1ldGFkYXRhIHtcbiAgICBlbnZpcm9ubWVudElkOiBzdHJpbmc7XG4gICAgZW52aXJvbm1lbnRJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgcmVsZWFzZWRPbj86IHN0cmluZztcbiAgICByZWxlYXNlZEJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lWYXJpYW50Q29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgcmVsZWFzZXM/OiB2Ml9JUmVsZWFzZU1ldGFkYXRhW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBsb2FkZXI6IElTa2luTG9hZGVyQ29uZmlnXG4gICAgY3JlYXRlZEJ5Pzogc3RyaW5nXG4gICAgY3JlYXRlZE9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVNraW5Db25maWcgZXh0ZW5kcyBJU2tpbkNvbmZpZyB7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCaW5kTWVzc2FnZVByb3BDb25maWcgZXh0ZW5kcyBJUHJvcENvbmZpZyB7XG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbn1cblxuZXhwb3J0IGNvbnN0IFByb3BNZXNzYWdlTW9kZXMgPSB7XG4gICAgXCJpbnB1dFwiOiBcImlucHV0XCIsXG4gICAgXCJvdXRwdXRcIjogXCJvdXRwdXRcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFByb3BDb25maWdCZWhhdmlvclR5cGVzID0ge1xuICAgIFwibWVzc2FnZVwiOiBcIm1lc3NhZ2VcIixcbiAgICBcImNvZGVcIjogXCJjb2RlXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbSB7XG4gICAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29kZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJjb2RlXCJcbiAgICByZW1hcD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wTWVzc2FnZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJtZXNzYWdlXCJcbiAgICBtZXNzYWdlOiBNeW9wTWVzc2FnZUtleVxuICAgIHJlZjogc3RyaW5nLCAvL1RPRE8gbWFrZSBpdCBpZFxuICAgIHBhcmFtczogSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbVtdXG4gICAgbW9kZToga2V5b2YgdHlwZW9mIFByb3BNZXNzYWdlTW9kZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcENvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIGJlaGF2aW9yOiBJUHJvcEJlaGF2aW9yXG59XG5cblxuZXhwb3J0IGNsYXNzIFJlZkJlaGF2aW9yVHlwZSB7XG4gICAgc3RhdGljIGNvZGUgPSAnY29kZScgYXMgY29uc3RcbiAgICBzdGF0aWMgY29tcG9uZW50ID0gJ2NvbXBvbmVudCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgSVJlZkJlaGF2aW9yVHlwZSA9ICdjb2RlJyB8ICdjb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogSVJlZkJlaGF2aW9yVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvbXBvbmVudCdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIFByb3BlcnR5IGluc3RhbmNlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICovXG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb2RlUmVmQmVoYXZpb3IgZXh0ZW5kcyBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6ICdjb2RlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgc2VsZWN0b3JUeXBlOiBSZWZTZWxlY3RvclR5cGVcbiAgICBzZWxlY3Rvcjogc3RyaW5nXG4gICAgYmVoYXZpb3I6IElSZWZCZWhhdmlvclxufVxuXG4vKipcbiAqIEV4cGVyaWVuY2Ugc2VnbWVudCBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VTZWdtZW50UnVsZSB7XG4gICAgcHJvcGVydHk6IHN0cmluZztcbiAgICBvcGVyYXRvcjogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBBL0Igc3BsaXQgdmVyc2lvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlQUJTcGxpdFZlcnNpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgcGVyY2VudGFnZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4cGVyaWVuY2UgQS9CIHNwbGl0IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZUFCU3BsaXQge1xuICAgIHZlcnNpb25zOiBJRXhwZXJpZW5jZUFCU3BsaXRWZXJzaW9uW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBzZWdtZW50IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZVNlZ21lbnQge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcnVsZXM6IElFeHBlcmllbmNlU2VnbWVudFJ1bGVbXTtcbiAgICB1c2VBYjogYm9vbGVhbjtcbiAgICBjb21wb25lbnRWYXJpYW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gICAgYWJTcGxpdD86IElFeHBlcmllbmNlQUJTcGxpdDtcbiAgICBzdGlja3lQcm9wZXJ0aWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBkZWZpbml0aW9uIGNvbmZpZyAodjIpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VEZWZpbml0aW9uQ29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIC8qKiBTZWxlY3RlZCBjb21wb25lbnQgSURzICovXG4gICAgY29tcG9uZW50czogc3RyaW5nW107XG4gICAgLyoqIFNlZ21lbnQgY29uZmlndXJhdGlvbnMgKi9cbiAgICBzZWdtZW50czogSUV4cGVyaWVuY2VTZWdtZW50W107XG4gICAgLyoqIEZhbGxiYWNrIHZhcmlhbnQgcGVyIGNvbXBvbmVudCAqL1xuICAgIGZhbGxiYWNrOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIC8qKiBUYWdzICovXG4gICAgdGFnczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBvbmVudCdzIHJ1bnRpbWUgdGFnczogb25seSB0YWdzIG5hbWVkIGB1aTouLi5gIChlLmcuIGB1aTpiZXRhYCksIGFzIHNldCBpbiB0aGVcbiAgICAgKiBkYXNoYm9hcmQuIEV2ZXJ5IG90aGVyIHRhZyBzdGF5cyBwcml2YXRlIG9uIHRoZSBzZXJ2ZXIuIEVtcHR5IHdoZW4gdGhlcmUgYXJlIG5vbmUuXG4gICAgICovXG4gICAgdWlUYWdzPzogc3RyaW5nW10sXG4gICAgLy8gcHJvcHM6IFJlY29yZDxzdHJpbmcsIElQcm9wQ29uZmlnPiAvL2lkIC0gdHlwZVxuICAgIC8vIHJlZnM6IFJlY29yZDxzdHJpbmcsIElSZWZDb25maWc+LFxuICAgIC8vIHNraW5zOiBSZWNvcmQ8c3RyaW5nLCBJU2tpbkNvbmZpZz5cbiAgICBwcm9wczogSVByb3BDb25maWdbXSxcbiAgICByZWZzOiBJUmVmQ29uZmlnW10sXG4gICAgc2tpbnM6IElTa2luQ29uZmlnW10sXG4gICAgZGVmYXVsdFNraW46IG51bWJlcjtcblxuICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IHRoYXRcbiAgICAvL3Jlc29sdmVkRGVmaW5pdGlvbnM/OiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1tdXG4gICAgLy9UT0RPIDogbW92ZSB0byBiYXNlIGNsYXNzICggSVN0b3JhYmxlSXRlbSBvciBzby4uLilcblxuICAgIGNyZWF0ZWRPbj86IHN0cmluZ1xuICAgIGNyZWF0ZWRCeT86IHN0cmluZ1xuICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lNeW9wU3RvcmVkT2JqZWN0IGV4dGVuZHMgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICB1cGRhdGVkT24/OiBzdHJpbmdcbiAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRBY2Nlc3Mge1xuICAgIHZpc2liaWxpdHk6ICdwcml2YXRlJyB8ICd1bmxpc3RlZCcgfCAncHVibGljJztcbiAgICB1bmxpc3RlZD86IHtcbiAgICAgICAgc2x1Zzogc3RyaW5nO1xuICAgIH07XG4gICAgbWFya2V0cGxhY2U/OiB7XG4gICAgICAgIHN0YXR1czogJ2RyYWZ0JyB8ICdzdWJtaXR0ZWQnIHwgJ2NsYWltZWQnIHwgJ2Nsb3NlZCc7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIGNvbnRhY3RFbWFpbDogc3RyaW5nO1xuICAgICAgICBkZWFkbGluZTogc3RyaW5nO1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSUNvbXBvbmVudERlZmluaXRpb25Db25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgdmFyaWFudHNfaWRzOiBzdHJpbmdbXSxcbiAgICBEVE9zOiB2Ml9JRFRPW10sXG4gICAgdGFnczogc3RyaW5nW10sXG4gICAgYWNjZXNzPzogQ29tcG9uZW50QWNjZXNzLFxuXG4gICAgLy9cbiAgICB2YXJpYW50c19uYW1lczogc3RyaW5nW10sXG4gICAgdmFyaWFudHNfZGF0YToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGlkOiBzdHJpbmdcbiAgICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgICAgICAgdXBkYXRlZE9uPzogc3RyaW5nXG4gICAgICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xuICAgICAgICBoYXNfcmVsZWFzZXM/OiBib29sZWFuXG4gICAgfVtdLFxuXG4gICAgcHJldmlld192YXJpYW50OiB2Ml9JVmFyaWFudENvbmZpZztcbiAgICBleHRyYT86IHtcbiAgICAgICAgZmlyc3RWYXJpYW50OiB2Ml9JVmFyaWFudENvbmZpZzsgLy93aGVuIG5ldyBjb21wb25lbnQgY3JlYXRlcyBhdCB0aGUgY2xpZW50XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lEVE8gZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgZGF0YTogb2JqZWN0XG4gICAgbWV0aG9kTmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5JbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcyxcbiAgICAvL3NraW5zOiBJU2tpbkluc3RhbmNlQ29uZmlnW11cbn1cblxuZXhwb3J0IGNvbnN0IFNlZ21lbnRUeXBlID0ge1xuICAgIFwiRnVuY3Rpb25SZXN1bHRcIjogXCJGdW5jdGlvblJlc3VsdFwiLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEluc3RhbmNlIHtcbiAgICBzZWdtZW50SWQ6IHN0cmluZztcbiAgICBza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFNlZ21lbnRUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQgZXh0ZW5kcyBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTogdHlwZW9mIFNlZ21lbnRUeXBlLkZ1bmN0aW9uUmVzdWx0XG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGZ1bmN0aW9uOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IFNraW5TZWxlY3RvclR5cGVzID0ge1xuICAgIFwiU2VnbWVudGVkXCI6IFwiU2VnbWVudGVkXCIsXG4gICAgXCJEZWRpY2F0ZWRcIjogXCJEZWRpY2F0ZWRcIixcblxuICAgIC8qKlxuICAgICAqIFRoaXMgU2VsZWN0b3IgVHlwZSBpcyBub3QgeWV0IHN1cHBvcnRlZCBidXQgd2lsbCBiZSBhZGRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICAgICAqIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgXCJEZWZhdWx0XCI6IFwiRGVmYXVsdFwiXG59IGFzIGNvbnN0O1xuXG5cbi8qKlxuICogVGhpcyBTa2luIENvbmZpZyBUeXBlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ1dCB3aWxsIGJlIGFkZGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gKiBQbGVhc2UgY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHVwZGF0ZXMuXG4gKlxuICogQHR5cGUge0lEZWZhdWx0U2tpbkNvbmZpZ31cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRGVmYXVsdFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuRGVmYXVsdCxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudGVkU2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQsXG4gICAgc2VnbWVudHM6IElTZWdtZW50SW5zdGFuY2VbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEZWRpY2F0ZWRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2tpbn0gaW5zdGVhZC5cbiAgICAgKiBQcm9wZXJ0eSBza2lucyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLlxuICAgICAqIFBsZWFzZSB1cGRhdGUgeW91ciBjb2RlIHRvIHVzZSB7QGxpbmsgc2tpbn0gZm9yIGJldHRlciBjb21wYXRpYmlsaXR5LlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBza2lucz86IElTa2luSW5zdGFuY2VDb25maWdbXSAvLyBkZXByZWNhdGVkXG4gICAgc2tpbjogSVNraW5JbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgLy9UT0RPIDpcbiAgICAvLyBSZWZJRCA/IHRvIHN1cHBvcnQgbW9yZSB0aGFuIDEgY29tcG9uZW50IGZyb20gdGhlIHNhbWUgdHlwZSBpbiBjb21wb3NpdGVzID9cblxuICAgIC8vVE9ETyA6IHJlbW92ZVxuICAgIGNvbXBvbmVudE5hbWU6IHN0cmluZzsgLy8gPDwgY2hlY2tcblxuICAgIHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZ1xuXG4gICAgLy8gc3RvcmluZyB0aGUgbmVzdGVkIGNvbmZpZyBmb3IgcmVmIGNvbXBvbmVudHNcbiAgICBuZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnW11cblxuICAgIC8vb25seSBvbiBHRVQ/XG4gICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgdGhhdFxuICAgIHJlc29sdmVkRXhwZXJpZW5jZXM/OiBJRXhwZXJpZW5jZVtdXG4gICAgLy8gd2lsbCBpbmNsdWRlIGluc3RhbmNlIGFuZCBkZWYgY29uZmlnIGluIG9yZGVyIHRvIHJlbmRlciBpbiBwcm9kdWN0aW9uXG4gICAgcmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudENvbmZpZ1tdXG59XG5cbmV4cG9ydCBjb25zdCBFeHBlcmllbmNlVHlwZXMgPSB7XG4gICAgXCJTZWdtZW50XCI6IFwiU2VnbWVudFwiLFxuICAgIFwiUHJvbW9cIjogXCJQcm9tb1wiLFxuICAgIFwiQUJcIjogXCJBQlwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBFeHBlcmllbmNlVHlwZXNcbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIC8vc3RpY2tpbmVzc0ZhY3RvclxuICAgIC8vRW5kRGF0ZVxufVxuXG4vLyBleHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2VHcm91cCB7XG4vLyAgICAgaWQ6IHN0cmluZ1xuLy8gICAgIG5hbWU6IHN0cmluZ1xuLy8gICAgIHBlcmNlbnRhZ2U6IG51bWJlclxuLy8gfVxuXG5leHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZTogdHlwZW9mIEV4cGVyaWVuY2VUeXBlcy5BQlxuICAgIC8vIGdyb3VwczogSUFCRXhwZXJpZW5jZUdyb3VwW11cbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIHBlcmNlbnRhZ2U6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEYXRlUmFuZ2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBzdGFydDogRGF0ZVxuICAgIGVuZDogRGF0ZVxuICAgIHRpbWV6b25lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIEV4cGVyaWVuY2VUeXBlc1xuICAgIHNlZ21lbnQ6IElTZWdtZW50RGVmaW5pdGlvblxuICAgIGRhdGVSYW5nZT86IElEYXRlUmFuZ2Vcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3dEZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGNvbXBvbmVudHM6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1tdO1xuICAgIG9yaWdpbnM6IHN0cmluZ1tdLFxuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgYnJhbmNoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudENvbmZpZyB7XG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xuICAgIHR5cGU6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICAvLyBUT0RPIDogdmVyaWZ5IHVuaXF1ZW5lc3MgKGRhc2hib2FyZCAmIHNlcnZlcilcbiAgICBuYW1lOiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIElCcmFuY2hhYmxlIHtcbiAgICBicmFuY2g/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3cgZXh0ZW5kcyBPbWl0PElVc2VyRmxvd0RlZmluaXRpb24sICdjb21wb25lbnRzJz4sIElCcmFuY2hhYmxlIHtcbiAgICBjb21wb25lbnRzOiBJQ29tcG9uZW50Q29uZmlnW11cbn1cblxuZXhwb3J0IGNsYXNzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdD86IFNoYWRvd1Jvb3QpIHtcblxuICAgIH1cblxuICAgIGdldFJvb3REaXYgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKS5xdWVyeVNlbGVjdG9yKCdkaXYnKVxuICAgIH1cblxuICAgIGdldFJvb3QgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IG15b3BBdHRyaWJ1dGVzID0ge1xuICAgIGlkOiAnbXlvcC1pZCdcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyLCBJRWxlbWVudFJlZiwgTXlvcEVsZW1lbnRSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UsIERldGVjdE15b3BSZWZzTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRGV0ZWN0TXlvcFJlZnNNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAobWVzc2FnZTogRGV0ZWN0TXlvcFJlZnNNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfV1gKTtcbiAgICAgICAgLy9jb25zdCBhbGxNeW9wSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAqYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBJRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgLy9sZXQgY291bnRlcnM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcblxuICAgICAgICBhbGxNeW9wSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgaWYgKG15b3BJZCkge1xuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSlcbiAgICAgICAgICAgIH0gLy9lbHNlIHtcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWNvdW50ZXJzW2l0ZW0udGFnTmFtZV0pIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgY291bnRlcnNbaXRlbS50YWdOYW1lXSA9IDA7XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIGNvdW50ZXJzW2l0ZW0udGFnTmFtZV0gPSBjb3VudGVyc1tpdGVtLnRhZ05hbWVdICsgMTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgICAgbXlvcFJlZnMucHVzaChuZXcgWFBhdGhFbGVtZW50UmVmKGAke2l0ZW0udGFnTmFtZX0oJHtjb3VudGVyc1tpdGVtLnRhZ05hbWVdfSlgLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UobWVzc2FnZS5oYW5kbGVyVW5pcXVlSWQsIG15b3BSZWZzKSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0cy50c1wiO1xuaW1wb3J0IHtSZWZ9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudHNCeVJlZiA9IChyZWY6IFJlZiwgZWw6IFBhcmVudE5vZGUpID0+IHtcbiAgICByZXR1cm4gZWwucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke3JlZi5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEZpcnN0RWxlbWVudEJ5UmVmID0gKHJlZjogUmVmLCBlbDogUGFyZW50Tm9kZSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZ2V0RWxlbWVudHNCeVJlZihyZWYsIGVsKTtcbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50cy5pdGVtKDApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtCaW5kQ2xpY2tNZXNzYWdlLCBDbGlja1JlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBCaW5kQ2xpY2tNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKCksIGV2ZW50KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsZWFuVXBUYXNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goY2xlYW5VcFRhc2spO1xuICAgICAgICB9KTtcblxuICAgICAgICAvL2NsZWFuIHVwXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgTXlvcE1lc3NhZ2VzIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8Q2hhbmdlVGV4dE1lc3NhZ2U+IHtcbiAgXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ2hhbmdlVGV4dE1lc3NhZ2U7XG4gICAgXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IENoYW5nZVRleHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGl0ZW0udGV4dENvbnRlbnQgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJleHBvcnQgdHlwZSBTZXJpYWxpemFibGU8VD4gPVxuICAgIFQgZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogLy8gRXhjbHVkZSBmdW5jdGlvbnNcbiAgICAgICAgVCBleHRlbmRzIEFycmF5PGluZmVyIFU+ID8gU2VyaWFsaXphYmxlPFU+W10gOiAvLyBIYW5kbGUgYXJyYXlzXG4gICAgICAgICAgICBUIGV4dGVuZHMgb2JqZWN0ID8ge1xuICAgICAgICAgICAgICAgIFtLIGluIGtleW9mIFQgYXMgVFtLXSBleHRlbmRzIEZ1bmN0aW9uID8gbmV2ZXIgOiBLXTogU2VyaWFsaXphYmxlPFRbS10+XG4gICAgICAgICAgICB9IDogVDsgLy8gSGFuZGxlIG9iamVjdHNcblxuY29uc3QgaXNQcmltaXRpdmUgPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdmFsdWUgIT09IE9iamVjdCh2YWx1ZSk7XG59XG5cbmNvbnN0IGlzRnVuY3Rpb24gPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgY29uc3QgY29udGFpbnNQcmltaXRpdmVzT25seSA9IChvYmopID0+IHtcbiAgICBpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihvYmopKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNoZWNrIGlmIGl0J3MgYSBuZXN0ZWQgb2JqZWN0XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5zUHJpbWl0aXZlc09ubHkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgICAgICAgICAgY29udGludWU7IC8vIEl0J3MgYSBwcmltaXRpdmUsIHNvIHdlIGNhbiBza2lwIGl0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEZvdW5kIGEgbm9uLXByaW1pdGl2ZSB2YWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7IC8vIEFsbCB2YWx1ZXMgYXJlIHByaW1pdGl2ZXMgb3IgbmVzdGVkIG9iamVjdHMgd2l0aCBwcmltaXRpdmVzXG59XG5cbi8vIGN1cnJlbnRseSBzdXBwb3J0IHJvb3QgbGV2ZWwgb25seVxuLy8ge3g6IDEsIHkgOiAnYScsIHogOiAoKT0+ey4uLn0sIGlubmVyIDogeyB4OiAxICwgeSA6ICdhJ30gfVxuLy8ge3g6IDEsIHkgOiAnYSd9XG4vL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvR2xvc3NhcnkvRmFsc3lcbmV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZVNrZWxldG9uPFQ+ID0gUGFydGlhbDxSZWNvcmQ8a2V5b2YgVCwgYm9vbGVhbiB8IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+Pj4gfCBib29sZWFuO1xuXG5leHBvcnQgY29uc3QgbWFrZVNlcmlhbGl6YWJsZSA9IDxUPihcbiAgICBvYmo6IFQsXG4gICAgc2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPFQ+ID0ge30sXG4gICAgaW5jbHVkZUZhbHN5S2V5czogYm9vbGVhbiA9IHRydWUsIC8vIFRPRE8gOiB1c2UgdGhhdCBhcmdcbiAgICBzZWVuOiBXZWFrTWFwPG9iamVjdCwgU2VyaWFsaXphYmxlPGFueT4+ID0gbmV3IFdlYWtNYXAoKVxuKTogU2VyaWFsaXphYmxlPFQ+ID0+IHtcblxuICAgIGlmIChpc1ByaW1pdGl2ZShvYmopKSB7XG4gICAgICAgIHJldHVybiBvYmogYXMgU2VyaWFsaXphYmxlPFQ+OyAvLyBEaXJlY3RseSByZXR1cm4gcHJpbWl0aXZlIHZhbHVlc1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWVuLmdldChvYmopITsgLy8gUmV0dXJuIHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBhcnJheSBzZXJpYWxpemF0aW9uXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YWJsZUFycmF5OiBTZXJpYWxpemFibGU8YW55PltdID0gW107XG4gICAgICAgIHNlZW4uc2V0KG9iaiwgc2VyaWFsaXphYmxlQXJyYXkpOyAvLyBTdG9yZSB0aGUgYXJyYXkgaW4gc2VlblxuXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBvYmoubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gb2JqW2luZGV4XTtcbiAgICAgICAgICAgIHNlcmlhbGl6YWJsZUFycmF5W2luZGV4XSA9IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudCwgc2tlbGV0b24sIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemFibGVBcnJheSBhcyBTZXJpYWxpemFibGU8VD47XG4gICAgfVxuXG4gICAgaWYgKG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBDaGVjayBmb3IgY3ljbGljIHJlZmVyZW5jZXNcbiAgICAgICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWVuLmdldChvYmopITsgLy8gUmV0dXJuIHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXJpYWxpemFibGVPYmplY3Q6IFBhcnRpYWw8U2VyaWFsaXphYmxlPFQ+PiA9IHt9O1xuICAgICAgICBzZWVuLnNldChvYmosIHNlcmlhbGl6YWJsZU9iamVjdCk7IC8vIFN0b3JlIHRoZSBvYmplY3QgaW4gc2VlblxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGtleSBpcyBpbiB0aGUgc2tlbGV0b24gYW5kIGlmIGl0J3MgYSB2YWxpZCBrZXkgdG8gc2VyaWFsaXplXG5cbiAgICAgICAgICAgIGNvbnN0IGtleUluU2tlbGV0b24gPSB0eXBlb2Ygc2tlbGV0b24gPT0gXCJib29sZWFuXCIgPyBza2VsZXRvbiA6IHNrZWxldG9uW2tleV07XG5cbiAgICAgICAgICAgIGlmIChrZXlJblNrZWxldG9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleUluU2tlbGV0b24gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNrZWxldG9uIGluZGljYXRlcyB0byBzZXJpYWxpemUgdGhpcyBrZXlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVGYWxzeUtleXMgPyBvYmpba2V5XSAhPT0gdW5kZWZpbmVkIDogb2JqW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YWJsZU9iamVjdFtrZXldID0gbWFrZVNlcmlhbGl6YWJsZShvYmpba2V5XSwgdHJ1ZSwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBrZXlJblNrZWxldG9uID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2tlbGV0b24gaW5kaWNhdGVzIG5lc3RlZCBrZXlzIHRvIHNlcmlhbGl6ZVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YWJsZU9iamVjdFtrZXldID0gbWFrZVNlcmlhbGl6YWJsZShvYmpba2V5XSwga2V5SW5Ta2VsZXRvbiwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemFibGVPYmplY3QgYXMgU2VyaWFsaXphYmxlPFQ+O1xuICAgIH1cblxuICAgIHJldHVybiB7fSBhcyBhbnk7IC8vIFJldHVybiBhbiBlbXB0eSBvYmplY3QgZm9yIG90aGVyIGNhc2VzXG59XG4iLCAiaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCByZXBsaWVyOiAoZGF0YTogYW55KSA9PiB2b2lkLCByb290UmVmOiBSb290UmVmKSA9PiB7XG4gICAgY29uc3QgX19zY3JpcHRJbnB1dHMgPSBldmVudC5zY3JpcHRJbnB1dHMgPyBldmVudC5zY3JpcHRJbnB1dHMgOiB7fVxuICAgIF9fc2NyaXB0SW5wdXRzLm1ha2VTZXJpYWxpemFibGUgPSBtYWtlU2VyaWFsaXphYmxlO1xuXG4gICAgX19zY3JpcHRJbnB1dHMuc2VuZCA9IHJlcGxpZXI7XG4gICAgX19zY3JpcHRJbnB1dHMucm9vdFJlZiA9IHJvb3RSZWY7XG4gICAgX19zY3JpcHRJbnB1dHMuX19zY3JpcHRJbnB1dHMgPSBfX3NjcmlwdElucHV0cztcblxuICAgIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICgke2V2ZW50LnNjcmlwdH0pKC4uLmFyZ3VtZW50cylgKTtcbiAgICBjb25zdCByZXQgPSBkeW5hbWljRnVuY3Rpb24oX19zY3JpcHRJbnB1dHMpO1xuXG4gICAgLy8gY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gRnVuY3Rpb24oJ3NlbmQnLCAncm9vdFJlZicsJ19fc2NyaXB0SW5wdXRzJywgLi4uT2JqZWN0LmtleXMoX19zY3JpcHRJbnB1dHMpLCBldmVudC5jb250ZW50ID8gZXZlbnQuY29udGVudCA6ICcnKVxuICAgIC8vY29uc3QgcmV0ID0gZHluYW1pY0Z1bmN0aW9uKHJlcGxpZXIsIHJvb3RSZWYsIF9fc2NyaXB0SW5wdXRzLCAuLi5PYmplY3QudmFsdWVzKF9fc2NyaXB0SW5wdXRzKSk7XG4gICAgcmVwbGllcihyZXQpO1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlciwgUm9vdFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50c1wiO1xuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8RXhlY3V0ZVNjcmlwdE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5FeGVjdXRlU2NyaXB0TWVzc2FnZVxuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcGxpZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBkYXRhKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcihldmVudCwgcmVwbGllciwgbmV3IFJvb3RSZWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSk7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBfX2ZlZGVyYXRpb25fXyA9IFwiX19mZWRlcmF0aW9uX19cIlxuZXhwb3J0IGNvbnN0IG9uTG9hZEtleSA9IFwib25Mb2FkXCJcbmV4cG9ydCBjb25zdCBtb2R1bGVJbnN0YW5jZUtleSA9IFwibW9kdWxlSW5zdGFuY2VcIlxuXG5leHBvcnQgY29uc3QgZGVmaW5lRHluYW1pY0ltcG9ydCA9IChnbG9iYWxOYW1lOiBzdHJpbmcsIG1vZHVsZTogYW55KSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh3aW5kb3dbX19mZWRlcmF0aW9uX19dICYmIHdpbmRvd1tfX2ZlZGVyYXRpb25fX11bZ2xvYmFsTmFtZV0gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKHtbZ2xvYmFsTmFtZV06IG1vZHVsZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnX19mZWRlcmF0aW9uX18gbG9hZGVyIG5vdCBkZWZpbmVkIGZvciBtb2R1bGUnLCBtb2R1bGUpO1xuICAgIH1cbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtBZGRFdmVudExpc3RlbmVyTWVzc2FnZSwgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBBZGRFdmVudExpc3RlbmVySGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxBZGRFdmVudExpc3RlbmVyTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChtZXNzYWdlOiBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihtZXNzYWdlLnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6IGFueVtdID0gW107XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgdGhhdCByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UobWVzc2FnZS5oYW5kbGVyVW5pcXVlSWQsIG1ha2VTZXJpYWxpemFibGUoZSwgbWVzc2FnZS5zZXJpYWxpemFibGVTa2VsZXRvbikpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIobWVzc2FnZS50eXBlLCBoYW5kbGVyKVxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihtZXNzYWdlLnR5cGUsIGhhbmRsZXIpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHtcbiAgICAgICAgICAgICAgICB0YXNrKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRBdHRyaWJ1dGVNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIHNldEF0dHJpYnV0ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8U2V0QXR0cmlidXRlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0QXR0cmlidXRlTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBTZXRBdHRyaWJ1dGVNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKGV2ZW50Lm5hbWUsIGV2ZW50LnZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5LCBNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBEaXNwb3NlTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCwgTWVzc2FnZURpcmVjdGlvbixcbiAgICBDbGVhbnVwTWVzc2FnZSwgQ2xlYW51cFJlcGxheU1lc3NhZ2UsXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7SG9zdFNESywgbG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuLyoqXG4gKiBSZXN1bHQgcmV0dXJuZWQgYnkgb2JzZXJ2ZUF1dG9TaXplIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b1NpemVSZXN1bHQge1xuICAgIC8qKiBDdXJyZW50IHdpZHRoIChmcm9tIGNvbnRlbnQpICovXG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICAvKiogQ3VycmVudCBoZWlnaHQgKGZyb20gY29udGVudCkgKi9cbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICAvKiogV2hldGhlciB3aWR0aCBpcyBiZWluZyBhdXRvLXNpemVkICovXG4gICAgYXV0b1NpemluZ1dpZHRoOiBib29sZWFuO1xuICAgIC8qKiBXaGV0aGVyIGhlaWdodCBpcyBiZWluZyBhdXRvLXNpemVkICovXG4gICAgYXV0b1NpemluZ0hlaWdodDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBvYnNlcnZlQXV0b1NpemUgbWV0aG9kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b1NpemVPcHRpb25zIHtcbiAgICAvKiogQ2FsbGJhY2sgY2FsbGVkIHdpdGggc2l6ZSBpbmZvIHdoZW5ldmVyIHNpemUgY2hhbmdlcyAqL1xuICAgIG9uU2l6ZUNoYW5nZT86IChyZXN1bHQ6IEF1dG9TaXplUmVzdWx0KSA9PiB2b2lkO1xuICAgIC8qKiBNaW5pbXVtIHdpZHRoIGNvbnN0cmFpbnQgKi9cbiAgICBtaW5XaWR0aD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWF4aW11bSB3aWR0aCBjb25zdHJhaW50ICovXG4gICAgbWF4V2lkdGg/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIE1pbmltdW0gaGVpZ2h0IGNvbnN0cmFpbnQgKi9cbiAgICBtaW5IZWlnaHQ/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIE1heGltdW0gaGVpZ2h0IGNvbnN0cmFpbnQgKi9cbiAgICBtYXhIZWlnaHQ/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIEV4cGxpY2l0IHdpZHRoIHNldCBieSBob3N0IC0gaWYgZGVmaW5lZCwgZG9uJ3QgYXV0by1zaXplIHdpZHRoICovXG4gICAgZXhwbGljaXRXaWR0aD86IHN0cmluZyB8IG51bWJlcjtcbiAgICAvKiogRXhwbGljaXQgaGVpZ2h0IHNldCBieSBob3N0IC0gaWYgZGVmaW5lZCwgZG9uJ3QgYXV0by1zaXplIGhlaWdodCAqL1xuICAgIGV4cGxpY2l0SGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIC8qKiBGb3JjZSBhdXRvLXNpemUgZXZlbiBpZiBjb250YWluZXIgaGFzIGRpbWVuc2lvbnMgKi9cbiAgICBmb3JjZUF1dG9TaXplPzogYm9vbGVhbjtcbiAgICAvKiogTWluIGhlaWdodCB1c2VkIGJ5IGxvYWRlciB0byBkZXRlY3QgY29sbGFwc2UgKGRlZmF1bHQ6IDUwKSAqL1xuICAgIGxvYWRlck1pbkhlaWdodD86IG51bWJlcjtcbn1cblxuLy9UT0RPIDogY2hhbmdlIElNeW9wQ29tcG9uZW50IHRvIHJlZiBzcGVjaWZpYyBpbXBsXG50eXBlIFJlZlR5cGVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IElNeW9wQ29tcG9uZW50IHwgUmVmXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wQ29tcG9uZW50PFAgPSBhbnksIFIgPSBhbnk+IHtcblxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBpc0luaXRpYXRlZDogYm9vbGVhbjtcblxuICAgIG1hcmtlZEZvckRpc3Bvc2VkOiBib29sZWFuO1xuXG4gICAgc2V0SW5pdGlhdGVkOiAoKSA9PiB2b2lkXG5cbiAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgLyoqIFJ1bnRpbWUgdGFnczogb25seSB0YWdzIG5hbWVkIGB1aTouLi5gIChlLmcuIGB1aTpiZXRhYCkuIGBbXWAgd2hlbiB0aGVyZSBhcmUgbm9uZS4gKi9cbiAgICByZWFkb25seSB1aVRhZ3M6IHN0cmluZ1tdXG5cbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50XG5cbiAgICAvL3JlZiBjb21wb25lbnRzIGNhbiBiZSBlbGVtZW50LWxlc3NcbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnRcblxuICAgIHNlbmQ6IChtc2c6IEJhc2VNeW9wTWVzc2FnZSkgPT4gQ2xlYW51cEhhbmRsZXJcblxuICAgIGJpbmQobWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5LCBoYW5kbGVyOiAoKSA9PiBib29sZWFuKTogdm9pZDtcblxuICAgIGJpbmQ8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5LCBoYW5kbGVyOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbik6IHZvaWQ7XG5cbiAgICAvLyBib29sZWFuIHJldHVybmVkIHZhbHVlID0gaGFuZGxlZCBvciBub3RcbiAgICBvbk1lc3NhZ2VSZWNlaXZlZDogKG1zZzogQmFzZU15b3BNZXNzYWdlKSA9PiBib29sZWFuXG5cbiAgICBpbml0aWF0ZWQ6ICgpID0+IFByb21pc2U8YW55PjtcblxuICAgIGRpc3Bvc2U6ICgpID0+IHZvaWRcblxuICAgIGhpZGUoKTogdm9pZDtcblxuICAgIHNob3coKTogdm9pZDtcblxuICAgIGluc3BlY3QoKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIE9ic2VydmVzIHRoZSBpZnJhbWUgY29udGVudCBzaXplIGFuZCBhdXRvbWF0aWNhbGx5IHN5bmNzIGl0IHRvIHRoZSBpZnJhbWUgZWxlbWVudC5cbiAgICAgKiBPbmx5IGF2YWlsYWJsZSBmb3IgaWZyYW1lLWJhc2VkIGNvbXBvbmVudHMuIFVzZXMgZGlyZWN0IGNvbnRlbnREb2N1bWVudCBhY2Nlc3MuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nIHNpemUgY2hhbmdlIGNhbGxiYWNrIGFuZCBtaW4vbWF4IGNvbnN0cmFpbnRzXG4gICAgICogQHJldHVybnMgQ2xlYW51cCBmdW5jdGlvbiB0byBzdG9wIG9ic2VydmluZ1xuICAgICAqL1xuICAgIG9ic2VydmVBdXRvU2l6ZT86IChvcHRpb25zPzogQXV0b1NpemVPcHRpb25zKSA9PiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIC8qKlxuICAgICAqIFBhcnNlZCBteW9wOnNpemUgbWV0YSB0YWcgZnJvbSB0aGUgY29tcG9uZW50IEhUTUwuXG4gICAgICogU2V0IGJ5IEhUTUxDb21wb25lbnRMb2FkZXIgYmVmb3JlIGlmcmFtZSBjcmVhdGlvbi5cbiAgICAgKiBVc2VkIGJ5IHRoZSBSZWFjdCBob3N0IHRvIGRldGVybWluZSBzaXppbmcgbW9kZSAoZmlsbCB2cyBjb250ZW50KS5cbiAgICAgKi9cbiAgICBzaXplTWV0YT86IHsgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7IGhlaWdodD86IHN0cmluZyB8IG51bWJlcjsgbWluV2lkdGg/OiBudW1iZXI7IG1heFdpZHRoPzogbnVtYmVyOyBtaW5IZWlnaHQ/OiBudW1iZXI7IG1heEhlaWdodD86IG51bWJlciB9IHwgbnVsbDtcblxuICAgIHBhcmVudD86IElNeW9wQ29tcG9uZW50O1xuXG4gICAgcHJvcHM6IFBcblxuICAgIHJlZnM6IFJcbn1cblxuZnVuY3Rpb24gaXNJbmhlcml0RnJvbShvYmo6IGFueSwgYmFzZUNsYXNzOiBhbnkpIHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcblxuICAgIGlmICghcHJvdG8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwcm90by5jb25zdHJ1Y3Rvci5uYW1lID09PSBiYXNlQ2xhc3MubmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGlzSW5oZXJpdEZyb20ocHJvdG8sIGJhc2VDbGFzcyk7XG59XG5cbi8vIFRPRE8gOiBtb3ZlIDogXG50eXBlIG1lc3NhZ2VIYW5kbGVyPFQ+ID0gKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW47XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcENvbXBvbmVudDxQID0gYW55LCBSIGV4dGVuZHMgUmVmVHlwZXMgPSBSZWZUeXBlcz4gaW1wbGVtZW50cyBJTXlvcENvbXBvbmVudDxQPiB7XG4gICAgaWQ6IHN0cmluZyA9ICcnXG5cbiAgICBtZXNzYWdlSGFuZGxlcnM6IFJlY29yZDxzdHJpbmcsIG1lc3NhZ2VIYW5kbGVyPGFueT5bXT4gPSB7fTtcblxuICAgIGVsZW1lbnQ/OiBIVE1MRWxlbWVudFxuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaWQgPSBvcHRpb25zPy5pZCB8fCBIb3N0U0RLLkluc3RhbmNlKCkuYXNzaWduSWQoY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zPy50aW1lb3V0ID8gb3B0aW9ucz8udGltZW91dCA6IDUgKiAxMDAwO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0luaXRpYXRlZCAmJiB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ICYmICF0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QoYHRpbWVvdXRfJHt0aW1lb3V0fSAke3RoaXMuaWR9YCk7XG5cbiAgICAgICAgICAgICAgICAvLyBBIFRJTUVELU9VVCBDT01QT05FTlQgTVVTVCBVTlJFR0lTVEVSIElUU0VMRiAtLSBOT0JPRFkgRUxTRSBDQU4uXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBob3N0U0RLLmxvYWRDb21wb25lbnQgcmVqZWN0cyB3aXRoIHRoaXMgc2FtZSBlcnJvciwgc28gdGhlIGNhbGxlciBuZXZlclxuICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVzIHRoZSBjb21wb25lbnQgYW5kIGhhcyBubyBoYW5kbGUgdG8gZGlzcG9zZS4gV2l0aG91dCB0aGlzIHRoZVxuICAgICAgICAgICAgICAgIC8vIGhvc3Qga2VlcHMgaXQgaW4gYGNvbXBvbmVudHNgIEFORCBgY29tcG9uZW50czJpbml0YCBmb3IgdGhlIGxpZmUgb2YgdGhlXG4gICAgICAgICAgICAgICAgLy8gcGFnZSwgYW5kIHRoYXQgY29zdCBjb21wb3VuZHM6IGBjb21wb25lbnRzMmluaXRgIGlzIHdhbGtlZCBvbiBldmVyeVxuICAgICAgICAgICAgICAgIC8vIEluaXRSZXF1ZXN0LCBgaXNUcnVzdGVkU291cmNlYCB3YWxrcyBib3RoIGFycmF5cyBvbiBldmVyeSBtZXNzYWdlLCBhbmQgYVxuICAgICAgICAgICAgICAgIC8vIFVJIHRoYXQgcmV0cmllcyAtLSBhIHJlZWwgcGlja2VyLCBhIGRpYWxvZyByZW9wZW5lZCBwZXIgdGVtcGxhdGUgLS0gYWRkc1xuICAgICAgICAgICAgICAgIC8vIGEgZGVhZCBlbnRyeSBlYWNoIGF0dGVtcHQuXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBkaXNwb3NlKCkgaXMgdGhlIGNvaGVyZW50IGVuZCBzdGF0ZTogaXQgdW5yZWdpc3RlcnMgdGhyb3VnaCB0aGUgaG9zdCdzXG4gICAgICAgICAgICAgICAgLy8gJ29uRGlzcG9zZScgaGFuZGxlciBhbmQgZHJvcHMgdGhlIGZyYW1lIHRoYXQgbmV2ZXIgYW5zd2VyZWQuXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAgIC8vIFRPRE8gOiBhdXRvIGluc3BlY3QsIGNvbnRyb2wgZnJvbSBjb25maWdcbiAgICAgICAgdGhpcy5pbml0aWF0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5ob3N0U0RLLmluc3BlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zcGVjdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldCB1aVRhZ3MoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21wb25lbnREZWZpbml0aW9uPy51aVRhZ3MgfHwgW107XG4gICAgfVxuXG4gICAgX21hcmtlZEZvckRpc3Bvc2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBnZXQgbWFya2VkRm9yRGlzcG9zZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZDtcbiAgICB9XG5cbiAgICBzZXQgbWFya2VkRm9yRGlzcG9zZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWRPcGVyYXRpb25FeGNlcHRpb246IFRoZSBjb21wb25lbnQgaXMgYWxyZWFkeSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkaXNwb3NlZC4gRGlzcG9zZSBvcGVyYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCBhZ2FpbiB1bnRpbCB0aGUgY3VycmVudCBkaXNwb3NhbCBwcm9jZXNzIGlzIGNvbXBsZXRlLicpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBoaWRlKCk6IHZvaWQ7XG5cbiAgICBhYnN0cmFjdCBzaG93KCk6IHZvaWQ7XG5cbiAgICBhYnN0cmFjdCBpbnNwZWN0KCk6IENsZWFudXBIYW5kbGVyO1xuXG4gICAgLy9UT0RPOiB1c2UgYmluZFdoZW4gd2l0aCByZXR1cm4gdHJ1ZSBwcmVkaWNhdGUgLi4uXG4gICAgYmluZCA9IDxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPihtZXNzYWdlVHlwZTogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdID0gW11cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhhbmRsZSBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdLmluY2x1ZGVzKGhhbmRsZXIpKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0ucHVzaChoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJpbmRXaGVuID0gPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBzdHJpbmcsIHByZWRpY2F0ZTogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4sIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiB2b2lkKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuXFwndCB1c2UgY29tcG9uZW50LmJpbmRXaGVuIHdpdGhvdXQgYW4gaGFuZGxlcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0pIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXTtcblxuICAgICAgICBjb25zdCBwcmVkaWNhdGVXcmFwcGVkSGFuZGxlciA9IChlOiBUKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGUpKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcihlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcblxuICAgICAgICAvL1RPRE8gOiBoYW5kbGUgZHVwbGljYXRlIHJlZ2lzdHJhdGlvbiA/XG4gICAgICAgIGhhbmRsZXJzLnB1c2gocHJlZGljYXRlV3JhcHBlZEhhbmRsZXIpO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGhhbmRsZXJzLmluZGV4T2YocHJlZGljYXRlV3JhcHBlZEhhbmRsZXIpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ29uTWVzc2FnZVJlY2VpdmVkJywgZG9jdW1lbnQubG9jYXRpb24uaHJlZiwgaW5jb21lTWVzc2FnZSwgdGhpcyk7XG4gICAgICAgIC8vVE9ETyA6IGhhbmRlbCBzcGVjaWFsIGV2ZXRzID8gbGlrZSBpbml0UmVzID9cbiAgICAgICAgaWYgKGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FeGVjdXRlQ29tcG9uZW50TWV0aG9kKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAoaW5jb21lTWVzc2FnZSBhcyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKTtcblxuICAgICAgICAgICAgLy9rZWVwaW5nIHRoaXMubWV0aG9kKCkgc28gdGhhdCBjb250ZXh0IHdpbGwgc2F2ZWRcbiAgICAgICAgICAgIGlmICgodGhpcyBhcyBhbnkpW3R5cGVkTWVzc2FnZS5tZXRob2RdKSB7XG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgYW55KVt0eXBlZE1lc3NhZ2UubWV0aG9kXSh0eXBlZE1lc3NhZ2UuY29udGVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBtZXRob2Qgbm90IGZvdW5kICR7dHlwZWRNZXNzYWdlLm1ldGhvZH0gb24gY29tcG9uZW50YCwgdGhpcylcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzW2luY29tZU1lc3NhZ2UubWVzc2FnZVR5cGVdO1xuICAgICAgICBpZiAoaGFuZGxlcnMgJiYgaGFuZGxlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgaGFuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBoYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgIGhhbmRsZWQgPSBoYW5kbGVkIHx8IGhhbmRsZXIoaW5jb21lTWVzc2FnZSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IGNvbnNvbGUgb25seSB3aGVuIGRlYnVnIGNvbmZpZ1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbm8gaGFuZGxlcnMgZm91bmQgZm9yICcsIGluY29tZU1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNldEluaXRpYXRlZCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5pc0luaXRpYXRlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHRoaXMuX3doZW5Jbml0aWF0ZWRSZXNvbHZlKVxuICAgICAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBpc0luaXRpYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgX3doZW5Jbml0aWF0ZWRSZXNvbHZlPzogKHZhbHVlPzogYW55KSA9PiBhbnk7XG4gICAgX3doZW5Jbml0aWF0ZWRSZWplY3Q/OiAodmFsdWU/OiBhbnkpID0+IGFueTtcblxuICAgIF93aGVuSW5pdGlhdGVkOiBQcm9taXNlPGFueT4gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdCA9IHJlamVjdDtcbiAgICB9KTtcblxuICAgIGluaXRpYXRlZCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3doZW5Jbml0aWF0ZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZW5kQ2xlYW51cE1lc3NhZ2UobWVzc2FnZTogQ2xlYW51cE1lc3NhZ2UpOiB2b2lkIHtcbiAgICAgICAgbWVzc2FnZS5zb3VyY2UgPSB0aGlzLmlkO1xuICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gdGhpcy5pZDtcbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG5cbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLmJpbmRXaGVuKG1lc3NhZ2UucmVwbHlNZXNzYWdlS2V5LCAobXNnOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtc2cucmVwbGF5VG9IYW5kbGVyID09PSBtZXNzYWdlLmhhbmRsZXJVbmlxdWVJZFxuICAgICAgICB9LCAobTogQ2xlYW51cFJlcGxheU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2UuaGFuZGxlcihtKTtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBtZXNzYWdlLmhhbmRsZXI7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZGVsZXRlIG1lc3NhZ2UuaGFuZGxlclxuXG4gICAgICAgIHRoaXMuc2VuZChtZXNzYWdlKTtcblxuICAgICAgICBtZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIH1cblxuICAgIHNlbmQobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogQ2xlYW51cEhhbmRsZXIge1xuICAgICAgICAvL21lc3NhZ2VzIHRoYXQgZXhldHJhY3RlZCBmcm9tIGVudmVsb3BlIGFscmVhZHkgaGF2ZSBzb3VyY2UgaW4gdGhlbVxuICAgICAgICBpZiAoIW1lc3NhZ2Uuc291cmNlKVxuICAgICAgICAgICAgbWVzc2FnZS5zb3VyY2UgPSB0aGlzLmlkO1xuXG4gICAgICAgIGlmICghbWVzc2FnZS5kZXN0aW5hdGlvbilcbiAgICAgICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSB0aGlzLmlkO1xuXG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi5kb3duO1xuXG4gICAgICAgIGxldCBjbGVhbnVwSGFuZGxlcjtcbiAgICAgICAgLy8gVE9ETyA6IGZpeCBoZWF2eSBvcC4uXG4gICAgICAgIC8vICBpZiAoaXNJbmhlcml0RnJvbShtZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2UpKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKG1lc3NhZ2UuaGFuZGxlcikge1xuICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgTXlvcEJpbmRNZXNzYWdlKTtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyID0gdGhpcy5iaW5kV2hlbih0eXBlZE1lc3NhZ2UucmVwbHlNZXNzYWdlS2V5LCAobXNnOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbXNnLnJlcGxheVRvSGFuZGxlciA9PT0gdHlwZWRNZXNzYWdlLmhhbmRsZXJVbmlxdWVJZFxuICAgICAgICAgICAgfSwgdHlwZWRNZXNzYWdlLmhhbmRsZXIpO1xuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBkZWxldGUgbWVzc2FnZS5oYW5kbGVyXG4gICAgICAgIH1cblxuICAgICAgICAvL1RPRE86IHRoaW5rIGFib3V0IHRoYXRcbiAgICAgICAgaWYgKG1lc3NhZ2UucmVmKSB7XG4gICAgICAgICAgICAvLyBzZXJpYWxpemFibGVcbiAgICAgICAgICAgIG1lc3NhZ2UucmVmID0gbWVzc2FnZS5yZWYuX19ub25Qcm94aWVkIHx8IG1lc3NhZ2UucmVmO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZENsZWFudXBNZXNzYWdlKG5ldyBDbGVhbnVwTWVzc2FnZShtZXNzYWdlLmlkLCAocmVwbGF5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGxvZyByZXBsYXk/XG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNsZWFudXBIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBSdW5zIHRoZSAnb25EaXNwb3NlJyBoYW5kbGVycyBvbmNlLiBob3N0U0RLIHJlZ2lzdGVycyB0aGUgb25lIHRoYXQgdW5yZWdpc3RlcnNcbiAgICAgKiAgdGhpcyBjb21wb25lbnQsIHNvIGl0IGhhcyB0byBydW4gb24gRVZFUlkgZGlzcG9zZSBwYXRoLCBpbml0aWF0ZWQgb3Igbm90LiAqL1xuICAgIHByaXZhdGUgcnVuRGlzcG9zZUhhbmRsZXJzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvbkRpc3Bvc2VIYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzWydvbkRpc3Bvc2UnXTtcbiAgICAgICAgaWYgKG9uRGlzcG9zZUhhbmRsZXJzKSB7XG4gICAgICAgICAgICBvbkRpc3Bvc2VIYW5kbGVycy5mb3JFYWNoKGRpc3Bvc2VIYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBzZW5kIG51bGwgb3IgZml4IHRoZSB0eXBlID9cbiAgICAgICAgICAgICAgICBkaXNwb3NlSGFuZGxlcihudWxsKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcmtlZEZvckRpc3Bvc2VkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIC8vIEEgQ09NUE9ORU5UIFRIQVQgTkVWRVIgSU5JVElBVEVEIFNUSUxMIEhBUyBUTyBCRSBVTlJFR0lTVEVSRUQuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVGhpcyB1c2VkIHRvIGByZXR1cm5gIGhlcmUsIHdoaWNoIGxlYWtlZDogaG9zdFNESyB0cmFja3MgZXZlcnkgY29tcG9uZW50IGJ5XG4gICAgICAgICAgICAvLyBiaW5kaW5nIGFuICdvbkRpc3Bvc2UnIGhhbmRsZXIgdGhhdCByZW1vdmVzIGl0IGZyb20gYGNvbXBvbmVudHNgIGFuZFxuICAgICAgICAgICAgLy8gYGNvbXBvbmVudHMyaW5pdGAsIGFuZCB0aG9zZSBoYW5kbGVycyBsaXZlIGJlbG93IHRoaXMgbGluZS4gU28gYSBjb21wb25lbnRcbiAgICAgICAgICAgIC8vIHRoYXQgdGltZWQgb3V0IGFuZCB3YXMgdGhlbiBkaXNwb3NlZCBoYWQgaXRzIGlmcmFtZSBwdWxsZWQgZnJvbSB0aGUgRE9NXG4gICAgICAgICAgICAvLyAobXlvcElmcmFtZUNvbXBvbmVudC5kaXNwb3NlIGRvZXMgdGhhdCBhZnRlciBzdXBlci5kaXNwb3NlKSB3aGlsZSBzdGF5aW5nIGluXG4gICAgICAgICAgICAvLyBib3RoIGhvc3QgYXJyYXlzIGZvcmV2ZXIuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVGhhdCBpcyBub3QgYSBzbG93IGxlYWssIGl0IGNvbXBvdW5kczogYGNvbXBvbmVudHMyaW5pdGAgaXMgd2Fsa2VkIG9uIGV2ZXJ5XG4gICAgICAgICAgICAvLyBJbml0UmVxdWVzdCBhbmQgYGlzVHJ1c3RlZFNvdXJjZWAgd2Fsa3MgYm90aCBhcnJheXMgb24gZXZlcnkgbWVzc2FnZSwgc28gZWFjaFxuICAgICAgICAgICAgLy8gZGVhZCBlbnRyeSBjb3N0cyBhIGBzZW5kKClgIGludG8gYSByZW1vdmVkIGZyYW1lIG9uIGV2ZXJ5IGZ1dHVyZSBoYW5kc2hha2UuXG4gICAgICAgICAgICAvLyBSZS1vcGVuaW5nIGEgZGlhbG9nIHRoYXQgbW91bnRzIGNvbXBvbmVudHMgLS0gUGljLVRpbWUncyByZWVsIHBpY2tlciAtLSBhZGRzXG4gICAgICAgICAgICAvLyBvbmUgZGVhZCBlbnRyeSBwZXIgYXR0ZW1wdC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBPbmx5IHRoZSBEaXNwb3NlTWVzc2FnZSBpcyBnZW51aW5lbHkgY29uZGl0aW9uYWw6IHRoZXJlIGlzIG5vIGxpdmUgZnJhbWUgdG9cbiAgICAgICAgICAgIC8vIHRlbGwuIEV2ZXJ5dGhpbmcgZWxzZSBtdXN0IHJ1bi5cbiAgICAgICAgICAgIHRoaXMucnVuRGlzcG9zZUhhbmRsZXJzKCk7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycyA9IHt9O1xuICAgICAgICAgICAgdGhpcy5pZCArPSAnX2Rpc3Bvc2VkJztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZygnZGlzcG9zaW5nIGNvbXBvbmVudCcsIHRoaXMuaWQpO1xuXG4gICAgICAgIC8vIC8vVE9ETyA6IGltcGxlbWVudCBkaXNwb3NlIGZsb3dcbiAgICAgICAgLy8gT2JqZWN0LmtleXModGhpcy5yZWZzKS5mb3JFYWNoKHJlZktleT0+e1xuICAgICAgICAvLyAgICAgdGhpcy5yZWZzW3JlZktleV0uZGlzcG9zZSgpO1xuICAgICAgICAvLyB9KTtcblxuICAgICAgICAvL1RPRE8gOiBjaGVjayBpZiB0aGVyZSBpcyBhbnkgdGltZSBmb3IgdGhlIG9cbiAgICAgICAgLy8gdGhlciBzaWRlIHRvIHByb2NjZXNzIHRvIG1lc3NhZ2UgYmVmb3JlIGRpZSA/XG4gICAgICAgIC8vbm90aWZ5IHRoZSBvdGhlciBzaWRlIFNES1xuICAgICAgICB0aGlzLnNlbmQobmV3IERpc3Bvc2VNZXNzYWdlKCkpXG5cbiAgICAgICAgdGhpcy5ydW5EaXNwb3NlSGFuZGxlcnMoKTtcblxuICAgICAgICAvL2NvbnNvbGUubG9nKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgLy90aGlzLmNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnMgPSB7fVxuICAgICAgICB0aGlzLmlkICs9ICdfZGlzcG9zZWQnO1xuICAgICAgICB0aGlzLmlzSW5pdGlhdGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvcHM6IFAgPSB7fSBhcyB1bmtub3duIGFzIFA7XG4gICAgcmVmczogUiA9IHt9IGFzIHVua25vd24gYXMgUjtcbn1cbiIsICJleHBvcnQgY29uc3QgRXJyb3JzID0ge1xuICAgIG5vdFNlcmlhbGl6YWJsZVJlZkNhbGw6IChwcm9wLCBhcmcpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcblRoZSBpbnB1dCBwcm92aWRlZCB0byAnJHtwcm9wLnRvU3RyaW5nKCl9JyBpcyBub3Qgc2VyaWFsaXphYmxlLiBTZXJpYWxpemF0aW9uIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGF0IHRoZSBkYXRhIGNhbiBiZSBzYWZlbHkgdHJhbnNmZXJyZWQgdG8gdGhlIHNraW4gaW1wbGVtZW50YXRpb24uIFxuVGhlIGZvbGxvd2luZyB0eXBlcyBvZiBkYXRhIGFyZSBjb25zaWRlcmVkIG5vbi1zZXJpYWxpemFibGUgYW5kIGNhbm5vdCBiZSBwcm9jZXNzZWQ6XG5cbi0gRnVuY3Rpb25zXG4tIERPTSBlbGVtZW50c1xuLSBDbGFzcyBpbnN0YW5jZXNcbi0gQ2lyY3VsYXIgcmVmZXJlbmNlc1xuLSBTeW1ib2xzXG4tIEJpZ0ludCB2YWx1ZXNcblxuSW4gdGhlIGZvbGxvd2luZyBleGVjdXRpb24gd2UgZGV0ZWN0ZWQgOlxufn5+fn5+fn5cbiR7YXJnfSBcbn5+fn5+fn5+XG5hcyBub3Qgc2VyaWFsaXphYmxlLlxuXG5UbyByZXNvbHZlIHRoaXMgaXNzdWUsIHBsZWFzZSBlbnN1cmUgdGhhdCBhbGwgaW5wdXRzIHBhc3NlZCB0byAnJHtwcm9wLnRvU3RyaW5nKCl9JyBhcmUgaW4gYSBzZXJpYWxpemFibGUgZm9ybWF0LlxuVGhpcyB0eXBpY2FsbHkgaW5jbHVkZXMgcHJpbWl0aXZlIHR5cGVzIChzdHJpbmdzLCBudW1iZXJzLCBib29sZWFucyksIGFycmF5cywgYW5kIHBsYWluIG9iamVjdHMuIFxuSWYgeW91IG5lZWQgdG8gaW5jbHVkZSBjb21wbGV4IGRhdGEgdHlwZXMsIGNvbnNpZGVyIGNvbnZlcnRpbmcgdGhlbSB0byBhIHNlcmlhbGl6YWJsZSBzdHJ1Y3R1cmUgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byB0aGUgZnVuY3Rpb24uXG5PciB1c2UgTXlvcCBtZXNzYWdlIHRoYXQgc3VwcG9ydCBpdDogQ3VzdG9tUmVmTWVzc2FnZSwgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2Ugb3IgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UuXG5cblN1Z2dlc3RlZCBGaXg6XG4xLiBSZW1vdmUgb3IgcmVwbGFjZSBub24tc2VyaWFsaXphYmxlIHZhbHVlcyBmcm9tIHlvdXIgaW5wdXQuXG4yLiBJZiB1c2luZyBvYmplY3RzLCBlbnN1cmUgdGhleSBkbyBub3QgY29udGFpbiBhbnkgZnVuY3Rpb25zIG9yIGNpcmN1bGFyIHJlZmVyZW5jZXMuXG4zLiBDb252ZXJ0IGFueSBjbGFzcyBpbnN0YW5jZXMgdG8gcGxhaW4gb2JqZWN0cyBvciBKU09OLWNvbXBhdGlibGUgZm9ybWF0cy5cbjQuIFVzZSBkZWRpY2F0ZWQgTXlvcCBtZXNzYWdlLlxuXG5Gb3IgbW9yZSBkZXRhaWxzIG9uIHNlcmlhbGl6YXRpb24gYW5kIE15b3AgbWVzc2FnZSBleGFtcGxlcywgcmVmZXIgdG8gaHR0cHM6Ly9kb2NzLm15b3AuZGV2XFwuXG5cbmApO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BDb21wb25lbnQsIElNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIEV4ZWN1dGVDb21wb25lbnRNZXRob2R9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFbnZlbG9wZWRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZVwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG5leHBvcnQgY2xhc3MgTXlvcFJlZkNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgcHVibGljIHBhcmVudDogSU15b3BDb21wb25lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIC8vVE9ETyA6IGNoZWNrIHBhcmVudENvbXBvbmVudC5jb250YWluZXIuLi5cbiAgICAgICAgc3VwZXIoY29tcG9uZW50RGVmaW5pdGlvbiwgcGFyZW50LmNvbnRhaW5lciwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgLy90aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoYXJndW1lbnRzLmNhbGxlZS5uYW1lKSk7XG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnaGlkZScpKTtcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ3Nob3cnKSk7XG4gICAgfVxuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgLy9UT0RPIDogc3VwcG9ydCByZWFsIGNsZWFudXBcbiAgICAgICAgLy9jb25zb2xlLmxvZygncmVmIGluc3BlY3QgY2FsbGVkLCBjcmVhdGluZyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kIGluc3BlY3QnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCB0aGlzLmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnaW5zcGVjdCcpKTtcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50KCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCcpKTtcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCcpKTtcbiAgICB9XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgLy8gaWYgKGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScpIHtcbiAgICAgICAgLy8gIGRlYnVnZ2VyO1xuICAgICAgICAvLyAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gfVxuICAgICAgICByZXR1cm4gc3VwZXIub25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZSk7XG4gICAgfVxuXG5cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdyZWYgbWVzc2FnZSBzZW5kaW5nICcsIG1lc3NhZ2UpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBtZXNzYWdlLmhhbmRsZXJcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIC8vIHRoaXMuaWQgd2lsbCBiZSBhdmFpbGFibGUgb24gdGhlIG5lc3RlZCBjb21wb25lbnRcbiAgICAgICAgdGhpcy5wYXJlbnQuc2VuZChuZXcgRW52ZWxvcGVkTWVzc2FnZSh0aGlzLmlkLCBtZXNzYWdlKSk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBtZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9O1xuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNJbml0aWF0ZWQpXG4gICAgICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ2Rpc3Bvc2UnKSk7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtBdXRvU2l6ZU9wdGlvbnMsIEJhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge3NldERlYnVnU3R5bGV9IGZyb20gXCIuLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5cbi8qKlxuICogQ29tcG9uZW50IHdyYXBwZXIgZm9yIE15b3AgV2ViIENvbXBvbmVudHMgdGhhdCBhcmUgZXh0cmFjdGVkIGZyb20gSFRNTFxuICogYW5kIHJ1biBkaXJlY3RseSBvbiB0aGUgaG9zdCBkb2N1bWVudCAobm90IGluIGFuIGlmcmFtZSkuXG4gKlxuICogVGhlc2UgY29tcG9uZW50cyB1c2UgdGhlIG5hdGl2ZSBXZWIgQ29tcG9uZW50cyBBUEkgKEN1c3RvbSBFbGVtZW50cyArIFNoYWRvdyBET00pXG4gKiBhbmQgY29tbXVuaWNhdGUgdmlhIGRpcmVjdCBtZXRob2QgY2FsbHMgYW5kIEN1c3RvbUV2ZW50cyBpbnN0ZWFkIG9mIHBvc3RNZXNzYWdlLlxuICovXG5leHBvcnQgY2xhc3MgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcbiAgICBwcml2YXRlIGN0YUNsZWFudXA/OiAoKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgX2N0YUhhbmRsZXI/OiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfY3RhUXVldWU6IEFycmF5PHthY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93bn0+ID0gW107XG5cbiAgICAvLyBBIHNpbmdsZSAnbXlvcC1jdGEnIGxpc3RlbmVyLCBhdHRhY2hlZCBhdCBjb25zdHJ1Y3Rpb24gc28gQ1RBcyBhIGNvbXBvbmVudFxuICAgIC8vIGRpc3BhdGNoZXMgZHVyaW5nIGl0cyBmaXJzdCBpbml0V2l0aERhdGEoKSByZW5kZXIgXHUyMDE0IGJlZm9yZSB0aGUgaG9zdCBhdHRhY2hlc1xuICAgIC8vIGEgaGFuZGxlciBcdTIwMTQgYXJlIGJ1ZmZlcmVkIChhbmQgZmx1c2hlZCBvbiBzZXRDdGFIYW5kbGVyKSwgbWF0Y2hpbmcgdGhlIGlmcmFtZVxuICAgIC8vIHBhdGgncyBwcmUtaGFuZGxlciBDVEEgcXVldWUuXG4gICAgcHJpdmF0ZSBfY3RhTGlzdGVuZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgZGV0YWlsID0gKGUgYXMgQ3VzdG9tRXZlbnQpLmRldGFpbDtcbiAgICAgICAgaWYgKCFkZXRhaWw/LmFjdGlvbikgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5fY3RhSGFuZGxlciAmJiAhdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5fY3RhSGFuZGxlcihkZXRhaWwuYWN0aW9uLCBkZXRhaWwucGF5bG9hZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2N0YUhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2N0YVF1ZXVlLnB1c2goeyBhY3Rpb246IGRldGFpbC5hY3Rpb24sIHBheWxvYWQ6IGRldGFpbC5wYXlsb2FkIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICAgICAgc2tpbjogSVNraW5Db25maWcsXG4gICAgICAgIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICBwcml2YXRlIGN1c3RvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgICAgICBwcml2YXRlIHRhZ05hbWU6IHN0cmluZyxcbiAgICAgICAgb3B0aW9ucz86IGxvYWRlck9wdGlvbnNcbiAgICApIHtcbiAgICAgICAgc3VwZXIoY29tcG9uZW50RGVmaW5pdGlvbiwgY29udGFpbmVyLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gY3VzdG9tRWxlbWVudDtcblxuICAgICAgICAvLyBMaXN0ZW4gQkVGT1JFIGFueSBpbml0V2l0aERhdGEgcmVuZGVyIHNvIGluaXQtdGltZSBDVEFzIGFyZW4ndCBsb3N0LlxuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbXlvcC1jdGEnLCB0aGlzLl9jdGFMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMuY3RhQ2xlYW51cCA9ICgpID0+IHRoaXMuY3VzdG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdteW9wLWN0YScsIHRoaXMuX2N0YUxpc3RlbmVyKTtcblxuICAgICAgICAvLyBXZWIgY29tcG9uZW50cyBhcmUgaW5pdGlhdGVkIGltbWVkaWF0ZWx5IChubyBwb3N0TWVzc2FnZSBoYW5kc2hha2UgbmVlZGVkKVxuICAgICAgICB0aGlzLnNldEluaXRpYXRlZCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2F1dG9TaXplT3B0aW9ucz86IEF1dG9TaXplT3B0aW9ucztcblxuICAgIC8qKlxuICAgICAqIERhdGEtb3V0IGZvciBzaXplIFx1MjAxNCB0aGUgZXh0cmFjdGVkIGNvdW50ZXJwYXJ0IG9mIHRoZSBpZnJhbWUgaW1wbGVtZW50YXRpb24uXG4gICAgICpcbiAgICAgKiBUSElTIEVYSVNURUQgT05MWSBPTiBNeW9wSWZyYW1lQ29tcG9uZW50LCBhbmQgdGhhdCB3YXMgaW52aXNpYmxlIGZvciBhcyBsb25nIGFzXG4gICAgICogbWluaWZpY2F0aW9uIHdhcyBzZW5kaW5nIGV2ZXJ5IHYyIGNvbXBvbmVudCBkb3duIHRoZSBpZnJhbWUgcGF0aC4gUmVzdG9yaW5nIHYyXG4gICAgICogZGV0ZWN0aW9uIG1vdmVzIHRoZW0gdG8gdGhpcyBjbGFzcywgYW5kIGBAbXlvcC9yZWFjdGAgZHJpdmVzIGJvdGggdGhyb3VnaCBvbmVcbiAgICAgKiB3cmFwcGVyOiBpbiBjb250ZW50IG1vZGUgaXQgaGlkZXMgaXRzIGxvYWRlciBmcm9tIHRoZSBGSVJTVCBvblNpemVDaGFuZ2UsIHNvIGFcbiAgICAgKiBjb21wb25lbnQgd2hvc2UgY2xhc3MgaGFzIG5vIG9ic2VydmVBdXRvU2l6ZSBsZWF2ZXMgYSBSZWFjdCBob3N0IG9uIGEgbG9hZGVyXG4gICAgICogZm9yZXZlci4gUGljLVRpbWUncyBzaXplTWV0YSBpcyB3aWR0aDoxMDAlIHdpdGggbm8gaGVpZ2h0LCB3aGljaCBpcyBleGFjdGx5IGNvbnRlbnRcbiAgICAgKiBtb2RlLiBDYXVnaHQgYnkgdjItZGF0YS1jb250cmFjdCBEOCAoQVBJIHBhcml0eSkuXG4gICAgICpcbiAgICAgKiBJdCBSRVBPUlRTIHJhdGhlciB0aGFuIGltcG9zZXMuIEFuIGlmcmFtZSBoYXMgbm8gaW50cmluc2ljIHNpemUgYW5kIG11c3QgYmVcbiAgICAgKiBtZWFzdXJlZCBpbnNpZGUgYW5kIHRoZW4gc2V0IGZyb20gb3V0c2lkZTsgYSBjdXN0b20gZWxlbWVudCBzaXplcyBpdHNlbGYgZnJvbSBpdHNcbiAgICAgKiBvd24gY29udGVudCwgc28gdGhlIGhvbmVzdCB0aGluZyBpcyB0byBtZWFzdXJlIGl0IGFuZCB0ZWxsIHRoZSBob3N0LCBhbmQgbGV0IHRoZVxuICAgICAqIGhvc3QgZGVjaWRlLiBSZWFjdCB0aGVuIHVzZXMgd2lkdGg6MTAwJSBhbmQgdGhlIG1lYXN1cmVkIGhlaWdodC5cbiAgICAgKlxuICAgICAqIFRoZSBvbmUgdGhpbmcgaXQgZG9lcyBpbXBvc2UgaXMgYGRpc3BsYXk6IGJsb2NrYCB3aGVuIHRoZSBlbGVtZW50IGNvbXB1dGVzIHRvXG4gICAgICogYGlubGluZWAsIHdoaWNoIGlzIHRoZSBkZWZhdWx0IGZvciBhIGN1c3RvbSBlbGVtZW50IGFuZCBtZWFzdXJlcyBhcyB6ZXJvIGhlaWdodCBub1xuICAgICAqIG1hdHRlciB3aGF0IGl0IGNvbnRhaW5zLiBUaGUgaWZyYW1lIHBhdGggZm9yY2VzIHdpZHRoOjEwMCUgZm9yIHRoZSBzYW1lIHJlYXNvbiBcdTIwMTRcbiAgICAgKiB3aXRob3V0IGl0IHRoZSBmaXJzdCBtZWFzdXJlbWVudCBpcyAwIGFuZCB0aGUgaG9zdCBzaXplcyB0aGUgY29tcG9uZW50IHRvIG5vdGhpbmcuXG4gICAgICovXG4gICAgb2JzZXJ2ZUF1dG9TaXplID0gKG9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnMpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIHRoaXMuX2F1dG9TaXplT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGVsID0gdGhpcy5jdXN0b21FbGVtZW50O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShlbCkuZGlzcGxheSA9PT0gJ2lubGluZScpIGVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICB9IGNhdGNoIHsgLyogZGV0YWNoZWQgb3Igbm8gbGF5b3V0IHlldDsgdGhlIG9ic2VydmVyIHdpbGwgcmVwb3J0IG9uY2UgaXQgaGFzIG9uZSAqLyB9XG5cbiAgICAgICAgY29uc3QgcGFyc2UgPSAodjogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgICAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdudW1iZXInKSByZXR1cm4gdjtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBwYXJzZUZsb2F0KHYpO1xuICAgICAgICAgICAgcmV0dXJuIGlzTmFOKG4pID8gdW5kZWZpbmVkIDogbjtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY2xhbXAgPSAodjogbnVtYmVyLCBtaW4/OiBudW1iZXIsIG1heD86IG51bWJlcikgPT5cbiAgICAgICAgICAgIG1pbiAhPT0gdW5kZWZpbmVkICYmIHYgPCBtaW4gPyBtaW4gOiAobWF4ICE9PSB1bmRlZmluZWQgJiYgdiA+IG1heCA/IG1heCA6IHYpO1xuXG4gICAgICAgIGNvbnN0IHJlcG9ydCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLl9hdXRvU2l6ZU9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCBhdXRvSGVpZ2h0ID0gb3B0cz8uZXhwbGljaXRIZWlnaHQgPT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIG9wdHM/Lm9uU2l6ZUNoYW5nZT8uKHtcbiAgICAgICAgICAgICAgICB3aWR0aDogcmVjdC53aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGF1dG9IZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgPyBjbGFtcChyZWN0LmhlaWdodCwgcGFyc2Uob3B0cz8ubWluSGVpZ2h0KSwgcGFyc2Uob3B0cz8ubWF4SGVpZ2h0KSlcbiAgICAgICAgICAgICAgICAgICAgOiByZWN0LmhlaWdodCxcbiAgICAgICAgICAgICAgICBhdXRvU2l6aW5nV2lkdGg6IGZhbHNlLCAgIC8vIGEgd2ViIGNvbXBvbmVudCBmaWxscyBpdHMgY29udGFpbmVyJ3Mgd2lkdGhcbiAgICAgICAgICAgICAgICBhdXRvU2l6aW5nSGVpZ2h0OiBhdXRvSGVpZ2h0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHJvOiBSZXNpemVPYnNlcnZlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJvID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHJlcG9ydCgpKTtcbiAgICAgICAgICAgIHJvLm9ic2VydmUoZWwpO1xuICAgICAgICB9IGNhdGNoIHsgLyogbm8gUmVzaXplT2JzZXJ2ZXI6IHRoZSBvbmUtc2hvdCByZXBvcnQgYmVsb3cgc3RpbGwgdW5ibG9ja3MgdGhlIGhvc3QgKi8gfVxuXG4gICAgICAgIC8vIEZpcmUgb25jZSBpbW1lZGlhdGVseS4gSG9zdHMgZ2F0ZSB0aGVpciBsb2FkZXIgb24gdGhlIEZJUlNUIG1lYXN1cmVtZW50LCBzbyBhXG4gICAgICAgIC8vIGNvbXBvbmVudCB0aGF0IG5ldmVyIHJlc2l6ZXMgbXVzdCBzdGlsbCBwcm9kdWNlIG9uZS5cbiAgICAgICAgcmVwb3J0KCk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHsgcm8/LmRpc2Nvbm5lY3QoKTsgdGhpcy5fYXV0b1NpemVPcHRpb25zID0gdW5kZWZpbmVkOyB9O1xuICAgIH1cblxuICAgIGNsZWFudXBJbnNwZWN0OiBDbGVhbnVwSGFuZGxlciA9ICgpID0+IHt9O1xuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQnLCAwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5jdXN0b21FbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdDtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJztcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcxJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3Vuc2V0JztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYWxsJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50IHdpdGggZGF0YSBieSBjYWxsaW5nIG15b3BfaW5pdF9pbnRlcmZhY2UgZGlyZWN0bHlcbiAgICAgKi9cbiAgICBpbml0V2l0aERhdGEoZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmN1c3RvbUVsZW1lbnQgYXMgYW55KS5teW9wX2luaXRfaW50ZXJmYWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAodGhpcy5jdXN0b21FbGVtZW50IGFzIGFueSkubXlvcF9pbml0X2ludGVyZmFjZShkYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBjdXJyZW50IGRhdGEgZnJvbSB0aGUgY29tcG9uZW50XG4gICAgICovXG4gICAgZ2V0RGF0YSgpOiB1bmtub3duIHtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5jdXN0b21FbGVtZW50IGFzIGFueSkubXlvcF9pbml0X2ludGVyZmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLmN1c3RvbUVsZW1lbnQgYXMgYW55KS5teW9wX2luaXRfaW50ZXJmYWNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgQ1RBIGhhbmRsZXIgLSB1bmlmaWVkIEFQSSB3aXRoIGlmcmFtZSBjb21wb25lbnRzLlxuICAgICAqIENhbGxlZCB2aWEgcHJvcHMubXlvcF9jdGFfaGFuZGxlciA9IGhhbmRsZXJcbiAgICAgKi9cbiAgICBzZXRDdGFIYW5kbGVyKGhhbmRsZXI6IChhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93bikgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICAvLyBUaGUgJ215b3AtY3RhJyBsaXN0ZW5lciBpcyBhdHRhY2hlZCBpbiB0aGUgY29uc3RydWN0b3IsIHNvIHdlIG9ubHkgc2V0IHRoZVxuICAgICAgICAvLyBoYW5kbGVyIGFuZCBmbHVzaCBhbnl0aGluZyB0aGUgY29tcG9uZW50IGVtaXR0ZWQgYmVmb3JlIG5vdyAoZS5nLiBkdXJpbmcgdGhlXG4gICAgICAgIC8vIGZpcnN0IGluaXRXaXRoRGF0YSByZW5kZXIpLlxuICAgICAgICB0aGlzLl9jdGFIYW5kbGVyID0gaGFuZGxlcjtcblxuICAgICAgICBpZiAodGhpcy5fY3RhUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcXVldWUgPSBbLi4udGhpcy5fY3RhUXVldWVdO1xuICAgICAgICAgICAgdGhpcy5fY3RhUXVldWUgPSBbXTtcbiAgICAgICAgICAgIHF1ZXVlLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIoaXRlbS5hY3Rpb24sIGl0ZW0ucGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIG1lc3NhZ2UtYmFzZWQgY29tcG9uZW50cy5cbiAgICAgKiBXZWIgY29tcG9uZW50cyBkb24ndCB1c2UgcG9zdE1lc3NhZ2UsIHNvIHRoaXMgaXMgYSBuby1vcCBmb3IgbW9zdCBtZXNzYWdlcy5cbiAgICAgKi9cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZTxhbnk+KSA9PiB7XG4gICAgICAgIC8vIFdlYiBjb21wb25lbnRzIGRvbid0IHVzZSB0aGUgcG9zdE1lc3NhZ2Ugc3lzdGVtXG4gICAgICAgIC8vIEluc3RlYWQsIGludGVyYWN0IGRpcmVjdGx5IHZpYSBwcm9wcy5teW9wX2luaXRfaW50ZXJmYWNlIGFuZCBwcm9wcy5teW9wX2N0YV9oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlKTtcblxuICAgICAgICAvLyBMb2cgZm9yIGRlYnVnZ2luZ1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudF0gc2VuZCgpIGNhbGxlZCAtIHdlYiBjb21wb25lbnRzIHVzZSBkaXJlY3QgQVBJIGluc3RlYWQnLCBtZXNzYWdlKTtcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY3RhQ2xlYW51cCkge1xuICAgICAgICAgICAgdGhpcy5jdGFDbGVhbnVwKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5jdXN0b21FbGVtZW50KTtcbiAgICB9XG59XG4iLCAiLy90eXBlIEFDb25zdHJ1Y3RvclR5cGVPZjxUPiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIEN1c3RvbVJlZk1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQgKiBhcyBtZXNzYWdlcyBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQ2xlYW51cEhhbmRsZXIsIElDb21wb25lbnRDb25maWcsXG4gICAgdHlwZSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJQ29tcG9uZW50UmVmQmVoYXZpb3IsIElIVE1MTG9hZGVyQ29uZmlnLCBJUHJvcENvZGVCZWhhdmlvcixcbiAgICBJUHJvcENvbmZpZywgSVNraW5Db25maWcsIFByb3BDb25maWdCZWhhdmlvclR5cGVzLFxuICAgIFJlZkJlaGF2aW9yVHlwZSwgU2hhZG93Um9vdE1vZGVUeXBlLCBTa2luTG9hZGVycywgU2tpbkxvYWRlclR5cGVcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtjb250YWluc1ByaW1pdGl2ZXNPbmx5fSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb25cIjtcbmltcG9ydCB7RXJyb3JzfSBmcm9tIFwiLi9sb2dNZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wUmVmQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL215b3BSZWZDb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9teW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50XCI7XG5pbXBvcnQge015b3BJZnJhbWVDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudFwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi9ob3N0U0RLXCI7XG5cbnR5cGUgY29tcG9uZW50RGVmaW5pdGlvblByb3BzID0gSUNvbXBvbmVudERlZmluaXRpb25Db25maWdbJ3Byb3BzJ11cblxuY29uc3QgY3JlYXRlRGVidWdUaXRsZSA9ICh0ZXh0OiBzdHJpbmcsIHRvcDogbnVtYmVyLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykgPT4ge1xuICAgIGNvbnN0IHRpdGxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgdGl0bGVFbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgdGl0bGVFbC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgdGl0bGVFbC5zdHlsZS5wYWRkaW5nID0gJzAgNXB4JztcbiAgICB0aXRsZUVsLnN0eWxlLmZvbnRTaXplID0gJzE0cHgnO1xuICAgIHRpdGxlRWwuc3R5bGVbJ3RvcCddID0gJzAnO1xuICAgIHRpdGxlRWwuc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcbiAgICAvL3RpdGxlRWwuc3R5bGUubGVmdCA9ICc1MCUnO1xuICAgIHRpdGxlRWwuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoLTUwJSknO1xuICAgIHRpdGxlRWwudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgdGl0bGVFbC5ocmVmID0gYGh0dHBzOi8vZGFzaGJvYXJkLm15b3AuZGV2L2Rhc2hib2FyZC9jb21wb25lbnQvJHtjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLmlkfWBcblxuICAgIHJldHVybiB0aXRsZUVsO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldERlYnVnU3R5bGUgPSAoaWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcbik6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAvLyMwMDdCRkYgKGJsdWUpIG9yICNGRjU3MjIgKG9yYW5nZSlcbiAgICAvLyM0Q0FGNTAgKGdyZWVuKSBvciAjRkZDMTA3IChhbWJlcilcbiAgICAvLyBjb25zdCB0b3BUZXh0ID0gY3JlYXRlRGVidWdUaXRsZShgJHtpZH0gOiAke3R5cGV9YCwgdG9wLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKTtcbiAgICBjb25zdCB0b3BUZXh0ID0gY3JlYXRlRGVidWdUaXRsZShgJHtjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLm5hbWV9IDogJHt0eXBlfWAsIHRvcCwgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyk7XG4gICAgY29udGFpbmVyLmluc2VydEJlZm9yZSh0b3BUZXh0LCBjb21wb25lbnRFbGVtZW50KTtcbiAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgIzAwN0JGRic7XG4gICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJ3Vuc2V0JztcbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKHRvcFRleHQpO1xuICAgIH1cbn1cblxuY29uc3QgcmVwb3J0RXJyb3IgPSAocHJvcENvbmZpZzogSVByb3BDb25maWcsIHByb3BOYW1lOiBzdHJpbmcsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQ8YW55LCBhbnk+KSA9PiB7XG4gICAgaWYgKCFwcm9wQ29uZmlnKSB7XG5cbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIC8vIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFcnJvcjogVW5kZWZpbmVkIFByb3BcXG5cXG5gICtcbiAgICAgICAgICAgIGBJdCBsb29rcyBsaWtlIHlvdSd2ZSB0cmllZCB0byB1c2UgYSBwcm9wIHRoYXQgaGFzbid0IGJlZW4gZGVmaW5lZC5cXG5gICtcbiAgICAgICAgICAgIGBQbGVhc2UgY2hlY2sgdGhlIHByb3AgbmFtZSBmb3IgYW55IHR5cG9zIG9yIGVuc3VyZSB0aGF0IGl0IGlzIHByb3Blcmx5IGRlZmluZWQgaW4gdGhlIGNvbXBvbmVudCdzIHByb3AgbGlzdC5cXG5cXG5gICtcbiAgICAgICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcE5hbWV9XFxuYCArXG4gICAgICAgICAgICBgQ29tcG9uZW50OiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLm5hbWV9LCBJRDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH1cXG5cXG5gICtcbiAgICAgICAgICAgIGBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIGNvbXBvbmVudCBwYWdlIGh0dHBzOi8vZGFzaGJvYXJkLm15b3AuZGV2L2Rhc2hib2FyZC9jb21wb25lbnQvJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH0gb3IgY29uc3VsdCB0aGUgZGV2ZWxvcGVyIGd1aWRlLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmNvbnN0IHJlcG9ydFVuc3VwcG9ydGVkID0gKHByb3BDb25maWc6IElQcm9wQ29uZmlnLCBwcm9wTmFtZTogc3RyaW5nLCBjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50PGFueSwgYW55PikgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBFcnJvcjogQ29kZSBQcm9wIE5vdCBTdXBwb3J0ZWRcXG5cXG5gICtcbiAgICAgICAgYEN1cnJlbnRseSwgY29kZSBwcm9wcyBhcmUgb25seSBzdXBwb3J0ZWQgaW4gbG9jYWwgZnJhbWUgY29tcG9uZW50cy5cXG5gICtcbiAgICAgICAgYFx1MjZBMFx1RkUwRiBUaGlzIGlzIGEgd29yayBpbiBwcm9ncmVzcyBmZWF0dXJlIFx1MjAxNCBjb2RlIHByb3BzIHdpbGwgYmUgc3VwcG9ydGVkIGluIHVwY29taW5nIHZlcnNpb25zLlxcblxcbmAgK1xuICAgICAgICBgSW4gdGhlIG1lYW50aW1lLCB5b3UgY2FuIHVzZSBtZXNzYWdlIHByb3BzLlxcblxcbmAgK1xuICAgICAgICBgUHJvcCBOYW1lOiAke3Byb3BOYW1lfVxcbmAgK1xuICAgICAgICBgQ29tcG9uZW50OiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLm5hbWV9LCBJRDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH1cXG5cXG5gICtcbiAgICAgICAgYEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgY29tcG9uZW50IHBhZ2UgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfSBvciBjb25zdWx0IHRoZSBkZXZlbG9wZXIgZ3VpZGUuYFxuICAgICk7XG59XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0UHJvcHMgPSA8VCBleHRlbmRzIGNvbXBvbmVudERlZmluaXRpb25Qcm9wcz4oY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgcHJvcHNDb25maWc6IElQcm9wQ29uZmlnW10sIHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcpID0+IHtcblxuICAgIGNvbnN0IHByb3BzTWFwID0gcHJvcHNDb25maWcucmVkdWNlKChwcmV2aW91c1ZhbHVlLCBjdXJyZW50VmFsdWUpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnByZXZpb3VzVmFsdWUsXG4gICAgICAgICAgICBbY3VycmVudFZhbHVlLm5hbWVdOiB7Li4uY3VycmVudFZhbHVlfVxuICAgICAgICB9XG4gICAgfSwge30pO1xuXG4gICAgY29uc3QgcHJvcHNIYW5kbGVyID0ge1xuICAgICAgICBnZXQ6IChfOiBJTXlvcENvbXBvbmVudCwgcHJvcDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBwcm9wQ29uZmlnID0gcHJvcHNNYXBbcHJvcF07XG5cbiAgICAgICAgICAgIGlmIChyZXBvcnRFcnJvcihwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGV4dHJhY3RlZCB3ZWIgY29tcG9uZW50cyBGSVJTVFxuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfaW5pdF9pbnRlcmZhY2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGdldHMvc2V0cyBkYXRhIChtYXRjaGVzIGlmcmFtZSBiZWhhdmlvcilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZGF0YT86IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5pdFdpdGhEYXRhKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBteW9wX2N0YV9oYW5kbGVyLCByZXR1cm4gdW5kZWZpbmVkIChpdCdzIHdyaXRlLW9ubHkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gSXNvbGF0ZWQgaWZyYW1lOiBubyBzYW1lLW9yaWdpbiBhY2Nlc3MgXHUyMDE0IHVzZSB0aGUgcG9zdE1lc3NhZ2UgYnJpZGdlXG4gICAgICAgICAgICAgICAgLy8gKHNhbWUgbWV0aG9kIHN1cmZhY2UgYXMgdGhlIGV4dHJhY3RlZC1XQyBicmFuY2ggYWJvdmUpLlxuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBNeW9wSWZyYW1lQ29tcG9uZW50ICYmIGNvbXBvbmVudC5pc29sYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9pbml0X2ludGVyZmFjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZGF0YT86IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gY29tcG9uZW50LmdldERhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5pdFdpdGhEYXRhKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBteW9wX2N0YV9oYW5kbGVyIGlzIHdyaXRlLW9ubHlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBGb3IgaWZyYW1lIChsb2NhbEZyYW1lKSBjb21wb25lbnRzXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSA9PT0gU2tpbkxvYWRlcnMuSFRNTExvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZExvYWRlciA9IHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZExvYWRlci5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuZWxlbWVudC5jb250ZW50V2luZG93W3R5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3BdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXBvcnRVbnN1cHBvcnRlZChwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcubW9kZSA9PT0gJ291dHB1dCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVBhcmFtczogYW55W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCBpbnRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaChSZWYuY3JlYXRlKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goLi4ucHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlQ3RvciA9IG1lc3NhZ2VzW3Byb3BDb25maWcuYmVoYXZpb3IubWVzc2FnZV07XG5cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IG1lc3NhZ2VDdG9yKC4uLm1lc3NhZ2VQYXJhbXMpKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiAoXzogSU15b3BDb21wb25lbnQsIHByb3A6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgcHJvcENvbmZpZyA9IHByb3BzTWFwW3Byb3BdO1xuXG4gICAgICAgICAgICBpZiAocmVwb3J0RXJyb3IocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZSkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudHMgRklSU1QgKGJlZm9yZSBsb2NhbEZyYW1lIGNoZWNrKVxuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgZXh0cmFjdGVkIHdlYiBjb21wb25lbnRzIG1heSBoYXZlIHNoYWRvd1Jvb3RNb2RlOiBsb2NhbEZyYW1lIGluIHRoZWlyIGNvbmZpZ1xuICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGV5IHJ1biBkaXJlY3RseSBvbiB0aGUgaG9zdCBkb2N1bWVudCwgbm90IGluIGFuIGlmcmFtZVxuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfY3RhX2hhbmRsZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2V0Q3RhSGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfaW5pdF9pbnRlcmZhY2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5pdFdpdGhEYXRhKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gSXNvbGF0ZWQgaWZyYW1lOiByb3V0ZSB2aWEgdGhlIHBvc3RNZXNzYWdlIGJyaWRnZSAobm8gc2FtZS1vcmlnaW4gYWNjZXNzKS5cbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgTXlvcElmcmFtZUNvbXBvbmVudCAmJiBjb21wb25lbnQuaXNvbGF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfY3RhX2hhbmRsZXInKSB7IGNvbXBvbmVudC5zZXRDdGFIYW5kbGVyKHZhbHVlKTsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9pbml0X2ludGVyZmFjZScpIHsgY29tcG9uZW50LmluaXRXaXRoRGF0YSh2YWx1ZSk7IHJldHVybiB0cnVlOyB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRm9yIGlmcmFtZSAobG9jYWxGcmFtZSkgY29tcG9uZW50c1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUgPT09IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRMb2FkZXIgPSBzZWxlY3RlZFNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRMb2FkZXIuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5sb2NhbEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50V2luZG93ID0gKGNvbXBvbmVudC5lbGVtZW50IGFzIEhUTUxJRnJhbWVFbGVtZW50KS5jb250ZW50V2luZG93IGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSByZWFsIGhhbmRsZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRXaW5kb3dbcHJvcE5hbWVdID0gdmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZsdXNoIENUQSBxdWV1ZSBpZiB0aGlzIGlzIG15b3BfY3RhX2hhbmRsZXIgYW5kIHF1ZXVlIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9jdGFfaGFuZGxlcicgJiYgY29udGVudFdpbmRvdy5fX215b3BfY3RhX3F1ZXVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVldWUgPSBjb250ZW50V2luZG93Ll9fbXlvcF9jdGFfcXVldWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFdpbmRvdy5fX215b3BfY3RhX3F1ZXVlID0gbnVsbDsgLy8gQ2xlYXIgdG8gcHJldmVudCBkb3VibGUtZmx1c2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS5mb3JFYWNoKChpdGVtOiB7YWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IGFueX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBpZiBjb21wb25lbnQgd2FzIGRpc3Bvc2VkIGR1cmluZyBmbHVzaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm1hcmtlZEZvckRpc3Bvc2VkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKGl0ZW0uYWN0aW9uLCBpdGVtLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVwb3J0VW5zdXBwb3J0ZWQocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vaWYocHJvcENvbmZpZy5iZWhhdmlvciA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMubWVzc2FnZSlcbiAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5tb2RlID09PSAnaW5wdXQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgbXVsdGkgYmVoYXZpb3JzXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gJ21lc3NhZ2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlUGFyYW1zOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCBpbnRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKFJlZi5jcmVhdGUocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goLi4ucHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlQ3RvciA9IG1lc3NhZ2VzW3Byb3BDb25maWcuYmVoYXZpb3IubWVzc2FnZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgbWVzc2FnZUN0b3IoLi4ubWVzc2FnZVBhcmFtcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3I6IFVuc3VwcG9ydGVkIEJlaGF2aW9yXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoZSAnYmVoYXZpb3InIGZpZWxkIHByb3ZpZGVkIGlzIG5vdCBzdXBwb3J0ZWQuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBCZWhhdmlvciBGaWVsZDogJHtwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGV9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYENoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB2YWxpZCBiZWhhdmlvciBvcHRpb25zLmBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnQucHJvcHMgPSB7fTtcbiAgICBjb21wb25lbnQucHJvcHMgPSBuZXcgUHJveHkoY29tcG9uZW50LnByb3BzLCBwcm9wc0hhbmRsZXIpO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudCBhcyAoT21pdDxJTXlvcENvbXBvbmVudCwgJ3Byb3BzJz4gJiB7XG4gICAgICAgIHByb3BzOiBwcm9wVHlwZXM8VD5cbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmUHJveHkgPSAodGFyZ2V0OiBSZWYsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHRhcmdldCwge1xuICAgICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG5cbiAgICAgICAgICAgIC8vIGlmIChwcm9wID09PSAnX19ub25Qcm94aWVkJykge1xuICAgICAgICAgICAgLy8gICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh0YXJnZXRbcHJvcF0pIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgZ2V0dGVyRnVuY3Rpb24gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhcmdzLmZvckVhY2goYXJnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGFpbnNQcmltaXRpdmVzT25seShhcmcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLm5vdFNlcmlhbGl6YWJsZVJlZkNhbGwocHJvcCwgYXJnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBwcm9wTmFtZSwgZnVuY3Rpb25BcmdzLCBtYWtlU2VyaWFsaXphYmxlfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlZltwcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWtlU2VyaWFsaXphYmxlKHJlZltwcm9wTmFtZV0oLi4uZnVuY3Rpb25BcmdzKSwgdHJ1ZSkgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbmQgcmV0dXJuIGl0cyByZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWtlU2VyaWFsaXphYmxlKHZhbHVlLCB0cnVlKTsgLy8gUmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IHRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogdGFyZ2V0LnJlZkNvbmZpZy5zZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogcHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFyZ3M6IGFyZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShtc2cuY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vVE9ETzogd2UgY2FuIGltcGxlbWVudCB0aGluZ3MgbGlrZSBhdXRvIHNlcmlhbGl6YXRpb24gYW5kIGJpbmRpbmcgZnVuY3Rpb25zIGhlcmVcbiAgICAgICAgICAgIC8vZ2V0dGVyRnVuY3Rpb24udGVzdCA9ICcxMjMnO1xuXG4gICAgICAgICAgICByZXR1cm4gZ2V0dGVyRnVuY3Rpb247XG5cbiAgICAgICAgICAgIC8vcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCh0YXJnZXQsIHByb3A6IHN0cmluZywgdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBwcm9wTmFtZSwgcHJvcFZhbHVlfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVmKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogZml4IHRoYXRcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiB0YXJnZXQucmVmQ29uZmlnLnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBwcm9wVmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogcHJvcFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBsb2c/XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlZkNvbXBvbmVudCA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4ocmVmOiBSZWYsIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpOiBQcm9taXNlPFQ+ID0+IHtcbiAgICBjb25zdCBjb21wb25lbnQgPSByZWYuY29tcG9uZW50O1xuICAgIGlmICghY29tcG9uZW50KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbnQgY3JlYXRlUmVmQ29tcG9uZW50IHdpdGggZGV0YWNoZWQgcmVmJyk7XG5cbiAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkJywgcmVmLCBjb21wb25lbnRDb25maWcpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gbmV3IE15b3BSZWZDb21wb25lbnQoY29tcG9uZW50Q29uZmlnLnR5cGUsIGNvbXBvbmVudCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbXBvbmVudHMucHVzaChyZWZDb21wb25lbnQpO1xuXG4gICAgICAgIC8vIEEgRkFJTEVEIFJFRiBNVVNUIE5PVCBLRUVQIElUUyBQTEFDRUhPTERFUi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlIHBsYWNlaG9sZGVyIGlzIHJlZ2lzdGVyZWQgYWJvdmUsIGJlZm9yZSB3ZSBrbm93IHdoZXRoZXIgdGhlIGZyYW1lIGNhblxuICAgICAgICAvLyBhY3R1YWxseSBjcmVhdGUgdGhlIGNvbXBvbmVudCwgYW5kIGJvdGggZmFpbHVyZSBwYXRocyBiZWxvdyB1c2VkIHRvIHJlamVjdFxuICAgICAgICAvLyB3aXRob3V0IHJlbW92aW5nIGl0LiBUaGUgY2FsbGVyIGdldHMgYSByZWplY3Rpb24gYW5kIG5vIGhhbmRsZSwgc28gbm9ib2R5IGVsc2VcbiAgICAgICAgLy8gY2FuIGNsZWFuIGl0IHVwIGVpdGhlciAtLSBleGFjdGx5IHRoZSBzaGFwZSBvZiB0aGUgdGltZW91dCBsZWFrIGluXG4gICAgICAgIC8vIEJhc2VNeW9wQ29tcG9uZW50LiBJdCBpcyBwZXJtYW5lbnQgYW5kIGl0IGNvbXBvdW5kczogZXZlcnkgcmV0cnkgb2YgYSByZWYgdGhhdFxuICAgICAgICAvLyBjYW5ub3QgYmUgY3JlYXRlZCAoYSBzZWxlY3RvciB0aGF0IG1hdGNoZXMgbm90aGluZywgYSBmcmFtZSB0aGF0IG5ldmVyIGFuc3dlcnMpXG4gICAgICAgIC8vIGFkZHMgYW5vdGhlciBkZWFkIGVudHJ5IHRvIHRoZSBhcnJheSB0aGF0IGlzVHJ1c3RlZFNvdXJjZSB3YWxrcyBvbiBldmVyeVxuICAgICAgICAvLyBtZXNzYWdlLiBDYXVnaHQgYnkgdGVzdC9jb21wb3NpdGUtcmVmLmUyZS5tanMgY2FzZSBSMy5cbiAgICAgICAgY29uc3QgdW5yZWdpc3RlciA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGF0ID0gY29tcG9uZW50cy5pbmRleE9mKHJlZkNvbXBvbmVudCk7XG4gICAgICAgICAgICBpZiAoYXQgIT09IC0xKSBjb21wb25lbnRzLnNwbGljZShhdCwgMSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy9mb3IgY2FzZXMgd2hlcmUgcmVmIGNvbXBvbmVudHMgZGVmaW5lIGluIHRoZSBjb21wb25lbnQgY29uZmlnXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIHJvb3QgY29tcG9uZW50IHRoZSBiZSBpbml0aWF0ZWQgYmVmb3JlIGludGVyYWN0aW5nIHdpdGggaXRcbiAgICAgICAgYXdhaXQgY29tcG9uZW50LmluaXRpYXRlZCgpO1xuXG5cbiAgICAgICAgLy9UT0RPIDpcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgLy9yZWplY3QoJ3RpbWVvdXQ/Jyk7XG4gICAgICAgICAgICB1bnJlZ2lzdGVyKCk7XG4gICAgICAgICAgICByZWplY3QoJ3RpbWVvdXQnKTtcbiAgICAgICAgfSwgNTAwMCk7XG5cbiAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UocmVmLnJlZkNvbmZpZyxcbiAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zID8gb3B0aW9ucyA6IHt9LFxuICAgICAgICAgICAgICAgIGlkOiByZWZDb21wb25lbnQuaWQsXG4gICAgICAgICAgICAgICAgX2hhc1BhcmVudDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFzeW5jIChtZXNzYWdlKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBjaGVjayBpZiB0aW1lb3V0IGFscmVhZHkgcGFzc2VkXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZmFpbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6XG4gICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlIGZhaWxlZCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW1wbGVtZW50YXRpb25Db21wb25lbnQgPSBjb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09IHJlZkNvbXBvbmVudC5pZCk7XG5cbiAgICAgICAgICAgICAgICAvL3NhbWUgbWVtb3J5IGVudiwgc2FtZSBIb3N0U0RLXG4gICAgICAgICAgICAgICAgaWYgKGltcGxlbWVudGF0aW9uQ29tcG9uZW50ICYmIGltcGxlbWVudGF0aW9uQ29tcG9uZW50ICE9PSByZWZDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVEhFIFBMQUNFSE9MREVSIElTIFJFRFVOREFOVCBIRVJFLCBTTyBEUk9QIElULlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGJyYW5jaCBtZWFucyB0aGUgZnJhbWUgbW91bnRlZCBpbnRvIE9VUiByZWdpc3RyeSByYXRoZXIgdGhhblxuICAgICAgICAgICAgICAgICAgICAvLyBpdHMgb3duIC0tIHRoZSBzYW1lLXdpbmRvdyBjYXNlIHRoZSB3ZWJjb21wb25lbnQgaGFuZGxlciBjYWxsc1xuICAgICAgICAgICAgICAgICAgICAvLyBcInNhbWUgbWVtb3J5IHdoZW4gdXNpbmcgd2ViY29tcG9uZW50XCIuIEJvdGggdGhlIHBsYWNlaG9sZGVyIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVhbCBjb21wb25lbnQgd2VyZSB0aGVuIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIFNBTUUgaWQsIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcGxhY2Vob2xkZXIgd2FzIGxlZnQgYmVoaW5kICh0aGUgYFRPRE8gOiBjbGVhbiByZWZDb21wb25lbnQgP2AgdGhhdFxuICAgICAgICAgICAgICAgICAgICAvLyB1c2VkIHRvIHNpdCBoZXJlKS4gVHdvIGVudHJpZXMsIG9uZSBpZCwgb25lIG9mIHRoZW0gZGVhZC5cbiAgICAgICAgICAgICAgICAgICAgdW5yZWdpc3RlcigpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCBhcyB1bmtub3duIGFzIFQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYGZpbmRgIENBTiBDT01FIEJBQ0sgRU1QVFksIEFORCB1bmRlZmluZWQgIT09IHJlZkNvbXBvbmVudCBJUyBUUlVFLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBXaXRob3V0IHRoZSBndWFyZCBhYm92ZSwgdGhhdCByZXNvbHZlZCB0aGUgY2FsbGVyJ3MgcHJvbWlzZSB3aXRoXG4gICAgICAgICAgICAgICAgICAgIC8vIGB1bmRlZmluZWRgOiBubyBlcnJvciwgbm8gY29tcG9uZW50LCBhbmQgdGhlIHBsYWNlaG9sZGVyIGxlZnQgaW5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlZ2lzdHJ5LiBSZXByb2R1Y2VkIGJ5IGNyZWF0aW5nIGEgcmVmIGZyb20gYSB3ZWIgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIHBhcmVudCAoY29tcG9zaXRlLXJlZiBjYXNlIFI1KSwgd2hlcmUgdGhlIHJlYWwgY29tcG9uZW50IGlzIHB1c2hlZFxuICAgICAgICAgICAgICAgICAgICAvLyBpbnRvIGEgcmVnaXN0cnkgdGhlIGNhcHR1cmVkIGFycmF5IG5vIGxvbmdlciByZWZsZWN0cy4gRmFsbGluZ1xuICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdWdoIHRvIHRoZSBwbGFjZWhvbGRlciBnaXZlcyB0aGUgY2FsbGVyIGEgdXNhYmxlIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIHNpbGVuY2UuXG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5zZXRJbml0aWF0ZWQoKVxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gcmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhlcmUgPlxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHdoYXQgYWJvdXQgcmVhcHRlcnMgPyEgZHluYW1pYyA/IVxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGV4c2lzdGluZ1JlZkNvbXBvbmVudCA9IGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gYXMgTXlvcFJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAvLyBpZiAoZXhzaXN0aW5nUmVmQ29tcG9uZW50LmlkICYmIGV4c2lzdGluZ1JlZkNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IFtjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdLCByZWZDb21wb25lbnRdO1xuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdKSkge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdLnB1c2gocmVmQ29tcG9uZW50KVxuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gcmVmQ29tcG9uZW50OyAvL2hvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gcmVmQ29tcG9uZW50LmlkKSE7XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogaW4gd2ViY29tcG9uZW50IGNhc2UgdGhlIHNhbWUgaWQgd2lsbCBhbHJlZGF5IGJlIGhlcmUsIHdoaWNoIGlzIGdvb2QgIVxuICAgICAgICAgICAgICAgIC8vIG5hbWU6XG4gICAgICAgICAgICAgICAgLy8gICAgIGlkXG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudERlZmluaXRpb25JZFxuXG4gICAgICAgICAgICAgICAgLy8gZm9yIGlubmVyIGNvbXBvbmVudHMgaW5zaWRlIHJlZiBjb21wb25lbnQgOlxuICAgICAgICAgICAgICAgIG1lc3NhZ2UubmVzdGVkUmVmcy5mb3JFYWNoKG5lc3RlZFJlZkNvbmZpZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudERlZmluaXRpb24gPSBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzIS5maW5kKGMgPT4gYy50eXBlLmlkID09PSBuZXN0ZWRSZWZDb25maWcuY29tcG9uZW50RGVmaW5pdGlvbklkKSEudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uID0gY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucz8uZmluZChkZWYgPT4gZGVmLmlkID09PSBuZXN0ZWRSZWZDb25maWcuY29tcG9uZW50RGVmaW5pdGlvbklkKSE7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IHJlZkNvbmZpZyA9IGNvbXBvbmVudENvbmZpZy50eXBlLnJlZnMuZmluZChyID0+IHIubmFtZSA9PT0gbmVzdGVkUmVmQ29uZmlnLnJlZk5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIXJlZkNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdubyByZWZDb25maWcgZm91bmQgZm9yIG5lc3RlZCByZWYnKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50ID0gbmV3IE15b3BSZWZDb21wb25lbnQobmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiwgcmVmQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgbmVzdGVkQ29tcG9uZW50LnNldEluaXRpYXRlZCgpO1xuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQucmVmc1tuZXN0ZWRSZWZDb25maWcucmVmTmFtZV0gPSBuZXN0ZWRDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucHVzaChuZXN0ZWRDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb25uZWN0UmVmcyhyZWZDb21wb25lbnQsIGNvbXBvbmVudENvbmZpZywgY29tcG9uZW50cywgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDp1c2UgY29uZmlnIGNoZWNrIGZvciBhdXRvLWhpZ2h0IGFuZCBjb252ZXJ0IHR5cGUgcHJvcGVybHlcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVmQ29tcG9uZW50IGFzIHVua25vd24gYXMgVCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3cgZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgY29ubmVjdFJlZnMgPSBhc3luYyAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdLCB3aXRob3V0UmVmQ29tcG9uZW50czogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XG5cbiAgICBpZiAoIWNvbXBvbmVudC5yZWZzKVxuICAgICAgICBjb21wb25lbnQucmVmcyA9IHt9O1xuXG4gICAgY29uc3Qgd2FpdEZvciA9IE9iamVjdC52YWx1ZXMoY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVmcykubWFwKHJlZiA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVmLmJlaGF2aW9yLnR5cGUgPT0gUmVmQmVoYXZpb3JUeXBlLmNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9XG5cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFJlZkNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50LlxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoYW5nZSB0byBnZXQgaXQgZnJvbSB0aGUgZmxvd1xuICAgICAgICAgICAgICAgIGxldCByZWZDb21wb25lbnRJZCA9IChyZWYuYmVoYXZpb3IgYXMgSUNvbXBvbmVudFJlZkJlaGF2aW9yKS5jb21wb25lbnRJZDtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZkNvbXBvbmVudElkKVxuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnRJZCA9IChyZWYuYmVoYXZpb3IgYXMgSUNvbXBvbmVudFJlZkJlaGF2aW9yKS5pbnN0YW5jZS5jb21wb25lbnRJZFxuXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJlamVjdChuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIC8vdGhyb3cgbmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCByZXNvbHZlZERlZmluaXRpb25zIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zIS5maW5kKGNvbXBkZWYgPT4gY29tcGRlZi5pZCA9PT0gcmVmQ29tcG9uZW50SWQpITtcbiAgICAgICAgICAgICAgICAvLyAvL2NvbnN0IGNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSBhd2FpdCBnZXRDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKGNvbXBvbmVudEluc3RhbmNlQ29uZmlnLmNvbXBvbmVudElkKTtcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGlmICghY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykge1xuICAgICAgICAgICAgICAgIC8vICAgICByZWplY3QobmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCByZXNvbHZlZERlZmluaXRpb25zIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0JykpO1xuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPOiBpZiB3ZSBoYXZlIHRoZSBzYW1lIGNvbXBvbmVudCBtb3JlIHRoYW4gb25jZSB3ZSB3aWxsIG5lZWQgaW5zdGFuY2UgaWQgaGVyZSAuLi5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnRDb25maWcgPSBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzPy5maW5kKG5lc3RlZENvbXBvbmVudCA9PiBuZXN0ZWRDb21wb25lbnQudHlwZS5pZCA9PT0gcmVmQ29tcG9uZW50SWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFuZXN0ZWRDb21wb25lbnRDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCBuZXN0ZWRDb21wb25lbnRDb25maWcgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vY29uc3QgY29tcG9uZW50SW5zdGFuY2VDb25maWcgPSBjb21wb25lbnRDb25maWcuaW5zdGFuY2UubmVzdGVkQ29tcG9uZW50cz8uZmluZChjb21wb25lbnRJbnN0YWNlID0+IGNvbXBvbmVudEluc3RhY2UuY29tcG9uZW50SWQgPT09IGNvbXBvbmVudERlZmluaXRpb25Db25maWcuaWQpO1xuICAgICAgICAgICAgICAgIC8vIGlmKCFjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKXtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdUT0RPIFRPRE8gVE9ETyAnKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6dGhpbmsgYWJvdXQgdGhhdCA6XG4gICAgICAgICAgICAgICAgLy8gICBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLnJlc29sdmVkRGVmaW5pdGlvbnMgPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zO1xuICAgICAgICAgICAgICAgIC8vICAgY29uc3QgbmVzdGVkQ29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnID0ge1xuICAgICAgICAgICAgICAgIC8vICAgICAgIGluc3RhbmNlOiBuZXN0ZWRDb21wb25lbnRDb25maWcuaW5zdGFuY2UhLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIHR5cGU6IG5lc3RlZENvbXBvbmVudENvbmZpZy50eXBlLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIG5hbWU6IG5lc3RlZENvbXBvbmVudENvbmZpZy5uYW1lXG4gICAgICAgICAgICAgICAgLy8gICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBfcmVmID0gUmVmLmNyZWF0ZSgnJywgcmVmLCBjb21wb25lbnQpO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbmVzdGVkICEhIGNyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50ID0gYXdhaXQgY3JlYXRlUmVmQ29tcG9uZW50KF9yZWYsIG5lc3RlZENvbXBvbmVudENvbmZpZyEsIGNvbXBvbmVudHMpXG4gICAgICAgICAgICAgICAgICAgIC8vVERPTyA6IHB1dCB0aGF0IHJlZiBjb21wb25lbnQgc29tZXdoZXJlP1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYubmFtZV0gPSBuZXN0ZWRDb21wb25lbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX19ub25Qcm94aWVkID0gUmVmLmNyZWF0ZSgnJywgcmVmLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYubmFtZV0gPSBjcmVhdGVSZWZQcm94eShfX25vblByb3hpZWQsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoJz8nKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9KVxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRGb3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICB0aHJvdyBlO1xuICAgIH1cblxufVxuXG5leHBvcnQgdHlwZSBwcm9wVHlwZXM8VCBleHRlbmRzIGNvbXBvbmVudERlZmluaXRpb25Qcm9wcz4gPSB7XG4gICAgW1Byb3BlcnR5IGluIGtleW9mIFRdOlxuICAgIFRbUHJvcGVydHldIGV4dGVuZHMgeyBtb2RlOiAnaW5wdXQnIH0gP1xuICAgICAgICBUW1Byb3BlcnR5XVsndHlwZSddIDpcbiAgICAgICAgUHJvbWlzZTxUW1Byb3BlcnR5XVsndHlwZSddPlxufVxuXG5leHBvcnQgY29uc3QgZXhlYyA9IGFzeW5jIChnZXR0ZXI6IGFueSkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBnZXR0ZXIoKVxufVxuXG5leHBvcnQgY29uc3QgYWN0QXMgPSA8VD4ocmVmOiBSZWYpID0+IHtcbiAgICByZXR1cm4gcmVmIGFzIHVua25vd24gYXMgRnVuY3Rpb25pZnlSZWY8VD5cbn1cblxuZXhwb3J0IHR5cGUgRnVuY3Rpb25pZnlSZWY8VCA9IGFueT4gPSB7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgQSkgPT4gaW5mZXIgUiAvLyBJZiBpdCdzIGEgZnVuY3Rpb25cbiAgICAgICAgPyAoLi4uYXJnczogQSkgPT4gUHJvbWlzZTxSPiAvLyBDb252ZXJ0IGl0IHRvIGEgcHJvbWlzZWQgZnVuY3Rpb25cbiAgICAgICAgOiBUW0tdXG59O1xuIiwgImltcG9ydCB7QXV0b1NpemVPcHRpb25zLCBCYXNlTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEV4ZWN1dGVDb21wb25lbnRNZXRob2QsXG4gICAgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIE1lc3NhZ2VEaXJlY3Rpb24sIFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZVxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzLnRzXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wSWZyYW1lQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgcHJpdmF0ZSBfYXV0b1NpemVDbGVhbnVwPzogQ2xlYW51cEhhbmRsZXI7XG4gICAgcHJpdmF0ZSBfYXV0b1NpemVPcHRpb25zPzogQXV0b1NpemVPcHRpb25zO1xuICAgIHByaXZhdGUgX2F1dG9TaXplVXBkYXRlPzogKCkgPT4gdm9pZDtcblxuICAgIC8vIFx1MjUwMFx1MjUwMCBJc29sYXRpb24gKHNhbmRib3hlZCBjcm9zcy1vcmlnaW4gZnJhbWUpIFx1MjAxNCBwb3N0TWVzc2FnZSBicmlkZ2UsIGhvc3Qgc2lkZSBcdTI1MDBcdTI1MDBcbiAgICBwdWJsaWMgaXNvbGF0ZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9sYXN0RGF0YT86IHVua25vd247ICAgICAgICAgICAgICAgLy8gY2FjaGVkIGxhc3Qtc2VudCBkYXRhIChzeW5jIGdldERhdGEpXG4gICAgcHJpdmF0ZSBfY3RhSGFuZGxlcj86IChhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93bikgPT4gdm9pZDtcbiAgICBwcml2YXRlIF9jdGFRdWV1ZTogQXJyYXk8eyBhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93biB9PiA9IFtdO1xuICAgIHByaXZhdGUgX2lzb01zZ0hhbmRsZXI/OiAoZTogTWVzc2FnZUV2ZW50KSA9PiB2b2lkO1xuICAgIHByaXZhdGUgX2lzb1NpemVPcHRzPzogQXV0b1NpemVPcHRpb25zO1xuICAgIHByaXZhdGUgX2lzb0F1dG9TaXplID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJyaWRnZSBzaXppbmcgb25seSB3aGVuIGF1dG8tc2l6ZSBpcyBvblxuICAgIHByaXZhdGUgX2lzb0xhc3RTaXplPzogeyBoZWlnaHQ6IG51bWJlciwgd2lkdGg/OiBudW1iZXIgfTsgIC8vIGxhc3QgcmVwb3J0ZWQgc2l6ZSAoZm9yIHRoZSBlbmFibGUgcmFjZSlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnRDb25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHByaXZhdGUgSWZyYW1lRWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudENvbmZpZywgY29udGFpbmVyLCBvcHRpb25zKVxuXG4gICAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMuSWZyYW1lRWxlbWVudDtcbiAgICAgICAgdGhpcy5fbGFzdERhdGEgPSBvcHRpb25zPy5kYXRhO1xuICAgICAgICAvLyB0aGlzLklmcmFtZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgIC8vICAgICBpZiAodGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdClcbiAgICAgICAgLy8gICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KGBJZnJhbWVFbGVtZW50IGVycm9yYCk7XG4gICAgICAgIC8vIH0pO1xuICAgIH1cblxuICAgIHNpemVNZXRhPzogeyB3aWR0aD86IHN0cmluZyB8IG51bWJlcjsgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyOyBtaW5XaWR0aD86IG51bWJlcjsgbWF4V2lkdGg/OiBudW1iZXI7IG1pbkhlaWdodD86IG51bWJlcjsgbWF4SGVpZ2h0PzogbnVtYmVyIH0gfCBudWxsO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIElzb2xhdGlvbiBicmlkZ2UgKGhvc3Qgc2lkZSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLyoqIEF0dGFjaCB0aGUgaG9zdC1zaWRlIHBvc3RNZXNzYWdlIGxpc3RlbmVyIGZvciBhIHNhbmRib3hlZCBmcmFtZS4gKi9cbiAgICBlbmFibGVJc29sYXRpb24oKSB7XG4gICAgICAgIHRoaXMuaXNvbGF0ZWQgPSB0cnVlO1xuICAgICAgICAvLyBJc29sYXRlZCBmcmFtZXMgZG9uJ3QgcnVuIHRoZSBJZnJhbWVTREsgaGFuZHNoYWtlIChubyBzYW1lLW9yaWdpbiBpbml0KSxcbiAgICAgICAgLy8gc28gbWFyayBpbml0aWF0ZWQgaW1tZWRpYXRlbHkgXHUyMDE0IGxpa2UgdGhlIGV4dHJhY3RlZCB3ZWIgY29tcG9uZW50IGRvZXMuXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgIHRoaXMuX2lzb01zZ0hhbmRsZXIgPSAoZTogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZS5zb3VyY2UgIT09IHRoaXMuSWZyYW1lRWxlbWVudC5jb250ZW50V2luZG93KSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBkOiBhbnkgPSBlLmRhdGE7XG4gICAgICAgICAgICBpZiAoIWQgfHwgZC5fX215b3AgIT09IHRydWUpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChkLnR5cGUgPT09ICdteW9wOmN0YScpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY3RhSGFuZGxlciAmJiAhdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCkgdGhpcy5fY3RhSGFuZGxlcihkLmFjdGlvbiwgZC5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5fY3RhSGFuZGxlcikgdGhpcy5fY3RhUXVldWUucHVzaCh7IGFjdGlvbjogZC5hY3Rpb24sIHBheWxvYWQ6IGQucGF5bG9hZCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZC50eXBlID09PSAnbXlvcDpzaXplJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5SXNvU2l6ZShkLmhlaWdodCwgZC53aWR0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5faXNvTXNnSGFuZGxlcik7XG4gICAgfVxuXG4gICAgLyoqIERhdGEtaW4gXHUyMDE0IHVuaWZpZWQgd2l0aCB0aGUgZXh0cmFjdGVkLVdDIEFQSS4gUG9zdHMgaW5pdCBvdmVyIHRoZSBicmlkZ2UuICovXG4gICAgaW5pdFdpdGhEYXRhKGRhdGE6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbGFzdERhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQ/LmNvbnRlbnRXaW5kb3c/LnBvc3RNZXNzYWdlKHsgX19teW9wOiB0cnVlLCB0eXBlOiAnbXlvcDppbml0JywgZGF0YSB9LCAnKicpO1xuICAgIH1cblxuICAgIC8qKiBEYXRhLWluIGdldHRlciBcdTIwMTQgcmV0dXJucyB0aGUgbGFzdCBkYXRhIHRoZSBob3N0IHNlbnQgKGNhY2hlZCwgc3luY2hyb25vdXMpLiAqL1xuICAgIGdldERhdGEoKTogdW5rbm93biB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0RGF0YTtcbiAgICB9XG5cbiAgICAvKiogRGF0YS1vdXQgXHUyMDE0IHVuaWZpZWQgd2l0aCB0aGUgZXh0cmFjdGVkLVdDIEFQSS4gRmx1c2hlcyBDVEFzIHF1ZXVlZCBwcmUtaGFuZGxlci4gKi9cbiAgICBzZXRDdGFIYW5kbGVyKGhhbmRsZXI6IChhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93bikgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jdGFIYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgaWYgKHRoaXMuX2N0YVF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXVlID0gWy4uLnRoaXMuX2N0YVF1ZXVlXTtcbiAgICAgICAgICAgIHRoaXMuX2N0YVF1ZXVlID0gW107XG4gICAgICAgICAgICBxdWV1ZS5mb3JFYWNoKGl0ZW0gPT4geyBpZiAoIXRoaXMubWFya2VkRm9yRGlzcG9zZWQpIGhhbmRsZXIoaXRlbS5hY3Rpb24sIGl0ZW0ucGF5bG9hZCk7IH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYXBwbHlJc29TaXplKGhlaWdodDogbnVtYmVyLCB3aWR0aD86IG51bWJlcikge1xuICAgICAgICBpZiAoIWhlaWdodCB8fCBOdW1iZXIuaXNOYU4oaGVpZ2h0KSkgcmV0dXJuO1xuICAgICAgICAvLyBBbHdheXMgcmVtZW1iZXIgdGhlIGxhdGVzdCByZXBvcnRlZCBzaXplIHNvIGl0IGNhbiBiZSBhcHBsaWVkIGlmL3doZW5cbiAgICAgICAgLy8gYXV0by1zaXppbmcgaXMgZW5hYmxlZCBhZnRlciB0aGUgZmlyc3QgbWVzc2FnZSBhcnJpdmVzLlxuICAgICAgICB0aGlzLl9pc29MYXN0U2l6ZSA9IHsgaGVpZ2h0LCB3aWR0aCB9O1xuICAgICAgICAvLyBSZXNwZWN0IGF1dG9TaXplOmZhbHNlIFx1MjAxNCB0aGUgaG9zdCBvd25zIGRpbWVuc2lvbnMsIHNvIGRvbid0IHRvdWNoIHRoZW0uXG4gICAgICAgIGlmICghdGhpcy5faXNvQXV0b1NpemUpIHJldHVybjtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMuX2lzb1NpemVPcHRzO1xuICAgICAgICBjb25zdCB0b051bSA9ICh2OiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQgPT5cbiAgICAgICAgICAgIHYgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICh0eXBlb2YgdiA9PT0gJ251bWJlcicgPyB2IDogKGlzTmFOKHBhcnNlRmxvYXQodikpID8gdW5kZWZpbmVkIDogcGFyc2VGbG9hdCh2KSkpO1xuICAgICAgICBjb25zdCBtaW4gPSB0b051bShvcHRzPy5taW5IZWlnaHQpLCBtYXggPSB0b051bShvcHRzPy5tYXhIZWlnaHQpO1xuICAgICAgICBsZXQgaCA9IGhlaWdodDtcbiAgICAgICAgaWYgKG1pbiAhPT0gdW5kZWZpbmVkICYmIGggPCBtaW4pIGggPSBtaW47XG4gICAgICAgIGlmIChtYXggIT09IHVuZGVmaW5lZCAmJiBoID4gbWF4KSBoID0gbWF4O1xuICAgICAgICAvLyBUcmFuc2l0aW9uIGZyb20gYWJzb2x1dGUgb3ZlcmxheSB0byBkb2N1bWVudCBmbG93IGF0IHRoZSBtZWFzdXJlZCBoZWlnaHQuXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5pbnNldCA9ICdhdXRvJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGggKyAncHgnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICAgIG9wdHM/Lm9uU2l6ZUNoYW5nZT8uKHsgd2lkdGg6IHdpZHRoID8/IHRoaXMuSWZyYW1lRWxlbWVudC5jbGllbnRXaWR0aCwgaGVpZ2h0OiBoLCBhdXRvU2l6aW5nV2lkdGg6IGZhbHNlLCBhdXRvU2l6aW5nSGVpZ2h0OiB0cnVlIH0gYXMgYW55KTtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdD86IENsZWFudXBIYW5kbGVyO1xuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgLy8gVE9ETyA6IHVzZSBiZXR0ZXIgY2hlY2sgZm9yIGluc3BlY3QgbW9kZVxuICAgICAgICBpZiAodGhpcy5jbGVhbnVwSW5zcGVjdCkge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnaW5zcGVjdCBjYWxsIG1vcmUgdGhhbiBvbmNlJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSBzZXREZWJ1Z1N0eWxlKHRoaXMuaWQsICdNeW9wSWZyYW1lQ29tcG9uZW50JywgMTAsIHRoaXMuY29udGFpbmVyLCB0aGlzLklmcmFtZUVsZW1lbnQsIHRoaXMuY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ISgpO1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50fXB4YDtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBvYnNlcnZlU2l6ZUJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3NlbmR9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgc2VuZCh7aGVpZ2h0LCB3aWR0aH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgICAgICAgICByZXR1cm4ge2hlaWdodCwgd2lkdGh9XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3JldC5jb250ZW50LndpZHRofXB4YDtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudC5oZWlnaHR9cHhgO1xuICAgICAgICB9KSk7XG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9ic2VydmVzIHRoZSBpZnJhbWUgY29udGVudCBzaXplIGFuZCBhdXRvbWF0aWNhbGx5IHN5bmNzIGl0IHRvIHRoZSBpZnJhbWUgZWxlbWVudC5cbiAgICAgKiBVc2VzIGRpcmVjdCBjb250ZW50RG9jdW1lbnQgYWNjZXNzIChzYW1lLW9yaWdpbiBvbmx5KSBmb3IgYWNjdXJhdGUgbWVhc3VyZW1lbnRzLlxuICAgICAqXG4gICAgICogUmVlbnRyYW50OiB3aGVuIGNhbGxlZCBhZ2FpbiB3aGlsZSBvYnNlcnZlcnMgYWxyZWFkeSBleGlzdCwgdXBkYXRlcyBvcHRpb25zIGFuZFxuICAgICAqIHJlLWV2YWx1YXRlcyBzaXppbmcgd2l0aG91dCByZWNyZWF0aW5nIG9ic2VydmVycy4gQ2xlYW51cCArIHJlLWNhbGwgKGUuZy4gUmVhY3RcbiAgICAgKiByZS1yZW5kZXIpIGNyZWF0ZXMgZnJlc2ggb2JzZXJ2ZXJzIHNpbmNlIGNsZWFudXAgY2xlYXJzIHRoZSBleGlzdGluZyBvbmVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nIHNpemUgY2hhbmdlIGNhbGxiYWNrIGFuZCBtaW4vbWF4IGNvbnN0cmFpbnRzXG4gICAgICogQHJldHVybnMgQ2xlYW51cCBmdW5jdGlvbiB0byBzdG9wIG9ic2VydmluZ1xuICAgICAqL1xuICAgIG9ic2VydmVBdXRvU2l6ZSA9IChvcHRpb25zPzogQXV0b1NpemVPcHRpb25zKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgICAgICAvLyBTdG9yZSBvcHRpb25zIHNvIHVwZGF0ZVNpemUgYWx3YXlzIHJlYWRzIHRoZSBsYXRlc3RcbiAgICAgICAgdGhpcy5fYXV0b1NpemVPcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICAvLyBJc29sYXRlZCBmcmFtZXMgY2FuJ3QgYmUgbWVhc3VyZWQgY3Jvc3Mtb3JpZ2luIFx1MjAxNCBzaXppbmcgaXMgZHJpdmVuIGJ5XG4gICAgICAgIC8vICdteW9wOnNpemUnIHBvc3RNZXNzYWdlcyBmcm9tIHRoZSBicmlkZ2UgKHNlZSBfYXBwbHlJc29TaXplKS5cbiAgICAgICAgaWYgKHRoaXMuaXNvbGF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzb1NpemVPcHRzID0gb3B0aW9ucztcbiAgICAgICAgICAgIHRoaXMuX2lzb0F1dG9TaXplID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBtb3N0IHJlY2VudCBicmlkZ2UtcmVwb3J0ZWQgc2l6ZSAoaXQgbWF5IGhhdmUgYXJyaXZlZCBiZWZvcmVcbiAgICAgICAgICAgIC8vIGF1dG8tc2l6aW5nIHdhcyB0dXJuZWQgb24pLlxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzb0xhc3RTaXplKSB0aGlzLl9hcHBseUlzb1NpemUodGhpcy5faXNvTGFzdFNpemUuaGVpZ2h0LCB0aGlzLl9pc29MYXN0U2l6ZS53aWR0aCk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4geyB0aGlzLl9pc29BdXRvU2l6ZSA9IGZhbHNlOyB0aGlzLl9pc29TaXplT3B0cyA9IHVuZGVmaW5lZDsgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG9ic2VydmVycyBhbHJlYWR5IGV4aXN0LCByZS1ldmFsdWF0ZSB3aXRoIG5ldyBvcHRpb25zIGFuZCByZXVzZSB0aGVtXG4gICAgICAgIGlmICh0aGlzLl9hdXRvU2l6ZUNsZWFudXAgJiYgdGhpcy5fYXV0b1NpemVVcGRhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplVXBkYXRlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXV0b1NpemVDbGVhbnVwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWZyYW1lID0gdGhpcy5JZnJhbWVFbGVtZW50O1xuICAgICAgICBjb25zdCBkb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50O1xuXG4gICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICAvLyBDcm9zcy1vcmlnaW4gKHYxIGNvbXBvbmVudHMgb24gdGhlIGN1c3RvbWVyJ3MgZG9tYWluKTogbWVhc3VyZSBpbnNpZGUgdGhlIGZyYW1lLlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZUhlaWdodFZpYUJyaWRnZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhbXAgPSAodmFsdWU6IG51bWJlciwgbWluPzogbnVtYmVyLCBtYXg/OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgICAgICAgICAgaWYgKG1pbiAhPT0gdW5kZWZpbmVkICYmIHZhbHVlIDwgbWluKSByZXR1cm4gbWluO1xuICAgICAgICAgICAgaWYgKG1heCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlID4gbWF4KSByZXR1cm4gbWF4O1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFBhcnNlIENTUyBzaXplIHZhbHVlcyB0byBudW1iZXJzXG4gICAgICAgIGNvbnN0IHBhcnNlU2l6ZSA9ICh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gaXNOYU4ocGFyc2VkKSA/IHVuZGVmaW5lZCA6IHBhcnNlZDtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB1cGRhdGVTaXplID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XG4gICAgICAgICAgICBpZiAoIWNvbnRlbnREb2MpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMuX2F1dG9TaXplT3B0aW9ucztcblxuICAgICAgICAgICAgY29uc3QgbWluV2lkdGggPSBwYXJzZVNpemUob3B0cz8ubWluV2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgbWF4V2lkdGggPSBwYXJzZVNpemUob3B0cz8ubWF4V2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgbWluSGVpZ2h0ID0gcGFyc2VTaXplKG9wdHM/Lm1pbkhlaWdodCk7XG4gICAgICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSBwYXJzZVNpemUob3B0cz8ubWF4SGVpZ2h0KTtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlck1pbkhlaWdodCA9IG9wdHM/LmxvYWRlck1pbkhlaWdodCA/PyA1MDtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSBleHBsaWNpdCBkaW1lbnNpb25zOiBob3N0IG9wdGlvbnMgXHUyMTkyIHNpemVNZXRhIGZpbGwgbW9kZSBcdTIxOTIgd2lkdGggZGVmYXVsdHMgdG8gXCIxMDAlXCJcbiAgICAgICAgICAgIC8vIFdpZHRoIGRlZmF1bHRzIHRvIFwiMTAwJVwiIChibG9jayBlbGVtZW50IGJlaGF2aW9yKSB0byBwcmV2ZW50IHRoZSBzaHJpbmstdG8tMCBtZWFzdXJlbWVudCBidWcuXG4gICAgICAgICAgICAvLyBIZWlnaHQgaGFzIG5vIGRlZmF1bHQgc28gaXQgYXV0by1zaXplcyB0byBjb250ZW50LlxuICAgICAgICAgICAgLy8gT25seSBzaXplTWV0YSBcIjEwMCVcIiAoZmlsbCBtb2RlKSBpcyB0cmVhdGVkIGFzIGV4cGxpY2l0IGFuZCBkaXNhYmxlcyBhdXRvLXNpemluZy5cbiAgICAgICAgICAgIC8vIFBpeGVsIHNpemVNZXRhIHZhbHVlcyAoZS5nLiwgaGVpZ2h0OiAyMDApIGFyZSBpbml0aWFsIGhpbnRzLCBOT1QgZXhwbGljaXQgY29uc3RyYWludHMuXG4gICAgICAgICAgICBjb25zdCBzaXplTWV0YUZpbGxXaWR0aCA9IHRoaXMuc2l6ZU1ldGE/LndpZHRoID09PSBcIjEwMCVcIiA/IFwiMTAwJVwiIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3Qgc2l6ZU1ldGFGaWxsSGVpZ2h0ID0gdGhpcy5zaXplTWV0YT8uaGVpZ2h0ID09PSBcIjEwMCVcIiA/IFwiMTAwJVwiIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRFeHBsaWNpdFdpZHRoID0gb3B0cz8uZXhwbGljaXRXaWR0aCA/PyBzaXplTWV0YUZpbGxXaWR0aCA/PyBcIjEwMCVcIjtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRXhwbGljaXRIZWlnaHQgPSBvcHRzPy5leHBsaWNpdEhlaWdodCA/PyBzaXplTWV0YUZpbGxIZWlnaHQ7XG4gICAgICAgICAgICBjb25zdCBoYXNFeHBsaWNpdFdpZHRoID0gcmVzb2x2ZWRFeHBsaWNpdFdpZHRoICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBoYXNFeHBsaWNpdEhlaWdodCA9IHJlc29sdmVkRXhwbGljaXRIZWlnaHQgIT09IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgLy8gRGV0ZWN0IGNvbGxhcHNlZCBkaW1lbnNpb25zIGZyb20gY29udGFpbmVyICh0aGlzLmNvbnRhaW5lcilcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbGxhcHNlZFdpZHRoID0gY29udGFpbmVyUmVjdC53aWR0aCA9PT0gMDtcbiAgICAgICAgICAgIC8vIENvbnNpZGVyIGNvbGxhcHNlZCBpZiBoZWlnaHQgaXMgMCBPUiBlcXVhbHMgdGhlIGxvYWRlciBtaW5IZWlnaHRcbiAgICAgICAgICAgIGNvbnN0IGNvbGxhcHNlZEhlaWdodCA9IGNvbnRhaW5lclJlY3QuaGVpZ2h0ID09PSAwIHx8IGNvbnRhaW5lclJlY3QuaGVpZ2h0ID09PSBsb2FkZXJNaW5IZWlnaHQ7XG5cbiAgICAgICAgICAgIC8vIERldGVybWluZSB3aGljaCBkaW1lbnNpb25zIHRvIGF1dG8tc2l6ZTpcbiAgICAgICAgICAgIC8vIC0gSWYgZm9yY2VBdXRvU2l6ZSBpcyB0cnVlLCBhdXRvLXNpemUgdW5sZXNzIGV4cGxpY2l0IGRpbWVuc2lvbiBpcyBzZXRcbiAgICAgICAgICAgIC8vIC0gT3RoZXJ3aXNlLCBhdXRvLXNpemUgb25seSBpZiBjb2xsYXBzZWRcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZEF1dG9XaWR0aCA9IG9wdHM/LmZvcmNlQXV0b1NpemVcbiAgICAgICAgICAgICAgICA/ICFoYXNFeHBsaWNpdFdpZHRoXG4gICAgICAgICAgICAgICAgOiAoY29sbGFwc2VkV2lkdGggJiYgIWhhc0V4cGxpY2l0V2lkdGgpO1xuICAgICAgICAgICAgY29uc3Qgc2hvdWxkQXV0b0hlaWdodCA9IG9wdHM/LmZvcmNlQXV0b1NpemVcbiAgICAgICAgICAgICAgICA/ICFoYXNFeHBsaWNpdEhlaWdodFxuICAgICAgICAgICAgICAgIDogKGNvbGxhcHNlZEhlaWdodCAmJiAhaGFzRXhwbGljaXRIZWlnaHQpO1xuXG4gICAgICAgICAgICAvLyBJZiBub3RoaW5nIG5lZWRzIGF1dG8tc2l6aW5nLCBhcHBseSBleHBsaWNpdC9wZXJjZW50YWdlIGRpbWVuc2lvbnNcbiAgICAgICAgICAgIGlmICghc2hvdWxkQXV0b1dpZHRoICYmICFzaG91bGRBdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gdHlwZW9mIHJlc29sdmVkRXhwbGljaXRXaWR0aCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0V2lkdGh9cHhgIDogJzEwMCUnO1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0SGVpZ2h0fXB4YCA6ICcxMDAlJztcblxuICAgICAgICAgICAgICAgIG9wdHM/Lm9uU2l6ZUNoYW5nZT8uKHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0V2lkdGggPT09ICdudW1iZXInID8gcmVzb2x2ZWRFeHBsaWNpdFdpZHRoIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ID09PSAnbnVtYmVyJyA/IHJlc29sdmVkRXhwbGljaXRIZWlnaHQgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9TaXppbmdXaWR0aDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9TaXppbmdIZWlnaHQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRGlzYWJsZSBDU1MgdHJhbnNpdGlvbnMgb24gaWZyYW1lIGFuZCBjb250YWluZXIgZm9yIHRoZSBlbnRpcmVcbiAgICAgICAgICAgIC8vIG1lYXN1cmVtZW50ICsgaGVpZ2h0LXNldHRpbmcgY3ljbGUuIEhvc3QgYXBwcyBtYXkgc2V0IGB0cmFuc2l0aW9uOiBhbGxgXG4gICAgICAgICAgICAvLyB3aGljaCB3b3VsZCBhbmltYXRlIHRoZSAwcHggY29sbGFwc2UgYW5kIGZpbmFsIGhlaWdodCBjaGFuZ2UsIGNhdXNpbmdcbiAgICAgICAgICAgIC8vIHZpc2libGUganVtcHMgZHVyaW5nIHNjcm9sbC5cbiAgICAgICAgICAgIGNvbnN0IHByZXZUcmFuc2l0aW9uID0gaWZyYW1lLnN0eWxlLnRyYW5zaXRpb247XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgICAgIGNvbnN0IHByZXZDb250YWluZXJUcmFuc2l0aW9uID0gY29udGFpbmVyLnN0eWxlLnRyYW5zaXRpb247XG4gICAgICAgICAgICBpZnJhbWUuc3R5bGUudHJhbnNpdGlvbiA9ICdub25lJztcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuXG4gICAgICAgICAgICAvLyBRdWljayBwcmUtY2hlY2s6IHJlYWQgc2Nyb2xsSGVpZ2h0L1dpZHRoIEJFRk9SRSBjb2xsYXBzaW5nIHRoZSBpZnJhbWUuXG4gICAgICAgICAgICAvLyBJZiBjb250ZW50IG9ubHkgZ3JldyAoc2Nyb2xsSGVpZ2h0ID4gaWZyYW1lIGhlaWdodCksIHdlIGNhbiBza2lwIHRoZVxuICAgICAgICAgICAgLy8gMHB4IGNvbGxhcHNlIFx1MjAxNCBzY3JvbGxIZWlnaHQgbmF0dXJhbGx5IGV4cGFuZHMgYmV5b25kIHRoZSBpZnJhbWUuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SWZyYW1lSGVpZ2h0ID0gaWZyYW1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJZnJhbWVXaWR0aCA9IGlmcmFtZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgICAgIGNvbnN0IHByZVNjcm9sbEhlaWdodCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpKTtcbiAgICAgICAgICAgIGNvbnN0IHByZVNjcm9sbFdpZHRoID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCkpO1xuXG4gICAgICAgICAgICBsZXQgY29udGVudFdpZHRoID0gcHJlU2Nyb2xsV2lkdGg7XG4gICAgICAgICAgICBsZXQgY29udGVudEhlaWdodCA9IHByZVNjcm9sbEhlaWdodDtcblxuICAgICAgICAgICAgY29uc3QgaGVpZ2h0R3JldyA9IHNob3VsZEF1dG9IZWlnaHQgJiYgcHJlU2Nyb2xsSGVpZ2h0ID4gY3VycmVudElmcmFtZUhlaWdodCArIDE7XG4gICAgICAgICAgICBjb25zdCB3aWR0aEdyZXcgPSBzaG91bGRBdXRvV2lkdGggJiYgcHJlU2Nyb2xsV2lkdGggPiBjdXJyZW50SWZyYW1lV2lkdGggKyAxO1xuXG4gICAgICAgICAgICAvLyBGb3Igbm9uLWdyb3cgY2FzZXMgKHNocmluayBvciBuby1jaGFuZ2UpLCB3ZSBtdXN0IGNvbGxhcHNlIHRvIDBweCB0b1xuICAgICAgICAgICAgLy8gbWVhc3VyZSB0aGUgdHJ1ZSBjb250ZW50IGhlaWdodC4gc2Nyb2xsSGVpZ2h0IGNhbiBuZXZlciBkZWNyZWFzZSBiZWxvd1xuICAgICAgICAgICAgLy8gdGhlIGlmcmFtZSdzIGNsaWVudEhlaWdodCwgc28gc2hyaW5rIGlzIHVuZGV0ZWN0YWJsZSB3aXRob3V0IGNvbGxhcHNpbmcuXG4gICAgICAgICAgICAvLyBXaXRoIHRyYW5zaXRpb25zIGRpc2FibGVkICsgY29udGFpbmVyIG1pbi1oZWlnaHQgaGVsZCwgdGhlIGNvbGxhcHNlXG4gICAgICAgICAgICAvLyBpcyBpbnZpc2libGUgKG5vIGxheW91dCBzaGlmdCwgbm8gYW5pbWF0aW9uKS5cbiAgICAgICAgICAgIGNvbnN0IG5lZWRzSGVpZ2h0Q29sbGFwc2UgPSBzaG91bGRBdXRvSGVpZ2h0ICYmICFoZWlnaHRHcmV3O1xuICAgICAgICAgICAgY29uc3QgbmVlZHNXaWR0aENvbGxhcHNlID0gc2hvdWxkQXV0b1dpZHRoICYmICF3aWR0aEdyZXc7XG5cbiAgICAgICAgICAgIGlmIChuZWVkc0hlaWdodENvbGxhcHNlIHx8IG5lZWRzV2lkdGhDb2xsYXBzZSkge1xuICAgICAgICAgICAgICAgIC8vIEhvbGQgdGhlIGNvbnRhaW5lcidzIG1pbi1oZWlnaHQvd2lkdGggZHVyaW5nIG1lYXN1cmVtZW50IHRvIHByZXZlbnRcbiAgICAgICAgICAgICAgICAvLyBsYXlvdXQgc2hpZnQgKGVsZW1lbnRzIGJlbG93IHRoZSBpZnJhbWUgd29uJ3QganVtcCkuXG4gICAgICAgICAgICAgICAgY29uc3QgcHJldk1pbkhlaWdodCA9IGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldk1pbldpZHRoID0gY29udGFpbmVyLnN0eWxlLm1pbldpZHRoO1xuICAgICAgICAgICAgICAgIGlmIChuZWVkc0hlaWdodENvbGxhcHNlKSBjb250YWluZXIuc3R5bGUubWluSGVpZ2h0ID0gYCR7Y3VycmVudElmcmFtZUhlaWdodH1weGA7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzV2lkdGhDb2xsYXBzZSkgY29udGFpbmVyLnN0eWxlLm1pbldpZHRoID0gYCR7Y3VycmVudElmcmFtZVdpZHRofXB4YDtcblxuICAgICAgICAgICAgICAgIGlmIChuZWVkc0hlaWdodENvbGxhcHNlKSBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gJzBweCc7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzV2lkdGhDb2xsYXBzZSkgaWZyYW1lLnN0eWxlLndpZHRoID0gJzBweCc7XG5cbiAgICAgICAgICAgICAgICBjb250ZW50V2lkdGggPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKSk7XG4gICAgICAgICAgICAgICAgY29udGVudEhlaWdodCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpKTtcblxuICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBpZiBjb2xsYXBzaW5nIHRvIDBweCBnYXZlIGEgbmVhci16ZXJvIG1lYXN1cmVtZW50LCB0aGUgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgLy8gbGlrZWx5IGhhcyBgaGVpZ2h0OiAxMDAlYCBjaGFpbnMgKGh0bWwgPiBib2R5ID4gLmFwcC1jb250YWluZXIpIHRoYXQgY2FzY2FkZWRcbiAgICAgICAgICAgICAgICAvLyB0aGUgY29sbGFwc2UgaW50byBhbGwgY2hpbGRyZW4uIFJldHJ5IHdpdGggYSBudWNsZWFyIG92ZXJyaWRlIHRoYXQgZm9yY2VzIGFsbFxuICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRvIGludHJpbnNpYyBzaXppbmcuIFRoaXMgaXMgb25seSBhIGZhbGxiYWNrIGJlY2F1c2UgdGhlIG92ZXJyaWRlXG4gICAgICAgICAgICAgICAgLy8gYnJlYWtzIGV4cGxpY2l0IHBpeGVsIGhlaWdodHMgKGUuZy4gOHB4IGluZGljYXRvciBkb3RzIFx1MjE5MiAwcHgpLlxuICAgICAgICAgICAgICAgIGNvbnN0IG5lZWRzTnVjbGVhckhlaWdodCA9IG5lZWRzSGVpZ2h0Q29sbGFwc2UgJiYgY29udGVudEhlaWdodCA8IDI7XG4gICAgICAgICAgICAgICAgY29uc3QgbmVlZHNOdWNsZWFyV2lkdGggPSBuZWVkc1dpZHRoQ29sbGFwc2UgJiYgY29udGVudFdpZHRoIDwgMjtcbiAgICAgICAgICAgICAgICBpZiAobmVlZHNOdWNsZWFySGVpZ2h0IHx8IG5lZWRzTnVjbGVhcldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lYXN1cmVTdHlsZSA9IGNvbnRlbnREb2MuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVN0eWxlLmlkID0gJ19fbXlvcF9tZWFzdXJlJztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVsZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZWVkc051Y2xlYXJIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzLnB1c2goJ2hlaWdodDogYXV0byAhaW1wb3J0YW50JywgJ21pbi1oZWlnaHQ6IDAgIWltcG9ydGFudCcsICdtYXgtaGVpZ2h0OiBub25lICFpbXBvcnRhbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobmVlZHNOdWNsZWFyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzLnB1c2goJ3dpZHRoOiBhdXRvICFpbXBvcnRhbnQnLCAnbWluLXdpZHRoOiAwICFpbXBvcnRhbnQnLCAnbWF4LXdpZHRoOiBub25lICFpbXBvcnRhbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlU3R5bGUudGV4dENvbnRlbnQgPSBgKiwgKjo6YmVmb3JlLCAqOjphZnRlciB7ICR7cnVsZXMuam9pbignOyAnKX07IGZsZXgtYmFzaXM6IGF1dG8gIWltcG9ydGFudDsgZmxleC1ncm93OiAwICFpbXBvcnRhbnQ7IH1gO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RG9jLmhlYWQuYXBwZW5kQ2hpbGQobWVhc3VyZVN0eWxlKTtcblxuICAgICAgICAgICAgICAgICAgICBjb250ZW50V2lkdGggPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRIZWlnaHQgPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVN0eWxlLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgY29udGFpbmVyIGNvbnN0cmFpbnRzIGltbWVkaWF0ZWx5IChzYW1lIGZyYW1lLCBiZWZvcmUgcGFpbnQpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLm1pbkhlaWdodCA9IHByZXZNaW5IZWlnaHQ7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLm1pbldpZHRoID0gcHJldk1pbldpZHRoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGNsYW1wKGNvbnRlbnRXaWR0aCwgbWluV2lkdGgsIG1heFdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGNsYW1wKGNvbnRlbnRIZWlnaHQsIG1pbkhlaWdodCwgbWF4SGVpZ2h0KTtcblxuICAgICAgICAgICAgLy8gU2V0IGF1dG8tc2l6ZWQgZGltZW5zaW9ucyB0byBtZWFzdXJlZCB2YWx1ZXMsIG5vbi1hdXRvIHRvIGV4cGxpY2l0LzEwMCVcbiAgICAgICAgICAgIGlmIChzaG91bGRBdXRvV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS53aWR0aCA9IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0V2lkdGggPT09ICdudW1iZXInID8gYCR7cmVzb2x2ZWRFeHBsaWNpdFdpZHRofXB4YCA6ICcxMDAlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaG91bGRBdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0SGVpZ2h0fXB4YCA6ICcxMDAlJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRm9yY2UgcmVmbG93IHNvIHRoZSBmaW5hbCBkaW1lbnNpb25zIGFyZSBhcHBsaWVkIHdpdGhvdXQgdHJhbnNpdGlvbixcbiAgICAgICAgICAgIC8vIHRoZW4gcmVzdG9yZSB0aGUgb3JpZ2luYWwgdHJhbnNpdGlvbnMuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG4gICAgICAgICAgICBpZnJhbWUub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgaWZyYW1lLnN0eWxlLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS50cmFuc2l0aW9uID0gcHJldkNvbnRhaW5lclRyYW5zaXRpb247XG5cbiAgICAgICAgICAgIC8vIERvbid0IGZvcmNlIG92ZXJmbG93IFx1MjAxNCBsZXQgdGhlIGNvbXBvbmVudC9wYXJlbnQgY29udHJvbCBzY3JvbGxpbmcuXG4gICAgICAgICAgICAvLyBPbmx5IHNldCBvdmVyZmxvdzogYXV0byB3aGVuIGNvbnRlbnQgZXhjZWVkcyBtYXggY29uc3RyYWludHMuXG4gICAgICAgICAgICBjb25zdCBpc1dpZHRoQ29uc3RyYWluZWQgPSBzaG91bGRBdXRvV2lkdGggJiYgbWF4V2lkdGggIT09IHVuZGVmaW5lZCAmJiBjb250ZW50V2lkdGggPiBtYXhXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGlzSGVpZ2h0Q29uc3RyYWluZWQgPSBzaG91bGRBdXRvSGVpZ2h0ICYmIG1heEhlaWdodCAhPT0gdW5kZWZpbmVkICYmIGNvbnRlbnRIZWlnaHQgPiBtYXhIZWlnaHQ7XG4gICAgICAgICAgICBjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvd1ggPSBpc1dpZHRoQ29uc3RyYWluZWQgPyAnYXV0bycgOiAnJztcbiAgICAgICAgICAgIGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IGlzSGVpZ2h0Q29uc3RyYWluZWQgPyAnYXV0bycgOiAnJztcblxuICAgICAgICAgICAgb3B0cz8ub25TaXplQ2hhbmdlPy4oe1xuICAgICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgICAgICBhdXRvU2l6aW5nV2lkdGg6IHNob3VsZEF1dG9XaWR0aCxcbiAgICAgICAgICAgICAgICBhdXRvU2l6aW5nSGVpZ2h0OiBzaG91bGRBdXRvSGVpZ2h0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBJbml0aWFsIHNpemUgKHJ1biBzeW5jaHJvbm91c2x5LCBub3QgZGVib3VuY2VkKVxuICAgICAgICB1cGRhdGVTaXplKCk7XG5cbiAgICAgICAgLy8gU3RvcmUgdXBkYXRlU2l6ZSBmb3IgcmVlbnRyYW50IGNhbGxzXG4gICAgICAgIHRoaXMuX2F1dG9TaXplVXBkYXRlID0gdXBkYXRlU2l6ZTtcblxuICAgICAgICAvLyBEZWJvdW5jZSBvYnNlcnZlciBjYWxsYmFja3MgdmlhIHJBRiBcdTIwMTQgYXQgbW9zdCBvbmUgdXBkYXRlU2l6ZSBwZXIgZnJhbWUuXG4gICAgICAgIC8vIFByZXZlbnRzIGxheW91dCB0aHJhc2hpbmcgZnJvbSBoaWdoLWZyZXF1ZW5jeSBtdXRhdGlvbnMgKGUuZy4gQ1NTIGFuaW1hdGlvbnMpLlxuICAgICAgICBsZXQgcmFmSWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc2NoZWR1bGVVcGRhdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAocmFmSWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJhZklkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHVwZGF0ZVNpemUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE9ic2VydmUgZm9yIGNoYW5nZXNcbiAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gc2NoZWR1bGVVcGRhdGUoKSk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZG9jLmJvZHkpO1xuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGRvYy5kb2N1bWVudEVsZW1lbnQpO1xuXG4gICAgICAgIC8vIE11dGF0aW9uT2JzZXJ2ZXIgY2F0Y2hlcyBET00gY29udGVudCBjaGFuZ2VzIChlLmcuIHJlbW92aW5nIGxpc3QgaXRlbXMsIHRvZ2dsaW5nIHZpZXdzKVxuICAgICAgICAvLyB0aGF0IGRvbid0IHRyaWdnZXIgUmVzaXplT2JzZXJ2ZXIgYmVjYXVzZSB0aGUgYm9keSBib3gtc2l6ZSBzdGF5cyB0aGUgc2FtZVxuICAgICAgICAvLyAoYm9keSBmaWxscyBpZnJhbWUsIGlmcmFtZSBoYXNuJ3Qgc2hydW5rIHlldCkuXG4gICAgICAgIC8vIGBhdHRyaWJ1dGVzOiB0cnVlYCBjYXRjaGVzIENTUyBjbGFzcy9zdHlsZSBjaGFuZ2VzIChlLmcuIGRpc3BsYXk6bm9uZSB0b2dnbGluZyB2aWV3cykuXG4gICAgICAgIGNvbnN0IG11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiBzY2hlZHVsZVVwZGF0ZSgpKTtcbiAgICAgICAgbXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKGRvYy5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZSwgYXR0cmlidXRlczogdHJ1ZSB9KTtcblxuICAgICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgbXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICBpZiAocmFmSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcbiAgICAgICAgICAgICAgICByYWZJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplVXBkYXRlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVDbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAgPSBjbGVhbnVwO1xuICAgICAgICByZXR1cm4gY2xlYW51cDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9icmlkZ2VTaXplQ2xlYW51cD86IENsZWFudXBIYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogQXV0by1oZWlnaHQgZm9yIGEgZnJhbWUgdGhlIGhvc3QgY2FuJ3QgcmVhZCAoY3Jvc3Mtb3JpZ2luKS4gUnVucyBhZnRlciB0aGUgSWZyYW1lU0RLXG4gICAgICogaGFuZHNoYWtlOiB0aGUgZnJhbWUgcmVwb3J0cyBib2R5IHJlc2l6ZXMgYW5kIHRoZSBob3N0IHJlLXJlYWRzIHRoZSBzY3JvbGwgaGVpZ2h0LlxuICAgICAqL1xuICAgIG9ic2VydmVIZWlnaHRWaWFCcmlkZ2UgPSAoKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgICAgICBpZiAodGhpcy5fYnJpZGdlU2l6ZUNsZWFudXApIHJldHVybiB0aGlzLl9icmlkZ2VTaXplQ2xlYW51cDtcblxuICAgICAgICBsZXQgb2JzZXJ2ZXJDbGVhbnVwOiBDbGVhbnVwSGFuZGxlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgICAgb2JzZXJ2ZXJDbGVhbnVwPy4oKTtcbiAgICAgICAgICAgIHRoaXMuX2JyaWRnZVNpemVDbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9icmlkZ2VTaXplQ2xlYW51cCA9IGNsZWFudXA7XG5cbiAgICAgICAgdGhpcy5pbml0aWF0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzdG9wcGVkIHx8IHRoaXMubWFya2VkRm9yRGlzcG9zZWQpIHJldHVybjtcbiAgICAgICAgICAgIC8vIExlYXZlIHRoZSBhYnNvbHV0ZSAxMDAlIG92ZXJsYXkgYW5kIHRha2UgcGFydCBpbiB0aGUgY29udGFpbmVyJ3MgbGF5b3V0LlxuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5pbnNldCA9ICdhdXRvJztcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuICAgICAgICAgICAgb2JzZXJ2ZXJDbGVhbnVwID0gdGhpcy5zZW5kKG5ldyBTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UoKSk7XG4gICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAvLyBOb3QgZmF0YWw6IHRoZSBjb21wb25lbnQgc3RpbGwgcmVuZGVycywgaXQganVzdCBuZXZlciBnZXRzIGEgaGVpZ2h0IGFuZCBzaXRzXG4gICAgICAgICAgICAvLyBhdCB0aGUgaWZyYW1lIGRlZmF1bHQuIFdpdGhvdXQgdGhpcyBsaW5lIHRoYXQgaXMgY29tcGxldGVseSBpbnZpc2libGUgLS1cbiAgICAgICAgICAgIC8vIG5vdGhpbmcgdGhyb3dzLCBub3RoaW5nIGxvZ3MsIGFuZCB0aGUgb25seSBzeW1wdG9tIGlzIGEgMTUwcHggZnJhbWUuIEFcbiAgICAgICAgICAgIC8vIHNpbGVudCBzaXppbmcgZmFpbHVyZSBvZiBleGFjdGx5IHRoaXMgc2hhcGUgaXMgd2hhdCBtYWRlIHRoZSBpbml0IHJhY2VcbiAgICAgICAgICAgIC8vICgyMDI2LTEwLTE3LCBzZWUgSU5JVC1IQU5EU0hBS0UubWQpIHRha2UgZm91ciBkYXlzIHRvIGZpbmQ6IGluaXRpYXRlZCgpXG4gICAgICAgICAgICAvLyByZWplY3RlZCwgdGhpcyBjYXRjaCBzd2FsbG93ZWQgaXQsIGFuZCBhdXRvLWhlaWdodCBzaW1wbHkgbmV2ZXIgaGFwcGVuZWQuXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFtNeW9wSWZyYW1lQ29tcG9uZW50XSBhdXRvLWhlaWdodCBza2lwcGVkIGZvciAke3RoaXMuaWR9OiAke2V9YCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjbGVhbnVwO1xuICAgIH1cblxuICAgIHNldFNpemVCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHtoZWlnaHQsIHdpZHRofVxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtyZXQuY29udGVudC53aWR0aH1weGA7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnQuaGVpZ2h0fXB4YDtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgLy8gcmV0dXJuIHdpbmRvdy5kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCArICdweCc7XG5cblxuICAgICAgICAgICAgLy9UT0RPOiBmaXggdGhhdCBoYWNrLCBrZWVwIHRoZSBmdW5jdGlvbiBpbiByaWdodCBmb3JtYXQgd2hpbGUgbWluaWZpZWQgOihcbiAgICAgICAgICAgIGNvbnN0IG5vT3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZFxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVG8gZW5zdXJlIGl0J3Mgbm90IG9wdGltaXplZCBhd2F5LCB5b3UgY2FuIGNhbGwgaXQgYXQgbGVhc3Qgb25jZVxuICAgICAgICAgICAgbGV0IHggPSBub09wKCk7XG4gICAgICAgICAgICB4Kys7XG4gICAgICAgICAgICB4LS07XG5cbiAgICAgICAgICAgIC8vcmV0dXJuIGAke3dpbmRvdy5kb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodH1weGA7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIHRoYXQgKzEgP1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodClcbiAgICAgICAgICAgICAgICAsIHdpbmRvdy5kb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCkgKyB4ICsgJ3B4J1xuXG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSByZXQuY29udGVudDtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgbGV0IG1lc3NhZ2VfID0gey4uLm1lc3NhZ2V9IGFzIEJhc2VNeW9wTWVzc2FnZTtcbiAgICAgICAgLy9UT0RPIDogPyE/ISBzaG91bGQgaXQgYmUgaGVyZSA/XG4gICAgICAgIGlmIChtZXNzYWdlXy5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVDb21wb25lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChtZXNzYWdlXyBhcyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKVxuICAgICAgICAgICAgdGhpc1t0eXBlZE1lc3NhZ2UubWV0aG9kXSgpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2sgOihcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL2NvbnN0IGhhbmRsZXIgPSBtZXNzYWdlLmhhbmRsZXJcblxuICAgICAgICBtZXNzYWdlXy5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlXyk7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudD8uY29udGVudFdpbmRvdz8ucG9zdE1lc3NhZ2UobWVzc2FnZV8sICcqJyk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL21lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfTtcblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluLk11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlXG4gICAgICAgICAgICB8fCBpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW4uUmVzaXplT2JzZXJ2ZXJNZXNzYWdlKSB7XG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgICAgIC8vdGhpcy5zZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50KCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdXBlci5vbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICB0aGlzLl9icmlkZ2VTaXplQ2xlYW51cD8uKCk7XG4gICAgICAgIGlmICh0aGlzLl9hdXRvU2l6ZUNsZWFudXApIHtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplQ2xlYW51cCgpO1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVDbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pc29Nc2dIYW5kbGVyKSB7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuX2lzb01zZ0hhbmRsZXIpO1xuICAgICAgICAgICAgdGhpcy5faXNvTXNnSGFuZGxlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jbGVhbnVwSW5zcGVjdClcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QoKTtcblxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIC8vIE9wdGlvbmFsLWNoYWluZWQ6IGRpc3Bvc2Ugbm93IGFsc28gcnVucyBmb3IgY29tcG9uZW50cyB0aGF0IG5ldmVyIGluaXRpYXRlZCwgYW5kXG4gICAgICAgIC8vIGZvciB0aG9zZSB0aGUgZnJhbWUgbWF5IGFscmVhZHkgYmUgZ29uZSAtLSB0aGUgZGlhbG9nIHRoYXQgY29udGFpbmVkIGl0IHdhcyB0b3JuXG4gICAgICAgIC8vIGRvd24sIG9yIGl0IHdhcyBuZXZlciBhdHRhY2hlZC4gQSB0aHJvdyBoZXJlIHdvdWxkIGFib3J0IHRoZSByZXN0IG9mIHRoZSBjbGVhbnVwLlxuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5JZnJhbWVFbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnLCBTa2luTG9hZGVyVHlwZX0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wTG9hZGVyIHtcbiAgICB0eXBlOiBTa2luTG9hZGVyVHlwZTtcbiAgICBsb2FkOiAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4gUHJvbWlzZTxJTXlvcENvbXBvbmVudD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcExvYWRlciBpbXBsZW1lbnRzIElNeW9wTG9hZGVyIHtcbiAgICBhYnN0cmFjdCB0eXBlOiBTa2luTG9hZGVyVHlwZTtcbiAgICBhYnN0cmFjdCBsb2FkOiAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4gUHJvbWlzZTxJTXlvcENvbXBvbmVudD47XG5cbiAgICBhcHBlbmRDaGlsZCA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBlbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMsKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5yZWxhdGl2ZSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVsYXRpdmUuZGlyZWN0aW9uID09PSAnYmVmb3JlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG9wdGlvbnMucmVsYXRpdmUuY2hpbGQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZS5kaXJlY3Rpb24gPT09ICdhZnRlcicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IG9wdGlvbnMucmVsYXRpdmUuY2hpbGQ/Lm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG5leHRTaWJsaW5nID8gbmV4dFNpYmxpbmcgOiBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wSWZyYW1lQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSUlmcmFtZUxvYWRlckNvbmZpZywgSVNraW5Db25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IGFkZFF1ZXJ5UGFyYW0gPSAodXJsOiBzdHJpbmcsIHBhcmFtOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAvLyBDcmVhdGUgYSBVUkwgb2JqZWN0XG4gICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuXG4gICAgLy8gQWRkIHRoZSBxdWVyeSBwYXJhbWV0ZXJcbiAgICB1cmxPYmouc2VhcmNoUGFyYW1zLmFwcGVuZChwYXJhbSwgdmFsdWUpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSB1cGRhdGVkIFVSTFxuICAgIHJldHVybiB1cmxPYmoudG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBEb2VzIGBmcmFtZWAgYWxyZWFkeSBwb2ludCBhdCBgdXJsYD8gQ29tcGFyZWQgYXMgYWJzb2x1dGUgVVJMcywgaWdub3JpbmcgdGhlIGZyYWdtZW50IGFuZFxuICogYSB0cmFpbGluZyBzbGFzaCBvbiB0aGUgcGF0aDogYC9wYWdlYCBhbmQgYC9wYWdlL2AgYXJlIHRoZSBzYW1lIGRvY3VtZW50IChhIHNpdGUgdGhhdFxuICogcHJlZmVycyBvbmUgMzAxcyB0aGUgb3RoZXIpLCBhbmQgdGhlIHNlcnZlciBtYXkgaGFuZCBvdXQgZWl0aGVyIGZvcm0gLS0gc2VlIHRoZVxuICogdHJhaWxpbmctc2xhc2ggZml4IGluIG15b3Atc2VydmVyJ3MgdjFVcmxOb3JtYWxpemUudHMuIEFuIGVtcHR5IGBzcmNgIGlzIG5ldmVyIGEgbWF0Y2guXG4gKi9cbmNvbnN0IHNob3dzU2FtZVBhZ2UgPSAoZnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50LCB1cmw6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBmcmFtZS5nZXRBdHRyaWJ1dGUoJ3NyYycpO1xuICAgIGlmICghY3VycmVudCB8fCAhdXJsKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qgbm9ybSA9ICh1OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgeCA9IG5ldyBVUkwodSwgZG9jdW1lbnQuYmFzZVVSSSk7XG4gICAgICAgIHguaGFzaCA9ICcnO1xuICAgICAgICBpZiAoeC5wYXRobmFtZS5sZW5ndGggPiAxKSB4LnBhdGhuYW1lID0geC5wYXRobmFtZS5yZXBsYWNlKC9cXC8kLywgJycpO1xuICAgICAgICByZXR1cm4geC5ocmVmO1xuICAgIH07XG4gICAgdHJ5IHsgcmV0dXJuIG5vcm0oY3VycmVudCkgPT09IG5vcm0odXJsKTsgfSBjYXRjaCB7IHJldHVybiBmYWxzZTsgfVxufTtcblxuZXhwb3J0IGNsYXNzIE15b3BJZnJhbWVMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLklmcmFtZUxvYWRlclxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuICAgICAgICBsZXQgSWZyYW1lRWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICAgY29uc3QgdHlwZWRMb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKGNvbnRhaW5lcj8ubm9kZU5hbWUgPT09IFwiSUZSQU1FXCIpIHtcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSAoY29udGFpbmVyIGFzIEhUTUxJRnJhbWVFbGVtZW50KVxuXG4gICAgICAgICAgICAvLyBBRE9QVCBBIEZSQU1FIFRIQVQgSVMgQUxSRUFEWSBTSE9XSU5HIFRISVMgUEFHRSAtLSBETyBOT1QgUkVMT0FEIElULlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIEFzc2lnbmluZyBgc3JjYCBhbHdheXMgbmF2aWdhdGVzLCBldmVuIHRvIHRoZSBpZGVudGljYWwgVVJMLiBTbyBhIGZyYW1lIHRoZVxuICAgICAgICAgICAgLy8gc2VydmVyIHJlbmRlcmVkIGludG8gdGhlIEhUTUwgLS0gd2hpY2ggc3RhcnRlZCBsb2FkaW5nIGluIHRoZSBmaXJzdCBieXRlcyxcbiAgICAgICAgICAgIC8vIGxvbmcgYmVmb3JlIGFueSBzY3JpcHQgcmFuIC0tIHdhcyB0aHJvd24gYXdheSBhbmQgbG9hZGVkIGEgc2Vjb25kIHRpbWUgdGhlXG4gICAgICAgICAgICAvLyBtb21lbnQgdGhlIFNESyB0b29rIGl0IG92ZXIuIFRoYXQgaXMgdGhlIHdob2xlIGdhaW4gb2Ygc2VydmVyLXJlbmRlcmluZyB0aGVcbiAgICAgICAgICAgIC8vIGlmcmFtZSAoXHUyMjEyNjglIHRvIFx1MjIxMjgwJSBpbiB0aGUgMjAyNi0xMC0xMSBsYWIsIEg4KSwgbG9zdC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUaGUgaGFuZHNoYWtlIGRvZXMgbm90IG5lZWQgYSBmcmVzaCBsb2FkOiB0aGUgaG9zdCBzZW5kcyBJbml0TWVzc2FnZSB3aGVuIGl0XG4gICAgICAgICAgICAvLyByZWdpc3RlcnMgdGhlIGNvbXBvbmVudCwgYW5kIGEgZnJhbWUgdGhhdCBib290ZWQgZWFybGllciBhbnN3ZXJzIGl0OyBhIGZyYW1lXG4gICAgICAgICAgICAvLyB0aGF0IGJvb3RzIGxhdGVyIGFubm91bmNlcyBpdHNlbGYgYW5kIGlzIGFuc3dlcmVkIHRoZW4uXG4gICAgICAgICAgICBpZiAoIXNob3dzU2FtZVBhZ2UoSWZyYW1lRWxlbWVudCwgdHlwZWRMb2FkZXJDb25maWcudXJsKSkge1xuICAgICAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3JjID0gdHlwZWRMb2FkZXJDb25maWcudXJsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB1bmlxSWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgIGNvbnN0IGRvbUlkID0gYG15b3AtY29tcC0ke3VuaXFJZH1gXG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICAgICAgLy8gU2V0IGFsbCBzdHlsZXMgQkVGT1JFIGFwcGVuZGluZyB0byBwcmV2ZW50IGZsYXNoIGF0IHdyb25nIHBvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCBpZnJhbWVTdHlsZXMgPSBgXG4gICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgIGluc2V0OiAwO1xuICAgICAgICAgICAgICAgIGhlaWdodDogJHt0eXBlZExvYWRlckNvbmZpZy5hdXRvSGVpZ2h0IHx8ICF0eXBlZExvYWRlckNvbmZpZy5oZWlnaHQgPyAnMTAwJScgOiB0eXBlZExvYWRlckNvbmZpZy5oZWlnaHR9O1xuICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6ICR7b3B0aW9ucz8uaGlkZGVuID8gJzAnIDogJzEnfTtcbiAgICAgICAgICAgICAgICBwb2ludGVyLWV2ZW50czogJHtvcHRpb25zPy5oaWRkZW4gPyAnbm9uZScgOiAnYWxsJ307XG4gICAgICAgICAgICBgO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gaWZyYW1lU3R5bGVzO1xuXG4gICAgICAgICAgICAvLyBTZXQgZWxlbWVudCBhdHRyaWJ1dGVzIGlmIHByb3ZpZGVkXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uZWxlbWVudEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhvcHRpb25zLmVsZW1lbnRBdHRyaWJ1dGVzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNldEF0dHJpYnV0ZShrZXksICcnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gaGFuZGxlIGlzc3VlIHRvIGxvYWQgaWZyYW1lIGluc2lkZSBhbiBpZnJhbWUgd2l0aCB0aGUgc2FtZSB1cmxcbiAgICAgICAgICAgIGxldCB1cmwybG9hZCA9IChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKS51cmw7XG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uX2hhc1BhcmVudClcbiAgICAgICAgICAgICAgICB1cmwybG9hZCA9IGFkZFF1ZXJ5UGFyYW0odXJsMmxvYWQsIFwiX215b3AtY29tcFwiLCB1bmlxSWQpO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNyYyA9IHVybDJsb2FkO1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgICAgICAvLyAgIElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkb21JZCkgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgICAgICAvL05PIDogSWZyYW1lRWxlbWVudCA9IGNvbnRhaW5lci5sYXN0RWxlbWVudENoaWxkIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IE15b3BJZnJhbWVDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAvLyBgYXV0b0hlaWdodGAgaW4gdGhlIHYxIGNvbmZpZyB1c2VkIHRvIG9ubHkgc2V0IGhlaWdodDoxMDAlIG9uIGFuIGFic29sdXRlIGZyYW1lLCBzbyBpbiBhblxuICAgICAgICAvLyB1bnNpemVkIGNvbnRhaW5lciB0aGUgZnJhbWUgc3RheWVkIGF0IHRoZSAxNTBweCBDU1MgZGVmYXVsdC5cbiAgICAgICAgaWYgKHR5cGVkTG9hZGVyQ29uZmlnLmF1dG9IZWlnaHQgJiYgb3B0aW9ucz8uYXV0b1NpemUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjb21wb25lbnQub2JzZXJ2ZUhlaWdodFZpYUJyaWRnZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IG15b3BXZWJjb21wb25lbnRDb25zdHMgPSB7XG4gICAgd2ViY29tcG9uZW50X21lc3NhZ2Vfa2V5OiAnbXlvcF93ZWJjb21wb25lbnRfbWVzc2FnZSdcbn1cbiIsICJpbXBvcnQge215b3BXZWJjb21wb25lbnRDb25zdHN9IGZyb20gXCIuLi8uLi93ZWJjb21wb25lbnQvY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge3NldERlYnVnU3R5bGV9IGZyb20gXCIuLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wV2ViQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHJpdmF0ZSBjdXN0b21FbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoY29tcG9uZW50RGVmaW5pdGlvbiwgY29udGFpbmVyICwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGN1c3RvbUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgY2xlYW51cEluc3BlY3Q6IENsZWFudXBIYW5kbGVyID0gKCkgPT4ge1xuICAgIH1cblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSBzZXREZWJ1Z1N0eWxlKHRoaXMuaWQsICdNeW9wV2ViQ29tcG9uZW50JywgMCwgdGhpcy5jb250YWluZXIsIHRoaXMuY3VzdG9tRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cEluc3BlY3Q7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcxJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3Vuc2V0J1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhbGwnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcnO1xuICAgIH1cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlPGFueT4pID0+IHtcbiAgICAgICAgbGV0IG1lc3NhZ2VfID0gey4uLm1lc3NhZ2V9IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAvL1RPRE8gOiBjYW4gYmUgZG9uZSB3aXRob3V0IGNsb25pbmc/XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9jb25zdCBoYW5kbGVyID0gbWVzc2FnZV8uaGFuZGxlclxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZV8pO1xuXG4gICAgICAgIGNvbnN0IG1zZyA9IG5ldyBDdXN0b21FdmVudDxCYXNlTXlvcE1lc3NhZ2U+KG15b3BXZWJjb21wb25lbnRDb25zdHMud2ViY29tcG9uZW50X21lc3NhZ2Vfa2V5LCB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBkZXRhaWw6IG1lc3NhZ2VfLFxuICAgICAgICAgICAgLy8gYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIC8vIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgLy8gY29tcG9zZWQ6IHRydWVcbiAgICAgICAgfSlcblxuICAgICAgICAvL3RoaXMuY29udGFpbmVyLmRpc3BhdGNoRXZlbnQobXNnKVxuXG4gICAgICAgIC8vc2VuZGluZyBkYXRhIGZyb20gaG9zdCB0byB0aGUgY29tcG9uZW50XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuZGlzcGF0Y2hFdmVudChtc2cpXG4gICAgICAgICAgICAvLyBpZiAodGhpcy5jdXN0b21FbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5jdXN0b21FbGVtZW50LmNoaWxkcmVuWzBdLmRpc3BhdGNoRXZlbnQobXNnKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGRpc3BhdGNoRXZlbnQnLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9tZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH1cblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKHRoaXMuY3VzdG9tRWxlbWVudCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcFdlYkNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcExvYWRlcn0gZnJvbSBcIi4vSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcbmltcG9ydCB7dXVpZHY0LCB3YWl0fSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnLCBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnLCBTa2luTG9hZGVyc30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5jb25zdCBzZWVuOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PiA9IHt9O1xuXG5leHBvcnQgY2xhc3MgV2ViY29tcG9uZW50TG9hZGVyIGV4dGVuZHMgQmFzZU15b3BMb2FkZXIge1xuXG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLldlYkNvbXBvbmVudExvYWRlclxuXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG5cbiAgICAgICAgY29uc3QgbG9hZGVyQ29uZmlnID0gKHNraW4ubG9hZGVyIGFzIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcpO1xuXG4gICAgICAgIGlmICghc2Vlbltsb2FkZXJDb25maWcudXJsXSkge1xuICAgICAgICAgICAgLy8gYXdhaXQgaW1wb3J0KCAvKiBAdml0ZS1pZ25vcmUgKi8gd2ViQ29tcG9uZW50TG9hZFVybCk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbW9kdWxlIGxvYWRlZCcpO1xuICAgICAgICAgICAgc2Vlbltsb2FkZXJDb25maWcudXJsXSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB3ZWJDb21wb25lbnRMb2FkVXJsID0gbG9hZGVyQ29uZmlnLnVybFxuICAgICAgICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICAgICAgICAgIHNjcmlwdC50eXBlID0gJ21vZHVsZSc7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnNyYyA9IHdlYkNvbXBvbmVudExvYWRVcmw7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNjcmlwdC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdNb2R1bGUgYWxyZWRheSBsb2FkZWQgb3IgaW4gbG9hZGluZyBwcm9jZXNzJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBzZWVuW2xvYWRlckNvbmZpZy51cmxdO1xuXG4gICAgICAgIC8vVE9ETyA6IGFkZCByZXRyeSBtZWNoYW5pc20gaW4gZmFpbCBjYXNlLlxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2ssIHNob3VsZCBmaXggdGhlIHJhY2UgY29uZGl0aW9uIGZvciBsb2FkZWQgbW9kdWxlc1xuICAgICAgICBhd2FpdCB3YWl0KDEpO1xuXG4gICAgICAgIGxldCBkb21JZCA9IGBteW9wLWNvbXAtJHt1dWlkdjQoKX1gXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGxvYWRlckNvbmZpZy50YWcpO1xuXG4gICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgLy9lbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgZWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgIGlmIChvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIChjb250YWluZXIuaWQuc3RhcnRzV2l0aCgnbXlvcC1jb21wLScpKSB7XG4gICAgICAgIC8vICAgICAvLyBpbiBwbGFjZSByZXBsYWNlbWVudFxuICAgICAgICAvLyAgICAgY29udGFpbmVyLnJlcGxhY2VXaXRoKGVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgLy9jb250YWluZXIgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQhO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYob3B0aW9ucz8uX2Vudmlyb25tZW50KXtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsZW1lbnQuX215b3BFbnZpcm9ubWVudCA9IG9wdGlvbnM/Ll9lbnZpcm9ubWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICAgICAgLy9lbGVtZW50LmlubmVySFRNTCA9IGA8JHtsb2FkZXJDb25maWcudGFnfSAvPmA7XG4gICAgICAgIHJldHVybiBuZXcgTXlvcFdlYkNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cblxufVxuIiwgImV4cG9ydCBkZWZhdWx0ICcwLjQuMC1iZXRhLjYnOyIsICIvKipcbiAqIFRoZSBjbGllbnQgd2luZG93OiB3aGF0IGEgcmV0dXJuaW5nIHZpc2l0b3IgZG9lcyBOT1QgYXNrIGZvci5cbiAqXG4gKiBBIGNvbXBvbmVudCB0aGUgYnJvd3NlciBhbHJlYWR5IGhvbGRzLCBzdGlsbCBpbnNpZGUgaXRzIGZyZXNobmVzcyB3aW5kb3csIGlzIHJlbmRlcmVkXG4gKiB3aXRoIG5vIG5ldHdvcmsgYXQgYWxsLiBPbmNlIHRoZSB3aW5kb3cgZW5kcyB0aGUgYnJvd3NlciBkb2VzIG5vdCByZS1kb3dubG9hZCBpdCBlaXRoZXJcbiAqIFx1MjAxNCBpdCBzZW5kcyBiYWNrIHRoZSB2ZXJzaW9uIGl0IGhvbGRzIGFuZCBpcyB1c3VhbGx5IHRvbGQgXCJ1bmNoYW5nZWRcIiBpbiBhIGZldyBodW5kcmVkXG4gKiBieXRlcy5cbiAqXG4gKiBUSEUgV0lORE9XIElTIFRIRSBTRVJWRVInUywgTk9UIE9VUlMuIEl0IGNvbWVzIGZyb20gdGhlIHJlc3BvbnNlOiBgcy1tYXhhZ2VgIGlzIHRoZVxuICogZnJlc2huZXNzIHRoZSBzZXJ2ZXIgcHJvbWlzZWQsIGFuZCBgQWdlYCBpcyBob3cgbXVjaCBvZiBpdCBhIENETiBhbHJlYWR5IHNwZW50IGJlZm9yZVxuICogdGhlIGJ5dGVzIHJlYWNoZWQgdXMuIFRoZSB3aW5kb3cgd2UgbWF5IGtlZXAgaXMgdGhlcmVmb3JlIGBzLW1heGFnZSAtIEFnZWAsIG5ldmVyXG4gKiBgcy1tYXhhZ2VgIFx1MjAxNCBvdGhlcndpc2UgYSBjb3B5IHRoYXQgc2F0IGF0IHRoZSBlZGdlIGZvciA1NSBvZiBpdHMgNjAgc2Vjb25kcyB3b3VsZCBiZVxuICogaGVsZCBmb3IgYW5vdGhlciA2MCBoZXJlLCBhbmQgYSBwdWJsaXNoIHdvdWxkIHRha2UgdHdpY2UgYXMgbG9uZyB0byBiZSBzZWVuIGFzIHByb21pc2VkLlxuICogVGhpcyBpcyB0aGUgc2luZ2xlIGVhc2llc3QgdGhpbmcgdG8gZ2V0IHdyb25nIGluIGEgY2xpZW50IGNhY2hlLCBhbmQgaXQgaXMgaW52aXNpYmxlIGluXG4gKiB0ZXN0aW5nIGJlY2F1c2UgaXQgb25seSBzaG93cyB1cCBhcyBcInNvbWV0aW1lcyBzdGFsZVwiLlxuICpcbiAqIEluZGV4ZWREQiwgbm90IGxvY2FsU3RvcmFnZTogY29tcG9uZW50cyBydW4gdG8gaHVuZHJlZHMgb2YgS0IsIGxvY2FsU3RvcmFnZSBjYXBzIGFyb3VuZFxuICogNSBNQiBhbmQgYmxvY2tzIHRoZSBtYWluIHRocmVhZC4gRXZlcnkgcGF0aCBkZWdyYWRlcyB0byB0aGUgbmV0d29yayBcdTIwMTQgYSBicm93c2VyIGluXG4gKiBwcml2YXRlIG1vZGUsIHdpdGggc3RvcmFnZSBkaXNhYmxlZCBvciBvdmVyIHF1b3RhLCBtdXN0IHJlbmRlciB0aGUgcGFnZSwgbm90IGZhaWwgaXQuXG4gKi9cblxuY29uc3QgREJfTkFNRSA9ICdteW9wLWRlbGl2ZXJ5JztcbmNvbnN0IFNUT1JFID0gJ2NvbXBvbmVudHMnO1xuY29uc3QgREJfVkVSU0lPTiA9IDE7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmVkRW50cnkge1xuICAgIGtleTogc3RyaW5nO1xuICAgIC8qKiB0aGUgcmVzb2x2ZWQgY29tcG9uZW50IGNvbmZpZywgZXhhY3RseSBhcyB0aGUgbmV0d29yayBwYXRoIHByb2R1Y2VzIGl0ICovXG4gICAgY29uZmlnOiBhbnk7XG4gICAgLyoqIHRoZSBzZXJ2ZXIncyB2ZXJzaW9uIHRva2VuIGZvciB0aGVzZSBieXRlczogYDxyZXY+fjxvcHQ+YCAqL1xuICAgIHRhZzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogd2hlbiB0aGlzIGJyb3dzZXIgc3RvcmVkIGl0ICovXG4gICAgc3RvcmVkQXQ6IG51bWJlcjtcbiAgICAvKiogaG93IGxvbmcgaXQgbWF5IGJlIHVzZWQgd2l0aG91dCBhc2tpbmcsIGluIG1zIChhbHJlYWR5IEFnZS1hZGp1c3RlZCkgKi9cbiAgICB3aW5kb3dNczogbnVtYmVyO1xuICAgIC8qKiB3aGljaCBob3N0IHByb2R1Y2VkIGl0IFx1MjAxNCBhIGtleSBmcm9tIGFub3RoZXIgaG9zdCBpcyBuZXZlciByZXVzZWQgKi9cbiAgICBob3N0OiBzdHJpbmc7XG4gICAgLyoqIHdpcmUgc2l6ZSBvZiB0aGUgcmVzcG9uc2UgaXQgY2FtZSBmcm9tLCBzbyBzdGF0cyBjYW4gc2F5IHdoYXQgdGhlIHdpbmRvdyBzYXZlZCAqL1xuICAgIGJ5dGVzPzogbnVtYmVyO1xufVxuXG5sZXQgZGJQcm9taXNlOiBQcm9taXNlPElEQkRhdGFiYXNlIHwgbnVsbD4gfCBudWxsID0gbnVsbDtcblxuZnVuY3Rpb24gb3BlbkRiKCk6IFByb21pc2U8SURCRGF0YWJhc2UgfCBudWxsPiB7XG4gICAgaWYgKGRiUHJvbWlzZSkgcmV0dXJuIGRiUHJvbWlzZTtcbiAgICBkYlByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbmRleGVkREIgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcSA9IGluZGV4ZWREQi5vcGVuKERCX05BTUUsIERCX1ZFUlNJT04pO1xuICAgICAgICAgICAgcmVxLm9udXBncmFkZW5lZWRlZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYiA9IHJlcS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKFNUT1JFKSkgZGIuY3JlYXRlT2JqZWN0U3RvcmUoU1RPUkUsIHsga2V5UGF0aDogJ2tleScgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUocmVxLnJlc3VsdCk7XG4gICAgICAgICAgICByZXEub25lcnJvciA9ICgpID0+IHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICAvLyBBIGJsb2NrZWQgdXBncmFkZSBtdXN0IG5vdCBoYW5nIHRoZSBwYWdlIGxvYWQuXG4gICAgICAgICAgICByZXEub25ibG9ja2VkID0gKCkgPT4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRiUHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gdHg8VD4obW9kZTogSURCVHJhbnNhY3Rpb25Nb2RlLCBmbjogKHN0b3JlOiBJREJPYmplY3RTdG9yZSkgPT4gSURCUmVxdWVzdCk6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgICByZXR1cm4gb3BlbkRiKCkudGhlbihkYiA9PiBuZXcgUHJvbWlzZTxUIHwgbnVsbD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgaWYgKCFkYikgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZGIudHJhbnNhY3Rpb24oU1RPUkUsIG1vZGUpO1xuICAgICAgICAgICAgY29uc3QgcmVxID0gZm4odC5vYmplY3RTdG9yZShTVE9SRSkpO1xuICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUocmVxLnJlc3VsdCBhcyBUKTtcbiAgICAgICAgICAgIHJlcS5vbmVycm9yID0gKCkgPT4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgIHQub25hYm9ydCA9ICgpID0+IHJlc29sdmUobnVsbCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgfVxuICAgIH0pKTtcbn1cblxuLyoqXG4gKiBBIFNZTkNIUk9OT1VTIHNoYWRvdyBvZiB3aGF0IHdlIGhvbGQsIGZvciBjb2RlIHRoYXQgcnVucyBiZWZvcmUgSW5kZXhlZERCIGNhbiBhbnN3ZXIuXG4gKlxuICogVGhlIHBhZ2UncyBIVE1MIGNhbiBzdGFydCB0aGUgY29tcG9uZW50IHJlcXVlc3Qgd2hpbGUgdGhlIEpTIGJ1bmRsZSBpcyBzdGlsbCBkb3dubG9hZGluZ1xuICogXHUyMDE0IGJ1dCBvbmx5IGlmIGl0IGtub3dzLCBhdCBwYXJzZSB0aW1lLCB3aGV0aGVyIGEgcmVxdWVzdCBpcyBuZWVkZWQgYXQgYWxsIGFuZCB3aGljaCBvbmUuXG4gKiBJbmRleGVkREIgaXMgYXN5bmMsIHNvIGFuIGlubGluZSBzY3JpcHQgY2Fubm90IGFzayBpdC4gbG9jYWxTdG9yYWdlIGNhbiBiZSByZWFkXG4gKiBzeW5jaHJvbm91c2x5LCBzbyBlYWNoIGVudHJ5IG1pcnJvcnMgdHdvIHRpbnkgZmFjdHMgaGVyZTogdGhlIHZlcnNpb24gdGFnIGFuZCB3aGVuIHRoZVxuICogd2luZG93IGVuZHMuIE5vdGhpbmcgZWxzZSBcdTIwMTQgdGhlIGNvbXBvbmVudCBpdHNlbGYgc3RheXMgaW4gSW5kZXhlZERCIHdoZXJlIGl0IGJlbG9uZ3MuXG4gKlxuICogV2l0aG91dCB0aGlzIHRoZSBwcmVsb2FkIGhpbnQgaXMgYWN0aXZlbHkgaGFybWZ1bDogaXQgZG93bmxvYWRzIHRoZSB3aG9sZSBjb21wb25lbnRcbiAqIGV2ZXJ5IHRpbWUsIGluY2x1ZGluZyBvbiB0aGUgdmlzaXRzIHdoZXJlIHRoZSBzdG9yZWQgY29weSB3YXMgZ29pbmcgdG8gYW5zd2VyIGZvciBmcmVlLlxuICogTWVhc3VyZWQgb24gbXlvcC5kZXYgYmVmb3JlIGl0IGV4aXN0ZWQgXHUyMDE0IDk4IEtCIGZldGNoZWQsIHRoZW4gZGlzY2FyZGVkLCBvbiBldmVyeSByZWxvYWQuXG4gKi9cbmNvbnN0IEhJTlRfUFJFRklYID0gJ215b3AuZC4nO1xuXG5mdW5jdGlvbiB3cml0ZUhpbnQoa2V5OiBzdHJpbmcsIHRhZzogc3RyaW5nIHwgbnVsbCwgZXhwaXJlc0F0OiBudW1iZXIpIHtcbiAgICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShISU5UX1BSRUZJWCArIGtleSwgSlNPTi5zdHJpbmdpZnkoeyB0OiB0YWcsIGU6IGV4cGlyZXNBdCB9KSk7IH1cbiAgICBjYXRjaCB7IC8qIHByaXZhdGUgbW9kZSwgcXVvdGEsIGRpc2FibGVkIFx1MjAxNCB0aGUgaGludCBpcyBhbiBvcHRpbWlzYXRpb24sIG5ldmVyIGEgcmVxdWlyZW1lbnQgKi8gfVxufVxuXG5mdW5jdGlvbiBjbGVhckhpbnQoa2V5OiBzdHJpbmcpIHtcbiAgICB0cnkgeyBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShISU5UX1BSRUZJWCArIGtleSk7IH0gY2F0Y2ggeyAvKiBhcyBhYm92ZSAqLyB9XG59XG5cbi8qKiBBIG1lbW9yeSBsYXllciBpbiBmcm9udCBvZiBzdG9yYWdlOiBhIHNlY29uZCBjb21wb25lbnQgb24gdGhlIHNhbWUgcGFnZSBtdXN0IG5vdCB3YWl0IG9uIElPLiAqL1xuY29uc3QgbWVtb3J5ID0gbmV3IE1hcDxzdHJpbmcsIFN0b3JlZEVudHJ5PigpO1xuXG5leHBvcnQgY29uc3QgZGVsaXZlcnlTdG9yZSA9IHtcbiAgICBrZXkoaG9zdDogc3RyaW5nLCBjb21wb25lbnRJZDogc3RyaW5nLCBlbnY6IHN0cmluZywgcHJldmlldzogYm9vbGVhbiwgb3B0OiBzdHJpbmcpIHtcbiAgICAgICAgLy8gVGhlIEhPU1QgaXMgcGFydCBvZiB0aGUga2V5LiBUd28gc3RhY2tzIGNhbiBzZXJ2ZSB0aGUgc2FtZSBjb21wb25lbnQgd2l0aFxuICAgICAgICAvLyBkaWZmZXJlbnQgZnJlc2huZXNzLCBhbmQgZW50cmllcyBmcm9tIG9uZSBtdXN0IG5ldmVyIGJlIHJlYWQgYXMgdGhlIG90aGVyJ3MuXG4gICAgICAgIHJldHVybiBgJHtob3N0fXwke2NvbXBvbmVudElkfXwke2Vudn18JHtwcmV2aWV3ID8gJ3ByZXZpZXcnIDogJ2xpdmUnfXwke29wdCB8fCAncmF3J31gO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPFN0b3JlZEVudHJ5IHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBtID0gbWVtb3J5LmdldChrZXkpO1xuICAgICAgICBpZiAobSkgcmV0dXJuIG07XG4gICAgICAgIGNvbnN0IGUgPSBhd2FpdCB0eDxTdG9yZWRFbnRyeT4oJ3JlYWRvbmx5JywgcyA9PiBzLmdldChrZXkpKTtcbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIG1lbW9yeS5zZXQoa2V5LCBlKTtcbiAgICAgICAgICAgIC8vIFNFTEYtSEVBTC4gVGhlIHR3byBzdG9yZXMgY2FuIGRpc2FncmVlOiBhbiBlbnRyeSB3cml0dGVuIGJlZm9yZSB0aGUgaGludFxuICAgICAgICAgICAgLy8gZXhpc3RlZCwgYSBicm93c2VyIHRoYXQgZXZpY3RlZCBsb2NhbFN0b3JhZ2UgYnV0IG5vdCBJbmRleGVkREIsIGEgdXNlciB3aG9cbiAgICAgICAgICAgIC8vIGNsZWFyZWQgb25lLiBBIG1pc3NpbmcgaGludCBtYWtlcyB0aGUgcHJlbG9hZCBmYWxsIGJhY2sgdG8gdGhlIEZVTEwgY29tcG9uZW50XG4gICAgICAgICAgICAvLyB3aGlsZSB0aGUgU0RLLCB3aGljaCBjYW4gc2VlIEluZGV4ZWREQiwgb25seSB3YW50cyB0aGUgdmVyc2lvbiBjaGVjayAtLSB0d29cbiAgICAgICAgICAgIC8vIHJlcXVlc3RzIHdoZXJlIHRoZXJlIHNob3VsZCBiZSBvbmUuIFNlZW4gaW4gdGhlIHdpbGQgb24gdGhlIGZpcnN0IGxvYWQgYWZ0ZXJcbiAgICAgICAgICAgIC8vIHRoZSBoaW50IHNoaXBwZWQuIFJld3JpdGluZyBpdCBoZXJlIGNvc3RzIG5vdGhpbmcgYW5kIGNsb3NlcyB0aGUgZ2FwIGZvciBnb29kLlxuICAgICAgICAgICAgd3JpdGVIaW50KGtleSwgZS50YWcsIGUuc3RvcmVkQXQgKyBlLndpbmRvd01zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZTtcbiAgICB9LFxuXG4gICAgYXN5bmMgcHV0KGVudHJ5OiBTdG9yZWRFbnRyeSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBtZW1vcnkuc2V0KGVudHJ5LmtleSwgZW50cnkpO1xuICAgICAgICB3cml0ZUhpbnQoZW50cnkua2V5LCBlbnRyeS50YWcsIGVudHJ5LnN0b3JlZEF0ICsgZW50cnkud2luZG93TXMpO1xuICAgICAgICBhd2FpdCB0eCgncmVhZHdyaXRlJywgcyA9PiBzLnB1dChlbnRyeSkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBkcm9wKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIG1lbW9yeS5kZWxldGUoa2V5KTtcbiAgICAgICAgY2xlYXJIaW50KGtleSk7XG4gICAgICAgIGF3YWl0IHR4KCdyZWFkd3JpdGUnLCBzID0+IHMuZGVsZXRlKGtleSkpO1xuICAgIH0sXG5cbiAgICAvKiogU3RpbGwgdXNhYmxlIHdpdGhvdXQgYXNraW5nIHRoZSBzZXJ2ZXI/ICovXG4gICAgZnJlc2goZTogU3RvcmVkRW50cnkgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIWUgJiYgKERhdGUubm93KCkgLSBlLnN0b3JlZEF0KSA8IGUud2luZG93TXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB3aW5kb3cgdGhpcyByZXNwb25zZSBsaWNlbnNlczogdGhlIHNlcnZlcidzIGZyZXNobmVzcyBtaW51cyB3aGF0IGEgQ0ROIGFscmVhZHlcbiAgICAgKiBzcGVudC4gUmV0dXJucyAwIHdoZW4gdGhlIHNlcnZlciBzYWlkIG5vdGhpbmcgYWJvdXQgY2FjaGluZywgd2hpY2ggbWVhbnMgXCJkbyBub3RcbiAgICAgKiBob2xkIHRoaXNcIiBcdTIwMTQgdGhlIHNhZmUgcmVhZGluZywgYW5kIHdoYXQgcHJvZHVjdGlvbiBzZW5kcyB0b2RheS5cbiAgICAgKi9cbiAgICB3aW5kb3dGcm9tKGhlYWRlcnM6IEhlYWRlcnMpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBjYyA9IGhlYWRlcnMuZ2V0KCdjYWNoZS1jb250cm9sJykgfHwgJyc7XG4gICAgICAgIGlmICgvbm8tc3RvcmV8bm8tY2FjaGUvaS50ZXN0KGNjKSkgcmV0dXJuIDA7XG4gICAgICAgIGNvbnN0IG0gPSAvcy1tYXhhZ2VcXHMqPVxccyooXFxkKykvaS5leGVjKGNjKSB8fCAvbWF4LWFnZVxccyo9XFxzKihcXGQrKS9pLmV4ZWMoY2MpO1xuICAgICAgICBpZiAoIW0pIHJldHVybiAwO1xuICAgICAgICBjb25zdCB0b3RhbCA9IE51bWJlcihtWzFdKTtcbiAgICAgICAgY29uc3QgYWdlID0gTnVtYmVyKGhlYWRlcnMuZ2V0KCdhZ2UnKSB8fCAwKTtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsICh0b3RhbCAtIChpc05hTihhZ2UpID8gMCA6IGFnZSkpKSAqIDEwMDA7XG4gICAgfSxcblxuICAgIC8qKiBGb3IgdGVzdHMgYW5kIGZvciBgcmVmcmVzaCgpYDogZm9yZ2V0IGV2ZXJ5dGhpbmcgdGhpcyBicm93c2VyIGhvbGRzLiAqL1xuICAgIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBtZW1vcnkuY2xlYXIoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBsb2NhbFN0b3JhZ2UubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrID0gbG9jYWxTdG9yYWdlLmtleShpKTtcbiAgICAgICAgICAgICAgICBpZiAoayAmJiBrLnN0YXJ0c1dpdGgoSElOVF9QUkVGSVgpKSBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7IC8qIG5vdGhpbmcgdG8gY2xlYW4gdXAgaWYgaXQgd2FzIG5ldmVyIHdyaXRhYmxlICovIH1cbiAgICAgICAgYXdhaXQgdHgoJ3JlYWR3cml0ZScsIHMgPT4gcy5jbGVhcigpKTtcbiAgICB9LFxufTtcbiIsICJpbXBvcnQge1xuICAgIElDb21wb25lbnRDb25maWcsXG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnLFxuICAgIElEZWRpY2F0ZWRTa2luQ29uZmlnLFxuICAgIElQcm9wQ29uZmlnLFxuICAgIElTa2luQ29uZmlnLFxuICAgIElVc2VyRmxvdyxcbiAgICBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyxcbiAgICB2Ml9JVmFyaWFudENvbmZpZ1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQgeyBkZWxpdmVyeVN0b3JlIH0gZnJvbSBcIi4vZGVsaXZlcnlTdG9yZVwiO1xuXG5jb25zdCBjb252ZXJ0VjJWYXJpYW50VG9Db21wb25lbnRDb25maWcgPSAoY29uZmlnOiB2Ml9JVmFyaWFudENvbmZpZyk6IElDb21wb25lbnRDb25maWcgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIGluc3RhbmNlOiB7XG4gICAgICAgICAgICBpZDogJ2F1dG8nLFxuICAgICAgICAgICAgY29tcG9uZW50SWQ6IGNvbmZpZy5jb21wb25lbnRJZCxcbiAgICAgICAgICAgIGNvbXBvbmVudE5hbWU6IGNvbmZpZy5uYW1lLFxuXG4gICAgICAgICAgICBza2luU2VsZWN0b3I6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnRGVkaWNhdGVkJyxcbiAgICAgICAgICAgICAgICBza2luOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnc2tpbl9hdXRvX3YyX2NvbnZlcnRlZCdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnXG5cbiAgICAgICAgfSBhcyBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIGlkOiBjb25maWcuaWQsXG4gICAgICAgICAgICBuYW1lOiBjb25maWcubmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBjb25maWcuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBwcm9wczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdpbl9hdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdteW9wX2luaXRfaW50ZXJmYWNlJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FueScsXG4gICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGFzIElQcm9wQ29uZmlnLFxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ291dF9hdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdteW9wX2N0YV9oYW5kbGVyJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FueScsXG4gICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGFzIElQcm9wQ29uZmlnXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVmczogW10sXG4gICAgICAgICAgICBza2luczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdza2luX2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBoYW5kbGUgZW1wdHkgOlxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlcjogY29uZmlnLmNvbnN1bWVfdmFyaWFudFswXS5sb2FkZXJcbiAgICAgICAgICAgICAgICB9IGFzIElTa2luQ29uZmlnXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgZGVmYXVsdFNraW46IDAsXG4gICAgICAgICAgICAvLyBPbmx5IGB1aTpgIHRhZ3MgZXZlciByZWFjaCB0aGUgY2xpZW50OyB0aGUgc2VydmVyIGZpbHRlcnMsIGFic2VudCA9IG5vbmUuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB1aVRhZ3M6IEFycmF5LmlzQXJyYXkoY29uZmlnLnVpVGFncykgPyBjb25maWcudWlUYWdzIDogW11cbiAgICAgICAgfSBhcyBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICAgICAgbmFtZTogY29uZmlnLm5hbWVcbiAgICB9IGFzIElDb21wb25lbnRDb25maWc7XG59O1xuXG4vKipcbiAqIENsb3VkUmVwb3NpdG9yeSAtIFVuaWZpZWQgY2xvdWQgZGF0YSBhY2Nlc3MgbGF5ZXIgZm9yIE15b3AgY29tcG9uZW50c1xuICpcbiAqIFN1cHBvcnRzIGJvdGggdjIgKGRlZmF1bHQpIGFuZCB2MSBtb2RlczpcbiAqIC0gdjI6IFVzZXMgL2NvbnN1bWUgZW5kcG9pbnQgZm9yIGZldGNoaW5nIHZhcmlhbnRzXG4gKiAtIHYxOiBVc2VzIC9mbG93IGVuZHBvaW50IGZvciBmZXRjaGluZyB1c2VyIGZsb3dzXG4gKi9cbi8vIFVzZSBhIGdsb2JhbCBzaW5nbGV0b24gdG8gZW5zdXJlIG9ubHkgb25lIENsb3VkUmVwb3NpdG9yeS5NYWluIGV4aXN0c1xuLy8gZXZlbiB3aGVuIHRoZSBtb2R1bGUgaXMgbG9hZGVkIG11bHRpcGxlIHRpbWVzIGJ5IGRpZmZlcmVudCBidW5kbGVyc1xuY29uc3QgR0xPQkFMX0tFWSA9ICdfX01ZT1BfQ0xPVURfUkVQT1NJVE9SWV9NQUlOX18nO1xuXG5jb25zdCBnZXRHbG9iYWxNYWluID0gKCk6IENsb3VkUmVwb3NpdG9yeSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiAod2luZG93IGFzIGFueSlbR0xPQkFMX0tFWV07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIGFueSlbR0xPQkFMX0tFWV07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCBzZXRHbG9iYWxNYWluID0gKGluc3RhbmNlOiBDbG91ZFJlcG9zaXRvcnkpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgKHdpbmRvdyBhcyBhbnkpW0dMT0JBTF9LRVldID0gaW5zdGFuY2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgKGdsb2JhbFRoaXMgYXMgYW55KVtHTE9CQUxfS0VZXSA9IGluc3RhbmNlO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjbGFzcyBDbG91ZFJlcG9zaXRvcnkge1xuICAgIHByaXZhdGUgc3RhdGljIF9tYWluOiBDbG91ZFJlcG9zaXRvcnkgfCBudWxsID0gbnVsbDtcblxuICAgIHN0YXRpYyBnZXQgTWFpbigpOiBDbG91ZFJlcG9zaXRvcnkge1xuICAgICAgICAvLyBDaGVjayBpZiBhIGdsb2JhbCBpbnN0YW5jZSBhbHJlYWR5IGV4aXN0cyAoZnJvbSBhbm90aGVyIGJ1bmRsZSlcbiAgICAgICAgY29uc3QgZ2xvYmFsTWFpbiA9IGdldEdsb2JhbE1haW4oKTtcbiAgICAgICAgaWYgKGdsb2JhbE1haW4pIHtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWxNYWluO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIG5ldyBpbnN0YW5jZSBpZiBuZWVkZWRcbiAgICAgICAgaWYgKCFDbG91ZFJlcG9zaXRvcnkuX21haW4pIHtcbiAgICAgICAgICAgIENsb3VkUmVwb3NpdG9yeS5fbWFpbiA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoKTtcbiAgICAgICAgICAgIHNldEdsb2JhbE1haW4oQ2xvdWRSZXBvc2l0b3J5Ll9tYWluKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ2xvdWRSZXBvc2l0b3J5Ll9tYWluO1xuICAgIH1cblxuICAgIC8vIHYyIGNhY2hlIC0ga2V5ZWQgYnkgY29tcG9uZW50SWQ6ZW52OnByZXZpZXd8bGl2ZVxuICAgIC8vIEVhY2ggUHJvbWlzZSBpcyB0YWdnZWQgd2l0aCBhIGByZXNvbHZlZGAgcHJvcGVydHkgYWZ0ZXIgc2V0dGxpbmcgKHNlZSBmZXRjaENvbXBvbmVudFYyKS5cbiAgICBwcml2YXRlIHZhcmlhbnRzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPElDb21wb25lbnRDb25maWc+ICYgeyByZXNvbHZlZD86IElDb21wb25lbnRDb25maWcgfT4gPSB7fTtcblxuICAgIC8vIFRyYWNrIHdoaWNoIGNvbXBvbmVudHMgd2VyZSBwcmVsb2FkZWQgYW5kIHdpdGggd2hhdCBwYXJhbXNcbiAgICAvLyBLZXk6IGNvbXBvbmVudElkLCBWYWx1ZTogeyBlbnYsIHByZXZpZXcgfVxuICAgIHByaXZhdGUgcHJlbG9hZGVkQ29tcG9uZW50czogUmVjb3JkPHN0cmluZywgeyBlbnY6IHN0cmluZzsgcHJldmlldzogYm9vbGVhbiB9PiA9IHt9O1xuXG4gICAgLy8gdjEgY2FjaGVcbiAgICBwcml2YXRlIHVzZXJGbG93czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJVXNlckZsb3c+PiA9IHt9O1xuXG4gICAgcHJpdmF0ZSBfZGVmYXVsdEVudiA9ICdwcm9kdWN0aW9uJztcbiAgICBwcml2YXRlIF9lbnZFeHBsaWNpdGx5U2V0ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfc3RhdGljTW9kZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3F1ZXJ5UGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9iYXNlVXJsID0gJ2h0dHBzOi8vY2xvdWQubXlvcC5kZXYnKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSG93IGJpZyB0aGUgY29tcG9uZW50IHdlIGFyZSBOT1QgcmUtZG93bmxvYWRpbmcgaXMuIERlbGliZXJhdGVseSBtZWFzdXJlZCBmcm9tIHdoYXRcbiAgICAgKiB3ZSBob2xkIHJhdGhlciB0aGFuIGZyb20gQ29udGVudC1MZW5ndGg6IG9uY2UgYSByZXNwb25zZSBpcyBjb21wcmVzc2VkIHRoZSBoZWFkZXIgaXNcbiAgICAgKiBub3QgcmVhZGFibGUgY3Jvc3Mtb3JpZ2luLCBzbyByZWFkaW5nIGl0IHRoZXJlIHJlcG9ydGVkIDAgZXZlcnkgc2luZ2xlIHRpbWUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgc2l6ZU9mSGVsZChlOiBhbnkpOiBudW1iZXIge1xuICAgICAgICB0cnkgeyByZXR1cm4gKGU/LmNvbmZpZz8udHlwZT8uc2tpbnM/LlswXT8ubG9hZGVyPy5IVE1MIHx8ICcnKS5sZW5ndGg7IH0gY2F0Y2ggeyByZXR1cm4gMDsgfVxuICAgIH1cblxuICAgIC8qKiBUaGUgaG9zdCBldmVyeSByZXF1ZXN0IGdvZXMgdG8gdW5sZXNzIGRlbGl2ZXJ5KCkgbW92ZWQgaXQuIE5ldmVyIGNoYW5nZXMuICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9IT1NUID0gJ2h0dHBzOi8vY2xvdWQubXlvcC5kZXYnO1xuXG4gICAgLyoqXG4gICAgICogT3B0LWluIGRlbGl2ZXJ5IHNldHRpbmdzLCBzZXQgYnkgbXlvcC5kZWxpdmVyeSgpLiBPZmYgbWVhbnM6IHRoaXMgZmlsZSBiZWhhdmVzXG4gICAgICogRVhBQ1RMWSBhcyBpdCBkaWQgYmVmb3JlIFx1MjAxNCBzYW1lIGhvc3QsIHNhbWUgVVJMLCBzYW1lIGV2ZXJ5dGhpbmcuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZGVsaXZlcnk6IHsgbWluaWZ5OiBib29sZWFuOyBob3N0OiBzdHJpbmcgfCBudWxsOyBjYWNoZTogYm9vbGVhbjsgZmxvdzogYm9vbGVhbiB9ID1cbiAgICAgICAgeyBtaW5pZnk6IGZhbHNlLCBob3N0OiBudWxsLCBjYWNoZTogZmFsc2UsIGZsb3c6IGZhbHNlIH07XG5cbiAgICAvKipcbiAgICAgKiBXaGF0IGFjdHVhbGx5IGhhcHBlbmVkLCBmb3IgbXlvcC5kZWxpdmVyeS5zdGF0cygpLiBgZmVsbEJhY2tgIGlzIHRoZSBudW1iZXIgdGhhdFxuICAgICAqIG1hdHRlcnM6IGl0IGlzIGhvdyB5b3UgZmluZCBvdXQgdGhlIGxhbmUgaXMgdW5oZWFsdGh5IHdpdGhvdXQgd2FpdGluZyBmb3IgYVxuICAgICAqIGJ1ZyByZXBvcnQsIGJlY2F1c2UgYSBmYWxsYmFjayBpcyBJTlZJU0lCTEUgdG8gdGhlIHBhZ2UgKGl0IHN0aWxsIHJlbmRlcnMpLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2RlbGl2ZXJ5U3RhdHMgPSB7XG4gICAgICAgIHJlcXVlc3RzOiAwLCB2aWFEZWxpdmVyeTogMCwgZmVsbEJhY2s6IDAsIGxhc3RFcnJvcjogbnVsbCBhcyBzdHJpbmcgfCBudWxsLFxuICAgICAgICAvKiogd2hlcmUgdGhlIGxhc3QgbG9hZHMgd2VyZSBhbnN3ZXJlZCBmcm9tIFx1MjAxNCB0aGUgbnVtYmVyIHRoZSBjbGllbnQgd2luZG93IGV4aXN0cyB0byBtb3ZlICovXG4gICAgICAgIGZyb21NZW1vcnk6IDAsIGZyb21TdG9yYWdlOiAwLCBmcm9tTmV0d29yazogMCxcbiAgICAgICAgLyoqIHJlLWNoZWNrcyBhZnRlciB0aGUgd2luZG93IGVuZGVkLCBhbmQgaG93IG1hbnkgd2VyZSBhbnN3ZXJlZCBcIm5vdGhpbmcgY2hhbmdlZFwiICovXG4gICAgICAgIHJldmFsaWRhdGlvbnM6IDAsIHVuY2hhbmdlZDogMCwgYnl0ZXNTYXZlZDogMCxcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVHVybiBvbiB0aGUgb3B0LWluIGRlbGl2ZXJ5IHBhdGguXG4gICAgICpcbiAgICAgKiBPcHRpbmcgaW4gSVMgY2hvb3NpbmcgdGhlIGRlbGl2ZXJ5IHN0YWNrOiB0aGlzIHBvaW50cyAvY29uc3VtZSBhdCBgaG9zdGAgKGEgc2Vjb25kLFxuICAgICAqIGNvbXBsZXRlIHN0YWNrIHJlYWRpbmcgdGhlIHNhbWUgZGF0YSkgYW5kIGFza3MgZm9yIHRoZSBtaW5pZmllZCBhcnRpZmFjdC4gTGVhdmUgdGhpc1xuICAgICAqIHVuY2FsbGVkIGFuZCBub3RoaW5nIGFib3V0IHRoZSBTREsgY2hhbmdlcy5cbiAgICAgKlxuICAgICAqIERlbGliZXJhdGVseSBtdXRhdGVzIFRISVMgaW5zdGFuY2UgcmF0aGVyIHRoYW4gY29uc3RydWN0aW5nIGEgbmV3IHJlcG9zaXRvcnk6XG4gICAgICogQ2xvdWRSZXBvc2l0b3J5Lk1haW4gaXMgYSBnbG9iYWwgc2luZ2xldG9uIHNoYXJlZCBhY3Jvc3MgYnVuZGxlcyAoc2VlIGdldEdsb2JhbE1haW4pLFxuICAgICAqIHNvIGEgc2Vjb25kIGluc3RhbmNlIHdvdWxkIGJlIGlnbm9yZWQgYnkgZXZlcnkgY29tcG9uZW50IGFscmVhZHkgdXNpbmcgdGhlIGZpcnN0LlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgc2V0RGVsaXZlcnkob3B0czogeyBtaW5pZnk/OiBib29sZWFuOyBob3N0Pzogc3RyaW5nIHwgbnVsbDsgY2FjaGU/OiBib29sZWFuOyBmbG93PzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICAgICAgaWYgKG9wdHMubWluaWZ5ICE9PSB1bmRlZmluZWQpIHRoaXMuX2RlbGl2ZXJ5Lm1pbmlmeSA9ICEhb3B0cy5taW5pZnk7XG4gICAgICAgIGlmIChvcHRzLmhvc3QgIT09IHVuZGVmaW5lZCkgdGhpcy5fZGVsaXZlcnkuaG9zdCA9IG9wdHMuaG9zdDtcbiAgICAgICAgaWYgKG9wdHMuY2FjaGUgIT09IHVuZGVmaW5lZCkgdGhpcy5fZGVsaXZlcnkuY2FjaGUgPSAhIW9wdHMuY2FjaGU7XG4gICAgICAgIGlmIChvcHRzLmZsb3cgIT09IHVuZGVmaW5lZCkgdGhpcy5fZGVsaXZlcnkuZmxvdyA9ICEhb3B0cy5mbG93O1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBkZWxpdmVyeVN0YXRzKCkge1xuICAgICAgICByZXR1cm4geyAuLi50aGlzLl9kZWxpdmVyeVN0YXRzLCBob3N0OiB0aGlzLl9kZWxpdmVyeS5ob3N0ID8/IENsb3VkUmVwb3NpdG9yeS5ERUZBVUxUX0hPU1QsXG4gICAgICAgICAgICAgICAgIG1pbmlmeTogdGhpcy5fZGVsaXZlcnkubWluaWZ5LCBjYWNoZTogdGhpcy5fZGVsaXZlcnkuY2FjaGUsIGZsb3c6IHRoaXMuX2RlbGl2ZXJ5LmZsb3cgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JnZXQgd2hhdCB0aGlzIGJyb3dzZXIgaG9sZHMsIHNvIHRoZSBuZXh0IGxvYWQgYXNrcyB0aGUgc2VydmVyLlxuICAgICAqIGByZWZyZXNoKClgIHdpdGggbm8gaWRzIGRyb3BzIGV2ZXJ5dGhpbmc7IHRoZSBjb3VudGVycGFydCB0byB0aGUgd2luZG93IGZvciB0aGUgY2FzZVxuICAgICAqIHdoZXJlIGEgY2hhbmdlIGhhcyB0byBiZSB2aXNpYmxlIG9uIFRISVMgbG9hZCBcdTIwMTQgcmlnaHQgYWZ0ZXIgc29tZW9uZSBwdWJsaXNoZXMuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBhc3luYyByZWZyZXNoRGVsaXZlcnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IGRlbGl2ZXJ5U3RvcmUuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2NhbCBzZXJ2ZXMgd2FpdGluZyB0byBiZSByZXBvcnRlZDogY29tcG9uZW50SWQgLT4ge2VudiwgY291bnR9LlxuICAgICAqXG4gICAgICogVEhFIE1FQVNVUkVNRU5UIFBST0JMRU0gVEhJUyBTT0xWRVMuIFRoZSBiZXR0ZXIgdGhpcyBjYWNoZSB3b3JrcywgdGhlIG1vcmUgdXNhZ2VcbiAgICAgKiB2YW5pc2hlczogYSB2aXNpdG9yIGluc2lkZSB0aGVpciBmcmVzaG5lc3Mgd2luZG93IHJlbmRlcnMgdGhlIHBhZ2Ugd2l0aCBubyByZXF1ZXN0LFxuICAgICAqIHNvIG5laXRoZXIgdGhlIHNlcnZlciBub3IgdGhlIENETiBjYW4gc2VlIHRoZW0uIExlZnQgYWxvbmUsIGEgc3VjY2Vzc2Z1bCByb2xsb3V0XG4gICAgICogbG9va3MgaW4gdGhlIGxlZGdlciBleGFjdGx5IGxpa2UgY3VzdG9tZXJzIGxlYXZpbmcuXG4gICAgICpcbiAgICAgKiBTbyBsb2NhbCBzZXJ2ZXMgYXJlIGNvdW50ZWQgaGVyZSBhbmQgcmVwb3J0ZWQgYWZ0ZXJ3YXJkcywgYmF0Y2hlZCwgb24gYSBwYXRoIHRoYXRcbiAgICAgKiBuZXZlciBibG9ja3MgcmVuZGVyaW5nOiBmbHVzaGVkIHdoZW4gdGhlIHBhZ2UgaXMgaGlkZGVuIChrZWVwYWxpdmUsIHNvIGl0IHN1cnZpdmVzXG4gICAgICogdGhlIHRhYiBjbG9zaW5nKSBhbmQgb3Bwb3J0dW5pc3RpY2FsbHkgd2hlbmV2ZXIgdGhlIFNESyBpcyB0YWxraW5nIHRvIHRoZSBzZXJ2ZXJcbiAgICAgKiBhbnl3YXkuIE5vdGhpbmcgaXMgc2VudCB3aGlsZSB0aGUgcGFnZSBpcyBsb2FkaW5nLCB3aGljaCBpcyB0aGUgcG9pbnQgb2YgdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9sb2NhbFNlcnZlcyA9IG5ldyBNYXA8c3RyaW5nLCB7aWQ6IHN0cmluZzsgZW52OiBzdHJpbmc7IGNvdW50OiBudW1iZXI7IHNvdXJjZT86ICdoJ30+KCk7XG4gICAgcHJpdmF0ZSBfZmx1c2hCb3VuZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogYHNvdXJjZTogJ2gnYCA9IHRoZSB2aWV3IHdhcyBzZXJ2ZWQgZnJvbSBhIGNvbmZpZyB0aGUgcGFnZSdzIFNFUlZFUiBlbWJlZGRlZFxuICAgICAqIChoeWRyYXRlVjFDb21wb25lbnQpLCBub3QgZnJvbSB0aGlzIGJyb3dzZXIncyBjYWNoZSB3aW5kb3cuIFJlcG9ydGVkIGFzIGEgNHRoIGJhdGNoXG4gICAgICogZmllbGQgKGBpZDplbnY6bjpoYCkgc28gb3VyIHVzYWdlIGRhdGEgY2FuIHRlbGwgc2VydmVyLXJlbmRlcmVkIHZpZXdzIGFwYXJ0OyBhIHNlcnZlclxuICAgICAqIHRoYXQgcHJlZGF0ZXMgaXQgcmVhZHMgdGhlIGZpcnN0IHRocmVlIGZpZWxkcyBhbmQgY291bnRzIHRoZSB2aWV3IGFsbCB0aGUgc2FtZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIG5vdGVMb2NhbFNlcnZlKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudjogc3RyaW5nLCBzb3VyY2U/OiAnaCcpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gc291cmNlID8gYCR7Y29tcG9uZW50SWR9OiR7c291cmNlfWAgOiBjb21wb25lbnRJZDtcbiAgICAgICAgY29uc3QgY3VyID0gdGhpcy5fbG9jYWxTZXJ2ZXMuZ2V0KGtleSk7XG4gICAgICAgIGlmIChjdXIpIGN1ci5jb3VudCsrO1xuICAgICAgICBlbHNlIHRoaXMuX2xvY2FsU2VydmVzLnNldChrZXksIHtpZDogY29tcG9uZW50SWQsIGVudiwgY291bnQ6IDEsIHNvdXJjZX0pO1xuICAgICAgICB0aGlzLmJpbmRGbHVzaCgpO1xuICAgIH1cblxuICAgIC8qKiBSZXBvcnQgb24gcGFnZS1oaWRlLCB3aGljaCBpcyB0aGUgb25seSBldmVudCB0aGF0IHJlbGlhYmx5IGZpcmVzIG9uIG1vYmlsZS4gKi9cbiAgICBwcml2YXRlIGJpbmRGbHVzaCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZsdXNoQm91bmQgfHwgdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuICAgICAgICB0aGlzLl9mbHVzaEJvdW5kID0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgb25IaWRlID0gKCkgPT4geyBpZiAoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAnaGlkZGVuJykgdGhpcy5mbHVzaExvY2FsU2VydmVzKCk7IH07XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBvbkhpZGUpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncGFnZWhpZGUnLCAoKSA9PiB0aGlzLmZsdXNoTG9jYWxTZXJ2ZXMoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZCB3aGF0IHdlIGhhdmUuIGBrZWVwYWxpdmVgIGlzIHdoYXQgbWFrZXMgdGhpcyB3b3JrIGF0IHBhZ2UtaGlkZTogdGhlIHJlcXVlc3RcbiAgICAgKiBvdXRsaXZlcyB0aGUgZG9jdW1lbnQuIEZhaWx1cmUgaXMgaWdub3JlZCBcdTIwMTQgYSBsb3N0IHVzYWdlIHJlcG9ydCBtdXN0IG5ldmVyIGJlXG4gICAgICogdmlzaWJsZSB0byBhIHZpc2l0b3IsIGFuZCB0aGUgbmV4dCBwYWdlIGxvYWQgd2lsbCByZXBvcnQgaXRzIG93bi5cbiAgICAgKi9cbiAgICBmbHVzaExvY2FsU2VydmVzKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX2xvY2FsU2VydmVzLnNpemUpIHJldHVybjtcbiAgICAgICAgY29uc3QgYmF0Y2ggPSBbLi4udGhpcy5fbG9jYWxTZXJ2ZXMuZW50cmllcygpXVxuICAgICAgICAgICAgLm1hcCgoWywgdl0pID0+IGAke3YuaWR9OiR7di5lbnZ9OiR7di5jb3VudH0ke3Yuc291cmNlID8gJzonICsgdi5zb3VyY2UgOiAnJ31gKS5qb2luKCcsJyk7XG4gICAgICAgIHRoaXMuX2xvY2FsU2VydmVzLmNsZWFyKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmRlbGl2ZXJ5SG9zdCgpfS9jbGllbnRVc2FnZT9iPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGJhdGNoKX1gO1xuICAgICAgICAgICAgZmV0Y2godXJsLCB7a2VlcGFsaXZlOiB0cnVlLCBtb2RlOiAnY29ycycsIGNyZWRlbnRpYWxzOiAnb21pdCd9KS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBuZXZlciB0aGUgdmlzaXRvcidzIHByb2JsZW0gKi8gfVxuICAgIH1cblxuICAgIC8qKiBXaGVyZSAvY29uc3VtZSBzaG91bGQgYmUgZmV0Y2hlZCBmcm9tIHJpZ2h0IG5vdy4gKi9cbiAgICBwcml2YXRlIGRlbGl2ZXJ5SG9zdCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVsaXZlcnkuaG9zdCB8fCB0aGlzLl9iYXNlVXJsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGEgZGVsaXZlcnkgVVJMIHdpdGggT05FIGZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0IGhvc3QuXG4gICAgICpcbiAgICAgKiBUaGUgZmFsbGJhY2sgaXMgdGhlIGtpbGwgc3dpdGNoOiBicmVhayBvciBkaXNhYmxlIHRoZSBsYW5lIGFuZCBldmVyeSBjbGllbnQgZHJpZnRzXG4gICAgICogYmFjayB0byBjbG91ZC5teW9wLmRldiBvbiBpdHMgb3duLCB3aXRoIG5vIGN1c3RvbWVyIGRlcGxveS4gSXQgbXVzdCB0aGVyZWZvcmUgYmVcbiAgICAgKiBnZW51aW5lbHkgc2lsZW50IHRvIHRoZSBwYWdlIGFuZCBnZW51aW5lbHkgTE9VRCBpbiBzdGF0cygpIFx1MjAxNCBhIGZhbGxiYWNrIHRoYXQgbm9ib2R5XG4gICAgICogY291bnRzIGlzIGFuIG91dGFnZSBub2JvZHkgbm90aWNlcy5cbiAgICAgKlxuICAgICAqIE9ubHkgdHJhbnNwb3J0IGZhaWx1cmVzIGFuZCA1eHggZmFsbCBiYWNrLiBBIDQwNCBpcyBhbiBhbnN3ZXI6IHRoZSBjb21wb25lbnQgcmVhbGx5XG4gICAgICogaXMgbWlzc2luZywgYW5kIHJldHJ5aW5nIGVsc2V3aGVyZSB3b3VsZCBvbmx5IGhpZGUgaXQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBkZWxpdmVyeUZldGNoKHBhdGg6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICAgICAgLy8gV2UgYXJlIGFib3V0IHRvIHVzZSB0aGUgbmV0d29yayBhbnl3YXk6IGEgZ29vZCBtb21lbnQgdG8gaGFuZCBvdmVyIHdoYXRldmVyIHRoZVxuICAgICAgICAvLyB3aW5kb3cgc2VydmVkIG9mZmxpbmUsIHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIHRoZSBwYWdlIHRvIGJlIGNsb3NlZC5cbiAgICAgICAgaWYgKHRoaXMuX2xvY2FsU2VydmVzLnNpemUpIHRoaXMuZmx1c2hMb2NhbFNlcnZlcygpO1xuICAgICAgICBjb25zdCBob3N0ID0gdGhpcy5kZWxpdmVyeUhvc3QoKTtcbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGAke2hvc3R9JHtwYXRofWA7XG4gICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMucmVxdWVzdHMrKztcbiAgICAgICAgY29uc3QgdXNpbmdMYW5lID0gaG9zdCAhPT0gdGhpcy5fYmFzZVVybDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHByaW1hcnkpO1xuICAgICAgICAgICAgaWYgKHJlcy5vayB8fCByZXMuc3RhdHVzIDwgNTAwIHx8ICF1c2luZ0xhbmUpIHtcbiAgICAgICAgICAgICAgICBpZiAodXNpbmdMYW5lICYmIHJlcy5vaykgdGhpcy5fZGVsaXZlcnlTdGF0cy52aWFEZWxpdmVyeSsrO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLmxhc3RFcnJvciA9IGBIVFRQICR7cmVzLnN0YXR1c30gZnJvbSAke2hvc3R9YDtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBpZiAoIXVzaW5nTGFuZSkgdGhyb3cgZTtcbiAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMubGFzdEVycm9yID0gU3RyaW5nKGU/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy5mZWxsQmFjaysrO1xuICAgICAgICBjb25zb2xlLndhcm4oYFtteW9wXSBkZWxpdmVyeSBob3N0IGZhaWxlZCAoJHt0aGlzLl9kZWxpdmVyeVN0YXRzLmxhc3RFcnJvcn0pIFx1MjAxNCBmYWxsaW5nIGJhY2sgdG8gJHt0aGlzLl9iYXNlVXJsfWApO1xuICAgICAgICByZXR1cm4gYXdhaXQgZmV0Y2goYCR7dGhpcy5fYmFzZVVybH0ke3BhdGh9YCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIHN0YXRpYyBtb2RlIGZvciBzZWxmLWhvc3RlZCBjb21wb25lbnQgcmVnaXN0cmllcy5cbiAgICAgKiBJbiBzdGF0aWMgbW9kZSwgVVJMcyBhcmUgY29uc3RydWN0ZWQgYXMgZmlsZSBwYXRocyBpbnN0ZWFkIG9mIHF1ZXJ5IHBhcmFtczpcbiAgICAgKiBgJHtiYXNlVXJsfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9LyR7ZW52fS5qc29uYFxuICAgICAqL1xuICAgIGVuYWJsZVN0YXRpY01vZGUoKSB7XG4gICAgICAgIHRoaXMuX3N0YXRpY01vZGUgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBxdWVyeSBwYXJhbWV0ZXJzIHRvIGFwcGVuZCB0byBhbGwgZmV0Y2ggVVJMcyAoZS5nLiBmb3IgQ0ROIGNhY2hlIGJ1c3RpbmcpLlxuICAgICAqIEV4YW1wbGU6IGBzZXRRdWVyeVBhcmFtcyh7IGxhc3R1cGRhdGU6ICcxMTExMjAyNicgfSlgXG4gICAgICovXG4gICAgc2V0UXVlcnlQYXJhbXMocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgICAgIHRoaXMuX3F1ZXJ5UGFyYW1zID0gcGFyYW1zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZGVmYXVsdCBlbnZpcm9ubWVudCBmb3IgdGhpcyBDbG91ZFJlcG9zaXRvcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZXRFbnZpcm9ubWVudChlbnY6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kZWZhdWx0RW52ID0gZW52O1xuICAgICAgICB0aGlzLl9lbnZFeHBsaWNpdGx5U2V0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBlbnZpcm9ubWVudFxuICAgICAqL1xuICAgIGdldERlZmF1bHRFbnZpcm9ubWVudCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdEVudjtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT0gVjIgTWV0aG9kcyAoRGVmYXVsdCkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIGNvbXBvbmVudCBpcyBhbHJlYWR5IGNhY2hlZC9wcmVsb2FkZWQgKHYyKVxuICAgICAqIElmIGVudiBhbmQgcHJldmlldyBhcmUgbm90IHByb3ZpZGVkLCBjaGVja3MgaWYgQU5ZIHZlcnNpb24gaXMgcHJlbG9hZGVkXG4gICAgICovXG4gICAgaXNQcmVsb2FkZWQoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICAvLyBJZiBzcGVjaWZpYyBlbnYvcHJldmlldyByZXF1ZXN0ZWQsIGNoZWNrIGV4YWN0IG1hdGNoXG4gICAgICAgIGlmIChlbnYgIT09IHVuZGVmaW5lZCB8fCBwcmV2aWV3ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7Y29tcG9uZW50SWR9OiR7ZW52IHx8IHRoaXMuX2RlZmF1bHRFbnZ9OiR7cHJldmlldyA/ICdwcmV2aWV3JyA6ICdsaXZlJ31gO1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlS2V5IGluIHRoaXMudmFyaWFudHM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGNoZWNrIGlmIGFueSB2ZXJzaW9uIHdhcyBwcmVsb2FkZWRcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudElkIGluIHRoaXMucHJlbG9hZGVkQ29tcG9uZW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHByZWxvYWRlZCBwYXJhbXMgZm9yIGEgY29tcG9uZW50IChpZiBwcmVsb2FkZWQpXG4gICAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgbm90IHByZWxvYWRlZFxuICAgICAqL1xuICAgIGdldFByZWxvYWRlZFBhcmFtcyhjb21wb25lbnRJZDogc3RyaW5nKTogeyBlbnY6IHN0cmluZzsgcHJldmlldzogYm9vbGVhbiB9IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBhIGNvbXBvbmVudCBjb25maWc6IGZldGNoIGl0IG9uY2UsIHRoZW4gc2VydmUgaXQgZnJvbSB0aGlzXG4gICAgICogcmVwb3NpdG9yeSdzIGNhY2hlLlxuICAgICAqXG4gICAgICogVGhpcyBpcyB0aGUgbmFtZSB0byB1c2UuIGBmZXRjaENvbXBvbmVudFYyYCBpcyB0aGUgc2FtZSBtZXRob2QgdW5kZXIgaXRzXG4gICAgICogdmVyc2lvbmVkIG5hbWUgYW5kIHN0YXlzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IFx1MjAxNCBub3RlIHRoYXQgdGhlXG4gICAgICogdW52ZXJzaW9uZWQgYGZldGNoQ29tcG9uZW50YCBpcyBhICpkZXByZWNhdGVkIHYxKiBBUEkgYW5kIGlzIE5PVCB0aGlzLlxuICAgICAqXG4gICAgICogQ29tcGxldGVzIHRoZSB0cmlvIHdpdGgge0BsaW5rIGdldFJlc29sdmVkQ29uZmlnfSAoc3luY2hyb25vdXMgcmVhZCBvZiBhblxuICAgICAqIGFscmVhZHktcmVzb2x2ZWQgY29uZmlnKSBhbmQge0BsaW5rIGh5ZHJhdGVDb21wb25lbnR9IChzZWVkIG9uZSB5b3VcbiAgICAgKiBhbHJlYWR5IGhvbGQpLlxuICAgICAqXG4gICAgICogUHJlZmVyIHRoZSBtb2R1bGUtbGV2ZWwgYHByZWxvYWRDb21wb25lbnRzKFtpZF0pYCBpbiBhcHAgY29kZTsgcmVhY2ggZm9yXG4gICAgICogdGhpcyB3aGVuIHlvdSBuZWVkIGFuIGlzb2xhdGVkIHJlcG9zaXRvcnkgaW5zdGFuY2Ugd2hvc2UgY2FjaGUgbGlmZXRpbWVcbiAgICAgKiB5b3UgY29udHJvbCBcdTIwMTQgYSBzZXJ2ZXIgd2l0aCBpdHMgb3duIFRUTCwgZm9yIGV4YW1wbGUuXG4gICAgICovXG4gICAgYXN5bmMgcmVzb2x2ZUNvbXBvbmVudChjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoQ29tcG9uZW50VjIoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSB2MiBjb21wb25lbnQgY29uZmlnXG4gICAgICogSWYgZW52L3ByZXZpZXcgbm90IHNwZWNpZmllZCBhbmQgY29tcG9uZW50IHdhcyBwcmVsb2FkZWQsIHVzZXMgcHJlbG9hZGVkIHBhcmFtc1xuICAgICAqXG4gICAgICogQHNlZSByZXNvbHZlQ29tcG9uZW50IFx1MjAxNCB0aGUgdW52ZXJzaW9uZWQgbmFtZSBmb3IgdGhpcyBtZXRob2RcbiAgICAgKi9cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudFYyKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudmlyb25tZW50SWRlbnRpZmllcj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBQcm9taXNlPElDb21wb25lbnRDb25maWc+IHtcbiAgICAgICAgY29uc3QgeyBlbnYsIHVzZVByZXZpZXcsIGNhY2hlS2V5IH0gPSB0aGlzLnJlc29sdmVQYXJhbXMoY29tcG9uZW50SWQsIGVudmlyb25tZW50SWRlbnRpZmllciwgcHJldmlldyk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ1tDbG91ZFJlcG9zaXRvcnldIGZldGNoQ29tcG9uZW50VjInLCB7XG4gICAgICAgICAgICBjb21wb25lbnRJZDogY29tcG9uZW50SWQuc2xpY2UoMCwgOCkgKyAnLi4uJyxcbiAgICAgICAgICAgIGVudixcbiAgICAgICAgICAgIHVzZVByZXZpZXcsXG4gICAgICAgICAgICBjYWNoZUtleSxcbiAgICAgICAgICAgIGNhY2hlZDogY2FjaGVLZXkgaW4gdGhpcy52YXJpYW50c1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXRoaXMudmFyaWFudHNbY2FjaGVLZXldKSB7XG4gICAgICAgICAgICAvLyBUcmFjayB0aGlzIGFzIHByZWxvYWRlZCAoZmlyc3QgZmV0Y2ggY291bnRzIGFzIHByZWxvYWQpXG4gICAgICAgICAgICBpZiAoIXRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdID0geyBlbnYsIHByZXZpZXc6IHVzZVByZXZpZXcgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudmFyaWFudHNbY2FjaGVLZXldID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybDogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRpY01vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gdXNlUHJldmlldyA/ICdwcmV2aWV3JyA6IGVudjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBgJHt0aGlzLl9iYXNlVXJsfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9LyR7ZmlsZX0uanNvbmA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHRoaXMuX3F1ZXJ5UGFyYW1zKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxcykgdXJsICs9IGA/JHtxc31gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBgL2NvbnN1bWU/aWQ9JHtjb21wb25lbnRJZH0mZW52PSR7ZW52fWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVByZXZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcmcHJldmlldz10cnVlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBwcmV2aWV3IGlzIG5ldmVyIG1pbmlmaWVkOiB0aGUgYXJ0aWZhY3QgaXMgYnVpbHQgZnJvbSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxlYXNlZCB2YXJpYW50LCBhbmQgYW4gYXV0aG9yIG11c3Qgc2VlIHRoZWlyIG93biBlZGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9kZWxpdmVyeS5taW5pZnkgJiYgIXVzZVByZXZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcmb3B0PW1pbic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAtLS0tIHRoZSBjbGllbnQgd2luZG93IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgcHJldmlldyBpcyBuZXZlciBoZWxkOiBhbiBhdXRob3IgaGFzIHRvIHNlZSB0aGVpciBvd24gZWRpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlYWJsZSA9IHRoaXMuX2RlbGl2ZXJ5LmNhY2hlICYmICF0aGlzLl9zdGF0aWNNb2RlICYmICF1c2VQcmV2aWV3O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RvcmVLZXkgPSBjYWNoZWFibGUgPyBkZWxpdmVyeVN0b3JlLmtleShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbGl2ZXJ5SG9zdCgpLCBjb21wb25lbnRJZCwgZW52LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVByZXZpZXcsIHRoaXMuX2RlbGl2ZXJ5Lm1pbmlmeSA/ICdtaW4nIDogJ3JhdycpIDogJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGVsZCA9IGNhY2hlYWJsZSA/IGF3YWl0IGRlbGl2ZXJ5U3RvcmUuZ2V0KHN0b3JlS2V5KSA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWxkICYmIGRlbGl2ZXJ5U3RvcmUuZnJlc2goaGVsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnNpZGUgdGhlIHdpbmRvdzogbm8gcmVxdWVzdCBhdCBhbGwuIENvdW50ZWQgbG9jYWxseSBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBvcnRlZCBsYXRlciwgb3IgdGhpcyB2aXNpdCBpcyBpbnZpc2libGUgdG8gdGhlIGxlZGdlci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLmZyb21TdG9yYWdlKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RlTG9jYWxTZXJ2ZShjb21wb25lbnRJZCwgZW52KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy52YXJpYW50c1tjYWNoZUtleV0gYXMgYW55KS5yZXNvbHZlZCA9IGhlbGQuY29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaGVsZC5jb25maWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlbGQgJiYgaGVsZC50YWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgd2luZG93IGVuZGVkLiBTZW5kIGJhY2sgdGhlIHZlcnNpb24gd2UgaG9sZCByYXRoZXIgdGhhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWRvd25sb2FkaW5nOiB0aGUgYW5zd2VyIGlzIHVzdWFsbHkgYSBmZXcgaHVuZHJlZCBieXRlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSB0aGUgYGlkcz1gL2BoYXZlPWAgcm91dGUgYW5kIE5PVCBJZi1Ob25lLU1hdGNoOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgcmVxdWVzdCBoZWFkZXIgdHJpZ2dlcnMgYSBDT1JTIHByZWZsaWdodCwgdGhlcmUgaXMgbm8gT1BUSU9OU1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvdXRlLCBhbmQgaXQgZmFpbHMgaW4gYSBicm93c2VyIHdoaWxlIHdvcmtpbmcgcGVyZmVjdGx5IGluIGN1cmwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHZhbGlkYXRvciB0cmF2ZWxzIGluIHRoZSBxdWVyeSBzdHJpbmcsIHNvIGl0IGlzIGEgcGxhaW4gR0VULlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGB1aVRhZ3NgIHJpZGUgaW5zaWRlIHRoZSBoZWxkIGNvbmZpZy4gQSB0YWcgZWRpdCBkb2VzIG5vdCBidW1wIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldiAodGhlIHNlcnZlciBwYXRjaGVzIHRoZSBjb21wb25lbnQgZG9jIGluIHBsYWNlKSwgc28gdGhlIGxhbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBlbmRzIGEgaGFzaCBvZiB1aVRhZ3MgdG8gYHRhZ2AgKGRlbGl2ZXJ5L2xhbmUgbG9naWMvdWlUYWdzLnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdWlUYWdzS2V5KTogYSB0YWctb25seSBlZGl0IGlzIGFuc3dlcmVkIFwiY2hhbmdlZFwiLCB3aXRoIHRoZSBuZXcgdGFncy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja1VybCA9IGAvY29uc3VtZT9pZHM9JHtjb21wb25lbnRJZH0mZW52PSR7ZW52fWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5fZGVsaXZlcnkubWluaWZ5ID8gJyZvcHQ9bWluJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAmaGF2ZT0ke2VuY29kZVVSSUNvbXBvbmVudChoZWxkLnRhZyl9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVN0YXRzLnJldmFsaWRhdGlvbnMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVjayA9IGF3YWl0IHRoaXMuZGVsaXZlcnlGZXRjaChjaGVja1VybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVjay5vaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IGNoZWNrLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYm9keS51bmNoYW5nZWQgfHwgW10pLmluY2x1ZGVzKGNvbXBvbmVudElkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMudW5jaGFuZ2VkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy5ieXRlc1NhdmVkICs9IENsb3VkUmVwb3NpdG9yeS5zaXplT2ZIZWxkKGhlbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbGQuc3RvcmVkQXQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbGQud2luZG93TXMgPSBkZWxpdmVyeVN0b3JlLndpbmRvd0Zyb20oY2hlY2suaGVhZGVycykgfHwgaGVsZC53aW5kb3dNcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxpdmVyeVN0b3JlLnB1dChoZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy52YXJpYW50c1tjYWNoZUtleV0gYXMgYW55KS5yZXNvbHZlZCA9IGhlbGQuY29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaGVsZC5jb25maWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0IGNoYW5nZWQuIFRoZSBhbnN3ZXIgYWxyZWFkeSBjYXJyaWVzIHRoZSBuZXcgYnl0ZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gKGJvZHkuaXRlbXMgfHwgW10pWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjZmcgPSBjb252ZXJ0VjJWYXJpYW50VG9Db21wb25lbnRDb25maWcoaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVsaXZlcnlTdGF0cy5mcm9tTmV0d29yaysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlbGl2ZXJ5U3RvcmUucHV0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBzdG9yZUtleSwgY29uZmlnOiBjZmcsIHRhZzogaXRlbS50YWcgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd01zOiBkZWxpdmVyeVN0b3JlLndpbmRvd0Zyb20oY2hlY2suaGVhZGVycyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Q6IHRoaXMuZGVsaXZlcnlIb3N0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBhbnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSBhcyBhbnkpLnJlc29sdmVkID0gY2ZnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY2ZnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBmYWlsZWQgcmUtY2hlY2sgbXVzdCBub3QgZmFpbCB0aGUgcGFnZTogZmFsbCB0aHJvdWdoIHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBvcmRpbmFyeSBmZXRjaCBiZWxvdy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IHRoaXMuX3N0YXRpY01vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGF3YWl0IGZldGNoKHVybClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF3YWl0IHRoaXMuZGVsaXZlcnlGZXRjaCh1cmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBjb21wb25lbnQgXCIke2NvbXBvbmVudElkfVwiICgke3Jlcy5zdGF0dXN9JHt0aGlzLl9zdGF0aWNNb2RlID8gYCBmcm9tICR7dXJsfWAgOiAnJ30pYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFyaWFudCA9IGpzb24uaXRlbTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiBub3QgZm91bmRgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhbnQuY29uc3VtZV92YXJpYW50IHx8ICF2YXJpYW50LmNvbnN1bWVfdmFyaWFudC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBDb21wb25lbnQgXCIke2NvbXBvbmVudElkfVwiIGhhcyBubyBpbXBsZW1lbnRhdGlvbiBmb3IgZW52aXJvbm1lbnQgXCIke2Vudn1cImApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudENvbmZpZyA9IGNvbnZlcnRWMlZhcmlhbnRUb0NvbXBvbmVudENvbmZpZyh2YXJpYW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJ5U3RhdHMuZnJvbU5ldHdvcmsrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIb2xkIGl0IGZvciBleGFjdGx5IGFzIGxvbmcgYXMgdGhlIHNlcnZlciBzYWlkLCBtaW51cyB3aGF0IGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDRE4gYWxyZWFkeSBzcGVudCAoZGVsaXZlcnlTdG9yZS53aW5kb3dGcm9tKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxpdmVyeVN0b3JlLnB1dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogc3RvcmVLZXksIGNvbmZpZzogY29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWc6ICh2YXJpYW50IGFzIGFueSkudGFnIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dNczogZGVsaXZlcnlTdG9yZS53aW5kb3dGcm9tKHJlcy5oZWFkZXJzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdDogdGhpcy5kZWxpdmVyeUhvc3QoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIGFueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUYWcgdGhlIFByb21pc2Ugc28gZ2V0UmVzb2x2ZWRDb25maWcgY2FuIHJlYWQgaXQgc3luY2hyb25vdXNseVxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMudmFyaWFudHNbY2FjaGVLZXldIGFzIGFueSkucmVzb2x2ZWQgPSBjb21wb25lbnRDb25maWc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvbXBvbmVudENvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBjYWNoZWQgcmVqZWN0ZWQgcHJvbWlzZSBzbyB0aGUgbmV4dCBjYWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlcyBhIGZyZXNoIHJlcXVlc3QgKGUuZy4gYWZ0ZXIgbmV0d29yayByZWNvdmVyeSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy52YXJpYW50c1tjYWNoZUtleV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3luY2hyb25vdXMgdmVyc2lvbiBvZiBmZXRjaENvbXBvbmVudFYyIFx1MjAxNCByZXR1cm5zIHRoZSBjb25maWcgb25seSBpZlxuICAgICAqIHRoZSBmZXRjaCBhbHJlYWR5IGNvbXBsZXRlZCwgbnVsbCBvdGhlcndpc2UuXG4gICAgICpcbiAgICAgKiBVc2VzIHRoZSBzYW1lIGB0aGlzLnZhcmlhbnRzYCBjYWNoZSB0aGF0IGZldGNoQ29tcG9uZW50VjIvcHJlbG9hZENvbXBvbmVudHNcbiAgICAgKiBwb3B1bGF0ZS4gRWFjaCBjYWNoZWQgUHJvbWlzZSBpcyB0YWdnZWQgd2l0aCBhIGAucmVzb2x2ZWRgIHByb3BlcnR5IHdoZW5cbiAgICAgKiBpdCBzZXR0bGVzIFx1MjAxNCB0aGlzIG1ldGhvZCBqdXN0IHJlYWRzIHRoYXQgcHJvcGVydHkuIE5vIHNlcGFyYXRlIGNhY2hlLlxuICAgICAqXG4gICAgICogV2h5IHRoaXMgZXhpc3RzOiBSZWFjdCBOYXRpdmUgbmVlZHMgdGhlIGNvbmZpZyBhdCByZW5kZXIgdGltZSB0byBlbWJlZCBpdFxuICAgICAqIGluIHRoZSBXZWJWaWV3IEhUTUwgKGNhbid0IGF3YWl0IGluIHVzZVN0YXRlKS4gSWYgcHJlbG9hZENvbXBvbmVudHMgcmFuXG4gICAgICogZWFybGllciBhbmQgdGhlIGZldGNoIGNvbXBsZXRlZCwgdGhpcyByZXR1cm5zIHRoZSByZXN1bHQgc3luY2hyb25vdXNseSxcbiAgICAgKiBza2lwcGluZyB0aGUgV0VCVklFV19SRUFEWSBcdTIxOTIgZmV0Y2ggXHUyMTkyIGluamVjdCByb3VuZCB0cmlwIGVudGlyZWx5LlxuICAgICAqL1xuICAgIGdldFJlc29sdmVkQ29uZmlnKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBJQ29tcG9uZW50Q29uZmlnIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHsgY2FjaGVLZXkgfSA9IHRoaXMucmVzb2x2ZVBhcmFtcyhjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFyaWFudHNbY2FjaGVLZXldPy5yZXNvbHZlZCB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgdWk6YCB0YWdzIG9mIGFuIGFscmVhZHktcmVzb2x2ZWQgY29tcG9uZW50IChgW11gIGlmIGl0IGhhcyBub25lIG9yIGlzIG5vdFxuICAgICAqIHJlc29sdmVkIHlldCkuIFN5bmNocm9ub3VzLCBubyByZXF1ZXN0OiB0YWdzIGFycml2ZSB3aXRoIHRoZSBjb21wb25lbnQgaXRzZWxmLlxuICAgICAqL1xuICAgIGdldENvbXBvbmVudFRhZ3MoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVzb2x2ZWRDb25maWcoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk/LnR5cGU/LnVpVGFncyB8fCBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIHdoaWNoIChlbnYsIHByZXZpZXcpIHBhaXIgXHUyMDE0IGFuZCB0aGVyZWZvcmUgd2hpY2ggY2FjaGUga2V5IFx1MjAxNCBhIGNhbGxcbiAgICAgKiBmb3IgYGNvbXBvbmVudElkYCByZWZlcnMgdG8uXG4gICAgICpcbiAgICAgKiBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBmZXRjaENvbXBvbmVudFYyLCBnZXRSZXNvbHZlZENvbmZpZyBhbmRcbiAgICAgKiBoeWRyYXRlQ29tcG9uZW50LCBzbyBhIGh5ZHJhdGVkIGNvbmZpZyBhbHdheXMgbGFuZHMgb24gdGhlIGtleSBhIGxhdGVyXG4gICAgICogZmV0Y2ggd2lsbCBsb29rIHVuZGVyLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzb2x2ZVBhcmFtcyhjb21wb25lbnRJZDogc3RyaW5nLCBlbnZpcm9ubWVudElkZW50aWZpZXI/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKSB7XG4gICAgICAgIC8vIElmIG5vIGV4cGxpY2l0IGVudi9wcmV2aWV3IGFuZCBjb21wb25lbnQgd2FzIHByZWxvYWRlZCwgdXNlIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgICAgY29uc3QgcHJlbG9hZGVkID0gdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXTtcbiAgICAgICAgY29uc3QgaGFzRXhwbGljaXRQYXJhbXMgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgIT09IHVuZGVmaW5lZCB8fCBwcmV2aWV3ICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IGVudjogc3RyaW5nO1xuICAgICAgICBsZXQgdXNlUHJldmlldzogYm9vbGVhbjtcblxuICAgICAgICBpZiAoIWhhc0V4cGxpY2l0UGFyYW1zICYmIHByZWxvYWRlZCkge1xuICAgICAgICAgICAgLy8gVXNlIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgICAgICAgIGVudiA9IHByZWxvYWRlZC5lbnY7XG4gICAgICAgICAgICB1c2VQcmV2aWV3ID0gcHJlbG9hZGVkLnByZXZpZXc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBVc2UgcHJvdmlkZWQgcGFyYW1zIG9yIGRlZmF1bHRzXG4gICAgICAgICAgICBlbnYgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgfHwgdGhpcy5fZGVmYXVsdEVudjtcbiAgICAgICAgICAgIC8vIElmIHByZXZpZXcgZXhwbGljaXRseSB0cnVlIFx1MjE5MiB0cnVlXG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IGV4cGxpY2l0bHkgZmFsc2UgXHUyMTkyIGZhbHNlXG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IHVuZGVmaW5lZDogZW52IHdhcyBzcGVjaWZpZWQgKHZpYSBwYXJhbSBvciBzZXRFbnZpcm9ubWVudCkgXHUyMTkyIGZhbHNlLCBvdGhlcndpc2UgXHUyMTkyIHRydWVcbiAgICAgICAgICAgIGNvbnN0IGhhc0VmZmVjdGl2ZUVudiA9IGVudmlyb25tZW50SWRlbnRpZmllciB8fCB0aGlzLl9lbnZFeHBsaWNpdGx5U2V0O1xuICAgICAgICAgICAgdXNlUHJldmlldyA9IHByZXZpZXcgPT09IHRydWUgPyB0cnVlIDogKHByZXZpZXcgPT09IGZhbHNlID8gZmFsc2UgOiAhaGFzRWZmZWN0aXZlRW52KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGVudiwgdXNlUHJldmlldywgY2FjaGVLZXk6IGAke2NvbXBvbmVudElkfToke2Vudn06JHt1c2VQcmV2aWV3ID8gJ3ByZXZpZXcnIDogJ2xpdmUnfWAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWVkIGFuIGFscmVhZHktcmVzb2x2ZWQgY29tcG9uZW50IGNvbmZpZyBpbnRvIHRoZSBjYWNoZSwgd2l0aG91dCBhbnlcbiAgICAgKiBuZXR3b3JrIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBUaGUgY291bnRlcnBhcnQgdG8ge0BsaW5rIGZldGNoQ29tcG9uZW50VjJ9OiB1c2UgaXQgd2hlbiB0aGUgY29uZmlnIHdhc1xuICAgICAqIHJlc29sdmVkIHNvbWV3aGVyZSBlbHNlIFx1MjAxNCBtb3N0IG9mdGVuIG9uIGEgc2VydmVyLCB0aGVuIGVtYmVkZGVkIGluIHRoZVxuICAgICAqIHBhZ2UgXHUyMDE0IHNvIHRoZSBicm93c2VyIGNhbiByZW5kZXIgdGhlIGNvbXBvbmVudCB3aXRoIG5vIHJvdW5kIHRyaXAuXG4gICAgICpcbiAgICAgKiBBZnRlciBoeWRyYXRpbmcsIGBmZXRjaENvbXBvbmVudFYyYCwgYGdldFJlc29sdmVkQ29uZmlnYCBhbmQgYGlzUHJlbG9hZGVkYFxuICAgICAqIGFsbCBhbnN3ZXIgZm9yIHRoaXMgY29tcG9uZW50IGZyb20gbWVtb3J5LlxuICAgICAqXG4gICAgICogUGFzcyB0aGUgc2FtZSBgZW52YCAvIGBwcmV2aWV3YCB0aGUgY29uZmlnIHdhcyByZXNvbHZlZCB3aXRoOyB0aGUgZGVmYXVsdHNcbiAgICAgKiBtYXRjaCB3aGF0IGEgcGxhaW4gYGZldGNoQ29tcG9uZW50VjIoY29tcG9uZW50SWQpYCB3b3VsZCBoYXZlIHVzZWQuXG4gICAgICovXG4gICAgaHlkcmF0ZUNvbXBvbmVudChjb21wb25lbnRJZDogc3RyaW5nLCBjb25maWc6IElDb21wb25lbnRDb25maWcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBlbnY6IHJlc29sdmVkRW52LCB1c2VQcmV2aWV3LCBjYWNoZUtleSB9ID0gdGhpcy5yZXNvbHZlUGFyYW1zKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xuXG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoY29uZmlnKSBhcyBQcm9taXNlPElDb21wb25lbnRDb25maWc+ICYgeyByZXNvbHZlZD86IElDb21wb25lbnRDb25maWcgfTtcbiAgICAgICAgLy8gVGFnIGl0IHRoZSBzYW1lIHdheSBmZXRjaENvbXBvbmVudFYyIGRvZXMsIHNvIGdldFJlc29sdmVkQ29uZmlnIGNhblxuICAgICAgICAvLyByZWFkIGl0IHN5bmNocm9ub3VzbHkuXG4gICAgICAgIHByb21pc2UucmVzb2x2ZWQgPSBjb25maWc7XG5cbiAgICAgICAgdGhpcy52YXJpYW50c1tjYWNoZUtleV0gPSBwcm9taXNlO1xuICAgICAgICB0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdID0geyBlbnY6IHJlc29sdmVkRW52LCBwcmV2aWV3OiB1c2VQcmV2aWV3IH07XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IFYxIE1ldGhvZHMgKExlZ2FjeSkgPT09PT09PT09PT09XG5cbiAgICAvKiogaWRzIHNlZWRlZCBieSBoeWRyYXRlVjFDb21wb25lbnQgd2hvc2UgZmlyc3QgdXNlIGhhcyBub3QgYmVlbiBjb3VudGVkIHlldCAqL1xuICAgIHByaXZhdGUgX2h5ZHJhdGVkVjEgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIC8qKlxuICAgICAqIFNlZWQgYSB2MSBjb21wb25lbnQncyBjb25maWcsIHNvIGBmZXRjaENvbXBvbmVudFYxKGNvbXBvbmVudElkKWAgYW5zd2VycyBmcm9tIG1lbW9yeVxuICAgICAqIHdpdGggbm8gcmVxdWVzdC4gVGhlIHYxIGNvdW50ZXJwYXJ0IG9mIHtAbGluayBoeWRyYXRlQ29tcG9uZW50fS5cbiAgICAgKlxuICAgICAqIGBmbG93YCBpcyB3aGF0IGBHRVQgL2Zsb3c/aWQ9PGNvbXBvbmVudElkPiZhdXRvPXRydWVgIHJldHVybnM6IGVpdGhlciB0aGUgd2hvbGUgYm9keVxuICAgICAqIChge2l0ZW06IHsuLi59fWApIG9yIGl0cyBgaXRlbWAuIFR5cGljYWwgdXNlIGlzIGEgc2VydmVyIHRoYXQgZmV0Y2hlZCBpdCAod2l0aFxuICAgICAqIGAmcHJlZmV0Y2g9MWAsIHNvIHRoZSBmZXRjaCBpcyBub3QgY291bnRlZCBhcyBhIHZpZXcpIGFuZCBlbWJlZGRlZCBpdCBpbiB0aGUgcGFnZS5cbiAgICAgKlxuICAgICAqIFRoZSB2aWV3IElTIGNvdW50ZWQ6IHRoZSBmaXJzdCB0aW1lIHRoZSBzZWVkZWQgY29uZmlnIGlzIHVzZWQsIGl0IGlzIHJlcG9ydGVkIHRocm91Z2hcbiAgICAgKiAvY2xpZW50VXNhZ2UgKGZsYWdnZWQgYDpoYCwgcmVjb3JkZWQgYXMgZGVsaXZlcnlQYXRoICdoeWRyYXRlZCcpLCBzbyBoeWRyYXRpbmcgbmV2ZXIgbWFrZXNcbiAgICAgKiB1c2FnZSBkaXNhcHBlYXIgYW5kIHNlcnZlci1yZW5kZXJlZCB2aWV3cyBzdGF5IGRpc3Rpbmd1aXNoYWJsZS5cbiAgICAgKi9cbiAgICBoeWRyYXRlVjFDb21wb25lbnQoY29tcG9uZW50SWQ6IHN0cmluZywgZmxvdzogSVVzZXJGbG93IHwgeyBpdGVtOiBJVXNlckZsb3cgfSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpdGVtID0gKGZsb3cgYXMgYW55KT8uaXRlbSA/PyBmbG93O1xuICAgICAgICBpZiAoIWl0ZW0/LmNvbXBvbmVudHM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBoeWRyYXRlVjFDb21wb25lbnQoJHtjb21wb25lbnRJZH0pOiBub3QgYSAvZmxvdz9hdXRvPXRydWUgcmVzcG9uc2VgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0gPSBQcm9taXNlLnJlc29sdmUoaXRlbSBhcyBJVXNlckZsb3cpO1xuICAgICAgICB0aGlzLl9oeWRyYXRlZFYxLmFkZChjb21wb25lbnRJZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSB2MSBjb21wb25lbnQgZnJvbSBhIGZsb3dcbiAgICAgKi9cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudFYxKGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZD86IHN0cmluZykge1xuICAgICAgICBpZiAoZmxvd0lkKSB7XG4gICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgdGhpcy5mZXRjaEZsb3coZmxvd0lkKTtcbiAgICAgICAgICAgIHJldHVybiBmbG93LmNvbXBvbmVudHMuZmluZChjID0+IGMudHlwZS5pZCA9PT0gY29tcG9uZW50SWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IHRoaXMuZmV0Y2hBdXRvRmxvdyhjb21wb25lbnRJZCk7XG4gICAgICAgICAgICByZXR1cm4gZmxvdy5jb21wb25lbnRzWzBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hBdXRvRmxvdyhjb21wb25lbnRJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLl9oeWRyYXRlZFYxLmRlbGV0ZShjb21wb25lbnRJZCkpIHtcbiAgICAgICAgICAgIHRoaXMubm90ZUxvY2FsU2VydmUoY29tcG9uZW50SWQsICd2MV9hdXRvX2Zsb3cnLCAnaCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkoe2Zsb3c6IHRydWV9KSBtb3ZlcyB2MSBjb25maWdzIHRvIHRoZSBsYW5lLCB3aXRoIHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmUtc2hvdCBmYWxsYmFjayB0byBjbG91ZC5teW9wLmRldiBhcyAvY29uc3VtZS4gT2ZmOiB1bmNoYW5nZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gYC9mbG93P2lkPSR7Y29tcG9uZW50SWR9JmF1dG89dHJ1ZWA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSB0aGlzLl9kZWxpdmVyeS5mbG93ICYmIHRoaXMuX2RlbGl2ZXJ5Lmhvc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGF3YWl0IHRoaXMuZGVsaXZlcnlGZXRjaChwYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXdhaXQgZmV0Y2goYCR7dGhpcy5fYmFzZVVybH0ke3BhdGh9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoanNvbi5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdO1xuICAgIH1cblxuICAgIGFzeW5jIGZldGNoRmxvdyhmbG93SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMudXNlckZsb3dzW2Zsb3dJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tmbG93SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vZmxvdz9pZD0ke2Zsb3dJZH0mcmVzb2x2ZT1jb21wb25lbnRzYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT0gQmFja3dhcmQgQ29tcGF0aWJpbGl0eSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBmZXRjaENvbXBvbmVudFYyIG9yIGZldGNoQ29tcG9uZW50VjEgZXhwbGljaXRseVxuICAgICAqIERlZmF1bHRzIHRvIHYxIGJlaGF2aW9yIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZVxuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZD86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaENvbXBvbmVudFYxKGNvbXBvbmVudElkLCBmbG93SWQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ2xvdWRSZXBvc2l0b3J5IGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IHYyX0Nsb3VkUmVwb3NpdG9yeSA9IENsb3VkUmVwb3NpdG9yeTtcbiIsICJpbXBvcnQgeyBDbG91ZFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9DbG91ZFJlcG9zaXRvcnlcIjtcbmltcG9ydCB7IElDb21wb25lbnRDb25maWcgfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmxldCBfY2xvdWRSZXBvc2l0b3J5ID0gQ2xvdWRSZXBvc2l0b3J5Lk1haW47XG5cbmV4cG9ydCBjb25zdCBnZXRDbG91ZFJlcG9zaXRvcnkgPSAoKSA9PiBfY2xvdWRSZXBvc2l0b3J5O1xuXG5leHBvcnQgY29uc3QgaXNQcmVsb2FkZWQgPSAoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiBfY2xvdWRSZXBvc2l0b3J5LmlzUHJlbG9hZGVkKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFByZWxvYWRlZFBhcmFtcyA9IChjb21wb25lbnRJZDogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIF9jbG91ZFJlcG9zaXRvcnkuZ2V0UHJlbG9hZGVkUGFyYW1zKGNvbXBvbmVudElkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBlbmFibGVMb2NhbERldiA9ICgpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5ID0gbmV3IENsb3VkUmVwb3NpdG9yeShcImh0dHA6Ly9sb2NhbGhvc3Q6OTI5MlwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDbG91ZFJlcG9zaXRvcnlVcmwgPSAodXJsOiBzdHJpbmcpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5ID0gbmV3IENsb3VkUmVwb3NpdG9yeSh1cmwpO1xufTtcblxuLyoqXG4gKiBDb25maWd1cmUgdGhlIFNESyB0byBmZXRjaCBjb21wb25lbnRzIGZyb20gYSBzZWxmLWhvc3RlZCBzdGF0aWMgcmVnaXN0cnkgKFMzLCBDRE4sIGV0Yy4pXG4gKiBpbnN0ZWFkIG9mIHRoZSBNeW9wIGNsb3VkLiBDb21wb25lbnRzIGFyZSBzZXJ2ZWQgYXMgc3RhdGljIEpTT04gZmlsZXM6XG4gKiAgIGAke2NkblVybH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS8ke2Vudmlyb25tZW50fS5qc29uYFxuICovXG5leHBvcnQgY29uc3QgZW5hYmxlU2VsZkhvc3RlZCA9IChjZG5Vcmw6IHN0cmluZywgcXVlcnlQYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoY2RuVXJsKTtcbiAgICBfY2xvdWRSZXBvc2l0b3J5LmVuYWJsZVN0YXRpY01vZGUoKTtcbiAgICBpZiAocXVlcnlQYXJhbXMpIHtcbiAgICAgICAgX2Nsb3VkUmVwb3NpdG9yeS5zZXRRdWVyeVBhcmFtcyhxdWVyeVBhcmFtcyk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBUSEUgT1BULUlOLiBPbmUgY2FsbCwgYW5kIG5vdGhpbmcgY2hhbmdlcyBmb3IgYW55b25lIHdobyBkb2VzIG5vdCBtYWtlIGl0LlxuICpcbiAqICAgbXlvcC5kZWxpdmVyeSh7IG1pbmlmeTogdHJ1ZSB9KTtcbiAqXG4gKiBPcHRpbmcgaW4gSVMgY2hvb3NpbmcgdGhlIGRlbGl2ZXJ5IGxhbmU6IGEgc2Vjb25kLCBjb21wbGV0ZSBNeW9wIHN0YWNrIChpdHMgb3duIHNlcnZlclxuICogYW5kIENETikgcmVhZGluZyB0aGUgc2FtZSBjb21wb25lbnQgZGF0YS4gU28gdGhpcyBjYWxsIGRvZXMgdHdvIHRoaW5ncyBhdCBvbmNlIFx1MjAxNCBpdFxuICogcG9pbnRzIGAvY29uc3VtZWAgYXQgdGhhdCBzdGFjayBhbmQgYXNrcyBpdCBmb3IgdGhlIG1pbmlmaWVkIGFydGlmYWN0IFx1MjAxNCB3aGljaCBpcyB3aHlcbiAqIHR1cm5pbmcgdGhlIGZlYXR1cmUgb2ZmIGlzIGEgY29uZmlnIHZhbHVlIG9uIG91ciBzaWRlIG9yIG9uZSBsaW5lIG9uIHlvdXJzLCBhbmQgbmV2ZXJcbiAqIGEgRE5TIGNoYW5nZS5cbiAqXG4gKiBTYWZldHkgcHJvcGVydGllcywgYWxsIGRlbGliZXJhdGU6XG4gKiAgIC0gSWYgdGhlIGxhbmUgZmFpbHMgKHRyYW5zcG9ydCBlcnJvciBvciA1eHgpLCB0aGUgU0RLIHJldHJpZXMgT05DRSBhZ2FpbnN0XG4gKiAgICAgY2xvdWQubXlvcC5kZXYgYW5kIHRoZSBwYWdlIHJlbmRlcnMgYW55d2F5LiBgZGVsaXZlcnkuc3RhdHMoKS5mZWxsQmFja2AgY291bnRzIGl0LlxuICogICAtIGBjYWNoZTogdHJ1ZWAgYWRkcyB0aGUgY2xpZW50IHdpbmRvdzogYSBjb21wb25lbnQgdGhpcyBicm93c2VyIGFscmVhZHkgaG9sZHMsIHN0aWxsXG4gKiAgICAgaW5zaWRlIHRoZSBmcmVzaG5lc3MgdGhlIHNlcnZlciBwcm9taXNlZCwgaXMgcmVuZGVyZWQgd2l0aCBOTyByZXF1ZXN0LiBPbmNlIHRoZVxuICogICAgIHdpbmRvdyBlbmRzIHRoZSBicm93c2VyIHNlbmRzIGJhY2sgdGhlIHZlcnNpb24gaXQgaG9sZHMgaW5zdGVhZCBvZiByZS1kb3dubG9hZGluZy5cbiAqICAgLSBBIHByZXZpZXcgaXMgbmV2ZXIgbWluaWZpZWQgYW5kIG5ldmVyIGNhY2hlZC5cbiAqICAgLSBPbmx5IC9jb25zdW1lIG1vdmVzLiBFdmVyeXRoaW5nIGVsc2Uga2VlcHMgdGhlIGhvc3QgaXQgaGFzIHRvZGF5IC0tIHVubGVzc1xuICogICAgIGBmbG93OiB0cnVlYCwgd2hpY2ggYWxzbyBtb3ZlcyB2MSBjb21wb25lbnQgY29uZmlncyAoYC9mbG93P2F1dG89dHJ1ZWApLCB3aXRoIHRoZVxuICogICAgIHNhbWUgZmFsbGJhY2suXG4gKiAgIC0gQXNraW5nIGZvciBgbWluaWZ5YCBkb2VzIG5vdCBmb3JjZSBpdDogdGhlIHNlcnZlciBkZWNpZGVzIHBlciBjb21wb25lbnQsIGFuZCBhXG4gKiAgICAgY29tcG9uZW50IHRoYXQgaXMgbm90IGVuYWJsZWQgaXMgc2VydmVkIHJhdywgd2hpY2ggaXMgbm90IGFuIGVycm9yLlxuICpcbiAqIGBob3N0YCBpcyBmb3IgdXMgKGEgc3RhZ2luZyBsYW5lLCBhIGxvY2FsIHNlcnZlcik7IGxlYXZlIGl0IG91dC5cbiAqXG4gKiBAaW50ZXJuYWwgRGVsaXZlcnkgbGFuZToga2VwdCBvdXQgb2YgdGhlIHB1YmxpYyBBUEkgcmVmZXJlbmNlIHVudGlsIGl0IGlzIHJlbGVhc2VkLlxuICovXG5leHBvcnQgY29uc3QgREVMSVZFUllfSE9TVCA9ICdodHRwczovL2RlbGl2ZXJ5Lm15b3AuZGV2JztcblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IGRlbGl2ZXJ5ID0gKG9wdHM6IHsgbWluaWZ5PzogYm9vbGVhbjsgY2FjaGU/OiBib29sZWFuOyBmbG93PzogYm9vbGVhbjsgaG9zdD86IHN0cmluZyB8IG51bGwgfSA9IHt9KSA9PiB7XG4gICAgY29uc3Qgd2FudHNMYW5lID0gb3B0cy5taW5pZnkgIT09IGZhbHNlIHx8IG9wdHMuY2FjaGUgPT09IHRydWUgfHwgb3B0cy5mbG93ID09PSB0cnVlO1xuICAgIF9jbG91ZFJlcG9zaXRvcnkuc2V0RGVsaXZlcnkoe1xuICAgICAgICBtaW5pZnk6IG9wdHMubWluaWZ5ID8/IGZhbHNlLFxuICAgICAgICBjYWNoZTogb3B0cy5jYWNoZSA/PyBmYWxzZSxcbiAgICAgICAgZmxvdzogb3B0cy5mbG93ID8/IGZhbHNlLFxuICAgICAgICBob3N0OiBvcHRzLmhvc3QgIT09IHVuZGVmaW5lZCA/IG9wdHMuaG9zdCA6ICh3YW50c0xhbmUgPyBERUxJVkVSWV9IT1NUIDogbnVsbCksXG4gICAgfSk7XG4gICAgcmV0dXJuIGRlbGl2ZXJ5U3RhdHMoKTtcbn07XG5cbi8qKlxuICogRm9yZ2V0IHdoYXQgdGhpcyBicm93c2VyIGhvbGRzLCBzbyB0aGUgbmV4dCBsb2FkIGFza3MgdGhlIHNlcnZlci4gVXNlIGl0IHdoZW4gYSBjaGFuZ2VcbiAqIGhhcyB0byBiZSB2aXNpYmxlIG9uIFRISVMgbG9hZCBcdTIwMTQgcmlnaHQgYWZ0ZXIgc29tZW9uZSBwdWJsaXNoZXMgXHUyMDE0IHJhdGhlciB0aGFuIHdpdGhpbiB0aGVcbiAqIGZyZXNobmVzcyB3aW5kb3cuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBkZWxpdmVyeVJlZnJlc2ggPSBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgX2Nsb3VkUmVwb3NpdG9yeS5yZWZyZXNoRGVsaXZlcnkoKTtcbiAgICByZXR1cm4gZGVsaXZlcnlTdGF0cygpO1xufTtcblxuLyoqXG4gKiBXaGF0IGFuc3dlcmVkIHRoZSBsYXN0IHJlcXVlc3RzLCBhbmQgXHUyMDE0IHRoZSBudW1iZXIgd29ydGggd2F0Y2hpbmcgXHUyMDE0IGhvdyBtYW55IHRpbWVzIHRoZVxuICogU0RLIGhhZCB0byBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgaG9zdCBiZWNhdXNlIHRoZSBsYW5lIGRpZCBub3QgYW5zd2VyLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZGVsaXZlcnlTdGF0cyA9ICgpID0+IF9jbG91ZFJlcG9zaXRvcnkuZGVsaXZlcnlTdGF0cygpO1xuXG4vKiogVW5kbyBkZWxpdmVyeSgpOiBiYWNrIHRvIHRoZSBkZWZhdWx0IGhvc3QgYW5kIHJhdyBieXRlcywgd2l0aCBubyByZWxvYWQuIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IGRlbGl2ZXJ5T2ZmID0gKCkgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkuc2V0RGVsaXZlcnkoeyBtaW5pZnk6IGZhbHNlLCBjYWNoZTogZmFsc2UsIGZsb3c6IGZhbHNlLCBob3N0OiBudWxsIH0pO1xuICAgIHJldHVybiBkZWxpdmVyeVN0YXRzKCk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q2xvdWRSZXBvc2l0b3J5ID0gKHJlcG9zaXRvcnk6IENsb3VkUmVwb3NpdG9yeSkgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkgPSByZXBvc2l0b3J5O1xufTtcblxuZXhwb3J0IGNvbnN0IHNldEVudmlyb25tZW50ID0gKGVudjogc3RyaW5nKSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeS5zZXRFbnZpcm9ubWVudChlbnYpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFJlc29sdmVkQ29uZmlnID0gKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pID0+IHtcbiAgICByZXR1cm4gX2Nsb3VkUmVwb3NpdG9yeS5nZXRSZXNvbHZlZENvbmZpZyhjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcbn07XG5cbi8qKlxuICogVGhlIHJ1bnRpbWUgdGFncyBvZiBhIGxvYWRlZC9wcmVsb2FkZWQgY29tcG9uZW50OiBvbmx5IHRhZ3MgbmFtZWQgYHVpOi4uLmAgKGUuZy5cbiAqIGB1aTpiZXRhYCkuIFJldHVybnMgYFtdYCB3aGVuIGl0IGhhcyBub25lIG9yIGhhcyBub3QgYmVlbiBmZXRjaGVkIHlldC5cbiAqXG4gKiBgYGB0c1xuICogYXdhaXQgcHJlbG9hZENvbXBvbmVudHMoW2lkXSk7XG4gKiBnZXRDb21wb25lbnRUYWdzKGlkKTsgLy8gWyd1aTpiZXRhJ11cbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgZ2V0Q29tcG9uZW50VGFncyA9IChjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogc3RyaW5nW10gPT4ge1xuICAgIHJldHVybiBfY2xvdWRSZXBvc2l0b3J5LmdldENvbXBvbmVudFRhZ3MoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk7XG59O1xuXG5leHBvcnQgY29uc3QgcHJlbG9hZENvbXBvbmVudHMgPSBhc3luYyAoaWRzOiBzdHJpbmdbXSwgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbikgPT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICAgIGlkcy5tYXAoKGlkKSA9PiBfY2xvdWRSZXBvc2l0b3J5LmZldGNoQ29tcG9uZW50VjIoaWQsIGVudiwgcHJldmlldykpLFxuICAgICk7XG59O1xuXG4vKipcbiAqIFNlZWQgYWxyZWFkeS1yZXNvbHZlZCBjb21wb25lbnQgY29uZmlncyBpbnRvIHRoZSBTREsgY2FjaGUsIHdpdGggbm8gbmV0d29ya1xuICogcmVxdWVzdC4gVGhlIGNvdW50ZXJwYXJ0IHRvIHtAbGluayBwcmVsb2FkQ29tcG9uZW50c30uXG4gKlxuICogVXNlIGl0IHdoZW4gdGhlIGNvbmZpZ3Mgd2VyZSByZXNvbHZlZCBzb21ld2hlcmUgZWxzZSBcdTIwMTQgdHlwaWNhbGx5IG9uIGEgc2VydmVyXG4gKiBhbmQgZW1iZWRkZWQgaW4gdGhlIHBhZ2UgXHUyMDE0IHNvIHRoZSBjb21wb25lbnQgcmVuZGVycyB3aXRoIHplcm8gcm91bmQgdHJpcHM6XG4gKlxuICogYGBgdHNcbiAqIC8vIHNlcnZlcjogY29uc3QgY29uZmlncyA9IHsgW2lkXTogYXdhaXQgbmV3IENsb3VkUmVwb3NpdG9yeSgpLmZldGNoQ29tcG9uZW50VjIoaWQpIH1cbiAqIC8vIGNsaWVudDpcbiAqIGh5ZHJhdGVDb21wb25lbnRzKGNvbmZpZ3MpO1xuICogLy8gPE15b3BDb21wb25lbnQgY29tcG9uZW50SWQ9e2lkfSAvPiBub3cgcmVuZGVycyB3aXRob3V0IGZldGNoaW5nXG4gKiBgYGBcbiAqXG4gKiBQYXNzIHRoZSBzYW1lIGBlbnZgIC8gYHByZXZpZXdgIHRoZSBjb25maWdzIHdlcmUgcmVzb2x2ZWQgd2l0aDsgdGhlIGRlZmF1bHRzXG4gKiBtYXRjaCB3aGF0IGEgcGxhaW4gYHByZWxvYWRDb21wb25lbnRzKFtpZF0pYCB3b3VsZCBoYXZlIHVzZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBoeWRyYXRlQ29tcG9uZW50cyA9IChcbiAgICBjb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBJQ29tcG9uZW50Q29uZmlnPixcbiAgICBlbnY/OiBzdHJpbmcsXG4gICAgcHJldmlldz86IGJvb2xlYW4sXG4pID0+IHtcbiAgICBmb3IgKGNvbnN0IFtpZCwgY29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdzKSkge1xuICAgICAgICBfY2xvdWRSZXBvc2l0b3J5Lmh5ZHJhdGVDb21wb25lbnQoaWQsIGNvbmZpZywgZW52LCBwcmV2aWV3KTtcbiAgICB9XG59O1xuXG4vKipcbiAqIFRoZSB2MSAoaWZyYW1lIGNvbXBvbmVudCkgY291bnRlcnBhcnQgb2Yge0BsaW5rIGh5ZHJhdGVDb21wb25lbnRzfTogc2VlZCBjb25maWdzIHRoYXQgYVxuICogc2VydmVyIGFscmVhZHkgZmV0Y2hlZCwgc28gYGxvYWRDb21wb25lbnRgIG5lZWRzIG5vIGAvZmxvd2AgcmVxdWVzdCBhdCBhbGwuXG4gKlxuICogYGBgdHNcbiAqIC8vIHNlcnZlciAoY2FjaGUgaXQgfjYwIHM7IGBwcmVmZXRjaD0xYCBrZWVwcyB0aGlzIGZldGNoIG91dCBvZiB0aGUgdmlldyBjb3VudCwgYGZvcmAgc2F5cyB3aGljaFxuICogLy8gcGFnZSBpdCBpcyBmb3IsIHNvIHRoZSBwcmVmZXRjaCBpcyBhdHRyaWJ1dGVkIHRvIHlvdXIgc2l0ZSBcdTIwMTQgaXRzIHF1ZXJ5IHN0cmluZyBpcyBub3Qgc3RvcmVkKTpcbiAqIGNvbnN0IGZsb3cgPSBhd2FpdCAoYXdhaXQgZmV0Y2goYGh0dHBzOi8vY2xvdWQubXlvcC5kZXYvZmxvdz9pZD0ke2lkfSZhdXRvPXRydWUmcHJlZmV0Y2g9MSZmb3I9JHtlbmNvZGVVUklDb21wb25lbnQocGFnZVVybCl9YCkpLmpzb24oKTtcbiAqIC8vIGVtYmVkIEpTT04uc3RyaW5naWZ5KGZsb3cpIGluIHRoZSBwYWdlLCB0aGVuIG9uIHRoZSBjbGllbnQ6XG4gKiBoeWRyYXRlVjFDb21wb25lbnRzKHsgW2lkXTogZmxvdyB9KTtcbiAqIGNvbnN0IGNmZyA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoQ29tcG9uZW50VjEoaWQpOyAgIC8vIG5vIHJlcXVlc3RcbiAqIGBgYFxuICpcbiAqIEVhY2ggc2VlZGVkIGNvbmZpZyBpcyBjb3VudGVkIGFzIGEgdmlldyB0aGUgZmlyc3QgdGltZSBpdCBpcyB1c2VkICh2aWEgL2NsaWVudFVzYWdlKS5cbiAqL1xuZXhwb3J0IGNvbnN0IGh5ZHJhdGVWMUNvbXBvbmVudHMgPSAoZmxvd3M6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHtcbiAgICBmb3IgKGNvbnN0IFtpZCwgZmxvd10gb2YgT2JqZWN0LmVudHJpZXMoZmxvd3MpKSB7XG4gICAgICAgIF9jbG91ZFJlcG9zaXRvcnkuaHlkcmF0ZVYxQ29tcG9uZW50KGlkLCBmbG93KTtcbiAgICB9XG59O1xuIiwgImltcG9ydCB7QmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlciwgSG9zdGVkQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHZvaWRcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBleHRlbmRzIEJhc2VDb250ZXh0TWVzc2FnZUhhbmRsZXI8VCwgUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PFNoYWRvd1Jvb3RSZWY+Pj4ge1xuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZVRvSG9zdDogYW55LCBwdWJsaWMgY29udGV4dDogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PFNoYWRvd1Jvb3RSZWY+Pikge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBpbm5lckV4ZWN1dG9yOiAoZXZlbnQ6IFQsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHZvaWQ7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogVCkgPT4ge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICBpZiAoZXZlbnQuZGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gZXZlbnQuZGVzdGluYXRpb247XG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0W2Rlc3RpbmF0aW9uXS5jb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBwYXRjaCB0aGUgc291cmNlIGlkLCB0aGluayBhYm91dCB0aGF0ID9cbiAgICAgICAgICAgICAgICBjb25zdCBfbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBldmVudC5kZXN0aW5hdGlvbiA/IGV2ZW50LmRlc3RpbmF0aW9uIDogZXZlbnQuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb246IGV2ZW50LnNvdXJjZSA/IGV2ZW50LnNvdXJjZSA6IGV2ZW50LmRlc3RpbmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0gYXMgQmFzZU15b3BNZXNzYWdlLCByZXBsYXlUbylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbm5lckV4ZWN1dG9yKGV2ZW50LCB0aGlzLmNvbnRleHRbZGVzdGluYXRpb25dLmNvbnRleHQsIF9tZXNzYWdlVG9Ib3N0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmluZENsaWNrTWVzc2FnZSwgQ2xpY2tSZXBsYXlNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEJpbmRDbGlja01lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KVxuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6IGFueVtdID0gW107XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7TXlvcEVsZW1lbnRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8TXlvcEVsZW1lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DaGFuZ2VUZXh0TWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IE15b3BFbGVtZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS50ZXh0Q29udGVudCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgU2hhZG93Um9vdFJlZiBleHRlbmRzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdDogU2hhZG93Um9vdCkge1xuICAgICAgICBzdXBlcihjb250YWluZXIsIHNoYWRvd1Jvb3QpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BFbGVtZW50UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlLCBEZXRlY3RNeW9wUmVmc01lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IERldGVjdE15b3BSZWZzTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuXG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH1dYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBNeW9wRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgYWxsTXlvcEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiB0YWtlIHRoYXQgYmFjayB0byB0aGUgZGFzaGJvYXJkP1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhpdGVtLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuXG4gICAgICAgICAgICBpZiAobXlvcElkKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnd2MgcmVjdCcsICBpdGVtLnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBpdGVtLm9mZnNldFRvcCwgaXRlbS5vZmZzZXRMZWZ0KSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IERldGVjdGVkTXlvcFJlZnNNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbXlvcFJlZnMpKVxuICAgIH07XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5EZXRlY3RNeW9wUmVmc01lc3NhZ2U7XG5cblxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRBdHRyaWJ1dGVNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3Mgc2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxTZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogU2V0QXR0cmlidXRlTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSwgZXZlbnQudmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSxcbiAgICBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlLFxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5BZGRFdmVudExpc3RlbmVyTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBpbiBmYWN0IHdoZW4gcnVubmluZyBpbiBXZWJDb21wb25lbnQgd2UgY2FuIHRyYW5zZmVyIHRoZSBvcmlnaW5hbCBlXG4gICAgICAgICAgICAgICAgLy8gY3VycmVudGx5IHVzaW5nIG1ha2VTZXJpYWxpemFibGUgZm9yIG5lc3RlZCBjYXNlcywgdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCAgbWFrZVNlcmlhbGl6YWJsZShlLCBldmVudC5zZXJpYWxpemFibGVTa2VsZXRvbikpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcblxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7SG9zdFNES30gZnJvbSBcIi4uLy4uL2hvc3QvaG9zdFNES1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVJlZiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWY/LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcblxuICAgICAgICAgICAgaWYgKGFsbEl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RTREsgPSBIb3N0U0RLLkluc3RhbmNlKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGV2ZW50Lm9wdGlvbnMuaWQpITtcbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vLy8+Pj4+XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vICBjb25zb2xlLmxvZyhgZmFpbGVkIHRvIGZpbmQgJHtldmVudC5vcHRpb25zLmlkfSBpbiBtZW0gc2NvcGVgLCBob3N0U0RLKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy93ZSBoYXZlIHRoZSByZWYgY29tcG9uZW50IGluIG91ciBIb3N0U0RLIChzYW1lIG1lbW9yeSB3aGVuIHVzaW5nIHdlYmNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAvLyAgcmVmQ29tcG9uZW50LnBhcmVudCA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoZSByZWYgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBob3N0U0RLLmNvbXBvbmVudHMuaW5kZXhPZihyZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdFNESy5jb21wb25lbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQgcmVtb3ZlZCB0ZW1wIHJlZiBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkIHVzaW5nIHRlbXAgcmVmIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50ID0gYXdhaXQgaG9zdFNESy5sb2FkQ29tcG9uZW50KGV2ZW50Lm5lc3RlZENvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuaXRlbSgwKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucylcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IG5vIG5lZWQgdGhpcywgcGFzcyBvcHRpb25zIGZyb20gcGFyZW50XG4gICAgICAgICAgICAgICAgLy9pbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5pZCA9IGV2ZW50LnByZWRlZmluZWRJZDtcbiAgICAgICAgICAgICAgICAvL3JlZkNvbXBvbmVudC5pZCArPSAnLic7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBub3QgcmVhbGx5IG5lZWRlZCA/XG4gICAgICAgICAgICAgICAgLy8gYXdhaXQgaW1wbGVtZW50YXRpb25Db21wb25lbnQuaW5pdGlhdGVkKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRSZWZDb25maWc6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5yZWZzKS5mb3JFYWNoKHJlZk5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVmID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQucmVmc1tyZWZOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgcmVmID0gcmVmLl9fbm9uUHJveGllZCB8fCByZWY7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlZkNvbmZpZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbmVzdGVkUmVmQ29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIC0gRE9NIGVsZW1lbnQgbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgW10sIHRydWUpKTtcblxuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRlUmVmKCkudGhlbigpXG4gICAgICAgIC8vcmV0dXJuaW5nIHVuZGVmaW5lZCBzbyBpdCB3b24ndCBhY3QgYXMgYSBjbGVhbnVwXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3J9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0SGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxFeGVjdXRlU2NyaXB0TWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVTY3JpcHRNZXNzYWdlXG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCByZXBsaWVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIGRhdGEpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yKGV2ZW50LCByZXBsaWVyLCBzaGFkb3dSb290UmVmKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UsIEZvcm1EYXRhRW50cnksIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIElucHV0RWxlbWVudFZhbHVlLH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHMudHNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IGdldElucHV0VmFsdWUgPSAoZWxlbWVudCk6IElucHV0RWxlbWVudFZhbHVlID0+IHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGZvcm1cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGRhdGFPYmplY3Q6IElucHV0RWxlbWVudFZhbHVlID0ge1xuICAgICAgICAgICAgZm9ybURhdGE6IHt9LFxuICAgICAgICAgICAgdW5tYXBwZWREYXRhOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE1hbnVhbGx5IGFkZCBlbGVtZW50cyB3aXRob3V0IG5hbWVzXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpO1xuICAgICAgICBsZXQgYXV0b05hbWVJbmRleGVyID0gLTE7XG5cbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBgXyR7KCsrYXV0b05hbWVJbmRleGVyKX1gXG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlRGF0YTogRm9ybURhdGFFbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldElucHV0VmFsdWUoZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBlbGVtZW50LnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eTogbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LnZhbGlkaXR5LCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgbXlvcElkLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGF0YU9iamVjdDtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtZW50LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2hlY2tlZCA/IGVsZW1lbnQudmFsdWUgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBpbnB1dCBhbmQgdGV4dGFyZWEgZWxlbWVudHNcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnIHx8IGVsZW1lbnQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc2VsZWN0IGVsZW1lbnRzIChkcm9wZG93bnMpXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGVkaXRhYmxlIGRpdnMgKGNvbnRlbnRFZGl0YWJsZSlcbiAgICBpZiAoZWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5pbm5lclRleHQgfHwgZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGFuIHVuc3VwcG9ydGVkIGVsZW1lbnQgdHlwZVxuICAgIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgR2V0RWxlbWVudFZhbHVlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxHZXRFbGVtZW50VmFsdWVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5HZXRFbGVtZW50VmFsdWVNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZShnZXRJbnB1dFZhbHVlKGl0ZW0pKSwgZXZlbnQpO1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7TXlvcEVsZW1lbnRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxTZXRJbm5lckh0bWw+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldElubmVySHRtbDtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IE15b3BFbGVtZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5pbm5lckhUTUwgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogVGhlIFdlYmNvbXBvbmVudCBTREsgaXMgdGFpbG9yZWQgZm9yIHVzaW5nIE15b3AgY29tcG9uZW50cyBwYWNrYWdlZCBhcyBzZXBhcmF0ZSBidW5kbGVzIGFuZCBleHBvc2VkIGFzIHdlYiBjb21wb25lbnRzLjxici8+XG4gKiBEZXZlbG9wZXJzIGltcG9ydGluZyB0aGlzIFNESyBjYW4gbGV2ZXJhZ2UgQVBJcyBhbmQgdXRpbGl0aWVzIHNwZWNpZmljYWxseSBjcmFmdGVkIHRvIHN1cHBvcnQgdGhlIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGFuZCBjb21tdW5pY2F0aW9uIHBhdHRlcm5zIHJlcXVpcmVkIGZvciB3ZWIgY29tcG9uZW50cyB3aXRoaW4gdGhlIE15b3AgYXJjaGl0ZWN0dXJlLjxici8+XG4gKiBUaGlzIFNESyBwcm9tb3RlcyByZXVzYWJpbGl0eSBhbmQgZW5jYXBzdWxhdGlvbiwgZW5hYmxpbmcgZGV2ZWxvcGVycyB0byBidWlsZCBtb2R1bGFyLCBzZWxmLWNvbnRhaW5lZCBjb21wb25lbnRzIHRoYXQgY2FuIGJlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uJ3MgRE9NIHN0cnVjdHVyZS5cbiAqXG4gKlxuICogT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuICogYGBganNcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7V2ViQ29tcG9uZW50U0RLfSBmcm9tICdAbXlvcC9zZGsvd2ViY29tcG9uZW50JztcbiAqIGBgYFxuICpcbiAqL1xuaW1wb3J0IHtCYXNlTXlvcFNES30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BXZWJjb21wb25lbnRDb25zdHN9IGZyb20gXCIuL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7QmluZE9uQ2xpY2tIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyXCI7XG5pbXBvcnQge0NoYW5nZVRleHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvY2hhbmdlVGV4dEhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVxdWVzdCxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge3NldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIudHNcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0dldEVsZW1lbnRWYWx1ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NldElubmVySHRtbEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzXCI7XG5cbi8qKlxuICogVGhlIFdlYmNvbXBvbmVudCBTREsgaXMgdGFpbG9yZWQgZm9yIHVzaW5nIE15b3AgY29tcG9uZW50cyBwYWNrYWdlZCBhcyBzZXBhcmF0ZSBidW5kbGVzIGFuZCBleHBvc2VkIGFzIHdlYiBjb21wb25lbnRzLjxici8+XG4gKiBEZXZlbG9wZXJzIGltcG9ydGluZyB0aGlzIFNESyBjYW4gbGV2ZXJhZ2UgQVBJcyBhbmQgdXRpbGl0aWVzIHNwZWNpZmljYWxseSBjcmFmdGVkIHRvIHN1cHBvcnQgdGhlIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGFuZCBjb21tdW5pY2F0aW9uIHBhdHRlcm5zIHJlcXVpcmVkIGZvciB3ZWIgY29tcG9uZW50cyB3aXRoaW4gdGhlIE15b3AgYXJjaGl0ZWN0dXJlLjxici8+XG4gKiBUaGlzIFNESyBwcm9tb3RlcyByZXVzYWJpbGl0eSBhbmQgZW5jYXBzdWxhdGlvbiwgZW5hYmxpbmcgZGV2ZWxvcGVycyB0byBidWlsZCBtb2R1bGFyLCBzZWxmLWNvbnRhaW5lZCBjb21wb25lbnRzIHRoYXQgY2FuIGJlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uJ3MgRE9NIHN0cnVjdHVyZS5cbiAqXG4gKlxuICogT25jZSBsb2FkZWQgdGhlIGBSb290IFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiAqIGBgYGpzXG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkNvbXBvbmVudFNESyBleHRlbmRzIEJhc2VNeW9wU0RLIHtcblxuICAgIGFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3QgPSB0cnVlO1xuXG4gICAgLy93aGVuIG5ldyB3ZWIgY29tcG9uZW50IGNyZWF0ZWQuXG4gICAgY29ubmVjdGVkQ2FsbGJhY2sgPSAoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgc2hhZG93OiBTaGFkb3dSb290KSA9PiB7XG4gICAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKG15b3BXZWJjb21wb25lbnRDb25zdHMud2ViY29tcG9uZW50X21lc3NhZ2Vfa2V5LCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gZS5kYXRhID8gZS5kYXRhIDogZS5kZXRhaWw7XG4gICAgICAgICAgICBpZiAoIWV2ZW50Q29udGVudCB8fCAhZXZlbnRDb250ZW50Lm15b3ApIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlY3ZpZWQgd2ViY29tcG9uZW50X21lc3NhZ2Ugd2l0aCB3cm9uZyB0eXBlJylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50Q29udGVudCBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBzZW5kIGNvbnRhaW5lciAvIGNvbXBvZW5udCBpZGVudGlmaWVyIGZvciBtdWx0aWwgY29tcG9uZW50cyBzdXBwb3J0XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlcyhlKVxuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbXBvbmVudElkID0gKG1lc3NhZ2UgYXMgSW5pdE1lc3NhZ2UpLmNvbnRlbnQuaWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0uY29udGV4dCA9IG5ldyBTaGFkb3dSb290UmVmKGNvbnRhaW5lciwgc2hhZG93KVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuc3VwcG9ydGVkSGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGhhbmRsZXIuY29udGV4dCA9IHRoaXMuc2hhZG93Um9vdHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrLiByYWNlIGNvbmRpdGlvbiB3aXRoIGhvc3QubG9hZCB3aGVuIG1vZHVsZSBsb2FkZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXF1ZXN0KCkpXG4gICAgICAgIH0sIDEpXG4gICAgfVxuXG4gICAgbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi51cFxuICAgICAgICAvL21lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZDtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyICYmIHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQpXG4gICAgICAgICAgICBtZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvLmhhbmRsZXJVbmlxdWVJZFxuXG4gICAgICAgIHdpbmRvdy5teW9wLmhvc3RTREsuc2VuZChtZXNzYWdlKVxuICAgIH1cblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJbXSA9IFtcbiAgICAgICAgbmV3IENoYW5nZVRleHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IFNldElubmVySHRtbEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgQmluZE9uQ2xpY2tIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgc2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBBZGRFdmVudExpc3RlbmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBFeGVjdXRlU2NyaXB0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgLy9cbiAgICAgICAgbmV3IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKVxuICAgIF07XG5cbiAgICBwdWJsaWMgaW5pdCA9ICgpID0+IHtcbiAgICAgICAgLy90aGlzLm15Q29tcG9uZW50SWRcbiAgICAgICAgLy90aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzXG4gICAgfVxufVxuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdXZWJDb21wb25lbnRTREsnLCBXZWJDb21wb25lbnRTREspO1xuIiwgImltcG9ydCB7TXlvcFdlYkNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJSFRNTExvYWRlckNvbmZpZyxcbiAgICBJU2tpbkNvbmZpZywgU2hhZG93Um9vdE1vZGVUeXBlLFxuICAgIFNraW5Mb2FkZXJzLFxuICAgIFJlbmRlck1vZGUsIFJlbmRlclBvbGljeVxufSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1dlYkNvbXBvbmVudFNES30gZnJvbSBcIi4uLy4uL3dlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wSWZyYW1lQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50LnRzXCI7XG5pbXBvcnQge0VNQkVEREVEX1NES19DT05URU5ULCBIQVNfRU1CRURERURfU0RLfSBmcm9tIFwiLi4vZW1iZWRkZWRTREsudHNcIjtcbi8vaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gXCIuLi8uLi9TREsudHNcIjtcblxuY29uc3QgTVlPUF9XRUJfQ09NUE9ORU5UX01BUktFUiA9ICc8IS0tIG15b3Atd2ViLWNvbXBvbmVudCAtLT4nO1xuY29uc3QgTVlPUF9XRUJfQ09NUE9ORU5UX1NDUklQVF9JRCA9ICdteW9wLXdlYi1jb21wb25lbnQnO1xuXG4vLyBUcmFjayBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudCBzY3JpcHRzIHRvIHByZXZlbnQgZG91YmxlIHJlZ2lzdHJhdGlvbi5cbi8vIE1hcHMgc2NyaXB0SWQgLT4gdGhlIHRhZyBuYW1lIHRoYXQgc2NyaXB0IHJlZ2lzdGVyZWQuIFRoZSB0YWcgTVVTVCBiZSByZW1lbWJlcmVkIHBlclxuLy8gc2NyaXB0OiB3aW5kb3cuX19NWU9QX1RBR19OQU1FX18gaXMgYSBzaW5nbGUgZ2xvYmFsIHNsb3QgdGhhdCBldmVyeSBleHRyYWN0ZWQgY29tcG9uZW50XG4vLyBvdmVyd3JpdGVzLCBzbyBvbiBhIHJlLW1vdW50IChzY3JpcHQgc2tpcHBlZCkgaXQgaG9sZHMgd2hpY2hldmVyIGNvbXBvbmVudCByYW4gbGFzdC5cbmNvbnN0IGV4dHJhY3RlZFdlYkNvbXBvbmVudFNjcmlwdHM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG5cbmNvbnN0IHNlZW46IHN0cmluZ1tdID0gW107XG5sZXQgc2RrO1xuY29uc3QgZ2V0SW5pdGlhdGVkU2RrID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghc2RrKSB7XG4gICAgICAgIC8vY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSBhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKVxuICAgICAgICBzZGsgPSBuZXcgV2ViQ29tcG9uZW50U0RLKCk7XG4gICAgICAgIHNkay5pbml0KCk7XG4gICAgfVxuICAgIHJldHVybiBzZGs7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhUTUxFbGVtZW50Q29uc3RydWN0b3IoaHRtbFN0cmluZzogc3RyaW5nLCBTaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGUpOiBuZXcgKCkgPT4gSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEhUTUxFbGVtZW50IHtcblxuICAgICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vZGUgPSBTaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLm9wZW4gPyAnb3BlbicgOiAnY2xvc2VkJztcbiAgICAgICAgICAgIGNvbnN0IHNoYWRvdyA9IHRoaXMuYXR0YWNoU2hhZG93KHttb2RlfSk7XG4gICAgICAgICAgICBnZXRJbml0aWF0ZWRTZGsoKS50aGVuKChzZGspID0+IHtcbiAgICAgICAgICAgICAgICBzZGsuY29ubmVjdGVkQ2FsbGJhY2sodGhpcywgc2hhZG93KTtcbiAgICAgICAgICAgICAgICBzaGFkb3cuaW5uZXJIVE1MID0gaHRtbFN0cmluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmNvbnN0IGNyZWF0ZUN1c3RvbVdlYkNvbXBvbmVudCA9IChjb21wb25lbnROYW1lOiBzdHJpbmcsIGh0bWw6IHN0cmluZywgU2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlKSA9PiB7XG4gICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKGNvbXBvbmVudE5hbWUsIGNyZWF0ZUhUTUxFbGVtZW50Q29uc3RydWN0b3IoaHRtbCwgU2hhZG93Um9vdE1vZGUpKTtcbiAgICBjb25zb2xlLmxvZyhgZGVmaW5lKCcke2NvbXBvbmVudE5hbWV9Jykgd2FzIGNhbGxlZCwgd2ViIGNvbXBvbmVudCByZWFkeSB0byB1c2VgKTtcbn1cblxuY29uc3QgdG9XZWJDb21wb25lbnROYW1lID0gKHN0cikgPT4ge1xuICAgIHJldHVybiBzdHJcbiAgICAgICAgLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMS0kMicpIC8vIEFkZCBoeXBoZW4gYmVmb3JlIHVwcGVyY2FzZSBsZXR0ZXJzXG4gICAgICAgIC5yZXBsYWNlKC8oXFxkKykvZywgJy0kMScpIC8vIEFkZCBoeXBoZW4gYmVmb3JlIGRpZ2l0c1xuICAgICAgICAudG9Mb3dlckNhc2UoKTsgLy8gQ29udmVydCB0byBsb3dlcmNhc2Vcbn1cblxuY29uc3QgdG9DdXN0b21FbGVtZW50TmFtZSA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICBuYW1lID0gdG9XZWJDb21wb25lbnROYW1lKG5hbWUpO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoL18vZywgJy0nKTtcbn1cblxubGV0IHBhcnNlcjogRE9NUGFyc2VyOyAvLyA9IG5ldyBET01QYXJzZXIoKTtcblxuZXhwb3J0IGNsYXNzIEhUTUxDb21wb25lbnRMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG5cbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuSFRNTExvYWRlclxuXG4gICAgLyoqXG4gICAgICogRGV0ZWN0IGlmIEhUTUwgaXMgYSBNeW9wIFdlYiBDb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBUSEUgTUFSS0VSIENPTU1FTlQgQUxPTkUgSVMgTk9UIEEgU0FGRSBTSUdOQUwsIEJFQ0FVU0UgTUlOSUZJRVJTIERFTEVURSBDT01NRU5UUy5cbiAgICAgKlxuICAgICAqIFRoaXMgdXNlZCB0byBiZSBgc3RhcnRzV2l0aChNWU9QX1dFQl9DT01QT05FTlRfTUFSS0VSKWAgYW5kIG5vdGhpbmcgZWxzZS4gVGhlXG4gICAgICogZGVsaXZlcnkgbGFuZSBtaW5pZmllcyB3aXRoIGByZW1vdmVDb21tZW50czogdHJ1ZWAgKG15b3Atc2VydmVyIGRlcml2ZS50cyBNSU5fQ0ZHKSxcbiAgICAgKiBzbyB0aGUgc3RvcmVkIGBtaW5gIGFydGlmYWN0IG9mIGV2ZXJ5IHYyIHdlYiBjb21wb25lbnQgbG9zZXMgaXRzIGxlYWRpbmdcbiAgICAgKiBgPCEtLSBteW9wLXdlYi1jb21wb25lbnQgLS0+YC4gRGV0ZWN0aW9uIHRoZW4gcmV0dXJuZWQgZmFsc2UsIHRoZSBjb21wb25lbnQgZmVsbFxuICAgICAqIGJhY2sgdG8gcGxhaW4gaWZyYW1lIHJlbmRlcmluZywgYW5kIHRoZSB3aG9sZSBhdXRob3JlZCBkb2N1bWVudCB3YXMgc2hvd24gLS1cbiAgICAgKiBpbmNsdWRpbmcgdGhlIHYyIGF1dGhvcmluZyB3cmFwcGVyLCBzbyBQaWMtVGltZSdzIHByb2R1Y3Rpb24gZGFzaGJvYXJkIGRpc3BsYXllZCB0aGVcbiAgICAgKiBwcmV2aWV3IGNocm9tZSAoXCJXZWIgQ29tcG9uZW50IHYyXCIsIGEgdGFnLW5hbWUgYmFkZ2UgcmVhZGluZyBgbG9hZGluZy4uLmAsIFNJWkUgL1xuICAgICAqIE9WRVJGTE9XIC8gQkcgY29udHJvbHMpIGluc3RlYWQgb2YgdGhlaXIgY29tcG9uZW50LiBSZXBvcnRlZCAyMDI2LTEwLTE4OyB0aGUgc2VydmVkXG4gICAgICogSFRNTCBtZWFzdXJlZCAzMjgsMDcxIGJ5dGVzIGFnYWluc3QgOTUxLDEzMCBhdCBvcmlnaW4sIHdpdGggemVybyBgPCEtLWAgbGVmdCBpbiBpdC5cbiAgICAgKlxuICAgICAqIFRoZSBzY3JpcHQgaWQgaXMgdGhlIHNpZ25hbCB0aGF0IHN1cnZpdmVzLCBhbmQgaXQgaXMgdGhlIG9uZSBgZXh0cmFjdFdlYkNvbXBvbmVudFNjcmlwdGBcbiAgICAgKiBhbHJlYWR5IGRlcGVuZHMgb246IGlmIHRoYXQgZWxlbWVudCBpcyBwcmVzZW50LCBleHRyYWN0aW9uIHdvcmtzLCBzbyBkZXRlY3Rpb25cbiAgICAgKiBzaG91bGQgYWdyZWUuIENoZWNrZWQgd2l0aCBhIHJlZ2V4IHJhdGhlciB0aGFuIERPTVBhcnNlciAtLSB0aGlzIHJ1bnMgZm9yIGV2ZXJ5XG4gICAgICogSFRNTCBjb21wb25lbnQsIGFuZCBwYXJzaW5nIGEgMzAwIEtCIGRvY3VtZW50IHRvIGFuc3dlciBhIHllcy9ubyBxdWVzdGlvbiBpcyBub3RcbiAgICAgKiB3b3J0aCBpdC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlzTXlvcFdlYkNvbXBvbmVudChodG1sOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGh0bWwudHJpbVN0YXJ0KCkuc3RhcnRzV2l0aChNWU9QX1dFQl9DT01QT05FTlRfTUFSS0VSKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGA8c2NyaXB0W14+XSpcXFxcc2lkPVtcIiddPyR7TVlPUF9XRUJfQ09NUE9ORU5UX1NDUklQVF9JRH1bXCInXFxcXHM+XWAsICdpJykudGVzdChodG1sKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIGhvdyB0aGlzIGNvbXBvbmVudCBzaG91bGQgcmVuZGVyLCBhcHBseWluZyB0aGUgaG9zdCByZW5kZXIgcG9saWN5LlxuICAgICAqIFByZWNlZGVuY2U6IG9wdGlvbnMucmVuZGVyUG9saWN5IChwZXItY2FsbCkgZnVsbHkgcmVwbGFjZXMgdGhlIGdsb2JhbFxuICAgICAqIGhvc3RTREsuc2V0UmVuZGVyUG9saWN5IFx1MjAxNCBzbyBhbiBhcHAgY2FuIHJlc3RyaWN0IGdsb2JhbGx5IGFuZCBhbGxvdyBzcGVjaWZpY3MuXG4gICAgICogV2l0aCBubyBwb2xpY3kgc2V0LCBiZWhhdmlvciBpcyB1bmNoYW5nZWQgZnJvbSBiZWZvcmUgKG1hcmtlciBcdTIxRDIgd2ViIGNvbXBvbmVudCkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyByZXNvbHZlUmVuZGVyTW9kZShcbiAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIHNraW46IElTa2luQ29uZmlnLFxuICAgICAgICBsb2FkZXJDb25maWc6IElIVE1MTG9hZGVyQ29uZmlnLFxuICAgICAgICBpc1dlYkNvbXBvbmVudDogYm9vbGVhbixcbiAgICAgICAgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTx7IG1vZGU6IFJlbmRlck1vZGUgfCBmYWxzZTsgaXNvbGF0ZTogYm9vbGVhbiB9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZE1vZGU6IFJlbmRlck1vZGUgPSBpc1dlYkNvbXBvbmVudFxuICAgICAgICAgICAgPyAnd2ViQ29tcG9uZW50J1xuICAgICAgICAgICAgOiAoKGxvYWRlckNvbmZpZy5pc29sYXRpb24gfHwgb3B0aW9ucz8uaXNvbGF0aW9uKSA/ICdpc29sYXRlZElmcmFtZScgOiAnaWZyYW1lJyk7XG5cbiAgICAgICAgLy8gcGVyLWNhbGwgcG9saWN5IHdpbnM7IGVsc2UgZ2xvYmFsIHBvbGljeSBvbiB0aGUgaG9zdCBTREsgc2luZ2xldG9uLlxuICAgICAgICBjb25zdCBwb2xpY3k6IFJlbmRlclBvbGljeSB8IHVuZGVmaW5lZCA9XG4gICAgICAgICAgICBvcHRpb25zPy5yZW5kZXJQb2xpY3kgPz8gKHdpbmRvdyBhcyBhbnkpPy5teW9wPy5ob3N0U0RLPy5nZXRSZW5kZXJQb2xpY3k/LigpO1xuXG4gICAgICAgIGNvbnN0IG1vZGU6IFJlbmRlck1vZGUgfCBmYWxzZSA9IHBvbGljeVxuICAgICAgICAgICAgPyBhd2FpdCBwb2xpY3koeyBjb21wb25lbnREZWZpbml0aW9uLCBza2luLCByZXF1ZXN0ZWRNb2RlLCBpc1dlYkNvbXBvbmVudCB9KVxuICAgICAgICAgICAgOiByZXF1ZXN0ZWRNb2RlO1xuXG4gICAgICAgIHJldHVybiB7IG1vZGUsIGlzb2xhdGU6IG1vZGUgPT09ICdpc29sYXRlZElmcmFtZScgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW4tZnJhbWUgYnJpZGdlIGZvciBpc29sYXRlZCBjb21wb25lbnRzLiBSdW5zIGluc2lkZSB0aGUgc2FuZGJveGVkXG4gICAgICogKG9wYXF1ZS1vcmlnaW4pIGlmcmFtZSwgdHJhbnNsYXRpbmcgdGhlIHNhbWUgYXV0aG9yLWZhY2luZyBjb250cmFjdCB0by9mcm9tXG4gICAgICogcG9zdE1lc3NhZ2Ugc2luY2UgdGhlIGhvc3QgaGFzIG5vIHNhbWUtb3JpZ2luIGFjY2VzczpcbiAgICAgKiAgIFx1MjAyMiBkYXRhLWluIDogcGFyZW50IHBvc3RzIHt0eXBlOidteW9wOmluaXQnfSBcdTIxOTIgY2FsbHMgd2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2VcbiAgICAgKiAgICAgICAgICAgICAgIChwbHVzIGEgYmFrZWQgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGZpcnN0IHJlbmRlcilcbiAgICAgKiAgIFx1MjAyMiBkYXRhLW91dDogd2luZG93Lm15b3BfY3RhX2hhbmRsZXIgXHUyMTkyIHBhcmVudC5wb3N0TWVzc2FnZSh7dHlwZTonbXlvcDpjdGEnfSlcbiAgICAgKiAgIFx1MjAyMiByZXNpemUgIDogUmVzaXplT2JzZXJ2ZXIgXHUyMTkyIHBhcmVudC5wb3N0TWVzc2FnZSh7dHlwZTonbXlvcDpzaXplJ30pXG4gICAgICpcbiAgICAgKiBUT0RPKGRldi1leHRlbnNpb24pOiB0aGUgaXNvbGF0ZWQgcGF0aCBkZWxpYmVyYXRlbHkgc2tpcHMgdGhlIHNhbWUtb3JpZ2luXG4gICAgICogZGF0YVNjcmlwdCwgc28gaXQgbmV2ZXIgcG9zdHMgdGhlIGBNWU9QX1BSRUlOSkVDVEVEX0lOSVRgIG1lc3NhZ2UgdGhlIE15b3AgZGV2XG4gICAgICogZXh0ZW5zaW9uIGxpc3RlbnMgZm9yIHRvIGxvZyB0aGUgSU5JVElBTCByZW5kZXIgKGBpbml0KmApLiBMYXRlciBpbml0IHVwZGF0ZXMgYW5kXG4gICAgICogYWxsIENUQXMgYXJlIHN0aWxsIHRyYWNrZWQgKHRoZSBleHRlbnNpb24gd3JhcHMgYGNvbXAucHJvcHNgLCB3aGljaCBvdXIgaXNvbGF0ZWRcbiAgICAgKiBjb25uZWN0UHJvcHMgYnJhbmNoIHJvdXRlcyB0aHJvdWdoKSwgc28gb25seSB0aGUgZmlyc3QtcmVuZGVyIHBheWxvYWQgaXMgbWlzc2luZ1xuICAgICAqIGZyb20gdGhlIGV4dGVuc2lvbidzIGFjdGl2aXR5IGxvZyBmb3IgaXNvbGF0ZWQgY29tcG9uZW50cy4gQ2xvc2luZyB0aGlzIHdvdWxkIGJlIGFcbiAgICAgKiB+MS1saW5lIGBwYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6J01ZT1BfUFJFSU5KRUNURURfSU5JVCcsIHBheWxvYWQ6e2RhdGF9fSlgIGluc2lkZVxuICAgICAqIGZsdXNoSW5pdGlhbCgpIGJlbG93IFx1MjAxNCBpbnRlbnRpb25hbGx5IE5PVCBkb25lIGZvciBub3cgdG8gYXZvaWQgYWRkaW5nIGV4dGVuc2lvbi1vbmx5XG4gICAgICogdHJhZmZpYyB0byB0aGUgY29tcG9uZW50IHJ1bnRpbWUuIFdlYiBjb21wb25lbnRzIGhhdmUgdGhlIHNhbWUgaW5pdGlhbC1pbml0IGdhcFxuICAgICAqIChpbml0V2l0aERhdGEgaXMgY2FsbGVkIG9uIHRoZSBlbGVtZW50LCBub3QgdmlhIGNvbXAucHJvcHMpIGFuZCBpdCBwcmVkYXRlcyB0aGlzLlxuICAgICAqL1xuICAgIHByaXZhdGUgYnVpbGRJc29sYXRpb25CcmlkZ2UoaW5pdGlhbERhdGFMaXRlcmFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYDxzY3JpcHQ+XG4gICAgICAgICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBfX2luaXRpYWwgPSAke2luaXRpYWxEYXRhTGl0ZXJhbH07XG4gICAgICAgICAgICAgICAgdmFyIF9fcGVuZGluZztcbiAgICAgICAgICAgICAgICAvLyBkYXRhLW91dCAoY3RhKVxuICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wX2N0YV9oYW5kbGVyID0gZnVuY3Rpb24gKGFjdGlvbiwgcGF5bG9hZCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkgeyBwYXJlbnQucG9zdE1lc3NhZ2UoeyBfX215b3A6IHRydWUsIHR5cGU6ICdteW9wOmN0YScsIGFjdGlvbjogYWN0aW9uLCBwYXlsb2FkOiBwYXlsb2FkIH0sICcqJyk7IH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjYWxsSW5pdChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHsgd2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2UoZGF0YSk7IHJldHVybiB0cnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZGF0YS1pbiAoaW5pdCB1cGRhdGVzKVxuICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBlLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZCB8fCBkLl9fbXlvcCAhPT0gdHJ1ZSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZC50eXBlID09PSAnbXlvcDppbml0JykgeyBpZiAoIWNhbGxJbml0KGQuZGF0YSkpIF9fcGVuZGluZyA9IGQuZGF0YTsgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIGZpcnN0IHJlbmRlcjogdXNlIGEgcGVuZGluZyB1cGRhdGUgaWYgb25lIGFycml2ZWQsIGVsc2UgdGhlIGJha2VkIGluaXRpYWwgZGF0YVxuICAgICAgICAgICAgICAgIChmdW5jdGlvbiBmbHVzaEluaXRpYWwoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gKF9fcGVuZGluZyAhPT0gdW5kZWZpbmVkKSA/IF9fcGVuZGluZyA6IF9faW5pdGlhbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbEluaXQoZGF0YSkpIHsgX19wZW5kaW5nID0gdW5kZWZpbmVkOyBfX2luaXRpYWwgPSB1bmRlZmluZWQ7IH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZmx1c2hJbml0aWFsKTtcbiAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICAgIC8vIHJlc2l6ZSAocmVwb3J0IGNvbnRlbnQgc2l6ZSlcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjb250ZW50SGVpZ2h0KCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNZWFzdXJlIHRoZSBCT0RZIChjb250ZW50IGJveCkuIGRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQgaW5jbHVkZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGlmcmFtZSB2aWV3cG9ydCBcdTIwMTQgd2hpY2ggd2UncmUgZHJpdmluZyBcdTIwMTQgc28gaXQgd291bGQgcmVwb3J0IHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGZyYW1lIGhlaWdodCwgbm90IHRoZSBjb250ZW50LCBhbmQgbmV2ZXIgc2hyaW5rLlxuICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGRvY3VtZW50LmJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiKSByZXR1cm4gTWF0aC5tYXgoYi5zY3JvbGxIZWlnaHQsIGIub2Zmc2V0SGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHBvc3RTaXplKCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX215b3A6IHRydWUsIHR5cGU6ICdteW9wOnNpemUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogY29udGVudEhlaWdodCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sICcqJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE9ic2VydmUgdGhlIEJPRFkgKHJlZmxvd3Mgd2l0aCBjb250ZW50KSBcdTIwMTQgbm90IGRvY3VtZW50RWxlbWVudCwgd2hvc2UgYm94IGlzXG4gICAgICAgICAgICAgICAgLy8gdGhlIGlmcmFtZSB2aWV3cG9ydCBhbmQgd291bGQgZmVlZCBiYWNrIGludG8gYSByZXNpemUgbG9vcC4gQSBNdXRhdGlvbk9ic2VydmVyXG4gICAgICAgICAgICAgICAgLy8gY2F0Y2hlcyBjb250ZW50IHN3YXBzIChlLmcuIGlubmVySFRNTCByZS1yZW5kZXIpIHRoYXQgZG9uJ3QgY2hhbmdlIGJvZHkncyBib3guXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5SZXNpemVPYnNlcnZlcikge1xuICAgICAgICAgICAgICAgICAgICB0cnkgeyB2YXIgX19ybyA9IG5ldyBSZXNpemVPYnNlcnZlcihwb3N0U2l6ZSk7IGlmIChkb2N1bWVudC5ib2R5KSBfX3JvLm9ic2VydmUoZG9jdW1lbnQuYm9keSk7IH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuTXV0YXRpb25PYnNlcnZlciAmJiBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7IG5ldyBNdXRhdGlvbk9ic2VydmVyKHBvc3RTaXplKS5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlLCBhdHRyaWJ1dGVzOiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pOyB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHBvc3RTaXplKTtcbiAgICAgICAgICAgICAgICBwb3N0U2l6ZSgpO1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgPC9zY3JpcHQ+YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0IHRoZSB3ZWIgY29tcG9uZW50IHNjcmlwdCBjb250ZW50IGZyb20gSFRNTFxuICAgICAqL1xuICAgIHByaXZhdGUgZXh0cmFjdFdlYkNvbXBvbmVudFNjcmlwdChodG1sOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jLmdldEVsZW1lbnRCeUlkKE1ZT1BfV0VCX0NPTVBPTkVOVF9TQ1JJUFRfSUQpO1xuICAgICAgICByZXR1cm4gc2NyaXB0Py50ZXh0Q29udGVudCB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgdGhlIHdlYiBjb21wb25lbnQgc2NyaXB0IG9uIHRoZSBob3N0IGRvY3VtZW50LlxuICAgICAqIFJldHVybnMgdGhlIGN1c3RvbSBlbGVtZW50IHRhZyBuYW1lIHRoaXMgc2NyaXB0IHJlZ2lzdGVyZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBleGVjdXRlV2ViQ29tcG9uZW50U2NyaXB0KHNjcmlwdENvbnRlbnQ6IHN0cmluZywgc2NyaXB0SWQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgZXhlY3V0ZWQgKGJ5IHNjcmlwdCBjb250ZW50IGhhc2gpXG4gICAgICAgIGNvbnN0IGNhY2hlZFRhZ05hbWUgPSBleHRyYWN0ZWRXZWJDb21wb25lbnRTY3JpcHRzLmdldChzY3JpcHRJZCk7XG4gICAgICAgIGlmIChjYWNoZWRUYWdOYW1lKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW015b3BXZWJDb21wb25lbnRdIFNjcmlwdCBhbHJlYWR5IGV4ZWN1dGVkIGZvciAke3NjcmlwdElkfSwgcmV1c2luZyA8JHtjYWNoZWRUYWdOYW1lfT5gKTtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRUYWdOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgIHNjcmlwdC50ZXh0Q29udGVudCA9IHNjcmlwdENvbnRlbnQ7XG4gICAgICAgIHNjcmlwdC5pZCA9IGBteW9wLWV4dHJhY3RlZC0ke3NjcmlwdElkfWA7XG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBnbG9iYWwgaW1tZWRpYXRlbHk6IHRoZSBuZXh0IGV4dHJhY3RlZCBzY3JpcHQgdG8gcnVuIHdpbGwgb3ZlcndyaXRlIGl0LlxuICAgICAgICBjb25zdCB0YWdOYW1lID0gKHdpbmRvdyBhcyBhbnkpLl9fTVlPUF9UQUdfTkFNRV9fO1xuICAgICAgICBpZiAodGFnTmFtZSkge1xuICAgICAgICAgICAgZXh0cmFjdGVkV2ViQ29tcG9uZW50U2NyaXB0cy5zZXQoc2NyaXB0SWQsIHRhZ05hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBbTXlvcFdlYkNvbXBvbmVudF0gRXhlY3V0ZWQgd2ViIGNvbXBvbmVudCBzY3JpcHQ6ICR7c2NyaXB0SWR9IC0+IDwke3RhZ05hbWV9PmApO1xuICAgICAgICByZXR1cm4gdGFnTmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgTXlvcCBXZWIgQ29tcG9uZW50IChleHRyYWN0ZWQgYW5kIHJ1biBvbiBob3N0IGRvY3VtZW50KVxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbG9hZEV4dHJhY3RlZFdlYkNvbXBvbmVudChcbiAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIHNraW46IElTa2luQ29uZmlnLFxuICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICBodG1sOiBzdHJpbmcsXG4gICAgICAgIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zXG4gICAgKTogUHJvbWlzZTxNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50PiB7XG4gICAgICAgIGNvbnN0IHNjcmlwdENvbnRlbnQgPSB0aGlzLmV4dHJhY3RXZWJDb21wb25lbnRTY3JpcHQoaHRtbCk7XG5cbiAgICAgICAgaWYgKCFzY3JpcHRDb250ZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tNeW9wV2ViQ29tcG9uZW50XSBObyA8c2NyaXB0IGlkPVwibXlvcC13ZWItY29tcG9uZW50XCI+IGZvdW5kIGluIEhUTUwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSBjb21wb25lbnQgZGVmaW5pdGlvbiBpZCBhcyBzY3JpcHQgaWRlbnRpZmllciBmb3IgZGVkdXBsaWNhdGlvblxuICAgICAgICBjb25zdCBzY3JpcHRJZCA9IGAke2NvbXBvbmVudERlZmluaXRpb24uaWR9LSR7c2tpbi5pZH1gO1xuXG4gICAgICAgIC8vIEV4ZWN1dGUgdGhlIHNjcmlwdCBvbiB0aGUgaG9zdCBkb2N1bWVudCwgb3IgcmV1c2UgdGhlIHRhZyBpdCByZWdpc3RlcmVkIGVhcmxpZXIuXG4gICAgICAgIC8vIE5ldmVyIHJlLXJlYWQgd2luZG93Ll9fTVlPUF9UQUdfTkFNRV9fIGhlcmU6IG9uIGEgcmUtbW91bnQgdGhlIHNjcmlwdCBpcyBza2lwcGVkIGFuZFxuICAgICAgICAvLyB0aGUgZ2xvYmFsIHN0aWxsIHBvaW50cyBhdCB3aGljaGV2ZXIgY29tcG9uZW50J3Mgc2NyaXB0IHJhbiBsYXN0LCB3aGljaCB3b3VsZCBidWlsZFxuICAgICAgICAvLyB0aGlzIGNvbnRhaW5lcidzIGVsZW1lbnQgZnJvbSBhbm90aGVyIGNvbXBvbmVudCdzIHRhZy5cbiAgICAgICAgY29uc3QgdGFnTmFtZSA9IHRoaXMuZXhlY3V0ZVdlYkNvbXBvbmVudFNjcmlwdChzY3JpcHRDb250ZW50LCBzY3JpcHRJZCk7XG5cbiAgICAgICAgaWYgKCF0YWdOYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tNeW9wV2ViQ29tcG9uZW50XSBTY3JpcHQgZGlkIG5vdCBzZXQgd2luZG93Ll9fTVlPUF9UQUdfTkFNRV9fJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgdGhlIGN1c3RvbSBlbGVtZW50XG4gICAgICAgIGNvbnN0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWA7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFyIGNvbnRhaW5lciBpZiBuZWVkZWRcbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSkge1xuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ09OU1RSVUNUIEJFRk9SRSBBUFBFTkRJTkcuIEFwcGVuZGluZyBpcyB3aGF0IGNvbm5lY3RzIHRoZSBlbGVtZW50IGFuZCBmaXJlcyBpdHNcbiAgICAgICAgLy8gY29ubmVjdGVkQ2FsbGJhY2ssIGFuZCB0aGUgd3JhcHBlcidzIGNvbnN0cnVjdG9yIGlzIHdoZXJlIHRoZSBzaW5nbGUgJ215b3AtY3RhJ1xuICAgICAgICAvLyBsaXN0ZW5lciBpcyBhdHRhY2hlZC4gV2l0aCB0aGUgYXBwZW5kIGZpcnN0LCBhbnkgQ1RBIGEgY29tcG9uZW50IGVtaXRzIGZyb21cbiAgICAgICAgLy8gY29ubmVjdGVkQ2FsbGJhY2sgLS0gYSBzZWFyY2ggYm94IGFubm91bmNpbmcgaXRzIGluaXRpYWwgc3RhdGUsIGEgd2lkZ2V0XG4gICAgICAgIC8vIHJlcG9ydGluZyBhIGRlZmF1bHQgc2VsZWN0aW9uIC0tIHdhcyBkaXNwYXRjaGVkIGJlZm9yZSBhbnl0aGluZyB3YXMgbGlzdGVuaW5nXG4gICAgICAgIC8vIGFuZCBzaWxlbnRseSBsb3N0LiBUaGUgd3JhcHBlciBvbmx5IG5lZWRzIHRoZSBlbGVtZW50IHJlZmVyZW5jZSwgbm90IGEgY29ubmVjdGVkXG4gICAgICAgIC8vIGVsZW1lbnQsIHNvIGNvbnN0cnVjdGluZyBmaXJzdCBjb3N0cyBub3RoaW5nIGFuZCBtYWtlcyB0aGUgYnVmZmVyIGNvdmVyIHRoZVxuICAgICAgICAvLyB3aG9sZSBmaXJzdCByZW5kZXIgcmF0aGVyIHRoYW4gb25seSB0aGUgaW5pdFdpdGhEYXRhIHBhcnQgb2YgaXQuXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50KFxuICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbixcbiAgICAgICAgICAgIHNraW4sXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgdGFnTmFtZSxcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGRhdGEgaWYgcHJvdmlkZWQuIGBudWxsYCBpcyBub3QgZGF0YSAtLSBzZWUgdGhlIGRhdGEgc2NyaXB0XG4gICAgICAgIC8vIGd1YXJkIGluIHRoZSBIVE1MIHBhdGggZm9yIHdoeSBjYWxsaW5nIGFuIGluaXQgaW50ZXJmYWNlIHdpdGggbnVsbCBpcyB3b3JzZVxuICAgICAgICAvLyB0aGFuIG5vdCBjYWxsaW5nIGl0LlxuICAgICAgICBpZiAob3B0aW9ucz8uZGF0YSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnM/LmRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEob3B0aW9ucy5kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBbTXlvcFdlYkNvbXBvbmVudF0gTG9hZGVkIDwke3RhZ05hbWV9PiBpbnRvIGNvbnRhaW5lcmApO1xuXG4gICAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxuXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG5cbiAgICAgICAgY29uc3QgbG9hZGVyQ29uZmlnID0gKHNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnKTtcblxuICAgICAgICBjb25zdCBpc1dDID0gdGhpcy5pc015b3BXZWJDb21wb25lbnQobG9hZGVyQ29uZmlnLkhUTUwpO1xuICAgICAgICBjb25zdCB7IG1vZGUsIGlzb2xhdGUgfSA9IGF3YWl0IHRoaXMucmVzb2x2ZVJlbmRlck1vZGUoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgbG9hZGVyQ29uZmlnLCBpc1dDLCBvcHRpb25zKTtcblxuICAgICAgICBpZiAobW9kZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW015b3BdIFJlbmRlcmluZyBibG9ja2VkIGJ5IHJlbmRlciBwb2xpY3kgZm9yIGNvbXBvbmVudCBcIiR7Y29tcG9uZW50RGVmaW5pdGlvbi5pZH1cImApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzV0MpIHtcbiAgICAgICAgICAgIC8vIFdlYi1jb21wb25lbnQgSFRNTCBvbmx5IHN1cHBvcnRzIHRoZSB3ZWItY29tcG9uZW50IGNvbnRyYWN0OyBhIHBvbGljeSB0aGF0XG4gICAgICAgICAgICAvLyBkZW5pZXMgaXQgaGFzIG5vIGlmcmFtZSBmYWxsYmFjayAoc2VlIHBsYW4gXHUwMEE3My4zKSBcdTIwMTQgYmxvY2sgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgIC8vIHNpbGVudGx5IHJlbmRlciBicm9rZW4uIFVudHJ1c3RlZCBjb250cmlidXRvcnMgbXVzdCBzaGlwIGlmcmFtZSBjb21wb25lbnRzLlxuICAgICAgICAgICAgaWYgKG1vZGUgIT09ICd3ZWJDb21wb25lbnQnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbTXlvcF0gV2ViLWNvbXBvbmVudCByZW5kZXJpbmcgZGVuaWVkIGJ5IHJlbmRlciBwb2xpY3kgZm9yIGNvbXBvbmVudCBcIiR7Y29tcG9uZW50RGVmaW5pdGlvbi5pZH1cImApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZEV4dHJhY3RlZFdlYkNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIGxvYWRlckNvbmZpZy5IVE1MLCBvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkb21JZCA9IGBteW9wLWNvbXAtJHt1dWlkdjQoKX1gXG4gICAgICAgIGxldCBlbGVtZW50O1xuXG4gICAgICAgIGlmIChsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5sb2NhbEZyYW1lKSB7XG4gICAgICAgICAgICBjb25zdCB1bmlxSWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgIGNvbnN0IGRvbUlkID0gYG15b3AtY29tcC0ke3VuaXFJZH1gXG5cbiAgICAgICAgICAgIGxldCBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgICAgIC8vIEZ1bGwgaXNvbGF0aW9uOiBhIHNhbmRib3ggV0lUSE9VVCBhbGxvdy1zYW1lLW9yaWdpbiBnaXZlcyB0aGUgZnJhbWUgYW5cbiAgICAgICAgICAgIC8vIG9wYXF1ZSBvcmlnaW4gXHUyMDE0IG5vIGhvc3QgRE9NL2Nvb2tpZXMvcGFyZW50IGFjY2Vzcy4gTXVzdCBiZSBzZXQgYmVmb3JlXG4gICAgICAgICAgICAvLyB0aGUgZnJhbWUgbmF2aWdhdGVzIChpLmUuIGJlZm9yZSBzcmNkb2MgLyBhcHBlbmQpLlxuICAgICAgICAgICAgaWYgKGlzb2xhdGUpIHtcbiAgICAgICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNldEF0dHJpYnV0ZSgnc2FuZGJveCcsICdhbGxvdy1zY3JpcHRzIGFsbG93LWZvcm1zIGFsbG93LXBvcHVwcycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTZXQgYWxsIHN0eWxlcyBCRUZPUkUgYXBwZW5kaW5nIHRvIHByZXZlbnQgZmxhc2ggYXQgd3JvbmcgcG9zaXRpb25cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgaW5zZXQ6IDA7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogJHtvcHRpb25zPy5oaWRkZW4gPyAnMCcgOiAnMSd9O1xuICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICAgICAgICBwb2ludGVyLWV2ZW50czogJHtvcHRpb25zPy5oaWRkZW4gPyAnbm9uZScgOiAnYWxsJ307XG4gICAgICAgICAgICBgO1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vIFdyaXRlIGNvbnRlbnQgaW50byB0aGUgaWZyYW1lLiBBbiBpc29sYXRlZCAoc2FuZGJveGVkLCBvcGFxdWUtb3JpZ2luKSBmcmFtZVxuICAgICAgICAgICAgLy8gY2FuJ3QgYmUgZG9jLndyaXRlKCknbiBmcm9tIHRoZSBob3N0LCBzbyBhY2N1bXVsYXRlIHRoZSBtYXJrdXAgYW5kIHNldCBpdCB2aWFcbiAgICAgICAgICAgIC8vIHNyY2RvYyBvbiBjbG9zZSgpLiBOb24taXNvbGF0ZWQgZnJhbWVzIGtlZXAgdGhlIHNhbWUtb3JpZ2luIGRvYy53cml0ZSBwYXRoLlxuICAgICAgICAgICAgY29uc3QgX19zcmNQYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGRvYzogeyBvcGVuKCk6IHZvaWQ7IHdyaXRlbG4oczogc3RyaW5nKTogdm9pZDsgY2xvc2UoKTogdm9pZCB9ID0gaXNvbGF0ZVxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBvcGVuKCkge30sXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlbG4oczogc3RyaW5nKSB7IF9fc3JjUGFydHMucHVzaChzKTsgfSxcbiAgICAgICAgICAgICAgICAgICAgY2xvc2UoKSB7IElmcmFtZUVsZW1lbnQuc3JjZG9jID0gX19zcmNQYXJ0cy5qb2luKCdcXG4nKTsgfSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZCA9IElmcmFtZUVsZW1lbnQuY29udGVudERvY3VtZW50IHx8IElmcmFtZUVsZW1lbnQuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgICAgICAgICAgICAgZC5vcGVuKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkO1xuICAgICAgICAgICAgICAgIH0pKCk7XG5cblxuICAgICAgICAgICAgLy8gUGFyc2UgbXlvcDpzaXplIG1ldGEgdGFnIGJlZm9yZSBpZnJhbWUgY3JlYXRpb24gKHNhbWUgRE9NUGFyc2VyIHBhc3MgcGF0dGVybiBhcyBteW9wX3ByZXZpZXcgcmVtb3ZhbCkuXG4gICAgICAgICAgICAvLyBUaGlzIGxldHMgdGhlIFJlYWN0IGhvc3QgZGV0ZXJtaW5lIHNpemluZyBtb2RlIChmaWxsIHZzIGNvbnRlbnQpIGZyb20gdGhlIHN0YXJ0LlxuICAgICAgICAgICAgbGV0IHBhcnNlZFNpemVNZXRhOiB7IHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyOyBoZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7IG1pbldpZHRoPzogbnVtYmVyOyBtYXhXaWR0aD86IG51bWJlcjsgbWluSGVpZ2h0PzogbnVtYmVyOyBtYXhIZWlnaHQ/OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9wcmVQYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX3ByZURvYyA9IF9wcmVQYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZU1ldGEgPSBfcHJlRG9jLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cIm15b3A6c2l6ZVwiXScpO1xuICAgICAgICAgICAgICAgIGlmIChzaXplTWV0YSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkgeyBwYXJzZWRTaXplTWV0YSA9IEpTT04ucGFyc2Uoc2l6ZU1ldGEuZ2V0QXR0cmlidXRlKCdjb250ZW50JykgfHwgJ3t9Jyk7IH0gY2F0Y2gge31cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBIVE1MMlJlbmRlciA9IGxvYWRlckNvbmZpZy5IVE1MO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uX2luc3BlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAvL2luamVjdCBpbnNwZWN0aW9uIHNjcmlwdCBmb3IgcHJvcHMgZGV0ZWN0aW9uXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9kb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogcGFydCBvZiBBSSBjb21wb25lbnRzLCB0aGluayBhYm91dCB0aGF0LCBkb2N1bWVudCBpdC5cbiAgICAgICAgICAgICAgICBjb25zdCBteW9wX3ByZXZpZXdfc2NyaXB0ID0gX2RvYy5nZXRFbGVtZW50QnlJZCgnbXlvcF9wcmV2aWV3Jyk7XG4gICAgICAgICAgICAgICAgbXlvcF9wcmV2aWV3X3NjcmlwdD8ucmVtb3ZlQXR0cmlidXRlKCd0eXBlJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBQYXJzZSB0aGUgaW5qZWN0ZWQgSFRNTCBzdHJpbmcgaW50byBhIG5vZGVcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wID0gX2RvYy5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoKTtcbiAgICAgICAgICAgICAgICB0ZW1wLmJvZHkuaW5uZXJIVE1MID0gYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmVLZXlzV2luZG93ID0gbmV3IFNldChPYmplY3Qua2V5cyh3aW5kb3cpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlS2V5c1dpbmRvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0ZW1wLmJvZHkuZmlyc3RDaGlsZDtcblxuICAgICAgICAgICAgICAgIGlmIChub2RlICYmIF9kb2MuaGVhZCkge1xuICAgICAgICAgICAgICAgICAgICBfZG9jLmhlYWQuaW5zZXJ0QmVmb3JlKF9kb2MuaW1wb3J0Tm9kZShub2RlLCB0cnVlKSwgX2RvYy5oZWFkLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFByZXBlbmQgRE9DVFlQRTogZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTCByZXR1cm5zIG9ubHkgPGh0bWw+Li4uPC9odG1sPlxuICAgICAgICAgICAgICAgIC8vIGFuZCBkcm9wcyB0aGUgZG9jdHlwZSwgd2hpY2ggd291bGQgcHV0IHRoZSBpZnJhbWUgaW4gcXVpcmtzIG1vZGUuXG4gICAgICAgICAgICAgICAgLy8gUXVpcmtzIG1vZGUgYnJlYWtzIGF1dG8tc2l6aW5nIGJlY2F1c2UgPGJvZHk+IHN0cmV0Y2hlcyB0byB0aGUgaWZyYW1lXG4gICAgICAgICAgICAgICAgLy8gdmlld3BvcnQgaW5zdGVhZCBvZiBzaHJpbmtpbmcgdG8gY29udGVudCwgc28gUmVzaXplT2JzZXJ2ZXIgb24gYm9keVxuICAgICAgICAgICAgICAgIC8vIG5ldmVyIGZpcmVzIHdoZW4gY29udGVudCByZWZsb3dzIChlLmcuIGFmdGVyIGZvbnQgc3dhcCkuXG4gICAgICAgICAgICAgICAgSFRNTDJSZW5kZXIgPSAnPCFET0NUWVBFIGh0bWw+JyArIF9kb2MuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE86IGltcHJvdmUgYnkgZG8gaXQgb24gdGhlIHNlcnZlIG9uY2VcblxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBteW9wX3ByZXZpZXcgc2NyaXB0IHdoZW4gbm90IGluIGluc3BlY3Rpb24gbW9kZVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BfcHJldmlld19zY3JpcHQgPSBfZG9jLmdldEVsZW1lbnRCeUlkKCdteW9wX3ByZXZpZXcnKTtcblxuICAgICAgICAgICAgICAgIGlmIChteW9wX3ByZXZpZXdfc2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgICAgIG15b3BfcHJldmlld19zY3JpcHQucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlZSBub3RlIGFib3ZlOiBwcmVwZW5kIERPQ1RZUEUgdG8ga2VlcCB0aGUgaWZyYW1lIGluIHN0YW5kYXJkcyBtb2RlLlxuICAgICAgICAgICAgICAgICAgICBIVE1MMlJlbmRlciA9ICc8IURPQ1RZUEUgaHRtbD4nICsgX2RvYy5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSW5qZWN0IGhvc3QtcHJvdmlkZWQgQ1NTIGJlZm9yZSB0aGUgaWZyYW1lIGlzIHdyaXR0ZW4gc28gc3R5bGVzIGFyZVxuICAgICAgICAgICAgLy8gcHJlc2VudCBvbiBmaXJzdCBwYWludCAobm8gRk9VQykuIEFwcGVuZGVkIGxhc3QgaW4gPGhlYWQ+IHNvIGl0IHdpbnNcbiAgICAgICAgICAgIC8vIG92ZXIgdGhlIGNvbXBvbmVudCdzIG93biBzdHlsZXMgdmlhIG5vcm1hbCBjYXNjYWRlIG9yZGVyLlxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmluamVjdENzcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhIVE1MMlJlbmRlciwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlVGFnID0gX2RvYy5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgICAgIHN0eWxlVGFnLnNldEF0dHJpYnV0ZSgnZGF0YS1teW9wLWluamVjdGVkJywgJ3RydWUnKTtcbiAgICAgICAgICAgICAgICAvLyA8c3R5bGU+IGlzIGFuIEhUTUwgcmF3LXRleHQgZWxlbWVudDogdGhlIHNlcmlhbGl6ZXIgYmVsb3cgd3JpdGVzIGl0c1xuICAgICAgICAgICAgICAgIC8vIGNvbnRlbnRzIExJVEVSQUxMWSwgd2l0aG91dCBlc2NhcGluZy4gQ1NTIGNvbnRhaW5pbmcgXCI8L3N0eWxlPlwiIHdvdWxkXG4gICAgICAgICAgICAgICAgLy8gdGhlcmVmb3JlIGNsb3NlIHRoZSB0YWcgYW5kIGluamVjdCBsaXZlIG1hcmt1cCBpbnRvIHRoZSBpZnJhbWUsIHdoaWNoXG4gICAgICAgICAgICAgICAgLy8gZXhlY3V0ZXMgc2FtZS1vcmlnaW4gd2l0aCB0aGlzIHBhZ2UuIE5ldXRyYWxpemUgdGhlIHNlcXVlbmNlIFx1MjAxNCBubyByZWFsXG4gICAgICAgICAgICAgICAgLy8gc3R5bGVzaGVldCBjb250YWlucyBpdC4gKFNhbWUgY2xhc3Mgb2YgYnVnIGFzIHRoZSA8L3NjcmlwdD4gZXNjYXBlIGluXG4gICAgICAgICAgICAgICAgLy8gdGhlIGRhdGEgcGF5bG9hZCBiZWxvdy4pXG4gICAgICAgICAgICAgICAgc3R5bGVUYWcudGV4dENvbnRlbnQgPSBvcHRpb25zLmluamVjdENzcy5yZXBsYWNlKC88XFxzKlxcL1xccypzdHlsZS9naSwgJzxcXFxcL3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgKF9kb2MuaGVhZCB8fCBfZG9jLmRvY3VtZW50RWxlbWVudCkuYXBwZW5kQ2hpbGQoc3R5bGVUYWcpO1xuICAgICAgICAgICAgICAgIC8vIFNlZSBub3RlIGFib3ZlOiBwcmVwZW5kIERPQ1RZUEUgdG8ga2VlcCB0aGUgaWZyYW1lIGluIHN0YW5kYXJkcyBtb2RlLlxuICAgICAgICAgICAgICAgIEhUTUwyUmVuZGVyID0gJzwhRE9DVFlQRSBodG1sPicgKyBfZG9jLmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgZG9jLndyaXRlbG4oSFRNTDJSZW5kZXIpO1xuXG4gICAgICAgICAgICAvLyB3aW5kb3cuX19mZWRlcmF0aW9uX18gPVxuICAgICAgICAgICAgLy8gICAgIHsgLi4ud2luZG93Ll9fZmVkZXJhdGlvbl9fLFxuICAgICAgICAgICAgLy8gICAgICAgICAvL1RPRE8gOiBnZXQgZnJvbSBFTlYgYXQgYnVpbGQgdGltZSxcbiAgICAgICAgICAgIC8vICAgICAgICAgLy8gaW5qZWN0IHZhbHVlIHRvIG1vZHVsZSBhdCBidWlsZCB0aW1lXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vIHRvZGF5IHdlIGRvaW5nIHNvIGp1c3QgZm9yIHRoZSBDSlMgdmVyc2lvblxuICAgICAgICAgICAgLy8gICAgICAgICBfX3B1YmxpY19wYXRoX18gOidodHRwczovL2Nkbi5teW9wLmRldi9zZGsvbmV4dCdcbiAgICAgICAgICAgIC8vICAgICAgICAgLC4uLiR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIHdpbmRvdy5fX2ZlZGVyYXRpb25fXylcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAgICAgfTtcblxuICAgICAgICAgICAgLy8gRm9yIG5wbSBwYWNrYWdlIHVzZXJzIHdpdGggYnVuZGxlcnMgKFZpdGUvV2VicGFjayksIGluamVjdCBTREsgaW5saW5lXG4gICAgICAgICAgICAvLyBGb3IgQ0ROIHVzZXJzIChzY3JpcHQgdGFnKSwgdXNlIENETiBVUkxcbiAgICAgICAgICAgIGNvbnN0IHNka1NjcmlwdCA9IEhBU19FTUJFRERFRF9TREtcbiAgICAgICAgICAgICAgICA/IGA8c2NyaXB0PiR7RU1CRURERURfU0RLX0NPTlRFTlR9PC9zY3JpcHQ+YFxuICAgICAgICAgICAgICAgIDogYDxzY3JpcHQgc3JjPVwiJHt3aW5kb3cubXlvcC5fX1JPT1RfU0RLX1BVQkxJQ19VUkxfX31cIj48L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICAvLyBEaWZmZXJlbnQgaW5pdCBzY3JpcHQgZm9yIGVtYmVkZGVkIHZzIENETiBTREtcbiAgICAgICAgICAgIC8vIC0gRW1iZWRkZWQgKGJ1bmRsZWQgSUlGRSk6IHVzZXMgTXlvcFNESy5nZXRJZnJhbWVNb2R1bGUoKSB3aGljaCByZXR1cm5zIG1vZHVsZSBkaXJlY3RseVxuICAgICAgICAgICAgLy8gLSBDRE4gKGR5bmFtaWMgbG9hZGluZyk6IHVzZXMgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSB3aGljaCB3cmFwcyB3aXRoIC5nZXQoKVxuICAgICAgICAgICAgY29uc3QgaW5pdFNjcmlwdCA9IEhBU19FTUJFRERFRF9TREtcbiAgICAgICAgICAgICAgICA/IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbXlvcF9pbml0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaWZyYW1lTW9kdWxlID0gYXdhaXQgTXlvcFNESy5nZXRJZnJhbWVNb2R1bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElmcmFtZVNESyA9IGlmcmFtZU1vZHVsZS5JZnJhbWVTREs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZGsgPSBuZXcgSWZyYW1lU0RLKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZGsuaW5pdCgpO1xuICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICBfX215b3BfaW5pdCgpLnRoZW4oKTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gXG4gICAgICAgICAgICAgICAgOiBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19mZWRlcmF0aW9uX18uX19wdWJsaWNfcGF0aF9fID0gd2luZG93Ll9fZmVkZXJhdGlvbl9fLl9fcHVibGljX3BhdGhfXztcbiAgICAgICAgICAgICAgICAgICBjb25zdCBfX215b3BfaW5pdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2RrID0gbmV3IElmcmFtZVNESygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2RrLmluaXQoKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgX19teW9wX2luaXQoKS50aGVuKCk7XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgLy8gSXNvbGF0ZWQgZnJhbWVzIHVzZSB0aGUgcG9zdE1lc3NhZ2UgYnJpZGdlIGluc3RlYWQgb2YgdGhlIHNhbWUtb3JpZ2luXG4gICAgICAgICAgICAvLyBJZnJhbWVTREsgKyBkYXRhLWluamVjdGlvbiBzY3JpcHRzICh3aGljaCByZWx5IG9uIGhvc3RcdTIxOTRmcmFtZSBhY2Nlc3MpLlxuICAgICAgICAgICAgaWYgKCFpc29sYXRlKSB7XG4gICAgICAgICAgICAgICAgZG9jLndyaXRlbG4oYCR7c2RrU2NyaXB0fSR7aW5pdFNjcmlwdH1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSW5qZWN0IGRhdGEgc2NyaXB0IGlmIGRhdGEgb3B0aW9uIGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIGBudWxsYCBDT1VOVFMgQVMgTk8gREFUQSwgTk9UIEFTIERBVEEuIFRoZSBjaGVjayB1c2VkIHRvIGJlIGAhPT0gdW5kZWZpbmVkYCxcbiAgICAgICAgICAgIC8vIGFuZCBgbnVsbCAhPT0gdW5kZWZpbmVkYCBpcyB0cnVlIC0tIHNvIGEgaG9zdCB0aGF0IHBhc3NlcyBgZGF0YTogbnVsbGAgKHRoZVxuICAgICAgICAgICAgLy8gbmF0dXJhbCB3YXkgdG8gc2F5IFwibm90aGluZyB0byBzZW5kIHlldFwiKSBnb3QgdGhlIHdob2xlIGRhdGEgc2NyaXB0IGluamVjdGVkXG4gICAgICAgICAgICAvLyBhbmQgdGhlIGNvbXBvbmVudCdzIG93biBgbXlvcF9pbml0X2ludGVyZmFjZWAgaW52b2tlZCB3aXRoIG51bGwuIEEgY29tcG9uZW50XG4gICAgICAgICAgICAvLyB0aGF0IHZhbGlkYXRlcyBpdHMgaW5wdXQgdGhlbiByZWplY3RzIGl0LCB3aGljaCBpcyB3aGVyZSBQaWMtVGltZSdzIGNvbnNvbGVcbiAgICAgICAgICAgIC8vIGVycm9yIGBteW9wX2luaXRfaW50ZXJmYWNlOiBJbnZhbGlkIGNvbmZpZyBwcm92aWRlZC5gIGNhbWUgZnJvbTogbWVhc3VyZWQgb25cbiAgICAgICAgICAgIC8vIHRoZWlyIHBhZ2UgMjAyNi0xMC0xOCwgQUxMIDEzIGNvbXBvbmVudHMgYXJlIG1vdW50ZWQgd2l0aCBgZGF0YTogbnVsbGAsIHNvXG4gICAgICAgICAgICAvLyBldmVyeSBvbmUgb2YgdGhlbSBwYWlkIGZvciBhbiBpbmplY3RlZCBzY3JpcHQgYW5kIGEgbWVhbmluZ2xlc3MgaW5pdCBjYWxsLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIEluaXRpYWxpc2luZyBhIGNvbXBvbmVudCB3aXRoIG51bGwgY2FuIG5ldmVyIHRlbGwgaXQgYW55dGhpbmcgdGhhdCBvbWl0dGluZ1xuICAgICAgICAgICAgLy8gdGhlIGNhbGwgZG9lcyBub3QsIHNvIHRoZSB0d28gYXJlIG5vdyB0cmVhdGVkIHRoZSBzYW1lLlxuICAgICAgICAgICAgaWYgKCFpc29sYXRlICYmIG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zPy5kYXRhICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gU2V0dXAgQ1RBIHF1ZXVlIC0gY2FwdHVyZXMgYW55IENUQXMgZW1pdHRlZCBkdXJpbmcgaW5pdCBiZWZvcmUgaG9zdCByZWdpc3RlcnMgaGFuZGxlclxuICAgICAgICAgICAgICAgIGNvbnN0IGN0YVF1ZXVlU2NyaXB0ID0gYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX215b3BfY3RhX3F1ZXVlID0gW107XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wX2N0YV9oYW5kbGVyID0gZnVuY3Rpb24oYWN0aW9uLCBwYXlsb2FkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2N0YV9xdWV1ZS5wdXNoKHthY3Rpb246IGFjdGlvbiwgcGF5bG9hZDogcGF5bG9hZH0pO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgICAgICAvLyBFc2NhcGUgZGF0YSBmb3Igc2FmZSBlbWJlZGRpbmcgaW4gc2NyaXB0IHRhZ1xuICAgICAgICAgICAgICAgIC8vIEpTT04uc3RyaW5naWZ5IGRvZXNuJ3QgZXNjYXBlIDwvc2NyaXB0PiB3aGljaCBjb3VsZCBicmVhayBIVE1MIHBhcnNpbmdcbiAgICAgICAgICAgICAgICBjb25zdCBlc2NhcGVkRGF0YSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLzxcXC9zY3JpcHQvZ2ksICdcXFxcdTAwM2Mvc2NyaXB0Jyk7XG5cbiAgICAgICAgICAgICAgICAvLyBTZWxmLWNvbnRhaW5lZCBkYXRhIGluamVjdGlvbiBzY3JpcHQgdGhhdDpcbiAgICAgICAgICAgICAgICAvLyAxLiBDYWxscyBteW9wX2luaXRfaW50ZXJmYWNlIGltbWVkaWF0ZWx5IGlmIGFscmVhZHkgZGVmaW5lZFxuICAgICAgICAgICAgICAgIC8vIDIuIFdhdGNoZXMgZm9yIGxhdGUtZGVmaW5lZCBteW9wX2luaXRfaW50ZXJmYWNlIHZpYSBkZWZpbmVQcm9wZXJ0eVxuICAgICAgICAgICAgICAgIC8vIDMuIENsZWFucyB1cCBhZnRlciBpdHNlbGYgKHJlbW92ZXMgc2NyaXB0IHRhZyBhbmQgd2luZG93IGRhdGEpXG4gICAgICAgICAgICAgICAgLy8gNC4gUG9zdHMgbWVzc2FnZSB0byBwYXJlbnQgZm9yIGV4dGVuc2lvbiB0cmFja2luZyAocHJlLWluamVjdGVkIGluaXQqKVxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFTY3JpcHQgPSBgPHNjcmlwdCBpZD1cIl9fbXlvcF9pbml0X2RhdGFfc2NyaXB0XCI+XG4gICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gJHtlc2NhcGVkRGF0YX07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NyaXB0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnX19teW9wX2luaXRfZGF0YV9zY3JpcHQnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxJbml0SW50ZXJmYWNlID0gZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFyayBhcyBwcmUtaW5qZWN0ZWQgZGF0YSBjYWxsIGZvciBleHRlbnNpb24gdHJhY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2luaXRfcHJlaW5qZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX215b3BfaW5pdF9wcmVpbmplY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHVyYXRpb24gPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGlmeSBleHRlbnNpb24gdmlhIHBvc3RNZXNzYWdlIChpbml0KiA9IHByZS1pbmplY3RlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdNWU9QX1BSRUlOSkVDVEVEX0lOSVQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAnKicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhbnVwOiByZW1vdmUgc2NyaXB0IHRhZyBhbmQgc3RvcmVkIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NyaXB0RWwgJiYgc2NyaXB0RWwucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdEVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHdpbmRvdy5fX215b3BfaW5pdF9kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cubXlvcF9pbml0X2ludGVyZmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZ1bmN0aW9uIGFscmVhZHkgZXhpc3RzIC0gY2FsbCBpbW1lZGlhdGVseVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxJbml0SW50ZXJmYWNlKHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRnVuY3Rpb24gbm90IHlldCBkZWZpbmVkIC0gc3RvcmUgZGF0YSBhbmQgd2F0Y2ggZm9yIGRlZmluaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2luaXRfZGF0YSA9IGRhdGE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29yaWdpbmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdteW9wX2luaXRfaW50ZXJmYWNlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vcmlnaW5hbCA9IGZuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5fX215b3BfaW5pdF9kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RvcmVkRGF0YSA9IHdpbmRvdy5fX215b3BfaW5pdF9kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3aW5kb3cuX19teW9wX2luaXRfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsSW5pdEludGVyZmFjZShmbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX29yaWdpbmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YDtcbiAgICAgICAgICAgICAgICBkb2Mud3JpdGVsbihjdGFRdWV1ZVNjcmlwdCArIGRhdGFTY3JpcHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJc29sYXRlZCBmcmFtZXM6IGluamVjdCB0aGUgcG9zdE1lc3NhZ2UgYnJpZGdlIChpbml0IGluIC8gY3RhIG91dCAvIHNpemUgb3V0KS5cbiAgICAgICAgICAgIGlmIChpc29sYXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gU2FtZSBydWxlIGFzIHRoZSBub24taXNvbGF0ZWQgcGF0aCBhYm92ZTogbnVsbCBpcyBubyBkYXRhLlxuICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FwZWREYXRhID0gb3B0aW9ucz8uZGF0YSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnM/LmRhdGEgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShvcHRpb25zLmRhdGEpLnJlcGxhY2UoLzxcXC9zY3JpcHQvZ2ksICdcXFxcdTAwM2Mvc2NyaXB0JylcbiAgICAgICAgICAgICAgICAgICAgOiAndW5kZWZpbmVkJztcbiAgICAgICAgICAgICAgICBkb2Mud3JpdGVsbih0aGlzLmJ1aWxkSXNvbGF0aW9uQnJpZGdlKGVzY2FwZWREYXRhKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvYy5jbG9zZSgpO1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogY29udHJvbCBmcm9tIGRhc2hib2FyZFxuICAgICAgICAgICAgLy8gIChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKS5hdXRvSGVpZ2h0ID0gdHJ1ZTtcblxuICAgICAgICAgICAgY29uc3QgY29tcCA9IG5ldyBNeW9wSWZyYW1lQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgIC8vIElzb2xhdGVkOiB3aXJlIHRoZSBob3N0IHNpZGUgb2YgdGhlIHBvc3RNZXNzYWdlIGJyaWRnZSAoY3RhIGluLCBzaXplIGluLCBpbml0IG91dCkuXG4gICAgICAgICAgICBpZiAoaXNvbGF0ZSkgY29tcC5lbmFibGVJc29sYXRpb24oKTtcblxuICAgICAgICAgICAgLy8gU3RvcmUgcGFyc2VkIHNpemVNZXRhIG9uIHRoZSBjb21wb25lbnQgc28gdGhlIFJlYWN0IGhvc3QgY2FuIHJlYWQgaXRcbiAgICAgICAgICAgIGNvbXAuc2l6ZU1ldGEgPSBwYXJzZWRTaXplTWV0YTtcblxuICAgICAgICAgICAgLy8gQXV0by1zaXplOiBvYnNlcnZlIGNvbnRlbnQgc2l6ZSBhbmQgc3luYyB0byBpZnJhbWUgZGltZW5zaW9ucy5cbiAgICAgICAgICAgIC8vIFRoaXMgd29ya3MgZm9yIGFsbCBob3N0cyAodmFuaWxsYSBTREssIFJlYWN0LCBWdWUsIEFuZ3VsYXIpLlxuICAgICAgICAgICAgLy8gSWYgYSBmcmFtZXdvcmsgaG9zdCAoZS5nLiBAbXlvcC9yZWFjdCkgYWxzbyBjYWxscyBvYnNlcnZlQXV0b1NpemUoKSxcbiAgICAgICAgICAgIC8vIGl0IGNsZWFubHkgcmVwbGFjZXMgdGhlc2Ugb2JzZXJ2ZXJzIHZpYSBfYXV0b1NpemVDbGVhbnVwIHRyYWNraW5nLlxuICAgICAgICAgICAgY29tcC5pbml0aWF0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8uYXV0b1NpemUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vIGF1dG8tc2l6aW5nLiBJZnJhbWUgc3RheXMgcG9zaXRpb246YWJzb2x1dGUgZmlsbGluZyBjb250YWluZXIuXG4gICAgICAgICAgICAgICAgICAgIC8vIEhvc3QgaXMgZnVsbHkgcmVzcG9uc2libGUgZm9yIGNvbnRhaW5lciBkaW1lbnNpb25zIChlLmcuIFJlYWN0IE5hdGl2ZSBXZWJWaWV3KS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgc2hvd24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb21wLm9ic2VydmVBdXRvU2l6ZSh7XG4gICAgICAgICAgICAgICAgICAgIGZvcmNlQXV0b1NpemU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG9uU2l6ZUNoYW5nZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyBhZnRlciBmaXJzdCBtZWFzdXJlbWVudCBjb21wbGV0ZXMgKG5vdCBiZWZvcmUpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGlmcmFtZSB0cmFuc2l0aW9ucyBmcm9tIGFic29sdXRlIG92ZXJsYXkgdG8gZG9jdW1lbnQgZmxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhlIG1lYXN1cmVkIGhlaWdodCwgcHJldmVudGluZyBmbGFzaCBhdCB3cm9uZyBzaXplLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93biAmJiAhb3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAuc2hvdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vIGNvbXAucHJvcHMuX2dsb2JhbCA9IGNvbXAuZWxlbWVudC5jb250ZW50V2luZG93O1xuICAgICAgICAgICAgcmV0dXJuIGNvbXA7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5ub25lKSB7XG4gICAgICAgICAgICAvLyBwYXJzZXIgPSBwYXJzZXIgPyBwYXJzZXIgOiBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAvLyBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAvLyBlbGVtZW50ID0gZG9jLmJvZHkuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIC8vZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgZG9tSWQpO1xuXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDsvLy50cmltKCk7XG4gICAgICAgICAgICBlbGVtZW50ID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcblxuICAgICAgICAgICAgLy8gICBjb25zdCBmaXJzdEVsZW1lbnQgPSB0ZW1wbGF0ZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgLy8gICBjb25zdCB6ID0gZmlyc3RFbGVtZW50ID8gZmlyc3RFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA6IG51bGw7XG4gICAgICAgICAgICAvLyAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gICBjb25zb2xlLmxvZyh0ZW1wbGF0ZSwgZmlyc3RFbGVtZW50LCB6KVxuICAgICAgICAgICAgLy8gICBlbGVtZW50ID0gZmlyc3RFbGVtZW50XG5cbiAgICAgICAgICAgIC8vIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Rib2R5Jyk7XG4gICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIGNvbnRhaW5lci5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDtcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgPSBjb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayhlbGVtZW50LCBlbGVtZW50KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21FbGVtZW50TmFtZSA9IHRvQ3VzdG9tRWxlbWVudE5hbWUoY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lICsgc2tpbi5pZCk7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgcmVkZWZpbmUgIVxuICAgICAgICAgICAgaWYgKCFzZWVuLmluY2x1ZGVzKGN1c3RvbUVsZW1lbnROYW1lKSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZUN1c3RvbVdlYkNvbXBvbmVudChjdXN0b21FbGVtZW50TmFtZSwgbG9hZGVyQ29uZmlnLkhUTUwsIGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSk7XG4gICAgICAgICAgICAgICAgc2Vlbi5wdXNoKGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIC8vZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29udGFpbmVyLmlkLnN0YXJ0c1dpdGgoJ215b3AtY29tcC0nKSkge1xuICAgICAgICAvLyAgICAgLy8gaW4gcGxhY2UgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChlbGVtZW50KTtcbiAgICAgICAgLy8gICAgIC8vY29udGFpbmVyID0gZWxlbWVudC5wYXJlbnRFbGVtZW50ITtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2N1c3RvbUVsZW1lbnROYW1lfSAvPmA7XG4gICAgICAgIHJldHVybiBuZXcgTXlvcFdlYkNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge2RlY29tcHJlc3NVVUlEc30gZnJvbSBcIi4uL3V0aWxzL3V1aWQudHNcIjtcbmltcG9ydCB7Q2xvdWRSZXBvc2l0b3J5fSBmcm9tIFwiLi4vaGVscGVyc1wiO1xuaW1wb3J0IHtcbiAgICBFeHBlcmllbmNlVHlwZXMsXG4gICAgSUNvbXBvbmVudENvbmZpZywgSURlZGljYXRlZFNraW5Db25maWcsXG4gICAgSVNlZ21lbnRlZFNraW5Db25maWcsXG4gICAgSVNlZ21lbnRFeHBlcmllbmNlLCBJU2tpbkluc3RhbmNlQ29uZmlnLFxuICAgIFNraW5TZWxlY3RvclR5cGVzXG59IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IGNvbnN0IGNoZWNrTXlvcE92ZXJyaWRlID0gYXN5bmMgKGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyk6IFByb21pc2U8SUNvbXBvbmVudENvbmZpZyB8IG51bGw+ID0+IHtcbiAgICB0cnkge1xuICAgICAgICAvL1RPRE86IHN1cHBvcnQgZGlzYWJsaW5nIHRoZSBtZWNoYW5pc21cbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModXJsLnNlYXJjaCk7XG4gICAgICAgIGNvbnN0IG15b3BPdmVycmlkZSA9IHBhcmFtcy5nZXQoJ215b3BPdmVycmlkZScpO1xuICAgICAgICBpZiAobXlvcE92ZXJyaWRlKSB7XG4gICAgICAgICAgICBjb25zdCBbc291cmNlLCAuLi51dWlkc10gPSBkZWNvbXByZXNzVVVJRHMobXlvcE92ZXJyaWRlKTtcblxuICAgICAgICAgICAgc3dpdGNoIChzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjb21wb25lbnQnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtjb21wb25lbnRJZCwgc2tpbklkXSA9IHV1aWRzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRUb092ZXJyaWRlID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hDb21wb25lbnQoY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9kbzogY2hlY2sgZmV0Y2hBdXRvRmxvdy4gTG9va3MgbGlrZSBvbmx5IG9uZSBza2luIGlzIHJldHVybmVkXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBza2luID0gY29tcG9uZW50VG9PdmVycmlkZS50eXBlLnNraW5zLmZpbmQoc2tpbiA9PiBza2luLmlkID09PSBza2luSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNraW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RvOiBmb3Igbm93IGp1c3Qgc2V0IHNraW4gaWQuIENoZWNrIHRoZSBjbG91ZCBpbXBsZW1lbnRhdGlvblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHNraW5JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIElTa2luSW5zdGFuY2VDb25maWdcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50VG9PdmVycmlkZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vICAgIGNhc2UgJ2Zsb3cnOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdCA6IHtcbiAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBbZmxvd0lkLCBleHBlcmltZW50SWRdID0gdXVpZHM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtmbG93SWQsIGV4cGVyaW1lbnRJZF0gPSBkZWNvbXByZXNzVVVJRHMobXlvcE92ZXJyaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRUb092ZXJyaWRlID0gZmxvdy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IGNvbXBvbmVudENvbmZpZy50eXBlLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3Rvci50eXBlID09PSBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnJlc29sdmVkRXhwZXJpZW5jZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRFeHBlcmllbmNlID0gY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzLmZpbmQoZSA9PiBlLmlkID09PSBleHBlcmltZW50SWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZEV4cGVyaWVuY2U/LnR5cGUgPT09IEV4cGVyaWVuY2VUeXBlcy5TZWdtZW50KSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUmVzb2x2ZWRFeHBlcmllbmNlID0gcmVzb2x2ZWRFeHBlcmllbmNlIGFzIElTZWdtZW50RXhwZXJpZW5jZVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFNraW5TZWxlY3RvciA9IGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yIGFzIElTZWdtZW50ZWRTa2luQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gdHlwZWRTa2luU2VsZWN0b3Iuc2VnbWVudHMuZmluZChzID0+IHMuc2VnbWVudElkID09PSB0eXBlZFJlc29sdmVkRXhwZXJpZW5jZS5zZWdtZW50LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSBzZWdtZW50Py5za2luU2VsZWN0b3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFRvT3ZlcnJpZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsICIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogVGhlIEhvc3QgU0RLIGlzIGRlc2lnbmVkIGZvciBpbnRlZ3JhdGlvbiB3aXRoaW4gdGhlIGhvc3QgYXBwbGljYXRpb24gdGhhdCBzZXJ2ZXMgYXMgdGhlIGNvbnRhaW5lciBmb3IgTXlvcCAgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBJdCBwcm92aWRlcyBlc3NlbnRpYWwgZnVuY3Rpb25hbGl0aWVzIGFuZCBBUElzIGZvciByZWdpc3RlcmluZywgbWFuYWdpbmcsIGFuZCBjb21tdW5pY2F0aW5nIHdpdGggTXlvcCBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGVuYWJsZXMgc2VhbWxlc3MgZW1iZWRkaW5nIG9mIGluZGVwZW5kZW50bHkgZGV2ZWxvcGVkIGNvbXBvbmVudHMgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbiwgZW5zdXJpbmcgc21vb3RoIGludGVyb3BlcmFiaWxpdHkgYW5kIGNvbnNpc3RlbnQgdXNlciBleHBlcmllbmNlIGFjcm9zcyB2YXJpb3VzIE15b3AgY29tcG9uZW50IGltcGxlbWVudGF0aW9ucy5cbiAqL1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge0lNeW9wTG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEVudmVsb3BlZE1lc3NhZ2UsIEV4ZWN1dGVDb21wb25lbnRNZXRob2QsXG4gICAgSW5pdE1lc3NhZ2UsXG4gICAgSW5pdFJlc3BvbnNlLCBNZXNzYWdlRGlyZWN0aW9uLCBSZWZcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BJZnJhbWVMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvaWZyYW1lTG9hZGVyXCI7XG5pbXBvcnQge1dlYmNvbXBvbmVudExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy93ZWJjb21wb25lbnRMb2FkZXJcIjtcbmltcG9ydCB7UmVuZGVyUG9saWN5fSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7SWZyYW1lU0RLfSBmcm9tIFwiLi4vSWZyYW1lXCI7XG5pbXBvcnQge2Nvbm5lY3RQcm9wcywgY29ubmVjdFJlZnMsIGNyZWF0ZVJlZkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtcbiAgICBFeHBlcmllbmNlVHlwZXMsXG4gICAgSUNvbXBvbmVudENvbmZpZyxcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZywgSUV4cGVyaWVuY2UsIElGdW5jdGlvblJlc3VsdHNTZWdtZW50LCBJU2VnbWVudGVkU2tpbkNvbmZpZywgSVNlZ21lbnRFeHBlcmllbmNlLFxuICAgIElTa2luQ29uZmlnLCBJU2tpblNlbGVjdG9yQ29uZmlnLCBTa2luU2VsZWN0b3JUeXBlcyxcblxuXG59IGZyb20gXCIuLi9jb21tb25cIjtcbi8vIEB0cy1pZ25vcmUgaGFuZGxlZCBieSBjdXN0b20gZXNidWlsZCBwbHVnaW5cbmltcG9ydCB2ZXJzaW9uIGZyb20gXCJteW9wLXNkay12ZXJzaW9uXCI7XG5pbXBvcnQge2RlbGl2ZXJ5LCBkZWxpdmVyeU9mZiwgZGVsaXZlcnlSZWZyZXNoLCBkZWxpdmVyeVN0YXRzLCBoeWRyYXRlVjFDb21wb25lbnRzfSBmcm9tIFwiLi4vaGVscGVycy9jbG91ZFJlcG9zaXRvcnlIZWxwZXJzXCI7XG5pbXBvcnQge0hUTUxDb21wb25lbnRMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlclwiO1xuaW1wb3J0IHtjaGVja015b3BPdmVycmlkZX0gZnJvbSBcIi4vbXlvcE92ZXJyaWRlLnRzXCI7XG5cbmludGVyZmFjZSBjb21wb25lbnRMb2FkZXJDcmVhdG9yIHtcbiAgICBuZXcobG9hZGVyczogSU15b3BMb2FkZXJbXSk6IGFueTtcbn1cblxuLy8gY29uc3QgZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGFzeW5jIChpZDogc3RyaW5nKSA9PiB7XG4vLyAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYGh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9jb21wb25lbnQ/aWQ9JHtpZH1gKTtcbi8vICAgICBjb25zdCBjb21wb25lbnREZWY6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gKGF3YWl0IHJlcy5qc29uKCkpLml0ZW07XG4vLyAgICAgcmV0dXJuIGNvbXBvbmVudERlZlxuLy8gfVxuXG4vL2NvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vZGZkbGsycDFtMTg3di5jbG91ZGZyb250Lm5ldC9teW9wX3Nkay5taW4uanMnXG5jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2Nkbi5teW9wLmRldi9zZGsvbmV4dC9teW9wX3Nkay5taW4uanMnXG5cbi8qKlxuICogVGhlIEhvc3QgU0RLIGlzIGRlc2lnbmVkIGZvciBpbnRlZ3JhdGlvbiB3aXRoaW4gdGhlIGhvc3QgYXBwbGljYXRpb24gdGhhdCBzZXJ2ZXMgYXMgdGhlIGNvbnRhaW5lciBmb3IgTXlvcCAgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBJdCBwcm92aWRlcyBlc3NlbnRpYWwgZnVuY3Rpb25hbGl0aWVzIGFuZCBBUElzIGZvciByZWdpc3RlcmluZywgbWFuYWdpbmcsIGFuZCBjb21tdW5pY2F0aW5nIHdpdGggTXlvcCBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGVuYWJsZXMgc2VhbWxlc3MgZW1iZWRkaW5nIG9mIGluZGVwZW5kZW50bHkgZGV2ZWxvcGVkIGNvbXBvbmVudHMgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbiwgZW5zdXJpbmcgc21vb3RoIGludGVyb3BlcmFiaWxpdHkgYW5kIGNvbnNpc3RlbnQgdXNlciBleHBlcmllbmNlIGFjcm9zcyB2YXJpb3VzIE15b3AgY29tcG9uZW50IGltcGxlbWVudGF0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvc3RTREsge1xuICAgIHN0YXRpYyBJbnN0YW5jZSA9ICgpID0+IHdpbmRvdy5teW9wLmhvc3RTREs7XG5cbiAgICBjb21wb25lbnRzMmluaXQ6IElNeW9wQ29tcG9uZW50W10gPSBbXTtcbiAgICBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdID0gW107XG4gICAgY29tcG9uZW50c0xvYWRlcnM6IElNeW9wTG9hZGVyW10gPSBbXTtcblxuICAgIC8vIEdsb2JhbCByZW5kZXIgcG9saWN5IChhbGxvdy9kZW55L21vZGUgZ2F0ZSkuIEEgcGVyLWNhbGwgb3B0aW9ucy5yZW5kZXJQb2xpY3lcbiAgICAvLyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhpcyBcdTIwMTQgc2VlIEhUTUxDb21wb25lbnRMb2FkZXIucmVzb2x2ZVJlbmRlck1vZGUuXG4gICAgcHJpdmF0ZSBfcmVuZGVyUG9saWN5PzogUmVuZGVyUG9saWN5O1xuICAgIHB1YmxpYyBzZXRSZW5kZXJQb2xpY3kgPSAocG9saWN5PzogUmVuZGVyUG9saWN5KSA9PiB7IHRoaXMuX3JlbmRlclBvbGljeSA9IHBvbGljeTsgfTtcbiAgICBwdWJsaWMgZ2V0UmVuZGVyUG9saWN5ID0gKCk6IFJlbmRlclBvbGljeSB8IHVuZGVmaW5lZCA9PiB0aGlzLl9yZW5kZXJQb2xpY3k7XG5cbiAgICBwdWJsaWMgaW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgdmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICB0eXBlMkluc3RhbmNlQ291bnQ6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBwdWJsaWMgYXNzaWduSWQgPSAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXSkge1xuICAgICAgICAgICAgdGhpcy50eXBlMkluc3RhbmNlQ291bnRbY29tcG9uZW50RGVmaW5pdGlvbi5pZF0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtjb21wb25lbnREZWZpbml0aW9uLmlkfV8keysrdGhpcy50eXBlMkluc3RhbmNlQ291bnRbY29tcG9uZW50RGVmaW5pdGlvbi5pZF19YDtcbiAgICB9XG5cbiAgICAvL1RPRE8gOiBmaXggdGhlIGluc3BlY3QgaW1wbGVtZW50YXRpb24gaW5zaWRlIHJlZkNvbXBvbmVudFxuICAgIC8vdGhlbiBpbnNwZWN0ZWQgbWF5YmUgY2FuIGJlIGRyb3BwZWRcbiAgICBwcml2YXRlIGluc3BlY3RlZCA9IGZhbHNlO1xuICAgIHB1YmxpYyBpbnNwZWN0ID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbnNwZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5pbnNwZWN0ZWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50Lmluc3BlY3QpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5zcGVjdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gQSBjb21wb25lbnQncyBvcmlnaW4gaXMgd2hhdGV2ZXIgaXRzIGlmcmFtZSBVUkwgaXMsIHNvIGFuIG9yaWdpbiBhbGxvd2xpc3QgY2FuJ3Qgd29yayBoZXJlLlxuICAgIC8vIEluc3RlYWQgb25seSBmcmFtZXMgdGhpcyBTREsgY3JlYXRlZCAob3IgYWRvcHRlZCkgbWF5IHRhbGsgdG8gaXQuIGBzZW5kKClgIGRpc3BhdGNoZXNcbiAgICAvLyBzeW50aGV0aWMgZXZlbnRzLCB3aGljaCBoYXZlIG5vIHNvdXJjZS5cbiAgICBwcml2YXRlIGlzVHJ1c3RlZFNvdXJjZSA9IChzb3VyY2U6IE1lc3NhZ2VFdmVudFNvdXJjZSB8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKCFzb3VyY2UgfHwgc291cmNlID09PSB3aW5kb3cpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBpc093bkZyYW1lID0gKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb21wb25lbnQuZWxlbWVudCBhcyBIVE1MSUZyYW1lRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50Py5ub2RlTmFtZSA9PT0gJ0lGUkFNRScgJiYgZWxlbWVudC5jb250ZW50V2luZG93ID09PSBzb3VyY2U7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudHMuc29tZShpc093bkZyYW1lKSB8fCB0aGlzLmNvbXBvbmVudHMyaW5pdC5zb21lKGlzT3duRnJhbWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5jb21pbmdNZXNzYWdlSGFuZGxlciA9IChldmVudDogTWVzc2FnZUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4pID0+IHtcbiAgICAgICAgaWYgKCFldmVudC5kYXRhPy5teW9wKSByZXR1cm47XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVHJ1c3RlZFNvdXJjZShldmVudC5zb3VyY2UpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuZGF0YS5teW9wKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5kaXJlY3Rpb24gIT09IE1lc3NhZ2VEaXJlY3Rpb24udXAgJiYgZXZlbnQuZGF0YS5tZXNzYWdlVHlwZSAhPT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdtZXNzYWdlIGRyb3BwZWQgaW4gaG9zdHNkaywgZGlyZWN0aW9uIHdhcyAnLCBldmVudC5kYXRhLmRpcmVjdGlvbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImV2ZW50IG9uIGhvc3Qgc2lkZSBcIiwgZXZlbnQpO1xuXG4gICAgICAgICAgICBjb25zdCBteW9wTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlID0gZXZlbnQuZGF0YTtcblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdFJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICAvLyBBTlNXRVIgVEhFIEZSQU1FIFRIQVQgQVNLRUQsIE5PVCBFVkVSWSBQRU5ESU5HIENPTVBPTkVOVC5cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGBldmVudC5zb3VyY2VgIG5hbWVzIHRoZSBhc2tpbmcgZnJhbWUsIGFuZCBpZ25vcmluZyBpdCBtYWRlIHRoZSBhbnN3ZXIgYVxuICAgICAgICAgICAgICAgIC8vIGJyb2FkY2FzdDogbiBjb21wb25lbnRzIGVhY2ggYW5ub3VuY2Ugb25jZSwgYW5kIGVhY2ggYW5ub3VuY2UgcmUtc2VudFxuICAgICAgICAgICAgICAgIC8vIEluaXRNZXNzYWdlIHRvIGFsbCBuIHBlbmRpbmcsIHNvIGEgcGFnZSBwYWlkIG5eMiBwb3N0TWVzc2FnZXMgZHVyaW5nIHRoZVxuICAgICAgICAgICAgICAgIC8vIGV4YWN0IHdpbmRvdyBpdCB3YXMgYnVzaWVzdCBib290aW5nIGZyYW1lcy4gTWVhc3VyZWQgb24gYSAxMi1jb21wb25lbnRcbiAgICAgICAgICAgICAgICAvLyBwYWdlIChQaWMtVGltZSdzIHNoYXBlKTogMTQ0IEluaXRNZXNzYWdlcyB3aGVyZSAxMiB3ZXJlIG5lZWRlZC5cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIChBIGZyYW1lLXNpZGUgcmV0cnkgbG9vcCBicmllZmx5IGV4aXN0ZWQgaGVyZSB0b287IGl0IHdhcyByZW1vdmVkIGFzXG4gICAgICAgICAgICAgICAgLy8gZGVhZCB3ZWlnaHQgb25jZSBmaXggMSBsYW5kZWQuIFRhcmdldGluZyBtZWFucyBhIHJlcGVhdCBhbm5vdW5jZSwgZnJvbVxuICAgICAgICAgICAgICAgIC8vIGFueSBmdXR1cmUgc291cmNlLCBjb3N0cyBvbmUgbWVzc2FnZSByYXRoZXIgdGhhbiBuLilcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIEZBTEwgQkFDSyBUTyBUSEUgQlJPQURDQVNUIHdoZW4gdGhlIHNvdXJjZSBjYW5ub3QgYmUgbWF0Y2hlZCB0byBhIGZyYW1lLlxuICAgICAgICAgICAgICAgIC8vIGBzZW5kKClgIGRpc3BhdGNoZXMgc3ludGhldGljIGV2ZW50cywgd2hpY2ggY2Fycnkgbm8gc291cmNlLCBhbmQgYSB3ZWJcbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQncyBJbml0UmVxdWVzdCBjb21lcyBmcm9tIGB3aW5kb3dgIGl0c2VsZiAtLSBuZWl0aGVyIGhhcyBhXG4gICAgICAgICAgICAgICAgLy8gY29udGVudFdpbmRvdyB0byBtYXRjaCwgYW5kIGJvdGggbXVzdCBrZWVwIHdvcmtpbmcgZXhhY3RseSBhcyBiZWZvcmUuXG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbUFza2luZ0ZyYW1lID0gdGhpcy5jb21wb25lbnRzMmluaXQuZmlsdGVyKGNvbXBvbmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb21wb25lbnQuZWxlbWVudCBhcyBIVE1MSUZyYW1lRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ/Lm5vZGVOYW1lID09PSAnSUZSQU1FJyAmJiBlbGVtZW50LmNvbnRlbnRXaW5kb3cgPT09IGV2ZW50LnNvdXJjZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRzID0gZnJvbUFza2luZ0ZyYW1lLmxlbmd0aCA/IGZyb21Bc2tpbmdGcmFtZSA6IHRoaXMuY29tcG9uZW50czJpbml0O1xuICAgICAgICAgICAgICAgIHRhcmdldHMuZm9yRWFjaChjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgSW5pdE1lc3NhZ2UoY29tcG9uZW50LmlkKSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIGNvbXBvbmVudHMgMiBpbml0XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0ID0gdGhpcy5jb21wb25lbnRzMmluaXQuZmlsdGVyKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgIT09IChteW9wTWVzc2FnZSBhcyBJbml0UmVzcG9uc2UpLmNvbnRlbnQuaWQpXG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWF0ZWRDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSAobXlvcE1lc3NhZ2UgYXMgSW5pdFJlc3BvbnNlKS5jb250ZW50Py5pZCk7XG4gICAgICAgICAgICAgICAgaW5pdGlhdGVkQ29tcG9uZW50Py5zZXRJbml0aWF0ZWQoKVxuICAgICAgICAgICAgICAgIC8vaW5pdGlhdGVkQ29tcG9uZW50Py5wYXJlbnQ/LnNldEluaXRpYXRlZCgpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBpcyBpdCB0cnVlIHRvIG5vdCBwYXNzIGZ1cnRoZXIgKCB0byB0aGUgY29tcG9uZW50IClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IG15b3BNZXNzYWdlIGFzIEVudmVsb3BlZE1lc3NhZ2VcbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSB0eXBlZE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRNZXNzYWdlLmRpcmVjdGlvbiA9PT0gTWVzc2FnZURpcmVjdGlvbi5kb3duKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRNZXNzYWdlLm1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IEV4ZWN1dGVDb21wb25lbnRNZXRob2QubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5vbk1lc3NhZ2VSZWNlaXZlZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlZE1lc3NhZ2UubWVzc2FnZS5yb3V0ZSA9IHR5cGVkTWVzc2FnZS5yb3V0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuc2VuZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbm5lckNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IHR5cGVkTWVzc2FnZS5tZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNvbXBvbmVudC5zZW5kKHR5cGVkTWVzc2FnZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyA6IGxvZyA/XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vY29tcG9uZW50LnJlZnMuYm9keS5vbk1lc3NhZ2VSZWNlaXZlZChteW9wTWVzc2FnZS5tZXNzYWdlKTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gbXlvcE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuXG4gICAgICAgICAgICBpZiAoIWNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIC8vbm8gaW4gbWVtIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIC8vcGFzcyB0byBwYXJlbnQgSG9zdFNESyB0byB0cnkgcHJvY2VzcyB0aGVyZVxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5JZnJhbWVTREspIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLLm1lc3NhZ2VUb0hvc3QobXlvcE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm9uTWVzc2FnZVJlY2VpdmVkKG15b3BNZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9ub3QgcHJvY2Vzc2VkIGluIG9uTWVzc2FnZVJlY2VpdmVkXG4gICAgICAgICAgICAgICAgICAgIC8vcGFzcyB0byBwYXJlbnQgSG9zdFNESyB0byB0cnkgcHJvY2VzcyB0aGVyZVxuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93Lm15b3AuSWZyYW1lU0RLKVxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLLm1lc3NhZ2VUb0hvc3QobXlvcE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGV2ZW50LnNvdXJjZS5wb3N0TWVzc2FnZShcbiAgICAgICAgLy8gICAgIFwiaGkgdGhlcmUgeW91cnNlbGYhICB0aGUgc2VjcmV0IHJlc3BvbnNlIFwiICsgXCJpczogcmhlZWVlZXQhXCIsXG4gICAgICAgIC8vICAgICBldmVudC5vcmlnaW4sXG4gICAgICAgIC8vICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3Qgc3ludGhldGljRXZlbnQgPSBuZXcgTWVzc2FnZUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4oJycsXG4gICAgICAgICAgICB7ZGF0YTogbWVzc2FnZX1cbiAgICAgICAgKVxuXG4gICAgICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlSGFuZGxlcihzeW50aGV0aWNFdmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXQgPSAoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnM/OiBjb21wb25lbnRMb2FkZXJDcmVhdG9yW10pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhdGVkKSB7XG4gICAgICAgICAgICAvLyBnZXRIb3N0TW9kdWxlKCkgYWxyZWFkeSBpbml0aWF0ZXMgdGhlIFNESywgYW5kIHRoZSBSRUFETUUgdGVsbHMgaG9zdHMgdG8gY2FsbCBpbml0KClcbiAgICAgICAgICAgIC8vIGFmdGVyIGl0LiBPbmx5IG1lcmdlIGN1c3RvbSBsb2FkZXJzOyB0aGUgbWVzc2FnZSBsaXN0ZW5lciBpcyBhbHJlYWR5IGF0dGFjaGVkLlxuICAgICAgICAgICAgaWYgKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlckxvYWRlcnMoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFzaWNMb2FkZXJzID0gW1xuICAgICAgICAgICAgbmV3IE15b3BJZnJhbWVMb2FkZXIoKSxcbiAgICAgICAgICAgIG5ldyBXZWJjb21wb25lbnRMb2FkZXIoKSxcbiAgICAgICAgICAgIG5ldyBIVE1MQ29tcG9uZW50TG9hZGVyKClcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHNMb2FkZXJzID0gW1xuICAgICAgICAgICAgLi4uYmFzaWNMb2FkZXJzXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RlckxvYWRlcnMoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5jb21taW5nIG1lc3NhZ2VzIGZyb20gSUZyYW1lc1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgIFwibWVzc2FnZVwiLFxuICAgICAgICAgICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VIYW5kbGVyLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ215b3AgaG9zdFNESyBpbml0aWF0ZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgdGhpcy5pbml0aWF0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlZ2lzdGVyTG9hZGVycyA9IChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9yczogY29tcG9uZW50TG9hZGVyQ3JlYXRvcltdKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvYWRlckJ5VHlwZTogUmVjb3JkPHN0cmluZywgSU15b3BMb2FkZXI+ID0ge307XG5cbiAgICAgICAgY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMuZm9yRWFjaChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9yID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUxvYWRlciA9IG5ldyBjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9yKHRoaXMuY29tcG9uZW50c0xvYWRlcnMpO1xuICAgICAgICAgICAgbG9hZGVyQnlUeXBlW2N1c3RvbUxvYWRlci50eXBlXSA9IGN1c3RvbUxvYWRlcjtcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHNMb2FkZXJzLmZvckVhY2gobG9hZGVyID0+IHtcbiAgICAgICAgICAgIGlmICghbG9hZGVyQnlUeXBlW2xvYWRlci50eXBlXSlcbiAgICAgICAgICAgICAgICBsb2FkZXJCeVR5cGVbbG9hZGVyLnR5cGVdID0gbG9hZGVyO1xuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMgPSBPYmplY3QudmFsdWVzKGxvYWRlckJ5VHlwZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0U2tpbklkQnlTa2luU2VsZWN0b3IgPSBhc3luYyAoc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnLCBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXSA9IFtdLCBob29rcz86IGxvYWRlckhvb2tzKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gYXN5bmNGaW5kPFQ+KFxuICAgICAgICAgICAgYXJyYXk6IFRbXSxcbiAgICAgICAgICAgIHByZWRpY2F0ZTogKGl0ZW06IFQpID0+IFByb21pc2U8Ym9vbGVhbj5cbiAgICAgICAgKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXJyYXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXdhaXQgcHJlZGljYXRlKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIFJldHVybiB1bmRlZmluZWQgaWYgbm8gbWF0Y2ggaXMgZm91bmRcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoc2tpblNlbGVjdG9yLnR5cGUpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNhc2UgXCJEZWRpY2F0ZWRTa2luXCIgOiAvL2JhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgIGNhc2UgU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkOiB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU2tpbklkID0gKHNraW5TZWxlY3RvciBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZykuc2tpbj8uaWRcbiAgICAgICAgICAgICAgICAgICAgfHwgKHNraW5TZWxlY3RvciBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZykuc2tpbnMhWzBdLmlkO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkU2tpbklkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQ6IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFNraW5TZWxlY3RvciA9IChza2luU2VsZWN0b3IgYXMgSVNlZ21lbnRlZFNraW5Db25maWcpXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IGF3YWl0IGFzeW5jRmluZCh0eXBlZFNraW5TZWxlY3Rvci5zZWdtZW50cywgYXN5bmMgc2VnbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50LnNlZ21lbnRJZCA9PT0gJ0RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cGVyaWVuY2UgPSBleHBlcmllbmNlcy5maW5kKGV4cGVyaWVuY2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVyaWVuY2UudHlwZSA9PT0gRXhwZXJpZW5jZVR5cGVzLlNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlKS5zZWdtZW50LmlkID09PSBzZWdtZW50LnNlZ21lbnRJZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4cGVyaWVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImV4cGVyaWVuY2Ugbm90IGZvdW5kXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRFeHBlcmllbmNlID0gZXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2VnbWVudCA9ICh0eXBlZEV4cGVyaWVuY2Uuc2VnbWVudCBhcyBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudClcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50RnVuY3Rpb24gPSAoaG9va3MgPyBob29rcyA6IHt9KVt0eXBlZFNlZ21lbnQuZnVuY3Rpb25dO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgc2VnbWVudEZ1bmN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybihgc2VnbWVudElkOiR7c2VnbWVudC5zZWdtZW50SWR9LCAke3R5cGVkU2VnbWVudC5mdW5jdGlvbn0gZnVuY3Rpb24gbm90IHByb3ZpZGVkICFgKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTa2luSWRCeVNraW5TZWxlY3RvcihzZWdtZW50LnNraW5TZWxlY3RvciwgZXhwZXJpZW5jZXMpO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnIC8vVE9ET1xuICAgIH1cblxuICAgIHByaXZhdGUgcnVuU2tpblNlbGVjdG9yID0gYXN5bmMgKGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgaG9va3M/OiBsb2FkZXJIb29rcykgPT4ge1xuICAgICAgICBjb25zdCBza2luSWQgPSBhd2FpdCB0aGlzLl9nZXRTa2luSWRCeVNraW5TZWxlY3Rvcihjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLCBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcywgaG9va3MpO1xuICAgICAgICByZXR1cm4gY29tcG9uZW50Q29uZmlnLnR5cGUuc2tpbnMuZmluZChza2luID0+IHNraW4uaWQgPT09IHNraW5JZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRlckhvb2tzPzogbG9hZGVySG9va3M7XG5cbiAgICBwdWJsaWMgbG9hZENvbXBvbmVudCA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4oY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb250YWluZXI/OiBIVE1MRWxlbWVudCB8IFJlZiwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpOlxuICAgICAgICBQcm9taXNlPFQ+ID0+IHtcblxuICAgICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGNvbnRhaW5lciB3YXMgZm91bmQgZm9yIHRoaXMgY29tcG9uZW50Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdmVycmlkZGVuQ29uZmlnID0gYXdhaXQgY2hlY2tNeW9wT3ZlcnJpZGUoY29tcG9uZW50Q29uZmlnKTtcbiAgICAgICAgaWYgKG92ZXJyaWRkZW5Db25maWcpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IGxvZ1xuICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnID0gb3ZlcnJpZGRlbkNvbmZpZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy8gaWYgKCFjb250YWluZXIuX19ub25Qcm94aWVkKSB7XG4gICAgICAgIC8vICAgICBjb25zdCByZWZDb21wb25lbnQgPSAoY29udGFpbmVyIGFzIHVua25vd24gYXMgTXlvcFJlZkNvbXBvbmVudCk7XG4gICAgICAgIC8vICAgICAvL2lmIHdlIGdvdCBsb2FkQ29tcG9uZW50IG92ZXIgTXlvcFJlZkNvbXBvbmVudFxuICAgICAgICAvLyAgICAgaWYgKHJlZkNvbXBvbmVudC5pZCAmJiByZWZDb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMubG9hZENvbXBvbmVudChjb21wb25lbnRDb25maWcsIHJlZkNvbXBvbmVudC5yZWYsIG9wdGlvbnMpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIC8vIGxldCByb290Q29tcG9uZW50OiBJTXlvcENvbXBvbmVudCA9IHJlZkNvbXBvbmVudDtcbiAgICAgICAgLy8gICAgICAgICAvLyB3aGlsZSghcm9vdENvbXBvbmVudC5lbGVtZW50ICYmIHJvb3RDb21wb25lbnQucGFyZW50KXtcbiAgICAgICAgLy8gICAgICAgICAvLyAgICAgcm9vdENvbXBvbmVudCA9IHJvb3RDb21wb25lbnQucGFyZW50XG4gICAgICAgIC8vICAgICAgICAgLy8gfVxuICAgICAgICAvLyAgICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgLy8gcm9vdENvbXBvbmVudC5lbGVtZW50XG4gICAgICAgIC8vICAgICAgICAgLy8gLy93aGF0IG5vdyA/XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICBjb25zdCBob29rcyA9IHsuLi4odGhpcy5sb2FkZXJIb29rcyA/PyB7fSksIC4uLihvcHRpb25zPy5ob29rcyA/PyB7fSl9O1xuXG4gICAgICAgIGNvbnN0IHJlZiA9IGNvbnRhaW5lciBhcyBSZWY7XG4gICAgICAgIGlmIChyZWYubXlvcCkge1xuICAgICAgICAgICAgaWYgKHJlZi5jb21wb25lbnQpIHtcblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZyA9IHsuLi5jb21wb25lbnRDb25maWd9O1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY29tcG9uZW50Q29uZmlnLmluc3RhbmNlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU2tpbiA9IGF3YWl0IHRoaXMucnVuU2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZywgaG9va3MpIVxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRTa2luKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJ1blNraW5TZWxlY3RvciBmYWlsZWQgdG8gY2hvb3NlIHNraW4sIGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWdcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/Lmhvb2tzPy5hZnRlclNraW5TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFNraW4gPSBhd2FpdCBvcHRpb25zLmhvb2tzLmFmdGVyU2tpblNlbGVjdGVkKHsuLi5zZWxlY3RlZFNraW59KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgIHNraW46IHNlbGVjdGVkU2tpblxuICAgICAgICAgICAgICAgICAgICAvLyAgc2tpbnM6IFtzZWxlY3RlZFNraW5dXG4gICAgICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHsuLi5vcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgb3B0aW9ucy5ob29rc1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IGF3YWl0IGNyZWF0ZVJlZkNvbXBvbmVudDxUPihyZWYsIGNvbXBvbmVudENvbmZpZywgdGhpcy5jb21wb25lbnRzLCBvcHRpb25zKTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNvbm5lY3QgcmVmcyBhbmQgcHJvcHMgaW5zb2RlIGNyZWF0ZVJlZkNvbXBvbmVudCwgZWxzZXdoZXJlIGl0cyBub3QgcmVhbGx5IDxUPlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZDb21wb25lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbG9hZCBjb21wb25lbnQgZ290IGEgZGV0YWNoZWQgcmVmLicpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIGNob29zZSBza2luIG9uIHJ1bnRpbWUgLi4uXG4gICAgICAgICAqICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLnR5cGVcbiAgICAgICAgICovXG5cbiAgICAgICAgbGV0IHNlbGVjdGVkU2tpbiA9IGF3YWl0IHRoaXMucnVuU2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZywgaG9va3MpIVxuXG4gICAgICAgIGlmICghc2VsZWN0ZWRTa2luKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJydW5Ta2luU2VsZWN0b3IgZmFpbGVkIHRvIGNob29zZSBza2luLCBjaGVjayB0aGUgcHJvdmlkZWQgY29uZmlnXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/Lmhvb2tzPy5hZnRlclNraW5TZWxlY3RlZCkge1xuICAgICAgICAgICAgc2VsZWN0ZWRTa2luID0gYXdhaXQgb3B0aW9ucy5ob29rcy5hZnRlclNraW5TZWxlY3RlZCh7Li4uc2VsZWN0ZWRTa2lufSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9uZW50TG9hZGVyID0gdGhpcy5jb21wb25lbnRzTG9hZGVycy5maW5kKGxvYWRlciA9PiBsb2FkZXIudHlwZSA9PT0gc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlKTtcblxuICAgICAgICBpZiAoIWNvbXBvbmVudExvYWRlcikge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIGxvYWRlciBcIiR7c2VsZWN0ZWRTa2luLmxvYWRlci50eXBlfVwiIHdhcyBmb3VuZCBmb3IgY29tcG9uZW50YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2ZvciBsb2FkZWQgd2ViY29tcG9uZW50IG1vZHVsZXMgdG8gZm9sbG93aW5nIGxpbmUgY3JlYXRlcyBhIHJhY2UgY29uZGl0aW9uIHdpdGggdGhlIGluaXQgbWVzc2FnZSBmbG93XG4gICAgICAgIGxldCBjb21wb25lbnQgPSBhd2FpdCBjb21wb25lbnRMb2FkZXIubG9hZChjb21wb25lbnRDb25maWcudHlwZSwgc2VsZWN0ZWRTa2luLCBjb250YWluZXIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIFRPRE8gOiB3aGVuIHRoaXMgaXMgbm90IHRydWUgP1xuICAgICAgICBpZiAoIWNvbXBvbmVudC5pc0luaXRpYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQucHVzaChjb21wb25lbnQpXG4gICAgICAgIH1cblxuICAgICAgICBjb21wb25lbnQuYmluZCgnb25EaXNwb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY29tcG9uZW50IGRpc3Bvc2UnLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzLmZpbHRlcihjID0+IGMgIT09IGNvbXBvbmVudClcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0ID0gdGhpcy5jb21wb25lbnRzMmluaXQuZmlsdGVyKGMgPT4gYyAhPT0gY29tcG9uZW50KVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcblxuICAgICAgICAvLyBETyBOT1QgV0FJVCBUTyBCRSBBU0tFRCAtLSBCVVQgT05MWSBPTkNFIEZVTExZIFJFR0lTVEVSRUQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoZSBjb21wb25lbnQgYW5ub3VuY2VzIGl0c2VsZiBhcyBzb29uIGFzIGl0IGJvb3RzLCBhbmQgd2UgYW5zd2VyIGJ5IGxvb2tpbmcgaXRcbiAgICAgICAgLy8gdXAuIEJ1dCBpdCBvbmx5IGxhbmRzIGluIG91ciBsaXN0cyBIRVJFLCBhZnRlciB0aGUgYXdhaXQgYWJvdmUsIHdoaWNoIHRoZVxuICAgICAgICAvLyBjb21tZW50IG9uIHRoYXQgbGluZSBhbHJlYWR5IGNhbGxzIGEgcmFjZTogYSBjb21wb25lbnQgdGhhdCBib290ZWQgaW5zaWRlIHRoZVxuICAgICAgICAvLyBhd2FpdCBhbm5vdW5jZWQgaW50byBhbiBlbXB0eSBsaXN0LCBpdHMgSW5pdFJlcXVlc3Qgd2FzIGRyb3BwZWQsIGFuZCBub3RoaW5nXG4gICAgICAgIC8vIGV2ZXIgc2VudCB0aGUgSW5pdE1lc3NhZ2UgaXQgd2FzIGJsb2NrZWQgb24gLS0gaW5pdGlhdGVkKCkgdGhlbiByZWplY3RlZCB3aXRoXG4gICAgICAgIC8vIHRpbWVvdXRfPG1zPi4gTWluaWZpY2F0aW9uIG1hZGUgdGhhdCBjb21tb24gYnkgYm9vdGluZyBmcmFtZXMgc29vbmVyLiBSZXBvcnRlZFxuICAgICAgICAvLyBieSBQaWMtVGltZSAyMDI2LTEwLTE3LiBTZW5kaW5nIGhlcmUgY2xvc2VzIHRoZSBvcmRlcmluZyBob2xlIGluc3RlYWQgb2YgaG9waW5nXG4gICAgICAgIC8vIHRvIHN1cnZpdmUgaXQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRISVMgTVVTVCBDT01FIEFGVEVSIGBjb21wb25lbnRzLnB1c2hgLCBOT1QgQkVGT1JFIElULiBUaGUgdHdvIGNvbXBvbmVudCBjbGFzc2VzXG4gICAgICAgIC8vIGRvIG5vdCBzaGFyZSBhIHRyYW5zcG9ydDogYW4gaWZyYW1lIGlzIG1lc3NhZ2VkIHdpdGggcG9zdE1lc3NhZ2UsIHdoaWNoIGlzXG4gICAgICAgIC8vIGFzeW5jLCBzbyByZWdpc3RyYXRpb24gYWx3YXlzIHdvbiB0aGUgcmFjZSBieSBsdWNrLiBBIHdlYiBjb21wb25lbnQgaXMgbWVzc2FnZWRcbiAgICAgICAgLy8gd2l0aCBhIFNZTkNIUk9OT1VTIGN1c3RvbUVsZW1lbnQuZGlzcGF0Y2hFdmVudCwgc28gaXQgcmVnaXN0ZXJzIGFuZCByZXBsaWVzIHdpdGhcbiAgICAgICAgLy8gSW5pdFJlc3BvbnNlICppbnNpZGUqIHRoaXMgY2FsbCAtLSBhbmQgdGhlIEluaXRSZXNwb25zZSBoYW5kbGVyIHJlc29sdmVzIHRoZVxuICAgICAgICAvLyBjb21wb25lbnQgb3V0IG9mIGB0aGlzLmNvbXBvbmVudHNgLiBTZW5kaW5nIHdoaWxlIHRoYXQgYXJyYXkgd2FzIHN0aWxsIG1pc3NpbmdcbiAgICAgICAgLy8gdGhlIGNvbXBvbmVudCBtZWFudCB0aGUgbG9va3VwIGZvdW5kIG5vdGhpbmcsIHNldEluaXRpYXRlZCgpIG5ldmVyIHJhbiwgYW5kXG4gICAgICAgIC8vIHNpbmNlIGNvbXBvbmVudHMyaW5pdCBoYWQgYWxyZWFkeSBiZWVuIGZpbHRlcmVkIHRoZSBjb21wb25lbnQgY291bGQgbmV2ZXIgYmVcbiAgICAgICAgLy8gcmVjb3ZlcmVkOiBldmVyeSB3ZWIgY29tcG9uZW50IGh1bmcgdW50aWwgdGltZW91dC4gQ2F1Z2h0IGJ5XG4gICAgICAgIC8vIHRlc3QvaW5pdC13ZWJjb21wb25lbnQuZTJlLm1qcy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQSBmcmFtZSB0aGF0IGhhcyBub3QgYm9vdGVkIHlldCBoYXMgYSBudWxsIGNvbnRlbnRXaW5kb3csIHNvIGBzZW5kYCBpcyBhIG5vLW9wXG4gICAgICAgIC8vIChpdCBpcyBvcHRpb25hbC1jaGFpbmVkKSBhbmQgdGhhdCBjb21wb25lbnQncyBvd24gSW5pdFJlcXVlc3QgaXMgYW5zd2VyZWRcbiAgICAgICAgLy8gbm9ybWFsbHkgLS0gd2UgYXJlIHJlZ2lzdGVyZWQgYnkgdGhlbi5cbiAgICAgICAgaWYgKCFjb21wb25lbnQuaXNJbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBJbml0TWVzc2FnZShjb21wb25lbnQuaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdHJ1ZSBieSBkZWZhdWx0XG4gICAgICAgIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLmNvbm5lY3RQcm9wcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IG1ha2UgdHlwZSBmaWVsZCBjb25kaXRpb25hbCB0eXBlIGluZmVyIFwic3RyaW5nXCIgPiBzdHJpbmcsIFwibnVtYmVyXCIgPiBudW1iZXIsIGV0Yy4uLlxuICAgICAgICAgICAgY29tcG9uZW50ID0gY29ubmVjdFByb3BzKGNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLnR5cGUucHJvcHMsIHNlbGVjdGVkU2tpbik7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy9UT0RPIDogbWFrZSBvcHRpb25hbD9cbiAgICAgICAgICAgIC8vVE9ETyA6IGZpeCBpc3N1ZXMgd2l0aCB0aW1lb3V0IGFuZCB3cm9uZyByZWYgbmFtZXMgZnJvbSBjb25maWcgdnMgY3VycmVudCBza2luXG4gICAgICAgICAgICBhd2FpdCBjb25uZWN0UmVmcyhjb21wb25lbnQsIGNvbXBvbmVudENvbmZpZywgdGhpcy5jb21wb25lbnRzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAvLyBUT09EIDogdGhyb3cgP1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucz8uc2tpcEluaXQpXG4gICAgICAgICAgICBhd2FpdCBjb21wb25lbnQuaW5pdGlhdGVkKCk7XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudCBhcyBUO1xuICAgIH1cblxuICAgIHB1YmxpYyBuYXZpZ2F0ZSA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4oY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgbmV3Q29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBvcHRpb25zPzogbmF2aWdhdGlvbk9wdGlvbnMpID0+IHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmF2aWdhdGluZyBvbiByZW1vdGUgcmVmIGNvbXBvbmVudHMgaXMgbm90IGltcGxlbWVudGVkIHlldCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21wb25lbnQubWFya2VkRm9yRGlzcG9zZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIGlmIChvcHRpb25zPy5pbnBsYWNlKSB7XG4gICAgICAgIC8vICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgLy8gICAgICAgICBsZXQgbmV3Q29tcG9uZW50ID0gYXdhaXQgdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgICAgIGF3YWl0IG5ld0NvbXBvbmVudC5pbml0aWF0ZWQoKTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICBpZiAob3B0aW9ucy5pbml0KVxuICAgICAgICAvLyAgICAgICAgICAgICBhd2FpdCBvcHRpb25zLmluaXQobmV3Q29tcG9uZW50KTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50O1xuICAgICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJy4uLicpXG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uc3RhZ2VkKSB7XG4gICAgICAgICAgICAvL2NvbnN0IHNlbGVjdGVkU2tpbiA9IHRoaXMucnVuU2tpblNlbGVjdG9yKG5ld0NvbXBvbmVudENvbmZpZylcbiAgICAgICAgICAgIGxldCBuZXdDb21wb25lbnQgPSBhd2FpdCB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuY29udGFpbmVyLCB7XG4gICAgICAgICAgICAgICAgaGlkZGVuOiB0cnVlLFxuICAgICAgICAgICAgICAgIHJlbGF0aXZlOiB7ZGlyZWN0aW9uOiAnYWZ0ZXInLCBjaGlsZDogY29tcG9uZW50LmVsZW1lbnQhfSxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaW5pdClcbiAgICAgICAgICAgICAgICBhd2FpdCBvcHRpb25zLmluaXQobmV3Q29tcG9uZW50KTtcblxuICAgICAgICAgICAgbmV3Q29tcG9uZW50LnNob3coKTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBjb21wb25lbnQuZWxlbWVudCEubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgIGNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmNvbnRhaW5lciwge1xuICAgICAgICAgICAgICAgIHJlbGF0aXZlOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiZWZvcmVcIixcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQ6IG5leHRTaWJsaW5nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIG5hdmlnYXRpb25PcHRpb25zID0ge1xuICAgIHN0YWdlZD86IGJvb2xlYW4sXG4gICAgLy9pbnBsYWNlPzogYm9vbGVhbixcbiAgICBpbml0PzogKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQpID0+IFByb21pc2U8dm9pZD5cbiAgICBza2lwSW5pdD86IGJvb2xlYW5cbn0gJiBsb2FkZXJPcHRpb25zXG5cbnR5cGUgcmVsYXRpdmVMb2FkQ29uZmlnRGlyZWN0aW9uID0gJ2JlZm9yZScgfCAnYWZ0ZXInO1xuXG5cbmV4cG9ydCB0eXBlIGxvYWRlckhvb2tzID0ge1xuICAgIGFmdGVyU2tpblNlbGVjdGVkPzogKHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcpID0+IFByb21pc2U8SVNraW5Db25maWc+XG59ICZcbiAgICAvLyBzZWdtZW50YXRpb24gaG9va3NcbiAgICAoeyBba2V5OiBzdHJpbmddOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbiB9IHwge30pXG5cbi8vVE9ETzogc3VwcG9ydCBzZXJpYWxpemFibGUgdmVyc2lvbiBvZiB0aGF0IG9iamVjdFxuZXhwb3J0IGludGVyZmFjZSByZWxhdGl2ZUxvYWRDb25maWcge1xuICAgIC8vSWYgdGhpcyBpcyBudWxsLCB0aGVuIG5ld05vZGUgaXMgaW5zZXJ0ZWQgYXQgdGhlIGVuZCBvZiBub2RlJ3MgY2hpbGQgbm9kZXMuXG4gICAgLy9odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTm9kZS9pbnNlcnRCZWZvcmVcbiAgICBjaGlsZDogQ2hpbGROb2RlIHwgbnVsbFxuICAgIGRpcmVjdGlvbjogcmVsYXRpdmVMb2FkQ29uZmlnRGlyZWN0aW9uXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUVudmlyb25tZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxudHlwZSBFbGVtZW50QXR0cmlidXRlcyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgbG9hZGVyT3B0aW9ucyB7XG4gICAgaWQ/OiBzdHJpbmdcbiAgICBoaWRkZW4/OiBib29sZWFuXG4gICAgY29ubmVjdFByb3BzPzogYm9vbGVhblxuICAgIHRpbWVvdXQ/OiBudW1iZXJcbiAgICBza2lwSW5pdD86IGJvb2xlYW5cbiAgICByZWxhdGl2ZT86IHJlbGF0aXZlTG9hZENvbmZpZ1xuICAgIGhvb2tzPzogbG9hZGVySG9va3NcbiAgICBlbGVtZW50QXR0cmlidXRlcz86IEVsZW1lbnRBdHRyaWJ1dGVzXG4gICAgX2Vudmlyb25tZW50PzogSUVudmlyb25tZW50XG4gICAgX2hhc1BhcmVudD86IGJvb2xlYW5cbiAgICBfaW5zcGVjdGlvbj86IGJvb2xlYW5cbiAgICBkYXRhPzogYW55XG4gICAgLyoqXG4gICAgICogUmF3IENTUyBpbmplY3RlZCBpbnRvIHRoZSBjb21wb25lbnQncyBpZnJhbWUgYDxoZWFkPmAgYmVmb3JlIGZpcnN0IHBhaW50LlxuICAgICAqIEFwcGVuZGVkIGxhc3Qgc28gaXQgb3ZlcnJpZGVzIHRoZSBjb21wb25lbnQncyBvd24gc3R5bGVzIHZpYSBjYXNjYWRlIG9yZGVyLlxuICAgICAqIFVzZWZ1bCBmb3IgdGhlbWluZyB2MiAoSFRNTCkgY29tcG9uZW50cyBcdTIwMTQgY29sb3JzLCBmb250cywgc3BhY2luZywgZXRjLlxuICAgICAqL1xuICAgIGluamVjdENzcz86IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIENvbnRyb2wgaWZyYW1lIGF1dG8tc2l6aW5nIGJlaGF2aW9yLlxuICAgICAqIC0gdHJ1ZSAoZGVmYXVsdCk6IGlmcmFtZSBhdXRvLXNpemVzIHRvIGNvbnRlbnQgaGVpZ2h0LCB3aWR0aCBmaWxscyBwYXJlbnQuXG4gICAgICogLSBmYWxzZTogbm8gc2l6aW5nIGxvZ2ljIHJ1bnMuIE5vIG9ic2VydmVycywgbm8gbWVhc3VyZW1lbnRzLCBubyBzdHlsZSBjaGFuZ2VzLlxuICAgICAqICAgVGhlIGlmcmFtZSBzdGF5cyBhdCBwb3NpdGlvbjphYnNvbHV0ZSBmaWxsaW5nIHRoZSBjb250YWluZXIuXG4gICAgICogICBUaGUgaG9zdCBpcyBmdWxseSByZXNwb25zaWJsZSBmb3IgY29udGFpbmVyIGRpbWVuc2lvbnMuXG4gICAgICovXG4gICAgYXV0b1NpemU/OiBib29sZWFuXG5cbiAgICAvKipcbiAgICAgKiBQZXItY2FsbCByZW5kZXIgcG9saWN5LiBUYWtlcyBwcmVjZWRlbmNlIG92ZXIgaG9zdFNESy5zZXRSZW5kZXJQb2xpY3kgXHUyMDE0IGxldHMgYW5cbiAgICAgKiBhcHAgcmVzdHJpY3QgZ2xvYmFsbHkgYW5kIGFsbG93IChvciBmdXJ0aGVyIHJlc3RyaWN0KSBzcGVjaWZpYyBsb2FkQ29tcG9uZW50IGNhbGxzLlxuICAgICAqL1xuICAgIHJlbmRlclBvbGljeT86IFJlbmRlclBvbGljeVxuXG4gICAgLyoqXG4gICAgICogRm9yY2UgZnVsbCBpc29sYXRpb24gZm9yIGFuIGlubGluZS1IVE1MIChsb2NhbEZyYW1lKSBjb21wb25lbnQ6IHNhbmRib3hlZCxcbiAgICAgKiBjcm9zcy1vcmlnaW4gaWZyYW1lIHdpdGggbm8gaG9zdC1kb2N1bWVudCBhY2Nlc3MuIEEgcmVuZGVyIHBvbGljeSByZXR1cm5pbmdcbiAgICAgKiAnaXNvbGF0ZWRJZnJhbWUnIGhhcyB0aGUgc2FtZSBlZmZlY3QuXG4gICAgICovXG4gICAgaXNvbGF0aW9uPzogYm9vbGVhblxufVxuXG5pZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgIH07XG59XG5cbmlmICghd2luZG93Lm15b3AuaG9zdFNESykge1xuICAgIGNvbnN0IF9ob3N0U0RLID0gbmV3IEhvc3RTREsoKTtcbiAgICAvL1RPRE86IGVuYWJsZSBsYXp5IGluaXQ/XG4gICAgX2hvc3RTREsuaW5pdCgpO1xuXG4gICAgaWYgKCF3aW5kb3cubXlvcCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX19cbiAgICAgICAgfTtcbiAgICB9XG4gICAgd2luZG93Lm15b3AuaG9zdFNESyA9IF9ob3N0U0RLO1xufVxuXG4vLyBUaGUgb3B0LWluLCByZWFjaGFibGUgd2l0aCBubyBpbXBvcnQgYW5kIG5vIGJ1aWxkIGNoYW5nZSBvbiB0aGUgaG9zdCBwYWdlOlxuLy9cbi8vICAgbXlvcC5kZWxpdmVyeSh7IG1pbmlmeTogdHJ1ZSwgY2FjaGU6IHRydWUgfSk7ICAgLy8gbGFuZSArIHRoZSBjbGllbnQgd2luZG93XG4vLyAgIG15b3AuZGVsaXZlcnkuc3RhdHMoKTsgICAgICAgICAgICAgICAgLy8gd2hhdCBhbnN3ZXJlZCwgYW5kIGhvdyBvZnRlbiBpdCBmZWxsIGJhY2tcbi8vICAgbXlvcC5kZWxpdmVyeS5vZmYoKTsgICAgICAgICAgICAgICAgICAvLyBiYWNrIHRvIHRvZGF5J3MgaG9zdCwgbm8gcmVsb2FkXG4vL1xuLy8gQXR0YWNoZWQgaGVyZSByYXRoZXIgdGhhbiBleHBvcnRlZCBvbmx5IGFzIGEgbW9kdWxlIGZ1bmN0aW9uIGJlY2F1c2UgdGhlIGhvc3QgYXBwIHRoYXRcbi8vIG9wdHMgaW4gaXMgb2Z0ZW4gbG9hZGluZyB0aGUgU0RLIGZyb20gYSBzY3JpcHQgdGFnLCB3aGVyZSBgaW1wb3J0YCBpcyBub3QgYXZhaWxhYmxlLlxuaWYgKHdpbmRvdy5teW9wICYmICEod2luZG93Lm15b3AgYXMgYW55KS5kZWxpdmVyeSkge1xuICAgIGNvbnN0IGFwaTogYW55ID0gKG9wdHM/OiB7bWluaWZ5PzogYm9vbGVhbjsgY2FjaGU/OiBib29sZWFuOyBmbG93PzogYm9vbGVhbjsgaG9zdD86IHN0cmluZyB8IG51bGx9KSA9PiBkZWxpdmVyeShvcHRzKTtcbiAgICBhcGkuc3RhdHMgPSBkZWxpdmVyeVN0YXRzO1xuICAgIGFwaS5vZmYgPSBkZWxpdmVyeU9mZjtcbiAgICBhcGkucmVmcmVzaCA9IGRlbGl2ZXJ5UmVmcmVzaDtcbiAgICAod2luZG93Lm15b3AgYXMgYW55KS5kZWxpdmVyeSA9IGFwaTtcbn1cblxuLy8gU2FtZSByZWFzb246IGEgdjEgaG9zdCB0aGF0IHJlbmRlcmVkIHRoZSBpZnJhbWUgb24gaXRzIHNlcnZlciBzZWVkcyB0aGUgY29uZmlnIGl0IGZldGNoZWRcbi8vIHRoZXJlLCBmcm9tIGEgcGxhaW4gPHNjcmlwdD46ICBteW9wLmh5ZHJhdGVWMSh7IFtjb21wb25lbnRJZF06IGZsb3dKc29uIH0pO1xuaWYgKHdpbmRvdy5teW9wICYmICEod2luZG93Lm15b3AgYXMgYW55KS5oeWRyYXRlVjEpIHtcbiAgICAod2luZG93Lm15b3AgYXMgYW55KS5oeWRyYXRlVjEgPSBoeWRyYXRlVjFDb21wb25lbnRzO1xufVxuXG4vLyBAdHMtaWdub3JlXG5leHBvcnQgY29uc3QgaG9zdFNESzogSG9zdFNESyA9IHdpbmRvdy5teW9wLmhvc3RTREs7XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ2hvc3RTREsnLCBob3N0U0RLKTtcblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIGludGVyZmFjZSBXaW5kb3cge1xuICAgICAgICBteW9wOiB7XG4gICAgICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXzogc3RyaW5nLFxuICAgICAgICAgICAgaG9zdFNESzogSG9zdFNESyxcbiAgICAgICAgICAgIElmcmFtZVNESzogSW5zdGFuY2VUeXBlPHR5cGVvZiBJZnJhbWVTREs+XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtIb3N0U0RLfSBmcm9tIFwiLi4vLi4vaG9zdC9ob3N0U0RLXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50c1wiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBjcmVhdGVSZWYgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvL1RPRE8gOiB1c2UgcmVmIGhlbHBlciBoZXJlXG4gICAgICAgICAgICBjb25zdCBhbGxJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7ZXZlbnQucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG4gICAgICAgICAgICBpZiAoYWxsSXRlbXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaG9zdFNESyA9IEhvc3RTREsuSW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBhd2FpdCBob3N0U0RLLmxvYWRDb21wb25lbnQoZXZlbnQubmVzdGVkQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBhbGxJdGVtcy5pdGVtKDApLFxuICAgICAgICAgICAgICAgICAgICBldmVudC5vcHRpb25zKVxuXG4gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCBpdCB0byBwYXNzIHRoZSBhc3NpZ25lZCBpZHNcbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRSZWZDb25maWc6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyZWZDb21wb25lbnQucmVmcykuZm9yRWFjaChyZWZOYW1lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZiA9IHJlZkNvbXBvbmVudC5yZWZzW3JlZk5hbWVdO1xuICAgICAgICAgICAgICAgICAgICByZWYgPSByZWYuX19ub25Qcm94aWVkIHx8IHJlZjtcblxuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkUmVmQ29uZmlnLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiAocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBuZXN0ZWRSZWZDb25maWcpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgLSBET00gZWxlbWVudCBub3QgZm91bmQnKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBbXSwgdHJ1ZSkpO1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRlUmVmKCkudGhlbigpO1xuICAgICAgICAvL3JldHVybmluZyB1bmRlZmluZWQgc28gaXQgd29uJ3QgYWN0IGFzIGEgY2xlYW51cFxuICAgIH1cbn1cbiIsICIvLyBAdHMtbm9jaGVja1xuZXhwb3J0IGNvbnN0IG9ic2VydmVET00gPSAob2JqOiBIVE1MRWxlbWVudCB8IG51bGwsIGNhbGxiYWNrOiAobXV0YXRpb25SZWNvcmRzPzogTXV0YXRpb25SZWNvcmRbXSkgPT4gdm9pZCkgPT4ge1xuICAgIGlmICghb2JqKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCduJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IE11dGF0aW9uT2JzZXJ2ZXIgPSB3aW5kb3cuTXV0YXRpb25PYnNlcnZlciB8fCB3aW5kb3cuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcblxuICAgIGlmICghb2JqIHx8IG9iai5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuO1xuXG4gICAgaWYgKE11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgLy8gZGVmaW5lIGEgbmV3IG9ic2VydmVyXG4gICAgICAgIGNvbnN0IG11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjaylcbiAgICAgICAgLy8gaGF2ZSB0aGUgb2JzZXJ2ZXIgb2JzZXJ2ZSBmb3IgY2hhbmdlcyBpbiBjaGlsZHJlblxuICAgICAgICBjb25zdCBjb25maWcgPSB7YXR0cmlidXRlczogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlfTtcbiAgICAgICAgbXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKG9iaiwgY29uZmlnKVxuICAgICAgICByZXR1cm4gbXV0YXRpb25PYnNlcnZlclxuICAgIH1cblxuICAgIC8vIGJyb3dzZXIgc3VwcG9ydCBmYWxsYmFja1xuICAgIGVsc2UgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlSW5zZXJ0ZWQnLCBjYWxsYmFjaywgZmFsc2UpXG4gICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlUmVtb3ZlZCcsIGNhbGxiYWNrLCBmYWxzZSlcbiAgICB9XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7b2JzZXJ2ZURPTX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9kb21PYnNlcnZlclwiO1xuXG5leHBvcnQgY2xhc3MgU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8RXhlY3V0ZVNjcmlwdE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZVxuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGlmIChldmVudC5zb3VyY2UpIHtcbiAgICAgICAgICAgIG9ic2VydmVET00oZG9jdW1lbnQuYm9keSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UoKVxuICAgICAgICAgICAgICAgICAgICAvLyAgbmV3IEVudmVsb3BlZE1lc3NhZ2UoZXZlbnQuc291cmNlISwgbmV3IE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlKCkpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UsIEZvcm1EYXRhRW50cnksIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIElucHV0RWxlbWVudFZhbHVlLH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmNvbnN0IGdldElucHV0VmFsdWUgPSAoZWxlbWVudCk6IElucHV0RWxlbWVudFZhbHVlID0+IHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGZvcm1cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGRhdGFPYmplY3Q6IElucHV0RWxlbWVudFZhbHVlID0ge1xuICAgICAgICAgICAgZm9ybURhdGE6IHt9LFxuICAgICAgICAgICAgdW5tYXBwZWREYXRhOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE1hbnVhbGx5IGFkZCBlbGVtZW50cyB3aXRob3V0IG5hbWVzXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpO1xuICAgICAgICBsZXQgYXV0b05hbWVJbmRleGVyID0gLTE7XG5cbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBgXyR7KCsrYXV0b05hbWVJbmRleGVyKX1gXG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlRGF0YTogRm9ybURhdGFFbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldElucHV0VmFsdWUoZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBlbGVtZW50LnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eTogbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LnZhbGlkaXR5LCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgbXlvcElkLFxuICAgICAgICAgICAgICAgIH07XG5cblxuICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldIHx8ICFkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldLnZhbHVlIHx8IG5vZGVEYXRhLnZhbHVlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFrZXkpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2goZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGFPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbWVudC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmNoZWNrZWQgPyBlbGVtZW50LnZhbHVlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgaW5wdXQgYW5kIHRleHRhcmVhIGVsZW1lbnRzXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCBlbGVtZW50LnRhZ05hbWUgPT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNlbGVjdCBlbGVtZW50cyAoZHJvcGRvd25zKVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBlZGl0YWJsZSBkaXZzIChjb250ZW50RWRpdGFibGUpXG4gICAgaWYgKGVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuaW5uZXJUZXh0IHx8IGVsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhbiB1bnN1cHBvcnRlZCBlbGVtZW50IHR5cGVcbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8R2V0RWxlbWVudFZhbHVlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuR2V0RWxlbWVudFZhbHVlTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBHZXRFbGVtZW50VmFsdWVNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZShcbiAgICAgICAgICAgICAgICBnZXRJbnB1dFZhbHVlKGl0ZW0pXG4gICAgICAgICAgICApLCBldmVudCk7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7R2V0QXR0cmlidXRlTWVzc2FnZSwgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEZpcnN0RWxlbWVudEJ5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEdldEF0dHJpYnV0ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEF0dHJpYnV0ZU1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogR2V0QXR0cmlidXRlTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gZ2V0Rmlyc3RFbGVtZW50QnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudClcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZShpdGVtLmdldEF0dHJpYnV0ZShldmVudC5uYW1lKSksIGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSwgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlfSBmcm9tICcuLi8uLi9tZXNzYWdlcydcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIFNldFJlc2l6ZU9ic2VydmVySGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgICAgICAgIC8vVE9ETyA6IHBhc3MgdGhlIGhlaWdodFxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZXNpemVPYnNlcnZlck1lc3NhZ2UoKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFNldElubmVySHRtbEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8U2V0SW5uZXJIdG1sPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRJbm5lckh0bWw7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogU2V0SW5uZXJIdG1sKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGl0ZW0uaW5uZXJIVE1MID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBJZnJhbWUgU0RLIGlzIGludGVuZGVkIGZvciBzY2VuYXJpb3Mgd2hlcmUgZGV2ZWxvcGVycyB3aXNoIHRvIGltcGxlbWVudCBNeW9wIGNvbXBvbmVudHMgYXMgc2VwYXJhdGUgd2ViIGFwcGxpY2F0aW9ucyBob3N0ZWQgd2l0aGluIGlmcmFtZXMuPGJyLz48YnIvPlxuICogQnkgaW1wb3J0aW5nIHRoZSBJZnJhbWUgU0RLLCBkZXZlbG9wZXJzIGdhaW4gYWNjZXNzIHRvIHRvb2xzIGFuZCB1dGlsaXRpZXMgbmVjZXNzYXJ5IGZvciBoYW5kbGluZyBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGhvc3QgYXBwbGljYXRpb24gYW5kIHRoZSBlbWJlZGRlZCBpZnJhbWUtYmFzZWQgTXlvcCBjb21wb25lbnRzPGJyLz48YnIvPlxuICogVGhpcyBTREsgZmFjaWxpdGF0ZXMgc2VjdXJlIGlzb2xhdGlvbiwgYWxsb3dpbmcgY29tcG9uZW50cyB0byBmdW5jdGlvbiBpbmRlcGVuZGVudGx5IHdoaWxlIHN0aWxsIGJlbmVmaXRpbmcgZnJvbSB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgYW5kIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzIHByb3ZpZGVkIGJ5IHRoZSBob3N0IGFwcGxpY2F0aW9uLjxici8+PGJyLz5cbiAqXG4gT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuIGBgYGpzXG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gb3JcbiBgYGB0c1xuIGltcG9ydCB7Z2V0SWZyYW1lTW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IGdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiBvclxuIGBgYHRzXG4gaW1wb3J0IHtJZnJhbWVTREt9IGZyb20gJ0BteW9wL3Nkay9pZnJhbWUnO1xuIGBgYFxuICpcbiAqL1xuaW1wb3J0IHtCYXNlTXlvcFNES30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtCaW5kT25DbGlja0hhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9iaW5kT25DbGlja0hhbmRsZXJcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlclwiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyXCI7XG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7QWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlclwiO1xuaW1wb3J0IHtzZXRBdHRyaWJ1dGVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0QXR0cmlidXRlSGFuZGxlclwiO1xuaW1wb3J0IHtcbiAgICBJbml0UmVxdWVzdCxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9TZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlclwiO1xuaW1wb3J0IHtHZXRFbGVtZW50VmFsdWVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50c1wiO1xuLy8gQHRzLWlnbm9yZSBoYW5kbGVkIGJ5IGN1c3RvbSBlc2J1aWxkIHBsdWdpblxuaW1wb3J0IHZlcnNpb24gZnJvbSBcIm15b3Atc2RrLXZlcnNpb25cIjtcbmltcG9ydCB7R2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2dldEF0dHJpYnV0ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NldElubmVySHRtbEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzXCI7XG5cbi8qKlxuIFRoZSBJZnJhbWUgU0RLIGlzIGludGVuZGVkIGZvciBzY2VuYXJpb3Mgd2hlcmUgZGV2ZWxvcGVycyB3aXNoIHRvIGltcGxlbWVudCBNeW9wIGNvbXBvbmVudHMgYXMgc2VwYXJhdGUgd2ViIGFwcGxpY2F0aW9ucyBob3N0ZWQgd2l0aGluIGlmcmFtZXMuPGJyLz48YnIvPlxuIEJ5IGltcG9ydGluZyB0aGUgSWZyYW1lIFNESywgZGV2ZWxvcGVycyBnYWluIGFjY2VzcyB0byB0b29scyBhbmQgdXRpbGl0aWVzIG5lY2Vzc2FyeSBmb3IgaGFuZGxpbmcgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBob3N0IGFwcGxpY2F0aW9uIGFuZCB0aGUgZW1iZWRkZWQgaWZyYW1lLWJhc2VkIE15b3AgY29tcG9uZW50czxici8+PGJyLz5cbiBUaGlzIFNESyBmYWNpbGl0YXRlcyBzZWN1cmUgaXNvbGF0aW9uLCBhbGxvd2luZyBjb21wb25lbnRzIHRvIGZ1bmN0aW9uIGluZGVwZW5kZW50bHkgd2hpbGUgc3RpbGwgYmVuZWZpdGluZyBmcm9tIHRoZSBvdmVyYWxsIHN0cnVjdHVyZSBhbmQgbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMgcHJvdmlkZWQgYnkgdGhlIGhvc3QgYXBwbGljYXRpb24uPGJyLz48YnIvPlxuXG4gT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuIGBgYGpzXG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gb3JcbiBgYGB0c1xuIGltcG9ydCB7Z2V0SWZyYW1lTW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IGdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIElmcmFtZVNESyBleHRlbmRzIEJhc2VNeW9wU0RLIHtcblxuICAgIHB1YmxpYyB2ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICghd2luZG93Lm15b3ApIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHdpbmRvdy5teW9wID0ge31cbiAgICAgICAgfVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvdy5teW9wLklmcmFtZVNESyA9IHRoaXM7XG4gICAgfVxuXG4gICAgbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGlmICghbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgJiYgcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZClcbiAgICAgICAgICAgIG1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8uaGFuZGxlclVuaXF1ZUlkXG5cbiAgICAgICAgY29uc3QgY29tcG9uZW50SWRzID0gT2JqZWN0LmtleXModGhpcy5jb21wb25lbnRzKTtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UuZGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgIGlmIChyZXBsYXlUbz8ucm91dGUpIHtcbiAgICAgICAgICAgICAgICAvLyB0YWtpbmcgdGhlIGZpcnN0IGNvbXBvbmVudCB0aGF0IGluaXRpYXRlZCB0aGF0IGN5Y2xlXG4gICAgICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHJlcGxheVRvLnJvdXRlW3JlcGxheVRvLnJvdXRlLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gY29tcG9uZW50SWRzWzBdXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLnNvdXJjZSlcbiAgICAgICAgICAgIG1lc3NhZ2Uuc291cmNlID0gY29tcG9uZW50SWRzWzBdO1xuXG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi51cDtcblxuICAgICAgICAvLyBgaG9zdFdpbmRvd2AsIG5vdCBgd2luZG93LnBhcmVudGAgLS0gc2VlIHRoZSBmaWVsZCdzIGNvbW1lbnQuIEZvciBhIGNvbXBvbmVudFxuICAgICAgICAvLyBtb3VudGVkIGludG8gYW5vdGhlciBjb21wb25lbnQncyBkb2N1bWVudCB0aGUgcGFyZW50IGlzIGFuIGludGVybWVkaWF0ZSBmcmFtZVxuICAgICAgICAvLyB0aGF0IGRyb3BzIGNoaWxkIG1lc3NhZ2VzLCBzbyBhbiBJbml0UmVzcG9uc2Ugc2VudCB0aGVyZSBuZXZlciByZWFjaGVzIHRoZSBob3N0XG4gICAgICAgIC8vIGFuZCB0aGUgY29tcG9uZW50IHN0YXlzIHBlbmRpbmcgdW50aWwgaXQgdGltZXMgb3V0LlxuICAgICAgICAodGhpcy5ob3N0V2luZG93ID8/IHdpbmRvdy5wYXJlbnQpPy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAuLi5tZXNzYWdlXG4gICAgICAgIH0sICcqJyk7XG4gICAgfVxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdID0gW1xuICAgICAgICBuZXcgQ2hhbmdlVGV4dEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IFNldElubmVySHRtbEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEJpbmRPbkNsaWNrSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgRXhlY3V0ZVNjcmlwdEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBzZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBTZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBHZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG5cbiAgICAgICAgLy9jb21wb3NpdGUgc3VwcG9ydCBtZXNzYWdlcyA6XG4gICAgICAgIG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpXG4gICAgXTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB3aW5kb3cgdGhpcyBmcmFtZSBhbnN3ZXJzIHRvLiBEZWZhdWx0cyB0byB0aGUgcGFyZW50LCB3aGljaCBpcyBjb3JyZWN0IGZvciBhXG4gICAgICogY29tcG9uZW50IG1vdW50ZWQgZGlyZWN0bHkgYnkgdGhlIHBhZ2UncyBvd24gaG9zdC5cbiAgICAgKlxuICAgICAqIElUIElTIE5PVCBBTFdBWVMgVEhFIFBBUkVOVC4gQSBob3N0IGNhbiBtb3VudCBhIGNvbXBvbmVudCBpbnRvIGEgY29udGFpbmVyIHRoYXRcbiAgICAgKiBsaXZlcyBpbnNpZGUgQU5PVEhFUiBjb21wb25lbnQncyBkb2N1bWVudCAtLSBQaWMtVGltZSdzIHJlZWwgdGVtcGxhdGVzIGFyZSBtb3VudGVkXG4gICAgICogYnkgdGhlIHRvcC1sZXZlbCBob3N0IGludG8gYCNyZWVsU2xvdGAgaW5zaWRlIHRoZSByZWVsIGRpYWxvZydzIGZyYW1lLiBUaGUgcmVhbCBob3N0XG4gICAgICogaXMgdGhlbiBhIEdSQU5EcGFyZW50LCBhbmQgYHdpbmRvdy5wYXJlbnRgIGlzIGEgZnJhbWUgdGhhdCBrbm93cyBub3RoaW5nIGFib3V0IHRoaXNcbiAgICAgKiBjb21wb25lbnQ6IGl0cyBuZXN0ZWQgaG9zdFNESyBoYXMgbm8gZW50cnkgZm9yIGl0IGFuZCBpdHMgSWZyYW1lU0RLIGRyb3BzIG1lc3NhZ2VzXG4gICAgICogZnJvbSBhIGNoaWxkLiBSZXBsaWVzIHNlbnQgdG8gdGhlIHBhcmVudCBhcmUgc2ltcGx5IGxvc3QuXG4gICAgICpcbiAgICAgKiBTbyB3ZSBhZG9wdCB3aG9ldmVyIGFjdHVhbGx5IHRhbGtzIHRvIHVzLCB0aGUgZmlyc3QgdGltZSBhbiBhbmNlc3RvciBkb2VzLlxuICAgICAqL1xuICAgIHByaXZhdGUgaG9zdFdpbmRvdzogV2luZG93IHwgbnVsbCA9IHdpbmRvdy5wYXJlbnQ7XG5cbiAgICAvKipcbiAgICAgKiBDb21tYW5kcyAoaW5jbHVkaW5nIEV4ZWN1dGVTY3JpcHQpIG11c3QgY29tZSBmcm9tIGEgd2luZG93IHRoaXMgZnJhbWUgaXMgYWN0dWFsbHlcbiAgICAgKiBuZXN0ZWQgaW5zaWRlIC0tIG5ldmVyIGZyb20gYW4gb3BlbmVyIG9yIGEgc2libGluZyB0aGF0IG1lcmVseSBob2xkcyBhIHJlZmVyZW5jZS5cbiAgICAgKlxuICAgICAqIFRISVMgVVNFRCBUTyBDT01QQVJFIEFHQUlOU1QgYHdpbmRvdy5wYXJlbnRgIEFMT05FLCBhbmQgdGhhdCB3YXMgYSByZWdyZXNzaW9uIElcbiAgICAgKiBzaGlwcGVkIGluIDAuNC4wLWJldGE6IGl0IHNpbGVudGx5IGRyb3BwZWQgdGhlIGhvc3QncyBJbml0TWVzc2FnZSBmb3IgYW55IGNvbXBvbmVudFxuICAgICAqIG1vdW50ZWQgY3Jvc3MtZG9jdW1lbnQsIGJlY2F1c2UgdGhlIGhvc3QgaXMgYSBncmFuZHBhcmVudCB0aGVyZS4gVGhlIGZyYW1lIHRoZW5cbiAgICAgKiBhbm5vdW5jZWQgZm9yIGl0cyBmdWxsIDEwcyBidWRnZXQgaW50byBhIHBhcmVudCB0aGF0IG5ldmVyIGFuc3dlcnMgYW5kIHJlamVjdGVkIHdpdGhcbiAgICAgKiB0aW1lb3V0XzEwMDAwIGhhdmluZyByZWdpc3RlcmVkIG5vdGhpbmcuIFJlcHJvZHVjZWQgbGl2ZSBvbiBQaWMtVGltZSdzIFFBIHBhZ2VcbiAgICAgKiAyMDI2LTEwLTE3OiAxNSBJbml0UmVxdWVzdHMsIDAgSW5pdFJlc3BvbnNlcywgYElmcmFtZVNESy5jb21wb25lbnRzYCBlbXB0eS5cbiAgICAgKiAwLjMuMzYgaGFkIG5vIGd1YXJkIGF0IGFsbCwgd2hpY2ggaXMgd2h5IGl0IHdvcmtlZC5cbiAgICAgKlxuICAgICAqIFdhbGtpbmcgdGhlIGFuY2VzdG9yIGNoYWluIGtlZXBzIHRoZSBzZWN1cml0eSBwcm9wZXJ0eSAtLSBhbiBvcGVuZXIgb3IgYSBzaWJsaW5nIGlzXG4gICAgICogbm90IGFuIGFuY2VzdG9yIC0tIHdoaWxlIGFsbG93aW5nIGEgaG9zdCBhbnkgbnVtYmVyIG9mIGZyYW1lcyB1cC4gVGhlIHdhbGsgaXNcbiAgICAgKiBib3VuZGVkLCBhbmQgcmVhZGluZyBgLnBhcmVudGAgYWNyb3NzIG9yaWdpbnMgaXMgYWxsb3dlZCAob25seSB0aGUgcmVmZXJlbmNlIGlzXG4gICAgICogY29tcGFyZWQsIG5ldmVyIHRvdWNoZWQpLlxuICAgICAqL1xuICAgIHByaXZhdGUgaXNGcm9tSG9zdENoYWluID0gKHNvdXJjZTogTWVzc2FnZUV2ZW50U291cmNlIHwgbnVsbCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBpZiAoIXNvdXJjZSkgcmV0dXJuIHRydWU7ICAgICAgICAgICAgIC8vIHN5bnRoZXRpYyBkaXNwYXRjaCBjYXJyaWVzIG5vIHNvdXJjZVxuICAgICAgICBpZiAoc291cmNlID09PSB3aW5kb3cpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIGxldCBjdXJyZW50OiBXaW5kb3cgPSB3aW5kb3c7XG4gICAgICAgIGZvciAobGV0IGRlcHRoID0gMDsgZGVwdGggPCAzMjsgZGVwdGgrKykge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgICAgICAgICBpZiAoIXBhcmVudCB8fCBwYXJlbnQgPT09IGN1cnJlbnQpIHJldHVybiBmYWxzZTsgICAvLyByZWFjaGVkIHRoZSB0b3BcbiAgICAgICAgICAgIGlmIChzb3VyY2UgPT09IHBhcmVudCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBjdXJyZW50ID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdCA9ICgpID0+IHtcbiAgICAgICAgd2luZG93Lm9ubWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNGcm9tSG9zdENoYWluKGV2ZW50LnNvdXJjZSkpIHJldHVybjtcblxuICAgICAgICAgICAgLy8gQURPUFQgT05MWSBPTiBJbml0TWVzc2FnZSwgTk9UIE9OIEFOWSBBTkNFU1RPUiBNRVNTQUdFLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIEluaXRNZXNzYWdlIGlzIHRoZSBvbmUgbWVzc2FnZSB0aGF0IGVzdGFibGlzaGVzIHdobyBvd25zIHRoaXMgY29tcG9uZW50LCBzb1xuICAgICAgICAgICAgLy8gaXQgaXMgdGhlIG9ubHkgc2FmZSBzaWduYWwuIEFkb3B0aW5nIG9uIGFueSBhY2NlcHRlZCBtZXNzYWdlIGxldCBhblxuICAgICAgICAgICAgLy8gaW50ZXJtZWRpYXRlIGFuY2VzdG9yIC0tIHRoZSByZWVsIGRpYWxvZywgd2hpY2ggaXMgaXRzZWxmIGEgY29tcG9uZW50IGFuZFxuICAgICAgICAgICAgLy8gbWF5IGxlZ2l0aW1hdGVseSBwb3N0IHRvIGl0cyBvd24gc3VidHJlZSAtLSBiZWNvbWUgYGhvc3RXaW5kb3dgIGFuZCBzaWxlbnRseVxuICAgICAgICAgICAgLy8gdGFrZSBvdmVyIHRoZSByZXBseSBjaGFubmVsLCBwdXR0aW5nIHVzIGJhY2sgdG8gSW5pdFJlc3BvbnNlcyBnb2luZyB0byBhXG4gICAgICAgICAgICAvLyBmcmFtZSB0aGF0IGRyb3BzIHRoZW0uXG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlXG4gICAgICAgICAgICAgICAgJiYgZXZlbnQuc291cmNlICE9PSB3aW5kb3dcbiAgICAgICAgICAgICAgICAmJiBldmVudC5kYXRhPy5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0V2luZG93ID0gZXZlbnQuc291cmNlIGFzIFdpbmRvdztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlcyhldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBJbml0UmVxdWVzdCgpKTtcbiAgICB9XG5cbn1cblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnSWZyYW1lU0RLJywgSWZyYW1lU0RLKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQk8sSUFBTSxpQkFBTixNQUE0QztBQUFBLEVBQy9DLFlBQW1CLFFBQ0EsYUFDQSxjQUNBLFdB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QUEsd0JBQVEsY0FBNEIsT0FBTztBQW1CM0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHdCQUFRLG1CQUFrQixDQUFDLFdBQStDO0FBQ3RFLFVBQUksQ0FBQyxPQUFRLFFBQU87QUFDcEIsVUFBSSxXQUFXLE9BQVEsUUFBTztBQUU5QixVQUFJLFVBQWtCO0FBQ3RCLGVBQVMsUUFBUSxHQUFHLFFBQVEsSUFBSSxTQUFTO0FBQ3JDLGNBQU0sU0FBUyxRQUFRO0FBQ3ZCLFlBQUksQ0FBQyxVQUFVLFdBQVcsUUFBUyxRQUFPO0FBQzFDLFlBQUksV0FBVyxPQUFRLFFBQU87QUFDOUIsa0JBQVU7QUFBQSxNQUNkO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFFQSx3QkFBTyxRQUFPLE1BQU07QUFDaEIsYUFBTyxZQUFZLENBQUMsVUFBd0I7QUF4S3BEO0FBeUtZLFlBQUksQ0FBQyxLQUFLLGdCQUFnQixNQUFNLE1BQU0sRUFBRztBQVV6QyxZQUFJLE1BQU0sVUFDSCxNQUFNLFdBQVcsWUFDakIsV0FBTSxTQUFOLG1CQUFZLGlCQUFnQixhQUFhLGFBQWE7QUFDekQsZUFBSyxhQUFhLE1BQU07QUFBQSxRQUM1QjtBQUVBLGFBQUsscUJBQXFCLEtBQUs7QUFBQSxNQUNuQztBQUNBLFdBQUssY0FBYyxJQUFJLFlBQVksQ0FBQztBQUFBLElBQ3hDO0FBeEhJLFFBQUksQ0FBQyxPQUFPLE1BQU07QUFFZCxhQUFPLE9BQU8sQ0FBQztBQUFBLElBQ25CO0FBRUEsV0FBTyxLQUFLLFlBQVk7QUFBQSxFQUM1QjtBQW9ISjtBQUVBLG9CQUFvQixhQUFhLFNBQVM7IiwKICAibmFtZXMiOiBbIlJlcGxheU1lc3NhZ2VLZXkiLCAibWF0Y2giLCAic2NyaXB0SW5wdXRzIiwgInNjcmlwdElucHV0cyIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJzZWVuIiwgInRhcmdldCIsICJtYWtlU2VyaWFsaXphYmxlIiwgImhlaWdodCIsICJ3aWR0aCIsICJlIiwgIkJpbmRPbkNsaWNrSGFuZGxlciIsICJDaGFuZ2VUZXh0SGFuZGxlciIsICJEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIiwgInNldEF0dHJpYnV0ZUhhbmRsZXIiLCAiQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIiLCAiaG9zdFNESyIsICJFeGVjdXRlU2NyaXB0SGFuZGxlciIsICJlbGVtZW50IiwgIkNoYW5nZVRleHRIYW5kbGVyIiwgIkJpbmRPbkNsaWNrSGFuZGxlciIsICJEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIiwgInNldEF0dHJpYnV0ZUhhbmRsZXIiLCAiQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIiLCAiRXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAic2VlbiIsICJzZGsiLCAiZG9tSWQiLCAic2RrIiwgInNlZW4iLCAic2tpbiIsICJjb21wb25lbnQiLCAiX2EiLCAic2VnbWVudCIsICJleHBlcmllbmNlIiwgInNlbGVjdGVkU2tpbiIsICJDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciIsICJob3N0U0RLIiwgIk11dGF0aW9uT2JzZXJ2ZXIiLCAiZ2V0SW5wdXRWYWx1ZSIsICJlbGVtZW50IiwgIkdldEVsZW1lbnRWYWx1ZUhhbmRsZXIiLCAiU2V0SW5uZXJIdG1sSGFuZGxlciIsICJTZXRJbm5lckh0bWxIYW5kbGVyIiwgIkdldEVsZW1lbnRWYWx1ZUhhbmRsZXIiLCAiQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiXQp9Cg==