@sbb-esta/lyne-elements-dev 5.0.0-next.3-dev.1780486982 → 5.0.0-next.3-dev.1780499181

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.
Files changed (41) hide show
  1. package/calendar/calendar/calendar.component.js +1 -1
  2. package/{calendar.component-BM4L9oyb.js → calendar.component-RVAHcJf6.js} +46 -23
  3. package/calendar.js +1 -1
  4. package/calendar.pure.js +1 -1
  5. package/custom-elements.json +38 -2
  6. package/development/calendar/calendar/calendar.component.d.ts +7 -0
  7. package/development/calendar/calendar/calendar.component.d.ts.map +1 -1
  8. package/development/calendar/calendar/calendar.component.js +1 -1
  9. package/development/calendar.component-BmB8HoZt.js +1399 -0
  10. package/development/calendar.js +1 -1
  11. package/development/calendar.pure.js +1 -1
  12. package/development/header/header/header.component.d.ts +2 -0
  13. package/development/header/header/header.component.d.ts.map +1 -1
  14. package/development/header/header/header.component.js +1 -1
  15. package/development/header.component-FVw_5NRT.js +336 -0
  16. package/development/header.js +1 -1
  17. package/development/header.pure.js +1 -1
  18. package/development/map-container/map-container.component.d.ts +2 -2
  19. package/development/map-container/map-container.component.js +1 -1
  20. package/development/map-container.component-ASCfDs-R.js +176 -0
  21. package/development/map-container.js +1 -1
  22. package/development/map-container.pure.js +1 -1
  23. package/header/_header.global.scss +8 -1
  24. package/header/header/header.component.js +1 -1
  25. package/{header.component-DgWfgTse.js → header.component-BbdHh5fF.js} +1 -1
  26. package/header.js +1 -1
  27. package/header.pure.js +1 -1
  28. package/lean-off-brand-theme.css +5 -1
  29. package/lean-safety-theme.css +5 -1
  30. package/lean-theme.css +5 -1
  31. package/map-container/map-container.component.js +1 -1
  32. package/{map-container.component-bI8Gb4I8.js → map-container.component-C2_Miiv0.js} +1 -1
  33. package/map-container.js +1 -1
  34. package/map-container.pure.js +1 -1
  35. package/off-brand-theme.css +5 -1
  36. package/package.json +2 -2
  37. package/safety-theme.css +5 -1
  38. package/standard-theme.css +5 -1
  39. package/development/calendar.component-C_Yc2PNV.js +0 -1367
  40. package/development/header.component-B43X03Jg.js +0 -334
  41. package/development/map-container.component-N-e2oBnd.js +0 -176
@@ -1,334 +0,0 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { html, isServer, unsafeCSS } from "lit";
3
- import { property, state } from "lit/decorators.js";
4
- import { SbbElement, SbbFocusVisibleWithinController, forceType, idReference, queueDomContentLoaded } from "./core.js";
5
- //#region src/elements/header/header/header.scss?inline
6
- var header_default = ":host {\n --sbb-logo-height: 1rem;\n --sbb-signet-height: 1rem;\n --sbb-header-transition-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-6x)\n );\n}\n@media (min-width: calc(64rem)) {\n :host {\n --sbb-logo-height: 1.25rem;\n --sbb-signet-height: 1.25rem;\n }\n}\n:host {\n display: block;\n height: var(--sbb-header-height);\n line-height: var(--sbb-typo-line-height-text);\n}\n\n:host([size=s]) {\n --sbb-header-height: var(--sbb-header-height-s);\n}\n\n:host([size=m]) {\n --sbb-header-height: var(--sbb-header-height-m);\n}\n\n:host([hide-on-scroll]) {\n --sbb-header-position: absolute;\n}\n\n:host([hide-on-scroll]:is(:state(fixed),[state--fixed])) {\n --sbb-header-position: fixed;\n --sbb-header-animation-name: hide;\n --sbb-header-transform: translate3d(0, -100%, 0);\n --sbb-header-inset-inline-end: var(--sbb-scrollbar-width, 0);\n}\n\n:host([hide-on-scroll]:is(:state(fixed),[state--fixed]):is(:state(animated),[state--animated])) {\n --sbb-header-transition-timing: cubic-bezier(0.4, 0, 1, 1);\n}\n\n:host([hide-on-scroll]:is(:state(fixed),[state--fixed]):is(:state(visible),[state--visible])) {\n --sbb-header-animation-name: show;\n --sbb-header-transform: translate3d(0, 0, 0);\n --sbb-header-transition-timing: cubic-bezier(0, 0, 0.2, 1);\n}\n\n:host([hide-on-scroll]:is(:state(fixed),[state--fixed]):is(:state(has-visible-focus-within),[state--has-visible-focus-within])) {\n --sbb-header-transition-duration: 0;\n --sbb-header-transform: translate3d(0, 0, 0);\n}\n\n.sbb-header {\n position: var(--sbb-header-position);\n inset: 0 var(--sbb-header-inset-inline-end) auto 0;\n background: var(--sbb-header-background);\n z-index: var(--sbb-header-z-index, 10);\n transform: var(--sbb-header-transform);\n transition-property: box-shadow;\n transition-duration: var(--sbb-header-transition-duration);\n transition-timing-function: var(--sbb-header-transition-timing);\n animation-name: var(--sbb-header-animation-name);\n animation-duration: var(--sbb-header-transition-duration);\n animation-timing-function: var(--sbb-header-transition-timing);\n}\n:host(:is(:is(:state(shadow),[state--shadow]), :is(:state(has-visible-focus-within),[state--has-visible-focus-within]):is(:state(fixed),[state--fixed]))) .sbb-header {\n box-shadow: var(--sbb-header-box-shadow);\n}\n@media (forced-colors: active) {\n .sbb-header {\n border-block-end: var(--sbb-border-width-1x) solid CanvasText;\n }\n}\n\n.sbb-header__wrapper {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n height: var(--sbb-header-height);\n}\n:host(:not([expanded])) .sbb-header__wrapper {\n padding-inline: var(--sbb-page-spacing-padding, var(--sbb-layout-base-offset-responsive));\n margin-inline: auto;\n width: 100%;\n}\n@media (min-width: calc(90rem)) {\n :host(:not([expanded])) .sbb-header__wrapper {\n max-width: var(--sbb-spacing-max-width, calc(var(--sbb-layout-base-page-max-width) + 2 * var(--sbb-layout-base-offset-responsive)));\n }\n}\n:host([expanded]) .sbb-header__wrapper {\n padding-inline: var(--sbb-page-spacing-padding, var(--sbb-spacing-responsive-xxs));\n}\n\n::slotted(:is(sbb-header-button, sbb-header-link):first-child) {\n margin-inline-start: var(--sbb-header-first-item-margin-inline-start);\n}\n\n::slotted(*) {\n flex: 0 0 auto;\n}\n\n::slotted(.sbb-header-shrinkable) {\n flex-shrink: 1;\n min-width: 0;\n}\n\n::slotted(.sbb-header-spacer) {\n flex-grow: 1;\n}\n\n::slotted(.sbb-header-logo) {\n margin-inline-start: var(--sbb-spacing-responsive-s);\n}\n\n::slotted(a.sbb-header-logo) {\n display: block;\n padding-block: var(--sbb-spacing-fixed-3x);\n position: relative;\n outline: none !important;\n}\n\n::slotted(a.sbb-header-logo)::before {\n content: \"\";\n display: block;\n position: absolute;\n inset: var(--sbb-spacing-fixed-3x) 0;\n}\n\n::slotted(a.sbb-header-logo:focus-visible)::before {\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 outline-offset: var(--sbb-spacing-fixed-3x);\n border-radius: 1px;\n}\n\n@keyframes show {\n from {\n transform: translate3d(0, -100%, 0);\n }\n to {\n transform: translate3d(0, 0, 0);\n }\n}\n@keyframes hide {\n from {\n transform: translate3d(0, 0, 0);\n }\n to {\n transform: translate3d(0, -100%, 0);\n }\n}";
7
- //#endregion
8
- //#region src/elements/header/header/header.component.ts
9
- var IS_MENU_OPENED_QUERY = "[aria-controls][aria-expanded='true']";
10
- /**
11
- * It displays a header section for the page.
12
- *
13
- * @slot - Use the unnamed slot to add actions, content and logo to the header.
14
- * @cssprop [--sbb-header-z-index=10] - Can be used to modify the z-index of the header.
15
- * @cssprop [--sbb-header-height=zero-small:var(--sbb-spacing-fixed-14x);large-ultra:var(--sbb-spacing-fixed-24x)] - Can be used to modify height of the header.
16
- */
17
- var SbbHeaderElement = (() => {
18
- let _classSuper = SbbElement;
19
- let _expanded_decorators;
20
- let _expanded_initializers = [];
21
- let _expanded_extraInitializers = [];
22
- let _scrollOrigin_decorators;
23
- let _scrollOrigin_initializers = [];
24
- let _scrollOrigin_extraInitializers = [];
25
- let _hideOnScroll_decorators;
26
- let _hideOnScroll_initializers = [];
27
- let _hideOnScroll_extraInitializers = [];
28
- let _size_decorators;
29
- let _size_initializers = [];
30
- let _size_extraInitializers = [];
31
- let __headerOnTop_decorators;
32
- let __headerOnTop_initializers = [];
33
- let __headerOnTop_extraInitializers = [];
34
- return class SbbHeaderElement extends _classSuper {
35
- static {
36
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
37
- _expanded_decorators = [forceType(), property({
38
- reflect: true,
39
- type: Boolean
40
- })];
41
- _scrollOrigin_decorators = [idReference(), property({ attribute: "scroll-origin" })];
42
- _hideOnScroll_decorators = [forceType(), property({
43
- attribute: "hide-on-scroll",
44
- reflect: true,
45
- type: Boolean
46
- })];
47
- _size_decorators = [property({ reflect: true })];
48
- __headerOnTop_decorators = [state()];
49
- __esDecorate(this, null, _expanded_decorators, {
50
- kind: "accessor",
51
- name: "expanded",
52
- static: false,
53
- private: false,
54
- access: {
55
- has: (obj) => "expanded" in obj,
56
- get: (obj) => obj.expanded,
57
- set: (obj, value) => {
58
- obj.expanded = value;
59
- }
60
- },
61
- metadata: _metadata
62
- }, _expanded_initializers, _expanded_extraInitializers);
63
- __esDecorate(this, null, _scrollOrigin_decorators, {
64
- kind: "accessor",
65
- name: "scrollOrigin",
66
- static: false,
67
- private: false,
68
- access: {
69
- has: (obj) => "scrollOrigin" in obj,
70
- get: (obj) => obj.scrollOrigin,
71
- set: (obj, value) => {
72
- obj.scrollOrigin = value;
73
- }
74
- },
75
- metadata: _metadata
76
- }, _scrollOrigin_initializers, _scrollOrigin_extraInitializers);
77
- __esDecorate(this, null, _hideOnScroll_decorators, {
78
- kind: "accessor",
79
- name: "hideOnScroll",
80
- static: false,
81
- private: false,
82
- access: {
83
- has: (obj) => "hideOnScroll" in obj,
84
- get: (obj) => obj.hideOnScroll,
85
- set: (obj, value) => {
86
- obj.hideOnScroll = value;
87
- }
88
- },
89
- metadata: _metadata
90
- }, _hideOnScroll_initializers, _hideOnScroll_extraInitializers);
91
- __esDecorate(this, null, _size_decorators, {
92
- kind: "accessor",
93
- name: "size",
94
- static: false,
95
- private: false,
96
- access: {
97
- has: (obj) => "size" in obj,
98
- get: (obj) => obj.size,
99
- set: (obj, value) => {
100
- obj.size = value;
101
- }
102
- },
103
- metadata: _metadata
104
- }, _size_initializers, _size_extraInitializers);
105
- __esDecorate(this, null, __headerOnTop_decorators, {
106
- kind: "accessor",
107
- name: "_headerOnTop",
108
- static: false,
109
- private: false,
110
- access: {
111
- has: (obj) => "_headerOnTop" in obj,
112
- get: (obj) => obj._headerOnTop,
113
- set: (obj, value) => {
114
- obj._headerOnTop = value;
115
- }
116
- },
117
- metadata: _metadata
118
- }, __headerOnTop_initializers, __headerOnTop_extraInitializers);
119
- if (_metadata) Object.defineProperty(this, Symbol.metadata, {
120
- enumerable: true,
121
- configurable: true,
122
- writable: true,
123
- value: _metadata
124
- });
125
- }
126
- static {
127
- this.elementName = "sbb-header";
128
- }
129
- static {
130
- this.styles = [unsafeCSS(header_default)];
131
- }
132
- static {
133
- this._headerScrollOrigins = /* @__PURE__ */ new Set();
134
- }
135
- static {
136
- this._headerElements = /* @__PURE__ */ new Set();
137
- }
138
- static {
139
- if (!isServer) queueDomContentLoaded(() => this._initializeScrollOriginObserver());
140
- }
141
- #expanded_accessor_storage;
142
- /**
143
- * Whether to allow the header content to stretch to full width.
144
- * By default, the content has the appropriate page size.
145
- */
146
- get expanded() {
147
- return this.#expanded_accessor_storage;
148
- }
149
- set expanded(value) {
150
- this.#expanded_accessor_storage = value;
151
- }
152
- #scrollOrigin_accessor_storage;
153
- /**
154
- * The element's id or the element on which the scroll listener is attached.
155
- *
156
- * For attribute usage, provide an id reference.
157
- */
158
- get scrollOrigin() {
159
- return this.#scrollOrigin_accessor_storage;
160
- }
161
- set scrollOrigin(value) {
162
- this.#scrollOrigin_accessor_storage = value;
163
- }
164
- #hideOnScroll_accessor_storage;
165
- /** Whether the header should hide and show on scroll. */
166
- get hideOnScroll() {
167
- return this.#hideOnScroll_accessor_storage;
168
- }
169
- set hideOnScroll(value) {
170
- this.#hideOnScroll_accessor_storage = value;
171
- }
172
- #size_accessor_storage;
173
- /**
174
- * Size of the header, either s (lean theme default) or m (standard theme default).
175
- */
176
- get size() {
177
- return this.#size_accessor_storage;
178
- }
179
- set size(value) {
180
- this.#size_accessor_storage = value;
181
- }
182
- #_headerOnTop_accessor_storage;
183
- get _headerOnTop() {
184
- return this.#_headerOnTop_accessor_storage;
185
- }
186
- set _headerOnTop(value) {
187
- this.#_headerOnTop_accessor_storage = value;
188
- }
189
- constructor() {
190
- super();
191
- this.#expanded_accessor_storage = __runInitializers(this, _expanded_initializers, false);
192
- this.#scrollOrigin_accessor_storage = (__runInitializers(this, _expanded_extraInitializers), __runInitializers(this, _scrollOrigin_initializers, null));
193
- this.#hideOnScroll_accessor_storage = (__runInitializers(this, _scrollOrigin_extraInitializers), __runInitializers(this, _hideOnScroll_initializers, false));
194
- this.#size_accessor_storage = (__runInitializers(this, _hideOnScroll_extraInitializers), __runInitializers(this, _size_initializers, null));
195
- this.#_headerOnTop_accessor_storage = (__runInitializers(this, _size_extraInitializers), __runInitializers(this, __headerOnTop_initializers, true));
196
- this._scrollElement = __runInitializers(this, __headerOnTop_extraInitializers);
197
- this._lastScroll = 0;
198
- this._scrollOriginFromObserver = null;
199
- this.addController(new SbbFocusVisibleWithinController(this));
200
- }
201
- static _initializeScrollOriginObserver() {
202
- new MutationObserver((mutations) => {
203
- for (const mutation of mutations) if (mutation.type === "attributes") this._handleScrollOriginElement(mutation.target);
204
- else if (mutation.type === "childList") for (const node of [...mutation.addedNodes, ...mutation.removedNodes].filter((n) => n.nodeType === n.ELEMENT_NODE)) {
205
- this._handleScrollOriginElement(node);
206
- this._findAndHandleScrollOrigins(node);
207
- }
208
- this._updateHeaderElements();
209
- }).observe(document.documentElement, {
210
- attributeFilter: ["sbb-header-scroll-origin"],
211
- childList: true,
212
- subtree: true
213
- });
214
- this._findAndHandleScrollOrigins(document.body);
215
- this._updateHeaderElements();
216
- }
217
- static _findAndHandleScrollOrigins(root) {
218
- root.querySelectorAll("[sbb-header-scroll-origin]").forEach((e) => this._handleScrollOriginElement(e));
219
- }
220
- static _handleScrollOriginElement(element) {
221
- if (element.isConnected && element.hasAttribute("sbb-header-scroll-origin")) this._headerScrollOrigins.add(element);
222
- else this._headerScrollOrigins.delete(element);
223
- }
224
- static _updateHeaderElements() {
225
- for (const header of this._headerElements) {
226
- if (this._headerScrollOrigins.size === 0) header._scrollOriginFromObserver = null;
227
- else if (this._headerScrollOrigins.size === 1) header._scrollOriginFromObserver = this._headerScrollOrigins.values().next().value ?? null;
228
- else header._scrollOriginFromObserver = Array.from(this._headerScrollOrigins).sort((c1, c2) => c1.compareDocumentPosition(c2) & Node.DOCUMENT_POSITION_CONTAINS).at(-1) ?? null;
229
- header._updateScrollListener();
230
- }
231
- }
232
- /** If `hideOnScroll` is set, checks the element to hook the listener on, and possibly add it.*/
233
- connectedCallback() {
234
- super.connectedCallback();
235
- SbbHeaderElement._headerElements.add(this);
236
- if (this.hasUpdated) this._updateScrollListener();
237
- }
238
- /** Removes the scroll listener, if previously attached. */
239
- disconnectedCallback() {
240
- super.disconnectedCallback();
241
- this._scrollElement = null;
242
- this._scrollEventsController?.abort();
243
- SbbHeaderElement._headerElements.delete(this);
244
- }
245
- requestUpdate(name, oldValue, options) {
246
- super.requestUpdate(name, oldValue, options);
247
- if (!isServer && (!name || name === "scrollOrigin") && this.hasUpdated) this._updateScrollListener();
248
- }
249
- firstUpdated(changedProperties) {
250
- super.firstUpdated(changedProperties);
251
- this._updateScrollListener();
252
- }
253
- _updateScrollListener() {
254
- const scrollElement = this.scrollOrigin ?? this._scrollOriginFromObserver ?? document;
255
- if (scrollElement === this._scrollElement) return;
256
- this._scrollEventsController?.abort();
257
- this._scrollElement = scrollElement;
258
- if (!this._scrollElement) return;
259
- this._scrollEventsController = new AbortController();
260
- this._scrollFunction = this._getScrollFunction.bind(this);
261
- this._scrollElement.addEventListener("scroll", this._scrollFunction, {
262
- passive: true,
263
- signal: this._scrollEventsController.signal
264
- });
265
- const currentScroll = this._getCurrentScrollProperty("scrollTop");
266
- this._lastScroll = currentScroll <= 0 ? 0 : currentScroll;
267
- }
268
- /** Returns the correct function to attach on scroll. */
269
- _getScrollFunction() {
270
- return this.hideOnScroll ? this._scrollListener() : this._scrollShadowListener();
271
- }
272
- /** Returns the requested property of the scrollContext. */
273
- _getCurrentScrollProperty(property) {
274
- if (this._scrollElement instanceof Document) return this._scrollElement.documentElement[property] || this._scrollElement.body[property];
275
- return this._scrollElement?.[property] || 0;
276
- }
277
- /**
278
- * Sets the correct value for `scrollTop`, then:
279
- * - apply the shadow if the element/document has been scrolled down;
280
- * - hides the header, remove the shadow and possibly close any open menu on the header if it is not visible anymore;
281
- * - shows the header and re-apply the shadow if the element/document has been scrolled up.
282
- */
283
- _scrollListener() {
284
- const currentScroll = this._getCurrentScrollProperty("scrollTop");
285
- if (this._getCurrentScrollProperty("scrollHeight") - window.innerHeight - currentScroll <= 0) return;
286
- this.toggleState("shadow", currentScroll !== 0);
287
- if (currentScroll > this.offsetHeight && currentScroll > 0 && this._lastScroll < currentScroll) this._closeOpenOverlays();
288
- if (currentScroll > this.offsetHeight * 2) {
289
- this._headerOnTop = false;
290
- if (currentScroll > 0 && this._lastScroll < currentScroll) ["shadow", "visible"].forEach((name) => this.internals.states.delete(name));
291
- else [
292
- "fixed",
293
- "shadow",
294
- "animated",
295
- "visible"
296
- ].forEach((name) => this.internals.states.add(name));
297
- } else {
298
- if (currentScroll === 0) this._headerOnTop = true;
299
- if (this._headerOnTop) [
300
- "shadow",
301
- "animated",
302
- "fixed",
303
- "visible"
304
- ].forEach((name) => this.internals.states.delete(name));
305
- }
306
- this._lastScroll = currentScroll <= 0 ? 0 : currentScroll;
307
- }
308
- /** Apply the shadow if the element/document has been scrolled down. */
309
- _scrollShadowListener() {
310
- this.toggleState("shadow", this._getCurrentScrollProperty("scrollTop") !== 0);
311
- }
312
- _closeOpenOverlays() {
313
- if (this.matches(":is(:state(has-visible-focus-within),[state--has-visible-focus-within])")) return;
314
- const overlayTriggers = Array.from(this.querySelectorAll(IS_MENU_OPENED_QUERY));
315
- for (const overlayTrigger of overlayTriggers) {
316
- const overlay = overlayTrigger.ariaControlsElements[0];
317
- if (typeof overlay?.close === "function") overlay.close();
318
- }
319
- }
320
- render() {
321
- return html`
322
- <header class="sbb-header">
323
- <div class="sbb-header__wrapper">
324
- <slot></slot>
325
- </div>
326
- </header>
327
- `;
328
- }
329
- };
330
- })();
331
- //#endregion
332
- export { SbbHeaderElement as t };
333
-
334
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLmNvbXBvbmVudC1CNDNYMDNKZy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvaGVhZGVyL2hlYWRlci9oZWFkZXIuc2Nzcz9pbmxpbmUiLCIuLi8uLi8uLi9zcmMvZWxlbWVudHMvaGVhZGVyL2hlYWRlci9oZWFkZXIuY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIkB1c2UgJy4uLy4uL2NvcmUvc3R5bGVzJyBhcyBzYmI7XG5cbjpob3N0IHtcbiAgLS1zYmItbG9nby1oZWlnaHQ6ICN7c2JiLnB4LXRvLXJlbS1idWlsZCgxNil9O1xuICAtLXNiYi1zaWduZXQtaGVpZ2h0OiAje3NiYi5weC10by1yZW0tYnVpbGQoMTYpfTtcbiAgLS1zYmItaGVhZGVyLXRyYW5zaXRpb24tZHVyYXRpb246IHZhcihcbiAgICAtLXNiYi1kaXNhYmxlLWFuaW1hdGlvbi1kdXJhdGlvbixcbiAgICB2YXIoLS1zYmItYW5pbWF0aW9uLWR1cmF0aW9uLTZ4KVxuICApO1xuXG4gIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogbGFyZ2UpIHtcbiAgICAtLXNiYi1sb2dvLWhlaWdodDogI3tzYmIucHgtdG8tcmVtLWJ1aWxkKDIwKX07XG4gICAgLS1zYmItc2lnbmV0LWhlaWdodDogI3tzYmIucHgtdG8tcmVtLWJ1aWxkKDIwKX07XG4gIH1cblxuICBkaXNwbGF5OiBibG9jaztcblxuICAvLyBTZXR0aW5nIHRoZSBoZWlnaHQgaGVyZSByZXNlcnZlcyB0aGUgc3BhY2UgZm9yIHRoZSBoZWFkZXIgd2hpY2ggd2lsbCBlbHNlIGJlIGxvc3Qgd2l0aCBmaXhlZCBwb3NpdGlvbi5cbiAgaGVpZ2h0OiB2YXIoLS1zYmItaGVhZGVyLWhlaWdodCk7XG5cbiAgLy8gU2V0IHRoZSBsaW5lLWhlaWdodCBmb3IgYWRqYWNlbnQgZWxlbWVudHMgaW4gb3JkZXIgdG8gcHJldmVudCBmcm9tIGluZmx1ZW5jZSBvZiBhIGNvbnN1bWVyLXNldCBsaW5lLWhlaWdodC5cbiAgbGluZS1oZWlnaHQ6IHZhcigtLXNiYi10eXBvLWxpbmUtaGVpZ2h0LXRleHQpO1xufVxuXG46aG9zdChbc2l6ZT0ncyddKSB7XG4gIC0tc2JiLWhlYWRlci1oZWlnaHQ6IHZhcigtLXNiYi1oZWFkZXItaGVpZ2h0LXMpO1xufVxuXG46aG9zdChbc2l6ZT0nbSddKSB7XG4gIC0tc2JiLWhlYWRlci1oZWlnaHQ6IHZhcigtLXNiYi1oZWFkZXItaGVpZ2h0LW0pO1xufVxuXG46aG9zdChbaGlkZS1vbi1zY3JvbGxdKSB7XG4gIC0tc2JiLWhlYWRlci1wb3NpdGlvbjogYWJzb2x1dGU7XG59XG5cbjpob3N0KFtoaWRlLW9uLXNjcm9sbF06c3RhdGUoZml4ZWQpKSB7XG4gIC0tc2JiLWhlYWRlci1wb3NpdGlvbjogZml4ZWQ7XG4gIC0tc2JiLWhlYWRlci1hbmltYXRpb24tbmFtZTogaGlkZTtcbiAgLS1zYmItaGVhZGVyLXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTEwMCUsIDApO1xuICAtLXNiYi1oZWFkZXItaW5zZXQtaW5saW5lLWVuZDogdmFyKC0tc2JiLXNjcm9sbGJhci13aWR0aCwgMCk7XG59XG5cbjpob3N0KFtoaWRlLW9uLXNjcm9sbF06c3RhdGUoZml4ZWQpOnN0YXRlKGFuaW1hdGVkKSkge1xuICAvLyBIaWRlIHRyYW5zaXRpb25cbiAgLS1zYmItaGVhZGVyLXRyYW5zaXRpb24tdGltaW5nOiBjdWJpYy1iZXppZXIoMC40LCAwLCAxLCAxKTtcbn1cblxuOmhvc3QoW2hpZGUtb24tc2Nyb2xsXTpzdGF0ZShmaXhlZCk6c3RhdGUodmlzaWJsZSkpIHtcbiAgLS1zYmItaGVhZGVyLWFuaW1hdGlvbi1uYW1lOiBzaG93O1xuICAtLXNiYi1oZWFkZXItdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTtcblxuICAvLyBTaG93IHRyYW5zaXRpb25cbiAgLS1zYmItaGVhZGVyLXRyYW5zaXRpb24tdGltaW5nOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcbn1cblxuOmhvc3QoW2hpZGUtb24tc2Nyb2xsXTpzdGF0ZShmaXhlZCk6c3RhdGUoaGFzLXZpc2libGUtZm9jdXMtd2l0aGluKSkge1xuICAtLXNiYi1oZWFkZXItdHJhbnNpdGlvbi1kdXJhdGlvbjogMDtcbiAgLS1zYmItaGVhZGVyLXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7XG59XG5cbi5zYmItaGVhZGVyIHtcbiAgcG9zaXRpb246IHZhcigtLXNiYi1oZWFkZXItcG9zaXRpb24pO1xuICBpbnNldDogMCB2YXIoLS1zYmItaGVhZGVyLWluc2V0LWlubGluZS1lbmQpIGF1dG8gMDtcbiAgYmFja2dyb3VuZDogdmFyKC0tc2JiLWhlYWRlci1iYWNrZ3JvdW5kKTtcbiAgei1pbmRleDogdmFyKC0tc2JiLWhlYWRlci16LWluZGV4LCAxMCk7XG4gIHRyYW5zZm9ybTogdmFyKC0tc2JiLWhlYWRlci10cmFuc2Zvcm0pO1xuICB0cmFuc2l0aW9uOiB7XG4gICAgcHJvcGVydHk6IGJveC1zaGFkb3c7XG4gICAgZHVyYXRpb246IHZhcigtLXNiYi1oZWFkZXItdHJhbnNpdGlvbi1kdXJhdGlvbik7XG4gICAgdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1zYmItaGVhZGVyLXRyYW5zaXRpb24tdGltaW5nKTtcbiAgfVxuICBhbmltYXRpb246IHtcbiAgICBuYW1lOiB2YXIoLS1zYmItaGVhZGVyLWFuaW1hdGlvbi1uYW1lKTtcbiAgICBkdXJhdGlvbjogdmFyKC0tc2JiLWhlYWRlci10cmFuc2l0aW9uLWR1cmF0aW9uKTtcbiAgICB0aW1pbmctZnVuY3Rpb246IHZhcigtLXNiYi1oZWFkZXItdHJhbnNpdGlvbi10aW1pbmcpO1xuICB9XG5cbiAgOmhvc3QoOmlzKDpzdGF0ZShzaGFkb3cpLCA6c3RhdGUoaGFzLXZpc2libGUtZm9jdXMtd2l0aGluKTpzdGF0ZShmaXhlZCkpKSAmIHtcbiAgICBib3gtc2hhZG93OiB2YXIoLS1zYmItaGVhZGVyLWJveC1zaGFkb3cpO1xuICB9XG5cbiAgQG1lZGlhIChmb3JjZWQtY29sb3JzOiBhY3RpdmUpIHtcbiAgICBib3JkZXItYmxvY2stZW5kOiB2YXIoLS1zYmItYm9yZGVyLXdpZHRoLTF4KSBzb2xpZCBDYW52YXNUZXh0O1xuICB9XG59XG5cbi5zYmItaGVhZGVyX193cmFwcGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICBoZWlnaHQ6IHZhcigtLXNiYi1oZWFkZXItaGVpZ2h0KTtcblxuICA6aG9zdCg6bm90KFtleHBhbmRlZF0pKSAmIHtcbiAgICBAaW5jbHVkZSBzYmIucGFnZS1zcGFjaW5nO1xuICB9XG5cbiAgOmhvc3QoW2V4cGFuZGVkXSkgJiB7XG4gICAgQGluY2x1ZGUgc2JiLnBhZ2Utc3BhY2luZy1leHBhbmRlZDtcbiAgfVxufVxuXG4vLyBGaXggbGVmdCBvZmZzZXQgaWYgZmlyc3QgZWxlbWVudCBvZiB0aGUgaGVhZGVyIGlzIGEgc2JiLWhlYWRlci1idXR0b24vc2JiLWhlYWRlci1saW5rLlxuLy8gVGhlIHZhbHVlIG9mIHRoZSBvZmZzZXQgaXMgY2FsY3VsYXRlZCBpbnNpZGUgc2JiLWhlYWRlci1idXR0b24vc2JiLWhlYWRlci1saW5rIHN0eWxlcy5cbjo6c2xvdHRlZCg6aXMoc2JiLWhlYWRlci1idXR0b24sIHNiYi1oZWFkZXItbGluayk6Zmlyc3QtY2hpbGQpIHtcbiAgbWFyZ2luLWlubGluZS1zdGFydDogdmFyKC0tc2JiLWhlYWRlci1maXJzdC1pdGVtLW1hcmdpbi1pbmxpbmUtc3RhcnQpO1xufVxuXG46OnNsb3R0ZWQoKikge1xuICBmbGV4OiAwIDAgYXV0bztcbn1cblxuOjpzbG90dGVkKC5zYmItaGVhZGVyLXNocmlua2FibGUpIHtcbiAgZmxleC1zaHJpbms6IDE7XG4gIG1pbi13aWR0aDogMDtcbn1cblxuOjpzbG90dGVkKC5zYmItaGVhZGVyLXNwYWNlcikge1xuICBmbGV4LWdyb3c6IDE7XG59XG5cbjo6c2xvdHRlZCguc2JiLWhlYWRlci1sb2dvKSB7XG4gIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IHZhcigtLXNiYi1zcGFjaW5nLXJlc3BvbnNpdmUtcyk7XG59XG5cbi8vIEFwcGx5IHBhZGRpbmcgYW5kIG91dGxpbmUgdG8gcG9zc2libGUgc2xvdHRlZCBsaW5rIGluIGxvZ28gc2xvdFxuOjpzbG90dGVkKGEuc2JiLWhlYWRlci1sb2dvKSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nLWJsb2NrOiB2YXIoLS1zYmItc3BhY2luZy1maXhlZC0zeCk7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAvLyBVc2UgIWltcG9ydGFudCBoZXJlIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBGaXJlZm94IGZvY3VzIHJpbmcgZGVmaW5pdGlvblxuICAvLyB3aGljaCBhcHBlYXJzIGluIG5vcm1hbGl6ZSBDU1Mgb2Ygc2V2ZXJhbCBmcmFtZXdvcmtzLlxuICBvdXRsaW5lOiBub25lICFpbXBvcnRhbnQ7XG59XG5cbi8vIFRvIHNob3cgdGhlIGNvcnJlY3Qgb3V0bGluZSwgd2UgbmVlZCB0byBzcGFuIGEgaGlkZGVuIGVsZW1lbnQgZmlsbGluZyB0aGUgbGluayBidXQgd2l0aG91dCB0aGUgb3V0bGluZS1vZmZzZXQuXG46OnNsb3R0ZWQoYS5zYmItaGVhZGVyLWxvZ28pOjpiZWZvcmUge1xuICBjb250ZW50OiAnJztcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTN4KSAwO1xufVxuXG46OnNsb3R0ZWQoYS5zYmItaGVhZGVyLWxvZ286Zm9jdXMtdmlzaWJsZSk6OmJlZm9yZSB7XG4gIEBpbmNsdWRlIHNiYi5mb2N1cy1vdXRsaW5lO1xuXG4gIG91dGxpbmUtb2Zmc2V0OiB2YXIoLS1zYmItc3BhY2luZy1maXhlZC0zeCk7XG5cbiAgLy8gQXMgaWYgdGhlIG91dGxpbmUgaGFzIGFuIG9mZnNldCwgdGhlIGJvcmRlciByYWRpdXMgaW5jcmVhc2VzLCB3ZSBzZXQgaXQgdG8gdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGJvcmRlci1yYWRpdXMuXG4gIGJvcmRlci1yYWRpdXM6IDFweDtcbn1cblxuQGtleWZyYW1lcyBzaG93IHtcbiAgZnJvbSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMTAwJSwgMCk7XG4gIH1cblxuICB0byB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTtcbiAgfVxufVxuXG5Aa2V5ZnJhbWVzIGhpZGUge1xuICBmcm9tIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xuICB9XG5cbiAgdG8ge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTEwMCUsIDApO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICB0eXBlIENTU1Jlc3VsdEdyb3VwLFxuICBodG1sLFxuICBpc1NlcnZlcixcbiAgdHlwZSBQcm9wZXJ0eURlY2xhcmF0aW9uLFxuICB0eXBlIFByb3BlcnR5VmFsdWVzLFxuICB0eXBlIFRlbXBsYXRlUmVzdWx0LFxuICB1bnNhZmVDU1MsXG59IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7XG4gIGZvcmNlVHlwZSxcbiAgaWRSZWZlcmVuY2UsXG4gIHF1ZXVlRG9tQ29udGVudExvYWRlZCxcbiAgU2JiRWxlbWVudCxcbiAgU2JiRm9jdXNWaXNpYmxlV2l0aGluQ29udHJvbGxlcixcbn0gZnJvbSAnLi4vLi4vY29yZS50cyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL2hlYWRlci5zY3NzP2lubGluZSc7XG5cbmNvbnN0IElTX01FTlVfT1BFTkVEX1FVRVJZID0gXCJbYXJpYS1jb250cm9sc11bYXJpYS1leHBhbmRlZD0ndHJ1ZSddXCI7XG5cbi8qKlxuICogSXQgZGlzcGxheXMgYSBoZWFkZXIgc2VjdGlvbiBmb3IgdGhlIHBhZ2UuXG4gKlxuICogQHNsb3QgLSBVc2UgdGhlIHVubmFtZWQgc2xvdCB0byBhZGQgYWN0aW9ucywgY29udGVudCBhbmQgbG9nbyB0byB0aGUgaGVhZGVyLlxuICogQGNzc3Byb3AgWy0tc2JiLWhlYWRlci16LWluZGV4PTEwXSAtIENhbiBiZSB1c2VkIHRvIG1vZGlmeSB0aGUgei1pbmRleCBvZiB0aGUgaGVhZGVyLlxuICogQGNzc3Byb3AgWy0tc2JiLWhlYWRlci1oZWlnaHQ9emVyby1zbWFsbDp2YXIoLS1zYmItc3BhY2luZy1maXhlZC0xNHgpO2xhcmdlLXVsdHJhOnZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTI0eCldIC0gQ2FuIGJlIHVzZWQgdG8gbW9kaWZ5IGhlaWdodCBvZiB0aGUgaGVhZGVyLlxuICovXG5leHBvcnQgY2xhc3MgU2JiSGVhZGVyRWxlbWVudCBleHRlbmRzIFNiYkVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IGVsZW1lbnROYW1lOiBzdHJpbmcgPSAnc2JiLWhlYWRlcic7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IFt1bnNhZmVDU1Moc3R5bGUpXTtcblxuICBwcml2YXRlIHN0YXRpYyBfaGVhZGVyU2Nyb2xsT3JpZ2lucyA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KCk7XG4gIHByaXZhdGUgc3RhdGljIF9oZWFkZXJFbGVtZW50cyA9IG5ldyBTZXQ8U2JiSGVhZGVyRWxlbWVudD4oKTtcblxuICBzdGF0aWMge1xuICAgIGlmICghaXNTZXJ2ZXIpIHtcbiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gYmxvY2sgZXhlY3V0aW9uIGZvciBpbml0aWFsaXphdGlvbixcbiAgICAgIC8vIHNvIHdlIGRlZmVyIGl0IHVudGlsIHRoZSBET00gY29udGVudCBpcyBsb2FkZWQuXG4gICAgICBxdWV1ZURvbUNvbnRlbnRMb2FkZWQoKCkgPT4gdGhpcy5faW5pdGlhbGl6ZVNjcm9sbE9yaWdpbk9ic2VydmVyKCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IHRoZSBoZWFkZXIgY29udGVudCB0byBzdHJldGNoIHRvIGZ1bGwgd2lkdGguXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBjb250ZW50IGhhcyB0aGUgYXBwcm9wcmlhdGUgcGFnZSBzaXplLlxuICAgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIGV4cGFuZGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50J3MgaWQgb3IgdGhlIGVsZW1lbnQgb24gd2hpY2ggdGhlIHNjcm9sbCBsaXN0ZW5lciBpcyBhdHRhY2hlZC5cbiAgICpcbiAgICogRm9yIGF0dHJpYnV0ZSB1c2FnZSwgcHJvdmlkZSBhbiBpZCByZWZlcmVuY2UuXG4gICAqL1xuICBAaWRSZWZlcmVuY2UoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdzY3JvbGwtb3JpZ2luJyB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2Nyb2xsT3JpZ2luOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBoZWFkZXIgc2hvdWxkIGhpZGUgYW5kIHNob3cgb24gc2Nyb2xsLiAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnaGlkZS1vbi1zY3JvbGwnLCByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBoaWRlT25TY3JvbGw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU2l6ZSBvZiB0aGUgaGVhZGVyLCBlaXRoZXIgcyAobGVhbiB0aGVtZSBkZWZhdWx0KSBvciBtIChzdGFuZGFyZCB0aGVtZSBkZWZhdWx0KS5cbiAgICovXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUgfSkgcHVibGljIGFjY2Vzc29yIHNpemU6ICdzJyB8ICdtJyB8IG51bGwgPSBudWxsO1xuXG4gIEBzdGF0ZSgpIHByaXZhdGUgYWNjZXNzb3IgX2hlYWRlck9uVG9wID0gdHJ1ZTtcblxuICBwcml2YXRlIF9zY3JvbGxFbGVtZW50OiBIVE1MRWxlbWVudCB8IERvY3VtZW50IHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfc2Nyb2xsRXZlbnRzQ29udHJvbGxlciE6IEFib3J0Q29udHJvbGxlcjtcbiAgcHJpdmF0ZSBfc2Nyb2xsRnVuY3Rpb246ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfbGFzdFNjcm9sbCA9IDA7XG4gIHByaXZhdGUgX3Njcm9sbE9yaWdpbkZyb21PYnNlcnZlcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZENvbnRyb2xsZXIobmV3IFNiYkZvY3VzVmlzaWJsZVdpdGhpbkNvbnRyb2xsZXIodGhpcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2luaXRpYWxpemVTY3JvbGxPcmlnaW5PYnNlcnZlcigpOiB2b2lkIHtcbiAgICAvLyBXZSBhcmUgdXNpbmcgTXV0YXRpb25PYnNlcnZlciBkaXJlY3RseSBoZXJlLCBhcyBpdCB3aWxsIG9ubHkgYmUgY2FsbGVkIG9uIGNsaWVudCBzaWRlLFxuICAgIC8vIGFuZCB3ZSBkbyBub3QgbmVlZCB0byBkaXNjb25uZWN0IGl0LCBhcyB3ZSB3YW50IGl0IHRvIHdvcmsgZHVyaW5nIHRoZSBmdWxsIGxpZmV0aW1lXG4gICAgLy8gb2YgdGhlIHBhZ2UuXG4gICAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuICAgICAgZm9yIChjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbnMpIHtcbiAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdhdHRyaWJ1dGVzJykge1xuICAgICAgICAgIHRoaXMuX2hhbmRsZVNjcm9sbE9yaWdpbkVsZW1lbnQobXV0YXRpb24udGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChtdXRhdGlvbi50eXBlID09PSAnY2hpbGRMaXN0Jykge1xuICAgICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBbLi4ubXV0YXRpb24uYWRkZWROb2RlcywgLi4ubXV0YXRpb24ucmVtb3ZlZE5vZGVzXS5maWx0ZXIoXG4gICAgICAgICAgICAobik6IG4gaXMgSFRNTEVsZW1lbnQgPT4gbi5ub2RlVHlwZSA9PT0gbi5FTEVNRU5UX05PREUsXG4gICAgICAgICAgKSkge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlU2Nyb2xsT3JpZ2luRWxlbWVudChub2RlKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpbmRBbmRIYW5kbGVTY3JvbGxPcmlnaW5zKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fdXBkYXRlSGVhZGVyRWxlbWVudHMoKTtcbiAgICB9KS5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwge1xuICAgICAgYXR0cmlidXRlRmlsdGVyOiBbJ3NiYi1oZWFkZXItc2Nyb2xsLW9yaWdpbiddLFxuICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLl9maW5kQW5kSGFuZGxlU2Nyb2xsT3JpZ2lucyhkb2N1bWVudC5ib2R5KTtcbiAgICB0aGlzLl91cGRhdGVIZWFkZXJFbGVtZW50cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2ZpbmRBbmRIYW5kbGVTY3JvbGxPcmlnaW5zKHJvb3Q6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgcm9vdFxuICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdbc2JiLWhlYWRlci1zY3JvbGwtb3JpZ2luXScpXG4gICAgICAuZm9yRWFjaCgoZSkgPT4gdGhpcy5faGFuZGxlU2Nyb2xsT3JpZ2luRWxlbWVudChlKSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfaGFuZGxlU2Nyb2xsT3JpZ2luRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmIChlbGVtZW50LmlzQ29ubmVjdGVkICYmIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdzYmItaGVhZGVyLXNjcm9sbC1vcmlnaW4nKSkge1xuICAgICAgdGhpcy5faGVhZGVyU2Nyb2xsT3JpZ2lucy5hZGQoZWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2hlYWRlclNjcm9sbE9yaWdpbnMuZGVsZXRlKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF91cGRhdGVIZWFkZXJFbGVtZW50cygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGhlYWRlciBvZiB0aGlzLl9oZWFkZXJFbGVtZW50cykge1xuICAgICAgaWYgKHRoaXMuX2hlYWRlclNjcm9sbE9yaWdpbnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICBoZWFkZXIuX3Njcm9sbE9yaWdpbkZyb21PYnNlcnZlciA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2hlYWRlclNjcm9sbE9yaWdpbnMuc2l6ZSA9PT0gMSkge1xuICAgICAgICBoZWFkZXIuX3Njcm9sbE9yaWdpbkZyb21PYnNlcnZlciA9IHRoaXMuX2hlYWRlclNjcm9sbE9yaWdpbnMudmFsdWVzKCkubmV4dCgpLnZhbHVlID8/IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoZWFkZXIuX3Njcm9sbE9yaWdpbkZyb21PYnNlcnZlciA9XG4gICAgICAgICAgQXJyYXkuZnJvbSh0aGlzLl9oZWFkZXJTY3JvbGxPcmlnaW5zKVxuICAgICAgICAgICAgLnNvcnQoKGMxLCBjMikgPT4gYzEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYzIpICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlOUylcbiAgICAgICAgICAgIC5hdCgtMSkgPz8gbnVsbDtcbiAgICAgIH1cbiAgICAgIGhlYWRlci5fdXBkYXRlU2Nyb2xsTGlzdGVuZXIoKTtcbiAgICB9XG4gIH1cblxuICAvKiogSWYgYGhpZGVPblNjcm9sbGAgaXMgc2V0LCBjaGVja3MgdGhlIGVsZW1lbnQgdG8gaG9vayB0aGUgbGlzdGVuZXIgb24sIGFuZCBwb3NzaWJseSBhZGQgaXQuKi9cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgU2JiSGVhZGVyRWxlbWVudC5faGVhZGVyRWxlbWVudHMuYWRkKHRoaXMpO1xuICAgIGlmICh0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVNjcm9sbExpc3RlbmVyKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlbW92ZXMgdGhlIHNjcm9sbCBsaXN0ZW5lciwgaWYgcHJldmlvdXNseSBhdHRhY2hlZC4gKi9cbiAgcHVibGljIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5fc2Nyb2xsRWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5fc2Nyb2xsRXZlbnRzQ29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICBTYmJIZWFkZXJFbGVtZW50Ll9oZWFkZXJFbGVtZW50cy5kZWxldGUodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgcmVxdWVzdFVwZGF0ZShcbiAgICBuYW1lPzogUHJvcGVydHlLZXksXG4gICAgb2xkVmFsdWU/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBQcm9wZXJ0eURlY2xhcmF0aW9uLFxuICApOiB2b2lkIHtcbiAgICBzdXBlci5yZXF1ZXN0VXBkYXRlKG5hbWUsIG9sZFZhbHVlLCBvcHRpb25zKTtcblxuICAgIGlmICghaXNTZXJ2ZXIgJiYgKCFuYW1lIHx8IG5hbWUgPT09ICdzY3JvbGxPcmlnaW4nKSAmJiB0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVNjcm9sbExpc3RlbmVyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgIHRoaXMuX3VwZGF0ZVNjcm9sbExpc3RlbmVyKCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVTY3JvbGxMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICBjb25zdCBzY3JvbGxFbGVtZW50ID0gdGhpcy5zY3JvbGxPcmlnaW4gPz8gdGhpcy5fc2Nyb2xsT3JpZ2luRnJvbU9ic2VydmVyID8/IGRvY3VtZW50O1xuICAgIGlmIChzY3JvbGxFbGVtZW50ID09PSB0aGlzLl9zY3JvbGxFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fc2Nyb2xsRXZlbnRzQ29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICB0aGlzLl9zY3JvbGxFbGVtZW50ID0gc2Nyb2xsRWxlbWVudDtcbiAgICBpZiAoIXRoaXMuX3Njcm9sbEVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fc2Nyb2xsRXZlbnRzQ29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0aGlzLl9zY3JvbGxGdW5jdGlvbiA9IHRoaXMuX2dldFNjcm9sbEZ1bmN0aW9uLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fc2Nyb2xsRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLl9zY3JvbGxGdW5jdGlvbiwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgIHNpZ25hbDogdGhpcy5fc2Nyb2xsRXZlbnRzQ29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG5cbiAgICBjb25zdCBjdXJyZW50U2Nyb2xsID0gdGhpcy5fZ2V0Q3VycmVudFNjcm9sbFByb3BlcnR5KCdzY3JvbGxUb3AnKTtcbiAgICAvLyBgY3VycmVudFNjcm9sbGAgY2FuIGJlIG5lZ2F0aXZlLCBlLmcuIG9uIG1vYmlsZTsgdGhpcyBpcyBub3QgYWxsb3dlZC5cbiAgICB0aGlzLl9sYXN0U2Nyb2xsID0gY3VycmVudFNjcm9sbCA8PSAwID8gMCA6IGN1cnJlbnRTY3JvbGw7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgY29ycmVjdCBmdW5jdGlvbiB0byBhdHRhY2ggb24gc2Nyb2xsLiAqL1xuICBwcml2YXRlIF9nZXRTY3JvbGxGdW5jdGlvbigpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5oaWRlT25TY3JvbGwgPyB0aGlzLl9zY3JvbGxMaXN0ZW5lcigpIDogdGhpcy5fc2Nyb2xsU2hhZG93TGlzdGVuZXIoKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSByZXF1ZXN0ZWQgcHJvcGVydHkgb2YgdGhlIHNjcm9sbENvbnRleHQuICovXG4gIHByaXZhdGUgX2dldEN1cnJlbnRTY3JvbGxQcm9wZXJ0eShwcm9wZXJ0eTogJ3Njcm9sbFRvcCcgfCAnc2Nyb2xsSGVpZ2h0Jyk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX3Njcm9sbEVsZW1lbnQgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQuZG9jdW1lbnRFbGVtZW50W3Byb3BlcnR5XSB8fCB0aGlzLl9zY3JvbGxFbGVtZW50LmJvZHlbcHJvcGVydHldO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc2Nyb2xsRWxlbWVudD8uW3Byb3BlcnR5XSB8fCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNvcnJlY3QgdmFsdWUgZm9yIGBzY3JvbGxUb3BgLCB0aGVuOlxuICAgKiAtIGFwcGx5IHRoZSBzaGFkb3cgaWYgdGhlIGVsZW1lbnQvZG9jdW1lbnQgaGFzIGJlZW4gc2Nyb2xsZWQgZG93bjtcbiAgICogLSBoaWRlcyB0aGUgaGVhZGVyLCByZW1vdmUgdGhlIHNoYWRvdyBhbmQgcG9zc2libHkgY2xvc2UgYW55IG9wZW4gbWVudSBvbiB0aGUgaGVhZGVyIGlmIGl0IGlzIG5vdCB2aXNpYmxlIGFueW1vcmU7XG4gICAqIC0gc2hvd3MgdGhlIGhlYWRlciBhbmQgcmUtYXBwbHkgdGhlIHNoYWRvdyBpZiB0aGUgZWxlbWVudC9kb2N1bWVudCBoYXMgYmVlbiBzY3JvbGxlZCB1cC5cbiAgICovXG4gIHByaXZhdGUgX3Njcm9sbExpc3RlbmVyKCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRTY3JvbGwgPSB0aGlzLl9nZXRDdXJyZW50U2Nyb2xsUHJvcGVydHkoJ3Njcm9sbFRvcCcpO1xuXG4gICAgLy8gV2hldGhlciB0aGUgc2Nyb2xsIHZpZXcgaXMgYm91bmNpbmcgcGFzdCB0aGUgZWRnZSBvZiBjb250ZW50IGFuZCBiYWNrIGFnYWluLlxuICAgIGlmICh0aGlzLl9nZXRDdXJyZW50U2Nyb2xsUHJvcGVydHkoJ3Njcm9sbEhlaWdodCcpIC0gd2luZG93LmlubmVySGVpZ2h0IC0gY3VycmVudFNjcm9sbCA8PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50b2dnbGVTdGF0ZSgnc2hhZG93JywgY3VycmVudFNjcm9sbCAhPT0gMCk7XG5cbiAgICAvLyBDbG9zZSBvcGVuIG92ZXJsYXlzIHdoZW4gc2Nyb2xsaW5nIGRvd24gaWYgdGhlIGhlYWRlciBpcyBzY3JvbGxlZCBvdXQgb2Ygc2lnaHQuXG4gICAgaWYgKFxuICAgICAgY3VycmVudFNjcm9sbCA+IHRoaXMub2Zmc2V0SGVpZ2h0ICYmXG4gICAgICBjdXJyZW50U2Nyb2xsID4gMCAmJlxuICAgICAgdGhpcy5fbGFzdFNjcm9sbCA8IGN1cnJlbnRTY3JvbGxcbiAgICApIHtcbiAgICAgIHRoaXMuX2Nsb3NlT3Blbk92ZXJsYXlzKCk7XG4gICAgfVxuICAgIC8vIENoZWNrIGlmIHRoZSBoZWFkZXIgaXMgc2Nyb2xsZWQgb3V0IG9mIHNpZ2h0LCBzY3JvbGwgcG9zaXRpb24gPiBoZWFkZXIgaGVpZ2h0ICogMi5cbiAgICBpZiAoY3VycmVudFNjcm9sbCA+IHRoaXMub2Zmc2V0SGVpZ2h0ICogMikge1xuICAgICAgdGhpcy5faGVhZGVyT25Ub3AgPSBmYWxzZTtcbiAgICAgIGlmIChjdXJyZW50U2Nyb2xsID4gMCAmJiB0aGlzLl9sYXN0U2Nyb2xsIDwgY3VycmVudFNjcm9sbCkge1xuICAgICAgICAvLyBTY3JvbGxpbmcgZG93blxuICAgICAgICBbJ3NoYWRvdycsICd2aXNpYmxlJ10uZm9yRWFjaCgobmFtZSkgPT4gdGhpcy5pbnRlcm5hbHMuc3RhdGVzLmRlbGV0ZShuYW1lKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTY3JvbGxpbmcgdXBcbiAgICAgICAgWydmaXhlZCcsICdzaGFkb3cnLCAnYW5pbWF0ZWQnLCAndmlzaWJsZSddLmZvckVhY2goKG5hbWUpID0+XG4gICAgICAgICAgdGhpcy5pbnRlcm5hbHMuc3RhdGVzLmFkZChuYW1lKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2hlY2sgaWYgaGVhZGVyIGluIGl0cyBvcmlnaW5hbCBwb3NpdGlvbiwgc2Nyb2xsIHBvc2l0aW9uIDwgaGVhZGVyIGhlaWdodC5cbiAgICAgIC8vIFJlc2V0IGhlYWRlciBiZWhhdmlvciB3aGVuIHNjcm9sbCBoaXRzIHRvcCBvZiB0aGUgcGFnZSwgb24gc2Nyb2xsIHBvc2l0aW9uID0gMC5cbiAgICAgIGlmIChjdXJyZW50U2Nyb2xsID09PSAwKSB7XG4gICAgICAgIHRoaXMuX2hlYWRlck9uVG9wID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9oZWFkZXJPblRvcCkge1xuICAgICAgICBbJ3NoYWRvdycsICdhbmltYXRlZCcsICdmaXhlZCcsICd2aXNpYmxlJ10uZm9yRWFjaCgobmFtZSkgPT5cbiAgICAgICAgICB0aGlzLmludGVybmFscy5zdGF0ZXMuZGVsZXRlKG5hbWUpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBgY3VycmVudFNjcm9sbGAgY2FuIGJlIG5lZ2F0aXZlLCBlLmcuIG9uIG1vYmlsZTsgdGhpcyBpcyBub3QgYWxsb3dlZC5cbiAgICB0aGlzLl9sYXN0U2Nyb2xsID0gY3VycmVudFNjcm9sbCA8PSAwID8gMCA6IGN1cnJlbnRTY3JvbGw7XG4gIH1cblxuICAvKiogQXBwbHkgdGhlIHNoYWRvdyBpZiB0aGUgZWxlbWVudC9kb2N1bWVudCBoYXMgYmVlbiBzY3JvbGxlZCBkb3duLiAqL1xuICBwcml2YXRlIF9zY3JvbGxTaGFkb3dMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICB0aGlzLnRvZ2dsZVN0YXRlKCdzaGFkb3cnLCB0aGlzLl9nZXRDdXJyZW50U2Nyb2xsUHJvcGVydHkoJ3Njcm9sbFRvcCcpICE9PSAwKTtcbiAgfVxuXG4gIHByaXZhdGUgX2Nsb3NlT3Blbk92ZXJsYXlzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1hdGNoZXMoJzpzdGF0ZShoYXMtdmlzaWJsZS1mb2N1cy13aXRoaW4pJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3ZlcmxheVRyaWdnZXJzOiBIVE1MRWxlbWVudFtdID0gQXJyYXkuZnJvbShcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbChJU19NRU5VX09QRU5FRF9RVUVSWSkgYXMgTm9kZUxpc3RPZjxIVE1MRWxlbWVudD4sXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IG92ZXJsYXlUcmlnZ2VyIG9mIG92ZXJsYXlUcmlnZ2Vycykge1xuICAgICAgY29uc3Qgb3ZlcmxheSA9IG92ZXJsYXlUcmlnZ2VyLmFyaWFDb250cm9sc0VsZW1lbnRzIVswXSBhcyBIVE1MRWxlbWVudCAmIHtcbiAgICAgICAgY2xvc2U6ICgpID0+IHZvaWQ7XG4gICAgICB9O1xuICAgICAgaWYgKHR5cGVvZiBvdmVybGF5Py5jbG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvdmVybGF5LmNsb3NlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlbmRlcigpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8aGVhZGVyIGNsYXNzPVwic2JiLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLWhlYWRlcl9fd3JhcHBlclwiPlxuICAgICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2hlYWRlcj5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICdzYmItaGVhZGVyJzogU2JiSGVhZGVyRWxlbWVudDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQ3FCQSxJQUFNLHVCQUF1Qjs7Ozs7Ozs7SUFTaEIsMEJBQWdCO21CQUFTOzs7Ozs7Ozs7Ozs7Ozs7O2NBQXpCLHlCQUF5QixZQUFVOzs7MkJBbUI3QyxVQUFTLEdBQ1QsU0FBUztJQUFFLFNBQVM7SUFBTSxNQUFNO0dBQU8sQ0FBRSxDQUFDOytCQVExQyxZQUFXLEdBQ1gsU0FBUyxFQUFFLFdBQVcsZ0JBQWUsQ0FBRSxDQUFDOytCQUl4QyxVQUFTLEdBQ1QsU0FBUztJQUFFLFdBQVc7SUFBa0IsU0FBUztJQUFNLE1BQU07R0FBTyxDQUFFLENBQUM7dUJBTXZFLFNBQVMsRUFBRSxTQUFTLEtBQUksQ0FBRSxDQUFDOytCQUUzQixNQUFLLENBQUU7R0FyQlIsYUFBQSxNQUFBLE1BQUEsc0JBQUE7SUFBQSxNQUFBO0lBQUEsTUFBQTtJQUFBLFFBQUE7SUFBQSxTQUFBO0lBQUEsUUFBQTtLQUFBLE1BQUEsUUFBQSxjQUFBO0tBQUEsTUFBQSxRQUFBLElBQWdCO0tBQVEsTUFBQSxLQUFBLFVBQUE7TUFBQSxJQUFSLFdBQVE7S0FBQTtJQUFBO0lBQUEs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
@@ -1,176 +0,0 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { html, nothing, unsafeCSS } from "lit";
3
- import { property, state } from "lit/decorators.js";
4
- import { SbbElement, SbbLanguageController, forceType, forwardEvent, i18nMapContainerButtonLabel, scrollbarStyles } from "./core.js";
5
- import { SbbAccentButtonElement } from "./button.pure.js";
6
- import { IntersectionController } from "@lit-labs/observers/intersection-controller.js";
7
- //#region src/elements/map-container/map-container.scss?inline
8
- var map_container_default = ":host {\n --sbb-map-container-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-4x)\n );\n --_sbb-map-container-map-height: calc(\n var(--sbb-map-container-map-height-zero) + var(--sbb-map-container-border-radius)\n );\n display: grid;\n grid-template-rows: auto auto;\n}\n@media (min-width: calc(37.5rem)) {\n :host {\n --_sbb-map-container-map-height: calc(\n var(--sbb-map-container-map-height-small) + var(--sbb-map-container-border-radius)\n );\n }\n}\n@media (min-width: calc(64rem)) {\n :host {\n grid-template-columns: max(var(--sbb-map-container-sidebar-width)) calc(100% - var(--sbb-map-container-sidebar-width));\n position: fixed;\n inset: var(--sbb-map-container-margin-start, var(--sbb-header-height)) 0 0 0;\n }\n}\n\n.sbb-map-container__sidebar-button {\n position: fixed;\n left: 50%;\n inset-block-end: var(--sbb-spacing-fixed-5x);\n visibility: hidden;\n opacity: 0;\n transform: translateX(-50%) translateY(calc(100% + var(--sbb-spacing-fixed-5x)));\n transition: opacity var(--sbb-map-container-animation-duration) var(--sbb-animation-easing), visibility var(--sbb-map-container-animation-duration) var(--sbb-animation-easing) var(--sbb-map-container-animation-duration), transform var(--sbb-map-container-animation-duration) var(--sbb-animation-easing);\n}\n:host(:is(:state(scroll-up-button-visible),[state--scroll-up-button-visible])) .sbb-map-container__sidebar-button {\n transition: visibility var(--sbb-map-container-animation-duration) var(--sbb-animation-easing), opacity var(--sbb-map-container-animation-duration) var(--sbb-animation-easing), transform var(--sbb-map-container-animation-duration) ease-out;\n visibility: visible;\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n}\n@media (min-width: calc(64rem)) {\n .sbb-map-container__sidebar-button {\n display: none;\n }\n}\n\n.sbb-map-container__sidebar {\n grid-column: 1/3;\n grid-row: 2/3;\n width: 100%;\n overflow: hidden auto;\n position: relative;\n border-start-end-radius: var(--sbb-map-container-border-radius);\n border-start-start-radius: var(--sbb-map-container-border-radius);\n margin-block-start: calc(var(--sbb-map-container-border-radius) * -1);\n background-color: var(--sbb-map-container-sidebar-background-color);\n}\n@media (min-width: calc(64rem)) {\n .sbb-map-container__sidebar {\n grid-column: 1/2;\n grid-row: 1/3;\n border-radius: 0;\n margin-block-start: 0;\n border-block-start: var(--sbb-border-width-1x) solid var(--sbb-border-color-4-inverted);\n }\n}\n\n.sbb-map-container__map {\n position: sticky;\n inset-block-start: 0;\n inset-inline: 0;\n grid-row: 1/2;\n grid-column: 1/3;\n}\n@media (max-width: calc(63.9375rem)) {\n .sbb-map-container__map {\n inset-block-start: var(--sbb-map-container-mobile-sticky-block-start, 0);\n height: var(--_sbb-map-container-map-height);\n }\n}\n@media (min-width: calc(64rem)) {\n .sbb-map-container__map {\n grid-row: 1/3;\n grid-column: 2/3;\n position: relative;\n }\n}";
9
- //#endregion
10
- //#region src/elements/map-container/map-container.component.ts
11
- /**
12
- * It can be used as a container for maps.
13
- *
14
- * @slot - Use the unnamed slot to add content to the sidebar.
15
- * @slot map - Used for slotting the map.
16
- * @cssprop [--sbb-map-container-margin-start=var(--sbb-header-height)] - The component
17
- * comes along with a height calculation that subtracts the height of the header.
18
- * For specific use cases, this variable can be used to modify the preset height.
19
- * @cssprop [--sbb-map-container-sidebar-width=zero-large:400px;ultra:480px] - Can be used
20
- * to modify the width of the left sidebar.
21
- * @cssprop [--sbb-map-container-mobile-sticky-block-start=0] - If e.g. a header with a fixed height
22
- * is placed before the map-container, the map should be sticky respecting
23
- * this offset from the document's top. Only applied on mobile views.
24
- * Most commonly it can be set to `var(--sbb-header-height)`.
25
- */
26
- var SbbMapContainerElement = (() => {
27
- let _classSuper = SbbElement;
28
- let _hideScrollUpButton_decorators;
29
- let _hideScrollUpButton_initializers = [];
30
- let _hideScrollUpButton_extraInitializers = [];
31
- let __scrollUpButtonVisible_decorators;
32
- let __scrollUpButtonVisible_initializers = [];
33
- let __scrollUpButtonVisible_extraInitializers = [];
34
- return class SbbMapContainerElement extends _classSuper {
35
- constructor() {
36
- super(...arguments);
37
- this.#hideScrollUpButton_accessor_storage = __runInitializers(this, _hideScrollUpButton_initializers, false);
38
- this.#_scrollUpButtonVisible_accessor_storage = (__runInitializers(this, _hideScrollUpButton_extraInitializers), __runInitializers(this, __scrollUpButtonVisible_initializers, false));
39
- this._language = (__runInitializers(this, __scrollUpButtonVisible_extraInitializers), new SbbLanguageController(this));
40
- this._observer = new IntersectionController(this, {
41
- target: null,
42
- callback: (entries) => this._toggleButtonVisibilityOnIntersect(entries)
43
- });
44
- }
45
- static {
46
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
47
- _hideScrollUpButton_decorators = [forceType(), property({
48
- attribute: "hide-scroll-up-button",
49
- reflect: true,
50
- type: Boolean
51
- })];
52
- __scrollUpButtonVisible_decorators = [state()];
53
- __esDecorate(this, null, _hideScrollUpButton_decorators, {
54
- kind: "accessor",
55
- name: "hideScrollUpButton",
56
- static: false,
57
- private: false,
58
- access: {
59
- has: (obj) => "hideScrollUpButton" in obj,
60
- get: (obj) => obj.hideScrollUpButton,
61
- set: (obj, value) => {
62
- obj.hideScrollUpButton = value;
63
- }
64
- },
65
- metadata: _metadata
66
- }, _hideScrollUpButton_initializers, _hideScrollUpButton_extraInitializers);
67
- __esDecorate(this, null, __scrollUpButtonVisible_decorators, {
68
- kind: "accessor",
69
- name: "_scrollUpButtonVisible",
70
- static: false,
71
- private: false,
72
- access: {
73
- has: (obj) => "_scrollUpButtonVisible" in obj,
74
- get: (obj) => obj._scrollUpButtonVisible,
75
- set: (obj, value) => {
76
- obj._scrollUpButtonVisible = value;
77
- }
78
- },
79
- metadata: _metadata
80
- }, __scrollUpButtonVisible_initializers, __scrollUpButtonVisible_extraInitializers);
81
- if (_metadata) Object.defineProperty(this, Symbol.metadata, {
82
- enumerable: true,
83
- configurable: true,
84
- writable: true,
85
- value: _metadata
86
- });
87
- }
88
- static {
89
- this.elementName = "sbb-map-container";
90
- }
91
- static {
92
- this.elementDependencies = [SbbAccentButtonElement];
93
- }
94
- static {
95
- this.styles = [scrollbarStyles, unsafeCSS(map_container_default)];
96
- }
97
- #hideScrollUpButton_accessor_storage;
98
- /** Flag to show/hide the scroll up button inside the sidebar on mobile. */
99
- get hideScrollUpButton() {
100
- return this.#hideScrollUpButton_accessor_storage;
101
- }
102
- set hideScrollUpButton(value) {
103
- this.#hideScrollUpButton_accessor_storage = value;
104
- }
105
- #_scrollUpButtonVisible_accessor_storage;
106
- get _scrollUpButtonVisible() {
107
- return this.#_scrollUpButtonVisible_accessor_storage;
108
- }
109
- set _scrollUpButtonVisible(value) {
110
- this.#_scrollUpButtonVisible_accessor_storage = value;
111
- }
112
- willUpdate(changedProperties) {
113
- super.willUpdate(changedProperties);
114
- if (changedProperties.has("hideScrollUpButton")) {
115
- const intersectorElement = this._intersector();
116
- if (!this.hideScrollUpButton && intersectorElement) this._observer.observe(intersectorElement);
117
- else if (intersectorElement) this._observer.unobserve(intersectorElement);
118
- }
119
- }
120
- firstUpdated(changedProperties) {
121
- super.firstUpdated(changedProperties);
122
- if (!this.hideScrollUpButton) this._observer.observe(this._intersector());
123
- }
124
- _intersector() {
125
- return this.shadowRoot?.querySelector("#intersector") ?? null;
126
- }
127
- /**
128
- * Button click callback to trigger the scroll to container top
129
- * @private
130
- */
131
- _onScrollButtonClick() {
132
- this.scrollIntoView({ behavior: "smooth" });
133
- }
134
- /**
135
- * Intersection callback. Toggles the visibility.
136
- * @param entries
137
- * @private
138
- */
139
- _toggleButtonVisibilityOnIntersect(entries) {
140
- entries.forEach((entry) => {
141
- const mapIsHidden = !entry.isIntersecting;
142
- this.toggleState("scroll-up-button-visible", mapIsHidden);
143
- this._scrollUpButtonVisible = mapIsHidden;
144
- });
145
- }
146
- render() {
147
- return html`
148
- <div class="sbb-map-container__map">
149
- <slot name="map"></slot>
150
- </div>
151
- <div
152
- class="sbb-map-container__sidebar sbb-scrollbar-thick-track-visible"
153
- @scroll=${(e) => forwardEvent(e, document)}
154
- >
155
- <span id="intersector"></span>
156
-
157
- <slot></slot>
158
-
159
- ${!this.hideScrollUpButton ? html`<sbb-accent-button
160
- class="sbb-map-container__sidebar-button"
161
- size="l"
162
- icon-name="location-pin-map-small"
163
- @click=${() => this._onScrollButtonClick()}
164
- ?inert=${!this._scrollUpButtonVisible}
165
- >
166
- ${i18nMapContainerButtonLabel[this._language.current]}
167
- </sbb-accent-button>` : nothing}
168
- </div>
169
- `;
170
- }
171
- };
172
- })();
173
- //#endregion
174
- export { SbbMapContainerElement as t };
175
-
176
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLWNvbnRhaW5lci5jb21wb25lbnQtTi1lMm9CbmQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL21hcC1jb250YWluZXIvbWFwLWNvbnRhaW5lci5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9tYXAtY29udGFpbmVyL21hcC1jb250YWluZXIuY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIkB1c2UgJy4uL2NvcmUvc3R5bGVzJyBhcyBzYmI7XG5cbjpob3N0IHtcbiAgLS1zYmItbWFwLWNvbnRhaW5lci1hbmltYXRpb24tZHVyYXRpb246IHZhcihcbiAgICAtLXNiYi1kaXNhYmxlLWFuaW1hdGlvbi1kdXJhdGlvbixcbiAgICB2YXIoLS1zYmItYW5pbWF0aW9uLWR1cmF0aW9uLTR4KVxuICApO1xuICAtLV9zYmItbWFwLWNvbnRhaW5lci1tYXAtaGVpZ2h0OiBjYWxjKFxuICAgIHZhcigtLXNiYi1tYXAtY29udGFpbmVyLW1hcC1oZWlnaHQtemVybykgKyB2YXIoLS1zYmItbWFwLWNvbnRhaW5lci1ib3JkZXItcmFkaXVzKVxuICApO1xuXG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byBhdXRvO1xuXG4gIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogc21hbGwpIHtcbiAgICAtLV9zYmItbWFwLWNvbnRhaW5lci1tYXAtaGVpZ2h0OiBjYWxjKFxuICAgICAgdmFyKC0tc2JiLW1hcC1jb250YWluZXItbWFwLWhlaWdodC1zbWFsbCkgKyB2YXIoLS1zYmItbWFwLWNvbnRhaW5lci1ib3JkZXItcmFkaXVzKVxuICAgICk7XG4gIH1cblxuICBAaW5jbHVkZSBzYmIubXEoJGZyb206IGxhcmdlKSB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtYXgodmFyKC0tc2JiLW1hcC1jb250YWluZXItc2lkZWJhci13aWR0aCkpIGNhbGMoXG4gICAgICAgIDEwMCUgLSB2YXIoLS1zYmItbWFwLWNvbnRhaW5lci1zaWRlYmFyLXdpZHRoKVxuICAgICAgKTtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgaW5zZXQ6IHZhcigtLXNiYi1tYXAtY29udGFpbmVyLW1hcmdpbi1zdGFydCwgdmFyKC0tc2JiLWhlYWRlci1oZWlnaHQpKSAwIDAgMDtcbiAgfVxufVxuXG4uc2JiLW1hcC1jb250YWluZXJfX3NpZGViYXItYnV0dG9uIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBsZWZ0OiA1MCU7XG4gIGluc2V0LWJsb2NrLWVuZDogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtNXgpO1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIG9wYWNpdHk6IDA7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKGNhbGMoMTAwJSArIHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTV4KSkpO1xuXG4gIC8vIEhpZGUgdHJhbnNpdGlvbiwgdmlzaWJpbGl0eSBzaG91bGQgYmUgZGVsYXllZFxuICB0cmFuc2l0aW9uOlxuICAgIG9wYWNpdHkgdmFyKC0tc2JiLW1hcC1jb250YWluZXItYW5pbWF0aW9uLWR1cmF0aW9uKSB2YXIoLS1zYmItYW5pbWF0aW9uLWVhc2luZyksXG4gICAgdmlzaWJpbGl0eSB2YXIoLS1zYmItbWFwLWNvbnRhaW5lci1hbmltYXRpb24tZHVyYXRpb24pIHZhcigtLXNiYi1hbmltYXRpb24tZWFzaW5nKVxuICAgICAgdmFyKC0tc2JiLW1hcC1jb250YWluZXItYW5pbWF0aW9uLWR1cmF0aW9uKSxcbiAgICB0cmFuc2Zvcm0gdmFyKC0tc2JiLW1hcC1jb250YWluZXItYW5pbWF0aW9uLWR1cmF0aW9uKSB2YXIoLS1zYmItYW5pbWF0aW9uLWVhc2luZyk7XG5cbiAgOmhvc3QoOnN0YXRlKHNjcm9sbC11cC1idXR0b24tdmlzaWJsZSkpICYge1xuICAgIC8vIFNob3cgdHJhbnNpdGlvblxuICAgIHRyYW5zaXRpb246XG4gICAgICB2aXNpYmlsaXR5IHZhcigtLXNiYi1tYXAtY29udGFpbmVyLWFuaW1hdGlvbi1kdXJhdGlvbikgdmFyKC0tc2JiLWFuaW1hdGlvbi1lYXNpbmcpLFxuICAgICAgb3BhY2l0eSB2YXIoLS1zYmItbWFwLWNvbnRhaW5lci1hbmltYXRpb24tZHVyYXRpb24pIHZhcigtLXNiYi1hbmltYXRpb24tZWFzaW5nKSxcbiAgICAgIHRyYW5zZm9ybSB2YXIoLS1zYmItbWFwLWNvbnRhaW5lci1hbmltYXRpb24tZHVyYXRpb24pIGVhc2Utb3V0O1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgb3BhY2l0eTogMTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgwKTtcbiAgfVxuXG4gIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogbGFyZ2UpIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG5cbi5zYmItbWFwLWNvbnRhaW5lcl9fc2lkZWJhciB7XG4gIGdyaWQtY29sdW1uOiAxIC8gMztcbiAgZ3JpZC1yb3c6IDIgLyAzO1xuICB3aWR0aDogMTAwJTtcbiAgb3ZlcmZsb3c6IGhpZGRlbiBhdXRvO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiB2YXIoLS1zYmItbWFwLWNvbnRhaW5lci1ib3JkZXItcmFkaXVzKTtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogdmFyKC0tc2JiLW1hcC1jb250YWluZXItYm9yZGVyLXJhZGl1cyk7XG4gIG1hcmdpbi1ibG9jay1zdGFydDogY2FsYyh2YXIoLS1zYmItbWFwLWNvbnRhaW5lci1ib3JkZXItcmFkaXVzKSAqIC0xKTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2JiLW1hcC1jb250YWluZXItc2lkZWJhci1iYWNrZ3JvdW5kLWNvbG9yKTtcblxuICBAaW5jbHVkZSBzYmIubXEoJGZyb206IGxhcmdlKSB7XG4gICAgZ3JpZC1jb2x1bW46IDEgLyAyO1xuICAgIGdyaWQtcm93OiAxIC8gMztcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIG1hcmdpbi1ibG9jay1zdGFydDogMDtcbiAgICBib3JkZXItYmxvY2stc3RhcnQ6IHZhcigtLXNiYi1ib3JkZXItd2lkdGgtMXgpIHNvbGlkIHZhcigtLXNiYi1ib3JkZXItY29sb3ItNC1pbnZlcnRlZCk7XG4gIH1cbn1cblxuLnNiYi1tYXAtY29udGFpbmVyX19tYXAge1xuICBwb3NpdGlvbjogc3RpY2t5O1xuICBpbnNldC1ibG9jay1zdGFydDogMDtcbiAgaW5zZXQtaW5saW5lOiAwO1xuICBncmlkLXJvdzogMSAvIDI7XG4gIGdyaWQtY29sdW1uOiAxIC8gMztcblxuICAvLyBXZSB1c2UgXCJ0bzogbGFyZ2VcIiB0byBhdm9pZCByZXNldHRpbmcgdGhlIHN0eWxlc1xuICBAaW5jbHVkZSBzYmIubXEoJHRvOiBsYXJnZSkge1xuICAgIGluc2V0LWJsb2NrLXN0YXJ0OiB2YXIoLS1zYmItbWFwLWNvbnRhaW5lci1tb2JpbGUtc3RpY2t5LWJsb2NrLXN0YXJ0LCAwKTtcbiAgICBoZWlnaHQ6IHZhcigtLV9zYmItbWFwLWNvbnRhaW5lci1tYXAtaGVpZ2h0KTtcbiAgfVxuXG4gIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogbGFyZ2UpIHtcbiAgICBncmlkLXJvdzogMSAvIDM7XG4gICAgZ3JpZC1jb2x1bW46IDIgLyAzO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW50ZXJzZWN0aW9uQ29udHJvbGxlciB9IGZyb20gJ0BsaXQtbGFicy9vYnNlcnZlcnMvaW50ZXJzZWN0aW9uLWNvbnRyb2xsZXIuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBDU1NSZXN1bHRHcm91cCxcbiAgaHRtbCxcbiAgbm90aGluZyxcbiAgdHlwZSBQcm9wZXJ0eVZhbHVlcyxcbiAgdHlwZSBUZW1wbGF0ZVJlc3VsdCxcbiAgdW5zYWZlQ1NTLFxufSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBTYmJBY2NlbnRCdXR0b25FbGVtZW50IH0gZnJvbSAnLi4vYnV0dG9uLnB1cmUudHMnO1xuaW1wb3J0IHtcbiAgZm9yY2VUeXBlLFxuICBmb3J3YXJkRXZlbnQsXG4gIGkxOG5NYXBDb250YWluZXJCdXR0b25MYWJlbCxcbiAgU2JiRWxlbWVudCxcbiAgdHlwZSBTYmJFbGVtZW50VHlwZSxcbiAgU2JiTGFuZ3VhZ2VDb250cm9sbGVyLFxuICBzY3JvbGxiYXJTdHlsZXMsXG59IGZyb20gJy4uL2NvcmUudHMnO1xuXG5pbXBvcnQgc3R5bGUgZnJvbSAnLi9tYXAtY29udGFpbmVyLnNjc3M/aW5saW5lJztcblxuLyoqXG4gKiBJdCBjYW4gYmUgdXNlZCBhcyBhIGNvbnRhaW5lciBmb3IgbWFwcy5cbiAqXG4gKiBAc2xvdCAtIFVzZSB0aGUgdW5uYW1lZCBzbG90IHRvIGFkZCBjb250ZW50IHRvIHRoZSBzaWRlYmFyLlxuICogQHNsb3QgbWFwIC0gVXNlZCBmb3Igc2xvdHRpbmcgdGhlIG1hcC5cbiAqIEBjc3Nwcm9wIFstLXNiYi1tYXAtY29udGFpbmVyLW1hcmdpbi1zdGFydD12YXIoLS1zYmItaGVhZGVyLWhlaWdodCldIC0gVGhlIGNvbXBvbmVudFxuICogY29tZXMgYWxvbmcgd2l0aCBhIGhlaWdodCBjYWxjdWxhdGlvbiB0aGF0IHN1YnRyYWN0cyB0aGUgaGVpZ2h0IG9mIHRoZSBoZWFkZXIuXG4gKiBGb3Igc3BlY2lmaWMgdXNlIGNhc2VzLCB0aGlzIHZhcmlhYmxlIGNhbiBiZSB1c2VkIHRvIG1vZGlmeSB0aGUgcHJlc2V0IGhlaWdodC5cbiAqIEBjc3Nwcm9wIFstLXNiYi1tYXAtY29udGFpbmVyLXNpZGViYXItd2lkdGg9emVyby1sYXJnZTo0MDBweDt1bHRyYTo0ODBweF0gLSBDYW4gYmUgdXNlZFxuICogdG8gbW9kaWZ5IHRoZSB3aWR0aCBvZiB0aGUgbGVmdCBzaWRlYmFyLlxuICogQGNzc3Byb3AgWy0tc2JiLW1hcC1jb250YWluZXItbW9iaWxlLXN0aWNreS1ibG9jay1zdGFydD0wXSAtIElmIGUuZy4gYSBoZWFkZXIgd2l0aCBhIGZpeGVkIGhlaWdodFxuICogaXMgcGxhY2VkIGJlZm9yZSB0aGUgbWFwLWNvbnRhaW5lciwgdGhlIG1hcCBzaG91bGQgYmUgc3RpY2t5IHJlc3BlY3RpbmdcbiAqIHRoaXMgb2Zmc2V0IGZyb20gdGhlIGRvY3VtZW50J3MgdG9wLiBPbmx5IGFwcGxpZWQgb24gbW9iaWxlIHZpZXdzLlxuICogTW9zdCBjb21tb25seSBpdCBjYW4gYmUgc2V0IHRvIGB2YXIoLS1zYmItaGVhZGVyLWhlaWdodClgLlxuICovXG5leHBvcnQgY2xhc3MgU2JiTWFwQ29udGFpbmVyRWxlbWVudCBleHRlbmRzIFNiYkVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IGVsZW1lbnROYW1lOiBzdHJpbmcgPSAnc2JiLW1hcC1jb250YWluZXInO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGVsZW1lbnREZXBlbmRlbmNpZXM6IFNiYkVsZW1lbnRUeXBlW10gPSBbU2JiQWNjZW50QnV0dG9uRWxlbWVudF07XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IFtzY3JvbGxiYXJTdHlsZXMsIHVuc2FmZUNTUyhzdHlsZSldO1xuXG4gIC8qKiBGbGFnIHRvIHNob3cvaGlkZSB0aGUgc2Nyb2xsIHVwIGJ1dHRvbiBpbnNpZGUgdGhlIHNpZGViYXIgb24gbW9iaWxlLiAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnaGlkZS1zY3JvbGwtdXAtYnV0dG9uJywgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgaGlkZVNjcm9sbFVwQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQHN0YXRlKCkgcHJpdmF0ZSBhY2Nlc3NvciBfc2Nyb2xsVXBCdXR0b25WaXNpYmxlID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfbGFuZ3VhZ2UgPSBuZXcgU2JiTGFuZ3VhZ2VDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9vYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25Db250cm9sbGVyKHRoaXMsIHtcbiAgICB0YXJnZXQ6IG51bGwsXG4gICAgY2FsbGJhY2s6IChlbnRyaWVzKSA9PiB0aGlzLl90b2dnbGVCdXR0b25WaXNpYmlsaXR5T25JbnRlcnNlY3QoZW50cmllcyksXG4gIH0pO1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnaGlkZVNjcm9sbFVwQnV0dG9uJykpIHtcbiAgICAgIGNvbnN0IGludGVyc2VjdG9yRWxlbWVudCA9IHRoaXMuX2ludGVyc2VjdG9yKCk7XG5cbiAgICAgIGlmICghdGhpcy5oaWRlU2Nyb2xsVXBCdXR0b24gJiYgaW50ZXJzZWN0b3JFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuX29ic2VydmVyLm9ic2VydmUoaW50ZXJzZWN0b3JFbGVtZW50KTtcbiAgICAgIH0gZWxzZSBpZiAoaW50ZXJzZWN0b3JFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuX29ic2VydmVyLnVub2JzZXJ2ZShpbnRlcnNlY3RvckVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICBpZiAoIXRoaXMuaGlkZVNjcm9sbFVwQnV0dG9uKSB7XG4gICAgICB0aGlzLl9vYnNlcnZlci5vYnNlcnZlKHRoaXMuX2ludGVyc2VjdG9yKCkhKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pbnRlcnNlY3RvcigpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoJyNpbnRlcnNlY3RvcicpID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQnV0dG9uIGNsaWNrIGNhbGxiYWNrIHRvIHRyaWdnZXIgdGhlIHNjcm9sbCB0byBjb250YWluZXIgdG9wXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9vblNjcm9sbEJ1dHRvbkNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJzZWN0aW9uIGNhbGxiYWNrLiBUb2dnbGVzIHRoZSB2aXNpYmlsaXR5LlxuICAgKiBAcGFyYW0gZW50cmllc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfdG9nZ2xlQnV0dG9uVmlzaWJpbGl0eU9uSW50ZXJzZWN0KGVudHJpZXM6IEludGVyc2VjdGlvbk9ic2VydmVyRW50cnlbXSk6IHZvaWQge1xuICAgIGVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IG1hcElzSGlkZGVuID0gIWVudHJ5LmlzSW50ZXJzZWN0aW5nO1xuICAgICAgdGhpcy50b2dnbGVTdGF0ZSgnc2Nyb2xsLXVwLWJ1dHRvbi12aXNpYmxlJywgbWFwSXNIaWRkZW4pO1xuICAgICAgdGhpcy5fc2Nyb2xsVXBCdXR0b25WaXNpYmxlID0gbWFwSXNIaWRkZW47XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItbWFwLWNvbnRhaW5lcl9fbWFwXCI+XG4gICAgICAgIDxzbG90IG5hbWU9XCJtYXBcIj48L3Nsb3Q+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJzYmItbWFwLWNvbnRhaW5lcl9fc2lkZWJhciBzYmItc2Nyb2xsYmFyLXRoaWNrLXRyYWNrLXZpc2libGVcIlxuICAgICAgICBAc2Nyb2xsPSR7KGU6IEV2ZW50KSA9PiBmb3J3YXJkRXZlbnQoZSwgZG9jdW1lbnQpfVxuICAgICAgPlxuICAgICAgICA8c3BhbiBpZD1cImludGVyc2VjdG9yXCI+PC9zcGFuPlxuXG4gICAgICAgIDxzbG90Pjwvc2xvdD5cblxuICAgICAgICAkeyF0aGlzLmhpZGVTY3JvbGxVcEJ1dHRvblxuICAgICAgICAgID8gaHRtbGA8c2JiLWFjY2VudC1idXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJzYmItbWFwLWNvbnRhaW5lcl9fc2lkZWJhci1idXR0b25cIlxuICAgICAgICAgICAgICBzaXplPVwibFwiXG4gICAgICAgICAgICAgIGljb24tbmFtZT1cImxvY2F0aW9uLXBpbi1tYXAtc21hbGxcIlxuICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLl9vblNjcm9sbEJ1dHRvbkNsaWNrKCl9XG4gICAgICAgICAgICAgID9pbmVydD0keyF0aGlzLl9zY3JvbGxVcEJ1dHRvblZpc2libGV9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICR7aTE4bk1hcENvbnRhaW5lckJ1dHRvbkxhYmVsW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfVxuICAgICAgICAgICAgPC9zYmItYWNjZW50LWJ1dHRvbj5gXG4gICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLW1hcC1jb250YWluZXInOiBTYmJN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