ngx-register-base 1.3.1 → 1.3.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/esm2022/lib/components/checkbox-selector/checkbox-selector.component.mjs +129 -0
- package/esm2022/lib/components/checkbox-selector/checkbox-selector.types.mjs +8 -0
- package/esm2022/lib/components/column-settings/column-settings.component.mjs +249 -0
- package/esm2022/lib/components/column-settings/components/column-settings-template/column-settings-template.component.mjs +80 -0
- package/esm2022/lib/components/column-settings/consts/column-settings.consts.mjs +10 -0
- package/esm2022/lib/components/column-settings/index.mjs +3 -0
- package/esm2022/lib/components/column-settings/types/column-settings.types.mjs +7 -0
- package/esm2022/lib/components/divider/divider.component.mjs +16 -0
- package/esm2022/lib/components/filter-button/filter-button.component.mjs +19 -0
- package/esm2022/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.mjs +31 -0
- package/esm2022/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.mjs +57 -0
- package/esm2022/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.mjs +110 -0
- package/esm2022/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.mjs +130 -0
- package/esm2022/lib/components/filters/components/filter-list/filter-list.service.mjs +89 -0
- package/esm2022/lib/components/filters/components/filter-list/filters-section/filters-section.component.mjs +41 -0
- package/esm2022/lib/components/filters/components/filter-list.module.mjs +45 -0
- package/esm2022/lib/components/filters/index.mjs +3 -0
- package/esm2022/lib/components/filters/register-table-filter.component.mjs +155 -0
- package/esm2022/lib/components/filters/register-table-filter.module.mjs +39 -0
- package/esm2022/lib/components/index.mjs +11 -0
- package/esm2022/lib/components/inputs/index.mjs +20 -0
- package/esm2022/lib/components/inputs/inputs.module.mjs +166 -0
- package/esm2022/lib/components/inputs/param-calendar-year/param-calendar-year.component.mjs +45 -0
- package/esm2022/lib/components/inputs/param-custom/param-custom.component.mjs +12 -0
- package/esm2022/lib/components/inputs/param-date/param-date.component.mjs +76 -0
- package/esm2022/lib/components/inputs/param-date-range/param-date-range.component.mjs +60 -0
- package/esm2022/lib/components/inputs/param-date-time/param-date-time.component.mjs +86 -0
- package/esm2022/lib/components/inputs/param-date-time-range/param-date-time-range.component.mjs +95 -0
- package/esm2022/lib/components/inputs/param-month/param-month.component.mjs +50 -0
- package/esm2022/lib/components/inputs/param-month-range/param-month-range.component.mjs +62 -0
- package/esm2022/lib/components/inputs/param-multi-select/param-multi-select.component.mjs +309 -0
- package/esm2022/lib/components/inputs/param-select/param-select.component.mjs +225 -0
- package/esm2022/lib/components/inputs/param-switcher/param-switcher.component.mjs +21 -0
- package/esm2022/lib/components/inputs/param-switcher-date-time-range/consts/param-switcher-date-time-range.consts.mjs +28 -0
- package/esm2022/lib/components/inputs/param-switcher-date-time-range/index.mjs +3 -0
- package/esm2022/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.mjs +105 -0
- package/esm2022/lib/components/inputs/param-switcher-date-time-range/types/param-switcher-date-time-range.types.mjs +10 -0
- package/esm2022/lib/components/inputs/param-text/param-text.component.mjs +40 -0
- package/esm2022/lib/components/inputs/param-textarea/param-textarea.component.mjs +38 -0
- package/esm2022/lib/components/inputs/param-toggle/param-toggle.component.mjs +20 -0
- package/esm2022/lib/components/inputs/param-tree/consts/param-tree.consts.mjs +37 -0
- package/esm2022/lib/components/inputs/param-tree/index.mjs +8 -0
- package/esm2022/lib/components/inputs/param-tree/param-tree.component.mjs +207 -0
- package/esm2022/lib/components/inputs/param-tree/services/param-tree.service.mjs +116 -0
- package/esm2022/lib/components/inputs/param-tree/services/sync-tree-loader.service.mjs +20 -0
- package/esm2022/lib/components/inputs/param-tree/tokens/param-tree.tokens.mjs +3 -0
- package/esm2022/lib/components/inputs/param-tree/types/param-tree.types.mjs +2 -0
- package/esm2022/lib/components/inputs/param-tree/utils/param-tree.utils.mjs +9 -0
- package/esm2022/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.mjs +80 -0
- package/esm2022/lib/components/inputs/param-tree-select/param-tree-select.component.mjs +85 -0
- package/esm2022/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.mjs +15 -0
- package/esm2022/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.mjs +12 -0
- package/esm2022/lib/components/menu-constructor/index.mjs +5 -0
- package/esm2022/lib/components/menu-constructor/sproc-menu-constructor.component.mjs +559 -0
- package/esm2022/lib/components/menu-constructor/store/sproc-abstract-menu-constructor.store.mjs +3 -0
- package/esm2022/lib/components/menu-constructor/store/sproc-menu-constructor.consts.mjs +5 -0
- package/esm2022/lib/components/menu-constructor/store/sproc-menu.tokens.mjs +3 -0
- package/esm2022/lib/components/page-menu/index.mjs +6 -0
- package/esm2022/lib/components/page-menu/schema/sproc-page-menu.consts.mjs +9 -0
- package/esm2022/lib/components/page-menu/schema/sproc-page-menu.schema.mjs +2 -0
- package/esm2022/lib/components/page-menu/schema/sproc-page-menu.tokens.mjs +4 -0
- package/esm2022/lib/components/page-menu/schema/sproc-page-menu.types.mjs +3 -0
- package/esm2022/lib/components/page-menu/sproc-page-menu.component.mjs +275 -0
- package/esm2022/lib/components/paginator/paginator.component.mjs +159 -0
- package/esm2022/lib/components/paginator/types/paginator.types.mjs +2 -0
- package/esm2022/lib/components/register-table/consts/register-table.consts.mjs +4 -0
- package/esm2022/lib/components/register-table/directives/cell-template.directive.mjs +19 -0
- package/esm2022/lib/components/register-table/directives/header-template.directive.mjs +18 -0
- package/esm2022/lib/components/register-table/index.mjs +4 -0
- package/esm2022/lib/components/register-table/model/schema.mjs +10 -0
- package/esm2022/lib/components/register-table/pipes/class-by-type.pipe.mjs +33 -0
- package/esm2022/lib/components/register-table/pipes/sticky-column.pipe.mjs +17 -0
- package/esm2022/lib/components/register-table/register-table.component.mjs +544 -0
- package/esm2022/lib/components/reset-settings-form/reset-settings-form.component.mjs +18 -0
- package/esm2022/lib/components/search-input/search-input.component.mjs +28 -0
- package/esm2022/lib/components/sliding-panel/sliding-panel.component.mjs +48 -0
- package/esm2022/lib/components/sliding-panel/sliding-panel.module.mjs +19 -0
- package/esm2022/lib/consts/date-time.consts.mjs +2 -0
- package/esm2022/lib/consts/index.mjs +4 -0
- package/esm2022/lib/consts/inputs.consts.mjs +4 -0
- package/esm2022/lib/consts/month.consts.mjs +77 -0
- package/esm2022/lib/consts/params.consts.mjs +2 -0
- package/esm2022/lib/consts/register-base.consts.mjs +26 -0
- package/esm2022/lib/core/form-group-wrapper/errors-consts.mjs +8 -0
- package/esm2022/lib/core/form-group-wrapper/form-group-wrapper.mjs +81 -0
- package/esm2022/lib/core/form-group-wrapper/index.mjs +2 -0
- package/esm2022/lib/core/index.mjs +5 -0
- package/esm2022/lib/core/input-control/index.mjs +2 -0
- package/esm2022/lib/core/input-control/input-control.mjs +11 -0
- package/esm2022/lib/core/param/index.mjs +6 -0
- package/esm2022/lib/core/param/param-base.mjs +215 -0
- package/esm2022/lib/core/param/param-date-base.mjs +26 -0
- package/esm2022/lib/core/param/param-select-base.mjs +114 -0
- package/esm2022/lib/core/param/param-text-base.mjs +25 -0
- package/esm2022/lib/core/param/param.tokens.mjs +4 -0
- package/esm2022/lib/core/register-base/index.mjs +3 -0
- package/esm2022/lib/core/register-base/register-base.mjs +575 -0
- package/esm2022/lib/core/register-base/register-base.store.mjs +43 -0
- package/esm2022/lib/directives/date/date-time.types.mjs +34 -0
- package/esm2022/lib/directives/date/format-date.pipe.mjs +33 -0
- package/esm2022/lib/directives/index.mjs +3 -0
- package/esm2022/lib/directives/number/number-only.directive.mjs +41 -0
- package/esm2022/lib/directives/sticky/index.mjs +3 -0
- package/esm2022/lib/directives/sticky/sticky-relative.directive.mjs +32 -0
- package/esm2022/lib/directives/sticky/sticky-relative.service.mjs +32 -0
- package/esm2022/lib/directives/sticky/sticky.directive.mjs +169 -0
- package/esm2022/lib/services/date-time.service.mjs +314 -0
- package/esm2022/lib/services/dialog/dialog.service.mjs +53 -0
- package/esm2022/lib/services/dialog/dialog.types.mjs +2 -0
- package/esm2022/lib/services/dialog/index.mjs +3 -0
- package/esm2022/lib/services/dom-intersection.service.mjs +22 -0
- package/esm2022/lib/services/filter/filters-state.service.mjs +65 -0
- package/esm2022/lib/services/filter/filters-transmit.service.mjs +82 -0
- package/esm2022/lib/services/filter/filters.service.mjs +23 -0
- package/esm2022/lib/services/index.mjs +8 -0
- package/esm2022/lib/services/inputs-state.service.mjs +130 -0
- package/esm2022/lib/services/inputs.service.mjs +88 -0
- package/esm2022/lib/services/key-pressed.service.mjs +37 -0
- package/esm2022/lib/services/resize-window-observer.service.mjs +33 -0
- package/esm2022/lib/services/selected-objects-state.service.mjs +123 -0
- package/esm2022/lib/store/fast-query-store.service.mjs +110 -0
- package/esm2022/lib/store/index.mjs +2 -0
- package/esm2022/lib/types/event.types.mjs +2 -0
- package/esm2022/lib/types/hasura.types.mjs +2 -0
- package/esm2022/lib/types/index.mjs +7 -0
- package/esm2022/lib/types/inputs.types.mjs +19 -0
- package/esm2022/lib/types/params.types.mjs +2 -0
- package/esm2022/lib/types/register-base.types.mjs +6 -0
- package/esm2022/lib/types/sub-types.mjs +2 -0
- package/esm2022/lib/types/user-profile.types.mjs +2 -0
- package/esm2022/lib/utils/functions.mjs +10 -0
- package/esm2022/lib/utils/get-url-segment.mjs +35 -0
- package/esm2022/lib/utils/index.mjs +5 -0
- package/esm2022/lib/utils/prizm.shared.module.mjs +284 -0
- package/esm2022/lib/utils/rxjs.mjs +28 -0
- package/esm2022/lib/utils/select-all-utils.mjs +11 -0
- package/esm2022/ngx-register-base.mjs +5 -0
- package/esm2022/public-api.mjs +9 -0
- package/fesm2022/ngx-register-base.mjs +7479 -0
- package/fesm2022/ngx-register-base.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/checkbox-selector/checkbox-selector.component.d.ts +33 -0
- package/lib/components/checkbox-selector/checkbox-selector.types.d.ts +7 -0
- package/lib/components/column-settings/column-settings.component.d.ts +80 -0
- package/lib/components/column-settings/components/column-settings-template/column-settings-template.component.d.ts +24 -0
- package/lib/components/column-settings/consts/column-settings.consts.d.ts +8 -0
- package/lib/components/column-settings/types/column-settings.types.d.ts +22 -0
- package/lib/components/divider/divider.component.d.ts +6 -0
- package/lib/components/filter-button/filter-button.component.d.ts +8 -0
- package/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.d.ts +14 -0
- package/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.d.ts +25 -0
- package/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.d.ts +39 -0
- package/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.d.ts +41 -0
- package/lib/components/filters/components/filter-list/filter-list.service.d.ts +20 -0
- package/lib/components/filters/components/filter-list/filters-section/filters-section.component.d.ts +15 -0
- package/lib/components/filters/components/filter-list.module.d.ts +15 -0
- package/lib/components/filters/register-table-filter.component.d.ts +40 -0
- package/lib/components/filters/register-table-filter.module.d.ts +13 -0
- package/lib/components/inputs/inputs.module.d.ts +31 -0
- package/lib/components/inputs/param-calendar-year/param-calendar-year.component.d.ts +19 -0
- package/lib/components/inputs/param-custom/param-custom.component.d.ts +6 -0
- package/lib/components/inputs/param-date/param-date.component.d.ts +20 -0
- package/lib/components/inputs/param-date-range/param-date-range.component.d.ts +26 -0
- package/lib/components/inputs/param-date-time/param-date-time.component.d.ts +25 -0
- package/lib/components/inputs/param-date-time-range/param-date-time-range.component.d.ts +28 -0
- package/lib/components/inputs/param-month/param-month.component.d.ts +18 -0
- package/lib/components/inputs/param-month-range/param-month-range.component.d.ts +21 -0
- package/lib/components/inputs/param-multi-select/param-multi-select.component.d.ts +46 -0
- package/lib/components/inputs/param-select/param-select.component.d.ts +34 -0
- package/lib/components/inputs/param-switcher/param-switcher.component.d.ts +8 -0
- package/lib/components/inputs/param-switcher-date-time-range/consts/param-switcher-date-time-range.consts.d.ts +2 -0
- package/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.d.ts +19 -0
- package/lib/components/inputs/param-switcher-date-time-range/types/param-switcher-date-time-range.types.d.ts +8 -0
- package/lib/components/inputs/param-text/param-text.component.d.ts +10 -0
- package/lib/components/inputs/param-textarea/param-textarea.component.d.ts +10 -0
- package/lib/components/inputs/param-toggle/param-toggle.component.d.ts +9 -0
- package/lib/components/inputs/param-tree/consts/param-tree.consts.d.ts +7 -0
- package/lib/components/inputs/param-tree/param-tree.component.d.ts +41 -0
- package/lib/components/inputs/param-tree/services/param-tree.service.d.ts +37 -0
- package/lib/components/inputs/param-tree/services/sync-tree-loader.service.d.ts +10 -0
- package/{src/lib/components/inputs/param-tree/tokens/param-tree.tokens.ts → lib/components/inputs/param-tree/tokens/param-tree.tokens.d.ts} +1 -2
- package/lib/components/inputs/param-tree/types/param-tree.types.d.ts +32 -0
- package/lib/components/inputs/param-tree/utils/param-tree.utils.d.ts +7 -0
- package/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.d.ts +31 -0
- package/lib/components/inputs/param-tree-select/param-tree-select.component.d.ts +30 -0
- package/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.d.ts +6 -0
- package/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.d.ts +5 -0
- package/lib/components/menu-constructor/sproc-menu-constructor.component.d.ts +113 -0
- package/lib/components/menu-constructor/store/sproc-abstract-menu-constructor.store.d.ts +24 -0
- package/lib/components/menu-constructor/store/sproc-menu-constructor.consts.d.ts +36 -0
- package/{src/lib/components/menu-constructor/store/sproc-menu.tokens.ts → lib/components/menu-constructor/store/sproc-menu.tokens.d.ts} +1 -4
- package/lib/components/page-menu/schema/sproc-page-menu.consts.d.ts +7 -0
- package/lib/components/page-menu/schema/sproc-page-menu.schema.d.ts +30 -0
- package/lib/components/page-menu/schema/sproc-page-menu.tokens.d.ts +3 -0
- package/lib/components/page-menu/schema/sproc-page-menu.types.d.ts +36 -0
- package/lib/components/page-menu/sproc-page-menu.component.d.ts +48 -0
- package/lib/components/paginator/paginator.component.d.ts +52 -0
- package/lib/components/paginator/types/paginator.types.d.ts +15 -0
- package/lib/components/register-table/consts/register-table.consts.d.ts +3 -0
- package/lib/components/register-table/directives/cell-template.directive.d.ts +9 -0
- package/lib/components/register-table/directives/header-template.directive.d.ts +9 -0
- package/lib/components/register-table/model/schema.d.ts +52 -0
- package/lib/components/register-table/pipes/class-by-type.pipe.d.ts +8 -0
- package/lib/components/register-table/pipes/sticky-column.pipe.d.ts +7 -0
- package/lib/components/register-table/register-table.component.d.ts +165 -0
- package/lib/components/reset-settings-form/reset-settings-form.component.d.ts +9 -0
- package/lib/components/search-input/search-input.component.d.ts +11 -0
- package/lib/components/sliding-panel/sliding-panel.component.d.ts +14 -0
- package/lib/components/sliding-panel/sliding-panel.module.d.ts +9 -0
- package/lib/consts/date-time.consts.d.ts +1 -0
- package/lib/consts/index.d.ts +3 -0
- package/lib/consts/inputs.consts.d.ts +4 -0
- package/lib/consts/month.consts.d.ts +49 -0
- package/lib/consts/params.consts.d.ts +1 -0
- package/lib/consts/register-base.consts.d.ts +19 -0
- package/lib/core/form-group-wrapper/errors-consts.d.ts +5 -0
- package/lib/core/form-group-wrapper/form-group-wrapper.d.ts +15 -0
- package/lib/core/input-control/input-control.d.ts +11 -0
- package/lib/core/param/param-base.d.ts +68 -0
- package/lib/core/param/param-date-base.d.ts +18 -0
- package/lib/core/param/param-select-base.d.ts +42 -0
- package/lib/core/param/param-text-base.d.ts +15 -0
- package/{src/lib/core/param/param.tokens.ts → lib/core/param/param.tokens.d.ts} +1 -2
- package/lib/core/register-base/register-base.d.ts +168 -0
- package/lib/core/register-base/register-base.store.d.ts +35 -0
- package/lib/directives/date/date-time.types.d.ts +32 -0
- package/lib/directives/date/format-date.pipe.d.ts +10 -0
- package/lib/directives/number/number-only.directive.d.ts +10 -0
- package/lib/directives/sticky/sticky-relative.directive.d.ts +13 -0
- package/lib/directives/sticky/sticky-relative.service.d.ts +15 -0
- package/lib/directives/sticky/sticky.directive.d.ts +27 -0
- package/lib/services/date-time.service.d.ts +80 -0
- package/lib/services/dialog/dialog.service.d.ts +22 -0
- package/{src/lib/services/dialog/dialog.types.ts → lib/services/dialog/dialog.types.d.ts} +4 -8
- package/lib/services/dom-intersection.service.d.ts +8 -0
- package/lib/services/filter/filters-state.service.d.ts +21 -0
- package/lib/services/filter/filters-transmit.service.d.ts +28 -0
- package/lib/services/filter/filters.service.d.ts +12 -0
- package/lib/services/inputs-state.service.d.ts +57 -0
- package/lib/services/inputs.service.d.ts +28 -0
- package/lib/services/key-pressed.service.d.ts +15 -0
- package/lib/services/resize-window-observer.service.d.ts +11 -0
- package/lib/services/selected-objects-state.service.d.ts +47 -0
- package/lib/store/fast-query-store.service.d.ts +19 -0
- package/{src/lib/types/event.types.ts → lib/types/event.types.d.ts} +1 -1
- package/lib/types/hasura.types.d.ts +35 -0
- package/lib/types/inputs.types.d.ts +41 -0
- package/lib/types/params.types.d.ts +27 -0
- package/lib/types/register-base.types.d.ts +123 -0
- package/lib/types/sub-types.d.ts +8 -0
- package/lib/types/user-profile.types.d.ts +17 -0
- package/lib/utils/functions.d.ts +3 -0
- package/lib/utils/get-url-segment.d.ts +7 -0
- package/lib/utils/prizm.shared.module.d.ts +14 -0
- package/lib/utils/rxjs.d.ts +10 -0
- package/lib/utils/select-all-utils.d.ts +8 -0
- package/package.json +15 -12
- package/schematics/ng-update/replace-menu-state-token/index.d.ts +2 -0
- package/schematics/ng-update/replace-menu-state-token/index.js +29 -0
- package/schematics/ng-update/replace-menu-state-token/index.js.map +1 -0
- package/schematics/ng-update/update-prefix/index.d.ts +2 -0
- package/schematics/ng-update/update-prefix/index.js +33 -0
- package/schematics/ng-update/update-prefix/index.js.map +1 -0
- package/schematics/utils/{utils.ts → utils.d.ts} +2 -9
- package/schematics/utils/utils.js +25 -0
- package/schematics/utils/utils.js.map +1 -0
- package/ng-package.json +0 -15
- package/schematics/ng-update/replace-menu-state-token/index.ts +0 -33
- package/schematics/ng-update/update-prefix/index.ts +0 -38
- package/src/lib/components/checkbox-selector/checkbox-selector.component.html +0 -91
- package/src/lib/components/checkbox-selector/checkbox-selector.component.less +0 -67
- package/src/lib/components/checkbox-selector/checkbox-selector.component.ts +0 -176
- package/src/lib/components/checkbox-selector/checkbox-selector.types.ts +0 -8
- package/src/lib/components/column-settings/column-settings.component.html +0 -160
- package/src/lib/components/column-settings/column-settings.component.less +0 -131
- package/src/lib/components/column-settings/column-settings.component.ts +0 -352
- package/src/lib/components/column-settings/components/column-settings-template/column-settings-template.component.html +0 -65
- package/src/lib/components/column-settings/components/column-settings-template/column-settings-template.component.less +0 -79
- package/src/lib/components/column-settings/components/column-settings-template/column-settings-template.component.ts +0 -114
- package/src/lib/components/column-settings/consts/column-settings.consts.ts +0 -9
- package/src/lib/components/column-settings/types/column-settings.types.ts +0 -26
- package/src/lib/components/divider/divider.component.html +0 -4
- package/src/lib/components/divider/divider.component.less +0 -10
- package/src/lib/components/divider/divider.component.ts +0 -12
- package/src/lib/components/filter-button/filter-button.component.html +0 -20
- package/src/lib/components/filter-button/filter-button.component.less +0 -41
- package/src/lib/components/filter-button/filter-button.component.ts +0 -18
- package/src/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.html +0 -22
- package/src/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.less +0 -23
- package/src/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.ts +0 -31
- package/src/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.html +0 -49
- package/src/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.less +0 -37
- package/src/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.ts +0 -66
- package/src/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.html +0 -147
- package/src/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.less +0 -45
- package/src/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.ts +0 -114
- package/src/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.html +0 -44
- package/src/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.less +0 -49
- package/src/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.ts +0 -167
- package/src/lib/components/filters/components/filter-list/filter-list.service.ts +0 -97
- package/src/lib/components/filters/components/filter-list/filters-section/filters-section.component.html +0 -18
- package/src/lib/components/filters/components/filter-list/filters-section/filters-section.component.less +0 -55
- package/src/lib/components/filters/components/filter-list/filters-section/filters-section.component.ts +0 -69
- package/src/lib/components/filters/components/filter-list.module.ts +0 -29
- package/src/lib/components/filters/register-table-filter.component.html +0 -53
- package/src/lib/components/filters/register-table-filter.component.less +0 -17
- package/src/lib/components/filters/register-table-filter.component.ts +0 -167
- package/src/lib/components/filters/register-table-filter.module.ts +0 -22
- package/src/lib/components/inputs/inputs.module.ts +0 -104
- package/src/lib/components/inputs/param-calendar-year/param-calendar-year.component.html +0 -49
- package/src/lib/components/inputs/param-calendar-year/param-calendar-year.component.less +0 -70
- package/src/lib/components/inputs/param-calendar-year/param-calendar-year.component.ts +0 -52
- package/src/lib/components/inputs/param-custom/param-custom.component.html +0 -1
- package/src/lib/components/inputs/param-custom/param-custom.component.ts +0 -9
- package/src/lib/components/inputs/param-date/param-date.component.html +0 -55
- package/src/lib/components/inputs/param-date/param-date.component.less +0 -67
- package/src/lib/components/inputs/param-date/param-date.component.ts +0 -77
- package/src/lib/components/inputs/param-date-range/param-date-range.component.html +0 -45
- package/src/lib/components/inputs/param-date-range/param-date-range.component.less +0 -75
- package/src/lib/components/inputs/param-date-range/param-date-range.component.ts +0 -67
- package/src/lib/components/inputs/param-date-time/param-date-time.component.html +0 -70
- package/src/lib/components/inputs/param-date-time/param-date-time.component.less +0 -72
- package/src/lib/components/inputs/param-date-time/param-date-time.component.ts +0 -101
- package/src/lib/components/inputs/param-date-time-range/param-date-time-range.component.html +0 -67
- package/src/lib/components/inputs/param-date-time-range/param-date-time-range.component.less +0 -103
- package/src/lib/components/inputs/param-date-time-range/param-date-time-range.component.ts +0 -128
- package/src/lib/components/inputs/param-month/param-month.component.html +0 -46
- package/src/lib/components/inputs/param-month/param-month.component.less +0 -72
- package/src/lib/components/inputs/param-month/param-month.component.ts +0 -55
- package/src/lib/components/inputs/param-month-range/param-month-range.component.html +0 -39
- package/src/lib/components/inputs/param-month-range/param-month-range.component.less +0 -71
- package/src/lib/components/inputs/param-month-range/param-month-range.component.ts +0 -76
- package/src/lib/components/inputs/param-multi-select/param-multi-select.component.html +0 -84
- package/src/lib/components/inputs/param-multi-select/param-multi-select.component.less +0 -108
- package/src/lib/components/inputs/param-multi-select/param-multi-select.component.ts +0 -448
- package/src/lib/components/inputs/param-select/param-select.component.html +0 -106
- package/src/lib/components/inputs/param-select/param-select.component.less +0 -26
- package/src/lib/components/inputs/param-select/param-select.component.ts +0 -318
- package/src/lib/components/inputs/param-switcher/param-switcher.component.html +0 -8
- package/src/lib/components/inputs/param-switcher/param-switcher.component.less +0 -53
- package/src/lib/components/inputs/param-switcher/param-switcher.component.ts +0 -13
- package/src/lib/components/inputs/param-switcher-date-time-range/consts/param-switcher-date-time-range.consts.ts +0 -29
- package/src/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.html +0 -19
- package/src/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.less +0 -76
- package/src/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.ts +0 -134
- package/src/lib/components/inputs/param-switcher-date-time-range/types/param-switcher-date-time-range.types.ts +0 -8
- package/src/lib/components/inputs/param-text/param-text.component.html +0 -59
- package/src/lib/components/inputs/param-text/param-text.component.less +0 -33
- package/src/lib/components/inputs/param-text/param-text.component.ts +0 -36
- package/src/lib/components/inputs/param-textarea/param-textarea.component.html +0 -61
- package/src/lib/components/inputs/param-textarea/param-textarea.component.less +0 -21
- package/src/lib/components/inputs/param-textarea/param-textarea.component.ts +0 -33
- package/src/lib/components/inputs/param-toggle/param-toggle.component.html +0 -40
- package/src/lib/components/inputs/param-toggle/param-toggle.component.less +0 -69
- package/src/lib/components/inputs/param-toggle/param-toggle.component.ts +0 -14
- package/src/lib/components/inputs/param-tree/consts/param-tree.consts.ts +0 -59
- package/src/lib/components/inputs/param-tree/param-tree.component.html +0 -51
- package/src/lib/components/inputs/param-tree/param-tree.component.less +0 -3
- package/src/lib/components/inputs/param-tree/param-tree.component.ts +0 -282
- package/src/lib/components/inputs/param-tree/services/param-tree.service.ts +0 -176
- package/src/lib/components/inputs/param-tree/services/sync-tree-loader.service.ts +0 -18
- package/src/lib/components/inputs/param-tree/types/param-tree.types.ts +0 -39
- package/src/lib/components/inputs/param-tree/utils/param-tree.utils.ts +0 -18
- package/src/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.html +0 -78
- package/src/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.less +0 -109
- package/src/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.ts +0 -89
- package/src/lib/components/inputs/param-tree-select/param-tree-select.component.html +0 -54
- package/src/lib/components/inputs/param-tree-select/param-tree-select.component.less +0 -56
- package/src/lib/components/inputs/param-tree-select/param-tree-select.component.ts +0 -91
- package/src/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.html +0 -5
- package/src/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.ts +0 -13
- package/src/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.html +0 -4
- package/src/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.ts +0 -11
- package/src/lib/components/menu-constructor/sproc-menu-constructor.component.html +0 -95
- package/src/lib/components/menu-constructor/sproc-menu-constructor.component.less +0 -183
- package/src/lib/components/menu-constructor/sproc-menu-constructor.component.ts +0 -687
- package/src/lib/components/menu-constructor/store/sproc-abstract-menu-constructor.store.ts +0 -32
- package/src/lib/components/menu-constructor/store/sproc-menu-constructor.consts.ts +0 -46
- package/src/lib/components/page-menu/README.md +0 -60
- package/src/lib/components/page-menu/schema/sproc-page-menu.consts.ts +0 -8
- package/src/lib/components/page-menu/schema/sproc-page-menu.schema.ts +0 -35
- package/src/lib/components/page-menu/schema/sproc-page-menu.tokens.ts +0 -5
- package/src/lib/components/page-menu/schema/sproc-page-menu.types.ts +0 -42
- package/src/lib/components/page-menu/sproc-page-menu.component.html +0 -166
- package/src/lib/components/page-menu/sproc-page-menu.component.less +0 -228
- package/src/lib/components/page-menu/sproc-page-menu.component.ts +0 -337
- package/src/lib/components/paginator/paginator.component.html +0 -97
- package/src/lib/components/paginator/paginator.component.less +0 -101
- package/src/lib/components/paginator/paginator.component.ts +0 -192
- package/src/lib/components/paginator/types/paginator.types.ts +0 -16
- package/src/lib/components/register-table/consts/register-table.consts.ts +0 -3
- package/src/lib/components/register-table/directives/cell-template.directive.ts +0 -11
- package/src/lib/components/register-table/directives/header-template.directive.ts +0 -11
- package/src/lib/components/register-table/model/schema.ts +0 -62
- package/src/lib/components/register-table/pipes/class-by-type.pipe.ts +0 -28
- package/src/lib/components/register-table/pipes/sticky-column.pipe.ts +0 -11
- package/src/lib/components/register-table/register-table.component.html +0 -257
- package/src/lib/components/register-table/register-table.component.less +0 -151
- package/src/lib/components/register-table/register-table.component.ts +0 -743
- package/src/lib/components/reset-settings-form/reset-settings-form.component.html +0 -14
- package/src/lib/components/reset-settings-form/reset-settings-form.component.less +0 -26
- package/src/lib/components/reset-settings-form/reset-settings-form.component.ts +0 -15
- package/src/lib/components/search-input/search-input.component.html +0 -6
- package/src/lib/components/search-input/search-input.component.less +0 -17
- package/src/lib/components/search-input/search-input.component.ts +0 -31
- package/src/lib/components/sliding-panel/sliding-panel.component.html +0 -13
- package/src/lib/components/sliding-panel/sliding-panel.component.less +0 -112
- package/src/lib/components/sliding-panel/sliding-panel.component.ts +0 -36
- package/src/lib/components/sliding-panel/sliding-panel.module.ts +0 -11
- package/src/lib/consts/date-time.consts.ts +0 -1
- package/src/lib/consts/index.ts +0 -8
- package/src/lib/consts/inputs.consts.ts +0 -9
- package/src/lib/consts/month.consts.ts +0 -82
- package/src/lib/consts/params.consts.ts +0 -1
- package/src/lib/consts/register-base.consts.ts +0 -40
- package/src/lib/core/form-group-wrapper/errors-consts.ts +0 -6
- package/src/lib/core/form-group-wrapper/form-group-wrapper.ts +0 -109
- package/src/lib/core/input-control/input-control.ts +0 -30
- package/src/lib/core/param/param-base.ts +0 -262
- package/src/lib/core/param/param-date-base.ts +0 -30
- package/src/lib/core/param/param-select-base.ts +0 -118
- package/src/lib/core/param/param-text-base.ts +0 -23
- package/src/lib/core/register-base/register-base.store.ts +0 -84
- package/src/lib/core/register-base/register-base.ts +0 -854
- package/src/lib/directives/date/date-time.types.ts +0 -36
- package/src/lib/directives/date/format-date.pipe.ts +0 -28
- package/src/lib/directives/number/number-only.directive.ts +0 -36
- package/src/lib/directives/sticky/sticky-relative.directive.ts +0 -30
- package/src/lib/directives/sticky/sticky-relative.service.ts +0 -34
- package/src/lib/directives/sticky/sticky.directive.ts +0 -189
- package/src/lib/services/date-time.service.ts +0 -399
- package/src/lib/services/dialog/dialog.service.ts +0 -62
- package/src/lib/services/dom-intersection.service.ts +0 -23
- package/src/lib/services/filter/filters-state.service.ts +0 -83
- package/src/lib/services/filter/filters-transmit.service.ts +0 -105
- package/src/lib/services/filter/filters.service.ts +0 -21
- package/src/lib/services/inputs-state.service.ts +0 -157
- package/src/lib/services/inputs.service.ts +0 -114
- package/src/lib/services/key-pressed.service.ts +0 -40
- package/src/lib/services/resize-window-observer.service.ts +0 -37
- package/src/lib/services/selected-objects-state.service.ts +0 -159
- package/src/lib/store/fast-query-store.service.ts +0 -132
- package/src/lib/types/hasura.types.ts +0 -41
- package/src/lib/types/inputs.types.ts +0 -63
- package/src/lib/types/params.types.ts +0 -42
- package/src/lib/types/register-base.types.ts +0 -161
- package/src/lib/types/sub-types.ts +0 -15
- package/src/lib/types/user-profile.types.ts +0 -18
- package/src/lib/utils/functions.ts +0 -11
- package/src/lib/utils/get-url-segment.ts +0 -46
- package/src/lib/utils/prizm.shared.module.ts +0 -176
- package/src/lib/utils/rxjs.ts +0 -33
- package/src/lib/utils/select-all-utils.ts +0 -16
- package/tsconfig.lib.json +0 -16
- package/tsconfig.lib.prod.json +0 -11
- package/tsconfig.schematics.json +0 -26
- package/tsconfig.spec.json +0 -15
- /package/{src/lib/components/column-settings/index.ts → lib/components/column-settings/index.d.ts} +0 -0
- /package/{src/lib/components/filters/index.ts → lib/components/filters/index.d.ts} +0 -0
- /package/{src/lib/components/index.ts → lib/components/index.d.ts} +0 -0
- /package/{src/lib/components/inputs/index.ts → lib/components/inputs/index.d.ts} +0 -0
- /package/{src/lib/components/inputs/param-switcher-date-time-range/index.ts → lib/components/inputs/param-switcher-date-time-range/index.d.ts} +0 -0
- /package/{src/lib/components/inputs/param-tree/index.ts → lib/components/inputs/param-tree/index.d.ts} +0 -0
- /package/{src/lib/components/menu-constructor/index.ts → lib/components/menu-constructor/index.d.ts} +0 -0
- /package/{src/lib/components/page-menu/index.ts → lib/components/page-menu/index.d.ts} +0 -0
- /package/{src/lib/components/register-table/index.ts → lib/components/register-table/index.d.ts} +0 -0
- /package/{src/lib/core/form-group-wrapper/index.ts → lib/core/form-group-wrapper/index.d.ts} +0 -0
- /package/{src/lib/core/index.ts → lib/core/index.d.ts} +0 -0
- /package/{src/lib/core/input-control/index.ts → lib/core/input-control/index.d.ts} +0 -0
- /package/{src/lib/core/param/index.ts → lib/core/param/index.d.ts} +0 -0
- /package/{src/lib/core/register-base/index.ts → lib/core/register-base/index.d.ts} +0 -0
- /package/{src/lib/directives/index.ts → lib/directives/index.d.ts} +0 -0
- /package/{src/lib/directives/sticky/index.ts → lib/directives/sticky/index.d.ts} +0 -0
- /package/{src/lib/services/dialog/index.ts → lib/services/dialog/index.d.ts} +0 -0
- /package/{src/lib/services/index.ts → lib/services/index.d.ts} +0 -0
- /package/{src/lib/store/index.ts → lib/store/index.d.ts} +0 -0
- /package/{src/lib/types/index.ts → lib/types/index.d.ts} +0 -0
- /package/{src/lib/utils/index.ts → lib/utils/index.d.ts} +0 -0
- /package/{src/public-api.ts → public-api.d.ts} +0 -0
|
@@ -0,0 +1,575 @@
|
|
|
1
|
+
import { ChangeDetectorRef, DestroyRef, Directive, inject, } from '@angular/core';
|
|
2
|
+
import { Router } from '@angular/router';
|
|
3
|
+
import { BehaviorSubject, catchError, combineLatest, debounceTime, filter as rxjsFilter, map, ReplaySubject, switchMap, take, tap, throwError, } from 'rxjs';
|
|
4
|
+
import { ERegisterObjectState, EInputsAction, EInputsState, } from '../../types';
|
|
5
|
+
import { EColumnStatus, } from '../../components/column-settings/types/column-settings.types';
|
|
6
|
+
import { SelectionTypes, } from '../../components/checkbox-selector/checkbox-selector.types';
|
|
7
|
+
import { FiltersStateService, FiltersService, FiltersTransmitService, SelectedObjectsStateService, } from '../../services';
|
|
8
|
+
import { SEARCH_INPUT_DEBOUNCE_TIME_MLS, SETTINGS_TYPE, USER_PROFILE_LOADER, USER_SETTINGS_LOADER, } from '../../consts/register-base.consts';
|
|
9
|
+
import { getLastSegmentOfPathName, isNonNull } from '../../utils';
|
|
10
|
+
import { DEFAULT_LIMIT } from '../../services/inputs-state.service';
|
|
11
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
12
|
+
import _ from 'lodash';
|
|
13
|
+
import { RegisterBaseStore } from './register-base.store';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
export class RegisterBase {
|
|
16
|
+
get limit() {
|
|
17
|
+
return this._limit;
|
|
18
|
+
}
|
|
19
|
+
get offset() {
|
|
20
|
+
return this._offset;
|
|
21
|
+
}
|
|
22
|
+
/** Uuid'ы всех выбранных или исключаемых объектов реестра (зависит от состояния еще не загруженных объектов) */
|
|
23
|
+
get idsFromState() {
|
|
24
|
+
const service = this.selectedService;
|
|
25
|
+
if (!service) {
|
|
26
|
+
throw new Error('SelectedObjectsStateService не запровайжен');
|
|
27
|
+
}
|
|
28
|
+
return service.keys();
|
|
29
|
+
}
|
|
30
|
+
/** Все выбранные uuid'ы реестра */
|
|
31
|
+
get selectedIdsFromState() {
|
|
32
|
+
const service = this.selectedService;
|
|
33
|
+
if (!service) {
|
|
34
|
+
throw new Error('SelectedObjectsStateService не запровайжен');
|
|
35
|
+
}
|
|
36
|
+
return service.selectedKeys();
|
|
37
|
+
}
|
|
38
|
+
/** Все выбранные объекты реестра */
|
|
39
|
+
get selectedObjectsFromState() {
|
|
40
|
+
const service = this.selectedService;
|
|
41
|
+
if (!service) {
|
|
42
|
+
throw new Error('SelectedObjectsStateService не запровайжен');
|
|
43
|
+
}
|
|
44
|
+
return service.selectedValues();
|
|
45
|
+
}
|
|
46
|
+
constructor(injector, columnsData) {
|
|
47
|
+
this.injector = injector;
|
|
48
|
+
/** Сервисы управления фильтрами */
|
|
49
|
+
this.filtersService = inject(FiltersService);
|
|
50
|
+
this.stateService = inject(FiltersStateService);
|
|
51
|
+
this.transmitter = inject(FiltersTransmitService, { optional: true });
|
|
52
|
+
/** Сервис управления пользователем */
|
|
53
|
+
this.userService = inject(USER_PROFILE_LOADER);
|
|
54
|
+
/** Сервис управления данными в реестре */
|
|
55
|
+
this.baseStore = inject((RegisterBaseStore), { optional: true });
|
|
56
|
+
// TODO удалить optional: true после выполнения задачи SMA2-3134
|
|
57
|
+
this.selectedService = inject((SelectedObjectsStateService), {
|
|
58
|
+
optional: true,
|
|
59
|
+
});
|
|
60
|
+
// TODO protected readonly navigationService = inject(NavigationService);
|
|
61
|
+
this.router = inject(Router);
|
|
62
|
+
this.cdr = inject(ChangeDetectorRef);
|
|
63
|
+
this.destroyRef = inject(DestroyRef);
|
|
64
|
+
this.settingsService = inject(USER_SETTINGS_LOADER);
|
|
65
|
+
this.filterApplied$ = this.stateService.gqlValues$.pipe(map((filter) => Number(filter.length) > 0));
|
|
66
|
+
this.page$ = this.stateService.page$;
|
|
67
|
+
this.limit$ = this.stateService.limit$;
|
|
68
|
+
this.selectedRecordsLoading$ = new BehaviorSubject(false);
|
|
69
|
+
this.data = [];
|
|
70
|
+
this.visibleData = [];
|
|
71
|
+
this.dataCount = 0;
|
|
72
|
+
/** @deprecated Используйте selectedObjectsFromState */
|
|
73
|
+
this.selectedObjects = new Set();
|
|
74
|
+
/** @deprecated Используйте selectedIdsFromState */
|
|
75
|
+
this.selectedIds = new Set();
|
|
76
|
+
this._user = this.userService.getUserProfile();
|
|
77
|
+
this.stickyLeftIds = [];
|
|
78
|
+
this.stickyRightIds = [];
|
|
79
|
+
this.currentFilter = null;
|
|
80
|
+
this.filterState = [];
|
|
81
|
+
this._modulePath = getLastSegmentOfPathName(this.router.url);
|
|
82
|
+
this._defaultFilterApplied$ = new ReplaySubject();
|
|
83
|
+
/**
|
|
84
|
+
* Контрол строки поиска
|
|
85
|
+
*/
|
|
86
|
+
this.searchInput = this.filtersService.searchInput;
|
|
87
|
+
this._selectionType$ = this.selectedService?.selectionType$ ?? new BehaviorSubject(null);
|
|
88
|
+
this.stateObjects = this.selectedService?.state;
|
|
89
|
+
this.columnsData = columnsData;
|
|
90
|
+
this._defaultColumnsWidths = new Map(columnsData.map((col) => [col.name, col.width]));
|
|
91
|
+
this.columns = this._getDefaultColumnsRecursive(columnsData);
|
|
92
|
+
this._subscribeOnSettings();
|
|
93
|
+
this._fetchSavedPageRowsLimit();
|
|
94
|
+
const state = this.router.getCurrentNavigation()?.extras?.state;
|
|
95
|
+
if (state) {
|
|
96
|
+
this.filterState = this.parseToFilters(state);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
_subscribeOnSettings() {
|
|
100
|
+
this.settingsService.settings$
|
|
101
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
102
|
+
.subscribe(([userSetting]) => {
|
|
103
|
+
const { tableColumnsWidth } = userSetting?.settings ?? {};
|
|
104
|
+
const type = userSetting?.settings_type;
|
|
105
|
+
if (type && type !== SETTINGS_TYPE.COLUMNS) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const cleanedCurrent = this._omitUndefined(this._columnsSettings?.settings.tableColumnsWidth);
|
|
109
|
+
const cleanedNew = this._omitUndefined(tableColumnsWidth);
|
|
110
|
+
if (!_.isEqual(cleanedCurrent, cleanedNew)) {
|
|
111
|
+
this._setColumnsWidth(tableColumnsWidth);
|
|
112
|
+
}
|
|
113
|
+
this._columnsSettings = userSetting;
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
_omitUndefined(arr) {
|
|
117
|
+
return _.map(arr ?? [], (obj) => _.omitBy(obj, _.isUndefined));
|
|
118
|
+
}
|
|
119
|
+
_setColumnsWidth(columnsWidth) {
|
|
120
|
+
const thsWidthMap = new Map(columnsWidth?.map(({ name, width }) => [name, width]));
|
|
121
|
+
this.columnsData = this.columnsData.map((col) => {
|
|
122
|
+
const defaultWidth = this._defaultColumnsWidths.get(col.name);
|
|
123
|
+
const currentWidth = thsWidthMap.has(col.name) ? thsWidthMap.get(col.name) : null;
|
|
124
|
+
const width = currentWidth === null ? defaultWidth : currentWidth;
|
|
125
|
+
return {
|
|
126
|
+
...col,
|
|
127
|
+
width,
|
|
128
|
+
};
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
_fetchSavedPageRowsLimit() {
|
|
132
|
+
this.settingsService
|
|
133
|
+
.fetchUserSettings$({
|
|
134
|
+
id_user: {
|
|
135
|
+
_eq: this._user.id,
|
|
136
|
+
},
|
|
137
|
+
settings_type: {
|
|
138
|
+
_eq: SETTINGS_TYPE.REGISTER_PAGE_ROWS_LIMIT,
|
|
139
|
+
},
|
|
140
|
+
module_name: {
|
|
141
|
+
_eq: this._modulePath,
|
|
142
|
+
},
|
|
143
|
+
}, true)
|
|
144
|
+
.subscribe(([firstSetting]) => {
|
|
145
|
+
this._pageRowsLimitSetting = firstSetting;
|
|
146
|
+
const { pageRowsLimit } = firstSetting?.settings ?? {};
|
|
147
|
+
this.stateService.setLimit(pageRowsLimit ?? DEFAULT_LIMIT);
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
ngOnInit() {
|
|
151
|
+
this.filtersForm = this.buildForm;
|
|
152
|
+
this.filtersService.init(this.filtersForm);
|
|
153
|
+
this.stateService.setState({ state: EInputsState.HIDDEN, action: EInputsAction.OPEN });
|
|
154
|
+
this.fetchTotalObjects(this.baseFilter(this._user));
|
|
155
|
+
this._subscribeOnMutationCompleted();
|
|
156
|
+
this.subscribeOnPaging();
|
|
157
|
+
// TODO проверить нужна ли Перезагрузка страницы
|
|
158
|
+
// if (this.navigationService.previousUrl === null) {
|
|
159
|
+
// this.stateService.setOffset(0);
|
|
160
|
+
// this.stateService.setPage(1);
|
|
161
|
+
// }
|
|
162
|
+
this.baseStore?.count$?.subscribe((count) => {
|
|
163
|
+
this.dataCount = count;
|
|
164
|
+
this.stateService.setCount(count);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
ngAfterViewInit(searchLimiter = 2) {
|
|
168
|
+
this._setFilters();
|
|
169
|
+
this.subscribeOnSearchChanges(searchLimiter);
|
|
170
|
+
}
|
|
171
|
+
_setFilters() {
|
|
172
|
+
const queryFilters = this.transmitter?.filters;
|
|
173
|
+
const querySearch = this.transmitter?.search;
|
|
174
|
+
let filters;
|
|
175
|
+
if (querySearch) {
|
|
176
|
+
this.searchInput.setValue(querySearch);
|
|
177
|
+
}
|
|
178
|
+
if (!queryFilters || queryFilters.length > 0) {
|
|
179
|
+
filters = queryFilters || [];
|
|
180
|
+
}
|
|
181
|
+
this.applyBaseFilter();
|
|
182
|
+
this._initDefaultFilter(filters);
|
|
183
|
+
}
|
|
184
|
+
applyBaseFilter(_data) { }
|
|
185
|
+
ngOnDestroy() {
|
|
186
|
+
this.actionCompleted$.complete();
|
|
187
|
+
this.selectedRecordsLoading$.complete();
|
|
188
|
+
this.filtersService.clear();
|
|
189
|
+
this.stateService.setOffset(0);
|
|
190
|
+
this.stateService.setGqlValues({});
|
|
191
|
+
if (this.searchInput?.value) {
|
|
192
|
+
this.stateService.setSearchFilterValue('');
|
|
193
|
+
this.stateService.setGqlValues(this.filtersService.gqlFilter);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
applyFilters(filters) {
|
|
197
|
+
this.filtersService.setUserSettingsFilterValues(filters);
|
|
198
|
+
this.stateService.setGqlValues(this.filtersService.gqlFilter);
|
|
199
|
+
}
|
|
200
|
+
setData(data, count) {
|
|
201
|
+
this.data = data;
|
|
202
|
+
if (count !== undefined) {
|
|
203
|
+
this.dataCount = count;
|
|
204
|
+
this.stateService.setCount(count);
|
|
205
|
+
}
|
|
206
|
+
this.cdr.markForCheck();
|
|
207
|
+
}
|
|
208
|
+
updateAllStateObjectsByState(state) {
|
|
209
|
+
this.selectedService?.setAllStateObjectsByState(state);
|
|
210
|
+
}
|
|
211
|
+
updateStateObjectByKey(key, updates) {
|
|
212
|
+
this.selectedService?.setStateObjectByKey(key, updates);
|
|
213
|
+
}
|
|
214
|
+
clearSelections(data) {
|
|
215
|
+
this.selectedIds.clear();
|
|
216
|
+
this.selectedObjects.clear();
|
|
217
|
+
if (this.selectedService) {
|
|
218
|
+
this.selectedService?.resetState(data);
|
|
219
|
+
this.buildActions({
|
|
220
|
+
row: [],
|
|
221
|
+
count: 0,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
actionCompleted() {
|
|
226
|
+
const filter = this.buildFilter(this.limit, this.offset, this._filterState);
|
|
227
|
+
this.currentFilter = filter;
|
|
228
|
+
this.clearSelections();
|
|
229
|
+
this.objectsSubscription({ filter });
|
|
230
|
+
}
|
|
231
|
+
buildActions(_data) { }
|
|
232
|
+
subscribeOnSearchChanges(limiter) {
|
|
233
|
+
this.searchInput?.valueChanges
|
|
234
|
+
.pipe(rxjsFilter((value) => !value || value.length > limiter), debounceTime(SEARCH_INPUT_DEBOUNCE_TIME_MLS), takeUntilDestroyed(this.destroyRef))
|
|
235
|
+
.subscribe(() => {
|
|
236
|
+
this.stateService.setGqlValues(this.filtersService.gqlFilter);
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
updateRegister() {
|
|
240
|
+
this.stateService.setLimit(this.stateService.limit);
|
|
241
|
+
}
|
|
242
|
+
subscribeOnPaging() {
|
|
243
|
+
this._defaultFilterApplied$
|
|
244
|
+
.pipe(take(1), switchMap(() => combineLatest([
|
|
245
|
+
this.stateService.limit$.pipe(rxjsFilter(isNonNull)),
|
|
246
|
+
this.stateService.offset$,
|
|
247
|
+
this.stateService.gqlValues$.pipe(tap((data) => {
|
|
248
|
+
if (Number(data.length) > 0) {
|
|
249
|
+
this.selectChanged(null);
|
|
250
|
+
}
|
|
251
|
+
})),
|
|
252
|
+
this.stateService.sorter$,
|
|
253
|
+
]).pipe(debounceTime(250))), catchError((e) => {
|
|
254
|
+
console.error('pagination', e);
|
|
255
|
+
return throwError(() => new Error(e));
|
|
256
|
+
}), takeUntilDestroyed(this.destroyRef))
|
|
257
|
+
.subscribe(([limit, offset, gqlFilter, sorter]) => {
|
|
258
|
+
const filter = this.buildFilter(limit, offset, gqlFilter, sorter);
|
|
259
|
+
const gqlFilterUpdated = !_.isEqual(this._filterState, gqlFilter);
|
|
260
|
+
this.currentFilter = filter;
|
|
261
|
+
this._filterState = gqlFilter;
|
|
262
|
+
this._limit = limit;
|
|
263
|
+
this._offset = offset;
|
|
264
|
+
if (this.stateObjects) {
|
|
265
|
+
if (gqlFilterUpdated) {
|
|
266
|
+
this.selectedService?.resetState();
|
|
267
|
+
}
|
|
268
|
+
this.objectsSubscription({ filter, callback: this._setStateObjects.bind(this) });
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
this.objectsSubscription({ filter });
|
|
272
|
+
}
|
|
273
|
+
this.fetchTotalFilteredObjects?.(filter.where);
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
_setStateObjects(data) {
|
|
277
|
+
this.selectedService?.loadStateObjects(data);
|
|
278
|
+
}
|
|
279
|
+
selectChanged(value) {
|
|
280
|
+
this._selectionType$.next(value);
|
|
281
|
+
const stateObjects = this.stateObjects;
|
|
282
|
+
if (stateObjects) {
|
|
283
|
+
this._changeStateObjects(stateObjects(), value);
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
const filter = this._selectChangedFilter(value);
|
|
287
|
+
this.currentFilter = filter;
|
|
288
|
+
this.buildActions({
|
|
289
|
+
row: [...(this.selectedObjects ?? [])],
|
|
290
|
+
count: this.selectedObjects ? this.selectedObjects.size : 0,
|
|
291
|
+
});
|
|
292
|
+
if (!filter) {
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
this.selectedRecordsLoading$.next(true);
|
|
296
|
+
this.objectsSubscription({
|
|
297
|
+
filter,
|
|
298
|
+
callback: this._setSelected.bind(this),
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
_changeStateObjects(stateObjects, value) {
|
|
302
|
+
if (value === SelectionTypes.ALL) {
|
|
303
|
+
this.updateAllStateObjectsByState(ERegisterObjectState.SELECTED);
|
|
304
|
+
}
|
|
305
|
+
else if (value === SelectionTypes.INVERSE) {
|
|
306
|
+
this._inverseStateObjects(stateObjects);
|
|
307
|
+
}
|
|
308
|
+
else if (value === SelectionTypes.VISIBLE) {
|
|
309
|
+
this._selectVisibleStateObjects();
|
|
310
|
+
}
|
|
311
|
+
else if (typeof value === 'number') {
|
|
312
|
+
this._selectFirstNStateObjects(value);
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
this.clearSelections(this.data);
|
|
316
|
+
}
|
|
317
|
+
this.buildActions({
|
|
318
|
+
row: [...this.selectedObjectsFromState],
|
|
319
|
+
count: this.selectedObjectsFromState.size,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
_inverseStateObjects(stateObjects) {
|
|
323
|
+
for (const [key, { state }] of stateObjects) {
|
|
324
|
+
const inverseState = state === ERegisterObjectState.SELECTED
|
|
325
|
+
? ERegisterObjectState.UNSELECTED
|
|
326
|
+
: ERegisterObjectState.SELECTED;
|
|
327
|
+
this.updateStateObjectByKey(key, { state: inverseState });
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
_selectVisibleStateObjects() {
|
|
331
|
+
this.updateAllStateObjectsByState(ERegisterObjectState.UNSELECTED);
|
|
332
|
+
for (const visibleObject of this.visibleData) {
|
|
333
|
+
this.updateStateObjectByKey(visibleObject.id, { state: ERegisterObjectState.SELECTED });
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
_selectFirstNStateObjects(value) {
|
|
337
|
+
this.updateAllStateObjectsByState(ERegisterObjectState.UNSELECTED);
|
|
338
|
+
if (value > this.limit) {
|
|
339
|
+
const { sorter } = this.stateService;
|
|
340
|
+
const filter = this.buildFilter(value, this.offset, this._filterState, sorter.length > 0 ? sorter : undefined);
|
|
341
|
+
this.objectsSubscription({
|
|
342
|
+
filter,
|
|
343
|
+
callback: this._selectFirstNLoadingObjects.bind(this),
|
|
344
|
+
noSet: true,
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
const firstNObjects = this.data.slice(0, value);
|
|
349
|
+
this._selectFirstNLoadingObjects(firstNObjects);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
_selectFirstNLoadingObjects(objects) {
|
|
353
|
+
for (const object of objects) {
|
|
354
|
+
this.updateStateObjectByKey(object.id, { state: ERegisterObjectState.SELECTED, object });
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
filterToggle() {
|
|
358
|
+
this.stateService.toggle();
|
|
359
|
+
}
|
|
360
|
+
onPaginatorChange(paginatorChange) {
|
|
361
|
+
const { rows, first, page } = paginatorChange;
|
|
362
|
+
if (this.stateService.limit !== rows) {
|
|
363
|
+
this.stateService.setLimit(rows);
|
|
364
|
+
this._savePageRowsLimit(rows);
|
|
365
|
+
}
|
|
366
|
+
if (this.stateService.offset !== first - 1) {
|
|
367
|
+
this.stateService.setOffset(first - 1);
|
|
368
|
+
}
|
|
369
|
+
if (this.stateService.page !== page) {
|
|
370
|
+
this.stateService.setPage(page);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
_savePageRowsLimit(pageRowsLimit) {
|
|
374
|
+
this.settingsService
|
|
375
|
+
.upsertReturningOne$(SETTINGS_TYPE.REGISTER_PAGE_ROWS_LIMIT)
|
|
376
|
+
.subscribe((setting) => {
|
|
377
|
+
this._pageRowsLimitSetting = setting || undefined;
|
|
378
|
+
});
|
|
379
|
+
this.settingsService.upsertUserSettingsByUserId({
|
|
380
|
+
settings: {
|
|
381
|
+
id: this._pageRowsLimitSetting?.id,
|
|
382
|
+
settings_type: SETTINGS_TYPE.REGISTER_PAGE_ROWS_LIMIT,
|
|
383
|
+
module_name: this._modulePath,
|
|
384
|
+
settings: { pageRowsLimit },
|
|
385
|
+
},
|
|
386
|
+
hidden: true,
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
updateColumnSettings({ settings }) {
|
|
390
|
+
if (settings) {
|
|
391
|
+
this.stickyLeftIds = this._getColumnIdsRecursive(settings.stickyLeft);
|
|
392
|
+
this.stickyRightIds = this._getColumnIdsRecursive(settings.stickyRight, (el) => el.status === EColumnStatus.DEFAULT);
|
|
393
|
+
this.columns = [
|
|
394
|
+
...this.stickyLeftIds,
|
|
395
|
+
...this._getColumnIdsRecursive(settings.columns, (el) => el.status === EColumnStatus.DEFAULT),
|
|
396
|
+
...this.stickyRightIds,
|
|
397
|
+
];
|
|
398
|
+
}
|
|
399
|
+
this.cdr.markForCheck();
|
|
400
|
+
}
|
|
401
|
+
_getColumnIdsRecursive(columns, predicate) {
|
|
402
|
+
const filteredColumns = predicate
|
|
403
|
+
? columns.filter((col, index, array) => predicate(col, index, array))
|
|
404
|
+
: columns;
|
|
405
|
+
return filteredColumns.flatMap((column) => {
|
|
406
|
+
const { id, children } = column;
|
|
407
|
+
if (children) {
|
|
408
|
+
return [id, ...this._getColumnIdsRecursive(children, predicate)];
|
|
409
|
+
}
|
|
410
|
+
return [id];
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
updateSort(sort) {
|
|
414
|
+
this.stateService.setSorter(sort);
|
|
415
|
+
}
|
|
416
|
+
saveThsWidthToUserSettings(tableColumnsWidth) {
|
|
417
|
+
const settings = this._columnsSettings;
|
|
418
|
+
if (settings) {
|
|
419
|
+
settings.settings.tableColumnsWidth = tableColumnsWidth;
|
|
420
|
+
}
|
|
421
|
+
this.settingsService.upsertUserSettingsByUserId({
|
|
422
|
+
settings: {
|
|
423
|
+
id: this._columnsSettings?.id,
|
|
424
|
+
settings_type: SETTINGS_TYPE.COLUMNS,
|
|
425
|
+
module_name: this._modulePath,
|
|
426
|
+
settings: { ...this._columnsSettings?.settings, tableColumnsWidth },
|
|
427
|
+
},
|
|
428
|
+
hidden: true,
|
|
429
|
+
updateSettings: true,
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
get filtersAreOpened() {
|
|
433
|
+
return this.stateService.state.state !== EInputsState.HIDDEN;
|
|
434
|
+
}
|
|
435
|
+
_subscribeOnMutationCompleted() {
|
|
436
|
+
this.actionCompleted$
|
|
437
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
438
|
+
.subscribe(() => this.actionCompleted());
|
|
439
|
+
}
|
|
440
|
+
_initDefaultFilter(queryFilters) {
|
|
441
|
+
this.settingsService
|
|
442
|
+
.fetchUserSettings$({
|
|
443
|
+
id_user: {
|
|
444
|
+
_eq: this._user.id,
|
|
445
|
+
},
|
|
446
|
+
settings_type: {
|
|
447
|
+
_in: [SETTINGS_TYPE.FILTER, SETTINGS_TYPE.REGISTER_PINNED_INPUTS],
|
|
448
|
+
},
|
|
449
|
+
module_name: {
|
|
450
|
+
_eq: this._modulePath,
|
|
451
|
+
},
|
|
452
|
+
})
|
|
453
|
+
.pipe(take(1))
|
|
454
|
+
.subscribe((userSettings) => {
|
|
455
|
+
const pinnedFilter = userSettings.find(({ settings_type: type }) => type === SETTINGS_TYPE.REGISTER_PINNED_INPUTS);
|
|
456
|
+
const isPinned = !!pinnedFilter?.settings.pinned;
|
|
457
|
+
const favoriteFilter = userSettings.find(({ settings }) => settings.favorite);
|
|
458
|
+
if (isPinned) {
|
|
459
|
+
this.stateService.setPin(true);
|
|
460
|
+
this.stateService.setState({
|
|
461
|
+
state: EInputsState.FILTER_LIST,
|
|
462
|
+
action: EInputsAction.APPLY_SAVED_FILTER,
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
if (queryFilters || this.searchInput?.getRawValue()) {
|
|
466
|
+
this.applyFilters(queryFilters ?? []);
|
|
467
|
+
}
|
|
468
|
+
else if (pinnedFilter && isPinned) {
|
|
469
|
+
this._applyFilterSettings(pinnedFilter);
|
|
470
|
+
}
|
|
471
|
+
else if (favoriteFilter) {
|
|
472
|
+
this._applyFilterSettings(favoriteFilter);
|
|
473
|
+
}
|
|
474
|
+
this._defaultFilterApplied$.next(true);
|
|
475
|
+
});
|
|
476
|
+
}
|
|
477
|
+
_applyFilterSettings(settings) {
|
|
478
|
+
this.filtersService.setUserSettingsFilterValues(settings.settings.filter ?? []);
|
|
479
|
+
const { gqlFilter } = this.filtersService;
|
|
480
|
+
this.stateService.setGqlValues(gqlFilter);
|
|
481
|
+
this.stateService.setState({
|
|
482
|
+
state: EInputsState.HIDDEN,
|
|
483
|
+
action: EInputsAction.APPLY_SAVED_FILTER,
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
_selectChangedFilter(selection) {
|
|
487
|
+
let filter = null;
|
|
488
|
+
if (selection === null) {
|
|
489
|
+
this.clearSelections();
|
|
490
|
+
return;
|
|
491
|
+
}
|
|
492
|
+
if (selection === SelectionTypes.ALL || typeof selection === 'number') {
|
|
493
|
+
filter = this._handleAllOrNumberSelection(selection);
|
|
494
|
+
}
|
|
495
|
+
else if (selection === SelectionTypes.VISIBLE) {
|
|
496
|
+
this._selectVisibleItems();
|
|
497
|
+
}
|
|
498
|
+
else if (selection === SelectionTypes.INVERSE) {
|
|
499
|
+
filter = this._handleInverseSelection();
|
|
500
|
+
}
|
|
501
|
+
return filter;
|
|
502
|
+
}
|
|
503
|
+
_handleAllOrNumberSelection(selection) {
|
|
504
|
+
let filter = null;
|
|
505
|
+
const { sorter } = this.stateService;
|
|
506
|
+
if (selection === SelectionTypes.ALL) {
|
|
507
|
+
filter = this.buildFilter(undefined, undefined, this._filterState);
|
|
508
|
+
}
|
|
509
|
+
else if (typeof selection === 'number') {
|
|
510
|
+
if (selection > this.limit) {
|
|
511
|
+
filter = this.buildFilter(selection, 0, this._filterState, sorter.length > 0 ? sorter : undefined);
|
|
512
|
+
}
|
|
513
|
+
else {
|
|
514
|
+
this._selectFirstNItems(selection);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
return filter;
|
|
518
|
+
}
|
|
519
|
+
_selectFirstNItems(count) {
|
|
520
|
+
this.selectedObjects = new Set(this.data.slice(0, count));
|
|
521
|
+
this.selectedIds = new Set(this.data.map((d) => d.id).slice(0, count));
|
|
522
|
+
}
|
|
523
|
+
_selectVisibleItems() {
|
|
524
|
+
this.selectedObjects = new Set(this.visibleData);
|
|
525
|
+
this.selectedIds = new Set(this.visibleData.map((d) => d.id));
|
|
526
|
+
}
|
|
527
|
+
_handleInverseSelection() {
|
|
528
|
+
const inverseFilter = { id: { _nin: [...this.selectedIds] } };
|
|
529
|
+
const updatedFilterState = Array.isArray(this._filterState)
|
|
530
|
+
? [...this._filterState, inverseFilter]
|
|
531
|
+
: [this._filterState, inverseFilter];
|
|
532
|
+
return this.buildFilter(undefined, undefined, updatedFilterState);
|
|
533
|
+
}
|
|
534
|
+
_setSelected(data) {
|
|
535
|
+
this.selectedObjects = new Set(data);
|
|
536
|
+
this.selectedIds = new Set(data.map((d) => d.id));
|
|
537
|
+
this.selectedRecordsLoading$.next(false);
|
|
538
|
+
}
|
|
539
|
+
parseToFilters(input) {
|
|
540
|
+
return Object.entries(input).map(([key, value]) => ({
|
|
541
|
+
id: key,
|
|
542
|
+
value,
|
|
543
|
+
}));
|
|
544
|
+
}
|
|
545
|
+
get selectedCount() {
|
|
546
|
+
const selectedSize = this.selectedService?.selectedValues()?.size ?? null;
|
|
547
|
+
const unselectedSize = this.selectedService?.unselectedValues()?.size ?? 0;
|
|
548
|
+
const unfetchedObjects = this.selectedService?.stateUnfetchedObjects();
|
|
549
|
+
const isNotSelected = unfetchedObjects !== ERegisterObjectState.SELECTED;
|
|
550
|
+
if (selectedSize === null) {
|
|
551
|
+
return this.selectedIds.size;
|
|
552
|
+
}
|
|
553
|
+
return isNotSelected ? selectedSize : this.dataCount - unselectedSize;
|
|
554
|
+
}
|
|
555
|
+
_getDefaultColumnsRecursive(columnsData) {
|
|
556
|
+
return columnsData.flatMap((column) => {
|
|
557
|
+
const { name, children } = column;
|
|
558
|
+
if (children) {
|
|
559
|
+
return [name, ...this._getDefaultColumnsRecursive(children)];
|
|
560
|
+
}
|
|
561
|
+
return [name];
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
get notAllFetched() {
|
|
565
|
+
const unfetchedState = this.selectedService.stateUnfetchedObjects();
|
|
566
|
+
const allFetched = this.stateObjects().size === this.dataCount;
|
|
567
|
+
return unfetchedState === ERegisterObjectState.SELECTED && !allFetched;
|
|
568
|
+
}
|
|
569
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RegisterBase, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive }); }
|
|
570
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: RegisterBase, ngImport: i0 }); }
|
|
571
|
+
}
|
|
572
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RegisterBase, decorators: [{
|
|
573
|
+
type: Directive
|
|
574
|
+
}], ctorParameters: () => [{ type: i0.Injector }, { type: undefined }] });
|
|
575
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXItYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZWdpc3Rlci1iYXNlL3NyYy9saWIvY29yZS9yZWdpc3Rlci1iYXNlL3JlZ2lzdGVyLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsU0FBUyxFQUNULE1BQU0sR0FJUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUNMLGVBQWUsRUFDZixVQUFVLEVBQ1YsYUFBYSxFQUNiLFlBQVksRUFDWixNQUFNLElBQUksVUFBVSxFQUNwQixHQUFHLEVBRUgsYUFBYSxFQUViLFNBQVMsRUFDVCxJQUFJLEVBQ0osR0FBRyxFQUNILFVBQVUsR0FDWCxNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFDTCxvQkFBb0IsRUFPcEIsYUFBYSxFQUNiLFlBQVksR0FHYixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsYUFBYSxHQUdkLE1BQU0sOERBQThELENBQUM7QUFPdEUsT0FBTyxFQUVMLGNBQWMsR0FDZixNQUFNLDREQUE0RCxDQUFDO0FBQ3BFLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsY0FBYyxFQUNkLHNCQUFzQixFQUN0QiwyQkFBMkIsR0FDNUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsOEJBQThCLEVBQzlCLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsb0JBQW9CLEdBQ3JCLE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENB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QkFDYixPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDL0QsQ0FBQztZQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFjLGFBQWE7UUFDekIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWdCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNyRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBYSxFQUFFLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUM7UUFFaEUsT0FBTyxjQUFjLEtBQUssb0JBQW9CLENBQUMsUUFBUSxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pFLENBQUM7K0dBendCbUIsWUFBWTttR0FBWixZQUFZOzs0RkFBWixZQUFZO2tCQURqQyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIERlc3Ryb3lSZWYsXG4gIERpcmVjdGl2ZSxcbiAgaW5qZWN0LFxuICBJbmplY3RvcixcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY2F0Y2hFcnJvcixcbiAgY29tYmluZUxhdGVzdCxcbiAgZGVib3VuY2VUaW1lLFxuICBmaWx0ZXIgYXMgcnhqc0ZpbHRlcixcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBSZXBsYXlTdWJqZWN0LFxuICBTdWJzY3JpcHRpb24sXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFwLFxuICB0aHJvd0Vycm9yLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIEVSZWdpc3Rlck9iamVjdFN0YXRlLFxuICBJUmVnaXN0ZXJCYXNlLFxuICBJUmVnaXN0ZXJPYmplY3QsXG4gIElUcFVzZXJTZXR0aW5ncyxcbiAgSVRwVXNlclNldHRpbmdzU2V0dGluZ3NGaWx0ZXIsXG4gIE9iamVjdHNTdWJzY3JpcHRpb25Db25maWcsXG4gIElVc2VyUHJvZmlsZSxcbiAgRUlucHV0c0FjdGlvbixcbiAgRUlucHV0c1N0YXRlLFxuICBHcWxGaWVsZCxcbiAgR3FsRmllbGRzLFxufSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge1xuICBFQ29sdW1uU3RhdHVzLFxuICBJQ29sdW1uU2V0dGluZ3MsXG4gIElDb2x1bW5TZXR0aW5nc0NoYW5nZXMsXG59IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvY29sdW1uLXNldHRpbmdzL3R5cGVzL2NvbHVtbi1zZXR0aW5ncy50eXBlcyc7XG5pbXBvcnQge1xuICBJQ29sdW1uRGF0YSxcbiAgSUhhc3VyYVF1ZXJ5RmlsdGVyLFxuICBSZWdpc3RlclRhYmxlQ2VsbFNvcnRlcixcbiAgVGhXaWR0aEVudHJ5LFxufSBmcm9tICcuLi8uLi9jb21wb25lbnRzJztcbmltcG9ydCB7XG4gIEFwcGx5U2VsZWN0aW9uVHlwZXMsXG4gIFNlbGVjdGlvblR5cGVzLFxufSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2NoZWNrYm94LXNlbGVjdG9yL2NoZWNrYm94LXNlbGVjdG9yLnR5cGVzJztcbmltcG9ydCB7XG4gIEZpbHRlcnNTdGF0ZVNlcnZpY2UsXG4gIEZpbHRlcnNTZXJ2aWNlLFxuICBGaWx0ZXJzVHJhbnNtaXRTZXJ2aWNlLFxuICBTZWxlY3RlZE9iamVjdHNTdGF0ZVNlcnZpY2UsXG59IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7XG4gIFNFQVJDSF9JTlBVVF9ERUJPVU5DRV9USU1FX01MUyxcbiAgU0VUVElOR1NfVFlQRSxcbiAgVVNFUl9QUk9GSUxFX0xPQURFUixcbiAgVVNFUl9TRVRUSU5HU19MT0FERVIsXG59IGZyb20gJy4uLy4uL2NvbnN0cy9yZWdpc3Rlci1iYXNlLmNvbnN0cyc7XG5pbXBvcnQgeyBnZXRMYXN0U2VnbWVudE9mUGF0aE5hbWUsIGlzTm9uTnVsbCB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IEZvcm1Hcm91cFdyYXBwZXIgfSBmcm9tICcuLi9mb3JtLWdyb3VwLXdyYXBwZXInO1xuaW1wb3J0IHsgREVGQVVMVF9MSU1JVCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2lucHV0cy1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBTY2FsYXJVVUlEIH0gZnJvbSAnaGFzdXJhJztcbmltcG9ydCB7IFJlZ2lzdGVyQmFzZVN0b3JlIH0gZnJvbSAnLi9yZWdpc3Rlci1iYXNlLnN0b3JlJztcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmVnaXN0ZXJCYXNlPFQgZXh0ZW5kcyBJUmVnaXN0ZXJCYXNlLCBGb3JtID0gYW55PlxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95XG57XG4gIC8qKiDQodC10YDQstC40YHRiyDRg9C/0YDQsNCy0LvQtdC90LjRjyDRhNC40LvRjNGC0YDQsNC80LggKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZpbHRlcnNTZXJ2aWNlID0gaW5qZWN0KEZpbHRlcnNTZXJ2aWNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0YXRlU2VydmljZSA9IGluamVjdChGaWx0ZXJzU3RhdGVTZXJ2aWNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRyYW5zbWl0dGVyID0gaW5qZWN0KEZpbHRlcnNUcmFuc21pdFNlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIC8qKiDQodC10YDQstC40YEg0YPQv9GA0LDQstC70LXQvdC40Y8g0L/QvtC70YzQt9C+0LLQsNGC0LXQu9C10LwgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHVzZXJTZXJ2aWNlID0gaW5qZWN0KFVTRVJfUFJPRklMRV9MT0FERVIpO1xuICAvKiog0KHQtdGA0LLQuNGBINGD0L/RgNCw0LLQu9C10L3QuNGPINC00LDQvdC90YvQvNC4INCyINGA0LXQtdGB0YLRgNC1ICovXG4gIHByb3RlY3RlZCByZWFkb25seSBiYXNlU3RvcmUgPSBpbmplY3QoUmVnaXN0ZXJCYXNlU3RvcmU8VD4sIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIC8vIFRPRE8g0YPQtNCw0LvQuNGC0Ywgb3B0aW9uYWw6IHRydWUg0L/QvtGB0LvQtSDQstGL0L/QvtC70L3QtdC90LjRjyDQt9Cw0LTQsNGH0LggU01BMi0zMTM0XG4gIHByb3RlY3RlZCByZWFkb25seSBzZWxlY3RlZFNlcnZpY2UgPSBpbmplY3QoU2VsZWN0ZWRPYmplY3RzU3RhdGVTZXJ2aWNlPFQ+LCB7XG4gICAgb3B0aW9uYWw6IHRydWUsXG4gIH0pO1xuICAvLyBUT0RPIHByb3RlY3RlZCByZWFkb25seSBuYXZpZ2F0aW9uU2VydmljZSA9IGluamVjdChOYXZpZ2F0aW9uU2VydmljZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NTZXJ2aWNlID0gaW5qZWN0KFVTRVJfU0VUVElOR1NfTE9BREVSKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZmlsdGVyQXBwbGllZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnN0YXRlU2VydmljZS5ncWxWYWx1ZXMkLnBpcGUoXG4gICAgbWFwKChmaWx0ZXIpID0+IE51bWJlcihmaWx0ZXIubGVuZ3RoKSA+IDApXG4gICk7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlJCA9IHRoaXMuc3RhdGVTZXJ2aWNlLnBhZ2UkO1xuICBwdWJsaWMgcmVhZG9ubHkgbGltaXQkID0gdGhpcy5zdGF0ZVNlcnZpY2UubGltaXQkO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0ZWRSZWNvcmRzTG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICBwdWJsaWMgY29sdW1uc0RhdGE6IElDb2x1bW5EYXRhW107XG4gIHB1YmxpYyBjb2x1bW5zOiBzdHJpbmdbXTtcbiAgcHVibGljIGRhdGE6IFRbXSA9IFtdO1xuICBwdWJsaWMgdmlzaWJsZURhdGE6IFRbXSA9IFtdO1xuICBwdWJsaWMgZGF0YUNvdW50ID0gMDtcbiAgLyoqIEBkZXByZWNhdGVkINCY0YHQv9C+0LvRjNC30YPQudGC0LUgc2VsZWN0ZWRPYmplY3RzRnJvbVN0YXRlICovXG4gIHB1YmxpYyBzZWxlY3RlZE9iamVjdHMgPSBuZXcgU2V0PGFueT4oKTtcbiAgLyoqIEBkZXByZWNhdGVkINCY0YHQv9C+0LvRjNC30YPQudGC0LUgc2VsZWN0ZWRJZHNGcm9tU3RhdGUgKi9cbiAgcHVibGljIHNlbGVjdGVkSWRzID0gbmV3IFNldDxTY2FsYXJVVUlEPigpO1xuICBwdWJsaWMgX3VzZXIgPSB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJQcm9maWxlKCk7XG4gIHB1YmxpYyBzdGlja3lMZWZ0SWRzOiBzdHJpbmdbXSA9IFtdO1xuICBwdWJsaWMgc3RpY2t5UmlnaHRJZHM6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyBjdXJyZW50RmlsdGVyOiBJSGFzdXJhUXVlcnlGaWx0ZXI8VD4gfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqINCk0L7RgNC80LAg0YTQuNC70YzRgtGA0L7QslxuICAgKi9cbiAgcHJvdGVjdGVkIGZpbHRlcnNGb3JtITogRm9ybUdyb3VwV3JhcHBlcjxGb3JtPjtcbiAgcHJvdGVjdGVkIGZpbHRlclN0YXRlOiBJVHBVc2VyU2V0dGluZ3NTZXR0aW5nc0ZpbHRlcltdID0gW107XG5cbiAgcHJpdmF0ZSBfbGltaXQhOiBudW1iZXI7XG4gIHByaXZhdGUgX29mZnNldCE6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUhOiBHcWxGaWVsZHM7XG4gIHByaXZhdGUgX21vZHVsZVBhdGggPSBnZXRMYXN0U2VnbWVudE9mUGF0aE5hbWUodGhpcy5yb3V0ZXIudXJsKTtcbiAgcHJpdmF0ZSBfZGVmYXVsdEZpbHRlckFwcGxpZWQkID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgLyoqXG4gICAqINCS0YHQtdCz0L4g0LfQsNC/0LjRgdC10LksINCx0LXQtyDRg9GH0LXRgtCwINGE0LjQu9GM0YLRgNCwXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgdG90YWxOb3RGaWx0ZXJlZCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgLyoqXG4gICAqINCc0LDRgNGI0YDRg9GC0Ysg0LTQu9GPINCx0YDQtdC00LrRgNCw0LzQsdCwXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3Qgcm91dGVzOiBhbnlbXTtcbiAgLyoqXG4gICAqINCa0L7QvdGC0YDQvtC7INGB0YLRgNC+0LrQuCDQv9C+0LjRgdC60LBcbiAgICovXG4gIHB1YmxpYyBzZWFyY2hJbnB1dCA9IHRoaXMuZmlsdGVyc1NlcnZpY2Uuc2VhcmNoSW5wdXQhO1xuICAvKipcbiAgICog0JTQtdC50YHRgtCy0LjQtSDQt9Cw0LLQtdGA0YjQtdC90L5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBhY3Rpb25Db21wbGV0ZWQkOiBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+O1xuICAvKipcbiAgICog0J/QvtC70YPRh9C10L3QuNC1INC+0LHRidC10LPQviDQutC+0LvQuNGH0LXRgdGC0LLQsCDQt9Cw0L/QuNGB0LXQuVxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGZldGNoVG90YWxPYmplY3RzOiAoXG4gICAgb2JzZXJ2YWJsZU9yVmFsdWU6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIGFueT4+XG4gICkgPT4gU3Vic2NyaXB0aW9uO1xuICAvKipcbiAgICog0JfQsNC/0YDQvtGBINC90LAg0LrQvtC70LjRh9C10YHRgtCy0L4g0L7RgtGE0LjQu9GM0YLRgNC+0LLQsNC90L3Ri9GFINC30LDQv9C40YHQtdC5XG4gICAqL1xuICBwdWJsaWMgZmV0Y2hUb3RhbEZpbHRlcmVkT2JqZWN0czpcbiAgICB8ICgob2JzZXJ2YWJsZU9yVmFsdWU6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIGFueT4+KSA9PiBTdWJzY3JpcHRpb24pXG4gICAgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiDQn9C+0LTQv9C40YHQutCwINC90LAg0L/QvtC70YPRh9C10L3QuNC1INCy0YHQtdGFINC+0LHRitC10LrRgtC+0LIg0Lgg0YEg0L7QsdGA0LDRgtC90YvQvCDQstGL0LfQvtCy0L7QvFxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IG9iamVjdHNTdWJzY3JpcHRpb246IChcbiAgICBvYnNlcnZhYmxlT3JWYWx1ZTogT2JqZWN0c1N1YnNjcmlwdGlvbkNvbmZpZzxUPiB8IE9ic2VydmFibGU8T2JqZWN0c1N1YnNjcmlwdGlvbkNvbmZpZzxUPj5cbiAgKSA9PiBTdWJzY3JpcHRpb247XG4gIC8qKlxuICAgKiDQkdCw0LfQvtCy0YvQuSDRhNC40LvRjNGC0YAsINC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgYmFzZUZpbHRlcjogKHVzZXI6IElVc2VyUHJvZmlsZSB8IHVuZGVmaW5lZCkgPT4gUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAvKipcbiAgICog0KHQsdC+0YDQutCwINGE0LjQu9GM0YLRgNCwXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgYnVpbGRGaWx0ZXIoXG4gICAgbGltaXQ/OiBudW1iZXIsXG4gICAgb2Zmc2V0PzogbnVtYmVyLFxuICAgIGdxbEZpbHRlcj86IEdxbEZpZWxkcyxcbiAgICBzb3J0ZXI/OiBSZWdpc3RlclRhYmxlQ2VsbFNvcnRlcjxUPltdXG4gICk6IGFueTtcblxuICAvKipcbiAgICog0KHQsdC+0YDQutCwINGE0LjQu9GM0YLRgNC+0LIg0YDQtdC10YHRgtGA0LBcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXQgYnVpbGRGb3JtKCk6IEZvcm1Hcm91cFdyYXBwZXI8Rm9ybT47XG5cbiAgcHVibGljIGdldCBsaW1pdCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb2Zmc2V0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX29mZnNldDtcbiAgfVxuXG4gIC8qKiBVdWlkJ9GLINCy0YHQtdGFINCy0YvQsdGA0LDQvdC90YvRhSDQuNC70Lgg0LjRgdC60LvRjtGH0LDQtdC80YvRhSDQvtCx0YrQtdC60YLQvtCyINGA0LXQtdGB0YLRgNCwICjQt9Cw0LLQuNGB0LjRgiDQvtGCINGB0L7RgdGC0L7Rj9C90LjRjyDQtdGJ0LUg0L3QtSDQt9Cw0LPRgNGD0LbQtdC90L3Ri9GFINC+0LHRitC10LrRgtC+0LIpICovXG4gIHB1YmxpYyBnZXQgaWRzRnJvbVN0YXRlKCk6IFNldDxTY2FsYXJVVUlEPiB7XG4gICAgY29uc3Qgc2VydmljZTogU2VsZWN0ZWRPYmplY3RzU3RhdGVTZXJ2aWNlPFQ+IHwgbnVsbCA9IHRoaXMuc2VsZWN0ZWRTZXJ2aWNlO1xuXG4gICAgaWYgKCFzZXJ2aWNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlbGVjdGVkT2JqZWN0c1N0YXRlU2VydmljZSDQvdC1INC30LDQv9GA0L7QstCw0LnQttC10L0nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VydmljZS5rZXlzKCk7XG4gIH1cblxuICAvKiog0JLRgdC1INCy0YvQsdGA0LDQvdC90YvQtSB1dWlkJ9GLINGA0LXQtdGB0YLRgNCwICovXG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWRJZHNGcm9tU3RhdGUoKTogU2V0PFNjYWxhclVVSUQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlOiBTZWxlY3RlZE9iamVjdHNTdGF0ZVNlcnZpY2U8VD4gfCBudWxsID0gdGhpcy5zZWxlY3RlZFNlcnZpY2U7XG5cbiAgICBpZiAoIXNlcnZpY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2VsZWN0ZWRPYmplY3RzU3RhdGVTZXJ2aWNlINC90LUg0LfQsNC/0YDQvtCy0LDQudC20LXQvScpO1xuICAgIH1cblxuICAgIHJldHVybiBzZXJ2aWNlLnNlbGVjdGVkS2V5cygpO1xuICB9XG5cbiAgLyoqINCS0YHQtSDQstGL0LHRgNCw0L3QvdGL0LUg0L7QsdGK0LXQutGC0Ysg0YDQtdC10YHRgtGA0LAgKi9cbiAgcHVibGljIGdldCBzZWxlY3RlZE9iamVjdHNGcm9tU3RhdGUoKTogU2V0PFQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlOiBTZWxlY3RlZE9iamVjdHNTdGF0ZVNlcnZpY2U8VD4gfCBudWxsID0gdGhpcy5zZWxlY3RlZFNlcnZpY2U7XG5cbiAgICBpZiAoIXNlcnZpY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2VsZWN0ZWRPYmplY3RzU3RhdGVTZXJ2aWNlINC90LUg0LfQsNC/0YDQvtCy0LDQudC20LXQvScpO1xuICAgIH1cblxuICAgIHJldHVybiBzZXJ2aWNlLnNlbGVjdGVkVmFsdWVzKCk7XG4gIH1cblxuICBwcml2YXRlIF9jb2x1bW5zU2V0dGluZ3M6IElUcFVzZXJTZXR0aW5ncyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfcGFnZVJvd3NMaW1pdFNldHRpbmc6IElUcFVzZXJTZXR0aW5ncyB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kZWZhdWx0Q29sdW1uc1dpZHRoczogTWFwPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9zZWxlY3Rpb25UeXBlJCA9XG4gICAgdGhpcy5zZWxlY3RlZFNlcnZpY2U/LnNlbGVjdGlvblR5cGUkID8/IG5ldyBCZWhhdmlvclN1YmplY3Q8QXBwbHlTZWxlY3Rpb25UeXBlcz4obnVsbCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHN0YXRlT2JqZWN0cyA9IHRoaXMuc2VsZWN0ZWRTZXJ2aWNlPy5zdGF0ZTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGluamVjdG9yOiBJbmplY3RvcixcbiAgICBjb2x1bW5zRGF0YTogSUNvbHVtbkRhdGFbXVxuICApIHtcbiAgICB0aGlzLmNvbHVtbnNEYXRhID0gY29sdW1uc0RhdGE7XG4gICAgdGhpcy5fZGVmYXVsdENvbHVtbnNXaWR0aHMgPSBuZXcgTWFwKGNvbHVtbnNEYXRhLm1hcCgoY29sKSA9PiBbY29sLm5hbWUsIGNvbC53aWR0aF0pKTtcbiAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLl9nZXREZWZhdWx0Q29sdW1uc1JlY3Vyc2l2ZShjb2x1bW5zRGF0YSk7XG4gICAgdGhpcy5fc3Vic2NyaWJlT25TZXR0aW5ncygpO1xuICAgIHRoaXMuX2ZldGNoU2F2ZWRQYWdlUm93c0xpbWl0KCk7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbigpPy5leHRyYXM/LnN0YXRlO1xuICAgIGlmIChzdGF0ZSkge1xuICAgICAgdGhpcy5maWx0ZXJTdGF0ZSA9IHRoaXMucGFyc2VUb0ZpbHRlcnMoc3RhdGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3N1YnNjcmliZU9uU2V0dGluZ3MoKTogdm9pZCB7XG4gICAgdGhpcy5zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MkXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKFt1c2VyU2V0dGluZ10pID0+IHtcbiAgICAgICAgY29uc3QgeyB0YWJsZUNvbHVtbnNXaWR0aCB9ID0gdXNlclNldHRpbmc/LnNldHRpbmdzID8/IHt9O1xuICAgICAgICBjb25zdCB0eXBlID0gdXNlclNldHRpbmc/LnNldHRpbmdzX3R5cGU7XG5cbiAgICAgICAgaWYgKHR5cGUgJiYgdHlwZSAhPT0gU0VUVElOR1NfVFlQRS5DT0xVTU5TKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xlYW5lZEN1cnJlbnQgPSB0aGlzLl9vbWl0VW5kZWZpbmVkKFxuICAgICAgICAgIHRoaXMuX2NvbHVtbnNTZXR0aW5ncz8uc2V0dGluZ3MudGFibGVDb2x1bW5zV2lkdGhcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY2xlYW5lZE5ldyA9IHRoaXMuX29taXRVbmRlZmluZWQodGFibGVDb2x1bW5zV2lkdGgpO1xuXG4gICAgICAgIGlmICghXy5pc0VxdWFsKGNsZWFuZWRDdXJyZW50LCBjbGVhbmVkTmV3KSkge1xuICAgICAgICAgIHRoaXMuX3NldENvbHVtbnNXaWR0aCh0YWJsZUNvbHVtbnNXaWR0aCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jb2x1bW5zU2V0dGluZ3MgPSB1c2VyU2V0dGluZztcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb21pdFVuZGVmaW5lZChhcnI6IFRoV2lkdGhFbnRyeVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIF8ubWFwKGFyciA/PyBbXSwgKG9iaikgPT4gXy5vbWl0Qnkob2JqLCBfLmlzVW5kZWZpbmVkKSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRDb2x1bW5zV2lkdGgoY29sdW1uc1dpZHRoOiBUaFdpZHRoRW50cnlbXSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGNvbnN0IHRoc1dpZHRoTWFwID0gbmV3IE1hcChjb2x1bW5zV2lkdGg/Lm1hcCgoeyBuYW1lLCB3aWR0aCB9KSA9PiBbbmFtZSwgd2lkdGhdKSk7XG5cbiAgICB0aGlzLmNvbHVtbnNEYXRhID0gdGhpcy5jb2x1bW5zRGF0YS5tYXAoKGNvbCkgPT4ge1xuICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gdGhpcy5fZGVmYXVsdENvbHVtbnNXaWR0aHMuZ2V0KGNvbC5uYW1lKSE7XG4gICAgICBjb25zdCBjdXJyZW50V2lkdGggPSB0aHNXaWR0aE1hcC5oYXMoY29sLm5hbWUpID8gdGhzV2lkdGhNYXAuZ2V0KGNvbC5uYW1lKSA6IG51bGw7XG5cbiAgICAgIGNvbnN0IHdpZHRoID0gY3VycmVudFdpZHRoID09PSBudWxsID8gZGVmYXVsdFdpZHRoIDogY3VycmVudFdpZHRoO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb2wsXG4gICAgICAgIHdpZHRoLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZldGNoU2F2ZWRQYWdlUm93c0xpbWl0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0dGluZ3NTZXJ2aWNlXG4gICAgICAuZmV0Y2hVc2VyU2V0dGluZ3MkKFxuICAgICAgICB7XG4gICAgICAgICAgaWRfdXNlcjoge1xuICAgICAgICAgICAgX2VxOiB0aGlzLl91c2VyLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2V0dGluZ3NfdHlwZToge1xuICAgICAgICAgICAgX2VxOiBTRVRUSU5HU19UWVBFLlJFR0lTVEVSX1BBR0VfUk9XU19MSU1JVCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1vZHVsZV9uYW1lOiB7XG4gICAgICAgICAgICBfZXE6IHRoaXMuX21vZHVsZVBhdGgsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoW2ZpcnN0U2V0dGluZ10pID0+IHtcbiAgICAgICAgdGhpcy5fcGFnZVJvd3NMaW1pdFNldHRpbmcgPSBmaXJzdFNldHRpbmc7XG4gICAgICAgIGNvbnN0IHsgcGFnZVJvd3NMaW1pdCB9ID0gZmlyc3RTZXR0aW5nPy5zZXR0aW5ncyA/PyB7fTtcblxuICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRMaW1pdChwYWdlUm93c0xpbWl0ID8/IERFRkFVTFRfTElNSVQpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJzRm9ybSA9IHRoaXMuYnVpbGRGb3JtO1xuICAgIHRoaXMuZmlsdGVyc1NlcnZpY2UuaW5pdCh0aGlzLmZpbHRlcnNGb3JtKTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRTdGF0ZSh7IHN0YXRlOiBFSW5wdXRzU3RhdGUuSElEREVOLCBhY3Rpb246IEVJbnB1dHNBY3Rpb24uT1BFTiB9KTtcblxuICAgIHRoaXMuZmV0Y2hUb3RhbE9iamVjdHModGhpcy5iYXNlRmlsdGVyKHRoaXMuX3VzZXIpKTtcbiAgICB0aGlzLl9zdWJzY3JpYmVPbk11dGF0aW9uQ29tcGxldGVkKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVPblBhZ2luZygpO1xuXG4gICAgLy8gVE9ETyDQv9GA0L7QstC10YDQuNGC0Ywg0L3Rg9C20L3QsCDQu9C4INCf0LXRgNC10LfQsNCz0YDRg9C30LrQsCDRgdGC0YDQsNC90LjRhtGLXG4gICAgLy8gaWYgKHRoaXMubmF2aWdhdGlvblNlcnZpY2UucHJldmlvdXNVcmwgPT09IG51bGwpIHtcbiAgICAvLyAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldE9mZnNldCgwKTtcbiAgICAvLyAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldFBhZ2UoMSk7XG4gICAgLy8gfVxuXG4gICAgdGhpcy5iYXNlU3RvcmU/LmNvdW50JD8uc3Vic2NyaWJlKChjb3VudCkgPT4ge1xuICAgICAgdGhpcy5kYXRhQ291bnQgPSBjb3VudDtcbiAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldENvdW50KGNvdW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoc2VhcmNoTGltaXRlciA9IDIpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXRGaWx0ZXJzKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVPblNlYXJjaENoYW5nZXMoc2VhcmNoTGltaXRlcik7XG4gIH1cblxuICBwcml2YXRlIF9zZXRGaWx0ZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IHF1ZXJ5RmlsdGVycyA9IHRoaXMudHJhbnNtaXR0ZXI/LmZpbHRlcnM7XG4gICAgY29uc3QgcXVlcnlTZWFyY2ggPSB0aGlzLnRyYW5zbWl0dGVyPy5zZWFyY2g7XG4gICAgbGV0IGZpbHRlcnM6IElUcFVzZXJTZXR0aW5nc1NldHRpbmdzRmlsdGVyW10gfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAocXVlcnlTZWFyY2gpIHtcbiAgICAgIHRoaXMuc2VhcmNoSW5wdXQuc2V0VmFsdWUocXVlcnlTZWFyY2gpO1xuICAgIH1cblxuICAgIGlmICghcXVlcnlGaWx0ZXJzIHx8IHF1ZXJ5RmlsdGVycy5sZW5ndGggPiAwKSB7XG4gICAgICBmaWx0ZXJzID0gcXVlcnlGaWx0ZXJzIHx8IFtdO1xuICAgIH1cblxuICAgIHRoaXMuYXBwbHlCYXNlRmlsdGVyKCk7XG4gICAgdGhpcy5faW5pdERlZmF1bHRGaWx0ZXIoZmlsdGVycyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBwbHlCYXNlRmlsdGVyKF9kYXRhPzogYW55KTogdm9pZCB7fVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGlvbkNvbXBsZXRlZCQuY29tcGxldGUoKTtcbiAgICB0aGlzLnNlbGVjdGVkUmVjb3Jkc0xvYWRpbmckLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5maWx0ZXJzU2VydmljZS5jbGVhcigpO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldE9mZnNldCgwKTtcbiAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRHcWxWYWx1ZXMoe30pO1xuXG4gICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQ/LnZhbHVlKSB7XG4gICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRTZWFyY2hGaWx0ZXJWYWx1ZSgnJyk7XG4gICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRHcWxWYWx1ZXModGhpcy5maWx0ZXJzU2VydmljZS5ncWxGaWx0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhcHBseUZpbHRlcnMoZmlsdGVyczogSVRwVXNlclNldHRpbmdzU2V0dGluZ3NGaWx0ZXJbXSk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyc1NlcnZpY2Uuc2V0VXNlclNldHRpbmdzRmlsdGVyVmFsdWVzKGZpbHRlcnMpO1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldEdxbFZhbHVlcyh0aGlzLmZpbHRlcnNTZXJ2aWNlLmdxbEZpbHRlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0RGF0YShkYXRhOiBUW10sIGNvdW50PzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcblxuICAgIGlmIChjb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRhdGFDb3VudCA9IGNvdW50O1xuICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0Q291bnQoY291bnQpO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUFsbFN0YXRlT2JqZWN0c0J5U3RhdGUoc3RhdGU6IEVSZWdpc3Rlck9iamVjdFN0YXRlKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFNlcnZpY2U/LnNldEFsbFN0YXRlT2JqZWN0c0J5U3RhdGUoc3RhdGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVN0YXRlT2JqZWN0QnlLZXkoa2V5OiBTY2FsYXJVVUlELCB1cGRhdGVzOiBQYXJ0aWFsPElSZWdpc3Rlck9iamVjdDxUPj4pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkU2VydmljZT8uc2V0U3RhdGVPYmplY3RCeUtleShrZXksIHVwZGF0ZXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyU2VsZWN0aW9ucyhkYXRhPzogVFtdKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzLmNsZWFyKCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZFNlcnZpY2UpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlPy5yZXNldFN0YXRlKGRhdGEpO1xuICAgICAgdGhpcy5idWlsZEFjdGlvbnMoe1xuICAgICAgICByb3c6IFtdLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhY3Rpb25Db21wbGV0ZWQoKTogdm9pZCB7XG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy5idWlsZEZpbHRlcih0aGlzLmxpbWl0LCB0aGlzLm9mZnNldCwgdGhpcy5fZmlsdGVyU3RhdGUpO1xuICAgIHRoaXMuY3VycmVudEZpbHRlciA9IGZpbHRlcjtcblxuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25zKCk7XG4gICAgdGhpcy5vYmplY3RzU3Vic2NyaXB0aW9uKHsgZmlsdGVyIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkQWN0aW9ucyhfZGF0YTogeyByb3c6IFRbXTsgY291bnQ6IG51bWJlciB9KTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdWJzY3JpYmVPblNlYXJjaENoYW5nZXMobGltaXRlcjogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hJbnB1dD8udmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgcnhqc0ZpbHRlcigodmFsdWUpID0+ICF2YWx1ZSB8fCB2YWx1ZS5sZW5ndGggPiBsaW1pdGVyKSxcbiAgICAgICAgZGVib3VuY2VUaW1lKFNFQVJDSF9JTlBVVF9ERUJPVU5DRV9USU1FX01MUyksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0R3FsVmFsdWVzKHRoaXMuZmlsdGVyc1NlcnZpY2UuZ3FsRmlsdGVyKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVJlZ2lzdGVyKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldExpbWl0KHRoaXMuc3RhdGVTZXJ2aWNlLmxpbWl0KTtcbiAgfVxuXG4gIHB1YmxpYyBzdWJzY3JpYmVPblBhZ2luZygpOiB2b2lkIHtcbiAgICB0aGlzLl9kZWZhdWx0RmlsdGVyQXBwbGllZCRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLmxpbWl0JC5waXBlKHJ4anNGaWx0ZXIoaXNOb25OdWxsKSksXG4gICAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5vZmZzZXQkLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2UuZ3FsVmFsdWVzJC5waXBlKFxuICAgICAgICAgICAgICB0YXAoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoTnVtYmVyKGRhdGEubGVuZ3RoKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0Q2hhbmdlZChudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc29ydGVyJCxcbiAgICAgICAgICBdKS5waXBlKGRlYm91bmNlVGltZSgyNTApKVxuICAgICAgICApLFxuICAgICAgICBjYXRjaEVycm9yKChlKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigncGFnaW5hdGlvbicsIGUpO1xuXG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKGUpKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChbbGltaXQsIG9mZnNldCwgZ3FsRmlsdGVyLCBzb3J0ZXJdKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuYnVpbGRGaWx0ZXIobGltaXQsIG9mZnNldCwgZ3FsRmlsdGVyLCBzb3J0ZXIpO1xuICAgICAgICBjb25zdCBncWxGaWx0ZXJVcGRhdGVkID0gIV8uaXNFcXVhbCh0aGlzLl9maWx0ZXJTdGF0ZSwgZ3FsRmlsdGVyKTtcbiAgICAgICAgdGhpcy5jdXJyZW50RmlsdGVyID0gZmlsdGVyO1xuICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZSA9IGdxbEZpbHRlcjtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fb2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICBpZiAodGhpcy5zdGF0ZU9iamVjdHMpIHtcbiAgICAgICAgICBpZiAoZ3FsRmlsdGVyVXBkYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlcnZpY2U/LnJlc2V0U3RhdGUoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLm9iamVjdHNTdWJzY3JpcHRpb24oeyBmaWx0ZXIsIGNhbGxiYWNrOiB0aGlzLl9zZXRTdGF0ZU9iamVjdHMuYmluZCh0aGlzKSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9iamVjdHNTdWJzY3JpcHRpb24oeyBmaWx0ZXIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mZXRjaFRvdGFsRmlsdGVyZWRPYmplY3RzPy4oZmlsdGVyLndoZXJlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0U3RhdGVPYmplY3RzKGRhdGE6IFRbXSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlPy5sb2FkU3RhdGVPYmplY3RzKGRhdGEpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdENoYW5nZWQodmFsdWU6IEFwcGx5U2VsZWN0aW9uVHlwZXMpOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25UeXBlJC5uZXh0KHZhbHVlKTtcblxuICAgIGNvbnN0IHN0YXRlT2JqZWN0cyA9IHRoaXMuc3RhdGVPYmplY3RzO1xuXG4gICAgaWYgKHN0YXRlT2JqZWN0cykge1xuICAgICAgdGhpcy5fY2hhbmdlU3RhdGVPYmplY3RzKHN0YXRlT2JqZWN0cygpLCB2YWx1ZSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLl9zZWxlY3RDaGFuZ2VkRmlsdGVyKHZhbHVlKTtcbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXIgPSBmaWx0ZXI7XG5cbiAgICB0aGlzLmJ1aWxkQWN0aW9ucyh7XG4gICAgICByb3c6IFsuLi4odGhpcy5zZWxlY3RlZE9iamVjdHMgPz8gW10pXSxcbiAgICAgIGNvdW50OiB0aGlzLnNlbGVjdGVkT2JqZWN0cyA/IHRoaXMuc2VsZWN0ZWRPYmplY3RzLnNpemUgOiAwLFxuICAgIH0pO1xuXG4gICAgaWYgKCFmaWx0ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkUmVjb3Jkc0xvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5vYmplY3RzU3Vic2NyaXB0aW9uKHtcbiAgICAgIGZpbHRlcixcbiAgICAgIGNhbGxiYWNrOiB0aGlzLl9zZXRTZWxlY3RlZC5iaW5kKHRoaXMpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2hhbmdlU3RhdGVPYmplY3RzKFxuICAgIHN0YXRlT2JqZWN0czogTWFwPFNjYWxhclVVSUQsIElSZWdpc3Rlck9iamVjdDxUPj4sXG4gICAgdmFsdWU6IEFwcGx5U2VsZWN0aW9uVHlwZXNcbiAgKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlID09PSBTZWxlY3Rpb25UeXBlcy5BTEwpIHtcbiAgICAgIHRoaXMudXBkYXRlQWxsU3RhdGVPYmplY3RzQnlTdGF0ZShFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRCk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gU2VsZWN0aW9uVHlwZXMuSU5WRVJTRSkge1xuICAgICAgdGhpcy5faW52ZXJzZVN0YXRlT2JqZWN0cyhzdGF0ZU9iamVjdHMpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IFNlbGVjdGlvblR5cGVzLlZJU0lCTEUpIHtcbiAgICAgIHRoaXMuX3NlbGVjdFZpc2libGVTdGF0ZU9iamVjdHMoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuX3NlbGVjdEZpcnN0TlN0YXRlT2JqZWN0cyh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25zKHRoaXMuZGF0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5idWlsZEFjdGlvbnMoe1xuICAgICAgcm93OiBbLi4udGhpcy5zZWxlY3RlZE9iamVjdHNGcm9tU3RhdGVdLFxuICAgICAgY291bnQ6IHRoaXMuc2VsZWN0ZWRPYmplY3RzRnJvbVN0YXRlLnNpemUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pbnZlcnNlU3RhdGVPYmplY3RzKHN0YXRlT2JqZWN0czogTWFwPFNjYWxhclVVSUQsIElSZWdpc3Rlck9iamVjdDxUPj4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHsgc3RhdGUgfV0gb2Ygc3RhdGVPYmplY3RzKSB7XG4gICAgICBjb25zdCBpbnZlcnNlU3RhdGUgPVxuICAgICAgICBzdGF0ZSA9PT0gRVJlZ2lzdGVyT2JqZWN0U3RhdGUuU0VMRUNURURcbiAgICAgICAgICA/IEVSZWdpc3Rlck9iamVjdFN0YXRlLlVOU0VMRUNURURcbiAgICAgICAgICA6IEVSZWdpc3Rlck9iamVjdFN0YXRlLlNFTEVDVEVEO1xuXG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlT2JqZWN0QnlLZXkoa2V5LCB7IHN0YXRlOiBpbnZlcnNlU3RhdGUgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0VmlzaWJsZVN0YXRlT2JqZWN0cygpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUFsbFN0YXRlT2JqZWN0c0J5U3RhdGUoRVJlZ2lzdGVyT2JqZWN0U3RhdGUuVU5TRUxFQ1RFRCk7XG4gICAgZm9yIChjb25zdCB2aXNpYmxlT2JqZWN0IG9mIHRoaXMudmlzaWJsZURhdGEpIHtcbiAgICAgIHRoaXMudXBkYXRlU3RhdGVPYmplY3RCeUtleSh2aXNpYmxlT2JqZWN0LmlkLCB7IHN0YXRlOiBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRCB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3RGaXJzdE5TdGF0ZU9iamVjdHModmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlQWxsU3RhdGVPYmplY3RzQnlTdGF0ZShFUmVnaXN0ZXJPYmplY3RTdGF0ZS5VTlNFTEVDVEVEKTtcblxuICAgIGlmICh2YWx1ZSA+IHRoaXMubGltaXQpIHtcbiAgICAgIGNvbnN0IHsgc29ydGVyIH0gPSB0aGlzLnN0YXRlU2VydmljZTtcbiAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuYnVpbGRGaWx0ZXIoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB0aGlzLm9mZnNldCxcbiAgICAgICAgdGhpcy5fZmlsdGVyU3RhdGUsXG4gICAgICAgIHNvcnRlci5sZW5ndGggPiAwID8gc29ydGVyIDogdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgdGhpcy5vYmplY3RzU3Vic2NyaXB0aW9uKHtcbiAgICAgICAgZmlsdGVyLFxuICAgICAgICBjYWxsYmFjazogdGhpcy5fc2VsZWN0Rmlyc3ROTG9hZGluZ09iamVjdHMuYmluZCh0aGlzKSxcbiAgICAgICAgbm9TZXQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZmlyc3ROT2JqZWN0cyA9IHRoaXMuZGF0YS5zbGljZSgwLCB2YWx1ZSk7XG4gICAgICB0aGlzLl9zZWxlY3RGaXJzdE5Mb2FkaW5nT2JqZWN0cyhmaXJzdE5PYmplY3RzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3RGaXJzdE5Mb2FkaW5nT2JqZWN0cyhvYmplY3RzOiBUW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IG9iamVjdCBvZiBvYmplY3RzKSB7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlT2JqZWN0QnlLZXkob2JqZWN0LmlkLCB7IHN0YXRlOiBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRCwgb2JqZWN0IH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmaWx0ZXJUb2dnbGUoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UudG9nZ2xlKCk7XG4gIH1cblxuICBwdWJsaWMgb25QYWdpbmF0b3JDaGFuZ2UocGFnaW5hdG9yQ2hhbmdlOiB7XG4gICAgZmlyc3Q6IG51bWJlcjtcbiAgICBwYWdlOiBudW1iZXI7XG4gICAgcGFnZXNDb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICByb3dzOiBudW1iZXI7XG4gIH0pOiB2b2lkIHtcbiAgICBjb25zdCB7IHJvd3MsIGZpcnN0LCBwYWdlIH0gPSBwYWdpbmF0b3JDaGFuZ2U7XG5cbiAgICBpZiAodGhpcy5zdGF0ZVNlcnZpY2UubGltaXQgIT09IHJvd3MpIHtcbiAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldExpbWl0KHJvd3MpO1xuICAgICAgdGhpcy5fc2F2ZVBhZ2VSb3dzTGltaXQocm93cyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGVTZXJ2aWNlLm9mZnNldCAhPT0gZmlyc3QgLSAxKSB7XG4gICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRPZmZzZXQoZmlyc3QgLSAxKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZVNlcnZpY2UucGFnZSAhPT0gcGFnZSkge1xuICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0UGFnZShwYWdlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zYXZlUGFnZVJvd3NMaW1pdChwYWdlUm93c0xpbWl0OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNldHRpbmdzU2VydmljZVxuICAgICAgLnVwc2VydFJldHVybmluZ09uZSQoU0VUVElOR1NfVFlQRS5SRUdJU1RFUl9QQUdFX1JPV1NfTElNSVQpXG4gICAgICAuc3Vic2NyaWJlKChzZXR0aW5nKSA9PiB7XG4gICAgICAgIHRoaXMuX3BhZ2VSb3dzTGltaXRTZXR0aW5nID0gc2V0dGluZyB8fCB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB0aGlzLnNldHRpbmdzU2VydmljZS51cHNlcnRVc2VyU2V0dGluZ3NCeVVzZXJJZCh7XG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICBpZDogdGhpcy5fcGFnZVJvd3NMaW1pdFNldHRpbmc/LmlkLFxuICAgICAgICBzZXR0aW5nc190eXBlOiBTRVRUSU5HU19UWVBFLlJFR0lTVEVSX1BBR0VfUk9XU19MSU1JVCxcbiAgICAgICAgbW9kdWxlX25hbWU6IHRoaXMuX21vZHVsZVBhdGgsXG4gICAgICAgIHNldHRpbmdzOiB7IHBhZ2VSb3dzTGltaXQgfSxcbiAgICAgIH0sXG4gICAgICBoaWRkZW46IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ29sdW1uU2V0dGluZ3MoeyBzZXR0aW5ncyB9OiBJQ29sdW1uU2V0dGluZ3NDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKHNldHRpbmdzKSB7XG4gICAgICB0aGlzLnN0aWNreUxlZnRJZHMgPSB0aGlzLl9nZXRDb2x1bW5JZHNSZWN1cnNpdmUoc2V0dGluZ3Muc3RpY2t5TGVmdCk7XG4gICAgICB0aGlzLnN0aWNreVJpZ2h0SWRzID0gdGhpcy5fZ2V0Q29sdW1uSWRzUmVjdXJzaXZlKFxuICAgICAgICBzZXR0aW5ncy5zdGlja3lSaWdodCxcbiAgICAgICAgKGVsKSA9PiBlbC5zdGF0dXMgPT09IEVDb2x1bW5TdGF0dXMuREVGQVVMVFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29sdW1ucyA9IFtcbiAgICAgICAgLi4udGhpcy5zdGlja3lMZWZ0SWRzLFxuICAgICAgICAuLi50aGlzLl9nZXRDb2x1bW5JZHNSZWN1cnNpdmUoXG4gICAgICAgICAgc2V0dGluZ3MuY29sdW1ucyxcbiAgICAgICAgICAoZWwpID0+IGVsLnN0YXR1cyA9PT0gRUNvbHVtblN0YXR1cy5ERUZBVUxUXG4gICAgICAgICksXG4gICAgICAgIC4uLnRoaXMuc3RpY2t5UmlnaHRJZHMsXG4gICAgICBdO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q29sdW1uSWRzUmVjdXJzaXZlKFxuICAgIGNvbHVtbnM6IElDb2x1bW5TZXR0aW5nc1tdLFxuICAgIHByZWRpY2F0ZT86ICh2YWx1ZTogSUNvbHVtblNldHRpbmdzLCBpbmRleDogbnVtYmVyLCBhcnJheTogSUNvbHVtblNldHRpbmdzW10pID0+IHVua25vd25cbiAgKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGZpbHRlcmVkQ29sdW1ucyA9IHByZWRpY2F0ZVxuICAgICAgPyBjb2x1bW5zLmZpbHRlcigoY29sLCBpbmRleCwgYXJyYXkpID0+IHByZWRpY2F0ZShjb2wsIGluZGV4LCBhcnJheSkpXG4gICAgICA6IGNvbHVtbnM7XG5cbiAgICByZXR1cm4gZmlsdGVyZWRDb2x1bW5zLmZsYXRNYXAoKGNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgeyBpZCwgY2hpbGRyZW4gfSA9IGNvbHVtbjtcblxuICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgIHJldHVybiBbaWQsIC4uLnRoaXMuX2dldENvbHVtbklkc1JlY3Vyc2l2ZShjaGlsZHJlbiwgcHJlZGljYXRlKV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbaWRdO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVNvcnQoc29ydDogUmVnaXN0ZXJUYWJsZUNlbGxTb3J0ZXI8YW55PltdKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0U29ydGVyKHNvcnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNhdmVUaHNXaWR0aFRvVXNlclNldHRpbmdzKHRhYmxlQ29sdW1uc1dpZHRoOiBUaFdpZHRoRW50cnlbXSk6IHZvaWQge1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5fY29sdW1uc1NldHRpbmdzO1xuICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgc2V0dGluZ3Muc2V0dGluZ3MudGFibGVDb2x1bW5zV2lkdGggPSB0YWJsZUNvbHVtbnNXaWR0aDtcbiAgICB9XG5cbiAgICB0aGlzLnNldHRpbmdzU2VydmljZS51cHNlcnRVc2VyU2V0dGluZ3NCeVVzZXJJZCh7XG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICBpZDogdGhpcy5fY29sdW1uc1NldHRpbmdzPy5pZCxcbiAgICAgICAgc2V0dGluZ3NfdHlwZTogU0VUVElOR1NfVFlQRS5DT0xVTU5TLFxuICAgICAgICBtb2R1bGVfbmFtZTogdGhpcy5fbW9kdWxlUGF0aCxcbiAgICAgICAgc2V0dGluZ3M6IHsgLi4udGhpcy5fY29sdW1uc1NldHRpbmdzPy5zZXR0aW5ncywgdGFibGVDb2x1bW5zV2lkdGggfSxcbiAgICAgIH0sXG4gICAgICBoaWRkZW46IHRydWUsXG4gICAgICB1cGRhdGVTZXR0aW5nczogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgZmlsdGVyc0FyZU9wZW5lZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZVNlcnZpY2Uuc3RhdGUuc3RhdGUgIT09IEVJbnB1dHNTdGF0ZS5ISURERU47XG4gIH1cblxuICBwcml2YXRlIF9zdWJzY3JpYmVPbk11dGF0aW9uQ29tcGxldGVkKCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aW9uQ29tcGxldGVkJFxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuYWN0aW9uQ29tcGxldGVkKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdERlZmF1bHRGaWx0ZXIocXVlcnlGaWx0ZXJzOiBJVHBVc2VyU2V0dGluZ3NTZXR0aW5nc0ZpbHRlcltdIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5zZXR0aW5nc1NlcnZpY2VcbiAgICAgIC5mZXRjaFVzZXJTZXR0aW5ncyQoe1xuICAgICAgICBpZF91c2VyOiB7XG4gICAgICAgICAgX2VxOiB0aGlzLl91c2VyLmlkLFxuICAgICAgICB9LFxuICAgICAgICBzZXR0aW5nc190eXBlOiB7XG4gICAgICAgICAgX2luOiBbU0VUVElOR1NfVFlQRS5GSUxURVIsIFNFVFRJTkdTX1RZUEUuUkVHSVNURVJfUElOTkVEX0lOUFVUU10sXG4gICAgICAgIH0sXG4gICAgICAgIG1vZHVsZV9uYW1lOiB7XG4gICAgICAgICAgX2VxOiB0aGlzLl9tb2R1bGVQYXRoLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCh1c2VyU2V0dGluZ3MpID0+IHtcbiAgICAgICAgY29uc3QgcGlubmVkRmlsdGVyID0gdXNlclNldHRpbmdzLmZpbmQoXG4gICAgICAgICAgKHsgc2V0dGluZ3NfdHlwZTogdHlwZSB9KSA9PiB0eXBlID09PSBTRVRUSU5HU19UWVBFLlJFR0lTVEVSX1BJTk5FRF9JTlBVVFNcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaXNQaW5uZWQgPSAhIXBpbm5lZEZpbHRlcj8uc2V0dGluZ3MucGlubmVkO1xuICAgICAgICBjb25zdCBmYXZvcml0ZUZpbHRlciA9IHVzZXJTZXR0aW5ncy5maW5kKCh7IHNldHRpbmdzIH0pID0+IHNldHRpbmdzLmZhdm9yaXRlKTtcblxuICAgICAgICBpZiAoaXNQaW5uZWQpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5zZXRQaW4odHJ1ZSk7XG4gICAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc3RhdGU6IEVJbnB1dHNTdGF0ZS5GSUxURVJfTElTVCxcbiAgICAgICAgICAgIGFjdGlvbjogRUlucHV0c0FjdGlvbi5BUFBMWV9TQVZFRF9GSUxURVIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocXVlcnlGaWx0ZXJzIHx8IHRoaXMuc2VhcmNoSW5wdXQ/LmdldFJhd1ZhbHVlKCkpIHtcbiAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVycyhxdWVyeUZpbHRlcnMgPz8gW10pO1xuICAgICAgICB9IGVsc2UgaWYgKHBpbm5lZEZpbHRlciAmJiBpc1Bpbm5lZCkge1xuICAgICAgICAgIHRoaXMuX2FwcGx5RmlsdGVyU2V0dGluZ3MocGlubmVkRmlsdGVyKTtcbiAgICAgICAgfSBlbHNlIGlmIChmYXZvcml0ZUZpbHRlcikge1xuICAgICAgICAgIHRoaXMuX2FwcGx5RmlsdGVyU2V0dGluZ3MoZmF2b3JpdGVGaWx0ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZGVmYXVsdEZpbHRlckFwcGxpZWQkLm5leHQodHJ1ZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2FwcGx5RmlsdGVyU2V0dGluZ3Moc2V0dGluZ3M6IElUcFVzZXJTZXR0aW5ncyk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyc1NlcnZpY2Uuc2V0VXNlclNldHRpbmdzRmlsdGVyVmFsdWVzKHNldHRpbmdzLnNldHRpbmdzLmZpbHRlciA/PyBbXSk7XG4gICAgY29uc3QgeyBncWxGaWx0ZXIgfSA9IHRoaXMuZmlsdGVyc1NlcnZpY2U7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0R3FsVmFsdWVzKGdxbEZpbHRlcik7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0U3RhdGUoe1xuICAgICAgc3RhdGU6IEVJbnB1dHNTdGF0ZS5ISURERU4sXG4gICAgICBhY3Rpb246IEVJbnB1dHNBY3Rpb24uQVBQTFlfU0FWRURfRklMVEVSLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0Q2hhbmdlZEZpbHRlcihzZWxlY3Rpb246IEFwcGx5U2VsZWN0aW9uVHlwZXMpOiBhbnkge1xuICAgIGxldCBmaWx0ZXIgPSBudWxsO1xuXG4gICAgaWYgKHNlbGVjdGlvbiA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbnMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2VsZWN0aW9uID09PSBTZWxlY3Rpb25UeXBlcy5BTEwgfHwgdHlwZW9mIHNlbGVjdGlvbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIGZpbHRlciA9IHRoaXMuX2hhbmRsZUFsbE9yTnVtYmVyU2VsZWN0aW9uKHNlbGVjdGlvbik7XG4gICAgfSBlbHNlIGlmIChzZWxlY3Rpb24gPT09IFNlbGVjdGlvblR5cGVzLlZJU0lCTEUpIHtcbiAgICAgIHRoaXMuX3NlbGVjdFZpc2libGVJdGVtcygpO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uID09PSBTZWxlY3Rpb25UeXBlcy5JTlZFUlNFKSB7XG4gICAgICBmaWx0ZXIgPSB0aGlzLl9oYW5kbGVJbnZlcnNlU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbHRlcjtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUFsbE9yTnVtYmVyU2VsZWN0aW9uKHNlbGVjdGlvbjogQXBwbHlTZWxlY3Rpb25UeXBlcyk6IGFueSB7XG4gICAgbGV0IGZpbHRlciA9IG51bGw7XG4gICAgY29uc3QgeyBzb3J0ZXIgfSA9IHRoaXMuc3RhdGVTZXJ2aWNlO1xuXG4gICAgaWYgKHNlbGVjdGlvbiA9PT0gU2VsZWN0aW9uVHlwZXMuQUxMKSB7XG4gICAgICBmaWx0ZXIgPSB0aGlzLmJ1aWxkRmlsdGVyKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0aGlzLl9maWx0ZXJTdGF0ZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc2VsZWN0aW9uID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKHNlbGVjdGlvbiA+IHRoaXMubGltaXQpIHtcbiAgICAgICAgZmlsdGVyID0gdGhpcy5idWlsZEZpbHRlcihcbiAgICAgICAgICBzZWxlY3Rpb24sXG4gICAgICAgICAgMCxcbiAgICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZSxcbiAgICAgICAgICBzb3J0ZXIubGVuZ3RoID4gMCA/IHNvcnRlciA6IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0Rmlyc3ROSXRlbXMoc2VsZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmlsdGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0Rmlyc3ROSXRlbXMoY291bnQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzID0gbmV3IFNldCh0aGlzLmRhdGEuc2xpY2UoMCwgY291bnQpKTtcbiAgICB0aGlzLnNlbGVjdGVkSWRzID0gbmV3IFNldCh0aGlzLmRhdGEubWFwKChkKSA9PiBkLmlkKS5zbGljZSgwLCBjb3VudCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0VmlzaWJsZUl0ZW1zKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzID0gbmV3IFNldCh0aGlzLnZpc2libGVEYXRhKTtcbiAgICB0aGlzLnNlbGVjdGVkSWRzID0gbmV3IFNldCh0aGlzLnZpc2libGVEYXRhLm1hcCgoZCkgPT4gZC5pZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlSW52ZXJzZVNlbGVjdGlvbigpOiBhbnkge1xuICAgIGNvbnN0IGludmVyc2VGaWx0ZXIgPSB7IGlkOiB7IF9uaW46IFsuLi50aGlzLnNlbGVjdGVkSWRzXSB9IH0gYXMgR3FsRmllbGQ7XG4gICAgY29uc3QgdXBkYXRlZEZpbHRlclN0YXRlID0gQXJyYXkuaXNBcnJheSh0aGlzLl9maWx0ZXJTdGF0ZSlcbiAgICAgID8gWy4uLnRoaXMuX2ZpbHRlclN0YXRlLCBpbnZlcnNlRmlsdGVyXVxuICAgICAgOiBbdGhpcy5fZmlsdGVyU3RhdGUsIGludmVyc2VGaWx0ZXJdO1xuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRGaWx0ZXIodW5kZWZpbmVkLCB1bmRlZmluZWQsIHVwZGF0ZWRGaWx0ZXJTdGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRTZWxlY3RlZChkYXRhOiBUW10pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkT2JqZWN0cyA9IG5ldyBTZXQoZGF0YSk7XG4gICAgdGhpcy5zZWxlY3RlZElkcyA9IG5ldyBTZXQoZGF0YS5tYXAoKGQpID0+IGQuaWQpKTtcbiAgICB0aGlzLnNlbGVjdGVkUmVjb3Jkc0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlVG9GaWx0ZXJzKGlucHV0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KTogSVRwVXNlclNldHRpbmdzU2V0dGluZ3NGaWx0ZXJbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGlucHV0KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgIGlkOiBrZXksXG4gICAgICB2YWx1ZSxcbiAgICB9KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHNlbGVjdGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBzZWxlY3RlZFNpemUgPSB0aGlzLnNlbGVjdGVkU2VydmljZT8uc2VsZWN0ZWRWYWx1ZXMoKT8uc2l6ZSA/PyBudWxsO1xuICAgIGNvbnN0IHVuc2VsZWN0ZWRTaXplID0gdGhpcy5zZWxlY3RlZFNlcnZpY2U/LnVuc2VsZWN0ZWRWYWx1ZXMoKT8uc2l6ZSA/PyAwO1xuICAgIGNvbnN0IHVuZmV0Y2hlZE9iamVjdHMgPSB0aGlzLnNlbGVjdGVkU2VydmljZT8uc3RhdGVVbmZldGNoZWRPYmplY3RzKCk7XG4gICAgY29uc3QgaXNOb3RTZWxlY3RlZCA9IHVuZmV0Y2hlZE9iamVjdHMgIT09IEVSZWdpc3Rlck9iamVjdFN0YXRlLlNFTEVDVEVEO1xuXG4gICAgaWYgKHNlbGVjdGVkU2l6ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJZHMuc2l6ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNOb3RTZWxlY3RlZCA/IHNlbGVjdGVkU2l6ZSA6IHRoaXMuZGF0YUNvdW50IC0gdW5zZWxlY3RlZFNpemU7XG4gIH1cblxuICBwcml2YXRlIF9nZXREZWZhdWx0Q29sdW1uc1JlY3Vyc2l2ZShjb2x1bW5zRGF0YTogSUNvbHVtbkRhdGFbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gY29sdW1uc0RhdGEuZmxhdE1hcCgoY29sdW1uKSA9PiB7XG4gICAgICBjb25zdCB7IG5hbWUsIGNoaWxkcmVuIH0gPSBjb2x1bW47XG5cbiAgICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgICByZXR1cm4gW25hbWUsIC4uLnRoaXMuX2dldERlZmF1bHRDb2x1bW5zUmVjdXJzaXZlKGNoaWxkcmVuKV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbbmFtZV07XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IG5vdEFsbEZldGNoZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdW5mZXRjaGVkU3RhdGUgPSB0aGlzLnNlbGVjdGVkU2VydmljZSEuc3RhdGVVbmZldGNoZWRPYmplY3RzKCk7XG4gICAgY29uc3QgYWxsRmV0Y2hlZCA9IHRoaXMuc3RhdGVPYmplY3RzISgpLnNpemUgPT09IHRoaXMuZGF0YUNvdW50O1xuXG4gICAgcmV0dXJuIHVuZmV0Y2hlZFN0YXRlID09PSBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRCAmJiAhYWxsRmV0Y2hlZDtcbiAgfVxufVxuIl19
|