@koobiq/components 18.35.0 → 18.36.0
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/accordion/accordion.component.d.ts +1 -1
- package/app-switcher/_app-switcher-theme.scss +34 -0
- package/app-switcher/app-switcher-animations.d.ts +5 -0
- package/app-switcher/app-switcher-dropdown-app.d.ts +11 -0
- package/app-switcher/app-switcher-dropdown-app.scss +85 -0
- package/app-switcher/app-switcher-dropdown-site.d.ts +9 -0
- package/app-switcher/app-switcher-dropdown-site.scss +53 -0
- package/app-switcher/app-switcher.d.ts +191 -0
- package/app-switcher/app-switcher.module.d.ts +10 -0
- package/app-switcher/app-switcher.scss +64 -0
- package/app-switcher/index.d.ts +1 -0
- package/app-switcher/kbq-app-switcher-list-item.d.ts +16 -0
- package/app-switcher/kbq-app-switcher-list-item.scss +180 -0
- package/app-switcher/public-api.d.ts +6 -0
- package/badge/badge.component.d.ts +1 -1
- package/badge/badge.component.scss +2 -0
- package/breadcrumbs/breadcrumbs.scss +4 -0
- package/button/button.component.d.ts +2 -2
- package/core/common-behaviors/clipboard.d.ts +1 -1
- package/core/common-behaviors/color.d.ts +5 -5
- package/core/common-behaviors/focus-monitor.d.ts +19 -0
- package/core/common-behaviors/hovered.d.ts +13 -0
- package/core/common-behaviors/index.d.ts +4 -0
- package/core/common-behaviors/orientation.d.ts +4 -0
- package/core/common-behaviors/read-state.d.ts +12 -0
- package/core/locales/en-US.d.ts +62 -0
- package/core/locales/es-LA.d.ts +62 -0
- package/core/locales/fa-IR.d.ts +62 -0
- package/core/locales/locale-service.d.ts +434 -0
- package/core/locales/pt-BR.d.ts +62 -0
- package/core/locales/ru-RU.d.ts +62 -0
- package/core/locales/tk-TM.d.ts +62 -0
- package/core/locales/types.d.ts +22 -0
- package/core/locales/zh-CN.d.ts +62 -0
- package/core/navbar/rectangle-item.d.ts +1 -1
- package/core/option/action.d.ts +1 -1
- package/core/option/option.d.ts +1 -1
- package/core/pop-up/constants.d.ts +2 -1
- package/core/pop-up/pop-up-trigger.d.ts +3 -3
- package/core/pop-up/pop-up.d.ts +2 -1
- package/core/select/common.d.ts +3 -0
- package/core/select/constants.d.ts +5 -0
- package/core/styles/common/_select.scss +5 -0
- package/core/utils/dom.d.ts +1 -6
- package/divider/divider.scss +1 -0
- package/dropdown/dropdown.component.d.ts +5 -1
- package/dropdown/dropdown.module.d.ts +1 -1
- package/esm2022/accordion/accordion-content.mjs +3 -3
- package/esm2022/accordion/accordion-header.mjs +3 -3
- package/esm2022/accordion/accordion-item.mjs +3 -3
- package/esm2022/accordion/accordion-trigger.component.mjs +3 -3
- package/esm2022/accordion/accordion.component.mjs +5 -5
- package/esm2022/accordion/accordion.module.mjs +4 -4
- package/esm2022/actions-panel/actions-panel-container.mjs +3 -3
- package/esm2022/actions-panel/actions-panel.mjs +3 -3
- package/esm2022/actions-panel/module.mjs +4 -4
- package/esm2022/alert/alert.component.mjs +12 -12
- package/esm2022/alert/alert.module.mjs +4 -4
- package/esm2022/app-switcher/app-switcher-animations.mjs +18 -0
- package/esm2022/app-switcher/app-switcher-dropdown-app.mjs +75 -0
- package/esm2022/app-switcher/app-switcher-dropdown-site.mjs +60 -0
- package/esm2022/app-switcher/app-switcher.mjs +446 -0
- package/esm2022/app-switcher/app-switcher.module.mjs +45 -0
- package/esm2022/app-switcher/index.mjs +2 -0
- package/esm2022/app-switcher/kbq-app-switcher-list-item.mjs +84 -0
- package/esm2022/app-switcher/koobiq-components-app-switcher.mjs +5 -0
- package/esm2022/app-switcher/public-api.mjs +7 -0
- package/esm2022/autocomplete/autocomplete-origin.directive.mjs +3 -3
- package/esm2022/autocomplete/autocomplete-trigger.directive.mjs +3 -3
- package/esm2022/autocomplete/autocomplete.component.mjs +3 -3
- package/esm2022/autocomplete/autocomplete.module.mjs +4 -4
- package/esm2022/badge/badge.component.mjs +11 -11
- package/esm2022/badge/badge.module.mjs +4 -4
- package/esm2022/breadcrumbs/breadcrumbs.mjs +17 -17
- package/esm2022/breadcrumbs/breadcrumbs.module.mjs +4 -4
- package/esm2022/button/button.component.mjs +7 -7
- package/esm2022/button/button.dropdown-trigger.directive.mjs +3 -3
- package/esm2022/button/button.module.mjs +4 -4
- package/esm2022/button-toggle/button-toggle.component.mjs +6 -6
- package/esm2022/button-toggle/button-toggle.module.mjs +4 -4
- package/esm2022/checkbox/checkbox-module.mjs +4 -4
- package/esm2022/checkbox/checkbox-required-validator.mjs +3 -3
- package/esm2022/checkbox/checkbox.mjs +3 -3
- package/esm2022/clamped-text/clamped-text.mjs +3 -3
- package/esm2022/clamped-text/module.mjs +4 -4
- package/esm2022/code-block/code-block-highlight.mjs +7 -7
- package/esm2022/code-block/code-block.mjs +4 -4
- package/esm2022/code-block/code-block.module.mjs +4 -4
- package/esm2022/content-panel/content-panel.mjs +24 -24
- package/esm2022/content-panel/module.mjs +4 -4
- package/esm2022/content-panel/resizable.mjs +6 -6
- package/esm2022/core/common-behaviors/clipboard.mjs +4 -4
- package/esm2022/core/common-behaviors/color.mjs +6 -7
- package/esm2022/core/common-behaviors/common-module.mjs +4 -4
- package/esm2022/core/common-behaviors/focus-monitor.mjs +37 -0
- package/esm2022/core/common-behaviors/hovered.mjs +31 -0
- package/esm2022/core/common-behaviors/index.mjs +5 -1
- package/esm2022/core/common-behaviors/orientation.mjs +2 -0
- package/esm2022/core/common-behaviors/read-state.mjs +33 -0
- package/esm2022/core/error/error-state-matcher.mjs +9 -9
- package/esm2022/core/form-field/field-sizing-content.mjs +3 -3
- package/esm2022/core/formatters/date/formatter.mjs +3 -3
- package/esm2022/core/formatters/date/formatter.pipe.mjs +78 -78
- package/esm2022/core/formatters/filesize/formatter.mjs +3 -3
- package/esm2022/core/formatters/index.mjs +4 -4
- package/esm2022/core/formatters/number/formatter.mjs +12 -12
- package/esm2022/core/forms/forms-module.mjs +4 -4
- package/esm2022/core/forms/forms.directive.mjs +6 -6
- package/esm2022/core/highlight/highlight.pipe.mjs +3 -3
- package/esm2022/core/highlight/index.mjs +4 -4
- package/esm2022/core/line/line.mjs +7 -7
- package/esm2022/core/locales/en-US.mjs +105 -1
- package/esm2022/core/locales/es-LA.mjs +105 -1
- package/esm2022/core/locales/fa-IR.mjs +75 -1
- package/esm2022/core/locales/locale-service.mjs +3 -3
- package/esm2022/core/locales/locale-service.module.mjs +4 -4
- package/esm2022/core/locales/pt-BR.mjs +105 -1
- package/esm2022/core/locales/ru-RU.mjs +119 -1
- package/esm2022/core/locales/tk-TM.mjs +105 -1
- package/esm2022/core/locales/types.mjs +1 -1
- package/esm2022/core/locales/zh-CN.mjs +63 -1
- package/esm2022/core/navbar/rectangle-item.mjs +7 -6
- package/esm2022/core/option/action-container.mjs +3 -3
- package/esm2022/core/option/action.mjs +4 -4
- package/esm2022/core/option/optgroup.mjs +3 -3
- package/esm2022/core/option/option-module.mjs +4 -4
- package/esm2022/core/option/option.mjs +4 -4
- package/esm2022/core/pop-up/constants.mjs +2 -1
- package/esm2022/core/pop-up/pop-up-trigger.mjs +6 -6
- package/esm2022/core/pop-up/pop-up.mjs +4 -4
- package/esm2022/core/select/common.mjs +27 -17
- package/esm2022/core/select/constants.mjs +6 -1
- package/esm2022/core/selection/pseudo-checkbox/pseudo-checkbox.mjs +3 -3
- package/esm2022/core/selection/pseudo-checkbox/pseudo-checkbox.module.mjs +4 -4
- package/esm2022/core/services/measure-scrollbar.service.mjs +3 -3
- package/esm2022/core/services/theme.service.mjs +3 -3
- package/esm2022/core/utils/dom.mjs +2 -8
- package/esm2022/core/version.mjs +2 -2
- package/esm2022/datepicker/calendar-body.component.mjs +3 -3
- package/esm2022/datepicker/calendar-header.component.mjs +3 -3
- package/esm2022/datepicker/calendar.component.mjs +3 -3
- package/esm2022/datepicker/datepicker-input.directive.mjs +6 -6
- package/esm2022/datepicker/datepicker-intl.mjs +3 -3
- package/esm2022/datepicker/datepicker-module.mjs +4 -4
- package/esm2022/datepicker/datepicker-toggle.component.mjs +9 -9
- package/esm2022/datepicker/datepicker.component.mjs +6 -6
- package/esm2022/datepicker/month-view.component.mjs +3 -3
- package/esm2022/divider/divider.component.mjs +4 -4
- package/esm2022/divider/divider.module.mjs +4 -4
- package/esm2022/dl/dl.component.mjs +9 -9
- package/esm2022/dl/dl.module.mjs +4 -4
- package/esm2022/dropdown/dropdown-content.directive.mjs +3 -3
- package/esm2022/dropdown/dropdown-item.component.mjs +3 -3
- package/esm2022/dropdown/dropdown-trigger.directive.mjs +5 -5
- package/esm2022/dropdown/dropdown.component.mjs +18 -8
- package/esm2022/dropdown/dropdown.module.mjs +14 -10
- package/esm2022/dynamic-translation/dynamic-translation.mjs +9 -9
- package/esm2022/dynamic-translation/module.mjs +4 -4
- package/esm2022/ellipsis-center/ellipsis-center.directive.mjs +7 -7
- package/esm2022/empty-state/empty-state.component.mjs +15 -15
- package/esm2022/empty-state/empty-state.module.mjs +4 -4
- package/esm2022/file-upload/file-drop.mjs +3 -3
- package/esm2022/file-upload/file-upload.mjs +1 -1
- package/esm2022/file-upload/file-upload.module.mjs +4 -4
- package/esm2022/file-upload/multiple-file-upload.component.mjs +19 -8
- package/esm2022/file-upload/single-file-upload.component.mjs +13 -5
- package/esm2022/filter-bar/filter-bar-button.mjs +3 -3
- package/esm2022/filter-bar/filter-bar.mjs +3 -3
- package/esm2022/filter-bar/filter-bar.module.mjs +4 -4
- package/esm2022/filter-bar/filter-refresher.mjs +3 -3
- package/esm2022/filter-bar/filter-reset.mjs +3 -3
- package/esm2022/filter-bar/filter-search.mjs +3 -3
- package/esm2022/filter-bar/filters.mjs +4 -4
- package/esm2022/filter-bar/pipe-add.mjs +5 -5
- package/esm2022/filter-bar/pipe.directive.mjs +3 -3
- package/esm2022/filter-bar/pipes/base-pipe.mjs +7 -7
- package/esm2022/filter-bar/pipes/pipe-button.mjs +3 -3
- package/esm2022/filter-bar/pipes/pipe-date.mjs +6 -6
- package/esm2022/filter-bar/pipes/pipe-datetime.mjs +6 -6
- package/esm2022/filter-bar/pipes/pipe-multi-select.mjs +12 -7
- package/esm2022/filter-bar/pipes/pipe-multi-tree-select.mjs +12 -7
- package/esm2022/filter-bar/pipes/pipe-readonly.mjs +6 -6
- package/esm2022/filter-bar/pipes/pipe-select.mjs +6 -6
- package/esm2022/filter-bar/pipes/pipe-state.mjs +3 -3
- package/esm2022/filter-bar/pipes/pipe-text.mjs +6 -6
- package/esm2022/filter-bar/pipes/pipe-title.mjs +3 -3
- package/esm2022/filter-bar/pipes/pipe-tree-select.mjs +6 -6
- package/esm2022/form-field/cleaner.mjs +3 -3
- package/esm2022/form-field/error.mjs +3 -3
- package/esm2022/form-field/fieldset.mjs +11 -11
- package/esm2022/form-field/form-field.mjs +11 -11
- package/esm2022/form-field/form-field.module.mjs +4 -4
- package/esm2022/form-field/hint.mjs +3 -3
- package/esm2022/form-field/label.mjs +3 -3
- package/esm2022/form-field/password-hint.mjs +3 -3
- package/esm2022/form-field/password-toggle.mjs +7 -7
- package/esm2022/form-field/prefix.mjs +3 -3
- package/esm2022/form-field/reactive-password-hint.mjs +3 -3
- package/esm2022/form-field/stepper.mjs +3 -3
- package/esm2022/form-field/suffix.mjs +3 -3
- package/esm2022/form-field/validate.directive.mjs +3 -3
- package/esm2022/icon/icon-button.component.mjs +3 -3
- package/esm2022/icon/icon-item.component.mjs +3 -3
- package/esm2022/icon/icon.component.mjs +4 -4
- package/esm2022/icon/icon.module.mjs +4 -4
- package/esm2022/inline-edit/index.mjs +3 -0
- package/esm2022/inline-edit/inline-edit.mjs +378 -0
- package/esm2022/inline-edit/koobiq-components-inline-edit.mjs +5 -0
- package/esm2022/inline-edit/module.mjs +25 -0
- package/esm2022/input/input-number-validators.mjs +6 -6
- package/esm2022/input/input-number.mjs +4 -4
- package/esm2022/input/input-password.mjs +4 -4
- package/esm2022/input/input.mjs +7 -7
- package/esm2022/input/input.module.mjs +4 -4
- package/esm2022/link/link.component.mjs +6 -6
- package/esm2022/link/link.module.mjs +4 -4
- package/esm2022/list/list-selection.component.mjs +10 -10
- package/esm2022/list/list.component.mjs +6 -6
- package/esm2022/list/list.module.mjs +4 -4
- package/esm2022/loader-overlay/loader-overlay.component.mjs +13 -13
- package/esm2022/loader-overlay/loader-overlay.module.mjs +4 -4
- package/esm2022/markdown/markdown.component.mjs +5 -5
- package/esm2022/markdown/markdown.module.mjs +4 -4
- package/esm2022/markdown/markdown.service.mjs +3 -3
- package/esm2022/modal/css-unit.pipe.mjs +3 -3
- package/esm2022/modal/modal-control.service.mjs +3 -3
- package/esm2022/modal/modal.component.mjs +4 -4
- package/esm2022/modal/modal.directive.mjs +12 -12
- package/esm2022/modal/modal.module.mjs +4 -4
- package/esm2022/modal/modal.service.mjs +3 -3
- package/esm2022/navbar/navbar-item.component.mjs +49 -38
- package/esm2022/navbar/navbar.component.mjs +10 -10
- package/esm2022/navbar/navbar.module.mjs +4 -4
- package/esm2022/navbar/vertical-navbar.component.mjs +4 -4
- package/esm2022/navbar-ic/navbar-ic-header.mjs +7 -7
- package/esm2022/navbar-ic/navbar-ic-item.mjs +30 -38
- package/esm2022/navbar-ic/navbar-ic.mjs +18 -13
- package/esm2022/navbar-ic/navbar-ic.module.mjs +4 -4
- package/esm2022/notification-center/index.mjs +2 -0
- package/esm2022/notification-center/koobiq-components-notification-center.mjs +5 -0
- package/esm2022/notification-center/notification-center-animations.mjs +18 -0
- package/esm2022/notification-center/notification-center.mjs +353 -0
- package/esm2022/notification-center/notification-center.module.mjs +38 -0
- package/esm2022/notification-center/notification-center.service.mjs +127 -0
- package/esm2022/notification-center/notification-item.mjs +70 -0
- package/esm2022/notification-center/public-api.mjs +5 -0
- package/esm2022/overflow-items/module.mjs +4 -4
- package/esm2022/overflow-items/overflow-items.mjs +95 -41
- package/esm2022/popover/popover-confirm.component.mjs +10 -10
- package/esm2022/popover/popover.component.mjs +18 -13
- package/esm2022/popover/popover.module.mjs +4 -4
- package/esm2022/progress-bar/progress-bar.component.mjs +9 -9
- package/esm2022/progress-bar/progress-bar.module.mjs +4 -4
- package/esm2022/progress-spinner/progress-spinner.component.mjs +9 -9
- package/esm2022/progress-spinner/progress-spinner.module.mjs +4 -4
- package/esm2022/radio/radio.component.mjs +6 -6
- package/esm2022/radio/radio.module.mjs +4 -4
- package/esm2022/risk-level/risk-level.component.mjs +3 -3
- package/esm2022/risk-level/risk-level.module.mjs +4 -4
- package/esm2022/scrollbar/scrollbar.component.mjs +3 -3
- package/esm2022/scrollbar/scrollbar.directive.mjs +3 -3
- package/esm2022/scrollbar/scrollbar.module.mjs +4 -4
- package/esm2022/search-expandable/index.mjs +2 -0
- package/esm2022/search-expandable/koobiq-components-search-expandable.mjs +5 -0
- package/esm2022/search-expandable/public-api.mjs +3 -0
- package/esm2022/search-expandable/search-expandable.mjs +177 -0
- package/esm2022/search-expandable/search-expandable.module.mjs +18 -0
- package/esm2022/select/select-option.directive.mjs +3 -3
- package/esm2022/select/select.component.mjs +37 -10
- package/esm2022/select/select.module.mjs +4 -4
- package/esm2022/sidebar/sidebar.component.mjs +9 -9
- package/esm2022/sidebar/sidebar.module.mjs +4 -4
- package/esm2022/sidepanel/sidepanel-container.component.mjs +3 -3
- package/esm2022/sidepanel/sidepanel-directives.mjs +15 -15
- package/esm2022/sidepanel/sidepanel.module.mjs +4 -4
- package/esm2022/sidepanel/sidepanel.service.mjs +3 -3
- package/esm2022/split-button/index.mjs +2 -0
- package/esm2022/split-button/koobiq-components-split-button.mjs +5 -0
- package/esm2022/split-button/public-api.mjs +3 -0
- package/esm2022/split-button/split-button.mjs +92 -0
- package/esm2022/split-button/split-button.module.mjs +18 -0
- package/esm2022/splitter/splitter.component.mjs +13 -13
- package/esm2022/splitter/splitter.module.mjs +4 -4
- package/esm2022/table/table.component.mjs +6 -6
- package/esm2022/table/table.module.mjs +4 -4
- package/esm2022/tabs/paginated-tab-header.mjs +4 -4
- package/esm2022/tabs/tab-body.component.mjs +6 -6
- package/esm2022/tabs/tab-content.directive.mjs +3 -3
- package/esm2022/tabs/tab-group.component.mjs +15 -15
- package/esm2022/tabs/tab-header.component.mjs +4 -4
- package/esm2022/tabs/tab-label-wrapper.directive.mjs +4 -4
- package/esm2022/tabs/tab-label.directive.mjs +3 -3
- package/esm2022/tabs/tab-nav-bar.mjs +10 -10
- package/esm2022/tabs/tab.component.mjs +3 -3
- package/esm2022/tabs/tabs.module.mjs +4 -4
- package/esm2022/tags/tag-input.mjs +17 -11
- package/esm2022/tags/tag-list.component.mjs +236 -194
- package/esm2022/tags/tag.component.mjs +209 -138
- package/esm2022/tags/tag.module.mjs +4 -4
- package/esm2022/textarea/textarea.component.mjs +5 -5
- package/esm2022/textarea/textarea.module.mjs +4 -4
- package/esm2022/time-range/constants.mjs +21 -0
- package/esm2022/time-range/index.mjs +8 -0
- package/esm2022/time-range/koobiq-components-time-range.mjs +5 -0
- package/esm2022/time-range/module.mjs +36 -0
- package/esm2022/time-range/time-range-editor.mjs +219 -0
- package/esm2022/time-range/time-range-title-as-form-field.mjs +59 -0
- package/esm2022/time-range/time-range-title.mjs +112 -0
- package/esm2022/time-range/time-range.mjs +229 -0
- package/esm2022/time-range/time-range.service.mjs +189 -0
- package/esm2022/time-range/types.mjs +2 -0
- package/esm2022/timepicker/timepicker.directive.mjs +4 -4
- package/esm2022/timepicker/timepicker.module.mjs +4 -4
- package/esm2022/timezone/cities-by-filter.pipe.mjs +3 -3
- package/esm2022/timezone/timezone-option.component.mjs +3 -3
- package/esm2022/timezone/timezone-option.directive.mjs +3 -3
- package/esm2022/timezone/timezone-select.component.mjs +9 -9
- package/esm2022/timezone/timezone.module.mjs +4 -4
- package/esm2022/timezone/utc-offset.pipe.mjs +3 -3
- package/esm2022/title/title.directive.mjs +3 -3
- package/esm2022/title/title.module.mjs +4 -4
- package/esm2022/toast/toast-container.component.mjs +3 -3
- package/esm2022/toast/toast.component.mjs +20 -14
- package/esm2022/toast/toast.module.mjs +4 -4
- package/esm2022/toast/toast.service.mjs +5 -4
- package/esm2022/toast/toast.type.mjs +1 -1
- package/esm2022/toggle/toggle.component.mjs +3 -3
- package/esm2022/toggle/toggle.module.mjs +4 -4
- package/esm2022/tooltip/tooltip.component.mjs +19 -19
- package/esm2022/tooltip/tooltip.module.mjs +4 -4
- package/esm2022/top-bar/module.mjs +4 -4
- package/esm2022/top-bar/top-bar.mjs +9 -9
- package/esm2022/tree/node.mjs +3 -3
- package/esm2022/tree/outlet.mjs +3 -3
- package/esm2022/tree/padding.directive.mjs +3 -3
- package/esm2022/tree/toggle.mjs +16 -12
- package/esm2022/tree/tree-base.mjs +7 -7
- package/esm2022/tree/tree-option.component.mjs +5 -9
- package/esm2022/tree/tree-selection.component.mjs +4 -4
- package/esm2022/tree/tree.mjs +3 -3
- package/esm2022/tree/tree.module.mjs +4 -4
- package/esm2022/tree-select/tree-select.component.mjs +54 -14
- package/esm2022/tree-select/tree-select.module.mjs +4 -4
- package/esm2022/username/module.mjs +4 -4
- package/esm2022/username/username.mjs +15 -15
- package/esm2022/username/username.pipe.mjs +8 -8
- package/fesm2022/koobiq-components-accordion.mjs +20 -20
- package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
- package/fesm2022/koobiq-components-actions-panel.mjs +10 -10
- package/fesm2022/koobiq-components-alert.mjs +16 -16
- package/fesm2022/koobiq-components-app-switcher.mjs +704 -0
- package/fesm2022/koobiq-components-app-switcher.mjs.map +1 -0
- package/fesm2022/koobiq-components-autocomplete.mjs +13 -13
- package/fesm2022/koobiq-components-badge.mjs +14 -14
- package/fesm2022/koobiq-components-badge.mjs.map +1 -1
- package/fesm2022/koobiq-components-breadcrumbs.mjs +20 -20
- package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
- package/fesm2022/koobiq-components-button-toggle.mjs +10 -10
- package/fesm2022/koobiq-components-button.mjs +13 -13
- package/fesm2022/koobiq-components-button.mjs.map +1 -1
- package/fesm2022/koobiq-components-checkbox.mjs +10 -10
- package/fesm2022/koobiq-components-clamped-text.mjs +7 -7
- package/fesm2022/koobiq-components-code-block.mjs +13 -13
- package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
- package/fesm2022/koobiq-components-content-panel.mjs +34 -34
- package/fesm2022/koobiq-components-core.mjs +1032 -263
- package/fesm2022/koobiq-components-core.mjs.map +1 -1
- package/fesm2022/koobiq-components-datepicker.mjs +40 -40
- package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
- package/fesm2022/koobiq-components-divider.mjs +8 -8
- package/fesm2022/koobiq-components-divider.mjs.map +1 -1
- package/fesm2022/koobiq-components-dl.mjs +13 -13
- package/fesm2022/koobiq-components-dropdown.mjs +39 -25
- package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
- package/fesm2022/koobiq-components-dynamic-translation.mjs +13 -13
- package/fesm2022/koobiq-components-ellipsis-center.mjs +7 -7
- package/fesm2022/koobiq-components-empty-state.mjs +19 -19
- package/fesm2022/koobiq-components-file-upload.mjs +36 -18
- package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
- package/fesm2022/koobiq-components-filter-bar.mjs +96 -86
- package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
- package/fesm2022/koobiq-components-form-field.mjs +60 -60
- package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
- package/fesm2022/koobiq-components-icon.mjs +13 -13
- package/fesm2022/koobiq-components-icon.mjs.map +1 -1
- package/fesm2022/koobiq-components-inline-edit.mjs +407 -0
- package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -0
- package/fesm2022/koobiq-components-input.mjs +22 -22
- package/fesm2022/koobiq-components-input.mjs.map +1 -1
- package/fesm2022/koobiq-components-link.mjs +10 -10
- package/fesm2022/koobiq-components-link.mjs.map +1 -1
- package/fesm2022/koobiq-components-list.mjs +19 -19
- package/fesm2022/koobiq-components-list.mjs.map +1 -1
- package/fesm2022/koobiq-components-loader-overlay.mjs +16 -16
- package/fesm2022/koobiq-components-loader-overlay.mjs.map +1 -1
- package/fesm2022/koobiq-components-markdown.mjs +12 -12
- package/fesm2022/koobiq-components-markdown.mjs.map +1 -1
- package/fesm2022/koobiq-components-modal.mjs +28 -28
- package/fesm2022/koobiq-components-modal.mjs.map +1 -1
- package/fesm2022/koobiq-components-navbar-ic.mjs +53 -56
- package/fesm2022/koobiq-components-navbar-ic.mjs.map +1 -1
- package/fesm2022/koobiq-components-navbar.mjs +65 -54
- package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
- package/fesm2022/koobiq-components-notification-center.mjs +586 -0
- package/fesm2022/koobiq-components-notification-center.mjs.map +1 -0
- package/fesm2022/koobiq-components-overflow-items.mjs +98 -44
- package/fesm2022/koobiq-components-overflow-items.mjs.map +1 -1
- package/fesm2022/koobiq-components-popover.mjs +30 -25
- package/fesm2022/koobiq-components-popover.mjs.map +1 -1
- package/fesm2022/koobiq-components-progress-bar.mjs +13 -13
- package/fesm2022/koobiq-components-progress-spinner.mjs +13 -13
- package/fesm2022/koobiq-components-radio.mjs +10 -10
- package/fesm2022/koobiq-components-risk-level.mjs +7 -7
- package/fesm2022/koobiq-components-scrollbar.mjs +10 -10
- package/fesm2022/koobiq-components-search-expandable.mjs +199 -0
- package/fesm2022/koobiq-components-search-expandable.mjs.map +1 -0
- package/fesm2022/koobiq-components-select.mjs +43 -16
- package/fesm2022/koobiq-components-select.mjs.map +1 -1
- package/fesm2022/koobiq-components-sidebar.mjs +13 -13
- package/fesm2022/koobiq-components-sidepanel.mjs +25 -25
- package/fesm2022/koobiq-components-split-button.mjs +114 -0
- package/fesm2022/koobiq-components-split-button.mjs.map +1 -0
- package/fesm2022/koobiq-components-splitter.mjs +16 -16
- package/fesm2022/koobiq-components-splitter.mjs.map +1 -1
- package/fesm2022/koobiq-components-table.mjs +10 -10
- package/fesm2022/koobiq-components-tabs.mjs +52 -52
- package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
- package/fesm2022/koobiq-components-tags.mjs +461 -346
- package/fesm2022/koobiq-components-tags.mjs.map +1 -1
- package/fesm2022/koobiq-components-textarea.mjs +8 -8
- package/fesm2022/koobiq-components-textarea.mjs.map +1 -1
- package/fesm2022/koobiq-components-time-range.mjs +840 -0
- package/fesm2022/koobiq-components-time-range.mjs.map +1 -0
- package/fesm2022/koobiq-components-timepicker.mjs +7 -7
- package/fesm2022/koobiq-components-timepicker.mjs.map +1 -1
- package/fesm2022/koobiq-components-timezone.mjs +24 -24
- package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
- package/fesm2022/koobiq-components-title.mjs +7 -7
- package/fesm2022/koobiq-components-toast.mjs +28 -21
- package/fesm2022/koobiq-components-toast.mjs.map +1 -1
- package/fesm2022/koobiq-components-toggle.mjs +7 -7
- package/fesm2022/koobiq-components-tooltip.mjs +22 -22
- package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
- package/fesm2022/koobiq-components-top-bar.mjs +13 -13
- package/fesm2022/koobiq-components-tree-select.mjs +57 -17
- package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
- package/fesm2022/koobiq-components-tree.mjs +44 -44
- package/fesm2022/koobiq-components-tree.mjs.map +1 -1
- package/fesm2022/koobiq-components-username.mjs +27 -27
- package/file-upload/_file-upload-theme.scss +1 -1
- package/file-upload/file-upload.d.ts +1 -1
- package/file-upload/multiple-file-upload.component.d.ts +1 -0
- package/file-upload/single-file-upload.component.d.ts +1 -0
- package/filter-bar/pipes/base-pipe.d.ts +1 -1
- package/filter-bar/pipes/base-pipe.scss +3 -3
- package/filter-bar/pipes/pipe-date.scss +1 -0
- package/form-field/fieldset-tokens.scss +1 -1
- package/form-field/form-field-tokens.scss +1 -1
- package/form-field/form-field.d.ts +1 -1
- package/form-field/form-field.scss +1 -9
- package/form-field/password-toggle.d.ts +1 -1
- package/icon/icon.component.d.ts +2 -2
- package/inline-edit/index.d.ts +2 -0
- package/inline-edit/inline-edit-tokens.scss +8 -0
- package/inline-edit/inline-edit.d.ts +136 -0
- package/inline-edit/inline-edit.scss +208 -0
- package/inline-edit/module.d.ts +7 -0
- package/input/input-number.d.ts +1 -1
- package/input/input-password.d.ts +2 -2
- package/input/input.d.ts +2 -2
- package/link/link.component.d.ts +3 -3
- package/list/list-selection.component.d.ts +1 -1
- package/loader-overlay/loader-overlay.component.d.ts +1 -1
- package/markdown/_markdown-theme.scss +1 -1
- package/markdown/markdown-tokens.scss +1 -0
- package/markdown/markdown.scss +8 -0
- package/modal/modal.component.d.ts +1 -1
- package/navbar/navbar-item.component.d.ts +3 -2
- package/navbar/navbar.component.d.ts +4 -4
- package/navbar/vertical-navbar.component.d.ts +2 -2
- package/navbar-ic/navbar-ic-header.d.ts +1 -1
- package/navbar-ic/navbar-ic-item.d.ts +2 -2
- package/navbar-ic/navbar-ic.d.ts +4 -2
- package/notification-center/_notification-center-theme.scss +27 -0
- package/notification-center/index.d.ts +1 -0
- package/notification-center/notification-center-animations.d.ts +5 -0
- package/notification-center/notification-center.d.ts +153 -0
- package/notification-center/notification-center.module.d.ts +7 -0
- package/notification-center/notification-center.scss +126 -0
- package/notification-center/notification-center.service.d.ts +72 -0
- package/notification-center/notification-item.d.ts +27 -0
- package/notification-center/notification-item.scss +157 -0
- package/notification-center/public-api.d.ts +4 -0
- package/overflow-items/overflow-items.d.ts +23 -9
- package/package.json +46 -10
- package/popover/popover.component.d.ts +5 -1
- package/popover/popover.scss +15 -7
- package/prebuilt-themes/dark-theme.css +1 -1
- package/prebuilt-themes/light-theme.css +1 -1
- package/prebuilt-themes/theme.css +1 -1
- package/schematics/ng-add/index.js +5 -5
- package/search-expandable/index.d.ts +1 -0
- package/search-expandable/public-api.d.ts +2 -0
- package/search-expandable/search-expandable.d.ts +70 -0
- package/search-expandable/search-expandable.module.d.ts +7 -0
- package/search-expandable/search-expandable.scss +21 -0
- package/select/select.component.d.ts +38 -3
- package/split-button/_split-button-theme.scss +59 -0
- package/split-button/index.d.ts +1 -0
- package/split-button/public-api.d.ts +2 -0
- package/split-button/split-button.d.ts +31 -0
- package/split-button/split-button.module.d.ts +7 -0
- package/split-button/split-button.scss +83 -0
- package/splitter/splitter.component.d.ts +5 -5
- package/tabs/paginated-tab-header.d.ts +1 -1
- package/tabs/tab-header.component.d.ts +2 -2
- package/tabs/tab-label-wrapper.directive.d.ts +2 -2
- package/tabs/tab-nav-bar.d.ts +3 -3
- package/tags/_tag-theme.scss +21 -15
- package/tags/tag-input.d.ts +2 -0
- package/tags/tag-list.component.d.ts +133 -45
- package/tags/tag-list.scss +11 -0
- package/tags/tag-tokens.scss +17 -1
- package/tags/tag.component.d.ts +79 -20
- package/tags/tag.scss +9 -0
- package/textarea/textarea.component.d.ts +2 -2
- package/time-range/constants.d.ts +8 -0
- package/time-range/index.d.ts +7 -0
- package/time-range/module.d.ts +10 -0
- package/time-range/time-range-editor.d.ts +67 -0
- package/time-range/time-range-title-as-form-field.d.ts +40 -0
- package/time-range/time-range-title.d.ts +18 -0
- package/time-range/time-range.d.ts +75 -0
- package/time-range/time-range.scss +66 -0
- package/time-range/time-range.service.d.ts +29 -0
- package/time-range/types.d.ts +43 -0
- package/timepicker/timepicker.directive.d.ts +2 -2
- package/toast/toast.component.d.ts +6 -4
- package/toast/toast.component.scss +11 -1
- package/toast/toast.service.d.ts +1 -0
- package/toast/toast.type.d.ts +1 -0
- package/tree/toggle.d.ts +1 -1
- package/tree/tree-base.d.ts +2 -2
- package/tree/tree-option.component.d.ts +1 -1
- package/tree/tree-selection.component.d.ts +1 -1
- package/tree-select/tree-select.component.d.ts +44 -3
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
2
|
+
import { Overlay } from '@angular/cdk/overlay';
|
|
3
|
+
import { AsyncPipe, JsonPipe } from '@angular/common';
|
|
4
|
+
import { ChangeDetectionStrategy, Component, Directive, EventEmitter, InjectionToken, Input, Output, ViewChild, ViewEncapsulation, booleanAttribute, inject, numberAttribute } from '@angular/core';
|
|
5
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
6
|
+
import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
7
|
+
import { KbqBadgeModule } from '@koobiq/components/badge';
|
|
8
|
+
import { KBQ_LOCALE_SERVICE, KbqOptionModule, KbqPopUp, KbqPopUpTrigger, POSITION_TO_CSS_MAP, PopUpPlacements, PopUpSizes, PopUpTriggers, applyPopupMargins, ruRULocaleData } from '@koobiq/components/core';
|
|
9
|
+
import { KbqDividerModule } from '@koobiq/components/divider';
|
|
10
|
+
import { KbqDropdownModule, KbqDropdownTrigger } from '@koobiq/components/dropdown';
|
|
11
|
+
import { KbqFormFieldModule } from '@koobiq/components/form-field';
|
|
12
|
+
import { KbqIconModule } from '@koobiq/components/icon';
|
|
13
|
+
import { KbqInput, KbqInputModule } from '@koobiq/components/input';
|
|
14
|
+
import { defaultOffsetYWithArrow } from '@koobiq/components/popover';
|
|
15
|
+
import { KbqScrollbarModule } from '@koobiq/components/scrollbar';
|
|
16
|
+
import { merge } from 'rxjs';
|
|
17
|
+
import { kbqAppSwitcherAnimations } from './app-switcher-animations';
|
|
18
|
+
import { KbqAppSwitcherDropdownApp } from './app-switcher-dropdown-app';
|
|
19
|
+
import { KbqAppSwitcherDropdownSite } from './app-switcher-dropdown-site';
|
|
20
|
+
import { KbqAppSwitcherListItem } from './kbq-app-switcher-list-item';
|
|
21
|
+
import * as i0 from "@angular/core";
|
|
22
|
+
import * as i1 from "@angular/forms";
|
|
23
|
+
import * as i2 from "@koobiq/components/form-field";
|
|
24
|
+
import * as i3 from "@koobiq/components/input";
|
|
25
|
+
import * as i4 from "@koobiq/components/icon";
|
|
26
|
+
import * as i5 from "@koobiq/components/divider";
|
|
27
|
+
import * as i6 from "@koobiq/components/badge";
|
|
28
|
+
import * as i7 from "@koobiq/components/dropdown";
|
|
29
|
+
import * as i8 from "@koobiq/components/scrollbar";
|
|
30
|
+
import * as i9 from "@koobiq/components/core";
|
|
31
|
+
/** @docs-private */
|
|
32
|
+
export function defaultGroupBy(app, groups, untyped) {
|
|
33
|
+
if (!app.type) {
|
|
34
|
+
untyped.push(app);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const appType = app.type.toString();
|
|
38
|
+
if (groups[appType]) {
|
|
39
|
+
groups[appType].aliases.push(app);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
groups[appType] = {
|
|
43
|
+
name: appType,
|
|
44
|
+
aliases: [app],
|
|
45
|
+
icon: app.icon,
|
|
46
|
+
id: ''
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export const KBQ_MIN_NUMBER_OF_APPS_TO_ENABLE_SEARCH = 7;
|
|
52
|
+
export const KBQ_MIN_NUMBER_OF_APPS_TO_ENABLE_GROUPING = 3;
|
|
53
|
+
/** @docs-private */
|
|
54
|
+
export const KBQ_APP_SWITCHER_SCROLL_STRATEGY = new InjectionToken('kbq-app-switcher-scroll-strategy');
|
|
55
|
+
/** @docs-private */
|
|
56
|
+
export function kbqAppSwitcherScrollStrategyFactory(overlay) {
|
|
57
|
+
return () => overlay.scrollStrategies.reposition({ scrollThrottle: 20 });
|
|
58
|
+
}
|
|
59
|
+
/** @docs-private */
|
|
60
|
+
export const KBQ_APP_SWITCHER_SCROLL_STRATEGY_FACTORY_PROVIDER = {
|
|
61
|
+
provide: KBQ_APP_SWITCHER_SCROLL_STRATEGY,
|
|
62
|
+
deps: [Overlay],
|
|
63
|
+
useFactory: kbqAppSwitcherScrollStrategyFactory
|
|
64
|
+
};
|
|
65
|
+
/** default configuration of app-switcher */
|
|
66
|
+
/** @docs-private */
|
|
67
|
+
export const KBQ_APP_SWITCHER_DEFAULT_CONFIGURATION = ruRULocaleData.appSwitcher;
|
|
68
|
+
/** Injection Token for providing configuration of app-switcher */
|
|
69
|
+
/** @docs-private */
|
|
70
|
+
export const KBQ_APP_SWITCHER_CONFIGURATION = new InjectionToken('KbqAppSwitcherConfiguration');
|
|
71
|
+
/** @docs-private */
|
|
72
|
+
export class KbqAppSwitcherComponent extends KbqPopUp {
|
|
73
|
+
/** localized data
|
|
74
|
+
* @docs-private */
|
|
75
|
+
get localeData() {
|
|
76
|
+
return this.configuration;
|
|
77
|
+
}
|
|
78
|
+
constructor() {
|
|
79
|
+
super();
|
|
80
|
+
/** @docs-private */
|
|
81
|
+
this.localeService = inject(KBQ_LOCALE_SERVICE, { optional: true });
|
|
82
|
+
this.externalConfiguration = inject(KBQ_APP_SWITCHER_CONFIGURATION, { optional: true });
|
|
83
|
+
/** @docs-private */
|
|
84
|
+
this.searchControl = new FormControl('');
|
|
85
|
+
/** @docs-private */
|
|
86
|
+
this.prefix = 'kbq-app-switcher';
|
|
87
|
+
/** @docs-private */
|
|
88
|
+
this.isTrapFocus = false;
|
|
89
|
+
this.updateLocaleParams = () => {
|
|
90
|
+
this.configuration = this.externalConfiguration || this.localeService?.getParams('appSwitcher');
|
|
91
|
+
this.changeDetectorRef.markForCheck();
|
|
92
|
+
};
|
|
93
|
+
this.localeService?.changes.pipe(takeUntilDestroyed()).subscribe(this.updateLocaleParams);
|
|
94
|
+
if (!this.localeService) {
|
|
95
|
+
this.initDefaultParams();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
ngAfterViewInit() {
|
|
99
|
+
if (this.input) {
|
|
100
|
+
this.input.focus();
|
|
101
|
+
}
|
|
102
|
+
this.visibleChange.subscribe((state) => {
|
|
103
|
+
if (this.offset !== null && state) {
|
|
104
|
+
applyPopupMargins(this.renderer, this.elementRef.nativeElement, this.prefix, `${this.offset.toString()}px`);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
this.searchControl.valueChanges.subscribe((value) => (this.filteredSites = this.filterSites(value)));
|
|
108
|
+
}
|
|
109
|
+
/** @docs-private */
|
|
110
|
+
updateClassMap(placement, customClass, size) {
|
|
111
|
+
super.updateClassMap(placement, customClass, { [`${this.prefix}_${size}`]: !!size });
|
|
112
|
+
}
|
|
113
|
+
/** @docs-private */
|
|
114
|
+
updateTrapFocus(isTrapFocus) {
|
|
115
|
+
this.isTrapFocus = isTrapFocus;
|
|
116
|
+
}
|
|
117
|
+
/** @docs-private */
|
|
118
|
+
escapeHandler() {
|
|
119
|
+
this.hide(0);
|
|
120
|
+
}
|
|
121
|
+
/** @docs-private */
|
|
122
|
+
selectAppInSite(site, app) {
|
|
123
|
+
this.trigger.selectedSite = site;
|
|
124
|
+
this.trigger.selectedApp = app;
|
|
125
|
+
this.trigger.selectedSiteChange.emit(site);
|
|
126
|
+
this.trigger.selectedAppChange.emit(app);
|
|
127
|
+
}
|
|
128
|
+
filterSites(query) {
|
|
129
|
+
const filteredSites = structuredClone(this.trigger.originalSites);
|
|
130
|
+
return query
|
|
131
|
+
? filteredSites.filter((site) => {
|
|
132
|
+
const filteredApps = site.apps.filter((app) => app.name.toLowerCase().includes(query.toLowerCase()));
|
|
133
|
+
if (filteredApps.length) {
|
|
134
|
+
site.apps = filteredApps;
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
return false;
|
|
138
|
+
})
|
|
139
|
+
: filteredSites;
|
|
140
|
+
}
|
|
141
|
+
initDefaultParams() {
|
|
142
|
+
this.configuration = KBQ_APP_SWITCHER_DEFAULT_CONFIGURATION;
|
|
143
|
+
}
|
|
144
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: KbqAppSwitcherComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
145
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: KbqAppSwitcherComponent, isStandalone: true, selector: "kbq-app-switcher", host: { classAttribute: "kbq-app-switcher" }, viewQueries: [{ propertyName: "input", first: true, predicate: KbqInput, descendants: true }, { propertyName: "otherSites", first: true, predicate: ["otherSites"], descendants: true }], usesInheritance: true, ngImport: i0, template: "@if (trigger.withSearch) {\n <div class=\"kbq-app-switcher__search-container\" (mouseenter)=\"otherSites?.close()\">\n <kbq-form-field noBorders>\n <i kbq-icon=\"kbq-magnifying-glass_16\" kbqPrefix></i>\n <input\n autocomplete=\"off\"\n kbqInput\n placeholder=\"{{ localeData.searchPlaceholder }}\"\n [formControl]=\"searchControl\"\n (keydown.escape)=\"escapeHandler()\"\n />\n <kbq-cleaner />\n </kbq-form-field>\n </div>\n\n <kbq-divider />\n}\n\n<div kbq-scrollbar>\n @if (!searchControl.getRawValue()) {\n <div class=\"kbq-app-switcher__app-container\" (mouseenter)=\"otherSites?.close()\">\n @if (trigger.sitesMode) {\n <div class=\"kbq-app-switcher-group-header\">\n <div class=\"kbq-app-switcher-group-header__text\">{{ trigger.selectedSite?.name }}</div>\n @if (trigger.selectedSite?.status) {\n <kbq-badge class=\"kbq-app-switcher-group-header__badge\" [compact]=\"true\">\n {{ trigger.selectedSite.status }}\n </kbq-badge>\n }\n </div>\n }\n\n <kbq-dropdown [class]=\"'kbq-app-switcher-sites'\">\n <div kbqDropdownStaticContent class=\"kbq-app-switcher-site\">\n @for (app of trigger.currentApps; track app) {\n @if (!app.aliases) {\n <a\n kbq-app-switcher-list-item\n href=\"{{ app.link }}\"\n [class.kbq-selected]=\"app.id === trigger.selectedApp?.id\"\n [app]=\"app\"\n [toggle]=\"!!app.aliases\"\n ></a>\n } @else {\n <div\n #appSwitcherApp=\"kbqAppSwitcherApp\"\n kbq-app-switcher-list-item\n [app]=\"app\"\n [toggle]=\"!!app.aliases\"\n ></div>\n\n @if (!appSwitcherApp.collapsed) {\n @for (alias of app.aliases; track alias) {\n <a\n class=\"kbq-app-switcher-site_nested\"\n kbq-app-switcher-list-item\n href=\"{{ alias.link }}\"\n [class.kbq-selected]=\"alias.id === trigger.selectedApp?.id\"\n [app]=\"alias\"\n ></a>\n }\n }\n }\n }\n </div>\n </kbq-dropdown>\n </div>\n\n @if (trigger.sitesMode) {\n <kbq-divider />\n\n <div class=\"kbq-app-switcher__sites-container\">\n <div class=\"kbq-app-switcher-group-header\">\n <div class=\"kbq-app-switcher-group-header__text\">{{ localeData.sitesHeader }}</div>\n </div>\n\n <kbq-dropdown #otherSites=\"kbqDropdown\">\n <div kbqDropdownStaticContent class=\"kbq-app-switcher-sites\">\n @for (site of trigger.sites; track site) {\n @if (site.id !== trigger.selectedSite?.id) {\n <div\n [kbq-app-switcher-dropdown-site]=\"site\"\n [kbqDropdownTriggerFor]=\"dropdownWithSelectedSite\"\n [offsetX]=\"0\"\n (mouseenter)=\"activeSite = site\"\n ></div>\n }\n }\n </div>\n </kbq-dropdown>\n </div>\n\n <kbq-dropdown #dropdownWithSelectedSite=\"kbqDropdown\" [class]=\"'kbq-app-switcher-sites'\">\n @for (app of activeSite?.apps; track app) {\n @if (app.aliases) {\n <div\n #dropdownWithGroupedAppsTrigger=\"kbqDropdownTrigger\"\n [kbq-app-switcher-dropdown-app]=\"app\"\n [kbqDropdownTriggerFor]=\"dropdownWithGroupedApps\"\n [offsetX]=\"0\"\n [class.kbq-pressed]=\"dropdownWithGroupedAppsTrigger.opened\"\n (mouseenter)=\"activeApp = app\"\n ></div>\n } @else {\n <a\n href=\"{{ app.link }}\"\n [kbq-app-switcher-dropdown-app]=\"app\"\n (click)=\"selectAppInSite(activeSite, app)\"\n ></a>\n }\n }\n </kbq-dropdown>\n\n <kbq-dropdown #dropdownWithGroupedApps=\"kbqDropdown\" [class]=\"'kbq-app-switcher-sites'\">\n @for (alias of activeApp?.aliases; track alias) {\n <a\n href=\"{{ alias.link }}\"\n [kbq-app-switcher-dropdown-app]=\"alias\"\n (click)=\"selectAppInSite(activeSite, alias)\"\n ></a>\n }\n </kbq-dropdown>\n }\n } @else {\n <div class=\"kbq-app-switcher__search-result\">\n <kbq-dropdown [class]=\"'kbq-app-switcher-sites'\">\n <div kbqDropdownStaticContent class=\"kbq-app-switcher-site\">\n @for (site of filteredSites; track site) {\n @if (site.apps) {\n <kbq-optgroup label=\"{{ site.name }}\" />\n }\n\n @for (app of site.apps; track app) {\n <a kbq-app-switcher-list-item href=\"{{ app.link }}\" [app]=\"app\"></a>\n }\n } @empty {\n <div class=\"kbq-app-switcher__empty-search-result\">{{ localeData.searchEmptyResult }}</div>\n }\n </div>\n </kbq-dropdown>\n </div>\n }\n</div>\n", styles: [".kbq-app-switcher{position:relative;display:flex;flex-direction:column;margin-top:var(--kbq-size-xxs);margin-bottom:var(--kbq-size-xxs);width:320px;border-radius:var(--kbq-size-xs);box-shadow:var(--kbq-shadow-popup);box-sizing:border-box;z-index:1}.kbq-app-switcher__search-container{padding-top:var(--kbq-size-xxs)}.kbq-app-switcher__search-result{max-width:320px;min-height:0;padding:var(--kbq-size-s) var(--kbq-size-xxs)}.kbq-app-switcher__empty-search-result{display:flex;justify-content:center;align-items:center;height:96px}.kbq-app-switcher__app-container{display:flex;flex-direction:column;min-height:0;padding:var(--kbq-size-s) var(--kbq-size-xxs)}.kbq-app-switcher-group-header{padding:var(--kbq-size-s) var(--kbq-size-m);display:flex;flex-direction:row;justify-content:space-between}.kbq-app-switcher__sites-container{padding:var(--kbq-size-xxs)}.kbq-app-switcher{background:var(--kbq-background-card)}.kbq-app-switcher .kbq-app-switcher-group-header,.kbq-app-switcher__empty-search-result{color:var(--kbq-foreground-contrast-secondary)}.kbq-app-switcher,.kbq-app-switcher__empty-search-result{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}.kbq-app-switcher-group-header__text{font-size:var(--kbq-typography-caps-compact-strong-font-size);font-style:var(--kbq-typography-caps-compact-strong-font-style);font-weight:var(--kbq-typography-caps-compact-strong-font-weight);line-height:var(--kbq-typography-caps-compact-strong-line-height);font-family:var(--kbq-typography-caps-compact-strong-font-family);text-transform:var(--kbq-typography-caps-compact-strong-text-transform);font-feature-settings:var(--kbq-typography-caps-compact-strong-font-feature-settings);letter-spacing:var(--kbq-typography-caps-compact-strong-letter-spacing)}.kbq-app-switcher-group-header__badge{font-size:var(--kbq-typography-text-compact-medium-font-size);font-style:var(--kbq-typography-text-compact-medium-font-style);font-weight:var(--kbq-typography-text-compact-medium-font-weight);line-height:var(--kbq-typography-text-compact-medium-line-height);font-family:var(--kbq-typography-text-compact-medium-font-family);text-transform:var(--kbq-typography-text-compact-medium-text-transform);font-feature-settings:var(--kbq-typography-text-compact-medium-font-feature-settings);letter-spacing:var(--kbq-typography-text-compact-medium-letter-spacing)}.kbq-app-switch-tree-option__text{font-size:var(--kbq-typography-text-normal-medium-font-size);font-style:var(--kbq-typography-text-normal-medium-font-style);font-weight:var(--kbq-typography-text-normal-medium-font-weight);line-height:var(--kbq-typography-text-normal-medium-line-height);font-family:var(--kbq-typography-text-normal-medium-font-family);text-transform:var(--kbq-typography-text-normal-medium-text-transform);font-feature-settings:var(--kbq-typography-text-normal-medium-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-medium-letter-spacing)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: KbqFormFieldModule }, { kind: "component", type: i2.KbqCleaner, selector: "kbq-cleaner", exportAs: ["kbqCleaner"] }, { kind: "component", type: i2.KbqFormField, selector: "kbq-form-field", inputs: ["noBorders"], exportAs: ["kbqFormField"] }, { kind: "directive", type: i2.KbqPrefix, selector: "[kbqPrefix]", exportAs: ["kbqPrefix"] }, { kind: "directive", type: i2.KbqValidateDirective, selector: " input[kbqInput], input[kbqNumberInput], input[kbqInputPassword], input[kbqTimepicker], input[kbqDatepicker], textarea[kbqTextarea], kbq-select, kbq-tree-select, kbq-tag-list ", exportAs: ["KbqValidate"] }, { kind: "directive", type: i2.KbqTrim, selector: "[kbqInput], [kbqTextarea]", exportAs: ["KbqTrim"] }, { kind: "ngmodule", type: KbqInputModule }, { kind: "directive", type: i3.KbqInput, selector: "input[kbqInput],input[kbqNumberInput]", inputs: ["errorStateMatcher", "placeholder", "disabled", "id", "required", "type", "value"], exportAs: ["kbqInput"] }, { kind: "ngmodule", type: KbqIconModule }, { kind: "component", type: i4.KbqIcon, selector: "[kbq-icon]", inputs: ["small", "autoColor", "kbq-icon"] }, { kind: "ngmodule", type: KbqDividerModule }, { kind: "component", type: i5.KbqDivider, selector: "kbq-divider", inputs: ["vertical", "inset", "paddings"] }, { kind: "ngmodule", type: KbqBadgeModule }, { kind: "component", type: i6.KbqBadge, selector: "kbq-badge", inputs: ["compact", "outline", "badgeColor"] }, { kind: "directive", type: i6.KbqBadgeCssStyler, selector: "kbq-badge" }, { kind: "ngmodule", type: KbqDropdownModule }, { kind: "component", type: i7.KbqDropdown, selector: "kbq-dropdown", inputs: ["navigationWithWrap", "xPosition", "yPosition", "overlapTriggerY", "overlapTriggerX", "hasBackdrop", "class", "backdropClass"], outputs: ["closed"], exportAs: ["kbqDropdown"] }, { kind: "directive", type: i7.KbqDropdownTrigger, selector: "[kbqDropdownTriggerFor]", inputs: ["offsetX", "offsetY", "kbqDropdownTriggerData", "openByArrowDown", "kbqDropdownTriggerRestoreFocus", "kbqDropdownTriggerFor"], outputs: ["dropdownOpened", "dropdownClosed"], exportAs: ["kbqDropdownTrigger"] }, { kind: "directive", type: i7.KbqDropdownStaticContent, selector: "[kbqDropdownStaticContent]" }, { kind: "ngmodule", type: KbqScrollbarModule }, { kind: "component", type: i8.KbqScrollbar, selector: "kbq-scrollbar, [kbq-scrollbar]", inputs: ["initializationTarget", "options", "events", "defer"], outputs: ["onInitialize", "onUpdate", "onDestroy", "onScroll"], exportAs: ["kbqScrollbar"] }, { kind: "ngmodule", type: KbqOptionModule }, { kind: "component", type: i9.KbqOptgroup, selector: "kbq-optgroup", inputs: ["label", "disabled"], exportAs: ["kbqOptgroup"] }, { kind: "component", type: KbqAppSwitcherDropdownApp, selector: "[kbq-app-switcher-dropdown-app]", inputs: ["kbq-app-switcher-dropdown-app"], exportAs: ["kbqAppSwitcherDropdownApp"] }, { kind: "component", type: KbqAppSwitcherDropdownSite, selector: "[kbq-app-switcher-dropdown-site]", inputs: ["kbq-app-switcher-dropdown-site"], exportAs: ["kbqAppSwitcherDropdownSite"] }, { kind: "component", type: KbqAppSwitcherListItem, selector: "[kbq-app-switcher-list-item]", inputs: ["app", "toggle", "collapsed"], exportAs: ["kbqAppSwitcherApp"] }], animations: [kbqAppSwitcherAnimations.state], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
146
|
+
}
|
|
147
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: KbqAppSwitcherComponent, decorators: [{
|
|
148
|
+
type: Component,
|
|
149
|
+
args: [{ standalone: true, selector: 'kbq-app-switcher', preserveWhitespaces: false, host: {
|
|
150
|
+
class: 'kbq-app-switcher'
|
|
151
|
+
}, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
152
|
+
AsyncPipe,
|
|
153
|
+
FormsModule,
|
|
154
|
+
ReactiveFormsModule,
|
|
155
|
+
KbqFormFieldModule,
|
|
156
|
+
KbqInputModule,
|
|
157
|
+
KbqIconModule,
|
|
158
|
+
KbqDividerModule,
|
|
159
|
+
KbqBadgeModule,
|
|
160
|
+
KbqDropdownModule,
|
|
161
|
+
KbqScrollbarModule,
|
|
162
|
+
KbqOptionModule,
|
|
163
|
+
KbqAppSwitcherDropdownApp,
|
|
164
|
+
KbqAppSwitcherDropdownSite,
|
|
165
|
+
KbqAppSwitcherListItem,
|
|
166
|
+
JsonPipe
|
|
167
|
+
], animations: [kbqAppSwitcherAnimations.state], template: "@if (trigger.withSearch) {\n <div class=\"kbq-app-switcher__search-container\" (mouseenter)=\"otherSites?.close()\">\n <kbq-form-field noBorders>\n <i kbq-icon=\"kbq-magnifying-glass_16\" kbqPrefix></i>\n <input\n autocomplete=\"off\"\n kbqInput\n placeholder=\"{{ localeData.searchPlaceholder }}\"\n [formControl]=\"searchControl\"\n (keydown.escape)=\"escapeHandler()\"\n />\n <kbq-cleaner />\n </kbq-form-field>\n </div>\n\n <kbq-divider />\n}\n\n<div kbq-scrollbar>\n @if (!searchControl.getRawValue()) {\n <div class=\"kbq-app-switcher__app-container\" (mouseenter)=\"otherSites?.close()\">\n @if (trigger.sitesMode) {\n <div class=\"kbq-app-switcher-group-header\">\n <div class=\"kbq-app-switcher-group-header__text\">{{ trigger.selectedSite?.name }}</div>\n @if (trigger.selectedSite?.status) {\n <kbq-badge class=\"kbq-app-switcher-group-header__badge\" [compact]=\"true\">\n {{ trigger.selectedSite.status }}\n </kbq-badge>\n }\n </div>\n }\n\n <kbq-dropdown [class]=\"'kbq-app-switcher-sites'\">\n <div kbqDropdownStaticContent class=\"kbq-app-switcher-site\">\n @for (app of trigger.currentApps; track app) {\n @if (!app.aliases) {\n <a\n kbq-app-switcher-list-item\n href=\"{{ app.link }}\"\n [class.kbq-selected]=\"app.id === trigger.selectedApp?.id\"\n [app]=\"app\"\n [toggle]=\"!!app.aliases\"\n ></a>\n } @else {\n <div\n #appSwitcherApp=\"kbqAppSwitcherApp\"\n kbq-app-switcher-list-item\n [app]=\"app\"\n [toggle]=\"!!app.aliases\"\n ></div>\n\n @if (!appSwitcherApp.collapsed) {\n @for (alias of app.aliases; track alias) {\n <a\n class=\"kbq-app-switcher-site_nested\"\n kbq-app-switcher-list-item\n href=\"{{ alias.link }}\"\n [class.kbq-selected]=\"alias.id === trigger.selectedApp?.id\"\n [app]=\"alias\"\n ></a>\n }\n }\n }\n }\n </div>\n </kbq-dropdown>\n </div>\n\n @if (trigger.sitesMode) {\n <kbq-divider />\n\n <div class=\"kbq-app-switcher__sites-container\">\n <div class=\"kbq-app-switcher-group-header\">\n <div class=\"kbq-app-switcher-group-header__text\">{{ localeData.sitesHeader }}</div>\n </div>\n\n <kbq-dropdown #otherSites=\"kbqDropdown\">\n <div kbqDropdownStaticContent class=\"kbq-app-switcher-sites\">\n @for (site of trigger.sites; track site) {\n @if (site.id !== trigger.selectedSite?.id) {\n <div\n [kbq-app-switcher-dropdown-site]=\"site\"\n [kbqDropdownTriggerFor]=\"dropdownWithSelectedSite\"\n [offsetX]=\"0\"\n (mouseenter)=\"activeSite = site\"\n ></div>\n }\n }\n </div>\n </kbq-dropdown>\n </div>\n\n <kbq-dropdown #dropdownWithSelectedSite=\"kbqDropdown\" [class]=\"'kbq-app-switcher-sites'\">\n @for (app of activeSite?.apps; track app) {\n @if (app.aliases) {\n <div\n #dropdownWithGroupedAppsTrigger=\"kbqDropdownTrigger\"\n [kbq-app-switcher-dropdown-app]=\"app\"\n [kbqDropdownTriggerFor]=\"dropdownWithGroupedApps\"\n [offsetX]=\"0\"\n [class.kbq-pressed]=\"dropdownWithGroupedAppsTrigger.opened\"\n (mouseenter)=\"activeApp = app\"\n ></div>\n } @else {\n <a\n href=\"{{ app.link }}\"\n [kbq-app-switcher-dropdown-app]=\"app\"\n (click)=\"selectAppInSite(activeSite, app)\"\n ></a>\n }\n }\n </kbq-dropdown>\n\n <kbq-dropdown #dropdownWithGroupedApps=\"kbqDropdown\" [class]=\"'kbq-app-switcher-sites'\">\n @for (alias of activeApp?.aliases; track alias) {\n <a\n href=\"{{ alias.link }}\"\n [kbq-app-switcher-dropdown-app]=\"alias\"\n (click)=\"selectAppInSite(activeSite, alias)\"\n ></a>\n }\n </kbq-dropdown>\n }\n } @else {\n <div class=\"kbq-app-switcher__search-result\">\n <kbq-dropdown [class]=\"'kbq-app-switcher-sites'\">\n <div kbqDropdownStaticContent class=\"kbq-app-switcher-site\">\n @for (site of filteredSites; track site) {\n @if (site.apps) {\n <kbq-optgroup label=\"{{ site.name }}\" />\n }\n\n @for (app of site.apps; track app) {\n <a kbq-app-switcher-list-item href=\"{{ app.link }}\" [app]=\"app\"></a>\n }\n } @empty {\n <div class=\"kbq-app-switcher__empty-search-result\">{{ localeData.searchEmptyResult }}</div>\n }\n </div>\n </kbq-dropdown>\n </div>\n }\n</div>\n", styles: [".kbq-app-switcher{position:relative;display:flex;flex-direction:column;margin-top:var(--kbq-size-xxs);margin-bottom:var(--kbq-size-xxs);width:320px;border-radius:var(--kbq-size-xs);box-shadow:var(--kbq-shadow-popup);box-sizing:border-box;z-index:1}.kbq-app-switcher__search-container{padding-top:var(--kbq-size-xxs)}.kbq-app-switcher__search-result{max-width:320px;min-height:0;padding:var(--kbq-size-s) var(--kbq-size-xxs)}.kbq-app-switcher__empty-search-result{display:flex;justify-content:center;align-items:center;height:96px}.kbq-app-switcher__app-container{display:flex;flex-direction:column;min-height:0;padding:var(--kbq-size-s) var(--kbq-size-xxs)}.kbq-app-switcher-group-header{padding:var(--kbq-size-s) var(--kbq-size-m);display:flex;flex-direction:row;justify-content:space-between}.kbq-app-switcher__sites-container{padding:var(--kbq-size-xxs)}.kbq-app-switcher{background:var(--kbq-background-card)}.kbq-app-switcher .kbq-app-switcher-group-header,.kbq-app-switcher__empty-search-result{color:var(--kbq-foreground-contrast-secondary)}.kbq-app-switcher,.kbq-app-switcher__empty-search-result{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}.kbq-app-switcher-group-header__text{font-size:var(--kbq-typography-caps-compact-strong-font-size);font-style:var(--kbq-typography-caps-compact-strong-font-style);font-weight:var(--kbq-typography-caps-compact-strong-font-weight);line-height:var(--kbq-typography-caps-compact-strong-line-height);font-family:var(--kbq-typography-caps-compact-strong-font-family);text-transform:var(--kbq-typography-caps-compact-strong-text-transform);font-feature-settings:var(--kbq-typography-caps-compact-strong-font-feature-settings);letter-spacing:var(--kbq-typography-caps-compact-strong-letter-spacing)}.kbq-app-switcher-group-header__badge{font-size:var(--kbq-typography-text-compact-medium-font-size);font-style:var(--kbq-typography-text-compact-medium-font-style);font-weight:var(--kbq-typography-text-compact-medium-font-weight);line-height:var(--kbq-typography-text-compact-medium-line-height);font-family:var(--kbq-typography-text-compact-medium-font-family);text-transform:var(--kbq-typography-text-compact-medium-text-transform);font-feature-settings:var(--kbq-typography-text-compact-medium-font-feature-settings);letter-spacing:var(--kbq-typography-text-compact-medium-letter-spacing)}.kbq-app-switch-tree-option__text{font-size:var(--kbq-typography-text-normal-medium-font-size);font-style:var(--kbq-typography-text-normal-medium-font-style);font-weight:var(--kbq-typography-text-normal-medium-font-weight);line-height:var(--kbq-typography-text-normal-medium-line-height);font-family:var(--kbq-typography-text-normal-medium-font-family);text-transform:var(--kbq-typography-text-normal-medium-text-transform);font-feature-settings:var(--kbq-typography-text-normal-medium-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-medium-letter-spacing)}\n"] }]
|
|
168
|
+
}], ctorParameters: () => [], propDecorators: { input: [{
|
|
169
|
+
type: ViewChild,
|
|
170
|
+
args: [KbqInput]
|
|
171
|
+
}], otherSites: [{
|
|
172
|
+
type: ViewChild,
|
|
173
|
+
args: ['otherSites']
|
|
174
|
+
}] } });
|
|
175
|
+
export class KbqAppSwitcherTrigger extends KbqPopUpTrigger {
|
|
176
|
+
constructor() {
|
|
177
|
+
super(...arguments);
|
|
178
|
+
/** @docs-private */
|
|
179
|
+
this.scrollStrategy = inject(KBQ_APP_SWITCHER_SCROLL_STRATEGY);
|
|
180
|
+
// not used
|
|
181
|
+
/** @docs-private */
|
|
182
|
+
this.arrow = false;
|
|
183
|
+
/** @docs-private */
|
|
184
|
+
this.hasBackdrop = false;
|
|
185
|
+
/** @docs-private */
|
|
186
|
+
this.size = PopUpSizes.Medium;
|
|
187
|
+
/** Placement of popUp */
|
|
188
|
+
this.placement = PopUpPlacements.BottomLeft;
|
|
189
|
+
/** Class that will be used in the background */
|
|
190
|
+
this.backdropClass = 'cdk-overlay-transparent-backdrop';
|
|
191
|
+
/** Offset of popUp */
|
|
192
|
+
this.offset = defaultOffsetYWithArrow;
|
|
193
|
+
this._groupBy = defaultGroupBy;
|
|
194
|
+
/** Emits a change event whenever the placement state changes. */
|
|
195
|
+
this.placementChange = new EventEmitter();
|
|
196
|
+
/** Emits a change event whenever the visible state changes. */
|
|
197
|
+
this.visibleChange = new EventEmitter();
|
|
198
|
+
/** @docs-private */
|
|
199
|
+
this.selectedSiteChange = new EventEmitter();
|
|
200
|
+
/** @docs-private */
|
|
201
|
+
this.selectedAppChange = new EventEmitter();
|
|
202
|
+
/** @docs-private */
|
|
203
|
+
this.trigger = `${PopUpTriggers.Click}, ${PopUpTriggers.Keydown}`;
|
|
204
|
+
/** @docs-private */
|
|
205
|
+
this.originSelector = '.kbq-app-switcher';
|
|
206
|
+
this.hideIfNotInViewPort = () => {
|
|
207
|
+
if (!this.scrollable)
|
|
208
|
+
return;
|
|
209
|
+
const rect = this.elementRef.nativeElement.getBoundingClientRect();
|
|
210
|
+
const containerRect = this.scrollable.getElementRef().nativeElement.getBoundingClientRect();
|
|
211
|
+
if (!(rect.bottom >= containerRect.top &&
|
|
212
|
+
rect.right >= containerRect.left &&
|
|
213
|
+
rect.top <= containerRect.bottom &&
|
|
214
|
+
rect.left <= containerRect.right)) {
|
|
215
|
+
this.hide();
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/** Whether search is used or not */
|
|
220
|
+
get withSearch() {
|
|
221
|
+
return this.appsCount > KBQ_MIN_NUMBER_OF_APPS_TO_ENABLE_SEARCH;
|
|
222
|
+
}
|
|
223
|
+
/** Number of applications to choose from
|
|
224
|
+
* @docs-private */
|
|
225
|
+
get appsCount() {
|
|
226
|
+
if (this.sitesMode) {
|
|
227
|
+
return this.originalSites.reduce((acc, site) => acc + site.apps.length, 0);
|
|
228
|
+
}
|
|
229
|
+
return this.originalApps.length;
|
|
230
|
+
}
|
|
231
|
+
/** Whether the sites are used or not
|
|
232
|
+
* @docs-private */
|
|
233
|
+
get sitesMode() {
|
|
234
|
+
return this.originalSites?.length > 0;
|
|
235
|
+
}
|
|
236
|
+
/** Whether the sites are used or not
|
|
237
|
+
* @docs-private */
|
|
238
|
+
get currentApps() {
|
|
239
|
+
return this.sitesMode ? this.selectedSite.apps : this._parsedApps;
|
|
240
|
+
}
|
|
241
|
+
/** Array of sites */
|
|
242
|
+
get sites() {
|
|
243
|
+
return this._parsedSites;
|
|
244
|
+
}
|
|
245
|
+
set sites(value) {
|
|
246
|
+
this.originalSites = value;
|
|
247
|
+
this._parsedSites = [];
|
|
248
|
+
value.forEach((site) => {
|
|
249
|
+
const newSite = { ...site, apps: [] };
|
|
250
|
+
newSite.apps = this.makeGroupsForApps(site.apps, KBQ_MIN_NUMBER_OF_APPS_TO_ENABLE_GROUPING);
|
|
251
|
+
this._parsedSites.push(newSite);
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
/** Array of applications */
|
|
255
|
+
get apps() {
|
|
256
|
+
return this._parsedApps;
|
|
257
|
+
}
|
|
258
|
+
set apps(apps) {
|
|
259
|
+
this.originalApps = apps;
|
|
260
|
+
this._parsedApps = this.makeGroupsForApps(this.originalApps, KBQ_MIN_NUMBER_OF_APPS_TO_ENABLE_GROUPING);
|
|
261
|
+
}
|
|
262
|
+
makeGroupsForApps(apps, minAppsForGrouping) {
|
|
263
|
+
const groups = {};
|
|
264
|
+
const untyped = [];
|
|
265
|
+
const groupedApps = [];
|
|
266
|
+
apps.forEach((app) => {
|
|
267
|
+
this.groupBy(app, groups, untyped);
|
|
268
|
+
});
|
|
269
|
+
Object.values(groups).forEach((group) => {
|
|
270
|
+
if (group.aliases && group.aliases.length > minAppsForGrouping) {
|
|
271
|
+
groupedApps.push(group);
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
untyped.push(...group.aliases);
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
groupedApps.push(...untyped);
|
|
278
|
+
return groupedApps;
|
|
279
|
+
}
|
|
280
|
+
/** Function to group the apps by type. The first argument is an app object with type.
|
|
281
|
+
* The second is a groups object and third is an array for untyped apps */
|
|
282
|
+
get groupBy() {
|
|
283
|
+
return this._groupBy;
|
|
284
|
+
}
|
|
285
|
+
set groupBy(fn) {
|
|
286
|
+
if (typeof fn !== 'function') {
|
|
287
|
+
throw new Error('The argument must be a function');
|
|
288
|
+
}
|
|
289
|
+
this._groupBy = fn;
|
|
290
|
+
}
|
|
291
|
+
/** Selected site */
|
|
292
|
+
get selectedSite() {
|
|
293
|
+
return this._parsedSelectedSite;
|
|
294
|
+
}
|
|
295
|
+
set selectedSite(value) {
|
|
296
|
+
const originValue = this.originalSites.find((site) => value.id === site.id);
|
|
297
|
+
const newSite = { ...originValue, apps: [] };
|
|
298
|
+
newSite.apps = this.makeGroupsForApps(originValue.apps, KBQ_MIN_NUMBER_OF_APPS_TO_ENABLE_GROUPING);
|
|
299
|
+
this._parsedSelectedSite = newSite;
|
|
300
|
+
}
|
|
301
|
+
/** Whether the trigger is disabled. */
|
|
302
|
+
get disabled() {
|
|
303
|
+
return this._disabled;
|
|
304
|
+
}
|
|
305
|
+
set disabled(value) {
|
|
306
|
+
this._disabled = coerceBooleanProperty(value);
|
|
307
|
+
if (this._disabled) {
|
|
308
|
+
this.hide();
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
/** @docs-private */
|
|
312
|
+
get hasClickTrigger() {
|
|
313
|
+
return this.trigger.includes(PopUpTriggers.Click);
|
|
314
|
+
}
|
|
315
|
+
/** @docs-private */
|
|
316
|
+
get overlayConfig() {
|
|
317
|
+
return {
|
|
318
|
+
panelClass: 'kbq-app-switcher__panel',
|
|
319
|
+
hasBackdrop: this.hasBackdrop,
|
|
320
|
+
backdropClass: this.backdropClass
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
ngOnInit() {
|
|
324
|
+
super.ngOnInit();
|
|
325
|
+
this.scrollable
|
|
326
|
+
?.elementScrolled()
|
|
327
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
328
|
+
.subscribe(this.hideIfNotInViewPort);
|
|
329
|
+
}
|
|
330
|
+
ngAfterContentInit() {
|
|
331
|
+
if (this.closeOnScroll === null) {
|
|
332
|
+
this.scrollDispatcher.scrolled().subscribe((scrollable) => {
|
|
333
|
+
if (!scrollable?.getElementRef().nativeElement.classList.contains('kbq-hide-nested-popup'))
|
|
334
|
+
return;
|
|
335
|
+
const parentRects = scrollable.getElementRef().nativeElement.getBoundingClientRect();
|
|
336
|
+
const childRects = this.elementRef.nativeElement.getBoundingClientRect();
|
|
337
|
+
if (childRects.bottom < parentRects.top || childRects.top > parentRects.bottom) {
|
|
338
|
+
this.hide();
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
this.visibleChange.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((visible) => {
|
|
343
|
+
if (visible) {
|
|
344
|
+
// eslint-disable-next-line rxjs/no-nested-subscribe
|
|
345
|
+
this.preventClosingByInnerScrollSubscription = this.closingActions().subscribe((event) => {
|
|
346
|
+
if (event['scrollDispatcher']) {
|
|
347
|
+
event['kbqPopoverPreventHide'] = true;
|
|
348
|
+
event['type'] = 'click';
|
|
349
|
+
}
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
this.preventClosingByInnerScrollSubscription.unsubscribe();
|
|
354
|
+
this.focus();
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
/** @docs-private */
|
|
359
|
+
updateData() {
|
|
360
|
+
if (!this.instance)
|
|
361
|
+
return;
|
|
362
|
+
this.instance.header = this.header;
|
|
363
|
+
this.instance.content = this.content;
|
|
364
|
+
this.instance.arrow = this.arrow;
|
|
365
|
+
this.instance.offset = this.offset;
|
|
366
|
+
this.instance.footer = this.footer;
|
|
367
|
+
this.instance.updateTrapFocus(this.trigger !== PopUpTriggers.Focus);
|
|
368
|
+
if (this.isOpen) {
|
|
369
|
+
this.updatePosition(true);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
/** Updates the current position.
|
|
373
|
+
* @docs-private */
|
|
374
|
+
updatePosition(reapplyPosition = false) {
|
|
375
|
+
this.overlayRef = this.createOverlay();
|
|
376
|
+
const position = this.overlayRef.getConfig().positionStrategy
|
|
377
|
+
.withPositions(this.getAdjustedPositions())
|
|
378
|
+
.withPush(true);
|
|
379
|
+
if (reapplyPosition) {
|
|
380
|
+
setTimeout(() => position.reapplyLastPosition());
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
/** @docs-private */
|
|
384
|
+
getOverlayHandleComponentType() {
|
|
385
|
+
return KbqAppSwitcherComponent;
|
|
386
|
+
}
|
|
387
|
+
/** @docs-private */
|
|
388
|
+
updateClassMap(newPlacement = this.placement) {
|
|
389
|
+
if (!this.instance)
|
|
390
|
+
return;
|
|
391
|
+
this.instance.updateClassMap(POSITION_TO_CSS_MAP[newPlacement], this.customClass, this.size);
|
|
392
|
+
this.instance.markForCheck();
|
|
393
|
+
}
|
|
394
|
+
/** @docs-private */
|
|
395
|
+
closingActions() {
|
|
396
|
+
return merge(this.overlayRef.outsidePointerEvents(), this.overlayRef.backdropClick(), this.scrollDispatcher.scrolled());
|
|
397
|
+
}
|
|
398
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: KbqAppSwitcherTrigger, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
|
|
399
|
+
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.14", type: KbqAppSwitcherTrigger, isStandalone: true, selector: "[kbqAppSwitcher]", inputs: { selectedApp: "selectedApp", placement: ["kbqAppSwitcherPlacement", "placement"], backdropClass: "backdropClass", offset: ["offset", "offset", numberAttribute], sites: "sites", apps: "apps", groupBy: "groupBy", selectedSite: "selectedSite", disabled: ["disabled", "disabled", booleanAttribute] }, outputs: { placementChange: "kbqPlacementChange", visibleChange: "kbqVisibleChange", selectedSiteChange: "selectedSiteChange", selectedAppChange: "selectedAppChange" }, host: { listeners: { "keydown": "keydownHandler($event)", "touchend": "touchendHandler()" }, properties: { "class.kbq-app-switcher_open": "isOpen", "class.kbq-active": "hasClickTrigger && isOpen" } }, exportAs: ["kbqAppSwitcher"], usesInheritance: true, ngImport: i0 }); }
|
|
400
|
+
}
|
|
401
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: KbqAppSwitcherTrigger, decorators: [{
|
|
402
|
+
type: Directive,
|
|
403
|
+
args: [{
|
|
404
|
+
standalone: true,
|
|
405
|
+
selector: '[kbqAppSwitcher]',
|
|
406
|
+
exportAs: 'kbqAppSwitcher',
|
|
407
|
+
host: {
|
|
408
|
+
'[class.kbq-app-switcher_open]': 'isOpen',
|
|
409
|
+
'[class.kbq-active]': 'hasClickTrigger && isOpen',
|
|
410
|
+
'(keydown)': 'keydownHandler($event)',
|
|
411
|
+
'(touchend)': 'touchendHandler()'
|
|
412
|
+
}
|
|
413
|
+
}]
|
|
414
|
+
}], propDecorators: { selectedApp: [{
|
|
415
|
+
type: Input
|
|
416
|
+
}], placement: [{
|
|
417
|
+
type: Input,
|
|
418
|
+
args: ['kbqAppSwitcherPlacement']
|
|
419
|
+
}], backdropClass: [{
|
|
420
|
+
type: Input
|
|
421
|
+
}], offset: [{
|
|
422
|
+
type: Input,
|
|
423
|
+
args: [{ transform: numberAttribute }]
|
|
424
|
+
}], sites: [{
|
|
425
|
+
type: Input
|
|
426
|
+
}], apps: [{
|
|
427
|
+
type: Input
|
|
428
|
+
}], groupBy: [{
|
|
429
|
+
type: Input
|
|
430
|
+
}], selectedSite: [{
|
|
431
|
+
type: Input
|
|
432
|
+
}], disabled: [{
|
|
433
|
+
type: Input,
|
|
434
|
+
args: [{ transform: booleanAttribute }]
|
|
435
|
+
}], placementChange: [{
|
|
436
|
+
type: Output,
|
|
437
|
+
args: ['kbqPlacementChange']
|
|
438
|
+
}], visibleChange: [{
|
|
439
|
+
type: Output,
|
|
440
|
+
args: ['kbqVisibleChange']
|
|
441
|
+
}], selectedSiteChange: [{
|
|
442
|
+
type: Output
|
|
443
|
+
}], selectedAppChange: [{
|
|
444
|
+
type: Output
|
|
445
|
+
}] } });
|
|
446
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXN3aXRjaGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcG9uZW50cy9hcHAtc3dpdGNoZXIvYXBwLXN3aXRjaGVyLnRzIiwiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcG9uZW50cy9hcHAtc3dpdGNoZXIvYXBwLXN3aXRjaGVyLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUdILE9BQU8sRUFHVixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxFQUdILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDWixjQUFjLEVBQ2QsS0FBSyxFQUVMLE1BQU0sRUFHTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixNQUFNLEVBQ04sZUFBZSxFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQ0gsa0JBQWtCLEVBQ2xCLGVBQWUsRUFDZixRQUFRLEVBQ1IsZUFBZSxFQUNmLG1CQUFtQixFQUNuQixlQUFlLEVBQ2YsVUFBVSxFQUNWLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsY0FBYyxFQUNqQixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxN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ckIscUJBQXFCLDRNQThEVixlQUFlLHNIQWlHZixnQkFBZ0I7OzRGQS9KM0IscUJBQXFCO2tCQVhqQyxTQUFTO21CQUFDO29CQUNQLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsa0JBQWtCO29CQUM1QixRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixJQUFJLEVBQUU7d0JBQ0YsK0JBQStCLEVBQUUsUUFBUTt3QkFDekMsb0JBQW9CLEVBQUUsMkJBQTJCO3dCQUNqRCxXQUFXLEVBQUUsd0JBQXdCO3dCQUNyQyxZQUFZLEVBQUUsbUJBQW1CO3FCQUNwQztpQkFDSjs4QkFzRFksV0FBVztzQkFBbkIsS0FBSztnQkFHNEIsU0FBUztzQkFBMUMsS0FBSzt1QkFBQyx5QkFBeUI7Z0JBR3ZCLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR2lDLE1BQU07c0JBQTVDLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQUlqQyxLQUFLO3NCQURSLEtBQUs7Z0JBdUJGLElBQUk7c0JBRFAsS0FBSztnQkFzQ0YsT0FBTztzQkFEVixLQUFLO2dCQW1CRixZQUFZO3NCQURmLEtBQUs7Z0JBa0JGLFFBQVE7c0JBRFgsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFtQkMsZUFBZTtzQkFBckQsTUFBTTt1QkFBQyxvQkFBb0I7Z0JBR1MsYUFBYTtzQkFBakQsTUFBTTt1QkFBQyxrQkFBa0I7Z0JBR1Asa0JBQWtCO3NCQUFwQyxNQUFNO2dCQUVZLGlCQUFpQjtzQkFBbkMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge1xuICAgIENka1Njcm9sbGFibGUsXG4gICAgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5LFxuICAgIE92ZXJsYXksXG4gICAgT3ZlcmxheUNvbmZpZyxcbiAgICBTY3JvbGxTdHJhdGVneVxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIEpzb25QaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBEaXJlY3RpdmUsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdGlvblRva2VuLFxuICAgIElucHV0LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVHlwZSxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb24sXG4gICAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgICBpbmplY3QsXG4gICAgbnVtYmVyQXR0cmlidXRlXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgS2JxQmFkZ2VNb2R1bGUgfSBmcm9tICdAa29vYmlxL2NvbXBvbmVudHMvYmFkZ2UnO1xuaW1wb3J0IHtcbiAgICBLQlFfTE9DQUxFX1NFUlZJQ0UsXG4gICAgS2JxT3B0aW9uTW9kdWxlLFxuICAgIEticVBvcFVwLFxuICAgIEticVBvcFVwVHJpZ2dlcixcbiAgICBQT1NJVElPTl9UT19DU1NfTUFQLFxuICAgIFBvcFVwUGxhY2VtZW50cyxcbiAgICBQb3BVcFNpemVzLFxuICAgIFBvcFVwVHJpZ2dlcnMsXG4gICAgYXBwbHlQb3B1cE1hcmdpbnMsXG4gICAgcnVSVUxvY2FsZURhdGFcbn0gZnJvbSAnQGtvb2JpcS9jb21wb25lbnRzL2NvcmUnO1xuaW1wb3J0IHsgS2JxRGl2aWRlck1vZHVsZSB9IGZyb20gJ0Brb29iaXEvY29tcG9uZW50cy9kaXZpZGVyJztcbmltcG9ydCB7IEticURyb3Bkb3duTW9kdWxlLCBLYnFEcm9wZG93blRyaWdnZXIgfSBmcm9tICdAa29vYmlxL2NvbXBvbmVudHMvZHJvcGRvd24nO1xuaW1wb3J0IHsgS2JxRm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGtvb2JpcS9jb21wb25lbnRzL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgS2JxSWNvbk1vZHVsZSB9IGZyb20gJ0Brb29iaXEvY29tcG9uZW50cy9pY29uJztcbmltcG9ydCB7IEticUlucHV0LCBLYnFJbnB1dE1vZHVsZSB9IGZyb20gJ0Brb29iaXEvY29tcG9uZW50cy9pbnB1dCc7XG5pbXBvcnQgeyBkZWZhdWx0T2Zmc2V0WVdpdGhBcnJvdyB9IGZyb20gJ0Brb29iaXEvY29tcG9uZW50cy9wb3BvdmVyJztcbmltcG9ydCB7IEticVNjcm9sbGJhck1vZHVsZSB9IGZyb20gJ0Brb29iaXEvY29tcG9uZW50cy9zY3JvbGxiYXInO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBtZXJnZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsga2JxQXBwU3dpdGNoZXJBbmltYXRpb25zIH0gZnJvbSAnLi9hcHAtc3dpdGNoZXItYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBLYnFBcHBTd2l0Y2hlckRyb3Bkb3duQXBwIH0gZnJvbSAnLi9hcHAtc3dpdGNoZXItZHJvcGRvd24tYXBwJztcbmltcG9ydCB7IEticUFwcFN3aXRjaGVyRHJvcGRvd25TaXRlIH0gZnJvbSAnLi9hcHAtc3dpdGNoZXItZHJvcGRvd24tc2l0ZSc7XG5pbXBvcnQgeyBLYnFBcHBTd2l0Y2hlckxpc3RJdGVtIH0gZnJvbSAnLi9rYnEtYXBwLXN3aXRjaGVyLWxpc3QtaXRlbSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2JxQXBwU3dpdGNoZXJBcHAge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHR5cGU/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgaWNvbjogc3RyaW5nO1xuICAgIGNhcHRpb24/OiBzdHJpbmc7XG4gICAgYWxpYXNlcz86IEticUFwcFN3aXRjaGVyQXBwW107XG4gICAgbGluaz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBLYnFBcHBTd2l0Y2hlclNpdGUge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHN0YXR1cz86IHN0cmluZztcbiAgICBpY29uPzogc3RyaW5nO1xuICAgIGFwcHM6IEticUFwcFN3aXRjaGVyQXBwW107XG59XG5cbi8qKiBAZG9jcy1wcml2YXRlICovXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdEdyb3VwQnkoXG4gICAgYXBwOiBLYnFBcHBTd2l0Y2hlckFwcCxcbiAgICBncm91cHM6IFJlY29yZDxzdHJpbmcsIEticUFwcFN3aXRjaGVyQXBwPixcbiAgICB1bnR5cGVkOiBLYnFBcHBTd2l0Y2hlckFwcFtdXG4pIHtcbiAgICBpZiAoIWFwcC50eXBlKSB7XG4gICAgICAgIHVudHlwZWQucHVzaChhcHApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGFwcFR5cGUgPSBhcHAudHlwZS50b1N0cmluZygpO1xuXG4gICAgICAgIGlmIChncm91cHNbYXBwVHlwZV0pIHtcbiAgICAgICAgICAgIGdyb3Vwc1thcHBUeXBlXS5hbGlhc2VzIS5wdXNoKGFwcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBncm91cHNbYXBwVHlwZV0gPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogYXBwVHlwZSxcbiAgICAgICAgICAgICAgICBhbGlhc2VzOiBbYXBwXSxcbiAgICAgICAgICAgICAgICBpY29uOiBhcHAuaWNvbixcbiAgICAgICAgICAgICAgICBpZDogJydcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBLQlFfTUlOX05VTUJFUl9PRl9BUFBTX1RPX0VOQUJMRV9TRUFSQ0g6IG51bWJlciA9IDc7XG5leHBvcnQgY29uc3QgS0JRX01JTl9OVU1CRVJfT0ZfQVBQU19UT19FTkFCTEVfR1JPVVBJTkc6IG51bWJlciA9IDM7XG5cbi8qKiBAZG9jcy1wcml2YXRlICovXG5leHBvcnQgY29uc3QgS0JRX0FQUF9TV0lUQ0hFUl9TQ1JPTExfU1RSQVRFR1kgPSBuZXcgSW5qZWN0aW9uVG9rZW48KCkgPT4gU2Nyb2xsU3RyYXRlZ3k+KFxuICAgICdrYnEtYXBwLXN3aXRjaGVyLXNjcm9sbC1zdHJhdGVneSdcbik7XG5cbi8qKiBAZG9jcy1wcml2YXRlICovXG5leHBvcnQgZnVuY3Rpb24ga2JxQXBwU3dpdGNoZXJTY3JvbGxTdHJhdGVneUZhY3Rvcnkob3ZlcmxheTogT3ZlcmxheSk6ICgpID0+IFNjcm9sbFN0cmF0ZWd5IHtcbiAgICByZXR1cm4gKCkgPT4gb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oeyBzY3JvbGxUaHJvdHRsZTogMjAgfSk7XG59XG5cbi8qKiBAZG9jcy1wcml2YXRlICovXG5leHBvcnQgY29uc3QgS0JRX0FQUF9TV0lUQ0hFUl9TQ1JPTExfU1RSQVRFR1lfRkFDVE9SWV9QUk9WSURFUiA9IHtcbiAgICBwcm92aWRlOiBLQlFfQVBQX1NXSVRDSEVSX1NDUk9MTF9TVFJBVEVHWSxcbiAgICBkZXBzOiBbT3ZlcmxheV0sXG4gICAgdXNlRmFjdG9yeToga2JxQXBwU3dpdGNoZXJTY3JvbGxTdHJhdGVneUZhY3Rvcnlcbn07XG5cbi8qKiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgYXBwLXN3aXRjaGVyICovXG4vKiogQGRvY3MtcHJpdmF0ZSAqL1xuZXhwb3J0IGNvbnN0IEtCUV9BUFBfU1dJVENIRVJfREVGQVVMVF9DT05GSUdVUkFUSU9OID0gcnVSVUxvY2FsZURhdGEuYXBwU3dpdGNoZXI7XG5cbi8qKiBJbmplY3Rpb24gVG9rZW4gZm9yIHByb3ZpZGluZyBjb25maWd1cmF0aW9uIG9mIGFwcC1zd2l0Y2hlciAqL1xuLyoqIEBkb2NzLXByaXZhdGUgKi9cbmV4cG9ydCBjb25zdCBLQlFfQVBQX1NXSVRDSEVSX0NPTkZJR1VSQVRJT04gPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0ticUFwcFN3aXRjaGVyQ29uZmlndXJhdGlvbicpO1xuXG4vKiogQGRvY3MtcHJpdmF0ZSAqL1xuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ2ticS1hcHAtc3dpdGNoZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9hcHAtc3dpdGNoZXIuaHRtbCcsXG4gICAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gICAgc3R5bGVVcmxzOiBbJy4vYXBwLXN3aXRjaGVyLnNjc3MnXSxcbiAgICBob3N0OiB7XG4gICAgICAgIGNsYXNzOiAna2JxLWFwcC1zd2l0Y2hlcidcbiAgICB9LFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBBc3luY1BpcGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBLYnFGb3JtRmllbGRNb2R1bGUsXG4gICAgICAgIEticUlucHV0TW9kdWxlLFxuICAgICAgICBLYnFJY29uTW9kdWxlLFxuICAgICAgICBLYnFEaXZpZGVyTW9kdWxlLFxuICAgICAgICBLYnFCYWRnZU1vZHVsZSxcbiAgICAgICAgS2JxRHJvcGRvd25Nb2R1bGUsXG4gICAgICAgIEticVNjcm9sbGJhck1vZHVsZSxcbiAgICAgICAgS2JxT3B0aW9uTW9kdWxlLFxuICAgICAgICBLYnFBcHBTd2l0Y2hlckRyb3Bkb3duQXBwLFxuICAgICAgICBLYnFBcHBTd2l0Y2hlckRyb3Bkb3duU2l0ZSxcbiAgICAgICAgS2JxQXBwU3dpdGNoZXJMaXN0SXRlbSxcbiAgICAgICAgSnNvblBpcGVcbiAgICBdLFxuICAgIGFuaW1hdGlvbnM6IFtrYnFBcHBTd2l0Y2hlckFuaW1hdGlvbnMuc3RhdGVdXG59KVxuZXhwb3J0IGNsYXNzIEticUFwcFN3aXRjaGVyQ29tcG9uZW50IGV4dGVuZHMgS2JxUG9wVXAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBsb2NhbGVTZXJ2aWNlID0gaW5qZWN0KEtCUV9MT0NBTEVfU0VSVklDRSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAgIHJlYWRvbmx5IGV4dGVybmFsQ29uZmlndXJhdGlvbiA9IGluamVjdChLQlFfQVBQX1NXSVRDSEVSX0NPTkZJR1VSQVRJT04sIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgICBjb25maWd1cmF0aW9uO1xuXG4gICAgLyoqIGxvY2FsaXplZCBkYXRhXG4gICAgICogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIGdldCBsb2NhbGVEYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uO1xuICAgIH1cblxuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgcmVhZG9ubHkgc2VhcmNoQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG5cbiAgICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIGZpbHRlcmVkU2l0ZXM6IEticUFwcFN3aXRjaGVyU2l0ZVtdO1xuXG4gICAgLyoqIEBkb2NzLXByaXZhdGUgKi9cbiAgICBwcmVmaXggPSAna2JxLWFwcC1zd2l0Y2hlcic7XG5cbiAgICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIHRyaWdnZXI6IEticUFwcFN3aXRjaGVyVHJpZ2dlcjtcblxuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgaXNUcmFwRm9jdXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgcHJvdGVjdGVkIGFjdGl2ZVNpdGU6IEticUFwcFN3aXRjaGVyU2l0ZTtcbiAgICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIHByb3RlY3RlZCBhY3RpdmVBcHA6IEticUFwcFN3aXRjaGVyQXBwO1xuXG4gICAgLyoqIEBkb2NzLXByaXZhdGUgKi9cbiAgICBAVmlld0NoaWxkKEticUlucHV0KSBpbnB1dDogS2JxSW5wdXQ7XG4gICAgLyoqIEBkb2NzLXByaXZhdGUgKi9cbiAgICBAVmlld0NoaWxkKCdvdGhlclNpdGVzJykgb3RoZXJTaXRlczogS2JxRHJvcGRvd25UcmlnZ2VyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5sb2NhbGVTZXJ2aWNlPy5jaGFuZ2VzLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpLnN1YnNjcmliZSh0aGlzLnVwZGF0ZUxvY2FsZVBhcmFtcyk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmxvY2FsZVNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdERlZmF1bHRQYXJhbXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmlzaWJsZUNoYW5nZS5zdWJzY3JpYmUoKHN0YXRlKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vZmZzZXQgIT09IG51bGwgJiYgc3RhdGUpIHtcbiAgICAgICAgICAgICAgICBhcHBseVBvcHVwTWFyZ2lucyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJlZml4LFxuICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLm9mZnNldCEudG9TdHJpbmcoKX1weGBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnNlYXJjaENvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+ICh0aGlzLmZpbHRlcmVkU2l0ZXMgPSB0aGlzLmZpbHRlclNpdGVzKHZhbHVlKSkpO1xuICAgIH1cblxuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgdXBkYXRlQ2xhc3NNYXAocGxhY2VtZW50OiBzdHJpbmcsIGN1c3RvbUNsYXNzOiBzdHJpbmcsIHNpemU6IFBvcFVwU2l6ZXMpIHtcbiAgICAgICAgc3VwZXIudXBkYXRlQ2xhc3NNYXAocGxhY2VtZW50LCBjdXN0b21DbGFzcywgeyBbYCR7dGhpcy5wcmVmaXh9XyR7c2l6ZX1gXTogISFzaXplIH0pO1xuICAgIH1cblxuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgdXBkYXRlVHJhcEZvY3VzKGlzVHJhcEZvY3VzOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNUcmFwRm9jdXMgPSBpc1RyYXBGb2N1cztcbiAgICB9XG5cbiAgICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIGVzY2FwZUhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMuaGlkZSgwKTtcbiAgICB9XG5cbiAgICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIHNlbGVjdEFwcEluU2l0ZShzaXRlOiBLYnFBcHBTd2l0Y2hlclNpdGUsIGFwcDogS2JxQXBwU3dpdGNoZXJBcHApIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyLnNlbGVjdGVkU2l0ZSA9IHNpdGU7XG4gICAgICAgIHRoaXMudHJpZ2dlci5zZWxlY3RlZEFwcCA9IGFwcDtcblxuICAgICAgICB0aGlzLnRyaWdnZXIuc2VsZWN0ZWRTaXRlQ2hhbmdlLmVtaXQoc2l0ZSk7XG4gICAgICAgIHRoaXMudHJpZ2dlci5zZWxlY3RlZEFwcENoYW5nZS5lbWl0KGFwcCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaWx0ZXJTaXRlcyhxdWVyeTogc3RyaW5nIHwgbnVsbCk6IEticUFwcFN3aXRjaGVyU2l0ZVtdIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWRTaXRlcyA9IHN0cnVjdHVyZWRDbG9uZSh0aGlzLnRyaWdnZXIub3JpZ2luYWxTaXRlcyk7XG5cbiAgICAgICAgcmV0dXJuIHF1ZXJ5XG4gICAgICAgICAgICA/IGZpbHRlcmVkU2l0ZXMuZmlsdGVyKChzaXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZEFwcHMgPSBzaXRlLmFwcHMuZmlsdGVyKChhcHApID0+IGFwcC5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnkudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyZWRBcHBzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgIHNpdGUuYXBwcyA9IGZpbHRlcmVkQXBwcztcblxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IGZpbHRlcmVkU2l0ZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVMb2NhbGVQYXJhbXMgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IHRoaXMuZXh0ZXJuYWxDb25maWd1cmF0aW9uIHx8IHRoaXMubG9jYWxlU2VydmljZT8uZ2V0UGFyYW1zKCdhcHBTd2l0Y2hlcicpO1xuXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgaW5pdERlZmF1bHRQYXJhbXMoKSB7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IEtCUV9BUFBfU1dJVENIRVJfREVGQVVMVF9DT05GSUdVUkFUSU9OO1xuICAgIH1cbn1cblxuQERpcmVjdGl2ZSh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ1trYnFBcHBTd2l0Y2hlcl0nLFxuICAgIGV4cG9ydEFzOiAna2JxQXBwU3dpdGNoZXInLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ1tjbGFzcy5rYnEtYXBwLXN3aXRjaGVyX29wZW5dJzogJ2lzT3BlbicsXG4gICAgICAgICdbY2xhc3Mua2JxLWFjdGl2ZV0nOiAnaGFzQ2xpY2tUcmlnZ2VyICYmIGlzT3BlbicsXG4gICAgICAgICcoa2V5ZG93biknOiAna2V5ZG93bkhhbmRsZXIoJGV2ZW50KScsXG4gICAgICAgICcodG91Y2hlbmQpJzogJ3RvdWNoZW5kSGFuZGxlcigpJ1xuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgS2JxQXBwU3dpdGNoZXJUcmlnZ2VyXG4gICAgZXh0ZW5kcyBLYnFQb3BVcFRyaWdnZXI8S2JxQXBwU3dpdGNoZXJDb21wb25lbnQ+XG4gICAgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkluaXRcbntcbiAgICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIHByb3RlY3RlZCBzY3JvbGxTdHJhdGVneTogKCkgPT4gU2Nyb2xsU3RyYXRlZ3kgPSBpbmplY3QoS0JRX0FQUF9TV0lUQ0hFUl9TQ1JPTExfU1RSQVRFR1kpO1xuXG4gICAgLy8gbm90IHVzZWRcbiAgICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIGFycm93OiBib29sZWFuID0gZmFsc2U7XG4gICAgLyoqIEBkb2NzLXByaXZhdGUgKi9cbiAgICBjdXN0b21DbGFzczogc3RyaW5nO1xuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgcHJpdmF0ZSBoYXNCYWNrZHJvcDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgcHJpdmF0ZSBzaXplOiBQb3BVcFNpemVzID0gUG9wVXBTaXplcy5NZWRpdW07XG4gICAgLyoqIEBkb2NzLXByaXZhdGUgKi9cbiAgICBjb250ZW50OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgaGVhZGVyOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgZm9vdGVyOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgcHJpdmF0ZSBjbG9zZU9uU2Nyb2xsOiBudWxsO1xuXG4gICAgLyoqIFdoZXRoZXIgc2VhcmNoIGlzIHVzZWQgb3Igbm90ICovXG4gICAgZ2V0IHdpdGhTZWFyY2goKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcHNDb3VudCA+IEtCUV9NSU5fTlVNQkVSX09GX0FQUFNfVE9fRU5BQkxFX1NFQVJDSDtcbiAgICB9XG5cbiAgICAvKiogTnVtYmVyIG9mIGFwcGxpY2F0aW9ucyB0byBjaG9vc2UgZnJvbVxuICAgICAqIEBkb2NzLXByaXZhdGUgKi9cbiAgICBnZXQgYXBwc0NvdW50KCk6IG51bWJlciB7XG4gICAgICAgIGlmICh0aGlzLnNpdGVzTW9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxTaXRlcy5yZWR1Y2UoKGFjYywgc2l0ZSkgPT4gYWNjICsgc2l0ZS5hcHBzLmxlbmd0aCwgMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbEFwcHMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIHRoZSBzaXRlcyBhcmUgdXNlZCBvciBub3RcbiAgICAgKiBAZG9jcy1wcml2YXRlICovXG4gICAgZ2V0IHNpdGVzTW9kZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxTaXRlcz8ubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKiogV2hldGhlciB0aGUgc2l0ZXMgYXJlIHVzZWQgb3Igbm90XG4gICAgICogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIGdldCBjdXJyZW50QXBwcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l0ZXNNb2RlID8gdGhpcy5zZWxlY3RlZFNpdGUuYXBwcyA6IHRoaXMuX3BhcnNlZEFwcHM7XG4gICAgfVxuXG4gICAgLyoqIFNlbGVjdGVkIGFwcGxpY2F0aW9uICovXG4gICAgQElucHV0KCkgc2VsZWN0ZWRBcHA6IEticUFwcFN3aXRjaGVyQXBwO1xuXG4gICAgLyoqIFBsYWNlbWVudCBvZiBwb3BVcCAqL1xuICAgIEBJbnB1dCgna2JxQXBwU3dpdGNoZXJQbGFjZW1lbnQnKSBwbGFjZW1lbnQ6IFBvcFVwUGxhY2VtZW50cyA9IFBvcFVwUGxhY2VtZW50cy5Cb3R0b21MZWZ0O1xuXG4gICAgLyoqIENsYXNzIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBiYWNrZ3JvdW5kICovXG4gICAgQElucHV0KCkgYmFja2Ryb3BDbGFzczogc3RyaW5nID0gJ2Nkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wJztcblxuICAgIC8qKiBPZmZzZXQgb2YgcG9wVXAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBvZmZzZXQ6IG51bWJlciB8IG51bGwgPSBkZWZhdWx0T2Zmc2V0WVdpdGhBcnJvdztcblxuICAgIC8qKiBBcnJheSBvZiBzaXRlcyAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHNpdGVzKCk6IEticUFwcFN3aXRjaGVyU2l0ZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlZFNpdGVzO1xuICAgIH1cblxuICAgIHNldCBzaXRlcyh2YWx1ZTogS2JxQXBwU3dpdGNoZXJTaXRlW10pIHtcbiAgICAgICAgdGhpcy5vcmlnaW5hbFNpdGVzID0gdmFsdWU7XG5cbiAgICAgICAgdGhpcy5fcGFyc2VkU2l0ZXMgPSBbXTtcblxuICAgICAgICB2YWx1ZS5mb3JFYWNoKChzaXRlOiBLYnFBcHBTd2l0Y2hlclNpdGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1NpdGU6IEticUFwcFN3aXRjaGVyU2l0ZSA9IHsgLi4uc2l0ZSwgYXBwczogW10gfTtcblxuICAgICAgICAgICAgbmV3U2l0ZS5hcHBzID0gdGhpcy5tYWtlR3JvdXBzRm9yQXBwcyhzaXRlLmFwcHMsIEtCUV9NSU5fTlVNQkVSX09GX0FQUFNfVE9fRU5BQkxFX0dST1VQSU5HKTtcblxuICAgICAgICAgICAgdGhpcy5fcGFyc2VkU2l0ZXMucHVzaChuZXdTaXRlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VkU2l0ZXM6IEticUFwcFN3aXRjaGVyU2l0ZVtdO1xuXG4gICAgLyoqIEFycmF5IG9mIGFwcGxpY2F0aW9ucyAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGFwcHMoKTogS2JxQXBwU3dpdGNoZXJBcHBbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJzZWRBcHBzO1xuICAgIH1cblxuICAgIHNldCBhcHBzKGFwcHM6IEticUFwcFN3aXRjaGVyQXBwW10pIHtcbiAgICAgICAgdGhpcy5vcmlnaW5hbEFwcHMgPSBhcHBzO1xuXG4gICAgICAgIHRoaXMuX3BhcnNlZEFwcHMgPSB0aGlzLm1ha2VHcm91cHNGb3JBcHBzKHRoaXMub3JpZ2luYWxBcHBzLCBLQlFfTUlOX05VTUJFUl9PRl9BUFBTX1RPX0VOQUJMRV9HUk9VUElORyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYWtlR3JvdXBzRm9yQXBwcyhhcHBzOiBLYnFBcHBTd2l0Y2hlckFwcFtdLCBtaW5BcHBzRm9yR3JvdXBpbmc6IG51bWJlcik6IEticUFwcFN3aXRjaGVyQXBwW10ge1xuICAgICAgICBjb25zdCBncm91cHM6IFJlY29yZDxzdHJpbmcsIEticUFwcFN3aXRjaGVyQXBwPiA9IHt9O1xuICAgICAgICBjb25zdCB1bnR5cGVkOiBLYnFBcHBTd2l0Y2hlckFwcFtdID0gW107XG4gICAgICAgIGNvbnN0IGdyb3VwZWRBcHBzOiBLYnFBcHBTd2l0Y2hlckFwcFtdID0gW107XG5cbiAgICAgICAgYXBwcy5mb3JFYWNoKChhcHApID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBCeShhcHAsIGdyb3VwcywgdW50eXBlZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC52YWx1ZXMoZ3JvdXBzKS5mb3JFYWNoKChncm91cCkgPT4ge1xuICAgICAgICAgICAgaWYgKGdyb3VwLmFsaWFzZXMgJiYgZ3JvdXAuYWxpYXNlcy5sZW5ndGggPiBtaW5BcHBzRm9yR3JvdXBpbmcpIHtcbiAgICAgICAgICAgICAgICBncm91cGVkQXBwcy5wdXNoKGdyb3VwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdW50eXBlZC5wdXNoKC4uLmdyb3VwLmFsaWFzZXMhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZ3JvdXBlZEFwcHMucHVzaCguLi51bnR5cGVkKTtcblxuICAgICAgICByZXR1cm4gZ3JvdXBlZEFwcHM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VkQXBwczogS2JxQXBwU3dpdGNoZXJBcHBbXTtcblxuICAgIC8qKiBGdW5jdGlvbiB0byBncm91cCB0aGUgYXBwcyBieSB0eXBlLiBUaGUgZmlyc3QgYXJndW1lbnQgaXMgYW4gYXBwIG9iamVjdCB3aXRoIHR5cGUuXG4gICAgICogVGhlIHNlY29uZCBpcyBhIGdyb3VwcyBvYmplY3QgYW5kIHRoaXJkIGlzIGFuIGFycmF5IGZvciB1bnR5cGVkIGFwcHMgKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCBncm91cEJ5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ3JvdXBCeTtcbiAgICB9XG5cbiAgICBzZXQgZ3JvdXBCeShcbiAgICAgICAgZm46IChhcHA6IEticUFwcFN3aXRjaGVyQXBwLCBncm91cHM6IFJlY29yZDxzdHJpbmcsIEticUFwcFN3aXRjaGVyQXBwPiwgdW50eXBlZDogS2JxQXBwU3dpdGNoZXJBcHBbXSkgPT4gdm9pZFxuICAgICkge1xuICAgICAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2dyb3VwQnkgPSBmbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9ncm91cEJ5ID0gZGVmYXVsdEdyb3VwQnk7XG5cbiAgICAvKiogU2VsZWN0ZWQgc2l0ZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHNlbGVjdGVkU2l0ZSgpOiBLYnFBcHBTd2l0Y2hlclNpdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2VkU2VsZWN0ZWRTaXRlO1xuICAgIH1cblxuICAgIHNldCBzZWxlY3RlZFNpdGUodmFsdWU6IEticUFwcFN3aXRjaGVyU2l0ZSkge1xuICAgICAgICBjb25zdCBvcmlnaW5WYWx1ZSA9IHRoaXMub3JpZ2luYWxTaXRlcy5maW5kKChzaXRlKSA9PiB2YWx1ZS5pZCA9PT0gc2l0ZS5pZCkgYXMgS2JxQXBwU3dpdGNoZXJTaXRlO1xuICAgICAgICBjb25zdCBuZXdTaXRlOiBLYnFBcHBTd2l0Y2hlclNpdGUgPSB7IC4uLm9yaWdpblZhbHVlLCBhcHBzOiBbXSB9O1xuXG4gICAgICAgIG5ld1NpdGUuYXBwcyA9IHRoaXMubWFrZUdyb3Vwc0ZvckFwcHMob3JpZ2luVmFsdWUuYXBwcywgS0JRX01JTl9OVU1CRVJfT0ZfQVBQU19UT19FTkFCTEVfR1JPVVBJTkcpO1xuXG4gICAgICAgIHRoaXMuX3BhcnNlZFNlbGVjdGVkU2l0ZSA9IG5ld1NpdGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VkU2VsZWN0ZWRTaXRlOiBLYnFBcHBTd2l0Y2hlclNpdGU7XG5cbiAgICAvKiogV2hldGhlciB0aGUgdHJpZ2dlciBpcyBkaXNhYmxlZC4gKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgICB9XG5cbiAgICBzZXQgZGlzYWJsZWQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuXG4gICAgICAgIGlmICh0aGlzLl9kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIGdldCBoYXNDbGlja1RyaWdnZXIoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyaWdnZXIuaW5jbHVkZXMoUG9wVXBUcmlnZ2Vycy5DbGljayk7XG4gICAgfVxuXG4gICAgLyoqIEVtaXRzIGEgY2hhbmdlIGV2ZW50IHdoZW5ldmVyIHRoZSBwbGFjZW1lbnQgc3RhdGUgY2hhbmdlcy4gKi9cbiAgICBAT3V0cHV0KCdrYnFQbGFjZW1lbnRDaGFuZ2UnKSByZWFkb25seSBwbGFjZW1lbnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKiogRW1pdHMgYSBjaGFuZ2UgZXZlbnQgd2hlbmV2ZXIgdGhlIHZpc2libGUgc3RhdGUgY2hhbmdlcy4gKi9cbiAgICBAT3V0cHV0KCdrYnFWaXNpYmxlQ2hhbmdlJykgcmVhZG9ubHkgdmlzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHNlbGVjdGVkU2l0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8S2JxQXBwU3dpdGNoZXJTaXRlPigpO1xuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHNlbGVjdGVkQXBwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxLYnFBcHBTd2l0Y2hlckFwcD4oKTtcblxuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgdHJpZ2dlcjogc3RyaW5nID0gYCR7UG9wVXBUcmlnZ2Vycy5DbGlja30sICR7UG9wVXBUcmlnZ2Vycy5LZXlkb3dufWA7XG5cbiAgICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIG9yaWdpbmFsU2l0ZXM6IEticUFwcFN3aXRjaGVyU2l0ZVtdO1xuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgb3JpZ2luYWxBcHBzOiBLYnFBcHBTd2l0Y2hlckFwcFtdO1xuXG4gICAgLyoqIEBkb2NzLXByaXZhdGUgKi9cbiAgICBwcm90ZWN0ZWQgb3JpZ2luU2VsZWN0b3IgPSAnLmticS1hcHAtc3dpdGNoZXInO1xuXG4gICAgLyoqIEBkb2NzLXByaXZhdGUgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IG92ZXJsYXlDb25maWcoKTogT3ZlcmxheUNvbmZpZyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYW5lbENsYXNzOiAna2JxLWFwcC1zd2l0Y2hlcl9fcGFuZWwnLFxuICAgICAgICAgICAgaGFzQmFja2Ryb3A6IHRoaXMuaGFzQmFja2Ryb3AsXG4gICAgICAgICAgICBiYWNrZHJvcENsYXNzOiB0aGlzLmJhY2tkcm9wQ2xhc3NcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIHByb3RlY3RlZCBwcmV2ZW50Q2xvc2luZ0J5SW5uZXJTY3JvbGxTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgICAgIHRoaXMuc2Nyb2xsYWJsZVxuICAgICAgICAgICAgPy5lbGVtZW50U2Nyb2xsZWQoKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHRoaXMuaGlkZUlmTm90SW5WaWV3UG9ydCk7XG4gICAgfVxuXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jbG9zZU9uU2Nyb2xsID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbERpc3BhdGNoZXIuc2Nyb2xsZWQoKS5zdWJzY3JpYmUoKHNjcm9sbGFibGU6IENka1Njcm9sbGFibGUgfCB2b2lkKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFzY3JvbGxhYmxlPy5nZXRFbGVtZW50UmVmKCkubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2ticS1oaWRlLW5lc3RlZC1wb3B1cCcpKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRSZWN0cyA9IHNjcm9sbGFibGUuZ2V0RWxlbWVudFJlZigpLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRSZWN0cyA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkUmVjdHMuYm90dG9tIDwgcGFyZW50UmVjdHMudG9wIHx8IGNoaWxkUmVjdHMudG9wID4gcGFyZW50UmVjdHMuYm90dG9tKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52aXNpYmxlQ2hhbmdlLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgodmlzaWJsZTogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgaWYgKHZpc2libGUpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcnhqcy9uby1uZXN0ZWQtc3Vic2NyaWJlXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2ZW50Q2xvc2luZ0J5SW5uZXJTY3JvbGxTdWJzY3JpcHRpb24gPSB0aGlzLmNsb3NpbmdBY3Rpb25zKCkuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRbJ3Njcm9sbERpc3BhdGNoZXInXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRbJ2ticVBvcG92ZXJQcmV2ZW50SGlkZSddID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Wyd0eXBlJ10gPSAnY2xpY2snO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucHJldmVudENsb3NpbmdCeUlubmVyU2Nyb2xsU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIHVwZGF0ZURhdGEoKSB7XG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuaW5zdGFuY2UuaGVhZGVyID0gdGhpcy5oZWFkZXI7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UuY29udGVudCA9IHRoaXMuY29udGVudDtcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5hcnJvdyA9IHRoaXMuYXJyb3c7XG4gICAgICAgIHRoaXMuaW5zdGFuY2Uub2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UuZm9vdGVyID0gdGhpcy5mb290ZXI7XG5cbiAgICAgICAgdGhpcy5pbnN0YW5jZS51cGRhdGVUcmFwRm9jdXModGhpcy50cmlnZ2VyICE9PSBQb3BVcFRyaWdnZXJzLkZvY3VzKTtcblxuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24odHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVXBkYXRlcyB0aGUgY3VycmVudCBwb3NpdGlvbi5cbiAgICAgKiBAZG9jcy1wcml2YXRlICovXG4gICAgdXBkYXRlUG9zaXRpb24ocmVhcHBseVBvc2l0aW9uOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5jcmVhdGVPdmVybGF5KCk7XG5cbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSAodGhpcy5vdmVybGF5UmVmLmdldENvbmZpZygpLnBvc2l0aW9uU3RyYXRlZ3kgYXMgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5KVxuICAgICAgICAgICAgLndpdGhQb3NpdGlvbnModGhpcy5nZXRBZGp1c3RlZFBvc2l0aW9ucygpKVxuICAgICAgICAgICAgLndpdGhQdXNoKHRydWUpO1xuXG4gICAgICAgIGlmIChyZWFwcGx5UG9zaXRpb24pIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcG9zaXRpb24ucmVhcHBseUxhc3RQb3NpdGlvbigpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgZ2V0T3ZlcmxheUhhbmRsZUNvbXBvbmVudFR5cGUoKTogVHlwZTxLYnFBcHBTd2l0Y2hlckNvbXBvbmVudD4ge1xuICAgICAgICByZXR1cm4gS2JxQXBwU3dpdGNoZXJDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLyoqIEBkb2NzLXByaXZhdGUgKi9cbiAgICB1cGRhdGVDbGFzc01hcChuZXdQbGFjZW1lbnQ6IHN0cmluZyA9IHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuaW5zdGFuY2UudXBkYXRlQ2xhc3NNYXAoUE9TSVRJT05fVE9fQ1NTX01BUFtuZXdQbGFjZW1lbnRdLCB0aGlzLmN1c3RvbUNsYXNzLCB0aGlzLnNpemUpO1xuICAgICAgICB0aGlzLmluc3RhbmNlLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgY2xvc2luZ0FjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiBtZXJnZShcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZiEub3V0c2lkZVBvaW50ZXJFdmVudHMoKSxcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZiEuYmFja2Ryb3BDbGljaygpLFxuICAgICAgICAgICAgdGhpcy5zY3JvbGxEaXNwYXRjaGVyLnNjcm9sbGVkKClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhpZGVJZk5vdEluVmlld1BvcnQgPSAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zY3JvbGxhYmxlKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gdGhpcy5zY3JvbGxhYmxlLmdldEVsZW1lbnRSZWYoKS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgcmVjdC5ib3R0b20gPj0gY29udGFpbmVyUmVjdC50b3AgJiZcbiAgICAgICAgICAgICAgICByZWN0LnJpZ2h0ID49IGNvbnRhaW5lclJlY3QubGVmdCAmJlxuICAgICAgICAgICAgICAgIHJlY3QudG9wIDw9IGNvbnRhaW5lclJlY3QuYm90dG9tICYmXG4gICAgICAgICAgICAgICAgcmVjdC5sZWZ0IDw9IGNvbnRhaW5lclJlY3QucmlnaHRcbiAgICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCJAaWYgKHRyaWdnZXIud2l0aFNlYXJjaCkge1xuICAgIDxkaXYgY2xhc3M9XCJrYnEtYXBwLXN3aXRjaGVyX19zZWFyY2gtY29udGFpbmVyXCIgKG1vdXNlZW50ZXIpPVwib3RoZXJTaXRlcz8uY2xvc2UoKVwiPlxuICAgICAgICA8a2JxLWZvcm0tZmllbGQgbm9Cb3JkZXJzPlxuICAgICAgICAgICAgPGkga2JxLWljb249XCJrYnEtbWFnbmlmeWluZy1nbGFzc18xNlwiIGticVByZWZpeD48L2k+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgIGticUlucHV0XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyBsb2NhbGVEYXRhLnNlYXJjaFBsYWNlaG9sZGVyIH19XCJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwic2VhcmNoQ29udHJvbFwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24uZXNjYXBlKT1cImVzY2FwZUhhbmRsZXIoKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGticS1jbGVhbmVyIC8+XG4gICAgICAgIDwva2JxLWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG5cbiAgICA8a2JxLWRpdmlkZXIgLz5cbn1cblxuPGRpdiBrYnEtc2Nyb2xsYmFyPlxuICAgIEBpZiAoIXNlYXJjaENvbnRyb2wuZ2V0UmF3VmFsdWUoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwia2JxLWFwcC1zd2l0Y2hlcl9fYXBwLWNvbnRhaW5lclwiIChtb3VzZWVudGVyKT1cIm90aGVyU2l0ZXM/LmNsb3NlKClcIj5cbiAgICAgICAgICAgIEBpZiAodHJpZ2dlci5zaXRlc01vZGUpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2JxLWFwcC1zd2l0Y2hlci1ncm91cC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImticS1hcHAtc3dpdGNoZXItZ3JvdXAtaGVhZGVyX190ZXh0XCI+e3sgdHJpZ2dlci5zZWxlY3RlZFNpdGU/Lm5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGlmICh0cmlnZ2VyLnNlbGVjdGVkU2l0ZT8uc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8a2JxLWJhZGdlIGNsYXNzPVwia2JxLWFwcC1zd2l0Y2hlci1ncm91cC1oZWFkZXJfX2JhZGdlXCIgW2NvbXBhY3RdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRyaWdnZXIuc2VsZWN0ZWRTaXRlLnN0YXR1cyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9rYnEtYmFkZ2U+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPGticS1kcm9wZG93biBbY2xhc3NdPVwiJ2ticS1hcHAtc3dpdGNoZXItc2l0ZXMnXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBrYnFEcm9wZG93blN0YXRpY0NvbnRlbnQgY2xhc3M9XCJrYnEtYXBwLXN3aXRjaGVyLXNpdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoYXBwIG9mIHRyaWdnZXIuY3VycmVudEFwcHM7IHRyYWNrIGFwcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghYXBwLmFsaWFzZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrYnEtYXBwLXN3aXRjaGVyLWxpc3QtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPVwie3sgYXBwLmxpbmsgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mua2JxLXNlbGVjdGVkXT1cImFwcC5pZCA9PT0gdHJpZ2dlci5zZWxlY3RlZEFwcD8uaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXBwXT1cImFwcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0b2dnbGVdPVwiISFhcHAuYWxpYXNlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2FwcFN3aXRjaGVyQXBwPVwia2JxQXBwU3dpdGNoZXJBcHBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrYnEtYXBwLXN3aXRjaGVyLWxpc3QtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXBwXT1cImFwcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0b2dnbGVdPVwiISFhcHAuYWxpYXNlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghYXBwU3dpdGNoZXJBcHAuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGFsaWFzIG9mIGFwcC5hbGlhc2VzOyB0cmFjayBhbGlhcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImticS1hcHAtc3dpdGNoZXItc2l0ZV9uZXN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGticS1hcHAtc3dpdGNoZXItbGlzdC1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj1cInt7IGFsaWFzLmxpbmsgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5rYnEtc2VsZWN0ZWRdPVwiYWxpYXMuaWQgPT09IHRyaWdnZXIuc2VsZWN0ZWRBcHA/LmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXBwXT1cImFsaWFzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwva2JxLWRyb3Bkb3duPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICBAaWYgKHRyaWdnZXIuc2l0ZXNNb2RlKSB7XG4gICAgICAgICAgICA8a2JxLWRpdmlkZXIgLz5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImticS1hcHAtc3dpdGNoZXJfX3NpdGVzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrYnEtYXBwLXN3aXRjaGVyLWdyb3VwLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2JxLWFwcC1zd2l0Y2hlci1ncm91cC1oZWFkZXJfX3RleHRcIj57eyBsb2NhbGVEYXRhLnNpdGVzSGVhZGVyIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8a2JxLWRyb3Bkb3duICNvdGhlclNpdGVzPVwia2JxRHJvcGRvd25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBrYnFEcm9wZG93blN0YXRpY0NvbnRlbnQgY2xhc3M9XCJrYnEtYXBwLXN3aXRjaGVyLXNpdGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChzaXRlIG9mIHRyaWdnZXIuc2l0ZXM7IHRyYWNrIHNpdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHNpdGUuaWQgIT09IHRyaWdnZXIuc2VsZWN0ZWRTaXRlPy5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBba2JxLWFwcC1zd2l0Y2hlci1kcm9wZG93bi1zaXRlXT1cInNpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ticURyb3Bkb3duVHJpZ2dlckZvcl09XCJkcm9wZG93bldpdGhTZWxlY3RlZFNpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29mZnNldFhdPVwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJhY3RpdmVTaXRlID0gc2l0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwva2JxLWRyb3Bkb3duPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxrYnEtZHJvcGRvd24gI2Ryb3Bkb3duV2l0aFNlbGVjdGVkU2l0ZT1cImticURyb3Bkb3duXCIgW2NsYXNzXT1cIidrYnEtYXBwLXN3aXRjaGVyLXNpdGVzJ1wiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGFwcCBvZiBhY3RpdmVTaXRlPy5hcHBzOyB0cmFjayBhcHApIHtcbiAgICAgICAgICAgICAgICAgICAgQGlmIChhcHAuYWxpYXNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICNkcm9wZG93bldpdGhHcm91cGVkQXBwc1RyaWdnZXI9XCJrYnFEcm9wZG93blRyaWdnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtrYnEtYXBwLXN3aXRjaGVyLWRyb3Bkb3duLWFwcF09XCJhcHBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtrYnFEcm9wZG93blRyaWdnZXJGb3JdPVwiZHJvcGRvd25XaXRoR3JvdXBlZEFwcHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvZmZzZXRYXT1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5rYnEtcHJlc3NlZF09XCJkcm9wZG93bldpdGhHcm91cGVkQXBwc1RyaWdnZXIub3BlbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJhY3RpdmVBcHAgPSBhcHBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj1cInt7IGFwcC5saW5rIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBba2JxLWFwcC1zd2l0Y2hlci1kcm9wZG93bi1hcHBdPVwiYXBwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0QXBwSW5TaXRlKGFjdGl2ZVNpdGUsIGFwcClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwva2JxLWRyb3Bkb3duPlxuXG4gICAgICAgICAgICA8a2JxLWRyb3Bkb3duICNkcm9wZG93bldpdGhHcm91cGVkQXBwcz1cImticURyb3Bkb3duXCIgW2NsYXNzXT1cIidrYnEtYXBwLXN3aXRjaGVyLXNpdGVzJ1wiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGFsaWFzIG9mIGFjdGl2ZUFwcD8uYWxpYXNlczsgdHJhY2sgYWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XCJ7eyBhbGlhcy5saW5rIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtrYnEtYXBwLXN3aXRjaGVyLWRyb3Bkb3duLWFwcF09XCJhbGlhc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0QXBwSW5TaXRlKGFjdGl2ZVNpdGUsIGFsaWFzKVwiXG4gICAgICAgICAgICAgICAgICAgID48L2E+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9rYnEtZHJvcGRvd24+XG4gICAgICAgIH1cbiAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImticS1hcHAtc3dpdGNoZXJfX3NlYXJjaC1yZXN1bHRcIj5cbiAgICAgICAgICAgIDxrYnEtZHJvcGRvd24gW2NsYXNzXT1cIidrYnEtYXBwLXN3aXRjaGVyLXNpdGVzJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYga2JxRHJvcGRvd25TdGF0aWNDb250ZW50IGNsYXNzPVwia2JxLWFwcC1zd2l0Y2hlci1zaXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKHNpdGUgb2YgZmlsdGVyZWRTaXRlczsgdHJhY2sgc2l0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChzaXRlLmFwcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8a2JxLW9wdGdyb3VwIGxhYmVsPVwie3sgc2l0ZS5uYW1lIH19XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoYXBwIG9mIHNpdGUuYXBwczsgdHJhY2sgYXBwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEga2JxLWFwcC1zd2l0Y2hlci1saXN0LWl0ZW0gaHJlZj1cInt7IGFwcC5saW5rIH19XCIgW2FwcF09XCJhcHBcIj48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gQGVtcHR5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrYnEtYXBwLXN3aXRjaGVyX19lbXB0eS1zZWFyY2gtcmVzdWx0XCI+e3sgbG9jYWxlRGF0YS5zZWFyY2hFbXB0eVJlc3VsdCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2ticS1kcm9wZG93bj5cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuPC9kaXY+XG4iXX0=
|