@sbb-esta/lyne-elements-dev 5.0.0-next-dev.1776736853 → 5.0.0-next-dev.1776756036
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/overlay/overlay-trigger-attributes.js +3 -3
- package/core.js +2 -2
- package/custom-elements.json +13 -13
- package/datepicker/datepicker/datepicker.component.js +1 -1
- package/{datepicker.component-BBmEvmW3.js → datepicker.component-CNQGkdr-.js} +11 -11
- package/datepicker.js +1 -1
- package/datepicker.pure.js +1 -1
- package/development/core/overlay/overlay-trigger-attributes.d.ts +4 -4
- package/development/core/overlay/overlay-trigger-attributes.d.ts.map +1 -1
- package/development/core/overlay/overlay-trigger-attributes.js +12 -12
- package/development/core.js +2 -2
- package/development/datepicker/datepicker/datepicker.component.d.ts.map +1 -1
- package/development/datepicker/datepicker/datepicker.component.js +1 -1
- package/development/datepicker.component-Chnvwnp7.js +212 -0
- package/development/datepicker.js +1 -1
- package/development/datepicker.pure.js +1 -1
- package/development/dialog/dialog/dialog.component.d.ts +0 -1
- package/development/dialog/dialog/dialog.component.d.ts.map +1 -1
- package/development/dialog/dialog/dialog.component.js +1 -1
- package/development/{dialog.component-BYVTZAUU.js → dialog.component-B4cZfRCl.js} +1 -6
- package/development/dialog.js +1 -1
- package/development/dialog.pure.js +1 -1
- package/development/header/header/header.component.d.ts.map +1 -1
- package/development/header/header/header.component.js +1 -1
- package/development/{header.component-Hfgz9sSb.js → header.component-B2T2pmHs.js} +2 -3
- package/development/header.js +1 -1
- package/development/header.pure.js +1 -1
- package/development/menu/common/menu-action-common.js +1 -1
- package/development/menu/menu/menu.component.d.ts.map +1 -1
- package/development/menu/menu/menu.component.js +1 -1
- package/development/menu-action-common-CEnwq60Z.js +32 -0
- package/development/menu.component-BM7hhOb4.js +365 -0
- package/development/menu.js +2 -2
- package/development/menu.pure.js +2 -2
- package/development/navigation/navigation/navigation.component.d.ts.map +1 -1
- package/development/navigation/navigation/navigation.component.js +1 -1
- package/development/navigation/navigation-section/navigation-section.component.d.ts.map +1 -1
- package/development/navigation/navigation-section/navigation-section.component.js +1 -1
- package/development/{navigation-section.component-C_9myQKr.js → navigation-section.component-6tqZADWM.js} +6 -8
- package/development/{navigation.component-C8MhqBLY.js → navigation.component-DUy2QGHI.js} +6 -8
- package/development/navigation.js +2 -2
- package/development/navigation.pure.js +2 -2
- package/development/overlay/overlay-base-element.d.ts.map +1 -1
- package/development/overlay/overlay-base-element.js +6 -6
- package/development/overlay/overlay.component.d.ts +0 -1
- package/development/overlay/overlay.component.d.ts.map +1 -1
- package/development/overlay/overlay.component.js +1 -1
- package/development/{overlay.component-BuCkqG6Q.js → overlay.component-CA0fWX47.js} +1 -6
- package/development/overlay.js +1 -1
- package/development/overlay.pure.js +1 -1
- package/development/popover/popover.component.d.ts.map +1 -1
- package/development/popover/popover.component.js +1 -1
- package/development/popover.component-B1gMzBuv.js +527 -0
- package/development/popover.js +1 -1
- package/development/popover.pure.js +1 -1
- package/development/{step-label.component-CxqPgbzK.js → step-label.component-B7M9Yqyz.js} +1 -3
- package/development/{step.component-B2qbHl0l.js → step.component-CVWxYkrv.js} +1 -3
- package/development/stepper/step/step.component.d.ts.map +1 -1
- package/development/stepper/step/step.component.js +1 -1
- package/development/stepper/step-label/step-label.component.d.ts.map +1 -1
- package/development/stepper/step-label/step-label.component.js +1 -1
- package/development/stepper.js +2 -2
- package/development/stepper.pure.js +2 -2
- package/development/{tab.component-DteuwiHv.js → tab.component-CvzGdR9_.js} +1 -3
- package/development/tabs/tab/tab.component.d.ts.map +1 -1
- package/development/tabs/tab/tab.component.js +1 -1
- package/development/tabs.js +1 -1
- package/development/tabs.pure.js +1 -1
- package/development/tooltip/tooltip.component.d.ts.map +1 -1
- package/development/tooltip/tooltip.component.js +1 -1
- package/development/tooltip.component-lvElko6C.js +369 -0
- package/development/tooltip.js +1 -1
- package/development/tooltip.pure.js +1 -1
- package/dialog/dialog/dialog.component.js +1 -1
- package/{dialog.component-ca14M0hZ.js → dialog.component-DTbAHlVd.js} +7 -10
- package/dialog.js +1 -1
- package/dialog.pure.js +1 -1
- package/header/header/header.component.js +1 -1
- package/{header.component-BxizSy1O.js → header.component-D-WVEMFn.js} +2 -2
- package/header.js +1 -1
- package/header.pure.js +1 -1
- package/menu/common/menu-action-common.js +1 -1
- package/menu/menu/menu.component.js +1 -1
- package/{menu-action-common-DY4RrfCy.js → menu-action-common-krzD_Ca2.js} +1 -1
- package/{menu.component-XvtyRok7.js → menu.component-i-X_ag2Y.js} +14 -14
- package/menu.js +2 -2
- package/menu.pure.js +2 -2
- package/navigation/navigation/navigation.component.js +1 -1
- package/navigation/navigation-section/navigation-section.component.js +1 -1
- package/{navigation-section.component-CLcdmPV3.js → navigation-section.component-Db2MWBDn.js} +17 -17
- package/{navigation.component-Cnyb5_4R.js → navigation.component-Bym1kjzt.js} +16 -16
- package/navigation.js +2 -2
- package/navigation.pure.js +2 -2
- package/overlay/overlay-base-element.js +4 -4
- package/overlay/overlay.component.js +1 -1
- package/{overlay.component-OzDUV8t1.js → overlay.component-BydJOM2r.js} +10 -13
- package/overlay.js +1 -1
- package/overlay.pure.js +1 -1
- package/package.json +2 -2
- package/popover/popover.component.js +1 -1
- package/{popover.component-BfSXNxKK.js → popover.component-Dd4rKGml.js} +12 -12
- package/popover.js +1 -1
- package/popover.pure.js +1 -1
- package/{step-label.component-qdfunibJ.js → step-label.component-BXg13qOD.js} +3 -3
- package/{step.component-aBAfTJyO.js → step.component-sQbJslHx.js} +3 -3
- package/stepper/step/step.component.js +1 -1
- package/stepper/step-label/step-label.component.js +1 -1
- package/stepper.js +2 -2
- package/stepper.pure.js +2 -2
- package/{tab.component-DGzqld4u.js → tab.component-D39b0S04.js} +3 -3
- package/tabs/tab/tab.component.js +1 -1
- package/tabs.js +1 -1
- package/tabs.pure.js +1 -1
- package/tooltip/tooltip.component.js +1 -1
- package/{tooltip.component-C5y6zCtF.js → tooltip.component-Do4V1jGd.js} +12 -12
- package/tooltip.js +1 -1
- package/tooltip.pure.js +1 -1
- package/development/datepicker.component-AKlc7SAO.js +0 -214
- package/development/menu-action-common-Crx-dDgH.js +0 -32
- package/development/menu.component-DOv7PKIi.js +0 -367
- package/development/popover.component-B15jFLe9.js +0 -529
- package/development/tooltip.component-BtWTK2R0.js +0 -371
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { html, unsafeCSS } from "lit";
|
|
2
|
-
import { SbbDisabledMixin, boxSizingStyles } from "./core.js";
|
|
3
|
-
import { SbbIconNameMixin } from "./icon.pure.js";
|
|
4
|
-
//#region src/elements/menu/common/menu-action.scss?inline
|
|
5
|
-
var menu_action_default = ":host {\n --sbb-menu-action-cursor: var(--sbb-cursor-pointer);\n outline: none !important;\n display: block;\n}\n\n@media (any-hover: hover) {\n :host(:is(:hover:not([disabled], :disabled, [disabled-interactive]), [aria-expanded=true])) {\n --sbb-menu-background-color: var(--sbb-color-iron);\n --sbb-menu-background-color: light-dark(var(--sbb-color-iron), var(--sbb-color-milk));\n --sbb-menu-action-forced-color-border-color: Highlight;\n }\n}\n\n:host(:is([disabled], :disabled, [disabled-interactive])) {\n --sbb-menu-action-cursor: var(--sbb-cursor-default);\n --sbb-menu-action-color: var(--sbb-color-graphite);\n --sbb-menu-action-color: light-dark(var(--sbb-color-graphite), var(--sbb-color-granite));\n --sbb-menu-action-forced-color-border-color: GrayText;\n pointer-events: none;\n cursor: var(--sbb-cursor-default);\n}\n@media (forced-colors: active) {\n :host(:is([disabled], :disabled, [disabled-interactive])) {\n --sbb-menu-action-color: GrayText;\n }\n}\n\n:host(:is(:state(sbb-menu-trigger),[state--sbb-menu-trigger])) {\n --sbb-menu-action-cursor: var(--sbb-cursor-default);\n}\n\n@media (forced-colors: active) {\n :host(:is(:state(button),[state--button])) {\n --sbb-menu-action-color: ButtonText;\n }\n}\n\n:host([sbb-badge]:not(:is(:state(has-icon-name),[state--has-icon-name]), :is(:state(slotted-icon),[state--slotted-icon])))::after {\n inset: 50% calc(100% - var(--sbb-menu-action-outer-horizontal-padding) - var(--sbb-menu-action-content-padding-inline) - 0.5 * var(--sbb-size-icon-ui-small)) auto auto !important;\n translate: 50% -50%;\n}\n\n:host([sbb-badge]:is(:is(:state(has-icon-name),[state--has-icon-name]), :is(:state(slotted-icon),[state--slotted-icon])))::after {\n inset: calc(var(--sbb-menu-action-outer-vertical-padding) + var(--sbb-menu-action-content-padding-block) + var(--sbb-badge-position-offset)) calc(100% - var(--sbb-menu-action-outer-horizontal-padding) - var(--sbb-menu-action-content-padding-inline) - var(--sbb-size-icon-ui-small) + var(--sbb-badge-position-offset)) auto auto !important;\n}\n\n:host([aria-controls*=sbb-menu]) {\n --sbb-menu-action-submenu-icon-display: flex;\n}\n\n:is(.sbb-menu-button, .sbb-menu-link) {\n text-decoration: none;\n display: block;\n width: 100%;\n color: var(--sbb-menu-action-color);\n padding: var(--sbb-menu-action-outer-vertical-padding) var(--sbb-menu-action-outer-horizontal-padding);\n cursor: var(--sbb-menu-action-cursor);\n outline: none;\n}\n\n.sbb-menu-action__content {\n --sbb-text-font-size: var(--sbb-text-font-size-xs);\n font-family: var(--sbb-typo-font-family);\n font-weight: normal;\n line-height: var(--sbb-typo-line-height-text);\n letter-spacing: var(--sbb-typo-letter-spacing-text);\n font-size: var(--sbb-text-font-size);\n display: flex;\n align-items: center;\n gap: var(--sbb-menu-action-gap);\n padding: var(--sbb-menu-action-content-padding-block) var(--sbb-menu-action-content-padding-inline);\n border-radius: var(--sbb-menu-action-border-radius);\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n background-color: var(--sbb-menu-background-color);\n}\n:host(:focus-visible) .sbb-menu-action__content, :focus-visible .sbb-menu-action__content {\n outline-offset: var(--sbb-focus-outline-offset);\n outline: var(--sbb-focus-outline-color) var(--sbb-focus-outline-style, solid) var(--sbb-focus-outline-width);\n}\n@media (forced-colors: active) {\n .sbb-menu-action__content {\n border: var(--sbb-border-width-2x) solid var(--sbb-menu-action-forced-color-border-color);\n }\n}\n\n.sbb-menu-action__icon,\n.sbb-menu-submenu__icon {\n display: flex;\n min-width: var(--sbb-size-icon-ui-small);\n min-height: var(--sbb-size-icon-ui-small);\n}\n\n.sbb-menu-submenu__icon {\n display: var(--sbb-menu-action-submenu-icon-display, none);\n margin-inline-start: auto;\n}\n\n.sbb-menu-action__label {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n:host(:is([disabled], :disabled, [disabled-interactive])) .sbb-menu-action__label {\n text-decoration: line-through;\n}";
|
|
6
|
-
//#endregion
|
|
7
|
-
//#region src/elements/menu/common/menu-action-common.ts
|
|
8
|
-
var SbbMenuActionCommonElementMixin = (superClass) => {
|
|
9
|
-
class SbbMenuActionCommonElement extends SbbIconNameMixin(SbbDisabledMixin(superClass)) {
|
|
10
|
-
static {
|
|
11
|
-
this.styles = [boxSizingStyles, unsafeCSS(menu_action_default)];
|
|
12
|
-
}
|
|
13
|
-
renderTemplate() {
|
|
14
|
-
return html`
|
|
15
|
-
<span class="sbb-menu-action__content">
|
|
16
|
-
<span class="sbb-menu-action__icon"> ${super.renderIconSlot()} </span>
|
|
17
|
-
<span class="sbb-menu-action__label">
|
|
18
|
-
<slot></slot>
|
|
19
|
-
</span>
|
|
20
|
-
<span class="sbb-menu-submenu__icon">
|
|
21
|
-
<sbb-icon name="chevron-small-right-small"></sbb-icon>
|
|
22
|
-
</span>
|
|
23
|
-
</span>
|
|
24
|
-
`;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return SbbMenuActionCommonElement;
|
|
28
|
-
};
|
|
29
|
-
//#endregion
|
|
30
|
-
export { SbbMenuActionCommonElementMixin as t };
|
|
31
|
-
|
|
32
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1hY3Rpb24tY29tbW9uLUNyeC1kRGdILmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9tZW51L2NvbW1vbi9tZW51LWFjdGlvbi5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9tZW51L2NvbW1vbi9tZW51LWFjdGlvbi1jb21tb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiQHVzZSAnLi4vLi4vY29yZS9zdHlsZXMnIGFzIHNiYjtcblxuJGRpc2FibGVkOiAnW2Rpc2FibGVkXSwgOmRpc2FibGVkLCBbZGlzYWJsZWQtaW50ZXJhY3RpdmVdJztcblxuOmhvc3Qge1xuICAtLXNiYi1tZW51LWFjdGlvbi1jdXJzb3I6IHZhcigtLXNiYi1jdXJzb3ItcG9pbnRlcik7XG5cbiAgLy8gVXNlICFpbXBvcnRhbnQgaGVyZSB0byBub3QgaW50ZXJmZXJlIHdpdGggRmlyZWZveCBmb2N1cyByaW5nIGRlZmluaXRpb25cbiAgLy8gd2hpY2ggYXBwZWFycyBpbiBub3JtYWxpemUgQ1NTIG9mIHNldmVyYWwgZnJhbWV3b3Jrcy5cbiAgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50O1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuOmhvc3QoOmlzKDpob3Zlcjpub3QoI3skZGlzYWJsZWR9KSwgW2FyaWEtZXhwYW5kZWQ9J3RydWUnXSkpIHtcbiAgQGluY2x1ZGUgc2JiLmhvdmVyLW1xKCRob3ZlcjogdHJ1ZSkge1xuICAgIC0tc2JiLW1lbnUtYmFja2dyb3VuZC1jb2xvcjogbGlnaHQtZGFyayh2YXIoLS1zYmItY29sb3ItaXJvbiksIHZhcigtLXNiYi1jb2xvci1taWxrKSk7XG4gICAgLS1zYmItbWVudS1hY3Rpb24tZm9yY2VkLWNvbG9yLWJvcmRlci1jb2xvcjogSGlnaGxpZ2h0O1xuICB9XG59XG5cbjpob3N0KDppcygjeyRkaXNhYmxlZH0pKSB7XG4gIC0tc2JiLW1lbnUtYWN0aW9uLWN1cnNvcjogdmFyKC0tc2JiLWN1cnNvci1kZWZhdWx0KTtcbiAgLS1zYmItbWVudS1hY3Rpb24tY29sb3I6IGxpZ2h0LWRhcmsodmFyKC0tc2JiLWNvbG9yLWdyYXBoaXRlKSwgdmFyKC0tc2JiLWNvbG9yLWdyYW5pdGUpKTtcbiAgLS1zYmItbWVudS1hY3Rpb24tZm9yY2VkLWNvbG9yLWJvcmRlci1jb2xvcjogR3JheVRleHQ7XG5cbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIGN1cnNvcjogdmFyKC0tc2JiLWN1cnNvci1kZWZhdWx0KTtcblxuICBAaW5jbHVkZSBzYmIuaWYtZm9yY2VkLWNvbG9ycyB7XG4gICAgLS1zYmItbWVudS1hY3Rpb24tY29sb3I6IEdyYXlUZXh0O1xuICB9XG59XG5cbjpob3N0KDpzdGF0ZShzYmItbWVudS10cmlnZ2VyKSkge1xuICAtLXNiYi1tZW51LWFjdGlvbi1jdXJzb3I6IHZhcigtLXNiYi1jdXJzb3ItZGVmYXVsdCk7XG59XG5cbjpob3N0KDpzdGF0ZShidXR0b24pKSB7XG4gIEBpbmNsdWRlIHNiYi5pZi1mb3JjZWQtY29sb3JzIHtcbiAgICAtLXNiYi1tZW51LWFjdGlvbi1jb2xvcjogQnV0dG9uVGV4dDtcbiAgfVxufVxuXG46aG9zdChbc2JiLWJhZGdlXTpub3QoOnN0YXRlKGhhcy1pY29uLW5hbWUpLCA6c3RhdGUoc2xvdHRlZC1pY29uKSkpOjphZnRlciB7XG4gIGluc2V0OiA1MCVcbiAgICBjYWxjKFxuICAgICAgMTAwJSAtIHZhcigtLXNiYi1tZW51LWFjdGlvbi1vdXRlci1ob3Jpem9udGFsLXBhZGRpbmcpIC0gdmFyKFxuICAgICAgICAgIC0tc2JiLW1lbnUtYWN0aW9uLWNvbnRlbnQtcGFkZGluZy1pbmxpbmVcbiAgICAgICAgKSAtXG4gICAgICAgIDAuNSAqIHZhcigtLXNiYi1zaXplLWljb24tdWktc21hbGwpXG4gICAgKVxuICAgIGF1dG8gYXV0byAhaW1wb3J0YW50O1xuICB0cmFuc2xhdGU6IDUwJSAtNTAlO1xufVxuXG46aG9zdChbc2JiLWJhZGdlXTppcyg6c3RhdGUoaGFzLWljb24tbmFtZSksIDpzdGF0ZShzbG90dGVkLWljb24pKSk6OmFmdGVyIHtcbiAgaW5zZXQ6IGNhbGMoXG4gICAgICB2YXIoLS1zYmItbWVudS1hY3Rpb24tb3V0ZXItdmVydGljYWwtcGFkZGluZykgKyB2YXIoLS1zYmItbWVudS1hY3Rpb24tY29udGVudC1wYWRkaW5nLWJsb2NrKSArXG4gICAgICAgIHZhcigtLXNiYi1iYWRnZS1wb3NpdGlvbi1vZmZzZXQpXG4gICAgKVxuICAgIGNhbGMoXG4gICAgICAxMDAlIC0gdmFyKC0tc2JiLW1lbnUtYWN0aW9uLW91dGVyLWhvcml6b250YWwtcGFkZGluZykgLSB2YXIoXG4gICAgICAgICAgLS1zYmItbWVudS1hY3Rpb24tY29udGVudC1wYWRkaW5nLWlubGluZVxuICAgICAgICApIC0gdmFyKC0tc2JiLXNpemUtaWNvbi11aS1zbWFsbCkgK1xuICAgICAgICB2YXIoLS1zYmItYmFkZ2UtcG9zaXRpb24tb2Zmc2V0KVxuICAgIClcbiAgICBhdXRvIGF1dG8gIWltcG9ydGFudDtcbn1cblxuOmhvc3QoW2FyaWEtY29udHJvbHMqPSdzYmItbWVudSddKSB7XG4gIC0tc2JiLW1lbnUtYWN0aW9uLXN1Ym1lbnUtaWNvbi1kaXNwbGF5OiBmbGV4O1xufVxuXG46aXMoLnNiYi1tZW51LWJ1dHRvbiwgLnNiYi1tZW51LWxpbmspIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDEwMCU7XG4gIGNvbG9yOiB2YXIoLS1zYmItbWVudS1hY3Rpb24tY29sb3IpO1xuICBwYWRkaW5nOiB2YXIoLS1zYmItbWVudS1hY3Rpb24tb3V0ZXItdmVydGljYWwtcGFkZGluZylcbiAgICB2YXIoLS1zYmItbWVudS1hY3Rpb24tb3V0ZXItaG9yaXpvbnRhbC1wYWRkaW5nKTtcbiAgY3Vyc29yOiB2YXIoLS1zYmItbWVudS1hY3Rpb24tY3Vyc29yKTtcbiAgb3V0bGluZTogbm9uZTtcbn1cblxuLnNiYi1tZW51LWFjdGlvbl9fY29udGVudCB7XG4gIEBpbmNsdWRlIHNiYi50ZXh0LXhzLS1yZWd1bGFyO1xuXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogdmFyKC0tc2JiLW1lbnUtYWN0aW9uLWdhcCk7XG4gIHBhZGRpbmc6IHZhcigtLXNiYi1tZW51LWFjdGlvbi1jb250ZW50LXBhZGRpbmctYmxvY2spXG4gICAgdmFyKC0tc2JiLW1lbnUtYWN0aW9uLWNvbnRlbnQtcGFkZGluZy1pbmxpbmUpO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1zYmItbWVudS1hY3Rpb24tYm9yZGVyLXJhZGl1cyk7XG4gIHVzZXItc2VsZWN0OiBub25lO1xuICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zYmItbWVudS1iYWNrZ3JvdW5kLWNvbG9yKTtcblxuICAvLyBIYW5kbGUgZm9jdXMgb24gdGhlIGhvc3QgKGJ1dHRvbiB2YXJpYW50KVxuICA6aG9zdCg6Zm9jdXMtdmlzaWJsZSkgJixcbiAgLy8gSGFuZGxlIGZvY3VzIG9uIHRoZSBhY3Rpb24gKGxpbmsgdmFyaWFudClcbiAgOmZvY3VzLXZpc2libGUgJiB7XG4gICAgQGluY2x1ZGUgc2JiLmZvY3VzLW91dGxpbmU7XG4gIH1cblxuICBAaW5jbHVkZSBzYmIuaWYtZm9yY2VkLWNvbG9ycyB7XG4gICAgYm9yZGVyOiB2YXIoLS1zYmItYm9yZGVyLXdpZHRoLTJ4KSBzb2xpZCB2YXIoLS1zYmItbWVudS1hY3Rpb24tZm9yY2VkLWNvbG9yLWJvcmRlci1jb2xvcik7XG4gIH1cbn1cblxuLnNiYi1tZW51LWFjdGlvbl9faWNvbixcbi5zYmItbWVudS1zdWJtZW51X19pY29uIHtcbiAgZGlzcGxheTogZmxleDtcbiAgbWluLXdpZHRoOiB2YXIoLS1zYmItc2l6ZS1pY29uLXVpLXNtYWxsKTtcbiAgbWluLWhlaWdodDogdmFyKC0tc2JiLXNpemUtaWNvbi11aS1zbWFsbCk7XG59XG5cbi5zYmItbWVudS1zdWJtZW51X19pY29uIHtcbiAgZGlzcGxheTogdmFyKC0tc2JiLW1lbnUtYWN0aW9uLXN1Ym1lbnUtaWNvbi1kaXNwbGF5LCBub25lKTtcbiAgbWFyZ2luLWlubGluZS1zdGFydDogYXV0bztcbn1cblxuLnNiYi1tZW51LWFjdGlvbl9fbGFiZWwge1xuICBAaW5jbHVkZSBzYmIuZWxsaXBzaXM7XG5cbiAgOmhvc3QoOmlzKCN7JGRpc2FibGVkfSkpICYge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoO1xuICB9XG59XG4iLCJpbXBvcnQgeyB0eXBlIENTU1Jlc3VsdEdyb3VwLCBodG1sLCB0eXBlIFRlbXBsYXRlUmVzdWx0LCB1bnNhZmVDU1MgfSBmcm9tICdsaXQnO1xuXG5pbXBvcnQge1xuICB0eXBlIEFic3RyYWN0Q29uc3RydWN0b3IsXG4gIGJveFNpemluZ1N0eWxlcyxcbiAgU2JiQWN0aW9uQmFzZUVsZW1lbnQsXG4gIFNiYkRpc2FibGVkTWl4aW4sXG59IGZyb20gJy4uLy4uL2NvcmUudHMnO1xuaW1wb3J0IHsgU2JiSWNvbk5hbWVNaXhpbiB9IGZyb20gJy4uLy4uL2ljb24ucHVyZS50cyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL21lbnUtYWN0aW9uLnNjc3M/aW5saW5lJztcblxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgU2JiTWVudUFjdGlvbkNvbW1vbkVsZW1lbnRNaXhpblR5cGUgZXh0ZW5kcyBTYmJJY29uTmFtZU1peGluKFxuICBTYmJEaXNhYmxlZE1peGluKFNiYkFjdGlvbkJhc2VFbGVtZW50KSxcbikge31cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGNvbnN0IFNiYk1lbnVBY3Rpb25Db21tb25FbGVtZW50TWl4aW4gPSA8XG4gIFQgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYkFjdGlvbkJhc2VFbGVtZW50Pixcbj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4pOiBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYk1lbnVBY3Rpb25Db21tb25FbGVtZW50TWl4aW5UeXBlPiAmIFQgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTYmJNZW51QWN0aW9uQ29tbW9uRWxlbWVudFxuICAgIGV4dGVuZHMgU2JiSWNvbk5hbWVNaXhpbihTYmJEaXNhYmxlZE1peGluKHN1cGVyQ2xhc3MpKVxuICAgIGltcGxlbWVudHMgU2JiTWVudUFjdGlvbkNvbW1vbkVsZW1lbnRNaXhpblR5cGVcbiAge1xuICAgIHB1YmxpYyBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IFtib3hTaXppbmdTdHlsZXMsIHVuc2FmZUNTUyhzdHlsZSldO1xuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlbmRlclRlbXBsYXRlKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICAgIHJldHVybiBodG1sYFxuICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1tZW51LWFjdGlvbl9fY29udGVudFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JiLW1lbnUtYWN0aW9uX19pY29uXCI+ICR7c3VwZXIucmVuZGVySWNvblNsb3QoKX0gPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JiLW1lbnUtYWN0aW9uX19sYWJlbFwiPlxuICAgICAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1tZW51LXN1Ym1lbnVfX2ljb25cIj5cbiAgICAgICAgICAgIDxzYmItaWNvbiBuYW1lPVwiY2hldnJvbi1zbWFsbC1yaWdodC1zbWFsbFwiPjwvc2JiLWljb24+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICBgO1xuICAgIH1cbiAgfVxuICByZXR1cm4gU2JiTWVudUFjdGlvbkNvbW1vbkVsZW1lbnQgYXMgdW5rbm93biBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPFNiYk1lbnVBY3Rpb25Db21tb25FbGVtZW50TWl4aW5UeXBlPiAmXG4gICAgVDtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUNpQkEsSUFBYSxtQ0FHWCxlQUNnRTtDQUNoRSxNQUFlLG1DQUNMLGlCQUFpQixpQkFBaUIsV0FBVyxDQUFDLENBQUE7O0FBR3hDLFFBQUEsU0FBeUIsQ0FBQyxpQkFBaUIsVUFBVSxvQkFBTSxDQUFDOztFQUV2RCxpQkFBYztBQUMvQixVQUFPLElBQUk7O2lEQUVnQyxNQUFNLGdCQUFnQixDQUFBOzs7Ozs7Ozs7OztBQVdyRSxRQUFPIn0=
|
|
@@ -1,367 +0,0 @@
|
|
|
1
|
-
import { __esDecorate, __runInitializers } from "tslib";
|
|
2
|
-
import { html, isServer, unsafeCSS } from "lit";
|
|
3
|
-
import { property } from "lit/decorators.js";
|
|
4
|
-
import { SbbDarkModeController, SbbEscapableOverlayController, SbbFocusTrapController, SbbInertController, SbbLanguageController, SbbMediaMatcherController, SbbMediaQueryBreakpointSmallAndBelow, SbbOpenCloseBaseElement, SbbScrollHandler, boxSizingStyles, forwardEvent, getElementPosition, getElementPositionHorizontal, getNextElementIndex, i18nGoBack, idReference, interactivityChecker, isArrowKeyOrPageKeysPressed, isEventOnElement, isZeroAnimationDuration, removeAriaOverlayTriggerAttributes, setAriaOverlayTriggerAttributes, ɵstateController } from "./core.js";
|
|
5
|
-
import { SbbDividerElement } from "./divider.pure.js";
|
|
6
|
-
import { ref } from "lit/directives/ref.js";
|
|
7
|
-
import { SbbMenuButtonElement } from "./menu/menu-button/menu-button.component.js";
|
|
8
|
-
//#region src/elements/menu/menu/menu.scss?inline
|
|
9
|
-
var menu_default = ":host {\n display: contents;\n --sbb-menu-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-6x)\n );\n --sbb-focus-outline-color: var(--sbb-focus-outline-color-dark);\n --_sbb-menu-inset: 0 auto auto 0;\n --sbb-scrollbar-thumb-width: 0.125rem;\n --sbb-scrollbar-thumb-width-hover: 0.25rem;\n --sbb-scrollbar-width-firefox: thin;\n --sbb-scrollbar-color: color-mix(in srgb, var(--sbb-color-white) 30%, transparent);\n --sbb-scrollbar-color-hover: color-mix(in srgb, var(--sbb-color-white) 60%, transparent);\n --sbb-scrollbar-track-color: transparent;\n}\n@media (min-width: calc(64rem)) {\n :host {\n --sbb-menu-back-button-display: none;\n }\n}\n\n:host(:is(:is(:state(state-opened),[state--state-opened]), :is(:state(state-opening),[state--state-opening]))) {\n --sbb-menu-visibility: visible;\n --sbb-menu-backdrop-color: color-mix(in srgb, var(--sbb-color-black) 20%, transparent);\n}\n@media (min-width: calc(64rem)) {\n :host(:is(:is(:state(state-opened),[state--state-opened]), :is(:state(state-opening),[state--state-opening]))) {\n --sbb-menu-backdrop-color: transparent;\n }\n}\n\n:host(:not(:is(:state(nested),[state--nested]))) {\n --sbb-menu-back-button-display: none;\n}\n\n:host(:not(:is(:state(state-closed),[state--state-closed]))) {\n --_sbb-menu-inset: 0;\n}\n\n:host(:is(:state(dark),[state--dark])) {\n --sbb-focus-outline-color: var(--sbb-focus-outline-color-default);\n --sbb-scrollbar-color: color-mix(in srgb, var(--sbb-color-black) 30%, transparent);\n --sbb-scrollbar-color-hover: color-mix(in srgb, var(--sbb-color-black) 60%, transparent);\n}\n\n@media (max-width: calc(63.9375rem)) {\n :host(:is(:state(skip-animation),[state--skip-animation])) {\n --sbb-menu-animation-duration: 0ms;\n }\n :host(:is(:state(nested-child),[state--nested-child])) {\n --sbb-menu-transform-x: -100%;\n }\n :host(:is(:state(nested),[state--nested]):is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]), :is(:state(state-closing),[state--state-closing]))) {\n --sbb-menu-open-animation-name: open-sideways;\n }\n :host(:is(:state(state-closing),[state--state-closing]):is(:state(nested),[state--nested]):not(:is(:state(close-all),[state--close-all]))) {\n --sbb-menu-close-animation-name: close-sideways;\n }\n}\n::slotted(:not(sbb-menu-button, sbb-menu-link, sbb-divider)) {\n display: block;\n padding-inline: var(--sbb-spacing-fixed-5x);\n}\n\nsbb-divider,\n::slotted(sbb-divider) {\n --sbb-divider-color: var(--sbb-background-color-4-inverted);\n margin-block: var(--sbb-spacing-fixed-2x);\n}\n\nsbb-divider,\n#sbb-menu__back-button {\n display: var(--sbb-menu-back-button-display, block);\n}\n\n.sbb-menu__container {\n position: fixed;\n pointer-events: none;\n inset: var(--_sbb-menu-inset);\n height: var(--sbb-menu-container-height);\n z-index: var(--sbb-menu-z-index, var(--sbb-overlay-default-z-index));\n}\n.sbb-menu__container::before {\n content: \"\";\n visibility: var(--sbb-menu-visibility, hidden);\n pointer-events: all;\n position: fixed;\n inset: var(--_sbb-menu-inset);\n height: var(--sbb-menu-container-height);\n background-color: var(--sbb-menu-backdrop-color, transparent);\n transition-duration: var(--sbb-menu-animation-duration);\n transition-timing-function: var(--sbb-menu-animation-easing);\n transition-property: background-color, visibility;\n}\n:host(:is(:state(nested),[state--nested])) .sbb-menu__container::before {\n display: none;\n}\n\n.sbb-menu {\n display: none;\n opacity: 0;\n pointer-events: none;\n max-width: var(--sbb-menu-max-width);\n min-width: var(--sbb-menu-min-width);\n text-align: start;\n position: absolute;\n inset-inline-start: 0;\n inset-block-start: unset;\n inset-block-end: 0;\n inset-inline-end: unset;\n color: var(--sbb-menu-color);\n border: none;\n border-radius: var(--sbb-menu-border-radius) var(--sbb-menu-border-radius) 0 0;\n background-color: var(--sbb-menu-background-color);\n padding: 0;\n overflow: hidden;\n translate: var(--sbb-menu-transform-x, 0) 0;\n transition: translate var(--sbb-menu-animation-duration);\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-menu {\n display: block;\n opacity: 1;\n pointer-events: all;\n animation-name: var(--sbb-menu-open-animation-name, open);\n animation-duration: var(--sbb-menu-animation-duration);\n animation-timing-function: var(--sbb-menu-animation-easing);\n}\n:host(:is(:state(state-closing),[state--state-closing])) .sbb-menu {\n pointer-events: none;\n animation-name: var(--sbb-menu-close-animation-name, close);\n}\n@media (forced-colors: active) {\n .sbb-menu {\n outline: var(--sbb-border-width-1x) solid CanvasText;\n }\n}\n@media (min-width: calc(64rem)) {\n .sbb-menu {\n top: 0;\n bottom: unset;\n left: 0;\n right: unset;\n max-height: fit-content;\n border-radius: var(--sbb-menu-border-radius);\n }\n :host(:not(:is(:state(state-closed),[state--state-closed]))) .sbb-menu {\n top: var(--sbb-menu-position-y, 0);\n left: var(--sbb-menu-position-x, 0);\n max-height: var(--sbb-menu-max-height);\n min-height: var(--sbb-menu-min-height);\n }\n}\n\n.sbb-menu__content {\n --sbb-scrollbar-width: var(--sbb-spacing-fixed-3x);\n}\n.sbb-menu__content::-webkit-scrollbar {\n width: var(--sbb-scrollbar-width);\n height: var(--sbb-scrollbar-width);\n background-color: var(--sbb-scrollbar-track-color, transparent);\n}\n.sbb-menu__content::-webkit-scrollbar-corner {\n background-color: var(--sbb-scrollbar-track-color, transparent);\n}\n.sbb-menu__content::-webkit-scrollbar-thumb {\n background-color: var(--sbb-scrollbar-color, currentcolor);\n border: calc(0.5 * (var(--sbb-scrollbar-width) - var(--sbb-scrollbar-thumb-width))) solid transparent;\n border-radius: var(--sbb-border-radius-4x);\n background-clip: padding-box;\n}\n.sbb-menu__content::-webkit-scrollbar-thumb:hover {\n background-color: var(--sbb-scrollbar-color-hover, currentcolor);\n border-width: calc(0.5 * (var(--sbb-scrollbar-width) - var(--sbb-scrollbar-thumb-width-hover)));\n}\n.sbb-menu__content::-webkit-scrollbar-button, .sbb-menu__content::-webkit-scrollbar-corner {\n display: none;\n}\n@supports not selector(::-webkit-scrollbar) {\n .sbb-menu__content {\n scrollbar-width: var(--sbb-scrollbar-width-firefox);\n scrollbar-color: var(--sbb-scrollbar-color, currentcolor) var(--sbb-scrollbar-track-color, transparent);\n }\n}\n.sbb-menu__content {\n max-height: var(--sbb-menu-max-height);\n padding-block: var(--sbb-spacing-fixed-1x);\n overflow: auto;\n outline: none;\n}\n.sbb-menu__content::after {\n content: \"\";\n display: block;\n height: var(--sbb-spacing-fixed-8x);\n}\n@media (min-width: calc(64rem)) {\n .sbb-menu__content {\n max-height: fit-content;\n }\n :host(:not(:is(:state(state-closed),[state--state-closed]))) .sbb-menu__content {\n max-height: var(--sbb-menu-max-height);\n min-height: var(--sbb-menu-min-height);\n }\n .sbb-menu__content::after {\n display: none;\n }\n}\n\n::slotted(:is(:is(:state(sbb-link),[state--sbb-link]), :is(:state(sbb-button),[state--sbb-button]))) {\n color-scheme: only light;\n}\n\n@keyframes open {\n from {\n opacity: 0;\n translate: 0 var(--sbb-menu-transform-y, 100%);\n }\n to {\n opacity: 1;\n translate: 0 0;\n }\n}\n@keyframes close {\n from {\n opacity: 1;\n translate: 0 0;\n }\n to {\n opacity: 0;\n translate: 0 var(--sbb-menu-transform-y, 100%);\n }\n}\n@keyframes open-sideways {\n from {\n translate: 100% 0;\n }\n to {\n translate: 0 0;\n }\n}\n@keyframes close-sideways {\n from {\n translate: 0 0;\n }\n to {\n translate: 100% 0;\n }\n}";
|
|
10
|
-
//#endregion
|
|
11
|
-
//#region src/elements/menu/menu/menu.component.ts
|
|
12
|
-
var MENU_OFFSET = 8;
|
|
13
|
-
var NESTED_MENU_OFFSET = -4;
|
|
14
|
-
var INTERACTIVE_ELEMENTS = [
|
|
15
|
-
"A",
|
|
16
|
-
"BUTTON",
|
|
17
|
-
"SBB-BUTTON",
|
|
18
|
-
"SBB-BUTTON-LINK",
|
|
19
|
-
"SBB-LINK",
|
|
20
|
-
"SBB-BLOCK-LINK",
|
|
21
|
-
"SBB-LINK-BUTTON",
|
|
22
|
-
"SBB-BLOCK-LINK-BUTTON",
|
|
23
|
-
"SBB-MENU-BUTTON",
|
|
24
|
-
"SBB-MENU-LINK"
|
|
25
|
-
];
|
|
26
|
-
var nextId = 0;
|
|
27
|
-
/**
|
|
28
|
-
* It displays a contextual menu with one or more action element.
|
|
29
|
-
*
|
|
30
|
-
* @slot - Use the unnamed slot to add `sbb-menu-button`/`sbb-menu-link` or other elements to the menu.
|
|
31
|
-
* @cssprop [--sbb-menu-z-index=var(--sbb-overlay-default-z-index)] - To specify a custom stack order,
|
|
32
|
-
* the `z-index` can be overridden by defining this CSS variable. The default `z-index` of the
|
|
33
|
-
* component is set to `var(--sbb-overlay-default-z-index)` with a value of `1000`.
|
|
34
|
-
*/
|
|
35
|
-
var SbbMenuElement = (() => {
|
|
36
|
-
let _classSuper = SbbOpenCloseBaseElement;
|
|
37
|
-
let _trigger_decorators;
|
|
38
|
-
let _trigger_initializers = [];
|
|
39
|
-
let _trigger_extraInitializers = [];
|
|
40
|
-
return class SbbMenuElement extends _classSuper {
|
|
41
|
-
static {
|
|
42
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
43
|
-
_trigger_decorators = [idReference(), property()];
|
|
44
|
-
__esDecorate(this, null, _trigger_decorators, {
|
|
45
|
-
kind: "accessor",
|
|
46
|
-
name: "trigger",
|
|
47
|
-
static: false,
|
|
48
|
-
private: false,
|
|
49
|
-
access: {
|
|
50
|
-
has: (obj) => "trigger" in obj,
|
|
51
|
-
get: (obj) => obj.trigger,
|
|
52
|
-
set: (obj, value) => {
|
|
53
|
-
obj.trigger = value;
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
metadata: _metadata
|
|
57
|
-
}, _trigger_initializers, _trigger_extraInitializers);
|
|
58
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, {
|
|
59
|
-
enumerable: true,
|
|
60
|
-
configurable: true,
|
|
61
|
-
writable: true,
|
|
62
|
-
value: _metadata
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
static {
|
|
66
|
-
this.elementName = "sbb-menu";
|
|
67
|
-
}
|
|
68
|
-
static {
|
|
69
|
-
this.elementDependencies = [SbbDividerElement, SbbMenuButtonElement];
|
|
70
|
-
}
|
|
71
|
-
static {
|
|
72
|
-
this.styles = [boxSizingStyles, unsafeCSS(menu_default)];
|
|
73
|
-
}
|
|
74
|
-
static {
|
|
75
|
-
this.role = "menu";
|
|
76
|
-
}
|
|
77
|
-
#trigger_accessor_storage;
|
|
78
|
-
/**
|
|
79
|
-
* The element that will trigger the menu overlay.
|
|
80
|
-
*
|
|
81
|
-
* For attribute usage, provide an id reference.
|
|
82
|
-
*/
|
|
83
|
-
get trigger() {
|
|
84
|
-
return this.#trigger_accessor_storage;
|
|
85
|
-
}
|
|
86
|
-
set trigger(value) {
|
|
87
|
-
this.#trigger_accessor_storage = value;
|
|
88
|
-
}
|
|
89
|
-
constructor() {
|
|
90
|
-
super();
|
|
91
|
-
this.#trigger_accessor_storage = __runInitializers(this, _trigger_initializers, null);
|
|
92
|
-
this._menu = __runInitializers(this, _trigger_extraInitializers);
|
|
93
|
-
this._triggerElement = null;
|
|
94
|
-
this._isPointerDownEventOnMenu = false;
|
|
95
|
-
this._escapableOverlayController = new SbbEscapableOverlayController(this);
|
|
96
|
-
this._focusTrapController = new SbbFocusTrapController(this);
|
|
97
|
-
this._scrollHandler = new SbbScrollHandler();
|
|
98
|
-
this._inertController = new SbbInertController(this);
|
|
99
|
-
this._mobileBreakpoint = SbbMediaQueryBreakpointSmallAndBelow;
|
|
100
|
-
this._mediaMatcher = new SbbMediaMatcherController(this, { [this._mobileBreakpoint]: (matches) => {
|
|
101
|
-
if (matches && (this.state === "opening" || this.state === "opened")) this._scrollHandler.disableScroll();
|
|
102
|
-
else this._scrollHandler.enableScroll();
|
|
103
|
-
} });
|
|
104
|
-
this._darkModeController = new SbbDarkModeController(this, () => this._syncNegative());
|
|
105
|
-
this._language = new SbbLanguageController(this);
|
|
106
|
-
this._nestedMenu = null;
|
|
107
|
-
this._pointerDownListener = (event) => {
|
|
108
|
-
const menu = event.target.closest("sbb-menu");
|
|
109
|
-
this._isPointerDownEventOnMenu = isEventOnElement(this._menu, event) || this._nestedMenus().some((el) => menu === el);
|
|
110
|
-
};
|
|
111
|
-
this._closeOnBackdropClick = (event) => {
|
|
112
|
-
const target = event.target;
|
|
113
|
-
if (!this._isPointerDownEventOnMenu && !isEventOnElement(this._menu, event) && !this._nestedMenus().some((el) => el === target)) this.closeAll();
|
|
114
|
-
};
|
|
115
|
-
this.addEventListener?.("keydown", (e) => this._handleKeyDown(e));
|
|
116
|
-
}
|
|
117
|
-
firstUpdated(changedProperties) {
|
|
118
|
-
super.firstUpdated(changedProperties);
|
|
119
|
-
this._configureTrigger();
|
|
120
|
-
}
|
|
121
|
-
escapeStrategy() {
|
|
122
|
-
this.closeAll();
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Opens the menu on trigger click.
|
|
126
|
-
*/
|
|
127
|
-
open() {
|
|
128
|
-
if (this.state === "closing" || this.state === "opened" || !this._menu || !this.dispatchBeforeOpenEvent()) return;
|
|
129
|
-
if (this._isNested()) {
|
|
130
|
-
const parentMenu = this._parentMenu();
|
|
131
|
-
parentMenu.internals.states.add("nested-child");
|
|
132
|
-
if (parentMenu._nestedMenu !== this) parentMenu._nestedMenu?.close();
|
|
133
|
-
parentMenu._nestedMenu = this;
|
|
134
|
-
}
|
|
135
|
-
this.showPopover?.();
|
|
136
|
-
this.state = "opening";
|
|
137
|
-
this._setMenuPosition();
|
|
138
|
-
this._triggerElement?.setAttribute("aria-expanded", "true");
|
|
139
|
-
if (this._isMobile()) this._scrollHandler.disableScroll();
|
|
140
|
-
if (this._isZeroAnimationDuration()) this._handleOpening();
|
|
141
|
-
}
|
|
142
|
-
/** Closes the menu and all its nested menus. */
|
|
143
|
-
close() {
|
|
144
|
-
this._close();
|
|
145
|
-
}
|
|
146
|
-
/** Closes the menu and all related menus (nested and parent menus). */
|
|
147
|
-
closeAll() {
|
|
148
|
-
this._mainMenu()._close(true);
|
|
149
|
-
}
|
|
150
|
-
/** @param [closeAll='false'] - If true, it ensures animations are correct by toggling some states when closing all related menus at once. */
|
|
151
|
-
_close(closeAll = false) {
|
|
152
|
-
if (this.state === "opening" && !this._isNested() || !this.dispatchBeforeCloseEvent()) return;
|
|
153
|
-
this._nestedMenu?._close(closeAll);
|
|
154
|
-
if (this._isNested()) {
|
|
155
|
-
const parentMenu = this._parentMenu();
|
|
156
|
-
if (closeAll) {
|
|
157
|
-
this.internals.states.add("close-all");
|
|
158
|
-
parentMenu.internals.states.add("skip-animation");
|
|
159
|
-
} else {
|
|
160
|
-
this.internals.states.delete("close-all");
|
|
161
|
-
parentMenu.internals.states.delete("skip-animation");
|
|
162
|
-
}
|
|
163
|
-
parentMenu.internals.states.delete("nested-child");
|
|
164
|
-
parentMenu._nestedMenu = null;
|
|
165
|
-
}
|
|
166
|
-
this.state = "closing";
|
|
167
|
-
this._triggerElement?.setAttribute("aria-expanded", "false");
|
|
168
|
-
if (this._isZeroAnimationDuration()) this._handleClosing();
|
|
169
|
-
}
|
|
170
|
-
_isZeroAnimationDuration() {
|
|
171
|
-
return isZeroAnimationDuration(this, "--sbb-menu-animation-duration");
|
|
172
|
-
}
|
|
173
|
-
_handleOpening() {
|
|
174
|
-
this.state = "opened";
|
|
175
|
-
if (!this._isNested()) this._inertController.activate();
|
|
176
|
-
else this._updateNestedInert();
|
|
177
|
-
this._escapableOverlayController.connect();
|
|
178
|
-
this._focusTrapController.focusInitialElement();
|
|
179
|
-
this._focusTrapController.enabled = true;
|
|
180
|
-
this._attachWindowEvents();
|
|
181
|
-
this.dispatchOpenEvent();
|
|
182
|
-
}
|
|
183
|
-
_handleClosing() {
|
|
184
|
-
this.state = "closed";
|
|
185
|
-
this.internals.states.delete("skip-animation");
|
|
186
|
-
this.internals.states.delete("close-all");
|
|
187
|
-
this.hidePopover?.();
|
|
188
|
-
this._menu?.firstElementChild?.scrollTo(0, 0);
|
|
189
|
-
if (!this._isNested()) this._inertController.deactivate();
|
|
190
|
-
else this._updateNestedInert();
|
|
191
|
-
this._triggerElement?.focus({ preventScroll: ["sbb-header-button", "sbb-header-link"].includes(this._triggerElement.localName) });
|
|
192
|
-
this._escapableOverlayController.disconnect();
|
|
193
|
-
this.dispatchCloseEvent();
|
|
194
|
-
this._windowEventsController?.abort();
|
|
195
|
-
this._focusTrapController.enabled = false;
|
|
196
|
-
this._scrollHandler.enableScroll();
|
|
197
|
-
}
|
|
198
|
-
_handleKeyDown(evt) {
|
|
199
|
-
if (!isArrowKeyOrPageKeysPressed(evt)) return;
|
|
200
|
-
evt.preventDefault();
|
|
201
|
-
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));
|
|
202
|
-
const current = enabledActions.findIndex((e) => e === evt.target);
|
|
203
|
-
let nextIndex;
|
|
204
|
-
switch (evt.key) {
|
|
205
|
-
case "ArrowUp":
|
|
206
|
-
case "ArrowDown":
|
|
207
|
-
nextIndex = getNextElementIndex(evt, current, enabledActions.length);
|
|
208
|
-
break;
|
|
209
|
-
case "ArrowLeft":
|
|
210
|
-
if (this._isNested()) this.close();
|
|
211
|
-
break;
|
|
212
|
-
case "ArrowRight":
|
|
213
|
-
if (evt.target.matches(":is(:state(sbb-menu-trigger),[state--sbb-menu-trigger])")) evt.target.click();
|
|
214
|
-
break;
|
|
215
|
-
case "PageUp":
|
|
216
|
-
case "Home":
|
|
217
|
-
nextIndex = 0;
|
|
218
|
-
break;
|
|
219
|
-
case "End":
|
|
220
|
-
case "PageDown":
|
|
221
|
-
nextIndex = enabledActions.length - 1;
|
|
222
|
-
break;
|
|
223
|
-
}
|
|
224
|
-
if (nextIndex !== void 0) enabledActions[nextIndex].focus();
|
|
225
|
-
}
|
|
226
|
-
createRenderRoot() {
|
|
227
|
-
const renderRoot = super.createRenderRoot();
|
|
228
|
-
this.shadowRoot?.addEventListener("slotchange", () => this._syncNegative(), { capture: true });
|
|
229
|
-
return renderRoot;
|
|
230
|
-
}
|
|
231
|
-
connectedCallback() {
|
|
232
|
-
this.popover = "manual";
|
|
233
|
-
super.connectedCallback();
|
|
234
|
-
this.id ||= `sbb-menu-${nextId++}`;
|
|
235
|
-
if (this.hasUpdated) this._configureTrigger();
|
|
236
|
-
}
|
|
237
|
-
disconnectedCallback() {
|
|
238
|
-
super.disconnectedCallback();
|
|
239
|
-
this._triggerElement = null;
|
|
240
|
-
this._triggerAbortController?.abort();
|
|
241
|
-
this._windowEventsController?.abort();
|
|
242
|
-
this._scrollHandler.enableScroll();
|
|
243
|
-
}
|
|
244
|
-
requestUpdate(name, oldValue, options) {
|
|
245
|
-
super.requestUpdate(name, oldValue, options);
|
|
246
|
-
if (!isServer && (!name || name === "trigger") && this.hasUpdated) this._configureTrigger();
|
|
247
|
-
}
|
|
248
|
-
_configureTrigger() {
|
|
249
|
-
if (this.trigger === this._triggerElement) return;
|
|
250
|
-
this._triggerAbortController?.abort();
|
|
251
|
-
removeAriaOverlayTriggerAttributes(this._triggerElement);
|
|
252
|
-
this._triggerElement = this.trigger;
|
|
253
|
-
if (!this._triggerElement) return;
|
|
254
|
-
setAriaOverlayTriggerAttributes(this._triggerElement, "menu", this.id, this.state);
|
|
255
|
-
this._triggerAbortController = new AbortController();
|
|
256
|
-
this._triggerElement.addEventListener("click", () => this.open(), { signal: this._triggerAbortController.signal });
|
|
257
|
-
this.toggleState("nested", ["sbb-menu-button", "sbb-menu-link"].includes(this._triggerElement.localName));
|
|
258
|
-
ɵstateController(this._triggerElement).add("sbb-menu-trigger");
|
|
259
|
-
}
|
|
260
|
-
_attachWindowEvents() {
|
|
261
|
-
this._windowEventsController = new AbortController();
|
|
262
|
-
document.addEventListener("scroll", () => this._setMenuPosition(), {
|
|
263
|
-
passive: true,
|
|
264
|
-
signal: this._windowEventsController.signal,
|
|
265
|
-
capture: true
|
|
266
|
-
});
|
|
267
|
-
window.addEventListener("resize", () => this._setMenuPosition(), {
|
|
268
|
-
passive: true,
|
|
269
|
-
signal: this._windowEventsController.signal
|
|
270
|
-
});
|
|
271
|
-
if (!this._isNested()) {
|
|
272
|
-
window.addEventListener("pointerdown", this._pointerDownListener, { signal: this._windowEventsController.signal });
|
|
273
|
-
window.addEventListener("pointerup", this._closeOnBackdropClick, { signal: this._windowEventsController.signal });
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
_interactiveElementClick(event) {
|
|
277
|
-
const target = event.target;
|
|
278
|
-
if (INTERACTIVE_ELEMENTS.includes(target.nodeName) && !target.hasAttribute("disabled") && !target.matches(":is(:state(sbb-menu-trigger),[state--sbb-menu-trigger])") && target.id !== "sbb-menu__back-button") this.closeAll();
|
|
279
|
-
}
|
|
280
|
-
/** Converts the linked list into an array of SbbMenuElement. */
|
|
281
|
-
_nestedMenus() {
|
|
282
|
-
const menus = [];
|
|
283
|
-
let current = this._nestedMenu;
|
|
284
|
-
while (current) {
|
|
285
|
-
menus.push(current);
|
|
286
|
-
current = current._nestedMenu;
|
|
287
|
-
}
|
|
288
|
-
return menus;
|
|
289
|
-
}
|
|
290
|
-
_parentMenu() {
|
|
291
|
-
return this._triggerElement?.closest("sbb-menu") ?? null;
|
|
292
|
-
}
|
|
293
|
-
/** The outermost menu. */
|
|
294
|
-
_mainMenu() {
|
|
295
|
-
return this._isNested() ? this._parentMenu()?._mainMenu() ?? this : this;
|
|
296
|
-
}
|
|
297
|
-
_isNested() {
|
|
298
|
-
return !!this._parentMenu();
|
|
299
|
-
}
|
|
300
|
-
_updateNestedInert() {
|
|
301
|
-
this._inertController.restoreAllExempted();
|
|
302
|
-
this._mainMenu()._nestedMenus().forEach((menu) => this._inertController.exempt(menu));
|
|
303
|
-
}
|
|
304
|
-
_handleMouseOver(event) {
|
|
305
|
-
const element = event.target;
|
|
306
|
-
const isMobile = this._isMobile();
|
|
307
|
-
if (!isMobile && this._nestedMenu && !element.classList.contains("sbb-menu__content") && !(element.getAttribute("aria-expanded") === "true")) this._nestedMenu.close();
|
|
308
|
-
if (element.matches(":is(:state(sbb-menu-trigger),[state--sbb-menu-trigger])") && !isMobile) element.click();
|
|
309
|
-
}
|
|
310
|
-
_onMenuAnimationEnd(event) {
|
|
311
|
-
if ((event.animationName === "open" || event.animationName === "open-sideways") && this.state === "opening") this._handleOpening();
|
|
312
|
-
else if ((event.animationName === "close" || event.animationName === "close-sideways") && this.state === "closing") this._handleClosing();
|
|
313
|
-
}
|
|
314
|
-
_setMenuPosition() {
|
|
315
|
-
if (this._isMobile() || !this._menu || !this._triggerElement || this.state === "closing") return;
|
|
316
|
-
const menuPosition = !this._isNested() ? getElementPosition(this.shadowRoot.querySelector(".sbb-menu__content"), this._triggerElement, this.shadowRoot.querySelector(".sbb-menu__container"), { verticalOffset: MENU_OFFSET }) : getElementPositionHorizontal(this.shadowRoot.querySelector(".sbb-menu__content"), this._triggerElement, this.shadowRoot.querySelector(".sbb-menu__container"), {
|
|
317
|
-
horizontalOffset: MENU_OFFSET,
|
|
318
|
-
verticalOffset: NESTED_MENU_OFFSET,
|
|
319
|
-
contentSelector: ".sbb-menu__content"
|
|
320
|
-
});
|
|
321
|
-
this.style.setProperty("--sbb-menu-position-x", `${menuPosition.left}px`);
|
|
322
|
-
this.style.setProperty("--sbb-menu-position-y", `${menuPosition.top}px`);
|
|
323
|
-
this.style.setProperty("--sbb-menu-max-height", menuPosition.maxHeight);
|
|
324
|
-
}
|
|
325
|
-
_syncNegative() {
|
|
326
|
-
this.querySelectorAll(":is(:state(sbb-link),[state--sbb-link]), :is(:state(sbb-button),[state--sbb-button])")?.forEach((el) => {
|
|
327
|
-
customElements.upgrade(el);
|
|
328
|
-
el.negative = !this._darkModeController.matches();
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
_isMobile() {
|
|
332
|
-
return this._mediaMatcher.matches(this._mobileBreakpoint) ?? true;
|
|
333
|
-
}
|
|
334
|
-
render() {
|
|
335
|
-
return html`
|
|
336
|
-
<div class="sbb-menu__container">
|
|
337
|
-
<div
|
|
338
|
-
@animationend=${this._onMenuAnimationEnd}
|
|
339
|
-
@mouseover=${(e) => this._handleMouseOver(e)}
|
|
340
|
-
class="sbb-menu"
|
|
341
|
-
${ref((el) => this._menu = el)}
|
|
342
|
-
>
|
|
343
|
-
<div
|
|
344
|
-
@click=${(event) => this._interactiveElementClick(event)}
|
|
345
|
-
@scroll=${(e) => forwardEvent(e, document)}
|
|
346
|
-
class="sbb-menu__content"
|
|
347
|
-
>
|
|
348
|
-
<slot></slot>
|
|
349
|
-
<sbb-divider></sbb-divider>
|
|
350
|
-
<sbb-menu-button
|
|
351
|
-
id="sbb-menu__back-button"
|
|
352
|
-
@click=${() => this.close()}
|
|
353
|
-
icon-name="chevron-small-left-small"
|
|
354
|
-
>
|
|
355
|
-
${i18nGoBack[this._language.current]}
|
|
356
|
-
</sbb-menu-button>
|
|
357
|
-
</div>
|
|
358
|
-
</div>
|
|
359
|
-
</div>
|
|
360
|
-
`;
|
|
361
|
-
}
|
|
362
|
-
};
|
|
363
|
-
})();
|
|
364
|
-
//#endregion
|
|
365
|
-
export { SbbMenuElement as t };
|
|
366
|
-
|
|
367
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQtRE92N1BLSWkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL21lbnUvbWVudS9tZW51LnNjc3M/aW5saW5lIiwiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL21lbnUvbWVudS9tZW51LmNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJAdXNlICcuLi8uLi9jb3JlL3N0eWxlcycgYXMgc2JiO1xuXG46aG9zdCB7XG4gIC8vIFdlIHVzZSB0aGlzIHJ1bGUgdG8gbWFrZSB0aGUgaW5uZXIgY29udGFpbmVyIGVsZW1lbnQgdG8gYXBwZWFyIGFzIGlmIGl0IHdlcmUgYVxuICAvLyBkaXJlY3QgY2hpbGQgb2YgdGhlIGhvc3QncyBwYXJlbnQgZWxlbWVudC4gVGhpcyBpcyB1c2VmdWwgYmVjYXVzZSB0aGUgaG9zdFxuICAvLyBzaG91bGQgYmUgaWdub3JlZCB3aGVuIHVzaW5nIENTUyBncmlkIG9yIHNpbWlsYXIgbGF5b3V0IHRlY2huaXF1ZXMuXG4gIGRpc3BsYXk6IGNvbnRlbnRzO1xuXG4gIC0tc2JiLW1lbnUtYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoXG4gICAgLS1zYmItZGlzYWJsZS1hbmltYXRpb24tZHVyYXRpb24sXG4gICAgdmFyKC0tc2JiLWFuaW1hdGlvbi1kdXJhdGlvbi02eClcbiAgKTtcbiAgLS1zYmItZm9jdXMtb3V0bGluZS1jb2xvcjogdmFyKC0tc2JiLWZvY3VzLW91dGxpbmUtY29sb3ItZGFyayk7XG4gIC0tX3NiYi1tZW51LWluc2V0OiAwIGF1dG8gYXV0byAwO1xuXG4gIEBpbmNsdWRlIHNiYi5zY3JvbGxiYXItdmFyaWFibGVzKCRuZWdhdGl2ZTogdHJ1ZSk7XG5cbiAgQGluY2x1ZGUgc2JiLm1xKCRmcm9tOiBsYXJnZSkge1xuICAgIC0tc2JiLW1lbnUtYmFjay1idXR0b24tZGlzcGxheTogbm9uZTtcbiAgfVxufVxuXG46aG9zdCg6aXMoOnN0YXRlKHN0YXRlLW9wZW5lZCksIDpzdGF0ZShzdGF0ZS1vcGVuaW5nKSkpIHtcbiAgLS1zYmItbWVudS12aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAtLXNiYi1tZW51LWJhY2tkcm9wLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc2JiLWNvbG9yLWJsYWNrKSAyMCUsIHRyYW5zcGFyZW50KTtcblxuICBAaW5jbHVkZSBzYmIubXEoJGZyb206IGxhcmdlKSB7XG4gICAgLS1zYmItbWVudS1iYWNrZHJvcC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIH1cbn1cblxuOmhvc3QoOm5vdCg6c3RhdGUobmVzdGVkKSkpIHtcbiAgLS1zYmItbWVudS1iYWNrLWJ1dHRvbi1kaXNwbGF5OiBub25lO1xufVxuXG46aG9zdCg6bm90KDpzdGF0ZShzdGF0ZS1jbG9zZWQpKSkge1xuICAtLV9zYmItbWVudS1pbnNldDogMDtcbn1cblxuOmhvc3QoOnN0YXRlKGRhcmspKSB7XG4gIC0tc2JiLWZvY3VzLW91dGxpbmUtY29sb3I6IHZhcigtLXNiYi1mb2N1cy1vdXRsaW5lLWNvbG9yLWRlZmF1bHQpO1xuXG4gIC8vIFdlIGhhdmUgdG8gZW5zdXJlIHRoYXQgdGhlIHNjcm9sbGJhciBpcyB2aXNpYmxlIGluIGRhcmsgbW9kZSB3aXRoIG5vbi1kYXJrIG1vZGUgdmFsdWVzLlxuICAtLXNiYi1zY3JvbGxiYXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zYmItY29sb3ItYmxhY2spIDMwJSwgdHJhbnNwYXJlbnQpO1xuICAtLXNiYi1zY3JvbGxiYXItY29sb3ItaG92ZXI6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zYmItY29sb3ItYmxhY2spIDYwJSwgdHJhbnNwYXJlbnQpO1xufVxuXG5AaW5jbHVkZSBzYmIubXEoJHRvOiBsYXJnZSkge1xuICA6aG9zdCg6c3RhdGUoc2tpcC1hbmltYXRpb24pKSB7XG4gICAgLS1zYmItbWVudS1hbmltYXRpb24tZHVyYXRpb246IDBtcztcbiAgfVxuXG4gIDpob3N0KDpzdGF0ZShuZXN0ZWQtY2hpbGQpKSB7XG4gICAgLS1zYmItbWVudS10cmFuc2Zvcm0teDogLTEwMCU7XG4gIH1cblxuICA6aG9zdCg6c3RhdGUobmVzdGVkKTppcyg6c3RhdGUoc3RhdGUtb3BlbmluZyksIDpzdGF0ZShzdGF0ZS1vcGVuZWQpLCA6c3RhdGUoc3RhdGUtY2xvc2luZykpKSB7XG4gICAgLS1zYmItbWVudS1vcGVuLWFuaW1hdGlvbi1uYW1lOiBvcGVuLXNpZGV3YXlzO1xuICB9XG5cbiAgOmhvc3QoOnN0YXRlKHN0YXRlLWNsb3NpbmcpOnN0YXRlKG5lc3RlZCk6bm90KDpzdGF0ZShjbG9zZS1hbGwpKSkge1xuICAgIC0tc2JiLW1lbnUtY2xvc2UtYW5pbWF0aW9uLW5hbWU6IGNsb3NlLXNpZGV3YXlzO1xuICB9XG59XG5cbjo6c2xvdHRlZCg6bm90KHNiYi1tZW51LWJ1dHRvbiwgc2JiLW1lbnUtbGluaywgc2JiLWRpdmlkZXIpKSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nLWlubGluZTogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtNXgpO1xufVxuXG5zYmItZGl2aWRlcixcbjo6c2xvdHRlZChzYmItZGl2aWRlcikge1xuICAtLXNiYi1kaXZpZGVyLWNvbG9yOiB2YXIoLS1zYmItYmFja2dyb3VuZC1jb2xvci00LWludmVydGVkKTtcblxuICBtYXJnaW4tYmxvY2s6IHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTJ4KTtcbn1cblxuc2JiLWRpdmlkZXIsXG4jc2JiLW1lbnVfX2JhY2stYnV0dG9uIHtcbiAgZGlzcGxheTogdmFyKC0tc2JiLW1lbnUtYmFjay1idXR0b24tZGlzcGxheSwgYmxvY2spO1xufVxuXG4uc2JiLW1lbnVfX2NvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIGluc2V0OiB2YXIoLS1fc2JiLW1lbnUtaW5zZXQpO1xuICBoZWlnaHQ6IHZhcigtLXNiYi1tZW51LWNvbnRhaW5lci1oZWlnaHQpO1xuICB6LWluZGV4OiB2YXIoLS1zYmItbWVudS16LWluZGV4LCB2YXIoLS1zYmItb3ZlcmxheS1kZWZhdWx0LXotaW5kZXgpKTtcblxuICAvLyBNZW51IGJhY2tkcm9wIChvbmx5IHZpc2libGUgb24gbW9iaWxlKVxuICAmOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHZpc2liaWxpdHk6IHZhcigtLXNiYi1tZW51LXZpc2liaWxpdHksIGhpZGRlbik7XG4gICAgcG9pbnRlci1ldmVudHM6IGFsbDtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgaW5zZXQ6IHZhcigtLV9zYmItbWVudS1pbnNldCk7XG4gICAgaGVpZ2h0OiB2YXIoLS1zYmItbWVudS1jb250YWluZXItaGVpZ2h0KTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zYmItbWVudS1iYWNrZHJvcC1jb2xvciwgdHJhbnNwYXJlbnQpO1xuICAgIHRyYW5zaXRpb246IHtcbiAgICAgIGR1cmF0aW9uOiB2YXIoLS1zYmItbWVudS1hbmltYXRpb24tZHVyYXRpb24pO1xuICAgICAgdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1zYmItbWVudS1hbmltYXRpb24tZWFzaW5nKTtcbiAgICAgIHByb3BlcnR5OiBiYWNrZ3JvdW5kLWNvbG9yLCB2aXNpYmlsaXR5O1xuICAgIH1cblxuICAgIC8vIEhpZGUgdGhlIGJhY2tkcm9wIHdoZW4gaW4gbmVzdGVkIHN0YXRlXG4gICAgOmhvc3QoOnN0YXRlKG5lc3RlZCkpICYge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIH1cbn1cblxuLnNiYi1tZW51IHtcbiAgZGlzcGxheTogbm9uZTtcbiAgb3BhY2l0eTogMDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIG1heC13aWR0aDogdmFyKC0tc2JiLW1lbnUtbWF4LXdpZHRoKTtcbiAgbWluLXdpZHRoOiB2YXIoLS1zYmItbWVudS1taW4td2lkdGgpO1xuICB0ZXh0LWFsaWduOiBzdGFydDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBpbnNldC1pbmxpbmUtc3RhcnQ6IDA7XG4gIGluc2V0LWJsb2NrLXN0YXJ0OiB1bnNldDtcbiAgaW5zZXQtYmxvY2stZW5kOiAwO1xuICBpbnNldC1pbmxpbmUtZW5kOiB1bnNldDtcbiAgY29sb3I6IHZhcigtLXNiYi1tZW51LWNvbG9yKTtcbiAgYm9yZGVyOiBub25lO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1zYmItbWVudS1ib3JkZXItcmFkaXVzKSB2YXIoLS1zYmItbWVudS1ib3JkZXItcmFkaXVzKSAwIDA7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNiYi1tZW51LWJhY2tncm91bmQtY29sb3IpO1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0cmFuc2xhdGU6IHZhcigtLXNiYi1tZW51LXRyYW5zZm9ybS14LCAwKSAwO1xuXG4gIC8vIFVzZWQgd2hlbiBuYXZpZ2F0aW5nIGJhY2sgZnJvbSBuZXN0ZWQgbWVudSBpbiBtb2JpbGUgdmlld1xuICB0cmFuc2l0aW9uOiB0cmFuc2xhdGUgdmFyKC0tc2JiLW1lbnUtYW5pbWF0aW9uLWR1cmF0aW9uKTtcblxuICA6aG9zdCg6aXMoOnN0YXRlKHN0YXRlLW9wZW5pbmcpLCA6c3RhdGUoc3RhdGUtb3BlbmVkKSwgOnN0YXRlKHN0YXRlLWNsb3NpbmcpKSkgJiB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgb3BhY2l0eTogMTtcbiAgICBwb2ludGVyLWV2ZW50czogYWxsO1xuXG4gICAgYW5pbWF0aW9uOiB7XG4gICAgICBuYW1lOiB2YXIoLS1zYmItbWVudS1vcGVuLWFuaW1hdGlvbi1uYW1lLCBvcGVuKTtcbiAgICAgIGR1cmF0aW9uOiB2YXIoLS1zYmItbWVudS1hbmltYXRpb24tZHVyYXRpb24pO1xuICAgICAgdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1zYmItbWVudS1hbmltYXRpb24tZWFzaW5nKTtcbiAgICB9XG4gIH1cblxuICA6aG9zdCg6c3RhdGUoc3RhdGUtY2xvc2luZykpICYge1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIGFuaW1hdGlvbi1uYW1lOiB2YXIoLS1zYmItbWVudS1jbG9zZS1hbmltYXRpb24tbmFtZSwgY2xvc2UpO1xuICB9XG5cbiAgQGluY2x1ZGUgc2JiLmlmLWZvcmNlZC1jb2xvcnMge1xuICAgIG91dGxpbmU6IHZhcigtLXNiYi1ib3JkZXItd2lkdGgtMXgpIHNvbGlkIENhbnZhc1RleHQ7XG4gIH1cblxuICBAaW5jbHVkZSBzYmIubXEoJGZyb206IGxhcmdlKSB7XG4gICAgdG9wOiAwO1xuICAgIGJvdHRvbTogdW5zZXQ7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogdW5zZXQ7XG4gICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tc2JiLW1lbnUtYm9yZGVyLXJhZGl1cyk7XG5cbiAgICA6aG9zdCg6bm90KDpzdGF0ZShzdGF0ZS1jbG9zZWQpKSkgJiB7XG4gICAgICB0b3A6IHZhcigtLXNiYi1tZW51LXBvc2l0aW9uLXksIDApO1xuICAgICAgbGVmdDogdmFyKC0tc2JiLW1lbnUtcG9zaXRpb24teCwgMCk7XG4gICAgICBtYXgtaGVpZ2h0OiB2YXIoLS1zYmItbWVudS1tYXgtaGVpZ2h0KTtcbiAgICAgIG1pbi1oZWlnaHQ6IHZhcigtLXNiYi1tZW51LW1pbi1oZWlnaHQpO1xuICAgIH1cbiAgfVxufVxuXG4uc2JiLW1lbnVfX2NvbnRlbnQge1xuICBAaW5jbHVkZSBzYmIuc2Nyb2xsYmFyLXJ1bGVzO1xuXG4gIG1heC1oZWlnaHQ6IHZhcigtLXNiYi1tZW51LW1heC1oZWlnaHQpO1xuICBwYWRkaW5nLWJsb2NrOiB2YXIoLS1zYmItc3BhY2luZy1maXhlZC0xeCk7XG4gIG92ZXJmbG93OiBhdXRvO1xuICBvdXRsaW5lOiBub25lO1xuXG4gIC8vIE1hcmdpbiBib3R0b20gaW4gbW9iaWxlIHZhcmlhbnRcbiAgJjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGhlaWdodDogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtOHgpO1xuICB9XG5cbiAgQGluY2x1ZGUgc2JiLm1xKCRmcm9tOiBsYXJnZSkge1xuICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50O1xuXG4gICAgOmhvc3QoOm5vdCg6c3RhdGUoc3RhdGUtY2xvc2VkKSkpICYge1xuICAgICAgbWF4LWhlaWdodDogdmFyKC0tc2JiLW1lbnUtbWF4LWhlaWdodCk7XG4gICAgICBtaW4taGVpZ2h0OiB2YXIoLS1zYmItbWVudS1taW4taGVpZ2h0KTtcbiAgICB9XG5cbiAgICAmOjphZnRlciB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgfVxufVxuXG46OnNsb3R0ZWQoOmlzKDpzdGF0ZShzYmItbGluayksIDpzdGF0ZShzYmItYnV0dG9uKSkpIHtcbiAgLy8gQXMgdGhlIGJhY2tncm91bmQgdHVybnMgd2hpdGUsIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgYnV0dG9ucyBhbmQgbGlua3MgYXJlIGRpc3BsYXllZCBpbiBwb3NpdGl2ZS5cbiAgY29sb3Itc2NoZW1lOiBvbmx5IGxpZ2h0O1xufVxuXG5Aa2V5ZnJhbWVzIG9wZW4ge1xuICBmcm9tIHtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHRyYW5zbGF0ZTogMCB2YXIoLS1zYmItbWVudS10cmFuc2Zvcm0teSwgMTAwJSk7XG4gIH1cblxuICB0byB7XG4gICAgb3BhY2l0eTogMTtcbiAgICB0cmFuc2xhdGU6IDAgMDtcbiAgfVxufVxuXG5Aa2V5ZnJhbWVzIGNsb3NlIHtcbiAgZnJvbSB7XG4gICAgb3BhY2l0eTogMTtcbiAgICB0cmFuc2xhdGU6IDAgMDtcbiAgfVxuXG4gIHRvIHtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHRyYW5zbGF0ZTogMCB2YXIoLS1zYmItbWVudS10cmFuc2Zvcm0teSwgMTAwJSk7XG4gIH1cbn1cblxuQGtleWZyYW1lcyBvcGVuLXNpZGV3YXlzIHtcbiAgZnJvbSB7XG4gICAgdHJhbnNsYXRlOiAxMDAlIDA7XG4gIH1cblxuICB0byB7XG4gICAgdHJhbnNsYXRlOiAwIDA7XG4gIH1cbn1cblxuQGtleWZyYW1lcyBjbG9zZS1zaWRld2F5cyB7XG4gIGZyb20ge1xuICAgIHRyYW5zbGF0ZTogMCAwO1xuICB9XG5cbiAgdG8ge1xuICAgIHRyYW5zbGF0ZTogMTAwJSAwO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICB0eXBlIENTU1Jlc3VsdEdyb3VwLFxuICBodG1sLFxuICBpc1NlcnZlcixcbiAgdHlwZSBQcm9wZXJ0eURlY2xhcmF0aW9uLFxuICB0eXBlIFByb3BlcnR5VmFsdWVzLFxuICB0eXBlIFRlbXBsYXRlUmVzdWx0LFxuICB1bnNhZmVDU1MsXG59IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHJlZiB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlZi5qcyc7XG5cbmltcG9ydCB7XG4gIGJveFNpemluZ1N0eWxlcyxcbiAgZm9yd2FyZEV2ZW50LFxuICBnZXRFbGVtZW50UG9zaXRpb24sXG4gIGdldEVsZW1lbnRQb3NpdGlvbkhvcml6b250YWwsXG4gIGdldE5leHRFbGVtZW50SW5kZXgsXG4gIGkxOG5Hb0JhY2ssXG4gIGlkUmVmZXJlbmNlLFxuICBpbnRlcmFjdGl2aXR5Q2hlY2tlcixcbiAgaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkLFxuICBpc0V2ZW50T25FbGVtZW50LFxuICBpc1plcm9BbmltYXRpb25EdXJhdGlvbixcbiAgcmVtb3ZlQXJpYU92ZXJsYXlUcmlnZ2VyQXR0cmlidXRlcyxcbiAgU2JiRGFya01vZGVDb250cm9sbGVyLFxuICB0eXBlIFNiYkVsZW1lbnRUeXBlLFxuICBTYmJFc2NhcGFibGVPdmVybGF5Q29udHJvbGxlcixcbiAgU2JiRm9jdXNUcmFwQ29udHJvbGxlcixcbiAgU2JiSW5lcnRDb250cm9sbGVyLFxuICBTYmJMYW5ndWFnZUNvbnRyb2xsZXIsXG4gIFNiYk1lZGlhTWF0Y2hlckNvbnRyb2xsZXIsXG4gIFNiYk1lZGlhUXVlcnlCcmVha3BvaW50U21hbGxBbmRCZWxvdyxcbiAgdHlwZSBTYmJOZWdhdGl2ZU1peGluVHlwZSxcbiAgU2JiT3BlbkNsb3NlQmFzZUVsZW1lbnQsXG4gIFNiYlNjcm9sbEhhbmRsZXIsXG4gIHNldEFyaWFPdmVybGF5VHJpZ2dlckF0dHJpYnV0ZXMsXG4gIMm1c3RhdGVDb250cm9sbGVyLFxufSBmcm9tICcuLi8uLi9jb3JlLnRzJztcbmltcG9ydCB7IFNiYkRpdmlkZXJFbGVtZW50IH0gZnJvbSAnLi4vLi4vZGl2aWRlci5wdXJlLnRzJztcbmltcG9ydCB7IFNiYk1lbnVCdXR0b25FbGVtZW50IH0gZnJvbSAnLi4vbWVudS1idXR0b24vbWVudS1idXR0b24uY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgU2JiTWVudUxpbmtFbGVtZW50IH0gZnJvbSAnLi4vbWVudS1saW5rL21lbnUtbGluay5jb21wb25lbnQudHMnO1xuXG5pbXBvcnQgc3R5bGUgZnJvbSAnLi9tZW51LnNjc3M/aW5saW5lJztcblxuY29uc3QgTUVOVV9PRkZTRVQgPSA4O1xuY29uc3QgTkVTVEVEX01FTlVfT0ZGU0VUID0gLTQ7XG5jb25zdCBJTlRFUkFDVElWRV9FTEVNRU5UUyA9IFtcbiAgJ0EnLFxuICAnQlVUVE9OJyxcbiAgJ1NCQi1CVVRUT04nLFxuICAnU0JCLUJVVFRPTi1MSU5LJyxcbiAgJ1NCQi1MSU5LJyxcbiAgJ1NCQi1CTE9DSy1MSU5LJyxcbiAgJ1NCQi1MSU5LLUJVVFRPTicsXG4gICdTQkItQkxPQ0stTElOSy1CVVRUT04nLFxuICAnU0JCLU1FTlUtQlVUVE9OJyxcbiAgJ1NCQi1NRU5VLUxJTksnLFxuXTtcblxubGV0IG5leHRJZCA9IDA7XG5cbi8qKlxuICogSXQgZGlzcGxheXMgYSBjb250ZXh0dWFsIG1lbnUgd2l0aCBvbmUgb3IgbW9yZSBhY3Rpb24gZWxlbWVudC5cbiAqXG4gKiBAc2xvdCAtIFVzZSB0aGUgdW5uYW1lZCBzbG90IHRvIGFkZCBgc2JiLW1lbnUtYnV0dG9uYC9gc2JiLW1lbnUtbGlua2Agb3Igb3RoZXIgZWxlbWVudHMgdG8gdGhlIG1lbnUuXG4gKiBAY3NzcHJvcCBbLS1zYmItbWVudS16LWluZGV4PXZhcigtLXNiYi1vdmVybGF5LWRlZmF1bHQtei1pbmRleCldIC0gVG8gc3BlY2lmeSBhIGN1c3RvbSBzdGFjayBvcmRlcixcbiAqIHRoZSBgei1pbmRleGAgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZGVmaW5pbmcgdGhpcyBDU1MgdmFyaWFibGUuIFRoZSBkZWZhdWx0IGB6LWluZGV4YCBvZiB0aGVcbiAqIGNvbXBvbmVudCBpcyBzZXQgdG8gYHZhcigtLXNiYi1vdmVybGF5LWRlZmF1bHQtei1pbmRleClgIHdpdGggYSB2YWx1ZSBvZiBgMTAwMGAuXG4gKi9cbmV4cG9ydCBjbGFzcyBTYmJNZW51RWxlbWVudCBleHRlbmRzIFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50IHtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSBlbGVtZW50TmFtZTogc3RyaW5nID0gJ3NiYi1tZW51JztcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBlbGVtZW50RGVwZW5kZW5jaWVzOiBTYmJFbGVtZW50VHlwZVtdID0gW1xuICAgIFNiYkRpdmlkZXJFbGVtZW50LFxuICAgIFNiYk1lbnVCdXR0b25FbGVtZW50LFxuICBdO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBbYm94U2l6aW5nU3R5bGVzLCB1bnNhZmVDU1Moc3R5bGUpXTtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSByb2xlID0gJ21lbnUnO1xuXG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgbWVudSBvdmVybGF5LlxuICAgKlxuICAgKiBGb3IgYXR0cmlidXRlIHVzYWdlLCBwcm92aWRlIGFuIGlkIHJlZmVyZW5jZS5cbiAgICovXG4gIEBpZFJlZmVyZW5jZSgpXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBhY2Nlc3NvciB0cmlnZ2VyOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX21lbnUhOiBIVE1MRGl2RWxlbWVudDtcbiAgcHJpdmF0ZSBfdHJpZ2dlckVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3RyaWdnZXJBYm9ydENvbnRyb2xsZXIhOiBBYm9ydENvbnRyb2xsZXI7XG4gIHByaXZhdGUgX2lzUG9pbnRlckRvd25FdmVudE9uTWVudTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF93aW5kb3dFdmVudHNDb250cm9sbGVyITogQWJvcnRDb250cm9sbGVyO1xuICBwcml2YXRlIF9lc2NhcGFibGVPdmVybGF5Q29udHJvbGxlciA9IG5ldyBTYmJFc2NhcGFibGVPdmVybGF5Q29udHJvbGxlcih0aGlzKTtcbiAgcHJpdmF0ZSBfZm9jdXNUcmFwQ29udHJvbGxlciA9IG5ldyBTYmJGb2N1c1RyYXBDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9zY3JvbGxIYW5kbGVyID0gbmV3IFNiYlNjcm9sbEhhbmRsZXIoKTtcbiAgcHJpdmF0ZSBfaW5lcnRDb250cm9sbGVyID0gbmV3IFNiYkluZXJ0Q29udHJvbGxlcih0aGlzKTtcbiAgcHJpdmF0ZSBfbW9iaWxlQnJlYWtwb2ludCA9IFNiYk1lZGlhUXVlcnlCcmVha3BvaW50U21hbGxBbmRCZWxvdztcbiAgcHJpdmF0ZSBfbWVkaWFNYXRjaGVyID0gbmV3IFNiYk1lZGlhTWF0Y2hlckNvbnRyb2xsZXIodGhpcywge1xuICAgIFt0aGlzLl9tb2JpbGVCcmVha3BvaW50XTogKG1hdGNoZXMpID0+IHtcbiAgICAgIGlmIChtYXRjaGVzICYmICh0aGlzLnN0YXRlID09PSAnb3BlbmluZycgfHwgdGhpcy5zdGF0ZSA9PT0gJ29wZW5lZCcpKSB7XG4gICAgICAgIHRoaXMuX3Njcm9sbEhhbmRsZXIuZGlzYWJsZVNjcm9sbCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc2Nyb2xsSGFuZGxlci5lbmFibGVTY3JvbGwoKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbiAgcHJpdmF0ZSBfZGFya01vZGVDb250cm9sbGVyID0gbmV3IFNiYkRhcmtNb2RlQ29udHJvbGxlcih0aGlzLCAoKSA9PiB0aGlzLl9zeW5jTmVnYXRpdmUoKSk7XG4gIHByaXZhdGUgX2xhbmd1YWdlID0gbmV3IFNiYkxhbmd1YWdlQ29udHJvbGxlcih0aGlzKTtcbiAgcHJpdmF0ZSBfbmVzdGVkTWVudTogU2JiTWVudUVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/Ligna2V5ZG93bicsIChlKSA9PiB0aGlzLl9oYW5kbGVLZXlEb3duKGUpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIHRoaXMuX2NvbmZpZ3VyZVRyaWdnZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBlc2NhcGVTdHJhdGVneSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQWxsKCk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgdGhlIG1lbnUgb24gdHJpZ2dlciBjbGljay5cbiAgICovXG4gIHB1YmxpYyBvcGVuKCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMuc3RhdGUgPT09ICdjbG9zaW5nJyB8fFxuICAgICAgdGhpcy5zdGF0ZSA9PT0gJ29wZW5lZCcgfHxcbiAgICAgICF0aGlzLl9tZW51IHx8XG4gICAgICAhdGhpcy5kaXNwYXRjaEJlZm9yZU9wZW5FdmVudCgpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzTmVzdGVkKCkpIHtcbiAgICAgIGNvbnN0IHBhcmVudE1lbnUgPSB0aGlzLl9wYXJlbnRNZW51KCkhO1xuICAgICAgcGFyZW50TWVudS5pbnRlcm5hbHMuc3RhdGVzLmFkZCgnbmVzdGVkLWNoaWxkJyk7XG5cbiAgICAgIC8vIEluIGNhc2Ugd2UgY2hhbmdlIGJldHdlZW4gYXJyb3cga2V5IG5hdmlnYXRpb24gYW5kIG1vdXNlIG5hdmlnYXRpb24sIGl0IGNhbiBiZSB0aGF0IGFub3RoZXJcbiAgICAgIC8vIG5lc3RlZCBwYXJlbnQgbWVudSBpcyBzdGlsbCBvcGVuLiBXZSBoYXZlIHRvIGNsb3NlIGl0LlxuICAgICAgaWYgKHBhcmVudE1lbnUuX25lc3RlZE1lbnUgIT09IHRoaXMpIHtcbiAgICAgICAgcGFyZW50TWVudS5fbmVzdGVkTWVudT8uY2xvc2UoKTtcbiAgICAgIH1cbiAgICAgIHBhcmVudE1lbnUuX25lc3RlZE1lbnUgPSB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd1BvcG92ZXI/LigpO1xuICAgIHRoaXMuc3RhdGUgPSAnb3BlbmluZyc7XG4gICAgdGhpcy5fc2V0TWVudVBvc2l0aW9uKCk7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG5cbiAgICAvLyBGcm9tIHplcm8gdG8gbGFyZ2UsIGRpc2FibGUgc2Nyb2xsXG4gICAgaWYgKHRoaXMuX2lzTW9iaWxlKCkpIHtcbiAgICAgIHRoaXMuX3Njcm9sbEhhbmRsZXIuZGlzYWJsZVNjcm9sbCgpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBhbmltYXRpb24gZHVyYXRpb24gaXMgemVybywgdGhlIGFuaW1hdGlvbmVuZCBldmVudCBpcyBub3QgYWx3YXlzIGZpcmVkIHJlbGlhYmx5LlxuICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBkaXJlY3RseSBzZXQgdGhlIGBvcGVuZWRgIHN0YXRlLlxuICAgIGlmICh0aGlzLl9pc1plcm9BbmltYXRpb25EdXJhdGlvbigpKSB7XG4gICAgICB0aGlzLl9oYW5kbGVPcGVuaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENsb3NlcyB0aGUgbWVudSBhbmQgYWxsIGl0cyBuZXN0ZWQgbWVudXMuICovXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9jbG9zZSgpO1xuICB9XG5cbiAgLyoqIENsb3NlcyB0aGUgbWVudSBhbmQgYWxsIHJlbGF0ZWQgbWVudXMgKG5lc3RlZCBhbmQgcGFyZW50IG1lbnVzKS4gKi9cbiAgcHVibGljIGNsb3NlQWxsKCk6IHZvaWQge1xuICAgIHRoaXMuX21haW5NZW51KCkuX2Nsb3NlKHRydWUpO1xuICB9XG5cbiAgLyoqIEBwYXJhbSBbY2xvc2VBbGw9J2ZhbHNlJ10gLSBJZiB0cnVlLCBpdCBlbnN1cmVzIGFuaW1hdGlvbnMgYXJlIGNvcnJlY3QgYnkgdG9nZ2xpbmcgc29tZSBzdGF0ZXMgd2hlbiBjbG9zaW5nIGFsbCByZWxhdGVkIG1lbnVzIGF0IG9uY2UuICovXG4gIHByaXZhdGUgX2Nsb3NlKGNsb3NlQWxsID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAoKHRoaXMuc3RhdGUgPT09ICdvcGVuaW5nJyAmJiAhdGhpcy5faXNOZXN0ZWQoKSkgfHwgIXRoaXMuZGlzcGF0Y2hCZWZvcmVDbG9zZUV2ZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDbG9zZSBuZXN0ZWQgbWVudXMgZmlyc3RcbiAgICB0aGlzLl9uZXN0ZWRNZW51Py5fY2xvc2UoY2xvc2VBbGwpO1xuXG4gICAgaWYgKHRoaXMuX2lzTmVzdGVkKCkpIHtcbiAgICAgIGNvbnN0IHBhcmVudE1lbnUgPSB0aGlzLl9wYXJlbnRNZW51KCkhO1xuICAgICAgaWYgKGNsb3NlQWxsKSB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxzLnN0YXRlcy5hZGQoJ2Nsb3NlLWFsbCcpO1xuICAgICAgICBwYXJlbnRNZW51LmludGVybmFscy5zdGF0ZXMuYWRkKCdza2lwLWFuaW1hdGlvbicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbHMuc3RhdGVzLmRlbGV0ZSgnY2xvc2UtYWxsJyk7XG4gICAgICAgIHBhcmVudE1lbnUuaW50ZXJuYWxzLnN0YXRlcy5kZWxldGUoJ3NraXAtYW5pbWF0aW9uJyk7XG4gICAgICB9XG4gICAgICBwYXJlbnRNZW51LmludGVybmFscy5zdGF0ZXMuZGVsZXRlKCduZXN0ZWQtY2hpbGQnKTtcbiAgICAgIHBhcmVudE1lbnUuX25lc3RlZE1lbnUgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSAnY2xvc2luZyc7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuXG4gICAgLy8gSWYgdGhlIGFuaW1hdGlvbiBkdXJhdGlvbiBpcyB6ZXJvLCB0aGUgYW5pbWF0aW9uZW5kIGV2ZW50IGlzIG5vdCBhbHdheXMgZmlyZWQgcmVsaWFibHkuXG4gICAgLy8gSW4gdGhpcyBjYXNlIHdlIGRpcmVjdGx5IHNldCB0aGUgYGNsb3NlZGAgc3RhdGUuXG4gICAgaWYgKHRoaXMuX2lzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKCkpIHtcbiAgICAgIHRoaXMuX2hhbmRsZUNsb3NpbmcoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pc1plcm9BbmltYXRpb25EdXJhdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNaZXJvQW5pbWF0aW9uRHVyYXRpb24odGhpcywgJy0tc2JiLW1lbnUtYW5pbWF0aW9uLWR1cmF0aW9uJyk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVPcGVuaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUgPSAnb3BlbmVkJztcblxuICAgIGlmICghdGhpcy5faXNOZXN0ZWQoKSkge1xuICAgICAgdGhpcy5faW5lcnRDb250cm9sbGVyLmFjdGl2YXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3VwZGF0ZU5lc3RlZEluZXJ0KCk7XG4gICAgfVxuICAgIHRoaXMuX2VzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyLmNvbm5lY3QoKTtcbiAgICB0aGlzLl9mb2N1c1RyYXBDb250cm9sbGVyLmZvY3VzSW5pdGlhbEVsZW1lbnQoKTtcbiAgICB0aGlzLl9mb2N1c1RyYXBDb250cm9sbGVyLmVuYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMuX2F0dGFjaFdpbmRvd0V2ZW50cygpO1xuICAgIHRoaXMuZGlzcGF0Y2hPcGVuRXZlbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUNsb3NpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSA9ICdjbG9zZWQnO1xuICAgIHRoaXMuaW50ZXJuYWxzLnN0YXRlcy5kZWxldGUoJ3NraXAtYW5pbWF0aW9uJyk7XG4gICAgdGhpcy5pbnRlcm5hbHMuc3RhdGVzLmRlbGV0ZSgnY2xvc2UtYWxsJyk7XG4gICAgdGhpcy5oaWRlUG9wb3Zlcj8uKCk7XG5cbiAgICB0aGlzLl9tZW51Py5maXJzdEVsZW1lbnRDaGlsZD8uc2Nyb2xsVG8oMCwgMCk7XG4gICAgaWYgKCF0aGlzLl9pc05lc3RlZCgpKSB7XG4gICAgICB0aGlzLl9pbmVydENvbnRyb2xsZXIuZGVhY3RpdmF0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl91cGRhdGVOZXN0ZWRJbmVydCgpO1xuICAgIH1cbiAgICAvLyBNYW51YWxseSBmb2N1cyBsYXN0IGZvY3VzZWQgZWxlbWVudFxuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50Py5mb2N1cyh7XG4gICAgICAvLyBXaGVuIGluc2lkZSB0aGUgc2JiLWhlYWRlciwgd2UgcHJldmVudCB0aGUgc2Nyb2xsIHRvIGF2b2lkIHRoZSBzbmFwcGluZyB0byB0aGUgdG9wIG9mIHRoZSBwYWdlXG4gICAgICBwcmV2ZW50U2Nyb2xsOiBbJ3NiYi1oZWFkZXItYnV0dG9uJywgJ3NiYi1oZWFkZXItbGluayddLmluY2x1ZGVzKFxuICAgICAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5sb2NhbE5hbWUsXG4gICAgICApLFxuICAgIH0pO1xuICAgIHRoaXMuX2VzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyLmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLmRpc3BhdGNoQ2xvc2VFdmVudCgpO1xuICAgIHRoaXMuX3dpbmRvd0V2ZW50c0NvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgdGhpcy5fZm9jdXNUcmFwQ29udHJvbGxlci5lbmFibGVkID0gZmFsc2U7XG5cbiAgICAvLyBTdGFydGluZyBmcm9tIGJyZWFrcG9pbnQgbGFyZ2UsIGVuYWJsZSBzY3JvbGxcbiAgICB0aGlzLl9zY3JvbGxIYW5kbGVyLmVuYWJsZVNjcm9sbCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlS2V5RG93bihldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIWlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgZW5hYmxlZEFjdGlvbnM6IEVsZW1lbnRbXSA9IEFycmF5LmZyb20oXG4gICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGw8U2JiTWVudUJ1dHRvbkVsZW1lbnQgfCBTYmJNZW51TGlua0VsZW1lbnQ+KFxuICAgICAgICAnc2JiLW1lbnUtYnV0dG9uLCBzYmItbWVudS1saW5rJyxcbiAgICAgICksXG4gICAgKVxuICAgICAgLmNvbmNhdCh0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoJ3NiYi1tZW51LWJ1dHRvbicpISlcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChlbCkgPT4gKCFlbC5kaXNhYmxlZCB8fCBlbC5kaXNhYmxlZEludGVyYWN0aXZlKSAmJiBpbnRlcmFjdGl2aXR5Q2hlY2tlci5pc1Zpc2libGUoZWwpLFxuICAgICAgKTtcbiAgICBjb25zdCBjdXJyZW50ID0gZW5hYmxlZEFjdGlvbnMuZmluZEluZGV4KChlOiBFbGVtZW50KSA9PiBlID09PSBldnQudGFyZ2V0KTtcblxuICAgIGxldCBuZXh0SW5kZXg7XG4gICAgc3dpdGNoIChldnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIG5leHRJbmRleCA9IGdldE5leHRFbGVtZW50SW5kZXgoZXZ0LCBjdXJyZW50LCBlbmFibGVkQWN0aW9ucy5sZW5ndGgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgaWYgKHRoaXMuX2lzTmVzdGVkKCkpIHtcbiAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICBpZiAoKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLm1hdGNoZXMoJzpzdGF0ZShzYmItbWVudS10cmlnZ2VyKScpKSB7XG4gICAgICAgICAgKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ1BhZ2VVcCc6XG4gICAgICBjYXNlICdIb21lJzpcbiAgICAgICAgbmV4dEluZGV4ID0gMDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VuZCc6XG4gICAgICBjYXNlICdQYWdlRG93bic6XG4gICAgICAgIG5leHRJbmRleCA9IGVuYWJsZWRBY3Rpb25zLmxlbmd0aCAtIDE7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChuZXh0SW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgKGVuYWJsZWRBY3Rpb25zW25leHRJbmRleF0gYXMgSFRNTEVsZW1lbnQpLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVtb3ZlcyB0cmlnZ2VyIGNsaWNrIGxpc3RlbmVyIG9uIHRyaWdnZXIgY2hhbmdlLlxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY3JlYXRlUmVuZGVyUm9vdCgpOiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IHJlbmRlclJvb3QgPSBzdXBlci5jcmVhdGVSZW5kZXJSb290KCk7XG4gICAgLy8gRHVlIHRvIHRoZSBmYWN0IHRoYXQgbWVudSBjYW4gYm90aCBiZSBhIGxpc3QgYW5kIGp1c3QgYSBjb250YWluZXIsIHdlIG5lZWQgdG8gY2hlY2sgaXRzXG4gICAgLy8gc3RhdGUgYmVmb3JlIHRoZSBTYmJOYW1lZFNsb3RMaXN0TWl4aW4gaGFuZGxlcyB0aGUgc2xvdGNoYW5nZSBldmVudCwgaW4gb3JkZXIgdG8gYXZvaWRcbiAgICAvLyBpdCBpbnRlcnByZXRpbmcgdGhlIG5vbiBsaXN0IGNhc2UgYXMgYSBsaXN0LlxuICAgIHRoaXMuc2hhZG93Um9vdD8uYWRkRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsICgpID0+IHRoaXMuX3N5bmNOZWdhdGl2ZSgpLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgcmV0dXJuIHJlbmRlclJvb3Q7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgdGhpcy5wb3BvdmVyID0gJ21hbnVhbCc7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmlkIHx8PSBgc2JiLW1lbnUtJHtuZXh0SWQrK31gO1xuICAgIGlmICh0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgIHRoaXMuX2NvbmZpZ3VyZVRyaWdnZXIoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5fdHJpZ2dlckFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICB0aGlzLl93aW5kb3dFdmVudHNDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHRoaXMuX3Njcm9sbEhhbmRsZXIuZW5hYmxlU2Nyb2xsKCk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgcmVxdWVzdFVwZGF0ZShcbiAgICBuYW1lPzogUHJvcGVydHlLZXksXG4gICAgb2xkVmFsdWU/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBQcm9wZXJ0eURlY2xhcmF0aW9uLFxuICApOiB2b2lkIHtcbiAgICBzdXBlci5yZXF1ZXN0VXBkYXRlKG5hbWUsIG9sZFZhbHVlLCBvcHRpb25zKTtcblxuICAgIGlmICghaXNTZXJ2ZXIgJiYgKCFuYW1lIHx8IG5hbWUgPT09ICd0cmlnZ2VyJykgJiYgdGhpcy5oYXNVcGRhdGVkKSB7XG4gICAgICB0aGlzLl9jb25maWd1cmVUcmlnZ2VyKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgdGhlIHRyaWdnZXIgaXMgdmFsaWQgYW5kIGF0dGFjaCBjbGljayBldmVudCBsaXN0ZW5lcnMuXG4gIHByaXZhdGUgX2NvbmZpZ3VyZVRyaWdnZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudHJpZ2dlciA9PT0gdGhpcy5fdHJpZ2dlckVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl90cmlnZ2VyQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHJlbW92ZUFyaWFPdmVybGF5VHJpZ2dlckF0dHJpYnV0ZXModGhpcy5fdHJpZ2dlckVsZW1lbnQpO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50ID0gdGhpcy50cmlnZ2VyO1xuXG4gICAgaWYgKCF0aGlzLl90cmlnZ2VyRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldEFyaWFPdmVybGF5VHJpZ2dlckF0dHJpYnV0ZXModGhpcy5fdHJpZ2dlckVsZW1lbnQsICdtZW51JywgdGhpcy5pZCwgdGhpcy5zdGF0ZSk7XG4gICAgdGhpcy5fdHJpZ2dlckFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMub3BlbigpLCB7XG4gICAgICBzaWduYWw6IHRoaXMuX3RyaWdnZXJBYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuXG4gICAgLy8gQ29uc2lkZXIgdGhlIG1lbnUgYXMgbmVzdGVkIGlmIHRoZSB0cmlnZ2VyIGlzIGEgbWVudSBidXR0b24gb3IgbWVudSBsaW5rLlxuICAgIHRoaXMudG9nZ2xlU3RhdGUoXG4gICAgICAnbmVzdGVkJyxcbiAgICAgIFsnc2JiLW1lbnUtYnV0dG9uJywgJ3NiYi1tZW51LWxpbmsnXS5pbmNsdWRlcyh0aGlzLl90cmlnZ2VyRWxlbWVudC5sb2NhbE5hbWUpLFxuICAgICk7XG4gICAgybVzdGF0ZUNvbnRyb2xsZXIodGhpcy5fdHJpZ2dlckVsZW1lbnQpLmFkZCgnc2JiLW1lbnUtdHJpZ2dlcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXR0YWNoV2luZG93RXZlbnRzKCk6IHZvaWQge1xuICAgIHRoaXMuX3dpbmRvd0V2ZW50c0NvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4gdGhpcy5fc2V0TWVudVBvc2l0aW9uKCksIHtcbiAgICAgIHBhc3NpdmU6IHRydWUsXG4gICAgICBzaWduYWw6IHRoaXMuX3dpbmRvd0V2ZW50c0NvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgLy8gV2l0aG91dCBjYXB0dXJlLCBvdGhlciBzY3JvbGwgY29udGV4dHMgd291bGQgbm90IGJ1YmJsZSB0byB0aGlzIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgLy8gQ2FwdHVyZSBhbGxvd3MgdXMgdG8gcmVhY3QgdG8gYWxsIHNjcm9sbCBjb250ZXh0cyBpbiB0aGlzIERPTS5cbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHRoaXMuX3NldE1lbnVQb3NpdGlvbigpLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgc2lnbmFsOiB0aGlzLl93aW5kb3dFdmVudHNDb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcblxuICAgIC8vIE9ubHkgdGhlIG91dGVybW9zdCBtZW51IG5lZWRzIHRvIGxpc3RlbiB0byB0aGUgYmFja2Ryb3AgY2xpY2tzXG4gICAgaWYgKCF0aGlzLl9pc05lc3RlZCgpKSB7XG4gICAgICAvLyBDbG9zZSBtZW51IG9uIGJhY2tkcm9wIGNsaWNrXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLl9wb2ludGVyRG93bkxpc3RlbmVyLCB7XG4gICAgICAgIHNpZ25hbDogdGhpcy5fd2luZG93RXZlbnRzQ29udHJvbGxlci5zaWduYWwsXG4gICAgICB9KTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLl9jbG9zZU9uQmFja2Ryb3BDbGljaywge1xuICAgICAgICBzaWduYWw6IHRoaXMuX3dpbmRvd0V2ZW50c0NvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2xvc2UgbWVudSBhdCBhbnkgY2xpY2sgb24gYW4gaW50ZXJhY3RpdmUgZWxlbWVudCBpbnNpZGUgdGhlIDxzYmItbWVudT4gdGhhdCBidWJibGVzIHRvIHRoZSBjb250YWluZXIuXG4gIHByaXZhdGUgX2ludGVyYWN0aXZlRWxlbWVudENsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcblxuICAgIGlmIChcbiAgICAgIElOVEVSQUNUSVZFX0VMRU1FTlRTLmluY2x1ZGVzKHRhcmdldC5ub2RlTmFtZSkgJiZcbiAgICAgICF0YXJnZXQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpICYmXG4gICAgICAhdGFyZ2V0Lm1hdGNoZXMoJzpzdGF0ZShzYmItbWVudS10cmlnZ2VyKScpICYmXG4gICAgICB0YXJnZXQuaWQgIT09ICdzYmItbWVudV9fYmFjay1idXR0b24nXG4gICAgKSB7XG4gICAgICB0aGlzLmNsb3NlQWxsKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgdGhlIHBvaW50ZXJkb3duIGV2ZW50IHRhcmdldCBpcyB0cmlnZ2VyZWQgb24gdGhlIG1lbnUuXG4gIHByaXZhdGUgX3BvaW50ZXJEb3duTGlzdGVuZXIgPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IG1lbnUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KCdzYmItbWVudScpO1xuXG4gICAgLy8gVGhlIHBvaW50ZXIgZG93biBpcyBvbiB0aGUgbWVudSBvciBvbmUgb2YgaXRzIG5lc3RlZCBtZW51cy5cbiAgICB0aGlzLl9pc1BvaW50ZXJEb3duRXZlbnRPbk1lbnUgPVxuICAgICAgaXNFdmVudE9uRWxlbWVudCh0aGlzLl9tZW51LCBldmVudCkgfHwgdGhpcy5fbmVzdGVkTWVudXMoKS5zb21lKChlbCkgPT4gbWVudSA9PT0gZWwpO1xuICB9O1xuXG4gIC8vIENsb3NlIG1lbnUgb24gYmFja2Ryb3AgY2xpY2suXG4gIHByaXZhdGUgX2Nsb3NlT25CYWNrZHJvcENsaWNrID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAvLyBUaGUgYmFja2Ryb3AgaXMgb25seSBsaXN0ZW5lZCBvbiB0aGUgbWFpbiBtZW51IChvdXRlcm1vc3QgbWVudSkuXG4gICAgLy8gVG8gY2xvc2UuXG4gICAgLy8gLSBUaGUgcG9pbnRlciBkb3duIGFuZCB1cCBuZWVkIHRvIGJlIG91dHNpZGUgdGhlIG1lbnUuXG4gICAgLy8gLSBUaGUgdGFyZ2V0IHNob3VsZCBiZSBub3Qgb24gYSBuZXN0ZWQgbWVudVxuICAgIGlmIChcbiAgICAgICF0aGlzLl9pc1BvaW50ZXJEb3duRXZlbnRPbk1lbnUgJiZcbiAgICAgICFpc0V2ZW50T25FbGVtZW50KHRoaXMuX21lbnUsIGV2ZW50KSAmJlxuICAgICAgIXRoaXMuX25lc3RlZE1lbnVzKCkuc29tZSgoZWwpID0+IGVsID09PSB0YXJnZXQpXG4gICAgKSB7XG4gICAgICB0aGlzLmNsb3NlQWxsKCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBDb252ZXJ0cyB0aGUgbGlua2VkIGxpc3QgaW50byBhbiBhcnJheSBvZiBTYmJNZW51RWxlbWVudC4gKi9cbiAgcHJpdmF0ZSBfbmVzdGVkTWVudXMoKTogU2JiTWVudUVsZW1lbnRbXSB7XG4gICAgY29uc3QgbWVudXM6IFNiYk1lbnVFbGVtZW50W10gPSBbXTtcbiAgICBsZXQgY3VycmVudCA9IHRoaXMuX25lc3RlZE1lbnU7XG5cbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgbWVudXMucHVzaChjdXJyZW50KTtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Ll9uZXN0ZWRNZW51O1xuICAgIH1cblxuICAgIHJldHVybiBtZW51cztcbiAgfVxuXG4gIHByaXZhdGUgX3BhcmVudE1lbnUoKTogU2JiTWVudUVsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdHJpZ2dlckVsZW1lbnQ/LmNsb3Nlc3QoJ3NiYi1tZW51JykgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKiBUaGUgb3V0ZXJtb3N0IG1lbnUuICovXG4gIHByaXZhdGUgX21haW5NZW51KCk6IFNiYk1lbnVFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5faXNOZXN0ZWQoKSA/ICh0aGlzLl9wYXJlbnRNZW51KCk/Ll9tYWluTWVudSgpID8/IHRoaXMpIDogdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgX2lzTmVzdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuX3BhcmVudE1lbnUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZU5lc3RlZEluZXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuX2luZXJ0Q29udHJvbGxlci5yZXN0b3JlQWxsRXhlbXB0ZWQoKTtcbiAgICB0aGlzLl9tYWluTWVudSgpXG4gICAgICAuX25lc3RlZE1lbnVzKClcbiAgICAgIC5mb3JFYWNoKChtZW51KSA9PiB0aGlzLl9pbmVydENvbnRyb2xsZXIuZXhlbXB0KG1lbnUpKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIG5lc3RlZCBtZW51IHNob3VsZCBiZSBjbG9zZWQuXG4gIHByaXZhdGUgX2hhbmRsZU1vdXNlT3ZlcihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgaXNNb2JpbGUgPSB0aGlzLl9pc01vYmlsZSgpO1xuXG4gICAgLy8gQWxsIG5lc3RlZCBtZW51cyBzaG91bGQgY2xvc2UgaW4gZGVza3RvcCBtb2RlIGlmIHRoZSBjdXJzb3IgbGFuZGVkIG9uXG4gICAgLy8gYW55dGhpbmcgb3RoZXIgdGhhbiB0aGUgY29udGFpbmVyLCB0aGUgY29udGFpbmVyJ3Mgc2Nyb2xsYmFyIG9yIHRoZSB0cmlnZ2VyIGl0c2VsZlxuICAgIGlmIChcbiAgICAgICFpc01vYmlsZSAmJlxuICAgICAgdGhpcy5fbmVzdGVkTWVudSAmJlxuICAgICAgIWVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzYmItbWVudV9fY29udGVudCcpICYmXG4gICAgICAhKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJykgPT09ICd0cnVlJylcbiAgICApIHtcbiAgICAgIHRoaXMuX25lc3RlZE1lbnUuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCc6c3RhdGUoc2JiLW1lbnUtdHJpZ2dlciknKSAmJiAhaXNNb2JpbGUpIHtcbiAgICAgIGVsZW1lbnQuY2xpY2soKTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXQgbWVudSBwb3NpdGlvbiAoeCwgeSkgdG8gJzAnIG9uY2UgdGhlIG1lbnUgaXMgY2xvc2VkIGFuZCB0aGUgdHJhbnNpdGlvbiBlbmRlZCB0byBwcmV2ZW50IHRoZVxuICAvLyB2aWV3cG9ydCBmcm9tIG92ZXJmbG93aW5nLiBBbmQgc2V0IHRoZSBmb2N1cyB0byB0aGUgZmlyc3QgZm9jdXNhYmxlIGVsZW1lbnQgb25jZSB0aGUgbWVudSBpcyBvcGVuLlxuICAvLyBJbiByYXJlIGNhc2VzIGl0IGNhbiBiZSB0aGF0IHRoZSBhbmltYXRpb25FbmQgZXZlbnQgaXMgdHJpZ2dlcmVkIHR3aWNlLlxuICAvLyBUbyBhdm9pZCBlbnRlcmluZyBhIGNvcnJ1cHQgc3RhdGUsIGV4aXQgd2hlbiBzdGF0ZSBpcyBub3QgZXhwZWN0ZWQuXG4gIHByaXZhdGUgX29uTWVudUFuaW1hdGlvbkVuZChldmVudDogQW5pbWF0aW9uRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ29wZW4nIHx8IGV2ZW50LmFuaW1hdGlvbk5hbWUgPT09ICdvcGVuLXNpZGV3YXlzJykgJiZcbiAgICAgIHRoaXMuc3RhdGUgPT09ICdvcGVuaW5nJ1xuICAgICkge1xuICAgICAgdGhpcy5faGFuZGxlT3BlbmluZygpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ2Nsb3NlJyB8fCBldmVudC5hbmltYXRpb25OYW1lID09PSAnY2xvc2Utc2lkZXdheXMnKSAmJlxuICAgICAgdGhpcy5zdGF0ZSA9PT0gJ2Nsb3NpbmcnXG4gICAgKSB7XG4gICAgICB0aGlzLl9oYW5kbGVDbG9zaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0IG1lbnUgcG9zaXRpb24gYW5kIG1heCBoZWlnaHQgaWYgdGhlIGJyZWFrcG9pbnQgaXMgbGFyZ2UtdWx0cmEuXG4gIHByaXZhdGUgX3NldE1lbnVQb3NpdGlvbigpOiB2b2lkIHtcbiAgICAvLyBTdGFydGluZyBmcm9tIGJyZWFrcG9pbnQgbGFyZ2VcbiAgICBpZiAodGhpcy5faXNNb2JpbGUoKSB8fCAhdGhpcy5fbWVudSB8fCAhdGhpcy5fdHJpZ2dlckVsZW1lbnQgfHwgdGhpcy5zdGF0ZSA9PT0gJ2Nsb3NpbmcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWVudVBvc2l0aW9uID0gIXRoaXMuX2lzTmVzdGVkKClcbiAgICAgID8gZ2V0RWxlbWVudFBvc2l0aW9uKFxuICAgICAgICAgIHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvcignLnNiYi1tZW51X19jb250ZW50JykhLFxuICAgICAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LFxuICAgICAgICAgIHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvcignLnNiYi1tZW51X19jb250YWluZXInKSEsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmVydGljYWxPZmZzZXQ6IE1FTlVfT0ZGU0VULFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgIDogZ2V0RWxlbWVudFBvc2l0aW9uSG9yaXpvbnRhbChcbiAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoJy5zYmItbWVudV9fY29udGVudCcpISxcbiAgICAgICAgICB0aGlzLl90cmlnZ2VyRWxlbWVudCxcbiAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoJy5zYmItbWVudV9fY29udGFpbmVyJykhLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhvcml6b250YWxPZmZzZXQ6IE1FTlVfT0ZGU0VULFxuICAgICAgICAgICAgdmVydGljYWxPZmZzZXQ6IE5FU1RFRF9NRU5VX09GRlNFVCxcbiAgICAgICAgICAgIGNvbnRlbnRTZWxlY3RvcjogJy5zYmItbWVudV9fY29udGVudCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcblxuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tc2JiLW1lbnUtcG9zaXRpb24teCcsIGAke21lbnVQb3NpdGlvbi5sZWZ0fXB4YCk7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1zYmItbWVudS1wb3NpdGlvbi15JywgYCR7bWVudVBvc2l0aW9uLnRvcH1weGApO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tc2JiLW1lbnUtbWF4LWhlaWdodCcsIG1lbnVQb3NpdGlvbi5tYXhIZWlnaHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3luY05lZ2F0aXZlKCk6IHZvaWQge1xuICAgIC8vIExpbmtzIGFuZCBidXR0b25zIGFyZSB0aGUgbW9zdCBleHBlY3RlZCBjb250ZW50cyB3aGljaCBoYXZlIGEgbmVnYXRpdmUgcHJvcGVydHlcbiAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJzpzdGF0ZShzYmItbGluayksIDpzdGF0ZShzYmItYnV0dG9uKScpPy5mb3JFYWNoKChlbDogRWxlbWVudCkgPT4ge1xuICAgICAgY3VzdG9tRWxlbWVudHMudXBncmFkZShlbCk7XG4gICAgICAoZWwgYXMgRWxlbWVudCAmIFNiYk5lZ2F0aXZlTWl4aW5UeXBlKS5uZWdhdGl2ZSA9ICF0aGlzLl9kYXJrTW9kZUNvbnRyb2xsZXIubWF0Y2hlcygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNNb2JpbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX21lZGlhTWF0Y2hlci5tYXRjaGVzKHRoaXMuX21vYmlsZUJyZWFrcG9pbnQpID8/IHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItbWVudV9fY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBAYW5pbWF0aW9uZW5kPSR7dGhpcy5fb25NZW51QW5pbWF0aW9uRW5kfVxuICAgICAgICAgIEBtb3VzZW92ZXI9JHsoZTogTW91c2VFdmVudCkgPT4gdGhpcy5faGFuZGxlTW91c2VPdmVyKGUpfVxuICAgICAgICAgIGNsYXNzPVwic2JiLW1lbnVcIlxuICAgICAgICAgICR7cmVmKChlbD86IEVsZW1lbnQpID0+ICh0aGlzLl9tZW51ID0gZWwgYXMgSFRNTERpdkVsZW1lbnQpKX1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIEBjbGljaz0keyhldmVudDogRXZlbnQpID0+IHRoaXMuX2ludGVyYWN0aXZlRWxlbWVudENsaWNrKGV2ZW50KX1cbiAgICAgICAgICAgIEBzY3JvbGw9JHsoZTogRXZlbnQpID0+IGZvcndhcmRFdmVudChlLCBkb2N1bWVudCl9XG4gICAgICAgICAgICBjbGFzcz1cInNiYi1tZW51X19jb250ZW50XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICAgICAgICA8c2JiLWRpdmlkZXI+PC9zYmItZGl2aWRlcj5cbiAgICAgICAgICAgIDxzYmItbWVudS1idXR0b25cbiAgICAgICAgICAgICAgaWQ9XCJzYmItbWVudV9fYmFjay1idXR0b25cIlxuICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLmNsb3NlKCl9XG4gICAgICAgICAgICAgIGljb24tbmFtZT1cImNoZXZyb24tc21hbGwtbGVmdC1zbWFsbFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICR7aTE4bkdvQmFja1t0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX1cbiAgICAgICAgICAgIDwvc2JiLW1lbnUtYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgJ3NiYi1tZW51JzogU2JiTWVudUVsZW1lbnQ7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7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
|