@sbb-esta/lyne-elements-dev 5.0.0-next-dev.1777279279 → 5.0.0-next-dev.1777284499

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.
@@ -1,268 +0,0 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { html, nothing, unsafeCSS } from "lit";
3
- import { property } from "lit/decorators.js";
4
- import { SbbDarkModeController, SbbLanguageController, SbbOpenCloseBaseElement, SbbReadonlyMixin, boxSizingStyles, composedPathHasAttribute, forceType, i18nCloseAlert, isZeroAnimationDuration } from "./core.js";
5
- import { SbbTransparentButtonElement } from "./button.pure.js";
6
- import { SbbDividerElement } from "./divider.pure.js";
7
- import { SbbIconNameMixin } from "./icon.pure.js";
8
- //#region src/elements/toast/toast.scss?inline
9
- var toast_default = ":host {\n --sbb-toast-max-width: 25rem;\n --sbb-toast-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-6x)\n );\n --sbb-toast-animation-timing-function: ease;\n --sbb-toast-text-color: var(--sbb-color-3-inverted);\n --sbb-toast-background-color: var(--sbb-background-color-1-inverted);\n --sbb-toast-margin: var(--sbb-spacing-responsive-s);\n --sbb-toast-padding-block: var(--sbb-spacing-responsive-xxxs);\n --sbb-toast-padding-inline: var(--sbb-spacing-responsive-xs);\n --sbb-toast-border-radius: var(--sbb-border-radius-4x);\n --sbb-toast-container-display: none;\n --sbb-toast-container-position: fixed;\n --sbb-toast-horizontal-position: initial;\n --sbb-toast-vertical-position: initial;\n --sbb-toast-gap: var(--sbb-spacing-fixed-2x);\n --sbb-focus-outline-color: var(--sbb-focus-outline-color-dark);\n display: none;\n}\n\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]), :is(:state(state-closing),[state--state-closing]))) {\n --sbb-toast-container-display: flex;\n display: block;\n}\n\n:host([position=bottom-left]),\n:host([position=bottom-start]) {\n --sbb-toast-horizontal-position: flex-start;\n --sbb-toast-vertical-position: flex-end;\n}\n\n:host([position=bottom-center]) {\n --sbb-toast-horizontal-position: center;\n --sbb-toast-vertical-position: flex-end;\n}\n\n:host([position=bottom-right]),\n:host([position=bottom-end]) {\n --sbb-toast-horizontal-position: flex-end;\n --sbb-toast-vertical-position: flex-end;\n}\n\n:host([position=top-left]),\n:host([position=top-start]) {\n --sbb-toast-horizontal-position: flex-start;\n --sbb-toast-vertical-position: flex-start;\n}\n\n:host([position=top-center]) {\n --sbb-toast-horizontal-position: center;\n --sbb-toast-vertical-position: flex-start;\n}\n\n:host([position=top-right]),\n:host([position=top-end]) {\n --sbb-toast-horizontal-position: flex-end;\n --sbb-toast-vertical-position: flex-start;\n}\n\n:host(:is(:state(dark),[state--dark])) {\n --sbb-focus-outline-color: var(--sbb-focus-outline-color-default);\n}\n\n.sbb-toast__overlay-container {\n position: var(--sbb-toast-container-position);\n pointer-events: none;\n inset: 0;\n display: var(--sbb-toast-container-display);\n justify-content: var(--sbb-toast-horizontal-position);\n align-items: var(--sbb-toast-vertical-position);\n}\n\n.sbb-toast {\n z-index: var(--sbb-toast-z-index, var(--sbb-overlay-default-z-index));\n pointer-events: auto;\n margin: var(--sbb-toast-margin);\n border-radius: var(--sbb-toast-border-radius);\n max-width: var(--sbb-toast-max-width);\n display: flex;\n color: var(--sbb-toast-text-color);\n background-color: var(--sbb-toast-background-color);\n}\n:host(:is(:state(state-opening),[state--state-opening])) .sbb-toast {\n animation-name: open;\n animation-duration: var(--sbb-toast-animation-duration);\n animation-timing-function: var(--sbb-toast-animation-timing-function);\n}\n:host(:is(:state(state-closing),[state--state-closing])) .sbb-toast {\n animation-name: close;\n animation-duration: var(--sbb-toast-animation-duration);\n animation-timing-function: var(--sbb-toast-animation-timing-function);\n}\n\n.sbb-toast-wrapper {\n display: flex;\n align-items: center;\n gap: var(--sbb-toast-gap);\n padding-block: var(--sbb-toast-padding-block);\n padding-inline: var(--sbb-toast-padding-inline);\n}\n\nslot:not([name=icon]),\n.sbb-toast__close {\n color-scheme: only light;\n}\n\n.sbb-toast__content {\n --sbb-title-font-size: var(--sbb-title-font-size-level-6-lean, var(--sbb-heading-font-size-6));\n --sbb-title-line-height: var(--sbb-typo-line-height-text);\n margin-block: var(--sbb-title-margin-block, 0);\n margin-inline: 0;\n font-family: var(--sbb-typo-font-family);\n font-weight: bold;\n font-size: var(--sbb-title-font-size);\n letter-spacing: var(--sbb-typo-letter-spacing-heading);\n line-height: var(--sbb-title-line-height, var(--sbb-typo-line-height-heading));\n flex: 1 1 0;\n}\n\n.sbb-toast__close {\n display: flex;\n align-items: center;\n}\n\n.sbb-toast__close-divider {\n padding-block: var(--sbb-toast-padding-block);\n}\n\n.sbb-toast__close-button {\n margin-inline: var(--sbb-spacing-responsive-xxxs);\n}\n\n@keyframes open {\n from {\n visibility: hidden;\n opacity: 0;\n translate: 0 var(--sbb-spacing-fixed-2x);\n }\n to {\n visibility: visible;\n opacity: 1;\n translate: 0;\n }\n}\n@keyframes close {\n from {\n visibility: visible;\n opacity: 1;\n translate: 0;\n }\n to {\n visibility: hidden;\n opacity: 0;\n translate: 0 var(--sbb-spacing-fixed-2x);\n }\n}";
10
- //#endregion
11
- //#region src/elements/toast/toast.component.ts
12
- var toastRefs = /* @__PURE__ */ new Set();
13
- /**
14
- * It displays a toast notification.
15
- *
16
- * @slot - Use the unnamed slot to add content to the `sbb-toast`.
17
- * @slot icon - Assign a custom icon via slot.
18
- * @slot action - Provide a custom action for this toast.
19
- * @cssprop [--sbb-toast-z-index=var(--sbb-overlay-default-z-index)] - To specify a custom stack order,
20
- * the `z-index` can be overridden by defining this CSS variable. The default `z-index` of the
21
- * component is set to `var(--sbb-overlay-default-z-index)` with a value of `1000`.
22
- */
23
- var SbbToastElement = (() => {
24
- let _classSuper = SbbIconNameMixin(SbbReadonlyMixin(SbbOpenCloseBaseElement));
25
- let _timeout_decorators;
26
- let _timeout_initializers = [];
27
- let _timeout_extraInitializers = [];
28
- let _position_decorators;
29
- let _position_initializers = [];
30
- let _position_extraInitializers = [];
31
- let _politeness_decorators;
32
- let _politeness_initializers = [];
33
- let _politeness_extraInitializers = [];
34
- return class SbbToastElement extends _classSuper {
35
- static {
36
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
37
- _timeout_decorators = [forceType(), property({ type: Number })];
38
- _position_decorators = [property({ reflect: true })];
39
- _politeness_decorators = [property()];
40
- __esDecorate(this, null, _timeout_decorators, {
41
- kind: "accessor",
42
- name: "timeout",
43
- static: false,
44
- private: false,
45
- access: {
46
- has: (obj) => "timeout" in obj,
47
- get: (obj) => obj.timeout,
48
- set: (obj, value) => {
49
- obj.timeout = value;
50
- }
51
- },
52
- metadata: _metadata
53
- }, _timeout_initializers, _timeout_extraInitializers);
54
- __esDecorate(this, null, _position_decorators, {
55
- kind: "accessor",
56
- name: "position",
57
- static: false,
58
- private: false,
59
- access: {
60
- has: (obj) => "position" in obj,
61
- get: (obj) => obj.position,
62
- set: (obj, value) => {
63
- obj.position = value;
64
- }
65
- },
66
- metadata: _metadata
67
- }, _position_initializers, _position_extraInitializers);
68
- __esDecorate(this, null, _politeness_decorators, {
69
- kind: "accessor",
70
- name: "politeness",
71
- static: false,
72
- private: false,
73
- access: {
74
- has: (obj) => "politeness" in obj,
75
- get: (obj) => obj.politeness,
76
- set: (obj, value) => {
77
- obj.politeness = value;
78
- }
79
- },
80
- metadata: _metadata
81
- }, _politeness_initializers, _politeness_extraInitializers);
82
- if (_metadata) Object.defineProperty(this, Symbol.metadata, {
83
- enumerable: true,
84
- configurable: true,
85
- writable: true,
86
- value: _metadata
87
- });
88
- }
89
- static {
90
- this.elementName = "sbb-toast";
91
- }
92
- static {
93
- this.elementDependencies = [SbbTransparentButtonElement, SbbDividerElement];
94
- }
95
- static {
96
- this.styles = [boxSizingStyles, unsafeCSS(toast_default)];
97
- }
98
- #timeout_accessor_storage;
99
- /**
100
- * The length of time in milliseconds to wait before automatically dismissing the toast.
101
- * If 0 (default), it stays open indefinitely.
102
- * From accessibility perspective, it is recommended to set a timeout of at least 20 seconds.
103
- */
104
- get timeout() {
105
- return this.#timeout_accessor_storage;
106
- }
107
- set timeout(value) {
108
- this.#timeout_accessor_storage = value;
109
- }
110
- #position_accessor_storage;
111
- /** The position where to place the toast. */
112
- get position() {
113
- return this.#position_accessor_storage;
114
- }
115
- set position(value) {
116
- this.#position_accessor_storage = value;
117
- }
118
- #politeness_accessor_storage;
119
- /**
120
- * The ARIA politeness level.
121
- * Check https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Live_Regions#live_regions for further info
122
- */
123
- get politeness() {
124
- return this.#politeness_accessor_storage;
125
- }
126
- set politeness(value) {
127
- this.#politeness_accessor_storage = value;
128
- }
129
- constructor() {
130
- super();
131
- this.#timeout_accessor_storage = __runInitializers(this, _timeout_initializers, 0);
132
- this.#position_accessor_storage = (__runInitializers(this, _timeout_extraInitializers), __runInitializers(this, _position_initializers, "bottom-center"));
133
- this.#politeness_accessor_storage = (__runInitializers(this, _position_extraInitializers), __runInitializers(this, _politeness_initializers, "polite"));
134
- this._closeTimeout = __runInitializers(this, _politeness_extraInitializers);
135
- this._language = new SbbLanguageController(this);
136
- this._darkModeController = new SbbDarkModeController(this, () => {
137
- this._syncSlottedElements();
138
- this.requestUpdate();
139
- });
140
- this.addEventListener?.("click", (e) => this._onClick(e));
141
- }
142
- connectedCallback() {
143
- this.popover = "manual";
144
- super.connectedCallback();
145
- toastRefs.add(this);
146
- }
147
- disconnectedCallback() {
148
- super.disconnectedCallback();
149
- clearTimeout(this._closeTimeout);
150
- toastRefs.delete(this);
151
- }
152
- willUpdate(changedProperties) {
153
- super.willUpdate(changedProperties);
154
- if (changedProperties.has("politeness")) this.internals.ariaLive = this.politeness;
155
- }
156
- /**
157
- * Open the toast.
158
- * If there are other opened toasts in the page, close them first.
159
- */
160
- open() {
161
- if (this.state === "opened" || this.state === "opening" || !this.dispatchBeforeOpenEvent()) return;
162
- this._closeOtherToasts();
163
- this.showPopover?.();
164
- this.state = "opening";
165
- if (this._isZeroAnimationDuration()) this._handleOpening();
166
- }
167
- /**
168
- * Close the toast.
169
- */
170
- close() {
171
- if (this.state === "closed" || this.state === "closing" || !this.dispatchBeforeCloseEvent()) return;
172
- clearTimeout(this._closeTimeout);
173
- this.state = "closing";
174
- if (this._isZeroAnimationDuration()) this._handleClosing();
175
- }
176
- _handleClosing() {
177
- this.state = "closed";
178
- this.hidePopover?.();
179
- this.dispatchCloseEvent();
180
- }
181
- _handleOpening() {
182
- this.state = "opened";
183
- this.dispatchOpenEvent();
184
- if (this.timeout) {
185
- const global = globalThis;
186
- const setTimeout = global[global.Zone?.__symbol__?.("setTimeout")] ?? global.setTimeout;
187
- this._closeTimeout = setTimeout(() => this.close(), this.timeout);
188
- }
189
- }
190
- _onClick(event) {
191
- const closeElement = composedPathHasAttribute(event, "sbb-toast-close", this);
192
- if (closeElement && !closeElement.hasAttribute("disabled")) this.close();
193
- }
194
- _isZeroAnimationDuration() {
195
- return isZeroAnimationDuration(this, "--sbb-toast-animation-duration");
196
- }
197
- /**
198
- * Slotted text nodes are not read correctly by screen readers on Chrome.
199
- * To address the problem, if there is at least a root text node,
200
- * we wrap the whole content in a <span> tag
201
- */
202
- _onContentSlotChange(event) {
203
- const slotNodes = event.target.assignedNodes();
204
- if (slotNodes.some((el) => el.nodeType === Node.TEXT_NODE)) {
205
- const span = document.createElement("span");
206
- this.prepend(span);
207
- span.append(...slotNodes);
208
- }
209
- this._syncSlottedElements();
210
- }
211
- _syncSlottedElements() {
212
- this.querySelectorAll("sbb-transparent-button, sbb-transparent-button-link").forEach((btn) => {
213
- btn.negative = this._isLightMode();
214
- });
215
- this.querySelectorAll("sbb-link, sbb-link-button, sbb-link-static").forEach((link) => {
216
- link.negative = this._isLightMode();
217
- });
218
- }
219
- _onToastAnimationEnd(event) {
220
- if (event.animationName === "open" && this.state === "opening") this._handleOpening();
221
- else if (event.animationName === "close" && this.state === "closing") this._handleClosing();
222
- }
223
- /**
224
- * Since we do not stack toasts, we force the closing on other existing opened ones
225
- */
226
- _closeOtherToasts() {
227
- toastRefs.forEach((t) => {
228
- if (t.state === "opened" || t.state === "opening") t.close();
229
- });
230
- }
231
- _isLightMode() {
232
- return !this._darkModeController.matches();
233
- }
234
- render() {
235
- return html`
236
- <div class="sbb-toast__overlay-container">
237
- <div class="sbb-toast" @animationend=${this._onToastAnimationEnd}>
238
- <div class="sbb-toast-wrapper">
239
- ${this.renderIconSlot()}
240
- <div class="sbb-toast__content">
241
- <slot @slotchange=${this._onContentSlotChange}></slot>
242
- </div>
243
- <slot name="action" @slotchange=${this._syncSlottedElements}></slot>
244
- </div>
245
- <div class="sbb-toast__close">
246
- <sbb-divider
247
- class="sbb-toast__close-divider"
248
- orientation="vertical"
249
- ?negative=${this._isLightMode()}
250
- ></sbb-divider>
251
- ${!this.readOnly ? html`<sbb-transparent-button
252
- class="sbb-toast__close-button"
253
- icon-name="cross-small"
254
- ?negative=${this._isLightMode()}
255
- aria-label=${i18nCloseAlert[this._language.current]}
256
- sbb-toast-close
257
- ></sbb-transparent-button>` : nothing}
258
- </div>
259
- </div>
260
- </div>
261
- `;
262
- }
263
- };
264
- })();
265
- //#endregion
266
- export { SbbToastElement as t };
267
-
268
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuY29tcG9uZW50LUQxTTNPWXh2LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50cy90b2FzdC90b2FzdC5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy90b2FzdC90b2FzdC5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiQHVzZSAnLi4vY29yZS9zdHlsZXMnIGFzIHNiYjtcblxuOmhvc3Qge1xuICAtLXNiYi10b2FzdC1tYXgtd2lkdGg6ICN7c2JiLnB4LXRvLXJlbS1idWlsZCg0MDApfTtcbiAgLS1zYmItdG9hc3QtYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoXG4gICAgLS1zYmItZGlzYWJsZS1hbmltYXRpb24tZHVyYXRpb24sXG4gICAgdmFyKC0tc2JiLWFuaW1hdGlvbi1kdXJhdGlvbi02eClcbiAgKTtcbiAgLS1zYmItdG9hc3QtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTtcbiAgLS1zYmItdG9hc3QtdGV4dC1jb2xvcjogdmFyKC0tc2JiLWNvbG9yLTMtaW52ZXJ0ZWQpO1xuICAtLXNiYi10b2FzdC1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zYmItYmFja2dyb3VuZC1jb2xvci0xLWludmVydGVkKTtcbiAgLS1zYmItdG9hc3QtbWFyZ2luOiB2YXIoLS1zYmItc3BhY2luZy1yZXNwb25zaXZlLXMpO1xuICAtLXNiYi10b2FzdC1wYWRkaW5nLWJsb2NrOiB2YXIoLS1zYmItc3BhY2luZy1yZXNwb25zaXZlLXh4eHMpO1xuICAtLXNiYi10b2FzdC1wYWRkaW5nLWlubGluZTogdmFyKC0tc2JiLXNwYWNpbmctcmVzcG9uc2l2ZS14cyk7XG4gIC0tc2JiLXRvYXN0LWJvcmRlci1yYWRpdXM6IHZhcigtLXNiYi1ib3JkZXItcmFkaXVzLTR4KTtcbiAgLS1zYmItdG9hc3QtY29udGFpbmVyLWRpc3BsYXk6IG5vbmU7XG4gIC0tc2JiLXRvYXN0LWNvbnRhaW5lci1wb3NpdGlvbjogZml4ZWQ7XG4gIC0tc2JiLXRvYXN0LWhvcml6b250YWwtcG9zaXRpb246IGluaXRpYWw7XG4gIC0tc2JiLXRvYXN0LXZlcnRpY2FsLXBvc2l0aW9uOiBpbml0aWFsO1xuICAtLXNiYi10b2FzdC1nYXA6IHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTJ4KTtcbiAgLS1zYmItZm9jdXMtb3V0bGluZS1jb2xvcjogdmFyKC0tc2JiLWZvY3VzLW91dGxpbmUtY29sb3ItZGFyayk7XG5cbiAgZGlzcGxheTogbm9uZTtcbn1cblxuOmhvc3QoOmlzKDpzdGF0ZShzdGF0ZS1vcGVuaW5nKSwgOnN0YXRlKHN0YXRlLW9wZW5lZCksIDpzdGF0ZShzdGF0ZS1jbG9zaW5nKSkpIHtcbiAgLS1zYmItdG9hc3QtY29udGFpbmVyLWRpc3BsYXk6IGZsZXg7XG5cbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbjpob3N0KFtwb3NpdGlvbj0nYm90dG9tLWxlZnQnXSksXG46aG9zdChbcG9zaXRpb249J2JvdHRvbS1zdGFydCddKSB7XG4gIC0tc2JiLXRvYXN0LWhvcml6b250YWwtcG9zaXRpb246IGZsZXgtc3RhcnQ7XG4gIC0tc2JiLXRvYXN0LXZlcnRpY2FsLXBvc2l0aW9uOiBmbGV4LWVuZDtcbn1cblxuOmhvc3QoW3Bvc2l0aW9uPSdib3R0b20tY2VudGVyJ10pIHtcbiAgLS1zYmItdG9hc3QtaG9yaXpvbnRhbC1wb3NpdGlvbjogY2VudGVyO1xuICAtLXNiYi10b2FzdC12ZXJ0aWNhbC1wb3NpdGlvbjogZmxleC1lbmQ7XG59XG5cbjpob3N0KFtwb3NpdGlvbj0nYm90dG9tLXJpZ2h0J10pLFxuOmhvc3QoW3Bvc2l0aW9uPSdib3R0b20tZW5kJ10pIHtcbiAgLS1zYmItdG9hc3QtaG9yaXpvbnRhbC1wb3NpdGlvbjogZmxleC1lbmQ7XG4gIC0tc2JiLXRvYXN0LXZlcnRpY2FsLXBvc2l0aW9uOiBmbGV4LWVuZDtcbn1cblxuOmhvc3QoW3Bvc2l0aW9uPSd0b3AtbGVmdCddKSxcbjpob3N0KFtwb3NpdGlvbj0ndG9wLXN0YXJ0J10pIHtcbiAgLS1zYmItdG9hc3QtaG9yaXpvbnRhbC1wb3NpdGlvbjogZmxleC1zdGFydDtcbiAgLS1zYmItdG9hc3QtdmVydGljYWwtcG9zaXRpb246IGZsZXgtc3RhcnQ7XG59XG5cbjpob3N0KFtwb3NpdGlvbj0ndG9wLWNlbnRlciddKSB7XG4gIC0tc2JiLXRvYXN0LWhvcml6b250YWwtcG9zaXRpb246IGNlbnRlcjtcbiAgLS1zYmItdG9hc3QtdmVydGljYWwtcG9zaXRpb246IGZsZXgtc3RhcnQ7XG59XG5cbjpob3N0KFtwb3NpdGlvbj0ndG9wLXJpZ2h0J10pLFxuOmhvc3QoW3Bvc2l0aW9uPSd0b3AtZW5kJ10pIHtcbiAgLS1zYmItdG9hc3QtaG9yaXpvbnRhbC1wb3NpdGlvbjogZmxleC1lbmQ7XG4gIC0tc2JiLXRvYXN0LXZlcnRpY2FsLXBvc2l0aW9uOiBmbGV4LXN0YXJ0O1xufVxuXG46aG9zdCg6c3RhdGUoZGFyaykpIHtcbiAgLS1zYmItZm9jdXMtb3V0bGluZS1jb2xvcjogdmFyKC0tc2JiLWZvY3VzLW91dGxpbmUtY29sb3ItZGVmYXVsdCk7XG59XG5cbi5zYmItdG9hc3RfX292ZXJsYXktY29udGFpbmVyIHtcbiAgcG9zaXRpb246IHZhcigtLXNiYi10b2FzdC1jb250YWluZXItcG9zaXRpb24pO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgaW5zZXQ6IDA7XG4gIGRpc3BsYXk6IHZhcigtLXNiYi10b2FzdC1jb250YWluZXItZGlzcGxheSk7XG4gIGp1c3RpZnktY29udGVudDogdmFyKC0tc2JiLXRvYXN0LWhvcml6b250YWwtcG9zaXRpb24pO1xuICBhbGlnbi1pdGVtczogdmFyKC0tc2JiLXRvYXN0LXZlcnRpY2FsLXBvc2l0aW9uKTtcbn1cblxuLnNiYi10b2FzdCB7XG4gIHotaW5kZXg6IHZhcigtLXNiYi10b2FzdC16LWluZGV4LCB2YXIoLS1zYmItb3ZlcmxheS1kZWZhdWx0LXotaW5kZXgpKTtcbiAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gIG1hcmdpbjogdmFyKC0tc2JiLXRvYXN0LW1hcmdpbik7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXNiYi10b2FzdC1ib3JkZXItcmFkaXVzKTtcbiAgbWF4LXdpZHRoOiB2YXIoLS1zYmItdG9hc3QtbWF4LXdpZHRoKTtcbiAgZGlzcGxheTogZmxleDtcbiAgY29sb3I6IHZhcigtLXNiYi10b2FzdC10ZXh0LWNvbG9yKTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2JiLXRvYXN0LWJhY2tncm91bmQtY29sb3IpO1xuXG4gIDpob3N0KDpzdGF0ZShzdGF0ZS1vcGVuaW5nKSkgJiB7XG4gICAgYW5pbWF0aW9uOiB7XG4gICAgICBuYW1lOiBvcGVuO1xuICAgICAgZHVyYXRpb246IHZhcigtLXNiYi10b2FzdC1hbmltYXRpb24tZHVyYXRpb24pO1xuICAgICAgdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1zYmItdG9hc3QtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbik7XG4gICAgfVxuICB9XG5cbiAgOmhvc3QoOnN0YXRlKHN0YXRlLWNsb3NpbmcpKSAmIHtcbiAgICBhbmltYXRpb246IHtcbiAgICAgIG5hbWU6IGNsb3NlO1xuICAgICAgZHVyYXRpb246IHZhcigtLXNiYi10b2FzdC1hbmltYXRpb24tZHVyYXRpb24pO1xuICAgICAgdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1zYmItdG9hc3QtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbik7XG4gICAgfVxuICB9XG59XG5cbi5zYmItdG9hc3Qtd3JhcHBlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogdmFyKC0tc2JiLXRvYXN0LWdhcCk7XG4gIHBhZGRpbmctYmxvY2s6IHZhcigtLXNiYi10b2FzdC1wYWRkaW5nLWJsb2NrKTtcbiAgcGFkZGluZy1pbmxpbmU6IHZhcigtLXNiYi10b2FzdC1wYWRkaW5nLWlubGluZSk7XG59XG5cbnNsb3Q6bm90KFtuYW1lPSdpY29uJ10pLFxuLnNiYi10b2FzdF9fY2xvc2Uge1xuICAvLyBBcyB0aGUgc2xvdHRlZCBjb250ZW50IGlzIGRpc3BsYXllZCBvbiBhIHdoaXRlIGJhY2tncm91bmQsIHdlIG5lZWQgdG8gZm9yY2UgbGlnaHQgbW9kZSBmb3IgdGhlbS5cbiAgY29sb3Itc2NoZW1lOiBvbmx5IGxpZ2h0O1xufVxuXG4uc2JiLXRvYXN0X19jb250ZW50IHtcbiAgQGluY2x1ZGUgc2JiLnRpdGxlLTYoJGV4Y2x1ZGUtc3BhY2luZzogdHJ1ZSk7XG5cbiAgZmxleDogMSAxIDA7XG59XG5cbi5zYmItdG9hc3RfX2Nsb3NlIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLnNiYi10b2FzdF9fY2xvc2UtZGl2aWRlciB7XG4gIHBhZGRpbmctYmxvY2s6IHZhcigtLXNiYi10b2FzdC1wYWRkaW5nLWJsb2NrKTtcbn1cblxuLnNiYi10b2FzdF9fY2xvc2UtYnV0dG9uIHtcbiAgbWFyZ2luLWlubGluZTogdmFyKC0tc2JiLXNwYWNpbmctcmVzcG9uc2l2ZS14eHhzKTtcbn1cblxuQGtleWZyYW1lcyBvcGVuIHtcbiAgZnJvbSB7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdHJhbnNsYXRlOiAwIHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTJ4KTtcbiAgfVxuXG4gIHRvIHtcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgIG9wYWNpdHk6IDE7XG4gICAgdHJhbnNsYXRlOiAwO1xuICB9XG59XG5cbkBrZXlmcmFtZXMgY2xvc2Uge1xuICBmcm9tIHtcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgIG9wYWNpdHk6IDE7XG4gICAgdHJhbnNsYXRlOiAwO1xuICB9XG5cbiAgdG8ge1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHRyYW5zbGF0ZTogMCB2YXIoLS1zYmItc3BhY2luZy1maXhlZC0yeCk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIHR5cGUgQ1NTUmVzdWx0R3JvdXAsXG4gIGh0bWwsXG4gIG5vdGhpbmcsXG4gIHR5cGUgUHJvcGVydHlWYWx1ZXMsXG4gIHR5cGUgVGVtcGxhdGVSZXN1bHQsXG4gIHVuc2FmZUNTUyxcbn0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQge1xuICBTYmJUcmFuc3BhcmVudEJ1dHRvbkVsZW1lbnQsXG4gIHR5cGUgU2JiVHJhbnNwYXJlbnRCdXR0b25MaW5rRWxlbWVudCxcbn0gZnJvbSAnLi4vYnV0dG9uLnB1cmUudHMnO1xuaW1wb3J0IHtcbiAgYm94U2l6aW5nU3R5bGVzLFxuICBjb21wb3NlZFBhdGhIYXNBdHRyaWJ1dGUsXG4gIGZvcmNlVHlwZSxcbiAgaTE4bkNsb3NlQWxlcnQsXG4gIGlzWmVyb0FuaW1hdGlvbkR1cmF0aW9uLFxuICBTYmJEYXJrTW9kZUNvbnRyb2xsZXIsXG4gIHR5cGUgU2JiRWxlbWVudFR5cGUsXG4gIFNiYkxhbmd1YWdlQ29udHJvbGxlcixcbiAgU2JiT3BlbkNsb3NlQmFzZUVsZW1lbnQsXG4gIFNiYlJlYWRvbmx5TWl4aW4sXG59IGZyb20gJy4uL2NvcmUudHMnO1xuaW1wb3J0IHsgU2JiRGl2aWRlckVsZW1lbnQgfSBmcm9tICcuLi9kaXZpZGVyLnB1cmUudHMnO1xuaW1wb3J0IHsgU2JiSWNvbk5hbWVNaXhpbiB9IGZyb20gJy4uL2ljb24ucHVyZS50cyc7XG5pbXBvcnQgdHlwZSB7IFNiYkxpbmtCdXR0b25FbGVtZW50LCBTYmJMaW5rRWxlbWVudCwgU2JiTGlua1N0YXRpY0VsZW1lbnQgfSBmcm9tICcuLi9saW5rLnB1cmUudHMnO1xuXG5pbXBvcnQgc3R5bGUgZnJvbSAnLi90b2FzdC5zY3NzP2lubGluZSc7XG5cbnR5cGUgU2JiVG9hc3RQb3NpdGlvblZlcnRpY2FsID0gJ3RvcCcgfCAnYm90dG9tJztcbnR5cGUgU2JiVG9hc3RQb3NpdGlvbkhvcml6b250YWwgPSAnbGVmdCcgfCAnc3RhcnQnIHwgJ2NlbnRlcicgfCAncmlnaHQnIHwgJ2VuZCc7XG5leHBvcnQgdHlwZSBTYmJUb2FzdFBvc2l0aW9uID0gYCR7U2JiVG9hc3RQb3NpdGlvblZlcnRpY2FsfS0ke1NiYlRvYXN0UG9zaXRpb25Ib3Jpem9udGFsfWA7XG5cbi8vIEEgZ2xvYmFsIGNvbGxlY3Rpb24gb2YgZXhpc3RpbmcgdG9hc3RzXG5jb25zdCB0b2FzdFJlZnMgPSBuZXcgU2V0PFNiYlRvYXN0RWxlbWVudD4oKTtcblxuLyoqXG4gKiBJdCBkaXNwbGF5cyBhIHRvYXN0IG5vdGlmaWNhdGlvbi5cbiAqXG4gKiBAc2xvdCAtIFVzZSB0aGUgdW5uYW1lZCBzbG90IHRvIGFkZCBjb250ZW50IHRvIHRoZSBgc2JiLXRvYXN0YC5cbiAqIEBzbG90IGljb24gLSBBc3NpZ24gYSBjdXN0b20gaWNvbiB2aWEgc2xvdC5cbiAqIEBzbG90IGFjdGlvbiAtIFByb3ZpZGUgYSBjdXN0b20gYWN0aW9uIGZvciB0aGlzIHRvYXN0LlxuICogQGNzc3Byb3AgWy0tc2JiLXRvYXN0LXotaW5kZXg9dmFyKC0tc2JiLW92ZXJsYXktZGVmYXVsdC16LWluZGV4KV0gLSBUbyBzcGVjaWZ5IGEgY3VzdG9tIHN0YWNrIG9yZGVyLFxuICogdGhlIGB6LWluZGV4YCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZWZpbmluZyB0aGlzIENTUyB2YXJpYWJsZS4gVGhlIGRlZmF1bHQgYHotaW5kZXhgIG9mIHRoZVxuICogY29tcG9uZW50IGlzIHNldCB0byBgdmFyKC0tc2JiLW92ZXJsYXktZGVmYXVsdC16LWluZGV4KWAgd2l0aCBhIHZhbHVlIG9mIGAxMDAwYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNiYlRvYXN0RWxlbWVudCBleHRlbmRzIFNiYkljb25OYW1lTWl4aW4oU2JiUmVhZG9ubHlNaXhpbihTYmJPcGVuQ2xvc2VCYXNlRWxlbWVudCkpIHtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSBlbGVtZW50TmFtZTogc3RyaW5nID0gJ3NiYi10b2FzdCc7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgZWxlbWVudERlcGVuZGVuY2llczogU2JiRWxlbWVudFR5cGVbXSA9IFtcbiAgICBTYmJUcmFuc3BhcmVudEJ1dHRvbkVsZW1lbnQsXG4gICAgU2JiRGl2aWRlckVsZW1lbnQsXG4gIF07XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IFtib3hTaXppbmdTdHlsZXMsIHVuc2FmZUNTUyhzdHlsZSldO1xuXG4gIC8qKlxuICAgKiBUaGUgbGVuZ3RoIG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGF1dG9tYXRpY2FsbHkgZGlzbWlzc2luZyB0aGUgdG9hc3QuXG4gICAqIElmIDAgKGRlZmF1bHQpLCBpdCBzdGF5cyBvcGVuIGluZGVmaW5pdGVseS5cbiAgICogRnJvbSBhY2Nlc3NpYmlsaXR5IHBlcnNwZWN0aXZlLCBpdCBpcyByZWNvbW1lbmRlZCB0byBzZXQgYSB0aW1lb3V0IG9mIGF0IGxlYXN0IDIwIHNlY29uZHMuXG4gICAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciB0aW1lb3V0OiBudW1iZXIgPSAwO1xuXG4gIC8qKiBUaGUgcG9zaXRpb24gd2hlcmUgdG8gcGxhY2UgdGhlIHRvYXN0LiAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlIH0pIHB1YmxpYyBhY2Nlc3NvciBwb3NpdGlvbjogU2JiVG9hc3RQb3NpdGlvbiA9ICdib3R0b20tY2VudGVyJztcblxuICAvKipcbiAgICogVGhlIEFSSUEgcG9saXRlbmVzcyBsZXZlbC5cbiAgICogQ2hlY2sgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQWNjZXNzaWJpbGl0eS9BUklBL0FSSUFfTGl2ZV9SZWdpb25zI2xpdmVfcmVnaW9ucyBmb3IgZnVydGhlciBpbmZvXG4gICAqL1xuICBAcHJvcGVydHkoKSBwdWJsaWMgYWNjZXNzb3IgcG9saXRlbmVzczogJ3BvbGl0ZScgfCAnYXNzZXJ0aXZlJyB8ICdvZmYnID0gJ3BvbGl0ZSc7XG5cbiAgcHJpdmF0ZSBfY2xvc2VUaW1lb3V0PzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIHByaXZhdGUgX2xhbmd1YWdlID0gbmV3IFNiYkxhbmd1YWdlQ29udHJvbGxlcih0aGlzKTtcbiAgcHJpdmF0ZSBfZGFya01vZGVDb250cm9sbGVyID0gbmV3IFNiYkRhcmtNb2RlQ29udHJvbGxlcih0aGlzLCAoKSA9PiB7XG4gICAgdGhpcy5fc3luY1Nsb3R0ZWRFbGVtZW50cygpO1xuICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICB9KTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/LignY2xpY2snLCAoZSkgPT4gdGhpcy5fb25DbGljayhlKSk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgdGhpcy5wb3BvdmVyID0gJ21hbnVhbCc7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIC8vIEFkZCB0aGlzIHRvYXN0IHRvIHRoZSBnbG9iYWwgY29sbGVjdGlvblxuICAgIHRvYXN0UmVmcy5hZGQodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fY2xvc2VUaW1lb3V0KTtcblxuICAgIC8vIFJlbW92ZSB0aGlzIGluc3RhbmNlXG4gICAgdG9hc3RSZWZzLmRlbGV0ZSh0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygncG9saXRlbmVzcycpKSB7XG4gICAgICB0aGlzLmludGVybmFscy5hcmlhTGl2ZSA9IHRoaXMucG9saXRlbmVzcztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3BlbiB0aGUgdG9hc3QuXG4gICAqIElmIHRoZXJlIGFyZSBvdGhlciBvcGVuZWQgdG9hc3RzIGluIHRoZSBwYWdlLCBjbG9zZSB0aGVtIGZpcnN0LlxuICAgKi9cbiAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdvcGVuZWQnIHx8IHRoaXMuc3RhdGUgPT09ICdvcGVuaW5nJyB8fCAhdGhpcy5kaXNwYXRjaEJlZm9yZU9wZW5FdmVudCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY2xvc2VPdGhlclRvYXN0cygpO1xuICAgIHRoaXMuc2hvd1BvcG92ZXI/LigpO1xuICAgIHRoaXMuc3RhdGUgPSAnb3BlbmluZyc7XG5cbiAgICAvLyBJZiB0aGUgYW5pbWF0aW9uIGR1cmF0aW9uIGlzIHplcm8sIHRoZSBhbmltYXRpb25lbmQgZXZlbnQgaXMgbm90IGFsd2F5cyBmaXJlZCByZWxpYWJseS5cbiAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgZGlyZWN0bHkgc2V0IHRoZSBgb3BlbmVkYCBzdGF0ZS5cbiAgICBpZiAodGhpcy5faXNaZXJvQW5pbWF0aW9uRHVyYXRpb24oKSkge1xuICAgICAgdGhpcy5faGFuZGxlT3BlbmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgdG9hc3QuXG4gICAqL1xuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdjbG9zZWQnIHx8IHRoaXMuc3RhdGUgPT09ICdjbG9zaW5nJyB8fCAhdGhpcy5kaXNwYXRjaEJlZm9yZUNsb3NlRXZlbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNsZWFyVGltZW91dCh0aGlzLl9jbG9zZVRpbWVvdXQpO1xuICAgIHRoaXMuc3RhdGUgPSAnY2xvc2luZyc7XG5cbiAgICAvLyBJZiB0aGUgYW5pbWF0aW9uIGR1cmF0aW9uIGlzIHplcm8sIHRoZSBhbmltYXRpb25lbmQgZXZlbnQgaXMgbm90IGFsd2F5cyBmaXJlZCByZWxpYWJseS5cbiAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgZGlyZWN0bHkgc2V0IHRoZSBgY2xvc2VkYCBzdGF0ZS5cbiAgICBpZiAodGhpcy5faXNaZXJvQW5pbWF0aW9uRHVyYXRpb24oKSkge1xuICAgICAgdGhpcy5faGFuZGxlQ2xvc2luZygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUNsb3NpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSA9ICdjbG9zZWQnO1xuICAgIHRoaXMuaGlkZVBvcG92ZXI/LigpO1xuICAgIHRoaXMuZGlzcGF0Y2hDbG9zZUV2ZW50KCk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVPcGVuaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUgPSAnb3BlbmVkJztcbiAgICB0aGlzLmRpc3BhdGNoT3BlbkV2ZW50KCk7XG5cbiAgICAvLyBTdGFydCB0aGUgY291bnRkb3duIHRvIGNsb3NlIGl0XG4gICAgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL3NiYi1kZXNpZ24tc3lzdGVtcy9seW5lLWFuZ3VsYXIvaXNzdWVzLzE5MFxuICAgICAgLy8gSWYgem9uZS5qcyBpcyBsb2FkZWQsIHNldFRpbWVvdXQgaXMgd3JhcHBlZCBhbmQgdHJhY2tlZCB3aGljaCB3aWxsIG1hcmtcbiAgICAgIC8vIGFueXRoaW5nIGluIEFuZ3VsYXIgYXMgdW5zdGFibGUgYXMgbG9uZyBhcyBzZXRUaW1lb3V0IGlzIG5vdCBmaW5pc2hlZC5cbiAgICAgIC8vIFRoaXMgb25seSBuZWVkcyB0byBiZSBmaXhlZCBpbiBwbGFjZXMgd2hlcmUgd2UgYWN0dWFsbHkgd2FudCB0byB3YWl0IGFcbiAgICAgIC8vIHNwZWNpZmljIGFtb3VudCBvZiB0aW1lIHdpdGhvdXQgYW4gaW50ZXJhY3Rpb24gKGUuZy4gZm9yIHRoaXMgY2FzZSkuXG4gICAgICBjb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzIGFzIGFueTtcbiAgICAgIGNvbnN0IHNldFRpbWVvdXQ6IHR5cGVvZiBnbG9iYWxUaGlzLnNldFRpbWVvdXQgPVxuICAgICAgICBnbG9iYWxbZ2xvYmFsLlpvbmU/Ll9fc3ltYm9sX18/Lignc2V0VGltZW91dCcpIGFzIHN0cmluZ10gPz8gZ2xvYmFsLnNldFRpbWVvdXQ7XG5cbiAgICAgIHRoaXMuX2Nsb3NlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jbG9zZSgpLCB0aGlzLnRpbWVvdXQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENsb3NlIHRoZSB0b2FzdCBvbiBjbGljayBvZiBhbnkgZWxlbWVudCB0aGF0IGhhcyB0aGUgJ3NiYi10b2FzdC1jbG9zZScgYXR0cmlidXRlLlxuICBwcml2YXRlIF9vbkNsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGNsb3NlRWxlbWVudCA9IGNvbXBvc2VkUGF0aEhhc0F0dHJpYnV0ZShldmVudCwgJ3NiYi10b2FzdC1jbG9zZScsIHRoaXMpO1xuXG4gICAgaWYgKGNsb3NlRWxlbWVudCAmJiAhY2xvc2VFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2lzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1plcm9BbmltYXRpb25EdXJhdGlvbih0aGlzLCAnLS1zYmItdG9hc3QtYW5pbWF0aW9uLWR1cmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogU2xvdHRlZCB0ZXh0IG5vZGVzIGFyZSBub3QgcmVhZCBjb3JyZWN0bHkgYnkgc2NyZWVuIHJlYWRlcnMgb24gQ2hyb21lLlxuICAgKiBUbyBhZGRyZXNzIHRoZSBwcm9ibGVtLCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBhIHJvb3QgdGV4dCBub2RlLFxuICAgKiB3ZSB3cmFwIHRoZSB3aG9sZSBjb250ZW50IGluIGEgPHNwYW4+IHRhZ1xuICAgKi9cbiAgcHJpdmF0ZSBfb25Db250ZW50U2xvdENoYW5nZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzbG90Tm9kZXMgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpO1xuXG4gICAgaWYgKHNsb3ROb2Rlcy5zb21lKChlbCkgPT4gZWwubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSkge1xuICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgIHRoaXMucHJlcGVuZChzcGFuKTtcbiAgICAgIHNwYW4uYXBwZW5kKC4uLnNsb3ROb2Rlcyk7XG4gICAgfVxuICAgIHRoaXMuX3N5bmNTbG90dGVkRWxlbWVudHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3N5bmNTbG90dGVkRWxlbWVudHMoKTogdm9pZCB7XG4gICAgLy8gRm9yY2UgdGhlIHZpc3VhbCBzdGF0ZSBvbiBzbG90dGVkIGJ1dHRvbnNcbiAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGw8U2JiVHJhbnNwYXJlbnRCdXR0b25FbGVtZW50IHwgU2JiVHJhbnNwYXJlbnRCdXR0b25MaW5rRWxlbWVudD4oXG4gICAgICAnc2JiLXRyYW5zcGFyZW50LWJ1dHRvbiwgc2JiLXRyYW5zcGFyZW50LWJ1dHRvbi1saW5rJyxcbiAgICApLmZvckVhY2goKGJ0bikgPT4ge1xuICAgICAgYnRuLm5lZ2F0aXZlID0gdGhpcy5faXNMaWdodE1vZGUoKTtcbiAgICB9KTtcblxuICAgIC8vIEZvcmNlIG5lZ2F0aXZlIG9uIHNsb3R0ZWQgbGlua3NcbiAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGw8U2JiTGlua0VsZW1lbnQgfCBTYmJMaW5rQnV0dG9uRWxlbWVudCB8IFNiYkxpbmtTdGF0aWNFbGVtZW50PihcbiAgICAgICdzYmItbGluaywgc2JiLWxpbmstYnV0dG9uLCBzYmItbGluay1zdGF0aWMnLFxuICAgICkuZm9yRWFjaCgobGluaykgPT4ge1xuICAgICAgbGluay5uZWdhdGl2ZSA9IHRoaXMuX2lzTGlnaHRNb2RlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBJbiByYXJlIGNhc2VzIGl0IGNhbiBiZSB0aGF0IHRoZSBhbmltYXRpb25FbmQgZXZlbnQgaXMgdHJpZ2dlcmVkIHR3aWNlLlxuICAvLyBUbyBhdm9pZCBlbnRlcmluZyBhIGNvcnJ1cHQgc3RhdGUsIGV4aXQgd2hlbiBzdGF0ZSBpcyBub3QgZXhwZWN0ZWQuXG4gIHByaXZhdGUgX29uVG9hc3RBbmltYXRpb25FbmQoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgLy8gT24gdG9hc3Qgb3BlbmVkXG4gICAgaWYgKGV2ZW50LmFuaW1hdGlvbk5hbWUgPT09ICdvcGVuJyAmJiB0aGlzLnN0YXRlID09PSAnb3BlbmluZycpIHtcbiAgICAgIHRoaXMuX2hhbmRsZU9wZW5pbmcoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmFuaW1hdGlvbk5hbWUgPT09ICdjbG9zZScgJiYgdGhpcy5zdGF0ZSA9PT0gJ2Nsb3NpbmcnKSB7XG4gICAgICB0aGlzLl9oYW5kbGVDbG9zaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpbmNlIHdlIGRvIG5vdCBzdGFjayB0b2FzdHMsIHdlIGZvcmNlIHRoZSBjbG9zaW5nIG9uIG90aGVyIGV4aXN0aW5nIG9wZW5lZCBvbmVzXG4gICAqL1xuICBwcml2YXRlIF9jbG9zZU90aGVyVG9hc3RzKCk6IHZvaWQge1xuICAgIHRvYXN0UmVmcy5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICBpZiAodC5zdGF0ZSA9PT0gJ29wZW5lZCcgfHwgdC5zdGF0ZSA9PT0gJ29wZW5pbmcnKSB7XG4gICAgICAgIHQuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzTGlnaHRNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5fZGFya01vZGVDb250cm9sbGVyLm1hdGNoZXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZW5kZXIoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGRpdiBjbGFzcz1cInNiYi10b2FzdF9fb3ZlcmxheS1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi10b2FzdFwiIEBhbmltYXRpb25lbmQ9JHt0aGlzLl9vblRvYXN0QW5pbWF0aW9uRW5kfT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLXRvYXN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICR7dGhpcy5yZW5kZXJJY29uU2xvdCgpfVxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiYi10b2FzdF9fY29udGVudFwiPlxuICAgICAgICAgICAgICA8c2xvdCBAc2xvdGNoYW5nZT0ke3RoaXMuX29uQ29udGVudFNsb3RDaGFuZ2V9Pjwvc2xvdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cImFjdGlvblwiIEBzbG90Y2hhbmdlPSR7dGhpcy5fc3luY1Nsb3R0ZWRFbGVtZW50c30+PC9zbG90PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItdG9hc3RfX2Nsb3NlXCI+XG4gICAgICAgICAgICA8c2JiLWRpdmlkZXJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzYmItdG9hc3RfX2Nsb3NlLWRpdmlkZXJcIlxuICAgICAgICAgICAgICBvcmllbnRhdGlvbj1cInZlcnRpY2FsXCJcbiAgICAgICAgICAgICAgP25lZ2F0aXZlPSR7dGhpcy5faXNMaWdodE1vZGUoKX1cbiAgICAgICAgICAgID48L3NiYi1kaXZpZGVyPlxuICAgICAgICAgICAgJHshdGhpcy5yZWFkT25seVxuICAgICAgICAgICAgICA/IGh0bWxgPHNiYi10cmFuc3BhcmVudC1idXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2JiLXRvYXN0X19jbG9zZS1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgaWNvbi1uYW1lPVwiY3Jvc3Mtc21hbGxcIlxuICAgICAgICAgICAgICAgICAgP25lZ2F0aXZlPSR7dGhpcy5faXNMaWdodE1vZGUoKX1cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9JHtpMThuQ2xvc2VBbGVydFt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX1cbiAgICAgICAgICAgICAgICAgIHNiYi10b2FzdC1jbG9zZVxuICAgICAgICAgICAgICAgID48L3NiYi10cmFuc3BhcmVudC1idXR0b24+YFxuICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXRvYXN0JzogU2JiVG9hc3RFbGVtZW50O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FDcUNBLElBQU0sNEJBQVksSUFBSSxLQUFzQjs7Ozs7Ozs7Ozs7SUFZL0IseUJBQWU7bUJBQVMsaUJBQWlCLGlCQUFpQix3QkFBd0IsQ0FBQzs7Ozs7Ozs7OztjQUFuRix3QkFBd0IsWUFBMkQ7OzswQkFhN0YsV0FBVyxFQUNYLFNBQVMsRUFBRSxNQUFNLFFBQVEsQ0FBQyxDQUFBOzJCQUkxQixTQUFTLEVBQUUsU0FBUyxNQUFNLENBQUMsQ0FBQTs2QkFNM0Is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