@sbb-esta/lyne-elements-experimental 4.12.0 → 4.13.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/custom-elements.json +460 -339
- package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +1 -1
- package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +1 -1
- package/development/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.component.js +1 -1
- package/development/autocomplete-grid-cell.component-BxkWGaX0.js +1 -1
- package/development/autocomplete-grid-option.component-5mPGswUO.js +1 -1
- package/development/autocomplete-grid-row.component-DEm6zyHZ.js +1 -1
- package/development/core/timetable/access-leg-helper.js +1 -1
- package/development/core/timetable/timetable-helper.js +1 -1
- package/development/date-helper-qNdwgC9O.js +1 -1
- package/development/differenceInMinutes-B7_GTDq7.js +1 -1
- package/development/format-DFx4997p.js +1 -1
- package/development/isValid-JpZ7FphI.js +1 -1
- package/development/journey-summary.component-BZwgD4im.js +1 -1
- package/development/mapper-hWWm7Uke.js +1 -1
- package/development/pearl-chain-time.component-B2_BI6E_.js +1 -1
- package/development/pearl-chain-vertical-item.component-D4clzjjQ.js +1 -1
- package/development/pearl-chain-vertical.component-CpcNFl-x.js +1 -1
- package/development/pearl-chain.component-oQZUzsyW.js +1 -1
- package/development/seat-reservation/common/translations/i18n.js +1 -1
- package/development/seat-reservation/common/types.d.ts +3 -4
- package/development/seat-reservation/common/types.d.ts.map +1 -1
- package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts +38 -7
- package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts.map +1 -1
- package/development/seat-reservation/seat-reservation/seat-reservation-base-element.js +146 -35
- package/development/seat-reservation/seat-reservation/seat-reservation.component.d.ts +2 -13
- package/development/seat-reservation/seat-reservation/seat-reservation.component.d.ts.map +1 -1
- package/development/seat-reservation/seat-reservation/seat-reservation.component.js +1 -1
- package/development/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +1 -1
- package/development/seat-reservation/seat-reservation-area.js +1 -1
- package/development/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +2 -2
- package/development/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +1 -1
- package/development/seat-reservation/seat-reservation-graphic.js +1 -1
- package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.d.ts.map +1 -1
- package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +1 -1
- package/development/seat-reservation/seat-reservation-navigation-coach.js +1 -1
- package/development/seat-reservation/seat-reservation.js +1 -1
- package/development/seat-reservation-area.component-BWdrKqek.js +96 -0
- package/development/seat-reservation-graphic.component-CN5sWn0I.js +129 -0
- package/development/{seat-reservation-navigation-coach.component-CjoDkcVU.js → seat-reservation-navigation-coach.component-tDZkXl-3.js} +3 -3
- package/development/seat-reservation-navigation-services.component-CGel7__P.js +1 -1
- package/development/seat-reservation-place-control.component-CM9efId7.js +1 -1
- package/development/seat-reservation-scoped.component-CFA_bJ3o.js +1 -1
- package/development/seat-reservation.component-44IHFFlM.js +464 -0
- package/development/seat-reservation.js +4 -4
- package/development/seat-reservation.pure.js +4 -4
- package/development/timetable-duration.component-BhFlqYbV.js +1 -1
- package/development/timetable-row.component-Dko8laRT.js +1 -1
- package/development/toDate-DOFAOjP-.js +1 -1
- package/package.json +2 -2
- package/seat-reservation/seat-reservation/seat-reservation-base-element.js +133 -80
- package/seat-reservation/seat-reservation/seat-reservation.component.js +1 -1
- package/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +1 -1
- package/seat-reservation/seat-reservation-area.js +1 -1
- package/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +1 -1
- package/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +1 -1
- package/seat-reservation/seat-reservation-graphic.js +1 -1
- package/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +1 -1
- package/seat-reservation/seat-reservation-navigation-coach.js +1 -1
- package/seat-reservation/seat-reservation.js +1 -1
- package/{seat-reservation-area.component-CtYawDjE.js → seat-reservation-area.component-B5_N7H_a.js} +1 -1
- package/seat-reservation-graphic.component-Dh1e2Pve.js +102 -0
- package/{seat-reservation-navigation-coach.component-sug9IBTH.js → seat-reservation-navigation-coach.component-BdCUfksf.js} +2 -2
- package/{seat-reservation.component-DajC6fqU.js → seat-reservation.component-CtEqqosF.js} +77 -84
- package/seat-reservation.js +4 -4
- package/seat-reservation.pure.js +4 -4
- package/development/seat-reservation-area.component-DbeuTnXT.js +0 -96
- package/development/seat-reservation-graphic.component-DlrHtlia.js +0 -129
- package/development/seat-reservation.component-DFJVFmrI.js +0 -510
- package/seat-reservation-graphic.component-Cm_pVxaB.js +0 -102
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
import { SeatReservationBaseElement } from "./seat-reservation/seat-reservation/seat-reservation-base-element.js";
|
|
2
|
+
import { SbbLanguageController } from "@sbb-esta/lyne-elements/core/controllers.js";
|
|
3
|
+
import { boxSizingStyles } from "@sbb-esta/lyne-elements/core/styles.js";
|
|
4
|
+
import { html, isServer, nothing, unsafeCSS } from "lit";
|
|
5
|
+
import "@sbb-esta/lyne-elements/screen-reader-only.js";
|
|
6
|
+
import { styleMap } from "lit/directives/style-map.js";
|
|
7
|
+
import { SbbSeatReservationAreaElement } from "./seat-reservation/seat-reservation-area/seat-reservation-area.component.js";
|
|
8
|
+
import { classMap } from "lit/directives/class-map.js";
|
|
9
|
+
import { getI18nSeatReservation } from "./seat-reservation/common/translations.js";
|
|
10
|
+
import { SbbSeatReservationGraphicElement } from "./seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js";
|
|
11
|
+
import { repeat } from "lit/directives/repeat.js";
|
|
12
|
+
import { SbbSeatReservationNavigationCoachElement } from "./seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js";
|
|
13
|
+
import { SbbSeatReservationPlaceControlElement } from "./seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js";
|
|
14
|
+
import { SbbSeatReservationScopedElement } from "./seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js";
|
|
15
|
+
import "@sbb-esta/lyne-elements/button.js";
|
|
16
|
+
import "@sbb-esta/lyne-elements/popover.js";
|
|
17
|
+
//#region src/elements-experimental/seat-reservation/seat-reservation/seat-reservation.scss?inline
|
|
18
|
+
var seat_reservation_default = ":host {\n --sbb-seat-reservation-grid-size: 16px;\n --sbb-seat-reservation-height: 0;\n --sbb-seat-reservation-decks: 1;\n display: block;\n height: inherit;\n}\n:host ::part(coach-floor) {\n fill: var(--sbb-background-color-2);\n}\n@media (forced-colors: active) {\n :host ::part(coach-floor) {\n fill: transparent;\n }\n}\n\n:host(:dir(rtl)) :not(.sbb-sr-place-ctrl--type-bicycle,\n.sbb-sr-place-ctrl--orientation-90,\n.sbb-sr-place-ctrl--orientation-270,\n.sbb-sr-place-ctrl--state-selected) ::part(coach-floor) {\n rotate: calc(180 * 1deg);\n}\n\n[popover]:where(sbb-popover) {\n margin: 0;\n padding: 0;\n border: none;\n width: auto;\n height: auto;\n background-color: transparent;\n color: inherit;\n pointer-events: none;\n}\n[popover]:where(sbb-popover) .sbb-sr-popover {\n margin-block: calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n\n:host([align-vertical]) .sbb-sr__component {\n flex-direction: row-reverse;\n justify-content: flex-end;\n gap: calc(22 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n height: inherit;\n}\n@media (min-width: calc(37.5rem)) {\n :host([align-vertical]) .sbb-sr__component {\n gap: calc(54 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n }\n}\n:host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation,\n:host([align-vertical]) .sbb-sr__component ul.sbb-sr-navigation__list-coaches {\n flex-direction: column;\n}\n:host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation {\n padding: calc(16 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) 0;\n}\n:host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation .sbb-sr__navigation-control-button {\n left: calc(1 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n top: 0;\n rotate: 90deg;\n}\n@media (min-width: calc(64rem)) {\n :host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation .sbb-sr__navigation-control-button {\n left: calc(-1 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n }\n}\n:host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation ul.sbb-sr-navigation__list-coaches {\n max-width: initial;\n padding: calc(5 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n overflow: hidden scroll;\n}\n:host([align-vertical]) .sbb-sr__component nav.sbb-sr-navigation ul.sbb-sr-navigation__list-coaches li {\n display: flex;\n}\n:host([align-vertical]) .sbb-sr__wrapper-coach-decks {\n flex-direction: column;\n}\n:host([align-vertical]) .sbb-sr__wrapper-coach-decks .sbb-sr__wrapper-deck-labels {\n flex-direction: column-reverse;\n width: calc((var(--sbb-seat-reservation-height) + 24) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n height: initial;\n}\n:host([align-vertical]) .sbb-sr__wrapper-coach-decks .sbb-sr__wrapper-deck-labels b {\n inline-size: calc(50% - 16 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n block-size: calc(20 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n margin-bottom: calc(16 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n rotate: initial;\n writing-mode: initial;\n}\n:host([align-vertical]) .sbb-sr__wrapper-scrollarea {\n width: calc((var(--sbb-seat-reservation-height) + 24) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n height: 100%;\n overflow: hidden scroll;\n}\n:host([align-vertical]) .sbb-sr__wrapper-scrollarea .sbb-sr__parent {\n rotate: 90deg;\n}\n:host([align-vertical]) .sbb-sr-travel-direction-wrapper {\n width: calc(var(--sbb-seat-reservation-height) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n margin-block-start: calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n\n.sbb-sr-navigation {\n gap: calc(3 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n\n.sbb-sr-navigation .sbb-sr__navigation-control-button {\n position: relative;\n top: calc(2 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n@media (min-width: calc(64rem)) {\n .sbb-sr-navigation .sbb-sr__navigation-control-button {\n top: 0;\n }\n}\n\n.sbb-sr__component {\n display: flex;\n flex-direction: column;\n gap: calc(64 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem) - 16px);\n}\n\n.sbb-sr-travel-direction-wrapper {\n display: flex;\n justify-content: center;\n align-items: center;\n column-gap: calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n margin-block: calc(8 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n font-size: var(--sbb-text-font-size-s);\n}\n.sbb-sr-travel-direction-wrapper .sbb-sr__travel-direction--arrow {\n display: flex;\n align-items: center;\n}\n\n.sbb-sr-navigation-wrapper {\n display: flex;\n}\n\n.sbb-sr-navigation {\n display: flex;\n justify-content: center;\n width: 100%;\n padding-inline: 16px;\n}\n\n.sbb-sr-navigation__list-coaches {\n list-style: none;\n margin: 0;\n padding: 0;\n font-size: inherit;\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-black) 30%, transparent);\n --sbb-scrollbar-color: light-dark(\n color-mix(in srgb, var(--sbb-color-black) 30%, transparent),\n color-mix(in srgb, var(--sbb-color-white) 30%, transparent)\n );\n --sbb-scrollbar-color-hover: color-mix(in srgb, var(--sbb-color-black) 60%, transparent);\n --sbb-scrollbar-color-hover: light-dark(\n color-mix(in srgb, var(--sbb-color-black) 60%, transparent),\n color-mix(in srgb, var(--sbb-color-white) 60%, transparent)\n );\n --sbb-scrollbar-track-color: transparent;\n --sbb-scrollbar-width: var(--sbb-spacing-fixed-3x);\n}\n.sbb-sr-navigation__list-coaches::-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-sr-navigation__list-coaches::-webkit-scrollbar-corner {\n background-color: var(--sbb-scrollbar-track-color, transparent);\n}\n.sbb-sr-navigation__list-coaches::-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-sr-navigation__list-coaches::-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-sr-navigation__list-coaches::-webkit-scrollbar-button, .sbb-sr-navigation__list-coaches::-webkit-scrollbar-corner {\n display: none;\n}\n@supports not selector(::-webkit-scrollbar) {\n .sbb-sr-navigation__list-coaches {\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-sr-navigation__list-coaches {\n display: flex;\n flex-wrap: nowrap;\n gap: calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n padding: calc(6 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) calc(5 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) 0;\n max-width: 856px;\n --sbb-scrollbar-color: transparent;\n overflow: scroll hidden;\n position: relative;\n}\n\n.sbb-sr__wrapper-coach-decks {\n display: flex;\n overflow: hidden;\n height: inherit;\n}\n.sbb-sr__wrapper-coach-decks .sbb-sr__wrapper-deck-labels {\n display: flex;\n justify-content: space-between;\n height: calc(var(--sbb-seat-reservation-height) * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n writing-mode: vertical-lr;\n}\n.sbb-sr__wrapper-coach-decks .sbb-sr__wrapper-deck-labels b {\n height: calc(50% - 16 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n width: calc(20 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n margin-block-end: 16px;\n rotate: 180deg;\n text-align: center;\n line-height: calc(20 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n\n.sbb-sr__wrapper-scrollarea {\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-black) 30%, transparent);\n --sbb-scrollbar-color: light-dark(\n color-mix(in srgb, var(--sbb-color-black) 30%, transparent),\n color-mix(in srgb, var(--sbb-color-white) 30%, transparent)\n );\n --sbb-scrollbar-color-hover: color-mix(in srgb, var(--sbb-color-black) 60%, transparent);\n --sbb-scrollbar-color-hover: light-dark(\n color-mix(in srgb, var(--sbb-color-black) 60%, transparent),\n color-mix(in srgb, var(--sbb-color-white) 60%, transparent)\n );\n --sbb-scrollbar-track-color: transparent;\n --sbb-scrollbar-width: var(--sbb-spacing-fixed-3x);\n}\n.sbb-sr__wrapper-scrollarea::-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-sr__wrapper-scrollarea::-webkit-scrollbar-corner {\n background-color: var(--sbb-scrollbar-track-color, transparent);\n}\n.sbb-sr__wrapper-scrollarea::-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-sr__wrapper-scrollarea::-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-sr__wrapper-scrollarea::-webkit-scrollbar-button, .sbb-sr__wrapper-scrollarea::-webkit-scrollbar-corner {\n display: none;\n}\n@supports not selector(::-webkit-scrollbar) {\n .sbb-sr__wrapper-scrollarea {\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-sr__wrapper-scrollarea {\n overflow: scroll hidden;\n padding-block: calc(8 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem)) calc(16 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n.sbb-sr__wrapper-scrollarea .sbb-sr__parent {\n display: flex;\n flex-direction: column;\n position: relative;\n}\n\n.sbb-sr__list-decks {\n list-style: none;\n margin: 0;\n padding: 0;\n font-size: inherit;\n display: flex;\n flex-direction: column;\n}\n\n.sbb-sr__list-decks--gap {\n gap: calc(48 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n\n.sbb-sr__list-item-deck {\n position: relative;\n}\n\n.sbb-sr__list-coaches {\n list-style: none;\n margin: 0;\n padding: 0;\n font-size: inherit;\n display: flex;\n gap: calc(4 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n\n.sbb-sr__list-decks:has(.sbb-sr-coach-has-overhanging-elements) .sbb-sr__list-coaches {\n gap: calc(8 * var(--sbb-seat-reservation-one-px-rem, 0.0625rem));\n}\n\n.sbb-sr__item-coach {\n position: relative;\n}\n\n.sbb-sr-coach-wrapper__table {\n outline: 0;\n}";
|
|
19
|
+
//#endregion
|
|
20
|
+
//#region src/elements-experimental/seat-reservation/seat-reservation/seat-reservation.component.ts
|
|
21
|
+
SbbSeatReservationAreaElement.define();
|
|
22
|
+
SbbSeatReservationGraphicElement.define();
|
|
23
|
+
SbbSeatReservationPlaceControlElement.define();
|
|
24
|
+
SbbSeatReservationNavigationCoachElement.define();
|
|
25
|
+
SbbSeatReservationScopedElement.define();
|
|
26
|
+
/**
|
|
27
|
+
* Main component for the seat reservation.
|
|
28
|
+
*
|
|
29
|
+
*/
|
|
30
|
+
var SbbSeatReservationElement = class extends SeatReservationBaseElement {
|
|
31
|
+
constructor() {
|
|
32
|
+
super(...arguments);
|
|
33
|
+
this._language = new SbbLanguageController(this);
|
|
34
|
+
}
|
|
35
|
+
static {
|
|
36
|
+
this.elementName = "sbb-seat-reservation";
|
|
37
|
+
}
|
|
38
|
+
static {
|
|
39
|
+
this.styles = [boxSizingStyles, unsafeCSS(seat_reservation_default)];
|
|
40
|
+
}
|
|
41
|
+
willUpdate(changedProperties) {
|
|
42
|
+
super.willUpdate(changedProperties);
|
|
43
|
+
if (changedProperties.has("hasNavigation")) if (this.hasNavigation) this.shadowRoot?.querySelectorAll("table").forEach((table) => table.removeAttribute("tabindex"));
|
|
44
|
+
else this.shadowRoot?.querySelectorAll("table").forEach((table) => table.setAttribute("tabindex", "0"));
|
|
45
|
+
}
|
|
46
|
+
firstUpdated(changedProperties) {
|
|
47
|
+
super.firstUpdated(changedProperties);
|
|
48
|
+
this.updateComplete.then(() => {
|
|
49
|
+
this.initNavigationSelectionByScrollEvent();
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
render() {
|
|
53
|
+
this._initVehicleSeatReservationConstruction();
|
|
54
|
+
return this._coachesHtmlTemplate || null;
|
|
55
|
+
}
|
|
56
|
+
_initVehicleSeatReservationConstruction() {
|
|
57
|
+
this._coachesHtmlTemplate = html`
|
|
58
|
+
${this._renderTravelDirection()}
|
|
59
|
+
<div class="sbb-sr__component">
|
|
60
|
+
${this._renderNavigation()}
|
|
61
|
+
<div
|
|
62
|
+
class="sbb-sr__wrapper-coach-decks"
|
|
63
|
+
@keydown=${(evt) => this.keyboardSeatmapEventHandling(evt)}
|
|
64
|
+
>
|
|
65
|
+
<div class="sbb-sr__wrapper-deck-labels">${this._renderDeckLabels()}</div>
|
|
66
|
+
<div
|
|
67
|
+
@scroll=${() => this.coachAreaScrollend()}
|
|
68
|
+
id="sbb-sr__wrapper-scrollarea"
|
|
69
|
+
class="sbb-sr__wrapper-scrollarea"
|
|
70
|
+
tabindex="-1"
|
|
71
|
+
>
|
|
72
|
+
<div id="sbb-sr__parent-area" class="sbb-sr__parent">
|
|
73
|
+
<ul
|
|
74
|
+
class="${classMap({
|
|
75
|
+
"sbb-sr__list-decks": true,
|
|
76
|
+
"sbb-sr__list-decks--gap": this.hasMultipleDecks
|
|
77
|
+
})}"
|
|
78
|
+
>
|
|
79
|
+
${this.seatReservations?.map((seatReservation, coachDeckIndex) => {
|
|
80
|
+
return html`<li class="sbb-sr__list-item-deck">
|
|
81
|
+
<ul class="sbb-sr__list-coaches" role="presentation">
|
|
82
|
+
${this._renderCoaches(seatReservation, coachDeckIndex)}
|
|
83
|
+
</ul>
|
|
84
|
+
</li>`;
|
|
85
|
+
})}
|
|
86
|
+
</ul>
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
`;
|
|
92
|
+
}
|
|
93
|
+
_renderDeckLabels() {
|
|
94
|
+
if (!this.hasMultipleDecks) return null;
|
|
95
|
+
return this.seatReservations.map((seatReservation) => {
|
|
96
|
+
return html`<b aria-hidden="true">${getI18nSeatReservation(seatReservation.deckCoachLevel, this._language.current)}</b>`;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
_renderNavigationControlButton(btnDirection) {
|
|
100
|
+
if (!this.hasNavigation || !this.seatReservations) return null;
|
|
101
|
+
const btnNavigationDirectionId = btnDirection == "DIRECTION_RIGHT" ? "sbb-sr-navigation__wrapper-button-direction--right" : "sbb-sr-navigation__wrapper-button-direction--left";
|
|
102
|
+
const btnIcon = btnDirection == "DIRECTION_RIGHT" ? "chevron-small-right-small" : "chevron-small-left-small";
|
|
103
|
+
const btnAriaDescription = btnDirection == "DIRECTION_RIGHT" ? getI18nSeatReservation("SEAT_RESERVATION_END", this._language.current) : getI18nSeatReservation("SEAT_RESERVATION_BEGIN", this._language.current);
|
|
104
|
+
let btnDisabled = true;
|
|
105
|
+
if (btnDirection == "DIRECTION_LEFT" && this.selectedCoachIndex > 0) btnDisabled = false;
|
|
106
|
+
else if (btnDirection == "DIRECTION_RIGHT" && this.selectedCoachIndex < this.coachItemDetailsElements.length - 1) btnDisabled = false;
|
|
107
|
+
return html`<div class="sbb-sr-navigation__wrapper-button-direction">
|
|
108
|
+
<sbb-secondary-button
|
|
109
|
+
@click="${() => this.navigateByDirectionBtn(btnDirection)}"
|
|
110
|
+
@focus="${() => this.onFocusNavDirectionButton()}"
|
|
111
|
+
id="${btnNavigationDirectionId}"
|
|
112
|
+
class="sbb-sr__navigation-control-button"
|
|
113
|
+
size="m"
|
|
114
|
+
icon-name="${btnIcon}"
|
|
115
|
+
type="button"
|
|
116
|
+
aria-label="${btnAriaDescription}"
|
|
117
|
+
role="button"
|
|
118
|
+
.disabledInteractive="${btnDisabled || nothing}"
|
|
119
|
+
.disabled="${btnDisabled || nothing}"
|
|
120
|
+
></sbb-secondary-button>
|
|
121
|
+
</div>`;
|
|
122
|
+
}
|
|
123
|
+
_renderTravelDirection() {
|
|
124
|
+
if (!this.travelDirection || this.travelDirection === "NONE") return null;
|
|
125
|
+
const labelText = getI18nSeatReservation("SEAT_RESERVATION_TRAVEL_DIRECTION", this._language.current);
|
|
126
|
+
return html`<div class="sbb-sr-travel-direction-wrapper">
|
|
127
|
+
<div class="sbb-sr__travel-direction--arrow">
|
|
128
|
+
<sbb-icon slot="icon" name="${`arrow-${this.alignVertical ? this.travelDirection === "RIGHT" ? "down" : "up" : this.travelDirection === "RIGHT" ? "right" : "left"}-small`}"></sbb-icon>
|
|
129
|
+
</div>
|
|
130
|
+
<div class="sbb-sr__travel-direction--label">${labelText}</div>
|
|
131
|
+
</div>`;
|
|
132
|
+
}
|
|
133
|
+
_renderNavigation() {
|
|
134
|
+
if (isServer || !this.hasNavigation || !this.seatReservations) return null;
|
|
135
|
+
return html`<div class="sbb-sr-navigation-wrapper">
|
|
136
|
+
<nav id="sbb-sr-navigation" class="sbb-sr-navigation">
|
|
137
|
+
${this._renderNavigationControlButton("DIRECTION_LEFT")}
|
|
138
|
+
<ul
|
|
139
|
+
id="sbb-sr__navigation-list-coaches"
|
|
140
|
+
class="sbb-sr-navigation__list-coaches"
|
|
141
|
+
aria-label="${getI18nSeatReservation("SEAT_RESERVATION_NAVIGATION", this._language.current)}"
|
|
142
|
+
>
|
|
143
|
+
${this.coachItemDetailsElements.map((coachItemDetails, index) => {
|
|
144
|
+
return html`<li>
|
|
145
|
+
<sbb-seat-reservation-navigation-coach
|
|
146
|
+
@selectcoach=${(event) => this._onSelectNavCoach(event)}
|
|
147
|
+
@focuscoach=${() => this._onFocusNavCoach()}
|
|
148
|
+
@keyup=${(evt) => this.onKeyNavigationNavCoachButton(evt, index)}
|
|
149
|
+
index="${index}"
|
|
150
|
+
.selected=${this.selectedCoachIndex === index}
|
|
151
|
+
.focused=${this.focusedCoachIndex === index}
|
|
152
|
+
.hovered=${this.hoveredCoachIndex === index}
|
|
153
|
+
.nativeFocusActive=${this.hasSeatReservationNativeFocus}
|
|
154
|
+
.coachItemDetails="${coachItemDetails}"
|
|
155
|
+
?vertical="${this.alignVertical}"
|
|
156
|
+
?showTitleInfo="${this.showTitleInfo}"
|
|
157
|
+
>
|
|
158
|
+
</sbb-seat-reservation-navigation-coach>
|
|
159
|
+
</li>`;
|
|
160
|
+
})}
|
|
161
|
+
</ul>
|
|
162
|
+
${this._renderNavigationControlButton("DIRECTION_RIGHT")}
|
|
163
|
+
</nav>
|
|
164
|
+
</div>`;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
*
|
|
168
|
+
* @returns
|
|
169
|
+
* @param seatReservation
|
|
170
|
+
* @param coachDeckIndex
|
|
171
|
+
*/
|
|
172
|
+
_renderCoaches(seatReservation, coachDeckIndex) {
|
|
173
|
+
const coaches = JSON.parse(JSON.stringify(seatReservation?.coachItems));
|
|
174
|
+
if (!coaches || isServer) return null;
|
|
175
|
+
return coaches.map((coachItem, coachIndex) => {
|
|
176
|
+
return html`
|
|
177
|
+
<li class="sbb-sr__item-coach">
|
|
178
|
+
${this._renderCoachElement(coachItem, coachIndex, coachDeckIndex, seatReservation.deckCoachIndex)}
|
|
179
|
+
</li>
|
|
180
|
+
`;
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
_renderCoachElement(coachItem, coachIndex, coachDeckIndex, placeCoachDeckIndex) {
|
|
184
|
+
const currCoachStructure = this.seatReservationStructure.decks[coachDeckIndex].deckCoaches[coachIndex];
|
|
185
|
+
const descriptionTableCoachWithServices = this._getDescriptionTableCoach(coachItem);
|
|
186
|
+
return html`<sbb-seat-reservation-scoped
|
|
187
|
+
style=${styleMap({
|
|
188
|
+
"--sbb-seat-reservation-scoped-width": currCoachStructure.width,
|
|
189
|
+
"--sbb-seat-reservation-scoped-height": currCoachStructure.height
|
|
190
|
+
})}
|
|
191
|
+
>
|
|
192
|
+
${this._getRenderedCoachBorders(coachItem, coachDeckIndex, coachIndex)}
|
|
193
|
+
${this._getRenderedCoachElements(coachDeckIndex, coachIndex)}
|
|
194
|
+
${this._getRenderedAreaElements(coachDeckIndex, coachIndex)}
|
|
195
|
+
${this._getRenderedServiceElements(coachDeckIndex, coachIndex)}
|
|
196
|
+
|
|
197
|
+
<table
|
|
198
|
+
@focus=${() => this.onFocusTableCoachAndPreselectPlace(coachIndex)}
|
|
199
|
+
id="sbb-sr-coach-${coachIndex}"
|
|
200
|
+
class="sbb-sr-coach-wrapper__table"
|
|
201
|
+
aria-describedby="sbb-sr-coach-caption-${coachIndex}"
|
|
202
|
+
tabindex="-1"
|
|
203
|
+
>
|
|
204
|
+
<caption id="sbb-sr-coach-caption-${coachIndex}" tabindex="-1">
|
|
205
|
+
<sbb-screen-reader-only>${descriptionTableCoachWithServices}</sbb-screen-reader-only>
|
|
206
|
+
</caption>
|
|
207
|
+
${this._getRenderedRowPlaces(coachItem, coachIndex, coachDeckIndex, placeCoachDeckIndex)}
|
|
208
|
+
</table>
|
|
209
|
+
</sbb-seat-reservation-scoped>`;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* @returns Returns the border graphic (COACH_BORDER_MIDDLE) of a coach with calculated border gap and coach width,
|
|
213
|
+
* depending on whether the coach is with a driver area or without.
|
|
214
|
+
*/
|
|
215
|
+
_getRenderedCoachBorders(coachItem, deckCoachIndex, coachIndex) {
|
|
216
|
+
if (!coachItem.graphicElements) return null;
|
|
217
|
+
const currCoachStructure = this.seatReservationStructure.decks[deckCoachIndex].deckCoaches[coachIndex];
|
|
218
|
+
const coachBorderElement = currCoachStructure.borderMiddleElement;
|
|
219
|
+
const hasOverhangingElements = currCoachStructure.hasOverhangingElements;
|
|
220
|
+
return html`
|
|
221
|
+
<sbb-seat-reservation-graphic
|
|
222
|
+
class="${classMap({ "sbb-sr-coach-has-overhanging-elements": hasOverhangingElements || false })}"
|
|
223
|
+
style=${styleMap({
|
|
224
|
+
"--sbb-seat-reservation-graphic-width": coachBorderElement.dimension.w,
|
|
225
|
+
"--sbb-seat-reservation-graphic-height": coachBorderElement.dimension.h,
|
|
226
|
+
"--sbb-seat-reservation-graphic-top": coachBorderElement.position.y,
|
|
227
|
+
"--sbb-seat-reservation-graphic-left": coachBorderElement.position.x,
|
|
228
|
+
"--sbb-seat-reservation-graphic-position": "absolute"
|
|
229
|
+
})}
|
|
230
|
+
name="COACH_BORDER_MIDDLE"
|
|
231
|
+
?stretch=${true}
|
|
232
|
+
role="presentation"
|
|
233
|
+
></sbb-seat-reservation-graphic>
|
|
234
|
+
`;
|
|
235
|
+
}
|
|
236
|
+
_getRenderedRowPlaces(coach, coachIndex, coachDeckIndex, placeCoachDeckIndex) {
|
|
237
|
+
if (!coach.places) return null;
|
|
238
|
+
const tableRowPlaces = {};
|
|
239
|
+
for (const place of coach.places) if (!tableRowPlaces[place.position.y]) tableRowPlaces[place.position.y] = [place];
|
|
240
|
+
else tableRowPlaces[place.position.y].push(place);
|
|
241
|
+
return Object.values(tableRowPlaces).map((rowPlaces, index) => {
|
|
242
|
+
return html`
|
|
243
|
+
<tr id="row-${coachIndex}-${rowPlaces[0].position.y}" data-row-index=${index}>
|
|
244
|
+
${this._getRenderedColumnPlaces(rowPlaces, coachIndex, coachDeckIndex, placeCoachDeckIndex)}
|
|
245
|
+
</tr>
|
|
246
|
+
`;
|
|
247
|
+
}).flatMap((rowTemplate) => rowTemplate);
|
|
248
|
+
}
|
|
249
|
+
_getRenderedColumnPlaces(places, coachIndex, deckIndex, placeCoachDeckIndex) {
|
|
250
|
+
places.sort((placeA, placeB) => Number(placeA.position.x) - Number(placeB.position.x));
|
|
251
|
+
const trackPlaceId = coachIndex + "-" + placeCoachDeckIndex;
|
|
252
|
+
return html`${repeat(places, (place) => trackPlaceId + "-" + place.number, (place, index) => {
|
|
253
|
+
const calculatedDimension = this.getCalculatedDimension(place.dimension);
|
|
254
|
+
const calculatedPosition = this.getCalculatedPosition(place.position);
|
|
255
|
+
const rotation = place.rotation || 0;
|
|
256
|
+
const textRotation = this.alignVertical ? -90 : 0;
|
|
257
|
+
const placeId = this.getPlaceElementId(deckIndex, coachIndex, place.number);
|
|
258
|
+
return html`
|
|
259
|
+
<td
|
|
260
|
+
id="cell-${deckIndex}-${coachIndex}-${place.position.y}-${index}"
|
|
261
|
+
class="graphical-element"
|
|
262
|
+
>
|
|
263
|
+
<sbb-seat-reservation-place-control
|
|
264
|
+
style=${styleMap({
|
|
265
|
+
"--sbb-seat-reservation-place-control-text-scale-value": Math.min(calculatedDimension.w, calculatedDimension.h),
|
|
266
|
+
"--sbb-seat-reservation-place-control-width": calculatedDimension.w,
|
|
267
|
+
"--sbb-seat-reservation-place-control-height": calculatedDimension.h,
|
|
268
|
+
"--sbb-seat-reservation-place-control-top": calculatedPosition.y,
|
|
269
|
+
"--sbb-seat-reservation-place-control-left": calculatedPosition.x,
|
|
270
|
+
"--sbb-seat-reservation-place-control-rotation": rotation,
|
|
271
|
+
"--sbb-seat-reservation-place-control-text-rotation": textRotation
|
|
272
|
+
})}
|
|
273
|
+
@selectplace=${(selectPlaceEvent) => this._onSelectPlace(selectPlaceEvent)}
|
|
274
|
+
exportparts="sbb-sr-place-part"
|
|
275
|
+
id=${placeId}
|
|
276
|
+
class="seat-reservation-place-control"
|
|
277
|
+
text=${place.number}
|
|
278
|
+
type=${place.type}
|
|
279
|
+
state=${place.state}
|
|
280
|
+
travel-direction=${this.travelDirection}
|
|
281
|
+
coach-index=${coachIndex}
|
|
282
|
+
deck-index=${placeCoachDeckIndex}
|
|
283
|
+
data-deck-index=${deckIndex}
|
|
284
|
+
.propertyIds=${place.propertyIds}
|
|
285
|
+
.preventClick=${this.preventPlaceClick}
|
|
286
|
+
?showTitleInfo="${this.showTitleInfo}"
|
|
287
|
+
></sbb-seat-reservation-place-control>
|
|
288
|
+
</td>
|
|
289
|
+
`;
|
|
290
|
+
})}`;
|
|
291
|
+
}
|
|
292
|
+
_getRenderedCoachElements(coachDeckIndex, coachIndex) {
|
|
293
|
+
return this.seatReservationStructure.decks[coachDeckIndex].deckCoaches[coachIndex].otherElements.map((graphicElement) => {
|
|
294
|
+
return html` <sbb-seat-reservation-graphic
|
|
295
|
+
style=${styleMap({
|
|
296
|
+
"--sbb-seat-reservation-graphic-width": graphicElement.dimension.w,
|
|
297
|
+
"--sbb-seat-reservation-graphic-height": graphicElement.dimension.h,
|
|
298
|
+
"--sbb-seat-reservation-graphic-top": graphicElement.position.y,
|
|
299
|
+
"--sbb-seat-reservation-graphic-left": graphicElement.position.x,
|
|
300
|
+
"--sbb-seat-reservation-graphic-position": "absolute",
|
|
301
|
+
"--sbb-seat-reservation-graphic-rotation": graphicElement.rotation
|
|
302
|
+
})}
|
|
303
|
+
name=${graphicElement.icon ?? nothing}
|
|
304
|
+
aria-hidden="true"
|
|
305
|
+
?stretch=${true}
|
|
306
|
+
></sbb-seat-reservation-graphic>`;
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
_getRenderedAreaElements(coachDeckIndex, coachIndex) {
|
|
310
|
+
return this.seatReservationStructure.decks[coachDeckIndex].deckCoaches[coachIndex].areaElements.map((graphicElement) => {
|
|
311
|
+
const triggerId = `popover-trigger-${coachDeckIndex}-${coachIndex}-${graphicElement.position.x}-${graphicElement.position.y}`;
|
|
312
|
+
const isNotTableGraphic = graphicElement.icon?.indexOf("TABLE") === -1;
|
|
313
|
+
const areaProperty = graphicElement.icon && isNotTableGraphic ? graphicElement.icon : null;
|
|
314
|
+
const ariaLabelForArea = graphicElement.icon ? getI18nSeatReservation(graphicElement.icon, this._language.current) : nothing;
|
|
315
|
+
return html`
|
|
316
|
+
<sbb-seat-reservation-area
|
|
317
|
+
id="${triggerId}"
|
|
318
|
+
class="${classMap({ "sbb-seat-reservation-area--cursor-pointer": areaProperty !== null })}"
|
|
319
|
+
style=${styleMap({
|
|
320
|
+
"--sbb-seat-reservation-area-width": graphicElement.dimension.w,
|
|
321
|
+
"--sbb-seat-reservation-area-height": graphicElement.dimension.h,
|
|
322
|
+
"--sbb-seat-reservation-area-top": graphicElement.position.y,
|
|
323
|
+
"--sbb-seat-reservation-area-left": graphicElement.position.x,
|
|
324
|
+
"--sbb-seat-reservation-area-z-index": graphicElement.position.z
|
|
325
|
+
})}
|
|
326
|
+
mounting=${graphicElement.mounting ?? nothing}
|
|
327
|
+
background="dark"
|
|
328
|
+
aria-hidden="true"
|
|
329
|
+
>
|
|
330
|
+
${areaProperty ? html`
|
|
331
|
+
<sbb-seat-reservation-graphic
|
|
332
|
+
style=${styleMap({
|
|
333
|
+
"--sbb-seat-reservation-graphic-max-width": this.globalAreaIconDim.w,
|
|
334
|
+
"--sbb-seat-reservation-graphic-max-height": this.globalAreaIconDim.h,
|
|
335
|
+
"--sbb-seat-reservation-graphic-width": graphicElement.dimension.w,
|
|
336
|
+
"--sbb-seat-reservation-graphic-height": graphicElement.dimension.h,
|
|
337
|
+
"--sbb-seat-reservation-graphic-rotation": graphicElement.rotation,
|
|
338
|
+
"--sbb-seat-reservation-graphic-padding-percent": areaProperty !== "ENTRY_EXIT" ? this.globalAreaIconPadding : 1
|
|
339
|
+
})}
|
|
340
|
+
name=${areaProperty}
|
|
341
|
+
role="img"
|
|
342
|
+
aria-hidden="true"
|
|
343
|
+
class="sbb-sr-graphic__dimension--square-dim"
|
|
344
|
+
></sbb-seat-reservation-graphic>
|
|
345
|
+
` : nothing}
|
|
346
|
+
</sbb-seat-reservation-area>
|
|
347
|
+
${areaProperty ? this._popover(triggerId, ariaLabelForArea) : nothing}
|
|
348
|
+
`;
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
_getRenderedServiceElements(coachDeckIndex, coachIndex) {
|
|
352
|
+
return this.seatReservationStructure.decks[coachDeckIndex].deckCoaches[coachIndex].serviceElements.map((serviceElement) => {
|
|
353
|
+
const triggerId = `popover-trigger-${coachDeckIndex}-${coachIndex}-${serviceElement.position.x}-${serviceElement.position.y}`;
|
|
354
|
+
const titleDescription = serviceElement.icon ? getI18nSeatReservation(serviceElement.icon, this._language.current) : null;
|
|
355
|
+
return html`
|
|
356
|
+
<sbb-seat-reservation-graphic
|
|
357
|
+
id="${triggerId}"
|
|
358
|
+
style=${styleMap({
|
|
359
|
+
"--sbb-seat-reservation-graphic-width": serviceElement.dimension.w,
|
|
360
|
+
"--sbb-seat-reservation-graphic-height": serviceElement.dimension.h,
|
|
361
|
+
"--sbb-seat-reservation-graphic-top": serviceElement.position.y,
|
|
362
|
+
"--sbb-seat-reservation-graphic-left": serviceElement.position.x,
|
|
363
|
+
"--sbb-seat-reservation-graphic-position": "absolute",
|
|
364
|
+
"--sbb-seat-reservation-graphic-rotation": serviceElement.rotation
|
|
365
|
+
})}
|
|
366
|
+
class="sbb-seat-reservation-graphic--cursor-pointer"
|
|
367
|
+
name=${serviceElement.icon ?? nothing}
|
|
368
|
+
role="img"
|
|
369
|
+
aria-hidden="true"
|
|
370
|
+
></sbb-seat-reservation-graphic>
|
|
371
|
+
${this._popover(triggerId, titleDescription)}
|
|
372
|
+
`;
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Manages the selected place event triggered from the place
|
|
377
|
+
* Each selection emits an array of all selected places
|
|
378
|
+
* @param selectPlaceEvent
|
|
379
|
+
*/
|
|
380
|
+
_onSelectPlace(selectPlaceEvent) {
|
|
381
|
+
const selectedPlace = selectPlaceEvent.detail;
|
|
382
|
+
this.preventCoachScrollByPlaceClick = true;
|
|
383
|
+
this.isCoachGridFocusable = false;
|
|
384
|
+
this.focusedCoachIndex = -1;
|
|
385
|
+
if (!this.hasSeatReservationNativeFocus) this.hasSeatReservationNativeFocus = true;
|
|
386
|
+
if (!this.preventPlaceClick) {
|
|
387
|
+
this.updateSelectedSeatReservationPlaces(selectedPlace);
|
|
388
|
+
this.updateCurrentSelectedPlaceInCoach(selectedPlace);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
_onSelectNavCoach(event) {
|
|
392
|
+
const selectedNavCoachIndex = event.detail;
|
|
393
|
+
this.isKeyboardNavigation = false;
|
|
394
|
+
this.preventCoachScrollByPlaceClick = false;
|
|
395
|
+
this.hasSeatReservationNativeFocus = true;
|
|
396
|
+
if (selectedNavCoachIndex !== null && selectedNavCoachIndex !== this.currSelectedCoachIndex) {
|
|
397
|
+
this.unfocusPlaceElement();
|
|
398
|
+
this.scrollToSelectedNavCoach(selectedNavCoachIndex);
|
|
399
|
+
} else if (selectedNavCoachIndex === this.currSelectedCoachIndex) {
|
|
400
|
+
this.updateCurrentSelectedCoach();
|
|
401
|
+
this.preselectPlaceInCoach();
|
|
402
|
+
}
|
|
403
|
+
this._closePopover();
|
|
404
|
+
}
|
|
405
|
+
_onFocusNavCoach() {
|
|
406
|
+
if (!this.preventCoachScrollByPlaceClick) this.preselectPlaceInCoach();
|
|
407
|
+
else this.focusPlaceElement(this.currSelectedPlace);
|
|
408
|
+
this.isAutoScrolling = false;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Creates a popover for extra service information
|
|
412
|
+
* @param triggerId
|
|
413
|
+
* @param popoverContent
|
|
414
|
+
* @private
|
|
415
|
+
*/
|
|
416
|
+
_popover(triggerId, popoverContent) {
|
|
417
|
+
return html`
|
|
418
|
+
<sbb-popover trigger="${triggerId}" hover-trigger="">
|
|
419
|
+
<p class="sbb-text-s sbb-sr-popover">${popoverContent}</p>
|
|
420
|
+
</sbb-popover>
|
|
421
|
+
`;
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* trigger to close all opened popovers (normally only one is opened at a time)
|
|
425
|
+
* @private
|
|
426
|
+
*/
|
|
427
|
+
_closePopover() {
|
|
428
|
+
this.shadowRoot?.querySelectorAll("sbb-popover:is(:state(state-opened),[state--state-opened])").forEach((popover) => popover.close());
|
|
429
|
+
}
|
|
430
|
+
_getDescriptionTableCoach(coachItem) {
|
|
431
|
+
if (coachItem.type === "LOCOMOTIVE_COACH") return getI18nSeatReservation("COACH_LOCOMOTIVE", this._language.current);
|
|
432
|
+
if (!coachItem.places?.length) return getI18nSeatReservation("COACH_BLOCKED_TABLE_CAPTION", this._language.current, [coachItem.id]);
|
|
433
|
+
let tableCoachDescription;
|
|
434
|
+
const areaDescriptions = this._getTitleDescriptionListString(coachItem.graphicElements);
|
|
435
|
+
const serviceDescriptions = this._getTitleDescriptionListString(coachItem.serviceElements);
|
|
436
|
+
tableCoachDescription = getI18nSeatReservation("COACH_TABLE_CAPTION", this._language.current, [coachItem.id]);
|
|
437
|
+
if (!this.hasNavigation) {
|
|
438
|
+
const freePlaces = this.getAvailableFreePlacesNumFromCoach(coachItem.places);
|
|
439
|
+
const freePlacesTxt = getI18nSeatReservation("COACH_AVAILABLE_NUMBER_OF_PLACES", this._language.current, [freePlaces.seats, freePlaces.bicycles]);
|
|
440
|
+
tableCoachDescription = tableCoachDescription.concat(". ").concat(freePlacesTxt).concat(". ");
|
|
441
|
+
}
|
|
442
|
+
if (!!areaDescriptions || !!serviceDescriptions) {
|
|
443
|
+
tableCoachDescription += ". " + getI18nSeatReservation("COACH_AVAILABLE_SERVICES", this._language.current) + ": ";
|
|
444
|
+
tableCoachDescription += serviceDescriptions + ", " + areaDescriptions + ".";
|
|
445
|
+
}
|
|
446
|
+
return tableCoachDescription;
|
|
447
|
+
}
|
|
448
|
+
_getTitleDescriptionListString(descriptionsElements) {
|
|
449
|
+
const uniqueDescriptions = [];
|
|
450
|
+
return descriptionsElements?.map((descriptionElement) => {
|
|
451
|
+
const icon = descriptionElement.icon;
|
|
452
|
+
if (!icon) return null;
|
|
453
|
+
const descriptionAlreadyExist = uniqueDescriptions.indexOf(icon) > -1;
|
|
454
|
+
const translation = getI18nSeatReservation(descriptionElement.icon, this._language.current);
|
|
455
|
+
const isValidDescription = this.notFixedRotatableAreaIcons.indexOf(icon) === -1 && this.notAreaElements.indexOf(icon) === -1;
|
|
456
|
+
if (!descriptionAlreadyExist) uniqueDescriptions.push(descriptionElement.icon);
|
|
457
|
+
return !!translation && !descriptionAlreadyExist && isValidDescription ? translation : null;
|
|
458
|
+
}).filter((description) => !!description).join(", ");
|
|
459
|
+
}
|
|
460
|
+
};
|
|
461
|
+
//#endregion
|
|
462
|
+
export { SbbSeatReservationElement as t };
|
|
463
|
+
|
|
464
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi5jb21wb25lbnQtNDRJSEZGbE0uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy1leHBlcmltZW50YWwvc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24uY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIkB1c2UgJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvc3R5bGVzJyBhcyBzYmI7XG5AdXNlICcuLi9jb21tb24vc3R5bGVzL3NlYXQtcmVzZXJ2YXRpb24tbWl4aW5zJyBhcyBzYmItc3ItbWl4aW5zO1xuQHVzZSAnLi4vY29tbW9uL3N0eWxlcy9zZWF0LXJlc2VydmF0aW9uLWZ1bmN0aW9ucycgYXMgc2JiLXNyLWZ1bmN0aW9ucztcblxuLy8gTWF4aW11bSByZXNwb25zaXZlIG5hdmlnYXRpb24gd2lkdGgsIGNvbnNpc3RzIG9mIHRoZSBtYXhpbXVtIG5hdmlnYXRpb24gZXh0ZW50IG1pbnVzIDJ4IG5hdiBkaXJlY3Rpb24gYnV0dG9ucyA5NnB4IGFuZCA4cHggcGFkZGluZy5cbiRtYXgtY29hY2gtbmF2aWdhdGlvbi13aWR0aDogY2FsYyg5NjBweCAtIDk2cHggLSA4cHgpO1xuJHNjcm9sbGJhci1oZWlnaHQ6IDE2cHg7XG5cbjpob3N0IHtcbiAgLy8gTm90ZTogVGhlIHVzZSBvZiBweCBpcyBpbnRlbnRpb25hbCBoZXJlLCBiZWNhdXNlIG1hbnkgd2lkdGhzL2hlaWdodHMsIHJvdGF0aW9ucywgc2NhbGVzLCBldGMuIGRlcGVuZHMgb24gdGhpcy5cbiAgLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmlkLXNpemU6IDE2cHg7XG4gIC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24taGVpZ2h0OiAwO1xuICAtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWRlY2tzOiAxO1xuXG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IGluaGVyaXQ7XG5cbiAgOjpwYXJ0KGNvYWNoLWZsb29yKSB7XG4gICAgZmlsbDogdmFyKC0tc2JiLWJhY2tncm91bmQtY29sb3ItMik7XG5cbiAgICAvLyBJbiBIaWdoIENvbnRyYXN0IE1vZGUgd2Ugc2V0IGZsb29yIGNvbG9yIHRvIHRyYW5zcGFyZW50XG4gICAgQGluY2x1ZGUgc2JiLmlmLWZvcmNlZC1jb2xvcnMge1xuICAgICAgZmlsbDogdHJhbnNwYXJlbnQ7XG4gICAgfVxuICB9XG59XG5cbi8vIHJvdGF0ZXMgdGhlIERPTS1wYXJ0IFwiY29hY2gtZmxvb3JcIiBieSAxODAgZGVncmVlcyBpZiB0aGUgaG9zdCBpcyBpbiBSVEwgbW9kZS5cbkBpbmNsdWRlIHNiYi1zci1taXhpbnMucm90YXRlLWRvbS1wYXJ0KGNvYWNoLWZsb29yKTtcblxuW3BvcG92ZXJdOndoZXJlKHNiYi1wb3BvdmVyKSB7XG4gIEBpbmNsdWRlIHNiYi5wb3BvdmVyLXJlc2V0O1xuXG4gIC5zYmItc3ItcG9wb3ZlciB7XG4gICAgbWFyZ2luLWJsb2NrOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0KTtcbiAgfVxufVxuXG4vLyBTVEFSVCAtIFZlcnRpY2FsIG1vZGVcbjpob3N0KFthbGlnbi12ZXJ0aWNhbF0pIHtcbiAgJGNvYWNoLW5hdmlnYXRpb24tcGFkZGluZzogNTtcbiAgJGNvYWNoLXNjcm9sbGJhci13aWR0aDogMjQ7XG4gICRjb2FjaC1ncmlkLXdpZHRoOiBjYWxjKHZhcigtLXNiYi1zZWF0LXJlc2VydmF0aW9uLWhlaWdodCkgKyAkY29hY2gtc2Nyb2xsYmFyLXdpZHRoKTtcblxuICAuc2JiLXNyX19jb21wb25lbnQge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMjIpO1xuICAgIGhlaWdodDogaW5oZXJpdDtcblxuICAgIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogc21hbGwpIHtcbiAgICAgIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNTQpO1xuICAgIH1cblxuICAgIG5hdi5zYmItc3ItbmF2aWdhdGlvbixcbiAgICB1bC5zYmItc3ItbmF2aWdhdGlvbl9fbGlzdC1jb2FjaGVzIHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgfVxuXG4gICAgbmF2LnNiYi1zci1uYXZpZ2F0aW9uIHtcbiAgICAgIHBhZGRpbmc6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDE2KSAwO1xuXG4gICAgICAuc2JiLXNyX19uYXZpZ2F0aW9uLWNvbnRyb2wtYnV0dG9uIHtcbiAgICAgICAgbGVmdDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMSk7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgcm90YXRlOiA5MGRlZztcblxuICAgICAgICBAaW5jbHVkZSBzYmIubXEoJGZyb206IGxhcmdlKSB7XG4gICAgICAgICAgbGVmdDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oLTEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVsLnNiYi1zci1uYXZpZ2F0aW9uX19saXN0LWNvYWNoZXMge1xuICAgICAgICBtYXgtd2lkdGg6IGluaXRpYWw7XG5cbiAgICAgICAgLy8gUGFkZGluZyBuZWVkcyB0byB2aXN1YWwgZm9jdXMtdmlzaWJsZSBzdHlsZSBmb3IgbmF2IGJ1dHRvbiBpbnNpZGUgb3ZlcmZsb3cgY29udGVudCxcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGZvY3VzLXZpc2libGUgc3R5bGUgaXMgY3V0dGVkLlxuICAgICAgICBwYWRkaW5nOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgkY29hY2gtbmF2aWdhdGlvbi1wYWRkaW5nKTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbiBzY3JvbGw7XG5cbiAgICAgICAgLy8gaW4gdmVydGljYWwgbW9kZSwgdGhlIGxpIG11c3QgYmUgZmxleGVkOyBvdGhlcndpc2UgaXQgd291bGQgY2FsY3VsYXRlIHRoZSB3cm9uZyBoZWlnaHRcbiAgICAgICAgLy8gZHVlIHRvIHVzZXJhZ2VudCBzdHlsZSBzZXQgdG8gXCJsaXN0LWl0ZW1cIiBmb3IgZGlzcGxheVxuICAgICAgICBsaSB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFZFUlRJQ0FMIE1PREUgLSBMQUJFTE1VTFRJUExFIERFQ0tTIC0gTEFCRUxTXG4gIC5zYmItc3JfX3dyYXBwZXItY29hY2gtZGVja3Mge1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cbiAgICAuc2JiLXNyX193cmFwcGVyLWRlY2stbGFiZWxzIHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgICAgIHdpZHRoOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgkY29hY2gtZ3JpZC13aWR0aCk7XG4gICAgICBoZWlnaHQ6IGluaXRpYWw7XG5cbiAgICAgIGIge1xuICAgICAgICBpbmxpbmUtc2l6ZTogY2FsYyg1MCUgLSBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgxNikpO1xuICAgICAgICBibG9jay1zaXplOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgyMCk7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDE2KTtcbiAgICAgICAgcm90YXRlOiBpbml0aWFsO1xuICAgICAgICB3cml0aW5nLW1vZGU6IGluaXRpYWw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gVkVSVElDQUwgTU9ERSAtIFNFQVRNQVAgU0NST0xMIEFSRUFcbiAgLnNiYi1zcl9fd3JhcHBlci1zY3JvbGxhcmVhIHtcbiAgICB3aWR0aDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oJGNvYWNoLWdyaWQtd2lkdGgpO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBvdmVyZmxvdzogaGlkZGVuIHNjcm9sbDtcblxuICAgIC5zYmItc3JfX3BhcmVudCB7XG4gICAgICByb3RhdGU6IDkwZGVnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZFUlRJQ0FMIE1PREUgLSBUUkFWRUwtRElSRUNUSU9OXG4gIC5zYmItc3ItdHJhdmVsLWRpcmVjdGlvbi13cmFwcGVyIHtcbiAgICB3aWR0aDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0odmFyKC0tc2JiLXNlYXQtcmVzZXJ2YXRpb24taGVpZ2h0KSk7XG4gICAgbWFyZ2luLWJsb2NrLXN0YXJ0OiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0KTtcbiAgfVxufVxuXG4vLyBFTkQgLSBWZXJ0aWNhbCBtb2RlXG5cbi5zYmItc3ItbmF2aWdhdGlvbiB7XG4gIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMyk7XG59XG5cbi5zYmItc3ItbmF2aWdhdGlvbiAuc2JiLXNyX19uYXZpZ2F0aW9uLWNvbnRyb2wtYnV0dG9uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0b3A6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDIpO1xuXG4gIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogbGFyZ2UpIHtcbiAgICB0b3A6IDA7XG4gIH1cbn1cblxuLnNiYi1zcl9fY29tcG9uZW50IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiBjYWxjKHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDY0KSAtICRzY3JvbGxiYXItaGVpZ2h0KTtcbn1cblxuLy8gVFJBVkVMIERJUkVDVElPTlxuLnNiYi1zci10cmF2ZWwtZGlyZWN0aW9uLXdyYXBwZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sdW1uLWdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG4gIG1hcmdpbi1ibG9jazogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oOCkgc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG4gIGZvbnQtc2l6ZTogdmFyKC0tc2JiLXRleHQtZm9udC1zaXplLXMpO1xuXG4gIC5zYmItc3JfX3RyYXZlbC1kaXJlY3Rpb24tLWFycm93IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIH1cbn1cblxuLy8gTkFWSUdBVElPTiBORVdcbi5zYmItc3ItbmF2aWdhdGlvbi13cmFwcGVyIHtcbiAgZGlzcGxheTogZmxleDtcbn1cblxuLnNiYi1zci1uYXZpZ2F0aW9uIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nLWlubGluZTogMTZweDtcbn1cblxuLnNiYi1zci1uYXZpZ2F0aW9uX19saXN0LWNvYWNoZXMge1xuICBAaW5jbHVkZSBzYmIubGlzdC1yZXNldDtcbiAgQGluY2x1ZGUgc2JiLnNjcm9sbGJhcjtcblxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgZ2FwOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg0KTtcbiAgcGFkZGluZzogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNikgc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNSkgMDtcbiAgbWF4LXdpZHRoOiAkbWF4LWNvYWNoLW5hdmlnYXRpb24td2lkdGg7XG5cbiAgLy8gU2V0IHNiYiBzY3JvbGxiYXIgdHJhbnNwYXJlbnQgYnkgZGVmYXVsdFxuICAtLXNiYi1zY3JvbGxiYXItY29sb3I6IHRyYW5zcGFyZW50O1xuXG4gIG92ZXJmbG93OiBzY3JvbGwgaGlkZGVuO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLSBTZWF0IFJlc2VydmF0aW9uIE1haW4gTmF2aWdhdGlvbiAtIEVORCAtLS0tLS0tLS0tLS0tLS0tXG5cbi8vIC0tLS0tLS0tLS0tLS0gU2VhdCBSZXNlcnZhdGlvbiBDb2FjaGVzIC0gU1RBUlQgLS0tLS0tLS0tLS0tLS0tLS1cbi5zYmItc3JfX3dyYXBwZXItY29hY2gtZGVja3Mge1xuICBkaXNwbGF5OiBmbGV4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBoZWlnaHQ6IGluaGVyaXQ7XG5cbiAgLnNiYi1zcl9fd3JhcHBlci1kZWNrLWxhYmVscyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgaGVpZ2h0OiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSh2YXIoLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1oZWlnaHQpKTtcbiAgICB3cml0aW5nLW1vZGU6IHZlcnRpY2FsLWxyO1xuXG4gICAgYiB7XG4gICAgICBoZWlnaHQ6IGNhbGMoNTAlIC0gc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMTYpKTtcbiAgICAgIHdpZHRoOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgyMCk7XG4gICAgICBtYXJnaW4tYmxvY2stZW5kOiAxNnB4O1xuICAgICAgcm90YXRlOiAxODBkZWc7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBsaW5lLWhlaWdodDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oMjApO1xuICAgIH1cbiAgfVxufVxuXG4uc2JiLXNyX193cmFwcGVyLXNjcm9sbGFyZWEge1xuICBAaW5jbHVkZSBzYmIuc2Nyb2xsYmFyO1xuXG4gIG92ZXJmbG93OiBzY3JvbGwgaGlkZGVuO1xuICBwYWRkaW5nLWJsb2NrOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg4KSBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSgxNik7XG5cbiAgLnNiYi1zcl9fcGFyZW50IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB9XG59XG5cbi5zYmItc3JfX2xpc3QtZGVja3Mge1xuICBAaW5jbHVkZSBzYmIubGlzdC1yZXNldDtcblxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xufVxuXG4uc2JiLXNyX19saXN0LWRlY2tzLS1nYXAge1xuICBnYXA6IHNiYi1zci1mdW5jdGlvbnMuc3ItcHgtdG8tcmVtKDQ4KTtcbn1cblxuLnNiYi1zcl9fbGlzdC1pdGVtLWRlY2sge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5zYmItc3JfX2xpc3QtY29hY2hlcyB7XG4gIEBpbmNsdWRlIHNiYi5saXN0LXJlc2V0O1xuXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogc2JiLXNyLWZ1bmN0aW9ucy5zci1weC10by1yZW0oNCk7XG59XG5cbi8vIElmIHRoZXJlIGFyZSBvdmVyaGFuZ2luZyBlbGVtZW50cyB3ZSBuZWVkIHRvIGluY3JlYXNlIHRoZSBnYXAgYmV0d2VlbiBjb2FjaGVzXG4uc2JiLXNyX19saXN0LWRlY2tzOmhhcyguc2JiLXNyLWNvYWNoLWhhcy1vdmVyaGFuZ2luZy1lbGVtZW50cykgLnNiYi1zcl9fbGlzdC1jb2FjaGVzIHtcbiAgZ2FwOiBzYmItc3ItZnVuY3Rpb25zLnNyLXB4LXRvLXJlbSg4KTtcbn1cblxuLnNiYi1zcl9faXRlbS1jb2FjaCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLnNiYi1zci1jb2FjaC13cmFwcGVyX190YWJsZSB7XG4gIG91dGxpbmU6IDA7XG59XG4iLCJpbXBvcnQgeyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2NvbnRyb2xsZXJzLmpzJztcbmltcG9ydCB7IGJveFNpemluZ1N0eWxlcyB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvc3R5bGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU2JiUG9wb3ZlckVsZW1lbnQgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9wb3BvdmVyLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgQ1NTUmVzdWx0R3JvdXAsXG4gIGh0bWwsXG4gIGlzU2VydmVyLFxuICBub3RoaW5nLFxuICB0eXBlIFByb3BlcnR5VmFsdWVzLFxuICB0eXBlIFRlbXBsYXRlUmVzdWx0LFxuICB1bnNhZmVDU1MsXG59IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjbGFzc01hcCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2NsYXNzLW1hcC5qcyc7XG5pbXBvcnQgeyByZXBlYXQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZXBlYXQuanMnO1xuaW1wb3J0IHsgc3R5bGVNYXAgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9zdHlsZS1tYXAuanMnO1xuXG5pbXBvcnQgeyBnZXRJMThuU2VhdFJlc2VydmF0aW9uIH0gZnJvbSAnLi4vY29tbW9uL3RyYW5zbGF0aW9ucy50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIEJhc2VFbGVtZW50LFxuICBDb2FjaEl0ZW0sXG4gIENvYWNoSXRlbURldGFpbHMsXG4gIFBsYWNlLFxuICBQbGFjZVNlbGVjdGlvbixcbiAgU2VhdFJlc2VydmF0aW9uLFxufSBmcm9tICcuLi9jb21tb24vdHlwZXMudHMnO1xuaW1wb3J0IHsgU2JiU2VhdFJlc2VydmF0aW9uQXJlYUVsZW1lbnQgfSBmcm9tICcuLi9zZWF0LXJlc2VydmF0aW9uLWFyZWEvc2VhdC1yZXNlcnZhdGlvbi1hcmVhLmNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBTYmJTZWF0UmVzZXJ2YXRpb25HcmFwaGljRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy9zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMuY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFNiYlNlYXRSZXNlcnZhdGlvbk5hdmlnYXRpb25Db2FjaEVsZW1lbnQgfSBmcm9tICcuLi9zZWF0LXJlc2VydmF0aW9uLW5hdmlnYXRpb24tY29hY2gvc2VhdC1yZXNlcnZhdGlvbi1uYXZpZ2F0aW9uLWNvYWNoLmNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBTYmJTZWF0UmVzZXJ2YXRpb25QbGFjZUNvbnRyb2xFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sL3NlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC5jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgU2JiU2VhdFJlc2VydmF0aW9uU2NvcGVkRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tc2NvcGVkL3NlYXQtcmVzZXJ2YXRpb24tc2NvcGVkLmNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IFNlYXRSZXNlcnZhdGlvbkJhc2VFbGVtZW50IH0gZnJvbSAnLi9zZWF0LXJlc2VydmF0aW9uLWJhc2UtZWxlbWVudC50cyc7XG5pbXBvcnQgc3R5bGUgZnJvbSAnLi9zZWF0LXJlc2VydmF0aW9uLnNjc3M/aW5saW5lJztcblxuaW1wb3J0ICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9idXR0b24uanMnO1xuaW1wb3J0ICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9zY3JlZW4tcmVhZGVyLW9ubHkuanMnO1xuaW1wb3J0ICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9wb3BvdmVyLmpzJztcblxuU2JiU2VhdFJlc2VydmF0aW9uQXJlYUVsZW1lbnQuZGVmaW5lKCk7XG5TYmJTZWF0UmVzZXJ2YXRpb25HcmFwaGljRWxlbWVudC5kZWZpbmUoKTtcblNiYlNlYXRSZXNlcnZhdGlvblBsYWNlQ29udHJvbEVsZW1lbnQuZGVmaW5lKCk7XG5TYmJTZWF0UmVzZXJ2YXRpb25OYXZpZ2F0aW9uQ29hY2hFbGVtZW50LmRlZmluZSgpO1xuU2JiU2VhdFJlc2VydmF0aW9uU2NvcGVkRWxlbWVudC5kZWZpbmUoKTtcblxuLyoqXG4gKiBNYWluIGNvbXBvbmVudCBmb3IgdGhlIHNlYXQgcmVzZXJ2YXRpb24uXG4gKlxuICovXG5leHBvcnQgY2xhc3MgU2JiU2VhdFJlc2VydmF0aW9uRWxlbWVudCBleHRlbmRzIFNlYXRSZXNlcnZhdGlvbkJhc2VFbGVtZW50IHtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSBlbGVtZW50TmFtZTogc3RyaW5nID0gJ3NiYi1zZWF0LXJlc2VydmF0aW9uJztcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gW2JveFNpemluZ1N0eWxlcywgdW5zYWZlQ1NTKHN0eWxlKV07XG5cbiAgcHJpdmF0ZSBfbGFuZ3VhZ2UgPSBuZXcgU2JiTGFuZ3VhZ2VDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9jb2FjaGVzSHRtbFRlbXBsYXRlPzogVGVtcGxhdGVSZXN1bHQ7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdoYXNOYXZpZ2F0aW9uJykpIHtcbiAgICAgIGlmICh0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgICAgdGhpcy5zaGFkb3dSb290XG4gICAgICAgICAgPy5xdWVyeVNlbGVjdG9yQWxsKCd0YWJsZScpXG4gICAgICAgICAgLmZvckVhY2goKHRhYmxlKSA9PiB0YWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4JykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaGFkb3dSb290XG4gICAgICAgICAgPy5xdWVyeVNlbGVjdG9yQWxsKCd0YWJsZScpXG4gICAgICAgICAgLmZvckVhY2goKHRhYmxlKSA9PiB0YWJsZS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgLy8gV2UgbmVlZCB0byB3YWl0IHVudGlsIHRoZSBmaXJzdCB1cGRhdGUgaXMgY29tcGxldGUgdG8gaW5pdCBkaWZmZXJlbnQgSFRNTCBlbGVtZW50IGRpbWVuc2lvbnNcbiAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZW5kZXIoKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICB0aGlzLl9pbml0VmVoaWNsZVNlYXRSZXNlcnZhdGlvbkNvbnN0cnVjdGlvbigpO1xuICAgIHJldHVybiB0aGlzLl9jb2FjaGVzSHRtbFRlbXBsYXRlIHx8IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9pbml0VmVoaWNsZVNlYXRSZXNlcnZhdGlvbkNvbnN0cnVjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9jb2FjaGVzSHRtbFRlbXBsYXRlID0gaHRtbGBcbiAgICAgICR7dGhpcy5fcmVuZGVyVHJhdmVsRGlyZWN0aW9uKCl9XG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXNyX19jb21wb25lbnRcIj5cbiAgICAgICAgJHt0aGlzLl9yZW5kZXJOYXZpZ2F0aW9uKCl9XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInNiYi1zcl9fd3JhcHBlci1jb2FjaC1kZWNrc1wiXG4gICAgICAgICAgQGtleWRvd249JHsoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLmtleWJvYXJkU2VhdG1hcEV2ZW50SGFuZGxpbmcoZXZ0KX1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc3JfX3dyYXBwZXItZGVjay1sYWJlbHNcIj4ke3RoaXMuX3JlbmRlckRlY2tMYWJlbHMoKX08L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBAc2Nyb2xsPSR7KCkgPT4gdGhpcy5jb2FjaEFyZWFTY3JvbGxlbmQoKX1cbiAgICAgICAgICAgIGlkPVwic2JiLXNyX193cmFwcGVyLXNjcm9sbGFyZWFcIlxuICAgICAgICAgICAgY2xhc3M9XCJzYmItc3JfX3dyYXBwZXItc2Nyb2xsYXJlYVwiXG4gICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGlkPVwic2JiLXNyX19wYXJlbnQtYXJlYVwiIGNsYXNzPVwic2JiLXNyX19wYXJlbnRcIj5cbiAgICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICAgY2xhc3M9XCIke2NsYXNzTWFwKHtcbiAgICAgICAgICAgICAgICAgICdzYmItc3JfX2xpc3QtZGVja3MnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgJ3NiYi1zcl9fbGlzdC1kZWNrcy0tZ2FwJzogdGhpcy5oYXNNdWx0aXBsZURlY2tzLFxuICAgICAgICAgICAgICAgIH0pfVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAke3RoaXMuc2VhdFJlc2VydmF0aW9ucz8ubWFwKFxuICAgICAgICAgICAgICAgICAgKHNlYXRSZXNlcnZhdGlvbjogU2VhdFJlc2VydmF0aW9uLCBjb2FjaERlY2tJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBodG1sYDxsaSBjbGFzcz1cInNiYi1zcl9fbGlzdC1pdGVtLWRlY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJzYmItc3JfX2xpc3QtY29hY2hlc1wiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5fcmVuZGVyQ29hY2hlcyhzZWF0UmVzZXJ2YXRpb24sIGNvYWNoRGVja0luZGV4KX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICA8L2xpPmA7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyRGVja0xhYmVscygpOiBUZW1wbGF0ZVJlc3VsdFtdIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlRGVja3MpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHRoaXMuc2VhdFJlc2VydmF0aW9ucy5tYXAoKHNlYXRSZXNlcnZhdGlvbikgPT4ge1xuICAgICAgY29uc3QgZGVja0Rlc2NyaXB0aW9uID0gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihcbiAgICAgICAgc2VhdFJlc2VydmF0aW9uLmRlY2tDb2FjaExldmVsLFxuICAgICAgICB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LFxuICAgICAgKTtcbiAgICAgIHJldHVybiBodG1sYDxiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiR7ZGVja0Rlc2NyaXB0aW9ufTwvYj5gO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyTmF2aWdhdGlvbkNvbnRyb2xCdXR0b24oYnRuRGlyZWN0aW9uOiBzdHJpbmcpOiBUZW1wbGF0ZVJlc3VsdCB8IG51bGwge1xuICAgIGlmICghdGhpcy5oYXNOYXZpZ2F0aW9uIHx8ICF0aGlzLnNlYXRSZXNlcnZhdGlvbnMpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGJ0bk5hdmlnYXRpb25EaXJlY3Rpb25JZCA9XG4gICAgICBidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9SSUdIVCdcbiAgICAgICAgPyAnc2JiLXNyLW5hdmlnYXRpb25fX3dyYXBwZXItYnV0dG9uLWRpcmVjdGlvbi0tcmlnaHQnXG4gICAgICAgIDogJ3NiYi1zci1uYXZpZ2F0aW9uX193cmFwcGVyLWJ1dHRvbi1kaXJlY3Rpb24tLWxlZnQnO1xuICAgIGNvbnN0IGJ0bkljb24gPVxuICAgICAgYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fUklHSFQnID8gJ2NoZXZyb24tc21hbGwtcmlnaHQtc21hbGwnIDogJ2NoZXZyb24tc21hbGwtbGVmdC1zbWFsbCc7XG4gICAgY29uc3QgYnRuQXJpYURlc2NyaXB0aW9uID1cbiAgICAgIGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX1JJR0hUJ1xuICAgICAgICA/IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ1NFQVRfUkVTRVJWQVRJT05fRU5EJywgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudClcbiAgICAgICAgOiBnZXRJMThuU2VhdFJlc2VydmF0aW9uKCdTRUFUX1JFU0VSVkFUSU9OX0JFR0lOJywgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCk7XG4gICAgbGV0IGJ0bkRpc2FibGVkID0gdHJ1ZTtcblxuICAgIGlmIChidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9MRUZUJyAmJiB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA+IDApIHtcbiAgICAgIGJ0bkRpc2FibGVkID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX1JJR0hUJyAmJlxuICAgICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPCB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5sZW5ndGggLSAxXG4gICAgKSB7XG4gICAgICBidG5EaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJzYmItc3ItbmF2aWdhdGlvbl9fd3JhcHBlci1idXR0b24tZGlyZWN0aW9uXCI+XG4gICAgICA8c2JiLXNlY29uZGFyeS1idXR0b25cbiAgICAgICAgQGNsaWNrPVwiJHsoKSA9PiB0aGlzLm5hdmlnYXRlQnlEaXJlY3Rpb25CdG4oYnRuRGlyZWN0aW9uKX1cIlxuICAgICAgICBAZm9jdXM9XCIkeygpID0+IHRoaXMub25Gb2N1c05hdkRpcmVjdGlvbkJ1dHRvbigpfVwiXG4gICAgICAgIGlkPVwiJHtidG5OYXZpZ2F0aW9uRGlyZWN0aW9uSWR9XCJcbiAgICAgICAgY2xhc3M9XCJzYmItc3JfX25hdmlnYXRpb24tY29udHJvbC1idXR0b25cIlxuICAgICAgICBzaXplPVwibVwiXG4gICAgICAgIGljb24tbmFtZT1cIiR7YnRuSWNvbn1cIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIiR7YnRuQXJpYURlc2NyaXB0aW9ufVwiXG4gICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAuZGlzYWJsZWRJbnRlcmFjdGl2ZT1cIiR7YnRuRGlzYWJsZWQgfHwgbm90aGluZ31cIlxuICAgICAgICAuZGlzYWJsZWQ9XCIke2J0bkRpc2FibGVkIHx8IG5vdGhpbmd9XCJcbiAgICAgID48L3NiYi1zZWNvbmRhcnktYnV0dG9uPlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJUcmF2ZWxEaXJlY3Rpb24oKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudHJhdmVsRGlyZWN0aW9uIHx8IHRoaXMudHJhdmVsRGlyZWN0aW9uID09PSAnTk9ORScpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgbGFiZWxUZXh0ID0gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihcbiAgICAgICdTRUFUX1JFU0VSVkFUSU9OX1RSQVZFTF9ESVJFQ1RJT04nLFxuICAgICAgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCxcbiAgICApO1xuXG4gICAgY29uc3QgYXJyb3dEaXJlY3Rpb24gPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgID8gdGhpcy50cmF2ZWxEaXJlY3Rpb24gPT09ICdSSUdIVCdcbiAgICAgICAgPyAnZG93bidcbiAgICAgICAgOiAndXAnXG4gICAgICA6IHRoaXMudHJhdmVsRGlyZWN0aW9uID09PSAnUklHSFQnXG4gICAgICAgID8gJ3JpZ2h0J1xuICAgICAgICA6ICdsZWZ0JztcblxuICAgIGNvbnN0IGljb25OYW1lID0gYGFycm93LSR7YXJyb3dEaXJlY3Rpb259LXNtYWxsYDtcblxuICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJzYmItc3ItdHJhdmVsLWRpcmVjdGlvbi13cmFwcGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXNyX190cmF2ZWwtZGlyZWN0aW9uLS1hcnJvd1wiPlxuICAgICAgICA8c2JiLWljb24gc2xvdD1cImljb25cIiBuYW1lPVwiJHtpY29uTmFtZX1cIj48L3NiYi1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXNyX190cmF2ZWwtZGlyZWN0aW9uLS1sYWJlbFwiPiR7bGFiZWxUZXh0fTwvZGl2PlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJOYXZpZ2F0aW9uKCk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgaWYgKGlzU2VydmVyIHx8ICF0aGlzLmhhc05hdmlnYXRpb24gfHwgIXRoaXMuc2VhdFJlc2VydmF0aW9ucykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cInNiYi1zci1uYXZpZ2F0aW9uLXdyYXBwZXJcIj5cbiAgICAgIDxuYXYgaWQ9XCJzYmItc3ItbmF2aWdhdGlvblwiIGNsYXNzPVwic2JiLXNyLW5hdmlnYXRpb25cIj5cbiAgICAgICAgJHt0aGlzLl9yZW5kZXJOYXZpZ2F0aW9uQ29udHJvbEJ1dHRvbignRElSRUNUSU9OX0xFRlQnKX1cbiAgICAgICAgPHVsXG4gICAgICAgICAgaWQ9XCJzYmItc3JfX25hdmlnYXRpb24tbGlzdC1jb2FjaGVzXCJcbiAgICAgICAgICBjbGFzcz1cInNiYi1zci1uYXZpZ2F0aW9uX19saXN0LWNvYWNoZXNcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCIke2dldEkxOG5TZWF0UmVzZXJ2YXRpb24oXG4gICAgICAgICAgICAnU0VBVF9SRVNFUlZBVElPTl9OQVZJR0FUSU9OJyxcbiAgICAgICAgICAgIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsXG4gICAgICAgICAgKX1cIlxuICAgICAgICA+XG4gICAgICAgICAgJHt0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5tYXAoXG4gICAgICAgICAgICAoY29hY2hJdGVtRGV0YWlsczogQ29hY2hJdGVtRGV0YWlscywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gaHRtbGA8bGk+XG4gICAgICAgICAgICAgICAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLW5hdmlnYXRpb24tY29hY2hcbiAgICAgICAgICAgICAgICAgIEBzZWxlY3Rjb2FjaD0keyhldmVudDogQ3VzdG9tRXZlbnQ8bnVtYmVyPikgPT4gdGhpcy5fb25TZWxlY3ROYXZDb2FjaChldmVudCl9XG4gICAgICAgICAgICAgICAgICBAZm9jdXNjb2FjaD0keygpID0+IHRoaXMuX29uRm9jdXNOYXZDb2FjaCgpfVxuICAgICAgICAgICAgICAgICAgQGtleXVwPSR7KGV2dDogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5vbktleU5hdmlnYXRpb25OYXZDb2FjaEJ1dHRvbihldnQsIGluZGV4KX1cbiAgICAgICAgICAgICAgICAgIGluZGV4PVwiJHtpbmRleH1cIlxuICAgICAgICAgICAgICAgICAgLnNlbGVjdGVkPSR7dGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPT09IGluZGV4fVxuICAgICAgICAgICAgICAgICAgLmZvY3VzZWQ9JHt0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID09PSBpbmRleH1cbiAgICAgICAgICAgICAgICAgIC5ob3ZlcmVkPSR7dGhpcy5ob3ZlcmVkQ29hY2hJbmRleCA9PT0gaW5kZXh9XG4gICAgICAgICAgICAgICAgICAubmF0aXZlRm9jdXNBY3RpdmU9JHt0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzfVxuICAgICAgICAgICAgICAgICAgLmNvYWNoSXRlbURldGFpbHM9XCIke2NvYWNoSXRlbURldGFpbHN9XCJcbiAgICAgICAgICAgICAgICAgID92ZXJ0aWNhbD1cIiR7dGhpcy5hbGlnblZlcnRpY2FsfVwiXG4gICAgICAgICAgICAgICAgICA/c2hvd1RpdGxlSW5mbz1cIiR7dGhpcy5zaG93VGl0bGVJbmZvfVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tbmF2aWdhdGlvbi1jb2FjaD5cbiAgICAgICAgICAgICAgPC9saT5gO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICApfVxuICAgICAgICA8L3VsPlxuICAgICAgICAke3RoaXMuX3JlbmRlck5hdmlnYXRpb25Db250cm9sQnV0dG9uKCdESVJFQ1RJT05fUklHSFQnKX1cbiAgICAgIDwvbmF2PlxuICAgIDwvZGl2PmA7XG4gIH1cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIEBwYXJhbSBzZWF0UmVzZXJ2YXRpb25cbiAgICogQHBhcmFtIGNvYWNoRGVja0luZGV4XG4gICAqL1xuICBwcml2YXRlIF9yZW5kZXJDb2FjaGVzKFxuICAgIHNlYXRSZXNlcnZhdGlvbjogU2VhdFJlc2VydmF0aW9uLFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0W10gfCBudWxsIHtcbiAgICBjb25zdCBjb2FjaGVzOiBDb2FjaEl0ZW1bXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc2VhdFJlc2VydmF0aW9uPy5jb2FjaEl0ZW1zKSk7XG5cbiAgICBpZiAoIWNvYWNoZXMgfHwgaXNTZXJ2ZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY29hY2hlcy5tYXAoKGNvYWNoSXRlbTogQ29hY2hJdGVtLCBjb2FjaEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIHJldHVybiBodG1sYFxuICAgICAgICA8bGkgY2xhc3M9XCJzYmItc3JfX2l0ZW0tY29hY2hcIj5cbiAgICAgICAgICAke3RoaXMuX3JlbmRlckNvYWNoRWxlbWVudChcbiAgICAgICAgICAgIGNvYWNoSXRlbSxcbiAgICAgICAgICAgIGNvYWNoSW5kZXgsXG4gICAgICAgICAgICBjb2FjaERlY2tJbmRleCxcbiAgICAgICAgICAgIHNlYXRSZXNlcnZhdGlvbi5kZWNrQ29hY2hJbmRleCxcbiAgICAgICAgICApfVxuICAgICAgICA8L2xpPlxuICAgICAgYDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlckNvYWNoRWxlbWVudChcbiAgICBjb2FjaEl0ZW06IENvYWNoSXRlbSxcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgICBwbGFjZUNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBjb25zdCBjdXJyQ29hY2hTdHJ1Y3R1cmUgPVxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25TdHJ1Y3R1cmUuZGVja3NbY29hY2hEZWNrSW5kZXhdLmRlY2tDb2FjaGVzW2NvYWNoSW5kZXhdO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uVGFibGVDb2FjaFdpdGhTZXJ2aWNlcyA9IHRoaXMuX2dldERlc2NyaXB0aW9uVGFibGVDb2FjaChjb2FjaEl0ZW0pO1xuXG4gICAgcmV0dXJuIGh0bWxgPHNiYi1zZWF0LXJlc2VydmF0aW9uLXNjb3BlZFxuICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXNjb3BlZC13aWR0aCc6IGN1cnJDb2FjaFN0cnVjdHVyZS53aWR0aCxcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tc2NvcGVkLWhlaWdodCc6IGN1cnJDb2FjaFN0cnVjdHVyZS5oZWlnaHQsXG4gICAgICB9KX1cbiAgICA+XG4gICAgICAke3RoaXMuX2dldFJlbmRlcmVkQ29hY2hCb3JkZXJzKGNvYWNoSXRlbSwgY29hY2hEZWNrSW5kZXgsIGNvYWNoSW5kZXgpfVxuICAgICAgJHt0aGlzLl9nZXRSZW5kZXJlZENvYWNoRWxlbWVudHMoY29hY2hEZWNrSW5kZXgsIGNvYWNoSW5kZXgpfVxuICAgICAgJHt0aGlzLl9nZXRSZW5kZXJlZEFyZWFFbGVtZW50cyhjb2FjaERlY2tJbmRleCwgY29hY2hJbmRleCl9XG4gICAgICAke3RoaXMuX2dldFJlbmRlcmVkU2VydmljZUVsZW1lbnRzKGNvYWNoRGVja0luZGV4LCBjb2FjaEluZGV4KX1cblxuICAgICAgPHRhYmxlXG4gICAgICAgIEBmb2N1cz0keygpID0+IHRoaXMub25Gb2N1c1RhYmxlQ29hY2hBbmRQcmVzZWxlY3RQbGFjZShjb2FjaEluZGV4KX1cbiAgICAgICAgaWQ9XCJzYmItc3ItY29hY2gtJHtjb2FjaEluZGV4fVwiXG4gICAgICAgIGNsYXNzPVwic2JiLXNyLWNvYWNoLXdyYXBwZXJfX3RhYmxlXCJcbiAgICAgICAgYXJpYS1kZXNjcmliZWRieT1cInNiYi1zci1jb2FjaC1jYXB0aW9uLSR7Y29hY2hJbmRleH1cIlxuICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgID5cbiAgICAgICAgPGNhcHRpb24gaWQ9XCJzYmItc3ItY29hY2gtY2FwdGlvbi0ke2NvYWNoSW5kZXh9XCIgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgIDxzYmItc2NyZWVuLXJlYWRlci1vbmx5PiR7ZGVzY3JpcHRpb25UYWJsZUNvYWNoV2l0aFNlcnZpY2VzfTwvc2JiLXNjcmVlbi1yZWFkZXItb25seT5cbiAgICAgICAgPC9jYXB0aW9uPlxuICAgICAgICAke3RoaXMuX2dldFJlbmRlcmVkUm93UGxhY2VzKGNvYWNoSXRlbSwgY29hY2hJbmRleCwgY29hY2hEZWNrSW5kZXgsIHBsYWNlQ29hY2hEZWNrSW5kZXgpfVxuICAgICAgPC90YWJsZT5cbiAgICA8L3NiYi1zZWF0LXJlc2VydmF0aW9uLXNjb3BlZD5gO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFJldHVybnMgdGhlIGJvcmRlciBncmFwaGljIChDT0FDSF9CT1JERVJfTUlERExFKSBvZiBhIGNvYWNoIHdpdGggY2FsY3VsYXRlZCBib3JkZXIgZ2FwIGFuZCBjb2FjaCB3aWR0aCxcbiAgICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGNvYWNoIGlzIHdpdGggYSBkcml2ZXIgYXJlYSBvciB3aXRob3V0LlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyZWRDb2FjaEJvcmRlcnMoXG4gICAgY29hY2hJdGVtOiBDb2FjaEl0ZW0sXG4gICAgZGVja0NvYWNoSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0IHwgbnVsbCB7XG4gICAgaWYgKCFjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGN1cnJDb2FjaFN0cnVjdHVyZSA9XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZS5kZWNrc1tkZWNrQ29hY2hJbmRleF0uZGVja0NvYWNoZXNbY29hY2hJbmRleF07XG4gICAgY29uc3QgY29hY2hCb3JkZXJFbGVtZW50ID0gY3VyckNvYWNoU3RydWN0dXJlLmJvcmRlck1pZGRsZUVsZW1lbnQ7XG4gICAgY29uc3QgaGFzT3ZlcmhhbmdpbmdFbGVtZW50cyA9IGN1cnJDb2FjaFN0cnVjdHVyZS5oYXNPdmVyaGFuZ2luZ0VsZW1lbnRzO1xuXG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpY1xuICAgICAgICBjbGFzcz1cIiR7Y2xhc3NNYXAoe1xuICAgICAgICAgICdzYmItc3ItY29hY2gtaGFzLW92ZXJoYW5naW5nLWVsZW1lbnRzJzogaGFzT3ZlcmhhbmdpbmdFbGVtZW50cyB8fCBmYWxzZSxcbiAgICAgICAgfSl9XCJcbiAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy13aWR0aCc6IGNvYWNoQm9yZGVyRWxlbWVudC5kaW1lbnNpb24udyxcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWhlaWdodCc6IGNvYWNoQm9yZGVyRWxlbWVudC5kaW1lbnNpb24uaCxcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXRvcCc6IGNvYWNoQm9yZGVyRWxlbWVudC5wb3NpdGlvbi55LFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbGVmdCc6IGNvYWNoQm9yZGVyRWxlbWVudC5wb3NpdGlvbi54LFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcG9zaXRpb24nOiAnYWJzb2x1dGUnLFxuICAgICAgICB9KX1cbiAgICAgICAgbmFtZT1cIkNPQUNIX0JPUkRFUl9NSURETEVcIlxuICAgICAgICA/c3RyZXRjaD0ke3RydWV9XG4gICAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgICAgPjwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYz5cbiAgICBgO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyZWRSb3dQbGFjZXMoXG4gICAgY29hY2g6IENvYWNoSXRlbSxcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgICBwbGFjZUNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0W10gfCBudWxsIHtcbiAgICBpZiAoIWNvYWNoLnBsYWNlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIFByZXBhcmUgcm93cyB3aXRoIHRoZSBwbGFjZXMgdG8gcmVuZGVyIGEgdGFibGVcbiAgICBjb25zdCB0YWJsZVJvd1BsYWNlczogUmVjb3JkPG51bWJlciwgUGxhY2VbXT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHBsYWNlIG9mIGNvYWNoLnBsYWNlcykge1xuICAgICAgaWYgKCF0YWJsZVJvd1BsYWNlc1twbGFjZS5wb3NpdGlvbi55XSkge1xuICAgICAgICB0YWJsZVJvd1BsYWNlc1twbGFjZS5wb3NpdGlvbi55XSA9IFtwbGFjZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YWJsZVJvd1BsYWNlc1twbGFjZS5wb3NpdGlvbi55XS5wdXNoKHBsYWNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0YWJsZVJvd1BsYWNlcylcbiAgICAgIC5tYXAoKHJvd1BsYWNlczogUGxhY2VbXSwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICAgPHRyIGlkPVwicm93LSR7Y29hY2hJbmRleH0tJHtyb3dQbGFjZXNbMF0ucG9zaXRpb24ueX1cIiBkYXRhLXJvdy1pbmRleD0ke2luZGV4fT5cbiAgICAgICAgICAgICR7dGhpcy5fZ2V0UmVuZGVyZWRDb2x1bW5QbGFjZXMoXG4gICAgICAgICAgICAgIHJvd1BsYWNlcyxcbiAgICAgICAgICAgICAgY29hY2hJbmRleCxcbiAgICAgICAgICAgICAgY29hY2hEZWNrSW5kZXgsXG4gICAgICAgICAgICAgIHBsYWNlQ29hY2hEZWNrSW5kZXgsXG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIGA7XG4gICAgICB9KVxuICAgICAgLmZsYXRNYXAoKHJvd1RlbXBsYXRlKSA9PiByb3dUZW1wbGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZW5kZXJlZENvbHVtblBsYWNlcyhcbiAgICBwbGFjZXM6IFBsYWNlW10sXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICAgIGRlY2tJbmRleDogbnVtYmVyLFxuICAgIHBsYWNlQ29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHQgfCBudWxsIHtcbiAgICAvL1NvcnRzIGVhY2ggcGxhY2UgYnkgaXRzIGFzY2VuZGluZyB4IGNvb3JkaW5hdGVcbiAgICBwbGFjZXMuc29ydChcbiAgICAgIChwbGFjZUE6IFBsYWNlLCBwbGFjZUI6IFBsYWNlKSA9PiBOdW1iZXIocGxhY2VBLnBvc2l0aW9uLngpIC0gTnVtYmVyKHBsYWNlQi5wb3NpdGlvbi54KSxcbiAgICApO1xuXG4gICAgLy8gRm9yIHJlbmRlcmluZyB0aGUgcGxhY2VzIHdpdGhpbiBhIHRkIGVsZW1lbnQsIGhlcmUgd2UgdXNlIHJlcGVhdCBkaXJlY3RpdmUgZm9yIGJldHRlciBwZXJmb3JtYW5jZSBmb3IgcmV1c2luZyBlbGVtZW50cyAodHJhY2sgYnkgaWQpLlxuICAgIGNvbnN0IHRyYWNrUGxhY2VJZCA9IGNvYWNoSW5kZXggKyAnLScgKyBwbGFjZUNvYWNoRGVja0luZGV4O1xuICAgIHJldHVybiBodG1sYCR7cmVwZWF0KFxuICAgICAgcGxhY2VzLFxuICAgICAgKHBsYWNlKSA9PiB0cmFja1BsYWNlSWQgKyAnLScgKyBwbGFjZS5udW1iZXIsXG4gICAgICAocGxhY2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGNhbGN1bGF0ZWREaW1lbnNpb24gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24ocGxhY2UuZGltZW5zaW9uKTtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlZFBvc2l0aW9uID0gdGhpcy5nZXRDYWxjdWxhdGVkUG9zaXRpb24ocGxhY2UucG9zaXRpb24pO1xuICAgICAgICBjb25zdCByb3RhdGlvbiA9IHBsYWNlLnJvdGF0aW9uIHx8IDA7XG4gICAgICAgIGNvbnN0IHRleHRSb3RhdGlvbiA9IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IC05MCA6IDA7XG4gICAgICAgIGNvbnN0IHBsYWNlSWQgPSB0aGlzLmdldFBsYWNlRWxlbWVudElkKGRlY2tJbmRleCwgY29hY2hJbmRleCwgcGxhY2UubnVtYmVyKTtcbiAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICAgPHRkXG4gICAgICAgICAgICBpZD1cImNlbGwtJHtkZWNrSW5kZXh9LSR7Y29hY2hJbmRleH0tJHtwbGFjZS5wb3NpdGlvbi55fS0ke2luZGV4fVwiXG4gICAgICAgICAgICBjbGFzcz1cImdyYXBoaWNhbC1lbGVtZW50XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbFxuICAgICAgICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLXRleHQtc2NhbGUtdmFsdWUnOiBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWREaW1lbnNpb24udyxcbiAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWREaW1lbnNpb24uaCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wtd2lkdGgnOiBjYWxjdWxhdGVkRGltZW5zaW9uLncsXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC1oZWlnaHQnOiBjYWxjdWxhdGVkRGltZW5zaW9uLmgsXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC10b3AnOiBjYWxjdWxhdGVkUG9zaXRpb24ueSxcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLWxlZnQnOiBjYWxjdWxhdGVkUG9zaXRpb24ueCxcbiAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLXJvdGF0aW9uJzogcm90YXRpb24sXG4gICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC10ZXh0LXJvdGF0aW9uJzogdGV4dFJvdGF0aW9uLFxuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgQHNlbGVjdHBsYWNlPSR7KHNlbGVjdFBsYWNlRXZlbnQ6IEN1c3RvbUV2ZW50PFBsYWNlU2VsZWN0aW9uPikgPT5cbiAgICAgICAgICAgICAgICB0aGlzLl9vblNlbGVjdFBsYWNlKHNlbGVjdFBsYWNlRXZlbnQpfVxuICAgICAgICAgICAgICBleHBvcnRwYXJ0cz1cInNiYi1zci1wbGFjZS1wYXJ0XCJcbiAgICAgICAgICAgICAgaWQ9JHtwbGFjZUlkfVxuICAgICAgICAgICAgICBjbGFzcz1cInNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbFwiXG4gICAgICAgICAgICAgIHRleHQ9JHtwbGFjZS5udW1iZXJ9XG4gICAgICAgICAgICAgIHR5cGU9JHtwbGFjZS50eXBlfVxuICAgICAgICAgICAgICBzdGF0ZT0ke3BsYWNlLnN0YXRlfVxuICAgICAgICAgICAgICB0cmF2ZWwtZGlyZWN0aW9uPSR7dGhpcy50cmF2ZWxEaXJlY3Rpb259XG4gICAgICAgICAgICAgIGNvYWNoLWluZGV4PSR7Y29hY2hJbmRleH1cbiAgICAgICAgICAgICAgZGVjay1pbmRleD0ke3BsYWNlQ29hY2hEZWNrSW5kZXh9XG4gICAgICAgICAgICAgIGRhdGEtZGVjay1pbmRleD0ke2RlY2tJbmRleH1cbiAgICAgICAgICAgICAgLnByb3BlcnR5SWRzPSR7cGxhY2UucHJvcGVydHlJZHN9XG4gICAgICAgICAgICAgIC5wcmV2ZW50Q2xpY2s9JHt0aGlzLnByZXZlbnRQbGFjZUNsaWNrfVxuICAgICAgICAgICAgICA/c2hvd1RpdGxlSW5mbz1cIiR7dGhpcy5zaG93VGl0bGVJbmZvfVwiXG4gICAgICAgICAgICA+PC9zYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIGA7XG4gICAgICB9LFxuICAgICl9YDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlbmRlcmVkQ29hY2hFbGVtZW50cyhcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgKTogVGVtcGxhdGVSZXN1bHRbXSB8IG51bGwge1xuICAgIGNvbnN0IGN1cnJDb2FjaFN0cnVjdHVyZSA9XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZS5kZWNrc1tjb2FjaERlY2tJbmRleF0uZGVja0NvYWNoZXNbY29hY2hJbmRleF07XG5cbiAgICByZXR1cm4gY3VyckNvYWNoU3RydWN0dXJlLm90aGVyRWxlbWVudHMubWFwKChncmFwaGljRWxlbWVudCkgPT4ge1xuICAgICAgcmV0dXJuIGh0bWxgIDxzYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljXG4gICAgICAgIHN0eWxlPSR7c3R5bGVNYXAoe1xuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtd2lkdGgnOiBncmFwaGljRWxlbWVudC5kaW1lbnNpb24udyxcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWhlaWdodCc6IGdyYXBoaWNFbGVtZW50LmRpbWVuc2lvbi5oLFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtdG9wJzogZ3JhcGhpY0VsZW1lbnQucG9zaXRpb24ueSxcbiAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWxlZnQnOiBncmFwaGljRWxlbWVudC5wb3NpdGlvbi54LFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcG9zaXRpb24nOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcm90YXRpb24nOiBncmFwaGljRWxlbWVudC5yb3RhdGlvbixcbiAgICAgICAgfSl9XG4gICAgICAgIG5hbWU9JHtncmFwaGljRWxlbWVudC5pY29uID8/IG5vdGhpbmd9XG4gICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgID9zdHJldGNoPSR7dHJ1ZX1cbiAgICAgID48L3NiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWM+YDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlbmRlcmVkQXJlYUVsZW1lbnRzKFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICApOiBUZW1wbGF0ZVJlc3VsdFtdIHwgbnVsbCB7XG4gICAgY29uc3QgY3VyckNvYWNoU3RydWN0dXJlID1cbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uU3RydWN0dXJlLmRlY2tzW2NvYWNoRGVja0luZGV4XS5kZWNrQ29hY2hlc1tjb2FjaEluZGV4XTtcblxuICAgIHJldHVybiBjdXJyQ29hY2hTdHJ1Y3R1cmUuYXJlYUVsZW1lbnRzLm1hcCgoZ3JhcGhpY0VsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IHRyaWdnZXJJZCA9IGBwb3BvdmVyLXRyaWdnZXItJHtjb2FjaERlY2tJbmRleH0tJHtjb2FjaEluZGV4fS0ke2dyYXBoaWNFbGVtZW50LnBvc2l0aW9uLnh9LSR7Z3JhcGhpY0VsZW1lbnQucG9zaXRpb24ueX1gO1xuICAgICAgY29uc3QgaXNOb3RUYWJsZUdyYXBoaWMgPSBncmFwaGljRWxlbWVudC5pY29uPy5pbmRleE9mKCdUQUJMRScpID09PSAtMTtcbiAgICAgIGNvbnN0IGFyZWFQcm9wZXJ0eSA9IGdyYXBoaWNFbGVtZW50Lmljb24gJiYgaXNOb3RUYWJsZUdyYXBoaWMgPyBncmFwaGljRWxlbWVudC5pY29uIDogbnVsbDtcbiAgICAgIGNvbnN0IGFyaWFMYWJlbEZvckFyZWEgPSBncmFwaGljRWxlbWVudC5pY29uXG4gICAgICAgID8gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihncmFwaGljRWxlbWVudC5pY29uLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KVxuICAgICAgICA6IG5vdGhpbmc7XG5cbiAgICAgIHJldHVybiBodG1sYFxuICAgICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYVxuICAgICAgICAgIGlkPVwiJHt0cmlnZ2VySWR9XCJcbiAgICAgICAgICBjbGFzcz1cIiR7Y2xhc3NNYXAoe1xuICAgICAgICAgICAgJ3NiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWEtLWN1cnNvci1wb2ludGVyJzogYXJlYVByb3BlcnR5ICE9PSBudWxsLFxuICAgICAgICAgIH0pfVwiXG4gICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhLXdpZHRoJzogZ3JhcGhpY0VsZW1lbnQuZGltZW5zaW9uLncsXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhLWhlaWdodCc6IGdyYXBoaWNFbGVtZW50LmRpbWVuc2lvbi5oLFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYS10b3AnOiBncmFwaGljRWxlbWVudC5wb3NpdGlvbi55LFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tYXJlYS1sZWZ0JzogZ3JhcGhpY0VsZW1lbnQucG9zaXRpb24ueCxcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWFyZWEtei1pbmRleCc6IGdyYXBoaWNFbGVtZW50LnBvc2l0aW9uLnosXG4gICAgICAgICAgfSl9XG4gICAgICAgICAgbW91bnRpbmc9JHtncmFwaGljRWxlbWVudC5tb3VudGluZyA/PyBub3RoaW5nfVxuICAgICAgICAgIGJhY2tncm91bmQ9XCJkYXJrXCJcbiAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+XG4gICAgICAgICAgJHthcmVhUHJvcGVydHlcbiAgICAgICAgICAgID8gaHRtbGBcbiAgICAgICAgICAgICAgICA8c2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpY1xuICAgICAgICAgICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtbWF4LXdpZHRoJzogdGhpcy5nbG9iYWxBcmVhSWNvbkRpbS53LFxuICAgICAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLW1heC1oZWlnaHQnOiB0aGlzLmdsb2JhbEFyZWFJY29uRGltLmgsXG4gICAgICAgICAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtd2lkdGgnOiBncmFwaGljRWxlbWVudC5kaW1lbnNpb24udyxcbiAgICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1oZWlnaHQnOiBncmFwaGljRWxlbWVudC5kaW1lbnNpb24uaCxcbiAgICAgICAgICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1yb3RhdGlvbic6IGdyYXBoaWNFbGVtZW50LnJvdGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXBhZGRpbmctcGVyY2VudCc6XG4gICAgICAgICAgICAgICAgICAgICAgYXJlYVByb3BlcnR5ICE9PSAnRU5UUllfRVhJVCcgPyB0aGlzLmdsb2JhbEFyZWFJY29uUGFkZGluZyA6IDEsXG4gICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgIG5hbWU9JHthcmVhUHJvcGVydHl9XG4gICAgICAgICAgICAgICAgICByb2xlPVwiaW1nXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNiYi1zci1ncmFwaGljX19kaW1lbnNpb24tLXNxdWFyZS1kaW1cIlxuICAgICAgICAgICAgICAgID48L3NiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWM+XG4gICAgICAgICAgICAgIGBcbiAgICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgPC9zYmItc2VhdC1yZXNlcnZhdGlvbi1hcmVhPlxuICAgICAgICAke2FyZWFQcm9wZXJ0eSA/IHRoaXMuX3BvcG92ZXIodHJpZ2dlcklkLCBhcmlhTGFiZWxGb3JBcmVhKSA6IG5vdGhpbmd9XG4gICAgICBgO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UmVuZGVyZWRTZXJ2aWNlRWxlbWVudHMoXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICk6IFRlbXBsYXRlUmVzdWx0W10gfCBudWxsIHtcbiAgICBjb25zdCBjdXJyQ29hY2hTdHJ1Y3R1cmUgPVxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25TdHJ1Y3R1cmUuZGVja3NbY29hY2hEZWNrSW5kZXhdLmRlY2tDb2FjaGVzW2NvYWNoSW5kZXhdO1xuXG4gICAgcmV0dXJuIGN1cnJDb2FjaFN0cnVjdHVyZS5zZXJ2aWNlRWxlbWVudHMubWFwKChzZXJ2aWNlRWxlbWVudDogQmFzZUVsZW1lbnQpID0+IHtcbiAgICAgIC8vZ2VuZXJhdGUgdW5pcXVlIGluZGV4IG51bWJlciBmb3IgdGhlIHRyaWdnZXIgZWxlbWVudFxuICAgICAgY29uc3QgdHJpZ2dlcklkID0gYHBvcG92ZXItdHJpZ2dlci0ke2NvYWNoRGVja0luZGV4fS0ke2NvYWNoSW5kZXh9LSR7c2VydmljZUVsZW1lbnQucG9zaXRpb24ueH0tJHtzZXJ2aWNlRWxlbWVudC5wb3NpdGlvbi55fWA7XG4gICAgICBjb25zdCB0aXRsZURlc2NyaXB0aW9uID0gc2VydmljZUVsZW1lbnQuaWNvblxuICAgICAgICA/IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oc2VydmljZUVsZW1lbnQuaWNvbiwgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudClcbiAgICAgICAgOiBudWxsO1xuXG4gICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgPHNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWNcbiAgICAgICAgICBpZD1cIiR7dHJpZ2dlcklkfVwiXG4gICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLXdpZHRoJzogc2VydmljZUVsZW1lbnQuZGltZW5zaW9uLncsXG4gICAgICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmFwaGljLWhlaWdodCc6IHNlcnZpY2VFbGVtZW50LmRpbWVuc2lvbi5oLFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy10b3AnOiBzZXJ2aWNlRWxlbWVudC5wb3NpdGlvbi55LFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1sZWZ0Jzogc2VydmljZUVsZW1lbnQucG9zaXRpb24ueCxcbiAgICAgICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyYXBoaWMtcG9zaXRpb24nOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy1yb3RhdGlvbic6IHNlcnZpY2VFbGVtZW50LnJvdGF0aW9uLFxuICAgICAgICAgIH0pfVxuICAgICAgICAgIGNsYXNzPVwic2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYy0tY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgIG5hbWU9JHtzZXJ2aWNlRWxlbWVudC5pY29uID8/IG5vdGhpbmd9XG4gICAgICAgICAgcm9sZT1cImltZ1wiXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgPjwvc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JhcGhpYz5cbiAgICAgICAgJHt0aGlzLl9wb3BvdmVyKHRyaWdnZXJJZCwgdGl0bGVEZXNjcmlwdGlvbil9XG4gICAgICBgO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbmFnZXMgdGhlIHNlbGVjdGVkIHBsYWNlIGV2ZW50IHRyaWdnZXJlZCBmcm9tIHRoZSBwbGFjZVxuICAgKiBFYWNoIHNlbGVjdGlvbiBlbWl0cyBhbiBhcnJheSBvZiBhbGwgc2VsZWN0ZWQgcGxhY2VzXG4gICAqIEBwYXJhbSBzZWxlY3RQbGFjZUV2ZW50XG4gICAqL1xuICBwcml2YXRlIF9vblNlbGVjdFBsYWNlKHNlbGVjdFBsYWNlRXZlbnQ6IEN1c3RvbUV2ZW50PFBsYWNlU2VsZWN0aW9uPik6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUGxhY2UgPSBzZWxlY3RQbGFjZUV2ZW50LmRldGFpbDtcbiAgICAvLyBXZSBoYXZlIHRvIHNldCBwcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgdG8gdHJ1ZSwgdG8gcHJldmVudCBhdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBuZXcgZm9jdXNlZCBwbGFjZVxuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gdHJ1ZTtcbiAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIC8vIENoZWNrIGFueSBrZXlib2FyZCBldmVudCB3YXMgdHJpZ2dlcmVkIGluc2lkZSB0aGUgc2VhdCByZXNlcnZhdGlvbiBjb21wb25lbnQsXG4gICAgLy8gc28gd2UgY2FuIHNheSB0aGUgbmF0aXZlIGJyb3dzZXIgZm9jdXMgbGllcyBvbiB0aGUgY29tcG9uZW50XG4gICAgaWYgKCF0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzKSB7XG4gICAgICB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucHJldmVudFBsYWNlQ2xpY2spIHtcbiAgICAgIC8vIEFkZCBwbGFjZSB0byBwbGFjZSBjb2xsZWN0aW9uXG4gICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKHNlbGVjdGVkUGxhY2UpO1xuICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRQbGFjZUluQ29hY2goc2VsZWN0ZWRQbGFjZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfb25TZWxlY3ROYXZDb2FjaChldmVudDogQ3VzdG9tRXZlbnQ8bnVtYmVyPik6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkTmF2Q29hY2hJbmRleCA9IGV2ZW50LmRldGFpbDtcblxuICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayA9IGZhbHNlO1xuICAgIHRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgPSB0cnVlO1xuXG4gICAgaWYgKHNlbGVjdGVkTmF2Q29hY2hJbmRleCAhPT0gbnVsbCAmJiBzZWxlY3RlZE5hdkNvYWNoSW5kZXggIT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChzZWxlY3RlZE5hdkNvYWNoSW5kZXgpO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROYXZDb2FjaEluZGV4ID09PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcbiAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgfVxuXG4gICAgLy9jbG9zZSBhbGwgb3BlbmVkIHBvcG92ZXJzXG4gICAgdGhpcy5fY2xvc2VQb3BvdmVyKCk7XG4gIH1cblxuICBwcml2YXRlIF9vbkZvY3VzTmF2Q29hY2goKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljaykge1xuICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBwb3BvdmVyIGZvciBleHRyYSBzZXJ2aWNlIGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB0cmlnZ2VySWRcbiAgICogQHBhcmFtIHBvcG92ZXJDb250ZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9wb3BvdmVyKFxuICAgIHRyaWdnZXJJZDogc3RyaW5nLFxuICAgIHBvcG92ZXJDb250ZW50OiBzdHJpbmcgfCBudWxsIHwgdHlwZW9mIG5vdGhpbmcsXG4gICk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzYmItcG9wb3ZlciB0cmlnZ2VyPVwiJHt0cmlnZ2VySWR9XCIgaG92ZXItdHJpZ2dlcj1cIlwiPlxuICAgICAgICA8cCBjbGFzcz1cInNiYi10ZXh0LXMgc2JiLXNyLXBvcG92ZXJcIj4ke3BvcG92ZXJDb250ZW50fTwvcD5cbiAgICAgIDwvc2JiLXBvcG92ZXI+XG4gICAgYDtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyIHRvIGNsb3NlIGFsbCBvcGVuZWQgcG9wb3ZlcnMgKG5vcm1hbGx5IG9ubHkgb25lIGlzIG9wZW5lZCBhdCBhIHRpbWUpXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9jbG9zZVBvcG92ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5zaGFkb3dSb290XG4gICAgICA/LnF1ZXJ5U2VsZWN0b3JBbGw8U2JiUG9wb3ZlckVsZW1lbnQ+KCdzYmItcG9wb3ZlcjpzdGF0ZShzdGF0ZS1vcGVuZWQpJylcbiAgICAgIC5mb3JFYWNoKChwb3BvdmVyKSA9PiBwb3BvdmVyLmNsb3NlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0RGVzY3JpcHRpb25UYWJsZUNvYWNoKGNvYWNoSXRlbTogQ29hY2hJdGVtKTogc3RyaW5nIHtcbiAgICAvL3Nob3cgZGlmZmVyZW50IHRhYmxlIGNhcHRpb24gZm9yIHNjcmVlbnJlYWRlciBpZiBpdCBpcyBhIGxvY29tb3RpdmVcbiAgICBpZiAoY29hY2hJdGVtLnR5cGUgPT09ICdMT0NPTU9USVZFX0NPQUNIJykge1xuICAgICAgcmV0dXJuIGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ0NPQUNIX0xPQ09NT1RJVkUnLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoIWNvYWNoSXRlbS5wbGFjZXM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ0NPQUNIX0JMT0NLRURfVEFCTEVfQ0FQVElPTicsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsIFtcbiAgICAgICAgY29hY2hJdGVtLmlkLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgbGV0IHRhYmxlQ29hY2hEZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGNvbnN0IGFyZWFEZXNjcmlwdGlvbnMgPSB0aGlzLl9nZXRUaXRsZURlc2NyaXB0aW9uTGlzdFN0cmluZyhjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzISk7XG4gICAgY29uc3Qgc2VydmljZURlc2NyaXB0aW9ucyA9IHRoaXMuX2dldFRpdGxlRGVzY3JpcHRpb25MaXN0U3RyaW5nKGNvYWNoSXRlbS5zZXJ2aWNlRWxlbWVudHMhKTtcblxuICAgIHRhYmxlQ29hY2hEZXNjcmlwdGlvbiA9IGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ0NPQUNIX1RBQkxFX0NBUFRJT04nLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LCBbXG4gICAgICBjb2FjaEl0ZW0uaWQsXG4gICAgXSk7XG5cbiAgICBpZiAoIXRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgLy8gRXhwYW5kcyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBzZWF0cyBhbmQgYmljeWNsZSBzcGFjZXMgYXMgaW5mb1xuICAgICAgY29uc3QgZnJlZVBsYWNlcyA9IHRoaXMuZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChjb2FjaEl0ZW0ucGxhY2VzKTtcbiAgICAgIGNvbnN0IGZyZWVQbGFjZXNUeHQgPSBnZXRJMThuU2VhdFJlc2VydmF0aW9uKFxuICAgICAgICAnQ09BQ0hfQVZBSUxBQkxFX05VTUJFUl9PRl9QTEFDRVMnLFxuICAgICAgICB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LFxuICAgICAgICBbZnJlZVBsYWNlcy5zZWF0cywgZnJlZVBsYWNlcy5iaWN5Y2xlc10sXG4gICAgICApO1xuICAgICAgdGFibGVDb2FjaERlc2NyaXB0aW9uID0gdGFibGVDb2FjaERlc2NyaXB0aW9uLmNvbmNhdCgnLiAnKS5jb25jYXQoZnJlZVBsYWNlc1R4dCkuY29uY2F0KCcuICcpO1xuICAgIH1cblxuICAgIGlmICghIWFyZWFEZXNjcmlwdGlvbnMgfHwgISFzZXJ2aWNlRGVzY3JpcHRpb25zKSB7XG4gICAgICB0YWJsZUNvYWNoRGVzY3JpcHRpb24gKz1cbiAgICAgICAgJy4gJyArIGdldEkxOG5TZWF0UmVzZXJ2YXRpb24oJ0NPQUNIX0FWQUlMQUJMRV9TRVJWSUNFUycsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpICsgJzogJztcbiAgICAgIHRhYmxlQ29hY2hEZXNjcmlwdGlvbiArPSBzZXJ2aWNlRGVzY3JpcHRpb25zICsgJywgJyArIGFyZWFEZXNjcmlwdGlvbnMgKyAnLic7XG4gICAgfVxuICAgIHJldHVybiB0YWJsZUNvYWNoRGVzY3JpcHRpb247XG4gIH1cblxuICBwcml2YXRlIF9nZXRUaXRsZURlc2NyaXB0aW9uTGlzdFN0cmluZyhkZXNjcmlwdGlvbnNFbGVtZW50czogQmFzZUVsZW1lbnRbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgdW5pcXVlRGVzY3JpcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgcmV0dXJuIGRlc2NyaXB0aW9uc0VsZW1lbnRzXG4gICAgICA/Lm1hcCgoZGVzY3JpcHRpb25FbGVtZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGljb24gPSBkZXNjcmlwdGlvbkVsZW1lbnQuaWNvbjtcbiAgICAgICAgaWYgKCFpY29uKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbkFscmVhZHlFeGlzdCA9IHVuaXF1ZURlc2NyaXB0aW9ucy5pbmRleE9mKGljb24pID4gLTE7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gZ2V0STE4blNlYXRSZXNlcnZhdGlvbihcbiAgICAgICAgICBkZXNjcmlwdGlvbkVsZW1lbnQuaWNvbiEsXG4gICAgICAgICAgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaXNWYWxpZERlc2NyaXB0aW9uID1cbiAgICAgICAgICB0aGlzLm5vdEZpeGVkUm90YXRhYmxlQXJlYUljb25zLmluZGV4T2YoaWNvbikgPT09IC0xICYmXG4gICAgICAgICAgdGhpcy5ub3RBcmVhRWxlbWVudHMuaW5kZXhPZihpY29uKSA9PT0gLTE7XG5cbiAgICAgICAgaWYgKCFkZXNjcmlwdGlvbkFscmVhZHlFeGlzdCkge1xuICAgICAgICAgIHVuaXF1ZURlc2NyaXB0aW9ucy5wdXNoKGRlc2NyaXB0aW9uRWxlbWVudC5pY29uISk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICEhdHJhbnNsYXRpb24gJiYgIWRlc2NyaXB0aW9uQWxyZWFkeUV4aXN0ICYmIGlzVmFsaWREZXNjcmlwdGlvbiA/IHRyYW5zbGF0aW9uIDogbnVsbDtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChkZXNjcmlwdGlvbikgPT4gISFkZXNjcmlwdGlvbilcbiAgICAgIC5qb2luKCcsICcpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICdzYmItc2VhdC1yZXNlcnZhdGlvbic6IFNi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
|
|
@@ -2,15 +2,15 @@ import { i as mapRawDataToSeatReservation, n as mapPlaceAndCoachToSeatReservatio
|
|
|
2
2
|
import { mapIconToSvg } from "./seat-reservation/common/mapper/icon-mapper.js";
|
|
3
3
|
import { t as svgs } from "./svgs-kDpBCto5.js";
|
|
4
4
|
import { getI18nSeatReservation } from "./seat-reservation/common/translations/i18n.js";
|
|
5
|
-
import { t as SbbSeatReservationAreaElement } from "./seat-reservation-area.component-
|
|
6
|
-
import { t as SbbSeatReservationGraphicElement } from "./seat-reservation-graphic.component-
|
|
5
|
+
import { t as SbbSeatReservationAreaElement } from "./seat-reservation-area.component-BWdrKqek.js";
|
|
6
|
+
import { t as SbbSeatReservationGraphicElement } from "./seat-reservation-graphic.component-CN5sWn0I.js";
|
|
7
7
|
import { assetsTemplate, svgImageByOSDMCode } from "./seat-reservation/seat-reservation-graphic/seat-reservation-assets.js";
|
|
8
|
-
import { t as SbbSeatReservationNavigationCoachElement } from "./seat-reservation-navigation-coach.component-
|
|
8
|
+
import { t as SbbSeatReservationNavigationCoachElement } from "./seat-reservation-navigation-coach.component-tDZkXl-3.js";
|
|
9
9
|
import { t as SbbSeatReservationNavigationServicesElement } from "./seat-reservation-navigation-services.component-CGel7__P.js";
|
|
10
10
|
import { t as SbbSeatReservationPlaceControlElement } from "./seat-reservation-place-control.component-CM9efId7.js";
|
|
11
11
|
import { t as SbbSeatReservationScopedElement } from "./seat-reservation-scoped.component-CFA_bJ3o.js";
|
|
12
12
|
import { SeatReservationBaseElement } from "./seat-reservation/seat-reservation/seat-reservation-base-element.js";
|
|
13
|
-
import { t as SbbSeatReservationElement } from "./seat-reservation.component-
|
|
13
|
+
import { t as SbbSeatReservationElement } from "./seat-reservation.component-44IHFFlM.js";
|
|
14
14
|
import "./seat-reservation.pure.js";
|
|
15
15
|
//#region src/elements-experimental/seat-reservation.ts
|
|
16
16
|
/** @entrypoint */
|