@sbb-esta/lyne-elements 5.0.0-next.2 → 5.0.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 (1476) hide show
  1. package/_index.scss +69 -2
  2. package/accordion/accordion.component.js +1 -1
  3. package/{accordion.component-DN0x35kD.js → accordion.component-ClJHZh_N.js} +20 -19
  4. package/accordion.js +1 -1
  5. package/accordion.pure.js +1 -1
  6. package/action-group/_action-group.global.scss +7 -0
  7. package/action-group/action-group.component.js +1 -1
  8. package/action-group.component-DBfkhMYG.js +16 -0
  9. package/action-group.js +1 -1
  10. package/action-group.pure.js +1 -1
  11. package/alert/_alert.global.scss +47 -0
  12. package/alert/alert/alert.component.js +1 -1
  13. package/alert/alert-group/alert-group.component.js +1 -1
  14. package/{alert.component-D8NT9YJ-.js → alert.component-B8EGWmcc.js} +17 -17
  15. package/alert.js +2 -2
  16. package/alert.pure.js +2 -2
  17. package/autocomplete/autocomplete-base-element.js +2 -2
  18. package/autocomplete/autocomplete.component.js +4 -4
  19. package/{autocomplete-base-element-BuCAxBy3.js → autocomplete-base-element-CLMoJtJb.js} +44 -36
  20. package/autocomplete.js +4 -4
  21. package/autocomplete.pure.js +3 -3
  22. package/{core/styles/mixins/badge.scss → badge/_badge.global.scss} +9 -5
  23. package/{block-link-common-aUfrxxDp.js → block-link-common-BZZ4NhPD.js} +15 -16
  24. package/breadcrumb/_breadcrumb.global.scss +36 -0
  25. package/breadcrumb/breadcrumb/breadcrumb.component.js +1 -1
  26. package/breadcrumb/breadcrumb-group/breadcrumb-group.component.js +1 -1
  27. package/{breadcrumb-group.component-XPdnV6-a.js → breadcrumb-group.component-FLbOLqwi.js} +23 -19
  28. package/breadcrumb.js +2 -2
  29. package/breadcrumb.pure.js +2 -2
  30. package/button/_button.global.scss +99 -0
  31. package/button/common/button-common.js +1 -1
  32. package/button/mini-button-group/mini-button-group.component.js +1 -1
  33. package/button/mini-button-link/mini-button-link.component.js +1 -1
  34. package/{button-common-BMpS65Zf.js → button-common-Br6zOEgv.js} +18 -18
  35. package/button.js +3 -3
  36. package/button.pure.js +3 -3
  37. package/calendar/_calendar.global.scss +46 -0
  38. package/calendar/calendar/calendar.component.js +2 -2
  39. package/calendar/calendar-day/calendar-day.component.js +1 -1
  40. package/calendar/calendar-month/calendar-month.component.js +1 -1
  41. package/calendar/calendar-year/calendar-year.component.js +1 -1
  42. package/calendar/common/calendar-cell-base-element.js +1 -1
  43. package/calendar-cell-base-element-DHCKK3bU.js +23 -0
  44. package/{calendar-day.component-CcZymuSD.js → calendar-day.component-DrMWf6-w.js} +2 -2
  45. package/calendar.component-RVAHcJf6.js +1010 -0
  46. package/calendar.js +5 -5
  47. package/calendar.pure.js +4 -4
  48. package/{core/styles/mixins/card.scss → card/_card.global.scss} +67 -45
  49. package/card/card/card.component.js +1 -1
  50. package/card/card-badge/card-badge.component.js +1 -1
  51. package/card/common/card-action-common.js +1 -1
  52. package/card.js +3 -3
  53. package/card.pure.js +3 -3
  54. package/carousel/_carousel.global.scss +11 -0
  55. package/carousel/carousel/carousel.component.js +1 -1
  56. package/carousel/carousel-item/carousel-item.component.js +2 -2
  57. package/carousel/carousel-list/carousel-list.component.js +1 -1
  58. package/{carousel-item.component-DyZAdXL_.js → carousel-item.component-DRfpza-9.js} +12 -2
  59. package/{carousel-list.component-Ai0uJWB7.js → carousel-list.component-DAPO_Oce.js} +6 -13
  60. package/{carousel.component-9oMMOyWo.js → carousel.component-B6XqR3Bc.js} +1 -1
  61. package/carousel.js +5 -5
  62. package/carousel.pure.js +4 -4
  63. package/checkbox/_checkbox.global.scss +29 -0
  64. package/checkbox/checkbox.component.js +1 -1
  65. package/checkbox/common/checkbox-common.js +1 -1
  66. package/{checkbox-common-BSzAnug3.js → checkbox-common-Dz5PUD9H.js} +15 -15
  67. package/checkbox-panel/checkbox-panel.component.js +1 -1
  68. package/{checkbox.component-ChQmCxal.js → checkbox.component-DNVief0q.js} +9 -9
  69. package/checkbox.js +2 -2
  70. package/checkbox.pure.js +2 -2
  71. package/chip/_chip.global.scss +72 -0
  72. package/chip/chip/chip.component.js +1 -1
  73. package/chip/chip-group/chip-group.component.js +1 -1
  74. package/{chip-group.component-BMpczIZH.js → chip-group.component-DKF_Z2QU.js} +20 -25
  75. package/chip-label/_chip-label.global.scss +11 -0
  76. package/chip-label/chip-label.component.js +1 -1
  77. package/chip-label.js +1 -1
  78. package/chip-label.pure.js +1 -1
  79. package/chip.js +2 -2
  80. package/chip.pure.js +2 -2
  81. package/clock/_clock.global.scss +9 -0
  82. package/clock/clock.component.js +1 -1
  83. package/clock.js +1 -1
  84. package/clock.pure.js +1 -1
  85. package/{compact-paginator.component-sRHapku-.js → compact-paginator.component-CmPlZsd4.js} +4 -6
  86. package/container/_container.global.scss +32 -0
  87. package/container/container/container.component.js +1 -1
  88. package/container/sticky-bar/sticky-bar.component.js +1 -1
  89. package/container.js +2 -2
  90. package/container.pure.js +2 -2
  91. package/core/base-elements/_selection-group-base-element.global.scss +16 -0
  92. package/core/base-elements/action-base-element.js +1 -1
  93. package/core/base-elements/button-base-element.js +47 -68
  94. package/core/base-elements/element.js +1 -1
  95. package/core/base-elements/open-close-base-element.js +1 -1
  96. package/core/base-elements/selection-group-base-element.js +1 -1
  97. package/core/controllers/media-matchers-controller.js +1 -1
  98. package/core/datetime/date-adapter.js +2 -2
  99. package/core/i18n/i18n.js +73 -78
  100. package/core/mixins/_panel-common.global.scss +41 -0
  101. package/core/mixins/form-associated-checkbox-mixin.js +17 -26
  102. package/core/mixins/form-associated-input-mixin.js +5 -0
  103. package/core/mixins/form-associated-radio-button-mixin.js +5 -4
  104. package/core/mixins/named-slot-list-mixin.js +14 -14
  105. package/core/mixins/panel-mixin.js +1 -1
  106. package/core/mixins/selection-panel-mixin.js +1 -1
  107. package/core/overlay/overlay-option-panel.js +6 -5
  108. package/core/overlay/overlay-outside-pointer-event-listener.js +1 -1
  109. package/core/styles/_index.scss +4 -16
  110. package/core/styles/_theme.scss +370 -0
  111. package/core/styles/{a11y.scss → features/a11y.scss} +2 -2
  112. package/core/styles/{animation.scss → features/animation.scss} +1 -1
  113. package/core/styles/features/color-scheme.scss +11 -0
  114. package/core/styles/features/font-face.scss +3 -0
  115. package/core/styles/{image.scss → features/image.scss} +29 -7
  116. package/core/styles/{layout.private.scss → features/layout.private.scss} +5 -4
  117. package/core/styles/features/layout.scss +47 -0
  118. package/core/styles/{lists.scss → features/lists.scss} +1 -1
  119. package/core/styles/{scrollbar.scss → features/scrollbar.scss} +1 -1
  120. package/core/styles/features/typography.private.scss +9 -0
  121. package/core/styles/{typography.scss → features/typography.scss} +12 -4
  122. package/core/styles/internals/button-reset.scss +5 -0
  123. package/core/styles/{host-scrollbar.scss → internals/host-scrollbar.scss} +1 -1
  124. package/core/styles/internals/list-reset.scss +6 -0
  125. package/core/styles/internals/popover-reset.scss +6 -0
  126. package/core/styles/{screen-reader-only.scss → internals/screen-reader-only.scss} +1 -1
  127. package/core/styles/lean-off-brand-theme.scss +3 -0
  128. package/core/styles/lean-safety-theme.scss +3 -0
  129. package/core/styles/mixins/{a11y.scss → _a11y.scss} +0 -21
  130. package/core/styles/mixins/_core.scss +69 -0
  131. package/core/styles/{core/functions.scss → mixins/_functions.scss} +0 -8
  132. package/core/styles/mixins/{helpers.scss → _helpers.scss} +3 -14
  133. package/core/styles/mixins/{layout.scss → _layout.scss} +1 -1
  134. package/core/styles/mixins/{lists.scss → _lists.scss} +10 -14
  135. package/core/styles/mixins/{pearl-chain-bullet.scss → _pearl-chain-bullet.scss} +6 -6
  136. package/core/styles/mixins/_reset.scss +38 -0
  137. package/core/styles/mixins/{scrollbar.scss → _scrollbar.scss} +7 -1
  138. package/core/styles/mixins/_typo.scss +162 -0
  139. package/core/styles/styles.js +2 -2
  140. package/core.js +41 -46
  141. package/custom-elements.json +73764 -71600
  142. package/date-input/date-input.component.js +1 -1
  143. package/{date-input.component-aFuUH3N_.js → date-input.component-CKdDrnEj.js} +8 -6
  144. package/date-input.js +1 -1
  145. package/date-input.pure.js +1 -1
  146. package/datepicker/common/datepicker-button.js +1 -1
  147. package/datepicker/datepicker/datepicker.component.js +45 -27
  148. package/{datepicker-button-aYDFZ_3v.js → datepicker-button-D8t6_DBS.js} +0 -3
  149. package/datepicker.js +1 -1
  150. package/datepicker.pure.js +1 -1
  151. package/development/accordion/accordion.component.d.ts +5 -7
  152. package/development/accordion/accordion.component.d.ts.map +1 -1
  153. package/development/accordion/accordion.component.js +1 -1
  154. package/development/accordion.component-pI5XM-iT.js +165 -0
  155. package/development/accordion.js +2 -2
  156. package/development/accordion.pure.js +1 -1
  157. package/development/action-group/action-group.component.d.ts +2 -29
  158. package/development/action-group/action-group.component.d.ts.map +1 -1
  159. package/development/action-group/action-group.component.js +1 -1
  160. package/development/action-group.component-BUWevlaI.js +26 -0
  161. package/development/action-group.js +2 -2
  162. package/development/action-group.pure.js +1 -1
  163. package/development/alert/alert/alert.component.d.ts +2 -3
  164. package/development/alert/alert/alert.component.d.ts.map +1 -1
  165. package/development/alert/alert/alert.component.js +1 -1
  166. package/development/alert/alert-group/alert-group.component.d.ts +2 -3
  167. package/development/alert/alert-group/alert-group.component.d.ts.map +1 -1
  168. package/development/alert/alert-group/alert-group.component.js +1 -1
  169. package/development/alert-group.component-DYmA3spO.js +186 -0
  170. package/development/{alert.component-DxzF0FOi.js → alert.component-Cq0IPcfk.js} +5 -6
  171. package/development/alert.js +3 -3
  172. package/development/alert.pure.js +2 -2
  173. package/development/autocomplete/autocomplete-base-element.d.ts +9 -9
  174. package/development/autocomplete/autocomplete-base-element.d.ts.map +1 -1
  175. package/development/autocomplete/autocomplete-base-element.js +2 -2
  176. package/development/autocomplete/autocomplete.component.d.ts.map +1 -1
  177. package/development/autocomplete/autocomplete.component.js +5 -5
  178. package/development/autocomplete-base-element-DtwUdjCd.js +695 -0
  179. package/development/autocomplete.js +3 -3
  180. package/development/autocomplete.pure.js +2 -2
  181. package/development/block-link-common-DCKM3jJQ.js +99 -0
  182. package/development/breadcrumb/breadcrumb/breadcrumb.component.js +1 -1
  183. package/development/breadcrumb/breadcrumb-group/breadcrumb-group.component.d.ts.map +1 -1
  184. package/development/breadcrumb/breadcrumb-group/breadcrumb-group.component.js +1 -1
  185. package/development/breadcrumb-group.component-mofwnLS1.js +197 -0
  186. package/development/breadcrumb.component-B3XsV_Aq.js +34 -0
  187. package/development/breadcrumb.js +3 -3
  188. package/development/breadcrumb.pure.js +2 -2
  189. package/development/button/accent-button/accent-button.component.js +1 -1
  190. package/development/button/accent-button-link/accent-button-link.component.js +1 -1
  191. package/development/button/accent-button-static/accent-button-static.component.js +1 -1
  192. package/development/button/button/button.component.js +1 -1
  193. package/development/button/button-link/button-link.component.js +1 -1
  194. package/development/button/button-static/button-static.component.js +1 -1
  195. package/development/button/common/button-common.d.ts +1 -2
  196. package/development/button/common/button-common.d.ts.map +1 -1
  197. package/development/button/common/button-common.js +1 -1
  198. package/development/button/mini-button/mini-button.component.js +1 -1
  199. package/development/button/mini-button-group/mini-button-group.component.d.ts +2 -4
  200. package/development/button/mini-button-group/mini-button-group.component.d.ts.map +1 -1
  201. package/development/button/mini-button-group/mini-button-group.component.js +1 -1
  202. package/development/button/mini-button-link/mini-button-link.component.js +1 -1
  203. package/development/button/secondary-button/secondary-button.component.js +1 -1
  204. package/development/button/secondary-button-link/secondary-button-link.component.js +1 -1
  205. package/development/button/secondary-button-static/secondary-button-static.component.js +1 -1
  206. package/development/button/transparent-button/transparent-button.component.js +1 -1
  207. package/development/button/transparent-button-link/transparent-button-link.component.js +1 -1
  208. package/development/button/transparent-button-static/transparent-button-static.component.js +1 -1
  209. package/development/{button-common-DZUBRwwD.js → button-common-DvuYiiku.js} +5 -6
  210. package/development/button.js +4 -4
  211. package/development/button.pure.js +3 -3
  212. package/development/calendar/calendar/calendar.component.d.ts +47 -56
  213. package/development/calendar/calendar/calendar.component.d.ts.map +1 -1
  214. package/development/calendar/calendar/calendar.component.js +2 -2
  215. package/development/calendar/calendar-day/calendar-day.component.js +1 -1
  216. package/development/calendar/calendar-month/calendar-month.component.js +2 -2
  217. package/development/calendar/calendar-weekday/calendar-weekday.component.js +1 -1
  218. package/development/calendar/calendar-weeknumber/calendar-weeknumber.component.js +1 -1
  219. package/development/calendar/calendar-year/calendar-year.component.js +2 -2
  220. package/development/calendar/common/calendar-cell-base-element.d.ts.map +1 -1
  221. package/development/calendar/common/calendar-cell-base-element.js +1 -1
  222. package/development/calendar-cell-base-element-D9XadTz1.js +38 -0
  223. package/development/calendar-day.component-Zky9Z-Fq.js +139 -0
  224. package/development/calendar.component-BmB8HoZt.js +1399 -0
  225. package/development/calendar.js +5 -5
  226. package/development/calendar.pure.js +4 -4
  227. package/development/card/card/card.component.js +1 -1
  228. package/development/card/card-badge/card-badge.component.js +1 -1
  229. package/development/card/card-button/card-button.component.js +1 -1
  230. package/development/card/card-link/card-link.component.js +1 -1
  231. package/development/card/common/card-action-common.js +1 -1
  232. package/development/{card-action-common-zS5iNz23.js → card-action-common-Dr-EX0gr.js} +1 -1
  233. package/development/{card-badge.component-CEfJdJBs.js → card-badge.component-CENJTZ4g.js} +1 -1
  234. package/development/{card.component-CL2gHoyP.js → card.component-CVAgqDNK.js} +1 -1
  235. package/development/card.js +4 -4
  236. package/development/card.pure.js +3 -3
  237. package/development/carousel/carousel/carousel.component.js +1 -1
  238. package/development/carousel/carousel-item/carousel-item.component.d.ts +8 -6
  239. package/development/carousel/carousel-item/carousel-item.component.d.ts.map +1 -1
  240. package/development/carousel/carousel-item/carousel-item.component.js +2 -2
  241. package/development/carousel/carousel-list/carousel-list.component.d.ts.map +1 -1
  242. package/development/carousel/carousel-list/carousel-list.component.js +1 -1
  243. package/development/{carousel-item.component-B_0wdIAu.js → carousel-item.component-DjDAg-DC.js} +16 -4
  244. package/development/carousel-list.component-pJBqbfi9.js +126 -0
  245. package/development/carousel.component-CD2_hauh.js +139 -0
  246. package/development/carousel.js +5 -5
  247. package/development/carousel.pure.js +4 -4
  248. package/development/checkbox/checkbox.component.d.ts +4 -6
  249. package/development/checkbox/checkbox.component.d.ts.map +1 -1
  250. package/development/checkbox/checkbox.component.js +1 -1
  251. package/development/checkbox/common/checkbox-common.d.ts +0 -1
  252. package/development/checkbox/common/checkbox-common.d.ts.map +1 -1
  253. package/development/checkbox/common/checkbox-common.js +1 -1
  254. package/development/{checkbox-common-C3Ekixul.js → checkbox-common-o3Su1McS.js} +12 -12
  255. package/development/checkbox-group/checkbox-group.component.js +1 -1
  256. package/development/checkbox-group.js +1 -1
  257. package/development/checkbox-panel/checkbox-panel.component.js +2 -2
  258. package/development/checkbox-panel.js +1 -1
  259. package/development/{checkbox.component-D6BR8e7w.js → checkbox.component-6zr36eQq.js} +7 -8
  260. package/development/checkbox.js +3 -3
  261. package/development/checkbox.pure.js +2 -2
  262. package/development/chip/chip/chip.component.js +1 -1
  263. package/development/chip/chip-group/chip-group.component.d.ts +2 -24
  264. package/development/chip/chip-group/chip-group.component.d.ts.map +1 -1
  265. package/development/chip/chip-group/chip-group.component.js +1 -1
  266. package/development/chip-group.component-BY025VTb.js +395 -0
  267. package/development/chip-label/chip-label.component.js +1 -1
  268. package/development/{chip-label.component-DHHNtvTt.js → chip-label.component-D8Il3pvk.js} +1 -1
  269. package/development/chip-label.js +2 -2
  270. package/development/chip-label.pure.js +1 -1
  271. package/development/{chip.component-Uuf3tGFz.js → chip.component-C2VmHfZa.js} +1 -1
  272. package/development/chip.js +3 -3
  273. package/development/chip.pure.js +2 -2
  274. package/development/clock/clock.component.d.ts +2 -2
  275. package/development/clock/clock.component.d.ts.map +1 -1
  276. package/development/clock/clock.component.js +1 -1
  277. package/development/clock.component-CyCPrufS.js +289 -0
  278. package/development/clock.js +2 -2
  279. package/development/clock.pure.js +1 -1
  280. package/development/compact-paginator.component-CKHS0U1v.js +49 -0
  281. package/development/container/container/container.component.js +1 -1
  282. package/development/container/sticky-bar/sticky-bar.component.d.ts +2 -3
  283. package/development/container/sticky-bar/sticky-bar.component.d.ts.map +1 -1
  284. package/development/container/sticky-bar/sticky-bar.component.js +1 -1
  285. package/development/{container.component-D1Qgp4HW.js → container.component-Ctdd3D-A.js} +1 -1
  286. package/development/container.js +3 -3
  287. package/development/container.pure.js +2 -2
  288. package/development/core/a11y/arrow-navigation.js +1 -1
  289. package/development/core/a11y/fake-event-detection.js +1 -1
  290. package/development/core/a11y/focus-trap-controller.js +1 -1
  291. package/development/core/a11y/focus-visible-within-controller.js +1 -1
  292. package/development/core/a11y/focus.js +1 -1
  293. package/development/core/a11y/input-modality-detector.js +1 -1
  294. package/development/core/a11y/interactivity-checker.js +1 -1
  295. package/development/core/a11y/live-announcer.js +1 -1
  296. package/development/core/base-elements/action-base-element.js +2 -2
  297. package/development/core/base-elements/button-base-element.d.ts +3 -4
  298. package/development/core/base-elements/button-base-element.d.ts.map +1 -1
  299. package/development/core/base-elements/button-base-element.js +66 -92
  300. package/development/core/base-elements/element.d.ts.map +1 -1
  301. package/development/core/base-elements/element.js +1 -1
  302. package/development/core/base-elements/link-base-element.d.ts +1 -3
  303. package/development/core/base-elements/link-base-element.d.ts.map +1 -1
  304. package/development/core/base-elements/link-base-element.js +1 -1
  305. package/development/core/base-elements/open-close-base-element.d.ts +1 -1
  306. package/development/core/base-elements/open-close-base-element.d.ts.map +1 -1
  307. package/development/core/base-elements/open-close-base-element.js +2 -2
  308. package/development/core/base-elements/selection-group-base-element.d.ts +5 -7
  309. package/development/core/base-elements/selection-group-base-element.d.ts.map +1 -1
  310. package/development/core/base-elements/selection-group-base-element.js +1 -1
  311. package/development/core/config/config.js +1 -1
  312. package/development/core/controllers/escapable-overlay-controller.js +1 -1
  313. package/development/core/controllers/id-reference-controller.js +1 -1
  314. package/development/core/controllers/inert-controller.js +1 -1
  315. package/development/core/controllers/language-controller.js +1 -1
  316. package/development/core/controllers/media-matchers-controller.js +2 -2
  317. package/development/core/controllers/overlay-position-controller.js +1 -1
  318. package/development/core/controllers/property-watcher-controller.js +1 -1
  319. package/development/core/datetime/date-adapter.d.ts +0 -5
  320. package/development/core/datetime/date-adapter.d.ts.map +1 -1
  321. package/development/core/datetime/date-adapter.js +2 -7
  322. package/development/core/datetime/native-date-adapter.js +1 -1
  323. package/development/core/datetime/temporal-date-adapter.js +1 -1
  324. package/development/core/decorators/force-type.js +1 -1
  325. package/development/core/decorators/get-override.js +1 -1
  326. package/development/core/decorators/handle-distinct-change.js +1 -1
  327. package/development/core/decorators/id-reference.d.ts.map +1 -1
  328. package/development/core/decorators/id-reference.js +1 -1
  329. package/development/core/decorators/omit-empty-converter.js +1 -1
  330. package/development/core/decorators/plain-date.js +1 -1
  331. package/development/core/dom/animation.js +1 -1
  332. package/development/core/dom/contains-pierce-shadow-dom.js +1 -1
  333. package/development/core/dom/platform.js +1 -1
  334. package/development/core/dom/queue-dom-content-loaded.js +1 -1
  335. package/development/core/dom/scroll.js +1 -1
  336. package/development/core/dom/set-or-remove-attribute.js +1 -1
  337. package/development/core/eventing/event-target.js +1 -1
  338. package/development/core/eventing/form-element-handlers.js +1 -1
  339. package/development/core/eventing/forward-event.js +1 -1
  340. package/development/core/eventing/is-event-prevented.js +1 -1
  341. package/development/core/i18n/i18n.d.ts +2 -3
  342. package/development/core/i18n/i18n.d.ts.map +1 -1
  343. package/development/core/i18n/i18n.js +6 -12
  344. package/development/core/interfaces/types.d.ts +1 -6
  345. package/development/core/interfaces/types.d.ts.map +1 -1
  346. package/development/core/mixins/animation-complete-mixin.js +1 -1
  347. package/development/core/mixins/disabled-mixin.js +1 -1
  348. package/development/core/mixins/form-associated-checkbox-mixin.d.ts.map +1 -1
  349. package/development/core/mixins/form-associated-checkbox-mixin.js +7 -21
  350. package/development/core/mixins/form-associated-input-mixin.d.ts +1 -0
  351. package/development/core/mixins/form-associated-input-mixin.d.ts.map +1 -1
  352. package/development/core/mixins/form-associated-input-mixin.js +6 -1
  353. package/development/core/mixins/form-associated-mixin.d.ts +1 -1
  354. package/development/core/mixins/form-associated-mixin.d.ts.map +1 -1
  355. package/development/core/mixins/form-associated-mixin.js +1 -1
  356. package/development/core/mixins/form-associated-radio-button-mixin.d.ts.map +1 -1
  357. package/development/core/mixins/form-associated-radio-button-mixin.js +11 -8
  358. package/development/core/mixins/named-slot-list-mixin.js +3 -3
  359. package/development/core/mixins/negative-mixin.js +1 -1
  360. package/development/core/mixins/panel-mixin.d.ts +3 -3
  361. package/development/core/mixins/panel-mixin.d.ts.map +1 -1
  362. package/development/core/mixins/panel-mixin.js +1 -1
  363. package/development/core/mixins/readonly-mixin.js +1 -1
  364. package/development/core/mixins/required-mixin.js +1 -1
  365. package/development/core/mixins/selection-panel-mixin.js +2 -1
  366. package/development/core/mixins/update-scheduler-mixin.js +1 -1
  367. package/development/core/overlay/overlay-option-panel.d.ts +1 -1
  368. package/development/core/overlay/overlay-option-panel.d.ts.map +1 -1
  369. package/development/core/overlay/overlay-option-panel.js +5 -2
  370. package/development/core/overlay/overlay-outside-pointer-event-listener.d.ts +1 -1
  371. package/development/core/overlay/overlay-outside-pointer-event-listener.d.ts.map +1 -1
  372. package/development/core/overlay/overlay-outside-pointer-event-listener.js +2 -2
  373. package/development/core/overlay/overlay-trigger-attributes.js +1 -1
  374. package/development/core/overlay/position.js +1 -1
  375. package/development/core/styles/styles.d.ts +3 -0
  376. package/development/core/styles/styles.d.ts.map +1 -1
  377. package/development/core/styles/styles.js +2 -2
  378. package/development/core/testing/event-spy.js +1 -1
  379. package/development/core/testing/mocha-extensions.js +1 -1
  380. package/development/core/testing/wait-for-condition.js +1 -1
  381. package/development/core/testing/wait-for-image-ready.js +1 -1
  382. package/development/core/testing/wait-for-render.js +1 -1
  383. package/development/core.d.ts +0 -6
  384. package/development/core.d.ts.map +1 -1
  385. package/development/core.js +7 -12
  386. package/development/date-input/date-input.component.d.ts.map +1 -1
  387. package/development/date-input/date-input.component.js +1 -1
  388. package/development/date-input.component-DMNqiZ6l.js +302 -0
  389. package/development/date-input.js +2 -2
  390. package/development/date-input.pure.js +1 -1
  391. package/development/datepicker/common/datepicker-button.d.ts +0 -2
  392. package/development/datepicker/common/datepicker-button.d.ts.map +1 -1
  393. package/development/datepicker/common/datepicker-button.js +1 -1
  394. package/development/datepicker/datepicker/datepicker.component.d.ts +5 -3
  395. package/development/datepicker/datepicker/datepicker.component.d.ts.map +1 -1
  396. package/development/datepicker/datepicker/datepicker.component.js +38 -12
  397. package/development/datepicker/datepicker-next-day/datepicker-next-day.component.js +1 -1
  398. package/development/datepicker/datepicker-previous-day/datepicker-previous-day.component.js +1 -1
  399. package/development/datepicker/datepicker-toggle/datepicker-toggle.component.js +1 -1
  400. package/development/{datepicker-button-BAT1ebzJ.js → datepicker-button-BvBQB6Sv.js} +1 -5
  401. package/development/datepicker.js +2 -2
  402. package/development/datepicker.pure.js +1 -1
  403. package/development/dialog/dialog/dialog.component.d.ts +2 -3
  404. package/development/dialog/dialog/dialog.component.d.ts.map +1 -1
  405. package/development/dialog/dialog/dialog.component.js +1 -1
  406. package/development/dialog/dialog-actions/dialog-actions.component.js +1 -1
  407. package/development/dialog/dialog-close-button/dialog-close-button.component.js +1 -1
  408. package/development/dialog/dialog-content/dialog-content.component.js +1 -1
  409. package/development/dialog/dialog-title/dialog-title.component.js +1 -1
  410. package/development/{dialog-actions.component-e0ZTTUin.js → dialog-actions.component-Dyzg7z-B.js} +1 -1
  411. package/development/{dialog-close-button.component-Idc00dB9.js → dialog-close-button.component-dgLnsaLx.js} +1 -1
  412. package/development/{dialog-content.component-CThU7Z8A.js → dialog-content.component-DDtVV0Lh.js} +1 -1
  413. package/development/dialog-title.component-DyItyahT.js +29 -0
  414. package/development/{dialog.component-AItB8ixG.js → dialog.component-B1Tke2ym.js} +8 -11
  415. package/development/dialog.js +6 -6
  416. package/development/dialog.pure.js +5 -5
  417. package/development/divider/divider.component.d.ts +2 -2
  418. package/development/divider/divider.component.d.ts.map +1 -1
  419. package/development/divider/divider.component.js +1 -1
  420. package/development/{divider.component-Ck_0vISe.js → divider.component-CYP23U4q.js} +1 -1
  421. package/development/divider.js +2 -2
  422. package/development/divider.pure.js +1 -1
  423. package/development/{element-BAsBayf5.js → element-BS28ba7w.js} +1 -1
  424. package/development/error.component-Bp7ztvQB.js +53 -0
  425. package/development/expansion-panel/expansion-panel/expansion-panel.component.d.ts +4 -6
  426. package/development/expansion-panel/expansion-panel/expansion-panel.component.d.ts.map +1 -1
  427. package/development/expansion-panel/expansion-panel/expansion-panel.component.js +1 -1
  428. package/development/expansion-panel/expansion-panel-content/expansion-panel-content.component.d.ts +1 -1
  429. package/development/expansion-panel/expansion-panel-content/expansion-panel-content.component.d.ts.map +1 -1
  430. package/development/expansion-panel/expansion-panel-content/expansion-panel-content.component.js +1 -1
  431. package/development/expansion-panel/expansion-panel-header/expansion-panel-header.component.d.ts +1 -1
  432. package/development/expansion-panel/expansion-panel-header/expansion-panel-header.component.d.ts.map +1 -1
  433. package/development/expansion-panel/expansion-panel-header/expansion-panel-header.component.js +1 -1
  434. package/development/{expansion-panel-content.component-BUbiseFP.js → expansion-panel-content.component-CKhGtjji.js} +2 -1
  435. package/development/expansion-panel-header.component-Do3pLbzs.js +83 -0
  436. package/development/expansion-panel.component-BnbRiLrk.js +320 -0
  437. package/development/expansion-panel.js +4 -4
  438. package/development/expansion-panel.pure.js +3 -3
  439. package/development/file-selector/common/file-selector-common.d.ts +6 -1
  440. package/development/file-selector/common/file-selector-common.d.ts.map +1 -1
  441. package/development/file-selector/common/file-selector-common.js +2 -2
  442. package/development/file-selector/file-selector/file-selector.component.d.ts.map +1 -1
  443. package/development/file-selector/file-selector/file-selector.component.js +5 -4
  444. package/development/file-selector/file-selector-dropzone/file-selector-dropzone.component.d.ts.map +1 -1
  445. package/development/file-selector/file-selector-dropzone/file-selector-dropzone.component.js +1 -1
  446. package/development/file-selector-common-CCvgN1G2.js +421 -0
  447. package/development/file-selector-dropzone.component-BeqSG2IM.js +106 -0
  448. package/development/file-selector.js +4 -4
  449. package/development/file-selector.pure.js +3 -3
  450. package/development/flip-card/flip-card/flip-card.component.d.ts.map +1 -1
  451. package/development/flip-card/flip-card/flip-card.component.js +1 -1
  452. package/development/flip-card/flip-card-details/flip-card-details.component.js +1 -1
  453. package/development/flip-card/flip-card-summary/flip-card-summary.component.d.ts +1 -2
  454. package/development/flip-card/flip-card-summary/flip-card-summary.component.d.ts.map +1 -1
  455. package/development/flip-card/flip-card-summary/flip-card-summary.component.js +1 -1
  456. package/development/{flip-card-details.component-BYv_W66a.js → flip-card-details.component-RJ43uhma.js} +1 -1
  457. package/development/{flip-card-summary.component-C-US77Nw.js → flip-card-summary.component-D9zMzU8m.js} +2 -2
  458. package/development/flip-card.component-CAsfIcvt.js +189 -0
  459. package/development/flip-card.js +4 -4
  460. package/development/flip-card.pure.js +3 -3
  461. package/development/footer/footer.component.d.ts +2 -3
  462. package/development/footer/footer.component.d.ts.map +1 -1
  463. package/development/footer/footer.component.js +1 -1
  464. package/development/{footer.component-K2bWizjw.js → footer.component-DJH7E5aO.js} +1 -1
  465. package/development/footer.js +2 -2
  466. package/development/footer.pure.js +1 -1
  467. package/development/form-field/error/error.component.js +1 -1
  468. package/development/form-field/form-field/form-field.component.d.ts +3 -10
  469. package/development/form-field/form-field/form-field.component.d.ts.map +1 -1
  470. package/development/form-field/form-field/form-field.component.js +1 -1
  471. package/development/form-field/form-field-clear/form-field-clear.component.js +1 -1
  472. package/development/form-field/form-field-text-counter/form-field-text-counter.component.js +1 -1
  473. package/development/form-field/hint/hint.component.js +1 -1
  474. package/development/form-field.component-YM-Z5aZf.js +670 -0
  475. package/development/form-field.js +4 -4
  476. package/development/form-field.pure.js +3 -3
  477. package/development/header/common/header-action-common.d.ts +2 -2
  478. package/development/header/common/header-action-common.d.ts.map +1 -1
  479. package/development/header/common/header-action-common.js +1 -1
  480. package/development/header/header/header.component.d.ts +4 -3
  481. package/development/header/header/header.component.d.ts.map +1 -1
  482. package/development/header/header/header.component.js +1 -1
  483. package/development/header/header-button/header-button.component.js +1 -1
  484. package/development/header/header-environment/header-environment.component.js +1 -1
  485. package/development/header/header-link/header-link.component.js +1 -1
  486. package/development/header-action-common-DX2ejpAL.js +86 -0
  487. package/development/{header-environment.component-CIyxQwkQ.js → header-environment.component--4YEZyKq.js} +1 -1
  488. package/development/header.component-FVw_5NRT.js +336 -0
  489. package/development/header.js +4 -4
  490. package/development/header.pure.js +3 -3
  491. package/development/{hint.component-BB9QLGGx.js → hint.component-CdM71SNj.js} +1 -1
  492. package/development/icon/icon-base.js +1 -1
  493. package/development/icon/icon-name-mixin.js +1 -1
  494. package/development/icon/icon-request.js +1 -1
  495. package/development/icon/icon-validate.js +1 -1
  496. package/development/icon/icon.component.d.ts +1 -1
  497. package/development/icon/icon.component.d.ts.map +1 -1
  498. package/development/icon/icon.component.js +6 -8
  499. package/development/icon-base-Cq6DxOUh.js +163 -0
  500. package/development/icon-sidebar/icon-sidebar/icon-sidebar.component.js +1 -1
  501. package/development/icon-sidebar/icon-sidebar-button/icon-sidebar-button.component.js +1 -1
  502. package/development/icon-sidebar/icon-sidebar-container/icon-sidebar-container.component.js +1 -1
  503. package/development/icon-sidebar/icon-sidebar-content/icon-sidebar-content.component.js +1 -1
  504. package/development/icon-sidebar/icon-sidebar-link/icon-sidebar-link.component.js +1 -1
  505. package/development/{icon-sidebar-container.component-CM94Spwy.js → icon-sidebar-container.component-G8wyj1Sb.js} +1 -1
  506. package/development/{icon-sidebar-content.component-BP9W5ZxR.js → icon-sidebar-content.component-D1VPTNhO.js} +1 -1
  507. package/development/{icon-sidebar.component-B68P2aNh.js → icon-sidebar.component-DLlCKweu.js} +1 -1
  508. package/development/icon-sidebar.js +4 -4
  509. package/development/icon-sidebar.pure.js +3 -3
  510. package/development/icon.js +2 -2
  511. package/development/icon.pure.js +1 -1
  512. package/development/image/image.component.js +1 -1
  513. package/development/{image.component-EfSMgHI_.js → image.component-DoRIca5y.js} +5 -16
  514. package/development/image.js +2 -2
  515. package/development/image.pure.js +1 -1
  516. package/development/inline-link-common-CXYyREBi.js +18 -0
  517. package/development/journey-header/journey-header.component.js +1 -1
  518. package/development/journey-header.component-tBukBhVq.js +146 -0
  519. package/development/journey-header.js +2 -2
  520. package/development/journey-header.pure.js +1 -1
  521. package/development/lead-container/lead-container.component.js +1 -1
  522. package/development/{lead-container.component-C_mFeq1B.js → lead-container.component-D93DLU_J.js} +1 -1
  523. package/development/lead-container.js +2 -2
  524. package/development/lead-container.pure.js +1 -1
  525. package/development/link/block-link/block-link.component.js +1 -1
  526. package/development/link/block-link-button/block-link-button.component.js +1 -1
  527. package/development/link/block-link-static/block-link-static.component.js +1 -1
  528. package/development/link/common/block-link-common.d.ts +3 -4
  529. package/development/link/common/block-link-common.d.ts.map +1 -1
  530. package/development/link/common/block-link-common.js +1 -1
  531. package/development/link/common/inline-link-common.js +1 -1
  532. package/development/link/common/link-common.js +1 -1
  533. package/development/link/link/link.component.js +1 -1
  534. package/development/link/link-button/link-button.component.js +1 -1
  535. package/development/link/link-static/link-static.component.js +1 -1
  536. package/development/link-common-DWTP-lFX.js +26 -0
  537. package/development/link-list/common/link-list-base.d.ts +5 -7
  538. package/development/link-list/common/link-list-base.d.ts.map +1 -1
  539. package/development/link-list/common/link-list-base.js +1 -1
  540. package/development/link-list/link-list.component.d.ts +2 -2
  541. package/development/link-list/link-list.component.d.ts.map +1 -1
  542. package/development/link-list/link-list.component.js +1 -1
  543. package/development/link-list-anchor/link-list-anchor.component.js +1 -1
  544. package/development/{link-list-anchor.component-Csb-FOQL.js → link-list-anchor.component-9C1H5KXX.js} +2 -2
  545. package/development/link-list-anchor.js +2 -2
  546. package/development/link-list-anchor.pure.js +1 -1
  547. package/development/{link-list-base-QADBTZCN.js → link-list-base-CaPkNR_V.js} +4 -5
  548. package/development/link-list.component-By_lSSYE.js +97 -0
  549. package/development/link-list.js +3 -3
  550. package/development/link-list.pure.js +2 -2
  551. package/development/link.js +4 -4
  552. package/development/link.pure.js +3 -3
  553. package/development/loading-indicator/loading-indicator.component.js +1 -1
  554. package/development/loading-indicator-circle/loading-indicator-circle.component.js +1 -1
  555. package/development/{loading-indicator-circle.component-Cfjw5vyz.js → loading-indicator-circle.component-CudNN1Z6.js} +1 -1
  556. package/development/loading-indicator-circle.js +2 -2
  557. package/development/loading-indicator-circle.pure.js +1 -1
  558. package/development/{loading-indicator.component-By2VaLCf.js → loading-indicator.component-sEdpEBpx.js} +1 -1
  559. package/development/loading-indicator.js +2 -2
  560. package/development/loading-indicator.pure.js +1 -1
  561. package/development/logo/logo.component.d.ts +2 -2
  562. package/development/logo/logo.component.d.ts.map +1 -1
  563. package/development/logo/logo.component.js +1 -1
  564. package/development/{logo.component-DYKgAgq0.js → logo.component-SqyPA1M-.js} +1 -1
  565. package/development/logo.js +2 -2
  566. package/development/logo.pure.js +1 -1
  567. package/development/map-container/map-container.component.d.ts +2 -2
  568. package/development/map-container/map-container.component.js +1 -1
  569. package/development/map-container.component-ASCfDs-R.js +176 -0
  570. package/development/map-container.js +2 -2
  571. package/development/map-container.pure.js +1 -1
  572. package/development/menu/common/menu-action-common.js +1 -1
  573. package/development/menu/menu/menu.component.d.ts.map +1 -1
  574. package/development/menu/menu/menu.component.js +1 -1
  575. package/development/menu/menu-button/menu-button.component.js +1 -1
  576. package/development/menu/menu-link/menu-link.component.js +1 -1
  577. package/development/menu-action-common-BUIJFq1R.js +32 -0
  578. package/development/menu.component-B3uWxwbt.js +369 -0
  579. package/development/menu.js +3 -3
  580. package/development/menu.pure.js +2 -2
  581. package/development/message/message.component.js +1 -1
  582. package/development/{message.component-CdO5GyE2.js → message.component-BrqWVCJV.js} +2 -2
  583. package/development/message.js +2 -2
  584. package/development/message.pure.js +1 -1
  585. package/development/mini-button-group.component-C2KcpK5c.js +115 -0
  586. package/development/mini-button-link.component-BHaNYXk0.js +39 -0
  587. package/development/mini-calendar/mini-calendar/mini-calendar.component.d.ts +2 -2
  588. package/development/mini-calendar/mini-calendar/mini-calendar.component.d.ts.map +1 -1
  589. package/development/mini-calendar/mini-calendar/mini-calendar.component.js +1 -1
  590. package/development/mini-calendar/mini-calendar-day/mini-calendar-day.component.js +1 -1
  591. package/development/mini-calendar/mini-calendar-month/mini-calendar-month.component.d.ts.map +1 -1
  592. package/development/mini-calendar/mini-calendar-month/mini-calendar-month.component.js +1 -1
  593. package/development/{mini-calendar-day.component-BLkJ12Bw.js → mini-calendar-day.component-UG6wpckK.js} +1 -1
  594. package/development/{mini-calendar-month.component-D8XjjLmN.js → mini-calendar-month.component-GE-cmXxP.js} +1 -1
  595. package/development/mini-calendar.component-DQ_zxELt.js +184 -0
  596. package/development/mini-calendar.js +4 -4
  597. package/development/mini-calendar.pure.js +3 -3
  598. package/development/navigation/common/navigation-action-common.d.ts +3 -3
  599. package/development/navigation/common/navigation-action-common.d.ts.map +1 -1
  600. package/development/navigation/common/navigation-action-common.js +1 -1
  601. package/development/navigation/navigation/navigation.component.d.ts +0 -1
  602. package/development/navigation/navigation/navigation.component.d.ts.map +1 -1
  603. package/development/navigation/navigation/navigation.component.js +1 -1
  604. package/development/navigation/navigation-button/navigation-button.component.js +1 -1
  605. package/development/navigation/navigation-link/navigation-link.component.js +1 -1
  606. package/development/navigation/navigation-list/navigation-list.component.d.ts +2 -3
  607. package/development/navigation/navigation-list/navigation-list.component.d.ts.map +1 -1
  608. package/development/navigation/navigation-list/navigation-list.component.js +1 -1
  609. package/development/navigation/navigation-marker/navigation-marker.component.d.ts +1 -1
  610. package/development/navigation/navigation-marker/navigation-marker.component.d.ts.map +1 -1
  611. package/development/navigation/navigation-marker/navigation-marker.component.js +1 -1
  612. package/development/navigation/navigation-section/navigation-section.component.d.ts +0 -1
  613. package/development/navigation/navigation-section/navigation-section.component.d.ts.map +1 -1
  614. package/development/navigation/navigation-section/navigation-section.component.js +1 -1
  615. package/development/navigation-action-common-BdJOaItd.js +56 -0
  616. package/development/navigation-list.component-CWOSnwgm.js +86 -0
  617. package/development/navigation-marker.component-D3Vbe1dH.js +120 -0
  618. package/development/navigation-section.component-34GEIPaN.js +343 -0
  619. package/development/navigation.component-CqQuaq7V.js +316 -0
  620. package/development/navigation.js +6 -6
  621. package/development/navigation.pure.js +5 -5
  622. package/development/notification/notification.component.d.ts +2 -5
  623. package/development/notification/notification.component.d.ts.map +1 -1
  624. package/development/notification/notification.component.js +1 -1
  625. package/development/notification.component-BlWGjgrP.js +259 -0
  626. package/development/notification.js +2 -2
  627. package/development/notification.pure.js +1 -1
  628. package/development/optgroup-base-element--G8myprb.js +140 -0
  629. package/development/option/optgroup/optgroup-base-element.d.ts +3 -3
  630. package/development/option/optgroup/optgroup-base-element.d.ts.map +1 -1
  631. package/development/option/optgroup/optgroup-base-element.js +1 -1
  632. package/development/option/optgroup/optgroup.component.js +2 -2
  633. package/development/option/option/option-base-element.d.ts +2 -3
  634. package/development/option/option/option-base-element.d.ts.map +1 -1
  635. package/development/option/option/option-base-element.js +9 -8
  636. package/development/option/option/option.component.d.ts +0 -2
  637. package/development/option/option/option.component.d.ts.map +1 -1
  638. package/development/option/option/option.component.js +1 -1
  639. package/development/option/option-hint/option-hint.component.d.ts +2 -0
  640. package/development/option/option-hint/option-hint.component.d.ts.map +1 -1
  641. package/development/option/option-hint/option-hint.component.js +1 -1
  642. package/development/option/option-styles.d.ts +2 -0
  643. package/development/option/option-styles.d.ts.map +1 -0
  644. package/development/option/option-styles.js +2 -0
  645. package/development/option-hint.component-DyCue4gx.js +40 -0
  646. package/development/option-styles-CJMae7_-.js +8 -0
  647. package/development/option.component-BSHq97Of.js +130 -0
  648. package/development/option.js +6 -5
  649. package/development/option.pure.d.ts +1 -0
  650. package/development/option.pure.d.ts.map +1 -1
  651. package/development/option.pure.js +5 -4
  652. package/development/overlay/overlay-base-element.d.ts +6 -8
  653. package/development/overlay/overlay-base-element.d.ts.map +1 -1
  654. package/development/overlay/overlay-base-element.js +12 -17
  655. package/development/overlay/overlay.component.d.ts +3 -3
  656. package/development/overlay/overlay.component.d.ts.map +1 -1
  657. package/development/overlay/overlay.component.js +1 -1
  658. package/development/{overlay.component-rFmitc_r.js → overlay.component-D_BLhfdG.js} +8 -11
  659. package/development/overlay.js +2 -2
  660. package/development/overlay.pure.js +1 -1
  661. package/development/paginator/common/paginator-common.d.ts +12 -7
  662. package/development/paginator/common/paginator-common.d.ts.map +1 -1
  663. package/development/paginator/common/paginator-common.js +2 -408
  664. package/development/paginator/compact-paginator/compact-paginator.component.d.ts.map +1 -1
  665. package/development/paginator/compact-paginator/compact-paginator.component.js +1 -1
  666. package/development/paginator/paginator/paginator.component.d.ts.map +1 -1
  667. package/development/paginator/paginator/paginator.component.js +1 -1
  668. package/development/paginator-common-B9EN1Fjx.js +432 -0
  669. package/development/paginator.component-DisPJ2Qa.js +265 -0
  670. package/development/paginator.js +5 -5
  671. package/development/paginator.pure.js +4 -4
  672. package/development/{panel-mixin-CFz9-K_8.js → panel-mixin-Da_cHQn-.js} +3 -5
  673. package/development/popover/popover/popover.component.d.ts +54 -0
  674. package/development/popover/popover/popover.component.d.ts.map +1 -0
  675. package/development/popover/popover/popover.component.js +2 -0
  676. package/development/popover/popover-base/popover-base.d.ts +61 -0
  677. package/development/popover/popover-base/popover-base.d.ts.map +1 -0
  678. package/development/popover/popover-base/popover-base.js +2 -0
  679. package/development/popover/popover-close-button/popover-close-button.component.d.ts +21 -0
  680. package/development/popover/popover-close-button/popover-close-button.component.d.ts.map +1 -0
  681. package/development/popover/popover-close-button/popover-close-button.component.js +30 -0
  682. package/development/popover-base-BcIAVXWF.js +288 -0
  683. package/development/popover.component-CMR0eV2t.js +233 -0
  684. package/development/popover.js +6 -3
  685. package/development/popover.pure.d.ts +3 -1
  686. package/development/popover.pure.d.ts.map +1 -1
  687. package/development/popover.pure.js +4 -2
  688. package/development/radio-button/common/radio-button-common.d.ts +0 -1
  689. package/development/radio-button/common/radio-button-common.d.ts.map +1 -1
  690. package/development/radio-button/common/radio-button-common.js +1 -1
  691. package/development/radio-button/radio-button.component.d.ts +2 -3
  692. package/development/radio-button/radio-button.component.d.ts.map +1 -1
  693. package/development/radio-button/radio-button.component.js +1 -1
  694. package/development/radio-button-common-BaGYHkpD.js +129 -0
  695. package/development/radio-button-group/radio-button-group.component.js +1 -1
  696. package/development/radio-button-group.js +1 -1
  697. package/development/radio-button-panel/radio-button-panel.component.js +1 -1
  698. package/development/radio-button-panel.js +1 -1
  699. package/development/{radio-button.component-3BV31Fkc.js → radio-button.component-CmQGrMHr.js} +5 -5
  700. package/development/radio-button.js +3 -3
  701. package/development/radio-button.pure.js +2 -2
  702. package/development/{sbb-tokens-bg2elLoF.js → sbb-tokens-DGQJTWqa.js} +1 -1
  703. package/development/select/select.component.d.ts +4 -5
  704. package/development/select/select.component.d.ts.map +1 -1
  705. package/development/select/select.component.js +1 -1
  706. package/development/select.component-3S8E6UwN.js +809 -0
  707. package/development/select.js +2 -2
  708. package/development/select.pure.js +1 -1
  709. package/development/selection-action-panel/selection-action-panel.component.js +1 -1
  710. package/development/{selection-action-panel.component-ClpKsc-Z.js → selection-action-panel.component-pd9B6lRD.js} +1 -1
  711. package/development/selection-action-panel.js +2 -2
  712. package/development/selection-action-panel.pure.js +1 -1
  713. package/development/selection-expansion-panel/selection-expansion-panel.component.js +1 -1
  714. package/development/selection-expansion-panel.component-Dtfnz1AE.js +186 -0
  715. package/development/selection-expansion-panel.js +2 -2
  716. package/development/selection-expansion-panel.pure.js +1 -1
  717. package/development/selection-group-base-element-govDKjsE.js +146 -0
  718. package/development/sidebar/common/styles.js +1 -1
  719. package/development/sidebar/sidebar/sidebar.component.js +1 -1
  720. package/development/sidebar/sidebar-close-button/sidebar-close-button.component.js +1 -1
  721. package/development/sidebar/sidebar-container/sidebar-container.component.js +1 -1
  722. package/development/sidebar/sidebar-content/sidebar-content.component.js +1 -1
  723. package/development/sidebar/sidebar-title/sidebar-title.component.d.ts +3 -2
  724. package/development/sidebar/sidebar-title/sidebar-title.component.d.ts.map +1 -1
  725. package/development/sidebar/sidebar-title/sidebar-title.component.js +1 -1
  726. package/development/{sidebar-close-button.component-D_grme_h.js → sidebar-close-button.component-tkbcoR-I.js} +1 -1
  727. package/development/sidebar-container.component-CbE9878W.js +100 -0
  728. package/development/{sidebar-content.component-CbYPeaaz.js → sidebar-content.component-CBfaiAsJ.js} +1 -1
  729. package/development/{sidebar-title.component-BFqfnG6B.js → sidebar-title.component-ZKarv4Mz.js} +1 -1
  730. package/development/{sidebar.component-DcVKyd9R.js → sidebar.component-Cmkn9X-M.js} +1 -1
  731. package/development/sidebar.js +6 -6
  732. package/development/sidebar.pure.js +5 -5
  733. package/development/signet/signet.component.d.ts +2 -3
  734. package/development/signet/signet.component.d.ts.map +1 -1
  735. package/development/signet/signet.component.js +1 -1
  736. package/development/{signet.component-NdFqUZK9.js → signet.component--kuRWLGw.js} +1 -1
  737. package/development/signet.js +2 -2
  738. package/development/signet.pure.js +1 -1
  739. package/development/skiplink-list/skiplink-list.component.d.ts +2 -3
  740. package/development/skiplink-list/skiplink-list.component.d.ts.map +1 -1
  741. package/development/skiplink-list/skiplink-list.component.js +1 -1
  742. package/development/skiplink-list.component-Cpyo7JAH.js +129 -0
  743. package/development/skiplink-list.js +2 -2
  744. package/development/skiplink-list.pure.js +1 -1
  745. package/development/slider/slider.component.d.ts +1 -0
  746. package/development/slider/slider.component.d.ts.map +1 -1
  747. package/development/slider/slider.component.js +1 -1
  748. package/development/slider.component-Dymr4YvE.js +333 -0
  749. package/development/slider.js +2 -2
  750. package/development/slider.pure.js +1 -1
  751. package/development/status/status.component.d.ts +1 -2
  752. package/development/status/status.component.d.ts.map +1 -1
  753. package/development/status/status.component.js +1 -1
  754. package/development/{status.component-CtTNDvLl.js → status.component-DnnX98xP.js} +1 -1
  755. package/development/status.js +2 -2
  756. package/development/status.pure.js +1 -1
  757. package/development/step-label.component-i13wQWJJ.js +127 -0
  758. package/development/step.component-lTLpcOUh.js +167 -0
  759. package/development/stepper/step/step.component.d.ts +16 -12
  760. package/development/stepper/step/step.component.d.ts.map +1 -1
  761. package/development/stepper/step/step.component.js +2 -2
  762. package/development/stepper/step-label/step-label.component.d.ts +1 -1
  763. package/development/stepper/step-label/step-label.component.d.ts.map +1 -1
  764. package/development/stepper/step-label/step-label.component.js +1 -1
  765. package/development/stepper/stepper/stepper.component.d.ts +13 -10
  766. package/development/stepper/stepper/stepper.component.d.ts.map +1 -1
  767. package/development/stepper/stepper/stepper.component.js +1 -1
  768. package/development/stepper.component-DBE685VL.js +443 -0
  769. package/development/stepper.js +5 -5
  770. package/development/stepper.pure.js +4 -4
  771. package/development/sticky-bar.component-BEhV0azF.js +202 -0
  772. package/development/{styles-Jlhoev1S.js → styles-BTV2MyrZ.js} +1 -1
  773. package/development/styles-CUz7LBUc.js +30 -0
  774. package/development/tab-group.component-DBg6I8W7.js +297 -0
  775. package/development/tab-label.component-BbQu5sA-.js +233 -0
  776. package/development/tab-nav-bar.component-DC4Ba7w2.js +109 -0
  777. package/development/{tab.component-DxZtEaTP.js → tab.component-Bsdzs7P2.js} +1 -1
  778. package/development/table/table-wrapper/table-wrapper.component.js +1 -1
  779. package/development/{table-wrapper.component-Ba6NpQu1.js → table-wrapper.component-Cqc9PHZl.js} +1 -1
  780. package/development/table.js +2 -2
  781. package/development/table.pure.js +1 -1
  782. package/development/tabs/common/styles.js +1 -1
  783. package/development/tabs/tab/tab.component.js +1 -1
  784. package/development/tabs/tab-group/tab-group.component.d.ts +17 -11
  785. package/development/tabs/tab-group/tab-group.component.d.ts.map +1 -1
  786. package/development/tabs/tab-group/tab-group.component.js +2 -2
  787. package/development/tabs/tab-label/tab-label.component.d.ts +2 -3
  788. package/development/tabs/tab-label/tab-label.component.d.ts.map +1 -1
  789. package/development/tabs/tab-label/tab-label.component.js +1 -1
  790. package/development/tabs/tab-nav-bar/tab-nav-bar.component.d.ts +2 -3
  791. package/development/tabs/tab-nav-bar/tab-nav-bar.component.d.ts.map +1 -1
  792. package/development/tabs/tab-nav-bar/tab-nav-bar.component.js +1 -1
  793. package/development/tabs.js +7 -7
  794. package/development/tabs.pure.js +6 -6
  795. package/development/tag/tag/tag.component.d.ts +5 -7
  796. package/development/tag/tag/tag.component.d.ts.map +1 -1
  797. package/development/tag/tag/tag.component.js +1 -1
  798. package/development/tag/tag-group/tag-group.component.d.ts +9 -5
  799. package/development/tag/tag-group/tag-group.component.d.ts.map +1 -1
  800. package/development/tag/tag-group/tag-group.component.js +1 -1
  801. package/development/tag-group.component-DTff1eBB.js +225 -0
  802. package/development/tag.component-CDDb2fnV.js +258 -0
  803. package/development/tag.js +3 -3
  804. package/development/tag.pure.js +2 -2
  805. package/development/teaser/teaser.component.d.ts.map +1 -1
  806. package/development/teaser/teaser.component.js +1 -1
  807. package/development/teaser-hero/teaser-hero.component.js +1 -1
  808. package/development/{teaser-hero.component-DrdkFx5X.js → teaser-hero.component-d0iLCgA7.js} +1 -1
  809. package/development/teaser-hero.js +2 -2
  810. package/development/teaser-hero.pure.js +1 -1
  811. package/development/teaser-panel/teaser-panel.component.js +1 -1
  812. package/development/{teaser-panel.component-WSXbBzCq.js → teaser-panel.component-CXT3l9-M.js} +1 -1
  813. package/development/teaser-panel.js +2 -2
  814. package/development/teaser-panel.pure.js +1 -1
  815. package/development/teaser-product/common/teaser-product-common.js +1 -1
  816. package/development/teaser-product/teaser-product/teaser-product.component.d.ts.map +1 -1
  817. package/development/teaser-product/teaser-product/teaser-product.component.js +1 -1
  818. package/development/teaser-product/teaser-product-static/teaser-product-static.component.js +1 -1
  819. package/development/{teaser-product-common-B8a-KHTi.js → teaser-product-common-DfbpBlTk.js} +1 -1
  820. package/development/teaser-product.component-Cv9PR0lo.js +37 -0
  821. package/development/teaser-product.js +3 -3
  822. package/development/teaser-product.pure.js +2 -2
  823. package/development/teaser.component-BGnmuXOI.js +116 -0
  824. package/development/teaser.js +2 -2
  825. package/development/teaser.pure.js +1 -1
  826. package/development/time-input/time-input.component.d.ts +3 -1
  827. package/development/time-input/time-input.component.d.ts.map +1 -1
  828. package/development/time-input/time-input.component.js +1 -1
  829. package/development/time-input.component-Cdd1dzcG.js +194 -0
  830. package/development/time-input.js +2 -2
  831. package/development/time-input.pure.js +1 -1
  832. package/development/timetable-form/timetable-form/timetable-form.component.js +1 -1
  833. package/development/timetable-form/timetable-form-details/timetable-form-details.component.js +1 -1
  834. package/development/timetable-form/timetable-form-field/timetable-form-field.component.d.ts.map +1 -1
  835. package/development/timetable-form/timetable-form-field/timetable-form-field.component.js +1 -1
  836. package/development/timetable-form/timetable-form-swap-button/timetable-form-swap-button.component.js +1 -1
  837. package/development/{timetable-form-details.component-DacESFsP.js → timetable-form-details.component-HPb8xks3.js} +1 -1
  838. package/development/{timetable-form-field.component-DWCb4SY0.js → timetable-form-field.component-DxUpCWe0.js} +4 -1
  839. package/development/{timetable-form-swap-button.component-DGCpV2_y.js → timetable-form-swap-button.component-BT63vkZr.js} +1 -1
  840. package/development/{timetable-form.component-CtRlKR7e.js → timetable-form.component-DcvKOLvm.js} +1 -1
  841. package/development/timetable-form.js +5 -5
  842. package/development/timetable-form.pure.js +4 -4
  843. package/development/timetable-occupancy/timetable-occupancy.component.d.ts.map +1 -1
  844. package/development/timetable-occupancy/timetable-occupancy.component.js +1 -1
  845. package/development/timetable-occupancy-icon/timetable-occupancy-icon.component.js +1 -1
  846. package/development/timetable-occupancy-icon.component-Bsct9zga.js +95 -0
  847. package/development/timetable-occupancy-icon.js +2 -2
  848. package/development/timetable-occupancy-icon.pure.js +1 -1
  849. package/development/timetable-occupancy.component-62YNjs5z.js +126 -0
  850. package/development/timetable-occupancy.js +2 -2
  851. package/development/timetable-occupancy.pure.js +1 -1
  852. package/development/title/title-base.d.ts +3 -4
  853. package/development/title/title-base.d.ts.map +1 -1
  854. package/development/title/title-base.js +1 -1
  855. package/development/title/title.component.d.ts +3 -4
  856. package/development/title/title.component.d.ts.map +1 -1
  857. package/development/title/title.component.js +1 -1
  858. package/development/title-base-DPAFIjFK.js +102 -0
  859. package/development/title.component-BSrkZhnI.js +69 -0
  860. package/development/title.js +3 -3
  861. package/development/title.pure.js +2 -2
  862. package/development/toast/toast.component.d.ts.map +1 -1
  863. package/development/toast/toast.component.js +1 -1
  864. package/development/{toast.component-DeQSxWdf.js → toast.component-BgGWVr4o.js} +4 -5
  865. package/development/toast.js +2 -2
  866. package/development/toast.pure.js +1 -1
  867. package/development/toggle/toggle/toggle.component.d.ts +2 -3
  868. package/development/toggle/toggle/toggle.component.d.ts.map +1 -1
  869. package/development/toggle/toggle/toggle.component.js +1 -1
  870. package/development/toggle/toggle-option/toggle-option.component.js +1 -1
  871. package/development/toggle-check/toggle-check.component.d.ts +2 -3
  872. package/development/toggle-check/toggle-check.component.d.ts.map +1 -1
  873. package/development/toggle-check/toggle-check.component.js +1 -1
  874. package/development/{toggle-check.component-BUYj49gP.js → toggle-check.component--On4AuVo.js} +4 -5
  875. package/development/toggle-check.js +2 -2
  876. package/development/toggle-check.pure.js +1 -1
  877. package/development/{toggle-option.component-heU6pMCB.js → toggle-option.component-CZY7xnrX.js} +1 -1
  878. package/development/toggle.component-D3IbJqAH.js +243 -0
  879. package/development/toggle.js +3 -3
  880. package/development/toggle.pure.js +2 -2
  881. package/development/tooltip/tooltip.component.d.ts.map +1 -1
  882. package/development/tooltip/tooltip.component.js +1 -1
  883. package/development/tooltip.component-BE8BlKzE.js +369 -0
  884. package/development/tooltip.js +2 -2
  885. package/development/tooltip.pure.js +1 -1
  886. package/development/train/train/train.component.d.ts +2 -3
  887. package/development/train/train/train.component.d.ts.map +1 -1
  888. package/development/train/train/train.component.js +1 -1
  889. package/development/train/train-blocked-passage/train-blocked-passage.component.js +1 -1
  890. package/development/train/train-formation/train-formation.component.d.ts +2 -2
  891. package/development/train/train-formation/train-formation.component.d.ts.map +1 -1
  892. package/development/train/train-formation/train-formation.component.js +1 -1
  893. package/development/train/train-formation-orientation-mixin.d.ts +1 -2
  894. package/development/train/train-formation-orientation-mixin.d.ts.map +1 -1
  895. package/development/train/train-formation-orientation-mixin.js +1 -1
  896. package/development/train/train-wagon/train-wagon.component.js +1 -1
  897. package/development/train/train-wagon-button/train-wagon-button.component.js +1 -1
  898. package/development/train/train-wagon-common.js +1 -1
  899. package/development/train/train-wagon-link/train-wagon-link.component.js +1 -1
  900. package/development/{train-blocked-passage.component-2TuSqbDg.js → train-blocked-passage.component-BGCuXvjt.js} +1 -1
  901. package/development/{train-formation.component-BYB03zX5.js → train-formation.component-XGatA4-S.js} +2 -2
  902. package/development/train-wagon-common-4dC995mT.js +441 -0
  903. package/development/train.component-CX1HEDwX.js +239 -0
  904. package/development/train.js +5 -5
  905. package/development/train.pure.js +4 -4
  906. package/development/visual-checkbox/visual-checkbox.component.d.ts +3 -4
  907. package/development/visual-checkbox/visual-checkbox.component.d.ts.map +1 -1
  908. package/development/visual-checkbox/visual-checkbox.component.js +1 -1
  909. package/development/{visual-checkbox.component-Dzdm0TH-.js → visual-checkbox.component-EpRxoteZ.js} +4 -5
  910. package/development/visual-checkbox.js +2 -2
  911. package/development/visual-checkbox.pure.js +1 -1
  912. package/dialog/_dialog.global.scss +77 -0
  913. package/dialog/dialog/dialog.component.js +1 -1
  914. package/dialog/dialog-actions/dialog-actions.component.js +1 -1
  915. package/dialog/dialog-close-button/dialog-close-button.component.js +1 -1
  916. package/dialog/dialog-content/dialog-content.component.js +1 -1
  917. package/dialog/dialog-title/dialog-title.component.js +1 -1
  918. package/{dialog.component-4O3__zyd.js → dialog.component-Bs62s2eB.js} +7 -10
  919. package/dialog.js +5 -5
  920. package/dialog.pure.js +5 -5
  921. package/divider/_divider.global.scss +9 -0
  922. package/divider/divider.component.js +1 -1
  923. package/divider.js +1 -1
  924. package/divider.pure.js +1 -1
  925. package/expansion-panel/_expansion-panel.global.scss +66 -0
  926. package/expansion-panel/expansion-panel/expansion-panel.component.js +1 -1
  927. package/expansion-panel/expansion-panel-content/expansion-panel-content.component.js +1 -1
  928. package/expansion-panel/expansion-panel-header/expansion-panel-header.component.js +1 -1
  929. package/{expansion-panel-content.component-Cf1CWu5_.js → expansion-panel-content.component-Dm761peO.js} +1 -1
  930. package/{expansion-panel-header.component-DloOF4eC.js → expansion-panel-header.component-Cli4Qy1p.js} +1 -1
  931. package/expansion-panel.component-kyVRxBRu.js +225 -0
  932. package/expansion-panel.js +3 -3
  933. package/expansion-panel.pure.js +3 -3
  934. package/file-selector/_file-selector.global.scss +25 -0
  935. package/file-selector/common/file-selector-common.js +2 -2
  936. package/file-selector/file-selector/file-selector.component.js +14 -13
  937. package/file-selector/file-selector-dropzone/file-selector-dropzone.component.js +1 -1
  938. package/{file-selector-common-CmbsJ64j.js → file-selector-common-Bk347JZN.js} +35 -28
  939. package/{file-selector-dropzone.component-74fipV3m.js → file-selector-dropzone.component-CywJG8KU.js} +23 -23
  940. package/file-selector.js +5 -5
  941. package/file-selector.pure.js +4 -4
  942. package/flip-card/_flip-card.global.scss +38 -0
  943. package/flip-card/flip-card/flip-card.component.js +1 -1
  944. package/flip-card/flip-card-details/flip-card-details.component.js +1 -1
  945. package/flip-card/flip-card-summary/flip-card-summary.component.js +1 -1
  946. package/{flip-card-summary.component-CuMMdJ-B.js → flip-card-summary.component-ZvTeHtPV.js} +1 -1
  947. package/{flip-card.component-CZ0v44Ym.js → flip-card.component-CtUxr9yF.js} +22 -18
  948. package/flip-card.js +3 -3
  949. package/flip-card.pure.js +3 -3
  950. package/footer/_footer.global.scss +17 -0
  951. package/footer/footer.component.js +1 -1
  952. package/footer.js +1 -1
  953. package/footer.pure.js +1 -1
  954. package/form-field/_form-field.global.scss +274 -0
  955. package/form-field/error/error.component.js +1 -1
  956. package/form-field/form-field/form-field.component.js +1 -1
  957. package/form-field/hint/hint.component.js +1 -1
  958. package/form-field.component-eH2C_qPG.js +454 -0
  959. package/form-field.js +3 -3
  960. package/form-field.pure.js +3 -3
  961. package/header/_header.global.scss +108 -0
  962. package/header/common/header-action-common.js +1 -1
  963. package/header/header/header.component.js +1 -1
  964. package/header/header-environment/header-environment.component.js +1 -1
  965. package/header-action-common-B5M7_3Q1.js +64 -0
  966. package/{header.component-Bj7phY1B.js → header.component-BbdHh5fF.js} +18 -18
  967. package/header.js +3 -3
  968. package/header.pure.js +3 -3
  969. package/icon/icon-base.js +1 -1
  970. package/icon/icon.component.js +3 -6
  971. package/{icon-base-CCpB1w3b.js → icon-base-TSCmR5QC.js} +1 -1
  972. package/icon-sidebar/_icon-sidebar.global.scss +21 -0
  973. package/icon-sidebar/icon-sidebar/icon-sidebar.component.js +1 -1
  974. package/icon-sidebar/icon-sidebar-container/icon-sidebar-container.component.js +1 -1
  975. package/icon-sidebar/icon-sidebar-content/icon-sidebar-content.component.js +1 -1
  976. package/icon-sidebar.js +3 -3
  977. package/icon-sidebar.pure.js +3 -3
  978. package/icon.js +1 -1
  979. package/icon.pure.js +1 -1
  980. package/image/image.component.js +1 -1
  981. package/{image.component-BSSyfPru.js → image.component-K7sre7oE.js} +1 -1
  982. package/image.js +1 -1
  983. package/image.pure.js +1 -1
  984. package/index.d.ts +2 -1
  985. package/index.js +2 -1
  986. package/inline-link-common-D0sat0cr.js +13 -0
  987. package/journey-header/journey-header.component.js +1 -1
  988. package/journey-header.js +1 -1
  989. package/journey-header.pure.js +1 -1
  990. package/lead-container/_lead-container.global.scss +31 -0
  991. package/lead-container/lead-container.component.js +1 -1
  992. package/lead-container.js +1 -1
  993. package/lead-container.pure.js +1 -1
  994. package/lean-off-brand-theme.css +3509 -0
  995. package/lean-safety-theme.css +3509 -0
  996. package/{core.css → lean-theme.css} +1439 -626
  997. package/{core/styles/mixins/link.scss → link/_link.global.scss} +53 -43
  998. package/link/common/block-link-common.js +1 -1
  999. package/link/common/inline-link-common.js +1 -1
  1000. package/link/common/link-common.js +1 -1
  1001. package/link-list/common/link-list-base.js +1 -1
  1002. package/link-list/link-list.component.js +1 -1
  1003. package/link-list-anchor/link-list-anchor.component.js +1 -1
  1004. package/{link-list-anchor.component-DG_HCtHH.js → link-list-anchor.component-as1bjNH1.js} +1 -1
  1005. package/link-list-anchor.js +1 -1
  1006. package/link-list-anchor.pure.js +1 -1
  1007. package/{link-list-base-CEEw1SMd.js → link-list-base-Dgu0yeTL.js} +16 -16
  1008. package/{link-list.component-CS4KuMkQ.js → link-list.component-bTG45ml0.js} +2 -2
  1009. package/link-list.js +2 -2
  1010. package/link-list.pure.js +2 -2
  1011. package/link.js +3 -3
  1012. package/link.pure.js +3 -3
  1013. package/loading-indicator/_loading-indicator.global.scss +10 -0
  1014. package/loading-indicator/loading-indicator.component.js +1 -1
  1015. package/loading-indicator-circle/_loading-indicator-circle.global.scss +19 -0
  1016. package/loading-indicator-circle/loading-indicator-circle.component.js +1 -1
  1017. package/loading-indicator-circle.js +1 -1
  1018. package/loading-indicator-circle.pure.js +1 -1
  1019. package/loading-indicator.js +1 -1
  1020. package/loading-indicator.pure.js +1 -1
  1021. package/logo/_logo.global.scss +15 -0
  1022. package/logo/logo.component.js +1 -1
  1023. package/logo.js +1 -1
  1024. package/logo.pure.js +1 -1
  1025. package/map-container/_map-container.global.scss +15 -0
  1026. package/map-container/map-container.component.js +1 -1
  1027. package/{map-container.component-DyJBA3qj.js → map-container.component-C2_Miiv0.js} +1 -1
  1028. package/map-container.js +1 -1
  1029. package/map-container.pure.js +1 -1
  1030. package/menu/_menu.global.scss +31 -0
  1031. package/menu/common/menu-action-common.js +1 -1
  1032. package/menu/menu/menu.component.js +1 -1
  1033. package/{menu-action-common-Wy36tk18.js → menu-action-common-_iII6n1T.js} +1 -1
  1034. package/{menu.component-DrrKSRmJ.js → menu.component-CqXIRQq2.js} +25 -21
  1035. package/menu.js +2 -2
  1036. package/menu.pure.js +2 -2
  1037. package/message/_message.global.scss +20 -0
  1038. package/message/message.component.js +1 -1
  1039. package/{message.component-CdfsCpnE.js → message.component-BpQ4ikV6.js} +1 -1
  1040. package/message.js +1 -1
  1041. package/message.pure.js +1 -1
  1042. package/{mini-button-group.component-BOJNsLrh.js → mini-button-group.component-C-pJ_J-1.js} +11 -11
  1043. package/mini-calendar/_mini-calendar.global.scss +15 -0
  1044. package/mini-calendar/mini-calendar/mini-calendar.component.js +1 -1
  1045. package/mini-calendar/mini-calendar-day/mini-calendar-day.component.js +1 -1
  1046. package/mini-calendar/mini-calendar-month/mini-calendar-month.component.js +1 -1
  1047. package/mini-calendar.js +3 -3
  1048. package/mini-calendar.pure.js +3 -3
  1049. package/navigation/_navigation.global.scss +78 -0
  1050. package/navigation/common/navigation-action-common.js +1 -1
  1051. package/navigation/navigation/navigation.component.js +1 -1
  1052. package/navigation/navigation-list/navigation-list.component.js +1 -1
  1053. package/navigation/navigation-marker/navigation-marker.component.js +1 -1
  1054. package/navigation/navigation-section/navigation-section.component.js +1 -1
  1055. package/navigation-action-common-DSPULZFe.js +38 -0
  1056. package/{navigation-list.component-NQZA2mui.js → navigation-list.component-Bkmh_wqm.js} +1 -4
  1057. package/{navigation-marker.component-D1p9TkWH.js → navigation-marker.component-CCXJWsN1.js} +2 -3
  1058. package/{navigation-section.component-Bmh4Xtrm.js → navigation-section.component-DPgBlCf8.js} +1 -4
  1059. package/{navigation.component-DLgmWh_c.js → navigation.component-CY_9Q6dT.js} +24 -23
  1060. package/navigation.js +5 -5
  1061. package/navigation.pure.js +5 -5
  1062. package/notification/_notification.global.scss +53 -0
  1063. package/notification/notification.component.js +1 -1
  1064. package/notification.component-IRuswhzC.js +188 -0
  1065. package/notification.js +1 -1
  1066. package/notification.pure.js +1 -1
  1067. package/off-brand-theme.css +860 -1092
  1068. package/{optgroup-base-element-C6KwbQ0N.js → optgroup-base-element-BbxwRc0x.js} +11 -16
  1069. package/option/_option.global.scss +80 -0
  1070. package/option/optgroup/optgroup-base-element.js +1 -1
  1071. package/option/optgroup/optgroup.component.js +1 -1
  1072. package/option/option/option-base-element.js +14 -15
  1073. package/option/option/option.component.js +1 -1
  1074. package/option/option-hint/option-hint.component.js +1 -1
  1075. package/option/option-styles.js +2 -0
  1076. package/option-hint.component-CUf2d2d5.js +26 -0
  1077. package/option-styles-BmvwR7PD.js +6 -0
  1078. package/option.component-9AlEwsE3.js +100 -0
  1079. package/option.js +7 -6
  1080. package/option.pure.js +6 -5
  1081. package/overlay/_overlay.global.scss +13 -0
  1082. package/overlay/overlay-base-element.js +25 -31
  1083. package/overlay/overlay.component.js +1 -1
  1084. package/{overlay.component-C80XN61v.js → overlay.component-BvoOK_O-.js} +7 -10
  1085. package/overlay.js +1 -1
  1086. package/overlay.pure.js +1 -1
  1087. package/package.json +14 -46
  1088. package/paginator/_paginator.global.scss +21 -0
  1089. package/paginator/common/paginator-common.js +2 -294
  1090. package/paginator/compact-paginator/compact-paginator.component.js +1 -1
  1091. package/paginator/paginator/paginator.component.js +1 -1
  1092. package/paginator-common-Xiv6UZlo.js +312 -0
  1093. package/paginator.component-buCkeyDv.js +212 -0
  1094. package/paginator.js +5 -5
  1095. package/paginator.pure.js +4 -4
  1096. package/{panel-mixin-CcbyRemy.js → panel-mixin-CG-f0J6K.js} +18 -19
  1097. package/popover/_popover.global.scss +12 -0
  1098. package/popover/popover/popover.component.js +2 -0
  1099. package/popover/popover-base/popover-base.js +2 -0
  1100. package/popover/popover-close-button/popover-close-button.component.js +20 -0
  1101. package/popover-base-DlSa-ajc.js +181 -0
  1102. package/popover.component-BHg4Qtqd.js +158 -0
  1103. package/popover.js +5 -4
  1104. package/popover.pure.js +4 -2
  1105. package/radio-button/_radio-button.global.scss +37 -0
  1106. package/radio-button/common/radio-button-common.js +1 -1
  1107. package/radio-button/radio-button.component.js +1 -1
  1108. package/{radio-button-common-BDGoskeZ.js → radio-button-common-OaxGvaS9.js} +15 -15
  1109. package/{radio-button.component-DedTTka_.js → radio-button.component-DznnXJCN.js} +14 -14
  1110. package/radio-button.js +2 -2
  1111. package/radio-button.pure.js +2 -2
  1112. package/safety-theme.css +860 -1092
  1113. package/select/_select.global.scss +24 -0
  1114. package/select/select.component.js +1 -1
  1115. package/{select.component-PLjAiAA3.js → select.component-Drb7KsP3.js} +63 -61
  1116. package/select.js +1 -1
  1117. package/select.pure.js +1 -1
  1118. package/selection-action-panel/_selection-action-panel.global.scss +19 -0
  1119. package/selection-action-panel/selection-action-panel.component.js +1 -1
  1120. package/selection-action-panel.js +1 -1
  1121. package/selection-action-panel.pure.js +1 -1
  1122. package/selection-expansion-panel/_selection-expansion-panel.global.scss +21 -0
  1123. package/selection-expansion-panel/selection-expansion-panel.component.js +1 -1
  1124. package/selection-expansion-panel.js +1 -1
  1125. package/selection-expansion-panel.pure.js +1 -1
  1126. package/{selection-group-base-element-BCEzcnya.js → selection-group-base-element-BcEQ5-ML.js} +18 -22
  1127. package/sidebar/_sidebar.global.scss +81 -0
  1128. package/sidebar/sidebar/sidebar.component.js +1 -1
  1129. package/sidebar/sidebar-close-button/sidebar-close-button.component.js +1 -1
  1130. package/sidebar/sidebar-container/sidebar-container.component.js +1 -1
  1131. package/sidebar/sidebar-content/sidebar-content.component.js +1 -1
  1132. package/sidebar/sidebar-title/sidebar-title.component.js +1 -1
  1133. package/sidebar.js +5 -5
  1134. package/sidebar.pure.js +5 -5
  1135. package/signet/_signet.global.scss +16 -0
  1136. package/signet/signet.component.js +1 -1
  1137. package/signet.js +1 -1
  1138. package/signet.pure.js +1 -1
  1139. package/skiplink-list/skiplink-list.component.js +1 -1
  1140. package/{skiplink-list.component-Dsg-qVWZ.js → skiplink-list.component-Cc6QNvVU.js} +18 -18
  1141. package/skiplink-list.js +1 -1
  1142. package/skiplink-list.pure.js +1 -1
  1143. package/slider/_slider.global.scss +30 -0
  1144. package/slider/slider.component.js +1 -1
  1145. package/{slider.component-DX8K9GWl.js → slider.component-pDx_g7eE.js} +24 -32
  1146. package/slider.js +1 -1
  1147. package/slider.pure.js +1 -1
  1148. package/standard-theme.css +860 -1092
  1149. package/status/_status.global.scss +10 -0
  1150. package/status/status.component.js +1 -1
  1151. package/status.js +1 -1
  1152. package/status.pure.js +1 -1
  1153. package/step-label.component-olqRA-s7.js +77 -0
  1154. package/{step.component-KiTfzfTj.js → step.component-CcjV_283.js} +29 -10
  1155. package/stepper/_stepper.global.scss +47 -0
  1156. package/stepper/step/step.component.js +2 -2
  1157. package/stepper/step-label/step-label.component.js +1 -1
  1158. package/stepper/stepper/stepper.component.js +1 -1
  1159. package/{stepper.component-BX3gSLpt.js → stepper.component-CqClDxL6.js} +41 -24
  1160. package/stepper.js +5 -5
  1161. package/stepper.pure.js +4 -4
  1162. package/{sticky-bar.component-CmB6U3iY.js → sticky-bar.component-DBSVB1lE.js} +13 -13
  1163. package/styles-BwvY_TyZ.js +5 -0
  1164. package/{tab-group.component-BGDY-hvA.js → tab-group.component-Dx0xldWI.js} +45 -20
  1165. package/tab-label.component-C5HCrNFB.js +158 -0
  1166. package/{tab-nav-bar.component-Cwrqhb-2.js → tab-nav-bar.component-7j-RCq7p.js} +13 -13
  1167. package/table/_table.global.scss +295 -0
  1168. package/table/table-wrapper/table-wrapper.component.js +1 -1
  1169. package/table.js +1 -1
  1170. package/table.pure.js +1 -1
  1171. package/tabs/_tabs.global.scss +61 -0
  1172. package/tabs/common/styles.js +1 -1
  1173. package/tabs/tab/tab.component.js +1 -1
  1174. package/tabs/tab-group/tab-group.component.js +2 -2
  1175. package/tabs/tab-label/tab-label.component.js +1 -1
  1176. package/tabs/tab-nav-bar/tab-nav-bar.component.js +1 -1
  1177. package/tabs.js +7 -7
  1178. package/tabs.pure.js +6 -6
  1179. package/tag/_tag.global.scss +41 -0
  1180. package/tag/tag/tag.component.js +1 -1
  1181. package/tag/tag-group/tag-group.component.js +1 -1
  1182. package/{tag-group.component-DyXEgvbN.js → tag-group.component-CJwbkP70.js} +29 -14
  1183. package/{tag.component-C74wsPOB.js → tag.component-r8diGGP-.js} +39 -28
  1184. package/tag.js +2 -2
  1185. package/tag.pure.js +2 -2
  1186. package/teaser/_teaser.global.scss +51 -0
  1187. package/teaser/teaser.component.js +1 -1
  1188. package/teaser-hero/_teaser-hero.global.scss +29 -0
  1189. package/teaser-hero/teaser-hero.component.js +1 -1
  1190. package/teaser-hero.js +1 -1
  1191. package/teaser-hero.pure.js +1 -1
  1192. package/teaser-panel/_teaser-panel.global.scss +33 -0
  1193. package/teaser-panel/teaser-panel.component.js +1 -1
  1194. package/teaser-panel.js +1 -1
  1195. package/teaser-panel.pure.js +1 -1
  1196. package/teaser-product/_teaser-product.global.scss +52 -0
  1197. package/teaser-product/common/teaser-product-common.js +1 -1
  1198. package/teaser-product/teaser-product/teaser-product.component.js +1 -1
  1199. package/{teaser-product.component-Dzclz3Sg.js → teaser-product.component-DHu47PGd.js} +8 -8
  1200. package/teaser-product.js +2 -2
  1201. package/teaser-product.pure.js +2 -2
  1202. package/{teaser.component-BSpcEI3Z.js → teaser.component-CkIii0_d.js} +15 -15
  1203. package/teaser.js +1 -1
  1204. package/teaser.pure.js +1 -1
  1205. package/time-input/_time-input.global.scss +11 -0
  1206. package/time-input/time-input.component.js +1 -1
  1207. package/{time-input.component-BRJerke6.js → time-input.component-j2vUlNKx.js} +15 -8
  1208. package/time-input.js +1 -1
  1209. package/time-input.pure.js +1 -1
  1210. package/timetable-form/_timetable-form.global.scss +107 -0
  1211. package/timetable-form/timetable-form/timetable-form.component.js +1 -1
  1212. package/timetable-form/timetable-form-details/timetable-form-details.component.js +1 -1
  1213. package/timetable-form/timetable-form-field/timetable-form-field.component.js +1 -1
  1214. package/timetable-form/timetable-form-swap-button/timetable-form-swap-button.component.js +1 -1
  1215. package/timetable-form.js +4 -4
  1216. package/timetable-form.pure.js +4 -4
  1217. package/timetable-occupancy/_timetable-occupancy.global.scss +10 -0
  1218. package/timetable-occupancy/timetable-occupancy.component.js +1 -1
  1219. package/timetable-occupancy-icon/timetable-occupancy-icon.component.js +1 -1
  1220. package/timetable-occupancy-icon.js +1 -1
  1221. package/timetable-occupancy-icon.pure.js +1 -1
  1222. package/{timetable-occupancy.component-B0OJi-B1.js → timetable-occupancy.component-B040dznI.js} +17 -13
  1223. package/timetable-occupancy.js +1 -1
  1224. package/timetable-occupancy.pure.js +1 -1
  1225. package/title/_title.global.scss +16 -0
  1226. package/title/title-base.js +1 -1
  1227. package/title/title.component.js +1 -1
  1228. package/{title-base-B70qaksx.js → title-base-DWrwrsx4.js} +1 -1
  1229. package/{title.component-DO67K8g1.js → title.component-BZ0nVpam.js} +2 -2
  1230. package/title.js +2 -2
  1231. package/title.pure.js +2 -2
  1232. package/toast/_toast.global.scss +18 -0
  1233. package/toast/toast.component.js +1 -1
  1234. package/{toast.component-DVaz-D5o.js → toast.component-Dlr0Koxu.js} +6 -7
  1235. package/toast.js +1 -1
  1236. package/toast.pure.js +1 -1
  1237. package/toggle/_toggle.global.scss +48 -0
  1238. package/toggle/toggle/toggle.component.js +1 -1
  1239. package/toggle/toggle-option/toggle-option.component.js +1 -1
  1240. package/toggle-check/_toggle-check.global.scss +32 -0
  1241. package/toggle-check/toggle-check.component.js +1 -1
  1242. package/{toggle-check.component-YWr3IHEL.js → toggle-check.component-BNGDAvXJ.js} +17 -17
  1243. package/toggle-check.js +1 -1
  1244. package/toggle-check.pure.js +1 -1
  1245. package/{toggle.component-BFsrJ98d.js → toggle.component-Cz3OnOMI.js} +13 -13
  1246. package/toggle.js +2 -2
  1247. package/toggle.pure.js +2 -2
  1248. package/tooltip/_tooltip.global.scss +20 -0
  1249. package/tooltip/tooltip.component.js +1 -1
  1250. package/{tooltip.component-BrXCWlQB.js → tooltip.component-BLzyft0C.js} +25 -25
  1251. package/tooltip.js +1 -1
  1252. package/tooltip.pure.js +1 -1
  1253. package/train/_train.global.scss +66 -0
  1254. package/train/train/train.component.js +1 -1
  1255. package/train/train-blocked-passage/train-blocked-passage.component.js +1 -1
  1256. package/train/train-formation/train-formation.component.js +1 -1
  1257. package/train/train-wagon-common.js +1 -1
  1258. package/{train-formation.component-HM0M0FHW.js → train-formation.component-Di5d_G5x.js} +1 -1
  1259. package/{train-wagon-common-BH9bSebN.js → train-wagon-common-HuRuHdNZ.js} +1 -1
  1260. package/{train.component-BZ3jtqQ4.js → train.component-Dwp6ltDo.js} +1 -1
  1261. package/train.js +4 -4
  1262. package/train.pure.js +4 -4
  1263. package/visual-checkbox/_visual-checkbox.global.scss +38 -0
  1264. package/visual-checkbox/visual-checkbox.component.js +1 -1
  1265. package/{visual-checkbox.component-R9bYxeNp.js → visual-checkbox.component-CPIhZcmN.js} +17 -17
  1266. package/visual-checkbox.js +1 -1
  1267. package/visual-checkbox.pure.js +1 -1
  1268. package/a11y.css +0 -20
  1269. package/action-group.component-BMYAFyHh.js +0 -156
  1270. package/animation.css +0 -14
  1271. package/badge.css +0 -32
  1272. package/calendar-cell-base-element-CUG1qYFb.js +0 -23
  1273. package/calendar.component-oS_T4s4k.js +0 -1065
  1274. package/core/decorators/host-attributes.js +0 -17
  1275. package/core/dom/lean-context.js +0 -7
  1276. package/core/eventing/composed-path-has-attribute.js +0 -7
  1277. package/core/eventing/throttle.js +0 -11
  1278. package/core/overlay/overlay.js +0 -14
  1279. package/core/styles/badge.scss +0 -3
  1280. package/core/styles/core.scss +0 -645
  1281. package/core/styles/layout.scss +0 -20
  1282. package/core/styles/mixins/buttons.scss +0 -12
  1283. package/core/styles/mixins/dev_and_debug.scss +0 -8
  1284. package/core/styles/mixins/image.scss +0 -43
  1285. package/core/styles/mixins/inputs.scss +0 -11
  1286. package/core/styles/mixins/overlay.scss +0 -175
  1287. package/core/styles/mixins/panel.scss +0 -80
  1288. package/core/styles/mixins/popover.scss +0 -14
  1289. package/core/styles/mixins/table.scss +0 -185
  1290. package/core/styles/mixins/timetable-form.scss +0 -63
  1291. package/core/styles/mixins/typo.scss +0 -237
  1292. package/core/styles/theme.scss +0 -20
  1293. package/core/styles/timetable-form.scss +0 -27
  1294. package/core/styles/typography.private.scss +0 -9
  1295. package/development/accordion.component-Bvx-b38W.js +0 -165
  1296. package/development/action-group.component-DZkXqIbQ.js +0 -213
  1297. package/development/alert-group.component-w5PbU_4C.js +0 -186
  1298. package/development/autocomplete-base-element-CG5m0PpY.js +0 -686
  1299. package/development/block-link-common-CoZgcEBY.js +0 -101
  1300. package/development/breadcrumb-group.component-BUBfl6LV.js +0 -193
  1301. package/development/breadcrumb.component-D6Cd2FPo.js +0 -34
  1302. package/development/calendar-cell-base-element-mWRSDeWc.js +0 -38
  1303. package/development/calendar-day.component-BHvdRxll.js +0 -139
  1304. package/development/calendar.component-CjlcDyS5.js +0 -1450
  1305. package/development/carousel-list.component-DpDh5tqB.js +0 -133
  1306. package/development/carousel.component-ClWvnZ8s.js +0 -139
  1307. package/development/chip-group.component-DThvmmnh.js +0 -402
  1308. package/development/clock.component-DcM1WFTN.js +0 -289
  1309. package/development/compact-paginator.component-Dyj5CulS.js +0 -51
  1310. package/development/core/decorators/host-attributes.d.ts +0 -22
  1311. package/development/core/decorators/host-attributes.d.ts.map +0 -1
  1312. package/development/core/decorators/host-attributes.js +0 -41
  1313. package/development/core/dom/lean-context.d.ts +0 -5
  1314. package/development/core/dom/lean-context.d.ts.map +0 -1
  1315. package/development/core/dom/lean-context.js +0 -12
  1316. package/development/core/eventing/composed-path-has-attribute.d.ts +0 -10
  1317. package/development/core/eventing/composed-path-has-attribute.d.ts.map +0 -1
  1318. package/development/core/eventing/composed-path-has-attribute.js +0 -19
  1319. package/development/core/eventing/throttle.d.ts +0 -3
  1320. package/development/core/eventing/throttle.d.ts.map +0 -1
  1321. package/development/core/eventing/throttle.js +0 -18
  1322. package/development/core/interfaces/overlay-close-details.d.ts +0 -6
  1323. package/development/core/interfaces/overlay-close-details.d.ts.map +0 -1
  1324. package/development/core/overlay/overlay.d.ts +0 -7
  1325. package/development/core/overlay/overlay.d.ts.map +0 -1
  1326. package/development/core/overlay/overlay.js +0 -20
  1327. package/development/date-input.component-HxRyCudr.js +0 -302
  1328. package/development/dialog-title.component-0uNsUR2C.js +0 -29
  1329. package/development/error.component-WCkiwM7_.js +0 -53
  1330. package/development/expansion-panel-header.component-CQFSwrqu.js +0 -82
  1331. package/development/expansion-panel.component-BVdylpqi.js +0 -318
  1332. package/development/file-selector-common-Da0KNfDP.js +0 -413
  1333. package/development/file-selector-dropzone.component-Bdcau18t.js +0 -106
  1334. package/development/flip-card.component-DujrPKzU.js +0 -185
  1335. package/development/form-field.component-_lnIpJF5.js +0 -703
  1336. package/development/header-action-common-CQ1CaaBd.js +0 -79
  1337. package/development/header.component-BX1rKPa_.js +0 -335
  1338. package/development/icon-base-DrBHy9BT.js +0 -163
  1339. package/development/inline-link-common-gmt6yz3v.js +0 -18
  1340. package/development/journey-header.component-CA4juz9x.js +0 -146
  1341. package/development/link-common-2RGn9Qz_.js +0 -26
  1342. package/development/link-list.component-CKVU3Gsr.js +0 -97
  1343. package/development/map-container.component-D0UVTolK.js +0 -176
  1344. package/development/menu-action-common-DRXQc85Y.js +0 -32
  1345. package/development/menu.component-Cv9wRj4H.js +0 -365
  1346. package/development/mini-button-group.component-Bg-etiu1.js +0 -116
  1347. package/development/mini-button-link.component-kpRsi8I2.js +0 -39
  1348. package/development/mini-calendar.component-BOk8JovO.js +0 -184
  1349. package/development/navigation-action-common-CGy4K8q-.js +0 -91
  1350. package/development/navigation-list.component-DrdbtDRs.js +0 -90
  1351. package/development/navigation-marker.component-fB05cjtE.js +0 -121
  1352. package/development/navigation-section.component-iaypc6yQ.js +0 -346
  1353. package/development/navigation.component-CqNkBvEs.js +0 -315
  1354. package/development/notification.component-D0rkSF3p.js +0 -271
  1355. package/development/optgroup-base-element-BEG1P4gK.js +0 -140
  1356. package/development/option-hint.component-CcSUSwjN.js +0 -31
  1357. package/development/option.component-BEbIEh5o.js +0 -132
  1358. package/development/paginator.component-DIuiY7It.js +0 -261
  1359. package/development/popover/popover.component.d.ts +0 -111
  1360. package/development/popover/popover.component.d.ts.map +0 -1
  1361. package/development/popover/popover.component.js +0 -2
  1362. package/development/popover.component-Bvbf4NyI.js +0 -564
  1363. package/development/radio-button-common-tC_l-WdB.js +0 -129
  1364. package/development/select.component-B8_tnz6D.js +0 -806
  1365. package/development/selection-expansion-panel.component-CTCVJiug.js +0 -186
  1366. package/development/selection-group-base-element-RafKyWXP.js +0 -154
  1367. package/development/sidebar-container.component-C_cu3Vfy.js +0 -100
  1368. package/development/skiplink-list.component-ppyytKn2.js +0 -129
  1369. package/development/slider.component-k8g6G0j9.js +0 -346
  1370. package/development/step-label.component-BpuNDWKl.js +0 -126
  1371. package/development/step.component-Di2fT-VG.js +0 -146
  1372. package/development/stepper.component-BnCUoYv6.js +0 -423
  1373. package/development/sticky-bar.component-BrSBKlh-.js +0 -203
  1374. package/development/styles-BzEbxmCd.js +0 -18
  1375. package/development/tab-group.component-o1F-M_-2.js +0 -266
  1376. package/development/tab-label.component-CPaKKeox.js +0 -235
  1377. package/development/tab-nav-bar.component-3uXgOman.js +0 -110
  1378. package/development/tag-group.component-CYL62Umh.js +0 -196
  1379. package/development/tag.component-D5DYXQ3i.js +0 -241
  1380. package/development/teaser-product.component-gHjSaG6c.js +0 -37
  1381. package/development/teaser.component-B8kQNF6g.js +0 -116
  1382. package/development/time-input.component-Bc4Sfu-1.js +0 -187
  1383. package/development/timetable-occupancy-icon.component-uaabLEC5.js +0 -95
  1384. package/development/timetable-occupancy.component-DKWki5pG.js +0 -122
  1385. package/development/title-base-fg03gSOD.js +0 -102
  1386. package/development/title.component-B1Uq-Ctr.js +0 -71
  1387. package/development/toggle.component-DndGyA1x.js +0 -244
  1388. package/development/tooltip.component-BjOgv29e.js +0 -369
  1389. package/development/train-wagon-common-C-0fI1r2.js +0 -441
  1390. package/development/train.component-BDG8SlCc.js +0 -239
  1391. package/expansion-panel.component-5heRRQ0C.js +0 -222
  1392. package/form-field.component-Dg-a3lS5.js +0 -475
  1393. package/header-action-common-B1jGzY-U.js +0 -61
  1394. package/inline-link-common-BqqH1ExY.js +0 -13
  1395. package/layout.css +0 -30
  1396. package/lists.css +0 -194
  1397. package/navigation-action-common-HG5kdQJR.js +0 -65
  1398. package/normalize.css +0 -95
  1399. package/notification.component-DpC6ulTx.js +0 -195
  1400. package/option-hint.component-Bayihbh1.js +0 -21
  1401. package/option.component-C-GGTcqF.js +0 -100
  1402. package/paginator.component-3ra04AQU.js +0 -208
  1403. package/popover/popover.component.js +0 -2
  1404. package/popover.component-C66BxhNQ.js +0 -373
  1405. package/scrollbar.css +0 -124
  1406. package/step-label.component-BkiOyF7s.js +0 -77
  1407. package/styles-OHFAsnJq.js +0 -5
  1408. package/tab-label.component-CMbmEoNe.js +0 -157
  1409. package/table.css +0 -270
  1410. package/timetable-form.css +0 -73
  1411. package/typography.css +0 -67
  1412. /package/{alert-group.component-BqJ6B49z.js → alert-group.component-Ck1kYZb4.js} +0 -0
  1413. /package/{breadcrumb.component-Kk1U6Iju.js → breadcrumb.component-CC8MxtJj.js} +0 -0
  1414. /package/{card-action-common-BNdGcJl-.js → card-action-common-DRSSDHqY.js} +0 -0
  1415. /package/{card-badge.component-BLAK_y8x.js → card-badge.component-B-uJVrxT.js} +0 -0
  1416. /package/{card.component-WUQRK9jT.js → card.component-Bwuv9ur1.js} +0 -0
  1417. /package/{chip-label.component-BLbhqUAp.js → chip-label.component-DVUxt7Sk.js} +0 -0
  1418. /package/{chip.component-gcvF3pEX.js → chip.component-SLuNizyV.js} +0 -0
  1419. /package/{clock.component-Cqrl999I.js → clock.component-gnEqkZ4T.js} +0 -0
  1420. /package/{container.component-sQtiqWxT.js → container.component-DJgFIJ0b.js} +0 -0
  1421. /package/core/styles/{disable-animation.scss → disable-animation-extension.scss} +0 -0
  1422. /package/core/styles/{core → features}/node_modules_@sbb-esta_lyne-design-tokens_dist_scss_sbb-variables.scss +0 -0
  1423. /package/core/styles/{normalize.scss → features/normalize.scss} +0 -0
  1424. /package/core/styles/{scrollbar.private.scss → features/scrollbar.private.scss} +0 -0
  1425. /package/core/styles/mixins/{animation.scss → _animation.scss} +0 -0
  1426. /package/core/styles/mixins/{font-face.scss → _font-face.scss} +0 -0
  1427. /package/core/styles/{core/mediaqueries.scss → mixins/_mediaqueries.scss} +0 -0
  1428. /package/core/styles/{node_modules_@sbb-esta_lyne-design-tokens_dist_scss_sbb-variables.scss → mixins/node_modules_@sbb-esta_lyne-design-tokens_dist_scss_sbb-variables.scss} +0 -0
  1429. /package/{dialog-actions.component-DxmjSvd-.js → dialog-actions.component-CHFJ8HjT.js} +0 -0
  1430. /package/{dialog-close-button.component-B8troaaQ.js → dialog-close-button.component-CV55ej8Q.js} +0 -0
  1431. /package/{dialog-content.component-Chfg-IY1.js → dialog-content.component-D7SeDETW.js} +0 -0
  1432. /package/{dialog-title.component-BbcbQXjp.js → dialog-title.component-DP7l1zQE.js} +0 -0
  1433. /package/{disable-animation.css → disable-animation-extension.css} +0 -0
  1434. /package/{divider.component-WsZcNUnN.js → divider.component-wL7Cw3YB.js} +0 -0
  1435. /package/{element-C7t5_1gu.js → element-CvshSA3k.js} +0 -0
  1436. /package/{error.component-D9Tu2YIl.js → error.component-D0rmgyFk.js} +0 -0
  1437. /package/{flip-card-details.component-BgOeJ53R.js → flip-card-details.component-D4C0Fde7.js} +0 -0
  1438. /package/{footer.component-DsIoOLu-.js → footer.component-x4yuXpWV.js} +0 -0
  1439. /package/{header-environment.component-B0VYZh7C.js → header-environment.component-Diy44YpD.js} +0 -0
  1440. /package/{hint.component-DTKfI9tq.js → hint.component-BZZJXuHG.js} +0 -0
  1441. /package/{icon-sidebar-container.component-CDBkiGlz.js → icon-sidebar-container.component-CYVyqKnZ.js} +0 -0
  1442. /package/{icon-sidebar-content.component-CN4Que2a.js → icon-sidebar-content.component-C5ZspZQk.js} +0 -0
  1443. /package/{icon-sidebar.component-DA2cmcyy.js → icon-sidebar.component-BkqYbGHz.js} +0 -0
  1444. /package/{journey-header.component-CXyULeHJ.js → journey-header.component-Ct9LmhWY.js} +0 -0
  1445. /package/{lead-container.component-CdfHJFFN.js → lead-container.component-Fv9F5Yh4.js} +0 -0
  1446. /package/{link-common-ezSu7e9c.js → link-common-C4Jbge1L.js} +0 -0
  1447. /package/{loading-indicator-circle.component-CSU2Ludy.js → loading-indicator-circle.component-BSdKx0eK.js} +0 -0
  1448. /package/{loading-indicator.component-DxyhIaFo.js → loading-indicator.component-B2cGE1Mj.js} +0 -0
  1449. /package/{logo.component-DVMNS8Op.js → logo.component-BOxQbVu9.js} +0 -0
  1450. /package/{mini-button-link.component-B8HmvVCg.js → mini-button-link.component-MBesHG--.js} +0 -0
  1451. /package/{mini-calendar-day.component-CVYqN3Yn.js → mini-calendar-day.component-UvIp06lc.js} +0 -0
  1452. /package/{mini-calendar-month.component-DbiqMOH8.js → mini-calendar-month.component-BZV7QSlC.js} +0 -0
  1453. /package/{mini-calendar.component-BKzbqHim.js → mini-calendar.component-B6EGO9bp.js} +0 -0
  1454. /package/{sbb-tokens-BBic3kP6.js → sbb-tokens-C-MoUcho.js} +0 -0
  1455. /package/{selection-action-panel.component-B7OtT_t2.js → selection-action-panel.component-m13MKp44.js} +0 -0
  1456. /package/{selection-expansion-panel.component-NXfxG9uN.js → selection-expansion-panel.component-BMI-n5Xc.js} +0 -0
  1457. /package/{sidebar-close-button.component-D5gxiJ_e.js → sidebar-close-button.component-BoOFzuBn.js} +0 -0
  1458. /package/{sidebar-container.component-BI2Jm-cJ.js → sidebar-container.component-BFm6HnIu.js} +0 -0
  1459. /package/{sidebar-content.component-C44ixSgf.js → sidebar-content.component-DFLqVK-O.js} +0 -0
  1460. /package/{sidebar-title.component-ByroIWTZ.js → sidebar-title.component-4B18yGLO.js} +0 -0
  1461. /package/{sidebar.component-B2IfBEhW.js → sidebar.component-VL6TFd9H.js} +0 -0
  1462. /package/{signet.component-xkCj9Bel.js → signet.component-DoXHpxDU.js} +0 -0
  1463. /package/{status.component-BkBUOZC5.js → status.component-Cg671ic2.js} +0 -0
  1464. /package/{styles-BNu0Fjw5.js → styles-DGAxTLMz.js} +0 -0
  1465. /package/{tab.component-BtN993ye.js → tab.component-C5xxMwwX.js} +0 -0
  1466. /package/{table-wrapper.component-CQ76PAQl.js → table-wrapper.component-BzmzJJim.js} +0 -0
  1467. /package/{teaser-hero.component-mT8miROU.js → teaser-hero.component-BNV8sgb6.js} +0 -0
  1468. /package/{teaser-panel.component-DWdMzyoI.js → teaser-panel.component-Bfhra0zG.js} +0 -0
  1469. /package/{teaser-product-common-DOQ6f2B7.js → teaser-product-common-D7kWWxU-.js} +0 -0
  1470. /package/{timetable-form-details.component-Wmad9usT.js → timetable-form-details.component-BTRh4w9g.js} +0 -0
  1471. /package/{timetable-form-field.component-D3P3lV86.js → timetable-form-field.component-BPKgSLQb.js} +0 -0
  1472. /package/{timetable-form-swap-button.component-B8yPDfMq.js → timetable-form-swap-button.component-DgUiFKbA.js} +0 -0
  1473. /package/{timetable-form.component-CJKyHMZk.js → timetable-form.component-Crq-rb5Z.js} +0 -0
  1474. /package/{timetable-occupancy-icon.component-DA9NTQJn.js → timetable-occupancy-icon.component-9RhBPwBN.js} +0 -0
  1475. /package/{toggle-option.component-BP9QEwh9.js → toggle-option.component-UXno4hFd.js} +0 -0
  1476. /package/{train-blocked-passage.component-DxqSh9I8.js → train-blocked-passage.component-Bk_YvTRh.js} +0 -0
@@ -0,0 +1,1399 @@
1
+ import { __esDecorate, __runInitializers } from "tslib";
2
+ import { html, isServer, nothing, unsafeCSS } from "lit";
3
+ import { property, state } from "lit/decorators.js";
4
+ import { MONDAY, SbbElement, SbbFormAssociatedMixin, SbbLanguageController, THURSDAY, TUESDAY, WEDNESDAY, buttonResetStyles, defaultDateAdapter, forceType, handleDistinctChange, i18nCalendarDateSelection, i18nCalendarWeekNumber, i18nNextMonth, i18nNextYear, i18nNextYearRange, i18nPreviousMonth, i18nPreviousYear, i18nPreviousYearRange, i18nYearMonthSelection, isArrowKeyOrPageKeysPressed, plainDate, readConfig, screenReaderOnlyStyles } from "./core.js";
5
+ import { SbbSecondaryButtonElement } from "./button.pure.js";
6
+ import { SbbIconElement } from "./icon.pure.js";
7
+ import { SbbCalendarDayElement } from "./calendar/calendar-day/calendar-day.component.js";
8
+ import { SbbCalendarMonthElement } from "./calendar/calendar-month/calendar-month.component.js";
9
+ import { SbbCalendarWeekdayElement } from "./calendar/calendar-weekday/calendar-weekday.component.js";
10
+ import { SbbCalendarWeeknumberElement } from "./calendar/calendar-weeknumber/calendar-weeknumber.component.js";
11
+ import { SbbCalendarYearElement } from "./calendar/calendar-year/calendar-year.component.js";
12
+ //#region src/elements/calendar/calendar/calendar.scss?inline
13
+ var calendar_default = ":host {\n display: block;\n width: max-content;\n max-width: 100%;\n line-height: var(--sbb-typo-line-height-text);\n}\n\n:host(:is(:state(enhanced),[state--enhanced])) {\n --sbb-calendar-cell-padding-block-end: var(--sbb-spacing-fixed-3x);\n}\n\n.sbb-calendar__wrapper {\n width: 100%;\n display: flex;\n flex-wrap: wrap;\n gap: var(--sbb-calendar-tables-gap);\n position: relative;\n}\n\n:is(.sbb-calendar__year-view, .sbb-calendar__month-view) {\n position: absolute;\n inset-block-start: 0;\n inset-inline-start: 0;\n}\n\n:host(:not(:is(:state(view-day),[state--view-day]))) .sbb-calendar__day-view {\n visibility: hidden;\n}\n\n.sbb-calendar__table-header {\n display: flex;\n align-items: center;\n gap: var(--sbb-calendar-control-gap);\n height: var(--sbb-size-element-xs);\n margin-block-end: var(--sbb-spacing-fixed-4x);\n}\n\n.sbb-calendar__table-header span {\n flex: 1 1 auto;\n padding-inline-start: var(--sbb-spacing-fixed-3x);\n color: var(--sbb-calendar-control-view-change-color);\n}\n\n.sbb-calendar__control {\n -webkit-tap-highlight-color: transparent;\n}\n\n.sbb-calendar__table {\n width: 100%;\n border-collapse: collapse;\n height: max-content;\n flex: 0 0;\n}\n\n.sbb-calendar__table :is(thead, tbody) {\n text-align: center;\n}\n\n.sbb-calendar__table-header-cell,\n.sbb-calendar__table-header-cell-vertical {\n width: var(--sbb-calendar-cell-size);\n min-width: var(--sbb-calendar-cell-size);\n color: var(--sbb-calendar-header-color);\n padding: 0;\n font-size: var(--sbb-text-font-size-xs);\n font-weight: normal;\n letter-spacing: var(--sbb-typo-letter-spacing-text);\n}\n:host(:not([multiple])) .sbb-calendar__table-header-cell,\n:host(:not([multiple])) .sbb-calendar__table-header-cell-vertical {\n height: var(--sbb-calendar-cell-size);\n}\n\n.sbb-calendar__table-header-cell-vertical {\n padding-block-end: var(--sbb-calendar-cell-padding-block-end);\n}\n\n.sbb-calendar__table-data {\n position: relative;\n padding: 0;\n text-align: center;\n}\n\n.sbb-calendar__day-cell {\n padding-block-end: var(--sbb-calendar-cell-padding-block-end);\n}\n\n:host(:not(:is(:state(enhanced),[state--enhanced]))) sbb-calendar-day {\n --sbb-calendar-day-justify-content: center;\n --sbb-calendar-day-height: var(--sbb-calendar-day-size);\n --sbb-calendar-day-extra-display: none;\n --sbb-calendar-day-value-height: unset;\n}";
14
+ //#endregion
15
+ //#region src/elements/calendar/calendar/calendar.component.ts
16
+ var DAYS_PER_ROW = 7;
17
+ var MONTHS_PER_ROW = 4;
18
+ var YEARS_PER_ROW = 4;
19
+ var MONTHS_PER_PAGE = 12;
20
+ var YEARS_PER_PAGE = 24;
21
+ var SbbMonthChangeEvent = class extends Event {
22
+ get range() {
23
+ return this._range;
24
+ }
25
+ constructor(range) {
26
+ super("monthchange", {
27
+ bubbles: true,
28
+ composed: true
29
+ });
30
+ this._range = Object.freeze(range || []);
31
+ }
32
+ };
33
+ var SbbDateSelectedEvent = class extends Event {
34
+ get dateSelected() {
35
+ return this._dateSelected;
36
+ }
37
+ constructor(dates) {
38
+ super("dateselected", {
39
+ bubbles: true,
40
+ composed: true
41
+ });
42
+ this._dateSelected = Object.freeze(dates);
43
+ }
44
+ };
45
+ /**
46
+ * It displays a calendar which allows choosing a date.
47
+ *
48
+ * @slot - Use the unnamed slot to add customized `sbb-calendar-day` elements.
49
+ */
50
+ var SbbCalendarElement = (() => {
51
+ let _classSuper = SbbFormAssociatedMixin(SbbElement);
52
+ let _instanceExtraInitializers = [];
53
+ let _amount_decorators;
54
+ let _amount_initializers = [];
55
+ let _amount_extraInitializers = [];
56
+ let _view_decorators;
57
+ let _view_initializers = [];
58
+ let _view_extraInitializers = [];
59
+ let _min_decorators;
60
+ let _min_initializers = [];
61
+ let _min_extraInitializers = [];
62
+ let _max_decorators;
63
+ let _max_initializers = [];
64
+ let _max_extraInitializers = [];
65
+ let _multiple_decorators;
66
+ let _multiple_initializers = [];
67
+ let _multiple_extraInitializers = [];
68
+ let _set_value_decorators;
69
+ let __value_decorators;
70
+ let __value_initializers = [];
71
+ let __value_extraInitializers = [];
72
+ let _dateFilter_decorators;
73
+ let _dateFilter_initializers = [];
74
+ let _dateFilter_extraInitializers = [];
75
+ let _set_fixedMonth_decorators;
76
+ let _orientation_decorators;
77
+ let _orientation_initializers = [];
78
+ let _orientation_extraInitializers = [];
79
+ let _weekNumbers_decorators;
80
+ let _weekNumbers_initializers = [];
81
+ let _weekNumbers_extraInitializers = [];
82
+ let __activeDate_decorators;
83
+ let __activeDate_initializers = [];
84
+ let __activeDate_extraInitializers = [];
85
+ let __calendarView_decorators;
86
+ let __calendarView_initializers = [];
87
+ let __calendarView_extraInitializers = [];
88
+ let __initialized_decorators;
89
+ let __initialized_initializers = [];
90
+ let __initialized_extraInitializers = [];
91
+ return class SbbCalendarElement extends _classSuper {
92
+ static {
93
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
94
+ _amount_decorators = [forceType(), property({ type: Number })];
95
+ _view_decorators = [property()];
96
+ _min_decorators = [plainDate(), property()];
97
+ _max_decorators = [plainDate(), property()];
98
+ _multiple_decorators = [
99
+ forceType(),
100
+ handleDistinctChange((e, newValue) => e._onMultipleChanged(newValue)),
101
+ property({ type: Boolean })
102
+ ];
103
+ _set_value_decorators = [property()];
104
+ __value_decorators = [state()];
105
+ _dateFilter_decorators = [property({ attribute: "date-filter" })];
106
+ _set_fixedMonth_decorators = [forceType(), property({ attribute: "fixed-month" })];
107
+ _orientation_decorators = [property({ reflect: true })];
108
+ _weekNumbers_decorators = [forceType(), property({
109
+ attribute: "week-numbers",
110
+ type: Boolean
111
+ })];
112
+ __activeDate_decorators = [state()];
113
+ __calendarView_decorators = [state()];
114
+ __initialized_decorators = [state()];
115
+ __esDecorate(this, null, _amount_decorators, {
116
+ kind: "accessor",
117
+ name: "amount",
118
+ static: false,
119
+ private: false,
120
+ access: {
121
+ has: (obj) => "amount" in obj,
122
+ get: (obj) => obj.amount,
123
+ set: (obj, value) => {
124
+ obj.amount = value;
125
+ }
126
+ },
127
+ metadata: _metadata
128
+ }, _amount_initializers, _amount_extraInitializers);
129
+ __esDecorate(this, null, _view_decorators, {
130
+ kind: "accessor",
131
+ name: "view",
132
+ static: false,
133
+ private: false,
134
+ access: {
135
+ has: (obj) => "view" in obj,
136
+ get: (obj) => obj.view,
137
+ set: (obj, value) => {
138
+ obj.view = value;
139
+ }
140
+ },
141
+ metadata: _metadata
142
+ }, _view_initializers, _view_extraInitializers);
143
+ __esDecorate(this, null, _min_decorators, {
144
+ kind: "accessor",
145
+ name: "min",
146
+ static: false,
147
+ private: false,
148
+ access: {
149
+ has: (obj) => "min" in obj,
150
+ get: (obj) => obj.min,
151
+ set: (obj, value) => {
152
+ obj.min = value;
153
+ }
154
+ },
155
+ metadata: _metadata
156
+ }, _min_initializers, _min_extraInitializers);
157
+ __esDecorate(this, null, _max_decorators, {
158
+ kind: "accessor",
159
+ name: "max",
160
+ static: false,
161
+ private: false,
162
+ access: {
163
+ has: (obj) => "max" in obj,
164
+ get: (obj) => obj.max,
165
+ set: (obj, value) => {
166
+ obj.max = value;
167
+ }
168
+ },
169
+ metadata: _metadata
170
+ }, _max_initializers, _max_extraInitializers);
171
+ __esDecorate(this, null, _multiple_decorators, {
172
+ kind: "accessor",
173
+ name: "multiple",
174
+ static: false,
175
+ private: false,
176
+ access: {
177
+ has: (obj) => "multiple" in obj,
178
+ get: (obj) => obj.multiple,
179
+ set: (obj, value) => {
180
+ obj.multiple = value;
181
+ }
182
+ },
183
+ metadata: _metadata
184
+ }, _multiple_initializers, _multiple_extraInitializers);
185
+ __esDecorate(this, null, _set_value_decorators, {
186
+ kind: "setter",
187
+ name: "value",
188
+ static: false,
189
+ private: false,
190
+ access: {
191
+ has: (obj) => "value" in obj,
192
+ set: (obj, value) => {
193
+ obj.value = value;
194
+ }
195
+ },
196
+ metadata: _metadata
197
+ }, null, _instanceExtraInitializers);
198
+ __esDecorate(this, null, __value_decorators, {
199
+ kind: "accessor",
200
+ name: "_value",
201
+ static: false,
202
+ private: false,
203
+ access: {
204
+ has: (obj) => "_value" in obj,
205
+ get: (obj) => obj._value,
206
+ set: (obj, value) => {
207
+ obj._value = value;
208
+ }
209
+ },
210
+ metadata: _metadata
211
+ }, __value_initializers, __value_extraInitializers);
212
+ __esDecorate(this, null, _dateFilter_decorators, {
213
+ kind: "accessor",
214
+ name: "dateFilter",
215
+ static: false,
216
+ private: false,
217
+ access: {
218
+ has: (obj) => "dateFilter" in obj,
219
+ get: (obj) => obj.dateFilter,
220
+ set: (obj, value) => {
221
+ obj.dateFilter = value;
222
+ }
223
+ },
224
+ metadata: _metadata
225
+ }, _dateFilter_initializers, _dateFilter_extraInitializers);
226
+ __esDecorate(this, null, _set_fixedMonth_decorators, {
227
+ kind: "setter",
228
+ name: "fixedMonth",
229
+ static: false,
230
+ private: false,
231
+ access: {
232
+ has: (obj) => "fixedMonth" in obj,
233
+ set: (obj, value) => {
234
+ obj.fixedMonth = value;
235
+ }
236
+ },
237
+ metadata: _metadata
238
+ }, null, _instanceExtraInitializers);
239
+ __esDecorate(this, null, _orientation_decorators, {
240
+ kind: "accessor",
241
+ name: "orientation",
242
+ static: false,
243
+ private: false,
244
+ access: {
245
+ has: (obj) => "orientation" in obj,
246
+ get: (obj) => obj.orientation,
247
+ set: (obj, value) => {
248
+ obj.orientation = value;
249
+ }
250
+ },
251
+ metadata: _metadata
252
+ }, _orientation_initializers, _orientation_extraInitializers);
253
+ __esDecorate(this, null, _weekNumbers_decorators, {
254
+ kind: "accessor",
255
+ name: "weekNumbers",
256
+ static: false,
257
+ private: false,
258
+ access: {
259
+ has: (obj) => "weekNumbers" in obj,
260
+ get: (obj) => obj.weekNumbers,
261
+ set: (obj, value) => {
262
+ obj.weekNumbers = value;
263
+ }
264
+ },
265
+ metadata: _metadata
266
+ }, _weekNumbers_initializers, _weekNumbers_extraInitializers);
267
+ __esDecorate(this, null, __activeDate_decorators, {
268
+ kind: "accessor",
269
+ name: "_activeDate",
270
+ static: false,
271
+ private: false,
272
+ access: {
273
+ has: (obj) => "_activeDate" in obj,
274
+ get: (obj) => obj._activeDate,
275
+ set: (obj, value) => {
276
+ obj._activeDate = value;
277
+ }
278
+ },
279
+ metadata: _metadata
280
+ }, __activeDate_initializers, __activeDate_extraInitializers);
281
+ __esDecorate(this, null, __calendarView_decorators, {
282
+ kind: "accessor",
283
+ name: "_calendarView",
284
+ static: false,
285
+ private: false,
286
+ access: {
287
+ has: (obj) => "_calendarView" in obj,
288
+ get: (obj) => obj._calendarView,
289
+ set: (obj, value) => {
290
+ obj._calendarView = value;
291
+ }
292
+ },
293
+ metadata: _metadata
294
+ }, __calendarView_initializers, __calendarView_extraInitializers);
295
+ __esDecorate(this, null, __initialized_decorators, {
296
+ kind: "accessor",
297
+ name: "_initialized",
298
+ static: false,
299
+ private: false,
300
+ access: {
301
+ has: (obj) => "_initialized" in obj,
302
+ get: (obj) => obj._initialized,
303
+ set: (obj, value) => {
304
+ obj._initialized = value;
305
+ }
306
+ },
307
+ metadata: _metadata
308
+ }, __initialized_initializers, __initialized_extraInitializers);
309
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, {
310
+ enumerable: true,
311
+ configurable: true,
312
+ writable: true,
313
+ value: _metadata
314
+ });
315
+ }
316
+ static {
317
+ this.elementName = "sbb-calendar";
318
+ }
319
+ static {
320
+ this.elementDependencies = [
321
+ SbbCalendarDayElement,
322
+ SbbCalendarMonthElement,
323
+ SbbCalendarWeekdayElement,
324
+ SbbCalendarWeeknumberElement,
325
+ SbbCalendarYearElement,
326
+ SbbIconElement,
327
+ SbbSecondaryButtonElement
328
+ ];
329
+ }
330
+ static {
331
+ this.styles = [
332
+ buttonResetStyles,
333
+ screenReaderOnlyStyles,
334
+ unsafeCSS(calendar_default)
335
+ ];
336
+ }
337
+ static {
338
+ this.events = {
339
+ dateselected: "dateselected",
340
+ monthchange: "monthchange"
341
+ };
342
+ }
343
+ #amount_accessor_storage;
344
+ /**
345
+ * The amount of months to display in this calendar.
346
+ */
347
+ get amount() {
348
+ return this.#amount_accessor_storage;
349
+ }
350
+ set amount(value) {
351
+ this.#amount_accessor_storage = value;
352
+ }
353
+ #view_accessor_storage;
354
+ /** The initial view of the calendar which should be displayed on opening. */
355
+ get view() {
356
+ return this.#view_accessor_storage;
357
+ }
358
+ set view(value) {
359
+ this.#view_accessor_storage = value;
360
+ }
361
+ #min_accessor_storage;
362
+ /**
363
+ * The minimum valid date. Accepts a date object or null.
364
+ * Accepts an ISO8601 formatted string (e.g. 2024-12-24) as attribute.
365
+ */
366
+ get min() {
367
+ return this.#min_accessor_storage;
368
+ }
369
+ set min(value) {
370
+ this.#min_accessor_storage = value;
371
+ }
372
+ #max_accessor_storage;
373
+ /**
374
+ * The maximum valid date. Accepts a date object or null.
375
+ * Accepts an ISO8601 formatted string (e.g. 2024-12-24) as attribute.
376
+ */
377
+ get max() {
378
+ return this.#max_accessor_storage;
379
+ }
380
+ set max(value) {
381
+ this.#max_accessor_storage = value;
382
+ }
383
+ #multiple_accessor_storage;
384
+ /** Whether the calendar allows for multiple date selection. */
385
+ get multiple() {
386
+ return this.#multiple_accessor_storage;
387
+ }
388
+ set multiple(value) {
389
+ this.#multiple_accessor_storage = value;
390
+ }
391
+ /**
392
+ * The selected date: accepts a date object, or, if `multiple`, an array of dates.
393
+ */
394
+ set value(value) {
395
+ if (Array.isArray(value)) this._value = value.map((dateLike) => this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(dateLike))).filter((date) => date !== null).filter((date) => !this._isDayInRange(this._dateAdapter.toIso8601(date)) || this._dateFilter(date)).sort(this._sortDate);
396
+ else {
397
+ const selectedDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
398
+ if (!!selectedDate && (!this._isDayInRange(this._dateAdapter.toIso8601(selectedDate)) || this._dateFilter(selectedDate))) this._value = selectedDate;
399
+ else this._value = null;
400
+ }
401
+ }
402
+ get value() {
403
+ return this._value;
404
+ }
405
+ #_value_accessor_storage;
406
+ get _value() {
407
+ return this.#_value_accessor_storage;
408
+ }
409
+ set _value(value) {
410
+ this.#_value_accessor_storage = value;
411
+ }
412
+ #dateFilter_accessor_storage;
413
+ /** A function used to filter out dates. */
414
+ get dateFilter() {
415
+ return this.#dateFilter_accessor_storage;
416
+ }
417
+ set dateFilter(value) {
418
+ this.#dateFilter_accessor_storage = value;
419
+ }
420
+ /**
421
+ * Set this with the format `YYYY-MM` to limit the calendar to a specific month,
422
+ * and prevent navigation to other months.
423
+ */
424
+ set fixedMonth(value) {
425
+ const match = value ? value.match(/^(\d{4})-(\d{2})$/) : null;
426
+ this._fixedMonth = match ? this._dateAdapter.createDate(Number(match[1]), Number(match[2]), 1) : null;
427
+ }
428
+ get fixedMonth() {
429
+ return this._fixedMonth ? this._dateAdapter.toIso8601(this._fixedMonth).split("-").slice(0, 2).join("-") : "";
430
+ }
431
+ #orientation_accessor_storage;
432
+ /** The orientation of days in the calendar. */
433
+ get orientation() {
434
+ return this.#orientation_accessor_storage;
435
+ }
436
+ set orientation(value) {
437
+ this.#orientation_accessor_storage = value;
438
+ }
439
+ #weekNumbers_accessor_storage;
440
+ /** Whether it has to display the week numbers in addition to week days. */
441
+ get weekNumbers() {
442
+ return this.#weekNumbers_accessor_storage;
443
+ }
444
+ set weekNumbers(value) {
445
+ this.#weekNumbers_accessor_storage = value;
446
+ }
447
+ #_activeDate_accessor_storage;
448
+ /** The currently active date. */
449
+ get _activeDate() {
450
+ return this.#_activeDate_accessor_storage;
451
+ }
452
+ set _activeDate(value) {
453
+ this.#_activeDate_accessor_storage = value;
454
+ }
455
+ #_calendarView_accessor_storage;
456
+ get _calendarView() {
457
+ return this.#_calendarView_accessor_storage;
458
+ }
459
+ set _calendarView(value) {
460
+ this.#_calendarView_accessor_storage = value;
461
+ }
462
+ /** A list of calendar's cells corresponding to days, months or years depending on the view. */
463
+ get _cells() {
464
+ return Array.from((this._calendarView === "day" ? Array.from(this.shadowRoot.querySelectorAll("slot")).flatMap((e) => e.assignedElements({ flatten: true })) : this.shadowRoot?.querySelectorAll(`sbb-calendar-${this._calendarView}`)) ?? []);
465
+ }
466
+ #_initialized_accessor_storage;
467
+ get _initialized() {
468
+ return this.#_initialized_accessor_storage;
469
+ }
470
+ set _initialized(value) {
471
+ this.#_initialized_accessor_storage = value;
472
+ }
473
+ constructor() {
474
+ super();
475
+ this.#amount_accessor_storage = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _amount_initializers, 1));
476
+ this.#view_accessor_storage = (__runInitializers(this, _amount_extraInitializers), __runInitializers(this, _view_initializers, "day"));
477
+ this.#min_accessor_storage = (__runInitializers(this, _view_extraInitializers), __runInitializers(this, _min_initializers, null));
478
+ this.#max_accessor_storage = (__runInitializers(this, _min_extraInitializers), __runInitializers(this, _max_initializers, null));
479
+ this.#multiple_accessor_storage = (__runInitializers(this, _max_extraInitializers), __runInitializers(this, _multiple_initializers, false));
480
+ this.#_value_accessor_storage = (__runInitializers(this, _multiple_extraInitializers), __runInitializers(this, __value_initializers, null));
481
+ this.#dateFilter_accessor_storage = (__runInitializers(this, __value_extraInitializers), __runInitializers(this, _dateFilter_initializers, null));
482
+ this._fixedMonth = (__runInitializers(this, _dateFilter_extraInitializers), null);
483
+ this.#orientation_accessor_storage = __runInitializers(this, _orientation_initializers, "horizontal");
484
+ this.#weekNumbers_accessor_storage = (__runInitializers(this, _orientation_extraInitializers), __runInitializers(this, _weekNumbers_initializers, false));
485
+ this._dateAdapter = (__runInitializers(this, _weekNumbers_extraInitializers), readConfig().datetime?.dateAdapter ?? defaultDateAdapter);
486
+ this.#_activeDate_accessor_storage = __runInitializers(this, __activeDate_initializers, this._dateAdapter.today());
487
+ this.#_calendarView_accessor_storage = (__runInitializers(this, __activeDate_extraInitializers), __runInitializers(this, __calendarView_initializers, "day"));
488
+ /** A list of days, in two formats (long and single char). */
489
+ this._weekdays = __runInitializers(this, __calendarView_extraInitializers);
490
+ /** Grid of calendar cells representing the dates of the month. */
491
+ this._weeks = [];
492
+ /** The first visible day in the calendar. */
493
+ this._firstVisibleDay = "";
494
+ /** The last visible day in the calendar. */
495
+ this._lastVisibleDay = "";
496
+ /** An array containing all the month names in the current language. */
497
+ this._monthNames = this._dateAdapter.getMonthNames("long");
498
+ this._enhancedVariant = false;
499
+ /** Whether the focus should be reset on focusCell. */
500
+ this._resetFocus = false;
501
+ /** Whether an element inside the calendar is currently focused. */
502
+ this._containingFocus = false;
503
+ this._lastSelection = null;
504
+ this.#_initialized_accessor_storage = __runInitializers(this, __initialized_initializers, false);
505
+ this._language = (__runInitializers(this, __initialized_extraInitializers), new SbbLanguageController(this).withHandler(() => {
506
+ this._monthNames = this._dateAdapter.getMonthNames("long");
507
+ this._createMonthRows();
508
+ }));
509
+ this._sortDate = (a, b) => this._dateAdapter.compareDate(a, b);
510
+ this._onSlotChange = () => {
511
+ this._enhancedVariant = Array.from(this.children).some((c) => c.localName === "sbb-calendar-day");
512
+ this.toggleState("enhanced", this._enhancedVariant);
513
+ this._setTabIndex();
514
+ };
515
+ this._createMonthRows();
516
+ this._setWeekdays();
517
+ this.addEventListener("focusin", () => this._containingFocus = true);
518
+ this.addEventListener("focusout", () => this._containingFocus = false);
519
+ const resolveDay = (event) => event.target.closest("sbb-calendar-day") ?? event.composedPath().find((e) => e.localName === "sbb-calendar-day") ?? null;
520
+ this.addEventListener("click", (event) => {
521
+ const day = resolveDay(event);
522
+ if (day) this._selectDate(day.value, event);
523
+ });
524
+ this.addEventListener("keydown", (event) => {
525
+ const day = resolveDay(event);
526
+ if (day) this._handleKeyboardEvent(event, day);
527
+ });
528
+ this.addEventListener("blur", () => this._lastSelection = null);
529
+ }
530
+ _dateFilter(date) {
531
+ return this.dateFilter?.(date) ?? true;
532
+ }
533
+ /** Resets the active month according to the new state of the calendar. */
534
+ resetPosition() {
535
+ this._resetCalendarView();
536
+ this._init();
537
+ }
538
+ connectedCallback() {
539
+ super.connectedCallback();
540
+ this.resetPosition();
541
+ this.shadowRoot?.addEventListener("slotchange", this._onSlotChange, { capture: true });
542
+ }
543
+ disconnectedCallback() {
544
+ super.disconnectedCallback();
545
+ this.shadowRoot?.removeEventListener("slotchange", this._onSlotChange, { capture: true });
546
+ }
547
+ /** @internal */
548
+ formResetCallback() {}
549
+ /** @internal */
550
+ formStateRestoreCallback(state, reason) {
551
+ if (reason === "autocomplete" || state == null) return;
552
+ const restore = (value) => this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
553
+ if (typeof state === "string") this.value = restore(state);
554
+ else if (state instanceof FormData) {
555
+ if (this.multiple) {
556
+ this._readFormData(state).then((array) => this.value = array.map(restore).filter((date) => date != null));
557
+ return;
558
+ }
559
+ const entry = state.get(this.name);
560
+ if (entry instanceof Blob) entry.text().then((text) => this.value = restore(JSON.parse(text)));
561
+ else this.value = restore(entry);
562
+ }
563
+ }
564
+ async _readFormData(formData) {
565
+ return Promise.all(formData.getAll(this.name).map(async (entry) => entry instanceof Blob ? JSON.parse(await entry.text()) : entry));
566
+ }
567
+ /** @internal */
568
+ focus() {
569
+ this._resetFocus = true;
570
+ this._focusCell();
571
+ }
572
+ willUpdate(changedProperties) {
573
+ super.willUpdate(changedProperties);
574
+ if (!this._initialized) return;
575
+ if (changedProperties.has("amount") || changedProperties.has("orientation") || changedProperties.has("fixedMonth")) this.resetPosition();
576
+ if (changedProperties.has("view")) {
577
+ this._setChosenYear();
578
+ this._chosenMonth = void 0;
579
+ this._calendarView = this.view;
580
+ }
581
+ }
582
+ requestUpdate(name, oldValue, options) {
583
+ super.requestUpdate(name, oldValue, options);
584
+ if (name === "_calendarView") {
585
+ this.internals.states.delete(`view-${oldValue}`);
586
+ this.internals.states.add(`view-${this._calendarView}`);
587
+ if (this._containingFocus) this._resetFocus = true;
588
+ }
589
+ }
590
+ updated(changedProperties) {
591
+ super.updated(changedProperties);
592
+ this._setTabIndex();
593
+ this._focusCell();
594
+ }
595
+ /**
596
+ * The `_value` state should be adapted when the `multiple` property changes:
597
+ * - if it changes to true, the '_value' is set to an array;
598
+ * - if it changes to false, the first available option is set as 'value' otherwise it's set to null.
599
+ */
600
+ _onMultipleChanged(isMultiple) {
601
+ if (isMultiple && !Array.isArray(this._value)) this._value = this._value ? [this._value] : [];
602
+ if (!isMultiple && Array.isArray(this._value)) this._value = this._value.length ? this._value[0] : null;
603
+ }
604
+ /** Initializes the component. */
605
+ _init(activeDate) {
606
+ if (isServer) return;
607
+ else if (this.hydrationRequired) {
608
+ this.hydrationComplete.then(() => this._init());
609
+ return;
610
+ }
611
+ if (activeDate) this._assignActiveDate(activeDate);
612
+ const startDate = this._fixedMonth ?? this._activeDate;
613
+ const amount = this.amount < 1 ? 1 : this.amount;
614
+ this._weeks = Array.from({ length: amount }, (_, i) => this._createWeekRows(this._dateAdapter.addCalendarMonths(startDate, i)));
615
+ const dateFromFirstMonth = this._weeks[0][0][0].dateValue;
616
+ this._firstVisibleDay = this._dateAdapter.toIso8601(this._dateAdapter.createDate(this._dateAdapter.getYear(dateFromFirstMonth), this._dateAdapter.getMonth(dateFromFirstMonth), 1));
617
+ const dateFromLastMonth = this._weeks[amount - 1][0][0].dateValue;
618
+ this._lastVisibleDay = this._dateAdapter.toIso8601(this._dateAdapter.createDate(this._dateAdapter.getYear(dateFromLastMonth), this._dateAdapter.getMonth(dateFromLastMonth), this._dateAdapter.getNumDaysInMonth(dateFromLastMonth)));
619
+ this._years = this._createYearRows();
620
+ this._weekNumbers = this._weeks.map((week) => week.flat().sort((a, b) => a.value.localeCompare(b.value)).map((day) => day.weekValue).filter((v, i, a) => a.indexOf(v) === i));
621
+ this._initialized = true;
622
+ }
623
+ /** Focuses on a day cell prioritizing the selected day, the current day, and lastly, the first selectable day. */
624
+ _focusCell() {
625
+ if (this._resetFocus) {
626
+ this._getFirstFocusable()?.focus();
627
+ this._resetFocus = false;
628
+ }
629
+ }
630
+ /** Creates the array of weekdays. */
631
+ _setWeekdays() {
632
+ const narrowWeekdays = this._dateAdapter.getDayOfWeekNames("narrow");
633
+ const weekdays = this._dateAdapter.getDayOfWeekNames("long").map((long, i) => ({
634
+ long,
635
+ narrow: narrowWeekdays[i]
636
+ }));
637
+ const firstDayOfWeek = this._dateAdapter.getFirstDayOfWeek();
638
+ this._weekdays = weekdays.slice(firstDayOfWeek).concat(weekdays.slice(0, firstDayOfWeek));
639
+ }
640
+ /** Creates the rows along the horizontal direction and sets the parameters used in keyboard navigation. */
641
+ _createWeekRows(value) {
642
+ const daysInMonth = this._dateAdapter.getNumDaysInMonth(value);
643
+ const weekOffset = this._dateAdapter.getFirstWeekOffset(value);
644
+ return this.orientation === "horizontal" ? this._createWeekRowsHorizontal(value, daysInMonth, weekOffset) : this._createWeekRowsVertical(value, daysInMonth, weekOffset);
645
+ }
646
+ /**
647
+ * Creates the rows for each week in orientation='horizontal'.
648
+ *
649
+ * Iterates through the days of the months, creates a Day object for each and pushes it into and array.
650
+ * Each seven days (considering the offset at the beginning of the month) restarts from an empty array.
651
+ *
652
+ * The result is a matrix in which every row is a week (or part of it, considering offset).
653
+ */
654
+ _createWeekRowsHorizontal(value, daysInMonth, weekOffset) {
655
+ const weeks = [[]];
656
+ for (let i = 0, cell = weekOffset; i < daysInMonth; i++, cell++) {
657
+ if (cell === DAYS_PER_ROW) {
658
+ weeks.push([]);
659
+ cell = 0;
660
+ }
661
+ const date = this._dateAdapter.createDate(this._dateAdapter.getYear(value), this._dateAdapter.getMonth(value), i + 1);
662
+ weeks[weeks.length - 1].push(this._mapDateToDay(date));
663
+ }
664
+ return weeks;
665
+ }
666
+ /**
667
+ * Creates the rows for each week in orientation='vertical'.
668
+ *
669
+ * Creates a matrix with seven empty rows.
670
+ * Iterates through the days of the months, creates a Day object for each
671
+ * and pushes it into the correct array considering the offset at the beginning of the month.
672
+ * Each seven days (including offset) restarts from the first.
673
+ *
674
+ * The result is a matrix in which every row is a set of weekdays, so:
675
+ * - row 0: all the Mondays;
676
+ * - row 1: all the Tuesdays;
677
+ * - ...
678
+ * - row 7: all the Sundays.
679
+ */
680
+ _createWeekRowsVertical(value, daysInMonth, weekOffset) {
681
+ const weeks = Array.from({ length: DAYS_PER_ROW }, () => []);
682
+ for (let i = 0, cell = weekOffset; i < daysInMonth; i++, cell++) {
683
+ if (cell === DAYS_PER_ROW) cell = 0;
684
+ const date = this._dateAdapter.createDate(this._dateAdapter.getYear(value), this._dateAdapter.getMonth(value), i + 1);
685
+ weeks[cell].push(this._mapDateToDay(date));
686
+ }
687
+ return weeks;
688
+ }
689
+ _mapDateToDay(date) {
690
+ return {
691
+ value: this._dateAdapter.toIso8601(date),
692
+ dateValue: date,
693
+ dayValue: String(this._dateAdapter.getDate(date)),
694
+ monthValue: String(this._dateAdapter.getMonth(date)),
695
+ yearValue: String(this._dateAdapter.getYear(date)),
696
+ weekValue: this._getWeek(date),
697
+ weekDayValue: this._dateAdapter.getDayOfWeek(date)
698
+ };
699
+ }
700
+ _getWeek(date) {
701
+ const firstDayOfYear = this._dateAdapter.createDate(this._dateAdapter.getYear(date), 1, 1);
702
+ const weekday = this._dateAdapter.getDayOfWeek(firstDayOfYear);
703
+ let weekIndex = [
704
+ MONDAY,
705
+ TUESDAY,
706
+ WEDNESDAY,
707
+ THURSDAY
708
+ ].includes(weekday) ? 1 : 0;
709
+ let weekStart = this._dateAdapter.addCalendarDays(firstDayOfYear, this._dateAdapter.getFirstWeekOffset(firstDayOfYear) * -1);
710
+ while (this._dateAdapter.compareDate(weekStart, date) <= 0) {
711
+ const weekEnd = this._dateAdapter.addCalendarDays(weekStart, 6);
712
+ if (this._dateAdapter.compareDate(date, weekEnd) <= 0) return weekIndex > 0 ? weekIndex : this._getWeek(this._dateAdapter.addCalendarDays(firstDayOfYear, -1));
713
+ weekStart = this._dateAdapter.addCalendarDays(weekStart, DAYS_PER_ROW);
714
+ weekIndex++;
715
+ }
716
+ throw new Error("The provided date is invalid");
717
+ }
718
+ /** Force the conversion to ISO8601 formatted string. */
719
+ _mapValueToISODate(value) {
720
+ return typeof value === "string" ? value : this._dateAdapter.toIso8601(value);
721
+ }
722
+ /** Creates the rows for the month selection view. */
723
+ _createMonthRows() {
724
+ const months = new Array(12).fill(null).map((_, i) => ({
725
+ value: String(i + 1).padStart(2, "0"),
726
+ monthValue: i + 1
727
+ }));
728
+ const rows = 12 / MONTHS_PER_ROW;
729
+ const monthArray = [];
730
+ for (let i = 0; i < rows; i++) monthArray.push(months.slice(MONTHS_PER_ROW * i, MONTHS_PER_ROW * (i + 1)));
731
+ this._months = monthArray;
732
+ }
733
+ /** Creates the rows for the year selection view. */
734
+ _createYearRows() {
735
+ const startValueYearView = this._getStartValueYearView();
736
+ const allYears = new Array(YEARS_PER_PAGE).fill(0).map((_, i) => startValueYearView + i);
737
+ const rows = YEARS_PER_PAGE / YEARS_PER_ROW;
738
+ const yearArray = [];
739
+ for (let i = 0; i < rows; i++) yearArray.push(allYears.slice(YEARS_PER_ROW * i, YEARS_PER_ROW * (i + 1)));
740
+ return yearArray;
741
+ }
742
+ /**
743
+ * Calculates the first year that will be shown in the year selection panel.
744
+ * If `minDate` and `maxDate` are both null, the starting year is calculated as
745
+ * the multiple of YEARS_PER_PAGE closest to and less than activeDate,
746
+ * e.g., with `YEARS_PER_PAGE` = 24 and `activeDate` = 2020, the function will return 2016 (24 * 83),
747
+ * while with `activeDate` = 2000, the function will return 1992 (24 * 82).
748
+ * If `minDate` is not null, it returns the corresponding year; if `maxDate` is not null,
749
+ * it returns the corresponding year minus `YEARS_PER_PAGE`, so that the `maxDate` is the last rendered year.
750
+ * If both are not null, `maxDate` has priority over `minDate`.
751
+ */
752
+ _getStartValueYearView() {
753
+ let startingYear = 0;
754
+ if (this.max) startingYear = this._dateAdapter.getYear(this.max) - YEARS_PER_PAGE + 1;
755
+ else if (this.min) startingYear = this._dateAdapter.getYear(this.min);
756
+ const activeYear = this._dateAdapter.getYear(this._activeDate);
757
+ return activeYear - ((activeYear - startingYear) % YEARS_PER_PAGE + YEARS_PER_PAGE) % YEARS_PER_PAGE;
758
+ }
759
+ /** Checks if date is within the min-max range. */
760
+ _isDayInRange(dateString) {
761
+ if (!this.min && !this.max) return true;
762
+ const date = this._dateAdapter.deserialize(dateString);
763
+ return this._dateAdapter.sameDate(date, this._dateAdapter.clampDate(date, this.min, this.max));
764
+ }
765
+ /** Emits the selected date and sets it internally. */
766
+ _selectDate(day, event) {
767
+ this._chosenMonth = void 0;
768
+ this._setChosenYear();
769
+ if (this.multiple) {
770
+ window.getSelection()?.removeAllRanges();
771
+ let selected = !this._value ? [] : Array.isArray(this._value) ? this._value : [this._value];
772
+ const serializedSelected = selected.map((s) => this._dateAdapter.toIso8601(s));
773
+ if (event.shiftKey && this._lastSelection && serializedSelected.includes(this._dateAdapter.toIso8601(this._lastSelection)) && !serializedSelected.includes(this._dateAdapter.toIso8601(day))) {
774
+ const offset = this._dateAdapter.compareDate(this._lastSelection, day) < 0 ? 1 : -1;
775
+ const range = [];
776
+ let current = this._lastSelection;
777
+ while (!this._dateAdapter.sameDate(current, day)) {
778
+ current = this._dateAdapter.addCalendarDays(current, offset);
779
+ const serializedCurrent = this._dateAdapter.toIso8601(current);
780
+ if (!serializedSelected.includes(serializedCurrent)) range.push(serializedCurrent);
781
+ }
782
+ selected = this._mergeDates(range, serializedSelected);
783
+ } else if (selected.some((sel) => this._dateAdapter.sameDate(sel, day))) selected = selected.filter((sel) => !this._dateAdapter.sameDate(sel, day));
784
+ else selected = [...selected, day].sort(this._sortDate);
785
+ this._lastSelection = day;
786
+ this._value = selected;
787
+ this._emitDateSelectedEvent(this._value.map((e) => this._dateAdapter.deserialize(e)));
788
+ } else if (!this._value || this._dateAdapter.compareDate(this._value, day) !== 0) {
789
+ this._value = day;
790
+ this._emitDateSelectedEvent(this._dateAdapter.deserialize(day));
791
+ }
792
+ }
793
+ /**
794
+ * Handle multiple dates selection via weekNumber / weekDay buttons:
795
+ * - if Cmd or Ctrl are pressed, add the new date to the current ones;
796
+ * - if not,
797
+ * - if the new dates are the same of the current ones, it means that the same button has been clicked twice, so do nothing;
798
+ * - if not, the selected dates are the new ones.
799
+ */
800
+ _selectMultipleDates(days) {
801
+ this._value = this._mergeDates(days.map((e) => e.value));
802
+ this._emitDateSelectedEvent(this._value.map((e) => this._dateAdapter.deserialize(e)));
803
+ }
804
+ _mergeDates(dates, selected) {
805
+ selected ??= this._value.map((s) => this._dateAdapter.toIso8601(s));
806
+ const enabledDays = this._cells.filter((e) => !e.disabled).map((e) => this._mapValueToISODate(e.value));
807
+ const daysToAdd = dates.filter((isoDate) => enabledDays.includes(isoDate));
808
+ if (daysToAdd.every((day) => selected.includes(day))) selected = selected.filter((day) => !daysToAdd.includes(day));
809
+ else selected = [...selected, ...daysToAdd].filter((v, i, a) => a.indexOf(v) === i);
810
+ return selected.map((s) => this._dateAdapter.deserialize(s)).sort(this._sortDate);
811
+ }
812
+ /**
813
+ * Emits the dateselected event given the detail (as T or T[] based on the value of the multiple flag).
814
+ * FIXME: the name of the variable appears as event name in the readme
815
+ * due to a bug in the custom-elements-manifest library.
816
+ * https://github.com/open-wc/custom-elements-manifest/issues/149
817
+ */
818
+ _emitDateSelectedEvent(dateselected) {
819
+ /** @type {SbbDateSelectedEvent<T>} Event emitted on date selection. */
820
+ this.dispatchEvent(new SbbDateSelectedEvent(dateselected));
821
+ /** @type {InputEvent} Event emitted on user selection. */
822
+ this.dispatchEvent(new InputEvent("input", {
823
+ bubbles: true,
824
+ composed: true
825
+ }));
826
+ /** @type {Event} Event emitted on user selection. */
827
+ this.dispatchEvent(new Event("change", { bubbles: true }));
828
+ }
829
+ _emitMonthChange() {
830
+ const monthchange = this._weeks.flat(2).sort((a, b) => a.value.localeCompare(b.value));
831
+ /**
832
+ * @type {SbbMonthChangeEvent}
833
+ * Emits when the month changes.
834
+ * The `range` property contains the days array of the chosen month.
835
+ */
836
+ this.dispatchEvent(new SbbMonthChangeEvent(monthchange));
837
+ }
838
+ _setChosenYear() {
839
+ if (this.view === "month") {
840
+ let selectedDate;
841
+ if (this.multiple) selectedDate = this.value.at(-1);
842
+ else selectedDate = this.value;
843
+ this._chosenYear = this._dateAdapter.getYear(selectedDate ?? this._dateAdapter.today());
844
+ } else this._chosenYear = void 0;
845
+ }
846
+ _assignActiveDate(date) {
847
+ this._activeDate = this._dateAdapter.clampDate(date, this.min, this.max);
848
+ }
849
+ /** Goes to the month identified by the shift. */
850
+ _goToDifferentMonth(months) {
851
+ this._init(this._dateAdapter.addCalendarMonths(this._activeDate, months));
852
+ this._emitMonthChange();
853
+ }
854
+ _goToDifferentYear(years) {
855
+ this._chosenYear += years;
856
+ this._activeDate = this._dateAdapter.createDate(this._chosenYear, this._dateAdapter.getMonth(this._activeDate), this._dateAdapter.getDate(this._activeDate));
857
+ this._init();
858
+ }
859
+ _goToDifferentYearRange(years) {
860
+ this._init(this._dateAdapter.addCalendarYears(this._activeDate, years));
861
+ }
862
+ _prevDisabled(prevDate) {
863
+ if (!this.min) return false;
864
+ return this._dateAdapter.compareDate(prevDate, this.min) < 0;
865
+ }
866
+ _nextDisabled(nextDate) {
867
+ if (!this.max) return false;
868
+ return this._dateAdapter.compareDate(nextDate, this.max) > 0;
869
+ }
870
+ /** Checks if the "previous month" button should be disabled. */
871
+ _previousMonthDisabled() {
872
+ const prevMonth = this._dateAdapter.addCalendarDays(this._activeDate, this._dateAdapter.getDate(this._activeDate) * -1);
873
+ return this._prevDisabled(prevMonth);
874
+ }
875
+ /** Checks if the "next month" button should be disabled. */
876
+ _nextMonthDisabled() {
877
+ let nextMonth = this._dateAdapter.addCalendarMonths(this._activeDate, this.amount < 1 ? 1 : this.amount);
878
+ nextMonth = this._dateAdapter.createDate(this._dateAdapter.getYear(nextMonth), this._dateAdapter.getMonth(nextMonth), 1);
879
+ return this._nextDisabled(nextMonth);
880
+ }
881
+ /** Checks if the "previous year" button should be disabled. */
882
+ _previousYearDisabled() {
883
+ const prevYear = this._dateAdapter.createDate(this._dateAdapter.getYear(this._activeDate) - 1, 12, 31);
884
+ return this._prevDisabled(prevYear);
885
+ }
886
+ /** Checks if the "next year" button should be disabled. */
887
+ _nextYearDisabled() {
888
+ const nextYear = this._dateAdapter.createDate(this._dateAdapter.getYear(this._activeDate) + (this.amount < 1 ? 1 : this.amount), 1, 1);
889
+ return this._nextDisabled(nextYear);
890
+ }
891
+ /** Checks if the "previous year" button should be disabled in year view. */
892
+ _previousYearRangeDisabled() {
893
+ const prevYear = this._dateAdapter.createDate(this._years[0][0] - 1, 12, 31);
894
+ return this._prevDisabled(prevYear);
895
+ }
896
+ /** Checks if the "next year" button should be disabled in year view. */
897
+ _nextYearRangeDisabled() {
898
+ const lastYear = this._years.flat(2).at(-1);
899
+ const nextYear = this._dateAdapter.createDate(lastYear + 1, 1, 1);
900
+ return this._nextDisabled(nextYear);
901
+ }
902
+ _handleTableBlur(eventTarget) {
903
+ if (eventTarget?.localName !== "sbb-calendar-day") this._setTabIndex();
904
+ }
905
+ _setTabIndex() {
906
+ Array.from(this._cells.filter((e) => e.tabIndex === 0) ?? []).forEach((day) => day.tabIndex = -1);
907
+ const firstFocusable = this._getFirstFocusable();
908
+ if (firstFocusable) firstFocusable.tabIndex = 0;
909
+ }
910
+ /** Get the element in the calendar to assign focus. */
911
+ _getFirstFocusable() {
912
+ if (this._calendarView === "day") {
913
+ const selectedOrCurrent = this._cells.find((e) => e.matches(":is(:state(selected),[state--selected])")) ?? this._cells.find((e) => e.matches(":is(:state(current),[state--current])"));
914
+ return selectedOrCurrent && !selectedOrCurrent.disabled ? selectedOrCurrent : this._getFirstFocusableDay();
915
+ } else {
916
+ const selectedOrCurrent = this.shadowRoot?.querySelector(`sbb-calendar-${this._calendarView}:is(:state(selected),[state--selected])`) ?? this.shadowRoot?.querySelector(`sbb-calendar-${this._calendarView}:is(:state(current),[state--current])`);
917
+ return selectedOrCurrent && !selectedOrCurrent.disabled ? selectedOrCurrent : this.shadowRoot.querySelector(`sbb-calendar-${this._calendarView}:not([disabled])`);
918
+ }
919
+ }
920
+ /**
921
+ * In `day` view in `vertical` orientation,
922
+ * if the first of the month is not a Monday, it is not the first rendered element in the table,
923
+ * so `this.shadowRoot!.querySelector('sbb-calendar-day:not([disabled])')` will return a wrong value.
924
+ *
925
+ * To solve this, the element with the lowest `value` is taken (ISO String are ordered).
926
+ */
927
+ _getFirstFocusableDay() {
928
+ const cells = this._cells;
929
+ const daysInView = cells.filter((e) => !e.disabled);
930
+ if (!daysInView || daysInView.length === 0) return null;
931
+ else {
932
+ const firstElement = daysInView.map((e) => this._dateAdapter.toIso8601(e.value)).sort()[0];
933
+ return cells.find((e) => e.matches(`[slot="${firstElement}"]`)) ?? null;
934
+ }
935
+ }
936
+ _handleKeyboardEvent(event, day) {
937
+ if (isArrowKeyOrPageKeysPressed(event)) event.preventDefault();
938
+ const origin = day ?? event.target;
939
+ const cells = this._cells;
940
+ const index = cells.indexOf(origin);
941
+ let nextEl;
942
+ if (day) nextEl = this._navigateByKeyboardDayView(event, index, cells, this._mapDateToDay(day.value));
943
+ else nextEl = this._navigateByKeyboard(event, index, cells);
944
+ const activeEl = (this._enhancedVariant ? document : this.shadowRoot).activeElement;
945
+ if (nextEl !== activeEl) {
946
+ nextEl.tabIndex = 0;
947
+ nextEl.focus();
948
+ if (cells.includes(activeEl)) activeEl.tabIndex = -1;
949
+ }
950
+ }
951
+ _navigateByKeyboardDayView(evt, index, cells, day) {
952
+ const arrowsOffset = this.orientation === "horizontal" ? {
953
+ leftRight: 1,
954
+ upDown: DAYS_PER_ROW
955
+ } : {
956
+ leftRight: DAYS_PER_ROW,
957
+ upDown: 1
958
+ };
959
+ switch (evt.key) {
960
+ case "ArrowUp": return this._findDayArrows(cells, index, day.dateValue, -arrowsOffset.upDown);
961
+ case "ArrowDown": return this._findDayArrows(cells, index, day.dateValue, arrowsOffset.upDown);
962
+ case "ArrowLeft": return this._findDayArrows(cells, index, day.dateValue, -arrowsOffset.leftRight);
963
+ case "ArrowRight": return this._findDayArrows(cells, index, day.dateValue, arrowsOffset.leftRight);
964
+ case "PageUp": if (this.orientation === "horizontal") {
965
+ const delta = (+day.dayValue % DAYS_PER_ROW || DAYS_PER_ROW) - +day.dayValue;
966
+ return this._findDayPageUpDown(cells, index, day, delta, arrowsOffset.upDown);
967
+ } else {
968
+ const offsetForVertical = this._dateAdapter.getFirstWeekOffset(day.dateValue);
969
+ const delta = (Math.ceil((+day.dayValue + offsetForVertical) / DAYS_PER_ROW) - 1) * DAYS_PER_ROW - offsetForVertical + 1 - +day.dayValue;
970
+ return this._findDayPageUpDown(cells, index, day, delta, arrowsOffset.upDown);
971
+ }
972
+ case "PageDown": if (this.orientation === "horizontal") {
973
+ const monthInBounds = +day.monthValue + 1 > 12 ? 1 : +day.monthValue + 1;
974
+ const yearInBounds = +day.monthValue + 1 > 12 ? +day.yearValue + 1 : +day.yearValue;
975
+ const firstNextMonth = this._dateAdapter.createDate(yearInBounds, monthInBounds, 1);
976
+ const lastOfMonth = this._dateAdapter.getDate(this._dateAdapter.addCalendarDays(firstNextMonth, -1));
977
+ const delta = Math.trunc((lastOfMonth - +day.dayValue) / DAYS_PER_ROW) * DAYS_PER_ROW;
978
+ return this._findDayPageUpDown(cells, index, day, delta, -arrowsOffset.upDown);
979
+ } else {
980
+ const offsetForVertical = this._dateAdapter.getFirstWeekOffset(day.dateValue);
981
+ const delta = Math.ceil((+day.dayValue + offsetForVertical) / DAYS_PER_ROW) * DAYS_PER_ROW - offsetForVertical - +day.dayValue;
982
+ return this._findDayPageUpDown(cells, index, day, delta, -arrowsOffset.upDown);
983
+ }
984
+ case "Home": return this._findDayFirst(cells, index, day, 1);
985
+ case "End": {
986
+ const monthInBounds = +day.monthValue + 1 > 12 ? 1 : +day.monthValue + 1;
987
+ const yearInBounds = +day.monthValue + 1 > 12 ? +day.yearValue + 1 : +day.yearValue;
988
+ const firstNextMonth = this._dateAdapter.createDate(yearInBounds, monthInBounds, 1);
989
+ return this._findDayLast(cells, index, firstNextMonth);
990
+ }
991
+ default: return cells[index];
992
+ }
993
+ }
994
+ _isDayOutOfView(date) {
995
+ return date < this._firstVisibleDay || date > this._lastVisibleDay;
996
+ }
997
+ _findDayArrows(cells, index, date, delta) {
998
+ const newDateValue = this._dateAdapter.toIso8601(this._dateAdapter.addCalendarDays(date, delta));
999
+ if (this._isDayOutOfView(newDateValue)) return cells[index];
1000
+ const nextCell = cells.find((e) => this._mapValueToISODate(e.value) === newDateValue);
1001
+ if (!nextCell || nextCell.disabled) return this._findDayArrows(cells, index, this._dateAdapter.deserialize(newDateValue), delta);
1002
+ return nextCell;
1003
+ }
1004
+ _findDayPageUpDown(cells, index, day, delta, deltaIfDisabled) {
1005
+ const newDateValue = this._dateAdapter.toIso8601(this._dateAdapter.addCalendarDays(day.dateValue, delta));
1006
+ if (this._isDayOutOfView(newDateValue)) return cells[index];
1007
+ const nextCell = cells.find((e) => this._mapValueToISODate(e.value) === newDateValue);
1008
+ if (!nextCell || nextCell.disabled) return this._findDayPageUpDown(cells, index, day, delta + deltaIfDisabled, deltaIfDisabled);
1009
+ return nextCell;
1010
+ }
1011
+ _findDayFirst(cells, index, day, date) {
1012
+ const newDateValue = this._dateAdapter.toIso8601(this._dateAdapter.createDate(+day.yearValue, +day.monthValue, date));
1013
+ if (this._isDayOutOfView(newDateValue)) return cells[index];
1014
+ const nextCell = cells.find((e) => this._mapValueToISODate(e.value) === newDateValue);
1015
+ if (!nextCell || nextCell.disabled) return this._findDayFirst(cells, index, day, date + 1);
1016
+ return nextCell;
1017
+ }
1018
+ _findDayLast(cells, index, firstNextMonth) {
1019
+ const newDateValue = this._dateAdapter.toIso8601(this._dateAdapter.addCalendarDays(firstNextMonth, -1));
1020
+ if (this._isDayOutOfView(newDateValue)) return cells[index];
1021
+ const nextCell = cells.find((e) => this._mapValueToISODate(e.value) === newDateValue);
1022
+ if (!nextCell || nextCell.disabled) return this._findDayLast(cells, index, this._dateAdapter.deserialize(newDateValue));
1023
+ return nextCell;
1024
+ }
1025
+ /**
1026
+ * Gets the index of the element to move to, based on a list of elements (which can be potentially disabled),
1027
+ * the keyboard input and the position of the current element in the list.
1028
+ * In the day view, the `day?: Day` parameter is mandatory for calculation,
1029
+ * while in month and year view it's not due to the fixed amount of rendered cells.
1030
+ */
1031
+ _navigateByKeyboard(evt, index, cells) {
1032
+ const { elementIndexForWideMode, offsetForWideMode, lastElementIndexForWideMode, verticalOffset } = this._calculateParametersForKeyboardNavigation(index, this._calendarView === "year");
1033
+ switch (evt.key) {
1034
+ case "ArrowUp": return this._findNext(cells, index, -verticalOffset);
1035
+ case "ArrowDown": return this._findNext(cells, index, verticalOffset);
1036
+ case "ArrowLeft": return this._findNext(cells, index, -1);
1037
+ case "ArrowRight": return this._findNext(cells, index, 1);
1038
+ case "Home": return this._findFirst(cells, offsetForWideMode);
1039
+ case "PageUp": return this._findFirstOnColumn(cells, elementIndexForWideMode, offsetForWideMode, verticalOffset);
1040
+ case "PageDown": return this._findLastOnColumn(cells, index, lastElementIndexForWideMode, verticalOffset);
1041
+ case "End": return this._findLast(cells, lastElementIndexForWideMode - 1);
1042
+ default: return cells[index];
1043
+ }
1044
+ }
1045
+ /**
1046
+ * Calculates the parameters needed in keyboard navigation in year and month view.
1047
+ * @param index The starting element's index in the cell array.
1048
+ * @param isYearView Whether the displayed `view` is the year one.
1049
+ */
1050
+ _calculateParametersForKeyboardNavigation(index, isYearView) {
1051
+ const elementsPerPage = isYearView ? YEARS_PER_PAGE : MONTHS_PER_PAGE;
1052
+ const offset = Math.trunc(index / elementsPerPage) * elementsPerPage;
1053
+ const indexInView = offset === 0 ? index : index - elementsPerPage;
1054
+ return {
1055
+ verticalOffset: isYearView ? YEARS_PER_ROW : MONTHS_PER_ROW,
1056
+ elementIndexForWideMode: indexInView,
1057
+ offsetForWideMode: index - indexInView,
1058
+ lastElementIndexForWideMode: offset === 0 ? elementsPerPage : elementsPerPage * 2
1059
+ };
1060
+ }
1061
+ /**
1062
+ * Gets the next element of the provided array starting from `index` by adding `delta`.
1063
+ * If the found element is disabled, it continues adding `delta` until it finds an enabled one in the array bounds.
1064
+ */
1065
+ _findNext(days, index, delta) {
1066
+ let nextIndex = index + delta;
1067
+ while (nextIndex < days.length && days[nextIndex]?.disabled) nextIndex += delta;
1068
+ return days[nextIndex] ?? days[index];
1069
+ }
1070
+ /** Find the first enabled element in the provided array. */
1071
+ _findFirst(days, firstOfCurrentMonth) {
1072
+ return !days[firstOfCurrentMonth].disabled ? days[firstOfCurrentMonth] : this._findNext(days, firstOfCurrentMonth, 1);
1073
+ }
1074
+ /** Find the last enabled element in the provided array. */
1075
+ _findLast(days, lastOfCurrentMonth) {
1076
+ return !days[lastOfCurrentMonth].disabled ? days[lastOfCurrentMonth] : this._findNext(days, lastOfCurrentMonth, -1);
1077
+ }
1078
+ /** Find the first enabled element in the same column of the provided array. */
1079
+ _findFirstOnColumn(days, index, offset, verticalOffset) {
1080
+ const nextIndex = index % verticalOffset + offset;
1081
+ return !days[nextIndex].disabled ? days[nextIndex] : this._findNext(days, nextIndex, verticalOffset);
1082
+ }
1083
+ /** Find the last enabled element in the same column of the provided array. */
1084
+ _findLastOnColumn(days, index, offset, verticalOffset) {
1085
+ const nextIndex = index + Math.trunc((offset - index - 1) / verticalOffset) * verticalOffset;
1086
+ return !days[nextIndex].disabled ? days[nextIndex] : this._findNext(days, nextIndex, -verticalOffset);
1087
+ }
1088
+ _resetCalendarViewAndEmitMonthChange() {
1089
+ this._resetCalendarView();
1090
+ this._emitMonthChange();
1091
+ }
1092
+ _resetCalendarView() {
1093
+ if (this._containingFocus) this._resetFocus = true;
1094
+ this._activeDate = (this.multiple ? this._value.at(-1) : this._value) ?? this._dateAdapter.today();
1095
+ this._setChosenYear();
1096
+ this._chosenMonth = void 0;
1097
+ this._init();
1098
+ this._calendarView = this.view;
1099
+ }
1100
+ /** Creates the calendar table for the daily view. */
1101
+ _createDayTable(weeks, weekNumbers, first) {
1102
+ const firstDay = weeks[0][0].dateValue;
1103
+ const monthLabel = `${this._monthNames[this._dateAdapter.getMonth(firstDay) - 1]} ${this._dateAdapter.getYear(firstDay)}`;
1104
+ const weeksForSelectMultipleWeekNumbers = weeks.flat();
1105
+ const weeksForSelectMultipleWeekDays = weeks.flat();
1106
+ return html`
1107
+ <div class="sbb-calendar__table-wrapper sbb-calendar__day-view">
1108
+ <div class="sbb-calendar__table-header">
1109
+ <span>${monthLabel}</span> ${first ? this._createDayTableControls(monthLabel) : nothing}
1110
+ </div>
1111
+ <table
1112
+ class="sbb-calendar__table"
1113
+ @focusout=${(event) => this._handleTableBlur(event.relatedTarget)}
1114
+ >
1115
+ <thead>
1116
+ <tr>
1117
+ ${this.weekNumbers ? html`<th class="sbb-calendar__table-header-cell"></th>` : nothing}
1118
+ ${this._weekdays.map((weekDay, index) => html`
1119
+ <th class="sbb-calendar__table-header-cell">
1120
+ ${this.multiple ? html`
1121
+ <sbb-calendar-weekday
1122
+ .value=${weekDay}
1123
+ @click=${() => {
1124
+ const days = weeksForSelectMultipleWeekDays.filter((day) => day.weekDayValue === (index + 1) % 7);
1125
+ this._selectMultipleDates(days);
1126
+ }}
1127
+ ></sbb-calendar-weekday>
1128
+ ` : html`
1129
+ <span class="sbb-screen-reader-only">${weekDay.long}</span>
1130
+ <span aria-hidden="true">${weekDay.narrow}</span>
1131
+ `}
1132
+ </th>
1133
+ `)}
1134
+ </tr>
1135
+ </thead>
1136
+ <tbody>
1137
+ ${weeks.map((week, rowIndex) => {
1138
+ const firstRowOffset = DAYS_PER_ROW - week.length;
1139
+ if (rowIndex === 0 && firstRowOffset) return html`
1140
+ <tr>
1141
+ ${this.weekNumbers ? html`
1142
+ <td class="sbb-calendar__table-header-cell-vertical">
1143
+ ${this.multiple ? html`
1144
+ <sbb-calendar-weeknumber
1145
+ .value=${weekNumbers[0]}
1146
+ @click=${() => {
1147
+ const days = weeksForSelectMultipleWeekNumbers.filter((day) => day.weekValue === weekNumbers[0]);
1148
+ this._selectMultipleDates(days);
1149
+ }}
1150
+ ></sbb-calendar-weeknumber>
1151
+ ` : html`
1152
+ <span class="sbb-screen-reader-only"
1153
+ >${`${i18nCalendarWeekNumber[this._language.current]} ${weekNumbers[0]}`}</span
1154
+ >
1155
+ <span aria-hidden="true">${weekNumbers[0]}</span>
1156
+ `}
1157
+ </td>
1158
+ ` : nothing}
1159
+ ${[...Array(firstRowOffset).keys()].map(() => html`<td class="sbb-calendar__table-data"></td>`)}
1160
+ ${this._createDayCells(week)}
1161
+ </tr>
1162
+ `;
1163
+ return html`
1164
+ <tr>
1165
+ ${this.weekNumbers ? html`
1166
+ <td class="sbb-calendar__table-header-cell-vertical">
1167
+ ${this.multiple ? html`
1168
+ <sbb-calendar-weeknumber
1169
+ .value=${weekNumbers[rowIndex]}
1170
+ @click=${() => {
1171
+ const days = weeksForSelectMultipleWeekNumbers.filter((day) => day.weekValue === weekNumbers[rowIndex]);
1172
+ this._selectMultipleDates(days);
1173
+ }}
1174
+ ></sbb-calendar-weeknumber>
1175
+ ` : html`
1176
+ <span class="sbb-screen-reader-only"
1177
+ >${`${i18nCalendarWeekNumber[this._language.current]} ${weekNumbers[rowIndex]}`}</span
1178
+ >
1179
+ <span aria-hidden="true">${weekNumbers[rowIndex]}</span>
1180
+ `}
1181
+ </td>
1182
+ ` : nothing}
1183
+ ${this._createDayCells(week)}
1184
+ </tr>
1185
+ `;
1186
+ })}
1187
+ </tbody>
1188
+ </table>
1189
+ </div>
1190
+ `;
1191
+ }
1192
+ /** Creates the table in orientation='vertical'. */
1193
+ _createDayTableVertical(weeks, weekNumbers, first) {
1194
+ const firstDay = weeks[0][0].dateValue;
1195
+ const monthLabel = `${this._monthNames[this._dateAdapter.getMonth(firstDay) - 1]} ${this._dateAdapter.getYear(firstDay)}`;
1196
+ const activeDate = weeks[0][0].dateValue;
1197
+ const weekOffset = this._dateAdapter.getFirstWeekOffset(activeDate ?? this._activeDate);
1198
+ const weeksForSelectMultipleWeekNumbers = weeks.flat();
1199
+ return html`
1200
+ <div class="sbb-calendar__table-wrapper sbb-calendar__day-view">
1201
+ <div class="sbb-calendar__table-header">
1202
+ <span>${monthLabel}</span> ${first ? this._createDayTableControls(monthLabel) : nothing}
1203
+ </div>
1204
+ <table
1205
+ class="sbb-calendar__table"
1206
+ @focusout=${(event) => this._handleTableBlur(event.relatedTarget)}
1207
+ >
1208
+ ${this.weekNumbers ? html`
1209
+ <thead>
1210
+ <tr>
1211
+ <th class="sbb-calendar__table-data"></th>
1212
+ ${weekNumbers.map((weekNumber) => html`
1213
+ <th class="sbb-calendar__table-header-cell">
1214
+ ${this.multiple ? html`
1215
+ <sbb-calendar-weeknumber
1216
+ .value=${weekNumber}
1217
+ @click=${() => {
1218
+ const days = weeksForSelectMultipleWeekNumbers.filter((day) => day.weekValue === weekNumber);
1219
+ this._selectMultipleDates(days);
1220
+ }}
1221
+ ></sbb-calendar-weeknumber>
1222
+ ` : html`
1223
+ <span class="sbb-screen-reader-only"
1224
+ >${`${i18nCalendarWeekNumber[this._language.current]} ${weekNumber}`}</span
1225
+ >
1226
+ <span aria-hidden="true">${weekNumber}</span>
1227
+ `}
1228
+ </th>
1229
+ `)}
1230
+ </tr>
1231
+ </thead>
1232
+ ` : nothing}
1233
+ <tbody>
1234
+ ${weeks.map((week, rowIndex) => {
1235
+ const weekday = this._weekdays[rowIndex];
1236
+ return html`
1237
+ <tr>
1238
+ <td class="sbb-calendar__table-header-cell-vertical">
1239
+ ${this.multiple ? html`
1240
+ <sbb-calendar-weekday
1241
+ .value=${weekday}
1242
+ @click=${() => this._selectMultipleDates(week)}
1243
+ >
1244
+ ${weekday.narrow}
1245
+ </sbb-calendar-weekday>
1246
+ ` : html`
1247
+ <span class="sbb-screen-reader-only">${weekday.long}</span>
1248
+ <span aria-hidden="true">${weekday.narrow}</span>
1249
+ `}
1250
+ </td>
1251
+ ${rowIndex < weekOffset ? html`<td class="sbb-calendar__table-data"></td>` : nothing}
1252
+ ${this._createDayCells(week)}
1253
+ </tr>
1254
+ `;
1255
+ })}
1256
+ </tbody>
1257
+ </table>
1258
+ </div>
1259
+ `;
1260
+ }
1261
+ _createDayTableControls(monthLabel) {
1262
+ return this._fixedMonth ? [] : [
1263
+ this._getArrow("left", () => this._goToDifferentMonth(-1), i18nPreviousMonth[this._language.current], this._previousMonthDisabled()),
1264
+ this._getArrow("right", () => this._goToDifferentMonth(1), i18nNextMonth[this._language.current], this._nextMonthDisabled()),
1265
+ this._getArrow("up", () => {
1266
+ this._resetFocus = true;
1267
+ this._calendarView = "year";
1268
+ }, `${i18nYearMonthSelection[this._language.current]} ${monthLabel}`)
1269
+ ];
1270
+ }
1271
+ /** Creates the cells for the daily view. */
1272
+ _createDayCells(week) {
1273
+ return week.map((day) => {
1274
+ return html`
1275
+ <td class="sbb-calendar__table-data sbb-calendar__day-cell">
1276
+ <slot name=${day.value}>
1277
+ <sbb-calendar-day slot=${day.value}></sbb-calendar-day>
1278
+ </slot>
1279
+ </td>
1280
+ `;
1281
+ });
1282
+ }
1283
+ /** Render the view for the month selection. */
1284
+ _renderMonthView() {
1285
+ return html`
1286
+ <div class="sbb-calendar__table-wrapper sbb-calendar__month-view">
1287
+ <div class="sbb-calendar__table-header">
1288
+ <span>${this._chosenYear}</span>
1289
+ ${this._fixedMonth ? [] : [
1290
+ this._getArrow("left", () => this._goToDifferentYear(-1), i18nPreviousYear[this._language.current], this._previousYearDisabled()),
1291
+ this._getArrow("right", () => this._goToDifferentYear(1), i18nNextYear[this._language.current], this._nextYearDisabled()),
1292
+ this._getArrow("down", () => this._resetCalendarViewAndEmitMonthChange(), i18nCalendarDateSelection[this._language.current])
1293
+ ]}
1294
+ <span class="sbb-screen-reader-only" role="status">${this._chosenYear}</span>
1295
+ </div>
1296
+ <table class="sbb-calendar__table">
1297
+ <tbody>
1298
+ ${this._months.map((row) => html`
1299
+ <tr>
1300
+ ${row.map((month) => {
1301
+ return html`
1302
+ <td class="sbb-calendar__table-data">
1303
+ <sbb-calendar-month
1304
+ .value="${this._chosenYear}-${month.value}"
1305
+ @click=${() => this._onMonthSelection(month.monthValue, this._chosenYear)}
1306
+ @keydown=${(evt) => this._handleKeyboardEvent(evt)}
1307
+ >
1308
+ </sbb-calendar-month>
1309
+ </td>
1310
+ `;
1311
+ })}
1312
+ </tr>
1313
+ `)}
1314
+ </tbody>
1315
+ </table>
1316
+ </div>
1317
+ `;
1318
+ }
1319
+ /** Select the month and change the view to day selection. */
1320
+ _onMonthSelection(month, year) {
1321
+ this._chosenMonth = month;
1322
+ this._calendarView = "day";
1323
+ this._init(this._dateAdapter.createDate(year, this._chosenMonth, this._dateAdapter.getDate(this._activeDate)));
1324
+ this._emitMonthChange();
1325
+ }
1326
+ /** Render the view for the year selection. */
1327
+ _renderYearView() {
1328
+ const firstYear = this._years.flat(2)[0];
1329
+ const lastYearArray = this._years.at(-1).flat();
1330
+ const yearLabel = `${firstYear} - ${lastYearArray[lastYearArray.length - 1]}`;
1331
+ return html`
1332
+ <div class="sbb-calendar__table-wrapper sbb-calendar__year-view">
1333
+ <div class="sbb-calendar__table-header">
1334
+ <span>${yearLabel}</span>
1335
+ ${this._fixedMonth ? [] : [
1336
+ this._getArrow("left", () => this._goToDifferentYearRange(-24), i18nPreviousYearRange(YEARS_PER_PAGE)[this._language.current], this._previousYearRangeDisabled()),
1337
+ this._getArrow("right", () => this._goToDifferentYearRange(YEARS_PER_PAGE), i18nNextYearRange(YEARS_PER_PAGE)[this._language.current], this._nextYearRangeDisabled()),
1338
+ this._getArrow("down", () => this._resetCalendarViewAndEmitMonthChange(), i18nCalendarDateSelection[this._language.current])
1339
+ ]}
1340
+ <span class="sbb-screen-reader-only" role="status">${yearLabel}</span>
1341
+ </div>
1342
+ <table class="sbb-calendar__table">
1343
+ <tbody>
1344
+ ${this._years.map((row) => html` <tr>
1345
+ ${row.map((year) => {
1346
+ return html`
1347
+ <td class="sbb-calendar__table-data">
1348
+ <sbb-calendar-year
1349
+ .value=${String(year)}
1350
+ @keydown=${(evt) => this._handleKeyboardEvent(evt)}
1351
+ @click=${() => this._onYearSelection(year)}
1352
+ >
1353
+ </sbb-calendar-year>
1354
+ </td>
1355
+ `;
1356
+ })}
1357
+ </tr>`)}
1358
+ </tbody>
1359
+ </table>
1360
+ </div>
1361
+ `;
1362
+ }
1363
+ /** Select the year and change the view to month selection. */
1364
+ _onYearSelection(year) {
1365
+ this._chosenYear = year;
1366
+ this._calendarView = "month";
1367
+ this._assignActiveDate(this._dateAdapter.createDate(this._chosenYear, this._dateAdapter.getMonth(this._activeDate), this._dateAdapter.getDate(this._activeDate)));
1368
+ }
1369
+ /** Creates the button arrow for all the views. */
1370
+ _getArrow(direction, click, ariaLabel, disabled = false) {
1371
+ return html`<sbb-secondary-button
1372
+ class="sbb-calendar__control"
1373
+ size="s"
1374
+ icon-name="chevron-small-${direction}-small"
1375
+ aria-label=${ariaLabel}
1376
+ @click=${click}
1377
+ ?disabled=${disabled}
1378
+ ></sbb-secondary-button>`;
1379
+ }
1380
+ _getView() {
1381
+ switch (this._calendarView) {
1382
+ case "year": return this._renderYearView();
1383
+ case "month": return this._renderMonthView();
1384
+ default: return nothing;
1385
+ }
1386
+ }
1387
+ render() {
1388
+ if (isServer || this.hydrationRequired) return html`${nothing}`;
1389
+ return html`<div class="sbb-calendar__wrapper">
1390
+ ${this.orientation === "horizontal" ? this._weeks.map((weeks, i) => this._createDayTable(weeks, this._weekNumbers[i], i === 0)) : this._weeks.map((weeks, i) => this._createDayTableVertical(weeks, this._weekNumbers[i], i === 0))}
1391
+ ${this._getView()}
1392
+ </div>`;
1393
+ }
1394
+ };
1395
+ })();
1396
+ //#endregion
1397
+ export { SbbDateSelectedEvent as n, SbbMonthChangeEvent as r, SbbCalendarElement as t };
1398
+
1399
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LUJtQjhIb1p0LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9jYWxlbmRhci9jYWxlbmRhci9jYWxlbmRhci5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9jYWxlbmRhci9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiQHVzZSAnLi4vLi4vY29yZS9zdHlsZXMnIGFzIHNiYjtcblxuOmhvc3Qge1xuICBkaXNwbGF5OiBibG9jaztcblxuICAvLyBXZSBhZGQgd2lkdGggZGVmaW5pdGlvbiB0byBob3N0LCB0byBtYWtlIG92ZXJ3cml0aW5nIGVhc3kgZm9yIGNvbnN1bWVycy5cbiAgd2lkdGg6IG1heC1jb250ZW50O1xuICBtYXgtd2lkdGg6IDEwMCU7XG5cbiAgLy8gU2V0IHRoZSBsaW5lLWhlaWdodCBmb3IgYWRqYWNlbnQgZWxlbWVudHMgaW4gb3JkZXIgdG8gcHJldmVudCBmcm9tIGluZmx1ZW5jZSBvZiBhIGNvbnN1bWVyLXNldCBsaW5lLWhlaWdodC5cbiAgbGluZS1oZWlnaHQ6IHZhcigtLXNiYi10eXBvLWxpbmUtaGVpZ2h0LXRleHQpO1xufVxuXG46aG9zdCg6c3RhdGUoZW5oYW5jZWQpKSB7XG4gIC0tc2JiLWNhbGVuZGFyLWNlbGwtcGFkZGluZy1ibG9jay1lbmQ6IHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTN4KTtcbn1cblxuLnNiYi1jYWxlbmRhcl9fd3JhcHBlciB7XG4gIHdpZHRoOiAxMDAlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGdhcDogdmFyKC0tc2JiLWNhbGVuZGFyLXRhYmxlcy1nYXApO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbjppcyguc2JiLWNhbGVuZGFyX195ZWFyLXZpZXcsIC5zYmItY2FsZW5kYXJfX21vbnRoLXZpZXcpIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBpbnNldC1ibG9jay1zdGFydDogMDtcbiAgaW5zZXQtaW5saW5lLXN0YXJ0OiAwO1xufVxuXG4uc2JiLWNhbGVuZGFyX19kYXktdmlldyB7XG4gIDpob3N0KDpub3QoOnN0YXRlKHZpZXctZGF5KSkpICYge1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgfVxufVxuXG4uc2JiLWNhbGVuZGFyX190YWJsZS1oZWFkZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IHZhcigtLXNiYi1jYWxlbmRhci1jb250cm9sLWdhcCk7XG4gIGhlaWdodDogdmFyKC0tc2JiLXNpemUtZWxlbWVudC14cyk7XG4gIG1hcmdpbi1ibG9jay1lbmQ6IHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTR4KTtcbn1cblxuLnNiYi1jYWxlbmRhcl9fdGFibGUtaGVhZGVyIHNwYW4ge1xuICBmbGV4OiAxIDEgYXV0bztcbiAgcGFkZGluZy1pbmxpbmUtc3RhcnQ6IHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTN4KTtcbiAgY29sb3I6IHZhcigtLXNiYi1jYWxlbmRhci1jb250cm9sLXZpZXctY2hhbmdlLWNvbG9yKTtcbn1cblxuLnNiYi1jYWxlbmRhcl9fY29udHJvbCB7XG4gIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbi5zYmItY2FsZW5kYXJfX3RhYmxlIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gIGhlaWdodDogbWF4LWNvbnRlbnQ7XG4gIGZsZXg6IDAgMDtcbn1cblxuLnNiYi1jYWxlbmRhcl9fdGFibGUgOmlzKHRoZWFkLCB0Ym9keSkge1xuICAvLyBEZXBlbmRpbmcgd2hlcmUgaW4gdGhlIERPTSBpdCdzIHVzZWQsIGl0J3MgcG9zc2libGUgdGhhdCBicm93c2VyIGRlZmF1bHRzIHNldCB0ZXh0LWFsaWduIHRvIGxlZnQuXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLnNiYi1jYWxlbmRhcl9fdGFibGUtaGVhZGVyLWNlbGwsXG4uc2JiLWNhbGVuZGFyX190YWJsZS1oZWFkZXItY2VsbC12ZXJ0aWNhbCB7XG4gIHdpZHRoOiB2YXIoLS1zYmItY2FsZW5kYXItY2VsbC1zaXplKTtcbiAgbWluLXdpZHRoOiB2YXIoLS1zYmItY2FsZW5kYXItY2VsbC1zaXplKTtcbiAgY29sb3I6IHZhcigtLXNiYi1jYWxlbmRhci1oZWFkZXItY29sb3IpO1xuICBwYWRkaW5nOiAwO1xuICBmb250LXNpemU6IHZhcigtLXNiYi10ZXh0LWZvbnQtc2l6ZS14cyk7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxldHRlci1zcGFjaW5nOiB2YXIoLS1zYmItdHlwby1sZXR0ZXItc3BhY2luZy10ZXh0KTtcblxuICA6aG9zdCg6bm90KFttdWx0aXBsZV0pKSAmIHtcbiAgICBoZWlnaHQ6IHZhcigtLXNiYi1jYWxlbmRhci1jZWxsLXNpemUpO1xuICB9XG59XG5cbi5zYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlci1jZWxsLXZlcnRpY2FsIHtcbiAgcGFkZGluZy1ibG9jay1lbmQ6IHZhcigtLXNiYi1jYWxlbmRhci1jZWxsLXBhZGRpbmctYmxvY2stZW5kKTtcbn1cblxuLnNiYi1jYWxlbmRhcl9fdGFibGUtZGF0YSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgcGFkZGluZzogMDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4uc2JiLWNhbGVuZGFyX19kYXktY2VsbCB7XG4gIHBhZGRpbmctYmxvY2stZW5kOiB2YXIoLS1zYmItY2FsZW5kYXItY2VsbC1wYWRkaW5nLWJsb2NrLWVuZCk7XG59XG5cbnNiYi1jYWxlbmRhci1kYXkge1xuICA6aG9zdCg6bm90KDpzdGF0ZShlbmhhbmNlZCkpKSAmIHtcbiAgICAtLXNiYi1jYWxlbmRhci1kYXktanVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgLS1zYmItY2FsZW5kYXItZGF5LWhlaWdodDogdmFyKC0tc2JiLWNhbGVuZGFyLWRheS1zaXplKTtcbiAgICAtLXNiYi1jYWxlbmRhci1kYXktZXh0cmEtZGlzcGxheTogbm9uZTtcbiAgICAtLXNiYi1jYWxlbmRhci1kYXktdmFsdWUtaGVpZ2h0OiB1bnNldDtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgdHlwZSBDU1NSZXN1bHRHcm91cCxcbiAgaHRtbCxcbiAgaXNTZXJ2ZXIsXG4gIG5vdGhpbmcsXG4gIHR5cGUgUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgdHlwZSBQcm9wZXJ0eVZhbHVlcyxcbiAgdHlwZSBUZW1wbGF0ZVJlc3VsdCxcbiAgdW5zYWZlQ1NTLFxufSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBTYmJTZWNvbmRhcnlCdXR0b25FbGVtZW50IH0gZnJvbSAnLi4vLi4vYnV0dG9uLnB1cmUudHMnO1xuaW1wb3J0IHtcbiAgYnV0dG9uUmVzZXRTdHlsZXMsXG4gIHR5cGUgRGF0ZUFkYXB0ZXIsXG4gIGRlZmF1bHREYXRlQWRhcHRlcixcbiAgZm9yY2VUeXBlLFxuICB0eXBlIEZvcm1SZXN0b3JlUmVhc29uLFxuICB0eXBlIEZvcm1SZXN0b3JlU3RhdGUsXG4gIGhhbmRsZURpc3RpbmN0Q2hhbmdlLFxuICBpMThuQ2FsZW5kYXJEYXRlU2VsZWN0aW9uLFxuICBpMThuQ2FsZW5kYXJXZWVrTnVtYmVyLFxuICBpMThuTmV4dE1vbnRoLFxuICBpMThuTmV4dFllYXIsXG4gIGkxOG5OZXh0WWVhclJhbmdlLFxuICBpMThuUHJldmlvdXNNb250aCxcbiAgaTE4blByZXZpb3VzWWVhcixcbiAgaTE4blByZXZpb3VzWWVhclJhbmdlLFxuICBpMThuWWVhck1vbnRoU2VsZWN0aW9uLFxuICBpc0Fycm93S2V5T3JQYWdlS2V5c1ByZXNzZWQsXG4gIE1PTkRBWSxcbiAgcGxhaW5EYXRlLFxuICByZWFkQ29uZmlnLFxuICBTYmJFbGVtZW50LFxuICB0eXBlIFNiYkVsZW1lbnRUeXBlLFxuICBTYmJGb3JtQXNzb2NpYXRlZE1peGluLFxuICBTYmJMYW5ndWFnZUNvbnRyb2xsZXIsXG4gIHNjcmVlblJlYWRlck9ubHlTdHlsZXMsXG4gIFRIVVJTREFZLFxuICBUVUVTREFZLFxuICBXRURORVNEQVksXG59IGZyb20gJy4uLy4uL2NvcmUudHMnO1xuaW1wb3J0IHsgU2JiSWNvbkVsZW1lbnQgfSBmcm9tICcuLi8uLi9pY29uLnB1cmUudHMnO1xuaW1wb3J0IHsgU2JiQ2FsZW5kYXJEYXlFbGVtZW50IH0gZnJvbSAnLi4vY2FsZW5kYXItZGF5L2NhbGVuZGFyLWRheS5jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgU2JiQ2FsZW5kYXJNb250aEVsZW1lbnQgfSBmcm9tICcuLi9jYWxlbmRhci1tb250aC9jYWxlbmRhci1tb250aC5jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgU2JiQ2FsZW5kYXJXZWVrZGF5RWxlbWVudCB9IGZyb20gJy4uL2NhbGVuZGFyLXdlZWtkYXkvY2FsZW5kYXItd2Vla2RheS5jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgU2JiQ2FsZW5kYXJXZWVrbnVtYmVyRWxlbWVudCB9IGZyb20gJy4uL2NhbGVuZGFyLXdlZWtudW1iZXIvY2FsZW5kYXItd2Vla251bWJlci5jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgU2JiQ2FsZW5kYXJZZWFyRWxlbWVudCB9IGZyb20gJy4uL2NhbGVuZGFyLXllYXIvY2FsZW5kYXIteWVhci5jb21wb25lbnQudHMnO1xuaW1wb3J0IHR5cGUgeyBTYmJDYWxlbmRhckNlbGxCYXNlRWxlbWVudCB9IGZyb20gJy4uL2NvbW1vbi9jYWxlbmRhci1jZWxsLWJhc2UtZWxlbWVudC50cyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL2NhbGVuZGFyLnNjc3M/aW5saW5lJztcblxuY29uc3QgREFZU19QRVJfUk9XOiBudW1iZXIgPSA3O1xuY29uc3QgTU9OVEhTX1BFUl9ST1c6IG51bWJlciA9IDQ7XG5jb25zdCBZRUFSU19QRVJfUk9XOiBudW1iZXIgPSA0O1xuY29uc3QgTU9OVEhTX1BFUl9QQUdFOiBudW1iZXIgPSAxMjtcbmNvbnN0IFlFQVJTX1BFUl9QQUdFOiBudW1iZXIgPSAyNDtcblxuZXhwb3J0IGNsYXNzIFNiYk1vbnRoQ2hhbmdlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3JhbmdlOiByZWFkb25seSBEYXlbXTtcblxuICBwdWJsaWMgZ2V0IHJhbmdlKCk6IHJlYWRvbmx5IERheVtdIHtcbiAgICByZXR1cm4gdGhpcy5fcmFuZ2U7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IocmFuZ2U6IHJlYWRvbmx5IERheVtdKSB7XG4gICAgc3VwZXIoJ21vbnRoY2hhbmdlJywgeyBidWJibGVzOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSB9KTtcbiAgICB0aGlzLl9yYW5nZSA9IE9iamVjdC5mcmVlemUocmFuZ2UgfHwgW10pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTYmJEYXRlU2VsZWN0ZWRFdmVudDxUPiBleHRlbmRzIEV2ZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGF0ZVNlbGVjdGVkOiBSZWFkb25seTxUIHwgVFtdPjtcblxuICBwdWJsaWMgZ2V0IGRhdGVTZWxlY3RlZCgpOiBSZWFkb25seTxUIHwgVFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGVTZWxlY3RlZDtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRlczogVCB8IFRbXSkge1xuICAgIHN1cGVyKCdkYXRlc2VsZWN0ZWQnLCB7IGJ1YmJsZXM6IHRydWUsIGNvbXBvc2VkOiB0cnVlIH0pO1xuICAgIHRoaXMuX2RhdGVTZWxlY3RlZCA9IE9iamVjdC5mcmVlemUoZGF0ZXMpO1xuICB9XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBuZWVkZWQgaW4geWVhciBhbmQgbW9udGggdmlld3MgdG8gY29ycmVjdGx5IGNhbGN1bGF0ZSB0aGUgbmV4dCBlbGVtZW50IGluIGtleWJvYXJkIG5hdmlnYXRpb24uXG4gKlxuICogVGhlIGNlbGwncyBpbmRleCBhbmQgdGhlIGVsZW1lbnQncyBpbmRleCBpbiBpdHMgbW9udGggLyB5ZWFyIGJhdGNoIG11c3QgYmUgZGlzdGluZ3Vpc2hlZDpcbiAqIHRoZSBmaXJzdCBpcyB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGFycmF5IG9mIGFsbCB0aGUgcmVuZGVyZWQgY2VsbHMsIHdoaWxlIHRoZSBzZWNvbmQgaXMgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHJlbGF0aXZlIHRvIGl0cyB0YWJsZS5cbiAqIEluIG5vbi13aWRlIG1vZGUsIHRoZSB3dG8gYXJlIHRoZSBzYW1lLCB3aGlsZSBpbiB3aWRlIG1vZGUgdGhlIGNlbGwncyBpbmRleCBjYW4gZ28gZnJvbSAwIHRvIDQ3IGZvciB5ZWFycyBhbmQgZnJvbSAwIHRvIDIzIGZvciBtb250aHMsXG4gKiB3aGlsZSB0aGUgZWxlbWVudCBpbmRleCBnb2VzIGZyb20gMCB0bywgcmVzcGVjdGl2ZWx5LCAyMyBhbmQgMTEuXG4gKi9cbmludGVyZmFjZSBDYWxlbmRhcktleWJvYXJkTmF2aWdhdGlvbk1vbnRoWWVhclZpZXdzUGFyYW1ldGVycyB7XG4gIC8qKiBUaGUgZWxlbWVudCBpbmRleCB3aXRoaW4gaXRzIHllYXIgb3IgbW9udGggcmFuZ2UuICovXG4gIGVsZW1lbnRJbmRleEZvcldpZGVNb2RlOiBudW1iZXI7XG4gIC8qKiBJbiB3aWRlIG1vZGUsIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2Vjb25kIHBhbmVsLCBvciwgYWx0ZXJuYXRpdmVseSwgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZmlyc3QgcGFuZWwuICovXG4gIG9mZnNldEZvcldpZGVNb2RlOiBudW1iZXI7XG4gIC8qKiBUaGUgaW5kZXggb2YgdGhlIGxhc3QgZWxlbWVudCB3aXRoaW4gdGhlIGVsZW1lbnQncyBtb250aCAob3IgeWVhciByYW5nZSkuICovXG4gIGxhc3RFbGVtZW50SW5kZXhGb3JXaWRlTW9kZTogbnVtYmVyO1xuICAvKiogVGhlIG51bWJlciBvZiBjZWxscyBkaXNwbGF5ZWQgaW4gYSBzaW5nbGUgcm93LCBkZXBlbmRpbmcgb24gdGhlIHJlbmRlcmVkIHZpZXcuICovXG4gIHZlcnRpY2FsT2Zmc2V0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF5PFQgPSBEYXRlPiB7XG4gIC8qKiBEYXRlIGFzIElTTyBzdHJpbmcuICovXG4gIHZhbHVlOiBzdHJpbmc7XG4gIGRheVZhbHVlOiBzdHJpbmc7XG4gIG1vbnRoVmFsdWU6IHN0cmluZztcbiAgeWVhclZhbHVlOiBzdHJpbmc7XG4gIGRhdGVWYWx1ZTogVDtcbiAgd2Vla1ZhbHVlOiBudW1iZXI7XG4gIHdlZWtEYXlWYWx1ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vbnRoQ2VsbCB7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIG1vbnRoVmFsdWU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWVrZGF5IHtcbiAgbG9uZzogc3RyaW5nO1xuICBuYXJyb3c6IHN0cmluZztcbn1cblxuLyoqXG4gKiBJdCBkaXNwbGF5cyBhIGNhbGVuZGFyIHdoaWNoIGFsbG93cyBjaG9vc2luZyBhIGRhdGUuXG4gKlxuICogQHNsb3QgLSBVc2UgdGhlIHVubmFtZWQgc2xvdCB0byBhZGQgY3VzdG9taXplZCBgc2JiLWNhbGVuZGFyLWRheWAgZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTYmJDYWxlbmRhckVsZW1lbnQ8VCA9IERhdGU+IGV4dGVuZHMgU2JiRm9ybUFzc29jaWF0ZWRNaXhpbihTYmJFbGVtZW50KSB7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgcmVhZG9ubHkgZWxlbWVudE5hbWU6IHN0cmluZyA9ICdzYmItY2FsZW5kYXInO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGVsZW1lbnREZXBlbmRlbmNpZXM6IFNiYkVsZW1lbnRUeXBlW10gPSBbXG4gICAgU2JiQ2FsZW5kYXJEYXlFbGVtZW50LFxuICAgIFNiYkNhbGVuZGFyTW9udGhFbGVtZW50LFxuICAgIFNiYkNhbGVuZGFyV2Vla2RheUVsZW1lbnQsXG4gICAgU2JiQ2FsZW5kYXJXZWVrbnVtYmVyRWxlbWVudCxcbiAgICBTYmJDYWxlbmRhclllYXJFbGVtZW50LFxuICAgIFNiYkljb25FbGVtZW50LFxuICAgIFNiYlNlY29uZGFyeUJ1dHRvbkVsZW1lbnQsXG4gIF07XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IFtcbiAgICBidXR0b25SZXNldFN0eWxlcyxcbiAgICBzY3JlZW5SZWFkZXJPbmx5U3R5bGVzLFxuICAgIHVuc2FmZUNTUyhzdHlsZSksXG4gIF07XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIGRhdGVzZWxlY3RlZDogJ2RhdGVzZWxlY3RlZCcsXG4gICAgbW9udGhjaGFuZ2U6ICdtb250aGNoYW5nZScsXG4gIH0gYXMgY29uc3Q7XG5cbiAgLyoqXG4gICAqIFRoZSBhbW91bnQgb2YgbW9udGhzIHRvIGRpc3BsYXkgaW4gdGhpcyBjYWxlbmRhci5cbiAgICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIGFtb3VudDogbnVtYmVyID0gMTtcblxuICAvKiogVGhlIGluaXRpYWwgdmlldyBvZiB0aGUgY2FsZW5kYXIgd2hpY2ggc2hvdWxkIGJlIGRpc3BsYXllZCBvbiBvcGVuaW5nLiAqL1xuICBAcHJvcGVydHkoKSBwdWJsaWMgYWNjZXNzb3IgdmlldzogJ2RheScgfCAnbW9udGgnIHwgJ3llYXInID0gJ2RheSc7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHZhbGlkIGRhdGUuIEFjY2VwdHMgYSBkYXRlIG9iamVjdCBvciBudWxsLlxuICAgKiBBY2NlcHRzIGFuIElTTzg2MDEgZm9ybWF0dGVkIHN0cmluZyAoZS5nLiAyMDI0LTEyLTI0KSBhcyBhdHRyaWJ1dGUuXG4gICAqL1xuICBAcGxhaW5EYXRlKClcbiAgQHByb3BlcnR5KClcbiAgcHVibGljIGFjY2Vzc29yIG1pbjogVCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB2YWxpZCBkYXRlLiBBY2NlcHRzIGEgZGF0ZSBvYmplY3Qgb3IgbnVsbC5cbiAgICogQWNjZXB0cyBhbiBJU084NjAxIGZvcm1hdHRlZCBzdHJpbmcgKGUuZy4gMjAyNC0xMi0yNCkgYXMgYXR0cmlidXRlLlxuICAgKi9cbiAgQHBsYWluRGF0ZSgpXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBhY2Nlc3NvciBtYXg6IFQgfCBudWxsID0gbnVsbDtcblxuICAvKiogV2hldGhlciB0aGUgY2FsZW5kYXIgYWxsb3dzIGZvciBtdWx0aXBsZSBkYXRlIHNlbGVjdGlvbi4gKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBoYW5kbGVEaXN0aW5jdENoYW5nZSgoZTogU2JiQ2FsZW5kYXJFbGVtZW50PFQ+LCBuZXdWYWx1ZTogYm9vbGVhbikgPT5cbiAgICBlLl9vbk11bHRpcGxlQ2hhbmdlZChuZXdWYWx1ZSksXG4gIClcbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIHNlbGVjdGVkIGRhdGU6IGFjY2VwdHMgYSBkYXRlIG9iamVjdCwgb3IsIGlmIGBtdWx0aXBsZWAsIGFuIGFycmF5IG9mIGRhdGVzLlxuICAgKi9cbiAgQHByb3BlcnR5KClcbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogVCB8IFRbXSB8IG51bGwpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWVcbiAgICAgICAgLm1hcCgoZGF0ZUxpa2U6IFQpID0+XG4gICAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGRhdGVMaWtlKSksXG4gICAgICAgIClcbiAgICAgICAgLmZpbHRlcigoZGF0ZTogVCB8IG51bGwpOiBkYXRlIGlzIFQgPT4gZGF0ZSAhPT0gbnVsbClcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoZGF0ZTogVCkgPT5cbiAgICAgICAgICAgICF0aGlzLl9pc0RheUluUmFuZ2UodGhpcy5fZGF0ZUFkYXB0ZXIudG9Jc284NjAxKGRhdGUpKSB8fCB0aGlzLl9kYXRlRmlsdGVyKGRhdGUpLFxuICAgICAgICApXG4gICAgICAgIC5zb3J0KHRoaXMuX3NvcnREYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2VsZWN0ZWREYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSksXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICAhIXNlbGVjdGVkRGF0ZSAmJlxuICAgICAgICAoIXRoaXMuX2lzRGF5SW5SYW5nZSh0aGlzLl9kYXRlQWRhcHRlci50b0lzbzg2MDEoc2VsZWN0ZWREYXRlKSkgfHxcbiAgICAgICAgICB0aGlzLl9kYXRlRmlsdGVyKHNlbGVjdGVkRGF0ZSkpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSBzZWxlY3RlZERhdGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogVCB8IFRbXSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBAc3RhdGUoKSBwcml2YXRlIGFjY2Vzc29yIF92YWx1ZTogVCB8IFRbXSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBBIGZ1bmN0aW9uIHVzZWQgdG8gZmlsdGVyIG91dCBkYXRlcy4gKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZGF0ZS1maWx0ZXInIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBkYXRlRmlsdGVyOiAoKGRhdGU6IFQgfCBudWxsKSA9PiBib29sZWFuKSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgdGhpcyB3aXRoIHRoZSBmb3JtYXQgYFlZWVktTU1gIHRvIGxpbWl0IHRoZSBjYWxlbmRhciB0byBhIHNwZWNpZmljIG1vbnRoLFxuICAgKiBhbmQgcHJldmVudCBuYXZpZ2F0aW9uIHRvIG90aGVyIG1vbnRocy5cbiAgICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdmaXhlZC1tb250aCcgfSlcbiAgcHVibGljIHNldCBmaXhlZE1vbnRoKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYXRjaCA9IHZhbHVlID8gdmFsdWUubWF0Y2goL14oXFxkezR9KS0oXFxkezJ9KSQvKSA6IG51bGw7XG4gICAgdGhpcy5fZml4ZWRNb250aCA9IG1hdGNoXG4gICAgICA/IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoTnVtYmVyKG1hdGNoWzFdKSwgTnVtYmVyKG1hdGNoWzJdKSwgMSlcbiAgICAgIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGZpeGVkTW9udGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZml4ZWRNb250aFxuICAgICAgPyB0aGlzLl9kYXRlQWRhcHRlci50b0lzbzg2MDEodGhpcy5fZml4ZWRNb250aCkuc3BsaXQoJy0nKS5zbGljZSgwLCAyKS5qb2luKCctJylcbiAgICAgIDogJyc7XG4gIH1cbiAgcHJpdmF0ZSBfZml4ZWRNb250aDogVCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBUaGUgb3JpZW50YXRpb24gb2YgZGF5cyBpbiB0aGUgY2FsZW5kYXIuICovXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUgfSkgcHVibGljIGFjY2Vzc29yIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnID1cbiAgICAnaG9yaXpvbnRhbCc7XG5cbiAgLyoqIFdoZXRoZXIgaXQgaGFzIHRvIGRpc3BsYXkgdGhlIHdlZWsgbnVtYmVycyBpbiBhZGRpdGlvbiB0byB3ZWVrIGRheXMuICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICd3ZWVrLW51bWJlcnMnLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciB3ZWVrTnVtYmVyczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2RhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxUPiA9IHJlYWRDb25maWcoKS5kYXRldGltZT8uZGF0ZUFkYXB0ZXIgPz8gZGVmYXVsdERhdGVBZGFwdGVyO1xuXG4gIC8qKiBUaGUgY3VycmVudGx5IGFjdGl2ZSBkYXRlLiAqL1xuICBAc3RhdGUoKSBwcml2YXRlIGFjY2Vzc29yIF9hY3RpdmVEYXRlOiBUID0gdGhpcy5fZGF0ZUFkYXB0ZXIudG9kYXkoKTtcblxuICBAc3RhdGUoKSBwcml2YXRlIGFjY2Vzc29yIF9jYWxlbmRhclZpZXc6IFNiYkNhbGVuZGFyRWxlbWVudFsndmlldyddID0gJ2RheSc7XG5cbiAgLyoqIEEgbGlzdCBvZiBkYXlzLCBpbiB0d28gZm9ybWF0cyAobG9uZyBhbmQgc2luZ2xlIGNoYXIpLiAqL1xuICBwcml2YXRlIF93ZWVrZGF5cyE6IFdlZWtkYXlbXTtcblxuICAvKiogR3JpZCBvZiBjYWxlbmRhciBjZWxscyByZXByZXNlbnRpbmcgdGhlIGRhdGVzIG9mIHRoZSBtb250aC4gKi9cbiAgcHJpdmF0ZSBfd2Vla3M6IERheTxUPltdW11bXSA9IFtdO1xuXG4gIC8qKiBUaGUgZmlyc3QgdmlzaWJsZSBkYXkgaW4gdGhlIGNhbGVuZGFyLiAqL1xuICBwcml2YXRlIF9maXJzdFZpc2libGVEYXk6IHN0cmluZyA9ICcnO1xuXG4gIC8qKiBUaGUgbGFzdCB2aXNpYmxlIGRheSBpbiB0aGUgY2FsZW5kYXIuICovXG4gIHByaXZhdGUgX2xhc3RWaXNpYmxlRGF5OiBzdHJpbmcgPSAnJztcblxuICAvKiogR3JpZCBvZiBjYWxlbmRhciBjZWxscyByZXByZXNlbnRpbmcgbW9udGhzLiAqL1xuICBwcml2YXRlIF9tb250aHMhOiBNb250aENlbGxbXVtdO1xuXG4gIC8qKiBHcmlkIG9mIGNhbGVuZGFyIGNlbGxzIHJlcHJlc2VudGluZyB5ZWFycy4gKi9cbiAgcHJpdmF0ZSBfeWVhcnMhOiBudW1iZXJbXVtdO1xuXG4gIC8qKiBBbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgbW9udGggbmFtZXMgaW4gdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuICovXG4gIHByaXZhdGUgX21vbnRoTmFtZXM6IHN0cmluZ1tdID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGhOYW1lcygnbG9uZycpO1xuXG4gIC8qKiBBbiBhcnJheSBjb250YWluaW5nIHRoZSB3ZWVrcycgbnVtYmVycyBmb3IgdGhlIGN1cnJlbnQgbW9udGguICovXG4gIHByaXZhdGUgX3dlZWtOdW1iZXJzITogbnVtYmVyW11bXTtcblxuICBwcml2YXRlIF9lbmhhbmNlZFZhcmlhbnQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogQSBsaXN0IG9mIGNhbGVuZGFyJ3MgY2VsbHMgY29ycmVzcG9uZGluZyB0byBkYXlzLCBtb250aHMgb3IgeWVhcnMgZGVwZW5kaW5nIG9uIHRoZSB2aWV3LiAqL1xuICBwcml2YXRlIGdldCBfY2VsbHMoKTogU2JiQ2FsZW5kYXJDZWxsQmFzZUVsZW1lbnQ8VD5bXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb208U2JiQ2FsZW5kYXJDZWxsQmFzZUVsZW1lbnQ8VD4+KFxuICAgICAgKHRoaXMuX2NhbGVuZGFyVmlldyA9PT0gJ2RheSdcbiAgICAgICAgPyAoQXJyYXkuZnJvbSh0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3JBbGwoJ3Nsb3QnKSkuZmxhdE1hcCgoZTogSFRNTFNsb3RFbGVtZW50KSA9PlxuICAgICAgICAgICAgZS5hc3NpZ25lZEVsZW1lbnRzKHsgZmxhdHRlbjogdHJ1ZSB9KSxcbiAgICAgICAgICApIGFzIFNiYkNhbGVuZGFyRGF5RWxlbWVudDxUPltdKVxuICAgICAgICA6IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvckFsbDxTYmJDYWxlbmRhckNlbGxCYXNlRWxlbWVudDxUPj4oXG4gICAgICAgICAgICBgc2JiLWNhbGVuZGFyLSR7dGhpcy5fY2FsZW5kYXJWaWV3fWAsXG4gICAgICAgICAgKSkgPz8gW10sXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBUaGUgY2hvc2VuIHllYXIgaW4gdGhlIHllYXIgc2VsZWN0aW9uIHZpZXcuICovXG4gIHByaXZhdGUgX2Nob3NlblllYXI/OiBudW1iZXI7XG5cbiAgLyoqIFRoZSBjaG9zZW4gbW9udGggaW4gdGhlIHllYXIgc2VsZWN0aW9uIHZpZXcuICovXG4gIHByaXZhdGUgX2Nob3Nlbk1vbnRoPzogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBmb2N1cyBzaG91bGQgYmUgcmVzZXQgb24gZm9jdXNDZWxsLiAqL1xuICBwcml2YXRlIF9yZXNldEZvY3VzID0gZmFsc2U7XG5cbiAgLyoqIFdoZXRoZXIgYW4gZWxlbWVudCBpbnNpZGUgdGhlIGNhbGVuZGFyIGlzIGN1cnJlbnRseSBmb2N1c2VkLiAqL1xuICBwcml2YXRlIF9jb250YWluaW5nRm9jdXMgPSBmYWxzZTtcblxuICBwcml2YXRlIF9sYXN0U2VsZWN0aW9uOiBUIHwgbnVsbCA9IG51bGw7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBhY2Nlc3NvciBfaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIF9sYW5ndWFnZSA9IG5ldyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIodGhpcykud2l0aEhhbmRsZXIoKCkgPT4ge1xuICAgIHRoaXMuX21vbnRoTmFtZXMgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aE5hbWVzKCdsb25nJyk7XG4gICAgdGhpcy5fY3JlYXRlTW9udGhSb3dzKCk7XG4gIH0pO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2NyZWF0ZU1vbnRoUm93cygpO1xuICAgIHRoaXMuX3NldFdlZWtkYXlzKCk7XG5cbiAgICAvLyBXZSBuZWVkIHRvIHRyYWNrIHRoZSBmb2N1cyBhcyB3ZSBzaG91bGQgb25seSB0YWtlIGZvY3VzIGludG8gdGhlIGNhbGVuZGFyLCB3aGVuIHRoZVxuICAgIC8vIGZvY3VzIHdhcyBvbmNlIHNldCBpbnRvIHRoZSBjYWxlbmRhci5cbiAgICAvLyBGb3Igc2hhZG93IERPTSBjb21wYXRpYmlsaXR5IHdlIG5lZWQgdG8gdHJhY2sgdGhpcyBwcm9ncmFtbWF0aWNhbGx5LlxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsICgpID0+ICh0aGlzLl9jb250YWluaW5nRm9jdXMgPSB0cnVlKSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsICgpID0+ICh0aGlzLl9jb250YWluaW5nRm9jdXMgPSBmYWxzZSkpO1xuICAgIGNvbnN0IHJlc29sdmVEYXkgPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCB8IEtleWJvYXJkRXZlbnQpOiBTYmJDYWxlbmRhckRheUVsZW1lbnQ8VD4gfCBudWxsID0+XG4gICAgICAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0PFNiYkNhbGVuZGFyRGF5RWxlbWVudDxUPj4oJ3NiYi1jYWxlbmRhci1kYXknKSA/P1xuICAgICAgZXZlbnRcbiAgICAgICAgLmNvbXBvc2VkUGF0aCgpXG4gICAgICAgIC5maW5kKFxuICAgICAgICAgIChlKTogZSBpcyBTYmJDYWxlbmRhckRheUVsZW1lbnQ8VD4gPT4gKGUgYXMgSFRNTEVsZW1lbnQpLmxvY2FsTmFtZSA9PT0gJ3NiYi1jYWxlbmRhci1kYXknLFxuICAgICAgICApID8/XG4gICAgICBudWxsO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGRheSA9IHJlc29sdmVEYXkoZXZlbnQpO1xuICAgICAgaWYgKGRheSkge1xuICAgICAgICB0aGlzLl9zZWxlY3REYXRlKGRheS52YWx1ZSEsIGV2ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGRheSA9IHJlc29sdmVEYXkoZXZlbnQpO1xuICAgICAgaWYgKGRheSkge1xuICAgICAgICB0aGlzLl9oYW5kbGVLZXlib2FyZEV2ZW50KGV2ZW50LCBkYXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+ICh0aGlzLl9sYXN0U2VsZWN0aW9uID0gbnVsbCkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc29ydERhdGUgPSAoYTogVCwgYjogVCk6IG51bWJlciA9PiB0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZShhLCBiKTtcblxuICBwcml2YXRlIF9kYXRlRmlsdGVyKGRhdGU6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlRmlsdGVyPy4oZGF0ZSkgPz8gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBSZXNldHMgdGhlIGFjdGl2ZSBtb250aCBhY2NvcmRpbmcgdG8gdGhlIG5ldyBzdGF0ZSBvZiB0aGUgY2FsZW5kYXIuICovXG4gIHB1YmxpYyByZXNldFBvc2l0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc2V0Q2FsZW5kYXJWaWV3KCk7XG4gICAgdGhpcy5faW5pdCgpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZXNldFBvc2l0aW9uKCk7XG4gICAgdGhpcy5zaGFkb3dSb290Py5hZGRFdmVudExpc3RlbmVyKCdzbG90Y2hhbmdlJywgdGhpcy5fb25TbG90Q2hhbmdlLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnNoYWRvd1Jvb3Q/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nsb3RjaGFuZ2UnLCB0aGlzLl9vblNsb3RDaGFuZ2UsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIG92ZXJyaWRlIGZvcm1SZXNldENhbGxiYWNrKCk6IHZvaWQge31cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBvdmVycmlkZSBmb3JtU3RhdGVSZXN0b3JlQ2FsbGJhY2soXG4gICAgc3RhdGU6IEZvcm1SZXN0b3JlU3RhdGUgfCBudWxsLFxuICAgIHJlYXNvbjogRm9ybVJlc3RvcmVSZWFzb24sXG4gICk6IHZvaWQge1xuICAgIGlmIChyZWFzb24gPT09ICdhdXRvY29tcGxldGUnIHx8IHN0YXRlID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVzdG9yZSA9ICh2YWx1ZTogc3RyaW5nIHwgVCB8IG51bGwpOiBUIHwgbnVsbCA9PlxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMudmFsdWUgPSByZXN0b3JlKHN0YXRlKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMuX3JlYWRGb3JtRGF0YShzdGF0ZSBhcyBGb3JtRGF0YSkudGhlbihcbiAgICAgICAgICAoYXJyYXkpID0+ICh0aGlzLnZhbHVlID0gYXJyYXkubWFwKHJlc3RvcmUpLmZpbHRlcigoZGF0ZSk6IGRhdGUgaXMgVCA9PiBkYXRlICE9IG51bGwpKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbnRyeSA9IHN0YXRlLmdldCh0aGlzLm5hbWUpO1xuICAgICAgaWYgKGVudHJ5IGluc3RhbmNlb2YgQmxvYikge1xuICAgICAgICBlbnRyeS50ZXh0KCkudGhlbigodGV4dCkgPT4gKHRoaXMudmFsdWUgPSByZXN0b3JlKEpTT04ucGFyc2UodGV4dCkpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZhbHVlID0gcmVzdG9yZShlbnRyeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfcmVhZEZvcm1EYXRhKGZvcm1EYXRhOiBGb3JtRGF0YSk6IFByb21pc2U8VFtdPiB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgZm9ybURhdGFcbiAgICAgICAgLmdldEFsbCh0aGlzLm5hbWUpXG4gICAgICAgIC5tYXAoYXN5bmMgKGVudHJ5KSA9PlxuICAgICAgICAgIGVudHJ5IGluc3RhbmNlb2YgQmxvYiA/IEpTT04ucGFyc2UoYXdhaXQgZW50cnkudGV4dCgpKSA6IChlbnRyeSBhcyBUKSxcbiAgICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVzZXRGb2N1cyA9IHRydWU7XG4gICAgdGhpcy5fZm9jdXNDZWxsKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2Ftb3VudCcpIHx8XG4gICAgICBjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ29yaWVudGF0aW9uJykgfHxcbiAgICAgIGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnZml4ZWRNb250aCcpXG4gICAgKSB7XG4gICAgICB0aGlzLnJlc2V0UG9zaXRpb24oKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCd2aWV3JykpIHtcbiAgICAgIHRoaXMuX3NldENob3NlblllYXIoKTtcbiAgICAgIHRoaXMuX2Nob3Nlbk1vbnRoID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fY2FsZW5kYXJWaWV3ID0gdGhpcy52aWV3O1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSByZXF1ZXN0VXBkYXRlKFxuICAgIG5hbWU/OiBQcm9wZXJ0eUtleSxcbiAgICBvbGRWYWx1ZT86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFByb3BlcnR5RGVjbGFyYXRpb24sXG4gICk6IHZvaWQge1xuICAgIHN1cGVyLnJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuXG4gICAgaWYgKG5hbWUgPT09ICdfY2FsZW5kYXJWaWV3Jykge1xuICAgICAgdGhpcy5pbnRlcm5hbHMuc3RhdGVzLmRlbGV0ZShgdmlldy0ke29sZFZhbHVlfWApO1xuICAgICAgdGhpcy5pbnRlcm5hbHMuc3RhdGVzLmFkZChgdmlldy0ke3RoaXMuX2NhbGVuZGFyVmlld31gKTtcbiAgICAgIGlmICh0aGlzLl9jb250YWluaW5nRm9jdXMpIHtcbiAgICAgICAgdGhpcy5fcmVzZXRGb2N1cyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIudXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgLy8gVGhlIGNhbGVuZGFyIG5lZWRzIHRvIGNhbGN1bGF0ZSB0YWItaW5kZXhlcyBvbiBmaXJzdCByZW5kZXIsXG4gICAgLy8gYW5kIGV2ZXJ5IHRpbWUgYSBkYXRlIGlzIHNlbGVjdGVkIG9yIHRoZSBtb250aCB2aWV3IGNoYW5nZXMuXG4gICAgdGhpcy5fc2V0VGFiSW5kZXgoKTtcblxuICAgIC8vIFdoZW4gY2hhbmdpbmcgdmlldyB0byB5ZWFyL21vbnRoLCB0aGUgdGFiaW5kZXggaXMgY2hhbmdlZCwgYnV0IHRoZSBmb2N1c2VkIGVsZW1lbnQgaXMgZ2V0dGluZyBsb3N0LlxuICAgIC8vIFdlIG5lZWQgdG8gY2FsbCBgX2ZvY3VzQ2VsbCgpYCBtZXRob2QgZXhwbGljaXRseSB0byBjb3JyZWN0bHkgc2V0IHRoZSBmb2N1cy5cbiAgICB0aGlzLl9mb2N1c0NlbGwoKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uU2xvdENoYW5nZSA9ICgpOiB2b2lkID0+IHtcbiAgICB0aGlzLl9lbmhhbmNlZFZhcmlhbnQgPSBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pLnNvbWUoXG4gICAgICAoYykgPT4gYy5sb2NhbE5hbWUgPT09ICdzYmItY2FsZW5kYXItZGF5JyxcbiAgICApO1xuICAgIHRoaXMudG9nZ2xlU3RhdGUoJ2VuaGFuY2VkJywgdGhpcy5fZW5oYW5jZWRWYXJpYW50KTtcbiAgICB0aGlzLl9zZXRUYWJJbmRleCgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgYF92YWx1ZWAgc3RhdGUgc2hvdWxkIGJlIGFkYXB0ZWQgd2hlbiB0aGUgYG11bHRpcGxlYCBwcm9wZXJ0eSBjaGFuZ2VzOlxuICAgKiAgIC0gaWYgaXQgY2hhbmdlcyB0byB0cnVlLCB0aGUgJ192YWx1ZScgaXMgc2V0IHRvIGFuIGFycmF5O1xuICAgKiAgIC0gaWYgaXQgY2hhbmdlcyB0byBmYWxzZSwgdGhlIGZpcnN0IGF2YWlsYWJsZSBvcHRpb24gaXMgc2V0IGFzICd2YWx1ZScgb3RoZXJ3aXNlIGl0J3Mgc2V0IHRvIG51bGwuXG4gICAqL1xuICBwcml2YXRlIF9vbk11bHRpcGxlQ2hhbmdlZChpc011bHRpcGxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGlzTXVsdGlwbGUgJiYgIUFycmF5LmlzQXJyYXkodGhpcy5fdmFsdWUpKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHRoaXMuX3ZhbHVlID8gW3RoaXMuX3ZhbHVlIGFzIFRdIDogW107XG4gICAgfVxuICAgIGlmICghaXNNdWx0aXBsZSAmJiBBcnJheS5pc0FycmF5KHRoaXMuX3ZhbHVlKSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSAodGhpcy5fdmFsdWUgYXMgVFtdKS5sZW5ndGggPyAodGhpcy5fdmFsdWUgYXMgVFtdKVswXSA6IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQuICovXG4gIHByaXZhdGUgX2luaXQoYWN0aXZlRGF0ZT86IFQpOiB2b2lkIHtcbiAgICAvLyBEdWUgdG8gaXRzIGNvbXBsZXhpdHksIHRoZSBjYWxlbmRhciBpcyBvbmx5IGluaXRpYWxpemVkIG9uIGNsaWVudCBzaWRlXG4gICAgaWYgKGlzU2VydmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmICh0aGlzLmh5ZHJhdGlvblJlcXVpcmVkKSB7XG4gICAgICB0aGlzLmh5ZHJhdGlvbkNvbXBsZXRlLnRoZW4oKCkgPT4gdGhpcy5faW5pdCgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYWN0aXZlRGF0ZSkge1xuICAgICAgdGhpcy5fYXNzaWduQWN0aXZlRGF0ZShhY3RpdmVEYXRlKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydERhdGUgPSB0aGlzLl9maXhlZE1vbnRoID8/IHRoaXMuX2FjdGl2ZURhdGU7XG4gICAgY29uc3QgYW1vdW50ID0gdGhpcy5hbW91bnQgPCAxID8gMSA6IHRoaXMuYW1vdW50O1xuICAgIHRoaXMuX3dlZWtzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogYW1vdW50IH0sIChfLCBpKSA9PlxuICAgICAgdGhpcy5fY3JlYXRlV2Vla1Jvd3ModGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHMoc3RhcnREYXRlLCBpKSksXG4gICAgKTtcbiAgICBjb25zdCBkYXRlRnJvbUZpcnN0TW9udGggPSB0aGlzLl93ZWVrc1swXVswXVswXS5kYXRlVmFsdWU7XG4gICAgdGhpcy5fZmlyc3RWaXNpYmxlRGF5ID0gdGhpcy5fZGF0ZUFkYXB0ZXIudG9Jc284NjAxKFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkYXRlRnJvbUZpcnN0TW9udGgpLFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChkYXRlRnJvbUZpcnN0TW9udGgpLFxuICAgICAgICAxLFxuICAgICAgKSEsXG4gICAgKTtcbiAgICBjb25zdCBkYXRlRnJvbUxhc3RNb250aCA9IHRoaXMuX3dlZWtzW2Ftb3VudCAtIDFdWzBdWzBdLmRhdGVWYWx1ZTtcbiAgICB0aGlzLl9sYXN0VmlzaWJsZURheSA9IHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMShcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoZGF0ZUZyb21MYXN0TW9udGgpLFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChkYXRlRnJvbUxhc3RNb250aCksXG4gICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE51bURheXNJbk1vbnRoKGRhdGVGcm9tTGFzdE1vbnRoKSxcbiAgICAgICkhLFxuICAgICk7XG5cbiAgICB0aGlzLl95ZWFycyA9IHRoaXMuX2NyZWF0ZVllYXJSb3dzKCk7XG4gICAgdGhpcy5fd2Vla051bWJlcnMgPSB0aGlzLl93ZWVrcy5tYXAoKHdlZWspID0+XG4gICAgICB3ZWVrXG4gICAgICAgIC5mbGF0KClcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEudmFsdWUubG9jYWxlQ29tcGFyZShiLnZhbHVlKSlcbiAgICAgICAgLm1hcCgoZGF5OiBEYXk8VD4pID0+IGRheS53ZWVrVmFsdWUpXG4gICAgICAgIC5maWx0ZXIoKHYsIGksIGEpID0+IGEuaW5kZXhPZih2KSA9PT0gaSksXG4gICAgKTtcbiAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XG4gIH1cblxuICAvKiogRm9jdXNlcyBvbiBhIGRheSBjZWxsIHByaW9yaXRpemluZyB0aGUgc2VsZWN0ZWQgZGF5LCB0aGUgY3VycmVudCBkYXksIGFuZCBsYXN0bHksIHRoZSBmaXJzdCBzZWxlY3RhYmxlIGRheS4gKi9cbiAgcHJpdmF0ZSBfZm9jdXNDZWxsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9yZXNldEZvY3VzKSB7XG4gICAgICB0aGlzLl9nZXRGaXJzdEZvY3VzYWJsZSgpPy5mb2N1cygpO1xuICAgICAgdGhpcy5fcmVzZXRGb2N1cyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSBhcnJheSBvZiB3ZWVrZGF5cy4gKi9cbiAgcHJpdmF0ZSBfc2V0V2Vla2RheXMoKTogdm9pZCB7XG4gICAgY29uc3QgbmFycm93V2Vla2RheXM6IHN0cmluZ1tdID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF5T2ZXZWVrTmFtZXMoJ25hcnJvdycpO1xuICAgIGNvbnN0IGxvbmdXZWVrZGF5czogc3RyaW5nW10gPSB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXlPZldlZWtOYW1lcygnbG9uZycpO1xuICAgIGNvbnN0IHdlZWtkYXlzOiBXZWVrZGF5W10gPSBsb25nV2Vla2RheXMubWFwKChsb25nOiBzdHJpbmcsIGk6IG51bWJlcikgPT4gKHtcbiAgICAgIGxvbmcsXG4gICAgICBuYXJyb3c6IG5hcnJvd1dlZWtkYXlzW2ldLFxuICAgIH0pKTtcblxuICAgIC8vIFJvdGF0ZXMgdGhlIGxhYmVscyBmb3IgZGF5cyBvZiB0aGUgd2VlayBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgY29uc3QgZmlyc3REYXlPZldlZWs6IG51bWJlciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldEZpcnN0RGF5T2ZXZWVrKCk7XG4gICAgdGhpcy5fd2Vla2RheXMgPSB3ZWVrZGF5cy5zbGljZShmaXJzdERheU9mV2VlaykuY29uY2F0KHdlZWtkYXlzLnNsaWNlKDAsIGZpcnN0RGF5T2ZXZWVrKSk7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgcm93cyBhbG9uZyB0aGUgaG9yaXpvbnRhbCBkaXJlY3Rpb24gYW5kIHNldHMgdGhlIHBhcmFtZXRlcnMgdXNlZCBpbiBrZXlib2FyZCBuYXZpZ2F0aW9uLiAqL1xuICBwcml2YXRlIF9jcmVhdGVXZWVrUm93cyh2YWx1ZTogVCk6IERheTxUPltdW10ge1xuICAgIGNvbnN0IGRheXNJbk1vbnRoOiBudW1iZXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXROdW1EYXlzSW5Nb250aCh2YWx1ZSk7XG4gICAgY29uc3Qgd2Vla09mZnNldDogbnVtYmVyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0Rmlyc3RXZWVrT2Zmc2V0KHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnXG4gICAgICA/IHRoaXMuX2NyZWF0ZVdlZWtSb3dzSG9yaXpvbnRhbCh2YWx1ZSwgZGF5c0luTW9udGgsIHdlZWtPZmZzZXQpXG4gICAgICA6IHRoaXMuX2NyZWF0ZVdlZWtSb3dzVmVydGljYWwodmFsdWUsIGRheXNJbk1vbnRoLCB3ZWVrT2Zmc2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSByb3dzIGZvciBlYWNoIHdlZWsgaW4gb3JpZW50YXRpb249J2hvcml6b250YWwnLlxuICAgKlxuICAgKiBJdGVyYXRlcyB0aHJvdWdoIHRoZSBkYXlzIG9mIHRoZSBtb250aHMsIGNyZWF0ZXMgYSBEYXkgb2JqZWN0IGZvciBlYWNoIGFuZCBwdXNoZXMgaXQgaW50byBhbmQgYXJyYXkuXG4gICAqIEVhY2ggc2V2ZW4gZGF5cyAoY29uc2lkZXJpbmcgdGhlIG9mZnNldCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtb250aCkgcmVzdGFydHMgZnJvbSBhbiBlbXB0eSBhcnJheS5cbiAgICpcbiAgICogVGhlIHJlc3VsdCBpcyBhIG1hdHJpeCBpbiB3aGljaCBldmVyeSByb3cgaXMgYSB3ZWVrIChvciBwYXJ0IG9mIGl0LCBjb25zaWRlcmluZyBvZmZzZXQpLlxuICAgKi9cbiAgcHJpdmF0ZSBfY3JlYXRlV2Vla1Jvd3NIb3Jpem9udGFsKHZhbHVlOiBULCBkYXlzSW5Nb250aDogbnVtYmVyLCB3ZWVrT2Zmc2V0OiBudW1iZXIpOiBEYXk8VD5bXVtdIHtcbiAgICBjb25zdCB3ZWVrczogRGF5PFQ+W11bXSA9IFtbXV07XG4gICAgZm9yIChsZXQgaSA9IDAsIGNlbGwgPSB3ZWVrT2Zmc2V0OyBpIDwgZGF5c0luTW9udGg7IGkrKywgY2VsbCsrKSB7XG4gICAgICBpZiAoY2VsbCA9PT0gREFZU19QRVJfUk9XKSB7XG4gICAgICAgIHdlZWtzLnB1c2goW10pO1xuICAgICAgICBjZWxsID0gMDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHZhbHVlKSxcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodmFsdWUpLFxuICAgICAgICBpICsgMSxcbiAgICAgICkhO1xuICAgICAgd2Vla3Nbd2Vla3MubGVuZ3RoIC0gMV0ucHVzaCh0aGlzLl9tYXBEYXRlVG9EYXkoZGF0ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gd2Vla3M7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgcm93cyBmb3IgZWFjaCB3ZWVrIGluIG9yaWVudGF0aW9uPSd2ZXJ0aWNhbCcuXG4gICAqXG4gICAqIENyZWF0ZXMgYSBtYXRyaXggd2l0aCBzZXZlbiBlbXB0eSByb3dzLlxuICAgKiBJdGVyYXRlcyB0aHJvdWdoIHRoZSBkYXlzIG9mIHRoZSBtb250aHMsIGNyZWF0ZXMgYSBEYXkgb2JqZWN0IGZvciBlYWNoXG4gICAqIGFuZCBwdXNoZXMgaXQgaW50byB0aGUgY29ycmVjdCBhcnJheSBjb25zaWRlcmluZyB0aGUgb2Zmc2V0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1vbnRoLlxuICAgKiBFYWNoIHNldmVuIGRheXMgKGluY2x1ZGluZyBvZmZzZXQpIHJlc3RhcnRzIGZyb20gdGhlIGZpcnN0LlxuICAgKlxuICAgKiBUaGUgcmVzdWx0IGlzIGEgbWF0cml4IGluIHdoaWNoIGV2ZXJ5IHJvdyBpcyBhIHNldCBvZiB3ZWVrZGF5cywgc286XG4gICAqIC0gcm93IDA6IGFsbCB0aGUgTW9uZGF5cztcbiAgICogLSByb3cgMTogYWxsIHRoZSBUdWVzZGF5cztcbiAgICogLSAuLi5cbiAgICogLSByb3cgNzogYWxsIHRoZSBTdW5kYXlzLlxuICAgKi9cbiAgcHJpdmF0ZSBfY3JlYXRlV2Vla1Jvd3NWZXJ0aWNhbCh2YWx1ZTogVCwgZGF5c0luTW9udGg6IG51bWJlciwgd2Vla09mZnNldDogbnVtYmVyKTogRGF5PFQ+W11bXSB7XG4gICAgY29uc3Qgd2Vla3M6IERheTxUPltdW10gPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBEQVlTX1BFUl9ST1cgfSwgKCkgPT4gW10pO1xuICAgIGZvciAobGV0IGkgPSAwLCBjZWxsID0gd2Vla09mZnNldDsgaSA8IGRheXNJbk1vbnRoOyBpKyssIGNlbGwrKykge1xuICAgICAgaWYgKGNlbGwgPT09IERBWVNfUEVSX1JPVykge1xuICAgICAgICBjZWxsID0gMDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHZhbHVlKSxcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodmFsdWUpLFxuICAgICAgICBpICsgMSxcbiAgICAgICkhO1xuICAgICAgd2Vla3NbY2VsbF0ucHVzaCh0aGlzLl9tYXBEYXRlVG9EYXkoZGF0ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gd2Vla3M7XG4gIH1cblxuICBwcml2YXRlIF9tYXBEYXRlVG9EYXkoZGF0ZTogVCk6IERheTxUPiB7XG4gICAgY29uc3QgaXNvRGF0ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMShkYXRlKTtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IGlzb0RhdGUsXG4gICAgICBkYXRlVmFsdWU6IGRhdGUsXG4gICAgICBkYXlWYWx1ZTogU3RyaW5nKHRoaXMuX2RhdGVBZGFwdGVyLmdldERhdGUoZGF0ZSkpLFxuICAgICAgbW9udGhWYWx1ZTogU3RyaW5nKHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKGRhdGUpKSxcbiAgICAgIHllYXJWYWx1ZTogU3RyaW5nKHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoZGF0ZSkpLFxuICAgICAgLy8gVE9ETzogSW1wcm92ZSBwZXJmb3JtYW5jZSBvZiB0aGlzLCBieSBrZWVwaW5nIHRyYWNrIG9mIHRoZVxuICAgICAgLy8gd2VlayBudW1iZXIgd2hpbGUgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGRheXMuXG4gICAgICB3ZWVrVmFsdWU6IHRoaXMuX2dldFdlZWsoZGF0ZSksXG4gICAgICB3ZWVrRGF5VmFsdWU6IHRoaXMuX2RhdGVBZGFwdGVyLmdldERheU9mV2VlayhkYXRlKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0V2VlayhkYXRlOiBUKTogbnVtYmVyIHtcbiAgICBjb25zdCBmaXJzdERheU9mWWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUodGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkYXRlKSwgMSwgMSk7XG4gICAgY29uc3Qgd2Vla2RheSA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldERheU9mV2VlayhmaXJzdERheU9mWWVhcik7XG5cbiAgICBsZXQgd2Vla0luZGV4ID0gW01PTkRBWSwgVFVFU0RBWSwgV0VETkVTREFZLCBUSFVSU0RBWV0uaW5jbHVkZXMod2Vla2RheSkgPyAxIDogMDtcbiAgICBsZXQgd2Vla1N0YXJ0ID0gdGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJEYXlzKFxuICAgICAgZmlyc3REYXlPZlllYXIsXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRGaXJzdFdlZWtPZmZzZXQoZmlyc3REYXlPZlllYXIpICogLTEsXG4gICAgKTtcbiAgICB3aGlsZSAodGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUod2Vla1N0YXJ0LCBkYXRlKSA8PSAwKSB7XG4gICAgICBjb25zdCB3ZWVrRW5kID0gdGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJEYXlzKHdlZWtTdGFydCwgNik7XG4gICAgICBpZiAodGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUoZGF0ZSwgd2Vla0VuZCkgPD0gMCkge1xuICAgICAgICByZXR1cm4gd2Vla0luZGV4ID4gMFxuICAgICAgICAgID8gd2Vla0luZGV4XG4gICAgICAgICAgOiB0aGlzLl9nZXRXZWVrKHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyhmaXJzdERheU9mWWVhciwgLTEpKTtcbiAgICAgIH1cbiAgICAgIHdlZWtTdGFydCA9IHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyh3ZWVrU3RhcnQsIERBWVNfUEVSX1JPVyk7XG4gICAgICB3ZWVrSW5kZXgrKztcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBwcm92aWRlZCBkYXRlIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIC8qKiBGb3JjZSB0aGUgY29udmVyc2lvbiB0byBJU084NjAxIGZvcm1hdHRlZCBzdHJpbmcuICovXG4gIHByaXZhdGUgX21hcFZhbHVlVG9JU09EYXRlKHZhbHVlOiBzdHJpbmcgfCBUKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogdGhpcy5fZGF0ZUFkYXB0ZXIudG9Jc284NjAxKHZhbHVlIGFzIFQpO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIHJvd3MgZm9yIHRoZSBtb250aCBzZWxlY3Rpb24gdmlldy4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlTW9udGhSb3dzKCk6IHZvaWQge1xuICAgIGNvbnN0IG1vbnRoczogTW9udGhDZWxsW10gPSBuZXcgQXJyYXkoMTIpLmZpbGwobnVsbCkubWFwKFxuICAgICAgKF8sIGk6IG51bWJlcik6IE1vbnRoQ2VsbCA9PiAoe1xuICAgICAgICB2YWx1ZTogU3RyaW5nKGkgKyAxKS5wYWRTdGFydCgyLCAnMCcpLFxuICAgICAgICBtb250aFZhbHVlOiBpICsgMSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgY29uc3Qgcm93czogbnVtYmVyID0gMTIgLyBNT05USFNfUEVSX1JPVztcbiAgICBjb25zdCBtb250aEFycmF5OiBNb250aENlbGxbXVtdID0gW107XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3M7IGkrKykge1xuICAgICAgbW9udGhBcnJheS5wdXNoKG1vbnRocy5zbGljZShNT05USFNfUEVSX1JPVyAqIGksIE1PTlRIU19QRVJfUk9XICogKGkgKyAxKSkpO1xuICAgIH1cbiAgICB0aGlzLl9tb250aHMgPSBtb250aEFycmF5O1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIHJvd3MgZm9yIHRoZSB5ZWFyIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVZZWFyUm93cygpOiBudW1iZXJbXVtdIHtcbiAgICBjb25zdCBzdGFydFZhbHVlWWVhclZpZXc6IG51bWJlciA9IHRoaXMuX2dldFN0YXJ0VmFsdWVZZWFyVmlldygpO1xuICAgIGNvbnN0IGFsbFllYXJzOiBudW1iZXJbXSA9IG5ldyBBcnJheShZRUFSU19QRVJfUEFHRSlcbiAgICAgIC5maWxsKDApXG4gICAgICAubWFwKChfLCBpOiBudW1iZXIpID0+IHN0YXJ0VmFsdWVZZWFyVmlldyArIGkpO1xuICAgIGNvbnN0IHJvd3M6IG51bWJlciA9IFlFQVJTX1BFUl9QQUdFIC8gWUVBUlNfUEVSX1JPVztcbiAgICBjb25zdCB5ZWFyQXJyYXk6IG51bWJlcltdW10gPSBbXTtcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93czsgaSsrKSB7XG4gICAgICB5ZWFyQXJyYXkucHVzaChhbGxZZWFycy5zbGljZShZRUFSU19QRVJfUk9XICogaSwgWUVBUlNfUEVSX1JPVyAqIChpICsgMSkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHllYXJBcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBmaXJzdCB5ZWFyIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgeWVhciBzZWxlY3Rpb24gcGFuZWwuXG4gICAqIElmIGBtaW5EYXRlYCBhbmQgYG1heERhdGVgIGFyZSBib3RoIG51bGwsIHRoZSBzdGFydGluZyB5ZWFyIGlzIGNhbGN1bGF0ZWQgYXNcbiAgICogdGhlIG11bHRpcGxlIG9mIFlFQVJTX1BFUl9QQUdFIGNsb3Nlc3QgdG8gYW5kIGxlc3MgdGhhbiBhY3RpdmVEYXRlLFxuICAgKiBlLmcuLCB3aXRoIGBZRUFSU19QRVJfUEFHRWAgPSAyNCBhbmQgYGFjdGl2ZURhdGVgID0gMjAyMCwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIDIwMTYgKDI0ICogODMpLFxuICAgKiB3aGlsZSB3aXRoIGBhY3RpdmVEYXRlYCA9IDIwMDAsIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiAxOTkyICgyNCAqIDgyKS5cbiAgICogSWYgYG1pbkRhdGVgIGlzIG5vdCBudWxsLCBpdCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHllYXI7IGlmIGBtYXhEYXRlYCBpcyBub3QgbnVsbCxcbiAgICogaXQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyB5ZWFyIG1pbnVzIGBZRUFSU19QRVJfUEFHRWAsIHNvIHRoYXQgdGhlIGBtYXhEYXRlYCBpcyB0aGUgbGFzdCByZW5kZXJlZCB5ZWFyLlxuICAgKiBJZiBib3RoIGFyZSBub3QgbnVsbCwgYG1heERhdGVgIGhhcyBwcmlvcml0eSBvdmVyIGBtaW5EYXRlYC5cbiAgICovXG4gIHByaXZhdGUgX2dldFN0YXJ0VmFsdWVZZWFyVmlldygpOiBudW1iZXIge1xuICAgIGxldCBzdGFydGluZ1llYXIgPSAwO1xuICAgIGlmICh0aGlzLm1heCkge1xuICAgICAgc3RhcnRpbmdZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLm1heCkgLSBZRUFSU19QRVJfUEFHRSArIDE7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1pbikge1xuICAgICAgc3RhcnRpbmdZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLm1pbik7XG4gICAgfVxuICAgIGNvbnN0IGFjdGl2ZVllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuX2FjdGl2ZURhdGUpO1xuICAgIHJldHVybiAoXG4gICAgICBhY3RpdmVZZWFyIC1cbiAgICAgICgoKChhY3RpdmVZZWFyIC0gc3RhcnRpbmdZZWFyKSAlIFlFQVJTX1BFUl9QQUdFKSArIFlFQVJTX1BFUl9QQUdFKSAlIFlFQVJTX1BFUl9QQUdFKVxuICAgICk7XG4gIH1cblxuICAvKiogQ2hlY2tzIGlmIGRhdGUgaXMgd2l0aGluIHRoZSBtaW4tbWF4IHJhbmdlLiAqL1xuICBwcml2YXRlIF9pc0RheUluUmFuZ2UoZGF0ZVN0cmluZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLm1pbiAmJiAhdGhpcy5tYXgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBkYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUoZGF0ZVN0cmluZykhO1xuICAgIHJldHVybiB0aGlzLl9kYXRlQWRhcHRlci5zYW1lRGF0ZShkYXRlLCB0aGlzLl9kYXRlQWRhcHRlci5jbGFtcERhdGUoZGF0ZSwgdGhpcy5taW4sIHRoaXMubWF4KSk7XG4gIH1cblxuICAvKiogRW1pdHMgdGhlIHNlbGVjdGVkIGRhdGUgYW5kIHNldHMgaXQgaW50ZXJuYWxseS4gKi9cbiAgcHJpdmF0ZSBfc2VsZWN0RGF0ZShkYXk6IFQsIGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9jaG9zZW5Nb250aCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9zZXRDaG9zZW5ZZWFyKCk7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIC8vIElmIGEgcmFuZ2UgaXMgc2VsZWN0ZWQgdmlhIFNoaWZ0LCBhIHRleHQgc2VsZWN0aW9uIHJhbmdlIHdpbGwgYmUgYWN0aXZlLlxuICAgICAgLy8gV2UgbmVlZCB0byByZW1vdmUgaXQgdG8gYXZvaWQgaGF2aW5nIGEgdGV4dCBzZWxlY3Rpb24gb24gdG9wIG9mIHRoZSBjYWxlbmRhciBjZWxscyxcbiAgICAgIC8vIHdoaWNoIHdvdWxkIGNyZWF0ZSBhIGNvbmZ1c2luZyBVWC5cbiAgICAgIC8vIFRoaXMgYWxzbyBtdXN0IGJlIHZlcnkgZWFybHkgaW4gdGhlIGV2ZW50IGhhbmRsZXIsIG90aGVyd2lzZSB0aGVyZSB3aWxsIGJlIGEgZmxhc2hcbiAgICAgIC8vIG9mIHNlbGVjdGlvbi5cbiAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKT8ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICBsZXQgc2VsZWN0ZWQgPSAhdGhpcy5fdmFsdWUgPyBbXSA6IEFycmF5LmlzQXJyYXkodGhpcy5fdmFsdWUpID8gdGhpcy5fdmFsdWUgOiBbdGhpcy5fdmFsdWVdO1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFNlbGVjdGVkID0gc2VsZWN0ZWQubWFwKChzKSA9PiB0aGlzLl9kYXRlQWRhcHRlci50b0lzbzg2MDEocykpO1xuICAgICAgaWYgKFxuICAgICAgICBldmVudC5zaGlmdEtleSAmJlxuICAgICAgICB0aGlzLl9sYXN0U2VsZWN0aW9uICYmXG4gICAgICAgIHNlcmlhbGl6ZWRTZWxlY3RlZC5pbmNsdWRlcyh0aGlzLl9kYXRlQWRhcHRlci50b0lzbzg2MDEodGhpcy5fbGFzdFNlbGVjdGlvbikpICYmXG4gICAgICAgICFzZXJpYWxpemVkU2VsZWN0ZWQuaW5jbHVkZXModGhpcy5fZGF0ZUFkYXB0ZXIudG9Jc284NjAxKGRheSkpXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5fbGFzdFNlbGVjdGlvbiwgZGF5KSA8IDAgPyAxIDogLTE7XG4gICAgICAgIGNvbnN0IHJhbmdlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2xhc3RTZWxlY3Rpb247XG4gICAgICAgIHdoaWxlICghdGhpcy5fZGF0ZUFkYXB0ZXIuc2FtZURhdGUoY3VycmVudCwgZGF5KSkge1xuICAgICAgICAgIGN1cnJlbnQgPSB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhckRheXMoY3VycmVudCwgb2Zmc2V0KSE7XG4gICAgICAgICAgY29uc3Qgc2VyaWFsaXplZEN1cnJlbnQgPSB0aGlzLl9kYXRlQWRhcHRlci50b0lzbzg2MDEoY3VycmVudCk7XG4gICAgICAgICAgaWYgKCFzZXJpYWxpemVkU2VsZWN0ZWQuaW5jbHVkZXMoc2VyaWFsaXplZEN1cnJlbnQpKSB7XG4gICAgICAgICAgICByYW5nZS5wdXNoKHNlcmlhbGl6ZWRDdXJyZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2VsZWN0ZWQgPSB0aGlzLl9tZXJnZURhdGVzKHJhbmdlLCBzZXJpYWxpemVkU2VsZWN0ZWQpO1xuICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZC5zb21lKChzZWwpID0+IHRoaXMuX2RhdGVBZGFwdGVyLnNhbWVEYXRlKHNlbCwgZGF5KSkpIHtcbiAgICAgICAgc2VsZWN0ZWQgPSBzZWxlY3RlZC5maWx0ZXIoKHNlbCkgPT4gIXRoaXMuX2RhdGVBZGFwdGVyLnNhbWVEYXRlKHNlbCwgZGF5KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZCA9IFsuLi5zZWxlY3RlZCwgZGF5XS5zb3J0KHRoaXMuX3NvcnREYXRlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fbGFzdFNlbGVjdGlvbiA9IGRheTtcbiAgICAgIHRoaXMuX3ZhbHVlID0gc2VsZWN0ZWQ7XG4gICAgICB0aGlzLl9lbWl0RGF0ZVNlbGVjdGVkRXZlbnQodGhpcy5fdmFsdWUubWFwKChlKSA9PiB0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShlKSEpKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLl92YWx1ZSB8fCB0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZSh0aGlzLl92YWx1ZSBhcyBULCBkYXkpICE9PSAwKSB7XG4gICAgICAvLyBJbiBzaW5nbGUgc2VsZWN0aW9uLCBjaGVjayBpZiB0aGUgZGF5IGlzIGFscmVhZHkgc2VsZWN0ZWRcbiAgICAgIHRoaXMuX3ZhbHVlID0gZGF5O1xuICAgICAgdGhpcy5fZW1pdERhdGVTZWxlY3RlZEV2ZW50KHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGRheSkhKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIG11bHRpcGxlIGRhdGVzIHNlbGVjdGlvbiB2aWEgd2Vla051bWJlciAvIHdlZWtEYXkgYnV0dG9uczpcbiAgICogLSBpZiBDbWQgb3IgQ3RybCBhcmUgcHJlc3NlZCwgYWRkIHRoZSBuZXcgZGF0ZSB0byB0aGUgY3VycmVudCBvbmVzO1xuICAgKiAtIGlmIG5vdCxcbiAgICogICAgIC0gaWYgdGhlIG5ldyBkYXRlcyBhcmUgdGhlIHNhbWUgb2YgdGhlIGN1cnJlbnQgb25lcywgaXQgbWVhbnMgdGhhdCB0aGUgc2FtZSBidXR0b24gaGFzIGJlZW4gY2xpY2tlZCB0d2ljZSwgc28gZG8gbm90aGluZztcbiAgICogICAgIC0gaWYgbm90LCB0aGUgc2VsZWN0ZWQgZGF0ZXMgYXJlIHRoZSBuZXcgb25lcy5cbiAgICovXG4gIHByaXZhdGUgX3NlbGVjdE11bHRpcGxlRGF0ZXMoZGF5czogRGF5PFQ+W10pOiB2b2lkIHtcbiAgICB0aGlzLl92YWx1ZSA9IHRoaXMuX21lcmdlRGF0ZXMoZGF5cy5tYXAoKGUpID0+IGUudmFsdWUpKTtcbiAgICB0aGlzLl9lbWl0RGF0ZVNlbGVjdGVkRXZlbnQodGhpcy5fdmFsdWUubWFwKChlKSA9PiB0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShlKSEpKTtcbiAgfVxuXG4gIHByaXZhdGUgX21lcmdlRGF0ZXMoZGF0ZXM6IHN0cmluZ1tdLCBzZWxlY3RlZD86IHN0cmluZ1tdKTogVFtdIHtcbiAgICBzZWxlY3RlZCA/Pz0gKHRoaXMuX3ZhbHVlIGFzIFRbXSkubWFwKChzKSA9PiB0aGlzLl9kYXRlQWRhcHRlci50b0lzbzg2MDEocykpO1xuICAgIC8vIEZpbHRlciBkaXNhYmxlZCBkYXlzIGJ5IG1hdGNoaW5nIHRoZSBwcm92aWRlZCBgZGF0ZXNgIHBhcmFtZXRlciBhZ2FpbnN0IHRoZSBlbmFibGVkIGNlbGxzLlxuICAgIC8vIFNpbmNlIHRoZSBidXR0b25zJyB2YWx1ZSBpcyBzZXQgdG8gdGhlIERheSdzIGludGVyZmFjZSB2YWx1ZSAoSVNPIHN0cmluZyksIHRoZXJlJ3Mgbm8gbmVlZCB0byBkZXNlcmlhbGl6ZSBpdC5cbiAgICBjb25zdCBlbmFibGVkRGF5czogc3RyaW5nW10gPSAodGhpcy5fY2VsbHMgYXMgU2JiQ2FsZW5kYXJEYXlFbGVtZW50PFQ+W10pXG4gICAgICAuZmlsdGVyKChlKSA9PiAhZS5kaXNhYmxlZClcbiAgICAgIC5tYXAoKGUpID0+IHRoaXMuX21hcFZhbHVlVG9JU09EYXRlKGUudmFsdWUhKSk7XG4gICAgY29uc3QgZGF5c1RvQWRkOiBzdHJpbmdbXSA9IGRhdGVzLmZpbHRlcigoaXNvRGF0ZSkgPT4gZW5hYmxlZERheXMuaW5jbHVkZXMoaXNvRGF0ZSkpO1xuXG4gICAgLy8gSW4gY2FzZSBvZiBtdWx0aXBsZSBzZWxlY3Rpb24sIG5ld2x5IGFkZGVkIGRheXMgbXVzdCBiZSBhZGRlZCB0byB0aGVcbiAgICAvLyBleGlzdGluZyBvbmVzLCB3aXRob3V0IGR1cGxpY2F0aW9uLlxuICAgIC8vIElmIHRoZSBkYXlzIHRvIGFkZCBhcmUgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgc2VsZWN0ZWQgb25lcywgdGhlIHNldFxuICAgIC8vIG11c3QgYmUgZW1wdGllZC5cbiAgICBpZiAoZGF5c1RvQWRkLmV2ZXJ5KChkYXk6IHN0cmluZykgPT4gc2VsZWN0ZWQhLmluY2x1ZGVzKGRheSkpKSB7XG4gICAgICBzZWxlY3RlZCA9IHNlbGVjdGVkLmZpbHRlcigoZGF5OiBzdHJpbmcpID0+ICFkYXlzVG9BZGQuaW5jbHVkZXMoZGF5KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdGVkID0gWy4uLnNlbGVjdGVkLCAuLi5kYXlzVG9BZGRdLmZpbHRlcigodiwgaSwgYSkgPT4gYS5pbmRleE9mKHYpID09PSBpKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGVkLm1hcCgocykgPT4gdGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUocykhKS5zb3J0KHRoaXMuX3NvcnREYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgZGF0ZXNlbGVjdGVkIGV2ZW50IGdpdmVuIHRoZSBkZXRhaWwgKGFzIFQgb3IgVFtdIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgbXVsdGlwbGUgZmxhZykuXG4gICAqIEZJWE1FOiB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgYXBwZWFycyBhcyBldmVudCBuYW1lIGluIHRoZSByZWFkbWVcbiAgICogIGR1ZSB0byBhIGJ1ZyBpbiB0aGUgY3VzdG9tLWVsZW1lbnRzLW1hbmlmZXN0IGxpYnJhcnkuXG4gICAqICBodHRwczovL2dpdGh1Yi5jb20vb3Blbi13Yy9jdXN0b20tZWxlbWVudHMtbWFuaWZlc3QvaXNzdWVzLzE0OVxuICAgKi9cbiAgcHJpdmF0ZSBfZW1pdERhdGVTZWxlY3RlZEV2ZW50KGRhdGVzZWxlY3RlZDogVCB8IFRbXSk6IHZvaWQge1xuICAgIC8qKiBAdHlwZSB7U2JiRGF0ZVNlbGVjdGVkRXZlbnQ8VD59IEV2ZW50IGVtaXR0ZWQgb24gZGF0ZSBzZWxlY3Rpb24uICovXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBTYmJEYXRlU2VsZWN0ZWRFdmVudDxUPihkYXRlc2VsZWN0ZWQpKTtcblxuICAgIC8qKiBAdHlwZSB7SW5wdXRFdmVudH0gRXZlbnQgZW1pdHRlZCBvbiB1c2VyIHNlbGVjdGlvbi4gKi9cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IElucHV0RXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSB9KSk7XG4gICAgLyoqIEB0eXBlIHtFdmVudH0gRXZlbnQgZW1pdHRlZCBvbiB1c2VyIHNlbGVjdGlvbi4gKi9cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZW1pdE1vbnRoQ2hhbmdlKCk6IHZvaWQge1xuICAgIC8vIEZJWE1FOiB0aGUgbmFtZSBvZiB0aGlzIHZhcmlhYmxlIGFwcGVhcnMgYXMgZXZlbnQgbmFtZSBpbiB0aGUgcmVhZG1lXG4gICAgLy8gIGR1ZSB0byBhIGJ1ZyBpbiB0aGUgY3VzdG9tLWVsZW1lbnRzLW1hbmlmZXN0IGxpYnJhcnkuXG4gICAgLy8gIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXdjL2N1c3RvbS1lbGVtZW50cy1tYW5pZmVzdC9pc3N1ZXMvMTQ5XG4gICAgY29uc3QgbW9udGhjaGFuZ2UgPSB0aGlzLl93ZWVrcy5mbGF0KDIpLnNvcnQoKGEsIGIpID0+IGEudmFsdWUubG9jYWxlQ29tcGFyZShiLnZhbHVlKSkgYXMgRGF5W107XG4gICAgLyoqXG4gICAgICogQHR5cGUge1NiYk1vbnRoQ2hhbmdlRXZlbnR9XG4gICAgICogRW1pdHMgd2hlbiB0aGUgbW9udGggY2hhbmdlcy5cbiAgICAgKiBUaGUgYHJhbmdlYCBwcm9wZXJ0eSBjb250YWlucyB0aGUgZGF5cyBhcnJheSBvZiB0aGUgY2hvc2VuIG1vbnRoLlxuICAgICAqL1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgU2JiTW9udGhDaGFuZ2VFdmVudChtb250aGNoYW5nZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0Q2hvc2VuWWVhcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWV3ID09PSAnbW9udGgnKSB7XG4gICAgICBsZXQgc2VsZWN0ZWREYXRlOiBUIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgc2VsZWN0ZWREYXRlID0gKHRoaXMudmFsdWUgYXMgVFtdKS5hdCgtMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZERhdGUgPSB0aGlzLnZhbHVlIGFzIFQ7XG4gICAgICB9XG4gICAgICB0aGlzLl9jaG9zZW5ZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihzZWxlY3RlZERhdGUgPz8gdGhpcy5fZGF0ZUFkYXB0ZXIudG9kYXkoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2Nob3NlblllYXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXNzaWduQWN0aXZlRGF0ZShkYXRlOiBUKTogdm9pZCB7XG4gICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLmNsYW1wRGF0ZShkYXRlLCB0aGlzLm1pbiwgdGhpcy5tYXgpITtcbiAgfVxuXG4gIC8qKiBHb2VzIHRvIHRoZSBtb250aCBpZGVudGlmaWVkIGJ5IHRoZSBzaGlmdC4gKi9cbiAgcHJpdmF0ZSBfZ29Ub0RpZmZlcmVudE1vbnRoKG1vbnRoczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5faW5pdCh0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLl9hY3RpdmVEYXRlLCBtb250aHMpKTtcbiAgICB0aGlzLl9lbWl0TW9udGhDaGFuZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dvVG9EaWZmZXJlbnRZZWFyKHllYXJzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9jaG9zZW5ZZWFyISArPSB5ZWFycztcbiAgICAvLyBDYW4ndCB1c2UgYF9hc3NpZ25BY3RpdmVEYXRlKC4uLilgIGhlcmUsIGJlY2F1c2UgaXQgd2lsbCBzZXQgaXQgdG8gbWluL21heCB2YWx1ZSBpZiBhcmd1bWVudCBpcyBvdXQgb2YgcmFuZ2VcbiAgICB0aGlzLl9hY3RpdmVEYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgIHRoaXMuX2Nob3NlblllYXIhLFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5fYWN0aXZlRGF0ZSksXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMuX2FjdGl2ZURhdGUpLFxuICAgICk7XG4gICAgdGhpcy5faW5pdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ29Ub0RpZmZlcmVudFllYXJSYW5nZSh5ZWFyczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5faW5pdCh0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhclllYXJzKHRoaXMuX2FjdGl2ZURhdGUsIHllYXJzKSk7XG4gIH1cblxuICBwcml2YXRlIF9wcmV2RGlzYWJsZWQocHJldkRhdGU6IFQpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMubWluKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZShwcmV2RGF0ZSwgdGhpcy5taW4pIDwgMDtcbiAgfVxuXG4gIHByaXZhdGUgX25leHREaXNhYmxlZChuZXh0RGF0ZTogVCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5tYXgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2RhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKG5leHREYXRlLCB0aGlzLm1heCkgPiAwO1xuICB9XG5cbiAgLyoqIENoZWNrcyBpZiB0aGUgXCJwcmV2aW91cyBtb250aFwiIGJ1dHRvbiBzaG91bGQgYmUgZGlzYWJsZWQuICovXG4gIHByaXZhdGUgX3ByZXZpb3VzTW9udGhEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcmV2TW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhckRheXMoXG4gICAgICB0aGlzLl9hY3RpdmVEYXRlLFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLl9hY3RpdmVEYXRlKSAqIC0xLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXZEaXNhYmxlZChwcmV2TW9udGgpO1xuICB9XG5cbiAgLyoqIENoZWNrcyBpZiB0aGUgXCJuZXh0IG1vbnRoXCIgYnV0dG9uIHNob3VsZCBiZSBkaXNhYmxlZC4gKi9cbiAgcHJpdmF0ZSBfbmV4dE1vbnRoRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgbGV0IG5leHRNb250aCA9IHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKFxuICAgICAgdGhpcy5fYWN0aXZlRGF0ZSxcbiAgICAgIHRoaXMuYW1vdW50IDwgMSA/IDEgOiB0aGlzLmFtb3VudCxcbiAgICApO1xuICAgIG5leHRNb250aCA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKG5leHRNb250aCksXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChuZXh0TW9udGgpLFxuICAgICAgMSxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLl9uZXh0RGlzYWJsZWQobmV4dE1vbnRoKTtcbiAgfVxuXG4gIC8qKiBDaGVja3MgaWYgdGhlIFwicHJldmlvdXMgeWVhclwiIGJ1dHRvbiBzaG91bGQgYmUgZGlzYWJsZWQuICovXG4gIHByaXZhdGUgX3ByZXZpb3VzWWVhckRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHByZXZZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fYWN0aXZlRGF0ZSkgLSAxLFxuICAgICAgMTIsXG4gICAgICAzMSxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLl9wcmV2RGlzYWJsZWQocHJldlllYXIpO1xuICB9XG5cbiAgLyoqIENoZWNrcyBpZiB0aGUgXCJuZXh0IHllYXJcIiBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkLiAqL1xuICBwcml2YXRlIF9uZXh0WWVhckRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5leHRZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fYWN0aXZlRGF0ZSkgKyAodGhpcy5hbW91bnQgPCAxID8gMSA6IHRoaXMuYW1vdW50KSxcbiAgICAgIDEsXG4gICAgICAxLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX25leHREaXNhYmxlZChuZXh0WWVhcik7XG4gIH1cblxuICAvKiogQ2hlY2tzIGlmIHRoZSBcInByZXZpb3VzIHllYXJcIiBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkIGluIHllYXIgdmlldy4gKi9cbiAgcHJpdmF0ZSBfcHJldmlvdXNZZWFyUmFuZ2VEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcmV2WWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUodGhpcy5feWVhcnNbMF1bMF0gLSAxLCAxMiwgMzEpO1xuICAgIHJldHVybiB0aGlzLl9wcmV2RGlzYWJsZWQocHJldlllYXIpO1xuICB9XG5cbiAgLyoqIENoZWNrcyBpZiB0aGUgXCJuZXh0IHllYXJcIiBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkIGluIHllYXIgdmlldy4gKi9cbiAgcHJpdmF0ZSBfbmV4dFllYXJSYW5nZURpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGxhc3RZZWFyID0gdGhpcy5feWVhcnMuZmxhdCgyKS5hdCgtMSkhO1xuICAgIGNvbnN0IG5leHRZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShsYXN0WWVhciArIDEsIDEsIDEpO1xuICAgIHJldHVybiB0aGlzLl9uZXh0RGlzYWJsZWQobmV4dFllYXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlVGFibGVCbHVyKGV2ZW50VGFyZ2V0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmIChldmVudFRhcmdldD8ubG9jYWxOYW1lICE9PSAnc2JiLWNhbGVuZGFyLWRheScpIHtcbiAgICAgIHRoaXMuX3NldFRhYkluZGV4KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0VGFiSW5kZXgoKTogdm9pZCB7XG4gICAgQXJyYXkuZnJvbSh0aGlzLl9jZWxscy5maWx0ZXIoKGUpID0+IGUudGFiSW5kZXggPT09IDApID8/IFtdKS5mb3JFYWNoKFxuICAgICAgKGRheSkgPT4gKGRheS50YWJJbmRleCA9IC0xKSxcbiAgICApO1xuICAgIGNvbnN0IGZpcnN0Rm9jdXNhYmxlID0gdGhpcy5fZ2V0Rmlyc3RGb2N1c2FibGUoKTtcbiAgICBpZiAoZmlyc3RGb2N1c2FibGUpIHtcbiAgICAgIGZpcnN0Rm9jdXNhYmxlLnRhYkluZGV4ID0gMDtcbiAgICB9XG4gIH1cblxuICAvKiogR2V0IHRoZSBlbGVtZW50IGluIHRoZSBjYWxlbmRhciB0byBhc3NpZ24gZm9jdXMuICovXG4gIHByaXZhdGUgX2dldEZpcnN0Rm9jdXNhYmxlKCk6IFNiYkNhbGVuZGFyQ2VsbEJhc2VFbGVtZW50PFQ+IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuX2NhbGVuZGFyVmlldyA9PT0gJ2RheScpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkT3JDdXJyZW50ID1cbiAgICAgICAgdGhpcy5fY2VsbHMuZmluZCgoZSkgPT4gZS5tYXRjaGVzKCc6c3RhdGUoc2VsZWN0ZWQpJykpID8/XG4gICAgICAgIHRoaXMuX2NlbGxzLmZpbmQoKGUpID0+IGUubWF0Y2hlcygnOnN0YXRlKGN1cnJlbnQpJykpO1xuICAgICAgcmV0dXJuIHNlbGVjdGVkT3JDdXJyZW50ICYmICFzZWxlY3RlZE9yQ3VycmVudC5kaXNhYmxlZFxuICAgICAgICA/IHNlbGVjdGVkT3JDdXJyZW50XG4gICAgICAgIDogdGhpcy5fZ2V0Rmlyc3RGb2N1c2FibGVEYXkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRPckN1cnJlbnQgPVxuICAgICAgICB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3I8U2JiQ2FsZW5kYXJDZWxsQmFzZUVsZW1lbnQ8VD4+KFxuICAgICAgICAgIGBzYmItY2FsZW5kYXItJHt0aGlzLl9jYWxlbmRhclZpZXd9OnN0YXRlKHNlbGVjdGVkKWAsXG4gICAgICAgICkgPz9cbiAgICAgICAgdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yPFNiYkNhbGVuZGFyQ2VsbEJhc2VFbGVtZW50PFQ+PihcbiAgICAgICAgICBgc2JiLWNhbGVuZGFyLSR7dGhpcy5fY2FsZW5kYXJWaWV3fTpzdGF0ZShjdXJyZW50KWAsXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gc2VsZWN0ZWRPckN1cnJlbnQgJiYgIXNlbGVjdGVkT3JDdXJyZW50LmRpc2FibGVkXG4gICAgICAgID8gc2VsZWN0ZWRPckN1cnJlbnRcbiAgICAgICAgOiB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3I8U2JiQ2FsZW5kYXJDZWxsQmFzZUVsZW1lbnQ8VD4+KFxuICAgICAgICAgICAgYHNiYi1jYWxlbmRhci0ke3RoaXMuX2NhbGVuZGFyVmlld306bm90KFtkaXNhYmxlZF0pYCxcbiAgICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbiBgZGF5YCB2aWV3IGluIGB2ZXJ0aWNhbGAgb3JpZW50YXRpb24sXG4gICAqIGlmIHRoZSBmaXJzdCBvZiB0aGUgbW9udGggaXMgbm90IGEgTW9uZGF5LCBpdCBpcyBub3QgdGhlIGZpcnN0IHJlbmRlcmVkIGVsZW1lbnQgaW4gdGhlIHRhYmxlLFxuICAgKiBzbyBgdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKCdzYmItY2FsZW5kYXItZGF5Om5vdChbZGlzYWJsZWRdKScpYCB3aWxsIHJldHVybiBhIHdyb25nIHZhbHVlLlxuICAgKlxuICAgKiBUbyBzb2x2ZSB0aGlzLCB0aGUgZWxlbWVudCB3aXRoIHRoZSBsb3dlc3QgYHZhbHVlYCBpcyB0YWtlbiAoSVNPIFN0cmluZyBhcmUgb3JkZXJlZCkuXG4gICAqL1xuICBwcml2YXRlIF9nZXRGaXJzdEZvY3VzYWJsZURheSgpOiBTYmJDYWxlbmRhckRheUVsZW1lbnQ8VD4gfCBudWxsIHtcbiAgICBjb25zdCBjZWxscyA9IHRoaXMuX2NlbGxzIGFzIFNiYkNhbGVuZGFyRGF5RWxlbWVudDxUPltdO1xuICAgIGNvbnN0IGRheXNJblZpZXcgPSBjZWxscy5maWx0ZXIoKGUpID0+ICFlLmRpc2FibGVkKTtcbiAgICBpZiAoIWRheXNJblZpZXcgfHwgZGF5c0luVmlldy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmaXJzdEVsZW1lbnQgPSBkYXlzSW5WaWV3XG4gICAgICAgIC5tYXAoKGUpOiBzdHJpbmcgPT4gdGhpcy5fZGF0ZUFkYXB0ZXIudG9Jc284NjAxKGUudmFsdWUhIGFzIFQpKVxuICAgICAgICAuc29ydCgpWzBdO1xuICAgICAgcmV0dXJuIGNlbGxzLmZpbmQoKGUpID0+IGUubWF0Y2hlcyhgW3Nsb3Q9XCIke2ZpcnN0RWxlbWVudH1cIl1gKSkhID8/IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlS2V5Ym9hcmRFdmVudChldmVudDogS2V5Ym9hcmRFdmVudCwgZGF5PzogU2JiQ2FsZW5kYXJEYXlFbGVtZW50PFQ+KTogdm9pZCB7XG4gICAgaWYgKGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIC8vIEdldHMgdGhlIGN1cnJlbnRseSByZW5kZXJlZCB0YWJsZSdzIGNlbGw7XG4gICAgLy8gdGhleSBjb3VsZCBiZSBkYXlzLCBtb250aHMgb3IgeWVhcnMgYmFzZWQgb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHZpZXcuXG4gICAgY29uc3Qgb3JpZ2luID0gZGF5ID8/IChldmVudC50YXJnZXQgYXMgU2JiQ2FsZW5kYXJEYXlFbGVtZW50PFQ+KTtcbiAgICBjb25zdCBjZWxscyA9IHRoaXMuX2NlbGxzO1xuICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSBjZWxscy5pbmRleE9mKG9yaWdpbik7XG4gICAgbGV0IG5leHRFbDogU2JiQ2FsZW5kYXJDZWxsQmFzZUVsZW1lbnQ8VD47XG4gICAgaWYgKGRheSkge1xuICAgICAgbmV4dEVsID0gdGhpcy5fbmF2aWdhdGVCeUtleWJvYXJkRGF5VmlldyhcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIGluZGV4LFxuICAgICAgICBjZWxscyBhcyBTYmJDYWxlbmRhckRheUVsZW1lbnQ8VD5bXSxcbiAgICAgICAgdGhpcy5fbWFwRGF0ZVRvRGF5KGRheS52YWx1ZSEgYXMgVCksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0RWwgPSB0aGlzLl9uYXZpZ2F0ZUJ5S2V5Ym9hcmQoZXZlbnQsIGluZGV4LCBjZWxscyk7XG4gICAgfVxuICAgIGNvbnN0IGFjdGl2ZUVsID0gKHRoaXMuX2VuaGFuY2VkVmFyaWFudCA/IGRvY3VtZW50IDogdGhpcy5zaGFkb3dSb290ISlcbiAgICAgIC5hY3RpdmVFbGVtZW50IGFzIFNiYkNhbGVuZGFyQ2VsbEJhc2VFbGVtZW50PFQ+O1xuICAgIGlmIChuZXh0RWwgIT09IGFjdGl2ZUVsKSB7XG4gICAgICBuZXh0RWwudGFiSW5kZXggPSAwO1xuICAgICAgbmV4dEVsLmZvY3VzKCk7XG5cbiAgICAgIGlmIChjZWxscy5pbmNsdWRlcyhhY3RpdmVFbCkpIHtcbiAgICAgICAgYWN0aXZlRWwudGFiSW5kZXggPSAtMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9uYXZpZ2F0ZUJ5S2V5Ym9hcmREYXlWaWV3KFxuICAgIGV2dDogS2V5Ym9hcmRFdmVudCxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGNlbGxzOiBTYmJDYWxlbmRhckRheUVsZW1lbnQ8VD5bXSxcbiAgICBkYXk6IERheTxUPixcbiAgKTogU2JiQ2FsZW5kYXJEYXlFbGVtZW50PFQ+IHtcbiAgICBjb25zdCBhcnJvd3NPZmZzZXQgPVxuICAgICAgdGhpcy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnXG4gICAgICAgID8geyBsZWZ0UmlnaHQ6IDEsIHVwRG93bjogREFZU19QRVJfUk9XIH1cbiAgICAgICAgOiB7IGxlZnRSaWdodDogREFZU19QRVJfUk9XLCB1cERvd246IDEgfTtcblxuICAgIHN3aXRjaCAoZXZ0LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kRGF5QXJyb3dzKGNlbGxzLCBpbmRleCwgZGF5LmRhdGVWYWx1ZSwgLWFycm93c09mZnNldC51cERvd24pO1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmREYXlBcnJvd3MoY2VsbHMsIGluZGV4LCBkYXkuZGF0ZVZhbHVlLCBhcnJvd3NPZmZzZXQudXBEb3duKTtcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kRGF5QXJyb3dzKGNlbGxzLCBpbmRleCwgZGF5LmRhdGVWYWx1ZSwgLWFycm93c09mZnNldC5sZWZ0UmlnaHQpO1xuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kRGF5QXJyb3dzKGNlbGxzLCBpbmRleCwgZGF5LmRhdGVWYWx1ZSwgYXJyb3dzT2Zmc2V0LmxlZnRSaWdodCk7XG4gICAgICBjYXNlICdQYWdlVXAnOiB7XG4gICAgICAgIGlmICh0aGlzLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgICAgICBjb25zdCBmaXJzdE9mV2VlazogbnVtYmVyID0gK2RheS5kYXlWYWx1ZSAlIERBWVNfUEVSX1JPVyB8fCBEQVlTX1BFUl9ST1c7XG4gICAgICAgICAgY29uc3QgZGVsdGE6IG51bWJlciA9IGZpcnN0T2ZXZWVrIC0gK2RheS5kYXlWYWx1ZTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZmluZERheVBhZ2VVcERvd24oY2VsbHMsIGluZGV4LCBkYXksIGRlbHRhLCBhcnJvd3NPZmZzZXQudXBEb3duKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBvZmZzZXRGb3JWZXJ0aWNhbDogbnVtYmVyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0Rmlyc3RXZWVrT2Zmc2V0KGRheS5kYXRlVmFsdWUpO1xuICAgICAgICAgIGNvbnN0IHdlZWtOdW1iZXI6IG51bWJlciA9IE1hdGguY2VpbCgoK2RheS5kYXlWYWx1ZSArIG9mZnNldEZvclZlcnRpY2FsKSAvIERBWVNfUEVSX1JPVyk7XG4gICAgICAgICAgY29uc3QgZmlyc3RPZldlZWs6IG51bWJlciA9ICh3ZWVrTnVtYmVyIC0gMSkgKiBEQVlTX1BFUl9ST1cgLSBvZmZzZXRGb3JWZXJ0aWNhbCArIDE7XG4gICAgICAgICAgY29uc3QgZGVsdGE6IG51bWJlciA9IGZpcnN0T2ZXZWVrIC0gK2RheS5kYXlWYWx1ZTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZmluZERheVBhZ2VVcERvd24oY2VsbHMsIGluZGV4LCBkYXksIGRlbHRhLCBhcnJvd3NPZmZzZXQudXBEb3duKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FzZSAnUGFnZURvd24nOiB7XG4gICAgICAgIGlmICh0aGlzLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgICAgICBjb25zdCBtb250aEluQm91bmRzID0gK2RheS5tb250aFZhbHVlICsgMSA+IDEyID8gMSA6ICtkYXkubW9udGhWYWx1ZSArIDE7XG4gICAgICAgICAgY29uc3QgeWVhckluQm91bmRzID0gK2RheS5tb250aFZhbHVlICsgMSA+IDEyID8gK2RheS55ZWFyVmFsdWUgKyAxIDogK2RheS55ZWFyVmFsdWU7XG4gICAgICAgICAgY29uc3QgZmlyc3ROZXh0TW9udGg6IFQgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKHllYXJJbkJvdW5kcywgbW9udGhJbkJvdW5kcywgMSk7XG4gICAgICAgICAgY29uc3QgbGFzdE9mTW9udGg6IG51bWJlciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldERhdGUoXG4gICAgICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhckRheXMoZmlyc3ROZXh0TW9udGgsIC0xKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGRlbHRhOiBudW1iZXIgPVxuICAgICAgICAgICAgTWF0aC50cnVuYygobGFzdE9mTW9udGggLSArZGF5LmRheVZhbHVlISkgLyBEQVlTX1BFUl9ST1cpICogREFZU19QRVJfUk9XO1xuICAgICAgICAgIHJldHVybiB0aGlzLl9maW5kRGF5UGFnZVVwRG93bihjZWxscywgaW5kZXgsIGRheSwgZGVsdGEsIC1hcnJvd3NPZmZzZXQudXBEb3duKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBvZmZzZXRGb3JWZXJ0aWNhbDogbnVtYmVyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0Rmlyc3RXZWVrT2Zmc2V0KGRheS5kYXRlVmFsdWUpO1xuICAgICAgICAgIGNvbnN0IHdlZWtOdW1iZXI6IG51bWJlciA9IE1hdGguY2VpbCgoK2RheS5kYXlWYWx1ZSArIG9mZnNldEZvclZlcnRpY2FsKSAvIERBWVNfUEVSX1JPVyk7XG4gICAgICAgICAgY29uc3QgbGFzdE9mV2VlazogbnVtYmVyID0gd2Vla051bWJlciAqIERBWVNfUEVSX1JPVyAtIG9mZnNldEZvclZlcnRpY2FsO1xuICAgICAgICAgIGNvbnN0IGRlbHRhOiBudW1iZXIgPSBsYXN0T2ZXZWVrIC0gK2RheS5kYXlWYWx1ZTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZmluZERheVBhZ2VVcERvd24oY2VsbHMsIGluZGV4LCBkYXksIGRlbHRhLCAtYXJyb3dzT2Zmc2V0LnVwRG93bik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgJ0hvbWUnOiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kRGF5Rmlyc3QoY2VsbHMsIGluZGV4LCBkYXksIDEpO1xuICAgICAgfVxuICAgICAgY2FzZSAnRW5kJzoge1xuICAgICAgICBjb25zdCBtb250aEluQm91bmRzID0gK2RheS5tb250aFZhbHVlICsgMSA+IDEyID8gMSA6ICtkYXkubW9udGhWYWx1ZSArIDE7XG4gICAgICAgIGNvbnN0IHllYXJJbkJvdW5kcyA9ICtkYXkubW9udGhWYWx1ZSArIDEgPiAxMiA/ICtkYXkueWVhclZhbHVlICsgMSA6ICtkYXkueWVhclZhbHVlO1xuICAgICAgICBjb25zdCBmaXJzdE5leHRNb250aDogVCA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhckluQm91bmRzLCBtb250aEluQm91bmRzLCAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmREYXlMYXN0KGNlbGxzLCBpbmRleCwgZmlyc3ROZXh0TW9udGgpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGNlbGxzW2luZGV4XTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pc0RheU91dE9mVmlldyhkYXRlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZGF0ZSA8IHRoaXMuX2ZpcnN0VmlzaWJsZURheSB8fCBkYXRlID4gdGhpcy5fbGFzdFZpc2libGVEYXk7XG4gIH1cblxuICBwcml2YXRlIF9maW5kRGF5QXJyb3dzKFxuICAgIGNlbGxzOiBTYmJDYWxlbmRhckRheUVsZW1lbnQ8VD5bXSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGRhdGU6IFQsXG4gICAgZGVsdGE6IG51bWJlcixcbiAgKTogU2JiQ2FsZW5kYXJEYXlFbGVtZW50PFQ+IHtcbiAgICBjb25zdCBuZXdEYXRlVmFsdWUgPSB0aGlzLl9kYXRlQWRhcHRlci50b0lzbzg2MDEoXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhckRheXMoZGF0ZSwgZGVsdGEpLFxuICAgICk7XG4gICAgaWYgKHRoaXMuX2lzRGF5T3V0T2ZWaWV3KG5ld0RhdGVWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBjZWxsc1tpbmRleF07XG4gICAgfVxuICAgIGNvbnN0IG5leHRDZWxsID0gY2VsbHMuZmluZCgoZSkgPT4gdGhpcy5fbWFwVmFsdWVUb0lTT0RhdGUoZS52YWx1ZSEpID09PSBuZXdEYXRlVmFsdWUpO1xuICAgIGlmICghbmV4dENlbGwgfHwgbmV4dENlbGwuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9maW5kRGF5QXJyb3dzKGNlbGxzLCBpbmRleCwgdGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUobmV3RGF0ZVZhbHVlKSEsIGRlbHRhKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHRDZWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmluZERheVBhZ2VVcERvd24oXG4gICAgY2VsbHM6IFNiYkNhbGVuZGFyRGF5RWxlbWVudDxUPltdLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgZGF5OiBEYXk8VD4sXG4gICAgZGVsdGE6IG51bWJlcixcbiAgICBkZWx0YUlmRGlzYWJsZWQ6IG51bWJlcixcbiAgKTogU2JiQ2FsZW5kYXJEYXlFbGVtZW50PFQ+IHtcbiAgICBjb25zdCBuZXdEYXRlVmFsdWUgPSB0aGlzLl9kYXRlQWRhcHRlci50b0lzbzg2MDEoXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhckRheXMoZGF5LmRhdGVWYWx1ZSwgZGVsdGEpLFxuICAgICk7XG4gICAgaWYgKHRoaXMuX2lzRGF5T3V0T2ZWaWV3KG5ld0RhdGVWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBjZWxsc1tpbmRleF07XG4gICAgfVxuICAgIGNvbnN0IG5leHRDZWxsID0gY2VsbHMuZmluZCgoZSkgPT4gdGhpcy5fbWFwVmFsdWVUb0lTT0RhdGUoZS52YWx1ZSEpID09PSBuZXdEYXRlVmFsdWUpO1xuICAgIGlmICghbmV4dENlbGwgfHwgbmV4dENlbGwuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9maW5kRGF5UGFnZVVwRG93bihjZWxscywgaW5kZXgsIGRheSwgZGVsdGEgKyBkZWx0YUlmRGlzYWJsZWQsIGRlbHRhSWZEaXNhYmxlZCk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0Q2VsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmREYXlGaXJzdChcbiAgICBjZWxsczogU2JiQ2FsZW5kYXJEYXlFbGVtZW50PFQ+W10sXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBkYXk6IERheTxUPixcbiAgICBkYXRlOiBudW1iZXIsXG4gICk6IFNiYkNhbGVuZGFyRGF5RWxlbWVudDxUPiB7XG4gICAgY29uc3QgbmV3RGF0ZVZhbHVlID0gdGhpcy5fZGF0ZUFkYXB0ZXIudG9Jc284NjAxKFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSgrZGF5LnllYXJWYWx1ZSwgK2RheS5tb250aFZhbHVlLCBkYXRlKSxcbiAgICApO1xuICAgIGlmICh0aGlzLl9pc0RheU91dE9mVmlldyhuZXdEYXRlVmFsdWUpKSB7XG4gICAgICByZXR1cm4gY2VsbHNbaW5kZXhdO1xuICAgIH1cbiAgICBjb25zdCBuZXh0Q2VsbCA9IGNlbGxzLmZpbmQoKGUpID0+IHRoaXMuX21hcFZhbHVlVG9JU09EYXRlKGUudmFsdWUhKSA9PT0gbmV3RGF0ZVZhbHVlKTtcbiAgICBpZiAoIW5leHRDZWxsIHx8IG5leHRDZWxsLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZmluZERheUZpcnN0KGNlbGxzLCBpbmRleCwgZGF5LCBkYXRlICsgMSk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0Q2VsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmREYXlMYXN0KFxuICAgIGNlbGxzOiBTYmJDYWxlbmRhckRheUVsZW1lbnQ8VD5bXSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGZpcnN0TmV4dE1vbnRoOiBULFxuICApOiBTYmJDYWxlbmRhckRheUVsZW1lbnQ8VD4ge1xuICAgIGNvbnN0IG5ld0RhdGVWYWx1ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMShcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyhmaXJzdE5leHRNb250aCwgLTEpLFxuICAgICk7XG4gICAgaWYgKHRoaXMuX2lzRGF5T3V0T2ZWaWV3KG5ld0RhdGVWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBjZWxsc1tpbmRleF07XG4gICAgfVxuICAgIGNvbnN0IG5leHRDZWxsID0gY2VsbHMuZmluZCgoZSkgPT4gdGhpcy5fbWFwVmFsdWVUb0lTT0RhdGUoZS52YWx1ZSEpID09PSBuZXdEYXRlVmFsdWUpO1xuICAgIGlmICghbmV4dENlbGwgfHwgbmV4dENlbGwuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9maW5kRGF5TGFzdChjZWxscywgaW5kZXgsIHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKG5ld0RhdGVWYWx1ZSkhKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHRDZWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIG1vdmUgdG8sIGJhc2VkIG9uIGEgbGlzdCBvZiBlbGVtZW50cyAod2hpY2ggY2FuIGJlIHBvdGVudGlhbGx5IGRpc2FibGVkKSxcbiAgICogdGhlIGtleWJvYXJkIGlucHV0IGFuZCB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgbGlzdC5cbiAgICogSW4gdGhlIGRheSB2aWV3LCB0aGUgYGRheT86IERheWAgcGFyYW1ldGVyIGlzIG1hbmRhdG9yeSBmb3IgY2FsY3VsYXRpb24sXG4gICAqIHdoaWxlIGluIG1vbnRoIGFuZCB5ZWFyIHZpZXcgaXQncyBub3QgZHVlIHRvIHRoZSBmaXhlZCBhbW91bnQgb2YgcmVuZGVyZWQgY2VsbHMuXG4gICAqL1xuICBwcml2YXRlIF9uYXZpZ2F0ZUJ5S2V5Ym9hcmQoXG4gICAgZXZ0OiBLZXlib2FyZEV2ZW50LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgY2VsbHM6IFNiYkNhbGVuZGFyQ2VsbEJhc2VFbGVtZW50PFQ+W10sXG4gICk6IFNiYkNhbGVuZGFyQ2VsbEJhc2VFbGVtZW50PFQ+IHtcbiAgICBjb25zdCB7XG4gICAgICBlbGVtZW50SW5kZXhGb3JXaWRlTW9kZSxcbiAgICAgIG9mZnNldEZvcldpZGVNb2RlLFxuICAgICAgbGFzdEVsZW1lbnRJbmRleEZvcldpZGVNb2RlLFxuICAgICAgdmVydGljYWxPZmZzZXQsXG4gICAgfTogQ2FsZW5kYXJLZXlib2FyZE5hdmlnYXRpb25Nb250aFllYXJWaWV3c1BhcmFtZXRlcnMgPVxuICAgICAgdGhpcy5fY2FsY3VsYXRlUGFyYW1ldGVyc0ZvcktleWJvYXJkTmF2aWdhdGlvbihpbmRleCwgdGhpcy5fY2FsZW5kYXJWaWV3ID09PSAneWVhcicpO1xuXG4gICAgc3dpdGNoIChldnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmROZXh0KGNlbGxzLCBpbmRleCwgLXZlcnRpY2FsT2Zmc2V0KTtcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kTmV4dChjZWxscywgaW5kZXgsIHZlcnRpY2FsT2Zmc2V0KTtcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kTmV4dChjZWxscywgaW5kZXgsIC0xKTtcbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZE5leHQoY2VsbHMsIGluZGV4LCAxKTtcbiAgICAgIGNhc2UgJ0hvbWUnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZEZpcnN0KGNlbGxzLCBvZmZzZXRGb3JXaWRlTW9kZSk7XG4gICAgICBjYXNlICdQYWdlVXAnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZEZpcnN0T25Db2x1bW4oXG4gICAgICAgICAgY2VsbHMsXG4gICAgICAgICAgZWxlbWVudEluZGV4Rm9yV2lkZU1vZGUsXG4gICAgICAgICAgb2Zmc2V0Rm9yV2lkZU1vZGUsXG4gICAgICAgICAgdmVydGljYWxPZmZzZXQsXG4gICAgICAgICk7XG4gICAgICBjYXNlICdQYWdlRG93bic6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kTGFzdE9uQ29sdW1uKGNlbGxzLCBpbmRleCwgbGFzdEVsZW1lbnRJbmRleEZvcldpZGVNb2RlLCB2ZXJ0aWNhbE9mZnNldCk7XG4gICAgICBjYXNlICdFbmQnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZExhc3QoY2VsbHMsIGxhc3RFbGVtZW50SW5kZXhGb3JXaWRlTW9kZSAtIDEpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGNlbGxzW2luZGV4XTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgcGFyYW1ldGVycyBuZWVkZWQgaW4ga2V5Ym9hcmQgbmF2aWdhdGlvbiBpbiB5ZWFyIGFuZCBtb250aCB2aWV3LlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIHN0YXJ0aW5nIGVsZW1lbnQncyBpbmRleCBpbiB0aGUgY2VsbCBhcnJheS5cbiAgICogQHBhcmFtIGlzWWVhclZpZXcgV2hldGhlciB0aGUgZGlzcGxheWVkIGB2aWV3YCBpcyB0aGUgeWVhciBvbmUuXG4gICAqL1xuICBwcml2YXRlIF9jYWxjdWxhdGVQYXJhbWV0ZXJzRm9yS2V5Ym9hcmROYXZpZ2F0aW9uKFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgaXNZZWFyVmlldzogYm9vbGVhbixcbiAgKTogQ2FsZW5kYXJLZXlib2FyZE5hdmlnYXRpb25Nb250aFllYXJWaWV3c1BhcmFtZXRlcnMge1xuICAgIGNvbnN0IGVsZW1lbnRzUGVyUGFnZSA9IGlzWWVhclZpZXcgPyBZRUFSU19QRVJfUEFHRSA6IE1PTlRIU19QRVJfUEFHRTtcbiAgICBjb25zdCBvZmZzZXQ6IG51bWJlciA9IE1hdGgudHJ1bmMoaW5kZXggLyBlbGVtZW50c1BlclBhZ2UpICogZWxlbWVudHNQZXJQYWdlO1xuICAgIGNvbnN0IGluZGV4SW5WaWV3OiBudW1iZXIgPSBvZmZzZXQgPT09IDAgPyBpbmRleCA6IGluZGV4IC0gZWxlbWVudHNQZXJQYWdlO1xuICAgIHJldHVybiB7XG4gICAgICB2ZXJ0aWNhbE9mZnNldDogaXNZZWFyVmlldyA/IFlFQVJTX1BFUl9ST1cgOiBNT05USFNfUEVSX1JPVyxcbiAgICAgIGVsZW1lbnRJbmRleEZvcldpZGVNb2RlOiBpbmRleEluVmlldyxcbiAgICAgIG9mZnNldEZvcldpZGVNb2RlOiBpbmRleCAtIGluZGV4SW5WaWV3LFxuICAgICAgbGFzdEVsZW1lbnRJbmRleEZvcldpZGVNb2RlOiBvZmZzZXQgPT09IDAgPyBlbGVtZW50c1BlclBhZ2UgOiBlbGVtZW50c1BlclBhZ2UgKiAyLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBwcm92aWRlZCBhcnJheSBzdGFydGluZyBmcm9tIGBpbmRleGAgYnkgYWRkaW5nIGBkZWx0YWAuXG4gICAqIElmIHRoZSBmb3VuZCBlbGVtZW50IGlzIGRpc2FibGVkLCBpdCBjb250aW51ZXMgYWRkaW5nIGBkZWx0YWAgdW50aWwgaXQgZmluZHMgYW4gZW5hYmxlZCBvbmUgaW4gdGhlIGFycmF5IGJvdW5kcy5cbiAgICovXG4gIHByaXZhdGUgX2ZpbmROZXh0KFxuICAgIGRheXM6IFNiYkNhbGVuZGFyQ2VsbEJhc2VFbGVtZW50PFQ+W10sXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBkZWx0YTogbnVtYmVyLFxuICApOiBTYmJDYWxlbmRhckNlbGxCYXNlRWxlbWVudDxUPiB7XG4gICAgbGV0IG5leHRJbmRleCA9IGluZGV4ICsgZGVsdGE7XG4gICAgd2hpbGUgKG5leHRJbmRleCA8IGRheXMubGVuZ3RoICYmIGRheXNbbmV4dEluZGV4XT8uZGlzYWJsZWQpIHtcbiAgICAgIG5leHRJbmRleCArPSBkZWx0YTtcbiAgICB9XG4gICAgcmV0dXJuIGRheXNbbmV4dEluZGV4XSA/PyBkYXlzW2luZGV4XTtcbiAgfVxuXG4gIC8qKiBGaW5kIHRoZSBmaXJzdCBlbmFibGVkIGVsZW1lbnQgaW4gdGhlIHByb3ZpZGVkIGFycmF5LiAqL1xuICBwcml2YXRlIF9maW5kRmlyc3QoXG4gICAgZGF5czogU2JiQ2FsZW5kYXJDZWxsQmFzZUVsZW1lbnQ8VD5bXSxcbiAgICBmaXJzdE9mQ3VycmVudE1vbnRoOiBudW1iZXIsXG4gICk6IFNiYkNhbGVuZGFyQ2VsbEJhc2VFbGVtZW50PFQ+IHtcbiAgICByZXR1cm4gIWRheXNbZmlyc3RPZkN1cnJlbnRNb250aF0uZGlzYWJsZWRcbiAgICAgID8gZGF5c1tmaXJzdE9mQ3VycmVudE1vbnRoXVxuICAgICAgOiB0aGlzLl9maW5kTmV4dChkYXlzLCBmaXJzdE9mQ3VycmVudE1vbnRoLCAxKTtcbiAgfVxuXG4gIC8qKiBGaW5kIHRoZSBsYXN0IGVuYWJsZWQgZWxlbWVudCBpbiB0aGUgcHJvdmlkZWQgYXJyYXkuICovXG4gIHByaXZhdGUgX2ZpbmRMYXN0KFxuICAgIGRheXM6IFNiYkNhbGVuZGFyQ2VsbEJhc2VFbGVtZW50PFQ+W10sXG4gICAgbGFzdE9mQ3VycmVudE1vbnRoOiBudW1iZXIsXG4gICk6IFNiYkNhbGVuZGFyQ2VsbEJhc2VFbGVtZW50PFQ+IHtcbiAgICByZXR1cm4gIWRheXNbbGFzdE9mQ3VycmVudE1vbnRoXS5kaXNhYmxlZFxuICAgICAgPyBkYXlzW2xhc3RPZkN1cnJlbnRNb250aF1cbiAgICAgIDogdGhpcy5fZmluZE5leHQoZGF5cywgbGFzdE9mQ3VycmVudE1vbnRoLCAtMSk7XG4gIH1cblxuICAvKiogRmluZCB0aGUgZmlyc3QgZW5hYmxlZCBlbGVtZW50IGluIHRoZSBzYW1lIGNvbHVtbiBvZiB0aGUgcHJvdmlkZWQgYXJyYXkuICovXG4gIHByaXZhdGUgX2ZpbmRGaXJzdE9uQ29sdW1uKFxuICAgIGRheXM6IFNiYkNhbGVuZGFyQ2VsbEJhc2VFbGVtZW50PFQ+W10sXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBvZmZzZXQ6IG51bWJlcixcbiAgICB2ZXJ0aWNhbE9mZnNldDogbnVtYmVyLFxuICApOiBTYmJDYWxlbmRhckNlbGxCYXNlRWxlbWVudDxUPiB7XG4gICAgY29uc3QgbmV4dEluZGV4ID0gKGluZGV4ICUgdmVydGljYWxPZmZzZXQpICsgb2Zmc2V0O1xuICAgIHJldHVybiAhZGF5c1tuZXh0SW5kZXhdLmRpc2FibGVkXG4gICAgICA/IGRheXNbbmV4dEluZGV4XVxuICAgICAgOiB0aGlzLl9maW5kTmV4dChkYXlzLCBuZXh0SW5kZXgsIHZlcnRpY2FsT2Zmc2V0KTtcbiAgfVxuXG4gIC8qKiBGaW5kIHRoZSBsYXN0IGVuYWJsZWQgZWxlbWVudCBpbiB0aGUgc2FtZSBjb2x1bW4gb2YgdGhlIHByb3ZpZGVkIGFycmF5LiAqL1xuICBwcml2YXRlIF9maW5kTGFzdE9uQ29sdW1uKFxuICAgIGRheXM6IFNiYkNhbGVuZGFyQ2VsbEJhc2VFbGVtZW50PFQ+W10sXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBvZmZzZXQ6IG51bWJlcixcbiAgICB2ZXJ0aWNhbE9mZnNldDogbnVtYmVyLFxuICApOiBTYmJDYWxlbmRhckNlbGxCYXNlRWxlbWVudDxUPiB7XG4gICAgY29uc3QgbmV4dEluZGV4ID0gaW5kZXggKyBNYXRoLnRydW5jKChvZmZzZXQgLSBpbmRleCAtIDEpIC8gdmVydGljYWxPZmZzZXQpICogdmVydGljYWxPZmZzZXQ7XG4gICAgcmV0dXJuICFkYXlzW25leHRJbmRleF0uZGlzYWJsZWRcbiAgICAgID8gZGF5c1tuZXh0SW5kZXhdXG4gICAgICA6IHRoaXMuX2ZpbmROZXh0KGRheXMsIG5leHRJbmRleCwgLXZlcnRpY2FsT2Zmc2V0KTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc2V0Q2FsZW5kYXJWaWV3QW5kRW1pdE1vbnRoQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc2V0Q2FsZW5kYXJWaWV3KCk7XG4gICAgdGhpcy5fZW1pdE1vbnRoQ2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIF9yZXNldENhbGVuZGFyVmlldygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY29udGFpbmluZ0ZvY3VzKSB7XG4gICAgICB0aGlzLl9yZXNldEZvY3VzID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlRGF0ZSA9XG4gICAgICAodGhpcy5tdWx0aXBsZSA/ICh0aGlzLl92YWx1ZSBhcyBUW10pLmF0KC0xKSA6ICh0aGlzLl92YWx1ZSBhcyBUKSkgPz9cbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLnRvZGF5KCk7XG4gICAgdGhpcy5fc2V0Q2hvc2VuWWVhcigpO1xuICAgIHRoaXMuX2Nob3Nlbk1vbnRoID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2luaXQoKTtcbiAgICB0aGlzLl9jYWxlbmRhclZpZXcgPSB0aGlzLnZpZXc7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgY2FsZW5kYXIgdGFibGUgZm9yIHRoZSBkYWlseSB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVEYXlUYWJsZShcbiAgICB3ZWVrczogRGF5PFQ+W11bXSxcbiAgICB3ZWVrTnVtYmVyczogbnVtYmVyW10sXG4gICAgZmlyc3Q6IGJvb2xlYW4sXG4gICk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBjb25zdCBmaXJzdERheSA9IHdlZWtzWzBdWzBdLmRhdGVWYWx1ZTtcbiAgICBjb25zdCBtb250aExhYmVsID0gYCR7XG4gICAgICB0aGlzLl9tb250aE5hbWVzW3RoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKGZpcnN0RGF5KSAtIDFdXG4gICAgfSAke3RoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoZmlyc3REYXkpfWA7XG4gICAgY29uc3Qgd2Vla3NGb3JTZWxlY3RNdWx0aXBsZVdlZWtOdW1iZXJzOiBEYXk8VD5bXSA9IHdlZWtzLmZsYXQoKTtcbiAgICBjb25zdCB3ZWVrc0ZvclNlbGVjdE11bHRpcGxlV2Vla0RheXM6IERheTxUPltdID0gd2Vla3MuZmxhdCgpO1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtd3JhcHBlciBzYmItY2FsZW5kYXJfX2RheS12aWV3XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlclwiPlxuICAgICAgICAgIDxzcGFuPiR7bW9udGhMYWJlbH08L3NwYW4+ICR7Zmlyc3QgPyB0aGlzLl9jcmVhdGVEYXlUYWJsZUNvbnRyb2xzKG1vbnRoTGFiZWwpIDogbm90aGluZ31cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDx0YWJsZVxuICAgICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZVwiXG4gICAgICAgICAgQGZvY3Vzb3V0PSR7KGV2ZW50OiBGb2N1c0V2ZW50KSA9PlxuICAgICAgICAgICAgdGhpcy5faGFuZGxlVGFibGVCbHVyKGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpfVxuICAgICAgICA+XG4gICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAke3RoaXMud2Vla051bWJlcnNcbiAgICAgICAgICAgICAgICA/IGh0bWxgPHRoIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1oZWFkZXItY2VsbFwiPjwvdGg+YFxuICAgICAgICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgICAgICAgJHt0aGlzLl93ZWVrZGF5cy5tYXAoXG4gICAgICAgICAgICAgICAgKHdlZWtEYXk6IFdlZWtkYXksIGluZGV4OiBudW1iZXIpID0+IGh0bWxgXG4gICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlci1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICR7dGhpcy5tdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgID8gaHRtbGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNiYi1jYWxlbmRhci13ZWVrZGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlPSR7d2Vla0RheX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBTdW5kYXlzIGhhdmUgaW5kZXggNywgd2hpbGUgdGhlaXIgd2Vla0RheVZhbHVlIGlzIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRheXM6IERheTxUPltdID0gd2Vla3NGb3JTZWxlY3RNdWx0aXBsZVdlZWtEYXlzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRheTogRGF5PFQ+KSA9PiBkYXkud2Vla0RheVZhbHVlID09PSAoaW5kZXggKyAxKSAlIDcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApITtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdE11bHRpcGxlRGF0ZXMoZGF5cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2JiLWNhbGVuZGFyLXdlZWtkYXk+XG4gICAgICAgICAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICAgICAgICAgICAgOiBodG1sYFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIj4ke3dlZWtEYXkubG9uZ308L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiR7d2Vla0RheS5uYXJyb3d9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgYH1cbiAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgYCxcbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAke3dlZWtzLm1hcCgod2VlazogRGF5PFQ+W10sIHJvd0luZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZmlyc3RSb3dPZmZzZXQ6IG51bWJlciA9IERBWVNfUEVSX1JPVyAtIHdlZWsubGVuZ3RoO1xuICAgICAgICAgICAgICBpZiAocm93SW5kZXggPT09IDAgJiYgZmlyc3RSb3dPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgJHt0aGlzLndlZWtOdW1iZXJzXG4gICAgICAgICAgICAgICAgICAgICAgPyBodG1sYFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlci1jZWxsLXZlcnRpY2FsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLm11bHRpcGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGh0bWxgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNiYi1jYWxlbmRhci13ZWVrbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWU9JHt3ZWVrTnVtYmVyc1swXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF5czogRGF5PFQ+W10gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtzRm9yU2VsZWN0TXVsdGlwbGVXZWVrTnVtYmVycy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF5OiBEYXk8VD4pID0+IGRheS53ZWVrVmFsdWUgPT09IHdlZWtOdW1iZXJzWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RNdWx0aXBsZURhdGVzKGRheXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zYmItY2FsZW5kYXItd2Vla251bWJlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBodG1sYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JiLXNjcmVlbi1yZWFkZXItb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+JHtgJHtpMThuQ2FsZW5kYXJXZWVrTnVtYmVyW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSAke3dlZWtOdW1iZXJzWzBdfWB9PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiR7d2Vla051bWJlcnNbMF19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgICAgICAgICAgICAgJHtbLi4uQXJyYXkoZmlyc3RSb3dPZmZzZXQpLmtleXMoKV0ubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICgpID0+IGh0bWxgPHRkIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1kYXRhXCI+PC90ZD5gLFxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAke3RoaXMuX2NyZWF0ZURheUNlbGxzKHdlZWspfVxuICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICR7dGhpcy53ZWVrTnVtYmVyc1xuICAgICAgICAgICAgICAgICAgICA/IGh0bWxgXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlci1jZWxsLXZlcnRpY2FsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5tdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaHRtbGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNiYi1jYWxlbmRhci13ZWVrbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlPSR7d2Vla051bWJlcnNbcm93SW5kZXhdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRheXM6IERheTxUPltdID0gd2Vla3NGb3JTZWxlY3RNdWx0aXBsZVdlZWtOdW1iZXJzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRheTogRGF5PFQ+KSA9PiBkYXkud2Vla1ZhbHVlID09PSB3ZWVrTnVtYmVyc1tyb3dJbmRleF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApITtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdE11bHRpcGxlRGF0ZXMoZGF5cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2JiLWNhbGVuZGFyLXdlZWtudW1iZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBodG1sYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4ke2Ake2kxOG5DYWxlbmRhcldlZWtOdW1iZXJbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19ICR7d2Vla051bWJlcnNbcm93SW5kZXhdfWB9PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JHt3ZWVrTnVtYmVyc1tyb3dJbmRleF19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgICAgICAgICAke3RoaXMuX2NyZWF0ZURheUNlbGxzKHdlZWspfVxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICA8L3RhYmxlPlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSB0YWJsZSBpbiBvcmllbnRhdGlvbj0ndmVydGljYWwnLiAqL1xuICBwcml2YXRlIF9jcmVhdGVEYXlUYWJsZVZlcnRpY2FsKFxuICAgIHdlZWtzOiBEYXk8VD5bXVtdLFxuICAgIHdlZWtOdW1iZXJzOiBudW1iZXJbXSxcbiAgICBmaXJzdDogYm9vbGVhbixcbiAgKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IGZpcnN0RGF5ID0gd2Vla3NbMF1bMF0uZGF0ZVZhbHVlO1xuICAgIGNvbnN0IG1vbnRoTGFiZWwgPSBgJHtcbiAgICAgIHRoaXMuX21vbnRoTmFtZXNbdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZmlyc3REYXkpIC0gMV1cbiAgICB9ICR7dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihmaXJzdERheSl9YDtcbiAgICBjb25zdCBhY3RpdmVEYXRlID0gd2Vla3NbMF1bMF0uZGF0ZVZhbHVlO1xuICAgIGNvbnN0IHdlZWtPZmZzZXQgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRGaXJzdFdlZWtPZmZzZXQoYWN0aXZlRGF0ZSA/PyB0aGlzLl9hY3RpdmVEYXRlKTtcbiAgICBjb25zdCB3ZWVrc0ZvclNlbGVjdE11bHRpcGxlV2Vla051bWJlcnM6IERheTxUPltdID0gd2Vla3MuZmxhdCgpO1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtd3JhcHBlciBzYmItY2FsZW5kYXJfX2RheS12aWV3XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlclwiPlxuICAgICAgICAgIDxzcGFuPiR7bW9udGhMYWJlbH08L3NwYW4+ICR7Zmlyc3QgPyB0aGlzLl9jcmVhdGVEYXlUYWJsZUNvbnRyb2xzKG1vbnRoTGFiZWwpIDogbm90aGluZ31cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDx0YWJsZVxuICAgICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZVwiXG4gICAgICAgICAgQGZvY3Vzb3V0PSR7KGV2ZW50OiBGb2N1c0V2ZW50KSA9PlxuICAgICAgICAgICAgdGhpcy5faGFuZGxlVGFibGVCbHVyKGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpfVxuICAgICAgICA+XG4gICAgICAgICAgJHt0aGlzLndlZWtOdW1iZXJzXG4gICAgICAgICAgICA/IGh0bWxgXG4gICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWRhdGFcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgICAke3dlZWtOdW1iZXJzLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAod2Vla051bWJlcjogbnVtYmVyKSA9PiBodG1sYFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1oZWFkZXItY2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAke3RoaXMubXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGh0bWxgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzYmItY2FsZW5kYXItd2Vla251bWJlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZT0ke3dlZWtOdW1iZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF5czogRGF5PFQ+W10gPSB3ZWVrc0ZvclNlbGVjdE11bHRpcGxlV2Vla051bWJlcnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF5OiBEYXk8VD4pID0+IGRheS53ZWVrVmFsdWUgPT09IHdlZWtOdW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApITtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdE11bHRpcGxlRGF0ZXMoZGF5cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2JiLWNhbGVuZGFyLXdlZWtudW1iZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBodG1sYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4ke2Ake2kxOG5DYWxlbmRhcldlZWtOdW1iZXJbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19ICR7d2Vla051bWJlcn1gfTwvc3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiR7d2Vla051bWJlcn08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICBgLFxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICBgXG4gICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgJHt3ZWVrcy5tYXAoKHdlZWs6IERheTxUPltdLCByb3dJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHdlZWtkYXkgPSB0aGlzLl93ZWVrZGF5c1tyb3dJbmRleF07XG4gICAgICAgICAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtaGVhZGVyLWNlbGwtdmVydGljYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgJHt0aGlzLm11bHRpcGxlXG4gICAgICAgICAgICAgICAgICAgICAgPyBodG1sYFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c2JiLWNhbGVuZGFyLXdlZWtkYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWU9JHt3ZWVrZGF5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuX3NlbGVjdE11bHRpcGxlRGF0ZXMod2Vlayl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3dlZWtkYXkubmFycm93fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NiYi1jYWxlbmRhci13ZWVrZGF5PlxuICAgICAgICAgICAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgICAgICAgICAgIDogaHRtbGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmItc2NyZWVuLXJlYWRlci1vbmx5XCI+JHt3ZWVrZGF5Lmxvbmd9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4ke3dlZWtkYXkubmFycm93fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIGB9XG4gICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgJHtyb3dJbmRleCA8IHdlZWtPZmZzZXRcbiAgICAgICAgICAgICAgICAgICAgPyBodG1sYDx0ZCBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtZGF0YVwiPjwvdGQ+YFxuICAgICAgICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgICAgICAgICAke3RoaXMuX2NyZWF0ZURheUNlbGxzKHdlZWspfVxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICA8L3RhYmxlPlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZURheVRhYmxlQ29udHJvbHMobW9udGhMYWJlbDogc3RyaW5nKTogVGVtcGxhdGVSZXN1bHRbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpeGVkTW9udGhcbiAgICAgID8gW11cbiAgICAgIDogW1xuICAgICAgICAgIHRoaXMuX2dldEFycm93KFxuICAgICAgICAgICAgJ2xlZnQnLFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5fZ29Ub0RpZmZlcmVudE1vbnRoKC0xKSxcbiAgICAgICAgICAgIGkxOG5QcmV2aW91c01vbnRoW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdLFxuICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNNb250aERpc2FibGVkKCksXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0aGlzLl9nZXRBcnJvdyhcbiAgICAgICAgICAgICdyaWdodCcsXG4gICAgICAgICAgICAoKSA9PiB0aGlzLl9nb1RvRGlmZmVyZW50TW9udGgoMSksXG4gICAgICAgICAgICBpMThuTmV4dE1vbnRoW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdLFxuICAgICAgICAgICAgdGhpcy5fbmV4dE1vbnRoRGlzYWJsZWQoKSxcbiAgICAgICAgICApLFxuICAgICAgICAgIHRoaXMuX2dldEFycm93KFxuICAgICAgICAgICAgJ3VwJyxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fcmVzZXRGb2N1cyA9IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyVmlldyA9ICd5ZWFyJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBgJHtpMThuWWVhck1vbnRoU2VsZWN0aW9uW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSAke21vbnRoTGFiZWx9YCxcbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGNlbGxzIGZvciB0aGUgZGFpbHkgdmlldy4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlRGF5Q2VsbHMod2VlazogRGF5PFQ+W10pOiBUZW1wbGF0ZVJlc3VsdFtdIHtcbiAgICByZXR1cm4gd2Vlay5tYXAoKGRheTogRGF5PFQ+KSA9PiB7XG4gICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgPHRkIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1kYXRhIHNiYi1jYWxlbmRhcl9fZGF5LWNlbGxcIj5cbiAgICAgICAgICA8c2xvdCBuYW1lPSR7ZGF5LnZhbHVlfT5cbiAgICAgICAgICAgIDxzYmItY2FsZW5kYXItZGF5IHNsb3Q9JHtkYXkudmFsdWV9Pjwvc2JiLWNhbGVuZGFyLWRheT5cbiAgICAgICAgICA8L3Nsb3Q+XG4gICAgICAgIDwvdGQ+XG4gICAgICBgO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlbmRlciB0aGUgdmlldyBmb3IgdGhlIG1vbnRoIHNlbGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBfcmVuZGVyTW9udGhWaWV3KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLXdyYXBwZXIgc2JiLWNhbGVuZGFyX19tb250aC12aWV3XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlclwiPlxuICAgICAgICAgIDxzcGFuPiR7dGhpcy5fY2hvc2VuWWVhcn08L3NwYW4+XG4gICAgICAgICAgJHt0aGlzLl9maXhlZE1vbnRoXG4gICAgICAgICAgICA/IFtdXG4gICAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZXRBcnJvdyhcbiAgICAgICAgICAgICAgICAgICdsZWZ0JyxcbiAgICAgICAgICAgICAgICAgICgpID0+IHRoaXMuX2dvVG9EaWZmZXJlbnRZZWFyKC0xKSxcbiAgICAgICAgICAgICAgICAgIGkxOG5QcmV2aW91c1llYXJbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICAgICAgICAgICAgICB0aGlzLl9wcmV2aW91c1llYXJEaXNhYmxlZCgpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgdGhpcy5fZ2V0QXJyb3coXG4gICAgICAgICAgICAgICAgICAncmlnaHQnLFxuICAgICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5fZ29Ub0RpZmZlcmVudFllYXIoMSksXG4gICAgICAgICAgICAgICAgICBpMThuTmV4dFllYXJbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICAgICAgICAgICAgICB0aGlzLl9uZXh0WWVhckRpc2FibGVkKCksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB0aGlzLl9nZXRBcnJvdyhcbiAgICAgICAgICAgICAgICAgICdkb3duJyxcbiAgICAgICAgICAgICAgICAgICgpID0+IHRoaXMuX3Jlc2V0Q2FsZW5kYXJWaWV3QW5kRW1pdE1vbnRoQ2hhbmdlKCksXG4gICAgICAgICAgICAgICAgICBpMThuQ2FsZW5kYXJEYXRlU2VsZWN0aW9uW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIF19XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmItc2NyZWVuLXJlYWRlci1vbmx5XCIgcm9sZT1cInN0YXR1c1wiPiR7dGhpcy5fY2hvc2VuWWVhcn08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8dGFibGUgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlXCI+XG4gICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgJHt0aGlzLl9tb250aHMubWFwKFxuICAgICAgICAgICAgICAocm93OiBNb250aENlbGxbXSkgPT4gaHRtbGBcbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAke3Jvdy5tYXAoKG1vbnRoOiBNb250aENlbGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1kYXRhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2JiLWNhbGVuZGFyLW1vbnRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZT1cIiR7dGhpcy5fY2hvc2VuWWVhcn0tJHttb250aC52YWx1ZX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uTW9udGhTZWxlY3Rpb24obW9udGgubW9udGhWYWx1ZSwgdGhpcy5fY2hvc2VuWWVhciEpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBAa2V5ZG93bj0keyhldnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMuX2hhbmRsZUtleWJvYXJkRXZlbnQoZXZ0KX1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2JiLWNhbGVuZGFyLW1vbnRoPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICBgLFxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICA8L3RhYmxlPlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIC8qKiBTZWxlY3QgdGhlIG1vbnRoIGFuZCBjaGFuZ2UgdGhlIHZpZXcgdG8gZGF5IHNlbGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBfb25Nb250aFNlbGVjdGlvbihtb250aDogbnVtYmVyLCB5ZWFyOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9jaG9zZW5Nb250aCA9IG1vbnRoO1xuICAgIHRoaXMuX2NhbGVuZGFyVmlldyA9ICdkYXknO1xuICAgIHRoaXMuX2luaXQoXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgICB5ZWFyLFxuICAgICAgICB0aGlzLl9jaG9zZW5Nb250aCxcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLl9hY3RpdmVEYXRlKSxcbiAgICAgICksXG4gICAgKTtcbiAgICB0aGlzLl9lbWl0TW9udGhDaGFuZ2UoKTtcbiAgfVxuXG4gIC8qKiBSZW5kZXIgdGhlIHZpZXcgZm9yIHRoZSB5ZWFyIHNlbGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBfcmVuZGVyWWVhclZpZXcoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IGZpcnN0WWVhcjogbnVtYmVyID0gdGhpcy5feWVhcnMuZmxhdCgyKVswXTtcbiAgICBjb25zdCBsYXN0WWVhckFycmF5OiBudW1iZXJbXSA9IHRoaXMuX3llYXJzLmF0KC0xKSEuZmxhdCgpO1xuICAgIGNvbnN0IGxhc3RZZWFyOiBudW1iZXIgPSBsYXN0WWVhckFycmF5W2xhc3RZZWFyQXJyYXkubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgeWVhckxhYmVsID0gYCR7Zmlyc3RZZWFyfSAtICR7bGFzdFllYXJ9YDtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLXdyYXBwZXIgc2JiLWNhbGVuZGFyX195ZWFyLXZpZXdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtaGVhZGVyXCI+XG4gICAgICAgICAgPHNwYW4+JHt5ZWFyTGFiZWx9PC9zcGFuPlxuICAgICAgICAgICR7dGhpcy5fZml4ZWRNb250aFxuICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgOiBbXG4gICAgICAgICAgICAgICAgdGhpcy5fZ2V0QXJyb3coXG4gICAgICAgICAgICAgICAgICAnbGVmdCcsXG4gICAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLl9nb1RvRGlmZmVyZW50WWVhclJhbmdlKC1ZRUFSU19QRVJfUEFHRSksXG4gICAgICAgICAgICAgICAgICBpMThuUHJldmlvdXNZZWFyUmFuZ2UoWUVBUlNfUEVSX1BBR0UpW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdLFxuICAgICAgICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNZZWFyUmFuZ2VEaXNhYmxlZCgpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgdGhpcy5fZ2V0QXJyb3coXG4gICAgICAgICAgICAgICAgICAncmlnaHQnLFxuICAgICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5fZ29Ub0RpZmZlcmVudFllYXJSYW5nZShZRUFSU19QRVJfUEFHRSksXG4gICAgICAgICAgICAgICAgICBpMThuTmV4dFllYXJSYW5nZShZRUFSU19QRVJfUEFHRSlbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICAgICAgICAgICAgICB0aGlzLl9uZXh0WWVhclJhbmdlRGlzYWJsZWQoKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHRoaXMuX2dldEFycm93KFxuICAgICAgICAgICAgICAgICAgJ2Rvd24nLFxuICAgICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5fcmVzZXRDYWxlbmRhclZpZXdBbmRFbWl0TW9udGhDaGFuZ2UoKSxcbiAgICAgICAgICAgICAgICAgIGkxOG5DYWxlbmRhckRhdGVTZWxlY3Rpb25bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgXX1cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHlcIiByb2xlPVwic3RhdHVzXCI+JHt5ZWFyTGFiZWx9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHRhYmxlIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZVwiPlxuICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICR7dGhpcy5feWVhcnMubWFwKFxuICAgICAgICAgICAgICAocm93OiBudW1iZXJbXSkgPT5cbiAgICAgICAgICAgICAgICBodG1sYCA8dHI+XG4gICAgICAgICAgICAgICAgICAke3Jvdy5tYXAoKHllYXI6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWRhdGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzYmItY2FsZW5kYXIteWVhclxuICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWU9JHtTdHJpbmcoeWVhcil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBrZXlkb3duPSR7KGV2dDogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5faGFuZGxlS2V5Ym9hcmRFdmVudChldnQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLl9vblllYXJTZWxlY3Rpb24oeWVhcil9XG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NiYi1jYWxlbmRhci15ZWFyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICA8L3RyPmAsXG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG5cbiAgLyoqIFNlbGVjdCB0aGUgeWVhciBhbmQgY2hhbmdlIHRoZSB2aWV3IHRvIG1vbnRoIHNlbGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBfb25ZZWFyU2VsZWN0aW9uKHllYXI6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2Nob3NlblllYXIgPSB5ZWFyO1xuICAgIHRoaXMuX2NhbGVuZGFyVmlldyA9ICdtb250aCc7XG4gICAgdGhpcy5fYXNzaWduQWN0aXZlRGF0ZShcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICAgIHRoaXMuX2Nob3NlblllYXIsXG4gICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMuX2FjdGl2ZURhdGUpLFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMuX2FjdGl2ZURhdGUpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGJ1dHRvbiBhcnJvdyBmb3IgYWxsIHRoZSB2aWV3cy4gKi9cbiAgcHJpdmF0ZSBfZ2V0QXJyb3coXG4gICAgZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnIHwgJ2Rvd24nIHwgJ3VwJyxcbiAgICBjbGljazogKCkgPT4gdm9pZCxcbiAgICBhcmlhTGFiZWw6IHN0cmluZyxcbiAgICBkaXNhYmxlZCA9IGZhbHNlLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgPHNiYi1zZWNvbmRhcnktYnV0dG9uXG4gICAgICBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbFwiXG4gICAgICBzaXplPVwic1wiXG4gICAgICBpY29uLW5hbWU9XCJjaGV2cm9uLXNtYWxsLSR7ZGlyZWN0aW9ufS1zbWFsbFwiXG4gICAgICBhcmlhLWxhYmVsPSR7YXJpYUxhYmVsfVxuICAgICAgQGNsaWNrPSR7Y2xpY2t9XG4gICAgICA/ZGlzYWJsZWQ9JHtkaXNhYmxlZH1cbiAgICA+PC9zYmItc2Vjb25kYXJ5LWJ1dHRvbj5gO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VmlldygpOiBUZW1wbGF0ZVJlc3VsdCB8IHR5cGVvZiBub3RoaW5nIHtcbiAgICBzd2l0Y2ggKHRoaXMuX2NhbGVuZGFyVmlldykge1xuICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJZZWFyVmlldygpO1xuICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyTW9udGhWaWV3KCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbm90aGluZztcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBpZiAoaXNTZXJ2ZXIgfHwgdGhpcy5oeWRyYXRpb25SZXF1aXJlZCkge1xuICAgICAgLy8gVE9ETzogV2UgZGlzYWJsZSBTU1IgZm9yIGNhbGVuZGFyIGZvciBub3cuIEZpZ3VyZSBvdXQsIGlmIHRoZXJlIGlzIGEgd2F5XG4gICAgICAvLyB0byBlbmFibGUgaXQsIHdoaWxlIGNvbnNpZGVyaW5nIGkxOG4gYW5kIGRhdGUgaW5mb3JtYXRpb24uXG4gICAgICByZXR1cm4gaHRtbGAke25vdGhpbmd9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX193cmFwcGVyXCI+XG4gICAgICAke3RoaXMub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJ1xuICAgICAgICA/IHRoaXMuX3dlZWtzLm1hcCgod2Vla3MsIGkpID0+IHRoaXMuX2NyZWF0ZURheVRhYmxlKHdlZWtzLCB0aGlzLl93ZWVrTnVtYmVyc1tpXSwgaSA9PT0gMCkpXG4gICAgICAgIDogdGhpcy5fd2Vla3MubWFwKCh3ZWVrcywgaSkgPT5cbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZURheVRhYmxlVmVydGljYWwod2Vla3MsIHRoaXMuX3dlZWtOdW1iZXJzW2ldLCBpID09PSAwKSxcbiAgICAgICAgICApfVxuICAgICAgJHt0aGlzLl9nZXRWaWV3KCl9XG4gICAgPC9kaXY+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLWNhbGVuZGFyJzogU2JiQ2FsZW5kYXJFbGVtZW50O1xuICB9XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudEV2ZW50TWFwIHtcbiAgICBtb250aGNoYW5nZTogU2JiTW9udGhDaGFuZ2VFdmVudDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUNxREEsSUFBTSxlQUF1QjtBQUM3QixJQUFNLGlCQUF5QjtBQUMvQixJQUFNLGdCQUF3QjtBQUM5QixJQUFNLGtCQUEwQjtBQUNoQyxJQUFNLGlCQUF5QjtBQUUvQixJQUFhLHNCQUFiLGNBQXlDLE1BQUs7Q0FHNUMsSUFBVyxRQUFLO0VBQ2QsT0FBTyxLQUFLO0NBQ2Q7Q0FFQSxZQUFtQixPQUFxQjtFQUN0QyxNQUFNLGVBQWU7R0FBRSxTQUFTO0dBQU0sVUFBVTtFQUFJLENBQUU7RUFDdEQsS0FBSyxTQUFTLE9BQU8sT0FBTyxTQUFTLENBQUEsQ0FBRTtDQUN6Qzs7QUFHRixJQUFhLHVCQUFiLGNBQTZDLE1BQUs7Q0FHaEQsSUFBVyxlQUFZO0VBQ3JCLE9BQU8sS0FBSztDQUNkO0NBRUEsWUFBbUIsT0FBYztFQUMvQixNQUFNLGdCQUFnQjtHQUFFLFNBQVM7R0FBTSxVQUFVO0VBQUksQ0FBRTtFQUN2RCxLQUFLLGdCQUFnQixPQUFPLE9BQU8sS0FBSztDQUMxQzs7Ozs7OztJQWdEVyw0QkFBa0I7bUJBQW1CLHVCQUF1QixVQUFVOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2NBQXRFLDJCQUFxQyxZQUFrQzs7O3lCQXdCakYsVUFBUyxHQUNULFNBQVMsRUFBRSxNQUFNLE9BQU0sQ0FBRSxD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