@elderbyte/ngx-starter 18.8.2 → 18.10.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/esm2022/lib/common/enums/elder-enum-translation.service.mjs +3 -3
- package/esm2022/lib/common/forms/elder-form-field-control-base.directive.mjs +3 -3
- package/esm2022/lib/common/forms/elder-from-field-base.mjs +3 -3
- package/esm2022/lib/common/forms/elder-from-field-customizable-base.mjs +3 -3
- package/esm2022/lib/common/forms/elder-from-field-entity-base.mjs +3 -3
- package/esm2022/lib/common/forms/elder-from-field-multi-entity-base.mjs +3 -3
- package/esm2022/lib/common/forms/form-field-base.component.mjs +3 -3
- package/esm2022/lib/common/forms/multi-model-base.component.mjs +3 -3
- package/esm2022/lib/common/forms/template-composite-control.mjs +3 -3
- package/esm2022/lib/common/forms/value-accessor-base.mjs +3 -3
- package/esm2022/lib/common/http/http-client-builder.service.mjs +3 -3
- package/esm2022/lib/common/http/http-client-pristine.mjs +3 -3
- package/esm2022/lib/common/http/transfer/data-transfer-factory.mjs +3 -3
- package/esm2022/lib/common/time/public_api.mjs +3 -1
- package/esm2022/lib/common/time/temporal-plain-date-interval.mjs +34 -0
- package/esm2022/lib/common/time/temporal-util.mjs +187 -0
- package/esm2022/lib/common/url/elder-router.service.mjs +3 -3
- package/esm2022/lib/common/url/elder-url-fragment-params.service.mjs +3 -3
- package/esm2022/lib/components/access-denied/elder-access-denied.component.mjs +3 -3
- package/esm2022/lib/components/access-denied/elder-access-denied.module.mjs +4 -4
- package/esm2022/lib/components/auditing/audited-entity/elder-audited-entity.component.mjs +3 -3
- package/esm2022/lib/components/auditing/elder-audit.module.mjs +4 -4
- package/esm2022/lib/components/badge/elder-badge/elder-badge.component.mjs +9 -9
- package/esm2022/lib/components/badge/elder-badge.directive.mjs +3 -3
- 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 -3
- package/esm2022/lib/components/button-group/elder-button-group.module.mjs +4 -4
- package/esm2022/lib/components/card-organizer/card-organizer/elder-card-organizer.component.mjs +3 -3
- package/esm2022/lib/components/card-organizer/card-organizer/elder-stack-card.directive.mjs +3 -3
- package/esm2022/lib/components/card-organizer/card-stack/elder-card-stack.component.mjs +3 -3
- package/esm2022/lib/components/card-organizer/elder-card-organizer.module.mjs +4 -4
- 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 +18 -18
- package/esm2022/lib/components/cards/elder-card/elder-card.module.mjs +4 -4
- package/esm2022/lib/components/chips/elder-chip-label.directive.mjs +3 -3
- package/esm2022/lib/components/chips/elder-chips.module.mjs +4 -4
- package/esm2022/lib/components/connectivity/elder-connectivity.module.mjs +4 -4
- package/esm2022/lib/components/connectivity/elder-connectivity.service.mjs +3 -3
- package/esm2022/lib/components/connectivity/offline-indicator/elder-offline-indicator.component.mjs +3 -3
- package/esm2022/lib/components/containers/elder-containers.module.mjs +4 -4
- package/esm2022/lib/components/containers/elder-scroll-container/elder-scroll-container.component.mjs +3 -3
- package/esm2022/lib/components/csv/elder-csv-export-btn/elder-csv-export-btn.component.mjs +3 -3
- package/esm2022/lib/components/csv/elder-csv-stream-exporter-builder.service.mjs +3 -3
- package/esm2022/lib/components/csv/elder-csv.module.mjs +4 -4
- package/esm2022/lib/components/currency/elder-currency.module.mjs +4 -4
- package/esm2022/lib/components/currency/elder-currency.pipe.mjs +3 -3
- package/esm2022/lib/components/data-transfer/elder-data-transfer.module.mjs +4 -4
- package/esm2022/lib/components/data-transfer/elder-data-transfer.service.mjs +3 -3
- package/esm2022/lib/components/data-transfer/http-data-transfer/http-data-transfer.component.mjs +3 -3
- 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 +3 -3
- package/esm2022/lib/components/data-transfer/http-data-transfer-overview/http-data-transfer-overview.component.mjs +3 -3
- package/esm2022/lib/components/data-view/base/elder-data-view-base.mjs +3 -3
- package/esm2022/lib/components/data-view/common/composite-sort/composite-sort-dc.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/common/composite-sort/elder-composite-sort/elder-composite-sort.component.mjs +3 -3
- package/esm2022/lib/components/data-view/common/data-context-state-indicator/data-context-state-indicator.component.mjs +3 -3
- package/esm2022/lib/components/data-view/common/elder-data-common.module.mjs +4 -4
- package/esm2022/lib/components/data-view/common/elder-data-toolbar/elder-data-toolbar.component.mjs +6 -6
- package/esm2022/lib/components/data-view/common/elder-single-sort/elder-single-sort.component.mjs +3 -3
- package/esm2022/lib/components/data-view/common/selection/data-context-selection.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/common/selection/elder-selection-master-checkbox/elder-selection-master-checkbox.component.mjs +3 -3
- package/esm2022/lib/components/data-view/grid/elder-grid/elder-grid.component.mjs +9 -9
- package/esm2022/lib/components/data-view/grid/elder-grid.module.mjs +4 -4
- package/esm2022/lib/components/data-view/master-detail/elder-detail-dialog/elder-detail-dialog.component.mjs +3 -3
- package/esm2022/lib/components/data-view/master-detail/elder-detail.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/master-detail/elder-master-activation.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/master-detail/elder-master-detail.component.mjs +3 -3
- 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 +3 -3
- package/esm2022/lib/components/data-view/master-detail/elder-master.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/simple/elder-simple-selection-view/elder-simple-selection-view.component.mjs +3 -3
- package/esm2022/lib/components/data-view/simple/elder-simple-selection-view/elder-simple-selection-view.module.mjs +4 -4
- package/esm2022/lib/components/data-view/table/activation/elder-delete-active.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/table/activation/elder-table-activation.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/table/elder-center-cell.directive.mjs +3 -3
- 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 +3 -3
- package/esm2022/lib/components/data-view/table/elder-table/elder-table-toolbar.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/table/elder-table/elder-table.component.mjs +3 -3
- package/esm2022/lib/components/data-view/table/elder-table-column.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/table/elder-table-extension.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/table/elder-table-root.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/table/elder-table-row.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/table/elder-table-sort.directive.mjs +3 -3
- package/esm2022/lib/components/data-view/table/elder-table.module.mjs +4 -4
- package/esm2022/lib/components/data-view/table/model/elder-table-model.mjs +3 -3
- package/esm2022/lib/components/dialogs/confirm-dialog/elder-confirm-dialog.component.mjs +3 -3
- package/esm2022/lib/components/dialogs/elder-dialog.module.mjs +4 -4
- package/esm2022/lib/components/dialogs/elder-dialog.service.mjs +3 -3
- package/esm2022/lib/components/dialogs/question-dialog/elder-question-dialog.component.mjs +3 -3
- package/esm2022/lib/components/dialogs/selection-dialog/elder-selection-dialog/elder-selection-dialog.component.mjs +3 -3
- package/esm2022/lib/components/dialogs/selection-dialog/elder-selection-dialog.directive.mjs +3 -3
- package/esm2022/lib/components/errors/elder-error.module.mjs +4 -4
- package/esm2022/lib/components/errors/exception-detail/elder-exception-detail.component.mjs +3 -3
- 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 +4 -4
- package/esm2022/lib/components/files/blob-viewer/elder-blob-viewer.component.mjs +3 -3
- 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 +3 -3
- package/esm2022/lib/components/files/elder-file-drop-zone.directive.mjs +3 -3
- package/esm2022/lib/components/files/elder-file-select.directive.mjs +3 -3
- package/esm2022/lib/components/files/elder-file.module.mjs +4 -4
- package/esm2022/lib/components/files/file-select/file-select.component.mjs +3 -3
- package/esm2022/lib/components/files/file-upload/file-upload.component.mjs +3 -3
- package/esm2022/lib/components/forms/clipboard/elder-clipboard.service.mjs +3 -3
- package/esm2022/lib/components/forms/directives/base/elder-class-hostbinding-base.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-clipboard-put.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-delayed-focus.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-form-field-dense.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-form-field-label.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-form-field-no-hint.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-form-field-no-spinner.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-forms-directives.module.mjs +4 -4
- package/esm2022/lib/components/forms/directives/elder-initial-value.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-input-pattern.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-key-event.directive.mjs +3 -3
- 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 +3 -3
- package/esm2022/lib/components/forms/directives/elder-stop-event-propagation.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-tab-focus-trap.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-touched.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/elder-triple-state-checkbox.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/validation/elder-validation-error.directive.mjs +3 -3
- package/esm2022/lib/components/forms/directives/validation/strategies/common-validation-message-strategy.mjs +3 -3
- package/esm2022/lib/components/forms/directives/validation/strategies/dynamic-validation-message-strategy.mjs +3 -3
- package/esm2022/lib/components/forms/directives/validation/validation-message-renderer.service.mjs +3 -3
- package/esm2022/lib/components/forms/directives/validation/validators/elder-max.validator.mjs +3 -3
- package/esm2022/lib/components/forms/directives/validation/validators/elder-min.validator.mjs +3 -3
- package/esm2022/lib/components/forms/directives/validation/validators/elder-multiple-of.validator.mjs +3 -3
- package/esm2022/lib/components/forms/directives/validation/validators/elder-required-ignore-zero.validator.mjs +3 -3
- package/esm2022/lib/components/forms/elder-forms.module.mjs +4 -4
- package/esm2022/lib/components/forms/search/domain/context/search-context.service.mjs +3 -3
- package/esm2022/lib/components/forms/search/domain/url/elder-search-url.directive.mjs +3 -3
- package/esm2022/lib/components/forms/search/domain/url/elder-search-url.service.mjs +3 -3
- package/esm2022/lib/components/forms/search/elder-search-context.directive.mjs +3 -3
- package/esm2022/lib/components/forms/search/elder-search-input.directive.mjs +3 -3
- package/esm2022/lib/components/forms/search/elder-search.module.mjs +4 -4
- package/esm2022/lib/components/forms/search/search-box/elder-search-box.component.mjs +27 -41
- package/esm2022/lib/components/forms/search/search-box/elder-search-panel.component.mjs +13 -6
- package/esm2022/lib/components/global-search/elder-global-search.component.mjs +3 -3
- package/esm2022/lib/components/global-search/elder-global-search.module.mjs +4 -4
- package/esm2022/lib/components/global-search/elder-global-search.service.mjs +3 -3
- package/esm2022/lib/components/graph/elder-progress-bar/elder-progress-bar.component.mjs +3 -3
- package/esm2022/lib/components/graph/elder-progress-bar/elder-progress-bar.module.mjs +4 -4
- package/esm2022/lib/components/headers/elder-header/elder-header.component.mjs +3 -3
- package/esm2022/lib/components/headers/elder-header.module.mjs +4 -4
- package/esm2022/lib/components/http-support/elder-http-client.service.mjs +3 -3
- package/esm2022/lib/components/i18n/entities/elder-i18n-entities.module.mjs +4 -4
- package/esm2022/lib/components/i18n/entities/elder-localized-input/elder-localized-input.component.mjs +3 -3
- package/esm2022/lib/components/i18n/entities/elder-localized-input-dialog/elder-localized-input-dialog.component.mjs +3 -3
- package/esm2022/lib/components/i18n/entities/elder-localized-input-dialog.service.mjs +3 -3
- package/esm2022/lib/components/i18n/entities/elder-localized-input-table/elder-localized-input-table.component.mjs +3 -3
- package/esm2022/lib/components/i18n/entities/elder-localized-text-column.directive.mjs +3 -3
- package/esm2022/lib/components/i18n/entities/elder-localized-texts.directive.mjs +3 -3
- 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 +3 -3
- package/esm2022/lib/components/i18n/entities/picker/localisation-picker.service.mjs +3 -3
- package/esm2022/lib/components/i18n/language/elder-language-interceptor.mjs +3 -3
- package/esm2022/lib/components/i18n/language/elder-language.module.mjs +4 -4
- package/esm2022/lib/components/i18n/language/elder-language.service.mjs +3 -3
- package/esm2022/lib/components/i18n/language/language-switcher/elder-language-switcher.component.mjs +3 -3
- package/esm2022/lib/components/i18n/locales/elder-locales-de-ch.module.mjs +4 -4
- package/esm2022/lib/components/iframes/data-view/data-view-iframe/data-view-iframe.component.mjs +3 -3
- package/esm2022/lib/components/iframes/data-view/data-view-iframe-adapter.directive.mjs +3 -3
- package/esm2022/lib/components/iframes/elder-iframe.module.mjs +4 -4
- package/esm2022/lib/components/iframes/iframe-close.directive.mjs +3 -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 +3 -3
- package/esm2022/lib/components/iframes/iframe-side-content/iframe-side-content.component.mjs +3 -3
- package/esm2022/lib/components/iframes/iframe.service.mjs +3 -3
- package/esm2022/lib/components/infinitescroll/elder-infinite-autocomplete.directive.mjs +3 -3
- package/esm2022/lib/components/infinitescroll/elder-infinite-scroll.directive.mjs +3 -3
- package/esm2022/lib/components/infinitescroll/elder-infinite-scroll.module.mjs +4 -4
- package/esm2022/lib/components/input/autocomplete/elder-autocomplete/elder-suggestion-panel.component.mjs +3 -3
- package/esm2022/lib/components/input/autocomplete/elder-autocomplete-many.directive.mjs +3 -3
- package/esm2022/lib/components/input/autocomplete/elder-autocomplete.directive.mjs +3 -3
- package/esm2022/lib/components/input/autocomplete/elder-autocomplete.module.mjs +4 -4
- package/esm2022/lib/components/labels/elder-labels.module.mjs +4 -4
- package/esm2022/lib/components/labels/labels-input/labels-input.component.mjs +3 -3
- package/esm2022/lib/components/measures/dimensions/dimensions-input/elder-dimensions-input.component.mjs +3 -3
- package/esm2022/lib/components/measures/dimensions/validation/elder-required-dimensions.validator.mjs +3 -3
- package/esm2022/lib/components/measures/directives/elder-unit-select.directive.mjs +3 -3
- package/esm2022/lib/components/measures/elder-measures.module.mjs +8 -8
- package/esm2022/lib/components/measures/elder-quantity-transform.pipe.mjs +3 -3
- package/esm2022/lib/components/measures/elder-quantity.pipe.mjs +3 -3
- package/esm2022/lib/components/measures/elder-unit.service.mjs +3 -3
- package/esm2022/lib/components/measures/quantity-input/quantity-form-field/elder-quantity-form-field.component.mjs +3 -3
- package/esm2022/lib/components/measures/quantity-input/quantity-input-control/elder-quantity-input-control.component.mjs +3 -3
- package/esm2022/lib/components/measures/quantity-input/validation/elder-quantity-range.validator.mjs +3 -3
- package/esm2022/lib/components/measures/quantity-input/validation/elder-required-quantity.validator.mjs +3 -3
- package/esm2022/lib/components/measures/util/elder-quantity.service.mjs +3 -3
- package/esm2022/lib/components/navigation/bread-crumbs/bread-crumbs/elder-bread-crumbs.component.mjs +3 -3
- package/esm2022/lib/components/navigation/bread-crumbs/elder-bread-crumbs.module.mjs +4 -4
- package/esm2022/lib/components/navigation/nav/elder-nav.module.mjs +4 -4
- package/esm2022/lib/components/navigation/nav/nav-group/elder-nav-group.component.mjs +3 -3
- package/esm2022/lib/components/navigation/nav/nav-link/elder-nav-link.component.mjs +3 -3
- package/esm2022/lib/components/navigation/nav/nav-list/elder-nav-list.component.mjs +3 -3
- package/esm2022/lib/components/navigation/toolbar/elder-toolbar-column.directive.mjs +3 -3
- package/esm2022/lib/components/navigation/toolbar/elder-toolbar.module.mjs +4 -4
- package/esm2022/lib/components/navigation/toolbar/elder-toolbar.service.mjs +3 -3
- package/esm2022/lib/components/navigation/toolbar/toolbar/elder-toolbar.component.mjs +3 -3
- package/esm2022/lib/components/navigation/toolbar/toolbar-title/elder-toolbar-title.component.mjs +3 -3
- package/esm2022/lib/components/navigation/toolbar/toolbar-title/elder-toolbar-title.service.mjs +3 -3
- package/esm2022/lib/components/overlays/elder-overlay-origin.directive.mjs +3 -3
- package/esm2022/lib/components/overlays/elder-overlay-ref.mjs +3 -3
- package/esm2022/lib/components/overlays/elder-overlay-trigger.directive.mjs +3 -3
- package/esm2022/lib/components/overlays/elder-overlay.component.mjs +3 -3
- package/esm2022/lib/components/overlays/elder-overlay.module.mjs +4 -4
- package/esm2022/lib/components/page/exit-guard/page-exit-guard.module.mjs +4 -4
- package/esm2022/lib/components/page/exit-guard/page-exit-guard.service.mjs +3 -3
- package/esm2022/lib/components/page/exit-guard/page-exit-lock/page-exit-lock.component.mjs +3 -3
- package/esm2022/lib/components/page/exit-guard/page-exit-lock-indicator/page-exit-lock-indicator.component.mjs +3 -3
- package/esm2022/lib/components/page/exit-guard/page-exit-lock-overview/page-exit-lock-overview.component.mjs +3 -3
- 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 +4 -4
- package/esm2022/lib/components/panels/flat/elder-panel.component.mjs +3 -3
- package/esm2022/lib/components/panels/toggle-panel/elder-toggle-panel-trigger.directive.mjs +3 -3
- package/esm2022/lib/components/panels/toggle-panel/elder-toggle-panel.component.mjs +9 -9
- package/esm2022/lib/components/scrollbar/elder-scrollbar.directive.mjs +3 -3
- package/esm2022/lib/components/scrollbar/elder-scrollbar.module.mjs +4 -4
- package/esm2022/lib/components/select/auto/elder-auto-select-first.directive.mjs +3 -3
- package/esm2022/lib/components/select/auto/elder-auto-select-first.service.mjs +3 -3
- package/esm2022/lib/components/select/auto/elder-auto-select-suggest-first.directive.mjs +3 -3
- package/esm2022/lib/components/select/elder-select-base.mjs +3 -3
- package/esm2022/lib/components/select/elder-select-chip.directive.mjs +9 -9
- package/esm2022/lib/components/select/elder-select-on-tab.directive.mjs +3 -3
- package/esm2022/lib/components/select/elder-select-value.directive.mjs +3 -3
- package/esm2022/lib/components/select/elder-select.module.mjs +4 -4
- package/esm2022/lib/components/select/filter/elder-chips-include-exclude.directive.mjs +3 -3
- package/esm2022/lib/components/select/filter/elder-filter-chip-template/elder-filter-chip-template.component.mjs +3 -3
- package/esm2022/lib/components/select/multi/elder-chip-select-option/elder-select-option.component.mjs +3 -3
- package/esm2022/lib/components/select/multi/elder-multi-select-base.mjs +3 -3
- package/esm2022/lib/components/select/multi/elder-multi-select-chip-options/elder-multi-select-chip-options.component.mjs +3 -3
- package/esm2022/lib/components/select/multi/elder-multi-select-chips/elder-multi-select-chips.component.mjs +3 -3
- package/esm2022/lib/components/select/multi/elder-multi-select-form-field.mjs +3 -3
- package/esm2022/lib/components/select/multi/elder-mutli-select-all-directive.mjs +3 -3
- package/esm2022/lib/components/select/multi/elder-search-include-exclude.directive.mjs +3 -3
- package/esm2022/lib/components/select/popup/selection-model-popup-trigger-adapter.directive.mjs +3 -3
- package/esm2022/lib/components/select/popup/selection-model-popup.directive.mjs +3 -3
- package/esm2022/lib/components/select/popup/templated-selection-dialog/templated-selection-dialog.component.mjs +3 -3
- package/esm2022/lib/components/select/single/elder-clear-select.directive.mjs +3 -3
- package/esm2022/lib/components/select/single/elder-select/elder-select.component.mjs +3 -3
- package/esm2022/lib/components/select/single/elder-select-form-field.mjs +3 -3
- package/esm2022/lib/components/select-chip-list/chip-list-select/elder-chip-list-select.component.mjs +3 -3
- package/esm2022/lib/components/select-chip-list/elder-chip-list-select.module.mjs +4 -4
- package/esm2022/lib/components/shell/drawers/elder-route-outlet-drawer.service.mjs +3 -3
- package/esm2022/lib/components/shell/drawers/elder-router-outlet.service.mjs +3 -3
- package/esm2022/lib/components/shell/elder-shell-slot.directive.mjs +3 -3
- package/esm2022/lib/components/shell/elder-shell.module.mjs +4 -4
- package/esm2022/lib/components/shell/elder-shell.service.mjs +3 -3
- package/esm2022/lib/components/shell/header/elder-app-header/elder-app-header.component.mjs +3 -3
- package/esm2022/lib/components/shell/shell/elder-shell.component.mjs +12 -12
- package/esm2022/lib/components/shell/shell-navigation-toggle/elder-shell-navigation-toggle.component.mjs +3 -3
- package/esm2022/lib/components/tabs/elder-tab/elder-tab.directive.mjs +3 -3
- package/esm2022/lib/components/tabs/elder-tab-group-routing/elder-tab-group-routing.directive.mjs +3 -3
- package/esm2022/lib/components/tabs/elder-tab.module.mjs +4 -4
- package/esm2022/lib/components/theme/elder-theme-applier.directive.mjs +3 -3
- package/esm2022/lib/components/theme/elder-theme-preference.service.mjs +3 -3
- package/esm2022/lib/components/theme/elder-theme-toggle/elder-theme-toggle.component.mjs +3 -3
- package/esm2022/lib/components/theme/elder-theme.directive.mjs +3 -3
- package/esm2022/lib/components/theme/elder-theme.module.mjs +4 -4
- package/esm2022/lib/components/theme/elder-theme.service.mjs +3 -3
- package/esm2022/lib/components/time/date-adapters/custom-date-adapter.mjs +3 -3
- package/esm2022/lib/components/time/duration/elder-duration-input/elder-duration-input.component.mjs +3 -3
- package/esm2022/lib/components/time/elder-date-switcher/elder-date-switcher.component.mjs +3 -3
- package/esm2022/lib/components/time/elder-date-time-input/elder-date-time-input.component.mjs +3 -3
- package/esm2022/lib/components/time/elder-interval-input/elder-interval-input.component.mjs +15 -6
- package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker-binding.directive.mjs +45 -0
- package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker-toggle/elder-interval-picker-toggle.component.mjs +203 -0
- package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker.component.mjs +269 -0
- package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker.service.mjs +703 -0
- package/esm2022/lib/components/time/elder-local-date-input/elder-local-date-input.component.mjs +3 -3
- package/esm2022/lib/components/time/elder-local-time-input/elder-local-time-input.component.mjs +3 -3
- package/esm2022/lib/components/time/elder-time.module.mjs +26 -6
- package/esm2022/lib/components/time/period/elder-period-input/elder-period-input.component.mjs +3 -3
- package/esm2022/lib/components/time/pipes/to-iso-date-string.pipe.mjs +3 -3
- package/esm2022/lib/components/toasts/elder-toast.module.mjs +4 -4
- package/esm2022/lib/components/toasts/elder-toast.service.mjs +3 -3
- package/esm2022/lib/components/toasts/standard-toast/standard-toast.component.mjs +3 -3
- package/esm2022/lib/components/url-fragment/elder-url-fragment.module.mjs +4 -4
- package/esm2022/lib/components/url-fragment/url-fragment-switcher/elder-url-fragment-switcher.component.mjs +3 -3
- package/esm2022/lib/components/viewers/elder-svg-viewer/elder-svg-viewer.component.mjs +3 -3
- package/esm2022/lib/components/viewers/elder-viewers.module.mjs +4 -4
- package/esm2022/lib/features/event-source/fetch/reactive-fetch-event-source.service.mjs +3 -3
- package/esm2022/lib/features/event-source/standard/elder-event-source.service.mjs +3 -3
- package/esm2022/lib/features/kafent/access-token-provider.mjs +3 -3
- package/esm2022/lib/features/kafent/kafent-config.mjs +3 -3
- package/esm2022/lib/features/kafent/kafent-event-stream.mjs +3 -3
- package/esm2022/lib/features/kafent/kafent-event.service.mjs +3 -3
- package/esm2022/lib/features/kafent/kafent.module.mjs +4 -4
- package/esm2022/lib/features/kafent/sse/kafent-event-stream-sse.service.mjs +3 -3
- package/esm2022/lib/pipes/bytes.pipe.mjs +3 -3
- package/esm2022/lib/pipes/elder-pipes.module.mjs +10 -10
- package/esm2022/lib/pipes/elder-repeat.pipe.mjs +3 -3
- package/esm2022/lib/pipes/elder-round.pipe.mjs +3 -3
- package/esm2022/lib/pipes/elder-safe-url.pipe.mjs +3 -3
- package/esm2022/lib/pipes/elder-truncate.pipe.mjs +3 -3
- package/esm2022/lib/pipes/iso-duration.pipe.mjs +3 -3
- package/esm2022/lib/pipes/iso-interval-parse.pipe.mjs +3 -3
- package/esm2022/lib/pipes/iso-interval.pipe.mjs +3 -3
- package/esm2022/lib/pipes/time-ago.pipe.mjs +3 -3
- package/esm2022/lib/pipes/time-duration.pipe.mjs +3 -3
- package/esm2022/lib/pipes/weight.pipe.mjs +3 -3
- package/fesm2022/elderbyte-ngx-starter.mjs +2809 -1403
- package/fesm2022/elderbyte-ngx-starter.mjs.map +1 -1
- package/lib/common/time/public_api.d.ts +2 -0
- package/lib/common/time/temporal-plain-date-interval.d.ts +15 -0
- package/lib/common/time/temporal-util.d.ts +34 -0
- package/lib/components/forms/search/search-box/elder-search-box.component.d.ts +9 -25
- package/lib/components/forms/search/search-box/elder-search-panel.component.d.ts +4 -0
- package/lib/components/time/elder-interval-input/elder-interval-input.component.d.ts +4 -1
- package/lib/components/time/elder-interval-picker/elder-interval-picker-binding.directive.d.ts +30 -0
- package/lib/components/time/elder-interval-picker/elder-interval-picker-toggle/elder-interval-picker-toggle.component.d.ts +48 -0
- package/lib/components/time/elder-interval-picker/elder-interval-picker.component.d.ts +73 -0
- package/lib/components/time/elder-interval-picker/elder-interval-picker.service.d.ts +130 -0
- package/lib/components/time/elder-time.module.d.ts +8 -2
- package/package.json +3 -2
- package/src/lib/components/time/elder-interval-picker/elder-interval-picker.component.scss +36 -0
|
@@ -0,0 +1,703 @@
|
|
|
1
|
+
import { computed, effect, EventEmitter, Injectable, signal, } from '@angular/core';
|
|
2
|
+
import { DateRange } from '@angular/material/datepicker';
|
|
3
|
+
import { LoggerFactory } from '@elderbyte/ts-logger';
|
|
4
|
+
import { Temporal } from '@js-temporal/polyfill';
|
|
5
|
+
import { Interval } from '../../../common/time/interval';
|
|
6
|
+
import { TemporalPlainDateInterval } from '../../../common/time/temporal-plain-date-interval';
|
|
7
|
+
import { TemporalUtil } from '../../../common/time/temporal-util';
|
|
8
|
+
import { TimeUtil } from '../../../common/time/time-util';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
const defaultCalendarMode = 'days';
|
|
11
|
+
export class ElderIntervalPickerService {
|
|
12
|
+
constructor() {
|
|
13
|
+
/***************************************************************************
|
|
14
|
+
* *
|
|
15
|
+
* Fields *
|
|
16
|
+
* *
|
|
17
|
+
**************************************************************************/
|
|
18
|
+
this.log = LoggerFactory.getLogger(this.constructor.name);
|
|
19
|
+
this._dateChangeEmitter = new EventEmitter();
|
|
20
|
+
this.calendarMode = signal(defaultCalendarMode);
|
|
21
|
+
this.startDate = signal(null);
|
|
22
|
+
this.endDate = signal(null);
|
|
23
|
+
this.baseReferenceDate = signal(Temporal.Now.plainDateISO());
|
|
24
|
+
this.baseReferenceTime = signal(Temporal.Now.plainTimeISO());
|
|
25
|
+
this.fixedAnchorDate = signal(null);
|
|
26
|
+
this.fixedAnchorTime = signal(Temporal.PlainTime.from('00:00'));
|
|
27
|
+
this.startTime = signal(Temporal.PlainTime.from('00:00'));
|
|
28
|
+
this.endTime = signal(Temporal.PlainTime.from('00:00'));
|
|
29
|
+
this._inputInterval = null;
|
|
30
|
+
this._inputAnchorDateTime = null;
|
|
31
|
+
this.isEmittingOnChange = signal(true);
|
|
32
|
+
this.isUpdatingIntervalOnAnchorChange = signal(false);
|
|
33
|
+
this.isFixedAnchorDateSet = computed(() => {
|
|
34
|
+
return !!this.fixedAnchorDate();
|
|
35
|
+
});
|
|
36
|
+
this.anchorDate = computed(() => {
|
|
37
|
+
if (this.fixedAnchorDate()) {
|
|
38
|
+
return this.fixedAnchorDate();
|
|
39
|
+
}
|
|
40
|
+
return this.baseReferenceDate();
|
|
41
|
+
});
|
|
42
|
+
this.anchorTime = computed(() => {
|
|
43
|
+
if (this.fixedAnchorDate() && this.fixedAnchorTime()) {
|
|
44
|
+
return this.fixedAnchorTime();
|
|
45
|
+
}
|
|
46
|
+
return this.baseReferenceTime();
|
|
47
|
+
});
|
|
48
|
+
this.anchorDateTime = computed(() => {
|
|
49
|
+
return this.anchorDate().toPlainDateTime(this.anchorTime());
|
|
50
|
+
});
|
|
51
|
+
this.dateRange = computed(() => {
|
|
52
|
+
if (!this.isStartAndEndDatesSet()) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
return new TemporalPlainDateInterval(this.startDate(), this.endDate());
|
|
56
|
+
});
|
|
57
|
+
this.dateRangeForCalendar = computed(() => {
|
|
58
|
+
if (!this.isStartAndEndDatesSet()) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
const startDate = TemporalUtil.getJSDateFromPlainDateTime(this.startDate());
|
|
62
|
+
const endDate = TemporalUtil.getJSDateFromPlainDateTime(this.endDate());
|
|
63
|
+
return new DateRange(startDate, endDate);
|
|
64
|
+
});
|
|
65
|
+
this.dateRangeInDays = computed(() => {
|
|
66
|
+
if (!this.dateRange()) {
|
|
67
|
+
return 0;
|
|
68
|
+
}
|
|
69
|
+
return this.dateRange().getDurationInDays();
|
|
70
|
+
});
|
|
71
|
+
this.isStartAndEndDatesEmpty = computed(() => {
|
|
72
|
+
return !this.startDate() && !this.endDate();
|
|
73
|
+
});
|
|
74
|
+
this.isStartAndEndDatesSet = computed(() => {
|
|
75
|
+
return !!(this.startDate() && this.endDate());
|
|
76
|
+
});
|
|
77
|
+
this.isRangeNotSet = computed(() => {
|
|
78
|
+
return !this.isStartAndEndDatesSet();
|
|
79
|
+
});
|
|
80
|
+
this.startDateTime = computed(() => {
|
|
81
|
+
if (!this.startDate()) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
if (this.startTime()) {
|
|
85
|
+
return this.startDate().toPlainDateTime(this.startTime());
|
|
86
|
+
}
|
|
87
|
+
return this.startDate();
|
|
88
|
+
});
|
|
89
|
+
this.endDateTime = computed(() => {
|
|
90
|
+
if (!this.endDate()) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
if (this.endTime()) {
|
|
94
|
+
return this.endDate().toPlainDateTime(this.endTime());
|
|
95
|
+
}
|
|
96
|
+
return this.endDate();
|
|
97
|
+
});
|
|
98
|
+
this.startDateAsJSDate = computed(() => {
|
|
99
|
+
if (!this.startDate()) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
return TemporalUtil.getJSDateFromPlainDateTime(this.startDate());
|
|
103
|
+
});
|
|
104
|
+
this.endDateAsJSDate = computed(() => {
|
|
105
|
+
if (!this.endDate()) {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
return TemporalUtil.getJSDateFromPlainDateTime(this.endDate());
|
|
109
|
+
});
|
|
110
|
+
this.startDateTimeAsJSDate = computed(() => {
|
|
111
|
+
if (!this.startDateTime()) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
return TemporalUtil.getJSDateFromPlainDateTime(this.startDateTime());
|
|
115
|
+
});
|
|
116
|
+
this.endDateTimeAsJSDate = computed(() => {
|
|
117
|
+
if (!this.endDateTime()) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
return TemporalUtil.getJSDateFromPlainDateTime(this.endDateTime());
|
|
121
|
+
});
|
|
122
|
+
this.getCalendarWeek = computed(() => {
|
|
123
|
+
if (!this.startDate()) {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
return this.startDate().weekOfYear;
|
|
127
|
+
});
|
|
128
|
+
this.isFullCalenderWeekSelected = computed(() => {
|
|
129
|
+
if (!this.isStartAndEndDatesSet()) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
if (!TemporalUtil.isFirstDayOfWeek(this.startDate())) {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
const duration = this.startDate().until(this.endDate());
|
|
136
|
+
if (duration.days !== 7) {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
return this.startDate().weekOfYear;
|
|
140
|
+
});
|
|
141
|
+
this.viewIntervalMessage = computed(() => {
|
|
142
|
+
if (this.isRangeNotSet()) {
|
|
143
|
+
return '-';
|
|
144
|
+
}
|
|
145
|
+
if (this.calendarMode() === 'quarters') {
|
|
146
|
+
const quarter = TemporalUtil.getQuarterForDate(this.startDate());
|
|
147
|
+
return `Q${quarter}, ${this.startDate().year}`;
|
|
148
|
+
}
|
|
149
|
+
if (this.calendarMode() === 'months') {
|
|
150
|
+
const monthName = this.startDate().month;
|
|
151
|
+
return `1m (${monthName}, ${this.startDate().year})`;
|
|
152
|
+
}
|
|
153
|
+
if (this.calendarMode() === 'years') {
|
|
154
|
+
const year = this.startDate().year;
|
|
155
|
+
return `1y (${year})`;
|
|
156
|
+
}
|
|
157
|
+
if (this.calendarMode() === 'weeks') {
|
|
158
|
+
return `1w (CW ${this.getCalendarWeek()}, ${this.endDate().year})`;
|
|
159
|
+
}
|
|
160
|
+
if (this.calendarMode() === 'days') {
|
|
161
|
+
return `${this.dateRangeInDays()}d`;
|
|
162
|
+
}
|
|
163
|
+
return '';
|
|
164
|
+
});
|
|
165
|
+
this.deltaAsTemporalDuration = computed(() => {
|
|
166
|
+
const startDateTime = this.startDateTime();
|
|
167
|
+
const endDateTime = this.endDateTime();
|
|
168
|
+
if (!startDateTime || !endDateTime) {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
const duration = startDateTime.until(endDateTime);
|
|
172
|
+
return duration;
|
|
173
|
+
});
|
|
174
|
+
this.deltaHumanReadable = computed(() => {
|
|
175
|
+
if (this.isStartAndEndDatesEmpty()) {
|
|
176
|
+
return '';
|
|
177
|
+
}
|
|
178
|
+
const duration = this.deltaAsTemporalDuration();
|
|
179
|
+
if (!duration) {
|
|
180
|
+
return '∞';
|
|
181
|
+
}
|
|
182
|
+
const tmp = [];
|
|
183
|
+
if (duration.days) {
|
|
184
|
+
tmp.push(`${duration.days}d`);
|
|
185
|
+
}
|
|
186
|
+
if (duration.hours) {
|
|
187
|
+
tmp.push(`${duration.hours}h`);
|
|
188
|
+
}
|
|
189
|
+
if (duration.minutes) {
|
|
190
|
+
tmp.push(`${duration.minutes}min`);
|
|
191
|
+
}
|
|
192
|
+
if (duration.seconds) {
|
|
193
|
+
tmp.push(`${duration.seconds}s`);
|
|
194
|
+
}
|
|
195
|
+
if (!tmp.length) {
|
|
196
|
+
return '0s';
|
|
197
|
+
}
|
|
198
|
+
return tmp.join(', ');
|
|
199
|
+
});
|
|
200
|
+
this.getStartTimeString = computed(() => {
|
|
201
|
+
return TemporalUtil.getHtmlTimeStringFromPlainTime(this.startTime());
|
|
202
|
+
});
|
|
203
|
+
this.getEndTimeString = computed(() => {
|
|
204
|
+
return TemporalUtil.getHtmlTimeStringFromPlainTime(this.endTime());
|
|
205
|
+
});
|
|
206
|
+
this.getAnchorTimeString = computed(() => {
|
|
207
|
+
return TemporalUtil.getHtmlTimeStringFromPlainTime(this.fixedAnchorTime());
|
|
208
|
+
});
|
|
209
|
+
this.getAnchorPointAsLocaleDate = computed(() => {
|
|
210
|
+
const anchorPoint = this.fixedAnchorDate();
|
|
211
|
+
if (!anchorPoint) {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
const jsDate = TemporalUtil.getJSDateFromPlainDateTime(anchorPoint);
|
|
215
|
+
const localeDate = TimeUtil.dateToLocalDate(jsDate);
|
|
216
|
+
return localeDate;
|
|
217
|
+
});
|
|
218
|
+
this.startDateHtmlString = computed(() => {
|
|
219
|
+
return TemporalUtil.getHtmlDateString(this.startDateTime());
|
|
220
|
+
});
|
|
221
|
+
this.endDateHtmlString = computed(() => {
|
|
222
|
+
return TemporalUtil.getHtmlDateString(this.endDateTime());
|
|
223
|
+
});
|
|
224
|
+
this.isStartTimeSetAndNotMidnight = computed(() => {
|
|
225
|
+
if (!this.startTime()) {
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
return (this.startTime().hour !== 0 ||
|
|
229
|
+
this.startTime().minute !== 0 ||
|
|
230
|
+
this.startTime().second !== 0);
|
|
231
|
+
});
|
|
232
|
+
this.isEndTimeSetAndNotMidnight = computed(() => {
|
|
233
|
+
if (!this.endTime()) {
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
return (this.endTime().hour !== 0 ||
|
|
237
|
+
this.endTime().minute !== 0 ||
|
|
238
|
+
this.endTime().second !== 0);
|
|
239
|
+
});
|
|
240
|
+
this.isFixedAnchorTimeSetAndNotMidnight = computed(() => {
|
|
241
|
+
if (!this.fixedAnchorTime()) {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
return (this.fixedAnchorTime().hour !== 0 ||
|
|
245
|
+
this.fixedAnchorTime().minute !== 0 ||
|
|
246
|
+
this.fixedAnchorTime().second !== 0);
|
|
247
|
+
});
|
|
248
|
+
/***************************************************************************
|
|
249
|
+
* *
|
|
250
|
+
* Effects *
|
|
251
|
+
* *
|
|
252
|
+
**************************************************************************/
|
|
253
|
+
this._autoEmitOnDateTimesChangeEffect = effect(() => {
|
|
254
|
+
const startDateTime = this.startDateTime();
|
|
255
|
+
const endDateTime = this.endDateTime();
|
|
256
|
+
if (this.isEmittingOnChange()) {
|
|
257
|
+
this.emitMainDates();
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
/***************************************************************************
|
|
262
|
+
* *
|
|
263
|
+
* Public API *
|
|
264
|
+
* *
|
|
265
|
+
**************************************************************************/
|
|
266
|
+
setStartDateFromHtmlString(htmlString) {
|
|
267
|
+
const date = TemporalUtil.getPlainDateFromHtmlDateString(htmlString);
|
|
268
|
+
if (!date) {
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
this.calendarMode.set('days');
|
|
272
|
+
this.startDate.set(date);
|
|
273
|
+
}
|
|
274
|
+
setEndDateFromHtmlString(htmlString) {
|
|
275
|
+
const date = TemporalUtil.getPlainDateFromHtmlDateString(htmlString);
|
|
276
|
+
if (!date) {
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
this.calendarMode.set('days');
|
|
280
|
+
this.endDate.set(date);
|
|
281
|
+
}
|
|
282
|
+
setupInputInterval(s) {
|
|
283
|
+
this._inputInterval = s;
|
|
284
|
+
}
|
|
285
|
+
setupInputAnchorDateTime(s) {
|
|
286
|
+
this._inputAnchorDateTime = s;
|
|
287
|
+
}
|
|
288
|
+
setupEventEmitter(e) {
|
|
289
|
+
this._dateChangeEmitter = e;
|
|
290
|
+
}
|
|
291
|
+
setStartTimeFromString(timeStr, formControl) {
|
|
292
|
+
const time = TemporalUtil.getPlainTimeFromHtmlTimeString(timeStr);
|
|
293
|
+
if (time) {
|
|
294
|
+
this.startTime.set(time);
|
|
295
|
+
}
|
|
296
|
+
if (!this.startDate()) {
|
|
297
|
+
this.startDate.set(Temporal.Now.plainDateISO());
|
|
298
|
+
}
|
|
299
|
+
this.calendarMode.set('days');
|
|
300
|
+
}
|
|
301
|
+
setEndTimeFromString(timeStr, formControl) {
|
|
302
|
+
const time = TemporalUtil.getPlainTimeFromHtmlTimeString(timeStr);
|
|
303
|
+
if (time) {
|
|
304
|
+
this.endTime.set(time);
|
|
305
|
+
}
|
|
306
|
+
if (!this.endDate()) {
|
|
307
|
+
this.endDate.set(Temporal.Now.plainDateISO());
|
|
308
|
+
}
|
|
309
|
+
this.calendarMode.set('days');
|
|
310
|
+
}
|
|
311
|
+
resetCalendarMode() {
|
|
312
|
+
this.calendarMode.set(defaultCalendarMode);
|
|
313
|
+
}
|
|
314
|
+
pullInputInterval() {
|
|
315
|
+
if (!this._inputInterval) {
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
this.setDateTimesFromElderInterval(this._inputInterval());
|
|
319
|
+
}
|
|
320
|
+
pullInputAnchorDateTime() {
|
|
321
|
+
if (!this._inputAnchorDateTime) {
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
this.setAnchorDateTimeFromJsDate(this._inputAnchorDateTime());
|
|
325
|
+
}
|
|
326
|
+
setDateTimesFromElderInterval(interval) {
|
|
327
|
+
if (!interval) {
|
|
328
|
+
this.startDate.set(null);
|
|
329
|
+
this.endDate.set(null);
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
if (interval.start) {
|
|
333
|
+
const startDateAsJSDate = TimeUtil.date(interval.start);
|
|
334
|
+
this.startDate.set(TemporalUtil.getPlainDateFromJSDate(startDateAsJSDate));
|
|
335
|
+
this.startTime.set(TemporalUtil.getPlainTimeFromJSDate(startDateAsJSDate));
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
this.startDate.set(null);
|
|
339
|
+
}
|
|
340
|
+
if (interval.end) {
|
|
341
|
+
const endDateAsJSDate = TimeUtil.date(interval.end);
|
|
342
|
+
this.endDate.set(TemporalUtil.getPlainDateFromJSDate(endDateAsJSDate));
|
|
343
|
+
this.endTime.set(TemporalUtil.getPlainTimeFromJSDate(endDateAsJSDate));
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
this.endDate.set(null);
|
|
347
|
+
}
|
|
348
|
+
this.log.debug(`Pulled input interval:`, interval);
|
|
349
|
+
}
|
|
350
|
+
setAnchorDateTimeFromJsDate(dateTime) {
|
|
351
|
+
if (!dateTime) {
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
const date = TemporalUtil.getPlainDateFromJSDate(dateTime);
|
|
355
|
+
const time = TemporalUtil.getPlainTimeFromJSDate(dateTime);
|
|
356
|
+
this.fixedAnchorDate.set(date);
|
|
357
|
+
this.fixedAnchorTime.set(time);
|
|
358
|
+
}
|
|
359
|
+
setFixedAnchorPointToStartDateTime() {
|
|
360
|
+
if (!this.startDate()) {
|
|
361
|
+
this.resetFixedAnchorPoint();
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
if (this.startDate()) {
|
|
365
|
+
this.fixedAnchorDate.set(this.startDate());
|
|
366
|
+
}
|
|
367
|
+
if (this.startTime()) {
|
|
368
|
+
this.fixedAnchorTime.set(this.startTime());
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
setFixedAnchorPointToEndDateTime() {
|
|
372
|
+
if (!this.endDate()) {
|
|
373
|
+
this.resetFixedAnchorPoint();
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
if (this.endDate()) {
|
|
377
|
+
this.fixedAnchorDate.set(this.endDate());
|
|
378
|
+
}
|
|
379
|
+
if (this.endTime()) {
|
|
380
|
+
this.fixedAnchorTime.set(this.endTime());
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
resetFixedAnchorPoint() {
|
|
384
|
+
this.fixedAnchorDate.set(null);
|
|
385
|
+
this.fixedAnchorTime.set(Temporal.PlainTime.from('00:00'));
|
|
386
|
+
if (this.isUpdatingIntervalOnAnchorChange() &&
|
|
387
|
+
this.isStartAndEndDatesSet()) {
|
|
388
|
+
this.shiftRangeEndToToday();
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
setAnchorDateFromForm(dateArg) {
|
|
392
|
+
if (!dateArg) {
|
|
393
|
+
this.fixedAnchorDate.set(null);
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
const jsDate = TimeUtil.localDateToDate(dateArg);
|
|
397
|
+
const plainDate = TemporalUtil.getPlainDateFromJSDate(jsDate);
|
|
398
|
+
if (!plainDate) {
|
|
399
|
+
this.log.warn('Invalid date', plainDate);
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
this.fixedAnchorDate.set(plainDate);
|
|
403
|
+
if (!this.isUpdatingIntervalOnAnchorChange()) {
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
if (this.fixedAnchorDate()) {
|
|
407
|
+
this.shiftSelectionToAnchorDate();
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
clearStartDateTime() {
|
|
411
|
+
this.startDate.set(null);
|
|
412
|
+
this.startTime.set(null);
|
|
413
|
+
}
|
|
414
|
+
clearEndDateTime() {
|
|
415
|
+
this.endDate.set(null);
|
|
416
|
+
this.endTime.set(null);
|
|
417
|
+
}
|
|
418
|
+
clearStartTime() {
|
|
419
|
+
this.startTime.set(null);
|
|
420
|
+
}
|
|
421
|
+
clearEndTime() {
|
|
422
|
+
this.endTime.set(null);
|
|
423
|
+
}
|
|
424
|
+
resetFixedAnchorTime() {
|
|
425
|
+
this.fixedAnchorTime.set(Temporal.PlainTime.from('00:00'));
|
|
426
|
+
}
|
|
427
|
+
setAnchorTimeFromForm(htmlString) {
|
|
428
|
+
const time = TemporalUtil.getPlainTimeFromHtmlTimeString(htmlString);
|
|
429
|
+
if (!time) {
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
if (!this.fixedAnchorDate()) {
|
|
433
|
+
this.fixedAnchorDate.set(Temporal.Now.plainDateISO());
|
|
434
|
+
}
|
|
435
|
+
this.fixedAnchorTime.set(time);
|
|
436
|
+
if (!this.isUpdatingIntervalOnAnchorChange()) {
|
|
437
|
+
return;
|
|
438
|
+
}
|
|
439
|
+
if (this.fixedAnchorTime()) {
|
|
440
|
+
this.shiftSelectionToAnchorTime();
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
emitMainDates() {
|
|
444
|
+
const interval = this.createElderInterval();
|
|
445
|
+
this._dateChangeEmitter.emit(interval);
|
|
446
|
+
}
|
|
447
|
+
// date shifts
|
|
448
|
+
shiftDay(days) {
|
|
449
|
+
this.setDatesFromRange(this.dateRange().shiftDays(days));
|
|
450
|
+
if (this.calendarMode() === 'weeks' && (days === 7 || days === -7)) {
|
|
451
|
+
this.calendarMode.set('weeks');
|
|
452
|
+
return;
|
|
453
|
+
}
|
|
454
|
+
this.calendarMode.set('days');
|
|
455
|
+
}
|
|
456
|
+
shiftMonth(months, staticMode = false) {
|
|
457
|
+
this.setDatesFromRange(this.dateRange().shiftMonths(months));
|
|
458
|
+
if (staticMode && this.calendarMode() !== 'months') {
|
|
459
|
+
this.calendarMode.set('days');
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
this.resetTimeRange();
|
|
463
|
+
this.calendarMode.set('months');
|
|
464
|
+
}
|
|
465
|
+
shiftYear(years, staticMode = false) {
|
|
466
|
+
this.setDatesFromRange(this.dateRange().shiftYears(years));
|
|
467
|
+
if (staticMode && this.calendarMode() !== 'years') {
|
|
468
|
+
this.calendarMode.set('days');
|
|
469
|
+
return;
|
|
470
|
+
}
|
|
471
|
+
this.resetTimeRange();
|
|
472
|
+
this.calendarMode.set('years');
|
|
473
|
+
}
|
|
474
|
+
shiftTime(amount, unit) {
|
|
475
|
+
if (!this.isStartAndEndDatesSet()) {
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
const newStartDateTime = this.startDateTime().add({ [unit]: amount });
|
|
479
|
+
const newEndDateTime = this.endDateTime().add({ [unit]: amount });
|
|
480
|
+
this.startDate.set(Temporal.PlainDate.from(newStartDateTime));
|
|
481
|
+
this.startTime.set(Temporal.PlainTime.from(newStartDateTime));
|
|
482
|
+
this.endDate.set(Temporal.PlainDate.from(newEndDateTime));
|
|
483
|
+
this.endTime.set(Temporal.PlainTime.from(newEndDateTime));
|
|
484
|
+
}
|
|
485
|
+
smartShift(direction = 1) {
|
|
486
|
+
if (this.calendarMode() === 'quarters') {
|
|
487
|
+
const newRange = this.dateRange().shiftMonths(direction * 3);
|
|
488
|
+
this.setDatesFromRange(newRange);
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
if (this.calendarMode() === 'months') {
|
|
492
|
+
const newRange = this.dateRange().shiftMonths(direction);
|
|
493
|
+
this.setDatesFromRange(newRange);
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
if (this.calendarMode() === 'years') {
|
|
497
|
+
const newRange = this.dateRange().shiftYears(direction);
|
|
498
|
+
this.setDatesFromRange(newRange);
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
if (this.calendarMode() === 'weeks') {
|
|
502
|
+
const newRange = this.dateRange().shiftDays(7 * direction);
|
|
503
|
+
this.setDatesFromRange(newRange);
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
const daysDiff = this.dateRange().getDurationInDays();
|
|
507
|
+
const newRange = this.dateRange().shiftDays(daysDiff * direction);
|
|
508
|
+
this.setDatesFromRange(newRange);
|
|
509
|
+
}
|
|
510
|
+
// time range selections
|
|
511
|
+
selectLastHour() {
|
|
512
|
+
this.refreshBaseReferenceDateTime();
|
|
513
|
+
const end = this.anchorDateTime();
|
|
514
|
+
const start = end.subtract({ hours: 1 });
|
|
515
|
+
this.endDate.set(this.anchorDate());
|
|
516
|
+
this.endTime.set(this.anchorTime());
|
|
517
|
+
const startPlainDate = Temporal.PlainDate.from(start);
|
|
518
|
+
const startPlainTime = Temporal.PlainTime.from(start);
|
|
519
|
+
this.startDate.set(startPlainDate);
|
|
520
|
+
this.startTime.set(startPlainTime);
|
|
521
|
+
this.calendarMode.set('days');
|
|
522
|
+
}
|
|
523
|
+
selectLast24Hours() {
|
|
524
|
+
this.refreshBaseReferenceDateTime();
|
|
525
|
+
const end = this.anchorDateTime();
|
|
526
|
+
const start = end.subtract({ days: 1 });
|
|
527
|
+
this.endDate.set(this.anchorDate());
|
|
528
|
+
this.endTime.set(this.anchorTime());
|
|
529
|
+
const startPlainDate = Temporal.PlainDate.from(start);
|
|
530
|
+
const startPlainTime = Temporal.PlainTime.from(start);
|
|
531
|
+
this.startDate.set(startPlainDate);
|
|
532
|
+
this.startTime.set(startPlainTime);
|
|
533
|
+
this.calendarMode.set('days');
|
|
534
|
+
}
|
|
535
|
+
selectLastFiveMinutes() {
|
|
536
|
+
this.refreshBaseReferenceDateTime();
|
|
537
|
+
const end = this.anchorDateTime();
|
|
538
|
+
const start = end.subtract({ minutes: 5 });
|
|
539
|
+
this.endDate.set(this.anchorDate());
|
|
540
|
+
this.endTime.set(this.anchorTime());
|
|
541
|
+
const startPlainDate = Temporal.PlainDate.from(start);
|
|
542
|
+
const startPlainTime = Temporal.PlainTime.from(start);
|
|
543
|
+
this.startDate.set(startPlainDate);
|
|
544
|
+
this.startTime.set(startPlainTime);
|
|
545
|
+
this.calendarMode.set('days');
|
|
546
|
+
}
|
|
547
|
+
// date range selections
|
|
548
|
+
selectCurrentDay() {
|
|
549
|
+
this.setDatesFromRange(TemporalUtil.getCurrentDay(this.anchorDate()));
|
|
550
|
+
this.calendarMode.set('days');
|
|
551
|
+
this.resetTimeRange();
|
|
552
|
+
}
|
|
553
|
+
selectYesterday() {
|
|
554
|
+
this.setDatesFromRange(TemporalUtil.getYesterday(this.anchorDate()));
|
|
555
|
+
this.calendarMode.set('days');
|
|
556
|
+
this.resetTimeRange();
|
|
557
|
+
}
|
|
558
|
+
selectCurrentWeek() {
|
|
559
|
+
this.setDatesFromRange(TemporalUtil.getCurrentWeek(this.anchorDate()));
|
|
560
|
+
this.calendarMode.set('weeks');
|
|
561
|
+
this.resetTimeRange();
|
|
562
|
+
}
|
|
563
|
+
selectPreviousWeek() {
|
|
564
|
+
this.setDatesFromRange(TemporalUtil.getPreviousWeek(this.anchorDate()));
|
|
565
|
+
this.calendarMode.set('weeks');
|
|
566
|
+
this.resetTimeRange();
|
|
567
|
+
}
|
|
568
|
+
selectLastSevenDays() {
|
|
569
|
+
this.setDatesFromRange(TemporalUtil.getLastSevenDays(this.anchorDate()));
|
|
570
|
+
this.calendarMode.set('days');
|
|
571
|
+
this.resetTimeRange();
|
|
572
|
+
}
|
|
573
|
+
selectCurrentMonth() {
|
|
574
|
+
this.setDatesFromRange(TemporalUtil.getCurrentMonth(this.anchorDate()));
|
|
575
|
+
this.calendarMode.set('months');
|
|
576
|
+
this.resetTimeRange();
|
|
577
|
+
}
|
|
578
|
+
selectPreviousMonth() {
|
|
579
|
+
this.setDatesFromRange(TemporalUtil.getPreviousMonth(this.anchorDate()));
|
|
580
|
+
this.calendarMode.set('months');
|
|
581
|
+
this.resetTimeRange();
|
|
582
|
+
}
|
|
583
|
+
selectLastThirtyDays() {
|
|
584
|
+
this.setDatesFromRange(TemporalUtil.getLastThirtyDays(this.anchorDate()));
|
|
585
|
+
this.calendarMode.set('days');
|
|
586
|
+
this.resetTimeRange();
|
|
587
|
+
}
|
|
588
|
+
selectCurrentYear() {
|
|
589
|
+
this.setDatesFromRange(TemporalUtil.getCurrentYear(this.anchorDate()));
|
|
590
|
+
this.calendarMode.set('years');
|
|
591
|
+
this.resetTimeRange();
|
|
592
|
+
}
|
|
593
|
+
selectPreviousYear() {
|
|
594
|
+
this.setDatesFromRange(TemporalUtil.getPreviousYear(this.anchorDate()));
|
|
595
|
+
this.calendarMode.set('years');
|
|
596
|
+
this.resetTimeRange();
|
|
597
|
+
}
|
|
598
|
+
selectLast365Days() {
|
|
599
|
+
this.setDatesFromRange(TemporalUtil.getLast365Days(this.anchorDate()));
|
|
600
|
+
this.calendarMode.set('days');
|
|
601
|
+
this.resetTimeRange();
|
|
602
|
+
}
|
|
603
|
+
selectCurrentQuarter() {
|
|
604
|
+
this.setDatesFromRange(TemporalUtil.getCurrentQuarter(this.anchorDate()));
|
|
605
|
+
this.calendarMode.set('quarters');
|
|
606
|
+
this.resetTimeRange();
|
|
607
|
+
}
|
|
608
|
+
selectPreviousQuarter() {
|
|
609
|
+
this.setDatesFromRange(TemporalUtil.getPreviousQuarter(this.anchorDate()));
|
|
610
|
+
this.calendarMode.set('quarters');
|
|
611
|
+
this.resetTimeRange();
|
|
612
|
+
}
|
|
613
|
+
// Anchor point shift selections
|
|
614
|
+
shiftSelectionToAnchorDate() {
|
|
615
|
+
if (!this.isStartAndEndDatesSet() || !this.fixedAnchorDate()) {
|
|
616
|
+
return;
|
|
617
|
+
}
|
|
618
|
+
const range = new TemporalPlainDateInterval(this.startDate(), this.endDate());
|
|
619
|
+
const endDate = this.fixedAnchorDate();
|
|
620
|
+
const startDate = endDate.subtract({ days: range.getDurationInDays() });
|
|
621
|
+
this.startDate.set(startDate);
|
|
622
|
+
this.endDate.set(endDate);
|
|
623
|
+
if (this.calendarMode() === 'months') {
|
|
624
|
+
this.selectCurrentMonth();
|
|
625
|
+
}
|
|
626
|
+
if (this.calendarMode() === 'years') {
|
|
627
|
+
this.selectCurrentYear();
|
|
628
|
+
}
|
|
629
|
+
if (this.calendarMode() === 'weeks') {
|
|
630
|
+
this.selectCurrentWeek();
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
shiftSelectionToAnchorTime() {
|
|
634
|
+
if (!this.isStartAndEndDatesSet() || !this.fixedAnchorTime()) {
|
|
635
|
+
return;
|
|
636
|
+
}
|
|
637
|
+
const duration = this.startDateTime().until(this.endDateTime());
|
|
638
|
+
const newStartDateTime = this.anchorDateTime().subtract(duration);
|
|
639
|
+
const newEndDateTime = this.anchorDateTime();
|
|
640
|
+
this.startDate.set(Temporal.PlainDate.from(newStartDateTime));
|
|
641
|
+
this.startTime.set(Temporal.PlainTime.from(newStartDateTime));
|
|
642
|
+
this.endDate.set(Temporal.PlainDate.from(newEndDateTime));
|
|
643
|
+
this.endTime.set(Temporal.PlainTime.from(newEndDateTime));
|
|
644
|
+
if (this.calendarMode() === 'months') {
|
|
645
|
+
this.selectCurrentMonth();
|
|
646
|
+
}
|
|
647
|
+
if (this.calendarMode() === 'years') {
|
|
648
|
+
this.selectCurrentYear();
|
|
649
|
+
}
|
|
650
|
+
if (this.calendarMode() === 'weeks') {
|
|
651
|
+
this.selectCurrentWeek();
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
/***************************************************************************
|
|
655
|
+
* *
|
|
656
|
+
* Private methods *
|
|
657
|
+
* *
|
|
658
|
+
**************************************************************************/
|
|
659
|
+
createElderInterval() {
|
|
660
|
+
let start, end = null;
|
|
661
|
+
if (this.startDateTime()) {
|
|
662
|
+
const jsDate = TemporalUtil.getJSDateFromPlainDateTime(this.startDateTime());
|
|
663
|
+
start = TimeUtil.instant(jsDate);
|
|
664
|
+
}
|
|
665
|
+
if (this.endDateTime()) {
|
|
666
|
+
const jsDate = TemporalUtil.getJSDateFromPlainDateTime(this.endDateTime());
|
|
667
|
+
end = TimeUtil.instant(jsDate);
|
|
668
|
+
}
|
|
669
|
+
if (!start && !end) {
|
|
670
|
+
return new Interval(null, null);
|
|
671
|
+
}
|
|
672
|
+
return new Interval(start, end);
|
|
673
|
+
}
|
|
674
|
+
setDatesFromRange(range) {
|
|
675
|
+
this.startDate.set(range.start);
|
|
676
|
+
this.endDate.set(range.end);
|
|
677
|
+
}
|
|
678
|
+
refreshBaseReferenceDateTime() {
|
|
679
|
+
const dateTime = Temporal.Now.zonedDateTimeISO();
|
|
680
|
+
const date = Temporal.PlainDate.from(dateTime);
|
|
681
|
+
const time = Temporal.PlainTime.from(dateTime);
|
|
682
|
+
this.baseReferenceDate.set(date);
|
|
683
|
+
this.baseReferenceTime.set(time);
|
|
684
|
+
}
|
|
685
|
+
resetTimeRange() {
|
|
686
|
+
this.startTime.set(Temporal.PlainTime.from('00:00'));
|
|
687
|
+
this.endTime.set(Temporal.PlainTime.from('00:00'));
|
|
688
|
+
}
|
|
689
|
+
shiftRangeEndToToday() {
|
|
690
|
+
if (!this.isStartAndEndDatesSet()) {
|
|
691
|
+
return;
|
|
692
|
+
}
|
|
693
|
+
const duration = this.startDate().until(this.endDate());
|
|
694
|
+
this.endDate.set(Temporal.Now.plainDateISO());
|
|
695
|
+
this.startDate.set(this.endDate().subtract(duration));
|
|
696
|
+
}
|
|
697
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: ElderIntervalPickerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
698
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: ElderIntervalPickerService }); }
|
|
699
|
+
}
|
|
700
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: ElderIntervalPickerService, decorators: [{
|
|
701
|
+
type: Injectable
|
|
702
|
+
}] });
|
|
703
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItaW50ZXJ2YWwtcGlja2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbGRlcmJ5dGUvbmd4LXN0YXJ0ZXIvc3JjL2xpYi9jb21wb25lbnRzL3RpbWUvZWxkZXItaW50ZXJ2YWwtcGlja2VyL2VsZGVyLWludGVydmFsLXBpY2tlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFlBQVksRUFDWixVQUFVLEVBRVYsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUM5RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOztBQUcxRCxNQUFNLG1CQUFtQixHQUFpQixNQUFNLENBQUM7QUFHakQsTUFBTSxPQUFPLDBCQUEwQjtJQUR2QztRQUVFOzs7O29GQUk0RTtRQUUzRCxRQUFHLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTlELHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFZLENBQUM7UUFFakQsaUJBQVksR0FBRyxNQUFNLENBQWUsbUJBQW1CLENBQUMsQ0FBQztRQUV6RCxjQUFTLEdBQUcsTUFBTSxDQUFxQixJQUFJLENBQUMsQ0FBQztR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QUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDOzhHQTUwQlUsMEJBQTBCO2tIQUExQiwwQkFBMEI7OzJGQUExQiwwQkFBMEI7a0JBRHRDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBFZmZlY3RSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0YWJsZSxcbiAgU2lnbmFsLFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBMb2dnZXJGYWN0b3J5IH0gZnJvbSAnQGVsZGVyYnl0ZS90cy1sb2dnZXInO1xuaW1wb3J0IHsgTG9jYWxEYXRlIH0gZnJvbSAnQGpzLWpvZGEvY29yZSc7XG5pbXBvcnQgeyBUZW1wb3JhbCB9IGZyb20gJ0Bqcy10ZW1wb3JhbC9wb2x5ZmlsbCc7XG5pbXBvcnQgeyBJbnRlcnZhbCB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90aW1lL2ludGVydmFsJztcbmltcG9ydCB7IFRlbXBvcmFsUGxhaW5EYXRlSW50ZXJ2YWwgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdGltZS90ZW1wb3JhbC1wbGFpbi1kYXRlLWludGVydmFsJztcbmltcG9ydCB7IFRlbXBvcmFsVXRpbCB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90aW1lL3RlbXBvcmFsLXV0aWwnO1xuaW1wb3J0IHsgVGltZVV0aWwgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdGltZS90aW1lLXV0aWwnO1xuXG50eXBlIGNhbGVuZGFyTW9kZSA9ICdkYXlzJyB8ICd3ZWVrcycgfCAnbW9udGhzJyB8ICdxdWFydGVycycgfCAneWVhcnMnO1xuY29uc3QgZGVmYXVsdENhbGVuZGFyTW9kZTogY2FsZW5kYXJNb2RlID0gJ2RheXMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRWxkZXJJbnRlcnZhbFBpY2tlclNlcnZpY2Uge1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogRmllbGRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIHJlYWRvbmx5IGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKHRoaXMuY29uc3RydWN0b3IubmFtZSk7XG5cbiAgcHJpdmF0ZSBfZGF0ZUNoYW5nZUVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPEludGVydmFsPigpO1xuXG4gIHJlYWRvbmx5IGNhbGVuZGFyTW9kZSA9IHNpZ25hbDxjYWxlbmRhck1vZGU+KGRlZmF1bHRDYWxlbmRhck1vZGUpO1xuXG4gIHJlYWRvbmx5IHN0YXJ0RGF0ZSA9IHNpZ25hbDxUZW1wb3JhbC5QbGFpbkRhdGU+KG51bGwpO1xuICByZWFkb25seSBlbmREYXRlID0gc2lnbmFsPFRlbXBvcmFsLlBsYWluRGF0ZT4obnVsbCk7XG5cbiAgcmVhZG9ubHkgYmFzZVJlZmVyZW5jZURhdGUgPSBzaWduYWwoVGVtcG9yYWwuTm93LnBsYWluRGF0ZUlTTygpKTtcbiAgcmVhZG9ubHkgYmFzZVJlZmVyZW5jZVRpbWUgPSBzaWduYWwoVGVtcG9yYWwuTm93LnBsYWluVGltZUlTTygpKTtcblxuICByZWFkb25seSBmaXhlZEFuY2hvckRhdGUgPSBzaWduYWw8VGVtcG9yYWwuUGxhaW5EYXRlPihudWxsKTtcbiAgcmVhZG9ubHkgZml4ZWRBbmNob3JUaW1lID0gc2lnbmFsKFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKCcwMDowMCcpKTtcblxuICByZWFkb25seSBzdGFydFRpbWUgPSBzaWduYWwoVGVtcG9yYWwuUGxhaW5UaW1lLmZyb20oJzAwOjAwJykpO1xuICByZWFkb25seSBlbmRUaW1lID0gc2lnbmFsKFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKCcwMDowMCcpKTtcblxuICBwcml2YXRlIF9pbnB1dEludGVydmFsOiBTaWduYWw8SW50ZXJ2YWw+ID0gbnVsbDtcbiAgcHJpdmF0ZSBfaW5wdXRBbmNob3JEYXRlVGltZTogU2lnbmFsPERhdGU+ID0gbnVsbDtcblxuICByZWFkb25seSBpc0VtaXR0aW5nT25DaGFuZ2UgPSBzaWduYWw8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGlzVXBkYXRpbmdJbnRlcnZhbE9uQW5jaG9yQ2hhbmdlID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICByZWFkb25seSBpc0ZpeGVkQW5jaG9yRGF0ZVNldCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gISF0aGlzLmZpeGVkQW5jaG9yRGF0ZSgpO1xuICB9KTtcblxuICByZWFkb25seSBhbmNob3JEYXRlID0gY29tcHV0ZWQ8VGVtcG9yYWwuUGxhaW5EYXRlPigoKSA9PiB7XG4gICAgaWYgKHRoaXMuZml4ZWRBbmNob3JEYXRlKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpeGVkQW5jaG9yRGF0ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5iYXNlUmVmZXJlbmNlRGF0ZSgpO1xuICB9KTtcblxuICByZWFkb25seSBhbmNob3JUaW1lID0gY29tcHV0ZWQ8VGVtcG9yYWwuUGxhaW5UaW1lPigoKSA9PiB7XG4gICAgaWYgKHRoaXMuZml4ZWRBbmNob3JEYXRlKCkgJiYgdGhpcy5maXhlZEFuY2hvclRpbWUoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZml4ZWRBbmNob3JUaW1lKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJhc2VSZWZlcmVuY2VUaW1lKCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGFuY2hvckRhdGVUaW1lID0gY29tcHV0ZWQ8VGVtcG9yYWwuUGxhaW5EYXRlVGltZT4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmFuY2hvckRhdGUoKS50b1BsYWluRGF0ZVRpbWUodGhpcy5hbmNob3JUaW1lKCkpO1xuICB9KTtcblxuICByZWFkb25seSBkYXRlUmFuZ2UgPSBjb21wdXRlZDxUZW1wb3JhbFBsYWluRGF0ZUludGVydmFsIHwgbnVsbD4oKCkgPT4ge1xuICAgIGlmICghdGhpcy5pc1N0YXJ0QW5kRW5kRGF0ZXNTZXQoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVtcG9yYWxQbGFpbkRhdGVJbnRlcnZhbCh0aGlzLnN0YXJ0RGF0ZSgpLCB0aGlzLmVuZERhdGUoKSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGRhdGVSYW5nZUZvckNhbGVuZGFyID0gY29tcHV0ZWQ8RGF0ZVJhbmdlPERhdGU+IHwgbnVsbD4oKCkgPT4ge1xuICAgIGlmICghdGhpcy5pc1N0YXJ0QW5kRW5kRGF0ZXNTZXQoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IFRlbXBvcmFsVXRpbC5nZXRKU0RhdGVGcm9tUGxhaW5EYXRlVGltZSh0aGlzLnN0YXJ0RGF0ZSgpKTtcbiAgICBjb25zdCBlbmREYXRlID0gVGVtcG9yYWxVdGlsLmdldEpTRGF0ZUZyb21QbGFpbkRhdGVUaW1lKHRoaXMuZW5kRGF0ZSgpKTtcbiAgICByZXR1cm4gbmV3IERhdGVSYW5nZShzdGFydERhdGUsIGVuZERhdGUpO1xuICB9KTtcblxuICByZWFkb25seSBkYXRlUmFuZ2VJbkRheXMgPSBjb21wdXRlZDxudW1iZXI+KCgpID0+IHtcbiAgICBpZiAoIXRoaXMuZGF0ZVJhbmdlKCkpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kYXRlUmFuZ2UoKS5nZXREdXJhdGlvbkluRGF5cygpO1xuICB9KTtcblxuICByZWFkb25seSBpc1N0YXJ0QW5kRW5kRGF0ZXNFbXB0eSA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICByZXR1cm4gIXRoaXMuc3RhcnREYXRlKCkgJiYgIXRoaXMuZW5kRGF0ZSgpO1xuICB9KTtcblxuICByZWFkb25seSBpc1N0YXJ0QW5kRW5kRGF0ZXNTZXQgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgcmV0dXJuICEhKHRoaXMuc3RhcnREYXRlKCkgJiYgdGhpcy5lbmREYXRlKCkpO1xuICB9KTtcblxuICByZWFkb25seSBpc1JhbmdlTm90U2V0ID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgIHJldHVybiAhdGhpcy5pc1N0YXJ0QW5kRW5kRGF0ZXNTZXQoKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgc3RhcnREYXRlVGltZSA9IGNvbXB1dGVkPFxuICAgIFRlbXBvcmFsLlBsYWluRGF0ZSB8IFRlbXBvcmFsLlBsYWluRGF0ZVRpbWVcbiAgPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RhcnRUaW1lKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXJ0RGF0ZSgpLnRvUGxhaW5EYXRlVGltZSh0aGlzLnN0YXJ0VGltZSgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhcnREYXRlKCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGVuZERhdGVUaW1lID0gY29tcHV0ZWQ8VGVtcG9yYWwuUGxhaW5EYXRlIHwgVGVtcG9yYWwuUGxhaW5EYXRlVGltZT4oXG4gICAgKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmVuZERhdGUoKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmVuZFRpbWUoKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmREYXRlKCkudG9QbGFpbkRhdGVUaW1lKHRoaXMuZW5kVGltZSgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmVuZERhdGUoKTtcbiAgICB9XG4gICk7XG5cbiAgcmVhZG9ubHkgc3RhcnREYXRlQXNKU0RhdGUgPSBjb21wdXRlZDxEYXRlIHwgbnVsbD4oKCkgPT4ge1xuICAgIGlmICghdGhpcy5zdGFydERhdGUoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBUZW1wb3JhbFV0aWwuZ2V0SlNEYXRlRnJvbVBsYWluRGF0ZVRpbWUodGhpcy5zdGFydERhdGUoKSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGVuZERhdGVBc0pTRGF0ZSA9IGNvbXB1dGVkPERhdGUgfCBudWxsPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmVuZERhdGUoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBUZW1wb3JhbFV0aWwuZ2V0SlNEYXRlRnJvbVBsYWluRGF0ZVRpbWUodGhpcy5lbmREYXRlKCkpO1xuICB9KTtcblxuICByZWFkb25seSBzdGFydERhdGVUaW1lQXNKU0RhdGUgPSBjb21wdXRlZDxEYXRlIHwgbnVsbD4oKCkgPT4ge1xuICAgIGlmICghdGhpcy5zdGFydERhdGVUaW1lKCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gVGVtcG9yYWxVdGlsLmdldEpTRGF0ZUZyb21QbGFpbkRhdGVUaW1lKHRoaXMuc3RhcnREYXRlVGltZSgpKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgZW5kRGF0ZVRpbWVBc0pTRGF0ZSA9IGNvbXB1dGVkPERhdGUgfCBudWxsPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmVuZERhdGVUaW1lKCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gVGVtcG9yYWxVdGlsLmdldEpTRGF0ZUZyb21QbGFpbkRhdGVUaW1lKHRoaXMuZW5kRGF0ZVRpbWUoKSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGdldENhbGVuZGFyV2VlayA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4ge1xuICAgIGlmICghdGhpcy5zdGFydERhdGUoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXJ0RGF0ZSgpLndlZWtPZlllYXI7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGlzRnVsbENhbGVuZGVyV2Vla1NlbGVjdGVkID0gY29tcHV0ZWQ8Ym9vbGVhbiB8IG51bWJlcj4oKCkgPT4ge1xuICAgIGlmICghdGhpcy5pc1N0YXJ0QW5kRW5kRGF0ZXNTZXQoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghVGVtcG9yYWxVdGlsLmlzRmlyc3REYXlPZldlZWsodGhpcy5zdGFydERhdGUoKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBkdXJhdGlvbiA9IHRoaXMuc3RhcnREYXRlKCkudW50aWwodGhpcy5lbmREYXRlKCkpO1xuXG4gICAgaWYgKGR1cmF0aW9uLmRheXMgIT09IDcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdGFydERhdGUoKS53ZWVrT2ZZZWFyO1xuICB9KTtcblxuICByZWFkb25seSB2aWV3SW50ZXJ2YWxNZXNzYWdlID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB7XG4gICAgaWYgKHRoaXMuaXNSYW5nZU5vdFNldCgpKSB7XG4gICAgICByZXR1cm4gJy0nO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAncXVhcnRlcnMnKSB7XG4gICAgICBjb25zdCBxdWFydGVyID0gVGVtcG9yYWxVdGlsLmdldFF1YXJ0ZXJGb3JEYXRlKHRoaXMuc3RhcnREYXRlKCkpO1xuICAgICAgcmV0dXJuIGBRJHtxdWFydGVyfSwgJHt0aGlzLnN0YXJ0RGF0ZSgpLnllYXJ9YDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgIGNvbnN0IG1vbnRoTmFtZSA9IHRoaXMuc3RhcnREYXRlKCkubW9udGg7XG4gICAgICByZXR1cm4gYDFtICgke21vbnRoTmFtZX0sICR7dGhpcy5zdGFydERhdGUoKS55ZWFyfSlgO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAneWVhcnMnKSB7XG4gICAgICBjb25zdCB5ZWFyID0gdGhpcy5zdGFydERhdGUoKS55ZWFyO1xuICAgICAgcmV0dXJuIGAxeSAoJHt5ZWFyfSlgO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAnd2Vla3MnKSB7XG4gICAgICByZXR1cm4gYDF3IChDVyAke3RoaXMuZ2V0Q2FsZW5kYXJXZWVrKCl9LCAke3RoaXMuZW5kRGF0ZSgpLnllYXJ9KWA7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICdkYXlzJykge1xuICAgICAgcmV0dXJuIGAke3RoaXMuZGF0ZVJhbmdlSW5EYXlzKCl9ZGA7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9KTtcblxuICByZWFkb25seSBkZWx0YUFzVGVtcG9yYWxEdXJhdGlvbiA9IGNvbXB1dGVkPFRlbXBvcmFsLkR1cmF0aW9uPigoKSA9PiB7XG4gICAgY29uc3Qgc3RhcnREYXRlVGltZSA9IHRoaXMuc3RhcnREYXRlVGltZSgpO1xuICAgIGNvbnN0IGVuZERhdGVUaW1lID0gdGhpcy5lbmREYXRlVGltZSgpO1xuXG4gICAgaWYgKCFzdGFydERhdGVUaW1lIHx8ICFlbmREYXRlVGltZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZHVyYXRpb24gPSBzdGFydERhdGVUaW1lLnVudGlsKGVuZERhdGVUaW1lKTtcbiAgICByZXR1cm4gZHVyYXRpb247XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGRlbHRhSHVtYW5SZWFkYWJsZSA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4ge1xuICAgIGlmICh0aGlzLmlzU3RhcnRBbmRFbmREYXRlc0VtcHR5KCkpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgY29uc3QgZHVyYXRpb24gPSB0aGlzLmRlbHRhQXNUZW1wb3JhbER1cmF0aW9uKCk7XG4gICAgaWYgKCFkdXJhdGlvbikge1xuICAgICAgcmV0dXJuICfiiJ4nO1xuICAgIH1cbiAgICBjb25zdCB0bXAgPSBbXTtcbiAgICBpZiAoZHVyYXRpb24uZGF5cykge1xuICAgICAgdG1wLnB1c2goYCR7ZHVyYXRpb24uZGF5c31kYCk7XG4gICAgfVxuICAgIGlmIChkdXJhdGlvbi5ob3Vycykge1xuICAgICAgdG1wLnB1c2goYCR7ZHVyYXRpb24uaG91cnN9aGApO1xuICAgIH1cbiAgICBpZiAoZHVyYXRpb24ubWludXRlcykge1xuICAgICAgdG1wLnB1c2goYCR7ZHVyYXRpb24ubWludXRlc31taW5gKTtcbiAgICB9XG4gICAgaWYgKGR1cmF0aW9uLnNlY29uZHMpIHtcbiAgICAgIHRtcC5wdXNoKGAke2R1cmF0aW9uLnNlY29uZHN9c2ApO1xuICAgIH1cblxuICAgIGlmICghdG1wLmxlbmd0aCkge1xuICAgICAgcmV0dXJuICcwcyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRtcC5qb2luKCcsICcpO1xuICB9KTtcblxuICByZWFkb25seSBnZXRTdGFydFRpbWVTdHJpbmcgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHtcbiAgICByZXR1cm4gVGVtcG9yYWxVdGlsLmdldEh0bWxUaW1lU3RyaW5nRnJvbVBsYWluVGltZSh0aGlzLnN0YXJ0VGltZSgpKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgZ2V0RW5kVGltZVN0cmluZyA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4ge1xuICAgIHJldHVybiBUZW1wb3JhbFV0aWwuZ2V0SHRtbFRpbWVTdHJpbmdGcm9tUGxhaW5UaW1lKHRoaXMuZW5kVGltZSgpKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgZ2V0QW5jaG9yVGltZVN0cmluZyA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4ge1xuICAgIHJldHVybiBUZW1wb3JhbFV0aWwuZ2V0SHRtbFRpbWVTdHJpbmdGcm9tUGxhaW5UaW1lKHRoaXMuZml4ZWRBbmNob3JUaW1lKCkpO1xuICB9KTtcblxuICByZWFkb25seSBnZXRBbmNob3JQb2ludEFzTG9jYWxlRGF0ZSA9IGNvbXB1dGVkPExvY2FsRGF0ZT4oKCkgPT4ge1xuICAgIGNvbnN0IGFuY2hvclBvaW50ID0gdGhpcy5maXhlZEFuY2hvckRhdGUoKTtcbiAgICBpZiAoIWFuY2hvclBvaW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QganNEYXRlID0gVGVtcG9yYWxVdGlsLmdldEpTRGF0ZUZyb21QbGFpbkRhdGVUaW1lKGFuY2hvclBvaW50KTtcbiAgICBjb25zdCBsb2NhbGVEYXRlID0gVGltZVV0aWwuZGF0ZVRvTG9jYWxEYXRlKGpzRGF0ZSk7XG4gICAgcmV0dXJuIGxvY2FsZURhdGU7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHN0YXJ0RGF0ZUh0bWxTdHJpbmcgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHtcbiAgICByZXR1cm4gVGVtcG9yYWxVdGlsLmdldEh0bWxEYXRlU3RyaW5nKHRoaXMuc3RhcnREYXRlVGltZSgpKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgZW5kRGF0ZUh0bWxTdHJpbmcgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHtcbiAgICByZXR1cm4gVGVtcG9yYWxVdGlsLmdldEh0bWxEYXRlU3RyaW5nKHRoaXMuZW5kRGF0ZVRpbWUoKSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGlzU3RhcnRUaW1lU2V0QW5kTm90TWlkbmlnaHQgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0VGltZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnN0YXJ0VGltZSgpLmhvdXIgIT09IDAgfHxcbiAgICAgIHRoaXMuc3RhcnRUaW1lKCkubWludXRlICE9PSAwIHx8XG4gICAgICB0aGlzLnN0YXJ0VGltZSgpLnNlY29uZCAhPT0gMFxuICAgICk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGlzRW5kVGltZVNldEFuZE5vdE1pZG5pZ2h0ID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgIGlmICghdGhpcy5lbmRUaW1lKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZW5kVGltZSgpLmhvdXIgIT09IDAgfHxcbiAgICAgIHRoaXMuZW5kVGltZSgpLm1pbnV0ZSAhPT0gMCB8fFxuICAgICAgdGhpcy5lbmRUaW1lKCkuc2Vjb25kICE9PSAwXG4gICAgKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgaXNGaXhlZEFuY2hvclRpbWVTZXRBbmROb3RNaWRuaWdodCA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICBpZiAoIXRoaXMuZml4ZWRBbmNob3JUaW1lKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZml4ZWRBbmNob3JUaW1lKCkuaG91ciAhPT0gMCB8fFxuICAgICAgdGhpcy5maXhlZEFuY2hvclRpbWUoKS5taW51dGUgIT09IDAgfHxcbiAgICAgIHRoaXMuZml4ZWRBbmNob3JUaW1lKCkuc2Vjb25kICE9PSAwXG4gICAgKTtcbiAgfSk7XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIFB1YmxpYyBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgc2V0U3RhcnREYXRlRnJvbUh0bWxTdHJpbmcoaHRtbFN0cmluZzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZGF0ZSA9IFRlbXBvcmFsVXRpbC5nZXRQbGFpbkRhdGVGcm9tSHRtbERhdGVTdHJpbmcoaHRtbFN0cmluZyk7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpO1xuICAgIHRoaXMuc3RhcnREYXRlLnNldChkYXRlKTtcbiAgfVxuXG4gIHNldEVuZERhdGVGcm9tSHRtbFN0cmluZyhodG1sU3RyaW5nOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRlID0gVGVtcG9yYWxVdGlsLmdldFBsYWluRGF0ZUZyb21IdG1sRGF0ZVN0cmluZyhodG1sU3RyaW5nKTtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCdkYXlzJyk7XG4gICAgdGhpcy5lbmREYXRlLnNldChkYXRlKTtcbiAgfVxuXG4gIHNldHVwSW5wdXRJbnRlcnZhbChzOiBTaWduYWw8SW50ZXJ2YWw+KTogdm9pZCB7XG4gICAgdGhpcy5faW5wdXRJbnRlcnZhbCA9IHM7XG4gIH1cblxuICBzZXR1cElucHV0QW5jaG9yRGF0ZVRpbWUoczogU2lnbmFsPERhdGU+KTogdm9pZCB7XG4gICAgdGhpcy5faW5wdXRBbmNob3JEYXRlVGltZSA9IHM7XG4gIH1cblxuICBzZXR1cEV2ZW50RW1pdHRlcihlOiBFdmVudEVtaXR0ZXI8SW50ZXJ2YWw+KTogdm9pZCB7XG4gICAgdGhpcy5fZGF0ZUNoYW5nZUVtaXR0ZXIgPSBlO1xuICB9XG5cbiAgc2V0U3RhcnRUaW1lRnJvbVN0cmluZyh0aW1lU3RyOiBzdHJpbmcsIGZvcm1Db250cm9sPzogYW55KTogdm9pZCB7XG4gICAgY29uc3QgdGltZSA9IFRlbXBvcmFsVXRpbC5nZXRQbGFpblRpbWVGcm9tSHRtbFRpbWVTdHJpbmcodGltZVN0cik7XG5cbiAgICBpZiAodGltZSkge1xuICAgICAgdGhpcy5zdGFydFRpbWUuc2V0KHRpbWUpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zdGFydERhdGUoKSkge1xuICAgICAgdGhpcy5zdGFydERhdGUuc2V0KFRlbXBvcmFsLk5vdy5wbGFpbkRhdGVJU08oKSk7XG4gICAgfVxuXG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCdkYXlzJyk7XG4gIH1cblxuICBzZXRFbmRUaW1lRnJvbVN0cmluZyh0aW1lU3RyOiBzdHJpbmcsIGZvcm1Db250cm9sPzogYW55KTogdm9pZCB7XG4gICAgY29uc3QgdGltZSA9IFRlbXBvcmFsVXRpbC5nZXRQbGFpblRpbWVGcm9tSHRtbFRpbWVTdHJpbmcodGltZVN0cik7XG5cbiAgICBpZiAodGltZSkge1xuICAgICAgdGhpcy5lbmRUaW1lLnNldCh0aW1lKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZW5kRGF0ZSgpKSB7XG4gICAgICB0aGlzLmVuZERhdGUuc2V0KFRlbXBvcmFsLk5vdy5wbGFpbkRhdGVJU08oKSk7XG4gICAgfVxuXG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCdkYXlzJyk7XG4gIH1cblxuICByZXNldENhbGVuZGFyTW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoZGVmYXVsdENhbGVuZGFyTW9kZSk7XG4gIH1cblxuICBwdWxsSW5wdXRJbnRlcnZhbCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lucHV0SW50ZXJ2YWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldERhdGVUaW1lc0Zyb21FbGRlckludGVydmFsKHRoaXMuX2lucHV0SW50ZXJ2YWwoKSk7XG4gIH1cblxuICBwdWxsSW5wdXRBbmNob3JEYXRlVGltZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lucHV0QW5jaG9yRGF0ZVRpbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldEFuY2hvckRhdGVUaW1lRnJvbUpzRGF0ZSh0aGlzLl9pbnB1dEFuY2hvckRhdGVUaW1lKCkpO1xuICB9XG5cbiAgc2V0RGF0ZVRpbWVzRnJvbUVsZGVySW50ZXJ2YWwoaW50ZXJ2YWw6IEludGVydmFsKTogdm9pZCB7XG4gICAgaWYgKCFpbnRlcnZhbCkge1xuICAgICAgdGhpcy5zdGFydERhdGUuc2V0KG51bGwpO1xuICAgICAgdGhpcy5lbmREYXRlLnNldChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaW50ZXJ2YWwuc3RhcnQpIHtcbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZUFzSlNEYXRlID0gVGltZVV0aWwuZGF0ZShpbnRlcnZhbC5zdGFydCk7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoXG4gICAgICAgIFRlbXBvcmFsVXRpbC5nZXRQbGFpbkRhdGVGcm9tSlNEYXRlKHN0YXJ0RGF0ZUFzSlNEYXRlKVxuICAgICAgKTtcbiAgICAgIHRoaXMuc3RhcnRUaW1lLnNldChcbiAgICAgICAgVGVtcG9yYWxVdGlsLmdldFBsYWluVGltZUZyb21KU0RhdGUoc3RhcnREYXRlQXNKU0RhdGUpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQobnVsbCk7XG4gICAgfVxuXG4gICAgaWYgKGludGVydmFsLmVuZCkge1xuICAgICAgY29uc3QgZW5kRGF0ZUFzSlNEYXRlID0gVGltZVV0aWwuZGF0ZShpbnRlcnZhbC5lbmQpO1xuICAgICAgdGhpcy5lbmREYXRlLnNldChUZW1wb3JhbFV0aWwuZ2V0UGxhaW5EYXRlRnJvbUpTRGF0ZShlbmREYXRlQXNKU0RhdGUpKTtcbiAgICAgIHRoaXMuZW5kVGltZS5zZXQoVGVtcG9yYWxVdGlsLmdldFBsYWluVGltZUZyb21KU0RhdGUoZW5kRGF0ZUFzSlNEYXRlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW5kRGF0ZS5zZXQobnVsbCk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2cuZGVidWcoYFB1bGxlZCBpbnB1dCBpbnRlcnZhbDpgLCBpbnRlcnZhbCk7XG4gIH1cblxuICBzZXRBbmNob3JEYXRlVGltZUZyb21Kc0RhdGUoZGF0ZVRpbWU6IERhdGUpOiB2b2lkIHtcbiAgICBpZiAoIWRhdGVUaW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRhdGUgPSBUZW1wb3JhbFV0aWwuZ2V0UGxhaW5EYXRlRnJvbUpTRGF0ZShkYXRlVGltZSk7XG4gICAgY29uc3QgdGltZSA9IFRlbXBvcmFsVXRpbC5nZXRQbGFpblRpbWVGcm9tSlNEYXRlKGRhdGVUaW1lKTtcbiAgICB0aGlzLmZpeGVkQW5jaG9yRGF0ZS5zZXQoZGF0ZSk7XG4gICAgdGhpcy5maXhlZEFuY2hvclRpbWUuc2V0KHRpbWUpO1xuICB9XG5cbiAgc2V0Rml4ZWRBbmNob3JQb2ludFRvU3RhcnREYXRlVGltZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3RhcnREYXRlKCkpIHtcbiAgICAgIHRoaXMucmVzZXRGaXhlZEFuY2hvclBvaW50KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICB0aGlzLmZpeGVkQW5jaG9yRGF0ZS5zZXQodGhpcy5zdGFydERhdGUoKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXJ0VGltZSgpKSB7XG4gICAgICB0aGlzLmZpeGVkQW5jaG9yVGltZS5zZXQodGhpcy5zdGFydFRpbWUoKSk7XG4gICAgfVxuICB9XG5cbiAgc2V0Rml4ZWRBbmNob3JQb2ludFRvRW5kRGF0ZVRpbWUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVuZERhdGUoKSkge1xuICAgICAgdGhpcy5yZXNldEZpeGVkQW5jaG9yUG9pbnQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZW5kRGF0ZSgpKSB7XG4gICAgICB0aGlzLmZpeGVkQW5jaG9yRGF0ZS5zZXQodGhpcy5lbmREYXRlKCkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5lbmRUaW1lKCkpIHtcbiAgICAgIHRoaXMuZml4ZWRBbmNob3JUaW1lLnNldCh0aGlzLmVuZFRpbWUoKSk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRGaXhlZEFuY2hvclBvaW50KCk6IHZvaWQge1xuICAgIHRoaXMuZml4ZWRBbmNob3JEYXRlLnNldChudWxsKTtcbiAgICB0aGlzLmZpeGVkQW5jaG9yVGltZS5zZXQoVGVtcG9yYWwuUGxhaW5UaW1lLmZyb20oJzAwOjAwJykpO1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNVcGRhdGluZ0ludGVydmFsT25BbmNob3JDaGFuZ2UoKSAmJlxuICAgICAgdGhpcy5pc1N0YXJ0QW5kRW5kRGF0ZXNTZXQoKVxuICAgICkge1xuICAgICAgdGhpcy5zaGlmdFJhbmdlRW5kVG9Ub2RheSgpO1xuICAgIH1cbiAgfVxuXG4gIHNldEFuY2hvckRhdGVGcm9tRm9ybShkYXRlQXJnOiBMb2NhbERhdGUpOiB2b2lkIHtcbiAgICBpZiAoIWRhdGVBcmcpIHtcbiAgICAgIHRoaXMuZml4ZWRBbmNob3JEYXRlLnNldChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBqc0RhdGUgPSBUaW1lVXRpbC5sb2NhbERhdGVUb0RhdGUoZGF0ZUFyZyk7XG4gICAgY29uc3QgcGxhaW5EYXRlID0gVGVtcG9yYWxVdGlsLmdldFBsYWluRGF0ZUZyb21KU0RhdGUoanNEYXRlKTtcblxuICAgIGlmICghcGxhaW5EYXRlKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKCdJbnZhbGlkIGRhdGUnLCBwbGFpbkRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZml4ZWRBbmNob3JEYXRlLnNldChwbGFpbkRhdGUpO1xuXG4gICAgaWYgKCF0aGlzLmlzVXBkYXRpbmdJbnRlcnZhbE9uQW5jaG9yQ2hhbmdlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5maXhlZEFuY2hvckRhdGUoKSkge1xuICAgICAgdGhpcy5zaGlmdFNlbGVjdGlvblRvQW5jaG9yRGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyU3RhcnREYXRlVGltZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQobnVsbCk7XG4gICAgdGhpcy5zdGFydFRpbWUuc2V0KG51bGwpO1xuICB9XG5cbiAgY2xlYXJFbmREYXRlVGltZSgpOiB2b2lkIHtcbiAgICB0aGlzLmVuZERhdGUuc2V0KG51bGwpO1xuICAgIHRoaXMuZW5kVGltZS5zZXQobnVsbCk7XG4gIH1cblxuICBjbGVhclN0YXJ0VGltZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0VGltZS5zZXQobnVsbCk7XG4gIH1cblxuICBjbGVhckVuZFRpbWUoKTogdm9pZCB7XG4gICAgdGhpcy5lbmRUaW1lLnNldChudWxsKTtcbiAgfVxuXG4gIHJlc2V0Rml4ZWRBbmNob3JUaW1lKCk6IHZvaWQge1xuICAgIHRoaXMuZml4ZWRBbmNob3JUaW1lLnNldChUZW1wb3JhbC5QbGFpblRpbWUuZnJvbSgnMDA6MDAnKSk7XG4gIH1cblxuICBzZXRBbmNob3JUaW1lRnJvbUZvcm0oaHRtbFN0cmluZzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdGltZSA9IFRlbXBvcmFsVXRpbC5nZXRQbGFpblRpbWVGcm9tSHRtbFRpbWVTdHJpbmcoaHRtbFN0cmluZyk7XG4gICAgaWYgKCF0aW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmZpeGVkQW5jaG9yRGF0ZSgpKSB7XG4gICAgICB0aGlzLmZpeGVkQW5jaG9yRGF0ZS5zZXQoVGVtcG9yYWwuTm93LnBsYWluRGF0ZUlTTygpKTtcbiAgICB9XG5cbiAgICB0aGlzLmZpeGVkQW5jaG9yVGltZS5zZXQodGltZSk7XG5cbiAgICBpZiAoIXRoaXMuaXNVcGRhdGluZ0ludGVydmFsT25BbmNob3JDaGFuZ2UoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZpeGVkQW5jaG9yVGltZSgpKSB7XG4gICAgICB0aGlzLnNoaWZ0U2VsZWN0aW9uVG9BbmNob3JUaW1lKCk7XG4gICAgfVxuICB9XG5cbiAgZW1pdE1haW5EYXRlcygpOiB2b2lkIHtcbiAgICBjb25zdCBpbnRlcnZhbCA9IHRoaXMuY3JlYXRlRWxkZXJJbnRlcnZhbCgpO1xuICAgIHRoaXMuX2RhdGVDaGFuZ2VFbWl0dGVyLmVtaXQoaW50ZXJ2YWwpO1xuICB9XG5cbiAgLy8gZGF0ZSBzaGlmdHNcbiAgc2hpZnREYXkoZGF5czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZSh0aGlzLmRhdGVSYW5nZSgpLnNoaWZ0RGF5cyhkYXlzKSk7XG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICd3ZWVrcycgJiYgKGRheXMgPT09IDcgfHwgZGF5cyA9PT0gLTcpKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoJ3dlZWtzJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpO1xuICB9XG5cbiAgc2hpZnRNb250aChtb250aHM6IG51bWJlciwgc3RhdGljTW9kZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZSh0aGlzLmRhdGVSYW5nZSgpLnNoaWZ0TW9udGhzKG1vbnRocykpO1xuICAgIGlmIChzdGF0aWNNb2RlICYmIHRoaXMuY2FsZW5kYXJNb2RlKCkgIT09ICdtb250aHMnKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoJ2RheXMnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpO1xuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnbW9udGhzJyk7XG4gIH1cblxuICBzaGlmdFllYXIoeWVhcnM6IG51bWJlciwgc3RhdGljTW9kZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZSh0aGlzLmRhdGVSYW5nZSgpLnNoaWZ0WWVhcnMoeWVhcnMpKTtcbiAgICBpZiAoc3RhdGljTW9kZSAmJiB0aGlzLmNhbGVuZGFyTW9kZSgpICE9PSAneWVhcnMnKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoJ2RheXMnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpO1xuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgneWVhcnMnKTtcbiAgfVxuXG4gIHNoaWZ0VGltZShhbW91bnQ6IG51bWJlciwgdW5pdDogJ2hvdXJzJyB8ICdtaW51dGVzJyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1N0YXJ0QW5kRW5kRGF0ZXNTZXQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1N0YXJ0RGF0ZVRpbWUgPSB0aGlzLnN0YXJ0RGF0ZVRpbWUoKS5hZGQoeyBbdW5pdF06IGFtb3VudCB9KTtcbiAgICBjb25zdCBuZXdFbmREYXRlVGltZSA9IHRoaXMuZW5kRGF0ZVRpbWUoKS5hZGQoeyBbdW5pdF06IGFtb3VudCB9KTtcblxuICAgIHRoaXMuc3RhcnREYXRlLnNldChUZW1wb3JhbC5QbGFpbkRhdGUuZnJvbShuZXdTdGFydERhdGVUaW1lKSk7XG4gICAgdGhpcy5zdGFydFRpbWUuc2V0KFxuICAgICAgVGVtcG9yYWwuUGxhaW5UaW1lLmZyb20obmV3U3RhcnREYXRlVGltZSBhcyBUZW1wb3JhbC5QbGFpbkRhdGVUaW1lKVxuICAgICk7XG5cbiAgICB0aGlzLmVuZERhdGUuc2V0KFRlbXBvcmFsLlBsYWluRGF0ZS5mcm9tKG5ld0VuZERhdGVUaW1lKSk7XG4gICAgdGhpcy5lbmRUaW1lLnNldChcbiAgICAgIFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKG5ld0VuZERhdGVUaW1lIGFzIFRlbXBvcmFsLlBsYWluRGF0ZVRpbWUpXG4gICAgKTtcbiAgfVxuXG4gIHNtYXJ0U2hpZnQoZGlyZWN0aW9uID0gMSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAncXVhcnRlcnMnKSB7XG4gICAgICBjb25zdCBuZXdSYW5nZSA9IHRoaXMuZGF0ZVJhbmdlKCkuc2hpZnRNb250aHMoZGlyZWN0aW9uICogMyk7XG4gICAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKG5ld1JhbmdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgIGNvbnN0IG5ld1JhbmdlID0gdGhpcy5kYXRlUmFuZ2UoKS5zaGlmdE1vbnRocyhkaXJlY3Rpb24pO1xuICAgICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShuZXdSYW5nZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICd5ZWFycycpIHtcbiAgICAgIGNvbnN0IG5ld1JhbmdlID0gdGhpcy5kYXRlUmFuZ2UoKS5zaGlmdFllYXJzKGRpcmVjdGlvbik7XG4gICAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKG5ld1JhbmdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ3dlZWtzJykge1xuICAgICAgY29uc3QgbmV3UmFuZ2UgPSB0aGlzLmRhdGVSYW5nZSgpLnNoaWZ0RGF5cyg3ICogZGlyZWN0aW9uKTtcbiAgICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UobmV3UmFuZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRheXNEaWZmID0gdGhpcy5kYXRlUmFuZ2UoKS5nZXREdXJhdGlvbkluRGF5cygpO1xuICAgIGNvbnN0IG5ld1JhbmdlID0gdGhpcy5kYXRlUmFuZ2UoKS5zaGlmdERheXMoZGF5c0RpZmYgKiBkaXJlY3Rpb24pO1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UobmV3UmFuZ2UpO1xuICB9XG5cbiAgLy8gdGltZSByYW5nZSBzZWxlY3Rpb25zXG4gIHNlbGVjdExhc3RIb3VyKCk6IHZvaWQge1xuICAgIHRoaXMucmVmcmVzaEJhc2VSZWZlcmVuY2VEYXRlVGltZSgpO1xuXG4gICAgY29uc3QgZW5kID0gdGhpcy5hbmNob3JEYXRlVGltZSgpO1xuICAgIGNvbnN0IHN0YXJ0ID0gZW5kLnN1YnRyYWN0KHsgaG91cnM6IDEgfSk7XG4gICAgdGhpcy5lbmREYXRlLnNldCh0aGlzLmFuY2hvckRhdGUoKSk7XG4gICAgdGhpcy5lbmRUaW1lLnNldCh0aGlzLmFuY2hvclRpbWUoKSk7XG5cbiAgICBjb25zdCBzdGFydFBsYWluRGF0ZSA9IFRlbXBvcmFsLlBsYWluRGF0ZS5mcm9tKHN0YXJ0KTtcbiAgICBjb25zdCBzdGFydFBsYWluVGltZSA9IFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKHN0YXJ0KTtcbiAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoc3RhcnRQbGFpbkRhdGUpO1xuICAgIHRoaXMuc3RhcnRUaW1lLnNldChzdGFydFBsYWluVGltZSk7XG5cbiAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoJ2RheXMnKTtcbiAgfVxuXG4gIHNlbGVjdExhc3QyNEhvdXJzKCk6IHZvaWQge1xuICAgIHRoaXMucmVmcmVzaEJhc2VSZWZlcmVuY2VEYXRlVGltZSgpO1xuXG4gICAgY29uc3QgZW5kID0gdGhpcy5hbmNob3JEYXRlVGltZSgpO1xuICAgIGNvbnN0IHN0YXJ0ID0gZW5kLnN1YnRyYWN0KHsgZGF5czogMSB9KTtcbiAgICB0aGlzLmVuZERhdGUuc2V0KHRoaXMuYW5jaG9yRGF0ZSgpKTtcbiAgICB0aGlzLmVuZFRpbWUuc2V0KHRoaXMuYW5jaG9yVGltZSgpKTtcblxuICAgIGNvbnN0IHN0YXJ0UGxhaW5EYXRlID0gVGVtcG9yYWwuUGxhaW5EYXRlLmZyb20oc3RhcnQpO1xuXG4gICAgY29uc3Qgc3RhcnRQbGFpblRpbWUgPSBUZW1wb3JhbC5QbGFpblRpbWUuZnJvbShzdGFydCk7XG4gICAgdGhpcy5zdGFydERhdGUuc2V0KHN0YXJ0UGxhaW5EYXRlKTtcbiAgICB0aGlzLnN0YXJ0VGltZS5zZXQoc3RhcnRQbGFpblRpbWUpO1xuXG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCdkYXlzJyk7XG4gIH1cblxuICBzZWxlY3RMYXN0Rml2ZU1pbnV0ZXMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWZyZXNoQmFzZVJlZmVyZW5jZURhdGVUaW1lKCk7XG5cbiAgICBjb25zdCBlbmQgPSB0aGlzLmFuY2hvckRhdGVUaW1lKCk7XG4gICAgY29uc3Qgc3RhcnQgPSBlbmQuc3VidHJhY3QoeyBtaW51dGVzOiA1IH0pO1xuICAgIHRoaXMuZW5kRGF0ZS5zZXQodGhpcy5hbmNob3JEYXRlKCkpO1xuICAgIHRoaXMuZW5kVGltZS5zZXQodGhpcy5hbmNob3JUaW1lKCkpO1xuXG4gICAgY29uc3Qgc3RhcnRQbGFpbkRhdGUgPSBUZW1wb3JhbC5QbGFpbkRhdGUuZnJvbShzdGFydCk7XG4gICAgY29uc3Qgc3RhcnRQbGFpblRpbWUgPSBUZW1wb3JhbC5QbGFpblRpbWUuZnJvbShzdGFydCk7XG4gICAgdGhpcy5zdGFydERhdGUuc2V0KHN0YXJ0UGxhaW5EYXRlKTtcbiAgICB0aGlzLnN0YXJ0VGltZS5zZXQoc3RhcnRQbGFpblRpbWUpO1xuXG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCdkYXlzJyk7XG4gIH1cblxuICAvLyBkYXRlIHJhbmdlIHNlbGVjdGlvbnNcbiAgc2VsZWN0Q3VycmVudERheSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKFRlbXBvcmFsVXRpbC5nZXRDdXJyZW50RGF5KHRoaXMuYW5jaG9yRGF0ZSgpKSk7XG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCdkYXlzJyk7XG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpO1xuICB9XG5cbiAgc2VsZWN0WWVzdGVyZGF5KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldFllc3RlcmRheSh0aGlzLmFuY2hvckRhdGUoKSkpO1xuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpO1xuICAgIHRoaXMucmVzZXRUaW1lUmFuZ2UoKTtcbiAgfVxuXG4gIHNlbGVjdEN1cnJlbnRXZWVrKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldEN1cnJlbnRXZWVrKHRoaXMuYW5jaG9yRGF0ZSgpKSk7XG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCd3ZWVrcycpO1xuICAgIHRoaXMucmVzZXRUaW1lUmFuZ2UoKTtcbiAgfVxuXG4gIHNlbGVjdFByZXZpb3VzV2VlaygpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKFRlbXBvcmFsVXRpbC5nZXRQcmV2aW91c1dlZWsodGhpcy5hbmNob3JEYXRlKCkpKTtcbiAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoJ3dlZWtzJyk7XG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpO1xuICB9XG5cbiAgc2VsZWN0TGFzdFNldmVuRGF5cygpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKFRlbXBvcmFsVXRpbC5nZXRMYXN0U2V2ZW5EYXlzKHRoaXMuYW5jaG9yRGF0ZSgpKSk7XG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCdkYXlzJyk7XG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpO1xuICB9XG5cbiAgc2VsZWN0Q3VycmVudE1vbnRoKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldEN1cnJlbnRNb250aCh0aGlzLmFuY2hvckRhdGUoKSkpO1xuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnbW9udGhzJyk7XG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpO1xuICB9XG5cbiAgc2VsZWN0UHJldmlvdXNNb250aCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKFRlbXBvcmFsVXRpbC5nZXRQcmV2aW91c01vbnRoKHRoaXMuYW5jaG9yRGF0ZSgpKSk7XG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCdtb250aHMnKTtcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKCk7XG4gIH1cblxuICBzZWxlY3RMYXN0VGhpcnR5RGF5cygpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKFRlbXBvcmFsVXRpbC5nZXRMYXN0VGhpcnR5RGF5cyh0aGlzLmFuY2hvckRhdGUoKSkpO1xuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgnZGF5cycpO1xuICAgIHRoaXMucmVzZXRUaW1lUmFuZ2UoKTtcbiAgfVxuXG4gIHNlbGVjdEN1cnJlbnRZZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldEN1cnJlbnRZZWFyKHRoaXMuYW5jaG9yRGF0ZSgpKSk7XG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCd5ZWFycycpO1xuICAgIHRoaXMucmVzZXRUaW1lUmFuZ2UoKTtcbiAgfVxuXG4gIHNlbGVjdFByZXZpb3VzWWVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKFRlbXBvcmFsVXRpbC5nZXRQcmV2aW91c1llYXIodGhpcy5hbmNob3JEYXRlKCkpKTtcbiAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoJ3llYXJzJyk7XG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpO1xuICB9XG5cbiAgc2VsZWN0TGFzdDM2NURheXMoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0TGFzdDM2NURheXModGhpcy5hbmNob3JEYXRlKCkpKTtcbiAgICB0aGlzLmNhbGVuZGFyTW9kZS5zZXQoJ2RheXMnKTtcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKCk7XG4gIH1cblxuICBzZWxlY3RDdXJyZW50UXVhcnRlcigpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKFRlbXBvcmFsVXRpbC5nZXRDdXJyZW50UXVhcnRlcih0aGlzLmFuY2hvckRhdGUoKSkpO1xuICAgIHRoaXMuY2FsZW5kYXJNb2RlLnNldCgncXVhcnRlcnMnKTtcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKCk7XG4gIH1cblxuICBzZWxlY3RQcmV2aW91c1F1YXJ0ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0UHJldmlvdXNRdWFydGVyKHRoaXMuYW5jaG9yRGF0ZSgpKSk7XG4gICAgdGhpcy5jYWxlbmRhck1vZGUuc2V0KCdxdWFydGVycycpO1xuICAgIHRoaXMucmVzZXRUaW1lUmFuZ2UoKTtcbiAgfVxuXG4gIC8vIEFuY2hvciBwb2ludCBzaGlmdCBzZWxlY3Rpb25zXG4gIHByaXZhdGUgc2hpZnRTZWxlY3Rpb25Ub0FuY2hvckRhdGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzU3RhcnRBbmRFbmREYXRlc1NldCgpIHx8ICF0aGlzLmZpeGVkQW5jaG9yRGF0ZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmFuZ2UgPSBuZXcgVGVtcG9yYWxQbGFpbkRhdGVJbnRlcnZhbChcbiAgICAgIHRoaXMuc3RhcnREYXRlKCksXG4gICAgICB0aGlzLmVuZERhdGUoKVxuICAgICk7XG4gICAgY29uc3QgZW5kRGF0ZSA9IHRoaXMuZml4ZWRBbmNob3JEYXRlKCk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gZW5kRGF0ZS5zdWJ0cmFjdCh7IGRheXM6IHJhbmdlLmdldER1cmF0aW9uSW5EYXlzKCkgfSk7XG4gICAgdGhpcy5zdGFydERhdGUuc2V0KHN0YXJ0RGF0ZSk7XG4gICAgdGhpcy5lbmREYXRlLnNldChlbmREYXRlKTtcblxuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAnbW9udGhzJykge1xuICAgICAgdGhpcy5zZWxlY3RDdXJyZW50TW9udGgoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICd5ZWFycycpIHtcbiAgICAgIHRoaXMuc2VsZWN0Q3VycmVudFllYXIoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICd3ZWVrcycpIHtcbiAgICAgIHRoaXMuc2VsZWN0Q3VycmVudFdlZWsoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNoaWZ0U2VsZWN0aW9uVG9BbmNob3JUaW1lKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1N0YXJ0QW5kRW5kRGF0ZXNTZXQoKSB8fCAhdGhpcy5maXhlZEFuY2hvclRpbWUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5zdGFydERhdGVUaW1lKCkudW50aWwodGhpcy5lbmREYXRlVGltZSgpKTtcbiAgICBjb25zdCBuZXdTdGFydERhdGVUaW1lID0gdGhpcy5hbmNob3JEYXRlVGltZSgpLnN1YnRyYWN0KGR1cmF0aW9uKTtcbiAgICBjb25zdCBuZXdFbmREYXRlVGltZSA9IHRoaXMuYW5jaG9yRGF0ZVRpbWUoKTtcbiAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoVGVtcG9yYWwuUGxhaW5EYXRlLmZyb20obmV3U3RhcnREYXRlVGltZSkpO1xuICAgIHRoaXMuc3RhcnRUaW1lLnNldChUZW1wb3JhbC5QbGFpblRpbWUuZnJvbShuZXdTdGFydERhdGVUaW1lKSk7XG4gICAgdGhpcy5lbmREYXRlLnNldChUZW1wb3JhbC5QbGFpbkRhdGUuZnJvbShuZXdFbmREYXRlVGltZSkpO1xuICAgIHRoaXMuZW5kVGltZS5zZXQoVGVtcG9yYWwuUGxhaW5UaW1lLmZyb20obmV3RW5kRGF0ZVRpbWUpKTtcblxuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAnbW9udGhzJykge1xuICAgICAgdGhpcy5zZWxlY3RDdXJyZW50TW9udGgoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICd5ZWFycycpIHtcbiAgICAgIHRoaXMuc2VsZWN0Q3VycmVudFllYXIoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICd3ZWVrcycpIHtcbiAgICAgIHRoaXMuc2VsZWN0Q3VycmVudFdlZWsoKTtcbiAgICB9XG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogUHJpdmF0ZSBtZXRob2RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIGNyZWF0ZUVsZGVySW50ZXJ2YWwoKTogSW50ZXJ2YWwge1xuICAgIGxldCBzdGFydCxcbiAgICAgIGVuZCA9IG51bGw7XG4gICAgaWYgKHRoaXMuc3RhcnREYXRlVGltZSgpKSB7XG4gICAgICBjb25zdCBqc0RhdGUgPSBUZW1wb3JhbFV0aWwuZ2V0SlNEYXRlRnJvbVBsYWluRGF0ZVRpbWUoXG4gICAgICAgIHRoaXMuc3RhcnREYXRlVGltZSgpXG4gICAgICApO1xuICAgICAgc3RhcnQgPSBUaW1lVXRpbC5pbnN0YW50KGpzRGF0ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmVuZERhdGVUaW1lKCkpIHtcbiAgICAgIGNvbnN0IGpzRGF0ZSA9IFRlbXBvcmFsVXRpbC5nZXRKU0RhdGVGcm9tUGxhaW5EYXRlVGltZShcbiAgICAgICAgdGhpcy5lbmREYXRlVGltZSgpXG4gICAgICApO1xuICAgICAgZW5kID0gVGltZVV0aWwuaW5zdGFudChqc0RhdGUpO1xuICAgIH1cbiAgICBpZiAoIXN0YXJ0ICYmICFlbmQpIHtcbiAgICAgIHJldHVybiBuZXcgSW50ZXJ2YWwobnVsbCwgbnVsbCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW50ZXJ2YWwoc3RhcnQsIGVuZCk7XG4gIH1cblxuICBwcml2YXRlIHNldERhdGVzRnJvbVJhbmdlKHJhbmdlOiBUZW1wb3JhbFBsYWluRGF0ZUludGVydmFsKTogdm9pZCB7XG4gICAgdGhpcy5zdGFydERhdGUuc2V0KHJhbmdlLnN0YXJ0KTtcbiAgICB0aGlzLmVuZERhdGUuc2V0KHJhbmdlLmVuZCk7XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hCYXNlUmVmZXJlbmNlRGF0ZVRpbWUoKTogdm9pZCB7XG4gICAgY29uc3QgZGF0ZVRpbWUgPSBUZW1wb3JhbC5Ob3cuem9uZWREYXRlVGltZUlTTygpO1xuICAgIGNvbnN0IGRhdGUgPSBUZW1wb3JhbC5QbGFpbkRhdGUuZnJvbShkYXRlVGltZSk7XG4gICAgY29uc3QgdGltZSA9IFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKGRhdGVUaW1lKTtcbiAgICB0aGlzLmJhc2VSZWZlcmVuY2VEYXRlLnNldChkYXRlKTtcbiAgICB0aGlzLmJhc2VSZWZlcmVuY2VUaW1lLnNldCh0aW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRUaW1lUmFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5zdGFydFRpbWUuc2V0KFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKCcwMDowMCcpKTtcbiAgICB0aGlzLmVuZFRpbWUuc2V0KFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKCcwMDowMCcpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hpZnRSYW5nZUVuZFRvVG9kYXkoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzU3RhcnRBbmRFbmREYXRlc1NldCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5zdGFydERhdGUoKS51bnRpbCh0aGlzLmVuZERhdGUoKSk7XG4gICAgdGhpcy5lbmREYXRlLnNldChUZW1wb3JhbC5Ob3cucGxhaW5EYXRlSVNPKCkpO1xuICAgIHRoaXMuc3RhcnREYXRlLnNldCh0aGlzLmVuZERhdGUoKS5zdWJ0cmFjdChkdXJhdGlvbikpO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIEVmZmVjdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSByZWFkb25seSBfYXV0b0VtaXRPbkRhdGVUaW1lc0NoYW5nZUVmZmVjdDogRWZmZWN0UmVmID0gZWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBzdGFydERhdGVUaW1lID0gdGhpcy5zdGFydERhdGVUaW1lKCk7XG4gICAgY29uc3QgZW5kRGF0ZVRpbWUgPSB0aGlzLmVuZERhdGVUaW1lKCk7XG5cbiAgICBpZiAodGhpcy5pc0VtaXR0aW5nT25DaGFuZ2UoKSkge1xuICAgICAgdGhpcy5lbWl0TWFpbkRhdGVzKCk7XG4gICAgfVxuICB9KTtcbn1cbiJdfQ==
|