@sbb-esta/lyne-elements-experimental 4.13.0 → 4.14.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 (176) hide show
  1. package/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.js +1 -1
  2. package/autocomplete-grid/autocomplete-grid-cell.js +1 -1
  3. package/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +1 -1
  4. package/autocomplete-grid/autocomplete-grid-option.js +1 -1
  5. package/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.js +1 -1
  6. package/autocomplete-grid/autocomplete-grid-row.js +1 -1
  7. package/autocomplete-grid.js +3 -3
  8. package/autocomplete-grid.pure.js +3 -3
  9. package/core/datetime/date-helper.js +1 -1
  10. package/core/datetime.js +1 -1
  11. package/custom-elements.json +84 -93
  12. package/{date-helper-CGproP5d.js → date-helper-NgYaHPR7.js} +3 -3
  13. package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +1 -1
  14. package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +1 -1
  15. package/development/autocomplete-grid/autocomplete-grid-button.js +1 -1
  16. package/development/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.js +1 -1
  17. package/development/autocomplete-grid/autocomplete-grid-cell.js +2 -2
  18. package/development/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.component.js +1 -1
  19. package/development/autocomplete-grid/autocomplete-grid-optgroup.js +1 -1
  20. package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +1 -1
  21. package/development/autocomplete-grid/autocomplete-grid-option.js +2 -2
  22. package/development/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.js +1 -1
  23. package/development/autocomplete-grid/autocomplete-grid-row.js +2 -2
  24. package/development/autocomplete-grid/autocomplete-grid.js +1 -1
  25. package/development/{autocomplete-grid-cell.component-BxkWGaX0.js → autocomplete-grid-cell.component-CTC6s1q3.js} +1 -1
  26. package/development/{autocomplete-grid-option.component-5mPGswUO.js → autocomplete-grid-option.component-DqkLWHcg.js} +1 -1
  27. package/development/{autocomplete-grid-row.component-DEm6zyHZ.js → autocomplete-grid-row.component-CvF3ZWDZ.js} +1 -1
  28. package/development/autocomplete-grid.js +4 -4
  29. package/development/autocomplete-grid.pure.js +3 -3
  30. package/development/core/datetime/date-helper.js +1 -1
  31. package/development/core/datetime.js +1 -1
  32. package/development/core/timetable/access-leg-helper.js +1 -1
  33. package/development/core/timetable/timetable-helper.js +1 -1
  34. package/development/core/timetable/timetable-properties.d.ts +2 -0
  35. package/development/core/timetable/timetable-properties.d.ts.map +1 -1
  36. package/development/date-helper-QhWjANc3.js +539 -0
  37. package/development/{differenceInMinutes-B7_GTDq7.js → differenceInMinutes-CxAbGYQ3.js} +2 -2
  38. package/development/{format-DFx4997p.js → format-Cx3zmmaF.js} +3 -3
  39. package/development/{isValid-JpZ7FphI.js → isValid-40Olgzo1.js} +2 -2
  40. package/development/journey-summary/journey-summary.component.js +1 -1
  41. package/development/{journey-summary.component-BZwgD4im.js → journey-summary.component-BTaPGCGZ.js} +3 -3
  42. package/development/journey-summary.js +2 -2
  43. package/development/journey-summary.pure.js +1 -1
  44. package/development/{mapper-hWWm7Uke.js → mapper-BrZOqqfe.js} +1 -1
  45. package/development/pearl-chain/pearl-chain.component.d.ts.map +1 -1
  46. package/development/pearl-chain/pearl-chain.component.js +1 -1
  47. package/development/pearl-chain-time/pearl-chain-time.component.js +1 -1
  48. package/development/{pearl-chain-time.component-B2_BI6E_.js → pearl-chain-time.component-BMHLITah.js} +2 -2
  49. package/development/pearl-chain-time.js +2 -2
  50. package/development/pearl-chain-time.pure.js +1 -1
  51. package/development/pearl-chain-vertical/pearl-chain-vertical.component.js +1 -1
  52. package/development/pearl-chain-vertical-item/pearl-chain-vertical-item.component.js +1 -1
  53. package/development/{pearl-chain-vertical-item.component-D4clzjjQ.js → pearl-chain-vertical-item.component-JYDWs8ta.js} +1 -1
  54. package/development/pearl-chain-vertical-item.js +2 -2
  55. package/development/pearl-chain-vertical-item.pure.js +1 -1
  56. package/development/{pearl-chain-vertical.component-CpcNFl-x.js → pearl-chain-vertical.component-YYXS_74c.js} +1 -1
  57. package/development/pearl-chain-vertical.js +2 -2
  58. package/development/pearl-chain-vertical.pure.js +1 -1
  59. package/development/pearl-chain.component-BlrYDesj.js +323 -0
  60. package/development/pearl-chain.js +2 -2
  61. package/development/pearl-chain.pure.js +1 -1
  62. package/development/seat-reservation/common/mapper/icon-mapper.js +1 -1
  63. package/development/seat-reservation/common/mapper/mapper.js +1 -1
  64. package/development/seat-reservation/common/mapper.js +1 -1
  65. package/development/seat-reservation/common/svgs.js +1 -1
  66. package/development/seat-reservation/common/translations/i18n.js +1 -1
  67. package/development/seat-reservation/common.js +3 -3
  68. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts.map +1 -1
  69. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.js +8 -8
  70. package/development/seat-reservation/seat-reservation/seat-reservation.component.js +1 -1
  71. package/development/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +1 -1
  72. package/development/seat-reservation/seat-reservation-area.js +2 -2
  73. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +2 -2
  74. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +1 -1
  75. package/development/seat-reservation/seat-reservation-graphic.js +2 -2
  76. package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +1 -1
  77. package/development/seat-reservation/seat-reservation-navigation-coach.js +2 -2
  78. package/development/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +1 -1
  79. package/development/seat-reservation/seat-reservation-navigation-services.js +2 -2
  80. package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.d.ts +0 -1
  81. package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.d.ts.map +1 -1
  82. package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +1 -1
  83. package/development/seat-reservation/seat-reservation-place-control.js +2 -2
  84. package/development/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js +1 -1
  85. package/development/seat-reservation/seat-reservation-scoped.js +2 -2
  86. package/development/seat-reservation/seat-reservation.js +2 -2
  87. package/development/{seat-reservation-area.component-BWdrKqek.js → seat-reservation-area.component-dG1GXJQP.js} +1 -1
  88. package/development/{seat-reservation-graphic.component-CN5sWn0I.js → seat-reservation-graphic.component-BmhZpVL0.js} +1 -1
  89. package/development/{seat-reservation-navigation-coach.component-tDZkXl-3.js → seat-reservation-navigation-coach.component-Be9CBw62.js} +1 -1
  90. package/development/{seat-reservation-navigation-services.component-CGel7__P.js → seat-reservation-navigation-services.component-B2uWa_VN.js} +1 -1
  91. package/development/{seat-reservation-place-control.component-CM9efId7.js → seat-reservation-place-control.component-CdL6yPUZ.js} +21 -26
  92. package/development/{seat-reservation-scoped.component-CFA_bJ3o.js → seat-reservation-scoped.component-CJCkuKGz.js} +1 -1
  93. package/development/{seat-reservation.component-44IHFFlM.js → seat-reservation.component-B4BxXyLr.js} +1 -1
  94. package/development/seat-reservation.js +10 -10
  95. package/development/seat-reservation.pure.js +9 -9
  96. package/development/{svgs-kDpBCto5.js → svgs-Dj-RKmRs.js} +1 -1
  97. package/development/timetable-duration/timetable-duration.component.js +1 -1
  98. package/development/{timetable-duration.component-BhFlqYbV.js → timetable-duration.component-CXF0oJbO.js} +1 -1
  99. package/development/timetable-duration.js +2 -2
  100. package/development/timetable-duration.pure.js +1 -1
  101. package/development/timetable-row/timetable-row.component.d.ts.map +1 -1
  102. package/development/timetable-row/timetable-row.component.js +1 -1
  103. package/development/timetable-row.component-CQHA4ihk.js +733 -0
  104. package/development/timetable-row.js +2 -2
  105. package/development/timetable-row.pure.js +1 -1
  106. package/development/{toDate-DOFAOjP-.js → toDate-CDWut5fS.js} +1 -1
  107. package/{differenceInMinutes-Dr9gRqtu.js → differenceInMinutes-BAZ-Fham.js} +1 -1
  108. package/{format-DbUuNYFU.js → format-DjgG1QPc.js} +2 -2
  109. package/{isValid-B9oVW3lA.js → isValid-CXnsFZVu.js} +1 -1
  110. package/journey-summary/journey-summary.component.js +1 -1
  111. package/{journey-summary.component-OFYXlkzg.js → journey-summary.component-DyTUTCOU.js} +2 -2
  112. package/journey-summary.js +1 -1
  113. package/journey-summary.pure.js +1 -1
  114. package/package.json +3 -3
  115. package/pearl-chain/pearl-chain.component.js +1 -1
  116. package/pearl-chain-time/pearl-chain-time.component.js +1 -1
  117. package/{pearl-chain-time.component-CNKsGfIp.js → pearl-chain-time.component-DXe2o6S1.js} +1 -1
  118. package/pearl-chain-time.js +1 -1
  119. package/pearl-chain-time.pure.js +1 -1
  120. package/pearl-chain-vertical/pearl-chain-vertical.component.js +1 -1
  121. package/pearl-chain-vertical-item/pearl-chain-vertical-item.component.js +1 -1
  122. package/pearl-chain-vertical-item.js +1 -1
  123. package/pearl-chain-vertical-item.pure.js +1 -1
  124. package/pearl-chain-vertical.js +1 -1
  125. package/pearl-chain-vertical.pure.js +1 -1
  126. package/{pearl-chain.component-CpISVoAu.js → pearl-chain.component-NsjuHEuY.js} +9 -9
  127. package/pearl-chain.js +1 -1
  128. package/pearl-chain.pure.js +1 -1
  129. package/seat-reservation/common/mapper/mapper.js +1 -1
  130. package/seat-reservation/common/mapper.js +1 -1
  131. package/seat-reservation/common/svgs.js +1 -1
  132. package/seat-reservation/common.js +2 -2
  133. package/seat-reservation/seat-reservation/seat-reservation-base-element.js +4 -4
  134. package/seat-reservation/seat-reservation/seat-reservation.component.js +1 -1
  135. package/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +1 -1
  136. package/seat-reservation/seat-reservation-area.js +1 -1
  137. package/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +1 -1
  138. package/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +1 -1
  139. package/seat-reservation/seat-reservation-graphic.js +1 -1
  140. package/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +1 -1
  141. package/seat-reservation/seat-reservation-navigation-coach.js +1 -1
  142. package/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +1 -1
  143. package/seat-reservation/seat-reservation-navigation-services.js +1 -1
  144. package/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +1 -1
  145. package/seat-reservation/seat-reservation-place-control.js +1 -1
  146. package/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js +1 -1
  147. package/seat-reservation/seat-reservation-scoped.js +1 -1
  148. package/seat-reservation/seat-reservation.js +1 -1
  149. package/{seat-reservation-place-control.component-CE7d9M2b.js → seat-reservation-place-control.component-kx07J_YK.js} +14 -21
  150. package/seat-reservation.js +9 -9
  151. package/seat-reservation.pure.js +9 -9
  152. package/timetable-duration/timetable-duration.component.js +1 -1
  153. package/timetable-duration.js +1 -1
  154. package/timetable-duration.pure.js +1 -1
  155. package/timetable-row/timetable-row.component.js +1 -1
  156. package/{timetable-row.component-Cd_7Pu_E.js → timetable-row.component-BoMbHP6s.js} +9 -5
  157. package/timetable-row.js +1 -1
  158. package/timetable-row.pure.js +1 -1
  159. package/development/date-helper-qNdwgC9O.js +0 -520
  160. package/development/pearl-chain.component-oQZUzsyW.js +0 -316
  161. package/development/timetable-row.component-Dko8laRT.js +0 -729
  162. /package/{autocomplete-grid-cell.component-DkD9aFKc.js → autocomplete-grid-cell.component-D-Kk9HwQ.js} +0 -0
  163. /package/{autocomplete-grid-option.component-CtATJy7n.js → autocomplete-grid-option.component-qBUSf0mD.js} +0 -0
  164. /package/{autocomplete-grid-row.component-6nJv5PMj.js → autocomplete-grid-row.component-57jjeZWF.js} +0 -0
  165. /package/{mapper-Cqie5ivY.js → mapper-Dcou8VEf.js} +0 -0
  166. /package/{pearl-chain-vertical-item.component-CGYNzFlK.js → pearl-chain-vertical-item.component-Bby13csG.js} +0 -0
  167. /package/{pearl-chain-vertical.component-Df9CvRxo.js → pearl-chain-vertical.component-0EgQ4knk.js} +0 -0
  168. /package/{seat-reservation-area.component-B5_N7H_a.js → seat-reservation-area.component-DZsXvaMQ.js} +0 -0
  169. /package/{seat-reservation-graphic.component-Dh1e2Pve.js → seat-reservation-graphic.component-BnJuHVZQ.js} +0 -0
  170. /package/{seat-reservation-navigation-coach.component-BdCUfksf.js → seat-reservation-navigation-coach.component-DgdpqMzG.js} +0 -0
  171. /package/{seat-reservation-navigation-services.component-C9dDYD_M.js → seat-reservation-navigation-services.component-6ECATtWB.js} +0 -0
  172. /package/{seat-reservation-scoped.component-DVyP2JGE.js → seat-reservation-scoped.component-L1wMt65t.js} +0 -0
  173. /package/{seat-reservation.component-CtEqqosF.js → seat-reservation.component-B_T6eTf6.js} +0 -0
  174. /package/{svgs-D5DhLHxC.js → svgs-D4fuYTHV.js} +0 -0
  175. /package/{timetable-duration.component-BnJA8wSb.js → timetable-duration.component-Bqo5N_De.js} +0 -0
  176. /package/{toDate-p-Tpkb7t.js → toDate-BhNUyM4s.js} +0 -0
@@ -0,0 +1,733 @@
1
+ import { t as format } from "./format-Cx3zmmaF.js";
2
+ import { __esDecorate, __runInitializers } from "tslib";
3
+ import { SbbElement } from "@sbb-esta/lyne-elements/core/base-elements.js";
4
+ import { SbbLanguageController } from "@sbb-esta/lyne-elements/core/controllers.js";
5
+ import { forceType } from "@sbb-esta/lyne-elements/core/decorators.js";
6
+ import { boxSizingStyles } from "@sbb-esta/lyne-elements/core/styles.js";
7
+ import "@sbb-esta/lyne-elements/icon.js";
8
+ import { html, nothing, unsafeCSS } from "lit";
9
+ import { setOrRemoveAttribute } from "@sbb-esta/lyne-elements/core/dom.js";
10
+ import { defaultDateAdapter } from "@sbb-esta/lyne-elements/core/datetime.js";
11
+ import { i18nArrival, i18nClass, i18nDeparture, i18nDirection, i18nFromPlatform, i18nMeansOfTransport, i18nNew, i18nOccupancy, i18nRealTimeInfo, i18nSupersaver, i18nTransferProcedure, i18nTransferProcedures, i18nTravelhints, i18nTripDuration, i18nTripQuayChange } from "@sbb-esta/lyne-elements/core/i18n.js";
12
+ import { property } from "lit/decorators.js";
13
+ import { durationToTime, removeTimezoneFromISOTimeString } from "./core/datetime.js";
14
+ import "./pearl-chain-time.js";
15
+ import { getDepartureArrivalTimeAttribute, isRideLeg } from "./core/timetable.js";
16
+ import "@sbb-esta/lyne-elements/card.js";
17
+ import "@sbb-esta/lyne-elements/timetable-occupancy.js";
18
+ //#region src/elements-experimental/timetable-row/timetable-row.scss?inline
19
+ var timetable_row_default = ":host {\n --sbb-timetable-row-gap: var(--sbb-spacing-fixed-2x);\n --sbb-timetable-row-height: 1.5625rem;\n --sbb-timetable-row-height-header: 1.25rem;\n --sbb-timetable-row-height-footer: 1rem;\n --sbb-timetable-row-skeleton-pulse-duration: 1800ms;\n display: block;\n}\n\n:host([disable-animation]) {\n --sbb-timetable-row-skeleton-pulse-duration: 0;\n}\n\n.sbb-timetable__row-transport-icon {\n --sbb-icon-svg-width: 1.25rem;\n --sbb-icon-svg-height: 1.25rem;\n}\n\n.sbb-travel-hints__item {\n --sbb-icon-svg-height: 0.875rem;\n}\n\n.sbb-screen-reader-only {\n border: 0;\n clip-path: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}\n\n.sbb-timetable__row--quay {\n margin-inline-end: var(--sbb-spacing-fixed-1x);\n}\n\n.sbb-timetable__row--quay-type {\n float: left;\n}\n\nul {\n list-style: none;\n margin: 0;\n padding: 0;\n font-size: inherit;\n display: inline-flex;\n}\n\nli {\n display: inline-flex;\n align-self: center;\n}\n\n.sbb-timetable__row-transport {\n display: inline-flex;\n align-self: center;\n}\n\n.sbb-timetable__row-transportnumber,\n.sbb-timetable__row-time {\n --sbb-text-font-size: var(--sbb-text-font-size-s);\n font-family: var(--sbb-typo-font-family);\n font-weight: normal;\n line-height: var(--sbb-typo-line-height-text);\n letter-spacing: var(--sbb-typo-letter-spacing-text);\n font-size: var(--sbb-text-font-size);\n font-weight: bold;\n line-height: unset;\n white-space: nowrap;\n align-self: center;\n}\n\n.sbb-timetable__row {\n --sbb-text-font-size: var(--sbb-text-font-size-s);\n font-family: var(--sbb-typo-font-family);\n font-weight: normal;\n line-height: var(--sbb-typo-line-height-text);\n letter-spacing: var(--sbb-typo-letter-spacing-text);\n font-size: var(--sbb-text-font-size);\n display: flex;\n flex-direction: column;\n gap: var(--sbb-timetable-row-gap);\n}\n\n.sbb-timetable__row-header,\n.sbb-timetable__row-footer {\n animation: none;\n}\n\n.sbb-timetable__row-card {\n --sbb-card-padding-block: var(--sbb-card-with-badge-padding-block);\n}\n\n.sbb-timetable__row-header {\n display: flex;\n gap: var(--sbb-spacing-fixed-2x);\n align-items: center;\n line-height: var(--sbb-timetable-row-height-header);\n}\n\n.sbb-timetable__row-details,\n.sbb-timetable__row-hints {\n display: inline-flex;\n gap: var(--sbb-spacing-fixed-1x);\n align-items: center;\n}\n\n.sbb-timetable__row-header p {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n margin: 0;\n align-self: center;\n}\n\n.sbb-timetable__row-footer {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: center;\n gap: var(--sbb-spacing-fixed-2x);\n line-height: var(--sbb-timetable-row-height-footer);\n}\n.sbb-timetable__row-footer > span {\n align-self: center;\n}\n.sbb-timetable__row-footer :only-child {\n margin-inline-start: auto;\n}\n\n.sbb-timetable__row-quay--changed {\n color: var(--sbb-color-primary);\n}\n\n.sbb-timetable__row-transport-wrapper,\n.sbb-timetable__row-warning {\n display: inline-flex;\n}\n\n.sbb-loading {\n pointer-events: none;\n}\n\n.sbb-loading__wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--sbb-spacing-fixed-2x);\n}\n\n.sbb-loading__row {\n width: 100%;\n border-radius: var(--sbb-border-radius-1x);\n height: var(--sbb-timetable-row-height);\n}\n@media (min-width: calc(64rem)) {\n .sbb-loading__row {\n height: 1.75rem;\n }\n}\n@media (forced-colors: active) {\n .sbb-loading__row {\n border: var(--sbb-border-width-1x) solid ButtonBorder !important;\n }\n}\n\n.sbb-loading__row,\n.sbb-loading__badge {\n background: var(--sbb-background-color-4);\n animation: skeleton-pulse var(--sbb-timetable-row-skeleton-pulse-duration) ease-out infinite;\n}\n\n.sbb-loading__row:first-of-type {\n height: var(--sbb-timetable-row-height-header);\n width: 50%;\n}\n\n.sbb-loading__row:last-of-type {\n height: var(--sbb-timetable-row-height-footer);\n}\n\n.sbb-loading__badge {\n margin-inline: auto calc(var(--sbb-spacing-fixed-3x) * -1);\n padding-inline-end: var(--sbb-spacing-fixed-6x);\n border-end-start-radius: var(--sbb-card-badge-border-radius);\n transform: var(--sbb-card-badge-skew);\n width: 7.1875rem;\n height: 1.25rem;\n}\n\n@keyframes skeleton-pulse {\n 0% {\n background: var(--sbb-background-color-4);\n }\n 17% {\n background: var(--sbb-background-color-4);\n }\n 50% {\n background: var(--sbb-background-color-3);\n }\n 67% {\n background: var(--sbb-background-color-3);\n }\n 100% {\n background: var(--sbb-background-color-4);\n }\n}";
20
+ //#endregion
21
+ //#region src/elements-experimental/timetable-row/timetable-row.component.ts
22
+ var renderIconProduct = (icon, name) => {
23
+ return html`<span class="sbb-timetable__row-transport">
24
+ <sbb-icon name=${icon}></sbb-icon>
25
+ <span class="sbb-screen-reader-only">${name}</span>
26
+ </span>`;
27
+ };
28
+ var renderStringProduct = (vehicleName, line) => {
29
+ const space = [
30
+ "M",
31
+ "B",
32
+ "T"
33
+ ].includes(vehicleName) ? " " : "";
34
+ return html`<span class="sbb-timetable__row-transportnumber">
35
+ ${line !== null ? vehicleName + space + line : vehicleName}
36
+ </span>`;
37
+ };
38
+ var getReachableText = (legs) => {
39
+ return legs?.find((leg) => leg.serviceJourney?.serviceAlteration?.reachableText)?.serviceJourney?.serviceAlteration?.reachableText;
40
+ };
41
+ var getDelayText = (legs) => {
42
+ return legs?.find((leg) => leg.serviceJourney?.serviceAlteration?.delayText)?.serviceJourney?.serviceAlteration?.delayText;
43
+ };
44
+ var getRedirectedText = (legs) => {
45
+ return legs?.find((leg) => !!leg.serviceJourney?.serviceAlteration?.redirectedText)?.serviceJourney?.serviceAlteration?.redirectedText;
46
+ };
47
+ var getUnplannedStop = (legs) => {
48
+ return legs?.find((leg) => !!leg.serviceJourney?.serviceAlteration?.unplannedStopPointsText)?.serviceJourney?.serviceAlteration?.unplannedStopPointsText;
49
+ };
50
+ var sortSituation = (situations) => {
51
+ const priorities = {
52
+ DISTURBANCE: 0,
53
+ INFORMATION: 1,
54
+ DELAY: 2,
55
+ TRAIN_REPLACEMENT_BY_BUS: 3,
56
+ CONSTRUCTION_SITE: 4,
57
+ END_MESSAGE: 5
58
+ };
59
+ return [...situations].sort((a, b) => priorities[a.cause] - priorities[b.cause]);
60
+ };
61
+ var getHimIcon = (situation) => {
62
+ switch (situation?.cause) {
63
+ case "DISTURBANCE": return {
64
+ name: "disruption",
65
+ text: situation?.broadcastMessages?.length ? situation?.broadcastMessages[0].title : ""
66
+ };
67
+ case "INFORMATION": return {
68
+ name: "info",
69
+ text: situation?.broadcastMessages.length ? situation?.broadcastMessages[0].title : ""
70
+ };
71
+ case "DELAY": return {
72
+ name: "delay",
73
+ text: situation?.broadcastMessages.length ? situation?.broadcastMessages[0].title : ""
74
+ };
75
+ case "TRAIN_REPLACEMENT_BY_BUS": return {
76
+ name: "replacementbus",
77
+ text: situation?.broadcastMessages.length ? situation?.broadcastMessages[0].title : ""
78
+ };
79
+ case "CONSTRUCTION_SITE": return {
80
+ name: "construction",
81
+ text: situation?.broadcastMessages.length ? situation?.broadcastMessages[0].title : ""
82
+ };
83
+ default: return {
84
+ name: "info",
85
+ text: situation?.broadcastMessages.length ? situation?.broadcastMessages[0].title : ""
86
+ };
87
+ }
88
+ };
89
+ var getCus = (trip, currentLanguage) => {
90
+ const { summary, legs } = trip || {};
91
+ const rideLegs = legs?.filter((leg) => isRideLeg(leg));
92
+ const { tripStatus } = summary || {};
93
+ if (tripStatus?.cancelled || tripStatus?.partiallyCancelled) return {
94
+ name: "cancellation",
95
+ text: tripStatus?.cancelledText
96
+ };
97
+ if (rideLegs?.some((leg) => leg.serviceJourney?.serviceAlteration?.cancelledExpected)) return {
98
+ name: "disruption",
99
+ text: tripStatus?.cancelledText
100
+ };
101
+ if (getReachableText(rideLegs)) return {
102
+ name: "missed-connection",
103
+ text: getReachableText(rideLegs)
104
+ };
105
+ if (tripStatus?.alternative) return {
106
+ name: "alternative",
107
+ text: tripStatus.alternativeText
108
+ };
109
+ if (getRedirectedText(rideLegs)) return {
110
+ name: "reroute",
111
+ text: getRedirectedText(rideLegs)
112
+ };
113
+ if (getUnplannedStop(rideLegs)) return {
114
+ name: "add-stop",
115
+ text: getUnplannedStop(rideLegs)
116
+ };
117
+ if (tripStatus?.delayed || tripStatus?.delayedUnknown) return {
118
+ name: "delay",
119
+ text: getDelayText(rideLegs)
120
+ };
121
+ if (tripStatus?.quayChanged) {
122
+ const departure = rideLegs[0].departure;
123
+ return {
124
+ name: "platform-change",
125
+ text: departure.quayChanged ? departure.quayChangedText : i18nTripQuayChange[currentLanguage]
126
+ };
127
+ }
128
+ return {};
129
+ };
130
+ var findAndReplaceNotice = (notices) => {
131
+ const reservationNotice = [
132
+ "RR",
133
+ "RK",
134
+ "RC",
135
+ "RL",
136
+ "RM",
137
+ "RS",
138
+ "RU",
139
+ "XP",
140
+ "XR",
141
+ "XT"
142
+ ];
143
+ return notices.reduce((foundNotice, notice) => {
144
+ if (foundNotice) return foundNotice;
145
+ if (reservationNotice.includes(notice.name)) return {
146
+ ...notice,
147
+ name: "RR"
148
+ };
149
+ }, void 0);
150
+ };
151
+ var filterNotices = (notices) => {
152
+ const allowedNames = [
153
+ "Z",
154
+ "SB",
155
+ "SZ",
156
+ "VR",
157
+ "TG"
158
+ ];
159
+ return notices.filter((notice, index) => {
160
+ return notices.findIndex((n) => n.name === notice.name) === index;
161
+ }).filter((notice) => allowedNames.includes(notice.name)).sort((a, b) => allowedNames.indexOf(a.name) - allowedNames.indexOf(b.name));
162
+ };
163
+ var handleNotices = (notices) => {
164
+ const reservationNotice = findAndReplaceNotice(notices);
165
+ const filteredNotices = filterNotices(notices);
166
+ if (reservationNotice === void 0) return filteredNotices;
167
+ if (!filteredNotices.length) return [reservationNotice];
168
+ if (filteredNotices[0].name === "Z" && filteredNotices[1]) return [
169
+ filteredNotices[0],
170
+ reservationNotice,
171
+ filteredNotices[1]
172
+ ].concat(filteredNotices.slice(2));
173
+ return [reservationNotice, ...filteredNotices];
174
+ };
175
+ /**
176
+ * It displays information about the trip, acting as a container for all the `sbb-timetable-*` components.
177
+ * */
178
+ var SbbTimetableRowElement = (() => {
179
+ let _classSuper = SbbElement;
180
+ let _instanceExtraInitializers = [];
181
+ let _trip_decorators;
182
+ let _trip_initializers = [];
183
+ let _trip_extraInitializers = [];
184
+ let _price_decorators;
185
+ let _price_initializers = [];
186
+ let _price_extraInitializers = [];
187
+ let _disableAnimation_decorators;
188
+ let _disableAnimation_initializers = [];
189
+ let _disableAnimation_extraInitializers = [];
190
+ let _boarding_decorators;
191
+ let _boarding_initializers = [];
192
+ let _boarding_extraInitializers = [];
193
+ let _loadingTrip_decorators;
194
+ let _loadingTrip_initializers = [];
195
+ let _loadingTrip_extraInitializers = [];
196
+ let _a11yFootpath_decorators;
197
+ let _a11yFootpath_initializers = [];
198
+ let _a11yFootpath_extraInitializers = [];
199
+ let _loadingPrice_decorators;
200
+ let _loadingPrice_initializers = [];
201
+ let _loadingPrice_extraInitializers = [];
202
+ let _cardActionLabel_decorators;
203
+ let _cardActionLabel_initializers = [];
204
+ let _cardActionLabel_extraInitializers = [];
205
+ let _accessibilityExpanded_decorators;
206
+ let _accessibilityExpanded_initializers = [];
207
+ let _accessibilityExpanded_extraInitializers = [];
208
+ let _active_decorators;
209
+ let _active_initializers = [];
210
+ let _active_extraInitializers = [];
211
+ let _set_now_decorators;
212
+ return class SbbTimetableRowElement extends _classSuper {
213
+ constructor() {
214
+ super(...arguments);
215
+ this.#trip_accessor_storage = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _trip_initializers, null));
216
+ this.#price_accessor_storage = (__runInitializers(this, _trip_extraInitializers), __runInitializers(this, _price_initializers, null));
217
+ this.#disableAnimation_accessor_storage = (__runInitializers(this, _price_extraInitializers), __runInitializers(this, _disableAnimation_initializers, false));
218
+ this.#boarding_accessor_storage = (__runInitializers(this, _disableAnimation_extraInitializers), __runInitializers(this, _boarding_initializers, null));
219
+ this.#loadingTrip_accessor_storage = (__runInitializers(this, _boarding_extraInitializers), __runInitializers(this, _loadingTrip_initializers, false));
220
+ this.#a11yFootpath_accessor_storage = (__runInitializers(this, _loadingTrip_extraInitializers), __runInitializers(this, _a11yFootpath_initializers, false));
221
+ this.#loadingPrice_accessor_storage = (__runInitializers(this, _a11yFootpath_extraInitializers), __runInitializers(this, _loadingPrice_initializers, false));
222
+ this.#cardActionLabel_accessor_storage = (__runInitializers(this, _loadingPrice_extraInitializers), __runInitializers(this, _cardActionLabel_initializers, ""));
223
+ this.#accessibilityExpanded_accessor_storage = (__runInitializers(this, _cardActionLabel_extraInitializers), __runInitializers(this, _accessibilityExpanded_initializers, false));
224
+ this.#active_accessor_storage = (__runInitializers(this, _accessibilityExpanded_extraInitializers), __runInitializers(this, _active_initializers, false));
225
+ this._now = (__runInitializers(this, _active_extraInitializers), null);
226
+ this._language = new SbbLanguageController(this);
227
+ }
228
+ static {
229
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
230
+ _trip_decorators = [property({ type: Object })];
231
+ _price_decorators = [property({ type: Object })];
232
+ _disableAnimation_decorators = [forceType(), property({
233
+ attribute: "disable-animation",
234
+ reflect: true,
235
+ type: Boolean
236
+ })];
237
+ _boarding_decorators = [property({ type: Object })];
238
+ _loadingTrip_decorators = [forceType(), property({
239
+ attribute: "loading-trip",
240
+ type: Boolean
241
+ })];
242
+ _a11yFootpath_decorators = [forceType(), property({
243
+ attribute: "a11y-footpath",
244
+ type: Boolean
245
+ })];
246
+ _loadingPrice_decorators = [forceType(), property({
247
+ attribute: "loading-price",
248
+ type: Boolean
249
+ })];
250
+ _cardActionLabel_decorators = [forceType(), property({ attribute: "card-action-label" })];
251
+ _accessibilityExpanded_decorators = [forceType(), property({
252
+ attribute: "accessibility-expanded",
253
+ type: Boolean
254
+ })];
255
+ _active_decorators = [forceType(), property({ type: Boolean })];
256
+ _set_now_decorators = [property()];
257
+ __esDecorate(this, null, _trip_decorators, {
258
+ kind: "accessor",
259
+ name: "trip",
260
+ static: false,
261
+ private: false,
262
+ access: {
263
+ has: (obj) => "trip" in obj,
264
+ get: (obj) => obj.trip,
265
+ set: (obj, value) => {
266
+ obj.trip = value;
267
+ }
268
+ },
269
+ metadata: _metadata
270
+ }, _trip_initializers, _trip_extraInitializers);
271
+ __esDecorate(this, null, _price_decorators, {
272
+ kind: "accessor",
273
+ name: "price",
274
+ static: false,
275
+ private: false,
276
+ access: {
277
+ has: (obj) => "price" in obj,
278
+ get: (obj) => obj.price,
279
+ set: (obj, value) => {
280
+ obj.price = value;
281
+ }
282
+ },
283
+ metadata: _metadata
284
+ }, _price_initializers, _price_extraInitializers);
285
+ __esDecorate(this, null, _disableAnimation_decorators, {
286
+ kind: "accessor",
287
+ name: "disableAnimation",
288
+ static: false,
289
+ private: false,
290
+ access: {
291
+ has: (obj) => "disableAnimation" in obj,
292
+ get: (obj) => obj.disableAnimation,
293
+ set: (obj, value) => {
294
+ obj.disableAnimation = value;
295
+ }
296
+ },
297
+ metadata: _metadata
298
+ }, _disableAnimation_initializers, _disableAnimation_extraInitializers);
299
+ __esDecorate(this, null, _boarding_decorators, {
300
+ kind: "accessor",
301
+ name: "boarding",
302
+ static: false,
303
+ private: false,
304
+ access: {
305
+ has: (obj) => "boarding" in obj,
306
+ get: (obj) => obj.boarding,
307
+ set: (obj, value) => {
308
+ obj.boarding = value;
309
+ }
310
+ },
311
+ metadata: _metadata
312
+ }, _boarding_initializers, _boarding_extraInitializers);
313
+ __esDecorate(this, null, _loadingTrip_decorators, {
314
+ kind: "accessor",
315
+ name: "loadingTrip",
316
+ static: false,
317
+ private: false,
318
+ access: {
319
+ has: (obj) => "loadingTrip" in obj,
320
+ get: (obj) => obj.loadingTrip,
321
+ set: (obj, value) => {
322
+ obj.loadingTrip = value;
323
+ }
324
+ },
325
+ metadata: _metadata
326
+ }, _loadingTrip_initializers, _loadingTrip_extraInitializers);
327
+ __esDecorate(this, null, _a11yFootpath_decorators, {
328
+ kind: "accessor",
329
+ name: "a11yFootpath",
330
+ static: false,
331
+ private: false,
332
+ access: {
333
+ has: (obj) => "a11yFootpath" in obj,
334
+ get: (obj) => obj.a11yFootpath,
335
+ set: (obj, value) => {
336
+ obj.a11yFootpath = value;
337
+ }
338
+ },
339
+ metadata: _metadata
340
+ }, _a11yFootpath_initializers, _a11yFootpath_extraInitializers);
341
+ __esDecorate(this, null, _loadingPrice_decorators, {
342
+ kind: "accessor",
343
+ name: "loadingPrice",
344
+ static: false,
345
+ private: false,
346
+ access: {
347
+ has: (obj) => "loadingPrice" in obj,
348
+ get: (obj) => obj.loadingPrice,
349
+ set: (obj, value) => {
350
+ obj.loadingPrice = value;
351
+ }
352
+ },
353
+ metadata: _metadata
354
+ }, _loadingPrice_initializers, _loadingPrice_extraInitializers);
355
+ __esDecorate(this, null, _cardActionLabel_decorators, {
356
+ kind: "accessor",
357
+ name: "cardActionLabel",
358
+ static: false,
359
+ private: false,
360
+ access: {
361
+ has: (obj) => "cardActionLabel" in obj,
362
+ get: (obj) => obj.cardActionLabel,
363
+ set: (obj, value) => {
364
+ obj.cardActionLabel = value;
365
+ }
366
+ },
367
+ metadata: _metadata
368
+ }, _cardActionLabel_initializers, _cardActionLabel_extraInitializers);
369
+ __esDecorate(this, null, _accessibilityExpanded_decorators, {
370
+ kind: "accessor",
371
+ name: "accessibilityExpanded",
372
+ static: false,
373
+ private: false,
374
+ access: {
375
+ has: (obj) => "accessibilityExpanded" in obj,
376
+ get: (obj) => obj.accessibilityExpanded,
377
+ set: (obj, value) => {
378
+ obj.accessibilityExpanded = value;
379
+ }
380
+ },
381
+ metadata: _metadata
382
+ }, _accessibilityExpanded_initializers, _accessibilityExpanded_extraInitializers);
383
+ __esDecorate(this, null, _active_decorators, {
384
+ kind: "accessor",
385
+ name: "active",
386
+ static: false,
387
+ private: false,
388
+ access: {
389
+ has: (obj) => "active" in obj,
390
+ get: (obj) => obj.active,
391
+ set: (obj, value) => {
392
+ obj.active = value;
393
+ }
394
+ },
395
+ metadata: _metadata
396
+ }, _active_initializers, _active_extraInitializers);
397
+ __esDecorate(this, null, _set_now_decorators, {
398
+ kind: "setter",
399
+ name: "now",
400
+ static: false,
401
+ private: false,
402
+ access: {
403
+ has: (obj) => "now" in obj,
404
+ set: (obj, value) => {
405
+ obj.now = value;
406
+ }
407
+ },
408
+ metadata: _metadata
409
+ }, null, _instanceExtraInitializers);
410
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, {
411
+ enumerable: true,
412
+ configurable: true,
413
+ writable: true,
414
+ value: _metadata
415
+ });
416
+ }
417
+ static {
418
+ this.elementName = "sbb-timetable-row";
419
+ }
420
+ static {
421
+ this.styles = [boxSizingStyles, unsafeCSS(timetable_row_default)];
422
+ }
423
+ #trip_accessor_storage;
424
+ /** The trip Prop. */
425
+ get trip() {
426
+ return this.#trip_accessor_storage;
427
+ }
428
+ set trip(value) {
429
+ this.#trip_accessor_storage = value;
430
+ }
431
+ #price_accessor_storage;
432
+ /** The price Prop, which consists of the data for the badge. */
433
+ get price() {
434
+ return this.#price_accessor_storage;
435
+ }
436
+ set price(value) {
437
+ this.#price_accessor_storage = value;
438
+ }
439
+ #disableAnimation_accessor_storage;
440
+ /** This will be forwarded to the sbb-pearl-chain component - if true the position won't be animated. */
441
+ get disableAnimation() {
442
+ return this.#disableAnimation_accessor_storage;
443
+ }
444
+ set disableAnimation(value) {
445
+ this.#disableAnimation_accessor_storage = value;
446
+ }
447
+ #boarding_accessor_storage;
448
+ /** This will be forwarded to the notices section */
449
+ get boarding() {
450
+ return this.#boarding_accessor_storage;
451
+ }
452
+ set boarding(value) {
453
+ this.#boarding_accessor_storage = value;
454
+ }
455
+ #loadingTrip_accessor_storage;
456
+ /**
457
+ * The loading state -
458
+ * when this is true it will be render skeleton with an idling animation
459
+ */
460
+ get loadingTrip() {
461
+ return this.#loadingTrip_accessor_storage;
462
+ }
463
+ set loadingTrip(value) {
464
+ this.#loadingTrip_accessor_storage = value;
465
+ }
466
+ #a11yFootpath_accessor_storage;
467
+ /**
468
+ * The Footpath attribute for rendering different icons
469
+ * true: render a11y-icon
470
+ * false: render walk-icon
471
+ * default: render walk-icon
472
+ */
473
+ get a11yFootpath() {
474
+ return this.#a11yFootpath_accessor_storage;
475
+ }
476
+ set a11yFootpath(value) {
477
+ this.#a11yFootpath_accessor_storage = value;
478
+ }
479
+ #loadingPrice_accessor_storage;
480
+ /**
481
+ * The loading state -
482
+ * when this is true it will be render skeleton with an idling animation
483
+ */
484
+ get loadingPrice() {
485
+ return this.#loadingPrice_accessor_storage;
486
+ }
487
+ set loadingPrice(value) {
488
+ this.#loadingPrice_accessor_storage = value;
489
+ }
490
+ #cardActionLabel_accessor_storage;
491
+ /**
492
+ * Hidden label for the card action. It overrides the automatically generated accessibility text for the component. Use this prop to provide custom accessibility information for the component.
493
+ */
494
+ get cardActionLabel() {
495
+ return this.#cardActionLabel_accessor_storage;
496
+ }
497
+ set cardActionLabel(value) {
498
+ this.#cardActionLabel_accessor_storage = value;
499
+ }
500
+ #accessibilityExpanded_accessor_storage;
501
+ /** This will be forwarded to the sbb-card component as aria-expanded. */
502
+ get accessibilityExpanded() {
503
+ return this.#accessibilityExpanded_accessor_storage;
504
+ }
505
+ set accessibilityExpanded(value) {
506
+ this.#accessibilityExpanded_accessor_storage = value;
507
+ }
508
+ #active_accessor_storage;
509
+ /** When this prop is true the sbb-card will be in the active state. */
510
+ get active() {
511
+ return this.#active_accessor_storage;
512
+ }
513
+ set active(value) {
514
+ this.#active_accessor_storage = value;
515
+ }
516
+ /**
517
+ * A configured date which acts as the current date instead of the real current date.
518
+ * Only recommended for testing purposes.
519
+ */
520
+ set now(value) {
521
+ this._now = defaultDateAdapter.getValidDateOrNull(defaultDateAdapter.deserialize(value));
522
+ }
523
+ get now() {
524
+ return this._now ?? /* @__PURE__ */ new Date();
525
+ }
526
+ willUpdate(changedProperties) {
527
+ super.willUpdate(changedProperties);
528
+ if (changedProperties.has("loadingTrip")) setOrRemoveAttribute(this, "role", !this.loadingTrip ? "rowgroup" : null);
529
+ }
530
+ /** The skeleton render function for the loading state */
531
+ _renderSkeleton() {
532
+ return html`
533
+ <sbb-card class="sbb-loading sbb-card-spacing-4x-xxs sbb-timetable__row-card">
534
+ ${this.loadingPrice ? html`<div class="sbb-loading__badge" slot="badge"></div>` : nothing}
535
+ <div class="sbb-loading__wrapper">
536
+ <div class="sbb-loading__row"></div>
537
+ <div class="sbb-loading__row"></div>
538
+ <div class="sbb-loading__row"></div>
539
+ </div>
540
+ </sbb-card>
541
+ `;
542
+ }
543
+ _getRideLegs() {
544
+ return this.trip?.legs?.filter((leg) => isRideLeg(leg)) ?? [];
545
+ }
546
+ _getQuayTypeStrings() {
547
+ if (!this.trip.summary?.product) return null;
548
+ const rideLegs = this._getRideLegs();
549
+ const short = this.trip.summary.product?.vehicleMode === "TRAIN" ? rideLegs[0].serviceJourney.quayTypeShortName || "" : rideLegs[0].serviceJourney.quayTypeName || "";
550
+ return {
551
+ long: i18nFromPlatform[this._language.current] + " " + short,
552
+ short
553
+ };
554
+ }
555
+ /** map Quay */
556
+ _renderQuayType() {
557
+ if (!this.trip.summary?.product) return void 0;
558
+ const quayTypeStrings = this._getQuayTypeStrings();
559
+ return html`
560
+ <span class="sbb-timetable__row--quay">
561
+ <span class="sbb-screen-reader-only">${quayTypeStrings?.long}&nbsp;</span>
562
+ <span class="sbb-timetable__row--quay-type" aria-hidden="true"
563
+ >${quayTypeStrings?.short}</span
564
+ >
565
+ </span>
566
+ `;
567
+ }
568
+ _handleHimCus(trip) {
569
+ const { situations } = trip || {};
570
+ const sortedSituations = situations && sortSituation(situations);
571
+ const cus = getCus(trip, this._language.current);
572
+ return {
573
+ cus: Object.keys(cus)?.length ? cus : null,
574
+ him: situations?.length ? getHimIcon(sortedSituations[0]) : null
575
+ };
576
+ }
577
+ _getAccessibilityText(trip) {
578
+ const { summary, legs, notices } = trip || {};
579
+ const { departureWalk, arrivalWalk, departure, arrival, product, direction, occupancy, duration } = summary || {};
580
+ const { departureTimeAttribute, arrivalTimeAttribute } = getDepartureArrivalTimeAttribute(legs, departureWalk || 0, arrivalWalk || 0, this._language.current, this.a11yFootpath);
581
+ const rideLegs = this._getRideLegs();
582
+ const departureTime = departure?.time ? removeTimezoneFromISOTimeString(departure.time) : void 0;
583
+ const arrivalTime = arrival?.time ? removeTimezoneFromISOTimeString(arrival.time) : void 0;
584
+ const departureWalkText = departureTimeAttribute ? `${departureTimeAttribute.text} ${departureTimeAttribute.duration}, ` : "";
585
+ const arrivalWalkText = arrivalTimeAttribute ? `${arrivalTimeAttribute.text} ${arrivalTimeAttribute.duration}, ` : "";
586
+ const departureTimeText = departureTime ? `${i18nDeparture[this._language.current]}: ${format(departureTime, "HH:mm")}, ` : "";
587
+ const getDepartureQuayText = () => {
588
+ if (!departure?.quayFormatted) return "";
589
+ return `${departure?.quayChanged ? `${i18nNew[this._language.current]} ` : ""}${this._getQuayTypeStrings()?.long} ${departure?.quayFormatted}, `;
590
+ };
591
+ const meansOfTransportText = product && product.vehicleMode ? i18nMeansOfTransport[product.vehicleMode.toLowerCase()] && `${i18nMeansOfTransport[product.vehicleMode.toLowerCase()][this._language.current]}, ` : "";
592
+ const vehicleSubModeText = product?.vehicleSubModeShortName ? `${product.vehicleSubModeShortName} ${product.line || ""}, ` : "";
593
+ const directionText = `${i18nDirection[this._language.current]} ${direction}, `;
594
+ const himCus = this._handleHimCus(trip);
595
+ const cusText = himCus?.cus?.text ? `${i18nRealTimeInfo[this._language.current]}: ${himCus?.cus?.text}, ` : "";
596
+ const himText = himCus?.him?.text ? `${i18nRealTimeInfo[this._language.current]}: ${himCus?.him?.text}, ` : "";
597
+ const boardingText = this.boarding ? `${this.boarding.text}, ` : "";
598
+ const priceText = `${this.price?.isDiscount ? i18nSupersaver[this._language.current] : ""} ${this.price?.text && this.price?.price ? (this.price?.text || "") + " " + (this.price?.price || "") + ", " : ""}`;
599
+ const transferProcedures = rideLegs.length > 2 ? `${rideLegs.length - 1} ${i18nTransferProcedures[this._language.current]}, ` : rideLegs.length > 1 ? `${rideLegs.length - 1} ${i18nTransferProcedure[this._language.current]}, ` : "";
600
+ const arrivalTimeText = arrivalTime ? `${i18nArrival[this._language.current]}: ${format(arrivalTime, "HH:mm")}, ` : "";
601
+ let occupancyText = "";
602
+ if (occupancy) {
603
+ if (occupancy.firstClass && occupancy.firstClass !== "UNKNOWN") occupancyText += `${i18nClass.first[this._language.current]} ${i18nOccupancy[occupancy.firstClass.toLowerCase()]?.[this._language.current]}.`;
604
+ if (occupancy.secondClass && occupancy.secondClass !== "UNKNOWN") occupancyText += ` ${i18nClass.second[this._language.current]} ${i18nOccupancy[occupancy.secondClass.toLowerCase()]?.[this._language.current]}.`;
605
+ }
606
+ const attributes = notices && handleNotices(notices).length && handleNotices(notices)?.map((notice, index) => index < 4 && notice.text?.template).join(", ") + ", ";
607
+ const attributesText = attributes ? `${i18nTravelhints[this._language.current]}: ${attributes}` : "";
608
+ const durationText = !!duration && duration > 0 ? `${i18nTripDuration[this._language.current]} ${durationToTime(duration, this._language.current).long}, ` : "";
609
+ return [
610
+ departureWalkText,
611
+ departureTimeText,
612
+ getDepartureQuayText(),
613
+ meansOfTransportText,
614
+ vehicleSubModeText,
615
+ directionText,
616
+ cusText,
617
+ boardingText,
618
+ priceText,
619
+ cusText ? "" : himText,
620
+ arrivalTimeText,
621
+ arrivalWalkText,
622
+ durationText,
623
+ transferProcedures,
624
+ occupancyText,
625
+ attributesText
626
+ ].map((e) => e?.trim()).filter((e) => e && e.length > 0).join(" ");
627
+ }
628
+ render() {
629
+ if (this.loadingTrip) return this._renderSkeleton();
630
+ const { legs, id, notices, summary } = this.trip || {};
631
+ const { product, direction, departureWalk, departure, arrival, arrivalWalk, occupancy, duration } = summary || {};
632
+ const himCus = this._handleHimCus(this.trip);
633
+ const hasHimCus = !!himCus.cus || !!himCus.him;
634
+ const noticeAttributes = notices && handleNotices(notices);
635
+ const durationObj = duration ? durationToTime(duration, this._language.current) : null;
636
+ return html`
637
+ <sbb-card class="sbb-card-spacing-4x-xxs sbb-timetable__row-card" id=${id}>
638
+ <sbb-card-button
639
+ ?active=${this.active}
640
+ aria-expanded=${this.accessibilityExpanded ? "true" : nothing}
641
+ >
642
+ ${this.cardActionLabel ? this.cardActionLabel : this._getAccessibilityText(this.trip)}
643
+ </sbb-card-button>
644
+ ${this.loadingPrice ? html`<div class="sbb-loading__badge" slot="badge"></div>` : nothing}
645
+ ${this.price && !this.loadingPrice ? html`<sbb-card-badge color=${this.price.isDiscount ? "charcoal" : "white"}>
646
+ ${this.price.isDiscount ? html`<span aria-hidden="true">
647
+ %<span class="sbb-screen-reader-only"
648
+ >${i18nSupersaver[this._language.current]}</span
649
+ >
650
+ </span>` : nothing}
651
+ ${this.price.text ? html`<span>${this.price.text}</span>` : nothing}
652
+ ${this.price.price ? html`<span>${this.price.price}</span>` : nothing}
653
+ </sbb-card-badge>` : nothing}
654
+ <div class="sbb-timetable__row" role="row">
655
+ <div class="sbb-timetable__row-header" role="gridcell">
656
+ <div class="sbb-timetable__row-details">
657
+ ${product?.corporateIdentityPictogram && html`<span class="sbb-timetable__row-transport-wrapper">
658
+ <sbb-icon
659
+ class="sbb-timetable__row-transport-icon"
660
+ name="picto:${product.corporateIdentityPictogram}"
661
+ ></sbb-icon>
662
+ <span class="sbb-screen-reader-only">
663
+ ${product && product.vehicleMode && i18nMeansOfTransport[product.vehicleMode.toLowerCase()] && i18nMeansOfTransport[product.vehicleMode.toLowerCase()][this._language.current]}
664
+ &nbsp;
665
+ </span>
666
+ </span>`}
667
+ ${product && (product.corporateIdentityIcon ? renderIconProduct(product.corporateIdentityIcon, product.name) : product.vehicleSubModeShortName && renderStringProduct(product.vehicleSubModeShortName, product?.line))}
668
+ </div>
669
+ ${direction ? html`<p>${`${i18nDirection[this._language.current]} ${direction}`}</p>` : nothing}
670
+ </div>
671
+ <sbb-pearl-chain-time
672
+ role="gridcell"
673
+ .legs=${legs}
674
+ .departureTime=${departure?.time}
675
+ .arrivalTime=${arrival?.time}
676
+ .departureWalk=${departureWalk}
677
+ .arrivalWalk=${arrivalWalk}
678
+ ?disable-animation=${this.disableAnimation}
679
+ ?a11y-footpath=${this.a11yFootpath}
680
+ .now=${this.now}
681
+ ></sbb-pearl-chain-time>
682
+ <div class="sbb-timetable__row-footer" role="gridcell">
683
+ ${product && departure?.quayFormatted ? html`<span
684
+ class=${departure?.quayChanged ? `sbb-timetable__row-quay--changed` : nothing}
685
+ >
686
+ <span class="sbb-screen-reader-only">
687
+ ${`${i18nDeparture[this._language.current]} ${departure?.quayChanged ? i18nNew[this._language.current] : ""}`}
688
+ &nbsp;
689
+ </span>
690
+ ${this._renderQuayType()} ${departure?.quayFormatted}
691
+ </span>` : nothing}
692
+ ${occupancy?.firstClass && occupancy?.firstClass !== "UNKNOWN" || occupancy?.secondClass && occupancy.secondClass !== "UNKNOWN" ? html`<sbb-timetable-occupancy
693
+ .firstClassOccupancy=${occupancy?.firstClass?.toLowerCase()}
694
+ .secondClassOccupancy=${occupancy?.secondClass?.toLowerCase()}
695
+ ></sbb-timetable-occupancy>` : nothing}
696
+ ${noticeAttributes && noticeAttributes.length || this.boarding ? html`<ul class="sbb-timetable__row-hints" role="list">
697
+ ${noticeAttributes?.map((notice, index) => index < 4 ? html`<li>
698
+ <sbb-icon
699
+ class="sbb-travel-hints__item"
700
+ name=${"sa-" + notice.name?.toLowerCase()}
701
+ ></sbb-icon>
702
+ <span class="sbb-screen-reader-only">${notice.text?.template}</span>
703
+ </li>` : nothing)}
704
+ ${this.boarding ? html`<li>
705
+ <sbb-icon
706
+ class="sbb-travel-hints__item"
707
+ name=${this.boarding?.name}
708
+ aria-label=${this.boarding?.text}
709
+ aria-hidden="false"
710
+ ></sbb-icon>
711
+ </li>` : nothing}
712
+ </ul>` : nothing}
713
+ ${duration && duration > 0 ? html`<time>
714
+ <span class="sbb-screen-reader-only">
715
+ ${`${i18nTripDuration[this._language.current]} ${durationObj.long}`}
716
+ </span>
717
+ <span aria-hidden="true">${durationObj.short}</span>
718
+ </time>` : nothing}
719
+ ${hasHimCus && (himCus.cus || himCus.him) ? html`<span class="sbb-timetable__row-warning">
720
+ <sbb-icon name=${(himCus.cus || himCus.him).name}></sbb-icon>
721
+ <span class="sbb-screen-reader-only">${(himCus.cus || himCus.him).text}</span>
722
+ </span>` : nothing}
723
+ </div>
724
+ </div>
725
+ </sbb-card>
726
+ `;
727
+ }
728
+ };
729
+ })();
730
+ //#endregion
731
+ export { handleNotices as a, sortSituation as c, getHimIcon as i, filterNotices as n, renderIconProduct as o, getCus as r, renderStringProduct as s, SbbTimetableRowElement as t };
732
+
733
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXRhYmxlLXJvdy5jb21wb25lbnQtQ1FIQTRpaGsuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC90aW1ldGFibGUtcm93L3RpbWV0YWJsZS1yb3cuc2Nzcz9pbmxpbmUiLCIuLi8uLi8uLi9zcmMvZWxlbWVudHMtZXhwZXJpbWVudGFsL3RpbWV0YWJsZS1yb3cvdGltZXRhYmxlLXJvdy5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiQHVzZSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9zdHlsZXMnIGFzIHNiYjtcblxuOmhvc3Qge1xuICAtLXNiYi10aW1ldGFibGUtcm93LWdhcDogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtMngpO1xuICAtLXNiYi10aW1ldGFibGUtcm93LWhlaWdodDogI3tzYmIucHgtdG8tcmVtLWJ1aWxkKDI1KX07XG4gIC0tc2JiLXRpbWV0YWJsZS1yb3ctaGVpZ2h0LWhlYWRlcjogI3tzYmIucHgtdG8tcmVtLWJ1aWxkKDIwKX07XG4gIC0tc2JiLXRpbWV0YWJsZS1yb3ctaGVpZ2h0LWZvb3RlcjogI3tzYmIucHgtdG8tcmVtLWJ1aWxkKDE2KX07XG4gIC0tc2JiLXRpbWV0YWJsZS1yb3ctc2tlbGV0b24tcHVsc2UtZHVyYXRpb246IDE4MDBtcztcblxuICBkaXNwbGF5OiBibG9jaztcbn1cblxuOmhvc3QoW2Rpc2FibGUtYW5pbWF0aW9uXSkge1xuICAtLXNiYi10aW1ldGFibGUtcm93LXNrZWxldG9uLXB1bHNlLWR1cmF0aW9uOiAwO1xufVxuXG4vLyBvdmVycmlkZSBpY29ucyBzaXplc1xuLnNiYi10aW1ldGFibGVfX3Jvdy10cmFuc3BvcnQtaWNvbiB7XG4gIC0tc2JiLWljb24tc3ZnLXdpZHRoOiAje3NiYi5weC10by1yZW0tYnVpbGQoMjApfTtcbiAgLS1zYmItaWNvbi1zdmctaGVpZ2h0OiAje3NiYi5weC10by1yZW0tYnVpbGQoMjApfTtcbn1cblxuLy8gb3ZlcnJpZGUgaWNvbnMgc2l6ZXNcbi5zYmItdHJhdmVsLWhpbnRzX19pdGVtIHtcbiAgLS1zYmItaWNvbi1zdmctaGVpZ2h0OiAje3NiYi5weC10by1yZW0tYnVpbGQoMTQpfTtcbn1cblxuLnNiYi1zY3JlZW4tcmVhZGVyLW9ubHkge1xuICBAaW5jbHVkZSBzYmIuc2NyZWVuLXJlYWRlci1vbmx5O1xufVxuXG4uc2JiLXRpbWV0YWJsZV9fcm93LS1xdWF5IHtcbiAgbWFyZ2luLWlubGluZS1lbmQ6IHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTF4KTtcbn1cblxuLnNiYi10aW1ldGFibGVfX3Jvdy0tcXVheS10eXBlIHtcbiAgZmxvYXQ6IGxlZnQ7XG59XG5cbi8vIHJlc2V0cyBsaXN0c1xudWwge1xuICBAaW5jbHVkZSBzYmIubGlzdC1yZXNldDtcblxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbn1cblxubGkge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24tc2VsZjogY2VudGVyO1xufVxuXG4uc2JiLXRpbWV0YWJsZV9fcm93LXRyYW5zcG9ydCB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1zZWxmOiBjZW50ZXI7XG59XG5cbi5zYmItdGltZXRhYmxlX19yb3ctdHJhbnNwb3J0bnVtYmVyLFxuLnNiYi10aW1ldGFibGVfX3Jvdy10aW1lIHtcbiAgQGluY2x1ZGUgc2JiLnRleHQtcy0tYm9sZDtcblxuICBsaW5lLWhlaWdodDogdW5zZXQ7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGFsaWduLXNlbGY6IGNlbnRlcjtcbn1cblxuLnNiYi10aW1ldGFibGVfX3JvdyB7XG4gIEBpbmNsdWRlIHNiYi50ZXh0LXMtLXJlZ3VsYXI7XG5cbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiB2YXIoLS1zYmItdGltZXRhYmxlLXJvdy1nYXApO1xufVxuXG4uc2JiLXRpbWV0YWJsZV9fcm93LWhlYWRlcixcbi5zYmItdGltZXRhYmxlX19yb3ctZm9vdGVyIHtcbiAgLy8gRHVlIHRvIGEgYnVnIGluIFNhZmFyaSB3aGljaCBkaXNwbGF5cyBza2VsZXRvbiBhbmltYXRpb24gZXZlbiBvbiBsb2FkZWQgY29udGVudCwgd2UgbmVlZCB0byBtYW51YWxseSBkaXNhYmxlIGFuaW1hdGlvbi5cbiAgYW5pbWF0aW9uOiBub25lO1xufVxuXG4uc2JiLXRpbWV0YWJsZV9fcm93LWNhcmQge1xuICAtLXNiYi1jYXJkLXBhZGRpbmctYmxvY2s6IHZhcigtLXNiYi1jYXJkLXdpdGgtYmFkZ2UtcGFkZGluZy1ibG9jayk7XG59XG5cbi5zYmItdGltZXRhYmxlX19yb3ctaGVhZGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiB2YXIoLS1zYmItc3BhY2luZy1maXhlZC0yeCk7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGxpbmUtaGVpZ2h0OiB2YXIoLS1zYmItdGltZXRhYmxlLXJvdy1oZWlnaHQtaGVhZGVyKTtcbn1cblxuLnNiYi10aW1ldGFibGVfX3Jvdy1kZXRhaWxzLFxuLnNiYi10aW1ldGFibGVfX3Jvdy1oaW50cyB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBnYXA6IHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTF4KTtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLnNiYi10aW1ldGFibGVfX3Jvdy1oZWFkZXIgcCB7XG4gIEBpbmNsdWRlIHNiYi5lbGxpcHNpcztcblxuICBtYXJnaW46IDA7XG4gIGFsaWduLXNlbGY6IGNlbnRlcjtcbn1cblxuLnNiYi10aW1ldGFibGVfX3Jvdy1mb290ZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiB2YXIoLS1zYmItc3BhY2luZy1maXhlZC0yeCk7XG4gIGxpbmUtaGVpZ2h0OiB2YXIoLS1zYmItdGltZXRhYmxlLXJvdy1oZWlnaHQtZm9vdGVyKTtcblxuICA+IHNwYW4ge1xuICAgIGFsaWduLXNlbGY6IGNlbnRlcjtcbiAgfVxuXG4gIDpvbmx5LWNoaWxkIHtcbiAgICBtYXJnaW4taW5saW5lLXN0YXJ0OiBhdXRvO1xuICB9XG59XG5cbi5zYmItdGltZXRhYmxlX19yb3ctcXVheS0tY2hhbmdlZCB7XG4gIGNvbG9yOiB2YXIoLS1zYmItY29sb3ItcHJpbWFyeSk7XG59XG5cbi5zYmItdGltZXRhYmxlX19yb3ctdHJhbnNwb3J0LXdyYXBwZXIsXG4uc2JiLXRpbWV0YWJsZV9fcm93LXdhcm5pbmcge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbn1cblxuLnNiYi1sb2FkaW5nIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5zYmItbG9hZGluZ19fd3JhcHBlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtMngpO1xufVxuXG4uc2JiLWxvYWRpbmdfX3JvdyB7XG4gIHdpZHRoOiAxMDAlO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1zYmItYm9yZGVyLXJhZGl1cy0xeCk7XG4gIGhlaWdodDogdmFyKC0tc2JiLXRpbWV0YWJsZS1yb3ctaGVpZ2h0KTtcblxuICBAaW5jbHVkZSBzYmIubXEoJGZyb206IGxhcmdlKSB7XG4gICAgaGVpZ2h0OiAje3NiYi5weC10by1yZW0tYnVpbGQoMjgpfTtcbiAgfVxuXG4gIEBpbmNsdWRlIHNiYi5pZi1mb3JjZWQtY29sb3JzIHtcbiAgICBib3JkZXI6IHZhcigtLXNiYi1ib3JkZXItd2lkdGgtMXgpIHNvbGlkIEJ1dHRvbkJvcmRlciAhaW1wb3J0YW50O1xuICB9XG59XG5cbi5zYmItbG9hZGluZ19fcm93LFxuLnNiYi1sb2FkaW5nX19iYWRnZSB7XG4gIGJhY2tncm91bmQ6IHZhcigtLXNiYi1iYWNrZ3JvdW5kLWNvbG9yLTQpO1xuICBhbmltYXRpb246IHNrZWxldG9uLXB1bHNlIHZhcigtLXNiYi10aW1ldGFibGUtcm93LXNrZWxldG9uLXB1bHNlLWR1cmF0aW9uKSBlYXNlLW91dCBpbmZpbml0ZTtcbn1cblxuLnNiYi1sb2FkaW5nX19yb3c6Zmlyc3Qtb2YtdHlwZSB7XG4gIGhlaWdodDogdmFyKC0tc2JiLXRpbWV0YWJsZS1yb3ctaGVpZ2h0LWhlYWRlcik7XG4gIHdpZHRoOiA1MCU7XG59XG5cbi5zYmItbG9hZGluZ19fcm93Omxhc3Qtb2YtdHlwZSB7XG4gIGhlaWdodDogdmFyKC0tc2JiLXRpbWV0YWJsZS1yb3ctaGVpZ2h0LWZvb3Rlcik7XG59XG5cbi5zYmItbG9hZGluZ19fYmFkZ2Uge1xuICBtYXJnaW4taW5saW5lOiBhdXRvIGNhbGModmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtM3gpICogLTEpO1xuICBwYWRkaW5nLWlubGluZS1lbmQ6IHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTZ4KTtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IHZhcigtLXNiYi1jYXJkLWJhZGdlLWJvcmRlci1yYWRpdXMpO1xuICB0cmFuc2Zvcm06IHZhcigtLXNiYi1jYXJkLWJhZGdlLXNrZXcpO1xuICB3aWR0aDogI3tzYmIucHgtdG8tcmVtLWJ1aWxkKDExNSl9O1xuICBoZWlnaHQ6ICN7c2JiLnB4LXRvLXJlbS1idWlsZCgyMCl9O1xufVxuXG5Aa2V5ZnJhbWVzIHNrZWxldG9uLXB1bHNlIHtcbiAgMCUge1xuICAgIGJhY2tncm91bmQ6IHZhcigtLXNiYi1iYWNrZ3JvdW5kLWNvbG9yLTQpO1xuICB9XG5cbiAgMTclIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zYmItYmFja2dyb3VuZC1jb2xvci00KTtcbiAgfVxuXG4gIDUwJSB7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tc2JiLWJhY2tncm91bmQtY29sb3ItMyk7XG4gIH1cblxuICA2NyUge1xuICAgIGJhY2tncm91bmQ6IHZhcigtLXNiYi1iYWNrZ3JvdW5kLWNvbG9yLTMpO1xuICB9XG5cbiAgMTAwJSB7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tc2JiLWJhY2tncm91bmQtY29sb3ItNCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNiYkVsZW1lbnQgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2Jhc2UtZWxlbWVudHMuanMnO1xuaW1wb3J0IHsgU2JiTGFuZ3VhZ2VDb250cm9sbGVyIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9jb250cm9sbGVycy5qcyc7XG5pbXBvcnQgeyBkZWZhdWx0RGF0ZUFkYXB0ZXIgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2RhdGV0aW1lLmpzJztcbmltcG9ydCB7IGZvcmNlVHlwZSB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBzZXRPclJlbW92ZUF0dHJpYnV0ZSB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvZG9tLmpzJztcbmltcG9ydCB7XG4gIGkxOG5BcnJpdmFsLFxuICBpMThuQ2xhc3MsXG4gIGkxOG5EZXBhcnR1cmUsXG4gIGkxOG5EaXJlY3Rpb24sXG4gIGkxOG5Gcm9tUGxhdGZvcm0sXG4gIGkxOG5NZWFuc09mVHJhbnNwb3J0LFxuICBpMThuTmV3LFxuICBpMThuT2NjdXBhbmN5LFxuICBpMThuUmVhbFRpbWVJbmZvLFxuICBpMThuU3VwZXJzYXZlcixcbiAgaTE4blRyYW5zZmVyUHJvY2VkdXJlLFxuICBpMThuVHJhbnNmZXJQcm9jZWR1cmVzLFxuICBpMThuVHJhdmVsaGludHMsXG4gIGkxOG5UcmlwRHVyYXRpb24sXG4gIGkxOG5UcmlwUXVheUNoYW5nZSxcbn0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9pMThuLmpzJztcbmltcG9ydCB0eXBlIHsgU2JiT2NjdXBhbmN5IH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9pbnRlcmZhY2VzLmpzJztcbmltcG9ydCB7IGJveFNpemluZ1N0eWxlcyB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvc3R5bGVzLmpzJztcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7XG4gIHR5cGUgQ1NTUmVzdWx0R3JvdXAsXG4gIGh0bWwsXG4gIG5vdGhpbmcsXG4gIHR5cGUgUHJvcGVydHlWYWx1ZXMsXG4gIHR5cGUgVGVtcGxhdGVSZXN1bHQsXG4gIHVuc2FmZUNTUyxcbn0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBkdXJhdGlvblRvVGltZSwgcmVtb3ZlVGltZXpvbmVGcm9tSVNPVGltZVN0cmluZyB9IGZyb20gJy4uL2NvcmUvZGF0ZXRpbWUudHMnO1xuaW1wb3J0IHR5cGUgeyBJVHJpcEl0ZW0sIE5vdGljZSwgUHRSaWRlTGVnLCBQdFNpdHVhdGlvbiB9IGZyb20gJy4uL2NvcmUvdGltZXRhYmxlLnRzJztcbmltcG9ydCB7IGdldERlcGFydHVyZUFycml2YWxUaW1lQXR0cmlidXRlLCBpc1JpZGVMZWcgfSBmcm9tICcuLi9jb3JlL3RpbWV0YWJsZS50cyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL3RpbWV0YWJsZS1yb3cuc2Nzcz9pbmxpbmUnO1xuXG5pbXBvcnQgJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NhcmQuanMnO1xuaW1wb3J0ICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9pY29uLmpzJztcbmltcG9ydCAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvdGltZXRhYmxlLW9jY3VwYW5jeS5qcyc7XG5pbXBvcnQgJy4uL3BlYXJsLWNoYWluLXRpbWUudHMnO1xuXG4vKiogSGltQ3VzIGludGVyZmFjZSBmb3IgbWFwcGVkIGljb24gbmFtZSBhbmQgdGV4dCAqL1xuZXhwb3J0IGludGVyZmFjZSBIaW1DdXMge1xuICBuYW1lOiBzdHJpbmc7XG4gIHRleHQ/OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKiogQm9hcmRpbmcgaWNvbiBpbnRlcmZhY2UgZm9yIG1hcHBlZCBpY29uIG5hbWUgYW5kIHRleHQgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQm9hcmRpbmcge1xuICBuYW1lOiBzdHJpbmc7XG4gIHRleHQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmljZSB7XG4gIHByaWNlPzogc3RyaW5nO1xuICB0ZXh0Pzogc3RyaW5nO1xuICBpc0Rpc2NvdW50PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IHJlbmRlckljb25Qcm9kdWN0ID0gKGljb246IHN0cmluZywgbmFtZTogc3RyaW5nKTogVGVtcGxhdGVSZXN1bHQgPT4ge1xuICByZXR1cm4gaHRtbGA8c3BhbiBjbGFzcz1cInNiYi10aW1ldGFibGVfX3Jvdy10cmFuc3BvcnRcIj5cbiAgICA8c2JiLWljb24gbmFtZT0ke2ljb259Pjwvc2JiLWljb24+XG4gICAgPHNwYW4gY2xhc3M9XCJzYmItc2NyZWVuLXJlYWRlci1vbmx5XCI+JHtuYW1lfTwvc3Bhbj5cbiAgPC9zcGFuPmA7XG59O1xuXG5leHBvcnQgY29uc3QgcmVuZGVyU3RyaW5nUHJvZHVjdCA9ICh2ZWhpY2xlTmFtZTogc3RyaW5nLCBsaW5lPzogc3RyaW5nIHwgbnVsbCk6IFRlbXBsYXRlUmVzdWx0ID0+IHtcbiAgY29uc3Qgc3BhY2UgPSBbJ00nLCAnQicsICdUJ10uaW5jbHVkZXModmVoaWNsZU5hbWUpID8gJyAnIDogJyc7XG4gIHJldHVybiBodG1sYDxzcGFuIGNsYXNzPVwic2JiLXRpbWV0YWJsZV9fcm93LXRyYW5zcG9ydG51bWJlclwiPlxuICAgICR7bGluZSAhPT0gbnVsbCA/IHZlaGljbGVOYW1lICsgc3BhY2UgKyBsaW5lIDogdmVoaWNsZU5hbWV9XG4gIDwvc3Bhbj5gO1xufTtcblxuY29uc3QgZ2V0UmVhY2hhYmxlVGV4dCA9IChsZWdzOiBQdFJpZGVMZWdbXSk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgPT4ge1xuICByZXR1cm4gbGVncz8uZmluZCgobGVnKSA9PiBsZWcuc2VydmljZUpvdXJuZXk/LnNlcnZpY2VBbHRlcmF0aW9uPy5yZWFjaGFibGVUZXh0KT8uc2VydmljZUpvdXJuZXlcbiAgICA/LnNlcnZpY2VBbHRlcmF0aW9uPy5yZWFjaGFibGVUZXh0O1xufTtcblxuY29uc3QgZ2V0RGVsYXlUZXh0ID0gKGxlZ3M6IFB0UmlkZUxlZ1tdKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCA9PiB7XG4gIHJldHVybiBsZWdzPy5maW5kKChsZWcpID0+IGxlZy5zZXJ2aWNlSm91cm5leT8uc2VydmljZUFsdGVyYXRpb24/LmRlbGF5VGV4dCk/LnNlcnZpY2VKb3VybmV5XG4gICAgPy5zZXJ2aWNlQWx0ZXJhdGlvbj8uZGVsYXlUZXh0O1xufTtcblxuY29uc3QgZ2V0UmVkaXJlY3RlZFRleHQgPSAobGVnczogUHRSaWRlTGVnW10pOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkID0+IHtcbiAgcmV0dXJuIGxlZ3M/LmZpbmQoKGxlZykgPT4gISFsZWcuc2VydmljZUpvdXJuZXk/LnNlcnZpY2VBbHRlcmF0aW9uPy5yZWRpcmVjdGVkVGV4dClcbiAgICA/LnNlcnZpY2VKb3VybmV5Py5zZXJ2aWNlQWx0ZXJhdGlvbj8ucmVkaXJlY3RlZFRleHQ7XG59O1xuXG5jb25zdCBnZXRVbnBsYW5uZWRTdG9wID0gKGxlZ3M6IFB0UmlkZUxlZ1tdKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCA9PiB7XG4gIHJldHVybiBsZWdzPy5maW5kKChsZWcpID0+ICEhbGVnLnNlcnZpY2VKb3VybmV5Py5zZXJ2aWNlQWx0ZXJhdGlvbj8udW5wbGFubmVkU3RvcFBvaW50c1RleHQpXG4gICAgPy5zZXJ2aWNlSm91cm5leT8uc2VydmljZUFsdGVyYXRpb24/LnVucGxhbm5lZFN0b3BQb2ludHNUZXh0O1xufTtcblxuZXhwb3J0IGNvbnN0IHNvcnRTaXR1YXRpb24gPSAoc2l0dWF0aW9uczogUHRTaXR1YXRpb25bXSk6IFB0U2l0dWF0aW9uW10gPT4ge1xuICBjb25zdCBwcmlvcml0aWVzID0ge1xuICAgIERJU1RVUkJBTkNFOiAwLFxuICAgIElORk9STUFUSU9OOiAxLFxuICAgIERFTEFZOiAyLFxuICAgIFRSQUlOX1JFUExBQ0VNRU5UX0JZX0JVUzogMyxcbiAgICBDT05TVFJVQ1RJT05fU0lURTogNCxcbiAgICBFTkRfTUVTU0FHRTogNSxcbiAgfTtcblxuICByZXR1cm4gWy4uLnNpdHVhdGlvbnNdPy5zb3J0KFxuICAgIChhOiBQdFNpdHVhdGlvbiwgYjogUHRTaXR1YXRpb24pID0+IHByaW9yaXRpZXNbYS5jYXVzZSFdIC0gcHJpb3JpdGllc1tiLmNhdXNlIV0sXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SGltSWNvbiA9IChzaXR1YXRpb246IFB0U2l0dWF0aW9uKTogSGltQ3VzID0+IHtcbiAgc3dpdGNoIChzaXR1YXRpb24/LmNhdXNlKSB7XG4gICAgY2FzZSAnRElTVFVSQkFOQ0UnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ2Rpc3J1cHRpb24nLFxuICAgICAgICB0ZXh0OiBzaXR1YXRpb24/LmJyb2FkY2FzdE1lc3NhZ2VzPy5sZW5ndGggPyBzaXR1YXRpb24/LmJyb2FkY2FzdE1lc3NhZ2VzWzBdLnRpdGxlIDogJycsXG4gICAgICB9O1xuICAgIGNhc2UgJ0lORk9STUFUSU9OJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICdpbmZvJyxcbiAgICAgICAgdGV4dDogc2l0dWF0aW9uPy5icm9hZGNhc3RNZXNzYWdlcy5sZW5ndGggPyBzaXR1YXRpb24/LmJyb2FkY2FzdE1lc3NhZ2VzWzBdLnRpdGxlIDogJycsXG4gICAgICB9O1xuICAgIGNhc2UgJ0RFTEFZJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICdkZWxheScsXG4gICAgICAgIHRleHQ6IHNpdHVhdGlvbj8uYnJvYWRjYXN0TWVzc2FnZXMubGVuZ3RoID8gc2l0dWF0aW9uPy5icm9hZGNhc3RNZXNzYWdlc1swXS50aXRsZSA6ICcnLFxuICAgICAgfTtcbiAgICBjYXNlICdUUkFJTl9SRVBMQUNFTUVOVF9CWV9CVVMnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ3JlcGxhY2VtZW50YnVzJyxcbiAgICAgICAgdGV4dDogc2l0dWF0aW9uPy5icm9hZGNhc3RNZXNzYWdlcy5sZW5ndGggPyBzaXR1YXRpb24/LmJyb2FkY2FzdE1lc3NhZ2VzWzBdLnRpdGxlIDogJycsXG4gICAgICB9O1xuICAgIGNhc2UgJ0NPTlNUUlVDVElPTl9TSVRFJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICdjb25zdHJ1Y3Rpb24nLFxuICAgICAgICB0ZXh0OiBzaXR1YXRpb24/LmJyb2FkY2FzdE1lc3NhZ2VzLmxlbmd0aCA/IHNpdHVhdGlvbj8uYnJvYWRjYXN0TWVzc2FnZXNbMF0udGl0bGUgOiAnJyxcbiAgICAgIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICdpbmZvJyxcbiAgICAgICAgdGV4dDogc2l0dWF0aW9uPy5icm9hZGNhc3RNZXNzYWdlcy5sZW5ndGggPyBzaXR1YXRpb24/LmJyb2FkY2FzdE1lc3NhZ2VzWzBdLnRpdGxlIDogJycsXG4gICAgICB9O1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VzID0gKHRyaXA6IElUcmlwSXRlbSwgY3VycmVudExhbmd1YWdlOiBzdHJpbmcpOiBIaW1DdXMgPT4ge1xuICBjb25zdCB7IHN1bW1hcnksIGxlZ3MgfSA9IHRyaXAgfHwge307XG4gIGNvbnN0IHJpZGVMZWdzID0gbGVncz8uZmlsdGVyKChsZWcpID0+IGlzUmlkZUxlZyhsZWcpKSBhcyBQdFJpZGVMZWdbXTtcbiAgY29uc3QgeyB0cmlwU3RhdHVzIH0gPSBzdW1tYXJ5IHx8IHt9O1xuXG4gIGlmICh0cmlwU3RhdHVzPy5jYW5jZWxsZWQgfHwgdHJpcFN0YXR1cz8ucGFydGlhbGx5Q2FuY2VsbGVkKSB7XG4gICAgcmV0dXJuIHsgbmFtZTogJ2NhbmNlbGxhdGlvbicsIHRleHQ6IHRyaXBTdGF0dXM/LmNhbmNlbGxlZFRleHQgfTtcbiAgfVxuICBpZiAocmlkZUxlZ3M/LnNvbWUoKGxlZykgPT4gbGVnLnNlcnZpY2VKb3VybmV5Py5zZXJ2aWNlQWx0ZXJhdGlvbj8uY2FuY2VsbGVkRXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIHsgbmFtZTogJ2Rpc3J1cHRpb24nLCB0ZXh0OiB0cmlwU3RhdHVzPy5jYW5jZWxsZWRUZXh0IH07XG4gIH1cbiAgaWYgKGdldFJlYWNoYWJsZVRleHQocmlkZUxlZ3MpKSB7XG4gICAgcmV0dXJuIHsgbmFtZTogJ21pc3NlZC1jb25uZWN0aW9uJywgdGV4dDogZ2V0UmVhY2hhYmxlVGV4dChyaWRlTGVncykgfTtcbiAgfVxuICBpZiAodHJpcFN0YXR1cz8uYWx0ZXJuYXRpdmUpIHJldHVybiB7IG5hbWU6ICdhbHRlcm5hdGl2ZScsIHRleHQ6IHRyaXBTdGF0dXMuYWx0ZXJuYXRpdmVUZXh0IH07XG4gIGlmIChnZXRSZWRpcmVjdGVkVGV4dChyaWRlTGVncykpIHJldHVybiB7IG5hbWU6ICdyZXJvdXRlJywgdGV4dDogZ2V0UmVkaXJlY3RlZFRleHQocmlkZUxlZ3MpIH07XG4gIGlmIChnZXRVbnBsYW5uZWRTdG9wKHJpZGVMZWdzKSkgcmV0dXJuIHsgbmFtZTogJ2FkZC1zdG9wJywgdGV4dDogZ2V0VW5wbGFubmVkU3RvcChyaWRlTGVncykgfTtcbiAgaWYgKHRyaXBTdGF0dXM/LmRlbGF5ZWQgfHwgdHJpcFN0YXR1cz8uZGVsYXllZFVua25vd24pXG4gICAgcmV0dXJuIHsgbmFtZTogJ2RlbGF5JywgdGV4dDogZ2V0RGVsYXlUZXh0KHJpZGVMZWdzKSB9O1xuICBpZiAodHJpcFN0YXR1cz8ucXVheUNoYW5nZWQpIHtcbiAgICBjb25zdCBkZXBhcnR1cmUgPSByaWRlTGVnc1swXS5kZXBhcnR1cmU7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdwbGF0Zm9ybS1jaGFuZ2UnLFxuICAgICAgdGV4dDogZGVwYXJ0dXJlLnF1YXlDaGFuZ2VkID8gZGVwYXJ0dXJlLnF1YXlDaGFuZ2VkVGV4dCA6IGkxOG5UcmlwUXVheUNoYW5nZVtjdXJyZW50TGFuZ3VhZ2VdLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge30gYXMgSGltQ3VzO1xufTtcblxuY29uc3QgZmluZEFuZFJlcGxhY2VOb3RpY2UgPSAobm90aWNlczogTm90aWNlW10pOiBOb3RpY2UgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCByZXNlcnZhdGlvbk5vdGljZSA9IFsnUlInLCAnUksnLCAnUkMnLCAnUkwnLCAnUk0nLCAnUlMnLCAnUlUnLCAnWFAnLCAnWFInLCAnWFQnXTtcblxuICByZXR1cm4gbm90aWNlcy5yZWR1Y2UoKGZvdW5kTm90aWNlOiBOb3RpY2UgfCB1bmRlZmluZWQsIG5vdGljZTogTm90aWNlKTogTm90aWNlIHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAoZm91bmROb3RpY2UpIHJldHVybiBmb3VuZE5vdGljZTtcbiAgICBpZiAocmVzZXJ2YXRpb25Ob3RpY2UuaW5jbHVkZXMobm90aWNlLm5hbWUpKSB7XG4gICAgICByZXR1cm4geyAuLi5ub3RpY2UsIG5hbWU6ICdSUicgfSBhcyBOb3RpY2U7XG4gICAgfVxuICB9LCB1bmRlZmluZWQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbHRlck5vdGljZXMgPSAobm90aWNlczogTm90aWNlW10pOiBOb3RpY2VbXSA9PiB7XG4gIGNvbnN0IGFsbG93ZWROYW1lcyA9IFsnWicsICdTQicsICdTWicsICdWUicsICdURyddO1xuXG4gIGNvbnN0IGZpbHRlck5vdGljZSA9IG5vdGljZXMuZmlsdGVyKChub3RpY2UsIGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIG5vdGljZXMuZmluZEluZGV4KChuKSA9PiBuLm5hbWUgPT09IG5vdGljZS5uYW1lKSA9PT0gaW5kZXg7XG4gIH0pO1xuXG4gIHJldHVybiBmaWx0ZXJOb3RpY2VcbiAgICAuZmlsdGVyKChub3RpY2UpID0+IGFsbG93ZWROYW1lcy5pbmNsdWRlcyhub3RpY2UubmFtZSkpXG4gICAgLnNvcnQoKGEsIGIpID0+IGFsbG93ZWROYW1lcy5pbmRleE9mKGEubmFtZSkgLSBhbGxvd2VkTmFtZXMuaW5kZXhPZihiLm5hbWUpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVOb3RpY2VzID0gKG5vdGljZXM6IE5vdGljZVtdKTogTm90aWNlW10gPT4ge1xuICBjb25zdCByZXNlcnZhdGlvbk5vdGljZSA9IGZpbmRBbmRSZXBsYWNlTm90aWNlKG5vdGljZXMpO1xuICBjb25zdCBmaWx0ZXJlZE5vdGljZXMgPSBmaWx0ZXJOb3RpY2VzKG5vdGljZXMpO1xuXG4gIGlmIChyZXNlcnZhdGlvbk5vdGljZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmlsdGVyZWROb3RpY2VzO1xuICBpZiAoIWZpbHRlcmVkTm90aWNlcy5sZW5ndGgpIHJldHVybiBbcmVzZXJ2YXRpb25Ob3RpY2VdO1xuXG4gIGlmIChmaWx0ZXJlZE5vdGljZXNbMF0ubmFtZSA9PT0gJ1onICYmIGZpbHRlcmVkTm90aWNlc1sxXSkge1xuICAgIHJldHVybiBbZmlsdGVyZWROb3RpY2VzWzBdLCByZXNlcnZhdGlvbk5vdGljZSwgZmlsdGVyZWROb3RpY2VzWzFdXS5jb25jYXQoXG4gICAgICBmaWx0ZXJlZE5vdGljZXMuc2xpY2UoMiksXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBbcmVzZXJ2YXRpb25Ob3RpY2UsIC4uLmZpbHRlcmVkTm90aWNlc107XG59O1xuXG4vKipcbiAqIEl0IGRpc3BsYXlzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmlwLCBhY3RpbmcgYXMgYSBjb250YWluZXIgZm9yIGFsbCB0aGUgYHNiYi10aW1ldGFibGUtKmAgY29tcG9uZW50cy5cbiAqICovXG5leHBvcnQgY2xhc3MgU2JiVGltZXRhYmxlUm93RWxlbWVudCBleHRlbmRzIFNiYkVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IGVsZW1lbnROYW1lOiBzdHJpbmcgPSAnc2JiLXRpbWV0YWJsZS1yb3cnO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBbYm94U2l6aW5nU3R5bGVzLCB1bnNhZmVDU1Moc3R5bGUpXTtcblxuICAvKiogVGhlIHRyaXAgUHJvcC4gKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pIHB1YmxpYyBhY2Nlc3NvciB0cmlwOiBJVHJpcEl0ZW0gPSBudWxsITtcblxuICAvKiogVGhlIHByaWNlIFByb3AsIHdoaWNoIGNvbnNpc3RzIG9mIHRoZSBkYXRhIGZvciB0aGUgYmFkZ2UuICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSBwdWJsaWMgYWNjZXNzb3IgcHJpY2U6IFByaWNlID0gbnVsbCE7XG5cbiAgLyoqIFRoaXMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIHNiYi1wZWFybC1jaGFpbiBjb21wb25lbnQgLSBpZiB0cnVlIHRoZSBwb3NpdGlvbiB3b24ndCBiZSBhbmltYXRlZC4gKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2Rpc2FibGUtYW5pbWF0aW9uJywgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgZGlzYWJsZUFuaW1hdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBUaGlzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSBub3RpY2VzIHNlY3Rpb24gKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pIHB1YmxpYyBhY2Nlc3NvciBib2FyZGluZzogQm9hcmRpbmcgPSBudWxsITtcblxuICAvKipcbiAgICogVGhlIGxvYWRpbmcgc3RhdGUgLVxuICAgKiB3aGVuIHRoaXMgaXMgdHJ1ZSBpdCB3aWxsIGJlIHJlbmRlciBza2VsZXRvbiB3aXRoIGFuIGlkbGluZyBhbmltYXRpb25cbiAgICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdsb2FkaW5nLXRyaXAnLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBsb2FkaW5nVHJpcDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUaGUgRm9vdHBhdGggYXR0cmlidXRlIGZvciByZW5kZXJpbmcgZGlmZmVyZW50IGljb25zXG4gICAqIHRydWU6IHJlbmRlciBhMTF5LWljb25cbiAgICogZmFsc2U6IHJlbmRlciB3YWxrLWljb25cbiAgICogZGVmYXVsdDogcmVuZGVyIHdhbGstaWNvblxuICAgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2ExMXktZm9vdHBhdGgnLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBhMTF5Rm9vdHBhdGg6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIGxvYWRpbmcgc3RhdGUgLVxuICAgKiB3aGVuIHRoaXMgaXMgdHJ1ZSBpdCB3aWxsIGJlIHJlbmRlciBza2VsZXRvbiB3aXRoIGFuIGlkbGluZyBhbmltYXRpb25cbiAgICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdsb2FkaW5nLXByaWNlJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgbG9hZGluZ1ByaWNlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEhpZGRlbiBsYWJlbCBmb3IgdGhlIGNhcmQgYWN0aW9uLiBJdCBvdmVycmlkZXMgdGhlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGFjY2Vzc2liaWxpdHkgdGV4dCBmb3IgdGhlIGNvbXBvbmVudC4gVXNlIHRoaXMgcHJvcCB0byBwcm92aWRlIGN1c3RvbSBhY2Nlc3NpYmlsaXR5IGluZm9ybWF0aW9uIGZvciB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2NhcmQtYWN0aW9uLWxhYmVsJyB9KVxuICBwdWJsaWMgYWNjZXNzb3IgY2FyZEFjdGlvbkxhYmVsOiBzdHJpbmcgPSAnJztcblxuICAvKiogVGhpcyB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgc2JiLWNhcmQgY29tcG9uZW50IGFzIGFyaWEtZXhwYW5kZWQuICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdhY2Nlc3NpYmlsaXR5LWV4cGFuZGVkJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgYWNjZXNzaWJpbGl0eUV4cGFuZGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIFdoZW4gdGhpcyBwcm9wIGlzIHRydWUgdGhlIHNiYi1jYXJkIHdpbGwgYmUgaW4gdGhlIGFjdGl2ZSBzdGF0ZS4gKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIGFjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBBIGNvbmZpZ3VyZWQgZGF0ZSB3aGljaCBhY3RzIGFzIHRoZSBjdXJyZW50IGRhdGUgaW5zdGVhZCBvZiB0aGUgcmVhbCBjdXJyZW50IGRhdGUuXG4gICAqIE9ubHkgcmVjb21tZW5kZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuXG4gICAqL1xuICBAcHJvcGVydHkoKVxuICBwdWJsaWMgc2V0IG5vdyh2YWx1ZTogRGF0ZSB8IG51bGwpIHtcbiAgICB0aGlzLl9ub3cgPSBkZWZhdWx0RGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKGRlZmF1bHREYXRlQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuICB9XG4gIHB1YmxpYyBnZXQgbm93KCk6IERhdGUge1xuICAgIHJldHVybiB0aGlzLl9ub3cgPz8gbmV3IERhdGUoKTtcbiAgfVxuICBwcml2YXRlIF9ub3c6IERhdGUgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIF9sYW5ndWFnZSA9IG5ldyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIodGhpcyk7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdsb2FkaW5nVHJpcCcpKSB7XG4gICAgICBzZXRPclJlbW92ZUF0dHJpYnV0ZSh0aGlzLCAncm9sZScsICF0aGlzLmxvYWRpbmdUcmlwID8gJ3Jvd2dyb3VwJyA6IG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgc2tlbGV0b24gcmVuZGVyIGZ1bmN0aW9uIGZvciB0aGUgbG9hZGluZyBzdGF0ZSAqL1xuICBwcml2YXRlIF9yZW5kZXJTa2VsZXRvbigpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2JiLWNhcmQgY2xhc3M9XCJzYmItbG9hZGluZyBzYmItY2FyZC1zcGFjaW5nLTR4LXh4cyBzYmItdGltZXRhYmxlX19yb3ctY2FyZFwiPlxuICAgICAgICAke3RoaXMubG9hZGluZ1ByaWNlID8gaHRtbGA8ZGl2IGNsYXNzPVwic2JiLWxvYWRpbmdfX2JhZGdlXCIgc2xvdD1cImJhZGdlXCI+PC9kaXY+YCA6IG5vdGhpbmd9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmItbG9hZGluZ19fd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItbG9hZGluZ19fcm93XCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1sb2FkaW5nX19yb3dcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLWxvYWRpbmdfX3Jvd1wiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc2JiLWNhcmQ+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJpZGVMZWdzKCk6IFB0UmlkZUxlZ1tdIHtcbiAgICByZXR1cm4gdGhpcy50cmlwPy5sZWdzPy5maWx0ZXIoKGxlZykgPT4gaXNSaWRlTGVnKGxlZykpID8/IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UXVheVR5cGVTdHJpbmdzKCk6IHsgbG9uZzogc3RyaW5nOyBzaG9ydDogc3RyaW5nIH0gfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudHJpcC5zdW1tYXJ5Py5wcm9kdWN0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByaWRlTGVncyA9IHRoaXMuX2dldFJpZGVMZWdzKCk7XG4gICAgY29uc3QgaXNTaG9ydCA9IHRoaXMudHJpcC5zdW1tYXJ5LnByb2R1Y3Q/LnZlaGljbGVNb2RlID09PSAnVFJBSU4nO1xuICAgIGNvbnN0IHNob3J0ID0gaXNTaG9ydFxuICAgICAgPyByaWRlTGVnc1swXS5zZXJ2aWNlSm91cm5leS5xdWF5VHlwZVNob3J0TmFtZSB8fCAnJ1xuICAgICAgOiByaWRlTGVnc1swXS5zZXJ2aWNlSm91cm5leS5xdWF5VHlwZU5hbWUgfHwgJyc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbG9uZzogaTE4bkZyb21QbGF0Zm9ybVt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XSArICcgJyArIHNob3J0LFxuICAgICAgc2hvcnQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBtYXAgUXVheSAqL1xuICBwcml2YXRlIF9yZW5kZXJRdWF5VHlwZSgpOiBUZW1wbGF0ZVJlc3VsdCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLnRyaXAuc3VtbWFyeT8ucHJvZHVjdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBxdWF5VHlwZVN0cmluZ3MgPSB0aGlzLl9nZXRRdWF5VHlwZVN0cmluZ3MoKTtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzcGFuIGNsYXNzPVwic2JiLXRpbWV0YWJsZV9fcm93LS1xdWF5XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2JiLXNjcmVlbi1yZWFkZXItb25seVwiPiR7cXVheVR5cGVTdHJpbmdzPy5sb25nfSZuYnNwOzwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmItdGltZXRhYmxlX19yb3ctLXF1YXktdHlwZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgPiR7cXVheVR5cGVTdHJpbmdzPy5zaG9ydH08L3NwYW5cbiAgICAgICAgPlxuICAgICAgPC9zcGFuPlxuICAgIGA7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVIaW1DdXModHJpcDogSVRyaXBJdGVtKTogeyBjdXM6IEhpbUN1cyB8IG51bGw7IGhpbTogSGltQ3VzIHwgbnVsbCB9IHtcbiAgICBjb25zdCB7IHNpdHVhdGlvbnMgfSA9IHRyaXAgfHwge307XG4gICAgY29uc3Qgc29ydGVkU2l0dWF0aW9ucyA9IHNpdHVhdGlvbnMgJiYgc29ydFNpdHVhdGlvbihzaXR1YXRpb25zKTtcbiAgICBjb25zdCBjdXMgPSBnZXRDdXModHJpcCwgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY3VzOiBPYmplY3Qua2V5cyhjdXMpPy5sZW5ndGggPyBjdXMgOiBudWxsLFxuICAgICAgaGltOiBzaXR1YXRpb25zPy5sZW5ndGggPyBnZXRIaW1JY29uKHNvcnRlZFNpdHVhdGlvbnNbMF0pIDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0QWNjZXNzaWJpbGl0eVRleHQodHJpcDogSVRyaXBJdGVtKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IHN1bW1hcnksIGxlZ3MsIG5vdGljZXMgfSA9IHRyaXAgfHwge307XG4gICAgY29uc3Qge1xuICAgICAgZGVwYXJ0dXJlV2FsayxcbiAgICAgIGFycml2YWxXYWxrLFxuICAgICAgZGVwYXJ0dXJlLFxuICAgICAgYXJyaXZhbCxcbiAgICAgIHByb2R1Y3QsXG4gICAgICBkaXJlY3Rpb24sXG4gICAgICBvY2N1cGFuY3ksXG4gICAgICBkdXJhdGlvbixcbiAgICB9ID0gc3VtbWFyeSB8fCB7fTtcblxuICAgIGNvbnN0IHsgZGVwYXJ0dXJlVGltZUF0dHJpYnV0ZSwgYXJyaXZhbFRpbWVBdHRyaWJ1dGUgfSA9IGdldERlcGFydHVyZUFycml2YWxUaW1lQXR0cmlidXRlKFxuICAgICAgbGVncyxcbiAgICAgIGRlcGFydHVyZVdhbGsgfHwgMCxcbiAgICAgIGFycml2YWxXYWxrIHx8IDAsXG4gICAgICB0aGlzLl9sYW5ndWFnZS5jdXJyZW50LFxuICAgICAgdGhpcy5hMTF5Rm9vdHBhdGgsXG4gICAgKTtcblxuICAgIGNvbnN0IHJpZGVMZWdzID0gdGhpcy5fZ2V0UmlkZUxlZ3MoKTtcblxuICAgIGNvbnN0IGRlcGFydHVyZVRpbWU6IERhdGUgfCB1bmRlZmluZWQgPSBkZXBhcnR1cmU/LnRpbWVcbiAgICAgID8gcmVtb3ZlVGltZXpvbmVGcm9tSVNPVGltZVN0cmluZyhkZXBhcnR1cmUudGltZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgYXJyaXZhbFRpbWU6IERhdGUgfCB1bmRlZmluZWQgPSBhcnJpdmFsPy50aW1lXG4gICAgICA/IHJlbW92ZVRpbWV6b25lRnJvbUlTT1RpbWVTdHJpbmcoYXJyaXZhbC50aW1lKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBkZXBhcnR1cmVXYWxrVGV4dCA9IGRlcGFydHVyZVRpbWVBdHRyaWJ1dGVcbiAgICAgID8gYCR7ZGVwYXJ0dXJlVGltZUF0dHJpYnV0ZS50ZXh0fSAke2RlcGFydHVyZVRpbWVBdHRyaWJ1dGUuZHVyYXRpb259LCBgXG4gICAgICA6ICcnO1xuXG4gICAgY29uc3QgYXJyaXZhbFdhbGtUZXh0ID0gYXJyaXZhbFRpbWVBdHRyaWJ1dGVcbiAgICAgID8gYCR7YXJyaXZhbFRpbWVBdHRyaWJ1dGUudGV4dH0gJHthcnJpdmFsVGltZUF0dHJpYnV0ZS5kdXJhdGlvbn0sIGBcbiAgICAgIDogJyc7XG5cbiAgICBjb25zdCBkZXBhcnR1cmVUaW1lVGV4dCA9IGRlcGFydHVyZVRpbWVcbiAgICAgID8gYCR7aTE4bkRlcGFydHVyZVt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX06ICR7Zm9ybWF0KGRlcGFydHVyZVRpbWUsICdISDptbScpfSwgYFxuICAgICAgOiAnJztcblxuICAgIGNvbnN0IGdldERlcGFydHVyZVF1YXlUZXh0ID0gKCk6IHN0cmluZyA9PiB7XG4gICAgICBpZiAoIWRlcGFydHVyZT8ucXVheUZvcm1hdHRlZCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIC8vIGFkZCBwcmVmaXggXCJuZXdcIiBpZiBxdWF5IHdhcyBjaGFuZ2VkXG4gICAgICBjb25zdCBjaGFuZ2VkUXVheVByZWZpeCA9IGRlcGFydHVyZT8ucXVheUNoYW5nZWQgPyBgJHtpMThuTmV3W3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSBgIDogJyc7XG4gICAgICByZXR1cm4gYCR7Y2hhbmdlZFF1YXlQcmVmaXh9JHtcbiAgICAgICAgdGhpcy5fZ2V0UXVheVR5cGVTdHJpbmdzKCk/LmxvbmdcbiAgICAgIH0gJHtkZXBhcnR1cmU/LnF1YXlGb3JtYXR0ZWR9LCBgO1xuICAgIH07XG5cbiAgICBjb25zdCBtZWFuc09mVHJhbnNwb3J0VGV4dCA9XG4gICAgICBwcm9kdWN0ICYmIHByb2R1Y3QudmVoaWNsZU1vZGVcbiAgICAgICAgPyBpMThuTWVhbnNPZlRyYW5zcG9ydFtwcm9kdWN0LnZlaGljbGVNb2RlLnRvTG93ZXJDYXNlKCldICYmXG4gICAgICAgICAgYCR7aTE4bk1lYW5zT2ZUcmFuc3BvcnRbcHJvZHVjdC52ZWhpY2xlTW9kZS50b0xvd2VyQ2FzZSgpXVt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0sIGBcbiAgICAgICAgOiAnJztcblxuICAgIGNvbnN0IHZlaGljbGVTdWJNb2RlVGV4dCA9IHByb2R1Y3Q/LnZlaGljbGVTdWJNb2RlU2hvcnROYW1lXG4gICAgICA/IGAke3Byb2R1Y3QudmVoaWNsZVN1Yk1vZGVTaG9ydE5hbWV9ICR7cHJvZHVjdC5saW5lIHx8ICcnfSwgYFxuICAgICAgOiAnJztcblxuICAgIGNvbnN0IGRpcmVjdGlvblRleHQgPSBgJHtpMThuRGlyZWN0aW9uW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSAke2RpcmVjdGlvbn0sIGA7XG5cbiAgICBjb25zdCBoaW1DdXMgPSB0aGlzLl9oYW5kbGVIaW1DdXModHJpcCk7XG4gICAgY29uc3QgY3VzVGV4dCA9IGhpbUN1cz8uY3VzPy50ZXh0XG4gICAgICA/IGAke2kxOG5SZWFsVGltZUluZm9bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19OiAke2hpbUN1cz8uY3VzPy50ZXh0fSwgYFxuICAgICAgOiAnJztcbiAgICBjb25zdCBoaW1UZXh0ID0gaGltQ3VzPy5oaW0/LnRleHRcbiAgICAgID8gYCR7aTE4blJlYWxUaW1lSW5mb1t0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX06ICR7aGltQ3VzPy5oaW0/LnRleHR9LCBgXG4gICAgICA6ICcnO1xuXG4gICAgY29uc3QgYm9hcmRpbmdUZXh0ID0gdGhpcy5ib2FyZGluZyA/IGAke3RoaXMuYm9hcmRpbmcudGV4dH0sIGAgOiAnJztcblxuICAgIGNvbnN0IHByaWNlVGV4dCA9IGAke3RoaXMucHJpY2U/LmlzRGlzY291bnQgPyBpMThuU3VwZXJzYXZlclt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XSA6ICcnfSAke1xuICAgICAgdGhpcy5wcmljZT8udGV4dCAmJiB0aGlzLnByaWNlPy5wcmljZVxuICAgICAgICA/ICh0aGlzLnByaWNlPy50ZXh0IHx8ICcnKSArICcgJyArICh0aGlzLnByaWNlPy5wcmljZSB8fCAnJykgKyAnLCAnXG4gICAgICAgIDogJydcbiAgICB9YDtcblxuICAgIGNvbnN0IHRyYW5zZmVyUHJvY2VkdXJlcyA9XG4gICAgICByaWRlTGVncy5sZW5ndGggPiAyXG4gICAgICAgID8gYCR7cmlkZUxlZ3MubGVuZ3RoIC0gMX0gJHtpMThuVHJhbnNmZXJQcm9jZWR1cmVzW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSwgYFxuICAgICAgICA6IHJpZGVMZWdzLmxlbmd0aCA+IDFcbiAgICAgICAgICA/IGAke3JpZGVMZWdzLmxlbmd0aCAtIDF9ICR7aTE4blRyYW5zZmVyUHJvY2VkdXJlW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSwgYFxuICAgICAgICAgIDogJyc7XG5cbiAgICBjb25zdCBhcnJpdmFsVGltZVRleHQgPSBhcnJpdmFsVGltZVxuICAgICAgPyBgJHtpMThuQXJyaXZhbFt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX06ICR7Zm9ybWF0KGFycml2YWxUaW1lLCAnSEg6bW0nKX0sIGBcbiAgICAgIDogJyc7XG5cbiAgICBsZXQgb2NjdXBhbmN5VGV4dDogc3RyaW5nID0gJyc7XG4gICAgaWYgKG9jY3VwYW5jeSkge1xuICAgICAgaWYgKG9jY3VwYW5jeS5maXJzdENsYXNzICYmIG9jY3VwYW5jeS5maXJzdENsYXNzICE9PSAnVU5LTk9XTicpIHtcbiAgICAgICAgb2NjdXBhbmN5VGV4dCArPSBgJHtpMThuQ2xhc3MuZmlyc3RbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19ICR7XG4gICAgICAgICAgKFxuICAgICAgICAgICAgaTE4bk9jY3VwYW5jeVtvY2N1cGFuY3kuZmlyc3RDbGFzcy50b0xvd2VyQ2FzZSgpIGFzIFNiYk9jY3VwYW5jeV0gYXMgUmVjb3JkPFxuICAgICAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgICAgIHN0cmluZ1xuICAgICAgICAgICAgPlxuICAgICAgICAgICk/Llt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XVxuICAgICAgICB9LmA7XG4gICAgICB9XG4gICAgICBpZiAob2NjdXBhbmN5LnNlY29uZENsYXNzICYmIG9jY3VwYW5jeS5zZWNvbmRDbGFzcyAhPT0gJ1VOS05PV04nKSB7XG4gICAgICAgIG9jY3VwYW5jeVRleHQgKz0gYCAke2kxOG5DbGFzcy5zZWNvbmRbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19ICR7XG4gICAgICAgICAgKFxuICAgICAgICAgICAgaTE4bk9jY3VwYW5jeVtvY2N1cGFuY3kuc2Vjb25kQ2xhc3MudG9Mb3dlckNhc2UoKSBhcyBTYmJPY2N1cGFuY3ldIGFzIFJlY29yZDxcbiAgICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgICBzdHJpbmdcbiAgICAgICAgICAgID5cbiAgICAgICAgICApPy5bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF1cbiAgICAgICAgfS5gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPVxuICAgICAgbm90aWNlcyAmJlxuICAgICAgaGFuZGxlTm90aWNlcyhub3RpY2VzKS5sZW5ndGggJiZcbiAgICAgIGhhbmRsZU5vdGljZXMobm90aWNlcylcbiAgICAgICAgPy5tYXAoKG5vdGljZSwgaW5kZXgpID0+IGluZGV4IDwgNCAmJiBub3RpY2UudGV4dD8udGVtcGxhdGUpXG4gICAgICAgIC5qb2luKCcsICcpICsgJywgJztcblxuICAgIGNvbnN0IGF0dHJpYnV0ZXNUZXh0ID0gYXR0cmlidXRlc1xuICAgICAgPyBgJHtpMThuVHJhdmVsaGludHNbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19OiAke2F0dHJpYnV0ZXN9YFxuICAgICAgOiAnJztcblxuICAgIGNvbnN0IGR1cmF0aW9uVGV4dCA9XG4gICAgICAhIWR1cmF0aW9uICYmIGR1cmF0aW9uID4gMFxuICAgICAgICA/IGAke2kxOG5UcmlwRHVyYXRpb25bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19ICR7XG4gICAgICAgICAgICBkdXJhdGlvblRvVGltZShkdXJhdGlvbiwgdGhpcy5fbGFuZ3VhZ2UuY3VycmVudCkubG9uZ1xuICAgICAgICAgIH0sIGBcbiAgICAgICAgOiAnJztcblxuICAgIHJldHVybiBbXG4gICAgICBkZXBhcnR1cmVXYWxrVGV4dCxcbiAgICAgIGRlcGFydHVyZVRpbWVUZXh0LFxuICAgICAgZ2V0RGVwYXJ0dXJlUXVheVRleHQoKSxcbiAgICAgIG1lYW5zT2ZUcmFuc3BvcnRUZXh0LFxuICAgICAgdmVoaWNsZVN1Yk1vZGVUZXh0LFxuICAgICAgZGlyZWN0aW9uVGV4dCxcbiAgICAgIGN1c1RleHQsXG4gICAgICBib2FyZGluZ1RleHQsXG4gICAgICBwcmljZVRleHQsXG4gICAgICBjdXNUZXh0ID8gJycgOiBoaW1UZXh0LFxuICAgICAgYXJyaXZhbFRpbWVUZXh0LFxuICAgICAgYXJyaXZhbFdhbGtUZXh0LFxuICAgICAgZHVyYXRpb25UZXh0LFxuICAgICAgdHJhbnNmZXJQcm9jZWR1cmVzLFxuICAgICAgb2NjdXBhbmN5VGV4dCxcbiAgICAgIGF0dHJpYnV0ZXNUZXh0LFxuICAgIF1cbiAgICAgIC5tYXAoKGUpID0+IGU/LnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoKGUpID0+IGUgJiYgZS5sZW5ndGggPiAwKVxuICAgICAgLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZW5kZXIoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGlmICh0aGlzLmxvYWRpbmdUcmlwKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVuZGVyU2tlbGV0b24oKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGxlZ3MsIGlkLCBub3RpY2VzLCBzdW1tYXJ5IH0gPSB0aGlzLnRyaXAgfHwge307XG5cbiAgICBjb25zdCB7XG4gICAgICBwcm9kdWN0LFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgZGVwYXJ0dXJlV2FsayxcbiAgICAgIGRlcGFydHVyZSxcbiAgICAgIGFycml2YWwsXG4gICAgICBhcnJpdmFsV2FsayxcbiAgICAgIG9jY3VwYW5jeSxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH0gPSBzdW1tYXJ5IHx8IHt9O1xuXG4gICAgY29uc3QgaGltQ3VzID0gdGhpcy5faGFuZGxlSGltQ3VzKHRoaXMudHJpcCk7XG4gICAgY29uc3QgaGFzSGltQ3VzID0gISFoaW1DdXMuY3VzIHx8ICEhaGltQ3VzLmhpbTtcblxuICAgIGNvbnN0IG5vdGljZUF0dHJpYnV0ZXMgPSBub3RpY2VzICYmIGhhbmRsZU5vdGljZXMobm90aWNlcyk7XG5cbiAgICBjb25zdCBkdXJhdGlvbk9iaiA9IGR1cmF0aW9uID8gZHVyYXRpb25Ub1RpbWUoZHVyYXRpb24sIHRoaXMuX2xhbmd1YWdlLmN1cnJlbnQpIDogbnVsbDtcblxuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNiYi1jYXJkIGNsYXNzPVwic2JiLWNhcmQtc3BhY2luZy00eC14eHMgc2JiLXRpbWV0YWJsZV9fcm93LWNhcmRcIiBpZD0ke2lkfT5cbiAgICAgICAgPHNiYi1jYXJkLWJ1dHRvblxuICAgICAgICAgID9hY3RpdmU9JHt0aGlzLmFjdGl2ZX1cbiAgICAgICAgICBhcmlhLWV4cGFuZGVkPSR7dGhpcy5hY2Nlc3NpYmlsaXR5RXhwYW5kZWQgPyAndHJ1ZScgOiBub3RoaW5nfVxuICAgICAgICA+XG4gICAgICAgICAgJHt0aGlzLmNhcmRBY3Rpb25MYWJlbCA/IHRoaXMuY2FyZEFjdGlvbkxhYmVsIDogdGhpcy5fZ2V0QWNjZXNzaWJpbGl0eVRleHQodGhpcy50cmlwKX1cbiAgICAgICAgPC9zYmItY2FyZC1idXR0b24+XG4gICAgICAgICR7dGhpcy5sb2FkaW5nUHJpY2UgPyBodG1sYDxkaXYgY2xhc3M9XCJzYmItbG9hZGluZ19fYmFkZ2VcIiBzbG90PVwiYmFkZ2VcIj48L2Rpdj5gIDogbm90aGluZ31cbiAgICAgICAgJHt0aGlzLnByaWNlICYmICF0aGlzLmxvYWRpbmdQcmljZVxuICAgICAgICAgID8gaHRtbGA8c2JiLWNhcmQtYmFkZ2UgY29sb3I9JHt0aGlzLnByaWNlLmlzRGlzY291bnQgPyAnY2hhcmNvYWwnIDogJ3doaXRlJ30+XG4gICAgICAgICAgICAgICR7dGhpcy5wcmljZS5pc0Rpc2NvdW50XG4gICAgICAgICAgICAgICAgPyBodG1sYDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAlPHNwYW4gY2xhc3M9XCJzYmItc2NyZWVuLXJlYWRlci1vbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICA+JHtpMThuU3VwZXJzYXZlclt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX08L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPmBcbiAgICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgICAgICR7dGhpcy5wcmljZS50ZXh0ID8gaHRtbGA8c3Bhbj4ke3RoaXMucHJpY2UudGV4dH08L3NwYW4+YCA6IG5vdGhpbmd9XG4gICAgICAgICAgICAgICR7dGhpcy5wcmljZS5wcmljZSA/IGh0bWxgPHNwYW4+JHt0aGlzLnByaWNlLnByaWNlfTwvc3Bhbj5gIDogbm90aGluZ31cbiAgICAgICAgICAgIDwvc2JiLWNhcmQtYmFkZ2U+YFxuICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi10aW1ldGFibGVfX3Jvd1wiIHJvbGU9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLXRpbWV0YWJsZV9fcm93LWhlYWRlclwiIHJvbGU9XCJncmlkY2VsbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiYi10aW1ldGFibGVfX3Jvdy1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICR7cHJvZHVjdD8uY29ycG9yYXRlSWRlbnRpdHlQaWN0b2dyYW0gJiZcbiAgICAgICAgICAgICAgaHRtbGA8c3BhbiBjbGFzcz1cInNiYi10aW1ldGFibGVfX3Jvdy10cmFuc3BvcnQtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgIDxzYmItaWNvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzYmItdGltZXRhYmxlX19yb3ctdHJhbnNwb3J0LWljb25cIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cInBpY3RvOiR7cHJvZHVjdC5jb3Jwb3JhdGVJZGVudGl0eVBpY3RvZ3JhbX1cIlxuICAgICAgICAgICAgICAgID48L3NiYi1pY29uPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JiLXNjcmVlbi1yZWFkZXItb25seVwiPlxuICAgICAgICAgICAgICAgICAgJHtwcm9kdWN0ICYmXG4gICAgICAgICAgICAgICAgICBwcm9kdWN0LnZlaGljbGVNb2RlICYmXG4gICAgICAgICAgICAgICAgICBpMThuTWVhbnNPZlRyYW5zcG9ydFtwcm9kdWN0LnZlaGljbGVNb2RlLnRvTG93ZXJDYXNlKCldICYmXG4gICAgICAgICAgICAgICAgICBpMThuTWVhbnNPZlRyYW5zcG9ydFtwcm9kdWN0LnZlaGljbGVNb2RlLnRvTG93ZXJDYXNlKCldW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfVxuICAgICAgICAgICAgICAgICAgJm5ic3A7XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L3NwYW4+YH1cbiAgICAgICAgICAgICAgJHtwcm9kdWN0ICYmXG4gICAgICAgICAgICAgIChwcm9kdWN0LmNvcnBvcmF0ZUlkZW50aXR5SWNvblxuICAgICAgICAgICAgICAgID8gcmVuZGVySWNvblByb2R1Y3QocHJvZHVjdC5jb3Jwb3JhdGVJZGVudGl0eUljb24sIHByb2R1Y3QubmFtZSlcbiAgICAgICAgICAgICAgICA6IHByb2R1Y3QudmVoaWNsZVN1Yk1vZGVTaG9ydE5hbWUgJiZcbiAgICAgICAgICAgICAgICAgIHJlbmRlclN0cmluZ1Byb2R1Y3QocHJvZHVjdC52ZWhpY2xlU3ViTW9kZVNob3J0TmFtZSwgcHJvZHVjdD8ubGluZSkpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAke2RpcmVjdGlvblxuICAgICAgICAgICAgICA/IGh0bWxgPHA+JHtgJHtpMThuRGlyZWN0aW9uW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSAke2RpcmVjdGlvbn1gfTwvcD5gXG4gICAgICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c2JiLXBlYXJsLWNoYWluLXRpbWVcbiAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAubGVncz0ke2xlZ3N9XG4gICAgICAgICAgICAuZGVwYXJ0dXJlVGltZT0ke2RlcGFydHVyZT8udGltZX1cbiAgICAgICAgICAgIC5hcnJpdmFsVGltZT0ke2Fycml2YWw/LnRpbWV9XG4gICAgICAgICAgICAuZGVwYXJ0dXJlV2Fsaz0ke2RlcGFydHVyZVdhbGt9XG4gICAgICAgICAgICAuYXJyaXZhbFdhbGs9JHthcnJpdmFsV2Fsa31cbiAgICAgICAgICAgID9kaXNhYmxlLWFuaW1hdGlvbj0ke3RoaXMuZGlzYWJsZUFuaW1hdGlvbn1cbiAgICAgICAgICAgID9hMTF5LWZvb3RwYXRoPSR7dGhpcy5hMTF5Rm9vdHBhdGh9XG4gICAgICAgICAgICAubm93PSR7dGhpcy5ub3d9XG4gICAgICAgICAgPjwvc2JiLXBlYXJsLWNoYWluLXRpbWU+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiYi10aW1ldGFibGVfX3Jvdy1mb290ZXJcIiByb2xlPVwiZ3JpZGNlbGxcIj5cbiAgICAgICAgICAgICR7cHJvZHVjdCAmJiBkZXBhcnR1cmU/LnF1YXlGb3JtYXR0ZWRcbiAgICAgICAgICAgICAgPyBodG1sYDxzcGFuXG4gICAgICAgICAgICAgICAgICBjbGFzcz0ke2RlcGFydHVyZT8ucXVheUNoYW5nZWQgPyBgc2JiLXRpbWV0YWJsZV9fcm93LXF1YXktLWNoYW5nZWRgIDogbm90aGluZ31cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICAgJHtgJHtpMThuRGVwYXJ0dXJlW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSAke1xuICAgICAgICAgICAgICAgICAgICAgIGRlcGFydHVyZT8ucXVheUNoYW5nZWQgPyBpMThuTmV3W3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdIDogJydcbiAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICZuYnNwO1xuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgJHt0aGlzLl9yZW5kZXJRdWF5VHlwZSgpfSAke2RlcGFydHVyZT8ucXVheUZvcm1hdHRlZH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+YFxuICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgICAkeyhvY2N1cGFuY3k/LmZpcnN0Q2xhc3MgJiYgb2NjdXBhbmN5Py5maXJzdENsYXNzICE9PSAnVU5LTk9XTicpIHx8XG4gICAgICAgICAgICAob2NjdXBhbmN5Py5zZWNvbmRDbGFzcyAmJiBvY2N1cGFuY3kuc2Vjb25kQ2xhc3MgIT09ICdVTktOT1dOJylcbiAgICAgICAgICAgICAgPyBodG1sYDxzYmItdGltZXRhYmxlLW9jY3VwYW5jeVxuICAgICAgICAgICAgICAgICAgLmZpcnN0Q2xhc3NPY2N1cGFuY3k9JHtvY2N1cGFuY3k/LmZpcnN0Q2xhc3M/LnRvTG93ZXJDYXNlKCl9XG4gICAgICAgICAgICAgICAgICAuc2Vjb25kQ2xhc3NPY2N1cGFuY3k9JHtvY2N1cGFuY3k/LnNlY29uZENsYXNzPy50b0xvd2VyQ2FzZSgpfVxuICAgICAgICAgICAgICAgID48L3NiYi10aW1ldGFibGUtb2NjdXBhbmN5PmBcbiAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgICAgJHsobm90aWNlQXR0cmlidXRlcyAmJiBub3RpY2VBdHRyaWJ1dGVzLmxlbmd0aCkgfHwgdGhpcy5ib2FyZGluZ1xuICAgICAgICAgICAgICA/IGh0bWxgPHVsIGNsYXNzPVwic2JiLXRpbWV0YWJsZV9fcm93LWhpbnRzXCIgcm9sZT1cImxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICR7bm90aWNlQXR0cmlidXRlcz8ubWFwKChub3RpY2UsIGluZGV4KSA9PlxuICAgICAgICAgICAgICAgICAgICBpbmRleCA8IDRcbiAgICAgICAgICAgICAgICAgICAgICA/IGh0bWxgPGxpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c2JiLWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNiYi10cmF2ZWwtaGludHNfX2l0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9JHsnc2EtJyArIG5vdGljZS5uYW1lPy50b0xvd2VyQ2FzZSgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zYmItaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmItc2NyZWVuLXJlYWRlci1vbmx5XCI+JHtub3RpY2UudGV4dD8udGVtcGxhdGV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5gXG4gICAgICAgICAgICAgICAgICAgICAgOiBub3RoaW5nLFxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICR7dGhpcy5ib2FyZGluZ1xuICAgICAgICAgICAgICAgICAgICA/IGh0bWxgPGxpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNiYi1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2JiLXRyYXZlbC1oaW50c19faXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9JHt0aGlzLmJvYXJkaW5nPy5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPSR7dGhpcy5ib2FyZGluZz8udGV4dH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zYmItaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2xpPmBcbiAgICAgICAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgICAgICAgIDwvdWw+YFxuICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgICAke2R1cmF0aW9uICYmIGR1cmF0aW9uID4gMFxuICAgICAgICAgICAgICA/IGh0bWxgPHRpbWU+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICAgJHtgJHtpMThuVHJpcER1cmF0aW9uW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSAke2R1cmF0aW9uT2JqIS5sb25nfWB9XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4ke2R1cmF0aW9uT2JqIS5zaG9ydH08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC90aW1lPmBcbiAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgICAgJHtoYXNIaW1DdXMgJiYgKGhpbUN1cy5jdXMgfHwgaGltQ3VzLmhpbSlcbiAgICAgICAgICAgICAgPyBodG1sYDxzcGFuIGNsYXNzPVwic2JiLXRpbWV0YWJsZV9fcm93LXdhcm5pbmdcIj5cbiAgICAgICAgICAgICAgICAgIDxzYmItaWNvbiBuYW1lPSR7KGhpbUN1cy5jdXMgfHwgaGltQ3VzLmhpbSkhLm5hbWV9Pjwvc2JiLWljb24+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIj4keyhoaW1DdXMuY3VzIHx8IGhpbUN1cy5oaW0pIS50ZXh0fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+YFxuICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zYmItY2FyZD5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICdzYmItdGltZXRhYmxlLXJvdyc6IFNiYlRpbWV0YWJsZVJvd0VsZW1lbnQ7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDZ0VBLElBQWEscUJBQXFCLE1BQWMsU0FBZ0M7Q0FDOUUs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