@sbb-esta/lyne-elements-dev 5.0.0-next-dev.1776960216 → 5.0.0-next-dev.1777019159
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/alert/alert/alert.component.js +1 -1
- package/alert/alert-group/alert-group.component.js +1 -1
- package/{alert-group.component-CAjj3FtE.js → alert-group.component-BCYOVicl.js} +5 -7
- package/alert.component-BQsF0R1M.js +161 -0
- package/alert.js +2 -2
- package/alert.pure.js +2 -2
- package/core/styles/core.scss +11 -1
- package/core.css +28 -8
- package/custom-elements.json +618 -618
- package/development/alert/alert/alert.component.d.ts +1 -0
- package/development/alert/alert/alert.component.d.ts.map +1 -1
- package/development/alert/alert/alert.component.js +1 -1
- package/development/alert/alert-group/alert-group.component.d.ts.map +1 -1
- package/development/alert/alert-group/alert-group.component.js +1 -1
- package/development/alert-group.component-D4KxKTd2.js +186 -0
- package/development/alert.component-Pv-Ol6XU.js +213 -0
- package/development/alert.js +2 -2
- package/development/alert.pure.js +2 -2
- package/development/dialog/dialog/dialog.component.js +1 -1
- package/development/dialog.component-BTXyWi17.js +233 -0
- package/development/dialog.js +1 -1
- package/development/dialog.pure.js +1 -1
- package/dialog/dialog/dialog.component.js +1 -1
- package/{dialog.component-DTbAHlVd.js → dialog.component-ChB9gCyY.js} +1 -1
- package/dialog.js +1 -1
- package/dialog.pure.js +1 -1
- package/off-brand-theme.css +28 -8
- package/package.json +2 -2
- package/safety-theme.css +28 -8
- package/standard-theme.css +28 -8
- package/alert.component-C42LwoGa.js +0 -163
- package/development/alert-group.component-DeI6kuwn.js +0 -188
- package/development/alert.component-Cn36k_Hf.js +0 -214
- package/development/dialog.component-B4cZfRCl.js +0 -233
|
@@ -1,233 +0,0 @@
|
|
|
1
|
-
import { __esDecorate, __runInitializers } from "tslib";
|
|
2
|
-
import { unsafeCSS } from "lit";
|
|
3
|
-
import { property } from "lit/decorators.js";
|
|
4
|
-
import { SbbScreenReaderOnlyElement, boxSizingStyles, isZeroAnimationDuration } from "./core.js";
|
|
5
|
-
import { html as html$1 } from "lit/static-html.js";
|
|
6
|
-
import { ResizeController } from "@lit-labs/observers/resize-controller.js";
|
|
7
|
-
import { ref } from "lit/directives/ref.js";
|
|
8
|
-
import { SbbOverlayBaseElement, SbbOverlayCloseEvent, overlayRefs } from "./overlay.pure.js";
|
|
9
|
-
import { SbbOverlayCloseEvent as SbbDialogCloseEvent, assignOverlayResult as assignDialogResult } from "./overlay/overlay-base-element.js";
|
|
10
|
-
//#region src/elements/dialog/dialog/dialog.scss?inline
|
|
11
|
-
var dialog_default = ":host {\n --sbb-dialog-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-6x)\n );\n --sbb-dialog-padding-block: var(--sbb-spacing-responsive-xs);\n --sbb-dialog-shadow-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-4x)\n );\n display: none;\n position: fixed;\n inset: var(--sbb-dialog-inset);\n z-index: var(--sbb-dialog-z-index, var(--sbb-overlay-default-z-index));\n}\n@media (min-width: calc(64rem)) {\n :host {\n --sbb-dialog-max-width: min(\n calc(100vw - var(--sbb-spacing-fixed-30x) * 2),\n var(--sbb-dialog-max-width-default)\n );\n }\n}\n\n:host(:is(:state(top-shadow),[state--top-shadow])) {\n --sbb-dialog-block-start-box-shadow: var(--_sbb-dialog-block-shadow);\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 display: block;\n}\n\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]))) {\n --sbb-dialog-pointer-events: all;\n --sbb-dialog-backdrop-color: var(--sbb-background-color-3);\n}\n@media (min-width: calc(64rem)) {\n :host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]))) {\n --sbb-dialog-backdrop-visibility: visible;\n --sbb-dialog-backdrop-pointer-events: all;\n }\n}\n\n:host([backdrop=translucent]:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]))) {\n --sbb-dialog-backdrop-color: color-mix(in srgb, var(--sbb-color-black) 50%, transparent);\n}\n\n:host([backdrop=opaque]:not([negative]):is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]))) {\n --sbb-dialog-backdrop-color: var(--sbb-background-color-3);\n}\n\n:host(:not([negative])) {\n --_sbb-dialog-color: var(--sbb-dialog-color);\n --_sbb-dialog-block-shadow: var(--sbb-dialog-block-shadow);\n --sbb-dialog-actions-border-color: var(--sbb-background-color-4);\n --sbb-dialog-background-color: var(--sbb-background-color-1);\n}\n\n:host([negative]) {\n --_sbb-dialog-color: var(--sbb-dialog-color-negative);\n --_sbb-dialog-block-shadow: var(--sbb-dialog-block-shadow-negative);\n --sbb-dialog-background-color: var(--sbb-background-color-1-negative);\n --sbb-dialog-actions-border-color: var(--sbb-background-color-4-negative);\n --sbb-dialog-backdrop-color: var(--sbb-background-color-3-negative);\n --sbb-focus-outline-color: var(--sbb-focus-outline-color-dark);\n}\n\n:host(:is(:state(bottom-shadow),[state--bottom-shadow])) {\n --sbb-dialog-block-end-box-shadow: var(--_sbb-dialog-block-shadow);\n --sbb-dialog-actions-border-color: transparent;\n}\n\n:host(:not(:is(:state(state-closed),[state--state-closed]))) {\n --sbb-dialog-inset: 0;\n}\n\n.sbb-dialog__container {\n pointer-events: var(--sbb-dialog-pointer-events);\n display: flex;\n align-items: center;\n position: fixed;\n inset: var(--sbb-dialog-inset);\n}\n.sbb-dialog__container::before {\n content: \"\";\n visibility: var(--sbb-dialog-backdrop-visibility);\n pointer-events: var(--sbb-dialog-backdrop-pointer-events);\n position: fixed;\n inset: var(--sbb-dialog-inset);\n background-color: var(--sbb-dialog-backdrop-color);\n transition-duration: var(--sbb-dialog-animation-duration);\n transition-timing-function: var(--sbb-dialog-animation-easing);\n transition-property: background-color, visibility;\n}\n\n.sbb-dialog {\n display: none;\n position: absolute;\n inset-inline: 0;\n margin: auto;\n padding: 0;\n border: none;\n width: var(--sbb-dialog-width);\n height: var(--sbb-dialog-height);\n max-width: var(--sbb-dialog-max-width);\n max-height: var(--sbb-dialog-max-height);\n color: var(--_sbb-dialog-color);\n background-color: var(--sbb-dialog-background-color);\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]))) .sbb-dialog {\n display: block;\n animation-name: open;\n animation-duration: var(--sbb-dialog-animation-duration);\n animation-timing-function: ease;\n}\n:host(:is(:state(state-closing),[state--state-closing])) .sbb-dialog {\n pointer-events: none;\n animation-name: close;\n}\n@media (forced-colors: active) {\n .sbb-dialog {\n outline: var(--sbb-border-width-1x) solid CanvasText;\n }\n}\n@media (min-width: calc(64rem)) {\n .sbb-dialog {\n border-radius: var(--sbb-dialog-border-radius);\n overflow: hidden;\n height: auto;\n }\n}\n\n:host(:is(:state(has-intermediate-element),[state--has-intermediate-element])) ::slotted(:first-child),\n.sbb-dialog__wrapper {\n width: var(--sbb-dialog-width);\n height: var(--sbb-dialog-height);\n max-width: var(--sbb-dialog-max-width);\n max-height: var(--sbb-dialog-max-height);\n}\n\n:host(:is(:state(has-intermediate-element),[state--has-intermediate-element])) ::slotted(:first-child),\n:host(:not(:is(:state(has-intermediate-element),[state--has-intermediate-element]))) .sbb-dialog__wrapper {\n display: grid;\n grid-template: \"title close-button\" auto \"content content\" 1fr \"actions actions\" auto/1fr auto;\n gap: 0;\n}\n\n@keyframes open {\n from {\n opacity: 0;\n translate: 0 var(--sbb-spacing-fixed-4x);\n }\n to {\n opacity: 1;\n translate: 0;\n }\n}\n@keyframes close {\n from {\n opacity: 1;\n translate: 0;\n }\n to {\n opacity: 0;\n translate: 0 var(--sbb-spacing-fixed-4x);\n }\n}";
|
|
12
|
-
//#endregion
|
|
13
|
-
//#region src/elements/dialog/dialog/dialog.component.ts
|
|
14
|
-
/**
|
|
15
|
-
* It displays an interactive overlay element.
|
|
16
|
-
*
|
|
17
|
-
* @slot - Use the unnamed slot to provide a `sbb-dialog-title`, `sbb-dialog-content` and an optional `sbb-dialog-actions`.
|
|
18
|
-
* @cssprop [--sbb-dialog-z-index=var(--sbb-overlay-default-z-index)] - To specify a custom stack order,
|
|
19
|
-
* the `z-index` can be overridden by defining this CSS variable. The default `z-index` of the
|
|
20
|
-
* component is set to `var(--sbb-overlay-default-z-index)` with a value of `1000`.
|
|
21
|
-
*/
|
|
22
|
-
var SbbDialogElement = (() => {
|
|
23
|
-
let _classSuper = SbbOverlayBaseElement;
|
|
24
|
-
let _backdropAction_decorators;
|
|
25
|
-
let _backdropAction_initializers = [];
|
|
26
|
-
let _backdropAction_extraInitializers = [];
|
|
27
|
-
let _backdrop_decorators;
|
|
28
|
-
let _backdrop_initializers = [];
|
|
29
|
-
let _backdrop_extraInitializers = [];
|
|
30
|
-
return class SbbDialogElement extends _classSuper {
|
|
31
|
-
static {
|
|
32
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
33
|
-
_backdropAction_decorators = [property({ attribute: "backdrop-action" })];
|
|
34
|
-
_backdrop_decorators = [property({
|
|
35
|
-
attribute: "backdrop",
|
|
36
|
-
reflect: true
|
|
37
|
-
})];
|
|
38
|
-
__esDecorate(this, null, _backdropAction_decorators, {
|
|
39
|
-
kind: "accessor",
|
|
40
|
-
name: "backdropAction",
|
|
41
|
-
static: false,
|
|
42
|
-
private: false,
|
|
43
|
-
access: {
|
|
44
|
-
has: (obj) => "backdropAction" in obj,
|
|
45
|
-
get: (obj) => obj.backdropAction,
|
|
46
|
-
set: (obj, value) => {
|
|
47
|
-
obj.backdropAction = value;
|
|
48
|
-
}
|
|
49
|
-
},
|
|
50
|
-
metadata: _metadata
|
|
51
|
-
}, _backdropAction_initializers, _backdropAction_extraInitializers);
|
|
52
|
-
__esDecorate(this, null, _backdrop_decorators, {
|
|
53
|
-
kind: "accessor",
|
|
54
|
-
name: "backdrop",
|
|
55
|
-
static: false,
|
|
56
|
-
private: false,
|
|
57
|
-
access: {
|
|
58
|
-
has: (obj) => "backdrop" in obj,
|
|
59
|
-
get: (obj) => obj.backdrop,
|
|
60
|
-
set: (obj, value) => {
|
|
61
|
-
obj.backdrop = value;
|
|
62
|
-
}
|
|
63
|
-
},
|
|
64
|
-
metadata: _metadata
|
|
65
|
-
}, _backdrop_initializers, _backdrop_extraInitializers);
|
|
66
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, {
|
|
67
|
-
enumerable: true,
|
|
68
|
-
configurable: true,
|
|
69
|
-
writable: true,
|
|
70
|
-
value: _metadata
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
static {
|
|
74
|
-
this.elementName = "sbb-dialog";
|
|
75
|
-
}
|
|
76
|
-
static {
|
|
77
|
-
this.elementDependencies = [SbbScreenReaderOnlyElement];
|
|
78
|
-
}
|
|
79
|
-
static {
|
|
80
|
-
this.styles = [boxSizingStyles, unsafeCSS(dialog_default)];
|
|
81
|
-
}
|
|
82
|
-
#backdropAction_accessor_storage;
|
|
83
|
-
/** Backdrop click action. */
|
|
84
|
-
get backdropAction() {
|
|
85
|
-
return this.#backdropAction_accessor_storage;
|
|
86
|
-
}
|
|
87
|
-
set backdropAction(value) {
|
|
88
|
-
this.#backdropAction_accessor_storage = value;
|
|
89
|
-
}
|
|
90
|
-
#backdrop_accessor_storage;
|
|
91
|
-
/** Backdrop density. */
|
|
92
|
-
get backdrop() {
|
|
93
|
-
return this.#backdrop_accessor_storage;
|
|
94
|
-
}
|
|
95
|
-
set backdrop(value) {
|
|
96
|
-
this.#backdrop_accessor_storage = value;
|
|
97
|
-
}
|
|
98
|
-
constructor() {
|
|
99
|
-
super();
|
|
100
|
-
this.#backdropAction_accessor_storage = __runInitializers(this, _backdropAction_initializers, "close");
|
|
101
|
-
this.#backdrop_accessor_storage = (__runInitializers(this, _backdropAction_extraInitializers), __runInitializers(this, _backdrop_initializers, "opaque"));
|
|
102
|
-
this._dialogContentResizeObserver = (__runInitializers(this, _backdrop_extraInitializers), new ResizeController(this, {
|
|
103
|
-
target: null,
|
|
104
|
-
skipInitial: true,
|
|
105
|
-
callback: () => setTimeout(() => this._updateOverflowState())
|
|
106
|
-
}));
|
|
107
|
-
this._isPointerDownEventOnDialog = false;
|
|
108
|
-
this.closeAttribute = "sbb-dialog-close";
|
|
109
|
-
this.closeTag = "sbb-dialog-close-button";
|
|
110
|
-
/** Check if the pointerdown event target is triggered on the dialog. */
|
|
111
|
-
this._pointerDownListener = (event) => {
|
|
112
|
-
if (this.backdropAction !== "close") return;
|
|
113
|
-
this._isPointerDownEventOnDialog = !!this._dialogElement && event.composedPath().includes(this._dialogElement);
|
|
114
|
-
};
|
|
115
|
-
/** Close dialog on backdrop click. */
|
|
116
|
-
this._closeOnBackdropClick = (event) => {
|
|
117
|
-
if (this.backdropAction === "close" && !this._isPointerDownEventOnDialog && this._dialogElement && !event.composedPath().includes(this._dialogElement)) this.close();
|
|
118
|
-
};
|
|
119
|
-
this.addEventListener?.("pointerdown", this._pointerDownListener);
|
|
120
|
-
this.addEventListener?.("pointerup", this._closeOnBackdropClick);
|
|
121
|
-
this.addEventListener("scroll", () => this._updateOverflowState(), {
|
|
122
|
-
passive: true,
|
|
123
|
-
capture: true
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
/** Announce the accessibility label or dialog title for screen readers. */
|
|
127
|
-
announceTitle() {
|
|
128
|
-
this.setAriaLiveRefContent(this.accessibilityLabel || this.querySelector("sbb-dialog-title")?.textContent.trim());
|
|
129
|
-
}
|
|
130
|
-
isZeroAnimationDuration() {
|
|
131
|
-
return isZeroAnimationDuration(this, "--sbb-dialog-animation-duration");
|
|
132
|
-
}
|
|
133
|
-
handleClosing() {
|
|
134
|
-
const contentElement = this._contentElement();
|
|
135
|
-
contentElement?.scrollTo(0, 0);
|
|
136
|
-
this.state = "closed";
|
|
137
|
-
this.hidePopover?.();
|
|
138
|
-
this.inertController.deactivate();
|
|
139
|
-
if (!this.skipFocusRestoration) this.lastFocusedElement?.focus();
|
|
140
|
-
this.openOverlayController?.abort();
|
|
141
|
-
this.focusTrapController.enabled = false;
|
|
142
|
-
if (contentElement) this._dialogContentResizeObserver.hostDisconnected();
|
|
143
|
-
this.removeInstanceFromGlobalCollection();
|
|
144
|
-
if (!overlayRefs.length) this.scrollHandler.enableScroll();
|
|
145
|
-
this.escapableOverlayController.disconnect();
|
|
146
|
-
this.dispatchCloseEvent({
|
|
147
|
-
returnValue: this.returnValue,
|
|
148
|
-
closeTarget: this.overlayCloseElement
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
handleOpening() {
|
|
152
|
-
this.state = "opened";
|
|
153
|
-
this.inertController.activate();
|
|
154
|
-
this.focusTrapController.focusInitialElement();
|
|
155
|
-
this.focusTrapController.enabled = true;
|
|
156
|
-
setTimeout(() => this.announceTitle());
|
|
157
|
-
const contentElement = this._contentElement();
|
|
158
|
-
if (contentElement) this._dialogContentResizeObserver.observe(contentElement);
|
|
159
|
-
this.dispatchOpenEvent();
|
|
160
|
-
}
|
|
161
|
-
firstUpdated(changedProperties) {
|
|
162
|
-
super.firstUpdated(changedProperties);
|
|
163
|
-
if (this.isOpen) this.announceTitle();
|
|
164
|
-
this._syncTitleNegative();
|
|
165
|
-
}
|
|
166
|
-
willUpdate(changedProperties) {
|
|
167
|
-
super.willUpdate(changedProperties);
|
|
168
|
-
if (changedProperties.has("negative")) this._syncTitleNegative();
|
|
169
|
-
}
|
|
170
|
-
_handleSlotChange() {
|
|
171
|
-
this._syncTitleNegative();
|
|
172
|
-
this._detectIntermediateElement();
|
|
173
|
-
}
|
|
174
|
-
_syncTitleNegative() {
|
|
175
|
-
const dialogTitle = this.querySelector?.("sbb-dialog-title");
|
|
176
|
-
const closeButton = this.querySelector?.("sbb-dialog-close-button");
|
|
177
|
-
if (dialogTitle) dialogTitle.negative = this.negative;
|
|
178
|
-
if (closeButton) closeButton.negative = this.negative;
|
|
179
|
-
}
|
|
180
|
-
_detectIntermediateElement() {
|
|
181
|
-
const hasNoExpectedDirectChildren = this.querySelector(":scope > :is(sbb-dialog-title, sbb-dialog-close-button, sbb-dialog-content, sbb-dialog-actions)") === null;
|
|
182
|
-
this.toggleState("has-intermediate-element", hasNoExpectedDirectChildren);
|
|
183
|
-
}
|
|
184
|
-
_updateOverflowState() {
|
|
185
|
-
const contentElement = this._contentElement();
|
|
186
|
-
this.toggleState("top-shadow", (contentElement?.scrollTop ?? 0) > 0);
|
|
187
|
-
this.toggleState("bottom-shadow", (contentElement?.scrollTop ?? 0) + (contentElement?.offsetHeight ?? 0) < (contentElement?.scrollHeight ?? 0));
|
|
188
|
-
}
|
|
189
|
-
_contentElement() {
|
|
190
|
-
return this.querySelector("sbb-dialog-content");
|
|
191
|
-
}
|
|
192
|
-
dispatchBeforeCloseEvent(_detail) {
|
|
193
|
-
/** @type {SbbDialogCloseEvent} Emits whenever the component begins the closing transition. Can be canceled. */
|
|
194
|
-
return this.dispatchEvent(new SbbOverlayCloseEvent("beforeclose", {
|
|
195
|
-
cancelable: true,
|
|
196
|
-
closeAttribute: this.closeAttribute,
|
|
197
|
-
closeTarget: this.overlayCloseElement,
|
|
198
|
-
result: this.returnValue
|
|
199
|
-
}));
|
|
200
|
-
}
|
|
201
|
-
dispatchCloseEvent(_detail) {
|
|
202
|
-
/** @type {SbbDialogCloseEvent} Emits whenever the component is closed. */
|
|
203
|
-
return this.dispatchEvent(new SbbOverlayCloseEvent("close", {
|
|
204
|
-
closeAttribute: this.closeAttribute,
|
|
205
|
-
closeTarget: this.overlayCloseElement,
|
|
206
|
-
result: this.returnValue
|
|
207
|
-
}));
|
|
208
|
-
}
|
|
209
|
-
render() {
|
|
210
|
-
return html$1`
|
|
211
|
-
<div class="sbb-dialog__container">
|
|
212
|
-
<div
|
|
213
|
-
@animationend=${this.onOverlayAnimationEnd}
|
|
214
|
-
class="sbb-dialog"
|
|
215
|
-
${ref((el) => this._dialogElement = el)}
|
|
216
|
-
>
|
|
217
|
-
<div
|
|
218
|
-
@click=${(event) => this.closeOnSbbOverlayCloseClick(event)}
|
|
219
|
-
class="sbb-dialog__wrapper"
|
|
220
|
-
>
|
|
221
|
-
<slot @slotchange=${() => this._handleSlotChange()}></slot>
|
|
222
|
-
</div>
|
|
223
|
-
</div>
|
|
224
|
-
</div>
|
|
225
|
-
<sbb-screen-reader-only aria-live="polite"></sbb-screen-reader-only>
|
|
226
|
-
`;
|
|
227
|
-
}
|
|
228
|
-
};
|
|
229
|
-
})();
|
|
230
|
-
//#endregion
|
|
231
|
-
export { SbbDialogElement as n, assignDialogResult as r, SbbDialogCloseEvent as t };
|
|
232
|
-
|
|
233
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLmNvbXBvbmVudC1CNGNaZlJDbC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvZGlhbG9nL2RpYWxvZy9kaWFsb2cuc2Nzcz9pbmxpbmUiLCIuLi8uLi8uLi9zcmMvZWxlbWVudHMvZGlhbG9nL2RpYWxvZy9kaWFsb2cuY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIkB1c2UgJy4uLy4uL2NvcmUvc3R5bGVzJyBhcyBzYmI7XG5cbjpob3N0IHtcbiAgLS1zYmItZGlhbG9nLWFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKFxuICAgIC0tc2JiLWRpc2FibGUtYW5pbWF0aW9uLWR1cmF0aW9uLFxuICAgIHZhcigtLXNiYi1hbmltYXRpb24tZHVyYXRpb24tNngpXG4gICk7XG4gIC0tc2JiLWRpYWxvZy1wYWRkaW5nLWJsb2NrOiB2YXIoLS1zYmItc3BhY2luZy1yZXNwb25zaXZlLXhzKTtcbiAgLS1zYmItZGlhbG9nLXNoYWRvdy1hbmltYXRpb24tZHVyYXRpb246IHZhcihcbiAgICAtLXNiYi1kaXNhYmxlLWFuaW1hdGlvbi1kdXJhdGlvbixcbiAgICB2YXIoLS1zYmItYW5pbWF0aW9uLWR1cmF0aW9uLTR4KVxuICApO1xuXG4gIGRpc3BsYXk6IG5vbmU7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgaW5zZXQ6IHZhcigtLXNiYi1kaWFsb2ctaW5zZXQpO1xuICB6LWluZGV4OiB2YXIoLS1zYmItZGlhbG9nLXotaW5kZXgsIHZhcigtLXNiYi1vdmVybGF5LWRlZmF1bHQtei1pbmRleCkpO1xuXG4gIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogbGFyZ2UpIHtcbiAgICAtLXNiYi1kaWFsb2ctbWF4LXdpZHRoOiBtaW4oXG4gICAgICBjYWxjKDEwMHZ3IC0gdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtMzB4KSAqIDIpLFxuICAgICAgdmFyKC0tc2JiLWRpYWxvZy1tYXgtd2lkdGgtZGVmYXVsdClcbiAgICApO1xuICB9XG59XG5cbjpob3N0KDpzdGF0ZSh0b3Atc2hhZG93KSkge1xuICAtLXNiYi1kaWFsb2ctYmxvY2stc3RhcnQtYm94LXNoYWRvdzogdmFyKC0tX3NiYi1kaWFsb2ctYmxvY2stc2hhZG93KTtcbn1cblxuOmhvc3QoOmlzKDpzdGF0ZShzdGF0ZS1vcGVuaW5nKSwgOnN0YXRlKHN0YXRlLW9wZW5lZCksIDpzdGF0ZShzdGF0ZS1jbG9zaW5nKSkpIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbjpob3N0KDppcyg6c3RhdGUoc3RhdGUtb3BlbmluZyksIDpzdGF0ZShzdGF0ZS1vcGVuZWQpKSkge1xuICAtLXNiYi1kaWFsb2ctcG9pbnRlci1ldmVudHM6IGFsbDtcbiAgLS1zYmItZGlhbG9nLWJhY2tkcm9wLWNvbG9yOiB2YXIoLS1zYmItYmFja2dyb3VuZC1jb2xvci0zKTtcblxuICBAaW5jbHVkZSBzYmIubXEoJGZyb206IGxhcmdlKSB7XG4gICAgLS1zYmItZGlhbG9nLWJhY2tkcm9wLXZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgLS1zYmItZGlhbG9nLWJhY2tkcm9wLXBvaW50ZXItZXZlbnRzOiBhbGw7XG4gIH1cbn1cblxuOmhvc3QoW2JhY2tkcm9wPSd0cmFuc2x1Y2VudCddOmlzKDpzdGF0ZShzdGF0ZS1vcGVuaW5nKSwgOnN0YXRlKHN0YXRlLW9wZW5lZCkpKSB7XG4gIC0tc2JiLWRpYWxvZy1iYWNrZHJvcC1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLXNiYi1jb2xvci1ibGFjaykgNTAlLCB0cmFuc3BhcmVudCk7XG59XG5cbjpob3N0KFtiYWNrZHJvcD0nb3BhcXVlJ106bm90KFtuZWdhdGl2ZV0pOmlzKDpzdGF0ZShzdGF0ZS1vcGVuaW5nKSwgOnN0YXRlKHN0YXRlLW9wZW5lZCkpKSB7XG4gIC0tc2JiLWRpYWxvZy1iYWNrZHJvcC1jb2xvcjogdmFyKC0tc2JiLWJhY2tncm91bmQtY29sb3ItMyk7XG59XG5cbjpob3N0KDpub3QoW25lZ2F0aXZlXSkpIHtcbiAgLS1fc2JiLWRpYWxvZy1jb2xvcjogdmFyKC0tc2JiLWRpYWxvZy1jb2xvcik7XG4gIC0tX3NiYi1kaWFsb2ctYmxvY2stc2hhZG93OiB2YXIoLS1zYmItZGlhbG9nLWJsb2NrLXNoYWRvdyk7XG4gIC0tc2JiLWRpYWxvZy1hY3Rpb25zLWJvcmRlci1jb2xvcjogdmFyKC0tc2JiLWJhY2tncm91bmQtY29sb3ItNCk7XG4gIC0tc2JiLWRpYWxvZy1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zYmItYmFja2dyb3VuZC1jb2xvci0xKTtcbn1cblxuOmhvc3QoW25lZ2F0aXZlXSkge1xuICAtLV9zYmItZGlhbG9nLWNvbG9yOiB2YXIoLS1zYmItZGlhbG9nLWNvbG9yLW5lZ2F0aXZlKTtcbiAgLS1fc2JiLWRpYWxvZy1ibG9jay1zaGFkb3c6IHZhcigtLXNiYi1kaWFsb2ctYmxvY2stc2hhZG93LW5lZ2F0aXZlKTtcbiAgLS1zYmItZGlhbG9nLWJhY2tncm91bmQtY29sb3I6IHZhcigtLXNiYi1iYWNrZ3JvdW5kLWNvbG9yLTEtbmVnYXRpdmUpO1xuICAtLXNiYi1kaWFsb2ctYWN0aW9ucy1ib3JkZXItY29sb3I6IHZhcigtLXNiYi1iYWNrZ3JvdW5kLWNvbG9yLTQtbmVnYXRpdmUpO1xuICAtLXNiYi1kaWFsb2ctYmFja2Ryb3AtY29sb3I6IHZhcigtLXNiYi1iYWNrZ3JvdW5kLWNvbG9yLTMtbmVnYXRpdmUpO1xuICAtLXNiYi1mb2N1cy1vdXRsaW5lLWNvbG9yOiB2YXIoLS1zYmItZm9jdXMtb3V0bGluZS1jb2xvci1kYXJrKTtcbn1cblxuOmhvc3QoOnN0YXRlKGJvdHRvbS1zaGFkb3cpKSB7XG4gIC0tc2JiLWRpYWxvZy1ibG9jay1lbmQtYm94LXNoYWRvdzogdmFyKC0tX3NiYi1kaWFsb2ctYmxvY2stc2hhZG93KTtcbiAgLS1zYmItZGlhbG9nLWFjdGlvbnMtYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuOmhvc3QoOm5vdCg6c3RhdGUoc3RhdGUtY2xvc2VkKSkpIHtcbiAgLS1zYmItZGlhbG9nLWluc2V0OiAwO1xufVxuXG4uc2JiLWRpYWxvZ19fY29udGFpbmVyIHtcbiAgcG9pbnRlci1ldmVudHM6IHZhcigtLXNiYi1kaWFsb2ctcG9pbnRlci1ldmVudHMpO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIGluc2V0OiB2YXIoLS1zYmItZGlhbG9nLWluc2V0KTtcblxuICAvLyBEaWFsb2cgYmFja2Ryb3AgKG5vdCB2aXNpYmxlIG9uIG1vYmlsZSlcbiAgJjo6YmVmb3JlIHtcbiAgICBjb250ZW50OiAnJztcbiAgICB2aXNpYmlsaXR5OiB2YXIoLS1zYmItZGlhbG9nLWJhY2tkcm9wLXZpc2liaWxpdHkpO1xuICAgIHBvaW50ZXItZXZlbnRzOiB2YXIoLS1zYmItZGlhbG9nLWJhY2tkcm9wLXBvaW50ZXItZXZlbnRzKTtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgaW5zZXQ6IHZhcigtLXNiYi1kaWFsb2ctaW5zZXQpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNiYi1kaWFsb2ctYmFja2Ryb3AtY29sb3IpO1xuICAgIHRyYW5zaXRpb246IHtcbiAgICAgIGR1cmF0aW9uOiB2YXIoLS1zYmItZGlhbG9nLWFuaW1hdGlvbi1kdXJhdGlvbik7XG4gICAgICB0aW1pbmctZnVuY3Rpb246IHZhcigtLXNiYi1kaWFsb2ctYW5pbWF0aW9uLWVhc2luZyk7XG4gICAgICBwcm9wZXJ0eTogYmFja2dyb3VuZC1jb2xvciwgdmlzaWJpbGl0eTtcbiAgICB9XG4gIH1cbn1cblxuLnNiYi1kaWFsb2cge1xuICBkaXNwbGF5OiBub25lO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGluc2V0LWlubGluZTogMDtcbiAgbWFyZ2luOiBhdXRvO1xuICBwYWRkaW5nOiAwO1xuICBib3JkZXI6IG5vbmU7XG4gIHdpZHRoOiB2YXIoLS1zYmItZGlhbG9nLXdpZHRoKTtcbiAgaGVpZ2h0OiB2YXIoLS1zYmItZGlhbG9nLWhlaWdodCk7XG4gIG1heC13aWR0aDogdmFyKC0tc2JiLWRpYWxvZy1tYXgtd2lkdGgpO1xuICBtYXgtaGVpZ2h0OiB2YXIoLS1zYmItZGlhbG9nLW1heC1oZWlnaHQpO1xuICBjb2xvcjogdmFyKC0tX3NiYi1kaWFsb2ctY29sb3IpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zYmItZGlhbG9nLWJhY2tncm91bmQtY29sb3IpO1xuXG4gIDpob3N0KDppcyg6c3RhdGUoc3RhdGUtb3BlbmluZyksIDpzdGF0ZShzdGF0ZS1vcGVuZWQpLCA6c3RhdGUoc3RhdGUtY2xvc2luZykpKSAmIHtcbiAgICBkaXNwbGF5OiBibG9jaztcblxuICAgIGFuaW1hdGlvbjoge1xuICAgICAgbmFtZTogb3BlbjtcbiAgICAgIGR1cmF0aW9uOiB2YXIoLS1zYmItZGlhbG9nLWFuaW1hdGlvbi1kdXJhdGlvbik7XG4gICAgICB0aW1pbmctZnVuY3Rpb246IGVhc2U7XG4gICAgfVxuICB9XG5cbiAgOmhvc3QoOnN0YXRlKHN0YXRlLWNsb3NpbmcpKSAmIHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBhbmltYXRpb24tbmFtZTogY2xvc2U7XG4gIH1cblxuICBAaW5jbHVkZSBzYmIuaWYtZm9yY2VkLWNvbG9ycyB7XG4gICAgb3V0bGluZTogdmFyKC0tc2JiLWJvcmRlci13aWR0aC0xeCkgc29saWQgQ2FudmFzVGV4dDtcbiAgfVxuXG4gIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogbGFyZ2UpIHtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1zYmItZGlhbG9nLWJvcmRlci1yYWRpdXMpO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgaGVpZ2h0OiBhdXRvO1xuICB9XG59XG5cbjpob3N0KDpzdGF0ZShoYXMtaW50ZXJtZWRpYXRlLWVsZW1lbnQpKSA6OnNsb3R0ZWQoOmZpcnN0LWNoaWxkKSxcbi5zYmItZGlhbG9nX193cmFwcGVyIHtcbiAgd2lkdGg6IHZhcigtLXNiYi1kaWFsb2ctd2lkdGgpO1xuICBoZWlnaHQ6IHZhcigtLXNiYi1kaWFsb2ctaGVpZ2h0KTtcbiAgbWF4LXdpZHRoOiB2YXIoLS1zYmItZGlhbG9nLW1heC13aWR0aCk7XG4gIG1heC1oZWlnaHQ6IHZhcigtLXNiYi1kaWFsb2ctbWF4LWhlaWdodCk7XG59XG5cbjpob3N0KDpzdGF0ZShoYXMtaW50ZXJtZWRpYXRlLWVsZW1lbnQpKSA6OnNsb3R0ZWQoOmZpcnN0LWNoaWxkKSxcbjpob3N0KDpub3QoOnN0YXRlKGhhcy1pbnRlcm1lZGlhdGUtZWxlbWVudCkpKSAuc2JiLWRpYWxvZ19fd3JhcHBlciB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGU6XG4gICAgJ3RpdGxlIGNsb3NlLWJ1dHRvbicgYXV0b1xuICAgICdjb250ZW50IGNvbnRlbnQnIDFmclxuICAgICdhY3Rpb25zIGFjdGlvbnMnIGF1dG8gLyAxZnIgYXV0bztcbiAgZ2FwOiAwO1xufVxuXG4vLyBJdCBpcyBuZWNlc3NhcnkgdG8gdXNlIGFuaW1hdGlvbnMgd2l0aCBrZXlmcmFtZXMgaW5zdGVhZCBvZiB0cmFuc2l0aW9ucyBpbiBvcmRlciBub3QgdG8gYWx0ZXJcbi8vIHRoZSBkZWZhdWx0IGBkaXNwbGF5OiBibG9ja2Agb2YgdGhlIG1vZGFsIG90aGVyd2lzZSBpdCBjYXVzZXMgc2V2ZXJhbCBwcm9ibGVtcyxcbi8vIGVzcGVjaWFsbHkgZm9yIGFjY2Vzc2liaWxpdHkuXG5Aa2V5ZnJhbWVzIG9wZW4ge1xuICBmcm9tIHtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHRyYW5zbGF0ZTogMCB2YXIoLS1zYmItc3BhY2luZy1maXhlZC00eCk7XG4gIH1cblxuICB0byB7XG4gICAgb3BhY2l0eTogMTtcbiAgICB0cmFuc2xhdGU6IDA7XG4gIH1cbn1cblxuQGtleWZyYW1lcyBjbG9zZSB7XG4gIGZyb20ge1xuICAgIG9wYWNpdHk6IDE7XG4gICAgdHJhbnNsYXRlOiAwO1xuICB9XG5cbiAgdG8ge1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdHJhbnNsYXRlOiAwIHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTR4KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUmVzaXplQ29udHJvbGxlciB9IGZyb20gJ0BsaXQtbGFicy9vYnNlcnZlcnMvcmVzaXplLWNvbnRyb2xsZXIuanMnO1xuaW1wb3J0IHsgdHlwZSBDU1NSZXN1bHRHcm91cCwgdHlwZSBQcm9wZXJ0eVZhbHVlcywgdHlwZSBUZW1wbGF0ZVJlc3VsdCwgdW5zYWZlQ1NTIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcbmltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQvc3RhdGljLWh0bWwuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFNiYkVsZW1lbnRUeXBlLCBTYmJPdmVybGF5Q2xvc2VFdmVudERldGFpbHMgfSBmcm9tICcuLi8uLi9jb3JlLnRzJztcbmltcG9ydCB7XG4gIGJveFNpemluZ1N0eWxlcyxcbiAgaXNaZXJvQW5pbWF0aW9uRHVyYXRpb24sXG4gIFNiYlNjcmVlblJlYWRlck9ubHlFbGVtZW50LFxufSBmcm9tICcuLi8uLi9jb3JlLnRzJztcbmltcG9ydCB7XG4gIG92ZXJsYXlSZWZzLFxuICBTYmJPdmVybGF5QmFzZUVsZW1lbnQsXG4gIFNiYk92ZXJsYXlDbG9zZUV2ZW50IGFzIFNiYkRpYWxvZ0Nsb3NlRXZlbnQsXG59IGZyb20gJy4uLy4uL292ZXJsYXkucHVyZS50cyc7XG5pbXBvcnQgdHlwZSB7IFNiYkRpYWxvZ0NvbnRlbnRFbGVtZW50IH0gZnJvbSAnLi4vZGlhbG9nLWNvbnRlbnQvZGlhbG9nLWNvbnRlbnQuY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHN0eWxlIGZyb20gJy4vZGlhbG9nLnNjc3M/aW5saW5lJztcblxuZXhwb3J0IHtcbiAgYXNzaWduT3ZlcmxheVJlc3VsdCBhcyBhc3NpZ25EaWFsb2dSZXN1bHQsXG4gIFNiYk92ZXJsYXlDbG9zZUV2ZW50IGFzIFNiYkRpYWxvZ0Nsb3NlRXZlbnQsXG59IGZyb20gJy4uLy4uL292ZXJsYXkvb3ZlcmxheS1iYXNlLWVsZW1lbnQudHMnO1xuXG4vKipcbiAqIEl0IGRpc3BsYXlzIGFuIGludGVyYWN0aXZlIG92ZXJsYXkgZWxlbWVudC5cbiAqXG4gKiBAc2xvdCAtIFVzZSB0aGUgdW5uYW1lZCBzbG90IHRvIHByb3ZpZGUgYSBgc2JiLWRpYWxvZy10aXRsZWAsIGBzYmItZGlhbG9nLWNvbnRlbnRgIGFuZCBhbiBvcHRpb25hbCBgc2JiLWRpYWxvZy1hY3Rpb25zYC5cbiAqIEBjc3Nwcm9wIFstLXNiYi1kaWFsb2ctei1pbmRleD12YXIoLS1zYmItb3ZlcmxheS1kZWZhdWx0LXotaW5kZXgpXSAtIFRvIHNwZWNpZnkgYSBjdXN0b20gc3RhY2sgb3JkZXIsXG4gKiB0aGUgYHotaW5kZXhgIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlZmluaW5nIHRoaXMgQ1NTIHZhcmlhYmxlLiBUaGUgZGVmYXVsdCBgei1pbmRleGAgb2YgdGhlXG4gKiBjb21wb25lbnQgaXMgc2V0IHRvIGB2YXIoLS1zYmItb3ZlcmxheS1kZWZhdWx0LXotaW5kZXgpYCB3aXRoIGEgdmFsdWUgb2YgYDEwMDBgLlxuICovXG5leHBvcnQgY2xhc3MgU2JiRGlhbG9nRWxlbWVudCBleHRlbmRzIFNiYk92ZXJsYXlCYXNlRWxlbWVudCB7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgcmVhZG9ubHkgZWxlbWVudE5hbWU6IHN0cmluZyA9ICdzYmItZGlhbG9nJztcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBlbGVtZW50RGVwZW5kZW5jaWVzOiBTYmJFbGVtZW50VHlwZVtdID0gW1NiYlNjcmVlblJlYWRlck9ubHlFbGVtZW50XTtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gW2JveFNpemluZ1N0eWxlcywgdW5zYWZlQ1NTKHN0eWxlKV07XG5cbiAgLyoqIEJhY2tkcm9wIGNsaWNrIGFjdGlvbi4gKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYmFja2Ryb3AtYWN0aW9uJyB9KSBwdWJsaWMgYWNjZXNzb3IgYmFja2Ryb3BBY3Rpb246ICdjbG9zZScgfCAnbm9uZScgPVxuICAgICdjbG9zZSc7XG5cbiAgLyoqIEJhY2tkcm9wIGRlbnNpdHkuICovXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2JhY2tkcm9wJywgcmVmbGVjdDogdHJ1ZSB9KSBwdWJsaWMgYWNjZXNzb3IgYmFja2Ryb3A6XG4gICAgfCAnb3BhcXVlJ1xuICAgIHwgJ3RyYW5zbHVjZW50JyA9ICdvcGFxdWUnO1xuXG4gIC8vIFdlIHVzZSBhIHRpbWVvdXQgYXMgYSB3b3JrYXJvdW5kIHRvIHRoZSBcIlJlc2l6ZU9ic2VydmVyIGxvb3AgY29tcGxldGVkIHdpdGggdW5kZWxpdmVyZWQgbm90aWZpY2F0aW9uc1wiIGVycm9yLlxuICAvLyBGb3IgbW9yZSBkZXRhaWxzOlxuICAvLyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL3Jlc2l6ZS1vYnNlcnZlci9pc3N1ZXMvMzgjaXNzdWVjb21tZW50LTQyMjEyNjAwNlxuICAvLyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWdnbGUvcmVzaXplLW9ic2VydmVyL2lzc3Vlcy8xMDMjaXNzdWVjb21tZW50LTE3MTExNDgyODVcbiAgcHJpdmF0ZSBfZGlhbG9nQ29udGVudFJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZUNvbnRyb2xsZXIodGhpcywge1xuICAgIHRhcmdldDogbnVsbCxcbiAgICBza2lwSW5pdGlhbDogdHJ1ZSxcbiAgICBjYWxsYmFjazogKCkgPT4gc2V0VGltZW91dCgoKSA9PiB0aGlzLl91cGRhdGVPdmVyZmxvd1N0YXRlKCkpLFxuICB9KTtcblxuICBwcml2YXRlIF9kaWFsb2dFbGVtZW50PzogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX2lzUG9pbnRlckRvd25FdmVudE9uRGlhbG9nOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBjbG9zZUF0dHJpYnV0ZTogc3RyaW5nID0gJ3NiYi1kaWFsb2ctY2xvc2UnO1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY2xvc2VUYWc6IHN0cmluZyA9ICdzYmItZGlhbG9nLWNsb3NlLWJ1dHRvbic7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gQ2xvc2UgZGlhbG9nIG9uIGJhY2tkcm9wIGNsaWNrXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ3BvaW50ZXJkb3duJywgdGhpcy5fcG9pbnRlckRvd25MaXN0ZW5lcik7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ3BvaW50ZXJ1cCcsIHRoaXMuX2Nsb3NlT25CYWNrZHJvcENsaWNrKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHRoaXMuX3VwZGF0ZU92ZXJmbG93U3RhdGUoKSwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvKiogQW5ub3VuY2UgdGhlIGFjY2Vzc2liaWxpdHkgbGFiZWwgb3IgZGlhbG9nIHRpdGxlIGZvciBzY3JlZW4gcmVhZGVycy4gKi9cbiAgcHVibGljIGFubm91bmNlVGl0bGUoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRBcmlhTGl2ZVJlZkNvbnRlbnQoXG4gICAgICB0aGlzLmFjY2Vzc2liaWxpdHlMYWJlbCB8fCB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3NiYi1kaWFsb2ctdGl0bGUnKT8udGV4dENvbnRlbnQudHJpbSgpLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNaZXJvQW5pbWF0aW9uRHVyYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKHRoaXMsICctLXNiYi1kaWFsb2ctYW5pbWF0aW9uLWR1cmF0aW9uJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlQ2xvc2luZygpOiB2b2lkIHtcbiAgICBjb25zdCBjb250ZW50RWxlbWVudCA9IHRoaXMuX2NvbnRlbnRFbGVtZW50KCk7XG5cbiAgICBjb250ZW50RWxlbWVudD8uc2Nyb2xsVG8oMCwgMCk7XG4gICAgdGhpcy5zdGF0ZSA9ICdjbG9zZWQnO1xuICAgIHRoaXMuaGlkZVBvcG92ZXI/LigpO1xuXG4gICAgdGhpcy5pbmVydENvbnRyb2xsZXIuZGVhY3RpdmF0ZSgpO1xuICAgIGlmICghdGhpcy5za2lwRm9jdXNSZXN0b3JhdGlvbikge1xuICAgICAgLy8gTWFudWFsbHkgZm9jdXMgbGFzdCBmb2N1c2VkIGVsZW1lbnRcbiAgICAgIHRoaXMubGFzdEZvY3VzZWRFbGVtZW50Py5mb2N1cygpO1xuICAgIH1cbiAgICB0aGlzLm9wZW5PdmVybGF5Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICB0aGlzLmZvY3VzVHJhcENvbnRyb2xsZXIuZW5hYmxlZCA9IGZhbHNlO1xuICAgIGlmIChjb250ZW50RWxlbWVudCkge1xuICAgICAgdGhpcy5fZGlhbG9nQ29udGVudFJlc2l6ZU9ic2VydmVyLmhvc3REaXNjb25uZWN0ZWQoKTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVJbnN0YW5jZUZyb21HbG9iYWxDb2xsZWN0aW9uKCk7XG4gICAgLy8gRW5hYmxlIHNjcm9sbGluZyBmb3IgY29udGVudCBiZWxvdyB0aGUgZGlhbG9nIGlmIG5vIGRpYWxvZyBpcyBvcGVuXG4gICAgaWYgKCFvdmVybGF5UmVmcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2Nyb2xsSGFuZGxlci5lbmFibGVTY3JvbGwoKTtcbiAgICB9XG4gICAgdGhpcy5lc2NhcGFibGVPdmVybGF5Q29udHJvbGxlci5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5kaXNwYXRjaENsb3NlRXZlbnQoe1xuICAgICAgcmV0dXJuVmFsdWU6IHRoaXMucmV0dXJuVmFsdWUsXG4gICAgICBjbG9zZVRhcmdldDogdGhpcy5vdmVybGF5Q2xvc2VFbGVtZW50LFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZU9wZW5pbmcoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSA9ICdvcGVuZWQnO1xuICAgIHRoaXMuaW5lcnRDb250cm9sbGVyLmFjdGl2YXRlKCk7XG4gICAgdGhpcy5mb2N1c1RyYXBDb250cm9sbGVyLmZvY3VzSW5pdGlhbEVsZW1lbnQoKTtcbiAgICB0aGlzLmZvY3VzVHJhcENvbnRyb2xsZXIuZW5hYmxlZCA9IHRydWU7XG4gICAgLy8gVXNlIHRpbWVvdXQgdG8gcmVhZCBsYWJlbCBhZnRlciBmb2N1c2VkIGVsZW1lbnRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYW5ub3VuY2VUaXRsZSgpKTtcblxuICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50ID0gdGhpcy5fY29udGVudEVsZW1lbnQoKTtcbiAgICBpZiAoY29udGVudEVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX2RpYWxvZ0NvbnRlbnRSZXNpemVPYnNlcnZlci5vYnNlcnZlKGNvbnRlbnRFbGVtZW50KTtcbiAgICB9XG4gICAgdGhpcy5kaXNwYXRjaE9wZW5FdmVudCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgLy8gSWYgdGhlIGNvbXBvbmVudCBpcyBhbHJlYWR5IG9wZW4gb24gZmlyc3RVcGRhdGUsIGFubm91bmNlIHRoZSB0aXRsZVxuICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgdGhpcy5hbm5vdW5jZVRpdGxlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3luY1RpdGxlTmVnYXRpdmUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnbmVnYXRpdmUnKSkge1xuICAgICAgdGhpcy5fc3luY1RpdGxlTmVnYXRpdmUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVTbG90Q2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuX3N5bmNUaXRsZU5lZ2F0aXZlKCk7XG4gICAgdGhpcy5fZGV0ZWN0SW50ZXJtZWRpYXRlRWxlbWVudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3luY1RpdGxlTmVnYXRpdmUoKTogdm9pZCB7XG4gICAgY29uc3QgZGlhbG9nVGl0bGUgPSB0aGlzLnF1ZXJ5U2VsZWN0b3I/Lignc2JiLWRpYWxvZy10aXRsZScpO1xuICAgIGNvbnN0IGNsb3NlQnV0dG9uID0gdGhpcy5xdWVyeVNlbGVjdG9yPy4oJ3NiYi1kaWFsb2ctY2xvc2UtYnV0dG9uJyk7XG5cbiAgICBpZiAoZGlhbG9nVGl0bGUpIHtcbiAgICAgIGRpYWxvZ1RpdGxlLm5lZ2F0aXZlID0gdGhpcy5uZWdhdGl2ZTtcbiAgICB9XG5cbiAgICBpZiAoY2xvc2VCdXR0b24pIHtcbiAgICAgIGNsb3NlQnV0dG9uLm5lZ2F0aXZlID0gdGhpcy5uZWdhdGl2ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kZXRlY3RJbnRlcm1lZGlhdGVFbGVtZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IGhhc05vRXhwZWN0ZWREaXJlY3RDaGlsZHJlbiA9XG4gICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICc6c2NvcGUgPiA6aXMoc2JiLWRpYWxvZy10aXRsZSwgc2JiLWRpYWxvZy1jbG9zZS1idXR0b24sIHNiYi1kaWFsb2ctY29udGVudCwgc2JiLWRpYWxvZy1hY3Rpb25zKScsXG4gICAgICApID09PSBudWxsO1xuXG4gICAgdGhpcy50b2dnbGVTdGF0ZSgnaGFzLWludGVybWVkaWF0ZS1lbGVtZW50JywgaGFzTm9FeHBlY3RlZERpcmVjdENoaWxkcmVuKTtcbiAgfVxuXG4gIC8qKiBDaGVjayBpZiB0aGUgcG9pbnRlcmRvd24gZXZlbnQgdGFyZ2V0IGlzIHRyaWdnZXJlZCBvbiB0aGUgZGlhbG9nLiAqL1xuICBwcml2YXRlIF9wb2ludGVyRG93bkxpc3RlbmVyID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAodGhpcy5iYWNrZHJvcEFjdGlvbiAhPT0gJ2Nsb3NlJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2lzUG9pbnRlckRvd25FdmVudE9uRGlhbG9nID1cbiAgICAgICEhdGhpcy5fZGlhbG9nRWxlbWVudCAmJiBldmVudC5jb21wb3NlZFBhdGgoKS5pbmNsdWRlcyh0aGlzLl9kaWFsb2dFbGVtZW50KTtcbiAgfTtcblxuICAvKiogQ2xvc2UgZGlhbG9nIG9uIGJhY2tkcm9wIGNsaWNrLiAqL1xuICBwcml2YXRlIF9jbG9zZU9uQmFja2Ryb3BDbGljayA9IChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5iYWNrZHJvcEFjdGlvbiA9PT0gJ2Nsb3NlJyAmJlxuICAgICAgIXRoaXMuX2lzUG9pbnRlckRvd25FdmVudE9uRGlhbG9nICYmXG4gICAgICB0aGlzLl9kaWFsb2dFbGVtZW50ICYmXG4gICAgICAhZXZlbnQuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXModGhpcy5fZGlhbG9nRWxlbWVudClcbiAgICApIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBfdXBkYXRlT3ZlcmZsb3dTdGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjb250ZW50RWxlbWVudCA9IHRoaXMuX2NvbnRlbnRFbGVtZW50KCk7XG4gICAgdGhpcy50b2dnbGVTdGF0ZSgndG9wLXNoYWRvdycsIChjb250ZW50RWxlbWVudD8uc2Nyb2xsVG9wID8/IDApID4gMCk7XG4gICAgdGhpcy50b2dnbGVTdGF0ZShcbiAgICAgICdib3R0b20tc2hhZG93JyxcbiAgICAgIChjb250ZW50RWxlbWVudD8uc2Nyb2xsVG9wID8/IDApICsgKGNvbnRlbnRFbGVtZW50Py5vZmZzZXRIZWlnaHQgPz8gMCkgPFxuICAgICAgICAoY29udGVudEVsZW1lbnQ/LnNjcm9sbEhlaWdodCA/PyAwKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29udGVudEVsZW1lbnQoKTogU2JiRGlhbG9nQ29udGVudEVsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCdzYmItZGlhbG9nLWNvbnRlbnQnKTtcbiAgfVxuXG4gIC8vIFRPRE86IHJlbW92ZSBwYXJhbWV0ZXIgYGRldGFpbGBcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGRpc3BhdGNoQmVmb3JlQ2xvc2VFdmVudChfZGV0YWlsPzogU2JiT3ZlcmxheUNsb3NlRXZlbnREZXRhaWxzKTogYm9vbGVhbiB7XG4gICAgLyoqIEB0eXBlIHtTYmJEaWFsb2dDbG9zZUV2ZW50fSBFbWl0cyB3aGVuZXZlciB0aGUgY29tcG9uZW50IGJlZ2lucyB0aGUgY2xvc2luZyB0cmFuc2l0aW9uLiBDYW4gYmUgY2FuY2VsZWQuICovXG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBTYmJEaWFsb2dDbG9zZUV2ZW50KCdiZWZvcmVjbG9zZScsIHtcbiAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgICAgY2xvc2VBdHRyaWJ1dGU6IHRoaXMuY2xvc2VBdHRyaWJ1dGUsXG4gICAgICAgIGNsb3NlVGFyZ2V0OiB0aGlzLm92ZXJsYXlDbG9zZUVsZW1lbnQsXG4gICAgICAgIHJlc3VsdDogdGhpcy5yZXR1cm5WYWx1ZSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvLyBUT0RPOiByZW1vdmUgcGFyYW1ldGVyIGBkZXRhaWxgXG4gIHByb3RlY3RlZCBvdmVycmlkZSBkaXNwYXRjaENsb3NlRXZlbnQoX2RldGFpbD86IFNiYk92ZXJsYXlDbG9zZUV2ZW50RGV0YWlscyk6IGJvb2xlYW4ge1xuICAgIC8qKiBAdHlwZSB7U2JiRGlhbG9nQ2xvc2VFdmVudH0gRW1pdHMgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCBpcyBjbG9zZWQuICovXG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBTYmJEaWFsb2dDbG9zZUV2ZW50KCdjbG9zZScsIHtcbiAgICAgICAgY2xvc2VBdHRyaWJ1dGU6IHRoaXMuY2xvc2VBdHRyaWJ1dGUsXG4gICAgICAgIGNsb3NlVGFyZ2V0OiB0aGlzLm92ZXJsYXlDbG9zZUVsZW1lbnQsXG4gICAgICAgIHJlc3VsdDogdGhpcy5yZXR1cm5WYWx1ZSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItZGlhbG9nX19jb250YWluZXJcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIEBhbmltYXRpb25lbmQ9JHt0aGlzLm9uT3ZlcmxheUFuaW1hdGlvbkVuZH1cbiAgICAgICAgICBjbGFzcz1cInNiYi1kaWFsb2dcIlxuICAgICAgICAgICR7cmVmKChlbD86IEVsZW1lbnQpID0+ICh0aGlzLl9kaWFsb2dFbGVtZW50ID0gZWwgYXMgSFRNTERpdkVsZW1lbnQpKX1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIEBjbGljaz0keyhldmVudDogRXZlbnQpID0+IHRoaXMuY2xvc2VPblNiYk92ZXJsYXlDbG9zZUNsaWNrKGV2ZW50KX1cbiAgICAgICAgICAgIGNsYXNzPVwic2JiLWRpYWxvZ19fd3JhcHBlclwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNsb3QgQHNsb3RjaGFuZ2U9JHsoKSA9PiB0aGlzLl9oYW5kbGVTbG90Q2hhbmdlKCl9Pjwvc2xvdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzYmItc2NyZWVuLXJlYWRlci1vbmx5IGFyaWEtbGl2ZT1cInBvbGl0ZVwiPjwvc2JiLXNjcmVlbi1yZWFkZXItb25seT5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICdzYmItZGlhbG9nJzogU2JiRGlhbG9nRWxlbWVudDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUNrQ2EsMEJBQWdCO21CQUFTOzs7Ozs7O2NBQXpCLHlCQUF5QixZQUFxQjs7O2lDQU14RCxTQUFTLEVBQUUsV0FBVyxtQkFBbUIsQ0FBQyxDQUFBOzJCQUkxQyxTQUFTO0lBQUUsV0FBVztJQUFZLFNBQVM7SUFBTSxDQUFDLENBQUE7QUFKUCxnQkFBQSxNQUFBLE1BQUEsNEJBQUE7SUFBQSxNQUFBO0lBQUEsTUFBQTtJQUFBLFFBQUE7SUFBQSxTQUFBO0lBQUEsUUFBQTtLQUFBLE1BQUEsUUFBQSxvQkFBQTtLQUFBLE1BQUEsUUFBQSxJQUFnQjtLQUFjLE1BQUEsS0FBQSxVQUFBO0FBQUEsVUFBZCxpQkFBYzs7S0FBQTtJQUFBLFVBQUE7SUFBQSxFQUFBLDhCQUFBLGtDQUFBO0FBSXRCLGdCQUFBLE1BQUEsTUFBQSxzQkFBQTtJQUFBLE1BQUE7SUFBQSxNQUFBO0lBQUEsUUFBQTtJQUFBLFNBQUE7SUFBQSxRQUFBO0tBQUEsTUFBQSxRQUFBLGNBQUE7S0FBQSxNQUFBLFFBQUEsSUFBZ0I7S0FBUSxNQUFBLEtBQUEsVUFBQTtBQUFBLFVBQVIsV0FBUTs7S0FBQTtJQUFBLFVBQUE7SUFBQSxFQUFBLHdCQUFBLDRCQUFBOzs7Ozs7Ozs7QUFUNUMsUUFBQSxjQUFzQjs7O0FBQy9CLFFBQUEsc0JBQXdDLENBQUMsMkJBQTJCOzs7QUFDcEUsUUFBQSxTQUF5QixDQUFDLGlCQUFp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
|