@myop/sdk 0.3.19 → 0.3.21

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 (33) hide show
  1. package/dist/bundled-declarations.d.ts +8 -0
  2. package/dist/cjs/_IframeSDK.1493b283.min.js +1 -0
  3. package/dist/cjs/{_IframeSDK.b158be2e.js → _IframeSDK.4f5885de.js} +92 -70
  4. package/dist/cjs/_IframeSDK.4f5885de.js.map +7 -0
  5. package/dist/cjs/_WebComponentSDK.0c7d1e66.min.js +1 -0
  6. package/dist/cjs/{_WebComponentSDK.fedea102.js → _WebComponentSDK.2303271b.js} +92 -70
  7. package/dist/cjs/{_WebComponentSDK.fedea102.js.map → _WebComponentSDK.2303271b.js.map} +3 -3
  8. package/dist/cjs/{_hostSDK.898f6183.js → _hostSDK.8b2cafd5.js} +92 -70
  9. package/dist/cjs/_hostSDK.8b2cafd5.js.map +7 -0
  10. package/dist/cjs/_hostSDK.efb2b2e6.min.js +1 -0
  11. package/dist/cjs/myop_sdk.js +16 -16
  12. package/dist/cjs/myop_sdk.js.map +1 -1
  13. package/dist/cjs/myop_sdk.min.js +1 -1
  14. package/dist/cjs-bundled/myop_sdk.bundled.js +93 -71
  15. package/dist/cjs-bundled/myop_sdk.bundled.js.map +2 -2
  16. package/dist/cjs-bundled/myop_sdk.bundled.min.js +1 -1
  17. package/dist/module/Iframe/index.js +93 -71
  18. package/dist/module/Iframe/index.js.map +3 -3
  19. package/dist/module/SDK.js +93 -71
  20. package/dist/module/SDK.js.map +2 -2
  21. package/dist/module/embeddedSDK.js +1 -1
  22. package/dist/module/host/components/myopIframeComponent.d.ts +8 -0
  23. package/dist/module/host/embeddedSDK.js +1 -1
  24. package/dist/module/host/index.js +93 -71
  25. package/dist/module/host/index.js.map +3 -3
  26. package/dist/module/webcomponent/index.js +93 -71
  27. package/dist/module/webcomponent/index.js.map +3 -3
  28. package/package.json +1 -1
  29. package/dist/cjs/_IframeSDK.736cc080.min.js +0 -1
  30. package/dist/cjs/_IframeSDK.b158be2e.js.map +0 -7
  31. package/dist/cjs/_WebComponentSDK.d0ae9e45.min.js +0 -1
  32. package/dist/cjs/_hostSDK.1f707218.min.js +0 -1
  33. package/dist/cjs/_hostSDK.898f6183.js.map +0 -7
@@ -60,7 +60,7 @@ var MyopSDK = (() => {
60
60
  var myop_sdk_version_default;
61
61
  var init_myop_sdk_version = __esm({
62
62
  "version:myop-sdk-version"() {
63
- myop_sdk_version_default = "0.3.19";
63
+ myop_sdk_version_default = "0.3.21";
64
64
  }
65
65
  });
66
66
 
@@ -1739,6 +1739,9 @@ var MyopSDK = (() => {
1739
1739
  this.componentConfig = componentConfig;
1740
1740
  this.container = container;
1741
1741
  this.IframeElement = IframeElement;
1742
+ __publicField(this, "_autoSizeCleanup");
1743
+ __publicField(this, "_autoSizeOptions");
1744
+ __publicField(this, "_autoSizeUpdate");
1742
1745
  __publicField(this, "sizeMeta");
1743
1746
  __publicField(this, "cleanupInspect");
1744
1747
  __publicField(this, "setHeightBasedOnDocumentElement", () => {
@@ -1768,11 +1771,20 @@ var MyopSDK = (() => {
1768
1771
  /**
1769
1772
  * Observes the iframe content size and automatically syncs it to the iframe element.
1770
1773
  * Uses direct contentDocument access (same-origin only) for accurate measurements.
1774
+ *
1775
+ * Reentrant: when called again while observers already exist, updates options and
1776
+ * re-evaluates sizing without recreating observers. Cleanup + re-call (e.g. React
1777
+ * re-render) creates fresh observers since cleanup clears the existing ones.
1778
+ *
1771
1779
  * @param options - Configuration options including size change callback and min/max constraints
1772
1780
  * @returns Cleanup function to stop observing
1773
1781
  */
1774
1782
  __publicField(this, "observeAutoSize", (options) => {
1775
- var _a2, _b, _c, _d, _e, _f, _g;
1783
+ this._autoSizeOptions = options;
1784
+ if (this._autoSizeCleanup && this._autoSizeUpdate) {
1785
+ this._autoSizeUpdate();
1786
+ return this._autoSizeCleanup;
1787
+ }
1776
1788
  const iframe = this.IframeElement;
1777
1789
  const doc = iframe.contentDocument;
1778
1790
  if (!doc) {
@@ -1791,78 +1803,88 @@ var MyopSDK = (() => {
1791
1803
  const parsed = parseFloat(value);
1792
1804
  return isNaN(parsed) ? void 0 : parsed;
1793
1805
  };
1794
- const minWidth = parseSize(options == null ? void 0 : options.minWidth);
1795
- const maxWidth = parseSize(options == null ? void 0 : options.maxWidth);
1796
- const minHeight = parseSize(options == null ? void 0 : options.minHeight);
1797
- const maxHeight = parseSize(options == null ? void 0 : options.maxHeight);
1798
- const loaderMinHeight = (_a2 = options == null ? void 0 : options.loaderMinHeight) != null ? _a2 : 50;
1799
- const sizeMetaFillWidth = ((_b = this.sizeMeta) == null ? void 0 : _b.width) === "100%" ? "100%" : void 0;
1800
- const sizeMetaFillHeight = ((_c = this.sizeMeta) == null ? void 0 : _c.height) === "100%" ? "100%" : void 0;
1801
- const resolvedExplicitWidth = (_e = (_d = options == null ? void 0 : options.explicitWidth) != null ? _d : sizeMetaFillWidth) != null ? _e : "100%";
1802
- const resolvedExplicitHeight = (_f = options == null ? void 0 : options.explicitHeight) != null ? _f : sizeMetaFillHeight;
1803
- const hasExplicitWidth = resolvedExplicitWidth !== void 0;
1804
- const hasExplicitHeight = resolvedExplicitHeight !== void 0;
1805
- const containerRect = this.container.getBoundingClientRect();
1806
- const collapsedWidth = containerRect.width === 0;
1807
- const collapsedHeight = containerRect.height === 0 || containerRect.height === loaderMinHeight;
1808
- const shouldAutoWidth = (options == null ? void 0 : options.forceAutoSize) ? !hasExplicitWidth : collapsedWidth && !hasExplicitWidth;
1809
- const shouldAutoHeight = (options == null ? void 0 : options.forceAutoSize) ? !hasExplicitHeight : collapsedHeight && !hasExplicitHeight;
1810
- if (!shouldAutoWidth && !shouldAutoHeight) {
1811
- const explicitWidthPx = typeof resolvedExplicitWidth === "number" ? resolvedExplicitWidth : void 0;
1812
- const explicitHeightPx = typeof resolvedExplicitHeight === "number" ? resolvedExplicitHeight : void 0;
1813
- if (explicitWidthPx !== void 0 || explicitHeightPx !== void 0) {
1814
- (_g = options == null ? void 0 : options.onSizeChange) == null ? void 0 : _g.call(options, {
1815
- width: explicitWidthPx,
1816
- height: explicitHeightPx,
1817
- autoSizingWidth: false,
1818
- autoSizingHeight: false
1819
- });
1820
- }
1821
- return () => {
1822
- };
1823
- }
1824
1806
  const updateSize = () => {
1825
- var _a3;
1807
+ var _a2, _b, _c, _d, _e, _f, _g, _h;
1826
1808
  const contentDoc = iframe.contentDocument;
1827
- if (contentDoc) {
1828
- if (shouldAutoHeight) {
1829
- iframe.style.height = "0px";
1830
- }
1831
- if (shouldAutoWidth) {
1832
- iframe.style.width = "0px";
1833
- }
1834
- const contentWidth = Math.ceil(contentDoc.documentElement.scrollWidth);
1835
- const contentHeight = Math.ceil(contentDoc.documentElement.scrollHeight);
1836
- const width = clamp(contentWidth, minWidth, maxWidth);
1837
- const height = clamp(contentHeight, minHeight, maxHeight);
1838
- if (shouldAutoWidth) {
1839
- iframe.style.width = "".concat(width, "px");
1840
- }
1841
- if (shouldAutoHeight) {
1842
- iframe.style.height = "".concat(height, "px");
1809
+ if (!contentDoc) return;
1810
+ const opts = this._autoSizeOptions;
1811
+ const minWidth = parseSize(opts == null ? void 0 : opts.minWidth);
1812
+ const maxWidth = parseSize(opts == null ? void 0 : opts.maxWidth);
1813
+ const minHeight = parseSize(opts == null ? void 0 : opts.minHeight);
1814
+ const maxHeight = parseSize(opts == null ? void 0 : opts.maxHeight);
1815
+ const loaderMinHeight = (_a2 = opts == null ? void 0 : opts.loaderMinHeight) != null ? _a2 : 50;
1816
+ const sizeMetaFillWidth = ((_b = this.sizeMeta) == null ? void 0 : _b.width) === "100%" ? "100%" : void 0;
1817
+ const sizeMetaFillHeight = ((_c = this.sizeMeta) == null ? void 0 : _c.height) === "100%" ? "100%" : void 0;
1818
+ const resolvedExplicitWidth = (_e = (_d = opts == null ? void 0 : opts.explicitWidth) != null ? _d : sizeMetaFillWidth) != null ? _e : "100%";
1819
+ const resolvedExplicitHeight = (_f = opts == null ? void 0 : opts.explicitHeight) != null ? _f : sizeMetaFillHeight;
1820
+ const hasExplicitWidth = resolvedExplicitWidth !== void 0;
1821
+ const hasExplicitHeight = resolvedExplicitHeight !== void 0;
1822
+ const containerRect = this.container.getBoundingClientRect();
1823
+ const collapsedWidth = containerRect.width === 0;
1824
+ const collapsedHeight = containerRect.height === 0 || containerRect.height === loaderMinHeight;
1825
+ const shouldAutoWidth = (opts == null ? void 0 : opts.forceAutoSize) ? !hasExplicitWidth : collapsedWidth && !hasExplicitWidth;
1826
+ const shouldAutoHeight = (opts == null ? void 0 : opts.forceAutoSize) ? !hasExplicitHeight : collapsedHeight && !hasExplicitHeight;
1827
+ if (!shouldAutoWidth && !shouldAutoHeight) {
1828
+ iframe.style.width = typeof resolvedExplicitWidth === "number" ? "".concat(resolvedExplicitWidth, "px") : "100%";
1829
+ iframe.style.height = typeof resolvedExplicitHeight === "number" ? "".concat(resolvedExplicitHeight, "px") : "100%";
1830
+ const explicitWidthPx = typeof resolvedExplicitWidth === "number" ? resolvedExplicitWidth : void 0;
1831
+ const explicitHeightPx = typeof resolvedExplicitHeight === "number" ? resolvedExplicitHeight : void 0;
1832
+ if (explicitWidthPx !== void 0 || explicitHeightPx !== void 0) {
1833
+ (_g = opts == null ? void 0 : opts.onSizeChange) == null ? void 0 : _g.call(opts, {
1834
+ width: explicitWidthPx,
1835
+ height: explicitHeightPx,
1836
+ autoSizingWidth: false,
1837
+ autoSizingHeight: false
1838
+ });
1843
1839
  }
1844
- const isWidthConstrained = shouldAutoWidth && maxWidth !== void 0 && contentWidth > maxWidth;
1845
- const isHeightConstrained = shouldAutoHeight && maxHeight !== void 0 && contentHeight > maxHeight;
1846
- contentDoc.documentElement.style.overflowX = isWidthConstrained ? "auto" : "";
1847
- contentDoc.documentElement.style.overflowY = isHeightConstrained ? "auto" : "";
1848
- (_a3 = options == null ? void 0 : options.onSizeChange) == null ? void 0 : _a3.call(options, {
1849
- width,
1850
- height,
1851
- autoSizingWidth: shouldAutoWidth,
1852
- autoSizingHeight: shouldAutoHeight
1853
- });
1840
+ return;
1841
+ }
1842
+ if (shouldAutoHeight) {
1843
+ iframe.style.height = "0px";
1844
+ }
1845
+ if (shouldAutoWidth) {
1846
+ iframe.style.width = "0px";
1854
1847
  }
1848
+ const contentWidth = Math.ceil(Math.max(contentDoc.documentElement.scrollWidth, contentDoc.body.scrollWidth));
1849
+ const contentHeight = Math.ceil(Math.max(contentDoc.documentElement.scrollHeight, contentDoc.body.scrollHeight));
1850
+ const width = clamp(contentWidth, minWidth, maxWidth);
1851
+ const height = clamp(contentHeight, minHeight, maxHeight);
1852
+ if (shouldAutoWidth) {
1853
+ iframe.style.width = "".concat(width, "px");
1854
+ } else {
1855
+ iframe.style.width = typeof resolvedExplicitWidth === "number" ? "".concat(resolvedExplicitWidth, "px") : "100%";
1856
+ }
1857
+ if (shouldAutoHeight) {
1858
+ iframe.style.height = "".concat(height, "px");
1859
+ } else {
1860
+ iframe.style.height = typeof resolvedExplicitHeight === "number" ? "".concat(resolvedExplicitHeight, "px") : "100%";
1861
+ }
1862
+ const isWidthConstrained = shouldAutoWidth && maxWidth !== void 0 && contentWidth > maxWidth;
1863
+ const isHeightConstrained = shouldAutoHeight && maxHeight !== void 0 && contentHeight > maxHeight;
1864
+ contentDoc.documentElement.style.overflowX = isWidthConstrained ? "auto" : "";
1865
+ contentDoc.documentElement.style.overflowY = isHeightConstrained ? "auto" : "";
1866
+ (_h = opts == null ? void 0 : opts.onSizeChange) == null ? void 0 : _h.call(opts, {
1867
+ width,
1868
+ height,
1869
+ autoSizingWidth: shouldAutoWidth,
1870
+ autoSizingHeight: shouldAutoHeight
1871
+ });
1855
1872
  };
1856
1873
  updateSize();
1874
+ this._autoSizeUpdate = updateSize;
1857
1875
  const resizeObserver = new ResizeObserver(updateSize);
1858
1876
  resizeObserver.observe(doc.body);
1859
1877
  resizeObserver.observe(doc.documentElement);
1860
1878
  const mutationObserver = new MutationObserver(updateSize);
1861
1879
  mutationObserver.observe(doc.body, { childList: true, subtree: true, characterData: true, attributes: true });
1862
- return () => {
1880
+ const cleanup = () => {
1863
1881
  resizeObserver.disconnect();
1864
1882
  mutationObserver.disconnect();
1883
+ this._autoSizeUpdate = void 0;
1884
+ this._autoSizeCleanup = void 0;
1865
1885
  };
1886
+ this._autoSizeCleanup = cleanup;
1887
+ return cleanup;
1866
1888
  });
1867
1889
  __publicField(this, "setSizeBasedOnDocumentElement", () => {
1868
1890
  const cleanupHandler = this.send(new ExecuteScriptMessage(() => {
@@ -1909,16 +1931,15 @@ var MyopSDK = (() => {
1909
1931
  return cleanupHandler;
1910
1932
  });
1911
1933
  __publicField(this, "dispose", () => {
1934
+ if (this._autoSizeCleanup) {
1935
+ this._autoSizeCleanup();
1936
+ this._autoSizeCleanup = void 0;
1937
+ }
1912
1938
  if (this.cleanupInspect)
1913
1939
  this.cleanupInspect();
1914
1940
  super.dispose();
1915
1941
  this.IframeElement.parentNode.removeChild(this.IframeElement);
1916
1942
  });
1917
- if (skin.loader.autoHeight) {
1918
- this.initiated().then(() => {
1919
- this.setHeightBasedOnScrollHeight();
1920
- });
1921
- }
1922
1943
  this.element = this.IframeElement;
1923
1944
  }
1924
1945
  inspect() {
@@ -2807,11 +2828,12 @@ var MyopSDK = (() => {
2807
2828
  doc.close();
2808
2829
  const comp = new MyopIframeComponent(componentDefinition, skin, container, IframeElement, options);
2809
2830
  comp.sizeMeta = parsedSizeMeta;
2810
- if (loaderConfig.autoHeight) {
2811
- IframeElement.onload = () => {
2812
- comp.observeSizeBasedOnDocumentElement();
2813
- };
2814
- }
2831
+ comp.initiated().then(() => {
2832
+ comp.observeAutoSize({ forceAutoSize: true });
2833
+ if (!(options == null ? void 0 : options.hidden)) {
2834
+ comp.show();
2835
+ }
2836
+ });
2815
2837
  return comp;
2816
2838
  }
2817
2839
  if (loaderConfig.shadowRootMode === ShadowRootModeType.none) {
@@ -4514,4 +4536,4 @@ var MyopSDK = (() => {
4514
4536
  }
4515
4537
  return __toCommonJS(SDK_exports);
4516
4538
  })();
4517
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50cyIsICJ2ZXJzaW9uOm15b3Atc2RrLXZlcnNpb24iLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wTWVzc2FnZXMudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvSU15b3BDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvY29tbW9uL0Jhc2VNeW9wU0RLLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vaW5kZXgudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvZ01lc3NhZ2VzLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFJlZkNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50Q29yZS50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2hvc3QvbG9hZGVycy9JTXlvcExvYWRlci50cyIsICIuLi8uLi9zcmMvaG9zdC9sb2FkZXJzL2lmcmFtZUxvYWRlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L2NvbnN0cy50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2hvc3QvbG9hZGVycy93ZWJjb21wb25lbnRMb2FkZXIudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9jb25zdHMudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVycy50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9iaW5kT25DbGlja0hhbmRsZXIudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvY2hhbmdlVGV4dEhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9zaGFkb3dSb290UmVmLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0QXR0cmlidXRlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9XZWJDb21wb25lbnRTREsudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9pbmRleC50cyIsICIuLi8uLi9zcmMvaG9zdC9lbWJlZGRlZFNESy50cyIsICIuLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0hUTUxDb21wb25lbnRMb2FkZXIudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvYXBwbHlTdHlsZXNoZWV0LnRzIiwgIi4uLy4uL3NyYy9oZWxwZXJzL2lmcmFtZVNraW5VcmxUb2tlbml6ZXIudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvY2xhc3NMaXN0LnRzIiwgIi4uLy4uL3NyYy9oZWxwZXJzL2NvbmZpZ0J1aWxkZXIudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvQ2xvdWRSZXBvc2l0b3J5LnRzIiwgIi4uLy4uL3NyYy9oZWxwZXJzL2V4ZWMudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvY2xvdWRSZXBvc2l0b3J5SGVscGVycy50cyIsICIuLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyIsICIuLi8uLi9zcmMvaG9zdC9teW9wT3ZlcnJpZGUudHMiLCAiLi4vLi4vc3JjL2hvc3QvaG9zdFNESy50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vdXRpbHMvZG9tT2JzZXJ2ZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9nZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL1NldFJlc2l6ZU9ic2VydmVySGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvSWZyYW1lU0RLLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9NeW9wTWVzc2FnZXMudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvTXlvcEhlbHBlcnMudHMiLCAiLi4vLi4vc3JjL1NESy50cyIsICIuLi8uLi9zcmMvZHluYW1pY0ltcG9ydC9sb2FkX19mZWRlcmF0aW9uX18udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCBjb25zdCBfX2ZlZGVyYXRpb25fXyA9IFwiX19mZWRlcmF0aW9uX19cIlxuZXhwb3J0IGNvbnN0IG9uTG9hZEtleSA9IFwib25Mb2FkXCJcbmV4cG9ydCBjb25zdCBtb2R1bGVJbnN0YW5jZUtleSA9IFwibW9kdWxlSW5zdGFuY2VcIlxuXG5leHBvcnQgY29uc3QgZGVmaW5lRHluYW1pY0ltcG9ydCA9IChnbG9iYWxOYW1lOiBzdHJpbmcsIG1vZHVsZTogYW55KSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh3aW5kb3dbX19mZWRlcmF0aW9uX19dICYmIHdpbmRvd1tfX2ZlZGVyYXRpb25fX11bZ2xvYmFsTmFtZV0gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKHtbZ2xvYmFsTmFtZV06IG1vZHVsZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnX19mZWRlcmF0aW9uX18gbG9hZGVyIG5vdCBkZWZpbmVkIGZvciBtb2R1bGUnLCBtb2R1bGUpO1xuICAgIH1cbn0iLCAiZXhwb3J0IGRlZmF1bHQgJzAuMy4xOSc7IiwgInR5cGUgU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxUPiA9IFQgfCAoc3RyaW5nICYgUmVjb3JkPG5ldmVyLCBuZXZlcj4pO1xuXG5leHBvcnQgdHlwZSBNeW9wTWVzc2FnZUtleSA9IFN0cmluZ1dpdGhBdXRvY29tcGxldGU8a2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcyB8IGtleW9mIHR5cGVvZiBNeW9wTWVzc2FnZXMuSW4+O1xuXG5leHBvcnQgY29uc3QgTXlvcE1lc3NhZ2VzID0ge1xuICAgIC8vaG9zdCB0byBjb21wb25lbnRcbiAgICAnSW5pdFJlcXVlc3QnOiAnSW5pdFJlcXVlc3QnLFxuICAgICdJbml0UmVzcG9uc2UnOiAnSW5pdFJlc3BvbnNlJyxcbiAgICAnSW5pdE1lc3NhZ2UnOiAnSW5pdE1lc3NhZ2UnLFxuICAgICdEaXNwb3NlTWVzc2FnZSc6ICdEaXNwb3NlTWVzc2FnZScsXG5cbiAgICAnQ2hhbmdlVGV4dE1lc3NhZ2UnOiAnQ2hhbmdlVGV4dE1lc3NhZ2UnLFxuICAgICdCaW5kQ2xpY2tNZXNzYWdlJzogJ0JpbmRDbGlja01lc3NhZ2UnLFxuICAgICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJyxcblxuICAgICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc6ICdFeGVjdXRlU2NyaXB0TWVzc2FnZScsXG5cbiAgICAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnOiAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnLFxuICAgICdTZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnOiAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZScsXG4gICAgJ0VudmVsb3BlZE1lc3NhZ2UnOiAnRW52ZWxvcGVkTWVzc2FnZScsXG5cbiAgICAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc6ICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJyxcbiAgICAnR2V0QXR0cmlidXRlTWVzc2FnZSc6ICdHZXRBdHRyaWJ1dGVNZXNzYWdlJyxcblxuICAgICdTZXRJbm5lckh0bWwnOiAnU2V0SW5uZXJIdG1sJyxcblxuICAgIC8vY29tcG9uZW50IG1lc3NhZ2VzXG4gICAgJ0V4ZWN1dGVDb21wb25lbnRNZXRob2QnOiAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCcsXG4gICAgJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJzogJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJyxcbiAgICAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzogJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZScsXG5cbiAgICAnQ2xlYW51cE1lc3NhZ2UnOiAnQ2xlYW51cE1lc3NhZ2UnLFxuXG4gICAgLy8gZXh0ZXJuYWwgdG8gaG9zdCA6XG4gICAgSW46IHtcbiAgICAgICAgJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJzogJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJyxcbiAgICAgICAgJ0NsaWNrUmVwbGF5TWVzc2FnZSc6ICdDbGlja1JlcGxheU1lc3NhZ2UnLFxuICAgICAgICAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSc6ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJyxcblxuICAgICAgICAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSc6ICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJyxcbiAgICAgICAgJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnOiAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZScsXG5cbiAgICAgICAgXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCI6IFwiR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZVwiLFxuICAgICAgICAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnOiAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnLFxuICAgICAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICAgICAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICAgICAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnOiAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnLFxuICAgICAgICAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzogJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSdcbiAgICB9XG59XG4iLCAiLy9UT0RPIDogcmV1c2UgZnJvbSBvbmUgcGxhY2UuXG4vLyBuZWVkcyB0byBiZSB1c2VkIGluIG15b3Atc2RrLCBteW9wLWRhc2hiYW9yZCwgbXlvcC1zZXJ2ZXIsIG15b3AtY2xpIC4uXG5cbmV4cG9ydCBjb25zdCB1dWlkdjQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIFwiMTAwMDAwMDAtMTAwMC00MDAwLTgwMDAtMTAwMDAwMDAwMDAwXCIucmVwbGFjZSgvWzAxOF0vZywgYyA9PlxuICAgICAgICAoK2MgXiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEpKVswXSAmIDE1ID4+ICtjIC8gNCkudG9TdHJpbmcoMTYpXG4gICAgKTtcbn1cblxuLy8gQ29udmVydCBVVUlEIHN0cmluZyB0byBieXRlc1xuZXhwb3J0IGNvbnN0IHV1aWRUb0J5dGVzID0gKHV1aWQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oXG4gICAgICAgIHV1aWQucmVwbGFjZSgvLS9nLCAnJykubWF0Y2goLy57MSwyfS9nKSEubWFwKGJ5dGUgPT4gcGFyc2VJbnQoYnl0ZSwgMTYpKVxuICAgICk7XG59O1xuXG4vLyBDb252ZXJ0IGJ5dGVzIHRvIFVVSUQgc3RyaW5nXG5leHBvcnQgY29uc3QgYnl0ZXNUb1V1aWQgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGhleCA9IFsuLi5ieXRlc10ubWFwKGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgaGV4LnNsaWNlKDAsIDgpLFxuICAgICAgICBoZXguc2xpY2UoOCwgMTIpLFxuICAgICAgICBoZXguc2xpY2UoMTIsIDE2KSxcbiAgICAgICAgaGV4LnNsaWNlKDE2LCAyMCksXG4gICAgICAgIGhleC5zbGljZSgyMClcbiAgICBdLmpvaW4oJy0nKTtcbn07XG5cbi8vIEJhc2U2NCBVUkwtc2FmZSBlbmNvZGVcbmV4cG9ydCBjb25zdCBiYXNlNjRVcmxFbmNvZGUgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGJhc2U2NCA9IGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5ieXRlcykpO1xuICAgIHJldHVybiBiYXNlNjQucmVwbGFjZSgvXFwrL2csICctJykucmVwbGFjZSgvXFwvL2csICdfJykucmVwbGFjZSgvPSskLywgJycpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGRlY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybERlY29kZSA9IChzdHI6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIGxldCBiYXNlNjQgPSBzdHIucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICB3aGlsZSAoYmFzZTY0Lmxlbmd0aCAlIDQpIGJhc2U2NCArPSAnPSc7XG4gICAgY29uc3QgYmluYXJ5ID0gYXRvYihiYXNlNjQpO1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oYmluYXJ5LCBjaGFyID0+IGNoYXIuY2hhckNvZGVBdCgwKSk7XG59O1xuXG4vLyBDb21wcmVzcyBhbiBhcnJheSBvZiBVVUlEcyBpbnRvIGEgc2hvcnQgVVJMLXNhZmUgc3RyaW5nXG5leHBvcnQgY29uc3QgY29tcHJlc3NVVUlEcyA9ICh1dWlkczogc3RyaW5nW10pOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGFsbEJ5dGVzID0gdXVpZHMuZmxhdE1hcCh1dWlkID0+IEFycmF5LmZyb20odXVpZFRvQnl0ZXModXVpZCkpKTtcbiAgICByZXR1cm4gYmFzZTY0VXJsRW5jb2RlKG5ldyBVaW50OEFycmF5KGFsbEJ5dGVzKSk7XG59O1xuXG4vLyBEZWNvbXByZXNzIGZyb20gVVJMLXNhZmUgc3RyaW5nIGJhY2sgdG8gYW4gYXJyYXkgb2YgVVVJRHNcbmV4cG9ydCBjb25zdCBkZWNvbXByZXNzVVVJRHMgPSAoZW5jb2RlZDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gYmFzZTY0VXJsRGVjb2RlKGVuY29kZWQpO1xuICAgIGlmIChieXRlcy5sZW5ndGggJSAxNiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IGxlbmd0aCcpO1xuXG4gICAgY29uc3QgdXVpZHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICAgICAgdXVpZHMucHVzaChieXRlc1RvVXVpZChieXRlcy5zbGljZShpLCBpICsgMTYpKSk7XG4gICAgfVxuICAgIHJldHVybiB1dWlkcztcbn07XG4iLCAiZXhwb3J0ICogZnJvbSAnLi91dWlkLnRzJ1xuXG5leHBvcnQgY29uc3Qgd2FpdCA9IChtczogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcbmltcG9ydCB7SVJlZkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgTWVzc2FnZURpcmVjdGlvbiB7XG4gICAgc3RhdGljIGRvd24gPSAnZG93bicgYXMgY29uc3RcbiAgICBzdGF0aWMgdXAgPSAndXAnIGFzIGNvbnN0XG59XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VEaXJlY3Rpb25PcHRpb24gPSAndXAnIHwgJ2Rvd24nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BNZXNzYWdlPFQgPSBhbnk+IHtcbiAgICBpZCA9IHV1aWR2NCgpXG5cbiAgICBzdGF0aWMgY3JlYXRlPFQsIFUgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxVPikgPT4gVCA9IHR5cGVvZiB0aGlzPihcbiAgICAgICAgdGhpczogVSxcbiAgICAgICAgLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+XG4gICAgKTogSW5zdGFuY2VUeXBlPHR5cGVvZiB0aGlzPiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzKC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdtZWVzYWdlIGlkIGNyZWF0ZWQnLCB0aGlzLmlkLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtcbiAgICB9XG5cbiAgICBteW9wID0gdHJ1ZVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5IHwgc3RyaW5nO1xuXG4gICAgY29udGVudD86IFRcblxuICAgIC8vIFRPRE8gOiBjYW50IGJlIG9wdGlvbmFsIFxuICAgIHNvdXJjZT86IHN0cmluZ1xuICAgIGRlc3RpbmF0aW9uPzogc3RyaW5nXG5cbiAgICByb3V0ZT86IHN0cmluZ1tdXG5cbiAgICByZWY/OiBSZWZcblxuICAgIGRpcmVjdGlvbj86IE1lc3NhZ2VEaXJlY3Rpb25PcHRpb25cblxuICAgIGNsZWFuYWJsZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEVsZW1lbnRNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcj86IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kTWVzc2FnZTxUID0gYW55LCBSIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleTtcblxuICAgIHB1YmxpYyBoYW5kbGVyVW5pcXVlSWQgPSB1dWlkdjQoKVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGhhbmRsZXI6IChtZXNzYWdlOiBSKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWYge1xuICAgIHB1YmxpYyBteW9wID0gdHJ1ZTtcblxuICAgIHB1YmxpYyBfX25vblByb3hpZWQ/OiBSZWY7XG5cbiAgICBzdGF0aWMgY3JlYXRlKHNlbGVjdG9yOiBzdHJpbmcsIHJlZkNvbmZpZz86IElSZWZDb25maWcsIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIGxldCBfcmVmQ29uZmlnID0gcmVmQ29uZmlnO1xuICAgICAgICBpZiAoIV9yZWZDb25maWcpIHtcbiAgICAgICAgICAgIF9yZWZDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgICAgICBzZWxlY3RvclR5cGU6ICdpZC1hdHRyaWJ1dGUnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29kZSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGFzIElSZWZDb25maWdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlZihfcmVmQ29uZmlnLCBjb21wb25lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZDb25maWc6IElSZWZDb25maWcsIHB1YmxpYyBjb21wb25lbnQ/OiBJTXlvcENvbXBvbmVudCkge1xuICAgICAgICB0aGlzLl9fbm9uUHJveGllZCA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMsXG4gICAgICAgICAgICBjb21wb25lbnQ6IG51bGwgLy8gaW4gb3JkZXIgdG8gYmUgc2VyaWFsaXphYmxlXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdDbGlja1JlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBCaW5kQ2xpY2tNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIENsaWNrUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnQmluZENsaWNrTWVzc2FnZSc7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaGFuZGxlcjogKG1lc3NhZ2U6IENsaWNrUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGlja1JlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIENoYW5nZVRleHRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHN0cmluZz4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnQ2hhbmdlVGV4dE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gdGV4dFxuICAgIH1cbn0iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSdcblxuY29uc3QgZnVuY3Rpb25Cb2R5UmVnZXggPSAvKD86ZnVuY3Rpb25cXHMqXFx3KlxccypcXChbXildKlxcKVxccypcXHsoW1xcc1xcU10qPylcXH18KFxcKFteKV0qXFwpXFxzKj0+XFxzKlxceyhbXFxzXFxTXSo/KVxcfSkpXFxzKiQvO1xuY29uc3QgZXhwcmVzc2lvbkJvZHlSZWdleCA9IC9cXChcXHMqW14pXStcXHMqXFwpXFxzKj0+XFxzKiguKykvO1xuXG5leHBvcnQgY29uc3Qgc3RyaXBGdW5jdGlvbiA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBsZXQgbWF0Y2ggPSBjb250ZW50Lm1hdGNoKGZ1bmN0aW9uQm9keVJlZ2V4KTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoWzFdIHx8IG1hdGNoWzNdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZXhwcmVzc2lvbkJvZHlSZWdleCk7XG4gICAgICAgIGlmIChtYXRjaClcbiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXS50cmltKCk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBzY3JpcHRJbnB1dHMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhblxufSB8IHt9O1xuXG5leHBvcnQgdHlwZSBzY3JpcHRWYXJzPFQ+ID0ge1xuICAgIHNlbmQ6IChkYXRhOiBUKSA9PiB2b2lkO1xuICAgIC8vIGNvbXBsZXRlU3RyZWFtOiAoKSA9PiB2b2lkO1xuICAgIHJvb3RSZWY6IFJvb3RSZWY7XG4gICAgbWFrZVNlcmlhbGl6YWJsZTogdHlwZW9mIG1ha2VTZXJpYWxpemFibGVcbn1cblxuZXhwb3J0IHR5cGUgZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEk+ID0ge1xuICAgIFtLIGluIGtleW9mIEldOiBJW0tdO1xufSAmIHNjcmlwdFZhcnM8VD5cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHN0cmluZywgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPj4ge1xuXG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG4gICAgbWVzc2FnZVR5cGUgPSAnRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuICAgIHNjcmlwdDogc3RyaW5nID0gJydcblxuICAgIHN0YXRpYyByZXBsaWVyS2V5ID0gJ3NlbmQnO1xuICAgIHN0YXRpYyBjb21wbGV0ZVN0cmVhbUtleSA9ICdjb21wbGV0ZVN0cmVhbSc7XG5cbiAgICBjb25zdHJ1Y3RvcihzY3JpcHQ6ICh2YXJzOiBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4pID0+IFQsIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgIH0sIHB1YmxpYyBzY3JpcHRJbnB1dHM/OiBJKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgICAgICB0aGlzLnNjcmlwdCA9IHNjcmlwdC50b1N0cmluZygpO1xuXG4gICAgICAgIC8vVE9ETzogY2FuIGJlIHJlbW92ZVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzdHJpcEZ1bmN0aW9uKHRoaXMuY29udGVudCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBjb250ZW50OiBUKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7XG4gICAgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsXG4gICAgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSxcbiAgICBleHRlbmRlZFNjcmlwdFZhcnMsXG4gICAgc2NyaXB0SW5wdXRzLCBzdHJpcEZ1bmN0aW9uXG59IGZyb20gXCIuL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzXCI7XG5cbmV4cG9ydCB0eXBlIGN1c3RvbVJlZlNjcmlwdElucHV0cyA9IHtcbiAgICBlbGVtZW50SWQ6IHN0cmluZyxcbiAgICByZWY/OiBIVE1MRWxlbWVudCxcbiAgICBfc2NyaXB0Pzogc3RyaW5nLFxuICAgIF9fc2NyaXB0SW5wdXRzPzogT2JqZWN0XG59O1xuXG5leHBvcnQgY2xhc3MgQ3VzdG9tUmVmTWVzc2FnZTxUID0gYW55LCBJIGV4dGVuZHMgc2NyaXB0SW5wdXRzID0gY3VzdG9tUmVmU2NyaXB0SW5wdXRzPiBleHRlbmRzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IHtcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzPikgPT4gVCxcbiAgICAgICAgICAgICAgICBwdWJsaWMgc2NyaXB0SW5wdXRzOiBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIH0pIHtcblxuICAgICAgICAvL21vY2sgdmFyc1xuICAgICAgICAvLyBsZXQgcm9vdFJlZiwgZWxlbWVudElkLCBfc2NyaXB0LCBfX3NjcmlwdElucHV0cztcbiAgICAgICAgc3VwZXIoKHtyb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmcyA9IChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLnF1ZXJ5U2VsZWN0b3JBbGwoYFskeydteW9wLWlkJ309JyR7ZWxlbWVudElkfSddYCk7XG4gICAgICAgICAgICBpZiAocmVmcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyAgY29uc3QgcmVmID0gcmVmc1swXTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IGV4cG9zaW5nIFwicmVmc1wiIGFuZCBub3Qgb25seSBcInJlZlwiXG4gICAgICAgICAgICAgICAgLy9mb3IgY2FzZXMgd2hlcmUgdGhlIFJlZiBoYXMgbXVsdGlwbGF0ZSBpbXBsZW1lbnRhdGlvbnNcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBfX3NjcmlwdElucHV0cy5yZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gKCR7X3NjcmlwdH0pKC4uLmFyZ3VtZW50cylgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHluYW1pY0Z1bmN0aW9uKF9fc2NyaXB0SW5wdXRzKTtcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAvL3JldHVybiBGdW5jdGlvbigncmVmJywgJ3Jvb3RSZWYnLCAuLi5PYmplY3Qua2V5cyhfX3NjcmlwdElucHV0cyksIF9zY3JpcHQhKShyZWYsIHJvb3RSZWYsIC4uLk9iamVjdC52YWx1ZXMoX19zY3JpcHRJbnB1dHMpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGwgYXMgVDtcbiAgICAgICAgfSwgaGFuZGxlcik7XG5cbiAgICAgICAgdGhpcy5zY3JpcHRJbnB1dHMgPSB7XG4gICAgICAgICAgICAuLi5zY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAvL19zY3JpcHQ6IHN0cmlwRnVuY3Rpb24oc2NyaXB0LnRvU3RyaW5nKCkpLFxuICAgICAgICAgICAgX3NjcmlwdDogc2NyaXB0LnRvU3RyaW5nKClcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2VyaWFsaXphYmxlLCBTZXJpYWxpemFibGVTa2VsZXRvbn0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPFQgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwID0ga2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcD4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2Uge1xuXG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG4gICAgbWVzc2FnZVR5cGUgPSAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuICAgIGNsZWFuYWJsZSA9IHRydWU7XG4gICAgc2VyaWFsaXphYmxlU2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPEhUTUxFbGVtZW50RXZlbnRNYXBbVF0+ID0gZmFsc2UgLy8ge30gLy8gZW1wdHlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIHR5cGU6IFQsIHB1YmxpYyBoYW5kbGVyOiAobWVzc2FnZTogRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKVxuICAgIH1cblxuICAgIHdpdGhTZXJpYWxpemFibGVTa2VsZXRvbihzZXJpYWxpemFibGVTa2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248SFRNTEVsZW1lbnRFdmVudE1hcFtUXT4pIHtcbiAgICAgICAgdGhpcy5zZXJpYWxpemFibGVTa2VsZXRvbiA9IHNlcmlhbGl6YWJsZVNrZWxldG9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBlOiBTZXJpYWxpemFibGU8RXZlbnQ+KSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgICAgIHRoaXMuY29udGVudCA9IHtcbiAgICAgICAgICAgIGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmLH0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuXG5leHBvcnQgY2xhc3MgU2V0QXR0cmlidXRlTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRBdHRyaWJ1dGVNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXJpYWxpemFibGV9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBoYW5kbGVyOiAobWVzc2FnZTogRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIEZvcm1EYXRhRW50cnkgPSB7XG4gICAgaWQ/OiBzdHJpbmcsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICB2YWx1ZT86IElucHV0RWxlbWVudFZhbHVlLFxuICAgIHJlcXVpcmVkPzogYm9vbGVhbixcbiAgICB2YWxpZGl0eT86IFNlcmlhbGl6YWJsZTxWYWxpZGl0eVN0YXRlPixcbiAgICBteW9wSWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgSW5wdXRFbGVtZW50Rm9ybVZhbHVlID0ge1xuICAgIGZvcm1EYXRhPzogeyBba2V5OiBzdHJpbmddOiBGb3JtRGF0YUVudHJ5IH1cbiAgICB1bm1hcHBlZERhdGE/OiBGb3JtRGF0YUVudHJ5W11cbn07XG5cbmV4cG9ydCB0eXBlIElucHV0RWxlbWVudFZhbHVlID0gc3RyaW5nIHwgSW5wdXRFbGVtZW50Rm9ybVZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZFxuXG5leHBvcnQgY2xhc3MgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGVudDogSW5wdXRFbGVtZW50VmFsdWUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZS50c1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHN0cmluZz4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0SW5uZXJIdG1sJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaW5uZXJIdG1sOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gaW5uZXJIdG1sXG4gICAgfVxufSIsICJpbXBvcnQgeyBCYXNlTXlvcE1lc3NhZ2UgfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG4vLyBzZW50IGJ5IGhvc3QgdG8gY29tcG9uZW50cywgY29udGFpbnMgdGhpZXIgaWQgXG5leHBvcnQgY2xhc3MgSW5pdE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8eyBpZDogc3RyaW5nIH0+IHtcbiAgICBtZXNzYWdlVHlwZSA9ICdJbml0TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgdGhpcy5jb250ZW50ID0geyBpZCB9XG4gICAgfVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cblxuLy8gY29tcG9uZW50IG5vdGlmeSBob3N0IHRoZSBpdCB3YXMgaW5pdGF0ZWQgXG5leHBvcnQgY2xhc3MgSW5pdFJlc3BvbnNlIGV4dGVuZHMgSW5pdE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRSZXNwb25zZSc7XG59XG5cbi8vIGNvbXBvbmVudCBhc2sgdG8gaG9zdCB0byBnZXQgaW5pdGF0ZWQgXG5leHBvcnQgY2xhc3MgSW5pdFJlcXVlc3QgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRSZXF1ZXN0Jztcbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7SUNvbXBvbmVudENvbmZpZywgSVJlZkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdC9ob3N0U0RLLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZDb25maWc6IElSZWZDb25maWcsXG4gICAgICAgICAgICAgICAgcHVibGljIG5lc3RlZENvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgb3B0aW9uczogbG9hZGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UpID0+IHZvaWQsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuXG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBOZXN0ZWRSZWYgPSB7XG4gICAgcmVmTmFtZTogc3RyaW5nLFxuICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBuZXN0ZWRSZWZzOiBOZXN0ZWRSZWZbXSwgcHVibGljIGZhaWxlZD86IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBFbnZlbG9wZWRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdFbnZlbG9wZWRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBkZXN0aW5hdGlvbjogc3RyaW5nLCBwdWJsaWMgbWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgY29uc3QgaW5uZXJFbnZlbG9wZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZSk7XG4gICAgICAgIHRoaXMucm91dGUgPSBbZGVzdGluYXRpb24sIC4uLmlubmVyRW52ZWxvcGVkTWVzc2FnZS5yb3V0ZSA/IGlubmVyRW52ZWxvcGVkTWVzc2FnZS5yb3V0ZSA6IFtdXTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtJRWxlbWVudFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPGFueSwgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnXG4gICAgcmVwbHlNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbn1cblxuZXhwb3J0IGNsYXNzIERldGVjdGVkTXlvcFJlZnNNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPElFbGVtZW50UmVmW10+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgbXlvcEVsZW1lbnRSZWZzOiBJRWxlbWVudFJlZltdKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcilcbiAgICAgICAgdGhpcy5jb250ZW50ID0gbXlvcEVsZW1lbnRSZWZzO1xuICAgIH1cblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlPGFueT4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0dldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZW50OiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxudHlwZSBNZXRob2ROYW1lczxUPiA9IHtcbiAgICAvLyBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gSyA6IG5ldmVyO1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKCkgPT4gdm9pZCA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbi8vIERlZmluZSBhIHR5cGUgdGhhdCBhbGxvd3Mgb25seSBzdHJpbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ldGhvZCBuYW1lcyBvZiBUXG50eXBlIE1ldGhvZFN0cmluZzxUPiA9IE1ldGhvZE5hbWVzPFQ+IGV4dGVuZHMgaW5mZXIgTSA/IE0gZXh0ZW5kcyBzdHJpbmcgPyBNIDogbmV2ZXIgOiBuZXZlcjtcblxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWV0aG9kOiBNZXRob2RTdHJpbmc8SU15b3BDb21wb25lbnQ+KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFNldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnO1xufSIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdDbGVhbnVwUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIENsZWFudXBNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIENsZWFudXBSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdDbGVhbnVwTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY2xlYW51cEZvck1lc3NhZ2VJZDogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogQ2xlYW51cFJlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2xlYW51cFJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGN1c3RvbUNsZWFudXA6IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBEaXNwb3NlTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRGlzcG9zZU1lc3NhZ2UnO1xufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnO1xufVxuXG5leHBvcnQgY2xhc3MgUmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnO1xufSIsICJleHBvcnQgKiBmcm9tICcuL0Jhc2VNZXNzYWdlJztcblxuLy91c2VyJ3MgbWVzc2FnZXNcbmV4cG9ydCAqIGZyb20gJy4vQmluZENsaWNrTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZVRleHRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DdXN0b21SZWZNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9TZXRBdHRyaWJ1dGVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL1NldElubmVySHRtbCc7XG5cbi8vc3lzdGVtIG1lc3NhZ2VzXG5leHBvcnQgKiBmcm9tICcuL0luaXRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0VudmVsb3BlZE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9EZXRlY3RNeW9wUmVmc01lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gICcuL0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL0V4ZWN1dGVDb21wb25lbnRNZXRob2QnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NsZWFudXBNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRGlzcG9zZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOyIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5LCBNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBEaXNwb3NlTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCwgTWVzc2FnZURpcmVjdGlvbixcbiAgICBDbGVhbnVwTWVzc2FnZSwgQ2xlYW51cFJlcGxheU1lc3NhZ2UsXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7SG9zdFNESywgbG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuLyoqXG4gKiBSZXN1bHQgcmV0dXJuZWQgYnkgb2JzZXJ2ZUF1dG9TaXplIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b1NpemVSZXN1bHQge1xuICAgIC8qKiBDdXJyZW50IHdpZHRoIChmcm9tIGNvbnRlbnQpICovXG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICAvKiogQ3VycmVudCBoZWlnaHQgKGZyb20gY29udGVudCkgKi9cbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICAvKiogV2hldGhlciB3aWR0aCBpcyBiZWluZyBhdXRvLXNpemVkICovXG4gICAgYXV0b1NpemluZ1dpZHRoOiBib29sZWFuO1xuICAgIC8qKiBXaGV0aGVyIGhlaWdodCBpcyBiZWluZyBhdXRvLXNpemVkICovXG4gICAgYXV0b1NpemluZ0hlaWdodDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBvYnNlcnZlQXV0b1NpemUgbWV0aG9kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b1NpemVPcHRpb25zIHtcbiAgICAvKiogQ2FsbGJhY2sgY2FsbGVkIHdpdGggc2l6ZSBpbmZvIHdoZW5ldmVyIHNpemUgY2hhbmdlcyAqL1xuICAgIG9uU2l6ZUNoYW5nZT86IChyZXN1bHQ6IEF1dG9TaXplUmVzdWx0KSA9PiB2b2lkO1xuICAgIC8qKiBNaW5pbXVtIHdpZHRoIGNvbnN0cmFpbnQgKi9cbiAgICBtaW5XaWR0aD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWF4aW11bSB3aWR0aCBjb25zdHJhaW50ICovXG4gICAgbWF4V2lkdGg/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIE1pbmltdW0gaGVpZ2h0IGNvbnN0cmFpbnQgKi9cbiAgICBtaW5IZWlnaHQ/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIE1heGltdW0gaGVpZ2h0IGNvbnN0cmFpbnQgKi9cbiAgICBtYXhIZWlnaHQ/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIEV4cGxpY2l0IHdpZHRoIHNldCBieSBob3N0IC0gaWYgZGVmaW5lZCwgZG9uJ3QgYXV0by1zaXplIHdpZHRoICovXG4gICAgZXhwbGljaXRXaWR0aD86IHN0cmluZyB8IG51bWJlcjtcbiAgICAvKiogRXhwbGljaXQgaGVpZ2h0IHNldCBieSBob3N0IC0gaWYgZGVmaW5lZCwgZG9uJ3QgYXV0by1zaXplIGhlaWdodCAqL1xuICAgIGV4cGxpY2l0SGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIC8qKiBGb3JjZSBhdXRvLXNpemUgZXZlbiBpZiBjb250YWluZXIgaGFzIGRpbWVuc2lvbnMgKi9cbiAgICBmb3JjZUF1dG9TaXplPzogYm9vbGVhbjtcbiAgICAvKiogTWluIGhlaWdodCB1c2VkIGJ5IGxvYWRlciB0byBkZXRlY3QgY29sbGFwc2UgKGRlZmF1bHQ6IDUwKSAqL1xuICAgIGxvYWRlck1pbkhlaWdodD86IG51bWJlcjtcbn1cblxuLy9UT0RPIDogY2hhbmdlIElNeW9wQ29tcG9uZW50IHRvIHJlZiBzcGVjaWZpYyBpbXBsXG50eXBlIFJlZlR5cGVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IElNeW9wQ29tcG9uZW50IHwgUmVmXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wQ29tcG9uZW50PFAgPSBhbnksIFIgPSBhbnk+IHtcblxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBpc0luaXRpYXRlZDogYm9vbGVhbjtcblxuICAgIG1hcmtlZEZvckRpc3Bvc2VkOiBib29sZWFuO1xuXG4gICAgc2V0SW5pdGlhdGVkOiAoKSA9PiB2b2lkXG5cbiAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudFxuXG4gICAgLy9yZWYgY29tcG9uZW50cyBjYW4gYmUgZWxlbWVudC1sZXNzXG4gICAgZWxlbWVudD86IEhUTUxFbGVtZW50XG5cbiAgICBzZW5kOiAobXNnOiBCYXNlTXlvcE1lc3NhZ2UpID0+IENsZWFudXBIYW5kbGVyXG5cbiAgICBiaW5kKG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKCkgPT4gYm9vbGVhbik6IHZvaWQ7XG5cbiAgICBiaW5kPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4pOiB2b2lkO1xuXG4gICAgLy8gYm9vbGVhbiByZXR1cm5lZCB2YWx1ZSA9IGhhbmRsZWQgb3Igbm90XG4gICAgb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IEJhc2VNeW9wTWVzc2FnZSkgPT4gYm9vbGVhblxuXG4gICAgaW5pdGlhdGVkOiAoKSA9PiBQcm9taXNlPGFueT47XG5cbiAgICBkaXNwb3NlOiAoKSA9PiB2b2lkXG5cbiAgICBoaWRlKCk6IHZvaWQ7XG5cbiAgICBzaG93KCk6IHZvaWQ7XG5cbiAgICBpbnNwZWN0KCk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZlcyB0aGUgaWZyYW1lIGNvbnRlbnQgc2l6ZSBhbmQgYXV0b21hdGljYWxseSBzeW5jcyBpdCB0byB0aGUgaWZyYW1lIGVsZW1lbnQuXG4gICAgICogT25seSBhdmFpbGFibGUgZm9yIGlmcmFtZS1iYXNlZCBjb21wb25lbnRzLiBVc2VzIGRpcmVjdCBjb250ZW50RG9jdW1lbnQgYWNjZXNzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZyBzaXplIGNoYW5nZSBjYWxsYmFjayBhbmQgbWluL21heCBjb25zdHJhaW50c1xuICAgICAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gc3RvcCBvYnNlcnZpbmdcbiAgICAgKi9cbiAgICBvYnNlcnZlQXV0b1NpemU/OiAob3B0aW9ucz86IEF1dG9TaXplT3B0aW9ucykgPT4gQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZWQgbXlvcDpzaXplIG1ldGEgdGFnIGZyb20gdGhlIGNvbXBvbmVudCBIVE1MLlxuICAgICAqIFNldCBieSBIVE1MQ29tcG9uZW50TG9hZGVyIGJlZm9yZSBpZnJhbWUgY3JlYXRpb24uXG4gICAgICogVXNlZCBieSB0aGUgUmVhY3QgaG9zdCB0byBkZXRlcm1pbmUgc2l6aW5nIG1vZGUgKGZpbGwgdnMgY29udGVudCkuXG4gICAgICovXG4gICAgc2l6ZU1ldGE/OiB7IHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyOyBoZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7IG1pbldpZHRoPzogbnVtYmVyOyBtYXhXaWR0aD86IG51bWJlcjsgbWluSGVpZ2h0PzogbnVtYmVyOyBtYXhIZWlnaHQ/OiBudW1iZXIgfSB8IG51bGw7XG5cbiAgICBwYXJlbnQ/OiBJTXlvcENvbXBvbmVudDtcblxuICAgIHByb3BzOiBQXG5cbiAgICByZWZzOiBSXG59XG5cbmZ1bmN0aW9uIGlzSW5oZXJpdEZyb20ob2JqOiBhbnksIGJhc2VDbGFzczogYW55KSB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG5cbiAgICBpZiAoIXByb3RvKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAocHJvdG8uY29uc3RydWN0b3IubmFtZSA9PT0gYmFzZUNsYXNzLm5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBpc0luaGVyaXRGcm9tKHByb3RvLCBiYXNlQ2xhc3MpO1xufVxuXG4vLyBUT0RPIDogbW92ZSA6IFxudHlwZSBtZXNzYWdlSGFuZGxlcjxUPiA9IChtZXNzYWdlOiBUKSA9PiBib29sZWFuO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiBleHRlbmRzIFJlZlR5cGVzID0gUmVmVHlwZXM+IGltcGxlbWVudHMgSU15b3BDb21wb25lbnQ8UD4ge1xuICAgIGlkOiBzdHJpbmcgPSAnJ1xuXG4gICAgbWVzc2FnZUhhbmRsZXJzOiBSZWNvcmQ8c3RyaW5nLCBtZXNzYWdlSGFuZGxlcjxhbnk+W10+ID0ge307XG5cbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnRcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICB0aGlzLmlkID0gb3B0aW9ucz8uaWQgfHwgSG9zdFNESy5JbnN0YW5jZSgpLmFzc2lnbklkKGNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucz8udGltZW91dCA/IG9wdGlvbnM/LnRpbWVvdXQgOiA1ICogMTAwMDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWF0ZWQgJiYgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdCAmJiAhdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KGB0aW1lb3V0XyR7dGltZW91dH0gJHt0aGlzLmlkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICAvLyBUT0RPIDogYXV0byBpbnNwZWN0LCBjb250cm9sIGZyb20gY29uZmlnXG4gICAgICAgIHRoaXMuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAod2luZG93Lm15b3AuaG9zdFNESy5pbnNwZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluc3BlY3QoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGdldCBtYXJrZWRGb3JEaXNwb3NlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkO1xuICAgIH1cblxuICAgIHNldCBtYXJrZWRGb3JEaXNwb3NlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbjogVGhlIGNvbXBvbmVudCBpcyBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRpc3Bvc2VkLiBEaXNwb3NlIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGFnYWluIHVudGlsIHRoZSBjdXJyZW50IGRpc3Bvc2FsIHByb2Nlc3MgaXMgY29tcGxldGUuJylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGhpZGUoKTogdm9pZDtcblxuICAgIGFic3RyYWN0IHNob3coKTogdm9pZDtcblxuICAgIGFic3RyYWN0IGluc3BlY3QoKTogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvL1RPRE86IHVzZSBiaW5kV2hlbiB3aXRoIHJldHVybiB0cnVlIHByZWRpY2F0ZSAuLi5cbiAgICBiaW5kID0gPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25cbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0uaW5jbHVkZXMoaGFuZGxlcikpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXS5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZFdoZW4gPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgcHJlZGljYXRlOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbiwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IHZvaWQpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IHVzZSBjb21wb25lbnQuYmluZFdoZW4gd2l0aG91dCBhbiBoYW5kbGVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdID0gW11cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdO1xuXG4gICAgICAgIGNvbnN0IHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyID0gKGU6IFQpID0+IHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vVE9ETyA6IGhhbmRsZSBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uID9cbiAgICAgICAgaGFuZGxlcnMucHVzaChwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGFuZGxlcnMuaW5kZXhPZihwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnb25NZXNzYWdlUmVjZWl2ZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCBpbmNvbWVNZXNzYWdlLCB0aGlzKTtcbiAgICAgICAgLy9UT0RPIDogaGFuZGVsIHNwZWNpYWwgZXZldHMgPyBsaWtlIGluaXRSZXMgP1xuICAgICAgICBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVDb21wb25lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChpbmNvbWVNZXNzYWdlIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpO1xuXG4gICAgICAgICAgICAvL2tlZXBpbmcgdGhpcy5tZXRob2QoKSBzbyB0aGF0IGNvbnRleHQgd2lsbCBzYXZlZFxuICAgICAgICAgICAgaWYgKCh0aGlzIGFzIGFueSlbdHlwZWRNZXNzYWdlLm1ldGhvZF0pIHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpW3R5cGVkTWVzc2FnZS5tZXRob2RdKHR5cGVkTWVzc2FnZS5jb250ZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYG1ldGhvZCBub3QgZm91bmQgJHt0eXBlZE1lc3NhZ2UubWV0aG9kfSBvbiBjb21wb25lbnRgLCB0aGlzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZV07XG4gICAgICAgIGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IGhhbmRsZWQgfHwgaGFuZGxlcihpbmNvbWVNZXNzYWdlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9UT0RPIDogY29uc29sZSBvbmx5IHdoZW4gZGVidWcgY29uZmlnXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdubyBoYW5kbGVycyBmb3VuZCBmb3IgJywgaW5jb21lTWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmlzSW5pdGlhdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUpXG4gICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBfd2hlbkluaXRpYXRlZFJlc29sdmU/OiAodmFsdWU/OiBhbnkpID0+IGFueTtcbiAgICBfd2hlbkluaXRpYXRlZFJlamVjdD86ICh2YWx1ZT86IGFueSkgPT4gYW55O1xuXG4gICAgX3doZW5Jbml0aWF0ZWQ6IFByb21pc2U8YW55PiA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgaW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2hlbkluaXRpYXRlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbmRDbGVhbnVwTWVzc2FnZShtZXNzYWdlOiBDbGVhbnVwTWVzc2FnZSk6IHZvaWQge1xuICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG4gICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSB0aGlzLmlkO1xuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcblxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuYmluZFdoZW4obWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1zZy5yZXBsYXlUb0hhbmRsZXIgPT09IG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgIH0sIChtOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZS5oYW5kbGVyKG0pO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlcjtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBkZWxldGUgbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgdGhpcy5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgc2VuZChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciB7XG4gICAgICAgIC8vbWVzc2FnZXMgdGhhdCBleGV0cmFjdGVkIGZyb20gZW52ZWxvcGUgYWxyZWFkeSBoYXZlIHNvdXJjZSBpbiB0aGVtXG4gICAgICAgIGlmICghbWVzc2FnZS5zb3VyY2UpXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLmRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHRoaXMuaWQ7XG5cbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG5cbiAgICAgICAgbGV0IGNsZWFudXBIYW5kbGVyO1xuICAgICAgICAvLyBUT0RPIDogZml4IGhlYXZ5IG9wLi5cbiAgICAgICAgLy8gIGlmIChpc0luaGVyaXRGcm9tKG1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAobWVzc2FnZS5oYW5kbGVyKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBNeW9wQmluZE1lc3NhZ2UpO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIgPSB0aGlzLmJpbmRXaGVuKHR5cGVkTWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBtc2cucmVwbGF5VG9IYW5kbGVyID09PSB0eXBlZE1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgICAgICB9LCB0eXBlZE1lc3NhZ2UuaGFuZGxlcik7XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlLmhhbmRsZXJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICBpZiAobWVzc2FnZS5yZWYpIHtcbiAgICAgICAgICAgIC8vIHNlcmlhbGl6YWJsZVxuICAgICAgICAgICAgbWVzc2FnZS5yZWYgPSBtZXNzYWdlLnJlZi5fX25vblByb3hpZWQgfHwgbWVzc2FnZS5yZWY7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kQ2xlYW51cE1lc3NhZ2UobmV3IENsZWFudXBNZXNzYWdlKG1lc3NhZ2UuaWQsIChyZXBsYXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nIHJlcGxheT9cbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xlYW51cEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhdGVkKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiB1c2Ugc2RrLmxvZ2dlclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZGlzcG9zaW5nIGJlZm9yZSBpc0luaXRpYXRlZCcsIHRoaXMuaWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdkaXNwb3NpbmcgY29tcG9uZW50JywgdGhpcy5pZCk7XG5cbiAgICAgICAgLy8gLy9UT0RPIDogaW1wbGVtZW50IGRpc3Bvc2UgZmxvd1xuICAgICAgICAvLyBPYmplY3Qua2V5cyh0aGlzLnJlZnMpLmZvckVhY2gocmVmS2V5PT57XG4gICAgICAgIC8vICAgICB0aGlzLnJlZnNbcmVmS2V5XS5kaXNwb3NlKCk7XG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRoZXJlIGlzIGFueSB0aW1lIGZvciB0aGUgb1xuICAgICAgICAvLyB0aGVyIHNpZGUgdG8gcHJvY2Nlc3MgdG8gbWVzc2FnZSBiZWZvcmUgZGllID9cbiAgICAgICAgLy9ub3RpZnkgdGhlIG90aGVyIHNpZGUgU0RLXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRGlzcG9zZU1lc3NhZ2UoKSlcblxuICAgICAgICBjb25zdCBvbkRpc3Bvc2VIYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzWydvbkRpc3Bvc2UnXVxuICAgICAgICBpZiAob25EaXNwb3NlSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIG9uRGlzcG9zZUhhbmRsZXJzLmZvckVhY2goZGlzcG9zZUhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgbnVsbCBvciBmaXggdGhlIHR5cGUgP1xuICAgICAgICAgICAgICAgIGRpc3Bvc2VIYW5kbGVyKG51bGwpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5jb250YWluZXIpO1xuICAgICAgICAvL3RoaXMuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycyA9IHt9XG4gICAgICAgIHRoaXMuaWQgKz0gJ19kaXNwb3NlZCc7XG4gICAgICAgIHRoaXMuaXNJbml0aWF0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm9wczogUCA9IHt9IGFzIHVua25vd24gYXMgUDtcbiAgICByZWZzOiBSID0ge30gYXMgdW5rbm93biBhcyBSO1xufVxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSUVsZW1lbnRSZWYge1xuICAgIG15b3BJZD86IHN0cmluZ1xuICAgIGh0bWxUYWdOYW1lOiBzdHJpbmdcbiAgICBCb3VuZGluZ1JlY3Q/OiBET01SZWN0XG4gICAgb2Zmc2V0VG9wPzogbnVtYmVyXG4gICAgb2Zmc2V0TGVmdD86IG51bWJlclxuXG4gICAgdHlwZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBYUGF0aEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHhQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIGh0bWxUYWdOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIEJvdW5kaW5nUmVjdD86IERPTVJlY3QsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldFRvcD86IG51bWJlcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0TGVmdD86IG51bWJlcikge1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnWFBhdGhFbGVtZW50UmVmJ1xufVxuXG5leHBvcnQgY2xhc3MgTXlvcEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG15b3BJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBodG1sVGFnTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBCb3VuZGluZ1JlY3Q/OiBET01SZWN0LFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRUb3A/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldExlZnQ/OiBudW1iZXIpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnTXlvcEVsZW1lbnRSZWYnXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlcn0gZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IHR5cGUgSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgPSBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+IHwgUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCBjb25zdCBydW5FeGVjdXRvckNsZWFudXAgPSBhc3luYyAodGFzazogSU1lc3NhZ2VFeGVjdXRvckNsZWFudXApID0+IHtcbiAgICBpZiAodHlwZW9mIHRhc2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gSXQncyBhIGZ1bmN0aW9uLCBjYWxsIGl0XG4gICAgICAgIHRhc2soKTtcbiAgICB9IGVsc2UgaWYgKHRhc2sgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIC8vIEl0J3MgYSBQcm9taXNlLCBhd2FpdCBpdFxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXNrO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIGEgZnVuY3Rpb24sIGNhbGwgaXRcbiAgICAgICAgICAgIHJlc3VsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRhc2sgaXMgdm9pZCwgZG8gbm90aGluZ1xufVxuXG50eXBlIElNZXNzYWdlRXhlY3V0b3I8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4gPSAobWVzc2FnZTogVCkgPT4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXA7XG5cbmludGVyZmFjZSBJTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxuXG4gICAgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBpbXBsZW1lbnRzIElNZXNzYWdlSGFuZGxlcjxUPiB7XG5cbiAgICAvL1RPRE8gOiBhZGQgZGlzcG9zZSBtZXRob2RcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZCkge1xuXG4gICAgfVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG4gICAgYWJzdHJhY3QgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnksIEUgPSBhbnk+IGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQsIHB1YmxpYyBjb250ZXh0PzogRSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgcnVuRXhlY3V0b3JDbGVhbnVwfSBmcm9tIFwiLi9pbmRleC50c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL2Jhc2VNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsIENsZWFudXBNZXNzYWdlLCBDbGVhbnVwUmVwbGF5TWVzc2FnZSwgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgRW52ZWxvcGVkTWVzc2FnZSxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVzcG9uc2UsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgSG9zdGVkQ29tcG9uZW50PFQgPSBhbnk+IHtcbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgIH1cblxuICAgIC8vb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IElNeW9wTWVzc2FnZSkgPT4gdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBpZDogc3RyaW5nLCBwdWJsaWMgY29udGV4dD86IFQpIHtcblxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcFNESyB7XG4gICAgaW5pdDogKCkgPT4gdm9pZDtcblxuICAgIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkXG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW107XG5cbiAgICBoYW5kbGVJbmNvbWVNZXNzYWdlczogKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4gdm9pZFxuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50Pjtcbn1cblxuLy8gY29uc3QgbG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzID0gW1xuLy8gICAgIE15b3BNZXNzYWdlcy5Jbml0UmVxdWVzdCxcbi8vICAgICBNeW9wTWVzc2FnZXMuSW5pdFJlc3BvbnNlLFxuLy8gICAgIC8vTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UsXG4vLyBdXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcFNESyBpbXBsZW1lbnRzIElNeW9wU0RLIHtcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdO1xuXG4gICAgbWVzc2FnZVRvSGFuZGxlQWZ0ZXJJbml0OiBCYXNlTXlvcE1lc3NhZ2VbXSA9IFtdO1xuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PiA9IHt9O1xuXG4gICAgYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBtZXNzYWdlQ2xlYW51cENhY2hlOiBSZWNvcmQ8c3RyaW5nLCBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+PiB8IFByb21pc2U8dm9pZD4gPSB7fTtcblxuICAgIGhhbmRsZUluY29tZU1lc3NhZ2VzKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gZXZlbnQuZGF0YSA/IGV2ZW50LmRhdGEgOiBldmVudC5kZXRhaWw7XG5cbiAgICAgICAgaWYgKCFldmVudENvbnRlbnQgfHwgIWV2ZW50Q29udGVudC5teW9wKSB7XG4gICAgICAgICAgICAvLyBub3QgbXlvcCBtYXJrZWQgZXZlbnQgXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGV2ZW50Q29udGVudCBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLmRpcmVjdGlvbiAhPT0gTWVzc2FnZURpcmVjdGlvbi5kb3duKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbWVzc2FnZSBkcm9wcGVkIGluIGJhc2VTREssIGRpcmVjdGlvbiB3YXMgJywgZXZlbnQuZGF0YS5kaXJlY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiAobG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzLmluY2x1ZGVzKG1lc3NhZ2UubWVzc2FnZVR5cGUpKSB7XG4gICAgICAgICAgICAvLyAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyAgICAgLy9UT0RPIDogZml4IGRpcmVjdGlvbiA/IG1lc3NhZ2Ugd2lsbCBub3QgcHJvY2Nlc3Mgb3RoZXJ3aXNlXG4gICAgICAgICAgICAvLyAgICAgd2luZG93Lm15b3AuaG9zdFNESy5zZW5kKG1lc3NhZ2UpXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkRpc3Bvc2VNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNob3VsZCBub3QgYmUgb3B0aW9uYWwsIGZpeCBhbmQgcmVtb3ZlICdpZidcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5kZXN0aW5hdGlvbilcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uXVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gV2UgZ290IG91ciBpZCBmcm9tIG91ciBob3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogU0RLIG1heSBzZXJ2ZSBtb3JlIHRoYW4gMSBjb21wb25lbnQgLi4gdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb21wb25lbnRJZCA9IChtZXNzYWdlIGFzIEluaXRNZXNzYWdlKS5jb250ZW50LmlkO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgRXJyb3IoXCJyZWNoaXZlZCBpbml0IG1lc3NhZ2UgZm9yIGFuIGV4c2lzaW5nIGNvbXBvbmVudC5cIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0gPSBuZXcgSG9zdGVkQ29tcG9uZW50KG5ld0NvbXBvbmVudElkKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlc3BvbnNlKG5ld0NvbXBvbmVudElkKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogaXMgaXQgdHJ1ZSB0byBub3QgcGFzcyBmdXJ0aGVyICggdG8gdGhlIGNvbXBvbmVudCApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBmb3Igc2FtZSBIb3N0U0RLIGNhc2VzXG4gICAgICAgICAgICAvLyB3aGVuIGJvdGggUmVmQ29tcG9uZW50IGFuZCByZWFsQ29tcG9uZW50IGhvc3RlZCBpbiB0aGUgc2FtZSBIb3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnZlbG9wZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXJNZXNzYWdlID0gZW52ZWxvcGVkTWVzc2FnZS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBpbm5lck1lc3NhZ2U7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0IHx8IHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uIV0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkNvbXBvbmVudCA9IG15b3AuaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBpbm5lck1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdGluYXRpb25Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQ29tcG9uZW50LnNlbmQoaW5uZXJNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQgPSBteW9wLmhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gZW52ZWxvcGVkTWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQuc2VuZChpbm5lck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2Upe1xuICAgICAgICAgICAgLy8gICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG4gICAgICAgICAgICAvLyAvLyAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNsZWFudXBNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ2xlYW51cE1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbdHlwZWRNZXNzYWdlLmNsZWFudXBGb3JNZXNzYWdlSWRdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXBNZXNzYWdlID0gbmV3IENsZWFudXBSZXBsYXlNZXNzYWdlKCEhY2xlYW51cCk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXBNZXNzYWdlLmRlc3RpbmF0aW9uID0gbWVzc2FnZS5kZXN0aW5hdGlvbjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoISFjbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW3R5cGVkTWVzc2FnZS5jbGVhbnVwRm9yTWVzc2FnZUlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkV4ZWN1dG9yQ2xlYW51cChjbGVhbnVwKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QoY2xlYW51cE1lc3NhZ2UsIHR5cGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogaGFuZGVsIGVycm9yP1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChjbGVhbnVwTWVzc2FnZSwgdHlwZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGFjdGlvbkhhbmRsZXJGb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zdXBwb3J0ZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlci5tZXNzYWdlVHlwZSA9PT0gbWVzc2FnZS5tZXNzYWdlVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uSGFuZGxlckZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSBoYW5kbGVyLmV4ZWN1dG9yKG1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUgJiYgY2xlYW51cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVttZXNzYWdlLmlkXSA9IGNsZWFudXA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhbnVwICYmICFtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2xlYW51cCBoYW5kbGVyIGdlbmVyYXRlZCBmb3Igbm9uLWNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjbGVhbnVwICYmIG1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjbGVhbnVwIGhhbmRsZXIgZ2VuZXJhdGVkIGZvciBhIGNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbkhhbmRsZXJGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBwcmludCB3aXRoIGRlYnVnIGNvbmZpZyBvbmx5XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25vIG1lc3NhZ2UgaGFuZGxlciB3YXMgZm91bmQgZm9yICcsIG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndW5zdXBwb3J0ZWQgbWVzc2FnZSB0eXBlJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFic3RyYWN0IGluaXQ6ICgpID0+IHZvaWQ7XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCAqIGZyb20gJy4vTXlvcEVsZW1lbnRSZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9iYXNlTWVzc2FnZUhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9CYXNlTXlvcFNESyc7XG5cbmV4cG9ydCB0eXBlIENsZWFudXBIYW5kbGVyID0gKCkgPT4gdm9pZFxuXG5leHBvcnQgdHlwZSBEaWN0aW9uYXJ5PFQ+ID0geyBba2V5OiBzdHJpbmddOiBUOyB9O1xuXG4vL2V4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0gJ0lmcmFtZUxvYWRlcicgfCAnV2ViQ29tcG9uZW50TG9hZGVyJyB8ICdIVE1MTG9hZGVyJyB8IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IFNraW5Mb2FkZXJzID0ge1xuICAgIFwiSWZyYW1lTG9hZGVyXCI6IFwiSWZyYW1lTG9hZGVyXCIsXG4gICAgXCJXZWJDb21wb25lbnRMb2FkZXJcIjogXCJXZWJDb21wb25lbnRMb2FkZXJcIixcbiAgICBcIkhUTUxMb2FkZXJcIjogXCJIVE1MTG9hZGVyXCIsXG4gICAgXCJNaW5pbWl6ZWRMb2FkZXJcIjogXCJNaW5pbWl6ZWRMb2FkZXJcIlxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0ga2V5b2YgdHlwZW9mIFNraW5Mb2FkZXJzO1xuXG5leHBvcnQgdHlwZSBQcm9wVHlwZSA9ICdhbnknIHwgJ3N0cmluZycgfCAnbnVtYmVyJyB8IHN0cmluZzsgLy8gVE9ETyA6IDxcbmV4cG9ydCB0eXBlIFJlZlNlbGVjdG9yVHlwZSA9ICdpZC1hdHRyaWJ1dGUnIHwgJ2Nzcy1zZWxlY3RvcicgfCAneHBhdGgnIHwgc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgTG9hZGVyRnJhbWV3b3JrcyA9IHtcbiAgICBcInJlYWN0XCI6IFwicmVhY3RcIixcbiAgICBcInZ1ZVwiOiBcInZ1ZVwiLFxuICAgIFwiYW5ndWxhclwiOiBcImFuZ3VsYXJcIixcbn0gYXMgY29uc3RcbmV4cG9ydCB0eXBlIExvYWRlckZyYW1ld29ya1R5cGUgPSBrZXlvZiB0eXBlb2YgTG9hZGVyRnJhbWV3b3JrcztcblxuZXhwb3J0IGludGVyZmFjZSBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiV2ViQ29tcG9uZW50TG9hZGVyXCI7XG4gICAgdXJsOiBzdHJpbmcsXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgZnJhbWV3b3JrPzogTG9hZGVyRnJhbWV3b3JrVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElJZnJhbWVMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJJZnJhbWVMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZ1xuICAgIGF1dG9IZWlnaHQ6IGJvb2xlYW5cbiAgICBoZWlnaHQ/OiBzdHJpbmdcbiAgICB3aWR0aD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgU2hhZG93Um9vdE1vZGVUeXBlID0ge1xuICAgIFwib3BlblwiOiBcIm9wZW5cIixcbiAgICBcImNsb3NlZFwiOiBcImNsb3NlZFwiLFxuICAgIFwibm9uZVwiOiBcIm5vbmVcIixcbiAgICBcImxvY2FsRnJhbWVcIjogXCJsb2NhbEZyYW1lXCJcbn0gYXMgY29uc3Q7XG5cblxuZXhwb3J0IGludGVyZmFjZSBJSFRNTExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIkhUTUxMb2FkZXJcIjtcbiAgICBIVE1MOiBzdHJpbmc7XG4gICAgLy9UT0RPOiByZW5hbWUocm9vdE1vZGUvY3VzdG9tRWxlbWVudE1vZGUpICsgZGIgbWlncmF0aW9uXG4gICAgc2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlO1xuICAgIGF1dG9IZWlnaHQ/OiBib29sZWFuO1xuICAgIGhlaWdodD86IHN0cmluZztcbiAgICB3aWR0aD86IHN0cmluZztcbn1cblxuLy9mb3IgaW50ZXJuYWwgZGFzaGJvYXJkIHVzYWdlXG5leHBvcnQgaW50ZXJmYWNlIElNaW5pbWl6ZWRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJNaW5pbWl6ZWRMb2FkZXJcIjtcbn1cblxuaW50ZXJmYWNlIERhc2hib2FyZE9iamVjdCB7XG4gICAgX3RlbXBfY2xpZW50X2lkPzogc3RyaW5nLFxufVxuXG50eXBlIEV4dGVuZDxULCBVPiA9IFQgJiBVO1xuXG50eXBlIEV4dGVuZFJlY3Vyc2l2ZWx5PFQsIEU+ID0ge1xuICAgIFtLIGluIGtleW9mIEVdOiBFW0tdO1xufSAmIHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIG9iamVjdFxuICAgICAgICA/IEV4dGVuZFJlY3Vyc2l2ZWx5PFRbS10sIEU+XG4gICAgICAgIDogVFtLXTtcbn07XG5cbmV4cG9ydCB0eXBlIElEYXNoYm9hcmQ8VD4gPSBFeHRlbmRSZWN1cnNpdmVseTxULCBEYXNoYm9hcmRPYmplY3Q+O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBTa2luTG9hZGVyVHlwZVxuXG4gICAgW2tleTogc3RyaW5nXTogYW55OyAvLyBBbGxvd3MgYW55IGFkZGl0aW9uYWwgcHJvcGVydGllc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lSZWxlYXNlTWV0YWRhdGEge1xuICAgIGVudmlyb25tZW50SWQ6IHN0cmluZztcbiAgICBlbnZpcm9ubWVudElkZW50aWZpZXI6IHN0cmluZztcbiAgICAvL1xuICAgIC8vIHVwZGF0ZWRPbj86IHN0cmluZ1xuICAgIC8vIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lWYXJpYW50Q29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgcmVsZWFzZXM/OiB2Ml9JUmVsZWFzZU1ldGFkYXRhW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBsb2FkZXI6IElTa2luTG9hZGVyQ29uZmlnXG4gICAgY3JlYXRlZEJ5Pzogc3RyaW5nXG4gICAgY3JlYXRlZE9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVNraW5Db25maWcgZXh0ZW5kcyBJU2tpbkNvbmZpZyB7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCaW5kTWVzc2FnZVByb3BDb25maWcgZXh0ZW5kcyBJUHJvcENvbmZpZyB7XG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbn1cblxuZXhwb3J0IGNvbnN0IFByb3BNZXNzYWdlTW9kZXMgPSB7XG4gICAgXCJpbnB1dFwiOiBcImlucHV0XCIsXG4gICAgXCJvdXRwdXRcIjogXCJvdXRwdXRcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFByb3BDb25maWdCZWhhdmlvclR5cGVzID0ge1xuICAgIFwibWVzc2FnZVwiOiBcIm1lc3NhZ2VcIixcbiAgICBcImNvZGVcIjogXCJjb2RlXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbSB7XG4gICAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29kZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJjb2RlXCJcbiAgICByZW1hcD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wTWVzc2FnZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJtZXNzYWdlXCJcbiAgICBtZXNzYWdlOiBNeW9wTWVzc2FnZUtleVxuICAgIHJlZjogc3RyaW5nLCAvL1RPRE8gbWFrZSBpdCBpZFxuICAgIHBhcmFtczogSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbVtdXG4gICAgbW9kZToga2V5b2YgdHlwZW9mIFByb3BNZXNzYWdlTW9kZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcENvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIGJlaGF2aW9yOiBJUHJvcEJlaGF2aW9yXG59XG5cblxuZXhwb3J0IGNsYXNzIFJlZkJlaGF2aW9yVHlwZSB7XG4gICAgc3RhdGljIGNvZGUgPSAnY29kZScgYXMgY29uc3RcbiAgICBzdGF0aWMgY29tcG9uZW50ID0gJ2NvbXBvbmVudCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgSVJlZkJlaGF2aW9yVHlwZSA9ICdjb2RlJyB8ICdjb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogSVJlZkJlaGF2aW9yVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvbXBvbmVudCdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIFByb3BlcnR5IGluc3RhbmNlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICovXG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb2RlUmVmQmVoYXZpb3IgZXh0ZW5kcyBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6ICdjb2RlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgc2VsZWN0b3JUeXBlOiBSZWZTZWxlY3RvclR5cGVcbiAgICBzZWxlY3Rvcjogc3RyaW5nXG4gICAgYmVoYXZpb3I6IElSZWZCZWhhdmlvclxufVxuXG4vKipcbiAqIEV4cGVyaWVuY2Ugc2VnbWVudCBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VTZWdtZW50UnVsZSB7XG4gICAgcHJvcGVydHk6IHN0cmluZztcbiAgICBvcGVyYXRvcjogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBBL0Igc3BsaXQgdmVyc2lvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlQUJTcGxpdFZlcnNpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgcGVyY2VudGFnZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4cGVyaWVuY2UgQS9CIHNwbGl0IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZUFCU3BsaXQge1xuICAgIHZlcnNpb25zOiBJRXhwZXJpZW5jZUFCU3BsaXRWZXJzaW9uW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBzZWdtZW50IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZVNlZ21lbnQge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcnVsZXM6IElFeHBlcmllbmNlU2VnbWVudFJ1bGVbXTtcbiAgICB1c2VBYjogYm9vbGVhbjtcbiAgICBjb21wb25lbnRWYXJpYW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gICAgYWJTcGxpdD86IElFeHBlcmllbmNlQUJTcGxpdDtcbiAgICBzdGlja3lQcm9wZXJ0aWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBkZWZpbml0aW9uIGNvbmZpZyAodjIpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VEZWZpbml0aW9uQ29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIC8qKiBTZWxlY3RlZCBjb21wb25lbnQgSURzICovXG4gICAgY29tcG9uZW50czogc3RyaW5nW107XG4gICAgLyoqIFNlZ21lbnQgY29uZmlndXJhdGlvbnMgKi9cbiAgICBzZWdtZW50czogSUV4cGVyaWVuY2VTZWdtZW50W107XG4gICAgLyoqIEZhbGxiYWNrIHZhcmlhbnQgcGVyIGNvbXBvbmVudCAqL1xuICAgIGZhbGxiYWNrOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIC8qKiBUYWdzICovXG4gICAgdGFnczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgLy8gcHJvcHM6IFJlY29yZDxzdHJpbmcsIElQcm9wQ29uZmlnPiAvL2lkIC0gdHlwZVxuICAgIC8vIHJlZnM6IFJlY29yZDxzdHJpbmcsIElSZWZDb25maWc+LFxuICAgIC8vIHNraW5zOiBSZWNvcmQ8c3RyaW5nLCBJU2tpbkNvbmZpZz5cbiAgICBwcm9wczogSVByb3BDb25maWdbXSxcbiAgICByZWZzOiBJUmVmQ29uZmlnW10sXG4gICAgc2tpbnM6IElTa2luQ29uZmlnW10sXG4gICAgZGVmYXVsdFNraW46IG51bWJlcjtcblxuICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IHRoYXRcbiAgICAvL3Jlc29sdmVkRGVmaW5pdGlvbnM/OiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1tdXG4gICAgLy9UT0RPIDogbW92ZSB0byBiYXNlIGNsYXNzICggSVN0b3JhYmxlSXRlbSBvciBzby4uLilcblxuICAgIGNyZWF0ZWRPbj86IHN0cmluZ1xuICAgIGNyZWF0ZWRCeT86IHN0cmluZ1xuICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lNeW9wU3RvcmVkT2JqZWN0IGV4dGVuZHMgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICB1cGRhdGVkT24/OiBzdHJpbmdcbiAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRBY2Nlc3Mge1xuICAgIHZpc2liaWxpdHk6ICdwcml2YXRlJyB8ICd1bmxpc3RlZCcgfCAncHVibGljJztcbiAgICB1bmxpc3RlZD86IHtcbiAgICAgICAgc2x1Zzogc3RyaW5nO1xuICAgIH07XG4gICAgbWFya2V0cGxhY2U/OiB7XG4gICAgICAgIHN0YXR1czogJ2RyYWZ0JyB8ICdzdWJtaXR0ZWQnIHwgJ2NsYWltZWQnIHwgJ2Nsb3NlZCc7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIGNvbnRhY3RFbWFpbDogc3RyaW5nO1xuICAgICAgICBkZWFkbGluZTogc3RyaW5nO1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSUNvbXBvbmVudERlZmluaXRpb25Db25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgdmFyaWFudHNfaWRzOiBzdHJpbmdbXSxcbiAgICBEVE9zOiB2Ml9JRFRPW10sXG4gICAgdGFnczogc3RyaW5nW10sXG4gICAgYWNjZXNzPzogQ29tcG9uZW50QWNjZXNzLFxuXG4gICAgLy9cbiAgICB2YXJpYW50c19uYW1lczogc3RyaW5nW10sXG4gICAgdmFyaWFudHNfZGF0YToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGlkOiBzdHJpbmdcbiAgICAgICAgdXBkYXRlZE9uPzogc3RyaW5nXG4gICAgICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xuICAgICAgICBoYXNfcmVsZWFzZXM/OiBib29sZWFuXG4gICAgfVtdLFxuXG4gICAgcHJldmlld192YXJpYW50OiB2Ml9JVmFyaWFudENvbmZpZztcbiAgICBleHRyYT86IHtcbiAgICAgICAgZmlyc3RWYXJpYW50OiB2Ml9JVmFyaWFudENvbmZpZzsgLy93aGVuIG5ldyBjb21wb25lbnQgY3JlYXRlcyBhdCB0aGUgY2xpZW50XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lEVE8gZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgZGF0YTogb2JqZWN0XG4gICAgbWV0aG9kTmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5JbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcyxcbiAgICAvL3NraW5zOiBJU2tpbkluc3RhbmNlQ29uZmlnW11cbn1cblxuZXhwb3J0IGNvbnN0IFNlZ21lbnRUeXBlID0ge1xuICAgIFwiRnVuY3Rpb25SZXN1bHRcIjogXCJGdW5jdGlvblJlc3VsdFwiLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEluc3RhbmNlIHtcbiAgICBzZWdtZW50SWQ6IHN0cmluZztcbiAgICBza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFNlZ21lbnRUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQgZXh0ZW5kcyBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTogdHlwZW9mIFNlZ21lbnRUeXBlLkZ1bmN0aW9uUmVzdWx0XG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGZ1bmN0aW9uOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IFNraW5TZWxlY3RvclR5cGVzID0ge1xuICAgIFwiU2VnbWVudGVkXCI6IFwiU2VnbWVudGVkXCIsXG4gICAgXCJEZWRpY2F0ZWRcIjogXCJEZWRpY2F0ZWRcIixcblxuICAgIC8qKlxuICAgICAqIFRoaXMgU2VsZWN0b3IgVHlwZSBpcyBub3QgeWV0IHN1cHBvcnRlZCBidXQgd2lsbCBiZSBhZGRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICAgICAqIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgXCJEZWZhdWx0XCI6IFwiRGVmYXVsdFwiXG59IGFzIGNvbnN0O1xuXG5cbi8qKlxuICogVGhpcyBTa2luIENvbmZpZyBUeXBlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ1dCB3aWxsIGJlIGFkZGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gKiBQbGVhc2UgY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHVwZGF0ZXMuXG4gKlxuICogQHR5cGUge0lEZWZhdWx0U2tpbkNvbmZpZ31cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRGVmYXVsdFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuRGVmYXVsdCxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudGVkU2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQsXG4gICAgc2VnbWVudHM6IElTZWdtZW50SW5zdGFuY2VbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEZWRpY2F0ZWRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2tpbn0gaW5zdGVhZC5cbiAgICAgKiBQcm9wZXJ0eSBza2lucyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLlxuICAgICAqIFBsZWFzZSB1cGRhdGUgeW91ciBjb2RlIHRvIHVzZSB7QGxpbmsgc2tpbn0gZm9yIGJldHRlciBjb21wYXRpYmlsaXR5LlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBza2lucz86IElTa2luSW5zdGFuY2VDb25maWdbXSAvLyBkZXByZWNhdGVkXG4gICAgc2tpbjogSVNraW5JbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgLy9UT0RPIDpcbiAgICAvLyBSZWZJRCA/IHRvIHN1cHBvcnQgbW9yZSB0aGFuIDEgY29tcG9uZW50IGZyb20gdGhlIHNhbWUgdHlwZSBpbiBjb21wb3NpdGVzID9cblxuICAgIC8vVE9ETyA6IHJlbW92ZVxuICAgIGNvbXBvbmVudE5hbWU6IHN0cmluZzsgLy8gPDwgY2hlY2tcblxuICAgIHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZ1xuXG4gICAgLy8gc3RvcmluZyB0aGUgbmVzdGVkIGNvbmZpZyBmb3IgcmVmIGNvbXBvbmVudHNcbiAgICBuZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnW11cblxuICAgIC8vb25seSBvbiBHRVQ/XG4gICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgdGhhdFxuICAgIHJlc29sdmVkRXhwZXJpZW5jZXM/OiBJRXhwZXJpZW5jZVtdXG4gICAgLy8gd2lsbCBpbmNsdWRlIGluc3RhbmNlIGFuZCBkZWYgY29uZmlnIGluIG9yZGVyIHRvIHJlbmRlciBpbiBwcm9kdWN0aW9uXG4gICAgcmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudENvbmZpZ1tdXG59XG5cbmV4cG9ydCBjb25zdCBFeHBlcmllbmNlVHlwZXMgPSB7XG4gICAgXCJTZWdtZW50XCI6IFwiU2VnbWVudFwiLFxuICAgIFwiUHJvbW9cIjogXCJQcm9tb1wiLFxuICAgIFwiQUJcIjogXCJBQlwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBFeHBlcmllbmNlVHlwZXNcbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIC8vc3RpY2tpbmVzc0ZhY3RvclxuICAgIC8vRW5kRGF0ZVxufVxuXG4vLyBleHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2VHcm91cCB7XG4vLyAgICAgaWQ6IHN0cmluZ1xuLy8gICAgIG5hbWU6IHN0cmluZ1xuLy8gICAgIHBlcmNlbnRhZ2U6IG51bWJlclxuLy8gfVxuXG5leHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZTogdHlwZW9mIEV4cGVyaWVuY2VUeXBlcy5BQlxuICAgIC8vIGdyb3VwczogSUFCRXhwZXJpZW5jZUdyb3VwW11cbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIHBlcmNlbnRhZ2U6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEYXRlUmFuZ2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBzdGFydDogRGF0ZVxuICAgIGVuZDogRGF0ZVxuICAgIHRpbWV6b25lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIEV4cGVyaWVuY2VUeXBlc1xuICAgIHNlZ21lbnQ6IElTZWdtZW50RGVmaW5pdGlvblxuICAgIGRhdGVSYW5nZT86IElEYXRlUmFuZ2Vcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3dEZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGNvbXBvbmVudHM6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1tdO1xuICAgIG9yaWdpbnM6IHN0cmluZ1tdLFxuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgYnJhbmNoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudENvbmZpZyB7XG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xuICAgIHR5cGU6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICAvLyBUT0RPIDogdmVyaWZ5IHVuaXF1ZW5lc3MgKGRhc2hib2FyZCAmIHNlcnZlcilcbiAgICBuYW1lOiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIElCcmFuY2hhYmxlIHtcbiAgICBicmFuY2g/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3cgZXh0ZW5kcyBPbWl0PElVc2VyRmxvd0RlZmluaXRpb24sICdjb21wb25lbnRzJz4sIElCcmFuY2hhYmxlIHtcbiAgICBjb21wb25lbnRzOiBJQ29tcG9uZW50Q29uZmlnW11cbn1cblxuZXhwb3J0IGNsYXNzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdD86IFNoYWRvd1Jvb3QpIHtcblxuICAgIH1cblxuICAgIGdldFJvb3REaXYgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKS5xdWVyeVNlbGVjdG9yKCdkaXYnKVxuICAgIH1cblxuICAgIGdldFJvb3QgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlPFQ+ID1cbiAgICBUIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IC8vIEV4Y2x1ZGUgZnVuY3Rpb25zXG4gICAgICAgIFQgZXh0ZW5kcyBBcnJheTxpbmZlciBVPiA/IFNlcmlhbGl6YWJsZTxVPltdIDogLy8gSGFuZGxlIGFycmF5c1xuICAgICAgICAgICAgVCBleHRlbmRzIG9iamVjdCA/IHtcbiAgICAgICAgICAgICAgICBbSyBpbiBrZXlvZiBUIGFzIFRbS10gZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogS106IFNlcmlhbGl6YWJsZTxUW0tdPlxuICAgICAgICAgICAgfSA6IFQ7IC8vIEhhbmRsZSBvYmplY3RzXG5cbmNvbnN0IGlzUHJpbWl0aXZlID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBPYmplY3QodmFsdWUpO1xufVxuXG5jb25zdCBpc0Z1bmN0aW9uID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnRhaW5zUHJpbWl0aXZlc09ubHkgPSAob2JqKSA9PiB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24ob2JqKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjaGVjayBpZiBpdCdzIGEgbmVzdGVkIG9iamVjdFxuICAgICAgICAgICAgaWYgKCFjb250YWluc1ByaW1pdGl2ZXNPbmx5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBJdCdzIGEgcHJpbWl0aXZlLCBzbyB3ZSBjYW4gc2tpcCBpdFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBGb3VuZCBhIG5vbi1wcmltaXRpdmUgdmFsdWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlOyAvLyBBbGwgdmFsdWVzIGFyZSBwcmltaXRpdmVzIG9yIG5lc3RlZCBvYmplY3RzIHdpdGggcHJpbWl0aXZlc1xufVxuXG4vLyBjdXJyZW50bHkgc3VwcG9ydCByb290IGxldmVsIG9ubHlcbi8vIHt4OiAxLCB5IDogJ2EnLCB6IDogKCk9PnsuLi59LCBpbm5lciA6IHsgeDogMSAsIHkgOiAnYSd9IH1cbi8vIHt4OiAxLCB5IDogJ2EnfVxuLy9odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0dsb3NzYXJ5L0ZhbHN5XG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGVTa2VsZXRvbjxUPiA9IFBhcnRpYWw8UmVjb3JkPGtleW9mIFQsIGJvb2xlYW4gfCBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+Pj4+IHwgYm9vbGVhbjtcblxuZXhwb3J0IGNvbnN0IG1ha2VTZXJpYWxpemFibGUgPSA8VD4oXG4gICAgb2JqOiBULFxuICAgIHNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxUPiA9IHt9LFxuICAgIGluY2x1ZGVGYWxzeUtleXM6IGJvb2xlYW4gPSB0cnVlLCAvLyBUT0RPIDogdXNlIHRoYXQgYXJnXG4gICAgc2VlbjogV2Vha01hcDxvYmplY3QsIFNlcmlhbGl6YWJsZTxhbnk+PiA9IG5ldyBXZWFrTWFwKClcbik6IFNlcmlhbGl6YWJsZTxUPiA9PiB7XG5cbiAgICBpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gb2JqIGFzIFNlcmlhbGl6YWJsZTxUPjsgLy8gRGlyZWN0bHkgcmV0dXJuIHByaW1pdGl2ZSB2YWx1ZXNcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vlbi5nZXQob2JqKSE7IC8vIFJldHVybiB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgb2JqZWN0XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgYXJyYXkgc2VyaWFsaXphdGlvblxuICAgICAgICBjb25zdCBzZXJpYWxpemFibGVBcnJheTogU2VyaWFsaXphYmxlPGFueT5bXSA9IFtdO1xuICAgICAgICBzZWVuLnNldChvYmosIHNlcmlhbGl6YWJsZUFycmF5KTsgLy8gU3RvcmUgdGhlIGFycmF5IGluIHNlZW5cblxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgb2JqLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IG9ialtpbmRleF07XG4gICAgICAgICAgICBzZXJpYWxpemFibGVBcnJheVtpbmRleF0gPSBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQsIHNrZWxldG9uLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXphYmxlQXJyYXkgYXMgU2VyaWFsaXphYmxlPFQ+O1xuICAgIH1cblxuICAgIGlmIChvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGN5Y2xpYyByZWZlcmVuY2VzXG4gICAgICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vlbi5nZXQob2JqKSE7IC8vIFJldHVybiB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgb2JqZWN0XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VyaWFsaXphYmxlT2JqZWN0OiBQYXJ0aWFsPFNlcmlhbGl6YWJsZTxUPj4gPSB7fTtcbiAgICAgICAgc2Vlbi5zZXQob2JqLCBzZXJpYWxpemFibGVPYmplY3QpOyAvLyBTdG9yZSB0aGUgb2JqZWN0IGluIHNlZW5cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgaXMgaW4gdGhlIHNrZWxldG9uIGFuZCBpZiBpdCdzIGEgdmFsaWQga2V5IHRvIHNlcmlhbGl6ZVxuXG4gICAgICAgICAgICBjb25zdCBrZXlJblNrZWxldG9uID0gdHlwZW9mIHNrZWxldG9uID09IFwiYm9vbGVhblwiID8gc2tlbGV0b24gOiBza2VsZXRvbltrZXldO1xuXG4gICAgICAgICAgICBpZiAoa2V5SW5Ta2VsZXRvbikge1xuICAgICAgICAgICAgICAgIGlmIChrZXlJblNrZWxldG9uID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBza2VsZXRvbiBpbmRpY2F0ZXMgdG8gc2VyaWFsaXplIHRoaXMga2V5XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlRmFsc3lLZXlzID8gb2JqW2tleV0gIT09IHVuZGVmaW5lZCA6IG9ialtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemFibGVPYmplY3Rba2V5XSA9IG1ha2VTZXJpYWxpemFibGUob2JqW2tleV0sIHRydWUsIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Yga2V5SW5Ta2VsZXRvbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNrZWxldG9uIGluZGljYXRlcyBuZXN0ZWQga2V5cyB0byBzZXJpYWxpemVcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemFibGVPYmplY3Rba2V5XSA9IG1ha2VTZXJpYWxpemFibGUob2JqW2tleV0sIGtleUluU2tlbGV0b24sIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXphYmxlT2JqZWN0IGFzIFNlcmlhbGl6YWJsZTxUPjtcbiAgICB9XG5cbiAgICByZXR1cm4ge30gYXMgYW55OyAvLyBSZXR1cm4gYW4gZW1wdHkgb2JqZWN0IGZvciBvdGhlciBjYXNlc1xufVxuIiwgImV4cG9ydCBjb25zdCBFcnJvcnMgPSB7XG4gICAgbm90U2VyaWFsaXphYmxlUmVmQ2FsbDogKHByb3AsIGFyZykgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxuVGhlIGlucHV0IHByb3ZpZGVkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGlzIG5vdCBzZXJpYWxpemFibGUuIFNlcmlhbGl6YXRpb24gaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGRhdGEgY2FuIGJlIHNhZmVseSB0cmFuc2ZlcnJlZCB0byB0aGUgc2tpbiBpbXBsZW1lbnRhdGlvbi4gXG5UaGUgZm9sbG93aW5nIHR5cGVzIG9mIGRhdGEgYXJlIGNvbnNpZGVyZWQgbm9uLXNlcmlhbGl6YWJsZSBhbmQgY2Fubm90IGJlIHByb2Nlc3NlZDpcblxuLSBGdW5jdGlvbnNcbi0gRE9NIGVsZW1lbnRzXG4tIENsYXNzIGluc3RhbmNlc1xuLSBDaXJjdWxhciByZWZlcmVuY2VzXG4tIFN5bWJvbHNcbi0gQmlnSW50IHZhbHVlc1xuXG5JbiB0aGUgZm9sbG93aW5nIGV4ZWN1dGlvbiB3ZSBkZXRlY3RlZCA6XG5+fn5+fn5+flxuJHthcmd9IFxufn5+fn5+fn5cbmFzIG5vdCBzZXJpYWxpemFibGUuXG5cblRvIHJlc29sdmUgdGhpcyBpc3N1ZSwgcGxlYXNlIGVuc3VyZSB0aGF0IGFsbCBpbnB1dHMgcGFzc2VkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGFyZSBpbiBhIHNlcmlhbGl6YWJsZSBmb3JtYXQuXG5UaGlzIHR5cGljYWxseSBpbmNsdWRlcyBwcmltaXRpdmUgdHlwZXMgKHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zKSwgYXJyYXlzLCBhbmQgcGxhaW4gb2JqZWN0cy4gXG5JZiB5b3UgbmVlZCB0byBpbmNsdWRlIGNvbXBsZXggZGF0YSB0eXBlcywgY29uc2lkZXIgY29udmVydGluZyB0aGVtIHRvIGEgc2VyaWFsaXphYmxlIHN0cnVjdHVyZSBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZSBmdW5jdGlvbi5cbk9yIHVzZSBNeW9wIG1lc3NhZ2UgdGhhdCBzdXBwb3J0IGl0OiBDdXN0b21SZWZNZXNzYWdlLCBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSBvciBFeGVjdXRlU2NyaXB0TWVzc2FnZS5cblxuU3VnZ2VzdGVkIEZpeDpcbjEuIFJlbW92ZSBvciByZXBsYWNlIG5vbi1zZXJpYWxpemFibGUgdmFsdWVzIGZyb20geW91ciBpbnB1dC5cbjIuIElmIHVzaW5nIG9iamVjdHMsIGVuc3VyZSB0aGV5IGRvIG5vdCBjb250YWluIGFueSBmdW5jdGlvbnMgb3IgY2lyY3VsYXIgcmVmZXJlbmNlcy5cbjMuIENvbnZlcnQgYW55IGNsYXNzIGluc3RhbmNlcyB0byBwbGFpbiBvYmplY3RzIG9yIEpTT04tY29tcGF0aWJsZSBmb3JtYXRzLlxuNC4gVXNlIGRlZGljYXRlZCBNeW9wIG1lc3NhZ2UuXG5cbkZvciBtb3JlIGRldGFpbHMgb24gc2VyaWFsaXphdGlvbiBhbmQgTXlvcCBtZXNzYWdlIGV4YW1wbGVzLCByZWZlciB0byBodHRwczovL2RvY3MubXlvcC5kZXZcXC5cblxuYCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudCwgSU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0VudmVsb3BlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9FbnZlbG9wZWRNZXNzYWdlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wUmVmQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBwdWJsaWMgcGFyZW50OiBJTXlvcENvbXBvbmVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgLy9UT0RPIDogY2hlY2sgcGFyZW50Q29tcG9uZW50LmNvbnRhaW5lci4uLlxuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBwYXJlbnQuY29udGFpbmVyLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICAvL3RoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZChhcmd1bWVudHMuY2FsbGVlLm5hbWUpKTtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdoaWRlJykpO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2hvdycpKTtcbiAgICB9XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IHJlYWwgY2xlYW51cFxuICAgICAgICAvL2NvbnNvbGUubG9nKCdyZWYgaW5zcGVjdCBjYWxsZWQsIGNyZWF0aW5nIEV4ZWN1dGVDb21wb25lbnRNZXRob2QgaW5zcGVjdCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYsIHRoaXMuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdpbnNwZWN0JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0JykpO1xuICAgIH1cblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gJ011dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJykge1xuICAgICAgICAvLyAgZGVidWdnZXI7XG4gICAgICAgIC8vICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyB9XG4gICAgICAgIHJldHVybiBzdXBlci5vbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlKTtcbiAgICB9XG5cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ3JlZiBtZXNzYWdlIHNlbmRpbmcgJywgbWVzc2FnZSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlclxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgLy8gdGhpcy5pZCB3aWxsIGJlIGF2YWlsYWJsZSBvbiB0aGUgbmVzdGVkIGNvbXBvbmVudFxuICAgICAgICB0aGlzLnBhcmVudC5zZW5kKG5ldyBFbnZlbG9wZWRNZXNzYWdlKHRoaXMuaWQsIG1lc3NhZ2UpKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH07XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0luaXRpYXRlZClcbiAgICAgICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnZGlzcG9zZScpKTtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge3NldERlYnVnU3R5bGV9IGZyb20gXCIuLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5cbi8qKlxuICogQ29tcG9uZW50IHdyYXBwZXIgZm9yIE15b3AgV2ViIENvbXBvbmVudHMgdGhhdCBhcmUgZXh0cmFjdGVkIGZyb20gSFRNTFxuICogYW5kIHJ1biBkaXJlY3RseSBvbiB0aGUgaG9zdCBkb2N1bWVudCAobm90IGluIGFuIGlmcmFtZSkuXG4gKlxuICogVGhlc2UgY29tcG9uZW50cyB1c2UgdGhlIG5hdGl2ZSBXZWIgQ29tcG9uZW50cyBBUEkgKEN1c3RvbSBFbGVtZW50cyArIFNoYWRvdyBET00pXG4gKiBhbmQgY29tbXVuaWNhdGUgdmlhIGRpcmVjdCBtZXRob2QgY2FsbHMgYW5kIEN1c3RvbUV2ZW50cyBpbnN0ZWFkIG9mIHBvc3RNZXNzYWdlLlxuICovXG5leHBvcnQgY2xhc3MgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcbiAgICBwcml2YXRlIGN0YUNsZWFudXA/OiAoKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgX2N0YUhhbmRsZXI/OiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfY3RhUXVldWU6IEFycmF5PHthY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93bn0+ID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIHNraW46IElTa2luQ29uZmlnLFxuICAgICAgICBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgcHJpdmF0ZSBjdXN0b21FbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICAgICAgcHJpdmF0ZSB0YWdOYW1lOiBzdHJpbmcsXG4gICAgICAgIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudERlZmluaXRpb24sIGNvbnRhaW5lciwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGN1c3RvbUVsZW1lbnQ7XG5cbiAgICAgICAgLy8gV2ViIGNvbXBvbmVudHMgYXJlIGluaXRpYXRlZCBpbW1lZGlhdGVseSAobm8gcG9zdE1lc3NhZ2UgaGFuZHNoYWtlIG5lZWRlZClcbiAgICAgICAgdGhpcy5zZXRJbml0aWF0ZWQoKTtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdDogQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB7fTtcblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSBzZXREZWJ1Z1N0eWxlKHRoaXMuaWQsICdNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50JywgMCwgdGhpcy5jb250YWluZXIsIHRoaXMuY3VzdG9tRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cEluc3BlY3Q7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCc7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIGNvbXBvbmVudCB3aXRoIGRhdGEgYnkgY2FsbGluZyBteW9wX2luaXRfaW50ZXJmYWNlIGRpcmVjdGx5XG4gICAgICovXG4gICAgaW5pdFdpdGhEYXRhKGRhdGE6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5jdXN0b21FbGVtZW50IGFzIGFueSkubXlvcF9pbml0X2ludGVyZmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UoZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY3VycmVudCBkYXRhIGZyb20gdGhlIGNvbXBvbmVudFxuICAgICAqL1xuICAgIGdldERhdGEoKTogdW5rbm93biB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5jdXN0b21FbGVtZW50IGFzIGFueSkubXlvcF9pbml0X2ludGVyZmFjZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IENUQSBoYW5kbGVyIC0gdW5pZmllZCBBUEkgd2l0aCBpZnJhbWUgY29tcG9uZW50cy5cbiAgICAgKiBDYWxsZWQgdmlhIHByb3BzLm15b3BfY3RhX2hhbmRsZXIgPSBoYW5kbGVyXG4gICAgICovXG4gICAgc2V0Q3RhSGFuZGxlcihoYW5kbGVyOiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgcHJldmlvdXMgbGlzdGVuZXIgaWYgZXhpc3RzXG4gICAgICAgIGlmICh0aGlzLmN0YUNsZWFudXApIHtcbiAgICAgICAgICAgIHRoaXMuY3RhQ2xlYW51cCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY3RhSGFuZGxlciA9IGhhbmRsZXI7XG5cbiAgICAgICAgLy8gRmx1c2ggYW55IHF1ZXVlZCBDVEFzIHRoYXQgZmlyZWQgYmVmb3JlIGhhbmRsZXIgd2FzIHNldFxuICAgICAgICBpZiAodGhpcy5fY3RhUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcXVldWUgPSBbLi4udGhpcy5fY3RhUXVldWVdO1xuICAgICAgICAgICAgdGhpcy5fY3RhUXVldWUgPSBbXTtcbiAgICAgICAgICAgIHF1ZXVlLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIoaXRlbS5hY3Rpb24sIGl0ZW0ucGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdXAgZXZlbnQgbGlzdGVuZXJcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZSBhcyBDdXN0b21FdmVudDtcbiAgICAgICAgICAgIGlmIChjdXN0b21FdmVudC5kZXRhaWw/LmFjdGlvbikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jdGFIYW5kbGVyICYmICF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2N0YUhhbmRsZXIoY3VzdG9tRXZlbnQuZGV0YWlsLmFjdGlvbiwgY3VzdG9tRXZlbnQuZGV0YWlsLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2N0YUhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUXVldWUgaWYgaGFuZGxlciBub3QgeWV0IHNldCAoc2hvdWxkbid0IGhhcHBlbiBhZnRlciBzZXRDdGFIYW5kbGVyLCBidXQgc2FmZXR5KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdGFRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogY3VzdG9tRXZlbnQuZGV0YWlsLmFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGN1c3RvbUV2ZW50LmRldGFpbC5wYXlsb2FkXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbXlvcC1jdGEnLCBsaXN0ZW5lcik7XG4gICAgICAgIHRoaXMuY3RhQ2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdteW9wLWN0YScsIGxpc3RlbmVyKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIG1lc3NhZ2UtYmFzZWQgY29tcG9uZW50cy5cbiAgICAgKiBXZWIgY29tcG9uZW50cyBkb24ndCB1c2UgcG9zdE1lc3NhZ2UsIHNvIHRoaXMgaXMgYSBuby1vcCBmb3IgbW9zdCBtZXNzYWdlcy5cbiAgICAgKi9cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZTxhbnk+KSA9PiB7XG4gICAgICAgIC8vIFdlYiBjb21wb25lbnRzIGRvbid0IHVzZSB0aGUgcG9zdE1lc3NhZ2Ugc3lzdGVtXG4gICAgICAgIC8vIEluc3RlYWQsIGludGVyYWN0IGRpcmVjdGx5IHZpYSBwcm9wcy5teW9wX2luaXRfaW50ZXJmYWNlIGFuZCBwcm9wcy5teW9wX2N0YV9oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlKTtcblxuICAgICAgICAvLyBMb2cgZm9yIGRlYnVnZ2luZ1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudF0gc2VuZCgpIGNhbGxlZCAtIHdlYiBjb21wb25lbnRzIHVzZSBkaXJlY3QgQVBJIGluc3RlYWQnLCBtZXNzYWdlKTtcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY3RhQ2xlYW51cCkge1xuICAgICAgICAgICAgdGhpcy5jdGFDbGVhbnVwKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5jdXN0b21FbGVtZW50KTtcbiAgICB9XG59XG4iLCAiLy90eXBlIEFDb25zdHJ1Y3RvclR5cGVPZjxUPiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIEN1c3RvbVJlZk1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQgKiBhcyBtZXNzYWdlcyBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQ2xlYW51cEhhbmRsZXIsIElDb21wb25lbnRDb25maWcsXG4gICAgdHlwZSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJQ29tcG9uZW50UmVmQmVoYXZpb3IsIElIVE1MTG9hZGVyQ29uZmlnLCBJUHJvcENvZGVCZWhhdmlvcixcbiAgICBJUHJvcENvbmZpZywgSVNraW5Db25maWcsIFByb3BDb25maWdCZWhhdmlvclR5cGVzLFxuICAgIFJlZkJlaGF2aW9yVHlwZSwgU2hhZG93Um9vdE1vZGVUeXBlLCBTa2luTG9hZGVycywgU2tpbkxvYWRlclR5cGVcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtjb250YWluc1ByaW1pdGl2ZXNPbmx5fSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb25cIjtcbmltcG9ydCB7RXJyb3JzfSBmcm9tIFwiLi9sb2dNZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wUmVmQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL215b3BSZWZDb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9teW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50XCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuL2hvc3RTREtcIjtcblxudHlwZSBjb21wb25lbnREZWZpbml0aW9uUHJvcHMgPSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1sncHJvcHMnXVxuXG5jb25zdCBjcmVhdGVEZWJ1Z1RpdGxlID0gKHRleHQ6IHN0cmluZywgdG9wOiBudW1iZXIsIGNvbXBvbmVudERlZmluaXRpb25Db25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICB0aXRsZUVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICB0aXRsZUVsLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB0aXRsZUVsLnN0eWxlLnBhZGRpbmcgPSAnMCA1cHgnO1xuICAgIHRpdGxlRWwuc3R5bGUuZm9udFNpemUgPSAnMTRweCc7XG4gICAgdGl0bGVFbC5zdHlsZVsndG9wJ10gPSAnMCc7XG4gICAgdGl0bGVFbC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgIC8vdGl0bGVFbC5zdHlsZS5sZWZ0ID0gJzUwJSc7XG4gICAgdGl0bGVFbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgtNTAlKSc7XG4gICAgdGl0bGVFbC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICB0aXRsZUVsLmhyZWYgPSBgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudERlZmluaXRpb25Db25maWcuaWR9YFxuXG4gICAgcmV0dXJuIHRpdGxlRWw7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RGVidWdTdHlsZSA9IChpZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgIC8vIzAwN0JGRiAoYmx1ZSkgb3IgI0ZGNTcyMiAob3JhbmdlKVxuICAgIC8vIzRDQUY1MCAoZ3JlZW4pIG9yICNGRkMxMDcgKGFtYmVyKVxuICAgIC8vIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2lkfSA6ICR7dHlwZX1gLCB0b3AsIGNvbXBvbmVudERlZmluaXRpb25Db25maWcpO1xuICAgIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2NvbXBvbmVudERlZmluaXRpb25Db25maWcubmFtZX0gOiAke3R5cGV9YCwgdG9wLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKTtcbiAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHRvcFRleHQsIGNvbXBvbmVudEVsZW1lbnQpO1xuICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjMDA3QkZGJztcbiAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5ib3JkZXIgPSAndW5zZXQnO1xuICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQodG9wVGV4dCk7XG4gICAgfVxufVxuXG5jb25zdCByZXBvcnRFcnJvciA9IChwcm9wQ29uZmlnOiBJUHJvcENvbmZpZywgcHJvcE5hbWU6IHN0cmluZywgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudDxhbnksIGFueT4pID0+IHtcbiAgICBpZiAoIXByb3BDb25maWcpIHtcblxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEVycm9yOiBVbmRlZmluZWQgUHJvcFxcblxcbmAgK1xuICAgICAgICAgICAgYEl0IGxvb2tzIGxpa2UgeW91J3ZlIHRyaWVkIHRvIHVzZSBhIHByb3AgdGhhdCBoYXNuJ3QgYmVlbiBkZWZpbmVkLlxcbmAgK1xuICAgICAgICAgICAgYFBsZWFzZSBjaGVjayB0aGUgcHJvcCBuYW1lIGZvciBhbnkgdHlwb3Mgb3IgZW5zdXJlIHRoYXQgaXQgaXMgcHJvcGVybHkgZGVmaW5lZCBpbiB0aGUgY29tcG9uZW50J3MgcHJvcCBsaXN0LlxcblxcbmAgK1xuICAgICAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wTmFtZX1cXG5gICtcbiAgICAgICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICAgICAgYEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgY29tcG9uZW50IHBhZ2UgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfSBvciBjb25zdWx0IHRoZSBkZXZlbG9wZXIgZ3VpZGUuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuY29uc3QgcmVwb3J0VW5zdXBwb3J0ZWQgPSAocHJvcENvbmZpZzogSVByb3BDb25maWcsIHByb3BOYW1lOiBzdHJpbmcsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQ8YW55LCBhbnk+KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEVycm9yOiBDb2RlIFByb3AgTm90IFN1cHBvcnRlZFxcblxcbmAgK1xuICAgICAgICBgQ3VycmVudGx5LCBjb2RlIHByb3BzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBsb2NhbCBmcmFtZSBjb21wb25lbnRzLlxcbmAgK1xuICAgICAgICBgXHUyNkEwXHVGRTBGIFRoaXMgaXMgYSB3b3JrIGluIHByb2dyZXNzIGZlYXR1cmUgXHUyMDE0IGNvZGUgcHJvcHMgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gdXBjb21pbmcgdmVyc2lvbnMuXFxuXFxuYCArXG4gICAgICAgIGBJbiB0aGUgbWVhbnRpbWUsIHlvdSBjYW4gdXNlIG1lc3NhZ2UgcHJvcHMuXFxuXFxuYCArXG4gICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcE5hbWV9XFxuYCArXG4gICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBjb21wb25lbnQgcGFnZSBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9IG9yIGNvbnN1bHQgdGhlIGRldmVsb3BlciBndWlkZS5gXG4gICAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbm5lY3RQcm9wcyA9IDxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPihjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBwcm9wc0NvbmZpZzogSVByb3BDb25maWdbXSwgc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuXG4gICAgY29uc3QgcHJvcHNNYXAgPSBwcm9wc0NvbmZpZy5yZWR1Y2UoKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucHJldmlvdXNWYWx1ZSxcbiAgICAgICAgICAgIFtjdXJyZW50VmFsdWUubmFtZV06IHsuLi5jdXJyZW50VmFsdWV9XG4gICAgICAgIH1cbiAgICB9LCB7fSk7XG5cbiAgICBjb25zdCBwcm9wc0hhbmRsZXIgPSB7XG4gICAgICAgIGdldDogKF86IElNeW9wQ29tcG9uZW50LCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHByb3BDb25maWcgPSBwcm9wc01hcFtwcm9wXTtcblxuICAgICAgICAgICAgaWYgKHJlcG9ydEVycm9yKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZXh0cmFjdGVkIHdlYiBjb21wb25lbnRzIEZJUlNUXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9pbml0X2ludGVyZmFjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBhIGZ1bmN0aW9uIHRoYXQgZ2V0cy9zZXRzIGRhdGEgKG1hdGNoZXMgaWZyYW1lIGJlaGF2aW9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkYXRhPzogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG15b3BfY3RhX2hhbmRsZXIsIHJldHVybiB1bmRlZmluZWQgKGl0J3Mgd3JpdGUtb25seSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBGb3IgaWZyYW1lIChsb2NhbEZyYW1lKSBjb21wb25lbnRzXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSA9PT0gU2tpbkxvYWRlcnMuSFRNTExvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZExvYWRlciA9IHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZExvYWRlci5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuZWxlbWVudC5jb250ZW50V2luZG93W3R5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3BdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXBvcnRVbnN1cHBvcnRlZChwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcubW9kZSA9PT0gJ291dHB1dCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVBhcmFtczogYW55W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCBpbnRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaChSZWYuY3JlYXRlKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goLi4ucHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlQ3RvciA9IG1lc3NhZ2VzW3Byb3BDb25maWcuYmVoYXZpb3IubWVzc2FnZV07XG5cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IG1lc3NhZ2VDdG9yKC4uLm1lc3NhZ2VQYXJhbXMpKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiAoXzogSU15b3BDb21wb25lbnQsIHByb3A6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgcHJvcENvbmZpZyA9IHByb3BzTWFwW3Byb3BdO1xuXG4gICAgICAgICAgICBpZiAocmVwb3J0RXJyb3IocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZSkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudHMgRklSU1QgKGJlZm9yZSBsb2NhbEZyYW1lIGNoZWNrKVxuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgZXh0cmFjdGVkIHdlYiBjb21wb25lbnRzIG1heSBoYXZlIHNoYWRvd1Jvb3RNb2RlOiBsb2NhbEZyYW1lIGluIHRoZWlyIGNvbmZpZ1xuICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGV5IHJ1biBkaXJlY3RseSBvbiB0aGUgaG9zdCBkb2N1bWVudCwgbm90IGluIGFuIGlmcmFtZVxuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfY3RhX2hhbmRsZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2V0Q3RhSGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfaW5pdF9pbnRlcmZhY2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5pdFdpdGhEYXRhKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRm9yIGlmcmFtZSAobG9jYWxGcmFtZSkgY29tcG9uZW50c1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUgPT09IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRMb2FkZXIgPSBzZWxlY3RlZFNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRMb2FkZXIuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5sb2NhbEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50V2luZG93ID0gKGNvbXBvbmVudC5lbGVtZW50IGFzIEhUTUxJRnJhbWVFbGVtZW50KS5jb250ZW50V2luZG93IGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSByZWFsIGhhbmRsZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRXaW5kb3dbcHJvcE5hbWVdID0gdmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZsdXNoIENUQSBxdWV1ZSBpZiB0aGlzIGlzIG15b3BfY3RhX2hhbmRsZXIgYW5kIHF1ZXVlIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9jdGFfaGFuZGxlcicgJiYgY29udGVudFdpbmRvdy5fX215b3BfY3RhX3F1ZXVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVldWUgPSBjb250ZW50V2luZG93Ll9fbXlvcF9jdGFfcXVldWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFdpbmRvdy5fX215b3BfY3RhX3F1ZXVlID0gbnVsbDsgLy8gQ2xlYXIgdG8gcHJldmVudCBkb3VibGUtZmx1c2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS5mb3JFYWNoKChpdGVtOiB7YWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IGFueX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBpZiBjb21wb25lbnQgd2FzIGRpc3Bvc2VkIGR1cmluZyBmbHVzaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm1hcmtlZEZvckRpc3Bvc2VkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKGl0ZW0uYWN0aW9uLCBpdGVtLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVwb3J0VW5zdXBwb3J0ZWQocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vaWYocHJvcENvbmZpZy5iZWhhdmlvciA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMubWVzc2FnZSlcbiAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5tb2RlID09PSAnaW5wdXQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgbXVsdGkgYmVoYXZpb3JzXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gJ21lc3NhZ2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlUGFyYW1zOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCBpbnRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKFJlZi5jcmVhdGUocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goLi4ucHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlQ3RvciA9IG1lc3NhZ2VzW3Byb3BDb25maWcuYmVoYXZpb3IubWVzc2FnZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgbWVzc2FnZUN0b3IoLi4ubWVzc2FnZVBhcmFtcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3I6IFVuc3VwcG9ydGVkIEJlaGF2aW9yXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoZSAnYmVoYXZpb3InIGZpZWxkIHByb3ZpZGVkIGlzIG5vdCBzdXBwb3J0ZWQuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBCZWhhdmlvciBGaWVsZDogJHtwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGV9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYENoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB2YWxpZCBiZWhhdmlvciBvcHRpb25zLmBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnQucHJvcHMgPSB7fTtcbiAgICBjb21wb25lbnQucHJvcHMgPSBuZXcgUHJveHkoY29tcG9uZW50LnByb3BzLCBwcm9wc0hhbmRsZXIpO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudCBhcyAoT21pdDxJTXlvcENvbXBvbmVudCwgJ3Byb3BzJz4gJiB7XG4gICAgICAgIHByb3BzOiBwcm9wVHlwZXM8VD5cbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmUHJveHkgPSAodGFyZ2V0OiBSZWYsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHRhcmdldCwge1xuICAgICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG5cbiAgICAgICAgICAgIC8vIGlmIChwcm9wID09PSAnX19ub25Qcm94aWVkJykge1xuICAgICAgICAgICAgLy8gICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh0YXJnZXRbcHJvcF0pIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgZ2V0dGVyRnVuY3Rpb24gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhcmdzLmZvckVhY2goYXJnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGFpbnNQcmltaXRpdmVzT25seShhcmcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLm5vdFNlcmlhbGl6YWJsZVJlZkNhbGwocHJvcCwgYXJnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBwcm9wTmFtZSwgZnVuY3Rpb25BcmdzLCBtYWtlU2VyaWFsaXphYmxlfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlZltwcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWtlU2VyaWFsaXphYmxlKHJlZltwcm9wTmFtZV0oLi4uZnVuY3Rpb25BcmdzKSwgdHJ1ZSkgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbmQgcmV0dXJuIGl0cyByZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWtlU2VyaWFsaXphYmxlKHZhbHVlLCB0cnVlKTsgLy8gUmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IHRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogdGFyZ2V0LnJlZkNvbmZpZy5zZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogcHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFyZ3M6IGFyZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShtc2cuY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vVE9ETzogd2UgY2FuIGltcGxlbWVudCB0aGluZ3MgbGlrZSBhdXRvIHNlcmlhbGl6YXRpb24gYW5kIGJpbmRpbmcgZnVuY3Rpb25zIGhlcmVcbiAgICAgICAgICAgIC8vZ2V0dGVyRnVuY3Rpb24udGVzdCA9ICcxMjMnO1xuXG4gICAgICAgICAgICByZXR1cm4gZ2V0dGVyRnVuY3Rpb247XG5cbiAgICAgICAgICAgIC8vcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCh0YXJnZXQsIHByb3A6IHN0cmluZywgdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBwcm9wTmFtZSwgcHJvcFZhbHVlfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVmKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogZml4IHRoYXRcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiB0YXJnZXQucmVmQ29uZmlnLnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBwcm9wVmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogcHJvcFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBsb2c/XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlZkNvbXBvbmVudCA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4ocmVmOiBSZWYsIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpOiBQcm9taXNlPFQ+ID0+IHtcbiAgICBjb25zdCBjb21wb25lbnQgPSByZWYuY29tcG9uZW50O1xuICAgIGlmICghY29tcG9uZW50KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbnQgY3JlYXRlUmVmQ29tcG9uZW50IHdpdGggZGV0YWNoZWQgcmVmJyk7XG5cbiAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkJywgcmVmLCBjb21wb25lbnRDb25maWcpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gbmV3IE15b3BSZWZDb21wb25lbnQoY29tcG9uZW50Q29uZmlnLnR5cGUsIGNvbXBvbmVudCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbXBvbmVudHMucHVzaChyZWZDb21wb25lbnQpO1xuXG4gICAgICAgIC8vZm9yIGNhc2VzIHdoZXJlIHJlZiBjb21wb25lbnRzIGRlZmluZSBpbiB0aGUgY29tcG9uZW50IGNvbmZpZ1xuICAgICAgICAvLyB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSByb290IGNvbXBvbmVudCB0aGUgYmUgaW5pdGlhdGVkIGJlZm9yZSBpbnRlcmFjdGluZyB3aXRoIGl0XG4gICAgICAgIGF3YWl0IGNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuXG4gICAgICAgIC8vVE9ETyA6XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vcmVqZWN0KCd0aW1lb3V0PycpO1xuICAgICAgICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgICAgIH0sIDUwMDApO1xuXG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlKHJlZi5yZWZDb25maWcsXG4gICAgICAgICAgICBjb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucyA/IG9wdGlvbnMgOiB7fSxcbiAgICAgICAgICAgICAgICBpZDogcmVmQ29tcG9uZW50LmlkLFxuICAgICAgICAgICAgICAgIF9oYXNQYXJlbnQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyAobWVzc2FnZSkgPT4ge1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgaWYgdGltZW91dCBhbHJlYWR5IHBhc3NlZFxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmZhaWxlZCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOlxuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgZmFpbGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCA9IGNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT0gcmVmQ29tcG9uZW50LmlkKTtcblxuICAgICAgICAgICAgICAgIC8vc2FtZSBtZW1vcnkgZW52LCBzYW1lIEhvc3RTREtcbiAgICAgICAgICAgICAgICBpZiAoaW1wbGVtZW50YXRpb25Db21wb25lbnQgIT09IHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBjbGVhbiByZWZDb21wb25lbnQgP1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCBhcyB1bmtub3duIGFzIFQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnNldEluaXRpYXRlZCgpXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogaGVyZSA+XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogd2hhdCBhYm91dCByZWFwdGVycyA/ISBkeW5hbWljID8hXG4gICAgICAgICAgICAgICAgLy8gY29uc3QgZXhzaXN0aW5nUmVmQ29tcG9uZW50ID0gY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSBhcyBNeW9wUmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vIGlmIChleHNpc3RpbmdSZWZDb21wb25lbnQuaWQgJiYgZXhzaXN0aW5nUmVmQ29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gW2NvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0sIHJlZkNvbXBvbmVudF07XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0ucHVzaChyZWZDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7IC8vaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSByZWZDb21wb25lbnQuaWQpITtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBpbiB3ZWJjb21wb25lbnQgY2FzZSB0aGUgc2FtZSBpZCB3aWxsIGFscmVkYXkgYmUgaGVyZSwgd2hpY2ggaXMgZ29vZCAhXG4gICAgICAgICAgICAgICAgLy8gbmFtZTpcbiAgICAgICAgICAgICAgICAvLyAgICAgaWRcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkXG5cbiAgICAgICAgICAgICAgICAvLyBmb3IgaW5uZXIgY29tcG9uZW50cyBpbnNpZGUgcmVmIGNvbXBvbmVudCA6XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5uZXN0ZWRSZWZzLmZvckVhY2gobmVzdGVkUmVmQ29uZmlnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHMhLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpIS50eXBlO1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IG5lc3RlZENvbXBvbmVudERlZmluaXRpb24gPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zPy5maW5kKGRlZiA9PiBkZWYuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpITtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgcmVmQ29uZmlnID0gY29tcG9uZW50Q29uZmlnLnR5cGUucmVmcy5maW5kKHIgPT4gci5uYW1lID09PSBuZXN0ZWRSZWZDb25maWcucmVmTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmICghcmVmQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIHJlZkNvbmZpZyBmb3VuZCBmb3IgbmVzdGVkIHJlZicpO1xuICAgICAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBuZXcgTXlvcFJlZkNvbXBvbmVudChuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uLCByZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICBuZXN0ZWRDb21wb25lbnQuc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5yZWZzW25lc3RlZFJlZkNvbmZpZy5yZWZOYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKG5lc3RlZENvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RSZWZzKHJlZkNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOnVzZSBjb25maWcgY2hlY2sgZm9yIGF1dG8taGlnaHQgYW5kIGNvbnZlcnQgdHlwZSBwcm9wZXJseVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZWZDb21wb25lbnQgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdyBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0UmVmcyA9IGFzeW5jIChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10sIHdpdGhvdXRSZWZDb21wb25lbnRzOiBib29sZWFuID0gZmFsc2UpID0+IHtcblxuICAgIGlmICghY29tcG9uZW50LnJlZnMpXG4gICAgICAgIGNvbXBvbmVudC5yZWZzID0ge307XG5cbiAgICBjb25zdCB3YWl0Rm9yID0gT2JqZWN0LnZhbHVlcyhjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZWZzKS5tYXAocmVmID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWYuYmVoYXZpb3IudHlwZSA9PSBSZWZCZWhhdmlvclR5cGUuY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID1cblxuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0UmVmQ29tcG9uZW50cykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hhbmdlIHRvIGdldCBpdCBmcm9tIHRoZSBmbG93XG4gICAgICAgICAgICAgICAgbGV0IHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmNvbXBvbmVudElkO1xuICAgICAgICAgICAgICAgIGlmICghcmVmQ29tcG9uZW50SWQpXG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmluc3RhbmNlLmNvbXBvbmVudElkXG5cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVqZWN0KG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgLy90aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMhLmZpbmQoY29tcGRlZiA9PiBjb21wZGVmLmlkID09PSByZWZDb21wb25lbnRJZCkhO1xuICAgICAgICAgICAgICAgIC8vIC8vY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGF3YWl0IGdldENvbXBvbmVudERlZmluaXRpb25Db25maWcoY29tcG9uZW50SW5zdGFuY2VDb25maWcuY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJlamVjdChuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE86IGlmIHdlIGhhdmUgdGhlIHNhbWUgY29tcG9uZW50IG1vcmUgdGhhbiBvbmNlIHdlIHdpbGwgbmVlZCBpbnN0YW5jZSBpZCBoZXJlIC4uLlxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudENvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHM/LmZpbmQobmVzdGVkQ29tcG9uZW50ID0+IG5lc3RlZENvbXBvbmVudC50eXBlLmlkID09PSByZWZDb21wb25lbnRJZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIW5lc3RlZENvbXBvbmVudENvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IG5lc3RlZENvbXBvbmVudENvbmZpZyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9jb25zdCBjb21wb25lbnRJbnN0YW5jZUNvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5uZXN0ZWRDb21wb25lbnRzPy5maW5kKGNvbXBvbmVudEluc3RhY2UgPT4gY29tcG9uZW50SW5zdGFjZS5jb21wb25lbnRJZCA9PT0gY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5pZCk7XG4gICAgICAgICAgICAgICAgLy8gaWYoIWNvbXBvbmVudERlZmluaXRpb25Db25maWcpe1xuICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE8gVE9ETyBUT0RPICcpO1xuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDp0aGluayBhYm91dCB0aGF0IDpcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudERlZmluaXRpb25Db25maWcucmVzb2x2ZWREZWZpbml0aW9ucyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnM7XG4gICAgICAgICAgICAgICAgLy8gICBjb25zdCBuZXN0ZWRDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgaW5zdGFuY2U6IG5lc3RlZENvbXBvbmVudENvbmZpZy5pbnN0YW5jZSEsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgdHlwZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLnR5cGUsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgbmFtZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLm5hbWVcbiAgICAgICAgICAgICAgICAvLyAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IF9yZWYgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCduZXN0ZWQgISEgY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBhd2FpdCBjcmVhdGVSZWZDb21wb25lbnQoX3JlZiwgbmVzdGVkQ29tcG9uZW50Q29uZmlnISwgY29tcG9uZW50cylcbiAgICAgICAgICAgICAgICAgICAgLy9URE9PIDogcHV0IHRoYXQgcmVmIGNvbXBvbmVudCBzb21ld2hlcmU/XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBfX25vblByb3hpZWQgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IGNyZWF0ZVJlZlByb3h5KF9fbm9uUHJveGllZCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgnPycpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH0pXG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdEZvcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgIHRocm93IGU7XG4gICAgfVxuXG59XG5cbmV4cG9ydCB0eXBlIHByb3BUeXBlczxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPiA9IHtcbiAgICBbUHJvcGVydHkgaW4ga2V5b2YgVF06XG4gICAgVFtQcm9wZXJ0eV0gZXh0ZW5kcyB7IG1vZGU6ICdpbnB1dCcgfSA/XG4gICAgICAgIFRbUHJvcGVydHldWyd0eXBlJ10gOlxuICAgICAgICBQcm9taXNlPFRbUHJvcGVydHldWyd0eXBlJ10+XG59XG5cbmV4cG9ydCBjb25zdCBleGVjID0gYXN5bmMgKGdldHRlcjogYW55KSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGdldHRlcigpXG59XG5cbmV4cG9ydCBjb25zdCBhY3RBcyA9IDxUPihyZWY6IFJlZikgPT4ge1xuICAgIHJldHVybiByZWYgYXMgdW5rbm93biBhcyBGdW5jdGlvbmlmeVJlZjxUPlxufVxuXG5leHBvcnQgdHlwZSBGdW5jdGlvbmlmeVJlZjxUID0gYW55PiA9IHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSIC8vIElmIGl0J3MgYSBmdW5jdGlvblxuICAgICAgICA/ICguLi5hcmdzOiBBKSA9PiBQcm9taXNlPFI+IC8vIENvbnZlcnQgaXQgdG8gYSBwcm9taXNlZCBmdW5jdGlvblxuICAgICAgICA6IFRbS11cbn07XG4iLCAiaW1wb3J0IHtBdXRvU2l6ZU9wdGlvbnMsIEJhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCxcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgTWVzc2FnZURpcmVjdGlvblxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJSWZyYW1lTG9hZGVyQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzLnRzXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wSWZyYW1lQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHJpdmF0ZSBJZnJhbWVFbGVtZW50OiBIVE1MSUZyYW1lRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoY29tcG9uZW50Q29uZmlnLCBjb250YWluZXIsIG9wdGlvbnMpXG5cbiAgICAgICAgaWYgKChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKS5hdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYXRlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVsZW1lbnQgPSB0aGlzLklmcmFtZUVsZW1lbnQ7XG4gICAgICAgIC8vIHRoaXMuSWZyYW1lRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KVxuICAgICAgICAvLyAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QoYElmcmFtZUVsZW1lbnQgZXJyb3JgKTtcbiAgICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgc2l6ZU1ldGE/OiB7IHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyOyBoZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7IG1pbldpZHRoPzogbnVtYmVyOyBtYXhXaWR0aD86IG51bWJlcjsgbWluSGVpZ2h0PzogbnVtYmVyOyBtYXhIZWlnaHQ/OiBudW1iZXIgfSB8IG51bGw7XG5cbiAgICBjbGVhbnVwSW5zcGVjdD86IENsZWFudXBIYW5kbGVyO1xuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgLy8gVE9ETyA6IHVzZSBiZXR0ZXIgY2hlY2sgZm9yIGluc3BlY3QgbW9kZVxuICAgICAgICBpZiAodGhpcy5jbGVhbnVwSW5zcGVjdCkge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnaW5zcGVjdCBjYWxsIG1vcmUgdGhhbiBvbmNlJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSBzZXREZWJ1Z1N0eWxlKHRoaXMuaWQsICdNeW9wSWZyYW1lQ29tcG9uZW50JywgMTAsIHRoaXMuY29udGFpbmVyLCB0aGlzLklmcmFtZUVsZW1lbnQsIHRoaXMuY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ISgpO1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50fXB4YDtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBvYnNlcnZlU2l6ZUJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3NlbmR9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgc2VuZCh7aGVpZ2h0LCB3aWR0aH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgICAgICAgICByZXR1cm4ge2hlaWdodCwgd2lkdGh9XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3JldC5jb250ZW50LndpZHRofXB4YDtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudC5oZWlnaHR9cHhgO1xuICAgICAgICB9KSk7XG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9ic2VydmVzIHRoZSBpZnJhbWUgY29udGVudCBzaXplIGFuZCBhdXRvbWF0aWNhbGx5IHN5bmNzIGl0IHRvIHRoZSBpZnJhbWUgZWxlbWVudC5cbiAgICAgKiBVc2VzIGRpcmVjdCBjb250ZW50RG9jdW1lbnQgYWNjZXNzIChzYW1lLW9yaWdpbiBvbmx5KSBmb3IgYWNjdXJhdGUgbWVhc3VyZW1lbnRzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZyBzaXplIGNoYW5nZSBjYWxsYmFjayBhbmQgbWluL21heCBjb25zdHJhaW50c1xuICAgICAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gc3RvcCBvYnNlcnZpbmdcbiAgICAgKi9cbiAgICBvYnNlcnZlQXV0b1NpemUgPSAob3B0aW9ucz86IEF1dG9TaXplT3B0aW9ucyk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgY29uc3QgaWZyYW1lID0gdGhpcy5JZnJhbWVFbGVtZW50O1xuICAgICAgICBjb25zdCBkb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50O1xuXG4gICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tNeW9wSWZyYW1lQ29tcG9uZW50XSBDYW5ub3Qgb2JzZXJ2ZSBhdXRvIHNpemU6IGNvbnRlbnREb2N1bWVudCBub3QgYWNjZXNzaWJsZScpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhbXAgPSAodmFsdWU6IG51bWJlciwgbWluPzogbnVtYmVyLCBtYXg/OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgICAgICAgICAgaWYgKG1pbiAhPT0gdW5kZWZpbmVkICYmIHZhbHVlIDwgbWluKSByZXR1cm4gbWluO1xuICAgICAgICAgICAgaWYgKG1heCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlID4gbWF4KSByZXR1cm4gbWF4O1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFBhcnNlIENTUyBzaXplIHZhbHVlcyB0byBudW1iZXJzXG4gICAgICAgIGNvbnN0IHBhcnNlU2l6ZSA9ICh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gaXNOYU4ocGFyc2VkKSA/IHVuZGVmaW5lZCA6IHBhcnNlZDtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBtaW5XaWR0aCA9IHBhcnNlU2l6ZShvcHRpb25zPy5taW5XaWR0aCk7XG4gICAgICAgIGNvbnN0IG1heFdpZHRoID0gcGFyc2VTaXplKG9wdGlvbnM/Lm1heFdpZHRoKTtcbiAgICAgICAgY29uc3QgbWluSGVpZ2h0ID0gcGFyc2VTaXplKG9wdGlvbnM/Lm1pbkhlaWdodCk7XG4gICAgICAgIGNvbnN0IG1heEhlaWdodCA9IHBhcnNlU2l6ZShvcHRpb25zPy5tYXhIZWlnaHQpO1xuICAgICAgICBjb25zdCBsb2FkZXJNaW5IZWlnaHQgPSBvcHRpb25zPy5sb2FkZXJNaW5IZWlnaHQgPz8gNTA7XG5cbiAgICAgICAgLy8gUmVzb2x2ZSBleHBsaWNpdCBkaW1lbnNpb25zOiBob3N0IG9wdGlvbnMgXHUyMTkyIHNpemVNZXRhIGZpbGwgbW9kZSBcdTIxOTIgd2lkdGggZGVmYXVsdHMgdG8gXCIxMDAlXCJcbiAgICAgICAgLy8gV2lkdGggZGVmYXVsdHMgdG8gXCIxMDAlXCIgKGJsb2NrIGVsZW1lbnQgYmVoYXZpb3IpIHRvIHByZXZlbnQgdGhlIHNocmluay10by0wIG1lYXN1cmVtZW50IGJ1Zy5cbiAgICAgICAgLy8gSGVpZ2h0IGhhcyBubyBkZWZhdWx0IHNvIGl0IGF1dG8tc2l6ZXMgdG8gY29udGVudC5cbiAgICAgICAgLy8gT25seSBzaXplTWV0YSBcIjEwMCVcIiAoZmlsbCBtb2RlKSBpcyB0cmVhdGVkIGFzIGV4cGxpY2l0IGFuZCBkaXNhYmxlcyBhdXRvLXNpemluZy5cbiAgICAgICAgLy8gUGl4ZWwgc2l6ZU1ldGEgdmFsdWVzIChlLmcuLCBoZWlnaHQ6IDIwMCkgYXJlIGluaXRpYWwgaGludHMsIE5PVCBleHBsaWNpdCBjb25zdHJhaW50cy5cbiAgICAgICAgY29uc3Qgc2l6ZU1ldGFGaWxsV2lkdGggPSB0aGlzLnNpemVNZXRhPy53aWR0aCA9PT0gXCIxMDAlXCIgPyBcIjEwMCVcIiA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc2l6ZU1ldGFGaWxsSGVpZ2h0ID0gdGhpcy5zaXplTWV0YT8uaGVpZ2h0ID09PSBcIjEwMCVcIiA/IFwiMTAwJVwiIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCByZXNvbHZlZEV4cGxpY2l0V2lkdGggPSBvcHRpb25zPy5leHBsaWNpdFdpZHRoID8/IHNpemVNZXRhRmlsbFdpZHRoID8/IFwiMTAwJVwiO1xuICAgICAgICBjb25zdCByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ID0gb3B0aW9ucz8uZXhwbGljaXRIZWlnaHQgPz8gc2l6ZU1ldGFGaWxsSGVpZ2h0O1xuICAgICAgICBjb25zdCBoYXNFeHBsaWNpdFdpZHRoID0gcmVzb2x2ZWRFeHBsaWNpdFdpZHRoICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SGVpZ2h0ID0gcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIERldGVjdCBjb2xsYXBzZWQgZGltZW5zaW9ucyBmcm9tIGNvbnRhaW5lciAodGhpcy5jb250YWluZXIpXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgY29sbGFwc2VkV2lkdGggPSBjb250YWluZXJSZWN0LndpZHRoID09PSAwO1xuICAgICAgICAvLyBDb25zaWRlciBjb2xsYXBzZWQgaWYgaGVpZ2h0IGlzIDAgT1IgZXF1YWxzIHRoZSBsb2FkZXIgbWluSGVpZ2h0XG4gICAgICAgIGNvbnN0IGNvbGxhcHNlZEhlaWdodCA9IGNvbnRhaW5lclJlY3QuaGVpZ2h0ID09PSAwIHx8IGNvbnRhaW5lclJlY3QuaGVpZ2h0ID09PSBsb2FkZXJNaW5IZWlnaHQ7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGRpbWVuc2lvbnMgdG8gYXV0by1zaXplOlxuICAgICAgICAvLyAtIElmIGZvcmNlQXV0b1NpemUgaXMgdHJ1ZSwgYXV0by1zaXplIHVubGVzcyBleHBsaWNpdCBkaW1lbnNpb24gaXMgc2V0XG4gICAgICAgIC8vIC0gT3RoZXJ3aXNlLCBhdXRvLXNpemUgb25seSBpZiBjb2xsYXBzZWRcbiAgICAgICAgY29uc3Qgc2hvdWxkQXV0b1dpZHRoID0gb3B0aW9ucz8uZm9yY2VBdXRvU2l6ZVxuICAgICAgICAgICAgPyAhaGFzRXhwbGljaXRXaWR0aFxuICAgICAgICAgICAgOiAoY29sbGFwc2VkV2lkdGggJiYgIWhhc0V4cGxpY2l0V2lkdGgpO1xuICAgICAgICBjb25zdCBzaG91bGRBdXRvSGVpZ2h0ID0gb3B0aW9ucz8uZm9yY2VBdXRvU2l6ZVxuICAgICAgICAgICAgPyAhaGFzRXhwbGljaXRIZWlnaHRcbiAgICAgICAgICAgIDogKGNvbGxhcHNlZEhlaWdodCAmJiAhaGFzRXhwbGljaXRIZWlnaHQpO1xuXG4gICAgICAgIC8vIElmIG5vdGhpbmcgbmVlZHMgYXV0by1zaXppbmcsIHJlcG9ydCBleHBsaWNpdCBkaW1lbnNpb25zIGFuZCBza2lwIFJlc2l6ZU9ic2VydmVyXG4gICAgICAgIGlmICghc2hvdWxkQXV0b1dpZHRoICYmICFzaG91bGRBdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICBjb25zdCBleHBsaWNpdFdpZHRoUHggPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdFdpZHRoID09PSAnbnVtYmVyJyA/IHJlc29sdmVkRXhwbGljaXRXaWR0aCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGV4cGxpY2l0SGVpZ2h0UHggPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA9PT0gJ251bWJlcicgPyByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0IDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKGV4cGxpY2l0V2lkdGhQeCAhPT0gdW5kZWZpbmVkIHx8IGV4cGxpY2l0SGVpZ2h0UHggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnM/Lm9uU2l6ZUNoYW5nZT8uKHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGV4cGxpY2l0V2lkdGhQeCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBleHBsaWNpdEhlaWdodFB4LFxuICAgICAgICAgICAgICAgICAgICBhdXRvU2l6aW5nV2lkdGg6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBhdXRvU2l6aW5nSGVpZ2h0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVwZGF0ZVNpemUgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudDtcbiAgICAgICAgICAgIGlmIChjb250ZW50RG9jKSB7XG4gICAgICAgICAgICAgICAgLy8gVGVtcG9yYXJpbHkgc2hyaW5rIGlmcmFtZSBiZWZvcmUgbWVhc3VyaW5nIHNvIHNjcm9sbEhlaWdodFxuICAgICAgICAgICAgICAgIC8vIHJlcG9ydHMgYWN0dWFsIGNvbnRlbnQgc2l6ZSwgbm90IHRoZSBjdXJyZW50IGlmcmFtZSBzaXplLlxuICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgc2Nyb2xsSGVpZ2h0IGNhbiBuZXZlciBkZWNyZWFzZSBiZWxvdyBpZnJhbWUgaGVpZ2h0LlxuICAgICAgICAgICAgICAgIGlmIChzaG91bGRBdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSAnMHB4JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZEF1dG9XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUud2lkdGggPSAnMHB4JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudFdpZHRoID0gTWF0aC5jZWlsKGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SGVpZ2h0ID0gTWF0aC5jZWlsKGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBjbGFtcChjb250ZW50V2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gY2xhbXAoY29udGVudEhlaWdodCwgbWluSGVpZ2h0LCBtYXhIZWlnaHQpO1xuXG4gICAgICAgICAgICAgICAgLy8gT25seSBzZXQgZGltZW5zaW9ucyB0aGF0IHNob3VsZCBiZSBhdXRvLXNpemVkXG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZEF1dG9XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzaG91bGRBdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIERvbid0IGZvcmNlIG92ZXJmbG93IFx1MjAxNCBsZXQgdGhlIGNvbXBvbmVudC9wYXJlbnQgY29udHJvbCBzY3JvbGxpbmcuXG4gICAgICAgICAgICAgICAgLy8gT25seSBzZXQgb3ZlcmZsb3c6IGF1dG8gd2hlbiBjb250ZW50IGV4Y2VlZHMgbWF4IGNvbnN0cmFpbnRzLlxuICAgICAgICAgICAgICAgIGNvbnN0IGlzV2lkdGhDb25zdHJhaW5lZCA9IHNob3VsZEF1dG9XaWR0aCAmJiBtYXhXaWR0aCAhPT0gdW5kZWZpbmVkICYmIGNvbnRlbnRXaWR0aCA+IG1heFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzSGVpZ2h0Q29uc3RyYWluZWQgPSBzaG91bGRBdXRvSGVpZ2h0ICYmIG1heEhlaWdodCAhPT0gdW5kZWZpbmVkICYmIGNvbnRlbnRIZWlnaHQgPiBtYXhIZWlnaHQ7XG4gICAgICAgICAgICAgICAgY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3dYID0gaXNXaWR0aENvbnN0cmFpbmVkID8gJ2F1dG8nIDogJyc7XG4gICAgICAgICAgICAgICAgY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gaXNIZWlnaHRDb25zdHJhaW5lZCA/ICdhdXRvJyA6ICcnO1xuXG4gICAgICAgICAgICAgICAgb3B0aW9ucz8ub25TaXplQ2hhbmdlPy4oe1xuICAgICAgICAgICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBhdXRvU2l6aW5nV2lkdGg6IHNob3VsZEF1dG9XaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgYXV0b1NpemluZ0hlaWdodDogc2hvdWxkQXV0b0hlaWdodFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEluaXRpYWwgc2l6ZVxuICAgICAgICB1cGRhdGVTaXplKCk7XG5cbiAgICAgICAgLy8gT2JzZXJ2ZSBmb3IgY2hhbmdlc1xuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcih1cGRhdGVTaXplKTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShkb2MuYm9keSk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZG9jLmRvY3VtZW50RWxlbWVudCk7XG5cbiAgICAgICAgLy8gTXV0YXRpb25PYnNlcnZlciBjYXRjaGVzIERPTSBjb250ZW50IGNoYW5nZXMgKGUuZy4gcmVtb3ZpbmcgbGlzdCBpdGVtcywgdG9nZ2xpbmcgdmlld3MpXG4gICAgICAgIC8vIHRoYXQgZG9uJ3QgdHJpZ2dlciBSZXNpemVPYnNlcnZlciBiZWNhdXNlIHRoZSBib2R5IGJveC1zaXplIHN0YXlzIHRoZSBzYW1lXG4gICAgICAgIC8vIChib2R5IGZpbGxzIGlmcmFtZSwgaWZyYW1lIGhhc24ndCBzaHJ1bmsgeWV0KS5cbiAgICAgICAgLy8gYGF0dHJpYnV0ZXM6IHRydWVgIGNhdGNoZXMgQ1NTIGNsYXNzL3N0eWxlIGNoYW5nZXMgKGUuZy4gZGlzcGxheTpub25lIHRvZ2dsaW5nIHZpZXdzKS5cbiAgICAgICAgY29uc3QgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHVwZGF0ZVNpemUpO1xuICAgICAgICBtdXRhdGlvbk9ic2VydmVyLm9ic2VydmUoZG9jLmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlLCBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICBtdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzZXRTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0LCB3aWR0aH1cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmV0LmNvbnRlbnQud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50LmhlaWdodH1weGA7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vIHJldHVybiB3aW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgKyAncHgnO1xuXG5cbiAgICAgICAgICAgIC8vVE9ETzogZml4IHRoYXQgaGFjaywga2VlcCB0aGUgZnVuY3Rpb24gaW4gcmlnaHQgZm9ybWF0IHdoaWxlIG1pbmlmaWVkIDooXG4gICAgICAgICAgICBjb25zdCBub09wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRvIGVuc3VyZSBpdCdzIG5vdCBvcHRpbWl6ZWQgYXdheSwgeW91IGNhbiBjYWxsIGl0IGF0IGxlYXN0IG9uY2VcbiAgICAgICAgICAgIGxldCB4ID0gbm9PcCgpO1xuICAgICAgICAgICAgeCsrO1xuICAgICAgICAgICAgeC0tO1xuXG4gICAgICAgICAgICAvL3JldHVybiBgJHt3aW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHR9cHhgO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBjaGVjayB0aGF0ICsxID9cbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpXG4gICAgICAgICAgICAgICAgLCB3aW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQpICsgeCArICdweCdcblxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gcmV0LmNvbnRlbnQ7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlXyA9IHsuLi5tZXNzYWdlfSBhcyBCYXNlTXlvcE1lc3NhZ2U7XG4gICAgICAgIC8vVE9ETyA6ID8hPyEgc2hvdWxkIGl0IGJlIGhlcmUgP1xuICAgICAgICBpZiAobWVzc2FnZV8ubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FeGVjdXRlQ29tcG9uZW50TWV0aG9kKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZV8gYXMgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZClcbiAgICAgICAgICAgIHRoaXNbdHlwZWRNZXNzYWdlLm1ldGhvZF0oKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrIDooXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9jb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgbWVzc2FnZV8uZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi5kb3duO1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZV8pO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQ/LmNvbnRlbnRXaW5kb3c/LnBvc3RNZXNzYWdlKG1lc3NhZ2VfLCAnKicpO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9tZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH07XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbi5NdXRhdGlvbk9ic2VydmVyTWVzc2FnZVxuICAgICAgICAgICAgfHwgaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluLlJlc2l6ZU9ic2VydmVyTWVzc2FnZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgICAgICAvL3RoaXMuc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIub25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2xlYW51cEluc3BlY3QpXG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0KCk7XG5cbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQucGFyZW50Tm9kZSEucmVtb3ZlQ2hpbGQodGhpcy5JZnJhbWVFbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnLCBTa2luTG9hZGVyVHlwZX0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wTG9hZGVyIHtcbiAgICB0eXBlOiBTa2luTG9hZGVyVHlwZTtcbiAgICBsb2FkOiAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4gUHJvbWlzZTxJTXlvcENvbXBvbmVudD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcExvYWRlciBpbXBsZW1lbnRzIElNeW9wTG9hZGVyIHtcbiAgICBhYnN0cmFjdCB0eXBlOiBTa2luTG9hZGVyVHlwZTtcbiAgICBhYnN0cmFjdCBsb2FkOiAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4gUHJvbWlzZTxJTXlvcENvbXBvbmVudD47XG5cbiAgICBhcHBlbmRDaGlsZCA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBlbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMsKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5yZWxhdGl2ZSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVsYXRpdmUuZGlyZWN0aW9uID09PSAnYmVmb3JlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG9wdGlvbnMucmVsYXRpdmUuY2hpbGQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZS5kaXJlY3Rpb24gPT09ICdhZnRlcicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IG9wdGlvbnMucmVsYXRpdmUuY2hpbGQ/Lm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG5leHRTaWJsaW5nID8gbmV4dFNpYmxpbmcgOiBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wSWZyYW1lQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSUlmcmFtZUxvYWRlckNvbmZpZywgSVNraW5Db25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IGFkZFF1ZXJ5UGFyYW0gPSAodXJsOiBzdHJpbmcsIHBhcmFtOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAvLyBDcmVhdGUgYSBVUkwgb2JqZWN0XG4gICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuXG4gICAgLy8gQWRkIHRoZSBxdWVyeSBwYXJhbWV0ZXJcbiAgICB1cmxPYmouc2VhcmNoUGFyYW1zLmFwcGVuZChwYXJhbSwgdmFsdWUpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSB1cGRhdGVkIFVSTFxuICAgIHJldHVybiB1cmxPYmoudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGNsYXNzIE15b3BJZnJhbWVMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLklmcmFtZUxvYWRlclxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuICAgICAgICBsZXQgSWZyYW1lRWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICAgY29uc3QgdHlwZWRMb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKGNvbnRhaW5lcj8ubm9kZU5hbWUgPT09IFwiSUZSQU1FXCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCduZWVkcyB0byBsb2FkIGludG8gYW4gZXhzaXN0aW5nIElmcmFtZS4uLicsIHR5cGVkTG9hZGVyQ29uZmlnLnVybCwgY29udGFpbmVyKTtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IChjb250YWluZXIgYXMgSFRNTElGcmFtZUVsZW1lbnQpXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNyYyA9IHR5cGVkTG9hZGVyQ29uZmlnLnVybFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgICAgIC8vIFNldCBhbGwgc3R5bGVzIEJFRk9SRSBhcHBlbmRpbmcgdG8gcHJldmVudCBmbGFzaCBhdCB3cm9uZyBwb3NpdGlvblxuICAgICAgICAgICAgY29uc3QgaWZyYW1lU3R5bGVzID0gYFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgICAgICBpbnNldDogMDtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICR7dHlwZWRMb2FkZXJDb25maWcuYXV0b0hlaWdodCB8fCAhdHlwZWRMb2FkZXJDb25maWcuaGVpZ2h0ID8gJzEwMCUnIDogdHlwZWRMb2FkZXJDb25maWcuaGVpZ2h0fTtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAke29wdGlvbnM/LmhpZGRlbiA/ICcwJyA6ICcxJ307XG4gICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6ICR7b3B0aW9ucz8uaGlkZGVuID8gJ25vbmUnIDogJ2FsbCd9O1xuICAgICAgICAgICAgYDtcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IGlmcmFtZVN0eWxlcztcblxuICAgICAgICAgICAgLy8gU2V0IGVsZW1lbnQgYXR0cmlidXRlcyBpZiBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmVsZW1lbnRBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5lbGVtZW50QXR0cmlidXRlcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGhhbmRsZSBpc3N1ZSB0byBsb2FkIGlmcmFtZSBpbnNpZGUgYW4gaWZyYW1lIHdpdGggdGhlIHNhbWUgdXJsXG4gICAgICAgICAgICBsZXQgdXJsMmxvYWQgPSAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZykudXJsO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Ll9oYXNQYXJlbnQpXG4gICAgICAgICAgICAgICAgdXJsMmxvYWQgPSBhZGRRdWVyeVBhcmFtKHVybDJsb2FkLCBcIl9teW9wLWNvbXBcIiwgdW5pcUlkKTtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zcmMgPSB1cmwybG9hZDtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICAgICAgLy8gICBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZG9tSWQpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICAgICAgLy9OTyA6IElmcmFtZUVsZW1lbnQgPSBjb250YWluZXIubGFzdEVsZW1lbnRDaGlsZCBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcFdlYmNvbXBvbmVudENvbnN0cyA9IHtcbiAgICB3ZWJjb21wb25lbnRfbWVzc2FnZV9rZXk6ICdteW9wX3dlYmNvbXBvbmVudF9tZXNzYWdlJ1xufVxuIiwgImltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4uLy4uL3dlYmNvbXBvbmVudC9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BXZWJDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcml2YXRlIGN1c3RvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBjb250YWluZXIgLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gY3VzdG9tRWxlbWVudDtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdDogQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgfVxuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BXZWJDb21wb25lbnQnLCAwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5jdXN0b21FbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdDtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJyc7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2U8YW55PikgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZV8gPSB7Li4ubWVzc2FnZX0gYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgIC8vVE9ETyA6IGNhbiBiZSBkb25lIHdpdGhvdXQgY2xvbmluZz9cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL2NvbnN0IGhhbmRsZXIgPSBtZXNzYWdlXy5oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlXyk7XG5cbiAgICAgICAgY29uc3QgbXNnID0gbmV3IEN1c3RvbUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4obXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRldGFpbDogbWVzc2FnZV8sXG4gICAgICAgICAgICAvLyBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgLy8gY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAvLyBjb21wb3NlZDogdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vdGhpcy5jb250YWluZXIuZGlzcGF0Y2hFdmVudChtc2cpXG5cbiAgICAgICAgLy9zZW5kaW5nIGRhdGEgZnJvbSBob3N0IHRvIHRoZSBjb21wb25lbnRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5kaXNwYXRjaEV2ZW50KG1zZylcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW5bMF0uZGlzcGF0Y2hFdmVudChtc2cpXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciB3aGlsZSB0cnlpbmcgdG8gZGlzcGF0Y2hFdmVudCcsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL21lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5jdXN0b21FbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjQsIHdhaXR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWcsIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IHNlZW46IFJlY29yZDxzdHJpbmcsIFByb21pc2U8dm9pZD4+ID0ge307XG5cbmV4cG9ydCBjbGFzcyBXZWJjb21wb25lbnRMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG5cbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuV2ViQ29tcG9uZW50TG9hZGVyXG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKCFzZWVuW2xvYWRlckNvbmZpZy51cmxdKSB7XG4gICAgICAgICAgICAvLyBhd2FpdCBpbXBvcnQoIC8qIEB2aXRlLWlnbm9yZSAqLyB3ZWJDb21wb25lbnRMb2FkVXJsKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdtb2R1bGUgbG9hZGVkJyk7XG4gICAgICAgICAgICBzZWVuW2xvYWRlckNvbmZpZy51cmxdID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlYkNvbXBvbmVudExvYWRVcmwgPSBsb2FkZXJDb25maWcudXJsXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSAnbW9kdWxlJztcbiAgICAgICAgICAgICAgICBzY3JpcHQuc3JjID0gd2ViQ29tcG9uZW50TG9hZFVybDtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZHVsZSBhbHJlZGF5IGxvYWRlZCBvciBpbiBsb2FkaW5nIHByb2Nlc3MnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHNlZW5bbG9hZGVyQ29uZmlnLnVybF07XG5cbiAgICAgICAgLy9UT0RPIDogYWRkIHJldHJ5IG1lY2hhbmlzbSBpbiBmYWlsIGNhc2UuXG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjaywgc2hvdWxkIGZpeCB0aGUgcmFjZSBjb25kaXRpb24gZm9yIGxvYWRlZCBtb2R1bGVzXG4gICAgICAgIGF3YWl0IHdhaXQoMSk7XG5cbiAgICAgICAgbGV0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWBcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobG9hZGVyQ29uZmlnLnRhZyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZihvcHRpb25zPy5fZW52aXJvbm1lbnQpe1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWxlbWVudC5fbXlvcEVudmlyb25tZW50ID0gb3B0aW9ucz8uX2Vudmlyb25tZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2xvYWRlckNvbmZpZy50YWd9IC8+YDtcbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxuXG59XG4iLCAiaW1wb3J0IHtCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyLCBIb3N0ZWRDb21wb25lbnR9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4gdm9pZFxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlcjxULCBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ8U2hhZG93Um9vdFJlZj4+PiB7XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlVG9Ib3N0OiBhbnksIHB1YmxpYyBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ8U2hhZG93Um9vdFJlZj4+KSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2VUb0hvc3QpO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGlubmVyRXhlY3V0b3I6IChldmVudDogVCwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4gdm9pZDtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBUKSA9PiB7XG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGlmIChldmVudC5kZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBldmVudC5kZXN0aW5hdGlvbjtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHRbZGVzdGluYXRpb25dLmNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIHBhdGNoIHRoZSBzb3VyY2UgaWQsIHRoaW5rIGFib3V0IHRoYXQgP1xuICAgICAgICAgICAgICAgIGNvbnN0IF9tZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGV2ZW50LmRlc3RpbmF0aW9uID8gZXZlbnQuZGVzdGluYXRpb24gOiBldmVudC5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogZXZlbnQuc291cmNlID8gZXZlbnQuc291cmNlIDogZXZlbnQuZGVzdGluYXRpb25cbiAgICAgICAgICAgICAgICAgICAgfSBhcyBCYXNlTXlvcE1lc3NhZ2UsIHJlcGxheVRvKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlubmVyRXhlY3V0b3IoZXZlbnQsIHRoaXMuY29udGV4dFtkZXN0aW5hdGlvbl0uY29udGV4dCwgX21lc3NhZ2VUb0hvc3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBteW9wQXR0cmlidXRlcyA9IHtcbiAgICBpZDogJ215b3AtaWQnXG59XG4iLCAiaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0cy50c1wiO1xuaW1wb3J0IHtSZWZ9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudHNCeVJlZiA9IChyZWY6IFJlZiwgZWw6IFBhcmVudE5vZGUpID0+IHtcbiAgICByZXR1cm4gZWwucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke3JlZi5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEZpcnN0RWxlbWVudEJ5UmVmID0gKHJlZjogUmVmLCBlbDogUGFyZW50Tm9kZSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZ2V0RWxlbWVudHNCeVJlZihyZWYsIGVsKTtcbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50cy5pdGVtKDApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0JpbmRDbGlja01lc3NhZ2UsIENsaWNrUmVwbGF5TWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQmluZE9uQ2xpY2tIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEJpbmRDbGlja01lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkJpbmRDbGlja01lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBCaW5kQ2xpY2tNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdClcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IENsaWNrUmVwbGF5TWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge015b3BFbGVtZW50TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIENoYW5nZVRleHRIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPE15b3BFbGVtZW50TWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ2hhbmdlVGV4dE1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBNeW9wRWxlbWVudE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0udGV4dENvbnRlbnQgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIFNoYWRvd1Jvb3RSZWYgZXh0ZW5kcyBSb290UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHVibGljIHNoYWRvd1Jvb3Q6IFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgc3VwZXIoY29udGFpbmVyLCBzaGFkb3dSb290KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wRWxlbWVudFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSwgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxEZXRlY3RNeW9wUmVmc01lc3NhZ2U+IHtcbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBEZXRlY3RNeW9wUmVmc01lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcblxuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICBjb25zdCBhbGxNeW9wSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9XWApO1xuXG4gICAgICAgIGxldCBteW9wUmVmczogTXlvcEVsZW1lbnRSZWZbXSA9IFtdO1xuXG4gICAgICAgIGFsbE15b3BJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogdGFrZSB0aGF0IGJhY2sgdG8gdGhlIGRhc2hib2FyZD9cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coaXRlbSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGl0ZW0uZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcblxuICAgICAgICAgICAgaWYgKG15b3BJZCkge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3djIHJlY3QnLCAgaXRlbS5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKVxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBteW9wUmVmcy5wdXNoKG5ldyBNeW9wRWxlbWVudFJlZihteW9wSWQsIGl0ZW0udGFnTmFtZSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgaXRlbS5vZmZzZXRUb3AsIGl0ZW0ub2Zmc2V0TGVmdCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIG15b3BSZWZzKSlcbiAgICB9O1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRGV0ZWN0TXlvcFJlZnNNZXNzYWdlO1xuXG5cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0QXR0cmlidXRlTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIHNldEF0dHJpYnV0ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8U2V0QXR0cmlidXRlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0QXR0cmlidXRlTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IFNldEF0dHJpYnV0ZU1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKGV2ZW50Lm5hbWUsIGV2ZW50LnZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UsXG4gICAgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSxcbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBBZGRFdmVudExpc3RlbmVySGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxBZGRFdmVudExpc3RlbmVyTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gaW4gZmFjdCB3aGVuIHJ1bm5pbmcgaW4gV2ViQ29tcG9uZW50IHdlIGNhbiB0cmFuc2ZlciB0aGUgb3JpZ2luYWwgZVxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRseSB1c2luZyBtYWtlU2VyaWFsaXphYmxlIGZvciBuZXN0ZWQgY2FzZXMsIHRoaW5rIGFib3V0IHRoYXRcbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgIG1ha2VTZXJpYWxpemFibGUoZSwgZXZlbnQuc2VyaWFsaXphYmxlU2tlbGV0b24pKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQudHlwZSwgaGFuZGxlcik7XG5cbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQudHlwZSwgaGFuZGxlcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB0YXNrKCkpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0hvc3RTREt9IGZyb20gXCIuLi8uLi9ob3N0L2hvc3RTREtcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vaG9zdFwiO1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcblxuICAgICAgICBjb25zdCBjcmVhdGVSZWYgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvL2NvbnN0IGFsbEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7ZXZlbnQucmVmPy5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbiAgICAgICAgICAgIGNvbnN0IGFsbEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7ZXZlbnQucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG5cbiAgICAgICAgICAgIGlmIChhbGxJdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBob3N0U0RLID0gSG9zdFNESy5JbnN0YW5jZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBldmVudC5vcHRpb25zLmlkKSE7XG4gICAgICAgICAgICAgICAgaWYgKHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLy8vPj4+PlxuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyAgY29uc29sZS5sb2coYGZhaWxlZCB0byBmaW5kICR7ZXZlbnQub3B0aW9ucy5pZH0gaW4gbWVtIHNjb3BlYCwgaG9zdFNESyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vd2UgaGF2ZSB0aGUgcmVmIGNvbXBvbmVudCBpbiBvdXIgSG9zdFNESyAoc2FtZSBtZW1vcnkgd2hlbiB1c2luZyB3ZWJjb21wb25lbnQpXG4gICAgICAgICAgICAgICAgLy8gIHJlZkNvbXBvbmVudC5wYXJlbnQgPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAvL2RlbGV0ZSB0aGUgcmVmIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaG9zdFNESy5jb21wb25lbnRzLmluZGV4T2YocmVmQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3RTREsuY29tcG9uZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkIHJlbW92ZWQgdGVtcCByZWYgY29tcG9uZW50Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCB1c2luZyB0ZW1wIHJlZiBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCA9IGF3YWl0IGhvc3RTREsubG9hZENvbXBvbmVudChldmVudC5uZXN0ZWRDb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICAgIGFsbEl0ZW1zLml0ZW0oMCksXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Lm9wdGlvbnMpXG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBubyBuZWVkIHRoaXMsIHBhc3Mgb3B0aW9ucyBmcm9tIHBhcmVudFxuICAgICAgICAgICAgICAgIC8vaW1wbGVtZW50YXRpb25Db21wb25lbnQuaWQgPSBldmVudC5wcmVkZWZpbmVkSWQ7XG4gICAgICAgICAgICAgICAgLy9yZWZDb21wb25lbnQuaWQgKz0gJy4nO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogbm90IHJlYWxseSBuZWVkZWQgP1xuICAgICAgICAgICAgICAgIC8vIGF3YWl0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50LmluaXRpYXRlZCgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkUmVmQ29uZmlnOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoaW1wbGVtZW50YXRpb25Db21wb25lbnQucmVmcykuZm9yRWFjaChyZWZOYW1lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZiA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50LnJlZnNbcmVmTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIHJlZiA9IHJlZi5fX25vblByb3hpZWQgfHwgcmVmO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICgocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRSZWZDb25maWcucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uSWQ6IChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIG5lc3RlZFJlZkNvbmZpZykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciAtIERPTSBlbGVtZW50IG5vdCBmb3VuZCcpXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIFtdLCB0cnVlKSk7XG5cbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNyZWF0ZVJlZigpLnRoZW4oKVxuICAgICAgICAvL3JldHVybmluZyB1bmRlZmluZWQgc28gaXQgd29uJ3QgYWN0IGFzIGEgY2xlYW51cFxuICAgIH1cbn1cbiIsICJpbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIHJlcGxpZXI6IChkYXRhOiBhbnkpID0+IHZvaWQsIHJvb3RSZWY6IFJvb3RSZWYpID0+IHtcbiAgICBjb25zdCBfX3NjcmlwdElucHV0cyA9IGV2ZW50LnNjcmlwdElucHV0cyA/IGV2ZW50LnNjcmlwdElucHV0cyA6IHt9XG4gICAgX19zY3JpcHRJbnB1dHMubWFrZVNlcmlhbGl6YWJsZSA9IG1ha2VTZXJpYWxpemFibGU7XG5cbiAgICBfX3NjcmlwdElucHV0cy5zZW5kID0gcmVwbGllcjtcbiAgICBfX3NjcmlwdElucHV0cy5yb290UmVmID0gcm9vdFJlZjtcbiAgICBfX3NjcmlwdElucHV0cy5fX3NjcmlwdElucHV0cyA9IF9fc2NyaXB0SW5wdXRzO1xuXG4gICAgY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gKCR7ZXZlbnQuc2NyaXB0fSkoLi4uYXJndW1lbnRzKWApO1xuICAgIGNvbnN0IHJldCA9IGR5bmFtaWNGdW5jdGlvbihfX3NjcmlwdElucHV0cyk7XG5cbiAgICAvLyBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBGdW5jdGlvbignc2VuZCcsICdyb290UmVmJywnX19zY3JpcHRJbnB1dHMnLCAuLi5PYmplY3Qua2V5cyhfX3NjcmlwdElucHV0cyksIGV2ZW50LmNvbnRlbnQgPyBldmVudC5jb250ZW50IDogJycpXG4gICAgLy9jb25zdCByZXQgPSBkeW5hbWljRnVuY3Rpb24ocmVwbGllciwgcm9vdFJlZiwgX19zY3JpcHRJbnB1dHMsIC4uLk9iamVjdC52YWx1ZXMoX19zY3JpcHRJbnB1dHMpKTtcbiAgICByZXBsaWVyKHJldCk7XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRXhlY3V0ZVNjcmlwdE1lc3NhZ2VcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcGxpZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgZGF0YSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IoZXZlbnQsIHJlcGxpZXIsIHNoYWRvd1Jvb3RSZWYpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSwgRm9ybURhdGFFbnRyeSwgR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgSW5wdXRFbGVtZW50VmFsdWUsfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0cy50c1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgZ2V0SW5wdXRWYWx1ZSA9IChlbGVtZW50KTogSW5wdXRFbGVtZW50VmFsdWUgPT4ge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgZm9ybVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgZGF0YU9iamVjdDogSW5wdXRFbGVtZW50VmFsdWUgPSB7XG4gICAgICAgICAgICBmb3JtRGF0YToge30sXG4gICAgICAgICAgICB1bm1hcHBlZERhdGE6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gTWFudWFsbHkgYWRkIGVsZW1lbnRzIHdpdGhvdXQgbmFtZXNcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJyk7XG4gICAgICAgIGxldCBhdXRvTmFtZUluZGV4ZXIgPSAtMTtcblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcblxuICAgICAgICAgICAgICAgIC8vIGBfJHsoKythdXRvTmFtZUluZGV4ZXIpfWBcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVEYXRhOiBGb3JtRGF0YUVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICBpZDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZ2V0SW5wdXRWYWx1ZShlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGVsZW1lbnQucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5OiBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQudmFsaWRpdHksIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICBteW9wSWQsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjaGVja2JveCBvciByYWRpbyBidXR0b25cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW1lbnQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jaGVja2VkID8gZWxlbWVudC52YWx1ZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGlucHV0IGFuZCB0ZXh0YXJlYSBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC50YWdOYW1lID09PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWxlY3QgZWxlbWVudHMgKGRyb3Bkb3ducylcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0VMRUNUJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZWRpdGFibGUgZGl2cyAoY29udGVudEVkaXRhYmxlKVxuICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmlubmVyVGV4dCB8fCBlbGVtZW50LnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYW4gdW5zdXBwb3J0ZWQgZWxlbWVudCB0eXBlXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKGdldElucHV0VmFsdWUoaXRlbSkpLCBldmVudCk7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtNeW9wRWxlbWVudE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWxIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFNldElubmVySHRtbD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0SW5uZXJIdG1sO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogTXlvcEVsZW1lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLmlubmVySFRNTCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgV2ViY29tcG9uZW50IFNESyBpcyB0YWlsb3JlZCBmb3IgdXNpbmcgTXlvcCBjb21wb25lbnRzIHBhY2thZ2VkIGFzIHNlcGFyYXRlIGJ1bmRsZXMgYW5kIGV4cG9zZWQgYXMgd2ViIGNvbXBvbmVudHMuPGJyLz5cbiAqIERldmVsb3BlcnMgaW1wb3J0aW5nIHRoaXMgU0RLIGNhbiBsZXZlcmFnZSBBUElzIGFuZCB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGNyYWZ0ZWQgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYW5kIGNvbW11bmljYXRpb24gcGF0dGVybnMgcmVxdWlyZWQgZm9yIHdlYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgTXlvcCBhcmNoaXRlY3R1cmUuPGJyLz5cbiAqIFRoaXMgU0RLIHByb21vdGVzIHJldXNhYmlsaXR5IGFuZCBlbmNhcHN1bGF0aW9uLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIGJ1aWxkIG1vZHVsYXIsIHNlbGYtY29udGFpbmVkIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24ncyBET00gc3RydWN0dXJlLlxuICpcbiAqXG4gKiBPbmNlIGxvYWRlZCB0aGUgYFJvb3RTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gKiBgYGBqc1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtXZWJDb21wb25lbnRTREt9IGZyb20gJ0BteW9wL3Nkay93ZWJjb21wb25lbnQnO1xuICogYGBgXG4gKlxuICovXG5pbXBvcnQge0Jhc2VNeW9wU0RLfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtCaW5kT25DbGlja0hhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9iaW5kT25DbGlja0hhbmRsZXJcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXF1ZXN0LFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7c2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7QWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50c1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcbmltcG9ydCB7R2V0RWxlbWVudFZhbHVlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHNcIjtcblxuLyoqXG4gKiBUaGUgV2ViY29tcG9uZW50IFNESyBpcyB0YWlsb3JlZCBmb3IgdXNpbmcgTXlvcCBjb21wb25lbnRzIHBhY2thZ2VkIGFzIHNlcGFyYXRlIGJ1bmRsZXMgYW5kIGV4cG9zZWQgYXMgd2ViIGNvbXBvbmVudHMuPGJyLz5cbiAqIERldmVsb3BlcnMgaW1wb3J0aW5nIHRoaXMgU0RLIGNhbiBsZXZlcmFnZSBBUElzIGFuZCB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGNyYWZ0ZWQgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYW5kIGNvbW11bmljYXRpb24gcGF0dGVybnMgcmVxdWlyZWQgZm9yIHdlYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgTXlvcCBhcmNoaXRlY3R1cmUuPGJyLz5cbiAqIFRoaXMgU0RLIHByb21vdGVzIHJldXNhYmlsaXR5IGFuZCBlbmNhcHN1bGF0aW9uLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIGJ1aWxkIG1vZHVsYXIsIHNlbGYtY29udGFpbmVkIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24ncyBET00gc3RydWN0dXJlLlxuICpcbiAqXG4gKiBPbmNlIGxvYWRlZCB0aGUgYFJvb3QgU0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuICogYGBganNcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKlxuICovXG5leHBvcnQgY2xhc3MgV2ViQ29tcG9uZW50U0RLIGV4dGVuZHMgQmFzZU15b3BTREsge1xuXG4gICAgYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdCA9IHRydWU7XG5cbiAgICAvL3doZW4gbmV3IHdlYiBjb21wb25lbnQgY3JlYXRlZC5cbiAgICBjb25uZWN0ZWRDYWxsYmFjayA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBzaGFkb3c6IFNoYWRvd1Jvb3QpID0+IHtcbiAgICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIobXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICBjb25zdCBldmVudENvbnRlbnQgPSBlLmRhdGEgPyBlLmRhdGEgOiBlLmRldGFpbDtcbiAgICAgICAgICAgIGlmICghZXZlbnRDb250ZW50IHx8ICFldmVudENvbnRlbnQubXlvcCkge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVjdmllZCB3ZWJjb21wb25lbnRfbWVzc2FnZSB3aXRoIHdyb25nIHR5cGUnKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnRDb250ZW50IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgY29udGFpbmVyIC8gY29tcG9lbm50IGlkZW50aWZpZXIgZm9yIG11bHRpbCBjb21wb25lbnRzIHN1cHBvcnRcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzKGUpXG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Q29tcG9uZW50SWQgPSAobWVzc2FnZSBhcyBJbml0TWVzc2FnZSkuY29udGVudC5pZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXS5jb250ZXh0ID0gbmV3IFNoYWRvd1Jvb3RSZWYoY29udGFpbmVyLCBzaGFkb3cpXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5zdXBwb3J0ZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgaGFuZGxlci5jb250ZXh0ID0gdGhpcy5zaGFkb3dSb290cztcbiAgICAgICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2suIHJhY2UgY29uZGl0aW9uIHdpdGggaG9zdC5sb2FkIHdoZW4gbW9kdWxlIGxvYWRlZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlcXVlc3QoKSlcbiAgICAgICAgfSwgMSlcbiAgICB9XG5cbiAgICBtZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLnVwXG4gICAgICAgIC8vbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkO1xuXG4gICAgICAgIGlmICghbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgJiYgcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZClcbiAgICAgICAgICAgIG1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8uaGFuZGxlclVuaXF1ZUlkXG5cbiAgICAgICAgd2luZG93Lm15b3AuaG9zdFNESy5zZW5kKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcltdID0gW1xuICAgICAgICBuZXcgQ2hhbmdlVGV4dEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgU2V0SW5uZXJIdG1sSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBCaW5kT25DbGlja0hhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBzZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEV4ZWN1dGVTY3JpcHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICAvL1xuICAgICAgICBuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpXG4gICAgXTtcblxuICAgIHB1YmxpYyBpbml0ID0gKCkgPT4ge1xuICAgICAgICAvL3RoaXMubXlDb21wb25lbnRJZFxuICAgICAgICAvL3RoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXNcbiAgICB9XG59XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ1dlYkNvbXBvbmVudFNESycsIFdlYkNvbXBvbmVudFNESyk7XG4iLCAiZXhwb3J0ICogZnJvbSBcIi4vV2ViQ29tcG9uZW50U0RLXCI7XG4iLCAiLyoqXG4gKiBFbWJlZGRlZCBTREsgQ29udGVudCBNb2R1bGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgZW1iZWRkZWQgU0RLIGNvbnRlbnQgZm9yIG5wbSBwYWNrYWdlIHVzZXJzLlxuICogVGhlIGFjdHVhbCBjb250ZW50IGlzIGdlbmVyYXRlZCBhdCBidWlsZCB0aW1lIGJ5IHNjcmlwdHMvYnVpbGQtZW1iZWRkZWQtc2RrLmpzXG4gKlxuICogRm9yIGRldmVsb3BtZW50LCB0aGlzIGZpbGUgZXhwb3J0cyBwbGFjZWhvbGRlcnMuXG4gKiBBZnRlciBidWlsZCwgdGhlIGRpc3QvbW9kdWxlL2VtYmVkZGVkU0RLLmpzIHdpbGwgY29udGFpbiB0aGUgYWN0dWFsIFNESyBjb250ZW50LlxuICpcbiAqIFVzYWdlIGluIEhUTUxDb21wb25lbnRMb2FkZXI6XG4gKiAtIElmIEhBU19FTUJFRERFRF9TREsgaXMgdHJ1ZSwgaW5qZWN0IFNESyBpbmxpbmU6IDxzY3JpcHQ+JHtFTUJFRERFRF9TREtfQ09OVEVOVH08L3NjcmlwdD5cbiAqIC0gSWYgSEFTX0VNQkVEREVEX1NESyBpcyBmYWxzZSwgZmFsbCBiYWNrIHRvIENETjogPHNjcmlwdCBzcmM9XCIke3VybH1cIj48L3NjcmlwdD5cbiAqL1xuXG4vKipcbiAqIFRoZSBlbWJlZGRlZCBTREsgY29udGVudCBhcyBhIG1pbmlmaWVkIEphdmFTY3JpcHQgc3RyaW5nLlxuICogVGhpcyBwbGFjZWhvbGRlciB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYWN0dWFsIGNvbnRlbnQgaW4gdGhlIGJ1aWxkIG91dHB1dC5cbiAqL1xuZXhwb3J0IGNvbnN0IEVNQkVEREVEX1NES19DT05URU5UOiBzdHJpbmcgPSAnJztcblxuLyoqXG4gKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciBlbWJlZGRlZCBTREsgY29udGVudCBpcyBhdmFpbGFibGUuXG4gKiBUaGlzIGlzIGZhbHNlIGluIGRldmVsb3BtZW50LCB0cnVlIGluIHRoZSBidWlsdCBtb2R1bGUuXG4gKi9cbmV4cG9ydCBjb25zdCBIQVNfRU1CRURERURfU0RLOiBib29sZWFuID0gZmFsc2U7XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge015b3BFeHRyYWN0ZWRXZWJDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BFeHRyYWN0ZWRXZWJDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzLnRzXCI7XG5pbXBvcnQge1xuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElIVE1MTG9hZGVyQ29uZmlnLFxuICAgIElTa2luQ29uZmlnLCBTaGFkb3dSb290TW9kZVR5cGUsXG4gICAgU2tpbkxvYWRlcnNcbn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtXZWJDb21wb25lbnRTREt9IGZyb20gXCIuLi8uLi93ZWJjb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcElmcmFtZUNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50c1wiO1xuaW1wb3J0IHtFTUJFRERFRF9TREtfQ09OVEVOVCwgSEFTX0VNQkVEREVEX1NES30gZnJvbSBcIi4uL2VtYmVkZGVkU0RLLnRzXCI7XG4vL2ltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tIFwiLi4vLi4vU0RLLnRzXCI7XG5cbmNvbnN0IE1ZT1BfV0VCX0NPTVBPTkVOVF9NQVJLRVIgPSAnPCEtLSBteW9wLXdlYi1jb21wb25lbnQgLS0+JztcbmNvbnN0IE1ZT1BfV0VCX0NPTVBPTkVOVF9TQ1JJUFRfSUQgPSAnbXlvcC13ZWItY29tcG9uZW50JztcblxuLy8gVHJhY2sgZXh0cmFjdGVkIHdlYiBjb21wb25lbnQgc2NyaXB0cyB0byBwcmV2ZW50IGRvdWJsZSByZWdpc3RyYXRpb25cbmNvbnN0IGV4dHJhY3RlZFdlYkNvbXBvbmVudFNjcmlwdHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG5jb25zdCBzZWVuOiBzdHJpbmdbXSA9IFtdO1xubGV0IHNkaztcbmNvbnN0IGdldEluaXRpYXRlZFNkayA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXNkaykge1xuICAgICAgICAvL2NvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKClcbiAgICAgICAgc2RrID0gbmV3IFdlYkNvbXBvbmVudFNESygpO1xuICAgICAgICBzZGsuaW5pdCgpO1xuICAgIH1cbiAgICByZXR1cm4gc2RrO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIVE1MRWxlbWVudENvbnN0cnVjdG9yKGh0bWxTdHJpbmc6IHN0cmluZywgU2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlKTogbmV3ICgpID0+IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG5cbiAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICBjb25zdCBtb2RlID0gU2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5vcGVuID8gJ29wZW4nIDogJ2Nsb3NlZCc7XG4gICAgICAgICAgICBjb25zdCBzaGFkb3cgPSB0aGlzLmF0dGFjaFNoYWRvdyh7bW9kZX0pO1xuICAgICAgICAgICAgZ2V0SW5pdGlhdGVkU2RrKCkudGhlbigoc2RrKSA9PiB7XG4gICAgICAgICAgICAgICAgc2RrLmNvbm5lY3RlZENhbGxiYWNrKHRoaXMsIHNoYWRvdyk7XG4gICAgICAgICAgICAgICAgc2hhZG93LmlubmVySFRNTCA9IGh0bWxTdHJpbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5jb25zdCBjcmVhdGVDdXN0b21XZWJDb21wb25lbnQgPSAoY29tcG9uZW50TmFtZTogc3RyaW5nLCBodG1sOiBzdHJpbmcsIFNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZSkgPT4ge1xuICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZShjb21wb25lbnROYW1lLCBjcmVhdGVIVE1MRWxlbWVudENvbnN0cnVjdG9yKGh0bWwsIFNoYWRvd1Jvb3RNb2RlKSk7XG4gICAgY29uc29sZS5sb2coYGRlZmluZSgnJHtjb21wb25lbnROYW1lfScpIHdhcyBjYWxsZWQsIHdlYiBjb21wb25lbnQgcmVhZHkgdG8gdXNlYCk7XG59XG5cbmNvbnN0IHRvV2ViQ29tcG9uZW50TmFtZSA9IChzdHIpID0+IHtcbiAgICByZXR1cm4gc3RyXG4gICAgICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEtJDInKSAvLyBBZGQgaHlwaGVuIGJlZm9yZSB1cHBlcmNhc2UgbGV0dGVyc1xuICAgICAgICAucmVwbGFjZSgvKFxcZCspL2csICctJDEnKSAvLyBBZGQgaHlwaGVuIGJlZm9yZSBkaWdpdHNcbiAgICAgICAgLnRvTG93ZXJDYXNlKCk7IC8vIENvbnZlcnQgdG8gbG93ZXJjYXNlXG59XG5cbmNvbnN0IHRvQ3VzdG9tRWxlbWVudE5hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgbmFtZSA9IHRvV2ViQ29tcG9uZW50TmFtZShuYW1lKTtcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC9fL2csICctJyk7XG59XG5cbmxldCBwYXJzZXI6IERPTVBhcnNlcjsgLy8gPSBuZXcgRE9NUGFyc2VyKCk7XG5cbmV4cG9ydCBjbGFzcyBIVE1MQ29tcG9uZW50TG9hZGVyIGV4dGVuZHMgQmFzZU15b3BMb2FkZXIge1xuXG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXJcblxuICAgIC8qKlxuICAgICAqIERldGVjdCBpZiBIVE1MIGlzIGEgTXlvcCBXZWIgQ29tcG9uZW50IChzdGFydHMgd2l0aCBtYXJrZXIgY29tbWVudClcbiAgICAgKi9cbiAgICBwcml2YXRlIGlzTXlvcFdlYkNvbXBvbmVudChodG1sOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGh0bWwudHJpbVN0YXJ0KCkuc3RhcnRzV2l0aChNWU9QX1dFQl9DT01QT05FTlRfTUFSS0VSKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0IHRoZSB3ZWIgY29tcG9uZW50IHNjcmlwdCBjb250ZW50IGZyb20gSFRNTFxuICAgICAqL1xuICAgIHByaXZhdGUgZXh0cmFjdFdlYkNvbXBvbmVudFNjcmlwdChodG1sOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jLmdldEVsZW1lbnRCeUlkKE1ZT1BfV0VCX0NPTVBPTkVOVF9TQ1JJUFRfSUQpO1xuICAgICAgICByZXR1cm4gc2NyaXB0Py50ZXh0Q29udGVudCB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgdGhlIHdlYiBjb21wb25lbnQgc2NyaXB0IG9uIHRoZSBob3N0IGRvY3VtZW50XG4gICAgICovXG4gICAgcHJpdmF0ZSBleGVjdXRlV2ViQ29tcG9uZW50U2NyaXB0KHNjcmlwdENvbnRlbnQ6IHN0cmluZywgc2NyaXB0SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGV4ZWN1dGVkIChieSBzY3JpcHQgY29udGVudCBoYXNoKVxuICAgICAgICBpZiAoZXh0cmFjdGVkV2ViQ29tcG9uZW50U2NyaXB0cy5oYXMoc2NyaXB0SWQpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW015b3BXZWJDb21wb25lbnRdIFNjcmlwdCBhbHJlYWR5IGV4ZWN1dGVkIGZvciAke3NjcmlwdElkfSwgc2tpcHBpbmdgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICBzY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHRDb250ZW50O1xuICAgICAgICBzY3JpcHQuaWQgPSBgbXlvcC1leHRyYWN0ZWQtJHtzY3JpcHRJZH1gO1xuICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cbiAgICAgICAgZXh0cmFjdGVkV2ViQ29tcG9uZW50U2NyaXB0cy5hZGQoc2NyaXB0SWQpO1xuICAgICAgICBjb25zb2xlLmxvZyhgW015b3BXZWJDb21wb25lbnRdIEV4ZWN1dGVkIHdlYiBjb21wb25lbnQgc2NyaXB0OiAke3NjcmlwdElkfWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgYSBNeW9wIFdlYiBDb21wb25lbnQgKGV4dHJhY3RlZCBhbmQgcnVuIG9uIGhvc3QgZG9jdW1lbnQpXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkRXh0cmFjdGVkV2ViQ29tcG9uZW50KFxuICAgICAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICAgICAgc2tpbjogSVNraW5Db25maWcsXG4gICAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgICAgIGh0bWw6IHN0cmluZyxcbiAgICAgICAgb3B0aW9ucz86IGxvYWRlck9wdGlvbnNcbiAgICApOiBQcm9taXNlPE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQ+IHtcbiAgICAgICAgY29uc3Qgc2NyaXB0Q29udGVudCA9IHRoaXMuZXh0cmFjdFdlYkNvbXBvbmVudFNjcmlwdChodG1sKTtcblxuICAgICAgICBpZiAoIXNjcmlwdENvbnRlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW015b3BXZWJDb21wb25lbnRdIE5vIDxzY3JpcHQgaWQ9XCJteW9wLXdlYi1jb21wb25lbnRcIj4gZm91bmQgaW4gSFRNTCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlIGNvbXBvbmVudCBkZWZpbml0aW9uIGlkIGFzIHNjcmlwdCBpZGVudGlmaWVyIGZvciBkZWR1cGxpY2F0aW9uXG4gICAgICAgIGNvbnN0IHNjcmlwdElkID0gYCR7Y29tcG9uZW50RGVmaW5pdGlvbi5pZH0tJHtza2luLmlkfWA7XG5cbiAgICAgICAgLy8gU3RvcmUgX19NWU9QX1RBR19OQU1FX18gYmVmb3JlIGV4ZWN1dGlvbiB0byBjYXB0dXJlIGl0XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVGFnTmFtZSA9ICh3aW5kb3cgYXMgYW55KS5fX01ZT1BfVEFHX05BTUVfXztcblxuICAgICAgICAvLyBFeGVjdXRlIHRoZSBzY3JpcHQgb24gdGhlIGhvc3QgZG9jdW1lbnRcbiAgICAgICAgdGhpcy5leGVjdXRlV2ViQ29tcG9uZW50U2NyaXB0KHNjcmlwdENvbnRlbnQsIHNjcmlwdElkKTtcblxuICAgICAgICAvLyBHZXQgdGhlIHRhZyBuYW1lIHRoYXQgd2FzIHNldCBieSB0aGUgc2NyaXB0XG4gICAgICAgIGNvbnN0IHRhZ05hbWUgPSAod2luZG93IGFzIGFueSkuX19NWU9QX1RBR19OQU1FX187XG5cbiAgICAgICAgaWYgKCF0YWdOYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tNeW9wV2ViQ29tcG9uZW50XSBTY3JpcHQgZGlkIG5vdCBzZXQgd2luZG93Ll9fTVlPUF9UQUdfTkFNRV9fJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXN0b3JlIHByZXZpb3VzIHRhZyBuYW1lIGlmIHRoaXMgd2FzIGEgcmUtcmVnaXN0cmF0aW9uXG4gICAgICAgIGlmIChwcmV2aW91c1RhZ05hbWUgJiYgcHJldmlvdXNUYWdOYW1lICE9PSB0YWdOYW1lKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFtNeW9wV2ViQ29tcG9uZW50XSBfX01ZT1BfVEFHX05BTUVfXyBjaGFuZ2VkIGZyb20gJHtwcmV2aW91c1RhZ05hbWV9IHRvICR7dGFnTmFtZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgY3VzdG9tIGVsZW1lbnRcbiAgICAgICAgY29uc3QgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YDtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgY29udGFpbmVyIGlmIG5lZWRlZFxuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKSB7XG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb21wb25lbnQgd3JhcHBlclxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudChcbiAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb24sXG4gICAgICAgICAgICBza2luLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIHRhZ05hbWUsXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGRhdGEgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29tcG9uZW50LmluaXRXaXRoRGF0YShvcHRpb25zLmRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coYFtNeW9wV2ViQ29tcG9uZW50XSBMb2FkZWQgPCR7dGFnTmFtZX0+IGludG8gY29udGFpbmVyYCk7XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWcpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBNeW9wIFdlYiBDb21wb25lbnQgKGV4dHJhY3RlZCB3ZWIgY29tcG9uZW50IG1vZGUpXG4gICAgICAgIGlmICh0aGlzLmlzTXlvcFdlYkNvbXBvbmVudChsb2FkZXJDb25maWcuSFRNTCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRFeHRyYWN0ZWRXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBsb2FkZXJDb25maWcuSFRNTCwgb3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YFxuICAgICAgICBsZXQgZWxlbWVudDtcblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICBsZXQgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgICAgICAvLyBTZXQgYWxsIHN0eWxlcyBCRUZPUkUgYXBwZW5kaW5nIHRvIHByZXZlbnQgZmxhc2ggYXQgd3JvbmcgcG9zaXRpb25cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgaW5zZXQ6IDA7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogJHtvcHRpb25zPy5oaWRkZW4gPyAnMCcgOiAnMSd9O1xuICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICAgICAgICBwb2ludGVyLWV2ZW50czogJHtvcHRpb25zPy5oaWRkZW4gPyAnbm9uZScgOiAnYWxsJ307XG4gICAgICAgICAgICBgO1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vIFdyaXRlIGNvbnRlbnQgaW50byB0aGUgaWZyYW1lXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IElmcmFtZUVsZW1lbnQuY29udGVudERvY3VtZW50IHx8IElmcmFtZUVsZW1lbnQuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgICAgIGRvYy5vcGVuKCk7XG5cblxuICAgICAgICAgICAgLy8gUGFyc2UgbXlvcDpzaXplIG1ldGEgdGFnIGJlZm9yZSBpZnJhbWUgY3JlYXRpb24gKHNhbWUgRE9NUGFyc2VyIHBhc3MgcGF0dGVybiBhcyBteW9wX3ByZXZpZXcgcmVtb3ZhbCkuXG4gICAgICAgICAgICAvLyBUaGlzIGxldHMgdGhlIFJlYWN0IGhvc3QgZGV0ZXJtaW5lIHNpemluZyBtb2RlIChmaWxsIHZzIGNvbnRlbnQpIGZyb20gdGhlIHN0YXJ0LlxuICAgICAgICAgICAgbGV0IHBhcnNlZFNpemVNZXRhOiB7IHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyOyBoZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7IG1pbldpZHRoPzogbnVtYmVyOyBtYXhXaWR0aD86IG51bWJlcjsgbWluSGVpZ2h0PzogbnVtYmVyOyBtYXhIZWlnaHQ/OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9wcmVQYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX3ByZURvYyA9IF9wcmVQYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZU1ldGEgPSBfcHJlRG9jLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cIm15b3A6c2l6ZVwiXScpO1xuICAgICAgICAgICAgICAgIGlmIChzaXplTWV0YSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkgeyBwYXJzZWRTaXplTWV0YSA9IEpTT04ucGFyc2Uoc2l6ZU1ldGEuZ2V0QXR0cmlidXRlKCdjb250ZW50JykgfHwgJ3t9Jyk7IH0gY2F0Y2gge31cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBIVE1MMlJlbmRlciA9IGxvYWRlckNvbmZpZy5IVE1MO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uX2luc3BlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAvL2luamVjdCBpbnNwZWN0aW9uIHNjcmlwdCBmb3IgcHJvcHMgZGV0ZWN0aW9uXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9kb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogcGFydCBvZiBBSSBjb21wb25lbnRzLCB0aGluayBhYm91dCB0aGF0LCBkb2N1bWVudCBpdC5cbiAgICAgICAgICAgICAgICBjb25zdCBteW9wX3ByZXZpZXdfc2NyaXB0ID0gX2RvYy5nZXRFbGVtZW50QnlJZCgnbXlvcF9wcmV2aWV3Jyk7XG4gICAgICAgICAgICAgICAgbXlvcF9wcmV2aWV3X3NjcmlwdD8ucmVtb3ZlQXR0cmlidXRlKCd0eXBlJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBQYXJzZSB0aGUgaW5qZWN0ZWQgSFRNTCBzdHJpbmcgaW50byBhIG5vZGVcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wID0gX2RvYy5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoKTtcbiAgICAgICAgICAgICAgICB0ZW1wLmJvZHkuaW5uZXJIVE1MID0gYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmVLZXlzV2luZG93ID0gbmV3IFNldChPYmplY3Qua2V5cyh3aW5kb3cpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlS2V5c1dpbmRvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0ZW1wLmJvZHkuZmlyc3RDaGlsZDtcblxuICAgICAgICAgICAgICAgIGlmIChub2RlICYmIF9kb2MuaGVhZCkge1xuICAgICAgICAgICAgICAgICAgICBfZG9jLmhlYWQuaW5zZXJ0QmVmb3JlKF9kb2MuaW1wb3J0Tm9kZShub2RlLCB0cnVlKSwgX2RvYy5oZWFkLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIEhUTUwyUmVuZGVyID0gX2RvYy5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zPy5kYXRhICE9PSB1bmRlZmluZWQpIHtcblxuICAgICAgICAgICAgICAgIC8vVE9ETzogaW1wcm92ZSBieSBkbyBpdCBvbiB0aGUgc2VydmUgb25jZVxuXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIG15b3BfcHJldmlldyBzY3JpcHQgd2hlbiBub3QgaW4gaW5zcGVjdGlvbiBtb2RlXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9kb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcF9wcmV2aWV3X3NjcmlwdCA9IF9kb2MuZ2V0RWxlbWVudEJ5SWQoJ215b3BfcHJldmlldycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG15b3BfcHJldmlld19zY3JpcHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbXlvcF9wcmV2aWV3X3NjcmlwdC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgSFRNTDJSZW5kZXIgPSBfZG9jLmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGRvYy53cml0ZWxuKEhUTUwyUmVuZGVyKTtcblxuICAgICAgICAgICAgLy8gd2luZG93Ll9fZmVkZXJhdGlvbl9fID1cbiAgICAgICAgICAgIC8vICAgICB7IC4uLndpbmRvdy5fX2ZlZGVyYXRpb25fXyxcbiAgICAgICAgICAgIC8vICAgICAgICAgLy9UT0RPIDogZ2V0IGZyb20gRU5WIGF0IGJ1aWxkIHRpbWUsXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vIGluamVjdCB2YWx1ZSB0byBtb2R1bGUgYXQgYnVpbGQgdGltZVxuICAgICAgICAgICAgLy8gICAgICAgICAvLyB0b2RheSB3ZSBkb2luZyBzbyBqdXN0IGZvciB0aGUgQ0pTIHZlcnNpb25cbiAgICAgICAgICAgIC8vICAgICAgICAgX19wdWJsaWNfcGF0aF9fIDonaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQnXG4gICAgICAgICAgICAvLyAgICAgICAgICwuLi4ke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICB3aW5kb3cuX19mZWRlcmF0aW9uX18pXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgIH07XG5cbiAgICAgICAgICAgIC8vIEZvciBucG0gcGFja2FnZSB1c2VycyB3aXRoIGJ1bmRsZXJzIChWaXRlL1dlYnBhY2spLCBpbmplY3QgU0RLIGlubGluZVxuICAgICAgICAgICAgLy8gRm9yIENETiB1c2VycyAoc2NyaXB0IHRhZyksIHVzZSBDRE4gVVJMXG4gICAgICAgICAgICBjb25zdCBzZGtTY3JpcHQgPSBIQVNfRU1CRURERURfU0RLXG4gICAgICAgICAgICAgICAgPyBgPHNjcmlwdD4ke0VNQkVEREVEX1NES19DT05URU5UfTwvc2NyaXB0PmBcbiAgICAgICAgICAgICAgICA6IGA8c2NyaXB0IHNyYz1cIiR7d2luZG93Lm15b3AuX19ST09UX1NES19QVUJMSUNfVVJMX199XCI+PC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgLy8gRGlmZmVyZW50IGluaXQgc2NyaXB0IGZvciBlbWJlZGRlZCB2cyBDRE4gU0RLXG4gICAgICAgICAgICAvLyAtIEVtYmVkZGVkIChidW5kbGVkIElJRkUpOiB1c2VzIE15b3BTREsuZ2V0SWZyYW1lTW9kdWxlKCkgd2hpY2ggcmV0dXJucyBtb2R1bGUgZGlyZWN0bHlcbiAgICAgICAgICAgIC8vIC0gQ0ROIChkeW5hbWljIGxvYWRpbmcpOiB1c2VzIHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkgd2hpY2ggd3JhcHMgd2l0aCAuZ2V0KClcbiAgICAgICAgICAgIGNvbnN0IGluaXRTY3JpcHQgPSBIQVNfRU1CRURERURfU0RLXG4gICAgICAgICAgICAgICAgPyBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICBjb25zdCBfX215b3BfaW5pdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlmcmFtZU1vZHVsZSA9IGF3YWl0IE15b3BTREsuZ2V0SWZyYW1lTW9kdWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJZnJhbWVTREsgPSBpZnJhbWVNb2R1bGUuSWZyYW1lU0RLO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2RrID0gbmV3IElmcmFtZVNESygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2RrLmluaXQoKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgX19teW9wX2luaXQoKS50aGVuKCk7XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YFxuICAgICAgICAgICAgICAgIDogYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgd2luZG93Ll9fZmVkZXJhdGlvbl9fLl9fcHVibGljX3BhdGhfXyA9IHdpbmRvdy5fX2ZlZGVyYXRpb25fXy5fX3B1YmxpY19wYXRoX187XG4gICAgICAgICAgICAgICAgICAgY29uc3QgX19teW9wX2luaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNkayA9IG5ldyBJZnJhbWVTREsoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNkay5pbml0KCk7XG4gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgIF9fbXlvcF9pbml0KCkudGhlbigpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgIGRvYy53cml0ZWxuKGAke3Nka1NjcmlwdH0ke2luaXRTY3JpcHR9YCk7XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBkYXRhIHNjcmlwdCBpZiBkYXRhIG9wdGlvbiBpcyBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIFNldHVwIENUQSBxdWV1ZSAtIGNhcHR1cmVzIGFueSBDVEFzIGVtaXR0ZWQgZHVyaW5nIGluaXQgYmVmb3JlIGhvc3QgcmVnaXN0ZXJzIGhhbmRsZXJcbiAgICAgICAgICAgICAgICBjb25zdCBjdGFRdWV1ZVNjcmlwdCA9IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2N0YV9xdWV1ZSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcF9jdGFfaGFuZGxlciA9IGZ1bmN0aW9uKGFjdGlvbiwgcGF5bG9hZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9jdGFfcXVldWUucHVzaCh7YWN0aW9uOiBhY3Rpb24sIHBheWxvYWQ6IHBheWxvYWR9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICAgICAgLy8gRXNjYXBlIGRhdGEgZm9yIHNhZmUgZW1iZWRkaW5nIGluIHNjcmlwdCB0YWdcbiAgICAgICAgICAgICAgICAvLyBKU09OLnN0cmluZ2lmeSBkb2Vzbid0IGVzY2FwZSA8L3NjcmlwdD4gd2hpY2ggY291bGQgYnJlYWsgSFRNTCBwYXJzaW5nXG4gICAgICAgICAgICAgICAgY29uc3QgZXNjYXBlZERhdGEgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmRhdGEpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC88XFwvc2NyaXB0L2dpLCAnXFxcXHUwMDNjL3NjcmlwdCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gU2VsZi1jb250YWluZWQgZGF0YSBpbmplY3Rpb24gc2NyaXB0IHRoYXQ6XG4gICAgICAgICAgICAgICAgLy8gMS4gQ2FsbHMgbXlvcF9pbml0X2ludGVyZmFjZSBpbW1lZGlhdGVseSBpZiBhbHJlYWR5IGRlZmluZWRcbiAgICAgICAgICAgICAgICAvLyAyLiBXYXRjaGVzIGZvciBsYXRlLWRlZmluZWQgbXlvcF9pbml0X2ludGVyZmFjZSB2aWEgZGVmaW5lUHJvcGVydHlcbiAgICAgICAgICAgICAgICAvLyAzLiBDbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIChyZW1vdmVzIHNjcmlwdCB0YWcgYW5kIHdpbmRvdyBkYXRhKVxuICAgICAgICAgICAgICAgIC8vIDQuIFBvc3RzIG1lc3NhZ2UgdG8gcGFyZW50IGZvciBleHRlbnNpb24gdHJhY2tpbmcgKHByZS1pbmplY3RlZCBpbml0KilcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhU2NyaXB0ID0gYDxzY3JpcHQgaWQ9XCJfX215b3BfaW5pdF9kYXRhX3NjcmlwdFwiPlxuICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9ICR7ZXNjYXBlZERhdGF9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjcmlwdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ19fbXlvcF9pbml0X2RhdGFfc2NyaXB0Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWxsSW5pdEludGVyZmFjZSA9IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgYXMgcHJlLWluamVjdGVkIGRhdGEgY2FsbCBmb3IgZXh0ZW5zaW9uIHRyYWNraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X3ByZWluamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbihkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2luaXRfcHJlaW5qZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RpZnkgZXh0ZW5zaW9uIHZpYSBwb3N0TWVzc2FnZSAoaW5pdCogPSBwcmUtaW5qZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTVlPUF9QUkVJTkpFQ1RFRF9JTklUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJyonKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYW51cDogcmVtb3ZlIHNjcmlwdCB0YWcgYW5kIHN0b3JlZCBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmlwdEVsICYmIHNjcmlwdEVsLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0RWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHRFbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3aW5kb3cuX19teW9wX2luaXRfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdW5jdGlvbiBhbHJlYWR5IGV4aXN0cyAtIGNhbGwgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsSW5pdEludGVyZmFjZSh3aW5kb3cubXlvcF9pbml0X2ludGVyZmFjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZ1bmN0aW9uIG5vdCB5ZXQgZGVmaW5lZCAtIHN0b3JlIGRhdGEgYW5kIHdhdGNoIGZvciBkZWZpbml0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X2RhdGEgPSBkYXRhO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9vcmlnaW5hbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbXlvcF9pbml0X2ludGVyZmFjZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3JpZ2luYWwgPSBmbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuX19teW9wX2luaXRfZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0b3JlZERhdGEgPSB3aW5kb3cuX19teW9wX2luaXRfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2luZG93Ll9fbXlvcF9pbml0X2RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEluaXRJbnRlcmZhY2UoZm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vcmlnaW5hbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG4gICAgICAgICAgICAgICAgZG9jLndyaXRlbG4oY3RhUXVldWVTY3JpcHQgKyBkYXRhU2NyaXB0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9jLmNsb3NlKCk7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBjb250cm9sIGZyb20gZGFzaGJvYXJkXG4gICAgICAgICAgICAvLyAgKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLmF1dG9IZWlnaHQgPSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBjb21wID0gbmV3IE15b3BJZnJhbWVDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAgICAgLy8gU3RvcmUgcGFyc2VkIHNpemVNZXRhIG9uIHRoZSBjb21wb25lbnQgc28gdGhlIFJlYWN0IGhvc3QgY2FuIHJlYWQgaXRcbiAgICAgICAgICAgIGNvbXAuc2l6ZU1ldGEgPSBwYXJzZWRTaXplTWV0YTtcblxuICAgICAgICAgICAgaWYgKGxvYWRlckNvbmZpZy5hdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXAub2JzZXJ2ZVNpemVCYXNlZE9uRG9jdW1lbnRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vIGNvbXAucHJvcHMuX2dsb2JhbCA9IGNvbXAuZWxlbWVudC5jb250ZW50V2luZG93O1xuICAgICAgICAgICAgcmV0dXJuIGNvbXA7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5ub25lKSB7XG4gICAgICAgICAgICAvLyBwYXJzZXIgPSBwYXJzZXIgPyBwYXJzZXIgOiBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAvLyBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAvLyBlbGVtZW50ID0gZG9jLmJvZHkuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIC8vZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgZG9tSWQpO1xuXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDsvLy50cmltKCk7XG4gICAgICAgICAgICBlbGVtZW50ID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcblxuICAgICAgICAgICAgLy8gICBjb25zdCBmaXJzdEVsZW1lbnQgPSB0ZW1wbGF0ZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgLy8gICBjb25zdCB6ID0gZmlyc3RFbGVtZW50ID8gZmlyc3RFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA6IG51bGw7XG4gICAgICAgICAgICAvLyAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gICBjb25zb2xlLmxvZyh0ZW1wbGF0ZSwgZmlyc3RFbGVtZW50LCB6KVxuICAgICAgICAgICAgLy8gICBlbGVtZW50ID0gZmlyc3RFbGVtZW50XG5cbiAgICAgICAgICAgIC8vIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Rib2R5Jyk7XG4gICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIGNvbnRhaW5lci5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDtcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgPSBjb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayhlbGVtZW50LCBlbGVtZW50KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21FbGVtZW50TmFtZSA9IHRvQ3VzdG9tRWxlbWVudE5hbWUoY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lICsgc2tpbi5pZCk7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgcmVkZWZpbmUgIVxuICAgICAgICAgICAgaWYgKCFzZWVuLmluY2x1ZGVzKGN1c3RvbUVsZW1lbnROYW1lKSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZUN1c3RvbVdlYkNvbXBvbmVudChjdXN0b21FbGVtZW50TmFtZSwgbG9hZGVyQ29uZmlnLkhUTUwsIGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSk7XG4gICAgICAgICAgICAgICAgc2Vlbi5wdXNoKGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIC8vZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29udGFpbmVyLmlkLnN0YXJ0c1dpdGgoJ215b3AtY29tcC0nKSkge1xuICAgICAgICAvLyAgICAgLy8gaW4gcGxhY2UgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChlbGVtZW50KTtcbiAgICAgICAgLy8gICAgIC8vY29udGFpbmVyID0gZWxlbWVudC5wYXJlbnRFbGVtZW50ITtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2N1c3RvbUVsZW1lbnROYW1lfSAvPmA7XG4gICAgICAgIHJldHVybiBuZXcgTXlvcFdlYkNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSAqIGFzIENTUyBmcm9tIFwiY3NzdHlwZVwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuXG4vLyBpZ25vcmluZyBkb2N1bWVudGF0aW9uXG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGludGVyZmFjZSBDU1NQcm9wZXJ0aWVzIGV4dGVuZHMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPiB7XG59XG5cbmV4cG9ydCB0eXBlIFN0eWxlc2hlZXREZWZpbml0aW9uID0geyBba2V5OiBzdHJpbmddOiBDU1NQcm9wZXJ0aWVzIH07XG5cbmV4cG9ydCBjb25zdCBhcHBseVN0eWxlc2hlZXQgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgc3R5bGVzaGVldDogU3R5bGVzaGVldERlZmluaXRpb24sIGNzcz86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHRhZ0lkID0gYG15b3AtY3NzLSR7dXVpZHY0KCl9YDtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfc3R5bGVzaGVldCwgX3RhZ0lkLCBfY3NzfSkgPT4ge1xuICAgICAgICBjb25zdCBzdHlsZVRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIHN0eWxlVGFnLnR5cGUgPSAndGV4dC9jc3MnO1xuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBDU1Mgc3RyaW5nIGZyb20gdGhlIHN0eWxlcyBvYmplY3RcbiAgICAgICAgbGV0IGNzc1N0cmluZyA9IF9jc3M7XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWxlY3RvciBpbiBfc3R5bGVzaGVldCkge1xuICAgICAgICAgICAgY3NzU3RyaW5nICs9IGAke3NlbGVjdG9yfSB7IGA7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gX3N0eWxlc2hlZXRbc2VsZWN0b3JdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgY3NzU3RyaW5nICs9IGAke3Byb3BlcnR5fTogJHtwcm9wZXJ0aWVzW3Byb3BlcnR5XX07IGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjc3NTdHJpbmcgKz0gJ30gJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgQ1NTIHN0cmluZyBhcyB0aGUgY29udGVudCBvZiB0aGUgPHN0eWxlPiBlbGVtZW50XG4gICAgICAgIHN0eWxlVGFnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzc1N0cmluZykpO1xuICAgICAgICBzdHlsZVRhZy5pZCA9IF90YWdJZDtcbiAgICAgICAgLy8gQXBwZW5kIHRoZSA8c3R5bGU+IGVsZW1lbnRcbiAgICAgICAgKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikuYXBwZW5kQ2hpbGQoc3R5bGVUYWcpO1xuXG4gICAgfSwgKCkgPT4ge1xuICAgIH0sIHtcbiAgICAgICAgX3N0eWxlc2hlZXQ6IHN0eWxlc2hlZXQsXG4gICAgICAgIF9jc3MgOiBjc3MgPyBjc3MgOiAnJyxcbiAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgIH0pKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IGRvY3VtZW50KS5nZXRFbGVtZW50QnlJZChfdGFnSWQpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIF90YWdJZDogdGFnSWRcbiAgICAgICAgfSkpXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgYXBwbHlTdHlsZXNoZWV0TGluayA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBsaW5rOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0YWdJZCA9IGBteW9wLWNzcy0ke3V1aWR2NCgpfWA7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7cm9vdFJlZiwgX3RhZ0lkLCBfbGlua30pID0+IHtcbiAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgIGxpbmtFbGVtZW50LmlkID0gX3RhZ0lkO1xuICAgICAgICBsaW5rRWxlbWVudC5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBfbGluaztcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rRWxlbWVudCk7XG5cbiAgICAgICAgLy8gQXBwZW5kIHRoZSA8c3R5bGU+IGVsZW1lbnRcbiAgICAgICAgKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikuYXBwZW5kQ2hpbGQobGlua0VsZW1lbnQpO1xuICAgIH0sICgpID0+IHtcbiAgICB9LCB7XG4gICAgICAgIF9saW5rIDogbGluayxcbiAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgIH0pKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IGRvY3VtZW50KS5nZXRFbGVtZW50QnlJZChfdGFnSWQpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIF90YWdJZDogdGFnSWRcbiAgICAgICAgfSkpXG4gICAgfVxufVxuIiwgImltcG9ydCB7SUlmcmFtZUxvYWRlckNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IHR5cGUgVG9rZW5NYXAgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8IG51bWJlcj5cblxuY29uc3QgcmVwbGFjZVRva2VucyA9IChpbnB1dDogc3RyaW5nLCB0b2tlbk1hcDogVG9rZW5NYXApOiBzdHJpbmcgPT4ge1xuICAgIC8vIENyZWF0ZSBhIHJlZ2V4IHBhdHRlcm4gZnJvbSB0aGUga2V5cyBvZiB0aGUgdG9rZW5NYXBcbiAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyh0b2tlbk1hcCkuam9pbignfCcpLCAnZycpO1xuXG4gICAgLy8gUmVwbGFjZSB0b2tlbnMgaW4gdGhlIGlucHV0IHN0cmluZyB1c2luZyB0aGUgcmVnZXhcbiAgICByZXR1cm4gaW5wdXQucmVwbGFjZShwYXR0ZXJuLCAobWF0Y2hlZCkgPT4ge1xuICAgICAgICAvLyBSZXR1cm4gdGhlIHJlcGxhY2VtZW50IHZhbHVlIGZyb20gdGhlIHRva2VuTWFwXG4gICAgICAgIHJldHVybiAodG9rZW5NYXBbbWF0Y2hlZF0gfHwgbWF0Y2hlZCkudG9TdHJpbmcoKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUlmcmFtZVNraW5CeVRva2VuaXplciA9IChzZWxlY3RlZFNraW46IElTa2luQ29uZmlnLCB0b2tlbk1hcDogVG9rZW5NYXApID0+IHtcbiAgICBjb25zdCB0eXBlZFNraW5Db25maWcgPSAoc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKVxuICAgIGlmICh0eXBlZFNraW5Db25maWcudHlwZSAhPT0gJ0lmcmFtZUxvYWRlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpZnJhbWVTa2luVXJsVG9rZW5pemVyIHJlY2VpdmVkIHNraW4gd2l0aCBsb2FkZXIgdHlwZSBcIiR7dHlwZWRTa2luQ29uZmlnLnR5cGV9XCIsIGN1cnJlbnRseSBvbmx5IFwiSWZyYW1lTG9hZGVyXCIgaXMgc3VwcG9ydGVkYClcbiAgICB9XG5cbiAgICBzZWxlY3RlZFNraW4ubG9hZGVyID0ge1xuICAgICAgICAuLi5zZWxlY3RlZFNraW4ubG9hZGVyXG4gICAgfVxuXG4gICAgc2VsZWN0ZWRTa2luLmxvYWRlci51cmwgPSByZXBsYWNlVG9rZW5zKHNlbGVjdGVkU2tpbi5sb2FkZXIudXJsLCB0b2tlbk1hcCk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRTa2luO1xufVxuXG5leHBvcnQgY29uc3QgY2hhbmdlU2tpblVybEJ5VG9rZW5pemVyID0gKHRva2VuTWFwOiBUb2tlbk1hcCkgPT4ge1xuICAgIHJldHVybiBhc3luYyAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuICAgICAgICByZXR1cm4gY3JlYXRlSWZyYW1lU2tpbkJ5VG9rZW5pemVyKHNlbGVjdGVkU2tpbiwgdG9rZW5NYXApO1xuICAgIH1cbn0iLCAiaW1wb3J0IHtDdXN0b21SZWZNZXNzYWdlfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9ob3N0XCI7XG5cbi8vIGNvbnN0IHNwYWNlID0gJyAnO1xuLy8gZXhwb3J0IGNvbnN0IGdldENsYXNzZXMgPSBhc3luYyAoY29ubmVjdGVkUmVmOiBSZWYpOiBQcm9taXNlPHN0cmluZ1tdPiA9PiAoYXdhaXQgZXhlYyhhY3RBczxIVE1MRGl2RWxlbWVudD4oY29ubmVjdGVkUmVmKS5jbGFzc0xpc3QpKS52YWx1ZS5zcGxpdChzcGFjZSk7XG4vLyBleHBvcnQgY29uc3QgYWRkQ2xhc3MgPSBhc3luYyAoY29ubmVjdGVkUmVmOiBSZWYsIGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4vLyAgICAgY29uc3QgY2xhc3NlcyA9IGF3YWl0IGdldENsYXNzZXMoY29ubmVjdGVkUmVmKTtcbi8vICAgICBjbGFzc2VzLmluY2x1ZGVzKGNsYXNzTmFtZSkgfHwgY2xhc3Nlcy5wdXNoKGNsYXNzTmFtZSk7XG4vLyAgICAgLy8gQHRzLWlnbm9yZVxuLy8gICAgIGNvbm5lY3RlZFJlZi5jbGFzc0xpc3QgPSBjbGFzc2VzLmpvaW4oc3BhY2UpO1xuLy8gfVxuLy8gZXhwb3J0IGNvbnN0IHJlbW92ZUNsYXNzID0gYXN5bmMgKGNvbm5lY3RlZFJlZjogUmVmLCBjbGFzc05hbWU6IHN0cmluZywpID0+IHtcbi8vICAgICBsZXQgY2xhc3NlcyA9IGF3YWl0IGdldENsYXNzZXMoY29ubmVjdGVkUmVmKTtcbi8vICAgICAvLyBAdHMtaWdub3JlXG4vLyAgICAgY29ubmVjdGVkUmVmLmNsYXNzTGlzdCA9IGNsYXNzZXMuZmlsdGVyKGMgPT4gYyAhPT0gY2xhc3NOYW1lKS5qb2luKHNwYWNlKTtcbi8vIH1cbi8vXG4vL1xuXG5leHBvcnQgY29uc3QgYWRkQ2xhc3MgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgY2xhc3NOYW1lOiBzdHJpbmcsIG15b3BJZDogc3RyaW5nKSA9PiB7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIF9jbGFzc05hbWV9KSA9PiB7XG4gICAgICAgIHJlZj8uY2xhc3NMaXN0LmFkZChfY2xhc3NOYW1lKTtcbiAgICB9LCB7XG4gICAgICAgIGVsZW1lbnRJZDogbXlvcElkLFxuICAgICAgICBfY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgICB9KSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVDbGFzcyA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjbGFzc05hbWU6IHN0cmluZywgbXlvcElkOiBzdHJpbmcpID0+IHtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgX2NsYXNzTmFtZX0pID0+IHtcbiAgICAgICAgcmVmPy5jbGFzc0xpc3QucmVtb3ZlKF9jbGFzc05hbWUpO1xuICAgIH0sIHtcbiAgICAgICAgZWxlbWVudElkOiBteW9wSWQsXG4gICAgICAgIF9jbGFzc05hbWU6IGNsYXNzTmFtZVxuICAgIH0pKTtcbn0iLCAiaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZywgSUhUTUxMb2FkZXJDb25maWcsIElSZWZDb25maWcsXG4gICAgSVNraW5Mb2FkZXJDb25maWcsXG4gICAgSVNraW5TZWxlY3RvckNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZywgSVNraW5Db25maWdcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlscy50c1wiO1xuXG5leHBvcnQgY2xhc3MgU2tpbkNvbmZpZyBpbXBsZW1lbnRzIElTa2luQ29uZmlnIHtcbiAgICBfcnVuVGltZUluc3RhbmNlSWQgPSAncnVudGltZS1pbnN0YW5jZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVJZCA9ICdydW50aW1lLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZU5hbWUgPSAncnVudGltZS1uYW1lLScgKyB1dWlkdjQoKTtcblxuICAgIHN0YXRpYyBjcmVhdGUgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgU2tpbkNvbmZpZygpO1xuICAgIH1cblxuICAgIGlkID0gdGhpcy5fcnVuVGltZUlkO1xuICAgIG5hbWUgPSB0aGlzLl9ydW5UaW1lTmFtZTtcbiAgICBkZXNjcmlwdGlvbiA9ICcnO1xuICAgIGxvYWRlciA9IG51bGwgYXMgdW5rbm93biBhcyBJU2tpbkxvYWRlckNvbmZpZztcblxuICAgIHdpdGhMb2FkZXIgPSAobG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aEhUTUxMb2FkZXIgPSAobG9hZGVyOiBPbWl0PElIVE1MTG9hZGVyQ29uZmlnLCAndHlwZSc+KSA9PiB7XG4gICAgICAgIGxvYWRlci50eXBlID0gJ0hUTUxMb2FkZXInO1xuICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgYnVpbGQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBvbmVudENvbmZpZyBpbXBsZW1lbnRzIElDb21wb25lbnRDb25maWcge1xuICAgIF9ydW5UaW1lSW5zdGFuY2VJZCA9ICdydW50aW1lLWluc3RhbmNlLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZUlkID0gJ3J1bnRpbWUtaWQtJyArIHV1aWR2NCgpO1xuICAgIF9ydW5UaW1lTmFtZSA9ICdydW50aW1lLW5hbWUtJyArIHV1aWR2NCgpO1xuXG4gICAgc3RhdGljIGNyZWF0ZSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRDb25maWcoKTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZSA9IHtcbiAgICAgICAgaWQ6IHRoaXMuX3J1blRpbWVJbnN0YW5jZUlkLFxuICAgICAgICBjb21wb25lbnRJZDogdGhpcy5fcnVuVGltZUlkLFxuICAgICAgICBjb21wb25lbnROYW1lOiB0aGlzLl9ydW5UaW1lTmFtZSxcbiAgICAgICAgc2tpblNlbGVjdG9yOiBudWxsIGFzIHVua25vd24gYXMgSVNraW5TZWxlY3RvckNvbmZpZ1xuICAgIH0gYXMgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnO1xuXG4gICAgbmFtZSA9IHRoaXMuX3J1blRpbWVOYW1lXG4gICAgdHlwZSA9IHtcbiAgICAgICAgaWQ6IHRoaXMuX3J1blRpbWVJZCxcbiAgICAgICAgbmFtZTogdGhpcy5fcnVuVGltZU5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgcHJvcHM6IFtdLFxuICAgICAgICByZWZzOiBbXSxcbiAgICAgICAgc2tpbnM6IFtdLFxuICAgICAgICBkZWZhdWx0U2tpbjogMFxuICAgIH0gYXMgSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcblxuICAgIHdpdGhJbnN0YW5jZSA9IChpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aFR5cGUgPSAodHlwZTogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aE5hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhEZWZhdWx0U2tpbiA9IChkZWZhdWx0U2tpbjogSVNraW5Db25maWcpID0+IHtcbiAgICAgICAgdGhpcy50eXBlLnNraW5zLnB1c2goZGVmYXVsdFNraW4pO1xuICAgICAgICB0aGlzLnR5cGUuZGVmYXVsdFNraW4gPSB0aGlzLnR5cGUuc2tpbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICB0eXBlOiAnRGVkaWNhdGVkJyxcbiAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICBpZDogZGVmYXVsdFNraW4uaWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhSZWYgPSAocmVmOiBJUmVmQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMudHlwZS5yZWZzLnB1c2gocmVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aEJhc2ljUmVmID0gKHJlZlNlbGVjdG9yOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgbmV3QmFzaWNSZWYgPSB7XG4gICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICBuYW1lOiByZWZTZWxlY3RvcixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgIHNlbGVjdG9yVHlwZTogJ2lkLWF0dHJpYnV0ZScsXG4gICAgICAgICAgICBzZWxlY3RvcjogcmVmU2VsZWN0b3IsXG4gICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGFzIElSZWZDb25maWdcblxuICAgICAgICB0aGlzLnR5cGUucmVmcy5wdXNoKG5ld0Jhc2ljUmVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgYnVpbGQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMpKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge1xuICAgIElDb21wb25lbnRDb25maWcsXG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnLFxuICAgIElEZWRpY2F0ZWRTa2luQ29uZmlnLFxuICAgIElQcm9wQ29uZmlnLFxuICAgIElTa2luQ29uZmlnLFxuICAgIElVc2VyRmxvdyxcbiAgICBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyxcbiAgICB2Ml9JVmFyaWFudENvbmZpZ1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmNvbnN0IGNvbnZlcnRWMlZhcmlhbnRUb0NvbXBvbmVudENvbmZpZyA9IChjb25maWc6IHYyX0lWYXJpYW50Q29uZmlnKTogSUNvbXBvbmVudENvbmZpZyA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5zdGFuY2U6IHtcbiAgICAgICAgICAgIGlkOiAnYXV0bycsXG4gICAgICAgICAgICBjb21wb25lbnRJZDogY29uZmlnLmNvbXBvbmVudElkLFxuICAgICAgICAgICAgY29tcG9uZW50TmFtZTogY29uZmlnLm5hbWUsXG5cbiAgICAgICAgICAgIHNraW5TZWxlY3Rvcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdEZWRpY2F0ZWQnLFxuICAgICAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdza2luX2F1dG9fdjJfY29udmVydGVkJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWdcblxuICAgICAgICB9IGFzIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyxcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgaWQ6IGNvbmZpZy5pZCxcbiAgICAgICAgICAgIG5hbWU6IGNvbmZpZy5uYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHByb3BzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ2luX2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ215b3BfaW5pdF9pbnRlcmZhY2UnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYW55JyxcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gYXMgSVByb3BDb25maWcsXG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnb3V0X2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ215b3BfY3RhX2hhbmRsZXInLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYW55JyxcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gYXMgSVByb3BDb25maWdcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZWZzOiBbXSxcbiAgICAgICAgICAgIHNraW5zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ3NraW5fYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhhbmRsZSBlbXB0eSA6XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVyOiBjb25maWcuY29uc3VtZV92YXJpYW50WzBdLmxvYWRlclxuICAgICAgICAgICAgICAgIH0gYXMgSVNraW5Db25maWdcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBkZWZhdWx0U2tpbjogMFxuICAgICAgICB9IGFzIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBuYW1lOiBjb25maWcubmFtZVxuICAgIH0gYXMgSUNvbXBvbmVudENvbmZpZztcbn07XG5cbi8qKlxuICogQ2xvdWRSZXBvc2l0b3J5IC0gVW5pZmllZCBjbG91ZCBkYXRhIGFjY2VzcyBsYXllciBmb3IgTXlvcCBjb21wb25lbnRzXG4gKlxuICogU3VwcG9ydHMgYm90aCB2MiAoZGVmYXVsdCkgYW5kIHYxIG1vZGVzOlxuICogLSB2MjogVXNlcyAvY29uc3VtZSBlbmRwb2ludCBmb3IgZmV0Y2hpbmcgdmFyaWFudHNcbiAqIC0gdjE6IFVzZXMgL2Zsb3cgZW5kcG9pbnQgZm9yIGZldGNoaW5nIHVzZXIgZmxvd3NcbiAqL1xuLy8gVXNlIGEgZ2xvYmFsIHNpbmdsZXRvbiB0byBlbnN1cmUgb25seSBvbmUgQ2xvdWRSZXBvc2l0b3J5Lk1haW4gZXhpc3RzXG4vLyBldmVuIHdoZW4gdGhlIG1vZHVsZSBpcyBsb2FkZWQgbXVsdGlwbGUgdGltZXMgYnkgZGlmZmVyZW50IGJ1bmRsZXJzXG5jb25zdCBHTE9CQUxfS0VZID0gJ19fTVlPUF9DTE9VRF9SRVBPU0lUT1JZX01BSU5fXyc7XG5cbmNvbnN0IGdldEdsb2JhbE1haW4gPSAoKTogQ2xvdWRSZXBvc2l0b3J5IHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KVtHTE9CQUxfS0VZXTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gKGdsb2JhbFRoaXMgYXMgYW55KVtHTE9CQUxfS0VZXTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IHNldEdsb2JhbE1haW4gPSAoaW5zdGFuY2U6IENsb3VkUmVwb3NpdG9yeSkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAod2luZG93IGFzIGFueSlbR0xPQkFMX0tFWV0gPSBpbnN0YW5jZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAoZ2xvYmFsVGhpcyBhcyBhbnkpW0dMT0JBTF9LRVldID0gaW5zdGFuY2U7XG4gICAgfVxufTtcblxuZXhwb3J0IGNsYXNzIENsb3VkUmVwb3NpdG9yeSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX21haW46IENsb3VkUmVwb3NpdG9yeSB8IG51bGwgPSBudWxsO1xuXG4gICAgc3RhdGljIGdldCBNYWluKCk6IENsb3VkUmVwb3NpdG9yeSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGEgZ2xvYmFsIGluc3RhbmNlIGFscmVhZHkgZXhpc3RzIChmcm9tIGFub3RoZXIgYnVuZGxlKVxuICAgICAgICBjb25zdCBnbG9iYWxNYWluID0gZ2V0R2xvYmFsTWFpbigpO1xuICAgICAgICBpZiAoZ2xvYmFsTWFpbikge1xuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbE1haW47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgbmV3IGluc3RhbmNlIGlmIG5lZWRlZFxuICAgICAgICBpZiAoIUNsb3VkUmVwb3NpdG9yeS5fbWFpbikge1xuICAgICAgICAgICAgQ2xvdWRSZXBvc2l0b3J5Ll9tYWluID0gbmV3IENsb3VkUmVwb3NpdG9yeSgpO1xuICAgICAgICAgICAgc2V0R2xvYmFsTWFpbihDbG91ZFJlcG9zaXRvcnkuX21haW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDbG91ZFJlcG9zaXRvcnkuX21haW47XG4gICAgfVxuXG4gICAgLy8gdjIgY2FjaGUgLSBrZXllZCBieSBjb21wb25lbnRJZDplbnY6cHJldmlld3xsaXZlXG4gICAgcHJpdmF0ZSB2YXJpYW50czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPj4gPSB7fTtcblxuICAgIC8vIFRyYWNrIHdoaWNoIGNvbXBvbmVudHMgd2VyZSBwcmVsb2FkZWQgYW5kIHdpdGggd2hhdCBwYXJhbXNcbiAgICAvLyBLZXk6IGNvbXBvbmVudElkLCBWYWx1ZTogeyBlbnYsIHByZXZpZXcgfVxuICAgIHByaXZhdGUgcHJlbG9hZGVkQ29tcG9uZW50czogUmVjb3JkPHN0cmluZywgeyBlbnY6IHN0cmluZzsgcHJldmlldzogYm9vbGVhbiB9PiA9IHt9O1xuXG4gICAgLy8gdjEgY2FjaGVcbiAgICBwcml2YXRlIHVzZXJGbG93czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJVXNlckZsb3c+PiA9IHt9O1xuXG4gICAgcHJpdmF0ZSBfZGVmYXVsdEVudiA9ICdwcm9kdWN0aW9uJztcbiAgICBwcml2YXRlIF9lbnZFeHBsaWNpdGx5U2V0ID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9iYXNlVXJsID0gJ2h0dHBzOi8vY2xvdWQubXlvcC5kZXYnKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IGVudmlyb25tZW50IGZvciB0aGlzIENsb3VkUmVwb3NpdG9yeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHNldEVudmlyb25tZW50KGVudjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRFbnYgPSBlbnY7XG4gICAgICAgIHRoaXMuX2VudkV4cGxpY2l0bHlTZXQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBkZWZhdWx0IGVudmlyb25tZW50XG4gICAgICovXG4gICAgZ2V0RGVmYXVsdEVudmlyb25tZW50KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0RW52O1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PSBWMiBNZXRob2RzIChEZWZhdWx0KSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgY29tcG9uZW50IGlzIGFscmVhZHkgY2FjaGVkL3ByZWxvYWRlZCAodjIpXG4gICAgICogSWYgZW52IGFuZCBwcmV2aWV3IGFyZSBub3QgcHJvdmlkZWQsIGNoZWNrcyBpZiBBTlkgdmVyc2lvbiBpcyBwcmVsb2FkZWRcbiAgICAgKi9cbiAgICBpc1ByZWxvYWRlZChjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIElmIHNwZWNpZmljIGVudi9wcmV2aWV3IHJlcXVlc3RlZCwgY2hlY2sgZXhhY3QgbWF0Y2hcbiAgICAgICAgaWYgKGVudiAhPT0gdW5kZWZpbmVkIHx8IHByZXZpZXcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHtjb21wb25lbnRJZH06JHtlbnYgfHwgdGhpcy5fZGVmYXVsdEVudn06JHtwcmV2aWV3ID8gJ3ByZXZpZXcnIDogJ2xpdmUnfWA7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVLZXkgaW4gdGhpcy52YXJpYW50cztcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UgY2hlY2sgaWYgYW55IHZlcnNpb24gd2FzIHByZWxvYWRlZFxuICAgICAgICByZXR1cm4gY29tcG9uZW50SWQgaW4gdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcHJlbG9hZGVkIHBhcmFtcyBmb3IgYSBjb21wb25lbnQgKGlmIHByZWxvYWRlZClcbiAgICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBub3QgcHJlbG9hZGVkXG4gICAgICovXG4gICAgZ2V0UHJlbG9hZGVkUGFyYW1zKGNvbXBvbmVudElkOiBzdHJpbmcpOiB7IGVudjogc3RyaW5nOyBwcmV2aWV3OiBib29sZWFuIH0gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIHYyIGNvbXBvbmVudCBjb25maWdcbiAgICAgKiBJZiBlbnYvcHJldmlldyBub3Qgc3BlY2lmaWVkIGFuZCBjb21wb25lbnQgd2FzIHByZWxvYWRlZCwgdXNlcyBwcmVsb2FkZWQgcGFyYW1zXG4gICAgICovXG4gICAgYXN5bmMgZmV0Y2hDb21wb25lbnRWMihjb21wb25lbnRJZDogc3RyaW5nLCBlbnZpcm9ubWVudElkZW50aWZpZXI/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiB7XG4gICAgICAgIC8vIElmIG5vIGV4cGxpY2l0IGVudi9wcmV2aWV3IGFuZCBjb21wb25lbnQgd2FzIHByZWxvYWRlZCwgdXNlIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgICAgY29uc3QgcHJlbG9hZGVkID0gdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXTtcbiAgICAgICAgY29uc3QgaGFzRXhwbGljaXRQYXJhbXMgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgIT09IHVuZGVmaW5lZCB8fCBwcmV2aWV3ICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IGVudjogc3RyaW5nO1xuICAgICAgICBsZXQgdXNlUHJldmlldzogYm9vbGVhbjtcblxuICAgICAgICBpZiAoIWhhc0V4cGxpY2l0UGFyYW1zICYmIHByZWxvYWRlZCkge1xuICAgICAgICAgICAgLy8gVXNlIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgICAgICAgIGVudiA9IHByZWxvYWRlZC5lbnY7XG4gICAgICAgICAgICB1c2VQcmV2aWV3ID0gcHJlbG9hZGVkLnByZXZpZXc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBVc2UgcHJvdmlkZWQgcGFyYW1zIG9yIGRlZmF1bHRzXG4gICAgICAgICAgICBlbnYgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgfHwgdGhpcy5fZGVmYXVsdEVudjtcbiAgICAgICAgICAgIC8vIElmIHByZXZpZXcgZXhwbGljaXRseSB0cnVlIFx1MjE5MiB0cnVlXG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IGV4cGxpY2l0bHkgZmFsc2UgXHUyMTkyIGZhbHNlXG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IHVuZGVmaW5lZDogZW52IHdhcyBzcGVjaWZpZWQgKHZpYSBwYXJhbSBvciBzZXRFbnZpcm9ubWVudCkgXHUyMTkyIGZhbHNlLCBvdGhlcndpc2UgXHUyMTkyIHRydWVcbiAgICAgICAgICAgIGNvbnN0IGhhc0VmZmVjdGl2ZUVudiA9IGVudmlyb25tZW50SWRlbnRpZmllciB8fCB0aGlzLl9lbnZFeHBsaWNpdGx5U2V0O1xuICAgICAgICAgICAgdXNlUHJldmlldyA9IHByZXZpZXcgPT09IHRydWUgPyB0cnVlIDogKHByZXZpZXcgPT09IGZhbHNlID8gZmFsc2UgOiAhaGFzRWZmZWN0aXZlRW52KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7Y29tcG9uZW50SWR9OiR7ZW52fToke3VzZVByZXZpZXcgPyAncHJldmlldycgOiAnbGl2ZSd9YDtcblxuICAgICAgICBjb25zb2xlLmxvZygnW0Nsb3VkUmVwb3NpdG9yeV0gZmV0Y2hDb21wb25lbnRWMicsIHtcbiAgICAgICAgICAgIGNvbXBvbmVudElkOiBjb21wb25lbnRJZC5zbGljZSgwLCA4KSArICcuLi4nLFxuICAgICAgICAgICAgZW52LFxuICAgICAgICAgICAgdXNlUHJldmlldyxcbiAgICAgICAgICAgIGNhY2hlS2V5LFxuICAgICAgICAgICAgY2FjaGVkOiBjYWNoZUtleSBpbiB0aGlzLnZhcmlhbnRzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghdGhpcy52YXJpYW50c1tjYWNoZUtleV0pIHtcbiAgICAgICAgICAgIC8vIFRyYWNrIHRoaXMgYXMgcHJlbG9hZGVkIChmaXJzdCBmZXRjaCBjb3VudHMgYXMgcHJlbG9hZClcbiAgICAgICAgICAgIGlmICghdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF0gPSB7IGVudiwgcHJldmlldzogdXNlUHJldmlldyB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy52YXJpYW50c1tjYWNoZUtleV0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gYCR7dGhpcy5fYmFzZVVybH0vY29uc3VtZT9pZD0ke2NvbXBvbmVudElkfSZlbnY9JHtlbnZ9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VQcmV2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcmcHJldmlldz10cnVlJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhbnQgPSBqc29uLml0ZW07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvbXBvbmVudCBcIiR7Y29tcG9uZW50SWR9XCIgbm90IGZvdW5kYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYW50LmNvbnN1bWVfdmFyaWFudCB8fCAhdmFyaWFudC5jb25zdW1lX3ZhcmlhbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiBoYXMgbm8gaW1wbGVtZW50YXRpb24gZm9yIGVudmlyb25tZW50IFwiJHtlbnZ9XCJgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRDb25maWcgPSBjb252ZXJ0VjJWYXJpYW50VG9Db21wb25lbnRDb25maWcodmFyaWFudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvbXBvbmVudENvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy52YXJpYW50c1tjYWNoZUtleV07XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IFYxIE1ldGhvZHMgKExlZ2FjeSkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIHYxIGNvbXBvbmVudCBmcm9tIGEgZmxvd1xuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50VjEoY29tcG9uZW50SWQ6IHN0cmluZywgZmxvd0lkPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmbG93SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRJZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgdGhpcy5mZXRjaEF1dG9GbG93KGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJldHVybiBmbG93LmNvbXBvbmVudHNbMF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaEF1dG9GbG93KGNvbXBvbmVudElkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Y29tcG9uZW50SWR9JmF1dG89dHJ1ZWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoanNvbi5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF07XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hGbG93KGZsb3dJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VyRmxvd3NbZmxvd0lkXSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudXNlckZsb3dzW2Zsb3dJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Zmxvd0lkfSZyZXNvbHZlPWNvbXBvbmVudHNgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT0gQmFja3dhcmQgQ29tcGF0aWJpbGl0eSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBmZXRjaENvbXBvbmVudFYyIG9yIGZldGNoQ29tcG9uZW50VjEgZXhwbGljaXRseVxuICAgICAqIERlZmF1bHRzIHRvIHYxIGJlaGF2aW9yIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZVxuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZD86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaENvbXBvbmVudFYxKGNvbXBvbmVudElkLCBmbG93SWQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ2xvdWRSZXBvc2l0b3J5IGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IHYyX0Nsb3VkUmVwb3NpdG9yeSA9IENsb3VkUmVwb3NpdG9yeTtcbiIsICJleHBvcnQgY29uc3QgZXhlYyA9IGFzeW5jIChnZXR0ZXI6IGFueSkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBnZXR0ZXIoKVxufVxuIiwgImltcG9ydCB7IENsb3VkUmVwb3NpdG9yeSB9IGZyb20gXCIuL0Nsb3VkUmVwb3NpdG9yeVwiO1xuXG5sZXQgX2Nsb3VkUmVwb3NpdG9yeSA9IENsb3VkUmVwb3NpdG9yeS5NYWluO1xuXG5leHBvcnQgY29uc3QgZ2V0Q2xvdWRSZXBvc2l0b3J5ID0gKCkgPT4gX2Nsb3VkUmVwb3NpdG9yeTtcblxuZXhwb3J0IGNvbnN0IGlzUHJlbG9hZGVkID0gKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gX2Nsb3VkUmVwb3NpdG9yeS5pc1ByZWxvYWRlZChjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQcmVsb2FkZWRQYXJhbXMgPSAoY29tcG9uZW50SWQ6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBfY2xvdWRSZXBvc2l0b3J5LmdldFByZWxvYWRlZFBhcmFtcyhjb21wb25lbnRJZCk7XG59O1xuXG5leHBvcnQgY29uc3QgZW5hYmxlTG9jYWxEZXYgPSAoKSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoXCJodHRwOi8vbG9jYWxob3N0OjkyOTJcIik7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q2xvdWRSZXBvc2l0b3J5VXJsID0gKHVybDogc3RyaW5nKSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkodXJsKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDbG91ZFJlcG9zaXRvcnkgPSAocmVwb3NpdG9yeTogQ2xvdWRSZXBvc2l0b3J5KSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RW52aXJvbm1lbnQgPSAoZW52OiBzdHJpbmcpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5LnNldEVudmlyb25tZW50KGVudik7XG59O1xuXG5leHBvcnQgY29uc3QgcHJlbG9hZENvbXBvbmVudHMgPSBhc3luYyAoaWRzOiBzdHJpbmdbXSwgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbikgPT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICAgIGlkcy5tYXAoKGlkKSA9PiBfY2xvdWRSZXBvc2l0b3J5LmZldGNoQ29tcG9uZW50VjIoaWQsIGVudiwgcHJldmlldykpLFxuICAgICk7XG59O1xuIiwgImV4cG9ydCAqIGZyb20gXCIuL2FwcGx5U3R5bGVzaGVldFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaWZyYW1lU2tpblVybFRva2VuaXplclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY2xhc3NMaXN0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25maWdCdWlsZGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9DbG91ZFJlcG9zaXRvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V4ZWNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Nsb3VkUmVwb3NpdG9yeUhlbHBlcnNcIjsiLCAiaW1wb3J0IHtkZWNvbXByZXNzVVVJRHN9IGZyb20gXCIuLi91dGlscy91dWlkLnRzXCI7XG5pbXBvcnQge0Nsb3VkUmVwb3NpdG9yeX0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB7XG4gICAgRXhwZXJpZW5jZVR5cGVzLFxuICAgIElDb21wb25lbnRDb25maWcsIElEZWRpY2F0ZWRTa2luQ29uZmlnLFxuICAgIElTZWdtZW50ZWRTa2luQ29uZmlnLFxuICAgIElTZWdtZW50RXhwZXJpZW5jZSwgSVNraW5JbnN0YW5jZUNvbmZpZyxcbiAgICBTa2luU2VsZWN0b3JUeXBlc1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjb25zdCBjaGVja015b3BPdmVycmlkZSA9IGFzeW5jIChjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcpOiBQcm9taXNlPElDb21wb25lbnRDb25maWcgfCBudWxsPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy9UT0RPOiBzdXBwb3J0IGRpc2FibGluZyB0aGUgbWVjaGFuaXNtXG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zZWFyY2gpO1xuICAgICAgICBjb25zdCBteW9wT3ZlcnJpZGUgPSBwYXJhbXMuZ2V0KCdteW9wT3ZlcnJpZGUnKTtcbiAgICAgICAgaWYgKG15b3BPdmVycmlkZSkge1xuICAgICAgICAgICAgY29uc3QgW3NvdXJjZSwgLi4udXVpZHNdID0gZGVjb21wcmVzc1VVSURzKG15b3BPdmVycmlkZSk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoc291cmNlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tcG9uZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbY29tcG9uZW50SWQsIHNraW5JZF0gPSB1dWlkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VG9PdmVycmlkZSA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZG86IGNoZWNrIGZldGNoQXV0b0Zsb3cuIExvb2tzIGxpa2Ugb25seSBvbmUgc2tpbiBpcyByZXR1cm5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2tpbiA9IGNvbXBvbmVudFRvT3ZlcnJpZGUudHlwZS5za2lucy5maW5kKHNraW4gPT4gc2tpbi5pZCA9PT0gc2tpbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9kbzogZm9yIG5vdyBqdXN0IHNldCBza2luIGlkLiBDaGVjayB0aGUgY2xvdWQgaW1wbGVtZW50YXRpb25cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBza2luSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJU2tpbkluc3RhbmNlQ29uZmlnXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFRvT3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyAgICBjYXNlICdmbG93Jzoge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQgOiB7XG4gICAgICAgICAgICAgICAgICAgLy8gY29uc3QgW2Zsb3dJZCwgZXhwZXJpbWVudElkXSA9IHV1aWRzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbZmxvd0lkLCBleHBlcmltZW50SWRdID0gZGVjb21wcmVzc1VVSURzKG15b3BPdmVycmlkZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaEZsb3coZmxvd0lkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VG9PdmVycmlkZSA9IGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRDb25maWcudHlwZS5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IudHlwZSA9PT0gU2tpblNlbGVjdG9yVHlwZXMuU2VnbWVudGVkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRXhwZXJpZW5jZSA9IGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcy5maW5kKGUgPT4gZS5pZCA9PT0gZXhwZXJpbWVudElkKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRFeHBlcmllbmNlPy50eXBlID09PSBFeHBlcmllbmNlVHlwZXMuU2VnbWVudCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFJlc29sdmVkRXhwZXJpZW5jZSA9IHJlc29sdmVkRXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2VcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTa2luU2VsZWN0b3IgPSBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciBhcyBJU2VnbWVudGVkU2tpbkNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IHR5cGVkU2tpblNlbGVjdG9yLnNlZ21lbnRzLmZpbmQocyA9PiBzLnNlZ21lbnRJZCA9PT0gdHlwZWRSZXNvbHZlZEV4cGVyaWVuY2Uuc2VnbWVudC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0gc2VnbWVudD8uc2tpblNlbGVjdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUb092ZXJyaWRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBIb3N0IFNESyBpcyBkZXNpZ25lZCBmb3IgaW50ZWdyYXRpb24gd2l0aGluIHRoZSBob3N0IGFwcGxpY2F0aW9uIHRoYXQgc2VydmVzIGFzIHRoZSBjb250YWluZXIgZm9yIE15b3AgIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogSXQgcHJvdmlkZXMgZXNzZW50aWFsIGZ1bmN0aW9uYWxpdGllcyBhbmQgQVBJcyBmb3IgcmVnaXN0ZXJpbmcsIG1hbmFnaW5nLCBhbmQgY29tbXVuaWNhdGluZyB3aXRoIE15b3AgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBUaGlzIFNESyBlbmFibGVzIHNlYW1sZXNzIGVtYmVkZGluZyBvZiBpbmRlcGVuZGVudGx5IGRldmVsb3BlZCBjb21wb25lbnRzIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24sIGVuc3VyaW5nIHNtb290aCBpbnRlcm9wZXJhYmlsaXR5IGFuZCBjb25zaXN0ZW50IHVzZXIgZXhwZXJpZW5jZSBhY3Jvc3MgdmFyaW91cyBNeW9wIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbnMuXG4gKi9cbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuaW1wb3J0IHtJTXlvcExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBFbnZlbG9wZWRNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXNwb25zZSwgTWVzc2FnZURpcmVjdGlvbiwgUmVmXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wSWZyYW1lTG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL2lmcmFtZUxvYWRlclwiO1xuaW1wb3J0IHtXZWJjb21wb25lbnRMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvd2ViY29tcG9uZW50TG9hZGVyXCI7XG5pbXBvcnQgdHlwZSB7SWZyYW1lU0RLfSBmcm9tIFwiLi4vSWZyYW1lXCI7XG5pbXBvcnQge2Nvbm5lY3RQcm9wcywgY29ubmVjdFJlZnMsIGNyZWF0ZVJlZkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtcbiAgICBFeHBlcmllbmNlVHlwZXMsXG4gICAgSUNvbXBvbmVudENvbmZpZyxcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZywgSUV4cGVyaWVuY2UsIElGdW5jdGlvblJlc3VsdHNTZWdtZW50LCBJU2VnbWVudGVkU2tpbkNvbmZpZywgSVNlZ21lbnRFeHBlcmllbmNlLFxuICAgIElTa2luQ29uZmlnLCBJU2tpblNlbGVjdG9yQ29uZmlnLCBTa2luU2VsZWN0b3JUeXBlcyxcblxuXG59IGZyb20gXCIuLi9jb21tb25cIjtcbi8vIEB0cy1pZ25vcmUgaGFuZGxlZCBieSBjdXN0b20gZXNidWlsZCBwbHVnaW5cbmltcG9ydCB2ZXJzaW9uIGZyb20gXCJteW9wLXNkay12ZXJzaW9uXCI7XG5pbXBvcnQge0hUTUxDb21wb25lbnRMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlclwiO1xuaW1wb3J0IHtjaGVja015b3BPdmVycmlkZX0gZnJvbSBcIi4vbXlvcE92ZXJyaWRlLnRzXCI7XG5cbmludGVyZmFjZSBjb21wb25lbnRMb2FkZXJDcmVhdG9yIHtcbiAgICBuZXcobG9hZGVyczogSU15b3BMb2FkZXJbXSk6IGFueTtcbn1cblxuLy8gY29uc3QgZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGFzeW5jIChpZDogc3RyaW5nKSA9PiB7XG4vLyAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYGh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9jb21wb25lbnQ/aWQ9JHtpZH1gKTtcbi8vICAgICBjb25zdCBjb21wb25lbnREZWY6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gKGF3YWl0IHJlcy5qc29uKCkpLml0ZW07XG4vLyAgICAgcmV0dXJuIGNvbXBvbmVudERlZlxuLy8gfVxuXG4vL2NvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vZGZkbGsycDFtMTg3di5jbG91ZGZyb250Lm5ldC9teW9wX3Nkay5taW4uanMnXG5jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2Nkbi5teW9wLmRldi9zZGsvbmV4dC9teW9wX3Nkay5taW4uanMnXG5cbi8qKlxuICogVGhlIEhvc3QgU0RLIGlzIGRlc2lnbmVkIGZvciBpbnRlZ3JhdGlvbiB3aXRoaW4gdGhlIGhvc3QgYXBwbGljYXRpb24gdGhhdCBzZXJ2ZXMgYXMgdGhlIGNvbnRhaW5lciBmb3IgTXlvcCAgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBJdCBwcm92aWRlcyBlc3NlbnRpYWwgZnVuY3Rpb25hbGl0aWVzIGFuZCBBUElzIGZvciByZWdpc3RlcmluZywgbWFuYWdpbmcsIGFuZCBjb21tdW5pY2F0aW5nIHdpdGggTXlvcCBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGVuYWJsZXMgc2VhbWxlc3MgZW1iZWRkaW5nIG9mIGluZGVwZW5kZW50bHkgZGV2ZWxvcGVkIGNvbXBvbmVudHMgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbiwgZW5zdXJpbmcgc21vb3RoIGludGVyb3BlcmFiaWxpdHkgYW5kIGNvbnNpc3RlbnQgdXNlciBleHBlcmllbmNlIGFjcm9zcyB2YXJpb3VzIE15b3AgY29tcG9uZW50IGltcGxlbWVudGF0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvc3RTREsge1xuICAgIHN0YXRpYyBJbnN0YW5jZSA9ICgpID0+IHdpbmRvdy5teW9wLmhvc3RTREs7XG5cbiAgICBjb21wb25lbnRzMmluaXQ6IElNeW9wQ29tcG9uZW50W10gPSBbXTtcbiAgICBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdID0gW107XG4gICAgY29tcG9uZW50c0xvYWRlcnM6IElNeW9wTG9hZGVyW10gPSBbXTtcblxuICAgIHB1YmxpYyBpbml0aWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyB2ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIHR5cGUySW5zdGFuY2VDb3VudDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIHB1YmxpYyBhc3NpZ25JZCA9IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMudHlwZTJJbnN0YW5jZUNvdW50W2NvbXBvbmVudERlZmluaXRpb24uaWRdKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke2NvbXBvbmVudERlZmluaXRpb24uaWR9XyR7Kyt0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXX1gO1xuICAgIH1cblxuICAgIC8vVE9ETyA6IGZpeCB0aGUgaW5zcGVjdCBpbXBsZW1lbnRhdGlvbiBpbnNpZGUgcmVmQ29tcG9uZW50XG4gICAgLy90aGVuIGluc3BlY3RlZCBtYXliZSBjYW4gYmUgZHJvcHBlZFxuICAgIHByaXZhdGUgaW5zcGVjdGVkID0gZmFsc2U7XG4gICAgcHVibGljIGluc3BlY3QgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluc3BlY3RlZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLmluc3BlY3RlZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuaW5zcGVjdCkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbnNwZWN0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGluY29taW5nTWVzc2FnZUhhbmRsZXIgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudDxCYXNlTXlvcE1lc3NhZ2U+KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ2luY29taW5nTWVzc2FnZUhhbmRsZXIgR09UICcsIGV2ZW50KVxuICAgICAgICAvL1RPRE8gOiAgaWYgKGV2ZW50Lm9yaWdpbiAhPT0gXCJodHRwOi8vZXhhbXBsZS5vcmc6ODA4MFwiKSByZXR1cm47XG4gICAgICAgIGlmIChldmVudC5vcmlnaW4gPT09IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbikge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnSSBLbm93IHRoYXQgISEhJyk7XG4gICAgICAgICAgICAvLyAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJldmVudCBvbiBob3N0IHNpZGUgXCIsIGV2ZW50KTtcblxuICAgICAgICBpZiAoZXZlbnQuZGF0YS5teW9wKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5kaXJlY3Rpb24gIT09IE1lc3NhZ2VEaXJlY3Rpb24udXAgJiYgZXZlbnQuZGF0YS5tZXNzYWdlVHlwZSAhPT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdtZXNzYWdlIGRyb3BwZWQgaW4gaG9zdHNkaywgZGlyZWN0aW9uIHdhcyAnLCBldmVudC5kYXRhLmRpcmVjdGlvbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImV2ZW50IG9uIGhvc3Qgc2lkZSBcIiwgZXZlbnQpO1xuXG4gICAgICAgICAgICBjb25zdCBteW9wTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlID0gZXZlbnQuZGF0YTtcblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdFJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdC5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBJbml0TWVzc2FnZShjb21wb25lbnQuaWQpKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gY29tcG9uZW50cyAyIGluaXRcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCAhPT0gKG15b3BNZXNzYWdlIGFzIEluaXRSZXNwb25zZSkuY29udGVudC5pZClcblxuICAgICAgICAgICAgICAgIGNvbnN0IGluaXRpYXRlZENvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IChteW9wTWVzc2FnZSBhcyBJbml0UmVzcG9uc2UpLmNvbnRlbnQ/LmlkKTtcbiAgICAgICAgICAgICAgICBpbml0aWF0ZWRDb21wb25lbnQ/LnNldEluaXRpYXRlZCgpXG4gICAgICAgICAgICAgICAgLy9pbml0aWF0ZWRDb21wb25lbnQ/LnBhcmVudD8uc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IGlzIGl0IHRydWUgdG8gbm90IHBhc3MgZnVydGhlciAoIHRvIHRoZSBjb21wb25lbnQgKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gbXlvcE1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IHR5cGVkTWVzc2FnZS5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZE1lc3NhZ2UuZGlyZWN0aW9uID09PSBNZXNzYWdlRGlyZWN0aW9uLmRvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZE1lc3NhZ2UubWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gRXhlY3V0ZUNvbXBvbmVudE1ldGhvZC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50Lm9uTWVzc2FnZVJlY2VpdmVkKHR5cGVkTWVzc2FnZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVkTWVzc2FnZS5tZXNzYWdlLnJvdXRlID0gdHlwZWRNZXNzYWdlLnJvdXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5zZW5kKHR5cGVkTWVzc2FnZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gdHlwZWRNZXNzYWdlLm1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyQ29tcG9uZW50LnNlbmQodHlwZWRNZXNzYWdlLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIDogbG9nID9cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgLy9jb21wb25lbnQucmVmcy5ib2R5Lm9uTWVzc2FnZVJlY2VpdmVkKG15b3BNZXNzYWdlLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSBteW9wTWVzc2FnZS5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgLy9ubyBpbiBtZW0gY29tcG9uZW50XG4gICAgICAgICAgICAgICAgLy9wYXNzIHRvIHBhcmVudCBIb3N0U0RLIHRvIHRyeSBwcm9jZXNzIHRoZXJlXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5teW9wLklmcmFtZVNESykge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsubWVzc2FnZVRvSG9zdChteW9wTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQub25NZXNzYWdlUmVjZWl2ZWQobXlvcE1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL25vdCBwcm9jZXNzZWQgaW4gb25NZXNzYWdlUmVjZWl2ZWRcbiAgICAgICAgICAgICAgICAgICAgLy9wYXNzIHRvIHBhcmVudCBIb3N0U0RLIHRvIHRyeSBwcm9jZXNzIHRoZXJlXG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5JZnJhbWVTREspXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsubWVzc2FnZVRvSG9zdChteW9wTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXZlbnQuc291cmNlLnBvc3RNZXNzYWdlKFxuICAgICAgICAvLyAgICAgXCJoaSB0aGVyZSB5b3Vyc2VsZiEgIHRoZSBzZWNyZXQgcmVzcG9uc2UgXCIgKyBcImlzOiByaGVlZWVldCFcIixcbiAgICAgICAgLy8gICAgIGV2ZW50Lm9yaWdpbixcbiAgICAgICAgLy8gICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBzeW50aGV0aWNFdmVudCA9IG5ldyBNZXNzYWdlRXZlbnQ8QmFzZU15b3BNZXNzYWdlPignJyxcbiAgICAgICAgICAgIHtkYXRhOiBtZXNzYWdlfVxuICAgICAgICApXG5cbiAgICAgICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VIYW5kbGVyKHN5bnRoZXRpY0V2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdCA9IChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycz86IGNvbXBvbmVudExvYWRlckNyZWF0b3JbXSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaG9zdFNESyBhbHJlYWR5IGluaXRpYXRlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFzaWNMb2FkZXJzID0gW1xuICAgICAgICAgICAgbmV3IE15b3BJZnJhbWVMb2FkZXIoKSxcbiAgICAgICAgICAgIG5ldyBXZWJjb21wb25lbnRMb2FkZXIoKSxcbiAgICAgICAgICAgIG5ldyBIVE1MQ29tcG9uZW50TG9hZGVyKClcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHNMb2FkZXJzID0gW1xuICAgICAgICAgICAgLi4uYmFzaWNMb2FkZXJzXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzKSB7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgY29uc3QgbG9hZGVyQnlUeXBlOiBSZWNvcmQ8c3RyaW5nLCBJTXlvcExvYWRlcj4gPSB7fTtcblxuICAgICAgICAgICAgY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMuZm9yRWFjaChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9yID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21Mb2FkZXIgPSBuZXcgY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcih0aGlzLmNvbXBvbmVudHNMb2FkZXJzKTtcbiAgICAgICAgICAgICAgICBsb2FkZXJCeVR5cGVbY3VzdG9tTG9hZGVyLnR5cGVdID0gY3VzdG9tTG9hZGVyO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycy5mb3JFYWNoKGxvYWRlciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFsb2FkZXJCeVR5cGVbbG9hZGVyLnR5cGVdKVxuICAgICAgICAgICAgICAgICAgICBsb2FkZXJCeVR5cGVbbG9hZGVyLnR5cGVdID0gbG9hZGVyO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycyA9IE9iamVjdC52YWx1ZXMobG9hZGVyQnlUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluY29tbWluZyBtZXNzYWdlcyBmcm9tIElGcmFtZXNcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICBcIm1lc3NhZ2VcIixcbiAgICAgICAgICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlSGFuZGxlcixcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdteW9wIGhvc3RTREsgaW5pdGlhdGVkJywgZG9jdW1lbnQubG9jYXRpb24uaHJlZik7XG4gICAgICAgIHRoaXMuaW5pdGlhdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRTa2luSWRCeVNraW5TZWxlY3RvciA9IGFzeW5jIChza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWcsIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdID0gW10sIGhvb2tzPzogbG9hZGVySG9va3MpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICBhc3luYyBmdW5jdGlvbiBhc3luY0ZpbmQ8VD4oXG4gICAgICAgICAgICBhcnJheTogVFtdLFxuICAgICAgICAgICAgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gUHJvbWlzZTxib29sZWFuPlxuICAgICAgICApOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBhcnJheSkge1xuICAgICAgICAgICAgICAgIGlmIChhd2FpdCBwcmVkaWNhdGUoaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBubyBtYXRjaCBpcyBmb3VuZFxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChza2luU2VsZWN0b3IudHlwZSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY2FzZSBcIkRlZGljYXRlZFNraW5cIiA6IC8vYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgY2FzZSBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQ6IHtcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRTa2luSWQgPSAoc2tpblNlbGVjdG9yIGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnKS5za2luPy5pZFxuICAgICAgICAgICAgICAgICAgICB8fCAoc2tpblNlbGVjdG9yIGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnKS5za2lucyFbMF0uaWQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRTa2luSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZDoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2tpblNlbGVjdG9yID0gKHNraW5TZWxlY3RvciBhcyBJU2VnbWVudGVkU2tpbkNvbmZpZylcbiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gYXdhaXQgYXN5bmNGaW5kKHR5cGVkU2tpblNlbGVjdG9yLnNlZ21lbnRzLCBhc3luYyBzZWdtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQuc2VnbWVudElkID09PSAnRGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwZXJpZW5jZSA9IGV4cGVyaWVuY2VzLmZpbmQoZXhwZXJpZW5jZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZXJpZW5jZS50eXBlID09PSBFeHBlcmllbmNlVHlwZXMuU2VnbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2UpLnNlZ21lbnQuaWQgPT09IHNlZ21lbnQuc2VnbWVudElkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZXhwZXJpZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXhwZXJpZW5jZSBub3QgZm91bmRcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZEV4cGVyaWVuY2UgPSBleHBlcmllbmNlIGFzIElTZWdtZW50RXhwZXJpZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTZWdtZW50ID0gKHR5cGVkRXhwZXJpZW5jZS5zZWdtZW50IGFzIElGdW5jdGlvblJlc3VsdHNTZWdtZW50KVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRGdW5jdGlvbiA9IChob29rcyA/IGhvb2tzIDoge30pW3R5cGVkU2VnbWVudC5mdW5jdGlvbl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50RnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBzZWdtZW50RnVuY3Rpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBzZWdtZW50SWQ6JHtzZWdtZW50LnNlZ21lbnRJZH0sICR7dHlwZWRTZWdtZW50LmZ1bmN0aW9ufSBmdW5jdGlvbiBub3QgcHJvdmlkZWQgIWApXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VnbWVudClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yKHNlZ21lbnQuc2tpblNlbGVjdG9yLCBleHBlcmllbmNlcyk7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJycgLy9UT0RPXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBydW5Ta2luU2VsZWN0b3IgPSBhc3luYyAoY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBob29rcz86IGxvYWRlckhvb2tzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNraW5JZCA9IGF3YWl0IHRoaXMuX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IsIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzLCBob29rcyk7XG4gICAgICAgIHJldHVybiBjb21wb25lbnRDb25maWcudHlwZS5za2lucy5maW5kKHNraW4gPT4gc2tpbi5pZCA9PT0gc2tpbklkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZGVySG9va3M/OiBsb2FkZXJIb29rcztcblxuICAgIHB1YmxpYyBsb2FkQ29tcG9uZW50ID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50Pihjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50IHwgUmVmLCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucyk6XG4gICAgICAgIFByb21pc2U8VD4gPT4ge1xuXG4gICAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gY29udGFpbmVyIHdhcyBmb3VuZCBmb3IgdGhpcyBjb21wb25lbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG92ZXJyaWRkZW5Db25maWcgPSBhd2FpdCBjaGVja015b3BPdmVycmlkZShjb21wb25lbnRDb25maWcpO1xuICAgICAgICBpZiAob3ZlcnJpZGRlbkNvbmZpZykge1xuICAgICAgICAgICAgLy9UT0RPIDogbG9nXG4gICAgICAgICAgICBjb21wb25lbnRDb25maWcgPSBvdmVycmlkZGVuQ29uZmlnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLy8gQHRzLWlnbm9yZVxuICAgICAgICAvLyBpZiAoIWNvbnRhaW5lci5fX25vblByb3hpZWQpIHtcbiAgICAgICAgLy8gICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IChjb250YWluZXIgYXMgdW5rbm93biBhcyBNeW9wUmVmQ29tcG9uZW50KTtcbiAgICAgICAgLy8gICAgIC8vaWYgd2UgZ290IGxvYWRDb21wb25lbnQgb3ZlciBNeW9wUmVmQ29tcG9uZW50XG4gICAgICAgIC8vICAgICBpZiAocmVmQ29tcG9uZW50LmlkICYmIHJlZkNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ29tcG9uZW50KGNvbXBvbmVudENvbmZpZywgcmVmQ29tcG9uZW50LnJlZiwgb3B0aW9ucyk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgLy8gbGV0IHJvb3RDb21wb25lbnQ6IElNeW9wQ29tcG9uZW50ID0gcmVmQ29tcG9uZW50O1xuICAgICAgICAvLyAgICAgICAgIC8vIHdoaWxlKCFyb290Q29tcG9uZW50LmVsZW1lbnQgJiYgcm9vdENvbXBvbmVudC5wYXJlbnQpe1xuICAgICAgICAvLyAgICAgICAgIC8vICAgICByb290Q29tcG9uZW50ID0gcm9vdENvbXBvbmVudC5wYXJlbnRcbiAgICAgICAgLy8gICAgICAgICAvLyB9XG4gICAgICAgIC8vICAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICAvLyByb290Q29tcG9uZW50LmVsZW1lbnRcbiAgICAgICAgLy8gICAgICAgICAvLyAvL3doYXQgbm93ID9cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGNvbnN0IGhvb2tzID0gey4uLih0aGlzLmxvYWRlckhvb2tzID8/IHt9KSwgLi4uKG9wdGlvbnM/Lmhvb2tzID8/IHt9KX07XG5cbiAgICAgICAgY29uc3QgcmVmID0gY29udGFpbmVyIGFzIFJlZjtcbiAgICAgICAgaWYgKHJlZi5teW9wKSB7XG4gICAgICAgICAgICBpZiAocmVmLmNvbXBvbmVudCkge1xuXG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnID0gey4uLmNvbXBvbmVudENvbmZpZ307XG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5jb21wb25lbnRDb25maWcuaW5zdGFuY2VcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRTa2luID0gYXdhaXQgdGhpcy5ydW5Ta2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLCBob29rcykhXG4gICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RlZFNraW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicnVuU2tpblNlbGVjdG9yIGZhaWxlZCB0byBjaG9vc2Ugc2tpbiwgY2hlY2sgdGhlIHByb3ZpZGVkIGNvbmZpZ1wiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8uaG9va3M/LmFmdGVyU2tpblNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU2tpbiA9IGF3YWl0IG9wdGlvbnMuaG9va3MuYWZ0ZXJTa2luU2VsZWN0ZWQoey4uLnNlbGVjdGVkU2tpbn0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgc2tpbjogc2VsZWN0ZWRTa2luXG4gICAgICAgICAgICAgICAgICAgIC8vICBza2luczogW3NlbGVjdGVkU2tpbl1cbiAgICAgICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnXG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gey4uLm9wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLmhvb2tzXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gYXdhaXQgY3JlYXRlUmVmQ29tcG9uZW50PFQ+KHJlZiwgY29tcG9uZW50Q29uZmlnLCB0aGlzLmNvbXBvbmVudHMsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY29ubmVjdCByZWZzIGFuZCBwcm9wcyBpbnNvZGUgY3JlYXRlUmVmQ29tcG9uZW50LCBlbHNld2hlcmUgaXRzIG5vdCByZWFsbHkgPFQ+XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsb2FkIGNvbXBvbmVudCBnb3QgYSBkZXRhY2hlZCByZWYuJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lciBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvKipcbiAgICAgICAgICpcbiAgICAgICAgICogY2hvb3NlIHNraW4gb24gcnVudGltZSAuLi5cbiAgICAgICAgICogICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IudHlwZVxuICAgICAgICAgKi9cblxuICAgICAgICBsZXQgc2VsZWN0ZWRTa2luID0gYXdhaXQgdGhpcy5ydW5Ta2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLCBob29rcykhXG5cbiAgICAgICAgaWYgKCFzZWxlY3RlZFNraW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJ1blNraW5TZWxlY3RvciBmYWlsZWQgdG8gY2hvb3NlIHNraW4sIGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWdcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uaG9va3M/LmFmdGVyU2tpblNlbGVjdGVkKSB7XG4gICAgICAgICAgICBzZWxlY3RlZFNraW4gPSBhd2FpdCBvcHRpb25zLmhvb2tzLmFmdGVyU2tpblNlbGVjdGVkKHsuLi5zZWxlY3RlZFNraW59KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wb25lbnRMb2FkZXIgPSB0aGlzLmNvbXBvbmVudHNMb2FkZXJzLmZpbmQobG9hZGVyID0+IGxvYWRlci50eXBlID09PSBzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUpO1xuXG4gICAgICAgIGlmICghY29tcG9uZW50TG9hZGVyKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm8gbG9hZGVyIFwiJHtzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGV9XCIgd2FzIGZvdW5kIGZvciBjb21wb25lbnRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZm9yIGxvYWRlZCB3ZWJjb21wb25lbnQgbW9kdWxlcyB0byBmb2xsb3dpbmcgbGluZSBjcmVhdGVzIGEgcmFjZSBjb25kaXRpb24gd2l0aCB0aGUgaW5pdCBtZXNzYWdlIGZsb3dcbiAgICAgICAgbGV0IGNvbXBvbmVudCA9IGF3YWl0IGNvbXBvbmVudExvYWRlci5sb2FkKGNvbXBvbmVudENvbmZpZy50eXBlLCBzZWxlY3RlZFNraW4sIGNvbnRhaW5lciwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IHdoZW4gdGhpcyBpcyBub3QgdHJ1ZSA/XG4gICAgICAgIGlmICghY29tcG9uZW50LmlzSW5pdGlhdGVkKVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQucHVzaChjb21wb25lbnQpXG5cbiAgICAgICAgY29tcG9uZW50LmJpbmQoJ29uRGlzcG9zZScsICgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NvbXBvbmVudCBkaXNwb3NlJywgY29tcG9uZW50KTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50cy5maWx0ZXIoYyA9PiBjICE9PSBjb21wb25lbnQpXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdCA9IHRoaXMuY29tcG9uZW50czJpbml0LmZpbHRlcihjID0+IGMgIT09IGNvbXBvbmVudClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG5cbiAgICAgICAgLy8gdHJ1ZSBieSBkZWZhdWx0XG4gICAgICAgIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLmNvbm5lY3RQcm9wcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IG1ha2UgdHlwZSBmaWVsZCBjb25kaXRpb25hbCB0eXBlIGluZmVyIFwic3RyaW5nXCIgPiBzdHJpbmcsIFwibnVtYmVyXCIgPiBudW1iZXIsIGV0Yy4uLlxuICAgICAgICAgICAgY29tcG9uZW50ID0gY29ubmVjdFByb3BzKGNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLnR5cGUucHJvcHMsIHNlbGVjdGVkU2tpbik7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy9UT0RPIDogbWFrZSBvcHRpb25hbD9cbiAgICAgICAgICAgIC8vVE9ETyA6IGZpeCBpc3N1ZXMgd2l0aCB0aW1lb3V0IGFuZCB3cm9uZyByZWYgbmFtZXMgZnJvbSBjb25maWcgdnMgY3VycmVudCBza2luXG4gICAgICAgICAgICBhd2FpdCBjb25uZWN0UmVmcyhjb21wb25lbnQsIGNvbXBvbmVudENvbmZpZywgdGhpcy5jb21wb25lbnRzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAvLyBUT09EIDogdGhyb3cgP1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucz8uc2tpcEluaXQpXG4gICAgICAgICAgICBhd2FpdCBjb21wb25lbnQuaW5pdGlhdGVkKCk7XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudCBhcyBUO1xuICAgIH1cblxuICAgIHB1YmxpYyBuYXZpZ2F0ZSA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4oY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgbmV3Q29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBvcHRpb25zPzogbmF2aWdhdGlvbk9wdGlvbnMpID0+IHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmF2aWdhdGluZyBvbiByZW1vdGUgcmVmIGNvbXBvbmVudHMgaXMgbm90IGltcGxlbWVudGVkIHlldCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21wb25lbnQubWFya2VkRm9yRGlzcG9zZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIGlmIChvcHRpb25zPy5pbnBsYWNlKSB7XG4gICAgICAgIC8vICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgLy8gICAgICAgICBsZXQgbmV3Q29tcG9uZW50ID0gYXdhaXQgdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgICAgIGF3YWl0IG5ld0NvbXBvbmVudC5pbml0aWF0ZWQoKTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICBpZiAob3B0aW9ucy5pbml0KVxuICAgICAgICAvLyAgICAgICAgICAgICBhd2FpdCBvcHRpb25zLmluaXQobmV3Q29tcG9uZW50KTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50O1xuICAgICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJy4uLicpXG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uc3RhZ2VkKSB7XG4gICAgICAgICAgICAvL2NvbnN0IHNlbGVjdGVkU2tpbiA9IHRoaXMucnVuU2tpblNlbGVjdG9yKG5ld0NvbXBvbmVudENvbmZpZylcbiAgICAgICAgICAgIGxldCBuZXdDb21wb25lbnQgPSBhd2FpdCB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuY29udGFpbmVyLCB7XG4gICAgICAgICAgICAgICAgaGlkZGVuOiB0cnVlLFxuICAgICAgICAgICAgICAgIHJlbGF0aXZlOiB7ZGlyZWN0aW9uOiAnYWZ0ZXInLCBjaGlsZDogY29tcG9uZW50LmVsZW1lbnQhfSxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaW5pdClcbiAgICAgICAgICAgICAgICBhd2FpdCBvcHRpb25zLmluaXQobmV3Q29tcG9uZW50KTtcblxuICAgICAgICAgICAgbmV3Q29tcG9uZW50LnNob3coKTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBjb21wb25lbnQuZWxlbWVudCEubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgIGNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmNvbnRhaW5lciwge1xuICAgICAgICAgICAgICAgIHJlbGF0aXZlOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiZWZvcmVcIixcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQ6IG5leHRTaWJsaW5nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIG5hdmlnYXRpb25PcHRpb25zID0ge1xuICAgIHN0YWdlZD86IGJvb2xlYW4sXG4gICAgLy9pbnBsYWNlPzogYm9vbGVhbixcbiAgICBpbml0PzogKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQpID0+IFByb21pc2U8dm9pZD5cbiAgICBza2lwSW5pdD86IGJvb2xlYW5cbn0gJiBsb2FkZXJPcHRpb25zXG5cbnR5cGUgcmVsYXRpdmVMb2FkQ29uZmlnRGlyZWN0aW9uID0gJ2JlZm9yZScgfCAnYWZ0ZXInO1xuXG5cbmV4cG9ydCB0eXBlIGxvYWRlckhvb2tzID0ge1xuICAgIGFmdGVyU2tpblNlbGVjdGVkPzogKHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcpID0+IFByb21pc2U8SVNraW5Db25maWc+XG59ICZcbiAgICAvLyBzZWdtZW50YXRpb24gaG9va3NcbiAgICAoeyBba2V5OiBzdHJpbmddOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbiB9IHwge30pXG5cbi8vVE9ETzogc3VwcG9ydCBzZXJpYWxpemFibGUgdmVyc2lvbiBvZiB0aGF0IG9iamVjdFxuZXhwb3J0IGludGVyZmFjZSByZWxhdGl2ZUxvYWRDb25maWcge1xuICAgIC8vSWYgdGhpcyBpcyBudWxsLCB0aGVuIG5ld05vZGUgaXMgaW5zZXJ0ZWQgYXQgdGhlIGVuZCBvZiBub2RlJ3MgY2hpbGQgbm9kZXMuXG4gICAgLy9odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTm9kZS9pbnNlcnRCZWZvcmVcbiAgICBjaGlsZDogQ2hpbGROb2RlIHwgbnVsbFxuICAgIGRpcmVjdGlvbjogcmVsYXRpdmVMb2FkQ29uZmlnRGlyZWN0aW9uXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUVudmlyb25tZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxudHlwZSBFbGVtZW50QXR0cmlidXRlcyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgbG9hZGVyT3B0aW9ucyB7XG4gICAgaWQ/OiBzdHJpbmdcbiAgICBoaWRkZW4/OiBib29sZWFuXG4gICAgY29ubmVjdFByb3BzPzogYm9vbGVhblxuICAgIHRpbWVvdXQ/OiBudW1iZXJcbiAgICBza2lwSW5pdD86IGJvb2xlYW5cbiAgICByZWxhdGl2ZT86IHJlbGF0aXZlTG9hZENvbmZpZ1xuICAgIGhvb2tzPzogbG9hZGVySG9va3NcbiAgICBlbGVtZW50QXR0cmlidXRlcz86IEVsZW1lbnRBdHRyaWJ1dGVzXG4gICAgX2Vudmlyb25tZW50PzogSUVudmlyb25tZW50XG4gICAgX2hhc1BhcmVudD86IGJvb2xlYW5cbiAgICBfaW5zcGVjdGlvbj86IGJvb2xlYW5cbiAgICBkYXRhPzogYW55XG59XG5cbmlmICghd2luZG93Lm15b3ApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fXG4gICAgfTtcbn1cblxuaWYgKCF3aW5kb3cubXlvcC5ob3N0U0RLKSB7XG4gICAgY29uc3QgX2hvc3RTREsgPSBuZXcgSG9zdFNESygpO1xuICAgIC8vVE9ETzogZW5hYmxlIGxhenkgaW5pdD9cbiAgICBfaG9zdFNESy5pbml0KCk7XG5cbiAgICBpZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgICAgICB9O1xuICAgIH1cbiAgICB3aW5kb3cubXlvcC5ob3N0U0RLID0gX2hvc3RTREs7XG59XG5cbi8vIEB0cy1pZ25vcmVcbmV4cG9ydCBjb25zdCBob3N0U0RLOiBIb3N0U0RLID0gd2luZG93Lm15b3AuaG9zdFNESztcblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnaG9zdFNESycsIGhvc3RTREspO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIG15b3A6IHtcbiAgICAgICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fOiBzdHJpbmcsXG4gICAgICAgICAgICBob3N0U0RLOiBIb3N0U0RLLFxuICAgICAgICAgICAgSWZyYW1lU0RLOiBJbnN0YW5jZVR5cGU8dHlwZW9mIElmcmFtZVNESz5cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyLCBJRWxlbWVudFJlZiwgTXlvcEVsZW1lbnRSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UsIERldGVjdE15b3BSZWZzTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRGV0ZWN0TXlvcFJlZnNNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAobWVzc2FnZTogRGV0ZWN0TXlvcFJlZnNNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfV1gKTtcbiAgICAgICAgLy9jb25zdCBhbGxNeW9wSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAqYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBJRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgLy9sZXQgY291bnRlcnM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcblxuICAgICAgICBhbGxNeW9wSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgaWYgKG15b3BJZCkge1xuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSlcbiAgICAgICAgICAgIH0gLy9lbHNlIHtcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWNvdW50ZXJzW2l0ZW0udGFnTmFtZV0pIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgY291bnRlcnNbaXRlbS50YWdOYW1lXSA9IDA7XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIGNvdW50ZXJzW2l0ZW0udGFnTmFtZV0gPSBjb3VudGVyc1tpdGVtLnRhZ05hbWVdICsgMTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgICAgbXlvcFJlZnMucHVzaChuZXcgWFBhdGhFbGVtZW50UmVmKGAke2l0ZW0udGFnTmFtZX0oJHtjb3VudGVyc1tpdGVtLnRhZ05hbWVdfSlgLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UobWVzc2FnZS5oYW5kbGVyVW5pcXVlSWQsIG15b3BSZWZzKSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtCaW5kQ2xpY2tNZXNzYWdlLCBDbGlja1JlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBCaW5kQ2xpY2tNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKCksIGV2ZW50KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsZWFuVXBUYXNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goY2xlYW5VcFRhc2spO1xuICAgICAgICB9KTtcblxuICAgICAgICAvL2NsZWFuIHVwXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgTXlvcE1lc3NhZ2VzIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8Q2hhbmdlVGV4dE1lc3NhZ2U+IHtcbiAgXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ2hhbmdlVGV4dE1lc3NhZ2U7XG4gICAgXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IENoYW5nZVRleHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGl0ZW0udGV4dENvbnRlbnQgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXIsIFJvb3RSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRXhlY3V0ZVNjcmlwdE1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCByZXBsaWVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgZGF0YSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IoZXZlbnQsIHJlcGxpZXIsIG5ldyBSb290UmVmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLCBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5BZGRFdmVudExpc3RlbmVyTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKG1lc3NhZ2U6IEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlKSA9PiB7XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKG1lc3NhZ2UucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogYW55W10gPSBbXTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy9UT0RPOiB0aGluayBhYm91dCB0aGF0IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZShtZXNzYWdlLmhhbmRsZXJVbmlxdWVJZCwgbWFrZVNlcmlhbGl6YWJsZShlLCBtZXNzYWdlLnNlcmlhbGl6YWJsZVNrZWxldG9uKSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihtZXNzYWdlLnR5cGUsIGhhbmRsZXIpXG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKG1lc3NhZ2UudHlwZSwgaGFuZGxlcilcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4ge1xuICAgICAgICAgICAgICAgIHRhc2soKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldEF0dHJpYnV0ZU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3Mgc2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxTZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFNldEF0dHJpYnV0ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSwgZXZlbnQudmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7SG9zdFNES30gZnJvbSBcIi4uLy4uL2hvc3QvaG9zdFNES1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UudHNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgY3JlYXRlUmVmID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy9UT0RPIDogdXNlIHJlZiBoZWxwZXIgaGVyZVxuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuICAgICAgICAgICAgaWYgKGFsbEl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RTREsgPSBIb3N0U0RLLkluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gYXdhaXQgaG9zdFNESy5sb2FkQ29tcG9uZW50KGV2ZW50Lm5lc3RlZENvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuaXRlbSgwKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucylcblxuICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgaXQgdG8gcGFzcyB0aGUgYXNzaWduZWQgaWRzXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkUmVmQ29uZmlnOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmVmQ29tcG9uZW50LnJlZnMpLmZvckVhY2gocmVmTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWYgPSByZWZDb21wb25lbnQucmVmc1tyZWZOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgcmVmID0gcmVmLl9fbm9uUHJveGllZCB8fCByZWY7XG5cbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlZkNvbmZpZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbmVzdGVkUmVmQ29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIC0gRE9NIGVsZW1lbnQgbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgW10sIHRydWUpKTtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNyZWF0ZVJlZigpLnRoZW4oKTtcbiAgICAgICAgLy9yZXR1cm5pbmcgdW5kZWZpbmVkIHNvIGl0IHdvbid0IGFjdCBhcyBhIGNsZWFudXBcbiAgICB9XG59XG4iLCAiLy8gQHRzLW5vY2hlY2tcbmV4cG9ydCBjb25zdCBvYnNlcnZlRE9NID0gKG9iajogSFRNTEVsZW1lbnQgfCBudWxsLCBjYWxsYmFjazogKG11dGF0aW9uUmVjb3Jkcz86IE11dGF0aW9uUmVjb3JkW10pID0+IHZvaWQpID0+IHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgICBjb25zb2xlLmxvZygnbicpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBNdXRhdGlvbk9ic2VydmVyID0gd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgfHwgd2luZG93LldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG5cbiAgICBpZiAoIW9iaiB8fCBvYmoubm9kZVR5cGUgIT09IDEpIHJldHVybjtcblxuICAgIGlmIChNdXRhdGlvbk9ic2VydmVyKSB7XG4gICAgICAgIC8vIGRlZmluZSBhIG5ldyBvYnNlcnZlclxuICAgICAgICBjb25zdCBtdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spXG4gICAgICAgIC8vIGhhdmUgdGhlIG9ic2VydmVyIG9ic2VydmUgZm9yIGNoYW5nZXMgaW4gY2hpbGRyZW5cbiAgICAgICAgY29uc3QgY29uZmlnID0ge2F0dHJpYnV0ZXM6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZX07XG4gICAgICAgIG11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZShvYmosIGNvbmZpZylcbiAgICAgICAgcmV0dXJuIG11dGF0aW9uT2JzZXJ2ZXJcbiAgICB9XG5cbiAgICAvLyBicm93c2VyIHN1cHBvcnQgZmFsbGJhY2tcbiAgICBlbHNlIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZUluc2VydGVkJywgY2FsbGJhY2ssIGZhbHNlKVxuICAgICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZVJlbW92ZWQnLCBjYWxsYmFjaywgZmFsc2UpXG4gICAgfVxufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge29ic2VydmVET019IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvZG9tT2JzZXJ2ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFNldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuc291cmNlKSB7XG4gICAgICAgICAgICBvYnNlcnZlRE9NKGRvY3VtZW50LmJvZHksICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlKClcbiAgICAgICAgICAgICAgICAgICAgLy8gIG5ldyBFbnZlbG9wZWRNZXNzYWdlKGV2ZW50LnNvdXJjZSEsIG5ldyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSgpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlLCBGb3JtRGF0YUVudHJ5LCBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBJbnB1dEVsZW1lbnRWYWx1ZSx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5jb25zdCBnZXRJbnB1dFZhbHVlID0gKGVsZW1lbnQpOiBJbnB1dEVsZW1lbnRWYWx1ZSA9PiB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBmb3JtXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBkYXRhT2JqZWN0OiBJbnB1dEVsZW1lbnRWYWx1ZSA9IHtcbiAgICAgICAgICAgIGZvcm1EYXRhOiB7fSxcbiAgICAgICAgICAgIHVubWFwcGVkRGF0YTogW11cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBNYW51YWxseSBhZGQgZWxlbWVudHMgd2l0aG91dCBuYW1lc1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKTtcbiAgICAgICAgbGV0IGF1dG9OYW1lSW5kZXhlciA9IC0xO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcElkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gYF8keygrK2F1dG9OYW1lSW5kZXhlcil9YFxuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZURhdGE6IEZvcm1EYXRhRW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRJbnB1dFZhbHVlKGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZWxlbWVudC5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHk6IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudC52YWxpZGl0eSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgIG15b3BJZCxcbiAgICAgICAgICAgICAgICB9O1xuXG5cbiAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBpZighZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSB8fCAhZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSB8fCBub2RlRGF0YS52YWx1ZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjaGVja2JveCBvciByYWRpbyBidXR0b25cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW1lbnQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jaGVja2VkID8gZWxlbWVudC52YWx1ZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGlucHV0IGFuZCB0ZXh0YXJlYSBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC50YWdOYW1lID09PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWxlY3QgZWxlbWVudHMgKGRyb3Bkb3ducylcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0VMRUNUJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZWRpdGFibGUgZGl2cyAoY29udGVudEVkaXRhYmxlKVxuICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmlubmVyVGV4dCB8fCBlbGVtZW50LnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYW4gdW5zdXBwb3J0ZWQgZWxlbWVudCB0eXBlXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogR2V0RWxlbWVudFZhbHVlTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgZ2V0SW5wdXRWYWx1ZShpdGVtKVxuICAgICAgICAgICAgKSwgZXZlbnQpO1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0dldEF0dHJpYnV0ZU1lc3NhZ2UsIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRGaXJzdEVsZW1lbnRCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgR2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxHZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5HZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEdldEF0dHJpYnV0ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGdldEZpcnN0RWxlbWVudEJ5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpXG4gICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UoaXRlbS5nZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSkpLCBldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtSZXNpemVPYnNlcnZlck1lc3NhZ2UsIFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZX0gZnJvbSAnLi4vLi4vbWVzc2FnZXMnXG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRSZXNpemVPYnNlcnZlckhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8U2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlXG5cbiAgICBleGVjdXRvciA9IChldmVudDogU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICAvL1RPRE8gOiBwYXNzIHRoZSBoZWlnaHRcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVzaXplT2JzZXJ2ZXJNZXNzYWdlKCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5KTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldElubmVySHRtbH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWxIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFNldElubmVySHRtbD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0SW5uZXJIdG1sO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFNldElubmVySHRtbCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpdGVtLmlubmVySFRNTCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgSWZyYW1lIFNESyBpcyBpbnRlbmRlZCBmb3Igc2NlbmFyaW9zIHdoZXJlIGRldmVsb3BlcnMgd2lzaCB0byBpbXBsZW1lbnQgTXlvcCBjb21wb25lbnRzIGFzIHNlcGFyYXRlIHdlYiBhcHBsaWNhdGlvbnMgaG9zdGVkIHdpdGhpbiBpZnJhbWVzLjxici8+PGJyLz5cbiAqIEJ5IGltcG9ydGluZyB0aGUgSWZyYW1lIFNESywgZGV2ZWxvcGVycyBnYWluIGFjY2VzcyB0byB0b29scyBhbmQgdXRpbGl0aWVzIG5lY2Vzc2FyeSBmb3IgaGFuZGxpbmcgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBob3N0IGFwcGxpY2F0aW9uIGFuZCB0aGUgZW1iZWRkZWQgaWZyYW1lLWJhc2VkIE15b3AgY29tcG9uZW50czxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGZhY2lsaXRhdGVzIHNlY3VyZSBpc29sYXRpb24sIGFsbG93aW5nIGNvbXBvbmVudHMgdG8gZnVuY3Rpb24gaW5kZXBlbmRlbnRseSB3aGlsZSBzdGlsbCBiZW5lZml0aW5nIGZyb20gdGhlIG92ZXJhbGwgc3RydWN0dXJlIGFuZCBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyBwcm92aWRlZCBieSB0aGUgaG9zdCBhcHBsaWNhdGlvbi48YnIvPjxici8+XG4gKlxuIE9uY2UgbG9hZGVkIHRoZSBgUm9vdFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiBgYGBqc1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuIG9yXG4gYGBgdHNcbiBpbXBvcnQge2dldElmcmFtZU1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCBnZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gb3JcbiBgYGB0c1xuIGltcG9ydCB7SWZyYW1lU0RLfSBmcm9tICdAbXlvcC9zZGsvaWZyYW1lJztcbiBgYGBcbiAqXG4gKi9cbmltcG9ydCB7QmFzZU15b3BTREt9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7RGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge0JpbmRPbkNsaWNrSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlclwiO1xuaW1wb3J0IHtDaGFuZ2VUZXh0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXJcIjtcbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuaW1wb3J0IHtBZGRFdmVudExpc3RlbmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyXCI7XG5pbXBvcnQge3NldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyXCI7XG5pbXBvcnQge1xuICAgIEluaXRSZXF1ZXN0LFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtTZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL1NldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyXCI7XG5pbXBvcnQge0dldEVsZW1lbnRWYWx1ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzXCI7XG4vLyBAdHMtaWdub3JlIGhhbmRsZWQgYnkgY3VzdG9tIGVzYnVpbGQgcGx1Z2luXG5pbXBvcnQgdmVyc2lvbiBmcm9tIFwibXlvcC1zZGstdmVyc2lvblwiO1xuaW1wb3J0IHtHZXRBdHRyaWJ1dGVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZ2V0QXR0cmlidXRlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTZXRSZXNpemVPYnNlcnZlckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9TZXRSZXNpemVPYnNlcnZlckhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHNcIjtcblxuLyoqXG4gVGhlIElmcmFtZSBTREsgaXMgaW50ZW5kZWQgZm9yIHNjZW5hcmlvcyB3aGVyZSBkZXZlbG9wZXJzIHdpc2ggdG8gaW1wbGVtZW50IE15b3AgY29tcG9uZW50cyBhcyBzZXBhcmF0ZSB3ZWIgYXBwbGljYXRpb25zIGhvc3RlZCB3aXRoaW4gaWZyYW1lcy48YnIvPjxici8+XG4gQnkgaW1wb3J0aW5nIHRoZSBJZnJhbWUgU0RLLCBkZXZlbG9wZXJzIGdhaW4gYWNjZXNzIHRvIHRvb2xzIGFuZCB1dGlsaXRpZXMgbmVjZXNzYXJ5IGZvciBoYW5kbGluZyBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGhvc3QgYXBwbGljYXRpb24gYW5kIHRoZSBlbWJlZGRlZCBpZnJhbWUtYmFzZWQgTXlvcCBjb21wb25lbnRzPGJyLz48YnIvPlxuIFRoaXMgU0RLIGZhY2lsaXRhdGVzIHNlY3VyZSBpc29sYXRpb24sIGFsbG93aW5nIGNvbXBvbmVudHMgdG8gZnVuY3Rpb24gaW5kZXBlbmRlbnRseSB3aGlsZSBzdGlsbCBiZW5lZml0aW5nIGZyb20gdGhlIG92ZXJhbGwgc3RydWN0dXJlIGFuZCBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyBwcm92aWRlZCBieSB0aGUgaG9zdCBhcHBsaWNhdGlvbi48YnIvPjxici8+XG5cbiBPbmNlIGxvYWRlZCB0aGUgYFJvb3RTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gYGBganNcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiBvclxuIGBgYHRzXG4gaW1wb3J0IHtnZXRJZnJhbWVNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuICovXG5leHBvcnQgY2xhc3MgSWZyYW1lU0RLIGV4dGVuZHMgQmFzZU15b3BTREsge1xuXG4gICAgcHVibGljIHZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKCF3aW5kb3cubXlvcCkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgd2luZG93Lm15b3AgPSB7fVxuICAgICAgICB9XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLID0gdGhpcztcbiAgICB9XG5cbiAgICBtZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKCFtZXNzYWdlLnJlcGxheVRvSGFuZGxlciAmJiByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkKVxuICAgICAgICAgICAgbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUby5oYW5kbGVyVW5pcXVlSWRcblxuICAgICAgICBjb25zdCBjb21wb25lbnRJZHMgPSBPYmplY3Qua2V5cyh0aGlzLmNvbXBvbmVudHMpO1xuXG4gICAgICAgIGlmICghbWVzc2FnZS5kZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgaWYgKHJlcGxheVRvPy5yb3V0ZSkge1xuICAgICAgICAgICAgICAgIC8vIHRha2luZyB0aGUgZmlyc3QgY29tcG9uZW50IHRoYXQgaW5pdGlhdGVkIHRoYXQgY3ljbGVcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gcmVwbGF5VG8ucm91dGVbcmVwbGF5VG8ucm91dGUubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSBjb21wb25lbnRJZHNbMF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2Uuc291cmNlKVxuICAgICAgICAgICAgbWVzc2FnZS5zb3VyY2UgPSBjb21wb25lbnRJZHNbMF07XG5cbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLnVwXG5cbiAgICAgICAgd2luZG93LnBhcmVudD8ucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgLi4ubWVzc2FnZVxuICAgICAgICB9LCAnKicpO1xuICAgIH1cblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXSA9IFtcbiAgICAgICAgbmV3IENoYW5nZVRleHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBTZXRJbm5lckh0bWxIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBCaW5kT25DbGlja0hhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEV4ZWN1dGVTY3JpcHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBBZGRFdmVudExpc3RlbmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgc2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgR2V0RWxlbWVudFZhbHVlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IFNldFJlc2l6ZU9ic2VydmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgR2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuXG4gICAgICAgIC8vY29tcG9zaXRlIHN1cHBvcnQgbWVzc2FnZXMgOlxuICAgICAgICBuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KVxuICAgIF07XG5cbiAgICBwdWJsaWMgaW5pdCA9ICgpID0+IHtcbiAgICAgICAgd2luZG93Lm9ubWVzc2FnZSA9IHRoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXMuYmluZCh0aGlzKVxuICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXF1ZXN0KCkpXG4gICAgfVxuXG59XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ0lmcmFtZVNESycsIElmcmFtZVNESyk7XG4iLCAiaW1wb3J0ICogYXMgYWxsIGZyb20gJy4vaW5kZXgnXG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcblxuY29uc3QgTXlvcE1lc3NhZ2VzID0ge1xuICAgIC4uLmFsbFxufVxuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdNeW9wTWVzc2FnZXMnLCBNeW9wTWVzc2FnZXMpO1xuIiwgImltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50c1wiO1xuaW1wb3J0ICogYXMgTXlvcEhlbHBlcnMgZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnTXlvcEhlbHBlcnMnLCBNeW9wSGVscGVycyk7XG4iLCAiaW1wb3J0ICcuL2R5bmFtaWNJbXBvcnQvbG9hZF9fZmVkZXJhdGlvbl9fJztcbi8vIEB0cy1pZ25vcmUgaGFuZGxlZCBieSBjdXN0b20gZXNidWlsZCBwbHVnaW5cbmltcG9ydCB2ZXJzaW9uIGZyb20gXCJteW9wLXNkay12ZXJzaW9uXCI7XG5cbmNvbnNvbGUubG9nKCdteW9wIHJvb3Qgc2RrIC0gbG9hZGVkJywgZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKTtcblxuLy8gVE9ETyA6IHJlYWQgdmFsdWUgZnJvbSB3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ10gP1xuLy9jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2RmZGxrMnAxbTE4N3YuY2xvdWRmcm9udC5uZXQvbXlvcF9zZGsubWluLmpzJ1xuY29uc3QgX19ST09UX1NES19QVUJMSUNfVVJMX18gPSAnaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQvbXlvcF9zZGsubWluLmpzJ1xuXG5jb25zdCBnZXRIb3N0TW9kdWxlID0gKCkgPT4gaW1wb3J0KCcuL2hvc3QvaG9zdFNESycpXG5jb25zdCBnZXRJZnJhbWVNb2R1bGUgPSAoKSA9PiBpbXBvcnQoJy4vSWZyYW1lL0lmcmFtZVNESycpXG5jb25zdCBnZXRXZWJjb21wb25lbnRNb2R1bGUgPSAoKSA9PiBpbXBvcnQoJy4vd2ViY29tcG9uZW50L1dlYkNvbXBvbmVudFNESycpXG5jb25zdCBnZXRNeW9wTWVzc2FnZXMgPSAoKSA9PiBpbXBvcnQoJy4vbWVzc2FnZXMvTXlvcE1lc3NhZ2VzJylcbmNvbnN0IGdldE15b3BIZWxwZXJzID0gKCkgPT4gaW1wb3J0KCcuL2hlbHBlcnMvTXlvcEhlbHBlcnMnKVxuXG5jb25zdCBleHBvc2VHbG9iYWxseSA9IChpbXBvcnRGdW5jdGlvbjogKCkgPT4gUHJvbWlzZTxhbnk+KSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiBhc3luYyAoKSA9PiAoYXdhaXQgaW1wb3J0RnVuY3Rpb24oKSkuZ2V0KClcbn1cblxuLy8gRm9yIHNjcmlwdC9nbG9iYWwgdXNhZ2UgOlxuY29uc3Qgcm9vdFNESyA9IHtcbiAgICB2ZXJzaW9uIDogdmVyc2lvbixcbiAgICBnZXRIb3N0TW9kdWxlOiBleHBvc2VHbG9iYWxseShnZXRIb3N0TW9kdWxlKSxcbiAgICBnZXRJZnJhbWVNb2R1bGU6IGV4cG9zZUdsb2JhbGx5KGdldElmcmFtZU1vZHVsZSksXG4gICAgZ2V0V2ViY29tcG9uZW50TW9kdWxlOiBleHBvc2VHbG9iYWxseShnZXRXZWJjb21wb25lbnRNb2R1bGUpLFxuICAgIGdldE15b3BNZXNzYWdlczogZXhwb3NlR2xvYmFsbHkoZ2V0TXlvcE1lc3NhZ2VzKSxcbiAgICBnZXRNeW9wSGVscGVyczogZXhwb3NlR2xvYmFsbHkoZ2V0TXlvcEhlbHBlcnMpXG59O1xuXG4vLyBAdHMtaWdub3JlXG5pZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgIH1cbn1cblxuLy8gQHRzLWlnbm9yZVxuaWYgKCF3aW5kb3cubXlvcC5yb290U0RLKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJvb3RTREssXG4gICAgICAgIC4uLndpbmRvdy5teW9wXG4gICAgfTtcbn0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coXCJteW9wIHJvb3QgaG9zdCBsb2FkZWQgbW9yZSB0aGFuIG9uY2UuXCIpO1xufVxuXG4vLyBGb3IgYnVuZGxlcnMgdXNhZ2UgOlxuY29uc3Qgc2RrTW9kdWxlID0ge1xuICAgIGdldEhvc3RNb2R1bGUsXG4gICAgZ2V0SWZyYW1lTW9kdWxlLFxuICAgIGdldFdlYmNvbXBvbmVudE1vZHVsZVxufVxuZXhwb3J0IHR5cGUgcm9vdFNES1R5cGUgPSB0eXBlb2Ygc2RrTW9kdWxlO1xuXG5leHBvcnQge1xuICAgIGdldEhvc3RNb2R1bGUsXG4gICAgZ2V0SWZyYW1lTW9kdWxlLFxuICAgIGdldFdlYmNvbXBvbmVudE1vZHVsZVxufVxuXG4vLyBkZWNsYXJlIGdsb2JhbCB7XG4vLyAgICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4vLyAgICAgICAgIG15b3A6IHtcbi8vICAgICAgICAgICAgIHJvb3RTREs6IHR5cGVvZiByb290U0RLXG4vLyAgICAgICAgIH1cbi8vICAgICB9XG4vLyB9XG4iLCAiLy8gQHRzLW5vY2hlY2tcbmltcG9ydCB7bW9kdWxlSW5zdGFuY2VLZXksIG9uTG9hZEtleX0gZnJvbSBcIi4vZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuXG5pZiAoIXdpbmRvd1snX19mZWRlcmF0aW9uX18nXSkge1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHNjcmlwdFNyYyA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/LnNyYztcbiAgICBjb25zdCBfX3B1YmxpY19hdXRvX3BhdGhfXyA9IHNjcmlwdFNyYyA/IHNjcmlwdFNyYy5zcGxpdCgnLycpLnNsaWNlKDAsIC0xKS5qb2luKCcvJykgOiAnJztcblxuICAgIHdpbmRvd1snX19mZWRlcmF0aW9uX18nXSA9IHtcbiAgICAgICAgX19wdWJsaWNfYXV0b19wYXRoX18sXG4gICAgICAgIF9fdXNlX3B1YmxpY19hdXRvX3BhdGhfXzogdHJ1ZSxcbiAgICAgICAgX19wdWJsaWNfcGF0aF9fOiB1bmRlZmluZWQsXG4gICAgICAgIF9fbG9hZGluZ190aW1lb3V0X18gOiA1ICogMTAwMFxuICAgIH07XG59IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKCdfX2ZlZGVyYXRpb25fXyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UuJyk7XG59XG5cbndpbmRvd1snX19mZWRlcmF0aW9uX18nXVsnbG9hZF9fZmVkZXJhdGlvbl9fJ10gPSAoc2NyaXB0RmlsZVBhdGgsIG1vZHVsZU5hbWUsIG9uTG9hZCkgPT4ge1xuXG4gICAgaWYgKCF3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bbW9kdWxlTmFtZV0pIHtcbiAgICAgICAgbGV0IHNjcmlwdFRhZztcblxuICAgICAgICB3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bbW9kdWxlTmFtZV0gPSB7fTtcbiAgICAgICAgd2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdW29uTG9hZEtleV0gPSAobW9kdWxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2NyaXB0VGFnKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChzY3JpcHRUYWcpO1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIHRoYXQ6XG4gICAgICAgICAgICAgICAgc2NyaXB0VGFnID0gbnVsbDtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnc2NyaXB0IHJlbW92ZWQuLi4gJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2cobW9kdWxlKTtcblxuICAgICAgICAgICAgd2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdW21vZHVsZUluc3RhbmNlS2V5XSA9IG1vZHVsZTtcbiAgICAgICAgICAgIG9uTG9hZChtb2R1bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2NyaXB0VGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgIC8vc2NyaXB0VGFnLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JztcbiAgICAgICAgc2NyaXB0VGFnLnR5cGUgPSAnbW9kdWxlJztcbiAgICAgICAgc2NyaXB0VGFnLnNyYyA9IHNjcmlwdEZpbGVQYXRoO1xuXG4gICAgICAgIHNjcmlwdFRhZy5hc3luYyA9IHRydWU7XG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0VGFnKTtcblxuICAgICAgICAvLyBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XG4gICAgICAgIC8vIGxpbmsudHlwZSA9IFwidGV4dC9jc3NcIjtcbiAgICAgICAgLy8gbGluay5yZWwgPSBcInN0eWxlc2hlZXRcIjtcbiAgICAgICAgLy8gbGluay5ocmVmID0gZmlsZU5hbWUucmVwbGFjZSgnLmpzJywgJy5jc3MnKTtcbiAgICAgICAgLy8gZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBfX2ZlZGVyYXRpb25fXyBtb2R1bGUgJHttb2R1bGVOYW1lfSBhbHJlYWR5IGxvYWRlZC5gKVxuICAgICAgICBvbkxvYWQod2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdW21vZHVsZUluc3RhbmNlS2V5XSk7XG4gICAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsTUFBYSxnQkFDQSxXQUNBLG1CQUVBO0FBSmI7QUFBQTtBQUFBO0FBQU8sTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sb0JBQW9CO0FBRTFCLE1BQU0sc0JBQXNCLENBQUMsWUFBb0IsV0FBZ0I7QUFFcEUsWUFBSSxPQUFPLGNBQWMsS0FBSyxPQUFPLGNBQWMsRUFBRSxVQUFVLEtBQUssT0FBTyxjQUFjLEVBQUUsVUFBVSxFQUFFLFNBQVMsR0FBRztBQUUvRyxpQkFBTyxjQUFjLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxFQUFDLENBQUMsVUFBVSxHQUFHLE9BQU0sQ0FBQztBQUFBLFFBQ3hFLE9BQU87QUFBQSxRQUVQO0FBQUEsTUFDSjtBQUFBO0FBQUE7OztBQ1pBLE1BQU87QUFBUDtBQUFBO0FBQUEsTUFBTywyQkFBUTtBQUFBO0FBQUE7OztBQ0FmLE1BSWE7QUFKYjtB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QU0sZUFBZSxHQUFHLElBQUk7QUFBQSxFQUNwRDtBQUdBLE1BQU0sVUFBVTtBQUFBLElBQ1osU0FBVTtBQUFBLElBQ1YsZUFBZSxlQUFlLGFBQWE7QUFBQSxJQUMzQyxpQkFBaUIsZUFBZSxlQUFlO0FBQUEsSUFDL0MsdUJBQXVCLGVBQWUscUJBQXFCO0FBQUEsSUFDM0QsaUJBQWlCLGVBQWUsZUFBZTtBQUFBLElBQy9DLGdCQUFnQixlQUFlLGNBQWM7QUFBQSxFQUNqRDtBQUdBLE1BQUksQ0FBQyxPQUFPLE1BQU07QUFFZCxXQUFPLE9BQU87QUFBQSxNQUNWLHlCQUFBQTtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBR0EsTUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTO0FBRXRCLFdBQU8sT0FBTztBQUFBO0FBQUEsTUFFVjtBQUFBLE9BQ0csT0FBTztBQUFBLEVBRWxCLE9BQU87QUFDSCxZQUFRLElBQUksdUNBQXVDO0FBQUEsRUFDdkQ7IiwKICAibmFtZXMiOiBbIlJlcGxheU1lc3NhZ2VLZXkiLCAibWF0Y2giLCAic2NyaXB0SW5wdXRzIiwgInNjcmlwdElucHV0cyIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJzZWVuIiwgIl9hIiwgInRhcmdldCIsICJtYWtlU2VyaWFsaXphYmxlIiwgIl9hIiwgImhlaWdodCIsICJ3aWR0aCIsICJfYSIsICJfYSIsICJfYSIsICJpbml0X2NvbnN0cyIsICJpbml0X2NvbnN0cyIsICJpbml0X2NvbnN0cyIsICJpbml0X2NvbnN0cyIsICJob3N0U0RLIiwgImluaXRfZXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiaW5pdF9jb25zdHMiLCAiZWxlbWVudCIsICJpbml0X2V4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgInNkayIsICJzZWVuIiwgImRvbUlkIiwgImluaXRfaGVscGVycyIsICJpbml0X2hlbHBlcnMiLCAic2tpbiIsICJjb21wb25lbnQiLCAiX2EiLCAic2VnbWVudCIsICJleHBlcmllbmNlIiwgInNlbGVjdGVkU2tpbiIsICJEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIiwgImluaXRfRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJpbml0X2NvbnN0cyIsICJCaW5kT25DbGlja0hhbmRsZXIiLCAiaW5pdF9iaW5kT25DbGlja0hhbmRsZXIiLCAiQ2hhbmdlVGV4dEhhbmRsZXIiLCAiaW5pdF9jaGFuZ2VUZXh0SGFuZGxlciIsICJFeGVjdXRlU2NyaXB0SGFuZGxlciIsICJpbml0X2V4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgIkFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgImluaXRfYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIiLCAic2V0QXR0cmlidXRlSGFuZGxlciIsICJpbml0X3NldEF0dHJpYnV0ZUhhbmRsZXIiLCAiQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciIsICJpbml0X2NvbnN0cyIsICJob3N0U0RLIiwgIk11dGF0aW9uT2JzZXJ2ZXIiLCAiZ2V0SW5wdXRWYWx1ZSIsICJHZXRFbGVtZW50VmFsdWVIYW5kbGVyIiwgImluaXRfR2V0RWxlbWVudFZhbHVlSGFuZGxlciIsICJpbml0X2NvbnN0cyIsICJlbGVtZW50IiwgIlNldElubmVySHRtbEhhbmRsZXIiLCAiaW5pdF9zZXRJbm5lckh0bWxIYW5kbGVyIiwgImluaXRfRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJpbml0X2JpbmRPbkNsaWNrSGFuZGxlciIsICJpbml0X2NoYW5nZVRleHRIYW5kbGVyIiwgImluaXRfZXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiaW5pdF9hZGRFdmVudExpc3RlbmVySGFuZGxlciIsICJpbml0X3NldEF0dHJpYnV0ZUhhbmRsZXIiLCAiaW5pdF9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciIsICJpbml0X0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIiLCAiaW5pdF9zZXRJbm5lckh0bWxIYW5kbGVyIiwgIl9hIiwgIkNoYW5nZVRleHRIYW5kbGVyIiwgIlNldElubmVySHRtbEhhbmRsZXIiLCAiQmluZE9uQ2xpY2tIYW5kbGVyIiwgIkRldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIiLCAiRXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIiLCAic2V0QXR0cmlidXRlSGFuZGxlciIsICJHZXRFbGVtZW50VmFsdWVIYW5kbGVyIiwgIkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIiwgIk15b3BNZXNzYWdlcyIsICJpbml0X015b3BNZXNzYWdlcyIsICJpbml0X2hlbHBlcnMiLCAiX19ST09UX1NES19QVUJMSUNfVVJMX18iXQp9Cg==
4539
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50cyIsICJ2ZXJzaW9uOm15b3Atc2RrLXZlcnNpb24iLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wTWVzc2FnZXMudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvSU15b3BDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvY29tbW9uL0Jhc2VNeW9wU0RLLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vaW5kZXgudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvZ01lc3NhZ2VzLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFJlZkNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50Q29yZS50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2hvc3QvbG9hZGVycy9JTXlvcExvYWRlci50cyIsICIuLi8uLi9zcmMvaG9zdC9sb2FkZXJzL2lmcmFtZUxvYWRlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L2NvbnN0cy50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2hvc3QvbG9hZGVycy93ZWJjb21wb25lbnRMb2FkZXIudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9jb25zdHMudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVycy50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9iaW5kT25DbGlja0hhbmRsZXIudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvY2hhbmdlVGV4dEhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9zaGFkb3dSb290UmVmLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0QXR0cmlidXRlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9XZWJDb21wb25lbnRTREsudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9pbmRleC50cyIsICIuLi8uLi9zcmMvaG9zdC9lbWJlZGRlZFNESy50cyIsICIuLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0hUTUxDb21wb25lbnRMb2FkZXIudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvYXBwbHlTdHlsZXNoZWV0LnRzIiwgIi4uLy4uL3NyYy9oZWxwZXJzL2lmcmFtZVNraW5VcmxUb2tlbml6ZXIudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvY2xhc3NMaXN0LnRzIiwgIi4uLy4uL3NyYy9oZWxwZXJzL2NvbmZpZ0J1aWxkZXIudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvQ2xvdWRSZXBvc2l0b3J5LnRzIiwgIi4uLy4uL3NyYy9oZWxwZXJzL2V4ZWMudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvY2xvdWRSZXBvc2l0b3J5SGVscGVycy50cyIsICIuLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyIsICIuLi8uLi9zcmMvaG9zdC9teW9wT3ZlcnJpZGUudHMiLCAiLi4vLi4vc3JjL2hvc3QvaG9zdFNESy50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vdXRpbHMvZG9tT2JzZXJ2ZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9nZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL1NldFJlc2l6ZU9ic2VydmVySGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvSWZyYW1lU0RLLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9NeW9wTWVzc2FnZXMudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvTXlvcEhlbHBlcnMudHMiLCAiLi4vLi4vc3JjL1NESy50cyIsICIuLi8uLi9zcmMvZHluYW1pY0ltcG9ydC9sb2FkX19mZWRlcmF0aW9uX18udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCBjb25zdCBfX2ZlZGVyYXRpb25fXyA9IFwiX19mZWRlcmF0aW9uX19cIlxuZXhwb3J0IGNvbnN0IG9uTG9hZEtleSA9IFwib25Mb2FkXCJcbmV4cG9ydCBjb25zdCBtb2R1bGVJbnN0YW5jZUtleSA9IFwibW9kdWxlSW5zdGFuY2VcIlxuXG5leHBvcnQgY29uc3QgZGVmaW5lRHluYW1pY0ltcG9ydCA9IChnbG9iYWxOYW1lOiBzdHJpbmcsIG1vZHVsZTogYW55KSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh3aW5kb3dbX19mZWRlcmF0aW9uX19dICYmIHdpbmRvd1tfX2ZlZGVyYXRpb25fX11bZ2xvYmFsTmFtZV0gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKHtbZ2xvYmFsTmFtZV06IG1vZHVsZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnX19mZWRlcmF0aW9uX18gbG9hZGVyIG5vdCBkZWZpbmVkIGZvciBtb2R1bGUnLCBtb2R1bGUpO1xuICAgIH1cbn0iLCAiZXhwb3J0IGRlZmF1bHQgJzAuMy4yMSc7IiwgInR5cGUgU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxUPiA9IFQgfCAoc3RyaW5nICYgUmVjb3JkPG5ldmVyLCBuZXZlcj4pO1xuXG5leHBvcnQgdHlwZSBNeW9wTWVzc2FnZUtleSA9IFN0cmluZ1dpdGhBdXRvY29tcGxldGU8a2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcyB8IGtleW9mIHR5cGVvZiBNeW9wTWVzc2FnZXMuSW4+O1xuXG5leHBvcnQgY29uc3QgTXlvcE1lc3NhZ2VzID0ge1xuICAgIC8vaG9zdCB0byBjb21wb25lbnRcbiAgICAnSW5pdFJlcXVlc3QnOiAnSW5pdFJlcXVlc3QnLFxuICAgICdJbml0UmVzcG9uc2UnOiAnSW5pdFJlc3BvbnNlJyxcbiAgICAnSW5pdE1lc3NhZ2UnOiAnSW5pdE1lc3NhZ2UnLFxuICAgICdEaXNwb3NlTWVzc2FnZSc6ICdEaXNwb3NlTWVzc2FnZScsXG5cbiAgICAnQ2hhbmdlVGV4dE1lc3NhZ2UnOiAnQ2hhbmdlVGV4dE1lc3NhZ2UnLFxuICAgICdCaW5kQ2xpY2tNZXNzYWdlJzogJ0JpbmRDbGlja01lc3NhZ2UnLFxuICAgICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJyxcblxuICAgICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc6ICdFeGVjdXRlU2NyaXB0TWVzc2FnZScsXG5cbiAgICAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnOiAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnLFxuICAgICdTZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnOiAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZScsXG4gICAgJ0VudmVsb3BlZE1lc3NhZ2UnOiAnRW52ZWxvcGVkTWVzc2FnZScsXG5cbiAgICAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc6ICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJyxcbiAgICAnR2V0QXR0cmlidXRlTWVzc2FnZSc6ICdHZXRBdHRyaWJ1dGVNZXNzYWdlJyxcblxuICAgICdTZXRJbm5lckh0bWwnOiAnU2V0SW5uZXJIdG1sJyxcblxuICAgIC8vY29tcG9uZW50IG1lc3NhZ2VzXG4gICAgJ0V4ZWN1dGVDb21wb25lbnRNZXRob2QnOiAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCcsXG4gICAgJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJzogJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJyxcbiAgICAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzogJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZScsXG5cbiAgICAnQ2xlYW51cE1lc3NhZ2UnOiAnQ2xlYW51cE1lc3NhZ2UnLFxuXG4gICAgLy8gZXh0ZXJuYWwgdG8gaG9zdCA6XG4gICAgSW46IHtcbiAgICAgICAgJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJzogJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJyxcbiAgICAgICAgJ0NsaWNrUmVwbGF5TWVzc2FnZSc6ICdDbGlja1JlcGxheU1lc3NhZ2UnLFxuICAgICAgICAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSc6ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJyxcblxuICAgICAgICAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSc6ICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJyxcbiAgICAgICAgJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnOiAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZScsXG5cbiAgICAgICAgXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCI6IFwiR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZVwiLFxuICAgICAgICAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnOiAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnLFxuICAgICAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICAgICAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICAgICAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnOiAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnLFxuICAgICAgICAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzogJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSdcbiAgICB9XG59XG4iLCAiLy9UT0RPIDogcmV1c2UgZnJvbSBvbmUgcGxhY2UuXG4vLyBuZWVkcyB0byBiZSB1c2VkIGluIG15b3Atc2RrLCBteW9wLWRhc2hiYW9yZCwgbXlvcC1zZXJ2ZXIsIG15b3AtY2xpIC4uXG5cbmV4cG9ydCBjb25zdCB1dWlkdjQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIFwiMTAwMDAwMDAtMTAwMC00MDAwLTgwMDAtMTAwMDAwMDAwMDAwXCIucmVwbGFjZSgvWzAxOF0vZywgYyA9PlxuICAgICAgICAoK2MgXiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEpKVswXSAmIDE1ID4+ICtjIC8gNCkudG9TdHJpbmcoMTYpXG4gICAgKTtcbn1cblxuLy8gQ29udmVydCBVVUlEIHN0cmluZyB0byBieXRlc1xuZXhwb3J0IGNvbnN0IHV1aWRUb0J5dGVzID0gKHV1aWQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oXG4gICAgICAgIHV1aWQucmVwbGFjZSgvLS9nLCAnJykubWF0Y2goLy57MSwyfS9nKSEubWFwKGJ5dGUgPT4gcGFyc2VJbnQoYnl0ZSwgMTYpKVxuICAgICk7XG59O1xuXG4vLyBDb252ZXJ0IGJ5dGVzIHRvIFVVSUQgc3RyaW5nXG5leHBvcnQgY29uc3QgYnl0ZXNUb1V1aWQgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGhleCA9IFsuLi5ieXRlc10ubWFwKGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgaGV4LnNsaWNlKDAsIDgpLFxuICAgICAgICBoZXguc2xpY2UoOCwgMTIpLFxuICAgICAgICBoZXguc2xpY2UoMTIsIDE2KSxcbiAgICAgICAgaGV4LnNsaWNlKDE2LCAyMCksXG4gICAgICAgIGhleC5zbGljZSgyMClcbiAgICBdLmpvaW4oJy0nKTtcbn07XG5cbi8vIEJhc2U2NCBVUkwtc2FmZSBlbmNvZGVcbmV4cG9ydCBjb25zdCBiYXNlNjRVcmxFbmNvZGUgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGJhc2U2NCA9IGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5ieXRlcykpO1xuICAgIHJldHVybiBiYXNlNjQucmVwbGFjZSgvXFwrL2csICctJykucmVwbGFjZSgvXFwvL2csICdfJykucmVwbGFjZSgvPSskLywgJycpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGRlY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybERlY29kZSA9IChzdHI6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIGxldCBiYXNlNjQgPSBzdHIucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICB3aGlsZSAoYmFzZTY0Lmxlbmd0aCAlIDQpIGJhc2U2NCArPSAnPSc7XG4gICAgY29uc3QgYmluYXJ5ID0gYXRvYihiYXNlNjQpO1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oYmluYXJ5LCBjaGFyID0+IGNoYXIuY2hhckNvZGVBdCgwKSk7XG59O1xuXG4vLyBDb21wcmVzcyBhbiBhcnJheSBvZiBVVUlEcyBpbnRvIGEgc2hvcnQgVVJMLXNhZmUgc3RyaW5nXG5leHBvcnQgY29uc3QgY29tcHJlc3NVVUlEcyA9ICh1dWlkczogc3RyaW5nW10pOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGFsbEJ5dGVzID0gdXVpZHMuZmxhdE1hcCh1dWlkID0+IEFycmF5LmZyb20odXVpZFRvQnl0ZXModXVpZCkpKTtcbiAgICByZXR1cm4gYmFzZTY0VXJsRW5jb2RlKG5ldyBVaW50OEFycmF5KGFsbEJ5dGVzKSk7XG59O1xuXG4vLyBEZWNvbXByZXNzIGZyb20gVVJMLXNhZmUgc3RyaW5nIGJhY2sgdG8gYW4gYXJyYXkgb2YgVVVJRHNcbmV4cG9ydCBjb25zdCBkZWNvbXByZXNzVVVJRHMgPSAoZW5jb2RlZDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gYmFzZTY0VXJsRGVjb2RlKGVuY29kZWQpO1xuICAgIGlmIChieXRlcy5sZW5ndGggJSAxNiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IGxlbmd0aCcpO1xuXG4gICAgY29uc3QgdXVpZHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICAgICAgdXVpZHMucHVzaChieXRlc1RvVXVpZChieXRlcy5zbGljZShpLCBpICsgMTYpKSk7XG4gICAgfVxuICAgIHJldHVybiB1dWlkcztcbn07XG4iLCAiZXhwb3J0ICogZnJvbSAnLi91dWlkLnRzJ1xuXG5leHBvcnQgY29uc3Qgd2FpdCA9IChtczogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcbmltcG9ydCB7SVJlZkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgTWVzc2FnZURpcmVjdGlvbiB7XG4gICAgc3RhdGljIGRvd24gPSAnZG93bicgYXMgY29uc3RcbiAgICBzdGF0aWMgdXAgPSAndXAnIGFzIGNvbnN0XG59XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VEaXJlY3Rpb25PcHRpb24gPSAndXAnIHwgJ2Rvd24nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BNZXNzYWdlPFQgPSBhbnk+IHtcbiAgICBpZCA9IHV1aWR2NCgpXG5cbiAgICBzdGF0aWMgY3JlYXRlPFQsIFUgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxVPikgPT4gVCA9IHR5cGVvZiB0aGlzPihcbiAgICAgICAgdGhpczogVSxcbiAgICAgICAgLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+XG4gICAgKTogSW5zdGFuY2VUeXBlPHR5cGVvZiB0aGlzPiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzKC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdtZWVzYWdlIGlkIGNyZWF0ZWQnLCB0aGlzLmlkLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtcbiAgICB9XG5cbiAgICBteW9wID0gdHJ1ZVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5IHwgc3RyaW5nO1xuXG4gICAgY29udGVudD86IFRcblxuICAgIC8vIFRPRE8gOiBjYW50IGJlIG9wdGlvbmFsIFxuICAgIHNvdXJjZT86IHN0cmluZ1xuICAgIGRlc3RpbmF0aW9uPzogc3RyaW5nXG5cbiAgICByb3V0ZT86IHN0cmluZ1tdXG5cbiAgICByZWY/OiBSZWZcblxuICAgIGRpcmVjdGlvbj86IE1lc3NhZ2VEaXJlY3Rpb25PcHRpb25cblxuICAgIGNsZWFuYWJsZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEVsZW1lbnRNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcj86IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kTWVzc2FnZTxUID0gYW55LCBSIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleTtcblxuICAgIHB1YmxpYyBoYW5kbGVyVW5pcXVlSWQgPSB1dWlkdjQoKVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGhhbmRsZXI6IChtZXNzYWdlOiBSKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWYge1xuICAgIHB1YmxpYyBteW9wID0gdHJ1ZTtcblxuICAgIHB1YmxpYyBfX25vblByb3hpZWQ/OiBSZWY7XG5cbiAgICBzdGF0aWMgY3JlYXRlKHNlbGVjdG9yOiBzdHJpbmcsIHJlZkNvbmZpZz86IElSZWZDb25maWcsIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIGxldCBfcmVmQ29uZmlnID0gcmVmQ29uZmlnO1xuICAgICAgICBpZiAoIV9yZWZDb25maWcpIHtcbiAgICAgICAgICAgIF9yZWZDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgICAgICBzZWxlY3RvclR5cGU6ICdpZC1hdHRyaWJ1dGUnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29kZSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGFzIElSZWZDb25maWdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlZihfcmVmQ29uZmlnLCBjb21wb25lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZDb25maWc6IElSZWZDb25maWcsIHB1YmxpYyBjb21wb25lbnQ/OiBJTXlvcENvbXBvbmVudCkge1xuICAgICAgICB0aGlzLl9fbm9uUHJveGllZCA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMsXG4gICAgICAgICAgICBjb21wb25lbnQ6IG51bGwgLy8gaW4gb3JkZXIgdG8gYmUgc2VyaWFsaXphYmxlXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdDbGlja1JlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBCaW5kQ2xpY2tNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIENsaWNrUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnQmluZENsaWNrTWVzc2FnZSc7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaGFuZGxlcjogKG1lc3NhZ2U6IENsaWNrUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGlja1JlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIENoYW5nZVRleHRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHN0cmluZz4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnQ2hhbmdlVGV4dE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gdGV4dFxuICAgIH1cbn0iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSdcblxuY29uc3QgZnVuY3Rpb25Cb2R5UmVnZXggPSAvKD86ZnVuY3Rpb25cXHMqXFx3KlxccypcXChbXildKlxcKVxccypcXHsoW1xcc1xcU10qPylcXH18KFxcKFteKV0qXFwpXFxzKj0+XFxzKlxceyhbXFxzXFxTXSo/KVxcfSkpXFxzKiQvO1xuY29uc3QgZXhwcmVzc2lvbkJvZHlSZWdleCA9IC9cXChcXHMqW14pXStcXHMqXFwpXFxzKj0+XFxzKiguKykvO1xuXG5leHBvcnQgY29uc3Qgc3RyaXBGdW5jdGlvbiA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBsZXQgbWF0Y2ggPSBjb250ZW50Lm1hdGNoKGZ1bmN0aW9uQm9keVJlZ2V4KTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoWzFdIHx8IG1hdGNoWzNdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZXhwcmVzc2lvbkJvZHlSZWdleCk7XG4gICAgICAgIGlmIChtYXRjaClcbiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXS50cmltKCk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBzY3JpcHRJbnB1dHMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhblxufSB8IHt9O1xuXG5leHBvcnQgdHlwZSBzY3JpcHRWYXJzPFQ+ID0ge1xuICAgIHNlbmQ6IChkYXRhOiBUKSA9PiB2b2lkO1xuICAgIC8vIGNvbXBsZXRlU3RyZWFtOiAoKSA9PiB2b2lkO1xuICAgIHJvb3RSZWY6IFJvb3RSZWY7XG4gICAgbWFrZVNlcmlhbGl6YWJsZTogdHlwZW9mIG1ha2VTZXJpYWxpemFibGVcbn1cblxuZXhwb3J0IHR5cGUgZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEk+ID0ge1xuICAgIFtLIGluIGtleW9mIEldOiBJW0tdO1xufSAmIHNjcmlwdFZhcnM8VD5cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHN0cmluZywgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPj4ge1xuXG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG4gICAgbWVzc2FnZVR5cGUgPSAnRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuICAgIHNjcmlwdDogc3RyaW5nID0gJydcblxuICAgIHN0YXRpYyByZXBsaWVyS2V5ID0gJ3NlbmQnO1xuICAgIHN0YXRpYyBjb21wbGV0ZVN0cmVhbUtleSA9ICdjb21wbGV0ZVN0cmVhbSc7XG5cbiAgICBjb25zdHJ1Y3RvcihzY3JpcHQ6ICh2YXJzOiBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4pID0+IFQsIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgIH0sIHB1YmxpYyBzY3JpcHRJbnB1dHM/OiBJKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgICAgICB0aGlzLnNjcmlwdCA9IHNjcmlwdC50b1N0cmluZygpO1xuXG4gICAgICAgIC8vVE9ETzogY2FuIGJlIHJlbW92ZVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzdHJpcEZ1bmN0aW9uKHRoaXMuY29udGVudCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBjb250ZW50OiBUKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7XG4gICAgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsXG4gICAgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSxcbiAgICBleHRlbmRlZFNjcmlwdFZhcnMsXG4gICAgc2NyaXB0SW5wdXRzLCBzdHJpcEZ1bmN0aW9uXG59IGZyb20gXCIuL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzXCI7XG5cbmV4cG9ydCB0eXBlIGN1c3RvbVJlZlNjcmlwdElucHV0cyA9IHtcbiAgICBlbGVtZW50SWQ6IHN0cmluZyxcbiAgICByZWY/OiBIVE1MRWxlbWVudCxcbiAgICBfc2NyaXB0Pzogc3RyaW5nLFxuICAgIF9fc2NyaXB0SW5wdXRzPzogT2JqZWN0XG59O1xuXG5leHBvcnQgY2xhc3MgQ3VzdG9tUmVmTWVzc2FnZTxUID0gYW55LCBJIGV4dGVuZHMgc2NyaXB0SW5wdXRzID0gY3VzdG9tUmVmU2NyaXB0SW5wdXRzPiBleHRlbmRzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IHtcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzPikgPT4gVCxcbiAgICAgICAgICAgICAgICBwdWJsaWMgc2NyaXB0SW5wdXRzOiBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIH0pIHtcblxuICAgICAgICAvL21vY2sgdmFyc1xuICAgICAgICAvLyBsZXQgcm9vdFJlZiwgZWxlbWVudElkLCBfc2NyaXB0LCBfX3NjcmlwdElucHV0cztcbiAgICAgICAgc3VwZXIoKHtyb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmcyA9IChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLnF1ZXJ5U2VsZWN0b3JBbGwoYFskeydteW9wLWlkJ309JyR7ZWxlbWVudElkfSddYCk7XG4gICAgICAgICAgICBpZiAocmVmcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyAgY29uc3QgcmVmID0gcmVmc1swXTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IGV4cG9zaW5nIFwicmVmc1wiIGFuZCBub3Qgb25seSBcInJlZlwiXG4gICAgICAgICAgICAgICAgLy9mb3IgY2FzZXMgd2hlcmUgdGhlIFJlZiBoYXMgbXVsdGlwbGF0ZSBpbXBsZW1lbnRhdGlvbnNcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBfX3NjcmlwdElucHV0cy5yZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gKCR7X3NjcmlwdH0pKC4uLmFyZ3VtZW50cylgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHluYW1pY0Z1bmN0aW9uKF9fc2NyaXB0SW5wdXRzKTtcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAvL3JldHVybiBGdW5jdGlvbigncmVmJywgJ3Jvb3RSZWYnLCAuLi5PYmplY3Qua2V5cyhfX3NjcmlwdElucHV0cyksIF9zY3JpcHQhKShyZWYsIHJvb3RSZWYsIC4uLk9iamVjdC52YWx1ZXMoX19zY3JpcHRJbnB1dHMpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGwgYXMgVDtcbiAgICAgICAgfSwgaGFuZGxlcik7XG5cbiAgICAgICAgdGhpcy5zY3JpcHRJbnB1dHMgPSB7XG4gICAgICAgICAgICAuLi5zY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAvL19zY3JpcHQ6IHN0cmlwRnVuY3Rpb24oc2NyaXB0LnRvU3RyaW5nKCkpLFxuICAgICAgICAgICAgX3NjcmlwdDogc2NyaXB0LnRvU3RyaW5nKClcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2VyaWFsaXphYmxlLCBTZXJpYWxpemFibGVTa2VsZXRvbn0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPFQgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwID0ga2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcD4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2Uge1xuXG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG4gICAgbWVzc2FnZVR5cGUgPSAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuICAgIGNsZWFuYWJsZSA9IHRydWU7XG4gICAgc2VyaWFsaXphYmxlU2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPEhUTUxFbGVtZW50RXZlbnRNYXBbVF0+ID0gZmFsc2UgLy8ge30gLy8gZW1wdHlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIHR5cGU6IFQsIHB1YmxpYyBoYW5kbGVyOiAobWVzc2FnZTogRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKVxuICAgIH1cblxuICAgIHdpdGhTZXJpYWxpemFibGVTa2VsZXRvbihzZXJpYWxpemFibGVTa2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248SFRNTEVsZW1lbnRFdmVudE1hcFtUXT4pIHtcbiAgICAgICAgdGhpcy5zZXJpYWxpemFibGVTa2VsZXRvbiA9IHNlcmlhbGl6YWJsZVNrZWxldG9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBlOiBTZXJpYWxpemFibGU8RXZlbnQ+KSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgICAgIHRoaXMuY29udGVudCA9IHtcbiAgICAgICAgICAgIGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmLH0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuXG5leHBvcnQgY2xhc3MgU2V0QXR0cmlidXRlTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRBdHRyaWJ1dGVNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXJpYWxpemFibGV9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBoYW5kbGVyOiAobWVzc2FnZTogRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIEZvcm1EYXRhRW50cnkgPSB7XG4gICAgaWQ/OiBzdHJpbmcsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICB2YWx1ZT86IElucHV0RWxlbWVudFZhbHVlLFxuICAgIHJlcXVpcmVkPzogYm9vbGVhbixcbiAgICB2YWxpZGl0eT86IFNlcmlhbGl6YWJsZTxWYWxpZGl0eVN0YXRlPixcbiAgICBteW9wSWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgSW5wdXRFbGVtZW50Rm9ybVZhbHVlID0ge1xuICAgIGZvcm1EYXRhPzogeyBba2V5OiBzdHJpbmddOiBGb3JtRGF0YUVudHJ5IH1cbiAgICB1bm1hcHBlZERhdGE/OiBGb3JtRGF0YUVudHJ5W11cbn07XG5cbmV4cG9ydCB0eXBlIElucHV0RWxlbWVudFZhbHVlID0gc3RyaW5nIHwgSW5wdXRFbGVtZW50Rm9ybVZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZFxuXG5leHBvcnQgY2xhc3MgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGVudDogSW5wdXRFbGVtZW50VmFsdWUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZS50c1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHN0cmluZz4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0SW5uZXJIdG1sJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaW5uZXJIdG1sOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gaW5uZXJIdG1sXG4gICAgfVxufSIsICJpbXBvcnQgeyBCYXNlTXlvcE1lc3NhZ2UgfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG4vLyBzZW50IGJ5IGhvc3QgdG8gY29tcG9uZW50cywgY29udGFpbnMgdGhpZXIgaWQgXG5leHBvcnQgY2xhc3MgSW5pdE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8eyBpZDogc3RyaW5nIH0+IHtcbiAgICBtZXNzYWdlVHlwZSA9ICdJbml0TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgdGhpcy5jb250ZW50ID0geyBpZCB9XG4gICAgfVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cblxuLy8gY29tcG9uZW50IG5vdGlmeSBob3N0IHRoZSBpdCB3YXMgaW5pdGF0ZWQgXG5leHBvcnQgY2xhc3MgSW5pdFJlc3BvbnNlIGV4dGVuZHMgSW5pdE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRSZXNwb25zZSc7XG59XG5cbi8vIGNvbXBvbmVudCBhc2sgdG8gaG9zdCB0byBnZXQgaW5pdGF0ZWQgXG5leHBvcnQgY2xhc3MgSW5pdFJlcXVlc3QgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRSZXF1ZXN0Jztcbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7SUNvbXBvbmVudENvbmZpZywgSVJlZkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdC9ob3N0U0RLLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZDb25maWc6IElSZWZDb25maWcsXG4gICAgICAgICAgICAgICAgcHVibGljIG5lc3RlZENvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgb3B0aW9uczogbG9hZGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UpID0+IHZvaWQsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuXG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBOZXN0ZWRSZWYgPSB7XG4gICAgcmVmTmFtZTogc3RyaW5nLFxuICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBuZXN0ZWRSZWZzOiBOZXN0ZWRSZWZbXSwgcHVibGljIGZhaWxlZD86IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBFbnZlbG9wZWRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdFbnZlbG9wZWRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBkZXN0aW5hdGlvbjogc3RyaW5nLCBwdWJsaWMgbWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgY29uc3QgaW5uZXJFbnZlbG9wZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZSk7XG4gICAgICAgIHRoaXMucm91dGUgPSBbZGVzdGluYXRpb24sIC4uLmlubmVyRW52ZWxvcGVkTWVzc2FnZS5yb3V0ZSA/IGlubmVyRW52ZWxvcGVkTWVzc2FnZS5yb3V0ZSA6IFtdXTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtJRWxlbWVudFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPGFueSwgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnXG4gICAgcmVwbHlNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbn1cblxuZXhwb3J0IGNsYXNzIERldGVjdGVkTXlvcFJlZnNNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPElFbGVtZW50UmVmW10+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgbXlvcEVsZW1lbnRSZWZzOiBJRWxlbWVudFJlZltdKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcilcbiAgICAgICAgdGhpcy5jb250ZW50ID0gbXlvcEVsZW1lbnRSZWZzO1xuICAgIH1cblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlPGFueT4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0dldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZW50OiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxudHlwZSBNZXRob2ROYW1lczxUPiA9IHtcbiAgICAvLyBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gSyA6IG5ldmVyO1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKCkgPT4gdm9pZCA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbi8vIERlZmluZSBhIHR5cGUgdGhhdCBhbGxvd3Mgb25seSBzdHJpbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ldGhvZCBuYW1lcyBvZiBUXG50eXBlIE1ldGhvZFN0cmluZzxUPiA9IE1ldGhvZE5hbWVzPFQ+IGV4dGVuZHMgaW5mZXIgTSA/IE0gZXh0ZW5kcyBzdHJpbmcgPyBNIDogbmV2ZXIgOiBuZXZlcjtcblxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWV0aG9kOiBNZXRob2RTdHJpbmc8SU15b3BDb21wb25lbnQ+KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFNldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnO1xufSIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdDbGVhbnVwUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIENsZWFudXBNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIENsZWFudXBSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdDbGVhbnVwTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY2xlYW51cEZvck1lc3NhZ2VJZDogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogQ2xlYW51cFJlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2xlYW51cFJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGN1c3RvbUNsZWFudXA6IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBEaXNwb3NlTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRGlzcG9zZU1lc3NhZ2UnO1xufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnO1xufVxuXG5leHBvcnQgY2xhc3MgUmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnO1xufSIsICJleHBvcnQgKiBmcm9tICcuL0Jhc2VNZXNzYWdlJztcblxuLy91c2VyJ3MgbWVzc2FnZXNcbmV4cG9ydCAqIGZyb20gJy4vQmluZENsaWNrTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZVRleHRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DdXN0b21SZWZNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9TZXRBdHRyaWJ1dGVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL1NldElubmVySHRtbCc7XG5cbi8vc3lzdGVtIG1lc3NhZ2VzXG5leHBvcnQgKiBmcm9tICcuL0luaXRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0VudmVsb3BlZE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9EZXRlY3RNeW9wUmVmc01lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gICcuL0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL0V4ZWN1dGVDb21wb25lbnRNZXRob2QnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NsZWFudXBNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRGlzcG9zZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOyIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5LCBNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBEaXNwb3NlTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCwgTWVzc2FnZURpcmVjdGlvbixcbiAgICBDbGVhbnVwTWVzc2FnZSwgQ2xlYW51cFJlcGxheU1lc3NhZ2UsXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7SG9zdFNESywgbG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuLyoqXG4gKiBSZXN1bHQgcmV0dXJuZWQgYnkgb2JzZXJ2ZUF1dG9TaXplIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b1NpemVSZXN1bHQge1xuICAgIC8qKiBDdXJyZW50IHdpZHRoIChmcm9tIGNvbnRlbnQpICovXG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICAvKiogQ3VycmVudCBoZWlnaHQgKGZyb20gY29udGVudCkgKi9cbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICAvKiogV2hldGhlciB3aWR0aCBpcyBiZWluZyBhdXRvLXNpemVkICovXG4gICAgYXV0b1NpemluZ1dpZHRoOiBib29sZWFuO1xuICAgIC8qKiBXaGV0aGVyIGhlaWdodCBpcyBiZWluZyBhdXRvLXNpemVkICovXG4gICAgYXV0b1NpemluZ0hlaWdodDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBvYnNlcnZlQXV0b1NpemUgbWV0aG9kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b1NpemVPcHRpb25zIHtcbiAgICAvKiogQ2FsbGJhY2sgY2FsbGVkIHdpdGggc2l6ZSBpbmZvIHdoZW5ldmVyIHNpemUgY2hhbmdlcyAqL1xuICAgIG9uU2l6ZUNoYW5nZT86IChyZXN1bHQ6IEF1dG9TaXplUmVzdWx0KSA9PiB2b2lkO1xuICAgIC8qKiBNaW5pbXVtIHdpZHRoIGNvbnN0cmFpbnQgKi9cbiAgICBtaW5XaWR0aD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWF4aW11bSB3aWR0aCBjb25zdHJhaW50ICovXG4gICAgbWF4V2lkdGg/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIE1pbmltdW0gaGVpZ2h0IGNvbnN0cmFpbnQgKi9cbiAgICBtaW5IZWlnaHQ/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIE1heGltdW0gaGVpZ2h0IGNvbnN0cmFpbnQgKi9cbiAgICBtYXhIZWlnaHQ/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIEV4cGxpY2l0IHdpZHRoIHNldCBieSBob3N0IC0gaWYgZGVmaW5lZCwgZG9uJ3QgYXV0by1zaXplIHdpZHRoICovXG4gICAgZXhwbGljaXRXaWR0aD86IHN0cmluZyB8IG51bWJlcjtcbiAgICAvKiogRXhwbGljaXQgaGVpZ2h0IHNldCBieSBob3N0IC0gaWYgZGVmaW5lZCwgZG9uJ3QgYXV0by1zaXplIGhlaWdodCAqL1xuICAgIGV4cGxpY2l0SGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIC8qKiBGb3JjZSBhdXRvLXNpemUgZXZlbiBpZiBjb250YWluZXIgaGFzIGRpbWVuc2lvbnMgKi9cbiAgICBmb3JjZUF1dG9TaXplPzogYm9vbGVhbjtcbiAgICAvKiogTWluIGhlaWdodCB1c2VkIGJ5IGxvYWRlciB0byBkZXRlY3QgY29sbGFwc2UgKGRlZmF1bHQ6IDUwKSAqL1xuICAgIGxvYWRlck1pbkhlaWdodD86IG51bWJlcjtcbn1cblxuLy9UT0RPIDogY2hhbmdlIElNeW9wQ29tcG9uZW50IHRvIHJlZiBzcGVjaWZpYyBpbXBsXG50eXBlIFJlZlR5cGVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IElNeW9wQ29tcG9uZW50IHwgUmVmXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wQ29tcG9uZW50PFAgPSBhbnksIFIgPSBhbnk+IHtcblxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBpc0luaXRpYXRlZDogYm9vbGVhbjtcblxuICAgIG1hcmtlZEZvckRpc3Bvc2VkOiBib29sZWFuO1xuXG4gICAgc2V0SW5pdGlhdGVkOiAoKSA9PiB2b2lkXG5cbiAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudFxuXG4gICAgLy9yZWYgY29tcG9uZW50cyBjYW4gYmUgZWxlbWVudC1sZXNzXG4gICAgZWxlbWVudD86IEhUTUxFbGVtZW50XG5cbiAgICBzZW5kOiAobXNnOiBCYXNlTXlvcE1lc3NhZ2UpID0+IENsZWFudXBIYW5kbGVyXG5cbiAgICBiaW5kKG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKCkgPT4gYm9vbGVhbik6IHZvaWQ7XG5cbiAgICBiaW5kPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4pOiB2b2lkO1xuXG4gICAgLy8gYm9vbGVhbiByZXR1cm5lZCB2YWx1ZSA9IGhhbmRsZWQgb3Igbm90XG4gICAgb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IEJhc2VNeW9wTWVzc2FnZSkgPT4gYm9vbGVhblxuXG4gICAgaW5pdGlhdGVkOiAoKSA9PiBQcm9taXNlPGFueT47XG5cbiAgICBkaXNwb3NlOiAoKSA9PiB2b2lkXG5cbiAgICBoaWRlKCk6IHZvaWQ7XG5cbiAgICBzaG93KCk6IHZvaWQ7XG5cbiAgICBpbnNwZWN0KCk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZlcyB0aGUgaWZyYW1lIGNvbnRlbnQgc2l6ZSBhbmQgYXV0b21hdGljYWxseSBzeW5jcyBpdCB0byB0aGUgaWZyYW1lIGVsZW1lbnQuXG4gICAgICogT25seSBhdmFpbGFibGUgZm9yIGlmcmFtZS1iYXNlZCBjb21wb25lbnRzLiBVc2VzIGRpcmVjdCBjb250ZW50RG9jdW1lbnQgYWNjZXNzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZyBzaXplIGNoYW5nZSBjYWxsYmFjayBhbmQgbWluL21heCBjb25zdHJhaW50c1xuICAgICAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gc3RvcCBvYnNlcnZpbmdcbiAgICAgKi9cbiAgICBvYnNlcnZlQXV0b1NpemU/OiAob3B0aW9ucz86IEF1dG9TaXplT3B0aW9ucykgPT4gQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZWQgbXlvcDpzaXplIG1ldGEgdGFnIGZyb20gdGhlIGNvbXBvbmVudCBIVE1MLlxuICAgICAqIFNldCBieSBIVE1MQ29tcG9uZW50TG9hZGVyIGJlZm9yZSBpZnJhbWUgY3JlYXRpb24uXG4gICAgICogVXNlZCBieSB0aGUgUmVhY3QgaG9zdCB0byBkZXRlcm1pbmUgc2l6aW5nIG1vZGUgKGZpbGwgdnMgY29udGVudCkuXG4gICAgICovXG4gICAgc2l6ZU1ldGE/OiB7IHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyOyBoZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7IG1pbldpZHRoPzogbnVtYmVyOyBtYXhXaWR0aD86IG51bWJlcjsgbWluSGVpZ2h0PzogbnVtYmVyOyBtYXhIZWlnaHQ/OiBudW1iZXIgfSB8IG51bGw7XG5cbiAgICBwYXJlbnQ/OiBJTXlvcENvbXBvbmVudDtcblxuICAgIHByb3BzOiBQXG5cbiAgICByZWZzOiBSXG59XG5cbmZ1bmN0aW9uIGlzSW5oZXJpdEZyb20ob2JqOiBhbnksIGJhc2VDbGFzczogYW55KSB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG5cbiAgICBpZiAoIXByb3RvKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAocHJvdG8uY29uc3RydWN0b3IubmFtZSA9PT0gYmFzZUNsYXNzLm5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBpc0luaGVyaXRGcm9tKHByb3RvLCBiYXNlQ2xhc3MpO1xufVxuXG4vLyBUT0RPIDogbW92ZSA6IFxudHlwZSBtZXNzYWdlSGFuZGxlcjxUPiA9IChtZXNzYWdlOiBUKSA9PiBib29sZWFuO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiBleHRlbmRzIFJlZlR5cGVzID0gUmVmVHlwZXM+IGltcGxlbWVudHMgSU15b3BDb21wb25lbnQ8UD4ge1xuICAgIGlkOiBzdHJpbmcgPSAnJ1xuXG4gICAgbWVzc2FnZUhhbmRsZXJzOiBSZWNvcmQ8c3RyaW5nLCBtZXNzYWdlSGFuZGxlcjxhbnk+W10+ID0ge307XG5cbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnRcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICB0aGlzLmlkID0gb3B0aW9ucz8uaWQgfHwgSG9zdFNESy5JbnN0YW5jZSgpLmFzc2lnbklkKGNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucz8udGltZW91dCA/IG9wdGlvbnM/LnRpbWVvdXQgOiA1ICogMTAwMDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWF0ZWQgJiYgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdCAmJiAhdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KGB0aW1lb3V0XyR7dGltZW91dH0gJHt0aGlzLmlkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICAvLyBUT0RPIDogYXV0byBpbnNwZWN0LCBjb250cm9sIGZyb20gY29uZmlnXG4gICAgICAgIHRoaXMuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAod2luZG93Lm15b3AuaG9zdFNESy5pbnNwZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluc3BlY3QoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGdldCBtYXJrZWRGb3JEaXNwb3NlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkO1xuICAgIH1cblxuICAgIHNldCBtYXJrZWRGb3JEaXNwb3NlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbjogVGhlIGNvbXBvbmVudCBpcyBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRpc3Bvc2VkLiBEaXNwb3NlIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGFnYWluIHVudGlsIHRoZSBjdXJyZW50IGRpc3Bvc2FsIHByb2Nlc3MgaXMgY29tcGxldGUuJylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGhpZGUoKTogdm9pZDtcblxuICAgIGFic3RyYWN0IHNob3coKTogdm9pZDtcblxuICAgIGFic3RyYWN0IGluc3BlY3QoKTogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvL1RPRE86IHVzZSBiaW5kV2hlbiB3aXRoIHJldHVybiB0cnVlIHByZWRpY2F0ZSAuLi5cbiAgICBiaW5kID0gPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25cbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0uaW5jbHVkZXMoaGFuZGxlcikpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXS5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZFdoZW4gPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgcHJlZGljYXRlOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbiwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IHZvaWQpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IHVzZSBjb21wb25lbnQuYmluZFdoZW4gd2l0aG91dCBhbiBoYW5kbGVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdID0gW11cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdO1xuXG4gICAgICAgIGNvbnN0IHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyID0gKGU6IFQpID0+IHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vVE9ETyA6IGhhbmRsZSBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uID9cbiAgICAgICAgaGFuZGxlcnMucHVzaChwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGFuZGxlcnMuaW5kZXhPZihwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnb25NZXNzYWdlUmVjZWl2ZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCBpbmNvbWVNZXNzYWdlLCB0aGlzKTtcbiAgICAgICAgLy9UT0RPIDogaGFuZGVsIHNwZWNpYWwgZXZldHMgPyBsaWtlIGluaXRSZXMgP1xuICAgICAgICBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVDb21wb25lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChpbmNvbWVNZXNzYWdlIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpO1xuXG4gICAgICAgICAgICAvL2tlZXBpbmcgdGhpcy5tZXRob2QoKSBzbyB0aGF0IGNvbnRleHQgd2lsbCBzYXZlZFxuICAgICAgICAgICAgaWYgKCh0aGlzIGFzIGFueSlbdHlwZWRNZXNzYWdlLm1ldGhvZF0pIHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpW3R5cGVkTWVzc2FnZS5tZXRob2RdKHR5cGVkTWVzc2FnZS5jb250ZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYG1ldGhvZCBub3QgZm91bmQgJHt0eXBlZE1lc3NhZ2UubWV0aG9kfSBvbiBjb21wb25lbnRgLCB0aGlzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZV07XG4gICAgICAgIGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IGhhbmRsZWQgfHwgaGFuZGxlcihpbmNvbWVNZXNzYWdlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9UT0RPIDogY29uc29sZSBvbmx5IHdoZW4gZGVidWcgY29uZmlnXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdubyBoYW5kbGVycyBmb3VuZCBmb3IgJywgaW5jb21lTWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmlzSW5pdGlhdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUpXG4gICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBfd2hlbkluaXRpYXRlZFJlc29sdmU/OiAodmFsdWU/OiBhbnkpID0+IGFueTtcbiAgICBfd2hlbkluaXRpYXRlZFJlamVjdD86ICh2YWx1ZT86IGFueSkgPT4gYW55O1xuXG4gICAgX3doZW5Jbml0aWF0ZWQ6IFByb21pc2U8YW55PiA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgaW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2hlbkluaXRpYXRlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbmRDbGVhbnVwTWVzc2FnZShtZXNzYWdlOiBDbGVhbnVwTWVzc2FnZSk6IHZvaWQge1xuICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG4gICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSB0aGlzLmlkO1xuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcblxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuYmluZFdoZW4obWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1zZy5yZXBsYXlUb0hhbmRsZXIgPT09IG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgIH0sIChtOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZS5oYW5kbGVyKG0pO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlcjtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBkZWxldGUgbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgdGhpcy5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgc2VuZChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciB7XG4gICAgICAgIC8vbWVzc2FnZXMgdGhhdCBleGV0cmFjdGVkIGZyb20gZW52ZWxvcGUgYWxyZWFkeSBoYXZlIHNvdXJjZSBpbiB0aGVtXG4gICAgICAgIGlmICghbWVzc2FnZS5zb3VyY2UpXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLmRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHRoaXMuaWQ7XG5cbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG5cbiAgICAgICAgbGV0IGNsZWFudXBIYW5kbGVyO1xuICAgICAgICAvLyBUT0RPIDogZml4IGhlYXZ5IG9wLi5cbiAgICAgICAgLy8gIGlmIChpc0luaGVyaXRGcm9tKG1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAobWVzc2FnZS5oYW5kbGVyKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBNeW9wQmluZE1lc3NhZ2UpO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIgPSB0aGlzLmJpbmRXaGVuKHR5cGVkTWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBtc2cucmVwbGF5VG9IYW5kbGVyID09PSB0eXBlZE1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgICAgICB9LCB0eXBlZE1lc3NhZ2UuaGFuZGxlcik7XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlLmhhbmRsZXJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICBpZiAobWVzc2FnZS5yZWYpIHtcbiAgICAgICAgICAgIC8vIHNlcmlhbGl6YWJsZVxuICAgICAgICAgICAgbWVzc2FnZS5yZWYgPSBtZXNzYWdlLnJlZi5fX25vblByb3hpZWQgfHwgbWVzc2FnZS5yZWY7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kQ2xlYW51cE1lc3NhZ2UobmV3IENsZWFudXBNZXNzYWdlKG1lc3NhZ2UuaWQsIChyZXBsYXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nIHJlcGxheT9cbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xlYW51cEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhdGVkKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiB1c2Ugc2RrLmxvZ2dlclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZGlzcG9zaW5nIGJlZm9yZSBpc0luaXRpYXRlZCcsIHRoaXMuaWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdkaXNwb3NpbmcgY29tcG9uZW50JywgdGhpcy5pZCk7XG5cbiAgICAgICAgLy8gLy9UT0RPIDogaW1wbGVtZW50IGRpc3Bvc2UgZmxvd1xuICAgICAgICAvLyBPYmplY3Qua2V5cyh0aGlzLnJlZnMpLmZvckVhY2gocmVmS2V5PT57XG4gICAgICAgIC8vICAgICB0aGlzLnJlZnNbcmVmS2V5XS5kaXNwb3NlKCk7XG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRoZXJlIGlzIGFueSB0aW1lIGZvciB0aGUgb1xuICAgICAgICAvLyB0aGVyIHNpZGUgdG8gcHJvY2Nlc3MgdG8gbWVzc2FnZSBiZWZvcmUgZGllID9cbiAgICAgICAgLy9ub3RpZnkgdGhlIG90aGVyIHNpZGUgU0RLXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRGlzcG9zZU1lc3NhZ2UoKSlcblxuICAgICAgICBjb25zdCBvbkRpc3Bvc2VIYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzWydvbkRpc3Bvc2UnXVxuICAgICAgICBpZiAob25EaXNwb3NlSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIG9uRGlzcG9zZUhhbmRsZXJzLmZvckVhY2goZGlzcG9zZUhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgbnVsbCBvciBmaXggdGhlIHR5cGUgP1xuICAgICAgICAgICAgICAgIGRpc3Bvc2VIYW5kbGVyKG51bGwpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5jb250YWluZXIpO1xuICAgICAgICAvL3RoaXMuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycyA9IHt9XG4gICAgICAgIHRoaXMuaWQgKz0gJ19kaXNwb3NlZCc7XG4gICAgICAgIHRoaXMuaXNJbml0aWF0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm9wczogUCA9IHt9IGFzIHVua25vd24gYXMgUDtcbiAgICByZWZzOiBSID0ge30gYXMgdW5rbm93biBhcyBSO1xufVxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSUVsZW1lbnRSZWYge1xuICAgIG15b3BJZD86IHN0cmluZ1xuICAgIGh0bWxUYWdOYW1lOiBzdHJpbmdcbiAgICBCb3VuZGluZ1JlY3Q/OiBET01SZWN0XG4gICAgb2Zmc2V0VG9wPzogbnVtYmVyXG4gICAgb2Zmc2V0TGVmdD86IG51bWJlclxuXG4gICAgdHlwZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBYUGF0aEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHhQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIGh0bWxUYWdOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIEJvdW5kaW5nUmVjdD86IERPTVJlY3QsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldFRvcD86IG51bWJlcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0TGVmdD86IG51bWJlcikge1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnWFBhdGhFbGVtZW50UmVmJ1xufVxuXG5leHBvcnQgY2xhc3MgTXlvcEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG15b3BJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBodG1sVGFnTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBCb3VuZGluZ1JlY3Q/OiBET01SZWN0LFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRUb3A/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldExlZnQ/OiBudW1iZXIpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnTXlvcEVsZW1lbnRSZWYnXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlcn0gZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IHR5cGUgSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgPSBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+IHwgUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCBjb25zdCBydW5FeGVjdXRvckNsZWFudXAgPSBhc3luYyAodGFzazogSU1lc3NhZ2VFeGVjdXRvckNsZWFudXApID0+IHtcbiAgICBpZiAodHlwZW9mIHRhc2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gSXQncyBhIGZ1bmN0aW9uLCBjYWxsIGl0XG4gICAgICAgIHRhc2soKTtcbiAgICB9IGVsc2UgaWYgKHRhc2sgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIC8vIEl0J3MgYSBQcm9taXNlLCBhd2FpdCBpdFxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXNrO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIGEgZnVuY3Rpb24sIGNhbGwgaXRcbiAgICAgICAgICAgIHJlc3VsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRhc2sgaXMgdm9pZCwgZG8gbm90aGluZ1xufVxuXG50eXBlIElNZXNzYWdlRXhlY3V0b3I8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4gPSAobWVzc2FnZTogVCkgPT4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXA7XG5cbmludGVyZmFjZSBJTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxuXG4gICAgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBpbXBsZW1lbnRzIElNZXNzYWdlSGFuZGxlcjxUPiB7XG5cbiAgICAvL1RPRE8gOiBhZGQgZGlzcG9zZSBtZXRob2RcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZCkge1xuXG4gICAgfVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG4gICAgYWJzdHJhY3QgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnksIEUgPSBhbnk+IGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQsIHB1YmxpYyBjb250ZXh0PzogRSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgcnVuRXhlY3V0b3JDbGVhbnVwfSBmcm9tIFwiLi9pbmRleC50c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL2Jhc2VNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsIENsZWFudXBNZXNzYWdlLCBDbGVhbnVwUmVwbGF5TWVzc2FnZSwgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgRW52ZWxvcGVkTWVzc2FnZSxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVzcG9uc2UsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgSG9zdGVkQ29tcG9uZW50PFQgPSBhbnk+IHtcbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgIH1cblxuICAgIC8vb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IElNeW9wTWVzc2FnZSkgPT4gdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBpZDogc3RyaW5nLCBwdWJsaWMgY29udGV4dD86IFQpIHtcblxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcFNESyB7XG4gICAgaW5pdDogKCkgPT4gdm9pZDtcblxuICAgIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkXG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW107XG5cbiAgICBoYW5kbGVJbmNvbWVNZXNzYWdlczogKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4gdm9pZFxuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50Pjtcbn1cblxuLy8gY29uc3QgbG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzID0gW1xuLy8gICAgIE15b3BNZXNzYWdlcy5Jbml0UmVxdWVzdCxcbi8vICAgICBNeW9wTWVzc2FnZXMuSW5pdFJlc3BvbnNlLFxuLy8gICAgIC8vTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UsXG4vLyBdXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcFNESyBpbXBsZW1lbnRzIElNeW9wU0RLIHtcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdO1xuXG4gICAgbWVzc2FnZVRvSGFuZGxlQWZ0ZXJJbml0OiBCYXNlTXlvcE1lc3NhZ2VbXSA9IFtdO1xuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PiA9IHt9O1xuXG4gICAgYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBtZXNzYWdlQ2xlYW51cENhY2hlOiBSZWNvcmQ8c3RyaW5nLCBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+PiB8IFByb21pc2U8dm9pZD4gPSB7fTtcblxuICAgIGhhbmRsZUluY29tZU1lc3NhZ2VzKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gZXZlbnQuZGF0YSA/IGV2ZW50LmRhdGEgOiBldmVudC5kZXRhaWw7XG5cbiAgICAgICAgaWYgKCFldmVudENvbnRlbnQgfHwgIWV2ZW50Q29udGVudC5teW9wKSB7XG4gICAgICAgICAgICAvLyBub3QgbXlvcCBtYXJrZWQgZXZlbnQgXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGV2ZW50Q29udGVudCBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLmRpcmVjdGlvbiAhPT0gTWVzc2FnZURpcmVjdGlvbi5kb3duKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbWVzc2FnZSBkcm9wcGVkIGluIGJhc2VTREssIGRpcmVjdGlvbiB3YXMgJywgZXZlbnQuZGF0YS5kaXJlY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiAobG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzLmluY2x1ZGVzKG1lc3NhZ2UubWVzc2FnZVR5cGUpKSB7XG4gICAgICAgICAgICAvLyAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyAgICAgLy9UT0RPIDogZml4IGRpcmVjdGlvbiA/IG1lc3NhZ2Ugd2lsbCBub3QgcHJvY2Nlc3Mgb3RoZXJ3aXNlXG4gICAgICAgICAgICAvLyAgICAgd2luZG93Lm15b3AuaG9zdFNESy5zZW5kKG1lc3NhZ2UpXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkRpc3Bvc2VNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNob3VsZCBub3QgYmUgb3B0aW9uYWwsIGZpeCBhbmQgcmVtb3ZlICdpZidcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5kZXN0aW5hdGlvbilcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uXVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gV2UgZ290IG91ciBpZCBmcm9tIG91ciBob3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogU0RLIG1heSBzZXJ2ZSBtb3JlIHRoYW4gMSBjb21wb25lbnQgLi4gdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb21wb25lbnRJZCA9IChtZXNzYWdlIGFzIEluaXRNZXNzYWdlKS5jb250ZW50LmlkO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgRXJyb3IoXCJyZWNoaXZlZCBpbml0IG1lc3NhZ2UgZm9yIGFuIGV4c2lzaW5nIGNvbXBvbmVudC5cIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0gPSBuZXcgSG9zdGVkQ29tcG9uZW50KG5ld0NvbXBvbmVudElkKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlc3BvbnNlKG5ld0NvbXBvbmVudElkKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogaXMgaXQgdHJ1ZSB0byBub3QgcGFzcyBmdXJ0aGVyICggdG8gdGhlIGNvbXBvbmVudCApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBmb3Igc2FtZSBIb3N0U0RLIGNhc2VzXG4gICAgICAgICAgICAvLyB3aGVuIGJvdGggUmVmQ29tcG9uZW50IGFuZCByZWFsQ29tcG9uZW50IGhvc3RlZCBpbiB0aGUgc2FtZSBIb3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnZlbG9wZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXJNZXNzYWdlID0gZW52ZWxvcGVkTWVzc2FnZS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBpbm5lck1lc3NhZ2U7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0IHx8IHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uIV0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkNvbXBvbmVudCA9IG15b3AuaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBpbm5lck1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdGluYXRpb25Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQ29tcG9uZW50LnNlbmQoaW5uZXJNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQgPSBteW9wLmhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gZW52ZWxvcGVkTWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQuc2VuZChpbm5lck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2Upe1xuICAgICAgICAgICAgLy8gICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG4gICAgICAgICAgICAvLyAvLyAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNsZWFudXBNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ2xlYW51cE1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbdHlwZWRNZXNzYWdlLmNsZWFudXBGb3JNZXNzYWdlSWRdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXBNZXNzYWdlID0gbmV3IENsZWFudXBSZXBsYXlNZXNzYWdlKCEhY2xlYW51cCk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXBNZXNzYWdlLmRlc3RpbmF0aW9uID0gbWVzc2FnZS5kZXN0aW5hdGlvbjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoISFjbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW3R5cGVkTWVzc2FnZS5jbGVhbnVwRm9yTWVzc2FnZUlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkV4ZWN1dG9yQ2xlYW51cChjbGVhbnVwKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QoY2xlYW51cE1lc3NhZ2UsIHR5cGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogaGFuZGVsIGVycm9yP1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChjbGVhbnVwTWVzc2FnZSwgdHlwZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGFjdGlvbkhhbmRsZXJGb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zdXBwb3J0ZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlci5tZXNzYWdlVHlwZSA9PT0gbWVzc2FnZS5tZXNzYWdlVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uSGFuZGxlckZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSBoYW5kbGVyLmV4ZWN1dG9yKG1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUgJiYgY2xlYW51cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVttZXNzYWdlLmlkXSA9IGNsZWFudXA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhbnVwICYmICFtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2xlYW51cCBoYW5kbGVyIGdlbmVyYXRlZCBmb3Igbm9uLWNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjbGVhbnVwICYmIG1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjbGVhbnVwIGhhbmRsZXIgZ2VuZXJhdGVkIGZvciBhIGNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbkhhbmRsZXJGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBwcmludCB3aXRoIGRlYnVnIGNvbmZpZyBvbmx5XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25vIG1lc3NhZ2UgaGFuZGxlciB3YXMgZm91bmQgZm9yICcsIG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndW5zdXBwb3J0ZWQgbWVzc2FnZSB0eXBlJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFic3RyYWN0IGluaXQ6ICgpID0+IHZvaWQ7XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCAqIGZyb20gJy4vTXlvcEVsZW1lbnRSZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9iYXNlTWVzc2FnZUhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9CYXNlTXlvcFNESyc7XG5cbmV4cG9ydCB0eXBlIENsZWFudXBIYW5kbGVyID0gKCkgPT4gdm9pZFxuXG5leHBvcnQgdHlwZSBEaWN0aW9uYXJ5PFQ+ID0geyBba2V5OiBzdHJpbmddOiBUOyB9O1xuXG4vL2V4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0gJ0lmcmFtZUxvYWRlcicgfCAnV2ViQ29tcG9uZW50TG9hZGVyJyB8ICdIVE1MTG9hZGVyJyB8IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IFNraW5Mb2FkZXJzID0ge1xuICAgIFwiSWZyYW1lTG9hZGVyXCI6IFwiSWZyYW1lTG9hZGVyXCIsXG4gICAgXCJXZWJDb21wb25lbnRMb2FkZXJcIjogXCJXZWJDb21wb25lbnRMb2FkZXJcIixcbiAgICBcIkhUTUxMb2FkZXJcIjogXCJIVE1MTG9hZGVyXCIsXG4gICAgXCJNaW5pbWl6ZWRMb2FkZXJcIjogXCJNaW5pbWl6ZWRMb2FkZXJcIlxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0ga2V5b2YgdHlwZW9mIFNraW5Mb2FkZXJzO1xuXG5leHBvcnQgdHlwZSBQcm9wVHlwZSA9ICdhbnknIHwgJ3N0cmluZycgfCAnbnVtYmVyJyB8IHN0cmluZzsgLy8gVE9ETyA6IDxcbmV4cG9ydCB0eXBlIFJlZlNlbGVjdG9yVHlwZSA9ICdpZC1hdHRyaWJ1dGUnIHwgJ2Nzcy1zZWxlY3RvcicgfCAneHBhdGgnIHwgc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgTG9hZGVyRnJhbWV3b3JrcyA9IHtcbiAgICBcInJlYWN0XCI6IFwicmVhY3RcIixcbiAgICBcInZ1ZVwiOiBcInZ1ZVwiLFxuICAgIFwiYW5ndWxhclwiOiBcImFuZ3VsYXJcIixcbn0gYXMgY29uc3RcbmV4cG9ydCB0eXBlIExvYWRlckZyYW1ld29ya1R5cGUgPSBrZXlvZiB0eXBlb2YgTG9hZGVyRnJhbWV3b3JrcztcblxuZXhwb3J0IGludGVyZmFjZSBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiV2ViQ29tcG9uZW50TG9hZGVyXCI7XG4gICAgdXJsOiBzdHJpbmcsXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgZnJhbWV3b3JrPzogTG9hZGVyRnJhbWV3b3JrVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElJZnJhbWVMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJJZnJhbWVMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZ1xuICAgIGF1dG9IZWlnaHQ6IGJvb2xlYW5cbiAgICBoZWlnaHQ/OiBzdHJpbmdcbiAgICB3aWR0aD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgU2hhZG93Um9vdE1vZGVUeXBlID0ge1xuICAgIFwib3BlblwiOiBcIm9wZW5cIixcbiAgICBcImNsb3NlZFwiOiBcImNsb3NlZFwiLFxuICAgIFwibm9uZVwiOiBcIm5vbmVcIixcbiAgICBcImxvY2FsRnJhbWVcIjogXCJsb2NhbEZyYW1lXCJcbn0gYXMgY29uc3Q7XG5cblxuZXhwb3J0IGludGVyZmFjZSBJSFRNTExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIkhUTUxMb2FkZXJcIjtcbiAgICBIVE1MOiBzdHJpbmc7XG4gICAgLy9UT0RPOiByZW5hbWUocm9vdE1vZGUvY3VzdG9tRWxlbWVudE1vZGUpICsgZGIgbWlncmF0aW9uXG4gICAgc2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlO1xuICAgIGF1dG9IZWlnaHQ/OiBib29sZWFuO1xuICAgIGhlaWdodD86IHN0cmluZztcbiAgICB3aWR0aD86IHN0cmluZztcbn1cblxuLy9mb3IgaW50ZXJuYWwgZGFzaGJvYXJkIHVzYWdlXG5leHBvcnQgaW50ZXJmYWNlIElNaW5pbWl6ZWRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJNaW5pbWl6ZWRMb2FkZXJcIjtcbn1cblxuaW50ZXJmYWNlIERhc2hib2FyZE9iamVjdCB7XG4gICAgX3RlbXBfY2xpZW50X2lkPzogc3RyaW5nLFxufVxuXG50eXBlIEV4dGVuZDxULCBVPiA9IFQgJiBVO1xuXG50eXBlIEV4dGVuZFJlY3Vyc2l2ZWx5PFQsIEU+ID0ge1xuICAgIFtLIGluIGtleW9mIEVdOiBFW0tdO1xufSAmIHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIG9iamVjdFxuICAgICAgICA/IEV4dGVuZFJlY3Vyc2l2ZWx5PFRbS10sIEU+XG4gICAgICAgIDogVFtLXTtcbn07XG5cbmV4cG9ydCB0eXBlIElEYXNoYm9hcmQ8VD4gPSBFeHRlbmRSZWN1cnNpdmVseTxULCBEYXNoYm9hcmRPYmplY3Q+O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBTa2luTG9hZGVyVHlwZVxuXG4gICAgW2tleTogc3RyaW5nXTogYW55OyAvLyBBbGxvd3MgYW55IGFkZGl0aW9uYWwgcHJvcGVydGllc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lSZWxlYXNlTWV0YWRhdGEge1xuICAgIGVudmlyb25tZW50SWQ6IHN0cmluZztcbiAgICBlbnZpcm9ubWVudElkZW50aWZpZXI6IHN0cmluZztcbiAgICAvL1xuICAgIC8vIHVwZGF0ZWRPbj86IHN0cmluZ1xuICAgIC8vIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lWYXJpYW50Q29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgcmVsZWFzZXM/OiB2Ml9JUmVsZWFzZU1ldGFkYXRhW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBsb2FkZXI6IElTa2luTG9hZGVyQ29uZmlnXG4gICAgY3JlYXRlZEJ5Pzogc3RyaW5nXG4gICAgY3JlYXRlZE9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVNraW5Db25maWcgZXh0ZW5kcyBJU2tpbkNvbmZpZyB7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCaW5kTWVzc2FnZVByb3BDb25maWcgZXh0ZW5kcyBJUHJvcENvbmZpZyB7XG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbn1cblxuZXhwb3J0IGNvbnN0IFByb3BNZXNzYWdlTW9kZXMgPSB7XG4gICAgXCJpbnB1dFwiOiBcImlucHV0XCIsXG4gICAgXCJvdXRwdXRcIjogXCJvdXRwdXRcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFByb3BDb25maWdCZWhhdmlvclR5cGVzID0ge1xuICAgIFwibWVzc2FnZVwiOiBcIm1lc3NhZ2VcIixcbiAgICBcImNvZGVcIjogXCJjb2RlXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbSB7XG4gICAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29kZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJjb2RlXCJcbiAgICByZW1hcD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wTWVzc2FnZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJtZXNzYWdlXCJcbiAgICBtZXNzYWdlOiBNeW9wTWVzc2FnZUtleVxuICAgIHJlZjogc3RyaW5nLCAvL1RPRE8gbWFrZSBpdCBpZFxuICAgIHBhcmFtczogSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbVtdXG4gICAgbW9kZToga2V5b2YgdHlwZW9mIFByb3BNZXNzYWdlTW9kZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcENvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIGJlaGF2aW9yOiBJUHJvcEJlaGF2aW9yXG59XG5cblxuZXhwb3J0IGNsYXNzIFJlZkJlaGF2aW9yVHlwZSB7XG4gICAgc3RhdGljIGNvZGUgPSAnY29kZScgYXMgY29uc3RcbiAgICBzdGF0aWMgY29tcG9uZW50ID0gJ2NvbXBvbmVudCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgSVJlZkJlaGF2aW9yVHlwZSA9ICdjb2RlJyB8ICdjb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogSVJlZkJlaGF2aW9yVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvbXBvbmVudCdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIFByb3BlcnR5IGluc3RhbmNlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICovXG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb2RlUmVmQmVoYXZpb3IgZXh0ZW5kcyBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6ICdjb2RlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgc2VsZWN0b3JUeXBlOiBSZWZTZWxlY3RvclR5cGVcbiAgICBzZWxlY3Rvcjogc3RyaW5nXG4gICAgYmVoYXZpb3I6IElSZWZCZWhhdmlvclxufVxuXG4vKipcbiAqIEV4cGVyaWVuY2Ugc2VnbWVudCBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VTZWdtZW50UnVsZSB7XG4gICAgcHJvcGVydHk6IHN0cmluZztcbiAgICBvcGVyYXRvcjogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBBL0Igc3BsaXQgdmVyc2lvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlQUJTcGxpdFZlcnNpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgcGVyY2VudGFnZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4cGVyaWVuY2UgQS9CIHNwbGl0IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZUFCU3BsaXQge1xuICAgIHZlcnNpb25zOiBJRXhwZXJpZW5jZUFCU3BsaXRWZXJzaW9uW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBzZWdtZW50IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZVNlZ21lbnQge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcnVsZXM6IElFeHBlcmllbmNlU2VnbWVudFJ1bGVbXTtcbiAgICB1c2VBYjogYm9vbGVhbjtcbiAgICBjb21wb25lbnRWYXJpYW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gICAgYWJTcGxpdD86IElFeHBlcmllbmNlQUJTcGxpdDtcbiAgICBzdGlja3lQcm9wZXJ0aWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBkZWZpbml0aW9uIGNvbmZpZyAodjIpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VEZWZpbml0aW9uQ29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIC8qKiBTZWxlY3RlZCBjb21wb25lbnQgSURzICovXG4gICAgY29tcG9uZW50czogc3RyaW5nW107XG4gICAgLyoqIFNlZ21lbnQgY29uZmlndXJhdGlvbnMgKi9cbiAgICBzZWdtZW50czogSUV4cGVyaWVuY2VTZWdtZW50W107XG4gICAgLyoqIEZhbGxiYWNrIHZhcmlhbnQgcGVyIGNvbXBvbmVudCAqL1xuICAgIGZhbGxiYWNrOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIC8qKiBUYWdzICovXG4gICAgdGFnczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgLy8gcHJvcHM6IFJlY29yZDxzdHJpbmcsIElQcm9wQ29uZmlnPiAvL2lkIC0gdHlwZVxuICAgIC8vIHJlZnM6IFJlY29yZDxzdHJpbmcsIElSZWZDb25maWc+LFxuICAgIC8vIHNraW5zOiBSZWNvcmQ8c3RyaW5nLCBJU2tpbkNvbmZpZz5cbiAgICBwcm9wczogSVByb3BDb25maWdbXSxcbiAgICByZWZzOiBJUmVmQ29uZmlnW10sXG4gICAgc2tpbnM6IElTa2luQ29uZmlnW10sXG4gICAgZGVmYXVsdFNraW46IG51bWJlcjtcblxuICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IHRoYXRcbiAgICAvL3Jlc29sdmVkRGVmaW5pdGlvbnM/OiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1tdXG4gICAgLy9UT0RPIDogbW92ZSB0byBiYXNlIGNsYXNzICggSVN0b3JhYmxlSXRlbSBvciBzby4uLilcblxuICAgIGNyZWF0ZWRPbj86IHN0cmluZ1xuICAgIGNyZWF0ZWRCeT86IHN0cmluZ1xuICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lNeW9wU3RvcmVkT2JqZWN0IGV4dGVuZHMgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICB1cGRhdGVkT24/OiBzdHJpbmdcbiAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRBY2Nlc3Mge1xuICAgIHZpc2liaWxpdHk6ICdwcml2YXRlJyB8ICd1bmxpc3RlZCcgfCAncHVibGljJztcbiAgICB1bmxpc3RlZD86IHtcbiAgICAgICAgc2x1Zzogc3RyaW5nO1xuICAgIH07XG4gICAgbWFya2V0cGxhY2U/OiB7XG4gICAgICAgIHN0YXR1czogJ2RyYWZ0JyB8ICdzdWJtaXR0ZWQnIHwgJ2NsYWltZWQnIHwgJ2Nsb3NlZCc7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIGNvbnRhY3RFbWFpbDogc3RyaW5nO1xuICAgICAgICBkZWFkbGluZTogc3RyaW5nO1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSUNvbXBvbmVudERlZmluaXRpb25Db25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgdmFyaWFudHNfaWRzOiBzdHJpbmdbXSxcbiAgICBEVE9zOiB2Ml9JRFRPW10sXG4gICAgdGFnczogc3RyaW5nW10sXG4gICAgYWNjZXNzPzogQ29tcG9uZW50QWNjZXNzLFxuXG4gICAgLy9cbiAgICB2YXJpYW50c19uYW1lczogc3RyaW5nW10sXG4gICAgdmFyaWFudHNfZGF0YToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGlkOiBzdHJpbmdcbiAgICAgICAgdXBkYXRlZE9uPzogc3RyaW5nXG4gICAgICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xuICAgICAgICBoYXNfcmVsZWFzZXM/OiBib29sZWFuXG4gICAgfVtdLFxuXG4gICAgcHJldmlld192YXJpYW50OiB2Ml9JVmFyaWFudENvbmZpZztcbiAgICBleHRyYT86IHtcbiAgICAgICAgZmlyc3RWYXJpYW50OiB2Ml9JVmFyaWFudENvbmZpZzsgLy93aGVuIG5ldyBjb21wb25lbnQgY3JlYXRlcyBhdCB0aGUgY2xpZW50XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lEVE8gZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgZGF0YTogb2JqZWN0XG4gICAgbWV0aG9kTmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5JbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcyxcbiAgICAvL3NraW5zOiBJU2tpbkluc3RhbmNlQ29uZmlnW11cbn1cblxuZXhwb3J0IGNvbnN0IFNlZ21lbnRUeXBlID0ge1xuICAgIFwiRnVuY3Rpb25SZXN1bHRcIjogXCJGdW5jdGlvblJlc3VsdFwiLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEluc3RhbmNlIHtcbiAgICBzZWdtZW50SWQ6IHN0cmluZztcbiAgICBza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFNlZ21lbnRUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQgZXh0ZW5kcyBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTogdHlwZW9mIFNlZ21lbnRUeXBlLkZ1bmN0aW9uUmVzdWx0XG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGZ1bmN0aW9uOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IFNraW5TZWxlY3RvclR5cGVzID0ge1xuICAgIFwiU2VnbWVudGVkXCI6IFwiU2VnbWVudGVkXCIsXG4gICAgXCJEZWRpY2F0ZWRcIjogXCJEZWRpY2F0ZWRcIixcblxuICAgIC8qKlxuICAgICAqIFRoaXMgU2VsZWN0b3IgVHlwZSBpcyBub3QgeWV0IHN1cHBvcnRlZCBidXQgd2lsbCBiZSBhZGRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICAgICAqIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgXCJEZWZhdWx0XCI6IFwiRGVmYXVsdFwiXG59IGFzIGNvbnN0O1xuXG5cbi8qKlxuICogVGhpcyBTa2luIENvbmZpZyBUeXBlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ1dCB3aWxsIGJlIGFkZGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gKiBQbGVhc2UgY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHVwZGF0ZXMuXG4gKlxuICogQHR5cGUge0lEZWZhdWx0U2tpbkNvbmZpZ31cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRGVmYXVsdFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuRGVmYXVsdCxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudGVkU2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQsXG4gICAgc2VnbWVudHM6IElTZWdtZW50SW5zdGFuY2VbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEZWRpY2F0ZWRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2tpbn0gaW5zdGVhZC5cbiAgICAgKiBQcm9wZXJ0eSBza2lucyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLlxuICAgICAqIFBsZWFzZSB1cGRhdGUgeW91ciBjb2RlIHRvIHVzZSB7QGxpbmsgc2tpbn0gZm9yIGJldHRlciBjb21wYXRpYmlsaXR5LlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBza2lucz86IElTa2luSW5zdGFuY2VDb25maWdbXSAvLyBkZXByZWNhdGVkXG4gICAgc2tpbjogSVNraW5JbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgLy9UT0RPIDpcbiAgICAvLyBSZWZJRCA/IHRvIHN1cHBvcnQgbW9yZSB0aGFuIDEgY29tcG9uZW50IGZyb20gdGhlIHNhbWUgdHlwZSBpbiBjb21wb3NpdGVzID9cblxuICAgIC8vVE9ETyA6IHJlbW92ZVxuICAgIGNvbXBvbmVudE5hbWU6IHN0cmluZzsgLy8gPDwgY2hlY2tcblxuICAgIHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZ1xuXG4gICAgLy8gc3RvcmluZyB0aGUgbmVzdGVkIGNvbmZpZyBmb3IgcmVmIGNvbXBvbmVudHNcbiAgICBuZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnW11cblxuICAgIC8vb25seSBvbiBHRVQ/XG4gICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgdGhhdFxuICAgIHJlc29sdmVkRXhwZXJpZW5jZXM/OiBJRXhwZXJpZW5jZVtdXG4gICAgLy8gd2lsbCBpbmNsdWRlIGluc3RhbmNlIGFuZCBkZWYgY29uZmlnIGluIG9yZGVyIHRvIHJlbmRlciBpbiBwcm9kdWN0aW9uXG4gICAgcmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudENvbmZpZ1tdXG59XG5cbmV4cG9ydCBjb25zdCBFeHBlcmllbmNlVHlwZXMgPSB7XG4gICAgXCJTZWdtZW50XCI6IFwiU2VnbWVudFwiLFxuICAgIFwiUHJvbW9cIjogXCJQcm9tb1wiLFxuICAgIFwiQUJcIjogXCJBQlwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBFeHBlcmllbmNlVHlwZXNcbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIC8vc3RpY2tpbmVzc0ZhY3RvclxuICAgIC8vRW5kRGF0ZVxufVxuXG4vLyBleHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2VHcm91cCB7XG4vLyAgICAgaWQ6IHN0cmluZ1xuLy8gICAgIG5hbWU6IHN0cmluZ1xuLy8gICAgIHBlcmNlbnRhZ2U6IG51bWJlclxuLy8gfVxuXG5leHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZTogdHlwZW9mIEV4cGVyaWVuY2VUeXBlcy5BQlxuICAgIC8vIGdyb3VwczogSUFCRXhwZXJpZW5jZUdyb3VwW11cbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIHBlcmNlbnRhZ2U6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEYXRlUmFuZ2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBzdGFydDogRGF0ZVxuICAgIGVuZDogRGF0ZVxuICAgIHRpbWV6b25lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIEV4cGVyaWVuY2VUeXBlc1xuICAgIHNlZ21lbnQ6IElTZWdtZW50RGVmaW5pdGlvblxuICAgIGRhdGVSYW5nZT86IElEYXRlUmFuZ2Vcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3dEZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGNvbXBvbmVudHM6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1tdO1xuICAgIG9yaWdpbnM6IHN0cmluZ1tdLFxuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgYnJhbmNoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudENvbmZpZyB7XG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xuICAgIHR5cGU6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICAvLyBUT0RPIDogdmVyaWZ5IHVuaXF1ZW5lc3MgKGRhc2hib2FyZCAmIHNlcnZlcilcbiAgICBuYW1lOiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIElCcmFuY2hhYmxlIHtcbiAgICBicmFuY2g/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3cgZXh0ZW5kcyBPbWl0PElVc2VyRmxvd0RlZmluaXRpb24sICdjb21wb25lbnRzJz4sIElCcmFuY2hhYmxlIHtcbiAgICBjb21wb25lbnRzOiBJQ29tcG9uZW50Q29uZmlnW11cbn1cblxuZXhwb3J0IGNsYXNzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdD86IFNoYWRvd1Jvb3QpIHtcblxuICAgIH1cblxuICAgIGdldFJvb3REaXYgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKS5xdWVyeVNlbGVjdG9yKCdkaXYnKVxuICAgIH1cblxuICAgIGdldFJvb3QgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlPFQ+ID1cbiAgICBUIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IC8vIEV4Y2x1ZGUgZnVuY3Rpb25zXG4gICAgICAgIFQgZXh0ZW5kcyBBcnJheTxpbmZlciBVPiA/IFNlcmlhbGl6YWJsZTxVPltdIDogLy8gSGFuZGxlIGFycmF5c1xuICAgICAgICAgICAgVCBleHRlbmRzIG9iamVjdCA/IHtcbiAgICAgICAgICAgICAgICBbSyBpbiBrZXlvZiBUIGFzIFRbS10gZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogS106IFNlcmlhbGl6YWJsZTxUW0tdPlxuICAgICAgICAgICAgfSA6IFQ7IC8vIEhhbmRsZSBvYmplY3RzXG5cbmNvbnN0IGlzUHJpbWl0aXZlID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBPYmplY3QodmFsdWUpO1xufVxuXG5jb25zdCBpc0Z1bmN0aW9uID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnRhaW5zUHJpbWl0aXZlc09ubHkgPSAob2JqKSA9PiB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24ob2JqKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjaGVjayBpZiBpdCdzIGEgbmVzdGVkIG9iamVjdFxuICAgICAgICAgICAgaWYgKCFjb250YWluc1ByaW1pdGl2ZXNPbmx5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBJdCdzIGEgcHJpbWl0aXZlLCBzbyB3ZSBjYW4gc2tpcCBpdFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBGb3VuZCBhIG5vbi1wcmltaXRpdmUgdmFsdWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlOyAvLyBBbGwgdmFsdWVzIGFyZSBwcmltaXRpdmVzIG9yIG5lc3RlZCBvYmplY3RzIHdpdGggcHJpbWl0aXZlc1xufVxuXG4vLyBjdXJyZW50bHkgc3VwcG9ydCByb290IGxldmVsIG9ubHlcbi8vIHt4OiAxLCB5IDogJ2EnLCB6IDogKCk9PnsuLi59LCBpbm5lciA6IHsgeDogMSAsIHkgOiAnYSd9IH1cbi8vIHt4OiAxLCB5IDogJ2EnfVxuLy9odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0dsb3NzYXJ5L0ZhbHN5XG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGVTa2VsZXRvbjxUPiA9IFBhcnRpYWw8UmVjb3JkPGtleW9mIFQsIGJvb2xlYW4gfCBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+Pj4+IHwgYm9vbGVhbjtcblxuZXhwb3J0IGNvbnN0IG1ha2VTZXJpYWxpemFibGUgPSA8VD4oXG4gICAgb2JqOiBULFxuICAgIHNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxUPiA9IHt9LFxuICAgIGluY2x1ZGVGYWxzeUtleXM6IGJvb2xlYW4gPSB0cnVlLCAvLyBUT0RPIDogdXNlIHRoYXQgYXJnXG4gICAgc2VlbjogV2Vha01hcDxvYmplY3QsIFNlcmlhbGl6YWJsZTxhbnk+PiA9IG5ldyBXZWFrTWFwKClcbik6IFNlcmlhbGl6YWJsZTxUPiA9PiB7XG5cbiAgICBpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gb2JqIGFzIFNlcmlhbGl6YWJsZTxUPjsgLy8gRGlyZWN0bHkgcmV0dXJuIHByaW1pdGl2ZSB2YWx1ZXNcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vlbi5nZXQob2JqKSE7IC8vIFJldHVybiB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgb2JqZWN0XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgYXJyYXkgc2VyaWFsaXphdGlvblxuICAgICAgICBjb25zdCBzZXJpYWxpemFibGVBcnJheTogU2VyaWFsaXphYmxlPGFueT5bXSA9IFtdO1xuICAgICAgICBzZWVuLnNldChvYmosIHNlcmlhbGl6YWJsZUFycmF5KTsgLy8gU3RvcmUgdGhlIGFycmF5IGluIHNlZW5cblxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgb2JqLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IG9ialtpbmRleF07XG4gICAgICAgICAgICBzZXJpYWxpemFibGVBcnJheVtpbmRleF0gPSBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQsIHNrZWxldG9uLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXphYmxlQXJyYXkgYXMgU2VyaWFsaXphYmxlPFQ+O1xuICAgIH1cblxuICAgIGlmIChvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGN5Y2xpYyByZWZlcmVuY2VzXG4gICAgICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vlbi5nZXQob2JqKSE7IC8vIFJldHVybiB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgb2JqZWN0XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VyaWFsaXphYmxlT2JqZWN0OiBQYXJ0aWFsPFNlcmlhbGl6YWJsZTxUPj4gPSB7fTtcbiAgICAgICAgc2Vlbi5zZXQob2JqLCBzZXJpYWxpemFibGVPYmplY3QpOyAvLyBTdG9yZSB0aGUgb2JqZWN0IGluIHNlZW5cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgaXMgaW4gdGhlIHNrZWxldG9uIGFuZCBpZiBpdCdzIGEgdmFsaWQga2V5IHRvIHNlcmlhbGl6ZVxuXG4gICAgICAgICAgICBjb25zdCBrZXlJblNrZWxldG9uID0gdHlwZW9mIHNrZWxldG9uID09IFwiYm9vbGVhblwiID8gc2tlbGV0b24gOiBza2VsZXRvbltrZXldO1xuXG4gICAgICAgICAgICBpZiAoa2V5SW5Ta2VsZXRvbikge1xuICAgICAgICAgICAgICAgIGlmIChrZXlJblNrZWxldG9uID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBza2VsZXRvbiBpbmRpY2F0ZXMgdG8gc2VyaWFsaXplIHRoaXMga2V5XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlRmFsc3lLZXlzID8gb2JqW2tleV0gIT09IHVuZGVmaW5lZCA6IG9ialtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemFibGVPYmplY3Rba2V5XSA9IG1ha2VTZXJpYWxpemFibGUob2JqW2tleV0sIHRydWUsIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Yga2V5SW5Ta2VsZXRvbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNrZWxldG9uIGluZGljYXRlcyBuZXN0ZWQga2V5cyB0byBzZXJpYWxpemVcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemFibGVPYmplY3Rba2V5XSA9IG1ha2VTZXJpYWxpemFibGUob2JqW2tleV0sIGtleUluU2tlbGV0b24sIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXphYmxlT2JqZWN0IGFzIFNlcmlhbGl6YWJsZTxUPjtcbiAgICB9XG5cbiAgICByZXR1cm4ge30gYXMgYW55OyAvLyBSZXR1cm4gYW4gZW1wdHkgb2JqZWN0IGZvciBvdGhlciBjYXNlc1xufVxuIiwgImV4cG9ydCBjb25zdCBFcnJvcnMgPSB7XG4gICAgbm90U2VyaWFsaXphYmxlUmVmQ2FsbDogKHByb3AsIGFyZykgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxuVGhlIGlucHV0IHByb3ZpZGVkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGlzIG5vdCBzZXJpYWxpemFibGUuIFNlcmlhbGl6YXRpb24gaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGRhdGEgY2FuIGJlIHNhZmVseSB0cmFuc2ZlcnJlZCB0byB0aGUgc2tpbiBpbXBsZW1lbnRhdGlvbi4gXG5UaGUgZm9sbG93aW5nIHR5cGVzIG9mIGRhdGEgYXJlIGNvbnNpZGVyZWQgbm9uLXNlcmlhbGl6YWJsZSBhbmQgY2Fubm90IGJlIHByb2Nlc3NlZDpcblxuLSBGdW5jdGlvbnNcbi0gRE9NIGVsZW1lbnRzXG4tIENsYXNzIGluc3RhbmNlc1xuLSBDaXJjdWxhciByZWZlcmVuY2VzXG4tIFN5bWJvbHNcbi0gQmlnSW50IHZhbHVlc1xuXG5JbiB0aGUgZm9sbG93aW5nIGV4ZWN1dGlvbiB3ZSBkZXRlY3RlZCA6XG5+fn5+fn5+flxuJHthcmd9IFxufn5+fn5+fn5cbmFzIG5vdCBzZXJpYWxpemFibGUuXG5cblRvIHJlc29sdmUgdGhpcyBpc3N1ZSwgcGxlYXNlIGVuc3VyZSB0aGF0IGFsbCBpbnB1dHMgcGFzc2VkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGFyZSBpbiBhIHNlcmlhbGl6YWJsZSBmb3JtYXQuXG5UaGlzIHR5cGljYWxseSBpbmNsdWRlcyBwcmltaXRpdmUgdHlwZXMgKHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zKSwgYXJyYXlzLCBhbmQgcGxhaW4gb2JqZWN0cy4gXG5JZiB5b3UgbmVlZCB0byBpbmNsdWRlIGNvbXBsZXggZGF0YSB0eXBlcywgY29uc2lkZXIgY29udmVydGluZyB0aGVtIHRvIGEgc2VyaWFsaXphYmxlIHN0cnVjdHVyZSBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZSBmdW5jdGlvbi5cbk9yIHVzZSBNeW9wIG1lc3NhZ2UgdGhhdCBzdXBwb3J0IGl0OiBDdXN0b21SZWZNZXNzYWdlLCBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSBvciBFeGVjdXRlU2NyaXB0TWVzc2FnZS5cblxuU3VnZ2VzdGVkIEZpeDpcbjEuIFJlbW92ZSBvciByZXBsYWNlIG5vbi1zZXJpYWxpemFibGUgdmFsdWVzIGZyb20geW91ciBpbnB1dC5cbjIuIElmIHVzaW5nIG9iamVjdHMsIGVuc3VyZSB0aGV5IGRvIG5vdCBjb250YWluIGFueSBmdW5jdGlvbnMgb3IgY2lyY3VsYXIgcmVmZXJlbmNlcy5cbjMuIENvbnZlcnQgYW55IGNsYXNzIGluc3RhbmNlcyB0byBwbGFpbiBvYmplY3RzIG9yIEpTT04tY29tcGF0aWJsZSBmb3JtYXRzLlxuNC4gVXNlIGRlZGljYXRlZCBNeW9wIG1lc3NhZ2UuXG5cbkZvciBtb3JlIGRldGFpbHMgb24gc2VyaWFsaXphdGlvbiBhbmQgTXlvcCBtZXNzYWdlIGV4YW1wbGVzLCByZWZlciB0byBodHRwczovL2RvY3MubXlvcC5kZXZcXC5cblxuYCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudCwgSU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0VudmVsb3BlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9FbnZlbG9wZWRNZXNzYWdlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wUmVmQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBwdWJsaWMgcGFyZW50OiBJTXlvcENvbXBvbmVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgLy9UT0RPIDogY2hlY2sgcGFyZW50Q29tcG9uZW50LmNvbnRhaW5lci4uLlxuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBwYXJlbnQuY29udGFpbmVyLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICAvL3RoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZChhcmd1bWVudHMuY2FsbGVlLm5hbWUpKTtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdoaWRlJykpO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2hvdycpKTtcbiAgICB9XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IHJlYWwgY2xlYW51cFxuICAgICAgICAvL2NvbnNvbGUubG9nKCdyZWYgaW5zcGVjdCBjYWxsZWQsIGNyZWF0aW5nIEV4ZWN1dGVDb21wb25lbnRNZXRob2QgaW5zcGVjdCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYsIHRoaXMuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdpbnNwZWN0JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0JykpO1xuICAgIH1cblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gJ011dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJykge1xuICAgICAgICAvLyAgZGVidWdnZXI7XG4gICAgICAgIC8vICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyB9XG4gICAgICAgIHJldHVybiBzdXBlci5vbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlKTtcbiAgICB9XG5cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ3JlZiBtZXNzYWdlIHNlbmRpbmcgJywgbWVzc2FnZSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlclxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgLy8gdGhpcy5pZCB3aWxsIGJlIGF2YWlsYWJsZSBvbiB0aGUgbmVzdGVkIGNvbXBvbmVudFxuICAgICAgICB0aGlzLnBhcmVudC5zZW5kKG5ldyBFbnZlbG9wZWRNZXNzYWdlKHRoaXMuaWQsIG1lc3NhZ2UpKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH07XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0luaXRpYXRlZClcbiAgICAgICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnZGlzcG9zZScpKTtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge3NldERlYnVnU3R5bGV9IGZyb20gXCIuLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5cbi8qKlxuICogQ29tcG9uZW50IHdyYXBwZXIgZm9yIE15b3AgV2ViIENvbXBvbmVudHMgdGhhdCBhcmUgZXh0cmFjdGVkIGZyb20gSFRNTFxuICogYW5kIHJ1biBkaXJlY3RseSBvbiB0aGUgaG9zdCBkb2N1bWVudCAobm90IGluIGFuIGlmcmFtZSkuXG4gKlxuICogVGhlc2UgY29tcG9uZW50cyB1c2UgdGhlIG5hdGl2ZSBXZWIgQ29tcG9uZW50cyBBUEkgKEN1c3RvbSBFbGVtZW50cyArIFNoYWRvdyBET00pXG4gKiBhbmQgY29tbXVuaWNhdGUgdmlhIGRpcmVjdCBtZXRob2QgY2FsbHMgYW5kIEN1c3RvbUV2ZW50cyBpbnN0ZWFkIG9mIHBvc3RNZXNzYWdlLlxuICovXG5leHBvcnQgY2xhc3MgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcbiAgICBwcml2YXRlIGN0YUNsZWFudXA/OiAoKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgX2N0YUhhbmRsZXI/OiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfY3RhUXVldWU6IEFycmF5PHthY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93bn0+ID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIHNraW46IElTa2luQ29uZmlnLFxuICAgICAgICBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgcHJpdmF0ZSBjdXN0b21FbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICAgICAgcHJpdmF0ZSB0YWdOYW1lOiBzdHJpbmcsXG4gICAgICAgIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudERlZmluaXRpb24sIGNvbnRhaW5lciwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGN1c3RvbUVsZW1lbnQ7XG5cbiAgICAgICAgLy8gV2ViIGNvbXBvbmVudHMgYXJlIGluaXRpYXRlZCBpbW1lZGlhdGVseSAobm8gcG9zdE1lc3NhZ2UgaGFuZHNoYWtlIG5lZWRlZClcbiAgICAgICAgdGhpcy5zZXRJbml0aWF0ZWQoKTtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdDogQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB7fTtcblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSBzZXREZWJ1Z1N0eWxlKHRoaXMuaWQsICdNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50JywgMCwgdGhpcy5jb250YWluZXIsIHRoaXMuY3VzdG9tRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cEluc3BlY3Q7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCc7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIGNvbXBvbmVudCB3aXRoIGRhdGEgYnkgY2FsbGluZyBteW9wX2luaXRfaW50ZXJmYWNlIGRpcmVjdGx5XG4gICAgICovXG4gICAgaW5pdFdpdGhEYXRhKGRhdGE6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5jdXN0b21FbGVtZW50IGFzIGFueSkubXlvcF9pbml0X2ludGVyZmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UoZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY3VycmVudCBkYXRhIGZyb20gdGhlIGNvbXBvbmVudFxuICAgICAqL1xuICAgIGdldERhdGEoKTogdW5rbm93biB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5jdXN0b21FbGVtZW50IGFzIGFueSkubXlvcF9pbml0X2ludGVyZmFjZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IENUQSBoYW5kbGVyIC0gdW5pZmllZCBBUEkgd2l0aCBpZnJhbWUgY29tcG9uZW50cy5cbiAgICAgKiBDYWxsZWQgdmlhIHByb3BzLm15b3BfY3RhX2hhbmRsZXIgPSBoYW5kbGVyXG4gICAgICovXG4gICAgc2V0Q3RhSGFuZGxlcihoYW5kbGVyOiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgcHJldmlvdXMgbGlzdGVuZXIgaWYgZXhpc3RzXG4gICAgICAgIGlmICh0aGlzLmN0YUNsZWFudXApIHtcbiAgICAgICAgICAgIHRoaXMuY3RhQ2xlYW51cCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY3RhSGFuZGxlciA9IGhhbmRsZXI7XG5cbiAgICAgICAgLy8gRmx1c2ggYW55IHF1ZXVlZCBDVEFzIHRoYXQgZmlyZWQgYmVmb3JlIGhhbmRsZXIgd2FzIHNldFxuICAgICAgICBpZiAodGhpcy5fY3RhUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcXVldWUgPSBbLi4udGhpcy5fY3RhUXVldWVdO1xuICAgICAgICAgICAgdGhpcy5fY3RhUXVldWUgPSBbXTtcbiAgICAgICAgICAgIHF1ZXVlLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIoaXRlbS5hY3Rpb24sIGl0ZW0ucGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdXAgZXZlbnQgbGlzdGVuZXJcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZSBhcyBDdXN0b21FdmVudDtcbiAgICAgICAgICAgIGlmIChjdXN0b21FdmVudC5kZXRhaWw/LmFjdGlvbikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jdGFIYW5kbGVyICYmICF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2N0YUhhbmRsZXIoY3VzdG9tRXZlbnQuZGV0YWlsLmFjdGlvbiwgY3VzdG9tRXZlbnQuZGV0YWlsLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2N0YUhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUXVldWUgaWYgaGFuZGxlciBub3QgeWV0IHNldCAoc2hvdWxkbid0IGhhcHBlbiBhZnRlciBzZXRDdGFIYW5kbGVyLCBidXQgc2FmZXR5KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdGFRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogY3VzdG9tRXZlbnQuZGV0YWlsLmFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGN1c3RvbUV2ZW50LmRldGFpbC5wYXlsb2FkXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbXlvcC1jdGEnLCBsaXN0ZW5lcik7XG4gICAgICAgIHRoaXMuY3RhQ2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdteW9wLWN0YScsIGxpc3RlbmVyKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIG1lc3NhZ2UtYmFzZWQgY29tcG9uZW50cy5cbiAgICAgKiBXZWIgY29tcG9uZW50cyBkb24ndCB1c2UgcG9zdE1lc3NhZ2UsIHNvIHRoaXMgaXMgYSBuby1vcCBmb3IgbW9zdCBtZXNzYWdlcy5cbiAgICAgKi9cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZTxhbnk+KSA9PiB7XG4gICAgICAgIC8vIFdlYiBjb21wb25lbnRzIGRvbid0IHVzZSB0aGUgcG9zdE1lc3NhZ2Ugc3lzdGVtXG4gICAgICAgIC8vIEluc3RlYWQsIGludGVyYWN0IGRpcmVjdGx5IHZpYSBwcm9wcy5teW9wX2luaXRfaW50ZXJmYWNlIGFuZCBwcm9wcy5teW9wX2N0YV9oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlKTtcblxuICAgICAgICAvLyBMb2cgZm9yIGRlYnVnZ2luZ1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudF0gc2VuZCgpIGNhbGxlZCAtIHdlYiBjb21wb25lbnRzIHVzZSBkaXJlY3QgQVBJIGluc3RlYWQnLCBtZXNzYWdlKTtcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY3RhQ2xlYW51cCkge1xuICAgICAgICAgICAgdGhpcy5jdGFDbGVhbnVwKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5jdXN0b21FbGVtZW50KTtcbiAgICB9XG59XG4iLCAiLy90eXBlIEFDb25zdHJ1Y3RvclR5cGVPZjxUPiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIEN1c3RvbVJlZk1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQgKiBhcyBtZXNzYWdlcyBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQ2xlYW51cEhhbmRsZXIsIElDb21wb25lbnRDb25maWcsXG4gICAgdHlwZSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJQ29tcG9uZW50UmVmQmVoYXZpb3IsIElIVE1MTG9hZGVyQ29uZmlnLCBJUHJvcENvZGVCZWhhdmlvcixcbiAgICBJUHJvcENvbmZpZywgSVNraW5Db25maWcsIFByb3BDb25maWdCZWhhdmlvclR5cGVzLFxuICAgIFJlZkJlaGF2aW9yVHlwZSwgU2hhZG93Um9vdE1vZGVUeXBlLCBTa2luTG9hZGVycywgU2tpbkxvYWRlclR5cGVcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtjb250YWluc1ByaW1pdGl2ZXNPbmx5fSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb25cIjtcbmltcG9ydCB7RXJyb3JzfSBmcm9tIFwiLi9sb2dNZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wUmVmQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL215b3BSZWZDb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9teW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50XCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuL2hvc3RTREtcIjtcblxudHlwZSBjb21wb25lbnREZWZpbml0aW9uUHJvcHMgPSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1sncHJvcHMnXVxuXG5jb25zdCBjcmVhdGVEZWJ1Z1RpdGxlID0gKHRleHQ6IHN0cmluZywgdG9wOiBudW1iZXIsIGNvbXBvbmVudERlZmluaXRpb25Db25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICB0aXRsZUVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICB0aXRsZUVsLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB0aXRsZUVsLnN0eWxlLnBhZGRpbmcgPSAnMCA1cHgnO1xuICAgIHRpdGxlRWwuc3R5bGUuZm9udFNpemUgPSAnMTRweCc7XG4gICAgdGl0bGVFbC5zdHlsZVsndG9wJ10gPSAnMCc7XG4gICAgdGl0bGVFbC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgIC8vdGl0bGVFbC5zdHlsZS5sZWZ0ID0gJzUwJSc7XG4gICAgdGl0bGVFbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgtNTAlKSc7XG4gICAgdGl0bGVFbC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICB0aXRsZUVsLmhyZWYgPSBgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudERlZmluaXRpb25Db25maWcuaWR9YFxuXG4gICAgcmV0dXJuIHRpdGxlRWw7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RGVidWdTdHlsZSA9IChpZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgIC8vIzAwN0JGRiAoYmx1ZSkgb3IgI0ZGNTcyMiAob3JhbmdlKVxuICAgIC8vIzRDQUY1MCAoZ3JlZW4pIG9yICNGRkMxMDcgKGFtYmVyKVxuICAgIC8vIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2lkfSA6ICR7dHlwZX1gLCB0b3AsIGNvbXBvbmVudERlZmluaXRpb25Db25maWcpO1xuICAgIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2NvbXBvbmVudERlZmluaXRpb25Db25maWcubmFtZX0gOiAke3R5cGV9YCwgdG9wLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKTtcbiAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHRvcFRleHQsIGNvbXBvbmVudEVsZW1lbnQpO1xuICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjMDA3QkZGJztcbiAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5ib3JkZXIgPSAndW5zZXQnO1xuICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQodG9wVGV4dCk7XG4gICAgfVxufVxuXG5jb25zdCByZXBvcnRFcnJvciA9IChwcm9wQ29uZmlnOiBJUHJvcENvbmZpZywgcHJvcE5hbWU6IHN0cmluZywgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudDxhbnksIGFueT4pID0+IHtcbiAgICBpZiAoIXByb3BDb25maWcpIHtcblxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEVycm9yOiBVbmRlZmluZWQgUHJvcFxcblxcbmAgK1xuICAgICAgICAgICAgYEl0IGxvb2tzIGxpa2UgeW91J3ZlIHRyaWVkIHRvIHVzZSBhIHByb3AgdGhhdCBoYXNuJ3QgYmVlbiBkZWZpbmVkLlxcbmAgK1xuICAgICAgICAgICAgYFBsZWFzZSBjaGVjayB0aGUgcHJvcCBuYW1lIGZvciBhbnkgdHlwb3Mgb3IgZW5zdXJlIHRoYXQgaXQgaXMgcHJvcGVybHkgZGVmaW5lZCBpbiB0aGUgY29tcG9uZW50J3MgcHJvcCBsaXN0LlxcblxcbmAgK1xuICAgICAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wTmFtZX1cXG5gICtcbiAgICAgICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICAgICAgYEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgY29tcG9uZW50IHBhZ2UgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfSBvciBjb25zdWx0IHRoZSBkZXZlbG9wZXIgZ3VpZGUuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuY29uc3QgcmVwb3J0VW5zdXBwb3J0ZWQgPSAocHJvcENvbmZpZzogSVByb3BDb25maWcsIHByb3BOYW1lOiBzdHJpbmcsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQ8YW55LCBhbnk+KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEVycm9yOiBDb2RlIFByb3AgTm90IFN1cHBvcnRlZFxcblxcbmAgK1xuICAgICAgICBgQ3VycmVudGx5LCBjb2RlIHByb3BzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBsb2NhbCBmcmFtZSBjb21wb25lbnRzLlxcbmAgK1xuICAgICAgICBgXHUyNkEwXHVGRTBGIFRoaXMgaXMgYSB3b3JrIGluIHByb2dyZXNzIGZlYXR1cmUgXHUyMDE0IGNvZGUgcHJvcHMgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gdXBjb21pbmcgdmVyc2lvbnMuXFxuXFxuYCArXG4gICAgICAgIGBJbiB0aGUgbWVhbnRpbWUsIHlvdSBjYW4gdXNlIG1lc3NhZ2UgcHJvcHMuXFxuXFxuYCArXG4gICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcE5hbWV9XFxuYCArXG4gICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBjb21wb25lbnQgcGFnZSBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9IG9yIGNvbnN1bHQgdGhlIGRldmVsb3BlciBndWlkZS5gXG4gICAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbm5lY3RQcm9wcyA9IDxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPihjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBwcm9wc0NvbmZpZzogSVByb3BDb25maWdbXSwgc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuXG4gICAgY29uc3QgcHJvcHNNYXAgPSBwcm9wc0NvbmZpZy5yZWR1Y2UoKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucHJldmlvdXNWYWx1ZSxcbiAgICAgICAgICAgIFtjdXJyZW50VmFsdWUubmFtZV06IHsuLi5jdXJyZW50VmFsdWV9XG4gICAgICAgIH1cbiAgICB9LCB7fSk7XG5cbiAgICBjb25zdCBwcm9wc0hhbmRsZXIgPSB7XG4gICAgICAgIGdldDogKF86IElNeW9wQ29tcG9uZW50LCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHByb3BDb25maWcgPSBwcm9wc01hcFtwcm9wXTtcblxuICAgICAgICAgICAgaWYgKHJlcG9ydEVycm9yKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZXh0cmFjdGVkIHdlYiBjb21wb25lbnRzIEZJUlNUXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9pbml0X2ludGVyZmFjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBhIGZ1bmN0aW9uIHRoYXQgZ2V0cy9zZXRzIGRhdGEgKG1hdGNoZXMgaWZyYW1lIGJlaGF2aW9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkYXRhPzogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG15b3BfY3RhX2hhbmRsZXIsIHJldHVybiB1bmRlZmluZWQgKGl0J3Mgd3JpdGUtb25seSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBGb3IgaWZyYW1lIChsb2NhbEZyYW1lKSBjb21wb25lbnRzXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSA9PT0gU2tpbkxvYWRlcnMuSFRNTExvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZExvYWRlciA9IHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZExvYWRlci5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuZWxlbWVudC5jb250ZW50V2luZG93W3R5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3BdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXBvcnRVbnN1cHBvcnRlZChwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcubW9kZSA9PT0gJ291dHB1dCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVBhcmFtczogYW55W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCBpbnRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaChSZWYuY3JlYXRlKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goLi4ucHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlQ3RvciA9IG1lc3NhZ2VzW3Byb3BDb25maWcuYmVoYXZpb3IubWVzc2FnZV07XG5cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IG1lc3NhZ2VDdG9yKC4uLm1lc3NhZ2VQYXJhbXMpKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiAoXzogSU15b3BDb21wb25lbnQsIHByb3A6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgcHJvcENvbmZpZyA9IHByb3BzTWFwW3Byb3BdO1xuXG4gICAgICAgICAgICBpZiAocmVwb3J0RXJyb3IocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZSkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudHMgRklSU1QgKGJlZm9yZSBsb2NhbEZyYW1lIGNoZWNrKVxuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgZXh0cmFjdGVkIHdlYiBjb21wb25lbnRzIG1heSBoYXZlIHNoYWRvd1Jvb3RNb2RlOiBsb2NhbEZyYW1lIGluIHRoZWlyIGNvbmZpZ1xuICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGV5IHJ1biBkaXJlY3RseSBvbiB0aGUgaG9zdCBkb2N1bWVudCwgbm90IGluIGFuIGlmcmFtZVxuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfY3RhX2hhbmRsZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2V0Q3RhSGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfaW5pdF9pbnRlcmZhY2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5pdFdpdGhEYXRhKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRm9yIGlmcmFtZSAobG9jYWxGcmFtZSkgY29tcG9uZW50c1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUgPT09IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRMb2FkZXIgPSBzZWxlY3RlZFNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRMb2FkZXIuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5sb2NhbEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50V2luZG93ID0gKGNvbXBvbmVudC5lbGVtZW50IGFzIEhUTUxJRnJhbWVFbGVtZW50KS5jb250ZW50V2luZG93IGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSByZWFsIGhhbmRsZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRXaW5kb3dbcHJvcE5hbWVdID0gdmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZsdXNoIENUQSBxdWV1ZSBpZiB0aGlzIGlzIG15b3BfY3RhX2hhbmRsZXIgYW5kIHF1ZXVlIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9jdGFfaGFuZGxlcicgJiYgY29udGVudFdpbmRvdy5fX215b3BfY3RhX3F1ZXVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVldWUgPSBjb250ZW50V2luZG93Ll9fbXlvcF9jdGFfcXVldWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFdpbmRvdy5fX215b3BfY3RhX3F1ZXVlID0gbnVsbDsgLy8gQ2xlYXIgdG8gcHJldmVudCBkb3VibGUtZmx1c2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS5mb3JFYWNoKChpdGVtOiB7YWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IGFueX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBpZiBjb21wb25lbnQgd2FzIGRpc3Bvc2VkIGR1cmluZyBmbHVzaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm1hcmtlZEZvckRpc3Bvc2VkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKGl0ZW0uYWN0aW9uLCBpdGVtLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVwb3J0VW5zdXBwb3J0ZWQocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vaWYocHJvcENvbmZpZy5iZWhhdmlvciA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMubWVzc2FnZSlcbiAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5tb2RlID09PSAnaW5wdXQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgbXVsdGkgYmVoYXZpb3JzXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gJ21lc3NhZ2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlUGFyYW1zOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCBpbnRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKFJlZi5jcmVhdGUocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goLi4ucHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlQ3RvciA9IG1lc3NhZ2VzW3Byb3BDb25maWcuYmVoYXZpb3IubWVzc2FnZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgbWVzc2FnZUN0b3IoLi4ubWVzc2FnZVBhcmFtcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3I6IFVuc3VwcG9ydGVkIEJlaGF2aW9yXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoZSAnYmVoYXZpb3InIGZpZWxkIHByb3ZpZGVkIGlzIG5vdCBzdXBwb3J0ZWQuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBCZWhhdmlvciBGaWVsZDogJHtwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGV9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYENoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB2YWxpZCBiZWhhdmlvciBvcHRpb25zLmBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnQucHJvcHMgPSB7fTtcbiAgICBjb21wb25lbnQucHJvcHMgPSBuZXcgUHJveHkoY29tcG9uZW50LnByb3BzLCBwcm9wc0hhbmRsZXIpO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudCBhcyAoT21pdDxJTXlvcENvbXBvbmVudCwgJ3Byb3BzJz4gJiB7XG4gICAgICAgIHByb3BzOiBwcm9wVHlwZXM8VD5cbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmUHJveHkgPSAodGFyZ2V0OiBSZWYsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHRhcmdldCwge1xuICAgICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG5cbiAgICAgICAgICAgIC8vIGlmIChwcm9wID09PSAnX19ub25Qcm94aWVkJykge1xuICAgICAgICAgICAgLy8gICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh0YXJnZXRbcHJvcF0pIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgZ2V0dGVyRnVuY3Rpb24gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhcmdzLmZvckVhY2goYXJnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGFpbnNQcmltaXRpdmVzT25seShhcmcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLm5vdFNlcmlhbGl6YWJsZVJlZkNhbGwocHJvcCwgYXJnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBwcm9wTmFtZSwgZnVuY3Rpb25BcmdzLCBtYWtlU2VyaWFsaXphYmxlfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlZltwcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWtlU2VyaWFsaXphYmxlKHJlZltwcm9wTmFtZV0oLi4uZnVuY3Rpb25BcmdzKSwgdHJ1ZSkgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbmQgcmV0dXJuIGl0cyByZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWtlU2VyaWFsaXphYmxlKHZhbHVlLCB0cnVlKTsgLy8gUmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IHRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogdGFyZ2V0LnJlZkNvbmZpZy5zZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogcHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFyZ3M6IGFyZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShtc2cuY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vVE9ETzogd2UgY2FuIGltcGxlbWVudCB0aGluZ3MgbGlrZSBhdXRvIHNlcmlhbGl6YXRpb24gYW5kIGJpbmRpbmcgZnVuY3Rpb25zIGhlcmVcbiAgICAgICAgICAgIC8vZ2V0dGVyRnVuY3Rpb24udGVzdCA9ICcxMjMnO1xuXG4gICAgICAgICAgICByZXR1cm4gZ2V0dGVyRnVuY3Rpb247XG5cbiAgICAgICAgICAgIC8vcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCh0YXJnZXQsIHByb3A6IHN0cmluZywgdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBwcm9wTmFtZSwgcHJvcFZhbHVlfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVmKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogZml4IHRoYXRcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiB0YXJnZXQucmVmQ29uZmlnLnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBwcm9wVmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogcHJvcFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBsb2c/XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlZkNvbXBvbmVudCA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4ocmVmOiBSZWYsIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpOiBQcm9taXNlPFQ+ID0+IHtcbiAgICBjb25zdCBjb21wb25lbnQgPSByZWYuY29tcG9uZW50O1xuICAgIGlmICghY29tcG9uZW50KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbnQgY3JlYXRlUmVmQ29tcG9uZW50IHdpdGggZGV0YWNoZWQgcmVmJyk7XG5cbiAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkJywgcmVmLCBjb21wb25lbnRDb25maWcpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gbmV3IE15b3BSZWZDb21wb25lbnQoY29tcG9uZW50Q29uZmlnLnR5cGUsIGNvbXBvbmVudCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbXBvbmVudHMucHVzaChyZWZDb21wb25lbnQpO1xuXG4gICAgICAgIC8vZm9yIGNhc2VzIHdoZXJlIHJlZiBjb21wb25lbnRzIGRlZmluZSBpbiB0aGUgY29tcG9uZW50IGNvbmZpZ1xuICAgICAgICAvLyB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSByb290IGNvbXBvbmVudCB0aGUgYmUgaW5pdGlhdGVkIGJlZm9yZSBpbnRlcmFjdGluZyB3aXRoIGl0XG4gICAgICAgIGF3YWl0IGNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuXG4gICAgICAgIC8vVE9ETyA6XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vcmVqZWN0KCd0aW1lb3V0PycpO1xuICAgICAgICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgICAgIH0sIDUwMDApO1xuXG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlKHJlZi5yZWZDb25maWcsXG4gICAgICAgICAgICBjb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucyA/IG9wdGlvbnMgOiB7fSxcbiAgICAgICAgICAgICAgICBpZDogcmVmQ29tcG9uZW50LmlkLFxuICAgICAgICAgICAgICAgIF9oYXNQYXJlbnQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyAobWVzc2FnZSkgPT4ge1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgaWYgdGltZW91dCBhbHJlYWR5IHBhc3NlZFxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmZhaWxlZCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOlxuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgZmFpbGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCA9IGNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT0gcmVmQ29tcG9uZW50LmlkKTtcblxuICAgICAgICAgICAgICAgIC8vc2FtZSBtZW1vcnkgZW52LCBzYW1lIEhvc3RTREtcbiAgICAgICAgICAgICAgICBpZiAoaW1wbGVtZW50YXRpb25Db21wb25lbnQgIT09IHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBjbGVhbiByZWZDb21wb25lbnQgP1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCBhcyB1bmtub3duIGFzIFQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnNldEluaXRpYXRlZCgpXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogaGVyZSA+XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogd2hhdCBhYm91dCByZWFwdGVycyA/ISBkeW5hbWljID8hXG4gICAgICAgICAgICAgICAgLy8gY29uc3QgZXhzaXN0aW5nUmVmQ29tcG9uZW50ID0gY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSBhcyBNeW9wUmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vIGlmIChleHNpc3RpbmdSZWZDb21wb25lbnQuaWQgJiYgZXhzaXN0aW5nUmVmQ29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gW2NvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0sIHJlZkNvbXBvbmVudF07XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0ucHVzaChyZWZDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7IC8vaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSByZWZDb21wb25lbnQuaWQpITtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBpbiB3ZWJjb21wb25lbnQgY2FzZSB0aGUgc2FtZSBpZCB3aWxsIGFscmVkYXkgYmUgaGVyZSwgd2hpY2ggaXMgZ29vZCAhXG4gICAgICAgICAgICAgICAgLy8gbmFtZTpcbiAgICAgICAgICAgICAgICAvLyAgICAgaWRcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkXG5cbiAgICAgICAgICAgICAgICAvLyBmb3IgaW5uZXIgY29tcG9uZW50cyBpbnNpZGUgcmVmIGNvbXBvbmVudCA6XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5uZXN0ZWRSZWZzLmZvckVhY2gobmVzdGVkUmVmQ29uZmlnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHMhLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpIS50eXBlO1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IG5lc3RlZENvbXBvbmVudERlZmluaXRpb24gPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zPy5maW5kKGRlZiA9PiBkZWYuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpITtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgcmVmQ29uZmlnID0gY29tcG9uZW50Q29uZmlnLnR5cGUucmVmcy5maW5kKHIgPT4gci5uYW1lID09PSBuZXN0ZWRSZWZDb25maWcucmVmTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmICghcmVmQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIHJlZkNvbmZpZyBmb3VuZCBmb3IgbmVzdGVkIHJlZicpO1xuICAgICAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBuZXcgTXlvcFJlZkNvbXBvbmVudChuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uLCByZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICBuZXN0ZWRDb21wb25lbnQuc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5yZWZzW25lc3RlZFJlZkNvbmZpZy5yZWZOYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKG5lc3RlZENvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RSZWZzKHJlZkNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOnVzZSBjb25maWcgY2hlY2sgZm9yIGF1dG8taGlnaHQgYW5kIGNvbnZlcnQgdHlwZSBwcm9wZXJseVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZWZDb21wb25lbnQgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdyBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0UmVmcyA9IGFzeW5jIChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10sIHdpdGhvdXRSZWZDb21wb25lbnRzOiBib29sZWFuID0gZmFsc2UpID0+IHtcblxuICAgIGlmICghY29tcG9uZW50LnJlZnMpXG4gICAgICAgIGNvbXBvbmVudC5yZWZzID0ge307XG5cbiAgICBjb25zdCB3YWl0Rm9yID0gT2JqZWN0LnZhbHVlcyhjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZWZzKS5tYXAocmVmID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWYuYmVoYXZpb3IudHlwZSA9PSBSZWZCZWhhdmlvclR5cGUuY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID1cblxuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0UmVmQ29tcG9uZW50cykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hhbmdlIHRvIGdldCBpdCBmcm9tIHRoZSBmbG93XG4gICAgICAgICAgICAgICAgbGV0IHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmNvbXBvbmVudElkO1xuICAgICAgICAgICAgICAgIGlmICghcmVmQ29tcG9uZW50SWQpXG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmluc3RhbmNlLmNvbXBvbmVudElkXG5cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVqZWN0KG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgLy90aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMhLmZpbmQoY29tcGRlZiA9PiBjb21wZGVmLmlkID09PSByZWZDb21wb25lbnRJZCkhO1xuICAgICAgICAgICAgICAgIC8vIC8vY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGF3YWl0IGdldENvbXBvbmVudERlZmluaXRpb25Db25maWcoY29tcG9uZW50SW5zdGFuY2VDb25maWcuY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJlamVjdChuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE86IGlmIHdlIGhhdmUgdGhlIHNhbWUgY29tcG9uZW50IG1vcmUgdGhhbiBvbmNlIHdlIHdpbGwgbmVlZCBpbnN0YW5jZSBpZCBoZXJlIC4uLlxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudENvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHM/LmZpbmQobmVzdGVkQ29tcG9uZW50ID0+IG5lc3RlZENvbXBvbmVudC50eXBlLmlkID09PSByZWZDb21wb25lbnRJZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIW5lc3RlZENvbXBvbmVudENvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IG5lc3RlZENvbXBvbmVudENvbmZpZyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9jb25zdCBjb21wb25lbnRJbnN0YW5jZUNvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5uZXN0ZWRDb21wb25lbnRzPy5maW5kKGNvbXBvbmVudEluc3RhY2UgPT4gY29tcG9uZW50SW5zdGFjZS5jb21wb25lbnRJZCA9PT0gY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5pZCk7XG4gICAgICAgICAgICAgICAgLy8gaWYoIWNvbXBvbmVudERlZmluaXRpb25Db25maWcpe1xuICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE8gVE9ETyBUT0RPICcpO1xuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDp0aGluayBhYm91dCB0aGF0IDpcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudERlZmluaXRpb25Db25maWcucmVzb2x2ZWREZWZpbml0aW9ucyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnM7XG4gICAgICAgICAgICAgICAgLy8gICBjb25zdCBuZXN0ZWRDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgaW5zdGFuY2U6IG5lc3RlZENvbXBvbmVudENvbmZpZy5pbnN0YW5jZSEsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgdHlwZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLnR5cGUsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgbmFtZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLm5hbWVcbiAgICAgICAgICAgICAgICAvLyAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IF9yZWYgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCduZXN0ZWQgISEgY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBhd2FpdCBjcmVhdGVSZWZDb21wb25lbnQoX3JlZiwgbmVzdGVkQ29tcG9uZW50Q29uZmlnISwgY29tcG9uZW50cylcbiAgICAgICAgICAgICAgICAgICAgLy9URE9PIDogcHV0IHRoYXQgcmVmIGNvbXBvbmVudCBzb21ld2hlcmU/XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBfX25vblByb3hpZWQgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IGNyZWF0ZVJlZlByb3h5KF9fbm9uUHJveGllZCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgnPycpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH0pXG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdEZvcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgIHRocm93IGU7XG4gICAgfVxuXG59XG5cbmV4cG9ydCB0eXBlIHByb3BUeXBlczxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPiA9IHtcbiAgICBbUHJvcGVydHkgaW4ga2V5b2YgVF06XG4gICAgVFtQcm9wZXJ0eV0gZXh0ZW5kcyB7IG1vZGU6ICdpbnB1dCcgfSA/XG4gICAgICAgIFRbUHJvcGVydHldWyd0eXBlJ10gOlxuICAgICAgICBQcm9taXNlPFRbUHJvcGVydHldWyd0eXBlJ10+XG59XG5cbmV4cG9ydCBjb25zdCBleGVjID0gYXN5bmMgKGdldHRlcjogYW55KSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGdldHRlcigpXG59XG5cbmV4cG9ydCBjb25zdCBhY3RBcyA9IDxUPihyZWY6IFJlZikgPT4ge1xuICAgIHJldHVybiByZWYgYXMgdW5rbm93biBhcyBGdW5jdGlvbmlmeVJlZjxUPlxufVxuXG5leHBvcnQgdHlwZSBGdW5jdGlvbmlmeVJlZjxUID0gYW55PiA9IHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSIC8vIElmIGl0J3MgYSBmdW5jdGlvblxuICAgICAgICA/ICguLi5hcmdzOiBBKSA9PiBQcm9taXNlPFI+IC8vIENvbnZlcnQgaXQgdG8gYSBwcm9taXNlZCBmdW5jdGlvblxuICAgICAgICA6IFRbS11cbn07XG4iLCAiaW1wb3J0IHtBdXRvU2l6ZU9wdGlvbnMsIEJhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCxcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgTWVzc2FnZURpcmVjdGlvblxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzLnRzXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wSWZyYW1lQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgcHJpdmF0ZSBfYXV0b1NpemVDbGVhbnVwPzogQ2xlYW51cEhhbmRsZXI7XG4gICAgcHJpdmF0ZSBfYXV0b1NpemVPcHRpb25zPzogQXV0b1NpemVPcHRpb25zO1xuICAgIHByaXZhdGUgX2F1dG9TaXplVXBkYXRlPzogKCkgPT4gdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnRDb25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHByaXZhdGUgSWZyYW1lRWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudENvbmZpZywgY29udGFpbmVyLCBvcHRpb25zKVxuXG4gICAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMuSWZyYW1lRWxlbWVudDtcbiAgICAgICAgLy8gdGhpcy5JZnJhbWVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAvLyAgICAgaWYgKHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QpXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdChgSWZyYW1lRWxlbWVudCBlcnJvcmApO1xuICAgICAgICAvLyB9KTtcbiAgICB9XG5cbiAgICBzaXplTWV0YT86IHsgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7IGhlaWdodD86IHN0cmluZyB8IG51bWJlcjsgbWluV2lkdGg/OiBudW1iZXI7IG1heFdpZHRoPzogbnVtYmVyOyBtaW5IZWlnaHQ/OiBudW1iZXI7IG1heEhlaWdodD86IG51bWJlciB9IHwgbnVsbDtcblxuICAgIGNsZWFudXBJbnNwZWN0PzogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvLyBUT0RPIDogdXNlIGJldHRlciBjaGVjayBmb3IgaW5zcGVjdCBtb2RlXG4gICAgICAgIGlmICh0aGlzLmNsZWFudXBJbnNwZWN0KSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdpbnNwZWN0IGNhbGwgbW9yZSB0aGFuIG9uY2UnKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BJZnJhbWVDb21wb25lbnQnLCAxMCwgdGhpcy5jb250YWluZXIsIHRoaXMuSWZyYW1lRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QhKCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYWxsJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnR9cHhgO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIG9ic2VydmVTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7c2VuZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBzZW5kKHtoZWlnaHQsIHdpZHRofSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0LCB3aWR0aH1cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmV0LmNvbnRlbnQud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50LmhlaWdodH1weGA7XG4gICAgICAgIH0pKTtcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT2JzZXJ2ZXMgdGhlIGlmcmFtZSBjb250ZW50IHNpemUgYW5kIGF1dG9tYXRpY2FsbHkgc3luY3MgaXQgdG8gdGhlIGlmcmFtZSBlbGVtZW50LlxuICAgICAqIFVzZXMgZGlyZWN0IGNvbnRlbnREb2N1bWVudCBhY2Nlc3MgKHNhbWUtb3JpZ2luIG9ubHkpIGZvciBhY2N1cmF0ZSBtZWFzdXJlbWVudHMuXG4gICAgICpcbiAgICAgKiBSZWVudHJhbnQ6IHdoZW4gY2FsbGVkIGFnYWluIHdoaWxlIG9ic2VydmVycyBhbHJlYWR5IGV4aXN0LCB1cGRhdGVzIG9wdGlvbnMgYW5kXG4gICAgICogcmUtZXZhbHVhdGVzIHNpemluZyB3aXRob3V0IHJlY3JlYXRpbmcgb2JzZXJ2ZXJzLiBDbGVhbnVwICsgcmUtY2FsbCAoZS5nLiBSZWFjdFxuICAgICAqIHJlLXJlbmRlcikgY3JlYXRlcyBmcmVzaCBvYnNlcnZlcnMgc2luY2UgY2xlYW51cCBjbGVhcnMgdGhlIGV4aXN0aW5nIG9uZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgc2l6ZSBjaGFuZ2UgY2FsbGJhY2sgYW5kIG1pbi9tYXggY29uc3RyYWludHNcbiAgICAgKiBAcmV0dXJucyBDbGVhbnVwIGZ1bmN0aW9uIHRvIHN0b3Agb2JzZXJ2aW5nXG4gICAgICovXG4gICAgb2JzZXJ2ZUF1dG9TaXplID0gKG9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnMpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIC8vIFN0b3JlIG9wdGlvbnMgc28gdXBkYXRlU2l6ZSBhbHdheXMgcmVhZHMgdGhlIGxhdGVzdFxuICAgICAgICB0aGlzLl9hdXRvU2l6ZU9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICAgIC8vIElmIG9ic2VydmVycyBhbHJlYWR5IGV4aXN0LCByZS1ldmFsdWF0ZSB3aXRoIG5ldyBvcHRpb25zIGFuZCByZXVzZSB0aGVtXG4gICAgICAgIGlmICh0aGlzLl9hdXRvU2l6ZUNsZWFudXAgJiYgdGhpcy5fYXV0b1NpemVVcGRhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplVXBkYXRlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXV0b1NpemVDbGVhbnVwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWZyYW1lID0gdGhpcy5JZnJhbWVFbGVtZW50O1xuICAgICAgICBjb25zdCBkb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50O1xuXG4gICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tNeW9wSWZyYW1lQ29tcG9uZW50XSBDYW5ub3Qgb2JzZXJ2ZSBhdXRvIHNpemU6IGNvbnRlbnREb2N1bWVudCBub3QgYWNjZXNzaWJsZScpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhbXAgPSAodmFsdWU6IG51bWJlciwgbWluPzogbnVtYmVyLCBtYXg/OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgICAgICAgICAgaWYgKG1pbiAhPT0gdW5kZWZpbmVkICYmIHZhbHVlIDwgbWluKSByZXR1cm4gbWluO1xuICAgICAgICAgICAgaWYgKG1heCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlID4gbWF4KSByZXR1cm4gbWF4O1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFBhcnNlIENTUyBzaXplIHZhbHVlcyB0byBudW1iZXJzXG4gICAgICAgIGNvbnN0IHBhcnNlU2l6ZSA9ICh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gaXNOYU4ocGFyc2VkKSA/IHVuZGVmaW5lZCA6IHBhcnNlZDtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB1cGRhdGVTaXplID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XG4gICAgICAgICAgICBpZiAoIWNvbnRlbnREb2MpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMuX2F1dG9TaXplT3B0aW9ucztcblxuICAgICAgICAgICAgY29uc3QgbWluV2lkdGggPSBwYXJzZVNpemUob3B0cz8ubWluV2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgbWF4V2lkdGggPSBwYXJzZVNpemUob3B0cz8ubWF4V2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgbWluSGVpZ2h0ID0gcGFyc2VTaXplKG9wdHM/Lm1pbkhlaWdodCk7XG4gICAgICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSBwYXJzZVNpemUob3B0cz8ubWF4SGVpZ2h0KTtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlck1pbkhlaWdodCA9IG9wdHM/LmxvYWRlck1pbkhlaWdodCA/PyA1MDtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSBleHBsaWNpdCBkaW1lbnNpb25zOiBob3N0IG9wdGlvbnMgXHUyMTkyIHNpemVNZXRhIGZpbGwgbW9kZSBcdTIxOTIgd2lkdGggZGVmYXVsdHMgdG8gXCIxMDAlXCJcbiAgICAgICAgICAgIC8vIFdpZHRoIGRlZmF1bHRzIHRvIFwiMTAwJVwiIChibG9jayBlbGVtZW50IGJlaGF2aW9yKSB0byBwcmV2ZW50IHRoZSBzaHJpbmstdG8tMCBtZWFzdXJlbWVudCBidWcuXG4gICAgICAgICAgICAvLyBIZWlnaHQgaGFzIG5vIGRlZmF1bHQgc28gaXQgYXV0by1zaXplcyB0byBjb250ZW50LlxuICAgICAgICAgICAgLy8gT25seSBzaXplTWV0YSBcIjEwMCVcIiAoZmlsbCBtb2RlKSBpcyB0cmVhdGVkIGFzIGV4cGxpY2l0IGFuZCBkaXNhYmxlcyBhdXRvLXNpemluZy5cbiAgICAgICAgICAgIC8vIFBpeGVsIHNpemVNZXRhIHZhbHVlcyAoZS5nLiwgaGVpZ2h0OiAyMDApIGFyZSBpbml0aWFsIGhpbnRzLCBOT1QgZXhwbGljaXQgY29uc3RyYWludHMuXG4gICAgICAgICAgICBjb25zdCBzaXplTWV0YUZpbGxXaWR0aCA9IHRoaXMuc2l6ZU1ldGE/LndpZHRoID09PSBcIjEwMCVcIiA/IFwiMTAwJVwiIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3Qgc2l6ZU1ldGFGaWxsSGVpZ2h0ID0gdGhpcy5zaXplTWV0YT8uaGVpZ2h0ID09PSBcIjEwMCVcIiA/IFwiMTAwJVwiIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRFeHBsaWNpdFdpZHRoID0gb3B0cz8uZXhwbGljaXRXaWR0aCA/PyBzaXplTWV0YUZpbGxXaWR0aCA/PyBcIjEwMCVcIjtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRXhwbGljaXRIZWlnaHQgPSBvcHRzPy5leHBsaWNpdEhlaWdodCA/PyBzaXplTWV0YUZpbGxIZWlnaHQ7XG4gICAgICAgICAgICBjb25zdCBoYXNFeHBsaWNpdFdpZHRoID0gcmVzb2x2ZWRFeHBsaWNpdFdpZHRoICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBoYXNFeHBsaWNpdEhlaWdodCA9IHJlc29sdmVkRXhwbGljaXRIZWlnaHQgIT09IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgLy8gRGV0ZWN0IGNvbGxhcHNlZCBkaW1lbnNpb25zIGZyb20gY29udGFpbmVyICh0aGlzLmNvbnRhaW5lcilcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbGxhcHNlZFdpZHRoID0gY29udGFpbmVyUmVjdC53aWR0aCA9PT0gMDtcbiAgICAgICAgICAgIC8vIENvbnNpZGVyIGNvbGxhcHNlZCBpZiBoZWlnaHQgaXMgMCBPUiBlcXVhbHMgdGhlIGxvYWRlciBtaW5IZWlnaHRcbiAgICAgICAgICAgIGNvbnN0IGNvbGxhcHNlZEhlaWdodCA9IGNvbnRhaW5lclJlY3QuaGVpZ2h0ID09PSAwIHx8IGNvbnRhaW5lclJlY3QuaGVpZ2h0ID09PSBsb2FkZXJNaW5IZWlnaHQ7XG5cbiAgICAgICAgICAgIC8vIERldGVybWluZSB3aGljaCBkaW1lbnNpb25zIHRvIGF1dG8tc2l6ZTpcbiAgICAgICAgICAgIC8vIC0gSWYgZm9yY2VBdXRvU2l6ZSBpcyB0cnVlLCBhdXRvLXNpemUgdW5sZXNzIGV4cGxpY2l0IGRpbWVuc2lvbiBpcyBzZXRcbiAgICAgICAgICAgIC8vIC0gT3RoZXJ3aXNlLCBhdXRvLXNpemUgb25seSBpZiBjb2xsYXBzZWRcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZEF1dG9XaWR0aCA9IG9wdHM/LmZvcmNlQXV0b1NpemVcbiAgICAgICAgICAgICAgICA/ICFoYXNFeHBsaWNpdFdpZHRoXG4gICAgICAgICAgICAgICAgOiAoY29sbGFwc2VkV2lkdGggJiYgIWhhc0V4cGxpY2l0V2lkdGgpO1xuICAgICAgICAgICAgY29uc3Qgc2hvdWxkQXV0b0hlaWdodCA9IG9wdHM/LmZvcmNlQXV0b1NpemVcbiAgICAgICAgICAgICAgICA/ICFoYXNFeHBsaWNpdEhlaWdodFxuICAgICAgICAgICAgICAgIDogKGNvbGxhcHNlZEhlaWdodCAmJiAhaGFzRXhwbGljaXRIZWlnaHQpO1xuXG4gICAgICAgICAgICAvLyBJZiBub3RoaW5nIG5lZWRzIGF1dG8tc2l6aW5nLCBhcHBseSBleHBsaWNpdC9wZXJjZW50YWdlIGRpbWVuc2lvbnNcbiAgICAgICAgICAgIGlmICghc2hvdWxkQXV0b1dpZHRoICYmICFzaG91bGRBdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gdHlwZW9mIHJlc29sdmVkRXhwbGljaXRXaWR0aCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0V2lkdGh9cHhgIDogJzEwMCUnO1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0SGVpZ2h0fXB4YCA6ICcxMDAlJztcblxuICAgICAgICAgICAgICAgIGNvbnN0IGV4cGxpY2l0V2lkdGhQeCA9IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0V2lkdGggPT09ICdudW1iZXInID8gcmVzb2x2ZWRFeHBsaWNpdFdpZHRoIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cGxpY2l0SGVpZ2h0UHggPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA9PT0gJ251bWJlcicgPyByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0IDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmIChleHBsaWNpdFdpZHRoUHggIT09IHVuZGVmaW5lZCB8fCBleHBsaWNpdEhlaWdodFB4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0cz8ub25TaXplQ2hhbmdlPy4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGV4cGxpY2l0V2lkdGhQeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogZXhwbGljaXRIZWlnaHRQeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9TaXppbmdXaWR0aDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvU2l6aW5nSGVpZ2h0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVGVtcG9yYXJpbHkgc2hyaW5rIGlmcmFtZSBiZWZvcmUgbWVhc3VyaW5nIHNvIHNjcm9sbEhlaWdodFxuICAgICAgICAgICAgLy8gcmVwb3J0cyBhY3R1YWwgY29udGVudCBzaXplLCBub3QgdGhlIGN1cnJlbnQgaWZyYW1lIHNpemUuXG4gICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMsIHNjcm9sbEhlaWdodCBjYW4gbmV2ZXIgZGVjcmVhc2UgYmVsb3cgaWZyYW1lIGhlaWdodC5cbiAgICAgICAgICAgIGlmIChzaG91bGRBdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9ICcwcHgnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNob3VsZEF1dG9XaWR0aCkge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS53aWR0aCA9ICcwcHgnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGFrZSB0aGUgbWF4IG9mIGRvY3VtZW50RWxlbWVudCBhbmQgYm9keSB0byBhdm9pZCAxcHggdW5kZXJjb3VudFxuICAgICAgICAgICAgLy8gKGJvZHkgY2FuIHJlcG9ydCAxcHggdGFsbGVyIHRoYW4gZG9jdW1lbnRFbGVtZW50IGluIHNvbWUgbGF5b3V0cylcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LnNjcm9sbFdpZHRoKSk7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50SGVpZ2h0ID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LnNjcm9sbEhlaWdodCkpO1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBjbGFtcChjb250ZW50V2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSBjbGFtcChjb250ZW50SGVpZ2h0LCBtaW5IZWlnaHQsIG1heEhlaWdodCk7XG5cbiAgICAgICAgICAgIC8vIFNldCBhdXRvLXNpemVkIGRpbWVuc2lvbnMgdG8gbWVhc3VyZWQgdmFsdWVzLCBub24tYXV0byB0byBleHBsaWNpdC8xMDAlXG4gICAgICAgICAgICBpZiAoc2hvdWxkQXV0b1dpZHRoKSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUud2lkdGggPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdFdpZHRoID09PSAnbnVtYmVyJyA/IGAke3Jlc29sdmVkRXhwbGljaXRXaWR0aH1weGAgOiAnMTAwJSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2hvdWxkQXV0b0hlaWdodCkge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gdHlwZW9mIHJlc29sdmVkRXhwbGljaXRIZWlnaHQgPT09ICdudW1iZXInID8gYCR7cmVzb2x2ZWRFeHBsaWNpdEhlaWdodH1weGAgOiAnMTAwJSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERvbid0IGZvcmNlIG92ZXJmbG93IFx1MjAxNCBsZXQgdGhlIGNvbXBvbmVudC9wYXJlbnQgY29udHJvbCBzY3JvbGxpbmcuXG4gICAgICAgICAgICAvLyBPbmx5IHNldCBvdmVyZmxvdzogYXV0byB3aGVuIGNvbnRlbnQgZXhjZWVkcyBtYXggY29uc3RyYWludHMuXG4gICAgICAgICAgICBjb25zdCBpc1dpZHRoQ29uc3RyYWluZWQgPSBzaG91bGRBdXRvV2lkdGggJiYgbWF4V2lkdGggIT09IHVuZGVmaW5lZCAmJiBjb250ZW50V2lkdGggPiBtYXhXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGlzSGVpZ2h0Q29uc3RyYWluZWQgPSBzaG91bGRBdXRvSGVpZ2h0ICYmIG1heEhlaWdodCAhPT0gdW5kZWZpbmVkICYmIGNvbnRlbnRIZWlnaHQgPiBtYXhIZWlnaHQ7XG4gICAgICAgICAgICBjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvd1ggPSBpc1dpZHRoQ29uc3RyYWluZWQgPyAnYXV0bycgOiAnJztcbiAgICAgICAgICAgIGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IGlzSGVpZ2h0Q29uc3RyYWluZWQgPyAnYXV0bycgOiAnJztcblxuICAgICAgICAgICAgb3B0cz8ub25TaXplQ2hhbmdlPy4oe1xuICAgICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgICAgICBhdXRvU2l6aW5nV2lkdGg6IHNob3VsZEF1dG9XaWR0aCxcbiAgICAgICAgICAgICAgICBhdXRvU2l6aW5nSGVpZ2h0OiBzaG91bGRBdXRvSGVpZ2h0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBJbml0aWFsIHNpemVcbiAgICAgICAgdXBkYXRlU2l6ZSgpO1xuXG4gICAgICAgIC8vIFN0b3JlIHVwZGF0ZVNpemUgZm9yIHJlZW50cmFudCBjYWxsc1xuICAgICAgICB0aGlzLl9hdXRvU2l6ZVVwZGF0ZSA9IHVwZGF0ZVNpemU7XG5cbiAgICAgICAgLy8gT2JzZXJ2ZSBmb3IgY2hhbmdlc1xuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcih1cGRhdGVTaXplKTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShkb2MuYm9keSk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZG9jLmRvY3VtZW50RWxlbWVudCk7XG5cbiAgICAgICAgLy8gTXV0YXRpb25PYnNlcnZlciBjYXRjaGVzIERPTSBjb250ZW50IGNoYW5nZXMgKGUuZy4gcmVtb3ZpbmcgbGlzdCBpdGVtcywgdG9nZ2xpbmcgdmlld3MpXG4gICAgICAgIC8vIHRoYXQgZG9uJ3QgdHJpZ2dlciBSZXNpemVPYnNlcnZlciBiZWNhdXNlIHRoZSBib2R5IGJveC1zaXplIHN0YXlzIHRoZSBzYW1lXG4gICAgICAgIC8vIChib2R5IGZpbGxzIGlmcmFtZSwgaWZyYW1lIGhhc24ndCBzaHJ1bmsgeWV0KS5cbiAgICAgICAgLy8gYGF0dHJpYnV0ZXM6IHRydWVgIGNhdGNoZXMgQ1NTIGNsYXNzL3N0eWxlIGNoYW5nZXMgKGUuZy4gZGlzcGxheTpub25lIHRvZ2dsaW5nIHZpZXdzKS5cbiAgICAgICAgY29uc3QgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHVwZGF0ZVNpemUpO1xuICAgICAgICBtdXRhdGlvbk9ic2VydmVyLm9ic2VydmUoZG9jLmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlLCBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuXG4gICAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICBtdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplVXBkYXRlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVDbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAgPSBjbGVhbnVwO1xuICAgICAgICByZXR1cm4gY2xlYW51cDtcbiAgICB9XG5cbiAgICBzZXRTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0LCB3aWR0aH1cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmV0LmNvbnRlbnQud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50LmhlaWdodH1weGA7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vIHJldHVybiB3aW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgKyAncHgnO1xuXG5cbiAgICAgICAgICAgIC8vVE9ETzogZml4IHRoYXQgaGFjaywga2VlcCB0aGUgZnVuY3Rpb24gaW4gcmlnaHQgZm9ybWF0IHdoaWxlIG1pbmlmaWVkIDooXG4gICAgICAgICAgICBjb25zdCBub09wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRvIGVuc3VyZSBpdCdzIG5vdCBvcHRpbWl6ZWQgYXdheSwgeW91IGNhbiBjYWxsIGl0IGF0IGxlYXN0IG9uY2VcbiAgICAgICAgICAgIGxldCB4ID0gbm9PcCgpO1xuICAgICAgICAgICAgeCsrO1xuICAgICAgICAgICAgeC0tO1xuXG4gICAgICAgICAgICAvL3JldHVybiBgJHt3aW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHR9cHhgO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBjaGVjayB0aGF0ICsxID9cbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpXG4gICAgICAgICAgICAgICAgLCB3aW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQpICsgeCArICdweCdcblxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gcmV0LmNvbnRlbnQ7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlXyA9IHsuLi5tZXNzYWdlfSBhcyBCYXNlTXlvcE1lc3NhZ2U7XG4gICAgICAgIC8vVE9ETyA6ID8hPyEgc2hvdWxkIGl0IGJlIGhlcmUgP1xuICAgICAgICBpZiAobWVzc2FnZV8ubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FeGVjdXRlQ29tcG9uZW50TWV0aG9kKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZV8gYXMgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZClcbiAgICAgICAgICAgIHRoaXNbdHlwZWRNZXNzYWdlLm1ldGhvZF0oKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrIDooXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9jb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgbWVzc2FnZV8uZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi5kb3duO1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZV8pO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQ/LmNvbnRlbnRXaW5kb3c/LnBvc3RNZXNzYWdlKG1lc3NhZ2VfLCAnKicpO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9tZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH07XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbi5NdXRhdGlvbk9ic2VydmVyTWVzc2FnZVxuICAgICAgICAgICAgfHwgaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluLlJlc2l6ZU9ic2VydmVyTWVzc2FnZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgICAgICAvL3RoaXMuc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIub25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2F1dG9TaXplQ2xlYW51cCkge1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVDbGVhbnVwKCk7XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2xlYW51cEluc3BlY3QpXG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0KCk7XG5cbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQucGFyZW50Tm9kZSEucmVtb3ZlQ2hpbGQodGhpcy5JZnJhbWVFbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnLCBTa2luTG9hZGVyVHlwZX0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wTG9hZGVyIHtcbiAgICB0eXBlOiBTa2luTG9hZGVyVHlwZTtcbiAgICBsb2FkOiAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4gUHJvbWlzZTxJTXlvcENvbXBvbmVudD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcExvYWRlciBpbXBsZW1lbnRzIElNeW9wTG9hZGVyIHtcbiAgICBhYnN0cmFjdCB0eXBlOiBTa2luTG9hZGVyVHlwZTtcbiAgICBhYnN0cmFjdCBsb2FkOiAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4gUHJvbWlzZTxJTXlvcENvbXBvbmVudD47XG5cbiAgICBhcHBlbmRDaGlsZCA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBlbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMsKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5yZWxhdGl2ZSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVsYXRpdmUuZGlyZWN0aW9uID09PSAnYmVmb3JlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG9wdGlvbnMucmVsYXRpdmUuY2hpbGQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZS5kaXJlY3Rpb24gPT09ICdhZnRlcicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IG9wdGlvbnMucmVsYXRpdmUuY2hpbGQ/Lm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG5leHRTaWJsaW5nID8gbmV4dFNpYmxpbmcgOiBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wSWZyYW1lQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSUlmcmFtZUxvYWRlckNvbmZpZywgSVNraW5Db25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IGFkZFF1ZXJ5UGFyYW0gPSAodXJsOiBzdHJpbmcsIHBhcmFtOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAvLyBDcmVhdGUgYSBVUkwgb2JqZWN0XG4gICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuXG4gICAgLy8gQWRkIHRoZSBxdWVyeSBwYXJhbWV0ZXJcbiAgICB1cmxPYmouc2VhcmNoUGFyYW1zLmFwcGVuZChwYXJhbSwgdmFsdWUpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSB1cGRhdGVkIFVSTFxuICAgIHJldHVybiB1cmxPYmoudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGNsYXNzIE15b3BJZnJhbWVMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLklmcmFtZUxvYWRlclxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuICAgICAgICBsZXQgSWZyYW1lRWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICAgY29uc3QgdHlwZWRMb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKGNvbnRhaW5lcj8ubm9kZU5hbWUgPT09IFwiSUZSQU1FXCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCduZWVkcyB0byBsb2FkIGludG8gYW4gZXhzaXN0aW5nIElmcmFtZS4uLicsIHR5cGVkTG9hZGVyQ29uZmlnLnVybCwgY29udGFpbmVyKTtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IChjb250YWluZXIgYXMgSFRNTElGcmFtZUVsZW1lbnQpXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNyYyA9IHR5cGVkTG9hZGVyQ29uZmlnLnVybFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgICAgIC8vIFNldCBhbGwgc3R5bGVzIEJFRk9SRSBhcHBlbmRpbmcgdG8gcHJldmVudCBmbGFzaCBhdCB3cm9uZyBwb3NpdGlvblxuICAgICAgICAgICAgY29uc3QgaWZyYW1lU3R5bGVzID0gYFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgICAgICBpbnNldDogMDtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICR7dHlwZWRMb2FkZXJDb25maWcuYXV0b0hlaWdodCB8fCAhdHlwZWRMb2FkZXJDb25maWcuaGVpZ2h0ID8gJzEwMCUnIDogdHlwZWRMb2FkZXJDb25maWcuaGVpZ2h0fTtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAke29wdGlvbnM/LmhpZGRlbiA/ICcwJyA6ICcxJ307XG4gICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6ICR7b3B0aW9ucz8uaGlkZGVuID8gJ25vbmUnIDogJ2FsbCd9O1xuICAgICAgICAgICAgYDtcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IGlmcmFtZVN0eWxlcztcblxuICAgICAgICAgICAgLy8gU2V0IGVsZW1lbnQgYXR0cmlidXRlcyBpZiBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmVsZW1lbnRBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5lbGVtZW50QXR0cmlidXRlcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGhhbmRsZSBpc3N1ZSB0byBsb2FkIGlmcmFtZSBpbnNpZGUgYW4gaWZyYW1lIHdpdGggdGhlIHNhbWUgdXJsXG4gICAgICAgICAgICBsZXQgdXJsMmxvYWQgPSAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZykudXJsO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Ll9oYXNQYXJlbnQpXG4gICAgICAgICAgICAgICAgdXJsMmxvYWQgPSBhZGRRdWVyeVBhcmFtKHVybDJsb2FkLCBcIl9teW9wLWNvbXBcIiwgdW5pcUlkKTtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zcmMgPSB1cmwybG9hZDtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICAgICAgLy8gICBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZG9tSWQpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICAgICAgLy9OTyA6IElmcmFtZUVsZW1lbnQgPSBjb250YWluZXIubGFzdEVsZW1lbnRDaGlsZCBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcFdlYmNvbXBvbmVudENvbnN0cyA9IHtcbiAgICB3ZWJjb21wb25lbnRfbWVzc2FnZV9rZXk6ICdteW9wX3dlYmNvbXBvbmVudF9tZXNzYWdlJ1xufVxuIiwgImltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4uLy4uL3dlYmNvbXBvbmVudC9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BXZWJDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcml2YXRlIGN1c3RvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBjb250YWluZXIgLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gY3VzdG9tRWxlbWVudDtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdDogQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgfVxuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BXZWJDb21wb25lbnQnLCAwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5jdXN0b21FbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdDtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJyc7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2U8YW55PikgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZV8gPSB7Li4ubWVzc2FnZX0gYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgIC8vVE9ETyA6IGNhbiBiZSBkb25lIHdpdGhvdXQgY2xvbmluZz9cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL2NvbnN0IGhhbmRsZXIgPSBtZXNzYWdlXy5oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlXyk7XG5cbiAgICAgICAgY29uc3QgbXNnID0gbmV3IEN1c3RvbUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4obXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRldGFpbDogbWVzc2FnZV8sXG4gICAgICAgICAgICAvLyBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgLy8gY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAvLyBjb21wb3NlZDogdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vdGhpcy5jb250YWluZXIuZGlzcGF0Y2hFdmVudChtc2cpXG5cbiAgICAgICAgLy9zZW5kaW5nIGRhdGEgZnJvbSBob3N0IHRvIHRoZSBjb21wb25lbnRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5kaXNwYXRjaEV2ZW50KG1zZylcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW5bMF0uZGlzcGF0Y2hFdmVudChtc2cpXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciB3aGlsZSB0cnlpbmcgdG8gZGlzcGF0Y2hFdmVudCcsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL21lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5jdXN0b21FbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjQsIHdhaXR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWcsIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IHNlZW46IFJlY29yZDxzdHJpbmcsIFByb21pc2U8dm9pZD4+ID0ge307XG5cbmV4cG9ydCBjbGFzcyBXZWJjb21wb25lbnRMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG5cbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuV2ViQ29tcG9uZW50TG9hZGVyXG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKCFzZWVuW2xvYWRlckNvbmZpZy51cmxdKSB7XG4gICAgICAgICAgICAvLyBhd2FpdCBpbXBvcnQoIC8qIEB2aXRlLWlnbm9yZSAqLyB3ZWJDb21wb25lbnRMb2FkVXJsKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdtb2R1bGUgbG9hZGVkJyk7XG4gICAgICAgICAgICBzZWVuW2xvYWRlckNvbmZpZy51cmxdID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlYkNvbXBvbmVudExvYWRVcmwgPSBsb2FkZXJDb25maWcudXJsXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSAnbW9kdWxlJztcbiAgICAgICAgICAgICAgICBzY3JpcHQuc3JjID0gd2ViQ29tcG9uZW50TG9hZFVybDtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZHVsZSBhbHJlZGF5IGxvYWRlZCBvciBpbiBsb2FkaW5nIHByb2Nlc3MnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHNlZW5bbG9hZGVyQ29uZmlnLnVybF07XG5cbiAgICAgICAgLy9UT0RPIDogYWRkIHJldHJ5IG1lY2hhbmlzbSBpbiBmYWlsIGNhc2UuXG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjaywgc2hvdWxkIGZpeCB0aGUgcmFjZSBjb25kaXRpb24gZm9yIGxvYWRlZCBtb2R1bGVzXG4gICAgICAgIGF3YWl0IHdhaXQoMSk7XG5cbiAgICAgICAgbGV0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWBcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobG9hZGVyQ29uZmlnLnRhZyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZihvcHRpb25zPy5fZW52aXJvbm1lbnQpe1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWxlbWVudC5fbXlvcEVudmlyb25tZW50ID0gb3B0aW9ucz8uX2Vudmlyb25tZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2xvYWRlckNvbmZpZy50YWd9IC8+YDtcbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxuXG59XG4iLCAiaW1wb3J0IHtCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyLCBIb3N0ZWRDb21wb25lbnR9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4gdm9pZFxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlcjxULCBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ8U2hhZG93Um9vdFJlZj4+PiB7XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlVG9Ib3N0OiBhbnksIHB1YmxpYyBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ8U2hhZG93Um9vdFJlZj4+KSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2VUb0hvc3QpO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGlubmVyRXhlY3V0b3I6IChldmVudDogVCwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4gdm9pZDtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBUKSA9PiB7XG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGlmIChldmVudC5kZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBldmVudC5kZXN0aW5hdGlvbjtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHRbZGVzdGluYXRpb25dLmNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIHBhdGNoIHRoZSBzb3VyY2UgaWQsIHRoaW5rIGFib3V0IHRoYXQgP1xuICAgICAgICAgICAgICAgIGNvbnN0IF9tZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGV2ZW50LmRlc3RpbmF0aW9uID8gZXZlbnQuZGVzdGluYXRpb24gOiBldmVudC5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogZXZlbnQuc291cmNlID8gZXZlbnQuc291cmNlIDogZXZlbnQuZGVzdGluYXRpb25cbiAgICAgICAgICAgICAgICAgICAgfSBhcyBCYXNlTXlvcE1lc3NhZ2UsIHJlcGxheVRvKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlubmVyRXhlY3V0b3IoZXZlbnQsIHRoaXMuY29udGV4dFtkZXN0aW5hdGlvbl0uY29udGV4dCwgX21lc3NhZ2VUb0hvc3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBteW9wQXR0cmlidXRlcyA9IHtcbiAgICBpZDogJ215b3AtaWQnXG59XG4iLCAiaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0cy50c1wiO1xuaW1wb3J0IHtSZWZ9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudHNCeVJlZiA9IChyZWY6IFJlZiwgZWw6IFBhcmVudE5vZGUpID0+IHtcbiAgICByZXR1cm4gZWwucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke3JlZi5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEZpcnN0RWxlbWVudEJ5UmVmID0gKHJlZjogUmVmLCBlbDogUGFyZW50Tm9kZSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZ2V0RWxlbWVudHNCeVJlZihyZWYsIGVsKTtcbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50cy5pdGVtKDApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0JpbmRDbGlja01lc3NhZ2UsIENsaWNrUmVwbGF5TWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQmluZE9uQ2xpY2tIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEJpbmRDbGlja01lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkJpbmRDbGlja01lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBCaW5kQ2xpY2tNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdClcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IENsaWNrUmVwbGF5TWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge015b3BFbGVtZW50TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIENoYW5nZVRleHRIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPE15b3BFbGVtZW50TWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ2hhbmdlVGV4dE1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBNeW9wRWxlbWVudE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0udGV4dENvbnRlbnQgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIFNoYWRvd1Jvb3RSZWYgZXh0ZW5kcyBSb290UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHVibGljIHNoYWRvd1Jvb3Q6IFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgc3VwZXIoY29udGFpbmVyLCBzaGFkb3dSb290KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wRWxlbWVudFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSwgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxEZXRlY3RNeW9wUmVmc01lc3NhZ2U+IHtcbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBEZXRlY3RNeW9wUmVmc01lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcblxuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICBjb25zdCBhbGxNeW9wSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9XWApO1xuXG4gICAgICAgIGxldCBteW9wUmVmczogTXlvcEVsZW1lbnRSZWZbXSA9IFtdO1xuXG4gICAgICAgIGFsbE15b3BJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogdGFrZSB0aGF0IGJhY2sgdG8gdGhlIGRhc2hib2FyZD9cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coaXRlbSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGl0ZW0uZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcblxuICAgICAgICAgICAgaWYgKG15b3BJZCkge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3djIHJlY3QnLCAgaXRlbS5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKVxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBteW9wUmVmcy5wdXNoKG5ldyBNeW9wRWxlbWVudFJlZihteW9wSWQsIGl0ZW0udGFnTmFtZSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgaXRlbS5vZmZzZXRUb3AsIGl0ZW0ub2Zmc2V0TGVmdCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIG15b3BSZWZzKSlcbiAgICB9O1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRGV0ZWN0TXlvcFJlZnNNZXNzYWdlO1xuXG5cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0QXR0cmlidXRlTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIHNldEF0dHJpYnV0ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8U2V0QXR0cmlidXRlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0QXR0cmlidXRlTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IFNldEF0dHJpYnV0ZU1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKGV2ZW50Lm5hbWUsIGV2ZW50LnZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UsXG4gICAgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSxcbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBBZGRFdmVudExpc3RlbmVySGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxBZGRFdmVudExpc3RlbmVyTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gaW4gZmFjdCB3aGVuIHJ1bm5pbmcgaW4gV2ViQ29tcG9uZW50IHdlIGNhbiB0cmFuc2ZlciB0aGUgb3JpZ2luYWwgZVxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRseSB1c2luZyBtYWtlU2VyaWFsaXphYmxlIGZvciBuZXN0ZWQgY2FzZXMsIHRoaW5rIGFib3V0IHRoYXRcbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgIG1ha2VTZXJpYWxpemFibGUoZSwgZXZlbnQuc2VyaWFsaXphYmxlU2tlbGV0b24pKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQudHlwZSwgaGFuZGxlcik7XG5cbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQudHlwZSwgaGFuZGxlcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB0YXNrKCkpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0hvc3RTREt9IGZyb20gXCIuLi8uLi9ob3N0L2hvc3RTREtcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vaG9zdFwiO1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcblxuICAgICAgICBjb25zdCBjcmVhdGVSZWYgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvL2NvbnN0IGFsbEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7ZXZlbnQucmVmPy5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbiAgICAgICAgICAgIGNvbnN0IGFsbEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7ZXZlbnQucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG5cbiAgICAgICAgICAgIGlmIChhbGxJdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBob3N0U0RLID0gSG9zdFNESy5JbnN0YW5jZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBldmVudC5vcHRpb25zLmlkKSE7XG4gICAgICAgICAgICAgICAgaWYgKHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLy8vPj4+PlxuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyAgY29uc29sZS5sb2coYGZhaWxlZCB0byBmaW5kICR7ZXZlbnQub3B0aW9ucy5pZH0gaW4gbWVtIHNjb3BlYCwgaG9zdFNESyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vd2UgaGF2ZSB0aGUgcmVmIGNvbXBvbmVudCBpbiBvdXIgSG9zdFNESyAoc2FtZSBtZW1vcnkgd2hlbiB1c2luZyB3ZWJjb21wb25lbnQpXG4gICAgICAgICAgICAgICAgLy8gIHJlZkNvbXBvbmVudC5wYXJlbnQgPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAvL2RlbGV0ZSB0aGUgcmVmIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaG9zdFNESy5jb21wb25lbnRzLmluZGV4T2YocmVmQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3RTREsuY29tcG9uZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkIHJlbW92ZWQgdGVtcCByZWYgY29tcG9uZW50Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCB1c2luZyB0ZW1wIHJlZiBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCA9IGF3YWl0IGhvc3RTREsubG9hZENvbXBvbmVudChldmVudC5uZXN0ZWRDb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICAgIGFsbEl0ZW1zLml0ZW0oMCksXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Lm9wdGlvbnMpXG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBubyBuZWVkIHRoaXMsIHBhc3Mgb3B0aW9ucyBmcm9tIHBhcmVudFxuICAgICAgICAgICAgICAgIC8vaW1wbGVtZW50YXRpb25Db21wb25lbnQuaWQgPSBldmVudC5wcmVkZWZpbmVkSWQ7XG4gICAgICAgICAgICAgICAgLy9yZWZDb21wb25lbnQuaWQgKz0gJy4nO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogbm90IHJlYWxseSBuZWVkZWQgP1xuICAgICAgICAgICAgICAgIC8vIGF3YWl0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50LmluaXRpYXRlZCgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkUmVmQ29uZmlnOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoaW1wbGVtZW50YXRpb25Db21wb25lbnQucmVmcykuZm9yRWFjaChyZWZOYW1lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZiA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50LnJlZnNbcmVmTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIHJlZiA9IHJlZi5fX25vblByb3hpZWQgfHwgcmVmO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICgocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRSZWZDb25maWcucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uSWQ6IChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIG5lc3RlZFJlZkNvbmZpZykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciAtIERPTSBlbGVtZW50IG5vdCBmb3VuZCcpXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIFtdLCB0cnVlKSk7XG5cbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNyZWF0ZVJlZigpLnRoZW4oKVxuICAgICAgICAvL3JldHVybmluZyB1bmRlZmluZWQgc28gaXQgd29uJ3QgYWN0IGFzIGEgY2xlYW51cFxuICAgIH1cbn1cbiIsICJpbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIHJlcGxpZXI6IChkYXRhOiBhbnkpID0+IHZvaWQsIHJvb3RSZWY6IFJvb3RSZWYpID0+IHtcbiAgICBjb25zdCBfX3NjcmlwdElucHV0cyA9IGV2ZW50LnNjcmlwdElucHV0cyA/IGV2ZW50LnNjcmlwdElucHV0cyA6IHt9XG4gICAgX19zY3JpcHRJbnB1dHMubWFrZVNlcmlhbGl6YWJsZSA9IG1ha2VTZXJpYWxpemFibGU7XG5cbiAgICBfX3NjcmlwdElucHV0cy5zZW5kID0gcmVwbGllcjtcbiAgICBfX3NjcmlwdElucHV0cy5yb290UmVmID0gcm9vdFJlZjtcbiAgICBfX3NjcmlwdElucHV0cy5fX3NjcmlwdElucHV0cyA9IF9fc2NyaXB0SW5wdXRzO1xuXG4gICAgY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gKCR7ZXZlbnQuc2NyaXB0fSkoLi4uYXJndW1lbnRzKWApO1xuICAgIGNvbnN0IHJldCA9IGR5bmFtaWNGdW5jdGlvbihfX3NjcmlwdElucHV0cyk7XG5cbiAgICAvLyBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBGdW5jdGlvbignc2VuZCcsICdyb290UmVmJywnX19zY3JpcHRJbnB1dHMnLCAuLi5PYmplY3Qua2V5cyhfX3NjcmlwdElucHV0cyksIGV2ZW50LmNvbnRlbnQgPyBldmVudC5jb250ZW50IDogJycpXG4gICAgLy9jb25zdCByZXQgPSBkeW5hbWljRnVuY3Rpb24ocmVwbGllciwgcm9vdFJlZiwgX19zY3JpcHRJbnB1dHMsIC4uLk9iamVjdC52YWx1ZXMoX19zY3JpcHRJbnB1dHMpKTtcbiAgICByZXBsaWVyKHJldCk7XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRXhlY3V0ZVNjcmlwdE1lc3NhZ2VcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcGxpZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgZGF0YSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IoZXZlbnQsIHJlcGxpZXIsIHNoYWRvd1Jvb3RSZWYpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSwgRm9ybURhdGFFbnRyeSwgR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgSW5wdXRFbGVtZW50VmFsdWUsfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0cy50c1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgZ2V0SW5wdXRWYWx1ZSA9IChlbGVtZW50KTogSW5wdXRFbGVtZW50VmFsdWUgPT4ge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgZm9ybVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgZGF0YU9iamVjdDogSW5wdXRFbGVtZW50VmFsdWUgPSB7XG4gICAgICAgICAgICBmb3JtRGF0YToge30sXG4gICAgICAgICAgICB1bm1hcHBlZERhdGE6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gTWFudWFsbHkgYWRkIGVsZW1lbnRzIHdpdGhvdXQgbmFtZXNcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJyk7XG4gICAgICAgIGxldCBhdXRvTmFtZUluZGV4ZXIgPSAtMTtcblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcblxuICAgICAgICAgICAgICAgIC8vIGBfJHsoKythdXRvTmFtZUluZGV4ZXIpfWBcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVEYXRhOiBGb3JtRGF0YUVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICBpZDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZ2V0SW5wdXRWYWx1ZShlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGVsZW1lbnQucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5OiBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQudmFsaWRpdHksIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICBteW9wSWQsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjaGVja2JveCBvciByYWRpbyBidXR0b25cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW1lbnQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jaGVja2VkID8gZWxlbWVudC52YWx1ZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGlucHV0IGFuZCB0ZXh0YXJlYSBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC50YWdOYW1lID09PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWxlY3QgZWxlbWVudHMgKGRyb3Bkb3ducylcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0VMRUNUJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZWRpdGFibGUgZGl2cyAoY29udGVudEVkaXRhYmxlKVxuICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmlubmVyVGV4dCB8fCBlbGVtZW50LnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYW4gdW5zdXBwb3J0ZWQgZWxlbWVudCB0eXBlXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKGdldElucHV0VmFsdWUoaXRlbSkpLCBldmVudCk7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtNeW9wRWxlbWVudE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWxIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFNldElubmVySHRtbD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0SW5uZXJIdG1sO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogTXlvcEVsZW1lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLmlubmVySFRNTCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgV2ViY29tcG9uZW50IFNESyBpcyB0YWlsb3JlZCBmb3IgdXNpbmcgTXlvcCBjb21wb25lbnRzIHBhY2thZ2VkIGFzIHNlcGFyYXRlIGJ1bmRsZXMgYW5kIGV4cG9zZWQgYXMgd2ViIGNvbXBvbmVudHMuPGJyLz5cbiAqIERldmVsb3BlcnMgaW1wb3J0aW5nIHRoaXMgU0RLIGNhbiBsZXZlcmFnZSBBUElzIGFuZCB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGNyYWZ0ZWQgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYW5kIGNvbW11bmljYXRpb24gcGF0dGVybnMgcmVxdWlyZWQgZm9yIHdlYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgTXlvcCBhcmNoaXRlY3R1cmUuPGJyLz5cbiAqIFRoaXMgU0RLIHByb21vdGVzIHJldXNhYmlsaXR5IGFuZCBlbmNhcHN1bGF0aW9uLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIGJ1aWxkIG1vZHVsYXIsIHNlbGYtY29udGFpbmVkIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24ncyBET00gc3RydWN0dXJlLlxuICpcbiAqXG4gKiBPbmNlIGxvYWRlZCB0aGUgYFJvb3RTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gKiBgYGBqc1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtXZWJDb21wb25lbnRTREt9IGZyb20gJ0BteW9wL3Nkay93ZWJjb21wb25lbnQnO1xuICogYGBgXG4gKlxuICovXG5pbXBvcnQge0Jhc2VNeW9wU0RLfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtCaW5kT25DbGlja0hhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9iaW5kT25DbGlja0hhbmRsZXJcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXF1ZXN0LFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7c2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7QWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50c1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcbmltcG9ydCB7R2V0RWxlbWVudFZhbHVlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHNcIjtcblxuLyoqXG4gKiBUaGUgV2ViY29tcG9uZW50IFNESyBpcyB0YWlsb3JlZCBmb3IgdXNpbmcgTXlvcCBjb21wb25lbnRzIHBhY2thZ2VkIGFzIHNlcGFyYXRlIGJ1bmRsZXMgYW5kIGV4cG9zZWQgYXMgd2ViIGNvbXBvbmVudHMuPGJyLz5cbiAqIERldmVsb3BlcnMgaW1wb3J0aW5nIHRoaXMgU0RLIGNhbiBsZXZlcmFnZSBBUElzIGFuZCB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGNyYWZ0ZWQgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYW5kIGNvbW11bmljYXRpb24gcGF0dGVybnMgcmVxdWlyZWQgZm9yIHdlYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgTXlvcCBhcmNoaXRlY3R1cmUuPGJyLz5cbiAqIFRoaXMgU0RLIHByb21vdGVzIHJldXNhYmlsaXR5IGFuZCBlbmNhcHN1bGF0aW9uLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIGJ1aWxkIG1vZHVsYXIsIHNlbGYtY29udGFpbmVkIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24ncyBET00gc3RydWN0dXJlLlxuICpcbiAqXG4gKiBPbmNlIGxvYWRlZCB0aGUgYFJvb3QgU0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuICogYGBganNcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKlxuICovXG5leHBvcnQgY2xhc3MgV2ViQ29tcG9uZW50U0RLIGV4dGVuZHMgQmFzZU15b3BTREsge1xuXG4gICAgYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdCA9IHRydWU7XG5cbiAgICAvL3doZW4gbmV3IHdlYiBjb21wb25lbnQgY3JlYXRlZC5cbiAgICBjb25uZWN0ZWRDYWxsYmFjayA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBzaGFkb3c6IFNoYWRvd1Jvb3QpID0+IHtcbiAgICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIobXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICBjb25zdCBldmVudENvbnRlbnQgPSBlLmRhdGEgPyBlLmRhdGEgOiBlLmRldGFpbDtcbiAgICAgICAgICAgIGlmICghZXZlbnRDb250ZW50IHx8ICFldmVudENvbnRlbnQubXlvcCkge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVjdmllZCB3ZWJjb21wb25lbnRfbWVzc2FnZSB3aXRoIHdyb25nIHR5cGUnKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnRDb250ZW50IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgY29udGFpbmVyIC8gY29tcG9lbm50IGlkZW50aWZpZXIgZm9yIG11bHRpbCBjb21wb25lbnRzIHN1cHBvcnRcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzKGUpXG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Q29tcG9uZW50SWQgPSAobWVzc2FnZSBhcyBJbml0TWVzc2FnZSkuY29udGVudC5pZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXS5jb250ZXh0ID0gbmV3IFNoYWRvd1Jvb3RSZWYoY29udGFpbmVyLCBzaGFkb3cpXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5zdXBwb3J0ZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgaGFuZGxlci5jb250ZXh0ID0gdGhpcy5zaGFkb3dSb290cztcbiAgICAgICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2suIHJhY2UgY29uZGl0aW9uIHdpdGggaG9zdC5sb2FkIHdoZW4gbW9kdWxlIGxvYWRlZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlcXVlc3QoKSlcbiAgICAgICAgfSwgMSlcbiAgICB9XG5cbiAgICBtZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLnVwXG4gICAgICAgIC8vbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkO1xuXG4gICAgICAgIGlmICghbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgJiYgcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZClcbiAgICAgICAgICAgIG1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8uaGFuZGxlclVuaXF1ZUlkXG5cbiAgICAgICAgd2luZG93Lm15b3AuaG9zdFNESy5zZW5kKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcltdID0gW1xuICAgICAgICBuZXcgQ2hhbmdlVGV4dEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgU2V0SW5uZXJIdG1sSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBCaW5kT25DbGlja0hhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBzZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEV4ZWN1dGVTY3JpcHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICAvL1xuICAgICAgICBuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpXG4gICAgXTtcblxuICAgIHB1YmxpYyBpbml0ID0gKCkgPT4ge1xuICAgICAgICAvL3RoaXMubXlDb21wb25lbnRJZFxuICAgICAgICAvL3RoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXNcbiAgICB9XG59XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ1dlYkNvbXBvbmVudFNESycsIFdlYkNvbXBvbmVudFNESyk7XG4iLCAiZXhwb3J0ICogZnJvbSBcIi4vV2ViQ29tcG9uZW50U0RLXCI7XG4iLCAiLyoqXG4gKiBFbWJlZGRlZCBTREsgQ29udGVudCBNb2R1bGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgZW1iZWRkZWQgU0RLIGNvbnRlbnQgZm9yIG5wbSBwYWNrYWdlIHVzZXJzLlxuICogVGhlIGFjdHVhbCBjb250ZW50IGlzIGdlbmVyYXRlZCBhdCBidWlsZCB0aW1lIGJ5IHNjcmlwdHMvYnVpbGQtZW1iZWRkZWQtc2RrLmpzXG4gKlxuICogRm9yIGRldmVsb3BtZW50LCB0aGlzIGZpbGUgZXhwb3J0cyBwbGFjZWhvbGRlcnMuXG4gKiBBZnRlciBidWlsZCwgdGhlIGRpc3QvbW9kdWxlL2VtYmVkZGVkU0RLLmpzIHdpbGwgY29udGFpbiB0aGUgYWN0dWFsIFNESyBjb250ZW50LlxuICpcbiAqIFVzYWdlIGluIEhUTUxDb21wb25lbnRMb2FkZXI6XG4gKiAtIElmIEhBU19FTUJFRERFRF9TREsgaXMgdHJ1ZSwgaW5qZWN0IFNESyBpbmxpbmU6IDxzY3JpcHQ+JHtFTUJFRERFRF9TREtfQ09OVEVOVH08L3NjcmlwdD5cbiAqIC0gSWYgSEFTX0VNQkVEREVEX1NESyBpcyBmYWxzZSwgZmFsbCBiYWNrIHRvIENETjogPHNjcmlwdCBzcmM9XCIke3VybH1cIj48L3NjcmlwdD5cbiAqL1xuXG4vKipcbiAqIFRoZSBlbWJlZGRlZCBTREsgY29udGVudCBhcyBhIG1pbmlmaWVkIEphdmFTY3JpcHQgc3RyaW5nLlxuICogVGhpcyBwbGFjZWhvbGRlciB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYWN0dWFsIGNvbnRlbnQgaW4gdGhlIGJ1aWxkIG91dHB1dC5cbiAqL1xuZXhwb3J0IGNvbnN0IEVNQkVEREVEX1NES19DT05URU5UOiBzdHJpbmcgPSAnJztcblxuLyoqXG4gKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciBlbWJlZGRlZCBTREsgY29udGVudCBpcyBhdmFpbGFibGUuXG4gKiBUaGlzIGlzIGZhbHNlIGluIGRldmVsb3BtZW50LCB0cnVlIGluIHRoZSBidWlsdCBtb2R1bGUuXG4gKi9cbmV4cG9ydCBjb25zdCBIQVNfRU1CRURERURfU0RLOiBib29sZWFuID0gZmFsc2U7XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge015b3BFeHRyYWN0ZWRXZWJDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BFeHRyYWN0ZWRXZWJDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzLnRzXCI7XG5pbXBvcnQge1xuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElIVE1MTG9hZGVyQ29uZmlnLFxuICAgIElTa2luQ29uZmlnLCBTaGFkb3dSb290TW9kZVR5cGUsXG4gICAgU2tpbkxvYWRlcnNcbn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtXZWJDb21wb25lbnRTREt9IGZyb20gXCIuLi8uLi93ZWJjb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcElmcmFtZUNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50c1wiO1xuaW1wb3J0IHtFTUJFRERFRF9TREtfQ09OVEVOVCwgSEFTX0VNQkVEREVEX1NES30gZnJvbSBcIi4uL2VtYmVkZGVkU0RLLnRzXCI7XG4vL2ltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tIFwiLi4vLi4vU0RLLnRzXCI7XG5cbmNvbnN0IE1ZT1BfV0VCX0NPTVBPTkVOVF9NQVJLRVIgPSAnPCEtLSBteW9wLXdlYi1jb21wb25lbnQgLS0+JztcbmNvbnN0IE1ZT1BfV0VCX0NPTVBPTkVOVF9TQ1JJUFRfSUQgPSAnbXlvcC13ZWItY29tcG9uZW50JztcblxuLy8gVHJhY2sgZXh0cmFjdGVkIHdlYiBjb21wb25lbnQgc2NyaXB0cyB0byBwcmV2ZW50IGRvdWJsZSByZWdpc3RyYXRpb25cbmNvbnN0IGV4dHJhY3RlZFdlYkNvbXBvbmVudFNjcmlwdHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG5jb25zdCBzZWVuOiBzdHJpbmdbXSA9IFtdO1xubGV0IHNkaztcbmNvbnN0IGdldEluaXRpYXRlZFNkayA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXNkaykge1xuICAgICAgICAvL2NvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKClcbiAgICAgICAgc2RrID0gbmV3IFdlYkNvbXBvbmVudFNESygpO1xuICAgICAgICBzZGsuaW5pdCgpO1xuICAgIH1cbiAgICByZXR1cm4gc2RrO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIVE1MRWxlbWVudENvbnN0cnVjdG9yKGh0bWxTdHJpbmc6IHN0cmluZywgU2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlKTogbmV3ICgpID0+IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG5cbiAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICBjb25zdCBtb2RlID0gU2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5vcGVuID8gJ29wZW4nIDogJ2Nsb3NlZCc7XG4gICAgICAgICAgICBjb25zdCBzaGFkb3cgPSB0aGlzLmF0dGFjaFNoYWRvdyh7bW9kZX0pO1xuICAgICAgICAgICAgZ2V0SW5pdGlhdGVkU2RrKCkudGhlbigoc2RrKSA9PiB7XG4gICAgICAgICAgICAgICAgc2RrLmNvbm5lY3RlZENhbGxiYWNrKHRoaXMsIHNoYWRvdyk7XG4gICAgICAgICAgICAgICAgc2hhZG93LmlubmVySFRNTCA9IGh0bWxTdHJpbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5jb25zdCBjcmVhdGVDdXN0b21XZWJDb21wb25lbnQgPSAoY29tcG9uZW50TmFtZTogc3RyaW5nLCBodG1sOiBzdHJpbmcsIFNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZSkgPT4ge1xuICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZShjb21wb25lbnROYW1lLCBjcmVhdGVIVE1MRWxlbWVudENvbnN0cnVjdG9yKGh0bWwsIFNoYWRvd1Jvb3RNb2RlKSk7XG4gICAgY29uc29sZS5sb2coYGRlZmluZSgnJHtjb21wb25lbnROYW1lfScpIHdhcyBjYWxsZWQsIHdlYiBjb21wb25lbnQgcmVhZHkgdG8gdXNlYCk7XG59XG5cbmNvbnN0IHRvV2ViQ29tcG9uZW50TmFtZSA9IChzdHIpID0+IHtcbiAgICByZXR1cm4gc3RyXG4gICAgICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEtJDInKSAvLyBBZGQgaHlwaGVuIGJlZm9yZSB1cHBlcmNhc2UgbGV0dGVyc1xuICAgICAgICAucmVwbGFjZSgvKFxcZCspL2csICctJDEnKSAvLyBBZGQgaHlwaGVuIGJlZm9yZSBkaWdpdHNcbiAgICAgICAgLnRvTG93ZXJDYXNlKCk7IC8vIENvbnZlcnQgdG8gbG93ZXJjYXNlXG59XG5cbmNvbnN0IHRvQ3VzdG9tRWxlbWVudE5hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgbmFtZSA9IHRvV2ViQ29tcG9uZW50TmFtZShuYW1lKTtcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC9fL2csICctJyk7XG59XG5cbmxldCBwYXJzZXI6IERPTVBhcnNlcjsgLy8gPSBuZXcgRE9NUGFyc2VyKCk7XG5cbmV4cG9ydCBjbGFzcyBIVE1MQ29tcG9uZW50TG9hZGVyIGV4dGVuZHMgQmFzZU15b3BMb2FkZXIge1xuXG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXJcblxuICAgIC8qKlxuICAgICAqIERldGVjdCBpZiBIVE1MIGlzIGEgTXlvcCBXZWIgQ29tcG9uZW50IChzdGFydHMgd2l0aCBtYXJrZXIgY29tbWVudClcbiAgICAgKi9cbiAgICBwcml2YXRlIGlzTXlvcFdlYkNvbXBvbmVudChodG1sOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGh0bWwudHJpbVN0YXJ0KCkuc3RhcnRzV2l0aChNWU9QX1dFQl9DT01QT05FTlRfTUFSS0VSKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0IHRoZSB3ZWIgY29tcG9uZW50IHNjcmlwdCBjb250ZW50IGZyb20gSFRNTFxuICAgICAqL1xuICAgIHByaXZhdGUgZXh0cmFjdFdlYkNvbXBvbmVudFNjcmlwdChodG1sOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jLmdldEVsZW1lbnRCeUlkKE1ZT1BfV0VCX0NPTVBPTkVOVF9TQ1JJUFRfSUQpO1xuICAgICAgICByZXR1cm4gc2NyaXB0Py50ZXh0Q29udGVudCB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgdGhlIHdlYiBjb21wb25lbnQgc2NyaXB0IG9uIHRoZSBob3N0IGRvY3VtZW50XG4gICAgICovXG4gICAgcHJpdmF0ZSBleGVjdXRlV2ViQ29tcG9uZW50U2NyaXB0KHNjcmlwdENvbnRlbnQ6IHN0cmluZywgc2NyaXB0SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGV4ZWN1dGVkIChieSBzY3JpcHQgY29udGVudCBoYXNoKVxuICAgICAgICBpZiAoZXh0cmFjdGVkV2ViQ29tcG9uZW50U2NyaXB0cy5oYXMoc2NyaXB0SWQpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW015b3BXZWJDb21wb25lbnRdIFNjcmlwdCBhbHJlYWR5IGV4ZWN1dGVkIGZvciAke3NjcmlwdElkfSwgc2tpcHBpbmdgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICBzY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHRDb250ZW50O1xuICAgICAgICBzY3JpcHQuaWQgPSBgbXlvcC1leHRyYWN0ZWQtJHtzY3JpcHRJZH1gO1xuICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cbiAgICAgICAgZXh0cmFjdGVkV2ViQ29tcG9uZW50U2NyaXB0cy5hZGQoc2NyaXB0SWQpO1xuICAgICAgICBjb25zb2xlLmxvZyhgW015b3BXZWJDb21wb25lbnRdIEV4ZWN1dGVkIHdlYiBjb21wb25lbnQgc2NyaXB0OiAke3NjcmlwdElkfWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgYSBNeW9wIFdlYiBDb21wb25lbnQgKGV4dHJhY3RlZCBhbmQgcnVuIG9uIGhvc3QgZG9jdW1lbnQpXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkRXh0cmFjdGVkV2ViQ29tcG9uZW50KFxuICAgICAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICAgICAgc2tpbjogSVNraW5Db25maWcsXG4gICAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgICAgIGh0bWw6IHN0cmluZyxcbiAgICAgICAgb3B0aW9ucz86IGxvYWRlck9wdGlvbnNcbiAgICApOiBQcm9taXNlPE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQ+IHtcbiAgICAgICAgY29uc3Qgc2NyaXB0Q29udGVudCA9IHRoaXMuZXh0cmFjdFdlYkNvbXBvbmVudFNjcmlwdChodG1sKTtcblxuICAgICAgICBpZiAoIXNjcmlwdENvbnRlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW015b3BXZWJDb21wb25lbnRdIE5vIDxzY3JpcHQgaWQ9XCJteW9wLXdlYi1jb21wb25lbnRcIj4gZm91bmQgaW4gSFRNTCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlIGNvbXBvbmVudCBkZWZpbml0aW9uIGlkIGFzIHNjcmlwdCBpZGVudGlmaWVyIGZvciBkZWR1cGxpY2F0aW9uXG4gICAgICAgIGNvbnN0IHNjcmlwdElkID0gYCR7Y29tcG9uZW50RGVmaW5pdGlvbi5pZH0tJHtza2luLmlkfWA7XG5cbiAgICAgICAgLy8gU3RvcmUgX19NWU9QX1RBR19OQU1FX18gYmVmb3JlIGV4ZWN1dGlvbiB0byBjYXB0dXJlIGl0XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVGFnTmFtZSA9ICh3aW5kb3cgYXMgYW55KS5fX01ZT1BfVEFHX05BTUVfXztcblxuICAgICAgICAvLyBFeGVjdXRlIHRoZSBzY3JpcHQgb24gdGhlIGhvc3QgZG9jdW1lbnRcbiAgICAgICAgdGhpcy5leGVjdXRlV2ViQ29tcG9uZW50U2NyaXB0KHNjcmlwdENvbnRlbnQsIHNjcmlwdElkKTtcblxuICAgICAgICAvLyBHZXQgdGhlIHRhZyBuYW1lIHRoYXQgd2FzIHNldCBieSB0aGUgc2NyaXB0XG4gICAgICAgIGNvbnN0IHRhZ05hbWUgPSAod2luZG93IGFzIGFueSkuX19NWU9QX1RBR19OQU1FX187XG5cbiAgICAgICAgaWYgKCF0YWdOYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tNeW9wV2ViQ29tcG9uZW50XSBTY3JpcHQgZGlkIG5vdCBzZXQgd2luZG93Ll9fTVlPUF9UQUdfTkFNRV9fJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXN0b3JlIHByZXZpb3VzIHRhZyBuYW1lIGlmIHRoaXMgd2FzIGEgcmUtcmVnaXN0cmF0aW9uXG4gICAgICAgIGlmIChwcmV2aW91c1RhZ05hbWUgJiYgcHJldmlvdXNUYWdOYW1lICE9PSB0YWdOYW1lKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFtNeW9wV2ViQ29tcG9uZW50XSBfX01ZT1BfVEFHX05BTUVfXyBjaGFuZ2VkIGZyb20gJHtwcmV2aW91c1RhZ05hbWV9IHRvICR7dGFnTmFtZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgY3VzdG9tIGVsZW1lbnRcbiAgICAgICAgY29uc3QgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YDtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgY29udGFpbmVyIGlmIG5lZWRlZFxuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKSB7XG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb21wb25lbnQgd3JhcHBlclxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudChcbiAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb24sXG4gICAgICAgICAgICBza2luLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIHRhZ05hbWUsXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGRhdGEgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29tcG9uZW50LmluaXRXaXRoRGF0YShvcHRpb25zLmRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coYFtNeW9wV2ViQ29tcG9uZW50XSBMb2FkZWQgPCR7dGFnTmFtZX0+IGludG8gY29udGFpbmVyYCk7XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWcpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBNeW9wIFdlYiBDb21wb25lbnQgKGV4dHJhY3RlZCB3ZWIgY29tcG9uZW50IG1vZGUpXG4gICAgICAgIGlmICh0aGlzLmlzTXlvcFdlYkNvbXBvbmVudChsb2FkZXJDb25maWcuSFRNTCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRFeHRyYWN0ZWRXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBsb2FkZXJDb25maWcuSFRNTCwgb3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YFxuICAgICAgICBsZXQgZWxlbWVudDtcblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICBsZXQgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgICAgICAvLyBTZXQgYWxsIHN0eWxlcyBCRUZPUkUgYXBwZW5kaW5nIHRvIHByZXZlbnQgZmxhc2ggYXQgd3JvbmcgcG9zaXRpb25cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgaW5zZXQ6IDA7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogJHtvcHRpb25zPy5oaWRkZW4gPyAnMCcgOiAnMSd9O1xuICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICAgICAgICBwb2ludGVyLWV2ZW50czogJHtvcHRpb25zPy5oaWRkZW4gPyAnbm9uZScgOiAnYWxsJ307XG4gICAgICAgICAgICBgO1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vIFdyaXRlIGNvbnRlbnQgaW50byB0aGUgaWZyYW1lXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IElmcmFtZUVsZW1lbnQuY29udGVudERvY3VtZW50IHx8IElmcmFtZUVsZW1lbnQuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgICAgIGRvYy5vcGVuKCk7XG5cblxuICAgICAgICAgICAgLy8gUGFyc2UgbXlvcDpzaXplIG1ldGEgdGFnIGJlZm9yZSBpZnJhbWUgY3JlYXRpb24gKHNhbWUgRE9NUGFyc2VyIHBhc3MgcGF0dGVybiBhcyBteW9wX3ByZXZpZXcgcmVtb3ZhbCkuXG4gICAgICAgICAgICAvLyBUaGlzIGxldHMgdGhlIFJlYWN0IGhvc3QgZGV0ZXJtaW5lIHNpemluZyBtb2RlIChmaWxsIHZzIGNvbnRlbnQpIGZyb20gdGhlIHN0YXJ0LlxuICAgICAgICAgICAgbGV0IHBhcnNlZFNpemVNZXRhOiB7IHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyOyBoZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7IG1pbldpZHRoPzogbnVtYmVyOyBtYXhXaWR0aD86IG51bWJlcjsgbWluSGVpZ2h0PzogbnVtYmVyOyBtYXhIZWlnaHQ/OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9wcmVQYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX3ByZURvYyA9IF9wcmVQYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZU1ldGEgPSBfcHJlRG9jLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cIm15b3A6c2l6ZVwiXScpO1xuICAgICAgICAgICAgICAgIGlmIChzaXplTWV0YSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkgeyBwYXJzZWRTaXplTWV0YSA9IEpTT04ucGFyc2Uoc2l6ZU1ldGEuZ2V0QXR0cmlidXRlKCdjb250ZW50JykgfHwgJ3t9Jyk7IH0gY2F0Y2gge31cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBIVE1MMlJlbmRlciA9IGxvYWRlckNvbmZpZy5IVE1MO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uX2luc3BlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAvL2luamVjdCBpbnNwZWN0aW9uIHNjcmlwdCBmb3IgcHJvcHMgZGV0ZWN0aW9uXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9kb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogcGFydCBvZiBBSSBjb21wb25lbnRzLCB0aGluayBhYm91dCB0aGF0LCBkb2N1bWVudCBpdC5cbiAgICAgICAgICAgICAgICBjb25zdCBteW9wX3ByZXZpZXdfc2NyaXB0ID0gX2RvYy5nZXRFbGVtZW50QnlJZCgnbXlvcF9wcmV2aWV3Jyk7XG4gICAgICAgICAgICAgICAgbXlvcF9wcmV2aWV3X3NjcmlwdD8ucmVtb3ZlQXR0cmlidXRlKCd0eXBlJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBQYXJzZSB0aGUgaW5qZWN0ZWQgSFRNTCBzdHJpbmcgaW50byBhIG5vZGVcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wID0gX2RvYy5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoKTtcbiAgICAgICAgICAgICAgICB0ZW1wLmJvZHkuaW5uZXJIVE1MID0gYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmVLZXlzV2luZG93ID0gbmV3IFNldChPYmplY3Qua2V5cyh3aW5kb3cpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlS2V5c1dpbmRvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0ZW1wLmJvZHkuZmlyc3RDaGlsZDtcblxuICAgICAgICAgICAgICAgIGlmIChub2RlICYmIF9kb2MuaGVhZCkge1xuICAgICAgICAgICAgICAgICAgICBfZG9jLmhlYWQuaW5zZXJ0QmVmb3JlKF9kb2MuaW1wb3J0Tm9kZShub2RlLCB0cnVlKSwgX2RvYy5oZWFkLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIEhUTUwyUmVuZGVyID0gX2RvYy5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zPy5kYXRhICE9PSB1bmRlZmluZWQpIHtcblxuICAgICAgICAgICAgICAgIC8vVE9ETzogaW1wcm92ZSBieSBkbyBpdCBvbiB0aGUgc2VydmUgb25jZVxuXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIG15b3BfcHJldmlldyBzY3JpcHQgd2hlbiBub3QgaW4gaW5zcGVjdGlvbiBtb2RlXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9kb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcF9wcmV2aWV3X3NjcmlwdCA9IF9kb2MuZ2V0RWxlbWVudEJ5SWQoJ215b3BfcHJldmlldycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG15b3BfcHJldmlld19zY3JpcHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbXlvcF9wcmV2aWV3X3NjcmlwdC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgSFRNTDJSZW5kZXIgPSBfZG9jLmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGRvYy53cml0ZWxuKEhUTUwyUmVuZGVyKTtcblxuICAgICAgICAgICAgLy8gd2luZG93Ll9fZmVkZXJhdGlvbl9fID1cbiAgICAgICAgICAgIC8vICAgICB7IC4uLndpbmRvdy5fX2ZlZGVyYXRpb25fXyxcbiAgICAgICAgICAgIC8vICAgICAgICAgLy9UT0RPIDogZ2V0IGZyb20gRU5WIGF0IGJ1aWxkIHRpbWUsXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vIGluamVjdCB2YWx1ZSB0byBtb2R1bGUgYXQgYnVpbGQgdGltZVxuICAgICAgICAgICAgLy8gICAgICAgICAvLyB0b2RheSB3ZSBkb2luZyBzbyBqdXN0IGZvciB0aGUgQ0pTIHZlcnNpb25cbiAgICAgICAgICAgIC8vICAgICAgICAgX19wdWJsaWNfcGF0aF9fIDonaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQnXG4gICAgICAgICAgICAvLyAgICAgICAgICwuLi4ke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICB3aW5kb3cuX19mZWRlcmF0aW9uX18pXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgIH07XG5cbiAgICAgICAgICAgIC8vIEZvciBucG0gcGFja2FnZSB1c2VycyB3aXRoIGJ1bmRsZXJzIChWaXRlL1dlYnBhY2spLCBpbmplY3QgU0RLIGlubGluZVxuICAgICAgICAgICAgLy8gRm9yIENETiB1c2VycyAoc2NyaXB0IHRhZyksIHVzZSBDRE4gVVJMXG4gICAgICAgICAgICBjb25zdCBzZGtTY3JpcHQgPSBIQVNfRU1CRURERURfU0RLXG4gICAgICAgICAgICAgICAgPyBgPHNjcmlwdD4ke0VNQkVEREVEX1NES19DT05URU5UfTwvc2NyaXB0PmBcbiAgICAgICAgICAgICAgICA6IGA8c2NyaXB0IHNyYz1cIiR7d2luZG93Lm15b3AuX19ST09UX1NES19QVUJMSUNfVVJMX199XCI+PC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgLy8gRGlmZmVyZW50IGluaXQgc2NyaXB0IGZvciBlbWJlZGRlZCB2cyBDRE4gU0RLXG4gICAgICAgICAgICAvLyAtIEVtYmVkZGVkIChidW5kbGVkIElJRkUpOiB1c2VzIE15b3BTREsuZ2V0SWZyYW1lTW9kdWxlKCkgd2hpY2ggcmV0dXJucyBtb2R1bGUgZGlyZWN0bHlcbiAgICAgICAgICAgIC8vIC0gQ0ROIChkeW5hbWljIGxvYWRpbmcpOiB1c2VzIHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkgd2hpY2ggd3JhcHMgd2l0aCAuZ2V0KClcbiAgICAgICAgICAgIGNvbnN0IGluaXRTY3JpcHQgPSBIQVNfRU1CRURERURfU0RLXG4gICAgICAgICAgICAgICAgPyBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICBjb25zdCBfX215b3BfaW5pdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlmcmFtZU1vZHVsZSA9IGF3YWl0IE15b3BTREsuZ2V0SWZyYW1lTW9kdWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJZnJhbWVTREsgPSBpZnJhbWVNb2R1bGUuSWZyYW1lU0RLO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2RrID0gbmV3IElmcmFtZVNESygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2RrLmluaXQoKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgX19teW9wX2luaXQoKS50aGVuKCk7XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YFxuICAgICAgICAgICAgICAgIDogYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgd2luZG93Ll9fZmVkZXJhdGlvbl9fLl9fcHVibGljX3BhdGhfXyA9IHdpbmRvdy5fX2ZlZGVyYXRpb25fXy5fX3B1YmxpY19wYXRoX187XG4gICAgICAgICAgICAgICAgICAgY29uc3QgX19teW9wX2luaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNkayA9IG5ldyBJZnJhbWVTREsoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNkay5pbml0KCk7XG4gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgIF9fbXlvcF9pbml0KCkudGhlbigpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgIGRvYy53cml0ZWxuKGAke3Nka1NjcmlwdH0ke2luaXRTY3JpcHR9YCk7XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBkYXRhIHNjcmlwdCBpZiBkYXRhIG9wdGlvbiBpcyBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIFNldHVwIENUQSBxdWV1ZSAtIGNhcHR1cmVzIGFueSBDVEFzIGVtaXR0ZWQgZHVyaW5nIGluaXQgYmVmb3JlIGhvc3QgcmVnaXN0ZXJzIGhhbmRsZXJcbiAgICAgICAgICAgICAgICBjb25zdCBjdGFRdWV1ZVNjcmlwdCA9IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2N0YV9xdWV1ZSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcF9jdGFfaGFuZGxlciA9IGZ1bmN0aW9uKGFjdGlvbiwgcGF5bG9hZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9jdGFfcXVldWUucHVzaCh7YWN0aW9uOiBhY3Rpb24sIHBheWxvYWQ6IHBheWxvYWR9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICAgICAgLy8gRXNjYXBlIGRhdGEgZm9yIHNhZmUgZW1iZWRkaW5nIGluIHNjcmlwdCB0YWdcbiAgICAgICAgICAgICAgICAvLyBKU09OLnN0cmluZ2lmeSBkb2Vzbid0IGVzY2FwZSA8L3NjcmlwdD4gd2hpY2ggY291bGQgYnJlYWsgSFRNTCBwYXJzaW5nXG4gICAgICAgICAgICAgICAgY29uc3QgZXNjYXBlZERhdGEgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmRhdGEpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC88XFwvc2NyaXB0L2dpLCAnXFxcXHUwMDNjL3NjcmlwdCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gU2VsZi1jb250YWluZWQgZGF0YSBpbmplY3Rpb24gc2NyaXB0IHRoYXQ6XG4gICAgICAgICAgICAgICAgLy8gMS4gQ2FsbHMgbXlvcF9pbml0X2ludGVyZmFjZSBpbW1lZGlhdGVseSBpZiBhbHJlYWR5IGRlZmluZWRcbiAgICAgICAgICAgICAgICAvLyAyLiBXYXRjaGVzIGZvciBsYXRlLWRlZmluZWQgbXlvcF9pbml0X2ludGVyZmFjZSB2aWEgZGVmaW5lUHJvcGVydHlcbiAgICAgICAgICAgICAgICAvLyAzLiBDbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIChyZW1vdmVzIHNjcmlwdCB0YWcgYW5kIHdpbmRvdyBkYXRhKVxuICAgICAgICAgICAgICAgIC8vIDQuIFBvc3RzIG1lc3NhZ2UgdG8gcGFyZW50IGZvciBleHRlbnNpb24gdHJhY2tpbmcgKHByZS1pbmplY3RlZCBpbml0KilcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhU2NyaXB0ID0gYDxzY3JpcHQgaWQ9XCJfX215b3BfaW5pdF9kYXRhX3NjcmlwdFwiPlxuICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9ICR7ZXNjYXBlZERhdGF9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjcmlwdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ19fbXlvcF9pbml0X2RhdGFfc2NyaXB0Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWxsSW5pdEludGVyZmFjZSA9IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgYXMgcHJlLWluamVjdGVkIGRhdGEgY2FsbCBmb3IgZXh0ZW5zaW9uIHRyYWNraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X3ByZWluamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbihkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2luaXRfcHJlaW5qZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RpZnkgZXh0ZW5zaW9uIHZpYSBwb3N0TWVzc2FnZSAoaW5pdCogPSBwcmUtaW5qZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTVlPUF9QUkVJTkpFQ1RFRF9JTklUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJyonKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYW51cDogcmVtb3ZlIHNjcmlwdCB0YWcgYW5kIHN0b3JlZCBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmlwdEVsICYmIHNjcmlwdEVsLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0RWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHRFbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3aW5kb3cuX19teW9wX2luaXRfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdW5jdGlvbiBhbHJlYWR5IGV4aXN0cyAtIGNhbGwgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsSW5pdEludGVyZmFjZSh3aW5kb3cubXlvcF9pbml0X2ludGVyZmFjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZ1bmN0aW9uIG5vdCB5ZXQgZGVmaW5lZCAtIHN0b3JlIGRhdGEgYW5kIHdhdGNoIGZvciBkZWZpbml0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X2RhdGEgPSBkYXRhO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9vcmlnaW5hbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbXlvcF9pbml0X2ludGVyZmFjZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3JpZ2luYWwgPSBmbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuX19teW9wX2luaXRfZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0b3JlZERhdGEgPSB3aW5kb3cuX19teW9wX2luaXRfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2luZG93Ll9fbXlvcF9pbml0X2RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEluaXRJbnRlcmZhY2UoZm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vcmlnaW5hbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG4gICAgICAgICAgICAgICAgZG9jLndyaXRlbG4oY3RhUXVldWVTY3JpcHQgKyBkYXRhU2NyaXB0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9jLmNsb3NlKCk7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBjb250cm9sIGZyb20gZGFzaGJvYXJkXG4gICAgICAgICAgICAvLyAgKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLmF1dG9IZWlnaHQgPSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBjb21wID0gbmV3IE15b3BJZnJhbWVDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAgICAgLy8gU3RvcmUgcGFyc2VkIHNpemVNZXRhIG9uIHRoZSBjb21wb25lbnQgc28gdGhlIFJlYWN0IGhvc3QgY2FuIHJlYWQgaXRcbiAgICAgICAgICAgIGNvbXAuc2l6ZU1ldGEgPSBwYXJzZWRTaXplTWV0YTtcblxuICAgICAgICAgICAgLy8gQXV0by1zaXplOiBvYnNlcnZlIGNvbnRlbnQgc2l6ZSBhbmQgc3luYyB0byBpZnJhbWUgZGltZW5zaW9ucy5cbiAgICAgICAgICAgIC8vIFRoaXMgd29ya3MgZm9yIGFsbCBob3N0cyAodmFuaWxsYSBTREssIFJlYWN0LCBWdWUsIEFuZ3VsYXIpLlxuICAgICAgICAgICAgLy8gSWYgYSBmcmFtZXdvcmsgaG9zdCAoZS5nLiBAbXlvcC9yZWFjdCkgYWxzbyBjYWxscyBvYnNlcnZlQXV0b1NpemUoKSxcbiAgICAgICAgICAgIC8vIGl0IGNsZWFubHkgcmVwbGFjZXMgdGhlc2Ugb2JzZXJ2ZXJzIHZpYSBfYXV0b1NpemVDbGVhbnVwIHRyYWNraW5nLlxuICAgICAgICAgICAgY29tcC5pbml0aWF0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb21wLm9ic2VydmVBdXRvU2l6ZSh7IGZvcmNlQXV0b1NpemU6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgLy8gU3dpdGNoIGZyb20gYWJzb2x1dGUgcG9zaXRpb25pbmcgdG8gbm9ybWFsIGRvY3VtZW50IGZsb3cuXG4gICAgICAgICAgICAgICAgLy8gQ29udGVudCBtb2RlOiBpZnJhbWUgaGFzIHBpeGVsIGhlaWdodCBmcm9tIG9ic2VydmVBdXRvU2l6ZSwgbm93IHBhcnRpY2lwYXRlcyBpbiBmbG93LlxuICAgICAgICAgICAgICAgIC8vIEZpbGwgbW9kZTogaWZyYW1lIGhhcyBoZWlnaHQ6MTAwJSwgcmVzb2x2ZXMgdG8gcGFyZW50IGNvbnRhaW5lciBoZWlnaHQuXG4gICAgICAgICAgICAgICAgLy8gU2tpcCBmb3IgaGlkZGVuIGxvYWRzIChzdGFnZWQgbmF2aWdhdGlvbikgXHUyMDE0IHNob3coKSBpcyBjYWxsZWQgZXhwbGljaXRseSBsYXRlci5cbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICBjb21wLnNob3coKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vIGNvbXAucHJvcHMuX2dsb2JhbCA9IGNvbXAuZWxlbWVudC5jb250ZW50V2luZG93O1xuICAgICAgICAgICAgcmV0dXJuIGNvbXA7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5ub25lKSB7XG4gICAgICAgICAgICAvLyBwYXJzZXIgPSBwYXJzZXIgPyBwYXJzZXIgOiBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAvLyBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAvLyBlbGVtZW50ID0gZG9jLmJvZHkuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIC8vZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgZG9tSWQpO1xuXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDsvLy50cmltKCk7XG4gICAgICAgICAgICBlbGVtZW50ID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcblxuICAgICAgICAgICAgLy8gICBjb25zdCBmaXJzdEVsZW1lbnQgPSB0ZW1wbGF0ZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgLy8gICBjb25zdCB6ID0gZmlyc3RFbGVtZW50ID8gZmlyc3RFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA6IG51bGw7XG4gICAgICAgICAgICAvLyAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gICBjb25zb2xlLmxvZyh0ZW1wbGF0ZSwgZmlyc3RFbGVtZW50LCB6KVxuICAgICAgICAgICAgLy8gICBlbGVtZW50ID0gZmlyc3RFbGVtZW50XG5cbiAgICAgICAgICAgIC8vIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Rib2R5Jyk7XG4gICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIGNvbnRhaW5lci5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDtcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgPSBjb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayhlbGVtZW50LCBlbGVtZW50KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21FbGVtZW50TmFtZSA9IHRvQ3VzdG9tRWxlbWVudE5hbWUoY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lICsgc2tpbi5pZCk7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgcmVkZWZpbmUgIVxuICAgICAgICAgICAgaWYgKCFzZWVuLmluY2x1ZGVzKGN1c3RvbUVsZW1lbnROYW1lKSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZUN1c3RvbVdlYkNvbXBvbmVudChjdXN0b21FbGVtZW50TmFtZSwgbG9hZGVyQ29uZmlnLkhUTUwsIGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSk7XG4gICAgICAgICAgICAgICAgc2Vlbi5wdXNoKGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIC8vZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29udGFpbmVyLmlkLnN0YXJ0c1dpdGgoJ215b3AtY29tcC0nKSkge1xuICAgICAgICAvLyAgICAgLy8gaW4gcGxhY2UgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChlbGVtZW50KTtcbiAgICAgICAgLy8gICAgIC8vY29udGFpbmVyID0gZWxlbWVudC5wYXJlbnRFbGVtZW50ITtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2N1c3RvbUVsZW1lbnROYW1lfSAvPmA7XG4gICAgICAgIHJldHVybiBuZXcgTXlvcFdlYkNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSAqIGFzIENTUyBmcm9tIFwiY3NzdHlwZVwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuXG4vLyBpZ25vcmluZyBkb2N1bWVudGF0aW9uXG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGludGVyZmFjZSBDU1NQcm9wZXJ0aWVzIGV4dGVuZHMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPiB7XG59XG5cbmV4cG9ydCB0eXBlIFN0eWxlc2hlZXREZWZpbml0aW9uID0geyBba2V5OiBzdHJpbmddOiBDU1NQcm9wZXJ0aWVzIH07XG5cbmV4cG9ydCBjb25zdCBhcHBseVN0eWxlc2hlZXQgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgc3R5bGVzaGVldDogU3R5bGVzaGVldERlZmluaXRpb24sIGNzcz86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHRhZ0lkID0gYG15b3AtY3NzLSR7dXVpZHY0KCl9YDtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfc3R5bGVzaGVldCwgX3RhZ0lkLCBfY3NzfSkgPT4ge1xuICAgICAgICBjb25zdCBzdHlsZVRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIHN0eWxlVGFnLnR5cGUgPSAndGV4dC9jc3MnO1xuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBDU1Mgc3RyaW5nIGZyb20gdGhlIHN0eWxlcyBvYmplY3RcbiAgICAgICAgbGV0IGNzc1N0cmluZyA9IF9jc3M7XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWxlY3RvciBpbiBfc3R5bGVzaGVldCkge1xuICAgICAgICAgICAgY3NzU3RyaW5nICs9IGAke3NlbGVjdG9yfSB7IGA7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gX3N0eWxlc2hlZXRbc2VsZWN0b3JdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgY3NzU3RyaW5nICs9IGAke3Byb3BlcnR5fTogJHtwcm9wZXJ0aWVzW3Byb3BlcnR5XX07IGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjc3NTdHJpbmcgKz0gJ30gJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgQ1NTIHN0cmluZyBhcyB0aGUgY29udGVudCBvZiB0aGUgPHN0eWxlPiBlbGVtZW50XG4gICAgICAgIHN0eWxlVGFnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzc1N0cmluZykpO1xuICAgICAgICBzdHlsZVRhZy5pZCA9IF90YWdJZDtcbiAgICAgICAgLy8gQXBwZW5kIHRoZSA8c3R5bGU+IGVsZW1lbnRcbiAgICAgICAgKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikuYXBwZW5kQ2hpbGQoc3R5bGVUYWcpO1xuXG4gICAgfSwgKCkgPT4ge1xuICAgIH0sIHtcbiAgICAgICAgX3N0eWxlc2hlZXQ6IHN0eWxlc2hlZXQsXG4gICAgICAgIF9jc3MgOiBjc3MgPyBjc3MgOiAnJyxcbiAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgIH0pKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IGRvY3VtZW50KS5nZXRFbGVtZW50QnlJZChfdGFnSWQpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIF90YWdJZDogdGFnSWRcbiAgICAgICAgfSkpXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgYXBwbHlTdHlsZXNoZWV0TGluayA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBsaW5rOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0YWdJZCA9IGBteW9wLWNzcy0ke3V1aWR2NCgpfWA7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7cm9vdFJlZiwgX3RhZ0lkLCBfbGlua30pID0+IHtcbiAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgIGxpbmtFbGVtZW50LmlkID0gX3RhZ0lkO1xuICAgICAgICBsaW5rRWxlbWVudC5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBfbGluaztcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rRWxlbWVudCk7XG5cbiAgICAgICAgLy8gQXBwZW5kIHRoZSA8c3R5bGU+IGVsZW1lbnRcbiAgICAgICAgKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikuYXBwZW5kQ2hpbGQobGlua0VsZW1lbnQpO1xuICAgIH0sICgpID0+IHtcbiAgICB9LCB7XG4gICAgICAgIF9saW5rIDogbGluayxcbiAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgIH0pKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IGRvY3VtZW50KS5nZXRFbGVtZW50QnlJZChfdGFnSWQpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIF90YWdJZDogdGFnSWRcbiAgICAgICAgfSkpXG4gICAgfVxufVxuIiwgImltcG9ydCB7SUlmcmFtZUxvYWRlckNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IHR5cGUgVG9rZW5NYXAgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8IG51bWJlcj5cblxuY29uc3QgcmVwbGFjZVRva2VucyA9IChpbnB1dDogc3RyaW5nLCB0b2tlbk1hcDogVG9rZW5NYXApOiBzdHJpbmcgPT4ge1xuICAgIC8vIENyZWF0ZSBhIHJlZ2V4IHBhdHRlcm4gZnJvbSB0aGUga2V5cyBvZiB0aGUgdG9rZW5NYXBcbiAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyh0b2tlbk1hcCkuam9pbignfCcpLCAnZycpO1xuXG4gICAgLy8gUmVwbGFjZSB0b2tlbnMgaW4gdGhlIGlucHV0IHN0cmluZyB1c2luZyB0aGUgcmVnZXhcbiAgICByZXR1cm4gaW5wdXQucmVwbGFjZShwYXR0ZXJuLCAobWF0Y2hlZCkgPT4ge1xuICAgICAgICAvLyBSZXR1cm4gdGhlIHJlcGxhY2VtZW50IHZhbHVlIGZyb20gdGhlIHRva2VuTWFwXG4gICAgICAgIHJldHVybiAodG9rZW5NYXBbbWF0Y2hlZF0gfHwgbWF0Y2hlZCkudG9TdHJpbmcoKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUlmcmFtZVNraW5CeVRva2VuaXplciA9IChzZWxlY3RlZFNraW46IElTa2luQ29uZmlnLCB0b2tlbk1hcDogVG9rZW5NYXApID0+IHtcbiAgICBjb25zdCB0eXBlZFNraW5Db25maWcgPSAoc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKVxuICAgIGlmICh0eXBlZFNraW5Db25maWcudHlwZSAhPT0gJ0lmcmFtZUxvYWRlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpZnJhbWVTa2luVXJsVG9rZW5pemVyIHJlY2VpdmVkIHNraW4gd2l0aCBsb2FkZXIgdHlwZSBcIiR7dHlwZWRTa2luQ29uZmlnLnR5cGV9XCIsIGN1cnJlbnRseSBvbmx5IFwiSWZyYW1lTG9hZGVyXCIgaXMgc3VwcG9ydGVkYClcbiAgICB9XG5cbiAgICBzZWxlY3RlZFNraW4ubG9hZGVyID0ge1xuICAgICAgICAuLi5zZWxlY3RlZFNraW4ubG9hZGVyXG4gICAgfVxuXG4gICAgc2VsZWN0ZWRTa2luLmxvYWRlci51cmwgPSByZXBsYWNlVG9rZW5zKHNlbGVjdGVkU2tpbi5sb2FkZXIudXJsLCB0b2tlbk1hcCk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRTa2luO1xufVxuXG5leHBvcnQgY29uc3QgY2hhbmdlU2tpblVybEJ5VG9rZW5pemVyID0gKHRva2VuTWFwOiBUb2tlbk1hcCkgPT4ge1xuICAgIHJldHVybiBhc3luYyAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuICAgICAgICByZXR1cm4gY3JlYXRlSWZyYW1lU2tpbkJ5VG9rZW5pemVyKHNlbGVjdGVkU2tpbiwgdG9rZW5NYXApO1xuICAgIH1cbn0iLCAiaW1wb3J0IHtDdXN0b21SZWZNZXNzYWdlfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9ob3N0XCI7XG5cbi8vIGNvbnN0IHNwYWNlID0gJyAnO1xuLy8gZXhwb3J0IGNvbnN0IGdldENsYXNzZXMgPSBhc3luYyAoY29ubmVjdGVkUmVmOiBSZWYpOiBQcm9taXNlPHN0cmluZ1tdPiA9PiAoYXdhaXQgZXhlYyhhY3RBczxIVE1MRGl2RWxlbWVudD4oY29ubmVjdGVkUmVmKS5jbGFzc0xpc3QpKS52YWx1ZS5zcGxpdChzcGFjZSk7XG4vLyBleHBvcnQgY29uc3QgYWRkQ2xhc3MgPSBhc3luYyAoY29ubmVjdGVkUmVmOiBSZWYsIGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4vLyAgICAgY29uc3QgY2xhc3NlcyA9IGF3YWl0IGdldENsYXNzZXMoY29ubmVjdGVkUmVmKTtcbi8vICAgICBjbGFzc2VzLmluY2x1ZGVzKGNsYXNzTmFtZSkgfHwgY2xhc3Nlcy5wdXNoKGNsYXNzTmFtZSk7XG4vLyAgICAgLy8gQHRzLWlnbm9yZVxuLy8gICAgIGNvbm5lY3RlZFJlZi5jbGFzc0xpc3QgPSBjbGFzc2VzLmpvaW4oc3BhY2UpO1xuLy8gfVxuLy8gZXhwb3J0IGNvbnN0IHJlbW92ZUNsYXNzID0gYXN5bmMgKGNvbm5lY3RlZFJlZjogUmVmLCBjbGFzc05hbWU6IHN0cmluZywpID0+IHtcbi8vICAgICBsZXQgY2xhc3NlcyA9IGF3YWl0IGdldENsYXNzZXMoY29ubmVjdGVkUmVmKTtcbi8vICAgICAvLyBAdHMtaWdub3JlXG4vLyAgICAgY29ubmVjdGVkUmVmLmNsYXNzTGlzdCA9IGNsYXNzZXMuZmlsdGVyKGMgPT4gYyAhPT0gY2xhc3NOYW1lKS5qb2luKHNwYWNlKTtcbi8vIH1cbi8vXG4vL1xuXG5leHBvcnQgY29uc3QgYWRkQ2xhc3MgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgY2xhc3NOYW1lOiBzdHJpbmcsIG15b3BJZDogc3RyaW5nKSA9PiB7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIF9jbGFzc05hbWV9KSA9PiB7XG4gICAgICAgIHJlZj8uY2xhc3NMaXN0LmFkZChfY2xhc3NOYW1lKTtcbiAgICB9LCB7XG4gICAgICAgIGVsZW1lbnRJZDogbXlvcElkLFxuICAgICAgICBfY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgICB9KSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVDbGFzcyA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjbGFzc05hbWU6IHN0cmluZywgbXlvcElkOiBzdHJpbmcpID0+IHtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgX2NsYXNzTmFtZX0pID0+IHtcbiAgICAgICAgcmVmPy5jbGFzc0xpc3QucmVtb3ZlKF9jbGFzc05hbWUpO1xuICAgIH0sIHtcbiAgICAgICAgZWxlbWVudElkOiBteW9wSWQsXG4gICAgICAgIF9jbGFzc05hbWU6IGNsYXNzTmFtZVxuICAgIH0pKTtcbn0iLCAiaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZywgSUhUTUxMb2FkZXJDb25maWcsIElSZWZDb25maWcsXG4gICAgSVNraW5Mb2FkZXJDb25maWcsXG4gICAgSVNraW5TZWxlY3RvckNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZywgSVNraW5Db25maWdcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlscy50c1wiO1xuXG5leHBvcnQgY2xhc3MgU2tpbkNvbmZpZyBpbXBsZW1lbnRzIElTa2luQ29uZmlnIHtcbiAgICBfcnVuVGltZUluc3RhbmNlSWQgPSAncnVudGltZS1pbnN0YW5jZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVJZCA9ICdydW50aW1lLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZU5hbWUgPSAncnVudGltZS1uYW1lLScgKyB1dWlkdjQoKTtcblxuICAgIHN0YXRpYyBjcmVhdGUgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgU2tpbkNvbmZpZygpO1xuICAgIH1cblxuICAgIGlkID0gdGhpcy5fcnVuVGltZUlkO1xuICAgIG5hbWUgPSB0aGlzLl9ydW5UaW1lTmFtZTtcbiAgICBkZXNjcmlwdGlvbiA9ICcnO1xuICAgIGxvYWRlciA9IG51bGwgYXMgdW5rbm93biBhcyBJU2tpbkxvYWRlckNvbmZpZztcblxuICAgIHdpdGhMb2FkZXIgPSAobG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aEhUTUxMb2FkZXIgPSAobG9hZGVyOiBPbWl0PElIVE1MTG9hZGVyQ29uZmlnLCAndHlwZSc+KSA9PiB7XG4gICAgICAgIGxvYWRlci50eXBlID0gJ0hUTUxMb2FkZXInO1xuICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgYnVpbGQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBvbmVudENvbmZpZyBpbXBsZW1lbnRzIElDb21wb25lbnRDb25maWcge1xuICAgIF9ydW5UaW1lSW5zdGFuY2VJZCA9ICdydW50aW1lLWluc3RhbmNlLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZUlkID0gJ3J1bnRpbWUtaWQtJyArIHV1aWR2NCgpO1xuICAgIF9ydW5UaW1lTmFtZSA9ICdydW50aW1lLW5hbWUtJyArIHV1aWR2NCgpO1xuXG4gICAgc3RhdGljIGNyZWF0ZSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRDb25maWcoKTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZSA9IHtcbiAgICAgICAgaWQ6IHRoaXMuX3J1blRpbWVJbnN0YW5jZUlkLFxuICAgICAgICBjb21wb25lbnRJZDogdGhpcy5fcnVuVGltZUlkLFxuICAgICAgICBjb21wb25lbnROYW1lOiB0aGlzLl9ydW5UaW1lTmFtZSxcbiAgICAgICAgc2tpblNlbGVjdG9yOiBudWxsIGFzIHVua25vd24gYXMgSVNraW5TZWxlY3RvckNvbmZpZ1xuICAgIH0gYXMgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnO1xuXG4gICAgbmFtZSA9IHRoaXMuX3J1blRpbWVOYW1lXG4gICAgdHlwZSA9IHtcbiAgICAgICAgaWQ6IHRoaXMuX3J1blRpbWVJZCxcbiAgICAgICAgbmFtZTogdGhpcy5fcnVuVGltZU5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgcHJvcHM6IFtdLFxuICAgICAgICByZWZzOiBbXSxcbiAgICAgICAgc2tpbnM6IFtdLFxuICAgICAgICBkZWZhdWx0U2tpbjogMFxuICAgIH0gYXMgSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcblxuICAgIHdpdGhJbnN0YW5jZSA9IChpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aFR5cGUgPSAodHlwZTogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aE5hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhEZWZhdWx0U2tpbiA9IChkZWZhdWx0U2tpbjogSVNraW5Db25maWcpID0+IHtcbiAgICAgICAgdGhpcy50eXBlLnNraW5zLnB1c2goZGVmYXVsdFNraW4pO1xuICAgICAgICB0aGlzLnR5cGUuZGVmYXVsdFNraW4gPSB0aGlzLnR5cGUuc2tpbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICB0eXBlOiAnRGVkaWNhdGVkJyxcbiAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICBpZDogZGVmYXVsdFNraW4uaWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhSZWYgPSAocmVmOiBJUmVmQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMudHlwZS5yZWZzLnB1c2gocmVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aEJhc2ljUmVmID0gKHJlZlNlbGVjdG9yOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgbmV3QmFzaWNSZWYgPSB7XG4gICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICBuYW1lOiByZWZTZWxlY3RvcixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgIHNlbGVjdG9yVHlwZTogJ2lkLWF0dHJpYnV0ZScsXG4gICAgICAgICAgICBzZWxlY3RvcjogcmVmU2VsZWN0b3IsXG4gICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGFzIElSZWZDb25maWdcblxuICAgICAgICB0aGlzLnR5cGUucmVmcy5wdXNoKG5ld0Jhc2ljUmVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgYnVpbGQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMpKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge1xuICAgIElDb21wb25lbnRDb25maWcsXG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnLFxuICAgIElEZWRpY2F0ZWRTa2luQ29uZmlnLFxuICAgIElQcm9wQ29uZmlnLFxuICAgIElTa2luQ29uZmlnLFxuICAgIElVc2VyRmxvdyxcbiAgICBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyxcbiAgICB2Ml9JVmFyaWFudENvbmZpZ1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmNvbnN0IGNvbnZlcnRWMlZhcmlhbnRUb0NvbXBvbmVudENvbmZpZyA9IChjb25maWc6IHYyX0lWYXJpYW50Q29uZmlnKTogSUNvbXBvbmVudENvbmZpZyA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5zdGFuY2U6IHtcbiAgICAgICAgICAgIGlkOiAnYXV0bycsXG4gICAgICAgICAgICBjb21wb25lbnRJZDogY29uZmlnLmNvbXBvbmVudElkLFxuICAgICAgICAgICAgY29tcG9uZW50TmFtZTogY29uZmlnLm5hbWUsXG5cbiAgICAgICAgICAgIHNraW5TZWxlY3Rvcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdEZWRpY2F0ZWQnLFxuICAgICAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdza2luX2F1dG9fdjJfY29udmVydGVkJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWdcblxuICAgICAgICB9IGFzIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyxcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgaWQ6IGNvbmZpZy5pZCxcbiAgICAgICAgICAgIG5hbWU6IGNvbmZpZy5uYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHByb3BzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ2luX2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ215b3BfaW5pdF9pbnRlcmZhY2UnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYW55JyxcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gYXMgSVByb3BDb25maWcsXG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnb3V0X2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ215b3BfY3RhX2hhbmRsZXInLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYW55JyxcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gYXMgSVByb3BDb25maWdcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZWZzOiBbXSxcbiAgICAgICAgICAgIHNraW5zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ3NraW5fYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhhbmRsZSBlbXB0eSA6XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVyOiBjb25maWcuY29uc3VtZV92YXJpYW50WzBdLmxvYWRlclxuICAgICAgICAgICAgICAgIH0gYXMgSVNraW5Db25maWdcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBkZWZhdWx0U2tpbjogMFxuICAgICAgICB9IGFzIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBuYW1lOiBjb25maWcubmFtZVxuICAgIH0gYXMgSUNvbXBvbmVudENvbmZpZztcbn07XG5cbi8qKlxuICogQ2xvdWRSZXBvc2l0b3J5IC0gVW5pZmllZCBjbG91ZCBkYXRhIGFjY2VzcyBsYXllciBmb3IgTXlvcCBjb21wb25lbnRzXG4gKlxuICogU3VwcG9ydHMgYm90aCB2MiAoZGVmYXVsdCkgYW5kIHYxIG1vZGVzOlxuICogLSB2MjogVXNlcyAvY29uc3VtZSBlbmRwb2ludCBmb3IgZmV0Y2hpbmcgdmFyaWFudHNcbiAqIC0gdjE6IFVzZXMgL2Zsb3cgZW5kcG9pbnQgZm9yIGZldGNoaW5nIHVzZXIgZmxvd3NcbiAqL1xuLy8gVXNlIGEgZ2xvYmFsIHNpbmdsZXRvbiB0byBlbnN1cmUgb25seSBvbmUgQ2xvdWRSZXBvc2l0b3J5Lk1haW4gZXhpc3RzXG4vLyBldmVuIHdoZW4gdGhlIG1vZHVsZSBpcyBsb2FkZWQgbXVsdGlwbGUgdGltZXMgYnkgZGlmZmVyZW50IGJ1bmRsZXJzXG5jb25zdCBHTE9CQUxfS0VZID0gJ19fTVlPUF9DTE9VRF9SRVBPU0lUT1JZX01BSU5fXyc7XG5cbmNvbnN0IGdldEdsb2JhbE1haW4gPSAoKTogQ2xvdWRSZXBvc2l0b3J5IHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KVtHTE9CQUxfS0VZXTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gKGdsb2JhbFRoaXMgYXMgYW55KVtHTE9CQUxfS0VZXTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IHNldEdsb2JhbE1haW4gPSAoaW5zdGFuY2U6IENsb3VkUmVwb3NpdG9yeSkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAod2luZG93IGFzIGFueSlbR0xPQkFMX0tFWV0gPSBpbnN0YW5jZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAoZ2xvYmFsVGhpcyBhcyBhbnkpW0dMT0JBTF9LRVldID0gaW5zdGFuY2U7XG4gICAgfVxufTtcblxuZXhwb3J0IGNsYXNzIENsb3VkUmVwb3NpdG9yeSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX21haW46IENsb3VkUmVwb3NpdG9yeSB8IG51bGwgPSBudWxsO1xuXG4gICAgc3RhdGljIGdldCBNYWluKCk6IENsb3VkUmVwb3NpdG9yeSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGEgZ2xvYmFsIGluc3RhbmNlIGFscmVhZHkgZXhpc3RzIChmcm9tIGFub3RoZXIgYnVuZGxlKVxuICAgICAgICBjb25zdCBnbG9iYWxNYWluID0gZ2V0R2xvYmFsTWFpbigpO1xuICAgICAgICBpZiAoZ2xvYmFsTWFpbikge1xuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbE1haW47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgbmV3IGluc3RhbmNlIGlmIG5lZWRlZFxuICAgICAgICBpZiAoIUNsb3VkUmVwb3NpdG9yeS5fbWFpbikge1xuICAgICAgICAgICAgQ2xvdWRSZXBvc2l0b3J5Ll9tYWluID0gbmV3IENsb3VkUmVwb3NpdG9yeSgpO1xuICAgICAgICAgICAgc2V0R2xvYmFsTWFpbihDbG91ZFJlcG9zaXRvcnkuX21haW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDbG91ZFJlcG9zaXRvcnkuX21haW47XG4gICAgfVxuXG4gICAgLy8gdjIgY2FjaGUgLSBrZXllZCBieSBjb21wb25lbnRJZDplbnY6cHJldmlld3xsaXZlXG4gICAgcHJpdmF0ZSB2YXJpYW50czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPj4gPSB7fTtcblxuICAgIC8vIFRyYWNrIHdoaWNoIGNvbXBvbmVudHMgd2VyZSBwcmVsb2FkZWQgYW5kIHdpdGggd2hhdCBwYXJhbXNcbiAgICAvLyBLZXk6IGNvbXBvbmVudElkLCBWYWx1ZTogeyBlbnYsIHByZXZpZXcgfVxuICAgIHByaXZhdGUgcHJlbG9hZGVkQ29tcG9uZW50czogUmVjb3JkPHN0cmluZywgeyBlbnY6IHN0cmluZzsgcHJldmlldzogYm9vbGVhbiB9PiA9IHt9O1xuXG4gICAgLy8gdjEgY2FjaGVcbiAgICBwcml2YXRlIHVzZXJGbG93czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJVXNlckZsb3c+PiA9IHt9O1xuXG4gICAgcHJpdmF0ZSBfZGVmYXVsdEVudiA9ICdwcm9kdWN0aW9uJztcbiAgICBwcml2YXRlIF9lbnZFeHBsaWNpdGx5U2V0ID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9iYXNlVXJsID0gJ2h0dHBzOi8vY2xvdWQubXlvcC5kZXYnKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IGVudmlyb25tZW50IGZvciB0aGlzIENsb3VkUmVwb3NpdG9yeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHNldEVudmlyb25tZW50KGVudjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRFbnYgPSBlbnY7XG4gICAgICAgIHRoaXMuX2VudkV4cGxpY2l0bHlTZXQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBkZWZhdWx0IGVudmlyb25tZW50XG4gICAgICovXG4gICAgZ2V0RGVmYXVsdEVudmlyb25tZW50KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0RW52O1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PSBWMiBNZXRob2RzIChEZWZhdWx0KSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgY29tcG9uZW50IGlzIGFscmVhZHkgY2FjaGVkL3ByZWxvYWRlZCAodjIpXG4gICAgICogSWYgZW52IGFuZCBwcmV2aWV3IGFyZSBub3QgcHJvdmlkZWQsIGNoZWNrcyBpZiBBTlkgdmVyc2lvbiBpcyBwcmVsb2FkZWRcbiAgICAgKi9cbiAgICBpc1ByZWxvYWRlZChjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIElmIHNwZWNpZmljIGVudi9wcmV2aWV3IHJlcXVlc3RlZCwgY2hlY2sgZXhhY3QgbWF0Y2hcbiAgICAgICAgaWYgKGVudiAhPT0gdW5kZWZpbmVkIHx8IHByZXZpZXcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHtjb21wb25lbnRJZH06JHtlbnYgfHwgdGhpcy5fZGVmYXVsdEVudn06JHtwcmV2aWV3ID8gJ3ByZXZpZXcnIDogJ2xpdmUnfWA7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVLZXkgaW4gdGhpcy52YXJpYW50cztcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UgY2hlY2sgaWYgYW55IHZlcnNpb24gd2FzIHByZWxvYWRlZFxuICAgICAgICByZXR1cm4gY29tcG9uZW50SWQgaW4gdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcHJlbG9hZGVkIHBhcmFtcyBmb3IgYSBjb21wb25lbnQgKGlmIHByZWxvYWRlZClcbiAgICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBub3QgcHJlbG9hZGVkXG4gICAgICovXG4gICAgZ2V0UHJlbG9hZGVkUGFyYW1zKGNvbXBvbmVudElkOiBzdHJpbmcpOiB7IGVudjogc3RyaW5nOyBwcmV2aWV3OiBib29sZWFuIH0gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIHYyIGNvbXBvbmVudCBjb25maWdcbiAgICAgKiBJZiBlbnYvcHJldmlldyBub3Qgc3BlY2lmaWVkIGFuZCBjb21wb25lbnQgd2FzIHByZWxvYWRlZCwgdXNlcyBwcmVsb2FkZWQgcGFyYW1zXG4gICAgICovXG4gICAgYXN5bmMgZmV0Y2hDb21wb25lbnRWMihjb21wb25lbnRJZDogc3RyaW5nLCBlbnZpcm9ubWVudElkZW50aWZpZXI/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiB7XG4gICAgICAgIC8vIElmIG5vIGV4cGxpY2l0IGVudi9wcmV2aWV3IGFuZCBjb21wb25lbnQgd2FzIHByZWxvYWRlZCwgdXNlIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgICAgY29uc3QgcHJlbG9hZGVkID0gdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXTtcbiAgICAgICAgY29uc3QgaGFzRXhwbGljaXRQYXJhbXMgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgIT09IHVuZGVmaW5lZCB8fCBwcmV2aWV3ICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IGVudjogc3RyaW5nO1xuICAgICAgICBsZXQgdXNlUHJldmlldzogYm9vbGVhbjtcblxuICAgICAgICBpZiAoIWhhc0V4cGxpY2l0UGFyYW1zICYmIHByZWxvYWRlZCkge1xuICAgICAgICAgICAgLy8gVXNlIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgICAgICAgIGVudiA9IHByZWxvYWRlZC5lbnY7XG4gICAgICAgICAgICB1c2VQcmV2aWV3ID0gcHJlbG9hZGVkLnByZXZpZXc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBVc2UgcHJvdmlkZWQgcGFyYW1zIG9yIGRlZmF1bHRzXG4gICAgICAgICAgICBlbnYgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgfHwgdGhpcy5fZGVmYXVsdEVudjtcbiAgICAgICAgICAgIC8vIElmIHByZXZpZXcgZXhwbGljaXRseSB0cnVlIFx1MjE5MiB0cnVlXG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IGV4cGxpY2l0bHkgZmFsc2UgXHUyMTkyIGZhbHNlXG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IHVuZGVmaW5lZDogZW52IHdhcyBzcGVjaWZpZWQgKHZpYSBwYXJhbSBvciBzZXRFbnZpcm9ubWVudCkgXHUyMTkyIGZhbHNlLCBvdGhlcndpc2UgXHUyMTkyIHRydWVcbiAgICAgICAgICAgIGNvbnN0IGhhc0VmZmVjdGl2ZUVudiA9IGVudmlyb25tZW50SWRlbnRpZmllciB8fCB0aGlzLl9lbnZFeHBsaWNpdGx5U2V0O1xuICAgICAgICAgICAgdXNlUHJldmlldyA9IHByZXZpZXcgPT09IHRydWUgPyB0cnVlIDogKHByZXZpZXcgPT09IGZhbHNlID8gZmFsc2UgOiAhaGFzRWZmZWN0aXZlRW52KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7Y29tcG9uZW50SWR9OiR7ZW52fToke3VzZVByZXZpZXcgPyAncHJldmlldycgOiAnbGl2ZSd9YDtcblxuICAgICAgICBjb25zb2xlLmxvZygnW0Nsb3VkUmVwb3NpdG9yeV0gZmV0Y2hDb21wb25lbnRWMicsIHtcbiAgICAgICAgICAgIGNvbXBvbmVudElkOiBjb21wb25lbnRJZC5zbGljZSgwLCA4KSArICcuLi4nLFxuICAgICAgICAgICAgZW52LFxuICAgICAgICAgICAgdXNlUHJldmlldyxcbiAgICAgICAgICAgIGNhY2hlS2V5LFxuICAgICAgICAgICAgY2FjaGVkOiBjYWNoZUtleSBpbiB0aGlzLnZhcmlhbnRzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghdGhpcy52YXJpYW50c1tjYWNoZUtleV0pIHtcbiAgICAgICAgICAgIC8vIFRyYWNrIHRoaXMgYXMgcHJlbG9hZGVkIChmaXJzdCBmZXRjaCBjb3VudHMgYXMgcHJlbG9hZClcbiAgICAgICAgICAgIGlmICghdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF0gPSB7IGVudiwgcHJldmlldzogdXNlUHJldmlldyB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy52YXJpYW50c1tjYWNoZUtleV0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gYCR7dGhpcy5fYmFzZVVybH0vY29uc3VtZT9pZD0ke2NvbXBvbmVudElkfSZlbnY9JHtlbnZ9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VQcmV2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcmcHJldmlldz10cnVlJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhbnQgPSBqc29uLml0ZW07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvbXBvbmVudCBcIiR7Y29tcG9uZW50SWR9XCIgbm90IGZvdW5kYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYW50LmNvbnN1bWVfdmFyaWFudCB8fCAhdmFyaWFudC5jb25zdW1lX3ZhcmlhbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiBoYXMgbm8gaW1wbGVtZW50YXRpb24gZm9yIGVudmlyb25tZW50IFwiJHtlbnZ9XCJgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRDb25maWcgPSBjb252ZXJ0VjJWYXJpYW50VG9Db21wb25lbnRDb25maWcodmFyaWFudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvbXBvbmVudENvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy52YXJpYW50c1tjYWNoZUtleV07XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IFYxIE1ldGhvZHMgKExlZ2FjeSkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIHYxIGNvbXBvbmVudCBmcm9tIGEgZmxvd1xuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50VjEoY29tcG9uZW50SWQ6IHN0cmluZywgZmxvd0lkPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmbG93SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRJZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgdGhpcy5mZXRjaEF1dG9GbG93KGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJldHVybiBmbG93LmNvbXBvbmVudHNbMF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaEF1dG9GbG93KGNvbXBvbmVudElkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Y29tcG9uZW50SWR9JmF1dG89dHJ1ZWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoanNvbi5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF07XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hGbG93KGZsb3dJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VyRmxvd3NbZmxvd0lkXSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudXNlckZsb3dzW2Zsb3dJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Zmxvd0lkfSZyZXNvbHZlPWNvbXBvbmVudHNgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT0gQmFja3dhcmQgQ29tcGF0aWJpbGl0eSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBmZXRjaENvbXBvbmVudFYyIG9yIGZldGNoQ29tcG9uZW50VjEgZXhwbGljaXRseVxuICAgICAqIERlZmF1bHRzIHRvIHYxIGJlaGF2aW9yIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZVxuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZD86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaENvbXBvbmVudFYxKGNvbXBvbmVudElkLCBmbG93SWQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ2xvdWRSZXBvc2l0b3J5IGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IHYyX0Nsb3VkUmVwb3NpdG9yeSA9IENsb3VkUmVwb3NpdG9yeTtcbiIsICJleHBvcnQgY29uc3QgZXhlYyA9IGFzeW5jIChnZXR0ZXI6IGFueSkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBnZXR0ZXIoKVxufVxuIiwgImltcG9ydCB7IENsb3VkUmVwb3NpdG9yeSB9IGZyb20gXCIuL0Nsb3VkUmVwb3NpdG9yeVwiO1xuXG5sZXQgX2Nsb3VkUmVwb3NpdG9yeSA9IENsb3VkUmVwb3NpdG9yeS5NYWluO1xuXG5leHBvcnQgY29uc3QgZ2V0Q2xvdWRSZXBvc2l0b3J5ID0gKCkgPT4gX2Nsb3VkUmVwb3NpdG9yeTtcblxuZXhwb3J0IGNvbnN0IGlzUHJlbG9hZGVkID0gKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gX2Nsb3VkUmVwb3NpdG9yeS5pc1ByZWxvYWRlZChjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQcmVsb2FkZWRQYXJhbXMgPSAoY29tcG9uZW50SWQ6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBfY2xvdWRSZXBvc2l0b3J5LmdldFByZWxvYWRlZFBhcmFtcyhjb21wb25lbnRJZCk7XG59O1xuXG5leHBvcnQgY29uc3QgZW5hYmxlTG9jYWxEZXYgPSAoKSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoXCJodHRwOi8vbG9jYWxob3N0OjkyOTJcIik7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q2xvdWRSZXBvc2l0b3J5VXJsID0gKHVybDogc3RyaW5nKSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkodXJsKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDbG91ZFJlcG9zaXRvcnkgPSAocmVwb3NpdG9yeTogQ2xvdWRSZXBvc2l0b3J5KSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RW52aXJvbm1lbnQgPSAoZW52OiBzdHJpbmcpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5LnNldEVudmlyb25tZW50KGVudik7XG59O1xuXG5leHBvcnQgY29uc3QgcHJlbG9hZENvbXBvbmVudHMgPSBhc3luYyAoaWRzOiBzdHJpbmdbXSwgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbikgPT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICAgIGlkcy5tYXAoKGlkKSA9PiBfY2xvdWRSZXBvc2l0b3J5LmZldGNoQ29tcG9uZW50VjIoaWQsIGVudiwgcHJldmlldykpLFxuICAgICk7XG59O1xuIiwgImV4cG9ydCAqIGZyb20gXCIuL2FwcGx5U3R5bGVzaGVldFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaWZyYW1lU2tpblVybFRva2VuaXplclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY2xhc3NMaXN0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25maWdCdWlsZGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9DbG91ZFJlcG9zaXRvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V4ZWNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Nsb3VkUmVwb3NpdG9yeUhlbHBlcnNcIjsiLCAiaW1wb3J0IHtkZWNvbXByZXNzVVVJRHN9IGZyb20gXCIuLi91dGlscy91dWlkLnRzXCI7XG5pbXBvcnQge0Nsb3VkUmVwb3NpdG9yeX0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB7XG4gICAgRXhwZXJpZW5jZVR5cGVzLFxuICAgIElDb21wb25lbnRDb25maWcsIElEZWRpY2F0ZWRTa2luQ29uZmlnLFxuICAgIElTZWdtZW50ZWRTa2luQ29uZmlnLFxuICAgIElTZWdtZW50RXhwZXJpZW5jZSwgSVNraW5JbnN0YW5jZUNvbmZpZyxcbiAgICBTa2luU2VsZWN0b3JUeXBlc1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjb25zdCBjaGVja015b3BPdmVycmlkZSA9IGFzeW5jIChjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcpOiBQcm9taXNlPElDb21wb25lbnRDb25maWcgfCBudWxsPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy9UT0RPOiBzdXBwb3J0IGRpc2FibGluZyB0aGUgbWVjaGFuaXNtXG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zZWFyY2gpO1xuICAgICAgICBjb25zdCBteW9wT3ZlcnJpZGUgPSBwYXJhbXMuZ2V0KCdteW9wT3ZlcnJpZGUnKTtcbiAgICAgICAgaWYgKG15b3BPdmVycmlkZSkge1xuICAgICAgICAgICAgY29uc3QgW3NvdXJjZSwgLi4udXVpZHNdID0gZGVjb21wcmVzc1VVSURzKG15b3BPdmVycmlkZSk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoc291cmNlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tcG9uZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbY29tcG9uZW50SWQsIHNraW5JZF0gPSB1dWlkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VG9PdmVycmlkZSA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZG86IGNoZWNrIGZldGNoQXV0b0Zsb3cuIExvb2tzIGxpa2Ugb25seSBvbmUgc2tpbiBpcyByZXR1cm5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2tpbiA9IGNvbXBvbmVudFRvT3ZlcnJpZGUudHlwZS5za2lucy5maW5kKHNraW4gPT4gc2tpbi5pZCA9PT0gc2tpbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9kbzogZm9yIG5vdyBqdXN0IHNldCBza2luIGlkLiBDaGVjayB0aGUgY2xvdWQgaW1wbGVtZW50YXRpb25cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBza2luSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJU2tpbkluc3RhbmNlQ29uZmlnXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFRvT3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyAgICBjYXNlICdmbG93Jzoge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQgOiB7XG4gICAgICAgICAgICAgICAgICAgLy8gY29uc3QgW2Zsb3dJZCwgZXhwZXJpbWVudElkXSA9IHV1aWRzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbZmxvd0lkLCBleHBlcmltZW50SWRdID0gZGVjb21wcmVzc1VVSURzKG15b3BPdmVycmlkZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaEZsb3coZmxvd0lkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VG9PdmVycmlkZSA9IGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRDb25maWcudHlwZS5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IudHlwZSA9PT0gU2tpblNlbGVjdG9yVHlwZXMuU2VnbWVudGVkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRXhwZXJpZW5jZSA9IGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcy5maW5kKGUgPT4gZS5pZCA9PT0gZXhwZXJpbWVudElkKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRFeHBlcmllbmNlPy50eXBlID09PSBFeHBlcmllbmNlVHlwZXMuU2VnbWVudCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFJlc29sdmVkRXhwZXJpZW5jZSA9IHJlc29sdmVkRXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2VcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTa2luU2VsZWN0b3IgPSBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciBhcyBJU2VnbWVudGVkU2tpbkNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IHR5cGVkU2tpblNlbGVjdG9yLnNlZ21lbnRzLmZpbmQocyA9PiBzLnNlZ21lbnRJZCA9PT0gdHlwZWRSZXNvbHZlZEV4cGVyaWVuY2Uuc2VnbWVudC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0gc2VnbWVudD8uc2tpblNlbGVjdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUb092ZXJyaWRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBIb3N0IFNESyBpcyBkZXNpZ25lZCBmb3IgaW50ZWdyYXRpb24gd2l0aGluIHRoZSBob3N0IGFwcGxpY2F0aW9uIHRoYXQgc2VydmVzIGFzIHRoZSBjb250YWluZXIgZm9yIE15b3AgIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogSXQgcHJvdmlkZXMgZXNzZW50aWFsIGZ1bmN0aW9uYWxpdGllcyBhbmQgQVBJcyBmb3IgcmVnaXN0ZXJpbmcsIG1hbmFnaW5nLCBhbmQgY29tbXVuaWNhdGluZyB3aXRoIE15b3AgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBUaGlzIFNESyBlbmFibGVzIHNlYW1sZXNzIGVtYmVkZGluZyBvZiBpbmRlcGVuZGVudGx5IGRldmVsb3BlZCBjb21wb25lbnRzIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24sIGVuc3VyaW5nIHNtb290aCBpbnRlcm9wZXJhYmlsaXR5IGFuZCBjb25zaXN0ZW50IHVzZXIgZXhwZXJpZW5jZSBhY3Jvc3MgdmFyaW91cyBNeW9wIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbnMuXG4gKi9cbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuaW1wb3J0IHtJTXlvcExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBFbnZlbG9wZWRNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXNwb25zZSwgTWVzc2FnZURpcmVjdGlvbiwgUmVmXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wSWZyYW1lTG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL2lmcmFtZUxvYWRlclwiO1xuaW1wb3J0IHtXZWJjb21wb25lbnRMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvd2ViY29tcG9uZW50TG9hZGVyXCI7XG5pbXBvcnQgdHlwZSB7SWZyYW1lU0RLfSBmcm9tIFwiLi4vSWZyYW1lXCI7XG5pbXBvcnQge2Nvbm5lY3RQcm9wcywgY29ubmVjdFJlZnMsIGNyZWF0ZVJlZkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtcbiAgICBFeHBlcmllbmNlVHlwZXMsXG4gICAgSUNvbXBvbmVudENvbmZpZyxcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZywgSUV4cGVyaWVuY2UsIElGdW5jdGlvblJlc3VsdHNTZWdtZW50LCBJU2VnbWVudGVkU2tpbkNvbmZpZywgSVNlZ21lbnRFeHBlcmllbmNlLFxuICAgIElTa2luQ29uZmlnLCBJU2tpblNlbGVjdG9yQ29uZmlnLCBTa2luU2VsZWN0b3JUeXBlcyxcblxuXG59IGZyb20gXCIuLi9jb21tb25cIjtcbi8vIEB0cy1pZ25vcmUgaGFuZGxlZCBieSBjdXN0b20gZXNidWlsZCBwbHVnaW5cbmltcG9ydCB2ZXJzaW9uIGZyb20gXCJteW9wLXNkay12ZXJzaW9uXCI7XG5pbXBvcnQge0hUTUxDb21wb25lbnRMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlclwiO1xuaW1wb3J0IHtjaGVja015b3BPdmVycmlkZX0gZnJvbSBcIi4vbXlvcE92ZXJyaWRlLnRzXCI7XG5cbmludGVyZmFjZSBjb21wb25lbnRMb2FkZXJDcmVhdG9yIHtcbiAgICBuZXcobG9hZGVyczogSU15b3BMb2FkZXJbXSk6IGFueTtcbn1cblxuLy8gY29uc3QgZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGFzeW5jIChpZDogc3RyaW5nKSA9PiB7XG4vLyAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYGh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9jb21wb25lbnQ/aWQ9JHtpZH1gKTtcbi8vICAgICBjb25zdCBjb21wb25lbnREZWY6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gKGF3YWl0IHJlcy5qc29uKCkpLml0ZW07XG4vLyAgICAgcmV0dXJuIGNvbXBvbmVudERlZlxuLy8gfVxuXG4vL2NvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vZGZkbGsycDFtMTg3di5jbG91ZGZyb250Lm5ldC9teW9wX3Nkay5taW4uanMnXG5jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2Nkbi5teW9wLmRldi9zZGsvbmV4dC9teW9wX3Nkay5taW4uanMnXG5cbi8qKlxuICogVGhlIEhvc3QgU0RLIGlzIGRlc2lnbmVkIGZvciBpbnRlZ3JhdGlvbiB3aXRoaW4gdGhlIGhvc3QgYXBwbGljYXRpb24gdGhhdCBzZXJ2ZXMgYXMgdGhlIGNvbnRhaW5lciBmb3IgTXlvcCAgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBJdCBwcm92aWRlcyBlc3NlbnRpYWwgZnVuY3Rpb25hbGl0aWVzIGFuZCBBUElzIGZvciByZWdpc3RlcmluZywgbWFuYWdpbmcsIGFuZCBjb21tdW5pY2F0aW5nIHdpdGggTXlvcCBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGVuYWJsZXMgc2VhbWxlc3MgZW1iZWRkaW5nIG9mIGluZGVwZW5kZW50bHkgZGV2ZWxvcGVkIGNvbXBvbmVudHMgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbiwgZW5zdXJpbmcgc21vb3RoIGludGVyb3BlcmFiaWxpdHkgYW5kIGNvbnNpc3RlbnQgdXNlciBleHBlcmllbmNlIGFjcm9zcyB2YXJpb3VzIE15b3AgY29tcG9uZW50IGltcGxlbWVudGF0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvc3RTREsge1xuICAgIHN0YXRpYyBJbnN0YW5jZSA9ICgpID0+IHdpbmRvdy5teW9wLmhvc3RTREs7XG5cbiAgICBjb21wb25lbnRzMmluaXQ6IElNeW9wQ29tcG9uZW50W10gPSBbXTtcbiAgICBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdID0gW107XG4gICAgY29tcG9uZW50c0xvYWRlcnM6IElNeW9wTG9hZGVyW10gPSBbXTtcblxuICAgIHB1YmxpYyBpbml0aWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyB2ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIHR5cGUySW5zdGFuY2VDb3VudDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIHB1YmxpYyBhc3NpZ25JZCA9IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMudHlwZTJJbnN0YW5jZUNvdW50W2NvbXBvbmVudERlZmluaXRpb24uaWRdKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke2NvbXBvbmVudERlZmluaXRpb24uaWR9XyR7Kyt0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXX1gO1xuICAgIH1cblxuICAgIC8vVE9ETyA6IGZpeCB0aGUgaW5zcGVjdCBpbXBsZW1lbnRhdGlvbiBpbnNpZGUgcmVmQ29tcG9uZW50XG4gICAgLy90aGVuIGluc3BlY3RlZCBtYXliZSBjYW4gYmUgZHJvcHBlZFxuICAgIHByaXZhdGUgaW5zcGVjdGVkID0gZmFsc2U7XG4gICAgcHVibGljIGluc3BlY3QgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluc3BlY3RlZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLmluc3BlY3RlZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuaW5zcGVjdCkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbnNwZWN0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGluY29taW5nTWVzc2FnZUhhbmRsZXIgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudDxCYXNlTXlvcE1lc3NhZ2U+KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ2luY29taW5nTWVzc2FnZUhhbmRsZXIgR09UICcsIGV2ZW50KVxuICAgICAgICAvL1RPRE8gOiAgaWYgKGV2ZW50Lm9yaWdpbiAhPT0gXCJodHRwOi8vZXhhbXBsZS5vcmc6ODA4MFwiKSByZXR1cm47XG4gICAgICAgIGlmIChldmVudC5vcmlnaW4gPT09IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbikge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnSSBLbm93IHRoYXQgISEhJyk7XG4gICAgICAgICAgICAvLyAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJldmVudCBvbiBob3N0IHNpZGUgXCIsIGV2ZW50KTtcblxuICAgICAgICBpZiAoZXZlbnQuZGF0YS5teW9wKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5kaXJlY3Rpb24gIT09IE1lc3NhZ2VEaXJlY3Rpb24udXAgJiYgZXZlbnQuZGF0YS5tZXNzYWdlVHlwZSAhPT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdtZXNzYWdlIGRyb3BwZWQgaW4gaG9zdHNkaywgZGlyZWN0aW9uIHdhcyAnLCBldmVudC5kYXRhLmRpcmVjdGlvbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImV2ZW50IG9uIGhvc3Qgc2lkZSBcIiwgZXZlbnQpO1xuXG4gICAgICAgICAgICBjb25zdCBteW9wTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlID0gZXZlbnQuZGF0YTtcblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdFJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdC5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBJbml0TWVzc2FnZShjb21wb25lbnQuaWQpKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gY29tcG9uZW50cyAyIGluaXRcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCAhPT0gKG15b3BNZXNzYWdlIGFzIEluaXRSZXNwb25zZSkuY29udGVudC5pZClcblxuICAgICAgICAgICAgICAgIGNvbnN0IGluaXRpYXRlZENvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IChteW9wTWVzc2FnZSBhcyBJbml0UmVzcG9uc2UpLmNvbnRlbnQ/LmlkKTtcbiAgICAgICAgICAgICAgICBpbml0aWF0ZWRDb21wb25lbnQ/LnNldEluaXRpYXRlZCgpXG4gICAgICAgICAgICAgICAgLy9pbml0aWF0ZWRDb21wb25lbnQ/LnBhcmVudD8uc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IGlzIGl0IHRydWUgdG8gbm90IHBhc3MgZnVydGhlciAoIHRvIHRoZSBjb21wb25lbnQgKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gbXlvcE1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IHR5cGVkTWVzc2FnZS5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZE1lc3NhZ2UuZGlyZWN0aW9uID09PSBNZXNzYWdlRGlyZWN0aW9uLmRvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZE1lc3NhZ2UubWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gRXhlY3V0ZUNvbXBvbmVudE1ldGhvZC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50Lm9uTWVzc2FnZVJlY2VpdmVkKHR5cGVkTWVzc2FnZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVkTWVzc2FnZS5tZXNzYWdlLnJvdXRlID0gdHlwZWRNZXNzYWdlLnJvdXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5zZW5kKHR5cGVkTWVzc2FnZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gdHlwZWRNZXNzYWdlLm1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyQ29tcG9uZW50LnNlbmQodHlwZWRNZXNzYWdlLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIDogbG9nID9cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgLy9jb21wb25lbnQucmVmcy5ib2R5Lm9uTWVzc2FnZVJlY2VpdmVkKG15b3BNZXNzYWdlLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSBteW9wTWVzc2FnZS5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgLy9ubyBpbiBtZW0gY29tcG9uZW50XG4gICAgICAgICAgICAgICAgLy9wYXNzIHRvIHBhcmVudCBIb3N0U0RLIHRvIHRyeSBwcm9jZXNzIHRoZXJlXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5teW9wLklmcmFtZVNESykge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsubWVzc2FnZVRvSG9zdChteW9wTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQub25NZXNzYWdlUmVjZWl2ZWQobXlvcE1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL25vdCBwcm9jZXNzZWQgaW4gb25NZXNzYWdlUmVjZWl2ZWRcbiAgICAgICAgICAgICAgICAgICAgLy9wYXNzIHRvIHBhcmVudCBIb3N0U0RLIHRvIHRyeSBwcm9jZXNzIHRoZXJlXG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5JZnJhbWVTREspXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsubWVzc2FnZVRvSG9zdChteW9wTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXZlbnQuc291cmNlLnBvc3RNZXNzYWdlKFxuICAgICAgICAvLyAgICAgXCJoaSB0aGVyZSB5b3Vyc2VsZiEgIHRoZSBzZWNyZXQgcmVzcG9uc2UgXCIgKyBcImlzOiByaGVlZWVldCFcIixcbiAgICAgICAgLy8gICAgIGV2ZW50Lm9yaWdpbixcbiAgICAgICAgLy8gICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBzeW50aGV0aWNFdmVudCA9IG5ldyBNZXNzYWdlRXZlbnQ8QmFzZU15b3BNZXNzYWdlPignJyxcbiAgICAgICAgICAgIHtkYXRhOiBtZXNzYWdlfVxuICAgICAgICApXG5cbiAgICAgICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VIYW5kbGVyKHN5bnRoZXRpY0V2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdCA9IChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycz86IGNvbXBvbmVudExvYWRlckNyZWF0b3JbXSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaG9zdFNESyBhbHJlYWR5IGluaXRpYXRlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFzaWNMb2FkZXJzID0gW1xuICAgICAgICAgICAgbmV3IE15b3BJZnJhbWVMb2FkZXIoKSxcbiAgICAgICAgICAgIG5ldyBXZWJjb21wb25lbnRMb2FkZXIoKSxcbiAgICAgICAgICAgIG5ldyBIVE1MQ29tcG9uZW50TG9hZGVyKClcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHNMb2FkZXJzID0gW1xuICAgICAgICAgICAgLi4uYmFzaWNMb2FkZXJzXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzKSB7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgY29uc3QgbG9hZGVyQnlUeXBlOiBSZWNvcmQ8c3RyaW5nLCBJTXlvcExvYWRlcj4gPSB7fTtcblxuICAgICAgICAgICAgY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMuZm9yRWFjaChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9yID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21Mb2FkZXIgPSBuZXcgY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcih0aGlzLmNvbXBvbmVudHNMb2FkZXJzKTtcbiAgICAgICAgICAgICAgICBsb2FkZXJCeVR5cGVbY3VzdG9tTG9hZGVyLnR5cGVdID0gY3VzdG9tTG9hZGVyO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycy5mb3JFYWNoKGxvYWRlciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFsb2FkZXJCeVR5cGVbbG9hZGVyLnR5cGVdKVxuICAgICAgICAgICAgICAgICAgICBsb2FkZXJCeVR5cGVbbG9hZGVyLnR5cGVdID0gbG9hZGVyO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycyA9IE9iamVjdC52YWx1ZXMobG9hZGVyQnlUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluY29tbWluZyBtZXNzYWdlcyBmcm9tIElGcmFtZXNcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICBcIm1lc3NhZ2VcIixcbiAgICAgICAgICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlSGFuZGxlcixcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdteW9wIGhvc3RTREsgaW5pdGlhdGVkJywgZG9jdW1lbnQubG9jYXRpb24uaHJlZik7XG4gICAgICAgIHRoaXMuaW5pdGlhdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRTa2luSWRCeVNraW5TZWxlY3RvciA9IGFzeW5jIChza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWcsIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdID0gW10sIGhvb2tzPzogbG9hZGVySG9va3MpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICBhc3luYyBmdW5jdGlvbiBhc3luY0ZpbmQ8VD4oXG4gICAgICAgICAgICBhcnJheTogVFtdLFxuICAgICAgICAgICAgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gUHJvbWlzZTxib29sZWFuPlxuICAgICAgICApOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBhcnJheSkge1xuICAgICAgICAgICAgICAgIGlmIChhd2FpdCBwcmVkaWNhdGUoaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBubyBtYXRjaCBpcyBmb3VuZFxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChza2luU2VsZWN0b3IudHlwZSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY2FzZSBcIkRlZGljYXRlZFNraW5cIiA6IC8vYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgY2FzZSBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQ6IHtcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRTa2luSWQgPSAoc2tpblNlbGVjdG9yIGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnKS5za2luPy5pZFxuICAgICAgICAgICAgICAgICAgICB8fCAoc2tpblNlbGVjdG9yIGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnKS5za2lucyFbMF0uaWQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRTa2luSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZDoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2tpblNlbGVjdG9yID0gKHNraW5TZWxlY3RvciBhcyBJU2VnbWVudGVkU2tpbkNvbmZpZylcbiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gYXdhaXQgYXN5bmNGaW5kKHR5cGVkU2tpblNlbGVjdG9yLnNlZ21lbnRzLCBhc3luYyBzZWdtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQuc2VnbWVudElkID09PSAnRGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwZXJpZW5jZSA9IGV4cGVyaWVuY2VzLmZpbmQoZXhwZXJpZW5jZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZXJpZW5jZS50eXBlID09PSBFeHBlcmllbmNlVHlwZXMuU2VnbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2UpLnNlZ21lbnQuaWQgPT09IHNlZ21lbnQuc2VnbWVudElkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZXhwZXJpZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXhwZXJpZW5jZSBub3QgZm91bmRcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZEV4cGVyaWVuY2UgPSBleHBlcmllbmNlIGFzIElTZWdtZW50RXhwZXJpZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTZWdtZW50ID0gKHR5cGVkRXhwZXJpZW5jZS5zZWdtZW50IGFzIElGdW5jdGlvblJlc3VsdHNTZWdtZW50KVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRGdW5jdGlvbiA9IChob29rcyA/IGhvb2tzIDoge30pW3R5cGVkU2VnbWVudC5mdW5jdGlvbl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50RnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBzZWdtZW50RnVuY3Rpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBzZWdtZW50SWQ6JHtzZWdtZW50LnNlZ21lbnRJZH0sICR7dHlwZWRTZWdtZW50LmZ1bmN0aW9ufSBmdW5jdGlvbiBub3QgcHJvdmlkZWQgIWApXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VnbWVudClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yKHNlZ21lbnQuc2tpblNlbGVjdG9yLCBleHBlcmllbmNlcyk7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJycgLy9UT0RPXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBydW5Ta2luU2VsZWN0b3IgPSBhc3luYyAoY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBob29rcz86IGxvYWRlckhvb2tzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNraW5JZCA9IGF3YWl0IHRoaXMuX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IsIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzLCBob29rcyk7XG4gICAgICAgIHJldHVybiBjb21wb25lbnRDb25maWcudHlwZS5za2lucy5maW5kKHNraW4gPT4gc2tpbi5pZCA9PT0gc2tpbklkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZGVySG9va3M/OiBsb2FkZXJIb29rcztcblxuICAgIHB1YmxpYyBsb2FkQ29tcG9uZW50ID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50Pihjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50IHwgUmVmLCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucyk6XG4gICAgICAgIFByb21pc2U8VD4gPT4ge1xuXG4gICAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gY29udGFpbmVyIHdhcyBmb3VuZCBmb3IgdGhpcyBjb21wb25lbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG92ZXJyaWRkZW5Db25maWcgPSBhd2FpdCBjaGVja015b3BPdmVycmlkZShjb21wb25lbnRDb25maWcpO1xuICAgICAgICBpZiAob3ZlcnJpZGRlbkNvbmZpZykge1xuICAgICAgICAgICAgLy9UT0RPIDogbG9nXG4gICAgICAgICAgICBjb21wb25lbnRDb25maWcgPSBvdmVycmlkZGVuQ29uZmlnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLy8gQHRzLWlnbm9yZVxuICAgICAgICAvLyBpZiAoIWNvbnRhaW5lci5fX25vblByb3hpZWQpIHtcbiAgICAgICAgLy8gICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IChjb250YWluZXIgYXMgdW5rbm93biBhcyBNeW9wUmVmQ29tcG9uZW50KTtcbiAgICAgICAgLy8gICAgIC8vaWYgd2UgZ290IGxvYWRDb21wb25lbnQgb3ZlciBNeW9wUmVmQ29tcG9uZW50XG4gICAgICAgIC8vICAgICBpZiAocmVmQ29tcG9uZW50LmlkICYmIHJlZkNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ29tcG9uZW50KGNvbXBvbmVudENvbmZpZywgcmVmQ29tcG9uZW50LnJlZiwgb3B0aW9ucyk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgLy8gbGV0IHJvb3RDb21wb25lbnQ6IElNeW9wQ29tcG9uZW50ID0gcmVmQ29tcG9uZW50O1xuICAgICAgICAvLyAgICAgICAgIC8vIHdoaWxlKCFyb290Q29tcG9uZW50LmVsZW1lbnQgJiYgcm9vdENvbXBvbmVudC5wYXJlbnQpe1xuICAgICAgICAvLyAgICAgICAgIC8vICAgICByb290Q29tcG9uZW50ID0gcm9vdENvbXBvbmVudC5wYXJlbnRcbiAgICAgICAgLy8gICAgICAgICAvLyB9XG4gICAgICAgIC8vICAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICAvLyByb290Q29tcG9uZW50LmVsZW1lbnRcbiAgICAgICAgLy8gICAgICAgICAvLyAvL3doYXQgbm93ID9cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGNvbnN0IGhvb2tzID0gey4uLih0aGlzLmxvYWRlckhvb2tzID8/IHt9KSwgLi4uKG9wdGlvbnM/Lmhvb2tzID8/IHt9KX07XG5cbiAgICAgICAgY29uc3QgcmVmID0gY29udGFpbmVyIGFzIFJlZjtcbiAgICAgICAgaWYgKHJlZi5teW9wKSB7XG4gICAgICAgICAgICBpZiAocmVmLmNvbXBvbmVudCkge1xuXG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnID0gey4uLmNvbXBvbmVudENvbmZpZ307XG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5jb21wb25lbnRDb25maWcuaW5zdGFuY2VcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRTa2luID0gYXdhaXQgdGhpcy5ydW5Ta2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLCBob29rcykhXG4gICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RlZFNraW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicnVuU2tpblNlbGVjdG9yIGZhaWxlZCB0byBjaG9vc2Ugc2tpbiwgY2hlY2sgdGhlIHByb3ZpZGVkIGNvbmZpZ1wiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8uaG9va3M/LmFmdGVyU2tpblNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU2tpbiA9IGF3YWl0IG9wdGlvbnMuaG9va3MuYWZ0ZXJTa2luU2VsZWN0ZWQoey4uLnNlbGVjdGVkU2tpbn0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgc2tpbjogc2VsZWN0ZWRTa2luXG4gICAgICAgICAgICAgICAgICAgIC8vICBza2luczogW3NlbGVjdGVkU2tpbl1cbiAgICAgICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnXG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gey4uLm9wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLmhvb2tzXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gYXdhaXQgY3JlYXRlUmVmQ29tcG9uZW50PFQ+KHJlZiwgY29tcG9uZW50Q29uZmlnLCB0aGlzLmNvbXBvbmVudHMsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY29ubmVjdCByZWZzIGFuZCBwcm9wcyBpbnNvZGUgY3JlYXRlUmVmQ29tcG9uZW50LCBlbHNld2hlcmUgaXRzIG5vdCByZWFsbHkgPFQ+XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsb2FkIGNvbXBvbmVudCBnb3QgYSBkZXRhY2hlZCByZWYuJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lciBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvKipcbiAgICAgICAgICpcbiAgICAgICAgICogY2hvb3NlIHNraW4gb24gcnVudGltZSAuLi5cbiAgICAgICAgICogICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IudHlwZVxuICAgICAgICAgKi9cblxuICAgICAgICBsZXQgc2VsZWN0ZWRTa2luID0gYXdhaXQgdGhpcy5ydW5Ta2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLCBob29rcykhXG5cbiAgICAgICAgaWYgKCFzZWxlY3RlZFNraW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJ1blNraW5TZWxlY3RvciBmYWlsZWQgdG8gY2hvb3NlIHNraW4sIGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWdcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uaG9va3M/LmFmdGVyU2tpblNlbGVjdGVkKSB7XG4gICAgICAgICAgICBzZWxlY3RlZFNraW4gPSBhd2FpdCBvcHRpb25zLmhvb2tzLmFmdGVyU2tpblNlbGVjdGVkKHsuLi5zZWxlY3RlZFNraW59KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wb25lbnRMb2FkZXIgPSB0aGlzLmNvbXBvbmVudHNMb2FkZXJzLmZpbmQobG9hZGVyID0+IGxvYWRlci50eXBlID09PSBzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUpO1xuXG4gICAgICAgIGlmICghY29tcG9uZW50TG9hZGVyKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm8gbG9hZGVyIFwiJHtzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGV9XCIgd2FzIGZvdW5kIGZvciBjb21wb25lbnRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZm9yIGxvYWRlZCB3ZWJjb21wb25lbnQgbW9kdWxlcyB0byBmb2xsb3dpbmcgbGluZSBjcmVhdGVzIGEgcmFjZSBjb25kaXRpb24gd2l0aCB0aGUgaW5pdCBtZXNzYWdlIGZsb3dcbiAgICAgICAgbGV0IGNvbXBvbmVudCA9IGF3YWl0IGNvbXBvbmVudExvYWRlci5sb2FkKGNvbXBvbmVudENvbmZpZy50eXBlLCBzZWxlY3RlZFNraW4sIGNvbnRhaW5lciwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IHdoZW4gdGhpcyBpcyBub3QgdHJ1ZSA/XG4gICAgICAgIGlmICghY29tcG9uZW50LmlzSW5pdGlhdGVkKVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQucHVzaChjb21wb25lbnQpXG5cbiAgICAgICAgY29tcG9uZW50LmJpbmQoJ29uRGlzcG9zZScsICgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NvbXBvbmVudCBkaXNwb3NlJywgY29tcG9uZW50KTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50cy5maWx0ZXIoYyA9PiBjICE9PSBjb21wb25lbnQpXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdCA9IHRoaXMuY29tcG9uZW50czJpbml0LmZpbHRlcihjID0+IGMgIT09IGNvbXBvbmVudClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG5cbiAgICAgICAgLy8gdHJ1ZSBieSBkZWZhdWx0XG4gICAgICAgIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLmNvbm5lY3RQcm9wcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IG1ha2UgdHlwZSBmaWVsZCBjb25kaXRpb25hbCB0eXBlIGluZmVyIFwic3RyaW5nXCIgPiBzdHJpbmcsIFwibnVtYmVyXCIgPiBudW1iZXIsIGV0Yy4uLlxuICAgICAgICAgICAgY29tcG9uZW50ID0gY29ubmVjdFByb3BzKGNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLnR5cGUucHJvcHMsIHNlbGVjdGVkU2tpbik7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy9UT0RPIDogbWFrZSBvcHRpb25hbD9cbiAgICAgICAgICAgIC8vVE9ETyA6IGZpeCBpc3N1ZXMgd2l0aCB0aW1lb3V0IGFuZCB3cm9uZyByZWYgbmFtZXMgZnJvbSBjb25maWcgdnMgY3VycmVudCBza2luXG4gICAgICAgICAgICBhd2FpdCBjb25uZWN0UmVmcyhjb21wb25lbnQsIGNvbXBvbmVudENvbmZpZywgdGhpcy5jb21wb25lbnRzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAvLyBUT09EIDogdGhyb3cgP1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucz8uc2tpcEluaXQpXG4gICAgICAgICAgICBhd2FpdCBjb21wb25lbnQuaW5pdGlhdGVkKCk7XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudCBhcyBUO1xuICAgIH1cblxuICAgIHB1YmxpYyBuYXZpZ2F0ZSA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4oY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgbmV3Q29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBvcHRpb25zPzogbmF2aWdhdGlvbk9wdGlvbnMpID0+IHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmF2aWdhdGluZyBvbiByZW1vdGUgcmVmIGNvbXBvbmVudHMgaXMgbm90IGltcGxlbWVudGVkIHlldCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21wb25lbnQubWFya2VkRm9yRGlzcG9zZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIGlmIChvcHRpb25zPy5pbnBsYWNlKSB7XG4gICAgICAgIC8vICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgLy8gICAgICAgICBsZXQgbmV3Q29tcG9uZW50ID0gYXdhaXQgdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgICAgIGF3YWl0IG5ld0NvbXBvbmVudC5pbml0aWF0ZWQoKTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICBpZiAob3B0aW9ucy5pbml0KVxuICAgICAgICAvLyAgICAgICAgICAgICBhd2FpdCBvcHRpb25zLmluaXQobmV3Q29tcG9uZW50KTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50O1xuICAgICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJy4uLicpXG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uc3RhZ2VkKSB7XG4gICAgICAgICAgICAvL2NvbnN0IHNlbGVjdGVkU2tpbiA9IHRoaXMucnVuU2tpblNlbGVjdG9yKG5ld0NvbXBvbmVudENvbmZpZylcbiAgICAgICAgICAgIGxldCBuZXdDb21wb25lbnQgPSBhd2FpdCB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuY29udGFpbmVyLCB7XG4gICAgICAgICAgICAgICAgaGlkZGVuOiB0cnVlLFxuICAgICAgICAgICAgICAgIHJlbGF0aXZlOiB7ZGlyZWN0aW9uOiAnYWZ0ZXInLCBjaGlsZDogY29tcG9uZW50LmVsZW1lbnQhfSxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaW5pdClcbiAgICAgICAgICAgICAgICBhd2FpdCBvcHRpb25zLmluaXQobmV3Q29tcG9uZW50KTtcblxuICAgICAgICAgICAgbmV3Q29tcG9uZW50LnNob3coKTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBjb21wb25lbnQuZWxlbWVudCEubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgIGNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmNvbnRhaW5lciwge1xuICAgICAgICAgICAgICAgIHJlbGF0aXZlOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiZWZvcmVcIixcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQ6IG5leHRTaWJsaW5nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIG5hdmlnYXRpb25PcHRpb25zID0ge1xuICAgIHN0YWdlZD86IGJvb2xlYW4sXG4gICAgLy9pbnBsYWNlPzogYm9vbGVhbixcbiAgICBpbml0PzogKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQpID0+IFByb21pc2U8dm9pZD5cbiAgICBza2lwSW5pdD86IGJvb2xlYW5cbn0gJiBsb2FkZXJPcHRpb25zXG5cbnR5cGUgcmVsYXRpdmVMb2FkQ29uZmlnRGlyZWN0aW9uID0gJ2JlZm9yZScgfCAnYWZ0ZXInO1xuXG5cbmV4cG9ydCB0eXBlIGxvYWRlckhvb2tzID0ge1xuICAgIGFmdGVyU2tpblNlbGVjdGVkPzogKHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcpID0+IFByb21pc2U8SVNraW5Db25maWc+XG59ICZcbiAgICAvLyBzZWdtZW50YXRpb24gaG9va3NcbiAgICAoeyBba2V5OiBzdHJpbmddOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbiB9IHwge30pXG5cbi8vVE9ETzogc3VwcG9ydCBzZXJpYWxpemFibGUgdmVyc2lvbiBvZiB0aGF0IG9iamVjdFxuZXhwb3J0IGludGVyZmFjZSByZWxhdGl2ZUxvYWRDb25maWcge1xuICAgIC8vSWYgdGhpcyBpcyBudWxsLCB0aGVuIG5ld05vZGUgaXMgaW5zZXJ0ZWQgYXQgdGhlIGVuZCBvZiBub2RlJ3MgY2hpbGQgbm9kZXMuXG4gICAgLy9odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTm9kZS9pbnNlcnRCZWZvcmVcbiAgICBjaGlsZDogQ2hpbGROb2RlIHwgbnVsbFxuICAgIGRpcmVjdGlvbjogcmVsYXRpdmVMb2FkQ29uZmlnRGlyZWN0aW9uXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUVudmlyb25tZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxudHlwZSBFbGVtZW50QXR0cmlidXRlcyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgbG9hZGVyT3B0aW9ucyB7XG4gICAgaWQ/OiBzdHJpbmdcbiAgICBoaWRkZW4/OiBib29sZWFuXG4gICAgY29ubmVjdFByb3BzPzogYm9vbGVhblxuICAgIHRpbWVvdXQ/OiBudW1iZXJcbiAgICBza2lwSW5pdD86IGJvb2xlYW5cbiAgICByZWxhdGl2ZT86IHJlbGF0aXZlTG9hZENvbmZpZ1xuICAgIGhvb2tzPzogbG9hZGVySG9va3NcbiAgICBlbGVtZW50QXR0cmlidXRlcz86IEVsZW1lbnRBdHRyaWJ1dGVzXG4gICAgX2Vudmlyb25tZW50PzogSUVudmlyb25tZW50XG4gICAgX2hhc1BhcmVudD86IGJvb2xlYW5cbiAgICBfaW5zcGVjdGlvbj86IGJvb2xlYW5cbiAgICBkYXRhPzogYW55XG59XG5cbmlmICghd2luZG93Lm15b3ApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fXG4gICAgfTtcbn1cblxuaWYgKCF3aW5kb3cubXlvcC5ob3N0U0RLKSB7XG4gICAgY29uc3QgX2hvc3RTREsgPSBuZXcgSG9zdFNESygpO1xuICAgIC8vVE9ETzogZW5hYmxlIGxhenkgaW5pdD9cbiAgICBfaG9zdFNESy5pbml0KCk7XG5cbiAgICBpZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgICAgICB9O1xuICAgIH1cbiAgICB3aW5kb3cubXlvcC5ob3N0U0RLID0gX2hvc3RTREs7XG59XG5cbi8vIEB0cy1pZ25vcmVcbmV4cG9ydCBjb25zdCBob3N0U0RLOiBIb3N0U0RLID0gd2luZG93Lm15b3AuaG9zdFNESztcblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnaG9zdFNESycsIGhvc3RTREspO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIG15b3A6IHtcbiAgICAgICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fOiBzdHJpbmcsXG4gICAgICAgICAgICBob3N0U0RLOiBIb3N0U0RLLFxuICAgICAgICAgICAgSWZyYW1lU0RLOiBJbnN0YW5jZVR5cGU8dHlwZW9mIElmcmFtZVNESz5cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyLCBJRWxlbWVudFJlZiwgTXlvcEVsZW1lbnRSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UsIERldGVjdE15b3BSZWZzTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRGV0ZWN0TXlvcFJlZnNNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAobWVzc2FnZTogRGV0ZWN0TXlvcFJlZnNNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfV1gKTtcbiAgICAgICAgLy9jb25zdCBhbGxNeW9wSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAqYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBJRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgLy9sZXQgY291bnRlcnM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcblxuICAgICAgICBhbGxNeW9wSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgaWYgKG15b3BJZCkge1xuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSlcbiAgICAgICAgICAgIH0gLy9lbHNlIHtcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWNvdW50ZXJzW2l0ZW0udGFnTmFtZV0pIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgY291bnRlcnNbaXRlbS50YWdOYW1lXSA9IDA7XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIGNvdW50ZXJzW2l0ZW0udGFnTmFtZV0gPSBjb3VudGVyc1tpdGVtLnRhZ05hbWVdICsgMTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgICAgbXlvcFJlZnMucHVzaChuZXcgWFBhdGhFbGVtZW50UmVmKGAke2l0ZW0udGFnTmFtZX0oJHtjb3VudGVyc1tpdGVtLnRhZ05hbWVdfSlgLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UobWVzc2FnZS5oYW5kbGVyVW5pcXVlSWQsIG15b3BSZWZzKSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtCaW5kQ2xpY2tNZXNzYWdlLCBDbGlja1JlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBCaW5kQ2xpY2tNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKCksIGV2ZW50KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsZWFuVXBUYXNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goY2xlYW5VcFRhc2spO1xuICAgICAgICB9KTtcblxuICAgICAgICAvL2NsZWFuIHVwXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgTXlvcE1lc3NhZ2VzIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8Q2hhbmdlVGV4dE1lc3NhZ2U+IHtcbiAgXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ2hhbmdlVGV4dE1lc3NhZ2U7XG4gICAgXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IENoYW5nZVRleHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGl0ZW0udGV4dENvbnRlbnQgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXIsIFJvb3RSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRXhlY3V0ZVNjcmlwdE1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCByZXBsaWVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgZGF0YSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IoZXZlbnQsIHJlcGxpZXIsIG5ldyBSb290UmVmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLCBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5BZGRFdmVudExpc3RlbmVyTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKG1lc3NhZ2U6IEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlKSA9PiB7XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKG1lc3NhZ2UucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogYW55W10gPSBbXTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy9UT0RPOiB0aGluayBhYm91dCB0aGF0IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZShtZXNzYWdlLmhhbmRsZXJVbmlxdWVJZCwgbWFrZVNlcmlhbGl6YWJsZShlLCBtZXNzYWdlLnNlcmlhbGl6YWJsZVNrZWxldG9uKSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihtZXNzYWdlLnR5cGUsIGhhbmRsZXIpXG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKG1lc3NhZ2UudHlwZSwgaGFuZGxlcilcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4ge1xuICAgICAgICAgICAgICAgIHRhc2soKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldEF0dHJpYnV0ZU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3Mgc2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxTZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFNldEF0dHJpYnV0ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSwgZXZlbnQudmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7SG9zdFNES30gZnJvbSBcIi4uLy4uL2hvc3QvaG9zdFNES1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UudHNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgY3JlYXRlUmVmID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy9UT0RPIDogdXNlIHJlZiBoZWxwZXIgaGVyZVxuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuICAgICAgICAgICAgaWYgKGFsbEl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RTREsgPSBIb3N0U0RLLkluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gYXdhaXQgaG9zdFNESy5sb2FkQ29tcG9uZW50KGV2ZW50Lm5lc3RlZENvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuaXRlbSgwKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucylcblxuICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgaXQgdG8gcGFzcyB0aGUgYXNzaWduZWQgaWRzXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkUmVmQ29uZmlnOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmVmQ29tcG9uZW50LnJlZnMpLmZvckVhY2gocmVmTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWYgPSByZWZDb21wb25lbnQucmVmc1tyZWZOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgcmVmID0gcmVmLl9fbm9uUHJveGllZCB8fCByZWY7XG5cbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlZkNvbmZpZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbmVzdGVkUmVmQ29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIC0gRE9NIGVsZW1lbnQgbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgW10sIHRydWUpKTtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNyZWF0ZVJlZigpLnRoZW4oKTtcbiAgICAgICAgLy9yZXR1cm5pbmcgdW5kZWZpbmVkIHNvIGl0IHdvbid0IGFjdCBhcyBhIGNsZWFudXBcbiAgICB9XG59XG4iLCAiLy8gQHRzLW5vY2hlY2tcbmV4cG9ydCBjb25zdCBvYnNlcnZlRE9NID0gKG9iajogSFRNTEVsZW1lbnQgfCBudWxsLCBjYWxsYmFjazogKG11dGF0aW9uUmVjb3Jkcz86IE11dGF0aW9uUmVjb3JkW10pID0+IHZvaWQpID0+IHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgICBjb25zb2xlLmxvZygnbicpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBNdXRhdGlvbk9ic2VydmVyID0gd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgfHwgd2luZG93LldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG5cbiAgICBpZiAoIW9iaiB8fCBvYmoubm9kZVR5cGUgIT09IDEpIHJldHVybjtcblxuICAgIGlmIChNdXRhdGlvbk9ic2VydmVyKSB7XG4gICAgICAgIC8vIGRlZmluZSBhIG5ldyBvYnNlcnZlclxuICAgICAgICBjb25zdCBtdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spXG4gICAgICAgIC8vIGhhdmUgdGhlIG9ic2VydmVyIG9ic2VydmUgZm9yIGNoYW5nZXMgaW4gY2hpbGRyZW5cbiAgICAgICAgY29uc3QgY29uZmlnID0ge2F0dHJpYnV0ZXM6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZX07XG4gICAgICAgIG11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZShvYmosIGNvbmZpZylcbiAgICAgICAgcmV0dXJuIG11dGF0aW9uT2JzZXJ2ZXJcbiAgICB9XG5cbiAgICAvLyBicm93c2VyIHN1cHBvcnQgZmFsbGJhY2tcbiAgICBlbHNlIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZUluc2VydGVkJywgY2FsbGJhY2ssIGZhbHNlKVxuICAgICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZVJlbW92ZWQnLCBjYWxsYmFjaywgZmFsc2UpXG4gICAgfVxufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge29ic2VydmVET019IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvZG9tT2JzZXJ2ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFNldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuc291cmNlKSB7XG4gICAgICAgICAgICBvYnNlcnZlRE9NKGRvY3VtZW50LmJvZHksICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlKClcbiAgICAgICAgICAgICAgICAgICAgLy8gIG5ldyBFbnZlbG9wZWRNZXNzYWdlKGV2ZW50LnNvdXJjZSEsIG5ldyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSgpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlLCBGb3JtRGF0YUVudHJ5LCBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBJbnB1dEVsZW1lbnRWYWx1ZSx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5jb25zdCBnZXRJbnB1dFZhbHVlID0gKGVsZW1lbnQpOiBJbnB1dEVsZW1lbnRWYWx1ZSA9PiB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBmb3JtXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBkYXRhT2JqZWN0OiBJbnB1dEVsZW1lbnRWYWx1ZSA9IHtcbiAgICAgICAgICAgIGZvcm1EYXRhOiB7fSxcbiAgICAgICAgICAgIHVubWFwcGVkRGF0YTogW11cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBNYW51YWxseSBhZGQgZWxlbWVudHMgd2l0aG91dCBuYW1lc1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKTtcbiAgICAgICAgbGV0IGF1dG9OYW1lSW5kZXhlciA9IC0xO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcElkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gYF8keygrK2F1dG9OYW1lSW5kZXhlcil9YFxuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZURhdGE6IEZvcm1EYXRhRW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRJbnB1dFZhbHVlKGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZWxlbWVudC5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHk6IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudC52YWxpZGl0eSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgIG15b3BJZCxcbiAgICAgICAgICAgICAgICB9O1xuXG5cbiAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBpZighZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSB8fCAhZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSB8fCBub2RlRGF0YS52YWx1ZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjaGVja2JveCBvciByYWRpbyBidXR0b25cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW1lbnQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jaGVja2VkID8gZWxlbWVudC52YWx1ZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGlucHV0IGFuZCB0ZXh0YXJlYSBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC50YWdOYW1lID09PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWxlY3QgZWxlbWVudHMgKGRyb3Bkb3ducylcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0VMRUNUJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZWRpdGFibGUgZGl2cyAoY29udGVudEVkaXRhYmxlKVxuICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmlubmVyVGV4dCB8fCBlbGVtZW50LnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYW4gdW5zdXBwb3J0ZWQgZWxlbWVudCB0eXBlXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogR2V0RWxlbWVudFZhbHVlTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgZ2V0SW5wdXRWYWx1ZShpdGVtKVxuICAgICAgICAgICAgKSwgZXZlbnQpO1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0dldEF0dHJpYnV0ZU1lc3NhZ2UsIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRGaXJzdEVsZW1lbnRCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgR2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxHZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5HZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEdldEF0dHJpYnV0ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGdldEZpcnN0RWxlbWVudEJ5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpXG4gICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UoaXRlbS5nZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSkpLCBldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtSZXNpemVPYnNlcnZlck1lc3NhZ2UsIFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZX0gZnJvbSAnLi4vLi4vbWVzc2FnZXMnXG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRSZXNpemVPYnNlcnZlckhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8U2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlXG5cbiAgICBleGVjdXRvciA9IChldmVudDogU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICAvL1RPRE8gOiBwYXNzIHRoZSBoZWlnaHRcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVzaXplT2JzZXJ2ZXJNZXNzYWdlKCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5KTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldElubmVySHRtbH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWxIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFNldElubmVySHRtbD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0SW5uZXJIdG1sO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFNldElubmVySHRtbCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpdGVtLmlubmVySFRNTCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgSWZyYW1lIFNESyBpcyBpbnRlbmRlZCBmb3Igc2NlbmFyaW9zIHdoZXJlIGRldmVsb3BlcnMgd2lzaCB0byBpbXBsZW1lbnQgTXlvcCBjb21wb25lbnRzIGFzIHNlcGFyYXRlIHdlYiBhcHBsaWNhdGlvbnMgaG9zdGVkIHdpdGhpbiBpZnJhbWVzLjxici8+PGJyLz5cbiAqIEJ5IGltcG9ydGluZyB0aGUgSWZyYW1lIFNESywgZGV2ZWxvcGVycyBnYWluIGFjY2VzcyB0byB0b29scyBhbmQgdXRpbGl0aWVzIG5lY2Vzc2FyeSBmb3IgaGFuZGxpbmcgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBob3N0IGFwcGxpY2F0aW9uIGFuZCB0aGUgZW1iZWRkZWQgaWZyYW1lLWJhc2VkIE15b3AgY29tcG9uZW50czxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGZhY2lsaXRhdGVzIHNlY3VyZSBpc29sYXRpb24sIGFsbG93aW5nIGNvbXBvbmVudHMgdG8gZnVuY3Rpb24gaW5kZXBlbmRlbnRseSB3aGlsZSBzdGlsbCBiZW5lZml0aW5nIGZyb20gdGhlIG92ZXJhbGwgc3RydWN0dXJlIGFuZCBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyBwcm92aWRlZCBieSB0aGUgaG9zdCBhcHBsaWNhdGlvbi48YnIvPjxici8+XG4gKlxuIE9uY2UgbG9hZGVkIHRoZSBgUm9vdFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiBgYGBqc1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuIG9yXG4gYGBgdHNcbiBpbXBvcnQge2dldElmcmFtZU1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCBnZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gb3JcbiBgYGB0c1xuIGltcG9ydCB7SWZyYW1lU0RLfSBmcm9tICdAbXlvcC9zZGsvaWZyYW1lJztcbiBgYGBcbiAqXG4gKi9cbmltcG9ydCB7QmFzZU15b3BTREt9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7RGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge0JpbmRPbkNsaWNrSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlclwiO1xuaW1wb3J0IHtDaGFuZ2VUZXh0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXJcIjtcbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuaW1wb3J0IHtBZGRFdmVudExpc3RlbmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyXCI7XG5pbXBvcnQge3NldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyXCI7XG5pbXBvcnQge1xuICAgIEluaXRSZXF1ZXN0LFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtTZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL1NldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyXCI7XG5pbXBvcnQge0dldEVsZW1lbnRWYWx1ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzXCI7XG4vLyBAdHMtaWdub3JlIGhhbmRsZWQgYnkgY3VzdG9tIGVzYnVpbGQgcGx1Z2luXG5pbXBvcnQgdmVyc2lvbiBmcm9tIFwibXlvcC1zZGstdmVyc2lvblwiO1xuaW1wb3J0IHtHZXRBdHRyaWJ1dGVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZ2V0QXR0cmlidXRlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTZXRSZXNpemVPYnNlcnZlckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9TZXRSZXNpemVPYnNlcnZlckhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHNcIjtcblxuLyoqXG4gVGhlIElmcmFtZSBTREsgaXMgaW50ZW5kZWQgZm9yIHNjZW5hcmlvcyB3aGVyZSBkZXZlbG9wZXJzIHdpc2ggdG8gaW1wbGVtZW50IE15b3AgY29tcG9uZW50cyBhcyBzZXBhcmF0ZSB3ZWIgYXBwbGljYXRpb25zIGhvc3RlZCB3aXRoaW4gaWZyYW1lcy48YnIvPjxici8+XG4gQnkgaW1wb3J0aW5nIHRoZSBJZnJhbWUgU0RLLCBkZXZlbG9wZXJzIGdhaW4gYWNjZXNzIHRvIHRvb2xzIGFuZCB1dGlsaXRpZXMgbmVjZXNzYXJ5IGZvciBoYW5kbGluZyBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGhvc3QgYXBwbGljYXRpb24gYW5kIHRoZSBlbWJlZGRlZCBpZnJhbWUtYmFzZWQgTXlvcCBjb21wb25lbnRzPGJyLz48YnIvPlxuIFRoaXMgU0RLIGZhY2lsaXRhdGVzIHNlY3VyZSBpc29sYXRpb24sIGFsbG93aW5nIGNvbXBvbmVudHMgdG8gZnVuY3Rpb24gaW5kZXBlbmRlbnRseSB3aGlsZSBzdGlsbCBiZW5lZml0aW5nIGZyb20gdGhlIG92ZXJhbGwgc3RydWN0dXJlIGFuZCBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyBwcm92aWRlZCBieSB0aGUgaG9zdCBhcHBsaWNhdGlvbi48YnIvPjxici8+XG5cbiBPbmNlIGxvYWRlZCB0aGUgYFJvb3RTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gYGBganNcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiBvclxuIGBgYHRzXG4gaW1wb3J0IHtnZXRJZnJhbWVNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuICovXG5leHBvcnQgY2xhc3MgSWZyYW1lU0RLIGV4dGVuZHMgQmFzZU15b3BTREsge1xuXG4gICAgcHVibGljIHZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKCF3aW5kb3cubXlvcCkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgd2luZG93Lm15b3AgPSB7fVxuICAgICAgICB9XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLID0gdGhpcztcbiAgICB9XG5cbiAgICBtZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKCFtZXNzYWdlLnJlcGxheVRvSGFuZGxlciAmJiByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkKVxuICAgICAgICAgICAgbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUby5oYW5kbGVyVW5pcXVlSWRcblxuICAgICAgICBjb25zdCBjb21wb25lbnRJZHMgPSBPYmplY3Qua2V5cyh0aGlzLmNvbXBvbmVudHMpO1xuXG4gICAgICAgIGlmICghbWVzc2FnZS5kZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgaWYgKHJlcGxheVRvPy5yb3V0ZSkge1xuICAgICAgICAgICAgICAgIC8vIHRha2luZyB0aGUgZmlyc3QgY29tcG9uZW50IHRoYXQgaW5pdGlhdGVkIHRoYXQgY3ljbGVcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gcmVwbGF5VG8ucm91dGVbcmVwbGF5VG8ucm91dGUubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSBjb21wb25lbnRJZHNbMF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2Uuc291cmNlKVxuICAgICAgICAgICAgbWVzc2FnZS5zb3VyY2UgPSBjb21wb25lbnRJZHNbMF07XG5cbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLnVwXG5cbiAgICAgICAgd2luZG93LnBhcmVudD8ucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgLi4ubWVzc2FnZVxuICAgICAgICB9LCAnKicpO1xuICAgIH1cblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXSA9IFtcbiAgICAgICAgbmV3IENoYW5nZVRleHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBTZXRJbm5lckh0bWxIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBCaW5kT25DbGlja0hhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEV4ZWN1dGVTY3JpcHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBBZGRFdmVudExpc3RlbmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgc2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgR2V0RWxlbWVudFZhbHVlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IFNldFJlc2l6ZU9ic2VydmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgR2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuXG4gICAgICAgIC8vY29tcG9zaXRlIHN1cHBvcnQgbWVzc2FnZXMgOlxuICAgICAgICBuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KVxuICAgIF07XG5cbiAgICBwdWJsaWMgaW5pdCA9ICgpID0+IHtcbiAgICAgICAgd2luZG93Lm9ubWVzc2FnZSA9IHRoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXMuYmluZCh0aGlzKVxuICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXF1ZXN0KCkpXG4gICAgfVxuXG59XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ0lmcmFtZVNESycsIElmcmFtZVNESyk7XG4iLCAiaW1wb3J0ICogYXMgYWxsIGZyb20gJy4vaW5kZXgnXG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcblxuY29uc3QgTXlvcE1lc3NhZ2VzID0ge1xuICAgIC4uLmFsbFxufVxuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdNeW9wTWVzc2FnZXMnLCBNeW9wTWVzc2FnZXMpO1xuIiwgImltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50c1wiO1xuaW1wb3J0ICogYXMgTXlvcEhlbHBlcnMgZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnTXlvcEhlbHBlcnMnLCBNeW9wSGVscGVycyk7XG4iLCAiaW1wb3J0ICcuL2R5bmFtaWNJbXBvcnQvbG9hZF9fZmVkZXJhdGlvbl9fJztcbi8vIEB0cy1pZ25vcmUgaGFuZGxlZCBieSBjdXN0b20gZXNidWlsZCBwbHVnaW5cbmltcG9ydCB2ZXJzaW9uIGZyb20gXCJteW9wLXNkay12ZXJzaW9uXCI7XG5cbmNvbnNvbGUubG9nKCdteW9wIHJvb3Qgc2RrIC0gbG9hZGVkJywgZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKTtcblxuLy8gVE9ETyA6IHJlYWQgdmFsdWUgZnJvbSB3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ10gP1xuLy9jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2RmZGxrMnAxbTE4N3YuY2xvdWRmcm9udC5uZXQvbXlvcF9zZGsubWluLmpzJ1xuY29uc3QgX19ST09UX1NES19QVUJMSUNfVVJMX18gPSAnaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQvbXlvcF9zZGsubWluLmpzJ1xuXG5jb25zdCBnZXRIb3N0TW9kdWxlID0gKCkgPT4gaW1wb3J0KCcuL2hvc3QvaG9zdFNESycpXG5jb25zdCBnZXRJZnJhbWVNb2R1bGUgPSAoKSA9PiBpbXBvcnQoJy4vSWZyYW1lL0lmcmFtZVNESycpXG5jb25zdCBnZXRXZWJjb21wb25lbnRNb2R1bGUgPSAoKSA9PiBpbXBvcnQoJy4vd2ViY29tcG9uZW50L1dlYkNvbXBvbmVudFNESycpXG5jb25zdCBnZXRNeW9wTWVzc2FnZXMgPSAoKSA9PiBpbXBvcnQoJy4vbWVzc2FnZXMvTXlvcE1lc3NhZ2VzJylcbmNvbnN0IGdldE15b3BIZWxwZXJzID0gKCkgPT4gaW1wb3J0KCcuL2hlbHBlcnMvTXlvcEhlbHBlcnMnKVxuXG5jb25zdCBleHBvc2VHbG9iYWxseSA9IChpbXBvcnRGdW5jdGlvbjogKCkgPT4gUHJvbWlzZTxhbnk+KSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiBhc3luYyAoKSA9PiAoYXdhaXQgaW1wb3J0RnVuY3Rpb24oKSkuZ2V0KClcbn1cblxuLy8gRm9yIHNjcmlwdC9nbG9iYWwgdXNhZ2UgOlxuY29uc3Qgcm9vdFNESyA9IHtcbiAgICB2ZXJzaW9uIDogdmVyc2lvbixcbiAgICBnZXRIb3N0TW9kdWxlOiBleHBvc2VHbG9iYWxseShnZXRIb3N0TW9kdWxlKSxcbiAgICBnZXRJZnJhbWVNb2R1bGU6IGV4cG9zZUdsb2JhbGx5KGdldElmcmFtZU1vZHVsZSksXG4gICAgZ2V0V2ViY29tcG9uZW50TW9kdWxlOiBleHBvc2VHbG9iYWxseShnZXRXZWJjb21wb25lbnRNb2R1bGUpLFxuICAgIGdldE15b3BNZXNzYWdlczogZXhwb3NlR2xvYmFsbHkoZ2V0TXlvcE1lc3NhZ2VzKSxcbiAgICBnZXRNeW9wSGVscGVyczogZXhwb3NlR2xvYmFsbHkoZ2V0TXlvcEhlbHBlcnMpXG59O1xuXG4vLyBAdHMtaWdub3JlXG5pZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgIH1cbn1cblxuLy8gQHRzLWlnbm9yZVxuaWYgKCF3aW5kb3cubXlvcC5yb290U0RLKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJvb3RTREssXG4gICAgICAgIC4uLndpbmRvdy5teW9wXG4gICAgfTtcbn0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coXCJteW9wIHJvb3QgaG9zdCBsb2FkZWQgbW9yZSB0aGFuIG9uY2UuXCIpO1xufVxuXG4vLyBGb3IgYnVuZGxlcnMgdXNhZ2UgOlxuY29uc3Qgc2RrTW9kdWxlID0ge1xuICAgIGdldEhvc3RNb2R1bGUsXG4gICAgZ2V0SWZyYW1lTW9kdWxlLFxuICAgIGdldFdlYmNvbXBvbmVudE1vZHVsZVxufVxuZXhwb3J0IHR5cGUgcm9vdFNES1R5cGUgPSB0eXBlb2Ygc2RrTW9kdWxlO1xuXG5leHBvcnQge1xuICAgIGdldEhvc3RNb2R1bGUsXG4gICAgZ2V0SWZyYW1lTW9kdWxlLFxuICAgIGdldFdlYmNvbXBvbmVudE1vZHVsZVxufVxuXG4vLyBkZWNsYXJlIGdsb2JhbCB7XG4vLyAgICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4vLyAgICAgICAgIG15b3A6IHtcbi8vICAgICAgICAgICAgIHJvb3RTREs6IHR5cGVvZiByb290U0RLXG4vLyAgICAgICAgIH1cbi8vICAgICB9XG4vLyB9XG4iLCAiLy8gQHRzLW5vY2hlY2tcbmltcG9ydCB7bW9kdWxlSW5zdGFuY2VLZXksIG9uTG9hZEtleX0gZnJvbSBcIi4vZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuXG5pZiAoIXdpbmRvd1snX19mZWRlcmF0aW9uX18nXSkge1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHNjcmlwdFNyYyA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/LnNyYztcbiAgICBjb25zdCBfX3B1YmxpY19hdXRvX3BhdGhfXyA9IHNjcmlwdFNyYyA/IHNjcmlwdFNyYy5zcGxpdCgnLycpLnNsaWNlKDAsIC0xKS5qb2luKCcvJykgOiAnJztcblxuICAgIHdpbmRvd1snX19mZWRlcmF0aW9uX18nXSA9IHtcbiAgICAgICAgX19wdWJsaWNfYXV0b19wYXRoX18sXG4gICAgICAgIF9fdXNlX3B1YmxpY19hdXRvX3BhdGhfXzogdHJ1ZSxcbiAgICAgICAgX19wdWJsaWNfcGF0aF9fOiB1bmRlZmluZWQsXG4gICAgICAgIF9fbG9hZGluZ190aW1lb3V0X18gOiA1ICogMTAwMFxuICAgIH07XG59IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKCdfX2ZlZGVyYXRpb25fXyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UuJyk7XG59XG5cbndpbmRvd1snX19mZWRlcmF0aW9uX18nXVsnbG9hZF9fZmVkZXJhdGlvbl9fJ10gPSAoc2NyaXB0RmlsZVBhdGgsIG1vZHVsZU5hbWUsIG9uTG9hZCkgPT4ge1xuXG4gICAgaWYgKCF3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bbW9kdWxlTmFtZV0pIHtcbiAgICAgICAgbGV0IHNjcmlwdFRhZztcblxuICAgICAgICB3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bbW9kdWxlTmFtZV0gPSB7fTtcbiAgICAgICAgd2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdW29uTG9hZEtleV0gPSAobW9kdWxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2NyaXB0VGFnKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChzY3JpcHRUYWcpO1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIHRoYXQ6XG4gICAgICAgICAgICAgICAgc2NyaXB0VGFnID0gbnVsbDtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnc2NyaXB0IHJlbW92ZWQuLi4gJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2cobW9kdWxlKTtcblxuICAgICAgICAgICAgd2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdW21vZHVsZUluc3RhbmNlS2V5XSA9IG1vZHVsZTtcbiAgICAgICAgICAgIG9uTG9hZChtb2R1bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2NyaXB0VGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgIC8vc2NyaXB0VGFnLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JztcbiAgICAgICAgc2NyaXB0VGFnLnR5cGUgPSAnbW9kdWxlJztcbiAgICAgICAgc2NyaXB0VGFnLnNyYyA9IHNjcmlwdEZpbGVQYXRoO1xuXG4gICAgICAgIHNjcmlwdFRhZy5hc3luYyA9IHRydWU7XG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0VGFnKTtcblxuICAgICAgICAvLyBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XG4gICAgICAgIC8vIGxpbmsudHlwZSA9IFwidGV4dC9jc3NcIjtcbiAgICAgICAgLy8gbGluay5yZWwgPSBcInN0eWxlc2hlZXRcIjtcbiAgICAgICAgLy8gbGluay5ocmVmID0gZmlsZU5hbWUucmVwbGFjZSgnLmpzJywgJy5jc3MnKTtcbiAgICAgICAgLy8gZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBfX2ZlZGVyYXRpb25fXyBtb2R1bGUgJHttb2R1bGVOYW1lfSBhbHJlYWR5IGxvYWRlZC5gKVxuICAgICAgICBvbkxvYWQod2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdW21vZHVsZUluc3RhbmNlS2V5XSk7XG4gICAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsTUFBYSxnQkFDQSxXQUNBLG1CQUVBO0FBSmI7QUFBQTtBQUFBO0FBQU8sTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sb0JBQW9CO0FBRTFCLE1BQU0sc0JBQXNCLENBQUMsWUFBb0IsV0FBZ0I7QUFFcEUsWUFBSSxPQUFPLGNBQWMsS0FBSyxPQUFPLGNBQWMsRUFBRSxVQUFVLEtBQUssT0FBTyxjQUFjLEVBQUUsVUFBVSxFQUFFLFNBQVMsR0FBRztBQUUvRyxpQkFBTyxjQUFjLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxFQUFDLENBQUMsVUFBVSxHQUFHLE9BQU0sQ0FBQztBQUFBLFFBQ3hFLE9BQU87QUFBQSxRQUVQO0FBQUEsTUFDSjtBQUFBO0FBQUE7OztBQ1pBLE1BQU87QUFBUDtBQUFBO0FBQUEsTUFBTywyQkFBUTtBQUFBO0FBQUE7OztBQ0FmLE1BSWE7QUFKYjtBQUFBO0FBQUE7QUFJTyxNQUFNLGVBQWU7QUFBQTtBQUFBLFFBRXhCLGVBQWU7QUFBQSxRQUNmLGdCQUFnQjtBQUFBLFFBQ2hCLGVBQWU7QUFBQSxRQUNmLGtCQUFrQjtBQUFBLFFBRWxCLHFCQUFxQjtBQUFBLFFBQ3JCLG9CQUFvQjtBQUFBLFFBQ3BCLHlCQUF5QjtBQUFBLFFBRXpCLHdCQUF3QjtBQUFB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O0FBQ2xCLGVBQVMsS0FBSyxZQUFZLFNBQVM7QUFBQSxJQVF2QyxPQUFPO0FBQ0gsY0FBUSxJQUFJLHlCQUF5QixtQkFBVSxtQkFBa0I7QUFDakUsYUFBTyxPQUFPLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQztBQUFBLElBQ2xFO0FBQUEsRUFDSjs7O0FEdERBO0FBRUEsVUFBUSxJQUFJLDBCQUEwQixTQUFTLFNBQVMsTUFBTTtBQUk5RCxNQUFNQywyQkFBMEI7QUFFaEMsTUFBTSxnQkFBZ0IsTUFBTTtBQUM1QixNQUFNLGtCQUFrQixNQUFNO0FBQzlCLE1BQU0sd0JBQXdCLE1BQU07QUFDcEMsTUFBTSxrQkFBa0IsTUFBTTtBQUM5QixNQUFNLGlCQUFpQixNQUFNO0FBRTdCLE1BQU0saUJBQWlCLENBQUMsbUJBQXVDO0FBRTNELFdBQU8sYUFBYSxNQUFNLGVBQWUsR0FBRyxJQUFJO0FBQUEsRUFDcEQ7QUFHQSxNQUFNLFVBQVU7QUFBQSxJQUNaLFNBQVU7QUFBQSxJQUNWLGVBQWUsZUFBZSxhQUFhO0FBQUEsSUFDM0MsaUJBQWlCLGVBQWUsZUFBZTtBQUFBLElBQy9DLHVCQUF1QixlQUFlLHFCQUFxQjtBQUFBLElBQzNELGlCQUFpQixlQUFlLGVBQWU7QUFBQSxJQUMvQyxnQkFBZ0IsZUFBZSxjQUFjO0FBQUEsRUFDakQ7QUFHQSxNQUFJLENBQUMsT0FBTyxNQUFNO0FBRWQsV0FBTyxPQUFPO0FBQUEsTUFDVix5QkFBQUE7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUdBLE1BQUksQ0FBQyxPQUFPLEtBQUssU0FBUztBQUV0QixXQUFPLE9BQU87QUFBQTtBQUFBLE1BRVY7QUFBQSxPQUNHLE9BQU87QUFBQSxFQUVsQixPQUFPO0FBQ0gsWUFBUSxJQUFJLHVDQUF1QztBQUFBLEVBQ3ZEOyIsCiAgIm5hbWVzIjogWyJSZXBsYXlNZXNzYWdlS2V5IiwgIm1hdGNoIiwgInNjcmlwdElucHV0cyIsICJzY3JpcHRJbnB1dHMiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAic2VlbiIsICJfYSIsICJ0YXJnZXQiLCAibWFrZVNlcmlhbGl6YWJsZSIsICJfYSIsICJoZWlnaHQiLCAid2lkdGgiLCAiX2EiLCAiX2EiLCAiX2EiLCAiaW5pdF9jb25zdHMiLCAiaW5pdF9jb25zdHMiLCAiaW5pdF9jb25zdHMiLCAiaW5pdF9jb25zdHMiLCAiaG9zdFNESyIsICJpbml0X2V4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgImluaXRfY29uc3RzIiwgImVsZW1lbnQiLCAiaW5pdF9leGVjdXRlU2NyaXB0SGFuZGxlciIsICJzZGsiLCAic2VlbiIsICJkb21JZCIsICJpbml0X2hlbHBlcnMiLCAiaW5pdF9oZWxwZXJzIiwgInNraW4iLCAiY29tcG9uZW50IiwgIl9hIiwgInNlZ21lbnQiLCAiZXhwZXJpZW5jZSIsICJzZWxlY3RlZFNraW4iLCAiRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJpbml0X0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9jb25zdHMiLCAiQmluZE9uQ2xpY2tIYW5kbGVyIiwgImluaXRfYmluZE9uQ2xpY2tIYW5kbGVyIiwgIkNoYW5nZVRleHRIYW5kbGVyIiwgImluaXRfY2hhbmdlVGV4dEhhbmRsZXIiLCAiRXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiaW5pdF9leGVjdXRlU2NyaXB0SGFuZGxlciIsICJBZGRFdmVudExpc3RlbmVySGFuZGxlciIsICJpbml0X2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgInNldEF0dHJpYnV0ZUhhbmRsZXIiLCAiaW5pdF9zZXRBdHRyaWJ1dGVIYW5kbGVyIiwgIkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIiwgImluaXRfQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9jb25zdHMiLCAiaG9zdFNESyIsICJNdXRhdGlvbk9ic2VydmVyIiwgImdldElucHV0VmFsdWUiLCAiR2V0RWxlbWVudFZhbHVlSGFuZGxlciIsICJpbml0X0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIiLCAiaW5pdF9jb25zdHMiLCAiZWxlbWVudCIsICJTZXRJbm5lckh0bWxIYW5kbGVyIiwgImluaXRfc2V0SW5uZXJIdG1sSGFuZGxlciIsICJpbml0X0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9iaW5kT25DbGlja0hhbmRsZXIiLCAiaW5pdF9jaGFuZ2VUZXh0SGFuZGxlciIsICJpbml0X2V4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgImluaXRfYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIiLCAiaW5pdF9zZXRBdHRyaWJ1dGVIYW5kbGVyIiwgImluaXRfQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9HZXRFbGVtZW50VmFsdWVIYW5kbGVyIiwgImluaXRfc2V0SW5uZXJIdG1sSGFuZGxlciIsICJfYSIsICJDaGFuZ2VUZXh0SGFuZGxlciIsICJTZXRJbm5lckh0bWxIYW5kbGVyIiwgIkJpbmRPbkNsaWNrSGFuZGxlciIsICJEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIiwgIkV4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgIkFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgInNldEF0dHJpYnV0ZUhhbmRsZXIiLCAiR2V0RWxlbWVudFZhbHVlSGFuZGxlciIsICJDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciIsICJNeW9wTWVzc2FnZXMiLCAiaW5pdF9NeW9wTWVzc2FnZXMiLCAiaW5pdF9oZWxwZXJzIiwgIl9fUk9PVF9TREtfUFVCTElDX1VSTF9fIl0KfQo=