@sbb-esta/lyne-elements 3.8.0 → 3.9.0
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/core/base-elements/open-close-base-element.d.ts +2 -0
- package/core/base-elements/open-close-base-element.d.ts.map +1 -1
- package/core/base-elements/open-close-base-element.js +4 -0
- package/core/controllers/escapable-overlay-controller.js +3 -3
- package/core/controllers/inert-controller.d.ts +8 -1
- package/core/controllers/inert-controller.d.ts.map +1 -1
- package/core/controllers/inert-controller.js +25 -13
- package/core/overlay/position.d.ts +20 -0
- package/core/overlay/position.d.ts.map +1 -1
- package/core/overlay/position.js +34 -23
- package/core/overlay.js +11 -10
- package/core/styles/core.scss +7 -0
- package/core.css +6 -0
- package/custom-elements.json +612 -138
- package/development/core/base-elements/open-close-base-element.d.ts +2 -0
- package/development/core/base-elements/open-close-base-element.d.ts.map +1 -1
- package/development/core/base-elements/open-close-base-element.js +5 -1
- package/development/core/controllers/escapable-overlay-controller.js +2 -2
- package/development/core/controllers/inert-controller.d.ts +8 -1
- package/development/core/controllers/inert-controller.d.ts.map +1 -1
- package/development/core/controllers/inert-controller.js +49 -30
- package/development/core/overlay/position.d.ts +20 -0
- package/development/core/overlay/position.d.ts.map +1 -1
- package/development/core/overlay/position.js +41 -1
- package/development/core/overlay.js +2 -1
- package/development/menu/common/menu-action-common.d.ts.map +1 -1
- package/development/menu/common/menu-action-common.js +20 -3
- package/development/menu/menu/menu.component.d.ts +21 -10
- package/development/menu/menu/menu.component.d.ts.map +1 -1
- package/development/menu/menu/menu.component.js +203 -61
- package/development/option/option/option.component.js +4 -2
- package/development/tabs/tab/tab.component.d.ts +10 -4
- package/development/tabs/tab/tab.component.d.ts.map +1 -1
- package/development/tabs/tab/tab.component.js +15 -16
- package/development/tabs/tab-group/tab-group.component.d.ts +15 -14
- package/development/tabs/tab-group/tab-group.component.d.ts.map +1 -1
- package/development/tabs/tab-group/tab-group.component.js +46 -175
- package/development/tabs/tab-label/tab-label.component.d.ts +21 -2
- package/development/tabs/tab-label/tab-label.component.d.ts.map +1 -1
- package/development/tabs/tab-label/tab-label.component.js +91 -6
- package/development/tooltip/tooltip.component.d.ts +6 -6
- package/development/tooltip/tooltip.component.d.ts.map +1 -1
- package/development/tooltip/tooltip.component.js +14 -7
- package/menu/common/menu-action-common.d.ts.map +1 -1
- package/menu/common/menu-action-common.js +15 -12
- package/menu/menu/menu.component.d.ts +21 -10
- package/menu/menu/menu.component.d.ts.map +1 -1
- package/menu/menu/menu.component.js +144 -80
- package/off-brand-theme.css +6 -0
- package/option/option/option.component.js +1 -1
- package/package.json +1 -1
- package/safety-theme.css +6 -0
- package/standard-theme.css +6 -0
- package/tabs/tab/tab.component.d.ts +10 -4
- package/tabs/tab/tab.component.d.ts.map +1 -1
- package/tabs/tab/tab.component.js +22 -24
- package/tabs/tab-group/tab-group.component.d.ts +15 -14
- package/tabs/tab-group/tab-group.component.d.ts.map +1 -1
- package/tabs/tab-group/tab-group.component.js +68 -122
- package/tabs/tab-label/tab-label.component.d.ts +21 -2
- package/tabs/tab-label/tab-label.component.d.ts.map +1 -1
- package/tabs/tab-label/tab-label.component.js +88 -46
- package/tooltip/tooltip.component.d.ts +6 -6
- package/tooltip/tooltip.component.d.ts.map +1 -1
- package/tooltip/tooltip.component.js +59 -54
|
@@ -11,12 +11,15 @@ import { customElement, property } from "lit/decorators.js";
|
|
|
11
11
|
import { ref } from "lit/directives/ref.js";
|
|
12
12
|
import { SbbFocusTrapController, isArrowKeyOrPageKeysPressed, interactivityChecker, getNextElementIndex } from "../../core/a11y.js";
|
|
13
13
|
import { SbbOpenCloseBaseElement } from "../../core/base-elements.js";
|
|
14
|
-
import { SbbEscapableOverlayController, SbbInertController,
|
|
14
|
+
import { SbbEscapableOverlayController, SbbInertController, SbbMediaQueryBreakpointSmallAndBelow, SbbMediaMatcherController, SbbDarkModeController, SbbLanguageController } from "../../core/controllers.js";
|
|
15
15
|
import { idReference, forceType } from "../../core/decorators.js";
|
|
16
16
|
import { SbbScrollHandler, isZeroAnimationDuration } from "../../core/dom.js";
|
|
17
17
|
import { forwardEvent } from "../../core/eventing.js";
|
|
18
|
+
import { i18nGoBack } from "../../core/i18n/i18n.js";
|
|
18
19
|
import { SbbNamedSlotListMixin } from "../../core/mixins.js";
|
|
19
|
-
import { isEventOnElement, removeAriaOverlayTriggerAttributes, setAriaOverlayTriggerAttributes, getElementPosition } from "../../core/overlay.js";
|
|
20
|
+
import { isEventOnElement, removeAriaOverlayTriggerAttributes, setAriaOverlayTriggerAttributes, getElementPosition, getElementPositionHorizontal } from "../../core/overlay.js";
|
|
21
|
+
import "../../divider.js";
|
|
22
|
+
import "../menu-button.js";
|
|
20
23
|
const style = css`*,
|
|
21
24
|
::before,
|
|
22
25
|
::after {
|
|
@@ -32,7 +35,8 @@ const style = css`*,
|
|
|
32
35
|
var(--sbb-animation-duration-6x)
|
|
33
36
|
);
|
|
34
37
|
--sbb-menu-animation-easing: ease;
|
|
35
|
-
--sbb-menu-transform:
|
|
38
|
+
--sbb-menu-transform-y: 100%;
|
|
39
|
+
--sbb-menu-transform-x: 0%;
|
|
36
40
|
--sbb-menu-max-width: 100%;
|
|
37
41
|
--sbb-menu-min-width: 100%;
|
|
38
42
|
--sbb-menu-inset: 0 auto auto 0;
|
|
@@ -54,9 +58,10 @@ const style = css`*,
|
|
|
54
58
|
}
|
|
55
59
|
@media (min-width: calc(52.5rem)) {
|
|
56
60
|
:host {
|
|
57
|
-
--sbb-menu-transform:
|
|
61
|
+
--sbb-menu-transform-y: var(--sbb-spacing-fixed-2x);
|
|
58
62
|
--sbb-menu-max-width: 20rem;
|
|
59
63
|
--sbb-menu-min-width: 11.25rem;
|
|
64
|
+
--sbb-menu-back-button-display: none;
|
|
60
65
|
}
|
|
61
66
|
}
|
|
62
67
|
|
|
@@ -70,6 +75,10 @@ const style = css`*,
|
|
|
70
75
|
}
|
|
71
76
|
}
|
|
72
77
|
|
|
78
|
+
:host(:not(:is(:state(nested),[state--nested]))) {
|
|
79
|
+
--sbb-menu-back-button-display: none;
|
|
80
|
+
}
|
|
81
|
+
|
|
73
82
|
:host(:not([data-state=closed])) {
|
|
74
83
|
--sbb-menu-inset: 0;
|
|
75
84
|
}
|
|
@@ -80,16 +89,36 @@ const style = css`*,
|
|
|
80
89
|
--sbb-scrollbar-color-hover: color-mix(in srgb, var(--sbb-color-black) 60%, transparent);
|
|
81
90
|
}
|
|
82
91
|
|
|
92
|
+
@media (max-width: calc(52.4375rem)) {
|
|
93
|
+
:host(:is(:state(skip-animation),[state--skip-animation])) {
|
|
94
|
+
--sbb-menu-animation-duration: 0ms;
|
|
95
|
+
}
|
|
96
|
+
:host(:is(:state(nested-child),[state--nested-child])) {
|
|
97
|
+
--sbb-menu-transform-x: -100%;
|
|
98
|
+
}
|
|
99
|
+
:host(:is(:state(nested),[state--nested])[data-state]:not([data-state=closed])) {
|
|
100
|
+
--sbb-menu-open-animation-name: open-sideways;
|
|
101
|
+
}
|
|
102
|
+
:host([data-state][data-state=closing]:is(:state(nested),[state--nested]):not(:is(:state(close-all),[state--close-all]))) {
|
|
103
|
+
--sbb-menu-close-animation-name: close-sideways;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
83
106
|
::slotted(:not(sbb-menu-button, sbb-menu-link, sbb-divider)) {
|
|
84
107
|
display: block;
|
|
85
108
|
padding-inline: var(--sbb-spacing-fixed-5x);
|
|
86
109
|
}
|
|
87
110
|
|
|
111
|
+
sbb-divider,
|
|
88
112
|
::slotted(sbb-divider) {
|
|
89
113
|
--sbb-divider-color: var(--sbb-background-color-4-inverted);
|
|
90
114
|
margin-block: var(--sbb-spacing-fixed-2x);
|
|
91
115
|
}
|
|
92
116
|
|
|
117
|
+
sbb-divider,
|
|
118
|
+
#sbb-menu__back-button {
|
|
119
|
+
display: var(--sbb-menu-back-button-display, block);
|
|
120
|
+
}
|
|
121
|
+
|
|
93
122
|
.sbb-menu__container {
|
|
94
123
|
position: fixed;
|
|
95
124
|
pointer-events: none;
|
|
@@ -109,6 +138,9 @@ const style = css`*,
|
|
|
109
138
|
transition-timing-function: var(--sbb-menu-animation-easing);
|
|
110
139
|
transition-property: background-color, visibility;
|
|
111
140
|
}
|
|
141
|
+
:host(:is(:state(nested),[state--nested])) .sbb-menu__container::before {
|
|
142
|
+
display: none;
|
|
143
|
+
}
|
|
112
144
|
|
|
113
145
|
.sbb-menu {
|
|
114
146
|
display: none;
|
|
@@ -128,18 +160,20 @@ const style = css`*,
|
|
|
128
160
|
background-color: var(--sbb-menu-background-color);
|
|
129
161
|
padding: 0;
|
|
130
162
|
overflow: hidden;
|
|
163
|
+
translate: var(--sbb-menu-transform-x) 0;
|
|
164
|
+
transition: translate var(--sbb-menu-animation-duration);
|
|
131
165
|
}
|
|
132
166
|
:host([data-state]:not([data-state=closed])) .sbb-menu {
|
|
133
167
|
display: block;
|
|
134
168
|
opacity: 1;
|
|
135
169
|
pointer-events: all;
|
|
136
|
-
animation-name: open;
|
|
170
|
+
animation-name: var(--sbb-menu-open-animation-name, open);
|
|
137
171
|
animation-duration: var(--sbb-menu-animation-duration);
|
|
138
172
|
animation-timing-function: var(--sbb-menu-animation-easing);
|
|
139
173
|
}
|
|
140
174
|
:host([data-state][data-state=closing]) .sbb-menu {
|
|
141
175
|
pointer-events: none;
|
|
142
|
-
animation-name: close;
|
|
176
|
+
animation-name: var(--sbb-menu-close-animation-name, close);
|
|
143
177
|
}
|
|
144
178
|
@media (forced-colors: active) {
|
|
145
179
|
.sbb-menu {
|
|
@@ -231,24 +265,41 @@ const style = css`*,
|
|
|
231
265
|
@keyframes open {
|
|
232
266
|
from {
|
|
233
267
|
opacity: 0;
|
|
234
|
-
|
|
268
|
+
translate: 0 var(--sbb-menu-transform-y);
|
|
235
269
|
}
|
|
236
270
|
to {
|
|
237
271
|
opacity: 1;
|
|
238
|
-
|
|
272
|
+
translate: 0 0;
|
|
239
273
|
}
|
|
240
274
|
}
|
|
241
275
|
@keyframes close {
|
|
242
276
|
from {
|
|
243
277
|
opacity: 1;
|
|
244
|
-
|
|
278
|
+
translate: 0 0;
|
|
245
279
|
}
|
|
246
280
|
to {
|
|
247
281
|
opacity: 0;
|
|
248
|
-
|
|
282
|
+
translate: 0 var(--sbb-menu-transform-y);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
@keyframes open-sideways {
|
|
286
|
+
from {
|
|
287
|
+
translate: 100% 0;
|
|
288
|
+
}
|
|
289
|
+
to {
|
|
290
|
+
translate: 0 0;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
@keyframes close-sideways {
|
|
294
|
+
from {
|
|
295
|
+
translate: 0 0;
|
|
296
|
+
}
|
|
297
|
+
to {
|
|
298
|
+
translate: 100% 0;
|
|
249
299
|
}
|
|
250
300
|
}`;
|
|
251
301
|
const MENU_OFFSET = 8;
|
|
302
|
+
const NESTED_MENU_OFFSET = -4;
|
|
252
303
|
const INTERACTIVE_ELEMENTS = [
|
|
253
304
|
"A",
|
|
254
305
|
"BUTTON",
|
|
@@ -257,7 +308,9 @@ const INTERACTIVE_ELEMENTS = [
|
|
|
257
308
|
"SBB-LINK",
|
|
258
309
|
"SBB-BLOCK-LINK",
|
|
259
310
|
"SBB-LINK-BUTTON",
|
|
260
|
-
"SBB-BLOCK-LINK-BUTTON"
|
|
311
|
+
"SBB-BLOCK-LINK-BUTTON",
|
|
312
|
+
"SBB-MENU-BUTTON",
|
|
313
|
+
"SBB-MENU-LINK"
|
|
261
314
|
];
|
|
262
315
|
let nextId = 0;
|
|
263
316
|
let SbbMenuElement = (() => {
|
|
@@ -288,8 +341,9 @@ let SbbMenuElement = (() => {
|
|
|
288
341
|
this._focusTrapController = new SbbFocusTrapController(this);
|
|
289
342
|
this._scrollHandler = new SbbScrollHandler();
|
|
290
343
|
this._inertController = new SbbInertController(this);
|
|
344
|
+
this._mobileBreakpoint = SbbMediaQueryBreakpointSmallAndBelow;
|
|
291
345
|
this._mediaMatcher = new SbbMediaMatcherController(this, {
|
|
292
|
-
[
|
|
346
|
+
[this._mobileBreakpoint]: (matches) => {
|
|
293
347
|
if (matches && (this.state === "opening" || this.state === "opened")) {
|
|
294
348
|
this._scrollHandler.disableScroll();
|
|
295
349
|
} else {
|
|
@@ -298,15 +352,18 @@ let SbbMenuElement = (() => {
|
|
|
298
352
|
}
|
|
299
353
|
});
|
|
300
354
|
this._darkModeController = new SbbDarkModeController(this, () => this._syncNegative());
|
|
355
|
+
this._language = new SbbLanguageController(this);
|
|
356
|
+
this._nestedMenu = null;
|
|
301
357
|
this._pointerDownListener = (event) => {
|
|
302
|
-
|
|
358
|
+
const menu = event.target.closest("sbb-menu");
|
|
359
|
+
this._isPointerDownEventOnMenu = isEventOnElement(this._menu, event) || this._nestedMenus().some((el) => menu === el);
|
|
303
360
|
};
|
|
304
361
|
this._closeOnBackdropClick = (event) => {
|
|
305
|
-
|
|
306
|
-
|
|
362
|
+
const target = event.target;
|
|
363
|
+
if (!this._isPointerDownEventOnMenu && !isEventOnElement(this._menu, event) && !this._nestedMenus().some((el) => el === target)) {
|
|
364
|
+
this.closeAll();
|
|
307
365
|
}
|
|
308
366
|
};
|
|
309
|
-
this.addEventListener?.("click", (e) => this._onClick(e));
|
|
310
367
|
this.addEventListener?.("keydown", (e) => this._handleKeyDown(e));
|
|
311
368
|
}
|
|
312
369
|
/**
|
|
@@ -330,34 +387,60 @@ let SbbMenuElement = (() => {
|
|
|
330
387
|
set listAccessibilityLabel(value) {
|
|
331
388
|
__privateSet(this, _listAccessibilityLabel_accessor_storage, value);
|
|
332
389
|
}
|
|
390
|
+
firstUpdated(changedProperties) {
|
|
391
|
+
super.firstUpdated(changedProperties);
|
|
392
|
+
this._configureTrigger();
|
|
393
|
+
}
|
|
394
|
+
escapeStrategy() {
|
|
395
|
+
this.closeAll();
|
|
396
|
+
}
|
|
333
397
|
/**
|
|
334
398
|
* Opens the menu on trigger click.
|
|
335
399
|
*/
|
|
336
400
|
open() {
|
|
337
|
-
if (this.state === "closing" || !this._menu) {
|
|
401
|
+
if (this.state === "closing" || this.state === "opened" || !this._menu || !this.dispatchBeforeOpenEvent()) {
|
|
338
402
|
return;
|
|
339
403
|
}
|
|
340
|
-
if (
|
|
341
|
-
|
|
404
|
+
if (this._isNested()) {
|
|
405
|
+
const parentMenu = this._parentMenu();
|
|
406
|
+
parentMenu.toggleState("nested-child", true);
|
|
407
|
+
if (parentMenu._nestedMenu !== this) {
|
|
408
|
+
parentMenu._nestedMenu?.close();
|
|
409
|
+
}
|
|
410
|
+
parentMenu._nestedMenu = this;
|
|
342
411
|
}
|
|
343
412
|
this.showPopover?.();
|
|
344
413
|
this.state = "opening";
|
|
345
414
|
this._setMenuPosition();
|
|
346
415
|
this._triggerElement?.setAttribute("aria-expanded", "true");
|
|
347
|
-
if (this.
|
|
416
|
+
if (this._isMobile()) {
|
|
348
417
|
this._scrollHandler.disableScroll();
|
|
349
418
|
}
|
|
350
419
|
if (this._isZeroAnimationDuration()) {
|
|
351
420
|
this._handleOpening();
|
|
352
421
|
}
|
|
353
422
|
}
|
|
354
|
-
/**
|
|
355
|
-
* Closes the menu.
|
|
356
|
-
*/
|
|
423
|
+
/** Closes the menu and all its nested menus. */
|
|
357
424
|
close() {
|
|
358
|
-
|
|
425
|
+
this._close();
|
|
426
|
+
}
|
|
427
|
+
/** Closes the menu and all related menus nested and parent menus). */
|
|
428
|
+
closeAll() {
|
|
429
|
+
this._mainMenu()._close(true);
|
|
430
|
+
}
|
|
431
|
+
/** @param [closeAll='false'] - If true, it ensures animations are correct by toggling some states when closing all related menus at once. */
|
|
432
|
+
_close(closeAll = false) {
|
|
433
|
+
if (this.state === "opening" && !this._isNested() || !this.dispatchBeforeCloseEvent()) {
|
|
359
434
|
return;
|
|
360
435
|
}
|
|
436
|
+
this._nestedMenu?._close(closeAll);
|
|
437
|
+
if (this._isNested()) {
|
|
438
|
+
const parentMenu = this._parentMenu();
|
|
439
|
+
this.toggleState("close-all", closeAll);
|
|
440
|
+
parentMenu.toggleState("skip-animation", closeAll);
|
|
441
|
+
parentMenu.toggleState("nested-child", false);
|
|
442
|
+
parentMenu._nestedMenu = null;
|
|
443
|
+
}
|
|
361
444
|
this.state = "closing";
|
|
362
445
|
this._triggerElement?.setAttribute("aria-expanded", "false");
|
|
363
446
|
if (this._isZeroAnimationDuration()) {
|
|
@@ -369,7 +452,11 @@ let SbbMenuElement = (() => {
|
|
|
369
452
|
}
|
|
370
453
|
_handleOpening() {
|
|
371
454
|
this.state = "opened";
|
|
372
|
-
this.
|
|
455
|
+
if (!this._isNested()) {
|
|
456
|
+
this._inertController.activate();
|
|
457
|
+
} else {
|
|
458
|
+
this._updateNestedInert();
|
|
459
|
+
}
|
|
373
460
|
this._escapableOverlayController.connect();
|
|
374
461
|
this._focusTrapController.focusInitialElement();
|
|
375
462
|
this._focusTrapController.enabled = true;
|
|
@@ -378,12 +465,18 @@ let SbbMenuElement = (() => {
|
|
|
378
465
|
}
|
|
379
466
|
_handleClosing() {
|
|
380
467
|
this.state = "closed";
|
|
468
|
+
this.toggleState("skip-animation", false);
|
|
469
|
+
this.toggleState("close-all", false);
|
|
381
470
|
this.hidePopover?.();
|
|
382
471
|
this._menu?.firstElementChild?.scrollTo(0, 0);
|
|
383
|
-
this.
|
|
472
|
+
if (!this._isNested()) {
|
|
473
|
+
this._inertController.deactivate();
|
|
474
|
+
} else {
|
|
475
|
+
this._updateNestedInert();
|
|
476
|
+
}
|
|
384
477
|
this._triggerElement?.focus({
|
|
385
478
|
// When inside the sbb-header, we prevent the scroll to avoid the snapping to the top of the page
|
|
386
|
-
preventScroll:
|
|
479
|
+
preventScroll: ["sbb-header-button", "sbb-header-link"].includes(this._triggerElement.localName)
|
|
387
480
|
});
|
|
388
481
|
this._escapableOverlayController.disconnect();
|
|
389
482
|
this.dispatchCloseEvent();
|
|
@@ -391,29 +484,28 @@ let SbbMenuElement = (() => {
|
|
|
391
484
|
this._focusTrapController.enabled = false;
|
|
392
485
|
this._scrollHandler.enableScroll();
|
|
393
486
|
}
|
|
394
|
-
/**
|
|
395
|
-
* Handles click and checks if its target is a sbb-menu-button/sbb-menu-link.
|
|
396
|
-
*/
|
|
397
|
-
_onClick(event) {
|
|
398
|
-
const target = event.target;
|
|
399
|
-
if (target?.localName === "sbb-menu-button" || target?.localName === "sbb-menu-link") {
|
|
400
|
-
this.close();
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
487
|
_handleKeyDown(evt) {
|
|
404
488
|
if (!isArrowKeyOrPageKeysPressed(evt)) {
|
|
405
489
|
return;
|
|
406
490
|
}
|
|
407
491
|
evt.preventDefault();
|
|
408
|
-
const enabledActions = Array.from(this.querySelectorAll("sbb-menu-button, sbb-menu-link")).filter((el) => (!el.disabled || el.disabledInteractive) && interactivityChecker.isVisible(el));
|
|
492
|
+
const enabledActions = Array.from(this.querySelectorAll("sbb-menu-button, sbb-menu-link")).concat(this.shadowRoot.querySelector("sbb-menu-button")).filter((el) => (!el.disabled || el.disabledInteractive) && interactivityChecker.isVisible(el));
|
|
409
493
|
const current = enabledActions.findIndex((e) => e === evt.target);
|
|
410
494
|
let nextIndex;
|
|
411
495
|
switch (evt.key) {
|
|
412
496
|
case "ArrowUp":
|
|
413
497
|
case "ArrowDown":
|
|
498
|
+
nextIndex = getNextElementIndex(evt, current, enabledActions.length);
|
|
499
|
+
break;
|
|
414
500
|
case "ArrowLeft":
|
|
501
|
+
if (this._isNested()) {
|
|
502
|
+
this.close();
|
|
503
|
+
}
|
|
504
|
+
break;
|
|
415
505
|
case "ArrowRight":
|
|
416
|
-
|
|
506
|
+
if (evt.target.hasAttribute("data-sbb-menu-trigger")) {
|
|
507
|
+
evt.target.click();
|
|
508
|
+
}
|
|
417
509
|
break;
|
|
418
510
|
case "PageUp":
|
|
419
511
|
case "Home":
|
|
@@ -423,11 +515,10 @@ let SbbMenuElement = (() => {
|
|
|
423
515
|
case "PageDown":
|
|
424
516
|
nextIndex = enabledActions.length - 1;
|
|
425
517
|
break;
|
|
426
|
-
// this should never happen since all the case allowed by `isArrowKeyOrPageKeysPressed` should be covered
|
|
427
|
-
default:
|
|
428
|
-
nextIndex = 0;
|
|
429
518
|
}
|
|
430
|
-
|
|
519
|
+
if (nextIndex !== void 0) {
|
|
520
|
+
enabledActions[nextIndex].focus();
|
|
521
|
+
}
|
|
431
522
|
}
|
|
432
523
|
// Removes trigger click listener on trigger change.
|
|
433
524
|
createRenderRoot() {
|
|
@@ -461,10 +552,6 @@ let SbbMenuElement = (() => {
|
|
|
461
552
|
this._configureTrigger();
|
|
462
553
|
}
|
|
463
554
|
}
|
|
464
|
-
firstUpdated(changedProperties) {
|
|
465
|
-
super.firstUpdated(changedProperties);
|
|
466
|
-
this._configureTrigger();
|
|
467
|
-
}
|
|
468
555
|
_checkListCase(event) {
|
|
469
556
|
if (this.children?.length && Array.from(this.children ?? []).every((c) => c.localName === "sbb-menu-button" || c.localName === "sbb-menu-link")) {
|
|
470
557
|
return;
|
|
@@ -491,6 +578,8 @@ let SbbMenuElement = (() => {
|
|
|
491
578
|
this._triggerElement.addEventListener("click", () => this.open(), {
|
|
492
579
|
signal: this._triggerAbortController.signal
|
|
493
580
|
});
|
|
581
|
+
this.toggleState("nested", ["sbb-menu-button", "sbb-menu-link"].includes(this._triggerElement.localName));
|
|
582
|
+
this._triggerElement.toggleAttribute("data-sbb-menu-trigger", true);
|
|
494
583
|
}
|
|
495
584
|
_attachWindowEvents() {
|
|
496
585
|
this._windowEventsController = new AbortController();
|
|
@@ -505,18 +594,55 @@ let SbbMenuElement = (() => {
|
|
|
505
594
|
passive: true,
|
|
506
595
|
signal: this._windowEventsController.signal
|
|
507
596
|
});
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
597
|
+
if (!this._isNested()) {
|
|
598
|
+
window.addEventListener("pointerdown", this._pointerDownListener, {
|
|
599
|
+
signal: this._windowEventsController.signal
|
|
600
|
+
});
|
|
601
|
+
window.addEventListener("pointerup", this._closeOnBackdropClick, {
|
|
602
|
+
signal: this._windowEventsController.signal
|
|
603
|
+
});
|
|
604
|
+
}
|
|
514
605
|
}
|
|
515
606
|
// Close menu at any click on an interactive element inside the <sbb-menu> that bubbles to the container.
|
|
516
|
-
|
|
607
|
+
_interactiveElementClick(event) {
|
|
517
608
|
const target = event.target;
|
|
518
|
-
if (INTERACTIVE_ELEMENTS.includes(target.nodeName) && !target.hasAttribute("disabled")) {
|
|
519
|
-
this.
|
|
609
|
+
if (INTERACTIVE_ELEMENTS.includes(target.nodeName) && !target.hasAttribute("disabled") && !target.hasAttribute("data-sbb-menu-trigger") && target.id !== "sbb-menu__back-button") {
|
|
610
|
+
this.closeAll();
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
/** Converts the linked list into an array of SbbMenuElement. */
|
|
614
|
+
_nestedMenus() {
|
|
615
|
+
const menus = [];
|
|
616
|
+
let current = this._nestedMenu;
|
|
617
|
+
while (current) {
|
|
618
|
+
menus.push(current);
|
|
619
|
+
current = current._nestedMenu;
|
|
620
|
+
}
|
|
621
|
+
return menus;
|
|
622
|
+
}
|
|
623
|
+
_parentMenu() {
|
|
624
|
+
return this._triggerElement?.closest("sbb-menu") ?? null;
|
|
625
|
+
}
|
|
626
|
+
/** The outermost menu. */
|
|
627
|
+
_mainMenu() {
|
|
628
|
+
return this._isNested() ? this._parentMenu()?._mainMenu() ?? this : this;
|
|
629
|
+
}
|
|
630
|
+
_isNested() {
|
|
631
|
+
return !!this._parentMenu();
|
|
632
|
+
}
|
|
633
|
+
_updateNestedInert() {
|
|
634
|
+
this._inertController.restoreAllExempted();
|
|
635
|
+
this._mainMenu()._nestedMenus().forEach((menu) => this._inertController.exempt(menu));
|
|
636
|
+
}
|
|
637
|
+
// Check if nested menu should be closed.
|
|
638
|
+
_handleMouseOver(event) {
|
|
639
|
+
const element = event.target;
|
|
640
|
+
const isMobile = this._isMobile();
|
|
641
|
+
if (!isMobile && this._nestedMenu && !element.classList.contains("sbb-menu__content") && !(element.getAttribute("aria-expanded") === "true")) {
|
|
642
|
+
this._nestedMenu.close();
|
|
643
|
+
}
|
|
644
|
+
if (element.hasAttribute("data-sbb-menu-trigger") && !isMobile) {
|
|
645
|
+
element.click();
|
|
520
646
|
}
|
|
521
647
|
}
|
|
522
648
|
// Set menu position (x, y) to '0' once the menu is closed and the transition ended to prevent the
|
|
@@ -524,19 +650,23 @@ let SbbMenuElement = (() => {
|
|
|
524
650
|
// In rare cases it can be that the animationEnd event is triggered twice.
|
|
525
651
|
// To avoid entering a corrupt state, exit when state is not expected.
|
|
526
652
|
_onMenuAnimationEnd(event) {
|
|
527
|
-
if (event.animationName === "open" && this.state === "opening") {
|
|
653
|
+
if ((event.animationName === "open" || event.animationName === "open-sideways") && this.state === "opening") {
|
|
528
654
|
this._handleOpening();
|
|
529
|
-
} else if (event.animationName === "close" && this.state === "closing") {
|
|
655
|
+
} else if ((event.animationName === "close" || event.animationName === "close-sideways") && this.state === "closing") {
|
|
530
656
|
this._handleClosing();
|
|
531
657
|
}
|
|
532
658
|
}
|
|
533
659
|
// Set menu position and max height if the breakpoint is medium-ultra.
|
|
534
660
|
_setMenuPosition() {
|
|
535
|
-
if (
|
|
661
|
+
if (this._isMobile() || !this._menu || !this._triggerElement || this.state === "closing") {
|
|
536
662
|
return;
|
|
537
663
|
}
|
|
538
|
-
const menuPosition = getElementPosition(this.shadowRoot.querySelector(".sbb-menu__content"), this._triggerElement, this.shadowRoot.querySelector(".sbb-menu__container"), {
|
|
664
|
+
const menuPosition = !this._isNested() ? getElementPosition(this.shadowRoot.querySelector(".sbb-menu__content"), this._triggerElement, this.shadowRoot.querySelector(".sbb-menu__container"), {
|
|
539
665
|
verticalOffset: MENU_OFFSET
|
|
666
|
+
}) : getElementPositionHorizontal(this.shadowRoot.querySelector(".sbb-menu__content"), this._triggerElement, this.shadowRoot.querySelector(".sbb-menu__container"), {
|
|
667
|
+
horizontalOffset: MENU_OFFSET,
|
|
668
|
+
verticalOffset: NESTED_MENU_OFFSET,
|
|
669
|
+
contentSelector: ".sbb-menu__content"
|
|
540
670
|
});
|
|
541
671
|
this.style.setProperty("--sbb-menu-position-x", `${menuPosition.left}px`);
|
|
542
672
|
this.style.setProperty("--sbb-menu-position-y", `${menuPosition.top}px`);
|
|
@@ -548,20 +678,32 @@ let SbbMenuElement = (() => {
|
|
|
548
678
|
el.negative = !this._darkModeController.matches();
|
|
549
679
|
});
|
|
550
680
|
}
|
|
681
|
+
_isMobile() {
|
|
682
|
+
return this._mediaMatcher.matches(this._mobileBreakpoint) ?? true;
|
|
683
|
+
}
|
|
551
684
|
render() {
|
|
552
685
|
return html`
|
|
553
686
|
<div class="sbb-menu__container">
|
|
554
687
|
<div
|
|
555
688
|
@animationend=${this._onMenuAnimationEnd}
|
|
689
|
+
@mouseover=${(e) => this._handleMouseOver(e)}
|
|
556
690
|
class="sbb-menu"
|
|
557
691
|
${ref((el) => this._menu = el)}
|
|
558
692
|
>
|
|
559
693
|
<div
|
|
560
|
-
@click=${(event) => this.
|
|
694
|
+
@click=${(event) => this._interactiveElementClick(event)}
|
|
561
695
|
@scroll=${(e) => forwardEvent(e, document)}
|
|
562
696
|
class="sbb-menu__content"
|
|
563
697
|
>
|
|
564
698
|
${this.listChildren.length ? this.renderList({ class: "sbb-menu-list", ariaLabel: this.listAccessibilityLabel }) : html`<slot></slot>`}
|
|
699
|
+
<sbb-divider></sbb-divider>
|
|
700
|
+
<sbb-menu-button
|
|
701
|
+
id="sbb-menu__back-button"
|
|
702
|
+
@click=${() => this.close()}
|
|
703
|
+
icon-name="chevron-small-left-small"
|
|
704
|
+
>
|
|
705
|
+
${i18nGoBack[this._language.current]}
|
|
706
|
+
</sbb-menu-button>
|
|
565
707
|
</div>
|
|
566
708
|
</div>
|
|
567
709
|
</div>
|
|
@@ -586,4 +728,4 @@ let SbbMenuElement = (() => {
|
|
|
586
728
|
export {
|
|
587
729
|
SbbMenuElement
|
|
588
730
|
};
|
|
589
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy9tZW51L21lbnUvbWVudS5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBDU1NSZXN1bHRHcm91cCxcbiAgaHRtbCxcbiAgaXNTZXJ2ZXIsXG4gIHR5cGUgUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgdHlwZSBQcm9wZXJ0eVZhbHVlcyxcbiAgdHlwZSBUZW1wbGF0ZVJlc3VsdCxcbn0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcblxuaW1wb3J0IHtcbiAgZ2V0TmV4dEVsZW1lbnRJbmRleCxcbiAgaW50ZXJhY3Rpdml0eUNoZWNrZXIsXG4gIGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZCxcbiAgU2JiRm9jdXNUcmFwQ29udHJvbGxlcixcbn0gZnJvbSAnLi4vLi4vY29yZS9hMTF5LmpzJztcbmltcG9ydCB7IFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50IH0gZnJvbSAnLi4vLi4vY29yZS9iYXNlLWVsZW1lbnRzLmpzJztcbmltcG9ydCB7XG4gIFNiYkRhcmtNb2RlQ29udHJvbGxlcixcbiAgU2JiRXNjYXBhYmxlT3ZlcmxheUNvbnRyb2xsZXIsXG4gIFNiYkluZXJ0Q29udHJvbGxlcixcbiAgU2JiTWVkaWFNYXRjaGVyQ29udHJvbGxlcixcbiAgU2JiTWVkaWFRdWVyeUJyZWFrcG9pbnRTbWFsbEFuZEJlbG93LFxufSBmcm9tICcuLi8uLi9jb3JlL2NvbnRyb2xsZXJzLmpzJztcbmltcG9ydCB7IGZvcmNlVHlwZSwgaWRSZWZlcmVuY2UgfSBmcm9tICcuLi8uLi9jb3JlL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaXNaZXJvQW5pbWF0aW9uRHVyYXRpb24sIFNiYlNjcm9sbEhhbmRsZXIgfSBmcm9tICcuLi8uLi9jb3JlL2RvbS5qcyc7XG5pbXBvcnQgeyBmb3J3YXJkRXZlbnQgfSBmcm9tICcuLi8uLi9jb3JlL2V2ZW50aW5nLmpzJztcbmltcG9ydCB7IFNiYk5hbWVkU2xvdExpc3RNaXhpbiwgdHlwZSBTYmJOZWdhdGl2ZU1peGluVHlwZSB9IGZyb20gJy4uLy4uL2NvcmUvbWl4aW5zLmpzJztcbmltcG9ydCB7XG4gIGdldEVsZW1lbnRQb3NpdGlvbixcbiAgaXNFdmVudE9uRWxlbWVudCxcbiAgcmVtb3ZlQXJpYU92ZXJsYXlUcmlnZ2VyQXR0cmlidXRlcyxcbiAgc2V0QXJpYU92ZXJsYXlUcmlnZ2VyQXR0cmlidXRlcyxcbn0gZnJvbSAnLi4vLi4vY29yZS9vdmVybGF5LmpzJztcbmltcG9ydCB0eXBlIHsgU2JiTWVudUJ1dHRvbkVsZW1lbnQgfSBmcm9tICcuLi9tZW51LWJ1dHRvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IFNiYk1lbnVMaW5rRWxlbWVudCB9IGZyb20gJy4uL21lbnUtbGluay5qcyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL21lbnUuc2Nzcz9saXQmaW5saW5lJztcblxuY29uc3QgTUVOVV9PRkZTRVQgPSA4O1xuY29uc3QgSU5URVJBQ1RJVkVfRUxFTUVOVFMgPSBbXG4gICdBJyxcbiAgJ0JVVFRPTicsXG4gICdTQkItQlVUVE9OJyxcbiAgJ1NCQi1CVVRUT04tTElOSycsXG4gICdTQkItTElOSycsXG4gICdTQkItQkxPQ0stTElOSycsXG4gICdTQkItTElOSy1CVVRUT04nLFxuICAnU0JCLUJMT0NLLUxJTkstQlVUVE9OJyxcbl07XG5cbmxldCBuZXh0SWQgPSAwO1xuXG4vKipcbiAqIEl0IGRpc3BsYXlzIGEgY29udGV4dHVhbCBtZW51IHdpdGggb25lIG9yIG1vcmUgYWN0aW9uIGVsZW1lbnQuXG4gKlxuICogQHNsb3QgLSBVc2UgdGhlIHVubmFtZWQgc2xvdCB0byBhZGQgYHNiYi1tZW51LWJ1dHRvbmAvYHNiYi1tZW51LWxpbmtgIG9yIG90aGVyIGVsZW1lbnRzIHRvIHRoZSBtZW51LlxuICogQGNzc3Byb3AgWy0tc2JiLW1lbnUtei1pbmRleD12YXIoLS1zYmItb3ZlcmxheS1kZWZhdWx0LXotaW5kZXgpXSAtIFRvIHNwZWNpZnkgYSBjdXN0b20gc3RhY2sgb3JkZXIsXG4gKiB0aGUgYHotaW5kZXhgIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlZmluaW5nIHRoaXMgQ1NTIHZhcmlhYmxlLiBUaGUgZGVmYXVsdCBgei1pbmRleGAgb2YgdGhlXG4gKiBjb21wb25lbnQgaXMgc2V0IHRvIGB2YXIoLS1zYmItb3ZlcmxheS1kZWZhdWx0LXotaW5kZXgpYCB3aXRoIGEgdmFsdWUgb2YgYDEwMDBgLlxuICovXG5leHBvcnRcbkBjdXN0b21FbGVtZW50KCdzYmItbWVudScpXG5jbGFzcyBTYmJNZW51RWxlbWVudCBleHRlbmRzIFNiYk5hbWVkU2xvdExpc3RNaXhpbjxcbiAgU2JiTWVudUJ1dHRvbkVsZW1lbnQgfCBTYmJNZW51TGlua0VsZW1lbnQsXG4gIHR5cGVvZiBTYmJPcGVuQ2xvc2VCYXNlRWxlbWVudFxuPihTYmJPcGVuQ2xvc2VCYXNlRWxlbWVudCkge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZTtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSByb2xlID0gJ21lbnUnO1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVhZG9ubHkgbGlzdENoaWxkTG9jYWxOYW1lcyA9IFsnc2JiLW1lbnUtYnV0dG9uJywgJ3NiYi1tZW51LWxpbmsnXTtcblxuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIG1lbnUgb3ZlcmxheS5cbiAgICpcbiAgICogRm9yIGF0dHJpYnV0ZSB1c2FnZSwgcHJvdmlkZSBhbiBpZCByZWZlcmVuY2UuXG4gICAqL1xuICBAaWRSZWZlcmVuY2UoKVxuICBAcHJvcGVydHkoKVxuICBwdWJsaWMgYWNjZXNzb3IgdHJpZ2dlcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogVGhpcyB3aWxsIGJlIGZvcndhcmRlZCBhcyBhcmlhLWxhYmVsIHRvIHRoZSBpbm5lciBsaXN0LlxuICAgKiBVc2VkIG9ubHkgaWYgdGhlIG1lbnUgYXV0b21hdGljYWxseSByZW5kZXJzIHRoZSBhY3Rpb25zIGluc2lkZSBhcyBhIGxpc3QuXG4gICAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnbGlzdC1hY2Nlc3NpYmlsaXR5LWxhYmVsJyB9KVxuICBwdWJsaWMgYWNjZXNzb3IgbGlzdEFjY2Vzc2liaWxpdHlMYWJlbDogc3RyaW5nID0gJyc7XG5cbiAgcHJpdmF0ZSBfbWVudSE6IEhUTUxEaXZFbGVtZW50O1xuICBwcml2YXRlIF90cmlnZ2VyRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfdHJpZ2dlckFib3J0Q29udHJvbGxlciE6IEFib3J0Q29udHJvbGxlcjtcbiAgcHJpdmF0ZSBfaXNQb2ludGVyRG93bkV2ZW50T25NZW51OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3dpbmRvd0V2ZW50c0NvbnRyb2xsZXIhOiBBYm9ydENvbnRyb2xsZXI7XG4gIHByaXZhdGUgX2VzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyID0gbmV3IFNiYkVzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9mb2N1c1RyYXBDb250cm9sbGVyID0gbmV3IFNiYkZvY3VzVHJhcENvbnRyb2xsZXIodGhpcyk7XG4gIHByaXZhdGUgX3Njcm9sbEhhbmRsZXIgPSBuZXcgU2JiU2Nyb2xsSGFuZGxlcigpO1xuICBwcml2YXRlIF9pbmVydENvbnRyb2xsZXIgPSBuZXcgU2JiSW5lcnRDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9tZWRpYU1hdGNoZXIgPSBuZXcgU2JiTWVkaWFNYXRjaGVyQ29udHJvbGxlcih0aGlzLCB7XG4gICAgW1NiYk1lZGlhUXVlcnlCcmVha3BvaW50U21hbGxBbmRCZWxvd106IChtYXRjaGVzKSA9PiB7XG4gICAgICBpZiAobWF0Y2hlcyAmJiAodGhpcy5zdGF0ZSA9PT0gJ29wZW5pbmcnIHx8IHRoaXMuc3RhdGUgPT09ICdvcGVuZWQnKSkge1xuICAgICAgICB0aGlzLl9zY3JvbGxIYW5kbGVyLmRpc2FibGVTY3JvbGwoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3Njcm9sbEhhbmRsZXIuZW5hYmxlU2Nyb2xsKCk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG4gIHByaXZhdGUgX2RhcmtNb2RlQ29udHJvbGxlciA9IG5ldyBTYmJEYXJrTW9kZUNvbnRyb2xsZXIodGhpcywgKCkgPT4gdGhpcy5fc3luY05lZ2F0aXZlKCkpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKCdjbGljaycsIChlKSA9PiB0aGlzLl9vbkNsaWNrKGUpKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/Ligna2V5ZG93bicsIChlKSA9PiB0aGlzLl9oYW5kbGVLZXlEb3duKGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgbWVudSBvbiB0cmlnZ2VyIGNsaWNrLlxuICAgKi9cbiAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdjbG9zaW5nJyB8fCAhdGhpcy5fbWVudSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZGlzcGF0Y2hCZWZvcmVPcGVuRXZlbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd1BvcG92ZXI/LigpO1xuICAgIHRoaXMuc3RhdGUgPSAnb3BlbmluZyc7XG4gICAgdGhpcy5fc2V0TWVudVBvc2l0aW9uKCk7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG5cbiAgICAvLyBGcm9tIHplcm8gdG8gbWVkaXVtLCBkaXNhYmxlIHNjcm9sbFxuICAgIGlmICh0aGlzLl9tZWRpYU1hdGNoZXIubWF0Y2hlcyhTYmJNZWRpYVF1ZXJ5QnJlYWtwb2ludFNtYWxsQW5kQmVsb3cpKSB7XG4gICAgICB0aGlzLl9zY3JvbGxIYW5kbGVyLmRpc2FibGVTY3JvbGwoKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgYW5pbWF0aW9uIGR1cmF0aW9uIGlzIHplcm8sIHRoZSBhbmltYXRpb25lbmQgZXZlbnQgaXMgbm90IGFsd2F5cyBmaXJlZCByZWxpYWJseS5cbiAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgZGlyZWN0bHkgc2V0IHRoZSBgb3BlbmVkYCBzdGF0ZS5cbiAgICBpZiAodGhpcy5faXNaZXJvQW5pbWF0aW9uRHVyYXRpb24oKSkge1xuICAgICAgdGhpcy5faGFuZGxlT3BlbmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIG1lbnUuXG4gICAqL1xuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdvcGVuaW5nJyB8fCAhdGhpcy5kaXNwYXRjaEJlZm9yZUNsb3NlRXZlbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSAnY2xvc2luZyc7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuXG4gICAgLy8gSWYgdGhlIGFuaW1hdGlvbiBkdXJhdGlvbiBpcyB6ZXJvLCB0aGUgYW5pbWF0aW9uZW5kIGV2ZW50IGlzIG5vdCBhbHdheXMgZmlyZWQgcmVsaWFibHkuXG4gICAgLy8gSW4gdGhpcyBjYXNlIHdlIGRpcmVjdGx5IHNldCB0aGUgYGNsb3NlZGAgc3RhdGUuXG4gICAgaWYgKHRoaXMuX2lzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKCkpIHtcbiAgICAgIHRoaXMuX2hhbmRsZUNsb3NpbmcoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pc1plcm9BbmltYXRpb25EdXJhdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNaZXJvQW5pbWF0aW9uRHVyYXRpb24odGhpcywgJy0tc2JiLW1lbnUtYW5pbWF0aW9uLWR1cmF0aW9uJyk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVPcGVuaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUgPSAnb3BlbmVkJztcbiAgICB0aGlzLl9pbmVydENvbnRyb2xsZXIuYWN0aXZhdGUoKTtcbiAgICB0aGlzLl9lc2NhcGFibGVPdmVybGF5Q29udHJvbGxlci5jb25uZWN0KCk7XG4gICAgdGhpcy5fZm9jdXNUcmFwQ29udHJvbGxlci5mb2N1c0luaXRpYWxFbGVtZW50KCk7XG4gICAgdGhpcy5fZm9jdXNUcmFwQ29udHJvbGxlci5lbmFibGVkID0gdHJ1ZTtcbiAgICB0aGlzLl9hdHRhY2hXaW5kb3dFdmVudHMoKTtcbiAgICB0aGlzLmRpc3BhdGNoT3BlbkV2ZW50KCk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVDbG9zaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUgPSAnY2xvc2VkJztcbiAgICB0aGlzLmhpZGVQb3BvdmVyPy4oKTtcblxuICAgIHRoaXMuX21lbnU/LmZpcnN0RWxlbWVudENoaWxkPy5zY3JvbGxUbygwLCAwKTtcbiAgICB0aGlzLl9pbmVydENvbnRyb2xsZXIuZGVhY3RpdmF0ZSgpO1xuICAgIC8vIE1hbnVhbGx5IGZvY3VzIGxhc3QgZm9jdXNlZCBlbGVtZW50XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQ/LmZvY3VzKHtcbiAgICAgIC8vIFdoZW4gaW5zaWRlIHRoZSBzYmItaGVhZGVyLCB3ZSBwcmV2ZW50IHRoZSBzY3JvbGwgdG8gYXZvaWQgdGhlIHNuYXBwaW5nIHRvIHRoZSB0b3Agb2YgdGhlIHBhZ2VcbiAgICAgIHByZXZlbnRTY3JvbGw6XG4gICAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LmxvY2FsTmFtZSA9PT0gJ3NiYi1oZWFkZXItYnV0dG9uJyB8fFxuICAgICAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5sb2NhbE5hbWUgPT09ICdzYmItaGVhZGVyLWxpbmsnLFxuICAgIH0pO1xuICAgIHRoaXMuX2VzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyLmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLmRpc3BhdGNoQ2xvc2VFdmVudCgpO1xuICAgIHRoaXMuX3dpbmRvd0V2ZW50c0NvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgdGhpcy5fZm9jdXNUcmFwQ29udHJvbGxlci5lbmFibGVkID0gZmFsc2U7XG5cbiAgICAvLyBTdGFydGluZyBmcm9tIGJyZWFrcG9pbnQgbWVkaXVtLCBlbmFibGUgc2Nyb2xsXG4gICAgdGhpcy5fc2Nyb2xsSGFuZGxlci5lbmFibGVTY3JvbGwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGNsaWNrIGFuZCBjaGVja3MgaWYgaXRzIHRhcmdldCBpcyBhIHNiYi1tZW51LWJ1dHRvbi9zYmItbWVudS1saW5rLlxuICAgKi9cbiAgcHJpdmF0ZSBfb25DbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRhcmdldD8ubG9jYWxOYW1lID09PSAnc2JiLW1lbnUtYnV0dG9uJyB8fCB0YXJnZXQ/LmxvY2FsTmFtZSA9PT0gJ3NiYi1tZW51LWxpbmsnKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlS2V5RG93bihldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIWlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgZW5hYmxlZEFjdGlvbnM6IEVsZW1lbnRbXSA9IEFycmF5LmZyb20oXG4gICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGw8U2JiTWVudUJ1dHRvbkVsZW1lbnQgfCBTYmJNZW51TGlua0VsZW1lbnQ+KFxuICAgICAgICAnc2JiLW1lbnUtYnV0dG9uLCBzYmItbWVudS1saW5rJyxcbiAgICAgICksXG4gICAgKS5maWx0ZXIoXG4gICAgICAoZWwpID0+ICghZWwuZGlzYWJsZWQgfHwgZWwuZGlzYWJsZWRJbnRlcmFjdGl2ZSkgJiYgaW50ZXJhY3Rpdml0eUNoZWNrZXIuaXNWaXNpYmxlKGVsKSxcbiAgICApO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBlbmFibGVkQWN0aW9ucy5maW5kSW5kZXgoKGU6IEVsZW1lbnQpID0+IGUgPT09IGV2dC50YXJnZXQpO1xuXG4gICAgbGV0IG5leHRJbmRleDtcbiAgICBzd2l0Y2ggKGV2dC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgbmV4dEluZGV4ID0gZ2V0TmV4dEVsZW1lbnRJbmRleChldnQsIGN1cnJlbnQsIGVuYWJsZWRBY3Rpb25zLmxlbmd0aCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdQYWdlVXAnOlxuICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICAgIG5leHRJbmRleCA9IDA7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFbmQnOlxuICAgICAgY2FzZSAnUGFnZURvd24nOlxuICAgICAgICBuZXh0SW5kZXggPSBlbmFibGVkQWN0aW9ucy5sZW5ndGggLSAxO1xuICAgICAgICBicmVhaztcblxuICAgICAgLy8gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIHNpbmNlIGFsbCB0aGUgY2FzZSBhbGxvd2VkIGJ5IGBpc0Fycm93S2V5T3JQYWdlS2V5c1ByZXNzZWRgIHNob3VsZCBiZSBjb3ZlcmVkXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBuZXh0SW5kZXggPSAwO1xuICAgIH1cblxuICAgIChlbmFibGVkQWN0aW9uc1tuZXh0SW5kZXhdIGFzIEhUTUxFbGVtZW50KS5mb2N1cygpO1xuICB9XG5cbiAgLy8gUmVtb3ZlcyB0cmlnZ2VyIGNsaWNrIGxpc3RlbmVyIG9uIHRyaWdnZXIgY2hhbmdlLlxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY3JlYXRlUmVuZGVyUm9vdCgpOiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IHJlbmRlclJvb3QgPSBzdXBlci5jcmVhdGVSZW5kZXJSb290KCk7XG4gICAgLy8gRHVlIHRvIHRoZSBmYWN0IHRoYXQgbWVudSBjYW4gYm90aCBiZSBhIGxpc3QgYW5kIGp1c3QgYSBjb250YWluZXIsIHdlIG5lZWQgdG8gY2hlY2sgaXRzXG4gICAgLy8gc3RhdGUgYmVmb3JlIHRoZSBTYmJOYW1lZFNsb3RMaXN0TWl4aW4gaGFuZGxlcyB0aGUgc2xvdGNoYW5nZSBldmVudCwgaW4gb3JkZXIgdG8gYXZvaWRcbiAgICAvLyBpdCBpbnRlcnByZXRpbmcgdGhlIG5vbiBsaXN0IGNhc2UgYXMgYSBsaXN0LlxuICAgIHRoaXMuc2hhZG93Um9vdD8uYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICdzbG90Y2hhbmdlJyxcbiAgICAgIChlKSA9PiB7XG4gICAgICAgIHRoaXMuX3N5bmNOZWdhdGl2ZSgpO1xuICAgICAgICB0aGlzLl9jaGVja0xpc3RDYXNlKGUpO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gcmVuZGVyUm9vdDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLnBvcG92ZXIgPSAnbWFudWFsJztcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuaWQgfHw9IGBzYmItbWVudS0ke25leHRJZCsrfWA7XG4gICAgaWYgKHRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgdGhpcy5fY29uZmlndXJlVHJpZ2dlcigpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50ID0gbnVsbDtcbiAgICB0aGlzLl90cmlnZ2VyQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHRoaXMuX3dpbmRvd0V2ZW50c0NvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgdGhpcy5fc2Nyb2xsSGFuZGxlci5lbmFibGVTY3JvbGwoKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSByZXF1ZXN0VXBkYXRlKFxuICAgIG5hbWU/OiBQcm9wZXJ0eUtleSxcbiAgICBvbGRWYWx1ZT86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFByb3BlcnR5RGVjbGFyYXRpb24sXG4gICk6IHZvaWQge1xuICAgIHN1cGVyLnJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuXG4gICAgaWYgKCFpc1NlcnZlciAmJiAoIW5hbWUgfHwgbmFtZSA9PT0gJ3RyaWdnZXInKSAmJiB0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgIHRoaXMuX2NvbmZpZ3VyZVRyaWdnZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgdGhpcy5fY29uZmlndXJlVHJpZ2dlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2hlY2tMaXN0Q2FzZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBJZiBhbGwgY2hpbGRyZW4gYXJlIHNiYi1tZW51LWJ1dHRvbi9tZW51LWxpbmsgaW5zdGFuY2VzLCB3ZSByZW5kZXIgdGhlbSBhcyBhIGxpc3QuXG4gICAgaWYgKFxuICAgICAgdGhpcy5jaGlsZHJlbj8ubGVuZ3RoICYmXG4gICAgICBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4gPz8gW10pLmV2ZXJ5KFxuICAgICAgICAoYykgPT4gYy5sb2NhbE5hbWUgPT09ICdzYmItbWVudS1idXR0b24nIHx8IGMubG9jYWxOYW1lID09PSAnc2JiLW1lbnUtbGluaycsXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMubGlzdENoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgdGhpcy5saXN0Q2hpbGRyZW4uZm9yRWFjaCgoYykgPT4gYy5yZW1vdmVBdHRyaWJ1dGUoJ3Nsb3QnKSk7XG4gICAgICB0aGlzLmxpc3RDaGlsZHJlbiA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGlmIHRoZSB0cmlnZ2VyIGlzIHZhbGlkIGFuZCBhdHRhY2ggY2xpY2sgZXZlbnQgbGlzdGVuZXJzLlxuICBwcml2YXRlIF9jb25maWd1cmVUcmlnZ2VyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRyaWdnZXIgPT09IHRoaXMuX3RyaWdnZXJFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fdHJpZ2dlckFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICByZW1vdmVBcmlhT3ZlcmxheVRyaWdnZXJBdHRyaWJ1dGVzKHRoaXMuX3RyaWdnZXJFbGVtZW50KTtcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudCA9IHRoaXMudHJpZ2dlcjtcblxuICAgIGlmICghdGhpcy5fdHJpZ2dlckVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZXRBcmlhT3ZlcmxheVRyaWdnZXJBdHRyaWJ1dGVzKHRoaXMuX3RyaWdnZXJFbGVtZW50LCAnbWVudScsIHRoaXMuaWQsIHRoaXMuc3RhdGUpO1xuICAgIHRoaXMuX3RyaWdnZXJBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLm9wZW4oKSwge1xuICAgICAgc2lnbmFsOiB0aGlzLl90cmlnZ2VyQWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2F0dGFjaFdpbmRvd0V2ZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLl93aW5kb3dFdmVudHNDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHRoaXMuX3NldE1lbnVQb3NpdGlvbigpLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgc2lnbmFsOiB0aGlzLl93aW5kb3dFdmVudHNDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgIC8vIFdpdGhvdXQgY2FwdHVyZSwgb3RoZXIgc2Nyb2xsIGNvbnRleHRzIHdvdWxkIG5vdCBidWJibGUgdG8gdGhpcyBldmVudCBsaXN0ZW5lci5cbiAgICAgIC8vIENhcHR1cmUgYWxsb3dzIHVzIHRvIHJlYWN0IHRvIGFsbCBzY3JvbGwgY29udGV4dHMgaW4gdGhpcyBET00uXG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLl9zZXRNZW51UG9zaXRpb24oKSwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgIHNpZ25hbDogdGhpcy5fd2luZG93RXZlbnRzQ29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgLy8gQ2xvc2UgbWVudSBvbiBiYWNrZHJvcCBjbGlja1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMuX3BvaW50ZXJEb3duTGlzdGVuZXIsIHtcbiAgICAgIHNpZ25hbDogdGhpcy5fd2luZG93RXZlbnRzQ29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMuX2Nsb3NlT25CYWNrZHJvcENsaWNrLCB7XG4gICAgICBzaWduYWw6IHRoaXMuX3dpbmRvd0V2ZW50c0NvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gQ2xvc2UgbWVudSBhdCBhbnkgY2xpY2sgb24gYW4gaW50ZXJhY3RpdmUgZWxlbWVudCBpbnNpZGUgdGhlIDxzYmItbWVudT4gdGhhdCBidWJibGVzIHRvIHRoZSBjb250YWluZXIuXG4gIHByaXZhdGUgX2Nsb3NlT25JbnRlcmFjdGl2ZUVsZW1lbnRDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKElOVEVSQUNUSVZFX0VMRU1FTlRTLmluY2x1ZGVzKHRhcmdldC5ub2RlTmFtZSkgJiYgIXRhcmdldC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGUgcG9pbnRlcmRvd24gZXZlbnQgdGFyZ2V0IGlzIHRyaWdnZXJlZCBvbiB0aGUgbWVudS5cbiAgcHJpdmF0ZSBfcG9pbnRlckRvd25MaXN0ZW5lciA9IChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgdGhpcy5faXNQb2ludGVyRG93bkV2ZW50T25NZW51ID0gaXNFdmVudE9uRWxlbWVudCh0aGlzLl9tZW51LCBldmVudCk7XG4gIH07XG5cbiAgLy8gQ2xvc2UgbWVudSBvbiBiYWNrZHJvcCBjbGljay5cbiAgcHJpdmF0ZSBfY2xvc2VPbkJhY2tkcm9wQ2xpY2sgPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmICghdGhpcy5faXNQb2ludGVyRG93bkV2ZW50T25NZW51ICYmICFpc0V2ZW50T25FbGVtZW50KHRoaXMuX21lbnUsIGV2ZW50KSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfTtcblxuICAvLyBTZXQgbWVudSBwb3NpdGlvbiAoeCwgeSkgdG8gJzAnIG9uY2UgdGhlIG1lbnUgaXMgY2xvc2VkIGFuZCB0aGUgdHJhbnNpdGlvbiBlbmRlZCB0byBwcmV2ZW50IHRoZVxuICAvLyB2aWV3cG9ydCBmcm9tIG92ZXJmbG93aW5nLiBBbmQgc2V0IHRoZSBmb2N1cyB0byB0aGUgZmlyc3QgZm9jdXNhYmxlIGVsZW1lbnQgb25jZSB0aGUgbWVudSBpcyBvcGVuLlxuICAvLyBJbiByYXJlIGNhc2VzIGl0IGNhbiBiZSB0aGF0IHRoZSBhbmltYXRpb25FbmQgZXZlbnQgaXMgdHJpZ2dlcmVkIHR3aWNlLlxuICAvLyBUbyBhdm9pZCBlbnRlcmluZyBhIGNvcnJ1cHQgc3RhdGUsIGV4aXQgd2hlbiBzdGF0ZSBpcyBub3QgZXhwZWN0ZWQuXG4gIHByaXZhdGUgX29uTWVudUFuaW1hdGlvbkVuZChldmVudDogQW5pbWF0aW9uRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ29wZW4nICYmIHRoaXMuc3RhdGUgPT09ICdvcGVuaW5nJykge1xuICAgICAgdGhpcy5faGFuZGxlT3BlbmluZygpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ2Nsb3NlJyAmJiB0aGlzLnN0YXRlID09PSAnY2xvc2luZycpIHtcbiAgICAgIHRoaXMuX2hhbmRsZUNsb3NpbmcoKTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXQgbWVudSBwb3NpdGlvbiBhbmQgbWF4IGhlaWdodCBpZiB0aGUgYnJlYWtwb2ludCBpcyBtZWRpdW0tdWx0cmEuXG4gIHByaXZhdGUgX3NldE1lbnVQb3NpdGlvbigpOiB2b2lkIHtcbiAgICAvLyBTdGFydGluZyBmcm9tIGJyZWFrcG9pbnQgbWVkaXVtXG4gICAgaWYgKFxuICAgICAgKHRoaXMuX21lZGlhTWF0Y2hlci5tYXRjaGVzKFNiYk1lZGlhUXVlcnlCcmVha3BvaW50U21hbGxBbmRCZWxvdykgPz8gdHJ1ZSkgfHxcbiAgICAgICF0aGlzLl9tZW51IHx8XG4gICAgICAhdGhpcy5fdHJpZ2dlckVsZW1lbnQgfHxcbiAgICAgIHRoaXMuc3RhdGUgPT09ICdjbG9zaW5nJ1xuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1lbnVQb3NpdGlvbiA9IGdldEVsZW1lbnRQb3NpdGlvbihcbiAgICAgIHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvcignLnNiYi1tZW51X19jb250ZW50JykhLFxuICAgICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQsXG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoJy5zYmItbWVudV9fY29udGFpbmVyJykhLFxuICAgICAge1xuICAgICAgICB2ZXJ0aWNhbE9mZnNldDogTUVOVV9PRkZTRVQsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLXNiYi1tZW51LXBvc2l0aW9uLXgnLCBgJHttZW51UG9zaXRpb24ubGVmdH1weGApO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tc2JiLW1lbnUtcG9zaXRpb24teScsIGAke21lbnVQb3NpdGlvbi50b3B9cHhgKTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLXNiYi1tZW51LW1heC1oZWlnaHQnLCBtZW51UG9zaXRpb24ubWF4SGVpZ2h0KTtcbiAgfVxuXG4gIHByaXZhdGUgX3N5bmNOZWdhdGl2ZSgpOiB2b2lkIHtcbiAgICAvLyBMaW5rcyBhbmQgYnV0dG9ucyBhcmUgdGhlIG1vc3QgZXhwZWN0ZWQgY29udGVudHMgd2hpY2ggaGF2ZSBhIG5lZ2F0aXZlIHByb3BlcnR5XG4gICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1zYmItbGlua10sIFtkYXRhLXNiYi1idXR0b25dJyk/LmZvckVhY2goKGVsOiBFbGVtZW50KSA9PiB7XG4gICAgICBjdXN0b21FbGVtZW50cy51cGdyYWRlKGVsKTtcbiAgICAgIChlbCBhcyBFbGVtZW50ICYgU2JiTmVnYXRpdmVNaXhpblR5cGUpLm5lZ2F0aXZlID0gIXRoaXMuX2RhcmtNb2RlQ29udHJvbGxlci5tYXRjaGVzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICAvLyBUT0RPOiBIYW5kbGUgY2FzZSB3aXRoIG90aGVyIGVsZW1lbnRzIHRoYW4gc2JiLW1lbnUtYnV0dG9uL3NiYi1tZW51LWxpbmsuXG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLW1lbnVfX2NvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgQGFuaW1hdGlvbmVuZD0ke3RoaXMuX29uTWVudUFuaW1hdGlvbkVuZH1cbiAgICAgICAgICBjbGFzcz1cInNiYi1tZW51XCJcbiAgICAgICAgICAke3JlZigoZWw/OiBFbGVtZW50KSA9PiAodGhpcy5fbWVudSA9IGVsIGFzIEhUTUxEaXZFbGVtZW50KSl9XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBAY2xpY2s9JHsoZXZlbnQ6IEV2ZW50KSA9PiB0aGlzLl9jbG9zZU9uSW50ZXJhY3RpdmVFbGVtZW50Q2xpY2soZXZlbnQpfVxuICAgICAgICAgICAgQHNjcm9sbD0keyhlOiBFdmVudCkgPT4gZm9yd2FyZEV2ZW50KGUsIGRvY3VtZW50KX1cbiAgICAgICAgICAgIGNsYXNzPVwic2JiLW1lbnVfX2NvbnRlbnRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgICR7dGhpcy5saXN0Q2hpbGRyZW4ubGVuZ3RoXG4gICAgICAgICAgICAgID8gdGhpcy5yZW5kZXJMaXN0KHsgY2xhc3M6ICdzYmItbWVudS1saXN0JywgYXJpYUxhYmVsOiB0aGlzLmxpc3RBY2Nlc3NpYmlsaXR5TGFiZWwgfSlcbiAgICAgICAgICAgICAgOiBodG1sYDxzbG90Pjwvc2xvdD5gfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgJ3NiYi1tZW51JzogU2JiTWVudUVsZW1lbnQ7XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0NBLE1BQU0sY0FBYztBQUNwQixNQUFNLHVCQUF1QjtBQUFBLEVBQzNCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTs7QUFHRixJQUFJLFNBQVM7SUFZUCxrQkFBYyxNQUFBOzswQkFEbkIsY0FBYyxVQUFVLENBQUM7Ozs7b0JBQ0csc0JBRzNCLHVCQUF1Qjs7Ozs7OztBQUhKLEVBQUEsbUJBQVEsWUFHSDtBQUFBLElBMEN4QixjQUFBO0FBQ0UsWUFBQTtBQS9CRjtBQVFBO0FB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
|
|
731
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy9tZW51L21lbnUvbWVudS5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBDU1NSZXN1bHRHcm91cCxcbiAgaHRtbCxcbiAgaXNTZXJ2ZXIsXG4gIHR5cGUgUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgdHlwZSBQcm9wZXJ0eVZhbHVlcyxcbiAgdHlwZSBUZW1wbGF0ZVJlc3VsdCxcbn0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcblxuaW1wb3J0IHtcbiAgZ2V0TmV4dEVsZW1lbnRJbmRleCxcbiAgaW50ZXJhY3Rpdml0eUNoZWNrZXIsXG4gIGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZCxcbiAgU2JiRm9jdXNUcmFwQ29udHJvbGxlcixcbn0gZnJvbSAnLi4vLi4vY29yZS9hMTF5LmpzJztcbmltcG9ydCB7IFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50IH0gZnJvbSAnLi4vLi4vY29yZS9iYXNlLWVsZW1lbnRzLmpzJztcbmltcG9ydCB7XG4gIFNiYkRhcmtNb2RlQ29udHJvbGxlcixcbiAgU2JiRXNjYXBhYmxlT3ZlcmxheUNvbnRyb2xsZXIsXG4gIFNiYkluZXJ0Q29udHJvbGxlcixcbiAgU2JiTGFuZ3VhZ2VDb250cm9sbGVyLFxuICBTYmJNZWRpYU1hdGNoZXJDb250cm9sbGVyLFxuICBTYmJNZWRpYVF1ZXJ5QnJlYWtwb2ludFNtYWxsQW5kQmVsb3csXG59IGZyb20gJy4uLy4uL2NvcmUvY29udHJvbGxlcnMuanMnO1xuaW1wb3J0IHsgZm9yY2VUeXBlLCBpZFJlZmVyZW5jZSB9IGZyb20gJy4uLy4uL2NvcmUvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBpc1plcm9BbmltYXRpb25EdXJhdGlvbiwgU2JiU2Nyb2xsSGFuZGxlciB9IGZyb20gJy4uLy4uL2NvcmUvZG9tLmpzJztcbmltcG9ydCB7IGZvcndhcmRFdmVudCB9IGZyb20gJy4uLy4uL2NvcmUvZXZlbnRpbmcuanMnO1xuaW1wb3J0IHsgaTE4bkdvQmFjayB9IGZyb20gJy4uLy4uL2NvcmUvaTE4bi9pMThuLmpzJztcbmltcG9ydCB7IFNiYk5hbWVkU2xvdExpc3RNaXhpbiwgdHlwZSBTYmJOZWdhdGl2ZU1peGluVHlwZSB9IGZyb20gJy4uLy4uL2NvcmUvbWl4aW5zLmpzJztcbmltcG9ydCB7XG4gIGdldEVsZW1lbnRQb3NpdGlvbixcbiAgZ2V0RWxlbWVudFBvc2l0aW9uSG9yaXpvbnRhbCxcbiAgaXNFdmVudE9uRWxlbWVudCxcbiAgcmVtb3ZlQXJpYU92ZXJsYXlUcmlnZ2VyQXR0cmlidXRlcyxcbiAgc2V0QXJpYU92ZXJsYXlUcmlnZ2VyQXR0cmlidXRlcyxcbn0gZnJvbSAnLi4vLi4vY29yZS9vdmVybGF5LmpzJztcbmltcG9ydCB0eXBlIHsgU2JiTWVudUJ1dHRvbkVsZW1lbnQgfSBmcm9tICcuLi9tZW51LWJ1dHRvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IFNiYk1lbnVMaW5rRWxlbWVudCB9IGZyb20gJy4uL21lbnUtbGluay9tZW51LWxpbmsuY29tcG9uZW50LmpzJztcblxuaW1wb3J0IHN0eWxlIGZyb20gJy4vbWVudS5zY3NzP2xpdCZpbmxpbmUnO1xuXG5pbXBvcnQgJy4uLy4uL2RpdmlkZXIuanMnO1xuaW1wb3J0ICcuLi9tZW51LWJ1dHRvbi5qcyc7XG5cbmNvbnN0IE1FTlVfT0ZGU0VUID0gODtcbmNvbnN0IE5FU1RFRF9NRU5VX09GRlNFVCA9IC00O1xuY29uc3QgSU5URVJBQ1RJVkVfRUxFTUVOVFMgPSBbXG4gICdBJyxcbiAgJ0JVVFRPTicsXG4gICdTQkItQlVUVE9OJyxcbiAgJ1NCQi1CVVRUT04tTElOSycsXG4gICdTQkItTElOSycsXG4gICdTQkItQkxPQ0stTElOSycsXG4gICdTQkItTElOSy1CVVRUT04nLFxuICAnU0JCLUJMT0NLLUxJTkstQlVUVE9OJyxcbiAgJ1NCQi1NRU5VLUJVVFRPTicsXG4gICdTQkItTUVOVS1MSU5LJyxcbl07XG5cbmxldCBuZXh0SWQgPSAwO1xuXG4vKipcbiAqIEl0IGRpc3BsYXlzIGEgY29udGV4dHVhbCBtZW51IHdpdGggb25lIG9yIG1vcmUgYWN0aW9uIGVsZW1lbnQuXG4gKlxuICogQHNsb3QgLSBVc2UgdGhlIHVubmFtZWQgc2xvdCB0byBhZGQgYHNiYi1tZW51LWJ1dHRvbmAvYHNiYi1tZW51LWxpbmtgIG9yIG90aGVyIGVsZW1lbnRzIHRvIHRoZSBtZW51LlxuICogQGNzc3Byb3AgWy0tc2JiLW1lbnUtei1pbmRleD12YXIoLS1zYmItb3ZlcmxheS1kZWZhdWx0LXotaW5kZXgpXSAtIFRvIHNwZWNpZnkgYSBjdXN0b20gc3RhY2sgb3JkZXIsXG4gKiB0aGUgYHotaW5kZXhgIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlZmluaW5nIHRoaXMgQ1NTIHZhcmlhYmxlLiBUaGUgZGVmYXVsdCBgei1pbmRleGAgb2YgdGhlXG4gKiBjb21wb25lbnQgaXMgc2V0IHRvIGB2YXIoLS1zYmItb3ZlcmxheS1kZWZhdWx0LXotaW5kZXgpYCB3aXRoIGEgdmFsdWUgb2YgYDEwMDBgLlxuICovXG5leHBvcnRcbkBjdXN0b21FbGVtZW50KCdzYmItbWVudScpXG5jbGFzcyBTYmJNZW51RWxlbWVudCBleHRlbmRzIFNiYk5hbWVkU2xvdExpc3RNaXhpbjxcbiAgU2JiTWVudUJ1dHRvbkVsZW1lbnQgfCBTYmJNZW51TGlua0VsZW1lbnQsXG4gIHR5cGVvZiBTYmJPcGVuQ2xvc2VCYXNlRWxlbWVudFxuPihTYmJPcGVuQ2xvc2VCYXNlRWxlbWVudCkge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZTtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSByb2xlID0gJ21lbnUnO1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVhZG9ubHkgbGlzdENoaWxkTG9jYWxOYW1lcyA9IFsnc2JiLW1lbnUtYnV0dG9uJywgJ3NiYi1tZW51LWxpbmsnXTtcblxuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIG1lbnUgb3ZlcmxheS5cbiAgICpcbiAgICogRm9yIGF0dHJpYnV0ZSB1c2FnZSwgcHJvdmlkZSBhbiBpZCByZWZlcmVuY2UuXG4gICAqL1xuICBAaWRSZWZlcmVuY2UoKVxuICBAcHJvcGVydHkoKVxuICBwdWJsaWMgYWNjZXNzb3IgdHJpZ2dlcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogVGhpcyB3aWxsIGJlIGZvcndhcmRlZCBhcyBhcmlhLWxhYmVsIHRvIHRoZSBpbm5lciBsaXN0LlxuICAgKiBVc2VkIG9ubHkgaWYgdGhlIG1lbnUgYXV0b21hdGljYWxseSByZW5kZXJzIHRoZSBhY3Rpb25zIGluc2lkZSBhcyBhIGxpc3QuXG4gICAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnbGlzdC1hY2Nlc3NpYmlsaXR5LWxhYmVsJyB9KVxuICBwdWJsaWMgYWNjZXNzb3IgbGlzdEFjY2Vzc2liaWxpdHlMYWJlbDogc3RyaW5nID0gJyc7XG5cbiAgcHJpdmF0ZSBfbWVudSE6IEhUTUxEaXZFbGVtZW50O1xuICBwcml2YXRlIF90cmlnZ2VyRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfdHJpZ2dlckFib3J0Q29udHJvbGxlciE6IEFib3J0Q29udHJvbGxlcjtcbiAgcHJpdmF0ZSBfaXNQb2ludGVyRG93bkV2ZW50T25NZW51OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3dpbmRvd0V2ZW50c0NvbnRyb2xsZXIhOiBBYm9ydENvbnRyb2xsZXI7XG4gIHByaXZhdGUgX2VzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyID0gbmV3IFNiYkVzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9mb2N1c1RyYXBDb250cm9sbGVyID0gbmV3IFNiYkZvY3VzVHJhcENvbnRyb2xsZXIodGhpcyk7XG4gIHByaXZhdGUgX3Njcm9sbEhhbmRsZXIgPSBuZXcgU2JiU2Nyb2xsSGFuZGxlcigpO1xuICBwcml2YXRlIF9pbmVydENvbnRyb2xsZXIgPSBuZXcgU2JiSW5lcnRDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9tb2JpbGVCcmVha3BvaW50ID0gU2JiTWVkaWFRdWVyeUJyZWFrcG9pbnRTbWFsbEFuZEJlbG93O1xuICBwcml2YXRlIF9tZWRpYU1hdGNoZXIgPSBuZXcgU2JiTWVkaWFNYXRjaGVyQ29udHJvbGxlcih0aGlzLCB7XG4gICAgW3RoaXMuX21vYmlsZUJyZWFrcG9pbnRdOiAobWF0Y2hlcykgPT4ge1xuICAgICAgaWYgKG1hdGNoZXMgJiYgKHRoaXMuc3RhdGUgPT09ICdvcGVuaW5nJyB8fCB0aGlzLnN0YXRlID09PSAnb3BlbmVkJykpIHtcbiAgICAgICAgdGhpcy5fc2Nyb2xsSGFuZGxlci5kaXNhYmxlU2Nyb2xsKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zY3JvbGxIYW5kbGVyLmVuYWJsZVNjcm9sbCgpO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xuICBwcml2YXRlIF9kYXJrTW9kZUNvbnRyb2xsZXIgPSBuZXcgU2JiRGFya01vZGVDb250cm9sbGVyKHRoaXMsICgpID0+IHRoaXMuX3N5bmNOZWdhdGl2ZSgpKTtcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2UgPSBuZXcgU2JiTGFuZ3VhZ2VDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9uZXN0ZWRNZW51OiBTYmJNZW51RWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKCdrZXlkb3duJywgKGUpID0+IHRoaXMuX2hhbmRsZUtleURvd24oZSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgdGhpcy5fY29uZmlndXJlVHJpZ2dlcigpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGVzY2FwZVN0cmF0ZWd5KCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VBbGwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgbWVudSBvbiB0cmlnZ2VyIGNsaWNrLlxuICAgKi9cbiAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zdGF0ZSA9PT0gJ2Nsb3NpbmcnIHx8XG4gICAgICB0aGlzLnN0YXRlID09PSAnb3BlbmVkJyB8fFxuICAgICAgIXRoaXMuX21lbnUgfHxcbiAgICAgICF0aGlzLmRpc3BhdGNoQmVmb3JlT3BlbkV2ZW50KClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5faXNOZXN0ZWQoKSkge1xuICAgICAgY29uc3QgcGFyZW50TWVudSA9IHRoaXMuX3BhcmVudE1lbnUoKSE7XG4gICAgICBwYXJlbnRNZW51LnRvZ2dsZVN0YXRlKCduZXN0ZWQtY2hpbGQnLCB0cnVlKTtcblxuICAgICAgLy8gSW4gY2FzZSB3ZSBjaGFuZ2UgYmV0d2VlbiBhcnJvdyBrZXkgbmF2aWdhdGlvbiBhbmQgbW91c2UgbmF2aWdhdGlvbiwgaXQgY2FuIGJlIHRoYXQgYW5vdGhlclxuICAgICAgLy8gbmVzdGVkIHBhcmVudCBtZW51IGlzIHN0aWxsIG9wZW4uIFdlIGhhdmUgdG8gY2xvc2UgaXQuXG4gICAgICBpZiAocGFyZW50TWVudS5fbmVzdGVkTWVudSAhPT0gdGhpcykge1xuICAgICAgICBwYXJlbnRNZW51Ll9uZXN0ZWRNZW51Py5jbG9zZSgpO1xuICAgICAgfVxuICAgICAgcGFyZW50TWVudS5fbmVzdGVkTWVudSA9IHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93UG9wb3Zlcj8uKCk7XG4gICAgdGhpcy5zdGF0ZSA9ICdvcGVuaW5nJztcbiAgICB0aGlzLl9zZXRNZW51UG9zaXRpb24oKTtcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudD8uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcblxuICAgIC8vIEZyb20gemVybyB0byBtZWRpdW0sIGRpc2FibGUgc2Nyb2xsXG4gICAgaWYgKHRoaXMuX2lzTW9iaWxlKCkpIHtcbiAgICAgIHRoaXMuX3Njcm9sbEhhbmRsZXIuZGlzYWJsZVNjcm9sbCgpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBhbmltYXRpb24gZHVyYXRpb24gaXMgemVybywgdGhlIGFuaW1hdGlvbmVuZCBldmVudCBpcyBub3QgYWx3YXlzIGZpcmVkIHJlbGlhYmx5LlxuICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBkaXJlY3RseSBzZXQgdGhlIGBvcGVuZWRgIHN0YXRlLlxuICAgIGlmICh0aGlzLl9pc1plcm9BbmltYXRpb25EdXJhdGlvbigpKSB7XG4gICAgICB0aGlzLl9oYW5kbGVPcGVuaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENsb3NlcyB0aGUgbWVudSBhbmQgYWxsIGl0cyBuZXN0ZWQgbWVudXMuICovXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9jbG9zZSgpO1xuICB9XG5cbiAgLyoqIENsb3NlcyB0aGUgbWVudSBhbmQgYWxsIHJlbGF0ZWQgbWVudXMgIG5lc3RlZCBhbmQgcGFyZW50IG1lbnVzKS4gKi9cbiAgcHVibGljIGNsb3NlQWxsKCk6IHZvaWQge1xuICAgIHRoaXMuX21haW5NZW51KCkuX2Nsb3NlKHRydWUpO1xuICB9XG5cbiAgLyoqIEBwYXJhbSBbY2xvc2VBbGw9J2ZhbHNlJ10gLSBJZiB0cnVlLCBpdCBlbnN1cmVzIGFuaW1hdGlvbnMgYXJlIGNvcnJlY3QgYnkgdG9nZ2xpbmcgc29tZSBzdGF0ZXMgd2hlbiBjbG9zaW5nIGFsbCByZWxhdGVkIG1lbnVzIGF0IG9uY2UuICovXG4gIHByaXZhdGUgX2Nsb3NlKGNsb3NlQWxsID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAoKHRoaXMuc3RhdGUgPT09ICdvcGVuaW5nJyAmJiAhdGhpcy5faXNOZXN0ZWQoKSkgfHwgIXRoaXMuZGlzcGF0Y2hCZWZvcmVDbG9zZUV2ZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDbG9zZSBuZXN0ZWQgbWVudXMgZmlyc3RcbiAgICB0aGlzLl9uZXN0ZWRNZW51Py5fY2xvc2UoY2xvc2VBbGwpO1xuXG4gICAgaWYgKHRoaXMuX2lzTmVzdGVkKCkpIHtcbiAgICAgIGNvbnN0IHBhcmVudE1lbnUgPSB0aGlzLl9wYXJlbnRNZW51KCkhO1xuICAgICAgdGhpcy50b2dnbGVTdGF0ZSgnY2xvc2UtYWxsJywgY2xvc2VBbGwpO1xuICAgICAgcGFyZW50TWVudS50b2dnbGVTdGF0ZSgnc2tpcC1hbmltYXRpb24nLCBjbG9zZUFsbCk7XG4gICAgICBwYXJlbnRNZW51LnRvZ2dsZVN0YXRlKCduZXN0ZWQtY2hpbGQnLCBmYWxzZSk7XG4gICAgICBwYXJlbnRNZW51Ll9uZXN0ZWRNZW51ID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0gJ2Nsb3NpbmcnO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcblxuICAgIC8vIElmIHRoZSBhbmltYXRpb24gZHVyYXRpb24gaXMgemVybywgdGhlIGFuaW1hdGlvbmVuZCBldmVudCBpcyBub3QgYWx3YXlzIGZpcmVkIHJlbGlhYmx5LlxuICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBkaXJlY3RseSBzZXQgdGhlIGBjbG9zZWRgIHN0YXRlLlxuICAgIGlmICh0aGlzLl9pc1plcm9BbmltYXRpb25EdXJhdGlvbigpKSB7XG4gICAgICB0aGlzLl9oYW5kbGVDbG9zaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaXNaZXJvQW5pbWF0aW9uRHVyYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKHRoaXMsICctLXNiYi1tZW51LWFuaW1hdGlvbi1kdXJhdGlvbicpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlT3BlbmluZygpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gJ29wZW5lZCc7XG5cbiAgICBpZiAoIXRoaXMuX2lzTmVzdGVkKCkpIHtcbiAgICAgIHRoaXMuX2luZXJ0Q29udHJvbGxlci5hY3RpdmF0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl91cGRhdGVOZXN0ZWRJbmVydCgpO1xuICAgIH1cbiAgICB0aGlzLl9lc2NhcGFibGVPdmVybGF5Q29udHJvbGxlci5jb25uZWN0KCk7XG4gICAgdGhpcy5fZm9jdXNUcmFwQ29udHJvbGxlci5mb2N1c0luaXRpYWxFbGVtZW50KCk7XG4gICAgdGhpcy5fZm9jdXNUcmFwQ29udHJvbGxlci5lbmFibGVkID0gdHJ1ZTtcbiAgICB0aGlzLl9hdHRhY2hXaW5kb3dFdmVudHMoKTtcbiAgICB0aGlzLmRpc3BhdGNoT3BlbkV2ZW50KCk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVDbG9zaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUgPSAnY2xvc2VkJztcbiAgICB0aGlzLnRvZ2dsZVN0YXRlKCdza2lwLWFuaW1hdGlvbicsIGZhbHNlKTtcbiAgICB0aGlzLnRvZ2dsZVN0YXRlKCdjbG9zZS1hbGwnLCBmYWxzZSk7XG4gICAgdGhpcy5oaWRlUG9wb3Zlcj8uKCk7XG5cbiAgICB0aGlzLl9tZW51Py5maXJzdEVsZW1lbnRDaGlsZD8uc2Nyb2xsVG8oMCwgMCk7XG4gICAgaWYgKCF0aGlzLl9pc05lc3RlZCgpKSB7XG4gICAgICB0aGlzLl9pbmVydENvbnRyb2xsZXIuZGVhY3RpdmF0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl91cGRhdGVOZXN0ZWRJbmVydCgpO1xuICAgIH1cbiAgICAvLyBNYW51YWxseSBmb2N1cyBsYXN0IGZvY3VzZWQgZWxlbWVudFxuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50Py5mb2N1cyh7XG4gICAgICAvLyBXaGVuIGluc2lkZSB0aGUgc2JiLWhlYWRlciwgd2UgcHJldmVudCB0aGUgc2Nyb2xsIHRvIGF2b2lkIHRoZSBzbmFwcGluZyB0byB0aGUgdG9wIG9mIHRoZSBwYWdlXG4gICAgICBwcmV2ZW50U2Nyb2xsOiBbJ3NiYi1oZWFkZXItYnV0dG9uJywgJ3NiYi1oZWFkZXItbGluayddLmluY2x1ZGVzKFxuICAgICAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5sb2NhbE5hbWUsXG4gICAgICApLFxuICAgIH0pO1xuICAgIHRoaXMuX2VzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyLmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLmRpc3BhdGNoQ2xvc2VFdmVudCgpO1xuICAgIHRoaXMuX3dpbmRvd0V2ZW50c0NvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgdGhpcy5fZm9jdXNUcmFwQ29udHJvbGxlci5lbmFibGVkID0gZmFsc2U7XG5cbiAgICAvLyBTdGFydGluZyBmcm9tIGJyZWFrcG9pbnQgbWVkaXVtLCBlbmFibGUgc2Nyb2xsXG4gICAgdGhpcy5fc2Nyb2xsSGFuZGxlci5lbmFibGVTY3JvbGwoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUtleURvd24oZXZ0OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCFpc0Fycm93S2V5T3JQYWdlS2V5c1ByZXNzZWQoZXZ0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGNvbnN0IGVuYWJsZWRBY3Rpb25zOiBFbGVtZW50W10gPSBBcnJheS5mcm9tKFxuICAgICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsPFNiYk1lbnVCdXR0b25FbGVtZW50IHwgU2JiTWVudUxpbmtFbGVtZW50PihcbiAgICAgICAgJ3NiYi1tZW51LWJ1dHRvbiwgc2JiLW1lbnUtbGluaycsXG4gICAgICApLFxuICAgIClcbiAgICAgIC5jb25jYXQodGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKCdzYmItbWVudS1idXR0b24nKSEpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoZWwpID0+ICghZWwuZGlzYWJsZWQgfHwgZWwuZGlzYWJsZWRJbnRlcmFjdGl2ZSkgJiYgaW50ZXJhY3Rpdml0eUNoZWNrZXIuaXNWaXNpYmxlKGVsKSxcbiAgICAgICk7XG4gICAgY29uc3QgY3VycmVudCA9IGVuYWJsZWRBY3Rpb25zLmZpbmRJbmRleCgoZTogRWxlbWVudCkgPT4gZSA9PT0gZXZ0LnRhcmdldCk7XG5cbiAgICBsZXQgbmV4dEluZGV4O1xuICAgIHN3aXRjaCAoZXZ0LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICBuZXh0SW5kZXggPSBnZXROZXh0RWxlbWVudEluZGV4KGV2dCwgY3VycmVudCwgZW5hYmxlZEFjdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIGlmICh0aGlzLl9pc05lc3RlZCgpKSB7XG4gICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgaWYgKChldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5oYXNBdHRyaWJ1dGUoJ2RhdGEtc2JiLW1lbnUtdHJpZ2dlcicpKSB7XG4gICAgICAgICAgKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ1BhZ2VVcCc6XG4gICAgICBjYXNlICdIb21lJzpcbiAgICAgICAgbmV4dEluZGV4ID0gMDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VuZCc6XG4gICAgICBjYXNlICdQYWdlRG93bic6XG4gICAgICAgIG5leHRJbmRleCA9IGVuYWJsZWRBY3Rpb25zLmxlbmd0aCAtIDE7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChuZXh0SW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgKGVuYWJsZWRBY3Rpb25zW25leHRJbmRleF0gYXMgSFRNTEVsZW1lbnQpLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVtb3ZlcyB0cmlnZ2VyIGNsaWNrIGxpc3RlbmVyIG9uIHRyaWdnZXIgY2hhbmdlLlxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY3JlYXRlUmVuZGVyUm9vdCgpOiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IHJlbmRlclJvb3QgPSBzdXBlci5jcmVhdGVSZW5kZXJSb290KCk7XG4gICAgLy8gRHVlIHRvIHRoZSBmYWN0IHRoYXQgbWVudSBjYW4gYm90aCBiZSBhIGxpc3QgYW5kIGp1c3QgYSBjb250YWluZXIsIHdlIG5lZWQgdG8gY2hlY2sgaXRzXG4gICAgLy8gc3RhdGUgYmVmb3JlIHRoZSBTYmJOYW1lZFNsb3RMaXN0TWl4aW4gaGFuZGxlcyB0aGUgc2xvdGNoYW5nZSBldmVudCwgaW4gb3JkZXIgdG8gYXZvaWRcbiAgICAvLyBpdCBpbnRlcnByZXRpbmcgdGhlIG5vbiBsaXN0IGNhc2UgYXMgYSBsaXN0LlxuICAgIHRoaXMuc2hhZG93Um9vdD8uYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICdzbG90Y2hhbmdlJyxcbiAgICAgIChlKSA9PiB7XG4gICAgICAgIHRoaXMuX3N5bmNOZWdhdGl2ZSgpO1xuICAgICAgICB0aGlzLl9jaGVja0xpc3RDYXNlKGUpO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gcmVuZGVyUm9vdDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLnBvcG92ZXIgPSAnbWFudWFsJztcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuaWQgfHw9IGBzYmItbWVudS0ke25leHRJZCsrfWA7XG4gICAgaWYgKHRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgdGhpcy5fY29uZmlndXJlVHJpZ2dlcigpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50ID0gbnVsbDtcbiAgICB0aGlzLl90cmlnZ2VyQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHRoaXMuX3dpbmRvd0V2ZW50c0NvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgdGhpcy5fc2Nyb2xsSGFuZGxlci5lbmFibGVTY3JvbGwoKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSByZXF1ZXN0VXBkYXRlKFxuICAgIG5hbWU/OiBQcm9wZXJ0eUtleSxcbiAgICBvbGRWYWx1ZT86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFByb3BlcnR5RGVjbGFyYXRpb24sXG4gICk6IHZvaWQge1xuICAgIHN1cGVyLnJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuXG4gICAgaWYgKCFpc1NlcnZlciAmJiAoIW5hbWUgfHwgbmFtZSA9PT0gJ3RyaWdnZXInKSAmJiB0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgIHRoaXMuX2NvbmZpZ3VyZVRyaWdnZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jaGVja0xpc3RDYXNlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIC8vIElmIGFsbCBjaGlsZHJlbiBhcmUgc2JiLW1lbnUtYnV0dG9uL21lbnUtbGluayBpbnN0YW5jZXMsIHdlIHJlbmRlciB0aGVtIGFzIGEgbGlzdC5cbiAgICBpZiAoXG4gICAgICB0aGlzLmNoaWxkcmVuPy5sZW5ndGggJiZcbiAgICAgIEFycmF5LmZyb20odGhpcy5jaGlsZHJlbiA/PyBbXSkuZXZlcnkoXG4gICAgICAgIChjKSA9PiBjLmxvY2FsTmFtZSA9PT0gJ3NiYi1tZW51LWJ1dHRvbicgfHwgYy5sb2NhbE5hbWUgPT09ICdzYmItbWVudS1saW5rJyxcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5saXN0Q2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmxpc3RDaGlsZHJlbi5mb3JFYWNoKChjKSA9PiBjLnJlbW92ZUF0dHJpYnV0ZSgnc2xvdCcpKTtcbiAgICAgIHRoaXMubGlzdENoaWxkcmVuID0gW107XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgdGhlIHRyaWdnZXIgaXMgdmFsaWQgYW5kIGF0dGFjaCBjbGljayBldmVudCBsaXN0ZW5lcnMuXG4gIHByaXZhdGUgX2NvbmZpZ3VyZVRyaWdnZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudHJpZ2dlciA9PT0gdGhpcy5fdHJpZ2dlckVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl90cmlnZ2VyQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHJlbW92ZUFyaWFPdmVybGF5VHJpZ2dlckF0dHJpYnV0ZXModGhpcy5fdHJpZ2dlckVsZW1lbnQpO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50ID0gdGhpcy50cmlnZ2VyO1xuXG4gICAgaWYgKCF0aGlzLl90cmlnZ2VyRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldEFyaWFPdmVybGF5VHJpZ2dlckF0dHJpYnV0ZXModGhpcy5fdHJpZ2dlckVsZW1lbnQsICdtZW51JywgdGhpcy5pZCwgdGhpcy5zdGF0ZSk7XG4gICAgdGhpcy5fdHJpZ2dlckFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMub3BlbigpLCB7XG4gICAgICBzaWduYWw6IHRoaXMuX3RyaWdnZXJBYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuXG4gICAgLy8gQ29uc2lkZXIgdGhlIG1lbnUgYXMgbmVzdGVkIGlmIHRoZSB0cmlnZ2VyIGlzIGEgbWVudSBidXR0b24gb3IgbWVudSBsaW5rLlxuICAgIHRoaXMudG9nZ2xlU3RhdGUoXG4gICAgICAnbmVzdGVkJyxcbiAgICAgIFsnc2JiLW1lbnUtYnV0dG9uJywgJ3NiYi1tZW51LWxpbmsnXS5pbmNsdWRlcyh0aGlzLl90cmlnZ2VyRWxlbWVudC5sb2NhbE5hbWUpLFxuICAgICk7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQudG9nZ2xlQXR0cmlidXRlKCdkYXRhLXNiYi1tZW51LXRyaWdnZXInLCB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2F0dGFjaFdpbmRvd0V2ZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLl93aW5kb3dFdmVudHNDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHRoaXMuX3NldE1lbnVQb3NpdGlvbigpLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgc2lnbmFsOiB0aGlzLl93aW5kb3dFdmVudHNDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgIC8vIFdpdGhvdXQgY2FwdHVyZSwgb3RoZXIgc2Nyb2xsIGNvbnRleHRzIHdvdWxkIG5vdCBidWJibGUgdG8gdGhpcyBldmVudCBsaXN0ZW5lci5cbiAgICAgIC8vIENhcHR1cmUgYWxsb3dzIHVzIHRvIHJlYWN0IHRvIGFsbCBzY3JvbGwgY29udGV4dHMgaW4gdGhpcyBET00uXG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLl9zZXRNZW51UG9zaXRpb24oKSwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgIHNpZ25hbDogdGhpcy5fd2luZG93RXZlbnRzQ29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG5cbiAgICAvLyBPbmx5IHRoZSBvdXRlcm1vc3QgbWVudSBuZWVkcyB0byBsaXN0ZW4gdG8gdGhlIGJhY2tkcm9wIGNsaWNrc1xuICAgIGlmICghdGhpcy5faXNOZXN0ZWQoKSkge1xuICAgICAgLy8gQ2xvc2UgbWVudSBvbiBiYWNrZHJvcCBjbGlja1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5fcG9pbnRlckRvd25MaXN0ZW5lciwge1xuICAgICAgICBzaWduYWw6IHRoaXMuX3dpbmRvd0V2ZW50c0NvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgfSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdGhpcy5fY2xvc2VPbkJhY2tkcm9wQ2xpY2ssIHtcbiAgICAgICAgc2lnbmFsOiB0aGlzLl93aW5kb3dFdmVudHNDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIENsb3NlIG1lbnUgYXQgYW55IGNsaWNrIG9uIGFuIGludGVyYWN0aXZlIGVsZW1lbnQgaW5zaWRlIHRoZSA8c2JiLW1lbnU+IHRoYXQgYnViYmxlcyB0byB0aGUgY29udGFpbmVyLlxuICBwcml2YXRlIF9pbnRlcmFjdGl2ZUVsZW1lbnRDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoXG4gICAgICBJTlRFUkFDVElWRV9FTEVNRU5UUy5pbmNsdWRlcyh0YXJnZXQubm9kZU5hbWUpICYmXG4gICAgICAhdGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSAmJlxuICAgICAgIXRhcmdldC5oYXNBdHRyaWJ1dGUoJ2RhdGEtc2JiLW1lbnUtdHJpZ2dlcicpICYmXG4gICAgICB0YXJnZXQuaWQgIT09ICdzYmItbWVudV9fYmFjay1idXR0b24nXG4gICAgKSB7XG4gICAgICB0aGlzLmNsb3NlQWxsKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgdGhlIHBvaW50ZXJkb3duIGV2ZW50IHRhcmdldCBpcyB0cmlnZ2VyZWQgb24gdGhlIG1lbnUuXG4gIHByaXZhdGUgX3BvaW50ZXJEb3duTGlzdGVuZXIgPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IG1lbnUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KCdzYmItbWVudScpO1xuXG4gICAgLy8gVGhlIHBvaW50ZXIgZG93biBpcyBvbiB0aGUgbWVudSBvciBvbmUgb2YgaXRzIG5lc3RlZCBtZW51cy5cbiAgICB0aGlzLl9pc1BvaW50ZXJEb3duRXZlbnRPbk1lbnUgPVxuICAgICAgaXNFdmVudE9uRWxlbWVudCh0aGlzLl9tZW51LCBldmVudCkgfHwgdGhpcy5fbmVzdGVkTWVudXMoKS5zb21lKChlbCkgPT4gbWVudSA9PT0gZWwpO1xuICB9O1xuXG4gIC8vIENsb3NlIG1lbnUgb24gYmFja2Ryb3AgY2xpY2suXG4gIHByaXZhdGUgX2Nsb3NlT25CYWNrZHJvcENsaWNrID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAvLyBUaGUgYmFja2Ryb3AgaXMgb25seSBsaXN0ZW5lZCBvbiB0aGUgbWFpbiBtZW51IChvdXRlcm1vc3QgbWVudSkuXG4gICAgLy8gVG8gY2xvc2UuXG4gICAgLy8gLSBUaGUgcG9pbnRlciBkb3duIGFuZCB1cCBuZWVkIHRvIGJlIG91dHNpZGUgdGhlIG1lbnUuXG4gICAgLy8gLSBUaGUgdGFyZ2V0IHNob3VsZCBiZSBub3Qgb24gYSBuZXN0ZWQgbWVudVxuICAgIGlmIChcbiAgICAgICF0aGlzLl9pc1BvaW50ZXJEb3duRXZlbnRPbk1lbnUgJiZcbiAgICAgICFpc0V2ZW50T25FbGVtZW50KHRoaXMuX21lbnUsIGV2ZW50KSAmJlxuICAgICAgIXRoaXMuX25lc3RlZE1lbnVzKCkuc29tZSgoZWwpID0+IGVsID09PSB0YXJnZXQpXG4gICAgKSB7XG4gICAgICB0aGlzLmNsb3NlQWxsKCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBDb252ZXJ0cyB0aGUgbGlua2VkIGxpc3QgaW50byBhbiBhcnJheSBvZiBTYmJNZW51RWxlbWVudC4gKi9cbiAgcHJpdmF0ZSBfbmVzdGVkTWVudXMoKTogU2JiTWVudUVsZW1lbnRbXSB7XG4gICAgY29uc3QgbWVudXM6IFNiYk1lbnVFbGVtZW50W10gPSBbXTtcbiAgICBsZXQgY3VycmVudCA9IHRoaXMuX25lc3RlZE1lbnU7XG5cbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgbWVudXMucHVzaChjdXJyZW50KTtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Ll9uZXN0ZWRNZW51O1xuICAgIH1cblxuICAgIHJldHVybiBtZW51cztcbiAgfVxuXG4gIHByaXZhdGUgX3BhcmVudE1lbnUoKTogU2JiTWVudUVsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdHJpZ2dlckVsZW1lbnQ/LmNsb3Nlc3QoJ3NiYi1tZW51JykgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKiBUaGUgb3V0ZXJtb3N0IG1lbnUuICovXG4gIHByaXZhdGUgX21haW5NZW51KCk6IFNiYk1lbnVFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5faXNOZXN0ZWQoKSA/ICh0aGlzLl9wYXJlbnRNZW51KCk/Ll9tYWluTWVudSgpID8/IHRoaXMpIDogdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgX2lzTmVzdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuX3BhcmVudE1lbnUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZU5lc3RlZEluZXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuX2luZXJ0Q29udHJvbGxlci5yZXN0b3JlQWxsRXhlbXB0ZWQoKTtcbiAgICB0aGlzLl9tYWluTWVudSgpXG4gICAgICAuX25lc3RlZE1lbnVzKClcbiAgICAgIC5mb3JFYWNoKChtZW51KSA9PiB0aGlzLl9pbmVydENvbnRyb2xsZXIuZXhlbXB0KG1lbnUpKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIG5lc3RlZCBtZW51IHNob3VsZCBiZSBjbG9zZWQuXG4gIHByaXZhdGUgX2hhbmRsZU1vdXNlT3ZlcihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgaXNNb2JpbGUgPSB0aGlzLl9pc01vYmlsZSgpO1xuXG4gICAgLy8gQWxsIG5lc3RlZCBtZW51cyBzaG91bGQgY2xvc2UgaW4gZGVza3RvcCBtb2RlIGlmIHRoZSBjdXJzb3IgbGFuZGVkIG9uXG4gICAgLy8gYW55dGhpbmcgb3RoZXIgdGhhbiB0aGUgY29udGFpbmVyLCB0aGUgY29udGFpbmVyJ3Mgc2Nyb2xsYmFyIG9yIHRoZSB0cmlnZ2VyIGl0c2VsZlxuICAgIGlmIChcbiAgICAgICFpc01vYmlsZSAmJlxuICAgICAgdGhpcy5fbmVzdGVkTWVudSAmJlxuICAgICAgIWVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzYmItbWVudV9fY29udGVudCcpICYmXG4gICAgICAhKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJykgPT09ICd0cnVlJylcbiAgICApIHtcbiAgICAgIHRoaXMuX25lc3RlZE1lbnUuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2RhdGEtc2JiLW1lbnUtdHJpZ2dlcicpICYmICFpc01vYmlsZSkge1xuICAgICAgZWxlbWVudC5jbGljaygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNldCBtZW51IHBvc2l0aW9uICh4LCB5KSB0byAnMCcgb25jZSB0aGUgbWVudSBpcyBjbG9zZWQgYW5kIHRoZSB0cmFuc2l0aW9uIGVuZGVkIHRvIHByZXZlbnQgdGhlXG4gIC8vIHZpZXdwb3J0IGZyb20gb3ZlcmZsb3dpbmcuIEFuZCBzZXQgdGhlIGZvY3VzIHRvIHRoZSBmaXJzdCBmb2N1c2FibGUgZWxlbWVudCBvbmNlIHRoZSBtZW51IGlzIG9wZW4uXG4gIC8vIEluIHJhcmUgY2FzZXMgaXQgY2FuIGJlIHRoYXQgdGhlIGFuaW1hdGlvbkVuZCBldmVudCBpcyB0cmlnZ2VyZWQgdHdpY2UuXG4gIC8vIFRvIGF2b2lkIGVudGVyaW5nIGEgY29ycnVwdCBzdGF0ZSwgZXhpdCB3aGVuIHN0YXRlIGlzIG5vdCBleHBlY3RlZC5cbiAgcHJpdmF0ZSBfb25NZW51QW5pbWF0aW9uRW5kKGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIChldmVudC5hbmltYXRpb25OYW1lID09PSAnb3BlbicgfHwgZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ29wZW4tc2lkZXdheXMnKSAmJlxuICAgICAgdGhpcy5zdGF0ZSA9PT0gJ29wZW5pbmcnXG4gICAgKSB7XG4gICAgICB0aGlzLl9oYW5kbGVPcGVuaW5nKCk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIChldmVudC5hbmltYXRpb25OYW1lID09PSAnY2xvc2UnIHx8IGV2ZW50LmFuaW1hdGlvbk5hbWUgPT09ICdjbG9zZS1zaWRld2F5cycpICYmXG4gICAgICB0aGlzLnN0YXRlID09PSAnY2xvc2luZydcbiAgICApIHtcbiAgICAgIHRoaXMuX2hhbmRsZUNsb3NpbmcoKTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXQgbWVudSBwb3NpdGlvbiBhbmQgbWF4IGhlaWdodCBpZiB0aGUgYnJlYWtwb2ludCBpcyBtZWRpdW0tdWx0cmEuXG4gIHByaXZhdGUgX3NldE1lbnVQb3NpdGlvbigpOiB2b2lkIHtcbiAgICAvLyBTdGFydGluZyBmcm9tIGJyZWFrcG9pbnQgbWVkaXVtXG4gICAgaWYgKHRoaXMuX2lzTW9iaWxlKCkgfHwgIXRoaXMuX21lbnUgfHwgIXRoaXMuX3RyaWdnZXJFbGVtZW50IHx8IHRoaXMuc3RhdGUgPT09ICdjbG9zaW5nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1lbnVQb3NpdGlvbiA9ICF0aGlzLl9pc05lc3RlZCgpXG4gICAgICA/IGdldEVsZW1lbnRQb3NpdGlvbihcbiAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoJy5zYmItbWVudV9fY29udGVudCcpISxcbiAgICAgICAgICB0aGlzLl90cmlnZ2VyRWxlbWVudCxcbiAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoJy5zYmItbWVudV9fY29udGFpbmVyJykhLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0OiBNRU5VX09GRlNFVCxcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICA6IGdldEVsZW1lbnRQb3NpdGlvbkhvcml6b250YWwoXG4gICAgICAgICAgdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKCcuc2JiLW1lbnVfX2NvbnRlbnQnKSEsXG4gICAgICAgICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQsXG4gICAgICAgICAgdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKCcuc2JiLW1lbnVfX2NvbnRhaW5lcicpISxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBob3Jpem9udGFsT2Zmc2V0OiBNRU5VX09GRlNFVCxcbiAgICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0OiBORVNURURfTUVOVV9PRkZTRVQsXG4gICAgICAgICAgICBjb250ZW50U2VsZWN0b3I6ICcuc2JiLW1lbnVfX2NvbnRlbnQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLXNiYi1tZW51LXBvc2l0aW9uLXgnLCBgJHttZW51UG9zaXRpb24ubGVmdH1weGApO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tc2JiLW1lbnUtcG9zaXRpb24teScsIGAke21lbnVQb3NpdGlvbi50b3B9cHhgKTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLXNiYi1tZW51LW1heC1oZWlnaHQnLCBtZW51UG9zaXRpb24ubWF4SGVpZ2h0KTtcbiAgfVxuXG4gIHByaXZhdGUgX3N5bmNOZWdhdGl2ZSgpOiB2b2lkIHtcbiAgICAvLyBMaW5rcyBhbmQgYnV0dG9ucyBhcmUgdGhlIG1vc3QgZXhwZWN0ZWQgY29udGVudHMgd2hpY2ggaGF2ZSBhIG5lZ2F0aXZlIHByb3BlcnR5XG4gICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1zYmItbGlua10sIFtkYXRhLXNiYi1idXR0b25dJyk/LmZvckVhY2goKGVsOiBFbGVtZW50KSA9PiB7XG4gICAgICBjdXN0b21FbGVtZW50cy51cGdyYWRlKGVsKTtcbiAgICAgIChlbCBhcyBFbGVtZW50ICYgU2JiTmVnYXRpdmVNaXhpblR5cGUpLm5lZ2F0aXZlID0gIXRoaXMuX2RhcmtNb2RlQ29udHJvbGxlci5tYXRjaGVzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pc01vYmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbWVkaWFNYXRjaGVyLm1hdGNoZXModGhpcy5fbW9iaWxlQnJlYWtwb2ludCkgPz8gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZW5kZXIoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIC8vIFRPRE86IEhhbmRsZSBjYXNlIHdpdGggb3RoZXIgZWxlbWVudHMgdGhhbiBzYmItbWVudS1idXR0b24vc2JiLW1lbnUtbGluay5cbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItbWVudV9fY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBAYW5pbWF0aW9uZW5kPSR7dGhpcy5fb25NZW51QW5pbWF0aW9uRW5kfVxuICAgICAgICAgIEBtb3VzZW92ZXI9JHsoZTogTW91c2VFdmVudCkgPT4gdGhpcy5faGFuZGxlTW91c2VPdmVyKGUpfVxuICAgICAgICAgIGNsYXNzPVwic2JiLW1lbnVcIlxuICAgICAgICAgICR7cmVmKChlbD86IEVsZW1lbnQpID0+ICh0aGlzLl9tZW51ID0gZWwgYXMgSFRNTERpdkVsZW1lbnQpKX1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIEBjbGljaz0keyhldmVudDogRXZlbnQpID0+IHRoaXMuX2ludGVyYWN0aXZlRWxlbWVudENsaWNrKGV2ZW50KX1cbiAgICAgICAgICAgIEBzY3JvbGw9JHsoZTogRXZlbnQpID0+IGZvcndhcmRFdmVudChlLCBkb2N1bWVudCl9XG4gICAgICAgICAgICBjbGFzcz1cInNiYi1tZW51X19jb250ZW50XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICAke3RoaXMubGlzdENoaWxkcmVuLmxlbmd0aFxuICAgICAgICAgICAgICA/IHRoaXMucmVuZGVyTGlzdCh7IGNsYXNzOiAnc2JiLW1lbnUtbGlzdCcsIGFyaWFMYWJlbDogdGhpcy5saXN0QWNjZXNzaWJpbGl0eUxhYmVsIH0pXG4gICAgICAgICAgICAgIDogaHRtbGA8c2xvdD48L3Nsb3Q+YH1cbiAgICAgICAgICAgIDxzYmItZGl2aWRlcj48L3NiYi1kaXZpZGVyPlxuICAgICAgICAgICAgPHNiYi1tZW51LWJ1dHRvblxuICAgICAgICAgICAgICBpZD1cInNiYi1tZW51X19iYWNrLWJ1dHRvblwiXG4gICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuY2xvc2UoKX1cbiAgICAgICAgICAgICAgaWNvbi1uYW1lPVwiY2hldnJvbi1zbWFsbC1sZWZ0LXNtYWxsXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgJHtpMThuR29CYWNrW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfVxuICAgICAgICAgICAgPC9zYmItbWVudS1idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLW1lbnUnOiBTYmJNZW51RWxlbWVudDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQThDQSxNQUFNLGNBQWM7QUFDcEIsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSx1QkFBdUI7QUFBQSxFQUMzQjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTs7QUFHRixJQUFJLFNBQVM7SUFZUCxrQkFBYyxNQUFBOzswQkFEbkIsY0FBYyxVQUFVLENBQUM7Ozs7b0JBQ0csc0JBRzNCLHVCQUF1Qjs7Ozs7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
|