@rivet-health/design-system 40.44.0 → 40.44.2

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 (321) hide show
  1. package/{esm2020 → esm2022}/lib/accessibility/sr-only/sr-only.component.mjs +4 -4
  2. package/esm2022/lib/download/download.service.mjs +47 -0
  3. package/{esm2020 → esm2022}/lib/format/pipes/common.mjs +5 -5
  4. package/{esm2020 → esm2022}/lib/format/pipes/date.pipe.mjs +4 -4
  5. package/{esm2020 → esm2022}/lib/format/pipes/days.pipe.mjs +4 -4
  6. package/{esm2020 → esm2022}/lib/format/pipes/dollars.pipe.mjs +4 -4
  7. package/{esm2020 → esm2022}/lib/format/pipes/number.pipe.mjs +4 -4
  8. package/{esm2020 → esm2022}/lib/format/pipes/percentage.pipe.mjs +4 -4
  9. package/esm2022/lib/format/pipes/sentence-case.pipe.mjs +61 -0
  10. package/esm2022/lib/format/pipes/small-currency.pipe.mjs +24 -0
  11. package/esm2022/lib/format/pipes/small-number.pipe.mjs +29 -0
  12. package/esm2022/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +62 -0
  13. package/esm2022/lib/format/truncate/truncate.component.mjs +51 -0
  14. package/esm2022/lib/icon/dom-cache.mjs +32 -0
  15. package/esm2022/lib/icon/icon.component.mjs +86 -0
  16. package/{esm2020 → esm2022}/lib/icon/icons.mjs +1 -1
  17. package/{esm2020 → esm2022}/lib/input/alphabetic-field/alphabetic-field.component.mjs +4 -4
  18. package/esm2022/lib/input/auto-focus/auto-focus.directive.mjs +48 -0
  19. package/esm2022/lib/input/button/button.component.mjs +139 -0
  20. package/esm2022/lib/input/button-group/button-group.component.mjs +39 -0
  21. package/{esm2020 → esm2022}/lib/input/calendar/calendar.component.mjs +4 -4
  22. package/{esm2020 → esm2022}/lib/input/card-checkbox/card-checkbox.component.mjs +4 -4
  23. package/{esm2020 → esm2022}/lib/input/checkbox/checkbox.component.mjs +4 -4
  24. package/{esm2020 → esm2022}/lib/input/currency-field/currency-field.component.mjs +4 -4
  25. package/esm2022/lib/input/date/date.component.mjs +279 -0
  26. package/esm2022/lib/input/date-range/date-range.component.mjs +477 -0
  27. package/esm2022/lib/input/filter-chip/filter-chip.component.mjs +47 -0
  28. package/{esm2020 → esm2022}/lib/input/filter-dropdown/filter-dropdown.component.mjs +5 -5
  29. package/{esm2020 → esm2022}/lib/input/input-label/input-label.component.mjs +4 -4
  30. package/esm2022/lib/input/mentions-input/mentions-input.component.mjs +745 -0
  31. package/esm2022/lib/input/number-field/number-field.component.mjs +125 -0
  32. package/{esm2020 → esm2022}/lib/input/percentage-field/percentage-field.component.mjs +4 -4
  33. package/esm2022/lib/input/phone-field/phone-field.component.mjs +74 -0
  34. package/{esm2020 → esm2022}/lib/input/radio/radio.component.mjs +4 -4
  35. package/{esm2020 → esm2022}/lib/input/search/search.component.mjs +4 -4
  36. package/esm2022/lib/input/search-select/search-select.component.mjs +189 -0
  37. package/esm2022/lib/input/select/select/select.component.mjs +178 -0
  38. package/{esm2020 → esm2022}/lib/input/select/select-node/select-node.component.mjs +4 -4
  39. package/esm2022/lib/input/select/state.mjs +882 -0
  40. package/{esm2020 → esm2022}/lib/input/simple-select/option-group.pipe.mjs +4 -4
  41. package/esm2022/lib/input/simple-select/simple-select.component.mjs +178 -0
  42. package/esm2022/lib/input/switch-checkbox/switch-checkbox.component.mjs +33 -0
  43. package/esm2022/lib/input/text-field/text-field.component.mjs +115 -0
  44. package/{esm2020 → esm2022}/lib/input/textarea-field/textarea-field.component.mjs +4 -4
  45. package/{esm2020 → esm2022}/lib/input/validation-message/validation-message.component.mjs +4 -4
  46. package/{esm2020 → esm2022}/lib/layout/card/card-actions.component.mjs +4 -4
  47. package/esm2022/lib/layout/card/card-content.component.mjs +64 -0
  48. package/esm2022/lib/layout/card/card-header.component.mjs +201 -0
  49. package/{esm2020 → esm2022}/lib/layout/card/card-link.component.mjs +5 -5
  50. package/{esm2020 → esm2022}/lib/layout/card/card-media.component.mjs +4 -4
  51. package/esm2022/lib/layout/card/card.component.mjs +291 -0
  52. package/{esm2020 → esm2022}/lib/layout/setting-row/setting-row.component.mjs +4 -4
  53. package/esm2022/lib/load/loading/loading.component.mjs +43 -0
  54. package/{esm2020 → esm2022}/lib/load/loading-cover/loading-cover.component.mjs +4 -4
  55. package/esm2022/lib/navigation/editable-heading/editable-heading.component.mjs +243 -0
  56. package/{esm2020 → esm2022}/lib/navigation/link/link.component.mjs +6 -6
  57. package/{esm2020 → esm2022}/lib/navigation/page-header/page-header.component.mjs +4 -4
  58. package/{esm2020 → esm2022}/lib/navigation/simple-tabs/simple-tab/simple-tab.component.mjs +4 -4
  59. package/{esm2020 → esm2022}/lib/navigation/simple-tabs/simple-tabs/simple-tabs.component.mjs +4 -4
  60. package/{esm2020 → esm2022}/lib/navigation/tabs/tab/tab.component.mjs +4 -4
  61. package/{esm2020 → esm2022}/lib/navigation/tabs/tabs/tabs.component.mjs +4 -4
  62. package/{esm2020 → esm2022}/lib/navigation/views/all-views-modal/all-views-modal.component.mjs +4 -4
  63. package/{esm2020 → esm2022}/lib/navigation/views/edit-view/edit-view.component.mjs +9 -9
  64. package/esm2022/lib/navigation/views/permission-picker/permission-picker.component.mjs +151 -0
  65. package/esm2022/lib/navigation/views/state.mjs +456 -0
  66. package/{esm2020 → esm2022}/lib/navigation/views/view-menu/view-menu.component.mjs +5 -5
  67. package/esm2022/lib/navigation/views/views/views.component.mjs +90 -0
  68. package/{esm2020 → esm2022}/lib/notification/badge/badge.component.mjs +4 -4
  69. package/esm2022/lib/notification/banner/banner-action.component.mjs +48 -0
  70. package/esm2022/lib/notification/banner/banner.component.mjs +61 -0
  71. package/esm2022/lib/notification/map-indicator/map-indicator.component.mjs +50 -0
  72. package/esm2022/lib/notification/map-indicator/map-indicators.mjs +15 -0
  73. package/{esm2020 → esm2022}/lib/notification/notification-badge/notification-badge.component.mjs +4 -4
  74. package/esm2022/lib/overlay/callout/callout.component.mjs +130 -0
  75. package/esm2022/lib/overlay/callout/callout.helpers.mjs +113 -0
  76. package/{esm2020 → esm2022}/lib/overlay/callout/help/help.component.mjs +4 -4
  77. package/esm2022/lib/overlay/callout/lock-scroll.directive.mjs +69 -0
  78. package/{esm2020 → esm2022}/lib/overlay/callout/menu/menu-item/menu-item.component.mjs +5 -5
  79. package/{esm2020 → esm2022}/lib/overlay/callout/menu/menu.component.mjs +4 -4
  80. package/esm2022/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +30 -0
  81. package/{esm2020 → esm2022}/lib/overlay/callout/tooltip/tooltip.component.mjs +4 -4
  82. package/esm2022/lib/overlay/callout/tooltip/tooltip.directive.mjs +138 -0
  83. package/esm2022/lib/overlay/modal/dialog/dialog.component.mjs +47 -0
  84. package/{esm2020 → esm2022}/lib/overlay/modal/dialog-stack.service.mjs +4 -4
  85. package/esm2022/lib/overlay/modal/form-dialog/form-dialog.component.mjs +146 -0
  86. package/esm2022/lib/overlay/modal/modal.component.mjs +31 -0
  87. package/{esm2020 → esm2022}/lib/overlay/modal/side-sheet/side-sheet.component.mjs +4 -4
  88. package/esm2022/lib/overlay/overlay-outlet.component.mjs +98 -0
  89. package/{esm2020 → esm2022}/lib/overlay/overlay.directive.mjs +5 -5
  90. package/{esm2020 → esm2022}/lib/overlay/overlay.service.mjs +5 -5
  91. package/{esm2020 → esm2022}/lib/overlay/toast/toast-action.component.mjs +4 -4
  92. package/esm2022/lib/overlay/toast/toast.component.mjs +41 -0
  93. package/{esm2020 → esm2022}/lib/riv.module.mjs +227 -227
  94. package/esm2022/lib/size/size.directive.mjs +33 -0
  95. package/esm2022/lib/table/simple-table/coordinate-helper.mjs +61 -0
  96. package/esm2022/lib/table/simple-table/simple-table-cell.component.mjs +36 -0
  97. package/esm2022/lib/table/simple-table/simple-table-header-cell.component.mjs +37 -0
  98. package/{esm2020 → esm2022}/lib/table/simple-table/simple-table-row.component.mjs +4 -4
  99. package/esm2022/lib/table/simple-table/simple-table.component.mjs +104 -0
  100. package/esm2022/lib/table/table/clipboard.mjs +182 -0
  101. package/esm2022/lib/table/table/state-helpers/collapse-helpers.mjs +116 -0
  102. package/esm2022/lib/table/table/state-helpers/column-helpers.mjs +383 -0
  103. package/{esm2020 → esm2022}/lib/table/table/state-helpers/display-helpers.mjs +1 -1
  104. package/esm2022/lib/table/table/state-helpers/nesting-helpers.mjs +123 -0
  105. package/esm2022/lib/table/table/state-helpers/order-helpers.mjs +164 -0
  106. package/esm2022/lib/table/table/state-helpers/pagination-helpers.mjs +139 -0
  107. package/esm2022/lib/table/table/state-helpers/result-helpers.mjs +70 -0
  108. package/esm2022/lib/table/table/state-helpers/search-helpers.mjs +72 -0
  109. package/esm2022/lib/table/table/state-helpers/selection-helpers.mjs +180 -0
  110. package/esm2022/lib/table/table/state.mjs +1035 -0
  111. package/esm2022/lib/table/table/table/table.component.mjs +367 -0
  112. package/{esm2020 → esm2022}/lib/table/table/table-collapse-all/table-collapse-all.component.mjs +5 -5
  113. package/esm2022/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +227 -0
  114. package/esm2022/lib/table/table/table-column-settings/table-column-settings.component.mjs +134 -0
  115. package/esm2022/lib/table/table/table-csv-export/table-csv-export.component.mjs +35 -0
  116. package/{esm2020 → esm2022}/lib/table/table/table-header-resize-handle/table-header-resize-handle.component.mjs +6 -6
  117. package/esm2022/lib/table/table/table-search/table-search.component.mjs +71 -0
  118. package/{esm2020 → esm2022}/lib/table/table/table-search-columns/table-search-columns.component.mjs +4 -4
  119. package/esm2022/lib/visibility/visibility.directive.mjs +34 -0
  120. package/esm2022/lib/visualization/chart/chart-scaling.mjs +380 -0
  121. package/esm2022/lib/visualization/chart/chart.component.mjs +626 -0
  122. package/esm2022/lib/visualization/chart/chart.mjs +3768 -0
  123. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-cell.component.mjs +5 -5
  124. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-header-cell.component.mjs +4 -4
  125. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-row.component.mjs +4 -4
  126. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table.component.mjs +4 -4
  127. package/{esm2020 → esm2022}/lib/visualization/donut/donut.component.mjs +4 -4
  128. package/{esm2020 → esm2022}/lib/visualization/funnel-chart/funnel-chart.component.mjs +5 -5
  129. package/esm2022/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +33 -0
  130. package/{esm2020 → esm2022}/lib/visualization/highlight/highlight.component.mjs +4 -4
  131. package/esm2022/lib/visualization/highlight/highlight.helpers.mjs +20 -0
  132. package/esm2022/lib/visualization/intervals.mjs +63 -0
  133. package/{esm2020 → esm2022}/lib/visualization/issue/issue.component.mjs +4 -4
  134. package/{esm2020 → esm2022}/lib/visualization/legend-item/legend-item.component.mjs +4 -4
  135. package/{esm2020 → esm2022}/lib/visualization/metric/metric.component.mjs +4 -4
  136. package/{esm2020 → esm2022}/lib/visualization/mini-pie/mini-pie.component.mjs +4 -4
  137. package/{esm2020 → esm2022}/lib/visualization/progress/progress.component.mjs +5 -5
  138. package/esm2022/lib/visualization/stacked-column/stacked-column.component.mjs +377 -0
  139. package/esm2022/lib/visualization/stacked-column/stacked-column.helpers.mjs +18 -0
  140. package/esm2022/lib/visualization/stacked-row/stacked-row.component.mjs +270 -0
  141. package/esm2022/lib/visualization/stacked-row/stacked-row.helpers.mjs +74 -0
  142. package/esm2022/lib/visualization/time-series/time-series.component.mjs +374 -0
  143. package/esm2022/lib/visualization/time-series/time-series.helpers.mjs +15 -0
  144. package/esm2022/lib/visualization/trend/trend.component.mjs +51 -0
  145. package/{esm2020 → esm2022}/lib/visualization/zero-state/zero-state.component.mjs +4 -4
  146. package/{fesm2020 → fesm2022}/rivet-health-design-system.mjs +670 -670
  147. package/{fesm2020 → fesm2022}/rivet-health-design-system.mjs.map +1 -1
  148. package/lib/format/svg-text-truncate/svg-text-truncate.directive.d.ts +1 -1
  149. package/lib/format/truncate/truncate.component.d.ts +1 -1
  150. package/lib/icon/icon.component.d.ts +1 -1
  151. package/lib/input/auto-focus/auto-focus.directive.d.ts +1 -1
  152. package/lib/input/button/button.component.d.ts +1 -1
  153. package/lib/input/calendar/calendar.component.d.ts +1 -1
  154. package/lib/input/checkbox/checkbox.component.d.ts +1 -1
  155. package/lib/input/currency-field/currency-field.component.d.ts +1 -1
  156. package/lib/input/date/date.component.d.ts +1 -1
  157. package/lib/input/date-range/date-range.component.d.ts +1 -1
  158. package/lib/input/filter-chip/filter-chip.component.d.ts +1 -1
  159. package/lib/input/filter-dropdown/filter-dropdown.component.d.ts +1 -1
  160. package/lib/input/input-label/input-label.component.d.ts +1 -1
  161. package/lib/input/mentions-input/mentions-input.component.d.ts +1 -1
  162. package/lib/input/number-field/number-field.component.d.ts +1 -1
  163. package/lib/input/percentage-field/percentage-field.component.d.ts +1 -1
  164. package/lib/input/phone-field/phone-field.component.d.ts +1 -1
  165. package/lib/input/radio/radio.component.d.ts +1 -1
  166. package/lib/input/search/search.component.d.ts +1 -1
  167. package/lib/input/search-select/search-select.component.d.ts +1 -1
  168. package/lib/input/select/select/select.component.d.ts +1 -1
  169. package/lib/input/select/select-node/select-node.component.d.ts +1 -1
  170. package/lib/input/simple-select/simple-select.component.d.ts +1 -1
  171. package/lib/input/switch-checkbox/switch-checkbox.component.d.ts +1 -1
  172. package/lib/input/text-field/text-field.component.d.ts +1 -1
  173. package/lib/input/textarea-field/textarea-field.component.d.ts +1 -1
  174. package/lib/input/validation-message/validation-message.component.d.ts +1 -1
  175. package/lib/layout/card/card-actions.component.d.ts +1 -1
  176. package/lib/layout/card/card-content.component.d.ts +1 -1
  177. package/lib/layout/card/card-header.component.d.ts +1 -1
  178. package/lib/layout/card/card-link.component.d.ts +1 -1
  179. package/lib/layout/card/card-media.component.d.ts +1 -1
  180. package/lib/layout/card/card.component.d.ts +1 -1
  181. package/lib/layout/setting-row/setting-row.component.d.ts +1 -1
  182. package/lib/load/loading/loading.component.d.ts +1 -1
  183. package/lib/load/loading-cover/loading-cover.component.d.ts +1 -1
  184. package/lib/navigation/editable-heading/editable-heading.component.d.ts +1 -1
  185. package/lib/navigation/link/link.component.d.ts +1 -1
  186. package/lib/navigation/page-header/page-header.component.d.ts +1 -1
  187. package/lib/navigation/simple-tabs/simple-tab/simple-tab.component.d.ts +1 -1
  188. package/lib/navigation/tabs/tab/tab.component.d.ts +1 -1
  189. package/lib/navigation/views/all-views-modal/all-views-modal.component.d.ts +1 -1
  190. package/lib/navigation/views/edit-view/edit-view.component.d.ts +1 -1
  191. package/lib/navigation/views/permission-picker/permission-picker.component.d.ts +3 -3
  192. package/lib/navigation/views/view-menu/view-menu.component.d.ts +1 -1
  193. package/lib/navigation/views/views/views.component.d.ts +1 -1
  194. package/lib/notification/badge/badge.component.d.ts +1 -1
  195. package/lib/notification/banner/banner-action.component.d.ts +1 -1
  196. package/lib/notification/banner/banner.component.d.ts +1 -1
  197. package/lib/notification/map-indicator/map-indicator.component.d.ts +1 -1
  198. package/lib/notification/notification-badge/notification-badge.component.d.ts +1 -1
  199. package/lib/overlay/callout/callout.component.d.ts +1 -1
  200. package/lib/overlay/callout/help/help.component.d.ts +1 -1
  201. package/lib/overlay/callout/lock-scroll.directive.d.ts +1 -1
  202. package/lib/overlay/callout/menu/menu-item/menu-item.component.d.ts +1 -1
  203. package/lib/overlay/callout/menu/menu.component.d.ts +1 -1
  204. package/lib/overlay/callout/tooltip/locked-tooltip.directive.d.ts +1 -1
  205. package/lib/overlay/callout/tooltip/tooltip.component.d.ts +1 -1
  206. package/lib/overlay/callout/tooltip/tooltip.directive.d.ts +1 -1
  207. package/lib/overlay/modal/dialog/dialog.component.d.ts +1 -1
  208. package/lib/overlay/modal/form-dialog/form-dialog.component.d.ts +1 -1
  209. package/lib/overlay/modal/modal.component.d.ts +1 -1
  210. package/lib/overlay/modal/side-sheet/side-sheet.component.d.ts +1 -1
  211. package/lib/overlay/toast/toast.component.d.ts +1 -1
  212. package/lib/table/simple-table/simple-table-header-cell.component.d.ts +1 -1
  213. package/lib/table/simple-table/simple-table-row.component.d.ts +1 -1
  214. package/lib/table/table/table/table.component.d.ts +1 -1
  215. package/lib/table/table/table-collapse-all/table-collapse-all.component.d.ts +1 -1
  216. package/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.d.ts +1 -1
  217. package/lib/table/table/table-column-settings/table-column-settings.component.d.ts +1 -1
  218. package/lib/table/table/table-csv-export/table-csv-export.component.d.ts +1 -1
  219. package/lib/table/table/table-search/table-search.component.d.ts +1 -1
  220. package/lib/table/table/table-search-columns/table-search-columns.component.d.ts +1 -1
  221. package/lib/visualization/chart/chart.component.d.ts +1 -1
  222. package/lib/visualization/data-table/data-table-row.component.d.ts +1 -1
  223. package/lib/visualization/donut/donut.component.d.ts +1 -1
  224. package/lib/visualization/funnel-chart/funnel-chart.component.d.ts +1 -1
  225. package/lib/visualization/highlight/highlight.component.d.ts +1 -1
  226. package/lib/visualization/issue/issue.component.d.ts +1 -1
  227. package/lib/visualization/legend-item/legend-item.component.d.ts +1 -1
  228. package/lib/visualization/metric/metric.component.d.ts +1 -1
  229. package/lib/visualization/mini-pie/mini-pie.component.d.ts +1 -1
  230. package/lib/visualization/progress/progress.component.d.ts +1 -1
  231. package/lib/visualization/stacked-column/stacked-column.component.d.ts +3 -3
  232. package/lib/visualization/stacked-row/stacked-row.component.d.ts +1 -1
  233. package/lib/visualization/time-series/time-series.component.d.ts +3 -3
  234. package/lib/visualization/trend/trend.component.d.ts +1 -1
  235. package/lib/visualization/zero-state/zero-state.component.d.ts +1 -1
  236. package/package.json +5 -11
  237. package/esm2020/lib/download/download.service.mjs +0 -47
  238. package/esm2020/lib/format/pipes/sentence-case.pipe.mjs +0 -61
  239. package/esm2020/lib/format/pipes/small-currency.pipe.mjs +0 -24
  240. package/esm2020/lib/format/pipes/small-number.pipe.mjs +0 -29
  241. package/esm2020/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +0 -62
  242. package/esm2020/lib/format/truncate/truncate.component.mjs +0 -51
  243. package/esm2020/lib/icon/dom-cache.mjs +0 -32
  244. package/esm2020/lib/icon/icon.component.mjs +0 -86
  245. package/esm2020/lib/input/auto-focus/auto-focus.directive.mjs +0 -48
  246. package/esm2020/lib/input/button/button.component.mjs +0 -139
  247. package/esm2020/lib/input/button-group/button-group.component.mjs +0 -39
  248. package/esm2020/lib/input/date/date.component.mjs +0 -279
  249. package/esm2020/lib/input/date-range/date-range.component.mjs +0 -477
  250. package/esm2020/lib/input/filter-chip/filter-chip.component.mjs +0 -47
  251. package/esm2020/lib/input/mentions-input/mentions-input.component.mjs +0 -745
  252. package/esm2020/lib/input/number-field/number-field.component.mjs +0 -125
  253. package/esm2020/lib/input/phone-field/phone-field.component.mjs +0 -74
  254. package/esm2020/lib/input/search-select/search-select.component.mjs +0 -189
  255. package/esm2020/lib/input/select/select/select.component.mjs +0 -178
  256. package/esm2020/lib/input/select/state.mjs +0 -882
  257. package/esm2020/lib/input/simple-select/simple-select.component.mjs +0 -178
  258. package/esm2020/lib/input/switch-checkbox/switch-checkbox.component.mjs +0 -33
  259. package/esm2020/lib/input/text-field/text-field.component.mjs +0 -115
  260. package/esm2020/lib/layout/card/card-content.component.mjs +0 -64
  261. package/esm2020/lib/layout/card/card-header.component.mjs +0 -201
  262. package/esm2020/lib/layout/card/card.component.mjs +0 -291
  263. package/esm2020/lib/load/loading/loading.component.mjs +0 -43
  264. package/esm2020/lib/navigation/editable-heading/editable-heading.component.mjs +0 -243
  265. package/esm2020/lib/navigation/views/permission-picker/permission-picker.component.mjs +0 -151
  266. package/esm2020/lib/navigation/views/state.mjs +0 -456
  267. package/esm2020/lib/navigation/views/views/views.component.mjs +0 -90
  268. package/esm2020/lib/notification/banner/banner-action.component.mjs +0 -48
  269. package/esm2020/lib/notification/banner/banner.component.mjs +0 -61
  270. package/esm2020/lib/notification/map-indicator/map-indicator.component.mjs +0 -50
  271. package/esm2020/lib/notification/map-indicator/map-indicators.mjs +0 -15
  272. package/esm2020/lib/overlay/callout/callout.component.mjs +0 -130
  273. package/esm2020/lib/overlay/callout/callout.helpers.mjs +0 -113
  274. package/esm2020/lib/overlay/callout/lock-scroll.directive.mjs +0 -69
  275. package/esm2020/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +0 -30
  276. package/esm2020/lib/overlay/callout/tooltip/tooltip.directive.mjs +0 -138
  277. package/esm2020/lib/overlay/modal/dialog/dialog.component.mjs +0 -47
  278. package/esm2020/lib/overlay/modal/form-dialog/form-dialog.component.mjs +0 -146
  279. package/esm2020/lib/overlay/modal/modal.component.mjs +0 -31
  280. package/esm2020/lib/overlay/overlay-outlet.component.mjs +0 -98
  281. package/esm2020/lib/overlay/toast/toast.component.mjs +0 -41
  282. package/esm2020/lib/size/size.directive.mjs +0 -33
  283. package/esm2020/lib/table/simple-table/coordinate-helper.mjs +0 -61
  284. package/esm2020/lib/table/simple-table/simple-table-cell.component.mjs +0 -36
  285. package/esm2020/lib/table/simple-table/simple-table-header-cell.component.mjs +0 -37
  286. package/esm2020/lib/table/simple-table/simple-table.component.mjs +0 -104
  287. package/esm2020/lib/table/table/clipboard.mjs +0 -182
  288. package/esm2020/lib/table/table/state-helpers/collapse-helpers.mjs +0 -116
  289. package/esm2020/lib/table/table/state-helpers/column-helpers.mjs +0 -383
  290. package/esm2020/lib/table/table/state-helpers/nesting-helpers.mjs +0 -123
  291. package/esm2020/lib/table/table/state-helpers/order-helpers.mjs +0 -164
  292. package/esm2020/lib/table/table/state-helpers/pagination-helpers.mjs +0 -139
  293. package/esm2020/lib/table/table/state-helpers/result-helpers.mjs +0 -70
  294. package/esm2020/lib/table/table/state-helpers/search-helpers.mjs +0 -72
  295. package/esm2020/lib/table/table/state-helpers/selection-helpers.mjs +0 -180
  296. package/esm2020/lib/table/table/state.mjs +0 -1035
  297. package/esm2020/lib/table/table/table/table.component.mjs +0 -367
  298. package/esm2020/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +0 -227
  299. package/esm2020/lib/table/table/table-column-settings/table-column-settings.component.mjs +0 -134
  300. package/esm2020/lib/table/table/table-csv-export/table-csv-export.component.mjs +0 -35
  301. package/esm2020/lib/table/table/table-search/table-search.component.mjs +0 -71
  302. package/esm2020/lib/visibility/visibility.directive.mjs +0 -34
  303. package/esm2020/lib/visualization/chart/chart-scaling.mjs +0 -380
  304. package/esm2020/lib/visualization/chart/chart.component.mjs +0 -626
  305. package/esm2020/lib/visualization/chart/chart.mjs +0 -3768
  306. package/esm2020/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +0 -33
  307. package/esm2020/lib/visualization/highlight/highlight.helpers.mjs +0 -20
  308. package/esm2020/lib/visualization/intervals.mjs +0 -63
  309. package/esm2020/lib/visualization/stacked-column/stacked-column.component.mjs +0 -377
  310. package/esm2020/lib/visualization/stacked-column/stacked-column.helpers.mjs +0 -18
  311. package/esm2020/lib/visualization/stacked-row/stacked-row.component.mjs +0 -270
  312. package/esm2020/lib/visualization/stacked-row/stacked-row.helpers.mjs +0 -74
  313. package/esm2020/lib/visualization/time-series/time-series.component.mjs +0 -374
  314. package/esm2020/lib/visualization/time-series/time-series.helpers.mjs +0 -15
  315. package/esm2020/lib/visualization/trend/trend.component.mjs +0 -51
  316. package/fesm2015/rivet-health-design-system.mjs +0 -18370
  317. package/fesm2015/rivet-health-design-system.mjs.map +0 -1
  318. /package/{esm2020 → esm2022}/lib/overlay/callout/select-callout-defaults.mjs +0 -0
  319. /package/{esm2020 → esm2022}/lib/util/local-storage.mjs +0 -0
  320. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  321. /package/{esm2020 → esm2022}/rivet-health-design-system.mjs +0 -0
@@ -1,456 +0,0 @@
1
- import Fuse from 'fuse.js';
2
- import { debounce, defaultsDeep, sortBy } from 'lodash';
3
- import { connectable, from, map, mergeScan, ReplaySubject, startWith, Subject, } from 'rxjs';
4
- export var RivViews;
5
- (function (RivViews) {
6
- RivViews.ViewPermissions = ['private', 'shared', 'public'];
7
- RivViews.MenuContexts = ['tab', 'all-views', 'overflow'];
8
- RivViews.UserSelectModes = ['select', 'search-select'];
9
- function createManager({ source, save, duplicate, userSource, userSelectMode, onAddUser, newTooltip, copyLink, options, setActiveViewId, }) {
10
- const defaultState = {
11
- views: [],
12
- activeViewId: null,
13
- temporaryViewId: null,
14
- containerWidth: 0,
15
- editingViewContext: null,
16
- deletingViewContext: null,
17
- overflow: {
18
- search: '',
19
- pickerOpen: false,
20
- },
21
- all: {
22
- search: '',
23
- privateOpen: true,
24
- sharedOpen: true,
25
- publicOpen: true,
26
- },
27
- userSource,
28
- userSelectMode: userSelectMode ?? 'select',
29
- onAddUser,
30
- newTooltip,
31
- hasSystemView: true,
32
- };
33
- const defaultedInitialState = defaultsDeep({}, options?.initialState, defaultState);
34
- const actions = new Subject();
35
- const coreState = actions.pipe(mergeScan((state, action) => from(reduce(state, action, source, debounce(save, 200), duplicate, copyLink, setActiveViewId)), defaultedInitialState, 1), startWith(defaultedInitialState));
36
- const state = connectable(coreState.pipe(map(s => {
37
- const enabledNormalViews = getEnabledViews(s.views);
38
- const activeView = enabledNormalViews.find(view => view.id === s.activeViewId);
39
- // If for some reason the active view is not currently enabled, we'll
40
- // default to making the first enabled view active instead.
41
- const activeViewId = activeView
42
- ? activeView.id
43
- : enabledNormalViews.length > 0
44
- ? enabledNormalViews[0].id
45
- : null;
46
- const allViews = s.views.map((view, i) => {
47
- const isSystemView = s.hasSystemView && i === 0;
48
- const isTemporaryView = s.temporaryViewId === view.id;
49
- return {
50
- ...view,
51
- enabled: view.enabled || isSystemView || isTemporaryView,
52
- active: activeViewId === view.id,
53
- system: isSystemView,
54
- temporary: isTemporaryView,
55
- };
56
- });
57
- const allEnabledViews = getEnabledViews(allViews);
58
- const displayedViews = calculateDisplayedViews(allEnabledViews, calculateOverflowViewIndex(s), activeViewId, s.temporaryViewId);
59
- const enabledViews = s.overflow.search
60
- ? searchViews(allEnabledViews, s.overflow.search, options?.fuseOptions)
61
- : allEnabledViews;
62
- const allPermanentViews = allViews.filter(view => !view.temporary);
63
- const allViewsFiltered = s.all.search
64
- ? searchViews(allPermanentViews, s.all.search, options?.fuseOptions)
65
- : allPermanentViews;
66
- const searchingAllViews = !!s.all.search;
67
- return {
68
- ...s,
69
- allViews,
70
- displayedViews,
71
- enabledViews,
72
- allEnabledViews,
73
- all: {
74
- ...s.all,
75
- privateOpen: searchingAllViews || s.all.privateOpen,
76
- privateViews: viewsByPermission(allViewsFiltered, 'private'),
77
- sharedOpen: searchingAllViews || s.all.sharedOpen,
78
- sharedViews: viewsByPermission(allViewsFiltered, 'shared'),
79
- publicOpen: searchingAllViews || s.all.publicOpen,
80
- publicViews: viewsByPermission(allViewsFiltered, 'public'),
81
- },
82
- activeViewId: activeViewId,
83
- };
84
- })), {
85
- connector: () => new ReplaySubject(1),
86
- resetOnDisconnect: false,
87
- });
88
- state.connect();
89
- // Load the views immediately
90
- actions.next({ type: 'load' });
91
- return { actions, state };
92
- }
93
- RivViews.createManager = createManager;
94
- function getEnabledViews(views) {
95
- return views.filter((v, i) => v.enabled || v.system || v.temporary);
96
- }
97
- /**
98
- * Translates an index in the enabled views list to the corresponding index
99
- * in the full views list. This is used to resolve UI indices (which only
100
- * show enabled views) to state.views indices (which includes all views).
101
- */
102
- function mapEnabledIndexToViewIndex(views, enabledIndex) {
103
- const enabledViews = getEnabledViews(views);
104
- const targetView = enabledViews[enabledIndex];
105
- if (!targetView)
106
- return enabledIndex;
107
- const viewIndex = views.findIndex(view => view.id === targetView.id);
108
- return viewIndex === -1 ? enabledIndex : viewIndex;
109
- }
110
- function calculateOverflowViewIndex(state) {
111
- const enabledViews = getEnabledViews(state.views);
112
- // Tabs have a minimum width of 92px.
113
- const possibleSlotCount = Math.floor(state.containerWidth / 92);
114
- // The "all views" sidebar trigger takes up one slot.
115
- const availableSlotCount = possibleSlotCount - 1;
116
- // If there are too many tabs, the "N more" trigger takes up one slot as well.
117
- // But we want to avoid the "1 more" case, so we only use a slot for "N more" if N != 1.
118
- if (availableSlotCount >= enabledViews.length)
119
- return enabledViews.length;
120
- else
121
- return availableSlotCount - 1; // the "N more" uses up a slot.
122
- }
123
- function calculateDisplayedViews(fullViews, overflowViewIndex, activeViewId, temporaryViewId) {
124
- const displayedViews = fullViews.slice(0, overflowViewIndex);
125
- const viewsToAlwaysDisplay = [];
126
- // The active view should always be displayed if it exists
127
- const activeViewInDisplay = displayedViews.some(view => view.id === activeViewId);
128
- if (activeViewId !== null && !activeViewInDisplay) {
129
- const activeView = fullViews.find(view => view.id === activeViewId);
130
- if (activeView && displayedViews.length > 0) {
131
- viewsToAlwaysDisplay.push(activeView);
132
- }
133
- }
134
- // We should try to display the temporary view if it exists
135
- const temporaryViewInDisplay = displayedViews.some(view => view.id === temporaryViewId);
136
- if (temporaryViewId !== null &&
137
- !temporaryViewInDisplay &&
138
- temporaryViewId != activeViewId) {
139
- const temporaryView = fullViews.find(view => view.id === temporaryViewId);
140
- if (temporaryView &&
141
- displayedViews.length > viewsToAlwaysDisplay.length) {
142
- viewsToAlwaysDisplay.push(temporaryView);
143
- }
144
- }
145
- if (viewsToAlwaysDisplay.length > 0) {
146
- const numViewsToReplace = viewsToAlwaysDisplay.length;
147
- return [
148
- ...displayedViews.slice(0, -1 * numViewsToReplace),
149
- ...viewsToAlwaysDisplay,
150
- ];
151
- }
152
- return displayedViews;
153
- }
154
- function viewsByPermission(views, permission) {
155
- return sortBy(views.filter(view => view.permission === permission), [v => !v.system, 'title']);
156
- }
157
- function searchViews(views, query, options) {
158
- const fuse = new Fuse(views, {
159
- threshold: 0.2,
160
- keys: ['title'],
161
- includeMatches: true,
162
- ...options,
163
- });
164
- const matchedOptions = fuse.search(query);
165
- return matchedOptions.map(result => ({
166
- ...result.item,
167
- titleHighlightIndices: [
168
- ...(result.matches?.find(match => match.key === 'title')?.indices ??
169
- []),
170
- ],
171
- }));
172
- }
173
- function getNextBestActiveView(state) {
174
- const enabledViews = getEnabledViews(state.views);
175
- const currentActiveViewIndex = enabledViews.findIndex(view => view.id === state.activeViewId);
176
- if (enabledViews.length == 0) {
177
- return null;
178
- }
179
- if (currentActiveViewIndex === -1)
180
- return enabledViews[0].id;
181
- return (enabledViews[currentActiveViewIndex + 1]?.id ??
182
- enabledViews[currentActiveViewIndex - 1]?.id ??
183
- enabledViews[0].id);
184
- }
185
- function deleteView(state, id) {
186
- const activeViewId = state.activeViewId === id
187
- ? getNextBestActiveView(state)
188
- : state.activeViewId;
189
- const temporaryViewId = state.temporaryViewId === id ? null : state.temporaryViewId;
190
- const views = state.views.filter(view => view.id !== id);
191
- return {
192
- ...state,
193
- views,
194
- activeViewId,
195
- temporaryViewId,
196
- deletingViewContext: null,
197
- };
198
- }
199
- function setEnabled(state, id, enabled) {
200
- return {
201
- ...state,
202
- views: state.views.map(view => view.id === id ? { ...view, enabled } : view),
203
- activeViewId: !enabled && state.activeViewId === id
204
- ? getNextBestActiveView(state)
205
- : state.activeViewId,
206
- };
207
- }
208
- function withDuplicateView(views, duplicatedView, newView) {
209
- const sourceIndex = views.findIndex(view => view.id === duplicatedView.id);
210
- if (sourceIndex === -1) {
211
- return [newView, ...views];
212
- }
213
- else {
214
- return [
215
- ...views.slice(0, sourceIndex + 1),
216
- newView,
217
- ...views.slice(sourceIndex + 1),
218
- ];
219
- }
220
- }
221
- function viewOrderChange(state, previousEnabledIndex, newEnabledIndex) {
222
- if (state.hasSystemView &&
223
- (previousEnabledIndex === 0 || newEnabledIndex === 0)) {
224
- return { state, shouldSave: false }; // Keep system view (index 0) in place
225
- }
226
- const actualPreviousIndex = mapEnabledIndexToViewIndex(state.views, previousEnabledIndex);
227
- const actualNewIndex = mapEnabledIndexToViewIndex(state.views, newEnabledIndex);
228
- const item = state.views[actualPreviousIndex];
229
- const withoutItem = state.views.filter((_, i) => i !== actualPreviousIndex);
230
- return {
231
- state: {
232
- ...state,
233
- views: [
234
- ...withoutItem.slice(0, actualNewIndex),
235
- item,
236
- ...withoutItem.slice(actualNewIndex),
237
- ],
238
- },
239
- shouldSave: true,
240
- };
241
- }
242
- function getPermanentViews(views, temporaryViewId) {
243
- return views.filter(view => view.id != temporaryViewId);
244
- }
245
- function savePermanentViews(save, views, temporaryViewId) {
246
- const permanentViews = getPermanentViews(views, temporaryViewId);
247
- save(permanentViews);
248
- }
249
- async function reduce(state, action, source, save, duplicate, copyLink, setActiveViewId) {
250
- switch (action.type) {
251
- case 'load':
252
- const views = await source();
253
- return {
254
- ...state,
255
- views,
256
- };
257
- case 'setActiveView': {
258
- const activeView = state.views.find(v => v.id === action.id);
259
- const views = activeView && !activeView.enabled
260
- ? state.views.map(view => view.id === action.id ? { ...view, enabled: true } : view)
261
- : state.views;
262
- // If enabling the view changed the views, we need to save.
263
- if (views !== state.views) {
264
- savePermanentViews(save, views, state.temporaryViewId);
265
- }
266
- // notify the caller that the active view has changed
267
- setActiveViewId(action.id);
268
- return {
269
- ...state,
270
- activeViewId: action.id,
271
- views,
272
- all: {
273
- ...state.all,
274
- search: '',
275
- },
276
- overflow: {
277
- ...state.overflow,
278
- search: '',
279
- },
280
- };
281
- }
282
- case 'setEnabled': {
283
- const newState = setEnabled(state, action.id, action.enabled);
284
- savePermanentViews(save, newState.views, newState.temporaryViewId);
285
- return newState;
286
- }
287
- case 'setContainerWidth':
288
- return {
289
- ...state,
290
- containerWidth: action.width,
291
- };
292
- case 'setOverflowPickerOpen':
293
- return {
294
- ...state,
295
- overflow: {
296
- ...state.overflow,
297
- pickerOpen: action.open,
298
- },
299
- };
300
- case 'setOverflowSearchQuery':
301
- return {
302
- ...state,
303
- overflow: {
304
- ...state.overflow,
305
- search: action.query,
306
- },
307
- };
308
- case 'setAllViewsSearchQuery':
309
- return {
310
- ...state,
311
- all: {
312
- ...state.all,
313
- search: action.query,
314
- },
315
- };
316
- case 'updateView': {
317
- if (action.view.id != state.temporaryViewId) {
318
- const views = state.views.map(view => view.id === action.view.id ? action.view : view);
319
- savePermanentViews(save, views, state.temporaryViewId);
320
- return {
321
- ...state,
322
- views: views,
323
- };
324
- }
325
- else {
326
- // Updating a temporary view saves the view and makes it permanent
327
- const temporaryViewToSave = await duplicate({ ...action.view });
328
- const views = state.views.map(view => view.id === action.view.id ? temporaryViewToSave : view);
329
- savePermanentViews(save, views, null);
330
- // Make sure the view we just saved is the active view
331
- setActiveViewId(temporaryViewToSave.id);
332
- return {
333
- ...state,
334
- views: views,
335
- activeViewId: temporaryViewToSave.id,
336
- temporaryViewId: null,
337
- };
338
- }
339
- }
340
- case 'deleteView': {
341
- const newState = deleteView(state, action.view.id);
342
- savePermanentViews(save, newState.views, state.temporaryViewId);
343
- return newState;
344
- }
345
- case 'duplicateView': {
346
- const newView = await duplicate({ ...action.view });
347
- return {
348
- ...state,
349
- views: withDuplicateView(state.views, action.view, newView),
350
- editingViewContext: {
351
- id: newView.id,
352
- autoRename: true,
353
- menuContext: action.menuContext,
354
- },
355
- activeViewId: newView.id,
356
- };
357
- }
358
- case 'copyLinkToView':
359
- await copyLink(action.view);
360
- return state;
361
- case 'viewOrderChange': {
362
- const { state: newState, shouldSave } = viewOrderChange(state, action.previousEnabledIndex, action.newEnabledIndex);
363
- if (shouldSave) {
364
- savePermanentViews(save, newState.views, state.temporaryViewId);
365
- }
366
- return newState;
367
- }
368
- case 'setAllViewsToggle':
369
- return {
370
- ...state,
371
- all: {
372
- ...state.all,
373
- privateOpen: action.permission === 'private'
374
- ? action.open
375
- : state.all.privateOpen,
376
- sharedOpen: action.permission === 'shared'
377
- ? action.open
378
- : state.all.sharedOpen,
379
- publicOpen: action.permission === 'public'
380
- ? action.open
381
- : state.all.publicOpen,
382
- },
383
- };
384
- case 'setEditingView':
385
- return {
386
- ...state,
387
- editingViewContext: action.context,
388
- };
389
- case 'setDeletingView':
390
- return {
391
- ...state,
392
- deletingViewContext: action.context,
393
- };
394
- case 'createTemporaryView':
395
- const existingPermanentViews = getPermanentViews(state.views, state.temporaryViewId);
396
- // Swap the active view to the temporary view
397
- setActiveViewId(action.view.id);
398
- return {
399
- ...state,
400
- temporaryViewId: action.view.id,
401
- activeViewId: action.view.id,
402
- views: [...existingPermanentViews, action.view],
403
- };
404
- }
405
- }
406
- ///////////////
407
- // Utilities //
408
- ///////////////
409
- function getPermissionTitle(permission) {
410
- switch (permission) {
411
- case 'private':
412
- return 'Private';
413
- case 'shared':
414
- return 'Shared';
415
- case 'public':
416
- return 'Public';
417
- }
418
- }
419
- RivViews.getPermissionTitle = getPermissionTitle;
420
- function getPermissionDescription(permission) {
421
- switch (permission) {
422
- case 'private':
423
- return 'Private - Only available to you';
424
- case 'shared':
425
- return 'Shared - Only visible to those with access';
426
- case 'public':
427
- return 'Public - Visible to everyone';
428
- }
429
- }
430
- RivViews.getPermissionDescription = getPermissionDescription;
431
- function isSharedView(view) {
432
- return view?.permission === 'shared';
433
- }
434
- RivViews.isSharedView = isSharedView;
435
- /**
436
- * Converts SearchSelectUser<U> items back to U[] for storage in sharedUsers.
437
- *
438
- * Cast required because TypeScript cannot prove that destructuring `new`
439
- * from `U & { new: boolean }` yields exactly `U` (spread/rest doesn't
440
- * narrow intersection types).
441
- *
442
- * - Strips `new: false` so isEqual() comparisons work (original users lack `new`)
443
- * - Preserves `new: true` so the backend knows which users to create
444
- */
445
- function toSharedUsers(users) {
446
- return users.map(user => {
447
- if (user.new) {
448
- return user;
449
- }
450
- const { new: _isNew, ...rest } = user;
451
- return rest;
452
- });
453
- }
454
- RivViews.toSharedUsers = toSharedUsers;
455
- })(RivViews || (RivViews = {}));
456
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9uYXZpZ2F0aW9uL3ZpZXdzL3N0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBa0MsTUFBTSxTQUFTLENBQUM7QUFDekQsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3hELE9BQU8sRUFDTCxXQUFXLEVBRVgsSUFBSSxFQUNKLEdBQUcsRUFDSCxTQUFTLEVBRVQsYUFBYSxFQUNiLFNBQVMsRUFDVCxPQUFPLEdBQ1IsTUFBTSxNQUFNLENBQUM7QUFLZCxNQUFNLEtBQVcsUUFBUSxDQTB6QnhCO0FBMXpCRCxXQUFpQixRQUFRO0lBQ1Ysd0JBQWUsR0FBRyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFVLENBQUM7SUFHM0QscUJBQVksR0FBRyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFVLENBQUM7SUFLekQsd0JBQWUsR0FBRyxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQVUsQ0FBQztJQWtLcEUsU0FBZ0IsYUFBYSxDQUFvQyxFQUMvRCxNQUFNLEVBQ04sSUFBSSxFQUNKLFNBQVMsRUFDVCxVQUFVLEVBQ1YsY0FBYyxFQUNkLFNBQVMsRUFDVCxVQUFVLEVBQ1YsUUFBUSxFQUNSLE9BQU8sRUFDUCxlQUFlLEdBQ1U7UUFDekIsTUFBTSxZQUFZLEdBQW9CO1lBQ3BDLEtBQUssRUFBRSxFQUFFO1lBQ1QsWUFBWSxFQUFFLElBQUk7WUFDbEIsZUFBZSxFQUFFLElBQUk7WUFDckIsY0FBYyxFQUFFLENBQUM7WUFDakIsa0JBQWtCLEVBQUUsSUFBSTtZQUN4QixtQkFBbUIsRUFBRSxJQUFJO1lBQ3pCLFFBQVEsRUFBRTtnQkFDUixNQUFNLEVBQUUsRUFBRTtnQkFDVixVQUFVLEVBQUUsS0FBSzthQUNsQjtZQUNELEdB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LElBQXFCO1FBRXJCLE9BQU8sSUFBSSxFQUFFLFVBQVUsS0FBSyxRQUFRLENBQUM7SUFDdkMsQ0FBQztJQUplLHFCQUFZLGVBSTNCLENBQUE7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxTQUFnQixhQUFhLENBQzNCLEtBQTRCO1FBRTVCLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN0QixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osT0FBTyxJQUFvQixDQUFDO2FBQzdCO1lBQ0QsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFDdEMsT0FBTyxJQUFvQixDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQVZlLHNCQUFhLGdCQVU1QixDQUFBO0FBQ0gsQ0FBQyxFQTF6QmdCLFFBQVEsS0FBUixRQUFRLFFBMHpCeEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRnVzZSwgeyBGdXNlUmVzdWx0LCBJRnVzZU9wdGlvbnMgfSBmcm9tICdmdXNlLmpzJztcbmltcG9ydCB7IGRlYm91bmNlLCBkZWZhdWx0c0RlZXAsIHNvcnRCeSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICBjb25uZWN0YWJsZSxcbiAgQ29ubmVjdGFibGUsXG4gIGZyb20sXG4gIG1hcCxcbiAgbWVyZ2VTY2FuLFxuICBPYnNlcnZhYmxlLFxuICBSZXBsYXlTdWJqZWN0LFxuICBzdGFydFdpdGgsXG4gIFN1YmplY3QsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGVlcFBhcnRpYWwgfSBmcm9tICd1dGlsaXR5LXR5cGVzJztcbmltcG9ydCB7IFJpdlNlbGVjdCB9IGZyb20gJy4uLy4uL2lucHV0L3NlbGVjdC9zdGF0ZSc7XG5pbXBvcnQgeyBIaWdobGlnaHRDb21wb25lbnQgfSBmcm9tICcuLi8uLi92aXN1YWxpemF0aW9uL2hpZ2hsaWdodC9oaWdobGlnaHQuY29tcG9uZW50JztcblxuZXhwb3J0IG5hbWVzcGFjZSBSaXZWaWV3cyB7XG4gIGV4cG9ydCBjb25zdCBWaWV3UGVybWlzc2lvbnMgPSBbJ3ByaXZhdGUnLCAnc2hhcmVkJywgJ3B1YmxpYyddIGFzIGNvbnN0O1xuICBleHBvcnQgdHlwZSBWaWV3UGVybWlzc2lvbiA9ICh0eXBlb2YgVmlld1Blcm1pc3Npb25zKVtudW1iZXJdO1xuXG4gIGV4cG9ydCBjb25zdCBNZW51Q29udGV4dHMgPSBbJ3RhYicsICdhbGwtdmlld3MnLCAnb3ZlcmZsb3cnXSBhcyBjb25zdDtcbiAgZXhwb3J0IHR5cGUgTWVudUNvbnRleHQgPSAodHlwZW9mIE1lbnVDb250ZXh0cylbbnVtYmVyXTtcblxuICBleHBvcnQgdHlwZSBVc2VyID0gUml2U2VsZWN0LkJhc2VPcHRpb247XG5cbiAgZXhwb3J0IGNvbnN0IFVzZXJTZWxlY3RNb2RlcyA9IFsnc2VsZWN0JywgJ3NlYXJjaC1zZWxlY3QnXSBhcyBjb25zdDtcbiAgZXhwb3J0IHR5cGUgVXNlclNlbGVjdE1vZGUgPSAodHlwZW9mIFVzZXJTZWxlY3RNb2RlcylbbnVtYmVyXTtcblxuICBleHBvcnQgdHlwZSBTZWFyY2hTZWxlY3RVc2VyPFUgZXh0ZW5kcyBVc2VyPiA9IFUgJiB7IG5ldzogYm9vbGVhbiB9O1xuXG4gIGV4cG9ydCB0eXBlIE9uQWRkVXNlcjxVIGV4dGVuZHMgVXNlcj4gPSAoXG4gICAgc2VhcmNoVGV4dDogc3RyaW5nLFxuICApID0+IFNlYXJjaFNlbGVjdFVzZXI8VT47XG5cbiAgZXhwb3J0IHR5cGUgVmlldzxVIGV4dGVuZHMgVXNlcj4gPSB7XG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcjtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gIH0gJiAoXG4gICAgfCB7XG4gICAgICAgIHBlcm1pc3Npb246ICdwcml2YXRlJyB8ICdwdWJsaWMnO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICBwZXJtaXNzaW9uOiAnc2hhcmVkJztcbiAgICAgICAgc2hhcmVkVXNlcnM6IFVbXTtcbiAgICAgIH1cbiAgKTtcblxuICBleHBvcnQgdHlwZSBGdWxsVmlldzxVIGV4dGVuZHMgVXNlciwgViBleHRlbmRzIFZpZXc8VT4+ID0gViAmIHtcbiAgICBhY3RpdmU6IGJvb2xlYW47XG4gICAgc3lzdGVtOiBib29sZWFuO1xuICAgIHRpdGxlSGlnaGxpZ2h0SW5kaWNlcz86IEhpZ2hsaWdodENvbXBvbmVudC5IaWdobGlnaHRJbmRpY2VzW107XG4gICAgdGVtcG9yYXJ5OiBib29sZWFuO1xuICB9O1xuXG4gIC8vLy8vLy8vLy8vXG4gIC8vIFN0YXRlIC8vXG4gIC8vLy8vLy8vLy8vXG5cbiAgZXhwb3J0IHR5cGUgQ29yZVN0YXRlPFUgZXh0ZW5kcyBVc2VyLCBWIGV4dGVuZHMgVmlldzxVPj4gPSB7XG4gICAgdmlld3M6IFZbXTtcbiAgICBhY3RpdmVWaWV3SWQ6IFZbJ2lkJ10gfCBudWxsO1xuICAgIHRlbXBvcmFyeVZpZXdJZDogVlsnaWQnXSB8IG51bGw7XG4gICAgY29udGFpbmVyV2lkdGg6IG51bWJlcjtcbiAgICBlZGl0aW5nVmlld0NvbnRleHQ6IHtcbiAgICAgIGlkOiBWWydpZCddO1xuICAgICAgYXV0b1JlbmFtZTogYm9vbGVhbjtcbiAgICAgIG1lbnVDb250ZXh0OiBNZW51Q29udGV4dDtcbiAgICB9IHwgbnVsbDtcbiAgICBkZWxldGluZ1ZpZXdDb250ZXh0OiB7IGlkOiBWWydpZCddOyBtZW51Q29udGV4dDogTWVudUNvbnRleHQgfSB8IG51bGw7XG4gICAgb3ZlcmZsb3c6IHtcbiAgICAgIHNlYXJjaDogc3RyaW5nO1xuICAgICAgcGlja2VyT3BlbjogYm9vbGVhbjtcbiAgICB9O1xuICAgIGFsbDoge1xuICAgICAgc2VhcmNoOiBzdHJpbmc7XG4gICAgICBwcml2YXRlT3BlbjogYm9vbGVhbjtcbiAgICAgIHNoYXJlZE9wZW46IGJvb2xlYW47XG4gICAgICBwdWJsaWNPcGVuOiBib29sZWFuO1xuICAgIH07XG4gICAgdXNlclNvdXJjZTogVXNlclNvdXJjZTxVPjtcbiAgICB1c2VyU2VsZWN0TW9kZTogVXNlclNlbGVjdE1vZGU7XG4gICAgb25BZGRVc2VyPzogT25BZGRVc2VyPFU+O1xuICAgIG5ld1Rvb2x0aXA/OiBzdHJpbmc7XG4gICAgaGFzU3lzdGVtVmlldzogYm9vbGVhbjtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBGdWxsU3RhdGU8VSBleHRlbmRzIFVzZXIsIFYgZXh0ZW5kcyBWaWV3PFU+PiA9IENvcmVTdGF0ZTxVLCBWPiAmIHtcbiAgICBhbGxWaWV3czogRnVsbFZpZXc8VSwgVj5bXTtcbiAgICBkaXNwbGF5ZWRWaWV3czogRnVsbFZpZXc8VSwgVj5bXTtcbiAgICBlbmFibGVkVmlld3M6IEZ1bGxWaWV3PFUsIFY+W107XG4gICAgYWxsRW5hYmxlZFZpZXdzOiBGdWxsVmlldzxVLCBWPltdO1xuICAgIGFsbDoge1xuICAgICAgcHJpdmF0ZVZpZXdzOiBGdWxsVmlldzxVLCBWPltdO1xuICAgICAgc2hhcmVkVmlld3M6IEZ1bGxWaWV3PFUsIFY+W107XG4gICAgICBwdWJsaWNWaWV3czogRnVsbFZpZXc8VSwgVj5bXTtcbiAgICB9O1xuICB9O1xuXG4gIC8vLy8vLy8vLy8vLy9cbiAgLy8gQWN0aW9ucyAvL1xuICAvLy8vLy8vLy8vLy8vXG5cbiAgZXhwb3J0IHR5cGUgQWN0aW9uPFUgZXh0ZW5kcyBVc2VyLCBWIGV4dGVuZHMgVmlldzxVPj4gPVxuICAgIHwgeyB0eXBlOiAnbG9hZCcgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnc2V0QWN0aXZlVmlldyc7XG4gICAgICAgIGlkOiBWWydpZCddO1xuICAgICAgICBzb3VyY2U/OiAndGFiJyB8ICdtZW51JyB8ICdvdmVyZmxvdyc7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdzZXRFbmFibGVkJztcbiAgICAgICAgaWQ6IFZbJ2lkJ107XG4gICAgICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgICAgIHNvdXJjZT86ICdtZW51JyB8ICdleWVJY29uJztcbiAgICAgIH1cbiAgICB8IHsgdHlwZTogJ3NldENvbnRhaW5lcldpZHRoJzsgd2lkdGg6IG51bWJlciB9XG4gICAgfCB7IHR5cGU6ICdzZXRPdmVyZmxvd1BpY2tlck9wZW4nOyBvcGVuOiBib29sZWFuIH1cbiAgICB8IHsgdHlwZTogJ3NldE92ZXJmbG93U2VhcmNoUXVlcnknOyBxdWVyeTogc3RyaW5nIH1cbiAgICB8IHsgdHlwZTogJ3NldEFsbFZpZXdzU2VhcmNoUXVlcnknOyBxdWVyeTogc3RyaW5nIH1cbiAgICB8IHsgdHlwZTogJ3VwZGF0ZVZpZXcnOyB2aWV3OiBWIH1cbiAgICB8IHsgdHlwZTogJ2RlbGV0ZVZpZXcnOyB2aWV3OiBWIH1cbiAgICB8IHsgdHlwZTogJ2R1cGxpY2F0ZVZpZXcnOyB2aWV3OiBWOyBtZW51Q29udGV4dDogTWVudUNvbnRleHQgfVxuICAgIHwgeyB0eXBlOiAnY29weUxpbmtUb1ZpZXcnOyB2aWV3OiBWIH1cbiAgICB8IHsgdHlwZTogJ3NldEVkaXRpbmdWaWV3JzsgY29udGV4dDogQ29yZVN0YXRlPFUsIFY+WydlZGl0aW5nVmlld0NvbnRleHQnXSB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdzZXREZWxldGluZ1ZpZXcnO1xuICAgICAgICBjb250ZXh0OiBDb3JlU3RhdGU8VSwgVj5bJ2RlbGV0aW5nVmlld0NvbnRleHQnXTtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3ZpZXdPcmRlckNoYW5nZSc7XG4gICAgICAgIHByZXZpb3VzRW5hYmxlZEluZGV4OiBudW1iZXI7XG4gICAgICAgIG5ld0VuYWJsZWRJbmRleDogbnVtYmVyO1xuICAgICAgICBzb3VyY2U/OiAndGFiRHJhZycgfCAnb3ZlcmZsb3dEcmFnJztcbiAgICAgICAgdmlld1RpdGxlPzogVlsndGl0bGUnXTtcbiAgICAgIH1cbiAgICB8IHsgdHlwZTogJ3NldEFsbFZpZXdzVG9nZ2xlJzsgcGVybWlzc2lvbjogVmlld1Blcm1pc3Npb247IG9wZW46IGJvb2xlYW4gfVxuICAgIHwgeyB0eXBlOiAnY3JlYXRlVGVtcG9yYXJ5Vmlldyc7IHZpZXc6IFYgfTtcblxuICAvLy8vLy8vLy8vLy9cbiAgLy8gU291cmNlIC8vXG4gIC8vLy8vLy8vLy8vL1xuXG4gIGV4cG9ydCB0eXBlIFNvdXJjZTxVIGV4dGVuZHMgVXNlciwgViBleHRlbmRzIFZpZXc8VT4+ID0gKCkgPT5cbiAgICB8IFZbXVxuICAgIHwgUHJvbWlzZTxWW10+O1xuICBleHBvcnQgdHlwZSBTYXZlPFUgZXh0ZW5kcyBVc2VyLCBWIGV4dGVuZHMgVmlldzxVPj4gPSAoXG4gICAgdmlld3M6IFZbXSxcbiAgKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgZXhwb3J0IHR5cGUgRHVwbGljYXRlPFUgZXh0ZW5kcyBVc2VyLCBWIGV4dGVuZHMgVmlldzxVPj4gPSAoXG4gICAgdmlld1RvRHVwbGljYXRlOiBWLFxuICApID0+IFYgfCBQcm9taXNlPFY+O1xuICBleHBvcnQgdHlwZSBVc2VyU291cmNlPFUgZXh0ZW5kcyBVc2VyPiA9ICgpID0+IFVbXSB8IFByb21pc2U8VVtdPjtcbiAgZXhwb3J0IHR5cGUgQ29weUxpbms8VSBleHRlbmRzIFVzZXIsIFYgZXh0ZW5kcyBWaWV3PFU+PiA9IChcbiAgICB2aWV3OiBWLFxuICApID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBleHBvcnQgdHlwZSBTZXRBY3RpdmVWaWV3SWQ8VSBleHRlbmRzIFVzZXIsIFYgZXh0ZW5kcyBWaWV3PFU+PiA9IChcbiAgICBpZDogVlsnaWQnXSxcbiAgKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuICAvLy8vLy8vLy8vLy8vXG4gIC8vIE1hbmFnZXIgLy9cbiAgLy8vLy8vLy8vLy8vL1xuXG4gIGV4cG9ydCB0eXBlIE1hbmFnZXI8VSBleHRlbmRzIFVzZXIsIFYgZXh0ZW5kcyBWaWV3PFU+PiA9IHtcbiAgICBhY3Rpb25zOiBTdWJqZWN0PEFjdGlvbjxVLCBWPj47XG4gICAgc3RhdGU6IENvbm5lY3RhYmxlPEZ1bGxTdGF0ZTxVLCBWPj47XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgTWFuYWdlck9wdGlvbnM8VSBleHRlbmRzIFVzZXIsIFYgZXh0ZW5kcyBWaWV3PFU+PiA9IHtcbiAgICBpbml0aWFsU3RhdGU/OiBEZWVwUGFydGlhbDxDb3JlU3RhdGU8VSwgVj4+O1xuICAgIGZ1c2VPcHRpb25zPzogSUZ1c2VPcHRpb25zPFY+O1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIENyZWF0ZU1hbmFnZXJJbnB1dDxVIGV4dGVuZHMgVXNlciwgViBleHRlbmRzIFZpZXc8VT4+ID0ge1xuICAgIHNvdXJjZTogU291cmNlPFUsIFY+O1xuICAgIHNhdmU6IFNhdmU8VSwgVj47XG4gICAgZHVwbGljYXRlOiBEdXBsaWNhdGU8VSwgVj47XG4gICAgdXNlclNvdXJjZTogVXNlclNvdXJjZTxVPjtcbiAgICB1c2VyU2VsZWN0TW9kZT86IFVzZXJTZWxlY3RNb2RlO1xuICAgIG9uQWRkVXNlcj86IE9uQWRkVXNlcjxVPjtcbiAgICBuZXdUb29sdGlwPzogc3RyaW5nO1xuICAgIGNvcHlMaW5rOiBDb3B5TGluazxVLCBWPjtcbiAgICBzZXRBY3RpdmVWaWV3SWQ6IFNldEFjdGl2ZVZpZXdJZDxVLCBWPjtcbiAgICBvcHRpb25zPzogTWFuYWdlck9wdGlvbnM8VSwgVj47XG4gIH07XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1hbmFnZXI8VSBleHRlbmRzIFVzZXIsIFYgZXh0ZW5kcyBWaWV3PFU+Pih7XG4gICAgc291cmNlLFxuICAgIHNhdmUsXG4gICAgZHVwbGljYXRlLFxuICAgIHVzZXJTb3VyY2UsXG4gICAgdXNlclNlbGVjdE1vZGUsXG4gICAgb25BZGRVc2VyLFxuICAgIG5ld1Rvb2x0aXAsXG4gICAgY29weUxpbmssXG4gICAgb3B0aW9ucyxcbiAgICBzZXRBY3RpdmVWaWV3SWQsXG4gIH06IENyZWF0ZU1hbmFnZXJJbnB1dDxVLCBWPik6IE1hbmFnZXI8VSwgVj4ge1xuICAgIGNvbnN0IGRlZmF1bHRTdGF0ZTogQ29yZVN0YXRlPFUsIFY+ID0ge1xuICAgICAgdmlld3M6IFtdLFxuICAgICAgYWN0aXZlVmlld0lkOiBudWxsLFxuICAgICAgdGVtcG9yYXJ5Vmlld0lkOiBudWxsLFxuICAgICAgY29udGFpbmVyV2lkdGg6IDAsXG4gICAgICBlZGl0aW5nVmlld0NvbnRleHQ6IG51bGwsXG4gICAgICBkZWxldGluZ1ZpZXdDb250ZXh0OiBudWxsLFxuICAgICAgb3ZlcmZsb3c6IHtcbiAgICAgICAgc2VhcmNoOiAnJyxcbiAgICAgICAgcGlja2VyT3BlbjogZmFsc2UsXG4gICAgICB9LFxuICAgICAgYWxsOiB7XG4gICAgICAgIHNlYXJjaDogJycsXG4gICAgICAgIHByaXZhdGVPcGVuOiB0cnVlLFxuICAgICAgICBzaGFyZWRPcGVuOiB0cnVlLFxuICAgICAgICBwdWJsaWNPcGVuOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHVzZXJTb3VyY2UsXG4gICAgICB1c2VyU2VsZWN0TW9kZTogdXNlclNlbGVjdE1vZGUgPz8gJ3NlbGVjdCcsXG4gICAgICBvbkFkZFVzZXIsXG4gICAgICBuZXdUb29sdGlwLFxuICAgICAgaGFzU3lzdGVtVmlldzogdHJ1ZSxcbiAgICB9O1xuXG4gICAgY29uc3QgZGVmYXVsdGVkSW5pdGlhbFN0YXRlOiBDb3JlU3RhdGU8VSwgVj4gPSBkZWZhdWx0c0RlZXAoXG4gICAgICB7fSxcbiAgICAgIG9wdGlvbnM/LmluaXRpYWxTdGF0ZSxcbiAgICAgIGRlZmF1bHRTdGF0ZSxcbiAgICApO1xuXG4gICAgY29uc3QgYWN0aW9uczogU3ViamVjdDxBY3Rpb248VSwgVj4+ID0gbmV3IFN1YmplY3QoKTtcbiAgICBjb25zdCBjb3JlU3RhdGU6IE9ic2VydmFibGU8Q29yZVN0YXRlPFUsIFY+PiA9IGFjdGlvbnMucGlwZShcbiAgICAgIG1lcmdlU2NhbihcbiAgICAgICAgKHN0YXRlLCBhY3Rpb24pID0+XG4gICAgICAgICAgZnJvbShcbiAgICAgICAgICAgIHJlZHVjZShcbiAgICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICBkZWJvdW5jZShzYXZlLCAyMDApLFxuICAgICAgICAgICAgICBkdXBsaWNhdGUsXG4gICAgICAgICAgICAgIGNvcHlMaW5rLFxuICAgICAgICAgICAgICBzZXRBY3RpdmVWaWV3SWQsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIGRlZmF1bHRlZEluaXRpYWxTdGF0ZSxcbiAgICAgICAgMSxcbiAgICAgICksXG4gICAgICBzdGFydFdpdGgoZGVmYXVsdGVkSW5pdGlhbFN0YXRlKSxcbiAgICApO1xuXG4gICAgY29uc3Qgc3RhdGU6IENvbm5lY3RhYmxlPEZ1bGxTdGF0ZTxVLCBWPj4gPSBjb25uZWN0YWJsZShcbiAgICAgIGNvcmVTdGF0ZS5waXBlKFxuICAgICAgICBtYXAocyA9PiB7XG4gICAgICAgICAgY29uc3QgZW5hYmxlZE5vcm1hbFZpZXdzOiBWW10gPSBnZXRFbmFibGVkVmlld3Mocy52aWV3cyk7XG4gICAgICAgICAgY29uc3QgYWN0aXZlVmlldzogViB8IHVuZGVmaW5lZCA9IGVuYWJsZWROb3JtYWxWaWV3cy5maW5kKFxuICAgICAgICAgICAgdmlldyA9PiB2aWV3LmlkID09PSBzLmFjdGl2ZVZpZXdJZCxcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIElmIGZvciBzb21lIHJlYXNvbiB0aGUgYWN0aXZlIHZpZXcgaXMgbm90IGN1cnJlbnRseSBlbmFibGVkLCB3ZSdsbFxuICAgICAgICAgIC8vIGRlZmF1bHQgdG8gbWFraW5nIHRoZSBmaXJzdCBlbmFibGVkIHZpZXcgYWN0aXZlIGluc3RlYWQuXG4gICAgICAgICAgY29uc3QgYWN0aXZlVmlld0lkOiBWWydpZCddIHwgbnVsbCA9IGFjdGl2ZVZpZXdcbiAgICAgICAgICAgID8gYWN0aXZlVmlldy5pZFxuICAgICAgICAgICAgOiBlbmFibGVkTm9ybWFsVmlld3MubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyBlbmFibGVkTm9ybWFsVmlld3NbMF0uaWRcbiAgICAgICAgICAgIDogbnVsbDtcblxuICAgICAgICAgIGNvbnN0IGFsbFZpZXdzOiBGdWxsVmlldzxVLCBWPltdID0gcy52aWV3cy5tYXAoKHZpZXcsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzU3lzdGVtVmlldzogYm9vbGVhbiA9IHMuaGFzU3lzdGVtVmlldyAmJiBpID09PSAwO1xuICAgICAgICAgICAgY29uc3QgaXNUZW1wb3JhcnlWaWV3OiBib29sZWFuID0gcy50ZW1wb3JhcnlWaWV3SWQgPT09IHZpZXcuaWQ7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi52aWV3LFxuICAgICAgICAgICAgICBlbmFibGVkOiB2aWV3LmVuYWJsZWQgfHwgaXNTeXN0ZW1WaWV3IHx8IGlzVGVtcG9yYXJ5VmlldyxcbiAgICAgICAgICAgICAgYWN0aXZlOiBhY3RpdmVWaWV3SWQgPT09IHZpZXcuaWQsXG4gICAgICAgICAgICAgIHN5c3RlbTogaXNTeXN0ZW1WaWV3LFxuICAgICAgICAgICAgICB0ZW1wb3Jhcnk6IGlzVGVtcG9yYXJ5VmlldyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBhbGxFbmFibGVkVmlld3MgPSBnZXRFbmFibGVkVmlld3MoYWxsVmlld3MpO1xuXG4gICAgICAgICAgY29uc3QgZGlzcGxheWVkVmlld3MgPSBjYWxjdWxhdGVEaXNwbGF5ZWRWaWV3cyhcbiAgICAgICAgICAgIGFsbEVuYWJsZWRWaWV3cyxcbiAgICAgICAgICAgIGNhbGN1bGF0ZU92ZXJmbG93Vmlld0luZGV4KHMpLFxuICAgICAgICAgICAgYWN0aXZlVmlld0lkLFxuICAgICAgICAgICAgcy50ZW1wb3JhcnlWaWV3SWQsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IGVuYWJsZWRWaWV3cyA9IHMub3ZlcmZsb3cuc2VhcmNoXG4gICAgICAgICAgICA/IHNlYXJjaFZpZXdzKFxuICAgICAgICAgICAgICAgIGFsbEVuYWJsZWRWaWV3cyxcbiAgICAgICAgICAgICAgICBzLm92ZXJmbG93LnNlYXJjaCxcbiAgICAgICAgICAgICAgICBvcHRpb25zPy5mdXNlT3B0aW9ucyxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBhbGxFbmFibGVkVmlld3M7XG5cbiAgICAgICAgICBjb25zdCBhbGxQZXJtYW5lbnRWaWV3cyA9IGFsbFZpZXdzLmZpbHRlcih2aWV3ID0+ICF2aWV3LnRlbXBvcmFyeSk7XG4gICAgICAgICAgY29uc3QgYWxsVmlld3NGaWx0ZXJlZCA9IHMuYWxsLnNlYXJjaFxuICAgICAgICAgICAgPyBzZWFyY2hWaWV3cyhhbGxQZXJtYW5lbnRWaWV3cywgcy5hbGwuc2VhcmNoLCBvcHRpb25zPy5mdXNlT3B0aW9ucylcbiAgICAgICAgICAgIDogYWxsUGVybWFuZW50Vmlld3M7XG5cbiAgICAgICAgICBjb25zdCBzZWFyY2hpbmdBbGxWaWV3cyA9ICEhcy5hbGwuc2VhcmNoO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnMsXG4gICAgICAgICAgICBhbGxWaWV3cyxcbiAgICAgICAgICAgIGRpc3BsYXllZFZpZXdzLFxuICAgICAgICAgICAgZW5hYmxlZFZpZXdzLFxuICAgICAgICAgICAgYWxsRW5hYmxlZFZpZXdzLFxuICAgICAgICAgICAgYWxsOiB7XG4gICAgICAgICAgICAgIC4uLnMuYWxsLFxuICAgICAgICAgICAgICBwcml2YXRlT3Blbjogc2VhcmNoaW5nQWxsVmlld3MgfHwgcy5hbGwucHJpdmF0ZU9wZW4sXG4gICAgICAgICAgICAgIHByaXZhdGVWaWV3czogdmlld3NCeVBlcm1pc3Npb24oYWxsVmlld3NGaWx0ZXJlZCwgJ3ByaXZhdGUnKSxcbiAgICAgICAgICAgICAgc2hhcmVkT3Blbjogc2VhcmNoaW5nQWxsVmlld3MgfHwgcy5hbGwuc2hhcmVkT3BlbixcbiAgICAgICAgICAgICAgc2hhcmVkVmlld3M6IHZpZXdzQnlQZXJtaXNzaW9uKGFsbFZpZXdzRmlsdGVyZWQsICdzaGFyZWQnKSxcbiAgICAgICAgICAgICAgcHVibGljT3Blbjogc2VhcmNoaW5nQWxsVmlld3MgfHwgcy5hbGwucHVibGljT3BlbixcbiAgICAgICAgICAgICAgcHVibGljVmlld3M6IHZpZXdzQnlQZXJtaXNzaW9uKGFsbFZpZXdzRmlsdGVyZWQsICdwdWJsaWMnKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY3RpdmVWaWV3SWQ6IGFjdGl2ZVZpZXdJZCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICB7XG4gICAgICAgIGNvbm5lY3RvcjogKCkgPT4gbmV3IFJlcGxheVN1YmplY3QoMSksXG4gICAgICAgIHJlc2V0T25EaXNjb25uZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBzdGF0ZS5jb25uZWN0KCk7XG5cbiAgICAvLyBMb2FkIHRoZSB2aWV3cyBpbW1lZGlhdGVseVxuICAgIGFjdGlvbnMubmV4dCh7IHR5cGU6ICdsb2FkJyB9KTtcblxuICAgIHJldHVybiB7IGFjdGlvbnMsIHN0YXRlIH07XG4gIH1cblxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIC8vIFN0YXRlIHJlZHVjZXIgKHdpdGggaGVscGVycykgLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gIGZ1bmN0aW9uIGdldEVuYWJsZWRWaWV3czxVIGV4dGVuZHMgVXNlciwgViBleHRlbmRzIFZpZXc8VT4+KHZpZXdzOiBWW10pOiBWW107XG4gIGZ1bmN0aW9uIGdldEVuYWJsZWRWaWV3czxVIGV4dGVuZHMgVXNlciwgViBleHRlbmRzIFZpZXc8VT4+KFxuICAgIHZpZXdzOiBGdWxsVmlldzxVLCBWPltdLFxuICApOiBGdWxsVmlldzxVLCBWPltdIHtcbiAgICByZXR1cm4gdmlld3MuZmlsdGVyKCh2LCBpKSA9PiB2LmVuYWJsZWQgfHwgdi5zeXN0ZW0gfHwgdi50ZW1wb3JhcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zbGF0ZXMgYW4gaW5kZXggaW4gdGhlIGVuYWJsZWQgdmlld3MgbGlzdCB0byB0aGUgY29ycmVzcG9uZGluZyBpbmRleFxuICAgKiBpbiB0aGUgZnVsbCB2aWV3cyBsaXN0LiBUaGlzIGlzIHVzZWQgdG8gcmVzb2x2ZSBVSSBpbmRpY2VzICh3aGljaCBvbmx5XG4gICAqIHNob3cgZW5hYmxlZCB2aWV3cykgdG8gc3RhdGUudmlld3MgaW5kaWNlcyAod2hpY2ggaW5jbHVkZXMgYWxsIHZpZXdzKS5cbiAgICovXG4gIGZ1bmN0aW9uIG1hcEVuYWJsZWRJbmRleFRvVmlld0luZGV4PFUgZXh0ZW5kcyBVc2VyLCBWIGV4dGVuZHMgVmlldzxVPj4oXG4gICAgdmlld3M6IFZbXSxcbiAgICBlbmFibGVkSW5kZXg6IG51bWJlcixcbiAgKTogbnVtYmVyIHtcbiAgICBjb25zdCBlbmFibGVkVmlld3MgPSBnZXRFbmFibGVkVmlld3Modmlld3MpO1xuXG4gICAgY29uc3QgdGFyZ2V0VmlldyA9IGVuYWJsZWRWaWV3c1tlbmFibGVkSW5kZXhdO1xuICAgIGlmICghdGFyZ2V0VmlldykgcmV0dXJuIGVuYWJsZWRJbmRleDtcblxuICAgIGNvbnN0IHZpZXdJbmRleCA9IHZpZXdzLmZpbmRJbmRleCh2aWV3ID0+IHZpZXcuaWQgPT09IHRhcmdldFZpZXcuaWQpO1xuICAgIHJldHVybiB2aWV3SW5kZXggPT09IC0xID8gZW5hYmxlZEluZGV4IDogdmlld0luZGV4O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FsY3VsYXRlT3ZlcmZsb3dWaWV3SW5kZXg8VSBleHRlbmRzIFVzZXIsIFYgZXh0ZW5kcyBWaWV3PFU+PihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPFUsIFY+LFxuICApOiBudW1iZXIge1xuICAgIGNvbnN0IGVuYWJsZWRWaWV3cyA9IGdldEVuYWJsZWRWaWV3cyhzdGF0ZS52aWV3cyk7XG5cbiAgICAvLyBUYWJzIGhhdmUgYSBtaW5pbXVtIHdpZHRoIG9mIDkycHguXG4gICAgY29uc3QgcG9zc2libGVTbG90Q291bnQgPSBNYXRoLmZsb29yKHN0YXRlLmNvbnRhaW5lcldpZHRoIC8gOTIpO1xuXG4gICAgLy8gVGhlIFwiYWxsIHZpZXdzXCIgc2lkZWJhciB0cmlnZ2VyIHRha2VzIHVwIG9uZSBzbG90LlxuICAgIGNvbnN0IGF2YWlsYWJsZVNsb3RDb3VudCA9IHBvc3NpYmxlU2xvdENvdW50IC0gMTtcblxuICAgIC8vIElmIHRoZXJlIGFyZSB0b28gbWFueSB0YWJzLCB0aGUgXCJOIG1vcmVcIiB0cmlnZ2VyIHRha2VzIHVwIG9uZSBzbG90IGFzIHdlbGwuXG4gICAgLy8gQnV0IHdlIHdhbnQgdG8gYXZvaWQgdGhlIFwiMSBtb3JlXCIgY2FzZSwgc28gd2Ugb25seSB1c2UgYSBzbG90IGZvciBcIk4gbW9yZVwiIGlmIE4gIT0gMS5cbiAgICBpZiAoYXZhaWxhYmxlU2xvdENvdW50ID49IGVuYWJsZWRWaWV3cy5sZW5ndGgpIHJldHVybiBlbmFibGVkVmlld3MubGVuZ3RoO1xuICAgIGVsc2UgcmV0dXJuIGF2YWlsYWJsZVNsb3RDb3VudCAtIDE7IC8vIHRoZSBcIk4gbW9yZVwiIHVzZXMgdXAgYSBzbG90LlxuICB9XG5cbiAgZnVuY3Rpb24gY2FsY3VsYXRlRGlzcGxheWVkVmlld3M8VSBleHRlbmRzIFVzZXIsIFYgZXh0ZW5kcyBWaWV3PFU+PihcbiAgICBmdWxsVmlld3M6IEZ1bGxWaWV3PFUsIFY+W10sXG4gICAgb3ZlcmZsb3dWaWV3SW5kZXg6IG51bWJlcixcbiAgICBhY3RpdmVWaWV3SWQ6IENvcmVTdGF0ZTxVLCBWPlsnYWN0aXZlVmlld0lkJ10sXG4gICAgdGVtcG9yYXJ5Vmlld0lkOiBDb3JlU3RhdGU8VSwgVj5bJ3RlbXBvcmFyeVZpZXdJZCddLFxuICApOiBGdWxsVmlldzxVLCBWPltdIHtcbiAgICBjb25zdCBkaXNwbGF5ZWRWaWV3cyA9IGZ1bGxWaWV3cy5zbGljZSgwLCBvdmVyZmxvd1ZpZXdJbmRleCk7XG5cbiAgICBjb25zdCB2aWV3c1RvQWx3YXlzRGlzcGxheTogRnVsbFZpZXc8VSwgVj5bXSA9IFtdO1xuXG4gICAgLy8gVGhlIGFjdGl2ZSB2aWV3IHNob3VsZCBhbHdheXMgYmUgZGlzcGxheWVkIGlmIGl0IGV4aXN0c1xuICAgIGNvbnN0IGFjdGl2ZVZpZXdJbkRpc3BsYXkgPSBkaXNwbGF5ZWRWaWV3cy5zb21lKFxuICAgICAgdmlldyA9PiB2aWV3LmlkID09PSBhY3RpdmVWaWV3SWQsXG4gICAgKTtcbiAgICBpZiAoYWN0aXZlVmlld0lkICE9PSBudWxsICYmICFhY3RpdmVWaWV3SW5EaXNwbGF5KSB7XG4gICAgICBjb25zdCBhY3RpdmVWaWV3ID0gZnVsbFZpZXdzLmZpbmQodmlldyA9PiB2aWV3LmlkID09PSBhY3RpdmVWaWV3SWQpO1xuICAgICAgaWYgKGFjdGl2ZVZpZXcgJiYgZGlzcGxheWVkVmlld3MubGVuZ3RoID4gMCkge1xuICAgICAgICB2aWV3c1RvQWx3YXlzRGlzcGxheS5wdXNoKGFjdGl2ZVZpZXcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdlIHNob3VsZCB0cnkgdG8gZGlzcGxheSB0aGUgdGVtcG9yYXJ5IHZpZXcgaWYgaXQgZXhpc3RzXG4gICAgY29uc3QgdGVtcG9yYXJ5Vmlld0luRGlzcGxheSA9IGRpc3BsYXllZFZpZXdzLnNvbWUoXG4gICAgICB2aWV3ID0+IHZpZXcuaWQgPT09IHRlbXBvcmFyeVZpZXdJZCxcbiAgICApO1xuICAgIGlmIChcbiAgICAgIHRlbXBvcmFyeVZpZXdJZCAhPT0gbnVsbCAmJlxuICAgICAgIXRlbXBvcmFyeVZpZXdJbkRpc3BsYXkgJiZcbiAgICAgIHRlbXBvcmFyeVZpZXdJZCAhPSBhY3RpdmVWaWV3SWRcbiAgICApIHtcbiAgICAgIGNvbnN0IHRlbXBvcmFyeVZpZXcgPSBmdWxsVmlld3MuZmluZCh2aWV3ID0+IHZpZXcuaWQgPT09IHRlbXBvcmFyeVZpZXdJZCk7XG4gICAgICBpZiAoXG4gICAgICAgIHRlbXBvcmFyeVZpZXcgJiZcbiAgICAgICAgZGlzcGxheWVkVmlld3MubGVuZ3RoID4gdmlld3NUb0Fsd2F5c0Rpc3BsYXkubGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgdmlld3NUb0Fsd2F5c0Rpc3BsYXkucHVzaCh0ZW1wb3JhcnlWaWV3KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmlld3NUb0Fsd2F5c0Rpc3BsYXkubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbnVtVmlld3NUb1JlcGxhY2U6IG51bWJlciA9IHZpZXdzVG9BbHdheXNEaXNwbGF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIC4uLmRpc3BsYXllZFZpZXdzLnNsaWNlKDAsIC0xICogbnVtVmlld3NUb1JlcGxhY2UpLFxuICAgICAgICAuLi52aWV3c1RvQWx3YXlzRGlzcGxheSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpc3BsYXllZFZpZXdzO1xuICB9XG5cbiAgZnVuY3Rpb24gdmlld3NCeVBlcm1pc3Npb248VSBleHRlbmRzIFVzZXIsIFYgZXh0ZW5kcyBWaWV3PFU+PihcbiAgICB2aWV3czogRnVsbFZpZXc8VSwgVj5bXSxcbiAgICBwZXJtaXNzaW9uOiBWaWV3UGVybWlzc2lvbixcbiAgKTogRnVsbFZpZXc8VSwgVj5bXSB7XG4gICAgcmV0dXJuIHNvcnRCeShcbiAgICAgIHZpZXdzLmZpbHRlcih2aWV3ID0+IHZpZXcucGVybWlzc2lvbiA9PT0gcGVybWlzc2lvbiksXG4gICAgICBbdiA9PiAhdi5zeXN0ZW0sICd0aXRsZSddLFxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBzZWFyY2hWaWV3czxVIGV4dGVuZHMgVXNlciwgViBleHRlbmRzIFZpZXc8VT4+KFxuICAgIHZpZXdzOiBGdWxsVmlldzxVLCBWPltdLFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IElGdXNlT3B0aW9uczxWPixcbiAgKTogRnVsbFZpZXc8VSwgVj5bXSB7XG4gICAgY29uc3QgZnVzZSA9IG5ldyBGdXNlKHZpZXdzLCB7XG4gICAgICB0aHJlc2hvbGQ6IDAuMixcbiAgICAgIGtleXM6IFsndGl0bGUnXSxcbiAgICAgIGluY2x1ZGVNYXRjaGVzOiB0cnVlLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1hdGNoZWRPcHRpb25zOiBGdXNlUmVzdWx0PEZ1bGxWaWV3PFUsIFY+PltdID0gZnVzZS5zZWFyY2gocXVlcnkpO1xuXG4gICAgcmV0dXJuIG1hdGNoZWRPcHRpb25zLm1hcChyZXN1bHQgPT4gKHtcbiAgICAgIC4uLnJlc3VsdC5pdGVtLFxuICAgICAgdGl0bGVIaWdobGlnaHRJbmRpY2VzOiBbXG4gICAgICAgIC4uLihyZXN1bHQubWF0Y2hlcz8uZmluZChtYXRjaCA9PiBtYXRjaC5rZXkgPT09ICd0aXRsZScpPy5pbmRpY2VzID8/XG4gICAgICAgICAgW10pLFxuICAgICAgXSxcbiAgICB9KSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXROZXh0QmVzdEFjdGl2ZVZpZXc8VSBleHRlbmRzIFVzZXIsIFYgZXh0ZW5kcyBWaWV3PFU+PihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPFUsIFY+LFxuICApOiBWWydpZCddIHwgbnVsbCB7XG4gICAgY29uc3QgZW5hYmxlZFZpZXdzID0gZ2V0RW5hYmxlZFZpZXdzKHN0YXRlLnZpZXdzKTtcbiAgICBjb25zdCBjdXJyZW50QWN0aXZlVmlld0luZGV4ID0gZW5hYmxlZFZpZXdzLmZpbmRJbmRleChcbiAgICAgIHZpZXcgPT4gdmlldy5pZCA9PT0gc3RhdGUuYWN0aXZlVmlld0lkLFxuICAgICk7XG5cbiAgICBpZiAoZW5hYmxlZFZpZXdzLmxlbmd0aCA9PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnRBY3RpdmVWaWV3SW5kZXggPT09IC0xKSByZXR1cm4gZW5hYmxlZFZpZXdzWzBdLmlkO1xuICAgIHJldHVybiAoXG4gICAgICBlbmFibGVkVmlld3NbY3VycmVudEFjdGl2ZVZpZXdJbmRleCArIDFdPy5pZCA/P1xuICAgICAgZW5hYmxlZFZpZXdzW2N1cnJlbnRBY3RpdmVWaWV3SW5kZXggLSAxXT8uaWQgPz9cbiAgICAgIGVuYWJsZWRWaWV3c1swXS5pZFxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWxldGVWaWV3PFUgZXh0ZW5kcyBVc2VyLCBWIGV4dGVuZHMgVmlldzxVPj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxVLCBWPixcbiAgICBpZDogVlsnaWQnXSxcbiAgKTogQ29yZVN0YXRlPFUsIFY+IHtcbiAgICBjb25zdCBhY3RpdmVWaWV3SWQgPVxuICAgICAgc3RhdGUuYWN0aXZlVmlld0lkID09PSBpZFxuICAgICAgICA/IGdldE5leHRCZXN0QWN0aXZlVmlldyhzdGF0ZSlcbiAgICAgICAgOiBzdGF0ZS5hY3RpdmVWaWV3SWQ7XG4gICAgY29uc3QgdGVtcG9yYXJ5Vmlld0lkID1cbiAgICAgIHN0YXRlLnRlbXBvcmFyeVZpZXdJZCA9PT0gaWQgPyBudWxsIDogc3RhdGUudGVtcG9yYXJ5Vmlld0lkO1xuICAgIGNvbnN0IHZpZXdzID0gc3RhdGUudmlld3MuZmlsdGVyKHZpZXcgPT4gdmlldy5pZCAhPT0gaWQpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIHZpZXdzLFxuICAgICAgYWN0aXZlVmlld0lkLFxuICAgICAgdGVtcG9yYXJ5Vmlld0lkLFxuICAgICAgZGVsZXRpbmdWaWV3Q29udGV4dDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0RW5hYmxlZDxVIGV4dGVuZHMgVXNlciwgViBleHRlbmRzIFZpZXc8VT4+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8VSwgVj4sXG4gICAgaWQ6IFZbJ2lkJ10sXG4gICAgZW5hYmxlZDogYm9vbGVhbixcbiAgKTogQ29yZVN0YXRlPFUsIFY+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICB2aWV3czogc3RhdGUudmlld3MubWFwKHZpZXcgPT5cbiAgICAgICAgdmlldy5pZCA9PT0gaWQgPyB7IC4uLnZpZXcsIGVuYWJsZWQgfSA6IHZpZXcsXG4gICAgICApLFxuICAgICAgYWN0aXZlVmlld0lkOlxuICAgICAgICAhZW5hYmxlZCAmJiBzdGF0ZS5hY3RpdmVWaWV3SWQgPT09IGlkXG4gICAgICAgICAgPyBnZXROZXh0QmVzdEFjdGl2ZVZpZXcoc3RhdGUpXG4gICAgICAgICAgOiBzdGF0ZS5hY3RpdmVWaWV3SWQsXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdpdGhEdXBsaWNhdGVWaWV3PFUgZXh0ZW5kcyBVc2VyLCBWIGV4dGVuZHMgVmlldzxVPj4oXG4gICAgdmlld3M6IFZbXSxcbiAgICBkdXBsaWNhdGVkVmlldzogVixcbiAgICBuZXdWaWV3OiBWLFxuICApOiBWW10ge1xuICAgIGNvbnN0IHNvdXJjZUluZGV4ID0gdmlld3MuZmluZEluZGV4KHZpZXcgPT4gdmlldy5pZCA9PT0gZHVwbGljYXRlZFZpZXcuaWQpO1xuICAgIGlmIChzb3VyY2VJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBbbmV3VmlldywgLi4udmlld3NdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICAuLi52aWV3cy5zbGljZSgwLCBzb3VyY2VJbmRleCArIDEpLFxuICAgICAgICBuZXdWaWV3LFxuICAgICAgICAuLi52aWV3cy5zbGljZShzb3VyY2VJbmRleCArIDEpLFxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB2aWV3T3JkZXJDaGFuZ2U8VSBleHRlbmRzIFVzZXIsIFYgZXh0ZW5kcyBWaWV3PFU+PihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPFUsIFY+LFxuICAgIHByZXZpb3VzRW5hYmxlZEluZGV4OiBudW1iZXIsXG4gICAgbmV3RW5hYmxlZEluZGV4OiBudW1iZXIsXG4gICk6IHsgc3RhdGU6IENvcmVTdGF0ZTxVLCBWPjsgc2hvdWxkU2F2ZTogYm9vbGVhbiB9IHtcbiAgICBpZiAoXG4gICAgICBzdGF0ZS5oYXNTeXN0ZW1WaWV3ICYmXG4gICAgICAocHJldmlvdXNFbmFibGVkSW5kZXggPT09IDAgfHwgbmV3RW5hYmxlZEluZGV4ID09PSAwKVxuICAgICkge1xuICAgICAgcmV0dXJuIHsgc3RhdGUsIHNob3VsZFNhdmU6IGZhbHNlIH07IC8vIEtlZXAgc3lzdGVtIHZpZXcgKGluZGV4IDApIGluIHBsYWNlXG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsUHJldmlvdXNJbmRleCA9IG1hcEVuYWJsZWRJbmRleFRvVmlld0luZGV4KFxuICAgICAgc3RhdGUudmlld3MsXG4gICAgICBwcmV2aW91c0VuYWJsZWRJbmRleCxcbiAgICApO1xuICAgIGNvbnN0IGFjdHVhbE5ld0luZGV4ID0gbWFwRW5hYmxlZEluZGV4VG9WaWV3SW5kZXgoXG4gICAgICBzdGF0ZS52aWV3cyxcbiAgICAgIG5ld0VuYWJsZWRJbmRleCxcbiAgICApO1xuXG4gICAgY29uc3QgaXRlbSA9IHN0YXRlLnZpZXdzW2FjdHVhbFByZXZpb3VzSW5kZXhdO1xuICAgIGNvbnN0IHdpdGhvdXRJdGVtID0gc3RhdGUudmlld3MuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBhY3R1YWxQcmV2aW91c0luZGV4KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZToge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgdmlld3M6IFtcbiAgICAgICAgICAuLi53aXRob3V0SXRlbS5zbGljZSgwLCBhY3R1YWxOZXdJbmRleCksXG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICAuLi53aXRob3V0SXRlbS5zbGljZShhY3R1YWxOZXdJbmRleCksXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgc2hvdWxkU2F2ZTogdHJ1ZSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UGVybWFuZW50Vmlld3M8VSBleHRlbmRzIFVzZXIsIFYgZXh0ZW5kcyBWaWV3PFU+PihcbiAgICB2aWV3czogVltdLFxuICAgIHRlbXBvcmFyeVZpZXdJZDogQ29yZVN0YXRlPFUsIFY+Wyd0ZW1wb3JhcnlWaWV3SWQnXSxcbiAgKTogVltdIHtcbiAgICByZXR1cm4gdmlld3MuZmlsdGVyKHZpZXcgPT4gdmlldy5pZCAhPSB0ZW1wb3JhcnlWaWV3SWQpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZVBlcm1hbmVudFZpZXdzPFUgZXh0ZW5kcyBVc2VyLCBWIGV4dGVuZHMgVmlldzxVPj4oXG4gICAgc2F2ZTogU2F2ZTxVLCBWPixcbiAgICB2aWV3czogVltdLFxuICAgIHRlbXBvcmFyeVZpZXdJZDogQ29yZVN0YXRlPFUsIFY+Wyd0ZW1wb3JhcnlWaWV3SWQnXSxcbiAgKSB7XG4gICAgY29uc3QgcGVybWFuZW50Vmlld3MgPSBnZXRQZXJtYW5lbnRWaWV3cyh2aWV3cywgdGVtcG9yYXJ5Vmlld0lkKTtcblxuICAgIHNhdmUocGVybWFuZW50Vmlld3MpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVkdWNlPFUgZXh0ZW5kcyBVc2VyLCBWIGV4dGVuZHMgVmlldzxVPj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxVLCBWPixcbiAgICBhY3Rpb246IEFjdGlvbjxVLCBWPixcbiAgICBzb3VyY2U6IFNvdXJjZTxVLCBWPixcbiAgICBzYXZlOiBTYXZlPFUsIFY+LFxuICAgIGR1cGxpY2F0ZTogRHVwbGljYXRlPFUsIFY+LFxuICAgIGNvcHlMaW5rOiBDb3B5TGluazxVLCBWPixcbiAgICBzZXRBY3RpdmVWaWV3SWQ6IFNldEFjdGl2ZVZpZXdJZDxVLCBWPixcbiAgKTogUHJvbWlzZTxDb3JlU3RhdGU8VSwgVj4+IHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICBjYXNlICdsb2FkJzpcbiAgICAgICAgY29uc3Qgdmlld3MgPSBhd2FpdCBzb3VyY2UoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICB2aWV3cyxcbiAgICAgICAgfTtcblxuICAgICAgY2FzZSAnc2V0QWN0aXZlVmlldyc6IHtcbiAgICAgICAgY29uc3QgYWN0aXZlVmlldyA9IHN0YXRlLnZpZXdzLmZpbmQodiA9PiB2LmlkID09PSBhY3Rpb24uaWQpO1xuICAgICAgICBjb25zdCB2aWV3cyA9XG4gICAgICAgICAgYWN0aXZlVmlldyAmJiAhYWN0aXZlVmlldy5lbmFibGVkXG4gICAgICAgICAgICA/IHN0YXRlLnZpZXdzLm1hcCh2aWV3ID0+XG4gICAgICAgICAgICAgICAgdmlldy5pZCA9PT0gYWN0aW9uLmlkID8geyAuLi52aWV3LCBlbmFibGVkOiB0cnVlIH0gOiB2aWV3LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IHN0YXRlLnZpZXdzO1xuICAgICAgICAvLyBJZiBlbmFibGluZyB0aGUgdmlldyBjaGFuZ2VkIHRoZSB2aWV3cywgd2UgbmVlZCB0byBzYXZlLlxuICAgICAgICBpZiAodmlld3MgIT09IHN0YXRlLnZpZXdzKSB7XG4gICAgICAgICAgc2F2ZVBlcm1hbmVudFZpZXdzKHNhdmUsIHZpZXdzLCBzdGF0ZS50ZW1wb3JhcnlWaWV3SWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vdGlmeSB0aGUgY2FsbGVyIHRoYXQgdGhlIGFjdGl2ZSB2aWV3IGhhcyBjaGFuZ2VkXG4gICAgICAgIHNldEFjdGl2ZVZpZXdJZChhY3Rpb24uaWQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIGFjdGl2ZVZpZXdJZDogYWN0aW9uLmlkLFxuICAgICAgICAgIHZpZXdzLFxuICAgICAgICAgIGFsbDoge1xuICAgICAgICAgICAgLi4uc3RhdGUuYWxsLFxuICAgICAgICAgICAgc2VhcmNoOiAnJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG92ZXJmbG93OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5vdmVyZmxvdyxcbiAgICAgICAgICAgIHNlYXJjaDogJycsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnc2V0RW5hYmxlZCc6IHtcbiAgICAgICAgY29uc3QgbmV3U3RhdGUgPSBzZXRFbmFibGVkKHN0YXRlLCBhY3Rpb24uaWQsIGFjdGlvbi5lbmFibGVkKTtcbiAgICAgICAgc2F2ZVBlcm1hbmVudFZpZXdzKHNhdmUsIG5ld1N0YXRlLnZpZXdzLCBuZXdTdGF0ZS50ZW1wb3JhcnlWaWV3SWQpO1xuICAgICAgICByZXR1cm4gbmV3U3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ3NldENvbnRhaW5lcldpZHRoJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBjb250YWluZXJXaWR0aDogYWN0aW9uLndpZHRoLFxuICAgICAgICB9O1xuXG4gICAgICBjYXNlICdzZXRPdmVyZmxvd1BpY2tlck9wZW4nOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIG92ZXJmbG93OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5vdmVyZmxvdyxcbiAgICAgICAgICAgIHBpY2tlck9wZW46IGFjdGlvbi5vcGVuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgIGNhc2UgJ3NldE92ZXJmbG93U2VhcmNoUXVlcnknOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIG92ZXJmbG93OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5vdmVyZmxvdyxcbiAgICAgICAgICAgIHNlYXJjaDogYWN0aW9uLnF1ZXJ5LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgIGNhc2UgJ3NldEFsbFZpZXdzU2VhcmNoUXVlcnknOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIGFsbDoge1xuICAgICAgICAgICAgLi4uc3RhdGUuYWxsLFxuICAgICAgICAgICAgc2VhcmNoOiBhY3Rpb24ucXVlcnksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgY2FzZSAndXBkYXRlVmlldyc6IHtcbiAgICAgICAgaWYgKGFjdGlvbi52aWV3LmlkICE9IHN0YXRlLnRlbXBvcmFyeVZpZXdJZCkge1xuICAgICAgICAgIGNvbnN0IHZpZXdzID0gc3RhdGUudmlld3MubWFwKHZpZXcgPT5cbiAgICAgICAgICAgIHZpZXcuaWQgPT09IGFjdGlvbi52aWV3LmlkID8gYWN0aW9uLnZpZXcgOiB2aWV3LFxuICAgICAgICAgICk7XG4gICAgICAgICAgc2F2ZVBlcm1hbmVudFZpZXdzKHNhdmUsIHZpZXdzLCBzdGF0ZS50ZW1wb3JhcnlWaWV3SWQpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHZpZXdzOiB2aWV3cyxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFVwZGF0aW5nIGEgdGVtcG9yYXJ5IHZpZXcgc2F2ZXMgdGhlIHZpZXcgYW5kIG1ha2VzIGl0IHBlcm1hbmVudFxuICAgICAgICAgIGNvbnN0IHRlbXBvcmFyeVZpZXdUb1NhdmUgPSBhd2FpdCBkdXBsaWNhdGUoeyAuLi5hY3Rpb24udmlldyB9KTtcblxuICAgICAgICAgIGNvbnN0IHZpZXdzID0gc3RhdGUudmlld3MubWFwKHZpZXcgPT5cbiAgICAgICAgICAgIHZpZXcuaWQgPT09IGFjdGlvbi52aWV3LmlkID8gdGVtcG9yYXJ5Vmlld1RvU2F2ZSA6IHZpZXcsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHNhdmVQZXJtYW5lbnRWaWV3cyhzYXZlLCB2aWV3cywgbnVsbCk7XG4gICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB2aWV3IHdlIGp1c3Qgc2F2ZWQgaXMgdGhlIGFjdGl2ZSB2aWV3XG4gICAgICAgICAgc2V0QWN0aXZlVmlld0lkKHRlbXBvcmFyeVZpZXdUb1NhdmUuaWQpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHZpZXdzOiB2aWV3cyxcbiAgICAgICAgICAgIGFjdGl2ZVZpZXdJZDogdGVtcG9yYXJ5Vmlld1RvU2F2ZS5pZCxcbiAgICAgICAgICAgIHRlbXBvcmFyeVZpZXdJZDogbnVsbCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2RlbGV0ZVZpZXcnOiB7XG4gICAgICAgIGNvbnN0IG5ld1N0YXRlID0gZGVsZXRlVmlldyhzdGF0ZSwgYWN0aW9uLnZpZXcuaWQpO1xuICAgICAgICBzYXZlUGVybWFuZW50Vmlld3Moc2F2ZSwgbmV3U3RhdGUudmlld3MsIHN0YXRlLnRlbXBvcmFyeVZpZXdJZCk7XG4gICAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnZHVwbGljYXRlVmlldyc6IHtcbiAgICAgICAgY29uc3QgbmV3VmlldyA9IGF3YWl0IGR1cGxpY2F0ZSh7IC4uLmFjdGlvbi52aWV3IH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHZpZXdzOiB3aXRoRHVwbGljYXRlVmlldyhzdGF0ZS52aWV3cywgYWN0aW9uLnZpZXcsIG5ld1ZpZXcpLFxuICAgICAgICAgIGVkaXRpbmdWaWV3Q29udGV4dDoge1xuICAgICAgICAgICAgaWQ6IG5ld1ZpZXcuaWQsXG4gICAgICAgICAgICBhdXRvUmVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVudUNvbnRleHQ6IGFjdGlvbi5tZW51Q29udGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFjdGl2ZVZpZXdJZDogbmV3Vmlldy5pZCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnY29weUxpbmtUb1ZpZXcnOlxuICAgICAgICBhd2FpdCBjb3B5TGluayhhY3Rpb24udmlldyk7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcblxuICAgICAgY2FzZSAndmlld09yZGVyQ2hhbmdlJzoge1xuICAgICAgICBjb25zdCB7IHN0YXRlOiBuZXdTdGF0ZSwgc2hvdWxkU2F2ZSB9ID0gdmlld09yZGVyQ2hhbmdlKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGFjdGlvbi5wcmV2aW91c0VuYWJsZWRJbmRleCxcbiAgICAgICAgICBhY3Rpb24ubmV3RW5hYmxlZEluZGV4LFxuICAgICAgICApO1xuICAgICAgICBpZiAoc2hvdWxkU2F2ZSkge1xuICAgICAgICAgIHNhdmVQZXJtYW5lbnRWaWV3cyhzYXZlLCBuZXdTdGF0ZS52aWV3cywgc3RhdGUudGVtcG9yYXJ5Vmlld0lkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3U3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ3NldEFsbFZpZXdzVG9nZ2xlJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBhbGw6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLmFsbCxcbiAgICAgICAgICAgIHByaXZhdGVPcGVuOlxuICAgICAgICAgICAgICBhY3Rpb24ucGVybWlzc2lvbiA9PT0gJ3ByaXZhdGUnXG4gICAgICAgICAgICAgICAgPyBhY3Rpb24ub3BlblxuICAgICAgICAgICAgICAgIDogc3RhdGUuYWxsLnByaXZhdGVPcGVuLFxuICAgICAgICAgICAgc2hhcmVkT3BlbjpcbiAgICAgICAgICAgICAgYWN0aW9uLnBlcm1pc3Npb24gPT09ICdzaGFyZWQnXG4gICAgICAgICAgICAgICAgPyBhY3Rpb24ub3BlblxuICAgICAgICAgICAgICAgIDogc3RhdGUuYWxsLnNoYXJlZE9wZW4sXG4gICAgICAgICAgICBwdWJsaWNPcGVuOlxuICAgICAgICAgICAgICBhY3Rpb24ucGVybWlzc2lvbiA9PT0gJ3B1YmxpYydcbiAgICAgICAgICAgICAgICA/IGFjdGlvbi5vcGVuXG4gICAgICAgICAgICAgICAgOiBzdGF0ZS5hbGwucHVibGljT3BlbixcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICBjYXNlICdzZXRFZGl0aW5nVmlldyc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgZWRpdGluZ1ZpZXdDb250ZXh0OiBhY3Rpb24uY29udGV4dCxcbiAgICAgICAgfTtcblxuICAgICAgY2FzZSAnc2V0RGVsZXRpbmdWaWV3JzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBkZWxldGluZ1ZpZXdDb250ZXh0OiBhY3Rpb24uY29udGV4dCxcbiAgICAgICAgfTtcblxuICAgICAgY2FzZSAnY3JlYXRlVGVtcG9yYXJ5Vmlldyc6XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUGVybWFuZW50Vmlld3MgPSBnZXRQZXJtYW5lbnRWaWV3cyhcbiAgICAgICAgICBzdGF0ZS52aWV3cyxcbiAgICAgICAgICBzdGF0ZS50ZW1wb3JhcnlWaWV3SWQsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU3dhcCB0aGUgYWN0aXZlIHZpZXcgdG8gdGhlIHRlbXBvcmFyeSB2aWV3XG4gICAgICAgIHNldEFjdGl2ZVZpZXdJZChhY3Rpb24udmlldy5pZCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgdGVtcG9yYXJ5Vmlld0lkOiBhY3Rpb24udmlldy5pZCxcbiAgICAgICAgICBhY3RpdmVWaWV3SWQ6IGFjdGlvbi52aWV3LmlkLFxuICAgICAgICAgIHZpZXdzOiBbLi4uZXhpc3RpbmdQZXJtYW5lbnRWaWV3cywgYWN0aW9uLnZpZXddLFxuICAgICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8vLy8vLy8vLy8vLy8vL1xuICAvLyBVdGlsaXRpZXMgLy9cbiAgLy8vLy8vLy8vLy8vLy8vXG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldFBlcm1pc3Npb25UaXRsZShwZXJtaXNzaW9uOiBWaWV3UGVybWlzc2lvbik6IHN0cmluZyB7XG4gICAgc3dpdGNoIChwZXJtaXNzaW9uKSB7XG4gICAgICBjYXNlICdwcml2YXRlJzpcbiAgICAgICAgcmV0dXJuICdQcml2YXRlJztcbiAgICAgIGNhc2UgJ3NoYXJlZCc6XG4gICAgICAgIHJldHVybiAnU2hhcmVkJztcbiAgICAgIGNhc2UgJ3B1YmxpYyc6XG4gICAgICAgIHJldHVybiAnUHVibGljJztcbiAgICB9XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZ2V0UGVybWlzc2lvbkRlc2NyaXB0aW9uKHBlcm1pc3Npb246IFZpZXdQZXJtaXNzaW9uKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHBlcm1pc3Npb24pIHtcbiAgICAgIGNhc2UgJ3ByaXZhdGUnOlxuICAgICAgICByZXR1cm4gJ1ByaXZhdGUgLSBPbmx5IGF2YWlsYWJsZSB0byB5b3UnO1xuICAgICAgY2FzZSAnc2hhcmVkJzpcbiAgICAgICAgcmV0dXJuICdTaGFyZWQgLSBPbmx5IHZpc2libGUgdG8gdGhvc2Ugd2l0aCBhY2Nlc3MnO1xuICAgICAgY2FzZSAncHVibGljJzpcbiAgICAgICAgcmV0dXJuICdQdWJsaWMgLSBWaXNpYmxlIHRvIGV2ZXJ5b25lJztcbiAgICB9XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gaXNTaGFyZWRWaWV3PFUgZXh0ZW5kcyBVc2VyLCBWIGV4dGVuZHMgVmlldzxVPj4oXG4gICAgdmlldz86IEZ1bGxWaWV3PFUsIFY+LFxuICApOiB2aWV3IGlzIEZ1bGxWaWV3PFUsIFY+ICYgeyBwZXJtaXNzaW9uOiAnc2hhcmVkJzsgc2hhcmVkVXNlcnM6IFVbXSB9IHtcbiAgICByZXR1cm4gdmlldz8ucGVybWlzc2lvbiA9PT0gJ3NoYXJlZCc7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgU2VhcmNoU2VsZWN0VXNlcjxVPiBpdGVtcyBiYWNrIHRvIFVbXSBmb3Igc3RvcmFnZSBpbiBzaGFyZWRVc2Vycy5cbiAgICpcbiAgICogQ2FzdCByZXF1aXJlZCBiZWNhdXNlIFR5cGVTY3JpcHQgY2Fubm90IHByb3ZlIHRoYXQgZGVzdHJ1Y3R1cmluZyBgbmV3YFxuICAgKiBmcm9tIGBVICYgeyBuZXc6IGJvb2xlYW4gfWAgeWllbGRzIGV4YWN0bHkgYFVgIChzcHJlYWQvcmVzdCBkb2Vzbid0XG4gICAqIG5hcnJvdyBpbnRlcnNlY3Rpb24gdHlwZXMpLlxuICAgKlxuICAgKiAtIFN0cmlwcyBgbmV3OiBmYWxzZWAgc28gaXNFcXVhbCgpIGNvbXBhcmlzb25zIHdvcmsgKG9yaWdpbmFsIHVzZXJzIGxhY2sgYG5ld2ApXG4gICAqIC0gUHJlc2VydmVzIGBuZXc6IHRydWVgIHNvIHRoZSBiYWNrZW5kIGtub3dzIHdoaWNoIHVzZXJzIHRvIGNyZWF0ZVxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIHRvU2hhcmVkVXNlcnM8VSBleHRlbmRzIFVzZXI+KFxuICAgIHVzZXJzOiBTZWFyY2hTZWxlY3RVc2VyPFU+W10sXG4gICk6IFVbXSB7XG4gICAgcmV0dXJuIHVzZXJzLm1hcCh1c2VyID0+IHtcbiAgICAgIGlmICh1c2VyLm5ldykge1xuICAgICAgICByZXR1cm4gdXNlciBhcyB1bmtub3duIGFzIFU7XG4gICAgICB9XG4gICAgICBjb25zdCB7IG5ldzogX2lzTmV3LCAuLi5yZXN0IH0gPSB1c2VyO1xuICAgICAgcmV0dXJuIHJlc3QgYXMgdW5rbm93biBhcyBVO1xuICAgIH0pO1xuICB9XG59XG4iXX0=