@sbb-esta/lyne-elements-experimental-dev 5.0.2-dev.1781535671 → 5.0.2-dev.1781537204

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.
@@ -0,0 +1,740 @@
1
+ import { t as format } from "./format-Cx3zmmaF.js";
2
+ import { SbbElement, SbbLanguageController, defaultDateAdapter, forceType, i18nArrival, i18nClass, i18nDeparture, i18nDirection, i18nFromPlatform, i18nMeansOfTransport, i18nNew, i18nOccupancy, i18nRealTimeInfo, i18nSupersaver, i18nTransferProcedure, i18nTransferProcedures, i18nTravelhints, i18nTripDuration, i18nTripQuayChange, listResetStyles, screenReaderOnlyStyles } from "@sbb-esta/lyne-elements/core.js";
3
+ import { SbbIconElement } from "@sbb-esta/lyne-elements/icon.pure.js";
4
+ import { html, nothing, unsafeCSS } from "lit";
5
+ import { __esDecorate, __runInitializers } from "tslib";
6
+ import { property } from "lit/decorators.js";
7
+ import { durationToTime, getDepartureArrivalTimeAttribute, isRideLeg, removeTimezoneFromISOTimeString } from "./core.js";
8
+ import { SbbPearlChainTimeElement } from "./pearl-chain-time.pure.js";
9
+ import { SbbCardBadgeElement, SbbCardButtonElement, SbbCardElement } from "@sbb-esta/lyne-elements/card.pure.js";
10
+ import { SbbTimetableOccupancyElement } from "@sbb-esta/lyne-elements/timetable-occupancy.pure.js";
11
+ //#region src/elements-experimental/timetable-row/timetable-row.scss?inline
12
+ var timetable_row_default = ":host {\n --sbb-timetable-row-gap: var(--sbb-spacing-fixed-2x);\n --sbb-timetable-row-height: 1.5625rem;\n --sbb-timetable-row-height-header: 1.25rem;\n --sbb-timetable-row-height-footer: 1rem;\n --sbb-timetable-row-skeleton-pulse-duration: 1800ms;\n display: block;\n}\n\n:host([disable-animation]) {\n --sbb-timetable-row-skeleton-pulse-duration: 0;\n}\n\n.sbb-timetable__row-transport-icon {\n --sbb-icon-svg-width: 1.25rem;\n --sbb-icon-svg-height: 1.25rem;\n}\n\n.sbb-travel-hints__item {\n --sbb-icon-svg-height: 0.875rem;\n}\n\n.sbb-timetable__row--quay {\n margin-inline-end: var(--sbb-spacing-fixed-1x);\n}\n\n.sbb-timetable__row--quay-type {\n float: left;\n}\n\nul {\n display: inline-flex;\n}\n\nli {\n display: inline-flex;\n align-self: center;\n}\n\n.sbb-timetable__row-transport {\n display: inline-flex;\n align-self: center;\n}\n\n.sbb-timetable__row-transportnumber,\n.sbb-timetable__row-time {\n --sbb-text-font-size: var(--sbb-text-font-size-s);\n font-family: var(--sbb-typo-font-family);\n font-weight: normal;\n line-height: var(--sbb-typo-line-height-text);\n letter-spacing: var(--sbb-typo-letter-spacing-text);\n font-size: var(--sbb-text-font-size);\n font-weight: bold;\n line-height: unset;\n white-space: nowrap;\n align-self: center;\n}\n\n.sbb-timetable__row {\n --sbb-text-font-size: var(--sbb-text-font-size-s);\n font-family: var(--sbb-typo-font-family);\n font-weight: normal;\n line-height: var(--sbb-typo-line-height-text);\n letter-spacing: var(--sbb-typo-letter-spacing-text);\n font-size: var(--sbb-text-font-size);\n display: flex;\n flex-direction: column;\n gap: var(--sbb-timetable-row-gap);\n}\n\n.sbb-timetable__row-header,\n.sbb-timetable__row-footer {\n animation: none;\n}\n\n.sbb-timetable__row-card {\n --sbb-card-padding-block: var(--sbb-card-with-badge-padding-block);\n}\n\n.sbb-timetable__row-header {\n display: flex;\n gap: var(--sbb-spacing-fixed-2x);\n align-items: center;\n line-height: var(--sbb-timetable-row-height-header);\n}\n\n.sbb-timetable__row-details,\n.sbb-timetable__row-hints {\n display: inline-flex;\n gap: var(--sbb-spacing-fixed-1x);\n align-items: center;\n}\n\n.sbb-timetable__row-header p {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n margin: 0;\n align-self: center;\n}\n\n.sbb-timetable__row-footer {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: center;\n gap: var(--sbb-spacing-fixed-2x);\n line-height: var(--sbb-timetable-row-height-footer);\n}\n.sbb-timetable__row-footer > span {\n align-self: center;\n}\n.sbb-timetable__row-footer :only-child {\n margin-inline-start: auto;\n}\n\n.sbb-timetable__row-quay--changed {\n color: var(--sbb-color-primary);\n}\n\n.sbb-timetable__row-transport-wrapper,\n.sbb-timetable__row-warning {\n display: inline-flex;\n}\n\n.sbb-loading {\n pointer-events: none;\n}\n\n.sbb-loading__wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--sbb-spacing-fixed-2x);\n}\n\n.sbb-loading__row {\n width: 100%;\n border-radius: var(--sbb-border-radius-1x);\n height: var(--sbb-timetable-row-height);\n}\n@media (min-width: calc(64rem)) {\n .sbb-loading__row {\n height: 1.75rem;\n }\n}\n@media (forced-colors: active) {\n .sbb-loading__row {\n border: var(--sbb-border-width-1x) solid ButtonBorder !important;\n }\n}\n\n.sbb-loading__row,\n.sbb-loading__badge {\n background: var(--sbb-background-color-4);\n animation: skeleton-pulse var(--sbb-timetable-row-skeleton-pulse-duration) ease-out infinite;\n}\n\n.sbb-loading__row:first-of-type {\n height: var(--sbb-timetable-row-height-header);\n width: 50%;\n}\n\n.sbb-loading__row:last-of-type {\n height: var(--sbb-timetable-row-height-footer);\n}\n\n.sbb-loading__badge {\n margin-inline: auto calc(var(--sbb-spacing-fixed-3x) * -1);\n padding-inline-end: var(--sbb-spacing-fixed-6x);\n border-end-start-radius: var(--sbb-card-badge-border-radius);\n transform: var(--sbb-card-badge-skew);\n width: 7.1875rem;\n height: 1.25rem;\n}\n\n@keyframes skeleton-pulse {\n 0% {\n background: var(--sbb-background-color-4);\n }\n 17% {\n background: var(--sbb-background-color-4);\n }\n 50% {\n background: var(--sbb-background-color-3);\n }\n 67% {\n background: var(--sbb-background-color-3);\n }\n 100% {\n background: var(--sbb-background-color-4);\n }\n}";
13
+ //#endregion
14
+ //#region src/elements-experimental/timetable-row/timetable-row.component.ts
15
+ var renderIconProduct = (icon, name) => {
16
+ return html`<span class="sbb-timetable__row-transport">
17
+ <sbb-icon name=${icon}></sbb-icon>
18
+ <span class="sbb-screen-reader-only">${name}</span>
19
+ </span>`;
20
+ };
21
+ var renderStringProduct = (vehicleName, line) => {
22
+ const space = [
23
+ "M",
24
+ "B",
25
+ "T"
26
+ ].includes(vehicleName) ? " " : "";
27
+ return html`<span class="sbb-timetable__row-transportnumber">
28
+ ${line !== null ? vehicleName + space + line : vehicleName}
29
+ </span>`;
30
+ };
31
+ var getReachableText = (legs) => {
32
+ return legs?.find((leg) => leg.serviceJourney?.serviceAlteration?.reachableText)?.serviceJourney?.serviceAlteration?.reachableText;
33
+ };
34
+ var getDelayText = (legs) => {
35
+ return legs?.find((leg) => leg.serviceJourney?.serviceAlteration?.delayText)?.serviceJourney?.serviceAlteration?.delayText;
36
+ };
37
+ var getRedirectedText = (legs) => {
38
+ return legs?.find((leg) => !!leg.serviceJourney?.serviceAlteration?.redirectedText)?.serviceJourney?.serviceAlteration?.redirectedText;
39
+ };
40
+ var getUnplannedStop = (legs) => {
41
+ return legs?.find((leg) => !!leg.serviceJourney?.serviceAlteration?.unplannedStopPointsText)?.serviceJourney?.serviceAlteration?.unplannedStopPointsText;
42
+ };
43
+ var sortSituation = (situations) => {
44
+ const priorities = {
45
+ DISTURBANCE: 0,
46
+ INFORMATION: 1,
47
+ DELAY: 2,
48
+ TRAIN_REPLACEMENT_BY_BUS: 3,
49
+ CONSTRUCTION_SITE: 4,
50
+ END_MESSAGE: 5
51
+ };
52
+ return [...situations].sort((a, b) => priorities[a.cause] - priorities[b.cause]);
53
+ };
54
+ var getHimIcon = (situation) => {
55
+ switch (situation?.cause) {
56
+ case "DISTURBANCE": return {
57
+ name: "disruption",
58
+ text: situation?.broadcastMessages?.length ? situation?.broadcastMessages[0].title : ""
59
+ };
60
+ case "INFORMATION": return {
61
+ name: "info",
62
+ text: situation?.broadcastMessages.length ? situation?.broadcastMessages[0].title : ""
63
+ };
64
+ case "DELAY": return {
65
+ name: "delay",
66
+ text: situation?.broadcastMessages.length ? situation?.broadcastMessages[0].title : ""
67
+ };
68
+ case "TRAIN_REPLACEMENT_BY_BUS": return {
69
+ name: "replacementbus",
70
+ text: situation?.broadcastMessages.length ? situation?.broadcastMessages[0].title : ""
71
+ };
72
+ case "CONSTRUCTION_SITE": return {
73
+ name: "construction",
74
+ text: situation?.broadcastMessages.length ? situation?.broadcastMessages[0].title : ""
75
+ };
76
+ default: return {
77
+ name: "info",
78
+ text: situation?.broadcastMessages.length ? situation?.broadcastMessages[0].title : ""
79
+ };
80
+ }
81
+ };
82
+ var getCus = (trip, currentLanguage) => {
83
+ const { summary, legs } = trip || {};
84
+ const rideLegs = legs?.filter((leg) => isRideLeg(leg));
85
+ const { tripStatus } = summary || {};
86
+ if (tripStatus?.cancelled || tripStatus?.partiallyCancelled) return {
87
+ name: "cancellation",
88
+ text: tripStatus?.cancelledText
89
+ };
90
+ if (rideLegs?.some((leg) => leg.serviceJourney?.serviceAlteration?.cancelledExpected)) return {
91
+ name: "disruption",
92
+ text: tripStatus?.cancelledText
93
+ };
94
+ if (getReachableText(rideLegs)) return {
95
+ name: "missed-connection",
96
+ text: getReachableText(rideLegs)
97
+ };
98
+ if (tripStatus?.alternative) return {
99
+ name: "alternative",
100
+ text: tripStatus.alternativeText
101
+ };
102
+ if (getRedirectedText(rideLegs)) return {
103
+ name: "reroute",
104
+ text: getRedirectedText(rideLegs)
105
+ };
106
+ if (getUnplannedStop(rideLegs)) return {
107
+ name: "add-stop",
108
+ text: getUnplannedStop(rideLegs)
109
+ };
110
+ if (tripStatus?.delayed || tripStatus?.delayedUnknown) return {
111
+ name: "delay",
112
+ text: getDelayText(rideLegs)
113
+ };
114
+ if (tripStatus?.quayChanged) {
115
+ const departure = rideLegs[0].departure;
116
+ return {
117
+ name: "platform-change",
118
+ text: departure.quayChanged ? departure.quayChangedText : i18nTripQuayChange[currentLanguage]
119
+ };
120
+ }
121
+ return {};
122
+ };
123
+ var findAndReplaceNotice = (notices) => {
124
+ const reservationNotice = [
125
+ "RR",
126
+ "RK",
127
+ "RC",
128
+ "RL",
129
+ "RM",
130
+ "RS",
131
+ "RU",
132
+ "XP",
133
+ "XR",
134
+ "XT"
135
+ ];
136
+ return notices.reduce((foundNotice, notice) => {
137
+ if (foundNotice) return foundNotice;
138
+ if (reservationNotice.includes(notice.name)) return {
139
+ ...notice,
140
+ name: "RR"
141
+ };
142
+ }, void 0);
143
+ };
144
+ var filterNotices = (notices) => {
145
+ const allowedNames = [
146
+ "Z",
147
+ "SB",
148
+ "SZ",
149
+ "VR",
150
+ "TG"
151
+ ];
152
+ return notices.filter((notice, index) => {
153
+ return notices.findIndex((n) => n.name === notice.name) === index;
154
+ }).filter((notice) => allowedNames.includes(notice.name)).sort((a, b) => allowedNames.indexOf(a.name) - allowedNames.indexOf(b.name));
155
+ };
156
+ var handleNotices = (notices) => {
157
+ const reservationNotice = findAndReplaceNotice(notices);
158
+ const filteredNotices = filterNotices(notices);
159
+ if (reservationNotice === void 0) return filteredNotices;
160
+ if (!filteredNotices.length) return [reservationNotice];
161
+ if (filteredNotices[0].name === "Z" && filteredNotices[1]) return [
162
+ filteredNotices[0],
163
+ reservationNotice,
164
+ filteredNotices[1]
165
+ ].concat(filteredNotices.slice(2));
166
+ return [reservationNotice, ...filteredNotices];
167
+ };
168
+ /**
169
+ * It displays information about the trip, acting as a container for all the `sbb-timetable-*` components.
170
+ * */
171
+ var SbbTimetableRowElement = (() => {
172
+ let _classSuper = SbbElement;
173
+ let _instanceExtraInitializers = [];
174
+ let _trip_decorators;
175
+ let _trip_initializers = [];
176
+ let _trip_extraInitializers = [];
177
+ let _price_decorators;
178
+ let _price_initializers = [];
179
+ let _price_extraInitializers = [];
180
+ let _disableAnimation_decorators;
181
+ let _disableAnimation_initializers = [];
182
+ let _disableAnimation_extraInitializers = [];
183
+ let _boarding_decorators;
184
+ let _boarding_initializers = [];
185
+ let _boarding_extraInitializers = [];
186
+ let _loadingTrip_decorators;
187
+ let _loadingTrip_initializers = [];
188
+ let _loadingTrip_extraInitializers = [];
189
+ let _a11yFootpath_decorators;
190
+ let _a11yFootpath_initializers = [];
191
+ let _a11yFootpath_extraInitializers = [];
192
+ let _loadingPrice_decorators;
193
+ let _loadingPrice_initializers = [];
194
+ let _loadingPrice_extraInitializers = [];
195
+ let _cardActionLabel_decorators;
196
+ let _cardActionLabel_initializers = [];
197
+ let _cardActionLabel_extraInitializers = [];
198
+ let _accessibilityExpanded_decorators;
199
+ let _accessibilityExpanded_initializers = [];
200
+ let _accessibilityExpanded_extraInitializers = [];
201
+ let _active_decorators;
202
+ let _active_initializers = [];
203
+ let _active_extraInitializers = [];
204
+ let _set_now_decorators;
205
+ return class SbbTimetableRowElement extends _classSuper {
206
+ constructor() {
207
+ super(...arguments);
208
+ this.#trip_accessor_storage = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _trip_initializers, null));
209
+ this.#price_accessor_storage = (__runInitializers(this, _trip_extraInitializers), __runInitializers(this, _price_initializers, null));
210
+ this.#disableAnimation_accessor_storage = (__runInitializers(this, _price_extraInitializers), __runInitializers(this, _disableAnimation_initializers, false));
211
+ this.#boarding_accessor_storage = (__runInitializers(this, _disableAnimation_extraInitializers), __runInitializers(this, _boarding_initializers, null));
212
+ this.#loadingTrip_accessor_storage = (__runInitializers(this, _boarding_extraInitializers), __runInitializers(this, _loadingTrip_initializers, false));
213
+ this.#a11yFootpath_accessor_storage = (__runInitializers(this, _loadingTrip_extraInitializers), __runInitializers(this, _a11yFootpath_initializers, false));
214
+ this.#loadingPrice_accessor_storage = (__runInitializers(this, _a11yFootpath_extraInitializers), __runInitializers(this, _loadingPrice_initializers, false));
215
+ this.#cardActionLabel_accessor_storage = (__runInitializers(this, _loadingPrice_extraInitializers), __runInitializers(this, _cardActionLabel_initializers, ""));
216
+ this.#accessibilityExpanded_accessor_storage = (__runInitializers(this, _cardActionLabel_extraInitializers), __runInitializers(this, _accessibilityExpanded_initializers, false));
217
+ this.#active_accessor_storage = (__runInitializers(this, _accessibilityExpanded_extraInitializers), __runInitializers(this, _active_initializers, false));
218
+ this._now = (__runInitializers(this, _active_extraInitializers), null);
219
+ this._language = new SbbLanguageController(this);
220
+ }
221
+ static {
222
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
223
+ _trip_decorators = [property({ type: Object })];
224
+ _price_decorators = [property({ type: Object })];
225
+ _disableAnimation_decorators = [forceType(), property({
226
+ attribute: "disable-animation",
227
+ reflect: true,
228
+ type: Boolean
229
+ })];
230
+ _boarding_decorators = [property({ type: Object })];
231
+ _loadingTrip_decorators = [forceType(), property({
232
+ attribute: "loading-trip",
233
+ type: Boolean
234
+ })];
235
+ _a11yFootpath_decorators = [forceType(), property({
236
+ attribute: "a11y-footpath",
237
+ type: Boolean
238
+ })];
239
+ _loadingPrice_decorators = [forceType(), property({
240
+ attribute: "loading-price",
241
+ type: Boolean
242
+ })];
243
+ _cardActionLabel_decorators = [forceType(), property({ attribute: "card-action-label" })];
244
+ _accessibilityExpanded_decorators = [forceType(), property({
245
+ attribute: "accessibility-expanded",
246
+ type: Boolean
247
+ })];
248
+ _active_decorators = [forceType(), property({ type: Boolean })];
249
+ _set_now_decorators = [property()];
250
+ __esDecorate(this, null, _trip_decorators, {
251
+ kind: "accessor",
252
+ name: "trip",
253
+ static: false,
254
+ private: false,
255
+ access: {
256
+ has: (obj) => "trip" in obj,
257
+ get: (obj) => obj.trip,
258
+ set: (obj, value) => {
259
+ obj.trip = value;
260
+ }
261
+ },
262
+ metadata: _metadata
263
+ }, _trip_initializers, _trip_extraInitializers);
264
+ __esDecorate(this, null, _price_decorators, {
265
+ kind: "accessor",
266
+ name: "price",
267
+ static: false,
268
+ private: false,
269
+ access: {
270
+ has: (obj) => "price" in obj,
271
+ get: (obj) => obj.price,
272
+ set: (obj, value) => {
273
+ obj.price = value;
274
+ }
275
+ },
276
+ metadata: _metadata
277
+ }, _price_initializers, _price_extraInitializers);
278
+ __esDecorate(this, null, _disableAnimation_decorators, {
279
+ kind: "accessor",
280
+ name: "disableAnimation",
281
+ static: false,
282
+ private: false,
283
+ access: {
284
+ has: (obj) => "disableAnimation" in obj,
285
+ get: (obj) => obj.disableAnimation,
286
+ set: (obj, value) => {
287
+ obj.disableAnimation = value;
288
+ }
289
+ },
290
+ metadata: _metadata
291
+ }, _disableAnimation_initializers, _disableAnimation_extraInitializers);
292
+ __esDecorate(this, null, _boarding_decorators, {
293
+ kind: "accessor",
294
+ name: "boarding",
295
+ static: false,
296
+ private: false,
297
+ access: {
298
+ has: (obj) => "boarding" in obj,
299
+ get: (obj) => obj.boarding,
300
+ set: (obj, value) => {
301
+ obj.boarding = value;
302
+ }
303
+ },
304
+ metadata: _metadata
305
+ }, _boarding_initializers, _boarding_extraInitializers);
306
+ __esDecorate(this, null, _loadingTrip_decorators, {
307
+ kind: "accessor",
308
+ name: "loadingTrip",
309
+ static: false,
310
+ private: false,
311
+ access: {
312
+ has: (obj) => "loadingTrip" in obj,
313
+ get: (obj) => obj.loadingTrip,
314
+ set: (obj, value) => {
315
+ obj.loadingTrip = value;
316
+ }
317
+ },
318
+ metadata: _metadata
319
+ }, _loadingTrip_initializers, _loadingTrip_extraInitializers);
320
+ __esDecorate(this, null, _a11yFootpath_decorators, {
321
+ kind: "accessor",
322
+ name: "a11yFootpath",
323
+ static: false,
324
+ private: false,
325
+ access: {
326
+ has: (obj) => "a11yFootpath" in obj,
327
+ get: (obj) => obj.a11yFootpath,
328
+ set: (obj, value) => {
329
+ obj.a11yFootpath = value;
330
+ }
331
+ },
332
+ metadata: _metadata
333
+ }, _a11yFootpath_initializers, _a11yFootpath_extraInitializers);
334
+ __esDecorate(this, null, _loadingPrice_decorators, {
335
+ kind: "accessor",
336
+ name: "loadingPrice",
337
+ static: false,
338
+ private: false,
339
+ access: {
340
+ has: (obj) => "loadingPrice" in obj,
341
+ get: (obj) => obj.loadingPrice,
342
+ set: (obj, value) => {
343
+ obj.loadingPrice = value;
344
+ }
345
+ },
346
+ metadata: _metadata
347
+ }, _loadingPrice_initializers, _loadingPrice_extraInitializers);
348
+ __esDecorate(this, null, _cardActionLabel_decorators, {
349
+ kind: "accessor",
350
+ name: "cardActionLabel",
351
+ static: false,
352
+ private: false,
353
+ access: {
354
+ has: (obj) => "cardActionLabel" in obj,
355
+ get: (obj) => obj.cardActionLabel,
356
+ set: (obj, value) => {
357
+ obj.cardActionLabel = value;
358
+ }
359
+ },
360
+ metadata: _metadata
361
+ }, _cardActionLabel_initializers, _cardActionLabel_extraInitializers);
362
+ __esDecorate(this, null, _accessibilityExpanded_decorators, {
363
+ kind: "accessor",
364
+ name: "accessibilityExpanded",
365
+ static: false,
366
+ private: false,
367
+ access: {
368
+ has: (obj) => "accessibilityExpanded" in obj,
369
+ get: (obj) => obj.accessibilityExpanded,
370
+ set: (obj, value) => {
371
+ obj.accessibilityExpanded = value;
372
+ }
373
+ },
374
+ metadata: _metadata
375
+ }, _accessibilityExpanded_initializers, _accessibilityExpanded_extraInitializers);
376
+ __esDecorate(this, null, _active_decorators, {
377
+ kind: "accessor",
378
+ name: "active",
379
+ static: false,
380
+ private: false,
381
+ access: {
382
+ has: (obj) => "active" in obj,
383
+ get: (obj) => obj.active,
384
+ set: (obj, value) => {
385
+ obj.active = value;
386
+ }
387
+ },
388
+ metadata: _metadata
389
+ }, _active_initializers, _active_extraInitializers);
390
+ __esDecorate(this, null, _set_now_decorators, {
391
+ kind: "setter",
392
+ name: "now",
393
+ static: false,
394
+ private: false,
395
+ access: {
396
+ has: (obj) => "now" in obj,
397
+ set: (obj, value) => {
398
+ obj.now = value;
399
+ }
400
+ },
401
+ metadata: _metadata
402
+ }, null, _instanceExtraInitializers);
403
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, {
404
+ enumerable: true,
405
+ configurable: true,
406
+ writable: true,
407
+ value: _metadata
408
+ });
409
+ }
410
+ static {
411
+ this.elementName = "sbb-timetable-row";
412
+ }
413
+ static {
414
+ this.elementDependencies = [
415
+ SbbCardElement,
416
+ SbbCardBadgeElement,
417
+ SbbCardButtonElement,
418
+ SbbIconElement,
419
+ SbbTimetableOccupancyElement,
420
+ SbbPearlChainTimeElement
421
+ ];
422
+ }
423
+ static {
424
+ this.styles = [
425
+ listResetStyles,
426
+ screenReaderOnlyStyles,
427
+ unsafeCSS(timetable_row_default)
428
+ ];
429
+ }
430
+ #trip_accessor_storage;
431
+ /** The trip Prop. */
432
+ get trip() {
433
+ return this.#trip_accessor_storage;
434
+ }
435
+ set trip(value) {
436
+ this.#trip_accessor_storage = value;
437
+ }
438
+ #price_accessor_storage;
439
+ /** The price Prop, which consists of the data for the badge. */
440
+ get price() {
441
+ return this.#price_accessor_storage;
442
+ }
443
+ set price(value) {
444
+ this.#price_accessor_storage = value;
445
+ }
446
+ #disableAnimation_accessor_storage;
447
+ /** This will be forwarded to the sbb-pearl-chain component - if true the position won't be animated. */
448
+ get disableAnimation() {
449
+ return this.#disableAnimation_accessor_storage;
450
+ }
451
+ set disableAnimation(value) {
452
+ this.#disableAnimation_accessor_storage = value;
453
+ }
454
+ #boarding_accessor_storage;
455
+ /** This will be forwarded to the notices section */
456
+ get boarding() {
457
+ return this.#boarding_accessor_storage;
458
+ }
459
+ set boarding(value) {
460
+ this.#boarding_accessor_storage = value;
461
+ }
462
+ #loadingTrip_accessor_storage;
463
+ /**
464
+ * The loading state -
465
+ * when this is true it will be render skeleton with an idling animation
466
+ */
467
+ get loadingTrip() {
468
+ return this.#loadingTrip_accessor_storage;
469
+ }
470
+ set loadingTrip(value) {
471
+ this.#loadingTrip_accessor_storage = value;
472
+ }
473
+ #a11yFootpath_accessor_storage;
474
+ /**
475
+ * The Footpath attribute for rendering different icons
476
+ * true: render a11y-icon
477
+ * false: render walk-icon
478
+ * default: render walk-icon
479
+ */
480
+ get a11yFootpath() {
481
+ return this.#a11yFootpath_accessor_storage;
482
+ }
483
+ set a11yFootpath(value) {
484
+ this.#a11yFootpath_accessor_storage = value;
485
+ }
486
+ #loadingPrice_accessor_storage;
487
+ /**
488
+ * The loading state -
489
+ * when this is true it will be render skeleton with an idling animation
490
+ */
491
+ get loadingPrice() {
492
+ return this.#loadingPrice_accessor_storage;
493
+ }
494
+ set loadingPrice(value) {
495
+ this.#loadingPrice_accessor_storage = value;
496
+ }
497
+ #cardActionLabel_accessor_storage;
498
+ /**
499
+ * Hidden label for the card action. It overrides the automatically generated accessibility text for the component. Use this prop to provide custom accessibility information for the component.
500
+ */
501
+ get cardActionLabel() {
502
+ return this.#cardActionLabel_accessor_storage;
503
+ }
504
+ set cardActionLabel(value) {
505
+ this.#cardActionLabel_accessor_storage = value;
506
+ }
507
+ #accessibilityExpanded_accessor_storage;
508
+ /** This will be forwarded to the sbb-card component as aria-expanded. */
509
+ get accessibilityExpanded() {
510
+ return this.#accessibilityExpanded_accessor_storage;
511
+ }
512
+ set accessibilityExpanded(value) {
513
+ this.#accessibilityExpanded_accessor_storage = value;
514
+ }
515
+ #active_accessor_storage;
516
+ /** When this prop is true the sbb-card will be in the active state. */
517
+ get active() {
518
+ return this.#active_accessor_storage;
519
+ }
520
+ set active(value) {
521
+ this.#active_accessor_storage = value;
522
+ }
523
+ /**
524
+ * A configured date which acts as the current date instead of the real current date.
525
+ * Only recommended for testing purposes.
526
+ */
527
+ set now(value) {
528
+ this._now = defaultDateAdapter.getValidDateOrNull(defaultDateAdapter.deserialize(value));
529
+ }
530
+ get now() {
531
+ return this._now ?? /* @__PURE__ */ new Date();
532
+ }
533
+ willUpdate(changedProperties) {
534
+ super.willUpdate(changedProperties);
535
+ if (changedProperties.has("loadingTrip")) this.internals.role = !this.loadingTrip ? "rowgroup" : null;
536
+ }
537
+ /** The skeleton render function for the loading state */
538
+ _renderSkeleton() {
539
+ return html`
540
+ <sbb-card class="sbb-loading sbb-card-spacing-4x-xxs sbb-timetable__row-card">
541
+ ${this.loadingPrice ? html`<div class="sbb-loading__badge" slot="badge"></div>` : nothing}
542
+ <div class="sbb-loading__wrapper">
543
+ <div class="sbb-loading__row"></div>
544
+ <div class="sbb-loading__row"></div>
545
+ <div class="sbb-loading__row"></div>
546
+ </div>
547
+ </sbb-card>
548
+ `;
549
+ }
550
+ _getRideLegs() {
551
+ return this.trip?.legs?.filter((leg) => isRideLeg(leg)) ?? [];
552
+ }
553
+ _getQuayTypeStrings() {
554
+ if (!this.trip.summary?.product) return null;
555
+ const rideLegs = this._getRideLegs();
556
+ const short = this.trip.summary.product?.vehicleMode === "TRAIN" ? rideLegs[0].serviceJourney.quayTypeShortName || "" : rideLegs[0].serviceJourney.quayTypeName || "";
557
+ return {
558
+ long: i18nFromPlatform[this._language.current] + " " + short,
559
+ short
560
+ };
561
+ }
562
+ /** map Quay */
563
+ _renderQuayType() {
564
+ if (!this.trip.summary?.product) return;
565
+ const quayTypeStrings = this._getQuayTypeStrings();
566
+ return html`
567
+ <span class="sbb-timetable__row--quay">
568
+ <span class="sbb-screen-reader-only">${quayTypeStrings?.long}&nbsp;</span>
569
+ <span class="sbb-timetable__row--quay-type" aria-hidden="true"
570
+ >${quayTypeStrings?.short}</span
571
+ >
572
+ </span>
573
+ `;
574
+ }
575
+ _handleHimCus(trip) {
576
+ const { situations } = trip || {};
577
+ const sortedSituations = situations && sortSituation(situations);
578
+ const cus = getCus(trip, this._language.current);
579
+ return {
580
+ cus: Object.keys(cus)?.length ? cus : null,
581
+ him: situations?.length ? getHimIcon(sortedSituations[0]) : null
582
+ };
583
+ }
584
+ _getAccessibilityText(trip) {
585
+ const { summary, legs, notices } = trip || {};
586
+ const { departureWalk, arrivalWalk, departure, arrival, product, direction, occupancy, duration } = summary || {};
587
+ const { departureTimeAttribute, arrivalTimeAttribute } = getDepartureArrivalTimeAttribute(legs, departureWalk || 0, arrivalWalk || 0, this._language.current, this.a11yFootpath);
588
+ const rideLegs = this._getRideLegs();
589
+ const departureTime = departure?.time ? removeTimezoneFromISOTimeString(departure.time) : void 0;
590
+ const arrivalTime = arrival?.time ? removeTimezoneFromISOTimeString(arrival.time) : void 0;
591
+ const departureWalkText = departureTimeAttribute ? `${departureTimeAttribute.text} ${departureTimeAttribute.duration}, ` : "";
592
+ const arrivalWalkText = arrivalTimeAttribute ? `${arrivalTimeAttribute.text} ${arrivalTimeAttribute.duration}, ` : "";
593
+ const departureTimeText = departureTime ? `${i18nDeparture[this._language.current]}: ${format(departureTime, "HH:mm")}, ` : "";
594
+ const getDepartureQuayText = () => {
595
+ if (!departure?.quayFormatted) return "";
596
+ return `${departure?.quayChanged ? `${i18nNew[this._language.current]} ` : ""}${this._getQuayTypeStrings()?.long} ${departure?.quayFormatted}, `;
597
+ };
598
+ const meansOfTransportText = product && product.vehicleMode ? i18nMeansOfTransport[product.vehicleMode.toLowerCase()] && `${i18nMeansOfTransport[product.vehicleMode.toLowerCase()][this._language.current]}, ` : "";
599
+ const vehicleSubModeText = product?.vehicleSubModeShortName ? `${product.vehicleSubModeShortName} ${product.line || ""}, ` : "";
600
+ const directionText = `${i18nDirection[this._language.current]} ${direction}, `;
601
+ const himCus = this._handleHimCus(trip);
602
+ const cusText = himCus?.cus?.text ? `${i18nRealTimeInfo[this._language.current]}: ${himCus?.cus?.text}, ` : "";
603
+ const himText = himCus?.him?.text ? `${i18nRealTimeInfo[this._language.current]}: ${himCus?.him?.text}, ` : "";
604
+ const boardingText = this.boarding ? `${this.boarding.text}, ` : "";
605
+ const priceText = `${this.price?.isDiscount ? i18nSupersaver[this._language.current] : ""} ${this.price?.text && this.price?.price ? (this.price?.text || "") + " " + (this.price?.price || "") + ", " : ""}`;
606
+ const transferProcedures = rideLegs.length > 2 ? `${rideLegs.length - 1} ${i18nTransferProcedures[this._language.current]}, ` : rideLegs.length > 1 ? `${rideLegs.length - 1} ${i18nTransferProcedure[this._language.current]}, ` : "";
607
+ const arrivalTimeText = arrivalTime ? `${i18nArrival[this._language.current]}: ${format(arrivalTime, "HH:mm")}, ` : "";
608
+ let occupancyText = "";
609
+ if (occupancy) {
610
+ if (occupancy.firstClass && occupancy.firstClass !== "UNKNOWN") occupancyText += `${i18nClass.first[this._language.current]} ${i18nOccupancy[occupancy.firstClass.toLowerCase()]?.[this._language.current]}.`;
611
+ if (occupancy.secondClass && occupancy.secondClass !== "UNKNOWN") occupancyText += ` ${i18nClass.second[this._language.current]} ${i18nOccupancy[occupancy.secondClass.toLowerCase()]?.[this._language.current]}.`;
612
+ }
613
+ const attributes = notices && handleNotices(notices).length && handleNotices(notices)?.map((notice, index) => index < 4 && notice.text?.template).join(", ") + ", ";
614
+ const attributesText = attributes ? `${i18nTravelhints[this._language.current]}: ${attributes}` : "";
615
+ const durationText = !!duration && duration > 0 ? `${i18nTripDuration[this._language.current]} ${durationToTime(duration, this._language.current).long}, ` : "";
616
+ return [
617
+ departureWalkText,
618
+ departureTimeText,
619
+ getDepartureQuayText(),
620
+ meansOfTransportText,
621
+ vehicleSubModeText,
622
+ directionText,
623
+ cusText,
624
+ boardingText,
625
+ priceText,
626
+ cusText ? "" : himText,
627
+ arrivalTimeText,
628
+ arrivalWalkText,
629
+ durationText,
630
+ transferProcedures,
631
+ occupancyText,
632
+ attributesText
633
+ ].map((e) => e?.trim()).filter((e) => e && e.length > 0).join(" ");
634
+ }
635
+ render() {
636
+ if (this.loadingTrip) return this._renderSkeleton();
637
+ const { legs, id, notices, summary } = this.trip || {};
638
+ const { product, direction, departureWalk, departure, arrival, arrivalWalk, occupancy, duration } = summary || {};
639
+ const himCus = this._handleHimCus(this.trip);
640
+ const hasHimCus = !!himCus.cus || !!himCus.him;
641
+ const noticeAttributes = notices && handleNotices(notices);
642
+ const durationObj = duration ? durationToTime(duration, this._language.current) : null;
643
+ return html`
644
+ <sbb-card class="sbb-card-spacing-4x-xxs sbb-timetable__row-card" id=${id}>
645
+ <sbb-card-button
646
+ ?active=${this.active}
647
+ aria-expanded=${this.accessibilityExpanded ? "true" : nothing}
648
+ >
649
+ ${this.cardActionLabel ? this.cardActionLabel : this._getAccessibilityText(this.trip)}
650
+ </sbb-card-button>
651
+ ${this.loadingPrice ? html`<div class="sbb-loading__badge" slot="badge"></div>` : nothing}
652
+ ${this.price && !this.loadingPrice ? html`<sbb-card-badge color=${this.price.isDiscount ? "charcoal" : "white"}>
653
+ ${this.price.isDiscount ? html`<span aria-hidden="true">
654
+ %<span class="sbb-screen-reader-only"
655
+ >${i18nSupersaver[this._language.current]}</span
656
+ >
657
+ </span>` : nothing}
658
+ ${this.price.text ? html`<span>${this.price.text}</span>` : nothing}
659
+ ${this.price.price ? html`<span>${this.price.price}</span>` : nothing}
660
+ </sbb-card-badge>` : nothing}
661
+ <div class="sbb-timetable__row" role="row">
662
+ <div class="sbb-timetable__row-header" role="gridcell">
663
+ <div class="sbb-timetable__row-details">
664
+ ${product?.corporateIdentityPictogram && html`<span class="sbb-timetable__row-transport-wrapper">
665
+ <sbb-icon
666
+ class="sbb-timetable__row-transport-icon"
667
+ name="picto:${product.corporateIdentityPictogram}"
668
+ ></sbb-icon>
669
+ <span class="sbb-screen-reader-only">
670
+ ${product && product.vehicleMode && i18nMeansOfTransport[product.vehicleMode.toLowerCase()] && i18nMeansOfTransport[product.vehicleMode.toLowerCase()][this._language.current]}
671
+ &nbsp;
672
+ </span>
673
+ </span>`}
674
+ ${product && (product.corporateIdentityIcon ? renderIconProduct(product.corporateIdentityIcon, product.name) : product.vehicleSubModeShortName && renderStringProduct(product.vehicleSubModeShortName, product?.line))}
675
+ </div>
676
+ ${direction ? html`<p>${`${i18nDirection[this._language.current]} ${direction}`}</p>` : nothing}
677
+ </div>
678
+ <sbb-pearl-chain-time
679
+ role="gridcell"
680
+ .legs=${legs}
681
+ .departureTime=${departure?.time}
682
+ .arrivalTime=${arrival?.time}
683
+ .departureWalk=${departureWalk}
684
+ .arrivalWalk=${arrivalWalk}
685
+ ?disable-animation=${this.disableAnimation}
686
+ ?a11y-footpath=${this.a11yFootpath}
687
+ .now=${this.now}
688
+ ></sbb-pearl-chain-time>
689
+ <div class="sbb-timetable__row-footer" role="gridcell">
690
+ ${product && departure?.quayFormatted ? html`<span
691
+ class=${departure?.quayChanged ? `sbb-timetable__row-quay--changed` : nothing}
692
+ >
693
+ <span class="sbb-screen-reader-only">
694
+ ${`${i18nDeparture[this._language.current]} ${departure?.quayChanged ? i18nNew[this._language.current] : ""}`}
695
+ &nbsp;
696
+ </span>
697
+ ${this._renderQuayType()} ${departure?.quayFormatted}
698
+ </span>` : nothing}
699
+ ${occupancy?.firstClass && occupancy?.firstClass !== "UNKNOWN" || occupancy?.secondClass && occupancy.secondClass !== "UNKNOWN" ? html`<sbb-timetable-occupancy
700
+ .firstClassOccupancy=${occupancy?.firstClass?.toLowerCase()}
701
+ .secondClassOccupancy=${occupancy?.secondClass?.toLowerCase()}
702
+ ></sbb-timetable-occupancy>` : nothing}
703
+ ${noticeAttributes && noticeAttributes.length || this.boarding ? html`<ul class="sbb-timetable__row-hints" role="list">
704
+ ${noticeAttributes?.map((notice, index) => index < 4 ? html`<li>
705
+ <sbb-icon
706
+ class="sbb-travel-hints__item"
707
+ name=${"sa-" + notice.name?.toLowerCase()}
708
+ ></sbb-icon>
709
+ <span class="sbb-screen-reader-only">${notice.text?.template}</span>
710
+ </li>` : nothing)}
711
+ ${this.boarding ? html`<li>
712
+ <sbb-icon
713
+ class="sbb-travel-hints__item"
714
+ name=${this.boarding?.name}
715
+ aria-label=${this.boarding?.text}
716
+ aria-hidden="false"
717
+ ></sbb-icon>
718
+ </li>` : nothing}
719
+ </ul>` : nothing}
720
+ ${duration && duration > 0 ? html`<time>
721
+ <span class="sbb-screen-reader-only">
722
+ ${`${i18nTripDuration[this._language.current]} ${durationObj.long}`}
723
+ </span>
724
+ <span aria-hidden="true">${durationObj.short}</span>
725
+ </time>` : nothing}
726
+ ${hasHimCus && (himCus.cus || himCus.him) ? html`<span class="sbb-timetable__row-warning">
727
+ <sbb-icon name=${(himCus.cus || himCus.him).name}></sbb-icon>
728
+ <span class="sbb-screen-reader-only">${(himCus.cus || himCus.him).text}</span>
729
+ </span>` : nothing}
730
+ </div>
731
+ </div>
732
+ </sbb-card>
733
+ `;
734
+ }
735
+ };
736
+ })();
737
+ //#endregion
738
+ export { handleNotices as a, sortSituation as c, getHimIcon as i, filterNotices as n, renderIconProduct as o, getCus as r, renderStringProduct as s, SbbTimetableRowElement as t };
739
+
740
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXRhYmxlLXJvdy5jb21wb25lbnQtQmJXUXdqRU8uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC90aW1ldGFibGUtcm93L3RpbWV0YWJsZS1yb3cuc2Nzcz9pbmxpbmUiLCIuLi8uLi8uLi9zcmMvZWxlbWVudHMtZXhwZXJpbWVudGFsL3RpbWV0YWJsZS1yb3cvdGltZXRhYmxlLXJvdy5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiQHVzZSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9zdHlsZXMnIGFzIHNiYjtcblxuOmhvc3Qge1xuICAtLXNiYi10aW1ldGFibGUtcm93LWdhcDogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtMngpO1xuICAtLXNiYi10aW1ldGFibGUtcm93LWhlaWdodDogI3tzYmIucHgtdG8tcmVtLWJ1aWxkKDI1KX07XG4gIC0tc2JiLXRpbWV0YWJsZS1yb3ctaGVpZ2h0LWhlYWRlcjogI3tzYmIucHgtdG8tcmVtLWJ1aWxkKDIwKX07XG4gIC0tc2JiLXRpbWV0YWJsZS1yb3ctaGVpZ2h0LWZvb3RlcjogI3tzYmIucHgtdG8tcmVtLWJ1aWxkKDE2KX07XG4gIC0tc2JiLXRpbWV0YWJsZS1yb3ctc2tlbGV0b24tcHVsc2UtZHVyYXRpb246IDE4MDBtcztcblxuICBkaXNwbGF5OiBibG9jaztcbn1cblxuOmhvc3QoW2Rpc2FibGUtYW5pbWF0aW9uXSkge1xuICAtLXNiYi10aW1ldGFibGUtcm93LXNrZWxldG9uLXB1bHNlLWR1cmF0aW9uOiAwO1xufVxuXG4vLyBvdmVycmlkZSBpY29ucyBzaXplc1xuLnNiYi10aW1ldGFibGVfX3Jvdy10cmFuc3BvcnQtaWNvbiB7XG4gIC0tc2JiLWljb24tc3ZnLXdpZHRoOiAje3NiYi5weC10by1yZW0tYnVpbGQoMjApfTtcbiAgLS1zYmItaWNvbi1zdmctaGVpZ2h0OiAje3NiYi5weC10by1yZW0tYnVpbGQoMjApfTtcbn1cblxuLy8gb3ZlcnJpZGUgaWNvbnMgc2l6ZXNcbi5zYmItdHJhdmVsLWhpbnRzX19pdGVtIHtcbiAgLS1zYmItaWNvbi1zdmctaGVpZ2h0OiAje3NiYi5weC10by1yZW0tYnVpbGQoMTQpfTtcbn1cblxuLnNiYi10aW1ldGFibGVfX3Jvdy0tcXVheSB7XG4gIG1hcmdpbi1pbmxpbmUtZW5kOiB2YXIoLS1zYmItc3BhY2luZy1maXhlZC0xeCk7XG59XG5cbi5zYmItdGltZXRhYmxlX19yb3ctLXF1YXktdHlwZSB7XG4gIGZsb2F0OiBsZWZ0O1xufVxuXG51bCB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xufVxuXG5saSB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1zZWxmOiBjZW50ZXI7XG59XG5cbi5zYmItdGltZXRhYmxlX19yb3ctdHJhbnNwb3J0IHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLXNlbGY6IGNlbnRlcjtcbn1cblxuLnNiYi10aW1ldGFibGVfX3Jvdy10cmFuc3BvcnRudW1iZXIsXG4uc2JiLXRpbWV0YWJsZV9fcm93LXRpbWUge1xuICBAaW5jbHVkZSBzYmIudGV4dC1zO1xuXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBsaW5lLWhlaWdodDogdW5zZXQ7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGFsaWduLXNlbGY6IGNlbnRlcjtcbn1cblxuLnNiYi10aW1ldGFibGVfX3JvdyB7XG4gIEBpbmNsdWRlIHNiYi50ZXh0LXM7XG5cbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiB2YXIoLS1zYmItdGltZXRhYmxlLXJvdy1nYXApO1xufVxuXG4uc2JiLXRpbWV0YWJsZV9fcm93LWhlYWRlcixcbi5zYmItdGltZXRhYmxlX19yb3ctZm9vdGVyIHtcbiAgLy8gRHVlIHRvIGEgYnVnIGluIFNhZmFyaSB3aGljaCBkaXNwbGF5cyBza2VsZXRvbiBhbmltYXRpb24gZXZlbiBvbiBsb2FkZWQgY29udGVudCwgd2UgbmVlZCB0byBtYW51YWxseSBkaXNhYmxlIGFuaW1hdGlvbi5cbiAgYW5pbWF0aW9uOiBub25lO1xufVxuXG4uc2JiLXRpbWV0YWJsZV9fcm93LWNhcmQge1xuICAtLXNiYi1jYXJkLXBhZGRpbmctYmxvY2s6IHZhcigtLXNiYi1jYXJkLXdpdGgtYmFkZ2UtcGFkZGluZy1ibG9jayk7XG59XG5cbi5zYmItdGltZXRhYmxlX19yb3ctaGVhZGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiB2YXIoLS1zYmItc3BhY2luZy1maXhlZC0yeCk7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGxpbmUtaGVpZ2h0OiB2YXIoLS1zYmItdGltZXRhYmxlLXJvdy1oZWlnaHQtaGVhZGVyKTtcbn1cblxuLnNiYi10aW1ldGFibGVfX3Jvdy1kZXRhaWxzLFxuLnNiYi10aW1ldGFibGVfX3Jvdy1oaW50cyB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBnYXA6IHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTF4KTtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLnNiYi10aW1ldGFibGVfX3Jvdy1oZWFkZXIgcCB7XG4gIEBpbmNsdWRlIHNiYi5lbGxpcHNpcztcblxuICBtYXJnaW46IDA7XG4gIGFsaWduLXNlbGY6IGNlbnRlcjtcbn1cblxuLnNiYi10aW1ldGFibGVfX3Jvdy1mb290ZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiB2YXIoLS1zYmItc3BhY2luZy1maXhlZC0yeCk7XG4gIGxpbmUtaGVpZ2h0OiB2YXIoLS1zYmItdGltZXRhYmxlLXJvdy1oZWlnaHQtZm9vdGVyKTtcblxuICA+IHNwYW4ge1xuICAgIGFsaWduLXNlbGY6IGNlbnRlcjtcbiAgfVxuXG4gIDpvbmx5LWNoaWxkIHtcbiAgICBtYXJnaW4taW5saW5lLXN0YXJ0OiBhdXRvO1xuICB9XG59XG5cbi5zYmItdGltZXRhYmxlX19yb3ctcXVheS0tY2hhbmdlZCB7XG4gIGNvbG9yOiB2YXIoLS1zYmItY29sb3ItcHJpbWFyeSk7XG59XG5cbi5zYmItdGltZXRhYmxlX19yb3ctdHJhbnNwb3J0LXdyYXBwZXIsXG4uc2JiLXRpbWV0YWJsZV9fcm93LXdhcm5pbmcge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbn1cblxuLnNiYi1sb2FkaW5nIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5zYmItbG9hZGluZ19fd3JhcHBlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtMngpO1xufVxuXG4uc2JiLWxvYWRpbmdfX3JvdyB7XG4gIHdpZHRoOiAxMDAlO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1zYmItYm9yZGVyLXJhZGl1cy0xeCk7XG4gIGhlaWdodDogdmFyKC0tc2JiLXRpbWV0YWJsZS1yb3ctaGVpZ2h0KTtcblxuICBAaW5jbHVkZSBzYmIubXEoJGZyb206IGxhcmdlKSB7XG4gICAgaGVpZ2h0OiAje3NiYi5weC10by1yZW0tYnVpbGQoMjgpfTtcbiAgfVxuXG4gIEBtZWRpYSAoZm9yY2VkLWNvbG9yczogYWN0aXZlKSB7XG4gICAgYm9yZGVyOiB2YXIoLS1zYmItYm9yZGVyLXdpZHRoLTF4KSBzb2xpZCBCdXR0b25Cb3JkZXIgIWltcG9ydGFudDtcbiAgfVxufVxuXG4uc2JiLWxvYWRpbmdfX3Jvdyxcbi5zYmItbG9hZGluZ19fYmFkZ2Uge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1zYmItYmFja2dyb3VuZC1jb2xvci00KTtcbiAgYW5pbWF0aW9uOiBza2VsZXRvbi1wdWxzZSB2YXIoLS1zYmItdGltZXRhYmxlLXJvdy1za2VsZXRvbi1wdWxzZS1kdXJhdGlvbikgZWFzZS1vdXQgaW5maW5pdGU7XG59XG5cbi5zYmItbG9hZGluZ19fcm93OmZpcnN0LW9mLXR5cGUge1xuICBoZWlnaHQ6IHZhcigtLXNiYi10aW1ldGFibGUtcm93LWhlaWdodC1oZWFkZXIpO1xuICB3aWR0aDogNTAlO1xufVxuXG4uc2JiLWxvYWRpbmdfX3JvdzpsYXN0LW9mLXR5cGUge1xuICBoZWlnaHQ6IHZhcigtLXNiYi10aW1ldGFibGUtcm93LWhlaWdodC1mb290ZXIpO1xufVxuXG4uc2JiLWxvYWRpbmdfX2JhZGdlIHtcbiAgbWFyZ2luLWlubGluZTogYXV0byBjYWxjKHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTN4KSAqIC0xKTtcbiAgcGFkZGluZy1pbmxpbmUtZW5kOiB2YXIoLS1zYmItc3BhY2luZy1maXhlZC02eCk7XG4gIGJvcmRlci1lbmQtc3RhcnQtcmFkaXVzOiB2YXIoLS1zYmItY2FyZC1iYWRnZS1ib3JkZXItcmFkaXVzKTtcbiAgdHJhbnNmb3JtOiB2YXIoLS1zYmItY2FyZC1iYWRnZS1za2V3KTtcbiAgd2lkdGg6ICN7c2JiLnB4LXRvLXJlbS1idWlsZCgxMTUpfTtcbiAgaGVpZ2h0OiAje3NiYi5weC10by1yZW0tYnVpbGQoMjApfTtcbn1cblxuQGtleWZyYW1lcyBza2VsZXRvbi1wdWxzZSB7XG4gIDAlIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zYmItYmFja2dyb3VuZC1jb2xvci00KTtcbiAgfVxuXG4gIDE3JSB7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tc2JiLWJhY2tncm91bmQtY29sb3ItNCk7XG4gIH1cblxuICA1MCUge1xuICAgIGJhY2tncm91bmQ6IHZhcigtLXNiYi1iYWNrZ3JvdW5kLWNvbG9yLTMpO1xuICB9XG5cbiAgNjclIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zYmItYmFja2dyb3VuZC1jb2xvci0zKTtcbiAgfVxuXG4gIDEwMCUge1xuICAgIGJhY2tncm91bmQ6IHZhcigtLXNiYi1iYWNrZ3JvdW5kLWNvbG9yLTQpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBTYmJDYXJkQmFkZ2VFbGVtZW50LFxuICBTYmJDYXJkQnV0dG9uRWxlbWVudCxcbiAgU2JiQ2FyZEVsZW1lbnQsXG59IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NhcmQucHVyZS5qcyc7XG5pbXBvcnQge1xuICBkZWZhdWx0RGF0ZUFkYXB0ZXIsXG4gIGZvcmNlVHlwZSxcbiAgaTE4bkFycml2YWwsXG4gIGkxOG5DbGFzcyxcbiAgaTE4bkRlcGFydHVyZSxcbiAgaTE4bkRpcmVjdGlvbixcbiAgaTE4bkZyb21QbGF0Zm9ybSxcbiAgaTE4bk1lYW5zT2ZUcmFuc3BvcnQsXG4gIGkxOG5OZXcsXG4gIGkxOG5PY2N1cGFuY3ksXG4gIGkxOG5SZWFsVGltZUluZm8sXG4gIGkxOG5TdXBlcnNhdmVyLFxuICBpMThuVHJhbnNmZXJQcm9jZWR1cmUsXG4gIGkxOG5UcmFuc2ZlclByb2NlZHVyZXMsXG4gIGkxOG5UcmF2ZWxoaW50cyxcbiAgaTE4blRyaXBEdXJhdGlvbixcbiAgaTE4blRyaXBRdWF5Q2hhbmdlLFxuICBsaXN0UmVzZXRTdHlsZXMsXG4gIFNiYkVsZW1lbnQsXG4gIHR5cGUgU2JiRWxlbWVudFR5cGUsXG4gIFNiYkxhbmd1YWdlQ29udHJvbGxlcixcbiAgdHlwZSBTYmJPY2N1cGFuY3ksXG4gIHNjcmVlblJlYWRlck9ubHlTdHlsZXMsXG59IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUuanMnO1xuaW1wb3J0IHsgU2JiSWNvbkVsZW1lbnQgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9pY29uLnB1cmUuanMnO1xuaW1wb3J0IHsgU2JiVGltZXRhYmxlT2NjdXBhbmN5RWxlbWVudCB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL3RpbWV0YWJsZS1vY2N1cGFuY3kucHVyZS5qcyc7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQge1xuICB0eXBlIENTU1Jlc3VsdEdyb3VwLFxuICBodG1sLFxuICBub3RoaW5nLFxuICB0eXBlIFByb3BlcnR5VmFsdWVzLFxuICB0eXBlIFRlbXBsYXRlUmVzdWx0LFxuICB1bnNhZmVDU1MsXG59IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBJVHJpcEl0ZW0sIE5vdGljZSwgUHRSaWRlTGVnLCBQdFNpdHVhdGlvbiB9IGZyb20gJy4uL2NvcmUudHMnO1xuaW1wb3J0IHtcbiAgZHVyYXRpb25Ub1RpbWUsXG4gIGdldERlcGFydHVyZUFycml2YWxUaW1lQXR0cmlidXRlLFxuICBpc1JpZGVMZWcsXG4gIHJlbW92ZVRpbWV6b25lRnJvbUlTT1RpbWVTdHJpbmcsXG59IGZyb20gJy4uL2NvcmUudHMnO1xuaW1wb3J0IHsgU2JiUGVhcmxDaGFpblRpbWVFbGVtZW50IH0gZnJvbSAnLi4vcGVhcmwtY2hhaW4tdGltZS5wdXJlLnRzJztcblxuaW1wb3J0IHN0eWxlIGZyb20gJy4vdGltZXRhYmxlLXJvdy5zY3NzP2lubGluZSc7XG5cbi8qKiBIaW1DdXMgaW50ZXJmYWNlIGZvciBtYXBwZWQgaWNvbiBuYW1lIGFuZCB0ZXh0ICovXG5leHBvcnQgaW50ZXJmYWNlIEhpbUN1cyB7XG4gIG5hbWU6IHN0cmluZztcbiAgdGV4dD86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBCb2FyZGluZyBpY29uIGludGVyZmFjZSBmb3IgbWFwcGVkIGljb24gbmFtZSBhbmQgdGV4dCAqL1xuZXhwb3J0IGludGVyZmFjZSBCb2FyZGluZyB7XG4gIG5hbWU6IHN0cmluZztcbiAgdGV4dDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByaWNlIHtcbiAgcHJpY2U/OiBzdHJpbmc7XG4gIHRleHQ/OiBzdHJpbmc7XG4gIGlzRGlzY291bnQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgcmVuZGVySWNvblByb2R1Y3QgPSAoaWNvbjogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBUZW1wbGF0ZVJlc3VsdCA9PiB7XG4gIHJldHVybiBodG1sYDxzcGFuIGNsYXNzPVwic2JiLXRpbWV0YWJsZV9fcm93LXRyYW5zcG9ydFwiPlxuICAgIDxzYmItaWNvbiBuYW1lPSR7aWNvbn0+PC9zYmItaWNvbj5cbiAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIj4ke25hbWV9PC9zcGFuPlxuICA8L3NwYW4+YDtcbn07XG5cbmV4cG9ydCBjb25zdCByZW5kZXJTdHJpbmdQcm9kdWN0ID0gKHZlaGljbGVOYW1lOiBzdHJpbmcsIGxpbmU/OiBzdHJpbmcgfCBudWxsKTogVGVtcGxhdGVSZXN1bHQgPT4ge1xuICBjb25zdCBzcGFjZSA9IFsnTScsICdCJywgJ1QnXS5pbmNsdWRlcyh2ZWhpY2xlTmFtZSkgPyAnICcgOiAnJztcbiAgcmV0dXJuIGh0bWxgPHNwYW4gY2xhc3M9XCJzYmItdGltZXRhYmxlX19yb3ctdHJhbnNwb3J0bnVtYmVyXCI+XG4gICAgJHtsaW5lICE9PSBudWxsID8gdmVoaWNsZU5hbWUgKyBzcGFjZSArIGxpbmUgOiB2ZWhpY2xlTmFtZX1cbiAgPC9zcGFuPmA7XG59O1xuXG5jb25zdCBnZXRSZWFjaGFibGVUZXh0ID0gKGxlZ3M6IFB0UmlkZUxlZ1tdKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCA9PiB7XG4gIHJldHVybiBsZWdzPy5maW5kKChsZWcpID0+IGxlZy5zZXJ2aWNlSm91cm5leT8uc2VydmljZUFsdGVyYXRpb24/LnJlYWNoYWJsZVRleHQpPy5zZXJ2aWNlSm91cm5leVxuICAgID8uc2VydmljZUFsdGVyYXRpb24/LnJlYWNoYWJsZVRleHQ7XG59O1xuXG5jb25zdCBnZXREZWxheVRleHQgPSAobGVnczogUHRSaWRlTGVnW10pOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkID0+IHtcbiAgcmV0dXJuIGxlZ3M/LmZpbmQoKGxlZykgPT4gbGVnLnNlcnZpY2VKb3VybmV5Py5zZXJ2aWNlQWx0ZXJhdGlvbj8uZGVsYXlUZXh0KT8uc2VydmljZUpvdXJuZXlcbiAgICA/LnNlcnZpY2VBbHRlcmF0aW9uPy5kZWxheVRleHQ7XG59O1xuXG5jb25zdCBnZXRSZWRpcmVjdGVkVGV4dCA9IChsZWdzOiBQdFJpZGVMZWdbXSk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgPT4ge1xuICByZXR1cm4gbGVncz8uZmluZCgobGVnKSA9PiAhIWxlZy5zZXJ2aWNlSm91cm5leT8uc2VydmljZUFsdGVyYXRpb24/LnJlZGlyZWN0ZWRUZXh0KVxuICAgID8uc2VydmljZUpvdXJuZXk/LnNlcnZpY2VBbHRlcmF0aW9uPy5yZWRpcmVjdGVkVGV4dDtcbn07XG5cbmNvbnN0IGdldFVucGxhbm5lZFN0b3AgPSAobGVnczogUHRSaWRlTGVnW10pOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkID0+IHtcbiAgcmV0dXJuIGxlZ3M/LmZpbmQoKGxlZykgPT4gISFsZWcuc2VydmljZUpvdXJuZXk/LnNlcnZpY2VBbHRlcmF0aW9uPy51bnBsYW5uZWRTdG9wUG9pbnRzVGV4dClcbiAgICA/LnNlcnZpY2VKb3VybmV5Py5zZXJ2aWNlQWx0ZXJhdGlvbj8udW5wbGFubmVkU3RvcFBvaW50c1RleHQ7XG59O1xuXG5leHBvcnQgY29uc3Qgc29ydFNpdHVhdGlvbiA9IChzaXR1YXRpb25zOiBQdFNpdHVhdGlvbltdKTogUHRTaXR1YXRpb25bXSA9PiB7XG4gIGNvbnN0IHByaW9yaXRpZXMgPSB7XG4gICAgRElTVFVSQkFOQ0U6IDAsXG4gICAgSU5GT1JNQVRJT046IDEsXG4gICAgREVMQVk6IDIsXG4gICAgVFJBSU5fUkVQTEFDRU1FTlRfQllfQlVTOiAzLFxuICAgIENPTlNUUlVDVElPTl9TSVRFOiA0LFxuICAgIEVORF9NRVNTQUdFOiA1LFxuICB9O1xuXG4gIHJldHVybiBbLi4uc2l0dWF0aW9uc10/LnNvcnQoXG4gICAgKGE6IFB0U2l0dWF0aW9uLCBiOiBQdFNpdHVhdGlvbikgPT4gcHJpb3JpdGllc1thLmNhdXNlIV0gLSBwcmlvcml0aWVzW2IuY2F1c2UhXSxcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRIaW1JY29uID0gKHNpdHVhdGlvbjogUHRTaXR1YXRpb24pOiBIaW1DdXMgPT4ge1xuICBzd2l0Y2ggKHNpdHVhdGlvbj8uY2F1c2UpIHtcbiAgICBjYXNlICdESVNUVVJCQU5DRSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiAnZGlzcnVwdGlvbicsXG4gICAgICAgIHRleHQ6IHNpdHVhdGlvbj8uYnJvYWRjYXN0TWVzc2FnZXM/Lmxlbmd0aCA/IHNpdHVhdGlvbj8uYnJvYWRjYXN0TWVzc2FnZXNbMF0udGl0bGUgOiAnJyxcbiAgICAgIH07XG4gICAgY2FzZSAnSU5GT1JNQVRJT04nOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ2luZm8nLFxuICAgICAgICB0ZXh0OiBzaXR1YXRpb24/LmJyb2FkY2FzdE1lc3NhZ2VzLmxlbmd0aCA/IHNpdHVhdGlvbj8uYnJvYWRjYXN0TWVzc2FnZXNbMF0udGl0bGUgOiAnJyxcbiAgICAgIH07XG4gICAgY2FzZSAnREVMQVknOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ2RlbGF5JyxcbiAgICAgICAgdGV4dDogc2l0dWF0aW9uPy5icm9hZGNhc3RNZXNzYWdlcy5sZW5ndGggPyBzaXR1YXRpb24/LmJyb2FkY2FzdE1lc3NhZ2VzWzBdLnRpdGxlIDogJycsXG4gICAgICB9O1xuICAgIGNhc2UgJ1RSQUlOX1JFUExBQ0VNRU5UX0JZX0JVUyc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiAncmVwbGFjZW1lbnRidXMnLFxuICAgICAgICB0ZXh0OiBzaXR1YXRpb24/LmJyb2FkY2FzdE1lc3NhZ2VzLmxlbmd0aCA/IHNpdHVhdGlvbj8uYnJvYWRjYXN0TWVzc2FnZXNbMF0udGl0bGUgOiAnJyxcbiAgICAgIH07XG4gICAgY2FzZSAnQ09OU1RSVUNUSU9OX1NJVEUnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ2NvbnN0cnVjdGlvbicsXG4gICAgICAgIHRleHQ6IHNpdHVhdGlvbj8uYnJvYWRjYXN0TWVzc2FnZXMubGVuZ3RoID8gc2l0dWF0aW9uPy5icm9hZGNhc3RNZXNzYWdlc1swXS50aXRsZSA6ICcnLFxuICAgICAgfTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ2luZm8nLFxuICAgICAgICB0ZXh0OiBzaXR1YXRpb24/LmJyb2FkY2FzdE1lc3NhZ2VzLmxlbmd0aCA/IHNpdHVhdGlvbj8uYnJvYWRjYXN0TWVzc2FnZXNbMF0udGl0bGUgOiAnJyxcbiAgICAgIH07XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDdXMgPSAodHJpcDogSVRyaXBJdGVtLCBjdXJyZW50TGFuZ3VhZ2U6IHN0cmluZyk6IEhpbUN1cyA9PiB7XG4gIGNvbnN0IHsgc3VtbWFyeSwgbGVncyB9ID0gdHJpcCB8fCB7fTtcbiAgY29uc3QgcmlkZUxlZ3MgPSBsZWdzPy5maWx0ZXIoKGxlZykgPT4gaXNSaWRlTGVnKGxlZykpIGFzIFB0UmlkZUxlZ1tdO1xuICBjb25zdCB7IHRyaXBTdGF0dXMgfSA9IHN1bW1hcnkgfHwge307XG5cbiAgaWYgKHRyaXBTdGF0dXM/LmNhbmNlbGxlZCB8fCB0cmlwU3RhdHVzPy5wYXJ0aWFsbHlDYW5jZWxsZWQpIHtcbiAgICByZXR1cm4geyBuYW1lOiAnY2FuY2VsbGF0aW9uJywgdGV4dDogdHJpcFN0YXR1cz8uY2FuY2VsbGVkVGV4dCB9O1xuICB9XG4gIGlmIChyaWRlTGVncz8uc29tZSgobGVnKSA9PiBsZWcuc2VydmljZUpvdXJuZXk/LnNlcnZpY2VBbHRlcmF0aW9uPy5jYW5jZWxsZWRFeHBlY3RlZCkpIHtcbiAgICByZXR1cm4geyBuYW1lOiAnZGlzcnVwdGlvbicsIHRleHQ6IHRyaXBTdGF0dXM/LmNhbmNlbGxlZFRleHQgfTtcbiAgfVxuICBpZiAoZ2V0UmVhY2hhYmxlVGV4dChyaWRlTGVncykpIHtcbiAgICByZXR1cm4geyBuYW1lOiAnbWlzc2VkLWNvbm5lY3Rpb24nLCB0ZXh0OiBnZXRSZWFjaGFibGVUZXh0KHJpZGVMZWdzKSB9O1xuICB9XG4gIGlmICh0cmlwU3RhdHVzPy5hbHRlcm5hdGl2ZSkge1xuICAgIHJldHVybiB7IG5hbWU6ICdhbHRlcm5hdGl2ZScsIHRleHQ6IHRyaXBTdGF0dXMuYWx0ZXJuYXRpdmVUZXh0IH07XG4gIH1cbiAgaWYgKGdldFJlZGlyZWN0ZWRUZXh0KHJpZGVMZWdzKSkge1xuICAgIHJldHVybiB7IG5hbWU6ICdyZXJvdXRlJywgdGV4dDogZ2V0UmVkaXJlY3RlZFRleHQocmlkZUxlZ3MpIH07XG4gIH1cbiAgaWYgKGdldFVucGxhbm5lZFN0b3AocmlkZUxlZ3MpKSB7XG4gICAgcmV0dXJuIHsgbmFtZTogJ2FkZC1zdG9wJywgdGV4dDogZ2V0VW5wbGFubmVkU3RvcChyaWRlTGVncykgfTtcbiAgfVxuICBpZiAodHJpcFN0YXR1cz8uZGVsYXllZCB8fCB0cmlwU3RhdHVzPy5kZWxheWVkVW5rbm93bikge1xuICAgIHJldHVybiB7IG5hbWU6ICdkZWxheScsIHRleHQ6IGdldERlbGF5VGV4dChyaWRlTGVncykgfTtcbiAgfVxuICBpZiAodHJpcFN0YXR1cz8ucXVheUNoYW5nZWQpIHtcbiAgICBjb25zdCBkZXBhcnR1cmUgPSByaWRlTGVnc1swXS5kZXBhcnR1cmU7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdwbGF0Zm9ybS1jaGFuZ2UnLFxuICAgICAgdGV4dDogZGVwYXJ0dXJlLnF1YXlDaGFuZ2VkID8gZGVwYXJ0dXJlLnF1YXlDaGFuZ2VkVGV4dCA6IGkxOG5UcmlwUXVheUNoYW5nZVtjdXJyZW50TGFuZ3VhZ2VdLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge30gYXMgSGltQ3VzO1xufTtcblxuY29uc3QgZmluZEFuZFJlcGxhY2VOb3RpY2UgPSAobm90aWNlczogTm90aWNlW10pOiBOb3RpY2UgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCByZXNlcnZhdGlvbk5vdGljZSA9IFsnUlInLCAnUksnLCAnUkMnLCAnUkwnLCAnUk0nLCAnUlMnLCAnUlUnLCAnWFAnLCAnWFInLCAnWFQnXTtcblxuICByZXR1cm4gbm90aWNlcy5yZWR1Y2UoKGZvdW5kTm90aWNlOiBOb3RpY2UgfCB1bmRlZmluZWQsIG5vdGljZTogTm90aWNlKTogTm90aWNlIHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAoZm91bmROb3RpY2UpIHtcbiAgICAgIHJldHVybiBmb3VuZE5vdGljZTtcbiAgICB9XG4gICAgaWYgKHJlc2VydmF0aW9uTm90aWNlLmluY2x1ZGVzKG5vdGljZS5uYW1lKSkge1xuICAgICAgcmV0dXJuIHsgLi4ubm90aWNlLCBuYW1lOiAnUlInIH0gYXMgTm90aWNlO1xuICAgIH1cbiAgfSwgdW5kZWZpbmVkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBmaWx0ZXJOb3RpY2VzID0gKG5vdGljZXM6IE5vdGljZVtdKTogTm90aWNlW10gPT4ge1xuICBjb25zdCBhbGxvd2VkTmFtZXMgPSBbJ1onLCAnU0InLCAnU1onLCAnVlInLCAnVEcnXTtcblxuICBjb25zdCBmaWx0ZXJOb3RpY2UgPSBub3RpY2VzLmZpbHRlcigobm90aWNlLCBpbmRleCkgPT4ge1xuICAgIHJldHVybiBub3RpY2VzLmZpbmRJbmRleCgobikgPT4gbi5uYW1lID09PSBub3RpY2UubmFtZSkgPT09IGluZGV4O1xuICB9KTtcblxuICByZXR1cm4gZmlsdGVyTm90aWNlXG4gICAgLmZpbHRlcigobm90aWNlKSA9PiBhbGxvd2VkTmFtZXMuaW5jbHVkZXMobm90aWNlLm5hbWUpKVxuICAgIC5zb3J0KChhLCBiKSA9PiBhbGxvd2VkTmFtZXMuaW5kZXhPZihhLm5hbWUpIC0gYWxsb3dlZE5hbWVzLmluZGV4T2YoYi5uYW1lKSk7XG59O1xuXG5leHBvcnQgY29uc3QgaGFuZGxlTm90aWNlcyA9IChub3RpY2VzOiBOb3RpY2VbXSk6IE5vdGljZVtdID0+IHtcbiAgY29uc3QgcmVzZXJ2YXRpb25Ob3RpY2UgPSBmaW5kQW5kUmVwbGFjZU5vdGljZShub3RpY2VzKTtcbiAgY29uc3QgZmlsdGVyZWROb3RpY2VzID0gZmlsdGVyTm90aWNlcyhub3RpY2VzKTtcblxuICBpZiAocmVzZXJ2YXRpb25Ob3RpY2UgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmaWx0ZXJlZE5vdGljZXM7XG4gIH1cbiAgaWYgKCFmaWx0ZXJlZE5vdGljZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFtyZXNlcnZhdGlvbk5vdGljZV07XG4gIH1cblxuICBpZiAoZmlsdGVyZWROb3RpY2VzWzBdLm5hbWUgPT09ICdaJyAmJiBmaWx0ZXJlZE5vdGljZXNbMV0pIHtcbiAgICByZXR1cm4gW2ZpbHRlcmVkTm90aWNlc1swXSwgcmVzZXJ2YXRpb25Ob3RpY2UsIGZpbHRlcmVkTm90aWNlc1sxXV0uY29uY2F0KFxuICAgICAgZmlsdGVyZWROb3RpY2VzLnNsaWNlKDIpLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gW3Jlc2VydmF0aW9uTm90aWNlLCAuLi5maWx0ZXJlZE5vdGljZXNdO1xufTtcblxuLyoqXG4gKiBJdCBkaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJpcCwgYWN0aW5nIGFzIGEgY29udGFpbmVyIGZvciBhbGwgdGhlIGBzYmItdGltZXRhYmxlLSpgIGNvbXBvbmVudHMuXG4gKiAqL1xuZXhwb3J0IGNsYXNzIFNiYlRpbWV0YWJsZVJvd0VsZW1lbnQgZXh0ZW5kcyBTYmJFbGVtZW50IHtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSBlbGVtZW50TmFtZTogc3RyaW5nID0gJ3NiYi10aW1ldGFibGUtcm93JztcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBlbGVtZW50RGVwZW5kZW5jaWVzOiBTYmJFbGVtZW50VHlwZVtdID0gW1xuICAgIFNiYkNhcmRFbGVtZW50LFxuICAgIFNiYkNhcmRCYWRnZUVsZW1lbnQsXG4gICAgU2JiQ2FyZEJ1dHRvbkVsZW1lbnQsXG4gICAgU2JiSWNvbkVsZW1lbnQsXG4gICAgU2JiVGltZXRhYmxlT2NjdXBhbmN5RWxlbWVudCxcbiAgICBTYmJQZWFybENoYWluVGltZUVsZW1lbnQsXG4gIF07XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IFtcbiAgICBsaXN0UmVzZXRTdHlsZXMsXG4gICAgc2NyZWVuUmVhZGVyT25seVN0eWxlcyxcbiAgICB1bnNhZmVDU1Moc3R5bGUpLFxuICBdO1xuXG4gIC8qKiBUaGUgdHJpcCBQcm9wLiAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSkgcHVibGljIGFjY2Vzc29yIHRyaXA6IElUcmlwSXRlbSA9IG51bGwhO1xuXG4gIC8qKiBUaGUgcHJpY2UgUHJvcCwgd2hpY2ggY29uc2lzdHMgb2YgdGhlIGRhdGEgZm9yIHRoZSBiYWRnZS4gKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pIHB1YmxpYyBhY2Nlc3NvciBwcmljZTogUHJpY2UgPSBudWxsITtcblxuICAvKiogVGhpcyB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgc2JiLXBlYXJsLWNoYWluIGNvbXBvbmVudCAtIGlmIHRydWUgdGhlIHBvc2l0aW9uIHdvbid0IGJlIGFuaW1hdGVkLiAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZGlzYWJsZS1hbmltYXRpb24nLCByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBkaXNhYmxlQW5pbWF0aW9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIFRoaXMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIG5vdGljZXMgc2VjdGlvbiAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSkgcHVibGljIGFjY2Vzc29yIGJvYXJkaW5nOiBCb2FyZGluZyA9IG51bGwhO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9hZGluZyBzdGF0ZSAtXG4gICAqIHdoZW4gdGhpcyBpcyB0cnVlIGl0IHdpbGwgYmUgcmVuZGVyIHNrZWxldG9uIHdpdGggYW4gaWRsaW5nIGFuaW1hdGlvblxuICAgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2xvYWRpbmctdHJpcCcsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIGxvYWRpbmdUcmlwOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBGb290cGF0aCBhdHRyaWJ1dGUgZm9yIHJlbmRlcmluZyBkaWZmZXJlbnQgaWNvbnNcbiAgICogdHJ1ZTogcmVuZGVyIGExMXktaWNvblxuICAgKiBmYWxzZTogcmVuZGVyIHdhbGstaWNvblxuICAgKiBkZWZhdWx0OiByZW5kZXIgd2Fsay1pY29uXG4gICAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYTExeS1mb290cGF0aCcsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIGExMXlGb290cGF0aDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9hZGluZyBzdGF0ZSAtXG4gICAqIHdoZW4gdGhpcyBpcyB0cnVlIGl0IHdpbGwgYmUgcmVuZGVyIHNrZWxldG9uIHdpdGggYW4gaWRsaW5nIGFuaW1hdGlvblxuICAgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2xvYWRpbmctcHJpY2UnLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBsb2FkaW5nUHJpY2U6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogSGlkZGVuIGxhYmVsIGZvciB0aGUgY2FyZCBhY3Rpb24uIEl0IG92ZXJyaWRlcyB0aGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYWNjZXNzaWJpbGl0eSB0ZXh0IGZvciB0aGUgY29tcG9uZW50LiBVc2UgdGhpcyBwcm9wIHRvIHByb3ZpZGUgY3VzdG9tIGFjY2Vzc2liaWxpdHkgaW5mb3JtYXRpb24gZm9yIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnY2FyZC1hY3Rpb24tbGFiZWwnIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBjYXJkQWN0aW9uTGFiZWw6IHN0cmluZyA9ICcnO1xuXG4gIC8qKiBUaGlzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSBzYmItY2FyZCBjb21wb25lbnQgYXMgYXJpYS1leHBhbmRlZC4gKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2FjY2Vzc2liaWxpdHktZXhwYW5kZWQnLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBhY2Nlc3NpYmlsaXR5RXhwYW5kZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogV2hlbiB0aGlzIHByb3AgaXMgdHJ1ZSB0aGUgc2JiLWNhcmQgd2lsbCBiZSBpbiB0aGUgYWN0aXZlIHN0YXRlLiAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgYWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEEgY29uZmlndXJlZCBkYXRlIHdoaWNoIGFjdHMgYXMgdGhlIGN1cnJlbnQgZGF0ZSBpbnN0ZWFkIG9mIHRoZSByZWFsIGN1cnJlbnQgZGF0ZS5cbiAgICogT25seSByZWNvbW1lbmRlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAgICovXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBzZXQgbm93KHZhbHVlOiBEYXRlIHwgbnVsbCkge1xuICAgIHRoaXMuX25vdyA9IGRlZmF1bHREYXRlQWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwoZGVmYXVsdERhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gIH1cbiAgcHVibGljIGdldCBub3coKTogRGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX25vdyA/PyBuZXcgRGF0ZSgpO1xuICB9XG4gIHByaXZhdGUgX25vdzogRGF0ZSB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX2xhbmd1YWdlID0gbmV3IFNiYkxhbmd1YWdlQ29udHJvbGxlcih0aGlzKTtcblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2xvYWRpbmdUcmlwJykpIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxzLnJvbGUgPSAhdGhpcy5sb2FkaW5nVHJpcCA/ICdyb3dncm91cCcgOiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgc2tlbGV0b24gcmVuZGVyIGZ1bmN0aW9uIGZvciB0aGUgbG9hZGluZyBzdGF0ZSAqL1xuICBwcml2YXRlIF9yZW5kZXJTa2VsZXRvbigpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2JiLWNhcmQgY2xhc3M9XCJzYmItbG9hZGluZyBzYmItY2FyZC1zcGFjaW5nLTR4LXh4cyBzYmItdGltZXRhYmxlX19yb3ctY2FyZFwiPlxuICAgICAgICAke3RoaXMubG9hZGluZ1ByaWNlID8gaHRtbGA8ZGl2IGNsYXNzPVwic2JiLWxvYWRpbmdfX2JhZGdlXCIgc2xvdD1cImJhZGdlXCI+PC9kaXY+YCA6IG5vdGhpbmd9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmItbG9hZGluZ19fd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItbG9hZGluZ19fcm93XCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1sb2FkaW5nX19yb3dcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLWxvYWRpbmdfX3Jvd1wiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc2JiLWNhcmQ+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJpZGVMZWdzKCk6IFB0UmlkZUxlZ1tdIHtcbiAgICByZXR1cm4gdGhpcy50cmlwPy5sZWdzPy5maWx0ZXIoKGxlZykgPT4gaXNSaWRlTGVnKGxlZykpID8/IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UXVheVR5cGVTdHJpbmdzKCk6IHsgbG9uZzogc3RyaW5nOyBzaG9ydDogc3RyaW5nIH0gfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudHJpcC5zdW1tYXJ5Py5wcm9kdWN0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmlkZUxlZ3MgPSB0aGlzLl9nZXRSaWRlTGVncygpO1xuICAgIGNvbnN0IGlzU2hvcnQgPSB0aGlzLnRyaXAuc3VtbWFyeS5wcm9kdWN0Py52ZWhpY2xlTW9kZSA9PT0gJ1RSQUlOJztcbiAgICBjb25zdCBzaG9ydCA9IGlzU2hvcnRcbiAgICAgID8gcmlkZUxlZ3NbMF0uc2VydmljZUpvdXJuZXkucXVheVR5cGVTaG9ydE5hbWUgfHwgJydcbiAgICAgIDogcmlkZUxlZ3NbMF0uc2VydmljZUpvdXJuZXkucXVheVR5cGVOYW1lIHx8ICcnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxvbmc6IGkxOG5Gcm9tUGxhdGZvcm1bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0gKyAnICcgKyBzaG9ydCxcbiAgICAgIHNob3J0LFxuICAgIH07XG4gIH1cblxuICAvKiogbWFwIFF1YXkgKi9cbiAgcHJpdmF0ZSBfcmVuZGVyUXVheVR5cGUoKTogVGVtcGxhdGVSZXN1bHQgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy50cmlwLnN1bW1hcnk/LnByb2R1Y3QpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHF1YXlUeXBlU3RyaW5ncyA9IHRoaXMuX2dldFF1YXlUeXBlU3RyaW5ncygpO1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNwYW4gY2xhc3M9XCJzYmItdGltZXRhYmxlX19yb3ctLXF1YXlcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmItc2NyZWVuLXJlYWRlci1vbmx5XCI+JHtxdWF5VHlwZVN0cmluZ3M/Lmxvbmd9Jm5ic3A7PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi10aW1ldGFibGVfX3Jvdy0tcXVheS10eXBlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICA+JHtxdWF5VHlwZVN0cmluZ3M/LnNob3J0fTwvc3BhblxuICAgICAgICA+XG4gICAgICA8L3NwYW4+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUhpbUN1cyh0cmlwOiBJVHJpcEl0ZW0pOiB7IGN1czogSGltQ3VzIHwgbnVsbDsgaGltOiBIaW1DdXMgfCBudWxsIH0ge1xuICAgIGNvbnN0IHsgc2l0dWF0aW9ucyB9ID0gdHJpcCB8fCB7fTtcbiAgICBjb25zdCBzb3J0ZWRTaXR1YXRpb25zID0gc2l0dWF0aW9ucyAmJiBzb3J0U2l0dWF0aW9uKHNpdHVhdGlvbnMpO1xuICAgIGNvbnN0IGN1cyA9IGdldEN1cyh0cmlwLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KTtcblxuICAgIHJldHVybiB7XG4gICAgICBjdXM6IE9iamVjdC5rZXlzKGN1cyk/Lmxlbmd0aCA/IGN1cyA6IG51bGwsXG4gICAgICBoaW06IHNpdHVhdGlvbnM/Lmxlbmd0aCA/IGdldEhpbUljb24oc29ydGVkU2l0dWF0aW9uc1swXSkgOiBudWxsLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9nZXRBY2Nlc3NpYmlsaXR5VGV4dCh0cmlwOiBJVHJpcEl0ZW0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgc3VtbWFyeSwgbGVncywgbm90aWNlcyB9ID0gdHJpcCB8fCB7fTtcbiAgICBjb25zdCB7XG4gICAgICBkZXBhcnR1cmVXYWxrLFxuICAgICAgYXJyaXZhbFdhbGssXG4gICAgICBkZXBhcnR1cmUsXG4gICAgICBhcnJpdmFsLFxuICAgICAgcHJvZHVjdCxcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIG9jY3VwYW5jeSxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH0gPSBzdW1tYXJ5IHx8IHt9O1xuXG4gICAgY29uc3QgeyBkZXBhcnR1cmVUaW1lQXR0cmlidXRlLCBhcnJpdmFsVGltZUF0dHJpYnV0ZSB9ID0gZ2V0RGVwYXJ0dXJlQXJyaXZhbFRpbWVBdHRyaWJ1dGUoXG4gICAgICBsZWdzLFxuICAgICAgZGVwYXJ0dXJlV2FsayB8fCAwLFxuICAgICAgYXJyaXZhbFdhbGsgfHwgMCxcbiAgICAgIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQsXG4gICAgICB0aGlzLmExMXlGb290cGF0aCxcbiAgICApO1xuXG4gICAgY29uc3QgcmlkZUxlZ3MgPSB0aGlzLl9nZXRSaWRlTGVncygpO1xuXG4gICAgY29uc3QgZGVwYXJ0dXJlVGltZTogRGF0ZSB8IHVuZGVmaW5lZCA9IGRlcGFydHVyZT8udGltZVxuICAgICAgPyByZW1vdmVUaW1lem9uZUZyb21JU09UaW1lU3RyaW5nKGRlcGFydHVyZS50aW1lKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBhcnJpdmFsVGltZTogRGF0ZSB8IHVuZGVmaW5lZCA9IGFycml2YWw/LnRpbWVcbiAgICAgID8gcmVtb3ZlVGltZXpvbmVGcm9tSVNPVGltZVN0cmluZyhhcnJpdmFsLnRpbWUpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGRlcGFydHVyZVdhbGtUZXh0ID0gZGVwYXJ0dXJlVGltZUF0dHJpYnV0ZVxuICAgICAgPyBgJHtkZXBhcnR1cmVUaW1lQXR0cmlidXRlLnRleHR9ICR7ZGVwYXJ0dXJlVGltZUF0dHJpYnV0ZS5kdXJhdGlvbn0sIGBcbiAgICAgIDogJyc7XG5cbiAgICBjb25zdCBhcnJpdmFsV2Fsa1RleHQgPSBhcnJpdmFsVGltZUF0dHJpYnV0ZVxuICAgICAgPyBgJHthcnJpdmFsVGltZUF0dHJpYnV0ZS50ZXh0fSAke2Fycml2YWxUaW1lQXR0cmlidXRlLmR1cmF0aW9ufSwgYFxuICAgICAgOiAnJztcblxuICAgIGNvbnN0IGRlcGFydHVyZVRpbWVUZXh0ID0gZGVwYXJ0dXJlVGltZVxuICAgICAgPyBgJHtpMThuRGVwYXJ0dXJlW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfTogJHtmb3JtYXQoZGVwYXJ0dXJlVGltZSwgJ0hIOm1tJyl9LCBgXG4gICAgICA6ICcnO1xuXG4gICAgY29uc3QgZ2V0RGVwYXJ0dXJlUXVheVRleHQgPSAoKTogc3RyaW5nID0+IHtcbiAgICAgIGlmICghZGVwYXJ0dXJlPy5xdWF5Rm9ybWF0dGVkKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIHByZWZpeCBcIm5ld1wiIGlmIHF1YXkgd2FzIGNoYW5nZWRcbiAgICAgIGNvbnN0IGNoYW5nZWRRdWF5UHJlZml4ID0gZGVwYXJ0dXJlPy5xdWF5Q2hhbmdlZCA/IGAke2kxOG5OZXdbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19IGAgOiAnJztcbiAgICAgIHJldHVybiBgJHtjaGFuZ2VkUXVheVByZWZpeH0ke1xuICAgICAgICB0aGlzLl9nZXRRdWF5VHlwZVN0cmluZ3MoKT8ubG9uZ1xuICAgICAgfSAke2RlcGFydHVyZT8ucXVheUZvcm1hdHRlZH0sIGA7XG4gICAgfTtcblxuICAgIGNvbnN0IG1lYW5zT2ZUcmFuc3BvcnRUZXh0ID1cbiAgICAgIHByb2R1Y3QgJiYgcHJvZHVjdC52ZWhpY2xlTW9kZVxuICAgICAgICA/IGkxOG5NZWFuc09mVHJhbnNwb3J0W3Byb2R1Y3QudmVoaWNsZU1vZGUudG9Mb3dlckNhc2UoKV0gJiZcbiAgICAgICAgICBgJHtpMThuTWVhbnNPZlRyYW5zcG9ydFtwcm9kdWN0LnZlaGljbGVNb2RlLnRvTG93ZXJDYXNlKCldW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSwgYFxuICAgICAgICA6ICcnO1xuXG4gICAgY29uc3QgdmVoaWNsZVN1Yk1vZGVUZXh0ID0gcHJvZHVjdD8udmVoaWNsZVN1Yk1vZGVTaG9ydE5hbWVcbiAgICAgID8gYCR7cHJvZHVjdC52ZWhpY2xlU3ViTW9kZVNob3J0TmFtZX0gJHtwcm9kdWN0LmxpbmUgfHwgJyd9LCBgXG4gICAgICA6ICcnO1xuXG4gICAgY29uc3QgZGlyZWN0aW9uVGV4dCA9IGAke2kxOG5EaXJlY3Rpb25bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19ICR7ZGlyZWN0aW9ufSwgYDtcblxuICAgIGNvbnN0IGhpbUN1cyA9IHRoaXMuX2hhbmRsZUhpbUN1cyh0cmlwKTtcbiAgICBjb25zdCBjdXNUZXh0ID0gaGltQ3VzPy5jdXM/LnRleHRcbiAgICAgID8gYCR7aTE4blJlYWxUaW1lSW5mb1t0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX06ICR7aGltQ3VzPy5jdXM/LnRleHR9LCBgXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGhpbVRleHQgPSBoaW1DdXM/LmhpbT8udGV4dFxuICAgICAgPyBgJHtpMThuUmVhbFRpbWVJbmZvW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfTogJHtoaW1DdXM/LmhpbT8udGV4dH0sIGBcbiAgICAgIDogJyc7XG5cbiAgICBjb25zdCBib2FyZGluZ1RleHQgPSB0aGlzLmJvYXJkaW5nID8gYCR7dGhpcy5ib2FyZGluZy50ZXh0fSwgYCA6ICcnO1xuXG4gICAgY29uc3QgcHJpY2VUZXh0ID0gYCR7dGhpcy5wcmljZT8uaXNEaXNjb3VudCA/IGkxOG5TdXBlcnNhdmVyW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdIDogJyd9ICR7XG4gICAgICB0aGlzLnByaWNlPy50ZXh0ICYmIHRoaXMucHJpY2U/LnByaWNlXG4gICAgICAgID8gKHRoaXMucHJpY2U/LnRleHQgfHwgJycpICsgJyAnICsgKHRoaXMucHJpY2U/LnByaWNlIHx8ICcnKSArICcsICdcbiAgICAgICAgOiAnJ1xuICAgIH1gO1xuXG4gICAgY29uc3QgdHJhbnNmZXJQcm9jZWR1cmVzID1cbiAgICAgIHJpZGVMZWdzLmxlbmd0aCA+IDJcbiAgICAgICAgPyBgJHtyaWRlTGVncy5sZW5ndGggLSAxfSAke2kxOG5UcmFuc2ZlclByb2NlZHVyZXNbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19LCBgXG4gICAgICAgIDogcmlkZUxlZ3MubGVuZ3RoID4gMVxuICAgICAgICAgID8gYCR7cmlkZUxlZ3MubGVuZ3RoIC0gMX0gJHtpMThuVHJhbnNmZXJQcm9jZWR1cmVbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19LCBgXG4gICAgICAgICAgOiAnJztcblxuICAgIGNvbnN0IGFycml2YWxUaW1lVGV4dCA9IGFycml2YWxUaW1lXG4gICAgICA/IGAke2kxOG5BcnJpdmFsW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfTogJHtmb3JtYXQoYXJyaXZhbFRpbWUsICdISDptbScpfSwgYFxuICAgICAgOiAnJztcblxuICAgIGxldCBvY2N1cGFuY3lUZXh0OiBzdHJpbmcgPSAnJztcbiAgICBpZiAob2NjdXBhbmN5KSB7XG4gICAgICBpZiAob2NjdXBhbmN5LmZpcnN0Q2xhc3MgJiYgb2NjdXBhbmN5LmZpcnN0Q2xhc3MgIT09ICdVTktOT1dOJykge1xuICAgICAgICBvY2N1cGFuY3lUZXh0ICs9IGAke2kxOG5DbGFzcy5maXJzdFt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0gJHtcbiAgICAgICAgICAoXG4gICAgICAgICAgICBpMThuT2NjdXBhbmN5W29jY3VwYW5jeS5maXJzdENsYXNzLnRvTG93ZXJDYXNlKCkgYXMgU2JiT2NjdXBhbmN5XSBhcyBSZWNvcmQ8XG4gICAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgICAgc3RyaW5nXG4gICAgICAgICAgICA+XG4gICAgICAgICAgKT8uW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdXG4gICAgICAgIH0uYDtcbiAgICAgIH1cbiAgICAgIGlmIChvY2N1cGFuY3kuc2Vjb25kQ2xhc3MgJiYgb2NjdXBhbmN5LnNlY29uZENsYXNzICE9PSAnVU5LTk9XTicpIHtcbiAgICAgICAgb2NjdXBhbmN5VGV4dCArPSBgICR7aTE4bkNsYXNzLnNlY29uZFt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0gJHtcbiAgICAgICAgICAoXG4gICAgICAgICAgICBpMThuT2NjdXBhbmN5W29jY3VwYW5jeS5zZWNvbmRDbGFzcy50b0xvd2VyQ2FzZSgpIGFzIFNiYk9jY3VwYW5jeV0gYXMgUmVjb3JkPFxuICAgICAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgICAgIHN0cmluZ1xuICAgICAgICAgICAgPlxuICAgICAgICAgICk/Llt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XVxuICAgICAgICB9LmA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9XG4gICAgICBub3RpY2VzICYmXG4gICAgICBoYW5kbGVOb3RpY2VzKG5vdGljZXMpLmxlbmd0aCAmJlxuICAgICAgaGFuZGxlTm90aWNlcyhub3RpY2VzKVxuICAgICAgICA/Lm1hcCgobm90aWNlLCBpbmRleCkgPT4gaW5kZXggPCA0ICYmIG5vdGljZS50ZXh0Py50ZW1wbGF0ZSlcbiAgICAgICAgLmpvaW4oJywgJykgKyAnLCAnO1xuXG4gICAgY29uc3QgYXR0cmlidXRlc1RleHQgPSBhdHRyaWJ1dGVzXG4gICAgICA/IGAke2kxOG5UcmF2ZWxoaW50c1t0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX06ICR7YXR0cmlidXRlc31gXG4gICAgICA6ICcnO1xuXG4gICAgY29uc3QgZHVyYXRpb25UZXh0ID1cbiAgICAgICEhZHVyYXRpb24gJiYgZHVyYXRpb24gPiAwXG4gICAgICAgID8gYCR7aTE4blRyaXBEdXJhdGlvblt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0gJHtcbiAgICAgICAgICAgIGR1cmF0aW9uVG9UaW1lKGR1cmF0aW9uLCB0aGlzLl9sYW5ndWFnZS5jdXJyZW50KS5sb25nXG4gICAgICAgICAgfSwgYFxuICAgICAgICA6ICcnO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIGRlcGFydHVyZVdhbGtUZXh0LFxuICAgICAgZGVwYXJ0dXJlVGltZVRleHQsXG4gICAgICBnZXREZXBhcnR1cmVRdWF5VGV4dCgpLFxuICAgICAgbWVhbnNPZlRyYW5zcG9ydFRleHQsXG4gICAgICB2ZWhpY2xlU3ViTW9kZVRleHQsXG4gICAgICBkaXJlY3Rpb25UZXh0LFxuICAgICAgY3VzVGV4dCxcbiAgICAgIGJvYXJkaW5nVGV4dCxcbiAgICAgIHByaWNlVGV4dCxcbiAgICAgIGN1c1RleHQgPyAnJyA6IGhpbVRleHQsXG4gICAgICBhcnJpdmFsVGltZVRleHQsXG4gICAgICBhcnJpdmFsV2Fsa1RleHQsXG4gICAgICBkdXJhdGlvblRleHQsXG4gICAgICB0cmFuc2ZlclByb2NlZHVyZXMsXG4gICAgICBvY2N1cGFuY3lUZXh0LFxuICAgICAgYXR0cmlidXRlc1RleHQsXG4gICAgXVxuICAgICAgLm1hcCgoZSkgPT4gZT8udHJpbSgpKVxuICAgICAgLmZpbHRlcigoZSkgPT4gZSAmJiBlLmxlbmd0aCA+IDApXG4gICAgICAuam9pbignICcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlbmRlcigpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgaWYgKHRoaXMubG9hZGluZ1RyaXApIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJTa2VsZXRvbigpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbGVncywgaWQsIG5vdGljZXMsIHN1bW1hcnkgfSA9IHRoaXMudHJpcCB8fCB7fTtcblxuICAgIGNvbnN0IHtcbiAgICAgIHByb2R1Y3QsXG4gICAgICBkaXJlY3Rpb24sXG4gICAgICBkZXBhcnR1cmVXYWxrLFxuICAgICAgZGVwYXJ0dXJlLFxuICAgICAgYXJyaXZhbCxcbiAgICAgIGFycml2YWxXYWxrLFxuICAgICAgb2NjdXBhbmN5LFxuICAgICAgZHVyYXRpb24sXG4gICAgfSA9IHN1bW1hcnkgfHwge307XG5cbiAgICBjb25zdCBoaW1DdXMgPSB0aGlzLl9oYW5kbGVIaW1DdXModGhpcy50cmlwKTtcbiAgICBjb25zdCBoYXNIaW1DdXMgPSAhIWhpbUN1cy5jdXMgfHwgISFoaW1DdXMuaGltO1xuXG4gICAgY29uc3Qgbm90aWNlQXR0cmlidXRlcyA9IG5vdGljZXMgJiYgaGFuZGxlTm90aWNlcyhub3RpY2VzKTtcblxuICAgIGNvbnN0IGR1cmF0aW9uT2JqID0gZHVyYXRpb24gPyBkdXJhdGlvblRvVGltZShkdXJhdGlvbiwgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCkgOiBudWxsO1xuXG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2JiLWNhcmQgY2xhc3M9XCJzYmItY2FyZC1zcGFjaW5nLTR4LXh4cyBzYmItdGltZXRhYmxlX19yb3ctY2FyZFwiIGlkPSR7aWR9PlxuICAgICAgICA8c2JiLWNhcmQtYnV0dG9uXG4gICAgICAgICAgP2FjdGl2ZT0ke3RoaXMuYWN0aXZlfVxuICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9JHt0aGlzLmFjY2Vzc2liaWxpdHlFeHBhbmRlZCA/ICd0cnVlJyA6IG5vdGhpbmd9XG4gICAgICAgID5cbiAgICAgICAgICAke3RoaXMuY2FyZEFjdGlvbkxhYmVsID8gdGhpcy5jYXJkQWN0aW9uTGFiZWwgOiB0aGlzLl9nZXRBY2Nlc3NpYmlsaXR5VGV4dCh0aGlzLnRyaXApfVxuICAgICAgICA8L3NiYi1jYXJkLWJ1dHRvbj5cbiAgICAgICAgJHt0aGlzLmxvYWRpbmdQcmljZSA/IGh0bWxgPGRpdiBjbGFzcz1cInNiYi1sb2FkaW5nX19iYWRnZVwiIHNsb3Q9XCJiYWRnZVwiPjwvZGl2PmAgOiBub3RoaW5nfVxuICAgICAgICAke3RoaXMucHJpY2UgJiYgIXRoaXMubG9hZGluZ1ByaWNlXG4gICAgICAgICAgPyBodG1sYDxzYmItY2FyZC1iYWRnZSBjb2xvcj0ke3RoaXMucHJpY2UuaXNEaXNjb3VudCA/ICdjaGFyY29hbCcgOiAnd2hpdGUnfT5cbiAgICAgICAgICAgICAgJHt0aGlzLnByaWNlLmlzRGlzY291bnRcbiAgICAgICAgICAgICAgICA/IGh0bWxgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICU8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgID4ke2kxOG5TdXBlcnNhdmVyW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfTwvc3BhblxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+YFxuICAgICAgICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgICAgICAgJHt0aGlzLnByaWNlLnRleHQgPyBodG1sYDxzcGFuPiR7dGhpcy5wcmljZS50ZXh0fTwvc3Bhbj5gIDogbm90aGluZ31cbiAgICAgICAgICAgICAgJHt0aGlzLnByaWNlLnByaWNlID8gaHRtbGA8c3Bhbj4ke3RoaXMucHJpY2UucHJpY2V9PC9zcGFuPmAgOiBub3RoaW5nfVxuICAgICAgICAgICAgPC9zYmItY2FyZC1iYWRnZT5gXG4gICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLXRpbWV0YWJsZV9fcm93XCIgcm9sZT1cInJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItdGltZXRhYmxlX19yb3ctaGVhZGVyXCIgcm9sZT1cImdyaWRjZWxsXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLXRpbWV0YWJsZV9fcm93LWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgJHtwcm9kdWN0Py5jb3Jwb3JhdGVJZGVudGl0eVBpY3RvZ3JhbSAmJlxuICAgICAgICAgICAgICBodG1sYDxzcGFuIGNsYXNzPVwic2JiLXRpbWV0YWJsZV9fcm93LXRyYW5zcG9ydC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgPHNiYi1pY29uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNiYi10aW1ldGFibGVfX3Jvdy10cmFuc3BvcnQtaWNvblwiXG4gICAgICAgICAgICAgICAgICBuYW1lPVwicGljdG86JHtwcm9kdWN0LmNvcnBvcmF0ZUlkZW50aXR5UGljdG9ncmFtfVwiXG4gICAgICAgICAgICAgICAgPjwvc2JiLWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmItc2NyZWVuLXJlYWRlci1vbmx5XCI+XG4gICAgICAgICAgICAgICAgICAke3Byb2R1Y3QgJiZcbiAgICAgICAgICAgICAgICAgIHByb2R1Y3QudmVoaWNsZU1vZGUgJiZcbiAgICAgICAgICAgICAgICAgIGkxOG5NZWFuc09mVHJhbnNwb3J0W3Byb2R1Y3QudmVoaWNsZU1vZGUudG9Mb3dlckNhc2UoKV0gJiZcbiAgICAgICAgICAgICAgICAgIGkxOG5NZWFuc09mVHJhbnNwb3J0W3Byb2R1Y3QudmVoaWNsZU1vZGUudG9Mb3dlckNhc2UoKV1bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19XG4gICAgICAgICAgICAgICAgICAmbmJzcDtcbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5gfVxuICAgICAgICAgICAgICAke3Byb2R1Y3QgJiZcbiAgICAgICAgICAgICAgKHByb2R1Y3QuY29ycG9yYXRlSWRlbnRpdHlJY29uXG4gICAgICAgICAgICAgICAgPyByZW5kZXJJY29uUHJvZHVjdChwcm9kdWN0LmNvcnBvcmF0ZUlkZW50aXR5SWNvbiwgcHJvZHVjdC5uYW1lKVxuICAgICAgICAgICAgICAgIDogcHJvZHVjdC52ZWhpY2xlU3ViTW9kZVNob3J0TmFtZSAmJlxuICAgICAgICAgICAgICAgICAgcmVuZGVyU3RyaW5nUHJvZHVjdChwcm9kdWN0LnZlaGljbGVTdWJNb2RlU2hvcnROYW1lLCBwcm9kdWN0Py5saW5lKSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICR7ZGlyZWN0aW9uXG4gICAgICAgICAgICAgID8gaHRtbGA8cD4ke2Ake2kxOG5EaXJlY3Rpb25bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19ICR7ZGlyZWN0aW9ufWB9PC9wPmBcbiAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzYmItcGVhcmwtY2hhaW4tdGltZVxuICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgIC5sZWdzPSR7bGVnc31cbiAgICAgICAgICAgIC5kZXBhcnR1cmVUaW1lPSR7ZGVwYXJ0dXJlPy50aW1lfVxuICAgICAgICAgICAgLmFycml2YWxUaW1lPSR7YXJyaXZhbD8udGltZX1cbiAgICAgICAgICAgIC5kZXBhcnR1cmVXYWxrPSR7ZGVwYXJ0dXJlV2Fsa31cbiAgICAgICAgICAgIC5hcnJpdmFsV2Fsaz0ke2Fycml2YWxXYWxrfVxuICAgICAgICAgICAgP2Rpc2FibGUtYW5pbWF0aW9uPSR7dGhpcy5kaXNhYmxlQW5pbWF0aW9ufVxuICAgICAgICAgICAgP2ExMXktZm9vdHBhdGg9JHt0aGlzLmExMXlGb290cGF0aH1cbiAgICAgICAgICAgIC5ub3c9JHt0aGlzLm5vd31cbiAgICAgICAgICA+PC9zYmItcGVhcmwtY2hhaW4tdGltZT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLXRpbWV0YWJsZV9fcm93LWZvb3RlclwiIHJvbGU9XCJncmlkY2VsbFwiPlxuICAgICAgICAgICAgJHtwcm9kdWN0ICYmIGRlcGFydHVyZT8ucXVheUZvcm1hdHRlZFxuICAgICAgICAgICAgICA/IGh0bWxgPHNwYW5cbiAgICAgICAgICAgICAgICAgIGNsYXNzPSR7ZGVwYXJ0dXJlPy5xdWF5Q2hhbmdlZCA/IGBzYmItdGltZXRhYmxlX19yb3ctcXVheS0tY2hhbmdlZGAgOiBub3RoaW5nfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JiLXNjcmVlbi1yZWFkZXItb25seVwiPlxuICAgICAgICAgICAgICAgICAgICAke2Ake2kxOG5EZXBhcnR1cmVbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19ICR7XG4gICAgICAgICAgICAgICAgICAgICAgZGVwYXJ0dXJlPy5xdWF5Q2hhbmdlZCA/IGkxOG5OZXdbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0gOiAnJ1xuICAgICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgICAgJm5ic3A7XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAke3RoaXMuX3JlbmRlclF1YXlUeXBlKCl9ICR7ZGVwYXJ0dXJlPy5xdWF5Rm9ybWF0dGVkfVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5gXG4gICAgICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgICAgICR7KG9jY3VwYW5jeT8uZmlyc3RDbGFzcyAmJiBvY2N1cGFuY3k/LmZpcnN0Q2xhc3MgIT09ICdVTktOT1dOJykgfHxcbiAgICAgICAgICAgIChvY2N1cGFuY3k/LnNlY29uZENsYXNzICYmIG9jY3VwYW5jeS5zZWNvbmRDbGFzcyAhPT0gJ1VOS05PV04nKVxuICAgICAgICAgICAgICA/IGh0bWxgPHNiYi10aW1ldGFibGUtb2NjdXBhbmN5XG4gICAgICAgICAgICAgICAgICAuZmlyc3RDbGFzc09jY3VwYW5jeT0ke29jY3VwYW5jeT8uZmlyc3RDbGFzcz8udG9Mb3dlckNhc2UoKX1cbiAgICAgICAgICAgICAgICAgIC5zZWNvbmRDbGFzc09jY3VwYW5jeT0ke29jY3VwYW5jeT8uc2Vjb25kQ2xhc3M/LnRvTG93ZXJDYXNlKCl9XG4gICAgICAgICAgICAgICAgPjwvc2JiLXRpbWV0YWJsZS1vY2N1cGFuY3k+YFxuICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgICAkeyhub3RpY2VBdHRyaWJ1dGVzICYmIG5vdGljZUF0dHJpYnV0ZXMubGVuZ3RoKSB8fCB0aGlzLmJvYXJkaW5nXG4gICAgICAgICAgICAgID8gaHRtbGA8dWwgY2xhc3M9XCJzYmItdGltZXRhYmxlX19yb3ctaGludHNcIiByb2xlPVwibGlzdFwiPlxuICAgICAgICAgICAgICAgICAgJHtub3RpY2VBdHRyaWJ1dGVzPy5tYXAoKG5vdGljZSwgaW5kZXgpID0+XG4gICAgICAgICAgICAgICAgICAgIGluZGV4IDwgNFxuICAgICAgICAgICAgICAgICAgICAgID8gaHRtbGA8bGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzYmItaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2JiLXRyYXZlbC1oaW50c19faXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0keydzYS0nICsgbm90aWNlLm5hbWU/LnRvTG93ZXJDYXNlKCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L3NiYi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIj4ke25vdGljZS50ZXh0Py50ZW1wbGF0ZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPmBcbiAgICAgICAgICAgICAgICAgICAgICA6IG5vdGhpbmcsXG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgJHt0aGlzLmJvYXJkaW5nXG4gICAgICAgICAgICAgICAgICAgID8gaHRtbGA8bGk+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2JiLWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzYmItdHJhdmVsLWhpbnRzX19pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ke3RoaXMuYm9hcmRpbmc/Lm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9JHt0aGlzLmJvYXJkaW5nPy50ZXh0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NiYi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbGk+YFxuICAgICAgICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgICAgICAgPC91bD5gXG4gICAgICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgICAgICR7ZHVyYXRpb24gJiYgZHVyYXRpb24gPiAwXG4gICAgICAgICAgICAgID8gaHRtbGA8dGltZT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JiLXNjcmVlbi1yZWFkZXItb25seVwiPlxuICAgICAgICAgICAgICAgICAgICAke2Ake2kxOG5UcmlwRHVyYXRpb25bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19ICR7ZHVyYXRpb25PYmohLmxvbmd9YH1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiR7ZHVyYXRpb25PYmohLnNob3J0fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3RpbWU+YFxuICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgICAke2hhc0hpbUN1cyAmJiAoaGltQ3VzLmN1cyB8fCBoaW1DdXMuaGltKVxuICAgICAgICAgICAgICA/IGh0bWxgPHNwYW4gY2xhc3M9XCJzYmItdGltZXRhYmxlX19yb3ctd2FybmluZ1wiPlxuICAgICAgICAgICAgICAgICAgPHNiYi1pY29uIG5hbWU9JHsoaGltQ3VzLmN1cyB8fCBoaW1DdXMuaGltKSEubmFtZX0+PC9zYmItaWNvbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JiLXNjcmVlbi1yZWFkZXItb25seVwiPiR7KGhpbUN1cy5jdXMgfHwgaGltQ3VzLmhpbSkhLnRleHR9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5gXG4gICAgICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NiYi1jYXJkPlxuICAgIGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgJ3NiYi10aW1ldGFibGUtcm93JzogU2JiVGltZXRhYmxlUm93RWxlbWVudDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQ3dF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