@elderbyte/ngx-starter 18.11.0 → 18.12.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/_index.scss +38 -33
- package/esm2022/lib/common/arrays.mjs +1 -1
- package/esm2022/lib/common/async/public_api.mjs +1 -1
- package/esm2022/lib/common/async/refreshing-entity.mjs +5 -3
- package/esm2022/lib/common/csv/csv-serializer.mjs +5 -5
- package/esm2022/lib/common/csv/csv-spec.mjs +2 -2
- package/esm2022/lib/common/csv/public_api.mjs +1 -1
- package/esm2022/lib/common/data/continuable-listing.mjs +1 -1
- package/esm2022/lib/common/data/data-context/data-context-active-page.mjs +5 -4
- package/esm2022/lib/common/data/data-context/data-context-auto-starter.mjs +7 -5
- package/esm2022/lib/common/data/data-context/data-context-base.mjs +19 -12
- package/esm2022/lib/common/data/data-context/data-context-builder.mjs +5 -7
- package/esm2022/lib/common/data/data-context/data-context-continuable-base.mjs +5 -7
- package/esm2022/lib/common/data/data-context/data-context-continuable-paged.mjs +2 -2
- package/esm2022/lib/common/data/data-context/data-context-continuable-token.mjs +17 -7
- package/esm2022/lib/common/data/data-context/data-context-life-cycle-binding.mjs +2 -2
- package/esm2022/lib/common/data/data-context/data-context-simple.mjs +5 -4
- package/esm2022/lib/common/data/data-context/data-context-source-event-binding.mjs +25 -8
- package/esm2022/lib/common/data/data-context/data-context-status.mjs +1 -1
- package/esm2022/lib/common/data/data-context/data-context.mjs +5 -5
- package/esm2022/lib/common/data/data-context/indexed-entities.mjs +2 -2
- package/esm2022/lib/common/data/data-context/mat-table-data-context-binding.mjs +14 -8
- package/esm2022/lib/common/data/data-context/public_api.mjs +1 -1
- package/esm2022/lib/common/data/datasource/data-source-adapter.mjs +9 -5
- package/esm2022/lib/common/data/datasource/data-source-base.mjs +1 -1
- package/esm2022/lib/common/data/datasource/data-source-change-event.mjs +20 -10
- package/esm2022/lib/common/data/datasource/data-source-processor.mjs +14 -15
- package/esm2022/lib/common/data/datasource/data-source.mjs +4 -4
- package/esm2022/lib/common/data/datasource/entity-id-util.mjs +2 -2
- package/esm2022/lib/common/data/datasource/fetcher/delegate-data-source.mjs +2 -2
- package/esm2022/lib/common/data/datasource/local/local-list-data-source.mjs +9 -11
- package/esm2022/lib/common/data/datasource/local/local-paged-data-source.mjs +4 -2
- package/esm2022/lib/common/data/datasource/patch/deep-partial-patcher.mjs +58 -0
- package/esm2022/lib/common/data/datasource/public_api.mjs +1 -1
- package/esm2022/lib/common/data/datasource/rest/public_api.mjs +1 -1
- package/esm2022/lib/common/data/datasource/rest/rest-client.mjs +44 -39
- package/esm2022/lib/common/data/entity-set-patch.mjs +6 -9
- package/esm2022/lib/common/data/field-comparator.mjs +2 -2
- package/esm2022/lib/common/data/filters/filter-commons.mjs +1 -1
- package/esm2022/lib/common/data/filters/filter-context.mjs +9 -9
- package/esm2022/lib/common/data/filters/filter-value.mjs +1 -1
- package/esm2022/lib/common/data/filters/filter.mjs +2 -2
- package/esm2022/lib/common/data/http-params-builder.mjs +5 -7
- package/esm2022/lib/common/data/page.mjs +1 -1
- package/esm2022/lib/common/data/public_api.mjs +1 -1
- package/esm2022/lib/common/data/required-filter-evaluator.mjs +7 -10
- package/esm2022/lib/common/data/sort-context.mjs +4 -6
- package/esm2022/lib/common/data/sort.mjs +1 -1
- package/esm2022/lib/common/data/token-chunk-request.mjs +1 -1
- package/esm2022/lib/common/enums/elder-enum-translation.service.mjs +9 -9
- package/esm2022/lib/common/enums/public_api.mjs +1 -1
- package/esm2022/lib/common/errors/exception-detail.mjs +1 -1
- package/esm2022/lib/common/errors/public_api.mjs +1 -1
- package/esm2022/lib/common/errors/standard-error-detail.mjs +1 -1
- package/esm2022/lib/common/format/bytes-format.mjs +2 -9
- package/esm2022/lib/common/format/bytes-per-second-format.mjs +1 -1
- package/esm2022/lib/common/format/curency-format-util.mjs +1 -1
- package/esm2022/lib/common/format/duration-format-util.mjs +1 -1
- package/esm2022/lib/common/format/iso-interval-format-util.mjs +6 -4
- package/esm2022/lib/common/format/public_api.mjs +1 -1
- package/esm2022/lib/common/forms/elder-entity-value-accessor.mjs +7 -7
- package/esm2022/lib/common/forms/elder-form-field-control-base.directive.mjs +7 -7
- package/esm2022/lib/common/forms/elder-from-field-base.mjs +3 -3
- package/esm2022/lib/common/forms/elder-from-field-customizable-base.mjs +1 -1
- package/esm2022/lib/common/forms/elder-from-field-entity-base.mjs +5 -5
- package/esm2022/lib/common/forms/elder-from-field-multi-entity-base.mjs +7 -7
- package/esm2022/lib/common/forms/elder-multi-entity-value-accessor.mjs +7 -7
- package/esm2022/lib/common/forms/form-field-base.component.mjs +3 -4
- package/esm2022/lib/common/forms/multi-model-base.component.mjs +2 -2
- package/esm2022/lib/common/forms/public_api.mjs +1 -1
- package/esm2022/lib/common/forms/template-composite-control.mjs +17 -13
- package/esm2022/lib/common/forms/value-accessor-base.mjs +3 -3
- package/esm2022/lib/common/forms/view-providers.mjs +1 -1
- package/esm2022/lib/common/http/http-client-builder.service.mjs +2 -2
- package/esm2022/lib/common/http/http-client-pristine.mjs +2 -2
- package/esm2022/lib/common/http/public_api.mjs +1 -1
- package/esm2022/lib/common/http/transfer/data-transfer-base.mjs +2 -2
- package/esm2022/lib/common/http/transfer/data-transfer-factory.mjs +4 -4
- package/esm2022/lib/common/http/transfer/data-transfer-progress-aggregate.mjs +6 -5
- package/esm2022/lib/common/http/transfer/data-transfer-progress.mjs +1 -1
- package/esm2022/lib/common/http/transfer/data-transfer-state.mjs +1 -1
- package/esm2022/lib/common/http/transfer/data-transfer-status.mjs +1 -1
- package/esm2022/lib/common/http/transfer/data-transfer.mjs +1 -1
- package/esm2022/lib/common/http/transfer/http-data-transfer.mjs +9 -9
- package/esm2022/lib/common/http/transfer/public_api.mjs +1 -1
- package/esm2022/lib/common/http/upload/file-upload-client.mjs +2 -2
- package/esm2022/lib/common/i18n/entity/impl/i18n-base.mjs +1 -1
- package/esm2022/lib/common/i18n/entity/impl/i18n-text.mjs +1 -1
- package/esm2022/lib/common/i18n/entity/impl/translated.mjs +1 -1
- package/esm2022/lib/common/i18n/entity/language-tag.mjs +1 -1
- package/esm2022/lib/common/i18n/entity/locale.mjs +1 -1
- package/esm2022/lib/common/i18n/entity/localisation-picker.mjs +4 -4
- package/esm2022/lib/common/i18n/entity/localized.mjs +1 -1
- package/esm2022/lib/common/i18n/entity/public_api.mjs +1 -1
- package/esm2022/lib/common/i18n/entity/translated-converter.mjs +4 -4
- package/esm2022/lib/common/i18n/entity/translated.mjs +1 -1
- package/esm2022/lib/common/i18n/public_api.mjs +1 -1
- package/esm2022/lib/common/json-map.mjs +3 -4
- package/esm2022/lib/common/objects.mjs +1 -1
- package/esm2022/lib/common/public_api.mjs +1 -1
- package/esm2022/lib/common/reactive-map.mjs +5 -5
- package/esm2022/lib/common/rxjs/operators/lazy-sample.mjs +2 -2
- package/esm2022/lib/common/rxjs/public_api.mjs +1 -1
- package/esm2022/lib/common/selection/public_api.mjs +1 -1
- package/esm2022/lib/common/selection/selection-model.mjs +8 -8
- package/esm2022/lib/common/sets.mjs +3 -2
- package/esm2022/lib/common/suggestion-provider.mjs +1 -1
- package/esm2022/lib/common/templates/template-slot-manager.mjs +2 -2
- package/esm2022/lib/common/theme-sizes.mjs +1 -1
- package/esm2022/lib/common/time/date-util.mjs +8 -10
- package/esm2022/lib/common/time/interval-coerce.mjs +3 -3
- package/esm2022/lib/common/time/interval.mjs +19 -16
- package/esm2022/lib/common/time/period-duration.mjs +1 -1
- package/esm2022/lib/common/time/public_api.mjs +1 -1
- package/esm2022/lib/common/time/temporal-plain-date-interval.mjs +1 -1
- package/esm2022/lib/common/time/temporal-util.mjs +7 -1
- package/esm2022/lib/common/time/time-util.mjs +3 -6
- package/esm2022/lib/common/url/elder-router.service.mjs +2 -2
- package/esm2022/lib/common/url/elder-url-fragment-params.service.mjs +4 -6
- package/esm2022/lib/common/url/public_api.mjs +1 -1
- package/esm2022/lib/common/url/url-query-params.mjs +2 -2
- package/esm2022/lib/common/utils/batcher.mjs +2 -2
- package/esm2022/lib/common/utils/collection-util.mjs +7 -5
- package/esm2022/lib/common/utils/filter-util.mjs +10 -8
- package/esm2022/lib/common/utils/focus-util.mjs +1 -1
- package/esm2022/lib/common/utils/input-utils.mjs +1 -1
- package/esm2022/lib/common/utils/next-number-util.mjs +4 -3
- package/esm2022/lib/common/utils/ng-zone-utils.mjs +2 -2
- package/esm2022/lib/common/utils/parse-util.mjs +1 -1
- package/esm2022/lib/common/utils/property-path-util.mjs +2 -2
- package/esm2022/lib/common/utils/public_api.mjs +1 -1
- package/esm2022/lib/common/utils/query-list-binding.mjs +5 -4
- package/esm2022/lib/common/utils/sort-util.mjs +2 -2
- package/esm2022/lib/common/utils/url-builder.mjs +1 -1
- package/esm2022/lib/common/utils/uuid-util.mjs +3 -4
- package/esm2022/lib/common/utils/value-wrapper.mjs +1 -1
- package/esm2022/lib/components/access-denied/elder-access-denied.component.mjs +4 -5
- package/esm2022/lib/components/access-denied/elder-access-denied.module.mjs +5 -15
- package/esm2022/lib/components/auditing/audited-entity/elder-audited-entity.component.mjs +16 -6
- package/esm2022/lib/components/auditing/elder-audit.module.mjs +4 -6
- package/esm2022/lib/components/auditing/i-audited-entity.mjs +1 -1
- package/esm2022/lib/components/badge/elder-badge/elder-badge.component.mjs +18 -12
- package/esm2022/lib/components/badge/elder-badge.directive.mjs +7 -7
- package/esm2022/lib/components/badge/elder-badge.module.mjs +4 -4
- package/esm2022/lib/components/button-group/elder-button-group/elder-button-group.component.mjs +3 -5
- package/esm2022/lib/components/button-group/elder-button-group.module.mjs +5 -20
- package/esm2022/lib/components/card-organizer/card-organizer/elder-card-organizer.component.mjs +4 -5
- package/esm2022/lib/components/card-organizer/card-organizer/elder-stack-card.directive.mjs +2 -2
- package/esm2022/lib/components/card-organizer/card-organizer-data.mjs +7 -7
- package/esm2022/lib/components/card-organizer/card-stack/elder-card-stack.component.mjs +24 -12
- package/esm2022/lib/components/card-organizer/card-stack.mjs +3 -3
- package/esm2022/lib/components/card-organizer/elder-card-organizer.module.mjs +18 -7
- package/esm2022/lib/components/cards/elder-card/elder-card-header/elder-card-header.component.mjs +3 -3
- package/esm2022/lib/components/cards/elder-card/elder-card.component.mjs +9 -9
- package/esm2022/lib/components/cards/elder-card/elder-card.module.mjs +16 -10
- package/esm2022/lib/components/chips/elder-chip-label.directive.mjs +3 -3
- package/esm2022/lib/components/chips/elder-chips.module.mjs +3 -5
- package/esm2022/lib/components/connectivity/elder-connectivity.module.mjs +9 -8
- package/esm2022/lib/components/connectivity/elder-connectivity.service.mjs +10 -12
- package/esm2022/lib/components/connectivity/offline-indicator/elder-offline-indicator.component.mjs +3 -3
- package/esm2022/lib/components/connectivity/public_api.mjs +1 -1
- package/esm2022/lib/components/containers/elder-containers.module.mjs +4 -10
- package/esm2022/lib/components/containers/elder-scroll-container/elder-scroll-container.component.mjs +4 -4
- package/esm2022/lib/components/containers/public_api.mjs +1 -1
- package/esm2022/lib/components/csv/elder-csv-export-btn/elder-csv-export-btn.component.mjs +6 -6
- package/esm2022/lib/components/csv/elder-csv-stream-exporter-builder.mjs +2 -4
- package/esm2022/lib/components/csv/elder-csv-stream-exporter-builder.service.mjs +2 -2
- package/esm2022/lib/components/csv/elder-csv-stream-exporter.mjs +12 -12
- package/esm2022/lib/components/csv/elder-csv.module.mjs +6 -19
- package/esm2022/lib/components/currency/elder-currency.module.mjs +6 -18
- package/esm2022/lib/components/currency/elder-currency.pipe.mjs +2 -2
- package/esm2022/lib/components/currency/model/currency-code.mjs +1 -1
- package/esm2022/lib/components/currency/model/currency-unit-registry.mjs +1 -1
- package/esm2022/lib/components/currency/model/currency-unit.mjs +1 -1
- package/esm2022/lib/components/currency/model/currency.mjs +1 -1
- package/esm2022/lib/components/currency/public_api.mjs +1 -1
- package/esm2022/lib/components/data-transfer/elder-data-transfer.module.mjs +28 -16
- package/esm2022/lib/components/data-transfer/elder-data-transfer.service.mjs +12 -10
- package/esm2022/lib/components/data-transfer/http-data-transfer/http-data-transfer.component.mjs +23 -12
- package/esm2022/lib/components/data-transfer/http-data-transfer-aggregate/http-data-transfer-aggregate.component.mjs +3 -3
- package/esm2022/lib/components/data-transfer/http-data-transfer-indicator/http-data-transfer-indicator.component.mjs +13 -3
- package/esm2022/lib/components/data-transfer/http-data-transfer-overview/http-data-transfer-overview.component.mjs +11 -3
- package/esm2022/lib/components/data-view/base/data-view-options-provider-binding.mjs +4 -2
- package/esm2022/lib/components/data-view/base/elder-data-view-base.mjs +4 -5
- package/esm2022/lib/components/data-view/base/elder-data-view-options-provider.mjs +1 -1
- package/esm2022/lib/components/data-view/base/elder-data-view-options.mjs +1 -1
- package/esm2022/lib/components/data-view/base/elder-data-view.mjs +1 -1
- package/esm2022/lib/components/data-view/base/public_api.mjs +1 -1
- package/esm2022/lib/components/data-view/common/composite-sort/composite-sort-context.mjs +2 -2
- package/esm2022/lib/components/data-view/common/composite-sort/composite-sort-dc.directive.mjs +5 -7
- package/esm2022/lib/components/data-view/common/composite-sort/composite-sort.mjs +4 -5
- package/esm2022/lib/components/data-view/common/composite-sort/elder-composite-sort/elder-composite-sort.component.mjs +6 -6
- package/esm2022/lib/components/data-view/common/data-context-state-indicator/data-context-state-indicator.component.mjs +4 -5
- package/esm2022/lib/components/data-view/common/elder-data-common.module.mjs +38 -20
- package/esm2022/lib/components/data-view/common/elder-data-toolbar/elder-data-toolbar.component.mjs +5 -13
- package/esm2022/lib/components/data-view/common/elder-single-sort/elder-single-sort.component.mjs +16 -6
- package/esm2022/lib/components/data-view/common/selection/data-context-selection.directive.mjs +6 -4
- package/esm2022/lib/components/data-view/common/selection/elder-selection-master-checkbox/elder-selection-master-checkbox.component.mjs +4 -5
- package/esm2022/lib/components/data-view/common/selection/master-selection-state.mjs +1 -1
- package/esm2022/lib/components/data-view/elder-data-view-interaction-mode.mjs +1 -1
- package/esm2022/lib/components/data-view/grid/elder-grid/elder-grid.component.mjs +46 -26
- package/esm2022/lib/components/data-view/grid/elder-grid.module.mjs +30 -21
- package/esm2022/lib/components/data-view/master-detail/elder-detail-dialog/elder-detail-dialog.component.mjs +15 -9
- package/esm2022/lib/components/data-view/master-detail/elder-detail.directive.mjs +5 -7
- package/esm2022/lib/components/data-view/master-detail/elder-master-activation.directive.mjs +8 -6
- package/esm2022/lib/components/data-view/master-detail/elder-master-detail-provider.mjs +2 -2
- package/esm2022/lib/components/data-view/master-detail/elder-master-detail.component.mjs +19 -25
- package/esm2022/lib/components/data-view/master-detail/elder-master-detail.module.mjs +4 -4
- package/esm2022/lib/components/data-view/master-detail/elder-master-detail.service.mjs +5 -4
- package/esm2022/lib/components/data-view/master-detail/elder-master.directive.mjs +2 -2
- package/esm2022/lib/components/data-view/master-detail/master-detail-activation-event.mjs +1 -1
- package/esm2022/lib/components/data-view/public_api.mjs +1 -1
- package/esm2022/lib/components/data-view/simple/elder-simple-selection-view/elder-simple-selection-view.component.mjs +4 -5
- package/esm2022/lib/components/data-view/simple/elder-simple-selection-view/elder-simple-selection-view.module.mjs +41 -16
- package/esm2022/lib/components/data-view/table/activation/activation-event-source.mjs +1 -1
- package/esm2022/lib/components/data-view/table/activation/elder-activation-context.mjs +1 -1
- package/esm2022/lib/components/data-view/table/activation/elder-delete-active.directive.mjs +6 -6
- package/esm2022/lib/components/data-view/table/activation/elder-table-activation-options.mjs +1 -1
- package/esm2022/lib/components/data-view/table/activation/elder-table-activation.directive.mjs +23 -15
- package/esm2022/lib/components/data-view/table/activation/item-activation-event.mjs +1 -1
- package/esm2022/lib/components/data-view/table/activation/item-activation-options.mjs +1 -1
- package/esm2022/lib/components/data-view/table/activation/public_api.mjs +1 -1
- package/esm2022/lib/components/data-view/table/elder-center-cell.directive.mjs +4 -5
- package/esm2022/lib/components/data-view/table/elder-number-cell.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/table/elder-paginator-intl.mjs +8 -7
- package/esm2022/lib/components/data-view/table/elder-table/elder-table-toolbar.directive.mjs +2 -2
- package/esm2022/lib/components/data-view/table/elder-table/elder-table.component.mjs +54 -38
- package/esm2022/lib/components/data-view/table/elder-table-column.directive.mjs +2 -2
- package/esm2022/lib/components/data-view/table/elder-table-extension.directive.mjs +6 -11
- package/esm2022/lib/components/data-view/table/elder-table-root.directive.mjs +4 -8
- package/esm2022/lib/components/data-view/table/elder-table-row.directive.mjs +8 -6
- package/esm2022/lib/components/data-view/table/elder-table-sort.directive.mjs +2 -2
- package/esm2022/lib/components/data-view/table/elder-table.module.mjs +57 -25
- package/esm2022/lib/components/data-view/table/model/elder-column-layout.mjs +7 -7
- package/esm2022/lib/components/data-view/table/model/elder-table-model-cdk-table-binding.mjs +15 -11
- package/esm2022/lib/components/data-view/table/model/elder-table-model-provider.mjs +4 -4
- package/esm2022/lib/components/data-view/table/model/elder-table-model-query-group.mjs +11 -9
- package/esm2022/lib/components/data-view/table/model/elder-table-model.mjs +7 -5
- package/esm2022/lib/components/dialogs/confirm-dialog/elder-confirm-dialog.component.mjs +13 -3
- package/esm2022/lib/components/dialogs/elder-dialog-config.mjs +1 -1
- package/esm2022/lib/components/dialogs/elder-dialog.module.mjs +34 -13
- package/esm2022/lib/components/dialogs/elder-dialog.service.mjs +19 -22
- package/esm2022/lib/components/dialogs/question-dialog/elder-question-dialog.component.mjs +17 -5
- package/esm2022/lib/components/dialogs/selection-dialog/elder-selection-dialog/elder-selection-dialog.component.mjs +4 -5
- package/esm2022/lib/components/dialogs/selection-dialog/elder-selection-dialog.directive.mjs +5 -5
- package/esm2022/lib/components/errors/elder-error.module.mjs +4 -6
- package/esm2022/lib/components/errors/error-util.mjs +4 -4
- package/esm2022/lib/components/errors/exception-detail/elder-exception-detail.component.mjs +17 -6
- package/esm2022/lib/components/expand-toggle-button/elder-expand-toggle-button.component.mjs +3 -3
- package/esm2022/lib/components/expand-toggle-button/elder-expand-toggle-button.module.mjs +15 -8
- package/esm2022/lib/components/files/blob-url.mjs +1 -1
- package/esm2022/lib/components/files/blob-viewer/elder-blob-viewer.component.mjs +16 -11
- package/esm2022/lib/components/files/drag-n-drop/elder-drop-zone/elder-drop-zone.component.mjs +3 -3
- package/esm2022/lib/components/files/drag-n-drop/global-drag-drop.service.mjs +4 -4
- package/esm2022/lib/components/files/elder-file-drop-zone.directive.mjs +7 -7
- package/esm2022/lib/components/files/elder-file-select-input.mjs +3 -3
- package/esm2022/lib/components/files/elder-file-select.directive.mjs +14 -16
- package/esm2022/lib/components/files/elder-file.module.mjs +16 -10
- package/esm2022/lib/components/files/file-select/file-select.component.mjs +5 -6
- package/esm2022/lib/components/files/file-system-api.mjs +2 -2
- package/esm2022/lib/components/files/file-upload/file-upload.component.mjs +16 -3
- package/esm2022/lib/components/files/listing/file-entry.mjs +3 -3
- package/esm2022/lib/components/files/listing/file-listing-rx.mjs +5 -5
- package/esm2022/lib/components/files/listing/file-listing-system-handle.mjs +3 -3
- package/esm2022/lib/components/files/listing/file-listing-webkit.mjs +10 -11
- package/esm2022/lib/components/forms/clipboard/elder-clipboard.service.mjs +2 -2
- package/esm2022/lib/components/forms/directives/base/elder-class-hostbinding-base.mjs +1 -1
- package/esm2022/lib/components/forms/directives/elder-clipboard-put.directive.mjs +5 -3
- package/esm2022/lib/components/forms/directives/elder-delayed-focus.directive.mjs +2 -2
- package/esm2022/lib/components/forms/directives/elder-form-field-dense.directive.mjs +1 -1
- package/esm2022/lib/components/forms/directives/elder-form-field-label.directive.mjs +2 -2
- package/esm2022/lib/components/forms/directives/elder-form-field-no-hint.directive.mjs +2 -2
- package/esm2022/lib/components/forms/directives/elder-form-field-no-spinner.directive.mjs +2 -2
- package/esm2022/lib/components/forms/directives/elder-forms-directives.module.mjs +13 -6
- package/esm2022/lib/components/forms/directives/elder-initial-value.directive.mjs +5 -5
- package/esm2022/lib/components/forms/directives/elder-input-pattern.directive.mjs +2 -2
- package/esm2022/lib/components/forms/directives/elder-key-event.directive.mjs +2 -2
- package/esm2022/lib/components/forms/directives/elder-next-focusable.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-plug-parent-form.directive.mjs +6 -6
- package/esm2022/lib/components/forms/directives/elder-stop-event-propagation.directive.mjs +2 -2
- package/esm2022/lib/components/forms/directives/elder-tab-focus-trap.directive.mjs +13 -10
- package/esm2022/lib/components/forms/directives/elder-touched.directive.mjs +2 -2
- package/esm2022/lib/components/forms/directives/elder-triple-state-checkbox.directive.mjs +4 -4
- package/esm2022/lib/components/forms/directives/validation/elder-validation-error.directive.mjs +5 -3
- package/esm2022/lib/components/forms/directives/validation/strategies/common-validation-message-strategy.mjs +2 -2
- package/esm2022/lib/components/forms/directives/validation/strategies/dynamic-validation-message-strategy.mjs +2 -2
- package/esm2022/lib/components/forms/directives/validation/strategies/fallback-validation-message-strategy.mjs +1 -1
- package/esm2022/lib/components/forms/directives/validation/validation-message-renderer.service.mjs +4 -6
- package/esm2022/lib/components/forms/directives/validation/validation-message-strategy.mjs +1 -1
- package/esm2022/lib/components/forms/directives/validation/validators/elder-max.validator.mjs +4 -9
- package/esm2022/lib/components/forms/directives/validation/validators/elder-min.validator.mjs +4 -9
- package/esm2022/lib/components/forms/directives/validation/validators/elder-multiple-of.validator.mjs +12 -11
- package/esm2022/lib/components/forms/directives/validation/validators/elder-required-ignore-zero.validator.mjs +4 -4
- package/esm2022/lib/components/forms/elder-forms.module.mjs +1 -1
- package/esm2022/lib/components/forms/public_api.mjs +1 -1
- package/esm2022/lib/components/forms/search/domain/context/search-context.mjs +7 -3
- package/esm2022/lib/components/forms/search/domain/context/search-context.service.mjs +2 -2
- package/esm2022/lib/components/forms/search/domain/input/input-value.mjs +1 -1
- package/esm2022/lib/components/forms/search/domain/input/search-input-state.mjs +2 -2
- package/esm2022/lib/components/forms/search/domain/input/search-input.mjs +1 -1
- package/esm2022/lib/components/forms/search/domain/input/simple-search-input.mjs +1 -1
- package/esm2022/lib/components/forms/search/domain/url/elder-search-url.directive.mjs +14 -8
- package/esm2022/lib/components/forms/search/domain/url/elder-search-url.service.mjs +15 -12
- package/esm2022/lib/components/forms/search/domain/url/search-query-params-parser.mjs +3 -3
- package/esm2022/lib/components/forms/search/elder-search-context.directive.mjs +30 -25
- package/esm2022/lib/components/forms/search/elder-search-input.directive.mjs +14 -19
- package/esm2022/lib/components/forms/search/elder-search.module.mjs +24 -13
- package/esm2022/lib/components/forms/search/filter/default-input-filter-converter.mjs +2 -4
- package/esm2022/lib/components/forms/search/filter/input-filter-converter.mjs +1 -1
- package/esm2022/lib/components/forms/search/search-box/elder-search-box.component.mjs +27 -8
- package/esm2022/lib/components/forms/search/search-box/elder-search-panel.component.mjs +4 -4
- package/esm2022/lib/components/global-search/elder-global-search.component.mjs +19 -10
- package/esm2022/lib/components/global-search/elder-global-search.module.mjs +24 -6
- package/esm2022/lib/components/global-search/elder-global-search.service.mjs +8 -6
- package/esm2022/lib/components/graph/elder-progress-bar/elder-progress-bar.component.mjs +6 -6
- package/esm2022/lib/components/graph/elder-progress-bar/elder-progress-bar.module.mjs +4 -10
- package/esm2022/lib/components/graph/elder-progress-bar/sub-bar.mjs +1 -1
- package/esm2022/lib/components/graph/public_api.mjs +1 -1
- package/esm2022/lib/components/headers/elder-header/elder-header.component.mjs +3 -3
- package/esm2022/lib/components/headers/elder-header.module.mjs +12 -14
- package/esm2022/lib/components/http-support/elder-http-client.service.mjs +4 -9
- package/esm2022/lib/components/http-support/public_api.mjs +1 -1
- package/esm2022/lib/components/i18n/entities/elder-i18n-entities.module.mjs +3 -3
- package/esm2022/lib/components/i18n/entities/elder-localized-input/elder-localized-input.component.mjs +31 -20
- package/esm2022/lib/components/i18n/entities/elder-localized-input-dialog/elder-localized-input-dialog.component.mjs +14 -5
- package/esm2022/lib/components/i18n/entities/elder-localized-input-dialog.service.mjs +4 -4
- package/esm2022/lib/components/i18n/entities/elder-localized-input-table/elder-localized-input-table.component.mjs +42 -19
- package/esm2022/lib/components/i18n/entities/elder-localized-text-column.directive.mjs +2 -2
- package/esm2022/lib/components/i18n/entities/elder-localized-texts.directive.mjs +4 -5
- package/esm2022/lib/components/i18n/entities/picker/i18n-pick-async.pipe.mjs +3 -3
- package/esm2022/lib/components/i18n/entities/picker/i18n-pick.pipe.mjs +2 -2
- package/esm2022/lib/components/i18n/entities/picker/localisation-picker.service.mjs +6 -6
- package/esm2022/lib/components/i18n/language/elder-language-config.mjs +1 -1
- package/esm2022/lib/components/i18n/language/elder-language-interceptor.mjs +8 -7
- package/esm2022/lib/components/i18n/language/elder-language.module.mjs +11 -10
- package/esm2022/lib/components/i18n/language/elder-language.service.mjs +3 -4
- package/esm2022/lib/components/i18n/language/language-switcher/elder-language-switcher.component.mjs +17 -5
- package/esm2022/lib/components/i18n/locales/elder-locales-de-ch.module.mjs +7 -7
- package/esm2022/lib/components/i18n/public_api.mjs +1 -1
- package/esm2022/lib/components/iframes/data-view/data-view-iframe/data-view-iframe.component.mjs +13 -13
- package/esm2022/lib/components/iframes/data-view/data-view-iframe-adapter.directive.mjs +13 -11
- package/esm2022/lib/components/iframes/elder-iframe.module.mjs +4 -4
- package/esm2022/lib/components/iframes/iframe-close.directive.mjs +2 -3
- package/esm2022/lib/components/iframes/iframe-dialog/iframe-dialog.component.mjs +3 -3
- package/esm2022/lib/components/iframes/iframe-host/iframe-host.component.mjs +12 -4
- package/esm2022/lib/components/iframes/iframe-messages.mjs +1 -1
- package/esm2022/lib/components/iframes/iframe-side-content/iframe-side-content.component.mjs +11 -9
- package/esm2022/lib/components/iframes/iframe.service.mjs +7 -5
- package/esm2022/lib/components/iframes/typed-event-message.mjs +1 -1
- package/esm2022/lib/components/infinitescroll/elder-infinite-autocomplete.directive.mjs +10 -6
- package/esm2022/lib/components/infinitescroll/elder-infinite-scroll.directive.mjs +12 -7
- package/esm2022/lib/components/infinitescroll/elder-infinite-scroll.module.mjs +4 -10
- package/esm2022/lib/components/input/autocomplete/elder-autocomplete/elder-autocomplete-option-selected.mjs +1 -1
- package/esm2022/lib/components/input/autocomplete/elder-autocomplete/elder-suggestion-panel.component.mjs +26 -17
- package/esm2022/lib/components/input/autocomplete/elder-autocomplete-many.directive.mjs +11 -7
- package/esm2022/lib/components/input/autocomplete/elder-autocomplete.directive.mjs +8 -6
- package/esm2022/lib/components/input/autocomplete/elder-autocomplete.module.mjs +9 -6
- package/esm2022/lib/components/input/autocomplete/many/word-position-finder.mjs +1 -1
- package/esm2022/lib/components/input/public_api.mjs +1 -1
- package/esm2022/lib/components/labels/elder-labels.module.mjs +26 -8
- package/esm2022/lib/components/labels/labels-input/labels-input.component.mjs +28 -11
- package/esm2022/lib/components/measures/dimensions/dimensions-input/elder-dimensions-input.component.mjs +22 -21
- package/esm2022/lib/components/measures/dimensions/validation/elder-required-dimensions.validator.mjs +4 -4
- package/esm2022/lib/components/measures/directives/elder-unit-select.directive.mjs +2 -2
- package/esm2022/lib/components/measures/elder-measures.module.mjs +7 -19
- package/esm2022/lib/components/measures/elder-quantity-transform.pipe.mjs +2 -2
- package/esm2022/lib/components/measures/elder-quantity.pipe.mjs +2 -2
- package/esm2022/lib/components/measures/elder-unit.service.mjs +4 -6
- package/esm2022/lib/components/measures/model/dimensions.mjs +1 -1
- package/esm2022/lib/components/measures/model/quantity.mjs +1 -1
- package/esm2022/lib/components/measures/model/unit-dimension.mjs +1 -1
- package/esm2022/lib/components/measures/model/unit-registry.mjs +1 -1
- package/esm2022/lib/components/measures/model/unit.mjs +1 -1
- package/esm2022/lib/components/measures/public_api.mjs +1 -1
- package/esm2022/lib/components/measures/quantity-input/quantity-form-field/elder-quantity-form-field.component.mjs +13 -3
- package/esm2022/lib/components/measures/quantity-input/quantity-input-control/elder-quantity-input-control.component.mjs +18 -16
- package/esm2022/lib/components/measures/quantity-input/validation/elder-quantity-range.validator.mjs +4 -8
- package/esm2022/lib/components/measures/quantity-input/validation/elder-required-quantity.validator.mjs +4 -8
- package/esm2022/lib/components/measures/util/elder-quantity.service.mjs +15 -10
- package/esm2022/lib/components/navigation/bread-crumbs/bread-crumbs/elder-bread-crumbs.component.mjs +26 -6
- package/esm2022/lib/components/navigation/bread-crumbs/elder-bread-crumbs.module.mjs +12 -8
- package/esm2022/lib/components/navigation/bread-crumbs/path/path.mjs +1 -1
- package/esm2022/lib/components/navigation/nav/elder-nav.module.mjs +26 -20
- package/esm2022/lib/components/navigation/nav/nav-group/elder-nav-group.component.mjs +15 -21
- package/esm2022/lib/components/navigation/nav/nav-link/elder-nav-link.component.mjs +20 -7
- package/esm2022/lib/components/navigation/nav/nav-list/elder-nav-list.component.mjs +3 -3
- package/esm2022/lib/components/navigation/public_api.mjs +1 -1
- package/esm2022/lib/components/navigation/toolbar/elder-toolbar-column.directive.mjs +2 -2
- package/esm2022/lib/components/navigation/toolbar/elder-toolbar.module.mjs +26 -20
- package/esm2022/lib/components/navigation/toolbar/elder-toolbar.service.mjs +2 -2
- package/esm2022/lib/components/navigation/toolbar/toolbar/elder-toolbar.component.mjs +12 -7
- package/esm2022/lib/components/navigation/toolbar/toolbar-column-position.mjs +1 -1
- package/esm2022/lib/components/navigation/toolbar/toolbar-title/elder-toolbar-title.component.mjs +4 -5
- package/esm2022/lib/components/navigation/toolbar/toolbar-title/elder-toolbar-title.service.mjs +5 -4
- package/esm2022/lib/components/overlays/elder-overlay-origin.directive.mjs +2 -2
- package/esm2022/lib/components/overlays/elder-overlay-ref.mjs +1 -1
- package/esm2022/lib/components/overlays/elder-overlay-trigger.directive.mjs +3 -3
- package/esm2022/lib/components/overlays/elder-overlay.component.mjs +23 -14
- package/esm2022/lib/components/overlays/elder-overlay.module.mjs +4 -10
- package/esm2022/lib/components/page/exit-guard/page-exit-guard.module.mjs +5 -12
- package/esm2022/lib/components/page/exit-guard/page-exit-guard.service.mjs +6 -6
- package/esm2022/lib/components/page/exit-guard/page-exit-lock/page-exit-lock.component.mjs +3 -5
- package/esm2022/lib/components/page/exit-guard/page-exit-lock-indicator/page-exit-lock-indicator.component.mjs +3 -8
- package/esm2022/lib/components/page/exit-guard/page-exit-lock-overview/page-exit-lock-overview.component.mjs +3 -7
- package/esm2022/lib/components/panels/card-panel/elder-card-panel.component.mjs +3 -3
- package/esm2022/lib/components/panels/elder-dialog-panel/elder-dialog-panel.component.mjs +3 -3
- package/esm2022/lib/components/panels/elder-panel.module.mjs +10 -7
- package/esm2022/lib/components/panels/flat/elder-panel.component.mjs +4 -4
- package/esm2022/lib/components/panels/toggle-panel/elder-toggle-panel-trigger.directive.mjs +2 -2
- package/esm2022/lib/components/panels/toggle-panel/elder-toggle-panel.component.mjs +6 -6
- package/esm2022/lib/components/public_api.mjs +1 -1
- package/esm2022/lib/components/scrollbar/elder-scrollbar.directive.mjs +2 -2
- package/esm2022/lib/components/scrollbar/elder-scrollbar.module.mjs +2 -2
- package/esm2022/lib/components/select/auto/elder-auto-select-first.directive.mjs +5 -8
- package/esm2022/lib/components/select/auto/elder-auto-select-first.service.mjs +1 -1
- package/esm2022/lib/components/select/auto/elder-auto-select-suggest-first.directive.mjs +7 -9
- package/esm2022/lib/components/select/auto/elder-select-first-util.mjs +7 -4
- package/esm2022/lib/components/select/elder-select-base.mjs +12 -13
- package/esm2022/lib/components/select/elder-select-chip.directive.mjs +4 -4
- package/esm2022/lib/components/select/elder-select-on-tab.directive.mjs +10 -5
- package/esm2022/lib/components/select/elder-select-value.directive.mjs +2 -2
- package/esm2022/lib/components/select/elder-select.module.mjs +65 -29
- package/esm2022/lib/components/select/filter/elder-chip-filter-style-resolver.mjs +9 -9
- package/esm2022/lib/components/select/filter/elder-chips-include-exclude.directive.mjs +19 -15
- package/esm2022/lib/components/select/filter/elder-filter-chip-template/elder-filter-chip-template.component.mjs +3 -3
- package/esm2022/lib/components/select/filter/include-exclude-model-filter-adapter.mjs +6 -8
- package/esm2022/lib/components/select/filter/include-exclude-selection-model.mjs +7 -11
- package/esm2022/lib/components/select/multi/elder-chip-select-option/elder-select-option.component.mjs +2 -3
- package/esm2022/lib/components/select/multi/elder-multi-select-base.mjs +29 -27
- package/esm2022/lib/components/select/multi/elder-multi-select-chip-options/chip-options-provider.mjs +12 -10
- package/esm2022/lib/components/select/multi/elder-multi-select-chip-options/elder-multi-select-chip-options.component.mjs +40 -29
- package/esm2022/lib/components/select/multi/elder-multi-select-chip-options/select-option-chip-spec.mjs +4 -4
- package/esm2022/lib/components/select/multi/elder-multi-select-chips/elder-multi-select-chips.component.mjs +41 -21
- package/esm2022/lib/components/select/multi/elder-multi-select-chips/select-chip-spec.mjs +4 -4
- package/esm2022/lib/components/select/multi/elder-multi-select-form-field.mjs +2 -2
- package/esm2022/lib/components/select/multi/elder-mutli-select-all-directive.mjs +7 -8
- package/esm2022/lib/components/select/multi/elder-search-include-exclude.directive.mjs +8 -10
- package/esm2022/lib/components/select/popup/selection-model-popup-trigger-adapter.directive.mjs +7 -5
- package/esm2022/lib/components/select/popup/selection-model-popup.directive.mjs +13 -13
- package/esm2022/lib/components/select/popup/templated-selection-dialog/templated-selection-dialog.component.mjs +15 -5
- package/esm2022/lib/components/select/public_api.mjs +1 -1
- package/esm2022/lib/components/select/single/elder-clear-select.directive.mjs +5 -3
- package/esm2022/lib/components/select/single/elder-select/elder-select.component.mjs +39 -29
- package/esm2022/lib/components/select/single/elder-select-form-field.mjs +1 -1
- package/esm2022/lib/components/select-chip-list/chip-list-select/elder-chip-list-select.component.mjs +11 -12
- package/esm2022/lib/components/select-chip-list/elder-chip-list-select.module.mjs +3 -5
- package/esm2022/lib/components/shell/drawers/drawer-outlet-binding.mjs +8 -4
- package/esm2022/lib/components/shell/drawers/elder-route-outlet-drawer.service.mjs +6 -4
- package/esm2022/lib/components/shell/drawers/elder-router-outlet.service.mjs +7 -7
- package/esm2022/lib/components/shell/elder-shell-slot.directive.mjs +2 -2
- package/esm2022/lib/components/shell/elder-shell.module.mjs +10 -7
- package/esm2022/lib/components/shell/elder-shell.service.mjs +6 -9
- package/esm2022/lib/components/shell/header/elder-app-header/elder-app-header.component.mjs +6 -6
- package/esm2022/lib/components/shell/shell/elder-shell.component.mjs +34 -14
- package/esm2022/lib/components/shell/shell-content-slot.mjs +1 -1
- package/esm2022/lib/components/shell/shell-navigation-toggle/elder-shell-navigation-toggle.component.mjs +5 -5
- package/esm2022/lib/components/tabs/elder-tab/elder-tab.directive.mjs +2 -2
- package/esm2022/lib/components/tabs/elder-tab-group-routing/elder-tab-group-routing.directive.mjs +12 -12
- package/esm2022/lib/components/tabs/elder-tab.module.mjs +4 -14
- package/esm2022/lib/components/theme/elder-theme-applier.directive.mjs +5 -6
- package/esm2022/lib/components/theme/elder-theme-preference.service.mjs +3 -4
- package/esm2022/lib/components/theme/elder-theme-toggle/elder-theme-toggle.component.mjs +6 -7
- package/esm2022/lib/components/theme/elder-theme.directive.mjs +5 -3
- package/esm2022/lib/components/theme/elder-theme.module.mjs +9 -15
- package/esm2022/lib/components/theme/elder-theme.service.mjs +7 -9
- package/esm2022/lib/components/theme/known-elder-themes.mjs +1 -1
- package/esm2022/lib/components/theme/public_api.mjs +1 -1
- package/esm2022/lib/components/theme/theme-spec.mjs +3 -7
- package/esm2022/lib/components/time/date-adapters/custom-date-adapter.mjs +1 -1
- package/esm2022/lib/components/time/date-formats/locale-date-formats.mjs +2 -2
- package/esm2022/lib/components/time/duration/duration-bucket.mjs +3 -2
- package/esm2022/lib/components/time/duration/duration-format.mjs +1 -1
- package/esm2022/lib/components/time/duration/elder-duration-input/elder-duration-input.component.mjs +6 -12
- package/esm2022/lib/components/time/duration/iso-duration-str.mjs +1 -1
- package/esm2022/lib/components/time/elder-date-switcher/elder-date-switcher.component.mjs +13 -7
- package/esm2022/lib/components/time/elder-date-time-input/elder-date-time-input.component.mjs +7 -13
- package/esm2022/lib/components/time/elder-interval-input/elder-interval-input.component.mjs +27 -27
- package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker-binding.directive.mjs +1 -1
- package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker-toggle/elder-interval-picker-toggle.component.mjs +15 -18
- package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker.component.mjs +8 -11
- package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker.service.mjs +16 -11
- package/esm2022/lib/components/time/elder-local-date-input/elder-local-date-input.component.mjs +22 -13
- package/esm2022/lib/components/time/elder-local-time-input/elder-local-time-input.component.mjs +7 -13
- package/esm2022/lib/components/time/elder-time.module.mjs +29 -21
- package/esm2022/lib/components/time/period/elder-period-input/elder-period-input.component.mjs +6 -12
- package/esm2022/lib/components/time/period/period-bucket.mjs +1 -1
- package/esm2022/lib/components/time/period/period-format.mjs +1 -1
- package/esm2022/lib/components/time/pipes/to-iso-date-string.pipe.mjs +2 -2
- package/esm2022/lib/components/time/public_api.mjs +1 -1
- package/esm2022/lib/components/toasts/elder-toast.module.mjs +18 -4
- package/esm2022/lib/components/toasts/elder-toast.service.mjs +9 -10
- package/esm2022/lib/components/toasts/standard-toast/standard-toast.component.mjs +21 -14
- package/esm2022/lib/components/toasts/toast-type.mjs +1 -1
- package/esm2022/lib/components/toasts/toast.mjs +1 -1
- package/esm2022/lib/components/url-fragment/elder-url-fragment.mjs +1 -1
- package/esm2022/lib/components/url-fragment/elder-url-fragment.module.mjs +3 -5
- package/esm2022/lib/components/url-fragment/url-fragment-switcher/elder-url-fragment-switcher.component.mjs +16 -5
- package/esm2022/lib/components/viewers/elder-svg-viewer/elder-svg-viewer.component.mjs +3 -4
- package/esm2022/lib/components/viewers/elder-viewers.module.mjs +4 -10
- package/esm2022/lib/features/event-source/fetch/public_api.mjs +1 -1
- package/esm2022/lib/features/event-source/fetch/reactive-fetch-event-source.mjs +14 -14
- package/esm2022/lib/features/event-source/fetch/reactive-fetch-event-source.service.mjs +2 -2
- package/esm2022/lib/features/event-source/public_api.mjs +1 -1
- package/esm2022/lib/features/event-source/standard/elder-event-source.service.mjs +2 -2
- package/esm2022/lib/features/event-source/standard/public_api.mjs +1 -1
- package/esm2022/lib/features/event-source/standard/reactive-event-source.mjs +8 -7
- package/esm2022/lib/features/kafent/access-token-provider.mjs +1 -1
- package/esm2022/lib/features/kafent/kafent-config.mjs +1 -1
- package/esm2022/lib/features/kafent/kafent-event-stream.mjs +1 -1
- package/esm2022/lib/features/kafent/kafent-event.mjs +1 -1
- package/esm2022/lib/features/kafent/kafent-event.service.mjs +16 -8
- package/esm2022/lib/features/kafent/kafent-live-event-request.mjs +1 -1
- package/esm2022/lib/features/kafent/kafent.module.mjs +10 -13
- package/esm2022/lib/features/kafent/sse/kafent-event-stream-sse.service.mjs +12 -9
- package/esm2022/lib/features/kafent/sse/kafent-topic-sse.mjs +2 -3
- package/esm2022/lib/features/public_api.mjs +1 -1
- package/esm2022/lib/pipes/bytes.pipe.mjs +2 -2
- package/esm2022/lib/pipes/elder-pipes.module.mjs +52 -8
- package/esm2022/lib/pipes/elder-repeat.pipe.mjs +2 -2
- package/esm2022/lib/pipes/elder-round.pipe.mjs +2 -2
- package/esm2022/lib/pipes/elder-safe-url.pipe.mjs +2 -2
- package/esm2022/lib/pipes/elder-truncate.pipe.mjs +3 -3
- package/esm2022/lib/pipes/iso-duration.pipe.mjs +2 -2
- package/esm2022/lib/pipes/iso-interval-parse.pipe.mjs +4 -5
- package/esm2022/lib/pipes/iso-interval.pipe.mjs +2 -2
- package/esm2022/lib/pipes/public_api.mjs +1 -1
- package/esm2022/lib/pipes/time-ago.pipe.mjs +12 -7
- package/esm2022/lib/pipes/time-duration.pipe.mjs +6 -4
- package/esm2022/lib/pipes/weight.pipe.mjs +4 -3
- package/esm2022/public_api.mjs +1 -1
- package/fesm2022/elderbyte-ngx-starter.mjs +3054 -2329
- package/fesm2022/elderbyte-ngx-starter.mjs.map +1 -1
- package/lib/common/arrays.d.ts +1 -1
- package/lib/common/data/data-context/data-context-active-page.d.ts +1 -1
- package/lib/common/data/data-context/data-context-base.d.ts +1 -1
- package/lib/common/data/data-context/data-context-builder.d.ts +2 -2
- package/lib/common/data/data-context/data-context-continuable-base.d.ts +1 -1
- package/lib/common/data/data-context/data-context-continuable-paged.d.ts +1 -1
- package/lib/common/data/data-context/data-context-continuable-token.d.ts +1 -1
- package/lib/common/data/data-context/data-context-simple.d.ts +1 -1
- package/lib/common/data/data-context/data-context-source-event-binding.d.ts +2 -5
- package/lib/common/data/datasource/data-source-change-event.d.ts +14 -5
- package/lib/common/data/datasource/local/local-list-data-source.d.ts +3 -3
- package/lib/common/data/datasource/local/local-paged-data-source.d.ts +1 -1
- package/lib/common/data/datasource/patch/deep-partial-patcher.d.ts +28 -0
- package/lib/common/json-map.d.ts +1 -1
- package/lib/common/selection/selection-model.d.ts +2 -2
- package/lib/common/time/interval.d.ts +4 -4
- package/lib/common/time/temporal-util.d.ts +2 -0
- package/lib/common/utils/collection-util.d.ts +1 -1
- package/lib/components/card-organizer/card-organizer-data.d.ts +3 -3
- package/lib/components/card-organizer/card-stack.d.ts +2 -2
- package/lib/components/data-view/base/elder-data-view-options-provider.d.ts +1 -1
- package/lib/components/data-view/common/elder-data-common.module.d.ts +1 -1
- package/lib/components/data-view/elder-data-view-interaction-mode.d.ts +2 -2
- package/lib/components/data-view/grid/elder-grid.module.d.ts +1 -1
- package/lib/components/forms/search/elder-search-input.directive.d.ts +1 -1
- package/lib/components/navigation/toolbar/elder-toolbar.module.d.ts +1 -1
- package/lib/components/navigation/toolbar/toolbar-column-position.d.ts +3 -3
- package/lib/components/select/elder-select.module.d.ts +1 -1
- package/lib/components/time/elder-interval-input/elder-interval-input.component.d.ts +4 -4
- package/lib/components/time/elder-interval-picker/elder-interval-picker-toggle/elder-interval-picker-toggle.component.d.ts +2 -2
- package/lib/components/time/elder-interval-picker/elder-interval-picker.component.d.ts +2 -1
- package/lib/components/time/elder-interval-picker/elder-interval-picker.service.d.ts +4 -2
- package/package.json +1 -1
- package/src/assets/i18n/de.json +0 -1
- package/src/assets/i18n/en.json +0 -1
- package/src/lib/components/access-denied/elder-access-denied.component.scss +1 -5
- package/src/lib/components/auditing/audited-entity/elder-audited-entity.component.scss +0 -1
- package/src/lib/components/badge/elder-badge/elder-badge.component.scss +2 -7
- package/src/lib/components/card-organizer/card-organizer/elder-card-organizer.component.scss +0 -1
- package/src/lib/components/card-organizer/card-stack/elder-card-stack.component.scss +4 -14
- package/src/lib/components/cards/elder-card/elder-card.component.scss +3 -9
- package/src/lib/components/chips/_elder-chip-theme.scss +5 -9
- package/src/lib/components/containers/elder-scroll-container/elder-scroll-container.component.scss +0 -1
- package/src/lib/components/data-transfer/http-data-transfer/http-data-transfer.component.scss +0 -1
- package/src/lib/components/data-transfer/http-data-transfer-indicator/http-data-transfer-indicator.component.scss +0 -1
- package/src/lib/components/data-transfer/http-data-transfer-overview/http-data-transfer-overview.component.scss +4 -5
- package/src/lib/components/data-view/common/selection/elder-selection-master-checkbox/elder-selection-master-checkbox.component.scss +1 -1
- package/src/lib/components/data-view/grid/elder-grid/elder-grid.component.scss +21 -13
- package/src/lib/components/data-view/table/elder-table/elder-table.component.scss +12 -21
- package/src/lib/components/dialogs/confirm-dialog/elder-confirm-dialog.component.scss +2 -3
- package/src/lib/components/errors/exception-detail/elder-exception-detail.component.scss +2 -4
- package/src/lib/components/expand-toggle-button/elder-expand-toggle-button.component.scss +0 -4
- package/src/lib/components/files/blob-viewer/elder-blob-viewer.component.scss +2 -4
- package/src/lib/components/files/drag-n-drop/elder-drop-zone/elder-drop-zone.component.scss +2 -7
- package/src/lib/components/forms/search/search-box/elder-search-box.component.scss +0 -2
- package/src/lib/components/global-search/elder-global-search.component.scss +1 -2
- package/src/lib/components/graph/elder-progress-bar/elder-progress-bar.component.scss +0 -1
- package/src/lib/components/iframes/iframe-host/iframe-host.component.scss +0 -1
- package/src/lib/components/labels/labels-input/labels-input.component.scss +0 -2
- package/src/lib/components/navigation/bread-crumbs/bread-crumbs/elder-bread-crumbs.component.scss +0 -2
- package/src/lib/components/navigation/nav/_elder-nav-theme.scss +4 -8
- package/src/lib/components/navigation/nav/nav-group/elder-nav-group.component.scss +6 -6
- package/src/lib/components/navigation/nav/nav-list/elder-nav-list.component.scss +0 -1
- package/src/lib/components/navigation/toolbar/toolbar-title/elder-toolbar-title.component.scss +1 -2
- package/src/lib/components/panels/card-panel/elder-card-panel.component.scss +0 -3
- package/src/lib/components/panels/elder-dialog-panel/elder-dialog-panel.component.scss +0 -1
- package/src/lib/components/panels/flat/_elder-panel-theme.scss +0 -2
- package/src/lib/components/panels/flat/elder-panel.component.scss +1 -2
- package/src/lib/components/select/_elder-select-base.scss +0 -1
- package/src/lib/components/select/filter/elder-filter-chip-template/elder-filter-chip-template.component.scss +7 -7
- package/src/lib/components/select/multi/elder-multi-select-chip-options/elder-multi-select-chip-options.component.scss +3 -4
- package/src/lib/components/select/multi/elder-multi-select-chips/elder-multi-select-chips.component.scss +7 -7
- package/src/lib/components/select/single/elder-select/elder-select.component.scss +1 -1
- package/src/lib/components/select-chip-list/chip-list-select/elder-chip-list-select.component.scss +2 -3
- package/src/lib/components/shell/header/elder-app-header/elder-app-header.component.scss +1 -2
- package/src/lib/components/shell/shell/elder-shell.component.scss +0 -1
- package/src/lib/components/shell/shell-navigation-toggle/elder-shell-navigation-toggle.component.scss +1 -2
- package/src/lib/components/time/_elder-time-input.theme.scss +2 -2
- package/src/lib/components/time/duration/elder-duration-input/elder-duration-input.component.scss +0 -4
- package/src/lib/components/time/elder-date-time-input/elder-date-time-input.component.scss +1 -3
- package/src/lib/components/time/elder-interval-input/elder-interval-input.component.scss +0 -1
- package/src/lib/components/time/elder-local-date-input/elder-local-date-input.component.scss +2 -5
- package/src/lib/components/time/period/elder-period-input/elder-period-input.component.scss +0 -4
- package/src/lib/components/toasts/standard-toast/standard-toast.component.scss +0 -1
- package/src/lib/components/url-fragment/url-fragment-switcher/elder-url-fragment-switcher.component.scss +0 -5
- package/src/lib/components/viewers/elder-svg-viewer/elder-svg-viewer.component.scss +0 -1
- package/theming/_elder-common.scss +10 -11
- package/theming/_elder-defaults.scss +2 -4
- package/theming/_elder-flex-layout.scss +7 -8
- package/theming/_elder-mdc-support.scss +22 -19
- package/theming/_elder-palettes.scss +28 -25
- package/theming/_elder-scrollbar-theme.scss +0 -2
- package/theming/_elder-style-fixes.scss +10 -7
- package/theming/_elder-theme.scss +6 -1
- package/theming/_elder-toast-theme.scss +0 -2
- package/theming/_mat-icon-button-size.scss +3 -2
- package/theming/_mixins.scss +11 -9
package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker.component.mjs
CHANGED
|
@@ -3,8 +3,8 @@ import { ChangeDetectionStrategy, Component, effect, ElementRef, EventEmitter, i
|
|
|
3
3
|
import { FormsModule } from '@angular/forms';
|
|
4
4
|
import { MatButtonModule } from '@angular/material/button';
|
|
5
5
|
import { DateAdapter } from '@angular/material/core';
|
|
6
|
-
import { MatCalendar, MatDatepickerModule, MatDatepickerToggle, MatDateRangeInput, MatDateRangePicker } from '@angular/material/datepicker';
|
|
7
|
-
import { MatFormFieldModule, MatHint, MatLabel
|
|
6
|
+
import { MatCalendar, MatDatepickerModule, MatDatepickerToggle, MatDateRangeInput, MatDateRangePicker, } from '@angular/material/datepicker';
|
|
7
|
+
import { MatFormFieldModule, MatHint, MatLabel } from '@angular/material/form-field';
|
|
8
8
|
import { MatIconModule } from '@angular/material/icon';
|
|
9
9
|
import { MatInputModule } from '@angular/material/input';
|
|
10
10
|
import { MatMenuModule } from '@angular/material/menu';
|
|
@@ -49,6 +49,7 @@ export class ElderIntervalPickerComponent {
|
|
|
49
49
|
this.isAnchorReadOnly = false;
|
|
50
50
|
this.isResultTextVisible = true;
|
|
51
51
|
this.isHelpTextsVisible = false;
|
|
52
|
+
this.isSelectLastModeExcludingToday = false;
|
|
52
53
|
this.dateChange = new EventEmitter();
|
|
53
54
|
this.inputInterval = input(null);
|
|
54
55
|
this.inputAnchorDateTime = input(null);
|
|
@@ -204,10 +205,7 @@ export class ElderIntervalPickerComponent {
|
|
|
204
205
|
return '';
|
|
205
206
|
}
|
|
206
207
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: ElderIntervalPickerComponent, deps: [{ token: i1.ElderIntervalPickerService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
207
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.2", type: ElderIntervalPickerComponent, isStandalone: true, selector: "elder-interval-picker", inputs: { isEmittingOnChange: { classPropertyName: "isEmittingOnChange", publicName: "isEmittingOnChange", isSignal: false, isRequired: false, transformFunction: null }, intervalInputMode: { classPropertyName: "intervalInputMode", publicName: "intervalInputMode", isSignal: false, isRequired: false, transformFunction: null }, showAnchor: { classPropertyName: "showAnchor", publicName: "showAnchor", isSignal: false, isRequired: false, transformFunction: null }, isAnchorReadOnly: { classPropertyName: "isAnchorReadOnly", publicName: "isAnchorReadOnly", isSignal: false, isRequired: false, transformFunction: null }, isResultTextVisible: { classPropertyName: "isResultTextVisible", publicName: "isResultTextVisible", isSignal: false, isRequired: false, transformFunction: null }, isHelpTextsVisible: { classPropertyName: "isHelpTextsVisible", publicName: "isHelpTextsVisible", isSignal: false, isRequired: false, transformFunction: null }, inputInterval: { classPropertyName: "inputInterval", publicName: "inputInterval", isSignal: true, isRequired: false, transformFunction: null }, inputAnchorDateTime: { classPropertyName: "inputAnchorDateTime", publicName: "inputAnchorDateTime", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dateChange: "dateChange" }, providers: [
|
|
208
|
-
ElderIntervalPickerService,
|
|
209
|
-
{ provide: DateAdapter, useClass: CustomDateAdapter },
|
|
210
|
-
], viewQueries: [{ propertyName: "calendarStart", first: true, predicate: ["rangeCalendarStart"], descendants: true }, { propertyName: "calendarEnd", first: true, predicate: ["rangeCalendarEnd"], descendants: true }, { propertyName: "calendarStartElRef", first: true, predicate: ["rangeCalendarStart"], descendants: true, read: ElementRef }, { propertyName: "calendarEndElRef", first: true, predicate: ["rangeCalendarEnd"], descendants: true, read: ElementRef }, { propertyName: "startDateInput", first: true, predicate: ["startDateInput"], descendants: true }, { propertyName: "endDateInput", first: true, predicate: ["endDateInput"], descendants: true }], ngImport: i0, template: "<div class=\"interval-picker-component p-md layout-col gap-xxl\">\n <div class=\"layout-row gap-xxl place-between-start\" style=\"gap: 5%\">\n <div class=\"layout-col gap-md pt-xs\">\n <ng-container *ngTemplateOutlet=\"intervalSelector\"></ng-container>\n </div>\n <div class=\"layout-col\">\n <!-- smart shift -->\n <div class=\"layout-row place-around-center\">\n <button mat-icon-button (click)=\"svc.smartShift(-1)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ svc.viewIntervalMessage() }}</span>\n <button mat-icon-button (click)=\"svc.smartShift(1)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <!-- calendars and input controls -->\n <ng-container *ngTemplateOutlet=\"calendarsTemplate\"></ng-container>\n </div>\n <div class=\"pt-xs\" style=\"width: 25%\">\n <div class=\"layout-col gap-lg\">\n <div class=\"layout-col gap-xs place-start-start\">\n @if (isHelpTextsVisible) {\n <h5 class=\"mat-h5\">{{ \"intervalPicker.selectSmartInterval\" | translate }}</h5>\n }\n <!-- select current -->\n <button mat-button (click)=\"svc.selectCurrentWeek()\">\n {{ \"intervalPicker.currentPeriod.week\" | translate }}\n </button>\n <button mat-button (click)=\"svc.selectCurrentMonth()\">\n {{ \"intervalPicker.currentPeriod.month\" | translate }}\n </button>\n <button mat-button (click)=\"svc.selectCurrentQuarter()\">\n {{ \"intervalPicker.currentPeriod.quarter\" | translate }}\n </button>\n <button mat-button (click)=\"svc.selectCurrentYear()\">\n {{ \"intervalPicker.currentPeriod.year\" | translate }}\n </button>\n </div>\n <div class=\"fixed-shifts-container\">\n <ng-container *ngTemplateOutlet=\"fixedShifts\"></ng-container>\n </div>\n </div>\n </div>\n </div>\n <div class=\"layout-row place-between-center gap-xxl pt-sm\">\n <div>\n @if (showAnchor) {\n <ng-container *ngTemplateOutlet=\"anchorInputField\"></ng-container>\n }\n </div>\n @if (isResultTextVisible) {\n <!-- result interval -->\n <div class=\"layout-col place-center-center\">\n <div class=\"date-interval mat-caption pt-xs\">\n @if (svc.startDateTimeAsJSDate()) {\n {{ svc.startDateTimeAsJSDate() | date : \"dd.MM. y, HH:mm:ss\" }}\n } @else {\n {{ \"intervalPicker.startDateNotSet\" | translate }}\n }\n <span> - </span>\n @if (svc.endDateTimeAsJSDate()) {\n {{ svc.endDateTimeAsJSDate() | date : \"dd.MM. y, HH:mm:ss\" }}\n } @else {\n {{ \"intervalPicker.endDateNotSet\" | translate }}\n }\n </div>\n <div>\n <span class=\"mat-caption\">{{ svc.deltaHumanReadable() || \" \" }}</span>\n </div>\n </div>\n }\n <div class=\"layout-row gap-lg\">\n <button\n mat-raised-button\n color=\"primary\"\n (click)=\"clearStartAndEndDateTimes()\"\n [disabled]=\"svc.isStartAndEndDatesEmpty()\"\n >\n {{ \"intervalPicker.clear\" | translate }}\n </button>\n\n @if(!this.isEmittingOnChange) {\n <button color=\"primary\" mat-raised-button (click)=\"svc.emitMainDates()\">\n {{ \"actions.ok\" | translate }}\n </button>\n }\n </div>\n </div>\n</div>\n\n<ng-template #intervalSelector>\n <div class=\"layout-col\">\n @if (isHelpTextsVisible) {\n <h5 class=\"mat-h5\">{{ \"intervalPicker.selectAbsoluteInterval\" | translate }}</h5>\n }\n <div class=\"layout-row select-buttons-container gap-sm\">\n <div class=\"layout-col gap-xs place-start-stretch\">\n <button mat-button (click)=\"svc.selectCurrentDay()\">\n @if(svc.isFixedAnchorDateSet()) {\n {{ \"intervalPicker.anchorDay\" | translate }}\n } @else {\n {{ \"intervalPicker.today\" | translate }}\n }\n </button>\n <button mat-button (click)=\"svc.selectYesterday()\">\n @if (svc.isFixedAnchorDateSet()) {\n {{ \"intervalPicker.last\" | translate }} 1 {{ \"intervalPicker.day\" | translate }}\n } @else {\n {{ \"intervalPicker.yesterday\" | translate }}\n }\n </button>\n <button mat-button (click)=\"svc.selectLastSevenDays()\">\n {{ \"intervalPicker.last\" | translate }} 7 {{ \"intervalPicker.days\" | translate }}\n </button>\n <button mat-button (click)=\"svc.selectLastThirtyDays()\">\n {{ \"intervalPicker.last\" | translate }} 30 {{ \"intervalPicker.days\" | translate }}\n </button>\n @if (intervalInputMode === 'date-time-range') {\n <div class=\"pt-sm\"></div>\n <button mat-button (click)=\"svc.selectLastFiveMinutes()\">\n {{ \"intervalPicker.last\" | translate }} 5 {{ \"intervalPicker.minutes\" | translate }}\n </button>\n <button mat-button (click)=\"svc.selectLastHour()\">\n {{ \"intervalPicker.last\" | translate }} {{ \"intervalPicker.hour\" | translate }}\n </button>\n <button mat-button (click)=\"svc.selectLast24Hours()\">\n {{ \"intervalPicker.last\" | translate }} 24 {{ \"intervalPicker.hours\" | translate }}\n </button>\n }\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #calendarsTemplate>\n <div class=\"layout-row place-around-center\" style=\"align-items: flex-start; min-height: 280px\">\n <mat-calendar\n #rangeCalendarStart\n style=\"width: 210px; max-width: 100%\"\n [selected]=\"svc.dateRangeForCalendar()\"\n (selectedChange)=\"handleStartCalendarChange($event)\"\n [maxDate]=\"svc.endDateAsJSDate()\"\n [dateClass]=\"calendarAnchorDateCssClassFn\"\n >\n </mat-calendar>\n <mat-calendar\n #rangeCalendarEnd\n style=\"width: 210px; max-width: 100%\"\n [selected]=\"svc.dateRangeForCalendar()\"\n (selectedChange)=\"handleEndCalendarChange($event)\"\n [minDate]=\"svc.startDateAsJSDate()\"\n [dateClass]=\"calendarAnchorDateCssClassFn\"\n >\n </mat-calendar>\n </div>\n <div class=\"layout-row place-around-center gap-xl pt-sm\">\n <div class=\"layout-row place-around-center\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ \"intervalPicker.startDate\" | translate }}</mat-label>\n <input\n #startDateInput\n name=\"startDateInput\"\n matInput\n type=\"date\"\n [ngModel]=\"svc.startDateHtmlString()\"\n (ngModelChange)=\"svc.setStartDateFromHtmlString($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"this.clearStartDateTime()\"\n [disabled]=\"!this.svc.startDate()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n <div class=\"layout-row place-around-center\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ \"intervalPicker.endDate\" | translate }}</mat-label>\n <input\n #endDateInput\n name=\"endDateInput\"\n matInput\n type=\"date\"\n [ngModel]=\"svc.endDateHtmlString()\"\n (ngModelChange)=\"svc.setEndDateFromHtmlString($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"this.clearEndDateTime()\"\n [disabled]=\"!this.svc.endDate()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n </div>\n <br />\n @if (intervalInputMode === 'date-time-range') {\n <div class=\"layout-row place-around-center gap-xl pt-sm\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ \"intervalPicker.startTime\" | translate }}</mat-label>\n <input\n name=\"startTimeInput\"\n matInput\n type=\"time\"\n #startTimeControl=\"ngModel\"\n step=\"1\"\n [ngModel]=\"svc.getStartTimeString()\"\n (ngModelChange)=\"svc.setStartTimeFromString($event, startTimeControl)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"this.svc.clearStartTime()\"\n [disabled]=\"!this.svc.isStartTimeSetAndNotMidnight()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ \"intervalPicker.endTime\" | translate }}</mat-label>\n <input\n name=\"endTimeInput\"\n matInput\n type=\"time\"\n #endTimeControl=\"ngModel\"\n step=\"1\"\n [ngModel]=\"svc.getEndTimeString()\"\n (ngModelChange)=\"svc.setEndTimeFromString($event, endTimeControl)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"this.svc.clearEndTime()\"\n [disabled]=\"!this.svc.isEndTimeSetAndNotMidnight()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n }\n</ng-template>\n\n<ng-template #fixedShifts>\n @if (isHelpTextsVisible) {\n <h5 class=\"mat-h5\">{{ \"intervalPicker.shiftInterval\" | translate }}</h5>\n }\n <div class=\"layout-col place-start-stretch\">\n <div class=\"layout-row place-between-center\">\n <button mat-icon-button (click)=\"svc.shiftDay(-1)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ \"intervalPicker.day\" | translate }}</span>\n <button mat-icon-button (click)=\"svc.shiftDay(1)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <div class=\"layout-row place-between-center\">\n <button mat-icon-button (click)=\"svc.shiftMonth(-1, true)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ \"intervalPicker.month\" | translate }}</span>\n <button mat-icon-button (click)=\"svc.shiftMonth(1, true)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <div class=\"layout-row place-between-center\">\n <button mat-icon-button (click)=\"svc.shiftYear(-1, true)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ \"intervalPicker.year\" | translate }}</span>\n <button mat-icon-button (click)=\"svc.shiftYear(1, true)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n\n @if (intervalInputMode === 'date-time-range') {\n <!-- shift minute -->\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"svc.shiftTime(-1, 'minutes')\"\n [disabled]=\"svc.isRangeNotSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ \"intervalPicker.minute\" | translate }}</span>\n <button\n mat-icon-button\n (click)=\"svc.shiftTime(1, 'minutes')\"\n [disabled]=\"svc.isRangeNotSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <!-- shift hour -->\n <div class=\"layout-row place-between-center\">\n <button mat-icon-button (click)=\"svc.shiftTime(-1, 'hours')\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ \"intervalPicker.hour\" | translate }}</span>\n <button mat-icon-button (click)=\"svc.shiftTime(1, 'hours')\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n }\n </div>\n</ng-template>\n\n<ng-template #anchorInputField>\n <div class=\"layout-row flex-none gap-md\">\n <mat-menu #anchorMenu=\"matMenu\">\n @if (svc.startDate()) {\n <button\n mat-menu-item\n (click)=\"svc.setFixedAnchorPointToEndDateTime()\"\n [disabled]=\"!svc.endDate()\"\n >\n <mat-icon class=\"material-symbols-outlined\">login</mat-icon>\n <span>{{ \"intervalPicker.endDate\" | translate }}</span>\n </button>\n } @if (svc.endDate()) {\n <button\n mat-menu-item\n (click)=\"svc.setFixedAnchorPointToStartDateTime()\"\n [disabled]=\"!svc.startDate()\"\n >\n <mat-icon class=\"material-symbols-outlined\">logout</mat-icon>\n <span>{{ \"intervalPicker.startDate\" | translate }}</span>\n </button>\n } @if (svc.fixedAnchorDate()) {\n <button\n mat-menu-item\n (click)=\"this.svc.resetFixedAnchorPoint()\"\n [disabled]=\"!svc.fixedAnchorDate() || isAnchorReadOnly\"\n >\n <mat-icon>close</mat-icon>\n <span>{{ \"intervalPicker.clear\" | translate }}</span>\n </button>\n }\n </mat-menu>\n\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ \"intervalPicker.anchorDate\" | translate }}</mat-label>\n <elder-local-date-input\n name=\"anchorDateInput\"\n (valueUpdated)=\"svc.setAnchorDateFromForm($event)\"\n [value]=\"svc.getAnchorPointAsLocaleDate()\"\n [readonly]=\"isAnchorReadOnly\"\n >\n </elder-local-date-input>\n @if (!isAnchorReadOnly) {\n <button\n mat-icon-button\n matSuffix\n [matMenuTriggerFor]=\"anchorMenu\"\n [disabled]=\"svc.isStartAndEndDatesEmpty() && !svc.fixedAnchorDate()\"\n >\n <mat-icon class=\"material-symbols-outlined\">more_horiz</mat-icon>\n </button>\n }\n </mat-form-field>\n @if (intervalInputMode === 'date-time-range') {\n <mat-form-field class=\"input-control-container-short\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ \"intervalPicker.anchorTime\" | translate }}</mat-label>\n <input\n matInput\n name=\"anchorTimeInput\"\n type=\"time\"\n #anchorTimeControl=\"ngModel\"\n step=\"1\"\n [readonly]=\"isAnchorReadOnly\"\n [ngModel]=\"svc.getAnchorTimeString()\"\n (ngModelChange)=\"svc.setAnchorTimeFromForm($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"this.svc.resetFixedAnchorTime()\"\n [disabled]=\"!svc.isFixedAnchorTimeSetAndNotMidnight() || isAnchorReadOnly\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n }\n </div>\n</ng-template>\n", styles: [".interval-picker-component{min-width:840px;max-width:100%}.fixed-shifts-container{max-width:160px}.input-control-container{width:192px;max-width:100%}.input-control-container-short{width:140px;max-width:100%}.select-buttons-container button{white-space:nowrap;text-align:left;justify-content:flex-start}::ng-deep .interval-picker-component .mat-calendar-body-cell.elder-custom-anchor-date .mat-calendar-body-cell-content{border-radius:50%;background-color:#def;background-color:#b4d2ebbf}\n"], dependencies: [{ kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i2.MatCalendar, selector: "mat-calendar", inputs: ["headerComponent", "startAt", "startView", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "comparisonStart", "comparisonEnd", "startDateAccessibleName", "endDateAccessibleName"], outputs: ["selectedChange", "yearSelected", "monthSelected", "viewChanged", "_userSelection", "_userDragDrop"], exportAs: ["matCalendar"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: ElderLocalDateInputComponent, selector: "elder-local-date-input", inputs: ["zone", "autoDatePicker", "arrows", "today", "center", "datePickerTouchUi", "allowNull", "datePickerEnabled", "isoValue", "dateValue", "isoDateValue"], outputs: ["blurred", "valueUpdatedBlur", "isoValueChange", "dateValueChange", "isoDateValueChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i9.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i10.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i10.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i10.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
208
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.2", type: ElderIntervalPickerComponent, isStandalone: true, selector: "elder-interval-picker", inputs: { isEmittingOnChange: { classPropertyName: "isEmittingOnChange", publicName: "isEmittingOnChange", isSignal: false, isRequired: false, transformFunction: null }, intervalInputMode: { classPropertyName: "intervalInputMode", publicName: "intervalInputMode", isSignal: false, isRequired: false, transformFunction: null }, showAnchor: { classPropertyName: "showAnchor", publicName: "showAnchor", isSignal: false, isRequired: false, transformFunction: null }, isAnchorReadOnly: { classPropertyName: "isAnchorReadOnly", publicName: "isAnchorReadOnly", isSignal: false, isRequired: false, transformFunction: null }, isResultTextVisible: { classPropertyName: "isResultTextVisible", publicName: "isResultTextVisible", isSignal: false, isRequired: false, transformFunction: null }, isHelpTextsVisible: { classPropertyName: "isHelpTextsVisible", publicName: "isHelpTextsVisible", isSignal: false, isRequired: false, transformFunction: null }, isSelectLastModeExcludingToday: { classPropertyName: "isSelectLastModeExcludingToday", publicName: "isSelectLastModeExcludingToday", isSignal: false, isRequired: false, transformFunction: null }, inputInterval: { classPropertyName: "inputInterval", publicName: "inputInterval", isSignal: true, isRequired: false, transformFunction: null }, inputAnchorDateTime: { classPropertyName: "inputAnchorDateTime", publicName: "inputAnchorDateTime", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dateChange: "dateChange" }, providers: [ElderIntervalPickerService, { provide: DateAdapter, useClass: CustomDateAdapter }], viewQueries: [{ propertyName: "calendarStart", first: true, predicate: ["rangeCalendarStart"], descendants: true }, { propertyName: "calendarEnd", first: true, predicate: ["rangeCalendarEnd"], descendants: true }, { propertyName: "calendarStartElRef", first: true, predicate: ["rangeCalendarStart"], descendants: true, read: ElementRef }, { propertyName: "calendarEndElRef", first: true, predicate: ["rangeCalendarEnd"], descendants: true, read: ElementRef }, { propertyName: "startDateInput", first: true, predicate: ["startDateInput"], descendants: true }, { propertyName: "endDateInput", first: true, predicate: ["endDateInput"], descendants: true }], ngImport: i0, template: "<div class=\"interval-picker-component p-md layout-col gap-xxl\">\n <div class=\"layout-row gap-xxl place-between-start\" style=\"gap: 5%\">\n <div class=\"layout-col gap-md pt-xs\">\n <ng-container *ngTemplateOutlet=\"intervalSelector\"></ng-container>\n </div>\n <div class=\"layout-col\">\n <!-- smart shift -->\n <div class=\"layout-row place-around-center\">\n <button mat-icon-button (click)=\"svc.smartShift(-1)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ svc.viewIntervalMessage() }}</span>\n <button mat-icon-button (click)=\"svc.smartShift(1)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <!-- calendars and input controls -->\n <ng-container *ngTemplateOutlet=\"calendarsTemplate\"></ng-container>\n </div>\n <div class=\"pt-xs\" style=\"width: 25%\">\n <div class=\"layout-col gap-lg\">\n <div class=\"layout-col gap-xs place-start-start\">\n @if (isHelpTextsVisible) {\n <h5 class=\"mat-h5\">{{ 'intervalPicker.selectSmartInterval' | translate }}</h5>\n }\n <!-- select current -->\n <button mat-button (click)=\"svc.selectCurrentWeek()\">\n {{ 'intervalPicker.currentPeriod.week' | translate }}\n </button>\n <button mat-button (click)=\"svc.selectCurrentMonth()\">\n {{ 'intervalPicker.currentPeriod.month' | translate }}\n </button>\n <button mat-button (click)=\"svc.selectCurrentQuarter()\">\n {{ 'intervalPicker.currentPeriod.quarter' | translate }}\n </button>\n <button mat-button (click)=\"svc.selectCurrentYear()\">\n {{ 'intervalPicker.currentPeriod.year' | translate }}\n </button>\n </div>\n <div class=\"fixed-shifts-container\">\n <ng-container *ngTemplateOutlet=\"fixedShifts\"></ng-container>\n </div>\n </div>\n </div>\n </div>\n <div class=\"layout-row place-between-center gap-xxl pt-sm\">\n <div>\n @if (showAnchor) {\n <ng-container *ngTemplateOutlet=\"anchorInputField\"></ng-container>\n }\n </div>\n @if (isResultTextVisible) {\n <!-- result interval -->\n <div class=\"layout-col place-center-center\">\n <div class=\"date-interval mat-caption pt-xs\">\n @if (svc.startDateTimeAsJSDate()) {\n {{ svc.startDateTimeAsJSDate() | date: 'dd.MM. y, HH:mm:ss' }}\n } @else {\n {{ 'intervalPicker.startDateNotSet' | translate }}\n }\n <span> - </span>\n @if (svc.endDateTimeAsJSDate()) {\n {{ svc.endDateTimeAsJSDate() | date: 'dd.MM. y, HH:mm:ss' }}\n } @else {\n {{ 'intervalPicker.endDateNotSet' | translate }}\n }\n </div>\n <div>\n <span class=\"mat-caption\">{{ svc.deltaHumanReadable() || ' ' }}</span>\n </div>\n </div>\n }\n <div class=\"layout-row gap-lg\">\n <button\n mat-raised-button\n color=\"primary\"\n (click)=\"clearStartAndEndDateTimes()\"\n [disabled]=\"svc.isStartAndEndDatesEmpty()\"\n >\n {{ 'intervalPicker.clear' | translate }}\n </button>\n\n @if (!this.isEmittingOnChange) {\n <button color=\"primary\" mat-raised-button (click)=\"svc.emitMainDates()\">\n {{ 'actions.ok' | translate }}\n </button>\n }\n </div>\n </div>\n</div>\n\n<ng-template #intervalSelector>\n <div class=\"layout-col\">\n @if (isHelpTextsVisible) {\n <h5 class=\"mat-h5\">{{ 'intervalPicker.selectAbsoluteInterval' | translate }}</h5>\n }\n <div class=\"layout-row select-buttons-container gap-sm\">\n <div class=\"layout-col gap-xs place-start-stretch\">\n <button mat-button (click)=\"svc.selectCurrentDay()\">\n @if (svc.isFixedAnchorDateSet()) {\n {{ 'intervalPicker.anchorDay' | translate }}\n } @else {\n {{ 'intervalPicker.today' | translate }}\n }\n </button>\n <button mat-button (click)=\"svc.selectYesterday()\">\n @if (svc.isFixedAnchorDateSet()) {\n {{ 'intervalPicker.last' | translate }} 1 {{ 'intervalPicker.day' | translate }}\n } @else {\n {{ 'intervalPicker.yesterday' | translate }}\n }\n </button>\n @if (isSelectLastModeExcludingToday) {\n <button mat-button (click)=\"svc.selectLastSevenDaysExcludingToday()\">\n {{ 'intervalPicker.last' | translate }} 7 {{ 'intervalPicker.days' | translate }}\n </button>\n <button mat-button (click)=\"svc.selectLastThirtyDaysExcludingToday()\">\n {{ 'intervalPicker.last' | translate }} 30 {{ 'intervalPicker.days' | translate }}\n </button>\n } @else {\n <button mat-button (click)=\"svc.selectLastSevenDaysIncludingToday()\">\n {{ 'intervalPicker.last' | translate }} 7 {{ 'intervalPicker.days' | translate }}\n </button>\n <button mat-button (click)=\"svc.selectLastThirtyDaysIncludingToday()\">\n {{ 'intervalPicker.last' | translate }} 30 {{ 'intervalPicker.days' | translate }}\n </button>\n }\n @if (intervalInputMode === 'date-time-range') {\n <div class=\"pt-sm\"></div>\n <button mat-button (click)=\"svc.selectLastFiveMinutes()\">\n {{ 'intervalPicker.last' | translate }} 5 {{ 'intervalPicker.minutes' | translate }}\n </button>\n <button mat-button (click)=\"svc.selectLastHour()\">\n {{ 'intervalPicker.last' | translate }} {{ 'intervalPicker.hour' | translate }}\n </button>\n <button mat-button (click)=\"svc.selectLast24Hours()\">\n {{ 'intervalPicker.last' | translate }} 24 {{ 'intervalPicker.hours' | translate }}\n </button>\n }\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #calendarsTemplate>\n <div class=\"layout-row place-around-center\" style=\"align-items: flex-start; min-height: 280px\">\n <mat-calendar\n #rangeCalendarStart\n style=\"width: 210px; max-width: 100%\"\n [selected]=\"svc.dateRangeForCalendar()\"\n (selectedChange)=\"handleStartCalendarChange($event)\"\n [maxDate]=\"svc.endDateAsJSDate()\"\n [dateClass]=\"calendarAnchorDateCssClassFn\"\n >\n </mat-calendar>\n <mat-calendar\n #rangeCalendarEnd\n style=\"width: 210px; max-width: 100%\"\n [selected]=\"svc.dateRangeForCalendar()\"\n (selectedChange)=\"handleEndCalendarChange($event)\"\n [minDate]=\"svc.startDateAsJSDate()\"\n [dateClass]=\"calendarAnchorDateCssClassFn\"\n >\n </mat-calendar>\n </div>\n <div class=\"layout-row place-around-center gap-xl pt-sm\">\n <div class=\"layout-row place-around-center\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.startDate' | translate }}</mat-label>\n <input\n #startDateInput\n name=\"startDateInput\"\n matInput\n type=\"date\"\n [ngModel]=\"svc.startDateHtmlString()\"\n (ngModelChange)=\"svc.setStartDateFromHtmlString($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"this.clearStartDateTime()\"\n [disabled]=\"!this.svc.startDate()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n <div class=\"layout-row place-around-center\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.endDate' | translate }}</mat-label>\n <input\n #endDateInput\n name=\"endDateInput\"\n matInput\n type=\"date\"\n [ngModel]=\"svc.endDateHtmlString()\"\n (ngModelChange)=\"svc.setEndDateFromHtmlString($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"this.clearEndDateTime()\"\n [disabled]=\"!this.svc.endDate()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n </div>\n <br />\n @if (intervalInputMode === 'date-time-range') {\n <div class=\"layout-row place-around-center gap-xl pt-sm\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.startTime' | translate }}</mat-label>\n <input\n name=\"startTimeInput\"\n matInput\n type=\"time\"\n #startTimeControl=\"ngModel\"\n step=\"1\"\n [ngModel]=\"svc.getStartTimeString()\"\n (ngModelChange)=\"svc.setStartTimeFromString($event, startTimeControl)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"this.svc.clearStartTime()\"\n [disabled]=\"!this.svc.isStartTimeSetAndNotMidnight()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.endTime' | translate }}</mat-label>\n <input\n name=\"endTimeInput\"\n matInput\n type=\"time\"\n #endTimeControl=\"ngModel\"\n step=\"1\"\n [ngModel]=\"svc.getEndTimeString()\"\n (ngModelChange)=\"svc.setEndTimeFromString($event, endTimeControl)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"this.svc.clearEndTime()\"\n [disabled]=\"!this.svc.isEndTimeSetAndNotMidnight()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n }\n</ng-template>\n\n<ng-template #fixedShifts>\n @if (isHelpTextsVisible) {\n <h5 class=\"mat-h5\">{{ 'intervalPicker.shiftInterval' | translate }}</h5>\n }\n <div class=\"layout-col place-start-stretch\">\n <div class=\"layout-row place-between-center\">\n <button mat-icon-button (click)=\"svc.shiftDay(-1)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.day' | translate }}</span>\n <button mat-icon-button (click)=\"svc.shiftDay(1)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <div class=\"layout-row place-between-center\">\n <button mat-icon-button (click)=\"svc.shiftMonth(-1, true)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.month' | translate }}</span>\n <button mat-icon-button (click)=\"svc.shiftMonth(1, true)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <div class=\"layout-row place-between-center\">\n <button mat-icon-button (click)=\"svc.shiftYear(-1, true)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.year' | translate }}</span>\n <button mat-icon-button (click)=\"svc.shiftYear(1, true)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n\n @if (intervalInputMode === 'date-time-range') {\n <!-- shift minute -->\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"svc.shiftTime(-1, 'minutes')\"\n [disabled]=\"svc.isRangeNotSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.minute' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"svc.shiftTime(1, 'minutes')\"\n [disabled]=\"svc.isRangeNotSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <!-- shift hour -->\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"svc.shiftTime(-1, 'hours')\"\n [disabled]=\"svc.isRangeNotSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.hour' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"svc.shiftTime(1, 'hours')\"\n [disabled]=\"svc.isRangeNotSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n }\n </div>\n</ng-template>\n\n<ng-template #anchorInputField>\n <div class=\"layout-row flex-none gap-md\">\n <mat-menu #anchorMenu=\"matMenu\">\n @if (svc.startDate()) {\n <button\n mat-menu-item\n (click)=\"svc.setFixedAnchorPointToEndDateTime()\"\n [disabled]=\"!svc.endDate()\"\n >\n <mat-icon class=\"material-symbols-outlined\">login</mat-icon>\n <span>{{ 'intervalPicker.endDate' | translate }}</span>\n </button>\n }\n @if (svc.endDate()) {\n <button\n mat-menu-item\n (click)=\"svc.setFixedAnchorPointToStartDateTime()\"\n [disabled]=\"!svc.startDate()\"\n >\n <mat-icon class=\"material-symbols-outlined\">logout</mat-icon>\n <span>{{ 'intervalPicker.startDate' | translate }}</span>\n </button>\n }\n @if (svc.fixedAnchorDate()) {\n <button\n mat-menu-item\n (click)=\"this.svc.resetFixedAnchorPoint()\"\n [disabled]=\"!svc.fixedAnchorDate() || isAnchorReadOnly\"\n >\n <mat-icon>close</mat-icon>\n <span>{{ 'intervalPicker.clear' | translate }}</span>\n </button>\n }\n </mat-menu>\n\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.anchorDate' | translate }}</mat-label>\n <elder-local-date-input\n name=\"anchorDateInput\"\n (valueUpdated)=\"svc.setAnchorDateFromForm($event)\"\n [value]=\"svc.getAnchorPointAsLocaleDate()\"\n [readonly]=\"isAnchorReadOnly\"\n >\n </elder-local-date-input>\n @if (!isAnchorReadOnly) {\n <button\n mat-icon-button\n matSuffix\n [matMenuTriggerFor]=\"anchorMenu\"\n [disabled]=\"svc.isStartAndEndDatesEmpty() && !svc.fixedAnchorDate()\"\n >\n <mat-icon class=\"material-symbols-outlined\">more_horiz</mat-icon>\n </button>\n }\n </mat-form-field>\n @if (intervalInputMode === 'date-time-range') {\n <mat-form-field class=\"input-control-container-short\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.anchorTime' | translate }}</mat-label>\n <input\n matInput\n name=\"anchorTimeInput\"\n type=\"time\"\n #anchorTimeControl=\"ngModel\"\n step=\"1\"\n [readonly]=\"isAnchorReadOnly\"\n [ngModel]=\"svc.getAnchorTimeString()\"\n (ngModelChange)=\"svc.setAnchorTimeFromForm($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"this.svc.resetFixedAnchorTime()\"\n [disabled]=\"!svc.isFixedAnchorTimeSetAndNotMidnight() || isAnchorReadOnly\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n }\n </div>\n</ng-template>\n", styles: [".interval-picker-component{min-width:840px;max-width:100%}.fixed-shifts-container{max-width:160px}.input-control-container{width:192px;max-width:100%}.input-control-container-short{width:140px;max-width:100%}.select-buttons-container button{white-space:nowrap;text-align:left;justify-content:flex-start}::ng-deep .interval-picker-component .mat-calendar-body-cell.elder-custom-anchor-date .mat-calendar-body-cell-content{border-radius:50%;background-color:#def;background-color:#b4d2ebbf}\n"], dependencies: [{ kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i2.MatCalendar, selector: "mat-calendar", inputs: ["headerComponent", "startAt", "startView", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "comparisonStart", "comparisonEnd", "startDateAccessibleName", "endDateAccessibleName"], outputs: ["selectedChange", "yearSelected", "monthSelected", "viewChanged", "_userSelection", "_userDragDrop"], exportAs: ["matCalendar"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: ElderLocalDateInputComponent, selector: "elder-local-date-input", inputs: ["zone", "autoDatePicker", "arrows", "today", "center", "datePickerTouchUi", "allowNull", "datePickerEnabled", "isoValue", "dateValue", "isoDateValue"], outputs: ["blurred", "valueUpdatedBlur", "isoValueChange", "dateValueChange", "isoDateValueChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i9.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i10.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i10.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i10.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
211
209
|
}
|
|
212
210
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: ElderIntervalPickerComponent, decorators: [{
|
|
213
211
|
type: Component,
|
|
@@ -229,10 +227,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImpor
|
|
|
229
227
|
MatTooltip,
|
|
230
228
|
TranslateModule,
|
|
231
229
|
MatMenuModule,
|
|
232
|
-
], providers: [
|
|
233
|
-
ElderIntervalPickerService,
|
|
234
|
-
{ provide: DateAdapter, useClass: CustomDateAdapter },
|
|
235
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"interval-picker-component p-md layout-col gap-xxl\">\n <div class=\"layout-row gap-xxl place-between-start\" style=\"gap: 5%\">\n <div class=\"layout-col gap-md pt-xs\">\n <ng-container *ngTemplateOutlet=\"intervalSelector\"></ng-container>\n </div>\n <div class=\"layout-col\">\n <!-- smart shift -->\n <div class=\"layout-row place-around-center\">\n <button mat-icon-button (click)=\"svc.smartShift(-1)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ svc.viewIntervalMessage() }}</span>\n <button mat-icon-button (click)=\"svc.smartShift(1)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <!-- calendars and input controls -->\n <ng-container *ngTemplateOutlet=\"calendarsTemplate\"></ng-container>\n </div>\n <div class=\"pt-xs\" style=\"width: 25%\">\n <div class=\"layout-col gap-lg\">\n <div class=\"layout-col gap-xs place-start-start\">\n @if (isHelpTextsVisible) {\n <h5 class=\"mat-h5\">{{ \"intervalPicker.selectSmartInterval\" | translate }}</h5>\n }\n <!-- select current -->\n <button mat-button (click)=\"svc.selectCurrentWeek()\">\n {{ \"intervalPicker.currentPeriod.week\" | translate }}\n </button>\n <button mat-button (click)=\"svc.selectCurrentMonth()\">\n {{ \"intervalPicker.currentPeriod.month\" | translate }}\n </button>\n <button mat-button (click)=\"svc.selectCurrentQuarter()\">\n {{ \"intervalPicker.currentPeriod.quarter\" | translate }}\n </button>\n <button mat-button (click)=\"svc.selectCurrentYear()\">\n {{ \"intervalPicker.currentPeriod.year\" | translate }}\n </button>\n </div>\n <div class=\"fixed-shifts-container\">\n <ng-container *ngTemplateOutlet=\"fixedShifts\"></ng-container>\n </div>\n </div>\n </div>\n </div>\n <div class=\"layout-row place-between-center gap-xxl pt-sm\">\n <div>\n @if (showAnchor) {\n <ng-container *ngTemplateOutlet=\"anchorInputField\"></ng-container>\n }\n </div>\n @if (isResultTextVisible) {\n <!-- result interval -->\n <div class=\"layout-col place-center-center\">\n <div class=\"date-interval mat-caption pt-xs\">\n @if (svc.startDateTimeAsJSDate()) {\n {{ svc.startDateTimeAsJSDate() | date : \"dd.MM. y, HH:mm:ss\" }}\n } @else {\n {{ \"intervalPicker.startDateNotSet\" | translate }}\n }\n <span> - </span>\n @if (svc.endDateTimeAsJSDate()) {\n {{ svc.endDateTimeAsJSDate() | date : \"dd.MM. y, HH:mm:ss\" }}\n } @else {\n {{ \"intervalPicker.endDateNotSet\" | translate }}\n }\n </div>\n <div>\n <span class=\"mat-caption\">{{ svc.deltaHumanReadable() || \" \" }}</span>\n </div>\n </div>\n }\n <div class=\"layout-row gap-lg\">\n <button\n mat-raised-button\n color=\"primary\"\n (click)=\"clearStartAndEndDateTimes()\"\n [disabled]=\"svc.isStartAndEndDatesEmpty()\"\n >\n {{ \"intervalPicker.clear\" | translate }}\n </button>\n\n @if(!this.isEmittingOnChange) {\n <button color=\"primary\" mat-raised-button (click)=\"svc.emitMainDates()\">\n {{ \"actions.ok\" | translate }}\n </button>\n }\n </div>\n </div>\n</div>\n\n<ng-template #intervalSelector>\n <div class=\"layout-col\">\n @if (isHelpTextsVisible) {\n <h5 class=\"mat-h5\">{{ \"intervalPicker.selectAbsoluteInterval\" | translate }}</h5>\n }\n <div class=\"layout-row select-buttons-container gap-sm\">\n <div class=\"layout-col gap-xs place-start-stretch\">\n <button mat-button (click)=\"svc.selectCurrentDay()\">\n @if(svc.isFixedAnchorDateSet()) {\n {{ \"intervalPicker.anchorDay\" | translate }}\n } @else {\n {{ \"intervalPicker.today\" | translate }}\n }\n </button>\n <button mat-button (click)=\"svc.selectYesterday()\">\n @if (svc.isFixedAnchorDateSet()) {\n {{ \"intervalPicker.last\" | translate }} 1 {{ \"intervalPicker.day\" | translate }}\n } @else {\n {{ \"intervalPicker.yesterday\" | translate }}\n }\n </button>\n <button mat-button (click)=\"svc.selectLastSevenDays()\">\n {{ \"intervalPicker.last\" | translate }} 7 {{ \"intervalPicker.days\" | translate }}\n </button>\n <button mat-button (click)=\"svc.selectLastThirtyDays()\">\n {{ \"intervalPicker.last\" | translate }} 30 {{ \"intervalPicker.days\" | translate }}\n </button>\n @if (intervalInputMode === 'date-time-range') {\n <div class=\"pt-sm\"></div>\n <button mat-button (click)=\"svc.selectLastFiveMinutes()\">\n {{ \"intervalPicker.last\" | translate }} 5 {{ \"intervalPicker.minutes\" | translate }}\n </button>\n <button mat-button (click)=\"svc.selectLastHour()\">\n {{ \"intervalPicker.last\" | translate }} {{ \"intervalPicker.hour\" | translate }}\n </button>\n <button mat-button (click)=\"svc.selectLast24Hours()\">\n {{ \"intervalPicker.last\" | translate }} 24 {{ \"intervalPicker.hours\" | translate }}\n </button>\n }\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #calendarsTemplate>\n <div class=\"layout-row place-around-center\" style=\"align-items: flex-start; min-height: 280px\">\n <mat-calendar\n #rangeCalendarStart\n style=\"width: 210px; max-width: 100%\"\n [selected]=\"svc.dateRangeForCalendar()\"\n (selectedChange)=\"handleStartCalendarChange($event)\"\n [maxDate]=\"svc.endDateAsJSDate()\"\n [dateClass]=\"calendarAnchorDateCssClassFn\"\n >\n </mat-calendar>\n <mat-calendar\n #rangeCalendarEnd\n style=\"width: 210px; max-width: 100%\"\n [selected]=\"svc.dateRangeForCalendar()\"\n (selectedChange)=\"handleEndCalendarChange($event)\"\n [minDate]=\"svc.startDateAsJSDate()\"\n [dateClass]=\"calendarAnchorDateCssClassFn\"\n >\n </mat-calendar>\n </div>\n <div class=\"layout-row place-around-center gap-xl pt-sm\">\n <div class=\"layout-row place-around-center\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ \"intervalPicker.startDate\" | translate }}</mat-label>\n <input\n #startDateInput\n name=\"startDateInput\"\n matInput\n type=\"date\"\n [ngModel]=\"svc.startDateHtmlString()\"\n (ngModelChange)=\"svc.setStartDateFromHtmlString($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"this.clearStartDateTime()\"\n [disabled]=\"!this.svc.startDate()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n <div class=\"layout-row place-around-center\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ \"intervalPicker.endDate\" | translate }}</mat-label>\n <input\n #endDateInput\n name=\"endDateInput\"\n matInput\n type=\"date\"\n [ngModel]=\"svc.endDateHtmlString()\"\n (ngModelChange)=\"svc.setEndDateFromHtmlString($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"this.clearEndDateTime()\"\n [disabled]=\"!this.svc.endDate()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n </div>\n <br />\n @if (intervalInputMode === 'date-time-range') {\n <div class=\"layout-row place-around-center gap-xl pt-sm\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ \"intervalPicker.startTime\" | translate }}</mat-label>\n <input\n name=\"startTimeInput\"\n matInput\n type=\"time\"\n #startTimeControl=\"ngModel\"\n step=\"1\"\n [ngModel]=\"svc.getStartTimeString()\"\n (ngModelChange)=\"svc.setStartTimeFromString($event, startTimeControl)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"this.svc.clearStartTime()\"\n [disabled]=\"!this.svc.isStartTimeSetAndNotMidnight()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ \"intervalPicker.endTime\" | translate }}</mat-label>\n <input\n name=\"endTimeInput\"\n matInput\n type=\"time\"\n #endTimeControl=\"ngModel\"\n step=\"1\"\n [ngModel]=\"svc.getEndTimeString()\"\n (ngModelChange)=\"svc.setEndTimeFromString($event, endTimeControl)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"this.svc.clearEndTime()\"\n [disabled]=\"!this.svc.isEndTimeSetAndNotMidnight()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n }\n</ng-template>\n\n<ng-template #fixedShifts>\n @if (isHelpTextsVisible) {\n <h5 class=\"mat-h5\">{{ \"intervalPicker.shiftInterval\" | translate }}</h5>\n }\n <div class=\"layout-col place-start-stretch\">\n <div class=\"layout-row place-between-center\">\n <button mat-icon-button (click)=\"svc.shiftDay(-1)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ \"intervalPicker.day\" | translate }}</span>\n <button mat-icon-button (click)=\"svc.shiftDay(1)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <div class=\"layout-row place-between-center\">\n <button mat-icon-button (click)=\"svc.shiftMonth(-1, true)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ \"intervalPicker.month\" | translate }}</span>\n <button mat-icon-button (click)=\"svc.shiftMonth(1, true)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <div class=\"layout-row place-between-center\">\n <button mat-icon-button (click)=\"svc.shiftYear(-1, true)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ \"intervalPicker.year\" | translate }}</span>\n <button mat-icon-button (click)=\"svc.shiftYear(1, true)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n\n @if (intervalInputMode === 'date-time-range') {\n <!-- shift minute -->\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"svc.shiftTime(-1, 'minutes')\"\n [disabled]=\"svc.isRangeNotSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ \"intervalPicker.minute\" | translate }}</span>\n <button\n mat-icon-button\n (click)=\"svc.shiftTime(1, 'minutes')\"\n [disabled]=\"svc.isRangeNotSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <!-- shift hour -->\n <div class=\"layout-row place-between-center\">\n <button mat-icon-button (click)=\"svc.shiftTime(-1, 'hours')\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ \"intervalPicker.hour\" | translate }}</span>\n <button mat-icon-button (click)=\"svc.shiftTime(1, 'hours')\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n }\n </div>\n</ng-template>\n\n<ng-template #anchorInputField>\n <div class=\"layout-row flex-none gap-md\">\n <mat-menu #anchorMenu=\"matMenu\">\n @if (svc.startDate()) {\n <button\n mat-menu-item\n (click)=\"svc.setFixedAnchorPointToEndDateTime()\"\n [disabled]=\"!svc.endDate()\"\n >\n <mat-icon class=\"material-symbols-outlined\">login</mat-icon>\n <span>{{ \"intervalPicker.endDate\" | translate }}</span>\n </button>\n } @if (svc.endDate()) {\n <button\n mat-menu-item\n (click)=\"svc.setFixedAnchorPointToStartDateTime()\"\n [disabled]=\"!svc.startDate()\"\n >\n <mat-icon class=\"material-symbols-outlined\">logout</mat-icon>\n <span>{{ \"intervalPicker.startDate\" | translate }}</span>\n </button>\n } @if (svc.fixedAnchorDate()) {\n <button\n mat-menu-item\n (click)=\"this.svc.resetFixedAnchorPoint()\"\n [disabled]=\"!svc.fixedAnchorDate() || isAnchorReadOnly\"\n >\n <mat-icon>close</mat-icon>\n <span>{{ \"intervalPicker.clear\" | translate }}</span>\n </button>\n }\n </mat-menu>\n\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ \"intervalPicker.anchorDate\" | translate }}</mat-label>\n <elder-local-date-input\n name=\"anchorDateInput\"\n (valueUpdated)=\"svc.setAnchorDateFromForm($event)\"\n [value]=\"svc.getAnchorPointAsLocaleDate()\"\n [readonly]=\"isAnchorReadOnly\"\n >\n </elder-local-date-input>\n @if (!isAnchorReadOnly) {\n <button\n mat-icon-button\n matSuffix\n [matMenuTriggerFor]=\"anchorMenu\"\n [disabled]=\"svc.isStartAndEndDatesEmpty() && !svc.fixedAnchorDate()\"\n >\n <mat-icon class=\"material-symbols-outlined\">more_horiz</mat-icon>\n </button>\n }\n </mat-form-field>\n @if (intervalInputMode === 'date-time-range') {\n <mat-form-field class=\"input-control-container-short\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ \"intervalPicker.anchorTime\" | translate }}</mat-label>\n <input\n matInput\n name=\"anchorTimeInput\"\n type=\"time\"\n #anchorTimeControl=\"ngModel\"\n step=\"1\"\n [readonly]=\"isAnchorReadOnly\"\n [ngModel]=\"svc.getAnchorTimeString()\"\n (ngModelChange)=\"svc.setAnchorTimeFromForm($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"this.svc.resetFixedAnchorTime()\"\n [disabled]=\"!svc.isFixedAnchorTimeSetAndNotMidnight() || isAnchorReadOnly\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n }\n </div>\n</ng-template>\n", styles: [".interval-picker-component{min-width:840px;max-width:100%}.fixed-shifts-container{max-width:160px}.input-control-container{width:192px;max-width:100%}.input-control-container-short{width:140px;max-width:100%}.select-buttons-container button{white-space:nowrap;text-align:left;justify-content:flex-start}::ng-deep .interval-picker-component .mat-calendar-body-cell.elder-custom-anchor-date .mat-calendar-body-cell-content{border-radius:50%;background-color:#def;background-color:#b4d2ebbf}\n"] }]
|
|
230
|
+
], providers: [ElderIntervalPickerService, { provide: DateAdapter, useClass: CustomDateAdapter }], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"interval-picker-component p-md layout-col gap-xxl\">\n <div class=\"layout-row gap-xxl place-between-start\" style=\"gap: 5%\">\n <div class=\"layout-col gap-md pt-xs\">\n <ng-container *ngTemplateOutlet=\"intervalSelector\"></ng-container>\n </div>\n <div class=\"layout-col\">\n <!-- smart shift -->\n <div class=\"layout-row place-around-center\">\n <button mat-icon-button (click)=\"svc.smartShift(-1)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ svc.viewIntervalMessage() }}</span>\n <button mat-icon-button (click)=\"svc.smartShift(1)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <!-- calendars and input controls -->\n <ng-container *ngTemplateOutlet=\"calendarsTemplate\"></ng-container>\n </div>\n <div class=\"pt-xs\" style=\"width: 25%\">\n <div class=\"layout-col gap-lg\">\n <div class=\"layout-col gap-xs place-start-start\">\n @if (isHelpTextsVisible) {\n <h5 class=\"mat-h5\">{{ 'intervalPicker.selectSmartInterval' | translate }}</h5>\n }\n <!-- select current -->\n <button mat-button (click)=\"svc.selectCurrentWeek()\">\n {{ 'intervalPicker.currentPeriod.week' | translate }}\n </button>\n <button mat-button (click)=\"svc.selectCurrentMonth()\">\n {{ 'intervalPicker.currentPeriod.month' | translate }}\n </button>\n <button mat-button (click)=\"svc.selectCurrentQuarter()\">\n {{ 'intervalPicker.currentPeriod.quarter' | translate }}\n </button>\n <button mat-button (click)=\"svc.selectCurrentYear()\">\n {{ 'intervalPicker.currentPeriod.year' | translate }}\n </button>\n </div>\n <div class=\"fixed-shifts-container\">\n <ng-container *ngTemplateOutlet=\"fixedShifts\"></ng-container>\n </div>\n </div>\n </div>\n </div>\n <div class=\"layout-row place-between-center gap-xxl pt-sm\">\n <div>\n @if (showAnchor) {\n <ng-container *ngTemplateOutlet=\"anchorInputField\"></ng-container>\n }\n </div>\n @if (isResultTextVisible) {\n <!-- result interval -->\n <div class=\"layout-col place-center-center\">\n <div class=\"date-interval mat-caption pt-xs\">\n @if (svc.startDateTimeAsJSDate()) {\n {{ svc.startDateTimeAsJSDate() | date: 'dd.MM. y, HH:mm:ss' }}\n } @else {\n {{ 'intervalPicker.startDateNotSet' | translate }}\n }\n <span> - </span>\n @if (svc.endDateTimeAsJSDate()) {\n {{ svc.endDateTimeAsJSDate() | date: 'dd.MM. y, HH:mm:ss' }}\n } @else {\n {{ 'intervalPicker.endDateNotSet' | translate }}\n }\n </div>\n <div>\n <span class=\"mat-caption\">{{ svc.deltaHumanReadable() || ' ' }}</span>\n </div>\n </div>\n }\n <div class=\"layout-row gap-lg\">\n <button\n mat-raised-button\n color=\"primary\"\n (click)=\"clearStartAndEndDateTimes()\"\n [disabled]=\"svc.isStartAndEndDatesEmpty()\"\n >\n {{ 'intervalPicker.clear' | translate }}\n </button>\n\n @if (!this.isEmittingOnChange) {\n <button color=\"primary\" mat-raised-button (click)=\"svc.emitMainDates()\">\n {{ 'actions.ok' | translate }}\n </button>\n }\n </div>\n </div>\n</div>\n\n<ng-template #intervalSelector>\n <div class=\"layout-col\">\n @if (isHelpTextsVisible) {\n <h5 class=\"mat-h5\">{{ 'intervalPicker.selectAbsoluteInterval' | translate }}</h5>\n }\n <div class=\"layout-row select-buttons-container gap-sm\">\n <div class=\"layout-col gap-xs place-start-stretch\">\n <button mat-button (click)=\"svc.selectCurrentDay()\">\n @if (svc.isFixedAnchorDateSet()) {\n {{ 'intervalPicker.anchorDay' | translate }}\n } @else {\n {{ 'intervalPicker.today' | translate }}\n }\n </button>\n <button mat-button (click)=\"svc.selectYesterday()\">\n @if (svc.isFixedAnchorDateSet()) {\n {{ 'intervalPicker.last' | translate }} 1 {{ 'intervalPicker.day' | translate }}\n } @else {\n {{ 'intervalPicker.yesterday' | translate }}\n }\n </button>\n @if (isSelectLastModeExcludingToday) {\n <button mat-button (click)=\"svc.selectLastSevenDaysExcludingToday()\">\n {{ 'intervalPicker.last' | translate }} 7 {{ 'intervalPicker.days' | translate }}\n </button>\n <button mat-button (click)=\"svc.selectLastThirtyDaysExcludingToday()\">\n {{ 'intervalPicker.last' | translate }} 30 {{ 'intervalPicker.days' | translate }}\n </button>\n } @else {\n <button mat-button (click)=\"svc.selectLastSevenDaysIncludingToday()\">\n {{ 'intervalPicker.last' | translate }} 7 {{ 'intervalPicker.days' | translate }}\n </button>\n <button mat-button (click)=\"svc.selectLastThirtyDaysIncludingToday()\">\n {{ 'intervalPicker.last' | translate }} 30 {{ 'intervalPicker.days' | translate }}\n </button>\n }\n @if (intervalInputMode === 'date-time-range') {\n <div class=\"pt-sm\"></div>\n <button mat-button (click)=\"svc.selectLastFiveMinutes()\">\n {{ 'intervalPicker.last' | translate }} 5 {{ 'intervalPicker.minutes' | translate }}\n </button>\n <button mat-button (click)=\"svc.selectLastHour()\">\n {{ 'intervalPicker.last' | translate }} {{ 'intervalPicker.hour' | translate }}\n </button>\n <button mat-button (click)=\"svc.selectLast24Hours()\">\n {{ 'intervalPicker.last' | translate }} 24 {{ 'intervalPicker.hours' | translate }}\n </button>\n }\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #calendarsTemplate>\n <div class=\"layout-row place-around-center\" style=\"align-items: flex-start; min-height: 280px\">\n <mat-calendar\n #rangeCalendarStart\n style=\"width: 210px; max-width: 100%\"\n [selected]=\"svc.dateRangeForCalendar()\"\n (selectedChange)=\"handleStartCalendarChange($event)\"\n [maxDate]=\"svc.endDateAsJSDate()\"\n [dateClass]=\"calendarAnchorDateCssClassFn\"\n >\n </mat-calendar>\n <mat-calendar\n #rangeCalendarEnd\n style=\"width: 210px; max-width: 100%\"\n [selected]=\"svc.dateRangeForCalendar()\"\n (selectedChange)=\"handleEndCalendarChange($event)\"\n [minDate]=\"svc.startDateAsJSDate()\"\n [dateClass]=\"calendarAnchorDateCssClassFn\"\n >\n </mat-calendar>\n </div>\n <div class=\"layout-row place-around-center gap-xl pt-sm\">\n <div class=\"layout-row place-around-center\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.startDate' | translate }}</mat-label>\n <input\n #startDateInput\n name=\"startDateInput\"\n matInput\n type=\"date\"\n [ngModel]=\"svc.startDateHtmlString()\"\n (ngModelChange)=\"svc.setStartDateFromHtmlString($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"this.clearStartDateTime()\"\n [disabled]=\"!this.svc.startDate()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n <div class=\"layout-row place-around-center\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.endDate' | translate }}</mat-label>\n <input\n #endDateInput\n name=\"endDateInput\"\n matInput\n type=\"date\"\n [ngModel]=\"svc.endDateHtmlString()\"\n (ngModelChange)=\"svc.setEndDateFromHtmlString($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"this.clearEndDateTime()\"\n [disabled]=\"!this.svc.endDate()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n </div>\n <br />\n @if (intervalInputMode === 'date-time-range') {\n <div class=\"layout-row place-around-center gap-xl pt-sm\">\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.startTime' | translate }}</mat-label>\n <input\n name=\"startTimeInput\"\n matInput\n type=\"time\"\n #startTimeControl=\"ngModel\"\n step=\"1\"\n [ngModel]=\"svc.getStartTimeString()\"\n (ngModelChange)=\"svc.setStartTimeFromString($event, startTimeControl)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"this.svc.clearStartTime()\"\n [disabled]=\"!this.svc.isStartTimeSetAndNotMidnight()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.endTime' | translate }}</mat-label>\n <input\n name=\"endTimeInput\"\n matInput\n type=\"time\"\n #endTimeControl=\"ngModel\"\n step=\"1\"\n [ngModel]=\"svc.getEndTimeString()\"\n (ngModelChange)=\"svc.setEndTimeFromString($event, endTimeControl)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"this.svc.clearEndTime()\"\n [disabled]=\"!this.svc.isEndTimeSetAndNotMidnight()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n }\n</ng-template>\n\n<ng-template #fixedShifts>\n @if (isHelpTextsVisible) {\n <h5 class=\"mat-h5\">{{ 'intervalPicker.shiftInterval' | translate }}</h5>\n }\n <div class=\"layout-col place-start-stretch\">\n <div class=\"layout-row place-between-center\">\n <button mat-icon-button (click)=\"svc.shiftDay(-1)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.day' | translate }}</span>\n <button mat-icon-button (click)=\"svc.shiftDay(1)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <div class=\"layout-row place-between-center\">\n <button mat-icon-button (click)=\"svc.shiftMonth(-1, true)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.month' | translate }}</span>\n <button mat-icon-button (click)=\"svc.shiftMonth(1, true)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <div class=\"layout-row place-between-center\">\n <button mat-icon-button (click)=\"svc.shiftYear(-1, true)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.year' | translate }}</span>\n <button mat-icon-button (click)=\"svc.shiftYear(1, true)\" [disabled]=\"svc.isRangeNotSet()\">\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n\n @if (intervalInputMode === 'date-time-range') {\n <!-- shift minute -->\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"svc.shiftTime(-1, 'minutes')\"\n [disabled]=\"svc.isRangeNotSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.minute' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"svc.shiftTime(1, 'minutes')\"\n [disabled]=\"svc.isRangeNotSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n <!-- shift hour -->\n <div class=\"layout-row place-between-center\">\n <button\n mat-icon-button\n (click)=\"svc.shiftTime(-1, 'hours')\"\n [disabled]=\"svc.isRangeNotSet()\"\n >\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n <span>{{ 'intervalPicker.hour' | translate }}</span>\n <button\n mat-icon-button\n (click)=\"svc.shiftTime(1, 'hours')\"\n [disabled]=\"svc.isRangeNotSet()\"\n >\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n </div>\n }\n </div>\n</ng-template>\n\n<ng-template #anchorInputField>\n <div class=\"layout-row flex-none gap-md\">\n <mat-menu #anchorMenu=\"matMenu\">\n @if (svc.startDate()) {\n <button\n mat-menu-item\n (click)=\"svc.setFixedAnchorPointToEndDateTime()\"\n [disabled]=\"!svc.endDate()\"\n >\n <mat-icon class=\"material-symbols-outlined\">login</mat-icon>\n <span>{{ 'intervalPicker.endDate' | translate }}</span>\n </button>\n }\n @if (svc.endDate()) {\n <button\n mat-menu-item\n (click)=\"svc.setFixedAnchorPointToStartDateTime()\"\n [disabled]=\"!svc.startDate()\"\n >\n <mat-icon class=\"material-symbols-outlined\">logout</mat-icon>\n <span>{{ 'intervalPicker.startDate' | translate }}</span>\n </button>\n }\n @if (svc.fixedAnchorDate()) {\n <button\n mat-menu-item\n (click)=\"this.svc.resetFixedAnchorPoint()\"\n [disabled]=\"!svc.fixedAnchorDate() || isAnchorReadOnly\"\n >\n <mat-icon>close</mat-icon>\n <span>{{ 'intervalPicker.clear' | translate }}</span>\n </button>\n }\n </mat-menu>\n\n <mat-form-field class=\"input-control-container\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.anchorDate' | translate }}</mat-label>\n <elder-local-date-input\n name=\"anchorDateInput\"\n (valueUpdated)=\"svc.setAnchorDateFromForm($event)\"\n [value]=\"svc.getAnchorPointAsLocaleDate()\"\n [readonly]=\"isAnchorReadOnly\"\n >\n </elder-local-date-input>\n @if (!isAnchorReadOnly) {\n <button\n mat-icon-button\n matSuffix\n [matMenuTriggerFor]=\"anchorMenu\"\n [disabled]=\"svc.isStartAndEndDatesEmpty() && !svc.fixedAnchorDate()\"\n >\n <mat-icon class=\"material-symbols-outlined\">more_horiz</mat-icon>\n </button>\n }\n </mat-form-field>\n @if (intervalInputMode === 'date-time-range') {\n <mat-form-field class=\"input-control-container-short\" [subscriptSizing]=\"'dynamic'\">\n <mat-label>{{ 'intervalPicker.anchorTime' | translate }}</mat-label>\n <input\n matInput\n name=\"anchorTimeInput\"\n type=\"time\"\n #anchorTimeControl=\"ngModel\"\n step=\"1\"\n [readonly]=\"isAnchorReadOnly\"\n [ngModel]=\"svc.getAnchorTimeString()\"\n (ngModelChange)=\"svc.setAnchorTimeFromForm($event)\"\n />\n <button\n mat-icon-button\n matSuffix\n (click)=\"this.svc.resetFixedAnchorTime()\"\n [disabled]=\"!svc.isFixedAnchorTimeSetAndNotMidnight() || isAnchorReadOnly\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n }\n </div>\n</ng-template>\n", styles: [".interval-picker-component{min-width:840px;max-width:100%}.fixed-shifts-container{max-width:160px}.input-control-container{width:192px;max-width:100%}.input-control-container-short{width:140px;max-width:100%}.select-buttons-container button{white-space:nowrap;text-align:left;justify-content:flex-start}::ng-deep .interval-picker-component .mat-calendar-body-cell.elder-custom-anchor-date .mat-calendar-body-cell-content{border-radius:50%;background-color:#def;background-color:#b4d2ebbf}\n"] }]
|
|
236
231
|
}], ctorParameters: () => [{ type: i1.ElderIntervalPickerService }], propDecorators: { calendarStart: [{
|
|
237
232
|
type: ViewChild,
|
|
238
233
|
args: ['rangeCalendarStart']
|
|
@@ -263,7 +258,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImpor
|
|
|
263
258
|
type: Input
|
|
264
259
|
}], isHelpTextsVisible: [{
|
|
265
260
|
type: Input
|
|
261
|
+
}], isSelectLastModeExcludingToday: [{
|
|
262
|
+
type: Input
|
|
266
263
|
}], dateChange: [{
|
|
267
264
|
type: Output
|
|
268
265
|
}] } });
|
|
269
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItaW50ZXJ2YWwtcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VsZGVyYnl0ZS9uZ3gtc3RhcnRlci9zcmMvbGliL2NvbXBvbmVudHMvdGltZS9lbGRlci1pbnRlcnZhbC1waWNrZXIvZWxkZXItaW50ZXJ2YWwtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VsZGVyYnl0ZS9uZ3gtc3RhcnRlci9zcmMvbGliL2NvbXBvbmVudHMvdGltZS9lbGRlci1pbnRlcnZhbC1waWNrZXIvZWxkZXItaW50ZXJ2YWwtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxNQUFNLEVBRU4sVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUNMLFdBQVcsRUFFWCxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbkIsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLE9BQU8sRUFDUCxRQUFRLEdBQ1QsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFF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QUNBLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFFaEIsa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgZWZmZWN0LFxuICBFZmZlY3RSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgaW5wdXQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBEYXRlQWRhcHRlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHtcbiAgTWF0Q2FsZW5kYXIsXG4gIE1hdENhbGVuZGFyQ2VsbENsYXNzRnVuY3Rpb24sXG4gIE1hdERhdGVwaWNrZXJNb2R1bGUsXG4gIE1hdERhdGVwaWNrZXJUb2dnbGUsXG4gIE1hdERhdGVSYW5nZUlucHV0LFxuICBNYXREYXRlUmFuZ2VQaWNrZXJcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQge1xuICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gIE1hdEhpbnQsXG4gIE1hdExhYmVsLFxufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHsgTG9nZ2VyRmFjdG9yeSB9IGZyb20gJ0BlbGRlcmJ5dGUvdHMtbG9nZ2VyJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgSW50ZXJ2YWwgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdGltZS9pbnRlcnZhbCc7XG5pbXBvcnQgeyBUZW1wb3JhbFV0aWwgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdGltZS90ZW1wb3JhbC11dGlsJztcbmltcG9ydCB7IEN1c3RvbURhdGVBZGFwdGVyIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy90aW1lL2RhdGUtYWRhcHRlcnMvY3VzdG9tLWRhdGUtYWRhcHRlcic7XG5pbXBvcnQgeyBJbnRlcnZhbElucHV0TW9kZSB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvdGltZS9lbGRlci1pbnRlcnZhbC1pbnB1dC9lbGRlci1pbnRlcnZhbC1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRWxkZXJMb2NhbERhdGVJbnB1dENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvdGltZS9lbGRlci1sb2NhbC1kYXRlLWlucHV0L2VsZGVyLWxvY2FsLWRhdGUtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IEVsZGVySW50ZXJ2YWxQaWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi9lbGRlci1pbnRlcnZhbC1waWNrZXIuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2VsZGVyLWludGVydmFsLXBpY2tlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBNYXREYXRlUmFuZ2VQaWNrZXIsXG4gICAgTWF0RGF0ZXBpY2tlck1vZHVsZSxcbiAgICBNYXREYXRlUmFuZ2VJbnB1dCxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0TGFiZWwsXG4gICAgTWF0SGludCxcbiAgICBNYXREYXRlcGlja2VyVG9nZ2xlLFxuICAgIE1hdElucHV0TW9kdWxlLFxuICAgIENvbW1vbk1vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXRDYWxlbmRhcixcbiAgICBFbGRlckxvY2FsRGF0ZUlucHV0Q29tcG9uZW50LFxuICAgIE1hdFRvb2x0aXAsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIE1hdE1lbnVNb2R1bGUsXG4gIF0sXG4gIHByb3ZpZGVyczogW1xuICAgIEVsZGVySW50ZXJ2YWxQaWNrZXJTZXJ2aWNlLFxuICAgIHsgcHJvdmlkZTogRGF0ZUFkYXB0ZXIsIHVzZUNsYXNzOiBDdXN0b21EYXRlQWRhcHRlciB9LFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vZWxkZXItaW50ZXJ2YWwtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2VsZGVyLWludGVydmFsLXBpY2tlci5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBFbGRlckludGVydmFsUGlja2VyQ29tcG9uZW50IHtcbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIEZpZWxkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSByZWFkb25seSBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuICBwdWJsaWMgcmVhZG9ubHkgY2FsZW5kYXJBbmNob3JEYXRlQ3NzQ2xhc3NGbjogTWF0Q2FsZW5kYXJDZWxsQ2xhc3NGdW5jdGlvbjxEYXRlPiA9XG4gICAgKGNlbGxEYXRlOiBEYXRlLCB2aWV3OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsZW5kYXJBbmNob3JEYXRlQ3NzQ2xhc3NGbkJvZHkoY2VsbERhdGUsIHZpZXcpO1xuICAgIH07XG5cbiAgQFZpZXdDaGlsZCgncmFuZ2VDYWxlbmRhclN0YXJ0JykgY2FsZW5kYXJTdGFydCE6IE1hdENhbGVuZGFyPERhdGU+O1xuICBAVmlld0NoaWxkKCdyYW5nZUNhbGVuZGFyRW5kJykgY2FsZW5kYXJFbmQhOiBNYXRDYWxlbmRhcjxEYXRlPjtcblxuICBAVmlld0NoaWxkKCdyYW5nZUNhbGVuZGFyU3RhcnQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgY2FsZW5kYXJTdGFydEVsUmVmITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgncmFuZ2VDYWxlbmRhckVuZCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBjYWxlbmRhckVuZEVsUmVmITogRWxlbWVudFJlZjtcblxuICBAVmlld0NoaWxkKCdzdGFydERhdGVJbnB1dCcpIHN0YXJ0RGF0ZUlucHV0ITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnZW5kRGF0ZUlucHV0JykgZW5kRGF0ZUlucHV0ITogRWxlbWVudFJlZjtcblxuICBASW5wdXQoKSBpc0VtaXR0aW5nT25DaGFuZ2UgPSB0cnVlO1xuICBASW5wdXQoKSBpbnRlcnZhbElucHV0TW9kZTogSW50ZXJ2YWxJbnB1dE1vZGUgPSAnZGF0ZS1yYW5nZSc7XG4gIEBJbnB1dCgpIHNob3dBbmNob3IgPSBmYWxzZTtcbiAgQElucHV0KCkgaXNBbmNob3JSZWFkT25seSA9IGZhbHNlO1xuICBASW5wdXQoKSBpc1Jlc3VsdFRleHRWaXNpYmxlID0gdHJ1ZTtcbiAgQElucHV0KCkgaXNIZWxwVGV4dHNWaXNpYmxlID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBkYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJbnRlcnZhbD4oKTtcbiAgaW5wdXRJbnRlcnZhbCA9IGlucHV0PEludGVydmFsPihudWxsKTtcbiAgaW5wdXRBbmNob3JEYXRlVGltZSA9IGlucHV0PERhdGU+KG51bGwpO1xuXG4gIHByaXZhdGUgY2FsZW5kYXJFbEZvY3VzRXZlbnRIYW5kbGVyOiAoZXZlbnQ6IEZvY3VzRXZlbnQpID0+IHZvaWQ7XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIENvbnN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgY29uc3RydWN0b3IocHVibGljIHN2YzogRWxkZXJJbnRlcnZhbFBpY2tlclNlcnZpY2UpIHtcbiAgICB0aGlzLnN2Yy5zZXR1cElucHV0SW50ZXJ2YWwodGhpcy5pbnB1dEludGVydmFsKTtcbiAgICB0aGlzLnN2Yy5zZXR1cElucHV0QW5jaG9yRGF0ZVRpbWUodGhpcy5pbnB1dEFuY2hvckRhdGVUaW1lKTtcbiAgICB0aGlzLnN2Yy5zZXR1cEV2ZW50RW1pdHRlcih0aGlzLmRhdGVDaGFuZ2UpO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIExpZmUgQ3ljbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5wdXRJbnRlcnZhbCkge1xuICAgICAgdGhpcy5zdmMucHVsbElucHV0SW50ZXJ2YWwoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW5wdXRBbmNob3JEYXRlVGltZSgpKSB7XG4gICAgICB0aGlzLnN2Yy5wdWxsSW5wdXRBbmNob3JEYXRlVGltZSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN2Yy5pc0VtaXR0aW5nT25DaGFuZ2Uuc2V0KHRoaXMuaXNFbWl0dGluZ09uQ2hhbmdlKTtcbiAgICB0aGlzLnNldHVwRGF0ZUlucHV0Q2FsZW5kYXJGb2N1c1ByZXZlbnRpb24oKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQdWJsaWMgQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHNldHVwRGF0ZUlucHV0Q2FsZW5kYXJGb2N1c1ByZXZlbnRpb24oKTogdm9pZCB7XG4gICAgLy8gUHJldmVudHMgdGhlIGZvY3VzIG9uIHRoZSBjYWxlbmRhciB3aGVuIHRoZSBpbnB1dCBmaWVsZCBpcyBjaGFuZ2VkIHZpYSB0aGUga2V5Ym9hcmRcbiAgICB0aGlzLmNhbGVuZGFyRWxGb2N1c0V2ZW50SGFuZGxlciA9IChldmVudDogRm9jdXNFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFldmVudCB8fCAhZXZlbnQucmVsYXRlZFRhcmdldCkge1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIH1cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCByZWxUYXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgICAgIGlmIChyZWxUYXJnZXQubmFtZSA9PT0gJ3N0YXJ0RGF0ZUlucHV0Jykge1xuICAgICAgICB0aGlzLnN0YXJ0RGF0ZUlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBcbiAgICAgIGlmIChyZWxUYXJnZXQubmFtZSA9PT0gJ2VuZERhdGVJbnB1dCcpIHtcbiAgICAgICAgdGhpcy5lbmREYXRlSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbmF0aXZlRWxlbWVudFN0YXJ0ID0gdGhpcy5jYWxlbmRhclN0YXJ0RWxSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBuYXRpdmVFbGVtZW50RW5kID0gdGhpcy5jYWxlbmRhckVuZEVsUmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBuYXRpdmVFbGVtZW50U3RhcnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLmNhbGVuZGFyRWxGb2N1c0V2ZW50SGFuZGxlciwgdHJ1ZSk7XG4gICAgbmF0aXZlRWxlbWVudEVuZC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuY2FsZW5kYXJFbEZvY3VzRXZlbnRIYW5kbGVyLCB0cnVlKTtcbiAgfVxuXG4gIGNsZWFyU3RhcnREYXRlVGltZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN2Yy5jbGVhclN0YXJ0RGF0ZVRpbWUoKTtcblxuICAgIHRoaXMuc3ZjLnJlc2V0Q2FsZW5kYXJNb2RlKCk7XG5cbiAgICBpZiAodGhpcy5pc0VtaXR0aW5nT25DaGFuZ2UpIHtcbiAgICAgIHRoaXMuc3ZjLmVtaXRNYWluRGF0ZXMoKTtcbiAgICB9XG4gIH1cblxuICBjbGVhckVuZERhdGVUaW1lKCk6IHZvaWQge1xuICAgIHRoaXMuc3ZjLmNsZWFyRW5kRGF0ZVRpbWUoKTtcblxuICAgIHRoaXMuc3ZjLnJlc2V0Q2FsZW5kYXJNb2RlKCk7XG5cbiAgICBpZiAodGhpcy5pc0VtaXR0aW5nT25DaGFuZ2UpIHtcbiAgICAgIHRoaXMuc3ZjLmVtaXRNYWluRGF0ZXMoKTtcbiAgICB9XG4gIH1cblxuICBjbGVhclN0YXJ0QW5kRW5kRGF0ZVRpbWVzKCk6IHZvaWQge1xuICAgIHRoaXMuc3ZjLmNsZWFyU3RhcnREYXRlVGltZSgpO1xuICAgIHRoaXMuc3ZjLmNsZWFyRW5kRGF0ZVRpbWUoKTtcblxuICAgIHRoaXMuc3ZjLnJlc2V0Q2FsZW5kYXJNb2RlKCk7XG5cbiAgICBpZiAodGhpcy5pc0VtaXR0aW5nT25DaGFuZ2UpIHtcbiAgICAgIHRoaXMuc3ZjLmVtaXRNYWluRGF0ZXMoKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVTdGFydENhbGVuZGFyQ2hhbmdlKGNoYW5nZWREYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5zdmMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpO1xuICAgIGNvbnN0IG5ld1BsYWluRGF0ZSA9IFRlbXBvcmFsVXRpbC5nZXRQbGFpbkRhdGVGcm9tSlNEYXRlKGNoYW5nZWREYXRlKTtcbiAgICB0aGlzLnN2Yy5zdGFydERhdGUuc2V0KG5ld1BsYWluRGF0ZSk7XG4gIH1cblxuICBoYW5kbGVFbmRDYWxlbmRhckNoYW5nZShjaGFuZ2VkRGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuc3ZjLmNhbGVuZGFyTW9kZS5zZXQoJ2RheXMnKTtcbiAgICBjb25zdCBuZXdQbGFpbkRhdGUgPSBUZW1wb3JhbFV0aWwuZ2V0UGxhaW5EYXRlRnJvbUpTRGF0ZShjaGFuZ2VkRGF0ZSk7XG4gICAgdGhpcy5zdmMuZW5kRGF0ZS5zZXQobmV3UGxhaW5EYXRlKTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQcml2YXRlIG1ldGhvZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHByaXZhdGUgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhbGVuZGFyU3RhcnRFbFJlZiB8fCAhdGhpcy5jYWxlbmRhckVuZEVsUmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNhbGVuZGFyU3RhcnRFbFJlZi5uYXRpdmVFbGVtZW50IHx8ICF0aGlzLmNhbGVuZGFyRW5kRWxSZWYubmF0aXZlRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5hdGl2ZUVsZW1lbnRTdGFydCA9IHRoaXMuY2FsZW5kYXJTdGFydEVsUmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgbmF0aXZlRWxlbWVudEVuZCA9IHRoaXMuY2FsZW5kYXJFbmRFbFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgbmF0aXZlRWxlbWVudFN0YXJ0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5jYWxlbmRhckVsRm9jdXNFdmVudEhhbmRsZXIsIHRydWUpO1xuICAgIG5hdGl2ZUVsZW1lbnRFbmQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLmNhbGVuZGFyRWxGb2N1c0V2ZW50SGFuZGxlciwgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGNhbGVuZGFyQW5jaG9yRGF0ZUNzc0NsYXNzRm5Cb2R5KFxuICAgIGNlbGxEYXRlOiBEYXRlLFxuICAgIHZpZXc6IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGFuY2hvckRhdGUgPSB0aGlzLnN2Yy5maXhlZEFuY2hvckRhdGUoKTtcblxuICAgIGlmICghYW5jaG9yRGF0ZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGUgPSBUZW1wb3JhbFV0aWwuZ2V0SlNEYXRlRnJvbVBsYWluRGF0ZVRpbWUoYW5jaG9yRGF0ZSk7XG5cbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjZWxsRGF0ZS5nZXREYXRlKCkgPT09IGRhdGUuZ2V0RGF0ZSgpICYmXG4gICAgICBjZWxsRGF0ZS5nZXRNb250aCgpID09PSBkYXRlLmdldE1vbnRoKCkgJiZcbiAgICAgIGNlbGxEYXRlLmdldEZ1bGxZZWFyKCkgPT09IGRhdGUuZ2V0RnVsbFllYXIoKVxuICAgICkge1xuICAgICAgcmV0dXJuICdlbGRlci1jdXN0b20tYW5jaG9yLWRhdGUnO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBFZmZlY3RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3VwZGF0ZU1hdENhbGVuZGFyRWxBbmNob3JDc3NDbGFzc0VmZmVjdDogRWZmZWN0UmVmID0gZWZmZWN0KFxuICAgICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGFuY2hvckRhdGUgPSB0aGlzLnN2Yy5hbmNob3JEYXRlKCk7XG5cbiAgICAgIGlmIChhbmNob3JEYXRlKSB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJTdGFydC51cGRhdGVUb2RheXNEYXRlKCk7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJFbmQudXBkYXRlVG9kYXlzRGF0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF91cGRhdGVNYXRDYWxlbmRhckVsU2VsZWN0aW9uRWZmZWN0OiBFZmZlY3RSZWYgPSBlZmZlY3QoXG4gICAgKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5zdmMuc3RhcnREYXRlKCk7XG4gICAgICBjb25zdCBlbmREYXRlID0gdGhpcy5zdmMuZW5kRGF0ZSgpO1xuXG4gICAgICBpZiAoIXRoaXMuY2FsZW5kYXJTdGFydCB8fCAhdGhpcy5jYWxlbmRhckVuZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghc3RhcnREYXRlICYmICFlbmREYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FsZW5kYXIxID0gdGhpcy5jYWxlbmRhclN0YXJ0O1xuICAgICAgY29uc3QgY2FsZW5kYXIyID0gdGhpcy5jYWxlbmRhckVuZDtcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIC8vIHRpbWVvdXQgaXMgbmVlZGVkIHRvIHJ1biBydW4gY2FsZW5kYXIgdXBkYXRlIGxhc3QsIG90aGVyd2lzZSB0aGVyZSBhcmUgaXNzdWVzXG4gICAgICAgIGlmIChzdGFydERhdGUpIHtcbiAgICAgICAgICBjb25zdCBzdGFydEpzRGF0ZSA9XG4gICAgICAgICAgICBUZW1wb3JhbFV0aWwuZ2V0SlNEYXRlRnJvbVBsYWluRGF0ZVRpbWUoc3RhcnREYXRlKTtcbiAgICAgICAgICBjYWxlbmRhcjEuYWN0aXZlRGF0ZSA9IHN0YXJ0SnNEYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVuZERhdGUpIHtcbiAgICAgICAgICBjb25zdCBlbmRKc0RhdGUgPSBUZW1wb3JhbFV0aWwuZ2V0SlNEYXRlRnJvbVBsYWluRGF0ZVRpbWUoZW5kRGF0ZSk7XG4gICAgICAgICAgY2FsZW5kYXIyLmFjdGl2ZURhdGUgPSBlbmRKc0RhdGU7XG4gICAgICAgIH1cbiAgICAgIH0sIDApO1xuICAgIH1cbiAgKTtcbn1cbiIsIjxkaXYgY2xhc3M9XCJpbnRlcnZhbC1waWNrZXItY29tcG9uZW50IHAtbWQgbGF5b3V0LWNvbCBnYXAteHhsXCI+XG4gIDxkaXYgY2xhc3M9XCJsYXlvdXQtcm93IGdhcC14eGwgcGxhY2UtYmV0d2Vlbi1zdGFydFwiIHN0eWxlPVwiZ2FwOiA1JVwiPlxuICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtY29sIGdhcC1tZCBwdC14c1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImludGVydmFsU2VsZWN0b3JcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LWNvbFwiPlxuICAgICAgPCEtLSBzbWFydCBzaGlmdCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtcm93IHBsYWNlLWFyb3VuZC1jZW50ZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInN2Yy5zbWFydFNoaWZ0KC0xKVwiIFtkaXNhYmxlZF09XCJzdmMuaXNSYW5nZU5vdFNldCgpXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmtleWJvYXJkX2RvdWJsZV9hcnJvd19sZWZ0PC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxzcGFuPnt7IHN2Yy52aWV3SW50ZXJ2YWxNZXNzYWdlKCkgfX08L3NwYW4+XG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJzdmMuc21hcnRTaGlmdCgxKVwiIFtkaXNhYmxlZF09XCJzdmMuaXNSYW5nZU5vdFNldCgpXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmtleWJvYXJkX2RvdWJsZV9hcnJvd19yaWdodDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIGNhbGVuZGFycyBhbmQgaW5wdXQgY29udHJvbHMgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FsZW5kYXJzVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHQteHNcIiBzdHlsZT1cIndpZHRoOiAyNSVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtY29sIGdhcC1sZ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LWNvbCBnYXAteHMgcGxhY2Utc3RhcnQtc3RhcnRcIj5cbiAgICAgICAgICBAaWYgKGlzSGVscFRleHRzVmlzaWJsZSkge1xuICAgICAgICAgIDxoNSBjbGFzcz1cIm1hdC1oNVwiPnt7IFwiaW50ZXJ2YWxQaWNrZXIuc2VsZWN0U21hcnRJbnRlcnZhbFwiIHwgdHJhbnNsYXRlIH19PC9oNT5cbiAgICAgICAgICB9XG4gICAgICAgICAgPCEtLSBzZWxlY3QgY3VycmVudCAtLT5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cInN2Yy5zZWxlY3RDdXJyZW50V2VlaygpXCI+XG4gICAgICAgICAgICB7eyBcImludGVydmFsUGlja2VyLmN1cnJlbnRQZXJpb2Qud2Vla1wiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJzdmMuc2VsZWN0Q3VycmVudE1vbnRoKClcIj5cbiAgICAgICAgICAgIHt7IFwiaW50ZXJ2YWxQaWNrZXIuY3VycmVudFBlcmlvZC5tb250aFwiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJzdmMuc2VsZWN0Q3VycmVudFF1YXJ0ZXIoKVwiPlxuICAgICAgICAgICAge3sgXCJpbnRlcnZhbFBpY2tlci5jdXJyZW50UGVyaW9kLnF1YXJ0ZXJcIiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwic3ZjLnNlbGVjdEN1cnJlbnRZZWFyKClcIj5cbiAgICAgICAgICAgIHt7IFwiaW50ZXJ2YWxQaWNrZXIuY3VycmVudFBlcmlvZC55ZWFyXCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaXhlZC1zaGlmdHMtY29udGFpbmVyXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZpeGVkU2hpZnRzXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibGF5b3V0LXJvdyBwbGFjZS1iZXR3ZWVuLWNlbnRlciBnYXAteHhsIHB0LXNtXCI+XG4gICAgPGRpdj5cbiAgICAgIEBpZiAoc2hvd0FuY2hvcikge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFuY2hvcklucHV0RmllbGRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICBAaWYgKGlzUmVzdWx0VGV4dFZpc2libGUpIHtcbiAgICA8IS0tIHJlc3VsdCBpbnRlcnZhbCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LWNvbCBwbGFjZS1jZW50ZXItY2VudGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1pbnRlcnZhbCBtYXQtY2FwdGlvbiBwdC14c1wiPlxuICAgICAgICBAaWYgKHN2Yy5zdGFydERhdGVUaW1lQXNKU0RhdGUoKSkge1xuICAgICAgICB7eyBzdmMuc3RhcnREYXRlVGltZUFzSlNEYXRlKCkgfCBkYXRlIDogXCJkZC5NTS4geSwgSEg6bW06c3NcIiB9fVxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAge3sgXCJpbnRlcnZhbFBpY2tlci5zdGFydERhdGVOb3RTZXRcIiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICB9XG4gICAgICAgIDxzcGFuPiAtIDwvc3Bhbj5cbiAgICAgICAgQGlmIChzdmMuZW5kRGF0ZVRpbWVBc0pTRGF0ZSgpKSB7XG4gICAgICAgIHt7IHN2Yy5lbmREYXRlVGltZUFzSlNEYXRlKCkgfCBkYXRlIDogXCJkZC5NTS4geSwgSEg6bW06c3NcIiB9fVxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAge3sgXCJpbnRlcnZhbFBpY2tlci5lbmREYXRlTm90U2V0XCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1jYXB0aW9uXCI+e3sgc3ZjLmRlbHRhSHVtYW5SZWFkYWJsZSgpIHx8IFwiJm5ic3A7XCIgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICB9XG4gICAgPGRpdiBjbGFzcz1cImxheW91dC1yb3cgZ2FwLWxnXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgIChjbGljayk9XCJjbGVhclN0YXJ0QW5kRW5kRGF0ZVRpbWVzKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwic3ZjLmlzU3RhcnRBbmRFbmREYXRlc0VtcHR5KClcIlxuICAgICAgPlxuICAgICAgICB7eyBcImludGVydmFsUGlja2VyLmNsZWFyXCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICBAaWYoIXRoaXMuaXNFbWl0dGluZ09uQ2hhbmdlKSB7XG4gICAgICA8YnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJzdmMuZW1pdE1haW5EYXRlcygpXCI+XG4gICAgICAgIHt7IFwiYWN0aW9ucy5va1wiIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNpbnRlcnZhbFNlbGVjdG9yPlxuICA8ZGl2IGNsYXNzPVwibGF5b3V0LWNvbFwiPlxuICAgIEBpZiAoaXNIZWxwVGV4dHNWaXNpYmxlKSB7XG4gICAgPGg1IGNsYXNzPVwibWF0LWg1XCI+e3sgXCJpbnRlcnZhbFBpY2tlci5zZWxlY3RBYnNvbHV0ZUludGVydmFsXCIgfCB0cmFuc2xhdGUgfX08L2g1PlxuICAgIH1cbiAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXJvdyBzZWxlY3QtYnV0dG9ucy1jb250YWluZXIgZ2FwLXNtXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LWNvbCBnYXAteHMgcGxhY2Utc3RhcnQtc3RyZXRjaFwiPlxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cInN2Yy5zZWxlY3RDdXJyZW50RGF5KClcIj5cbiAgICAgICAgICBAaWYoc3ZjLmlzRml4ZWRBbmNob3JEYXRlU2V0KCkpIHtcbiAgICAgICAgICB7eyBcImludGVydmFsUGlja2VyLmFuY2hvckRheVwiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAge3sgXCJpbnRlcnZhbFBpY2tlci50b2RheVwiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJzdmMuc2VsZWN0WWVzdGVyZGF5KClcIj5cbiAgICAgICAgICBAaWYgKHN2Yy5pc0ZpeGVkQW5jaG9yRGF0ZVNldCgpKSB7XG4gICAgICAgICAge3sgXCJpbnRlcnZhbFBpY2tlci5sYXN0XCIgfCB0cmFuc2xhdGUgfX0gMSB7eyBcImludGVydmFsUGlja2VyLmRheVwiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAge3sgXCJpbnRlcnZhbFBpY2tlci55ZXN0ZXJkYXlcIiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIH1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwic3ZjLnNlbGVjdExhc3RTZXZlbkRheXMoKVwiPlxuICAgICAgICAgIHt7IFwiaW50ZXJ2YWxQaWNrZXIubGFzdFwiIHwgdHJhbnNsYXRlIH19IDcge3sgXCJpbnRlcnZhbFBpY2tlci5kYXlzXCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwic3ZjLnNlbGVjdExhc3RUaGlydHlEYXlzKClcIj5cbiAgICAgICAgICB7eyBcImludGVydmFsUGlja2VyLmxhc3RcIiB8IHRyYW5zbGF0ZSB9fSAzMCB7eyBcImludGVydmFsUGlja2VyLmRheXNcIiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgQGlmIChpbnRlcnZhbElucHV0TW9kZSA9PT0gJ2RhdGUtdGltZS1yYW5nZScpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInB0LXNtXCI+PC9kaXY+XG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwic3ZjLnNlbGVjdExhc3RGaXZlTWludXRlcygpXCI+XG4gICAgICAgICAge3sgXCJpbnRlcnZhbFBpY2tlci5sYXN0XCIgfCB0cmFuc2xhdGUgfX0gNSB7eyBcImludGVydmFsUGlja2VyLm1pbnV0ZXNcIiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJzdmMuc2VsZWN0TGFzdEhvdXIoKVwiPlxuICAgICAgICAgIHt7IFwiaW50ZXJ2YWxQaWNrZXIubGFzdFwiIHwgdHJhbnNsYXRlIH19IHt7IFwiaW50ZXJ2YWxQaWNrZXIuaG91clwiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cInN2Yy5zZWxlY3RMYXN0MjRIb3VycygpXCI+XG4gICAgICAgICAge3sgXCJpbnRlcnZhbFBpY2tlci5sYXN0XCIgfCB0cmFuc2xhdGUgfX0gMjQge3sgXCJpbnRlcnZhbFBpY2tlci5ob3Vyc1wiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NhbGVuZGFyc1RlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwibGF5b3V0LXJvdyBwbGFjZS1hcm91bmQtY2VudGVyXCIgc3R5bGU9XCJhbGlnbi1pdGVtczogZmxleC1zdGFydDsgbWluLWhlaWdodDogMjgwcHhcIj5cbiAgICA8bWF0LWNhbGVuZGFyXG4gICAgICAjcmFuZ2VDYWxlbmRhclN0YXJ0XG4gICAgICBzdHlsZT1cIndpZHRoOiAyMTBweDsgbWF4LXdpZHRoOiAxMDAlXCJcbiAgICAgIFtzZWxlY3RlZF09XCJzdmMuZGF0ZVJhbmdlRm9yQ2FsZW5kYXIoKVwiXG4gICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwiaGFuZGxlU3RhcnRDYWxlbmRhckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIFttYXhEYXRlXT1cInN2Yy5lbmREYXRlQXNKU0RhdGUoKVwiXG4gICAgICBbZGF0ZUNsYXNzXT1cImNhbGVuZGFyQW5jaG9yRGF0ZUNzc0NsYXNzRm5cIlxuICAgID5cbiAgICA8L21hdC1jYWxlbmRhcj5cbiAgICA8bWF0LWNhbGVuZGFyXG4gICAgICAjcmFuZ2VDYWxlbmRhckVuZFxuICAgICAgc3R5bGU9XCJ3aWR0aDogMjEwcHg7IG1heC13aWR0aDogMTAwJVwiXG4gICAgICBbc2VsZWN0ZWRdPVwic3ZjLmRhdGVSYW5nZUZvckNhbGVuZGFyKClcIlxuICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cImhhbmRsZUVuZENhbGVuZGFyQ2hhbmdlKCRldmVudClcIlxuICAgICAgW21pbkRhdGVdPVwic3ZjLnN0YXJ0RGF0ZUFzSlNEYXRlKClcIlxuICAgICAgW2RhdGVDbGFzc109XCJjYWxlbmRhckFuY2hvckRhdGVDc3NDbGFzc0ZuXCJcbiAgICA+XG4gICAgPC9tYXQtY2FsZW5kYXI+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibGF5b3V0LXJvdyBwbGFjZS1hcm91bmQtY2VudGVyIGdhcC14bCBwdC1zbVwiPlxuICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtcm93IHBsYWNlLWFyb3VuZC1jZW50ZXJcIj5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImlucHV0LWNvbnRyb2wtY29udGFpbmVyXCIgW3N1YnNjcmlwdFNpemluZ109XCInZHluYW1pYydcIj5cbiAgICAgICAgPG1hdC1sYWJlbD57eyBcImludGVydmFsUGlja2VyLnN0YXJ0RGF0ZVwiIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICNzdGFydERhdGVJbnB1dFxuICAgICAgICAgIG5hbWU9XCJzdGFydERhdGVJbnB1dFwiXG4gICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICB0eXBlPVwiZGF0ZVwiXG4gICAgICAgICAgW25nTW9kZWxdPVwic3ZjLnN0YXJ0RGF0ZUh0bWxTdHJpbmcoKVwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic3ZjLnNldFN0YXJ0RGF0ZUZyb21IdG1sU3RyaW5nKCRldmVudClcIlxuICAgICAgICAvPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgKGNsaWNrKT1cInRoaXMuY2xlYXJTdGFydERhdGVUaW1lKClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhdGhpcy5zdmMuc3RhcnREYXRlKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtcm93IHBsYWNlLWFyb3VuZC1jZW50ZXJcIj5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImlucHV0LWNvbnRyb2wtY29udGFpbmVyXCIgW3N1YnNjcmlwdFNpemluZ109XCInZHluYW1pYydcIj5cbiAgICAgICAgPG1hdC1sYWJlbD57eyBcImludGVydmFsUGlja2VyLmVuZERhdGVcIiB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAjZW5kRGF0ZUlucHV0XG4gICAgICAgICAgbmFtZT1cImVuZERhdGVJbnB1dFwiXG4gICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICB0eXBlPVwiZGF0ZVwiXG4gICAgICAgICAgW25nTW9kZWxdPVwic3ZjLmVuZERhdGVIdG1sU3RyaW5nKClcIlxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInN2Yy5zZXRFbmREYXRlRnJvbUh0bWxTdHJpbmcoJGV2ZW50KVwiXG4gICAgICAgIC8+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAoY2xpY2spPVwidGhpcy5jbGVhckVuZERhdGVUaW1lKClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhdGhpcy5zdmMuZW5kRGF0ZSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxiciAvPlxuICBAaWYgKGludGVydmFsSW5wdXRNb2RlID09PSAnZGF0ZS10aW1lLXJhbmdlJykge1xuICA8ZGl2IGNsYXNzPVwibGF5b3V0LXJvdyBwbGFjZS1hcm91bmQtY2VudGVyIGdhcC14bCBwdC1zbVwiPlxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImlucHV0LWNvbnRyb2wtY29udGFpbmVyXCIgW3N1YnNjcmlwdFNpemluZ109XCInZHluYW1pYydcIj5cbiAgICAgIDxtYXQtbGFiZWw+e3sgXCJpbnRlcnZhbFBpY2tlci5zdGFydFRpbWVcIiB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgPGlucHV0XG4gICAgICAgIG5hbWU9XCJzdGFydFRpbWVJbnB1dFwiXG4gICAgICAgIG1hdElucHV0XG4gICAgICAgIHR5cGU9XCJ0aW1lXCJcbiAgICAgICAgI3N0YXJ0VGltZUNvbnRyb2w9XCJuZ01vZGVsXCJcbiAgICAgICAgc3RlcD1cIjFcIlxuICAgICAgICBbbmdNb2RlbF09XCJzdmMuZ2V0U3RhcnRUaW1lU3RyaW5nKClcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzdmMuc2V0U3RhcnRUaW1lRnJvbVN0cmluZygkZXZlbnQsIHN0YXJ0VGltZUNvbnRyb2wpXCJcbiAgICAgIC8+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgKGNsaWNrKT1cInRoaXMuc3ZjLmNsZWFyU3RhcnRUaW1lKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiIXRoaXMuc3ZjLmlzU3RhcnRUaW1lU2V0QW5kTm90TWlkbmlnaHQoKVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImlucHV0LWNvbnRyb2wtY29udGFpbmVyXCIgW3N1YnNjcmlwdFNpemluZ109XCInZHluYW1pYydcIj5cbiAgICAgIDxtYXQtbGFiZWw+e3sgXCJpbnRlcnZhbFBpY2tlci5lbmRUaW1lXCIgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICAgIDxpbnB1dFxuICAgICAgICBuYW1lPVwiZW5kVGltZUlucHV0XCJcbiAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgdHlwZT1cInRpbWVcIlxuICAgICAgICAjZW5kVGltZUNvbnRyb2w9XCJuZ01vZGVsXCJcbiAgICAgICAgc3RlcD1cIjFcIlxuICAgICAgICBbbmdNb2RlbF09XCJzdmMuZ2V0RW5kVGltZVN0cmluZygpXCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic3ZjLnNldEVuZFRpbWVGcm9tU3RyaW5nKCRldmVudCwgZW5kVGltZUNvbnRyb2wpXCJcbiAgICAgIC8+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgKGNsaWNrKT1cInRoaXMuc3ZjLmNsZWFyRW5kVGltZSgpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiF0aGlzLnN2Yy5pc0VuZFRpbWVTZXRBbmROb3RNaWRuaWdodCgpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2ZpeGVkU2hpZnRzPlxuICBAaWYgKGlzSGVscFRleHRzVmlzaWJsZSkge1xuICA8aDUgY2xhc3M9XCJtYXQtaDVcIj57eyBcImludGVydmFsUGlja2VyLnNoaWZ0SW50ZXJ2YWxcIiB8IHRyYW5zbGF0ZSB9fTwvaDU+XG4gIH1cbiAgPGRpdiBjbGFzcz1cImxheW91dC1jb2wgcGxhY2Utc3RhcnQtc3RyZXRjaFwiPlxuICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtcm93IHBsYWNlLWJldHdlZW4tY2VudGVyXCI+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwic3ZjLnNoaWZ0RGF5KC0xKVwiIFtkaXNhYmxlZF09XCJzdmMuaXNSYW5nZU5vdFNldCgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5rZXlib2FyZF9kb3VibGVfYXJyb3dfbGVmdDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxzcGFuPnt7IFwiaW50ZXJ2YWxQaWNrZXIuZGF5XCIgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwic3ZjLnNoaWZ0RGF5KDEpXCIgW2Rpc2FibGVkXT1cInN2Yy5pc1JhbmdlTm90U2V0KClcIj5cbiAgICAgICAgPG1hdC1pY29uPmtleWJvYXJkX2RvdWJsZV9hcnJvd19yaWdodDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXJvdyBwbGFjZS1iZXR3ZWVuLWNlbnRlclwiPlxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInN2Yy5zaGlmdE1vbnRoKC0xLCB0cnVlKVwiIFtkaXNhYmxlZF09XCJzdmMuaXNSYW5nZU5vdFNldCgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5rZXlib2FyZF9kb3VibGVfYXJyb3dfbGVmdDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxzcGFuPnt7IFwiaW50ZXJ2YWxQaWNrZXIubW9udGhcIiB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJzdmMuc2hpZnRNb250aCgxLCB0cnVlKVwiIFtkaXNhYmxlZF09XCJzdmMuaXNSYW5nZU5vdFNldCgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5rZXlib2FyZF9kb3VibGVfYXJyb3dfcmlnaHQ8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImxheW91dC1yb3cgcGxhY2UtYmV0d2Vlbi1jZW50ZXJcIj5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJzdmMuc2hpZnRZZWFyKC0xLCB0cnVlKVwiIFtkaXNhYmxlZF09XCJzdmMuaXNSYW5nZU5vdFNldCgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5rZXlib2FyZF9kb3VibGVfYXJyb3dfbGVmdDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxzcGFuPnt7IFwiaW50ZXJ2YWxQaWNrZXIueWVhclwiIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInN2Yy5zaGlmdFllYXIoMSwgdHJ1ZSlcIiBbZGlzYWJsZWRdPVwic3ZjLmlzUmFuZ2VOb3RTZXQoKVwiPlxuICAgICAgICA8bWF0LWljb24+a2V5Ym9hcmRfZG91YmxlX2Fycm93X3JpZ2h0PC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgQGlmIChpbnRlcnZhbElucHV0TW9kZSA9PT0gJ2RhdGUtdGltZS1yYW5nZScpIHtcbiAgICA8IS0tIHNoaWZ0IG1pbnV0ZSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXJvdyBwbGFjZS1iZXR3ZWVuLWNlbnRlclwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgKGNsaWNrKT1cInN2Yy5zaGlmdFRpbWUoLTEsICdtaW51dGVzJylcIlxuICAgICAgICBbZGlzYWJsZWRdPVwic3ZjLmlzUmFuZ2VOb3RTZXQoKVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbj5rZXlib2FyZF9kb3VibGVfYXJyb3dfbGVmdDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxzcGFuPnt7IFwiaW50ZXJ2YWxQaWNrZXIubWludXRlXCIgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAoY2xpY2spPVwic3ZjLnNoaWZ0VGltZSgxLCAnbWludXRlcycpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cInN2Yy5pc1JhbmdlTm90U2V0KClcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+a2V5Ym9hcmRfZG91YmxlX2Fycm93X3JpZ2h0PC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDwhLS0gc2hpZnQgaG91ciAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXJvdyBwbGFjZS1iZXR3ZWVuLWNlbnRlclwiPlxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInN2Yy5zaGlmdFRpbWUoLTEsICdob3VycycpXCIgW2Rpc2FibGVkXT1cInN2Yy5pc1JhbmdlTm90U2V0KClcIj5cbiAgICAgICAgPG1hdC1pY29uPmtleWJvYXJkX2RvdWJsZV9hcnJvd19sZWZ0PC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPHNwYW4+e3sgXCJpbnRlcnZhbFBpY2tlci5ob3VyXCIgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwic3ZjLnNoaWZ0VGltZSgxLCAnaG91cnMnKVwiIFtkaXNhYmxlZF09XCJzdmMuaXNSYW5nZU5vdFNldCgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5rZXlib2FyZF9kb3VibGVfYXJyb3dfcmlnaHQ8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYW5jaG9ySW5wdXRGaWVsZD5cbiAgPGRpdiBjbGFzcz1cImxheW91dC1yb3cgZmxleC1ub25lIGdhcC1tZFwiPlxuICAgIDxtYXQtbWVudSAjYW5jaG9yTWVudT1cIm1hdE1lbnVcIj5cbiAgICAgIEBpZiAoc3ZjLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgKGNsaWNrKT1cInN2Yy5zZXRGaXhlZEFuY2hvclBvaW50VG9FbmREYXRlVGltZSgpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFzdmMuZW5kRGF0ZSgpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPmxvZ2luPC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4+e3sgXCJpbnRlcnZhbFBpY2tlci5lbmREYXRlXCIgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIH0gQGlmIChzdmMuZW5kRGF0ZSgpKSB7XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgKGNsaWNrKT1cInN2Yy5zZXRGaXhlZEFuY2hvclBvaW50VG9TdGFydERhdGVUaW1lKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiIXN2Yy5zdGFydERhdGUoKVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj5sb2dvdXQ8L21hdC1pY29uPlxuICAgICAgICA8c3Bhbj57eyBcImludGVydmFsUGlja2VyLnN0YXJ0RGF0ZVwiIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgICB9IEBpZiAoc3ZjLmZpeGVkQW5jaG9yRGF0ZSgpKSB7XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgKGNsaWNrKT1cInRoaXMuc3ZjLnJlc2V0Rml4ZWRBbmNob3JQb2ludCgpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFzdmMuZml4ZWRBbmNob3JEYXRlKCkgfHwgaXNBbmNob3JSZWFkT25seVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgIDxzcGFuPnt7IFwiaW50ZXJ2YWxQaWNrZXIuY2xlYXJcIiB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgIDwvbWF0LW1lbnU+XG5cbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJpbnB1dC1jb250cm9sLWNvbnRhaW5lclwiIFtzdWJzY3JpcHRTaXppbmddPVwiJ2R5bmFtaWMnXCI+XG4gICAgICA8bWF0LWxhYmVsPnt7IFwiaW50ZXJ2YWxQaWNrZXIuYW5jaG9yRGF0ZVwiIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgICA8ZWxkZXItbG9jYWwtZGF0ZS1pbnB1dFxuICAgICAgICBuYW1lPVwiYW5jaG9yRGF0ZUlucHV0XCJcbiAgICAgICAgKHZhbHVlVXBkYXRlZCk9XCJzdmMuc2V0QW5jaG9yRGF0ZUZyb21Gb3JtKCRldmVudClcIlxuICAgICAgICBbdmFsdWVdPVwic3ZjLmdldEFuY2hvclBvaW50QXNMb2NhbGVEYXRlKClcIlxuICAgICAgICBbcmVhZG9ubHldPVwiaXNBbmNob3JSZWFkT25seVwiXG4gICAgICA+XG4gICAgICA8L2VsZGVyLWxvY2FsLWRhdGUtaW5wdXQ+XG4gICAgICBAaWYgKCFpc0FuY2hvclJlYWRPbmx5KSB7XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImFuY2hvck1lbnVcIlxuICAgICAgICBbZGlzYWJsZWRdPVwic3ZjLmlzU3RhcnRBbmRFbmREYXRlc0VtcHR5KCkgJiYgIXN2Yy5maXhlZEFuY2hvckRhdGUoKVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj5tb3JlX2hvcml6PC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgQGlmIChpbnRlcnZhbElucHV0TW9kZSA9PT0gJ2RhdGUtdGltZS1yYW5nZScpIHtcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJpbnB1dC1jb250cm9sLWNvbnRhaW5lci1zaG9ydFwiIFtzdWJzY3JpcHRTaXppbmddPVwiJ2R5bmFtaWMnXCI+XG4gICAgICA8bWF0LWxhYmVsPnt7IFwiaW50ZXJ2YWxQaWNrZXIuYW5jaG9yVGltZVwiIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgICA8aW5wdXRcbiAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgbmFtZT1cImFuY2hvclRpbWVJbnB1dFwiXG4gICAgICAgIHR5cGU9XCJ0aW1lXCJcbiAgICAgICAgI2FuY2hvclRpbWVDb250cm9sPVwibmdNb2RlbFwiXG4gICAgICAgIHN0ZXA9XCIxXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cImlzQW5jaG9yUmVhZE9ubHlcIlxuICAgICAgICBbbmdNb2RlbF09XCJzdmMuZ2V0QW5jaG9yVGltZVN0cmluZygpXCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic3ZjLnNldEFuY2hvclRpbWVGcm9tRm9ybSgkZXZlbnQpXCJcbiAgICAgIC8+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgKGNsaWNrKT1cInRoaXMuc3ZjLnJlc2V0Rml4ZWRBbmNob3JUaW1lKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiIXN2Yy5pc0ZpeGVkQW5jaG9yVGltZVNldEFuZE5vdE1pZG5pZ2h0KCkgfHwgaXNBbmNob3JSZWFkT25seVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIH1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
266
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItaW50ZXJ2YWwtcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VsZGVyYnl0ZS9uZ3gtc3RhcnRlci9zcmMvbGliL2NvbXBvbmVudHMvdGltZS9lbGRlci1pbnRlcnZhbC1waWNrZXIvZWxkZXItaW50ZXJ2YWwtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VsZGVyYnl0ZS9uZ3gtc3RhcnRlci9zcmMvbGliL2NvbXBvbmVudHMvdGltZS9lbGRlci1pbnRlcnZhbC1waWNrZXIvZWxkZXItaW50ZXJ2YWwtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUM5QyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxNQUFNLEVBRU4sVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDcEQsT0FBTyxFQUNMLFdBQVcsRUFFWCxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixrQkFBa0IsR0FDbkIsTUFBTSw4QkFBOEIsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDhCQUE4QixDQUFBO0FBQ3BGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUN0RCxPQUFPLEVBQUUs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LFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNBLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFFaEIsa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLDhCQUE4QjtzQkFBdEMsS0FBSztnQkFDSSxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJ1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgZWZmZWN0LFxuICBFZmZlY3RSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgaW5wdXQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nXG5pbXBvcnQgeyBEYXRlQWRhcHRlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnXG5pbXBvcnQge1xuICBNYXRDYWxlbmRhcixcbiAgTWF0Q2FsZW5kYXJDZWxsQ2xhc3NGdW5jdGlvbixcbiAgTWF0RGF0ZXBpY2tlck1vZHVsZSxcbiAgTWF0RGF0ZXBpY2tlclRvZ2dsZSxcbiAgTWF0RGF0ZVJhbmdlSW5wdXQsXG4gIE1hdERhdGVSYW5nZVBpY2tlcixcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcidcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSwgTWF0SGludCwgTWF0TGFiZWwgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJ1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nXG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0J1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnXG5pbXBvcnQgeyBNYXRUb29sdGlwIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCdcbmltcG9ydCB7IExvZ2dlckZhY3RvcnkgfSBmcm9tICdAZWxkZXJieXRlL3RzLWxvZ2dlcidcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnXG5pbXBvcnQgeyBJbnRlcnZhbCB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90aW1lL2ludGVydmFsJ1xuaW1wb3J0IHsgVGVtcG9yYWxVdGlsIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3RpbWUvdGVtcG9yYWwtdXRpbCdcbmltcG9ydCB7IEN1c3RvbURhdGVBZGFwdGVyIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy90aW1lL2RhdGUtYWRhcHRlcnMvY3VzdG9tLWRhdGUtYWRhcHRlcidcbmltcG9ydCB7IEludGVydmFsSW5wdXRNb2RlIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy90aW1lL2VsZGVyLWludGVydmFsLWlucHV0L2VsZGVyLWludGVydmFsLWlucHV0LmNvbXBvbmVudCdcbmltcG9ydCB7IEVsZGVyTG9jYWxEYXRlSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL3RpbWUvZWxkZXItbG9jYWwtZGF0ZS1pbnB1dC9lbGRlci1sb2NhbC1kYXRlLWlucHV0LmNvbXBvbmVudCdcbmltcG9ydCB7IEVsZGVySW50ZXJ2YWxQaWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi9lbGRlci1pbnRlcnZhbC1waWNrZXIuc2VydmljZSdcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZWxkZXItaW50ZXJ2YWwtcGlja2VyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE1hdERhdGVSYW5nZVBpY2tlcixcbiAgICBNYXREYXRlcGlja2VyTW9kdWxlLFxuICAgIE1hdERhdGVSYW5nZUlucHV0LFxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICBNYXRMYWJlbCxcbiAgICBNYXRIaW50LFxuICAgIE1hdERhdGVwaWNrZXJUb2dnbGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgIE1hdENhbGVuZGFyLFxuICAgIEVsZGVyTG9jYWxEYXRlSW5wdXRDb21wb25lbnQsXG4gICAgTWF0VG9vbHRpcCxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgTWF0TWVudU1vZHVsZSxcbiAgXSxcbiAgcHJvdmlkZXJzOiBbRWxkZXJJbnRlcnZhbFBpY2tlclNlcnZpY2UsIHsgcHJvdmlkZTogRGF0ZUFkYXB0ZXIsIHVzZUNsYXNzOiBDdXN0b21EYXRlQWRhcHRlciB9XSxcbiAgdGVtcGxhdGVVcmw6ICcuL2VsZGVyLWludGVydmFsLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9lbGRlci1pbnRlcnZhbC1waWNrZXIuY29tcG9uZW50LnNjc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRWxkZXJJbnRlcnZhbFBpY2tlckNvbXBvbmVudCB7XG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBGaWVsZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIodGhpcy5jb25zdHJ1Y3Rvci5uYW1lKVxuICBwdWJsaWMgcmVhZG9ubHkgY2FsZW5kYXJBbmNob3JEYXRlQ3NzQ2xhc3NGbjogTWF0Q2FsZW5kYXJDZWxsQ2xhc3NGdW5jdGlvbjxEYXRlPiA9IChcbiAgICBjZWxsRGF0ZTogRGF0ZSxcbiAgICB2aWV3OiBzdHJpbmdcbiAgKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gdGhpcy5jYWxlbmRhckFuY2hvckRhdGVDc3NDbGFzc0ZuQm9keShjZWxsRGF0ZSwgdmlldylcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ3JhbmdlQ2FsZW5kYXJTdGFydCcpIGNhbGVuZGFyU3RhcnQhOiBNYXRDYWxlbmRhcjxEYXRlPlxuICBAVmlld0NoaWxkKCdyYW5nZUNhbGVuZGFyRW5kJykgY2FsZW5kYXJFbmQhOiBNYXRDYWxlbmRhcjxEYXRlPlxuXG4gIEBWaWV3Q2hpbGQoJ3JhbmdlQ2FsZW5kYXJTdGFydCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBjYWxlbmRhclN0YXJ0RWxSZWYhOiBFbGVtZW50UmVmXG4gIEBWaWV3Q2hpbGQoJ3JhbmdlQ2FsZW5kYXJFbmQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgY2FsZW5kYXJFbmRFbFJlZiE6IEVsZW1lbnRSZWZcblxuICBAVmlld0NoaWxkKCdzdGFydERhdGVJbnB1dCcpIHN0YXJ0RGF0ZUlucHV0ITogRWxlbWVudFJlZlxuICBAVmlld0NoaWxkKCdlbmREYXRlSW5wdXQnKSBlbmREYXRlSW5wdXQhOiBFbGVtZW50UmVmXG5cbiAgQElucHV0KCkgaXNFbWl0dGluZ09uQ2hhbmdlID0gdHJ1ZVxuICBASW5wdXQoKSBpbnRlcnZhbElucHV0TW9kZTogSW50ZXJ2YWxJbnB1dE1vZGUgPSAnZGF0ZS1yYW5nZSdcbiAgQElucHV0KCkgc2hvd0FuY2hvciA9IGZhbHNlXG4gIEBJbnB1dCgpIGlzQW5jaG9yUmVhZE9ubHkgPSBmYWxzZVxuICBASW5wdXQoKSBpc1Jlc3VsdFRleHRWaXNpYmxlID0gdHJ1ZVxuICBASW5wdXQoKSBpc0hlbHBUZXh0c1Zpc2libGUgPSBmYWxzZVxuICBASW5wdXQoKSBpc1NlbGVjdExhc3RNb2RlRXhjbHVkaW5nVG9kYXkgPSBmYWxzZVxuICBAT3V0cHV0KCkgZGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SW50ZXJ2YWw+KClcbiAgaW5wdXRJbnRlcnZhbCA9IGlucHV0PEludGVydmFsPihudWxsKVxuICBpbnB1dEFuY2hvckRhdGVUaW1lID0gaW5wdXQ8RGF0ZT4obnVsbClcblxuICBwcml2YXRlIGNhbGVuZGFyRWxGb2N1c0V2ZW50SGFuZGxlcjogKGV2ZW50OiBGb2N1c0V2ZW50KSA9PiB2b2lkXG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIENvbnN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgY29uc3RydWN0b3IocHVibGljIHN2YzogRWxkZXJJbnRlcnZhbFBpY2tlclNlcnZpY2UpIHtcbiAgICB0aGlzLnN2Yy5zZXR1cElucHV0SW50ZXJ2YWwodGhpcy5pbnB1dEludGVydmFsKVxuICAgIHRoaXMuc3ZjLnNldHVwSW5wdXRBbmNob3JEYXRlVGltZSh0aGlzLmlucHV0QW5jaG9yRGF0ZVRpbWUpXG4gICAgdGhpcy5zdmMuc2V0dXBFdmVudEVtaXR0ZXIodGhpcy5kYXRlQ2hhbmdlKVxuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIExpZmUgQ3ljbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5wdXRJbnRlcnZhbCkge1xuICAgICAgdGhpcy5zdmMucHVsbElucHV0SW50ZXJ2YWwoKVxuICAgIH1cbiAgICBpZiAodGhpcy5pbnB1dEFuY2hvckRhdGVUaW1lKCkpIHtcbiAgICAgIHRoaXMuc3ZjLnB1bGxJbnB1dEFuY2hvckRhdGVUaW1lKClcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdmMuaXNFbWl0dGluZ09uQ2hhbmdlLnNldCh0aGlzLmlzRW1pdHRpbmdPbkNoYW5nZSlcbiAgICB0aGlzLnNldHVwRGF0ZUlucHV0Q2FsZW5kYXJGb2N1c1ByZXZlbnRpb24oKVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycygpXG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogUHVibGljIEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBzZXR1cERhdGVJbnB1dENhbGVuZGFyRm9jdXNQcmV2ZW50aW9uKCk6IHZvaWQge1xuICAgIC8vIFByZXZlbnRzIHRoZSBmb2N1cyBvbiB0aGUgY2FsZW5kYXIgd2hlbiB0aGUgaW5wdXQgZmllbGQgaXMgY2hhbmdlZCB2aWEgdGhlIGtleWJvYXJkXG4gICAgdGhpcy5jYWxlbmRhckVsRm9jdXNFdmVudEhhbmRsZXIgPSAoZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghZXZlbnQgfHwgIWV2ZW50LnJlbGF0ZWRUYXJnZXQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBjb25zdCByZWxUYXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnRcblxuICAgICAgaWYgKHJlbFRhcmdldC5uYW1lID09PSAnc3RhcnREYXRlSW5wdXQnKSB7XG4gICAgICAgIHRoaXMuc3RhcnREYXRlSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKHJlbFRhcmdldC5uYW1lID09PSAnZW5kRGF0ZUlucHV0Jykge1xuICAgICAgICB0aGlzLmVuZERhdGVJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbmF0aXZlRWxlbWVudFN0YXJ0ID0gdGhpcy5jYWxlbmRhclN0YXJ0RWxSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudFxuICAgIGNvbnN0IG5hdGl2ZUVsZW1lbnRFbmQgPSB0aGlzLmNhbGVuZGFyRW5kRWxSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudFxuXG4gICAgbmF0aXZlRWxlbWVudFN0YXJ0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5jYWxlbmRhckVsRm9jdXNFdmVudEhhbmRsZXIsIHRydWUpXG4gICAgbmF0aXZlRWxlbWVudEVuZC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuY2FsZW5kYXJFbEZvY3VzRXZlbnRIYW5kbGVyLCB0cnVlKVxuICB9XG5cbiAgY2xlYXJTdGFydERhdGVUaW1lKCk6IHZvaWQge1xuICAgIHRoaXMuc3ZjLmNsZWFyU3RhcnREYXRlVGltZSgpXG5cbiAgICB0aGlzLnN2Yy5yZXNldENhbGVuZGFyTW9kZSgpXG5cbiAgICBpZiAodGhpcy5pc0VtaXR0aW5nT25DaGFuZ2UpIHtcbiAgICAgIHRoaXMuc3ZjLmVtaXRNYWluRGF0ZXMoKVxuICAgIH1cbiAgfVxuXG4gIGNsZWFyRW5kRGF0ZVRpbWUoKTogdm9pZCB7XG4gICAgdGhpcy5zdmMuY2xlYXJFbmREYXRlVGltZSgpXG5cbiAgICB0aGlzLnN2Yy5yZXNldENhbGVuZGFyTW9kZSgpXG5cbiAgICBpZiAodGhpcy5pc0VtaXR0aW5nT25DaGFuZ2UpIHtcbiAgICAgIHRoaXMuc3ZjLmVtaXRNYWluRGF0ZXMoKVxuICAgIH1cbiAgfVxuXG4gIGNsZWFyU3RhcnRBbmRFbmREYXRlVGltZXMoKTogdm9pZCB7XG4gICAgdGhpcy5zdmMuY2xlYXJTdGFydERhdGVUaW1lKClcbiAgICB0aGlzLnN2Yy5jbGVhckVuZERhdGVUaW1lKClcblxuICAgIHRoaXMuc3ZjLnJlc2V0Q2FsZW5kYXJNb2RlKClcblxuICAgIGlmICh0aGlzLmlzRW1pdHRpbmdPbkNoYW5nZSkge1xuICAgICAgdGhpcy5zdmMuZW1pdE1haW5EYXRlcygpXG4gICAgfVxuICB9XG5cbiAgaGFuZGxlU3RhcnRDYWxlbmRhckNoYW5nZShjaGFuZ2VkRGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuc3ZjLmNhbGVuZGFyTW9kZS5zZXQoJ2RheXMnKVxuICAgIGNvbnN0IG5ld1BsYWluRGF0ZSA9IFRlbXBvcmFsVXRpbC5nZXRQbGFpbkRhdGVGcm9tSlNEYXRlKGNoYW5nZWREYXRlKVxuICAgIHRoaXMuc3ZjLnN0YXJ0RGF0ZS5zZXQobmV3UGxhaW5EYXRlKVxuICB9XG5cbiAgaGFuZGxlRW5kQ2FsZW5kYXJDaGFuZ2UoY2hhbmdlZERhdGU6IERhdGUpOiB2b2lkIHtcbiAgICB0aGlzLnN2Yy5jYWxlbmRhck1vZGUuc2V0KCdkYXlzJylcbiAgICBjb25zdCBuZXdQbGFpbkRhdGUgPSBUZW1wb3JhbFV0aWwuZ2V0UGxhaW5EYXRlRnJvbUpTRGF0ZShjaGFuZ2VkRGF0ZSlcbiAgICB0aGlzLnN2Yy5lbmREYXRlLnNldChuZXdQbGFpbkRhdGUpXG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogUHJpdmF0ZSBtZXRob2RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYWxlbmRhclN0YXJ0RWxSZWYgfHwgIXRoaXMuY2FsZW5kYXJFbmRFbFJlZikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNhbGVuZGFyU3RhcnRFbFJlZi5uYXRpdmVFbGVtZW50IHx8ICF0aGlzLmNhbGVuZGFyRW5kRWxSZWYubmF0aXZlRWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgbmF0aXZlRWxlbWVudFN0YXJ0ID0gdGhpcy5jYWxlbmRhclN0YXJ0RWxSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudFxuICAgIGNvbnN0IG5hdGl2ZUVsZW1lbnRFbmQgPSB0aGlzLmNhbGVuZGFyRW5kRWxSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudFxuXG4gICAgbmF0aXZlRWxlbWVudFN0YXJ0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5jYWxlbmRhckVsRm9jdXNFdmVudEhhbmRsZXIsIHRydWUpXG4gICAgbmF0aXZlRWxlbWVudEVuZC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuY2FsZW5kYXJFbEZvY3VzRXZlbnRIYW5kbGVyLCB0cnVlKVxuICB9XG5cbiAgcHJpdmF0ZSBjYWxlbmRhckFuY2hvckRhdGVDc3NDbGFzc0ZuQm9keShjZWxsRGF0ZTogRGF0ZSwgdmlldzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBhbmNob3JEYXRlID0gdGhpcy5zdmMuZml4ZWRBbmNob3JEYXRlKClcblxuICAgIGlmICghYW5jaG9yRGF0ZSkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgY29uc3QgZGF0ZSA9IFRlbXBvcmFsVXRpbC5nZXRKU0RhdGVGcm9tUGxhaW5EYXRlVGltZShhbmNob3JEYXRlKVxuXG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjZWxsRGF0ZS5nZXREYXRlKCkgPT09IGRhdGUuZ2V0RGF0ZSgpICYmXG4gICAgICBjZWxsRGF0ZS5nZXRNb250aCgpID09PSBkYXRlLmdldE1vbnRoKCkgJiZcbiAgICAgIGNlbGxEYXRlLmdldEZ1bGxZZWFyKCkgPT09IGRhdGUuZ2V0RnVsbFllYXIoKVxuICAgICkge1xuICAgICAgcmV0dXJuICdlbGRlci1jdXN0b20tYW5jaG9yLWRhdGUnXG4gICAgfVxuXG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogRWZmZWN0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIHJlYWRvbmx5IF91cGRhdGVNYXRDYWxlbmRhckVsQW5jaG9yQ3NzQ2xhc3NFZmZlY3Q6IEVmZmVjdFJlZiA9IGVmZmVjdCgoKTogdm9pZCA9PiB7XG4gICAgY29uc3QgYW5jaG9yRGF0ZSA9IHRoaXMuc3ZjLmFuY2hvckRhdGUoKVxuXG4gICAgaWYgKGFuY2hvckRhdGUpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXJTdGFydC51cGRhdGVUb2RheXNEYXRlKClcbiAgICAgIHRoaXMuY2FsZW5kYXJFbmQudXBkYXRlVG9kYXlzRGF0ZSgpXG4gICAgfVxuICB9KVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3VwZGF0ZU1hdENhbGVuZGFyRWxTZWxlY3Rpb25FZmZlY3Q6IEVmZmVjdFJlZiA9IGVmZmVjdCgoKTogdm9pZCA9PiB7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5zdmMuc3RhcnREYXRlKClcbiAgICBjb25zdCBlbmREYXRlID0gdGhpcy5zdmMuZW5kRGF0ZSgpXG5cbiAgICBpZiAoIXRoaXMuY2FsZW5kYXJTdGFydCB8fCAhdGhpcy5jYWxlbmRhckVuZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFzdGFydERhdGUgJiYgIWVuZERhdGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNhbGVuZGFyMSA9IHRoaXMuY2FsZW5kYXJTdGFydFxuICAgIGNvbnN0IGNhbGVuZGFyMiA9IHRoaXMuY2FsZW5kYXJFbmRcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gdGltZW91dCBpcyBuZWVkZWQgdG8gcnVuIHJ1biBjYWxlbmRhciB1cGRhdGUgbGFzdCwgb3RoZXJ3aXNlIHRoZXJlIGFyZSBpc3N1ZXNcbiAgICAgIGlmIChzdGFydERhdGUpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRKc0RhdGUgPSBUZW1wb3JhbFV0aWwuZ2V0SlNEYXRlRnJvbVBsYWluRGF0ZVRpbWUoc3RhcnREYXRlKVxuICAgICAgICBjYWxlbmRhcjEuYWN0aXZlRGF0ZSA9IHN0YXJ0SnNEYXRlXG4gICAgICB9XG5cbiAgICAgIGlmIChlbmREYXRlKSB7XG4gICAgICAgIGNvbnN0IGVuZEpzRGF0ZSA9IFRlbXBvcmFsVXRpbC5nZXRKU0RhdGVGcm9tUGxhaW5EYXRlVGltZShlbmREYXRlKVxuICAgICAgICBjYWxlbmRhcjIuYWN0aXZlRGF0ZSA9IGVuZEpzRGF0ZVxuICAgICAgfVxuICAgIH0sIDApXG4gIH0pXG59XG4iLCI8ZGl2IGNsYXNzPVwiaW50ZXJ2YWwtcGlja2VyLWNvbXBvbmVudCBwLW1kIGxheW91dC1jb2wgZ2FwLXh4bFwiPlxuICA8ZGl2IGNsYXNzPVwibGF5b3V0LXJvdyBnYXAteHhsIHBsYWNlLWJldHdlZW4tc3RhcnRcIiBzdHlsZT1cImdhcDogNSVcIj5cbiAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LWNvbCBnYXAtbWQgcHQteHNcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnRlcnZhbFNlbGVjdG9yXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImxheW91dC1jb2xcIj5cbiAgICAgIDwhLS0gc21hcnQgc2hpZnQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXJvdyBwbGFjZS1hcm91bmQtY2VudGVyXCI+XG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJzdmMuc21hcnRTaGlmdCgtMSlcIiBbZGlzYWJsZWRdPVwic3ZjLmlzUmFuZ2VOb3RTZXQoKVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5rZXlib2FyZF9kb3VibGVfYXJyb3dfbGVmdDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8c3Bhbj57eyBzdmMudmlld0ludGVydmFsTWVzc2FnZSgpIH19PC9zcGFuPlxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwic3ZjLnNtYXJ0U2hpZnQoMSlcIiBbZGlzYWJsZWRdPVwic3ZjLmlzUmFuZ2VOb3RTZXQoKVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5rZXlib2FyZF9kb3VibGVfYXJyb3dfcmlnaHQ8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBjYWxlbmRhcnMgYW5kIGlucHV0IGNvbnRyb2xzIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNhbGVuZGFyc1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInB0LXhzXCIgc3R5bGU9XCJ3aWR0aDogMjUlXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LWNvbCBnYXAtbGdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxheW91dC1jb2wgZ2FwLXhzIHBsYWNlLXN0YXJ0LXN0YXJ0XCI+XG4gICAgICAgICAgQGlmIChpc0hlbHBUZXh0c1Zpc2libGUpIHtcbiAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1hdC1oNVwiPnt7ICdpbnRlcnZhbFBpY2tlci5zZWxlY3RTbWFydEludGVydmFsJyB8IHRyYW5zbGF0ZSB9fTwvaDU+XG4gICAgICAgICAgfVxuICAgICAgICAgIDwhLS0gc2VsZWN0IGN1cnJlbnQgLS0+XG4gICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJzdmMuc2VsZWN0Q3VycmVudFdlZWsoKVwiPlxuICAgICAgICAgICAge3sgJ2ludGVydmFsUGlja2VyLmN1cnJlbnRQZXJpb2Qud2VlaycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cInN2Yy5zZWxlY3RDdXJyZW50TW9udGgoKVwiPlxuICAgICAgICAgICAge3sgJ2ludGVydmFsUGlja2VyLmN1cnJlbnRQZXJpb2QubW9udGgnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJzdmMuc2VsZWN0Q3VycmVudFF1YXJ0ZXIoKVwiPlxuICAgICAgICAgICAge3sgJ2ludGVydmFsUGlja2VyLmN1cnJlbnRQZXJpb2QucXVhcnRlcicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cInN2Yy5zZWxlY3RDdXJyZW50WWVhcigpXCI+XG4gICAgICAgICAgICB7eyAnaW50ZXJ2YWxQaWNrZXIuY3VycmVudFBlcmlvZC55ZWFyJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpeGVkLXNoaWZ0cy1jb250YWluZXJcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZml4ZWRTaGlmdHNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJsYXlvdXQtcm93IHBsYWNlLWJldHdlZW4tY2VudGVyIGdhcC14eGwgcHQtc21cIj5cbiAgICA8ZGl2PlxuICAgICAgQGlmIChzaG93QW5jaG9yKSB7XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhbmNob3JJbnB1dEZpZWxkXCI+PC9uZy1jb250YWluZXI+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgQGlmIChpc1Jlc3VsdFRleHRWaXNpYmxlKSB7XG4gICAgICA8IS0tIHJlc3VsdCBpbnRlcnZhbCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtY29sIHBsYWNlLWNlbnRlci1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtaW50ZXJ2YWwgbWF0LWNhcHRpb24gcHQteHNcIj5cbiAgICAgICAgICBAaWYgKHN2Yy5zdGFydERhdGVUaW1lQXNKU0RhdGUoKSkge1xuICAgICAgICAgICAge3sgc3ZjLnN0YXJ0RGF0ZVRpbWVBc0pTRGF0ZSgpIHwgZGF0ZTogJ2RkLk1NLiB5LCBISDptbTpzcycgfX1cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIHt7ICdpbnRlcnZhbFBpY2tlci5zdGFydERhdGVOb3RTZXQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgfVxuICAgICAgICAgIDxzcGFuPiAtIDwvc3Bhbj5cbiAgICAgICAgICBAaWYgKHN2Yy5lbmREYXRlVGltZUFzSlNEYXRlKCkpIHtcbiAgICAgICAgICAgIHt7IHN2Yy5lbmREYXRlVGltZUFzSlNEYXRlKCkgfCBkYXRlOiAnZGQuTU0uIHksIEhIOm1tOnNzJyB9fVxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAge3sgJ2ludGVydmFsUGlja2VyLmVuZERhdGVOb3RTZXQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1jYXB0aW9uXCI+e3sgc3ZjLmRlbHRhSHVtYW5SZWFkYWJsZSgpIHx8ICcmbmJzcDsnIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXJvdyBnYXAtbGdcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgKGNsaWNrKT1cImNsZWFyU3RhcnRBbmRFbmREYXRlVGltZXMoKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJzdmMuaXNTdGFydEFuZEVuZERhdGVzRW1wdHkoKVwiXG4gICAgICA+XG4gICAgICAgIHt7ICdpbnRlcnZhbFBpY2tlci5jbGVhcicgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICBAaWYgKCF0aGlzLmlzRW1pdHRpbmdPbkNoYW5nZSkge1xuICAgICAgICA8YnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJzdmMuZW1pdE1haW5EYXRlcygpXCI+XG4gICAgICAgICAge3sgJ2FjdGlvbnMub2snIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2ludGVydmFsU2VsZWN0b3I+XG4gIDxkaXYgY2xhc3M9XCJsYXlvdXQtY29sXCI+XG4gICAgQGlmIChpc0hlbHBUZXh0c1Zpc2libGUpIHtcbiAgICAgIDxoNSBjbGFzcz1cIm1hdC1oNVwiPnt7ICdpbnRlcnZhbFBpY2tlci5zZWxlY3RBYnNvbHV0ZUludGVydmFsJyB8IHRyYW5zbGF0ZSB9fTwvaDU+XG4gICAgfVxuICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtcm93IHNlbGVjdC1idXR0b25zLWNvbnRhaW5lciBnYXAtc21cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtY29sIGdhcC14cyBwbGFjZS1zdGFydC1zdHJldGNoXCI+XG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwic3ZjLnNlbGVjdEN1cnJlbnREYXkoKVwiPlxuICAgICAgICAgIEBpZiAoc3ZjLmlzRml4ZWRBbmNob3JEYXRlU2V0KCkpIHtcbiAgICAgICAgICAgIHt7ICdpbnRlcnZhbFBpY2tlci5hbmNob3JEYXknIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICB7eyAnaW50ZXJ2YWxQaWNrZXIudG9kYXknIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJzdmMuc2VsZWN0WWVzdGVyZGF5KClcIj5cbiAgICAgICAgICBAaWYgKHN2Yy5pc0ZpeGVkQW5jaG9yRGF0ZVNldCgpKSB7XG4gICAgICAgICAgICB7eyAnaW50ZXJ2YWxQaWNrZXIubGFzdCcgfCB0cmFuc2xhdGUgfX0gMSB7eyAnaW50ZXJ2YWxQaWNrZXIuZGF5JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAge3sgJ2ludGVydmFsUGlja2VyLnllc3RlcmRheScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICB9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICBAaWYgKGlzU2VsZWN0TGFzdE1vZGVFeGNsdWRpbmdUb2RheSkge1xuICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwic3ZjLnNlbGVjdExhc3RTZXZlbkRheXNFeGNsdWRpbmdUb2RheSgpXCI+XG4gICAgICAgICAgICB7eyAnaW50ZXJ2YWxQaWNrZXIubGFzdCcgfCB0cmFuc2xhdGUgfX0gNyB7eyAnaW50ZXJ2YWxQaWNrZXIuZGF5cycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cInN2Yy5zZWxlY3RMYXN0VGhpcnR5RGF5c0V4Y2x1ZGluZ1RvZGF5KClcIj5cbiAgICAgICAgICAgIHt7ICdpbnRlcnZhbFBpY2tlci5sYXN0JyB8IHRyYW5zbGF0ZSB9fSAzMCB7eyAnaW50ZXJ2YWxQaWNrZXIuZGF5cycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJzdmMuc2VsZWN0TGFzdFNldmVuRGF5c0luY2x1ZGluZ1RvZGF5KClcIj5cbiAgICAgICAgICAgIHt7ICdpbnRlcnZhbFBpY2tlci5sYXN0JyB8IHRyYW5zbGF0ZSB9fSA3IHt7ICdpbnRlcnZhbFBpY2tlci5kYXlzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwic3ZjLnNlbGVjdExhc3RUaGlydHlEYXlzSW5jbHVkaW5nVG9kYXkoKVwiPlxuICAgICAgICAgICAge3sgJ2ludGVydmFsUGlja2VyLmxhc3QnIHwgdHJhbnNsYXRlIH19IDMwIHt7ICdpbnRlcnZhbFBpY2tlci5kYXlzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoaW50ZXJ2YWxJbnB1dE1vZGUgPT09ICdkYXRlLXRpbWUtcmFuZ2UnKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInB0LXNtXCI+PC9kaXY+XG4gICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJzdmMuc2VsZWN0TGFzdEZpdmVNaW51dGVzKClcIj5cbiAgICAgICAgICAgIHt7ICdpbnRlcnZhbFBpY2tlci5sYXN0JyB8IHRyYW5zbGF0ZSB9fSA1IHt7ICdpbnRlcnZhbFBpY2tlci5taW51dGVzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwic3ZjLnNlbGVjdExhc3RIb3VyKClcIj5cbiAgICAgICAgICAgIHt7ICdpbnRlcnZhbFBpY2tlci5sYXN0JyB8IHRyYW5zbGF0ZSB9fSB7eyAnaW50ZXJ2YWxQaWNrZXIuaG91cicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cInN2Yy5zZWxlY3RMYXN0MjRIb3VycygpXCI+XG4gICAgICAgICAgICB7eyAnaW50ZXJ2YWxQaWNrZXIubGFzdCcgfCB0cmFuc2xhdGUgfX0gMjQge3sgJ2ludGVydmFsUGlja2VyLmhvdXJzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NhbGVuZGFyc1RlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwibGF5b3V0LXJvdyBwbGFjZS1hcm91bmQtY2VudGVyXCIgc3R5bGU9XCJhbGlnbi1pdGVtczogZmxleC1zdGFydDsgbWluLWhlaWdodDogMjgwcHhcIj5cbiAgICA8bWF0LWNhbGVuZGFyXG4gICAgICAjcmFuZ2VDYWxlbmRhclN0YXJ0XG4gICAgICBzdHlsZT1cIndpZHRoOiAyMTBweDsgbWF4LXdpZHRoOiAxMDAlXCJcbiAgICAgIFtzZWxlY3RlZF09XCJzdmMuZGF0ZVJhbmdlRm9yQ2FsZW5kYXIoKVwiXG4gICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwiaGFuZGxlU3RhcnRDYWxlbmRhckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIFttYXhEYXRlXT1cInN2Yy5lbmREYXRlQXNKU0RhdGUoKVwiXG4gICAgICBbZGF0ZUNsYXNzXT1cImNhbGVuZGFyQW5jaG9yRGF0ZUNzc0NsYXNzRm5cIlxuICAgID5cbiAgICA8L21hdC1jYWxlbmRhcj5cbiAgICA8bWF0LWNhbGVuZGFyXG4gICAgICAjcmFuZ2VDYWxlbmRhckVuZFxuICAgICAgc3R5bGU9XCJ3aWR0aDogMjEwcHg7IG1heC13aWR0aDogMTAwJVwiXG4gICAgICBbc2VsZWN0ZWRdPVwic3ZjLmRhdGVSYW5nZUZvckNhbGVuZGFyKClcIlxuICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cImhhbmRsZUVuZENhbGVuZGFyQ2hhbmdlKCRldmVudClcIlxuICAgICAgW21pbkRhdGVdPVwic3ZjLnN0YXJ0RGF0ZUFzSlNEYXRlKClcIlxuICAgICAgW2RhdGVDbGFzc109XCJjYWxlbmRhckFuY2hvckRhdGVDc3NDbGFzc0ZuXCJcbiAgICA+XG4gICAgPC9tYXQtY2FsZW5kYXI+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibGF5b3V0LXJvdyBwbGFjZS1hcm91bmQtY2VudGVyIGdhcC14bCBwdC1zbVwiPlxuICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtcm93IHBsYWNlLWFyb3VuZC1jZW50ZXJcIj5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImlucHV0LWNvbnRyb2wtY29udGFpbmVyXCIgW3N1YnNjcmlwdFNpemluZ109XCInZHluYW1pYydcIj5cbiAgICAgICAgPG1hdC1sYWJlbD57eyAnaW50ZXJ2YWxQaWNrZXIuc3RhcnREYXRlJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAjc3RhcnREYXRlSW5wdXRcbiAgICAgICAgICBuYW1lPVwic3RhcnREYXRlSW5wdXRcIlxuICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgdHlwZT1cImRhdGVcIlxuICAgICAgICAgIFtuZ01vZGVsXT1cInN2Yy5zdGFydERhdGVIdG1sU3RyaW5nKClcIlxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInN2Yy5zZXRTdGFydERhdGVGcm9tSHRtbFN0cmluZygkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgIChjbGljayk9XCJ0aGlzLmNsZWFyU3RhcnREYXRlVGltZSgpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXRoaXMuc3ZjLnN0YXJ0RGF0ZSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXJvdyBwbGFjZS1hcm91bmQtY2VudGVyXCI+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJpbnB1dC1jb250cm9sLWNvbnRhaW5lclwiIFtzdWJzY3JpcHRTaXppbmddPVwiJ2R5bmFtaWMnXCI+XG4gICAgICAgIDxtYXQtbGFiZWw+e3sgJ2ludGVydmFsUGlja2VyLmVuZERhdGUnIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICNlbmREYXRlSW5wdXRcbiAgICAgICAgICBuYW1lPVwiZW5kRGF0ZUlucHV0XCJcbiAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgIHR5cGU9XCJkYXRlXCJcbiAgICAgICAgICBbbmdNb2RlbF09XCJzdmMuZW5kRGF0ZUh0bWxTdHJpbmcoKVwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic3ZjLnNldEVuZERhdGVGcm9tSHRtbFN0cmluZygkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgIChjbGljayk9XCJ0aGlzLmNsZWFyRW5kRGF0ZVRpbWUoKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiF0aGlzLnN2Yy5lbmREYXRlKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGJyIC8+XG4gIEBpZiAoaW50ZXJ2YWxJbnB1dE1vZGUgPT09ICdkYXRlLXRpbWUtcmFuZ2UnKSB7XG4gICAgPGRpdiBjbGFzcz1cImxheW91dC1yb3cgcGxhY2UtYXJvdW5kLWNlbnRlciBnYXAteGwgcHQtc21cIj5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImlucHV0LWNvbnRyb2wtY29udGFpbmVyXCIgW3N1YnNjcmlwdFNpemluZ109XCInZHluYW1pYydcIj5cbiAgICAgICAgPG1hdC1sYWJlbD57eyAnaW50ZXJ2YWxQaWNrZXIuc3RhcnRUaW1lJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBuYW1lPVwic3RhcnRUaW1lSW5wdXRcIlxuICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgdHlwZT1cInRpbWVcIlxuICAgICAgICAgICNzdGFydFRpbWVDb250cm9sPVwibmdNb2RlbFwiXG4gICAgICAgICAgc3RlcD1cIjFcIlxuICAgICAgICAgIFtuZ01vZGVsXT1cInN2Yy5nZXRTdGFydFRpbWVTdHJpbmcoKVwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic3ZjLnNldFN0YXJ0VGltZUZyb21TdHJpbmcoJGV2ZW50LCBzdGFydFRpbWVDb250cm9sKVwiXG4gICAgICAgIC8+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAoY2xpY2spPVwidGhpcy5zdmMuY2xlYXJTdGFydFRpbWUoKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiF0aGlzLnN2Yy5pc1N0YXJ0VGltZVNldEFuZE5vdE1pZG5pZ2h0KClcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiaW5wdXQtY29udHJvbC1jb250YWluZXJcIiBbc3Vic2NyaXB0U2l6aW5nXT1cIidkeW5hbWljJ1wiPlxuICAgICAgICA8bWF0LWxhYmVsPnt7ICdpbnRlcnZhbFBpY2tlci5lbmRUaW1lJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBuYW1lPVwiZW5kVGltZUlucHV0XCJcbiAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgIHR5cGU9XCJ0aW1lXCJcbiAgICAgICAgICAjZW5kVGltZUNvbnRyb2w9XCJuZ01vZGVsXCJcbiAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgW25nTW9kZWxdPVwic3ZjLmdldEVuZFRpbWVTdHJpbmcoKVwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic3ZjLnNldEVuZFRpbWVGcm9tU3RyaW5nKCRldmVudCwgZW5kVGltZUNvbnRyb2wpXCJcbiAgICAgICAgLz5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgIChjbGljayk9XCJ0aGlzLnN2Yy5jbGVhckVuZFRpbWUoKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiF0aGlzLnN2Yy5pc0VuZFRpbWVTZXRBbmROb3RNaWRuaWdodCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNmaXhlZFNoaWZ0cz5cbiAgQGlmIChpc0hlbHBUZXh0c1Zpc2libGUpIHtcbiAgICA8aDUgY2xhc3M9XCJtYXQtaDVcIj57eyAnaW50ZXJ2YWxQaWNrZXIuc2hpZnRJbnRlcnZhbCcgfCB0cmFuc2xhdGUgfX08L2g1PlxuICB9XG4gIDxkaXYgY2xhc3M9XCJsYXlvdXQtY29sIHBsYWNlLXN0YXJ0LXN0cmV0Y2hcIj5cbiAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXJvdyBwbGFjZS1iZXR3ZWVuLWNlbnRlclwiPlxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInN2Yy5zaGlmdERheSgtMSlcIiBbZGlzYWJsZWRdPVwic3ZjLmlzUmFuZ2VOb3RTZXQoKVwiPlxuICAgICAgICA8bWF0LWljb24+a2V5Ym9hcmRfZG91YmxlX2Fycm93X2xlZnQ8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8c3Bhbj57eyAnaW50ZXJ2YWxQaWNrZXIuZGF5JyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJzdmMuc2hpZnREYXkoMSlcIiBbZGlzYWJsZWRdPVwic3ZjLmlzUmFuZ2VOb3RTZXQoKVwiPlxuICAgICAgICA8bWF0LWljb24+a2V5Ym9hcmRfZG91YmxlX2Fycm93X3JpZ2h0PC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtcm93IHBsYWNlLWJldHdlZW4tY2VudGVyXCI+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwic3ZjLnNoaWZ0TW9udGgoLTEsIHRydWUpXCIgW2Rpc2FibGVkXT1cInN2Yy5pc1JhbmdlTm90U2V0KClcIj5cbiAgICAgICAgPG1hdC1pY29uPmtleWJvYXJkX2RvdWJsZV9hcnJvd19sZWZ0PC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPHNwYW4+e3sgJ2ludGVydmFsUGlja2VyLm1vbnRoJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJzdmMuc2hpZnRNb250aCgxLCB0cnVlKVwiIFtkaXNhYmxlZF09XCJzdmMuaXNSYW5nZU5vdFNldCgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5rZXlib2FyZF9kb3VibGVfYXJyb3dfcmlnaHQ8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImxheW91dC1yb3cgcGxhY2UtYmV0d2Vlbi1jZW50ZXJcIj5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJzdmMuc2hpZnRZZWFyKC0xLCB0cnVlKVwiIFtkaXNhYmxlZF09XCJzdmMuaXNSYW5nZU5vdFNldCgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5rZXlib2FyZF9kb3VibGVfYXJyb3dfbGVmdDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxzcGFuPnt7ICdpbnRlcnZhbFBpY2tlci55ZWFyJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJzdmMuc2hpZnRZZWFyKDEsIHRydWUpXCIgW2Rpc2FibGVkXT1cInN2Yy5pc1JhbmdlTm90U2V0KClcIj5cbiAgICAgICAgPG1hdC1pY29uPmtleWJvYXJkX2RvdWJsZV9hcnJvd19yaWdodDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoaW50ZXJ2YWxJbnB1dE1vZGUgPT09ICdkYXRlLXRpbWUtcmFuZ2UnKSB7XG4gICAgICA8IS0tIHNoaWZ0IG1pbnV0ZSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtcm93IHBsYWNlLWJldHdlZW4tY2VudGVyXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAoY2xpY2spPVwic3ZjLnNoaWZ0VGltZSgtMSwgJ21pbnV0ZXMnKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInN2Yy5pc1JhbmdlTm90U2V0KClcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPmtleWJvYXJkX2RvdWJsZV9hcnJvd19sZWZ0PC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxzcGFuPnt7ICdpbnRlcnZhbFBpY2tlci5taW51dGUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgKGNsaWNrKT1cInN2Yy5zaGlmdFRpbWUoMSwgJ21pbnV0ZXMnKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInN2Yy5pc1JhbmdlTm90U2V0KClcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPmtleWJvYXJkX2RvdWJsZV9hcnJvd19yaWdodDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIHNoaWZ0IGhvdXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LXJvdyBwbGFjZS1iZXR3ZWVuLWNlbnRlclwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgKGNsaWNrKT1cInN2Yy5zaGlmdFRpbWUoLTEsICdob3VycycpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwic3ZjLmlzUmFuZ2VOb3RTZXQoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWljb24+a2V5Ym9hcmRfZG91YmxlX2Fycm93X2xlZnQ8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPHNwYW4+e3sgJ2ludGVydmFsUGlja2VyLmhvdXInIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgKGNsaWNrKT1cInN2Yy5zaGlmdFRpbWUoMSwgJ2hvdXJzJylcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJzdmMuaXNSYW5nZU5vdFNldCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbj5rZXlib2FyZF9kb3VibGVfYXJyb3dfcmlnaHQ8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2FuY2hvcklucHV0RmllbGQ+XG4gIDxkaXYgY2xhc3M9XCJsYXlvdXQtcm93IGZsZXgtbm9uZSBnYXAtbWRcIj5cbiAgICA8bWF0LW1lbnUgI2FuY2hvck1lbnU9XCJtYXRNZW51XCI+XG4gICAgICBAaWYgKHN2Yy5zdGFydERhdGUoKSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgIChjbGljayk9XCJzdmMuc2V0Rml4ZWRBbmNob3JQb2ludFRvRW5kRGF0ZVRpbWUoKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzdmMuZW5kRGF0ZSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj5sb2dpbjwvbWF0LWljb24+XG4gICAgICAgICAgPHNwYW4+e3sgJ2ludGVydmFsUGlja2VyLmVuZERhdGUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICAgIEBpZiAoc3ZjLmVuZERhdGUoKSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgIChjbGljayk9XCJzdmMuc2V0Rml4ZWRBbmNob3JQb2ludFRvU3RhcnREYXRlVGltZSgpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXN2Yy5zdGFydERhdGUoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+bG9nb3V0PC9tYXQtaWNvbj5cbiAgICAgICAgICA8c3Bhbj57eyAnaW50ZXJ2YWxQaWNrZXIuc3RhcnREYXRlJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgICBAaWYgKHN2Yy5maXhlZEFuY2hvckRhdGUoKSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgIChjbGljayk9XCJ0aGlzLnN2Yy5yZXNldEZpeGVkQW5jaG9yUG9pbnQoKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzdmMuZml4ZWRBbmNob3JEYXRlKCkgfHwgaXNBbmNob3JSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgIDxzcGFuPnt7ICdpbnRlcnZhbFBpY2tlci5jbGVhcicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgIDwvbWF0LW1lbnU+XG5cbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJpbnB1dC1jb250cm9sLWNvbnRhaW5lclwiIFtzdWJzY3JpcHRTaXppbmddPVwiJ2R5bmFtaWMnXCI+XG4gICAgICA8bWF0LWxhYmVsPnt7ICdpbnRlcnZhbFBpY2tlci5hbmNob3JEYXRlJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgPGVsZGVyLWxvY2FsLWRhdGUtaW5wdXRcbiAgICAgICAgbmFtZT1cImFuY2hvckRhdGVJbnB1dFwiXG4gICAgICAgICh2YWx1ZVVwZGF0ZWQpPVwic3ZjLnNldEFuY2hvckRhdGVGcm9tRm9ybSgkZXZlbnQpXCJcbiAgICAgICAgW3ZhbHVlXT1cInN2Yy5nZXRBbmNob3JQb2ludEFzTG9jYWxlRGF0ZSgpXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cImlzQW5jaG9yUmVhZE9ubHlcIlxuICAgICAgPlxuICAgICAgPC9lbGRlci1sb2NhbC1kYXRlLWlucHV0PlxuICAgICAgQGlmICghaXNBbmNob3JSZWFkT25seSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImFuY2hvck1lbnVcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJzdmMuaXNTdGFydEFuZEVuZERhdGVzRW1wdHkoKSAmJiAhc3ZjLmZpeGVkQW5jaG9yRGF0ZSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj5tb3JlX2hvcml6PC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICBAaWYgKGludGVydmFsSW5wdXRNb2RlID09PSAnZGF0ZS10aW1lLXJhbmdlJykge1xuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiaW5wdXQtY29udHJvbC1jb250YWluZXItc2hvcnRcIiBbc3Vic2NyaXB0U2l6aW5nXT1cIidkeW5hbWljJ1wiPlxuICAgICAgICA8bWF0LWxhYmVsPnt7ICdpbnRlcnZhbFBpY2tlci5hbmNob3JUaW1lJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgIG5hbWU9XCJhbmNob3JUaW1lSW5wdXRcIlxuICAgICAgICAgIHR5cGU9XCJ0aW1lXCJcbiAgICAgICAgICAjYW5jaG9yVGltZUNvbnRyb2w9XCJuZ01vZGVsXCJcbiAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgW3JlYWRvbmx5XT1cImlzQW5jaG9yUmVhZE9ubHlcIlxuICAgICAgICAgIFtuZ01vZGVsXT1cInN2Yy5nZXRBbmNob3JUaW1lU3RyaW5nKClcIlxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInN2Yy5zZXRBbmNob3JUaW1lRnJvbUZvcm0oJGV2ZW50KVwiXG4gICAgICAgIC8+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAoY2xpY2spPVwidGhpcy5zdmMucmVzZXRGaXhlZEFuY2hvclRpbWUoKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzdmMuaXNGaXhlZEFuY2hvclRpbWVTZXRBbmROb3RNaWRuaWdodCgpIHx8IGlzQW5jaG9yUmVhZE9ubHlcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIH1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|