@inobeta/ui 18.0.1-build.1722007687
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/README.md +1 -0
- package/_index.scss +1 -0
- package/esm2022/inobeta-ui.mjs +5 -0
- package/esm2022/public_api.mjs +17 -0
- package/esm2022/src/app/inobeta-ui/core/filter.pipe.mjs +23 -0
- package/esm2022/src/app/inobeta-ui/core/index.mjs +2 -0
- package/esm2022/src/app/inobeta-ui/http/auth/guard.service.mjs +157 -0
- package/esm2022/src/app/inobeta-ui/http/auth/login.service.mjs +137 -0
- package/esm2022/src/app/inobeta-ui/http/auth/login.service.stub.spec.mjs +20 -0
- package/esm2022/src/app/inobeta-ui/http/auth/session.model.mjs +16 -0
- package/esm2022/src/app/inobeta-ui/http/http/auth.interceptor.mjs +79 -0
- package/esm2022/src/app/inobeta-ui/http/http/error.interceptor.mjs +76 -0
- package/esm2022/src/app/inobeta-ui/http/http/loader.interceptor.mjs +45 -0
- package/esm2022/src/app/inobeta-ui/http/http/loading-skeleton-container.component.mjs +36 -0
- package/esm2022/src/app/inobeta-ui/http/http/loading-skeleton.component.mjs +34 -0
- package/esm2022/src/app/inobeta-ui/http/http/loading-skeleton.directive.mjs +66 -0
- package/esm2022/src/app/inobeta-ui/http/http/loading-skeleton.directive.stub.spec.mjs +22 -0
- package/esm2022/src/app/inobeta-ui/http/http/messages.decorator.mjs +42 -0
- package/esm2022/src/app/inobeta-ui/http/http/role-check.directive.mjs +45 -0
- package/esm2022/src/app/inobeta-ui/http/http/spinner-loading.component.mjs +28 -0
- package/esm2022/src/app/inobeta-ui/http/http/spinner-loading.stub.spec.mjs +15 -0
- package/esm2022/src/app/inobeta-ui/http/http-test.module.mjs +35 -0
- package/esm2022/src/app/inobeta-ui/http/http.module.mjs +178 -0
- package/esm2022/src/app/inobeta-ui/http/index.mjs +26 -0
- package/esm2022/src/app/inobeta-ui/http/store/index.mjs +11 -0
- package/esm2022/src/app/inobeta-ui/http/store/loader/actions.mjs +7 -0
- package/esm2022/src/app/inobeta-ui/http/store/loader/interfaces.mjs +2 -0
- package/esm2022/src/app/inobeta-ui/http/store/loader/reducers.mjs +35 -0
- package/esm2022/src/app/inobeta-ui/http/store/loader/selectors.mjs +9 -0
- package/esm2022/src/app/inobeta-ui/http/store/session/actions.mjs +17 -0
- package/esm2022/src/app/inobeta-ui/http/store/session/effects.mjs +50 -0
- package/esm2022/src/app/inobeta-ui/http/store/session/interfaces.mjs +2 -0
- package/esm2022/src/app/inobeta-ui/http/store/session/reducers.mjs +12 -0
- package/esm2022/src/app/inobeta-ui/http/store/session/selectors.mjs +22 -0
- package/esm2022/src/app/inobeta-ui/http/translations.mjs +13 -0
- package/esm2022/src/app/inobeta-ui/hydration/actions.mjs +3 -0
- package/esm2022/src/app/inobeta-ui/hydration/effects.mjs +45 -0
- package/esm2022/src/app/inobeta-ui/hydration/index.mjs +21 -0
- package/esm2022/src/app/inobeta-ui/hydration/reducer.mjs +36 -0
- package/esm2022/src/app/inobeta-ui/storage/index.mjs +4 -0
- package/esm2022/src/app/inobeta-ui/storage/storage-test.module.mjs +23 -0
- package/esm2022/src/app/inobeta-ui/storage/storage.module.mjs +22 -0
- package/esm2022/src/app/inobeta-ui/storage/storage.service.mjs +105 -0
- package/esm2022/src/app/inobeta-ui/storage/storage.stub.spec.mjs +8 -0
- package/esm2022/src/app/inobeta-ui/translate/index.mjs +2 -0
- package/esm2022/src/app/inobeta-ui/translate/translate-loader.service.mjs +37 -0
- package/esm2022/src/app/inobeta-ui/ui/breadcrumb/breadcrumb.component.mjs +63 -0
- package/esm2022/src/app/inobeta-ui/ui/breadcrumb/breadcrumb.module.mjs +44 -0
- package/esm2022/src/app/inobeta-ui/ui/breadcrumb/index.mjs +4 -0
- package/esm2022/src/app/inobeta-ui/ui/breadcrumb/material-breadcrumb/material-breadcrumb.component.mjs +16 -0
- package/esm2022/src/app/inobeta-ui/ui/data-export/data-export.module.mjs +92 -0
- package/esm2022/src/app/inobeta-ui/ui/data-export/data-export.service.mjs +83 -0
- package/esm2022/src/app/inobeta-ui/ui/data-export/formats/csv-export.service.mjs +42 -0
- package/esm2022/src/app/inobeta-ui/ui/data-export/formats/pdf-export.service.mjs +66 -0
- package/esm2022/src/app/inobeta-ui/ui/data-export/formats/xlsx-export.service.mjs +26 -0
- package/esm2022/src/app/inobeta-ui/ui/data-export/index.mjs +10 -0
- package/esm2022/src/app/inobeta-ui/ui/data-export/provider.mjs +3 -0
- package/esm2022/src/app/inobeta-ui/ui/data-export/table-data-export-dialog.component.mjs +113 -0
- package/esm2022/src/app/inobeta-ui/ui/data-export/table-data-export.component.mjs +58 -0
- package/esm2022/src/app/inobeta-ui/ui/data-export/transformer.mjs +68 -0
- package/esm2022/src/app/inobeta-ui/ui/forms/array/array.mjs +26 -0
- package/esm2022/src/app/inobeta-ui/ui/forms/controls/checkbox.mjs +5 -0
- package/esm2022/src/app/inobeta-ui/ui/forms/controls/dropdown.mjs +5 -0
- package/esm2022/src/app/inobeta-ui/ui/forms/controls/form-control-base.mjs +80 -0
- package/esm2022/src/app/inobeta-ui/ui/forms/controls/radio.mjs +5 -0
- package/esm2022/src/app/inobeta-ui/ui/forms/controls/textbox.mjs +5 -0
- package/esm2022/src/app/inobeta-ui/ui/forms/dynamic-form/dynamic-form.component.mjs +118 -0
- package/esm2022/src/app/inobeta-ui/ui/forms/dynamic-form-array/dynamic-form-array.component.mjs +46 -0
- package/esm2022/src/app/inobeta-ui/ui/forms/dynamic-form-control/dynamic-form-control.component.mjs +28 -0
- package/esm2022/src/app/inobeta-ui/ui/forms/form-control.service.mjs +57 -0
- package/esm2022/src/app/inobeta-ui/ui/forms/forms.module.mjs +36 -0
- package/esm2022/src/app/inobeta-ui/ui/forms/forms.pipes.mjs +41 -0
- package/esm2022/src/app/inobeta-ui/ui/forms/forms.types.mjs +2 -0
- package/esm2022/src/app/inobeta-ui/ui/forms/index.mjs +12 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-filter/filter-button/filter-action-group.component.mjs +14 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-filter/filter-button/filter-button.component.mjs +31 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-filter/filter.component.mjs +149 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-filter/filter.types.mjs +30 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-filter/filters/base/filter-base.mjs +83 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-filter/filters/boolean/boolean-filter.component.mjs +48 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-filter/filters/date/filter-date.component.mjs +284 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-filter/filters/number/filter-number.component.mjs +111 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-filter/filters/search-bar/search-bar.component.mjs +99 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-filter/filters/tag/filter-tag.component.mjs +106 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-filter/filters/text/filter-text.component.mjs +98 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-filter/filters.mjs +109 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-filter/filters.module.mjs +175 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-filter/index.mjs +14 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-filter/tokens.mjs +3 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-filter/translations.mjs +51 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/action.mjs +48 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/cells.mjs +212 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/columns/action-column.mjs +23 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/columns/column.mjs +260 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/columns/date-column.mjs +93 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/columns/index.mjs +7 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/columns/number-column.mjs +112 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/columns/selection-column.mjs +149 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/columns/text-column.mjs +90 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/index.mjs +13 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/paginator-intl.mjs +53 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/remote-data-source.mjs +73 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/rowgroup.mjs +17 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/sort-header.mjs +37 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/store/const.mjs +2 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/store/index.mjs +9 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/store/url-state/actions.mjs +13 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/store/url-state/effects.mjs +47 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/store/url-state/interfaces.mjs +2 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/store/url-state/reducers.mjs +56 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/store/url-state/selectors.mjs +19 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/table-data-source.mjs +450 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/table-url.service.mjs +129 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/table.component.mjs +260 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/table.module.mjs +150 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/table.types.mjs +2 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/tokens.mjs +13 -0
- package/esm2022/src/app/inobeta-ui/ui/kai-table/translations.mjs +41 -0
- package/esm2022/src/app/inobeta-ui/ui/main-menu/components/main-menu-bar/main-menu-bar.component.mjs +120 -0
- package/esm2022/src/app/inobeta-ui/ui/main-menu/components/main-menu-bar/main-menu-bar.stub.spec.mjs +38 -0
- package/esm2022/src/app/inobeta-ui/ui/main-menu/components/main-menu-dialog/main-menu-dialog.component.mjs +48 -0
- package/esm2022/src/app/inobeta-ui/ui/main-menu/components/main-menu-expanded/header-footer-buttons.component.mjs +139 -0
- package/esm2022/src/app/inobeta-ui/ui/main-menu/components/main-menu-expanded/main-menu-expanded.component.mjs +41 -0
- package/esm2022/src/app/inobeta-ui/ui/main-menu/index.mjs +13 -0
- package/esm2022/src/app/inobeta-ui/ui/main-menu/main-menu-test.module.mjs +24 -0
- package/esm2022/src/app/inobeta-ui/ui/main-menu/main-menu.module.mjs +63 -0
- package/esm2022/src/app/inobeta-ui/ui/main-menu/models/main-menu-button.model.mjs +2 -0
- package/esm2022/src/app/inobeta-ui/ui/main-menu/models/main-menu-data-set.model.mjs +2 -0
- package/esm2022/src/app/inobeta-ui/ui/main-menu/models/main-menu-data.model.mjs +2 -0
- package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/autocomplete.mjs +108 -0
- package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/button.mjs +80 -0
- package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/checkbox.mjs +54 -0
- package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/datepicker.mjs +96 -0
- package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/dropdown.mjs +149 -0
- package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/label.mjs +50 -0
- package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/padding.mjs +26 -0
- package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/radio.mjs +61 -0
- package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/slide-toggle.mjs +62 -0
- package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/textarea.mjs +63 -0
- package/esm2022/src/app/inobeta-ui/ui/material-forms/controls/textbox.mjs +205 -0
- package/esm2022/src/app/inobeta-ui/ui/material-forms/index.mjs +18 -0
- package/esm2022/src/app/inobeta-ui/ui/material-forms/intl/datepicker.intl.mjs +73 -0
- package/esm2022/src/app/inobeta-ui/ui/material-forms/material-form/material-form.component.mjs +48 -0
- package/esm2022/src/app/inobeta-ui/ui/material-forms/material-form/material-form.stub.spec.mjs +65 -0
- package/esm2022/src/app/inobeta-ui/ui/material-forms/material-form-array/material-form-array.component.mjs +18 -0
- package/esm2022/src/app/inobeta-ui/ui/material-forms/material-form-control/material-form-control.component.mjs +64 -0
- package/esm2022/src/app/inobeta-ui/ui/material-forms/material-form-test.module.mjs +32 -0
- package/esm2022/src/app/inobeta-ui/ui/material-forms/material-form.module.mjs +168 -0
- package/esm2022/src/app/inobeta-ui/ui/material-forms/translations.mjs +26 -0
- package/esm2022/src/app/inobeta-ui/ui/modal/index.mjs +7 -0
- package/esm2022/src/app/inobeta-ui/ui/modal/modal-message.component.mjs +76 -0
- package/esm2022/src/app/inobeta-ui/ui/modal/modal-message.model.mjs +2 -0
- package/esm2022/src/app/inobeta-ui/ui/modal/modal-message.service.mjs +64 -0
- package/esm2022/src/app/inobeta-ui/ui/modal/modal-message.service.stub.spec.mjs +15 -0
- package/esm2022/src/app/inobeta-ui/ui/modal/modal-test.module.mjs +26 -0
- package/esm2022/src/app/inobeta-ui/ui/modal/modal.module.mjs +46 -0
- package/esm2022/src/app/inobeta-ui/ui/modal/translations.mjs +10 -0
- package/esm2022/src/app/inobeta-ui/ui/toast/index.mjs +5 -0
- package/esm2022/src/app/inobeta-ui/ui/toast/toast-test.module.mjs +23 -0
- package/esm2022/src/app/inobeta-ui/ui/toast/toast.module.mjs +21 -0
- package/esm2022/src/app/inobeta-ui/ui/toast/toast.service.mjs +54 -0
- package/esm2022/src/app/inobeta-ui/ui/toast/toast.service.stub.spec.mjs +4 -0
- package/esm2022/src/app/inobeta-ui/ui/uploader/index.mjs +3 -0
- package/esm2022/src/app/inobeta-ui/ui/uploader/uploader.component.mjs +41 -0
- package/esm2022/src/app/inobeta-ui/ui/uploader/uploader.module.mjs +42 -0
- package/esm2022/src/app/inobeta-ui/ui/views/components/default-table-view/default-table-view.component.mjs +20 -0
- package/esm2022/src/app/inobeta-ui/ui/views/components/index.mjs +6 -0
- package/esm2022/src/app/inobeta-ui/ui/views/components/table-view/table-view.component.mjs +37 -0
- package/esm2022/src/app/inobeta-ui/ui/views/components/table-view-group/table-view-group.component.mjs +186 -0
- package/esm2022/src/app/inobeta-ui/ui/views/components/view-dialog/view-dialog.component.mjs +110 -0
- package/esm2022/src/app/inobeta-ui/ui/views/components/view-list/view-list.component.mjs +43 -0
- package/esm2022/src/app/inobeta-ui/ui/views/index.mjs +5 -0
- package/esm2022/src/app/inobeta-ui/ui/views/store/actions.mjs +11 -0
- package/esm2022/src/app/inobeta-ui/ui/views/store/index.mjs +3 -0
- package/esm2022/src/app/inobeta-ui/ui/views/store/reducer.mjs +5 -0
- package/esm2022/src/app/inobeta-ui/ui/views/store/views/index.mjs +4 -0
- package/esm2022/src/app/inobeta-ui/ui/views/store/views/reducer.mjs +19 -0
- package/esm2022/src/app/inobeta-ui/ui/views/store/views/selectors.mjs +5 -0
- package/esm2022/src/app/inobeta-ui/ui/views/store/views/table-view.mjs +13 -0
- package/esm2022/src/app/inobeta-ui/ui/views/translations.mjs +34 -0
- package/esm2022/src/app/inobeta-ui/ui/views/view.module.mjs +98 -0
- package/esm2022/src/app/inobeta-ui/ui/views/view.service.mjs +137 -0
- package/fesm2022/inobeta-ui.mjs +8610 -0
- package/fesm2022/inobeta-ui.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/package.json +55 -0
- package/public_api.d.ts +16 -0
- package/src/app/inobeta-ui/core/filter.pipe.d.ts +7 -0
- package/src/app/inobeta-ui/core/index.d.ts +1 -0
- package/src/app/inobeta-ui/http/auth/guard.service.d.ts +96 -0
- package/src/app/inobeta-ui/http/auth/login.service.d.ts +63 -0
- package/src/app/inobeta-ui/http/auth/login.service.stub.spec.d.ts +9 -0
- package/src/app/inobeta-ui/http/auth/session.model.d.ts +18 -0
- package/src/app/inobeta-ui/http/http/auth.interceptor.d.ts +21 -0
- package/src/app/inobeta-ui/http/http/error.interceptor.d.ts +18 -0
- package/src/app/inobeta-ui/http/http/loader.interceptor.d.ts +17 -0
- package/src/app/inobeta-ui/http/http/loading-skeleton-container.component.d.ts +13 -0
- package/src/app/inobeta-ui/http/http/loading-skeleton.component.d.ts +12 -0
- package/src/app/inobeta-ui/http/http/loading-skeleton.directive.d.ts +27 -0
- package/src/app/inobeta-ui/http/http/loading-skeleton.directive.stub.spec.d.ts +13 -0
- package/src/app/inobeta-ui/http/http/messages.decorator.d.ts +18 -0
- package/src/app/inobeta-ui/http/http/role-check.directive.d.ts +17 -0
- package/src/app/inobeta-ui/http/http/spinner-loading.component.d.ts +9 -0
- package/src/app/inobeta-ui/http/http/spinner-loading.stub.spec.d.ts +5 -0
- package/src/app/inobeta-ui/http/http-test.module.d.ts +8 -0
- package/src/app/inobeta-ui/http/http.module.d.ts +20 -0
- package/src/app/inobeta-ui/http/index.d.ts +23 -0
- package/src/app/inobeta-ui/http/store/index.d.ts +10 -0
- package/src/app/inobeta-ui/http/store/loader/actions.d.ts +17 -0
- package/src/app/inobeta-ui/http/store/loader/interfaces.d.ts +8 -0
- package/src/app/inobeta-ui/http/store/loader/reducers.d.ts +3 -0
- package/src/app/inobeta-ui/http/store/loader/selectors.d.ts +5 -0
- package/src/app/inobeta-ui/http/store/session/actions.d.ts +20 -0
- package/src/app/inobeta-ui/http/store/session/effects.d.ts +16 -0
- package/src/app/inobeta-ui/http/store/session/interfaces.d.ts +4 -0
- package/src/app/inobeta-ui/http/store/session/reducers.d.ts +3 -0
- package/src/app/inobeta-ui/http/store/session/selectors.d.ts +4 -0
- package/src/app/inobeta-ui/http/translations.d.ts +12 -0
- package/src/app/inobeta-ui/hydration/actions.d.ts +1 -0
- package/src/app/inobeta-ui/hydration/effects.d.ts +13 -0
- package/src/app/inobeta-ui/hydration/index.d.ts +13 -0
- package/src/app/inobeta-ui/hydration/reducer.d.ts +2 -0
- package/src/app/inobeta-ui/storage/index.d.ts +3 -0
- package/src/app/inobeta-ui/storage/storage-test.module.d.ts +6 -0
- package/src/app/inobeta-ui/storage/storage.module.d.ts +6 -0
- package/src/app/inobeta-ui/storage/storage.service.d.ts +62 -0
- package/src/app/inobeta-ui/storage/storage.stub.spec.d.ts +5 -0
- package/src/app/inobeta-ui/translate/index.d.ts +1 -0
- package/src/app/inobeta-ui/translate/translate-loader.service.d.ts +11 -0
- package/src/app/inobeta-ui/ui/_index.scss +87 -0
- package/src/app/inobeta-ui/ui/breadcrumb/breadcrumb.component.d.ts +28 -0
- package/src/app/inobeta-ui/ui/breadcrumb/breadcrumb.module.d.ts +12 -0
- package/src/app/inobeta-ui/ui/breadcrumb/index.d.ts +3 -0
- package/src/app/inobeta-ui/ui/breadcrumb/material-breadcrumb/material-breadcrumb.component.d.ts +6 -0
- package/src/app/inobeta-ui/ui/data-export/data-export.module.d.ts +20 -0
- package/src/app/inobeta-ui/ui/data-export/data-export.service.d.ts +35 -0
- package/src/app/inobeta-ui/ui/data-export/formats/csv-export.service.d.ts +19 -0
- package/src/app/inobeta-ui/ui/data-export/formats/pdf-export.service.d.ts +20 -0
- package/src/app/inobeta-ui/ui/data-export/formats/xlsx-export.service.d.ts +14 -0
- package/src/app/inobeta-ui/ui/data-export/index.d.ts +9 -0
- package/src/app/inobeta-ui/ui/data-export/provider.d.ts +15 -0
- package/src/app/inobeta-ui/ui/data-export/table-data-export-dialog.component.d.ts +23 -0
- package/src/app/inobeta-ui/ui/data-export/table-data-export.component.d.ts +13 -0
- package/src/app/inobeta-ui/ui/data-export/transformer.d.ts +50 -0
- package/src/app/inobeta-ui/ui/forms/array/array.d.ts +32 -0
- package/src/app/inobeta-ui/ui/forms/controls/checkbox.d.ts +4 -0
- package/src/app/inobeta-ui/ui/forms/controls/dropdown.d.ts +4 -0
- package/src/app/inobeta-ui/ui/forms/controls/form-control-base.d.ts +88 -0
- package/src/app/inobeta-ui/ui/forms/controls/radio.d.ts +4 -0
- package/src/app/inobeta-ui/ui/forms/controls/textbox.d.ts +4 -0
- package/src/app/inobeta-ui/ui/forms/dynamic-form/dynamic-form.component.d.ts +50 -0
- package/src/app/inobeta-ui/ui/forms/dynamic-form-array/dynamic-form-array.component.d.ts +18 -0
- package/src/app/inobeta-ui/ui/forms/dynamic-form-control/dynamic-form-control.component.d.ts +11 -0
- package/src/app/inobeta-ui/ui/forms/form-control.service.d.ts +13 -0
- package/src/app/inobeta-ui/ui/forms/forms.module.d.ts +12 -0
- package/src/app/inobeta-ui/ui/forms/forms.pipes.d.ts +20 -0
- package/src/app/inobeta-ui/ui/forms/forms.types.d.ts +3 -0
- package/src/app/inobeta-ui/ui/forms/index.d.ts +11 -0
- package/src/app/inobeta-ui/ui/kai-filter/filter-button/filter-action-group.component.d.ts +5 -0
- package/src/app/inobeta-ui/ui/kai-filter/filter-button/filter-button.component.d.ts +8 -0
- package/src/app/inobeta-ui/ui/kai-filter/filter.component.d.ts +41 -0
- package/src/app/inobeta-ui/ui/kai-filter/filter.types.d.ts +141 -0
- package/src/app/inobeta-ui/ui/kai-filter/filters/base/filter-base.d.ts +42 -0
- package/src/app/inobeta-ui/ui/kai-filter/filters/boolean/boolean-filter.component.d.ts +12 -0
- package/src/app/inobeta-ui/ui/kai-filter/filters/date/filter-date.component.d.ts +56 -0
- package/src/app/inobeta-ui/ui/kai-filter/filters/number/filter-number.component.d.ts +27 -0
- package/src/app/inobeta-ui/ui/kai-filter/filters/search-bar/search-bar.component.d.ts +16 -0
- package/src/app/inobeta-ui/ui/kai-filter/filters/tag/filter-tag.component.d.ts +28 -0
- package/src/app/inobeta-ui/ui/kai-filter/filters/text/filter-text.component.d.ts +21 -0
- package/src/app/inobeta-ui/ui/kai-filter/filters.d.ts +16 -0
- package/src/app/inobeta-ui/ui/kai-filter/filters.module.d.ts +35 -0
- package/src/app/inobeta-ui/ui/kai-filter/index.d.ts +13 -0
- package/src/app/inobeta-ui/ui/kai-filter/tokens.d.ts +2 -0
- package/src/app/inobeta-ui/ui/kai-filter/translations.d.ts +50 -0
- package/src/app/inobeta-ui/ui/kai-table/_table-theme.scss +123 -0
- package/src/app/inobeta-ui/ui/kai-table/action.d.ts +19 -0
- package/src/app/inobeta-ui/ui/kai-table/cells.d.ts +88 -0
- package/src/app/inobeta-ui/ui/kai-table/columns/action-column.d.ts +9 -0
- package/src/app/inobeta-ui/ui/kai-table/columns/column.d.ts +87 -0
- package/src/app/inobeta-ui/ui/kai-table/columns/date-column.d.ts +21 -0
- package/src/app/inobeta-ui/ui/kai-table/columns/index.d.ts +6 -0
- package/src/app/inobeta-ui/ui/kai-table/columns/number-column.d.ts +16 -0
- package/src/app/inobeta-ui/ui/kai-table/columns/selection-column.d.ts +26 -0
- package/src/app/inobeta-ui/ui/kai-table/columns/text-column.d.ts +16 -0
- package/src/app/inobeta-ui/ui/kai-table/index.d.ts +12 -0
- package/src/app/inobeta-ui/ui/kai-table/paginator-intl.d.ts +18 -0
- package/src/app/inobeta-ui/ui/kai-table/remote-data-source.d.ts +60 -0
- package/src/app/inobeta-ui/ui/kai-table/rowgroup.d.ts +8 -0
- package/src/app/inobeta-ui/ui/kai-table/sort-header.d.ts +20 -0
- package/src/app/inobeta-ui/ui/kai-table/store/const.d.ts +1 -0
- package/src/app/inobeta-ui/ui/kai-table/store/index.d.ts +8 -0
- package/src/app/inobeta-ui/ui/kai-table/store/url-state/actions.d.ts +59 -0
- package/src/app/inobeta-ui/ui/kai-table/store/url-state/effects.d.ts +15 -0
- package/src/app/inobeta-ui/ui/kai-table/store/url-state/interfaces.d.ts +16 -0
- package/src/app/inobeta-ui/ui/kai-table/store/url-state/reducers.d.ts +2 -0
- package/src/app/inobeta-ui/ui/kai-table/store/url-state/selectors.d.ts +3 -0
- package/src/app/inobeta-ui/ui/kai-table/table-data-source.d.ts +164 -0
- package/src/app/inobeta-ui/ui/kai-table/table-url.service.d.ts +51 -0
- package/src/app/inobeta-ui/ui/kai-table/table.component.d.ts +79 -0
- package/src/app/inobeta-ui/ui/kai-table/table.module.d.ts +30 -0
- package/src/app/inobeta-ui/ui/kai-table/table.types.d.ts +21 -0
- package/src/app/inobeta-ui/ui/kai-table/tokens.d.ts +22 -0
- package/src/app/inobeta-ui/ui/kai-table/translations.d.ts +40 -0
- package/src/app/inobeta-ui/ui/main-menu/_main-menu-theme.scss +226 -0
- package/src/app/inobeta-ui/ui/main-menu/components/main-menu-bar/main-menu-bar.component.d.ts +56 -0
- package/src/app/inobeta-ui/ui/main-menu/components/main-menu-bar/main-menu-bar.stub.spec.d.ts +18 -0
- package/src/app/inobeta-ui/ui/main-menu/components/main-menu-dialog/main-menu-dialog.component.d.ts +13 -0
- package/src/app/inobeta-ui/ui/main-menu/components/main-menu-expanded/header-footer-buttons.component.d.ts +9 -0
- package/src/app/inobeta-ui/ui/main-menu/components/main-menu-expanded/main-menu-expanded.component.d.ts +16 -0
- package/src/app/inobeta-ui/ui/main-menu/index.d.ts +10 -0
- package/src/app/inobeta-ui/ui/main-menu/main-menu-test.module.d.ts +8 -0
- package/src/app/inobeta-ui/ui/main-menu/main-menu.module.d.ts +16 -0
- package/src/app/inobeta-ui/ui/main-menu/models/main-menu-button.model.d.ts +8 -0
- package/src/app/inobeta-ui/ui/main-menu/models/main-menu-data-set.model.d.ts +14 -0
- package/src/app/inobeta-ui/ui/main-menu/models/main-menu-data.model.d.ts +4 -0
- package/src/app/inobeta-ui/ui/material-forms/controls/autocomplete.d.ts +14 -0
- package/src/app/inobeta-ui/ui/material-forms/controls/button.d.ts +28 -0
- package/src/app/inobeta-ui/ui/material-forms/controls/checkbox.d.ts +10 -0
- package/src/app/inobeta-ui/ui/material-forms/controls/datepicker.d.ts +17 -0
- package/src/app/inobeta-ui/ui/material-forms/controls/dropdown.d.ts +29 -0
- package/src/app/inobeta-ui/ui/material-forms/controls/label.d.ts +10 -0
- package/src/app/inobeta-ui/ui/material-forms/controls/padding.d.ts +10 -0
- package/src/app/inobeta-ui/ui/material-forms/controls/radio.d.ts +10 -0
- package/src/app/inobeta-ui/ui/material-forms/controls/slide-toggle.d.ts +10 -0
- package/src/app/inobeta-ui/ui/material-forms/controls/textarea.d.ts +17 -0
- package/src/app/inobeta-ui/ui/material-forms/controls/textbox.d.ts +21 -0
- package/src/app/inobeta-ui/ui/material-forms/index.d.ts +17 -0
- package/src/app/inobeta-ui/ui/material-forms/intl/datepicker.intl.d.ts +25 -0
- package/src/app/inobeta-ui/ui/material-forms/material-form/material-form.component.d.ts +26 -0
- package/src/app/inobeta-ui/ui/material-forms/material-form/material-form.stub.spec.d.ts +21 -0
- package/src/app/inobeta-ui/ui/material-forms/material-form-array/material-form-array.component.d.ts +6 -0
- package/src/app/inobeta-ui/ui/material-forms/material-form-control/material-form-control.component.d.ts +19 -0
- package/src/app/inobeta-ui/ui/material-forms/material-form-test.module.d.ts +9 -0
- package/src/app/inobeta-ui/ui/material-forms/material-form.module.d.ts +49 -0
- package/src/app/inobeta-ui/ui/material-forms/translations.d.ts +25 -0
- package/src/app/inobeta-ui/ui/modal/index.d.ts +6 -0
- package/src/app/inobeta-ui/ui/modal/modal-message.component.d.ts +10 -0
- package/src/app/inobeta-ui/ui/modal/modal-message.model.d.ts +32 -0
- package/src/app/inobeta-ui/ui/modal/modal-message.service.d.ts +49 -0
- package/src/app/inobeta-ui/ui/modal/modal-message.service.stub.spec.d.ts +6 -0
- package/src/app/inobeta-ui/ui/modal/modal-test.module.d.ts +7 -0
- package/src/app/inobeta-ui/ui/modal/modal.module.d.ts +11 -0
- package/src/app/inobeta-ui/ui/modal/translations.d.ts +9 -0
- package/src/app/inobeta-ui/ui/toast/_toast-theme.scss +56 -0
- package/src/app/inobeta-ui/ui/toast/index.d.ts +4 -0
- package/src/app/inobeta-ui/ui/toast/toast-test.module.d.ts +6 -0
- package/src/app/inobeta-ui/ui/toast/toast.module.d.ts +7 -0
- package/src/app/inobeta-ui/ui/toast/toast.service.d.ts +36 -0
- package/src/app/inobeta-ui/ui/toast/toast.service.stub.spec.d.ts +3 -0
- package/src/app/inobeta-ui/ui/uploader/index.d.ts +2 -0
- package/src/app/inobeta-ui/ui/uploader/uploader.component.d.ts +12 -0
- package/src/app/inobeta-ui/ui/uploader/uploader.module.d.ts +10 -0
- package/src/app/inobeta-ui/ui/views/components/default-table-view/default-table-view.component.d.ts +8 -0
- package/src/app/inobeta-ui/ui/views/components/index.d.ts +5 -0
- package/src/app/inobeta-ui/ui/views/components/table-view/table-view.component.d.ts +14 -0
- package/src/app/inobeta-ui/ui/views/components/table-view-group/table-view-group.component.d.ts +45 -0
- package/src/app/inobeta-ui/ui/views/components/view-dialog/view-dialog.component.d.ts +22 -0
- package/src/app/inobeta-ui/ui/views/components/view-list/view-list.component.d.ts +16 -0
- package/src/app/inobeta-ui/ui/views/index.d.ts +4 -0
- package/src/app/inobeta-ui/ui/views/store/actions.d.ts +27 -0
- package/src/app/inobeta-ui/ui/views/store/index.d.ts +2 -0
- package/src/app/inobeta-ui/ui/views/store/reducer.d.ts +7 -0
- package/src/app/inobeta-ui/ui/views/store/views/index.d.ts +3 -0
- package/src/app/inobeta-ui/ui/views/store/views/reducer.d.ts +3 -0
- package/src/app/inobeta-ui/ui/views/store/views/selectors.d.ts +4 -0
- package/src/app/inobeta-ui/ui/views/store/views/table-view.d.ts +22 -0
- package/src/app/inobeta-ui/ui/views/translations.d.ts +33 -0
- package/src/app/inobeta-ui/ui/views/view.module.d.ts +23 -0
- package/src/app/inobeta-ui/ui/views/view.service.d.ts +40 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { createReducer, on } from "@ngrx/store";
|
|
2
|
+
import { urlStateActions } from "./actions";
|
|
3
|
+
const INITIAL = {
|
|
4
|
+
tables: []
|
|
5
|
+
};
|
|
6
|
+
export const urlStateReducer = createReducer(INITIAL, on(urlStateActions.setFilters, (stateIn, action) => {
|
|
7
|
+
let state = structuredClone(stateIn);
|
|
8
|
+
const table = getTable(action.tableName, state.tables);
|
|
9
|
+
table.filters = action.params;
|
|
10
|
+
return {
|
|
11
|
+
...state
|
|
12
|
+
};
|
|
13
|
+
}), on(urlStateActions.setPaginator, (stateIn, action) => {
|
|
14
|
+
let state = structuredClone(stateIn);
|
|
15
|
+
const table = getTable(action.tableName, state.tables);
|
|
16
|
+
table.page = action.params.pageIndex;
|
|
17
|
+
table.pageSize = action.params.pageSize;
|
|
18
|
+
return {
|
|
19
|
+
...state
|
|
20
|
+
};
|
|
21
|
+
}), on(urlStateActions.setAggregatedColumns, (stateIn, action) => {
|
|
22
|
+
let state = structuredClone(stateIn);
|
|
23
|
+
const table = getTable(action.tableName, state.tables);
|
|
24
|
+
table.aggregatedColumns = { ...action.params };
|
|
25
|
+
return {
|
|
26
|
+
...state
|
|
27
|
+
};
|
|
28
|
+
}), on(urlStateActions.setSort, (stateIn, action) => {
|
|
29
|
+
let state = structuredClone(stateIn);
|
|
30
|
+
const table = getTable(action.tableName, state.tables);
|
|
31
|
+
table.sort = { ...action.params };
|
|
32
|
+
return {
|
|
33
|
+
...state
|
|
34
|
+
};
|
|
35
|
+
}), on(urlStateActions.handleViewChange, (stateIn, action) => {
|
|
36
|
+
let state = structuredClone(stateIn);
|
|
37
|
+
const table = getTable(action.tableName, state.tables);
|
|
38
|
+
table.view = action.params.view;
|
|
39
|
+
table.page = action.params.page;
|
|
40
|
+
table.pageSize = action.params.pageSize;
|
|
41
|
+
table.filters = action.params.filters;
|
|
42
|
+
table.aggregatedColumns = action.params.aggregatedColumns;
|
|
43
|
+
table.sort = action.params.sort;
|
|
44
|
+
return {
|
|
45
|
+
...state
|
|
46
|
+
};
|
|
47
|
+
}));
|
|
48
|
+
function getTable(tableName, state) {
|
|
49
|
+
let table = state.find((table) => table.tableName === tableName);
|
|
50
|
+
if (!table) {
|
|
51
|
+
state.push({ tableName });
|
|
52
|
+
table = state.find((table) => table.tableName === tableName);
|
|
53
|
+
}
|
|
54
|
+
return table;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWNlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2lub2JldGEtdWkvdWkva2FpLXRhYmxlL3N0b3JlL3VybC1zdGF0ZS9yZWR1Y2Vycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNoRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRzVDLE1BQU0sT0FBTyxHQUFtQjtJQUM5QixNQUFNLEVBQUUsRUFBRTtDQUNYLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFDbEQsRUFBRSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7SUFDakQsSUFBSSxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2RCxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDOUIsT0FBTztRQUNMLEdBQUcsS0FBSztLQUNULENBQUE7QUFDSCxDQUFDLENBQUMsRUFDRixFQUFFLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtJQUNuRCxJQUFJLEtBQUssR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZELEtBQUssQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDckMsS0FBSyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUN4QyxPQUFPO1FBQ0wsR0FBRyxLQUFLO0tBQ1QsQ0FBQTtBQUNILENBQUMsQ0FBQyxFQUNGLEVBQUUsQ0FBQyxlQUFlLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7SUFDM0QsSUFBSSxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2RCxLQUFLLENBQUMsaUJBQWlCLEdBQUcsRUFBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUMsQ0FBQTtJQUM1QyxPQUFPO1FBQ0wsR0FBRyxLQUFLO0tBQ1QsQ0FBQTtBQUNILENBQUMsQ0FBQyxFQUNGLEVBQUUsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO0lBQzlDLElBQUksS0FBSyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkQsS0FBSyxDQUFDLElBQUksR0FBRyxFQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBQyxDQUFDO0lBQ2hDLE9BQU87UUFDTCxHQUFHLEtBQUs7S0FDVCxDQUFBO0FBQ0gsQ0FBQyxDQUFDLEVBQ0YsRUFBRSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtJQUN2RCxJQUFJLEtBQUssR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZELEtBQUssQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDaEMsS0FBSyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQyxLQUFLLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ3hDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDdEMsS0FBSyxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFDMUQsS0FBSyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQyxPQUFPO1FBQ0wsR0FBRyxLQUFLO0tBQ1QsQ0FBQTtBQUNILENBQUMsQ0FBQyxDQUNILENBQUM7QUFLRixTQUFTLFFBQVEsQ0FBQyxTQUFpQixFQUFFLEtBQThCO0lBQ2pFLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDakUsSUFBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1YsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDMUIsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgY3JlYXRlUmVkdWNlciwgb24gfSBmcm9tIFwiQG5ncngvc3RvcmVcIjtcbmltcG9ydCB7IHVybFN0YXRlQWN0aW9ucyB9IGZyb20gXCIuL2FjdGlvbnNcIjtcbmltcG9ydCB7IElVcmxTdGF0ZVN0YXRlLCBJYkthaVRhYmxlTmFtZWRQYXJhbXMgfSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5cbmNvbnN0IElOSVRJQUw6IElVcmxTdGF0ZVN0YXRlID0ge1xuICB0YWJsZXM6IFtdXG59XG5cbmV4cG9ydCBjb25zdCB1cmxTdGF0ZVJlZHVjZXIgPSBjcmVhdGVSZWR1Y2VyKElOSVRJQUwsXG4gIG9uKHVybFN0YXRlQWN0aW9ucy5zZXRGaWx0ZXJzLCAoc3RhdGVJbiwgYWN0aW9uKSA9PiB7XG4gICAgbGV0IHN0YXRlID0gc3RydWN0dXJlZENsb25lKHN0YXRlSW4pO1xuICAgIGNvbnN0IHRhYmxlID0gZ2V0VGFibGUoYWN0aW9uLnRhYmxlTmFtZSwgc3RhdGUudGFibGVzKTtcbiAgICB0YWJsZS5maWx0ZXJzID0gYWN0aW9uLnBhcmFtcztcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGVcbiAgICB9XG4gIH0pLFxuICBvbih1cmxTdGF0ZUFjdGlvbnMuc2V0UGFnaW5hdG9yLCAoc3RhdGVJbiwgYWN0aW9uKSA9PiB7XG4gICAgbGV0IHN0YXRlID0gc3RydWN0dXJlZENsb25lKHN0YXRlSW4pO1xuICAgIGNvbnN0IHRhYmxlID0gZ2V0VGFibGUoYWN0aW9uLnRhYmxlTmFtZSwgc3RhdGUudGFibGVzKTtcbiAgICB0YWJsZS5wYWdlID0gYWN0aW9uLnBhcmFtcy5wYWdlSW5kZXg7XG4gICAgdGFibGUucGFnZVNpemUgPSBhY3Rpb24ucGFyYW1zLnBhZ2VTaXplO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZVxuICAgIH1cbiAgfSksXG4gIG9uKHVybFN0YXRlQWN0aW9ucy5zZXRBZ2dyZWdhdGVkQ29sdW1ucywgKHN0YXRlSW4sIGFjdGlvbikgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHN0cnVjdHVyZWRDbG9uZShzdGF0ZUluKTtcbiAgICBjb25zdCB0YWJsZSA9IGdldFRhYmxlKGFjdGlvbi50YWJsZU5hbWUsIHN0YXRlLnRhYmxlcyk7XG4gICAgdGFibGUuYWdncmVnYXRlZENvbHVtbnMgPSB7Li4uYWN0aW9uLnBhcmFtc31cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGVcbiAgICB9XG4gIH0pLFxuICBvbih1cmxTdGF0ZUFjdGlvbnMuc2V0U29ydCwgKHN0YXRlSW4sIGFjdGlvbikgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHN0cnVjdHVyZWRDbG9uZShzdGF0ZUluKTtcbiAgICBjb25zdCB0YWJsZSA9IGdldFRhYmxlKGFjdGlvbi50YWJsZU5hbWUsIHN0YXRlLnRhYmxlcyk7XG4gICAgdGFibGUuc29ydCA9IHsuLi5hY3Rpb24ucGFyYW1zfTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGVcbiAgICB9XG4gIH0pLFxuICBvbih1cmxTdGF0ZUFjdGlvbnMuaGFuZGxlVmlld0NoYW5nZSwgKHN0YXRlSW4sIGFjdGlvbikgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHN0cnVjdHVyZWRDbG9uZShzdGF0ZUluKTtcbiAgICBjb25zdCB0YWJsZSA9IGdldFRhYmxlKGFjdGlvbi50YWJsZU5hbWUsIHN0YXRlLnRhYmxlcyk7XG4gICAgdGFibGUudmlldyA9IGFjdGlvbi5wYXJhbXMudmlldztcbiAgICB0YWJsZS5wYWdlID0gYWN0aW9uLnBhcmFtcy5wYWdlO1xuICAgIHRhYmxlLnBhZ2VTaXplID0gYWN0aW9uLnBhcmFtcy5wYWdlU2l6ZTtcbiAgICB0YWJsZS5maWx0ZXJzID0gYWN0aW9uLnBhcmFtcy5maWx0ZXJzO1xuICAgIHRhYmxlLmFnZ3JlZ2F0ZWRDb2x1bW5zID0gYWN0aW9uLnBhcmFtcy5hZ2dyZWdhdGVkQ29sdW1ucztcbiAgICB0YWJsZS5zb3J0ID0gYWN0aW9uLnBhcmFtcy5zb3J0O1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZVxuICAgIH1cbiAgfSksXG4pO1xuXG5cblxuXG5mdW5jdGlvbiBnZXRUYWJsZSh0YWJsZU5hbWU6IHN0cmluZywgc3RhdGU6IEliS2FpVGFibGVOYW1lZFBhcmFtc1tdKSB7XG4gIGxldCB0YWJsZSA9IHN0YXRlLmZpbmQoKHRhYmxlKSA9PiB0YWJsZS50YWJsZU5hbWUgPT09IHRhYmxlTmFtZSk7XG4gIGlmKCF0YWJsZSkge1xuICAgIHN0YXRlLnB1c2goeyB0YWJsZU5hbWUgfSk7XG4gICAgdGFibGUgPSBzdGF0ZS5maW5kKCh0YWJsZSkgPT4gdGFibGUudGFibGVOYW1lID09PSB0YWJsZU5hbWUpO1xuICB9XG4gIHJldHVybiB0YWJsZTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createFeatureSelector, createSelector } from "@ngrx/store";
|
|
2
|
+
import { kaiTableFeatureKey } from "../const";
|
|
3
|
+
const selectFeature = createFeatureSelector(kaiTableFeatureKey);
|
|
4
|
+
const selectAllUrlStateStore = createSelector(selectFeature, (state) => {
|
|
5
|
+
return state.urlState;
|
|
6
|
+
});
|
|
7
|
+
const selectUrlState = (tableName) => createSelector(selectAllUrlStateStore, (state) => {
|
|
8
|
+
return state.tables.find((table) => table.tableName === tableName);
|
|
9
|
+
});
|
|
10
|
+
export const ibTableSelectLastQueryStringRaw = (tableName) => createSelector(selectUrlState(tableName), (state) => ({
|
|
11
|
+
ibfilter: state.filters,
|
|
12
|
+
ibpage: state.page,
|
|
13
|
+
ibpagesize: state.pageSize,
|
|
14
|
+
ibaggregatedcolumns: state.aggregatedColumns,
|
|
15
|
+
ibsort: state.sort,
|
|
16
|
+
ibview: state.view
|
|
17
|
+
}));
|
|
18
|
+
export const ibTableSelectLastQueryString = (tableName) => createSelector(ibTableSelectLastQueryStringRaw(tableName), (state) => JSON.stringify(state));
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9pbm9iZXRhLXVpL3VpL2thaS10YWJsZS9zdG9yZS91cmwtc3RhdGUvc2VsZWN0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBSzlDLE1BQU0sYUFBYSxHQUFHLHFCQUFxQixDQUFpQixrQkFBa0IsQ0FBQyxDQUFDO0FBRWhGLE1BQU0sc0JBQXNCLEdBQUcsY0FBYyxDQUMzQyxhQUFhLEVBQ2IsQ0FBQyxLQUFxQixFQUFrQixFQUFFO0lBQ3hDLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQTtBQUN2QixDQUFDLENBQ0YsQ0FBQTtBQUVELE1BQU0sY0FBYyxHQUFHLENBQUMsU0FBaUIsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUMxRCxzQkFBc0IsRUFDdEIsQ0FBQyxLQUFxQixFQUFFLEVBQUU7SUFDeEIsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQTtBQUNwRSxDQUFDLENBQ0YsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLENBQUMsU0FBaUIsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUNsRixjQUFjLENBQUMsU0FBUyxDQUFDLEVBQ3pCLENBQUMsS0FBSyxFQUFtQixFQUFFLENBQUMsQ0FBQztJQUMzQixRQUFRLEVBQUUsS0FBSyxDQUFDLE9BQU87SUFDdkIsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJO0lBQ2xCLFVBQVUsRUFBRSxLQUFLLENBQUMsUUFBUTtJQUMxQixtQkFBbUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCO0lBQzVDLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSTtJQUNsQixNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUk7Q0FDbkIsQ0FBQyxDQUNILENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLFNBQWlCLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FDL0UsK0JBQStCLENBQUMsU0FBUyxDQUFDLEVBQzFDLENBQUMsS0FBSyxFQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUN6QyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlRmVhdHVyZVNlbGVjdG9yLCBjcmVhdGVTZWxlY3RvciB9IGZyb20gXCJAbmdyeC9zdG9yZVwiO1xuaW1wb3J0IHsga2FpVGFibGVGZWF0dXJlS2V5IH0gZnJvbSBcIi4uL2NvbnN0XCI7XG5pbXBvcnQgeyBJS2FpVGFibGVTdG9yZSB9IGZyb20gXCIuLlwiO1xuaW1wb3J0IHsgSVVybFN0YXRlU3RhdGUgfSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBJYlRhYmxlUXNQYXJhbXMgfSBmcm9tIFwiLi4vLi4vdGFibGUtdXJsLnNlcnZpY2VcIjtcblxuY29uc3Qgc2VsZWN0RmVhdHVyZSA9IGNyZWF0ZUZlYXR1cmVTZWxlY3RvcjxJS2FpVGFibGVTdG9yZT4oa2FpVGFibGVGZWF0dXJlS2V5KTtcblxuY29uc3Qgc2VsZWN0QWxsVXJsU3RhdGVTdG9yZSA9IGNyZWF0ZVNlbGVjdG9yKFxuICBzZWxlY3RGZWF0dXJlLFxuICAoc3RhdGU6IElLYWlUYWJsZVN0b3JlKTogSVVybFN0YXRlU3RhdGUgPT4ge1xuICAgIHJldHVybiBzdGF0ZS51cmxTdGF0ZVxuICB9XG4pXG5cbmNvbnN0IHNlbGVjdFVybFN0YXRlID0gKHRhYmxlTmFtZTogc3RyaW5nKSA9PiBjcmVhdGVTZWxlY3RvcihcbiAgc2VsZWN0QWxsVXJsU3RhdGVTdG9yZSxcbiAgKHN0YXRlOiBJVXJsU3RhdGVTdGF0ZSkgPT4ge1xuICAgIHJldHVybiBzdGF0ZS50YWJsZXMuZmluZCgodGFibGUpID0+IHRhYmxlLnRhYmxlTmFtZSA9PT0gdGFibGVOYW1lKVxuICB9XG4pXG5cbmV4cG9ydCBjb25zdCBpYlRhYmxlU2VsZWN0TGFzdFF1ZXJ5U3RyaW5nUmF3ID0gKHRhYmxlTmFtZTogc3RyaW5nKSA9PiBjcmVhdGVTZWxlY3RvcihcbiAgc2VsZWN0VXJsU3RhdGUodGFibGVOYW1lKSxcbiAgKHN0YXRlKTogSWJUYWJsZVFzUGFyYW1zID0+ICh7XG4gICAgaWJmaWx0ZXI6IHN0YXRlLmZpbHRlcnMsXG4gICAgaWJwYWdlOiBzdGF0ZS5wYWdlLFxuICAgIGlicGFnZXNpemU6IHN0YXRlLnBhZ2VTaXplLFxuICAgIGliYWdncmVnYXRlZGNvbHVtbnM6IHN0YXRlLmFnZ3JlZ2F0ZWRDb2x1bW5zLFxuICAgIGlic29ydDogc3RhdGUuc29ydCxcbiAgICBpYnZpZXc6IHN0YXRlLnZpZXdcbiAgfSlcbilcblxuZXhwb3J0IGNvbnN0IGliVGFibGVTZWxlY3RMYXN0UXVlcnlTdHJpbmcgPSAodGFibGVOYW1lOiBzdHJpbmcpID0+IGNyZWF0ZVNlbGVjdG9yKFxuICBpYlRhYmxlU2VsZWN0TGFzdFF1ZXJ5U3RyaW5nUmF3KHRhYmxlTmFtZSksXG4gIChzdGF0ZSk6IHN0cmluZyA9PiBKU09OLnN0cmluZ2lmeShzdGF0ZSlcbilcbiJdfQ==
|
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
import { DataSource } from "@angular/cdk/collections";
|
|
2
|
+
import { inject } from "@angular/core";
|
|
3
|
+
import { BehaviorSubject, Subject, combineLatest, merge, of as observableOf, } from "rxjs";
|
|
4
|
+
import { filter, map } from "rxjs/operators";
|
|
5
|
+
import { applyFilter } from "../kai-filter/filters";
|
|
6
|
+
import { IB_AGGREGATE } from "./tokens";
|
|
7
|
+
import { Store } from "@ngrx/store";
|
|
8
|
+
import { urlStateActions } from "./store/url-state/actions";
|
|
9
|
+
/**
|
|
10
|
+
* Data source that accepts a client-side data array and includes native support of filtering,
|
|
11
|
+
* sorting (using MatSort), and pagination (using MatPaginator).
|
|
12
|
+
*
|
|
13
|
+
* Allows for sort customization by overriding sortingDataAccessor, which defines how data
|
|
14
|
+
* properties are accessed. Also allows for filter customization by overriding filterPredicate,
|
|
15
|
+
* which defines how row data is converted to a string for filter matching.
|
|
16
|
+
*/
|
|
17
|
+
export class IbTableDataSource extends DataSource {
|
|
18
|
+
/** Stream that emits when a new data array is set on the data source. */
|
|
19
|
+
_data;
|
|
20
|
+
/** Stream emitting render data to the table (depends on ordered data changes). */
|
|
21
|
+
_renderData = new BehaviorSubject([]);
|
|
22
|
+
/** Used to react to internal changes of the paginator that are made by the data source itself. */
|
|
23
|
+
_internalPageChanges = new Subject();
|
|
24
|
+
/**
|
|
25
|
+
* Subscription to the changes that should trigger an update to the table's rendered rows, such
|
|
26
|
+
* as filtering, sorting, pagination, or base data changes.
|
|
27
|
+
*/
|
|
28
|
+
_renderChangesSubscription = null;
|
|
29
|
+
_viewChangesSubscription = null;
|
|
30
|
+
tableName;
|
|
31
|
+
/**
|
|
32
|
+
* The filtered set of data that has been matched by the filter string, or all the data if there
|
|
33
|
+
* is no filter. Useful for knowing the set of data the table represents.
|
|
34
|
+
* For example, a 'selectAll()' function would likely want to select the set of filtered data
|
|
35
|
+
* shown to the user rather than all the data.
|
|
36
|
+
*/
|
|
37
|
+
filteredData;
|
|
38
|
+
/** Array of data that should be rendered by the table, where each object represents one row. */
|
|
39
|
+
get data() {
|
|
40
|
+
return this._data.value;
|
|
41
|
+
}
|
|
42
|
+
set data(data) {
|
|
43
|
+
data = Array.isArray(data) ? data : [];
|
|
44
|
+
this._data.next(data);
|
|
45
|
+
this._initializeFilters(data);
|
|
46
|
+
// Normally the `filteredData` is updated by the re-render
|
|
47
|
+
// subscription, but that won't happen if it's inactive.
|
|
48
|
+
if (!this._renderChangesSubscription) {
|
|
49
|
+
this._filterData(data);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Instance of the IbFilter component used by the table to filter its data. Filter changes
|
|
54
|
+
* emitted by the IbFilter will trigger an update to the table's rendered data.
|
|
55
|
+
*/
|
|
56
|
+
get filter() {
|
|
57
|
+
return this._filter;
|
|
58
|
+
}
|
|
59
|
+
set filter(f) {
|
|
60
|
+
this._filter = f;
|
|
61
|
+
this._initializeFilters(this.data);
|
|
62
|
+
this._updateChangeSubscription();
|
|
63
|
+
}
|
|
64
|
+
_filter;
|
|
65
|
+
/**
|
|
66
|
+
* Instance of the MatSort directive used by the table to control its sorting. Sort changes
|
|
67
|
+
* emitted by the MatSort will trigger an update to the table's rendered data.
|
|
68
|
+
*/
|
|
69
|
+
get sort() {
|
|
70
|
+
return this._sort;
|
|
71
|
+
}
|
|
72
|
+
set sort(sort) {
|
|
73
|
+
this._sort = sort;
|
|
74
|
+
this._updateChangeSubscription();
|
|
75
|
+
}
|
|
76
|
+
_sort;
|
|
77
|
+
_sortState = {
|
|
78
|
+
active: "",
|
|
79
|
+
direction: "",
|
|
80
|
+
};
|
|
81
|
+
get sortState() {
|
|
82
|
+
return {
|
|
83
|
+
active: this._sortState.direction !== '' ? this._sortState.active : '',
|
|
84
|
+
direction: this._sortState.direction
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
set sortState(sort) {
|
|
88
|
+
this._sortState = {
|
|
89
|
+
active: sort?.active ?? '',
|
|
90
|
+
direction: sort?.direction ?? ''
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Instance of the paginator component used by the table to control what page of the data is
|
|
95
|
+
* displayed. Page changes emitted by the paginator will trigger an update to the
|
|
96
|
+
* table's rendered data.
|
|
97
|
+
*
|
|
98
|
+
* Note that the data source uses the paginator's properties to calculate which page of data
|
|
99
|
+
* should be displayed. If the paginator receives its properties as template inputs,
|
|
100
|
+
* e.g. `[pageLength]=100` or `[pageIndex]=1`, then be sure that the paginator's view has been
|
|
101
|
+
* initialized before assigning it to this data source.
|
|
102
|
+
*/
|
|
103
|
+
get paginator() {
|
|
104
|
+
return this._paginator;
|
|
105
|
+
}
|
|
106
|
+
set paginator(paginator) {
|
|
107
|
+
this._paginator = paginator;
|
|
108
|
+
this._updateChangeSubscription();
|
|
109
|
+
}
|
|
110
|
+
_paginator;
|
|
111
|
+
get columns() {
|
|
112
|
+
return this._columns;
|
|
113
|
+
}
|
|
114
|
+
set columns(columns) {
|
|
115
|
+
this._columns = columns.reduce((acc, c) => ({ [c.name]: c, ...acc }), {});
|
|
116
|
+
}
|
|
117
|
+
_columns = {};
|
|
118
|
+
set view(view) {
|
|
119
|
+
this._view = view;
|
|
120
|
+
this._updateViewChangeSubscription();
|
|
121
|
+
}
|
|
122
|
+
get view() {
|
|
123
|
+
return this._view;
|
|
124
|
+
}
|
|
125
|
+
_view;
|
|
126
|
+
/**
|
|
127
|
+
* Aggregated data by column name.
|
|
128
|
+
*/
|
|
129
|
+
aggregatedData = {};
|
|
130
|
+
/**
|
|
131
|
+
* Dictionary of columns to aggregate and the function (function id) to apply.
|
|
132
|
+
* Note: this structure is serialized within a view
|
|
133
|
+
*/
|
|
134
|
+
aggregatedColumns = {};
|
|
135
|
+
aggregationFunctions = inject(IB_AGGREGATE);
|
|
136
|
+
store = inject(Store);
|
|
137
|
+
/**
|
|
138
|
+
* Used to trigger the aggregation of a column by the user.
|
|
139
|
+
*
|
|
140
|
+
* IbTableViewGroup listens to this stream to detect state changes
|
|
141
|
+
*/
|
|
142
|
+
aggregate = new Subject();
|
|
143
|
+
/**
|
|
144
|
+
* Whether the table should display the aggregation footer.
|
|
145
|
+
* (this reeks...)
|
|
146
|
+
*/
|
|
147
|
+
get shouldDisplayAggregationFooter() {
|
|
148
|
+
return Object.values(this.columns).filter((c) => c.aggregate).length > 0;
|
|
149
|
+
}
|
|
150
|
+
selectionColumn;
|
|
151
|
+
/**
|
|
152
|
+
* Gets a sorted copy of the data array based on the state of the MatSort. Called
|
|
153
|
+
* after changes are made to the filtered data or when sort changes are emitted from MatSort.
|
|
154
|
+
* By default, the function retrieves the active sort and its direction and compares data
|
|
155
|
+
* by retrieving data using the sortingDataAccessor.
|
|
156
|
+
* @param data The array of data that should be sorted.
|
|
157
|
+
* @param sort The connected MatSort that holds the current sort state.
|
|
158
|
+
*/
|
|
159
|
+
sortData = (data, sort) => {
|
|
160
|
+
const active = sort.active;
|
|
161
|
+
const direction = sort.direction;
|
|
162
|
+
if (!active || direction == "") {
|
|
163
|
+
return data;
|
|
164
|
+
}
|
|
165
|
+
const column = this._columns[active];
|
|
166
|
+
return data.sort((a, b) => {
|
|
167
|
+
let valueA = column.sortingDataAccessor(a, active);
|
|
168
|
+
let valueB = column.sortingDataAccessor(b, active);
|
|
169
|
+
// If there are data in the column that can be converted to a number,
|
|
170
|
+
// it must be ensured that the rest of the data
|
|
171
|
+
// is of the same type so as not to order incorrectly.
|
|
172
|
+
const valueAType = typeof valueA;
|
|
173
|
+
const valueBType = typeof valueB;
|
|
174
|
+
if (valueAType !== valueBType) {
|
|
175
|
+
if (valueAType === "number") {
|
|
176
|
+
valueA += "";
|
|
177
|
+
}
|
|
178
|
+
if (valueBType === "number") {
|
|
179
|
+
valueB += "";
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// If both valueA and valueB exist (truthy), then compare the two. Otherwise, check if
|
|
183
|
+
// one value exists while the other doesn't. In this case, existing value should come last.
|
|
184
|
+
// This avoids inconsistent results when comparing values to undefined/null.
|
|
185
|
+
// If neither value exists, return 0 (equal).
|
|
186
|
+
let comparatorResult = 0;
|
|
187
|
+
if (valueA != null && valueB != null) {
|
|
188
|
+
// Check if one value is greater than the other; if equal, comparatorResult should remain 0.
|
|
189
|
+
if (valueA > valueB) {
|
|
190
|
+
comparatorResult = 1;
|
|
191
|
+
}
|
|
192
|
+
else if (valueA < valueB) {
|
|
193
|
+
comparatorResult = -1;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else if (valueA != null) {
|
|
197
|
+
comparatorResult = 1;
|
|
198
|
+
}
|
|
199
|
+
else if (valueB != null) {
|
|
200
|
+
comparatorResult = -1;
|
|
201
|
+
}
|
|
202
|
+
return comparatorResult * (direction == "asc" ? 1 : -1);
|
|
203
|
+
});
|
|
204
|
+
};
|
|
205
|
+
/**
|
|
206
|
+
* Checks if a data object matches the data source's filter.
|
|
207
|
+
* @param data Data object used to check against the filter.
|
|
208
|
+
* @param filter Filter that has been set on the data source.
|
|
209
|
+
* @returns Whether the filter matches against the data
|
|
210
|
+
*/
|
|
211
|
+
filterPredicate = (data, filter) => {
|
|
212
|
+
const { ibSearchBar, ...filters } = filter;
|
|
213
|
+
const matchesSearchBar = this.applySearchBarFilter(data, ibSearchBar);
|
|
214
|
+
const matches = Object.entries(filters).every(([columnName, condition]) => {
|
|
215
|
+
const column = this.columns[columnName];
|
|
216
|
+
if (!column) {
|
|
217
|
+
throw Error(`ib-filter: column ${columnName} not found`);
|
|
218
|
+
}
|
|
219
|
+
const filterValue = column.filterDataAccessor(data, columnName);
|
|
220
|
+
return applyFilter(condition, filterValue);
|
|
221
|
+
});
|
|
222
|
+
return matches && matchesSearchBar;
|
|
223
|
+
};
|
|
224
|
+
applySearchBarFilter = (data, filter) => {
|
|
225
|
+
if (!filter) {
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
const dataStr = Object.keys(data)
|
|
229
|
+
.reduce((currentTerm, key) => {
|
|
230
|
+
const column = this.columns[key];
|
|
231
|
+
const value = column ? column.filterDataAccessor(data, key) : data[key];
|
|
232
|
+
return currentTerm + value + "◬";
|
|
233
|
+
}, "")
|
|
234
|
+
.toLowerCase();
|
|
235
|
+
return applyFilter(filter, dataStr);
|
|
236
|
+
};
|
|
237
|
+
constructor(initialData = []) {
|
|
238
|
+
super();
|
|
239
|
+
this._data = new BehaviorSubject(initialData);
|
|
240
|
+
this._updateChangeSubscription();
|
|
241
|
+
this.aggregate.subscribe((target) => {
|
|
242
|
+
this.aggregatedColumns[target.columnName] = target.function;
|
|
243
|
+
this.store.dispatch(urlStateActions.setAggregatedColumns({ tableName: this.tableName, params: { ...this.aggregatedColumns } }));
|
|
244
|
+
this._aggregateData(this.filteredData);
|
|
245
|
+
this._aggregatePaginatedData(this._pageData(this._orderData(this.filteredData)));
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
_initializeFilters(data) {
|
|
249
|
+
this.filter?.filters.forEach((f) => f.initializeFromColumn(data));
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Subscribe to changes that should trigger an update to the table's rendered rows. When the
|
|
253
|
+
* changes occur, process the current state of the filter, sort, and pagination along with
|
|
254
|
+
* the provided base data and send it to the table for rendering.
|
|
255
|
+
*/
|
|
256
|
+
_updateChangeSubscription() {
|
|
257
|
+
// Sorting and/or pagination should be watched if sort and/or paginator are provided.
|
|
258
|
+
// The events should emit whenever the component emits a change or initializes, or if no
|
|
259
|
+
// component is provided, a stream with just a null event should be provided.
|
|
260
|
+
// The `sortChange` and `pageChange` acts as a signal to the combineLatests below so that the
|
|
261
|
+
// pipeline can progress to the next step. Note that the value from these streams are not used,
|
|
262
|
+
// they purely act as a signal to progress in the pipeline.
|
|
263
|
+
const sortChange = this._sort
|
|
264
|
+
? merge(this.sort.sortChange, this.sort.initialized)
|
|
265
|
+
: observableOf(null);
|
|
266
|
+
const pageChange = this._paginator
|
|
267
|
+
? merge(this._paginator.page, this._internalPageChanges, this._paginator.initialized)
|
|
268
|
+
: observableOf(null);
|
|
269
|
+
const filterChange = this._filter
|
|
270
|
+
? merge(this._filter.ibFilterUpdated, this._filter.initialized)
|
|
271
|
+
: observableOf(null);
|
|
272
|
+
const dataStream = this._data;
|
|
273
|
+
// Watch for base data or filter changes to provide a filtered set of data.
|
|
274
|
+
const filteredData = combineLatest([dataStream, filterChange]).pipe(map(([data, filterChange]) => {
|
|
275
|
+
if (this.filter?.initialized) {
|
|
276
|
+
this.store.dispatch(urlStateActions.setFilters({ tableName: this.tableName, params: this.filter?.selectedCriteria ?? {} }));
|
|
277
|
+
}
|
|
278
|
+
return this._filterData(data);
|
|
279
|
+
}), map((data) => this._aggregateData(data)));
|
|
280
|
+
// Watch for filtered data or sort changes to provide an ordered set of data.
|
|
281
|
+
const orderedData = combineLatest([filteredData, sortChange]).pipe(map(([data, sort]) => {
|
|
282
|
+
if (sort) {
|
|
283
|
+
this.sortState = this.sort;
|
|
284
|
+
this.store.dispatch(urlStateActions.setSort({ tableName: this.tableName, params: this.sortState }));
|
|
285
|
+
}
|
|
286
|
+
return this._orderData(data);
|
|
287
|
+
}));
|
|
288
|
+
// Watch for ordered data or page changes to provide a paged set of data.
|
|
289
|
+
const paginatedData = combineLatest([orderedData, pageChange]).pipe(map(([data]) => this._pageData(data)), map((data) => this._aggregatePaginatedData(data)));
|
|
290
|
+
// Watched for paged data changes and send the result to the table to render.
|
|
291
|
+
this._renderChangesSubscription?.unsubscribe();
|
|
292
|
+
this._renderChangesSubscription = paginatedData.subscribe((data) => {
|
|
293
|
+
this._renderData.next(data);
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
_updateViewChangeSubscription() {
|
|
297
|
+
this.view.defaultView.data = {
|
|
298
|
+
filter: this.filter.initialRawValue,
|
|
299
|
+
pageSize: this.paginator.pageSize,
|
|
300
|
+
aggregatedColumns: this.aggregatedColumns,
|
|
301
|
+
sort: {
|
|
302
|
+
...this.sortState
|
|
303
|
+
}
|
|
304
|
+
};
|
|
305
|
+
this.view.viewDataAccessor = () => {
|
|
306
|
+
return {
|
|
307
|
+
filter: this.filter.selectedCriteria,
|
|
308
|
+
pageSize: this.paginator.pageSize,
|
|
309
|
+
aggregatedColumns: this.aggregatedColumns,
|
|
310
|
+
sort: {
|
|
311
|
+
...this.sortState
|
|
312
|
+
},
|
|
313
|
+
};
|
|
314
|
+
};
|
|
315
|
+
const changes$ = merge(this.filter.ibQueryUpdated, this.paginator.page, this.aggregate, this.sort.sortChange);
|
|
316
|
+
this.view.handleStateChanges(changes$);
|
|
317
|
+
this._viewChangesSubscription?.unsubscribe();
|
|
318
|
+
this._viewChangesSubscription = this.view._activeView
|
|
319
|
+
// Skip initial view, initialization come from querystring
|
|
320
|
+
.pipe(filter((view) => !!view && !view.initial))
|
|
321
|
+
.subscribe(this.handleViewChange);
|
|
322
|
+
}
|
|
323
|
+
handleViewChange = (view) => {
|
|
324
|
+
this.paginator.firstPage();
|
|
325
|
+
this.paginator.pageSize = view.data.pageSize;
|
|
326
|
+
this.aggregatedColumns = { ...view.data.aggregatedColumns };
|
|
327
|
+
this.filter.value = view.data.filter;
|
|
328
|
+
this.sortState = view.data.sort;
|
|
329
|
+
this.store.dispatch(urlStateActions.handleViewChange({
|
|
330
|
+
tableName: this.tableName,
|
|
331
|
+
params: {
|
|
332
|
+
view: view.id,
|
|
333
|
+
pageSize: view.data.pageSize,
|
|
334
|
+
page: 0,
|
|
335
|
+
filters: view.data.filter,
|
|
336
|
+
aggregatedColumns: view.data.aggregatedColumns,
|
|
337
|
+
sort: {
|
|
338
|
+
active: view.data.sort.active,
|
|
339
|
+
direction: view.data.sort.direction,
|
|
340
|
+
},
|
|
341
|
+
}
|
|
342
|
+
}));
|
|
343
|
+
};
|
|
344
|
+
/**
|
|
345
|
+
* Returns a filtered data array where each row satisfies the filter.
|
|
346
|
+
* If no filter is set, returns the data array as provided.
|
|
347
|
+
*/
|
|
348
|
+
_filterData(data) {
|
|
349
|
+
this.selectionColumn?.selection.clear();
|
|
350
|
+
this.filteredData = !this.filter?.value
|
|
351
|
+
? data
|
|
352
|
+
: data.filter((obj) => this.filterPredicate(obj, this.filter.value));
|
|
353
|
+
if (this.paginator) {
|
|
354
|
+
this._updatePaginator(this.filteredData.length);
|
|
355
|
+
}
|
|
356
|
+
return this.filteredData;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Returns a sorted copy of the data if MatSort has a sort applied, otherwise just returns the
|
|
360
|
+
* data array as provided. Uses the default data accessor for data lookup, unless a
|
|
361
|
+
* sortDataAccessor function is defined.
|
|
362
|
+
*/
|
|
363
|
+
_orderData(data) {
|
|
364
|
+
// If there is no active sort or direction, return the data without trying to sort.
|
|
365
|
+
if (!this.sort) {
|
|
366
|
+
return data;
|
|
367
|
+
}
|
|
368
|
+
return this.sortData(data.slice(), this.sort);
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Returns a paged slice of the provided data array according to the provided paginator's page
|
|
372
|
+
* index and length. If there is no paginator provided, returns the data array as provided.
|
|
373
|
+
*/
|
|
374
|
+
_pageData(data) {
|
|
375
|
+
if (!this.paginator) {
|
|
376
|
+
return data;
|
|
377
|
+
}
|
|
378
|
+
const startIndex = this.paginator.pageIndex * this.paginator.pageSize;
|
|
379
|
+
return data.slice(startIndex, startIndex + this.paginator.pageSize);
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Updates the paginator to reflect the length of the filtered data, and makes sure that the page
|
|
383
|
+
* index does not exceed the paginator's last page. Values are changed in a resolved promise to
|
|
384
|
+
* guard against making property changes within a round of change detection.
|
|
385
|
+
*/
|
|
386
|
+
_updatePaginator(filteredDataLength) {
|
|
387
|
+
Promise.resolve().then(() => {
|
|
388
|
+
const paginator = this.paginator;
|
|
389
|
+
if (!paginator) {
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
paginator.length = filteredDataLength;
|
|
393
|
+
// If the page index is set beyond the page, reduce it to the last page.
|
|
394
|
+
if (paginator.pageIndex > 0) {
|
|
395
|
+
const lastPageIndex = Math.ceil(paginator.length / paginator.pageSize) - 1 || 0;
|
|
396
|
+
const newPageIndex = Math.min(paginator.pageIndex, lastPageIndex);
|
|
397
|
+
if (newPageIndex !== paginator.pageIndex) {
|
|
398
|
+
paginator.pageIndex = newPageIndex;
|
|
399
|
+
// Since the paginator only emits after user-generated changes,
|
|
400
|
+
// we need our own stream so we know to should re-render the data.
|
|
401
|
+
this._internalPageChanges.next();
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
_aggregateData(data) {
|
|
407
|
+
for (const [columnName, fun] of Object.entries(this.aggregatedColumns)) {
|
|
408
|
+
const f = this.aggregationFunctions.find((f) => f.id === fun);
|
|
409
|
+
if (!f) {
|
|
410
|
+
continue;
|
|
411
|
+
}
|
|
412
|
+
this.aggregatedData[columnName] = {
|
|
413
|
+
...(this.aggregatedData[columnName] ?? {}),
|
|
414
|
+
total: f.aggregateData(data.map((i) => i[columnName])),
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
return data;
|
|
418
|
+
}
|
|
419
|
+
_aggregatePaginatedData(data) {
|
|
420
|
+
for (const [columnName, fun] of Object.entries(this.aggregatedColumns)) {
|
|
421
|
+
const f = this.aggregationFunctions.find((f) => f.id === fun);
|
|
422
|
+
if (!f) {
|
|
423
|
+
continue;
|
|
424
|
+
}
|
|
425
|
+
this.aggregatedData[columnName] = {
|
|
426
|
+
...(this.aggregatedData[columnName] ?? {}),
|
|
427
|
+
currentPage: f.aggregateData(data.map((i) => i[columnName])),
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
return data;
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Used by the MatTable. Called when it connects to the data source.
|
|
434
|
+
*/
|
|
435
|
+
connect() {
|
|
436
|
+
if (!this._renderChangesSubscription) {
|
|
437
|
+
this._updateChangeSubscription();
|
|
438
|
+
}
|
|
439
|
+
return this._renderData;
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Used by the MatTable. Called when it disconnects from the data source.
|
|
443
|
+
*/
|
|
444
|
+
disconnect() {
|
|
445
|
+
this._viewChangesSubscription?.unsubscribe();
|
|
446
|
+
this._renderChangesSubscription?.unsubscribe();
|
|
447
|
+
this._renderChangesSubscription = null;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtZGF0YS1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2lub2JldGEtdWkvdWkva2FpLXRhYmxlL3RhYmxlLWRhdGEtc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3ZDLE9BQU8sRUFDTCxlQUFlLEVBRWYsT0FBTyxFQUVQLGFBQWEsRUFDYixLQUFLLEVBQ0wsRUFBRSxJQUFJLFlBQVksR0FDbkIsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUtwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLE9BQU8saUJBR1gsU0FBUSxVQUFhO0lBQ3JCLHlFQUF5RTtJQUN0RCxLQUFLLENBQXVCO0lBRS9DLGtGQUFrRjtJQUMvRCxXQUFXLEdBQUcsSUFBSSxlQUFlLENBQU0sRUFBRSxDQUFDLENBQUM7SUFFOUQsa0dBQWtHO0lBQ2pGLG9CQUFvQixHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFNUQ7OztPQUdHO0lBQ0gsMEJBQTBCLEdBQXdCLElBQUksQ0FBQztJQUV2RCx3QkFBd0IsR0FBd0IsSUFBSSxDQUFDO0lBRXJELFNBQVMsQ0FBUztJQUNsQjs7Ozs7T0FLRztJQUNILFlBQVksQ0FBTTtJQUVsQixnR0FBZ0c7SUFDaEcsSUFBSSxJQUFJO1FB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LEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ1AsU0FBUztZQUNYLENBQUM7WUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxHQUFHO2dCQUNoQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzFDLFdBQVcsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2FBQzdELENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPO1FBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ25DLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsVUFBVTtRQUNSLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQztJQUN6QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9jb2xsZWN0aW9uc1wiO1xuaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE1hdFBhZ2luYXRvciwgUGFnZUV2ZW50IH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvclwiO1xuaW1wb3J0IHsgTWF0U29ydCwgU29ydCB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zb3J0XCI7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIFN1YnNjcmlwdGlvbixcbiAgY29tYmluZUxhdGVzdCxcbiAgbWVyZ2UsXG4gIG9mIGFzIG9ic2VydmFibGVPZixcbn0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IGZpbHRlciwgbWFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBJYkZpbHRlciB9IGZyb20gXCIuLi9rYWktZmlsdGVyL2ZpbHRlci5jb21wb25lbnRcIjtcbmltcG9ydCB7IEliRmlsdGVyRGVmLCBJYkZpbHRlclN5bnRheCB9IGZyb20gXCIuLi9rYWktZmlsdGVyL2ZpbHRlci50eXBlc1wiO1xuaW1wb3J0IHsgYXBwbHlGaWx0ZXIgfSBmcm9tIFwiLi4va2FpLWZpbHRlci9maWx0ZXJzXCI7XG5pbXBvcnQgeyBJYlRhYmxlVmlld0dyb3VwIH0gZnJvbSBcIi4uL3ZpZXdzL2NvbXBvbmVudHMvdGFibGUtdmlldy1ncm91cC90YWJsZS12aWV3LWdyb3VwLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgSVZpZXcgfSBmcm9tIFwiLi4vdmlld3Mvc3RvcmUvdmlld3MvdGFibGUtdmlld1wiO1xuaW1wb3J0IHsgSWJBZ2dyZWdhdGVSZXN1bHQgfSBmcm9tIFwiLi9jZWxsc1wiO1xuaW1wb3J0IHsgSWJDb2x1bW4sIEliU2VsZWN0aW9uQ29sdW1uIH0gZnJvbSBcIi4vY29sdW1uc1wiO1xuaW1wb3J0IHsgSUJfQUdHUkVHQVRFIH0gZnJvbSBcIi4vdG9rZW5zXCI7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gXCJAbmdyeC9zdG9yZVwiO1xuaW1wb3J0IHsgdXJsU3RhdGVBY3Rpb25zIH0gZnJvbSBcIi4vc3RvcmUvdXJsLXN0YXRlL2FjdGlvbnNcIjtcblxuLyoqXG4gKiBEYXRhIHNvdXJjZSB0aGF0IGFjY2VwdHMgYSBjbGllbnQtc2lkZSBkYXRhIGFycmF5IGFuZCBpbmNsdWRlcyBuYXRpdmUgc3VwcG9ydCBvZiBmaWx0ZXJpbmcsXG4gKiBzb3J0aW5nICh1c2luZyBNYXRTb3J0KSwgYW5kIHBhZ2luYXRpb24gKHVzaW5nIE1hdFBhZ2luYXRvcikuXG4gKlxuICogQWxsb3dzIGZvciBzb3J0IGN1c3RvbWl6YXRpb24gYnkgb3ZlcnJpZGluZyBzb3J0aW5nRGF0YUFjY2Vzc29yLCB3aGljaCBkZWZpbmVzIGhvdyBkYXRhXG4gKiBwcm9wZXJ0aWVzIGFyZSBhY2Nlc3NlZC4gQWxzbyBhbGxvd3MgZm9yIGZpbHRlciBjdXN0b21pemF0aW9uIGJ5IG92ZXJyaWRpbmcgZmlsdGVyUHJlZGljYXRlLFxuICogd2hpY2ggZGVmaW5lcyBob3cgcm93IGRhdGEgaXMgY29udmVydGVkIHRvIGEgc3RyaW5nIGZvciBmaWx0ZXIgbWF0Y2hpbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBJYlRhYmxlRGF0YVNvdXJjZTxcbiAgVCxcbiAgUCBleHRlbmRzIE1hdFBhZ2luYXRvciA9IE1hdFBhZ2luYXRvclxuPiBleHRlbmRzIERhdGFTb3VyY2U8VD4ge1xuICAvKiogU3RyZWFtIHRoYXQgZW1pdHMgd2hlbiBhIG5ldyBkYXRhIGFycmF5IGlzIHNldCBvbiB0aGUgZGF0YSBzb3VyY2UuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBfZGF0YTogQmVoYXZpb3JTdWJqZWN0PFRbXT47XG5cbiAgLyoqIFN0cmVhbSBlbWl0dGluZyByZW5kZXIgZGF0YSB0byB0aGUgdGFibGUgKGRlcGVuZHMgb24gb3JkZXJlZCBkYXRhIGNoYW5nZXMpLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3JlbmRlckRhdGEgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRbXT4oW10pO1xuXG4gIC8qKiBVc2VkIHRvIHJlYWN0IHRvIGludGVybmFsIGNoYW5nZXMgb2YgdGhlIHBhZ2luYXRvciB0aGF0IGFyZSBtYWRlIGJ5IHRoZSBkYXRhIHNvdXJjZSBpdHNlbGYuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2ludGVybmFsUGFnZUNoYW5nZXMgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBTdWJzY3JpcHRpb24gdG8gdGhlIGNoYW5nZXMgdGhhdCBzaG91bGQgdHJpZ2dlciBhbiB1cGRhdGUgdG8gdGhlIHRhYmxlJ3MgcmVuZGVyZWQgcm93cywgc3VjaFxuICAgKiBhcyBmaWx0ZXJpbmcsIHNvcnRpbmcsIHBhZ2luYXRpb24sIG9yIGJhc2UgZGF0YSBjaGFuZ2VzLlxuICAgKi9cbiAgX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIF92aWV3Q2hhbmdlc1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgdGFibGVOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZmlsdGVyZWQgc2V0IG9mIGRhdGEgdGhhdCBoYXMgYmVlbiBtYXRjaGVkIGJ5IHRoZSBmaWx0ZXIgc3RyaW5nLCBvciBhbGwgdGhlIGRhdGEgaWYgdGhlcmVcbiAgICogaXMgbm8gZmlsdGVyLiBVc2VmdWwgZm9yIGtub3dpbmcgdGhlIHNldCBvZiBkYXRhIHRoZSB0YWJsZSByZXByZXNlbnRzLlxuICAgKiBGb3IgZXhhbXBsZSwgYSAnc2VsZWN0QWxsKCknIGZ1bmN0aW9uIHdvdWxkIGxpa2VseSB3YW50IHRvIHNlbGVjdCB0aGUgc2V0IG9mIGZpbHRlcmVkIGRhdGFcbiAgICogc2hvd24gdG8gdGhlIHVzZXIgcmF0aGVyIHRoYW4gYWxsIHRoZSBkYXRhLlxuICAgKi9cbiAgZmlsdGVyZWREYXRhOiBUW107XG5cbiAgLyoqIEFycmF5IG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgcmVuZGVyZWQgYnkgdGhlIHRhYmxlLCB3aGVyZSBlYWNoIG9iamVjdCByZXByZXNlbnRzIG9uZSByb3cuICovXG4gIGdldCBkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnZhbHVlO1xuICB9XG5cbiAgc2V0IGRhdGEoZGF0YTogVFtdKSB7XG4gICAgZGF0YSA9IEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW107XG4gICAgdGhpcy5fZGF0YS5uZXh0KGRhdGEpO1xuICAgIHRoaXMuX2luaXRpYWxpemVGaWx0ZXJzKGRhdGEpO1xuICAgIC8vIE5vcm1hbGx5IHRoZSBgZmlsdGVyZWREYXRhYCBpcyB1cGRhdGVkIGJ5IHRoZSByZS1yZW5kZXJcbiAgICAvLyBzdWJzY3JpcHRpb24sIGJ1dCB0aGF0IHdvbid0IGhhcHBlbiBpZiBpdCdzIGluYWN0aXZlLlxuICAgIGlmICghdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fZmlsdGVyRGF0YShkYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFuY2Ugb2YgdGhlIEliRmlsdGVyIGNvbXBvbmVudCB1c2VkIGJ5IHRoZSB0YWJsZSB0byBmaWx0ZXIgaXRzIGRhdGEuIEZpbHRlciBjaGFuZ2VzXG4gICAqIGVtaXR0ZWQgYnkgdGhlIEliRmlsdGVyIHdpbGwgdHJpZ2dlciBhbiB1cGRhdGUgdG8gdGhlIHRhYmxlJ3MgcmVuZGVyZWQgZGF0YS5cbiAgICovXG4gIGdldCBmaWx0ZXIoKTogSWJGaWx0ZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyO1xuICB9XG5cbiAgc2V0IGZpbHRlcihmOiBJYkZpbHRlciB8IG51bGwpIHtcbiAgICB0aGlzLl9maWx0ZXIgPSBmO1xuICAgIHRoaXMuX2luaXRpYWxpemVGaWx0ZXJzKHRoaXMuZGF0YSk7XG4gICAgdGhpcy5fdXBkYXRlQ2hhbmdlU3Vic2NyaXB0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIF9maWx0ZXI6IEliRmlsdGVyIHwgbnVsbDtcblxuICAvKipcbiAgICogSW5zdGFuY2Ugb2YgdGhlIE1hdFNvcnQgZGlyZWN0aXZlIHVzZWQgYnkgdGhlIHRhYmxlIHRvIGNvbnRyb2wgaXRzIHNvcnRpbmcuIFNvcnQgY2hhbmdlc1xuICAgKiBlbWl0dGVkIGJ5IHRoZSBNYXRTb3J0IHdpbGwgdHJpZ2dlciBhbiB1cGRhdGUgdG8gdGhlIHRhYmxlJ3MgcmVuZGVyZWQgZGF0YS5cbiAgICovXG4gIGdldCBzb3J0KCk6IE1hdFNvcnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydDtcbiAgfVxuXG4gIHNldCBzb3J0KHNvcnQ6IE1hdFNvcnQgfCBudWxsKSB7XG4gICAgdGhpcy5fc29ydCA9IHNvcnQ7XG4gICAgdGhpcy5fdXBkYXRlQ2hhbmdlU3Vic2NyaXB0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIF9zb3J0OiBNYXRTb3J0IHwgbnVsbDtcblxuICBfc29ydFN0YXRlOiBTb3J0ID0ge1xuICAgIGFjdGl2ZTogXCJcIixcbiAgICBkaXJlY3Rpb246IFwiXCIsXG4gIH1cbiAgZ2V0IHNvcnRTdGF0ZSgpe1xuICAgIHJldHVybiB7XG4gICAgICBhY3RpdmU6IHRoaXMuX3NvcnRTdGF0ZS5kaXJlY3Rpb24gIT09ICcnID8gdGhpcy5fc29ydFN0YXRlLmFjdGl2ZSA6ICcnLFxuICAgICAgZGlyZWN0aW9uOiB0aGlzLl9zb3J0U3RhdGUuZGlyZWN0aW9uXG4gICAgfVxuICB9XG4gIHNldCBzb3J0U3RhdGUoc29ydDogU29ydCl7XG4gICAgdGhpcy5fc29ydFN0YXRlID0ge1xuICAgICAgYWN0aXZlOiBzb3J0Py5hY3RpdmUgPz8gJycsXG4gICAgICBkaXJlY3Rpb246IHNvcnQ/LmRpcmVjdGlvbiA/PyAnJ1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFuY2Ugb2YgdGhlIHBhZ2luYXRvciBjb21wb25lbnQgdXNlZCBieSB0aGUgdGFibGUgdG8gY29udHJvbCB3aGF0IHBhZ2Ugb2YgdGhlIGRhdGEgaXNcbiAgICogZGlzcGxheWVkLiBQYWdlIGNoYW5nZXMgZW1pdHRlZCBieSB0aGUgcGFnaW5hdG9yIHdpbGwgdHJpZ2dlciBhbiB1cGRhdGUgdG8gdGhlXG4gICAqIHRhYmxlJ3MgcmVuZGVyZWQgZGF0YS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSBkYXRhIHNvdXJjZSB1c2VzIHRoZSBwYWdpbmF0b3IncyBwcm9wZXJ0aWVzIHRvIGNhbGN1bGF0ZSB3aGljaCBwYWdlIG9mIGRhdGFcbiAgICogc2hvdWxkIGJlIGRpc3BsYXllZC4gSWYgdGhlIHBhZ2luYXRvciByZWNlaXZlcyBpdHMgcHJvcGVydGllcyBhcyB0ZW1wbGF0ZSBpbnB1dHMsXG4gICAqIGUuZy4gYFtwYWdlTGVuZ3RoXT0xMDBgIG9yIGBbcGFnZUluZGV4XT0xYCwgdGhlbiBiZSBzdXJlIHRoYXQgdGhlIHBhZ2luYXRvcidzIHZpZXcgaGFzIGJlZW5cbiAgICogaW5pdGlhbGl6ZWQgYmVmb3JlIGFzc2lnbmluZyBpdCB0byB0aGlzIGRhdGEgc291cmNlLlxuICAgKi9cbiAgZ2V0IHBhZ2luYXRvcigpOiBQIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2luYXRvcjtcbiAgfVxuXG4gIHNldCBwYWdpbmF0b3IocGFnaW5hdG9yOiBQIHwgbnVsbCkge1xuICAgIHRoaXMuX3BhZ2luYXRvciA9IHBhZ2luYXRvcjtcbiAgICB0aGlzLl91cGRhdGVDaGFuZ2VTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhZ2luYXRvcjogUCB8IG51bGw7XG5cbiAgZ2V0IGNvbHVtbnMoKTogUmVjb3JkPHN0cmluZywgSWJDb2x1bW48dW5rbm93bj4+IHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgfVxuXG4gIHNldCBjb2x1bW5zKGNvbHVtbnM6IEliQ29sdW1uPHVua25vd24+W10pIHtcbiAgICB0aGlzLl9jb2x1bW5zID0gY29sdW1ucy5yZWR1Y2UoKGFjYywgYykgPT4gKHsgW2MubmFtZV06IGMsIC4uLmFjYyB9KSwge30pO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29sdW1uczogUmVjb3JkPHN0cmluZywgSWJDb2x1bW48dW5rbm93bj4+ID0ge307XG5cbiAgc2V0IHZpZXcodmlldzogSWJUYWJsZVZpZXdHcm91cCB8IG51bGwpIHtcbiAgICB0aGlzLl92aWV3ID0gdmlldztcbiAgICB0aGlzLl91cGRhdGVWaWV3Q2hhbmdlU3Vic2NyaXB0aW9uKCk7XG4gIH1cblxuICBnZXQgdmlldygpIHtcbiAgICByZXR1cm4gdGhpcy5fdmlldztcbiAgfVxuXG4gIHByaXZhdGUgX3ZpZXc6IEliVGFibGVWaWV3R3JvdXAgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBZ2dyZWdhdGVkIGRhdGEgYnkgY29sdW1uIG5hbWUuXG4gICAqL1xuICBhZ2dyZWdhdGVkRGF0YTogUmVjb3JkPHN0cmluZywgSWJBZ2dyZWdhdGVSZXN1bHQ+ID0ge307XG4gIC8qKlxuICAgKiBEaWN0aW9uYXJ5IG9mIGNvbHVtbnMgdG8gYWdncmVnYXRlIGFuZCB0aGUgZnVuY3Rpb24gKGZ1bmN0aW9uIGlkKSB0byBhcHBseS5cbiAgICogTm90ZTogdGhpcyBzdHJ1Y3R1cmUgaXMgc2VyaWFsaXplZCB3aXRoaW4gYSB2aWV3XG4gICAqL1xuICBhZ2dyZWdhdGVkQ29sdW1uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBhZ2dyZWdhdGlvbkZ1bmN0aW9ucyA9IGluamVjdChJQl9BR0dSRUdBVEUpO1xuICBwcm90ZWN0ZWQgc3RvcmUgPSBpbmplY3QoU3RvcmUpO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHRyaWdnZXIgdGhlIGFnZ3JlZ2F0aW9uIG9mIGEgY29sdW1uIGJ5IHRoZSB1c2VyLlxuICAgKlxuICAgKiBJYlRhYmxlVmlld0dyb3VwIGxpc3RlbnMgdG8gdGhpcyBzdHJlYW0gdG8gZGV0ZWN0IHN0YXRlIGNoYW5nZXNcbiAgICovXG4gIGFnZ3JlZ2F0ZSA9IG5ldyBTdWJqZWN0PHsgY29sdW1uTmFtZTogc3RyaW5nOyBmdW5jdGlvbjogc3RyaW5nIH0+KCk7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB0YWJsZSBzaG91bGQgZGlzcGxheSB0aGUgYWdncmVnYXRpb24gZm9vdGVyLlxuICAgKiAodGhpcyByZWVrcy4uLilcbiAgICovXG4gIGdldCBzaG91bGREaXNwbGF5QWdncmVnYXRpb25Gb290ZXIoKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5jb2x1bW5zKS5maWx0ZXIoKGMpID0+IGMuYWdncmVnYXRlKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgc2VsZWN0aW9uQ29sdW1uOiBJYlNlbGVjdGlvbkNvbHVtbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEdldHMgYSBzb3J0ZWQgY29weSBvZiB0aGUgZGF0YSBhcnJheSBiYXNlZCBvbiB0aGUgc3RhdGUgb2YgdGhlIE1hdFNvcnQuIENhbGxlZFxuICAgKiBhZnRlciBjaGFuZ2VzIGFyZSBtYWRlIHRvIHRoZSBmaWx0ZXJlZCBkYXRhIG9yIHdoZW4gc29ydCBjaGFuZ2VzIGFyZSBlbWl0dGVkIGZyb20gTWF0U29ydC5cbiAgICogQnkgZGVmYXVsdCwgdGhlIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgYWN0aXZlIHNvcnQgYW5kIGl0cyBkaXJlY3Rpb24gYW5kIGNvbXBhcmVzIGRhdGFcbiAgICogYnkgcmV0cmlldmluZyBkYXRhIHVzaW5nIHRoZSBzb3J0aW5nRGF0YUFjY2Vzc29yLlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgYXJyYXkgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSBzb3J0ZWQuXG4gICAqIEBwYXJhbSBzb3J0IFRoZSBjb25uZWN0ZWQgTWF0U29ydCB0aGF0IGhvbGRzIHRoZSBjdXJyZW50IHNvcnQgc3RhdGUuXG4gICAqL1xuICBzb3J0RGF0YTogKGRhdGE6IFRbXSwgc29ydDogTWF0U29ydCkgPT4gVFtdID0gKFxuICAgIGRhdGE6IFRbXSxcbiAgICBzb3J0OiBNYXRTb3J0XG4gICk6IFRbXSA9PiB7XG4gICAgY29uc3QgYWN0aXZlID0gc29ydC5hY3RpdmU7XG4gICAgY29uc3QgZGlyZWN0aW9uID0gc29ydC5kaXJlY3Rpb247XG4gICAgaWYgKCFhY3RpdmUgfHwgZGlyZWN0aW9uID09IFwiXCIpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuX2NvbHVtbnNbYWN0aXZlXTtcbiAgICByZXR1cm4gZGF0YS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBsZXQgdmFsdWVBID0gY29sdW1uLnNvcnRpbmdEYXRhQWNjZXNzb3IoYSwgYWN0aXZlKTtcbiAgICAgIGxldCB2YWx1ZUIgPSBjb2x1bW4uc29ydGluZ0RhdGFBY2Nlc3NvcihiLCBhY3RpdmUpO1xuXG4gICAgICAvLyBJZiB0aGVyZSBhcmUgZGF0YSBpbiB0aGUgY29sdW1uIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0byBhIG51bWJlcixcbiAgICAgIC8vIGl0IG11c3QgYmUgZW5zdXJlZCB0aGF0IHRoZSByZXN0IG9mIHRoZSBkYXRhXG4gICAgICAvLyBpcyBvZiB0aGUgc2FtZSB0eXBlIHNvIGFzIG5vdCB0byBvcmRlciBpbmNvcnJlY3RseS5cbiAgICAgIGNvbnN0IHZhbHVlQVR5cGUgPSB0eXBlb2YgdmFsdWVBO1xuICAgICAgY29uc3QgdmFsdWVCVHlwZSA9IHR5cGVvZiB2YWx1ZUI7XG5cbiAgICAgIGlmICh2YWx1ZUFUeXBlICE9PSB2YWx1ZUJUeXBlKSB7XG4gICAgICAgIGlmICh2YWx1ZUFUeXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgdmFsdWVBICs9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlQlR5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICB2YWx1ZUIgKz0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBib3RoIHZhbHVlQSBhbmQgdmFsdWVCIGV4aXN0ICh0cnV0aHkpLCB0aGVuIGNvbXBhcmUgdGhlIHR3by4gT3RoZXJ3aXNlLCBjaGVjayBpZlxuICAgICAgLy8gb25lIHZhbHVlIGV4aXN0cyB3aGlsZSB0aGUgb3RoZXIgZG9lc24ndC4gSW4gdGhpcyBjYXNlLCBleGlzdGluZyB2YWx1ZSBzaG91bGQgY29tZSBsYXN0LlxuICAgICAgLy8gVGhpcyBhdm9pZHMgaW5jb25zaXN0ZW50IHJlc3VsdHMgd2hlbiBjb21wYXJpbmcgdmFsdWVzIHRvIHVuZGVmaW5lZC9udWxsLlxuICAgICAgLy8gSWYgbmVpdGhlciB2YWx1ZSBleGlzdHMsIHJldHVybiAwIChlcXVhbCkuXG4gICAgICBsZXQgY29tcGFyYXRvclJlc3VsdCA9IDA7XG4gICAgICBpZiAodmFsdWVBICE9IG51bGwgJiYgdmFsdWVCICE9IG51bGwpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgb25lIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgb3RoZXI7IGlmIGVxdWFsLCBjb21wYXJhdG9yUmVzdWx0IHNob3VsZCByZW1haW4gMC5cbiAgICAgICAgaWYgKHZhbHVlQSA+IHZhbHVlQikge1xuICAgICAgICAgIGNvbXBhcmF0b3JSZXN1bHQgPSAxO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlQSA8IHZhbHVlQikge1xuICAgICAgICAgIGNvbXBhcmF0b3JSZXN1bHQgPSAtMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh2YWx1ZUEgIT0gbnVsbCkge1xuICAgICAgICBjb21wYXJhdG9yUmVzdWx0ID0gMTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWVCICE9IG51bGwpIHtcbiAgICAgICAgY29tcGFyYXRvclJlc3VsdCA9IC0xO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tcGFyYXRvclJlc3VsdCAqIChkaXJlY3Rpb24gPT0gXCJhc2NcIiA/IDEgOiAtMSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGRhdGEgb2JqZWN0IG1hdGNoZXMgdGhlIGRhdGEgc291cmNlJ3MgZmlsdGVyLlxuICAgKiBAcGFyYW0gZGF0YSBEYXRhIG9iamVjdCB1c2VkIHRvIGNoZWNrIGFnYWluc3QgdGhlIGZpbHRlci5cbiAgICogQHBhcmFtIGZpbHRlciBGaWx0ZXIgdGhhdCBoYXMgYmVlbiBzZXQgb24gdGhlIGRhdGEgc291cmNlLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBmaWx0ZXIgbWF0Y2hlcyBhZ2FpbnN0IHRoZSBkYXRhXG4gICAqL1xuICBmaWx0ZXJQcmVkaWNhdGU6IChkYXRhOiBULCBmaWx0ZXI6IEliRmlsdGVyU3ludGF4KSA9PiBib29sZWFuID0gKFxuICAgIGRhdGE6IFQsXG4gICAgZmlsdGVyOiBJYkZpbHRlclN5bnRheFxuICApOiBib29sZWFuID0+IHtcbiAgICBjb25zdCB7IGliU2VhcmNoQmFyLCAuLi5maWx0ZXJzIH0gPSBmaWx0ZXI7XG4gICAgY29uc3QgbWF0Y2hlc1NlYXJjaEJhciA9IHRoaXMuYXBwbHlTZWFyY2hCYXJGaWx0ZXIoZGF0YSwgaWJTZWFyY2hCYXIpO1xuXG4gICAgY29uc3QgbWF0Y2hlcyA9IE9iamVjdC5lbnRyaWVzKGZpbHRlcnMpLmV2ZXJ5KChbY29sdW1uTmFtZSwgY29uZGl0aW9uXSkgPT4ge1xuICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zW2NvbHVtbk5hbWVdO1xuICAgICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYGliLWZpbHRlcjogY29sdW1uICR7Y29sdW1uTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gY29sdW1uLmZpbHRlckRhdGFBY2Nlc3NvcihkYXRhLCBjb2x1bW5OYW1lKTtcbiAgICAgIHJldHVybiBhcHBseUZpbHRlcihjb25kaXRpb24sIGZpbHRlclZhbHVlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtYXRjaGVzICYmIG1hdGNoZXNTZWFyY2hCYXI7XG4gIH07XG5cbiAgcHJpdmF0ZSBhcHBseVNlYXJjaEJhckZpbHRlciA9IChkYXRhOiBhbnksIGZpbHRlcjogSWJGaWx0ZXJEZWYpID0+IHtcbiAgICBpZiAoIWZpbHRlcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YVN0ciA9IE9iamVjdC5rZXlzKGRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVxuICAgICAgLnJlZHVjZSgoY3VycmVudFRlcm06IHN0cmluZywga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zW2tleV07XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29sdW1uID8gY29sdW1uLmZpbHRlckRhdGFBY2Nlc3NvcihkYXRhLCBrZXkpIDogZGF0YVtrZXldO1xuICAgICAgICByZXR1cm4gY3VycmVudFRlcm0gKyB2YWx1ZSArIFwi4pesXCI7XG4gICAgICB9LCBcIlwiKVxuICAgICAgLnRvTG93ZXJDYXNlKCk7XG5cbiAgICByZXR1cm4gYXBwbHlGaWx0ZXIoZmlsdGVyLCBkYXRhU3RyKTtcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihpbml0aWFsRGF0YTogVFtdID0gW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2RhdGEgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRbXT4oaW5pdGlhbERhdGEpO1xuICAgIHRoaXMuX3VwZGF0ZUNoYW5nZVN1YnNjcmlwdGlvbigpO1xuICAgIHRoaXMuYWdncmVnYXRlLnN1YnNjcmliZSgodGFyZ2V0KSA9PiB7XG4gICAgICB0aGlzLmFnZ3JlZ2F0ZWRDb2x1bW5zW3RhcmdldC5jb2x1bW5OYW1lXSA9IHRhcmdldC5mdW5jdGlvbjtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2godXJsU3RhdGVBY3Rpb25zLnNldEFnZ3JlZ2F0ZWRDb2x1bW5zKHt0YWJsZU5hbWU6IHRoaXMudGFibGVOYW1lLCBwYXJhbXM6IHsuLi50aGlzLmFnZ3JlZ2F0ZWRDb2x1bW5zfX0pKTtcbiAgICAgIHRoaXMuX2FnZ3JlZ2F0ZURhdGEodGhpcy5maWx0ZXJlZERhdGEpO1xuICAgICAgdGhpcy5fYWdncmVnYXRlUGFnaW5hdGVkRGF0YShcbiAgICAgICAgdGhpcy5fcGFnZURhdGEodGhpcy5fb3JkZXJEYXRhKHRoaXMuZmlsdGVyZWREYXRhKSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0aWFsaXplRmlsdGVycyhkYXRhOiBhbnlbXSkge1xuICAgIHRoaXMuZmlsdGVyPy5maWx0ZXJzLmZvckVhY2goKGYpID0+IGYuaW5pdGlhbGl6ZUZyb21Db2x1bW4oZGF0YSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBjaGFuZ2VzIHRoYXQgc2hvdWxkIHRyaWdnZXIgYW4gdXBkYXRlIHRvIHRoZSB0YWJsZSdzIHJlbmRlcmVkIHJvd3MuIFdoZW4gdGhlXG4gICAqIGNoYW5nZXMgb2NjdXIsIHByb2Nlc3MgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGZpbHRlciwgc29ydCwgYW5kIHBhZ2luYXRpb24gYWxvbmcgd2l0aFxuICAgKiB0aGUgcHJvdmlkZWQgYmFzZSBkYXRhIGFuZCBzZW5kIGl0IHRvIHRoZSB0YWJsZSBmb3IgcmVuZGVyaW5nLlxuICAgKi9cbiAgX3VwZGF0ZUNoYW5nZVN1YnNjcmlwdGlvbigpIHtcbiAgICAvLyBTb3J0aW5nIGFuZC9vciBwYWdpbmF0aW9uIHNob3VsZCBiZSB3YXRjaGVkIGlmIHNvcnQgYW5kL29yIHBhZ2luYXRvciBhcmUgcHJvdmlkZWQuXG4gICAgLy8gVGhlIGV2ZW50cyBzaG91bGQgZW1pdCB3aGVuZXZlciB0aGUgY29tcG9uZW50IGVtaXRzIGEgY2hhbmdlIG9yIGluaXRpYWxpemVzLCBvciBpZiBub1xuICAgIC8vIGNvbXBvbmVudCBpcyBwcm92aWRlZCwgYSBzdHJlYW0gd2l0aCBqdXN0IGEgbnVsbCBldmVudCBzaG91bGQgYmUgcHJvdmlkZWQuXG4gICAgLy8gVGhlIGBzb3J0Q2hhbmdlYCBhbmQgYHBhZ2VDaGFuZ2VgIGFjdHMgYXMgYSBzaWduYWwgdG8gdGhlIGNvbWJpbmVMYXRlc3RzIGJlbG93IHNvIHRoYXQgdGhlXG4gICAgLy8gcGlwZWxpbmUgY2FuIHByb2dyZXNzIHRvIHRoZSBuZXh0IHN0ZXAuIE5vdGUgdGhhdCB0aGUgdmFsdWUgZnJvbSB0aGVzZSBzdHJlYW1zIGFyZSBub3QgdXNlZCxcbiAgICAvLyB0aGV5IHB1cmVseSBhY3QgYXMgYSBzaWduYWwgdG8gcHJvZ3Jlc3MgaW4gdGhlIHBpcGVsaW5lLlxuICAgIGNvbnN0IHNvcnRDaGFuZ2U6IE9ic2VydmFibGU8U29ydCB8IG51bGwgfCB2b2lkPiA9IHRoaXMuX3NvcnRcbiAgICAgID8gKG1lcmdlKFxuICAgICAgICAgIHRoaXMuc29ydC5zb3J0Q2hhbmdlLFxuICAgICAgICAgIHRoaXMuc29ydC5pbml0aWFsaXplZFxuICAgICAgICApIGFzIE9ic2VydmFibGU8U29ydCB8IHZvaWQ+KVxuICAgICAgOiBvYnNlcnZhYmxlT2YobnVsbCk7XG4gICAgY29uc3QgcGFnZUNoYW5nZTogT2JzZXJ2YWJsZTxQYWdlRXZlbnQgfCBudWxsIHwgdm9pZD4gPSB0aGlzLl9wYWdpbmF0b3JcbiAgICAgID8gKG1lcmdlKFxuICAgICAgICAgIHRoaXMuX3BhZ2luYXRvci5wYWdlLFxuICAgICAgICAgIHRoaXMuX2ludGVybmFsUGFnZUNoYW5nZXMsXG4gICAgICAgICAgdGhpcy5fcGFnaW5hdG9yLmluaXRpYWxpemVkXG4gICAgICAgICkgYXMgT2JzZXJ2YWJsZTxQYWdlRXZlbnQgfCB2b2lkPilcbiAgICAgIDogb2JzZXJ2YWJsZU9mKG51bGwpO1xuICAgIGNvbnN0IGZpbHRlckNoYW5nZTogT2JzZXJ2YWJsZTxJYkZpbHRlclN5bnRheCB8IG51bGwgfCB2b2lkPiA9IHRoaXMuX2ZpbHRlclxuICAgICAgPyBtZXJnZSh0aGlzLl9maWx0ZXIuaWJGaWx0ZXJVcGRhdGVkLCB0aGlzLl9maWx0ZXIuaW5pdGlhbGl6ZWQpXG4gICAgICA6IG9ic2VydmFibGVPZihudWxsKTtcbiAgICBjb25zdCBkYXRhU3RyZWFtID0gdGhpcy5fZGF0YTtcbiAgICAvLyBXYXRjaCBmb3IgYmFzZSBkYXRhIG9yIGZpbHRlciBjaGFuZ2VzIHRvIHByb3ZpZGUgYSBmaWx0ZXJlZCBzZXQgb2YgZGF0YS5cbiAgICBjb25zdCBmaWx0ZXJlZERhdGEgPSBjb21iaW5lTGF0ZXN0KFtkYXRhU3RyZWFtLCBmaWx0ZXJDaGFuZ2VdKS5waXBlKFxuICAgICAgbWFwKChbZGF0YSwgZmlsdGVyQ2hhbmdlXSkgPT4ge1xuICAgICAgICBpZih0aGlzLmZpbHRlcj8uaW5pdGlhbGl6ZWQpe1xuICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2godXJsU3RhdGVBY3Rpb25zLnNldEZpbHRlcnMoe3RhYmxlTmFtZTogdGhpcy50YWJsZU5hbWUsIHBhcmFtczogdGhpcy5maWx0ZXI/LnNlbGVjdGVkQ3JpdGVyaWEgPz8ge319KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlckRhdGEoZGF0YSlcbiAgICAgIH0pLFxuICAgICAgbWFwKChkYXRhKSA9PiB0aGlzLl9hZ2dyZWdhdGVEYXRhKGRhdGEpKVxuICAgICk7XG4gICAgLy8gV2F0Y2ggZm9yIGZpbHRlcmVkIGRhdGEgb3Igc29ydCBjaGFuZ2VzIHRvIHByb3ZpZGUgYW4gb3JkZXJlZCBzZXQgb2YgZGF0YS5cbiAgICBjb25zdCBvcmRlcmVkRGF0YSA9IGNvbWJpbmVMYXRlc3QoW2ZpbHRlcmVkRGF0YSwgc29ydENoYW5nZV0pLnBpcGUoXG4gICAgICBtYXAoKFtkYXRhLCBzb3J0XSkgPT4ge1xuICAgICAgICBpZihzb3J0KXtcbiAgICAgICAgICB0aGlzLnNvcnRTdGF0ZSA9IHRoaXMuc29ydDtcbiAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHVybFN0YXRlQWN0aW9ucy5zZXRTb3J0KHt0YWJsZU5hbWU6IHRoaXMudGFibGVOYW1lLCBwYXJhbXM6IHRoaXMuc29ydFN0YXRlfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9vcmRlckRhdGEoZGF0YSk7XG4gICAgICB9KVxuICAgICk7XG4gICAgLy8gV2F0Y2ggZm9yIG9yZGVyZWQgZGF0YSBvciBwYWdlIGNoYW5nZXMgdG8gcHJvdmlkZSBhIHBhZ2VkIHNldCBvZiBkYXRhLlxuICAgIGNvbnN0IHBhZ2luYXRlZERhdGEgPSBjb21iaW5lTGF0ZXN0KFtvcmRlcmVkRGF0YSwgcGFnZUNoYW5nZV0pLnBpcGUoXG4gICAgICBtYXAoKFtkYXRhXSkgPT4gdGhpcy5fcGFnZURhdGEoZGF0YSkpLFxuICAgICAgbWFwKChkYXRhKSA9PiB0aGlzLl9hZ2dyZWdhdGVQYWdpbmF0ZWREYXRhKGRhdGEpKVxuICAgICk7XG4gICAgLy8gV2F0Y2hlZCBmb3IgcGFnZWQgZGF0YSBjaGFuZ2VzIGFuZCBzZW5kIHRoZSByZXN1bHQgdG8gdGhlIHRhYmxlIHRvIHJlbmRlci5cbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb24gPSBwYWdpbmF0ZWREYXRhLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgdGhpcy5fcmVuZGVyRGF0YS5uZXh0KGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlVmlld0NoYW5nZVN1YnNjcmlwdGlvbigpIHtcbiAgICB0aGlzLnZpZXcuZGVmYXVsdFZpZXcuZGF0YSA9IHtcbiAgICAgIGZpbHRlcjogdGhpcy5maWx0ZXIuaW5pdGlhbFJhd1ZhbHVlLFxuICAgICAgcGFnZVNpemU6IHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplLFxuICAgICAgYWdncmVnYXRlZENvbHVtbnM6IHRoaXMuYWdncmVnYXRlZENvbHVtbnMsXG4gICAgICBzb3J0OiB7XG4gICAgICAgIC4uLnRoaXMuc29ydFN0YXRlXG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMudmlldy52aWV3RGF0YUFjY2Vzc29yID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsdGVyOiB0aGlzLmZpbHRlci5zZWxlY3RlZENyaXRlcmlhLFxuICAgICAgICBwYWdlU2l6ZTogdGhpcy5wYWdpbmF0b3IucGFnZVNpemUsXG4gICAgICAgIGFnZ3JlZ2F0ZWRDb2x1bW5zOiB0aGlzLmFnZ3JlZ2F0ZWRDb2x1bW5zLFxuICAgICAgICBzb3J0OiB7XG4gICAgICAgICAgLi4udGhpcy5zb3J0U3RhdGVcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY2hhbmdlcyQgPSBtZXJnZShcbiAgICAgIHRoaXMuZmlsdGVyLmliUXVlcnlVcGRhdGVkLFxuICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZSxcbiAgICAgIHRoaXMuYWdncmVnYXRlLFxuICAgICAgdGhpcy5zb3J0LnNvcnRDaGFuZ2VcbiAgICApO1xuICAgIHRoaXMudmlldy5oYW5kbGVTdGF0ZUNoYW5nZXMoY2hhbmdlcyQpO1xuXG4gICAgdGhpcy5fdmlld0NoYW5nZXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fdmlld0NoYW5nZXNTdWJzY3JpcHRpb24gPSB0aGlzLnZpZXcuX2FjdGl2ZVZpZXdcbiAgICAgLy8gU2tpcCBpbml0aWFsIHZpZXcsIGluaXRpYWxpemF0aW9uIGNvbWUgZnJvbSBxdWVyeXN0cmluZ1xuICAgICAgLnBpcGUoZmlsdGVyKCh2aWV3KSA9PiAhIXZpZXcgJiYgIXZpZXcuaW5pdGlhbCkpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMuaGFuZGxlVmlld0NoYW5nZSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVZpZXdDaGFuZ2UgPSAodmlldzogSVZpZXcpID0+IHtcbiAgICB0aGlzLnBhZ2luYXRvci5maXJzdFBhZ2UoKTtcbiAgICB0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSA9IHZpZXcuZGF0YS5wYWdlU2l6ZTtcbiAgICB0aGlzLmFnZ3JlZ2F0ZWRDb2x1bW5zID0geyAuLi52aWV3LmRhdGEuYWdncmVnYXRlZENvbHVtbnMgfTtcbiAgICB0aGlzLmZpbHRlci52YWx1ZSA9IHZpZXcuZGF0YS5maWx0ZXI7XG4gICAgdGhpcy5zb3J0U3RhdGUgPSB2aWV3LmRhdGEuc29ydDtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHVybFN0YXRlQWN0aW9ucy5oYW5kbGVWaWV3Q2hhbmdlKHtcbiAgICAgIHRhYmxlTmFtZTogdGhpcy50YWJsZU5hbWUsXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgdmlldzogdmlldy5pZCxcbiAgICAgICAgcGFnZVNpemU6IHZpZXcuZGF0YS5wYWdlU2l6ZSxcbiAgICAgICAgcGFnZTogMCxcbiAgICAgICAgZmlsdGVyczogdmlldy5kYXRhLmZpbHRlcixcbiAgICAgICAgYWdncmVnYXRlZENvbHVtbnM6IHZpZXcuZGF0YS5hZ2dyZWdhdGVkQ29sdW1ucyxcbiAgICAgICAgc29ydDoge1xuICAgICAgICAgIGFjdGl2ZTogdmlldy5kYXRhLnNvcnQuYWN0aXZlLFxuICAgICAgICAgIGRpcmVjdGlvbjogdmlldy5kYXRhLnNvcnQuZGlyZWN0aW9uLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgIH0pKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBhIGZpbHRlcmVkIGRhdGEgYXJyYXkgd2hlcmUgZWFjaCByb3cgc2F0aXNmaWVzIHRoZSBmaWx0ZXIuXG4gICAqIElmIG5vIGZpbHRlciBpcyBzZXQsIHJldHVybnMgdGhlIGRhdGEgYXJyYXkgYXMgcHJvdmlkZWQuXG4gICAqL1xuICBfZmlsdGVyRGF0YShkYXRhOiBUW10pIHtcbiAgICB0aGlzLnNlbGVjdGlvbkNvbHVtbj8uc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgdGhpcy5maWx0ZXJlZERhdGEgPSAhdGhpcy5maWx0ZXI/LnZhbHVlXG4gICAgICA/IGRhdGFcbiAgICAgIDogZGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5maWx0ZXJQcmVkaWNhdGUob2JqLCB0aGlzLmZpbHRlci52YWx1ZSkpO1xuXG4gICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XG4gICAgICB0aGlzLl91cGRhdGVQYWdpbmF0b3IodGhpcy5maWx0ZXJlZERhdGEubGVuZ3RoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZERhdGE7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHNvcnRlZCBjb3B5IG9mIHRoZSBkYXRhIGlmIE1hdFNvcnQgaGFzIGEgc29ydCBhcHBsaWVkLCBvdGhlcndpc2UganVzdCByZXR1cm5zIHRoZVxuICAgKiBkYXRhIGFycmF5IGFzIHByb3ZpZGVkLiBVc2VzIHRoZSBkZWZhdWx0IGRhdGEgYWNjZXNzb3IgZm9yIGRhdGEgbG9va3VwLCB1bmxlc3MgYVxuICAgKiBzb3J0RGF0YUFjY2Vzc29yIGZ1bmN0aW9uIGlzIGRlZmluZWQuXG4gICAqL1xuICBfb3JkZXJEYXRhKGRhdGE6IFRbXSk6IFRbXSB7XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gYWN0aXZlIHNvcnQgb3IgZGlyZWN0aW9uLCByZXR1cm4gdGhlIGRhdGEgd2l0aG91dCB0cnlpbmcgdG8gc29ydC5cbiAgICBpZiAoIXRoaXMuc29ydCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc29ydERhdGEoZGF0YS5zbGljZSgpLCB0aGlzLnNvcnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwYWdlZCBzbGljZSBvZiB0aGUgcHJvdmlkZWQgZGF0YSBhcnJheSBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIHBhZ2luYXRvcidzIHBhZ2VcbiAgICogaW5kZXggYW5kIGxlbmd0aC4gSWYgdGhlcmUgaXMgbm8gcGFnaW5hdG9yIHByb3ZpZGVkLCByZXR1cm5zIHRoZSBkYXRhIGFycmF5IGFzIHByb3ZpZGVkLlxuICAgKi9cbiAgX3BhZ2VEYXRhKGRhdGE6IFRbXSk6IFRbXSB7XG4gICAgaWYgKCF0aGlzLnBhZ2luYXRvcikge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCAqIHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplO1xuICAgIHJldHVybiBkYXRhLnNsaWNlKHN0YXJ0SW5kZXgsIHN0YXJ0SW5kZXggKyB0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgcGFnaW5hdG9yIHRvIHJlZmxlY3QgdGhlIGxlbmd0aCBvZiB0aGUgZmlsdGVyZWQgZGF0YSwgYW5kIG1ha2VzIHN1cmUgdGhhdCB0aGUgcGFnZVxuICAgKiBpbmRleCBkb2VzIG5vdCBleGNlZWQgdGhlIHBhZ2luYXRvcidzIGxhc3QgcGFnZS4gVmFsdWVzIGFyZSBjaGFuZ2VkIGluIGEgcmVzb2x2ZWQgcHJvbWlzZSB0b1xuICAgKiBndWFyZCBhZ2FpbnN0IG1ha2luZyBwcm9wZXJ0eSBjaGFuZ2VzIHdpdGhpbiBhIHJvdW5kIG9mIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAqL1xuICBfdXBkYXRlUGFnaW5hdG9yKGZpbHRlcmVkRGF0YUxlbmd0aDogbnVtYmVyKSB7XG4gICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBwYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcblxuICAgICAgaWYgKCFwYWdpbmF0b3IpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwYWdpbmF0b3IubGVuZ3RoID0gZmlsdGVyZWREYXRhTGVuZ3RoO1xuXG4gICAgICAvLyBJZiB0aGUgcGFnZSBpbmRleCBpcyBzZXQgYmV5b25kIHRoZSBwYWdlLCByZWR1Y2UgaXQgdG8gdGhlIGxhc3QgcGFnZS5cbiAgICAgIGlmIChwYWdpbmF0b3IucGFnZUluZGV4ID4gMCkge1xuICAgICAgICBjb25zdCBsYXN0UGFnZUluZGV4ID1cbiAgICAgICAgICBNYXRoLmNlaWwocGFnaW5hdG9yLmxlbmd0aCAvIHBhZ2luYXRvci5wYWdlU2l6ZSkgLSAxIHx8IDA7XG4gICAgICAgIGNvbnN0IG5ld1BhZ2VJbmRleCA9IE1hdGgubWluKHBhZ2luYXRvci5wYWdlSW5kZXgsIGxhc3RQYWdlSW5kZXgpO1xuXG4gICAgICAgIGlmIChuZXdQYWdlSW5kZXggIT09IHBhZ2luYXRvci5wYWdlSW5kZXgpIHtcbiAgICAgICAgICBwYWdpbmF0b3IucGFnZUluZGV4ID0gbmV3UGFnZUluZGV4O1xuXG4gICAgICAgICAgLy8gU2luY2UgdGhlIHBhZ2luYXRvciBvbmx5IGVtaXRzIGFmdGVyIHVzZXItZ2VuZXJhdGVkIGNoYW5nZXMsXG4gICAgICAgICAgLy8gd2UgbmVlZCBvdXIgb3duIHN0cmVhbSBzbyB3ZSBrbm93IHRvIHNob3VsZCByZS1yZW5kZXIgdGhlIGRhdGEuXG4gICAgICAgICAgdGhpcy5faW50ZXJuYWxQYWdlQ2hhbmdlcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF9hZ2dyZWdhdGVEYXRhKGRhdGE6IFRbXSk6IFRbXSB7XG4gICAgZm9yIChjb25zdCBbY29sdW1uTmFtZSwgZnVuXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmFnZ3JlZ2F0ZWRDb2x1bW5zKSkge1xuICAgICAgY29uc3QgZiA9IHRoaXMuYWdncmVnYXRpb25GdW5jdGlvbnMuZmluZCgoZikgPT4gZi5pZCA9PT0gZnVuKTtcbiAgICAgIGlmICghZikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWdncmVnYXRlZERhdGFbY29sdW1uTmFtZV0gPSB7XG4gICAgICAgIC4uLih0aGlzLmFnZ3JlZ2F0ZWREYXRhW2NvbHVtbk5hbWVdID8/IHt9KSxcbiAgICAgICAgdG90YWw6IGYuYWdncmVnYXRlRGF0YShkYXRhLm1hcCgoaSkgPT4gaVtjb2x1bW5OYW1lXSkpLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBfYWdncmVnYXRlUGFnaW5hdGVkRGF0YShkYXRhOiBUW10pOiBUW10ge1xuICAgIGZvciAoY29uc3QgW2NvbHVtbk5hbWUsIGZ1bl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5hZ2dyZWdhdGVkQ29sdW1ucykpIHtcbiAgICAgIGNvbnN0IGYgPSB0aGlzLmFnZ3JlZ2F0aW9uRnVuY3Rpb25zLmZpbmQoKGYpID0+IGYuaWQgPT09IGZ1bik7XG4gICAgICBpZiAoIWYpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLmFnZ3JlZ2F0ZWREYXRhW2NvbHVtbk5hbWVdID0ge1xuICAgICAgICAuLi4odGhpcy5hZ2dyZWdhdGVkRGF0YVtjb2x1bW5OYW1lXSA/PyB7fSksXG4gICAgICAgIGN1cnJlbnRQYWdlOiBmLmFnZ3JlZ2F0ZURhdGEoZGF0YS5tYXAoKGkpID0+IGlbY29sdW1uTmFtZV0pKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgdGhlIE1hdFRhYmxlLiBDYWxsZWQgd2hlbiBpdCBjb25uZWN0cyB0byB0aGUgZGF0YSBzb3VyY2UuXG4gICAqL1xuICBjb25uZWN0KCkge1xuICAgIGlmICghdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fdXBkYXRlQ2hhbmdlU3Vic2NyaXB0aW9uKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3JlbmRlckRhdGE7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSB0aGUgTWF0VGFibGUuIENhbGxlZCB3aGVuIGl0IGRpc2Nvbm5lY3RzIGZyb20gdGhlIGRhdGEgc291cmNlLlxuICAgKi9cbiAgZGlzY29ubmVjdCgpIHtcbiAgICB0aGlzLl92aWV3Q2hhbmdlc1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb24gPSBudWxsO1xuICB9XG59XG4iXX0=
|