@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.
- package/{esm2020 → esm2022}/lib/accessibility/sr-only/sr-only.component.mjs +4 -4
- package/esm2022/lib/download/download.service.mjs +47 -0
- package/{esm2020 → esm2022}/lib/format/pipes/common.mjs +5 -5
- package/{esm2020 → esm2022}/lib/format/pipes/date.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/format/pipes/days.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/format/pipes/dollars.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/format/pipes/number.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/format/pipes/percentage.pipe.mjs +4 -4
- package/esm2022/lib/format/pipes/sentence-case.pipe.mjs +61 -0
- package/esm2022/lib/format/pipes/small-currency.pipe.mjs +24 -0
- package/esm2022/lib/format/pipes/small-number.pipe.mjs +29 -0
- package/esm2022/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +62 -0
- package/esm2022/lib/format/truncate/truncate.component.mjs +51 -0
- package/esm2022/lib/icon/dom-cache.mjs +32 -0
- package/esm2022/lib/icon/icon.component.mjs +86 -0
- package/{esm2020 → esm2022}/lib/icon/icons.mjs +1 -1
- package/{esm2020 → esm2022}/lib/input/alphabetic-field/alphabetic-field.component.mjs +4 -4
- package/esm2022/lib/input/auto-focus/auto-focus.directive.mjs +48 -0
- package/esm2022/lib/input/button/button.component.mjs +139 -0
- package/esm2022/lib/input/button-group/button-group.component.mjs +39 -0
- package/{esm2020 → esm2022}/lib/input/calendar/calendar.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/input/card-checkbox/card-checkbox.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/input/checkbox/checkbox.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/input/currency-field/currency-field.component.mjs +4 -4
- package/esm2022/lib/input/date/date.component.mjs +279 -0
- package/esm2022/lib/input/date-range/date-range.component.mjs +477 -0
- package/esm2022/lib/input/filter-chip/filter-chip.component.mjs +47 -0
- package/{esm2020 → esm2022}/lib/input/filter-dropdown/filter-dropdown.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/input/input-label/input-label.component.mjs +4 -4
- package/esm2022/lib/input/mentions-input/mentions-input.component.mjs +745 -0
- package/esm2022/lib/input/number-field/number-field.component.mjs +125 -0
- package/{esm2020 → esm2022}/lib/input/percentage-field/percentage-field.component.mjs +4 -4
- package/esm2022/lib/input/phone-field/phone-field.component.mjs +74 -0
- package/{esm2020 → esm2022}/lib/input/radio/radio.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/input/search/search.component.mjs +4 -4
- package/esm2022/lib/input/search-select/search-select.component.mjs +189 -0
- package/esm2022/lib/input/select/select/select.component.mjs +178 -0
- package/{esm2020 → esm2022}/lib/input/select/select-node/select-node.component.mjs +4 -4
- package/esm2022/lib/input/select/state.mjs +882 -0
- package/{esm2020 → esm2022}/lib/input/simple-select/option-group.pipe.mjs +4 -4
- package/esm2022/lib/input/simple-select/simple-select.component.mjs +178 -0
- package/esm2022/lib/input/switch-checkbox/switch-checkbox.component.mjs +33 -0
- package/esm2022/lib/input/text-field/text-field.component.mjs +115 -0
- package/{esm2020 → esm2022}/lib/input/textarea-field/textarea-field.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/input/validation-message/validation-message.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/layout/card/card-actions.component.mjs +4 -4
- package/esm2022/lib/layout/card/card-content.component.mjs +64 -0
- package/esm2022/lib/layout/card/card-header.component.mjs +201 -0
- package/{esm2020 → esm2022}/lib/layout/card/card-link.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/layout/card/card-media.component.mjs +4 -4
- package/esm2022/lib/layout/card/card.component.mjs +291 -0
- package/{esm2020 → esm2022}/lib/layout/setting-row/setting-row.component.mjs +4 -4
- package/esm2022/lib/load/loading/loading.component.mjs +43 -0
- package/{esm2020 → esm2022}/lib/load/loading-cover/loading-cover.component.mjs +4 -4
- package/esm2022/lib/navigation/editable-heading/editable-heading.component.mjs +243 -0
- package/{esm2020 → esm2022}/lib/navigation/link/link.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/navigation/page-header/page-header.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/simple-tabs/simple-tab/simple-tab.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/simple-tabs/simple-tabs/simple-tabs.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/tabs/tab/tab.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/tabs/tabs/tabs.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/views/all-views-modal/all-views-modal.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/views/edit-view/edit-view.component.mjs +9 -9
- package/esm2022/lib/navigation/views/permission-picker/permission-picker.component.mjs +151 -0
- package/esm2022/lib/navigation/views/state.mjs +456 -0
- package/{esm2020 → esm2022}/lib/navigation/views/view-menu/view-menu.component.mjs +5 -5
- package/esm2022/lib/navigation/views/views/views.component.mjs +90 -0
- package/{esm2020 → esm2022}/lib/notification/badge/badge.component.mjs +4 -4
- package/esm2022/lib/notification/banner/banner-action.component.mjs +48 -0
- package/esm2022/lib/notification/banner/banner.component.mjs +61 -0
- package/esm2022/lib/notification/map-indicator/map-indicator.component.mjs +50 -0
- package/esm2022/lib/notification/map-indicator/map-indicators.mjs +15 -0
- package/{esm2020 → esm2022}/lib/notification/notification-badge/notification-badge.component.mjs +4 -4
- package/esm2022/lib/overlay/callout/callout.component.mjs +130 -0
- package/esm2022/lib/overlay/callout/callout.helpers.mjs +113 -0
- package/{esm2020 → esm2022}/lib/overlay/callout/help/help.component.mjs +4 -4
- package/esm2022/lib/overlay/callout/lock-scroll.directive.mjs +69 -0
- package/{esm2020 → esm2022}/lib/overlay/callout/menu/menu-item/menu-item.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/overlay/callout/menu/menu.component.mjs +4 -4
- package/esm2022/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +30 -0
- package/{esm2020 → esm2022}/lib/overlay/callout/tooltip/tooltip.component.mjs +4 -4
- package/esm2022/lib/overlay/callout/tooltip/tooltip.directive.mjs +138 -0
- package/esm2022/lib/overlay/modal/dialog/dialog.component.mjs +47 -0
- package/{esm2020 → esm2022}/lib/overlay/modal/dialog-stack.service.mjs +4 -4
- package/esm2022/lib/overlay/modal/form-dialog/form-dialog.component.mjs +146 -0
- package/esm2022/lib/overlay/modal/modal.component.mjs +31 -0
- package/{esm2020 → esm2022}/lib/overlay/modal/side-sheet/side-sheet.component.mjs +4 -4
- package/esm2022/lib/overlay/overlay-outlet.component.mjs +98 -0
- package/{esm2020 → esm2022}/lib/overlay/overlay.directive.mjs +5 -5
- package/{esm2020 → esm2022}/lib/overlay/overlay.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/overlay/toast/toast-action.component.mjs +4 -4
- package/esm2022/lib/overlay/toast/toast.component.mjs +41 -0
- package/{esm2020 → esm2022}/lib/riv.module.mjs +227 -227
- package/esm2022/lib/size/size.directive.mjs +33 -0
- package/esm2022/lib/table/simple-table/coordinate-helper.mjs +61 -0
- package/esm2022/lib/table/simple-table/simple-table-cell.component.mjs +36 -0
- package/esm2022/lib/table/simple-table/simple-table-header-cell.component.mjs +37 -0
- package/{esm2020 → esm2022}/lib/table/simple-table/simple-table-row.component.mjs +4 -4
- package/esm2022/lib/table/simple-table/simple-table.component.mjs +104 -0
- package/esm2022/lib/table/table/clipboard.mjs +182 -0
- package/esm2022/lib/table/table/state-helpers/collapse-helpers.mjs +116 -0
- package/esm2022/lib/table/table/state-helpers/column-helpers.mjs +383 -0
- package/{esm2020 → esm2022}/lib/table/table/state-helpers/display-helpers.mjs +1 -1
- package/esm2022/lib/table/table/state-helpers/nesting-helpers.mjs +123 -0
- package/esm2022/lib/table/table/state-helpers/order-helpers.mjs +164 -0
- package/esm2022/lib/table/table/state-helpers/pagination-helpers.mjs +139 -0
- package/esm2022/lib/table/table/state-helpers/result-helpers.mjs +70 -0
- package/esm2022/lib/table/table/state-helpers/search-helpers.mjs +72 -0
- package/esm2022/lib/table/table/state-helpers/selection-helpers.mjs +180 -0
- package/esm2022/lib/table/table/state.mjs +1035 -0
- package/esm2022/lib/table/table/table/table.component.mjs +367 -0
- package/{esm2020 → esm2022}/lib/table/table/table-collapse-all/table-collapse-all.component.mjs +5 -5
- package/esm2022/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +227 -0
- package/esm2022/lib/table/table/table-column-settings/table-column-settings.component.mjs +134 -0
- package/esm2022/lib/table/table/table-csv-export/table-csv-export.component.mjs +35 -0
- package/{esm2020 → esm2022}/lib/table/table/table-header-resize-handle/table-header-resize-handle.component.mjs +6 -6
- package/esm2022/lib/table/table/table-search/table-search.component.mjs +71 -0
- package/{esm2020 → esm2022}/lib/table/table/table-search-columns/table-search-columns.component.mjs +4 -4
- package/esm2022/lib/visibility/visibility.directive.mjs +34 -0
- package/esm2022/lib/visualization/chart/chart-scaling.mjs +380 -0
- package/esm2022/lib/visualization/chart/chart.component.mjs +626 -0
- package/esm2022/lib/visualization/chart/chart.mjs +3768 -0
- package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-cell.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-header-cell.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-row.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/data-table/data-table.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/donut/donut.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/funnel-chart/funnel-chart.component.mjs +5 -5
- package/esm2022/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +33 -0
- package/{esm2020 → esm2022}/lib/visualization/highlight/highlight.component.mjs +4 -4
- package/esm2022/lib/visualization/highlight/highlight.helpers.mjs +20 -0
- package/esm2022/lib/visualization/intervals.mjs +63 -0
- package/{esm2020 → esm2022}/lib/visualization/issue/issue.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/legend-item/legend-item.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/metric/metric.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/mini-pie/mini-pie.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/progress/progress.component.mjs +5 -5
- package/esm2022/lib/visualization/stacked-column/stacked-column.component.mjs +377 -0
- package/esm2022/lib/visualization/stacked-column/stacked-column.helpers.mjs +18 -0
- package/esm2022/lib/visualization/stacked-row/stacked-row.component.mjs +270 -0
- package/esm2022/lib/visualization/stacked-row/stacked-row.helpers.mjs +74 -0
- package/esm2022/lib/visualization/time-series/time-series.component.mjs +374 -0
- package/esm2022/lib/visualization/time-series/time-series.helpers.mjs +15 -0
- package/esm2022/lib/visualization/trend/trend.component.mjs +51 -0
- package/{esm2020 → esm2022}/lib/visualization/zero-state/zero-state.component.mjs +4 -4
- package/{fesm2020 → fesm2022}/rivet-health-design-system.mjs +670 -670
- package/{fesm2020 → fesm2022}/rivet-health-design-system.mjs.map +1 -1
- package/lib/format/svg-text-truncate/svg-text-truncate.directive.d.ts +1 -1
- package/lib/format/truncate/truncate.component.d.ts +1 -1
- package/lib/icon/icon.component.d.ts +1 -1
- package/lib/input/auto-focus/auto-focus.directive.d.ts +1 -1
- package/lib/input/button/button.component.d.ts +1 -1
- package/lib/input/calendar/calendar.component.d.ts +1 -1
- package/lib/input/checkbox/checkbox.component.d.ts +1 -1
- package/lib/input/currency-field/currency-field.component.d.ts +1 -1
- package/lib/input/date/date.component.d.ts +1 -1
- package/lib/input/date-range/date-range.component.d.ts +1 -1
- package/lib/input/filter-chip/filter-chip.component.d.ts +1 -1
- package/lib/input/filter-dropdown/filter-dropdown.component.d.ts +1 -1
- package/lib/input/input-label/input-label.component.d.ts +1 -1
- package/lib/input/mentions-input/mentions-input.component.d.ts +1 -1
- package/lib/input/number-field/number-field.component.d.ts +1 -1
- package/lib/input/percentage-field/percentage-field.component.d.ts +1 -1
- package/lib/input/phone-field/phone-field.component.d.ts +1 -1
- package/lib/input/radio/radio.component.d.ts +1 -1
- package/lib/input/search/search.component.d.ts +1 -1
- package/lib/input/search-select/search-select.component.d.ts +1 -1
- package/lib/input/select/select/select.component.d.ts +1 -1
- package/lib/input/select/select-node/select-node.component.d.ts +1 -1
- package/lib/input/simple-select/simple-select.component.d.ts +1 -1
- package/lib/input/switch-checkbox/switch-checkbox.component.d.ts +1 -1
- package/lib/input/text-field/text-field.component.d.ts +1 -1
- package/lib/input/textarea-field/textarea-field.component.d.ts +1 -1
- package/lib/input/validation-message/validation-message.component.d.ts +1 -1
- package/lib/layout/card/card-actions.component.d.ts +1 -1
- package/lib/layout/card/card-content.component.d.ts +1 -1
- package/lib/layout/card/card-header.component.d.ts +1 -1
- package/lib/layout/card/card-link.component.d.ts +1 -1
- package/lib/layout/card/card-media.component.d.ts +1 -1
- package/lib/layout/card/card.component.d.ts +1 -1
- package/lib/layout/setting-row/setting-row.component.d.ts +1 -1
- package/lib/load/loading/loading.component.d.ts +1 -1
- package/lib/load/loading-cover/loading-cover.component.d.ts +1 -1
- package/lib/navigation/editable-heading/editable-heading.component.d.ts +1 -1
- package/lib/navigation/link/link.component.d.ts +1 -1
- package/lib/navigation/page-header/page-header.component.d.ts +1 -1
- package/lib/navigation/simple-tabs/simple-tab/simple-tab.component.d.ts +1 -1
- package/lib/navigation/tabs/tab/tab.component.d.ts +1 -1
- package/lib/navigation/views/all-views-modal/all-views-modal.component.d.ts +1 -1
- package/lib/navigation/views/edit-view/edit-view.component.d.ts +1 -1
- package/lib/navigation/views/permission-picker/permission-picker.component.d.ts +3 -3
- package/lib/navigation/views/view-menu/view-menu.component.d.ts +1 -1
- package/lib/navigation/views/views/views.component.d.ts +1 -1
- package/lib/notification/badge/badge.component.d.ts +1 -1
- package/lib/notification/banner/banner-action.component.d.ts +1 -1
- package/lib/notification/banner/banner.component.d.ts +1 -1
- package/lib/notification/map-indicator/map-indicator.component.d.ts +1 -1
- package/lib/notification/notification-badge/notification-badge.component.d.ts +1 -1
- package/lib/overlay/callout/callout.component.d.ts +1 -1
- package/lib/overlay/callout/help/help.component.d.ts +1 -1
- package/lib/overlay/callout/lock-scroll.directive.d.ts +1 -1
- package/lib/overlay/callout/menu/menu-item/menu-item.component.d.ts +1 -1
- package/lib/overlay/callout/menu/menu.component.d.ts +1 -1
- package/lib/overlay/callout/tooltip/locked-tooltip.directive.d.ts +1 -1
- package/lib/overlay/callout/tooltip/tooltip.component.d.ts +1 -1
- package/lib/overlay/callout/tooltip/tooltip.directive.d.ts +1 -1
- package/lib/overlay/modal/dialog/dialog.component.d.ts +1 -1
- package/lib/overlay/modal/form-dialog/form-dialog.component.d.ts +1 -1
- package/lib/overlay/modal/modal.component.d.ts +1 -1
- package/lib/overlay/modal/side-sheet/side-sheet.component.d.ts +1 -1
- package/lib/overlay/toast/toast.component.d.ts +1 -1
- package/lib/table/simple-table/simple-table-header-cell.component.d.ts +1 -1
- package/lib/table/simple-table/simple-table-row.component.d.ts +1 -1
- package/lib/table/table/table/table.component.d.ts +1 -1
- package/lib/table/table/table-collapse-all/table-collapse-all.component.d.ts +1 -1
- package/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.d.ts +1 -1
- package/lib/table/table/table-column-settings/table-column-settings.component.d.ts +1 -1
- package/lib/table/table/table-csv-export/table-csv-export.component.d.ts +1 -1
- package/lib/table/table/table-search/table-search.component.d.ts +1 -1
- package/lib/table/table/table-search-columns/table-search-columns.component.d.ts +1 -1
- package/lib/visualization/chart/chart.component.d.ts +1 -1
- package/lib/visualization/data-table/data-table-row.component.d.ts +1 -1
- package/lib/visualization/donut/donut.component.d.ts +1 -1
- package/lib/visualization/funnel-chart/funnel-chart.component.d.ts +1 -1
- package/lib/visualization/highlight/highlight.component.d.ts +1 -1
- package/lib/visualization/issue/issue.component.d.ts +1 -1
- package/lib/visualization/legend-item/legend-item.component.d.ts +1 -1
- package/lib/visualization/metric/metric.component.d.ts +1 -1
- package/lib/visualization/mini-pie/mini-pie.component.d.ts +1 -1
- package/lib/visualization/progress/progress.component.d.ts +1 -1
- package/lib/visualization/stacked-column/stacked-column.component.d.ts +3 -3
- package/lib/visualization/stacked-row/stacked-row.component.d.ts +1 -1
- package/lib/visualization/time-series/time-series.component.d.ts +3 -3
- package/lib/visualization/trend/trend.component.d.ts +1 -1
- package/lib/visualization/zero-state/zero-state.component.d.ts +1 -1
- package/package.json +5 -11
- package/esm2020/lib/download/download.service.mjs +0 -47
- package/esm2020/lib/format/pipes/sentence-case.pipe.mjs +0 -61
- package/esm2020/lib/format/pipes/small-currency.pipe.mjs +0 -24
- package/esm2020/lib/format/pipes/small-number.pipe.mjs +0 -29
- package/esm2020/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +0 -62
- package/esm2020/lib/format/truncate/truncate.component.mjs +0 -51
- package/esm2020/lib/icon/dom-cache.mjs +0 -32
- package/esm2020/lib/icon/icon.component.mjs +0 -86
- package/esm2020/lib/input/auto-focus/auto-focus.directive.mjs +0 -48
- package/esm2020/lib/input/button/button.component.mjs +0 -139
- package/esm2020/lib/input/button-group/button-group.component.mjs +0 -39
- package/esm2020/lib/input/date/date.component.mjs +0 -279
- package/esm2020/lib/input/date-range/date-range.component.mjs +0 -477
- package/esm2020/lib/input/filter-chip/filter-chip.component.mjs +0 -47
- package/esm2020/lib/input/mentions-input/mentions-input.component.mjs +0 -745
- package/esm2020/lib/input/number-field/number-field.component.mjs +0 -125
- package/esm2020/lib/input/phone-field/phone-field.component.mjs +0 -74
- package/esm2020/lib/input/search-select/search-select.component.mjs +0 -189
- package/esm2020/lib/input/select/select/select.component.mjs +0 -178
- package/esm2020/lib/input/select/state.mjs +0 -882
- package/esm2020/lib/input/simple-select/simple-select.component.mjs +0 -178
- package/esm2020/lib/input/switch-checkbox/switch-checkbox.component.mjs +0 -33
- package/esm2020/lib/input/text-field/text-field.component.mjs +0 -115
- package/esm2020/lib/layout/card/card-content.component.mjs +0 -64
- package/esm2020/lib/layout/card/card-header.component.mjs +0 -201
- package/esm2020/lib/layout/card/card.component.mjs +0 -291
- package/esm2020/lib/load/loading/loading.component.mjs +0 -43
- package/esm2020/lib/navigation/editable-heading/editable-heading.component.mjs +0 -243
- package/esm2020/lib/navigation/views/permission-picker/permission-picker.component.mjs +0 -151
- package/esm2020/lib/navigation/views/state.mjs +0 -456
- package/esm2020/lib/navigation/views/views/views.component.mjs +0 -90
- package/esm2020/lib/notification/banner/banner-action.component.mjs +0 -48
- package/esm2020/lib/notification/banner/banner.component.mjs +0 -61
- package/esm2020/lib/notification/map-indicator/map-indicator.component.mjs +0 -50
- package/esm2020/lib/notification/map-indicator/map-indicators.mjs +0 -15
- package/esm2020/lib/overlay/callout/callout.component.mjs +0 -130
- package/esm2020/lib/overlay/callout/callout.helpers.mjs +0 -113
- package/esm2020/lib/overlay/callout/lock-scroll.directive.mjs +0 -69
- package/esm2020/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +0 -30
- package/esm2020/lib/overlay/callout/tooltip/tooltip.directive.mjs +0 -138
- package/esm2020/lib/overlay/modal/dialog/dialog.component.mjs +0 -47
- package/esm2020/lib/overlay/modal/form-dialog/form-dialog.component.mjs +0 -146
- package/esm2020/lib/overlay/modal/modal.component.mjs +0 -31
- package/esm2020/lib/overlay/overlay-outlet.component.mjs +0 -98
- package/esm2020/lib/overlay/toast/toast.component.mjs +0 -41
- package/esm2020/lib/size/size.directive.mjs +0 -33
- package/esm2020/lib/table/simple-table/coordinate-helper.mjs +0 -61
- package/esm2020/lib/table/simple-table/simple-table-cell.component.mjs +0 -36
- package/esm2020/lib/table/simple-table/simple-table-header-cell.component.mjs +0 -37
- package/esm2020/lib/table/simple-table/simple-table.component.mjs +0 -104
- package/esm2020/lib/table/table/clipboard.mjs +0 -182
- package/esm2020/lib/table/table/state-helpers/collapse-helpers.mjs +0 -116
- package/esm2020/lib/table/table/state-helpers/column-helpers.mjs +0 -383
- package/esm2020/lib/table/table/state-helpers/nesting-helpers.mjs +0 -123
- package/esm2020/lib/table/table/state-helpers/order-helpers.mjs +0 -164
- package/esm2020/lib/table/table/state-helpers/pagination-helpers.mjs +0 -139
- package/esm2020/lib/table/table/state-helpers/result-helpers.mjs +0 -70
- package/esm2020/lib/table/table/state-helpers/search-helpers.mjs +0 -72
- package/esm2020/lib/table/table/state-helpers/selection-helpers.mjs +0 -180
- package/esm2020/lib/table/table/state.mjs +0 -1035
- package/esm2020/lib/table/table/table/table.component.mjs +0 -367
- package/esm2020/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +0 -227
- package/esm2020/lib/table/table/table-column-settings/table-column-settings.component.mjs +0 -134
- package/esm2020/lib/table/table/table-csv-export/table-csv-export.component.mjs +0 -35
- package/esm2020/lib/table/table/table-search/table-search.component.mjs +0 -71
- package/esm2020/lib/visibility/visibility.directive.mjs +0 -34
- package/esm2020/lib/visualization/chart/chart-scaling.mjs +0 -380
- package/esm2020/lib/visualization/chart/chart.component.mjs +0 -626
- package/esm2020/lib/visualization/chart/chart.mjs +0 -3768
- package/esm2020/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +0 -33
- package/esm2020/lib/visualization/highlight/highlight.helpers.mjs +0 -20
- package/esm2020/lib/visualization/intervals.mjs +0 -63
- package/esm2020/lib/visualization/stacked-column/stacked-column.component.mjs +0 -377
- package/esm2020/lib/visualization/stacked-column/stacked-column.helpers.mjs +0 -18
- package/esm2020/lib/visualization/stacked-row/stacked-row.component.mjs +0 -270
- package/esm2020/lib/visualization/stacked-row/stacked-row.helpers.mjs +0 -74
- package/esm2020/lib/visualization/time-series/time-series.component.mjs +0 -374
- package/esm2020/lib/visualization/time-series/time-series.helpers.mjs +0 -15
- package/esm2020/lib/visualization/trend/trend.component.mjs +0 -51
- package/fesm2015/rivet-health-design-system.mjs +0 -18370
- package/fesm2015/rivet-health-design-system.mjs.map +0 -1
- /package/{esm2020 → esm2022}/lib/overlay/callout/select-callout-defaults.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/util/local-storage.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/rivet-health-design-system.mjs +0 -0
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
|
|
2
|
+
import { scaleLinear } from 'd3-scale';
|
|
3
|
+
import { line } from 'd3-shape';
|
|
4
|
+
import { utcDay } from 'd3-time';
|
|
5
|
+
import { utcFormat } from 'd3-time-format';
|
|
6
|
+
import { BehaviorSubject, combineLatest, map, shareReplay, } from 'rxjs';
|
|
7
|
+
import { NumberPipe } from '../../format/pipes/number.pipe';
|
|
8
|
+
import { getIntervalTitle, getMajorInterval, getMajorIntervalFormat, getMinorIntervalFormat, getTimeInterval, intervals, } from '../intervals';
|
|
9
|
+
import { getDateRange } from './time-series.helpers';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "@angular/common";
|
|
12
|
+
import * as i2 from "../../overlay/callout/callout.component";
|
|
13
|
+
import * as i3 from "../legend-item/legend-item.component";
|
|
14
|
+
import * as i4 from "../../overlay/overlay.directive";
|
|
15
|
+
import * as i5 from "../../input/simple-select/simple-select.component";
|
|
16
|
+
import * as i6 from "../../size/size.directive";
|
|
17
|
+
import * as i7 from "../zero-state/zero-state.component";
|
|
18
|
+
import * as i8 from "../../input/simple-select/option-group.pipe";
|
|
19
|
+
const DEFAULT_INTERVAL = 'day';
|
|
20
|
+
// TODO: once we upgrade to Angular 16, this component can be cleaned up with
|
|
21
|
+
// signals instead of RxJS. See commit e238c2d.
|
|
22
|
+
// https://www.notion.so/rivet/Resolve-TODOs-after-Angular-upgrade-1f2667eb2a3180b79f6ad92a7e576f08
|
|
23
|
+
export class TimeSeriesComponent {
|
|
24
|
+
constructor() {
|
|
25
|
+
this.input$ = new BehaviorSubject([
|
|
26
|
+
{
|
|
27
|
+
pointReducer: points => points.reduce((total, { value }) => total + value, 0),
|
|
28
|
+
valueFormatter: v => new NumberPipe().transform(v) ?? '',
|
|
29
|
+
series: [],
|
|
30
|
+
},
|
|
31
|
+
]);
|
|
32
|
+
this.width$ = new BehaviorSubject(0);
|
|
33
|
+
this.HEIGHT = 300;
|
|
34
|
+
this.zeroStateMessage$ = new BehaviorSubject('No data to display.');
|
|
35
|
+
this.BOTTOM_OFFSET = 24;
|
|
36
|
+
this.LEFT_RIGHT_OFFSET = 48;
|
|
37
|
+
this.TOP_PADDING = 16;
|
|
38
|
+
this.LEFT_RIGHT_PADDING = 8;
|
|
39
|
+
this.BOTTOM_PADDING = 8;
|
|
40
|
+
this.Y_TICK_COUNT = 5;
|
|
41
|
+
this.POINT_RADIUS = 3.5;
|
|
42
|
+
this.dateRange$ = this.input$.pipe(map(getDateRange), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
43
|
+
this.interval$ = new BehaviorSubject(DEFAULT_INTERVAL);
|
|
44
|
+
this.intervalChanged = new EventEmitter();
|
|
45
|
+
this.allowLegendToggle$ = new BehaviorSubject(false);
|
|
46
|
+
this.groupedTooltips$ = new BehaviorSubject(true);
|
|
47
|
+
this.markerClicked = new EventEmitter();
|
|
48
|
+
this.maxPoints$ = combineLatest([this.width$, this.input$]).pipe(map(([width, input]) => {
|
|
49
|
+
const innerWidth = width - this.LEFT_RIGHT_OFFSET * input.length;
|
|
50
|
+
const pointWithPadding = (this.POINT_RADIUS + 4) * 2;
|
|
51
|
+
return Math.floor(innerWidth / pointWithPadding);
|
|
52
|
+
}));
|
|
53
|
+
this.xMinorTickLimit$ = combineLatest([
|
|
54
|
+
this.width$,
|
|
55
|
+
this.input$,
|
|
56
|
+
]).pipe(map(([width, input]) => {
|
|
57
|
+
const innerWidth = width - this.LEFT_RIGHT_OFFSET * input.length;
|
|
58
|
+
const minSizePerTick = 40;
|
|
59
|
+
return Math.round(innerWidth / minSizePerTick);
|
|
60
|
+
}));
|
|
61
|
+
this.allowedIntervals$ = combineLatest([
|
|
62
|
+
this.input$,
|
|
63
|
+
this.maxPoints$,
|
|
64
|
+
]).pipe(map(([input, maxPoints]) => {
|
|
65
|
+
const [minDateValue, maxDateValue] = getDateRange(input);
|
|
66
|
+
return intervals.filter(interval => {
|
|
67
|
+
const timeInterval = getTimeInterval(interval);
|
|
68
|
+
const numSteps = timeInterval.range(timeInterval.floor(minDateValue), timeInterval.ceil(utcDay.offset(maxDateValue, 1))).length;
|
|
69
|
+
return numSteps <= maxPoints && numSteps > 1;
|
|
70
|
+
});
|
|
71
|
+
}), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
72
|
+
this.intervalOptions$ = this.allowedIntervals$.pipe(map(intervals => intervals.map((interval) => ({
|
|
73
|
+
id: interval,
|
|
74
|
+
title: getIntervalTitle(interval),
|
|
75
|
+
}))), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
76
|
+
this.selectedIntervalOption$ = combineLatest([
|
|
77
|
+
this.interval$,
|
|
78
|
+
this.intervalOptions$,
|
|
79
|
+
]).pipe(map(([interval, options]) => {
|
|
80
|
+
const allowedIntervals = options.map(({ id }) => id);
|
|
81
|
+
if (!allowedIntervals.includes(interval)) {
|
|
82
|
+
const firstAllowed = allowedIntervals.at(0);
|
|
83
|
+
const lastAllowed = allowedIntervals.at(-1);
|
|
84
|
+
if (!firstAllowed || !lastAllowed)
|
|
85
|
+
return null;
|
|
86
|
+
if (intervals.indexOf(interval) < intervals.indexOf(firstAllowed))
|
|
87
|
+
interval = firstAllowed;
|
|
88
|
+
if (intervals.indexOf(interval) > intervals.indexOf(lastAllowed))
|
|
89
|
+
interval = lastAllowed;
|
|
90
|
+
}
|
|
91
|
+
return options.find(o => o.id === interval) ?? null;
|
|
92
|
+
}), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
93
|
+
this.selectedInterval$ = this.selectedIntervalOption$.pipe(map(option => (option ? option.id : DEFAULT_INTERVAL)));
|
|
94
|
+
this.toggleVisibility$ = new BehaviorSubject(null);
|
|
95
|
+
this.binnedDataWithRanges$ = combineLatest([
|
|
96
|
+
this.input$,
|
|
97
|
+
this.selectedInterval$,
|
|
98
|
+
this.toggleVisibility$,
|
|
99
|
+
]).pipe(map(([input, interval, toggleVisibility]) => {
|
|
100
|
+
const rangeMap = new Map();
|
|
101
|
+
const series = input.map((config) => {
|
|
102
|
+
return {
|
|
103
|
+
...config,
|
|
104
|
+
series: config.series.map((series, i) => {
|
|
105
|
+
const binned = new Map();
|
|
106
|
+
for (const point of series.data) {
|
|
107
|
+
const binKey = getTimeInterval(interval)
|
|
108
|
+
.floor(point.date)
|
|
109
|
+
.valueOf();
|
|
110
|
+
const maxDate = rangeMap.get(binKey);
|
|
111
|
+
if (!maxDate || maxDate < point.date) {
|
|
112
|
+
rangeMap.set(binKey, point.date);
|
|
113
|
+
}
|
|
114
|
+
if (!binned.has(binKey)) {
|
|
115
|
+
binned.set(binKey, []);
|
|
116
|
+
}
|
|
117
|
+
binned.get(binKey).push(point);
|
|
118
|
+
}
|
|
119
|
+
if (this.allowLegendToggle &&
|
|
120
|
+
toggleVisibility &&
|
|
121
|
+
series.label === toggleVisibility.label) {
|
|
122
|
+
series.visibility = toggleVisibility.visibility;
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
...series,
|
|
126
|
+
data: [...binned.entries()].map(([dateValue, points]) => ({
|
|
127
|
+
date: new Date(dateValue),
|
|
128
|
+
value: config.pointReducer(points, i),
|
|
129
|
+
})),
|
|
130
|
+
};
|
|
131
|
+
}),
|
|
132
|
+
};
|
|
133
|
+
});
|
|
134
|
+
return {
|
|
135
|
+
series,
|
|
136
|
+
getRange: (date) => {
|
|
137
|
+
return {
|
|
138
|
+
minDate: date,
|
|
139
|
+
maxDate: rangeMap.get(date.valueOf()),
|
|
140
|
+
};
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
}), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
144
|
+
this.binnedData$ = this.binnedDataWithRanges$.pipe(map(binnedData => binnedData.series));
|
|
145
|
+
this.getRange$ = this.binnedDataWithRanges$.pipe(map(binnedData => binnedData.getRange));
|
|
146
|
+
this.binnedDateRange$ = this.binnedData$.pipe(map(getDateRange), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
147
|
+
this.drawData$ = combineLatest([
|
|
148
|
+
this.binnedData$,
|
|
149
|
+
this.binnedDateRange$,
|
|
150
|
+
this.selectedInterval$,
|
|
151
|
+
this.width$,
|
|
152
|
+
this.xMinorTickLimit$,
|
|
153
|
+
]).pipe(map(([binnedData, binnedDateRange, interval, width, xMinorTickLimit]) => {
|
|
154
|
+
const viewBox = `0 0 ${width} ${this.HEIGHT}`;
|
|
155
|
+
const xScaleRangeStart = this.LEFT_RIGHT_PADDING + this.LEFT_RIGHT_OFFSET;
|
|
156
|
+
const xScaleRangeEnd = width -
|
|
157
|
+
this.LEFT_RIGHT_PADDING * 2 -
|
|
158
|
+
(binnedData.length > 1 ? this.LEFT_RIGHT_OFFSET : 0);
|
|
159
|
+
const xScale = scaleLinear()
|
|
160
|
+
.domain(binnedDateRange)
|
|
161
|
+
.range([xScaleRangeStart, xScaleRangeEnd]);
|
|
162
|
+
const [minDateValue, maxDateValue] = binnedDateRange;
|
|
163
|
+
const hasMultipleYears = minDateValue.getFullYear() < maxDateValue.getFullYear();
|
|
164
|
+
const xMinorIntervalFormat = getMinorIntervalFormat(interval);
|
|
165
|
+
const minorFormatter = utcFormat(xMinorIntervalFormat);
|
|
166
|
+
const xMinorTicks = getTimeInterval(interval)
|
|
167
|
+
.range(minDateValue, utcDay.offset(maxDateValue, 1))
|
|
168
|
+
.map(date => ({
|
|
169
|
+
value: utcDay.offset(date, 0).valueOf(),
|
|
170
|
+
label: minorFormatter(date),
|
|
171
|
+
}))
|
|
172
|
+
.filter((_, i, arr) => arr.length > xMinorTickLimit
|
|
173
|
+
? i % Math.ceil(arr.length / xMinorTickLimit) === 0
|
|
174
|
+
: true);
|
|
175
|
+
const xMajorInterval = getMajorInterval(interval);
|
|
176
|
+
const xMajorIntervalFormat = getMajorIntervalFormat(xMajorInterval, hasMultipleYears);
|
|
177
|
+
const timeInterval = getTimeInterval(xMajorInterval);
|
|
178
|
+
const tickFloor = timeInterval.floor(minDateValue);
|
|
179
|
+
const tickCeiling = timeInterval.ceil(utcDay.offset(maxDateValue, 1));
|
|
180
|
+
const majorFormatter = utcFormat(xMajorIntervalFormat);
|
|
181
|
+
const xMajorTicks = timeInterval
|
|
182
|
+
.range(tickFloor, tickCeiling)
|
|
183
|
+
.map(tickDate => ({
|
|
184
|
+
label: xMajorInterval === interval ? '' : majorFormatter(tickDate),
|
|
185
|
+
value: tickDate.valueOf(),
|
|
186
|
+
}));
|
|
187
|
+
const x = { xMax: maxDateValue, xScale, xMinorTicks, xMajorTicks };
|
|
188
|
+
const [y1, y2] = binnedData.map(config => {
|
|
189
|
+
const visibleSeries = config.series.filter(s => s.visibility !== 'hidden');
|
|
190
|
+
const flattenedValues = visibleSeries.reduce((values, series) => [
|
|
191
|
+
...values,
|
|
192
|
+
...series.data.map(({ value }) => value),
|
|
193
|
+
], []);
|
|
194
|
+
let yMax = config.max ?? Math.max(...flattenedValues, 0);
|
|
195
|
+
const yMin = config.min ?? Math.min(...flattenedValues, 0);
|
|
196
|
+
// RIVET-14605 - if range is [0,0], make it [0,1] instead
|
|
197
|
+
if (yMax == 0 && yMin == 0) {
|
|
198
|
+
yMax = 1;
|
|
199
|
+
}
|
|
200
|
+
const yScale = scaleLinear()
|
|
201
|
+
.domain([yMin, yMax])
|
|
202
|
+
.range([
|
|
203
|
+
this.HEIGHT -
|
|
204
|
+
this.BOTTOM_OFFSET -
|
|
205
|
+
(this.BOTTOM_PADDING + this.TOP_PADDING),
|
|
206
|
+
this.TOP_PADDING,
|
|
207
|
+
]);
|
|
208
|
+
const yTicks = yScale.ticks(this.Y_TICK_COUNT);
|
|
209
|
+
const series = config.series.map(series => ({
|
|
210
|
+
...series,
|
|
211
|
+
path: line()
|
|
212
|
+
.x(d => xScale(d.date))
|
|
213
|
+
.y(d => yScale(d.value))(series.data),
|
|
214
|
+
stroke: `var(${series.colorToken})`,
|
|
215
|
+
markers: series.data.map(point => ({
|
|
216
|
+
...point,
|
|
217
|
+
x: xScale(point.date),
|
|
218
|
+
y: yScale(point.value),
|
|
219
|
+
})),
|
|
220
|
+
}));
|
|
221
|
+
return {
|
|
222
|
+
...config,
|
|
223
|
+
series,
|
|
224
|
+
yMax,
|
|
225
|
+
yMin,
|
|
226
|
+
yScale,
|
|
227
|
+
yTicks,
|
|
228
|
+
};
|
|
229
|
+
});
|
|
230
|
+
// If we have a y2, coerce y1's ticks to be visually equivalent to y2's ticks.
|
|
231
|
+
if (y2?.yTicks) {
|
|
232
|
+
const tickConversionScale = scaleLinear()
|
|
233
|
+
.range(y1.yScale.domain())
|
|
234
|
+
.domain(y2.yScale.domain());
|
|
235
|
+
y1.yTicks = y2.yTicks.map(tickConversionScale);
|
|
236
|
+
}
|
|
237
|
+
return { viewBox, x, y1, y2 };
|
|
238
|
+
}), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
239
|
+
this.legend$ = this.binnedData$.pipe(map(binnedData => binnedData.reduce((items, config) => [
|
|
240
|
+
...items,
|
|
241
|
+
...config.series.map(series => ({
|
|
242
|
+
label: series.label,
|
|
243
|
+
colorToken: series.colorToken,
|
|
244
|
+
visibility: series.visibility ?? 'visible',
|
|
245
|
+
})),
|
|
246
|
+
], [])));
|
|
247
|
+
this.empty$ = this.binnedData$.pipe(map(binnedData => binnedData.every(config => config.series.every(series => series.data.length === 0))), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
248
|
+
this.hoveredMarker$ = new BehaviorSubject(null);
|
|
249
|
+
this.callout$ = combineLatest([
|
|
250
|
+
this.hoveredMarker$,
|
|
251
|
+
this.drawData$,
|
|
252
|
+
this.groupedTooltips$,
|
|
253
|
+
]).pipe(map(([hoveredMarker, drawData, groupedTooltips]) => {
|
|
254
|
+
if (!hoveredMarker)
|
|
255
|
+
return null;
|
|
256
|
+
const { target } = hoveredMarker.event;
|
|
257
|
+
if (!target)
|
|
258
|
+
return null;
|
|
259
|
+
const markerRect = target.getBoundingClientRect();
|
|
260
|
+
const padding = 8;
|
|
261
|
+
const anchor = new DOMRect(markerRect.left - padding, markerRect.top - padding, markerRect.width + padding * 2, markerRect.height + padding * 2);
|
|
262
|
+
const metrics = [];
|
|
263
|
+
for (let index = 0; index < drawData.y1.series.length; index++) {
|
|
264
|
+
const series = drawData.y1.series[index];
|
|
265
|
+
const allowed = !groupedTooltips
|
|
266
|
+
? hoveredMarker.y == 'y1' && hoveredMarker.seriesIndex == index
|
|
267
|
+
: true;
|
|
268
|
+
if (series.visibility !== 'hidden' && allowed) {
|
|
269
|
+
const match = series.markers.find(marker => marker.x === hoveredMarker.marker.x);
|
|
270
|
+
if (match) {
|
|
271
|
+
metrics.push({
|
|
272
|
+
colorToken: series.colorToken,
|
|
273
|
+
label: series.label,
|
|
274
|
+
value: drawData.y1.valueFormatter(match.value),
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
if (drawData.y2) {
|
|
280
|
+
for (let index = 0; index < drawData.y2.series.length; index++) {
|
|
281
|
+
const series = drawData.y2.series[index];
|
|
282
|
+
const allowed = !groupedTooltips
|
|
283
|
+
? hoveredMarker.y == 'y2' && hoveredMarker.seriesIndex == index
|
|
284
|
+
: true;
|
|
285
|
+
if (series.visibility !== 'hidden' && allowed) {
|
|
286
|
+
const match = series.markers.find(marker => marker.x === hoveredMarker.marker.x);
|
|
287
|
+
if (match) {
|
|
288
|
+
metrics.push({
|
|
289
|
+
colorToken: series.colorToken,
|
|
290
|
+
label: series.label,
|
|
291
|
+
value: drawData.y2.valueFormatter(match.value),
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return { anchor, metrics };
|
|
298
|
+
}));
|
|
299
|
+
}
|
|
300
|
+
set input(v) {
|
|
301
|
+
this.input$.next(v);
|
|
302
|
+
}
|
|
303
|
+
get input() {
|
|
304
|
+
return this.input$.getValue();
|
|
305
|
+
}
|
|
306
|
+
set width(v) {
|
|
307
|
+
this.width$.next(v);
|
|
308
|
+
}
|
|
309
|
+
get width() {
|
|
310
|
+
return this.width$.getValue();
|
|
311
|
+
}
|
|
312
|
+
set zeroStateMessage(v) {
|
|
313
|
+
this.zeroStateMessage$.next(v);
|
|
314
|
+
}
|
|
315
|
+
get zeroStateMessage() {
|
|
316
|
+
return this.zeroStateMessage$.getValue();
|
|
317
|
+
}
|
|
318
|
+
set interval(v) {
|
|
319
|
+
if (v !== this.interval$.getValue()) {
|
|
320
|
+
this.interval$.next(v);
|
|
321
|
+
this.intervalChanged.emit(v);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
get interval() {
|
|
325
|
+
return this.interval$.getValue();
|
|
326
|
+
}
|
|
327
|
+
set allowLegendToggle(v) {
|
|
328
|
+
this.allowLegendToggle$.next(v);
|
|
329
|
+
}
|
|
330
|
+
get allowLegendToggle() {
|
|
331
|
+
return this.allowLegendToggle$.getValue();
|
|
332
|
+
}
|
|
333
|
+
set groupedTooltips(v) {
|
|
334
|
+
this.groupedTooltips$.next(v);
|
|
335
|
+
}
|
|
336
|
+
get groupedTooltips() {
|
|
337
|
+
return this.groupedTooltips$.getValue();
|
|
338
|
+
}
|
|
339
|
+
setIntervalOption(option) {
|
|
340
|
+
if (option)
|
|
341
|
+
this.interval = option.id;
|
|
342
|
+
}
|
|
343
|
+
getMarkerClicked(range, seriesIndex, y) {
|
|
344
|
+
return {
|
|
345
|
+
...range,
|
|
346
|
+
seriesIndex,
|
|
347
|
+
y,
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TimeSeriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
351
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TimeSeriesComponent, selector: "riv-time-series", inputs: { input: "input", zeroStateMessage: "zeroStateMessage", interval: "interval", allowLegendToggle: "allowLegendToggle", groupedTooltips: "groupedTooltips" }, outputs: { intervalChanged: "intervalChanged", markerClicked: "markerClicked" }, 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 <g *ngFor=\"let tick of d.x.xMajorTicks\">\n <text\n *ngIf=\"d.x.xScale(tick.value) >= 0\"\n class=\"x-major-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"HEIGHT - BOTTOM_OFFSET\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.x.xMinorTicks\">\n <text\n class=\"x-minor-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"HEIGHT - BOTTOM_OFFSET\"\n text-anchor=\"middle\"\n dominant-baseline=\"hanging\"\n dy=\"8\"\n >\n {{ tick.label }}\n <title>{{ tick.value | date }}</title>\n </text>\n </g>\n <g *ngFor=\"let tick of d.y1.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.y1.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"y-tick-label\" x=\"0\" [attr.y]=\"d.y1.yScale(tick)\" dy=\"-4\">\n {{ d.y1.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngFor=\"let tick of d.y2?.yTicks\">\n <text\n class=\"y-tick-label\"\n [attr.x]=\"width\"\n [attr.y]=\"d.y2?.yScale(tick)\"\n text-anchor=\"end\"\n dy=\"-4\"\n >\n {{ d.y2?.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngIf=\"hoveredMarker$ | async; let hoveredMarker\">\n <line\n class=\"hover-rule\"\n [attr.x1]=\"hoveredMarker.marker.x\"\n [attr.y1]=\"d.y1.yScale(d.y1.yMin)\"\n [attr.x2]=\"hoveredMarker.marker.x\"\n [attr.y2]=\"d.y1.yScale(d.y1.yMax)\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n\n <ng-template #seriesTpl let-series=\"series\" let-index=\"index\" let-y=\"y\">\n <path\n *ngIf=\"series.visibility !== 'hidden'\"\n class=\"data path\"\n [class.marker-hovered]=\"!!(hoveredMarker$ | async)\"\n [attr.d]=\"series.path\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n [attr.stroke-dasharray]=\"series.style === 'dashed' ? '4' : null\"\n ></path>\n <ng-container *ngIf=\"getRange$ | async; let getRange\">\n <ng-container *ngFor=\"let marker of series.markers\">\n <circle\n *ngIf=\"series.visibility !== 'hidden'\"\n class=\"data marker\"\n [class.focused]=\"\n (hoveredMarker$ | async)?.marker?.x === marker.x &&\n (groupedTooltips ||\n ((hoveredMarker$ | async)?.seriesIndex === index &&\n (hoveredMarker$ | async)?.y === y))\n \"\n [class.blurred]=\"\n (hoveredMarker$ | async) !== null &&\n ((hoveredMarker$ | async)?.marker?.x !== marker.x ||\n ((hoveredMarker$ | async)?.marker?.x === marker.x &&\n !groupedTooltips &&\n ((hoveredMarker$ | async)?.seriesIndex !== index ||\n (hoveredMarker$ | async)?.y !== y)))\n \"\n [attr.cx]=\"marker.x\"\n [attr.cy]=\"marker.y\"\n [attr.r]=\"POINT_RADIUS\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n (mouseover)=\"\n hoveredMarker$.next({\n event: $event,\n marker: marker,\n seriesIndex: index,\n y: y\n })\n \"\n (mouseleave)=\"hoveredMarker$.next(null)\"\n (click)=\"\n markerClicked.emit(\n getMarkerClicked(getRange(marker.date), index, y)\n );\n hoveredMarker$.next(null)\n \"\n ></circle>\n </ng-container>\n </ng-container>\n </ng-template>\n <g *ngFor=\"let series of d.y1.series; let i = index\">\n <ng-container\n *ngTemplateOutlet=\"\n seriesTpl;\n context: { series: series, index: i, y: 'y1' }\n \"\n ></ng-container>\n </g>\n <g *ngFor=\"let series of d.y2?.series; let i = index\">\n <ng-container\n *ngTemplateOutlet=\"\n seriesTpl;\n context: { series: series, index: i, y: 'y2' }\n \"\n ></ng-container>\n </g>\n </svg>\n <legend>\n <riv-legend-item\n *ngFor=\"let item of legend$ | async\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n [visibility]=\"item.visibility\"\n [clickable]=\"allowLegendToggle\"\n (itemClick)=\"\n allowLegendToggle\n ? toggleVisibility$.next({\n label: item.label,\n visibility: item.visibility === 'hidden' ? 'visible' : 'hidden'\n })\n : null\n \"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-overlay\n [anchor]=\"callout?.anchor ?? null\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [theme]=\"'light'\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-row\" *ngFor=\"let metric of callout?.metrics\">\n <span class=\"series-label\">\n <riv-legend-item [colorToken]=\"metric.colorToken\"></riv-legend-item>\n <span>{{ metric.label }}</span>\n </span>\n <span>{{ metric.value }}</span>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state [message]=\"zeroStateMessage\"></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: [".container{display:flex;flex-direction:column;gap:var(--size-xlarge)}.y-tick-label,.x-major-tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.x-minor-tick-label{font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);fill:var(--type-light-low-contrast);text-anchor:middle}.tick{fill:var(--gray-20)}.data.path{transition:stroke-opacity var(--short-transition)}.data.path.marker-hovered{stroke-opacity:.4}.data.marker{fill:var(--surface-light-0);transition:stroke-opacity var(--short-transition)}.data.marker.focused{stroke-opacity:1;filter:drop-shadow(0 1px 1px rgba(10,2,22,.15))}.data.marker.blurred{stroke-opacity:.4}.hover-rule{stroke:var(--gray-20)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-row{display:flex;padding:var(--size-medium) 0;gap:var(--size-medium);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-row:not(:last-child){border-bottom:var(--border-width) solid var(--border-light)}.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: i1.DatePipe, name: "date" }, { kind: "pipe", type: i8.OptionGroupPipe, name: "rivOptionGroup" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
352
|
+
}
|
|
353
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TimeSeriesComponent, decorators: [{
|
|
354
|
+
type: Component,
|
|
355
|
+
args: [{ selector: 'riv-time-series', 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 <g *ngFor=\"let tick of d.x.xMajorTicks\">\n <text\n *ngIf=\"d.x.xScale(tick.value) >= 0\"\n class=\"x-major-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"HEIGHT - BOTTOM_OFFSET\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.x.xMinorTicks\">\n <text\n class=\"x-minor-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"HEIGHT - BOTTOM_OFFSET\"\n text-anchor=\"middle\"\n dominant-baseline=\"hanging\"\n dy=\"8\"\n >\n {{ tick.label }}\n <title>{{ tick.value | date }}</title>\n </text>\n </g>\n <g *ngFor=\"let tick of d.y1.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.y1.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"y-tick-label\" x=\"0\" [attr.y]=\"d.y1.yScale(tick)\" dy=\"-4\">\n {{ d.y1.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngFor=\"let tick of d.y2?.yTicks\">\n <text\n class=\"y-tick-label\"\n [attr.x]=\"width\"\n [attr.y]=\"d.y2?.yScale(tick)\"\n text-anchor=\"end\"\n dy=\"-4\"\n >\n {{ d.y2?.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngIf=\"hoveredMarker$ | async; let hoveredMarker\">\n <line\n class=\"hover-rule\"\n [attr.x1]=\"hoveredMarker.marker.x\"\n [attr.y1]=\"d.y1.yScale(d.y1.yMin)\"\n [attr.x2]=\"hoveredMarker.marker.x\"\n [attr.y2]=\"d.y1.yScale(d.y1.yMax)\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n\n <ng-template #seriesTpl let-series=\"series\" let-index=\"index\" let-y=\"y\">\n <path\n *ngIf=\"series.visibility !== 'hidden'\"\n class=\"data path\"\n [class.marker-hovered]=\"!!(hoveredMarker$ | async)\"\n [attr.d]=\"series.path\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n [attr.stroke-dasharray]=\"series.style === 'dashed' ? '4' : null\"\n ></path>\n <ng-container *ngIf=\"getRange$ | async; let getRange\">\n <ng-container *ngFor=\"let marker of series.markers\">\n <circle\n *ngIf=\"series.visibility !== 'hidden'\"\n class=\"data marker\"\n [class.focused]=\"\n (hoveredMarker$ | async)?.marker?.x === marker.x &&\n (groupedTooltips ||\n ((hoveredMarker$ | async)?.seriesIndex === index &&\n (hoveredMarker$ | async)?.y === y))\n \"\n [class.blurred]=\"\n (hoveredMarker$ | async) !== null &&\n ((hoveredMarker$ | async)?.marker?.x !== marker.x ||\n ((hoveredMarker$ | async)?.marker?.x === marker.x &&\n !groupedTooltips &&\n ((hoveredMarker$ | async)?.seriesIndex !== index ||\n (hoveredMarker$ | async)?.y !== y)))\n \"\n [attr.cx]=\"marker.x\"\n [attr.cy]=\"marker.y\"\n [attr.r]=\"POINT_RADIUS\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n (mouseover)=\"\n hoveredMarker$.next({\n event: $event,\n marker: marker,\n seriesIndex: index,\n y: y\n })\n \"\n (mouseleave)=\"hoveredMarker$.next(null)\"\n (click)=\"\n markerClicked.emit(\n getMarkerClicked(getRange(marker.date), index, y)\n );\n hoveredMarker$.next(null)\n \"\n ></circle>\n </ng-container>\n </ng-container>\n </ng-template>\n <g *ngFor=\"let series of d.y1.series; let i = index\">\n <ng-container\n *ngTemplateOutlet=\"\n seriesTpl;\n context: { series: series, index: i, y: 'y1' }\n \"\n ></ng-container>\n </g>\n <g *ngFor=\"let series of d.y2?.series; let i = index\">\n <ng-container\n *ngTemplateOutlet=\"\n seriesTpl;\n context: { series: series, index: i, y: 'y2' }\n \"\n ></ng-container>\n </g>\n </svg>\n <legend>\n <riv-legend-item\n *ngFor=\"let item of legend$ | async\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n [visibility]=\"item.visibility\"\n [clickable]=\"allowLegendToggle\"\n (itemClick)=\"\n allowLegendToggle\n ? toggleVisibility$.next({\n label: item.label,\n visibility: item.visibility === 'hidden' ? 'visible' : 'hidden'\n })\n : null\n \"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-overlay\n [anchor]=\"callout?.anchor ?? null\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [theme]=\"'light'\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-row\" *ngFor=\"let metric of callout?.metrics\">\n <span class=\"series-label\">\n <riv-legend-item [colorToken]=\"metric.colorToken\"></riv-legend-item>\n <span>{{ metric.label }}</span>\n </span>\n <span>{{ metric.value }}</span>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state [message]=\"zeroStateMessage\"></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: [".container{display:flex;flex-direction:column;gap:var(--size-xlarge)}.y-tick-label,.x-major-tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.x-minor-tick-label{font-size:var(--type-2-font-size);line-height:var(--type-2-line-height-0);fill:var(--type-light-low-contrast);text-anchor:middle}.tick{fill:var(--gray-20)}.data.path{transition:stroke-opacity var(--short-transition)}.data.path.marker-hovered{stroke-opacity:.4}.data.marker{fill:var(--surface-light-0);transition:stroke-opacity var(--short-transition)}.data.marker.focused{stroke-opacity:1;filter:drop-shadow(0 1px 1px rgba(10,2,22,.15))}.data.marker.blurred{stroke-opacity:.4}.hover-rule{stroke:var(--gray-20)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-row{display:flex;padding:var(--size-medium) 0;gap:var(--size-medium);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-row:not(:last-child){border-bottom:var(--border-width) solid var(--border-light)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}\n"] }]
|
|
356
|
+
}], propDecorators: { input: [{
|
|
357
|
+
type: Input
|
|
358
|
+
}], zeroStateMessage: [{
|
|
359
|
+
type: Input
|
|
360
|
+
}], interval: [{
|
|
361
|
+
type: Input
|
|
362
|
+
}], intervalChanged: [{
|
|
363
|
+
type: Output
|
|
364
|
+
}], controls: [{
|
|
365
|
+
type: ViewChild,
|
|
366
|
+
args: ['controls']
|
|
367
|
+
}], allowLegendToggle: [{
|
|
368
|
+
type: Input
|
|
369
|
+
}], groupedTooltips: [{
|
|
370
|
+
type: Input
|
|
371
|
+
}], markerClicked: [{
|
|
372
|
+
type: Output
|
|
373
|
+
}] } });
|
|
374
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1zZXJpZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi90aW1lLXNlcmllcy90aW1lLXNlcmllcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3RpbWUtc2VyaWVzL3RpbWUtc2VyaWVzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUVOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUNMLGVBQWUsRUFFZixhQUFhLEVBQ2IsR0FBRyxFQUNILFdBQVcsR0FDWixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM1RCxPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixzQkFBc0IsRUFDdEIsc0JBQXNCLEVBQ3RCLGVBQWUsRUFDZixTQUFTLEdBQ1YsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFvQixZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7OztBQUV2RSxNQUFNLGdCQUFnQixHQUFhLEtBQUssQ0FBQztBQU96Qyw2RUFBNkU7QUFDN0UsK0NBQStDO0FBQy9DLG1HQUFtRztBQU9uRyxNQUFNLE9BQU8s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b3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHNjYWxlTGluZWFyIH0gZnJvbSAnZDMtc2NhbGUnO1xuaW1wb3J0IHsgbGluZSB9IGZyb20gJ2QzLXNoYXBlJztcbmltcG9ydCB7IHV0Y0RheSB9IGZyb20gJ2QzLXRpbWUnO1xuaW1wb3J0IHsgdXRjRm9ybWF0IH0gZnJvbSAnZDMtdGltZS1mb3JtYXQnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBPYnNlcnZhYmxlLFxuICBjb21iaW5lTGF0ZXN0LFxuICBtYXAsXG4gIHNoYXJlUmVwbGF5LFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE51bWJlclBpcGUgfSBmcm9tICcuLi8uLi9mb3JtYXQvcGlwZXMvbnVtYmVyLnBpcGUnO1xuaW1wb3J0IHtcbiAgSW50ZXJ2YWwsXG4gIGdldEludGVydmFsVGl0bGUsXG4gIGdldE1ham9ySW50ZXJ2YWwsXG4gIGdldE1ham9ySW50ZXJ2YWxGb3JtYXQsXG4gIGdldE1pbm9ySW50ZXJ2YWxGb3JtYXQsXG4gIGdldFRpbWVJbnRlcnZhbCxcbiAgaW50ZXJ2YWxzLFxufSBmcm9tICcuLi9pbnRlcnZhbHMnO1xuaW1wb3J0IHsgRHJhd0RhdGEsIE1hcmtlciwgZ2V0RGF0ZVJhbmdlIH0gZnJvbSAnLi90aW1lLXNlcmllcy5oZWxwZXJzJztcblxuY29uc3QgREVGQVVMVF9JTlRFUlZBTDogSW50ZXJ2YWwgPSAnZGF5JztcblxudHlwZSBJbnRlcnZhbE9wdGlvbiA9IHtcbiAgaWQ6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbn07XG5cbi8vIFRPRE86IG9uY2Ugd2UgdXBncmFkZSB0byBBbmd1bGFyIDE2LCB0aGlzIGNvbXBvbmVudCBjYW4gYmUgY2xlYW5lZCB1cCB3aXRoXG4vLyBzaWduYWxzIGluc3RlYWQgb2YgUnhKUy4gU2VlIGNvbW1pdCBlMjM4YzJkLlxuLy8gaHR0cHM6Ly93d3cubm90aW9uLnNvL3JpdmV0L1Jlc29sdmUtVE9ET3MtYWZ0ZXItQW5ndWxhci11cGdyYWRlLTFmMjY2N2ViMmEzMTgwYjc5ZjZhZDkyYTdlNTc2ZjA4XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtdGltZS1zZXJpZXMnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGltZS1zZXJpZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90aW1lLXNlcmllcy5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUaW1lU2VyaWVzQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnB1dCQgPVxuICAgIG5ldyBCZWhhdmlvclN1YmplY3Q8VGltZVNlcmllc0NvbXBvbmVudC5UaW1lU2VyaWVzSW5wdXQ+KFtcbiAgICAgIHtcbiAgICAgICAgcG9pbnRSZWR1Y2VyOiBwb2ludHMgPT5cbiAgICAgICAgICBwb2ludHMucmVkdWNlKCh0b3RhbCwgeyB2YWx1ZSB9KSA9PiB0b3RhbCArIHZhbHVlLCAwKSxcbiAgICAgICAgdmFsdWVGb3JtYXR0ZXI6IHYgPT4gbmV3IE51bWJlclBpcGUoKS50cmFuc2Zvcm0odikgPz8gJycsXG4gICAgICAgIHNlcmllczogW10sXG4gICAgICB9LFxuICAgIF0pO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGlucHV0KHY6IFRpbWVTZXJpZXNDb21wb25lbnQuVGltZVNlcmllc0lucHV0KSB7XG4gICAgdGhpcy5pbnB1dCQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlucHV0KCk6IFRpbWVTZXJpZXNDb21wb25lbnQuVGltZVNlcmllc0lucHV0IHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgd2lkdGgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICBwcm90ZWN0ZWQgc2V0IHdpZHRoKHY6IG51bWJlcikge1xuICAgIHRoaXMud2lkdGgkLm5leHQodik7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCB3aWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy53aWR0aCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHJlYWRvbmx5IEhFSUdIVCA9IDMwMDtcblxuICBwcml2YXRlIHJlYWRvbmx5IHplcm9TdGF0ZU1lc3NhZ2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KFxuICAgICdObyBkYXRhIHRvIGRpc3BsYXkuJyxcbiAgKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCB6ZXJvU3RhdGVNZXNzYWdlKHY6IHN0cmluZykge1xuICAgIHRoaXMuemVyb1N0YXRlTWVzc2FnZSQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IHplcm9TdGF0ZU1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy56ZXJvU3RhdGVNZXNzYWdlJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgcmVhZG9ubHkgQk9UVE9NX09GRlNFVCA9IDI0O1xuICByZWFkb25seSBMRUZUX1JJR0hUX09GRlNFVCA9IDQ4O1xuICByZWFkb25seSBUT1BfUEFERElORyA9IDE2O1xuICByZWFkb25seSBMRUZUX1JJR0hUX1BBRERJTkcgPSA4O1xuICByZWFkb25seSBCT1RUT01fUEFERElORyA9IDg7XG4gIHJlYWRvbmx5IFlfVElDS19DT1VOVCA9IDU7XG4gIHJlYWRvbmx5IFBPSU5UX1JBRElVUyA9IDMuNTtcblxuICByZWFkb25seSBkYXRlUmFuZ2UkID0gdGhpcy5pbnB1dCQucGlwZShcbiAgICBtYXAoZ2V0RGF0ZVJhbmdlKSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJ2YWwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJbnRlcnZhbD4oREVGQVVMVF9JTlRFUlZBTCk7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgaW50ZXJ2YWwodjogSW50ZXJ2YWwpIHtcbiAgICBpZiAodiAhPT0gdGhpcy5pbnRlcnZhbCQuZ2V0VmFsdWUoKSkge1xuICAgICAgdGhpcy5pbnRlcnZhbCQubmV4dCh2KTtcbiAgICAgIHRoaXMuaW50ZXJ2YWxDaGFuZ2VkLmVtaXQodik7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgaW50ZXJ2YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJ2YWwkLmdldFZhbHVlKCk7XG4gIH1cblxuICBAT3V0cHV0KClcbiAgaW50ZXJ2YWxDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxJbnRlcnZhbD4oKTtcblxuICBAVmlld0NoaWxkKCdjb250cm9scycpXG4gIHB1YmxpYyByZWFkb25seSBjb250cm9scz86IFRlbXBsYXRlUmVmPHZvaWQ+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dMZWdlbmRUb2dnbGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgYWxsb3dMZWdlbmRUb2dnbGUodjogYm9vbGVhbikge1xuICAgIHRoaXMuYWxsb3dMZWdlbmRUb2dnbGUkLm5leHQodik7XG4gIH1cbiAgcHVibGljIGdldCBhbGxvd0xlZ2VuZFRvZ2dsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hbGxvd0xlZ2VuZFRvZ2dsZSQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JvdXBlZFRvb2x0aXBzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZ3JvdXBlZFRvb2x0aXBzKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmdyb3VwZWRUb29sdGlwcyQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGdyb3VwZWRUb29sdGlwcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ncm91cGVkVG9vbHRpcHMkLmdldFZhbHVlKCk7XG4gIH1cblxuICBAT3V0cHV0KClcbiAgbWFya2VyQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VGltZVNlcmllc0NvbXBvbmVudC5NYXJrZXJDbGlja2VkPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4UG9pbnRzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMud2lkdGgkLCB0aGlzLmlucHV0JF0pLnBpcGUoXG4gICAgbWFwKChbd2lkdGgsIGlucHV0XSkgPT4ge1xuICAgICAgY29uc3QgaW5uZXJXaWR0aCA9IHdpZHRoIC0gdGhpcy5MRUZUX1JJR0hUX09GRlNFVCAqIGlucHV0Lmxlbmd0aDtcbiAgICAgIGNvbnN0IHBvaW50V2l0aFBhZGRpbmcgPSAodGhpcy5QT0lOVF9SQURJVVMgKyA0KSAqIDI7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihpbm5lcldpZHRoIC8gcG9pbnRXaXRoUGFkZGluZyk7XG4gICAgfSksXG4gICk7XG4gIHByaXZhdGUgcmVhZG9ubHkgeE1pbm9yVGlja0xpbWl0JCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMud2lkdGgkLFxuICAgIHRoaXMuaW5wdXQkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW3dpZHRoLCBpbnB1dF0pID0+IHtcbiAgICAgIGNvbnN0IGlubmVyV2lkdGggPSB3aWR0aCAtIHRoaXMuTEVGVF9SSUdIVF9PRkZTRVQgKiBpbnB1dC5sZW5ndGg7XG4gICAgICBjb25zdCBtaW5TaXplUGVyVGljayA9IDQwO1xuICAgICAgcmV0dXJuIE1hdGgucm91bmQoaW5uZXJXaWR0aCAvIG1pblNpemVQZXJUaWNrKTtcbiAgICB9KSxcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93ZWRJbnRlcnZhbHMkOiBPYnNlcnZhYmxlPEludGVydmFsW10+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5pbnB1dCQsXG4gICAgdGhpcy5tYXhQb2ludHMkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2lucHV0LCBtYXhQb2ludHNdKSA9PiB7XG4gICAgICBjb25zdCBbbWluRGF0ZVZhbHVlLCBtYXhEYXRlVmFsdWVdID0gZ2V0RGF0ZVJhbmdlKGlucHV0KTtcblxuICAgICAgcmV0dXJuIGludGVydmFscy5maWx0ZXIoaW50ZXJ2YWwgPT4ge1xuICAgICAgICBjb25zdCB0aW1lSW50ZXJ2YWwgPSBnZXRUaW1lSW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICBjb25zdCBudW1TdGVwcyA9IHRpbWVJbnRlcnZhbC5yYW5nZShcbiAgICAgICAgICB0aW1lSW50ZXJ2YWwuZmxvb3IobWluRGF0ZVZhbHVlKSxcbiAgICAgICAgICB0aW1lSW50ZXJ2YWwuY2VpbCh1dGNEYXkub2Zmc2V0KG1heERhdGVWYWx1ZSwgMSkpLFxuICAgICAgICApLmxlbmd0aDtcblxuICAgICAgICByZXR1cm4gbnVtU3RlcHMgPD0gbWF4UG9pbnRzICYmIG51bVN0ZXBzID4gMTtcbiAgICAgIH0pO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgaW50ZXJ2YWxPcHRpb25zJCA9IHRoaXMuYWxsb3dlZEludGVydmFscyQucGlwZShcbiAgICBtYXAoaW50ZXJ2YWxzID0+XG4gICAgICBpbnRlcnZhbHMubWFwKFxuICAgICAgICAoaW50ZXJ2YWwpOiBJbnRlcnZhbE9wdGlvbiA9PiAoe1xuICAgICAgICAgIGlkOiBpbnRlcnZhbCxcbiAgICAgICAgICB0aXRsZTogZ2V0SW50ZXJ2YWxUaXRsZShpbnRlcnZhbCksXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRJbnRlcnZhbE9wdGlvbiQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmludGVydmFsJCxcbiAgICB0aGlzLmludGVydmFsT3B0aW9ucyQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaW50ZXJ2YWwsIG9wdGlvbnNdKSA9PiB7XG4gICAgICBjb25zdCBhbGxvd2VkSW50ZXJ2YWxzID0gb3B0aW9ucy5tYXAoKHsgaWQgfSkgPT4gaWQgYXMgSW50ZXJ2YWwpO1xuICAgICAgaWYgKCFhbGxvd2VkSW50ZXJ2YWxzLmluY2x1ZGVzKGludGVydmFsKSkge1xuICAgICAgICBjb25zdCBmaXJzdEFsbG93ZWQgPSBhbGxvd2VkSW50ZXJ2YWxzLmF0KDApO1xuICAgICAgICBjb25zdCBsYXN0QWxsb3dlZCA9IGFsbG93ZWRJbnRlcnZhbHMuYXQoLTEpO1xuICAgICAgICBpZiAoIWZpcnN0QWxsb3dlZCB8fCAhbGFzdEFsbG93ZWQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmIChpbnRlcnZhbHMuaW5kZXhPZihpbnRlcnZhbCkgPCBpbnRlcnZhbHMuaW5kZXhPZihmaXJzdEFsbG93ZWQpKVxuICAgICAgICAgIGludGVydmFsID0gZmlyc3RBbGxvd2VkO1xuICAgICAgICBpZiAoaW50ZXJ2YWxzLmluZGV4T2YoaW50ZXJ2YWwpID4gaW50ZXJ2YWxzLmluZGV4T2YobGFzdEFsbG93ZWQpKVxuICAgICAgICAgIGludGVydmFsID0gbGFzdEFsbG93ZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9ucy5maW5kKG8gPT4gby5pZCA9PT0gaW50ZXJ2YWwpID8/IG51bGw7XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3RlZEludGVydmFsJCA9IHRoaXMuc2VsZWN0ZWRJbnRlcnZhbE9wdGlvbiQucGlwZShcbiAgICBtYXAob3B0aW9uID0+IChvcHRpb24gPyAob3B0aW9uLmlkIGFzIEludGVydmFsKSA6IERFRkFVTFRfSU5URVJWQUwpKSxcbiAgKTtcblxuICBzZXRJbnRlcnZhbE9wdGlvbihvcHRpb246IEludGVydmFsT3B0aW9uIHwgbnVsbCkge1xuICAgIGlmIChvcHRpb24pIHRoaXMuaW50ZXJ2YWwgPSBvcHRpb24uaWQgYXMgSW50ZXJ2YWw7XG4gIH1cblxuICByZWFkb25seSB0b2dnbGVWaXNpYmlsaXR5JCA9XG4gICAgbmV3IEJlaGF2aW9yU3ViamVjdDxUaW1lU2VyaWVzQ29tcG9uZW50LlRvZ2dsZVZpc2liaWxpdHkgfCBudWxsPihudWxsKTtcblxuICByZWFkb25seSBiaW5uZWREYXRhV2l0aFJhbmdlcyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmlucHV0JCxcbiAgICB0aGlzLnNlbGVjdGVkSW50ZXJ2YWwkLFxuICAgIHRoaXMudG9nZ2xlVmlzaWJpbGl0eSQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaW5wdXQsIGludGVydmFsLCB0b2dnbGVWaXNpYmlsaXR5XSkgPT4ge1xuICAgICAgY29uc3QgcmFuZ2VNYXAgPSBuZXcgTWFwPG51bWJlciwgRGF0ZT4oKTtcbiAgICAgIGNvbnN0IHNlcmllcyA9IGlucHV0Lm1hcCgoY29uZmlnKTogVGltZVNlcmllc0NvbXBvbmVudC5ZQ29uZmlnID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgc2VyaWVzOiBjb25maWcuc2VyaWVzLm1hcCgoc2VyaWVzLCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiaW5uZWQgPSBuZXcgTWFwPG51bWJlciwgVGltZVNlcmllc0NvbXBvbmVudC5EYXRhUG9pbnRbXT4oKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2Ygc2VyaWVzLmRhdGEpIHtcbiAgICAgICAgICAgICAgY29uc3QgYmluS2V5ID0gZ2V0VGltZUludGVydmFsKGludGVydmFsKVxuICAgICAgICAgICAgICAgIC5mbG9vcihwb2ludC5kYXRlKVxuICAgICAgICAgICAgICAgIC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgIGNvbnN0IG1heERhdGUgPSByYW5nZU1hcC5nZXQoYmluS2V5KTtcblxuICAgICAgICAgICAgICBpZiAoIW1heERhdGUgfHwgbWF4RGF0ZSA8IHBvaW50LmRhdGUpIHtcbiAgICAgICAgICAgICAgICByYW5nZU1hcC5zZXQoYmluS2V5LCBwb2ludC5kYXRlKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICghYmlubmVkLmhhcyhiaW5LZXkpKSB7XG4gICAgICAgICAgICAgICAgYmlubmVkLnNldChiaW5LZXksIFtdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBiaW5uZWQuZ2V0KGJpbktleSkhLnB1c2gocG9pbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0aGlzLmFsbG93TGVnZW5kVG9nZ2xlICYmXG4gICAgICAgICAgICAgIHRvZ2dsZVZpc2liaWxpdHkgJiZcbiAgICAgICAgICAgICAgc2VyaWVzLmxhYmVsID09PSB0b2dnbGVWaXNpYmlsaXR5LmxhYmVsXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgc2VyaWVzLnZpc2liaWxpdHkgPSB0b2dnbGVWaXNpYmlsaXR5LnZpc2liaWxpdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5zZXJpZXMsXG4gICAgICAgICAgICAgIGRhdGE6IFsuLi5iaW5uZWQuZW50cmllcygpXS5tYXAoKFtkYXRlVmFsdWUsIHBvaW50c10pID0+ICh7XG4gICAgICAgICAgICAgICAgZGF0ZTogbmV3IERhdGUoZGF0ZVZhbHVlKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogY29uZmlnLnBvaW50UmVkdWNlcihwb2ludHMsIGkpLFxuICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXJpZXMsXG4gICAgICAgIGdldFJhbmdlOiAoZGF0ZTogRGF0ZSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtaW5EYXRlOiBkYXRlLFxuICAgICAgICAgICAgbWF4RGF0ZTogcmFuZ2VNYXAuZ2V0KGRhdGUudmFsdWVPZigpKSEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBiaW5uZWREYXRhJCA9IHRoaXMuYmlubmVkRGF0YVdpdGhSYW5nZXMkLnBpcGUoXG4gICAgbWFwKGJpbm5lZERhdGEgPT4gYmlubmVkRGF0YS5zZXJpZXMpLFxuICApO1xuXG4gIHJlYWRvbmx5IGdldFJhbmdlJCA9IHRoaXMuYmlubmVkRGF0YVdpdGhSYW5nZXMkLnBpcGUoXG4gICAgbWFwKGJpbm5lZERhdGEgPT4gYmlubmVkRGF0YS5nZXRSYW5nZSksXG4gICk7XG5cbiAgcmVhZG9ubHkgYmlubmVkRGF0ZVJhbmdlJCA9IHRoaXMuYmlubmVkRGF0YSQucGlwZShcbiAgICBtYXAoZ2V0RGF0ZVJhbmdlKSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIGdldE1hcmtlckNsaWNrZWQoXG4gICAgcmFuZ2U6IHsgbWluRGF0ZTogRGF0ZTsgbWF4RGF0ZTogRGF0ZSB9LFxuICAgIHNlcmllc0luZGV4OiBudW1iZXIsXG4gICAgeTogJ3kxJyB8ICd5MicsXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5yYW5nZSxcbiAgICAgIHNlcmllc0luZGV4LFxuICAgICAgeSxcbiAgICB9O1xuICB9XG5cbiAgcmVhZG9ubHkgZHJhd0RhdGEkOiBPYnNlcnZhYmxlPERyYXdEYXRhPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuYmlubmVkRGF0YSQsXG4gICAgdGhpcy5iaW5uZWREYXRlUmFuZ2UkLFxuICAgIHRoaXMuc2VsZWN0ZWRJbnRlcnZhbCQsXG4gICAgdGhpcy53aWR0aCQsXG4gICAgdGhpcy54TWlub3JUaWNrTGltaXQkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2Jpbm5lZERhdGEsIGJpbm5lZERhdGVSYW5nZSwgaW50ZXJ2YWwsIHdpZHRoLCB4TWlub3JUaWNrTGltaXRdKSA9PiB7XG4gICAgICBjb25zdCB2aWV3Qm94ID0gYDAgMCAke3dpZHRofSAke3RoaXMuSEVJR0hUfWA7XG5cbiAgICAgIGNvbnN0IHhTY2FsZVJhbmdlU3RhcnQgPSB0aGlzLkxFRlRfUklHSFRfUEFERElORyArIHRoaXMuTEVGVF9SSUdIVF9PRkZTRVQ7XG4gICAgICBjb25zdCB4U2NhbGVSYW5nZUVuZCA9XG4gICAgICAgIHdpZHRoIC1cbiAgICAgICAgdGhpcy5MRUZUX1JJR0hUX1BBRERJTkcgKiAyIC1cbiAgICAgICAgKGJpbm5lZERhdGEubGVuZ3RoID4gMSA/IHRoaXMuTEVGVF9SSUdIVF9PRkZTRVQgOiAwKTtcbiAgICAgIGNvbnN0IHhTY2FsZSA9IHNjYWxlTGluZWFyKClcbiAgICAgICAgLmRvbWFpbihiaW5uZWREYXRlUmFuZ2UpXG4gICAgICAgIC5yYW5nZShbeFNjYWxlUmFuZ2VTdGFydCwgeFNjYWxlUmFuZ2VFbmRdKTtcbiAgICAgIGNvbnN0IFttaW5EYXRlVmFsdWUsIG1heERhdGVWYWx1ZV0gPSBiaW5uZWREYXRlUmFuZ2U7XG4gICAgICBjb25zdCBoYXNNdWx0aXBsZVllYXJzID1cbiAgICAgICAgbWluRGF0ZVZhbHVlLmdldEZ1bGxZZWFyKCkgPCBtYXhEYXRlVmFsdWUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIGNvbnN0IHhNaW5vckludGVydmFsRm9ybWF0ID0gZ2V0TWlub3JJbnRlcnZhbEZvcm1hdChpbnRlcnZhbCk7XG4gICAgICBjb25zdCBtaW5vckZvcm1hdHRlciA9IHV0Y0Zvcm1hdCh4TWlub3JJbnRlcnZhbEZvcm1hdCk7XG4gICAgICBjb25zdCB4TWlub3JUaWNrcyA9IGdldFRpbWVJbnRlcnZhbChpbnRlcnZhbClcbiAgICAgICAgLnJhbmdlKG1pbkRhdGVWYWx1ZSwgdXRjRGF5Lm9mZnNldChtYXhEYXRlVmFsdWUsIDEpKVxuICAgICAgICAubWFwKGRhdGUgPT4gKHtcbiAgICAgICAgICB2YWx1ZTogdXRjRGF5Lm9mZnNldChkYXRlLCAwKS52YWx1ZU9mKCksXG4gICAgICAgICAgbGFiZWw6IG1pbm9yRm9ybWF0dGVyKGRhdGUpLFxuICAgICAgICB9KSlcbiAgICAgICAgLmZpbHRlcigoXywgaSwgYXJyKSA9PlxuICAgICAgICAgIGFyci5sZW5ndGggPiB4TWlub3JUaWNrTGltaXRcbiAgICAgICAgICAgID8gaSAlIE1hdGguY2VpbChhcnIubGVuZ3RoIC8geE1pbm9yVGlja0xpbWl0KSA9PT0gMFxuICAgICAgICAgICAgOiB0cnVlLFxuICAgICAgICApO1xuICAgICAgY29uc3QgeE1ham9ySW50ZXJ2YWwgPSBnZXRNYWpvckludGVydmFsKGludGVydmFsKTtcbiAgICAgIGNvbnN0IHhNYWpvckludGVydmFsRm9ybWF0ID0gZ2V0TWFqb3JJbnRlcnZhbEZvcm1hdChcbiAgICAgICAgeE1ham9ySW50ZXJ2YWwsXG4gICAgICAgIGhhc011bHRpcGxlWWVhcnMsXG4gICAgICApO1xuICAgICAgY29uc3QgdGltZUludGVydmFsID0gZ2V0VGltZUludGVydmFsKHhNYWpvckludGVydmFsKTtcbiAgICAgIGNvbnN0IHRpY2tGbG9vciA9IHRpbWVJbnRlcnZhbC5mbG9vcihtaW5EYXRlVmFsdWUpO1xuICAgICAgY29uc3QgdGlja0NlaWxpbmcgPSB0aW1lSW50ZXJ2YWwuY2VpbCh1dGNEYXkub2Zmc2V0KG1heERhdGVWYWx1ZSwgMSkpO1xuICAgICAgY29uc3QgbWFqb3JGb3JtYXR0ZXIgPSB1dGNGb3JtYXQoeE1ham9ySW50ZXJ2YWxGb3JtYXQpO1xuICAgICAgY29uc3QgeE1ham9yVGlja3MgPSB0aW1lSW50ZXJ2YWxcbiAgICAgICAgLnJhbmdlKHRpY2tGbG9vciwgdGlja0NlaWxpbmcpXG4gICAgICAgIC5tYXAodGlja0RhdGUgPT4gKHtcbiAgICAgICAgICBsYWJlbDogeE1ham9ySW50ZXJ2YWwgPT09IGludGVydmFsID8gJycgOiBtYWpvckZvcm1hdHRlcih0aWNrRGF0ZSksXG4gICAgICAgICAgdmFsdWU6IHRpY2tEYXRlLnZhbHVlT2YoKSxcbiAgICAgICAgfSkpO1xuICAgICAgY29uc3QgeCA9IHsgeE1heDogbWF4RGF0ZVZhbHVlLCB4U2NhbGUsIHhNaW5vclRpY2tzLCB4TWFqb3JUaWNrcyB9O1xuXG4gICAgICBjb25zdCBbeTEsIHkyXSA9IGJpbm5lZERhdGEubWFwKGNvbmZpZyA9PiB7XG4gICAgICAgIGNvbnN0IHZpc2libGVTZXJpZXMgPSBjb25maWcuc2VyaWVzLmZpbHRlcihcbiAgICAgICAgICBzID0+IHMudmlzaWJpbGl0eSAhPT0gJ2hpZGRlbicsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGZsYXR0ZW5lZFZhbHVlcyA9IHZpc2libGVTZXJpZXMucmVkdWNlPG51bWJlcltdPihcbiAgICAgICAgICAodmFsdWVzLCBzZXJpZXMpID0+IFtcbiAgICAgICAgICAgIC4uLnZhbHVlcyxcbiAgICAgICAgICAgIC4uLnNlcmllcy5kYXRhLm1hcCgoeyB2YWx1ZSB9KSA9PiB2YWx1ZSksXG4gICAgICAgICAgXSxcbiAgICAgICAgICBbXSxcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IHlNYXggPSBjb25maWcubWF4ID8/IE1hdGgubWF4KC4uLmZsYXR0ZW5lZFZhbHVlcywgMCk7XG4gICAgICAgIGNvbnN0IHlNaW4gPSBjb25maWcubWluID8/IE1hdGgubWluKC4uLmZsYXR0ZW5lZFZhbHVlcywgMCk7XG4gICAgICAgIC8vIFJJVkVULTE0NjA1IC0gaWYgcmFuZ2UgaXMgWzAsMF0sIG1ha2UgaXQgWzAsMV0gaW5zdGVhZFxuICAgICAgICBpZiAoeU1heCA9PSAwICYmIHlNaW4gPT0gMCkge1xuICAgICAgICAgIHlNYXggPSAxO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHlTY2FsZSA9IHNjYWxlTGluZWFyKClcbiAgICAgICAgICAuZG9tYWluKFt5TWluLCB5TWF4XSlcbiAgICAgICAgICAucmFuZ2UoW1xuICAgICAgICAgICAgdGhpcy5IRUlHSFQgLVxuICAgICAgICAgICAgICB0aGlzLkJPVFRPTV9PRkZTRVQgLVxuICAgICAgICAgICAgICAodGhpcy5CT1RUT01fUEFERElORyArIHRoaXMuVE9QX1BBRERJTkcpLFxuICAgICAgICAgICAgdGhpcy5UT1BfUEFERElORyxcbiAgICAgICAgICBdKTtcbiAgICAgICAgY29uc3QgeVRpY2tzID0geVNjYWxlLnRpY2tzKHRoaXMuWV9USUNLX0NPVU5UKTtcbiAgICAgICAgY29uc3Qgc2VyaWVzID0gY29uZmlnLnNlcmllcy5tYXAoc2VyaWVzID0+ICh7XG4gICAgICAgICAgLi4uc2VyaWVzLFxuICAgICAgICAgIHBhdGg6IGxpbmU8VGltZVNlcmllc0NvbXBvbmVudC5EYXRhUG9pbnQ+KClcbiAgICAgICAgICAgIC54KGQgPT4geFNjYWxlKGQuZGF0ZSkpXG4gICAgICAgICAgICAueShkID0+IHlTY2FsZShkLnZhbHVlKSkoc2VyaWVzLmRhdGEpLFxuICAgICAgICAgIHN0cm9rZTogYHZhcigke3Nlcmllcy5jb2xvclRva2VufSlgLFxuICAgICAgICAgIG1hcmtlcnM6IHNlcmllcy5kYXRhLm1hcChwb2ludCA9PiAoe1xuICAgICAgICAgICAgLi4ucG9pbnQsXG4gICAgICAgICAgICB4OiB4U2NhbGUocG9pbnQuZGF0ZSksXG4gICAgICAgICAgICB5OiB5U2NhbGUocG9pbnQudmFsdWUpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICBzZXJpZXMsXG4gICAgICAgICAgeU1heCxcbiAgICAgICAgICB5TWluLFxuICAgICAgICAgIHlTY2FsZSxcbiAgICAgICAgICB5VGlja3MsXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgd2UgaGF2ZSBhIHkyLCBjb2VyY2UgeTEncyB0aWNrcyB0byBiZSB2aXN1YWxseSBlcXVpdmFsZW50IHRvIHkyJ3MgdGlja3MuXG4gICAgICBpZiAoeTI/LnlUaWNrcykge1xuICAgICAgICBjb25zdCB0aWNrQ29udmVyc2lvblNjYWxlID0gc2NhbGVMaW5lYXIoKVxuICAgICAgICAgIC5yYW5nZSh5MS55U2NhbGUuZG9tYWluKCkpXG4gICAgICAgICAgLmRvbWFpbih5Mi55U2NhbGUuZG9tYWluKCkpO1xuICAgICAgICB5MS55VGlja3MgPSB5Mi55VGlja3MubWFwKHRpY2tDb252ZXJzaW9uU2NhbGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyB2aWV3Qm94LCB4LCB5MSwgeTIgfTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IGxlZ2VuZCQgPSB0aGlzLmJpbm5lZERhdGEkLnBpcGUoXG4gICAgbWFwKGJpbm5lZERhdGEgPT5cbiAgICAgIGJpbm5lZERhdGEucmVkdWNlPFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgICBjb2xvclRva2VuOiBzdHJpbmc7XG4gICAgICAgICAgdmlzaWJpbGl0eTogJ3Zpc2libGUnIHwgJ2hpZGRlbic7XG4gICAgICAgIH1bXVxuICAgICAgPihcbiAgICAgICAgKGl0ZW1zLCBjb25maWcpID0+IFtcbiAgICAgICAgICAuLi5pdGVtcyxcbiAgICAgICAgICAuLi5jb25maWcuc2VyaWVzLm1hcChzZXJpZXMgPT4gKHtcbiAgICAgICAgICAgIGxhYmVsOiBzZXJpZXMubGFiZWwsXG4gICAgICAgICAgICBjb2xvclRva2VuOiBzZXJpZXMuY29sb3JUb2tlbixcbiAgICAgICAgICAgIHZpc2liaWxpdHk6IHNlcmllcy52aXNpYmlsaXR5ID8/ICd2aXNpYmxlJyxcbiAgICAgICAgICB9KSksXG4gICAgICAgIF0sXG4gICAgICAgIFtdLFxuICAgICAgKSxcbiAgICApLFxuICApO1xuXG4gIHJlYWRvbmx5IGVtcHR5JCA9IHRoaXMuYmlubmVkRGF0YSQucGlwZShcbiAgICBtYXAoYmlubmVkRGF0YSA9PlxuICAgICAgYmlubmVkRGF0YS5ldmVyeShjb25maWcgPT5cbiAgICAgICAgY29uZmlnLnNlcmllcy5ldmVyeShzZXJpZXMgPT4gc2VyaWVzLmRhdGEubGVuZ3RoID09PSAwKSxcbiAgICAgICksXG4gICAgKSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IGhvdmVyZWRNYXJrZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQ7XG4gICAgbWFya2VyOiBNYXJrZXI7XG4gICAgc2VyaWVzSW5kZXg6IG51bWJlcjtcbiAgICB5OiAneTEnIHwgJ3kyJztcbiAgfSB8IG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IGNhbGxvdXQkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5ob3ZlcmVkTWFya2VyJCxcbiAgICB0aGlzLmRyYXdEYXRhJCxcbiAgICB0aGlzLmdyb3VwZWRUb29sdGlwcyQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaG92ZXJlZE1hcmtlciwgZHJhd0RhdGEsIGdyb3VwZWRUb29sdGlwc10pID0+IHtcbiAgICAgIGlmICghaG92ZXJlZE1hcmtlcikgcmV0dXJuIG51bGw7XG5cbiAgICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBob3ZlcmVkTWFya2VyLmV2ZW50O1xuICAgICAgaWYgKCF0YXJnZXQpIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgbWFya2VyUmVjdCA9ICg8U1ZHQ2lyY2xlRWxlbWVudD50YXJnZXQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgcGFkZGluZyA9IDg7XG4gICAgICBjb25zdCBhbmNob3IgPSBuZXcgRE9NUmVjdChcbiAgICAgICAgbWFya2VyUmVjdC5sZWZ0IC0gcGFkZGluZyxcbiAgICAgICAgbWFya2VyUmVjdC50b3AgLSBwYWRkaW5nLFxuICAgICAgICBtYXJrZXJSZWN0LndpZHRoICsgcGFkZGluZyAqIDIsXG4gICAgICAgIG1hcmtlclJlY3QuaGVpZ2h0ICsgcGFkZGluZyAqIDIsXG4gICAgICApO1xuXG4gICAgICB0eXBlIE1ldHJpYyA9IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgY29sb3JUb2tlbjogc3RyaW5nIH07XG4gICAgICBjb25zdCBtZXRyaWNzOiBNZXRyaWNbXSA9IFtdO1xuXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZHJhd0RhdGEueTEuc2VyaWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBjb25zdCBzZXJpZXMgPSBkcmF3RGF0YS55MS5zZXJpZXNbaW5kZXhdO1xuICAgICAgICBjb25zdCBhbGxvd2VkID0gIWdyb3VwZWRUb29sdGlwc1xuICAgICAgICAgID8gaG92ZXJlZE1hcmtlci55ID09ICd5MScgJiYgaG92ZXJlZE1hcmtlci5zZXJpZXNJbmRleCA9PSBpbmRleFxuICAgICAgICAgIDogdHJ1ZTtcbiAgICAgICAgaWYgKHNlcmllcy52aXNpYmlsaXR5ICE9PSAnaGlkZGVuJyAmJiBhbGxvd2VkKSB7XG4gICAgICAgICAgY29uc3QgbWF0Y2ggPSBzZXJpZXMubWFya2Vycy5maW5kKFxuICAgICAgICAgICAgbWFya2VyID0+IG1hcmtlci54ID09PSBob3ZlcmVkTWFya2VyLm1hcmtlci54LFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBtZXRyaWNzLnB1c2goe1xuICAgICAgICAgICAgICBjb2xvclRva2VuOiBzZXJpZXMuY29sb3JUb2tlbixcbiAgICAgICAgICAgICAgbGFiZWw6IHNlcmllcy5sYWJlbCxcbiAgICAgICAgICAgICAgdmFsdWU6IGRyYXdEYXRhLnkxLnZhbHVlRm9ybWF0dGVyKG1hdGNoLnZhbHVlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZHJhd0RhdGEueTIpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGRyYXdEYXRhLnkyLnNlcmllcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBjb25zdCBzZXJpZXMgPSBkcmF3RGF0YS55Mi5zZXJpZXNbaW5kZXhdO1xuICAgICAgICAgIGNvbnN0IGFsbG93ZWQgPSAhZ3JvdXBlZFRvb2x0aXBzXG4gICAgICAgICAgICA/IGhvdmVyZWRNYXJrZXIueSA9PSAneTInICYmIGhvdmVyZWRNYXJrZXIuc2VyaWVzSW5kZXggPT0gaW5kZXhcbiAgICAgICAgICAgIDogdHJ1ZTtcbiAgICAgICAgICBpZiAoc2VyaWVzLnZpc2liaWxpdHkgIT09ICdoaWRkZW4nICYmIGFsbG93ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gc2VyaWVzLm1hcmtlcnMuZmluZChcbiAgICAgICAgICAgICAgbWFya2VyID0+IG1hcmtlci54ID09PSBob3ZlcmVkTWFya2VyLm1hcmtlci54LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICBtZXRyaWNzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvbG9yVG9rZW46IHNlcmllcy5jb2xvclRva2VuLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBzZXJpZXMubGFiZWwsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGRyYXdEYXRhLnkyLnZhbHVlRm9ybWF0dGVyKG1hdGNoLnZhbHVlKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGFuY2hvciwgbWV0cmljcyB9O1xuICAgIH0pLFxuICApO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFRpbWVTZXJpZXNDb21wb25lbnQge1xuICBleHBvcnQgdHlwZSBTZXJpZXMgPSB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBjb2xvclRva2VuOiBzdHJpbmc7XG4gICAgZGF0YTogVGltZVNlcmllc0NvbXBvbmVudC5EYXRhUG9pbnRbXTtcbiAgICBzdHlsZT86ICdzb2xpZCcgfCAnZGFzaGVkJztcbiAgICB2aXNpYmlsaXR5PzogJ3Zpc2libGUnIHwgJ2hpZGRlbic7XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgRGF0YVBvaW50ID0ge1xuICAgIHZhbHVlOiBudW1iZXI7XG4gICAgZGF0ZTogRGF0ZTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBZQ29uZmlnID0ge1xuICAgIHBvaW50UmVkdWNlcjogKHBvaW50czogRGF0YVBvaW50W10sIHNlcmllc0luZGV4OiBudW1iZXIpID0+IG51bWJlcjtcbiAgICB2YWx1ZUZvcm1hdHRlcjogKHJlZHVjZWRWYWx1ZTogbnVtYmVyKSA9PiBzdHJpbmc7XG4gICAgc2VyaWVzOiBTZXJpZXNbXTtcbiAgICBtaW4/OiBudW1iZXI7XG4gICAgbWF4PzogbnVtYmVyO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFRpbWVTZXJpZXNJbnB1dCA9IFtZQ29uZmlnXSB8IFtZQ29uZmlnLCBZQ29uZmlnXTtcblxuICBleHBvcnQgdHlwZSBUb2dnbGVWaXNpYmlsaXR5ID0ge1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgdmlzaWJpbGl0eTogJ2hpZGRlbicgfCAndmlzaWJsZSc7XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgTWFya2VyQ2xpY2tlZCA9IHtcbiAgICBtaW5EYXRlOiBEYXRlO1xuICAgIG1heERhdGU6IERhdGU7XG4gICAgc2VyaWVzSW5kZXg6IG51bWJlcjtcbiAgICB5OiAneTEnIHwgJ3kyJztcbiAgfTtcbn1cbiIsIjxkaXZcbiAgKm5nSWY9XCIoZW1wdHkkIHwgYXN5bmMpID09PSBmYWxzZTsgZWxzZSB6ZXJvU3RhdGVcIlxuICBjbGFzcz1cImNvbnRhaW5lclwiXG4gIChyaXZDbGllbnRTaXplKT1cIndpZHRoID0gJGV2ZW50LndpZHRoXCJcbj5cbiAgPHN2Z1xuICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICpuZ0lmPVwiZHJhd0RhdGEkIHwgYXN5bmM7IGxldCBkXCJcbiAgICBbYXR0ci52aWV3Qm94XT1cImQudmlld0JveFwiXG4gID5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkLngueE1ham9yVGlja3NcIj5cbiAgICAgIDx0ZXh0XG4gICAgICAgICpuZ0lmPVwiZC54LnhTY2FsZSh0aWNrLnZhbHVlKSA+PSAwXCJcbiAgICAgICAgY2xhc3M9XCJ4LW1ham9yLXRpY2stbGFiZWxcIlxuICAgICAgICBbYXR0ci54XT1cImQueC54U2NhbGUodGljay52YWx1ZSlcIlxuICAgICAgICBbYXR0ci55XT1cIkhFSUdIVCAtIEJPVFRPTV9PRkZTRVRcIlxuICAgICAgICBkeD1cIjRcIlxuICAgICAgICBkeT1cIi00XCJcbiAgICAgID5cbiAgICAgICAge3sgdGljay5sYWJlbCB9fVxuICAgICAgPC90ZXh0PlxuICAgIDwvZz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkLngueE1pbm9yVGlja3NcIj5cbiAgICAgIDx0ZXh0XG4gICAgICAgIGNsYXNzPVwieC1taW5vci10aWNrLWxhYmVsXCJcbiAgICAgICAgW2F0dHIueF09XCJkLngueFNjYWxlKHRpY2sudmFsdWUpXCJcbiAgICAgICAgW2F0dHIueV09XCJIRUlHSFQgLSBCT1RUT01fT0ZGU0VUXCJcbiAgICAgICAgdGV4dC1hbmNob3I9XCJtaWRkbGVcIlxuICAgICAgICBkb21pbmFudC1iYXNlbGluZT1cImhhbmdpbmdcIlxuICAgICAgICBkeT1cIjhcIlxuICAgICAgPlxuICAgICAgICB7eyB0aWNrLmxhYmVsIH19XG4gICAgICAgIDx0aXRsZT57eyB0aWNrLnZhbHVlIHwgZGF0ZSB9fTwvdGl0bGU+XG4gICAgICA8L3RleHQ+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGQueTEueVRpY2tzXCI+XG4gICAgICA8cmVjdFxuICAgICAgICBjbGFzcz1cInRpY2tcIlxuICAgICAgICB4PVwiMFwiXG4gICAgICAgIFthdHRyLnldPVwiZC55MS55U2NhbGUodGljaylcIlxuICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICBoZWlnaHQ9XCIxXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8dGV4dCBjbGFzcz1cInktdGljay1sYWJlbFwiIHg9XCIwXCIgW2F0dHIueV09XCJkLnkxLnlTY2FsZSh0aWNrKVwiIGR5PVwiLTRcIj5cbiAgICAgICAge3sgZC55MS52YWx1ZUZvcm1hdHRlcih0aWNrKSB9fVxuICAgICAgPC90ZXh0PlxuICAgIDwvZz5cblxuICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGQueTI/LnlUaWNrc1wiPlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJ5LXRpY2stbGFiZWxcIlxuICAgICAgICBbYXR0ci54XT1cIndpZHRoXCJcbiAgICAgICAgW2F0dHIueV09XCJkLnkyPy55U2NhbGUodGljaylcIlxuICAgICAgICB0ZXh0LWFuY2hvcj1cImVuZFwiXG4gICAgICAgIGR5PVwiLTRcIlxuICAgICAgPlxuICAgICAgICB7eyBkLnkyPy52YWx1ZUZvcm1hdHRlcih0aWNrKSB9fVxuICAgICAgPC90ZXh0PlxuICAgIDwvZz5cblxuICAgIDxnICpuZ0lmPVwiaG92ZXJlZE1hcmtlciQgfCBhc3luYzsgbGV0IGhvdmVyZWRNYXJrZXJcIj5cbiAgICAgIDxsaW5lXG4gICAgICAgIGNsYXNzPVwiaG92ZXItcnVsZVwiXG4gICAgICAgIFthdHRyLngxXT1cImhvdmVyZWRNYXJrZXIubWFya2VyLnhcIlxuICAgICAgICBbYXR0ci55MV09XCJkLnkxLnlTY2FsZShkLnkxLnlNaW4pXCJcbiAgICAgICAgW2F0dHIueDJdPVwiaG92ZXJlZE1hcmtlci5tYXJrZXIueFwiXG4gICAgICAgIFthdHRyLnkyXT1cImQueTEueVNjYWxlKGQueTEueU1heClcIlxuICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheT1cIjRcIlxuICAgICAgLz5cbiAgICA8L2c+XG5cbiAgICA8bmctdGVtcGxhdGUgI3Nlcmllc1RwbCBsZXQtc2VyaWVzPVwic2VyaWVzXCIgbGV0LWluZGV4PVwiaW5kZXhcIiBsZXQteT1cInlcIj5cbiAgICAgIDxwYXRoXG4gICAgICAgICpuZ0lmPVwic2VyaWVzLnZpc2liaWxpdHkgIT09ICdoaWRkZW4nXCJcbiAgICAgICAgY2xhc3M9XCJkYXRhIHBhdGhcIlxuICAgICAgICBbY2xhc3MubWFya2VyLWhvdmVyZWRdPVwiISEoaG92ZXJlZE1hcmtlciQgfCBhc3luYylcIlxuICAgICAgICBbYXR0ci5kXT1cInNlcmllcy5wYXRoXCJcbiAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNlcmllcy5zdHJva2VcIlxuICAgICAgICBbYXR0ci5zdHJva2UtZGFzaGFycmF5XT1cInNlcmllcy5zdHlsZSA9PT0gJ2Rhc2hlZCcgPyAnNCcgOiBudWxsXCJcbiAgICAgID48L3BhdGg+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0UmFuZ2UkIHwgYXN5bmM7IGxldCBnZXRSYW5nZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBtYXJrZXIgb2Ygc2VyaWVzLm1hcmtlcnNcIj5cbiAgICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgICAqbmdJZj1cInNlcmllcy52aXNpYmlsaXR5ICE9PSAnaGlkZGVuJ1wiXG4gICAgICAgICAgICBjbGFzcz1cImRhdGEgbWFya2VyXCJcbiAgICAgICAgICAgIFtjbGFzcy5mb2N1c2VkXT1cIlxuICAgICAgICAgICAgICAoaG92ZXJlZE1hcmtlciQgfCBhc3luYyk/Lm1hcmtlcj8ueCA9PT0gbWFya2VyLnggJiZcbiAgICAgICAgICAgICAgKGdyb3VwZWRUb29sdGlwcyB8fFxuICAgICAgICAgICAgICAgICgoaG92ZXJlZE1hcmtlciQgfCBhc3luYyk/LnNlcmllc0luZGV4ID09PSBpbmRleCAmJlxuICAgICAgICAgICAgICAgICAgKGhvdmVyZWRNYXJrZXIkIHwgYXN5bmMpPy55ID09PSB5KSlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbY2xhc3MuYmx1cnJlZF09XCJcbiAgICAgICAgICAgICAgKGhvdmVyZWRNYXJrZXIkIHwgYXN5bmMpICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICgoaG92ZXJlZE1hcmtlciQgfCBhc3luYyk/Lm1hcmtlcj8ueCAhPT0gbWFya2VyLnggfHxcbiAgICAgICAgICAgICAgICAoKGhvdmVyZWRNYXJrZXIkIHwgYXN5bmMpPy5tYXJrZXI/LnggPT09IG1hcmtlci54ICYmXG4gICAgICAgICAgICAgICAgICAhZ3JvdXBlZFRvb2x0aXBzICYmXG4gICAgICAgICAgICAgICAgICAoKGhvdmVyZWRNYXJrZXIkIHwgYXN5bmMpPy5zZXJpZXNJbmRleCAhPT0gaW5kZXggfHxcbiAgICAgICAgICAgICAgICAgICAgKGhvdmVyZWRNYXJrZXIkIHwgYXN5bmMpPy55ICE9PSB5KSkpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2F0dHIuY3hdPVwibWFya2VyLnhcIlxuICAgICAgICAgICAgW2F0dHIuY3ldPVwibWFya2VyLnlcIlxuICAgICAgICAgICAgW2F0dHIucl09XCJQT0lOVF9SQURJVVNcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwic2VyaWVzLnN0cm9rZVwiXG4gICAgICAgICAgICAobW91c2VvdmVyKT1cIlxuICAgICAgICAgICAgICBob3ZlcmVkTWFya2VyJC5uZXh0KHtcbiAgICAgICAgICAgICAgICBldmVudDogJGV2ZW50LFxuICAgICAgICAgICAgICAgIG1hcmtlcjogbWFya2VyLFxuICAgICAgICAgICAgICAgIHNlcmllc0luZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgICB5OiB5XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXJlZE1hcmtlciQubmV4dChudWxsKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgIG1hcmtlckNsaWNrZWQuZW1pdChcbiAgICAgICAgICAgICAgICBnZXRNYXJrZXJDbGlja2VkKGdldFJhbmdlKG1hcmtlci5kYXRlKSwgaW5kZXgsIHkpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGhvdmVyZWRNYXJrZXIkLm5leHQobnVsbClcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPjwvY2lyY2xlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPGcgKm5nRm9yPVwibGV0IHNlcmllcyBvZiBkLnkxLnNlcmllczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgIHNlcmllc1RwbDtcbiAgICAgICAgICBjb250ZXh0OiB7IHNlcmllczogc2VyaWVzLCBpbmRleDogaSwgeTogJ3kxJyB9XG4gICAgICAgIFwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCBzZXJpZXMgb2YgZC55Mj8uc2VyaWVzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgc2VyaWVzVHBsO1xuICAgICAgICAgIGNvbnRleHQ6IHsgc2VyaWVzOiBzZXJpZXMsIGluZGV4OiBpLCB5OiAneTInIH1cbiAgICAgICAgXCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L2c+XG4gIDwvc3ZnPlxuICA8bGVnZW5kPlxuICAgIDxyaXYtbGVnZW5kLWl0ZW1cbiAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGxlZ2VuZCQgfCBhc3luY1wiXG4gICAgICBbbGFiZWxdPVwiaXRlbS5sYWJlbFwiXG4gICAgICBbY29sb3JUb2tlbl09XCJpdGVtLmNvbG9yVG9rZW5cIlxuICAgICAgW3Zpc2liaWxpdHldPVwiaXRlbS52aXNpYmlsaXR5XCJcbiAgICAgIFtjbGlja2FibGVdPVwiYWxsb3dMZWdlbmRUb2dnbGVcIlxuICAgICAgKGl0ZW1DbGljayk9XCJcbiAgICAgICAgYWxsb3dMZWdlbmRUb2dnbGVcbiAgICAgICAgICA/IHRvZ2dsZVZpc2liaWxpdHkkLm5leHQoe1xuICAgICAgICAgICAgICBsYWJlbDogaXRlbS5sYWJlbCxcbiAgICAgICAgICAgICAgdmlzaWJpbGl0eTogaXRlbS52aXNpYmlsaXR5ID09PSAnaGlkZGVuJyA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogbnVsbFxuICAgICAgXCJcbiAgICA+PC9yaXYtbGVnZW5kLWl0ZW0+XG4gIDwvbGVnZW5kPlxuPC9kaXY+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJjYWxsb3V0JCB8IGFzeW5jOyBsZXQgY2FsbG91dFwiPlxuICA8cml2LWNhbGxvdXRcbiAgICAqcml2LW92ZXJsYXlcbiAgICBbYW5jaG9yXT1cImNhbGxvdXQ/LmFuY2hvciA/PyBudWxsXCJcbiAgICBbaXNNb2RhbF09XCJmYWxzZVwiXG4gICAgW3ByZWZlcnJlZFBvc2l0aW9uXT1cIidjZW50ZXItcmlnaHQnXCJcbiAgICBbdGhlbWVdPVwiJ2xpZ2h0J1wiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1jb250ZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1yb3dcIiAqbmdGb3I9XCJsZXQgbWV0cmljIG9mIGNhbGxvdXQ/Lm1ldHJpY3NcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXJpZXMtbGFiZWxcIj5cbiAgICAgICAgICA8cml2LWxlZ2VuZC1pdGVtIFtjb2xvclRva2VuXT1cIm1ldHJpYy5jb2xvclRva2VuXCI+PC9yaXYtbGVnZW5kLWl0ZW0+XG4gICAgICAgICAgPHNwYW4+e3sgbWV0cmljLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuPnt7IG1ldHJpYy52YWx1ZSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L3Jpdi1jYWxsb3V0PlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjemVyb1N0YXRlPlxuICA8cml2LXplcm8tc3RhdGUgW21lc3NhZ2VdPVwiemVyb1N0YXRlTWVzc2FnZVwiPjwvcml2LXplcm8tc3RhdGU+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NvbnRyb2xzPlxuICA8cml2LXNpbXBsZS1zZWxlY3RcbiAgICBbb3B0aW9uR3JvdXBzXT1cImludGVydmFsT3B0aW9ucyQgfCBhc3luYyB8IHJpdk9wdGlvbkdyb3VwXCJcbiAgICBbb3JkZXJCeV09XCInc291cmNlJ1wiXG4gICAgW3NlbGVjdGVkT3B0aW9uXT1cInNlbGVjdGVkSW50ZXJ2YWxPcHRpb24kIHwgYXN5bmNcIlxuICAgIChzZWxlY3RlZE9wdGlvbkNoYW5nZSk9XCJzZXRJbnRlcnZhbE9wdGlvbigkZXZlbnQpXCJcbiAgPjwvcml2LXNpbXBsZS1zZWxlY3Q+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function getDateRange(configs) {
|
|
2
|
+
let min = Infinity;
|
|
3
|
+
let max = -Infinity;
|
|
4
|
+
for (const config of configs) {
|
|
5
|
+
for (const series of config.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
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1zZXJpZXMuaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Jpdi9zcmMvbGliL3Zpc3VhbGl6YXRpb24vdGltZS1zZXJpZXMvdGltZS1zZXJpZXMuaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUErQkEsTUFBTSxVQUFVLFlBQVksQ0FDMUIsT0FBc0M7SUFFdEMsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDO0lBQ25CLElBQUksR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ3BCLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7UUFDN0IsS0FBSyxNQUFNLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkMsS0FBSyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzdCLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDM0IsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzdCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTY2FsZUxpbmVhciB9IGZyb20gJ2QzLXNjYWxlJztcbmltcG9ydCB7IFRpbWVTZXJpZXNDb21wb25lbnQgfSBmcm9tICcuL3RpbWUtc2VyaWVzLmNvbXBvbmVudCc7XG5cbnR5cGUgWFRpY2sgPSB7IHZhbHVlOiBudW1iZXI7IGxhYmVsOiBzdHJpbmcgfTtcblxuZXhwb3J0IHR5cGUgTWFya2VyID0gVGltZVNlcmllc0NvbXBvbmVudC5EYXRhUG9pbnQgJiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG5cbnR5cGUgWURyYXdEYXRhID0gVGltZVNlcmllc0NvbXBvbmVudC5ZQ29uZmlnICYge1xuICBzZXJpZXM6IChUaW1lU2VyaWVzQ29tcG9uZW50LlNlcmllcyAmIHtcbiAgICBwYXRoOiBzdHJpbmcgfCBudWxsO1xuICAgIHN0cm9rZTogc3RyaW5nO1xuICAgIG1hcmtlcnM6IE1hcmtlcltdO1xuICB9KVtdO1xuICB5TWF4OiBudW1iZXI7XG4gIHlNaW46IG51bWJlcjtcbiAgeVNjYWxlOiBTY2FsZUxpbmVhcjxudW1iZXIsIG51bWJlciwgbmV2ZXI+O1xuICB5VGlja3M6IG51bWJlcltdO1xufTtcblxuZXhwb3J0IHR5cGUgRHJhd0RhdGEgPSB7XG4gIHZpZXdCb3g6IHN0cmluZztcbiAgeDoge1xuICAgIHhTY2FsZTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPjtcbiAgICB4TWlub3JUaWNrczogWFRpY2tbXTtcbiAgICB4TWFqb3JUaWNrczogWFRpY2tbXTtcbiAgICB4TWF4OiBEYXRlO1xuICB9O1xuICB5MTogWURyYXdEYXRhO1xuICB5Mj86IFlEcmF3RGF0YTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRlUmFuZ2UoXG4gIGNvbmZpZ3M6IFRpbWVTZXJpZXNDb21wb25lbnQuWUNvbmZpZ1tdLFxuKTogW0RhdGUsIERhdGVdIHtcbiAgbGV0IG1pbiA9IEluZmluaXR5O1xuICBsZXQgbWF4ID0gLUluZmluaXR5O1xuICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBjb25maWdzKSB7XG4gICAgZm9yIChjb25zdCBzZXJpZXMgb2YgY29uZmlnLnNlcmllcykge1xuICAgICAgZm9yIChjb25zdCB7IGRhdGUgfSBvZiBzZXJpZXMuZGF0YSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGUudmFsdWVPZigpO1xuICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIHZhbHVlKTtcbiAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbbmV3IERhdGUobWluKSwgbmV3IERhdGUobWF4KV07XG59XG4iXX0=
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../../icon/icon.component";
|
|
4
|
+
export class TrendComponent {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.label = '';
|
|
7
|
+
this.value = 0;
|
|
8
|
+
this.successCondition = 'positive';
|
|
9
|
+
}
|
|
10
|
+
getClasses() {
|
|
11
|
+
const conditionalClass = this.value === 0
|
|
12
|
+
? ''
|
|
13
|
+
: this.successCondition === 'positive'
|
|
14
|
+
? this.value > 0
|
|
15
|
+
? 'success'
|
|
16
|
+
: 'danger'
|
|
17
|
+
: this.value < 0
|
|
18
|
+
? 'success'
|
|
19
|
+
: 'danger';
|
|
20
|
+
return 'trend ' + conditionalClass;
|
|
21
|
+
}
|
|
22
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TrendComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TrendComponent, selector: "riv-trend", inputs: { label: "label", value: "value", successCondition: "successCondition" }, ngImport: i0, template: "<span [class]=\"getClasses()\">\n <riv-icon\n class=\"icon\"\n [name]=\"\n value === 0 ? 'ArrowRight' : value > 0 ? 'TrendingUp' : 'TrendingDown'\n \"\n [size]=\"16\"\n ></riv-icon>\n <span>{{ label }}</span>\n</span>\n", styles: [".success{color:var(--baja-blast-90)}.danger{color:var(--fyre-50)}.trend{display:flex;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-1);font-weight:var(--font-weight-normal)}.icon{margin-right:var(--size-small)}\n"], dependencies: [{ kind: "component", type: i1.IconComponent, selector: "riv-icon", inputs: ["name", "fillColor", "size", "customSize", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
24
|
+
}
|
|
25
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TrendComponent, decorators: [{
|
|
26
|
+
type: Component,
|
|
27
|
+
args: [{ selector: 'riv-trend', changeDetection: ChangeDetectionStrategy.OnPush, template: "<span [class]=\"getClasses()\">\n <riv-icon\n class=\"icon\"\n [name]=\"\n value === 0 ? 'ArrowRight' : value > 0 ? 'TrendingUp' : 'TrendingDown'\n \"\n [size]=\"16\"\n ></riv-icon>\n <span>{{ label }}</span>\n</span>\n", styles: [".success{color:var(--baja-blast-90)}.danger{color:var(--fyre-50)}.trend{display:flex;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-1);font-weight:var(--font-weight-normal)}.icon{margin-right:var(--size-small)}\n"] }]
|
|
28
|
+
}], propDecorators: { label: [{
|
|
29
|
+
type: Input
|
|
30
|
+
}], value: [{
|
|
31
|
+
type: Input
|
|
32
|
+
}], successCondition: [{
|
|
33
|
+
type: Input
|
|
34
|
+
}] } });
|
|
35
|
+
(function (TrendComponent) {
|
|
36
|
+
function calculateTrend(currentValue, previousValue) {
|
|
37
|
+
if (currentValue == null || previousValue == null || previousValue === 0) {
|
|
38
|
+
return 0;
|
|
39
|
+
}
|
|
40
|
+
return currentValue / previousValue - 1;
|
|
41
|
+
}
|
|
42
|
+
TrendComponent.calculateTrend = calculateTrend;
|
|
43
|
+
function calculatePercentageTrend(currentValue, previousValue) {
|
|
44
|
+
if (currentValue == null || previousValue == null) {
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
return currentValue - previousValue;
|
|
48
|
+
}
|
|
49
|
+
TrendComponent.calculatePercentageTrend = calculatePercentageTrend;
|
|
50
|
+
})(TrendComponent || (TrendComponent = {}));
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlbmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi90cmVuZC90cmVuZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3RyZW5kL3RyZW5kLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFRMUUsTUFBTSxPQUFPLGNBQWM7SUFOM0I7UUFRRSxVQUFLLEdBQVcsRUFBRSxDQUFDO1FBR25CLFVBQUssR0FBVyxDQUFDLENBQUM7UUFHbEIscUJBQWdCLEdBQTRCLFVBQVUsQ0FBQztLQWdCeEQ7SUFkQyxVQUFVO1FBQ1IsTUFBTSxnQkFBZ0IsR0FDcEIsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDO1lBQ2QsQ0FBQyxDQUFDLEVBQUU7WUFDSixDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixLQUFLLFVBQVU7Z0JBQ3RDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUM7b0JBQ2QsQ0FBQyxDQUFDLFNBQVM7b0JBQ1gsQ0FBQyxDQUFDLFFBQVE7Z0JBQ1osQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQztvQkFDaEIsQ0FBQyxDQUFDLFNBQVM7b0JBQ1gsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUVmLE9BQU8sUUFBUSxHQUFHLGdCQUFnQixDQUFDO0lBQ3JDLENBQUM7K0dBdkJVLGNBQWM7bUdBQWQsY0FBYyxtSUNSM0IsaVBBVUE7OzRGREZhLGNBQWM7a0JBTjFCLFNBQVM7K0JBQ0UsV0FBVyxtQkFHSix1QkFBdUIsQ0FBQyxNQUFNOzhCQUkvQyxLQUFLO3NCQURKLEtBQUs7Z0JBSU4sS0FBSztzQkFESixLQUFLO2dCQUlOLGdCQUFnQjtzQkFEZixLQUFLOztBQW1CUixXQUFpQixjQUFjO0lBQzdCLFNBQWdCLGNBQWMsQ0FDNUIsWUFBdUMsRUFDdkMsYUFBd0M7UUFFeEMsSUFBSSxZQUFZLElBQUksSUFBSSxJQUFJLGFBQWEsSUFBSSxJQUFJLElBQUksYUFBYSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pFLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUNELE9BQU8sWUFBWSxHQUFHLGFBQWEsR0FBRyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQVJlLDZCQUFjLGlCQVE3QixDQUFBO0lBRUQsU0FBZ0Isd0JBQXdCLENBQ3RDLFlBQXVDLEVBQ3ZDLGFBQXdDO1FBRXhDLElBQUksWUFBWSxJQUFJLElBQUksSUFBSSxhQUFhLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbEQsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO1FBQ0QsT0FBTyxZQUFZLEdBQUcsYUFBYSxDQUFDO0lBQ3RDLENBQUM7SUFSZSx1Q0FBd0IsMkJBUXZDLENBQUE7QUFDSCxDQUFDLEVBcEJnQixjQUFjLEtBQWQsY0FBYyxRQW9COUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtdHJlbmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vdHJlbmQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90cmVuZC5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUcmVuZENvbXBvbmVudCB7XG4gIEBJbnB1dCgpXG4gIGxhYmVsOiBzdHJpbmcgPSAnJztcblxuICBASW5wdXQoKVxuICB2YWx1ZTogbnVtYmVyID0gMDtcblxuICBASW5wdXQoKVxuICBzdWNjZXNzQ29uZGl0aW9uOiAncG9zaXRpdmUnIHwgJ25lZ2F0aXZlJyA9ICdwb3NpdGl2ZSc7XG5cbiAgZ2V0Q2xhc3NlcygpIHtcbiAgICBjb25zdCBjb25kaXRpb25hbENsYXNzID1cbiAgICAgIHRoaXMudmFsdWUgPT09IDBcbiAgICAgICAgPyAnJ1xuICAgICAgICA6IHRoaXMuc3VjY2Vzc0NvbmRpdGlvbiA9PT0gJ3Bvc2l0aXZlJ1xuICAgICAgICA/IHRoaXMudmFsdWUgPiAwXG4gICAgICAgICAgPyAnc3VjY2VzcydcbiAgICAgICAgICA6ICdkYW5nZXInXG4gICAgICAgIDogdGhpcy52YWx1ZSA8IDBcbiAgICAgICAgPyAnc3VjY2VzcydcbiAgICAgICAgOiAnZGFuZ2VyJztcblxuICAgIHJldHVybiAndHJlbmQgJyArIGNvbmRpdGlvbmFsQ2xhc3M7XG4gIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBUcmVuZENvbXBvbmVudCB7XG4gIGV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVUcmVuZChcbiAgICBjdXJyZW50VmFsdWU6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgcHJldmlvdXNWYWx1ZTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgKTogbnVtYmVyIHtcbiAgICBpZiAoY3VycmVudFZhbHVlID09IG51bGwgfHwgcHJldmlvdXNWYWx1ZSA9PSBudWxsIHx8IHByZXZpb3VzVmFsdWUgPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudFZhbHVlIC8gcHJldmlvdXNWYWx1ZSAtIDE7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlUGVyY2VudGFnZVRyZW5kKFxuICAgIGN1cnJlbnRWYWx1ZTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICBwcmV2aW91c1ZhbHVlOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLFxuICApOiBudW1iZXIge1xuICAgIGlmIChjdXJyZW50VmFsdWUgPT0gbnVsbCB8fCBwcmV2aW91c1ZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudFZhbHVlIC0gcHJldmlvdXNWYWx1ZTtcbiAgfVxufVxuIiwiPHNwYW4gW2NsYXNzXT1cImdldENsYXNzZXMoKVwiPlxuICA8cml2LWljb25cbiAgICBjbGFzcz1cImljb25cIlxuICAgIFtuYW1lXT1cIlxuICAgICAgdmFsdWUgPT09IDAgPyAnQXJyb3dSaWdodCcgOiB2YWx1ZSA+IDAgPyAnVHJlbmRpbmdVcCcgOiAnVHJlbmRpbmdEb3duJ1xuICAgIFwiXG4gICAgW3NpemVdPVwiMTZcIlxuICA+PC9yaXYtaWNvbj5cbiAgPHNwYW4+e3sgbGFiZWwgfX08L3NwYW4+XG48L3NwYW4+XG4iXX0=
|