@scion/workbench 18.0.0-beta.9 → 19.0.0-beta.1
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/design/_workbench-view-global-styles.scss +0 -1
- package/fesm2022/scion-workbench.mjs +8556 -8622
- package/fesm2022/scion-workbench.mjs.map +1 -1
- package/lib/common/css-class.util.d.ts +5 -0
- package/lib/common/math.util.d.ts +7 -0
- package/lib/common/objects.util.d.ts +1 -1
- package/lib/dialog/workbench-dialog.component.d.ts +1 -2
- package/lib/layout/migration/model/workbench-layout-migration-v6.model.d.ts +35 -0
- package/lib/layout/migration/workbench-layout-migration-v6.service.d.ts +12 -0
- package/lib/layout/workbench-layout.model.d.ts +0 -1
- package/lib/layout/workbench-layout.service.d.ts +10 -12
- package/lib/layout/workench-layout-serializer.service.d.ts +1 -2
- package/lib/part/part-action-bar/part-action-bar.component.d.ts +2 -6
- package/lib/part/part-bar/part-bar.component.d.ts +66 -48
- package/lib/part/view-tab/view-tab.component.d.ts +3 -3
- package/lib/public_api.d.ts +0 -2
- package/lib/routing/routing.util.d.ts +2 -2
- package/lib/view/view-move-handler.service.d.ts +16 -14
- package/lib/view/view.component.d.ts +1 -2
- package/lib/view//311/265workbench-view.model.d.ts +1 -9
- package/lib/view-dnd/grid-drop-targets.util.d.ts +1 -1
- package/lib/view-dnd/view-drag.service.d.ts +72 -49
- package/lib/view-dnd/view-tab-drag-image-renderer.service.d.ts +11 -36
- package/package.json +8 -10
- package/esm2022/lib/activation-instant.provider.mjs +0 -29
- package/esm2022/lib/common/animation-frame.observable.mjs +0 -37
- package/esm2022/lib/common/asserts.util.mjs +0 -31
- package/esm2022/lib/common/class-list.mjs +0 -99
- package/esm2022/lib/common/coerce-observable.pipe.mjs +0 -28
- package/esm2022/lib/common/disposable.mjs +0 -11
- package/esm2022/lib/common/dom.util.mjs +0 -100
- package/esm2022/lib/common/grid-element-if-visible.pipe.mjs +0 -32
- package/esm2022/lib/common/instanceof.pipe.mjs +0 -26
- package/esm2022/lib/common/map-coerce.pipe.mjs +0 -28
- package/esm2022/lib/common/null-if-empty.pipe.mjs +0 -38
- package/esm2022/lib/common/objects.util.mjs +0 -40
- package/esm2022/lib/common/observables.mjs +0 -72
- package/esm2022/lib/common/operators.mjs +0 -27
- package/esm2022/lib/common/public_api.mjs +0 -11
- package/esm2022/lib/common/stringify-error.util.mjs +0 -19
- package/esm2022/lib/common/throw-error.util.mjs +0 -16
- package/esm2022/lib/common/typeof.pipe.mjs +0 -26
- package/esm2022/lib/common/uid.util.mjs +0 -22
- package/esm2022/lib/common//311/265destroy-ref.mjs +0 -36
- package/esm2022/lib/communication/workbench-broadcast-channel.mjs +0 -38
- package/esm2022/lib/content-projection/content-as-overlay.component.mjs +0 -114
- package/esm2022/lib/content-projection/workbench-element-references.mjs +0 -32
- package/esm2022/lib/dialog/dialog-footer/dialog-action-filter.pipe.mjs +0 -26
- package/esm2022/lib/dialog/dialog-footer/dialog-footer.component.mjs +0 -34
- package/esm2022/lib/dialog/dialog-footer/workbench-dialog-action.directive.mjs +0 -51
- package/esm2022/lib/dialog/dialog-footer/workbench-dialog-footer.directive.mjs +0 -46
- package/esm2022/lib/dialog/dialog-header/dialog-header.component.mjs +0 -33
- package/esm2022/lib/dialog/dialog-header/workbench-dialog-header.directive.mjs +0 -46
- package/esm2022/lib/dialog/movable.directive.mjs +0 -126
- package/esm2022/lib/dialog/public_api.mjs +0 -15
- package/esm2022/lib/dialog/resizable.directive.mjs +0 -392
- package/esm2022/lib/dialog/workbench-dialog.component.mjs +0 -250
- package/esm2022/lib/dialog/workbench-dialog.mjs +0 -79
- package/esm2022/lib/dialog/workbench-dialog.options.mjs +0 -11
- package/esm2022/lib/dialog/workbench-dialog.registry.mjs +0 -73
- package/esm2022/lib/dialog/workbench-dialog.service.mjs +0 -96
- package/esm2022/lib/dialog//311/265workbench-dialog.mjs +0 -310
- package/esm2022/lib/dialog//311/265workbench-dialog.service.mjs +0 -98
- package/esm2022/lib/executor/latest-task-executor.mjs +0 -55
- package/esm2022/lib/executor/single-task-executor.mjs +0 -72
- package/esm2022/lib/filter-field/filter-field.component.mjs +0 -130
- package/esm2022/lib/glass-pane/blockable.mjs +0 -11
- package/esm2022/lib/glass-pane/blocking.mjs +0 -11
- package/esm2022/lib/glass-pane/glass-pane.directive.mjs +0 -120
- package/esm2022/lib/layout/grid-element/grid-element.component.mjs +0 -111
- package/esm2022/lib/layout/main-area-layout/main-area-layout.component.mjs +0 -97
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v2.model.mjs +0 -11
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v3.model.mjs +0 -11
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v4.model.mjs +0 -11
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v5.model.mjs +0 -11
- package/esm2022/lib/layout/migration/workbench-layout-migration-v3.service.mjs +0 -117
- package/esm2022/lib/layout/migration/workbench-layout-migration-v4.service.mjs +0 -57
- package/esm2022/lib/layout/migration/workbench-layout-migration-v5.service.mjs +0 -67
- package/esm2022/lib/layout/public_api.mjs +0 -12
- package/esm2022/lib/layout/stringifier.mjs +0 -70
- package/esm2022/lib/layout/workbench-layout.component.mjs +0 -90
- package/esm2022/lib/layout/workbench-layout.factory.mjs +0 -24
- package/esm2022/lib/layout/workbench-layout.mjs +0 -16
- package/esm2022/lib/layout/workbench-layout.model.mjs +0 -62
- package/esm2022/lib/layout/workbench-layout.service.mjs +0 -68
- package/esm2022/lib/layout/workbench-layouts.util.mjs +0 -58
- package/esm2022/lib/layout/workench-layout-serializer.service.mjs +0 -109
- package/esm2022/lib/layout//311/265workbench-layout.factory.mjs +0 -54
- package/esm2022/lib/layout//311/265workbench-layout.mjs +0 -876
- package/esm2022/lib/logging/console-appender.service.mjs +0 -46
- package/esm2022/lib/logging/index.mjs +0 -15
- package/esm2022/lib/logging/logger-names.mjs +0 -32
- package/esm2022/lib/logging/logger.mjs +0 -36
- package/esm2022/lib/logging/logging-support.mjs +0 -26
- package/esm2022/lib/logging/logging.model.mjs +0 -45
- package/esm2022/lib/logging/public_api.mjs +0 -12
- package/esm2022/lib/logging//311/265logger.mjs +0 -73
- package/esm2022/lib/message-box/message-box-footer/message-box-footer.component.mjs +0 -69
- package/esm2022/lib/message-box/message-box-header/message-box-header.component.mjs +0 -28
- package/esm2022/lib/message-box/public_api.mjs +0 -11
- package/esm2022/lib/message-box/workbench-message-box.component.mjs +0 -102
- package/esm2022/lib/message-box/workbench-message-box.options.mjs +0 -2
- package/esm2022/lib/message-box/workbench-message-box.service.mjs +0 -39
- package/esm2022/lib/message-box//311/265workbench-message-box.service.mjs +0 -45
- package/esm2022/lib/microfrontend-platform/common/microfrontend.util.mjs +0 -71
- package/esm2022/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.mjs +0 -126
- package/esm2022/lib/microfrontend-platform/initialization/ng-zone-observable-decorator.mjs +0 -36
- package/esm2022/lib/microfrontend-platform/initialization/workbench-host-manifest-interceptor.service.mjs +0 -84
- package/esm2022/lib/microfrontend-platform/manifest-object-cache.service.mjs +0 -63
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-capability-validator.interceptor.mjs +0 -54
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-intent-handler.interceptor.mjs +0 -85
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.mjs +0 -140
- package/esm2022/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.mjs +0 -133
- package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.mjs +0 -113
- package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.mjs +0 -43
- package/esm2022/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.mjs +0 -101
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-capability-validator.interceptor.mjs +0 -35
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-intent-handler.interceptor.mjs +0 -88
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-legacy-intent-translator.interceptor.mjs +0 -32
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box.component.mjs +0 -121
- package/esm2022/lib/microfrontend-platform/microfrontend-notification/microfrontend-notification-intent-handler.service.mjs +0 -45
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-capability-validator.interceptor.mjs +0 -39
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-installer.service.mjs +0 -120
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-intent-handler.interceptor.mjs +0 -55
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/workbench-perspective-data.mjs +0 -19
- package/esm2022/lib/microfrontend-platform/microfrontend-platform-config-loader.mjs +0 -13
- package/esm2022/lib/microfrontend-platform/microfrontend-platform.config.mjs +0 -11
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-capability-validator.interceptor.mjs +0 -31
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.mjs +0 -132
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.mjs +0 -115
- package/esm2022/lib/microfrontend-platform/microfrontend-splash/microfrontend-splash.component.mjs +0 -21
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.mjs +0 -112
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.mjs +0 -313
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-workbench-view.model.mjs +0 -23
- package/esm2022/lib/microfrontend-platform/public_api.mjs +0 -13
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.mjs +0 -31
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.mjs +0 -127
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-routes.mjs +0 -125
- package/esm2022/lib/microfrontend-platform/stable-capability-id-assigner.interceptor.mjs +0 -32
- package/esm2022/lib/microfrontend-platform/workbench-microfrontend-support.mjs +0 -191
- package/esm2022/lib/migration/workbench-migration.mjs +0 -11
- package/esm2022/lib/migration/workbench-migrator.mjs +0 -38
- package/esm2022/lib/notification/notification-css-classes.pipe.mjs +0 -24
- package/esm2022/lib/notification/notification-list.component.mjs +0 -51
- package/esm2022/lib/notification/notification.component.mjs +0 -109
- package/esm2022/lib/notification/notification.config.mjs +0 -11
- package/esm2022/lib/notification/notification.mjs +0 -19
- package/esm2022/lib/notification/notification.service.mjs +0 -134
- package/esm2022/lib/notification/public_api.mjs +0 -12
- package/esm2022/lib/notification/text-notification.component.mjs +0 -23
- package/esm2022/lib/notification//311/265notification.mjs +0 -42
- package/esm2022/lib/page-not-found/page-not-found.component.mjs +0 -26
- package/esm2022/lib/part/part-action-bar/part-action-bar.component.mjs +0 -31
- package/esm2022/lib/part/part-action-bar/part-action.directive.mjs +0 -77
- package/esm2022/lib/part/part-bar/part-bar.component.mjs +0 -444
- package/esm2022/lib/part/part-portal.pipe.mjs +0 -35
- package/esm2022/lib/part/part.component.mjs +0 -135
- package/esm2022/lib/part/public_api.mjs +0 -13
- package/esm2022/lib/part/view-context-menu/accelerator-format.pipe.mjs +0 -31
- package/esm2022/lib/part/view-context-menu/text.component.mjs +0 -38
- package/esm2022/lib/part/view-context-menu/view-menu.component.mjs +0 -89
- package/esm2022/lib/part/view-context-menu/view-menu.directive.mjs +0 -76
- package/esm2022/lib/part/view-context-menu/view-menu.service.mjs +0 -340
- package/esm2022/lib/part/view-list/view-list.component.mjs +0 -117
- package/esm2022/lib/part/view-list-button/view-list-button.component.mjs +0 -82
- package/esm2022/lib/part/view-list-item/view-list-item.component.mjs +0 -60
- package/esm2022/lib/part/view-tab/view-tab.component.mjs +0 -218
- package/esm2022/lib/part/view-tab-content/view-tab-content.component.mjs +0 -29
- package/esm2022/lib/part/view-tab-drag-image/view-tab-drag-image.component.mjs +0 -81
- package/esm2022/lib/part/workbench-part-action.registry.mjs +0 -23
- package/esm2022/lib/part/workbench-part.model.mjs +0 -19
- package/esm2022/lib/part/workbench-part.registry.mjs +0 -23
- package/esm2022/lib/part//311/265workbench-part.model.mjs +0 -146
- package/esm2022/lib/perspective/migration/model/workbench-perspective-migration-v1.model.mjs +0 -11
- package/esm2022/lib/perspective/migration/model/workbench-perspective-migration-v2.model.mjs +0 -11
- package/esm2022/lib/perspective/migration/workbench-perspective-migration-v2.service.mjs +0 -57
- package/esm2022/lib/perspective/public_api.mjs +0 -11
- package/esm2022/lib/perspective/workbench-grid-merger.service.mjs +0 -39
- package/esm2022/lib/perspective/workbench-perspective-storage.service.mjs +0 -72
- package/esm2022/lib/perspective/workbench-perspective-view-conflict-resolver.service.mjs +0 -50
- package/esm2022/lib/perspective/workbench-perspective.model.mjs +0 -2
- package/esm2022/lib/perspective/workbench-perspective.registry.mjs +0 -23
- package/esm2022/lib/perspective/workbench-perspective.service.mjs +0 -180
- package/esm2022/lib/perspective/workench-perspective-serializer.service.mjs +0 -62
- package/esm2022/lib/perspective//311/265workbench-perspective.model.mjs +0 -210
- package/esm2022/lib/popup/popup.component.mjs +0 -124
- package/esm2022/lib/popup/popup.config.mjs +0 -100
- package/esm2022/lib/popup/popup.origin.mjs +0 -11
- package/esm2022/lib/popup/popup.service.mjs +0 -339
- package/esm2022/lib/popup/public_api.mjs +0 -12
- package/esm2022/lib/portal/wb-component-portal.mjs +0 -130
- package/esm2022/lib/portal/workbench-portal-outlet.directive.mjs +0 -68
- package/esm2022/lib/public_api.mjs +0 -32
- package/esm2022/lib/registry/workbench-object-registry.mjs +0 -104
- package/esm2022/lib/routing/empty-outlet/empty-outlet.component.mjs +0 -31
- package/esm2022/lib/routing/public_api.mjs +0 -14
- package/esm2022/lib/routing/routing.model.mjs +0 -11
- package/esm2022/lib/routing/routing.util.mjs +0 -215
- package/esm2022/lib/routing/url-segment-matcher.mjs +0 -46
- package/esm2022/lib/routing/workbench-auxiliary-route-installer.service.mjs +0 -110
- package/esm2022/lib/routing/workbench-dialog-differ.mjs +0 -51
- package/esm2022/lib/routing/workbench-layout-differ.mjs +0 -61
- package/esm2022/lib/routing/workbench-message-box-differ.mjs +0 -51
- package/esm2022/lib/routing/workbench-navigational-states.mjs +0 -33
- package/esm2022/lib/routing/workbench-popup-differ.mjs +0 -51
- package/esm2022/lib/routing/workbench-route-data.mjs +0 -39
- package/esm2022/lib/routing/workbench-route-guards.mjs +0 -57
- package/esm2022/lib/routing/workbench-router-link.directive.mjs +0 -124
- package/esm2022/lib/routing/workbench-router.service.mjs +0 -19
- package/esm2022/lib/routing/workbench-url-observer.service.mjs +0 -305
- package/esm2022/lib/routing/workbench-view-outlet-differ.mjs +0 -58
- package/esm2022/lib/routing//311/265location.mjs +0 -70
- package/esm2022/lib/routing//311/265workbench-router.service.mjs +0 -359
- package/esm2022/lib/startup/public_api.mjs +0 -12
- package/esm2022/lib/startup/splash/splash.component.mjs +0 -24
- package/esm2022/lib/startup/workbench-initializer.mjs +0 -96
- package/esm2022/lib/startup/workbench-launcher.service.mjs +0 -173
- package/esm2022/lib/storage/public_api.mjs +0 -11
- package/esm2022/lib/storage/workbench-storage.mjs +0 -37
- package/esm2022/lib/testing/public_api.mjs +0 -12
- package/esm2022/lib/testing/workbench-testing.module.mjs +0 -49
- package/esm2022/lib/testing/workbench.provider.mjs +0 -60
- package/esm2022/lib/theme/workbench-theme-switcher.service.mjs +0 -72
- package/esm2022/lib/view/public_api.mjs +0 -11
- package/esm2022/lib/view/view-context-provider.mjs +0 -31
- package/esm2022/lib/view/view-move-handler.service.mjs +0 -145
- package/esm2022/lib/view/view-portal.pipe.mjs +0 -33
- package/esm2022/lib/view/view.component.mjs +0 -128
- package/esm2022/lib/view/workbench-view.model.mjs +0 -12
- package/esm2022/lib/view/workbench-view.registry.mjs +0 -23
- package/esm2022/lib/view//311/265workbench-view.model.mjs +0 -375
- package/esm2022/lib/view-dnd/grid-drop-targets.util.mjs +0 -49
- package/esm2022/lib/view-dnd/requires-drop-zone.pipe.mjs +0 -58
- package/esm2022/lib/view-dnd/view-drag.service.mjs +0 -213
- package/esm2022/lib/view-dnd/view-drop-placeholder-renderer.service.mjs +0 -89
- package/esm2022/lib/view-dnd/view-drop-zone.directive.mjs +0 -183
- package/esm2022/lib/view-dnd/view-tab-drag-image-renderer.service.mjs +0 -224
- package/esm2022/lib/workbench-config.mjs +0 -15
- package/esm2022/lib/workbench-id.mjs +0 -21
- package/esm2022/lib/workbench.component.mjs +0 -146
- package/esm2022/lib/workbench.constants.mjs +0 -41
- package/esm2022/lib/workbench.model.mjs +0 -11
- package/esm2022/lib/workbench.module.mjs +0 -101
- package/esm2022/lib/workbench.provider.mjs +0 -111
- package/esm2022/lib/workbench.service.mjs +0 -29
- package/esm2022/lib//311/265workbench.service.mjs +0 -102
- package/esm2022/public-api.mjs +0 -14
- package/esm2022/scion-workbench.mjs +0 -5
- package/lib/common/animation-frame.observable.d.ts +0 -10
- package/lib/testing/public_api.d.ts +0 -2
- package/lib/testing/workbench-testing.module.d.ts +0 -40
- package/lib/testing/workbench.provider.d.ts +0 -31
- package/lib/workbench.module.d.ts +0 -65
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2018-2022 Swiss Federal Railways
|
|
3
|
-
*
|
|
4
|
-
* This program and the accompanying materials are made
|
|
5
|
-
* available under the terms of the Eclipse Public License 2.0
|
|
6
|
-
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
7
|
-
*
|
|
8
|
-
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
-
*/
|
|
10
|
-
import { Injectable, NgZone } from '@angular/core';
|
|
11
|
-
import { BehaviorSubject, EMPTY, fromEvent, merge, Observable, of, zip } from 'rxjs';
|
|
12
|
-
import { filter, map, take } from 'rxjs/operators';
|
|
13
|
-
import { Arrays } from '@scion/toolkit/util';
|
|
14
|
-
import { WorkbenchBroadcastChannel } from '../communication/workbench-broadcast-channel';
|
|
15
|
-
import { observeIn, subscribeIn } from '@scion/toolkit/operators';
|
|
16
|
-
import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
|
|
17
|
-
import * as i0 from "@angular/core";
|
|
18
|
-
/**
|
|
19
|
-
* Transfer type for dragging a view.
|
|
20
|
-
*/
|
|
21
|
-
export const VIEW_DRAG_TRANSFER_TYPE = 'workbench/view';
|
|
22
|
-
/**
|
|
23
|
-
* Manages the drag & drop behavior when the user drags a view.
|
|
24
|
-
*/
|
|
25
|
-
export class ViewDragService {
|
|
26
|
-
constructor(_zone) {
|
|
27
|
-
this._zone = _zone;
|
|
28
|
-
/**
|
|
29
|
-
* Reference to the view drag data of the ongoing view drag operation, if any, or `null` otherwise.
|
|
30
|
-
*/
|
|
31
|
-
this._viewDragData = null;
|
|
32
|
-
this._viewDragStartBroadcastChannel = new WorkbenchBroadcastChannel('workbench/view/dragstart');
|
|
33
|
-
this._viewDragEndBroadcastChannel = new WorkbenchBroadcastChannel('workbench/view/dragend');
|
|
34
|
-
this._viewMoveBroadcastChannel = new WorkbenchBroadcastChannel('workbench/view/move');
|
|
35
|
-
this._tabbarDragOver$ = new BehaviorSubject(null);
|
|
36
|
-
/**
|
|
37
|
-
* Emits when the user starts dragging a viewtab. The event is received across app instances of the same origin.
|
|
38
|
-
*/
|
|
39
|
-
this.viewDragStart$ = this._viewDragStartBroadcastChannel.observe$;
|
|
40
|
-
/**
|
|
41
|
-
* Emits when the user ends dragging a viewtab. The event is received across app instances of the same origin.
|
|
42
|
-
*/
|
|
43
|
-
this.viewDragEnd$ = this._viewDragEndBroadcastChannel.observe$;
|
|
44
|
-
/**
|
|
45
|
-
* Emits when the user moves a view. The event is received across app instances of the same origin.
|
|
46
|
-
*/
|
|
47
|
-
this.viewMove$ = this._viewMoveBroadcastChannel.observe$;
|
|
48
|
-
/**
|
|
49
|
-
* Emits the identity of the part when the user is dragging a view over its tabbar, or `null` if not dragging over a tabbar.
|
|
50
|
-
* The event is NOT received across app instances.
|
|
51
|
-
*
|
|
52
|
-
* Upon subscription, emits the current state, and then each time the state changes. The observable never completes.
|
|
53
|
-
*/
|
|
54
|
-
this.tabbarDragOver$ = this._tabbarDragOver$;
|
|
55
|
-
/**
|
|
56
|
-
* Indicates if a drag operation is in progress.
|
|
57
|
-
*/
|
|
58
|
-
this.dragging = toSignal(merge(this.viewDragStart$.pipe(map(() => true)), this.viewDragEnd$.pipe(map(() => false))), { initialValue: false });
|
|
59
|
-
this.viewDragStart$
|
|
60
|
-
.pipe(takeUntilDestroyed())
|
|
61
|
-
.subscribe(viewDragData => {
|
|
62
|
-
this._viewDragData = viewDragData;
|
|
63
|
-
});
|
|
64
|
-
this.viewDragEnd$
|
|
65
|
-
.pipe(takeUntilDestroyed())
|
|
66
|
-
.subscribe(() => {
|
|
67
|
-
this._viewDragData = null;
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Set when dragging a view over specified tabbar.
|
|
72
|
-
*/
|
|
73
|
-
setTabbarDragover(partId) {
|
|
74
|
-
this._tabbarDragOver$.next(partId);
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Unset when not dragging a view over specified tabbar anymore.
|
|
78
|
-
*/
|
|
79
|
-
unsetTabbarDragover(partId) {
|
|
80
|
-
if (this._tabbarDragOver$.value === partId) {
|
|
81
|
-
this._tabbarDragOver$.next(null);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Indicates if dragging a view tab over a tabbar.
|
|
86
|
-
*
|
|
87
|
-
* Returns the identity of the part if the user is dragging a view over its tabbar, or `null` if not dragging over a tabbar.
|
|
88
|
-
*/
|
|
89
|
-
get isDragOverTabbar() {
|
|
90
|
-
return this._tabbarDragOver$.value;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Checks if the given event is a view drag event with the same origin.
|
|
94
|
-
*/
|
|
95
|
-
isViewDragEvent(event) {
|
|
96
|
-
return !!event.dataTransfer && event.dataTransfer.types.includes(VIEW_DRAG_TRANSFER_TYPE) && this.viewDragData !== null;
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Listens for same-origin view drag events on the given target element.
|
|
100
|
-
*
|
|
101
|
-
* Unlike when installing a "native" event handler for `dragenter` and/or `dragleave` events,
|
|
102
|
-
* this observable does not emit when dragging over child elements of the target element.
|
|
103
|
-
*
|
|
104
|
-
* Following drag events are emitted:
|
|
105
|
-
* - dragstart: when start dragging a view tab
|
|
106
|
-
* - dragend: when end dragging a view tab
|
|
107
|
-
* - dragenter: when entering the target element while dragging a view tab
|
|
108
|
-
* - dragover: when dragging a view tab over the target element, every few hundred milliseconds
|
|
109
|
-
* - dragleave: when leaving the target element while dragging a view tab
|
|
110
|
-
* - drop: when dropping a view tab on a valid drop target
|
|
111
|
-
*
|
|
112
|
-
* As by design of native drag and drop, the `dragleave` event is not fired on drop action.
|
|
113
|
-
* Therefore, always handle both events, `dragleave` and `drop` events, respectively.
|
|
114
|
-
*
|
|
115
|
-
* @param target - Specifies the element on which to subscribe for drag events.
|
|
116
|
-
* @param options - Controls how to subscribe for drag events.
|
|
117
|
-
* @param options.eventType - Filters for specified drag events; defaults to any event.
|
|
118
|
-
* @param options.capture - Controls whether to subscribe for drag events in the capturing phase; defaults to `false`, i.e., `bubbling` phase.
|
|
119
|
-
*/
|
|
120
|
-
viewDrag$(target, options) {
|
|
121
|
-
const filteredEventTypes = new Set(Arrays.coerce(options?.eventType));
|
|
122
|
-
const isViewDragEvent = this.isViewDragEvent.bind(this);
|
|
123
|
-
return new Observable((observer) => {
|
|
124
|
-
const insideAngular = NgZone.isInAngularZone();
|
|
125
|
-
const subscription = merge(shouldSubscribe('dragstart') ? dragstart$() : EMPTY, shouldSubscribe('dragend') ? dragend$() : EMPTY, shouldSubscribe('dragover') ? dragover$() : EMPTY, shouldSubscribe('dragenter') || shouldSubscribe('dragleave') || shouldSubscribe('drop') ? dragenterOrDragleaveOrDrop$() : EMPTY)
|
|
126
|
-
.pipe(subscribeIn(fn => this._zone.runOutsideAngular(fn)), observeIn(fn => insideAngular ? this._zone.run(fn) : this._zone.runOutsideAngular(fn)))
|
|
127
|
-
.subscribe(observer);
|
|
128
|
-
return () => subscription.unsubscribe();
|
|
129
|
-
});
|
|
130
|
-
function dragstart$() {
|
|
131
|
-
return fromEvent(target, 'dragstart', options ?? {})
|
|
132
|
-
.pipe(filter(event => isViewDragEvent(event)));
|
|
133
|
-
}
|
|
134
|
-
function dragend$() {
|
|
135
|
-
// The `dragend` event does not contain a drag transfer type. To still filter view-related `dragend` events,
|
|
136
|
-
// we combine `dragstart` and `dragend` events, i.e., when a view-related `dragstart` event occurs, we expect
|
|
137
|
-
// the next `dragend` event to be view-related.
|
|
138
|
-
return zip(fromEvent(target, 'dragstart', options ?? {}).pipe(filter(event => isViewDragEvent(event))), fromEvent(target, 'dragend', options ?? {})).pipe(map(([_, dragendEvent]) => dragendEvent));
|
|
139
|
-
}
|
|
140
|
-
function dragover$() {
|
|
141
|
-
return fromEvent(target, 'dragover', options ?? {})
|
|
142
|
-
.pipe(filter(event => isViewDragEvent(event)));
|
|
143
|
-
}
|
|
144
|
-
function dragenterOrDragleaveOrDrop$() {
|
|
145
|
-
// We emit `dragenter` only when entering the target element (or any child element) for the first time
|
|
146
|
-
// and only again after entering it again. The same applies for `dragleave`.
|
|
147
|
-
let dragEnterCount = 0;
|
|
148
|
-
return merge(fromEvent(target, 'dragenter', options ?? {}), fromEvent(target, 'dragleave', options ?? {}), fromEvent(target, 'drop', options ?? {}))
|
|
149
|
-
.pipe(filter(event => isViewDragEvent(event)), filter((event) => {
|
|
150
|
-
switch (event.type) {
|
|
151
|
-
case 'dragenter': {
|
|
152
|
-
return (++dragEnterCount === 1);
|
|
153
|
-
}
|
|
154
|
-
case 'dragleave':
|
|
155
|
-
case 'drop': {
|
|
156
|
-
return (--dragEnterCount === 0);
|
|
157
|
-
}
|
|
158
|
-
default:
|
|
159
|
-
return true;
|
|
160
|
-
}
|
|
161
|
-
}), filter(event => shouldSubscribe(event.type)));
|
|
162
|
-
}
|
|
163
|
-
function shouldSubscribe(eventType) {
|
|
164
|
-
return !filteredEventTypes.size || filteredEventTypes.has(eventType);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Dispatches the given view move event to app instances of the same origin.
|
|
169
|
-
*/
|
|
170
|
-
dispatchViewMoveEvent(event) {
|
|
171
|
-
// Wait to dispatch the event until the drag operation finished, if any, because if the drag source element
|
|
172
|
-
// is destroyed during the drag operation, e.g. if moved to another part, the drag operation would not
|
|
173
|
-
// ordinarily complete, meaning 'dragend' or 'dragleave' would not be called.
|
|
174
|
-
const isDragging = this.viewDragData !== null;
|
|
175
|
-
(isDragging ? this.viewDragEnd$ : of(undefined))
|
|
176
|
-
.pipe(take(1))
|
|
177
|
-
.subscribe(() => this._viewMoveBroadcastChannel.postMessage(event));
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Makes the given view drag data available to app instances of the same origin.
|
|
181
|
-
*
|
|
182
|
-
* Invoke this method inside 'dragstart' event handler of the element where the drag operation started.
|
|
183
|
-
*/
|
|
184
|
-
setViewDragData(viewDragData) {
|
|
185
|
-
this._viewDragStartBroadcastChannel.postMessage(viewDragData);
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Removes the view drag data.
|
|
189
|
-
*
|
|
190
|
-
* Invoke this method inside 'dragend' event handler of the element where the drag operation started.
|
|
191
|
-
*/
|
|
192
|
-
unsetViewDragData() {
|
|
193
|
-
this._viewDragEndBroadcastChannel.postMessage();
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Returns the view drag data of the ongoing view drag operation or `null` if no drag operation is in progress.
|
|
197
|
-
*/
|
|
198
|
-
get viewDragData() {
|
|
199
|
-
return this._viewDragData;
|
|
200
|
-
}
|
|
201
|
-
ngOnDestroy() {
|
|
202
|
-
this._viewMoveBroadcastChannel.destroy();
|
|
203
|
-
this._viewDragStartBroadcastChannel.destroy();
|
|
204
|
-
this._viewDragEndBroadcastChannel.destroy();
|
|
205
|
-
}
|
|
206
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewDragService, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
207
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewDragService, providedIn: 'root' }); }
|
|
208
|
-
}
|
|
209
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewDragService, decorators: [{
|
|
210
|
-
type: Injectable,
|
|
211
|
-
args: [{ providedIn: 'root' }]
|
|
212
|
-
}], ctorParameters: () => [{ type: i0.NgZone }] });
|
|
213
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy1kcmFnLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi92aWV3LWRuZC92aWV3LWRyYWcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQzVELE9BQU8sRUFBQyxlQUFlLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFZLEVBQUUsRUFBaUIsR0FBRyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzVHLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUUzQyxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSw4Q0FBOEMsQ0FBQztBQUN2RixPQUFPLEVBQUMsU0FBUyxFQUFFLFdBQVcsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxRQUFRLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQzs7QUFTeEU7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUV4RDs7R0FFRztBQUVILE1BQU0sT0FBTyxlQUFlO0lBMEMxQixZQUFvQixLQUFhO1FBQWIsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQXhDakM7O1dBRUc7UUFDSyxrQkFBYSxHQUF3QixJQUFJLENBQUM7UUFDMUMsbUNBQThCLEdBQUcsSUFBSSx5QkFBeUIsQ0FBZSwwQkFBMEIsQ0FBQyxDQUFDO1FBQ3pHLGlDQUE0QixHQUFHLElBQUkseUJBQXlCLENBQU8sd0JBQXdCLENBQUMsQ0FBQztRQUM3Riw4QkFBeUIsR0FBRyxJ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QUVEOztPQUVHO0lBQ0gsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM5QyxDQUFDOzhHQWxPVSxlQUFlO2tIQUFmLGVBQWUsY0FESCxNQUFNOzsyRkFDbEIsZUFBZTtrQkFEM0IsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjIgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7SW5qZWN0YWJsZSwgTmdab25lLCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIEVNUFRZLCBmcm9tRXZlbnQsIG1lcmdlLCBPYnNlcnZhYmxlLCBPYnNlcnZlciwgb2YsIFRlYXJkb3duTG9naWMsIHppcH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZpbHRlciwgbWFwLCB0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0FycmF5c30gZnJvbSAnQHNjaW9uL3Rvb2xraXQvdXRpbCc7XG5pbXBvcnQge1VybFNlZ21lbnR9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1dvcmtiZW5jaEJyb2FkY2FzdENoYW5uZWx9IGZyb20gJy4uL2NvbW11bmljYXRpb24vd29ya2JlbmNoLWJyb2FkY2FzdC1jaGFubmVsJztcbmltcG9ydCB7b2JzZXJ2ZUluLCBzdWJzY3JpYmVJbn0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvb3BlcmF0b3JzJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkLCB0b1NpZ25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtWaWV3SWR9IGZyb20gJy4uL3ZpZXcvd29ya2JlbmNoLXZpZXcubW9kZWwnO1xuaW1wb3J0IHtDbGFzc0xpc3RNYXB9IGZyb20gJy4uL2NvbW1vbi9jbGFzcy1saXN0JztcbmltcG9ydCB7TmF2aWdhdGlvbkRhdGF9IGZyb20gJy4uL3JvdXRpbmcvcm91dGluZy5tb2RlbCc7XG5cbi8qKlxuICogRXZlbnRzIGZpcmVkIGR1cmluZyB2aWV3IGRyYWcgYW5kIGRyb3Agb3BlcmF0aW9uLlxuICovXG5leHBvcnQgdHlwZSBWaWV3RHJhZ0V2ZW50VHlwZSA9ICdkcmFnc3RhcnQnIHwgJ2RyYWdlbmQnIHwgJ2RyYWdlbnRlcicgfCAnZHJhZ292ZXInIHwgJ2RyYWdsZWF2ZScgfCAnZHJvcCc7XG4vKipcbiAqIFRyYW5zZmVyIHR5cGUgZm9yIGRyYWdnaW5nIGEgdmlldy5cbiAqL1xuZXhwb3J0IGNvbnN0IFZJRVdfRFJBR19UUkFOU0ZFUl9UWVBFID0gJ3dvcmtiZW5jaC92aWV3JztcblxuLyoqXG4gKiBNYW5hZ2VzIHRoZSBkcmFnICYgZHJvcCBiZWhhdmlvciB3aGVuIHRoZSB1c2VyIGRyYWdzIGEgdmlldy5cbiAqL1xuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgVmlld0RyYWdTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSB2aWV3IGRyYWcgZGF0YSBvZiB0aGUgb25nb2luZyB2aWV3IGRyYWcgb3BlcmF0aW9uLCBpZiBhbnksIG9yIGBudWxsYCBvdGhlcndpc2UuXG4gICAqL1xuICBwcml2YXRlIF92aWV3RHJhZ0RhdGE6IFZpZXdEcmFnRGF0YSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF92aWV3RHJhZ1N0YXJ0QnJvYWRjYXN0Q2hhbm5lbCA9IG5ldyBXb3JrYmVuY2hCcm9hZGNhc3RDaGFubmVsPFZpZXdEcmFnRGF0YT4oJ3dvcmtiZW5jaC92aWV3L2RyYWdzdGFydCcpO1xuICBwcml2YXRlIF92aWV3RHJhZ0VuZEJyb2FkY2FzdENoYW5uZWwgPSBuZXcgV29ya2JlbmNoQnJvYWRjYXN0Q2hhbm5lbDx2b2lkPignd29ya2JlbmNoL3ZpZXcvZHJhZ2VuZCcpO1xuICBwcml2YXRlIF92aWV3TW92ZUJyb2FkY2FzdENoYW5uZWwgPSBuZXcgV29ya2JlbmNoQnJvYWRjYXN0Q2hhbm5lbDxWaWV3TW92ZUV2ZW50Pignd29ya2JlbmNoL3ZpZXcvbW92ZScpO1xuICBwcml2YXRlIF90YWJiYXJEcmFnT3ZlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyAvKiBwYXJ0SWQgKi8gfCBudWxsPihudWxsKTtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiB0aGUgdXNlciBzdGFydHMgZHJhZ2dpbmcgYSB2aWV3dGFiLiBUaGUgZXZlbnQgaXMgcmVjZWl2ZWQgYWNyb3NzIGFwcCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgb3JpZ2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZpZXdEcmFnU3RhcnQkOiBPYnNlcnZhYmxlPFZpZXdEcmFnRGF0YT4gPSB0aGlzLl92aWV3RHJhZ1N0YXJ0QnJvYWRjYXN0Q2hhbm5lbC5vYnNlcnZlJDtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiB0aGUgdXNlciBlbmRzIGRyYWdnaW5nIGEgdmlld3RhYi4gVGhlIGV2ZW50IGlzIHJlY2VpdmVkIGFjcm9zcyBhcHAgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG9yaWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2aWV3RHJhZ0VuZCQ6IE9ic2VydmFibGU8dm9pZD4gPSB0aGlzLl92aWV3RHJhZ0VuZEJyb2FkY2FzdENoYW5uZWwub2JzZXJ2ZSQ7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gdGhlIHVzZXIgbW92ZXMgYSB2aWV3LiBUaGUgZXZlbnQgaXMgcmVjZWl2ZWQgYWNyb3NzIGFwcCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgb3JpZ2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZpZXdNb3ZlJDogT2JzZXJ2YWJsZTxWaWV3TW92ZUV2ZW50PiA9IHRoaXMuX3ZpZXdNb3ZlQnJvYWRjYXN0Q2hhbm5lbC5vYnNlcnZlJDtcblxuICAvKipcbiAgICogRW1pdHMgdGhlIGlkZW50aXR5IG9mIHRoZSBwYXJ0IHdoZW4gdGhlIHVzZXIgaXMgZHJhZ2dpbmcgYSB2aWV3IG92ZXIgaXRzIHRhYmJhciwgb3IgYG51bGxgIGlmIG5vdCBkcmFnZ2luZyBvdmVyIGEgdGFiYmFyLlxuICAgKiBUaGUgZXZlbnQgaXMgTk9UIHJlY2VpdmVkIGFjcm9zcyBhcHAgaW5zdGFuY2VzLlxuICAgKlxuICAgKiBVcG9uIHN1YnNjcmlwdGlvbiwgZW1pdHMgdGhlIGN1cnJlbnQgc3RhdGUsIGFuZCB0aGVuIGVhY2ggdGltZSB0aGUgc3RhdGUgY2hhbmdlcy4gVGhlIG9ic2VydmFibGUgbmV2ZXIgY29tcGxldGVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhYmJhckRyYWdPdmVyJDogT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPiA9IHRoaXMuX3RhYmJhckRyYWdPdmVyJDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIGEgZHJhZyBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZHJhZ2dpbmcgPSB0b1NpZ25hbChtZXJnZShcbiAgICB0aGlzLnZpZXdEcmFnU3RhcnQkLnBpcGUobWFwKCgpID0+IHRydWUpKSxcbiAgICB0aGlzLnZpZXdEcmFnRW5kJC5waXBlKG1hcCgoKSA9PiBmYWxzZSkpLFxuICApLCB7aW5pdGlhbFZhbHVlOiBmYWxzZX0pO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3pvbmU6IE5nWm9uZSkge1xuICAgIHRoaXMudmlld0RyYWdTdGFydCRcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgLnN1YnNjcmliZSh2aWV3RHJhZ0RhdGEgPT4ge1xuICAgICAgICB0aGlzLl92aWV3RHJhZ0RhdGEgPSB2aWV3RHJhZ0RhdGE7XG4gICAgICB9KTtcbiAgICB0aGlzLnZpZXdEcmFnRW5kJFxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fdmlld0RyYWdEYXRhID0gbnVsbDtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB3aGVuIGRyYWdnaW5nIGEgdmlldyBvdmVyIHNwZWNpZmllZCB0YWJiYXIuXG4gICAqL1xuICBwdWJsaWMgc2V0VGFiYmFyRHJhZ292ZXIocGFydElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl90YWJiYXJEcmFnT3ZlciQubmV4dChwYXJ0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuc2V0IHdoZW4gbm90IGRyYWdnaW5nIGEgdmlldyBvdmVyIHNwZWNpZmllZCB0YWJiYXIgYW55bW9yZS5cbiAgICovXG4gIHB1YmxpYyB1bnNldFRhYmJhckRyYWdvdmVyKHBhcnRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3RhYmJhckRyYWdPdmVyJC52YWx1ZSA9PT0gcGFydElkKSB7XG4gICAgICB0aGlzLl90YWJiYXJEcmFnT3ZlciQubmV4dChudWxsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIGRyYWdnaW5nIGEgdmlldyB0YWIgb3ZlciBhIHRhYmJhci5cbiAgICpcbiAgICogUmV0dXJucyB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhcnQgaWYgdGhlIHVzZXIgaXMgZHJhZ2dpbmcgYSB2aWV3IG92ZXIgaXRzIHRhYmJhciwgb3IgYG51bGxgIGlmIG5vdCBkcmFnZ2luZyBvdmVyIGEgdGFiYmFyLlxuICAgKi9cbiAgcHVibGljIGdldCBpc0RyYWdPdmVyVGFiYmFyKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl90YWJiYXJEcmFnT3ZlciQudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBldmVudCBpcyBhIHZpZXcgZHJhZyBldmVudCB3aXRoIHRoZSBzYW1lIG9yaWdpbi5cbiAgICovXG4gIHB1YmxpYyBpc1ZpZXdEcmFnRXZlbnQoZXZlbnQ6IERyYWdFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWV2ZW50LmRhdGFUcmFuc2ZlciAmJiBldmVudC5kYXRhVHJhbnNmZXIudHlwZXMuaW5jbHVkZXMoVklFV19EUkFHX1RSQU5TRkVSX1RZUEUpICYmIHRoaXMudmlld0RyYWdEYXRhICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbnMgZm9yIHNhbWUtb3JpZ2luIHZpZXcgZHJhZyBldmVudHMgb24gdGhlIGdpdmVuIHRhcmdldCBlbGVtZW50LlxuICAgKlxuICAgKiBVbmxpa2Ugd2hlbiBpbnN0YWxsaW5nIGEgXCJuYXRpdmVcIiBldmVudCBoYW5kbGVyIGZvciBgZHJhZ2VudGVyYCBhbmQvb3IgYGRyYWdsZWF2ZWAgZXZlbnRzLFxuICAgKiB0aGlzIG9ic2VydmFibGUgZG9lcyBub3QgZW1pdCB3aGVuIGRyYWdnaW5nIG92ZXIgY2hpbGQgZWxlbWVudHMgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxuICAgKlxuICAgKiBGb2xsb3dpbmcgZHJhZyBldmVudHMgYXJlIGVtaXR0ZWQ6XG4gICAqIC0gZHJhZ3N0YXJ0OiB3aGVuIHN0YXJ0IGRyYWdnaW5nIGEgdmlldyB0YWJcbiAgICogLSBkcmFnZW5kOiB3aGVuIGVuZCBkcmFnZ2luZyBhIHZpZXcgdGFiXG4gICAqIC0gZHJhZ2VudGVyOiB3aGVuIGVudGVyaW5nIHRoZSB0YXJnZXQgZWxlbWVudCB3aGlsZSBkcmFnZ2luZyBhIHZpZXcgdGFiXG4gICAqIC0gZHJhZ292ZXI6IHdoZW4gZHJhZ2dpbmcgYSB2aWV3IHRhYiBvdmVyIHRoZSB0YXJnZXQgZWxlbWVudCwgZXZlcnkgZmV3IGh1bmRyZWQgbWlsbGlzZWNvbmRzXG4gICAqIC0gZHJhZ2xlYXZlOiB3aGVuIGxlYXZpbmcgdGhlIHRhcmdldCBlbGVtZW50IHdoaWxlIGRyYWdnaW5nIGEgdmlldyB0YWJcbiAgICogLSBkcm9wOiB3aGVuIGRyb3BwaW5nIGEgdmlldyB0YWIgb24gYSB2YWxpZCBkcm9wIHRhcmdldFxuICAgKlxuICAgKiBBcyBieSBkZXNpZ24gb2YgbmF0aXZlIGRyYWcgYW5kIGRyb3AsIHRoZSBgZHJhZ2xlYXZlYCBldmVudCBpcyBub3QgZmlyZWQgb24gZHJvcCBhY3Rpb24uXG4gICAqIFRoZXJlZm9yZSwgYWx3YXlzIGhhbmRsZSBib3RoIGV2ZW50cywgYGRyYWdsZWF2ZWAgYW5kIGBkcm9wYCBldmVudHMsIHJlc3BlY3RpdmVseS5cbiAgICpcbiAgICogQHBhcmFtIHRhcmdldCAtIFNwZWNpZmllcyB0aGUgZWxlbWVudCBvbiB3aGljaCB0byBzdWJzY3JpYmUgZm9yIGRyYWcgZXZlbnRzLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbnRyb2xzIGhvdyB0byBzdWJzY3JpYmUgZm9yIGRyYWcgZXZlbnRzLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5ldmVudFR5cGUgLSBGaWx0ZXJzIGZvciBzcGVjaWZpZWQgZHJhZyBldmVudHM7IGRlZmF1bHRzIHRvIGFueSBldmVudC5cbiAgICogQHBhcmFtIG9wdGlvbnMuY2FwdHVyZSAtIENvbnRyb2xzIHdoZXRoZXIgdG8gc3Vic2NyaWJlIGZvciBkcmFnIGV2ZW50cyBpbiB0aGUgY2FwdHVyaW5nIHBoYXNlOyBkZWZhdWx0cyB0byBgZmFsc2VgLCBpLmUuLCBgYnViYmxpbmdgIHBoYXNlLlxuICAgKi9cbiAgcHVibGljIHZpZXdEcmFnJCh0YXJnZXQ6IEVsZW1lbnQgfCBXaW5kb3csIG9wdGlvbnM/OiBWaWV3RHJhZ0V2ZW50TGlzdGVuZXJPcHRpb25zKTogT2JzZXJ2YWJsZTxEcmFnRXZlbnQ+IHtcbiAgICBjb25zdCBmaWx0ZXJlZEV2ZW50VHlwZXMgPSBuZXcgU2V0PHN0cmluZz4oQXJyYXlzLmNvZXJjZShvcHRpb25zPy5ldmVudFR5cGUpKTtcbiAgICBjb25zdCBpc1ZpZXdEcmFnRXZlbnQgPSB0aGlzLmlzVmlld0RyYWdFdmVudC5iaW5kKHRoaXMpO1xuXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8RHJhZ0V2ZW50Pik6IFRlYXJkb3duTG9naWMgPT4ge1xuICAgICAgY29uc3QgaW5zaWRlQW5ndWxhciA9IE5nWm9uZS5pc0luQW5ndWxhclpvbmUoKTtcblxuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbWVyZ2UoXG4gICAgICAgIHNob3VsZFN1YnNjcmliZSgnZHJhZ3N0YXJ0JykgPyBkcmFnc3RhcnQkKCkgOiBFTVBUWSxcbiAgICAgICAgc2hvdWxkU3Vic2NyaWJlKCdkcmFnZW5kJykgPyBkcmFnZW5kJCgpIDogRU1QVFksXG4gICAgICAgIHNob3VsZFN1YnNjcmliZSgnZHJhZ292ZXInKSA/IGRyYWdvdmVyJCgpIDogRU1QVFksXG4gICAgICAgIHNob3VsZFN1YnNjcmliZSgnZHJhZ2VudGVyJykgfHwgc2hvdWxkU3Vic2NyaWJlKCdkcmFnbGVhdmUnKSB8fCBzaG91bGRTdWJzY3JpYmUoJ2Ryb3AnKSA/IGRyYWdlbnRlck9yRHJhZ2xlYXZlT3JEcm9wJCgpIDogRU1QVFksXG4gICAgICApXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHN1YnNjcmliZUluKGZuID0+IHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZm4pKSxcbiAgICAgICAgICBvYnNlcnZlSW4oZm4gPT4gaW5zaWRlQW5ndWxhciA/IHRoaXMuX3pvbmUucnVuKGZuKSA6IHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZm4pKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKG9ic2VydmVyKTtcblxuICAgICAgcmV0dXJuICgpOiB2b2lkID0+IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gZHJhZ3N0YXJ0JCgpOiBPYnNlcnZhYmxlPERyYWdFdmVudD4ge1xuICAgICAgcmV0dXJuIGZyb21FdmVudDxEcmFnRXZlbnQ+KHRhcmdldCwgJ2RyYWdzdGFydCcsIG9wdGlvbnMgPz8ge30pXG4gICAgICAgIC5waXBlKGZpbHRlcihldmVudCA9PiBpc1ZpZXdEcmFnRXZlbnQoZXZlbnQpKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZHJhZ2VuZCQoKTogT2JzZXJ2YWJsZTxEcmFnRXZlbnQ+IHtcbiAgICAgIC8vIFRoZSBgZHJhZ2VuZGAgZXZlbnQgZG9lcyBub3QgY29udGFpbiBhIGRyYWcgdHJhbnNmZXIgdHlwZS4gVG8gc3RpbGwgZmlsdGVyIHZpZXctcmVsYXRlZCBgZHJhZ2VuZGAgZXZlbnRzLFxuICAgICAgLy8gd2UgY29tYmluZSBgZHJhZ3N0YXJ0YCBhbmQgYGRyYWdlbmRgIGV2ZW50cywgaS5lLiwgd2hlbiBhIHZpZXctcmVsYXRlZCBgZHJhZ3N0YXJ0YCBldmVudCBvY2N1cnMsIHdlIGV4cGVjdFxuICAgICAgLy8gdGhlIG5leHQgYGRyYWdlbmRgIGV2ZW50IHRvIGJlIHZpZXctcmVsYXRlZC5cbiAgICAgIHJldHVybiB6aXAoXG4gICAgICAgIGZyb21FdmVudDxEcmFnRXZlbnQ+KHRhcmdldCwgJ2RyYWdzdGFydCcsIG9wdGlvbnMgPz8ge30pLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGlzVmlld0RyYWdFdmVudChldmVudCkpKSxcbiAgICAgICAgZnJvbUV2ZW50PERyYWdFdmVudD4odGFyZ2V0LCAnZHJhZ2VuZCcsIG9wdGlvbnMgPz8ge30pLFxuICAgICAgKS5waXBlKG1hcCgoW18sIGRyYWdlbmRFdmVudF0pID0+IGRyYWdlbmRFdmVudCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRyYWdvdmVyJCgpOiBPYnNlcnZhYmxlPERyYWdFdmVudD4ge1xuICAgICAgcmV0dXJuIGZyb21FdmVudDxEcmFnRXZlbnQ+KHRhcmdldCwgJ2RyYWdvdmVyJywgb3B0aW9ucyA/PyB7fSlcbiAgICAgICAgLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGlzVmlld0RyYWdFdmVudChldmVudCkpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkcmFnZW50ZXJPckRyYWdsZWF2ZU9yRHJvcCQoKTogT2JzZXJ2YWJsZTxEcmFnRXZlbnQ+IHtcbiAgICAgIC8vIFdlIGVtaXQgYGRyYWdlbnRlcmAgb25seSB3aGVuIGVudGVyaW5nIHRoZSB0YXJnZXQgZWxlbWVudCAob3IgYW55IGNoaWxkIGVsZW1lbnQpIGZvciB0aGUgZmlyc3QgdGltZVxuICAgICAgLy8gYW5kIG9ubHkgYWdhaW4gYWZ0ZXIgZW50ZXJpbmcgaXQgYWdhaW4uIFRoZSBzYW1lIGFwcGxpZXMgZm9yIGBkcmFnbGVhdmVgLlxuICAgICAgbGV0IGRyYWdFbnRlckNvdW50ID0gMDtcbiAgICAgIHJldHVybiBtZXJnZShcbiAgICAgICAgZnJvbUV2ZW50PERyYWdFdmVudD4odGFyZ2V0LCAnZHJhZ2VudGVyJywgb3B0aW9ucyA/PyB7fSksXG4gICAgICAgIGZyb21FdmVudDxEcmFnRXZlbnQ+KHRhcmdldCwgJ2RyYWdsZWF2ZScsIG9wdGlvbnMgPz8ge30pLFxuICAgICAgICBmcm9tRXZlbnQ8RHJhZ0V2ZW50Pih0YXJnZXQsICdkcm9wJywgb3B0aW9ucyA/PyB7fSksXG4gICAgICApXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihldmVudCA9PiBpc1ZpZXdEcmFnRXZlbnQoZXZlbnQpKSxcbiAgICAgICAgICBmaWx0ZXIoKGV2ZW50OiBEcmFnRXZlbnQpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICAgICAgICBjYXNlICdkcmFnZW50ZXInOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICgrK2RyYWdFbnRlckNvdW50ID09PSAxKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICdkcmFnbGVhdmUnOlxuICAgICAgICAgICAgICBjYXNlICdkcm9wJzoge1xuICAgICAgICAgICAgICAgIHJldHVybiAoLS1kcmFnRW50ZXJDb3VudCA9PT0gMCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgICBmaWx0ZXIoZXZlbnQgPT4gc2hvdWxkU3Vic2NyaWJlKGV2ZW50LnR5cGUpKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzaG91bGRTdWJzY3JpYmUoZXZlbnRUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiAhZmlsdGVyZWRFdmVudFR5cGVzLnNpemUgfHwgZmlsdGVyZWRFdmVudFR5cGVzLmhhcyhldmVudFR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIHRoZSBnaXZlbiB2aWV3IG1vdmUgZXZlbnQgdG8gYXBwIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBvcmlnaW4uXG4gICAqL1xuICBwdWJsaWMgZGlzcGF0Y2hWaWV3TW92ZUV2ZW50KGV2ZW50OiBWaWV3TW92ZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gV2FpdCB0byBkaXNwYXRjaCB0aGUgZXZlbnQgdW50aWwgdGhlIGRyYWcgb3BlcmF0aW9uIGZpbmlzaGVkLCBpZiBhbnksIGJlY2F1c2UgaWYgdGhlIGRyYWcgc291cmNlIGVsZW1lbnRcbiAgICAvLyBpcyBkZXN0cm95ZWQgZHVyaW5nIHRoZSBkcmFnIG9wZXJhdGlvbiwgZS5nLiBpZiBtb3ZlZCB0byBhbm90aGVyIHBhcnQsIHRoZSBkcmFnIG9wZXJhdGlvbiB3b3VsZCBub3RcbiAgICAvLyBvcmRpbmFyaWx5IGNvbXBsZXRlLCBtZWFuaW5nICdkcmFnZW5kJyBvciAnZHJhZ2xlYXZlJyB3b3VsZCBub3QgYmUgY2FsbGVkLlxuICAgIGNvbnN0IGlzRHJhZ2dpbmcgPSB0aGlzLnZpZXdEcmFnRGF0YSAhPT0gbnVsbDtcbiAgICAoaXNEcmFnZ2luZyA/IHRoaXMudmlld0RyYWdFbmQkIDogb2YodW5kZWZpbmVkKSlcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3ZpZXdNb3ZlQnJvYWRjYXN0Q2hhbm5lbC5wb3N0TWVzc2FnZShldmVudCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIHRoZSBnaXZlbiB2aWV3IGRyYWcgZGF0YSBhdmFpbGFibGUgdG8gYXBwIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBvcmlnaW4uXG4gICAqXG4gICAqIEludm9rZSB0aGlzIG1ldGhvZCBpbnNpZGUgJ2RyYWdzdGFydCcgZXZlbnQgaGFuZGxlciBvZiB0aGUgZWxlbWVudCB3aGVyZSB0aGUgZHJhZyBvcGVyYXRpb24gc3RhcnRlZC5cbiAgICovXG4gIHB1YmxpYyBzZXRWaWV3RHJhZ0RhdGEodmlld0RyYWdEYXRhOiBWaWV3RHJhZ0RhdGEpOiB2b2lkIHtcbiAgICB0aGlzLl92aWV3RHJhZ1N0YXJ0QnJvYWRjYXN0Q2hhbm5lbC5wb3N0TWVzc2FnZSh2aWV3RHJhZ0RhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIHZpZXcgZHJhZyBkYXRhLlxuICAgKlxuICAgKiBJbnZva2UgdGhpcyBtZXRob2QgaW5zaWRlICdkcmFnZW5kJyBldmVudCBoYW5kbGVyIG9mIHRoZSBlbGVtZW50IHdoZXJlIHRoZSBkcmFnIG9wZXJhdGlvbiBzdGFydGVkLlxuICAgKi9cbiAgcHVibGljIHVuc2V0Vmlld0RyYWdEYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuX3ZpZXdEcmFnRW5kQnJvYWRjYXN0Q2hhbm5lbC5wb3N0TWVzc2FnZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZpZXcgZHJhZyBkYXRhIG9mIHRoZSBvbmdvaW5nIHZpZXcgZHJhZyBvcGVyYXRpb24gb3IgYG51bGxgIGlmIG5vIGRyYWcgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLlxuICAgKi9cbiAgcHVibGljIGdldCB2aWV3RHJhZ0RhdGEoKTogVmlld0RyYWdEYXRhIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdEcmFnRGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl92aWV3TW92ZUJyb2FkY2FzdENoYW5uZWwuZGVzdHJveSgpO1xuICAgIHRoaXMuX3ZpZXdEcmFnU3RhcnRCcm9hZGNhc3RDaGFubmVsLmRlc3Ryb3koKTtcbiAgICB0aGlzLl92aWV3RHJhZ0VuZEJyb2FkY2FzdENoYW5uZWwuZGVzdHJveSgpO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBkYXRhIG9mIGEgdmlldyBkcmFnIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaWV3RHJhZ0RhdGEge1xuICAvKipcbiAgICogWC1jb29yZGluYXRlIG9mIHRoZSBtb3VzZSBwb2ludGVyLCByZWxhdGl2ZSB0byB0aGUgdmlldyB0YWIgZHJhZyBpbWFnZS5cbiAgICovXG4gIHZpZXdUYWJQb2ludGVyT2Zmc2V0WDogbnVtYmVyO1xuICAvKipcbiAgICogWS1jb29yZGluYXRlIG9mIHRoZSBtb3VzZSBwb2ludGVyLCByZWxhdGl2ZSB0byB0aGUgdmlldyB0YWIgZHJhZyBpbWFnZS5cbiAgICovXG4gIHZpZXdUYWJQb2ludGVyT2Zmc2V0WTogbnVtYmVyO1xuICB2aWV3SWQ6IFZpZXdJZDtcbiAgYWx0ZXJuYXRpdmVWaWV3SWQ/OiBzdHJpbmc7XG4gIHZpZXdUaXRsZTogc3RyaW5nIHwgbnVsbDtcbiAgdmlld0hlYWRpbmc6IHN0cmluZyB8IG51bGw7XG4gIHZpZXdVcmxTZWdtZW50czogVXJsU2VnbWVudFtdO1xuICBuYXZpZ2F0aW9uSGludD86IHN0cmluZztcbiAgbmF2aWdhdGlvbkRhdGE/OiBOYXZpZ2F0aW9uRGF0YTtcbiAgdmlld0Nsb3NhYmxlOiBib29sZWFuO1xuICB2aWV3RGlydHk6IGJvb2xlYW47XG4gIHBhcnRJZDogc3RyaW5nO1xuICB2aWV3VGFiV2lkdGg6IG51bWJlcjtcbiAgdmlld1RhYkhlaWdodDogbnVtYmVyO1xuICB3b3JrYmVuY2hJZDogc3RyaW5nO1xuICBjbGFzc0xpc3Q/OiBDbGFzc0xpc3RNYXA7XG59XG5cbi8qKlxuICogRXZlbnQgZW1pdHRlZCB3aGVuIG1vdmluZyBhIHZpZXcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlld01vdmVFdmVudCB7XG4gIHNvdXJjZTogVmlld01vdmVFdmVudFNvdXJjZTtcbiAgdGFyZ2V0OiBWaWV3TW92ZUV2ZW50VGFyZ2V0O1xufVxuXG4vKipcbiAqIERlc2NyaWJlcyBhIHZpZXcgdG8gYmUgbW92ZWQgdG8gYW5vdGhlciBsb2NhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaWV3TW92ZUV2ZW50U291cmNlIHtcbiAgdmlld0lkOiBWaWV3SWQ7XG4gIHBhcnRJZDogc3RyaW5nO1xuICBuYXZpZ2F0aW9uSGludD86IHN0cmluZztcbiAgbmF2aWdhdGlvbkRhdGE/OiBOYXZpZ2F0aW9uRGF0YTtcbiAgYWx0ZXJuYXRpdmVWaWV3SWQ/OiBzdHJpbmc7XG4gIHZpZXdVcmxTZWdtZW50czogVXJsU2VnbWVudFtdO1xuICB3b3JrYmVuY2hJZDogc3RyaW5nO1xuICBjbGFzc0xpc3Q/OiBDbGFzc0xpc3RNYXA7XG59XG5cbi8qKlxuICogRGVzY3JpYmVzIHRoZSB0YXJnZXQgbG9jYXRpb24gZm9yIG1vdmluZyBhIHZpZXcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlld01vdmVFdmVudFRhcmdldCB7XG4gIC8qKlxuICAgKiBQYXJ0IChvciBub2RlKSB3aGVyZSAob3IgcmVsYXRpdmUgdG8gd2hpY2gpIHRvIGFkZCB0aGUgdmlldy5cbiAgICpcbiAgICogUnVsZXMgZm9yIGRpZmZlcmVudCByZWdpb25zOlxuICAgKiAtIElmIG5vdCBzcGVjaWZ5aW5nIGEgcmVnaW9uLCB7QGxpbmsgZWxlbWVudElkfSBpcyBtYW5kYXRvcnkgYW5kIG11c3QgcmVmZXJlbmNlIGEgcGFydC5cbiAgICogLSBGb3IgcmVnaW9ucyBgbm9ydGhgLCBgc291dGhgLCBgZWFzdGAsIG9yIGB3ZXN0YCwge0BsaW5rIGVsZW1lbnRJZH0gY2FuIHJlZmVyZW5jZSBhIHBhcnQgb3Igbm9kZSxcbiAgICogICByZWxhdGl2ZSB0byB3aGljaCB0byBhbGlnbiB0aGUgdmlldy4gSWYgbm90IHNldCwgdGhlIHZpZXcgaXMgYWxpZ25lZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZlxuICAgKiAgIHRoZSBlbnRpcmUgbGF5b3V0LlxuICAgKlxuICAgKiBOb3RlOiBQcm9wZXJ0eSBpcyBpZ25vcmVkIHdoZW4gbW92aW5nIHRoZSB2aWV3IHRvIGEgbmV3IHdpbmRvdy5cbiAgICovXG4gIGVsZW1lbnRJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFJlZ2lvbiBvZiB7QGxpbmsgZWxlbWVudElkfSB3aGVyZSB0byBhZGQgdGhlIHZpZXcgKGluIGEgbmV3IHBhcnQpLlxuICAgKlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCB7QGxpbmsgZWxlbWVudElkfSBtdXN0IHJlZmVyZW5jZSBhIHBhcnQgdG8gd2hpY2ggdG8gYWRkIHRoZSB2aWV3LlxuICAgKlxuICAgKiBOb3RlOlxuICAgKiAtIFByb3BlcnR5IGlzIGlnbm9yZWQgd2hlbiBtb3ZpbmcgdGhlIHZpZXcgdG8gYSBuZXcgd2luZG93LlxuICAgKiAtIFByb3BlcnR5IGlzIHJlcXVpcmVkIGlmIHtAbGluayBlbGVtZW50SWR9IGlzIGEgbm9kZS5cbiAgICovXG4gIHJlZ2lvbj86ICdub3J0aCcgfCAnZWFzdCcgfCAnc291dGgnIHwgJ3dlc3QnO1xuICAvKipcbiAgICogUG9zaXRpb24gd2hlcmUgdG8gaW5zZXJ0IHRoZSB2aWV3LiBUaGUgcG9zaXRpb24gaXMgemVyby1iYXNlZC4gSWYgbm90IHNldCwgYWRkcyB0aGUgdmlldyBhZnRlciB0aGUgYWN0aXZlIHZpZXcuXG4gICAqL1xuICBwb3NpdGlvbj86IG51bWJlciB8ICdzdGFydCcgfCAnZW5kJztcbiAgLyoqXG4gICAqIElkZW50aWZpZXIgb2YgdGhlIHRhcmdldCB3b3JrYmVuY2gsIG9yICduZXctd2luZG93JyB0byBtb3ZlIHRoZSB2aWV3IHRvIGEgbmV3IGJyb3dzZXIgd2luZG93LlxuICAgKi9cbiAgd29ya2JlbmNoSWQ6IHN0cmluZyB8ICduZXctd2luZG93JztcbiAgLyoqXG4gICAqIERlc2NyaWJlcyB0aGUgcGFydCB0byBiZSBjcmVhdGVkIGlmIHRoZSByZWdpb24gaXMgJ25vcnRoJywgJ2Vhc3QnLCAnc291dGgnLCBvciAnd2VzdCcuXG4gICAqL1xuICBuZXdQYXJ0Pzoge1xuICAgIC8qKlxuICAgICAqIElkZW50aXR5IG9mIHRoZSBuZXcgcGFydC4gSWYgbm90IHNldCwgYXNzaWducyBhIFVVSUQuXG4gICAgICovXG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUHJvcG9ydGlvbmFsIHNpemUgb2YgdGhlIHBhcnQgcmVsYXRpdmUgdG8gdGhlIHJlZmVyZW5jZSBwYXJ0LlxuICAgICAqIFRoZSByYXRpbyBpcyB0aGUgY2xvc2VkIGludGVydmFsIFswLDFdLiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byBgMC41YC5cbiAgICAgKi9cbiAgICByYXRpbz86IG51bWJlcjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWaWV3RHJhZ0V2ZW50TGlzdGVuZXJPcHRpb25zIGV4dGVuZHMgRXZlbnRMaXN0ZW5lck9wdGlvbnMge1xuICAvKipcbiAgICogQWxsb3dzIGZpbHRlcmluZyBmb3IgZ2l2ZW4gZHJhZyBldmVudCB0eXBlcy5cbiAgICovXG4gIGV2ZW50VHlwZT86IFZpZXdEcmFnRXZlbnRUeXBlIHwgVmlld0RyYWdFdmVudFR5cGVbXTtcbn1cbiJdfQ==
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2018-2023 Swiss Federal Railways
|
|
3
|
-
*
|
|
4
|
-
* This program and the accompanying materials are made
|
|
5
|
-
* available under the terms of the Eclipse Public License 2.0
|
|
6
|
-
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
7
|
-
*
|
|
8
|
-
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
-
*/
|
|
10
|
-
import { inject, Injectable } from '@angular/core';
|
|
11
|
-
import { createElement, setStyle } from '../common/dom.util';
|
|
12
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
13
|
-
import { subscribeIn } from '@scion/toolkit/operators';
|
|
14
|
-
import { VIEW_DROP_ZONE_OVERLAY_HOST } from '../content-projection/workbench-element-references';
|
|
15
|
-
import { filter } from 'rxjs/operators';
|
|
16
|
-
import { merge } from 'rxjs';
|
|
17
|
-
import * as i0 from "@angular/core";
|
|
18
|
-
import * as i1 from "./view-drag.service";
|
|
19
|
-
/**
|
|
20
|
-
* Renders the visual placeholder when dragging a view over a valid drop zone.
|
|
21
|
-
*
|
|
22
|
-
* To animate the transition of the placeholder, we use a single HTML element for the placeholder and
|
|
23
|
-
* adjust its position when the drop zone changes.
|
|
24
|
-
*/
|
|
25
|
-
export class ViewDropPlaceholderRenderer {
|
|
26
|
-
constructor(_viewDragService, _zone) {
|
|
27
|
-
this._viewDragService = _viewDragService;
|
|
28
|
-
this._zone = _zone;
|
|
29
|
-
this._dropPlaceholderOverlayHost = inject(VIEW_DROP_ZONE_OVERLAY_HOST);
|
|
30
|
-
this._dropPlaceholder = null;
|
|
31
|
-
this.installDropPlaceholderDisposer();
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Repositions the placeholder, or creates it if not created yet.
|
|
35
|
-
*
|
|
36
|
-
* @param referenceElement - Specifies the element that serves as the reference point for positioning the placeholder.
|
|
37
|
-
* @param inset - Specifies the spacing between the placeholder and the boundaries of the reference element.
|
|
38
|
-
*/
|
|
39
|
-
updatePosition(referenceElement, inset) {
|
|
40
|
-
this._dropPlaceholder ??= this.createDropPlaceholder();
|
|
41
|
-
const referenceElementBounds = referenceElement.getBoundingClientRect();
|
|
42
|
-
setStyle(this._dropPlaceholder, {
|
|
43
|
-
top: `${referenceElementBounds.top + inset.top}px`,
|
|
44
|
-
left: `${referenceElementBounds.left + inset.left}px`,
|
|
45
|
-
width: `${referenceElement.clientWidth - inset.left - inset.right}px`,
|
|
46
|
-
height: `${referenceElement.clientHeight - inset.top - inset.bottom}px`,
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
createDropPlaceholder() {
|
|
50
|
-
return createElement('div', {
|
|
51
|
-
parent: this._dropPlaceholderOverlayHost().element.nativeElement,
|
|
52
|
-
style: {
|
|
53
|
-
'position': 'fixed',
|
|
54
|
-
'background-color': 'var(--sci-workbench-part-dropzone-background-color)',
|
|
55
|
-
'border': '1px var(--sci-workbench-part-dropzone-border-style) var(--sci-workbench-part-dropzone-border-color)',
|
|
56
|
-
'border-radius': 'var(--sci-workbench-part-dropzone-border-radius)',
|
|
57
|
-
'pointer-events': 'none',
|
|
58
|
-
'transition-duration': '125ms',
|
|
59
|
-
'transition-property': 'top,left,width,height',
|
|
60
|
-
'transition-timing-function': 'ease-out',
|
|
61
|
-
},
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Disposes the drop placeholder in the following events:
|
|
66
|
-
*
|
|
67
|
-
* - When the user drags a view over the tab bar, as the tabbar takes precedence over the drop zones.
|
|
68
|
-
* - When the user drags a view over a non-valid drop target, such as outside the workbench.
|
|
69
|
-
* - When the user drags a view out of the window, cancels or completes the drag operation.
|
|
70
|
-
*/
|
|
71
|
-
installDropPlaceholderDisposer() {
|
|
72
|
-
const tabbarDragOver$ = this._viewDragService.tabbarDragOver$.pipe(filter(Boolean));
|
|
73
|
-
const nonDropTargetDragOver$ = this._viewDragService.viewDrag$(window, { eventType: 'dragover' }).pipe(filter(event => !event.defaultPrevented));
|
|
74
|
-
const dragEnd$ = this._viewDragService.viewDrag$(window, { eventType: ['dragend', 'drop', 'dragleave'] });
|
|
75
|
-
merge(tabbarDragOver$, nonDropTargetDragOver$, dragEnd$)
|
|
76
|
-
.pipe(subscribeIn(fn => this._zone.runOutsideAngular(fn)), takeUntilDestroyed())
|
|
77
|
-
.subscribe(() => {
|
|
78
|
-
this._dropPlaceholder?.remove();
|
|
79
|
-
this._dropPlaceholder = null;
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewDropPlaceholderRenderer, deps: [{ token: i1.ViewDragService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
83
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewDropPlaceholderRenderer, providedIn: 'root' }); }
|
|
84
|
-
}
|
|
85
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewDropPlaceholderRenderer, decorators: [{
|
|
86
|
-
type: Injectable,
|
|
87
|
-
args: [{ providedIn: 'root' }]
|
|
88
|
-
}], ctorParameters: () => [{ type: i1.ViewDragService }, { type: i0.NgZone }] });
|
|
89
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy1kcm9wLXBsYWNlaG9sZGVyLXJlbmRlcmVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi92aWV3LWRuZC92aWV3LWRyb3AtcGxhY2Vob2xkZXItcmVuZGVyZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFTLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBQyxhQUFhLEVBQUUsUUFBUSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFM0QsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLG9EQUFvRCxDQUFDO0FBQy9GLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7QUFFM0I7Ozs7O0dBS0c7QUFFSCxNQUFNLE9BQU8sMkJBQTJCO0lBS3RDLFlBQW9CLGdCQUFpQyxFQUFVLEtBQWE7UUFBeEQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQjtRQUFVLFVBQUssR0FBTCxLQUFLLENBQVE7UUFIcEUsZ0NBQTJCLEdBQUcsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDbEUscUJBQWdCLEdBQXVCLElBQUksQ0FBQztRQUdsRCxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxjQUFjLENBQUMsZ0JBQTZCLEVBQUUsS0FBaUU7UUFDcEgsSUFBSSxDQUFDLGdCQUFnQixLQUFLLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sc0JBQXNCLEdBQUcsZ0JBQWdCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUV4RSxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQzlCLEdBQUcsRUFBRSxHQUFHLHNCQUFzQixDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJO1lBQ2xELElBQUksRUFBRSxHQUFHLHNCQUFzQixDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJO1lBQ3JELEtBQUssRUFBRSxHQUFHLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUk7WUFDckUsTUFBTSxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSTtTQUN4RSxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8scUJBQXFCO1FBQzNCLE9BQU8sYUFBYSxDQUFDLEtBQUssRUFBRTtZQUMxQixNQUFNLEVBQUUsSUFBSSxDQUFDLDJCQUEyQixFQUFHLENBQUMsT0FBTyxDQUFDLGFBQWE7WUFDakUsS0FBSyxFQUFFO2dCQUNMLFVBQVUsRUFBRSxPQUFPO2dCQUNuQixrQkFBa0IsRUFBRSxxREFBcUQ7Z0JBQ3pFLFFBQVEsRUFBRSxxR0FBcUc7Z0JBQy9HLGVBQWUsRUFBRSxrREFBa0Q7Z0JBQ25FLGdCQUFnQixFQUFFLE1BQU07Z0JBQ3hCLHFCQUFxQixFQUFFLE9BQU87Z0JBQzlCLHFCQUFxQixFQUFFLHVCQUF1QjtnQkFDOUMsNEJBQTRCLEVBQUUsVUFBVTthQUN6QztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyw4QkFBOEI7UUFDcEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDcEYsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7UUFDL0ksTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBQyxTQUFTLEVBQUUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUFDLENBQUMsQ0FBQztRQUV4RyxLQUFLLENBQUMsZUFBZSxFQUFFLHNCQUFzQixFQUFFLFFBQVEsQ0FBQzthQUNyRCxJQUFJLENBQ0gsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNuRCxrQkFBa0IsRUFBRSxDQUNyQjthQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7OEdBaEVVLDJCQUEyQjtrSEFBM0IsMkJBQTJCLGNBRGYsTUFBTTs7MkZBQ2xCLDJCQUEyQjtrQkFEdkMsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjMgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7aW5qZWN0LCBJbmplY3RhYmxlLCBOZ1pvbmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtjcmVhdGVFbGVtZW50LCBzZXRTdHlsZX0gZnJvbSAnLi4vY29tbW9uL2RvbS51dGlsJztcbmltcG9ydCB7Vmlld0RyYWdTZXJ2aWNlfSBmcm9tICcuL3ZpZXctZHJhZy5zZXJ2aWNlJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge3N1YnNjcmliZUlufSBmcm9tICdAc2Npb24vdG9vbGtpdC9vcGVyYXRvcnMnO1xuaW1wb3J0IHtWSUVXX0RST1BfWk9ORV9PVkVSTEFZX0hPU1R9IGZyb20gJy4uL2NvbnRlbnQtcHJvamVjdGlvbi93b3JrYmVuY2gtZWxlbWVudC1yZWZlcmVuY2VzJztcbmltcG9ydCB7ZmlsdGVyfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge21lcmdlfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBSZW5kZXJzIHRoZSB2aXN1YWwgcGxhY2Vob2xkZXIgd2hlbiBkcmFnZ2luZyBhIHZpZXcgb3ZlciBhIHZhbGlkIGRyb3Agem9uZS5cbiAqXG4gKiBUbyBhbmltYXRlIHRoZSB0cmFuc2l0aW9uIG9mIHRoZSBwbGFjZWhvbGRlciwgd2UgdXNlIGEgc2luZ2xlIEhUTUwgZWxlbWVudCBmb3IgdGhlIHBsYWNlaG9sZGVyIGFuZFxuICogYWRqdXN0IGl0cyBwb3NpdGlvbiB3aGVuIHRoZSBkcm9wIHpvbmUgY2hhbmdlcy5cbiAqL1xuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgVmlld0Ryb3BQbGFjZWhvbGRlclJlbmRlcmVyIHtcblxuICBwcml2YXRlIF9kcm9wUGxhY2Vob2xkZXJPdmVybGF5SG9zdCA9IGluamVjdChWSUVXX0RST1BfWk9ORV9PVkVSTEFZX0hPU1QpO1xuICBwcml2YXRlIF9kcm9wUGxhY2Vob2xkZXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfdmlld0RyYWdTZXJ2aWNlOiBWaWV3RHJhZ1NlcnZpY2UsIHByaXZhdGUgX3pvbmU6IE5nWm9uZSkge1xuICAgIHRoaXMuaW5zdGFsbERyb3BQbGFjZWhvbGRlckRpc3Bvc2VyKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVwb3NpdGlvbnMgdGhlIHBsYWNlaG9sZGVyLCBvciBjcmVhdGVzIGl0IGlmIG5vdCBjcmVhdGVkIHlldC5cbiAgICpcbiAgICogQHBhcmFtIHJlZmVyZW5jZUVsZW1lbnQgLSBTcGVjaWZpZXMgdGhlIGVsZW1lbnQgdGhhdCBzZXJ2ZXMgYXMgdGhlIHJlZmVyZW5jZSBwb2ludCBmb3IgcG9zaXRpb25pbmcgdGhlIHBsYWNlaG9sZGVyLlxuICAgKiBAcGFyYW0gaW5zZXQgLSBTcGVjaWZpZXMgdGhlIHNwYWNpbmcgYmV0d2VlbiB0aGUgcGxhY2Vob2xkZXIgYW5kIHRoZSBib3VuZGFyaWVzIG9mIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVQb3NpdGlvbihyZWZlcmVuY2VFbGVtZW50OiBIVE1MRWxlbWVudCwgaW5zZXQ6IHt0b3A6IG51bWJlcjsgcmlnaHQ6IG51bWJlcjsgYm90dG9tOiBudW1iZXI7IGxlZnQ6IG51bWJlcn0pOiB2b2lkIHtcbiAgICB0aGlzLl9kcm9wUGxhY2Vob2xkZXIgPz89IHRoaXMuY3JlYXRlRHJvcFBsYWNlaG9sZGVyKCk7XG4gICAgY29uc3QgcmVmZXJlbmNlRWxlbWVudEJvdW5kcyA9IHJlZmVyZW5jZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBzZXRTdHlsZSh0aGlzLl9kcm9wUGxhY2Vob2xkZXIsIHtcbiAgICAgIHRvcDogYCR7cmVmZXJlbmNlRWxlbWVudEJvdW5kcy50b3AgKyBpbnNldC50b3B9cHhgLFxuICAgICAgbGVmdDogYCR7cmVmZXJlbmNlRWxlbWVudEJvdW5kcy5sZWZ0ICsgaW5zZXQubGVmdH1weGAsXG4gICAgICB3aWR0aDogYCR7cmVmZXJlbmNlRWxlbWVudC5jbGllbnRXaWR0aCAtIGluc2V0LmxlZnQgLSBpbnNldC5yaWdodH1weGAsXG4gICAgICBoZWlnaHQ6IGAke3JlZmVyZW5jZUVsZW1lbnQuY2xpZW50SGVpZ2h0IC0gaW5zZXQudG9wIC0gaW5zZXQuYm90dG9tfXB4YCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRHJvcFBsYWNlaG9sZGVyKCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gY3JlYXRlRWxlbWVudCgnZGl2Jywge1xuICAgICAgcGFyZW50OiB0aGlzLl9kcm9wUGxhY2Vob2xkZXJPdmVybGF5SG9zdCgpIS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICBzdHlsZToge1xuICAgICAgICAncG9zaXRpb24nOiAnZml4ZWQnLFxuICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICd2YXIoLS1zY2ktd29ya2JlbmNoLXBhcnQtZHJvcHpvbmUtYmFja2dyb3VuZC1jb2xvciknLFxuICAgICAgICAnYm9yZGVyJzogJzFweCB2YXIoLS1zY2ktd29ya2JlbmNoLXBhcnQtZHJvcHpvbmUtYm9yZGVyLXN0eWxlKSB2YXIoLS1zY2ktd29ya2JlbmNoLXBhcnQtZHJvcHpvbmUtYm9yZGVyLWNvbG9yKScsXG4gICAgICAgICdib3JkZXItcmFkaXVzJzogJ3ZhcigtLXNjaS13b3JrYmVuY2gtcGFydC1kcm9wem9uZS1ib3JkZXItcmFkaXVzKScsXG4gICAgICAgICdwb2ludGVyLWV2ZW50cyc6ICdub25lJyxcbiAgICAgICAgJ3RyYW5zaXRpb24tZHVyYXRpb24nOiAnMTI1bXMnLFxuICAgICAgICAndHJhbnNpdGlvbi1wcm9wZXJ0eSc6ICd0b3AsbGVmdCx3aWR0aCxoZWlnaHQnLFxuICAgICAgICAndHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nOiAnZWFzZS1vdXQnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgZHJvcCBwbGFjZWhvbGRlciBpbiB0aGUgZm9sbG93aW5nIGV2ZW50czpcbiAgICpcbiAgICogLSBXaGVuIHRoZSB1c2VyIGRyYWdzIGEgdmlldyBvdmVyIHRoZSB0YWIgYmFyLCBhcyB0aGUgdGFiYmFyIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgZHJvcCB6b25lcy5cbiAgICogLSBXaGVuIHRoZSB1c2VyIGRyYWdzIGEgdmlldyBvdmVyIGEgbm9uLXZhbGlkIGRyb3AgdGFyZ2V0LCBzdWNoIGFzIG91dHNpZGUgdGhlIHdvcmtiZW5jaC5cbiAgICogLSBXaGVuIHRoZSB1c2VyIGRyYWdzIGEgdmlldyBvdXQgb2YgdGhlIHdpbmRvdywgY2FuY2VscyBvciBjb21wbGV0ZXMgdGhlIGRyYWcgb3BlcmF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsRHJvcFBsYWNlaG9sZGVyRGlzcG9zZXIoKTogdm9pZCB7XG4gICAgY29uc3QgdGFiYmFyRHJhZ092ZXIkID0gdGhpcy5fdmlld0RyYWdTZXJ2aWNlLnRhYmJhckRyYWdPdmVyJC5waXBlKGZpbHRlcihCb29sZWFuKSk7XG4gICAgY29uc3Qgbm9uRHJvcFRhcmdldERyYWdPdmVyJCA9IHRoaXMuX3ZpZXdEcmFnU2VydmljZS52aWV3RHJhZyQod2luZG93LCB7ZXZlbnRUeXBlOiAnZHJhZ292ZXInfSkucGlwZShmaWx0ZXIoZXZlbnQgPT4gIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpKTtcbiAgICBjb25zdCBkcmFnRW5kJCA9IHRoaXMuX3ZpZXdEcmFnU2VydmljZS52aWV3RHJhZyQod2luZG93LCB7ZXZlbnRUeXBlOiBbJ2RyYWdlbmQnLCAnZHJvcCcsICdkcmFnbGVhdmUnXX0pO1xuXG4gICAgbWVyZ2UodGFiYmFyRHJhZ092ZXIkLCBub25Ecm9wVGFyZ2V0RHJhZ092ZXIkLCBkcmFnRW5kJClcbiAgICAgIC5waXBlKFxuICAgICAgICBzdWJzY3JpYmVJbihmbiA9PiB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKGZuKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2Ryb3BQbGFjZWhvbGRlcj8ucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuX2Ryb3BQbGFjZWhvbGRlciA9IG51bGw7XG4gICAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2018-2023 Swiss Federal Railways
|
|
3
|
-
*
|
|
4
|
-
* This program and the accompanying materials are made
|
|
5
|
-
* available under the terms of the Eclipse Public License 2.0
|
|
6
|
-
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
7
|
-
*
|
|
8
|
-
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
-
*/
|
|
10
|
-
import { Directive, EventEmitter, Input, Output } from '@angular/core';
|
|
11
|
-
import { createElement, setStyle } from '../common/dom.util';
|
|
12
|
-
import { subscribeIn } from '@scion/toolkit/operators';
|
|
13
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
14
|
-
import { Subject } from 'rxjs';
|
|
15
|
-
import { takeUntil } from 'rxjs/operators';
|
|
16
|
-
import { Arrays } from '@scion/toolkit/util';
|
|
17
|
-
import * as i0 from "@angular/core";
|
|
18
|
-
import * as i1 from "./view-drag.service";
|
|
19
|
-
import * as i2 from "./view-drop-placeholder-renderer.service";
|
|
20
|
-
/**
|
|
21
|
-
* Adds view drop zones to the host element, allowing views to be dropped either in the north, east, south, west or center.
|
|
22
|
-
*
|
|
23
|
-
* The drop zones are aligned with the bounds of the host element, requiring the host to define a positioning context.
|
|
24
|
-
* If not positioned, the element is changed to be positioned relative.
|
|
25
|
-
*/
|
|
26
|
-
export class ViewDropZoneDirective {
|
|
27
|
-
constructor(host, _viewDragService, _viewDropPlaceholderRenderer, _zone) {
|
|
28
|
-
this._viewDragService = _viewDragService;
|
|
29
|
-
this._viewDropPlaceholderRenderer = _viewDropPlaceholderRenderer;
|
|
30
|
-
this._zone = _zone;
|
|
31
|
-
/**
|
|
32
|
-
* Specifies the size of the drop zone, either as percentage value [0,1] or absolute pixel value.
|
|
33
|
-
*/
|
|
34
|
-
this.dropZoneSize = .5;
|
|
35
|
-
/**
|
|
36
|
-
* Emits upon a view drop action.
|
|
37
|
-
*/
|
|
38
|
-
this.viewDrop = new EventEmitter();
|
|
39
|
-
this._host = host.nativeElement;
|
|
40
|
-
this.installDropZones();
|
|
41
|
-
}
|
|
42
|
-
ngOnInit() {
|
|
43
|
-
this.ensureHostElementPositioned();
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Installs a drop zone for each specified region.
|
|
47
|
-
*
|
|
48
|
-
* - DOM elements for drop zones are created lazily when dragging a view over the host element.
|
|
49
|
-
* - When dragging a view over a drop zone, renders the drop placeholder using the {@link ViewDropPlaceholderRenderer}.
|
|
50
|
-
*/
|
|
51
|
-
installDropZones() {
|
|
52
|
-
const disposables = new Array();
|
|
53
|
-
// Create drop zones when entering the host element.
|
|
54
|
-
this._viewDragService.viewDrag$(this._host, { eventType: 'dragenter' })
|
|
55
|
-
.pipe(subscribeIn(fn => this._zone.runOutsideAngular(fn)), takeUntilDestroyed())
|
|
56
|
-
.subscribe(() => {
|
|
57
|
-
if (!this.regions || this.regions.center) {
|
|
58
|
-
disposables.push(...this.createDropZone('center'));
|
|
59
|
-
}
|
|
60
|
-
if (!this.regions || this.regions.north) {
|
|
61
|
-
disposables.push(...this.createDropZone('north'));
|
|
62
|
-
}
|
|
63
|
-
if (!this.regions || this.regions.south) {
|
|
64
|
-
disposables.push(...this.createDropZone('south'));
|
|
65
|
-
}
|
|
66
|
-
if (!this.regions || this.regions.west) {
|
|
67
|
-
disposables.push(...this.createDropZone('west'));
|
|
68
|
-
}
|
|
69
|
-
if (!this.regions || this.regions.east) {
|
|
70
|
-
disposables.push(...this.createDropZone('east'));
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
// Dispose drop zones when leaving the host element, or when the drag operation completes.
|
|
74
|
-
this._viewDragService.viewDrag$(this._host, { eventType: ['dragleave', 'drop'] })
|
|
75
|
-
.pipe(takeUntilDestroyed())
|
|
76
|
-
.subscribe(() => {
|
|
77
|
-
disposables.forEach(disposeFn => disposeFn());
|
|
78
|
-
disposables.length = 0;
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Creates the drop zone for the specified region.
|
|
83
|
-
*/
|
|
84
|
-
createDropZone(region) {
|
|
85
|
-
const dropZoneInset = this.calculateInset(region, this.dropZoneSize);
|
|
86
|
-
const dropPlaceholderInset = this.calculateInset(region, this.dropPlaceholderSize ?? this.dropZoneSize);
|
|
87
|
-
const dispose$ = new Subject();
|
|
88
|
-
// Create the drop zone HTML element.
|
|
89
|
-
const dropZoneElement = createElement('div', {
|
|
90
|
-
parent: this._host,
|
|
91
|
-
cssClass: ['e2e-view-drop-zone', `e2e-${region}`, ...Arrays.coerce(this.cssClass)],
|
|
92
|
-
style: {
|
|
93
|
-
position: 'absolute',
|
|
94
|
-
top: `${dropZoneInset.top}px`,
|
|
95
|
-
right: `${dropZoneInset.right}px`,
|
|
96
|
-
bottom: `${dropZoneInset.bottom}px`,
|
|
97
|
-
left: `${dropZoneInset.left}px`,
|
|
98
|
-
},
|
|
99
|
-
});
|
|
100
|
-
// Install drag listener to render the drop placeholder and handle drop.
|
|
101
|
-
this._viewDragService.viewDrag$(dropZoneElement, { eventType: ['dragenter', 'dragover', 'drop'] })
|
|
102
|
-
.pipe(subscribeIn(fn => this._zone.runOutsideAngular(fn)), takeUntil(dispose$))
|
|
103
|
-
.subscribe((event) => {
|
|
104
|
-
switch (event.type) {
|
|
105
|
-
case 'dragenter':
|
|
106
|
-
this._viewDropPlaceholderRenderer.updatePosition(this._host, dropPlaceholderInset);
|
|
107
|
-
break;
|
|
108
|
-
case 'dragover':
|
|
109
|
-
event.preventDefault(); // allow view drop
|
|
110
|
-
break;
|
|
111
|
-
case 'drop':
|
|
112
|
-
this._zone.run(() => this.viewDrop.emit({
|
|
113
|
-
dropRegion: region,
|
|
114
|
-
dragData: this._viewDragService.viewDragData,
|
|
115
|
-
}));
|
|
116
|
-
break;
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
// Disable the drop zone when dragging over the tab bar, allowing the user to change the tab order even for tabs covered by the drop zone.
|
|
120
|
-
this._viewDragService.tabbarDragOver$
|
|
121
|
-
.pipe(subscribeIn(fn => this._zone.runOutsideAngular(fn)), takeUntil(dispose$))
|
|
122
|
-
.subscribe(dragOverTabbar => {
|
|
123
|
-
if (dragOverTabbar) {
|
|
124
|
-
setStyle(dropZoneElement, { 'pointer-events': 'none' });
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
setStyle(dropZoneElement, { 'pointer-events': null });
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
return [
|
|
131
|
-
() => dispose$.next(),
|
|
132
|
-
() => dropZoneElement.remove(),
|
|
133
|
-
];
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Calculates the inset for the drop region based on the given size.
|
|
137
|
-
*
|
|
138
|
-
* If passing a ratio [0,1] for the size, the size is interpreted as a percentage value relative to the size of the host element.
|
|
139
|
-
*/
|
|
140
|
-
calculateInset(region, size) {
|
|
141
|
-
return {
|
|
142
|
-
top: region === 'south' ? this._host.clientHeight - coercePixelValue(size, { containerSize: this._host.clientHeight }) : 0,
|
|
143
|
-
right: region === 'west' ? this._host.clientWidth - coercePixelValue(size, { containerSize: this._host.clientWidth }) : 0,
|
|
144
|
-
bottom: region === 'north' ? this._host.clientHeight - coercePixelValue(size, { containerSize: this._host.clientHeight }) : 0,
|
|
145
|
-
left: region === 'east' ? this._host.clientWidth - coercePixelValue(size, { containerSize: this._host.clientWidth }) : 0,
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
ensureHostElementPositioned() {
|
|
149
|
-
if (getComputedStyle(this._host).position === 'static') {
|
|
150
|
-
setStyle(this._host, { 'position': 'relative' });
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewDropZoneDirective, deps: [{ token: i0.ElementRef }, { token: i1.ViewDragService }, { token: i2.ViewDropPlaceholderRenderer }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
154
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.2", type: ViewDropZoneDirective, isStandalone: true, selector: "[wbViewDropZone]", inputs: { regions: ["wbViewDropZoneRegions", "regions"], cssClass: ["wbViewDropZoneCssClass", "cssClass"], dropZoneSize: ["wbViewDropZoneSize", "dropZoneSize"], dropPlaceholderSize: ["wbViewDropZonePlaceholderSize", "dropPlaceholderSize"] }, outputs: { viewDrop: "wbViewDropZoneDrop" }, ngImport: i0 }); }
|
|
155
|
-
}
|
|
156
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewDropZoneDirective, decorators: [{
|
|
157
|
-
type: Directive,
|
|
158
|
-
args: [{ selector: '[wbViewDropZone]', standalone: true }]
|
|
159
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.ViewDragService }, { type: i2.ViewDropPlaceholderRenderer }, { type: i0.NgZone }], propDecorators: { regions: [{
|
|
160
|
-
type: Input,
|
|
161
|
-
args: ['wbViewDropZoneRegions']
|
|
162
|
-
}], cssClass: [{
|
|
163
|
-
type: Input,
|
|
164
|
-
args: ['wbViewDropZoneCssClass']
|
|
165
|
-
}], dropZoneSize: [{
|
|
166
|
-
type: Input,
|
|
167
|
-
args: [{ alias: 'wbViewDropZoneSize', required: true }]
|
|
168
|
-
}], dropPlaceholderSize: [{
|
|
169
|
-
type: Input,
|
|
170
|
-
args: ['wbViewDropZonePlaceholderSize']
|
|
171
|
-
}], viewDrop: [{
|
|
172
|
-
type: Output,
|
|
173
|
-
args: ['wbViewDropZoneDrop']
|
|
174
|
-
}] } });
|
|
175
|
-
/**
|
|
176
|
-
* Coerces given value to a CSS pixel value.
|
|
177
|
-
*
|
|
178
|
-
* If passing a ratio [0,1], it is interpreted as a percentage value relative to the size of the container.
|
|
179
|
-
*/
|
|
180
|
-
function coercePixelValue(pixelOrRatio, options) {
|
|
181
|
-
return (pixelOrRatio <= 1) ? options.containerSize * pixelOrRatio : pixelOrRatio;
|
|
182
|
-
}
|
|
183
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy1kcm9wLXpvbmUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vd29ya2JlbmNoL3NyYy9saWIvdmlldy1kbmQvdmlldy1kcm9wLXpvbmUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFDLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFrQixNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakcsT0FBTyxFQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUUzRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFFOUQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDekMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHFCQUFxQixDQUFDOzs7O0FBRTNDOzs7OztHQUtHO0FBRUgsTUFBTSxPQUFPLHFCQUFxQjtJQW1DaEMsWUFBWSxJQUE2QixFQUNyQixnQkFBaUMsRUFDakMsNEJBQXlELEVBQ3pELEtBQWE7UUFGYixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWlCO1FBQ2pDLGlDQUE0QixHQUE1Qiw0QkFBNEIsQ0FBNkI7UUFDekQsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQXRCakM7O1dBRUc7UUFFSSxpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQVN6Qjs7V0FFRztRQUVJLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQU1wRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFD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RUFBQyxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBQztnQkFRN0MsbUJBQW1CO3NCQUR6QixLQUFLO3VCQUFDLCtCQUErQjtnQkFPL0IsUUFBUTtzQkFEZCxNQUFNO3VCQUFDLG9CQUFvQjs7QUErSTlCOzs7O0dBSUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLFlBQW9CLEVBQUUsT0FBZ0M7SUFDOUUsT0FBTyxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztBQUNuRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDIzIFN3aXNzIEZlZGVyYWwgUmFpbHdheXNcbiAqXG4gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlXG4gKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMFxuICogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG5pbXBvcnQge0RpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgTmdab25lLCBPbkluaXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge2NyZWF0ZUVsZW1lbnQsIHNldFN0eWxlfSBmcm9tICcuLi9jb21tb24vZG9tLnV0aWwnO1xuaW1wb3J0IHtWaWV3RHJhZ0RhdGEsIFZpZXdEcmFnU2VydmljZX0gZnJvbSAnLi92aWV3LWRyYWcuc2VydmljZSc7XG5pbXBvcnQge3N1YnNjcmliZUlufSBmcm9tICdAc2Npb24vdG9vbGtpdC9vcGVyYXRvcnMnO1xuaW1wb3J0IHt0YWtlVW50aWxEZXN0cm95ZWR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7Vmlld0Ryb3BQbGFjZWhvbGRlclJlbmRlcmVyfSBmcm9tICcuL3ZpZXctZHJvcC1wbGFjZWhvbGRlci1yZW5kZXJlci5zZXJ2aWNlJztcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge3Rha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtBcnJheXN9IGZyb20gJ0BzY2lvbi90b29sa2l0L3V0aWwnO1xuXG4vKipcbiAqIEFkZHMgdmlldyBkcm9wIHpvbmVzIHRvIHRoZSBob3N0IGVsZW1lbnQsIGFsbG93aW5nIHZpZXdzIHRvIGJlIGRyb3BwZWQgZWl0aGVyIGluIHRoZSBub3J0aCwgZWFzdCwgc291dGgsIHdlc3Qgb3IgY2VudGVyLlxuICpcbiAqIFRoZSBkcm9wIHpvbmVzIGFyZSBhbGlnbmVkIHdpdGggdGhlIGJvdW5kcyBvZiB0aGUgaG9zdCBlbGVtZW50LCByZXF1aXJpbmcgdGhlIGhvc3QgdG8gZGVmaW5lIGEgcG9zaXRpb25pbmcgY29udGV4dC5cbiAqIElmIG5vdCBwb3NpdGlvbmVkLCB0aGUgZWxlbWVudCBpcyBjaGFuZ2VkIHRvIGJlIHBvc2l0aW9uZWQgcmVsYXRpdmUuXG4gKi9cbkBEaXJlY3RpdmUoe3NlbGVjdG9yOiAnW3diVmlld0Ryb3Bab25lXScsIHN0YW5kYWxvbmU6IHRydWV9KVxuZXhwb3J0IGNsYXNzIFZpZXdEcm9wWm9uZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfaG9zdDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgcmVnaW9ucyB3aGVyZSBhIGRyb3Agem9uZSBzaG91bGQgYmUgaW5zdGFsbGVkLiBJZiBub3Qgc2V0LCBpbnN0YWxscyBhIGRyb3Agem9uZSBpbiBldmVyeSByZWdpb24uXG4gICAqL1xuICBASW5wdXQoJ3diVmlld0Ryb3Bab25lUmVnaW9ucycpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0LXJlbmFtZVxuICBwdWJsaWMgcmVnaW9ucz86IERyb3Bab25lUmVnaW9uO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgQ1NTIGNsYXNzKGVzKSB0byBhZGQgdG8gdGhlIGRyb3Agem9uZS5cbiAgICovXG4gIEBJbnB1dCgnd2JWaWV3RHJvcFpvbmVDc3NDbGFzcycpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0LXJlbmFtZVxuICBwdWJsaWMgY3NzQ2xhc3M/OiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBkcm9wIHpvbmUsIGVpdGhlciBhcyBwZXJjZW50YWdlIHZhbHVlIFswLDFdIG9yIGFic29sdXRlIHBpeGVsIHZhbHVlLlxuICAgKi9cbiAgQElucHV0KHthbGlhczogJ3diVmlld0Ryb3Bab25lU2l6ZScsIHJlcXVpcmVkOiB0cnVlfSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taW5wdXQtcmVuYW1lXG4gIHB1YmxpYyBkcm9wWm9uZVNpemUgPSAuNTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSB2aXN1YWwgcGxhY2Vob2xkZXIgd2hlbiBkcmFnZ2luZyBhIHZpZXcgb3ZlciBhIGRyb3Agem9uZS5cbiAgICogQ2FuIGJlIGEgcGVyY2VudGFnZSB2YWx1ZSBbMCwxXSBvciBhYnNvbHV0ZSBwaXhlbCB2YWx1ZS4gSWYgbm90IHNldCwgZGVmYXVsdHMgdG8ge0BsaW5rIGRyb3Bab25lU2l6ZX0uXG4gICAqL1xuICBASW5wdXQoJ3diVmlld0Ryb3Bab25lUGxhY2Vob2xkZXJTaXplJykgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taW5wdXQtcmVuYW1lXG4gIHB1YmxpYyBkcm9wUGxhY2Vob2xkZXJTaXplPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB1cG9uIGEgdmlldyBkcm9wIGFjdGlvbi5cbiAgICovXG4gIEBPdXRwdXQoJ3diVmlld0Ryb3Bab25lRHJvcCcpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1yZW5hbWVcbiAgcHVibGljIHZpZXdEcm9wID0gbmV3IEV2ZW50RW1pdHRlcjxXYlZpZXdEcm9wRXZlbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IoaG9zdDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgICAgICAgIHByaXZhdGUgX3ZpZXdEcmFnU2VydmljZTogVmlld0RyYWdTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF92aWV3RHJvcFBsYWNlaG9sZGVyUmVuZGVyZXI6IFZpZXdEcm9wUGxhY2Vob2xkZXJSZW5kZXJlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfem9uZTogTmdab25lKSB7XG4gICAgdGhpcy5faG9zdCA9IGhvc3QubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLmluc3RhbGxEcm9wWm9uZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmVuc3VyZUhvc3RFbGVtZW50UG9zaXRpb25lZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGxzIGEgZHJvcCB6b25lIGZvciBlYWNoIHNwZWNpZmllZCByZWdpb24uXG4gICAqXG4gICAqIC0gRE9NIGVsZW1lbnRzIGZvciBkcm9wIHpvbmVzIGFyZSBjcmVhdGVkIGxhemlseSB3aGVuIGRyYWdnaW5nIGEgdmlldyBvdmVyIHRoZSBob3N0IGVsZW1lbnQuXG4gICAqIC0gV2hlbiBkcmFnZ2luZyBhIHZpZXcgb3ZlciBhIGRyb3Agem9uZSwgcmVuZGVycyB0aGUgZHJvcCBwbGFjZWhvbGRlciB1c2luZyB0aGUge0BsaW5rIFZpZXdEcm9wUGxhY2Vob2xkZXJSZW5kZXJlcn0uXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxEcm9wWm9uZXMoKTogdm9pZCB7XG4gICAgY29uc3QgZGlzcG9zYWJsZXMgPSBuZXcgQXJyYXk8RGlzcG9zZUZuPigpO1xuXG4gICAgLy8gQ3JlYXRlIGRyb3Agem9uZXMgd2hlbiBlbnRlcmluZyB0aGUgaG9zdCBlbGVtZW50LlxuICAgIHRoaXMuX3ZpZXdEcmFnU2VydmljZS52aWV3RHJhZyQodGhpcy5faG9zdCwge2V2ZW50VHlwZTogJ2RyYWdlbnRlcid9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN1YnNjcmliZUluKGZuID0+IHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZm4pKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnJlZ2lvbnMgfHwgdGhpcy5yZWdpb25zLmNlbnRlcikge1xuICAgICAgICAgIGRpc3Bvc2FibGVzLnB1c2goLi4udGhpcy5jcmVhdGVEcm9wWm9uZSgnY2VudGVyJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5yZWdpb25zIHx8IHRoaXMucmVnaW9ucy5ub3J0aCkge1xuICAgICAgICAgIGRpc3Bvc2FibGVzLnB1c2goLi4udGhpcy5jcmVhdGVEcm9wWm9uZSgnbm9ydGgnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnJlZ2lvbnMgfHwgdGhpcy5yZWdpb25zLnNvdXRoKSB7XG4gICAgICAgICAgZGlzcG9zYWJsZXMucHVzaCguLi50aGlzLmNyZWF0ZURyb3Bab25lKCdzb3V0aCcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucmVnaW9ucyB8fCB0aGlzLnJlZ2lvbnMud2VzdCkge1xuICAgICAgICAgIGRpc3Bvc2FibGVzLnB1c2goLi4udGhpcy5jcmVhdGVEcm9wWm9uZSgnd2VzdCcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucmVnaW9ucyB8fCB0aGlzLnJlZ2lvbnMuZWFzdCkge1xuICAgICAgICAgIGRpc3Bvc2FibGVzLnB1c2goLi4udGhpcy5jcmVhdGVEcm9wWm9uZSgnZWFzdCcpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAvLyBEaXNwb3NlIGRyb3Agem9uZXMgd2hlbiBsZWF2aW5nIHRoZSBob3N0IGVsZW1lbnQsIG9yIHdoZW4gdGhlIGRyYWcgb3BlcmF0aW9uIGNvbXBsZXRlcy5cbiAgICB0aGlzLl92aWV3RHJhZ1NlcnZpY2Uudmlld0RyYWckKHRoaXMuX2hvc3QsIHtldmVudFR5cGU6IFsnZHJhZ2xlYXZlJywgJ2Ryb3AnXX0pXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBkaXNwb3NhYmxlcy5mb3JFYWNoKGRpc3Bvc2VGbiA9PiBkaXNwb3NlRm4oKSk7XG4gICAgICAgIGRpc3Bvc2FibGVzLmxlbmd0aCA9IDA7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBkcm9wIHpvbmUgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVEcm9wWm9uZShyZWdpb246ICdub3J0aCcgfCAnZWFzdCcgfCAnc291dGgnIHwgJ3dlc3QnIHwgJ2NlbnRlcicpOiBEaXNwb3NlRm5bXSB7XG4gICAgY29uc3QgZHJvcFpvbmVJbnNldCA9IHRoaXMuY2FsY3VsYXRlSW5zZXQocmVnaW9uLCB0aGlzLmRyb3Bab25lU2l6ZSk7XG4gICAgY29uc3QgZHJvcFBsYWNlaG9sZGVySW5zZXQgPSB0aGlzLmNhbGN1bGF0ZUluc2V0KHJlZ2lvbiwgdGhpcy5kcm9wUGxhY2Vob2xkZXJTaXplID8/IHRoaXMuZHJvcFpvbmVTaXplKTtcbiAgICBjb25zdCBkaXNwb3NlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIGRyb3Agem9uZSBIVE1MIGVsZW1lbnQuXG4gICAgY29uc3QgZHJvcFpvbmVFbGVtZW50ID0gY3JlYXRlRWxlbWVudCgnZGl2Jywge1xuICAgICAgcGFyZW50OiB0aGlzLl9ob3N0LFxuICAgICAgY3NzQ2xhc3M6IFsnZTJlLXZpZXctZHJvcC16b25lJywgYGUyZS0ke3JlZ2lvbn1gLCAuLi5BcnJheXMuY29lcmNlKHRoaXMuY3NzQ2xhc3MpXSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICB0b3A6IGAke2Ryb3Bab25lSW5zZXQudG9wfXB4YCxcbiAgICAgICAgcmlnaHQ6IGAke2Ryb3Bab25lSW5zZXQucmlnaHR9cHhgLFxuICAgICAgICBib3R0b206IGAke2Ryb3Bab25lSW5zZXQuYm90dG9tfXB4YCxcbiAgICAgICAgbGVmdDogYCR7ZHJvcFpvbmVJbnNldC5sZWZ0fXB4YCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBJbnN0YWxsIGRyYWcgbGlzdGVuZXIgdG8gcmVuZGVyIHRoZSBkcm9wIHBsYWNlaG9sZGVyIGFuZCBoYW5kbGUgZHJvcC5cbiAgICB0aGlzLl92aWV3RHJhZ1NlcnZpY2Uudmlld0RyYWckKGRyb3Bab25lRWxlbWVudCwge2V2ZW50VHlwZTogWydkcmFnZW50ZXInLCAnZHJhZ292ZXInLCAnZHJvcCddfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzdWJzY3JpYmVJbihmbiA9PiB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKGZuKSksXG4gICAgICAgIHRha2VVbnRpbChkaXNwb3NlJCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgICAgICAgICB0aGlzLl92aWV3RHJvcFBsYWNlaG9sZGVyUmVuZGVyZXIudXBkYXRlUG9zaXRpb24odGhpcy5faG9zdCwgZHJvcFBsYWNlaG9sZGVySW5zZXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZHJhZ292ZXInOlxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gYWxsb3cgdmlldyBkcm9wXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdkcm9wJzpcbiAgICAgICAgICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHRoaXMudmlld0Ryb3AuZW1pdCh7XG4gICAgICAgICAgICAgIGRyb3BSZWdpb246IHJlZ2lvbixcbiAgICAgICAgICAgICAgZHJhZ0RhdGE6IHRoaXMuX3ZpZXdEcmFnU2VydmljZS52aWV3RHJhZ0RhdGEhLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgLy8gRGlzYWJsZSB0aGUgZHJvcCB6b25lIHdoZW4gZHJhZ2dpbmcgb3ZlciB0aGUgdGFiIGJhciwgYWxsb3dpbmcgdGhlIHVzZXIgdG8gY2hhbmdlIHRoZSB0YWIgb3JkZXIgZXZlbiBmb3IgdGFicyBjb3ZlcmVkIGJ5IHRoZSBkcm9wIHpvbmUuXG4gICAgdGhpcy5fdmlld0RyYWdTZXJ2aWNlLnRhYmJhckRyYWdPdmVyJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHN1YnNjcmliZUluKGZuID0+IHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZm4pKSxcbiAgICAgICAgdGFrZVVudGlsKGRpc3Bvc2UkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoZHJhZ092ZXJUYWJiYXIgPT4ge1xuICAgICAgICBpZiAoZHJhZ092ZXJUYWJiYXIpIHtcbiAgICAgICAgICBzZXRTdHlsZShkcm9wWm9uZUVsZW1lbnQsIHsncG9pbnRlci1ldmVudHMnOiAnbm9uZSd9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBzZXRTdHlsZShkcm9wWm9uZUVsZW1lbnQsIHsncG9pbnRlci1ldmVudHMnOiBudWxsfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgICgpID0+IGRpc3Bvc2UkLm5leHQoKSxcbiAgICAgICgpID0+IGRyb3Bab25lRWxlbWVudC5yZW1vdmUoKSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIGluc2V0IGZvciB0aGUgZHJvcCByZWdpb24gYmFzZWQgb24gdGhlIGdpdmVuIHNpemUuXG4gICAqXG4gICAqIElmIHBhc3NpbmcgYSByYXRpbyBbMCwxXSBmb3IgdGhlIHNpemUsIHRoZSBzaXplIGlzIGludGVycHJldGVkIGFzIGEgcGVyY2VudGFnZSB2YWx1ZSByZWxhdGl2ZSB0byB0aGUgc2l6ZSBvZiB0aGUgaG9zdCBlbGVtZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVJbnNldChyZWdpb246ICdub3J0aCcgfCAnZWFzdCcgfCAnc291dGgnIHwgJ3dlc3QnIHwgJ2NlbnRlcicsIHNpemU6IG51bWJlcik6IEluc2V0IHtcbiAgICByZXR1cm4ge1xuICAgICAgdG9wOiByZWdpb24gPT09ICdzb3V0aCcgPyB0aGlzLl9ob3N0LmNsaWVudEhlaWdodCAtIGNvZXJjZVBpeGVsVmFsdWUoc2l6ZSwge2NvbnRhaW5lclNpemU6IHRoaXMuX2hvc3QuY2xpZW50SGVpZ2h0fSkgOiAwLFxuICAgICAgcmlnaHQ6IHJlZ2lvbiA9PT0gJ3dlc3QnID8gdGhpcy5faG9zdC5jbGllbnRXaWR0aCAtIGNvZXJjZVBpeGVsVmFsdWUoc2l6ZSwge2NvbnRhaW5lclNpemU6IHRoaXMuX2hvc3QuY2xpZW50V2lkdGh9KSA6IDAsXG4gICAgICBib3R0b206IHJlZ2lvbiA9PT0gJ25vcnRoJyA/IHRoaXMuX2hvc3QuY2xpZW50SGVpZ2h0IC0gY29lcmNlUGl4ZWxWYWx1ZShzaXplLCB7Y29udGFpbmVyU2l6ZTogdGhpcy5faG9zdC5jbGllbnRIZWlnaHR9KSA6IDAsXG4gICAgICBsZWZ0OiByZWdpb24gPT09ICdlYXN0JyA/IHRoaXMuX2hvc3QuY2xpZW50V2lkdGggLSBjb2VyY2VQaXhlbFZhbHVlKHNpemUsIHtjb250YWluZXJTaXplOiB0aGlzLl9ob3N0LmNsaWVudFdpZHRofSkgOiAwLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUhvc3RFbGVtZW50UG9zaXRpb25lZCgpOiB2b2lkIHtcbiAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9ob3N0KS5wb3NpdGlvbiA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIHNldFN0eWxlKHRoaXMuX2hvc3QsIHsncG9zaXRpb24nOiAncmVsYXRpdmUnfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29lcmNlcyBnaXZlbiB2YWx1ZSB0byBhIENTUyBwaXhlbCB2YWx1ZS5cbiAqXG4gKiBJZiBwYXNzaW5nIGEgcmF0aW8gWzAsMV0sIGl0IGlzIGludGVycHJldGVkIGFzIGEgcGVyY2VudGFnZSB2YWx1ZSByZWxhdGl2ZSB0byB0aGUgc2l6ZSBvZiB0aGUgY29udGFpbmVyLlxuICovXG5mdW5jdGlvbiBjb2VyY2VQaXhlbFZhbHVlKHBpeGVsT3JSYXRpbzogbnVtYmVyLCBvcHRpb25zOiB7Y29udGFpbmVyU2l6ZTogbnVtYmVyfSk6IG51bWJlciB7XG4gIHJldHVybiAocGl4ZWxPclJhdGlvIDw9IDEpID8gb3B0aW9ucy5jb250YWluZXJTaXplICogcGl4ZWxPclJhdGlvIDogcGl4ZWxPclJhdGlvO1xufVxuXG4vKipcbiAqIEV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIGRyb3BwaW5nIGEgdmlldy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYlZpZXdEcm9wRXZlbnQge1xuICBkcm9wUmVnaW9uOiAnbm9ydGgnIHwgJ2Vhc3QnIHwgJ3NvdXRoJyB8ICd3ZXN0JyB8ICdjZW50ZXInO1xuICBkcmFnRGF0YTogVmlld0RyYWdEYXRhO1xufVxuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgcmVnaW9ucyB3aGVyZSBhIGRyb3Agem9uZSBzaG91bGQgYmUgaW5zdGFsbGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERyb3Bab25lUmVnaW9uIHtcbiAgbm9ydGg6IGJvb2xlYW47XG4gIHNvdXRoOiBib29sZWFuO1xuICB3ZXN0OiBib29sZWFuO1xuICBlYXN0OiBib29sZWFuO1xuICBjZW50ZXI6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGlzdGFuY2UgYmV0d2VlbiBhbiBlbGVtZW50IGFuZCB0aGUgcGFyZW50IGVsZW1lbnQuXG4gKi9cbmludGVyZmFjZSBJbnNldCB7XG4gIHRvcDogbnVtYmVyO1xuICByaWdodDogbnVtYmVyO1xuICBib3R0b206IG51bWJlcjtcbiAgbGVmdDogbnVtYmVyO1xufVxuXG50eXBlIERpc3Bvc2VGbiA9ICgpID0+IHZvaWQ7XG4iXX0=
|