@sbb-esta/lyne-elements-experimental-dev 4.8.1-dev.1774250635 → 4.8.1-dev.1774266612

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 (27) hide show
  1. package/custom-elements.json +70 -2
  2. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts +3 -0
  3. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts.map +1 -1
  4. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.js +30 -2
  5. package/development/seat-reservation/seat-reservation/seat-reservation.component.d.ts.map +1 -1
  6. package/development/seat-reservation/seat-reservation/seat-reservation.component.js +1 -1
  7. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +1 -1
  8. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +1 -1
  9. package/development/seat-reservation/seat-reservation-graphic.js +1 -1
  10. package/development/seat-reservation/seat-reservation.js +1 -1
  11. package/development/seat-reservation-graphic.component-D0xEXmP9.js +203 -0
  12. package/development/{seat-reservation.component-MOv5kHDC.js → seat-reservation.component-BS53sZR3.js} +8 -5
  13. package/development/seat-reservation.js +2 -2
  14. package/development/seat-reservation.pure.js +2 -2
  15. package/package.json +2 -2
  16. package/seat-reservation/seat-reservation/seat-reservation-base-element.js +24 -4
  17. package/seat-reservation/seat-reservation/seat-reservation.component.js +1 -1
  18. package/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +1 -1
  19. package/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +1 -1
  20. package/seat-reservation/seat-reservation-graphic.js +1 -1
  21. package/seat-reservation/seat-reservation.js +1 -1
  22. package/seat-reservation-graphic.component-DCMFf9uY.js +102 -0
  23. package/{seat-reservation.component-DXAhxaI0.js → seat-reservation.component-Dl6bnC7-.js} +7 -4
  24. package/seat-reservation.js +2 -2
  25. package/seat-reservation.pure.js +2 -2
  26. package/development/seat-reservation-graphic.component-lZXqHWIz.js +0 -193
  27. package/seat-reservation-graphic.component-CjqYuXjL.js +0 -102
@@ -1 +1 @@
1
- {"version":3,"file":"seat-reservation.component.d.ts","sourceRoot":"","sources":["../../../../../src/elements-experimental/seat-reservation/seat-reservation/seat-reservation.component.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAqB1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAGhF,OAAO,mCAAmC,CAAC;AAC3C,OAAO,+CAA+C,CAAC;AACvD,OAAO,oCAAoC,CAAC;AAQ5C;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,0BAA0B;IACvE,gBAAgC,WAAW,EAAE,MAAM,CAA0B;IAC7E,OAAuB,MAAM,EAAE,cAAc,CAA4B;IAEzE,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,oBAAoB,CAAC,CAAiB;IAG9C,OAAO,CAAC,2BAA2B,CAAkB;cAElC,UAAU,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;cAgBzD,YAAY,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;cAS3D,MAAM,IAAI,cAAc,GAAG,IAAI;IAKlD,OAAO,CAAC,uCAAuC;IAwC/C,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,8BAA8B;IAwCtC,OAAO,CAAC,sBAAsB;IA0B9B,OAAO,CAAC,iBAAiB;IAsCzB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAuBtB,OAAO,CAAC,mBAAmB;IAuC3B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAwEhC,OAAO,CAAC,qBAAqB;IAoC7B,OAAO,CAAC,wBAAwB;IA8DhC,OAAO,CAAC,6BAA6B;IAgCrC;;;;;;;;OAQG;IACH,OAAO,CAAC,yBAAyB;IAwFjC,OAAO,CAAC,4BAA4B;IAuCpC,OAAO,CAAC,2BAA2B;IAwCnC;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,gBAAgB;IAUxB;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAWhB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,yBAAyB;IAuCjC,OAAO,CAAC,8BAA8B;CAyBvC;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAE7B,sBAAsB,EAAE,yBAAyB,CAAC;KACnD;CACF"}
1
+ {"version":3,"file":"seat-reservation.component.d.ts","sourceRoot":"","sources":["../../../../../src/elements-experimental/seat-reservation/seat-reservation/seat-reservation.component.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAqB1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAGhF,OAAO,mCAAmC,CAAC;AAC3C,OAAO,+CAA+C,CAAC;AACvD,OAAO,oCAAoC,CAAC;AAQ5C;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,0BAA0B;IACvE,gBAAgC,WAAW,EAAE,MAAM,CAA0B;IAC7E,OAAuB,MAAM,EAAE,cAAc,CAA4B;IAEzE,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,oBAAoB,CAAC,CAAiB;IAG9C,OAAO,CAAC,2BAA2B,CAAkB;cAElC,UAAU,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;cAgBzD,YAAY,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI;cAS3D,MAAM,IAAI,cAAc,GAAG,IAAI;IAKlD,OAAO,CAAC,uCAAuC;IAwC/C,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,8BAA8B;IAwCtC,OAAO,CAAC,sBAAsB;IA0B9B,OAAO,CAAC,iBAAiB;IAsCzB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAuBtB,OAAO,CAAC,mBAAmB;IAuC3B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAwEhC,OAAO,CAAC,qBAAqB;IAoC7B,OAAO,CAAC,wBAAwB;IA8DhC,OAAO,CAAC,6BAA6B;IAgCrC;;;;;;;;OAQG;IACH,OAAO,CAAC,yBAAyB;IA4FjC,OAAO,CAAC,4BAA4B;IAuCpC,OAAO,CAAC,2BAA2B;IAwCnC;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,gBAAgB;IAUxB;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAWhB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,yBAAyB;IAuCjC,OAAO,CAAC,8BAA8B;CAyBvC;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAE7B,sBAAsB,EAAE,yBAAyB,CAAC;KACnD;CACF"}
@@ -1,2 +1,2 @@
1
- import { t as SbbSeatReservationElement } from "../../seat-reservation.component-MOv5kHDC.js";
1
+ import { t as SbbSeatReservationElement } from "../../seat-reservation.component-BS53sZR3.js";
2
2
  export { SbbSeatReservationElement };
@@ -1,4 +1,4 @@
1
- import { t as SbbSeatReservationGraphicElement } from "../../seat-reservation-graphic.component-lZXqHWIz.js";
1
+ import { t as SbbSeatReservationGraphicElement } from "../../seat-reservation-graphic.component-D0xEXmP9.js";
2
2
  import { html } from "lit";
3
3
  import { unsafeHTML } from "lit/directives/unsafe-html.js";
4
4
  import { mapIconToSvg } from "../common/mapper.js";
@@ -1,2 +1,2 @@
1
- import { t as SbbSeatReservationGraphicElement } from "../../seat-reservation-graphic.component-lZXqHWIz.js";
1
+ import { t as SbbSeatReservationGraphicElement } from "../../seat-reservation-graphic.component-D0xEXmP9.js";
2
2
  export { SbbSeatReservationGraphicElement };
@@ -1,4 +1,4 @@
1
- import { t as SbbSeatReservationGraphicElement } from "../seat-reservation-graphic.component-lZXqHWIz.js";
1
+ import { t as SbbSeatReservationGraphicElement } from "../seat-reservation-graphic.component-D0xEXmP9.js";
2
2
  //#region src/elements-experimental/seat-reservation/seat-reservation-graphic.ts
3
3
  /** @entrypoint */
4
4
  SbbSeatReservationGraphicElement.define();
@@ -1,5 +1,5 @@
1
1
  import { SeatReservationBaseElement } from "./seat-reservation/seat-reservation-base-element.js";
2
- import { t as SbbSeatReservationElement } from "../seat-reservation.component-MOv5kHDC.js";
2
+ import { t as SbbSeatReservationElement } from "../seat-reservation.component-BS53sZR3.js";
3
3
  //#region src/elements-experimental/seat-reservation/seat-reservation.ts
4
4
  /** @entrypoint */
5
5
  SbbSeatReservationElement.define();
@@ -0,0 +1,203 @@
1
+ import { __esDecorate, __runInitializers } from "tslib";
2
+ import { SbbElement } from "@sbb-esta/lyne-elements/core/base-elements.js";
3
+ import { SbbLanguageController } from "@sbb-esta/lyne-elements/core/controllers.js";
4
+ import { forceType } from "@sbb-esta/lyne-elements/core/decorators.js";
5
+ import { boxSizingStyles } from "@sbb-esta/lyne-elements/core/styles.js";
6
+ import "@sbb-esta/lyne-elements/icon.js";
7
+ import { css, html, isServer } from "lit";
8
+ import { property } from "lit/decorators.js";
9
+ import { mapIconToSvg } from "./seat-reservation/common/mapper.js";
10
+ import { classMap } from "lit/directives/class-map.js";
11
+ import { getI18nSeatReservation } from "./seat-reservation/common/translations.js";
12
+ //#region src/elements-experimental/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.scss?lit&inline
13
+ var seat_reservation_graphic_default = css`:host {
14
+ --sbb-seat-reservation-graphic-max-width: auto;
15
+ --sbb-seat-reservation-graphic-max-height: auto;
16
+ --sbb-seat-reservation-graphic-width: 16;
17
+ --sbb-seat-reservation-graphic-height: 16;
18
+ --sbb-seat-reservation-graphic-rotation: 0;
19
+ --sbb-seat-reservation-graphic-inverse-rotation: 0;
20
+ --sbb-seat-reservation-graphic-padding-percent: 1;
21
+ --sbb-seat-reservation-graphic-position: initial;
22
+ --sbb-seat-reservation-graphic-left: 0;
23
+ --sbb-seat-reservation-graphic-top: 0;
24
+ --sbb-icon-svg-width: calc(
25
+ var(--sbb-seat-reservation-graphic-width) *
26
+ var(--sbb-seat-reservation-one-px-rem, 0.0625rem)
27
+ );
28
+ --sbb-icon-svg-height: calc(
29
+ var(--sbb-seat-reservation-graphic-height) *
30
+ var(--sbb-seat-reservation-one-px-rem, 0.0625rem)
31
+ );
32
+ display: flex;
33
+ justify-content: center;
34
+ align-items: center;
35
+ width: calc(var(--sbb-seat-reservation-graphic-width) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
36
+ height: calc(var(--sbb-seat-reservation-graphic-height) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
37
+ position: var(--sbb-seat-reservation-graphic-position);
38
+ inset-inline-start: calc(var(--sbb-seat-reservation-graphic-left) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
39
+ inset-block-start: calc(var(--sbb-seat-reservation-graphic-top) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
40
+ }
41
+
42
+ :host(.auto-width) {
43
+ --sbb-icon-svg-width: auto;
44
+ max-width: calc(var(--sbb-seat-reservation-graphic-max-width) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));
45
+ width: auto;
46
+ }
47
+
48
+ :host(.sbb-sr-graphic__dimension--square-dim) {
49
+ --sbb-icon-svg-width: min(min(var(--sbb-seat-reservation-graphic-width) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem), var(--sbb-seat-reservation-graphic-height) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) * var(--sbb-seat-reservation-graphic-padding-percent), min(var(--sbb-seat-reservation-graphic-max-width) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem), var(--sbb-seat-reservation-graphic-max-height) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)));
50
+ --sbb-icon-svg-height: min(min(var(--sbb-seat-reservation-graphic-width) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem), var(--sbb-seat-reservation-graphic-height) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) * var(--sbb-seat-reservation-graphic-padding-percent), min(var(--sbb-seat-reservation-graphic-max-width) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem), var(--sbb-seat-reservation-graphic-max-height) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)));
51
+ width: min(min(var(--sbb-seat-reservation-graphic-width) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem), var(--sbb-seat-reservation-graphic-height) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) * var(--sbb-seat-reservation-graphic-padding-percent), min(var(--sbb-seat-reservation-graphic-max-width) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem), var(--sbb-seat-reservation-graphic-max-height) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)));
52
+ height: min(min(var(--sbb-seat-reservation-graphic-width) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem), var(--sbb-seat-reservation-graphic-height) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) * var(--sbb-seat-reservation-graphic-padding-percent), min(var(--sbb-seat-reservation-graphic-max-width) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem), var(--sbb-seat-reservation-graphic-max-height) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)));
53
+ }
54
+
55
+ :host(.sbb-seat-reservation-graphic--cursor-pointer) {
56
+ cursor: var(--sbb-cursor-pointer);
57
+ }
58
+
59
+ .sbb-sr-icon,
60
+ .sbb-sr-graphic {
61
+ width: inherit;
62
+ height: inherit;
63
+ transform-origin: center;
64
+ rotate: calc(var(--sbb-seat-reservation-graphic-rotation) * 1deg);
65
+ }
66
+
67
+ .sbb-sr-icon {
68
+ color: var(--sbb-color-granite);
69
+ color: light-dark(var(--sbb-color-granite), var(--sbb-color-graphite));
70
+ }
71
+
72
+ .sbb-sr-graphic svg {
73
+ width: 100%;
74
+ height: 100%;
75
+ }
76
+ .sbb-sr-graphic svg .fix-rotation-inverse {
77
+ transform-origin: center;
78
+ rotate: calc(var(--sbb-seat-reservation-graphic-inverse-rotation) * 1deg);
79
+ }
80
+ @media (forced-colors: active) {
81
+ .sbb-sr-graphic svg:not(.color-immutable) [fill]:not([fill=none]) {
82
+ fill: currentcolor;
83
+ }
84
+ .sbb-sr-graphic .no-bg {
85
+ fill: transparent;
86
+ }
87
+ }`;
88
+ //#endregion
89
+ //#region src/elements-experimental/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.ts
90
+ /**
91
+ * Output one of the SVG graphics based on its code.
92
+ */
93
+ var SbbSeatReservationGraphicElement = (() => {
94
+ let _classSuper = SbbElement;
95
+ let _name_decorators;
96
+ let _name_initializers = [];
97
+ let _name_extraInitializers = [];
98
+ let _stretch_decorators;
99
+ let _stretch_initializers = [];
100
+ let _stretch_extraInitializers = [];
101
+ return class SbbSeatReservationGraphicElement extends _classSuper {
102
+ constructor() {
103
+ super(...arguments);
104
+ this.#name_accessor_storage = __runInitializers(this, _name_initializers, "");
105
+ this.#stretch_accessor_storage = (__runInitializers(this, _name_extraInitializers), __runInitializers(this, _stretch_initializers, false));
106
+ this._language = (__runInitializers(this, _stretch_extraInitializers), new SbbLanguageController(this));
107
+ }
108
+ static {
109
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
110
+ _name_decorators = [forceType(), property({ attribute: "name" })];
111
+ _stretch_decorators = [forceType(), property({
112
+ attribute: "stretch",
113
+ type: Boolean
114
+ })];
115
+ __esDecorate(this, null, _name_decorators, {
116
+ kind: "accessor",
117
+ name: "name",
118
+ static: false,
119
+ private: false,
120
+ access: {
121
+ has: (obj) => "name" in obj,
122
+ get: (obj) => obj.name,
123
+ set: (obj, value) => {
124
+ obj.name = value;
125
+ }
126
+ },
127
+ metadata: _metadata
128
+ }, _name_initializers, _name_extraInitializers);
129
+ __esDecorate(this, null, _stretch_decorators, {
130
+ kind: "accessor",
131
+ name: "stretch",
132
+ static: false,
133
+ private: false,
134
+ access: {
135
+ has: (obj) => "stretch" in obj,
136
+ get: (obj) => obj.stretch,
137
+ set: (obj, value) => {
138
+ obj.stretch = value;
139
+ }
140
+ },
141
+ metadata: _metadata
142
+ }, _stretch_initializers, _stretch_extraInitializers);
143
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, {
144
+ enumerable: true,
145
+ configurable: true,
146
+ writable: true,
147
+ value: _metadata
148
+ });
149
+ }
150
+ static {
151
+ this.elementName = "sbb-seat-reservation-graphic";
152
+ }
153
+ static {
154
+ this.styles = [boxSizingStyles, seat_reservation_graphic_default];
155
+ }
156
+ #name_accessor_storage;
157
+ /** Name of the SVG graphic to be displayed. */
158
+ get name() {
159
+ return this.#name_accessor_storage;
160
+ }
161
+ set name(value) {
162
+ this.#name_accessor_storage = value;
163
+ }
164
+ #stretch_accessor_storage;
165
+ /** if true, scale the graphic content of the given element non-uniformly if necessary */
166
+ get stretch() {
167
+ return this.#stretch_accessor_storage;
168
+ }
169
+ set stretch(value) {
170
+ this.#stretch_accessor_storage = value;
171
+ }
172
+ render() {
173
+ const svgObj = mapIconToSvg[this.name];
174
+ if (!svgObj?.svg && !svgObj?.svgName) return null;
175
+ return html`<span
176
+ class="${classMap({
177
+ "sbb-sr-icon": !!svgObj.svgName,
178
+ "sbb-sr-graphic": !!svgObj.svg
179
+ })}"
180
+ >
181
+ ${svgObj.svgName ? html` <sbb-icon
182
+ name="${svgObj.svgName || ""}"
183
+ aria-hidden="false"
184
+ aria-label="${getI18nSeatReservation(svgObj.svgName, this._language.current)}"
185
+ ></sbb-icon>` : html`${this._getSvgElement(svgObj.svg)}`}
186
+ </span>`;
187
+ }
188
+ _getSvgElement(svg) {
189
+ if (!isServer) {
190
+ const parser = new DOMParser();
191
+ const svgString = svg || "<svg></svg>";
192
+ const svgElm = parser.parseFromString(svgString, "image/svg+xml").firstElementChild;
193
+ if (this.stretch && svgElm?.nodeName.toLowerCase() === "svg") svgElm.setAttribute("preserveAspectRatio", "none");
194
+ return svgElm;
195
+ }
196
+ return null;
197
+ }
198
+ };
199
+ })();
200
+ //#endregion
201
+ export { SbbSeatReservationGraphicElement as t };
202
+
203
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLmNvbXBvbmVudC1EMHhFWG1QOS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMtZXhwZXJpbWVudGFsL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljL3NlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy5zY3NzP2xpdCZpbmxpbmUiLCIuLi8uLi8uLi9zcmMvZWxlbWVudHMtZXhwZXJpbWVudGFsL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljL3NlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiQHVzZSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9zdHlsZXMnIGFzIHNiYjtcblxuOmhvc3Qge1xuICAtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbWF4LXdpZHRoOiBhdXRvO1xuICAtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbWF4LWhlaWdodDogYXV0bztcbiAgLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXdpZHRoOiAxNjtcbiAgLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWhlaWdodDogMTY7XG4gIC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1yb3RhdGlvbjogMDtcbiAgLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWludmVyc2Utcm90YXRpb246IDA7XG4gIC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1wYWRkaW5nLXBlcmNlbnQ6IDE7XG4gIC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1wb3NpdGlvbjogaW5pdGlhbDtcbiAgLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWxlZnQ6IDA7XG4gIC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy10b3A6IDA7XG4gIC0tc2JiLWljb24tc3ZnLXdpZHRoOiBjYWxjKFxuICAgIHZhcigtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtd2lkdGgpICpcbiAgICAgIHZhcigtLXNiYi1zZWF0LXJlc2VydmF0aW9uLW9uZS1weC1yZW0sICN7c2JiLnB4LXRvLXJlbS1idWlsZCgxKX0pXG4gICk7XG4gIC0tc2JiLWljb24tc3ZnLWhlaWdodDogY2FsYyhcbiAgICB2YXIoLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWhlaWdodCkgKlxuICAgICAgdmFyKC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tb25lLXB4LXJlbSwgI3tzYmIucHgtdG8tcmVtLWJ1aWxkKDEpfSlcbiAgKTtcblxuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgd2lkdGg6IGNhbGMoXG4gICAgdmFyKC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy13aWR0aCkgKlxuICAgICAgdmFyKC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tb25lLXB4LXJlbSwgI3tzYmIucHgtdG8tcmVtLWJ1aWxkKDEpfSlcbiAgKTtcbiAgaGVpZ2h0OiBjYWxjKFxuICAgIHZhcigtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtaGVpZ2h0KSAqXG4gICAgICB2YXIoLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1vbmUtcHgtcmVtLCAje3NiYi5weC10by1yZW0tYnVpbGQoMSl9KVxuICApO1xuICBwb3NpdGlvbjogdmFyKC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1wb3NpdGlvbik7XG4gIGluc2V0LWlubGluZS1zdGFydDogY2FsYyhcbiAgICB2YXIoLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWxlZnQpICpcbiAgICAgIHZhcigtLXNiYi1zZWF0LXJlc2VydmF0aW9uLW9uZS1weC1yZW0sICN7c2JiLnB4LXRvLXJlbS1idWlsZCgxKX0pXG4gICk7XG4gIGluc2V0LWJsb2NrLXN0YXJ0OiBjYWxjKFxuICAgIHZhcigtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtdG9wKSAqXG4gICAgICB2YXIoLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1vbmUtcHgtcmVtLCAje3NiYi5weC10by1yZW0tYnVpbGQoMSl9KVxuICApO1xufVxuXG4vLyBhdXRvLXdpZHRoIHNldHRpbmdzIGZvciBncmFwaGljc1xuOmhvc3QoLmF1dG8td2lkdGgpIHtcbiAgLS1zYmItaWNvbi1zdmctd2lkdGg6IGF1dG87XG5cbiAgbWF4LXdpZHRoOiBjYWxjKFxuICAgIHZhcigtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbWF4LXdpZHRoKSAqXG4gICAgICB2YXIoLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1vbmUtcHgtcmVtLCAje3NiYi5weC10by1yZW0tYnVpbGQoMSl9KVxuICApO1xuICB3aWR0aDogYXV0bztcbn1cblxuLy8gR3JhcGhpYyBzaXplIGZvciBtYXggc3F1YXJlIGRpbWVuc2lvblxuOmhvc3QoLnNiYi1zci1ncmFwaGljX19kaW1lbnNpb24tLXNxdWFyZS1kaW0pIHtcbiAgJHBhZGRpbmctcGVyY2VudDogdmFyKC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1wYWRkaW5nLXBlcmNlbnQpO1xuICAkZ3JhcGhpYy1tYXgtd2lkdGg6IGNhbGMoXG4gICAgdmFyKC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1tYXgtd2lkdGgpICpcbiAgICAgIHZhcigtLXNiYi1zZWF0LXJlc2VydmF0aW9uLW9uZS1weC1yZW0sICN7c2JiLnB4LXRvLXJlbS1idWlsZCgxKX0pXG4gICk7XG4gICRncmFwaGljLW1heC1oZWlnaHQ6IGNhbGMoXG4gICAgdmFyKC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1tYXgtaGVpZ2h0KSAqXG4gICAgICB2YXIoLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1vbmUtcHgtcmVtLCAje3NiYi5weC10by1yZW0tYnVpbGQoMSl9KVxuICApO1xuICAkZ3JhcGhpYy13aWR0aDogY2FsYyhcbiAgICB2YXIoLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXdpZHRoKSAqXG4gICAgICB2YXIoLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1vbmUtcHgtcmVtLCAje3NiYi5weC10by1yZW0tYnVpbGQoMSl9KVxuICApO1xuICAkZ3JhcGhpYy1oZWlnaHQ6IGNhbGMoXG4gICAgdmFyKC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1oZWlnaHQpICpcbiAgICAgIHZhcigtLXNiYi1zZWF0LXJlc2VydmF0aW9uLW9uZS1weC1yZW0sICN7c2JiLnB4LXRvLXJlbS1idWlsZCgxKX0pXG4gICk7XG5cbiAgLy8gY2FsY3VsYXRlIG1heCBhdmFpbGFibGUgYXJlYSBkaW1lbnNpb25cbiAgJHBhcmVudC1kaW06IGNhbGMobWluKCRncmFwaGljLXdpZHRoLCAkZ3JhcGhpYy1oZWlnaHQpICogJHBhZGRpbmctcGVyY2VudCk7XG4gICRtYXgtcGFyZW50LWRpbTogbWluKCRncmFwaGljLW1heC13aWR0aCwgJGdyYXBoaWMtbWF4LWhlaWdodCk7XG4gICRyZXN1bHQtZGltOiBtaW4oJHBhcmVudC1kaW0sICRtYXgtcGFyZW50LWRpbSk7XG5cbiAgLy8gU2V0IG1heCBkaW1lbnNpb24gZm9yIHN2ZyBpY29uXG4gIC0tc2JiLWljb24tc3ZnLXdpZHRoOiAjeyRyZXN1bHQtZGltfTtcbiAgLS1zYmItaWNvbi1zdmctaGVpZ2h0OiAjeyRyZXN1bHQtZGltfTtcblxuICB3aWR0aDogI3skcmVzdWx0LWRpbX07XG4gIGhlaWdodDogI3skcmVzdWx0LWRpbX07XG59XG5cbi8vIGhvdmVyIHN0YXRlIHdpdGggcG9pbnRlciBjdXJzb3IgZm9yIHNlcnZpY2UgaWNvbnMgYW5kIHBvcG92ZXJcbjpob3N0KC5zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLS1jdXJzb3ItcG9pbnRlcikge1xuICBjdXJzb3I6IHZhcigtLXNiYi1jdXJzb3ItcG9pbnRlcik7XG59XG5cbi5zYmItc3ItaWNvbixcbi5zYmItc3ItZ3JhcGhpYyB7XG4gIHdpZHRoOiBpbmhlcml0O1xuICBoZWlnaHQ6IGluaGVyaXQ7XG4gIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjtcbiAgcm90YXRlOiBjYWxjKHZhcigtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcm90YXRpb24pICogMWRlZyk7XG59XG5cbi5zYmItc3ItaWNvbiB7XG4gIC8vIG92ZXJyaWRlIGNvbG9yIGRpcmVjdGx5IHNldCBpbiB0aGUgU1ZHIGZpbGUgY29taW5nIGZyb20gQ0ROXG4gIGNvbG9yOiBsaWdodC1kYXJrKHZhcigtLXNiYi1jb2xvci1ncmFuaXRlKSwgdmFyKC0tc2JiLWNvbG9yLWdyYXBoaXRlKSk7XG59XG5cbi5zYmItc3ItZ3JhcGhpYyB7XG4gIHN2ZyB7XG4gICAgd2lkdGg6IGNsYW1wKDEwMCUsIDEwMCUsIDEwMCUpO1xuICAgIGhlaWdodDogY2xhbXAoMTAwJSwgMTAwJSwgMTAwJSk7XG5cbiAgICAuZml4LXJvdGF0aW9uLWludmVyc2Uge1xuICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyO1xuICAgICAgcm90YXRlOiBjYWxjKHZhcigtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtaW52ZXJzZS1yb3RhdGlvbikgKiAxZGVnKTtcbiAgICB9XG4gIH1cblxuICBAaW5jbHVkZSBzYmIuaWYtZm9yY2VkLWNvbG9ycyB7XG4gICAgc3ZnOm5vdCguY29sb3ItaW1tdXRhYmxlKSB7XG4gICAgICBbZmlsbF06bm90KFtmaWxsPSdub25lJ10pIHtcbiAgICAgICAgZmlsbDogY3VycmVudGNvbG9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5uby1iZyB7XG4gICAgICBmaWxsOiB0cmFuc3BhcmVudDtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFNiYkVsZW1lbnQgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2Jhc2UtZWxlbWVudHMuanMnO1xuaW1wb3J0IHsgU2JiTGFuZ3VhZ2VDb250cm9sbGVyIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9jb250cm9sbGVycy5qcyc7XG5pbXBvcnQgeyBmb3JjZVR5cGUgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgYm94U2l6aW5nU3R5bGVzIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9zdHlsZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBDU1NSZXN1bHRHcm91cCwgaXNTZXJ2ZXIsIHR5cGUgVGVtcGxhdGVSZXN1bHQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwLmpzJztcblxuaW1wb3J0IHsgbWFwSWNvblRvU3ZnIH0gZnJvbSAnLi4vY29tbW9uL21hcHBlci50cyc7XG5pbXBvcnQgeyBnZXRJMThuU2VhdFJlc2VydmF0aW9uIH0gZnJvbSAnLi4vY29tbW9uL3RyYW5zbGF0aW9ucy50cyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL3NlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy5zY3NzP2xpdCZpbmxpbmUnO1xuXG5pbXBvcnQgJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2ljb24uanMnO1xuXG4vKipcbiAqIE91dHB1dCBvbmUgb2YgdGhlIFNWRyBncmFwaGljcyBiYXNlZCBvbiBpdHMgY29kZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNiYlNlYXRSZXNlcnZhdGlvbkdyYXBoaWNFbGVtZW50IGV4dGVuZHMgU2JiRWxlbWVudCB7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgcmVhZG9ubHkgZWxlbWVudE5hbWU6IHN0cmluZyA9ICdzYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljJztcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gW2JveFNpemluZ1N0eWxlcywgc3R5bGVdO1xuXG4gIC8qKiBOYW1lIG9mIHRoZSBTVkcgZ3JhcGhpYyB0byBiZSBkaXNwbGF5ZWQuICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICduYW1lJyB9KVxuICBwdWJsaWMgYWNjZXNzb3IgbmFtZTogc3RyaW5nID0gJyc7XG5cbiAgLyoqIGlmIHRydWUsIHNjYWxlIHRoZSBncmFwaGljIGNvbnRlbnQgb2YgdGhlIGdpdmVuIGVsZW1lbnQgbm9uLXVuaWZvcm1seSBpZiBuZWNlc3NhcnkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3N0cmV0Y2gnLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBzdHJldGNoOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfbGFuZ3VhZ2UgPSBuZXcgU2JiTGFuZ3VhZ2VDb250cm9sbGVyKHRoaXMpO1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZW5kZXIoKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICBjb25zdCBzdmdPYmogPSBtYXBJY29uVG9TdmdbdGhpcy5uYW1lXTtcblxuICAgIGlmICghc3ZnT2JqPy5zdmcgJiYgIXN2Z09iaj8uc3ZnTmFtZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGh0bWxgPHNwYW5cbiAgICAgIGNsYXNzPVwiJHtjbGFzc01hcCh7XG4gICAgICAgICdzYmItc3ItaWNvbic6ICEhc3ZnT2JqLnN2Z05hbWUsXG4gICAgICAgICdzYmItc3ItZ3JhcGhpYyc6ICEhc3ZnT2JqLnN2ZyxcbiAgICAgIH0pfVwiXG4gICAgPlxuICAgICAgJHtzdmdPYmouc3ZnTmFtZVxuICAgICAgICA/IGh0bWxgIDxzYmItaWNvblxuICAgICAgICAgICAgbmFtZT1cIiR7c3ZnT2JqLnN2Z05hbWUgfHwgJyd9XCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwiZmFsc2VcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIiR7Z2V0STE4blNlYXRSZXNlcnZhdGlvbihzdmdPYmouc3ZnTmFtZSwgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCl9XCJcbiAgICAgICAgICA+PC9zYmItaWNvbj5gXG4gICAgICAgIDogaHRtbGAke3RoaXMuX2dldFN2Z0VsZW1lbnQoc3ZnT2JqLnN2ZyEpfWB9XG4gICAgPC9zcGFuPmA7XG4gIH1cblxuICBwcml2YXRlIF9nZXRTdmdFbGVtZW50KHN2Zzogc3RyaW5nKTogRWxlbWVudCB8IG51bGwge1xuICAgIGlmICghaXNTZXJ2ZXIpIHtcbiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgIGNvbnN0IHN2Z1N0cmluZyA9IHN2ZyB8fCAnPHN2Zz48L3N2Zz4nO1xuICAgICAgY29uc3Qgc3ZnRWxtID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhzdmdTdHJpbmcsICdpbWFnZS9zdmcreG1sJykuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICBpZiAodGhpcy5zdHJldGNoICYmIHN2Z0VsbT8ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N2ZycpIHtcbiAgICAgICAgc3ZnRWxtLnNldEF0dHJpYnV0ZSgncHJlc2VydmVBc3BlY3RSYXRpbycsICdub25lJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3ZnRWxtO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICdzYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljJzogU2JiU2VhdFJlc2VydmF0aW9uR3JhcGhpY0VsZW1lbnQ7XG4gIH1c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
@@ -668,14 +668,17 @@ var SbbSeatReservationElement = class extends SeatReservationBaseElement {
668
668
  ${areaProperty ? html`
669
669
  <sbb-seat-reservation-graphic
670
670
  style=${styleMap({
671
- "--sbb-seat-reservation-graphic-max-width": calculatedDimension.w,
672
- "--sbb-seat-reservation-graphic-height": this.baseGridSize,
673
- "--sbb-seat-reservation-graphic-rotation": rotation
671
+ "--sbb-seat-reservation-graphic-max-width": this.globalAreaIconDim.w,
672
+ "--sbb-seat-reservation-graphic-max-height": this.globalAreaIconDim.h,
673
+ "--sbb-seat-reservation-graphic-width": calculatedDimension.w,
674
+ "--sbb-seat-reservation-graphic-height": calculatedDimension.h,
675
+ "--sbb-seat-reservation-graphic-rotation": rotation,
676
+ "--sbb-seat-reservation-graphic-padding-percent": areaProperty !== "ENTRY_EXIT" ? this.globalAreaIconPadding : 1
674
677
  })}
675
678
  name=${areaProperty}
676
679
  role="img"
677
680
  aria-hidden="true"
678
- class="auto-width"
681
+ class="sbb-sr-graphic__dimension--square-dim"
679
682
  ></sbb-seat-reservation-graphic>
680
683
  ` : nothing}
681
684
  </sbb-seat-reservation-area>
@@ -818,4 +821,4 @@ var SbbSeatReservationElement = class extends SeatReservationBaseElement {
818
821
  //#endregion
819
822
  export { SbbSeatReservationElement as t };
820
823
 
821
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi5jb21wb25lbnQtTU92NWtIREMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi5zY3NzP2xpdCZpbmxpbmUiLCIuLi8uLi8uLi9zcmMvZWxlbWVudHMtZXhwZXJpbWVudGFsL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uLmNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJAdXNlICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL3N0eWxlcycgYXMgc2JiO1xuQHVzZSAnLi4vY29tbW9uL3N0eWxlcy9zZWF0LXJlc2VydmF0aW9uLW1peGlucycgYXMgc2JiLXNyLW1peGlucztcbkB1c2UgJy4uL2NvbW1vbi9zdHlsZXMvc2VhdC1yZXNlcnZhdGlvbi1mdW5jdGlvbnMnIGFzIHNiYi1zci1mdW5jdGlvbnM7XG5cbi8vIE1heGltdW0gcmVzcG9uc2l2ZSBuYXZpZ2F0aW9uIHdpZHRoLCBjb25zaXN0cyBvZiB0aGUgbWF4aW11bSBuYXZpZ2F0aW9uIGV4dGVudCBtaW51cyAyeCBuYXYgZGlyZWN0aW9uIGJ1dHRvbnMgOTZweCBhbmQgOHB4IHBhZGRpbmcuXG4kbWF4LWNvYWNoLW5hdmlnYXRpb24td2lkdGg6IGNhbGMoOTYwcHggLSA5NnB4IC0gOHB4KTtcbiRzY3JvbGxiYXItaGVpZ2h0OiAxNnB4O1xuXG46aG9zdCB7XG4gIC8vIE5vdGU6IFRoZSB1c2Ugb2YgcHggaXMgaW50ZW50aW9uYWwgaGVyZSwgYmVjYXVzZSBtYW55IHdpZHRocy9oZWlnaHRzLCByb3RhdGlvbnMsIHNjYWxlcywgZXRjLiBkZXBlbmRzIG9uIHRoaXMuXG4gIC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JpZC1zaXplOiAxNnB4O1xuICAtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWhlaWdodDogMDtcbiAgLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1kZWNrczogMTtcblxuICBkaXNwbGF5OiBibG9jaztcbiAgaGVpZ2h0OiBpbmhlcml0O1xuXG4gIDo6cGFydChjb2FjaC1mbG9vcikge1xuICAgIGZpbGw6IHZhcigtLXNiYi1iYWNrZ3JvdW5kLWNvbG9yLTIpO1xuXG4gICAgLy8gSW4gSGlnaCBDb250cmFzdCBNb2RlIHdlIHNldCBmbG9vciBjb2xvciB0byB0cmFuc3BhcmVudFxuICAgIEBpbmNsdWRlIHNiYi5pZi1mb3JjZWQtY29sb3JzIHtcbiAgICAgIGZpbGw6IHRyYW5zcGFyZW50O1xuICAgIH1cbiAgfVxufVxuXG4vLyByb3RhdGVzIHRoZSBET00tcGFydCBcImNvYWNoLWZsb29yXCIgYnkgMTgwIGRlZ3JlZXMgaWYgdGhlIGhvc3QgaXMgaW4gUlRMIG1vZGUuXG5AaW5jbHVkZSBzYmItc3ItbWl4aW5zLnJvdGF0ZS1kb20tcGFydChjb2FjaC1mbG9vcik7XG5cbltwb3BvdmVyXTp3aGVyZShzYmItcG9wb3Zlcikge1xuICBAaW5jbHVkZSBzYmIucG9wb3Zlci1yZXNldDtcblxuICAuc2JiLXNyLXBvcG92ZXIge1xuICAgIG1hcmdpbi1ibG9jazogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG4gIH1cbn1cblxuLy8gU1RBUlQgLSBWZXJ0aWNhbCBtb2RlXG46aG9zdChbYWxpZ24tdmVydGljYWxdKSB7XG4gICRjb2FjaC1uYXZpZ2F0aW9uLXBhZGRpbmc6IDU7XG4gICRjb2FjaC1zY3JvbGxiYXItd2lkdGg6IDI0O1xuICAkY29hY2gtZ3JpZC13aWR0aDogY2FsYyh2YXIoLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1oZWlnaHQpICsgJGNvYWNoLXNjcm9sbGJhci13aWR0aCk7XG5cbiAgLnNiYi1zcl9fY29tcG9uZW50IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgICBnYXA6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDIyKTtcbiAgICBoZWlnaHQ6IGluaGVyaXQ7XG5cbiAgICBAaW5jbHVkZSBzYmIubXEoJGZyb206IHNtYWxsKSB7XG4gICAgICBnYXA6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDU0KTtcbiAgICB9XG5cbiAgICBuYXYuc2JiLXNyLW5hdmlnYXRpb24sXG4gICAgdWwuc2JiLXNyLW5hdmlnYXRpb25fX2xpc3QtY29hY2hlcyB7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIH1cblxuICAgIG5hdi5zYmItc3ItbmF2aWdhdGlvbiB7XG4gICAgICBwYWRkaW5nOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgxNikgMDtcblxuICAgICAgLnNiYi1zcl9fbmF2aWdhdGlvbi1jb250cm9sLWJ1dHRvbiB7XG4gICAgICAgIGxlZnQ6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDEpO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIHJvdGF0ZTogOTBkZWc7XG5cbiAgICAgICAgQGluY2x1ZGUgc2JiLm1xKCRmcm9tOiBsYXJnZSkge1xuICAgICAgICAgIGxlZnQ6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKC0xKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1bC5zYmItc3ItbmF2aWdhdGlvbl9fbGlzdC1jb2FjaGVzIHtcbiAgICAgICAgbWF4LXdpZHRoOiBpbml0aWFsO1xuXG4gICAgICAgIC8vIFBhZGRpbmcgbmVlZHMgdG8gdmlzdWFsIGZvY3VzLXZpc2libGUgc3R5bGUgZm9yIG5hdiBidXR0b24gaW5zaWRlIG92ZXJmbG93IGNvbnRlbnQsXG4gICAgICAgIC8vIG90aGVyd2lzZSBmb2N1cy12aXNpYmxlIHN0eWxlIGlzIGN1dHRlZC5cbiAgICAgICAgcGFkZGluZzogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oJGNvYWNoLW5hdmlnYXRpb24tcGFkZGluZyk7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW4gc2Nyb2xsO1xuXG4gICAgICAgIC8vIGluIHZlcnRpY2FsIG1vZGUsIHRoZSBsaSBtdXN0IGJlIGZsZXhlZDsgb3RoZXJ3aXNlIGl0IHdvdWxkIGNhbGN1bGF0ZSB0aGUgd3JvbmcgaGVpZ2h0XG4gICAgICAgIC8vIGR1ZSB0byB1c2VyYWdlbnQgc3R5bGUgc2V0IHRvIFwibGlzdC1pdGVtXCIgZm9yIGRpc3BsYXlcbiAgICAgICAgbGkge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBWRVJUSUNBTCBNT0RFIC0gTEFCRUxNVUxUSVBMRSBERUNLUyAtIExBQkVMU1xuICAuc2JiLXNyX193cmFwcGVyLWNvYWNoLWRlY2tzIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXG4gICAgLnNiYi1zcl9fd3JhcHBlci1kZWNrLWxhYmVscyB7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gICAgICB3aWR0aDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oJGNvYWNoLWdyaWQtd2lkdGgpO1xuICAgICAgaGVpZ2h0OiBpbml0aWFsO1xuXG4gICAgICBiIHtcbiAgICAgICAgaW5saW5lLXNpemU6IGNhbGMoNTAlIC0gc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMTYpKTtcbiAgICAgICAgYmxvY2stc2l6ZTogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMjApO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgxNik7XG4gICAgICAgIHJvdGF0ZTogaW5pdGlhbDtcbiAgICAgICAgd3JpdGluZy1tb2RlOiBpbml0aWFsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFZFUlRJQ0FMIE1PREUgLSBTRUFUTUFQIFNDUk9MTCBBUkVBXG4gIC5zYmItc3JfX3dyYXBwZXItc2Nyb2xsYXJlYSB7XG4gICAgd2lkdGg6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKCRjb2FjaC1ncmlkLXdpZHRoKTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbiBzY3JvbGw7XG5cbiAgICAuc2JiLXNyX19wYXJlbnQge1xuICAgICAgcm90YXRlOiA5MGRlZztcbiAgICB9XG4gIH1cblxuICAvLyBWRVJUSUNBTCBNT0RFIC0gVFJBVkVMLURJUkVDVElPTlxuICAuc2JiLXNyLXRyYXZlbC1kaXJlY3Rpb24td3JhcHBlciB7XG4gICAgd2lkdGg6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKHZhcigtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWhlaWdodCkpO1xuICAgIG1hcmdpbi1ibG9jay1zdGFydDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG4gIH1cbn1cblxuLy8gRU5EIC0gVmVydGljYWwgbW9kZVxuXG4uc2JiLXNyLW5hdmlnYXRpb24ge1xuICBnYXA6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDMpO1xufVxuXG4uc2JiLXNyLW5hdmlnYXRpb24gLnNiYi1zcl9fbmF2aWdhdGlvbi1jb250cm9sLWJ1dHRvbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdG9wOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgyKTtcblxuICBAaW5jbHVkZSBzYmIubXEoJGZyb206IGxhcmdlKSB7XG4gICAgdG9wOiAwO1xuICB9XG59XG5cbi5zYmItc3JfX2NvbXBvbmVudCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogY2FsYyhzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg2NCkgLSAkc2Nyb2xsYmFyLWhlaWdodCk7XG59XG5cbi8vIFRSQVZFTCBESVJFQ1RJT05cbi5zYmItc3ItdHJhdmVsLWRpcmVjdGlvbi13cmFwcGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGNvbHVtbi1nYXA6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDQpO1xuICBtYXJnaW4tYmxvY2s6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDgpIHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDQpO1xuICBmb250LXNpemU6IHZhcigtLXNiYi10ZXh0LWZvbnQtc2l6ZS1zKTtcblxuICAuc2JiLXNyX190cmF2ZWwtZGlyZWN0aW9uLS1hcnJvdyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG59XG5cbi8vIE5BVklHQVRJT04gTkVXXG4uc2JiLXNyLW5hdmlnYXRpb24td3JhcHBlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG59XG5cbi5zYmItc3ItbmF2aWdhdGlvbiB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZy1pbmxpbmU6IDE2cHg7XG59XG5cbi5zYmItc3ItbmF2aWdhdGlvbl9fbGlzdC1jb2FjaGVzIHtcbiAgQGluY2x1ZGUgc2JiLmxpc3QtcmVzZXQ7XG4gIEBpbmNsdWRlIHNiYi5zY3JvbGxiYXI7XG5cbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG4gIHBhZGRpbmc6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDYpIHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDUpIDA7XG4gIG1heC13aWR0aDogJG1heC1jb2FjaC1uYXZpZ2F0aW9uLXdpZHRoO1xuXG4gIC8vIFNldCBzYmIgc2Nyb2xsYmFyIHRyYW5zcGFyZW50IGJ5IGRlZmF1bHRcbiAgLS1zYmItc2Nyb2xsYmFyLWNvbG9yOiB0cmFuc3BhcmVudDtcblxuICBvdmVyZmxvdzogc2Nyb2xsIGhpZGRlbjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0gU2VhdCBSZXNlcnZhdGlvbiBNYWluIE5hdmlnYXRpb24gLSBFTkQgLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyAtLS0tLS0tLS0tLS0tIFNlYXQgUmVzZXJ2YXRpb24gQ29hY2hlcyAtIFNUQVJUIC0tLS0tLS0tLS0tLS0tLS0tXG4uc2JiLXNyX193cmFwcGVyLWNvYWNoLWRlY2tzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgaGVpZ2h0OiBpbmhlcml0O1xuXG4gIC5zYmItc3JfX3dyYXBwZXItZGVjay1sYWJlbHMge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGhlaWdodDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0odmFyKC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24taGVpZ2h0KSk7XG4gICAgd3JpdGluZy1tb2RlOiB2ZXJ0aWNhbC1scjtcblxuICAgIGIge1xuICAgICAgaGVpZ2h0OiBjYWxjKDUwJSAtIHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDE2KSk7XG4gICAgICB3aWR0aDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMjApO1xuICAgICAgbWFyZ2luLWJsb2NrLWVuZDogMTZweDtcbiAgICAgIHJvdGF0ZTogMTgwZGVnO1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgbGluZS1oZWlnaHQ6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDIwKTtcbiAgICB9XG4gIH1cbn1cblxuLnNiYi1zcl9fd3JhcHBlci1zY3JvbGxhcmVhIHtcbiAgQGluY2x1ZGUgc2JiLnNjcm9sbGJhcjtcblxuICBvdmVyZmxvdzogc2Nyb2xsIGhpZGRlbjtcbiAgcGFkZGluZy1ibG9jazogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oOCkgc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMTYpO1xuXG4gIC5zYmItc3JfX3BhcmVudCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgfVxufVxuXG4uc2JiLXNyX19saXN0LWRlY2tzIHtcbiAgQGluY2x1ZGUgc2JiLmxpc3QtcmVzZXQ7XG5cbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbn1cblxuLnNiYi1zcl9fbGlzdC1kZWNrcy0tZ2FwIHtcbiAgZ2FwOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0OCk7XG59XG5cbi5zYmItc3JfX2xpc3QtaXRlbS1kZWNrIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uc2JiLXNyX19saXN0LWNvYWNoZXMge1xuICBAaW5jbHVkZSBzYmIubGlzdC1yZXNldDtcblxuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDQpO1xufVxuXG4vLyBJZiB0aGVyZSBhcmUgb3ZlcmhhbmdpbmcgZWxlbWVudHMgd2UgbmVlZCB0byBpbmNyZWFzZSB0aGUgZ2FwIGJldHdlZW4gY29hY2hlc1xuLnNiYi1zcl9fbGlzdC1kZWNrczpoYXMoLnNiYi1zci1jb2FjaC1oYXMtb3ZlcmhhbmdpbmctZWxlbWVudHMpIC5zYmItc3JfX2xpc3QtY29hY2hlcyB7XG4gIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oOCk7XG59XG5cbi5zYmItc3JfX2l0ZW0tY29hY2gge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5zYmItc3ItY29hY2gtd3JhcHBlcl9fdGFibGUge1xuICBvdXRsaW5lOiAwO1xufVxuIiwiaW1wb3J0IHsgU2JiTGFuZ3VhZ2VDb250cm9sbGVyIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9jb250cm9sbGVycy5qcyc7XG5pbXBvcnQgeyBib3hTaXppbmdTdHlsZXMgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL3N0eWxlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNiYlBvcG92ZXJFbGVtZW50IH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvcG9wb3Zlci5qcyc7XG5pbXBvcnQgeyBodG1sLCBpc1NlcnZlciwgbm90aGluZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgdHlwZSB7IENTU1Jlc3VsdEdyb3VwLCBQcm9wZXJ0eVZhbHVlcywgVGVtcGxhdGVSZXN1bHQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY2xhc3NNYXAgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9jbGFzcy1tYXAuanMnO1xuaW1wb3J0IHsgcmVwZWF0IH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVwZWF0LmpzJztcbmltcG9ydCB7IHN0eWxlTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvc3R5bGUtbWFwLmpzJztcblxuaW1wb3J0IHsgZ2V0STE4blNlYXRSZXNlcnZhdGlvbiB9IGZyb20gJy4uL2NvbW1vbi90cmFuc2xhdGlvbnMudHMnO1xuaW1wb3J0IHR5cGUge1xuICBDb2FjaEl0ZW0sXG4gIENvYWNoSXRlbURldGFpbHMsXG4gIFBsYWNlLFxuICBFbGVtZW50RGltZW5zaW9uLFxuICBCYXNlRWxlbWVudCxcbiAgUGxhY2VTZWxlY3Rpb24sXG4gIFNlYXRSZXNlcnZhdGlvbixcbn0gZnJvbSAnLi4vY29tbW9uL3R5cGVzLnRzJztcbmltcG9ydCB7IFNiYlNlYXRSZXNlcnZhdGlvbkFyZWFFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1hcmVhL3NlYXQtcmVzZXJ2YXRpb24tYXJlYS5jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgU2JiU2VhdFJlc2VydmF0aW9uR3JhcGhpY0VsZW1lbnQgfSBmcm9tICcuLi9zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMvc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLmNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBTYmJTZWF0UmVzZXJ2YXRpb25OYXZpZ2F0aW9uQ29hY2hFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1uYXZpZ2F0aW9uLWNvYWNoL3NlYXQtcmVzZXJ2YXRpb24tbmF2aWdhdGlvbi1jb2FjaC5jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgU2JiU2VhdFJlc2VydmF0aW9uUGxhY2VDb250cm9sRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC9zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wuY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFNiYlNlYXRSZXNlcnZhdGlvblNjb3BlZEVsZW1lbnQgfSBmcm9tICcuLi9zZWF0LXJlc2VydmF0aW9uLXNjb3BlZC9zZWF0LXJlc2VydmF0aW9uLXNjb3BlZC5jb21wb25lbnQudHMnO1xuXG5pbXBvcnQgeyBTZWF0UmVzZXJ2YXRpb25CYXNlRWxlbWVudCB9IGZyb20gJy4vc2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQudHMnO1xuaW1wb3J0IHN0eWxlIGZyb20gJy4vc2VhdC1yZXNlcnZhdGlvbi5zY3NzP2xpdCZpbmxpbmUnO1xuXG5pbXBvcnQgJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2J1dHRvbi5qcyc7XG5pbXBvcnQgJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL3NjcmVlbi1yZWFkZXItb25seS5qcyc7XG5pbXBvcnQgJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL3BvcG92ZXIuanMnO1xuXG5TYmJTZWF0UmVzZXJ2YXRpb25BcmVhRWxlbWVudC5kZWZpbmUoKTtcblNiYlNlYXRSZXNlcnZhdGlvbkdyYXBoaWNFbGVtZW50LmRlZmluZSgpO1xuU2JiU2VhdFJlc2VydmF0aW9uUGxhY2VDb250cm9sRWxlbWVudC5kZWZpbmUoKTtcblNiYlNlYXRSZXNlcnZhdGlvbk5hdmlnYXRpb25Db2FjaEVsZW1lbnQuZGVmaW5lKCk7XG5TYmJTZWF0UmVzZXJ2YXRpb25TY29wZWRFbGVtZW50LmRlZmluZSgpO1xuXG4vKipcbiAqIE1haW4gY29tcG9uZW50IGZvciB0aGUgc2VhdCByZXNlcnZhdGlvbi5cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBTYmJTZWF0UmVzZXJ2YXRpb25FbGVtZW50IGV4dGVuZHMgU2VhdFJlc2VydmF0aW9uQmFzZUVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IGVsZW1lbnROYW1lOiBzdHJpbmcgPSAnc2JiLXNlYXQtcmVzZXJ2YXRpb24nO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBbYm94U2l6aW5nU3R5bGVzLCBzdHlsZV07XG5cbiAgcHJpdmF0ZSBfbGFuZ3VhZ2UgPSBuZXcgU2JiTGFuZ3VhZ2VDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9jb2FjaGVzSHRtbFRlbXBsYXRlPzogVGVtcGxhdGVSZXN1bHQ7XG5cbiAgLy8gQXJlYSBpY29ucyB0aGF0IHNob3VsZCBub3QgYmUgZml4ZWQgZHVyaW5nIHJvdGF0aW9uIHdoZW4gdmVydGljYWwgbW9kZSBpcyBzZWxlY3RlZFxuICBwcml2YXRlIF9ub3RGaXhlZFJvdGF0YWJsZUFyZWFJY29ucyA9IFsnRU5UUllfRVhJVCddO1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnaGFzTmF2aWdhdGlvbicpKSB7XG4gICAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgICAgID8ucXVlcnlTZWxlY3RvckFsbCgndGFibGUnKVxuICAgICAgICAgIC5mb3JFYWNoKCh0YWJsZSkgPT4gdGFibGUucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgICAgID8ucXVlcnlTZWxlY3RvckFsbCgndGFibGUnKVxuICAgICAgICAgIC5mb3JFYWNoKCh0YWJsZSkgPT4gdGFibGUuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIC8vIFdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgZmlyc3QgdXBkYXRlIGlzIGNvbXBsZXRlIHRvIGluaXQgZGlmZmVyZW50IEhUTUwgZWxlbWVudCBkaW1lbnNpb25zXG4gICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgdGhpcy5faW5pdFZlaGljbGVTZWF0UmVzZXJ2YXRpb25Db25zdHJ1Y3Rpb24oKTtcbiAgICByZXR1cm4gdGhpcy5fY29hY2hlc0h0bWxUZW1wbGF0ZSB8fCBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFZlaGljbGVTZWF0UmVzZXJ2YXRpb25Db25zdHJ1Y3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fY29hY2hlc0h0bWxUZW1wbGF0ZSA9IGh0bWxgXG4gICAgICAke3RoaXMuX3JlbmRlclRyYXZlbERpcmVjdGlvbigpfVxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zcl9fY29tcG9uZW50XCI+XG4gICAgICAgICR7dGhpcy5fcmVuZGVyTmF2aWdhdGlvbigpfVxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJzYmItc3JfX3dyYXBwZXItY29hY2gtZGVja3NcIlxuICAgICAgICAgIEBrZXlkb3duPSR7KGV2dDogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5rZXlib2FyZFNlYXRtYXBFdmVudEhhbmRsaW5nKGV2dCl9XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLXNyX193cmFwcGVyLWRlY2stbGFiZWxzXCI+JHt0aGlzLl9yZW5kZXJEZWNrTGFiZWxzKCl9PC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgQHNjcm9sbD0keygpID0+IHRoaXMuY29hY2hBcmVhU2Nyb2xsZW5kKCl9XG4gICAgICAgICAgICBpZD1cInNiYi1zcl9fd3JhcHBlci1zY3JvbGxhcmVhXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2JiLXNyX193cmFwcGVyLXNjcm9sbGFyZWFcIlxuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBpZD1cInNiYi1zcl9fcGFyZW50LWFyZWFcIiBjbGFzcz1cInNiYi1zcl9fcGFyZW50XCI+XG4gICAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiJHtjbGFzc01hcCh7XG4gICAgICAgICAgICAgICAgICAnc2JiLXNyX19saXN0LWRlY2tzJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICdzYmItc3JfX2xpc3QtZGVja3MtLWdhcCc6IHRoaXMuaGFzTXVsdGlwbGVEZWNrcyxcbiAgICAgICAgICAgICAgICB9KX1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgJHt0aGlzLnNlYXRSZXNlcnZhdGlvbnM/Lm1hcChcbiAgICAgICAgICAgICAgICAgIChzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiwgY29hY2hEZWNrSW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbGA8bGkgY2xhc3M9XCJzYmItc3JfX2xpc3QtaXRlbS1kZWNrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwic2JiLXNyX19saXN0LWNvYWNoZXNcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuX3JlbmRlckNvYWNoZXMoc2VhdFJlc2VydmF0aW9uLCBjb2FjaERlY2tJbmRleCl9XG4gICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgPC9saT5gO1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlckRlY2tMYWJlbHMoKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZURlY2tzKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB0aGlzLnNlYXRSZXNlcnZhdGlvbnMubWFwKChzZWF0UmVzZXJ2YXRpb24pID0+IHtcbiAgICAgIGNvbnN0IGRlY2tEZXNjcmlwdGlvbiA9IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oXG4gICAgICAgIHNlYXRSZXNlcnZhdGlvbi5kZWNrQ29hY2hMZXZlbCxcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gaHRtbGA8YiBhcmlhLWhpZGRlbj1cInRydWVcIj4ke2RlY2tEZXNjcmlwdGlvbn08L2I+YDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlck5hdmlnYXRpb25Db250cm9sQnV0dG9uKGJ0bkRpcmVjdGlvbjogc3RyaW5nKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuaGFzTmF2aWdhdGlvbiB8fCAhdGhpcy5zZWF0UmVzZXJ2YXRpb25zKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBidG5OYXZpZ2F0aW9uRGlyZWN0aW9uSWQgPVxuICAgICAgYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fUklHSFQnXG4gICAgICAgID8gJ3NiYi1zci1uYXZpZ2F0aW9uX193cmFwcGVyLWJ1dHRvbi1kaXJlY3Rpb24tLXJpZ2h0J1xuICAgICAgICA6ICdzYmItc3ItbmF2aWdhdGlvbl9fd3JhcHBlci1idXR0b24tZGlyZWN0aW9uLS1sZWZ0JztcbiAgICBjb25zdCBidG5JY29uID1cbiAgICAgIGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX1JJR0hUJyA/ICdjaGV2cm9uLXNtYWxsLXJpZ2h0LXNtYWxsJyA6ICdjaGV2cm9uLXNtYWxsLWxlZnQtc21hbGwnO1xuICAgIGNvbnN0IGJ0bkFyaWFEZXNjcmlwdGlvbiA9XG4gICAgICBidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9SSUdIVCdcbiAgICAgICAgPyBnZXRJMThuU2VhdFJlc2VydmF0aW9uKCdTRUFUX1JFU0VSVkFUSU9OX0VORCcsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpXG4gICAgICAgIDogZ2V0STE4blNlYXRSZXNlcnZhdGlvbignU0VBVF9SRVNFUlZBVElPTl9CRUdJTicsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpO1xuICAgIGxldCBidG5EaXNhYmxlZCA9IHRydWU7XG5cbiAgICBpZiAoYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fTEVGVCcgJiYgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPiAwKSB7XG4gICAgICBidG5EaXNhYmxlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9SSUdIVCcgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4IDwgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMubGVuZ3RoIC0gMVxuICAgICkge1xuICAgICAgYnRuRGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwic2JiLXNyLW5hdmlnYXRpb25fX3dyYXBwZXItYnV0dG9uLWRpcmVjdGlvblwiPlxuICAgICAgPHNiYi1zZWNvbmRhcnktYnV0dG9uXG4gICAgICAgIEBjbGljaz1cIiR7KCkgPT4gdGhpcy5uYXZpZ2F0ZUJ5RGlyZWN0aW9uQnRuKGJ0bkRpcmVjdGlvbil9XCJcbiAgICAgICAgQGZvY3VzPVwiJHsoKSA9PiB0aGlzLm9uRm9jdXNOYXZEaXJlY3Rpb25CdXR0b24oKX1cIlxuICAgICAgICBpZD1cIiR7YnRuTmF2aWdhdGlvbkRpcmVjdGlvbklkfVwiXG4gICAgICAgIGNsYXNzPVwic2JiLXNyX19uYXZpZ2F0aW9uLWNvbnRyb2wtYnV0dG9uXCJcbiAgICAgICAgc2l6ZT1cIm1cIlxuICAgICAgICBpY29uLW5hbWU9XCIke2J0bkljb259XCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCIke2J0bkFyaWFEZXNjcmlwdGlvbn1cIlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgLmRpc2FibGVkSW50ZXJhY3RpdmU9XCIke2J0bkRpc2FibGVkIHx8IG5vdGhpbmd9XCJcbiAgICAgICAgLmRpc2FibGVkPVwiJHtidG5EaXNhYmxlZCB8fCBub3RoaW5nfVwiXG4gICAgICA+PC9zYmItc2Vjb25kYXJ5LWJ1dHRvbj5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyVHJhdmVsRGlyZWN0aW9uKCk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnRyYXZlbERpcmVjdGlvbiB8fCB0aGlzLnRyYXZlbERpcmVjdGlvbiA9PT0gJ05PTkUnKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGxhYmVsVGV4dCA9IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oXG4gICAgICAnU0VBVF9SRVNFUlZBVElPTl9UUkFWRUxfRElSRUNUSU9OJyxcbiAgICAgIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsXG4gICAgKTtcblxuICAgIGNvbnN0IGFycm93RGlyZWN0aW9uID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICA/IHRoaXMudHJhdmVsRGlyZWN0aW9uID09PSAnUklHSFQnXG4gICAgICAgID8gJ2Rvd24nXG4gICAgICAgIDogJ3VwJ1xuICAgICAgOiB0aGlzLnRyYXZlbERpcmVjdGlvbiA9PT0gJ1JJR0hUJ1xuICAgICAgICA/ICdyaWdodCdcbiAgICAgICAgOiAnbGVmdCc7XG5cbiAgICBjb25zdCBpY29uTmFtZSA9IGBhcnJvdy0ke2Fycm93RGlyZWN0aW9ufS1zbWFsbGA7XG5cbiAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwic2JiLXNyLXRyYXZlbC1kaXJlY3Rpb24td3JhcHBlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zcl9fdHJhdmVsLWRpcmVjdGlvbi0tYXJyb3dcIj5cbiAgICAgICAgPHNiYi1pY29uIHNsb3Q9XCJpY29uXCIgbmFtZT1cIiR7aWNvbk5hbWV9XCI+PC9zYmItaWNvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zcl9fdHJhdmVsLWRpcmVjdGlvbi0tbGFiZWxcIj4ke2xhYmVsVGV4dH08L2Rpdj5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyTmF2aWdhdGlvbigpOiBUZW1wbGF0ZVJlc3VsdCB8IG51bGwge1xuICAgIGlmIChpc1NlcnZlciB8fCAhdGhpcy5oYXNOYXZpZ2F0aW9uIHx8ICF0aGlzLnNlYXRSZXNlcnZhdGlvbnMpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJzYmItc3ItbmF2aWdhdGlvbi13cmFwcGVyXCI+XG4gICAgICA8bmF2IGlkPVwic2JiLXNyLW5hdmlnYXRpb25cIiBjbGFzcz1cInNiYi1zci1uYXZpZ2F0aW9uXCI+XG4gICAgICAgICR7dGhpcy5fcmVuZGVyTmF2aWdhdGlvbkNvbnRyb2xCdXR0b24oJ0RJUkVDVElPTl9MRUZUJyl9XG4gICAgICAgIDx1bFxuICAgICAgICAgIGlkPVwic2JiLXNyX19uYXZpZ2F0aW9uLWxpc3QtY29hY2hlc1wiXG4gICAgICAgICAgY2xhc3M9XCJzYmItc3ItbmF2aWdhdGlvbl9fbGlzdC1jb2FjaGVzXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiJHtnZXRJMThuU2VhdFJlc2VydmF0aW9uKFxuICAgICAgICAgICAgJ1NFQVRfUkVTRVJWQVRJT05fTkFWSUdBVElPTicsXG4gICAgICAgICAgICB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LFxuICAgICAgICAgICl9XCJcbiAgICAgICAgPlxuICAgICAgICAgICR7dGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMubWFwKFxuICAgICAgICAgICAgKGNvYWNoSXRlbURldGFpbHM6IENvYWNoSXRlbURldGFpbHMsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGh0bWxgPGxpPlxuICAgICAgICAgICAgICAgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1uYXZpZ2F0aW9uLWNvYWNoXG4gICAgICAgICAgICAgICAgICBAc2VsZWN0Y29hY2g9JHsoZXZlbnQ6IEN1c3RvbUV2ZW50PG51bWJlcj4pID0+IHRoaXMuX29uU2VsZWN0TmF2Q29hY2goZXZlbnQpfVxuICAgICAgICAgICAgICAgICAgQGZvY3VzY29hY2g9JHsoKSA9PiB0aGlzLl9vbkZvY3VzTmF2Q29hY2goKX1cbiAgICAgICAgICAgICAgICAgIEBrZXl1cD0keyhldnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMub25LZXlOYXZpZ2F0aW9uTmF2Q29hY2hCdXR0b24oZXZ0LCBpbmRleCl9XG4gICAgICAgICAgICAgICAgICBpbmRleD1cIiR7aW5kZXh9XCJcbiAgICAgICAgICAgICAgICAgIC5zZWxlY3RlZD0ke3RoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID09PSBpbmRleH1cbiAgICAgICAgICAgICAgICAgIC5mb2N1c2VkPSR7dGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9PT0gaW5kZXh9XG4gICAgICAgICAgICAgICAgICAuaG92ZXJlZD0ke3RoaXMuaG92ZXJlZENvYWNoSW5kZXggPT09IGluZGV4fVxuICAgICAgICAgICAgICAgICAgLm5hdGl2ZUZvY3VzQWN0aXZlPSR7dGhpcy5oYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1c31cbiAgICAgICAgICAgICAgICAgIC5jb2FjaEl0ZW1EZXRhaWxzPVwiJHtjb2FjaEl0ZW1EZXRhaWxzfVwiXG4gICAgICAgICAgICAgICAgICA/dmVydGljYWw9XCIke3RoaXMuYWxpZ25WZXJ0aWNhbH1cIlxuICAgICAgICAgICAgICAgICAgP3Nob3dUaXRsZUluZm89XCIke3RoaXMuc2hvd1RpdGxlSW5mb31cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L3NiYi1zZWF0LXJlc2VydmF0aW9uLW5hdmlnYXRpb24tY29hY2g+XG4gICAgICAgICAgICAgIDwvbGk+YDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKX1cbiAgICAgICAgPC91bD5cbiAgICAgICAgJHt0aGlzLl9yZW5kZXJOYXZpZ2F0aW9uQ29udHJvbEJ1dHRvbignRElSRUNUSU9OX1JJR0hUJyl9XG4gICAgICA8L25hdj5cbiAgICA8L2Rpdj5gO1xuICB9XG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBAcGFyYW0gc2VhdFJlc2VydmF0aW9uXG4gICAqIEBwYXJhbSBjb2FjaERlY2tJbmRleFxuICAgKi9cbiAgcHJpdmF0ZSBfcmVuZGVyQ29hY2hlcyhcbiAgICBzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdFtdIHwgbnVsbCB7XG4gICAgY29uc3QgY29hY2hlczogQ29hY2hJdGVtW10gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHNlYXRSZXNlcnZhdGlvbj8uY29hY2hJdGVtcykpO1xuXG4gICAgaWYgKCFjb2FjaGVzIHx8IGlzU2VydmVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNvYWNoZXMubWFwKChjb2FjaEl0ZW06IENvYWNoSXRlbSwgY29hY2hJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgPGxpIGNsYXNzPVwic2JiLXNyX19pdGVtLWNvYWNoXCI+XG4gICAgICAgICAgJHt0aGlzLl9yZW5kZXJDb2FjaEVsZW1lbnQoXG4gICAgICAgICAgICBjb2FjaEl0ZW0sXG4gICAgICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICAgICAgY29hY2hEZWNrSW5kZXgsXG4gICAgICAgICAgICBzZWF0UmVzZXJ2YXRpb24uZGVja0NvYWNoSW5kZXgsXG4gICAgICAgICAgKX1cbiAgICAgICAgPC9saT5cbiAgICAgIGA7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJDb2FjaEVsZW1lbnQoXG4gICAgY29hY2hJdGVtOiBDb2FjaEl0ZW0sXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICAgcGxhY2VDb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgY29uc3QgY2FsY3VsYXRlZENvYWNoRGltZW5zaW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKGNvYWNoSXRlbS5kaW1lbnNpb24pO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uVGFibGVDb2FjaFdpdGhTZXJ2aWNlcyA9IHRoaXMuX2dldERlc2NyaXB0aW9uVGFibGVDb2FjaChjb2FjaEl0ZW0pO1xuXG4gICAgcmV0dXJuIGh0bWxgPHNiYi1zZWF0LXJlc2VydmF0aW9uLXNjb3BlZFxuICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXNjb3BlZC13aWR0aCc6IGNhbGN1bGF0ZWRDb2FjaERpbWVuc2lvbi53LFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQtaGVpZ2h0JzogY2FsY3VsYXRlZENvYWNoRGltZW5zaW9uLmgsXG4gICAgICB9KX1cbiAgICA+XG4gICAgICAke3RoaXMuX2dldFJlbmRlcmVkQ29hY2hCb3JkZXJzKGNvYWNoSXRlbSwgY29hY2hJbmRleCl9XG4gICAgICAke3RoaXMuX2dldFJlbmRlcmVkR3JhcGhpY2FsRWxlbWVudHMoXG4gICAgICAgIGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHMgfHwgW10sXG4gICAgICAgIGNvYWNoSXRlbS5kaW1lbnNpb24sXG4gICAgICAgIGNvYWNoSW5kZXgsXG4gICAgICAgIGNvYWNoRGVja0luZGV4LFxuICAgICAgKX1cbiAgICAgICR7dGhpcy5fZ2V0UmVuZGVyZWRTZXJ2aWNlRWxlbWVudHMoY29hY2hJbmRleCwgY29hY2hEZWNrSW5kZXgsIGNvYWNoSXRlbS5zZXJ2aWNlRWxlbWVudHMpfVxuXG4gICAgICA8dGFibGVcbiAgICAgICAgQGZvY3VzPSR7KCkgPT4gdGhpcy5vbkZvY3VzVGFibGVDb2FjaEFuZFByZXNlbGVjdFBsYWNlKGNvYWNoSW5kZXgpfVxuICAgICAgICBpZD1cInNiYi1zci1jb2FjaC0ke2NvYWNoSW5kZXh9XCJcbiAgICAgICAgY2xhc3M9XCJzYmItc3ItY29hY2gtd3JhcHBlcl9fdGFibGVcIlxuICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwic2JiLXNyLWNvYWNoLWNhcHRpb24tJHtjb2FjaEluZGV4fVwiXG4gICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgPlxuICAgICAgICA8Y2FwdGlvbiBpZD1cInNiYi1zci1jb2FjaC1jYXB0aW9uLSR7Y29hY2hJbmRleH1cIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgPHNiYi1zY3JlZW4tcmVhZGVyLW9ubHk+JHtkZXNjcmlwdGlvblRhYmxlQ29hY2hXaXRoU2VydmljZXN9PC9zYmItc2NyZWVuLXJlYWRlci1vbmx5PlxuICAgICAgICA8L2NhcHRpb24+XG4gICAgICAgICR7dGhpcy5fZ2V0UmVuZGVyZWRSb3dQbGFjZXMoY29hY2hJdGVtLCBjb2FjaEluZGV4LCBjb2FjaERlY2tJbmRleCwgcGxhY2VDb2FjaERlY2tJbmRleCl9XG4gICAgICA8L3RhYmxlPlxuICAgIDwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tc2NvcGVkPmA7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgUmV0dXJucyB0aGUgYm9yZGVyIGdyYXBoaWMgKENPQUNIX0JPUkRFUl9NSURETEUpIG9mIGEgY29hY2ggd2l0aCBjYWxjdWxhdGVkIGJvcmRlciBnYXAgYW5kIGNvYWNoIHdpZHRoLFxuICAgKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgY29hY2ggaXMgd2l0aCBhIGRyaXZlciBhcmVhIG9yIHdpdGhvdXQuXG4gICAqL1xuICBwcml2YXRlIF9nZXRSZW5kZXJlZENvYWNoQm9yZGVycyhcbiAgICBjb2FjaEl0ZW06IENvYWNoSXRlbSxcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgaWYgKCFjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IENPQUNIX1BBU1NBR0VfV0lEVEggPSAxO1xuICAgIGNvbnN0IGRyaXZlckFyZWEgPSB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1tjb2FjaEluZGV4XT8uZHJpdmVyQXJlYUVsZW1lbnRzPy5kcml2ZXJBcmVhO1xuICAgIGNvbnN0IGRyaXZlckFyZWFOb1ZlcnRpY2FsV2FsbCA9XG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1tjb2FjaEluZGV4XT8uZHJpdmVyQXJlYUVsZW1lbnRzPy5kcml2ZXJBcmVhTm9WZXJ0aWNhbFdhbGw7XG5cbiAgICBsZXQgYm9yZGVyV2lkdGggPSBkcml2ZXJBcmVhXG4gICAgICA/IGNvYWNoSXRlbS5kaW1lbnNpb24udyAtIGRyaXZlckFyZWEuZGltZW5zaW9uLncgLSBDT0FDSF9QQVNTQUdFX1dJRFRIXG4gICAgICA6IGNvYWNoSXRlbS5kaW1lbnNpb24udyAtIENPQUNIX1BBU1NBR0VfV0lEVEggKiAyO1xuXG4gICAgLy9tdWx0aXBseSB3aXRoIGJhc2UgZ3JpZCBzaXplIGFsd2F5cyBmb3IgYWxsIGtpbmQgb2YgYm9yZGVyV2lkdGhcbiAgICBib3JkZXJXaWR0aCAqPSB0aGlzLmJhc2VHcmlkU2l6ZTtcblxuICAgIGNvbnN0IGJvcmRlckhlaWdodCA9IChjb2FjaEl0ZW0uZGltZW5zaW9uLmggKyB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogMikgKiB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICBsZXQgYm9yZGVyT2Zmc2V0WCA9XG4gICAgICBkcml2ZXJBcmVhICYmIGRyaXZlckFyZWEucG9zaXRpb24ueCA9PT0gMFxuICAgICAgICA/IGRyaXZlckFyZWE/LmRpbWVuc2lvbi53ICogdGhpcy5iYXNlR3JpZFNpemVcbiAgICAgICAgOiB0aGlzLmJhc2VHcmlkU2l6ZTtcblxuICAgIC8vcmVjYWxjdWxhdGUgdGhlIGJvcmRlciB3aWR0aCBhbmQgb2Zmc2V0IGlmIHRoZXJlIGlzIGEgZHJpdmVyIGFyZWEgd2l0aG91dCB2ZXJ0aWNhbCB3YWxsIG9uIGJvdGggc2lkZXNcbiAgICBpZiAoZHJpdmVyQXJlYU5vVmVydGljYWxXYWxsKSB7XG4gICAgICBjb25zdCBjb2FjaFdpZHRoID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKGNvYWNoSXRlbS5kaW1lbnNpb24pLnc7XG5cbiAgICAgIC8vcmVjYWxjdWxhdGVkIGJvcmRlcldpZHRoID0gY29hY2hXaWR0aCAtIDIgKiBkcml2ZXIgYXJlYSB3aWR0aCwgc2luY2UgdGhlIGRyaXZlciBhcmVhIGlzIG9uIGJvdGggc2lkZXNcbiAgICAgIGJvcmRlcldpZHRoID0gY29hY2hXaWR0aCAtIDIgKiAoZHJpdmVyQXJlYU5vVmVydGljYWxXYWxsLmRpbWVuc2lvbi53ICogdGhpcy5iYXNlR3JpZFNpemUpO1xuXG4gICAgICAvL3JlY2FsY3VsYXRlZCBib3JkZXJPZmZzZXRYID0gZHJpdmVyIGFyZWEgd2lkdGgsIHNpbmNlIHRoZSBib3JkZXIgc3RhcnRzIGFmdGVyIHRoZSBkcml2ZXIgYXJlYSBvbiB0aGUgbGVmdCBzaWRlXG4gICAgICBib3JkZXJPZmZzZXRYID0gZHJpdmVyQXJlYU5vVmVydGljYWxXYWxsLmRpbWVuc2lvbi53ICogdGhpcy5iYXNlR3JpZFNpemU7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudENvYWNoT3ZlcmxhcHBpbmdJbmZvID0gdGhpcy5vdmVySGFuZ2luZ0VsZW1lbnRJbmZvcm1hdGlvbi5maW5kKFxuICAgICAgKGVsKSA9PiBlbC5jb2FjaElkID09PSBjb2FjaEl0ZW0uaWQsXG4gICAgKTtcblxuICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBvdmVyaGFuZ2luZyBwbGFjZXMgb3IgZ3JhcGhpY2FsIGVsZW1lbnRzIHRvIGFkanVzdCB0aGUgYm9yZGVyIHdpZHRoIGFuZCBvZmZzZXQgKyBnYXBcbiAgICAvLyBXZSBkbyBub3QgZGlmZmVyZW50aWF0ZSB3aGV0aGVyIHRoZXJlIGlzIHNvbWV0aGluZyB0byBiZSBkb25lIG9uIGJvdGggc2lkZXMgYXMgdGhpcyB3b3VsZCBsZWFkIHRvIHVubmVjZXNzYXJ5XG4gICAgLy8gY29tcGxleGl0eS4gU28gaWYgdGhlcmUgaXMgc29tZXRoaW5nIG9uIG9uZSBzaWRlLCB3ZSBqdXN0IGluY3JlYXNlIHRoZSBjb2FjaC1ib3JkZXIgb24gYm90aCBzaWRlcy5cbiAgICBpZiAoXG4gICAgICBjdXJyZW50Q29hY2hPdmVybGFwcGluZ0luZm8/Lm92ZXJoYW5naW5nUGxhY2VzIHx8XG4gICAgICBjdXJyZW50Q29hY2hPdmVybGFwcGluZ0luZm8/Lm92ZXJoYW5naW5nR3JhcGhpY0FyZWFzXG4gICAgKSB7XG4gICAgICBib3JkZXJXaWR0aCArPSAyICogdGhpcy5iYXNlR3JpZFNpemU7IC8vIHdlIGluY3JlYXNlIHRoZSB3aWR0aCBieSAyIGdyaWQgc2l6ZXMgdG8gaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIHByb3RydWRlZCBwbGFjZXMgb24gYm90aCBzaWRlc1xuICAgICAgYm9yZGVyT2Zmc2V0WCA9IDA7IC8vIHdlIHN0YXJ0IGF0IDAgdG8gaGF2ZSBlbm91Z2ggc3BhY2Ugb24gdGhlIGxlZnQgc2lkZSBhcyB3ZWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpY1xuICAgICAgICBjbGFzcz1cIiR7Y2xhc3NNYXAoe1xuICAgICAgICAgICdzYmItc3ItY29hY2gtaGFzLW92ZXJoYW5naW5nLWVsZW1lbnRzJzpcbiAgICAgICAgICAgIGN1cnJlbnRDb2FjaE92ZXJsYXBwaW5nSW5mbz8ub3ZlcmhhbmdpbmdQbGFjZXMgfHxcbiAgICAgICAgICAgIGN1cnJlbnRDb2FjaE92ZXJsYXBwaW5nSW5mbz8ub3ZlcmhhbmdpbmdHcmFwaGljQXJlYXMgfHxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICB9KX1cIlxuICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXdpZHRoJzogYm9yZGVyV2lkdGgsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1oZWlnaHQnOiBib3JkZXJIZWlnaHQsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy10b3AnOiB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZyAqIC0xLFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbGVmdCc6IGJvcmRlck9mZnNldFgsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1wb3NpdGlvbic6ICdhYnNvbHV0ZScsXG4gICAgICAgIH0pfVxuICAgICAgICBuYW1lPVwiQ09BQ0hfQk9SREVSX01JRERMRVwiXG4gICAgICAgID9zdHJldGNoPSR7dHJ1ZX1cbiAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICA+PC9zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljPlxuICAgIGA7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZW5kZXJlZFJvd1BsYWNlcyhcbiAgICBjb2FjaDogQ29hY2hJdGVtLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIHBsYWNlQ29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGlmICghY29hY2gucGxhY2VzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBQcmVwYXJlIHJvd3Mgd2l0aCB0aGUgcGxhY2VzIHRvIHJlbmRlciBhIHRhYmxlXG4gICAgY29uc3QgdGFibGVSb3dQbGFjZXM6IFJlY29yZDxudW1iZXIsIFBsYWNlW10+ID0ge307XG4gICAgZm9yIChjb25zdCBwbGFjZSBvZiBjb2FjaC5wbGFjZXMpIHtcbiAgICAgIGlmICghdGFibGVSb3dQbGFjZXNbcGxhY2UucG9zaXRpb24ueV0pIHtcbiAgICAgICAgdGFibGVSb3dQbGFjZXNbcGxhY2UucG9zaXRpb24ueV0gPSBbcGxhY2VdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFibGVSb3dQbGFjZXNbcGxhY2UucG9zaXRpb24ueV0ucHVzaChwbGFjZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGFibGVSb3dQbGFjZXMpXG4gICAgICAubWFwKChyb3dQbGFjZXM6IFBsYWNlW10sIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAgIDx0ciBpZD1cInJvdy0ke2NvYWNoSW5kZXh9LSR7cm93UGxhY2VzWzBdLnBvc2l0aW9uLnl9XCIgZGF0YS1yb3ctaW5kZXg9JHtpbmRleH0+XG4gICAgICAgICAgICAke3RoaXMuX2dldFJlbmRlcmVkQ29sdW1uUGxhY2VzKFxuICAgICAgICAgICAgICByb3dQbGFjZXMsXG4gICAgICAgICAgICAgIGNvYWNoSW5kZXgsXG4gICAgICAgICAgICAgIGNvYWNoRGVja0luZGV4LFxuICAgICAgICAgICAgICBwbGFjZUNvYWNoRGVja0luZGV4LFxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L3RyPlxuICAgICAgICBgO1xuICAgICAgfSlcbiAgICAgIC5mbGF0TWFwKChyb3dUZW1wbGF0ZSkgPT4gcm93VGVtcGxhdGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyZWRDb2x1bW5QbGFjZXMoXG4gICAgcGxhY2VzOiBQbGFjZVtdLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBkZWNrSW5kZXg6IG51bWJlcixcbiAgICBwbGFjZUNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgLy9Tb3J0cyBlYWNoIHBsYWNlIGJ5IGl0cyBhc2NlbmRpbmcgeCBjb29yZGluYXRlXG4gICAgcGxhY2VzLnNvcnQoXG4gICAgICAocGxhY2VBOiBQbGFjZSwgcGxhY2VCOiBQbGFjZSkgPT4gTnVtYmVyKHBsYWNlQS5wb3NpdGlvbi54KSAtIE51bWJlcihwbGFjZUIucG9zaXRpb24ueCksXG4gICAgKTtcblxuICAgIC8vIEZvciByZW5kZXJpbmcgdGhlIHBsYWNlcyB3aXRoaW4gYSB0ZCBlbGVtZW50LCBoZXJlIHdlIHVzZSByZXBlYXQgZGlyZWN0aXZlIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgZm9yIHJldXNpbmcgZWxlbWVudHMgKHRyYWNrIGJ5IGlkKS5cbiAgICBjb25zdCB0cmFja1BsYWNlSWQgPSBjb2FjaEluZGV4ICsgJy0nICsgcGxhY2VDb2FjaERlY2tJbmRleDtcbiAgICByZXR1cm4gaHRtbGAke3JlcGVhdChcbiAgICAgIHBsYWNlcyxcbiAgICAgIChwbGFjZSkgPT4gdHJhY2tQbGFjZUlkICsgJy0nICsgcGxhY2UubnVtYmVyLFxuICAgICAgKHBsYWNlLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBjYWxjdWxhdGVkRGltZW5zaW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKHBsYWNlLmRpbWVuc2lvbik7XG4gICAgICAgIGNvbnN0IGNhbGN1bGF0ZWRQb3NpdGlvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZFBvc2l0aW9uKHBsYWNlLnBvc2l0aW9uKTtcbiAgICAgICAgY29uc3Qgcm90YXRpb24gPSBwbGFjZS5yb3RhdGlvbiB8fCAwO1xuICAgICAgICBjb25zdCB0ZXh0Um90YXRpb24gPSB0aGlzLmFsaWduVmVydGljYWwgPyAtOTAgOiAwO1xuICAgICAgICBjb25zdCBwbGFjZUlkID0gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChkZWNrSW5kZXgsIGNvYWNoSW5kZXgsIHBsYWNlLm51bWJlcik7XG4gICAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgaWQ9XCJjZWxsLSR7ZGVja0luZGV4fS0ke2NvYWNoSW5kZXh9LSR7cGxhY2UucG9zaXRpb24ueX0tJHtpbmRleH1cIlxuICAgICAgICAgICAgY2xhc3M9XCJncmFwaGljYWwtZWxlbWVudFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2xcbiAgICAgICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC10ZXh0LXNjYWxlLXZhbHVlJzogTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgICBjYWxjdWxhdGVkRGltZW5zaW9uLncsXG4gICAgICAgICAgICAgICAgICBjYWxjdWxhdGVkRGltZW5zaW9uLmgsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLXdpZHRoJzogY2FsY3VsYXRlZERpbWVuc2lvbi53LFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtaGVpZ2h0JzogY2FsY3VsYXRlZERpbWVuc2lvbi5oLFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtdG9wJzogY2FsY3VsYXRlZFBvc2l0aW9uLnksXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC1sZWZ0JzogY2FsY3VsYXRlZFBvc2l0aW9uLngsXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC1yb3RhdGlvbic6IHJvdGF0aW9uLFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtdGV4dC1yb3RhdGlvbic6IHRleHRSb3RhdGlvbixcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIEBzZWxlY3RwbGFjZT0keyhzZWxlY3RQbGFjZUV2ZW50OiBDdXN0b21FdmVudDxQbGFjZVNlbGVjdGlvbj4pID0+XG4gICAgICAgICAgICAgICAgdGhpcy5fb25TZWxlY3RQbGFjZShzZWxlY3RQbGFjZUV2ZW50KX1cbiAgICAgICAgICAgICAgZXhwb3J0cGFydHM9XCJzYmItc3ItcGxhY2UtcGFydFwiXG4gICAgICAgICAgICAgIGlkPSR7cGxhY2VJZH1cbiAgICAgICAgICAgICAgY2xhc3M9XCJzZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2xcIlxuICAgICAgICAgICAgICB0ZXh0PSR7cGxhY2UubnVtYmVyfVxuICAgICAgICAgICAgICB0eXBlPSR7cGxhY2UudHlwZX1cbiAgICAgICAgICAgICAgc3RhdGU9JHtwbGFjZS5zdGF0ZX1cbiAgICAgICAgICAgICAgdHJhdmVsLWRpcmVjdGlvbj0ke3RoaXMudHJhdmVsRGlyZWN0aW9ufVxuICAgICAgICAgICAgICBjb2FjaC1pbmRleD0ke2NvYWNoSW5kZXh9XG4gICAgICAgICAgICAgIGRlY2staW5kZXg9JHtwbGFjZUNvYWNoRGVja0luZGV4fVxuICAgICAgICAgICAgICBkYXRhLWRlY2staW5kZXg9JHtkZWNrSW5kZXh9XG4gICAgICAgICAgICAgIC5wcm9wZXJ0eUlkcz0ke3BsYWNlLnByb3BlcnR5SWRzfVxuICAgICAgICAgICAgICAucHJldmVudENsaWNrPSR7dGhpcy5wcmV2ZW50UGxhY2VDbGlja31cbiAgICAgICAgICAgICAgP3Nob3dUaXRsZUluZm89XCIke3RoaXMuc2hvd1RpdGxlSW5mb31cIlxuICAgICAgICAgICAgPjwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICBgO1xuICAgICAgfSxcbiAgICApfWA7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZW5kZXJlZEdyYXBoaWNhbEVsZW1lbnRzKFxuICAgIGdyYXBoaWNhbEVsZW1lbnRzOiBCYXNlRWxlbWVudFtdLFxuICAgIGNvYWNoRGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdFtdIHwgbnVsbCB7XG4gICAgaWYgKCFncmFwaGljYWxFbGVtZW50cykgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gZ3JhcGhpY2FsRWxlbWVudHM/Lm1hcCgoZ3JhcGhpY2FsRWxlbWVudDogQmFzZUVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IGljb24gPSBncmFwaGljYWxFbGVtZW50Lmljb24gPz8gJyc7XG4gICAgICBjb25zdCBlbGVtZW50Um90YXRpb24gPSBncmFwaGljYWxFbGVtZW50LnJvdGF0aW9uIHx8IDA7XG4gICAgICBjb25zdCBpc05vdEZpeGVkUm90YXRpb25HcmFwaGljYWxFbGVtZW50ID1cbiAgICAgICAgdGhpcy5fbm90Rml4ZWRSb3RhdGFibGVBcmVhSWNvbnMuaW5kZXhPZihncmFwaGljYWxFbGVtZW50Lmljb24hKSA9PT0gLTE7XG4gICAgICBjb25zdCBlbGVtZW50Rml4ZWRSb3RhdGlvbiA9XG4gICAgICAgIHRoaXMuYWxpZ25WZXJ0aWNhbCAmJiBpc05vdEZpeGVkUm90YXRpb25HcmFwaGljYWxFbGVtZW50XG4gICAgICAgICAgPyBlbGVtZW50Um90YXRpb24gLSA5MFxuICAgICAgICAgIDogZWxlbWVudFJvdGF0aW9uO1xuXG4gICAgICAvL2NoZWNrIGlmIHRoZSBjdXJyZW50IGVsZW1lbnQgaXMgbm90IGFuIGFyZWEgZWxlbWVudCwgc2luY2UgdGhpcyBlbGVtZW50IGlzIGRyYXduIHdpdGhvdXQgYW4gYXJlYSBjb21wb25lbnRcbiAgICAgIGlmICh0aGlzLm5vdEFyZWFFbGVtZW50cy5maW5kSW5kZXgoKG5vdEFyZWFFbGVtZW50KSA9PiBub3RBcmVhRWxlbWVudCA9PT0gaWNvbikgPiAtMSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0UmVuZGVyRWxlbWVudFdpdGhvdXRBcmVhKGdyYXBoaWNhbEVsZW1lbnQsIGVsZW1lbnRSb3RhdGlvbiwgY29hY2hEaW1lbnNpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX2dldFJlbmRlckVsZW1lbnRXaXRoQXJlYShcbiAgICAgICAgZ3JhcGhpY2FsRWxlbWVudCxcbiAgICAgICAgZWxlbWVudEZpeGVkUm90YXRpb24sXG4gICAgICAgIGNvYWNoRGltZW5zaW9uLFxuICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICBjb2FjaERlY2tJbmRleCxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlcyBhIHJlbmRlcmVkIGVsZW1lbnQgd2l0aCBhbiBhcmVhIGNvbXBvbmVudFxuICAgKiBAcGFyYW0gZ3JhcGhpY2FsRWxlbWVudFxuICAgKiBAcGFyYW0gcm90YXRpb25cbiAgICogQHBhcmFtIGNvYWNoRGltZW5zaW9uXG4gICAqIEBwYXJhbSBjb2FjaEluZGV4IHVzZWQgdG8gZ2VuZXJhdGUgYSB1bmlxdWUgaWQgZm9yIHRoZSBwb3BvdmVyIHRyaWdnZXJcbiAgICogQHBhcmFtIGNvYWNoRGVja0luZGV4IHVzZWQgdG8gZ2VuZXJhdGUgYSB1bmlxdWUgaWRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX2dldFJlbmRlckVsZW1lbnRXaXRoQXJlYShcbiAgICBncmFwaGljYWxFbGVtZW50OiBCYXNlRWxlbWVudCxcbiAgICByb3RhdGlvbjogbnVtYmVyLFxuICAgIGNvYWNoRGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgLy8gZm9yIFRBQkxFLCB3ZSB1c2UgdGhlIGFyZWEgY29tcG9uZW50IGl0c2VsZiB0byBkaXNwbGF5IHRoZSB0YWJsZSBpbnN0ZWFkIG9mIHRoZSBTVkcgZ3JhcGhpYy5cbiAgICAvLyBEdWUgdG8gZGlmZmVyZW50IGhlaWdodHMgYW5kIHdpZHRocywgaXQgd291bGRuJ3Qgc2hvdyBjb3JyZWN0bHkuIFRvIGNvcnJlY3QgdGhpcywgd2Ugd291bGRcbiAgICAvLyBuZWVkIGRpZmZpY3VsdCBjYWxjdWxhdGlvbnMgZm9yIHBvc2l0aW9uLCByb3RhdGlvbiBhbmQgZGltZW5zaW9uLlxuICAgIGNvbnN0IGlzTm90VGFibGVHcmFwaGljID0gZ3JhcGhpY2FsRWxlbWVudC5pY29uPy5pbmRleE9mKCdUQUJMRScpID09PSAtMTtcbiAgICBjb25zdCBhcmVhUHJvcGVydHkgPSBncmFwaGljYWxFbGVtZW50Lmljb24gJiYgaXNOb3RUYWJsZUdyYXBoaWMgPyBncmFwaGljYWxFbGVtZW50Lmljb24gOiBudWxsO1xuICAgIGNvbnN0IHN0cmV0Y2hIZWlnaHQgPVxuICAgICAgdGhpcy5pc0VsZW1lbnREaXJlY3RseU9uQm9yZGVyKGdyYXBoaWNhbEVsZW1lbnQsIGNvYWNoRGltZW5zaW9uKSAmJlxuICAgICAgYXJlYVByb3BlcnR5ICE9PSAnRU5UUllfRVhJVCc7XG4gICAgY29uc3QgYXJpYUxhYmVsRm9yQXJlYSA9IGdyYXBoaWNhbEVsZW1lbnQuaWNvblxuICAgICAgPyBnZXRJMThuU2VhdFJlc2VydmF0aW9uKGdyYXBoaWNhbEVsZW1lbnQuaWNvbiwgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudClcbiAgICAgIDogbm90aGluZztcblxuICAgIGNvbnN0IGNhbGN1bGF0ZWREaW1lbnNpb24gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oXG4gICAgICBncmFwaGljYWxFbGVtZW50LmRpbWVuc2lvbixcbiAgICAgIGNvYWNoRGltZW5zaW9uLFxuICAgICAgdHJ1ZSxcbiAgICAgIHN0cmV0Y2hIZWlnaHQsXG4gICAgKTtcblxuICAgIGNvbnN0IGNhbGN1bGF0ZWRQb3NpdGlvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZFBvc2l0aW9uKFxuICAgICAgZ3JhcGhpY2FsRWxlbWVudC5wb3NpdGlvbixcbiAgICAgIGdyYXBoaWNhbEVsZW1lbnQuZGltZW5zaW9uLFxuICAgICAgY29hY2hEaW1lbnNpb24sXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICAvL2dlbmVyYXRlIHVuaXF1ZSBpbmRleCBudW1iZXIgZm9yIHRoZSB0cmlnZ2VyIGVsZW1lbnRcbiAgICBjb25zdCB0cmlnZ2VySWQgPSBgcG9wb3Zlci10cmlnZ2VyLSR7Y29hY2hEZWNrSW5kZXh9LSR7Y29hY2hJbmRleH0tJHtjYWxjdWxhdGVkUG9zaXRpb24ueH0tJHtjYWxjdWxhdGVkUG9zaXRpb24ueX1gO1xuICAgIGxldCBlbGVtZW50TW91bnRpbmcgPSAnZnJlZSc7XG5cbiAgICBpZiAoZ3JhcGhpY2FsRWxlbWVudC5wb3NpdGlvbi55ID09PSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogLTEpIHtcbiAgICAgIGVsZW1lbnRNb3VudGluZyA9ICd1cHBlci1ib3JkZXInO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBncmFwaGljYWxFbGVtZW50LnBvc2l0aW9uLnkgKyBncmFwaGljYWxFbGVtZW50LmRpbWVuc2lvbi5oID09PVxuICAgICAgY29hY2hEaW1lbnNpb24uaCArIHRoaXMuY29hY2hCb3JkZXJPZmZzZXRcbiAgICApIHtcbiAgICAgIGVsZW1lbnRNb3VudGluZyA9ICdsb3dlci1ib3JkZXInO1xuICAgIH1cblxuICAgIC8vIFRJTU8tNDU4MzBcbiAgICAvLyBJZiBhcmVhIGVsZW1lbnRzIGFyZSBsb2NhdGVkIGF0IHRoZSBib3JkZXIgb2YgY29hY2gsXG4gICAgLy8gd2UgaGF2ZSB0byBtYW51YWxseSBtb2RpZnkgdGhlIHBvc2l0aW9uIGFuZCBoZWlnaHQgb2YgdGhlIGFyZWEgZWxlbWVudCxcbiAgICAvLyBzbyB0aGF0IHdlIGdldCBhIGdhcCBmcm9tIHRoZSB2aXN1ZWwgY29hY2ggYm9yZGVyXG4gICAgaWYgKGVsZW1lbnRNb3VudGluZyAhPT0gJ2ZyZWUnKSB7XG4gICAgICBjYWxjdWxhdGVkUG9zaXRpb24ueSArPSBlbGVtZW50TW91bnRpbmcgPT09ICd1cHBlci1ib3JkZXInID8gMiA6IDE7XG4gICAgICBjYWxjdWxhdGVkRGltZW5zaW9uLmggLT0gMztcbiAgICB9XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYVxuICAgICAgICBpZD1cIiR7dHJpZ2dlcklkfVwiXG4gICAgICAgIGNsYXNzPVwiJHtjbGFzc01hcCh7ICdzYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhLS1jdXJzb3ItcG9pbnRlcic6IGFyZWFQcm9wZXJ0eSAhPT0gbnVsbCB9KX1cIlxuICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhLXdpZHRoJzogY2FsY3VsYXRlZERpbWVuc2lvbi53LFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWEtaGVpZ2h0JzogY2FsY3VsYXRlZERpbWVuc2lvbi5oLFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWEtdG9wJzogY2FsY3VsYXRlZFBvc2l0aW9uLnksXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYS1sZWZ0JzogY2FsY3VsYXRlZFBvc2l0aW9uLngsXG4gICAgICAgIH0pfVxuICAgICAgICBtb3VudGluZz0ke2VsZW1lbnRNb3VudGluZ31cbiAgICAgICAgYmFja2dyb3VuZD1cImRhcmtcIlxuICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgPlxuICAgICAgICAke2FyZWFQcm9wZXJ0eVxuICAgICAgICAgID8gaHRtbGBcbiAgICAgICAgICAgICAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWNcbiAgICAgICAgICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbWF4LXdpZHRoJzogY2FsY3VsYXRlZERpbWVuc2lvbi53LFxuICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1oZWlnaHQnOiB0aGlzLmJhc2VHcmlkU2l6ZSxcbiAgICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcm90YXRpb24nOiByb3RhdGlvbixcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICBuYW1lPSR7YXJlYVByb3BlcnR5fVxuICAgICAgICAgICAgICAgIHJvbGU9XCJpbWdcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhdXRvLXdpZHRoXCJcbiAgICAgICAgICAgICAgPjwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYz5cbiAgICAgICAgICAgIGBcbiAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICA8L3NiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWE+XG4gICAgICAke2FyZWFQcm9wZXJ0eSA/IHRoaXMuX3BvcG92ZXIodHJpZ2dlcklkLCBhcmlhTGFiZWxGb3JBcmVhKSA6IG5vdGhpbmd9XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlbmRlckVsZW1lbnRXaXRob3V0QXJlYShcbiAgICBncmFwaGljYWxFbGVtZW50OiBCYXNlRWxlbWVudCxcbiAgICByb3RhdGlvbjogbnVtYmVyLFxuICAgIGNvYWNoRGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgY29uc3QgY2FsY3VsYXRlZERpbWVuc2lvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihcbiAgICAgIGdyYXBoaWNhbEVsZW1lbnQuZGltZW5zaW9uLFxuICAgICAgY29hY2hEaW1lbnNpb24sXG4gICAgKTtcbiAgICBjb25zdCBjYWxjdWxhdGVkUG9zaXRpb24gPSB0aGlzLmdldENhbGN1bGF0ZWRQb3NpdGlvbihcbiAgICAgIGdyYXBoaWNhbEVsZW1lbnQucG9zaXRpb24sXG4gICAgICBncmFwaGljYWxFbGVtZW50LmRpbWVuc2lvbixcbiAgICAgIGNvYWNoRGltZW5zaW9uLFxuICAgICk7XG5cbiAgICAvLyBJZiB0aGUgaWNvbiBpcyB0aGUgZHJpdmVyIGFyZWEsIHRoZW4gaGVyZSBjb25jYXQgdGhlIHZlaGljbGUgdHlwZSB0byBnZXQgdGhlIHJpZ2h0IHZlaGljbGUgY2hhc3NpcyBpY29uXG4gICAgY29uc3QgaWNvbiA9XG4gICAgICBncmFwaGljYWxFbGVtZW50Lmljb24gJiYgZ3JhcGhpY2FsRWxlbWVudC5pY29uLmVuZHNXaXRoKCdEUklWRVJfQVJFQScpXG4gICAgICAgID8gZ3JhcGhpY2FsRWxlbWVudC5pY29uPy5jb25jYXQoXG4gICAgICAgICAgICAnXycsXG4gICAgICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLnZlaGljbGVUeXBlLFxuICAgICAgICAgIClcbiAgICAgICAgOiBncmFwaGljYWxFbGVtZW50Lmljb247XG5cbiAgICByZXR1cm4gaHRtbGAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWNcbiAgICAgIHN0eWxlPSR7c3R5bGVNYXAoe1xuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXdpZHRoJzogY2FsY3VsYXRlZERpbWVuc2lvbi53LFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWhlaWdodCc6IGNhbGN1bGF0ZWREaW1lbnNpb24uaCxcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy10b3AnOiBjYWxjdWxhdGVkUG9zaXRpb24ueSxcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1sZWZ0JzogY2FsY3VsYXRlZFBvc2l0aW9uLngsXG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcG9zaXRpb24nOiAnYWJzb2x1dGUnLFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXJvdGF0aW9uJzogcm90YXRpb24sXG4gICAgICB9KX1cbiAgICAgIG5hbWU9JHtpY29uID8/IG5vdGhpbmd9XG4gICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgP3N0cmV0Y2g9JHt0cnVlfVxuICAgID48L3NiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWM+YDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlbmRlcmVkU2VydmljZUVsZW1lbnRzKFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIHNlcnZpY2VFbGVtZW50cz86IEJhc2VFbGVtZW50W10sXG4gICk6IFRlbXBsYXRlUmVzdWx0W10gfCBudWxsIHtcbiAgICBpZiAoIXNlcnZpY2VFbGVtZW50cykgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gc2VydmljZUVsZW1lbnRzPy5tYXAoKHNlcnZpY2VFbGVtZW50OiBCYXNlRWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgdGl0bGVEZXNjcmlwdGlvbiA9IHNlcnZpY2VFbGVtZW50Lmljb25cbiAgICAgICAgPyBnZXRJMThuU2VhdFJlc2VydmF0aW9uKHNlcnZpY2VFbGVtZW50Lmljb24sIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGNvbnN0IGNhbGN1bGF0ZWREaW1lbnNpb24gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oc2VydmljZUVsZW1lbnQuZGltZW5zaW9uKTtcbiAgICAgIGNvbnN0IGNhbGN1bGF0ZWRQb3NpdGlvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZFBvc2l0aW9uKHNlcnZpY2VFbGVtZW50LnBvc2l0aW9uKTtcbiAgICAgIGNvbnN0IGVsZW1lbnRSb3RhdGlvbiA9IHNlcnZpY2VFbGVtZW50LnJvdGF0aW9uIHx8IDA7XG4gICAgICBjb25zdCBlbGVtZW50Rml4ZWRSb3RhdGlvbiA9IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IGVsZW1lbnRSb3RhdGlvbiAtIDkwIDogZWxlbWVudFJvdGF0aW9uO1xuXG4gICAgICAvL2dlbmVyYXRlIHVuaXF1ZSBpbmRleCBudW1iZXIgZm9yIHRoZSB0cmlnZ2VyIGVsZW1lbnRcbiAgICAgIGNvbnN0IHRyaWdnZXJJZCA9IGBwb3BvdmVyLXRyaWdnZXItJHtjb2FjaERlY2tJbmRleH0tJHtjb2FjaEluZGV4fS0ke2NhbGN1bGF0ZWRQb3NpdGlvbi54fS0ke2NhbGN1bGF0ZWRQb3NpdGlvbi55fWA7XG5cbiAgICAgIHJldHVybiBodG1sYFxuICAgICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpY1xuICAgICAgICAgIGlkPVwiJHt0cmlnZ2VySWR9XCJcbiAgICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtd2lkdGgnOiBjYWxjdWxhdGVkRGltZW5zaW9uLncsXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWhlaWdodCc6IGNhbGN1bGF0ZWREaW1lbnNpb24uaCxcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtdG9wJzogY2FsY3VsYXRlZFBvc2l0aW9uLnksXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWxlZnQnOiBjYWxjdWxhdGVkUG9zaXRpb24ueCxcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcG9zaXRpb24nOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1yb3RhdGlvbic6IGVsZW1lbnRGaXhlZFJvdGF0aW9uLFxuICAgICAgICAgIH0pfVxuICAgICAgICAgIGNsYXNzPVwic2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy0tY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgIG5hbWU9JHtzZXJ2aWNlRWxlbWVudC5pY29uID8/IG5vdGhpbmd9XG4gICAgICAgICAgcm9sZT1cImltZ1wiXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgPjwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYz5cbiAgICAgICAgJHt0aGlzLl9wb3BvdmVyKHRyaWdnZXJJZCwgdGl0bGVEZXNjcmlwdGlvbil9XG4gICAgICBgO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbmFnZXMgdGhlIHNlbGVjdGVkIHBsYWNlIGV2ZW50IHRyaWdnZXJlZCBmcm9tIHRoZSBwbGFjZVxuICAgKiBFYWNoIHNlbGVjdGlvbiBlbWl0cyBhbiBhcnJheSBvZiBhbGwgc2VsZWN0ZWQgcGxhY2VzXG4gICAqIEBwYXJhbSBzZWxlY3RQbGFjZUV2ZW50XG4gICAqL1xuICBwcml2YXRlIF9vblNlbGVjdFBsYWNlKHNlbGVjdFBsYWNlRXZlbnQ6IEN1c3RvbUV2ZW50PFBsYWNlU2VsZWN0aW9uPik6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUGxhY2UgPSBzZWxlY3RQbGFjZUV2ZW50LmRldGFpbDtcbiAgICAvLyBXZSBoYXZlIHRvIHNldCBwcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgdG8gdHJ1ZSwgdG8gcHJldmVudCBhdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBuZXcgZm9jdXNlZCBwbGFjZVxuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gdHJ1ZTtcbiAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIC8vIENoZWNrIGFueSBrZXlib2FyZCBldmVudCB3YXMgdHJpZ2dlcmVkIGluc2lkZSB0aGUgc2VhdCByZXNlcnZhdGlvbiBjb21wb25lbnQsXG4gICAgLy8gc28gd2UgY2FuIHNheSB0aGUgbmF0aXZlIGJyb3dzZXIgZm9jdXMgbGllcyBvbiB0aGUgY29tcG9uZW50XG4gICAgaWYgKCF0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzKSB7XG4gICAgICB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucHJldmVudFBsYWNlQ2xpY2spIHtcbiAgICAgIC8vIEFkZCBwbGFjZSB0byBwbGFjZSBjb2xsZWN0aW9uXG4gICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKHNlbGVjdGVkUGxhY2UpO1xuICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRQbGFjZUluQ29hY2goc2VsZWN0ZWRQbGFjZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfb25TZWxlY3ROYXZDb2FjaChldmVudDogQ3VzdG9tRXZlbnQ8bnVtYmVyPik6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkTmF2Q29hY2hJbmRleCA9IGV2ZW50LmRldGFpbDtcblxuICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayA9IGZhbHNlO1xuICAgIHRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgPSB0cnVlO1xuXG4gICAgaWYgKHNlbGVjdGVkTmF2Q29hY2hJbmRleCAhPT0gbnVsbCAmJiBzZWxlY3RlZE5hdkNvYWNoSW5kZXggIT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChzZWxlY3RlZE5hdkNvYWNoSW5kZXgpO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROYXZDb2FjaEluZGV4ID09PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcbiAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgfVxuXG4gICAgLy9jbG9zZSBhbGwgb3BlbmVkIHBvcG92ZXJzXG4gICAgdGhpcy5fY2xvc2VQb3BvdmVyKCk7XG4gIH1cblxuICBwcml2YXRlIF9vbkZvY3VzTmF2Q29hY2goKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljaykge1xuICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBwb3BvdmVyIGZvciBleHRyYSBzZXJ2aWNlIGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB0cmlnZ2VySWRcbiAgICogQHBhcmFtIHBvcG92ZXJDb250ZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9wb3BvdmVyKFxuICAgIHRyaWdnZXJJZDogc3RyaW5nLFxuICAgIHBvcG92ZXJDb250ZW50OiBzdHJpbmcgfCBudWxsIHwgdHlwZW9mIG5vdGhpbmcsXG4gICk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzYmItcG9wb3ZlciB0cmlnZ2VyPVwiJHt0cmlnZ2VySWR9XCIgaG92ZXItdHJpZ2dlcj1cIlwiPlxuICAgICAgICA8cCBjbGFzcz1cInNiYi10ZXh0LXMgc2JiLXNyLXBvcG92ZXJcIj4ke3BvcG92ZXJDb250ZW50fTwvcD5cbiAgICAgIDwvc2JiLXBvcG92ZXI+XG4gICAgYDtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyIHRvIGNsb3NlIGFsbCBvcGVuZWQgcG9wb3ZlcnMgKG5vcm1hbGx5IG9ubHkgb25lIGlzIG9wZW5lZCBhdCBhIHRpbWUpXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9jbG9zZVBvcG92ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5zaGFkb3dSb290XG4gICAgICA/LnF1ZXJ5U2VsZWN0b3JBbGw8U2JiUG9wb3ZlckVsZW1lbnQ+KCdzYmItcG9wb3ZlcjpzdGF0ZShzdGF0ZS1vcGVuZWQpJylcbiAgICAgIC5mb3JFYWNoKChwb3BvdmVyKSA9PiBwb3BvdmVyLmNsb3NlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0RGVzY3JpcHRpb25UYWJsZUNvYWNoKGNvYWNoSXRlbTogQ29hY2hJdGVtKTogc3RyaW5nIHtcbiAgICAvL3Nob3cgZGlmZmVyZW50IHRhYmxlIGNhcHRpb24gZm9yIHNjcmVlbnJlYWRlciBpZiBpdCBpcyBhIGxvY29tb3RpdmVcbiAgICBpZiAoY29hY2hJdGVtLnR5cGUgPT09ICdMT0NPTU9USVZFX0NPQUNIJykge1xuICAgICAgcmV0dXJuIGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ0NPQUNIX0xPQ09NT1RJVkUnLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoIWNvYWNoSXRlbS5wbGFjZXM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ0NPQUNIX0JMT0NLRURfVEFCTEVfQ0FQVElPTicsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsIFtcbiAgICAgICAgY29hY2hJdGVtLmlkLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgbGV0IHRhYmxlQ29hY2hEZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGNvbnN0IGFyZWFEZXNjcmlwdGlvbnMgPSB0aGlzLl9nZXRUaXRsZURlc2NyaXB0aW9uTGlzdFN0cmluZyhjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzISk7XG4gICAgY29uc3Qgc2VydmljZURlc2NyaXB0aW9ucyA9IHRoaXMuX2dldFRpdGxlRGVzY3JpcHRpb25MaXN0U3RyaW5nKGNvYWNoSXRlbS5zZXJ2aWNlRWxlbWVudHMhKTtcblxuICAgIHRhYmxlQ29hY2hEZXNjcmlwdGlvbiA9IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ0NPQUNIX1RBQkxFX0NBUFRJT04nLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LCBbXG4gICAgICBjb2FjaEl0ZW0uaWQsXG4gICAgXSk7XG5cbiAgICBpZiAoIXRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgLy8gRXhwYW5kcyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBzZWF0cyBhbmQgYmljeWNsZSBzcGFjZXMgYXMgaW5mb1xuICAgICAgY29uc3QgZnJlZVBsYWNlcyA9IHRoaXMuZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChjb2FjaEl0ZW0ucGxhY2VzKTtcbiAgICAgIGNvbnN0IGZyZWVQbGFjZXNUeHQgPSBnZXRJMThuU2VhdFJlc2VydmF0aW9uKFxuICAgICAgICAnQ09BQ0hfQVZBSUxBQkxFX05VTUJFUl9PRl9QTEFDRVMnLFxuICAgICAgICB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LFxuICAgICAgICBbZnJlZVBsYWNlcy5zZWF0cywgZnJlZVBsYWNlcy5iaWN5Y2xlc10sXG4gICAgICApO1xuICAgICAgdGFibGVDb2FjaERlc2NyaXB0aW9uID0gdGFibGVDb2FjaERlc2NyaXB0aW9uLmNvbmNhdCgnLiAnKS5jb25jYXQoZnJlZVBsYWNlc1R4dCkuY29uY2F0KCcuICcpO1xuICAgIH1cblxuICAgIGlmICghIWFyZWFEZXNjcmlwdGlvbnMgfHwgISFzZXJ2aWNlRGVzY3JpcHRpb25zKSB7XG4gICAgICB0YWJsZUNvYWNoRGVzY3JpcHRpb24gKz1cbiAgICAgICAgJy4gJyArIGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ0NPQUNIX0FWQUlMQUJMRV9TRVJWSUNFUycsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpICsgJzogJztcbiAgICAgIHRhYmxlQ29hY2hEZXNjcmlwdGlvbiArPSBzZXJ2aWNlRGVzY3JpcHRpb25zICsgJywgJyArIGFyZWFEZXNjcmlwdGlvbnMgKyAnLic7XG4gICAgfVxuICAgIHJldHVybiB0YWJsZUNvYWNoRGVzY3JpcHRpb247XG4gIH1cblxuICBwcml2YXRlIF9nZXRUaXRsZURlc2NyaXB0aW9uTGlzdFN0cmluZyhkZXNjcmlwdGlvbnNFbGVtZW50czogQmFzZUVsZW1lbnRbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgdW5pcXVlRGVzY3JpcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgcmV0dXJuIGRlc2NyaXB0aW9uc0VsZW1lbnRzXG4gICAgICA/Lm1hcCgoZGVzY3JpcHRpb25FbGVtZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGljb24gPSBkZXNjcmlwdGlvbkVsZW1lbnQuaWNvbjtcbiAgICAgICAgaWYgKCFpY29uKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbkFscmVhZHlFeGlzdCA9IHVuaXF1ZURlc2NyaXB0aW9ucy5pbmRleE9mKGljb24pID4gLTE7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihcbiAgICAgICAgICBkZXNjcmlwdGlvbkVsZW1lbnQuaWNvbiEsXG4gICAgICAgICAgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaXNWYWxpZERlc2NyaXB0aW9uID1cbiAgICAgICAgICB0aGlzLl9ub3RGaXhlZFJvdGF0YWJsZUFyZWFJY29ucy5pbmRleE9mKGljb24pID09PSAtMSAmJlxuICAgICAgICAgIHRoaXMubm90QXJlYUVsZW1lbnRzLmluZGV4T2YoaWNvbikgPT09IC0xO1xuXG4gICAgICAgIGlmICghZGVzY3JpcHRpb25BbHJlYWR5RXhpc3QpIHtcbiAgICAgICAgICB1bmlxdWVEZXNjcmlwdGlvbnMucHVzaChkZXNjcmlwdGlvbkVsZW1lbnQuaWNvbiEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhIXRyYW5zbGF0aW9uICYmICFkZXNjcmlwdGlvbkFscmVhZHlFeGlzdCAmJiBpc1ZhbGlkRGVzY3JpcHRpb24gPyB0cmFuc2xhdGlvbiA6IG51bGw7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoZGVzY3JpcHRpb24pID0+ICEhZGVzY3JpcHRpb24pXG4gICAgICAuam9pbignLCAnKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXNlYXQtcmVzZXJ2YXRpb24nOiBTYmJTZWF0UmVzZXJ2YXRpb25FbGVtZW50O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
824
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi5jb21wb25lbnQtQlM1M3NaUjMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi5zY3NzP2xpdCZpbmxpbmUiLCIuLi8uLi8uLi9zcmMvZWxlbWVudHMtZXhwZXJpbWVudGFsL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uLmNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJAdXNlICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL3N0eWxlcycgYXMgc2JiO1xuQHVzZSAnLi4vY29tbW9uL3N0eWxlcy9zZWF0LXJlc2VydmF0aW9uLW1peGlucycgYXMgc2JiLXNyLW1peGlucztcbkB1c2UgJy4uL2NvbW1vbi9zdHlsZXMvc2VhdC1yZXNlcnZhdGlvbi1mdW5jdGlvbnMnIGFzIHNiYi1zci1mdW5jdGlvbnM7XG5cbi8vIE1heGltdW0gcmVzcG9uc2l2ZSBuYXZpZ2F0aW9uIHdpZHRoLCBjb25zaXN0cyBvZiB0aGUgbWF4aW11bSBuYXZpZ2F0aW9uIGV4dGVudCBtaW51cyAyeCBuYXYgZGlyZWN0aW9uIGJ1dHRvbnMgOTZweCBhbmQgOHB4IHBhZGRpbmcuXG4kbWF4LWNvYWNoLW5hdmlnYXRpb24td2lkdGg6IGNhbGMoOTYwcHggLSA5NnB4IC0gOHB4KTtcbiRzY3JvbGxiYXItaGVpZ2h0OiAxNnB4O1xuXG46aG9zdCB7XG4gIC8vIE5vdGU6IFRoZSB1c2Ugb2YgcHggaXMgaW50ZW50aW9uYWwgaGVyZSwgYmVjYXVzZSBtYW55IHdpZHRocy9oZWlnaHRzLCByb3RhdGlvbnMsIHNjYWxlcywgZXRjLiBkZXBlbmRzIG9uIHRoaXMuXG4gIC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JpZC1zaXplOiAxNnB4O1xuICAtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWhlaWdodDogMDtcbiAgLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1kZWNrczogMTtcblxuICBkaXNwbGF5OiBibG9jaztcbiAgaGVpZ2h0OiBpbmhlcml0O1xuXG4gIDo6cGFydChjb2FjaC1mbG9vcikge1xuICAgIGZpbGw6IHZhcigtLXNiYi1iYWNrZ3JvdW5kLWNvbG9yLTIpO1xuXG4gICAgLy8gSW4gSGlnaCBDb250cmFzdCBNb2RlIHdlIHNldCBmbG9vciBjb2xvciB0byB0cmFuc3BhcmVudFxuICAgIEBpbmNsdWRlIHNiYi5pZi1mb3JjZWQtY29sb3JzIHtcbiAgICAgIGZpbGw6IHRyYW5zcGFyZW50O1xuICAgIH1cbiAgfVxufVxuXG4vLyByb3RhdGVzIHRoZSBET00tcGFydCBcImNvYWNoLWZsb29yXCIgYnkgMTgwIGRlZ3JlZXMgaWYgdGhlIGhvc3QgaXMgaW4gUlRMIG1vZGUuXG5AaW5jbHVkZSBzYmItc3ItbWl4aW5zLnJvdGF0ZS1kb20tcGFydChjb2FjaC1mbG9vcik7XG5cbltwb3BvdmVyXTp3aGVyZShzYmItcG9wb3Zlcikge1xuICBAaW5jbHVkZSBzYmIucG9wb3Zlci1yZXNldDtcblxuICAuc2JiLXNyLXBvcG92ZXIge1xuICAgIG1hcmdpbi1ibG9jazogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG4gIH1cbn1cblxuLy8gU1RBUlQgLSBWZXJ0aWNhbCBtb2RlXG46aG9zdChbYWxpZ24tdmVydGljYWxdKSB7XG4gICRjb2FjaC1uYXZpZ2F0aW9uLXBhZGRpbmc6IDU7XG4gICRjb2FjaC1zY3JvbGxiYXItd2lkdGg6IDI0O1xuICAkY29hY2gtZ3JpZC13aWR0aDogY2FsYyh2YXIoLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1oZWlnaHQpICsgJGNvYWNoLXNjcm9sbGJhci13aWR0aCk7XG5cbiAgLnNiYi1zcl9fY29tcG9uZW50IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgICBnYXA6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDIyKTtcbiAgICBoZWlnaHQ6IGluaGVyaXQ7XG5cbiAgICBAaW5jbHVkZSBzYmIubXEoJGZyb206IHNtYWxsKSB7XG4gICAgICBnYXA6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDU0KTtcbiAgICB9XG5cbiAgICBuYXYuc2JiLXNyLW5hdmlnYXRpb24sXG4gICAgdWwuc2JiLXNyLW5hdmlnYXRpb25fX2xpc3QtY29hY2hlcyB7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIH1cblxuICAgIG5hdi5zYmItc3ItbmF2aWdhdGlvbiB7XG4gICAgICBwYWRkaW5nOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgxNikgMDtcblxuICAgICAgLnNiYi1zcl9fbmF2aWdhdGlvbi1jb250cm9sLWJ1dHRvbiB7XG4gICAgICAgIGxlZnQ6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDEpO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIHJvdGF0ZTogOTBkZWc7XG5cbiAgICAgICAgQGluY2x1ZGUgc2JiLm1xKCRmcm9tOiBsYXJnZSkge1xuICAgICAgICAgIGxlZnQ6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKC0xKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1bC5zYmItc3ItbmF2aWdhdGlvbl9fbGlzdC1jb2FjaGVzIHtcbiAgICAgICAgbWF4LXdpZHRoOiBpbml0aWFsO1xuXG4gICAgICAgIC8vIFBhZGRpbmcgbmVlZHMgdG8gdmlzdWFsIGZvY3VzLXZpc2libGUgc3R5bGUgZm9yIG5hdiBidXR0b24gaW5zaWRlIG92ZXJmbG93IGNvbnRlbnQsXG4gICAgICAgIC8vIG90aGVyd2lzZSBmb2N1cy12aXNpYmxlIHN0eWxlIGlzIGN1dHRlZC5cbiAgICAgICAgcGFkZGluZzogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oJGNvYWNoLW5hdmlnYXRpb24tcGFkZGluZyk7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW4gc2Nyb2xsO1xuXG4gICAgICAgIC8vIGluIHZlcnRpY2FsIG1vZGUsIHRoZSBsaSBtdXN0IGJlIGZsZXhlZDsgb3RoZXJ3aXNlIGl0IHdvdWxkIGNhbGN1bGF0ZSB0aGUgd3JvbmcgaGVpZ2h0XG4gICAgICAgIC8vIGR1ZSB0byB1c2VyYWdlbnQgc3R5bGUgc2V0IHRvIFwibGlzdC1pdGVtXCIgZm9yIGRpc3BsYXlcbiAgICAgICAgbGkge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBWRVJUSUNBTCBNT0RFIC0gTEFCRUxNVUxUSVBMRSBERUNLUyAtIExBQkVMU1xuICAuc2JiLXNyX193cmFwcGVyLWNvYWNoLWRlY2tzIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXG4gICAgLnNiYi1zcl9fd3JhcHBlci1kZWNrLWxhYmVscyB7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gICAgICB3aWR0aDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oJGNvYWNoLWdyaWQtd2lkdGgpO1xuICAgICAgaGVpZ2h0OiBpbml0aWFsO1xuXG4gICAgICBiIHtcbiAgICAgICAgaW5saW5lLXNpemU6IGNhbGMoNTAlIC0gc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMTYpKTtcbiAgICAgICAgYmxvY2stc2l6ZTogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMjApO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgxNik7XG4gICAgICAgIHJvdGF0ZTogaW5pdGlhbDtcbiAgICAgICAgd3JpdGluZy1tb2RlOiBpbml0aWFsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFZFUlRJQ0FMIE1PREUgLSBTRUFUTUFQIFNDUk9MTCBBUkVBXG4gIC5zYmItc3JfX3dyYXBwZXItc2Nyb2xsYXJlYSB7XG4gICAgd2lkdGg6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKCRjb2FjaC1ncmlkLXdpZHRoKTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbiBzY3JvbGw7XG5cbiAgICAuc2JiLXNyX19wYXJlbnQge1xuICAgICAgcm90YXRlOiA5MGRlZztcbiAgICB9XG4gIH1cblxuICAvLyBWRVJUSUNBTCBNT0RFIC0gVFJBVkVMLURJUkVDVElPTlxuICAuc2JiLXNyLXRyYXZlbC1kaXJlY3Rpb24td3JhcHBlciB7XG4gICAgd2lkdGg6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKHZhcigtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWhlaWdodCkpO1xuICAgIG1hcmdpbi1ibG9jay1zdGFydDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG4gIH1cbn1cblxuLy8gRU5EIC0gVmVydGljYWwgbW9kZVxuXG4uc2JiLXNyLW5hdmlnYXRpb24ge1xuICBnYXA6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDMpO1xufVxuXG4uc2JiLXNyLW5hdmlnYXRpb24gLnNiYi1zcl9fbmF2aWdhdGlvbi1jb250cm9sLWJ1dHRvbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdG9wOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgyKTtcblxuICBAaW5jbHVkZSBzYmIubXEoJGZyb206IGxhcmdlKSB7XG4gICAgdG9wOiAwO1xuICB9XG59XG5cbi5zYmItc3JfX2NvbXBvbmVudCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogY2FsYyhzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg2NCkgLSAkc2Nyb2xsYmFyLWhlaWdodCk7XG59XG5cbi8vIFRSQVZFTCBESVJFQ1RJT05cbi5zYmItc3ItdHJhdmVsLWRpcmVjdGlvbi13cmFwcGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGNvbHVtbi1nYXA6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDQpO1xuICBtYXJnaW4tYmxvY2s6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDgpIHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDQpO1xuICBmb250LXNpemU6IHZhcigtLXNiYi10ZXh0LWZvbnQtc2l6ZS1zKTtcblxuICAuc2JiLXNyX190cmF2ZWwtZGlyZWN0aW9uLS1hcnJvdyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG59XG5cbi8vIE5BVklHQVRJT04gTkVXXG4uc2JiLXNyLW5hdmlnYXRpb24td3JhcHBlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG59XG5cbi5zYmItc3ItbmF2aWdhdGlvbiB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZy1pbmxpbmU6IDE2cHg7XG59XG5cbi5zYmItc3ItbmF2aWdhdGlvbl9fbGlzdC1jb2FjaGVzIHtcbiAgQGluY2x1ZGUgc2JiLmxpc3QtcmVzZXQ7XG4gIEBpbmNsdWRlIHNiYi5zY3JvbGxiYXI7XG5cbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG4gIHBhZGRpbmc6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDYpIHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDUpIDA7XG4gIG1heC13aWR0aDogJG1heC1jb2FjaC1uYXZpZ2F0aW9uLXdpZHRoO1xuXG4gIC8vIFNldCBzYmIgc2Nyb2xsYmFyIHRyYW5zcGFyZW50IGJ5IGRlZmF1bHRcbiAgLS1zYmItc2Nyb2xsYmFyLWNvbG9yOiB0cmFuc3BhcmVudDtcblxuICBvdmVyZmxvdzogc2Nyb2xsIGhpZGRlbjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0gU2VhdCBSZXNlcnZhdGlvbiBNYWluIE5hdmlnYXRpb24gLSBFTkQgLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyAtLS0tLS0tLS0tLS0tIFNlYXQgUmVzZXJ2YXRpb24gQ29hY2hlcyAtIFNUQVJUIC0tLS0tLS0tLS0tLS0tLS0tXG4uc2JiLXNyX193cmFwcGVyLWNvYWNoLWRlY2tzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgaGVpZ2h0OiBpbmhlcml0O1xuXG4gIC5zYmItc3JfX3dyYXBwZXItZGVjay1sYWJlbHMge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGhlaWdodDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0odmFyKC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24taGVpZ2h0KSk7XG4gICAgd3JpdGluZy1tb2RlOiB2ZXJ0aWNhbC1scjtcblxuICAgIGIge1xuICAgICAgaGVpZ2h0OiBjYWxjKDUwJSAtIHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDE2KSk7XG4gICAgICB3aWR0aDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMjApO1xuICAgICAgbWFyZ2luLWJsb2NrLWVuZDogMTZweDtcbiAgICAgIHJvdGF0ZTogMTgwZGVnO1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgbGluZS1oZWlnaHQ6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDIwKTtcbiAgICB9XG4gIH1cbn1cblxuLnNiYi1zcl9fd3JhcHBlci1zY3JvbGxhcmVhIHtcbiAgQGluY2x1ZGUgc2JiLnNjcm9sbGJhcjtcblxuICBvdmVyZmxvdzogc2Nyb2xsIGhpZGRlbjtcbiAgcGFkZGluZy1ibG9jazogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oOCkgc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMTYpO1xuXG4gIC5zYmItc3JfX3BhcmVudCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgfVxufVxuXG4uc2JiLXNyX19saXN0LWRlY2tzIHtcbiAgQGluY2x1ZGUgc2JiLmxpc3QtcmVzZXQ7XG5cbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbn1cblxuLnNiYi1zcl9fbGlzdC1kZWNrcy0tZ2FwIHtcbiAgZ2FwOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0OCk7XG59XG5cbi5zYmItc3JfX2xpc3QtaXRlbS1kZWNrIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uc2JiLXNyX19saXN0LWNvYWNoZXMge1xuICBAaW5jbHVkZSBzYmIubGlzdC1yZXNldDtcblxuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDQpO1xufVxuXG4vLyBJZiB0aGVyZSBhcmUgb3ZlcmhhbmdpbmcgZWxlbWVudHMgd2UgbmVlZCB0byBpbmNyZWFzZSB0aGUgZ2FwIGJldHdlZW4gY29hY2hlc1xuLnNiYi1zcl9fbGlzdC1kZWNrczpoYXMoLnNiYi1zci1jb2FjaC1oYXMtb3ZlcmhhbmdpbmctZWxlbWVudHMpIC5zYmItc3JfX2xpc3QtY29hY2hlcyB7XG4gIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oOCk7XG59XG5cbi5zYmItc3JfX2l0ZW0tY29hY2gge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5zYmItc3ItY29hY2gtd3JhcHBlcl9fdGFibGUge1xuICBvdXRsaW5lOiAwO1xufVxuIiwiaW1wb3J0IHsgU2JiTGFuZ3VhZ2VDb250cm9sbGVyIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9jb250cm9sbGVycy5qcyc7XG5pbXBvcnQgeyBib3hTaXppbmdTdHlsZXMgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL3N0eWxlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNiYlBvcG92ZXJFbGVtZW50IH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvcG9wb3Zlci5qcyc7XG5pbXBvcnQgeyBodG1sLCBpc1NlcnZlciwgbm90aGluZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgdHlwZSB7IENTU1Jlc3VsdEdyb3VwLCBQcm9wZXJ0eVZhbHVlcywgVGVtcGxhdGVSZXN1bHQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY2xhc3NNYXAgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9jbGFzcy1tYXAuanMnO1xuaW1wb3J0IHsgcmVwZWF0IH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVwZWF0LmpzJztcbmltcG9ydCB7IHN0eWxlTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvc3R5bGUtbWFwLmpzJztcblxuaW1wb3J0IHsgZ2V0STE4blNlYXRSZXNlcnZhdGlvbiB9IGZyb20gJy4uL2NvbW1vbi90cmFuc2xhdGlvbnMudHMnO1xuaW1wb3J0IHR5cGUge1xuICBDb2FjaEl0ZW0sXG4gIENvYWNoSXRlbURldGFpbHMsXG4gIFBsYWNlLFxuICBFbGVtZW50RGltZW5zaW9uLFxuICBCYXNlRWxlbWVudCxcbiAgUGxhY2VTZWxlY3Rpb24sXG4gIFNlYXRSZXNlcnZhdGlvbixcbn0gZnJvbSAnLi4vY29tbW9uL3R5cGVzLnRzJztcbmltcG9ydCB7IFNiYlNlYXRSZXNlcnZhdGlvbkFyZWFFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1hcmVhL3NlYXQtcmVzZXJ2YXRpb24tYXJlYS5jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgU2JiU2VhdFJlc2VydmF0aW9uR3JhcGhpY0VsZW1lbnQgfSBmcm9tICcuLi9zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMvc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLmNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBTYmJTZWF0UmVzZXJ2YXRpb25OYXZpZ2F0aW9uQ29hY2hFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1uYXZpZ2F0aW9uLWNvYWNoL3NlYXQtcmVzZXJ2YXRpb24tbmF2aWdhdGlvbi1jb2FjaC5jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgU2JiU2VhdFJlc2VydmF0aW9uUGxhY2VDb250cm9sRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC9zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wuY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFNiYlNlYXRSZXNlcnZhdGlvblNjb3BlZEVsZW1lbnQgfSBmcm9tICcuLi9zZWF0LXJlc2VydmF0aW9uLXNjb3BlZC9zZWF0LXJlc2VydmF0aW9uLXNjb3BlZC5jb21wb25lbnQudHMnO1xuXG5pbXBvcnQgeyBTZWF0UmVzZXJ2YXRpb25CYXNlRWxlbWVudCB9IGZyb20gJy4vc2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQudHMnO1xuaW1wb3J0IHN0eWxlIGZyb20gJy4vc2VhdC1yZXNlcnZhdGlvbi5zY3NzP2xpdCZpbmxpbmUnO1xuXG5pbXBvcnQgJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2J1dHRvbi5qcyc7XG5pbXBvcnQgJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL3NjcmVlbi1yZWFkZXItb25seS5qcyc7XG5pbXBvcnQgJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL3BvcG92ZXIuanMnO1xuXG5TYmJTZWF0UmVzZXJ2YXRpb25BcmVhRWxlbWVudC5kZWZpbmUoKTtcblNiYlNlYXRSZXNlcnZhdGlvbkdyYXBoaWNFbGVtZW50LmRlZmluZSgpO1xuU2JiU2VhdFJlc2VydmF0aW9uUGxhY2VDb250cm9sRWxlbWVudC5kZWZpbmUoKTtcblNiYlNlYXRSZXNlcnZhdGlvbk5hdmlnYXRpb25Db2FjaEVsZW1lbnQuZGVmaW5lKCk7XG5TYmJTZWF0UmVzZXJ2YXRpb25TY29wZWRFbGVtZW50LmRlZmluZSgpO1xuXG4vKipcbiAqIE1haW4gY29tcG9uZW50IGZvciB0aGUgc2VhdCByZXNlcnZhdGlvbi5cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBTYmJTZWF0UmVzZXJ2YXRpb25FbGVtZW50IGV4dGVuZHMgU2VhdFJlc2VydmF0aW9uQmFzZUVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IGVsZW1lbnROYW1lOiBzdHJpbmcgPSAnc2JiLXNlYXQtcmVzZXJ2YXRpb24nO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBbYm94U2l6aW5nU3R5bGVzLCBzdHlsZV07XG5cbiAgcHJpdmF0ZSBfbGFuZ3VhZ2UgPSBuZXcgU2JiTGFuZ3VhZ2VDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9jb2FjaGVzSHRtbFRlbXBsYXRlPzogVGVtcGxhdGVSZXN1bHQ7XG5cbiAgLy8gQXJlYSBpY29ucyB0aGF0IHNob3VsZCBub3QgYmUgZml4ZWQgZHVyaW5nIHJvdGF0aW9uIHdoZW4gdmVydGljYWwgbW9kZSBpcyBzZWxlY3RlZFxuICBwcml2YXRlIF9ub3RGaXhlZFJvdGF0YWJsZUFyZWFJY29ucyA9IFsnRU5UUllfRVhJVCddO1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnaGFzTmF2aWdhdGlvbicpKSB7XG4gICAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgICAgID8ucXVlcnlTZWxlY3RvckFsbCgndGFibGUnKVxuICAgICAgICAgIC5mb3JFYWNoKCh0YWJsZSkgPT4gdGFibGUucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgICAgID8ucXVlcnlTZWxlY3RvckFsbCgndGFibGUnKVxuICAgICAgICAgIC5mb3JFYWNoKCh0YWJsZSkgPT4gdGFibGUuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIC8vIFdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgZmlyc3QgdXBkYXRlIGlzIGNvbXBsZXRlIHRvIGluaXQgZGlmZmVyZW50IEhUTUwgZWxlbWVudCBkaW1lbnNpb25zXG4gICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgdGhpcy5faW5pdFZlaGljbGVTZWF0UmVzZXJ2YXRpb25Db25zdHJ1Y3Rpb24oKTtcbiAgICByZXR1cm4gdGhpcy5fY29hY2hlc0h0bWxUZW1wbGF0ZSB8fCBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFZlaGljbGVTZWF0UmVzZXJ2YXRpb25Db25zdHJ1Y3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fY29hY2hlc0h0bWxUZW1wbGF0ZSA9IGh0bWxgXG4gICAgICAke3RoaXMuX3JlbmRlclRyYXZlbERpcmVjdGlvbigpfVxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zcl9fY29tcG9uZW50XCI+XG4gICAgICAgICR7dGhpcy5fcmVuZGVyTmF2aWdhdGlvbigpfVxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJzYmItc3JfX3dyYXBwZXItY29hY2gtZGVja3NcIlxuICAgICAgICAgIEBrZXlkb3duPSR7KGV2dDogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5rZXlib2FyZFNlYXRtYXBFdmVudEhhbmRsaW5nKGV2dCl9XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLXNyX193cmFwcGVyLWRlY2stbGFiZWxzXCI+JHt0aGlzLl9yZW5kZXJEZWNrTGFiZWxzKCl9PC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgQHNjcm9sbD0keygpID0+IHRoaXMuY29hY2hBcmVhU2Nyb2xsZW5kKCl9XG4gICAgICAgICAgICBpZD1cInNiYi1zcl9fd3JhcHBlci1zY3JvbGxhcmVhXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2JiLXNyX193cmFwcGVyLXNjcm9sbGFyZWFcIlxuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBpZD1cInNiYi1zcl9fcGFyZW50LWFyZWFcIiBjbGFzcz1cInNiYi1zcl9fcGFyZW50XCI+XG4gICAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiJHtjbGFzc01hcCh7XG4gICAgICAgICAgICAgICAgICAnc2JiLXNyX19saXN0LWRlY2tzJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICdzYmItc3JfX2xpc3QtZGVja3MtLWdhcCc6IHRoaXMuaGFzTXVsdGlwbGVEZWNrcyxcbiAgICAgICAgICAgICAgICB9KX1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgJHt0aGlzLnNlYXRSZXNlcnZhdGlvbnM/Lm1hcChcbiAgICAgICAgICAgICAgICAgIChzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiwgY29hY2hEZWNrSW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbGA8bGkgY2xhc3M9XCJzYmItc3JfX2xpc3QtaXRlbS1kZWNrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwic2JiLXNyX19saXN0LWNvYWNoZXNcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuX3JlbmRlckNvYWNoZXMoc2VhdFJlc2VydmF0aW9uLCBjb2FjaERlY2tJbmRleCl9XG4gICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgPC9saT5gO1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlckRlY2tMYWJlbHMoKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZURlY2tzKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB0aGlzLnNlYXRSZXNlcnZhdGlvbnMubWFwKChzZWF0UmVzZXJ2YXRpb24pID0+IHtcbiAgICAgIGNvbnN0IGRlY2tEZXNjcmlwdGlvbiA9IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oXG4gICAgICAgIHNlYXRSZXNlcnZhdGlvbi5kZWNrQ29hY2hMZXZlbCxcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gaHRtbGA8YiBhcmlhLWhpZGRlbj1cInRydWVcIj4ke2RlY2tEZXNjcmlwdGlvbn08L2I+YDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlck5hdmlnYXRpb25Db250cm9sQnV0dG9uKGJ0bkRpcmVjdGlvbjogc3RyaW5nKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuaGFzTmF2aWdhdGlvbiB8fCAhdGhpcy5zZWF0UmVzZXJ2YXRpb25zKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBidG5OYXZpZ2F0aW9uRGlyZWN0aW9uSWQgPVxuICAgICAgYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fUklHSFQnXG4gICAgICAgID8gJ3NiYi1zci1uYXZpZ2F0aW9uX193cmFwcGVyLWJ1dHRvbi1kaXJlY3Rpb24tLXJpZ2h0J1xuICAgICAgICA6ICdzYmItc3ItbmF2aWdhdGlvbl9fd3JhcHBlci1idXR0b24tZGlyZWN0aW9uLS1sZWZ0JztcbiAgICBjb25zdCBidG5JY29uID1cbiAgICAgIGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX1JJR0hUJyA/ICdjaGV2cm9uLXNtYWxsLXJpZ2h0LXNtYWxsJyA6ICdjaGV2cm9uLXNtYWxsLWxlZnQtc21hbGwnO1xuICAgIGNvbnN0IGJ0bkFyaWFEZXNjcmlwdGlvbiA9XG4gICAgICBidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9SSUdIVCdcbiAgICAgICAgPyBnZXRJMThuU2VhdFJlc2VydmF0aW9uKCdTRUFUX1JFU0VSVkFUSU9OX0VORCcsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpXG4gICAgICAgIDogZ2V0STE4blNlYXRSZXNlcnZhdGlvbignU0VBVF9SRVNFUlZBVElPTl9CRUdJTicsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpO1xuICAgIGxldCBidG5EaXNhYmxlZCA9IHRydWU7XG5cbiAgICBpZiAoYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fTEVGVCcgJiYgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPiAwKSB7XG4gICAgICBidG5EaXNhYmxlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9SSUdIVCcgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4IDwgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMubGVuZ3RoIC0gMVxuICAgICkge1xuICAgICAgYnRuRGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwic2JiLXNyLW5hdmlnYXRpb25fX3dyYXBwZXItYnV0dG9uLWRpcmVjdGlvblwiPlxuICAgICAgPHNiYi1zZWNvbmRhcnktYnV0dG9uXG4gICAgICAgIEBjbGljaz1cIiR7KCkgPT4gdGhpcy5uYXZpZ2F0ZUJ5RGlyZWN0aW9uQnRuKGJ0bkRpcmVjdGlvbil9XCJcbiAgICAgICAgQGZvY3VzPVwiJHsoKSA9PiB0aGlzLm9uRm9jdXNOYXZEaXJlY3Rpb25CdXR0b24oKX1cIlxuICAgICAgICBpZD1cIiR7YnRuTmF2aWdhdGlvbkRpcmVjdGlvbklkfVwiXG4gICAgICAgIGNsYXNzPVwic2JiLXNyX19uYXZpZ2F0aW9uLWNvbnRyb2wtYnV0dG9uXCJcbiAgICAgICAgc2l6ZT1cIm1cIlxuICAgICAgICBpY29uLW5hbWU9XCIke2J0bkljb259XCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCIke2J0bkFyaWFEZXNjcmlwdGlvbn1cIlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgLmRpc2FibGVkSW50ZXJhY3RpdmU9XCIke2J0bkRpc2FibGVkIHx8IG5vdGhpbmd9XCJcbiAgICAgICAgLmRpc2FibGVkPVwiJHtidG5EaXNhYmxlZCB8fCBub3RoaW5nfVwiXG4gICAgICA+PC9zYmItc2Vjb25kYXJ5LWJ1dHRvbj5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyVHJhdmVsRGlyZWN0aW9uKCk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnRyYXZlbERpcmVjdGlvbiB8fCB0aGlzLnRyYXZlbERpcmVjdGlvbiA9PT0gJ05PTkUnKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGxhYmVsVGV4dCA9IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oXG4gICAgICAnU0VBVF9SRVNFUlZBVElPTl9UUkFWRUxfRElSRUNUSU9OJyxcbiAgICAgIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsXG4gICAgKTtcblxuICAgIGNvbnN0IGFycm93RGlyZWN0aW9uID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICA/IHRoaXMudHJhdmVsRGlyZWN0aW9uID09PSAnUklHSFQnXG4gICAgICAgID8gJ2Rvd24nXG4gICAgICAgIDogJ3VwJ1xuICAgICAgOiB0aGlzLnRyYXZlbERpcmVjdGlvbiA9PT0gJ1JJR0hUJ1xuICAgICAgICA/ICdyaWdodCdcbiAgICAgICAgOiAnbGVmdCc7XG5cbiAgICBjb25zdCBpY29uTmFtZSA9IGBhcnJvdy0ke2Fycm93RGlyZWN0aW9ufS1zbWFsbGA7XG5cbiAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwic2JiLXNyLXRyYXZlbC1kaXJlY3Rpb24td3JhcHBlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zcl9fdHJhdmVsLWRpcmVjdGlvbi0tYXJyb3dcIj5cbiAgICAgICAgPHNiYi1pY29uIHNsb3Q9XCJpY29uXCIgbmFtZT1cIiR7aWNvbk5hbWV9XCI+PC9zYmItaWNvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zcl9fdHJhdmVsLWRpcmVjdGlvbi0tbGFiZWxcIj4ke2xhYmVsVGV4dH08L2Rpdj5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyTmF2aWdhdGlvbigpOiBUZW1wbGF0ZVJlc3VsdCB8IG51bGwge1xuICAgIGlmIChpc1NlcnZlciB8fCAhdGhpcy5oYXNOYXZpZ2F0aW9uIHx8ICF0aGlzLnNlYXRSZXNlcnZhdGlvbnMpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJzYmItc3ItbmF2aWdhdGlvbi13cmFwcGVyXCI+XG4gICAgICA8bmF2IGlkPVwic2JiLXNyLW5hdmlnYXRpb25cIiBjbGFzcz1cInNiYi1zci1uYXZpZ2F0aW9uXCI+XG4gICAgICAgICR7dGhpcy5fcmVuZGVyTmF2aWdhdGlvbkNvbnRyb2xCdXR0b24oJ0RJUkVDVElPTl9MRUZUJyl9XG4gICAgICAgIDx1bFxuICAgICAgICAgIGlkPVwic2JiLXNyX19uYXZpZ2F0aW9uLWxpc3QtY29hY2hlc1wiXG4gICAgICAgICAgY2xhc3M9XCJzYmItc3ItbmF2aWdhdGlvbl9fbGlzdC1jb2FjaGVzXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiJHtnZXRJMThuU2VhdFJlc2VydmF0aW9uKFxuICAgICAgICAgICAgJ1NFQVRfUkVTRVJWQVRJT05fTkFWSUdBVElPTicsXG4gICAgICAgICAgICB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LFxuICAgICAgICAgICl9XCJcbiAgICAgICAgPlxuICAgICAgICAgICR7dGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMubWFwKFxuICAgICAgICAgICAgKGNvYWNoSXRlbURldGFpbHM6IENvYWNoSXRlbURldGFpbHMsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGh0bWxgPGxpPlxuICAgICAgICAgICAgICAgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1uYXZpZ2F0aW9uLWNvYWNoXG4gICAgICAgICAgICAgICAgICBAc2VsZWN0Y29hY2g9JHsoZXZlbnQ6IEN1c3RvbUV2ZW50PG51bWJlcj4pID0+IHRoaXMuX29uU2VsZWN0TmF2Q29hY2goZXZlbnQpfVxuICAgICAgICAgICAgICAgICAgQGZvY3VzY29hY2g9JHsoKSA9PiB0aGlzLl9vbkZvY3VzTmF2Q29hY2goKX1cbiAgICAgICAgICAgICAgICAgIEBrZXl1cD0keyhldnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMub25LZXlOYXZpZ2F0aW9uTmF2Q29hY2hCdXR0b24oZXZ0LCBpbmRleCl9XG4gICAgICAgICAgICAgICAgICBpbmRleD1cIiR7aW5kZXh9XCJcbiAgICAgICAgICAgICAgICAgIC5zZWxlY3RlZD0ke3RoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID09PSBpbmRleH1cbiAgICAgICAgICAgICAgICAgIC5mb2N1c2VkPSR7dGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9PT0gaW5kZXh9XG4gICAgICAgICAgICAgICAgICAuaG92ZXJlZD0ke3RoaXMuaG92ZXJlZENvYWNoSW5kZXggPT09IGluZGV4fVxuICAgICAgICAgICAgICAgICAgLm5hdGl2ZUZvY3VzQWN0aXZlPSR7dGhpcy5oYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1c31cbiAgICAgICAgICAgICAgICAgIC5jb2FjaEl0ZW1EZXRhaWxzPVwiJHtjb2FjaEl0ZW1EZXRhaWxzfVwiXG4gICAgICAgICAgICAgICAgICA/dmVydGljYWw9XCIke3RoaXMuYWxpZ25WZXJ0aWNhbH1cIlxuICAgICAgICAgICAgICAgICAgP3Nob3dUaXRsZUluZm89XCIke3RoaXMuc2hvd1RpdGxlSW5mb31cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L3NiYi1zZWF0LXJlc2VydmF0aW9uLW5hdmlnYXRpb24tY29hY2g+XG4gICAgICAgICAgICAgIDwvbGk+YDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKX1cbiAgICAgICAgPC91bD5cbiAgICAgICAgJHt0aGlzLl9yZW5kZXJOYXZpZ2F0aW9uQ29udHJvbEJ1dHRvbignRElSRUNUSU9OX1JJR0hUJyl9XG4gICAgICA8L25hdj5cbiAgICA8L2Rpdj5gO1xuICB9XG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBAcGFyYW0gc2VhdFJlc2VydmF0aW9uXG4gICAqIEBwYXJhbSBjb2FjaERlY2tJbmRleFxuICAgKi9cbiAgcHJpdmF0ZSBfcmVuZGVyQ29hY2hlcyhcbiAgICBzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdFtdIHwgbnVsbCB7XG4gICAgY29uc3QgY29hY2hlczogQ29hY2hJdGVtW10gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHNlYXRSZXNlcnZhdGlvbj8uY29hY2hJdGVtcykpO1xuXG4gICAgaWYgKCFjb2FjaGVzIHx8IGlzU2VydmVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNvYWNoZXMubWFwKChjb2FjaEl0ZW06IENvYWNoSXRlbSwgY29hY2hJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgPGxpIGNsYXNzPVwic2JiLXNyX19pdGVtLWNvYWNoXCI+XG4gICAgICAgICAgJHt0aGlzLl9yZW5kZXJDb2FjaEVsZW1lbnQoXG4gICAgICAgICAgICBjb2FjaEl0ZW0sXG4gICAgICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICAgICAgY29hY2hEZWNrSW5kZXgsXG4gICAgICAgICAgICBzZWF0UmVzZXJ2YXRpb24uZGVja0NvYWNoSW5kZXgsXG4gICAgICAgICAgKX1cbiAgICAgICAgPC9saT5cbiAgICAgIGA7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJDb2FjaEVsZW1lbnQoXG4gICAgY29hY2hJdGVtOiBDb2FjaEl0ZW0sXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICAgcGxhY2VDb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgY29uc3QgY2FsY3VsYXRlZENvYWNoRGltZW5zaW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKGNvYWNoSXRlbS5kaW1lbnNpb24pO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uVGFibGVDb2FjaFdpdGhTZXJ2aWNlcyA9IHRoaXMuX2dldERlc2NyaXB0aW9uVGFibGVDb2FjaChjb2FjaEl0ZW0pO1xuXG4gICAgcmV0dXJuIGh0bWxgPHNiYi1zZWF0LXJlc2VydmF0aW9uLXNjb3BlZFxuICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXNjb3BlZC13aWR0aCc6IGNhbGN1bGF0ZWRDb2FjaERpbWVuc2lvbi53LFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1zY29wZWQtaGVpZ2h0JzogY2FsY3VsYXRlZENvYWNoRGltZW5zaW9uLmgsXG4gICAgICB9KX1cbiAgICA+XG4gICAgICAke3RoaXMuX2dldFJlbmRlcmVkQ29hY2hCb3JkZXJzKGNvYWNoSXRlbSwgY29hY2hJbmRleCl9XG4gICAgICAke3RoaXMuX2dldFJlbmRlcmVkR3JhcGhpY2FsRWxlbWVudHMoXG4gICAgICAgIGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHMgfHwgW10sXG4gICAgICAgIGNvYWNoSXRlbS5kaW1lbnNpb24sXG4gICAgICAgIGNvYWNoSW5kZXgsXG4gICAgICAgIGNvYWNoRGVja0luZGV4LFxuICAgICAgKX1cbiAgICAgICR7dGhpcy5fZ2V0UmVuZGVyZWRTZXJ2aWNlRWxlbWVudHMoY29hY2hJbmRleCwgY29hY2hEZWNrSW5kZXgsIGNvYWNoSXRlbS5zZXJ2aWNlRWxlbWVudHMpfVxuXG4gICAgICA8dGFibGVcbiAgICAgICAgQGZvY3VzPSR7KCkgPT4gdGhpcy5vbkZvY3VzVGFibGVDb2FjaEFuZFByZXNlbGVjdFBsYWNlKGNvYWNoSW5kZXgpfVxuICAgICAgICBpZD1cInNiYi1zci1jb2FjaC0ke2NvYWNoSW5kZXh9XCJcbiAgICAgICAgY2xhc3M9XCJzYmItc3ItY29hY2gtd3JhcHBlcl9fdGFibGVcIlxuICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwic2JiLXNyLWNvYWNoLWNhcHRpb24tJHtjb2FjaEluZGV4fVwiXG4gICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgPlxuICAgICAgICA8Y2FwdGlvbiBpZD1cInNiYi1zci1jb2FjaC1jYXB0aW9uLSR7Y29hY2hJbmRleH1cIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgPHNiYi1zY3JlZW4tcmVhZGVyLW9ubHk+JHtkZXNjcmlwdGlvblRhYmxlQ29hY2hXaXRoU2VydmljZXN9PC9zYmItc2NyZWVuLXJlYWRlci1vbmx5PlxuICAgICAgICA8L2NhcHRpb24+XG4gICAgICAgICR7dGhpcy5fZ2V0UmVuZGVyZWRSb3dQbGFjZXMoY29hY2hJdGVtLCBjb2FjaEluZGV4LCBjb2FjaERlY2tJbmRleCwgcGxhY2VDb2FjaERlY2tJbmRleCl9XG4gICAgICA8L3RhYmxlPlxuICAgIDwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tc2NvcGVkPmA7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgUmV0dXJucyB0aGUgYm9yZGVyIGdyYXBoaWMgKENPQUNIX0JPUkRFUl9NSURETEUpIG9mIGEgY29hY2ggd2l0aCBjYWxjdWxhdGVkIGJvcmRlciBnYXAgYW5kIGNvYWNoIHdpZHRoLFxuICAgKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgY29hY2ggaXMgd2l0aCBhIGRyaXZlciBhcmVhIG9yIHdpdGhvdXQuXG4gICAqL1xuICBwcml2YXRlIF9nZXRSZW5kZXJlZENvYWNoQm9yZGVycyhcbiAgICBjb2FjaEl0ZW06IENvYWNoSXRlbSxcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgaWYgKCFjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IENPQUNIX1BBU1NBR0VfV0lEVEggPSAxO1xuICAgIGNvbnN0IGRyaXZlckFyZWEgPSB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1tjb2FjaEluZGV4XT8uZHJpdmVyQXJlYUVsZW1lbnRzPy5kcml2ZXJBcmVhO1xuICAgIGNvbnN0IGRyaXZlckFyZWFOb1ZlcnRpY2FsV2FsbCA9XG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1tjb2FjaEluZGV4XT8uZHJpdmVyQXJlYUVsZW1lbnRzPy5kcml2ZXJBcmVhTm9WZXJ0aWNhbFdhbGw7XG5cbiAgICBsZXQgYm9yZGVyV2lkdGggPSBkcml2ZXJBcmVhXG4gICAgICA/IGNvYWNoSXRlbS5kaW1lbnNpb24udyAtIGRyaXZlckFyZWEuZGltZW5zaW9uLncgLSBDT0FDSF9QQVNTQUdFX1dJRFRIXG4gICAgICA6IGNvYWNoSXRlbS5kaW1lbnNpb24udyAtIENPQUNIX1BBU1NBR0VfV0lEVEggKiAyO1xuXG4gICAgLy9tdWx0aXBseSB3aXRoIGJhc2UgZ3JpZCBzaXplIGFsd2F5cyBmb3IgYWxsIGtpbmQgb2YgYm9yZGVyV2lkdGhcbiAgICBib3JkZXJXaWR0aCAqPSB0aGlzLmJhc2VHcmlkU2l6ZTtcblxuICAgIGNvbnN0IGJvcmRlckhlaWdodCA9IChjb2FjaEl0ZW0uZGltZW5zaW9uLmggKyB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogMikgKiB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICBsZXQgYm9yZGVyT2Zmc2V0WCA9XG4gICAgICBkcml2ZXJBcmVhICYmIGRyaXZlckFyZWEucG9zaXRpb24ueCA9PT0gMFxuICAgICAgICA/IGRyaXZlckFyZWE/LmRpbWVuc2lvbi53ICogdGhpcy5iYXNlR3JpZFNpemVcbiAgICAgICAgOiB0aGlzLmJhc2VHcmlkU2l6ZTtcblxuICAgIC8vcmVjYWxjdWxhdGUgdGhlIGJvcmRlciB3aWR0aCBhbmQgb2Zmc2V0IGlmIHRoZXJlIGlzIGEgZHJpdmVyIGFyZWEgd2l0aG91dCB2ZXJ0aWNhbCB3YWxsIG9uIGJvdGggc2lkZXNcbiAgICBpZiAoZHJpdmVyQXJlYU5vVmVydGljYWxXYWxsKSB7XG4gICAgICBjb25zdCBjb2FjaFdpZHRoID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKGNvYWNoSXRlbS5kaW1lbnNpb24pLnc7XG5cbiAgICAgIC8vcmVjYWxjdWxhdGVkIGJvcmRlcldpZHRoID0gY29hY2hXaWR0aCAtIDIgKiBkcml2ZXIgYXJlYSB3aWR0aCwgc2luY2UgdGhlIGRyaXZlciBhcmVhIGlzIG9uIGJvdGggc2lkZXNcbiAgICAgIGJvcmRlcldpZHRoID0gY29hY2hXaWR0aCAtIDIgKiAoZHJpdmVyQXJlYU5vVmVydGljYWxXYWxsLmRpbWVuc2lvbi53ICogdGhpcy5iYXNlR3JpZFNpemUpO1xuXG4gICAgICAvL3JlY2FsY3VsYXRlZCBib3JkZXJPZmZzZXRYID0gZHJpdmVyIGFyZWEgd2lkdGgsIHNpbmNlIHRoZSBib3JkZXIgc3RhcnRzIGFmdGVyIHRoZSBkcml2ZXIgYXJlYSBvbiB0aGUgbGVmdCBzaWRlXG4gICAgICBib3JkZXJPZmZzZXRYID0gZHJpdmVyQXJlYU5vVmVydGljYWxXYWxsLmRpbWVuc2lvbi53ICogdGhpcy5iYXNlR3JpZFNpemU7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudENvYWNoT3ZlcmxhcHBpbmdJbmZvID0gdGhpcy5vdmVySGFuZ2luZ0VsZW1lbnRJbmZvcm1hdGlvbi5maW5kKFxuICAgICAgKGVsKSA9PiBlbC5jb2FjaElkID09PSBjb2FjaEl0ZW0uaWQsXG4gICAgKTtcblxuICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBvdmVyaGFuZ2luZyBwbGFjZXMgb3IgZ3JhcGhpY2FsIGVsZW1lbnRzIHRvIGFkanVzdCB0aGUgYm9yZGVyIHdpZHRoIGFuZCBvZmZzZXQgKyBnYXBcbiAgICAvLyBXZSBkbyBub3QgZGlmZmVyZW50aWF0ZSB3aGV0aGVyIHRoZXJlIGlzIHNvbWV0aGluZyB0byBiZSBkb25lIG9uIGJvdGggc2lkZXMgYXMgdGhpcyB3b3VsZCBsZWFkIHRvIHVubmVjZXNzYXJ5XG4gICAgLy8gY29tcGxleGl0eS4gU28gaWYgdGhlcmUgaXMgc29tZXRoaW5nIG9uIG9uZSBzaWRlLCB3ZSBqdXN0IGluY3JlYXNlIHRoZSBjb2FjaC1ib3JkZXIgb24gYm90aCBzaWRlcy5cbiAgICBpZiAoXG4gICAgICBjdXJyZW50Q29hY2hPdmVybGFwcGluZ0luZm8/Lm92ZXJoYW5naW5nUGxhY2VzIHx8XG4gICAgICBjdXJyZW50Q29hY2hPdmVybGFwcGluZ0luZm8/Lm92ZXJoYW5naW5nR3JhcGhpY0FyZWFzXG4gICAgKSB7XG4gICAgICBib3JkZXJXaWR0aCArPSAyICogdGhpcy5iYXNlR3JpZFNpemU7IC8vIHdlIGluY3JlYXNlIHRoZSB3aWR0aCBieSAyIGdyaWQgc2l6ZXMgdG8gaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIHByb3RydWRlZCBwbGFjZXMgb24gYm90aCBzaWRlc1xuICAgICAgYm9yZGVyT2Zmc2V0WCA9IDA7IC8vIHdlIHN0YXJ0IGF0IDAgdG8gaGF2ZSBlbm91Z2ggc3BhY2Ugb24gdGhlIGxlZnQgc2lkZSBhcyB3ZWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpY1xuICAgICAgICBjbGFzcz1cIiR7Y2xhc3NNYXAoe1xuICAgICAgICAgICdzYmItc3ItY29hY2gtaGFzLW92ZXJoYW5naW5nLWVsZW1lbnRzJzpcbiAgICAgICAgICAgIGN1cnJlbnRDb2FjaE92ZXJsYXBwaW5nSW5mbz8ub3ZlcmhhbmdpbmdQbGFjZXMgfHxcbiAgICAgICAgICAgIGN1cnJlbnRDb2FjaE92ZXJsYXBwaW5nSW5mbz8ub3ZlcmhhbmdpbmdHcmFwaGljQXJlYXMgfHxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICB9KX1cIlxuICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXdpZHRoJzogYm9yZGVyV2lkdGgsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1oZWlnaHQnOiBib3JkZXJIZWlnaHQsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy10b3AnOiB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZyAqIC0xLFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbGVmdCc6IGJvcmRlck9mZnNldFgsXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1wb3NpdGlvbic6ICdhYnNvbHV0ZScsXG4gICAgICAgIH0pfVxuICAgICAgICBuYW1lPVwiQ09BQ0hfQk9SREVSX01JRERMRVwiXG4gICAgICAgID9zdHJldGNoPSR7dHJ1ZX1cbiAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICA+PC9zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljPlxuICAgIGA7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZW5kZXJlZFJvd1BsYWNlcyhcbiAgICBjb2FjaDogQ29hY2hJdGVtLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIHBsYWNlQ29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGlmICghY29hY2gucGxhY2VzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBQcmVwYXJlIHJvd3Mgd2l0aCB0aGUgcGxhY2VzIHRvIHJlbmRlciBhIHRhYmxlXG4gICAgY29uc3QgdGFibGVSb3dQbGFjZXM6IFJlY29yZDxudW1iZXIsIFBsYWNlW10+ID0ge307XG4gICAgZm9yIChjb25zdCBwbGFjZSBvZiBjb2FjaC5wbGFjZXMpIHtcbiAgICAgIGlmICghdGFibGVSb3dQbGFjZXNbcGxhY2UucG9zaXRpb24ueV0pIHtcbiAgICAgICAgdGFibGVSb3dQbGFjZXNbcGxhY2UucG9zaXRpb24ueV0gPSBbcGxhY2VdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFibGVSb3dQbGFjZXNbcGxhY2UucG9zaXRpb24ueV0ucHVzaChwbGFjZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGFibGVSb3dQbGFjZXMpXG4gICAgICAubWFwKChyb3dQbGFjZXM6IFBsYWNlW10sIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAgIDx0ciBpZD1cInJvdy0ke2NvYWNoSW5kZXh9LSR7cm93UGxhY2VzWzBdLnBvc2l0aW9uLnl9XCIgZGF0YS1yb3ctaW5kZXg9JHtpbmRleH0+XG4gICAgICAgICAgICAke3RoaXMuX2dldFJlbmRlcmVkQ29sdW1uUGxhY2VzKFxuICAgICAgICAgICAgICByb3dQbGFjZXMsXG4gICAgICAgICAgICAgIGNvYWNoSW5kZXgsXG4gICAgICAgICAgICAgIGNvYWNoRGVja0luZGV4LFxuICAgICAgICAgICAgICBwbGFjZUNvYWNoRGVja0luZGV4LFxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L3RyPlxuICAgICAgICBgO1xuICAgICAgfSlcbiAgICAgIC5mbGF0TWFwKChyb3dUZW1wbGF0ZSkgPT4gcm93VGVtcGxhdGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyZWRDb2x1bW5QbGFjZXMoXG4gICAgcGxhY2VzOiBQbGFjZVtdLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBkZWNrSW5kZXg6IG51bWJlcixcbiAgICBwbGFjZUNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgLy9Tb3J0cyBlYWNoIHBsYWNlIGJ5IGl0cyBhc2NlbmRpbmcgeCBjb29yZGluYXRlXG4gICAgcGxhY2VzLnNvcnQoXG4gICAgICAocGxhY2VBOiBQbGFjZSwgcGxhY2VCOiBQbGFjZSkgPT4gTnVtYmVyKHBsYWNlQS5wb3NpdGlvbi54KSAtIE51bWJlcihwbGFjZUIucG9zaXRpb24ueCksXG4gICAgKTtcblxuICAgIC8vIEZvciByZW5kZXJpbmcgdGhlIHBsYWNlcyB3aXRoaW4gYSB0ZCBlbGVtZW50LCBoZXJlIHdlIHVzZSByZXBlYXQgZGlyZWN0aXZlIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgZm9yIHJldXNpbmcgZWxlbWVudHMgKHRyYWNrIGJ5IGlkKS5cbiAgICBjb25zdCB0cmFja1BsYWNlSWQgPSBjb2FjaEluZGV4ICsgJy0nICsgcGxhY2VDb2FjaERlY2tJbmRleDtcbiAgICByZXR1cm4gaHRtbGAke3JlcGVhdChcbiAgICAgIHBsYWNlcyxcbiAgICAgIChwbGFjZSkgPT4gdHJhY2tQbGFjZUlkICsgJy0nICsgcGxhY2UubnVtYmVyLFxuICAgICAgKHBsYWNlLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBjYWxjdWxhdGVkRGltZW5zaW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKHBsYWNlLmRpbWVuc2lvbik7XG4gICAgICAgIGNvbnN0IGNhbGN1bGF0ZWRQb3NpdGlvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZFBvc2l0aW9uKHBsYWNlLnBvc2l0aW9uKTtcbiAgICAgICAgY29uc3Qgcm90YXRpb24gPSBwbGFjZS5yb3RhdGlvbiB8fCAwO1xuICAgICAgICBjb25zdCB0ZXh0Um90YXRpb24gPSB0aGlzLmFsaWduVmVydGljYWwgPyAtOTAgOiAwO1xuICAgICAgICBjb25zdCBwbGFjZUlkID0gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChkZWNrSW5kZXgsIGNvYWNoSW5kZXgsIHBsYWNlLm51bWJlcik7XG4gICAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgaWQ9XCJjZWxsLSR7ZGVja0luZGV4fS0ke2NvYWNoSW5kZXh9LSR7cGxhY2UucG9zaXRpb24ueX0tJHtpbmRleH1cIlxuICAgICAgICAgICAgY2xhc3M9XCJncmFwaGljYWwtZWxlbWVudFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2xcbiAgICAgICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC10ZXh0LXNjYWxlLXZhbHVlJzogTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgICBjYWxjdWxhdGVkRGltZW5zaW9uLncsXG4gICAgICAgICAgICAgICAgICBjYWxjdWxhdGVkRGltZW5zaW9uLmgsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLXdpZHRoJzogY2FsY3VsYXRlZERpbWVuc2lvbi53LFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtaGVpZ2h0JzogY2FsY3VsYXRlZERpbWVuc2lvbi5oLFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtdG9wJzogY2FsY3VsYXRlZFBvc2l0aW9uLnksXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC1sZWZ0JzogY2FsY3VsYXRlZFBvc2l0aW9uLngsXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC1yb3RhdGlvbic6IHJvdGF0aW9uLFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtdGV4dC1yb3RhdGlvbic6IHRleHRSb3RhdGlvbixcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIEBzZWxlY3RwbGFjZT0keyhzZWxlY3RQbGFjZUV2ZW50OiBDdXN0b21FdmVudDxQbGFjZVNlbGVjdGlvbj4pID0+XG4gICAgICAgICAgICAgICAgdGhpcy5fb25TZWxlY3RQbGFjZShzZWxlY3RQbGFjZUV2ZW50KX1cbiAgICAgICAgICAgICAgZXhwb3J0cGFydHM9XCJzYmItc3ItcGxhY2UtcGFydFwiXG4gICAgICAgICAgICAgIGlkPSR7cGxhY2VJZH1cbiAgICAgICAgICAgICAgY2xhc3M9XCJzZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2xcIlxuICAgICAgICAgICAgICB0ZXh0PSR7cGxhY2UubnVtYmVyfVxuICAgICAgICAgICAgICB0eXBlPSR7cGxhY2UudHlwZX1cbiAgICAgICAgICAgICAgc3RhdGU9JHtwbGFjZS5zdGF0ZX1cbiAgICAgICAgICAgICAgdHJhdmVsLWRpcmVjdGlvbj0ke3RoaXMudHJhdmVsRGlyZWN0aW9ufVxuICAgICAgICAgICAgICBjb2FjaC1pbmRleD0ke2NvYWNoSW5kZXh9XG4gICAgICAgICAgICAgIGRlY2staW5kZXg9JHtwbGFjZUNvYWNoRGVja0luZGV4fVxuICAgICAgICAgICAgICBkYXRhLWRlY2staW5kZXg9JHtkZWNrSW5kZXh9XG4gICAgICAgICAgICAgIC5wcm9wZXJ0eUlkcz0ke3BsYWNlLnByb3BlcnR5SWRzfVxuICAgICAgICAgICAgICAucHJldmVudENsaWNrPSR7dGhpcy5wcmV2ZW50UGxhY2VDbGlja31cbiAgICAgICAgICAgICAgP3Nob3dUaXRsZUluZm89XCIke3RoaXMuc2hvd1RpdGxlSW5mb31cIlxuICAgICAgICAgICAgPjwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICBgO1xuICAgICAgfSxcbiAgICApfWA7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZW5kZXJlZEdyYXBoaWNhbEVsZW1lbnRzKFxuICAgIGdyYXBoaWNhbEVsZW1lbnRzOiBCYXNlRWxlbWVudFtdLFxuICAgIGNvYWNoRGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdFtdIHwgbnVsbCB7XG4gICAgaWYgKCFncmFwaGljYWxFbGVtZW50cykgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gZ3JhcGhpY2FsRWxlbWVudHM/Lm1hcCgoZ3JhcGhpY2FsRWxlbWVudDogQmFzZUVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IGljb24gPSBncmFwaGljYWxFbGVtZW50Lmljb24gPz8gJyc7XG4gICAgICBjb25zdCBlbGVtZW50Um90YXRpb24gPSBncmFwaGljYWxFbGVtZW50LnJvdGF0aW9uIHx8IDA7XG4gICAgICBjb25zdCBpc05vdEZpeGVkUm90YXRpb25HcmFwaGljYWxFbGVtZW50ID1cbiAgICAgICAgdGhpcy5fbm90Rml4ZWRSb3RhdGFibGVBcmVhSWNvbnMuaW5kZXhPZihncmFwaGljYWxFbGVtZW50Lmljb24hKSA9PT0gLTE7XG4gICAgICBjb25zdCBlbGVtZW50Rml4ZWRSb3RhdGlvbiA9XG4gICAgICAgIHRoaXMuYWxpZ25WZXJ0aWNhbCAmJiBpc05vdEZpeGVkUm90YXRpb25HcmFwaGljYWxFbGVtZW50XG4gICAgICAgICAgPyBlbGVtZW50Um90YXRpb24gLSA5MFxuICAgICAgICAgIDogZWxlbWVudFJvdGF0aW9uO1xuXG4gICAgICAvL2NoZWNrIGlmIHRoZSBjdXJyZW50IGVsZW1lbnQgaXMgbm90IGFuIGFyZWEgZWxlbWVudCwgc2luY2UgdGhpcyBlbGVtZW50IGlzIGRyYXduIHdpdGhvdXQgYW4gYXJlYSBjb21wb25lbnRcbiAgICAgIGlmICh0aGlzLm5vdEFyZWFFbGVtZW50cy5maW5kSW5kZXgoKG5vdEFyZWFFbGVtZW50KSA9PiBub3RBcmVhRWxlbWVudCA9PT0gaWNvbikgPiAtMSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0UmVuZGVyRWxlbWVudFdpdGhvdXRBcmVhKGdyYXBoaWNhbEVsZW1lbnQsIGVsZW1lbnRSb3RhdGlvbiwgY29hY2hEaW1lbnNpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX2dldFJlbmRlckVsZW1lbnRXaXRoQXJlYShcbiAgICAgICAgZ3JhcGhpY2FsRWxlbWVudCxcbiAgICAgICAgZWxlbWVudEZpeGVkUm90YXRpb24sXG4gICAgICAgIGNvYWNoRGltZW5zaW9uLFxuICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICBjb2FjaERlY2tJbmRleCxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlcyBhIHJlbmRlcmVkIGVsZW1lbnQgd2l0aCBhbiBhcmVhIGNvbXBvbmVudFxuICAgKiBAcGFyYW0gZ3JhcGhpY2FsRWxlbWVudFxuICAgKiBAcGFyYW0gcm90YXRpb25cbiAgICogQHBhcmFtIGNvYWNoRGltZW5zaW9uXG4gICAqIEBwYXJhbSBjb2FjaEluZGV4IHVzZWQgdG8gZ2VuZXJhdGUgYSB1bmlxdWUgaWQgZm9yIHRoZSBwb3BvdmVyIHRyaWdnZXJcbiAgICogQHBhcmFtIGNvYWNoRGVja0luZGV4IHVzZWQgdG8gZ2VuZXJhdGUgYSB1bmlxdWUgaWRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX2dldFJlbmRlckVsZW1lbnRXaXRoQXJlYShcbiAgICBncmFwaGljYWxFbGVtZW50OiBCYXNlRWxlbWVudCxcbiAgICByb3RhdGlvbjogbnVtYmVyLFxuICAgIGNvYWNoRGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgLy8gZm9yIFRBQkxFLCB3ZSB1c2UgdGhlIGFyZWEgY29tcG9uZW50IGl0c2VsZiB0byBkaXNwbGF5IHRoZSB0YWJsZSBpbnN0ZWFkIG9mIHRoZSBTVkcgZ3JhcGhpYy5cbiAgICAvLyBEdWUgdG8gZGlmZmVyZW50IGhlaWdodHMgYW5kIHdpZHRocywgaXQgd291bGRuJ3Qgc2hvdyBjb3JyZWN0bHkuIFRvIGNvcnJlY3QgdGhpcywgd2Ugd291bGRcbiAgICAvLyBuZWVkIGRpZmZpY3VsdCBjYWxjdWxhdGlvbnMgZm9yIHBvc2l0aW9uLCByb3RhdGlvbiBhbmQgZGltZW5zaW9uLlxuICAgIGNvbnN0IGlzTm90VGFibGVHcmFwaGljID0gZ3JhcGhpY2FsRWxlbWVudC5pY29uPy5pbmRleE9mKCdUQUJMRScpID09PSAtMTtcbiAgICBjb25zdCBhcmVhUHJvcGVydHkgPSBncmFwaGljYWxFbGVtZW50Lmljb24gJiYgaXNOb3RUYWJsZUdyYXBoaWMgPyBncmFwaGljYWxFbGVtZW50Lmljb24gOiBudWxsO1xuICAgIGNvbnN0IHN0cmV0Y2hIZWlnaHQgPVxuICAgICAgdGhpcy5pc0VsZW1lbnREaXJlY3RseU9uQm9yZGVyKGdyYXBoaWNhbEVsZW1lbnQsIGNvYWNoRGltZW5zaW9uKSAmJlxuICAgICAgYXJlYVByb3BlcnR5ICE9PSAnRU5UUllfRVhJVCc7XG4gICAgY29uc3QgYXJpYUxhYmVsRm9yQXJlYSA9IGdyYXBoaWNhbEVsZW1lbnQuaWNvblxuICAgICAgPyBnZXRJMThuU2VhdFJlc2VydmF0aW9uKGdyYXBoaWNhbEVsZW1lbnQuaWNvbiwgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudClcbiAgICAgIDogbm90aGluZztcblxuICAgIGNvbnN0IGNhbGN1bGF0ZWREaW1lbnNpb24gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oXG4gICAgICBncmFwaGljYWxFbGVtZW50LmRpbWVuc2lvbixcbiAgICAgIGNvYWNoRGltZW5zaW9uLFxuICAgICAgdHJ1ZSxcbiAgICAgIHN0cmV0Y2hIZWlnaHQsXG4gICAgKTtcblxuICAgIGNvbnN0IGNhbGN1bGF0ZWRQb3NpdGlvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZFBvc2l0aW9uKFxuICAgICAgZ3JhcGhpY2FsRWxlbWVudC5wb3NpdGlvbixcbiAgICAgIGdyYXBoaWNhbEVsZW1lbnQuZGltZW5zaW9uLFxuICAgICAgY29hY2hEaW1lbnNpb24sXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICAvL2dlbmVyYXRlIHVuaXF1ZSBpbmRleCBudW1iZXIgZm9yIHRoZSB0cmlnZ2VyIGVsZW1lbnRcbiAgICBjb25zdCB0cmlnZ2VySWQgPSBgcG9wb3Zlci10cmlnZ2VyLSR7Y29hY2hEZWNrSW5kZXh9LSR7Y29hY2hJbmRleH0tJHtjYWxjdWxhdGVkUG9zaXRpb24ueH0tJHtjYWxjdWxhdGVkUG9zaXRpb24ueX1gO1xuICAgIGxldCBlbGVtZW50TW91bnRpbmcgPSAnZnJlZSc7XG5cbiAgICBpZiAoZ3JhcGhpY2FsRWxlbWVudC5wb3NpdGlvbi55ID09PSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogLTEpIHtcbiAgICAgIGVsZW1lbnRNb3VudGluZyA9ICd1cHBlci1ib3JkZXInO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBncmFwaGljYWxFbGVtZW50LnBvc2l0aW9uLnkgKyBncmFwaGljYWxFbGVtZW50LmRpbWVuc2lvbi5oID09PVxuICAgICAgY29hY2hEaW1lbnNpb24uaCArIHRoaXMuY29hY2hCb3JkZXJPZmZzZXRcbiAgICApIHtcbiAgICAgIGVsZW1lbnRNb3VudGluZyA9ICdsb3dlci1ib3JkZXInO1xuICAgIH1cblxuICAgIC8vIFRJTU8tNDU4MzBcbiAgICAvLyBJZiBhcmVhIGVsZW1lbnRzIGFyZSBsb2NhdGVkIGF0IHRoZSBib3JkZXIgb2YgY29hY2gsXG4gICAgLy8gd2UgaGF2ZSB0byBtYW51YWxseSBtb2RpZnkgdGhlIHBvc2l0aW9uIGFuZCBoZWlnaHQgb2YgdGhlIGFyZWEgZWxlbWVudCxcbiAgICAvLyBzbyB0aGF0IHdlIGdldCBhIGdhcCBmcm9tIHRoZSB2aXN1ZWwgY29hY2ggYm9yZGVyXG4gICAgaWYgKGVsZW1lbnRNb3VudGluZyAhPT0gJ2ZyZWUnKSB7XG4gICAgICBjYWxjdWxhdGVkUG9zaXRpb24ueSArPSBlbGVtZW50TW91bnRpbmcgPT09ICd1cHBlci1ib3JkZXInID8gMiA6IDE7XG4gICAgICBjYWxjdWxhdGVkRGltZW5zaW9uLmggLT0gMztcbiAgICB9XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYVxuICAgICAgICBpZD1cIiR7dHJpZ2dlcklkfVwiXG4gICAgICAgIGNsYXNzPVwiJHtjbGFzc01hcCh7ICdzYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhLS1jdXJzb3ItcG9pbnRlcic6IGFyZWFQcm9wZXJ0eSAhPT0gbnVsbCB9KX1cIlxuICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhLXdpZHRoJzogY2FsY3VsYXRlZERpbWVuc2lvbi53LFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWEtaGVpZ2h0JzogY2FsY3VsYXRlZERpbWVuc2lvbi5oLFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWEtdG9wJzogY2FsY3VsYXRlZFBvc2l0aW9uLnksXG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYS1sZWZ0JzogY2FsY3VsYXRlZFBvc2l0aW9uLngsXG4gICAgICAgIH0pfVxuICAgICAgICBtb3VudGluZz0ke2VsZW1lbnRNb3VudGluZ31cbiAgICAgICAgYmFja2dyb3VuZD1cImRhcmtcIlxuICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgPlxuICAgICAgICAke2FyZWFQcm9wZXJ0eVxuICAgICAgICAgID8gaHRtbGBcbiAgICAgICAgICAgICAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWNcbiAgICAgICAgICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbWF4LXdpZHRoJzogdGhpcy5nbG9iYWxBcmVhSWNvbkRpbS53LFxuICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1tYXgtaGVpZ2h0JzogdGhpcy5nbG9iYWxBcmVhSWNvbkRpbS5oLFxuICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy13aWR0aCc6IGNhbGN1bGF0ZWREaW1lbnNpb24udyxcbiAgICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtaGVpZ2h0JzogY2FsY3VsYXRlZERpbWVuc2lvbi5oLFxuICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1yb3RhdGlvbic6IHJvdGF0aW9uLFxuICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1wYWRkaW5nLXBlcmNlbnQnOlxuICAgICAgICAgICAgICAgICAgICBhcmVhUHJvcGVydHkgIT09ICdFTlRSWV9FWElUJyA/IHRoaXMuZ2xvYmFsQXJlYUljb25QYWRkaW5nIDogMSxcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICBuYW1lPSR7YXJlYVByb3BlcnR5fVxuICAgICAgICAgICAgICAgIHJvbGU9XCJpbWdcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzYmItc3ItZ3JhcGhpY19fZGltZW5zaW9uLS1zcXVhcmUtZGltXCJcbiAgICAgICAgICAgICAgPjwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYz5cbiAgICAgICAgICAgIGBcbiAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICA8L3NiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWE+XG4gICAgICAke2FyZWFQcm9wZXJ0eSA/IHRoaXMuX3BvcG92ZXIodHJpZ2dlcklkLCBhcmlhTGFiZWxGb3JBcmVhKSA6IG5vdGhpbmd9XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlbmRlckVsZW1lbnRXaXRob3V0QXJlYShcbiAgICBncmFwaGljYWxFbGVtZW50OiBCYXNlRWxlbWVudCxcbiAgICByb3RhdGlvbjogbnVtYmVyLFxuICAgIGNvYWNoRGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgY29uc3QgY2FsY3VsYXRlZERpbWVuc2lvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihcbiAgICAgIGdyYXBoaWNhbEVsZW1lbnQuZGltZW5zaW9uLFxuICAgICAgY29hY2hEaW1lbnNpb24sXG4gICAgKTtcbiAgICBjb25zdCBjYWxjdWxhdGVkUG9zaXRpb24gPSB0aGlzLmdldENhbGN1bGF0ZWRQb3NpdGlvbihcbiAgICAgIGdyYXBoaWNhbEVsZW1lbnQucG9zaXRpb24sXG4gICAgICBncmFwaGljYWxFbGVtZW50LmRpbWVuc2lvbixcbiAgICAgIGNvYWNoRGltZW5zaW9uLFxuICAgICk7XG5cbiAgICAvLyBJZiB0aGUgaWNvbiBpcyB0aGUgZHJpdmVyIGFyZWEsIHRoZW4gaGVyZSBjb25jYXQgdGhlIHZlaGljbGUgdHlwZSB0byBnZXQgdGhlIHJpZ2h0IHZlaGljbGUgY2hhc3NpcyBpY29uXG4gICAgY29uc3QgaWNvbiA9XG4gICAgICBncmFwaGljYWxFbGVtZW50Lmljb24gJiYgZ3JhcGhpY2FsRWxlbWVudC5pY29uLmVuZHNXaXRoKCdEUklWRVJfQVJFQScpXG4gICAgICAgID8gZ3JhcGhpY2FsRWxlbWVudC5pY29uPy5jb25jYXQoXG4gICAgICAgICAgICAnXycsXG4gICAgICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLnZlaGljbGVUeXBlLFxuICAgICAgICAgIClcbiAgICAgICAgOiBncmFwaGljYWxFbGVtZW50Lmljb247XG5cbiAgICByZXR1cm4gaHRtbGAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWNcbiAgICAgIHN0eWxlPSR7c3R5bGVNYXAoe1xuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXdpZHRoJzogY2FsY3VsYXRlZERpbWVuc2lvbi53LFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWhlaWdodCc6IGNhbGN1bGF0ZWREaW1lbnNpb24uaCxcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy10b3AnOiBjYWxjdWxhdGVkUG9zaXRpb24ueSxcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1sZWZ0JzogY2FsY3VsYXRlZFBvc2l0aW9uLngsXG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcG9zaXRpb24nOiAnYWJzb2x1dGUnLFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXJvdGF0aW9uJzogcm90YXRpb24sXG4gICAgICB9KX1cbiAgICAgIG5hbWU9JHtpY29uID8/IG5vdGhpbmd9XG4gICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgP3N0cmV0Y2g9JHt0cnVlfVxuICAgID48L3NiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWM+YDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlbmRlcmVkU2VydmljZUVsZW1lbnRzKFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIHNlcnZpY2VFbGVtZW50cz86IEJhc2VFbGVtZW50W10sXG4gICk6IFRlbXBsYXRlUmVzdWx0W10gfCBudWxsIHtcbiAgICBpZiAoIXNlcnZpY2VFbGVtZW50cykgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gc2VydmljZUVsZW1lbnRzPy5tYXAoKHNlcnZpY2VFbGVtZW50OiBCYXNlRWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgdGl0bGVEZXNjcmlwdGlvbiA9IHNlcnZpY2VFbGVtZW50Lmljb25cbiAgICAgICAgPyBnZXRJMThuU2VhdFJlc2VydmF0aW9uKHNlcnZpY2VFbGVtZW50Lmljb24sIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGNvbnN0IGNhbGN1bGF0ZWREaW1lbnNpb24gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oc2VydmljZUVsZW1lbnQuZGltZW5zaW9uKTtcbiAgICAgIGNvbnN0IGNhbGN1bGF0ZWRQb3NpdGlvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZFBvc2l0aW9uKHNlcnZpY2VFbGVtZW50LnBvc2l0aW9uKTtcbiAgICAgIGNvbnN0IGVsZW1lbnRSb3RhdGlvbiA9IHNlcnZpY2VFbGVtZW50LnJvdGF0aW9uIHx8IDA7XG4gICAgICBjb25zdCBlbGVtZW50Rml4ZWRSb3RhdGlvbiA9IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IGVsZW1lbnRSb3RhdGlvbiAtIDkwIDogZWxlbWVudFJvdGF0aW9uO1xuXG4gICAgICAvL2dlbmVyYXRlIHVuaXF1ZSBpbmRleCBudW1iZXIgZm9yIHRoZSB0cmlnZ2VyIGVsZW1lbnRcbiAgICAgIGNvbnN0IHRyaWdnZXJJZCA9IGBwb3BvdmVyLXRyaWdnZXItJHtjb2FjaERlY2tJbmRleH0tJHtjb2FjaEluZGV4fS0ke2NhbGN1bGF0ZWRQb3NpdGlvbi54fS0ke2NhbGN1bGF0ZWRQb3NpdGlvbi55fWA7XG5cbiAgICAgIHJldHVybiBodG1sYFxuICAgICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpY1xuICAgICAgICAgIGlkPVwiJHt0cmlnZ2VySWR9XCJcbiAgICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtd2lkdGgnOiBjYWxjdWxhdGVkRGltZW5zaW9uLncsXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWhlaWdodCc6IGNhbGN1bGF0ZWREaW1lbnNpb24uaCxcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtdG9wJzogY2FsY3VsYXRlZFBvc2l0aW9uLnksXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWxlZnQnOiBjYWxjdWxhdGVkUG9zaXRpb24ueCxcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcG9zaXRpb24nOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1yb3RhdGlvbic6IGVsZW1lbnRGaXhlZFJvdGF0aW9uLFxuICAgICAgICAgIH0pfVxuICAgICAgICAgIGNsYXNzPVwic2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy0tY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgIG5hbWU9JHtzZXJ2aWNlRWxlbWVudC5pY29uID8/IG5vdGhpbmd9XG4gICAgICAgICAgcm9sZT1cImltZ1wiXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgPjwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYz5cbiAgICAgICAgJHt0aGlzLl9wb3BvdmVyKHRyaWdnZXJJZCwgdGl0bGVEZXNjcmlwdGlvbil9XG4gICAgICBgO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbmFnZXMgdGhlIHNlbGVjdGVkIHBsYWNlIGV2ZW50IHRyaWdnZXJlZCBmcm9tIHRoZSBwbGFjZVxuICAgKiBFYWNoIHNlbGVjdGlvbiBlbWl0cyBhbiBhcnJheSBvZiBhbGwgc2VsZWN0ZWQgcGxhY2VzXG4gICAqIEBwYXJhbSBzZWxlY3RQbGFjZUV2ZW50XG4gICAqL1xuICBwcml2YXRlIF9vblNlbGVjdFBsYWNlKHNlbGVjdFBsYWNlRXZlbnQ6IEN1c3RvbUV2ZW50PFBsYWNlU2VsZWN0aW9uPik6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUGxhY2UgPSBzZWxlY3RQbGFjZUV2ZW50LmRldGFpbDtcbiAgICAvLyBXZSBoYXZlIHRvIHNldCBwcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgdG8gdHJ1ZSwgdG8gcHJldmVudCBhdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBuZXcgZm9jdXNlZCBwbGFjZVxuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gdHJ1ZTtcbiAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIC8vIENoZWNrIGFueSBrZXlib2FyZCBldmVudCB3YXMgdHJpZ2dlcmVkIGluc2lkZSB0aGUgc2VhdCByZXNlcnZhdGlvbiBjb21wb25lbnQsXG4gICAgLy8gc28gd2UgY2FuIHNheSB0aGUgbmF0aXZlIGJyb3dzZXIgZm9jdXMgbGllcyBvbiB0aGUgY29tcG9uZW50XG4gICAgaWYgKCF0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzKSB7XG4gICAgICB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucHJldmVudFBsYWNlQ2xpY2spIHtcbiAgICAgIC8vIEFkZCBwbGFjZSB0byBwbGFjZSBjb2xsZWN0aW9uXG4gICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKHNlbGVjdGVkUGxhY2UpO1xuICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRQbGFjZUluQ29hY2goc2VsZWN0ZWRQbGFjZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfb25TZWxlY3ROYXZDb2FjaChldmVudDogQ3VzdG9tRXZlbnQ8bnVtYmVyPik6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkTmF2Q29hY2hJbmRleCA9IGV2ZW50LmRldGFpbDtcblxuICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayA9IGZhbHNlO1xuICAgIHRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgPSB0cnVlO1xuXG4gICAgaWYgKHNlbGVjdGVkTmF2Q29hY2hJbmRleCAhPT0gbnVsbCAmJiBzZWxlY3RlZE5hdkNvYWNoSW5kZXggIT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChzZWxlY3RlZE5hdkNvYWNoSW5kZXgpO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROYXZDb2FjaEluZGV4ID09PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcbiAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgfVxuXG4gICAgLy9jbG9zZSBhbGwgb3BlbmVkIHBvcG92ZXJzXG4gICAgdGhpcy5fY2xvc2VQb3BvdmVyKCk7XG4gIH1cblxuICBwcml2YXRlIF9vbkZvY3VzTmF2Q29hY2goKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljaykge1xuICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBwb3BvdmVyIGZvciBleHRyYSBzZXJ2aWNlIGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB0cmlnZ2VySWRcbiAgICogQHBhcmFtIHBvcG92ZXJDb250ZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9wb3BvdmVyKFxuICAgIHRyaWdnZXJJZDogc3RyaW5nLFxuICAgIHBvcG92ZXJDb250ZW50OiBzdHJpbmcgfCBudWxsIHwgdHlwZW9mIG5vdGhpbmcsXG4gICk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzYmItcG9wb3ZlciB0cmlnZ2VyPVwiJHt0cmlnZ2VySWR9XCIgaG92ZXItdHJpZ2dlcj1cIlwiPlxuICAgICAgICA8cCBjbGFzcz1cInNiYi10ZXh0LXMgc2JiLXNyLXBvcG92ZXJcIj4ke3BvcG92ZXJDb250ZW50fTwvcD5cbiAgICAgIDwvc2JiLXBvcG92ZXI+XG4gICAgYDtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyIHRvIGNsb3NlIGFsbCBvcGVuZWQgcG9wb3ZlcnMgKG5vcm1hbGx5IG9ubHkgb25lIGlzIG9wZW5lZCBhdCBhIHRpbWUpXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9jbG9zZVBvcG92ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5zaGFkb3dSb290XG4gICAgICA/LnF1ZXJ5U2VsZWN0b3JBbGw8U2JiUG9wb3ZlckVsZW1lbnQ+KCdzYmItcG9wb3ZlcjpzdGF0ZShzdGF0ZS1vcGVuZWQpJylcbiAgICAgIC5mb3JFYWNoKChwb3BvdmVyKSA9PiBwb3BvdmVyLmNsb3NlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0RGVzY3JpcHRpb25UYWJsZUNvYWNoKGNvYWNoSXRlbTogQ29hY2hJdGVtKTogc3RyaW5nIHtcbiAgICAvL3Nob3cgZGlmZmVyZW50IHRhYmxlIGNhcHRpb24gZm9yIHNjcmVlbnJlYWRlciBpZiBpdCBpcyBhIGxvY29tb3RpdmVcbiAgICBpZiAoY29hY2hJdGVtLnR5cGUgPT09ICdMT0NPTU9USVZFX0NPQUNIJykge1xuICAgICAgcmV0dXJuIGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ0NPQUNIX0xPQ09NT1RJVkUnLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoIWNvYWNoSXRlbS5wbGFjZXM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ0NPQUNIX0JMT0NLRURfVEFCTEVfQ0FQVElPTicsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsIFtcbiAgICAgICAgY29hY2hJdGVtLmlkLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgbGV0IHRhYmxlQ29hY2hEZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGNvbnN0IGFyZWFEZXNjcmlwdGlvbnMgPSB0aGlzLl9nZXRUaXRsZURlc2NyaXB0aW9uTGlzdFN0cmluZyhjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzISk7XG4gICAgY29uc3Qgc2VydmljZURlc2NyaXB0aW9ucyA9IHRoaXMuX2dldFRpdGxlRGVzY3JpcHRpb25MaXN0U3RyaW5nKGNvYWNoSXRlbS5zZXJ2aWNlRWxlbWVudHMhKTtcblxuICAgIHRhYmxlQ29hY2hEZXNjcmlwdGlvbiA9IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ0NPQUNIX1RBQkxFX0NBUFRJT04nLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LCBbXG4gICAgICBjb2FjaEl0ZW0uaWQsXG4gICAgXSk7XG5cbiAgICBpZiAoIXRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgLy8gRXhwYW5kcyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBzZWF0cyBhbmQgYmljeWNsZSBzcGFjZXMgYXMgaW5mb1xuICAgICAgY29uc3QgZnJlZVBsYWNlcyA9IHRoaXMuZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChjb2FjaEl0ZW0ucGxhY2VzKTtcbiAgICAgIGNvbnN0IGZyZWVQbGFjZXNUeHQgPSBnZXRJMThuU2VhdFJlc2VydmF0aW9uKFxuICAgICAgICAnQ09BQ0hfQVZBSUxBQkxFX05VTUJFUl9PRl9QTEFDRVMnLFxuICAgICAgICB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LFxuICAgICAgICBbZnJlZVBsYWNlcy5zZWF0cywgZnJlZVBsYWNlcy5iaWN5Y2xlc10sXG4gICAgICApO1xuICAgICAgdGFibGVDb2FjaERlc2NyaXB0aW9uID0gdGFibGVDb2FjaERlc2NyaXB0aW9uLmNvbmNhdCgnLiAnKS5jb25jYXQoZnJlZVBsYWNlc1R4dCkuY29uY2F0KCcuICcpO1xuICAgIH1cblxuICAgIGlmICghIWFyZWFEZXNjcmlwdGlvbnMgfHwgISFzZXJ2aWNlRGVzY3JpcHRpb25zKSB7XG4gICAgICB0YWJsZUNvYWNoRGVzY3JpcHRpb24gKz1cbiAgICAgICAgJy4gJyArIGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ0NPQUNIX0FWQUlMQUJMRV9TRVJWSUNFUycsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpICsgJzogJztcbiAgICAgIHRhYmxlQ29hY2hEZXNjcmlwdGlvbiArPSBzZXJ2aWNlRGVzY3JpcHRpb25zICsgJywgJyArIGFyZWFEZXNjcmlwdGlvbnMgKyAnLic7XG4gICAgfVxuICAgIHJldHVybiB0YWJsZUNvYWNoRGVzY3JpcHRpb247XG4gIH1cblxuICBwcml2YXRlIF9nZXRUaXRsZURlc2NyaXB0aW9uTGlzdFN0cmluZyhkZXNjcmlwdGlvbnNFbGVtZW50czogQmFzZUVsZW1lbnRbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgdW5pcXVlRGVzY3JpcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgcmV0dXJuIGRlc2NyaXB0aW9uc0VsZW1lbnRzXG4gICAgICA/Lm1hcCgoZGVzY3JpcHRpb25FbGVtZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGljb24gPSBkZXNjcmlwdGlvbkVsZW1lbnQuaWNvbjtcbiAgICAgICAgaWYgKCFpY29uKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbkFscmVhZHlFeGlzdCA9IHVuaXF1ZURlc2NyaXB0aW9ucy5pbmRleE9mKGljb24pID4gLTE7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihcbiAgICAgICAgICBkZXNjcmlwdGlvbkVsZW1lbnQuaWNvbiEsXG4gICAgICAgICAgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaXNWYWxpZERlc2NyaXB0aW9uID1cbiAgICAgICAgICB0aGlzLl9ub3RGaXhlZFJvdGF0YWJsZUFyZWFJY29ucy5pbmRleE9mKGljb24pID09PSAtMSAmJlxuICAgICAgICAgIHRoaXMubm90QXJlYUVsZW1lbnRzLmluZGV4T2YoaWNvbikgPT09IC0xO1xuXG4gICAgICAgIGlmICghZGVzY3JpcHRpb25BbHJlYWR5RXhpc3QpIHtcbiAgICAgICAgICB1bmlxdWVEZXNjcmlwdGlvbnMucHVzaChkZXNjcmlwdGlvbkVsZW1lbnQuaWNvbiEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhIXRyYW5zbGF0aW9uICYmICFkZXNjcmlwdGlvbkFscmVhZHlFeGlzdCAmJiBpc1ZhbGlkRGVzY3JpcHRpb24gPyB0cmFuc2xhdGlvbiA6IG51bGw7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoZGVzY3JpcHRpb24pID0+ICEhZGVzY3JpcHRpb24pXG4gICAgICAuam9pbignLCAnKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXNlYXQtcmVzZXJ2YXRpb24nOiBTYmJTZWF0UmVzZXJ2YXRpb25FbGVtZW50O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNnQ0EsOEJBQThCLFFBQVE7QUFDdEMsaUNBQWlDLFFBQVE7QUFDekMsc0NBQXNDLFFBQVE7QUFDOUMseUNBQXlDLFFBQVE7QUFDakQsZ0NBQWdDLFFBQVE7Ozs7O0FBTXhDLElBQWEsNEJBQWIsY0FBK0MsMkJBQTBCO0NBQXpFLGNBQUE7O0FBSVUsT0FBQSxZQUFZLElBQUksc0JBQXNCLEtBQUs7QUFJM0MsT0FBQSw4QkFBOEIsQ0FBQyxhQUFhOzs7QUFQcEIsT0FBQSxjQUFzQjs7O0FBQy9CLE9BQUEsU0FBeUIsQ0FBQyxpQkFB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