@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
@@ -0,0 +1,377 @@
1
+ import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, Input, Output, TemplateRef, ViewChild, } from '@angular/core';
2
+ import { index } from 'd3-array';
3
+ import { scaleBand, scaleLinear } from 'd3-scale';
4
+ import { stack } from 'd3-shape';
5
+ import { utcFormat } from 'd3-time-format';
6
+ import { BehaviorSubject, combineLatest, map, shareReplay, } from 'rxjs';
7
+ import { getIntervalTitle, getMajorInterval, getMajorIntervalFormat, getMinorIntervalFormat, getTimeInterval, intervals, } from '../intervals';
8
+ import { getDateRange, pointReducer } from './stacked-column.helpers';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/common";
11
+ import * as i2 from "../../overlay/callout/callout.component";
12
+ import * as i3 from "../legend-item/legend-item.component";
13
+ import * as i4 from "../../overlay/overlay.directive";
14
+ import * as i5 from "../../input/simple-select/simple-select.component";
15
+ import * as i6 from "../../size/size.directive";
16
+ import * as i7 from "../zero-state/zero-state.component";
17
+ import * as i8 from "../../input/simple-select/option-group.pipe";
18
+ const DEFAULT_INTERVAL = 'month';
19
+ // TODO: once we upgrade to Angular 16, this component can be cleaned up with
20
+ // signals instead of RxJS.
21
+ // https://www.notion.so/rivet/Resolve-TODOs-after-Angular-upgrade-1f2667eb2a3180b79f6ad92a7e576f08
22
+ export class StackedColumnComponent {
23
+ constructor() {
24
+ this.input$ = new BehaviorSubject([]);
25
+ this.width$ = new BehaviorSubject(960);
26
+ this.HEIGHT = 300;
27
+ this.valueFormatter = v => v.toString();
28
+ this.interval$ = new BehaviorSubject(DEFAULT_INTERVAL);
29
+ this.intervalChanged = new EventEmitter();
30
+ this.stackClicked = new EventEmitter();
31
+ this.COLUMN_WIDTHS = [8, 16, 40, 72];
32
+ this.MIN_COLUMN_WIDTH = this.COLUMN_WIDTHS[0];
33
+ this.maxColumns$ = this.width$.pipe(map(width => {
34
+ const innerWidth = width - this.LEFT_OFFSET;
35
+ const columnWidthWithPadding = this.MIN_COLUMN_WIDTH + this.COLUMN_PADDING * 2;
36
+ return Math.floor(innerWidth / columnWidthWithPadding);
37
+ }), shareReplay({ refCount: true, bufferSize: 1 }));
38
+ this.allowedIntervals$ = combineLatest([
39
+ this.input$,
40
+ this.maxColumns$,
41
+ ]).pipe(map(([input, maxColumns]) => {
42
+ const [minDate, maxDate] = getDateRange(input);
43
+ return intervals.filter(interval => {
44
+ const xStepsCount = this.getXStepsInRange(interval, minDate, maxDate);
45
+ return input.length * xStepsCount <= maxColumns;
46
+ });
47
+ }), shareReplay({ refCount: true, bufferSize: 1 }));
48
+ this.intervalOptions$ = this.allowedIntervals$.pipe(map(intervals => intervals.map((interval) => ({
49
+ id: interval,
50
+ title: getIntervalTitle(interval),
51
+ }))), shareReplay({ refCount: true, bufferSize: 1 }));
52
+ this.selectedIntervalOption$ = combineLatest([
53
+ this.interval$,
54
+ this.intervalOptions$,
55
+ ]).pipe(map(([interval, options]) => {
56
+ const allowedIntervals = options.map(({ id }) => id);
57
+ if (!allowedIntervals.includes(interval)) {
58
+ const firstAllowed = allowedIntervals.at(0);
59
+ const lastAllowed = allowedIntervals.at(-1);
60
+ if (!firstAllowed || !lastAllowed)
61
+ return null;
62
+ if (intervals.indexOf(interval) < intervals.indexOf(firstAllowed))
63
+ interval = firstAllowed;
64
+ if (intervals.indexOf(interval) > intervals.indexOf(lastAllowed))
65
+ interval = lastAllowed;
66
+ }
67
+ return options.find(o => o.id === interval) ?? null;
68
+ }), shareReplay({ refCount: true, bufferSize: 1 }));
69
+ this.selectedInterval$ = this.selectedIntervalOption$.pipe(map(option => (option ? option.id : DEFAULT_INTERVAL)));
70
+ this.columnWidth$ = combineLatest([
71
+ this.input$,
72
+ this.selectedInterval$,
73
+ this.width$,
74
+ ]).pipe(map(([input, selectedInterval, width]) => {
75
+ const [minDate, maxDate] = getDateRange(input);
76
+ const xStepCount = this.getXStepsInRange(selectedInterval, minDate, maxDate);
77
+ const innerWidth = width - this.LEFT_OFFSET;
78
+ const allowedColumnWidths = this.COLUMN_WIDTHS.filter(columnWidth => {
79
+ const columnWidthWithPadding = columnWidth + this.COLUMN_PADDING * 2;
80
+ return (innerWidth - input.length * xStepCount * columnWidthWithPadding >= 0);
81
+ });
82
+ const columnWidth = allowedColumnWidths.at(-1);
83
+ if (!columnWidth)
84
+ return 0;
85
+ return columnWidth;
86
+ }), shareReplay({ refCount: true, bufferSize: 1 }));
87
+ this.binnedDataWithRanges$ = combineLatest([this.input$, this.selectedInterval$]).pipe(map(([input, interval]) => {
88
+ const rangeMap = new Map();
89
+ const stacks = input.map((stack) => {
90
+ const timeInterval = getTimeInterval(interval);
91
+ const series = stack.series.map(series => {
92
+ const binned = new Map();
93
+ for (const point of series.data) {
94
+ const binKey = timeInterval.floor(point.date).valueOf();
95
+ const maxDate = rangeMap.get(binKey);
96
+ if (!maxDate || maxDate < point.date) {
97
+ rangeMap.set(binKey, point.date);
98
+ }
99
+ if (!binned.has(binKey)) {
100
+ binned.set(binKey, []);
101
+ }
102
+ const bin = binned.get(binKey);
103
+ bin.push(point);
104
+ }
105
+ return {
106
+ ...series,
107
+ data: [...binned.entries()].map(([dateValue, points]) => ({
108
+ date: new Date(dateValue),
109
+ value: pointReducer(points),
110
+ })),
111
+ };
112
+ });
113
+ return {
114
+ ...stack,
115
+ series: series,
116
+ };
117
+ });
118
+ return {
119
+ stacks,
120
+ getRange: (date) => {
121
+ return {
122
+ minDate: new Date(date),
123
+ maxDate: rangeMap.get(date),
124
+ };
125
+ },
126
+ };
127
+ }), shareReplay({ refCount: true, bufferSize: 1 }));
128
+ this.binnedData$ = this.binnedDataWithRanges$.pipe(map(binnedData => binnedData.stacks));
129
+ this.getRange$ = this.binnedDataWithRanges$.pipe(map(binnedData => binnedData.getRange));
130
+ this.LEFT_OFFSET = 48;
131
+ this.COLUMN_PADDING = 4;
132
+ this.drawData$ = combineLatest([
133
+ this.binnedData$,
134
+ this.width$,
135
+ this.selectedInterval$,
136
+ this.columnWidth$,
137
+ ]).pipe(map(([binnedData, width, interval, columnWidth]) => {
138
+ const viewBox = `0 0 ${width} ${this.HEIGHT}`;
139
+ const padding = 16;
140
+ const [minDate, maxDate] = getDateRange(binnedData);
141
+ const hasMultipleYears = minDate.getFullYear() < maxDate.getFullYear();
142
+ const xMinorIntervalFormat = getMinorIntervalFormat(interval);
143
+ const minorFormatter = utcFormat(xMinorIntervalFormat);
144
+ const minorTimeInterval = getTimeInterval(interval);
145
+ const xSteps = minorTimeInterval.range(minorTimeInterval.floor(minDate), minorTimeInterval.floor(minorTimeInterval.offset(maxDate, 1)));
146
+ const xMajorInterval = getMajorInterval(interval);
147
+ const xMajorIntervalFormat = getMajorIntervalFormat(xMajorInterval, hasMultipleYears);
148
+ const majorFormatter = utcFormat(xMajorIntervalFormat);
149
+ const fullFormatter = utcFormat(`${xMinorIntervalFormat} ${xMajorIntervalFormat}`);
150
+ const xOuterScale = scaleBand()
151
+ .domain(xSteps.map(date => fullFormatter(date)))
152
+ .range([this.LEFT_OFFSET, width]);
153
+ const outerPadding = (xOuterScale.bandwidth() -
154
+ (this.COLUMN_PADDING * (binnedData.length - 1) +
155
+ columnWidth * binnedData.length)) /
156
+ 2;
157
+ const renderInformation = binnedData.map(stackData => {
158
+ /*
159
+ Create an array with every data point + their associated series.
160
+ i.e. Make an backlink for each element to its series.
161
+ */
162
+ const stackedTable = stackData.series.reduce((table, s) => [
163
+ ...table,
164
+ ...s.data.map(point => ({
165
+ ...point,
166
+ series: s,
167
+ })),
168
+ ], []);
169
+ /*
170
+ Maps each of the SeriesPoints based on label.
171
+ Then map each of those maps to a date.
172
+
173
+ Example:
174
+ If we were indexing the following data:
175
+ * Estimates Complete -> 5 in January, 7 in February
176
+ * Estimates Incomplete -> 3 in January, 3 in February
177
+ We would get an indexed table like the following, (note this is pseudocode):
178
+ 'January': { 'Estimates Complete': 5, 'Estimates Incomplete': 3 }
179
+ 'February': { 'Estimates Complete': 7, 'Estimates Incomplete': 3 }
180
+ */
181
+ const indexedTable = index(stackedTable, d => d.date, d => d.series.label);
182
+ /*
183
+ The output of "stack()" is an array of arrays of tuples.
184
+ The tuples unnest as [baseline, topline].
185
+ Each "key" involved in the stack has an array of tuples relating to it.
186
+ i.e. [ Date 1 Tuple, Date 2 Tuple ]
187
+ All "key" arrays are contained in the outer array.
188
+ i.e. [ Key 1 Tuples, Key 2 Tuples]
189
+
190
+ We select the keys using ".keys()".
191
+ For our purposes, the keys are the legend elements.
192
+ i.e. If you have two blocks of the same color, they have the same key.
193
+
194
+ We select the heights of the blocks using ".value()".
195
+
196
+ We are going to stack the blocks on top of each other.
197
+ The baseline of the first key tuples are 0.
198
+ The baseline of the second key tuples are the topline of the associated first key tuple.
199
+
200
+ Example:
201
+ If we were stacking the following data:
202
+ * Estimates Complete -> 5 in January, 7 in February
203
+ * Estimates Incomplete -> 3 in January, 3 in February
204
+ We would get a stack of:
205
+ [ [ [0,5],[0,7] ], [ [5,8],[7,10] ] ]
206
+ */
207
+ const stacked = stack()
208
+ .keys(stackData.series.map(v => v.label))
209
+ .value(([_, group], key) => {
210
+ return group.get(key).value;
211
+ })(indexedTable);
212
+ return { indexedTable, stacked };
213
+ });
214
+ // The domain should be based on the highest value in any stack, on any date.
215
+ let domainMax = 0;
216
+ // For each unique stack,
217
+ renderInformation.forEach(({ stacked, indexedTable }) => {
218
+ // For each date,
219
+ [...indexedTable.values()].forEach((pointMap, i) => {
220
+ // For each series,
221
+ [...pointMap.values()].forEach((_, j) => {
222
+ domainMax = Math.max(domainMax, ...stacked[j][i]);
223
+ });
224
+ });
225
+ });
226
+ if (domainMax === 0)
227
+ domainMax = 1;
228
+ const yScale = scaleLinear()
229
+ .domain([0, domainMax])
230
+ .range([this.HEIGHT - padding * 2, padding]);
231
+ const rects = [];
232
+ // For each unique stack,
233
+ renderInformation.forEach(({ stacked, indexedTable }, index) => {
234
+ // For each date,
235
+ [...indexedTable.entries()].forEach(([date, pointMap], i) => {
236
+ // For each series,
237
+ [...pointMap.entries()].forEach(([_, seriesPoint], j) => {
238
+ // Get the size of the box we are about to draw.
239
+ const [baseline, topline] = stacked[j][i];
240
+ const width = columnWidth;
241
+ const height = yScale(baseline) - yScale(topline);
242
+ const x = (xOuterScale(fullFormatter(date)) ?? 0) +
243
+ outerPadding +
244
+ columnWidth * index +
245
+ this.COLUMN_PADDING * index;
246
+ const y = yScale(baseline) - height;
247
+ const fill = `var(${seriesPoint.series.colorToken})`;
248
+ rects.push({
249
+ dateValue: date.valueOf(),
250
+ x,
251
+ y,
252
+ width,
253
+ height,
254
+ fill,
255
+ striped: seriesPoint.series.style === 'striped',
256
+ seriesPoint,
257
+ });
258
+ });
259
+ });
260
+ });
261
+ const xMinorTicks = xSteps.map(date => ({
262
+ dateValue: date.valueOf(),
263
+ label: minorFormatter(date),
264
+ x: (xOuterScale(fullFormatter(date)) ?? 0) + xOuterScale.bandwidth() / 2,
265
+ }));
266
+ const xMajorTicks = interval !== 'year'
267
+ ? xSteps
268
+ .map(date => ({
269
+ dateValue: date.valueOf(),
270
+ label: majorFormatter(date),
271
+ x: (xOuterScale(fullFormatter(date)) ?? 0) +
272
+ xOuterScale.bandwidth() / 2,
273
+ }))
274
+ .filter((tick, i, ticks) => i === 0 || tick.label !== ticks[i - 1].label)
275
+ : [];
276
+ const yTicks = yScale.ticks(5);
277
+ const hoverBandWidth = renderInformation.length * columnWidth +
278
+ (renderInformation.length + 1) * this.COLUMN_PADDING;
279
+ const hoverBands = xSteps.map(date => ({
280
+ dateValue: date.valueOf(),
281
+ x: (xOuterScale(fullFormatter(date)) ?? 0) +
282
+ (xOuterScale.bandwidth() - hoverBandWidth) / 2,
283
+ y: yScale(domainMax),
284
+ width: hoverBandWidth,
285
+ height: yScale(0) - yScale(domainMax),
286
+ }));
287
+ return {
288
+ columnWidth,
289
+ hoverBands,
290
+ rects,
291
+ viewBox,
292
+ xMinorTicks,
293
+ xMajorTicks,
294
+ yScale,
295
+ yTicks,
296
+ };
297
+ }), shareReplay({ refCount: true, bufferSize: 1 }));
298
+ this.empty$ = this.input$.pipe(map(input => input.every(stack => stack.series.every(series => series.data.length === 0))), shareReplay({ refCount: true, bufferSize: 1 }));
299
+ this.hoveredBand$ = new BehaviorSubject(null);
300
+ this.callout$ = combineLatest([this.hoveredBand$, this.binnedData$]).pipe(map(([hoveredBand, binnedData]) => {
301
+ if (!hoveredBand)
302
+ return null;
303
+ const { target } = hoveredBand.event;
304
+ if (!target)
305
+ return null;
306
+ const anchor = target.getBoundingClientRect();
307
+ return {
308
+ anchor,
309
+ content: binnedData.map(stack => {
310
+ const seriesPoints = stack.series.map(series => ({
311
+ label: series.label,
312
+ colorToken: series.colorToken,
313
+ style: series.style,
314
+ value: series.data.find(({ date }) => date.valueOf() === hoveredBand.dateValue)?.value ?? 0,
315
+ }));
316
+ return {
317
+ title: stack.title,
318
+ total: this.valueFormatter(seriesPoints.reduce((acc, point) => point.value + acc, 0)),
319
+ series: seriesPoints.map(point => ({
320
+ ...point,
321
+ formattedValue: this.valueFormatter(point.value),
322
+ })),
323
+ };
324
+ }),
325
+ };
326
+ }), shareReplay({ refCount: true, bufferSize: 1 }));
327
+ }
328
+ set input(v) {
329
+ this.input$.next(v);
330
+ }
331
+ get input() {
332
+ return this.input$.getValue();
333
+ }
334
+ set width(v) {
335
+ this.width$.next(v);
336
+ }
337
+ set interval(v) {
338
+ if (v !== this.interval$.getValue()) {
339
+ this.interval$.next(v);
340
+ this.intervalChanged.emit(v);
341
+ }
342
+ }
343
+ get interval() {
344
+ return this.interval$.getValue();
345
+ }
346
+ getXStepsInRange(interval, minDate, maxDate) {
347
+ const timeInterval = getTimeInterval(interval);
348
+ return timeInterval.range(timeInterval.floor(minDate), timeInterval.floor(timeInterval.offset(maxDate, 1))).length;
349
+ }
350
+ setIntervalOption(option) {
351
+ if (option)
352
+ this.interval = option.id;
353
+ }
354
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StackedColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
355
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: StackedColumnComponent, selector: "riv-stacked-column", inputs: { input: "input", valueFormatter: "valueFormatter", interval: "interval" }, outputs: { intervalChanged: "intervalChanged", stackClicked: "stackClicked" }, queries: [{ propertyName: "calloutHeaderTemplate", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "controls", first: true, predicate: ["controls"], descendants: true }], ngImport: i0, template: "<div\n *ngIf=\"(empty$ | async) === false; else zeroState\"\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"d.columnWidth\"\n [attr.height]=\"d.columnWidth\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n [attr.y1]=\"d.columnWidth\"\n [attr.x2]=\"d.columnWidth\"\n y2=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let tick of d.xMinorTicks\">\n <rect\n class=\"tick-background\"\n [class.focused]=\"(hoveredBand$ | async)?.dateValue === tick.dateValue\"\n [attr.x]=\"tick.x - 20\"\n [attr.y]=\"d.yScale(0) + 3\"\n width=\"40\"\n height=\"12\"\n rx=\"2\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 12\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.xMajorTicks\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 24\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"tick-label\" x=\"0\" [attr.y]=\"d.yScale(tick)\" dy=\"-4\">\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of d.rects\">\n <rect\n class=\"column\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.dateValue !== rect.dateValue\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <ng-container *ngIf=\"getRange$ | async; let getRange\">\n <rect\n *ngFor=\"let rect of d.hoverBands\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n (mouseenter)=\"\n hoveredBand$.next({ dateValue: rect.dateValue, event: $event })\n \"\n (mouseleave)=\"hoveredBand$.next(null)\"\n (click)=\"\n stackClicked.emit(getRange(rect.dateValue)); hoveredBand$.next(null)\n \"\n ></rect>\n </ng-container>\n </svg>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-overlay\n [anchor]=\"callout?.anchor ?? null\"\n [theme]=\"'light'\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <ng-container\n [ngTemplateOutlet]=\"calloutHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: callout }\"\n ></ng-container>\n <div class=\"callout-stack\" *ngFor=\"let stack of callout?.content\">\n <div *ngIf=\"stack.title; let title\" class=\"callout-row\">\n <span class=\"series-label\">{{ title }}</span>\n <span>{{ stack.total }}</span>\n </div>\n <div *ngFor=\"let series of stack.series\" class=\"callout-row\">\n <span class=\"series-label\">\n <riv-legend-item\n [colorToken]=\"series.colorToken\"\n [style]=\"series.style\"\n ></riv-legend-item>\n <span>{{ series.label }}</span>\n </span>\n <span>{{ series.formattedValue }}</span>\n </div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n\n<ng-template #controls>\n <riv-simple-select\n [optionGroups]=\"intervalOptions$ | async | rivOptionGroup\"\n [orderBy]=\"'source'\"\n [selectedOption]=\"selectedIntervalOption$ | async\"\n (selectedOptionChange)=\"setIntervalOption($event)\"\n ></riv-simple-select>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.tick-background{transition:fill var(--short-transition);fill:transparent}.tick-background.focused{fill:var(--baloo-10)}.column{transition:opacity var(--short-transition)}.column.blurred{opacity:.4}.callout-content{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-stack{display:flex;flex-direction:column;padding:var(--size-medium) 0;gap:var(--size-medium)}.callout-stack:not(:last-child){border-bottom:var(--border-width) solid var(--border-light)}.callout-row{display:flex;gap:var(--size-large);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i3.LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility", "iconTooltip", "clickable", "showCheckWhenClickable"], outputs: ["itemClick"] }, { kind: "directive", type: i4.OverlayDirective, selector: "[riv-overlay]" }, { kind: "component", type: i5.SimpleSelectComponent, selector: "riv-simple-select", inputs: ["optionGroups", "selectedOption", "size", "disabled", "locked", "filterabilityOptions", "orderBy", "placeholder", "maxHeight", "maxWidth", "minHeight", "minWidth", "dividers", "sortSelectedToTop", "grow", "preferredCalloutPosition", "allowedCalloutPositions"], outputs: ["selectedOptionChange"] }, { kind: "directive", type: i6.SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "component", type: i7.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message", "title", "icon"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.OptionGroupPipe, name: "rivOptionGroup" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
356
+ }
357
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StackedColumnComponent, decorators: [{
358
+ type: Component,
359
+ args: [{ selector: 'riv-stacked-column', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *ngIf=\"(empty$ | async) === false; else zeroState\"\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"d.columnWidth\"\n [attr.height]=\"d.columnWidth\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n [attr.y1]=\"d.columnWidth\"\n [attr.x2]=\"d.columnWidth\"\n y2=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let tick of d.xMinorTicks\">\n <rect\n class=\"tick-background\"\n [class.focused]=\"(hoveredBand$ | async)?.dateValue === tick.dateValue\"\n [attr.x]=\"tick.x - 20\"\n [attr.y]=\"d.yScale(0) + 3\"\n width=\"40\"\n height=\"12\"\n rx=\"2\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 12\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.xMajorTicks\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 24\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"tick-label\" x=\"0\" [attr.y]=\"d.yScale(tick)\" dy=\"-4\">\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of d.rects\">\n <rect\n class=\"column\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.dateValue !== rect.dateValue\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <ng-container *ngIf=\"getRange$ | async; let getRange\">\n <rect\n *ngFor=\"let rect of d.hoverBands\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n (mouseenter)=\"\n hoveredBand$.next({ dateValue: rect.dateValue, event: $event })\n \"\n (mouseleave)=\"hoveredBand$.next(null)\"\n (click)=\"\n stackClicked.emit(getRange(rect.dateValue)); hoveredBand$.next(null)\n \"\n ></rect>\n </ng-container>\n </svg>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-overlay\n [anchor]=\"callout?.anchor ?? null\"\n [theme]=\"'light'\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <ng-container\n [ngTemplateOutlet]=\"calloutHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: callout }\"\n ></ng-container>\n <div class=\"callout-stack\" *ngFor=\"let stack of callout?.content\">\n <div *ngIf=\"stack.title; let title\" class=\"callout-row\">\n <span class=\"series-label\">{{ title }}</span>\n <span>{{ stack.total }}</span>\n </div>\n <div *ngFor=\"let series of stack.series\" class=\"callout-row\">\n <span class=\"series-label\">\n <riv-legend-item\n [colorToken]=\"series.colorToken\"\n [style]=\"series.style\"\n ></riv-legend-item>\n <span>{{ series.label }}</span>\n </span>\n <span>{{ series.formattedValue }}</span>\n </div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n\n<ng-template #controls>\n <riv-simple-select\n [optionGroups]=\"intervalOptions$ | async | rivOptionGroup\"\n [orderBy]=\"'source'\"\n [selectedOption]=\"selectedIntervalOption$ | async\"\n (selectedOptionChange)=\"setIntervalOption($event)\"\n ></riv-simple-select>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.tick-background{transition:fill var(--short-transition);fill:transparent}.tick-background.focused{fill:var(--baloo-10)}.column{transition:opacity var(--short-transition)}.column.blurred{opacity:.4}.callout-content{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-stack{display:flex;flex-direction:column;padding:var(--size-medium) 0;gap:var(--size-medium)}.callout-stack:not(:last-child){border-bottom:var(--border-width) solid var(--border-light)}.callout-row{display:flex;gap:var(--size-large);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}\n"] }]
360
+ }], propDecorators: { input: [{
361
+ type: Input
362
+ }], calloutHeaderTemplate: [{
363
+ type: ContentChild,
364
+ args: [TemplateRef]
365
+ }], valueFormatter: [{
366
+ type: Input
367
+ }], interval: [{
368
+ type: Input
369
+ }], intervalChanged: [{
370
+ type: Output
371
+ }], stackClicked: [{
372
+ type: Output
373
+ }], controls: [{
374
+ type: ViewChild,
375
+ args: ['controls']
376
+ }] } });
377
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1jb2x1bW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9zdGFja2VkLWNvbHVtbi9zdGFja2VkLWNvbHVtbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3N0YWNrZWQtY29sdW1uL3N0YWNrZWQtY29sdW1uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixXQUFXLEVBQ1gsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakMsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUNMLGVBQWUsRUFFZixhQUFhLEVBQ2IsR0FBRyxFQUNILFdBQVcsR0FDWixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLFNBQVMsR0FDVixNQUFNLGNBQWMsQ0FBQztBQUV0QixPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7O0FBRXRFLE1BQU0sZ0JBQWdCLEdBQWEsT0FBTyxDQUFDO0FBTzNDLDZFQUE2RTtBQUM3RSwyQkFBMkI7QUFDM0IsbUdBQW1HO0FBT25H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QixTQUFTO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpbmRleCB9IGZyb20gJ2QzLWFycmF5JztcbmltcG9ydCB7IHNjYWxlQmFuZCwgc2NhbGVMaW5lYXIgfSBmcm9tICdkMy1zY2FsZSc7XG5pbXBvcnQgeyBzdGFjayB9IGZyb20gJ2QzLXNoYXBlJztcbmltcG9ydCB7IHV0Y0Zvcm1hdCB9IGZyb20gJ2QzLXRpbWUtZm9ybWF0JztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgY29tYmluZUxhdGVzdCxcbiAgbWFwLFxuICBzaGFyZVJlcGxheSxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBJbnRlcnZhbCxcbiAgZ2V0SW50ZXJ2YWxUaXRsZSxcbiAgZ2V0TWFqb3JJbnRlcnZhbCxcbiAgZ2V0TWFqb3JJbnRlcnZhbEZvcm1hdCxcbiAgZ2V0TWlub3JJbnRlcnZhbEZvcm1hdCxcbiAgZ2V0VGltZUludGVydmFsLFxuICBpbnRlcnZhbHMsXG59IGZyb20gJy4uL2ludGVydmFscyc7XG5pbXBvcnQgeyBMZWdlbmRJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vbGVnZW5kLWl0ZW0vbGVnZW5kLWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IGdldERhdGVSYW5nZSwgcG9pbnRSZWR1Y2VyIH0gZnJvbSAnLi9zdGFja2VkLWNvbHVtbi5oZWxwZXJzJztcblxuY29uc3QgREVGQVVMVF9JTlRFUlZBTDogSW50ZXJ2YWwgPSAnbW9udGgnO1xuXG50eXBlIEludGVydmFsT3B0aW9uID0ge1xuICBpZDogSW50ZXJ2YWw7XG4gIHRpdGxlOiBzdHJpbmc7XG59O1xuXG4vLyBUT0RPOiBvbmNlIHdlIHVwZ3JhZGUgdG8gQW5ndWxhciAxNiwgdGhpcyBjb21wb25lbnQgY2FuIGJlIGNsZWFuZWQgdXAgd2l0aFxuLy8gc2lnbmFscyBpbnN0ZWFkIG9mIFJ4SlMuXG4vLyBodHRwczovL3d3dy5ub3Rpb24uc28vcml2ZXQvUmVzb2x2ZS1UT0RPcy1hZnRlci1Bbmd1bGFyLXVwZ3JhZGUtMWYyNjY3ZWIyYTMxODBiNzlmNmFkOTJhN2U1NzZmMDhcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Jpdi1zdGFja2VkLWNvbHVtbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGFja2VkLWNvbHVtbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0YWNrZWQtY29sdW1uLmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFN0YWNrZWRDb2x1bW5Db21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGlucHV0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U3RhY2tlZENvbHVtbkNvbXBvbmVudC5TdGFja1tdPihcbiAgICBbXSxcbiAgKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBpbnB1dCh2OiBTdGFja2VkQ29sdW1uQ29tcG9uZW50LlN0YWNrW10pIHtcbiAgICB0aGlzLmlucHV0JC5uZXh0KHYpO1xuICB9XG4gIHB1YmxpYyBnZXQgaW5wdXQoKTogU3RhY2tlZENvbHVtbkNvbXBvbmVudC5TdGFja1tdIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgd2lkdGgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDk2MCk7XG4gIHByb3RlY3RlZCBzZXQgd2lkdGgodjogbnVtYmVyKSB7XG4gICAgdGhpcy53aWR0aCQubmV4dCh2KTtcbiAgfVxuXG4gIEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYpXG4gIGNhbGxvdXRIZWFkZXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPHtcbiAgICAkaW1wbGljaXQ6IFN0YWNrZWRDb2x1bW5Db21wb25lbnQuQ2FsbG91dENvbnRleHQ7XG4gIH0+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgSEVJR0hUID0gMzAwO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB2YWx1ZUZvcm1hdHRlcjogKHY6IG51bWJlcikgPT4gc3RyaW5nID0gdiA9PiB2LnRvU3RyaW5nKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnZhbCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEludGVydmFsPihERUZBVUxUX0lOVEVSVkFMKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBpbnRlcnZhbCh2OiBJbnRlcnZhbCkge1xuICAgIGlmICh2ICE9PSB0aGlzLmludGVydmFsJC5nZXRWYWx1ZSgpKSB7XG4gICAgICB0aGlzLmludGVydmFsJC5uZXh0KHYpO1xuICAgICAgdGhpcy5pbnRlcnZhbENoYW5nZWQuZW1pdCh2KTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBpbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcnZhbCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIEBPdXRwdXQoKVxuICBpbnRlcnZhbENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEludGVydmFsPigpO1xuXG4gIEBPdXRwdXQoKVxuICBzdGFja0NsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFN0YWNrZWRDb2x1bW5Db21wb25lbnQuU3RhY2tDbGlja2VkPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2NvbnRyb2xzJylcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRyb2xzPzogVGVtcGxhdGVSZWY8dm9pZD47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBDT0xVTU5fV0lEVEhTID0gWzgsIDE2LCA0MCwgNzJdIGFzIGNvbnN0O1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9DT0xVTU5fV0lEVEggPSB0aGlzLkNPTFVNTl9XSURUSFNbMF07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXhDb2x1bW5zJCA9IHRoaXMud2lkdGgkLnBpcGUoXG4gICAgbWFwKHdpZHRoID0+IHtcbiAgICAgIGNvbnN0IGlubmVyV2lkdGggPSB3aWR0aCAtIHRoaXMuTEVGVF9PRkZTRVQ7XG4gICAgICBjb25zdCBjb2x1bW5XaWR0aFdpdGhQYWRkaW5nID1cbiAgICAgICAgdGhpcy5NSU5fQ09MVU1OX1dJRFRIICsgdGhpcy5DT0xVTU5fUEFERElORyAqIDI7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihpbm5lcldpZHRoIC8gY29sdW1uV2lkdGhXaXRoUGFkZGluZyk7XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICBnZXRYU3RlcHNJblJhbmdlKGludGVydmFsOiBJbnRlcnZhbCwgbWluRGF0ZTogRGF0ZSwgbWF4RGF0ZTogRGF0ZSkge1xuICAgIGNvbnN0IHRpbWVJbnRlcnZhbCA9IGdldFRpbWVJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgcmV0dXJuIHRpbWVJbnRlcnZhbC5yYW5nZShcbiAgICAgIHRpbWVJbnRlcnZhbC5mbG9vcihtaW5EYXRlKSxcbiAgICAgIHRpbWVJbnRlcnZhbC5mbG9vcih0aW1lSW50ZXJ2YWwub2Zmc2V0KG1heERhdGUsIDEpKSxcbiAgICApLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dlZEludGVydmFscyQ6IE9ic2VydmFibGU8SW50ZXJ2YWxbXT4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmlucHV0JCxcbiAgICB0aGlzLm1heENvbHVtbnMkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2lucHV0LCBtYXhDb2x1bW5zXSkgPT4ge1xuICAgICAgY29uc3QgW21pbkRhdGUsIG1heERhdGVdID0gZ2V0RGF0ZVJhbmdlKGlucHV0KTtcblxuICAgICAgcmV0dXJuIGludGVydmFscy5maWx0ZXIoaW50ZXJ2YWwgPT4ge1xuICAgICAgICBjb25zdCB4U3RlcHNDb3VudCA9IHRoaXMuZ2V0WFN0ZXBzSW5SYW5nZShpbnRlcnZhbCwgbWluRGF0ZSwgbWF4RGF0ZSk7XG4gICAgICAgIHJldHVybiBpbnB1dC5sZW5ndGggKiB4U3RlcHNDb3VudCA8PSBtYXhDb2x1bW5zO1xuICAgICAgfSk7XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBpbnRlcnZhbE9wdGlvbnMkID0gdGhpcy5hbGxvd2VkSW50ZXJ2YWxzJC5waXBlKFxuICAgIG1hcChpbnRlcnZhbHMgPT5cbiAgICAgIGludGVydmFscy5tYXAoXG4gICAgICAgIChpbnRlcnZhbCk6IEludGVydmFsT3B0aW9uID0+ICh7XG4gICAgICAgICAgaWQ6IGludGVydmFsLFxuICAgICAgICAgIHRpdGxlOiBnZXRJbnRlcnZhbFRpdGxlKGludGVydmFsKSxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3RlZEludGVydmFsT3B0aW9uJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuaW50ZXJ2YWwkLFxuICAgIHRoaXMuaW50ZXJ2YWxPcHRpb25zJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtpbnRlcnZhbCwgb3B0aW9uc10pID0+IHtcbiAgICAgIGNvbnN0IGFsbG93ZWRJbnRlcnZhbHMgPSBvcHRpb25zLm1hcCgoeyBpZCB9KSA9PiBpZCBhcyBJbnRlcnZhbCk7XG4gICAgICBpZiAoIWFsbG93ZWRJbnRlcnZhbHMuaW5jbHVkZXMoaW50ZXJ2YWwpKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0QWxsb3dlZCA9IGFsbG93ZWRJbnRlcnZhbHMuYXQoMCk7XG4gICAgICAgIGNvbnN0IGxhc3RBbGxvd2VkID0gYWxsb3dlZEludGVydmFscy5hdCgtMSk7XG4gICAgICAgIGlmICghZmlyc3RBbGxvd2VkIHx8ICFsYXN0QWxsb3dlZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKGludGVydmFscy5pbmRleE9mKGludGVydmFsKSA8IGludGVydmFscy5pbmRleE9mKGZpcnN0QWxsb3dlZCkpXG4gICAgICAgICAgaW50ZXJ2YWwgPSBmaXJzdEFsbG93ZWQ7XG4gICAgICAgIGlmIChpbnRlcnZhbHMuaW5kZXhPZihpbnRlcnZhbCkgPiBpbnRlcnZhbHMuaW5kZXhPZihsYXN0QWxsb3dlZCkpXG4gICAgICAgICAgaW50ZXJ2YWwgPSBsYXN0QWxsb3dlZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb25zLmZpbmQobyA9PiBvLmlkID09PSBpbnRlcnZhbCkgPz8gbnVsbDtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkSW50ZXJ2YWwkID0gdGhpcy5zZWxlY3RlZEludGVydmFsT3B0aW9uJC5waXBlKFxuICAgIG1hcChvcHRpb24gPT4gKG9wdGlvbiA/IChvcHRpb24uaWQgYXMgSW50ZXJ2YWwpIDogREVGQVVMVF9JTlRFUlZBTCkpLFxuICApO1xuXG4gIHNldEludGVydmFsT3B0aW9uKG9wdGlvbjogSW50ZXJ2YWxPcHRpb24gfCBudWxsKSB7XG4gICAgaWYgKG9wdGlvbikgdGhpcy5pbnRlcnZhbCA9IG9wdGlvbi5pZDtcbiAgfVxuXG4gIHByaXZhdGUgY29sdW1uV2lkdGgkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5pbnB1dCQsXG4gICAgdGhpcy5zZWxlY3RlZEludGVydmFsJCxcbiAgICB0aGlzLndpZHRoJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtpbnB1dCwgc2VsZWN0ZWRJbnRlcnZhbCwgd2lkdGhdKSA9PiB7XG4gICAgICBjb25zdCBbbWluRGF0ZSwgbWF4RGF0ZV0gPSBnZXREYXRlUmFuZ2UoaW5wdXQpO1xuICAgICAgY29uc3QgeFN0ZXBDb3VudCA9IHRoaXMuZ2V0WFN0ZXBzSW5SYW5nZShcbiAgICAgICAgc2VsZWN0ZWRJbnRlcnZhbCxcbiAgICAgICAgbWluRGF0ZSxcbiAgICAgICAgbWF4RGF0ZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGlubmVyV2lkdGggPSB3aWR0aCAtIHRoaXMuTEVGVF9PRkZTRVQ7XG4gICAgICBjb25zdCBhbGxvd2VkQ29sdW1uV2lkdGhzID0gdGhpcy5DT0xVTU5fV0lEVEhTLmZpbHRlcihjb2x1bW5XaWR0aCA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbldpZHRoV2l0aFBhZGRpbmcgPSBjb2x1bW5XaWR0aCArIHRoaXMuQ09MVU1OX1BBRERJTkcgKiAyO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGlubmVyV2lkdGggLSBpbnB1dC5sZW5ndGggKiB4U3RlcENvdW50ICogY29sdW1uV2lkdGhXaXRoUGFkZGluZyA+PSAwXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNvbHVtbldpZHRoID0gYWxsb3dlZENvbHVtbldpZHRocy5hdCgtMSk7XG4gICAgICBpZiAoIWNvbHVtbldpZHRoKSByZXR1cm4gMDtcblxuICAgICAgcmV0dXJuIGNvbHVtbldpZHRoO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgYmlubmVkRGF0YVdpdGhSYW5nZXMkOiBPYnNlcnZhYmxlPHtcbiAgICBzdGFja3M6IFN0YWNrZWRDb2x1bW5Db21wb25lbnQuU3RhY2tbXTtcbiAgICBnZXRSYW5nZTogKGRhdGU6IG51bWJlcikgPT4geyBtaW5EYXRlOiBEYXRlOyBtYXhEYXRlOiBEYXRlIH07XG4gIH0+ID0gY29tYmluZUxhdGVzdChbdGhpcy5pbnB1dCQsIHRoaXMuc2VsZWN0ZWRJbnRlcnZhbCRdKS5waXBlKFxuICAgIG1hcCgoW2lucHV0LCBpbnRlcnZhbF0pID0+IHtcbiAgICAgIGNvbnN0IHJhbmdlTWFwID0gbmV3IE1hcDxudW1iZXIsIERhdGU+KCk7XG4gICAgICBjb25zdCBzdGFja3MgPSBpbnB1dC5tYXAoKHN0YWNrKTogU3RhY2tlZENvbHVtbkNvbXBvbmVudC5TdGFjayA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVJbnRlcnZhbCA9IGdldFRpbWVJbnRlcnZhbChpbnRlcnZhbCk7XG5cbiAgICAgICAgY29uc3Qgc2VyaWVzID0gc3RhY2suc2VyaWVzLm1hcChzZXJpZXMgPT4ge1xuICAgICAgICAgIGNvbnN0IGJpbm5lZCA9IG5ldyBNYXA8bnVtYmVyLCBTdGFja2VkQ29sdW1uQ29tcG9uZW50LlZhbHVlW10+KCk7XG4gICAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiBzZXJpZXMuZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgYmluS2V5ID0gdGltZUludGVydmFsLmZsb29yKHBvaW50LmRhdGUpLnZhbHVlT2YoKTtcbiAgICAgICAgICAgIGNvbnN0IG1heERhdGUgPSByYW5nZU1hcC5nZXQoYmluS2V5KTtcblxuICAgICAgICAgICAgaWYgKCFtYXhEYXRlIHx8IG1heERhdGUgPCBwb2ludC5kYXRlKSB7XG4gICAgICAgICAgICAgIHJhbmdlTWFwLnNldChiaW5LZXksIHBvaW50LmRhdGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWJpbm5lZC5oYXMoYmluS2V5KSkge1xuICAgICAgICAgICAgICBiaW5uZWQuc2V0KGJpbktleSwgW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYmluID0gYmlubmVkLmdldChiaW5LZXkpITtcbiAgICAgICAgICAgIGJpbi5wdXNoKHBvaW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnNlcmllcyxcbiAgICAgICAgICAgIGRhdGE6IFsuLi5iaW5uZWQuZW50cmllcygpXS5tYXAoKFtkYXRlVmFsdWUsIHBvaW50c10pID0+ICh7XG4gICAgICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKGRhdGVWYWx1ZSksXG4gICAgICAgICAgICAgIHZhbHVlOiBwb2ludFJlZHVjZXIocG9pbnRzKSxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGFjayxcbiAgICAgICAgICBzZXJpZXM6IHNlcmllcyxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhY2tzLFxuICAgICAgICBnZXRSYW5nZTogKGRhdGU6IG51bWJlcikgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtaW5EYXRlOiBuZXcgRGF0ZShkYXRlKSxcbiAgICAgICAgICAgIG1heERhdGU6IHJhbmdlTWFwLmdldChkYXRlKSEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBiaW5uZWREYXRhJCA9IHRoaXMuYmlubmVkRGF0YVdpdGhSYW5nZXMkLnBpcGUoXG4gICAgbWFwKGJpbm5lZERhdGEgPT4gYmlubmVkRGF0YS5zdGFja3MpLFxuICApO1xuXG4gIHJlYWRvbmx5IGdldFJhbmdlJCA9IHRoaXMuYmlubmVkRGF0YVdpdGhSYW5nZXMkLnBpcGUoXG4gICAgbWFwKGJpbm5lZERhdGEgPT4gYmlubmVkRGF0YS5nZXRSYW5nZSksXG4gICk7XG5cbiAgcmVhZG9ubHkgTEVGVF9PRkZTRVQgPSA0ODtcbiAgcmVhZG9ubHkgQ09MVU1OX1BBRERJTkcgPSA0O1xuXG4gIHJlYWRvbmx5IGRyYXdEYXRhJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuYmlubmVkRGF0YSQsXG4gICAgdGhpcy53aWR0aCQsXG4gICAgdGhpcy5zZWxlY3RlZEludGVydmFsJCxcbiAgICB0aGlzLmNvbHVtbldpZHRoJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtiaW5uZWREYXRhLCB3aWR0aCwgaW50ZXJ2YWwsIGNvbHVtbldpZHRoXSkgPT4ge1xuICAgICAgY29uc3Qgdmlld0JveCA9IGAwIDAgJHt3aWR0aH0gJHt0aGlzLkhFSUdIVH1gO1xuICAgICAgY29uc3QgcGFkZGluZyA9IDE2O1xuXG4gICAgICBjb25zdCBbbWluRGF0ZSwgbWF4RGF0ZV0gPSBnZXREYXRlUmFuZ2UoYmlubmVkRGF0YSk7XG4gICAgICBjb25zdCBoYXNNdWx0aXBsZVllYXJzID0gbWluRGF0ZS5nZXRGdWxsWWVhcigpIDwgbWF4RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgY29uc3QgeE1pbm9ySW50ZXJ2YWxGb3JtYXQgPSBnZXRNaW5vckludGVydmFsRm9ybWF0KGludGVydmFsKTtcbiAgICAgIGNvbnN0IG1pbm9yRm9ybWF0dGVyID0gdXRjRm9ybWF0KHhNaW5vckludGVydmFsRm9ybWF0KTtcbiAgICAgIGNvbnN0IG1pbm9yVGltZUludGVydmFsID0gZ2V0VGltZUludGVydmFsKGludGVydmFsKTtcbiAgICAgIGNvbnN0IHhTdGVwcyA9IG1pbm9yVGltZUludGVydmFsLnJhbmdlKFxuICAgICAgICBtaW5vclRpbWVJbnRlcnZhbC5mbG9vcihtaW5EYXRlKSxcbiAgICAgICAgbWlub3JUaW1lSW50ZXJ2YWwuZmxvb3IobWlub3JUaW1lSW50ZXJ2YWwub2Zmc2V0KG1heERhdGUsIDEpKSxcbiAgICAgICk7XG4gICAgICBjb25zdCB4TWFqb3JJbnRlcnZhbCA9IGdldE1ham9ySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgY29uc3QgeE1ham9ySW50ZXJ2YWxGb3JtYXQgPSBnZXRNYWpvckludGVydmFsRm9ybWF0KFxuICAgICAgICB4TWFqb3JJbnRlcnZhbCxcbiAgICAgICAgaGFzTXVsdGlwbGVZZWFycyxcbiAgICAgICk7XG4gICAgICBjb25zdCBtYWpvckZvcm1hdHRlciA9IHV0Y0Zvcm1hdCh4TWFqb3JJbnRlcnZhbEZvcm1hdCk7XG4gICAgICBjb25zdCBmdWxsRm9ybWF0dGVyID0gdXRjRm9ybWF0KFxuICAgICAgICBgJHt4TWlub3JJbnRlcnZhbEZvcm1hdH0gJHt4TWFqb3JJbnRlcnZhbEZvcm1hdH1gLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgeE91dGVyU2NhbGUgPSBzY2FsZUJhbmQoKVxuICAgICAgICAuZG9tYWluKHhTdGVwcy5tYXAoZGF0ZSA9PiBmdWxsRm9ybWF0dGVyKGRhdGUpKSlcbiAgICAgICAgLnJhbmdlKFt0aGlzLkxFRlRfT0ZGU0VULCB3aWR0aF0pO1xuXG4gICAgICBjb25zdCBvdXRlclBhZGRpbmcgPVxuICAgICAgICAoeE91dGVyU2NhbGUuYmFuZHdpZHRoKCkgLVxuICAgICAgICAgICh0aGlzLkNPTFVNTl9QQURESU5HICogKGJpbm5lZERhdGEubGVuZ3RoIC0gMSkgK1xuICAgICAgICAgICAgY29sdW1uV2lkdGggKiBiaW5uZWREYXRhLmxlbmd0aCkpIC9cbiAgICAgICAgMjtcblxuICAgICAgdHlwZSBTZXJpZXNQb2ludCA9IFN0YWNrZWRDb2x1bW5Db21wb25lbnQuVmFsdWUgJiB7XG4gICAgICAgIHNlcmllczogU3RhY2tlZENvbHVtbkNvbXBvbmVudC5TZXJpZXM7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZW5kZXJJbmZvcm1hdGlvbiA9IGJpbm5lZERhdGEubWFwKHN0YWNrRGF0YSA9PiB7XG4gICAgICAgIC8qXG4gICAgICAgICAgQ3JlYXRlIGFuIGFycmF5IHdpdGggZXZlcnkgZGF0YSBwb2ludCArIHRoZWlyIGFzc29jaWF0ZWQgc2VyaWVzLlxuICAgICAgICAgIGkuZS4gTWFrZSBhbiBiYWNrbGluayBmb3IgZWFjaCBlbGVtZW50IHRvIGl0cyBzZXJpZXMuXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IHN0YWNrZWRUYWJsZSA9IHN0YWNrRGF0YS5zZXJpZXMucmVkdWNlPFNlcmllc1BvaW50W10+KFxuICAgICAgICAgICh0YWJsZSwgcykgPT4gW1xuICAgICAgICAgICAgLi4udGFibGUsXG4gICAgICAgICAgICAuLi5zLmRhdGEubWFwKHBvaW50ID0+ICh7XG4gICAgICAgICAgICAgIC4uLnBvaW50LFxuICAgICAgICAgICAgICBzZXJpZXM6IHMsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgXSxcbiAgICAgICAgICBbXSxcbiAgICAgICAgKTtcblxuICAgICAgICAvKlxuICAgICAgICAgIE1hcHMgZWFjaCBvZiB0aGUgU2VyaWVzUG9pbnRzIGJhc2VkIG9uIGxhYmVsLlxuICAgICAgICAgIFRoZW4gbWFwIGVhY2ggb2YgdGhvc2UgbWFwcyB0byBhIGRhdGUuXG5cbiAgICAgICAgICBFeGFtcGxlOlxuICAgICAgICAgICAgSWYgd2Ugd2VyZSBpbmRleGluZyB0aGUgZm9sbG93aW5nIGRhdGE6XG4gICAgICAgICAgICAgICogRXN0aW1hdGVzIENvbXBsZXRlIC0+IDUgaW4gSmFudWFyeSwgNyBpbiBGZWJydWFyeVxuICAgICAgICAgICAgICAqIEVzdGltYXRlcyBJbmNvbXBsZXRlIC0+IDMgaW4gSmFudWFyeSwgMyBpbiBGZWJydWFyeVxuICAgICAgICAgICAgV2Ugd291bGQgZ2V0IGFuIGluZGV4ZWQgdGFibGUgbGlrZSB0aGUgZm9sbG93aW5nLCAobm90ZSB0aGlzIGlzIHBzZXVkb2NvZGUpOlxuICAgICAgICAgICAgICAnSmFudWFyeSc6IHsgJ0VzdGltYXRlcyBDb21wbGV0ZSc6IDUsICdFc3RpbWF0ZXMgSW5jb21wbGV0ZSc6IDMgfVxuICAgICAgICAgICAgICAnRmVicnVhcnknOiB7ICdFc3RpbWF0ZXMgQ29tcGxldGUnOiA3LCAnRXN0aW1hdGVzIEluY29tcGxldGUnOiAzIH1cbiAgICAgICAgKi9cbiAgICAgICAgY29uc3QgaW5kZXhlZFRhYmxlOiBNYXA8RGF0ZSwgTWFwPHN0cmluZywgU2VyaWVzUG9pbnQ+PiA9IGluZGV4KFxuICAgICAgICAgIHN0YWNrZWRUYWJsZSxcbiAgICAgICAgICBkID0+IGQuZGF0ZSxcbiAgICAgICAgICBkID0+IGQuc2VyaWVzLmxhYmVsLFxuICAgICAgICApO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAgVGhlIG91dHB1dCBvZiBcInN0YWNrKClcIiBpcyBhbiBhcnJheSBvZiBhcnJheXMgb2YgdHVwbGVzLlxuICAgICAgICAgICAgVGhlIHR1cGxlcyB1bm5lc3QgYXMgW2Jhc2VsaW5lLCB0b3BsaW5lXS5cbiAgICAgICAgICAgIEVhY2ggXCJrZXlcIiBpbnZvbHZlZCBpbiB0aGUgc3RhY2sgaGFzIGFuIGFycmF5IG9mIHR1cGxlcyByZWxhdGluZyB0byBpdC5cbiAgICAgICAgICAgICAgaS5lLiBbIERhdGUgMSBUdXBsZSwgRGF0ZSAyIFR1cGxlIF1cbiAgICAgICAgICAgIEFsbCBcImtleVwiIGFycmF5cyBhcmUgY29udGFpbmVkIGluIHRoZSBvdXRlciBhcnJheS5cbiAgICAgICAgICAgICAgaS5lLiBbIEtleSAxIFR1cGxlcywgS2V5IDIgVHVwbGVzXVxuXG4gICAgICAgICAgV2Ugc2VsZWN0IHRoZSBrZXlzIHVzaW5nIFwiLmtleXMoKVwiLlxuICAgICAgICAgICAgRm9yIG91ciBwdXJwb3NlcywgdGhlIGtleXMgYXJlIHRoZSBsZWdlbmQgZWxlbWVudHMuXG4gICAgICAgICAgICBpLmUuIElmIHlvdSBoYXZlIHR3byBibG9ja3Mgb2YgdGhlIHNhbWUgY29sb3IsIHRoZXkgaGF2ZSB0aGUgc2FtZSBrZXkuXG5cbiAgICAgICAgICBXZSBzZWxlY3QgdGhlIGhlaWdodHMgb2YgdGhlIGJsb2NrcyB1c2luZyBcIi52YWx1ZSgpXCIuXG5cbiAgICAgICAgICBXZSBhcmUgZ29pbmcgdG8gc3RhY2sgdGhlIGJsb2NrcyBvbiB0b3Agb2YgZWFjaCBvdGhlci5cbiAgICAgICAgICAgIFRoZSBiYXNlbGluZSBvZiB0aGUgZmlyc3Qga2V5IHR1cGxlcyBhcmUgMC5cbiAgICAgICAgICAgIFRoZSBiYXNlbGluZSBvZiB0aGUgc2Vjb25kIGtleSB0dXBsZXMgYXJlIHRoZSB0b3BsaW5lIG9mIHRoZSBhc3NvY2lhdGVkIGZpcnN0IGtleSB0dXBsZS5cblxuICAgICAgICAgIEV4YW1wbGU6XG4gICAgICAgICAgICBJZiB3ZSB3ZXJlIHN0YWNraW5nIHRoZSBmb2xsb3dpbmcgZGF0YTpcbiAgICAgICAgICAgICAgKiBFc3RpbWF0ZXMgQ29tcGxldGUgLT4gNSBpbiBKYW51YXJ5LCA3IGluIEZlYnJ1YXJ5XG4gICAgICAgICAgICAgICogRXN0aW1hdGVzIEluY29tcGxldGUgLT4gMyBpbiBKYW51YXJ5LCAzIGluIEZlYnJ1YXJ5XG4gICAgICAgICAgICBXZSB3b3VsZCBnZXQgYSBzdGFjayBvZjpcbiAgICAgICAgICAgICAgWyAgWyBbMCw1XSxbMCw3XSBdLCBbIFs1LDhdLFs3LDEwXSBdICBdXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IHN0YWNrZWQgPSBzdGFjazxcbiAgICAgICAgICB0eXBlb2YgaW5kZXhlZFRhYmxlIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFY+ID8gW0ssIFZdIDogbmV2ZXJcbiAgICAgICAgPigpXG4gICAgICAgICAgLmtleXMoc3RhY2tEYXRhLnNlcmllcy5tYXAodiA9PiB2LmxhYmVsKSlcbiAgICAgICAgICAudmFsdWUoKFtfLCBncm91cF0sIGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGdyb3VwLmdldChrZXkpIS52YWx1ZTtcbiAgICAgICAgICB9KShpbmRleGVkVGFibGUpO1xuXG4gICAgICAgIHJldHVybiB7IGluZGV4ZWRUYWJsZSwgc3RhY2tlZCB9O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFRoZSBkb21haW4gc2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBoaWdoZXN0IHZhbHVlIGluIGFueSBzdGFjaywgb24gYW55IGRhdGUuXG4gICAgICBsZXQgZG9tYWluTWF4ID0gMDtcbiAgICAgIC8vIEZvciBlYWNoIHVuaXF1ZSBzdGFjayxcbiAgICAgIHJlbmRlckluZm9ybWF0aW9uLmZvckVhY2goKHsgc3RhY2tlZCwgaW5kZXhlZFRhYmxlIH0pID0+IHtcbiAgICAgICAgLy8gRm9yIGVhY2ggZGF0ZSxcbiAgICAgICAgWy4uLmluZGV4ZWRUYWJsZS52YWx1ZXMoKV0uZm9yRWFjaCgocG9pbnRNYXAsIGkpID0+IHtcbiAgICAgICAgICAvLyBGb3IgZWFjaCBzZXJpZXMsXG4gICAgICAgICAgWy4uLnBvaW50TWFwLnZhbHVlcygpXS5mb3JFYWNoKChfLCBqKSA9PiB7XG4gICAgICAgICAgICBkb21haW5NYXggPSBNYXRoLm1heChkb21haW5NYXgsIC4uLnN0YWNrZWRbal1baV0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGRvbWFpbk1heCA9PT0gMCkgZG9tYWluTWF4ID0gMTtcbiAgICAgIGNvbnN0IHlTY2FsZSA9IHNjYWxlTGluZWFyKClcbiAgICAgICAgLmRvbWFpbihbMCwgZG9tYWluTWF4XSlcbiAgICAgICAgLnJhbmdlKFt0aGlzLkhFSUdIVCAtIHBhZGRpbmcgKiAyLCBwYWRkaW5nXSk7XG5cbiAgICAgIGNvbnN0IHJlY3RzOiB7XG4gICAgICAgIGRhdGVWYWx1ZTogbnVtYmVyO1xuICAgICAgICB4OiBudW1iZXI7XG4gICAgICAgIHk6IG51bWJlcjtcbiAgICAgICAgd2lkdGg6IG51bWJlcjtcbiAgICAgICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgICAgIGZpbGw6IHN0cmluZztcbiAgICAgICAgc3RyaXBlZDogYm9vbGVhbjtcbiAgICAgICAgc2VyaWVzUG9pbnQ6IFNlcmllc1BvaW50O1xuICAgICAgfVtdID0gW107XG4gICAgICAvLyBGb3IgZWFjaCB1bmlxdWUgc3RhY2ssXG4gICAgICByZW5kZXJJbmZvcm1hdGlvbi5mb3JFYWNoKCh7IHN0YWNrZWQsIGluZGV4ZWRUYWJsZSB9LCBpbmRleCkgPT4ge1xuICAgICAgICAvLyBGb3IgZWFjaCBkYXRlLFxuICAgICAgICBbLi4uaW5kZXhlZFRhYmxlLmVudHJpZXMoKV0uZm9yRWFjaCgoW2RhdGUsIHBvaW50TWFwXSwgaSkgPT4ge1xuICAgICAgICAgIC8vIEZvciBlYWNoIHNlcmllcyxcbiAgICAgICAgICBbLi4ucG9pbnRNYXAuZW50cmllcygpXS5mb3JFYWNoKChbXywgc2VyaWVzUG9pbnRdLCBqKSA9PiB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIHNpemUgb2YgdGhlIGJveCB3ZSBhcmUgYWJvdXQgdG8gZHJhdy5cbiAgICAgICAgICAgIGNvbnN0IFtiYXNlbGluZSwgdG9wbGluZV0gPSBzdGFja2VkW2pdW2ldO1xuXG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGNvbHVtbldpZHRoO1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0geVNjYWxlKGJhc2VsaW5lKSAtIHlTY2FsZSh0b3BsaW5lKTtcbiAgICAgICAgICAgIGNvbnN0IHggPVxuICAgICAgICAgICAgICAoeE91dGVyU2NhbGUoZnVsbEZvcm1hdHRlcihkYXRlKSkgPz8gMCkgK1xuICAgICAgICAgICAgICBvdXRlclBhZGRpbmcgK1xuICAgICAgICAgICAgICBjb2x1bW5XaWR0aCAqIGluZGV4ICtcbiAgICAgICAgICAgICAgdGhpcy5DT0xVTU5fUEFERElORyAqIGluZGV4O1xuICAgICAgICAgICAgY29uc3QgeSA9IHlTY2FsZShiYXNlbGluZSkgLSBoZWlnaHQ7XG4gICAgICAgICAgICBjb25zdCBmaWxsID0gYHZhcigke3Nlcmllc1BvaW50LnNlcmllcy5jb2xvclRva2VufSlgO1xuXG4gICAgICAgICAgICByZWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgZGF0ZVZhbHVlOiBkYXRlLnZhbHVlT2YoKSxcbiAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgeSxcbiAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgICAgZmlsbCxcbiAgICAgICAgICAgICAgc3RyaXBlZDogc2VyaWVzUG9pbnQuc2VyaWVzLnN0eWxlID09PSAnc3RyaXBlZCcsXG4gICAgICAgICAgICAgIHNlcmllc1BvaW50LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHhNaW5vclRpY2tzID0geFN0ZXBzLm1hcChkYXRlID0+ICh7XG4gICAgICAgIGRhdGVWYWx1ZTogZGF0ZS52YWx1ZU9mKCksXG4gICAgICAgIGxhYmVsOiBtaW5vckZvcm1hdHRlcihkYXRlKSxcbiAgICAgICAgeDpcbiAgICAgICAgICAoeE91dGVyU2NhbGUoZnVsbEZvcm1hdHRlcihkYXRlKSkgPz8gMCkgKyB4T3V0ZXJTY2FsZS5iYW5kd2lkdGgoKSAvIDIsXG4gICAgICB9KSk7XG4gICAgICBjb25zdCB4TWFqb3JUaWNrcyA9XG4gICAgICAgIGludGVydmFsICE9PSAneWVhcidcbiAgICAgICAgICA/IHhTdGVwc1xuICAgICAgICAgICAgICAubWFwKGRhdGUgPT4gKHtcbiAgICAgICAgICAgICAgICBkYXRlVmFsdWU6IGRhdGUudmFsdWVPZigpLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBtYWpvckZvcm1hdHRlcihkYXRlKSxcbiAgICAgICAgICAgICAgICB4OlxuICAgICAgICAgICAgICAgICAgKHhPdXRlclNjYWxlKGZ1bGxGb3JtYXR0ZXIoZGF0ZSkpID8/IDApICtcbiAgICAgICAgICAgICAgICAgIHhPdXRlclNjYWxlLmJhbmR3aWR0aCgpIC8gMixcbiAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHRpY2ssIGksIHRpY2tzKSA9PlxuICAgICAgICAgICAgICAgICAgaSA9PT0gMCB8fCB0aWNrLmxhYmVsICE9PSB0aWNrc1tpIC0gMV0ubGFiZWwsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICA6IFtdO1xuXG4gICAgICBjb25zdCB5VGlja3MgPSB5U2NhbGUudGlja3MoNSk7XG5cbiAgICAgIGNvbnN0IGhvdmVyQmFuZFdpZHRoID1cbiAgICAgICAgcmVuZGVySW5mb3JtYXRpb24ubGVuZ3RoICogY29sdW1uV2lkdGggK1xuICAgICAgICAocmVuZGVySW5mb3JtYXRpb24ubGVuZ3RoICsgMSkgKiB0aGlzLkNPTFVNTl9QQURESU5HO1xuICAgICAgY29uc3QgaG92ZXJCYW5kcyA9IHhTdGVwcy5tYXAoZGF0ZSA9PiAoe1xuICAgICAgICBkYXRlVmFsdWU6IGRhdGUudmFsdWVPZigpLFxuICAgICAgICB4OlxuICAgICAgICAgICh4T3V0ZXJTY2FsZShmdWxsRm9ybWF0dGVyKGRhdGUpKSA/PyAwKSArXG4gICAgICAgICAgKHhPdXRlclNjYWxlLmJhbmR3aWR0aCgpIC0gaG92ZXJCYW5kV2lkdGgpIC8gMixcbiAgICAgICAgeTogeVNjYWxlKGRvbWFpbk1heCksXG4gICAgICAgIHdpZHRoOiBob3ZlckJhbmRXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiB5U2NhbGUoMCkgLSB5U2NhbGUoZG9tYWluTWF4KSxcbiAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uV2lkdGgsXG4gICAgICAgIGhvdmVyQmFuZHMsXG4gICAgICAgIHJlY3RzLFxuICAgICAgICB2aWV3Qm94LFxuICAgICAgICB4TWlub3JUaWNrcyxcbiAgICAgICAgeE1ham9yVGlja3MsXG4gICAgICAgIHlTY2FsZSxcbiAgICAgICAgeVRpY2tzLFxuICAgICAgfTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IGVtcHR5JCA9IHRoaXMuaW5wdXQkLnBpcGUoXG4gICAgbWFwKGlucHV0ID0+XG4gICAgICBpbnB1dC5ldmVyeShzdGFjayA9PlxuICAgICAgICBzdGFjay5zZXJpZXMuZXZlcnkoc2VyaWVzID0+IHNlcmllcy5kYXRhLmxlbmd0aCA9PT0gMCksXG4gICAgICApLFxuICAgICksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBob3ZlcmVkQmFuZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHtcbiAgICBkYXRlVmFsdWU6IG51bWJlcjtcbiAgICBldmVudDogTW91c2VFdmVudDtcbiAgfSB8IG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IGNhbGxvdXQkOiBPYnNlcnZhYmxlPFN0YWNrZWRDb2x1bW5Db21wb25lbnQuQ2FsbG91dENvbnRleHQgfCBudWxsPiA9XG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5ob3ZlcmVkQmFuZCQsIHRoaXMuYmlubmVkRGF0YSRdKS5waXBlKFxuICAgICAgbWFwKChbaG92ZXJlZEJhbmQsIGJpbm5lZERhdGFdKSA9PiB7XG4gICAgICAgIGlmICghaG92ZXJlZEJhbmQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBob3ZlcmVkQmFuZC5ldmVudDtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBhbmNob3IgPSAoPFNWR1JlY3RFbGVtZW50PnRhcmdldCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgY29udGVudDogYmlubmVkRGF0YS5tYXAoc3RhY2sgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VyaWVzUG9pbnRzID0gc3RhY2suc2VyaWVzLm1hcChzZXJpZXMgPT4gKHtcbiAgICAgICAgICAgICAgbGFiZWw6IHNlcmllcy5sYWJlbCxcbiAgICAgICAgICAgICAgY29sb3JUb2tlbjogc2VyaWVzLmNvbG9yVG9rZW4sXG4gICAgICAgICAgICAgIHN0eWxlOiBzZXJpZXMuc3R5bGUsXG4gICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgIHNlcmllcy5kYXRhLmZpbmQoXG4gICAgICAgICAgICAgICAgICAoeyBkYXRlIH0pID0+IGRhdGUudmFsdWVPZigpID09PSBob3ZlcmVkQmFuZC5kYXRlVmFsdWUsXG4gICAgICAgICAgICAgICAgKT8udmFsdWUgPz8gMCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHRpdGxlOiBzdGFjay50aXRsZSxcbiAgICAgICAgICAgICAgdG90YWw6IHRoaXMudmFsdWVGb3JtYXR0ZXIoXG4gICAgICAgICAgICAgICAgc2VyaWVzUG9pbnRzLnJlZHVjZSgoYWNjLCBwb2ludCkgPT4gcG9pbnQudmFsdWUgKyBhY2MsIDApLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBzZXJpZXM6IHNlcmllc1BvaW50cy5tYXAocG9pbnQgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi5wb2ludCxcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogdGhpcy52YWx1ZUZvcm1hdHRlcihwb2ludC52YWx1ZSksXG4gICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICAgKTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBTdGFja2VkQ29sdW1uQ29tcG9uZW50IHtcbiAgZXhwb3J0IHR5cGUgVmFsdWUgPSB7XG4gICAgZGF0ZTogRGF0ZTtcbiAgICB2YWx1ZTogbnVtYmVyO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFNlcmllcyA9IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGRhdGE6IFZhbHVlW107XG4gICAgY29sb3JUb2tlbjogc3RyaW5nO1xuICAgIHN0eWxlOiBMZWdlbmRJdGVtQ29tcG9uZW50LlN0eWxlO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFN0YWNrID0ge1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIHNlcmllczogU2VyaWVzW107XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgU3RhY2tDbGlja2VkID0ge1xuICAgIG1pbkRhdGU6IERhdGU7XG4gICAgbWF4RGF0ZTogRGF0ZTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBDYWxsb3V0Q29udGV4dCA9IHtcbiAgICBhbmNob3I6IERPTVJlY3Q7XG4gICAgY29udGVudDoge1xuICAgICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgICB0b3RhbDogc3RyaW5nO1xuICAgICAgc2VyaWVzOiB7XG4gICAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgICAgIGNvbG9yVG9rZW46IHN0cmluZztcbiAgICAgICAgc3R5bGU6IExlZ2VuZEl0ZW1Db21wb25lbnQuU3R5bGU7XG4gICAgICAgIHZhbHVlOiBudW1iZXI7XG4gICAgICAgIGZvcm1hdHRlZFZhbHVlOiBzdHJpbmc7XG4gICAgICB9W107XG4gICAgfVtdO1xuICB9O1xufVxuIiwiPGRpdlxuICAqbmdJZj1cIihlbXB0eSQgfCBhc3luYykgPT09IGZhbHNlOyBlbHNlIHplcm9TdGF0ZVwiXG4gIGNsYXNzPVwiY29udGFpbmVyXCJcbiAgKHJpdkNsaWVudFNpemUpPVwid2lkdGggPSAkZXZlbnQud2lkdGhcIlxuPlxuICA8c3ZnXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgKm5nSWY9XCJkcmF3RGF0YSQgfCBhc3luYzsgbGV0IGRcIlxuICAgIFthdHRyLnZpZXdCb3hdPVwiZC52aWV3Qm94XCJcbiAgPlxuICAgIDxkZWZzPlxuICAgICAgPHBhdHRlcm5cbiAgICAgICAgaWQ9XCJzdHJpcGVzXCJcbiAgICAgICAgeD1cIjBcIlxuICAgICAgICB5PVwiMFwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwiZC5jb2x1bW5XaWR0aFwiXG4gICAgICAgIHBhdHRlcm5Vbml0cz1cInVzZXJTcGFjZU9uVXNlXCJcbiAgICAgID5cbiAgICAgICAgPGxpbmVcbiAgICAgICAgICB4MT1cIjBcIlxuICAgICAgICAgIFthdHRyLnkxXT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICAgIFthdHRyLngyXT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICAgIHkyPVwiMFwiXG4gICAgICAgICAgc3Ryb2tlPVwidmFyKC0td2hpdGUtMTAwKVwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgID48L2xpbmU+XG4gICAgICA8L3BhdHRlcm4+XG4gICAgPC9kZWZzPlxuICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGQueE1pbm9yVGlja3NcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwidGljay1iYWNrZ3JvdW5kXCJcbiAgICAgICAgW2NsYXNzLmZvY3VzZWRdPVwiKGhvdmVyZWRCYW5kJCB8IGFzeW5jKT8uZGF0ZVZhbHVlID09PSB0aWNrLmRhdGVWYWx1ZVwiXG4gICAgICAgIFthdHRyLnhdPVwidGljay54IC0gMjBcIlxuICAgICAgICBbYXR0ci55XT1cImQueVNjYWxlKDApICsgM1wiXG4gICAgICAgIHdpZHRoPVwiNDBcIlxuICAgICAgICBoZWlnaHQ9XCIxMlwiXG4gICAgICAgIHJ4PVwiMlwiXG4gICAgICA+PC9yZWN0PlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgW2F0dHIueF09XCJ0aWNrLnhcIlxuICAgICAgICBbYXR0ci55XT1cImQueVNjYWxlKDApICsgMTJcIlxuICAgICAgICB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiXG4gICAgICA+XG4gICAgICAgIHt7IHRpY2subGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZC54TWFqb3JUaWNrc1wiPlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgW2F0dHIueF09XCJ0aWNrLnhcIlxuICAgICAgICBbYXR0ci55XT1cImQueVNjYWxlKDApICsgMjRcIlxuICAgICAgICB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiXG4gICAgICA+XG4gICAgICAgIHt7IHRpY2subGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZC55VGlja3NcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwidGlja1wiXG4gICAgICAgIHg9XCIwXCJcbiAgICAgICAgW2F0dHIueV09XCJkLnlTY2FsZSh0aWNrKVwiXG4gICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgIGhlaWdodD1cIjFcIlxuICAgICAgPjwvcmVjdD5cbiAgICAgIDx0ZXh0IGNsYXNzPVwidGljay1sYWJlbFwiIHg9XCIwXCIgW2F0dHIueV09XCJkLnlTY2FsZSh0aWNrKVwiIGR5PVwiLTRcIj5cbiAgICAgICAge3sgdmFsdWVGb3JtYXR0ZXIodGljaykgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHJlY3Qgb2YgZC5yZWN0c1wiPlxuICAgICAgPHJlY3RcbiAgICAgICAgY2xhc3M9XCJjb2x1bW5cIlxuICAgICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICAgIFthdHRyLnldPVwicmVjdC55XCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwicmVjdC53aWR0aFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJyZWN0LmhlaWdodFwiXG4gICAgICAgIFthdHRyLmZpbGxdPVwicmVjdC5maWxsXCJcbiAgICAgICAgW2NsYXNzLmJsdXJyZWRdPVwiXG4gICAgICAgICAgKGhvdmVyZWRCYW5kJCB8IGFzeW5jKSAhPT0gbnVsbCAmJlxuICAgICAgICAgIChob3ZlcmVkQmFuZCQgfCBhc3luYyk/LmRhdGVWYWx1ZSAhPT0gcmVjdC5kYXRlVmFsdWVcbiAgICAgICAgXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8cmVjdFxuICAgICAgICAqbmdJZj1cInJlY3Quc3RyaXBlZFwiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgZmlsbD1cInVybCgjc3RyaXBlcylcIlxuICAgICAgPjwvcmVjdD5cbiAgICA8L2c+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldFJhbmdlJCB8IGFzeW5jOyBsZXQgZ2V0UmFuZ2VcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgICpuZ0Zvcj1cImxldCByZWN0IG9mIGQuaG92ZXJCYW5kc1wiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgZmlsbD1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwiXG4gICAgICAgICAgaG92ZXJlZEJhbmQkLm5leHQoeyBkYXRlVmFsdWU6IHJlY3QuZGF0ZVZhbHVlLCBldmVudDogJGV2ZW50IH0pXG4gICAgICAgIFwiXG4gICAgICAgIChtb3VzZWxlYXZlKT1cImhvdmVyZWRCYW5kJC5uZXh0KG51bGwpXCJcbiAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgIHN0YWNrQ2xpY2tlZC5lbWl0KGdldFJhbmdlKHJlY3QuZGF0ZVZhbHVlKSk7IGhvdmVyZWRCYW5kJC5uZXh0KG51bGwpXG4gICAgICAgIFwiXG4gICAgICA+PC9yZWN0PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L3N2Zz5cbjwvZGl2PlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiY2FsbG91dCQgfCBhc3luYzsgbGV0IGNhbGxvdXRcIj5cbiAgPHJpdi1jYWxsb3V0XG4gICAgKnJpdi1vdmVybGF5XG4gICAgW2FuY2hvcl09XCJjYWxsb3V0Py5hbmNob3IgPz8gbnVsbFwiXG4gICAgW3RoZW1lXT1cIidsaWdodCdcIlxuICAgIFtpc01vZGFsXT1cImZhbHNlXCJcbiAgICBbcHJlZmVycmVkUG9zaXRpb25dPVwiJ2NlbnRlci1yaWdodCdcIlxuICAgIFthbGxvd2VkUG9zaXRpb25zXT1cIltcbiAgICAgICdjZW50ZXItcmlnaHQnLFxuICAgICAgJ2NlbnRlci1sZWZ0JyxcbiAgICAgICd0b3AtY2VudGVyJyxcbiAgICAgICdib3R0b20tY2VudGVyJ1xuICAgIF1cIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtY29udGVudFwiPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjYWxsb3V0SGVhZGVyVGVtcGxhdGVcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGNhbGxvdXQgfVwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1zdGFja1wiICpuZ0Zvcj1cImxldCBzdGFjayBvZiBjYWxsb3V0Py5jb250ZW50XCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzdGFjay50aXRsZTsgbGV0IHRpdGxlXCIgY2xhc3M9XCJjYWxsb3V0LXJvd1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VyaWVzLWxhYmVsXCI+e3sgdGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4+e3sgc3RhY2sudG90YWwgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzZXJpZXMgb2Ygc3RhY2suc2VyaWVzXCIgY2xhc3M9XCJjYWxsb3V0LXJvd1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VyaWVzLWxhYmVsXCI+XG4gICAgICAgICAgICA8cml2LWxlZ2VuZC1pdGVtXG4gICAgICAgICAgICAgIFtjb2xvclRva2VuXT1cInNlcmllcy5jb2xvclRva2VuXCJcbiAgICAgICAgICAgICAgW3N0eWxlXT1cInNlcmllcy5zdHlsZVwiXG4gICAgICAgICAgICA+PC9yaXYtbGVnZW5kLWl0ZW0+XG4gICAgICAgICAgICA8c3Bhbj57eyBzZXJpZXMubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuPnt7IHNlcmllcy5mb3JtYXR0ZWRWYWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9yaXYtY2FsbG91dD5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI3plcm9TdGF0ZT5cbiAgPHJpdi16ZXJvLXN0YXRlPjwvcml2LXplcm8tc3RhdGU+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NvbnRyb2xzPlxuICA8cml2LXNpbXBsZS1zZWxlY3RcbiAgICBbb3B0aW9uR3JvdXBzXT1cImludGVydmFsT3B0aW9ucyQgfCBhc3luYyB8IHJpdk9wdGlvbkdyb3VwXCJcbiAgICBbb3JkZXJCeV09XCInc291cmNlJ1wiXG4gICAgW3NlbGVjdGVkT3B0aW9uXT1cInNlbGVjdGVkSW50ZXJ2YWxPcHRpb24kIHwgYXN5bmNcIlxuICAgIChzZWxlY3RlZE9wdGlvbkNoYW5nZSk9XCJzZXRJbnRlcnZhbE9wdGlvbigkZXZlbnQpXCJcbiAgPjwvcml2LXNpbXBsZS1zZWxlY3Q+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -0,0 +1,18 @@
1
+ export function getDateRange(stacks) {
2
+ let min = Infinity;
3
+ let max = -Infinity;
4
+ for (const stack of stacks) {
5
+ for (const series of stack.series) {
6
+ for (const { date } of series.data) {
7
+ const value = date.valueOf();
8
+ min = Math.min(min, value);
9
+ max = Math.max(max, value);
10
+ }
11
+ }
12
+ }
13
+ return [new Date(min), new Date(max)];
14
+ }
15
+ export function pointReducer(points) {
16
+ return points.reduce((total, { value }) => total + value, 0);
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1jb2x1bW4uaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Jpdi9zcmMvbGliL3Zpc3VhbGl6YXRpb24vc3RhY2tlZC1jb2x1bW4vc3RhY2tlZC1jb2x1bW4uaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLFVBQVUsWUFBWSxDQUMxQixNQUFzQztJQUV0QyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUM7SUFDbkIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDcEIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixLQUFLLE1BQU0sTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQyxLQUFLLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDN0IsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMzQixHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDN0IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQUMsTUFBc0M7SUFDakUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0YWNrZWRDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL3N0YWNrZWQtY29sdW1uLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRlUmFuZ2UoXG4gIHN0YWNrczogU3RhY2tlZENvbHVtbkNvbXBvbmVudC5TdGFja1tdLFxuKTogW0RhdGUsIERhdGVdIHtcbiAgbGV0IG1pbiA9IEluZmluaXR5O1xuICBsZXQgbWF4ID0gLUluZmluaXR5O1xuICBmb3IgKGNvbnN0IHN0YWNrIG9mIHN0YWNrcykge1xuICAgIGZvciAoY29uc3Qgc2VyaWVzIG9mIHN0YWNrLnNlcmllcykge1xuICAgICAgZm9yIChjb25zdCB7IGRhdGUgfSBvZiBzZXJpZXMuZGF0YSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGUudmFsdWVPZigpO1xuICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIHZhbHVlKTtcbiAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbbmV3IERhdGUobWluKSwgbmV3IERhdGUobWF4KV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb2ludFJlZHVjZXIocG9pbnRzOiBTdGFja2VkQ29sdW1uQ29tcG9uZW50LlZhbHVlW10pIHtcbiAgcmV0dXJuIHBvaW50cy5yZWR1Y2UoKHRvdGFsLCB7IHZhbHVlIH0pID0+IHRvdGFsICsgdmFsdWUsIDApO1xufVxuIl19