@sbb-esta/lyne-elements-experimental 0.0.0 → 0.52.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 (123) hide show
  1. package/README.md +55 -0
  2. package/constants-ClrwyPF-.js +12 -0
  3. package/core/datetime/date-helper.d.ts +27 -0
  4. package/core/datetime/date-helper.d.ts.map +1 -0
  5. package/core/datetime.d.ts +2 -0
  6. package/core/datetime.d.ts.map +1 -0
  7. package/core/datetime.js +199 -0
  8. package/core/timetable/access-leg-helper.d.ts +26 -0
  9. package/core/timetable/access-leg-helper.d.ts.map +1 -0
  10. package/core/timetable/timetable-helper.d.ts +9 -0
  11. package/core/timetable/timetable-helper.d.ts.map +1 -0
  12. package/core/timetable/timetable-properties.d.ts +308 -0
  13. package/core/timetable/timetable-properties.d.ts.map +1 -0
  14. package/core/timetable.d.ts +4 -0
  15. package/core/timetable.d.ts.map +1 -0
  16. package/core/timetable.js +123 -0
  17. package/custom-elements.json +1606 -0
  18. package/development/constants-D72r1E-c.js +22 -0
  19. package/development/core/datetime/date-helper.d.ts +27 -0
  20. package/development/core/datetime/date-helper.d.ts.map +1 -0
  21. package/development/core/datetime.d.ts +2 -0
  22. package/development/core/datetime.d.ts.map +1 -0
  23. package/development/core/datetime.js +297 -0
  24. package/development/core/timetable/access-leg-helper.d.ts +26 -0
  25. package/development/core/timetable/access-leg-helper.d.ts.map +1 -0
  26. package/development/core/timetable/timetable-helper.d.ts +9 -0
  27. package/development/core/timetable/timetable-helper.d.ts.map +1 -0
  28. package/development/core/timetable/timetable-properties.d.ts +308 -0
  29. package/development/core/timetable/timetable-properties.d.ts.map +1 -0
  30. package/development/core/timetable.d.ts +4 -0
  31. package/development/core/timetable.d.ts.map +1 -0
  32. package/development/core/timetable.js +164 -0
  33. package/development/differenceInMinutes-D47vcSvy.js +21 -0
  34. package/development/format-WI2gcVKN.js +1379 -0
  35. package/development/isValid-YTpbhEHG.js +52 -0
  36. package/development/journey-summary/journey-summary.d.ts +57 -0
  37. package/development/journey-summary/journey-summary.d.ts.map +1 -0
  38. package/development/journey-summary.d.ts +2 -0
  39. package/development/journey-summary.d.ts.map +1 -0
  40. package/development/journey-summary.js +210 -0
  41. package/development/pearl-chain/pearl-chain.d.ts +41 -0
  42. package/development/pearl-chain/pearl-chain.d.ts.map +1 -0
  43. package/development/pearl-chain/pearl-chain.sample-data.d.ts +121 -0
  44. package/development/pearl-chain/pearl-chain.sample-data.d.ts.map +1 -0
  45. package/development/pearl-chain-time/pearl-chain-time.d.ts +44 -0
  46. package/development/pearl-chain-time/pearl-chain-time.d.ts.map +1 -0
  47. package/development/pearl-chain-time.d.ts +2 -0
  48. package/development/pearl-chain-time.d.ts.map +1 -0
  49. package/development/pearl-chain-time.js +209 -0
  50. package/development/pearl-chain-vertical/pearl-chain-vertical.d.ts +17 -0
  51. package/development/pearl-chain-vertical/pearl-chain-vertical.d.ts.map +1 -0
  52. package/development/pearl-chain-vertical-item/pearl-chain-vertical-item.d.ts +35 -0
  53. package/development/pearl-chain-vertical-item/pearl-chain-vertical-item.d.ts.map +1 -0
  54. package/development/pearl-chain-vertical-item.d.ts +2 -0
  55. package/development/pearl-chain-vertical-item.d.ts.map +1 -0
  56. package/development/pearl-chain-vertical-item.js +369 -0
  57. package/development/pearl-chain-vertical.d.ts +2 -0
  58. package/development/pearl-chain-vertical.d.ts.map +1 -0
  59. package/development/pearl-chain-vertical.js +59 -0
  60. package/development/pearl-chain.d.ts +2 -0
  61. package/development/pearl-chain.d.ts.map +1 -0
  62. package/development/pearl-chain.js +599 -0
  63. package/development/timetable-duration/timetable-duration.d.ts +23 -0
  64. package/development/timetable-duration/timetable-duration.d.ts.map +1 -0
  65. package/development/timetable-duration/timetable-duration.sample-data.d.ts +6 -0
  66. package/development/timetable-duration/timetable-duration.sample-data.d.ts.map +1 -0
  67. package/development/timetable-duration.d.ts +2 -0
  68. package/development/timetable-duration.d.ts.map +1 -0
  69. package/development/timetable-duration.js +107 -0
  70. package/development/timetable-row/timetable-row.d.ts +79 -0
  71. package/development/timetable-row/timetable-row.d.ts.map +1 -0
  72. package/development/timetable-row/timetable-row.sample-data.d.ts +24 -0
  73. package/development/timetable-row/timetable-row.sample-data.d.ts.map +1 -0
  74. package/development/timetable-row.d.ts +2 -0
  75. package/development/timetable-row.d.ts.map +1 -0
  76. package/development/timetable-row.js +696 -0
  77. package/differenceInMinutes-CDpgJIgL.js +19 -0
  78. package/format-CEz7IGRJ.js +1168 -0
  79. package/index.d.ts +19 -0
  80. package/index.js +17 -0
  81. package/isValid-Df_caLp4.js +40 -0
  82. package/journey-summary/journey-summary.d.ts +57 -0
  83. package/journey-summary/journey-summary.d.ts.map +1 -0
  84. package/journey-summary.d.ts +2 -0
  85. package/journey-summary.d.ts.map +1 -0
  86. package/journey-summary.js +130 -0
  87. package/package.json +79 -2
  88. package/pearl-chain/pearl-chain.d.ts +41 -0
  89. package/pearl-chain/pearl-chain.d.ts.map +1 -0
  90. package/pearl-chain/pearl-chain.sample-data.d.ts +121 -0
  91. package/pearl-chain/pearl-chain.sample-data.d.ts.map +1 -0
  92. package/pearl-chain-time/pearl-chain-time.d.ts +44 -0
  93. package/pearl-chain-time/pearl-chain-time.d.ts.map +1 -0
  94. package/pearl-chain-time.d.ts +2 -0
  95. package/pearl-chain-time.d.ts.map +1 -0
  96. package/pearl-chain-time.js +90 -0
  97. package/pearl-chain-vertical/pearl-chain-vertical.d.ts +17 -0
  98. package/pearl-chain-vertical/pearl-chain-vertical.d.ts.map +1 -0
  99. package/pearl-chain-vertical-item/pearl-chain-vertical-item.d.ts +35 -0
  100. package/pearl-chain-vertical-item/pearl-chain-vertical-item.d.ts.map +1 -0
  101. package/pearl-chain-vertical-item.d.ts +2 -0
  102. package/pearl-chain-vertical-item.d.ts.map +1 -0
  103. package/pearl-chain-vertical-item.js +48 -0
  104. package/pearl-chain-vertical.d.ts +2 -0
  105. package/pearl-chain-vertical.d.ts.map +1 -0
  106. package/pearl-chain-vertical.js +24 -0
  107. package/pearl-chain.d.ts +2 -0
  108. package/pearl-chain.d.ts.map +1 -0
  109. package/pearl-chain.js +148 -0
  110. package/timetable-duration/timetable-duration.d.ts +23 -0
  111. package/timetable-duration/timetable-duration.d.ts.map +1 -0
  112. package/timetable-duration/timetable-duration.sample-data.d.ts +6 -0
  113. package/timetable-duration/timetable-duration.sample-data.d.ts.map +1 -0
  114. package/timetable-duration.d.ts +2 -0
  115. package/timetable-duration.d.ts.map +1 -0
  116. package/timetable-duration.js +37 -0
  117. package/timetable-row/timetable-row.d.ts +79 -0
  118. package/timetable-row/timetable-row.d.ts.map +1 -0
  119. package/timetable-row/timetable-row.sample-data.d.ts +24 -0
  120. package/timetable-row/timetable-row.sample-data.d.ts.map +1 -0
  121. package/timetable-row.d.ts +2 -0
  122. package/timetable-row.d.ts.map +1 -0
  123. package/timetable-row.js +392 -0
@@ -0,0 +1,696 @@
1
+ import { SbbLanguageController } from "@sbb-esta/lyne-elements/core/controllers.js";
2
+ import { defaultDateAdapter } from "@sbb-esta/lyne-elements/core/datetime.js";
3
+ import { setOrRemoveAttribute } from "@sbb-esta/lyne-elements/core/dom.js";
4
+ import { i18nTripQuayChange, i18nFromStand, i18nFromPier, i18nFromPlatform, i18nDeparture, i18nMeansOfTransport, i18nDirection, i18nRealTimeInfo, i18nSupersaver, i18nTransferProcedures, i18nArrival, i18nClass, i18nOccupancy, i18nTravelhints, i18nTripDuration, i18nNew } from "@sbb-esta/lyne-elements/core/i18n.js";
5
+ import { css, html, LitElement, nothing } from "lit";
6
+ import { property, customElement } from "lit/decorators.js";
7
+ import { removeTimezoneFromISOTimeString, durationToTime } from "./core/datetime.js";
8
+ import { isRideLeg, getDepartureArrivalTimeAttribute } from "./core/timetable.js";
9
+ import "@sbb-esta/lyne-elements/card.js";
10
+ import "@sbb-esta/lyne-elements/icon.js";
11
+ import "@sbb-esta/lyne-elements/timetable-occupancy.js";
12
+ import "./pearl-chain-time.js";
13
+ import { f as format } from "./format-WI2gcVKN.js";
14
+ const style = css`/**
15
+ * Better font rendering (on OS X)
16
+ * http://maximilianhoffmann.com/posts/better-font-rendering-on-osx
17
+ *
18
+ * Usage:
19
+ *
20
+ * .var_dark_on_light {
21
+ * @include font-smoothing;
22
+ * }
23
+ * .var_light_on_dark {
24
+ * @include font-smoothing-reset;
25
+ * }
26
+ */
27
+ /** This mixin can be used to avoid spacing problems by inserting an invisible space as pseudo element. */
28
+ *,
29
+ ::before,
30
+ ::after {
31
+ box-sizing: border-box;
32
+ }
33
+
34
+ :host {
35
+ --sbb-timetable-row-gap: var(--sbb-spacing-fixed-2x);
36
+ --sbb-timetable-row-height: 1.5625rem;
37
+ --sbb-timetable-row-height-header: 1.25rem;
38
+ --sbb-timetable-row-height-footer: 1rem;
39
+ --sbb-timetable-row-skeleton-pulse-duration: 1800ms;
40
+ display: block;
41
+ }
42
+
43
+ :host([disable-animation]) {
44
+ --sbb-timetable-row-skeleton-pulse-duration: 0;
45
+ }
46
+
47
+ .sbb-timetable__row-transport-icon {
48
+ --sbb-icon-svg-width: 1.25rem;
49
+ --sbb-icon-svg-height: 1.25rem;
50
+ }
51
+
52
+ .sbb-travel-hints__item {
53
+ --sbb-icon-svg-height: 0.875rem;
54
+ }
55
+
56
+ .sbb-screen-reader-only {
57
+ border: 0;
58
+ clip: rect(0 0 0 0);
59
+ height: 1px;
60
+ margin: -1px;
61
+ overflow: hidden;
62
+ padding: 0;
63
+ position: absolute;
64
+ white-space: nowrap;
65
+ width: 1px;
66
+ }
67
+
68
+ .sbb-timetable__row--quay {
69
+ margin-inline-end: var(--sbb-spacing-fixed-1x);
70
+ }
71
+
72
+ .sbb-timetable__row--quay-type {
73
+ float: left;
74
+ }
75
+
76
+ ul {
77
+ list-style: none;
78
+ margin: 0;
79
+ padding: 0;
80
+ font-size: inherit;
81
+ display: inline-flex;
82
+ }
83
+
84
+ li {
85
+ display: inline-flex;
86
+ align-self: center;
87
+ }
88
+
89
+ .sbb-timetable__row-transport {
90
+ display: inline-flex;
91
+ align-self: center;
92
+ }
93
+
94
+ .sbb-timetable__row-transportnumber,
95
+ .sbb-timetable__row-time {
96
+ --sbb-text-font-size: var(--sbb-font-size-text-s);
97
+ font-family: var(--sbb-typo-font-family);
98
+ font-weight: normal;
99
+ line-height: var(--sbb-typo-line-height-body-text);
100
+ letter-spacing: var(--sbb-typo-letter-spacing-body-text);
101
+ font-size: var(--sbb-text-font-size);
102
+ font-weight: bold;
103
+ line-height: unset;
104
+ white-space: nowrap;
105
+ align-self: center;
106
+ }
107
+
108
+ .sbb-timetable__row {
109
+ --sbb-text-font-size: var(--sbb-font-size-text-s);
110
+ font-family: var(--sbb-typo-font-family);
111
+ font-weight: normal;
112
+ line-height: var(--sbb-typo-line-height-body-text);
113
+ letter-spacing: var(--sbb-typo-letter-spacing-body-text);
114
+ font-size: var(--sbb-text-font-size);
115
+ display: flex;
116
+ flex-direction: column;
117
+ gap: var(--sbb-timetable-row-gap);
118
+ }
119
+
120
+ .sbb-timetable__row-header,
121
+ .sbb-timetable__row-footer {
122
+ animation: none;
123
+ }
124
+
125
+ .sbb-timetable__row-header {
126
+ display: flex;
127
+ gap: var(--sbb-spacing-fixed-2x);
128
+ align-items: center;
129
+ line-height: var(--sbb-timetable-row-height-header);
130
+ }
131
+
132
+ .sbb-timetable__row-details,
133
+ .sbb-timetable__row-hints {
134
+ display: inline-flex;
135
+ gap: var(--sbb-spacing-fixed-1x);
136
+ align-items: center;
137
+ }
138
+
139
+ .sbb-timetable__row-header p {
140
+ overflow: hidden;
141
+ white-space: nowrap;
142
+ text-overflow: ellipsis;
143
+ margin: 0;
144
+ align-self: center;
145
+ }
146
+
147
+ .sbb-timetable__row-footer {
148
+ display: flex;
149
+ flex-wrap: wrap;
150
+ justify-content: space-between;
151
+ align-items: center;
152
+ gap: var(--sbb-spacing-fixed-2x);
153
+ line-height: var(--sbb-timetable-row-height-footer);
154
+ }
155
+ .sbb-timetable__row-footer > span {
156
+ align-self: center;
157
+ }
158
+ .sbb-timetable__row-footer :only-child {
159
+ margin-inline-start: auto;
160
+ }
161
+
162
+ .sbb-timetable__row-quay--changed {
163
+ color: var(--sbb-color-red);
164
+ }
165
+
166
+ .sbb-timetable__row-transport-wrapper,
167
+ .sbb-timetable__row-warning {
168
+ display: inline-flex;
169
+ }
170
+
171
+ .sbb-loading {
172
+ pointer-events: none;
173
+ }
174
+
175
+ .sbb-loading__wrapper {
176
+ display: flex;
177
+ flex-direction: column;
178
+ gap: var(--sbb-spacing-fixed-2x);
179
+ }
180
+
181
+ .sbb-loading__row {
182
+ width: 100%;
183
+ border-radius: var(--sbb-border-radius-1x);
184
+ height: var(--sbb-timetable-row-height);
185
+ }
186
+ @media (min-width: calc(52.5rem)) {
187
+ .sbb-loading__row {
188
+ height: 1.75rem;
189
+ }
190
+ }
191
+ @media (forced-colors: active) {
192
+ .sbb-loading__row {
193
+ border: var(--sbb-border-width-1x) solid ButtonBorder !important;
194
+ }
195
+ }
196
+
197
+ .sbb-loading__row,
198
+ .sbb-loading__badge {
199
+ background: var(--sbb-color-cloud);
200
+ animation: skeleton-pulse var(--sbb-timetable-row-skeleton-pulse-duration) ease-out infinite;
201
+ }
202
+
203
+ .sbb-loading__row:first-of-type {
204
+ height: var(--sbb-timetable-row-height-header);
205
+ width: 50%;
206
+ }
207
+
208
+ .sbb-loading__row:last-of-type {
209
+ height: var(--sbb-timetable-row-height-footer);
210
+ }
211
+
212
+ .sbb-loading__badge {
213
+ margin-inline: auto calc(var(--sbb-spacing-fixed-3x) * -1);
214
+ padding-inline-end: var(--sbb-spacing-fixed-6x);
215
+ border-end-start-radius: var(--sbb-border-radius-4x);
216
+ transform: skew(16deg, 0deg);
217
+ width: 7.1875rem;
218
+ height: 1.25rem;
219
+ }
220
+
221
+ @keyframes skeleton-pulse {
222
+ 0% {
223
+ background: var(--sbb-color-cloud);
224
+ }
225
+ 17% {
226
+ background: var(--sbb-color-cloud);
227
+ }
228
+ 50% {
229
+ background: var(--sbb-color-milk);
230
+ }
231
+ 67% {
232
+ background: var(--sbb-color-milk);
233
+ }
234
+ 100% {
235
+ background: var(--sbb-color-cloud);
236
+ }
237
+ }`;
238
+ var __defProp = Object.defineProperty;
239
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
240
+ var __decorateClass = (decorators, target, key, kind) => {
241
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
242
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
243
+ if (decorator = decorators[i])
244
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
245
+ if (kind && result)
246
+ __defProp(target, key, result);
247
+ return result;
248
+ };
249
+ const renderIconProduct = (icon, name) => {
250
+ return html`<span class="sbb-timetable__row-transport">
251
+ <sbb-icon name=${icon}></sbb-icon>
252
+ <span class="sbb-screen-reader-only">${name}</span>
253
+ </span>`;
254
+ };
255
+ const renderStringProduct = (vehicleName, line) => {
256
+ const space = ["M", "B", "T"].includes(vehicleName) ? " " : "";
257
+ return html`<span class="sbb-timetable__row-transportnumber">
258
+ ${line !== null ? vehicleName + space + line : vehicleName}
259
+ </span>`;
260
+ };
261
+ const getReachableText = (legs) => {
262
+ var _a, _b, _c;
263
+ return (_c = (_b = (_a = legs == null ? void 0 : legs.find((leg) => {
264
+ var _a2, _b2;
265
+ return (_b2 = (_a2 = leg.serviceJourney) == null ? void 0 : _a2.serviceAlteration) == null ? void 0 : _b2.reachableText;
266
+ })) == null ? void 0 : _a.serviceJourney) == null ? void 0 : _b.serviceAlteration) == null ? void 0 : _c.reachableText;
267
+ };
268
+ const getDelayText = (legs) => {
269
+ var _a, _b, _c;
270
+ return (_c = (_b = (_a = legs == null ? void 0 : legs.find((leg) => {
271
+ var _a2, _b2;
272
+ return (_b2 = (_a2 = leg.serviceJourney) == null ? void 0 : _a2.serviceAlteration) == null ? void 0 : _b2.delayText;
273
+ })) == null ? void 0 : _a.serviceJourney) == null ? void 0 : _b.serviceAlteration) == null ? void 0 : _c.delayText;
274
+ };
275
+ const getRedirectedText = (legs) => {
276
+ var _a, _b, _c;
277
+ return (_c = (_b = (_a = legs == null ? void 0 : legs.find((leg) => {
278
+ var _a2, _b2;
279
+ return !!((_b2 = (_a2 = leg.serviceJourney) == null ? void 0 : _a2.serviceAlteration) == null ? void 0 : _b2.redirectedText);
280
+ })) == null ? void 0 : _a.serviceJourney) == null ? void 0 : _b.serviceAlteration) == null ? void 0 : _c.redirectedText;
281
+ };
282
+ const getUnplannedStop = (legs) => {
283
+ var _a, _b, _c;
284
+ return (_c = (_b = (_a = legs == null ? void 0 : legs.find((leg) => {
285
+ var _a2, _b2;
286
+ return !!((_b2 = (_a2 = leg.serviceJourney) == null ? void 0 : _a2.serviceAlteration) == null ? void 0 : _b2.unplannedStopPointsText);
287
+ })) == null ? void 0 : _a.serviceJourney) == null ? void 0 : _b.serviceAlteration) == null ? void 0 : _c.unplannedStopPointsText;
288
+ };
289
+ const sortSituation = (situations) => {
290
+ var _a;
291
+ const priorities = {
292
+ DISTURBANCE: 0,
293
+ INFORMATION: 1,
294
+ DELAY: 2,
295
+ TRAIN_REPLACEMENT_BY_BUS: 3,
296
+ CONSTRUCTION_SITE: 4,
297
+ END_MESSAGE: 5
298
+ };
299
+ return (_a = [...situations]) == null ? void 0 : _a.sort(
300
+ (a, b) => priorities[a.cause] - priorities[b.cause]
301
+ );
302
+ };
303
+ const getHimIcon = (situation) => {
304
+ var _a;
305
+ switch (situation == null ? void 0 : situation.cause) {
306
+ case "DISTURBANCE":
307
+ return {
308
+ name: "disruption",
309
+ text: ((_a = situation == null ? void 0 : situation.broadcastMessages) == null ? void 0 : _a.length) ? situation == null ? void 0 : situation.broadcastMessages[0].title : ""
310
+ };
311
+ case "INFORMATION":
312
+ return {
313
+ name: "info",
314
+ text: (situation == null ? void 0 : situation.broadcastMessages.length) ? situation == null ? void 0 : situation.broadcastMessages[0].title : ""
315
+ };
316
+ case "DELAY":
317
+ return {
318
+ name: "delay",
319
+ text: (situation == null ? void 0 : situation.broadcastMessages.length) ? situation == null ? void 0 : situation.broadcastMessages[0].title : ""
320
+ };
321
+ case "TRAIN_REPLACEMENT_BY_BUS":
322
+ return {
323
+ name: "replacementbus",
324
+ text: (situation == null ? void 0 : situation.broadcastMessages.length) ? situation == null ? void 0 : situation.broadcastMessages[0].title : ""
325
+ };
326
+ case "CONSTRUCTION_SITE":
327
+ return {
328
+ name: "construction",
329
+ text: (situation == null ? void 0 : situation.broadcastMessages.length) ? situation == null ? void 0 : situation.broadcastMessages[0].title : ""
330
+ };
331
+ default:
332
+ return {
333
+ name: "info",
334
+ text: (situation == null ? void 0 : situation.broadcastMessages.length) ? situation == null ? void 0 : situation.broadcastMessages[0].title : ""
335
+ };
336
+ }
337
+ };
338
+ const getCus = (trip, currentLanguage) => {
339
+ const { summary, legs } = trip || {};
340
+ const rideLegs = legs == null ? void 0 : legs.filter((leg) => isRideLeg(leg));
341
+ const { tripStatus } = summary || {};
342
+ if ((tripStatus == null ? void 0 : tripStatus.cancelled) || (tripStatus == null ? void 0 : tripStatus.partiallyCancelled))
343
+ return { name: "cancellation", text: tripStatus == null ? void 0 : tripStatus.cancelledText };
344
+ if (getReachableText(rideLegs))
345
+ return { name: "missed-connection", text: getReachableText(rideLegs) };
346
+ if (tripStatus == null ? void 0 : tripStatus.alternative)
347
+ return { name: "alternative", text: tripStatus.alternativeText };
348
+ if (getRedirectedText(rideLegs))
349
+ return { name: "reroute", text: getRedirectedText(rideLegs) };
350
+ if (getUnplannedStop(rideLegs))
351
+ return { name: "add-stop", text: getUnplannedStop(rideLegs) };
352
+ if ((tripStatus == null ? void 0 : tripStatus.delayed) || (tripStatus == null ? void 0 : tripStatus.delayedUnknown))
353
+ return { name: "delay", text: getDelayText(rideLegs) };
354
+ if (tripStatus == null ? void 0 : tripStatus.quayChanged) {
355
+ const departure = rideLegs[0].departure;
356
+ return {
357
+ name: "platform-change",
358
+ text: departure.quayChanged ? departure.quayChangedText : i18nTripQuayChange[currentLanguage]
359
+ };
360
+ }
361
+ return {};
362
+ };
363
+ const findAndReplaceNotice = (notices) => {
364
+ const reservationNotice = ["RR", "RK", "RC", "RL", "RM", "RS", "RU", "XP", "XR", "XT"];
365
+ return notices.reduce((foundNotice, notice) => {
366
+ if (foundNotice)
367
+ return foundNotice;
368
+ if (reservationNotice.includes(notice.name)) {
369
+ return { ...notice, name: "RR" };
370
+ }
371
+ }, void 0);
372
+ };
373
+ const filterNotices = (notices) => {
374
+ const allowedNames = ["Z", "SB", "SZ", "VR", "TG"];
375
+ const filterNotice = notices.filter((notice, index) => {
376
+ return notices.findIndex((n) => n.name === notice.name) === index;
377
+ });
378
+ return filterNotice.filter((notice) => allowedNames.includes(notice.name)).sort((a, b) => allowedNames.indexOf(a.name) - allowedNames.indexOf(b.name));
379
+ };
380
+ const handleNotices = (notices) => {
381
+ const reservationNotice = findAndReplaceNotice(notices);
382
+ const filteredNotices = filterNotices(notices);
383
+ if (reservationNotice === void 0)
384
+ return filteredNotices;
385
+ if (!filteredNotices.length)
386
+ return [reservationNotice];
387
+ if (filteredNotices[0].name === "Z" && filteredNotices[1]) {
388
+ return [filteredNotices[0], reservationNotice, filteredNotices[1]].concat(
389
+ filteredNotices.slice(2)
390
+ );
391
+ }
392
+ return [reservationNotice, ...filteredNotices];
393
+ };
394
+ let SbbTimetableRowElement = class extends LitElement {
395
+ constructor() {
396
+ super(...arguments);
397
+ this.loadingTrip = false;
398
+ this.loadingPrice = false;
399
+ this._now = null;
400
+ this._language = new SbbLanguageController(this);
401
+ }
402
+ set now(value) {
403
+ this._now = defaultDateAdapter.getValidDateOrNull(defaultDateAdapter.deserialize(value));
404
+ }
405
+ get now() {
406
+ return this._now ?? /* @__PURE__ */ new Date();
407
+ }
408
+ willUpdate(changedProperties) {
409
+ super.willUpdate(changedProperties);
410
+ if (changedProperties.has("loadingTrip")) {
411
+ setOrRemoveAttribute(this, "role", !this.loadingTrip ? "rowgroup" : null);
412
+ }
413
+ }
414
+ /** The skeleton render function for the loading state */
415
+ _renderSkeleton() {
416
+ return html`
417
+ <sbb-card size="l" class="sbb-loading">
418
+ ${this.loadingPrice ? html`<sbb-card-badge class="sbb-loading__badge"></sbb-card-badge>` : nothing}
419
+ <div class="sbb-loading__wrapper">
420
+ <div class="sbb-loading__row"></div>
421
+ <div class="sbb-loading__row"></div>
422
+ <div class="sbb-loading__row"></div>
423
+ </div>
424
+ </sbb-card>
425
+ `;
426
+ }
427
+ _getQuayType(vehicleMode) {
428
+ switch (vehicleMode) {
429
+ case "TRAIN":
430
+ return i18nFromPlatform;
431
+ case "SHIP":
432
+ return i18nFromPier;
433
+ case "TRAMWAY":
434
+ return i18nFromStand;
435
+ case "BUS":
436
+ return i18nFromStand;
437
+ default:
438
+ return void 0;
439
+ }
440
+ }
441
+ _getQuayTypeStrings() {
442
+ var _a, _b;
443
+ if (!((_a = this.trip.summary) == null ? void 0 : _a.product))
444
+ return null;
445
+ const quayType = this._getQuayType((_b = this.trip.summary.product) == null ? void 0 : _b.vehicleMode);
446
+ return {
447
+ long: quayType == null ? void 0 : quayType.long[this._language.current],
448
+ short: quayType == null ? void 0 : quayType.short[this._language.current]
449
+ };
450
+ }
451
+ /** map Quay */
452
+ _renderQuayType() {
453
+ var _a;
454
+ if (!((_a = this.trip.summary) == null ? void 0 : _a.product))
455
+ return void 0;
456
+ const quayTypeStrings = this._getQuayTypeStrings();
457
+ return html`
458
+ <span class="sbb-timetable__row--quay">
459
+ <span class="sbb-screen-reader-only">${quayTypeStrings == null ? void 0 : quayTypeStrings.long}&nbsp;</span>
460
+ <span class="sbb-timetable__row--quay-type" aria-hidden="true"
461
+ >${quayTypeStrings == null ? void 0 : quayTypeStrings.short}</span
462
+ >
463
+ </span>
464
+ `;
465
+ }
466
+ _handleHimCus(trip) {
467
+ var _a;
468
+ const { situations } = trip || {};
469
+ const sortedSituations = situations && sortSituation(situations);
470
+ const cus = getCus(trip, this._language.current);
471
+ return {
472
+ cus: ((_a = Object.keys(cus)) == null ? void 0 : _a.length) ? cus : null,
473
+ him: (situations == null ? void 0 : situations.length) ? getHimIcon(sortedSituations[0]) : null
474
+ };
475
+ }
476
+ _getAccessibilityText(trip) {
477
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
478
+ const { summary, legs, notices } = trip || {};
479
+ const {
480
+ departureWalk,
481
+ arrivalWalk,
482
+ departure,
483
+ arrival,
484
+ product,
485
+ direction,
486
+ occupancy,
487
+ duration
488
+ } = summary || {};
489
+ const { departureTimeAttribute, arrivalTimeAttribute } = getDepartureArrivalTimeAttribute(
490
+ legs,
491
+ departureWalk || 0,
492
+ arrivalWalk || 0,
493
+ this._language.current
494
+ );
495
+ const departureTime = (departure == null ? void 0 : departure.time) ? removeTimezoneFromISOTimeString(departure.time) : void 0;
496
+ const arrivalTime = (arrival == null ? void 0 : arrival.time) ? removeTimezoneFromISOTimeString(arrival.time) : void 0;
497
+ const departureWalkText = departureTimeAttribute ? `${departureTimeAttribute.text} ${departureTimeAttribute.duration}, ` : "";
498
+ const arrivalWalkText = arrivalTimeAttribute ? `${arrivalTimeAttribute.text} ${arrivalTimeAttribute.duration}, ` : "";
499
+ const departureTimeText = departureTime ? `${i18nDeparture[this._language.current]}: ${format(departureTime, "HH:mm")}, ` : "";
500
+ const getDepartureQuayText = () => {
501
+ var _a2;
502
+ if (!(departure == null ? void 0 : departure.quayFormatted)) {
503
+ return "";
504
+ }
505
+ const changedQuayPrefix = (departure == null ? void 0 : departure.quayChanged) ? `${i18nNew[this._language.current]} ` : "";
506
+ return `${changedQuayPrefix}${(_a2 = this._getQuayTypeStrings()) == null ? void 0 : _a2.long} ${departure == null ? void 0 : departure.quayFormatted}, `;
507
+ };
508
+ const meansOfTransportText = product && product.vehicleMode ? i18nMeansOfTransport[product.vehicleMode.toLowerCase()] && `${i18nMeansOfTransport[product.vehicleMode.toLowerCase()][this._language.current]}, ` : "";
509
+ const vehicleSubModeText = (product == null ? void 0 : product.vehicleSubModeShortName) ? `${product.vehicleSubModeShortName} ${product.line || ""}, ` : "";
510
+ const directionText = `${i18nDirection[this._language.current]} ${direction}, `;
511
+ const himCus = this._handleHimCus(trip);
512
+ const cusText = ((_a = himCus == null ? void 0 : himCus.cus) == null ? void 0 : _a.text) ? `${i18nRealTimeInfo[this._language.current]}: ${(_b = himCus == null ? void 0 : himCus.cus) == null ? void 0 : _b.text}, ` : "";
513
+ const himText = ((_c = himCus == null ? void 0 : himCus.him) == null ? void 0 : _c.text) ? `${i18nRealTimeInfo[this._language.current]}: ${(_d = himCus == null ? void 0 : himCus.him) == null ? void 0 : _d.text}, ` : "";
514
+ const boardingText = this.boarding ? `${this.boarding.text}, ` : "";
515
+ const priceText = `${((_e = this.price) == null ? void 0 : _e.isDiscount) ? i18nSupersaver[this._language.current] : ""} ${((_f = this.price) == null ? void 0 : _f.text) && ((_g = this.price) == null ? void 0 : _g.price) ? (((_h = this.price) == null ? void 0 : _h.text) || "") + " " + (((_i = this.price) == null ? void 0 : _i.price) || "") + ", " : ""}`;
516
+ const transferProcedures = (legs == null ? void 0 : legs.length) > 1 ? `${(legs == null ? void 0 : legs.length) - 1} ${i18nTransferProcedures[this._language.current]}, ` : "";
517
+ const arrivalTimeText = arrivalTime ? `${i18nArrival[this._language.current]}: ${format(arrivalTime, "HH:mm")}, ` : "";
518
+ let occupancyText = "";
519
+ if (occupancy) {
520
+ if (occupancy.firstClass && occupancy.firstClass !== "UNKNOWN") {
521
+ occupancyText += `${i18nClass.first[this._language.current]} ${(_j = i18nOccupancy[occupancy.firstClass.toLowerCase()]) == null ? void 0 : _j[this._language.current]}.`;
522
+ }
523
+ if (occupancy.secondClass && occupancy.secondClass !== "UNKNOWN") {
524
+ occupancyText += ` ${i18nClass.second[this._language.current]} ${(_k = i18nOccupancy[occupancy.secondClass.toLowerCase()]) == null ? void 0 : _k[this._language.current]}.`;
525
+ }
526
+ }
527
+ const attributes = notices && handleNotices(notices).length && ((_l = handleNotices(notices)) == null ? void 0 : _l.map((notice, index) => {
528
+ var _a2;
529
+ return index < 4 && ((_a2 = notice.text) == null ? void 0 : _a2.template);
530
+ }).join(", ")) + ", ";
531
+ const attributesText = attributes ? `${i18nTravelhints[this._language.current]}: ${attributes}` : "";
532
+ const durationText = !!duration && duration > 0 ? `${i18nTripDuration[this._language.current]} ${durationToTime(duration, this._language.current).long}, ` : "";
533
+ return `${departureWalkText} ${departureTimeText} ${getDepartureQuayText()} ${meansOfTransportText} ${vehicleSubModeText} ${directionText} ${cusText} ${boardingText} ${priceText} ${cusText ? "" : himText} ${arrivalTimeText} ${arrivalWalkText} ${durationText} ${transferProcedures} ${occupancyText} ${attributesText}`;
534
+ }
535
+ render() {
536
+ var _a, _b, _c, _d, _e;
537
+ if (this.loadingTrip) {
538
+ return this._renderSkeleton();
539
+ }
540
+ const { legs, id, notices, summary } = this.trip || {};
541
+ const {
542
+ product,
543
+ direction,
544
+ departureWalk,
545
+ departure,
546
+ arrival,
547
+ arrivalWalk,
548
+ occupancy,
549
+ duration
550
+ } = summary || {};
551
+ const himCus = this._handleHimCus(this.trip);
552
+ const hasHimCus = !!himCus.cus || !!himCus.him;
553
+ const noticeAttributes = notices && handleNotices(notices);
554
+ const durationObj = duration ? durationToTime(duration, this._language.current) : null;
555
+ return html`
556
+ <sbb-card size="l" id=${id}>
557
+ <sbb-card-button
558
+ ?active=${this.active}
559
+ aria-expanded=${((_a = this.accessibilityExpanded) == null ? void 0 : _a.toString()) ?? nothing}
560
+ >
561
+ ${this.cardActionLabel ? this.cardActionLabel : this._getAccessibilityText(this.trip)}
562
+ </sbb-card-button>
563
+ ${this.loadingPrice ? html`<sbb-card-badge class="sbb-loading__badge"></sbb-card-badge>` : nothing}
564
+ ${this.price && !this.loadingPrice ? html`<sbb-card-badge color=${this.price.isDiscount ? "charcoal" : "white"}>
565
+ ${this.price.isDiscount ? html`<span aria-hidden="true">
566
+ %<span class="sbb-screen-reader-only"
567
+ >${i18nSupersaver[this._language.current]}</span
568
+ >
569
+ </span>` : nothing}
570
+ ${this.price.text ? html`<span>${this.price.text}</span>` : nothing}
571
+ ${this.price.price ? html`<span>${this.price.price}</span>` : nothing}
572
+ </sbb-card-badge>` : nothing}
573
+ <div class="sbb-timetable__row" role="row">
574
+ <div class="sbb-timetable__row-header" role="gridcell">
575
+ <div class="sbb-timetable__row-details">
576
+ ${(product == null ? void 0 : product.corporateIdentityPictogram) && html`<span class="sbb-timetable__row-transport-wrapper">
577
+ <sbb-icon
578
+ class="sbb-timetable__row-transport-icon"
579
+ name="picto:${product.corporateIdentityPictogram}"
580
+ ></sbb-icon>
581
+ <span class="sbb-screen-reader-only">
582
+ ${product && product.vehicleMode && i18nMeansOfTransport[product.vehicleMode.toLowerCase()] && i18nMeansOfTransport[product.vehicleMode.toLowerCase()][this._language.current]}
583
+ &nbsp;
584
+ </span>
585
+ </span>`}
586
+ ${product && (product.corporateIdentityIcon ? renderIconProduct(product.corporateIdentityIcon, product.name) : product.vehicleSubModeShortName && renderStringProduct(product.vehicleSubModeShortName, product == null ? void 0 : product.line))}
587
+ </div>
588
+ ${direction ? html`<p>${`${i18nDirection[this._language.current]} ${direction}`}</p>` : nothing}
589
+ </div>
590
+ <sbb-pearl-chain-time
591
+ role="gridcell"
592
+ .legs=${legs}
593
+ .departureTime=${departure == null ? void 0 : departure.time}
594
+ .arrivalTime=${arrival == null ? void 0 : arrival.time}
595
+ .departureWalk=${departureWalk}
596
+ .arrivalWalk=${arrivalWalk}
597
+ ?disable-animation=${this.disableAnimation}
598
+ .now=${this.now}
599
+ ></sbb-pearl-chain-time>
600
+ <div class="sbb-timetable__row-footer" role="gridcell">
601
+ ${product && this._getQuayType(product.vehicleMode) && (departure == null ? void 0 : departure.quayFormatted) ? html`<span
602
+ class=${(departure == null ? void 0 : departure.quayChanged) ? `sbb-timetable__row-quay--changed` : nothing}
603
+ >
604
+ <span class="sbb-screen-reader-only">
605
+ ${`${i18nDeparture[this._language.current]} ${(departure == null ? void 0 : departure.quayChanged) ? i18nNew[this._language.current] : ""}`}
606
+ &nbsp;
607
+ </span>
608
+ ${this._renderQuayType()} ${departure == null ? void 0 : departure.quayFormatted}
609
+ </span>` : nothing}
610
+ ${(occupancy == null ? void 0 : occupancy.firstClass) && (occupancy == null ? void 0 : occupancy.firstClass) !== "UNKNOWN" || (occupancy == null ? void 0 : occupancy.secondClass) && occupancy.secondClass !== "UNKNOWN" ? html`<sbb-timetable-occupancy
611
+ .firstClassOccupancy=${(_b = occupancy == null ? void 0 : occupancy.firstClass) == null ? void 0 : _b.toLowerCase()}
612
+ .secondClassOccupancy=${(_c = occupancy == null ? void 0 : occupancy.secondClass) == null ? void 0 : _c.toLowerCase()}
613
+ ></sbb-timetable-occupancy>` : nothing}
614
+ ${noticeAttributes && noticeAttributes.length || this.boarding ? html`<ul class="sbb-timetable__row-hints" role="list">
615
+ ${noticeAttributes == null ? void 0 : noticeAttributes.map(
616
+ (notice, index) => {
617
+ var _a2, _b2;
618
+ return index < 4 ? html`<li>
619
+ <sbb-icon
620
+ class="sbb-travel-hints__item"
621
+ name=${"sa-" + ((_a2 = notice.name) == null ? void 0 : _a2.toLowerCase())}
622
+ ></sbb-icon>
623
+ <span class="sbb-screen-reader-only">${(_b2 = notice.text) == null ? void 0 : _b2.template}</span>
624
+ </li>` : nothing;
625
+ }
626
+ )}
627
+ ${this.boarding ? html`<li>
628
+ <sbb-icon
629
+ class="sbb-travel-hints__item"
630
+ name=${(_d = this.boarding) == null ? void 0 : _d.name}
631
+ aria-label=${(_e = this.boarding) == null ? void 0 : _e.text}
632
+ aria-hidden="false"
633
+ ></sbb-icon>
634
+ </li>` : nothing}
635
+ </ul>` : nothing}
636
+ ${duration && duration > 0 ? html`<time>
637
+ <span class="sbb-screen-reader-only">
638
+ ${`${i18nTripDuration[this._language.current]} ${durationObj.long}`}
639
+ </span>
640
+ <span aria-hidden="true">${durationObj.short}</span>
641
+ </time>` : nothing}
642
+ ${hasHimCus && (himCus.cus || himCus.him) ? html`<span class="sbb-timetable__row-warning">
643
+ <sbb-icon name=${(himCus.cus || himCus.him).name}></sbb-icon>
644
+ <span class="sbb-screen-reader-only">${(himCus.cus || himCus.him).text}</span>
645
+ </span>` : nothing}
646
+ </div>
647
+ </div>
648
+ </sbb-card>
649
+ `;
650
+ }
651
+ };
652
+ SbbTimetableRowElement.styles = style;
653
+ __decorateClass([
654
+ property({ type: Object })
655
+ ], SbbTimetableRowElement.prototype, "trip", 2);
656
+ __decorateClass([
657
+ property({ type: Object })
658
+ ], SbbTimetableRowElement.prototype, "price", 2);
659
+ __decorateClass([
660
+ property({ attribute: "disable-animation", reflect: true, type: Boolean })
661
+ ], SbbTimetableRowElement.prototype, "disableAnimation", 2);
662
+ __decorateClass([
663
+ property({ type: Object })
664
+ ], SbbTimetableRowElement.prototype, "boarding", 2);
665
+ __decorateClass([
666
+ property({ attribute: "loading-trip", type: Boolean })
667
+ ], SbbTimetableRowElement.prototype, "loadingTrip", 2);
668
+ __decorateClass([
669
+ property({ attribute: "loading-price", type: Boolean })
670
+ ], SbbTimetableRowElement.prototype, "loadingPrice", 2);
671
+ __decorateClass([
672
+ property({ attribute: "card-action-label" })
673
+ ], SbbTimetableRowElement.prototype, "cardActionLabel", 2);
674
+ __decorateClass([
675
+ property({ attribute: "accessibility-expanded", type: Boolean })
676
+ ], SbbTimetableRowElement.prototype, "accessibilityExpanded", 2);
677
+ __decorateClass([
678
+ property({ type: Boolean })
679
+ ], SbbTimetableRowElement.prototype, "active", 2);
680
+ __decorateClass([
681
+ property()
682
+ ], SbbTimetableRowElement.prototype, "now", 1);
683
+ SbbTimetableRowElement = __decorateClass([
684
+ customElement("sbb-timetable-row")
685
+ ], SbbTimetableRowElement);
686
+ export {
687
+ SbbTimetableRowElement,
688
+ filterNotices,
689
+ getCus,
690
+ getHimIcon,
691
+ handleNotices,
692
+ renderIconProduct,
693
+ renderStringProduct,
694
+ sortSituation
695
+ };
696
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXRhYmxlLXJvdy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC90aW1ldGFibGUtcm93L3RpbWV0YWJsZS1yb3cudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2JiTGFuZ3VhZ2VDb250cm9sbGVyIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9jb250cm9sbGVycy5qcyc7XG5pbXBvcnQgeyBkZWZhdWx0RGF0ZUFkYXB0ZXIgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2RhdGV0aW1lLmpzJztcbmltcG9ydCB7IHNldE9yUmVtb3ZlQXR0cmlidXRlIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9kb20uanMnO1xuaW1wb3J0IHtcbiAgaTE4bkFycml2YWwsXG4gIGkxOG5DbGFzcyxcbiAgaTE4bkRlcGFydHVyZSxcbiAgaTE4bkRpcmVjdGlvbixcbiAgaTE4bkZyb21QaWVyLFxuICBpMThuRnJvbVBsYXRmb3JtLFxuICBpMThuRnJvbVN0YW5kLFxuICBpMThuTWVhbnNPZlRyYW5zcG9ydCxcbiAgaTE4bk5ldyxcbiAgaTE4bk9jY3VwYW5jeSxcbiAgaTE4blJlYWxUaW1lSW5mbyxcbiAgaTE4blN1cGVyc2F2ZXIsXG4gIGkxOG5UcmFuc2ZlclByb2NlZHVyZXMsXG4gIGkxOG5UcmF2ZWxoaW50cyxcbiAgaTE4blRyaXBEdXJhdGlvbixcbiAgaTE4blRyaXBRdWF5Q2hhbmdlLFxufSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2kxOG4uanMnO1xuaW1wb3J0IHR5cGUgeyBTYmJEYXRlTGlrZSwgU2JiT2NjdXBhbmN5IH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9pbnRlcmZhY2VzLmpzJztcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB0eXBlIHsgQ1NTUmVzdWx0R3JvdXAsIFByb3BlcnR5VmFsdWVzLCBUZW1wbGF0ZVJlc3VsdCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50LCBub3RoaW5nIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBkdXJhdGlvblRvVGltZSwgcmVtb3ZlVGltZXpvbmVGcm9tSVNPVGltZVN0cmluZyB9IGZyb20gJy4uL2NvcmUvZGF0ZXRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBJVHJpcEl0ZW0sIE5vdGljZSwgUHRSaWRlTGVnLCBQdFNpdHVhdGlvbiB9IGZyb20gJy4uL2NvcmUvdGltZXRhYmxlLmpzJztcbmltcG9ydCB7IGdldERlcGFydHVyZUFycml2YWxUaW1lQXR0cmlidXRlLCBpc1JpZGVMZWcgfSBmcm9tICcuLi9jb3JlL3RpbWV0YWJsZS5qcyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL3RpbWV0YWJsZS1yb3cuc2Nzcz9saXQmaW5saW5lJztcblxuaW1wb3J0ICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jYXJkLmpzJztcbmltcG9ydCAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvaWNvbi5qcyc7XG5pbXBvcnQgJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL3RpbWV0YWJsZS1vY2N1cGFuY3kuanMnO1xuaW1wb3J0ICcuLi9wZWFybC1jaGFpbi10aW1lLmpzJztcblxuLyoqIEhpbUN1cyBpbnRlcmZhY2UgZm9yIG1hcHBlZCBpY29uIG5hbWUgYW5kIHRleHQgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGltQ3VzIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0ZXh0Pzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIEJvYXJkaW5nIGljb24gaW50ZXJmYWNlIGZvciBtYXBwZWQgaWNvbiBuYW1lIGFuZCB0ZXh0ICovXG5leHBvcnQgaW50ZXJmYWNlIEJvYXJkaW5nIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJpY2Uge1xuICBwcmljZT86IHN0cmluZztcbiAgdGV4dD86IHN0cmluZztcbiAgaXNEaXNjb3VudD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCByZW5kZXJJY29uUHJvZHVjdCA9IChpY29uOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFRlbXBsYXRlUmVzdWx0ID0+IHtcbiAgcmV0dXJuIGh0bWxgPHNwYW4gY2xhc3M9XCJzYmItdGltZXRhYmxlX19yb3ctdHJhbnNwb3J0XCI+XG4gICAgPHNiYi1pY29uIG5hbWU9JHtpY29ufT48L3NiYi1pY29uPlxuICAgIDxzcGFuIGNsYXNzPVwic2JiLXNjcmVlbi1yZWFkZXItb25seVwiPiR7bmFtZX08L3NwYW4+XG4gIDwvc3Bhbj5gO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbmRlclN0cmluZ1Byb2R1Y3QgPSAodmVoaWNsZU5hbWU6IHN0cmluZywgbGluZT86IHN0cmluZyB8IG51bGwpOiBUZW1wbGF0ZVJlc3VsdCA9PiB7XG4gIGNvbnN0IHNwYWNlID0gWydNJywgJ0InLCAnVCddLmluY2x1ZGVzKHZlaGljbGVOYW1lKSA/ICcgJyA6ICcnO1xuICByZXR1cm4gaHRtbGA8c3BhbiBjbGFzcz1cInNiYi10aW1ldGFibGVfX3Jvdy10cmFuc3BvcnRudW1iZXJcIj5cbiAgICAke2xpbmUgIT09IG51bGwgPyB2ZWhpY2xlTmFtZSArIHNwYWNlICsgbGluZSA6IHZlaGljbGVOYW1lfVxuICA8L3NwYW4+YDtcbn07XG5cbmNvbnN0IGdldFJlYWNoYWJsZVRleHQgPSAobGVnczogUHRSaWRlTGVnW10pOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkID0+IHtcbiAgcmV0dXJuIGxlZ3M/LmZpbmQoKGxlZykgPT4gbGVnLnNlcnZpY2VKb3VybmV5Py5zZXJ2aWNlQWx0ZXJhdGlvbj8ucmVhY2hhYmxlVGV4dCk/LnNlcnZpY2VKb3VybmV5XG4gICAgPy5zZXJ2aWNlQWx0ZXJhdGlvbj8ucmVhY2hhYmxlVGV4dDtcbn07XG5cbmNvbnN0IGdldERlbGF5VGV4dCA9IChsZWdzOiBQdFJpZGVMZWdbXSk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgPT4ge1xuICByZXR1cm4gbGVncz8uZmluZCgobGVnKSA9PiBsZWcuc2VydmljZUpvdXJuZXk/LnNlcnZpY2VBbHRlcmF0aW9uPy5kZWxheVRleHQpPy5zZXJ2aWNlSm91cm5leVxuICAgID8uc2VydmljZUFsdGVyYXRpb24/LmRlbGF5VGV4dDtcbn07XG5cbmNvbnN0IGdldFJlZGlyZWN0ZWRUZXh0ID0gKGxlZ3M6IFB0UmlkZUxlZ1tdKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCA9PiB7XG4gIHJldHVybiBsZWdzPy5maW5kKChsZWcpID0+ICEhbGVnLnNlcnZpY2VKb3VybmV5Py5zZXJ2aWNlQWx0ZXJhdGlvbj8ucmVkaXJlY3RlZFRleHQpXG4gICAgPy5zZXJ2aWNlSm91cm5leT8uc2VydmljZUFsdGVyYXRpb24/LnJlZGlyZWN0ZWRUZXh0O1xufTtcblxuY29uc3QgZ2V0VW5wbGFubmVkU3RvcCA9IChsZWdzOiBQdFJpZGVMZWdbXSk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgPT4ge1xuICByZXR1cm4gbGVncz8uZmluZCgobGVnKSA9PiAhIWxlZy5zZXJ2aWNlSm91cm5leT8uc2VydmljZUFsdGVyYXRpb24/LnVucGxhbm5lZFN0b3BQb2ludHNUZXh0KVxuICAgID8uc2VydmljZUpvdXJuZXk/LnNlcnZpY2VBbHRlcmF0aW9uPy51bnBsYW5uZWRTdG9wUG9pbnRzVGV4dDtcbn07XG5cbmV4cG9ydCBjb25zdCBzb3J0U2l0dWF0aW9uID0gKHNpdHVhdGlvbnM6IFB0U2l0dWF0aW9uW10pOiBQdFNpdHVhdGlvbltdID0+IHtcbiAgY29uc3QgcHJpb3JpdGllcyA9IHtcbiAgICBESVNUVVJCQU5DRTogMCxcbiAgICBJTkZPUk1BVElPTjogMSxcbiAgICBERUxBWTogMixcbiAgICBUUkFJTl9SRVBMQUNFTUVOVF9CWV9CVVM6IDMsXG4gICAgQ09OU1RSVUNUSU9OX1NJVEU6IDQsXG4gICAgRU5EX01FU1NBR0U6IDUsXG4gIH07XG5cbiAgcmV0dXJuIFsuLi5zaXR1YXRpb25zXT8uc29ydChcbiAgICAoYTogUHRTaXR1YXRpb24sIGI6IFB0U2l0dWF0aW9uKSA9PiBwcmlvcml0aWVzW2EuY2F1c2UhXSAtIHByaW9yaXRpZXNbYi5jYXVzZSFdLFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEhpbUljb24gPSAoc2l0dWF0aW9uOiBQdFNpdHVhdGlvbik6IEhpbUN1cyA9PiB7XG4gIHN3aXRjaCAoc2l0dWF0aW9uPy5jYXVzZSkge1xuICAgIGNhc2UgJ0RJU1RVUkJBTkNFJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICdkaXNydXB0aW9uJyxcbiAgICAgICAgdGV4dDogc2l0dWF0aW9uPy5icm9hZGNhc3RNZXNzYWdlcz8ubGVuZ3RoID8gc2l0dWF0aW9uPy5icm9hZGNhc3RNZXNzYWdlc1swXS50aXRsZSA6ICcnLFxuICAgICAgfTtcbiAgICBjYXNlICdJTkZPUk1BVElPTic6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiAnaW5mbycsXG4gICAgICAgIHRleHQ6IHNpdHVhdGlvbj8uYnJvYWRjYXN0TWVzc2FnZXMubGVuZ3RoID8gc2l0dWF0aW9uPy5icm9hZGNhc3RNZXNzYWdlc1swXS50aXRsZSA6ICcnLFxuICAgICAgfTtcbiAgICBjYXNlICdERUxBWSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiAnZGVsYXknLFxuICAgICAgICB0ZXh0OiBzaXR1YXRpb24/LmJyb2FkY2FzdE1lc3NhZ2VzLmxlbmd0aCA/IHNpdHVhdGlvbj8uYnJvYWRjYXN0TWVzc2FnZXNbMF0udGl0bGUgOiAnJyxcbiAgICAgIH07XG4gICAgY2FzZSAnVFJBSU5fUkVQTEFDRU1FTlRfQllfQlVTJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICdyZXBsYWNlbWVudGJ1cycsXG4gICAgICAgIHRleHQ6IHNpdHVhdGlvbj8uYnJvYWRjYXN0TWVzc2FnZXMubGVuZ3RoID8gc2l0dWF0aW9uPy5icm9hZGNhc3RNZXNzYWdlc1swXS50aXRsZSA6ICcnLFxuICAgICAgfTtcbiAgICBjYXNlICdDT05TVFJVQ1RJT05fU0lURSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiAnY29uc3RydWN0aW9uJyxcbiAgICAgICAgdGV4dDogc2l0dWF0aW9uPy5icm9hZGNhc3RNZXNzYWdlcy5sZW5ndGggPyBzaXR1YXRpb24/LmJyb2FkY2FzdE1lc3NhZ2VzWzBdLnRpdGxlIDogJycsXG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiAnaW5mbycsXG4gICAgICAgIHRleHQ6IHNpdHVhdGlvbj8uYnJvYWRjYXN0TWVzc2FnZXMubGVuZ3RoID8gc2l0dWF0aW9uPy5icm9hZGNhc3RNZXNzYWdlc1swXS50aXRsZSA6ICcnLFxuICAgICAgfTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldEN1cyA9ICh0cmlwOiBJVHJpcEl0ZW0sIGN1cnJlbnRMYW5ndWFnZTogc3RyaW5nKTogSGltQ3VzID0+IHtcbiAgY29uc3QgeyBzdW1tYXJ5LCBsZWdzIH0gPSB0cmlwIHx8IHt9O1xuICBjb25zdCByaWRlTGVncyA9IGxlZ3M/LmZpbHRlcigobGVnKSA9PiBpc1JpZGVMZWcobGVnKSkgYXMgUHRSaWRlTGVnW107XG4gIGNvbnN0IHsgdHJpcFN0YXR1cyB9ID0gc3VtbWFyeSB8fCB7fTtcblxuICBpZiAodHJpcFN0YXR1cz8uY2FuY2VsbGVkIHx8IHRyaXBTdGF0dXM/LnBhcnRpYWxseUNhbmNlbGxlZClcbiAgICByZXR1cm4geyBuYW1lOiAnY2FuY2VsbGF0aW9uJywgdGV4dDogdHJpcFN0YXR1cz8uY2FuY2VsbGVkVGV4dCB9O1xuICBpZiAoZ2V0UmVhY2hhYmxlVGV4dChyaWRlTGVncykpXG4gICAgcmV0dXJuIHsgbmFtZTogJ21pc3NlZC1jb25uZWN0aW9uJywgdGV4dDogZ2V0UmVhY2hhYmxlVGV4dChyaWRlTGVncykgfTtcbiAgaWYgKHRyaXBTdGF0dXM/LmFsdGVybmF0aXZlKSByZXR1cm4geyBuYW1lOiAnYWx0ZXJuYXRpdmUnLCB0ZXh0OiB0cmlwU3RhdHVzLmFsdGVybmF0aXZlVGV4dCB9O1xuICBpZiAoZ2V0UmVkaXJlY3RlZFRleHQocmlkZUxlZ3MpKSByZXR1cm4geyBuYW1lOiAncmVyb3V0ZScsIHRleHQ6IGdldFJlZGlyZWN0ZWRUZXh0KHJpZGVMZWdzKSB9O1xuICBpZiAoZ2V0VW5wbGFubmVkU3RvcChyaWRlTGVncykpIHJldHVybiB7IG5hbWU6ICdhZGQtc3RvcCcsIHRleHQ6IGdldFVucGxhbm5lZFN0b3AocmlkZUxlZ3MpIH07XG4gIGlmICh0cmlwU3RhdHVzPy5kZWxheWVkIHx8IHRyaXBTdGF0dXM/LmRlbGF5ZWRVbmtub3duKVxuICAgIHJldHVybiB7IG5hbWU6ICdkZWxheScsIHRleHQ6IGdldERlbGF5VGV4dChyaWRlTGVncykgfTtcbiAgaWYgKHRyaXBTdGF0dXM/LnF1YXlDaGFuZ2VkKSB7XG4gICAgY29uc3QgZGVwYXJ0dXJlID0gcmlkZUxlZ3NbMF0uZGVwYXJ0dXJlO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAncGxhdGZvcm0tY2hhbmdlJyxcbiAgICAgIHRleHQ6IGRlcGFydHVyZS5xdWF5Q2hhbmdlZCA/IGRlcGFydHVyZS5xdWF5Q2hhbmdlZFRleHQgOiBpMThuVHJpcFF1YXlDaGFuZ2VbY3VycmVudExhbmd1YWdlXSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHt9IGFzIEhpbUN1cztcbn07XG5cbmNvbnN0IGZpbmRBbmRSZXBsYWNlTm90aWNlID0gKG5vdGljZXM6IE5vdGljZVtdKTogTm90aWNlIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgcmVzZXJ2YXRpb25Ob3RpY2UgPSBbJ1JSJywgJ1JLJywgJ1JDJywgJ1JMJywgJ1JNJywgJ1JTJywgJ1JVJywgJ1hQJywgJ1hSJywgJ1hUJ107XG5cbiAgcmV0dXJuIG5vdGljZXMucmVkdWNlKChmb3VuZE5vdGljZTogTm90aWNlIHwgdW5kZWZpbmVkLCBub3RpY2U6IE5vdGljZSk6IE5vdGljZSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKGZvdW5kTm90aWNlKSByZXR1cm4gZm91bmROb3RpY2U7XG4gICAgaWYgKHJlc2VydmF0aW9uTm90aWNlLmluY2x1ZGVzKG5vdGljZS5uYW1lKSkge1xuICAgICAgcmV0dXJuIHsgLi4ubm90aWNlLCBuYW1lOiAnUlInIH0gYXMgTm90aWNlO1xuICAgIH1cbiAgfSwgdW5kZWZpbmVkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBmaWx0ZXJOb3RpY2VzID0gKG5vdGljZXM6IE5vdGljZVtdKTogTm90aWNlW10gPT4ge1xuICBjb25zdCBhbGxvd2VkTmFtZXMgPSBbJ1onLCAnU0InLCAnU1onLCAnVlInLCAnVEcnXTtcblxuICBjb25zdCBmaWx0ZXJOb3RpY2UgPSBub3RpY2VzLmZpbHRlcigobm90aWNlLCBpbmRleCkgPT4ge1xuICAgIHJldHVybiBub3RpY2VzLmZpbmRJbmRleCgobikgPT4gbi5uYW1lID09PSBub3RpY2UubmFtZSkgPT09IGluZGV4O1xuICB9KTtcblxuICByZXR1cm4gZmlsdGVyTm90aWNlXG4gICAgLmZpbHRlcigobm90aWNlKSA9PiBhbGxvd2VkTmFtZXMuaW5jbHVkZXMobm90aWNlLm5hbWUpKVxuICAgIC5zb3J0KChhLCBiKSA9PiBhbGxvd2VkTmFtZXMuaW5kZXhPZihhLm5hbWUpIC0gYWxsb3dlZE5hbWVzLmluZGV4T2YoYi5uYW1lKSk7XG59O1xuXG5leHBvcnQgY29uc3QgaGFuZGxlTm90aWNlcyA9IChub3RpY2VzOiBOb3RpY2VbXSk6IE5vdGljZVtdID0+IHtcbiAgY29uc3QgcmVzZXJ2YXRpb25Ob3RpY2UgPSBmaW5kQW5kUmVwbGFjZU5vdGljZShub3RpY2VzKTtcbiAgY29uc3QgZmlsdGVyZWROb3RpY2VzID0gZmlsdGVyTm90aWNlcyhub3RpY2VzKTtcblxuICBpZiAocmVzZXJ2YXRpb25Ob3RpY2UgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZpbHRlcmVkTm90aWNlcztcbiAgaWYgKCFmaWx0ZXJlZE5vdGljZXMubGVuZ3RoKSByZXR1cm4gW3Jlc2VydmF0aW9uTm90aWNlXTtcblxuICBpZiAoZmlsdGVyZWROb3RpY2VzWzBdLm5hbWUgPT09ICdaJyAmJiBmaWx0ZXJlZE5vdGljZXNbMV0pIHtcbiAgICByZXR1cm4gW2ZpbHRlcmVkTm90aWNlc1swXSwgcmVzZXJ2YXRpb25Ob3RpY2UsIGZpbHRlcmVkTm90aWNlc1sxXV0uY29uY2F0KFxuICAgICAgZmlsdGVyZWROb3RpY2VzLnNsaWNlKDIpLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gW3Jlc2VydmF0aW9uTm90aWNlLCAuLi5maWx0ZXJlZE5vdGljZXNdO1xufTtcblxuLyoqXG4gKiBJdCBkaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJpcCwgYWN0aW5nIGFzIGEgY29udGFpbmVyIGZvciBhbGwgdGhlIGBzYmItdGltZXRhYmxlLSpgIGNvbXBvbmVudHMuXG4gKiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3NiYi10aW1ldGFibGUtcm93JylcbmV4cG9ydCBjbGFzcyBTYmJUaW1ldGFibGVSb3dFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlO1xuXG4gIC8qKiBUaGUgdHJpcCBQcm9wLiAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSkgcHVibGljIHRyaXAhOiBJVHJpcEl0ZW07XG5cbiAgLyoqIFRoZSBwcmljZSBQcm9wLCB3aGljaCBjb25zaXN0cyBvZiB0aGUgZGF0YSBmb3IgdGhlIGJhZGdlLiAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSkgcHVibGljIHByaWNlPzogUHJpY2U7XG5cbiAgLyoqIFRoaXMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIHNiYi1wZWFybC1jaGFpbiBjb21wb25lbnQgLSBpZiB0cnVlIHRoZSBwb3NpdGlvbiB3b24ndCBiZSBhbmltYXRlZC4gKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZGlzYWJsZS1hbmltYXRpb24nLCByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBkaXNhYmxlQW5pbWF0aW9uPzogYm9vbGVhbjtcblxuICAvKiogVGhpcyB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgbm90aWNlcyBzZWN0aW9uICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSBwdWJsaWMgYm9hcmRpbmc/OiBCb2FyZGluZztcblxuICAvKipcbiAgICogVGhlIGxvYWRpbmcgc3RhdGUgLVxuICAgKiB3aGVuIHRoaXMgaXMgdHJ1ZSBpdCB3aWxsIGJlIHJlbmRlciBza2VsZXRvbiB3aXRoIGFuIGlkbGluZyBhbmltYXRpb25cbiAgICovXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2xvYWRpbmctdHJpcCcsIHR5cGU6IEJvb2xlYW4gfSkgcHVibGljIGxvYWRpbmdUcmlwID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2FkaW5nIHN0YXRlIC1cbiAgICogd2hlbiB0aGlzIGlzIHRydWUgaXQgd2lsbCBiZSByZW5kZXIgc2tlbGV0b24gd2l0aCBhbiBpZGxpbmcgYW5pbWF0aW9uXG4gICAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdsb2FkaW5nLXByaWNlJywgdHlwZTogQm9vbGVhbiB9KSBwdWJsaWMgbG9hZGluZ1ByaWNlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEhpZGRlbiBsYWJlbCBmb3IgdGhlIGNhcmQgYWN0aW9uLiBJdCBvdmVycmlkZXMgdGhlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGFjY2Vzc2liaWxpdHkgdGV4dCBmb3IgdGhlIGNvbXBvbmVudC4gVXNlIHRoaXMgcHJvcCB0byBwcm92aWRlIGN1c3RvbSBhY2Nlc3NpYmlsaXR5IGluZm9ybWF0aW9uIGZvciB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnY2FyZC1hY3Rpb24tbGFiZWwnIH0pIHB1YmxpYyBjYXJkQWN0aW9uTGFiZWw/OiBzdHJpbmc7XG5cbiAgLyoqIFRoaXMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIHNiYi1jYXJkIGNvbXBvbmVudCBhcyBhcmlhLWV4cGFuZGVkLiAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdhY2Nlc3NpYmlsaXR5LWV4cGFuZGVkJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzaWJpbGl0eUV4cGFuZGVkPzogYm9vbGVhbjtcblxuICAvKiogV2hlbiB0aGlzIHByb3AgaXMgdHJ1ZSB0aGUgc2JiLWNhcmQgd2lsbCBiZSBpbiB0aGUgYWN0aXZlIHN0YXRlLiAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIHB1YmxpYyBhY3RpdmU/OiBib29sZWFuO1xuXG4gIC8qKiBBIGNvbmZpZ3VyZWQgZGF0ZSB3aGljaCBhY3RzIGFzIHRoZSBjdXJyZW50IGRhdGUgaW5zdGVhZCBvZiB0aGUgcmVhbCBjdXJyZW50IGRhdGUuIFJlY29tbWVuZGVkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLiAqL1xuICBAcHJvcGVydHkoKVxuICBwdWJsaWMgc2V0IG5vdyh2YWx1ZTogU2JiRGF0ZUxpa2UgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ub3cgPSBkZWZhdWx0RGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKGRlZmF1bHREYXRlQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuICB9XG4gIHB1YmxpYyBnZXQgbm93KCk6IERhdGUge1xuICAgIHJldHVybiB0aGlzLl9ub3cgPz8gbmV3IERhdGUoKTtcbiAgfVxuICBwcml2YXRlIF9ub3c6IERhdGUgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIF9sYW5ndWFnZSA9IG5ldyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIodGhpcyk7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdsb2FkaW5nVHJpcCcpKSB7XG4gICAgICBzZXRPclJlbW92ZUF0dHJpYnV0ZSh0aGlzLCAncm9sZScsICF0aGlzLmxvYWRpbmdUcmlwID8gJ3Jvd2dyb3VwJyA6IG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgc2tlbGV0b24gcmVuZGVyIGZ1bmN0aW9uIGZvciB0aGUgbG9hZGluZyBzdGF0ZSAqL1xuICBwcml2YXRlIF9yZW5kZXJTa2VsZXRvbigpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2JiLWNhcmQgc2l6ZT1cImxcIiBjbGFzcz1cInNiYi1sb2FkaW5nXCI+XG4gICAgICAgICR7dGhpcy5sb2FkaW5nUHJpY2VcbiAgICAgICAgICA/IGh0bWxgPHNiYi1jYXJkLWJhZGdlIGNsYXNzPVwic2JiLWxvYWRpbmdfX2JhZGdlXCI+PC9zYmItY2FyZC1iYWRnZT5gXG4gICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLWxvYWRpbmdfX3dyYXBwZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLWxvYWRpbmdfX3Jvd1wiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItbG9hZGluZ19fcm93XCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1sb2FkaW5nX19yb3dcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NiYi1jYXJkPlxuICAgIGA7XG4gIH1cblxuICBwcml2YXRlIF9nZXRRdWF5VHlwZSh2ZWhpY2xlTW9kZTogc3RyaW5nKTogYW55IHtcbiAgICBzd2l0Y2ggKHZlaGljbGVNb2RlKSB7XG4gICAgICBjYXNlICdUUkFJTic6XG4gICAgICAgIHJldHVybiBpMThuRnJvbVBsYXRmb3JtO1xuICAgICAgY2FzZSAnU0hJUCc6XG4gICAgICAgIHJldHVybiBpMThuRnJvbVBpZXI7XG4gICAgICBjYXNlICdUUkFNV0FZJzpcbiAgICAgICAgcmV0dXJuIGkxOG5Gcm9tU3RhbmQ7XG4gICAgICBjYXNlICdCVVMnOlxuICAgICAgICByZXR1cm4gaTE4bkZyb21TdGFuZDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UXVheVR5cGVTdHJpbmdzKCk6IHsgbG9uZzogc3RyaW5nOyBzaG9ydDogc3RyaW5nIH0gfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudHJpcC5zdW1tYXJ5Py5wcm9kdWN0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBxdWF5VHlwZSA9IHRoaXMuX2dldFF1YXlUeXBlKHRoaXMudHJpcC5zdW1tYXJ5LnByb2R1Y3Q/LnZlaGljbGVNb2RlKTtcbiAgICByZXR1cm4ge1xuICAgICAgbG9uZzogcXVheVR5cGU/LmxvbmdbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICBzaG9ydDogcXVheVR5cGU/LnNob3J0W3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdLFxuICAgIH07XG4gIH1cblxuICAvKiogbWFwIFF1YXkgKi9cbiAgcHJpdmF0ZSBfcmVuZGVyUXVheVR5cGUoKTogVGVtcGxhdGVSZXN1bHQgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy50cmlwLnN1bW1hcnk/LnByb2R1Y3QpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcXVheVR5cGVTdHJpbmdzID0gdGhpcy5fZ2V0UXVheVR5cGVTdHJpbmdzKCk7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c3BhbiBjbGFzcz1cInNiYi10aW1ldGFibGVfX3Jvdy0tcXVheVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIj4ke3F1YXlUeXBlU3RyaW5ncz8ubG9uZ30mbmJzcDs8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2JiLXRpbWV0YWJsZV9fcm93LS1xdWF5LXR5cGVcIiBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgID4ke3F1YXlUeXBlU3RyaW5ncz8uc2hvcnR9PC9zcGFuXG4gICAgICAgID5cbiAgICAgIDwvc3Bhbj5cbiAgICBgO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlSGltQ3VzKHRyaXA6IElUcmlwSXRlbSk6IHsgY3VzOiBIaW1DdXMgfCBudWxsOyBoaW06IEhpbUN1cyB8IG51bGwgfSB7XG4gICAgY29uc3QgeyBzaXR1YXRpb25zIH0gPSB0cmlwIHx8IHt9O1xuICAgIGNvbnN0IHNvcnRlZFNpdHVhdGlvbnMgPSBzaXR1YXRpb25zICYmIHNvcnRTaXR1YXRpb24oc2l0dWF0aW9ucyk7XG4gICAgY29uc3QgY3VzID0gZ2V0Q3VzKHRyaXAsIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1czogT2JqZWN0LmtleXMoY3VzKT8ubGVuZ3RoID8gY3VzIDogbnVsbCxcbiAgICAgIGhpbTogc2l0dWF0aW9ucz8ubGVuZ3RoID8gZ2V0SGltSWNvbihzb3J0ZWRTaXR1YXRpb25zWzBdKSA6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEFjY2Vzc2liaWxpdHlUZXh0KHRyaXA6IElUcmlwSXRlbSk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBzdW1tYXJ5LCBsZWdzLCBub3RpY2VzIH0gPSB0cmlwIHx8IHt9O1xuICAgIGNvbnN0IHtcbiAgICAgIGRlcGFydHVyZVdhbGssXG4gICAgICBhcnJpdmFsV2FsayxcbiAgICAgIGRlcGFydHVyZSxcbiAgICAgIGFycml2YWwsXG4gICAgICBwcm9kdWN0LFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgb2NjdXBhbmN5LFxuICAgICAgZHVyYXRpb24sXG4gICAgfSA9IHN1bW1hcnkgfHwge307XG5cbiAgICBjb25zdCB7IGRlcGFydHVyZVRpbWVBdHRyaWJ1dGUsIGFycml2YWxUaW1lQXR0cmlidXRlIH0gPSBnZXREZXBhcnR1cmVBcnJpdmFsVGltZUF0dHJpYnV0ZShcbiAgICAgIGxlZ3MsXG4gICAgICBkZXBhcnR1cmVXYWxrIHx8IDAsXG4gICAgICBhcnJpdmFsV2FsayB8fCAwLFxuICAgICAgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCxcbiAgICApO1xuXG4gICAgY29uc3QgZGVwYXJ0dXJlVGltZTogRGF0ZSB8IHVuZGVmaW5lZCA9IGRlcGFydHVyZT8udGltZVxuICAgICAgPyByZW1vdmVUaW1lem9uZUZyb21JU09UaW1lU3RyaW5nKGRlcGFydHVyZS50aW1lKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBhcnJpdmFsVGltZTogRGF0ZSB8IHVuZGVmaW5lZCA9IGFycml2YWw/LnRpbWVcbiAgICAgID8gcmVtb3ZlVGltZXpvbmVGcm9tSVNPVGltZVN0cmluZyhhcnJpdmFsLnRpbWUpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGRlcGFydHVyZVdhbGtUZXh0ID0gZGVwYXJ0dXJlVGltZUF0dHJpYnV0ZVxuICAgICAgPyBgJHtkZXBhcnR1cmVUaW1lQXR0cmlidXRlLnRleHR9ICR7ZGVwYXJ0dXJlVGltZUF0dHJpYnV0ZS5kdXJhdGlvbn0sIGBcbiAgICAgIDogJyc7XG5cbiAgICBjb25zdCBhcnJpdmFsV2Fsa1RleHQgPSBhcnJpdmFsVGltZUF0dHJpYnV0ZVxuICAgICAgPyBgJHthcnJpdmFsVGltZUF0dHJpYnV0ZS50ZXh0fSAke2Fycml2YWxUaW1lQXR0cmlidXRlLmR1cmF0aW9ufSwgYFxuICAgICAgOiAnJztcblxuICAgIGNvbnN0IGRlcGFydHVyZVRpbWVUZXh0ID0gZGVwYXJ0dXJlVGltZVxuICAgICAgPyBgJHtpMThuRGVwYXJ0dXJlW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfTogJHtmb3JtYXQoZGVwYXJ0dXJlVGltZSwgJ0hIOm1tJyl9LCBgXG4gICAgICA6ICcnO1xuXG4gICAgY29uc3QgZ2V0RGVwYXJ0dXJlUXVheVRleHQgPSAoKTogc3RyaW5nID0+IHtcbiAgICAgIGlmICghZGVwYXJ0dXJlPy5xdWF5Rm9ybWF0dGVkKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIHByZWZpeCBcIm5ld1wiIGlmIHF1YXkgd2FzIGNoYW5nZWRcbiAgICAgIGNvbnN0IGNoYW5nZWRRdWF5UHJlZml4ID0gZGVwYXJ0dXJlPy5xdWF5Q2hhbmdlZCA/IGAke2kxOG5OZXdbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19IGAgOiAnJztcbiAgICAgIHJldHVybiBgJHtjaGFuZ2VkUXVheVByZWZpeH0ke1xuICAgICAgICB0aGlzLl9nZXRRdWF5VHlwZVN0cmluZ3MoKT8ubG9uZ1xuICAgICAgfSAke2RlcGFydHVyZT8ucXVheUZvcm1hdHRlZH0sIGA7XG4gICAgfTtcblxuICAgIGNvbnN0IG1lYW5zT2ZUcmFuc3BvcnRUZXh0ID1cbiAgICAgIHByb2R1Y3QgJiYgcHJvZHVjdC52ZWhpY2xlTW9kZVxuICAgICAgICA/IGkxOG5NZWFuc09mVHJhbnNwb3J0W3Byb2R1Y3QudmVoaWNsZU1vZGUudG9Mb3dlckNhc2UoKV0gJiZcbiAgICAgICAgICBgJHtpMThuTWVhbnNPZlRyYW5zcG9ydFtwcm9kdWN0LnZlaGljbGVNb2RlLnRvTG93ZXJDYXNlKCldW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSwgYFxuICAgICAgICA6ICcnO1xuXG4gICAgY29uc3QgdmVoaWNsZVN1Yk1vZGVUZXh0ID0gcHJvZHVjdD8udmVoaWNsZVN1Yk1vZGVTaG9ydE5hbWVcbiAgICAgID8gYCR7cHJvZHVjdC52ZWhpY2xlU3ViTW9kZVNob3J0TmFtZX0gJHtwcm9kdWN0LmxpbmUgfHwgJyd9LCBgXG4gICAgICA6ICcnO1xuXG4gICAgY29uc3QgZGlyZWN0aW9uVGV4dCA9IGAke2kxOG5EaXJlY3Rpb25bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19ICR7ZGlyZWN0aW9ufSwgYDtcblxuICAgIGNvbnN0IGhpbUN1cyA9IHRoaXMuX2hhbmRsZUhpbUN1cyh0cmlwKTtcbiAgICBjb25zdCBjdXNUZXh0ID0gaGltQ3VzPy5jdXM/LnRleHRcbiAgICAgID8gYCR7aTE4blJlYWxUaW1lSW5mb1t0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX06ICR7aGltQ3VzPy5jdXM/LnRleHR9LCBgXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGhpbVRleHQgPSBoaW1DdXM/LmhpbT8udGV4dFxuICAgICAgPyBgJHtpMThuUmVhbFRpbWVJbmZvW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfTogJHtoaW1DdXM/LmhpbT8udGV4dH0sIGBcbiAgICAgIDogJyc7XG5cbiAgICBjb25zdCBib2FyZGluZ1RleHQgPSB0aGlzLmJvYXJkaW5nID8gYCR7dGhpcy5ib2FyZGluZy50ZXh0fSwgYCA6ICcnO1xuXG4gICAgY29uc3QgcHJpY2VUZXh0ID0gYCR7dGhpcy5wcmljZT8uaXNEaXNjb3VudCA/IGkxOG5TdXBlcnNhdmVyW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdIDogJyd9ICR7XG4gICAgICB0aGlzLnByaWNlPy50ZXh0ICYmIHRoaXMucHJpY2U/LnByaWNlXG4gICAgICAgID8gKHRoaXMucHJpY2U/LnRleHQgfHwgJycpICsgJyAnICsgKHRoaXMucHJpY2U/LnByaWNlIHx8ICcnKSArICcsICdcbiAgICAgICAgOiAnJ1xuICAgIH1gO1xuXG4gICAgY29uc3QgdHJhbnNmZXJQcm9jZWR1cmVzID1cbiAgICAgIGxlZ3M/Lmxlbmd0aCA+IDFcbiAgICAgICAgPyBgJHtsZWdzPy5sZW5ndGggLSAxfSAke2kxOG5UcmFuc2ZlclByb2NlZHVyZXNbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19LCBgXG4gICAgICAgIDogJyc7XG5cbiAgICBjb25zdCBhcnJpdmFsVGltZVRleHQgPSBhcnJpdmFsVGltZVxuICAgICAgPyBgJHtpMThuQXJyaXZhbFt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX06ICR7Zm9ybWF0KGFycml2YWxUaW1lLCAnSEg6bW0nKX0sIGBcbiAgICAgIDogJyc7XG5cbiAgICBsZXQgb2NjdXBhbmN5VGV4dDogc3RyaW5nID0gJyc7XG4gICAgaWYgKG9jY3VwYW5jeSkge1xuICAgICAgaWYgKG9jY3VwYW5jeS5maXJzdENsYXNzICYmIG9jY3VwYW5jeS5maXJzdENsYXNzICE9PSAnVU5LTk9XTicpIHtcbiAgICAgICAgb2NjdXBhbmN5VGV4dCArPSBgJHtpMThuQ2xhc3MuZmlyc3RbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19ICR7XG4gICAgICAgICAgKFxuICAgICAgICAgICAgaTE4bk9jY3VwYW5jeVtvY2N1cGFuY3kuZmlyc3RDbGFzcy50b0xvd2VyQ2FzZSgpIGFzIFNiYk9jY3VwYW5jeV0gYXMgUmVjb3JkPFxuICAgICAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgICAgIHN0cmluZ1xuICAgICAgICAgICAgPlxuICAgICAgICAgICk/Llt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XVxuICAgICAgICB9LmA7XG4gICAgICB9XG4gICAgICBpZiAob2NjdXBhbmN5LnNlY29uZENsYXNzICYmIG9jY3VwYW5jeS5zZWNvbmRDbGFzcyAhPT0gJ1VOS05PV04nKSB7XG4gICAgICAgIG9jY3VwYW5jeVRleHQgKz0gYCAke2kxOG5DbGFzcy5zZWNvbmRbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19ICR7XG4gICAgICAgICAgKFxuICAgICAgICAgICAgaTE4bk9jY3VwYW5jeVtvY2N1cGFuY3kuc2Vjb25kQ2xhc3MudG9Mb3dlckNhc2UoKSBhcyBTYmJPY2N1cGFuY3ldIGFzIFJlY29yZDxcbiAgICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgICBzdHJpbmdcbiAgICAgICAgICAgID5cbiAgICAgICAgICApPy5bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF1cbiAgICAgICAgfS5gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPVxuICAgICAgbm90aWNlcyAmJlxuICAgICAgaGFuZGxlTm90aWNlcyhub3RpY2VzKS5sZW5ndGggJiZcbiAgICAgIGhhbmRsZU5vdGljZXMobm90aWNlcylcbiAgICAgICAgPy5tYXAoKG5vdGljZSwgaW5kZXgpID0+IGluZGV4IDwgNCAmJiBub3RpY2UudGV4dD8udGVtcGxhdGUpXG4gICAgICAgIC5qb2luKCcsICcpICsgJywgJztcblxuICAgIGNvbnN0IGF0dHJpYnV0ZXNUZXh0ID0gYXR0cmlidXRlc1xuICAgICAgPyBgJHtpMThuVHJhdmVsaGludHNbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19OiAke2F0dHJpYnV0ZXN9YFxuICAgICAgOiAnJztcblxuICAgIGNvbnN0IGR1cmF0aW9uVGV4dCA9XG4gICAgICAhIWR1cmF0aW9uICYmIGR1cmF0aW9uID4gMFxuICAgICAgICA/IGAke2kxOG5UcmlwRHVyYXRpb25bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19ICR7XG4gICAgICAgICAgICBkdXJhdGlvblRvVGltZShkdXJhdGlvbiwgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCkubG9uZ1xuICAgICAgICAgIH0sIGBcbiAgICAgICAgOiAnJztcblxuICAgIHJldHVybiBgJHtkZXBhcnR1cmVXYWxrVGV4dH0gJHtkZXBhcnR1cmVUaW1lVGV4dH0gJHtnZXREZXBhcnR1cmVRdWF5VGV4dCgpfSAke21lYW5zT2ZUcmFuc3BvcnRUZXh0fSAke3ZlaGljbGVTdWJNb2RlVGV4dH0gJHtkaXJlY3Rpb25UZXh0fSAke2N1c1RleHR9ICR7Ym9hcmRpbmdUZXh0fSAke3ByaWNlVGV4dH0gJHtcbiAgICAgIGN1c1RleHQgPyAnJyA6IGhpbVRleHRcbiAgICB9ICR7YXJyaXZhbFRpbWVUZXh0fSAke2Fycml2YWxXYWxrVGV4dH0gJHtkdXJhdGlvblRleHR9ICR7dHJhbnNmZXJQcm9jZWR1cmVzfSAke29jY3VwYW5jeVRleHR9ICR7YXR0cmlidXRlc1RleHR9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZW5kZXIoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGlmICh0aGlzLmxvYWRpbmdUcmlwKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVuZGVyU2tlbGV0b24oKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGxlZ3MsIGlkLCBub3RpY2VzLCBzdW1tYXJ5IH0gPSB0aGlzLnRyaXAgfHwge307XG5cbiAgICBjb25zdCB7XG4gICAgICBwcm9kdWN0LFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgZGVwYXJ0dXJlV2FsayxcbiAgICAgIGRlcGFydHVyZSxcbiAgICAgIGFycml2YWwsXG4gICAgICBhcnJpdmFsV2FsayxcbiAgICAgIG9jY3VwYW5jeSxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH0gPSBzdW1tYXJ5IHx8IHt9O1xuXG4gICAgY29uc3QgaGltQ3VzID0gdGhpcy5faGFuZGxlSGltQ3VzKHRoaXMudHJpcCk7XG4gICAgY29uc3QgaGFzSGltQ3VzID0gISFoaW1DdXMuY3VzIHx8ICEhaGltQ3VzLmhpbTtcblxuICAgIGNvbnN0IG5vdGljZUF0dHJpYnV0ZXMgPSBub3RpY2VzICYmIGhhbmRsZU5vdGljZXMobm90aWNlcyk7XG5cbiAgICBjb25zdCBkdXJhdGlvbk9iaiA9IGR1cmF0aW9uID8gZHVyYXRpb25Ub1RpbWUoZHVyYXRpb24sIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpIDogbnVsbDtcblxuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNiYi1jYXJkIHNpemU9XCJsXCIgaWQ9JHtpZH0+XG4gICAgICAgIDxzYmItY2FyZC1idXR0b25cbiAgICAgICAgICA/YWN0aXZlPSR7dGhpcy5hY3RpdmV9XG4gICAgICAgICAgYXJpYS1leHBhbmRlZD0ke3RoaXMuYWNjZXNzaWJpbGl0eUV4cGFuZGVkPy50b1N0cmluZygpID8/IG5vdGhpbmd9XG4gICAgICAgID5cbiAgICAgICAgICAke3RoaXMuY2FyZEFjdGlvbkxhYmVsID8gdGhpcy5jYXJkQWN0aW9uTGFiZWwgOiB0aGlzLl9nZXRBY2Nlc3NpYmlsaXR5VGV4dCh0aGlzLnRyaXApfVxuICAgICAgICA8L3NiYi1jYXJkLWJ1dHRvbj5cbiAgICAgICAgJHt0aGlzLmxvYWRpbmdQcmljZVxuICAgICAgICAgID8gaHRtbGA8c2JiLWNhcmQtYmFkZ2UgY2xhc3M9XCJzYmItbG9hZGluZ19fYmFkZ2VcIj48L3NiYi1jYXJkLWJhZGdlPmBcbiAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICR7dGhpcy5wcmljZSAmJiAhdGhpcy5sb2FkaW5nUHJpY2VcbiAgICAgICAgICA/IGh0bWxgPHNiYi1jYXJkLWJhZGdlIGNvbG9yPSR7dGhpcy5wcmljZS5pc0Rpc2NvdW50ID8gJ2NoYXJjb2FsJyA6ICd3aGl0ZSd9PlxuICAgICAgICAgICAgICAke3RoaXMucHJpY2UuaXNEaXNjb3VudFxuICAgICAgICAgICAgICAgID8gaHRtbGA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgJTxzcGFuIGNsYXNzPVwic2JiLXNjcmVlbi1yZWFkZXItb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgPiR7aTE4blN1cGVyc2F2ZXJbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5gXG4gICAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgICAgICAke3RoaXMucHJpY2UudGV4dCA/IGh0bWxgPHNwYW4+JHt0aGlzLnByaWNlLnRleHR9PC9zcGFuPmAgOiBub3RoaW5nfVxuICAgICAgICAgICAgICAke3RoaXMucHJpY2UucHJpY2UgPyBodG1sYDxzcGFuPiR7dGhpcy5wcmljZS5wcmljZX08L3NwYW4+YCA6IG5vdGhpbmd9XG4gICAgICAgICAgICA8L3NiYi1jYXJkLWJhZGdlPmBcbiAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmItdGltZXRhYmxlX19yb3dcIiByb2xlPVwicm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiYi10aW1ldGFibGVfX3Jvdy1oZWFkZXJcIiByb2xlPVwiZ3JpZGNlbGxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItdGltZXRhYmxlX19yb3ctZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAke3Byb2R1Y3Q/LmNvcnBvcmF0ZUlkZW50aXR5UGljdG9ncmFtICYmXG4gICAgICAgICAgICAgIGh0bWxgPHNwYW4gY2xhc3M9XCJzYmItdGltZXRhYmxlX19yb3ctdHJhbnNwb3J0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICA8c2JiLWljb25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2JiLXRpbWV0YWJsZV9fcm93LXRyYW5zcG9ydC1pY29uXCJcbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJwaWN0bzoke3Byb2R1Y3QuY29ycG9yYXRlSWRlbnRpdHlQaWN0b2dyYW19XCJcbiAgICAgICAgICAgICAgICA+PC9zYmItaWNvbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICR7cHJvZHVjdCAmJlxuICAgICAgICAgICAgICAgICAgcHJvZHVjdC52ZWhpY2xlTW9kZSAmJlxuICAgICAgICAgICAgICAgICAgaTE4bk1lYW5zT2ZUcmFuc3BvcnRbcHJvZHVjdC52ZWhpY2xlTW9kZS50b0xvd2VyQ2FzZSgpXSAmJlxuICAgICAgICAgICAgICAgICAgaTE4bk1lYW5zT2ZUcmFuc3BvcnRbcHJvZHVjdC52ZWhpY2xlTW9kZS50b0xvd2VyQ2FzZSgpXVt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX1cbiAgICAgICAgICAgICAgICAgICZuYnNwO1xuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPmB9XG4gICAgICAgICAgICAgICR7cHJvZHVjdCAmJlxuICAgICAgICAgICAgICAocHJvZHVjdC5jb3Jwb3JhdGVJZGVudGl0eUljb25cbiAgICAgICAgICAgICAgICA/IHJlbmRlckljb25Qcm9kdWN0KHByb2R1Y3QuY29ycG9yYXRlSWRlbnRpdHlJY29uLCBwcm9kdWN0Lm5hbWUpXG4gICAgICAgICAgICAgICAgOiBwcm9kdWN0LnZlaGljbGVTdWJNb2RlU2hvcnROYW1lICYmXG4gICAgICAgICAgICAgICAgICByZW5kZXJTdHJpbmdQcm9kdWN0KHByb2R1Y3QudmVoaWNsZVN1Yk1vZGVTaG9ydE5hbWUsIHByb2R1Y3Q/LmxpbmUpKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgJHtkaXJlY3Rpb25cbiAgICAgICAgICAgICAgPyBodG1sYDxwPiR7YCR7aTE4bkRpcmVjdGlvblt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0gJHtkaXJlY3Rpb259YH08L3A+YFxuICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNiYi1wZWFybC1jaGFpbi10aW1lXG4gICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgLmxlZ3M9JHtsZWdzfVxuICAgICAgICAgICAgLmRlcGFydHVyZVRpbWU9JHtkZXBhcnR1cmU/LnRpbWV9XG4gICAgICAgICAgICAuYXJyaXZhbFRpbWU9JHthcnJpdmFsPy50aW1lfVxuICAgICAgICAgICAgLmRlcGFydHVyZVdhbGs9JHtkZXBhcnR1cmVXYWxrfVxuICAgICAgICAgICAgLmFycml2YWxXYWxrPSR7YXJyaXZhbFdhbGt9XG4gICAgICAgICAgICA/ZGlzYWJsZS1hbmltYXRpb249JHt0aGlzLmRpc2FibGVBbmltYXRpb259XG4gICAgICAgICAgICAubm93PSR7dGhpcy5ub3d9XG4gICAgICAgICAgPjwvc2JiLXBlYXJsLWNoYWluLXRpbWU+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiYi10aW1ldGFibGVfX3Jvdy1mb290ZXJcIiByb2xlPVwiZ3JpZGNlbGxcIj5cbiAgICAgICAgICAgICR7cHJvZHVjdCAmJiB0aGlzLl9nZXRRdWF5VHlwZShwcm9kdWN0LnZlaGljbGVNb2RlKSAmJiBkZXBhcnR1cmU/LnF1YXlGb3JtYXR0ZWRcbiAgICAgICAgICAgICAgPyBodG1sYDxzcGFuXG4gICAgICAgICAgICAgICAgICBjbGFzcz0ke2RlcGFydHVyZT8ucXVheUNoYW5nZWQgPyBgc2JiLXRpbWV0YWJsZV9fcm93LXF1YXktLWNoYW5nZWRgIDogbm90aGluZ31cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICAgJHtgJHtpMThuRGVwYXJ0dXJlW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSAke1xuICAgICAgICAgICAgICAgICAgICAgIGRlcGFydHVyZT8ucXVheUNoYW5nZWQgPyBpMThuTmV3W3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdIDogJydcbiAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICZuYnNwO1xuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgJHt0aGlzLl9yZW5kZXJRdWF5VHlwZSgpfSAke2RlcGFydHVyZT8ucXVheUZvcm1hdHRlZH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+YFxuICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgICAkeyhvY2N1cGFuY3k/LmZpcnN0Q2xhc3MgJiYgb2NjdXBhbmN5Py5maXJzdENsYXNzICE9PSAnVU5LTk9XTicpIHx8XG4gICAgICAgICAgICAob2NjdXBhbmN5Py5zZWNvbmRDbGFzcyAmJiBvY2N1cGFuY3kuc2Vjb25kQ2xhc3MgIT09ICdVTktOT1dOJylcbiAgICAgICAgICAgICAgPyBodG1sYDxzYmItdGltZXRhYmxlLW9jY3VwYW5jeVxuICAgICAgICAgICAgICAgICAgLmZpcnN0Q2xhc3NPY2N1cGFuY3k9JHtvY2N1cGFuY3k/LmZpcnN0Q2xhc3M/LnRvTG93ZXJDYXNlKCl9XG4gICAgICAgICAgICAgICAgICAuc2Vjb25kQ2xhc3NPY2N1cGFuY3k9JHtvY2N1cGFuY3k/LnNlY29uZENsYXNzPy50b0xvd2VyQ2FzZSgpfVxuICAgICAgICAgICAgICAgID48L3NiYi10aW1ldGFibGUtb2NjdXBhbmN5PmBcbiAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgICAgJHsobm90aWNlQXR0cmlidXRlcyAmJiBub3RpY2VBdHRyaWJ1dGVzLmxlbmd0aCkgfHwgdGhpcy5ib2FyZGluZ1xuICAgICAgICAgICAgICA/IGh0bWxgPHVsIGNsYXNzPVwic2JiLXRpbWV0YWJsZV9fcm93LWhpbnRzXCIgcm9sZT1cImxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICR7bm90aWNlQXR0cmlidXRlcz8ubWFwKChub3RpY2UsIGluZGV4KSA9PlxuICAgICAgICAgICAgICAgICAgICBpbmRleCA8IDRcbiAgICAgICAgICAgICAgICAgICAgICA/IGh0bWxgPGxpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c2JiLWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNiYi10cmF2ZWwtaGludHNfX2l0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9JHsnc2EtJyArIG5vdGljZS5uYW1lPy50b0xvd2VyQ2FzZSgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zYmItaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmItc2NyZWVuLXJlYWRlci1vbmx5XCI+JHtub3RpY2UudGV4dD8udGVtcGxhdGV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5gXG4gICAgICAgICAgICAgICAgICAgICAgOiBub3RoaW5nLFxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICR7dGhpcy5ib2FyZGluZ1xuICAgICAgICAgICAgICAgICAgICA/IGh0bWxgPGxpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNiYi1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2JiLXRyYXZlbC1oaW50c19faXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9JHt0aGlzLmJvYXJkaW5nPy5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPSR7dGhpcy5ib2FyZGluZz8udGV4dH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zYmItaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2xpPmBcbiAgICAgICAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgICAgICAgIDwvdWw+YFxuICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgICAke2R1cmF0aW9uICYmIGR1cmF0aW9uID4gMFxuICAgICAgICAgICAgICA/IGh0bWxgPHRpbWU+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICAgJHtgJHtpMThuVHJpcER1cmF0aW9uW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSAke2R1cmF0aW9uT2JqIS5sb25nfWB9XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4ke2R1cmF0aW9uT2JqIS5zaG9ydH08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC90aW1lPmBcbiAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgICAgJHtoYXNIaW1DdXMgJiYgKGhpbUN1cy5jdXMgfHwgaGltQ3VzLmhpbSlcbiAgICAgICAgICAgICAgPyBodG1sYDxzcGFuIGNsYXNzPVwic2JiLXRpbWV0YWJsZV9fcm93LXdhcm5pbmdcIj5cbiAgICAgICAgICAgICAgICAgIDxzYmItaWNvbiBuYW1lPSR7KGhpbUN1cy5jdXMgfHwgaGltQ3VzLmhpbSkhLm5hbWV9Pjwvc2JiLWljb24+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIj4keyhoaW1DdXMuY3VzIHx8IGhpbUN1cy5oaW0pIS50ZXh0fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+YFxuICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zYmItY2FyZD5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICdzYmItdGltZXRhYmxlLXJvdyc6IFNiYlRpbWV0YWJsZVJvd0VsZW1lbnQ7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJfYiIsIl9hIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdEYSxNQUFBLG9CQUFvQixDQUFDLE1BQWMsU0FBaUM7QUFDeEUsU0FBQTtBQUFBLHFCQUNZLElBQUk7QUFBQSwyQ0FDa0IsSUFBSTtBQUFBO0FBRS9DO0FBRWEsTUFBQSxzQkFBc0IsQ0FBQyxhQUFxQixTQUF5QztBQUMxRixR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