@sbb-esta/lyne-elements-experimental 2.6.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/core/datetime/date-helper.js +191 -0
  2. package/core/datetime.d.ts +3 -0
  3. package/core/datetime.d.ts.map +1 -1
  4. package/core/datetime.js +3 -189
  5. package/core/timetable/access-leg-helper.js +94 -0
  6. package/core/timetable/timetable-helper.js +13 -0
  7. package/core/timetable/timetable-properties.js +1 -0
  8. package/core/timetable.d.ts +3 -0
  9. package/core/timetable.d.ts.map +1 -1
  10. package/core/timetable.js +6 -102
  11. package/custom-elements.json +598 -439
  12. package/development/core/datetime/date-helper.js +285 -0
  13. package/development/core/datetime.d.ts +3 -0
  14. package/development/core/datetime.d.ts.map +1 -1
  15. package/development/core/datetime.js +2 -281
  16. package/development/core/timetable/access-leg-helper.js +128 -0
  17. package/development/core/timetable/timetable-helper.js +21 -0
  18. package/development/core/timetable/timetable-properties.js +2 -0
  19. package/development/core/timetable.d.ts +3 -0
  20. package/development/core/timetable.d.ts.map +1 -1
  21. package/development/core/timetable.js +3 -139
  22. package/development/{differenceInMinutes-Cmyza6nm.js → differenceInMinutes-CHSyWiQs.js} +2 -2
  23. package/development/{format-BU7bjY-L.js → format-D0-yhzi4.js} +3 -3
  24. package/development/{isValid-DO_pHwcW.js → isValid-Bo4R7iA7.js} +2 -2
  25. package/development/journey-summary/journey-summary.js +297 -0
  26. package/development/journey-summary.d.ts +3 -0
  27. package/development/journey-summary.d.ts.map +1 -1
  28. package/development/journey-summary.js +2 -294
  29. package/development/pearl-chain/pearl-chain.js +649 -0
  30. package/development/pearl-chain-time/pearl-chain-time.js +315 -0
  31. package/development/pearl-chain-time.d.ts +3 -0
  32. package/development/pearl-chain-time.d.ts.map +1 -1
  33. package/development/pearl-chain-time.js +2 -312
  34. package/development/pearl-chain-vertical/pearl-chain-vertical.js +45 -0
  35. package/development/pearl-chain-vertical-item/pearl-chain-vertical-item.js +395 -0
  36. package/development/pearl-chain-vertical-item.d.ts +3 -0
  37. package/development/pearl-chain-vertical-item.d.ts.map +1 -1
  38. package/development/pearl-chain-vertical-item.js +2 -392
  39. package/development/pearl-chain-vertical.d.ts +3 -0
  40. package/development/pearl-chain-vertical.d.ts.map +1 -1
  41. package/development/pearl-chain-vertical.js +2 -42
  42. package/development/pearl-chain.d.ts +3 -0
  43. package/development/pearl-chain.d.ts.map +1 -1
  44. package/development/pearl-chain.js +2 -646
  45. package/development/timetable-duration/timetable-duration.js +119 -0
  46. package/development/timetable-duration.d.ts +3 -0
  47. package/development/timetable-duration.d.ts.map +1 -1
  48. package/development/timetable-duration.js +2 -116
  49. package/development/timetable-row/timetable-row.js +820 -0
  50. package/development/timetable-row.d.ts +3 -0
  51. package/development/timetable-row.d.ts.map +1 -1
  52. package/development/timetable-row.js +2 -810
  53. package/development/{toDate-B6IBgPYH.js → toDate-D_Vjps95.js} +5 -5
  54. package/{differenceInMinutes-BI2zjbtS.js → differenceInMinutes-BMqUZdhj.js} +1 -1
  55. package/{format-CUYwLzoN.js → format-Dg8rkk7h.js} +2 -2
  56. package/index.d.ts +7 -7
  57. package/index.js +7 -7
  58. package/{isValid-mroh13Xp.js → isValid-DJ69OMZJ.js} +6 -6
  59. package/journey-summary/journey-summary.js +190 -0
  60. package/journey-summary.d.ts +3 -0
  61. package/journey-summary.d.ts.map +1 -1
  62. package/journey-summary.js +2 -188
  63. package/package.json +3 -3
  64. package/pearl-chain/pearl-chain.js +177 -0
  65. package/pearl-chain-time/pearl-chain-time.js +153 -0
  66. package/pearl-chain-time.d.ts +3 -0
  67. package/pearl-chain-time.d.ts.map +1 -1
  68. package/pearl-chain-time.js +2 -151
  69. package/pearl-chain-vertical/pearl-chain-vertical.js +23 -0
  70. package/pearl-chain-vertical-item/pearl-chain-vertical-item.js +71 -0
  71. package/pearl-chain-vertical-item.d.ts +3 -0
  72. package/pearl-chain-vertical-item.d.ts.map +1 -1
  73. package/pearl-chain-vertical-item.js +2 -69
  74. package/pearl-chain-vertical.d.ts +3 -0
  75. package/pearl-chain-vertical.d.ts.map +1 -1
  76. package/pearl-chain-vertical.js +2 -21
  77. package/pearl-chain.d.ts +3 -0
  78. package/pearl-chain.d.ts.map +1 -1
  79. package/pearl-chain.js +2 -175
  80. package/timetable-duration/timetable-duration.js +55 -0
  81. package/timetable-duration.d.ts +3 -0
  82. package/timetable-duration.d.ts.map +1 -1
  83. package/timetable-duration.js +2 -53
  84. package/timetable-row/timetable-row.js +462 -0
  85. package/timetable-row.d.ts +3 -0
  86. package/timetable-row.d.ts.map +1 -1
  87. package/timetable-row.js +9 -460
  88. package/{toDate-DQg4ZFnf.js → toDate-BCXKL_wM.js} +4 -4
  89. package/development/pearl-chain/pearl-chain.sample-data.d.ts +0 -141
  90. package/development/pearl-chain/pearl-chain.sample-data.d.ts.map +0 -1
  91. package/development/timetable-duration/timetable-duration.sample-data.d.ts +0 -6
  92. package/development/timetable-duration/timetable-duration.sample-data.d.ts.map +0 -1
  93. package/development/timetable-row/timetable-row.sample-data.d.ts +0 -25
  94. package/development/timetable-row/timetable-row.sample-data.d.ts.map +0 -1
  95. package/pearl-chain/pearl-chain.sample-data.d.ts +0 -141
  96. package/pearl-chain/pearl-chain.sample-data.d.ts.map +0 -1
  97. package/timetable-duration/timetable-duration.sample-data.d.ts +0 -6
  98. package/timetable-duration/timetable-duration.sample-data.d.ts.map +0 -1
  99. package/timetable-row/timetable-row.sample-data.d.ts +0 -25
  100. package/timetable-row/timetable-row.sample-data.d.ts.map +0 -1
@@ -0,0 +1,649 @@
1
+ var __typeError = (msg) => {
2
+ throw TypeError(msg);
3
+ };
4
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
5
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
6
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
7
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
8
+ import { __runInitializers, __esDecorate } from "tslib";
9
+ import { defaultDateAdapter } from "@sbb-esta/lyne-elements/core/datetime.js";
10
+ import { forceType } from "@sbb-esta/lyne-elements/core/decorators.js";
11
+ import { css, LitElement, html, nothing } from "lit";
12
+ import { customElement, property } from "lit/decorators.js";
13
+ import { styleMap } from "lit/directives/style-map.js";
14
+ import { removeTimezoneFromISOTimeString } from "../core/datetime.js";
15
+ import { isRideLeg } from "../core/timetable.js";
16
+ import { d as differenceInMinutes, a as addMinutes } from "../differenceInMinutes-CHSyWiQs.js";
17
+ import { t as toDate } from "../toDate-D_Vjps95.js";
18
+ function isAfter(date, dateToCompare) {
19
+ return +toDate(date) > +toDate(dateToCompare);
20
+ }
21
+ function isBefore(date, dateToCompare) {
22
+ return +toDate(date) < +toDate(dateToCompare);
23
+ }
24
+ const style = css`*,
25
+ ::before,
26
+ ::after {
27
+ box-sizing: border-box;
28
+ }
29
+
30
+ :host {
31
+ --sbb-pearl-chain-height: var(--sbb-border-width-2x);
32
+ --sbb-pearl-chain-spacing-small: 0.125rem;
33
+ --sbb-pearl-chain-color: var(--sbb-pearl-chain-bullet-color);
34
+ --sbb-pearl-chain-color-disruption: var(--sbb-pearl-chain-bullet-color-disruption);
35
+ --sbb-pearl-chain-color-past: var(--sbb-pearl-chain-bullet-color-past);
36
+ --sbb-pearl-chain-leg-width: 100%;
37
+ display: block;
38
+ --sbb-pearl-chain-bullet-size-start-end: 0.625rem;
39
+ --sbb-pearl-chain-bullet-size-stop: 0.5rem;
40
+ --sbb-pearl-chain-bullet-color: var(--sbb-color-charcoal);
41
+ --sbb-pearl-chain-bullet-color-past: var(--sbb-color-metal);
42
+ --sbb-pearl-chain-bullet-color-irrelevant: var(--sbb-color-metal);
43
+ --sbb-pearl-chain-bullet-color-disruption: var(--sbb-color-red);
44
+ --sbb-pearl-chain-bullet-border-width: var(--sbb-border-width-2x);
45
+ --sbb-pearl-chain-bullet-animation-duration: 1920ms;
46
+ --sbb-pearl-chain-bullet-animation-easing: ease-out;
47
+ --sbb-pearl-chain-bullet-crossed-width: 0.88375rem;
48
+ --sbb-pearl-chain-bullet-crossed-height: 0.21875rem;
49
+ --sbb-pearl-chain-bullet-crossed-border-width: 0.09375rem;
50
+ }
51
+
52
+ .sbb-pearl-chain {
53
+ position: relative;
54
+ display: flex;
55
+ justify-content: space-between;
56
+ flex-wrap: nowrap;
57
+ color: var(--sbb-pearl-chain-color);
58
+ width: 100%;
59
+ padding-block: calc((var(--sbb-pearl-chain-bullet-size-start-end) - var(--sbb-pearl-chain-height)) / 2);
60
+ padding-inline-end: var(--sbb-pearl-chain-bullet-size-start-end);
61
+ }
62
+
63
+ .sbb-pearl-chain__bullet {
64
+ min-height: var(--sbb-pearl-chain-bullet-size-start-end);
65
+ min-width: var(--sbb-pearl-chain-bullet-size-start-end);
66
+ height: var(--sbb-pearl-chain-bullet-size-start-end);
67
+ width: var(--sbb-pearl-chain-bullet-size-start-end);
68
+ background: var(--sbb-pearl-chain-bullet-color);
69
+ color: var(--sbb-pearl-chain-bullet-color);
70
+ border-color: var(--sbb-pearl-chain-bullet-color);
71
+ border-radius: 100%;
72
+ }
73
+ @media (forced-colors: active) {
74
+ .sbb-pearl-chain__bullet {
75
+ --sbb-pearl-chain-bullet-color: CanvasText;
76
+ }
77
+ }
78
+ .sbb-pearl-chain__bullet {
79
+ content: "";
80
+ position: absolute;
81
+ background-color: currentcolor;
82
+ inset-block-start: 0;
83
+ z-index: 3;
84
+ }
85
+
86
+ .sbb-pearl-chain__bullet:first-of-type {
87
+ inset-inline-start: 0;
88
+ }
89
+
90
+ .sbb-pearl-chain__bullet:last-of-type {
91
+ inset-inline-end: 0;
92
+ }
93
+
94
+ .sbb-pearl-chain__leg {
95
+ flex-shrink: 0;
96
+ flex-grow: 0;
97
+ position: relative;
98
+ height: var(--sbb-pearl-chain-height);
99
+ border-inline-end: var(--sbb-pearl-chain-spacing-small) solid Canvas;
100
+ background-color: currentcolor;
101
+ width: var(--sbb-pearl-chain-leg-width);
102
+ display: flex;
103
+ align-items: center;
104
+ }
105
+ @media (forced-colors: active) {
106
+ .sbb-pearl-chain__leg {
107
+ background-color: CanvasText;
108
+ }
109
+ .sbb-pearl-chain--past .sbb-pearl-chain__leg {
110
+ background-color: GrayText;
111
+ }
112
+ }
113
+
114
+ .sbb-pearl-chain__leg:last-of-type {
115
+ border: none;
116
+ }
117
+
118
+ .sbb-pearl-chain__stop {
119
+ position: relative;
120
+ z-index: 2;
121
+ background: var(--sbb-pearl-chain-bullet-color);
122
+ color: var(--sbb-pearl-chain-bullet-color);
123
+ border-color: var(--sbb-pearl-chain-bullet-color);
124
+ border-radius: 100%;
125
+ }
126
+ @media (forced-colors: active) {
127
+ .sbb-pearl-chain__stop {
128
+ --sbb-pearl-chain-bullet-color: CanvasText;
129
+ }
130
+ }
131
+ .sbb-pearl-chain__stop {
132
+ min-height: var(--sbb-pearl-chain-bullet-size-stop);
133
+ min-width: var(--sbb-pearl-chain-bullet-size-stop);
134
+ height: var(--sbb-pearl-chain-bullet-size-stop);
135
+ width: var(--sbb-pearl-chain-bullet-size-stop);
136
+ border: var(--sbb-pearl-chain-bullet-border-width) solid currentcolor;
137
+ background: Canvas;
138
+ }
139
+
140
+ .sbb-pearl-chain__bullet--future {
141
+ background: var(--sbb-pearl-chain-bullet-color);
142
+ color: var(--sbb-pearl-chain-bullet-color);
143
+ border-color: var(--sbb-pearl-chain-bullet-color);
144
+ border-radius: 100%;
145
+ }
146
+ @media (forced-colors: active) {
147
+ .sbb-pearl-chain__bullet--future {
148
+ --sbb-pearl-chain-bullet-color: CanvasText;
149
+ }
150
+ }
151
+
152
+ .sbb-pearl-chain__leg--past,
153
+ .sbb-pearl-chain--past,
154
+ .sbb-pearl-chain__leg--past::after,
155
+ .sbb-pearl-chain__leg--progress::after,
156
+ .sbb-pearl-chain__leg--progress .sbb-pearl-chain__stop,
157
+ .sbb-pearl-chain--progress,
158
+ .sbb-pearl-chain__bullet--past {
159
+ color: var(--sbb-pearl-chain-color-past);
160
+ --sbb-pearl-chain-bullet-color: var(--sbb-pearl-chain-bullet-color-past);
161
+ }
162
+ @media (forced-colors: active) {
163
+ .sbb-pearl-chain__leg--past,
164
+ .sbb-pearl-chain--past,
165
+ .sbb-pearl-chain__leg--past::after,
166
+ .sbb-pearl-chain__leg--progress::after,
167
+ .sbb-pearl-chain__leg--progress .sbb-pearl-chain__stop,
168
+ .sbb-pearl-chain--progress,
169
+ .sbb-pearl-chain__bullet--past {
170
+ --sbb-pearl-chain-bullet-color: GrayText !important;
171
+ }
172
+ }
173
+ @media (forced-colors: active) {
174
+ .sbb-pearl-chain__leg--past,
175
+ .sbb-pearl-chain--past,
176
+ .sbb-pearl-chain__leg--past::after,
177
+ .sbb-pearl-chain__leg--progress::after,
178
+ .sbb-pearl-chain__leg--progress .sbb-pearl-chain__stop,
179
+ .sbb-pearl-chain--progress,
180
+ .sbb-pearl-chain__bullet--past {
181
+ background-color: GrayText !important;
182
+ }
183
+ }
184
+
185
+ .sbb-pearl-chain__bullet--progress {
186
+ background: var(--sbb-pearl-chain-bullet-color);
187
+ --sbb-pearl-chain-bullet-color: var(--sbb-pearl-chain-bullet-color-past);
188
+ }
189
+ @media (forced-colors: active) {
190
+ .sbb-pearl-chain__bullet--progress {
191
+ --sbb-pearl-chain-bullet-color: GrayText !important;
192
+ }
193
+ }
194
+
195
+ .sbb-pearl-chain__bullet--departure-disruption,
196
+ .sbb-pearl-chain--arrival-disruption,
197
+ .sbb-pearl-chain--departure-disruption,
198
+ .sbb-pearl-chain__leg--disruption {
199
+ color: var(--sbb-pearl-chain-color-disruption);
200
+ --sbb-pearl-chain-bullet-color: var(--sbb-pearl-chain-bullet-color-disruption);
201
+ }
202
+ @media (forced-colors: active) {
203
+ .sbb-pearl-chain__bullet--departure-disruption,
204
+ .sbb-pearl-chain--arrival-disruption,
205
+ .sbb-pearl-chain--departure-disruption,
206
+ .sbb-pearl-chain__leg--disruption {
207
+ --sbb-pearl-chain-bullet-color: Highlight;
208
+ }
209
+ }
210
+ @media (forced-colors: active) {
211
+ .sbb-pearl-chain__bullet--departure-disruption,
212
+ .sbb-pearl-chain--arrival-disruption,
213
+ .sbb-pearl-chain--departure-disruption,
214
+ .sbb-pearl-chain__leg--disruption {
215
+ color: Highlight;
216
+ background: Highlight;
217
+ }
218
+ }
219
+
220
+ .sbb-pearl-chain__leg--disruption .sbb-pearl-chain__stop {
221
+ --sbb-pearl-chain-bullet-color: var(--sbb-pearl-chain-bullet-color-disruption);
222
+ }
223
+ @media (forced-colors: active) {
224
+ .sbb-pearl-chain__leg--disruption .sbb-pearl-chain__stop {
225
+ --sbb-pearl-chain-bullet-color: Highlight;
226
+ }
227
+ }
228
+
229
+ .sbb-pearl-chain__leg--past .sbb-pearl-chain__stop {
230
+ --sbb-pearl-chain-bullet-color: var(--sbb-pearl-chain-bullet-color-past);
231
+ }
232
+ @media (forced-colors: active) {
233
+ .sbb-pearl-chain__leg--past .sbb-pearl-chain__stop {
234
+ --sbb-pearl-chain-bullet-color: GrayText !important;
235
+ }
236
+ }
237
+
238
+ .sbb-pearl-chain__leg--disruption::after {
239
+ background-color: unset;
240
+ background-image: linear-gradient(to right, currentcolor 0%, currentcolor 50%, Canvas 50%);
241
+ background-repeat: repeat-x;
242
+ background-size: calc(2 * var(--sbb-pearl-chain-spacing-small)) var(--sbb-pearl-chain-height);
243
+ inset-inline-end: var(--sbb-pearl-chain-height);
244
+ }
245
+ @media (forced-colors: active) {
246
+ .sbb-pearl-chain__leg--disruption::after {
247
+ background: unset;
248
+ border-block-start: 0.0625rem dashed Highlight;
249
+ transform: translateY(0.0625rem);
250
+ }
251
+ }
252
+
253
+ .sbb-pearl-chain__leg--skipped {
254
+ color: var(--sbb-pearl-chain-color-disruption);
255
+ }
256
+ .sbb-pearl-chain__leg--skipped::after {
257
+ background-color: unset;
258
+ background-image: linear-gradient(to right, currentcolor 0%, currentcolor 50%, Canvas 50%);
259
+ background-repeat: repeat-x;
260
+ background-size: calc(2 * var(--sbb-pearl-chain-spacing-small)) var(--sbb-pearl-chain-height);
261
+ inset-inline-end: var(--sbb-pearl-chain-height);
262
+ }
263
+ @media (forced-colors: active) {
264
+ .sbb-pearl-chain__leg--skipped::after {
265
+ background: unset;
266
+ border-block-start: 0.0625rem dashed Highlight;
267
+ transform: translateY(0.0625rem);
268
+ }
269
+ }
270
+
271
+ .sbb-pearl-chain__stop--departure-skipped {
272
+ min-height: var(--sbb-pearl-chain-bullet-size-stop);
273
+ min-width: var(--sbb-pearl-chain-bullet-size-stop);
274
+ height: var(--sbb-pearl-chain-bullet-size-stop);
275
+ width: var(--sbb-pearl-chain-bullet-size-stop);
276
+ border: var(--sbb-pearl-chain-bullet-border-width) solid currentcolor;
277
+ background: Canvas;
278
+ border: var(--sbb-pearl-chain-bullet-border-width) solid currentcolor;
279
+ background: Canvas;
280
+ }
281
+ .sbb-pearl-chain__stop--departure-skipped::before {
282
+ content: "";
283
+ position: absolute;
284
+ inset-block-start: 50%;
285
+ inset-inline-start: 50%;
286
+ transform: translate(-50%, -50%) rotate(45deg);
287
+ border-block-start: var(--sbb-pearl-chain-bullet-crossed-border-width) solid canvas;
288
+ background: var(--sbb-pearl-chain-bullet-color-disruption);
289
+ height: var(--sbb-pearl-chain-bullet-crossed-height);
290
+ width: var(--sbb-pearl-chain-bullet-crossed-width);
291
+ }
292
+ @media (forced-colors: active) {
293
+ .sbb-pearl-chain__stop--departure-skipped::before {
294
+ background: Highlight;
295
+ }
296
+ }
297
+
298
+ .sbb-pearl-chain--arrival-skipped,
299
+ .sbb-pearl-chain--departure-skipped {
300
+ min-height: var(--sbb-pearl-chain-bullet-size-start-end);
301
+ min-width: var(--sbb-pearl-chain-bullet-size-start-end);
302
+ height: var(--sbb-pearl-chain-bullet-size-start-end);
303
+ width: var(--sbb-pearl-chain-bullet-size-start-end);
304
+ border: var(--sbb-pearl-chain-bullet-border-width) solid currentcolor;
305
+ background: Canvas;
306
+ }
307
+ .sbb-pearl-chain--arrival-skipped::before,
308
+ .sbb-pearl-chain--departure-skipped::before {
309
+ content: "";
310
+ position: absolute;
311
+ inset-block-start: 50%;
312
+ inset-inline-start: 50%;
313
+ transform: translate(-50%, -50%) rotate(45deg);
314
+ border-block-start: var(--sbb-pearl-chain-bullet-crossed-border-width) solid canvas;
315
+ background: var(--sbb-pearl-chain-bullet-color-disruption);
316
+ height: var(--sbb-pearl-chain-bullet-crossed-height);
317
+ width: var(--sbb-pearl-chain-bullet-crossed-width);
318
+ }
319
+ @media (forced-colors: active) {
320
+ .sbb-pearl-chain--arrival-skipped::before,
321
+ .sbb-pearl-chain--departure-skipped::before {
322
+ background: Highlight;
323
+ }
324
+ }
325
+
326
+ .sbb-pearl-chain__leg::after {
327
+ content: "";
328
+ position: absolute;
329
+ inset-block: 0;
330
+ inset-inline-start: 0;
331
+ background-color: currentcolor;
332
+ border-radius: var(--sbb-pearl-chain-height);
333
+ z-index: 1;
334
+ }
335
+ @media (forced-colors: active) {
336
+ .sbb-pearl-chain__leg::after {
337
+ background-color: CanvasText;
338
+ }
339
+ .sbb-pearl-chain--past .sbb-pearl-chain__leg::after {
340
+ background-color: GrayText;
341
+ }
342
+ }
343
+
344
+ .sbb-pearl-chain__leg:last-of-type::after {
345
+ inset-inline-end: calc(-1 * var(--sbb-pearl-chain-height));
346
+ }
347
+
348
+ .sbb-pearl-chain__leg--progress::after {
349
+ background-color: var(--sbb-pearl-chain-color-past);
350
+ width: var(--sbb-pearl-chain-leg-status);
351
+ }
352
+
353
+ .sbb-pearl-chain__position {
354
+ min-height: var(--sbb-pearl-chain-bullet-size-start-end);
355
+ min-width: var(--sbb-pearl-chain-bullet-size-start-end);
356
+ height: var(--sbb-pearl-chain-bullet-size-start-end);
357
+ width: var(--sbb-pearl-chain-bullet-size-start-end);
358
+ background: var(--sbb-pearl-chain-bullet-color);
359
+ color: var(--sbb-pearl-chain-bullet-color);
360
+ border-color: var(--sbb-pearl-chain-bullet-color);
361
+ border-radius: 100%;
362
+ }
363
+ @media (forced-colors: active) {
364
+ .sbb-pearl-chain__position {
365
+ --sbb-pearl-chain-bullet-color: CanvasText;
366
+ }
367
+ }
368
+ .sbb-pearl-chain__position {
369
+ --sbb-pearl-chain-bullet-color: var(--sbb-pearl-chain-bullet-color-disruption);
370
+ }
371
+ @media (forced-colors: active) {
372
+ .sbb-pearl-chain__position {
373
+ --sbb-pearl-chain-bullet-color: Highlight;
374
+ }
375
+ }
376
+ @keyframes pearl-chain-bullet-position-pulse {
377
+ 0% {
378
+ box-shadow: 0 0 0 0 var(--sbb-pearl-chain-bullet-color-disruption);
379
+ }
380
+ 25% {
381
+ box-shadow: 0 0 0 0 var(--sbb-pearl-chain-bullet-color-disruption);
382
+ }
383
+ 50% {
384
+ box-shadow: 0 0 0 0.1875rem var(--sbb-color-red-alpha-20);
385
+ }
386
+ 100% {
387
+ box-shadow: 0 0 0 0 var(--sbb-pearl-chain-bullet-color-disruption);
388
+ }
389
+ }
390
+ .sbb-pearl-chain__position {
391
+ animation: pearl-chain-bullet-position-pulse var(--sbb-pearl-chain-bullet-animation-duration) var(--sbb-pearl-chain-bullet-animation-easing) infinite;
392
+ }
393
+ .sbb-pearl-chain__position {
394
+ position: absolute;
395
+ inset-block-start: -200%;
396
+ z-index: 4;
397
+ inset-inline-start: var(--sbb-pearl-chain-status-position);
398
+ }
399
+
400
+ .sbb-pearl-chain__position--no-animation {
401
+ animation: unset;
402
+ }
403
+
404
+ .sbb-screen-reader-only {
405
+ border: 0;
406
+ clip: rect(0 0 0 0);
407
+ height: 1px;
408
+ margin: -1px;
409
+ overflow: hidden;
410
+ padding: 0;
411
+ position: absolute;
412
+ white-space: nowrap;
413
+ width: 1px;
414
+ }`;
415
+ let SbbPearlChainElement = (() => {
416
+ var _legs_accessor_storage, _disableAnimation_accessor_storage, _a;
417
+ let _classDecorators = [customElement("sbb-pearl-chain")];
418
+ let _classDescriptor;
419
+ let _classExtraInitializers = [];
420
+ let _classThis;
421
+ let _classSuper = LitElement;
422
+ let _instanceExtraInitializers = [];
423
+ let _legs_decorators;
424
+ let _legs_initializers = [];
425
+ let _legs_extraInitializers = [];
426
+ let _disableAnimation_decorators;
427
+ let _disableAnimation_initializers = [];
428
+ let _disableAnimation_extraInitializers = [];
429
+ let _set_now_decorators;
430
+ _a = class extends _classSuper {
431
+ constructor() {
432
+ super(...arguments);
433
+ __privateAdd(this, _legs_accessor_storage);
434
+ __privateAdd(this, _disableAnimation_accessor_storage);
435
+ __privateSet(this, _legs_accessor_storage, (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _legs_initializers, [])));
436
+ __privateSet(this, _disableAnimation_accessor_storage, (__runInitializers(this, _legs_extraInitializers), __runInitializers(this, _disableAnimation_initializers, false)));
437
+ this._now = (__runInitializers(this, _disableAnimation_extraInitializers), null);
438
+ }
439
+ /**
440
+ * Define the legs of the pearl-chain.
441
+ * Format:
442
+ * `{"legs": [{"duration": 25}, ...]}`
443
+ * `duration` in minutes. Duration of the leg is relative
444
+ * to the total travel time. Example: departure 16:30, change at 16:40,
445
+ * arrival at 17:00. So the change should have a duration of 33.33%.
446
+ */
447
+ get legs() {
448
+ return __privateGet(this, _legs_accessor_storage);
449
+ }
450
+ set legs(value) {
451
+ __privateSet(this, _legs_accessor_storage, value);
452
+ }
453
+ /**
454
+ * Per default, the current location has a pulsating animation. You can
455
+ * disable the animation with this property.
456
+ */
457
+ get disableAnimation() {
458
+ return __privateGet(this, _disableAnimation_accessor_storage);
459
+ }
460
+ set disableAnimation(value) {
461
+ __privateSet(this, _disableAnimation_accessor_storage, value);
462
+ }
463
+ /** A configured date which acts as the current date instead of the real current date. Recommended for testing purposes. */
464
+ set now(value) {
465
+ this._now = defaultDateAdapter.getValidDateOrNull(defaultDateAdapter.deserialize(value));
466
+ }
467
+ get now() {
468
+ return this._now;
469
+ }
470
+ _getAllDuration(legs) {
471
+ return legs == null ? void 0 : legs.reduce((sum, leg) => {
472
+ var _a2, _b;
473
+ const arrivalNoTz = removeTimezoneFromISOTimeString((_a2 = leg.arrival) == null ? void 0 : _a2.time);
474
+ const departureNoTz = removeTimezoneFromISOTimeString((_b = leg.departure) == null ? void 0 : _b.time);
475
+ if (arrivalNoTz && departureNoTz) {
476
+ return sum + differenceInMinutes(removeTimezoneFromISOTimeString(leg.arrival.time), removeTimezoneFromISOTimeString(leg.departure.time));
477
+ }
478
+ return sum;
479
+ }, 0);
480
+ }
481
+ _isAllCancelled(legs) {
482
+ return legs == null ? void 0 : legs.every((leg) => {
483
+ var _a2, _b;
484
+ return (_b = (_a2 = leg == null ? void 0 : leg.serviceJourney) == null ? void 0 : _a2.serviceAlteration) == null ? void 0 : _b.cancelled;
485
+ });
486
+ }
487
+ _getRelativeDuration(legs, leg) {
488
+ var _a2, _b;
489
+ const arrivalNoTz = removeTimezoneFromISOTimeString((_a2 = leg.arrival) == null ? void 0 : _a2.time);
490
+ const departureNoTz = removeTimezoneFromISOTimeString((_b = leg.departure) == null ? void 0 : _b.time);
491
+ if (arrivalNoTz && departureNoTz) {
492
+ const duration = differenceInMinutes(removeTimezoneFromISOTimeString(leg.arrival.time), removeTimezoneFromISOTimeString(leg.departure.time));
493
+ const allDurations = this._getAllDuration(legs);
494
+ if (allDurations === 0) {
495
+ return 100;
496
+ }
497
+ return duration / allDurations * 100;
498
+ }
499
+ return 0;
500
+ }
501
+ _getProgress(now, start, end) {
502
+ if (!(start == null ? void 0 : start.time) || !(end == null ? void 0 : end.time)) {
503
+ return 0;
504
+ }
505
+ const startWithDelay = addMinutes(start.time, start.delay ?? 0);
506
+ const endWithDelay = addMinutes(end.time, end.delay ?? 0);
507
+ const total = differenceInMinutes(endWithDelay, startWithDelay);
508
+ const progress = differenceInMinutes(now, startWithDelay);
509
+ return total && progress / total * 100;
510
+ }
511
+ _getStatus(now, start, end) {
512
+ const startWithDelay = start && start.time && addMinutes(start.time, start.delay ?? 0);
513
+ const endWithDelay = end && end.time && addMinutes(end.time, end.delay ?? 0);
514
+ if (startWithDelay && isBefore(startWithDelay, now) && endWithDelay && isAfter(endWithDelay, now)) {
515
+ return "progress";
516
+ } else if (endWithDelay && isBefore(endWithDelay, now)) {
517
+ return "past";
518
+ }
519
+ return "future";
520
+ }
521
+ _renderPosition(now, start, end) {
522
+ const currentPosition = this._getProgress(now, start, end);
523
+ if (currentPosition < 0 && currentPosition > 100)
524
+ return void 0;
525
+ const statusStyle = () => {
526
+ return {
527
+ "--sbb-pearl-chain-status-position": `${currentPosition}%`,
528
+ ...currentPosition >= 50 ? { transform: `translateX(-100%)` } : {}
529
+ };
530
+ };
531
+ const animation = this.disableAnimation ? "sbb-pearl-chain__position--no-animation" : "";
532
+ return html`<span
533
+ style=${styleMap(statusStyle())}
534
+ class="sbb-pearl-chain__position ${animation}"
535
+ ></span>`;
536
+ }
537
+ render() {
538
+ var _a2, _b, _c, _d, _e;
539
+ const now = this.now ?? /* @__PURE__ */ new Date();
540
+ const rideLegs = (_a2 = this.legs) == null ? void 0 : _a2.filter((leg) => isRideLeg(leg));
541
+ const departureTime = (rideLegs == null ? void 0 : rideLegs.length) && removeTimezoneFromISOTimeString((_c = (_b = rideLegs[0]) == null ? void 0 : _b.departure) == null ? void 0 : _c.time);
542
+ const departureWithDelay = departureTime && {
543
+ time: departureTime,
544
+ delay: rideLegs[0].departure.delay ?? 0
545
+ };
546
+ const arrivalTime = (rideLegs == null ? void 0 : rideLegs.length) && removeTimezoneFromISOTimeString((_d = rideLegs[rideLegs.length - 1].arrival) == null ? void 0 : _d.time);
547
+ const arrivalTimeDelay = arrivalTime && {
548
+ time: arrivalTime,
549
+ delay: ((_e = rideLegs[rideLegs.length - 1]) == null ? void 0 : _e.arrival.delay) ?? 0
550
+ };
551
+ const departureNotServiced = (() => {
552
+ var _a3, _b2, _c2, _d2;
553
+ return rideLegs && ((_b2 = (_a3 = rideLegs[0]) == null ? void 0 : _a3.serviceJourney) == null ? void 0 : _b2.stopPoints) && ((_d2 = (_c2 = rideLegs[0]) == null ? void 0 : _c2.serviceJourney) == null ? void 0 : _d2.stopPoints[0].stopStatus) === "NOT_SERVICED" ? "sbb-pearl-chain--departure-skipped" : "";
554
+ })();
555
+ const arrivalNotServiced = (() => {
556
+ var _a3;
557
+ const lastLeg = rideLegs && rideLegs[rideLegs.length - 1];
558
+ const stops = lastLeg && ((_a3 = lastLeg.serviceJourney) == null ? void 0 : _a3.stopPoints);
559
+ return stops && stops[stops.length - 1].stopStatus === "NOT_SERVICED" ? "sbb-pearl-chain--arrival-skipped" : "";
560
+ })();
561
+ const departureCancelClass = (() => {
562
+ var _a3, _b2, _c2;
563
+ return rideLegs && ((_c2 = (_b2 = (_a3 = rideLegs[0]) == null ? void 0 : _a3.serviceJourney) == null ? void 0 : _b2.serviceAlteration) == null ? void 0 : _c2.cancelled) ? "sbb-pearl-chain--departure-disruption" : "";
564
+ })();
565
+ const arrivalCancelClass = (() => {
566
+ var _a3, _b2, _c2;
567
+ return rideLegs && ((_c2 = (_b2 = (_a3 = rideLegs[rideLegs.length - 1]) == null ? void 0 : _a3.serviceJourney) == null ? void 0 : _b2.serviceAlteration) == null ? void 0 : _c2.cancelled) ? "sbb-pearl-chain--arrival-disruption" : "";
568
+ })();
569
+ const status = departureWithDelay && arrivalTimeDelay && this._getStatus(now, departureWithDelay, arrivalTimeDelay);
570
+ const statusClassDeparture = rideLegs && status && !departureCancelClass ? "sbb-pearl-chain__bullet--" + status : "";
571
+ const statusClassArrival = rideLegs && status && !arrivalCancelClass ? "sbb-pearl-chain__bullet--" + this._getStatus(now, void 0, arrivalTimeDelay) : "";
572
+ if (this._isAllCancelled(rideLegs)) {
573
+ return html`
574
+ <div class="sbb-pearl-chain">
575
+ <span class="sbb-pearl-chain__bullet sbb-pearl-chain--departure-disruption"></span>
576
+ <div class="sbb-pearl-chain__leg sbb-pearl-chain__leg--disruption"></div>
577
+ <span class="sbb-pearl-chain__bullet sbb-pearl-chain--departure-disruption"></span>
578
+ </div>
579
+ `;
580
+ }
581
+ return html`
582
+ <div class="sbb-pearl-chain">
583
+ <span
584
+ class="sbb-pearl-chain__bullet ${statusClassDeparture} ${departureNotServiced} ${departureCancelClass}"
585
+ ></span>
586
+ ${rideLegs == null ? void 0 : rideLegs.map((leg, index) => {
587
+ var _a3, _b2, _c2, _d2, _e2, _f, _g, _h;
588
+ const { stopPoints, serviceAlteration } = (leg == null ? void 0 : leg.serviceJourney) || {};
589
+ const duration = this._getRelativeDuration(rideLegs, leg);
590
+ const departure = removeTimezoneFromISOTimeString((_a3 = leg.departure) == null ? void 0 : _a3.time);
591
+ const arrival = removeTimezoneFromISOTimeString((_b2 = leg.arrival) == null ? void 0 : _b2.time);
592
+ const isArrivalNotServiced = stopPoints && ((_c2 = stopPoints[stopPoints.length - 1]) == null ? void 0 : _c2.stopStatus) === "NOT_SERVICED";
593
+ const isArrivalPlanned = stopPoints && ((_d2 = stopPoints[stopPoints.length - 1]) == null ? void 0 : _d2.stopStatus) === "PLANNED";
594
+ const isDepartureNotServiced = stopPoints && ((_e2 = stopPoints[0]) == null ? void 0 : _e2.stopStatus) === "NOT_SERVICED";
595
+ const stopPointsBefore = index > 0 && rideLegs[index - 1].serviceJourney.stopPoints;
596
+ const isBeforeLegArrivalNotServiced = stopPointsBefore && ((_f = stopPointsBefore[stopPointsBefore.length - 1]) == null ? void 0 : _f.stopStatus) === "NOT_SERVICED";
597
+ const skippedLeg = isArrivalNotServiced || isDepartureNotServiced && isArrivalPlanned ? "sbb-pearl-chain__leg--skipped" : "";
598
+ const departureSkippedBullet = isDepartureNotServiced || isBeforeLegArrivalNotServiced ? "sbb-pearl-chain__stop--departure-skipped" : "";
599
+ const cancelled = (serviceAlteration == null ? void 0 : serviceAlteration.cancelled) ? "sbb-pearl-chain__leg--disruption" : "";
600
+ const legDepartureWithDelay = { time: departure, delay: ((_g = leg.departure) == null ? void 0 : _g.delay) ?? 0 };
601
+ const legArrivalWithDelay = { time: arrival, delay: ((_h = leg.arrival) == null ? void 0 : _h.delay) ?? 0 };
602
+ const status2 = this._getStatus(now, legDepartureWithDelay, legArrivalWithDelay);
603
+ const legStatus = !cancelled && !skippedLeg && "sbb-pearl-chain__leg--" + status2;
604
+ const legStyle = () => {
605
+ return {
606
+ "--sbb-pearl-chain-leg-width": `${duration}%`,
607
+ ...status2 === "progress" && !cancelled && !skippedLeg ? {
608
+ "--sbb-pearl-chain-leg-status": `${this._getProgress(now, legDepartureWithDelay, legArrivalWithDelay)}%`
609
+ } : {}
610
+ };
611
+ };
612
+ return html` <div
613
+ class="sbb-pearl-chain__leg ${legStatus || ""} ${cancelled} ${skippedLeg}"
614
+ style=${styleMap(legStyle())}
615
+ >
616
+ ${index > 0 && index < rideLegs.length ? html`<span class="sbb-pearl-chain__stop ${departureSkippedBullet}"></span>` : nothing}
617
+ ${status2 === "progress" && !cancelled && !skippedLeg ? this._renderPosition(now, legDepartureWithDelay, legArrivalWithDelay) : nothing}
618
+ </div>`;
619
+ })}
620
+ <span
621
+ class="sbb-pearl-chain__bullet ${statusClassArrival} ${arrivalNotServiced} ${arrivalCancelClass}"
622
+ ></span>
623
+ </div>
624
+ `;
625
+ }
626
+ }, _legs_accessor_storage = new WeakMap(), _disableAnimation_accessor_storage = new WeakMap(), _classThis = _a, (() => {
627
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
628
+ _legs_decorators = [property({ type: Array })];
629
+ _disableAnimation_decorators = [forceType(), property({ attribute: "disable-animation", type: Boolean })];
630
+ _set_now_decorators = [property()];
631
+ __esDecorate(_a, null, _legs_decorators, { kind: "accessor", name: "legs", static: false, private: false, access: { has: (obj) => "legs" in obj, get: (obj) => obj.legs, set: (obj, value) => {
632
+ obj.legs = value;
633
+ } }, metadata: _metadata }, _legs_initializers, _legs_extraInitializers);
634
+ __esDecorate(_a, null, _disableAnimation_decorators, { kind: "accessor", name: "disableAnimation", static: false, private: false, access: { has: (obj) => "disableAnimation" in obj, get: (obj) => obj.disableAnimation, set: (obj, value) => {
635
+ obj.disableAnimation = value;
636
+ } }, metadata: _metadata }, _disableAnimation_initializers, _disableAnimation_extraInitializers);
637
+ __esDecorate(_a, null, _set_now_decorators, { kind: "setter", name: "now", static: false, private: false, access: { has: (obj) => "now" in obj, set: (obj, value) => {
638
+ obj.now = value;
639
+ } }, metadata: _metadata }, null, _instanceExtraInitializers);
640
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
641
+ _classThis = _classDescriptor.value;
642
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
643
+ })(), _a.styles = style, __runInitializers(_classThis, _classExtraInitializers), _a;
644
+ return _classThis;
645
+ })();
646
+ export {
647
+ SbbPearlChainElement
648
+ };
649
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVhcmwtY2hhaW4uanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0FmdGVyLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzQmVmb3JlLmpzIiwiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC9wZWFybC1jaGFpbi9wZWFybC1jaGFpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBAbmFtZSBpc0FmdGVyXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IElzIHRoZSBmaXJzdCBkYXRlIGFmdGVyIHRoZSBzZWNvbmQgb25lP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogSXMgdGhlIGZpcnN0IGRhdGUgYWZ0ZXIgdGhlIHNlY29uZCBvbmU/XG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0aGF0IHNob3VsZCBiZSBhZnRlciB0aGUgb3RoZXIgb25lIHRvIHJldHVybiB0cnVlXG4gKiBAcGFyYW0gZGF0ZVRvQ29tcGFyZSAtIFRoZSBkYXRlIHRvIGNvbXBhcmUgd2l0aFxuICpcbiAqIEByZXR1cm5zIFRoZSBmaXJzdCBkYXRlIGlzIGFmdGVyIHRoZSBzZWNvbmQgZGF0ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJcyAxMCBKdWx5IDE5ODkgYWZ0ZXIgMTEgRmVicnVhcnkgMTk4Nz9cbiAqIGNvbnN0IHJlc3VsdCA9IGlzQWZ0ZXIobmV3IERhdGUoMTk4OSwgNiwgMTApLCBuZXcgRGF0ZSgxOTg3LCAxLCAxMSkpXG4gKiAvLz0+IHRydWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWZ0ZXIoZGF0ZSwgZGF0ZVRvQ29tcGFyZSkge1xuICByZXR1cm4gK3RvRGF0ZShkYXRlKSA+ICt0b0RhdGUoZGF0ZVRvQ29tcGFyZSk7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgaXNBZnRlcjtcbiIsImltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIEBuYW1lIGlzQmVmb3JlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IElzIHRoZSBmaXJzdCBkYXRlIGJlZm9yZSB0aGUgc2Vjb25kIG9uZT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIElzIHRoZSBmaXJzdCBkYXRlIGJlZm9yZSB0aGUgc2Vjb25kIG9uZT9cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRoYXQgc2hvdWxkIGJlIGJlZm9yZSB0aGUgb3RoZXIgb25lIHRvIHJldHVybiB0cnVlXG4gKiBAcGFyYW0gZGF0ZVRvQ29tcGFyZSAtIFRoZSBkYXRlIHRvIGNvbXBhcmUgd2l0aFxuICpcbiAqIEByZXR1cm5zIFRoZSBmaXJzdCBkYXRlIGlzIGJlZm9yZSB0aGUgc2Vjb25kIGRhdGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSXMgMTAgSnVseSAxOTg5IGJlZm9yZSAxMSBGZWJydWFyeSAxOTg3P1xuICogY29uc3QgcmVzdWx0ID0gaXNCZWZvcmUobmV3IERhdGUoMTk4OSwgNiwgMTApLCBuZXcgRGF0ZSgxOTg3LCAxLCAxMSkpXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0JlZm9yZShkYXRlLCBkYXRlVG9Db21wYXJlKSB7XG4gIHJldHVybiArdG9EYXRlKGRhdGUpIDwgK3RvRGF0ZShkYXRlVG9Db21wYXJlKTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBpc0JlZm9yZTtcbiIsImltcG9ydCB7IGRlZmF1bHREYXRlQWRhcHRlciB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvZGF0ZXRpbWUuanMnO1xuaW1wb3J0IHsgZm9yY2VUeXBlIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB0eXBlIHsgU2JiRGF0ZUxpa2UgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2ludGVyZmFjZXMvdHlwZXMnO1xuaW1wb3J0IHsgYWRkTWludXRlcywgZGlmZmVyZW5jZUluTWludXRlcywgaXNBZnRlciwgaXNCZWZvcmUgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgdHlwZSB7IENTU1Jlc3VsdEdyb3VwLCBUZW1wbGF0ZVJlc3VsdCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50LCBub3RoaW5nIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgc3R5bGVNYXAgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9zdHlsZS1tYXAuanMnO1xuXG5pbXBvcnQgeyByZW1vdmVUaW1lem9uZUZyb21JU09UaW1lU3RyaW5nIH0gZnJvbSAnLi4vY29yZS9kYXRldGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IExlZywgUHRSaWRlTGVnIH0gZnJvbSAnLi4vY29yZS90aW1ldGFibGUuanMnO1xuaW1wb3J0IHsgaXNSaWRlTGVnIH0gZnJvbSAnLi4vY29yZS90aW1ldGFibGUuanMnO1xuXG5pbXBvcnQgc3R5bGUgZnJvbSAnLi9wZWFybC1jaGFpbi5zY3NzP2xpdCZpbmxpbmUnO1xuXG50eXBlIFN0YXR1cyA9ICdwcm9ncmVzcycgfCAnZnV0dXJlJyB8ICdwYXN0JztcbnR5cGUgVGltZSA9IHtcbiAgdGltZT86IERhdGU7XG4gIGRlbGF5OiBudW1iZXI7XG59O1xuXG4vKipcbiAqIEl0IHZpc3VhbGx5IGRpc3BsYXlzIGpvdXJuZXkgaW5mb3JtYXRpb24uXG4gKi9cbmV4cG9ydFxuQGN1c3RvbUVsZW1lbnQoJ3NiYi1wZWFybC1jaGFpbicpXG5jbGFzcyBTYmJQZWFybENoYWluRWxlbWVudCBleHRlbmRzIExpdEVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZTtcblxuICAvKipcbiAgICogRGVmaW5lIHRoZSBsZWdzIG9mIHRoZSBwZWFybC1jaGFpbi5cbiAgICogRm9ybWF0OlxuICAgKiBge1wibGVnc1wiOiBbe1wiZHVyYXRpb25cIjogMjV9LCAuLi5dfWBcbiAgICogYGR1cmF0aW9uYCBpbiBtaW51dGVzLiBEdXJhdGlvbiBvZiB0aGUgbGVnIGlzIHJlbGF0aXZlXG4gICAqIHRvIHRoZSB0b3RhbCB0cmF2ZWwgdGltZS4gRXhhbXBsZTogZGVwYXJ0dXJlIDE2OjMwLCBjaGFuZ2UgYXQgMTY6NDAsXG4gICAqIGFycml2YWwgYXQgMTc6MDAuIFNvIHRoZSBjaGFuZ2Ugc2hvdWxkIGhhdmUgYSBkdXJhdGlvbiBvZiAzMy4zMyUuXG4gICAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSBwdWJsaWMgYWNjZXNzb3IgbGVnczogKExlZyB8IFB0UmlkZUxlZylbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBQZXIgZGVmYXVsdCwgdGhlIGN1cnJlbnQgbG9jYXRpb24gaGFzIGEgcHVsc2F0aW5nIGFuaW1hdGlvbi4gWW91IGNhblxuICAgKiBkaXNhYmxlIHRoZSBhbmltYXRpb24gd2l0aCB0aGlzIHByb3BlcnR5LlxuICAgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2Rpc2FibGUtYW5pbWF0aW9uJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgZGlzYWJsZUFuaW1hdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBBIGNvbmZpZ3VyZWQgZGF0ZSB3aGljaCBhY3RzIGFzIHRoZSBjdXJyZW50IGRhdGUgaW5zdGVhZCBvZiB0aGUgcmVhbCBjdXJyZW50IGRhdGUuIFJlY29tbWVuZGVkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLiAqL1xuICBAcHJvcGVydHkoKVxuICBwdWJsaWMgc2V0IG5vdyh2YWx1ZTogU2JiRGF0ZUxpa2UgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ub3cgPSBkZWZhdWx0RGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKGRlZmF1bHREYXRlQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuICB9XG4gIHB1YmxpYyBnZXQgbm93KCk6IERhdGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbm93O1xuICB9XG4gIHByaXZhdGUgX25vdzogRGF0ZSB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX2dldEFsbER1cmF0aW9uKGxlZ3M6IFB0UmlkZUxlZ1tdKTogbnVtYmVyIHtcbiAgICByZXR1cm4gbGVncz8ucmVkdWNlKChzdW06IG51bWJlciwgbGVnKSA9PiB7XG4gICAgICBjb25zdCBhcnJpdmFsTm9UeiA9IHJlbW92ZVRpbWV6b25lRnJvbUlTT1RpbWVTdHJpbmcobGVnLmFycml2YWw/LnRpbWUpO1xuICAgICAgY29uc3QgZGVwYXJ0dXJlTm9UeiA9IHJlbW92ZVRpbWV6b25lRnJvbUlTT1RpbWVTdHJpbmcobGVnLmRlcGFydHVyZT8udGltZSk7XG4gICAgICBpZiAoYXJyaXZhbE5vVHogJiYgZGVwYXJ0dXJlTm9Ueikge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHN1bSArXG4gICAgICAgICAgZGlmZmVyZW5jZUluTWludXRlcyhcbiAgICAgICAgICAgIHJlbW92ZVRpbWV6b25lRnJvbUlTT1RpbWVTdHJpbmcobGVnLmFycml2YWwudGltZSkhLFxuICAgICAgICAgICAgcmVtb3ZlVGltZXpvbmVGcm9tSVNPVGltZVN0cmluZyhsZWcuZGVwYXJ0dXJlLnRpbWUpISxcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VtO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNBbGxDYW5jZWxsZWQobGVnczogUHRSaWRlTGVnW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gbGVncz8uZXZlcnkoKGxlZykgPT4gbGVnPy5zZXJ2aWNlSm91cm5leT8uc2VydmljZUFsdGVyYXRpb24/LmNhbmNlbGxlZCk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZWxhdGl2ZUR1cmF0aW9uKGxlZ3M6IFB0UmlkZUxlZ1tdLCBsZWc6IFB0UmlkZUxlZyk6IG51bWJlciB7XG4gICAgY29uc3QgYXJyaXZhbE5vVHogPSByZW1vdmVUaW1lem9uZUZyb21JU09UaW1lU3RyaW5nKGxlZy5hcnJpdmFsPy50aW1lKTtcbiAgICBjb25zdCBkZXBhcnR1cmVOb1R6ID0gcmVtb3ZlVGltZXpvbmVGcm9tSVNPVGltZVN0cmluZyhsZWcuZGVwYXJ0dXJlPy50aW1lKTtcbiAgICBpZiAoYXJyaXZhbE5vVHogJiYgZGVwYXJ0dXJlTm9Ueikge1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBkaWZmZXJlbmNlSW5NaW51dGVzKFxuICAgICAgICByZW1vdmVUaW1lem9uZUZyb21JU09UaW1lU3RyaW5nKGxlZy5hcnJpdmFsLnRpbWUpISxcbiAgICAgICAgcmVtb3ZlVGltZXpvbmVGcm9tSVNPVGltZVN0cmluZyhsZWcuZGVwYXJ0dXJlLnRpbWUpISxcbiAgICAgICk7XG4gICAgICBjb25zdCBhbGxEdXJhdGlvbnMgPSB0aGlzLl9nZXRBbGxEdXJhdGlvbihsZWdzKTtcblxuICAgICAgaWYgKGFsbER1cmF0aW9ucyA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMTAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKGR1cmF0aW9uIC8gYWxsRHVyYXRpb25zKSAqIDEwMDtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBwcml2YXRlIF9nZXRQcm9ncmVzcyhub3c6IERhdGUsIHN0YXJ0PzogVGltZSwgZW5kPzogVGltZSk6IG51bWJlciB7XG4gICAgaWYgKCFzdGFydD8udGltZSB8fCAhZW5kPy50aW1lKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydFdpdGhEZWxheSA9IGFkZE1pbnV0ZXMoc3RhcnQudGltZSwgc3RhcnQuZGVsYXkgPz8gMCk7XG4gICAgY29uc3QgZW5kV2l0aERlbGF5ID0gYWRkTWludXRlcyhlbmQudGltZSwgZW5kLmRlbGF5ID8/IDApO1xuICAgIGNvbnN0IHRvdGFsID0gZGlmZmVyZW5jZUluTWludXRlcyhlbmRXaXRoRGVsYXksIHN0YXJ0V2l0aERlbGF5KTtcbiAgICBjb25zdCBwcm9ncmVzcyA9IGRpZmZlcmVuY2VJbk1pbnV0ZXMobm93LCBzdGFydFdpdGhEZWxheSk7XG5cbiAgICByZXR1cm4gdG90YWwgJiYgKHByb2dyZXNzIC8gdG90YWwpICogMTAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U3RhdHVzKG5vdzogRGF0ZSwgc3RhcnQ/OiBUaW1lLCBlbmQ/OiBUaW1lKTogU3RhdHVzIHtcbiAgICBjb25zdCBzdGFydFdpdGhEZWxheSA9IHN0YXJ0ICYmIHN0YXJ0LnRpbWUgJiYgYWRkTWludXRlcyhzdGFydC50aW1lLCBzdGFydC5kZWxheSA/PyAwKTtcbiAgICBjb25zdCBlbmRXaXRoRGVsYXkgPSBlbmQgJiYgZW5kLnRpbWUgJiYgYWRkTWludXRlcyhlbmQudGltZSwgZW5kLmRlbGF5ID8/IDApO1xuXG4gICAgaWYgKFxuICAgICAgc3RhcnRXaXRoRGVsYXkgJiZcbiAgICAgIGlzQmVmb3JlKHN0YXJ0V2l0aERlbGF5LCBub3cpICYmXG4gICAgICBlbmRXaXRoRGVsYXkgJiZcbiAgICAgIGlzQWZ0ZXIoZW5kV2l0aERlbGF5LCBub3cpXG4gICAgKSB7XG4gICAgICByZXR1cm4gJ3Byb2dyZXNzJztcbiAgICB9IGVsc2UgaWYgKGVuZFdpdGhEZWxheSAmJiBpc0JlZm9yZShlbmRXaXRoRGVsYXksIG5vdykpIHtcbiAgICAgIHJldHVybiAncGFzdCc7XG4gICAgfVxuICAgIHJldHVybiAnZnV0dXJlJztcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlclBvc2l0aW9uKG5vdzogRGF0ZSwgc3RhcnQ/OiBUaW1lLCBlbmQ/OiBUaW1lKTogVGVtcGxhdGVSZXN1bHQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGN1cnJlbnRQb3NpdGlvbiA9IHRoaXMuX2dldFByb2dyZXNzKG5vdywgc3RhcnQsIGVuZCk7XG4gICAgaWYgKGN1cnJlbnRQb3NpdGlvbiA8IDAgJiYgY3VycmVudFBvc2l0aW9uID4gMTAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgc3RhdHVzU3R5bGUgPSAoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnLS1zYmItcGVhcmwtY2hhaW4tc3RhdHVzLXBvc2l0aW9uJzogYCR7Y3VycmVudFBvc2l0aW9ufSVgLFxuICAgICAgICAuLi4oY3VycmVudFBvc2l0aW9uID49IDUwID8geyB0cmFuc2Zvcm06IGB0cmFuc2xhdGVYKC0xMDAlKWAgfSA6IHt9KSxcbiAgICAgIH07XG4gICAgfTtcblxuICAgIGNvbnN0IGFuaW1hdGlvbiA9IHRoaXMuZGlzYWJsZUFuaW1hdGlvbiA/ICdzYmItcGVhcmwtY2hhaW5fX3Bvc2l0aW9uLS1uby1hbmltYXRpb24nIDogJyc7XG5cbiAgICByZXR1cm4gaHRtbGA8c3BhblxuICAgICAgc3R5bGU9JHtzdHlsZU1hcChzdGF0dXNTdHlsZSgpKX1cbiAgICAgIGNsYXNzPVwic2JiLXBlYXJsLWNoYWluX19wb3NpdGlvbiAke2FuaW1hdGlvbn1cIlxuICAgID48L3NwYW4+YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZW5kZXIoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IG5vdyA9IHRoaXMubm93ID8/IG5ldyBEYXRlKCk7XG5cbiAgICBjb25zdCByaWRlTGVnczogUHRSaWRlTGVnW10gPSB0aGlzLmxlZ3M/LmZpbHRlcigobGVnKSA9PiBpc1JpZGVMZWcobGVnKSkgYXMgUHRSaWRlTGVnW107XG5cbiAgICBjb25zdCBkZXBhcnR1cmVUaW1lID1cbiAgICAgIHJpZGVMZWdzPy5sZW5ndGggJiYgcmVtb3ZlVGltZXpvbmVGcm9tSVNPVGltZVN0cmluZyhyaWRlTGVnc1swXT8uZGVwYXJ0dXJlPy50aW1lKTtcbiAgICBjb25zdCBkZXBhcnR1cmVXaXRoRGVsYXkgPSBkZXBhcnR1cmVUaW1lICYmIHtcbiAgICAgIHRpbWU6IGRlcGFydHVyZVRpbWUsXG4gICAgICBkZWxheTogcmlkZUxlZ3NbMF0uZGVwYXJ0dXJlLmRlbGF5ID8/IDAsXG4gICAgfTtcblxuICAgIGNvbnN0IGFycml2YWxUaW1lID1cbiAgICAgIHJpZGVMZWdzPy5sZW5ndGggJiZcbiAgICAgIHJlbW92ZVRpbWV6b25lRnJvbUlTT1RpbWVTdHJpbmcocmlkZUxlZ3NbcmlkZUxlZ3MubGVuZ3RoIC0gMV0uYXJyaXZhbD8udGltZSk7XG4gICAgY29uc3QgYXJyaXZhbFRpbWVEZWxheSA9IGFycml2YWxUaW1lICYmIHtcbiAgICAgIHRpbWU6IGFycml2YWxUaW1lLFxuICAgICAgZGVsYXk6IHJpZGVMZWdzW3JpZGVMZWdzLmxlbmd0aCAtIDFdPy5hcnJpdmFsLmRlbGF5ID8/IDAsXG4gICAgfTtcblxuICAgIGNvbnN0IGRlcGFydHVyZU5vdFNlcnZpY2VkID0gKCgpOiBzdHJpbmcgPT4ge1xuICAgICAgcmV0dXJuIHJpZGVMZWdzICYmXG4gICAgICAgIHJpZGVMZWdzWzBdPy5zZXJ2aWNlSm91cm5leT8uc3RvcFBvaW50cyAmJlxuICAgICAgICByaWRlTGVnc1swXT8uc2VydmljZUpvdXJuZXk/LnN0b3BQb2ludHNbMF0uc3RvcFN0YXR1cyA9PT0gJ05PVF9TRVJWSUNFRCdcbiAgICAgICAgPyAnc2JiLXBlYXJsLWNoYWluLS1kZXBhcnR1cmUtc2tpcHBlZCdcbiAgICAgICAgOiAnJztcbiAgICB9KSgpO1xuXG4gICAgY29uc3QgYXJyaXZhbE5vdFNlcnZpY2VkID0gKCgpOiBzdHJpbmcgPT4ge1xuICAgICAgY29uc3QgbGFzdExlZyA9IHJpZGVMZWdzICYmIHJpZGVMZWdzW3JpZGVMZWdzLmxlbmd0aCAtIDFdO1xuICAgICAgY29uc3Qgc3RvcHMgPSBsYXN0TGVnICYmIGxhc3RMZWcuc2VydmljZUpvdXJuZXk/LnN0b3BQb2ludHM7XG5cbiAgICAgIHJldHVybiBzdG9wcyAmJiBzdG9wc1tzdG9wcy5sZW5ndGggLSAxXS5zdG9wU3RhdHVzID09PSAnTk9UX1NFUlZJQ0VEJ1xuICAgICAgICA/ICdzYmItcGVhcmwtY2hhaW4tLWFycml2YWwtc2tpcHBlZCdcbiAgICAgICAgOiAnJztcbiAgICB9KSgpO1xuXG4gICAgY29uc3QgZGVwYXJ0dXJlQ2FuY2VsQ2xhc3MgPSAoKCk6IHN0cmluZyA9PiB7XG4gICAgICByZXR1cm4gcmlkZUxlZ3MgJiYgcmlkZUxlZ3NbMF0/LnNlcnZpY2VKb3VybmV5Py5zZXJ2aWNlQWx0ZXJhdGlvbj8uY2FuY2VsbGVkXG4gICAgICAgID8gJ3NiYi1wZWFybC1jaGFpbi0tZGVwYXJ0dXJlLWRpc3J1cHRpb24nXG4gICAgICAgIDogJyc7XG4gICAgfSkoKTtcblxuICAgIGNvbnN0IGFycml2YWxDYW5jZWxDbGFzcyA9ICgoKTogc3RyaW5nID0+IHtcbiAgICAgIHJldHVybiByaWRlTGVncyAmJiByaWRlTGVnc1tyaWRlTGVncy5sZW5ndGggLSAxXT8uc2VydmljZUpvdXJuZXk/LnNlcnZpY2VBbHRlcmF0aW9uPy5jYW5jZWxsZWRcbiAgICAgICAgPyAnc2JiLXBlYXJsLWNoYWluLS1hcnJpdmFsLWRpc3J1cHRpb24nXG4gICAgICAgIDogJyc7XG4gICAgfSkoKTtcblxuICAgIGNvbnN0IHN0YXR1cyA9XG4gICAgICBkZXBhcnR1cmVXaXRoRGVsYXkgJiZcbiAgICAgIGFycml2YWxUaW1lRGVsYXkgJiZcbiAgICAgIHRoaXMuX2dldFN0YXR1cyhub3csIGRlcGFydHVyZVdpdGhEZWxheSwgYXJyaXZhbFRpbWVEZWxheSk7XG5cbiAgICBjb25zdCBzdGF0dXNDbGFzc0RlcGFydHVyZSA9XG4gICAgICByaWRlTGVncyAmJiBzdGF0dXMgJiYgIWRlcGFydHVyZUNhbmNlbENsYXNzID8gJ3NiYi1wZWFybC1jaGFpbl9fYnVsbGV0LS0nICsgc3RhdHVzIDogJyc7XG5cbiAgICBjb25zdCBzdGF0dXNDbGFzc0Fycml2YWwgPVxuICAgICAgcmlkZUxlZ3MgJiYgc3RhdHVzICYmICFhcnJpdmFsQ2FuY2VsQ2xhc3NcbiAgICAgICAgPyAnc2JiLXBlYXJsLWNoYWluX19idWxsZXQtLScgKyB0aGlzLl9nZXRTdGF0dXMobm93LCB1bmRlZmluZWQsIGFycml2YWxUaW1lRGVsYXkpXG4gICAgICAgIDogJyc7XG5cbiAgICBpZiAodGhpcy5faXNBbGxDYW5jZWxsZWQocmlkZUxlZ3MpKSB7XG4gICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1wZWFybC1jaGFpblwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JiLXBlYXJsLWNoYWluX19idWxsZXQgc2JiLXBlYXJsLWNoYWluLS1kZXBhcnR1cmUtZGlzcnVwdGlvblwiPjwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLXBlYXJsLWNoYWluX19sZWcgc2JiLXBlYXJsLWNoYWluX19sZWctLWRpc3J1cHRpb25cIj48L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1wZWFybC1jaGFpbl9fYnVsbGV0IHNiYi1wZWFybC1jaGFpbi0tZGVwYXJ0dXJlLWRpc3J1cHRpb25cIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgYDtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItcGVhcmwtY2hhaW5cIj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cInNiYi1wZWFybC1jaGFpbl9fYnVsbGV0ICR7c3RhdHVzQ2xhc3NEZXBhcnR1cmV9ICR7ZGVwYXJ0dXJlTm90U2VydmljZWR9ICR7ZGVwYXJ0dXJlQ2FuY2VsQ2xhc3N9XCJcbiAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgJHtyaWRlTGVncz8ubWFwKChsZWc6IFB0UmlkZUxlZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgc3RvcFBvaW50cywgc2VydmljZUFsdGVyYXRpb24gfSA9IGxlZz8uc2VydmljZUpvdXJuZXkgfHwge307XG5cbiAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IHRoaXMuX2dldFJlbGF0aXZlRHVyYXRpb24ocmlkZUxlZ3MsIGxlZyk7XG4gICAgICAgICAgY29uc3QgZGVwYXJ0dXJlID0gcmVtb3ZlVGltZXpvbmVGcm9tSVNPVGltZVN0cmluZyhsZWcuZGVwYXJ0dXJlPy50aW1lKTtcbiAgICAgICAgICBjb25zdCBhcnJpdmFsID0gcmVtb3ZlVGltZXpvbmVGcm9tSVNPVGltZVN0cmluZyhsZWcuYXJyaXZhbD8udGltZSk7XG5cbiAgICAgICAgICBjb25zdCBpc0Fycml2YWxOb3RTZXJ2aWNlZCA9XG4gICAgICAgICAgICBzdG9wUG9pbnRzICYmIHN0b3BQb2ludHNbc3RvcFBvaW50cy5sZW5ndGggLSAxXT8uc3RvcFN0YXR1cyA9PT0gJ05PVF9TRVJWSUNFRCc7XG4gICAgICAgICAgY29uc3QgaXNBcnJpdmFsUGxhbm5lZCA9XG4gICAgICAgICAgICBzdG9wUG9pbnRzICYmIHN0b3BQb2ludHNbc3RvcFBvaW50cy5sZW5ndGggLSAxXT8uc3RvcFN0YXR1cyA9PT0gJ1BMQU5ORUQnO1xuICAgICAgICAgIGNvbnN0IGlzRGVwYXJ0dXJlTm90U2VydmljZWQgPSBzdG9wUG9pbnRzICYmIHN0b3BQb2ludHNbMF0/LnN0b3BTdGF0dXMgPT09ICdOT1RfU0VSVklDRUQnO1xuXG4gICAgICAgICAgY29uc3Qgc3RvcFBvaW50c0JlZm9yZSA9IGluZGV4ID4gMCAmJiByaWRlTGVnc1tpbmRleCAtIDFdLnNlcnZpY2VKb3VybmV5LnN0b3BQb2ludHM7XG4gICAgICAgICAgY29uc3QgaXNCZWZvcmVMZWdBcnJpdmFsTm90U2VydmljZWQgPVxuICAgICAgICAgICAgc3RvcFBvaW50c0JlZm9yZSAmJlxuICAgICAgICAgICAgc3RvcFBvaW50c0JlZm9yZVtzdG9wUG9pbnRzQmVmb3JlLmxlbmd0aCAtIDFdPy5zdG9wU3RhdHVzID09PSAnTk9UX1NFUlZJQ0VEJztcblxuICAgICAgICAgIGNvbnN0IHNraXBwZWRMZWcgPVxuICAgICAgICAgICAgaXNBcnJpdmFsTm90U2VydmljZWQgfHwgKGlzRGVwYXJ0dXJlTm90U2VydmljZWQgJiYgaXNBcnJpdmFsUGxhbm5lZClcbiAgICAgICAgICAgICAgPyAnc2JiLXBlYXJsLWNoYWluX19sZWctLXNraXBwZWQnXG4gICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgY29uc3QgZGVwYXJ0dXJlU2tpcHBlZEJ1bGxldCA9XG4gICAgICAgICAgICBpc0RlcGFydHVyZU5vdFNlcnZpY2VkIHx8IGlzQmVmb3JlTGVnQXJyaXZhbE5vdFNlcnZpY2VkXG4gICAgICAgICAgICAgID8gJ3NiYi1wZWFybC1jaGFpbl9fc3RvcC0tZGVwYXJ0dXJlLXNraXBwZWQnXG4gICAgICAgICAgICAgIDogJyc7XG5cbiAgICAgICAgICBjb25zdCBjYW5jZWxsZWQgPSBzZXJ2aWNlQWx0ZXJhdGlvbj8uY2FuY2VsbGVkID8gJ3NiYi1wZWFybC1jaGFpbl9fbGVnLS1kaXNydXB0aW9uJyA6ICcnO1xuXG4gICAgICAgICAgY29uc3QgbGVnRGVwYXJ0dXJlV2l0aERlbGF5ID0geyB0aW1lOiBkZXBhcnR1cmUsIGRlbGF5OiBsZWcuZGVwYXJ0dXJlPy5kZWxheSA/PyAwIH07XG4gICAgICAgICAgY29uc3QgbGVnQXJyaXZhbFdpdGhEZWxheSA9IHsgdGltZTogYXJyaXZhbCwgZGVsYXk6IGxlZy5hcnJpdmFsPy5kZWxheSA/PyAwIH07XG4gICAgICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5fZ2V0U3RhdHVzKG5vdywgbGVnRGVwYXJ0dXJlV2l0aERlbGF5LCBsZWdBcnJpdmFsV2l0aERlbGF5KTtcblxuICAgICAgICAgIGNvbnN0IGxlZ1N0YXR1cyA9ICFjYW5jZWxsZWQgJiYgIXNraXBwZWRMZWcgJiYgJ3NiYi1wZWFybC1jaGFpbl9fbGVnLS0nICsgc3RhdHVzO1xuICAgICAgICAgIGNvbnN0IGxlZ1N0eWxlID0gKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgJy0tc2JiLXBlYXJsLWNoYWluLWxlZy13aWR0aCc6IGAke2R1cmF0aW9ufSVgLFxuICAgICAgICAgICAgICAuLi4oc3RhdHVzID09PSAncHJvZ3Jlc3MnICYmICFjYW5jZWxsZWQgJiYgIXNraXBwZWRMZWdcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgJy0tc2JiLXBlYXJsLWNoYWluLWxlZy1zdGF0dXMnOiBgJHt0aGlzLl9nZXRQcm9ncmVzcyhub3csIGxlZ0RlcGFydHVyZVdpdGhEZWxheSwgbGVnQXJyaXZhbFdpdGhEZWxheSl9JWAsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICByZXR1cm4gaHRtbGAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJzYmItcGVhcmwtY2hhaW5fX2xlZyAke2xlZ1N0YXR1cyB8fCAnJ30gJHtjYW5jZWxsZWR9ICR7c2tpcHBlZExlZ31cIlxuICAgICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcChsZWdTdHlsZSgpKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICAke2luZGV4ID4gMCAmJiBpbmRleCA8IHJpZGVMZWdzLmxlbmd0aFxuICAgICAgICAgICAgICA/IGh0bWxgPHNwYW4gY2xhc3M9XCJzYmItcGVhcmwtY2hhaW5fX3N0b3AgJHtkZXBhcnR1cmVTa2lwcGVkQnVsbGV0fVwiPjwvc3Bhbj5gXG4gICAgICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgICAgICR7c3RhdHVzID09PSAncHJvZ3Jlc3MnICYmICFjYW5jZWxsZWQgJiYgIXNraXBwZWRMZWdcbiAgICAgICAgICAgICAgPyB0aGlzLl9yZW5kZXJQb3NpdGlvbihub3csIGxlZ0RlcGFydHVyZVdpdGhEZWxheSwgbGVnQXJyaXZhbFdpdGhEZWxheSlcbiAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgIH0pfVxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzPVwic2JiLXBlYXJsLWNoYWluX19idWxsZXQgJHtzdGF0dXNDbGFzc0Fycml2YWx9ICR7YXJyaXZhbE5vdFNlcnZpY2VkfSAke2Fycml2YWxDYW5jZWxDbGFzc31cIlxuICAgICAgICA+PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXBlYXJsLWNoYWluJzogU2JiUGVhcmxDaGFpbkVsZW1lbnQ7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJfYSIsIl9iIiwiX2QiLCJfYyIsIl9lIiwic3RhdHVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQW9CTyxTQUFTLFFBQVEsTUFBTSxlQUFlO0FBQzNDLFNBQU8sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sYUFBYTtBQUM5QztBQ0ZPLFNBQVMsU0FBUyxNQUFNLGVBQWU7QUFDNUMsU0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxhQUFhO0FBQzlDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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