@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
|
@@ -1,882 +0,0 @@
|
|
|
1
|
-
import Fuse from 'fuse.js';
|
|
2
|
-
import { defaultsDeep, flattenDeep, isNumber, sortBy } from 'lodash';
|
|
3
|
-
import { connectable, map, merge, ReplaySubject, scan, startWith, Subject, } from 'rxjs';
|
|
4
|
-
import { NumberPipe } from '../../format/pipes/number.pipe';
|
|
5
|
-
export var RivSelect;
|
|
6
|
-
(function (RivSelect) {
|
|
7
|
-
/////////////
|
|
8
|
-
// Options //
|
|
9
|
-
/////////////
|
|
10
|
-
/**
|
|
11
|
-
* The OptionSet class provides Set-like functionality, but uniqueness is
|
|
12
|
-
* determined by the option's ID rather than the object reference.
|
|
13
|
-
*/
|
|
14
|
-
class OptionSet extends Set {
|
|
15
|
-
constructor(values) {
|
|
16
|
-
super();
|
|
17
|
-
// Parallel id → option map so has()/add()/delete() are O(1) instead of
|
|
18
|
-
// spreading the Set and linear-scanning it. Rebuilding an O(N²) lookup
|
|
19
|
-
// for a 16k-option selection was the primary cause of the multi-minute
|
|
20
|
-
// freeze that surfaced RVT-25383's tree-select scale problem.
|
|
21
|
-
this.byId = new Map();
|
|
22
|
-
if (values) {
|
|
23
|
-
for (const value of values) {
|
|
24
|
-
this.add(value);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
has(option) {
|
|
29
|
-
return this.byId.has(option.id);
|
|
30
|
-
}
|
|
31
|
-
add(option) {
|
|
32
|
-
const existing = this.byId.get(option.id);
|
|
33
|
-
if (existing === option) {
|
|
34
|
-
// Same object reference — nothing to update. Ancestor re-adds
|
|
35
|
-
// during a selection snapshot hit this path repeatedly, so keeping
|
|
36
|
-
// it O(1) is what prevents the tree-select N² blow-up seen in
|
|
37
|
-
// RVT-25470.
|
|
38
|
-
return this;
|
|
39
|
-
}
|
|
40
|
-
if (existing !== undefined) {
|
|
41
|
-
// Different reference, same id — swap the stored ref while
|
|
42
|
-
// preserving Set insertion order. The rebuild is O(N), but this
|
|
43
|
-
// path is rare in practice (the hot ancestor-snapshot loop takes
|
|
44
|
-
// the identity fast-path above).
|
|
45
|
-
const items = [...this].map(o => (o.id === option.id ? option : o));
|
|
46
|
-
this.byId.set(option.id, option);
|
|
47
|
-
super.clear();
|
|
48
|
-
for (const item of items)
|
|
49
|
-
super.add(item);
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
this.byId.set(option.id, option);
|
|
53
|
-
super.add(option);
|
|
54
|
-
}
|
|
55
|
-
return this;
|
|
56
|
-
}
|
|
57
|
-
delete(option) {
|
|
58
|
-
const existing = this.byId.get(option.id);
|
|
59
|
-
if (existing) {
|
|
60
|
-
this.byId.delete(option.id);
|
|
61
|
-
super.delete(existing);
|
|
62
|
-
return true;
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
return false;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
clear() {
|
|
69
|
-
this.byId.clear();
|
|
70
|
-
super.clear();
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
RivSelect.OptionSet = OptionSet;
|
|
74
|
-
const MIN_OPTIONS_FOR_CONTROLS = 5;
|
|
75
|
-
const DEFAULT_DISPLAY_LIMIT = 100;
|
|
76
|
-
function createManager(source, options) {
|
|
77
|
-
const defaultState = {
|
|
78
|
-
query: {
|
|
79
|
-
search: '',
|
|
80
|
-
order: 'title',
|
|
81
|
-
},
|
|
82
|
-
load: {
|
|
83
|
-
loading: false,
|
|
84
|
-
error: null,
|
|
85
|
-
},
|
|
86
|
-
sourceOptionGroups: [],
|
|
87
|
-
originalOptionGroups: [],
|
|
88
|
-
selection: {
|
|
89
|
-
selected: new OptionSet(),
|
|
90
|
-
},
|
|
91
|
-
display: {
|
|
92
|
-
placeholder: 'Select',
|
|
93
|
-
open: false,
|
|
94
|
-
expandedOptions: new Set(),
|
|
95
|
-
},
|
|
96
|
-
};
|
|
97
|
-
const defaultedInitialState = defaultsDeep({}, options?.initialState, defaultState);
|
|
98
|
-
const actions = new Subject();
|
|
99
|
-
const internalActions = new Subject();
|
|
100
|
-
const coreStateWithSelectionSnapshot = merge(actions, internalActions).pipe(scan(([state, snapshot], action) => {
|
|
101
|
-
const newState = sideEffects(reduce(state, action, options), action, source, internalActions);
|
|
102
|
-
const newSelectionSnapshot = (action.type === 'openChange' && action.open) ||
|
|
103
|
-
(action.type === 'loadComplete' &&
|
|
104
|
-
(newState.display.open || options?.inline))
|
|
105
|
-
? createSelectionSnapshotWithAncestors(newState)
|
|
106
|
-
: snapshot;
|
|
107
|
-
return [newState, newSelectionSnapshot];
|
|
108
|
-
}, [defaultedInitialState, new OptionSet()]), startWith([
|
|
109
|
-
defaultedInitialState,
|
|
110
|
-
new OptionSet(),
|
|
111
|
-
]));
|
|
112
|
-
const state = connectable(coreStateWithSelectionSnapshot.pipe(map(([s, selectionAtOpen]) => {
|
|
113
|
-
const allOptionGroups = s.sourceOptionGroups.map(optionGroup => {
|
|
114
|
-
return {
|
|
115
|
-
...optionGroup,
|
|
116
|
-
options: optionGroup.options.map(option => augmentOptionToFullOption(s, option, options)),
|
|
117
|
-
};
|
|
118
|
-
});
|
|
119
|
-
const topLevelOptions = getTopLevelOptions(allOptionGroups);
|
|
120
|
-
const sortedOptionGroups = options?.sortSelectedToTop ?? options?.allowMultiSelect
|
|
121
|
-
? sortOptionsByPreviouslySelectedState(allOptionGroups, selectionAtOpen)
|
|
122
|
-
: allOptionGroups;
|
|
123
|
-
const displayLimit = options?.displayLimit ?? DEFAULT_DISPLAY_LIMIT;
|
|
124
|
-
const displayLimitedOptionGroups = applyDisplayLimit(sortedOptionGroups, displayLimit);
|
|
125
|
-
const fullOptionGroups = applySelectedOptionLimit(s, displayLimitedOptionGroups, topLevelOptions, options);
|
|
126
|
-
return {
|
|
127
|
-
...s,
|
|
128
|
-
query: {
|
|
129
|
-
...s.query,
|
|
130
|
-
showSearch: !!s.query.search ||
|
|
131
|
-
(!!options?.allowSearch &&
|
|
132
|
-
countAllOptions(allOptionGroups) >
|
|
133
|
-
MIN_OPTIONS_FOR_CONTROLS) ||
|
|
134
|
-
countAllOptions(allOptionGroups) > displayLimit,
|
|
135
|
-
searchPlaceholder: options?.searchPlaceholder ?? 'Search',
|
|
136
|
-
showOrder: !!options?.allowOrder &&
|
|
137
|
-
!s.query.search &&
|
|
138
|
-
countAllOptions(allOptionGroups) > MIN_OPTIONS_FOR_CONTROLS,
|
|
139
|
-
},
|
|
140
|
-
fullOptionGroups,
|
|
141
|
-
selection: {
|
|
142
|
-
...s.selection,
|
|
143
|
-
allowMultiSelect: !!options?.allowMultiSelect,
|
|
144
|
-
allowSelectAll: !!options?.allowSelectAll &&
|
|
145
|
-
options?.selectedOptionLimit == undefined,
|
|
146
|
-
visibleSelectionState: getParentMultiSelectionState(topLevelOptions),
|
|
147
|
-
},
|
|
148
|
-
display: {
|
|
149
|
-
...s.display,
|
|
150
|
-
formattedSelectedOptions: getFormattedOptionsForDisplay(s, topLevelOptions, options),
|
|
151
|
-
zeroStateMessage: getZeroStateMessage(s),
|
|
152
|
-
dividers: !!options?.dividers,
|
|
153
|
-
inline: !!options?.inline,
|
|
154
|
-
maxHeight: options?.maxHeight ?? null,
|
|
155
|
-
maxWidth: options?.maxWidth ?? null,
|
|
156
|
-
minHeight: options?.minHeight ?? null,
|
|
157
|
-
minWidth: options?.minWidth ?? null,
|
|
158
|
-
displayLimitMessage: getDisplayLimitMessage(countVisibleOptions(fullOptionGroups, !!s.query.search), countVisibleOptions(allOptionGroups, !!s.query.search), s.query),
|
|
159
|
-
showSingleSelected: !!options?.showSingleSelected,
|
|
160
|
-
pillCount: getPillCountForDisplay(s, topLevelOptions, options),
|
|
161
|
-
},
|
|
162
|
-
};
|
|
163
|
-
})), {
|
|
164
|
-
connector: () => new ReplaySubject(1),
|
|
165
|
-
resetOnDisconnect: false,
|
|
166
|
-
});
|
|
167
|
-
state.connect();
|
|
168
|
-
// Load the options immediately for selects that are displayed inline.
|
|
169
|
-
if (options?.inline)
|
|
170
|
-
actions.next({ type: 'load' });
|
|
171
|
-
return { actions, state };
|
|
172
|
-
}
|
|
173
|
-
RivSelect.createManager = createManager;
|
|
174
|
-
function createInMemoryManager(fetchDataset, options) {
|
|
175
|
-
let data;
|
|
176
|
-
let fuse;
|
|
177
|
-
let exactMatch = false;
|
|
178
|
-
let parents;
|
|
179
|
-
let children;
|
|
180
|
-
const source = async (query, mostRecentAction) => {
|
|
181
|
-
/*
|
|
182
|
-
Re-fetch the options on the load action, and rebuild the state
|
|
183
|
-
derived from the option data.
|
|
184
|
-
*/
|
|
185
|
-
if (mostRecentAction.type === 'load' ||
|
|
186
|
-
mostRecentAction.type === 'openChange') {
|
|
187
|
-
data = await fetchDataset();
|
|
188
|
-
const topLevelOptions = getTopLevelOptions(data);
|
|
189
|
-
fuse = new Fuse(flattenOptions(topLevelOptions, false), {
|
|
190
|
-
threshold: 0.2,
|
|
191
|
-
keys: ['title'],
|
|
192
|
-
includeScore: true,
|
|
193
|
-
includeMatches: true,
|
|
194
|
-
...options?.fuseOptions,
|
|
195
|
-
});
|
|
196
|
-
exactMatch = options?.fuseOptions?.threshold == 0;
|
|
197
|
-
[parents, children] = getRelationshipMaps(topLevelOptions);
|
|
198
|
-
}
|
|
199
|
-
// Leading/trailing whitespace shouldn't affect fuzzy matching (Fuse
|
|
200
|
-
// scores the pattern's length against the text's, so a stray space
|
|
201
|
-
// changes results in surprising ways); a search string of only
|
|
202
|
-
// whitespace is treated the same as no search.
|
|
203
|
-
const search = query.search.trim();
|
|
204
|
-
/*
|
|
205
|
-
If the user is not searching options, return the full set of options
|
|
206
|
-
sorted appropriately.
|
|
207
|
-
*/
|
|
208
|
-
if (!search) {
|
|
209
|
-
/*
|
|
210
|
-
The `source` order property allows for opting out of automatic
|
|
211
|
-
sorting, returning the data in its natural input order.
|
|
212
|
-
*/
|
|
213
|
-
if (query.order === 'source')
|
|
214
|
-
return data;
|
|
215
|
-
/*
|
|
216
|
-
Sort the options by title and subtitle.
|
|
217
|
-
*/
|
|
218
|
-
if (query.order === 'title') {
|
|
219
|
-
function sortByTitle(options) {
|
|
220
|
-
return sortBy(options, [
|
|
221
|
-
(o) => o.title.toLowerCase(),
|
|
222
|
-
(o) => o.subtitle?.toLowerCase() ?? '',
|
|
223
|
-
]).map(option => ({
|
|
224
|
-
...option,
|
|
225
|
-
children: option.children?.length
|
|
226
|
-
? sortByTitle(option.children)
|
|
227
|
-
: undefined,
|
|
228
|
-
}));
|
|
229
|
-
}
|
|
230
|
-
return data.map(group => ({
|
|
231
|
-
...group,
|
|
232
|
-
options: sortByTitle(group.options),
|
|
233
|
-
}));
|
|
234
|
-
}
|
|
235
|
-
/*
|
|
236
|
-
Sort the options by count, then by title, then by subtitle.
|
|
237
|
-
*/
|
|
238
|
-
if (query.order === 'count') {
|
|
239
|
-
function sortByCount(options) {
|
|
240
|
-
return sortBy(options, [
|
|
241
|
-
(o) => (isNumber(o.count) ? -o.count : Infinity),
|
|
242
|
-
(o) => o.title.toLowerCase(),
|
|
243
|
-
(o) => o.subtitle?.toLowerCase() ?? '',
|
|
244
|
-
]).map(option => ({
|
|
245
|
-
...option,
|
|
246
|
-
children: option.children?.length
|
|
247
|
-
? sortByCount(option.children)
|
|
248
|
-
: undefined,
|
|
249
|
-
}));
|
|
250
|
-
}
|
|
251
|
-
return data.map(group => ({
|
|
252
|
-
...group,
|
|
253
|
-
options: sortByCount(group.options),
|
|
254
|
-
}));
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
/*
|
|
258
|
-
Execute the search with fuse. Once we have the search match data,
|
|
259
|
-
rebuild just as much of the tree as is needed to render the search
|
|
260
|
-
results. Specifically, any match will need all of its ancestors (so
|
|
261
|
-
that matched leaf nodes are shown nested under their ancestors) and all
|
|
262
|
-
of its children (because a matching parent means that all of its
|
|
263
|
-
descendants match too, per the design specification), whether they
|
|
264
|
-
themselves matched or not.
|
|
265
|
-
*/
|
|
266
|
-
const matchedOptions = fuse.search(search);
|
|
267
|
-
const matchedIds = new Set(matchedOptions.map(result => result.item.id));
|
|
268
|
-
const matchAncestors = new Set();
|
|
269
|
-
function collectAncestors(ids) {
|
|
270
|
-
for (const id of ids) {
|
|
271
|
-
const parentId = parents.get(id);
|
|
272
|
-
if (parentId) {
|
|
273
|
-
matchAncestors.add(parentId);
|
|
274
|
-
collectAncestors([parentId]);
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
collectAncestors([...matchedIds]);
|
|
279
|
-
const matchDescendants = new Set();
|
|
280
|
-
function collectDescendants(ids) {
|
|
281
|
-
for (const id of ids) {
|
|
282
|
-
const childrenIds = children.get(id);
|
|
283
|
-
if (childrenIds) {
|
|
284
|
-
for (const child of childrenIds) {
|
|
285
|
-
matchDescendants.add(child);
|
|
286
|
-
}
|
|
287
|
-
collectDescendants(childrenIds);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
collectDescendants([...matchedIds]);
|
|
292
|
-
/*
|
|
293
|
-
Next, we'll combine all the matched IDs with their direct ancestors and
|
|
294
|
-
descandants, and filter the original data set down to just these
|
|
295
|
-
options.
|
|
296
|
-
*/
|
|
297
|
-
const filteredIds = new Set([
|
|
298
|
-
...matchedIds,
|
|
299
|
-
...matchAncestors,
|
|
300
|
-
...matchDescendants,
|
|
301
|
-
]);
|
|
302
|
-
function filterOptions(options) {
|
|
303
|
-
const filteredOptions = [];
|
|
304
|
-
for (const option of options) {
|
|
305
|
-
if (filteredIds.has(option.id)) {
|
|
306
|
-
filteredOptions.push({
|
|
307
|
-
...option,
|
|
308
|
-
children: option.children?.length
|
|
309
|
-
? filterOptions(option.children)
|
|
310
|
-
: undefined,
|
|
311
|
-
});
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
return filteredOptions;
|
|
315
|
-
}
|
|
316
|
-
const filteredOptions = filterOptions(getTopLevelOptions(data));
|
|
317
|
-
/*
|
|
318
|
-
At this point, we have an array of distinct trees (top-level options),
|
|
319
|
-
filtered down to only the options matching the search query. Note that
|
|
320
|
-
we don't care about section headers when searching since results should
|
|
321
|
-
be ordered by relevance. To calculate the order of these trees, we'll
|
|
322
|
-
take the total match scores for options found in the tree, divided by
|
|
323
|
-
the count of matches in the tree (the best average match score).
|
|
324
|
-
*/
|
|
325
|
-
const scoreMap = new Map(matchedOptions.map(result => [result.item.id, result.score ?? 0]));
|
|
326
|
-
const ordered = sortBy(filteredOptions, (option) => {
|
|
327
|
-
function calculateScore(option) {
|
|
328
|
-
return ((scoreMap.get(option.id) ?? 0) +
|
|
329
|
-
(option.children ?? []).reduce((score, child) => score + calculateScore(child), 0));
|
|
330
|
-
}
|
|
331
|
-
function calculateCount(option) {
|
|
332
|
-
return (1 +
|
|
333
|
-
(option.children ?? []).reduce((count, child) => count + calculateCount(child), 0));
|
|
334
|
-
}
|
|
335
|
-
const totalScore = calculateScore(option);
|
|
336
|
-
const totalCount = calculateCount(option);
|
|
337
|
-
return totalScore / totalCount;
|
|
338
|
-
});
|
|
339
|
-
const highlightMap = new Map(matchedOptions.map(result => {
|
|
340
|
-
const highlights = {};
|
|
341
|
-
for (const match of result.matches ?? []) {
|
|
342
|
-
// filter out inexact matches
|
|
343
|
-
if (exactMatch && match.value != null) {
|
|
344
|
-
match.indices = match.indices.filter(isFuseMatchExact(match, search));
|
|
345
|
-
}
|
|
346
|
-
if (match.key === 'title') {
|
|
347
|
-
highlights.titleHighlightIndices = [...match.indices];
|
|
348
|
-
}
|
|
349
|
-
if (match.key === 'subtitle') {
|
|
350
|
-
highlights.subtitleHighlightIndices = [...match.indices];
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
return [result.item.id, highlights];
|
|
354
|
-
}));
|
|
355
|
-
function addHighlightsToOption(options) {
|
|
356
|
-
return options.map(option => ({
|
|
357
|
-
...option,
|
|
358
|
-
...highlightMap.get(option.id),
|
|
359
|
-
...(option.children?.length
|
|
360
|
-
? { children: addHighlightsToOption(option.children) }
|
|
361
|
-
: null),
|
|
362
|
-
}));
|
|
363
|
-
}
|
|
364
|
-
return {
|
|
365
|
-
data: [{ options: addHighlightsToOption(ordered) }],
|
|
366
|
-
originalData: data,
|
|
367
|
-
};
|
|
368
|
-
};
|
|
369
|
-
return createManager(source, options);
|
|
370
|
-
}
|
|
371
|
-
RivSelect.createInMemoryManager = createInMemoryManager;
|
|
372
|
-
function isFuseMatchExact(match, search) {
|
|
373
|
-
return matchedIndices => {
|
|
374
|
-
const matchedValue = match
|
|
375
|
-
.value.slice(matchedIndices[0], matchedIndices[1] + 1)
|
|
376
|
-
.toLowerCase();
|
|
377
|
-
// fuse is weird with it's matches. For a text of "planning" and a search string of "plan"
|
|
378
|
-
// the matched value will be "plann" with the extra 'n' because of its fuzzy matching.
|
|
379
|
-
// so just make sure the matched value at least starts with the search string.
|
|
380
|
-
// it's extra weird because for a text of "analytics" and a search string of "nalytics",
|
|
381
|
-
// the matched value will be "analytics". So we just need to make sure the the matched value
|
|
382
|
-
// includes the search string because there might be extra stuff on the front or the end.
|
|
383
|
-
return matchedValue.includes(search.toLowerCase());
|
|
384
|
-
};
|
|
385
|
-
}
|
|
386
|
-
RivSelect.isFuseMatchExact = isFuseMatchExact;
|
|
387
|
-
//////////////////////////////////
|
|
388
|
-
// State reducer (with helpers) //
|
|
389
|
-
//////////////////////////////////
|
|
390
|
-
function createSelectionSnapshotWithAncestors(state) {
|
|
391
|
-
const snapshot = new OptionSet(state.selection.selected);
|
|
392
|
-
const topLevelOptions = getTopLevelOptions(state.sourceOptionGroups);
|
|
393
|
-
const [parents] = getRelationshipMaps(topLevelOptions);
|
|
394
|
-
// Sibling leaves share ancestors, so once we've walked up through a
|
|
395
|
-
// given parent id we can stop — anything above it has already been
|
|
396
|
-
// added by a previous iteration. Without this short-circuit the loop
|
|
397
|
-
// re-runs findOption (which is a full tree walk) once per shared
|
|
398
|
-
// ancestor edge, which was the #2 hotspot behind OptionSet.add in
|
|
399
|
-
// RVT-25470's profile.
|
|
400
|
-
const visited = new Set();
|
|
401
|
-
for (const selectedOption of state.selection.selected) {
|
|
402
|
-
let parentId = parents.get(selectedOption.id);
|
|
403
|
-
while (parentId !== undefined && !visited.has(parentId)) {
|
|
404
|
-
visited.add(parentId);
|
|
405
|
-
const parentOption = findOption(topLevelOptions, parentId);
|
|
406
|
-
if (parentOption) {
|
|
407
|
-
snapshot.add(parentOption);
|
|
408
|
-
}
|
|
409
|
-
parentId = parents.get(parentId);
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
return snapshot;
|
|
413
|
-
}
|
|
414
|
-
function getDisplayLimitMessage(displayedOptionCount, totalOptionCount, query) {
|
|
415
|
-
if (displayedOptionCount === totalOptionCount)
|
|
416
|
-
return null;
|
|
417
|
-
const rivNumber = new NumberPipe();
|
|
418
|
-
const displayed = rivNumber.transform(displayedOptionCount);
|
|
419
|
-
const total = rivNumber.transform(totalOptionCount);
|
|
420
|
-
const start = `Showing ${displayed} of ${total} options`;
|
|
421
|
-
return query.search ? `${start} matching "${query.search}"` : start;
|
|
422
|
-
}
|
|
423
|
-
function countVisibleOptions(optionGroups, leafOnly) {
|
|
424
|
-
function count(options) {
|
|
425
|
-
return options.reduce((acc, option) => {
|
|
426
|
-
if (option.expanded && option.children?.length) {
|
|
427
|
-
return acc + (leafOnly ? 0 : 1) + count(option.children);
|
|
428
|
-
}
|
|
429
|
-
return acc + 1;
|
|
430
|
-
}, 0);
|
|
431
|
-
}
|
|
432
|
-
return optionGroups.reduce((total, group) => total + count(group.options), 0);
|
|
433
|
-
}
|
|
434
|
-
function countAllOptions(optionGroups) {
|
|
435
|
-
function count(options) {
|
|
436
|
-
return options.reduce((acc, option) => {
|
|
437
|
-
if (option.children?.length) {
|
|
438
|
-
return acc + 1 + count(option.children);
|
|
439
|
-
}
|
|
440
|
-
return acc + 1;
|
|
441
|
-
}, 0);
|
|
442
|
-
}
|
|
443
|
-
return optionGroups.reduce((total, group) => total + count(group.options), 0);
|
|
444
|
-
}
|
|
445
|
-
function applyDisplayLimit(optionGroups, displayLimit) {
|
|
446
|
-
function filterWithLimit(options, remaining) {
|
|
447
|
-
let left = remaining;
|
|
448
|
-
const visibleOptions = [];
|
|
449
|
-
for (const option of options) {
|
|
450
|
-
if (left <= 0)
|
|
451
|
-
break;
|
|
452
|
-
if (option.expanded && option.children?.length) {
|
|
453
|
-
const [childOptions, childRemaining] = filterWithLimit(option.children, left - 1);
|
|
454
|
-
visibleOptions.push({
|
|
455
|
-
...option,
|
|
456
|
-
children: childOptions,
|
|
457
|
-
});
|
|
458
|
-
left = childRemaining;
|
|
459
|
-
}
|
|
460
|
-
else {
|
|
461
|
-
visibleOptions.push(option);
|
|
462
|
-
left--;
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
return [visibleOptions, left];
|
|
466
|
-
}
|
|
467
|
-
const startingValue = [[], displayLimit];
|
|
468
|
-
const [resolvedGroups] = optionGroups.reduce(([groups, remaining], group) => {
|
|
469
|
-
const [options, leftAfter] = filterWithLimit(group.options, remaining);
|
|
470
|
-
if (options.length) {
|
|
471
|
-
return [[...groups, { ...group, options }], leftAfter];
|
|
472
|
-
}
|
|
473
|
-
else {
|
|
474
|
-
return [groups, remaining];
|
|
475
|
-
}
|
|
476
|
-
}, startingValue);
|
|
477
|
-
return resolvedGroups;
|
|
478
|
-
}
|
|
479
|
-
/*
|
|
480
|
-
Sort options so that previously selected options (from prior sessions)
|
|
481
|
-
appear at the top of their peer/sibling lists.
|
|
482
|
-
*/
|
|
483
|
-
function sortOptionsByPreviouslySelectedState(optionGroups, selectionAtOpen) {
|
|
484
|
-
function sortOptions(options) {
|
|
485
|
-
return sortBy(options, option => !selectionAtOpen.has(option)).map(option => {
|
|
486
|
-
if (option.children) {
|
|
487
|
-
return {
|
|
488
|
-
...option,
|
|
489
|
-
children: sortOptions(option.children),
|
|
490
|
-
};
|
|
491
|
-
}
|
|
492
|
-
else
|
|
493
|
-
return option;
|
|
494
|
-
});
|
|
495
|
-
}
|
|
496
|
-
return optionGroups.map(group => ({
|
|
497
|
-
...group,
|
|
498
|
-
options: sortOptions(group.options),
|
|
499
|
-
}));
|
|
500
|
-
}
|
|
501
|
-
/*
|
|
502
|
-
If we are restricting how many options are selected to a specific limit,
|
|
503
|
-
when we are at that limit, disable all options not currently selected.
|
|
504
|
-
*/
|
|
505
|
-
function applySelectedOptionLimit(state, optionGroups, topLevelOptions, options) {
|
|
506
|
-
if (options?.selectedOptionLimit === undefined) {
|
|
507
|
-
return optionGroups;
|
|
508
|
-
}
|
|
509
|
-
// When useTopLevelOptionsForDisplay is true and search is active, count
|
|
510
|
-
// selected top-level options from the original (unfiltered) data to ensure
|
|
511
|
-
// already-selected options that don't match the search are still counted.
|
|
512
|
-
const useOriginalForCounting = options?.useTopLevelOptionsForDisplay &&
|
|
513
|
-
state.query.search &&
|
|
514
|
-
state.originalOptionGroups.length > 0;
|
|
515
|
-
const topOptionsForCounting = useOriginalForCounting
|
|
516
|
-
? getTopLevelOptions(state.originalOptionGroups).map(option => augmentOptionToFullOption(state, option, options))
|
|
517
|
-
: topLevelOptions;
|
|
518
|
-
const selectedOrIndeterminateTopOptions = topOptionsForCounting.filter(option => option.selected != false);
|
|
519
|
-
const numSelectedOptions = options?.useTopLevelOptionsForDisplay
|
|
520
|
-
? selectedOrIndeterminateTopOptions.length
|
|
521
|
-
: state.selection.selected.size;
|
|
522
|
-
const selectedOptionLimit = options.selectedOptionLimit;
|
|
523
|
-
// If we have less items selected than the limit, business as usual.
|
|
524
|
-
if (numSelectedOptions < selectedOptionLimit) {
|
|
525
|
-
return optionGroups;
|
|
526
|
-
}
|
|
527
|
-
// If we have equal items selected to the limit (or more), prevent users from selecting more options.
|
|
528
|
-
function disableUnselectedItems(currentOptions, optionsAreChildrenOfSelectedGroup) {
|
|
529
|
-
const updatedItems = [];
|
|
530
|
-
for (const option of currentOptions) {
|
|
531
|
-
const isDisabledOrUnselected = !!option.disabled || (option.selectable && option.selected == false);
|
|
532
|
-
const isCurrentOptionSelected = option.selectable && option.selected != false;
|
|
533
|
-
const isCurrentOrParentOptionSelected = isCurrentOptionSelected || optionsAreChildrenOfSelectedGroup;
|
|
534
|
-
const forceEnabledBasedOnParent = !!options?.useTopLevelOptionsForDisplay &&
|
|
535
|
-
optionsAreChildrenOfSelectedGroup;
|
|
536
|
-
const markDisabled = isDisabledOrUnselected && !forceEnabledBasedOnParent;
|
|
537
|
-
if (option.children?.length) {
|
|
538
|
-
const childOptions = disableUnselectedItems(option.children, isCurrentOrParentOptionSelected);
|
|
539
|
-
updatedItems.push({
|
|
540
|
-
...option,
|
|
541
|
-
disabled: !!markDisabled,
|
|
542
|
-
children: childOptions,
|
|
543
|
-
});
|
|
544
|
-
}
|
|
545
|
-
else {
|
|
546
|
-
updatedItems.push({
|
|
547
|
-
...option,
|
|
548
|
-
disabled: !!markDisabled,
|
|
549
|
-
});
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
return updatedItems;
|
|
553
|
-
}
|
|
554
|
-
const groupsAfterLimit = [];
|
|
555
|
-
for (const currentGroup of optionGroups) {
|
|
556
|
-
groupsAfterLimit.push({
|
|
557
|
-
...currentGroup,
|
|
558
|
-
options: disableUnselectedItems(currentGroup.options, false),
|
|
559
|
-
});
|
|
560
|
-
}
|
|
561
|
-
return groupsAfterLimit;
|
|
562
|
-
}
|
|
563
|
-
function getRelationshipMaps(options) {
|
|
564
|
-
const parents = new Map();
|
|
565
|
-
function buildParentsMap(options, parent) {
|
|
566
|
-
for (const option of options) {
|
|
567
|
-
if (parent) {
|
|
568
|
-
parents.set(option.id, parent.id);
|
|
569
|
-
}
|
|
570
|
-
if (option.children?.length) {
|
|
571
|
-
buildParentsMap(option.children, option);
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
buildParentsMap(options);
|
|
576
|
-
const children = new Map();
|
|
577
|
-
function buildChildrenMap(options) {
|
|
578
|
-
for (const option of options) {
|
|
579
|
-
if (option.children?.length) {
|
|
580
|
-
children.set(option.id, option.children.map(({ id }) => id));
|
|
581
|
-
buildChildrenMap(option.children);
|
|
582
|
-
}
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
buildChildrenMap(options);
|
|
586
|
-
return [parents, children];
|
|
587
|
-
}
|
|
588
|
-
function getTopLevelOptions(optionGroups) {
|
|
589
|
-
return optionGroups.reduce((options, group) => [...options, ...group.options], []);
|
|
590
|
-
}
|
|
591
|
-
function getParentMultiSelectionState(children) {
|
|
592
|
-
if (children.every(child => child.selected === true))
|
|
593
|
-
return true;
|
|
594
|
-
if (children.every(child => child.selected === false))
|
|
595
|
-
return false;
|
|
596
|
-
return 'indeterminate';
|
|
597
|
-
}
|
|
598
|
-
function augmentOptionToFullOption(state, option, managerOptions) {
|
|
599
|
-
if (option.children?.length) {
|
|
600
|
-
const augmentedChildren = option.children.map(child => augmentOptionToFullOption(state, child, managerOptions));
|
|
601
|
-
const selectableWhenSearching = managerOptions?.allowSelectNonLeafDuringSearch ?? false;
|
|
602
|
-
// When allowSelectNonLeafDuringSearch is enabled and search is active,
|
|
603
|
-
// calculate selection state from ALL original children, not just the
|
|
604
|
-
// filtered ones visible in search results.
|
|
605
|
-
const useOriginalForSelectionState = managerOptions?.allowSelectNonLeafDuringSearch &&
|
|
606
|
-
state.query.search &&
|
|
607
|
-
state.originalOptionGroups.length > 0;
|
|
608
|
-
let selected;
|
|
609
|
-
if (useOriginalForSelectionState) {
|
|
610
|
-
const originalOption = findOption(getTopLevelOptions(state.originalOptionGroups), option.id);
|
|
611
|
-
if (originalOption) {
|
|
612
|
-
const allLeaves = flattenOptions([originalOption], true);
|
|
613
|
-
const selectedCount = allLeaves.filter(leaf => state.selection.selected.has(leaf)).length;
|
|
614
|
-
if (selectedCount === 0) {
|
|
615
|
-
selected = false;
|
|
616
|
-
}
|
|
617
|
-
else if (selectedCount === allLeaves.length) {
|
|
618
|
-
selected = true;
|
|
619
|
-
}
|
|
620
|
-
else {
|
|
621
|
-
selected = 'indeterminate';
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
else {
|
|
625
|
-
selected = getParentMultiSelectionState(augmentedChildren);
|
|
626
|
-
}
|
|
627
|
-
}
|
|
628
|
-
else {
|
|
629
|
-
selected = getParentMultiSelectionState(augmentedChildren);
|
|
630
|
-
}
|
|
631
|
-
return {
|
|
632
|
-
...option,
|
|
633
|
-
children: augmentedChildren,
|
|
634
|
-
selected,
|
|
635
|
-
expanded: state.query.search
|
|
636
|
-
? true
|
|
637
|
-
: state.display.expandedOptions.has(option.id),
|
|
638
|
-
selectable: !state.query.search || selectableWhenSearching,
|
|
639
|
-
expandable: !state.query.search,
|
|
640
|
-
};
|
|
641
|
-
}
|
|
642
|
-
return {
|
|
643
|
-
...option,
|
|
644
|
-
children: undefined,
|
|
645
|
-
selected: state.selection.selected.has(option),
|
|
646
|
-
expanded: false,
|
|
647
|
-
selectable: true,
|
|
648
|
-
expandable: false,
|
|
649
|
-
};
|
|
650
|
-
}
|
|
651
|
-
function getFormattedOptionsForDisplay(state, topLevelOptions, options) {
|
|
652
|
-
// If we have a custom display function, use it
|
|
653
|
-
if (options?.getCustomOptionDisplay) {
|
|
654
|
-
return options.getCustomOptionDisplay([...state.selection.selected]);
|
|
655
|
-
}
|
|
656
|
-
if (options?.useTopLevelOptionsForDisplay) {
|
|
657
|
-
return getTopLevelFormattedOptionsForDisplay(topLevelOptions);
|
|
658
|
-
}
|
|
659
|
-
// Otherwise, use the default display for options - titles separated by commas.
|
|
660
|
-
return [...state.selection.selected].map(({ title }) => title).join(', ');
|
|
661
|
-
}
|
|
662
|
-
function getTopLevelFormattedOptionsForDisplay(topLevelOptions) {
|
|
663
|
-
if (!topLevelOptions || topLevelOptions.length == 0) {
|
|
664
|
-
return '';
|
|
665
|
-
}
|
|
666
|
-
const selectedOrIndeterminateTopOptions = topLevelOptions.filter(option => option.selected != false);
|
|
667
|
-
return selectedOrIndeterminateTopOptions
|
|
668
|
-
.map(({ title }) => title)
|
|
669
|
-
.join(', ');
|
|
670
|
-
}
|
|
671
|
-
function getPillCountForDisplay(state, topLevelOptions, options) {
|
|
672
|
-
if (options?.useTopLevelOptionsForDisplay) {
|
|
673
|
-
const selectedOrIndeterminateTopOptions = topLevelOptions.filter(option => option.selected != false);
|
|
674
|
-
return selectedOrIndeterminateTopOptions.length;
|
|
675
|
-
}
|
|
676
|
-
return state.selection.selected.size;
|
|
677
|
-
}
|
|
678
|
-
function getZeroStateMessage(state) {
|
|
679
|
-
if (state.sourceOptionGroups.every(group => group.options.length === 0)) {
|
|
680
|
-
if (state.query.search)
|
|
681
|
-
return 'No results found.';
|
|
682
|
-
return 'No options.';
|
|
683
|
-
}
|
|
684
|
-
return null;
|
|
685
|
-
}
|
|
686
|
-
function findOption(options, id) {
|
|
687
|
-
for (const option of options) {
|
|
688
|
-
if (option.id === id)
|
|
689
|
-
return option;
|
|
690
|
-
if (option.children?.length) {
|
|
691
|
-
const child = findOption(option.children, id);
|
|
692
|
-
if (child)
|
|
693
|
-
return child;
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
return null;
|
|
697
|
-
}
|
|
698
|
-
function flattenOptions(options, leafOnly) {
|
|
699
|
-
return flattenDeep(options.map(option => {
|
|
700
|
-
if (option.children?.length) {
|
|
701
|
-
const descendants = option.children.map(child => flattenOptions([child], leafOnly));
|
|
702
|
-
return leafOnly ? descendants : [option, ...descendants];
|
|
703
|
-
}
|
|
704
|
-
else {
|
|
705
|
-
return [option];
|
|
706
|
-
}
|
|
707
|
-
}));
|
|
708
|
-
}
|
|
709
|
-
function toggleSelected(state, id, managerOptions) {
|
|
710
|
-
const topLevelOptions = getTopLevelOptions(state.sourceOptionGroups);
|
|
711
|
-
const option = findOption(topLevelOptions, id);
|
|
712
|
-
if (!option)
|
|
713
|
-
return state;
|
|
714
|
-
const newSelection = new OptionSet(state.selection.selected);
|
|
715
|
-
const newValue = !(augmentOptionToFullOption(state, option, managerOptions).selected === true);
|
|
716
|
-
// When allowSelectNonLeafDuringSearch is enabled and search is active,
|
|
717
|
-
// use the original (unfiltered) data to get all children, not just
|
|
718
|
-
// those visible in the filtered search results.
|
|
719
|
-
const useOriginalData = managerOptions?.allowSelectNonLeafDuringSearch &&
|
|
720
|
-
state.query.search &&
|
|
721
|
-
state.originalOptionGroups.length > 0;
|
|
722
|
-
const optionForLeaves = useOriginalData
|
|
723
|
-
? findOption(getTopLevelOptions(state.originalOptionGroups), id) ?? option
|
|
724
|
-
: option;
|
|
725
|
-
const leaves = flattenOptions([optionForLeaves], true);
|
|
726
|
-
for (const leaf of leaves) {
|
|
727
|
-
if (newValue) {
|
|
728
|
-
newSelection.add(leaf);
|
|
729
|
-
}
|
|
730
|
-
else {
|
|
731
|
-
newSelection.delete(leaf);
|
|
732
|
-
}
|
|
733
|
-
}
|
|
734
|
-
return {
|
|
735
|
-
...state,
|
|
736
|
-
selection: {
|
|
737
|
-
selected: newSelection,
|
|
738
|
-
},
|
|
739
|
-
};
|
|
740
|
-
}
|
|
741
|
-
function setSelectedOption(state, id) {
|
|
742
|
-
const topLevelOptions = getTopLevelOptions(state.sourceOptionGroups);
|
|
743
|
-
const option = findOption(topLevelOptions, id);
|
|
744
|
-
if (!option)
|
|
745
|
-
return state;
|
|
746
|
-
const newSelection = new OptionSet();
|
|
747
|
-
newSelection.add(option);
|
|
748
|
-
return {
|
|
749
|
-
...state,
|
|
750
|
-
selection: {
|
|
751
|
-
selected: newSelection,
|
|
752
|
-
},
|
|
753
|
-
};
|
|
754
|
-
}
|
|
755
|
-
function toggleVisibleSelected(state) {
|
|
756
|
-
const leaves = flattenOptions(getTopLevelOptions(state.sourceOptionGroups), true);
|
|
757
|
-
const isAllSelected = leaves.every(leaf => state.selection.selected.has(leaf));
|
|
758
|
-
const newSelection = new OptionSet(state.selection.selected);
|
|
759
|
-
for (const leaf of leaves) {
|
|
760
|
-
if (isAllSelected)
|
|
761
|
-
newSelection.delete(leaf);
|
|
762
|
-
else
|
|
763
|
-
newSelection.add(leaf);
|
|
764
|
-
}
|
|
765
|
-
return {
|
|
766
|
-
...state,
|
|
767
|
-
selection: {
|
|
768
|
-
...state.selection,
|
|
769
|
-
selected: newSelection,
|
|
770
|
-
},
|
|
771
|
-
};
|
|
772
|
-
}
|
|
773
|
-
function toggleOptionExpanded(state, id) {
|
|
774
|
-
const newValue = !state.display.expandedOptions.has(id);
|
|
775
|
-
const newExpandedOptions = new Set(state.display.expandedOptions);
|
|
776
|
-
if (newValue)
|
|
777
|
-
newExpandedOptions.add(id);
|
|
778
|
-
else
|
|
779
|
-
newExpandedOptions.delete(id);
|
|
780
|
-
return {
|
|
781
|
-
...state,
|
|
782
|
-
display: {
|
|
783
|
-
...state.display,
|
|
784
|
-
expandedOptions: newExpandedOptions,
|
|
785
|
-
},
|
|
786
|
-
};
|
|
787
|
-
}
|
|
788
|
-
function sideEffects(state, action, source, internalActions) {
|
|
789
|
-
if (action.type === 'load' ||
|
|
790
|
-
action.type === 'searchChange' ||
|
|
791
|
-
action.type === 'orderChange' ||
|
|
792
|
-
(action.type === 'openChange' && action.open)) {
|
|
793
|
-
source(state.query, action)
|
|
794
|
-
.then(result => {
|
|
795
|
-
const data = Array.isArray(result) ? result : result.data;
|
|
796
|
-
const originalData = Array.isArray(result)
|
|
797
|
-
? undefined
|
|
798
|
-
: result.originalData;
|
|
799
|
-
internalActions.next({ type: 'loadComplete', data, originalData });
|
|
800
|
-
})
|
|
801
|
-
.catch(error => {
|
|
802
|
-
// eslint-disable-next-line no-console
|
|
803
|
-
console.error(error);
|
|
804
|
-
internalActions.next({ type: 'loadError', error });
|
|
805
|
-
});
|
|
806
|
-
return {
|
|
807
|
-
...state,
|
|
808
|
-
load: {
|
|
809
|
-
loading: true,
|
|
810
|
-
error: null,
|
|
811
|
-
},
|
|
812
|
-
};
|
|
813
|
-
}
|
|
814
|
-
return state;
|
|
815
|
-
}
|
|
816
|
-
function reduce(state, action, managerOptions) {
|
|
817
|
-
switch (action.type) {
|
|
818
|
-
case 'load':
|
|
819
|
-
return state;
|
|
820
|
-
case 'loadComplete':
|
|
821
|
-
return {
|
|
822
|
-
...state,
|
|
823
|
-
load: {
|
|
824
|
-
loading: false,
|
|
825
|
-
error: null,
|
|
826
|
-
},
|
|
827
|
-
sourceOptionGroups: action.data,
|
|
828
|
-
originalOptionGroups: action.originalData ?? [],
|
|
829
|
-
};
|
|
830
|
-
case 'loadError':
|
|
831
|
-
return {
|
|
832
|
-
...state,
|
|
833
|
-
load: {
|
|
834
|
-
loading: false,
|
|
835
|
-
error: action.error,
|
|
836
|
-
},
|
|
837
|
-
};
|
|
838
|
-
case 'openChange':
|
|
839
|
-
return {
|
|
840
|
-
...state,
|
|
841
|
-
query: {
|
|
842
|
-
...state.query,
|
|
843
|
-
search: '',
|
|
844
|
-
},
|
|
845
|
-
display: {
|
|
846
|
-
...state.display,
|
|
847
|
-
open: action.open,
|
|
848
|
-
},
|
|
849
|
-
};
|
|
850
|
-
case 'searchChange':
|
|
851
|
-
return {
|
|
852
|
-
...state,
|
|
853
|
-
query: {
|
|
854
|
-
...state.query,
|
|
855
|
-
search: action.payload,
|
|
856
|
-
},
|
|
857
|
-
};
|
|
858
|
-
case 'orderChange':
|
|
859
|
-
return {
|
|
860
|
-
...state,
|
|
861
|
-
query: {
|
|
862
|
-
...state.query,
|
|
863
|
-
order: action.payload,
|
|
864
|
-
},
|
|
865
|
-
};
|
|
866
|
-
case 'selectionChange':
|
|
867
|
-
return {
|
|
868
|
-
...state,
|
|
869
|
-
selection: action.payload,
|
|
870
|
-
};
|
|
871
|
-
case 'toggleOptionSelected':
|
|
872
|
-
return toggleSelected(state, action.id, managerOptions);
|
|
873
|
-
case 'setSelectedOption':
|
|
874
|
-
return setSelectedOption(state, action.id);
|
|
875
|
-
case 'visibleSelectedChange':
|
|
876
|
-
return toggleVisibleSelected(state);
|
|
877
|
-
case 'toggleOptionExpanded':
|
|
878
|
-
return toggleOptionExpanded(state, action.id);
|
|
879
|
-
}
|
|
880
|
-
}
|
|
881
|
-
})(RivSelect || (RivSelect = {}));
|
|
882
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9pbnB1dC9zZWxlY3Qvc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUtOLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDckUsT0FBTyxFQUNMLFdBQVcsRUFFWCxHQUFHLEVBQ0gsS0FBSyxFQUVMLGFBQWEsRUFDYixJQUFJLEVBQ0osU0FBUyxFQUNULE9BQU8sR0FDUixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUc1RCxNQUFNLEtBQVcsU0FBUyxDQXk4Q3pCO0FBejhDRCxXQUFpQixTQUFTO0lBQ3hCLGFBQWE7SUFDYixhQUFhO0lBQ2IsYUFBYTtJQXVHYjs7O09BR0c7SUFDSCxNQUFhLFNBQWdDLFNBQVEsR0FBb0I7UUFPdkUsWUFBWSxNQUF5QztZQUNuRCxLQUFLLEVBQUUsQ0FBQztZQVBWLHVFQUF1RTtZQUN2RSx1RUFBdUU7WUFDdkUsdUVBQXVFO1lBQ3ZFLDhEQUE4RDtZQUM3QyxTQUFJLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7WUFJMUQsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7b0JBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ2pCO2FBQ0Y7UUFDSCxDQUFDO1FBRVEsR0FBRyxDQUFDLE1BQXVDO1lBQ2xELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFFUSxHQUFHLENBQUMsTUFBdUI7WUFDbEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxD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QU8saUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3QyxLQUFLLHVCQUF1QjtnQkFDMUIsT0FBTyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QyxLQUFLLHNCQUFzQjtnQkFDekIsT0FBTyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2pEO0lBQ0gsQ0FBQztBQUNILENBQUMsRUF6OENnQixTQUFTLEtBQVQsU0FBUyxRQXk4Q3pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEZ1c2UsIHtcbiAgRnVzZVJlc3VsdCxcbiAgRnVzZVJlc3VsdE1hdGNoLFxuICBJRnVzZU9wdGlvbnMsXG4gIFJhbmdlVHVwbGUsXG59IGZyb20gJ2Z1c2UuanMnO1xuaW1wb3J0IHsgZGVmYXVsdHNEZWVwLCBmbGF0dGVuRGVlcCwgaXNOdW1iZXIsIHNvcnRCeSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICBjb25uZWN0YWJsZSxcbiAgQ29ubmVjdGFibGUsXG4gIG1hcCxcbiAgbWVyZ2UsXG4gIE9ic2VydmFibGUsXG4gIFJlcGxheVN1YmplY3QsXG4gIHNjYW4sXG4gIHN0YXJ0V2l0aCxcbiAgU3ViamVjdCxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEZWVwUGFydGlhbCB9IGZyb20gJ3V0aWxpdHktdHlwZXMnO1xuaW1wb3J0IHsgTnVtYmVyUGlwZSB9IGZyb20gJy4uLy4uL2Zvcm1hdC9waXBlcy9udW1iZXIucGlwZSc7XG5pbXBvcnQgeyBIaWdobGlnaHRDb21wb25lbnQgfSBmcm9tICcuLi8uLi92aXN1YWxpemF0aW9uL2hpZ2hsaWdodC9oaWdobGlnaHQuY29tcG9uZW50JztcblxuZXhwb3J0IG5hbWVzcGFjZSBSaXZTZWxlY3Qge1xuICAvLy8vLy8vLy8vLy8vXG4gIC8vIE9wdGlvbnMgLy9cbiAgLy8vLy8vLy8vLy8vL1xuXG4gIC8qKlxuICAgKiDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAtLS0tLS0tLS0tLS0tLS0tLS0t4pSA4pSA4pSA4pSQXG4gICAqIOKUgiBCYXNlT3B0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIJcbiAgICog4pSCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilIIgVGhlIGNvcmUgZGF0YSByZXF1aXJlZCBmb3IgZWFjaCBvcHRpb24gICAg4pSCXG4gICAqIOKUgiAoc3VjaCBhcyBpZCBhbmQgdGl0bGUpLiAgICAgICAgICAgICAgICAgICDilIJcbiAgICog4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSALS0tLS0tLS0tLS0tLS0tLS0tLeKUgOKUgOKUpFxuICAgKiDilIIgT3B0aW9uIChCYXNlT3B0aW9uICsgY2hpbGRyZW4pICAgICAgICAgICAg4pSCXG4gICAqIOKUgiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIJcbiAgICog4pSCIFByb3ZpZGVzIHJlY3Vyc2l2ZSB0eXBlIHNhZmV0eSB0byB0aGUgICAgIOKUglxuICAgKiDilIIgdHlwZSBzYWZldHkgdG8gdGhlIEJhc2VPcHRpb24uICAgICAgICAgICAg4pSCXG4gICAqIOKUlOKUgC0tLS0tLS0tLS0tLS0tLS0tLeKUrC0tLS0tLS3ilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgICogICAgICAgICAgICAgICAgICAgICB8XG4gICAqIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKWvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgKiDilIIgU291cmNlT3B0aW9uIChPcHRpb24gKyBzZWFyY2ggaGlnaGxpZ2h0cykg4pSCXG4gICAqIOKUgiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIJcbiAgICog4pSCIEFkZHMgc2VhcmNoIGhpZ2hsaWdodHMgdG8gdGhlIE9wdGlvbiBhbmQgIOKUglxuICAgKiDilIIgaXMgdGhlIHJldHVybiB0eXBlIGZvciB0aGUgb3B0aW9uIFNvdXJjZSAg4pSCXG4gICAqIOKUgiAoZGF0YSBmZXRjaGVyKSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICDilIJcbiAgICog4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG4gICAqICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilrzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJBcbiAgICog4pSCIEZ1bGxPcHRpb24gKFNvdXJjZU9wdGlvbiArIFVJIHN0YXRlKSAgICAgIOKUglxuICAgKiDilIIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCXG4gICAqIOKUgiBBdWdtZW50cyB0aGUgU291cmNlT3B0aW9uIHdpdGggYWxsIG9mIHRoZSDilIJcbiAgICog4pSCIFVJIGluZm9ybWF0aW9uIGZyb20gb3RoZXIgcGFydHMgb2YgdGhlICAgIOKUglxuICAgKiDilIIgc3RhdGUsIHN1Y2ggYXMgc2VsZWN0aW9uIHN0YXR1cywgd2hldGhlciAg4pSCXG4gICAqIOKUgiBvciBub3QgdGhlIG5vZGUgaXMgZXhwYW5kZWQsIGV0Yy4gICAgICAgICDilIJcbiAgICog4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgdXNhZ2VzIG9mIE9taXQ8Li4uPiBpbiB0aGlzIHNlY3Rpb24gYXJlIG5vdCByZXF1aXJlZCwgYnV0XG4gICAqIGRvIGhlbHAgaW4tZWRpdG9yIHR5cGUgaGludHMgdG8gYmUgbW9yZSBjbGVhciBhbmQgZGlyZWN0LlxuICAgKi9cblxuICBleHBvcnQgdHlwZSBCYXNlT3B0aW9uID0ge1xuICAgIGlkOiBzdHJpbmcgfCBudW1iZXI7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBzdWJ0aXRsZT86IHN0cmluZztcbiAgICBoZWxwPzogc3RyaW5nO1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlZEV4cGxhbmF0aW9uPzogc3RyaW5nO1xuICB9O1xuICBleHBvcnQgdHlwZSBPcHRpb248TyBleHRlbmRzIEJhc2VPcHRpb24gPSBCYXNlT3B0aW9uPiA9IE8gJiB7XG4gICAgY2hpbGRyZW4/OiBPcHRpb248Tz5bXTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBTb3VyY2VPcHRpb248TyBleHRlbmRzIEJhc2VPcHRpb24+ID0gT21pdDxcbiAgICBPcHRpb248Tz4sXG4gICAgJ2NoaWxkcmVuJ1xuICA+ICYge1xuICAgIHRpdGxlSGlnaGxpZ2h0SW5kaWNlcz86IEhpZ2hsaWdodENvbXBvbmVudC5IaWdobGlnaHRJbmRpY2VzW107XG4gICAgc3VidGl0bGVIaWdobGlnaHRJbmRpY2VzPzogSGlnaGxpZ2h0Q29tcG9uZW50LkhpZ2hsaWdodEluZGljZXNbXTtcbiAgICBjaGlsZHJlbj86IFNvdXJjZU9wdGlvbjxPPltdO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIE11bHRpU2VsZWN0aW9uU3RhdGUgPSBib29sZWFuIHwgJ2luZGV0ZXJtaW5hdGUnO1xuXG4gIGV4cG9ydCB0eXBlIEZ1bGxPcHRpb248TyBleHRlbmRzIEJhc2VPcHRpb24+ID0gT21pdDxcbiAgICBTb3VyY2VPcHRpb248Tz4sXG4gICAgJ2NoaWxkcmVuJ1xuICA+ICYge1xuICAgIHNlbGVjdGVkOiBNdWx0aVNlbGVjdGlvblN0YXRlO1xuICAgIGV4cGFuZGVkOiBib29sZWFuO1xuICAgIHNlbGVjdGFibGU6IGJvb2xlYW47XG4gICAgZXhwYW5kYWJsZTogYm9vbGVhbjtcbiAgICBjaGlsZHJlbj86IEZ1bGxPcHRpb248Tz5bXTtcbiAgfTtcblxuICAvLy8vLy8vLy8vLy8vLy8vLy8vXG4gIC8vIE9wdGlvbiBncm91cHMgLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gIC8qKlxuICAgKiBUaGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIE9wdGlvbkdyb3VwLCBTb3VyY2VPcHRpb25Hcm91cCwgYW5kXG4gICAqIEZ1bGxPcHRpb25Hcm91cCBpcyBhbmFsb2dvdXMgdG8gdGhlIG9wdGlvbiB0eXBlcyBhYm92ZS5cbiAgICpcbiAgICogQXMgd2l0aCBiZWZvcmUsIHRoZSB1c2Ugb2YgT21pdDwuLi4+IGlzIG5vdCByZXF1aXJlZCBidXQgaGVscGZ1bC5cbiAgICovXG5cbiAgZXhwb3J0IHR5cGUgT3B0aW9uR3JvdXA8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0ge1xuICAgIGhlYWRlcj86IHN0cmluZztcbiAgICAvKiogSW5mbyBpY29uICsgdG9vbHRpcCBzaG93biBiZXNpZGUgdGhlIGhlYWRlci4gTm8tb3Agd2l0aG91dCBhIGhlYWRlci4gKi9cbiAgICBoZWxwPzogc3RyaW5nO1xuICAgIG9wdGlvbnM6IE9wdGlvbjxPPltdO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFNvdXJjZU9wdGlvbkdyb3VwPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPiA9IE9taXQ8XG4gICAgT3B0aW9uR3JvdXA8Tz4sXG4gICAgJ29wdGlvbnMnXG4gID4gJiB7XG4gICAgb3B0aW9uczogU291cmNlT3B0aW9uPE8+W107XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgRnVsbE9wdGlvbkdyb3VwPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPiA9IE9taXQ8XG4gICAgU291cmNlT3B0aW9uR3JvdXA8Tz4sXG4gICAgJ29wdGlvbnMnXG4gID4gJiB7XG4gICAgb3B0aW9uczogRnVsbE9wdGlvbjxPPltdO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgT3B0aW9uU2V0IGNsYXNzIHByb3ZpZGVzIFNldC1saWtlIGZ1bmN0aW9uYWxpdHksIGJ1dCB1bmlxdWVuZXNzIGlzXG4gICAqIGRldGVybWluZWQgYnkgdGhlIG9wdGlvbidzIElEIHJhdGhlciB0aGFuIHRoZSBvYmplY3QgcmVmZXJlbmNlLlxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIE9wdGlvblNldDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gZXh0ZW5kcyBTZXQ8U291cmNlT3B0aW9uPE8+PiB7XG4gICAgLy8gUGFyYWxsZWwgaWQg4oaSIG9wdGlvbiBtYXAgc28gaGFzKCkvYWRkKCkvZGVsZXRlKCkgYXJlIE8oMSkgaW5zdGVhZCBvZlxuICAgIC8vIHNwcmVhZGluZyB0aGUgU2V0IGFuZCBsaW5lYXItc2Nhbm5pbmcgaXQuIFJlYnVpbGRpbmcgYW4gTyhOwrIpIGxvb2t1cFxuICAgIC8vIGZvciBhIDE2ay1vcHRpb24gc2VsZWN0aW9uIHdhcyB0aGUgcHJpbWFyeSBjYXVzZSBvZiB0aGUgbXVsdGktbWludXRlXG4gICAgLy8gZnJlZXplIHRoYXQgc3VyZmFjZWQgUlZULTI1MzgzJ3MgdHJlZS1zZWxlY3Qgc2NhbGUgcHJvYmxlbS5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGJ5SWQgPSBuZXcgTWFwPE9bJ2lkJ10sIFNvdXJjZU9wdGlvbjxPPj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHZhbHVlcz86IEl0ZXJhYmxlPFNvdXJjZU9wdGlvbjxPPj4gfCBudWxsKSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgaWYgKHZhbHVlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICAgIHRoaXMuYWRkKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG92ZXJyaWRlIGhhcyhvcHRpb246IFNvdXJjZU9wdGlvbjxPPiB8IEZ1bGxPcHRpb248Tz4pIHtcbiAgICAgIHJldHVybiB0aGlzLmJ5SWQuaGFzKG9wdGlvbi5pZCk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgYWRkKG9wdGlvbjogU291cmNlT3B0aW9uPE8+KSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuYnlJZC5nZXQob3B0aW9uLmlkKTtcbiAgICAgIGlmIChleGlzdGluZyA9PT0gb3B0aW9uKSB7XG4gICAgICAgIC8vIFNhbWUgb2JqZWN0IHJlZmVyZW5jZSDigJQgbm90aGluZyB0byB1cGRhdGUuIEFuY2VzdG9yIHJlLWFkZHNcbiAgICAgICAgLy8gZHVyaW5nIGEgc2VsZWN0aW9uIHNuYXBzaG90IGhpdCB0aGlzIHBhdGggcmVwZWF0ZWRseSwgc28ga2VlcGluZ1xuICAgICAgICAvLyBpdCBPKDEpIGlzIHdoYXQgcHJldmVudHMgdGhlIHRyZWUtc2VsZWN0IE7CsiBibG93LXVwIHNlZW4gaW5cbiAgICAgICAgLy8gUlZULTI1NDcwLlxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmIChleGlzdGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIERpZmZlcmVudCByZWZlcmVuY2UsIHNhbWUgaWQg4oCUIHN3YXAgdGhlIHN0b3JlZCByZWYgd2hpbGVcbiAgICAgICAgLy8gcHJlc2VydmluZyBTZXQgaW5zZXJ0aW9uIG9yZGVyLiBUaGUgcmVidWlsZCBpcyBPKE4pLCBidXQgdGhpc1xuICAgICAgICAvLyBwYXRoIGlzIHJhcmUgaW4gcHJhY3RpY2UgKHRoZSBob3QgYW5jZXN0b3Itc25hcHNob3QgbG9vcCB0YWtlc1xuICAgICAgICAvLyB0aGUgaWRlbnRpdHkgZmFzdC1wYXRoIGFib3ZlKS5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBbLi4udGhpc10ubWFwKG8gPT4gKG8uaWQgPT09IG9wdGlvbi5pZCA/IG9wdGlvbiA6IG8pKTtcbiAgICAgICAgdGhpcy5ieUlkLnNldChvcHRpb24uaWQsIG9wdGlvbik7XG4gICAgICAgIHN1cGVyLmNsZWFyKCk7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgc3VwZXIuYWRkKGl0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ieUlkLnNldChvcHRpb24uaWQsIG9wdGlvbik7XG4gICAgICAgIHN1cGVyLmFkZChvcHRpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGVsZXRlKG9wdGlvbjogU291cmNlT3B0aW9uPE8+KSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuYnlJZC5nZXQob3B0aW9uLmlkKTtcbiAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICB0aGlzLmJ5SWQuZGVsZXRlKG9wdGlvbi5pZCk7XG4gICAgICAgIHN1cGVyLmRlbGV0ZShleGlzdGluZyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIG92ZXJyaWRlIGNsZWFyKCkge1xuICAgICAgdGhpcy5ieUlkLmNsZWFyKCk7XG4gICAgICBzdXBlci5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIC8vLy8vLy8vLy8vXG4gIC8vIFN0YXRlIC8vXG4gIC8vLy8vLy8vLy8vXG5cbiAgLyoqXG4gICAqIFRoZSBDb3JlU3RhdGUgcHJvdmlkZXMgYWxsIG9mIHRoZSBmb3VuZGF0aW9uYWwgcGllY2VzIG9mIHN0YXRlIHJlcXVpcmVkXG4gICAqIGZvciBhIHdvcmtpbmcgY29tcG9uZW50LiBGdWxsU3RhdGUgaXMgYSBwdXJlIGRlcml2YXRpb24gb2YgQ29yZVN0YXRlIHBsdXNcbiAgICogdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgYW5kIHByb3ZpZGVzIGNvbnZlbmllbmNlcyBmb3IgcmVuZGVyaW5nIHRoZVxuICAgKiBjb21wb25lbnRzLiBBY3Rpb25zIGFuZCB0aGUgY29yZSBzdGF0ZSBhcmUgcGFzc2VkIHRvIHRoZSByZWR1Y2VyIHRvXG4gICAqIHByb2R1Y2UgbmV3IENvcmVTdGF0ZXMgKHdoaWNoIGFyZSB0aGVuIHVzZWQgdG8gY2FsY3VsYXRlIG5ldyBGdWxsU3RhdGVzKS5cbiAgICpcbiAgICog4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAqIOKUgiAgVUkgIOKXhOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgKiDilJTilIDilIDilKzilIDilIDilIDilJggICAgICAgIOKUglxuICAgKiAgICDilIIgICAgICAgICAgICDilIJcbiAgICog4pSM4pSA4pSA4pa84pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAg4pSCXG4gICAqIOKUgiAgQWN0aW9ucyAg4pSCICAg4pSCXG4gICAqIOKUlOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgIOKUglxuICAgKiAgICDilIIgICAgICAgICAgICDilIJcbiAgICog4pSM4pSA4pSA4pa84pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS04pSA4pSQXG4gICAqIOKUgiAgU3RhdGUgcmVkdWNlciAg4pSCXG4gICAqIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgKi9cblxuICBleHBvcnQgdHlwZSBPcmRlckJ5ID0gJ3RpdGxlJyB8ICdjb3VudCcgfCAnc291cmNlJztcblxuICBjb25zdCBNSU5fT1BUSU9OU19GT1JfQ09OVFJPTFMgPSA1O1xuXG4gIGNvbnN0IERFRkFVTFRfRElTUExBWV9MSU1JVCA9IDEwMDtcblxuICBleHBvcnQgdHlwZSBDb3JlU3RhdGU8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0ge1xuICAgIHF1ZXJ5OiB7XG4gICAgICBzZWFyY2g6IHN0cmluZztcbiAgICAgIG9yZGVyOiBPcmRlckJ5O1xuICAgIH07XG4gICAgbG9hZDoge1xuICAgICAgbG9hZGluZzogYm9vbGVhbjtcbiAgICAgIGVycm9yOiB1bmtub3duIHwgbnVsbDtcbiAgICB9O1xuICAgIHNvdXJjZU9wdGlvbkdyb3VwczogU291cmNlT3B0aW9uR3JvdXA8Tz5bXTtcbiAgICAvKipcbiAgICAgKiBTdG9yZXMgdGhlIHVuZmlsdGVyZWQgb3JpZ2luYWwgb3B0aW9uIGdyb3VwcyB3aGVuIHNlYXJjaCBmaWx0ZXJpbmcgaXMgYWN0aXZlLlxuICAgICAqIFVzZWQgYnkgYGFsbG93U2VsZWN0Tm9uTGVhZkR1cmluZ1NlYXJjaGAgdG8gc2VsZWN0IGFsbCBjaGlsZHJlbiBvZiBhIHBhcmVudCxcbiAgICAgKiBpbmNsdWRpbmcgdGhvc2Ugbm90IHZpc2libGUgaW4gdGhlIGZpbHRlcmVkIHNlYXJjaCByZXN1bHRzLlxuICAgICAqL1xuICAgIG9yaWdpbmFsT3B0aW9uR3JvdXBzOiBTb3VyY2VPcHRpb25Hcm91cDxPPltdO1xuICAgIHNlbGVjdGlvbjoge1xuICAgICAgc2VsZWN0ZWQ6IE9wdGlvblNldDxPPjtcbiAgICB9O1xuICAgIGRpc3BsYXk6IHtcbiAgICAgIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gICAgICBvcGVuOiBib29sZWFuO1xuICAgICAgZXhwYW5kZWRPcHRpb25zOiBTZXQ8T1snaWQnXT47XG4gICAgfTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBGdWxsU3RhdGU8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0gQ29yZVN0YXRlPE8+ICYge1xuICAgIHF1ZXJ5OiB7XG4gICAgICBzaG93U2VhcmNoOiBib29sZWFuO1xuICAgICAgc2VhcmNoUGxhY2Vob2xkZXI6IHN0cmluZztcbiAgICAgIHNob3dPcmRlcjogYm9vbGVhbjtcbiAgICB9O1xuICAgIGZ1bGxPcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdO1xuICAgIHNlbGVjdGlvbjoge1xuICAgICAgYWxsb3dNdWx0aVNlbGVjdDogYm9vbGVhbjtcbiAgICAgIGFsbG93U2VsZWN0QWxsOiBib29sZWFuO1xuICAgICAgdmlzaWJsZVNlbGVjdGlvblN0YXRlOiBNdWx0aVNlbGVjdGlvblN0YXRlO1xuICAgIH07XG4gICAgZGlzcGxheToge1xuICAgICAgZm9ybWF0dGVkU2VsZWN0ZWRPcHRpb25zOiBzdHJpbmc7XG4gICAgICB6ZXJvU3RhdGVNZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICAgICAgZGl2aWRlcnM6IGJvb2xlYW47XG4gICAgICBpbmxpbmU6IGJvb2xlYW47XG4gICAgICBtYXhIZWlnaHQ6IHN0cmluZyB8IG51bGw7XG4gICAgICBtYXhXaWR0aDogc3RyaW5nIHwgbnVsbDtcbiAgICAgIG1pbkhlaWdodDogc3RyaW5nIHwgbnVsbDtcbiAgICAgIG1pbldpZHRoOiBzdHJpbmcgfCBudWxsO1xuICAgICAgZGlzcGxheUxpbWl0TWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcbiAgICAgIHNob3dTaW5nbGVTZWxlY3RlZDogYm9vbGVhbjtcbiAgICAgIHBpbGxDb3VudDogbnVtYmVyO1xuICAgIH07XG4gIH07XG5cbiAgLy8vLy8vLy8vLy8vL1xuICAvLyBBY3Rpb25zIC8vXG4gIC8vLy8vLy8vLy8vLy9cblxuICBleHBvcnQgdHlwZSBBY3Rpb248TyBleHRlbmRzIEJhc2VPcHRpb24+ID1cbiAgICB8IHsgdHlwZTogJ2xvYWQnIH1cbiAgICB8IHsgdHlwZTogJ29wZW5DaGFuZ2UnOyBvcGVuOiBib29sZWFuIH1cbiAgICB8IHsgdHlwZTogJ3NlYXJjaENoYW5nZSc7IHBheWxvYWQ6IHN0cmluZyB9XG4gICAgfCB7IHR5cGU6ICdvcmRlckNoYW5nZSc7IHBheWxvYWQ6IE9yZGVyQnkgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnc2VsZWN0aW9uQ2hhbmdlJztcbiAgICAgICAgcGF5bG9hZDogQ29yZVN0YXRlPE8+WydzZWxlY3Rpb24nXTtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3RvZ2dsZU9wdGlvblNlbGVjdGVkJztcbiAgICAgICAgaWQ6IE9bJ2lkJ107XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdzZXRTZWxlY3RlZE9wdGlvbic7XG4gICAgICAgIGlkOiBPWydpZCddO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAndmlzaWJsZVNlbGVjdGVkQ2hhbmdlJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3RvZ2dsZU9wdGlvbkV4cGFuZGVkJztcbiAgICAgICAgaWQ6IE9bJ2lkJ107XG4gICAgICB9O1xuXG4gIHR5cGUgSW50ZXJuYWxBY3Rpb248TyBleHRlbmRzIEJhc2VPcHRpb24+ID1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2xvYWRDb21wbGV0ZSc7XG4gICAgICAgIGRhdGE6IFNvdXJjZU9wdGlvbkdyb3VwPE8+W107XG4gICAgICAgIC8qKiBPcmlnaW5hbCB1bmZpbHRlcmVkIGRhdGEsIHByb3ZpZGVkIHdoZW4gc2VhcmNoIGlzIGFjdGl2ZSAqL1xuICAgICAgICBvcmlnaW5hbERhdGE/OiBTb3VyY2VPcHRpb25Hcm91cDxPPltdO1xuICAgICAgfVxuICAgIHwgeyB0eXBlOiAnbG9hZEVycm9yJzsgZXJyb3I6IHVua25vd24gfTtcblxuICAvLy8vLy8vLy8vLy9cbiAgLy8gU291cmNlIC8vXG4gIC8vLy8vLy8vLy8vL1xuXG4gIC8qKlxuICAgKiBUaGUgU291cmNlJ3Mgam9iIGlzIHRvIGZldGNoIG9wdGlvbnMgKGJhc2VkIG9uIHRoZSBjdXJyZW50IHN0YXRlKSB3aGljaFxuICAgKiB0aGVuIGJsZW5kIHdpdGggdGhlIG90aGVyIHBpZWNlcyBvZiBzdGF0ZSB0byBwcm9kdWNlIHRoZSBGdWxsU3RhdGUuXG4gICAqL1xuXG4gIGV4cG9ydCB0eXBlIFNvdXJjZVJlc3VsdDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPVxuICAgIHwgU291cmNlT3B0aW9uR3JvdXA8Tz5bXVxuICAgIHwge1xuICAgICAgICBkYXRhOiBTb3VyY2VPcHRpb25Hcm91cDxPPltdO1xuICAgICAgICAvKipcbiAgICAgICAgICogT3JpZ2luYWwgdW5maWx0ZXJlZCBkYXRhLCBwcm92aWRlZCB3aGVuIHNlYXJjaCBmaWx0ZXJpbmcgaXMgYWN0aXZlLlxuICAgICAgICAgKiBVc2VkIGJ5IGBhbGxvd1NlbGVjdE5vbkxlYWZEdXJpbmdTZWFyY2hgIHRvIHNlbGVjdCBhbGwgY2hpbGRyZW4gb2ZcbiAgICAgICAgICogYSBwYXJlbnQsIGluY2x1ZGluZyB0aG9zZSBub3QgdmlzaWJsZSBpbiB0aGUgZmlsdGVyZWQgc2VhcmNoIHJlc3VsdHMuXG4gICAgICAgICAqL1xuICAgICAgICBvcmlnaW5hbERhdGE/OiBTb3VyY2VPcHRpb25Hcm91cDxPPltdO1xuICAgICAgfTtcblxuICBleHBvcnQgdHlwZSBTb3VyY2U8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0gKFxuICAgIHF1ZXJ5OiBDb3JlU3RhdGU8Tz5bJ3F1ZXJ5J10sXG4gICAgbW9zdFJlY2VudEFjdGlvbjogQWN0aW9uPE8+LFxuICApID0+IFByb21pc2U8U291cmNlUmVzdWx0PE8+PjtcblxuICAvLy8vLy8vLy8vLy8vXG4gIC8vIE1hbmFnZXIgLy9cbiAgLy8vLy8vLy8vLy8vL1xuXG4gIGV4cG9ydCB0eXBlIE1hbmFnZXI8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0ge1xuICAgIGFjdGlvbnM6IFN1YmplY3Q8QWN0aW9uPE8+PjtcbiAgICBzdGF0ZTogQ29ubmVjdGFibGU8RnVsbFN0YXRlPE8+PjtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBNYW5hZ2VyT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSB7XG4gICAgaW5pdGlhbFN0YXRlPzogRGVlcFBhcnRpYWw8Q29yZVN0YXRlPE8+PjtcbiAgICBhbGxvd011bHRpU2VsZWN0PzogYm9vbGVhbjtcbiAgICBhbGxvd1NlYXJjaD86IGJvb2xlYW47XG4gICAgYWxsb3dTZWxlY3RBbGw/OiBib29sZWFuO1xuICAgIGFsbG93T3JkZXI/OiBib29sZWFuO1xuICAgIHNlYXJjaFBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAgIGRpdmlkZXJzPzogYm9vbGVhbjtcbiAgICBpbmxpbmU/OiBib29sZWFuO1xuICAgIG1heEhlaWdodD86IHN0cmluZyB8IG51bGw7XG4gICAgbWF4V2lkdGg/OiBzdHJpbmcgfCBudWxsO1xuICAgIG1pbkhlaWdodD86IHN0cmluZyB8IG51bGw7XG4gICAgbWluV2lkdGg/OiBzdHJpbmcgfCBudWxsO1xuICAgIGRpc3BsYXlMaW1pdD86IG51bWJlcjtcbiAgICBzZWxlY3RlZE9wdGlvbkxpbWl0PzogbnVtYmVyO1xuICAgIHNob3dTaW5nbGVTZWxlY3RlZD86IGJvb2xlYW47XG4gICAgdXNlVG9wTGV2ZWxPcHRpb25zRm9yRGlzcGxheT86IGJvb2xlYW47XG4gICAgZ2V0Q3VzdG9tT3B0aW9uRGlzcGxheT86IChzZWxlY3RlZE9wdGlvbnM6IFNvdXJjZU9wdGlvbjxPPltdKSA9PiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCBub24tbGVhZiBub2RlcyAocGFyZW50cykgcmVtYWluIHNlbGVjdGFibGUgZHVyaW5nIHNlYXJjaCxcbiAgICAgKiBhbmQgc2VsZWN0aW5nIHRoZW0gd2lsbCBzZWxlY3QvZGVzZWxlY3QgQUxMIGNoaWxkcmVuIGZyb20gdGhlIG9yaWdpbmFsXG4gICAgICogZGF0YXNldCwgbm90IGp1c3QgdGhlIHZpc2libGUgZmlsdGVyZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIERlZmF1bHQ6IGZhbHNlIChjdXJyZW50IGJlaGF2aW9yIC0gcGFyZW50cyBhcmUgbm90IHNlbGVjdGFibGUgZHVyaW5nIHNlYXJjaClcbiAgICAgKi9cbiAgICBhbGxvd1NlbGVjdE5vbkxlYWZEdXJpbmdTZWFyY2g/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgb3B0aW9ucyB0aGF0IHdlcmUgc2VsZWN0ZWQgd2hlbiB0aGUgc2VsZWN0IHdhcyBvcGVuZWQgYXJlXG4gICAgICogc29ydGVkIHRvIHRoZSB0b3Agb2YgdGhlaXIgc2libGluZyBsaXN0cy4gU2V0IHRvIGZhbHNlIHRvIHByZXNlcnZlIHRoZVxuICAgICAqIG5hdHVyYWwgKG9yIGNob3NlbiBPcmRlckJ5KSBvcmRlciBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogRGVmYXVsdDogdGhlIHZhbHVlIG9mIGFsbG93TXVsdGlTZWxlY3RcbiAgICAgKi9cbiAgICBzb3J0U2VsZWN0ZWRUb1RvcD86IGJvb2xlYW47XG4gIH07XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1hbmFnZXI8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHNvdXJjZTogU291cmNlPE8+LFxuICAgIG9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxPPixcbiAgKTogTWFuYWdlcjxPPiB7XG4gICAgY29uc3QgZGVmYXVsdFN0YXRlOiBDb3JlU3RhdGU8Tz4gPSB7XG4gICAgICBxdWVyeToge1xuICAgICAgICBzZWFyY2g6ICcnLFxuICAgICAgICBvcmRlcjogJ3RpdGxlJyxcbiAgICAgIH0sXG4gICAgICBsb2FkOiB7XG4gICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH0sXG4gICAgICBzb3VyY2VPcHRpb25Hcm91cHM6IFtdLFxuICAgICAgb3JpZ2luYWxPcHRpb25Hcm91cHM6IFtdLFxuICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgIHNlbGVjdGVkOiBuZXcgT3B0aW9uU2V0KCksXG4gICAgICB9LFxuICAgICAgZGlzcGxheToge1xuICAgICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgICAgIG9wZW46IGZhbHNlLFxuICAgICAgICBleHBhbmRlZE9wdGlvbnM6IG5ldyBTZXQoKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBkZWZhdWx0ZWRJbml0aWFsU3RhdGU6IENvcmVTdGF0ZTxPPiA9IGRlZmF1bHRzRGVlcChcbiAgICAgIHt9LFxuICAgICAgb3B0aW9ucz8uaW5pdGlhbFN0YXRlLFxuICAgICAgZGVmYXVsdFN0YXRlLFxuICAgICk7XG5cbiAgICBjb25zdCBhY3Rpb25zOiBTdWJqZWN0PEFjdGlvbjxPPj4gPSBuZXcgU3ViamVjdCgpO1xuICAgIGNvbnN0IGludGVybmFsQWN0aW9uczogU3ViamVjdDxJbnRlcm5hbEFjdGlvbjxPPj4gPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgY29uc3QgY29yZVN0YXRlV2l0aFNlbGVjdGlvblNuYXBzaG90OiBPYnNlcnZhYmxlPFxuICAgICAgW0NvcmVTdGF0ZTxPPiwgT3B0aW9uU2V0PE8+XVxuICAgID4gPSBtZXJnZShhY3Rpb25zLCBpbnRlcm5hbEFjdGlvbnMpLnBpcGUoXG4gICAgICBzY2FuPEFjdGlvbjxPPiB8IEludGVybmFsQWN0aW9uPE8+LCBbQ29yZVN0YXRlPE8+LCBPcHRpb25TZXQ8Tz5dPihcbiAgICAgICAgKFtzdGF0ZSwgc25hcHNob3RdLCBhY3Rpb24pID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IHNpZGVFZmZlY3RzKFxuICAgICAgICAgICAgcmVkdWNlKHN0YXRlLCBhY3Rpb24sIG9wdGlvbnMpLFxuICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgaW50ZXJuYWxBY3Rpb25zLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb25TbmFwc2hvdCA9XG4gICAgICAgICAgICAoYWN0aW9uLnR5cGUgPT09ICdvcGVuQ2hhbmdlJyAmJiBhY3Rpb24ub3BlbikgfHxcbiAgICAgICAgICAgIChhY3Rpb24udHlwZSA9PT0gJ2xvYWRDb21wbGV0ZScgJiZcbiAgICAgICAgICAgICAgKG5ld1N0YXRlLmRpc3BsYXkub3BlbiB8fCBvcHRpb25zPy5pbmxpbmUpKVxuICAgICAgICAgICAgICA/IGNyZWF0ZVNlbGVjdGlvblNuYXBzaG90V2l0aEFuY2VzdG9ycyhuZXdTdGF0ZSlcbiAgICAgICAgICAgICAgOiBzbmFwc2hvdDtcblxuICAgICAgICAgIHJldHVybiBbbmV3U3RhdGUsIG5ld1NlbGVjdGlvblNuYXBzaG90XTtcbiAgICAgICAgfSxcbiAgICAgICAgW2RlZmF1bHRlZEluaXRpYWxTdGF0ZSwgbmV3IE9wdGlvblNldDxPPigpXSxcbiAgICAgICksXG4gICAgICBzdGFydFdpdGg8W0NvcmVTdGF0ZTxPPiwgT3B0aW9uU2V0PE8+XT4oW1xuICAgICAgICBkZWZhdWx0ZWRJbml0aWFsU3RhdGUsXG4gICAgICAgIG5ldyBPcHRpb25TZXQ8Tz4oKSxcbiAgICAgIF0pLFxuICAgICk7XG5cbiAgICBjb25zdCBzdGF0ZTogQ29ubmVjdGFibGU8RnVsbFN0YXRlPE8+PiA9IGNvbm5lY3RhYmxlKFxuICAgICAgY29yZVN0YXRlV2l0aFNlbGVjdGlvblNuYXBzaG90LnBpcGUoXG4gICAgICAgIG1hcCgoW3MsIHNlbGVjdGlvbkF0T3Blbl0pID0+IHtcbiAgICAgICAgICBjb25zdCBhbGxPcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdID1cbiAgICAgICAgICAgIHMuc291cmNlT3B0aW9uR3JvdXBzLm1hcChvcHRpb25Hcm91cCA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9uR3JvdXAsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uR3JvdXAub3B0aW9ucy5tYXAob3B0aW9uID0+XG4gICAgICAgICAgICAgICAgICBhdWdtZW50T3B0aW9uVG9GdWxsT3B0aW9uKHMsIG9wdGlvbiwgb3B0aW9ucyksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgdG9wTGV2ZWxPcHRpb25zID0gZ2V0VG9wTGV2ZWxPcHRpb25zKGFsbE9wdGlvbkdyb3Vwcyk7XG5cbiAgICAgICAgICBjb25zdCBzb3J0ZWRPcHRpb25Hcm91cHMgPVxuICAgICAgICAgICAgb3B0aW9ucz8uc29ydFNlbGVjdGVkVG9Ub3AgPz8gb3B0aW9ucz8uYWxsb3dNdWx0aVNlbGVjdFxuICAgICAgICAgICAgICA/IHNvcnRPcHRpb25zQnlQcmV2aW91c2x5U2VsZWN0ZWRTdGF0ZShcbiAgICAgICAgICAgICAgICAgIGFsbE9wdGlvbkdyb3VwcyxcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkF0T3BlbixcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogYWxsT3B0aW9uR3JvdXBzO1xuXG4gICAgICAgICAgY29uc3QgZGlzcGxheUxpbWl0ID0gb3B0aW9ucz8uZGlzcGxheUxpbWl0ID8/IERFRkFVTFRfRElTUExBWV9MSU1JVDtcbiAgICAgICAgICBjb25zdCBkaXNwbGF5TGltaXRlZE9wdGlvbkdyb3VwcyA9IGFwcGx5RGlzcGxheUxpbWl0KFxuICAgICAgICAgICAgc29ydGVkT3B0aW9uR3JvdXBzLFxuICAgICAgICAgICAgZGlzcGxheUxpbWl0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZnVsbE9wdGlvbkdyb3VwcyA9IGFwcGx5U2VsZWN0ZWRPcHRpb25MaW1pdChcbiAgICAgICAgICAgIHMsXG4gICAgICAgICAgICBkaXNwbGF5TGltaXRlZE9wdGlvbkdyb3VwcyxcbiAgICAgICAgICAgIHRvcExldmVsT3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zLFxuICAgICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgICAgLi4ucy5xdWVyeSxcbiAgICAgICAgICAgICAgc2hvd1NlYXJjaDpcbiAgICAgICAgICAgICAgICAhIXMucXVlcnkuc2VhcmNoIHx8XG4gICAgICAgICAgICAgICAgKCEhb3B0aW9ucz8uYWxsb3dTZWFyY2ggJiZcbiAgICAgICAgICAgICAgICAgIGNvdW50QWxsT3B0aW9ucyhhbGxPcHRpb25Hcm91cHMpID5cbiAgICAgICAgICAgICAgICAgICAgTUlOX09QVElPTlNfRk9SX0NPTlRST0xTKSB8fFxuICAgICAgICAgICAgICAgIGNvdW50QWxsT3B0aW9ucyhhbGxPcHRpb25Hcm91cHMpID4gZGlzcGxheUxpbWl0LFxuICAgICAgICAgICAgICBzZWFyY2hQbGFjZWhvbGRlcjogb3B0aW9ucz8uc2VhcmNoUGxhY2Vob2xkZXIgPz8gJ1NlYXJjaCcsXG4gICAgICAgICAgICAgIHNob3dPcmRlcjpcbiAgICAgICAgICAgICAgICAhIW9wdGlvbnM/LmFsbG93T3JkZXIgJiZcbiAgICAgICAgICAgICAgICAhcy5xdWVyeS5zZWFyY2ggJiZcbiAgICAgICAgICAgICAgICBjb3VudEFsbE9wdGlvbnMoYWxsT3B0aW9uR3JvdXBzKSA+IE1JTl9PUFRJT05TX0ZPUl9DT05UUk9MUyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmdWxsT3B0aW9uR3JvdXBzLFxuICAgICAgICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgICAgICAgIC4uLnMuc2VsZWN0aW9uLFxuICAgICAgICAgICAgICBhbGxvd011bHRpU2VsZWN0OiAhIW9wdGlvbnM/LmFsbG93TXVsdGlTZWxlY3QsXG4gICAgICAgICAgICAgIGFsbG93U2VsZWN0QWxsOlxuICAgICAgICAgICAgICAgICEhb3B0aW9ucz8uYWxsb3dTZWxlY3RBbGwgJiZcbiAgICAgICAgICAgICAgICBvcHRpb25zPy5zZWxlY3RlZE9wdGlvbkxpbWl0ID09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdmlzaWJsZVNlbGVjdGlvblN0YXRlOlxuICAgICAgICAgICAgICAgIGdldFBhcmVudE11bHRpU2VsZWN0aW9uU3RhdGUodG9wTGV2ZWxPcHRpb25zKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkaXNwbGF5OiB7XG4gICAgICAgICAgICAgIC4uLnMuZGlzcGxheSxcbiAgICAgICAgICAgICAgZm9ybWF0dGVkU2VsZWN0ZWRPcHRpb25zOiBnZXRGb3JtYXR0ZWRPcHRpb25zRm9yRGlzcGxheShcbiAgICAgICAgICAgICAgICBzLFxuICAgICAgICAgICAgICAgIHRvcExldmVsT3B0aW9ucyxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB6ZXJvU3RhdGVNZXNzYWdlOiBnZXRaZXJvU3RhdGVNZXNzYWdlKHMpLFxuICAgICAgICAgICAgICBkaXZpZGVyczogISFvcHRpb25zPy5kaXZpZGVycyxcbiAgICAgICAgICAgICAgaW5saW5lOiAhIW9wdGlvbnM/LmlubGluZSxcbiAgICAgICAgICAgICAgbWF4SGVpZ2h0OiBvcHRpb25zPy5tYXhIZWlnaHQgPz8gbnVsbCxcbiAgICAgICAgICAgICAgbWF4V2lkdGg6IG9wdGlvbnM/Lm1heFdpZHRoID8/IG51bGwsXG4gICAgICAgICAgICAgIG1pbkhlaWdodDogb3B0aW9ucz8ubWluSGVpZ2h0ID8/IG51bGwsXG4gICAgICAgICAgICAgIG1pbldpZHRoOiBvcHRpb25zPy5taW5XaWR0aCA/PyBudWxsLFxuICAgICAgICAgICAgICBkaXNwbGF5TGltaXRNZXNzYWdlOiBnZXREaXNwbGF5TGltaXRNZXNzYWdlKFxuICAgICAgICAgICAgICAgIGNvdW50VmlzaWJsZU9wdGlvbnMoZnVsbE9wdGlvbkdyb3VwcywgISFzLnF1ZXJ5LnNlYXJjaCksXG4gICAgICAgICAgICAgICAgY291bnRWaXNpYmxlT3B0aW9ucyhhbGxPcHRpb25Hcm91cHMsICEhcy5xdWVyeS5zZWFyY2gpLFxuICAgICAgICAgICAgICAgIHMucXVlcnksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHNob3dTaW5nbGVTZWxlY3RlZDogISFvcHRpb25zPy5zaG93U2luZ2xlU2VsZWN0ZWQsXG4gICAgICAgICAgICAgIHBpbGxDb3VudDogZ2V0UGlsbENvdW50Rm9yRGlzcGxheShzLCB0b3BMZXZlbE9wdGlvbnMsIG9wdGlvbnMpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICB7XG4gICAgICAgIGNvbm5lY3RvcjogKCkgPT4gbmV3IFJlcGxheVN1YmplY3QoMSksXG4gICAgICAgIHJlc2V0T25EaXNjb25uZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBzdGF0ZS5jb25uZWN0KCk7XG5cbiAgICAvLyBMb2FkIHRoZSBvcHRpb25zIGltbWVkaWF0ZWx5IGZvciBzZWxlY3RzIHRoYXQgYXJlIGRpc3BsYXllZCBpbmxpbmUuXG4gICAgaWYgKG9wdGlvbnM/LmlubGluZSkgYWN0aW9ucy5uZXh0KHsgdHlwZTogJ2xvYWQnIH0pO1xuXG4gICAgcmV0dXJuIHsgYWN0aW9ucywgc3RhdGUgfTtcbiAgfVxuXG4gIGV4cG9ydCB0eXBlIEluTWVtb3J5TWFuYWdlck9wdGlvbnM8TyBleHRlbmRzIEJhc2VPcHRpb24+ID1cbiAgICBNYW5hZ2VyT3B0aW9uczxPPiAmIHtcbiAgICAgIGZ1c2VPcHRpb25zPzogSUZ1c2VPcHRpb25zPE8+O1xuICAgIH07XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUluTWVtb3J5TWFuYWdlcjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgZmV0Y2hEYXRhc2V0OiAoKSA9PiBQcm9taXNlPE9wdGlvbkdyb3VwPE8+W10+IHwgT3B0aW9uR3JvdXA8Tz5bXSxcbiAgICBvcHRpb25zPzogSW5NZW1vcnlNYW5hZ2VyT3B0aW9uczxPPixcbiAgKTogTWFuYWdlcjxPPiB7XG4gICAgbGV0IGRhdGE6IE9wdGlvbkdyb3VwPE8+W107XG4gICAgbGV0IGZ1c2U6IEZ1c2U8Tz47XG4gICAgbGV0IGV4YWN0TWF0Y2g6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBsZXQgcGFyZW50czogTWFwPE9bJ2lkJ10sIE9bJ2lkJ10+O1xuICAgIGxldCBjaGlsZHJlbjogTWFwPE9bJ2lkJ10sIE9bJ2lkJ11bXT47XG5cbiAgICBjb25zdCBzb3VyY2U6IFNvdXJjZTxPPiA9IGFzeW5jIChxdWVyeSwgbW9zdFJlY2VudEFjdGlvbikgPT4ge1xuICAgICAgLypcbiAgICAgICAgUmUtZmV0Y2ggdGhlIG9wdGlvbnMgb24gdGhlIGxvYWQgYWN0aW9uLCBhbmQgcmVidWlsZCB0aGUgc3RhdGVcbiAgICAgICAgZGVyaXZlZCBmcm9tIHRoZSBvcHRpb24gZGF0YS5cbiAgICAgICovXG4gICAgICBpZiAoXG4gICAgICAgIG1vc3RSZWNlbnRBY3Rpb24udHlwZSA9PT0gJ2xvYWQnIHx8XG4gICAgICAgIG1vc3RSZWNlbnRBY3Rpb24udHlwZSA9PT0gJ29wZW5DaGFuZ2UnXG4gICAgICApIHtcbiAgICAgICAgZGF0YSA9IGF3YWl0IGZldGNoRGF0YXNldCgpO1xuICAgICAgICBjb25zdCB0b3BMZXZlbE9wdGlvbnMgPSBnZXRUb3BMZXZlbE9wdGlvbnMoZGF0YSk7XG5cbiAgICAgICAgZnVzZSA9IG5ldyBGdXNlKGZsYXR0ZW5PcHRpb25zKHRvcExldmVsT3B0aW9ucywgZmFsc2UpLCB7XG4gICAgICAgICAgdGhyZXNob2xkOiAwLjIsXG4gICAgICAgICAga2V5czogWyd0aXRsZSddLFxuICAgICAgICAgIGluY2x1ZGVTY29yZTogdHJ1ZSxcbiAgICAgICAgICBpbmNsdWRlTWF0Y2hlczogdHJ1ZSxcbiAgICAgICAgICAuLi5vcHRpb25zPy5mdXNlT3B0aW9ucyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXhhY3RNYXRjaCA9IG9wdGlvbnM/LmZ1c2VPcHRpb25zPy50aHJlc2hvbGQgPT0gMDtcbiAgICAgICAgW3BhcmVudHMsIGNoaWxkcmVuXSA9IGdldFJlbGF0aW9uc2hpcE1hcHModG9wTGV2ZWxPcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgLy8gTGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIHNob3VsZG4ndCBhZmZlY3QgZnV6enkgbWF0Y2hpbmcgKEZ1c2VcbiAgICAgIC8vIHNjb3JlcyB0aGUgcGF0dGVybidzIGxlbmd0aCBhZ2FpbnN0IHRoZSB0ZXh0J3MsIHNvIGEgc3RyYXkgc3BhY2VcbiAgICAgIC8vIGNoYW5nZXMgcmVzdWx0cyBpbiBzdXJwcmlzaW5nIHdheXMpOyBhIHNlYXJjaCBzdHJpbmcgb2Ygb25seVxuICAgICAgLy8gd2hpdGVzcGFjZSBpcyB0cmVhdGVkIHRoZSBzYW1lIGFzIG5vIHNlYXJjaC5cbiAgICAgIGNvbnN0IHNlYXJjaCA9IHF1ZXJ5LnNlYXJjaC50cmltKCk7XG5cbiAgICAgIC8qXG4gICAgICAgIElmIHRoZSB1c2VyIGlzIG5vdCBzZWFyY2hpbmcgb3B0aW9ucywgcmV0dXJuIHRoZSBmdWxsIHNldCBvZiBvcHRpb25zXG4gICAgICAgIHNvcnRlZCBhcHByb3ByaWF0ZWx5LlxuICAgICAgKi9cbiAgICAgIGlmICghc2VhcmNoKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAgVGhlIGBzb3VyY2VgIG9yZGVyIHByb3BlcnR5IGFsbG93cyBmb3Igb3B0aW5nIG91dCBvZiBhdXRvbWF0aWNcbiAgICAgICAgICBzb3J0aW5nLCByZXR1cm5pbmcgdGhlIGRhdGEgaW4gaXRzIG5hdHVyYWwgaW5wdXQgb3JkZXIuXG4gICAgICAgICovXG4gICAgICAgIGlmIChxdWVyeS5vcmRlciA9PT0gJ3NvdXJjZScpIHJldHVybiBkYXRhO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAgU29ydCB0aGUgb3B0aW9ucyBieSB0aXRsZSBhbmQgc3VidGl0bGUuXG4gICAgICAgICovXG4gICAgICAgIGlmIChxdWVyeS5vcmRlciA9PT0gJ3RpdGxlJykge1xuICAgICAgICAgIGZ1bmN0aW9uIHNvcnRCeVRpdGxlKG9wdGlvbnM6IE9wdGlvbjxPPltdKTogT3B0aW9uPE8+W10ge1xuICAgICAgICAgICAgcmV0dXJuIHNvcnRCeShvcHRpb25zLCBbXG4gICAgICAgICAgICAgIChvOiBPcHRpb248Tz4pID0+IG8udGl0bGUudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgICAgKG86IE9wdGlvbjxPPikgPT4gby5zdWJ0aXRsZT8udG9Mb3dlckNhc2UoKSA/PyAnJyxcbiAgICAgICAgICAgIF0pLm1hcChvcHRpb24gPT4gKHtcbiAgICAgICAgICAgICAgLi4ub3B0aW9uLFxuICAgICAgICAgICAgICBjaGlsZHJlbjogb3B0aW9uLmNoaWxkcmVuPy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHNvcnRCeVRpdGxlKG9wdGlvbi5jaGlsZHJlbilcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZGF0YS5tYXAoZ3JvdXAgPT4gKHtcbiAgICAgICAgICAgIC4uLmdyb3VwLFxuICAgICAgICAgICAgb3B0aW9uczogc29ydEJ5VGl0bGUoZ3JvdXAub3B0aW9ucyksXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgICBTb3J0IHRoZSBvcHRpb25zIGJ5IGNvdW50LCB0aGVuIGJ5IHRpdGxlLCB0aGVuIGJ5IHN1YnRpdGxlLlxuICAgICAgICAqL1xuICAgICAgICBpZiAocXVlcnkub3JkZXIgPT09ICdjb3VudCcpIHtcbiAgICAgICAgICBmdW5jdGlvbiBzb3J0QnlDb3VudChvcHRpb25zOiBPcHRpb248Tz5bXSk6IE9wdGlvbjxPPltdIHtcbiAgICAgICAgICAgIHJldHVybiBzb3J0Qnkob3B0aW9ucywgW1xuICAgICAgICAgICAgICAobzogT3B0aW9uPE8+KSA9PiAoaXNOdW1iZXIoby5jb3VudCkgPyAtby5jb3VudCA6IEluZmluaXR5KSxcbiAgICAgICAgICAgICAgKG86IE9wdGlvbjxPPikgPT4gby50aXRsZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAobzogT3B0aW9uPE8+KSA9PiBvLnN1YnRpdGxlPy50b0xvd2VyQ2FzZSgpID8/ICcnLFxuICAgICAgICAgICAgXSkubWFwKG9wdGlvbiA9PiAoe1xuICAgICAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aFxuICAgICAgICAgICAgICAgID8gc29ydEJ5Q291bnQob3B0aW9uLmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBkYXRhLm1hcChncm91cCA9PiAoe1xuICAgICAgICAgICAgLi4uZ3JvdXAsXG4gICAgICAgICAgICBvcHRpb25zOiBzb3J0QnlDb3VudChncm91cC5vcHRpb25zKSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAgRXhlY3V0ZSB0aGUgc2VhcmNoIHdpdGggZnVzZS4gT25jZSB3ZSBoYXZlIHRoZSBzZWFyY2ggbWF0Y2ggZGF0YSxcbiAgICAgICAgcmVidWlsZCBqdXN0IGFzIG11Y2ggb2YgdGhlIHRyZWUgYXMgaXMgbmVlZGVkIHRvIHJlbmRlciB0aGUgc2VhcmNoXG4gICAgICAgIHJlc3VsdHMuIFNwZWNpZmljYWxseSwgYW55IG1hdGNoIHdpbGwgbmVlZCBhbGwgb2YgaXRzIGFuY2VzdG9ycyAoc29cbiAgICAgICAgdGhhdCBtYXRjaGVkIGxlYWYgbm9kZXMgYXJlIHNob3duIG5lc3RlZCB1bmRlciB0aGVpciBhbmNlc3RvcnMpIGFuZCBhbGxcbiAgICAgICAgb2YgaXRzIGNoaWxkcmVuIChiZWNhdXNlIGEgbWF0Y2hpbmcgcGFyZW50IG1lYW5zIHRoYXQgYWxsIG9mIGl0c1xuICAgICAgICBkZXNjZW5kYW50cyBtYXRjaCB0b28sIHBlciB0aGUgZGVzaWduIHNwZWNpZmljYXRpb24pLCB3aGV0aGVyIHRoZXlcbiAgICAgICAgdGhlbXNlbHZlcyBtYXRjaGVkIG9yIG5vdC5cbiAgICAgICovXG4gICAgICBjb25zdCBtYXRjaGVkT3B0aW9uczogRnVzZVJlc3VsdDxPPltdID0gZnVzZS5zZWFyY2goc2VhcmNoKTtcbiAgICAgIGNvbnN0IG1hdGNoZWRJZHM6IFNldDxPWydpZCddPiA9IG5ldyBTZXQoXG4gICAgICAgIG1hdGNoZWRPcHRpb25zLm1hcChyZXN1bHQgPT4gcmVzdWx0Lml0ZW0uaWQpLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgbWF0Y2hBbmNlc3RvcnM6IFNldDxPWydpZCddPiA9IG5ldyBTZXQoKTtcbiAgICAgIGZ1bmN0aW9uIGNvbGxlY3RBbmNlc3RvcnMoaWRzOiBPWydpZCddW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHBhcmVudHMuZ2V0KGlkKTtcbiAgICAgICAgICBpZiAocGFyZW50SWQpIHtcbiAgICAgICAgICAgIG1hdGNoQW5jZXN0b3JzLmFkZChwYXJlbnRJZCk7XG4gICAgICAgICAgICBjb2xsZWN0QW5jZXN0b3JzKFtwYXJlbnRJZF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29sbGVjdEFuY2VzdG9ycyhbLi4ubWF0Y2hlZElkc10pO1xuXG4gICAgICBjb25zdCBtYXRjaERlc2NlbmRhbnRzOiBTZXQ8T1snaWQnXT4gPSBuZXcgU2V0KCk7XG4gICAgICBmdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudHMoaWRzOiBPWydpZCddW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICBjb25zdCBjaGlsZHJlbklkcyA9IGNoaWxkcmVuLmdldChpZCk7XG4gICAgICAgICAgaWYgKGNoaWxkcmVuSWRzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuSWRzKSB7XG4gICAgICAgICAgICAgIG1hdGNoRGVzY2VuZGFudHMuYWRkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbGxlY3REZXNjZW5kYW50cyhjaGlsZHJlbklkcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb2xsZWN0RGVzY2VuZGFudHMoWy4uLm1hdGNoZWRJZHNdKTtcblxuICAgICAgLypcbiAgICAgICAgTmV4dCwgd2UnbGwgY29tYmluZSBhbGwgdGhlIG1hdGNoZWQgSURzIHdpdGggdGhlaXIgZGlyZWN0IGFuY2VzdG9ycyBhbmRcbiAgICAgICAgZGVzY2FuZGFudHMsIGFuZCBmaWx0ZXIgdGhlIG9yaWdpbmFsIGRhdGEgc2V0IGRvd24gdG8ganVzdCB0aGVzZVxuICAgICAgICBvcHRpb25zLlxuICAgICAgKi9cbiAgICAgIGNvbnN0IGZpbHRlcmVkSWRzOiBTZXQ8T1snaWQnXT4gPSBuZXcgU2V0KFtcbiAgICAgICAgLi4ubWF0Y2hlZElkcyxcbiAgICAgICAgLi4ubWF0Y2hBbmNlc3RvcnMsXG4gICAgICAgIC4uLm1hdGNoRGVzY2VuZGFudHMsXG4gICAgICBdKTtcblxuICAgICAgZnVuY3Rpb24gZmlsdGVyT3B0aW9ucyhvcHRpb25zOiBPcHRpb248Tz5bXSk6IE9wdGlvbjxPPltdIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWRPcHRpb25zOiBPcHRpb248Tz5bXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgaWYgKGZpbHRlcmVkSWRzLmhhcyhvcHRpb24uaWQpKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZE9wdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAgICAgY2hpbGRyZW46IG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBmaWx0ZXJPcHRpb25zKG9wdGlvbi5jaGlsZHJlbilcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsdGVyZWRPcHRpb25zO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsdGVyZWRPcHRpb25zID0gZmlsdGVyT3B0aW9ucyhnZXRUb3BMZXZlbE9wdGlvbnMoZGF0YSkpO1xuXG4gICAgICAvKlxuICAgICAgICBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGFuIGFycmF5IG9mIGRpc3RpbmN0IHRyZWVzICh0b3AtbGV2ZWwgb3B0aW9ucyksXG4gICAgICAgIGZpbHRlcmVkIGRvd24gdG8gb25seSB0aGUgb3B0aW9ucyBtYXRjaGluZyB0aGUgc2VhcmNoIHF1ZXJ5LiBOb3RlIHRoYXRcbiAgICAgICAgd2UgZG9uJ3QgY2FyZSBhYm91dCBzZWN0aW9uIGhlYWRlcnMgd2hlbiBzZWFyY2hpbmcgc2luY2UgcmVzdWx0cyBzaG91bGRcbiAgICAgICAgYmUgb3JkZXJlZCBieSByZWxldmFuY2UuIFRvIGNhbGN1bGF0ZSB0aGUgb3JkZXIgb2YgdGhlc2UgdHJlZXMsIHdlJ2xsXG4gICAgICAgIHRha2UgdGhlIHRvdGFsIG1hdGNoIHNjb3JlcyBmb3Igb3B0aW9ucyBmb3VuZCBpbiB0aGUgdHJlZSwgZGl2aWRlZCBieVxuICAgICAgICB0aGUgY291bnQgb2YgbWF0Y2hlcyBpbiB0aGUgdHJlZSAodGhlIGJlc3QgYXZlcmFnZSBtYXRjaCBzY29yZSkuXG4gICAgICAqL1xuXG4gICAgICBjb25zdCBzY29yZU1hcDogTWFwPE9bJ2lkJ10sIG51bWJlcj4gPSBuZXcgTWFwKFxuICAgICAgICBtYXRjaGVkT3B0aW9ucy5tYXAocmVzdWx0ID0+IFtyZXN1bHQuaXRlbS5pZCwgcmVzdWx0LnNjb3JlID8/IDBdKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBvcmRlcmVkID0gc29ydEJ5KGZpbHRlcmVkT3B0aW9ucywgKG9wdGlvbjogT3B0aW9uPE8+KTogbnVtYmVyID0+IHtcbiAgICAgICAgZnVuY3Rpb24gY2FsY3VsYXRlU2NvcmUob3B0aW9uOiBPcHRpb248Tz4pOiBudW1iZXIge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoc2NvcmVNYXAuZ2V0KG9wdGlvbi5pZCkgPz8gMCkgK1xuICAgICAgICAgICAgKG9wdGlvbi5jaGlsZHJlbiA/PyBbXSkucmVkdWNlKFxuICAgICAgICAgICAgICAoc2NvcmUsIGNoaWxkKSA9PiBzY29yZSArIGNhbGN1bGF0ZVNjb3JlKGNoaWxkKSxcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZUNvdW50KG9wdGlvbjogT3B0aW9uPE8+KTogbnVtYmVyIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgMSArXG4gICAgICAgICAgICAob3B0aW9uLmNoaWxkcmVuID8/IFtdKS5yZWR1Y2UoXG4gICAgICAgICAgICAgIChjb3VudCwgY2hpbGQpID0+IGNvdW50ICsgY2FsY3VsYXRlQ291bnQoY2hpbGQpLFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG90YWxTY29yZSA9IGNhbGN1bGF0ZVNjb3JlKG9wdGlvbik7XG4gICAgICAgIGNvbnN0IHRvdGFsQ291bnQgPSBjYWxjdWxhdGVDb3VudChvcHRpb24pO1xuICAgICAgICByZXR1cm4gdG90YWxTY29yZSAvIHRvdGFsQ291bnQ7XG4gICAgICB9KTtcblxuICAgICAgLypcbiAgICAgICAgRmluYWxseSwgd2UnbGwgYWRkIGhpZ2hsaWdodCBpbmRpY2VzIHRvIHRoZSBtYXRjaGVzIHNvIHRoYXQgdGhleSBjYW4gYmVcbiAgICAgICAgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgICAgKi9cblxuICAgICAgdHlwZSBIaWdobGlnaHRzID0ge1xuICAgICAgICB0aXRsZUhpZ2hsaWdodEluZGljZXM/OiBIaWdobGlnaHRDb21wb25lbnQuSGlnaGxpZ2h0SW5kaWNlc1tdO1xuICAgICAgICBzdWJ0aXRsZUhpZ2hsaWdodEluZGljZXM/OiBIaWdobGlnaHRDb21wb25lbnQuSGlnaGxpZ2h0SW5kaWNlc1tdO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGhpZ2hsaWdodE1hcDogTWFwPE9bJ2lkJ10sIEhpZ2hsaWdodHM+ID0gbmV3IE1hcChcbiAgICAgICAgbWF0Y2hlZE9wdGlvbnMubWFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgY29uc3QgaGlnaGxpZ2h0czogSGlnaGxpZ2h0cyA9IHt9O1xuICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgcmVzdWx0Lm1hdGNoZXMgPz8gW10pIHtcbiAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgaW5leGFjdCBtYXRjaGVzXG4gICAgICAgICAgICBpZiAoZXhhY3RNYXRjaCAmJiBtYXRjaC52YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIG1hdGNoLmluZGljZXMgPSBtYXRjaC5pbmRpY2VzLmZpbHRlcihcbiAgICAgICAgICAgICAgICBpc0Z1c2VNYXRjaEV4YWN0KG1hdGNoLCBzZWFyY2gpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoLmtleSA9PT0gJ3RpdGxlJykge1xuICAgICAgICAgICAgICBoaWdobGlnaHRzLnRpdGxlSGlnaGxpZ2h0SW5kaWNlcyA9IFsuLi5tYXRjaC5pbmRpY2VzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaC5rZXkgPT09ICdzdWJ0aXRsZScpIHtcbiAgICAgICAgICAgICAgaGlnaGxpZ2h0cy5zdWJ0aXRsZUhpZ2hsaWdodEluZGljZXMgPSBbLi4ubWF0Y2guaW5kaWNlc107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbcmVzdWx0Lml0ZW0uaWQsIGhpZ2hsaWdodHNdO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBmdW5jdGlvbiBhZGRIaWdobGlnaHRzVG9PcHRpb24ob3B0aW9uczogT3B0aW9uPE8+W10pOiBTb3VyY2VPcHRpb248Tz5bXSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLm1hcChvcHRpb24gPT4gKHtcbiAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgLi4uaGlnaGxpZ2h0TWFwLmdldChvcHRpb24uaWQpLFxuICAgICAgICAgIC4uLihvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aFxuICAgICAgICAgICAgPyB7IGNoaWxkcmVuOiBhZGRIaWdobGlnaHRzVG9PcHRpb24ob3B0aW9uLmNoaWxkcmVuKSB9XG4gICAgICAgICAgICA6IG51bGwpLFxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IFt7IG9wdGlvbnM6IGFkZEhpZ2hsaWdodHNUb09wdGlvbihvcmRlcmVkKSB9XSxcbiAgICAgICAgb3JpZ2luYWxEYXRhOiBkYXRhLFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNyZWF0ZU1hbmFnZXIoc291cmNlLCBvcHRpb25zKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpc0Z1c2VNYXRjaEV4YWN0KFxuICAgIG1hdGNoOiBGdXNlUmVzdWx0TWF0Y2gsXG4gICAgc2VhcmNoOiBzdHJpbmcsXG4gICk6IChcbiAgICB2YWx1ZTogUmFuZ2VUdXBsZSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGFycmF5OiByZWFkb25seSBSYW5nZVR1cGxlW10sXG4gICkgPT4gYm9vbGVhbiB7XG4gICAgcmV0dXJuIG1hdGNoZWRJbmRpY2VzID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoZWRWYWx1ZSA9IG1hdGNoXG4gICAgICAgIC52YWx1ZSEuc2xpY2UobWF0Y2hlZEluZGljZXNbMF0sIG1hdGNoZWRJbmRpY2VzWzFdICsgMSlcbiAgICAgICAgLnRvTG93ZXJDYXNlKCk7XG4gICAgICAvLyBmdXNlIGlzIHdlaXJkIHdpdGggaXQncyBtYXRjaGVzLiBGb3IgYSB0ZXh0IG9mIFwicGxhbm5pbmdcIiBhbmQgYSBzZWFyY2ggc3RyaW5nIG9mIFwicGxhblwiXG4gICAgICAvLyB0aGUgbWF0Y2hlZCB2YWx1ZSB3aWxsIGJlIFwicGxhbm5cIiB3aXRoIHRoZSBleHRyYSAnbicgYmVjYXVzZSBvZiBpdHMgZnV6enkgbWF0Y2hpbmcuXG4gICAgICAvLyBzbyBqdXN0IG1ha2Ugc3VyZSB0aGUgbWF0Y2hlZCB2YWx1ZSBhdCBsZWFzdCBzdGFydHMgd2l0aCB0aGUgc2VhcmNoIHN0cmluZy5cbiAgICAgIC8vIGl0J3MgZXh0cmEgd2VpcmQgYmVjYXVzZSBmb3IgYSB0ZXh0IG9mIFwiYW5hbHl0aWNzXCIgYW5kIGEgc2VhcmNoIHN0cmluZyBvZiBcIm5hbHl0aWNzXCIsXG4gICAgICAvLyB0aGUgbWF0Y2hlZCB2YWx1ZSB3aWxsIGJlIFwiYW5hbHl0aWNzXCIuIFNvIHdlIGp1c3QgbmVlZCB0byBtYWtlIHN1cmUgdGhlIHRoZSBtYXRjaGVkIHZhbHVlXG4gICAgICAvLyBpbmNsdWRlcyB0aGUgc2VhcmNoIHN0cmluZyBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIGV4dHJhIHN0dWZmIG9uIHRoZSBmcm9udCBvciB0aGUgZW5kLlxuICAgICAgcmV0dXJuIG1hdGNoZWRWYWx1ZS5pbmNsdWRlcyhzZWFyY2gudG9Mb3dlckNhc2UoKSk7XG4gICAgfTtcbiAgfVxuXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gU3RhdGUgcmVkdWNlciAod2l0aCBoZWxwZXJzKSAvL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgZnVuY3Rpb24gY3JlYXRlU2VsZWN0aW9uU25hcHNob3RXaXRoQW5jZXN0b3JzPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICApOiBPcHRpb25TZXQ8Tz4ge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gbmV3IE9wdGlvblNldChzdGF0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICAgIGNvbnN0IHRvcExldmVsT3B0aW9ucyA9IGdldFRvcExldmVsT3B0aW9ucyhzdGF0ZS5zb3VyY2VPcHRpb25Hcm91cHMpO1xuICAgIGNvbnN0IFtwYXJlbnRzXSA9IGdldFJlbGF0aW9uc2hpcE1hcHModG9wTGV2ZWxPcHRpb25zKTtcblxuICAgIC8vIFNpYmxpbmcgbGVhdmVzIHNoYXJlIGFuY2VzdG9ycywgc28gb25jZSB3ZSd2ZSB3YWxrZWQgdXAgdGhyb3VnaCBhXG4gICAgLy8gZ2l2ZW4gcGFyZW50IGlkIHdlIGNhbiBzdG9wIOKAlCBhbnl0aGluZyBhYm92ZSBpdCBoYXMgYWxyZWFkeSBiZWVuXG4gICAgLy8gYWRkZWQgYnkgYSBwcmV2aW91cyBpdGVyYXRpb24uIFdpdGhvdXQgdGhpcyBzaG9ydC1jaXJjdWl0IHRoZSBsb29wXG4gICAgLy8gcmUtcnVucyBmaW5kT3B0aW9uICh3aGljaCBpcyBhIGZ1bGwgdHJlZSB3YWxrKSBvbmNlIHBlciBzaGFyZWRcbiAgICAvLyBhbmNlc3RvciBlZGdlLCB3aGljaCB3YXMgdGhlICMyIGhvdHNwb3QgYmVoaW5kIE9wdGlvblNldC5hZGQgaW5cbiAgICAvLyBSVlQtMjU0NzAncyBwcm9maWxlLlxuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PE9bJ2lkJ10+KCk7XG4gICAgZm9yIChjb25zdCBzZWxlY3RlZE9wdGlvbiBvZiBzdGF0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQpIHtcbiAgICAgIGxldCBwYXJlbnRJZCA9IHBhcmVudHMuZ2V0KHNlbGVjdGVkT3B0aW9uLmlkKTtcbiAgICAgIHdoaWxlIChwYXJlbnRJZCAhPT0gdW5kZWZpbmVkICYmICF2aXNpdGVkLmhhcyhwYXJlbnRJZCkpIHtcbiAgICAgICAgdmlzaXRlZC5hZGQocGFyZW50SWQpO1xuICAgICAgICBjb25zdCBwYXJlbnRPcHRpb24gPSBmaW5kT3B0aW9uKHRvcExldmVsT3B0aW9ucywgcGFyZW50SWQpO1xuICAgICAgICBpZiAocGFyZW50T3B0aW9uKSB7XG4gICAgICAgICAgc25hcHNob3QuYWRkKHBhcmVudE9wdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcGFyZW50SWQgPSBwYXJlbnRzLmdldChwYXJlbnRJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RGlzcGxheUxpbWl0TWVzc2FnZTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgZGlzcGxheWVkT3B0aW9uQ291bnQ6IG51bWJlcixcbiAgICB0b3RhbE9wdGlvbkNvdW50OiBudW1iZXIsXG4gICAgcXVlcnk6IENvcmVTdGF0ZTxPPlsncXVlcnknXSxcbiAgKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKGRpc3BsYXllZE9wdGlvbkNvdW50ID09PSB0b3RhbE9wdGlvbkNvdW50KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByaXZOdW1iZXIgPSBuZXcgTnVtYmVyUGlwZSgpO1xuICAgIGNvbnN0IGRpc3BsYXllZCA9IHJpdk51bWJlci50cmFuc2Zvcm0oZGlzcGxheWVkT3B0aW9uQ291bnQpO1xuICAgIGNvbnN0IHRvdGFsID0gcml2TnVtYmVyLnRyYW5zZm9ybSh0b3RhbE9wdGlvbkNvdW50KTtcbiAgICBjb25zdCBzdGFydCA9IGBTaG93aW5nICR7ZGlzcGxheWVkfSBvZiAke3RvdGFsfSBvcHRpb25zYDtcbiAgICByZXR1cm4gcXVlcnkuc2VhcmNoID8gYCR7c3RhcnR9IG1hdGNoaW5nIFwiJHtxdWVyeS5zZWFyY2h9XCJgIDogc3RhcnQ7XG4gIH1cblxuICBmdW5jdGlvbiBjb3VudFZpc2libGVPcHRpb25zPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdLFxuICAgIGxlYWZPbmx5OiBib29sZWFuLFxuICApOiBudW1iZXIge1xuICAgIGZ1bmN0aW9uIGNvdW50KG9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSk6IG51bWJlciB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5yZWR1Y2UoKGFjYywgb3B0aW9uKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb24uZXhwYW5kZWQgJiYgb3B0aW9uLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gYWNjICsgKGxlYWZPbmx5ID8gMCA6IDEpICsgY291bnQob3B0aW9uLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjICsgMTtcbiAgICAgIH0sIDApO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25Hcm91cHMucmVkdWNlKFxuICAgICAgKHRvdGFsLCBncm91cCkgPT4gdG90YWwgKyBjb3VudChncm91cC5vcHRpb25zKSxcbiAgICAgIDAsXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvdW50QWxsT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uR3JvdXBzOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSxcbiAgKTogbnVtYmVyIHtcbiAgICBmdW5jdGlvbiBjb3VudChvcHRpb25zOiBGdWxsT3B0aW9uPE8+W10pOiBudW1iZXIge1xuICAgICAgcmV0dXJuIG9wdGlvbnMucmVkdWNlKChhY2MsIG9wdGlvbikgPT4ge1xuICAgICAgICBpZiAob3B0aW9uLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gYWNjICsgMSArIGNvdW50KG9wdGlvbi5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYyArIDE7XG4gICAgICB9LCAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9uR3JvdXBzLnJlZHVjZShcbiAgICAgICh0b3RhbCwgZ3JvdXApID0+IHRvdGFsICsgY291bnQoZ3JvdXAub3B0aW9ucyksXG4gICAgICAwLFxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseURpc3BsYXlMaW1pdDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uR3JvdXBzOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSxcbiAgICBkaXNwbGF5TGltaXQ6IG51bWJlcixcbiAgKTogRnVsbE9wdGlvbkdyb3VwPE8+W10ge1xuICAgIHR5cGUgRGlzcGxheUxpbWl0T3B0aW9ucyA9IFtGdWxsT3B0aW9uPE8+W10sIG51bWJlcl07XG4gICAgZnVuY3Rpb24gZmlsdGVyV2l0aExpbWl0KFxuICAgICAgb3B0aW9uczogRnVsbE9wdGlvbjxPPltdLFxuICAgICAgcmVtYWluaW5nOiBudW1iZXIsXG4gICAgKTogRGlzcGxheUxpbWl0T3B0aW9ucyB7XG4gICAgICBsZXQgbGVmdCA9IHJlbWFpbmluZztcbiAgICAgIGNvbnN0IHZpc2libGVPcHRpb25zOiBGdWxsT3B0aW9uPE8+W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGxlZnQgPD0gMCkgYnJlYWs7XG5cbiAgICAgICAgaWYgKG9wdGlvbi5leHBhbmRlZCAmJiBvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IFtjaGlsZE9wdGlvbnMsIGNoaWxkUmVtYWluaW5nXSA9IGZpbHRlcldpdGhMaW1pdChcbiAgICAgICAgICAgIG9wdGlvbi5jaGlsZHJlbixcbiAgICAgICAgICAgIGxlZnQgLSAxLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdmlzaWJsZU9wdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRPcHRpb25zLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGxlZnQgPSBjaGlsZFJlbWFpbmluZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2aXNpYmxlT3B0aW9ucy5wdXNoKG9wdGlvbik7XG4gICAgICAgICAgbGVmdC0tO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gW3Zpc2libGVPcHRpb25zLCBsZWZ0XTtcbiAgICB9XG5cbiAgICB0eXBlIERpc3BsYXlMaW1pdEdyb3VwcyA9IFtGdWxsT3B0aW9uR3JvdXA8Tz5bXSwgbnVtYmVyXTtcbiAgICBjb25zdCBzdGFydGluZ1ZhbHVlOiBEaXNwbGF5TGltaXRHcm91cHMgPSBbW10sIGRpc3BsYXlMaW1pdF07XG4gICAgY29uc3QgW3Jlc29sdmVkR3JvdXBzXSA9IG9wdGlvbkdyb3Vwcy5yZWR1Y2U8RGlzcGxheUxpbWl0R3JvdXBzPihcbiAgICAgIChbZ3JvdXBzLCByZW1haW5pbmddLCBncm91cCkgPT4ge1xuICAgICAgICBjb25zdCBbb3B0aW9ucywgbGVmdEFmdGVyXSA9IGZpbHRlcldpdGhMaW1pdChncm91cC5vcHRpb25zLCByZW1haW5pbmcpO1xuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gW1suLi5ncm91cHMsIHsgLi4uZ3JvdXAsIG9wdGlvbnMgfV0sIGxlZnRBZnRlcl07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFtncm91cHMsIHJlbWFpbmluZ107XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzdGFydGluZ1ZhbHVlLFxuICAgICk7XG5cbiAgICByZXR1cm4gcmVzb2x2ZWRHcm91cHM7XG4gIH1cblxuICAvKlxuICAgIFNvcnQgb3B0aW9ucyBzbyB0aGF0IHByZXZpb3VzbHkgc2VsZWN0ZWQgb3B0aW9ucyAoZnJvbSBwcmlvciBzZXNzaW9ucylcbiAgICBhcHBlYXIgYXQgdGhlIHRvcCBvZiB0aGVpciBwZWVyL3NpYmxpbmcgbGlzdHMuXG4gICovXG4gIGZ1bmN0aW9uIHNvcnRPcHRpb25zQnlQcmV2aW91c2x5U2VsZWN0ZWRTdGF0ZTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uR3JvdXBzOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSxcbiAgICBzZWxlY3Rpb25BdE9wZW46IE9wdGlvblNldDxPPixcbiAgKTogRnVsbE9wdGlvbkdyb3VwPE8+W10ge1xuICAgIGZ1bmN0aW9uIHNvcnRPcHRpb25zKG9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSk6IEZ1bGxPcHRpb248Tz5bXSB7XG4gICAgICByZXR1cm4gc29ydEJ5KG9wdGlvbnMsIG9wdGlvbiA9PiAhc2VsZWN0aW9uQXRPcGVuLmhhcyhvcHRpb24pKS5tYXAoXG4gICAgICAgIG9wdGlvbiA9PiB7XG4gICAgICAgICAgaWYgKG9wdGlvbi5jaGlsZHJlbikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4ub3B0aW9uLFxuICAgICAgICAgICAgICBjaGlsZHJlbjogc29ydE9wdGlvbnMob3B0aW9uLmNoaWxkcmVuKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHJldHVybiBvcHRpb247XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25Hcm91cHMubWFwKGdyb3VwID0+ICh7XG4gICAgICAuLi5ncm91cCxcbiAgICAgIG9wdGlvbnM6IHNvcnRPcHRpb25zKGdyb3VwLm9wdGlvbnMpLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qXG4gICAgSWYgd2UgYXJlIHJlc3RyaWN0aW5nIGhvdyBtYW55IG9wdGlvbnMgYXJlIHNlbGVjdGVkIHRvIGEgc3BlY2lmaWMgbGltaXQsXG4gICAgICB3aGVuIHdlIGFyZSBhdCB0aGF0IGxpbWl0LCBkaXNhYmxlIGFsbCBvcHRpb25zIG5vdCBjdXJyZW50bHkgc2VsZWN0ZWQuXG4gICovXG4gIGZ1bmN0aW9uIGFwcGx5U2VsZWN0ZWRPcHRpb25MaW1pdDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgICBvcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdLFxuICAgIHRvcExldmVsT3B0aW9uczogRnVsbE9wdGlvbjxPPltdLFxuICAgIG9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxPPixcbiAgKTogRnVsbE9wdGlvbkdyb3VwPE8+W10ge1xuICAgIGlmIChvcHRpb25zPy5zZWxlY3RlZE9wdGlvbkxpbWl0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBvcHRpb25Hcm91cHM7XG4gICAgfVxuXG4gICAgLy8gV2hlbiB1c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5IGlzIHRydWUgYW5kIHNlYXJjaCBpcyBhY3RpdmUsIGNvdW50XG4gICAgLy8gc2VsZWN0ZWQgdG9wLWxldmVsIG9wdGlvbnMgZnJvbSB0aGUgb3JpZ2luYWwgKHVuZmlsdGVyZWQpIGRhdGEgdG8gZW5zdXJlXG4gICAgLy8gYWxyZWFkeS1zZWxlY3RlZCBvcHRpb25zIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIHNlYXJjaCBhcmUgc3RpbGwgY291bnRlZC5cbiAgICBjb25zdCB1c2VPcmlnaW5hbEZvckNvdW50aW5nID1cbiAgICAgIG9wdGlvbnM/LnVzZVRvcExldmVsT3B0aW9uc0ZvckRpc3BsYXkgJiZcbiAgICAgIHN0YXRlLnF1ZXJ5LnNlYXJjaCAmJlxuICAgICAgc3RhdGUub3JpZ2luYWxPcHRpb25Hcm91cHMubGVuZ3RoID4gMDtcblxuICAgIGNvbnN0IHRvcE9wdGlvbnNGb3JDb3VudGluZyA9IHVzZU9yaWdpbmFsRm9yQ291bnRpbmdcbiAgICAgID8gZ2V0VG9wTGV2ZWxPcHRpb25zKHN0YXRlLm9yaWdpbmFsT3B0aW9uR3JvdXBzKS5tYXAob3B0aW9uID0+XG4gICAgICAgICAgYXVnbWVudE9wdGlvblRvRnVsbE9wdGlvbihzdGF0ZSwgb3B0aW9uLCBvcHRpb25zKSxcbiAgICAgICAgKVxuICAgICAgOiB0b3BMZXZlbE9wdGlvbnM7XG5cbiAgICBjb25zdCBzZWxlY3RlZE9ySW5kZXRlcm1pbmF0ZVRvcE9wdGlvbnMgPSB0b3BPcHRpb25zRm9yQ291bnRpbmcuZmlsdGVyKFxuICAgICAgb3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCAhPSBmYWxzZSxcbiAgICApO1xuICAgIGNvbnN0IG51bVNlbGVjdGVkT3B0aW9uczogbnVtYmVyID0gb3B0aW9ucz8udXNlVG9wTGV2ZWxPcHRpb25zRm9yRGlzcGxheVxuICAgICAgPyBzZWxlY3RlZE9ySW5kZXRlcm1pbmF0ZVRvcE9wdGlvbnMubGVuZ3RoXG4gICAgICA6IHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZC5zaXplO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25MaW1pdDogbnVtYmVyID0gb3B0aW9ucy5zZWxlY3RlZE9wdGlvbkxpbWl0O1xuXG4gICAgLy8gSWYgd2UgaGF2ZSBsZXNzIGl0ZW1zIHNlbGVjdGVkIHRoYW4gdGhlIGxpbWl0LCBidXNpbmVzcyBhcyB1c3VhbC5cbiAgICBpZiAobnVtU2VsZWN0ZWRPcHRpb25zIDwgc2VsZWN0ZWRPcHRpb25MaW1pdCkge1xuICAgICAgcmV0dXJuIG9wdGlvbkdyb3VwcztcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGVxdWFsIGl0ZW1zIHNlbGVjdGVkIHRvIHRoZSBsaW1pdCAob3IgbW9yZSksIHByZXZlbnQgdXNlcnMgZnJvbSBzZWxlY3RpbmcgbW9yZSBvcHRpb25zLlxuICAgIGZ1bmN0aW9uIGRpc2FibGVVbnNlbGVjdGVkSXRlbXMoXG4gICAgICBjdXJyZW50T3B0aW9uczogRnVsbE9wdGlvbjxPPltdLFxuICAgICAgb3B0aW9uc0FyZUNoaWxkcmVuT2ZTZWxlY3RlZEdyb3VwOiBib29sZWFuLFxuICAgICk6IEZ1bGxPcHRpb248Tz5bXSB7XG4gICAgICBjb25zdCB1cGRhdGVkSXRlbXM6IEZ1bGxPcHRpb248Tz5bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgY3VycmVudE9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgaXNEaXNhYmxlZE9yVW5zZWxlY3RlZDogYm9vbGVhbiA9XG4gICAgICAgICAgISFvcHRpb24uZGlzYWJsZWQgfHwgKG9wdGlvbi5zZWxlY3RhYmxlICYmIG9wdGlvbi5zZWxlY3RlZCA9PSBmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgaXNDdXJyZW50T3B0aW9uU2VsZWN0ZWQ6IGJvb2xlYW4gPVxuICAgICAgICAgIG9wdGlvbi5zZWxlY3RhYmxlICYmIG9wdGlvbi5zZWxlY3RlZCAhPSBmYWxzZTtcbiAgICAgICAgY29uc3QgaXNDdXJyZW50T3JQYXJlbnRPcHRpb25TZWxlY3RlZDogYm9vbGVhbiA9XG4gICAgICAgICAgaXNDdXJyZW50T3B0aW9uU2VsZWN0ZWQgfHwgb3B0aW9uc0FyZUNoaWxkcmVuT2ZTZWxlY3RlZEdyb3VwO1xuXG4gICAgICAgIGNvbnN0IGZvcmNlRW5hYmxlZEJhc2VkT25QYXJlbnQ6IGJvb2xlYW4gPVxuICAgICAgICAgICEhb3B0aW9ucz8udXNlVG9wTGV2ZWxPcHRpb25zRm9yRGlzcGxheSAmJlxuICAgICAgICAgIG9wdGlvbnNBcmVDaGlsZHJlbk9mU2VsZWN0ZWRHcm91cDtcbiAgICAgICAgY29uc3QgbWFya0Rpc2FibGVkOiBib29sZWFuID1cbiAgICAgICAgICBpc0Rpc2FibGVkT3JVbnNlbGVjdGVkICYmICFmb3JjZUVuYWJsZWRCYXNlZE9uUGFyZW50O1xuXG4gICAgICAgIGlmIChvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IGNoaWxkT3B0aW9ucyA9IGRpc2FibGVVbnNlbGVjdGVkSXRlbXMoXG4gICAgICAgICAgICBvcHRpb24uY2hpbGRyZW4sXG4gICAgICAgICAgICBpc0N1cnJlbnRPclBhcmVudE9wdGlvblNlbGVjdGVkLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdXBkYXRlZEl0ZW1zLnB1c2goe1xuICAgICAgICAgICAgLi4ub3B0aW9uLFxuICAgICAgICAgICAgZGlzYWJsZWQ6ICEhbWFya0Rpc2FibGVkLFxuICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkT3B0aW9ucyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cGRhdGVkSXRlbXMucHVzaCh7XG4gICAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgICBkaXNhYmxlZDogISFtYXJrRGlzYWJsZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB1cGRhdGVkSXRlbXM7XG4gICAgfVxuXG4gICAgY29uc3QgZ3JvdXBzQWZ0ZXJMaW1pdDogRnVsbE9wdGlvbkdyb3VwPE8+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGN1cnJlbnRHcm91cCBvZiBvcHRpb25Hcm91cHMpIHtcbiAgICAgIGdyb3Vwc0FmdGVyTGltaXQucHVzaCh7XG4gICAgICAgIC4uLmN1cnJlbnRHcm91cCxcbiAgICAgICAgb3B0aW9uczogZGlzYWJsZVVuc2VsZWN0ZWRJdGVtcyhjdXJyZW50R3JvdXAub3B0aW9ucywgZmFsc2UpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdyb3Vwc0FmdGVyTGltaXQ7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRSZWxhdGlvbnNoaXBNYXBzPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25zOiBPcHRpb248Tz5bXSxcbiAgKTogW01hcDxPWydpZCddLCBPWydpZCddPiwgTWFwPE9bJ2lkJ10sIE9bJ2lkJ11bXT5dIHtcbiAgICBjb25zdCBwYXJlbnRzID0gbmV3IE1hcCgpO1xuICAgIGZ1bmN0aW9uIGJ1aWxkUGFyZW50c01hcChvcHRpb25zOiBPcHRpb248Tz5bXSwgcGFyZW50PzogT3B0aW9uPE8+KTogdm9pZCB7XG4gICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICBwYXJlbnRzLnNldChvcHRpb24uaWQsIHBhcmVudC5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgYnVpbGRQYXJlbnRzTWFwKG9wdGlvbi5jaGlsZHJlbiwgb3B0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBidWlsZFBhcmVudHNNYXAob3B0aW9ucyk7XG5cbiAgICBjb25zdCBjaGlsZHJlbiA9IG5ldyBNYXAoKTtcbiAgICBmdW5jdGlvbiBidWlsZENoaWxkcmVuTWFwKG9wdGlvbnM6IE9wdGlvbjxPPltdKTogdm9pZCB7XG4gICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgIGNoaWxkcmVuLnNldChcbiAgICAgICAgICAgIG9wdGlvbi5pZCxcbiAgICAgICAgICAgIG9wdGlvbi5jaGlsZHJlbi5tYXAoKHsgaWQgfSkgPT4gaWQpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnVpbGRDaGlsZHJlbk1hcChvcHRpb24uY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGJ1aWxkQ2hpbGRyZW5NYXAob3B0aW9ucyk7XG5cbiAgICByZXR1cm4gW3BhcmVudHMsIGNoaWxkcmVuXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFRvcExldmVsT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uR3JvdXBzOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSxcbiAgKTogRnVsbE9wdGlvbjxPPltdO1xuICBmdW5jdGlvbiBnZXRUb3BMZXZlbE9wdGlvbnM8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIG9wdGlvbkdyb3VwczogU291cmNlT3B0aW9uR3JvdXA8Tz5bXSxcbiAgKTogU291cmNlT3B0aW9uPE8+W107XG4gIGZ1bmN0aW9uIGdldFRvcExldmVsT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uR3JvdXBzOiBPcHRpb25Hcm91cDxPPltdLFxuICApOiBPcHRpb248Tz5bXTtcbiAgZnVuY3Rpb24gZ2V0VG9wTGV2ZWxPcHRpb25zPFxuICAgIE8gZXh0ZW5kcyBCYXNlT3B0aW9uLFxuICAgIEcgZXh0ZW5kcyB7IG9wdGlvbnM6IHJlYWRvbmx5IFRbXSB9LFxuICAgIFQgPSBHIGV4dGVuZHMgRnVsbE9wdGlvbkdyb3VwPE8+XG4gICAgICA/IEZ1bGxPcHRpb248Tz5cbiAgICAgIDogRyBleHRlbmRzIFNvdXJjZU9wdGlvbkdyb3VwPE8+XG4gICAgICA/IFNvdXJjZU9wdGlvbjxPPlxuICAgICAgOiBPcHRpb248Tz4sXG4gID4ob3B0aW9uR3JvdXBzOiBHW10pOiBUW10ge1xuICAgIHJldHVybiBvcHRpb25Hcm91cHMucmVkdWNlPFRbXT4oXG4gICAgICAob3B0aW9ucywgZ3JvdXApID0+IFsuLi5vcHRpb25zLCAuLi5ncm91cC5vcHRpb25zXSxcbiAgICAgIFtdLFxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRQYXJlbnRNdWx0aVNlbGVjdGlvblN0YXRlPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBjaGlsZHJlbjogRnVsbE9wdGlvbjxPPltdLFxuICApOiBNdWx0aVNlbGVjdGlvblN0YXRlIHtcbiAgICBpZiAoY2hpbGRyZW4uZXZlcnkoY2hpbGQgPT4gY2hpbGQuc2VsZWN0ZWQgPT09IHRydWUpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoY2hpbGRyZW4uZXZlcnkoY2hpbGQgPT4gY2hpbGQuc2VsZWN0ZWQgPT09IGZhbHNlKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAnaW5kZXRlcm1pbmF0ZSc7XG4gIH1cblxuICBmdW5jdGlvbiBhdWdtZW50T3B0aW9uVG9GdWxsT3B0aW9uPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICAgIG9wdGlvbjogU291cmNlT3B0aW9uPE8+LFxuICAgIG1hbmFnZXJPcHRpb25zPzogTWFuYWdlck9wdGlvbnM8Tz4sXG4gICk6IEZ1bGxPcHRpb248Tz4ge1xuICAgIGlmIChvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgYXVnbWVudGVkQ2hpbGRyZW4gPSBvcHRpb24uY2hpbGRyZW4ubWFwKGNoaWxkID0+XG4gICAgICAgIGF1Z21lbnRPcHRpb25Ub0Z1bGxPcHRpb24oc3RhdGUsIGNoaWxkLCBtYW5hZ2VyT3B0aW9ucyksXG4gICAgICApO1xuICAgICAgY29uc3Qgc2VsZWN0YWJsZVdoZW5TZWFyY2hpbmcgPVxuICAgICAgICBtYW5hZ2VyT3B0aW9ucz8uYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoID8/IGZhbHNlO1xuXG4gICAgICAvLyBXaGVuIGFsbG93U2VsZWN0Tm9uTGVhZkR1cmluZ1NlYXJjaCBpcyBlbmFibGVkIGFuZCBzZWFyY2ggaXMgYWN0aXZlLFxuICAgICAgLy8gY2FsY3VsYXRlIHNlbGVjdGlvbiBzdGF0ZSBmcm9tIEFMTCBvcmlnaW5hbCBjaGlsZHJlbiwgbm90IGp1c3QgdGhlXG4gICAgICAvLyBmaWx0ZXJlZCBvbmVzIHZpc2libGUgaW4gc2VhcmNoIHJlc3VsdHMuXG4gICAgICBjb25zdCB1c2VPcmlnaW5hbEZvclNlbGVjdGlvblN0YXRlID1cbiAgICAgICAgbWFuYWdlck9wdGlvbnM/LmFsbG93U2VsZWN0Tm9uTGVhZkR1cmluZ1NlYXJjaCAmJlxuICAgICAgICBzdGF0ZS5xdWVyeS5zZWFyY2ggJiZcbiAgICAgICAgc3RhdGUub3JpZ2luYWxPcHRpb25Hcm91cHMubGVuZ3RoID4gMDtcblxuICAgICAgbGV0IHNlbGVjdGVkOiBNdWx0aVNlbGVjdGlvblN0YXRlO1xuICAgICAgaWYgKHVzZU9yaWdpbmFsRm9yU2VsZWN0aW9uU3RhdGUpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxPcHRpb24gPSBmaW5kT3B0aW9uKFxuICAgICAgICAgIGdldFRvcExldmVsT3B0aW9ucyhzdGF0ZS5vcmlnaW5hbE9wdGlvbkdyb3VwcyksXG4gICAgICAgICAgb3B0aW9uLmlkLFxuICAgICAgICApO1xuICAgICAgICBpZiAob3JpZ2luYWxPcHRpb24pIHtcbiAgICAgICAgICBjb25zdCBhbGxMZWF2ZXMgPSBmbGF0dGVuT3B0aW9ucyhbb3JpZ2luYWxPcHRpb25dLCB0cnVlKTtcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZENvdW50ID0gYWxsTGVhdmVzLmZpbHRlcihsZWFmID0+XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQuaGFzKGxlYWYpLFxuICAgICAgICAgICkubGVuZ3RoO1xuICAgICAgICAgIGlmIChzZWxlY3RlZENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBzZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRDb3VudCA9PT0gYWxsTGVhdmVzLmxlbmd0aCkge1xuICAgICAgICAgICAgc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxlY3RlZCA9ICdpbmRldGVybWluYXRlJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZWN0ZWQgPSBnZXRQYXJlbnRNdWx0aVNlbGVjdGlvblN0YXRlKGF1Z21lbnRlZENoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0ZWQgPSBnZXRQYXJlbnRNdWx0aVNlbGVjdGlvblN0YXRlKGF1Z21lbnRlZENoaWxkcmVuKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ub3B0aW9uLFxuICAgICAgICBjaGlsZHJlbjogYXVnbWVudGVkQ2hpbGRyZW4sXG4gICAgICAgIHNlbGVjdGVkLFxuICAgICAgICBleHBhbmRlZDogc3RhdGUucXVlcnkuc2VhcmNoXG4gICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgOiBzdGF0ZS5kaXNwbGF5LmV4cGFuZGVkT3B0aW9ucy5oYXMob3B0aW9uLmlkKSxcbiAgICAgICAgc2VsZWN0YWJsZTogIXN0YXRlLnF1ZXJ5LnNlYXJjaCB8fCBzZWxlY3RhYmxlV2hlblNlYXJjaGluZyxcbiAgICAgICAgZXhwYW5kYWJsZTogIXN0YXRlLnF1ZXJ5LnNlYXJjaCxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi5vcHRpb24sXG4gICAgICBjaGlsZHJlbjogdW5kZWZpbmVkLFxuICAgICAgc2VsZWN0ZWQ6IHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZC5oYXMob3B0aW9uKSxcbiAgICAgIGV4cGFuZGVkOiBmYWxzZSxcbiAgICAgIHNlbGVjdGFibGU6IHRydWUsXG4gICAgICBleHBhbmRhYmxlOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkT3B0aW9uc0ZvckRpc3BsYXk8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICAgdG9wTGV2ZWxPcHRpb25zOiBGdWxsT3B0aW9uPE8+W10sXG4gICAgb3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBzdHJpbmcge1xuICAgIC8vIElmIHdlIGhhdmUgYSBjdXN0b20gZGlzcGxheSBmdW5jdGlvbiwgdXNlIGl0XG4gICAgaWYgKG9wdGlvbnM/LmdldEN1c3RvbU9wdGlvbkRpc3BsYXkpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmdldEN1c3RvbU9wdGlvbkRpc3BsYXkoWy4uLnN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZF0pO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucz8udXNlVG9wTGV2ZWxPcHRpb25zRm9yRGlzcGxheSkge1xuICAgICAgcmV0dXJuIGdldFRvcExldmVsRm9ybWF0dGVkT3B0aW9uc0ZvckRpc3BsYXkodG9wTGV2ZWxPcHRpb25zKTtcbiAgICB9XG4gICAgLy8gT3RoZXJ3aXNlLCB1c2UgdGhlIGRlZmF1bHQgZGlzcGxheSBmb3Igb3B0aW9ucyAtIHRpdGxlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLlxuICAgIHJldHVybiBbLi4uc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkXS5tYXAoKHsgdGl0bGUgfSkgPT4gdGl0bGUpLmpvaW4oJywgJyk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRUb3BMZXZlbEZvcm1hdHRlZE9wdGlvbnNGb3JEaXNwbGF5PE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICB0b3BMZXZlbE9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSxcbiAgKTogc3RyaW5nIHtcbiAgICBpZiAoIXRvcExldmVsT3B0aW9ucyB8fCB0b3BMZXZlbE9wdGlvbnMubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0ZWRPckluZGV0ZXJtaW5hdGVUb3BPcHRpb25zID0gdG9wTGV2ZWxPcHRpb25zLmZpbHRlcihcbiAgICAgIG9wdGlvbiA9PiBvcHRpb24uc2VsZWN0ZWQgIT0gZmFsc2UsXG4gICAgKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRPckluZGV0ZXJtaW5hdGVUb3BPcHRpb25zXG4gICAgICAubWFwKCh7IHRpdGxlIH0pID0+IHRpdGxlKVxuICAgICAgLmpvaW4oJywgJyk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRQaWxsQ291bnRGb3JEaXNwbGF5PE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICAgIHRvcExldmVsT3B0aW9uczogRnVsbE9wdGlvbjxPPltdLFxuICAgIG9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxPPixcbiAgKTogbnVtYmVyIHtcbiAgICBpZiAob3B0aW9ucz8udXNlVG9wTGV2ZWxPcHRpb25zRm9yRGlzcGxheSkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRPckluZGV0ZXJtaW5hdGVUb3BPcHRpb25zID0gdG9wTGV2ZWxPcHRpb25zLmZpbHRlcihcbiAgICAgICAgb3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCAhPSBmYWxzZSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gc2VsZWN0ZWRPckluZGV0ZXJtaW5hdGVUb3BPcHRpb25zLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZC5zaXplO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0WmVyb1N0YXRlTWVzc2FnZTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHN0YXRlLnNvdXJjZU9wdGlvbkdyb3Vwcy5ldmVyeShncm91cCA9PiBncm91cC5vcHRpb25zLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgIGlmIChzdGF0ZS5xdWVyeS5zZWFyY2gpIHJldHVybiAnTm8gcmVzdWx0cyBmb3VuZC4nO1xuICAgICAgcmV0dXJuICdObyBvcHRpb25zLic7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gZmluZE9wdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uczogU291cmNlT3B0aW9uPE8+W10sXG4gICAgaWQ6IE9bJ2lkJ10sXG4gICk6IFNvdXJjZU9wdGlvbjxPPiB8IG51bGwge1xuICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgIGlmIChvcHRpb24uaWQgPT09IGlkKSByZXR1cm4gb3B0aW9uO1xuICAgICAgaWYgKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gZmluZE9wdGlvbihvcHRpb24uY2hpbGRyZW4sIGlkKTtcbiAgICAgICAgaWYgKGNoaWxkKSByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gZmxhdHRlbk9wdGlvbnM8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIG9wdGlvbnM6IE9wdGlvbjxPPltdLFxuICAgIGxlYWZPbmx5OiBib29sZWFuLFxuICApOiBPW10ge1xuICAgIHJldHVybiBmbGF0dGVuRGVlcChcbiAgICAgIG9wdGlvbnMubWFwKG9wdGlvbiA9PiB7XG4gICAgICAgIGlmIChvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gb3B0aW9uLmNoaWxkcmVuLm1hcChjaGlsZCA9PlxuICAgICAgICAgICAgZmxhdHRlbk9wdGlvbnMoW2NoaWxkXSwgbGVhZk9ubHkpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIGxlYWZPbmx5ID8gZGVzY2VuZGFudHMgOiBbb3B0aW9uLCAuLi5kZXNjZW5kYW50c107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFtvcHRpb25dO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9nZ2xlU2VsZWN0ZWQ8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICAgaWQ6IE9bJ2lkJ10sXG4gICAgbWFuYWdlck9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxPPixcbiAgKTogQ29yZVN0YXRlPE8+IHtcbiAgICBjb25zdCB0b3BMZXZlbE9wdGlvbnMgPSBnZXRUb3BMZXZlbE9wdGlvbnMoc3RhdGUuc291cmNlT3B0aW9uR3JvdXBzKTtcbiAgICBjb25zdCBvcHRpb24gPSBmaW5kT3B0aW9uKHRvcExldmVsT3B0aW9ucywgaWQpO1xuICAgIGlmICghb3B0aW9uKSByZXR1cm4gc3RhdGU7XG5cbiAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBuZXcgT3B0aW9uU2V0KHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZCk7XG5cbiAgICBjb25zdCBuZXdWYWx1ZSA9ICEoXG4gICAgICBhdWdtZW50T3B0aW9uVG9GdWxsT3B0aW9uKHN0YXRlLCBvcHRpb24sIG1hbmFnZXJPcHRpb25zKS5zZWxlY3RlZCA9PT0gdHJ1ZVxuICAgICk7XG5cbiAgICAvLyBXaGVuIGFsbG93U2VsZWN0Tm9uTGVhZkR1cmluZ1NlYXJjaCBpcyBlbmFibGVkIGFuZCBzZWFyY2ggaXMgYWN0aXZlLFxuICAgIC8vIHVzZSB0aGUgb3JpZ2luYWwgKHVuZmlsdGVyZWQpIGRhdGEgdG8gZ2V0IGFsbCBjaGlsZHJlbiwgbm90IGp1c3RcbiAgICAvLyB0aG9zZSB2aXNpYmxlIGluIHRoZSBmaWx0ZXJlZCBzZWFyY2ggcmVzdWx0cy5cbiAgICBjb25zdCB1c2VPcmlnaW5hbERhdGEgPVxuICAgICAgbWFuYWdlck9wdGlvbnM/LmFsbG93U2VsZWN0Tm9uTGVhZkR1cmluZ1NlYXJjaCAmJlxuICAgICAgc3RhdGUucXVlcnkuc2VhcmNoICYmXG4gICAgICBzdGF0ZS5vcmlnaW5hbE9wdGlvbkdyb3Vwcy5sZW5ndGggPiAwO1xuXG4gICAgY29uc3Qgb3B0aW9uRm9yTGVhdmVzID0gdXNlT3JpZ2luYWxEYXRhXG4gICAgICA/IGZpbmRPcHRpb24oZ2V0VG9wTGV2ZWxPcHRpb25zKHN0YXRlLm9yaWdpbmFsT3B0aW9uR3JvdXBzKSwgaWQpID8/IG9wdGlvblxuICAgICAgOiBvcHRpb247XG5cbiAgICBjb25zdCBsZWF2ZXMgPSBmbGF0dGVuT3B0aW9ucyhbb3B0aW9uRm9yTGVhdmVzXSwgdHJ1ZSk7XG4gICAgZm9yIChjb25zdCBsZWFmIG9mIGxlYXZlcykge1xuICAgICAgaWYgKG5ld1ZhbHVlKSB7XG4gICAgICAgIG5ld1NlbGVjdGlvbi5hZGQobGVhZik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdTZWxlY3Rpb24uZGVsZXRlKGxlYWYpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIHNlbGVjdGlvbjoge1xuICAgICAgICBzZWxlY3RlZDogbmV3U2VsZWN0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0U2VsZWN0ZWRPcHRpb248TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICAgaWQ6IE9bJ2lkJ10sXG4gICk6IENvcmVTdGF0ZTxPPiB7XG4gICAgY29uc3QgdG9wTGV2ZWxPcHRpb25zID0gZ2V0VG9wTGV2ZWxPcHRpb25zKHN0YXRlLnNvdXJjZU9wdGlvbkdyb3Vwcyk7XG4gICAgY29uc3Qgb3B0aW9uID0gZmluZE9wdGlvbih0b3BMZXZlbE9wdGlvbnMsIGlkKTtcbiAgICBpZiAoIW9wdGlvbikgcmV0dXJuIHN0YXRlO1xuXG4gICAgY29uc3QgbmV3U2VsZWN0aW9uID0gbmV3IE9wdGlvblNldDxPPigpO1xuICAgIG5ld1NlbGVjdGlvbi5hZGQob3B0aW9uKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIHNlbGVjdGlvbjoge1xuICAgICAgICBzZWxlY3RlZDogbmV3U2VsZWN0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gdG9nZ2xlVmlzaWJsZVNlbGVjdGVkPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICApOiBDb3JlU3RhdGU8Tz4ge1xuICAgIGNvbnN0IGxlYXZlcyA9IGZsYXR0ZW5PcHRpb25zKFxuICAgICAgZ2V0VG9wTGV2ZWxPcHRpb25zKHN0YXRlLnNvdXJjZU9wdGlvbkdyb3VwcyksXG4gICAgICB0cnVlLFxuICAgICk7XG4gICAgY29uc3QgaXNBbGxTZWxlY3RlZCA9IGxlYXZlcy5ldmVyeShsZWFmID0+XG4gICAgICBzdGF0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQuaGFzKGxlYWYpLFxuICAgICk7XG4gICAgY29uc3QgbmV3U2VsZWN0aW9uID0gbmV3IE9wdGlvblNldChzdGF0ZS5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xuXG4gICAgZm9yIChjb25zdCBsZWFmIG9mIGxlYXZlcykge1xuICAgICAgaWYgKGlzQWxsU2VsZWN0ZWQpIG5ld1NlbGVjdGlvbi5kZWxldGUobGVhZik7XG4gICAgICBlbHNlIG5ld1NlbGVjdGlvbi5hZGQobGVhZik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgIC4uLnN0YXRlLnNlbGVjdGlvbixcbiAgICAgICAgc2VsZWN0ZWQ6IG5ld1NlbGVjdGlvbixcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvZ2dsZU9wdGlvbkV4cGFuZGVkPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICAgIGlkOiBPWydpZCddLFxuICApOiBDb3JlU3RhdGU8Tz4ge1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gIXN0YXRlLmRpc3BsYXkuZXhwYW5kZWRPcHRpb25zLmhhcyhpZCk7XG4gICAgY29uc3QgbmV3RXhwYW5kZWRPcHRpb25zID0gbmV3IFNldChzdGF0ZS5kaXNwbGF5LmV4cGFuZGVkT3B0aW9ucyk7XG4gICAgaWYgKG5ld1ZhbHVlKSBuZXdFeHBhbmRlZE9wdGlvbnMuYWRkKGlkKTtcbiAgICBlbHNlIG5ld0V4cGFuZGVkT3B0aW9ucy5kZWxldGUoaWQpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGRpc3BsYXk6IHtcbiAgICAgICAgLi4uc3RhdGUuZGlzcGxheSxcbiAgICAgICAgZXhwYW5kZWRPcHRpb25zOiBuZXdFeHBhbmRlZE9wdGlvbnMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBzaWRlRWZmZWN0czxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgICBhY3Rpb246IEFjdGlvbjxPPiB8IEludGVybmFsQWN0aW9uPE8+LFxuICAgIHNvdXJjZTogU291cmNlPE8+LFxuICAgIGludGVybmFsQWN0aW9uczogU3ViamVjdDxJbnRlcm5hbEFjdGlvbjxPPj4sXG4gICk6IENvcmVTdGF0ZTxPPiB7XG4gICAgaWYgKFxuICAgICAgYWN0aW9uLnR5cGUgPT09ICdsb2FkJyB8fFxuICAgICAgYWN0aW9uLnR5cGUgPT09ICdzZWFyY2hDaGFuZ2UnIHx8XG4gICAgICBhY3Rpb24udHlwZSA9PT0gJ29yZGVyQ2hhbmdlJyB8fFxuICAgICAgKGFjdGlvbi50eXBlID09PSAnb3BlbkNoYW5nZScgJiYgYWN0aW9uLm9wZW4pXG4gICAgKSB7XG4gICAgICBzb3VyY2Uoc3RhdGUucXVlcnksIGFjdGlvbilcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogcmVzdWx0LmRhdGE7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxEYXRhID0gQXJyYXkuaXNBcnJheShyZXN1bHQpXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiByZXN1bHQub3JpZ2luYWxEYXRhO1xuICAgICAgICAgIGludGVybmFsQWN0aW9ucy5uZXh0KHsgdHlwZTogJ2xvYWRDb21wbGV0ZScsIGRhdGEsIG9yaWdpbmFsRGF0YSB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIGludGVybmFsQWN0aW9ucy5uZXh0KHsgdHlwZTogJ2xvYWRFcnJvcicsIGVycm9yIH0pO1xuICAgICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBsb2FkOiB7XG4gICAgICAgICAgbG9hZGluZzogdHJ1ZSxcbiAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlZHVjZTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgICBhY3Rpb246IEFjdGlvbjxPPiB8IEludGVybmFsQWN0aW9uPE8+LFxuICAgIG1hbmFnZXJPcHRpb25zPzogTWFuYWdlck9wdGlvbnM8Tz4sXG4gICk6IENvcmVTdGF0ZTxPPiB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgY2FzZSAnbG9hZCc6XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIGNhc2UgJ2xvYWRDb21wbGV0ZSc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgbG9hZDoge1xuICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNvdXJjZU9wdGlvbkdyb3VwczogYWN0aW9uLmRhdGEsXG4gICAgICAgICAgb3JpZ2luYWxPcHRpb25Hcm91cHM6IGFjdGlvbi5vcmlnaW5hbERhdGEgPz8gW10sXG4gICAgICAgIH07XG4gICAgICBjYXNlICdsb2FkRXJyb3InOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIGxvYWQ6IHtcbiAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IGFjdGlvbi5lcnJvcixcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgY2FzZSAnb3BlbkNoYW5nZSc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgc2VhcmNoOiAnJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRpc3BsYXk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLmRpc3BsYXksXG4gICAgICAgICAgICBvcGVuOiBhY3Rpb24ub3BlbixcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgY2FzZSAnc2VhcmNoQ2hhbmdlJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBzZWFyY2g6IGFjdGlvbi5wYXlsb2FkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICBjYXNlICdvcmRlckNoYW5nZSc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgb3JkZXI6IGFjdGlvbi5wYXlsb2FkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICBjYXNlICdzZWxlY3Rpb25DaGFuZ2UnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHNlbGVjdGlvbjogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgIH07XG4gICAgICBjYXNlICd0b2dnbGVPcHRpb25TZWxlY3RlZCc6XG4gICAgICAgIHJldHVybiB0b2dnbGVTZWxlY3RlZChzdGF0ZSwgYWN0aW9uLmlkLCBtYW5hZ2VyT3B0aW9ucyk7XG4gICAgICBjYXNlICdzZXRTZWxlY3RlZE9wdGlvbic6XG4gICAgICAgIHJldHVybiBzZXRTZWxlY3RlZE9wdGlvbihzdGF0ZSwgYWN0aW9uLmlkKTtcbiAgICAgIGNhc2UgJ3Zpc2libGVTZWxlY3RlZENoYW5nZSc6XG4gICAgICAgIHJldHVybiB0b2dnbGVWaXNpYmxlU2VsZWN0ZWQoc3RhdGUpO1xuICAgICAgY2FzZSAndG9nZ2xlT3B0aW9uRXhwYW5kZWQnOlxuICAgICAgICByZXR1cm4gdG9nZ2xlT3B0aW9uRXhwYW5kZWQoc3RhdGUsIGFjdGlvbi5pZCk7XG4gICAgfVxuICB9XG59XG4iXX0=
|