@tft/interact 14.0.0 → 15.1.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/{esm2020 → esm2022}/index.mjs +5 -5
- package/{esm2020 → esm2022}/lib/directives/account-for-scale.directive.mjs +26 -26
- package/{esm2020 → esm2022}/lib/directives/apply-scale.directive.mjs +28 -28
- package/esm2022/lib/directives/auto-scroll.directive.mjs +56 -0
- package/{esm2020 → esm2022}/lib/directives/drag-preview.directive.mjs +20 -20
- package/{esm2020 → esm2022}/lib/directives/drag-root.directive.mjs +32 -32
- package/esm2022/lib/directives/draggable.directive.mjs +320 -0
- package/esm2022/lib/directives/dropzone.directive.mjs +114 -0
- package/esm2022/lib/directives/gesturable.directive.mjs +82 -0
- package/{esm2020 → esm2022}/lib/directives/index.mjs +9 -9
- package/esm2022/lib/directives/resizable.directive.mjs +228 -0
- package/{esm2020 → esm2022}/lib/interact.module.mjs +66 -66
- package/{esm2020 → esm2022}/lib/models/index.mjs +1 -1
- package/{esm2020 → esm2022}/lib/models/interact.mjs +27 -27
- package/{esm2020 → esm2022}/lib/pipes/array-of-n.pipe.mjs +22 -22
- package/{esm2020 → esm2022}/lib/pipes/index.mjs +1 -1
- package/esm2022/lib/services/interact.service.mjs +197 -0
- package/esm2022/lib/utils/helpers.mjs +35 -0
- package/{esm2020 → esm2022}/lib/utils/index.mjs +1 -1
- package/{esm2020 → esm2022}/tft-interact.mjs +4 -4
- package/{fesm2020 → fesm2022}/tft-interact.mjs +1155 -1155
- package/{fesm2020 → fesm2022}/tft-interact.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/directives/account-for-scale.directive.d.ts +15 -15
- package/lib/directives/apply-scale.directive.d.ts +11 -11
- package/lib/directives/auto-scroll.directive.d.ts +34 -34
- package/lib/directives/drag-preview.directive.d.ts +10 -10
- package/lib/directives/drag-root.directive.d.ts +15 -15
- package/lib/directives/draggable.directive.d.ts +76 -76
- package/lib/directives/dropzone.directive.d.ts +40 -40
- package/lib/directives/gesturable.directive.d.ts +27 -27
- package/lib/directives/index.d.ts +9 -9
- package/lib/directives/resizable.directive.d.ts +61 -61
- package/lib/interact.module.d.ts +20 -20
- package/lib/models/index.d.ts +1 -1
- package/lib/models/interact.d.ts +140 -140
- package/lib/pipes/array-of-n.pipe.d.ts +12 -12
- package/lib/pipes/index.d.ts +1 -1
- package/lib/services/interact.service.d.ts +83 -83
- package/lib/utils/helpers.d.ts +12 -12
- package/lib/utils/index.d.ts +1 -1
- package/package.json +7 -15
- package/tft-interact-15.1.0.tgz +0 -0
- package/esm2020/lib/directives/auto-scroll.directive.mjs +0 -56
- package/esm2020/lib/directives/draggable.directive.mjs +0 -320
- package/esm2020/lib/directives/dropzone.directive.mjs +0 -114
- package/esm2020/lib/directives/gesturable.directive.mjs +0 -82
- package/esm2020/lib/directives/resizable.directive.mjs +0 -228
- package/esm2020/lib/services/interact.service.mjs +0 -197
- package/esm2020/lib/utils/helpers.mjs +0 -35
- package/fesm2015/tft-interact.mjs +0 -1203
- package/fesm2015/tft-interact.mjs.map +0 -1
- package/tft-interact-14.0.0.tgz +0 -0
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import { Directive, ElementRef, Input, Output, EventEmitter, Optional, SkipSelf, Renderer2, ContentChild, ViewContainerRef, Inject } from '@angular/core';
|
|
2
|
+
import { DOCUMENT } from '@angular/common';
|
|
3
|
+
import interact from 'interactjs';
|
|
4
|
+
import { InteractService } from '../services/interact.service';
|
|
5
|
+
import { DropzoneDirective } from './dropzone.directive';
|
|
6
|
+
import { DEFAULT_REGISTRY_ID } from '../models';
|
|
7
|
+
import { DragPreviewDirective } from './drag-preview.directive';
|
|
8
|
+
import { getRootNode } from '../utils';
|
|
9
|
+
import { DragRootDirective } from './drag-root.directive';
|
|
10
|
+
import { AccountForScaleDirective } from './account-for-scale.directive';
|
|
11
|
+
import { AutoScrollDirective } from './auto-scroll.directive';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
import * as i1 from "../services/interact.service";
|
|
14
|
+
import * as i2 from "./account-for-scale.directive";
|
|
15
|
+
import * as i3 from "./dropzone.directive";
|
|
16
|
+
import * as i4 from "./drag-root.directive";
|
|
17
|
+
import * as i5 from "./auto-scroll.directive";
|
|
18
|
+
/** @dynamic */
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
20
|
+
export class DraggableDirective {
|
|
21
|
+
// check all the different places for scale
|
|
22
|
+
get scale() {
|
|
23
|
+
return this.account_for_scale_dir?.scale || this.drag_root_dir?.account_for_scale_dir?.scale || this.dragRoot?.account_for_scale_dir?.scale || 1;
|
|
24
|
+
}
|
|
25
|
+
constructor(el, interactService, renderer, _viewContainerRef, _document, account_for_scale_dir, dropzone_dir, drag_root_dir, auto_scroll_dir) {
|
|
26
|
+
this.el = el;
|
|
27
|
+
this.interactService = interactService;
|
|
28
|
+
this.renderer = renderer;
|
|
29
|
+
this._viewContainerRef = _viewContainerRef;
|
|
30
|
+
this._document = _document;
|
|
31
|
+
this.account_for_scale_dir = account_for_scale_dir;
|
|
32
|
+
this.dropzone_dir = dropzone_dir;
|
|
33
|
+
this.drag_root_dir = drag_root_dir;
|
|
34
|
+
this.auto_scroll_dir = auto_scroll_dir;
|
|
35
|
+
/* zIndex while dragging*/
|
|
36
|
+
this.dragZIndex = 10000;
|
|
37
|
+
this.enableDragDefault = true;
|
|
38
|
+
/**
|
|
39
|
+
* @deprecated replaced by 'dragDisabled' property, please migrate before v13
|
|
40
|
+
*/
|
|
41
|
+
this.disabled = false;
|
|
42
|
+
this.dragDisabled = false;
|
|
43
|
+
this.showPlaceholder = false;
|
|
44
|
+
// pipes all interact events to event emitters
|
|
45
|
+
this.dragStart = new EventEmitter();
|
|
46
|
+
this.dragMove = new EventEmitter();
|
|
47
|
+
this.dragInertiaStart = new EventEmitter();
|
|
48
|
+
this.dragEnd = new EventEmitter();
|
|
49
|
+
}
|
|
50
|
+
ngOnInit() {
|
|
51
|
+
this.interactable = this.initiateDragEvents(this.dragConfig, this.el.nativeElement);
|
|
52
|
+
this.dragRootEl = (this.dragRoot?.el?.nativeElement || this.drag_root_dir?.el?.nativeElement) || this._document.body;
|
|
53
|
+
// register with parent dropzone if it exists, otherwise use default
|
|
54
|
+
// this gives us a place on the registry to store our drag items that don't have a dropzone
|
|
55
|
+
this.registryId = this.dropzone_dir?.dropzoneId || DEFAULT_REGISTRY_ID;
|
|
56
|
+
// add draggable to directory and store its id
|
|
57
|
+
this.interactableId = this.interactService.addDraggableToRegistry(this.registryId, this.interactableId);
|
|
58
|
+
this.alignPositionWithInputs(this.x, this.y);
|
|
59
|
+
// cache subscription to interactable state so we can unsubscribe onDestroy
|
|
60
|
+
this.interactableState = this.interactService
|
|
61
|
+
.getInteractableState(this.interactableId, this.registryId);
|
|
62
|
+
// keep our cached position values in line with our drag state
|
|
63
|
+
this.interactableSubscription = this.interactableState.subscribe((state) => {
|
|
64
|
+
this.y = state.y;
|
|
65
|
+
this.x = state.x;
|
|
66
|
+
});
|
|
67
|
+
this.setDragConfig();
|
|
68
|
+
}
|
|
69
|
+
// TODO: watch config here as well and update interactable
|
|
70
|
+
ngOnChanges(changes) {
|
|
71
|
+
// we do this here instead of using a setter on the input so that it
|
|
72
|
+
// will only run once when there is a change to x and y
|
|
73
|
+
if (changes.y || changes.x) {
|
|
74
|
+
this.alignPositionWithInputs(this.x, this.y);
|
|
75
|
+
}
|
|
76
|
+
if (changes.dragConfig || changes.disabled || changes.dragDisabled) {
|
|
77
|
+
if (!this.interactable)
|
|
78
|
+
return;
|
|
79
|
+
this.setDragConfig();
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* @deprecated remove this in v13
|
|
83
|
+
*/
|
|
84
|
+
if (changes.disabled) {
|
|
85
|
+
console.warn(`It looks like your using the 'disabled' input on a tftDraggable directive, it has been deprecated and is replaced with 'dragDisabled', please migrate by v13`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
setDragConfig() {
|
|
89
|
+
const enabled = !(this.disabled || this.dragDisabled);
|
|
90
|
+
const dragConfig = { ...this.dragConfig, enabled };
|
|
91
|
+
this.interactable.draggable(dragConfig);
|
|
92
|
+
}
|
|
93
|
+
ngAfterViewInit() {
|
|
94
|
+
this.addDragPropertiesToElement(this.el.nativeElement);
|
|
95
|
+
if (!this.dropzone_dir) {
|
|
96
|
+
this.previewRef = this.el.nativeElement;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
ngOnDestroy() {
|
|
100
|
+
// clean up state and subscriptions related to destroyed component
|
|
101
|
+
this.interactableSubscription.unsubscribe();
|
|
102
|
+
this.interactService.destroyInteractable(this.interactableId, this.registryId);
|
|
103
|
+
}
|
|
104
|
+
dragMoveListener(event, element) {
|
|
105
|
+
const { dx, dy } = event;
|
|
106
|
+
const scale = this.scale;
|
|
107
|
+
const deltaX = scale ? dx / scale : dx;
|
|
108
|
+
const deltaY = scale ? dy / scale : dy;
|
|
109
|
+
this.interactService.updateDeltas(this.interactableId, this.registryId, { deltaX, deltaY }, element);
|
|
110
|
+
}
|
|
111
|
+
setDragStyles(dragElement) {
|
|
112
|
+
this.renderer.setStyle(dragElement, 'touchAction', 'none');
|
|
113
|
+
this.renderer.setStyle(dragElement, 'zIndex', this.dragZIndex);
|
|
114
|
+
this.renderer.setStyle(dragElement, 'position', 'absolute');
|
|
115
|
+
}
|
|
116
|
+
addDragPropertiesToElement(nativeElement) {
|
|
117
|
+
this.renderer.setProperty(nativeElement, 'dropTarget', this.dropzone_dir || null);
|
|
118
|
+
this.renderer.setProperty(nativeElement, 'dragOrigin', this.dropzone_dir || null);
|
|
119
|
+
this.renderer.setProperty(nativeElement, 'dragRef', this);
|
|
120
|
+
}
|
|
121
|
+
mapDragEvent(event) {
|
|
122
|
+
const { target, dropzone } = event;
|
|
123
|
+
const dropzoneElement = dropzone?.target || target.dropTarget?.el.nativeElement;
|
|
124
|
+
const scale = this.scale;
|
|
125
|
+
const positionInDropTarget = target && dropzoneElement
|
|
126
|
+
? this.interactService.calculatePositionInElement(dropzoneElement, this.previewRef, scale)
|
|
127
|
+
: null;
|
|
128
|
+
return {
|
|
129
|
+
interactEvent: event,
|
|
130
|
+
dragRef: this,
|
|
131
|
+
dragOrigin: target.dragOrigin,
|
|
132
|
+
dropTarget: target.dropTarget,
|
|
133
|
+
positionInDropTarget
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
setPosition(x, y) {
|
|
137
|
+
this.interactService.updatePosition(this.interactableId, this.registryId, { x, y }, this.el.nativeElement);
|
|
138
|
+
}
|
|
139
|
+
alignPositionWithInputs(x, y) {
|
|
140
|
+
// short circuit if positions aren't numbers or if they haven't changed
|
|
141
|
+
if (!this.isValidPosition(x, y))
|
|
142
|
+
return;
|
|
143
|
+
this.interactService.updatePosition(this.interactableId, this.registryId, { x, y }, this.el.nativeElement);
|
|
144
|
+
}
|
|
145
|
+
isValidPosition(x, y) {
|
|
146
|
+
return this.isNumeric(x) && this.isNumeric(y);
|
|
147
|
+
}
|
|
148
|
+
// We use use this instead of isNaN here to try and help performance
|
|
149
|
+
// We should be able to reliably restrict to numbers or falsey values
|
|
150
|
+
isNumeric(num) {
|
|
151
|
+
return typeof num === 'number' && !isNaN(num);
|
|
152
|
+
}
|
|
153
|
+
initiateDragEvents(dragConfig, nativeElement) {
|
|
154
|
+
const defaultDragConfig = {
|
|
155
|
+
...dragConfig,
|
|
156
|
+
enabled: !(this.disabled || this.dragDisabled),
|
|
157
|
+
...(this.auto_scroll_dir && {
|
|
158
|
+
autoScroll: {
|
|
159
|
+
...this.auto_scroll_dir.autoScrollConfig,
|
|
160
|
+
container: this.auto_scroll_dir.el.nativeElement
|
|
161
|
+
}
|
|
162
|
+
})
|
|
163
|
+
};
|
|
164
|
+
return interact(nativeElement).draggable(defaultDragConfig)
|
|
165
|
+
.on('dragstart', (event) => {
|
|
166
|
+
const interaction = event.interaction;
|
|
167
|
+
// check if we should append drag element to body
|
|
168
|
+
if (this.enableDragDefault
|
|
169
|
+
&& interaction.pointerIsDown
|
|
170
|
+
// TODO: probably don't need following condition checks anymore remove by 2022
|
|
171
|
+
// && !!this.dropzone_dir
|
|
172
|
+
// && !interaction.interacting()
|
|
173
|
+
) {
|
|
174
|
+
if (this._previewTemplate) {
|
|
175
|
+
const viewRef = this._viewContainerRef.createEmbeddedView(this._previewTemplate.templateRef);
|
|
176
|
+
this.previewRef = getRootNode(viewRef, this._document);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
this.previewRef = cloneElement(this.el.nativeElement);
|
|
180
|
+
}
|
|
181
|
+
this.addDragPropertiesToElement(this.previewRef);
|
|
182
|
+
this.setDragStyles(this.previewRef);
|
|
183
|
+
this.dragRootEl.prepend(this.previewRef);
|
|
184
|
+
const scale = this.account_for_scale_dir?.scale || this.dragRoot?.account_for_scale_dir?.scale || 1;
|
|
185
|
+
const { x, y } = this.interactService.calculatePositionInElement(this.dragRootEl, nativeElement, scale);
|
|
186
|
+
this.interactService.updatePosition(this.interactableId, this.registryId, { x, y }, this.previewRef);
|
|
187
|
+
if (!this.showPlaceholder) {
|
|
188
|
+
this.renderer.setStyle(this.el.nativeElement, 'display', 'none');
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// subscribe to scroll events if they are there, by only subscribing on dragstart we avoid wasting subscriptions on interactables that aren't be dragged
|
|
192
|
+
if (this.auto_scroll_dir) {
|
|
193
|
+
this.subscribeToScrollEvents();
|
|
194
|
+
}
|
|
195
|
+
this.dragStart.emit(this.mapDragEvent(event));
|
|
196
|
+
})
|
|
197
|
+
.on('dragmove', (event) => {
|
|
198
|
+
if (this.enableDragDefault) {
|
|
199
|
+
const dragElement = this.dropzone_dir && this.previewRef || nativeElement;
|
|
200
|
+
this.dragMoveListener(event, dragElement);
|
|
201
|
+
}
|
|
202
|
+
const mappedEvent = this.mapDragEvent(event);
|
|
203
|
+
this.dragMove.emit(mappedEvent);
|
|
204
|
+
})
|
|
205
|
+
.on('draginertiastart', (event) => {
|
|
206
|
+
this.dragInertiaStart.emit(this.mapDragEvent(event));
|
|
207
|
+
})
|
|
208
|
+
.on('dragend', (event) => {
|
|
209
|
+
const mappedEvent = this.mapDragEvent(event);
|
|
210
|
+
if (!!this.dropzone_dir && this.dropzone_dir === event.target.dropTarget) {
|
|
211
|
+
const { x, y } = mappedEvent.positionInDropTarget;
|
|
212
|
+
this.setPosition(x, y);
|
|
213
|
+
}
|
|
214
|
+
this.renderer.setStyle(this.el.nativeElement, 'display', '');
|
|
215
|
+
this.dragEnd.emit(mappedEvent);
|
|
216
|
+
// unsubscribe from scroll events if subscribed
|
|
217
|
+
if (this.auto_scroll_dir) {
|
|
218
|
+
this.scrollEventsSubscription.unsubscribe();
|
|
219
|
+
}
|
|
220
|
+
if (this.el.nativeElement !== this.previewRef) {
|
|
221
|
+
// we do this in a timeout, so that we don't remove before the dropzone can get the boundingElementRect
|
|
222
|
+
setTimeout(() => {
|
|
223
|
+
this.dragRootEl.removeChild(this.previewRef);
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
subscribeToScrollEvents() {
|
|
229
|
+
this.scrollEventsSubscription = this.auto_scroll_dir.scrollDeltaObserver.subscribe(({ scrollLeft, scrollTop }) => {
|
|
230
|
+
const deltaX = this.scale ? scrollLeft / this.scale : scrollLeft;
|
|
231
|
+
const deltaY = this.scale ? scrollTop / this.scale : scrollTop;
|
|
232
|
+
this.interactService.updateDeltas(this.interactableId, this.registryId, { deltaX, deltaY }, this.previewRef);
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: DraggableDirective, deps: [{ token: i0.ElementRef }, { token: i1.InteractService }, { token: i0.Renderer2 }, { token: i0.ViewContainerRef }, { token: DOCUMENT }, { token: i2.AccountForScaleDirective, optional: true }, { token: i3.DropzoneDirective, optional: true, skipSelf: true }, { token: i4.DragRootDirective, optional: true, skipSelf: true }, { token: i5.AutoScrollDirective, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
236
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.3", type: DraggableDirective, selector: "[tftDraggable]", inputs: { x: "x", y: "y", dragZIndex: "dragZIndex", zIndex: "zIndex", interactableId: "interactableId", dragData: "dragData", enableDragDefault: "enableDragDefault", disabled: "disabled", dragDisabled: "dragDisabled", dragConfig: "dragConfig", showPlaceholder: "showPlaceholder", dragRoot: "dragRoot" }, outputs: { dragStart: "dragStart", dragMove: "dragMove", dragInertiaStart: "dragInertiaStart", dragEnd: "dragEnd" }, host: { properties: { "style.touchAction": "this.dragDisabled ? \"auto\" : \"none\"", "style.position": "\"absolute\"", "id": "interactableId" } }, queries: [{ propertyName: "_previewTemplate", first: true, predicate: DragPreviewDirective, descendants: true }], usesOnChanges: true, ngImport: i0 }); }
|
|
237
|
+
}
|
|
238
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: DraggableDirective, decorators: [{
|
|
239
|
+
type: Directive,
|
|
240
|
+
args: [{
|
|
241
|
+
selector: '[tftDraggable]',
|
|
242
|
+
// eslint-disable-next-line @angular-eslint/no-host-metadata-property
|
|
243
|
+
host: {
|
|
244
|
+
'[style.touchAction]': 'this.dragDisabled ? "auto" : "none"',
|
|
245
|
+
'[style.position]': '"absolute"',
|
|
246
|
+
'[id]': 'interactableId',
|
|
247
|
+
}
|
|
248
|
+
}]
|
|
249
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.InteractService }, { type: i0.Renderer2 }, { type: i0.ViewContainerRef }, { type: Document, decorators: [{
|
|
250
|
+
type: Inject,
|
|
251
|
+
args: [DOCUMENT]
|
|
252
|
+
}] }, { type: i2.AccountForScaleDirective, decorators: [{
|
|
253
|
+
type: Optional
|
|
254
|
+
}] }, { type: i3.DropzoneDirective, decorators: [{
|
|
255
|
+
type: Optional
|
|
256
|
+
}, {
|
|
257
|
+
type: SkipSelf
|
|
258
|
+
}] }, { type: i4.DragRootDirective, decorators: [{
|
|
259
|
+
type: Optional
|
|
260
|
+
}, {
|
|
261
|
+
type: SkipSelf
|
|
262
|
+
}] }, { type: i5.AutoScrollDirective, decorators: [{
|
|
263
|
+
type: Optional
|
|
264
|
+
}, {
|
|
265
|
+
type: SkipSelf
|
|
266
|
+
}] }], propDecorators: { x: [{
|
|
267
|
+
type: Input
|
|
268
|
+
}], y: [{
|
|
269
|
+
type: Input
|
|
270
|
+
}], dragZIndex: [{
|
|
271
|
+
type: Input
|
|
272
|
+
}], zIndex: [{
|
|
273
|
+
type: Input
|
|
274
|
+
}], interactableId: [{
|
|
275
|
+
type: Input
|
|
276
|
+
}], dragData: [{
|
|
277
|
+
type: Input
|
|
278
|
+
}], enableDragDefault: [{
|
|
279
|
+
type: Input
|
|
280
|
+
}], disabled: [{
|
|
281
|
+
type: Input
|
|
282
|
+
}], dragDisabled: [{
|
|
283
|
+
type: Input
|
|
284
|
+
}], dragConfig: [{
|
|
285
|
+
type: Input
|
|
286
|
+
}], showPlaceholder: [{
|
|
287
|
+
type: Input
|
|
288
|
+
}], dragRoot: [{
|
|
289
|
+
type: Input
|
|
290
|
+
}], dragStart: [{
|
|
291
|
+
type: Output
|
|
292
|
+
}], dragMove: [{
|
|
293
|
+
type: Output
|
|
294
|
+
}], dragInertiaStart: [{
|
|
295
|
+
type: Output
|
|
296
|
+
}], dragEnd: [{
|
|
297
|
+
type: Output
|
|
298
|
+
}], _previewTemplate: [{
|
|
299
|
+
type: ContentChild,
|
|
300
|
+
args: [DragPreviewDirective]
|
|
301
|
+
}] } });
|
|
302
|
+
/**
|
|
303
|
+
* Component utils
|
|
304
|
+
*/
|
|
305
|
+
// create a clone of the component passed in and add it to the root component
|
|
306
|
+
function cloneElement(element) {
|
|
307
|
+
const clone = element.cloneNode(true);
|
|
308
|
+
clone.removeAttribute('id');
|
|
309
|
+
return clone;
|
|
310
|
+
}
|
|
311
|
+
function getPreviewInsertionPoint(documentRef) {
|
|
312
|
+
// We can't use the body if the user is in fullscreen mode,
|
|
313
|
+
// because the preview will render under the fullscreen element.
|
|
314
|
+
return documentRef.fullscreenElement ||
|
|
315
|
+
documentRef.webkitFullscreenElement ||
|
|
316
|
+
documentRef.mozFullScreenElement ||
|
|
317
|
+
documentRef.msFullscreenElement ||
|
|
318
|
+
documentRef.body;
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvaW50ZXJhY3Qvc3JjL2xpYi9kaXJlY3RpdmVzL2RyYWdnYWJsZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFDdkMsWUFBWSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUE0QixZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUNsSyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDMUMsT0FBTyxRQUFRLE1BQU0sWUFBWSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUcvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQTZCLG1CQUFtQixFQUE0QixNQUFNLFdBQVcsQ0FBQztBQUNyRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7Ozs7O0FBRTlELGVBQWU7QUFVZiw4REFBOEQ7QUFDOUQsTUFBTSxPQUFPLGtCQUFrQjtJQTRDN0IsMkNBQTJDO0lBQzNDLElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLHFCQUFxQixFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLHFCQUFxQixFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDbkosQ0FBQztJQUVELFlBQ1MsRUFBYyxFQUNiLGVBQWdDLEVBQ2hDLFFBQW1CLEVBQ25CLGlCQUFtQyxFQUNqQixTQUFtQixFQUMxQixxQkFBZ0QsRUFDcEMsWUFBZ0MsRUFDaEMsYUFBaUMsRUFDakMsZUFBcUM7UUFSN0QsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNiLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBa0I7UUFDakIsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQUMxQiwwQkFBcUIsR0FBckIscUJBQXFCLENBQTJCO1FBQ3BDLGlCQUFZLEdBQVosWUFBWSxDQUFvQjtRQUNoQyxrQkFBYSxHQUFiLGFBQWEsQ0FBb0I7UUFDakMsb0JBQWUsR0FBZixlQUFlLENBQXNCO1FBckR0RSwwQkFBMEI7UUFDakIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUtuQixzQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDbEM7O1dBRUc7UUFDTSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRXJCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBVWpDLDhDQUE4QztRQUNwQyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQWdCLENBQUM7UUFDN0MsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFnQixDQUFDO1FBQzVDLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFnQixDQUFDO1FBQ3BELFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBZ0IsQ0FBQztJQTJCakQsQ0FBQztJQUVMLFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsRUFBRSxhQUFhLENBQWdCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFDcEksb0VBQW9FO1FBQ3BFLDJGQUEyRjtRQUMzRixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsVUFBVSxJQUFJLG1CQUFtQixDQUFDO1FBQ3ZFLDhDQUE4QztRQUM5QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDeEcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdDLDJFQUEyRTtRQUMzRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGVBQWU7YUFDMUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUQsOERBQThEO1FBQzlELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDekUsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsMERBQTBEO0lBQzFELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxvRUFBb0U7UUFDcEUsdURBQXVEO1FBQ3ZELElBQUcsT0FBTyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFDRCxJQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEUsSUFBRyxDQUFDLElBQUksQ0FBQyxZQUFZO2dCQUFFLE9BQU87WUFDOUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFDRDs7V0FFRztRQUNILElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsOEpBQThKLENBQUMsQ0FBQTtRQUM5SyxDQUFDO0lBQ0gsQ0FBQztJQUVELGFBQWE7UUFDWCxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDckQsTUFBTSxVQUFVLEdBQUcsRUFBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDMUMsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1Qsa0VBQWtFO1FBQ2xFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFrQixFQUFFLE9BQXlCO1FBQzVELE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQy9CLElBQUksQ0FBQyxjQUFjLEVBQ25CLElBQUksQ0FBQyxVQUFVLEVBQ2YsRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFDLEVBQ2hCLE9BQU8sQ0FDUixDQUFDO0lBQ0osQ0FBQztJQUVELGFBQWEsQ0FBQyxXQUF3QjtRQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQzFELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzlELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFDN0QsQ0FBQztJQUVELDBCQUEwQixDQUFDLGFBQTZCO1FBQ3RELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsQ0FBQztRQUNsRixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQWtCO1FBQzdCLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBQ25DLE1BQU0sZUFBZSxHQUFHLFFBQVEsRUFBRSxNQUFNLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDO1FBQ2hGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekIsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLElBQUksZUFBZTtZQUNwRCxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQywwQkFBMEIsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUM7WUFDMUYsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNULE9BQU87WUFDTCxhQUFhLEVBQUUsS0FBSztZQUNwQixPQUFPLEVBQUUsSUFBSTtZQUNiLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtZQUM3QixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7WUFDN0Isb0JBQW9CO1NBQ3JCLENBQUE7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLENBQVMsRUFBRSxDQUFTO1FBQzlCLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUNqQyxJQUFJLENBQUMsY0FBYyxFQUNuQixJQUFJLENBQUMsVUFBVSxFQUNmLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBQyxFQUNOLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUN0QixDQUFDO0lBQ0osQ0FBQztJQUVELHVCQUF1QixDQUFDLENBQVMsRUFBRSxDQUFTO1FBQzFDLHdFQUF3RTtRQUN4RSxJQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQUUsT0FBTztRQUN2QyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FDakMsSUFBSSxDQUFDLGNBQWMsRUFDbkIsSUFBSSxDQUFDLFVBQVUsRUFDZixFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUMsRUFDTixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FDdEIsQ0FBQztJQUNKLENBQUM7SUFFRCxlQUFlLENBQUMsQ0FBUyxFQUFFLENBQVM7UUFDbEMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUNELG9FQUFvRTtJQUNwRSxxRUFBcUU7SUFDckUsU0FBUyxDQUFDLEdBQVc7UUFDbkIsT0FBTyxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELGtCQUFrQixDQUFDLFVBQXlELEVBQUUsYUFBMEI7UUFDdEcsTUFBTSxpQkFBaUIsR0FBRztZQUN4QixHQUFHLFVBQVU7WUFDYixPQUFPLEVBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQztZQUMvQyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSTtnQkFDMUIsVUFBVSxFQUNSO29CQUNFLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0I7b0JBQ3hDLFNBQVMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxhQUE0QjtpQkFDaEU7YUFDRixDQUNGO1NBQ0YsQ0FBQztRQUNGLE9BQU8sUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQzthQUN4RCxFQUFFLENBQUMsV0FBVyxFQUFHLENBQUMsS0FBa0IsRUFBRSxFQUFFO1lBQ3ZDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7WUFDdEMsaURBQWlEO1lBQ2pELElBQUssSUFBSSxDQUFDLGlCQUFpQjttQkFDdEIsV0FBVyxDQUFDLGFBQWE7WUFDNUIsOEVBQThFO1lBQzlFLHlCQUF5QjtZQUN6QixnQ0FBZ0M7Y0FDOUIsQ0FBQztnQkFDSCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO29CQUMxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUM3RixJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN6RCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLFVBQVUsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDeEQsQ0FBQztnQkFDRCxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtnQkFFbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN6QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUscUJBQXFCLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztnQkFDcEcsTUFBTSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN0RyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNuRyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ25FLENBQUM7WUFDSCxDQUFDO1lBQ0Qsd0pBQXdKO1lBQ3hKLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUNqQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQzthQUNELEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxLQUFrQixFQUFFLEVBQUU7WUFDckMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLGFBQWEsQ0FBQTtnQkFDekUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztZQUM1QyxDQUFDO1lBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUM7YUFDRCxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxLQUFrQixFQUFFLEVBQUU7WUFDN0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDdEQsQ0FBQyxDQUFDO2FBQ0QsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQWtCLEVBQUUsRUFBRTtZQUNwQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQzVDLElBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN4RSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBQyxHQUFHLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekIsQ0FBQztZQUNELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMvQiwrQ0FBK0M7WUFDL0MsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM5QyxDQUFDO1lBQ0QsSUFBSyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsS0FBSyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQy9DLHVHQUF1RztnQkFDdkcsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDZCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQy9DLENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELHVCQUF1QjtRQUNyQixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUMsRUFBRSxFQUFFO1lBQzdHLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7WUFDakUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUUvRCxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FDL0IsSUFBSSxDQUFDLGNBQWMsRUFDbkIsSUFBSSxDQUFDLFVBQVUsRUFDZixFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUMsRUFDaEIsSUFBSSxDQUFDLFVBQVUsQ0FDaEIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBRUwsQ0FBQzs4R0F6UlUsa0JBQWtCLG9JQXNEbkIsUUFBUTtrR0F0RFAsa0JBQWtCLDZwQkFrQ2Ysb0JBQW9COzsyRkFsQ3ZCLGtCQUFrQjtrQkFWOUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixxRUFBcUU7b0JBQ3JFLElBQUksRUFBRTt3QkFDSixxQkFBcUIsRUFBRSxxQ0FBcUM7d0JBQzVELGtCQUFrQixFQUFFLFlBQVk7d0JBQ2hDLE1BQU0sRUFBRSxnQkFBZ0I7cUJBQ3pCO2lCQUNGOzswQkF3REksTUFBTTsyQkFBQyxRQUFROzswQkFDZixRQUFROzswQkFDUixRQUFROzswQkFBSSxRQUFROzswQkFDcEIsUUFBUTs7MEJBQUksUUFBUTs7MEJBQ3BCLFFBQVE7OzBCQUFJLFFBQVE7eUNBdkRkLENBQUM7c0JBQVQsS0FBSztnQkFDRyxDQUFDO3NCQUFULEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFJRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQU9HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSUksU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNO2dCQUU2QixnQkFBZ0I7c0JBQW5ELFlBQVk7dUJBQUMsb0JBQW9COztBQTBQcEM7O0dBRUc7QUFDSCw2RUFBNkU7QUFDN0UsU0FBUyxZQUFZLENBQUMsT0FBb0I7SUFDeEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQWdCLENBQUM7SUFDckQsS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFDRCxTQUFTLHdCQUF3QixDQUFDLFdBQWdCO0lBQ2hELDJEQUEyRDtJQUMzRCxnRUFBZ0U7SUFDaEUsT0FBTyxXQUFXLENBQUMsaUJBQWlCO1FBQzdCLFdBQVcsQ0FBQyx1QkFBdUI7UUFDbkMsV0FBVyxDQUFDLG9CQUFvQjtRQUNoQyxXQUFXLENBQUMsbUJBQW1CO1FBQy9CLFdBQVcsQ0FBQyxJQUFJLENBQUM7QUFDMUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LFxuICAgT25EZXN0cm95LCBFdmVudEVtaXR0ZXIsIE9wdGlvbmFsLCBTa2lwU2VsZiwgUmVuZGVyZXIyLCBTaW1wbGVDaGFuZ2VzLCBPbkNoYW5nZXMsIENvbnRlbnRDaGlsZCwgVmlld0NvbnRhaW5lclJlZiwgSW5qZWN0LCBBZnRlclZpZXdJbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbidcbmltcG9ydCBpbnRlcmFjdCBmcm9tICdpbnRlcmFjdGpzJztcbmltcG9ydCB7IEludGVyYWN0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2ludGVyYWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRHJhZ2dhYmxlT3B0aW9ucywgSW50ZXJhY3RhYmxlIH0gZnJvbSAnQGludGVyYWN0anMvdHlwZXMvaW5kZXgnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEcm9wem9uZURpcmVjdGl2ZSB9IGZyb20gJy4vZHJvcHpvbmUuZGlyZWN0aXZlJztcbmltcG9ydCB7IE5nRHJhZ0V2ZW50LCBUZnREcmFnRXZlbnQsIERFRkFVTFRfUkVHSVNUUllfSUQsIFRmdENvb3JkcywgVGZ0RHJhZ0VsZW1lbnR9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBEcmFnUHJldmlld0RpcmVjdGl2ZSB9IGZyb20gJy4vZHJhZy1wcmV2aWV3LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBnZXRSb290Tm9kZSB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IERyYWdSb290RGlyZWN0aXZlIH0gZnJvbSAnLi9kcmFnLXJvb3QuZGlyZWN0aXZlJztcbmltcG9ydCB7IEFjY291bnRGb3JTY2FsZURpcmVjdGl2ZSB9IGZyb20gJy4vYWNjb3VudC1mb3Itc2NhbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IEF1dG9TY3JvbGxEaXJlY3RpdmUgfSBmcm9tICcuL2F1dG8tc2Nyb2xsLmRpcmVjdGl2ZSc7XG5cbi8qKiBAZHluYW1pYyAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3RmdERyYWdnYWJsZV0nLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWhvc3QtbWV0YWRhdGEtcHJvcGVydHlcbiAgaG9zdDoge1xuICAgICdbc3R5bGUudG91Y2hBY3Rpb25dJzogJ3RoaXMuZHJhZ0Rpc2FibGVkID8gXCJhdXRvXCIgOiBcIm5vbmVcIicsXG4gICAgJ1tzdHlsZS5wb3NpdGlvbl0nOiAnXCJhYnNvbHV0ZVwiJyxcbiAgICAnW2lkXSc6ICdpbnRlcmFjdGFibGVJZCcsXG4gIH1cbn0pXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIERyYWdnYWJsZURpcmVjdGl2ZTxEID0gYW55PiBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xuXG5cbiAgQElucHV0KCkgeDogbnVtYmVyO1xuICBASW5wdXQoKSB5OiBudW1iZXI7XG4gIC8qIHpJbmRleCB3aGlsZSBkcmFnZ2luZyovXG4gIEBJbnB1dCgpIGRyYWdaSW5kZXggPSAxMDAwMDtcbiAgLyoqIHpJbmRleCB3aGlsZSBhdCByZXN0ICovXG4gIEBJbnB1dCgpIHpJbmRleDogbnVtYmVyXG4gIEBJbnB1dCgpIGludGVyYWN0YWJsZUlkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRyYWdEYXRhOiBEO1xuICBASW5wdXQoKSBlbmFibGVEcmFnRGVmYXVsdCA9IHRydWU7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSAnZHJhZ0Rpc2FibGVkJyBwcm9wZXJ0eSwgcGxlYXNlIG1pZ3JhdGUgYmVmb3JlIHYxM1xuICAgKi9cbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgZHJhZ0Rpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRyYWdDb25maWc6IFBhcnRpYWw8SW50ZXJhY3QuT3JCb29sZWFuPERyYWdnYWJsZU9wdGlvbnM+PjtcbiAgQElucHV0KCkgc2hvd1BsYWNlaG9sZGVyID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHdlIHdhbnQgdG8gcHJlcGVuZCB0aGUgZHJhZyBlbGVtZW50IHRvLlxuICAgKiBVc2UgYHRmdERyYWdSb290YCBkaXJlY3RpdmUgb24gYSBwYXJlbnQgZWxlbWVudCB0byBzZXQgY3VzdG9tIHJvb3QgZWxlbWVudFxuICAgKiAgQGRlZmF1bHQgZG9jdW1lbnQuYm9keVxuICAgKi9cbiAgQElucHV0KCkgZHJhZ1Jvb3Q6IERyYWdSb290RGlyZWN0aXZlOyAvLyBIVE1MRWxlbWVudDtcblxuICBwcml2YXRlIGRyYWdSb290RWw6IEhUTUxFbGVtZW50O1xuICAvLyBwaXBlcyBhbGwgaW50ZXJhY3QgZXZlbnRzIHRvIGV2ZW50IGVtaXR0ZXJzXG4gIEBPdXRwdXQoKSBkcmFnU3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyPFRmdERyYWdFdmVudD4oKTtcbiAgQE91dHB1dCgpIGRyYWdNb3ZlID0gbmV3IEV2ZW50RW1pdHRlcjxUZnREcmFnRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBkcmFnSW5lcnRpYVN0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcjxUZnREcmFnRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBkcmFnRW5kID0gbmV3IEV2ZW50RW1pdHRlcjxUZnREcmFnRXZlbnQ+KCk7XG5cbiAgQENvbnRlbnRDaGlsZChEcmFnUHJldmlld0RpcmVjdGl2ZSkgX3ByZXZpZXdUZW1wbGF0ZTogRHJhZ1ByZXZpZXdEaXJlY3RpdmU7XG4gIC8vIGRyYWdQcmV2aWV3OiBJbnRlcmFjdC5FbGVtZW50O1xuICBpbnRlcmFjdGFibGVTdGF0ZTogT2JzZXJ2YWJsZTxUZnRDb29yZHM+O1xuICBpbnRlcmFjdGFibGU6IEludGVyYWN0YWJsZTtcbiAgcHJpdmF0ZSByZWdpc3RyeUlkOiBzdHJpbmc7XG4gIHByaXZhdGUgaW50ZXJhY3RhYmxlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgc2Nyb2xsRXZlbnRzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgLy8gY2FjaGUgaG9sZGluZyBlbGVtZW50IHRvIHVzZSBhcyBkcmFnIHByZXZpZXcgKHRoZSBlbGVtZW50IHRoZSB1c2VyIHNlZXMgYmVpbmcgZHJhZ2dlZCBhcm91bmQpXG4gIHByZXZpZXdSZWY6IFRmdERyYWdFbGVtZW50O1xuICAvLyBjaGVjayBhbGwgdGhlIGRpZmZlcmVudCBwbGFjZXMgZm9yIHNjYWxlXG4gIGdldCBzY2FsZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFjY291bnRfZm9yX3NjYWxlX2Rpcj8uc2NhbGUgfHwgdGhpcy5kcmFnX3Jvb3RfZGlyPy5hY2NvdW50X2Zvcl9zY2FsZV9kaXI/LnNjYWxlIHx8IHRoaXMuZHJhZ1Jvb3Q/LmFjY291bnRfZm9yX3NjYWxlX2Rpcj8uc2NhbGUgfHwgMTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGludGVyYWN0U2VydmljZTogSW50ZXJhY3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50OiBEb2N1bWVudCxcbiAgICBAT3B0aW9uYWwoKSBwdWJsaWMgYWNjb3VudF9mb3Jfc2NhbGVfZGlyPzogQWNjb3VudEZvclNjYWxlRGlyZWN0aXZlLFxuICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpIHB1YmxpYyBkcm9wem9uZV9kaXI/OiBEcm9wem9uZURpcmVjdGl2ZSxcbiAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSBwdWJsaWMgZHJhZ19yb290X2Rpcj86IERyYWdSb290RGlyZWN0aXZlLFxuICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpIHB1YmxpYyBhdXRvX3Njcm9sbF9kaXI/OiBBdXRvU2Nyb2xsRGlyZWN0aXZlXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbnRlcmFjdGFibGUgPSB0aGlzLmluaXRpYXRlRHJhZ0V2ZW50cyh0aGlzLmRyYWdDb25maWcsIHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XG4gICAgdGhpcy5kcmFnUm9vdEVsID0gKHRoaXMuZHJhZ1Jvb3Q/LmVsPy5uYXRpdmVFbGVtZW50IHx8IHRoaXMuZHJhZ19yb290X2Rpcj8uZWw/Lm5hdGl2ZUVsZW1lbnQpIGFzIEhUTUxFbGVtZW50IHx8IHRoaXMuX2RvY3VtZW50LmJvZHk7XG4gICAgLy8gcmVnaXN0ZXIgd2l0aCBwYXJlbnQgZHJvcHpvbmUgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgdXNlIGRlZmF1bHRcbiAgICAvLyB0aGlzIGdpdmVzIHVzIGEgcGxhY2Ugb24gdGhlIHJlZ2lzdHJ5IHRvIHN0b3JlIG91ciBkcmFnIGl0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSBhIGRyb3B6b25lXG4gICAgdGhpcy5yZWdpc3RyeUlkID0gdGhpcy5kcm9wem9uZV9kaXI/LmRyb3B6b25lSWQgfHwgREVGQVVMVF9SRUdJU1RSWV9JRDtcbiAgICAvLyBhZGQgZHJhZ2dhYmxlIHRvIGRpcmVjdG9yeSBhbmQgc3RvcmUgaXRzIGlkXG4gICAgdGhpcy5pbnRlcmFjdGFibGVJZCA9IHRoaXMuaW50ZXJhY3RTZXJ2aWNlLmFkZERyYWdnYWJsZVRvUmVnaXN0cnkodGhpcy5yZWdpc3RyeUlkLCB0aGlzLmludGVyYWN0YWJsZUlkKTtcbiAgICB0aGlzLmFsaWduUG9zaXRpb25XaXRoSW5wdXRzKHRoaXMueCwgdGhpcy55KTtcbiAgICAvLyBjYWNoZSBzdWJzY3JpcHRpb24gdG8gaW50ZXJhY3RhYmxlIHN0YXRlIHNvIHdlIGNhbiB1bnN1YnNjcmliZSBvbkRlc3Ryb3lcbiAgICB0aGlzLmludGVyYWN0YWJsZVN0YXRlID0gdGhpcy5pbnRlcmFjdFNlcnZpY2VcbiAgICAgIC5nZXRJbnRlcmFjdGFibGVTdGF0ZSh0aGlzLmludGVyYWN0YWJsZUlkLCB0aGlzLnJlZ2lzdHJ5SWQpO1xuICAgIC8vIGtlZXAgb3VyIGNhY2hlZCBwb3NpdGlvbiB2YWx1ZXMgaW4gbGluZSB3aXRoIG91ciBkcmFnIHN0YXRlXG4gICAgdGhpcy5pbnRlcmFjdGFibGVTdWJzY3JpcHRpb24gPSB0aGlzLmludGVyYWN0YWJsZVN0YXRlLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcbiAgICAgIHRoaXMueSA9IHN0YXRlLnk7XG4gICAgICB0aGlzLnggPSBzdGF0ZS54O1xuICAgIH0pO1xuICAgIHRoaXMuc2V0RHJhZ0NvbmZpZygpO1xuICB9XG5cbiAgLy8gVE9ETzogd2F0Y2ggY29uZmlnIGhlcmUgYXMgd2VsbCBhbmQgdXBkYXRlIGludGVyYWN0YWJsZVxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgLy8gd2UgZG8gdGhpcyBoZXJlIGluc3RlYWQgb2YgdXNpbmcgYSBzZXR0ZXIgb24gdGhlIGlucHV0IHNvIHRoYXQgaXRcbiAgICAvLyB3aWxsIG9ubHkgcnVuIG9uY2Ugd2hlbiB0aGVyZSBpcyBhIGNoYW5nZSB0byB4IGFuZCB5XG4gICAgaWYoY2hhbmdlcy55IHx8IGNoYW5nZXMueCkge1xuICAgICAgdGhpcy5hbGlnblBvc2l0aW9uV2l0aElucHV0cyh0aGlzLngsIHRoaXMueSk7XG4gICAgfVxuICAgIGlmKGNoYW5nZXMuZHJhZ0NvbmZpZyB8fCBjaGFuZ2VzLmRpc2FibGVkIHx8IGNoYW5nZXMuZHJhZ0Rpc2FibGVkKSB7XG4gICAgICBpZighdGhpcy5pbnRlcmFjdGFibGUpIHJldHVybjtcbiAgICAgIHRoaXMuc2V0RHJhZ0NvbmZpZygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCByZW1vdmUgdGhpcyBpbiB2MTNcbiAgICAgKi9cbiAgICBpZiAoY2hhbmdlcy5kaXNhYmxlZCkge1xuICAgICAgY29uc29sZS53YXJuKGBJdCBsb29rcyBsaWtlIHlvdXIgdXNpbmcgdGhlICdkaXNhYmxlZCcgaW5wdXQgb24gYSB0ZnREcmFnZ2FibGUgZGlyZWN0aXZlLCBpdCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCBpcyByZXBsYWNlZCB3aXRoICdkcmFnRGlzYWJsZWQnLCBwbGVhc2UgbWlncmF0ZSBieSB2MTNgKVxuICAgIH1cbiAgfVxuXG4gIHNldERyYWdDb25maWcoKSB7XG4gICAgY29uc3QgZW5hYmxlZCA9ICEodGhpcy5kaXNhYmxlZCB8fCB0aGlzLmRyYWdEaXNhYmxlZClcbiAgICBjb25zdCBkcmFnQ29uZmlnID0gey4uLnRoaXMuZHJhZ0NvbmZpZywgZW5hYmxlZH07XG4gICAgdGhpcy5pbnRlcmFjdGFibGUuZHJhZ2dhYmxlKGRyYWdDb25maWcpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuYWRkRHJhZ1Byb3BlcnRpZXNUb0VsZW1lbnQodGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcbiAgICBpZiAoIXRoaXMuZHJvcHpvbmVfZGlyKSB7XG4gICAgICB0aGlzLnByZXZpZXdSZWYgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgLy8gY2xlYW4gdXAgc3RhdGUgYW5kIHN1YnNjcmlwdGlvbnMgcmVsYXRlZCB0byBkZXN0cm95ZWQgY29tcG9uZW50XG4gICAgdGhpcy5pbnRlcmFjdGFibGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmludGVyYWN0U2VydmljZS5kZXN0cm95SW50ZXJhY3RhYmxlKHRoaXMuaW50ZXJhY3RhYmxlSWQsIHRoaXMucmVnaXN0cnlJZCk7XG4gIH1cblxuICBkcmFnTW92ZUxpc3RlbmVyKGV2ZW50OiBOZ0RyYWdFdmVudCwgZWxlbWVudDogSW50ZXJhY3QuRWxlbWVudCkge1xuICAgIGNvbnN0IHsgZHgsIGR5IH0gPSBldmVudDtcbiAgICBjb25zdCBzY2FsZSA9IHRoaXMuc2NhbGU7XG4gICAgY29uc3QgZGVsdGFYID0gc2NhbGUgPyBkeCAvIHNjYWxlIDogZHg7XG4gICAgY29uc3QgZGVsdGFZID0gc2NhbGUgPyBkeSAvIHNjYWxlIDogZHk7XG5cbiAgICB0aGlzLmludGVyYWN0U2VydmljZS51cGRhdGVEZWx0YXMoXG4gICAgICB0aGlzLmludGVyYWN0YWJsZUlkLFxuICAgICAgdGhpcy5yZWdpc3RyeUlkLFxuICAgICAge2RlbHRhWCwgZGVsdGFZfSxcbiAgICAgIGVsZW1lbnRcbiAgICApO1xuICB9XG5cbiAgc2V0RHJhZ1N0eWxlcyhkcmFnRWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRyYWdFbGVtZW50LCAndG91Y2hBY3Rpb24nLCAnbm9uZScpXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShkcmFnRWxlbWVudCwgJ3pJbmRleCcsIHRoaXMuZHJhZ1pJbmRleClcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRyYWdFbGVtZW50LCAncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICB9XG5cbiAgYWRkRHJhZ1Byb3BlcnRpZXNUb0VsZW1lbnQobmF0aXZlRWxlbWVudDogVGZ0RHJhZ0VsZW1lbnQpIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KG5hdGl2ZUVsZW1lbnQsICdkcm9wVGFyZ2V0JywgdGhpcy5kcm9wem9uZV9kaXIgfHwgbnVsbCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShuYXRpdmVFbGVtZW50LCAnZHJhZ09yaWdpbicsIHRoaXMuZHJvcHpvbmVfZGlyIHx8IG51bGwpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkobmF0aXZlRWxlbWVudCwgJ2RyYWdSZWYnLCB0aGlzKTtcbiAgfVxuXG4gIG1hcERyYWdFdmVudChldmVudDogTmdEcmFnRXZlbnQpOiBUZnREcmFnRXZlbnQge1xuICAgIGNvbnN0IHsgdGFyZ2V0LCBkcm9wem9uZSB9ID0gZXZlbnQ7XG4gICAgY29uc3QgZHJvcHpvbmVFbGVtZW50ID0gZHJvcHpvbmU/LnRhcmdldCB8fCB0YXJnZXQuZHJvcFRhcmdldD8uZWwubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBzY2FsZSA9IHRoaXMuc2NhbGU7XG4gICAgY29uc3QgcG9zaXRpb25JbkRyb3BUYXJnZXQgPSB0YXJnZXQgJiYgZHJvcHpvbmVFbGVtZW50XG4gICAgICA/IHRoaXMuaW50ZXJhY3RTZXJ2aWNlLmNhbGN1bGF0ZVBvc2l0aW9uSW5FbGVtZW50KGRyb3B6b25lRWxlbWVudCwgdGhpcy5wcmV2aWV3UmVmLCBzY2FsZSlcbiAgICAgIDogbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgaW50ZXJhY3RFdmVudDogZXZlbnQsXG4gICAgICBkcmFnUmVmOiB0aGlzLFxuICAgICAgZHJhZ09yaWdpbjogdGFyZ2V0LmRyYWdPcmlnaW4sXG4gICAgICBkcm9wVGFyZ2V0OiB0YXJnZXQuZHJvcFRhcmdldCxcbiAgICAgIHBvc2l0aW9uSW5Ecm9wVGFyZ2V0XG4gICAgfVxuICB9XG5cbiAgc2V0UG9zaXRpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICB0aGlzLmludGVyYWN0U2VydmljZS51cGRhdGVQb3NpdGlvbihcbiAgICAgIHRoaXMuaW50ZXJhY3RhYmxlSWQsXG4gICAgICB0aGlzLnJlZ2lzdHJ5SWQsXG4gICAgICB7eCwgeX0sXG4gICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnRcbiAgICApO1xuICB9XG5cbiAgYWxpZ25Qb3NpdGlvbldpdGhJbnB1dHMoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICAvLyBzaG9ydCBjaXJjdWl0IGlmIHBvc2l0aW9ucyBhcmVuJ3QgbnVtYmVycyBvciAgaWYgdGhleSBoYXZlbid0IGNoYW5nZWRcbiAgICBpZighdGhpcy5pc1ZhbGlkUG9zaXRpb24oeCwgeSkpIHJldHVybjtcbiAgICB0aGlzLmludGVyYWN0U2VydmljZS51cGRhdGVQb3NpdGlvbihcbiAgICAgIHRoaXMuaW50ZXJhY3RhYmxlSWQsXG4gICAgICB0aGlzLnJlZ2lzdHJ5SWQsXG4gICAgICB7eCwgeX0sXG4gICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnRcbiAgICApO1xuICB9XG5cbiAgaXNWYWxpZFBvc2l0aW9uKHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNOdW1lcmljKHgpICYmIHRoaXMuaXNOdW1lcmljKHkpO1xuICB9XG4gIC8vIFdlIHVzZSB1c2UgdGhpcyBpbnN0ZWFkIG9mIGlzTmFOIGhlcmUgdG8gdHJ5IGFuZCBoZWxwIHBlcmZvcm1hbmNlXG4gIC8vIFdlIHNob3VsZCBiZSBhYmxlIHRvIHJlbGlhYmx5IHJlc3RyaWN0IHRvIG51bWJlcnMgb3IgZmFsc2V5IHZhbHVlc1xuICBpc051bWVyaWMobnVtOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdHlwZW9mIG51bSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKG51bSk7XG4gIH1cblxuICBpbml0aWF0ZURyYWdFdmVudHMoZHJhZ0NvbmZpZzogUGFydGlhbDxJbnRlcmFjdC5PckJvb2xlYW48RHJhZ2dhYmxlT3B0aW9ucz4+LCBuYXRpdmVFbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IGRlZmF1bHREcmFnQ29uZmlnID0ge1xuICAgICAgLi4uZHJhZ0NvbmZpZyxcbiAgICAgIGVuYWJsZWQ6ICAhKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5kcmFnRGlzYWJsZWQpLFxuICAgICAgLi4uKHRoaXMuYXV0b19zY3JvbGxfZGlyICYmIHtcbiAgICAgICAgYXV0b1Njcm9sbDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi50aGlzLmF1dG9fc2Nyb2xsX2Rpci5hdXRvU2Nyb2xsQ29uZmlnLFxuICAgICAgICAgICAgY29udGFpbmVyOiB0aGlzLmF1dG9fc2Nyb2xsX2Rpci5lbC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgfTtcbiAgICByZXR1cm4gaW50ZXJhY3QobmF0aXZlRWxlbWVudCkuZHJhZ2dhYmxlKGRlZmF1bHREcmFnQ29uZmlnKVxuICAgICAgLm9uKCdkcmFnc3RhcnQnLCAgKGV2ZW50OiBOZ0RyYWdFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBpbnRlcmFjdGlvbiA9IGV2ZW50LmludGVyYWN0aW9uO1xuICAgICAgICAvLyBjaGVjayBpZiB3ZSBzaG91bGQgYXBwZW5kIGRyYWcgZWxlbWVudCB0byBib2R5XG4gICAgICAgIGlmICggdGhpcy5lbmFibGVEcmFnRGVmYXVsdFxuICAgICAgICAgICYmIGludGVyYWN0aW9uLnBvaW50ZXJJc0Rvd25cbiAgICAgICAgICAvLyBUT0RPOiBwcm9iYWJseSBkb24ndCBuZWVkIGZvbGxvd2luZyBjb25kaXRpb24gY2hlY2tzIGFueW1vcmUgcmVtb3ZlIGJ5IDIwMjJcbiAgICAgICAgICAvLyAmJiAhIXRoaXMuZHJvcHpvbmVfZGlyXG4gICAgICAgICAgLy8gJiYgIWludGVyYWN0aW9uLmludGVyYWN0aW5nKClcbiAgICAgICAgICApIHtcbiAgICAgICAgICBpZiAodGhpcy5fcHJldmlld1RlbXBsYXRlKSB7XG4gICAgICAgICAgICBjb25zdCB2aWV3UmVmID0gdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5fcHJldmlld1RlbXBsYXRlLnRlbXBsYXRlUmVmKTtcbiAgICAgICAgICAgIHRoaXMucHJldmlld1JlZiA9IGdldFJvb3ROb2RlKHZpZXdSZWYsIHRoaXMuX2RvY3VtZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcmV2aWV3UmVmID0gY2xvbmVFbGVtZW50KHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuYWRkRHJhZ1Byb3BlcnRpZXNUb0VsZW1lbnQodGhpcy5wcmV2aWV3UmVmKTtcbiAgICAgICAgICB0aGlzLnNldERyYWdTdHlsZXModGhpcy5wcmV2aWV3UmVmKVxuXG4gICAgICAgICAgdGhpcy5kcmFnUm9vdEVsLnByZXBlbmQodGhpcy5wcmV2aWV3UmVmKTtcbiAgICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMuYWNjb3VudF9mb3Jfc2NhbGVfZGlyPy5zY2FsZSB8fCB0aGlzLmRyYWdSb290Py5hY2NvdW50X2Zvcl9zY2FsZV9kaXI/LnNjYWxlIHx8IDE7XG4gICAgICAgICAgY29uc3Qge3gsIHl9ID0gdGhpcy5pbnRlcmFjdFNlcnZpY2UuY2FsY3VsYXRlUG9zaXRpb25JbkVsZW1lbnQodGhpcy5kcmFnUm9vdEVsLCBuYXRpdmVFbGVtZW50LCBzY2FsZSk7XG4gICAgICAgICAgdGhpcy5pbnRlcmFjdFNlcnZpY2UudXBkYXRlUG9zaXRpb24odGhpcy5pbnRlcmFjdGFibGVJZCwgdGhpcy5yZWdpc3RyeUlkLCB7eCwgeX0sIHRoaXMucHJldmlld1JlZik7XG4gICAgICAgICAgaWYgKCF0aGlzLnNob3dQbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gc3Vic2NyaWJlIHRvIHNjcm9sbCBldmVudHMgaWYgdGhleSBhcmUgdGhlcmUsIGJ5IG9ubHkgc3Vic2NyaWJpbmcgb24gZHJhZ3N0YXJ0IHdlIGF2b2lkIHdhc3Rpbmcgc3Vic2NyaXB0aW9ucyBvbiBpbnRlcmFjdGFibGVzIHRoYXQgYXJlbid0IGJlIGRyYWdnZWRcbiAgICAgICAgaWYgKHRoaXMuYXV0b19zY3JvbGxfZGlyKSB7XG4gICAgICAgICAgdGhpcy5zdWJzY3JpYmVUb1Njcm9sbEV2ZW50cygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZHJhZ1N0YXJ0LmVtaXQodGhpcy5tYXBEcmFnRXZlbnQoZXZlbnQpKTtcbiAgICAgIH0pXG4gICAgICAub24oJ2RyYWdtb3ZlJywgKGV2ZW50OiBOZ0RyYWdFdmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5lbmFibGVEcmFnRGVmYXVsdCkge1xuICAgICAgICAgIGNvbnN0IGRyYWdFbGVtZW50ID0gdGhpcy5kcm9wem9uZV9kaXIgJiYgdGhpcy5wcmV2aWV3UmVmIHx8IG5hdGl2ZUVsZW1lbnRcbiAgICAgICAgICB0aGlzLmRyYWdNb3ZlTGlzdGVuZXIoZXZlbnQsIGRyYWdFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXBwZWRFdmVudCA9IHRoaXMubWFwRHJhZ0V2ZW50KGV2ZW50KTtcbiAgICAgICAgdGhpcy5kcmFnTW92ZS5lbWl0KG1hcHBlZEV2ZW50KTtcbiAgICAgIH0pXG4gICAgICAub24oJ2RyYWdpbmVydGlhc3RhcnQnLCAoZXZlbnQ6IE5nRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuZHJhZ0luZXJ0aWFTdGFydC5lbWl0KHRoaXMubWFwRHJhZ0V2ZW50KGV2ZW50KSlcbiAgICAgIH0pXG4gICAgICAub24oJ2RyYWdlbmQnLCAoZXZlbnQ6IE5nRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcHBlZEV2ZW50ID0gdGhpcy5tYXBEcmFnRXZlbnQoZXZlbnQpXG4gICAgICAgIGlmKCEhdGhpcy5kcm9wem9uZV9kaXIgJiYgdGhpcy5kcm9wem9uZV9kaXIgPT09IGV2ZW50LnRhcmdldC5kcm9wVGFyZ2V0KSB7XG4gICAgICAgICAgY29uc3QgeyB4LCB5fSA9IG1hcHBlZEV2ZW50LnBvc2l0aW9uSW5Ecm9wVGFyZ2V0O1xuICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24oeCwgeSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgJycpO1xuICAgICAgICB0aGlzLmRyYWdFbmQuZW1pdChtYXBwZWRFdmVudCk7XG4gICAgICAgIC8vIHVuc3Vic2NyaWJlIGZyb20gc2Nyb2xsIGV2ZW50cyBpZiBzdWJzY3JpYmVkXG4gICAgICAgIGlmICh0aGlzLmF1dG9fc2Nyb2xsX2Rpcikge1xuICAgICAgICAgIHRoaXMuc2Nyb2xsRXZlbnRzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQgIT09IHRoaXMucHJldmlld1JlZikge1xuICAgICAgICAgIC8vIHdlIGRvIHRoaXMgaW4gYSB0aW1lb3V0LCBzbyB0aGF0IHdlIGRvbid0IHJlbW92ZSBiZWZvcmUgdGhlIGRyb3B6b25lIGNhbiBnZXQgdGhlIGJvdW5kaW5nRWxlbWVudFJlY3RcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZHJhZ1Jvb3RFbC5yZW1vdmVDaGlsZCh0aGlzLnByZXZpZXdSZWYpO1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgc3Vic2NyaWJlVG9TY3JvbGxFdmVudHMoKSB7XG4gICAgdGhpcy5zY3JvbGxFdmVudHNTdWJzY3JpcHRpb24gPSB0aGlzLmF1dG9fc2Nyb2xsX2Rpci5zY3JvbGxEZWx0YU9ic2VydmVyLnN1YnNjcmliZSgoe3Njcm9sbExlZnQsIHNjcm9sbFRvcH0pID0+IHtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IHRoaXMuc2NhbGUgPyBzY3JvbGxMZWZ0IC8gdGhpcy5zY2FsZSA6IHNjcm9sbExlZnQ7XG4gICAgICBjb25zdCBkZWx0YVkgPSB0aGlzLnNjYWxlID8gc2Nyb2xsVG9wIC8gdGhpcy5zY2FsZSA6IHNjcm9sbFRvcDtcblxuICAgICAgdGhpcy5pbnRlcmFjdFNlcnZpY2UudXBkYXRlRGVsdGFzKFxuICAgICAgICB0aGlzLmludGVyYWN0YWJsZUlkLFxuICAgICAgICB0aGlzLnJlZ2lzdHJ5SWQsXG4gICAgICAgIHtkZWx0YVgsIGRlbHRhWX0sXG4gICAgICAgIHRoaXMucHJldmlld1JlZlxuICAgICAgKTtcbiAgICB9KTtcblxuICB9XG59XG5cbi8qKlxuICogQ29tcG9uZW50IHV0aWxzXG4gKi9cbi8vIGNyZWF0ZSBhIGNsb25lIG9mIHRoZSBjb21wb25lbnQgcGFzc2VkIGluIGFuZCBhZGQgaXQgdG8gdGhlIHJvb3QgY29tcG9uZW50XG5mdW5jdGlvbiBjbG9uZUVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgY29uc3QgY2xvbmUgPSBlbGVtZW50LmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcbiAgY2xvbmUucmVtb3ZlQXR0cmlidXRlKCdpZCcpO1xuICByZXR1cm4gY2xvbmU7XG59XG5mdW5jdGlvbiBnZXRQcmV2aWV3SW5zZXJ0aW9uUG9pbnQoZG9jdW1lbnRSZWY6IGFueSk6IEhUTUxFbGVtZW50IHtcbiAgLy8gV2UgY2FuJ3QgdXNlIHRoZSBib2R5IGlmIHRoZSB1c2VyIGlzIGluIGZ1bGxzY3JlZW4gbW9kZSxcbiAgLy8gYmVjYXVzZSB0aGUgcHJldmlldyB3aWxsIHJlbmRlciB1bmRlciB0aGUgZnVsbHNjcmVlbiBlbGVtZW50LlxuICByZXR1cm4gZG9jdW1lbnRSZWYuZnVsbHNjcmVlbkVsZW1lbnQgfHxcbiAgICAgICAgIGRvY3VtZW50UmVmLndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IHx8XG4gICAgICAgICBkb2N1bWVudFJlZi5tb3pGdWxsU2NyZWVuRWxlbWVudCB8fFxuICAgICAgICAgZG9jdW1lbnRSZWYubXNGdWxsc2NyZWVuRWxlbWVudCB8fFxuICAgICAgICAgZG9jdW1lbnRSZWYuYm9keTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { Directive, ElementRef, Input, Output, EventEmitter, Renderer2, Optional, HostBinding } from '@angular/core';
|
|
2
|
+
import interact from 'interactjs';
|
|
3
|
+
import { InteractService } from '../services/interact.service';
|
|
4
|
+
import { AccountForScaleDirective } from './account-for-scale.directive';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../services/interact.service";
|
|
7
|
+
import * as i2 from "./account-for-scale.directive";
|
|
8
|
+
export class DropzoneDirective {
|
|
9
|
+
get scale() {
|
|
10
|
+
return this.account_for_scale_dir?.scale;
|
|
11
|
+
}
|
|
12
|
+
constructor(el, renderer, interactService, account_for_scale_dir) {
|
|
13
|
+
this.el = el;
|
|
14
|
+
this.renderer = renderer;
|
|
15
|
+
this.interactService = interactService;
|
|
16
|
+
this.account_for_scale_dir = account_for_scale_dir;
|
|
17
|
+
this.dropzoneConfig = {};
|
|
18
|
+
this.position = 'relative';
|
|
19
|
+
// proxies to pass interact events through to consumer of directive
|
|
20
|
+
this.dropActivate = new EventEmitter();
|
|
21
|
+
this.dragEnter = new EventEmitter();
|
|
22
|
+
this.dragLeave = new EventEmitter();
|
|
23
|
+
this.dragDrop = new EventEmitter();
|
|
24
|
+
}
|
|
25
|
+
ngOnInit() {
|
|
26
|
+
// connects
|
|
27
|
+
this.dropzone = this.connectDropzoneEvents(this.el.nativeElement, this.dropzoneConfig);
|
|
28
|
+
this.dropzoneId = this.interactService.addRegistryToSystem(this.dropzoneId);
|
|
29
|
+
}
|
|
30
|
+
ngOnChanges(changes) {
|
|
31
|
+
if (!changes.dropzoneConfig || !this.dropzone)
|
|
32
|
+
return;
|
|
33
|
+
// this.dropzone.unset();
|
|
34
|
+
// this.dropzone = this.connectDropzoneEvents(this.el.nativeElement, this.dropzoneConfig)
|
|
35
|
+
this.dropzone.dropzone(this.dropzoneConfig);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Connects element to interacts dropzone events and returns a reference to the interactable
|
|
39
|
+
* @param nativeElement the element to tie drop events to
|
|
40
|
+
* @param dropzoneConfig the interact configuration to use when connecting
|
|
41
|
+
*/
|
|
42
|
+
connectDropzoneEvents(nativeElement, dropzoneConfig) {
|
|
43
|
+
return interact(nativeElement).dropzone(dropzoneConfig)
|
|
44
|
+
// TODO: investigate when this fires in different scenarios
|
|
45
|
+
.on('dropactivate', (event) => {
|
|
46
|
+
this.dropActivate.emit(this.mapDropzoneEvent(event));
|
|
47
|
+
})
|
|
48
|
+
.on('dragenter', (event) => {
|
|
49
|
+
this.renderer.setProperty(event.relatedTarget, 'dropTarget', this);
|
|
50
|
+
this.dragEnter.emit(this.mapDropzoneEvent(event));
|
|
51
|
+
})
|
|
52
|
+
.on('dragleave', (event) => {
|
|
53
|
+
if (event.relatedTarget.dropTarget === this) {
|
|
54
|
+
this.renderer.setProperty(event.relatedTarget, 'dropTarget', null);
|
|
55
|
+
}
|
|
56
|
+
this.dragLeave.emit(this.mapDropzoneEvent(event));
|
|
57
|
+
})
|
|
58
|
+
.on('drop', (event) => {
|
|
59
|
+
this.dragDrop.emit(this.mapDropzoneEvent(event));
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Maps the drop event emitted by interact to something a little easier to use
|
|
64
|
+
* @param event the drop event emitted by interact, extended with extra fields we added to
|
|
65
|
+
*/
|
|
66
|
+
mapDropzoneEvent(event) {
|
|
67
|
+
const zoneElement = event.target;
|
|
68
|
+
const dragElement = event.relatedTarget?.dragRef?.previewRef;
|
|
69
|
+
const scale = this.scale;
|
|
70
|
+
const positionInDropTarget = zoneElement && dragElement
|
|
71
|
+
? this.interactService.calculatePositionInElement(zoneElement, dragElement, scale)
|
|
72
|
+
: null;
|
|
73
|
+
return {
|
|
74
|
+
interactEvent: event,
|
|
75
|
+
dragRef: dragElement.dragRef,
|
|
76
|
+
dragOrigin: dragElement.dragOrigin,
|
|
77
|
+
dropTarget: event.relatedTarget.dropTarget,
|
|
78
|
+
positionInDropTarget
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: DropzoneDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.InteractService }, { token: i2.AccountForScaleDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
82
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.3", type: DropzoneDirective, selector: "[tftDropzone]", inputs: { dropzoneId: "dropzoneId", dropzoneConfig: "dropzoneConfig", dropzoneData: "dropzoneData", position: "position" }, outputs: { dropActivate: "dropActivate", dragEnter: "dragEnter", dragLeave: "dragLeave", dragDrop: "dragDrop" }, host: { properties: { "id": "dropzoneId", "style.position": "this.position" } }, usesOnChanges: true, ngImport: i0 }); }
|
|
83
|
+
}
|
|
84
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: DropzoneDirective, decorators: [{
|
|
85
|
+
type: Directive,
|
|
86
|
+
args: [{
|
|
87
|
+
selector: '[tftDropzone]',
|
|
88
|
+
host: {
|
|
89
|
+
'[id]': 'dropzoneId'
|
|
90
|
+
}
|
|
91
|
+
}]
|
|
92
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.InteractService }, { type: i2.AccountForScaleDirective, decorators: [{
|
|
93
|
+
type: Optional
|
|
94
|
+
}] }], propDecorators: { dropzoneId: [{
|
|
95
|
+
type: Input
|
|
96
|
+
}], dropzoneConfig: [{
|
|
97
|
+
type: Input
|
|
98
|
+
}], dropzoneData: [{
|
|
99
|
+
type: Input
|
|
100
|
+
}], position: [{
|
|
101
|
+
type: Input
|
|
102
|
+
}, {
|
|
103
|
+
type: HostBinding,
|
|
104
|
+
args: ['style.position']
|
|
105
|
+
}], dropActivate: [{
|
|
106
|
+
type: Output
|
|
107
|
+
}], dragEnter: [{
|
|
108
|
+
type: Output
|
|
109
|
+
}], dragLeave: [{
|
|
110
|
+
type: Output
|
|
111
|
+
}], dragDrop: [{
|
|
112
|
+
type: Output
|
|
113
|
+
}] } });
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcHpvbmUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9pbnRlcmFjdC9zcmMvbGliL2RpcmVjdGl2ZXMvZHJvcHpvbmUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUE0QixTQUFTLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2SixPQUFPLFFBQVEsTUFBTSxZQUFZLENBQUM7QUFFbEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRS9ELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7O0FBU3pFLE1BQU0sT0FBTyxpQkFBaUI7SUFpQjVCLElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQztJQUMzQyxDQUFDO0lBQ0QsWUFDUyxFQUFjLEVBQ2IsUUFBbUIsRUFDbkIsZUFBZ0MsRUFDcEIscUJBQWdEO1FBSDdELE9BQUUsR0FBRixFQUFFLENBQVk7UUFDYixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNwQiwwQkFBcUIsR0FBckIscUJBQXFCLENBQTJCO1FBckI3RCxtQkFBYyxHQUFvQixFQUFFLENBQUM7UUFLZixhQUFRLEdBQW1CLFVBQVUsQ0FBQztRQUNyRSxtRUFBbUU7UUFDekQsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBZ0IsQ0FBQztRQUNoRCxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQWdCLENBQUM7UUFDN0MsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFnQixDQUFDO1FBQzdDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBZ0IsQ0FBQztJQVlsRCxDQUFDO0lBRUwsUUFBUTtRQUNO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VSxpQkFBaUI7a0dBQWpCLGlCQUFpQjs7MkZBQWpCLGlCQUFpQjtrQkFON0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZUFBZTtvQkFDekIsSUFBSSxFQUFFO3dCQUNKLE1BQU0sRUFBRSxZQUFZO3FCQUNyQjtpQkFDRjs7MEJBeUJJLFFBQVE7eUNBdEJGLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUd5QixRQUFRO3NCQUR0QyxLQUFLOztzQkFDTCxXQUFXO3VCQUFDLGdCQUFnQjtnQkFFbkIsWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFNpbXBsZUNoYW5nZXMsIE9uQ2hhbmdlcywgUmVuZGVyZXIyLCBPcHRpb25hbCwgSG9zdEJpbmRpbmcgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCBpbnRlcmFjdCBmcm9tICdpbnRlcmFjdGpzJztcbmltcG9ydCB7IERyb3B6b25lT3B0aW9ucywgSW50ZXJhY3RhYmxlIH0gZnJvbSAnQGludGVyYWN0anMvdHlwZXMvaW5kZXgnO1xuaW1wb3J0IHsgSW50ZXJhY3RTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvaW50ZXJhY3Quc2VydmljZSc7XG5pbXBvcnQgeyBOZ0Ryb3BFdmVudCwgVGZ0RHJhZ0VsZW1lbnQsIFRmdERyb3BFdmVudCB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBBY2NvdW50Rm9yU2NhbGVEaXJlY3RpdmUgfSBmcm9tICcuL2FjY291bnQtZm9yLXNjYWxlLmRpcmVjdGl2ZSc7XG5cbmV4cG9ydCB0eXBlIFBvc2l0aW9uT3B0aW9uID0gJ3JlbGF0aXZlJyB8ICdhYnNvbHV0ZScgfCAnZml4ZWQnIHwgJ3N0YXRpYycgfCAnc3RpY2t5JyB8ICd1bnNldCcgfCAnaW5oZXJpdCcgfCAnaW5pdGlhbCcgfCAncmV2ZXJ0J1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3RmdERyb3B6b25lXScsXG4gIGhvc3Q6IHtcbiAgICAnW2lkXSc6ICdkcm9wem9uZUlkJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIERyb3B6b25lRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpIGRyb3B6b25lSWQ6IHN0cmluZztcbiAgQElucHV0KCkgZHJvcHpvbmVDb25maWc6IERyb3B6b25lT3B0aW9ucyA9IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBASW5wdXQoKSBkcm9wem9uZURhdGE6IGFueTtcblxuICBASW5wdXQoKVxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLnBvc2l0aW9uJykgcG9zaXRpb246IFBvc2l0aW9uT3B0aW9uID0gJ3JlbGF0aXZlJztcbiAgLy8gcHJveGllcyB0byBwYXNzIGludGVyYWN0IGV2ZW50cyB0aHJvdWdoIHRvIGNvbnN1bWVyIG9mIGRpcmVjdGl2ZVxuICBAT3V0cHV0KCkgZHJvcEFjdGl2YXRlID0gbmV3IEV2ZW50RW1pdHRlcjxUZnREcm9wRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBkcmFnRW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPFRmdERyb3BFdmVudD4oKTtcbiAgQE91dHB1dCgpIGRyYWdMZWF2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VGZ0RHJvcEV2ZW50PigpO1xuICBAT3V0cHV0KCkgZHJhZ0Ryb3AgPSBuZXcgRXZlbnRFbWl0dGVyPFRmdERyb3BFdmVudD4oKTtcblxuICBkcm9wem9uZTogSW50ZXJhY3RhYmxlO1xuXG4gIGdldCBzY2FsZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFjY291bnRfZm9yX3NjYWxlX2Rpcj8uc2NhbGU7XG4gIH1cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGludGVyYWN0U2VydmljZTogSW50ZXJhY3RTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgYWNjb3VudF9mb3Jfc2NhbGVfZGlyPzogQWNjb3VudEZvclNjYWxlRGlyZWN0aXZlXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gY29ubmVjdHNcbiAgICB0aGlzLmRyb3B6b25lID0gdGhpcy5jb25uZWN0RHJvcHpvbmVFdmVudHModGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLmRyb3B6b25lQ29uZmlnKTtcbiAgICB0aGlzLmRyb3B6b25lSWQgPSB0aGlzLmludGVyYWN0U2VydmljZS5hZGRSZWdpc3RyeVRvU3lzdGVtKHRoaXMuZHJvcHpvbmVJZCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYoIWNoYW5nZXMuZHJvcHpvbmVDb25maWcgfHwgIXRoaXMuZHJvcHpvbmUpIHJldHVybjtcbiAgICAvLyB0aGlzLmRyb3B6b25lLnVuc2V0KCk7XG4gICAgLy8gdGhpcy5kcm9wem9uZSA9IHRoaXMuY29ubmVjdERyb3B6b25lRXZlbnRzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5kcm9wem9uZUNvbmZpZylcbiAgICB0aGlzLmRyb3B6b25lLmRyb3B6b25lKHRoaXMuZHJvcHpvbmVDb25maWcpXG4gIH1cbiAgLyoqXG4gICogQ29ubmVjdHMgZWxlbWVudCB0byBpbnRlcmFjdHMgZHJvcHpvbmUgZXZlbnRzIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBpbnRlcmFjdGFibGVcbiAgKiBAcGFyYW0gbmF0aXZlRWxlbWVudCB0aGUgZWxlbWVudCB0byB0aWUgZHJvcCBldmVudHMgdG9cbiAgKiBAcGFyYW0gZHJvcHpvbmVDb25maWcgdGhlIGludGVyYWN0IGNvbmZpZ3VyYXRpb24gdG8gdXNlIHdoZW4gY29ubmVjdGluZ1xuICAqL1xuICBjb25uZWN0RHJvcHpvbmVFdmVudHMobmF0aXZlRWxlbWVudCwgZHJvcHpvbmVDb25maWc6IERyb3B6b25lT3B0aW9ucykge1xuICAgIHJldHVybiBpbnRlcmFjdChuYXRpdmVFbGVtZW50KS5kcm9wem9uZShkcm9wem9uZUNvbmZpZylcbiAgICAgIC8vIFRPRE86IGludmVzdGlnYXRlIHdoZW4gdGhpcyBmaXJlcyBpbiBkaWZmZXJlbnQgc2NlbmFyaW9zXG4gICAgICAub24oJ2Ryb3BhY3RpdmF0ZScsIChldmVudDogTmdEcm9wRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5kcm9wQWN0aXZhdGUuZW1pdCh0aGlzLm1hcERyb3B6b25lRXZlbnQoZXZlbnQpKTtcbiAgICAgIH0pXG4gICAgICAub24oJ2RyYWdlbnRlcicsIChldmVudDogTmdEcm9wRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShldmVudC5yZWxhdGVkVGFyZ2V0LCAnZHJvcFRhcmdldCcsIHRoaXMpXG4gICAgICAgIHRoaXMuZHJhZ0VudGVyLmVtaXQodGhpcy5tYXBEcm9wem9uZUV2ZW50KGV2ZW50KSk7XG4gICAgICB9KVxuICAgICAgLm9uKCdkcmFnbGVhdmUnLCAoZXZlbnQ6IE5nRHJvcEV2ZW50KSA9PiB7XG4gICAgICAgIGlmICggZXZlbnQucmVsYXRlZFRhcmdldC5kcm9wVGFyZ2V0ID09PSB0aGlzKSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShldmVudC5yZWxhdGVkVGFyZ2V0LCAnZHJvcFRhcmdldCcsIG51bGwpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kcmFnTGVhdmUuZW1pdCh0aGlzLm1hcERyb3B6b25lRXZlbnQoZXZlbnQpKTtcbiAgICAgIH0pXG4gICAgICAub24oJ2Ryb3AnLCAgKGV2ZW50OiBOZ0Ryb3BFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLmRyYWdEcm9wLmVtaXQodGhpcy5tYXBEcm9wem9uZUV2ZW50KGV2ZW50KSk7XG4gICAgICB9KTtcbiAgfVxuICAvKipcbiAgICogTWFwcyB0aGUgZHJvcCBldmVudCBlbWl0dGVkIGJ5IGludGVyYWN0IHRvIHNvbWV0aGluZyBhIGxpdHRsZSBlYXNpZXIgdG8gdXNlXG4gICAqIEBwYXJhbSBldmVudCB0aGUgZHJvcCBldmVudCBlbWl0dGVkIGJ5IGludGVyYWN0LCBleHRlbmRlZCB3aXRoIGV4dHJhIGZpZWxkcyB3ZSBhZGRlZCB0b1xuICAgKi9cbiAgbWFwRHJvcHpvbmVFdmVudChldmVudDogTmdEcm9wRXZlbnQpOiBUZnREcm9wRXZlbnQge1xuICAgIGNvbnN0IHpvbmVFbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xuICAgIGNvbnN0IGRyYWdFbGVtZW50ID0gZXZlbnQucmVsYXRlZFRhcmdldD8uZHJhZ1JlZj8ucHJldmlld1JlZiBhcyBUZnREcmFnRWxlbWVudDtcbiAgICBjb25zdCBzY2FsZSA9IHRoaXMuc2NhbGU7XG4gICAgY29uc3QgcG9zaXRpb25JbkRyb3BUYXJnZXQgPSB6b25lRWxlbWVudCAmJiBkcmFnRWxlbWVudFxuICAgID8gdGhpcy5pbnRlcmFjdFNlcnZpY2UuY2FsY3VsYXRlUG9zaXRpb25JbkVsZW1lbnQoem9uZUVsZW1lbnQsIGRyYWdFbGVtZW50LCBzY2FsZSlcbiAgICA6IG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgIGludGVyYWN0RXZlbnQ6IGV2ZW50LFxuICAgICAgZHJhZ1JlZjogZHJhZ0VsZW1lbnQuZHJhZ1JlZixcbiAgICAgIGRyYWdPcmlnaW46IGRyYWdFbGVtZW50LmRyYWdPcmlnaW4sXG4gICAgICBkcm9wVGFyZ2V0OiBldmVudC5yZWxhdGVkVGFyZ2V0LmRyb3BUYXJnZXQsXG4gICAgICBwb3NpdGlvbkluRHJvcFRhcmdldFxuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { Directive, ElementRef, Input, Output, EventEmitter, Optional } from '@angular/core';
|
|
2
|
+
import interact from 'interactjs';
|
|
3
|
+
import { DraggableDirective } from '../directives';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "../directives";
|
|
6
|
+
/** @dynamic */
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
|
+
export class GesturableDirective {
|
|
9
|
+
constructor(el, draggable_dir) {
|
|
10
|
+
this.el = el;
|
|
11
|
+
this.draggable_dir = draggable_dir;
|
|
12
|
+
this.gestureDisabled = false;
|
|
13
|
+
// pipes all interact events to event emitters
|
|
14
|
+
this.gestureStart = new EventEmitter();
|
|
15
|
+
this.gestureMove = new EventEmitter();
|
|
16
|
+
this.gestureEnd = new EventEmitter();
|
|
17
|
+
}
|
|
18
|
+
ngOnInit() {
|
|
19
|
+
this.gesturableId = this.draggable_dir?.interactableId || 'id';
|
|
20
|
+
this.interactable = this.initiateGestureEvents(this.gestureConfig, this.el.nativeElement);
|
|
21
|
+
this.setGestureConfig();
|
|
22
|
+
}
|
|
23
|
+
// TODO: watch config here as well and update interactable
|
|
24
|
+
ngOnChanges(changes) {
|
|
25
|
+
// we do this here instead of using a setter on the input so that it
|
|
26
|
+
// will only run once when there is a change to x and y
|
|
27
|
+
if (changes.gestureConfig || changes.gestureDisabled) {
|
|
28
|
+
if (!this.interactable)
|
|
29
|
+
return;
|
|
30
|
+
this.setGestureConfig();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
setGestureConfig() {
|
|
34
|
+
const enabled = !this.gestureDisabled;
|
|
35
|
+
const gestureConfig = { ...this.gestureConfig, enabled };
|
|
36
|
+
this.interactable.gesturable(gestureConfig);
|
|
37
|
+
}
|
|
38
|
+
initiateGestureEvents(gestureConfig, nativeElement) {
|
|
39
|
+
const defaultConfig = {
|
|
40
|
+
enabled: !this.gestureDisabled,
|
|
41
|
+
};
|
|
42
|
+
const interactable = this.draggable_dir?.interactable || interact(nativeElement);
|
|
43
|
+
return interactable.gesturable({ ...defaultConfig, ...gestureConfig })
|
|
44
|
+
.on('gesturestart', (event) => {
|
|
45
|
+
this.gestureStart.emit({ gestureRef: this, interactEvent: event });
|
|
46
|
+
})
|
|
47
|
+
.on('gesturemove', (event) => {
|
|
48
|
+
this.gestureMove.emit({ gestureRef: this, interactEvent: event });
|
|
49
|
+
})
|
|
50
|
+
.on('gestureend', (event) => {
|
|
51
|
+
this.gestureEnd.emit({ gestureRef: this, interactEvent: event });
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: GesturableDirective, deps: [{ token: i0.ElementRef }, { token: i1.DraggableDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
55
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.3", type: GesturableDirective, selector: "[tftGesturable]", inputs: { gesturableId: "gesturableId", gestureDisabled: "gestureDisabled", gestureConfig: "gestureConfig" }, outputs: { gestureStart: "gestureStart", gestureMove: "gestureMove", gestureEnd: "gestureEnd" }, host: { properties: { "id": "gesturableId" } }, usesOnChanges: true, ngImport: i0 }); }
|
|
56
|
+
}
|
|
57
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: GesturableDirective, decorators: [{
|
|
58
|
+
type: Directive,
|
|
59
|
+
args: [{
|
|
60
|
+
selector: '[tftGesturable]',
|
|
61
|
+
// eslint-disable-next-line @angular-eslint/no-host-metadata-property
|
|
62
|
+
host: {
|
|
63
|
+
// '[style.touchAction]': 'this.gestureDisabled ? "auto" : "none"',
|
|
64
|
+
'[id]': 'gesturableId',
|
|
65
|
+
}
|
|
66
|
+
}]
|
|
67
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.DraggableDirective, decorators: [{
|
|
68
|
+
type: Optional
|
|
69
|
+
}] }], propDecorators: { gesturableId: [{
|
|
70
|
+
type: Input
|
|
71
|
+
}], gestureDisabled: [{
|
|
72
|
+
type: Input
|
|
73
|
+
}], gestureConfig: [{
|
|
74
|
+
type: Input
|
|
75
|
+
}], gestureStart: [{
|
|
76
|
+
type: Output
|
|
77
|
+
}], gestureMove: [{
|
|
78
|
+
type: Output
|
|
79
|
+
}], gestureEnd: [{
|
|
80
|
+
type: Output
|
|
81
|
+
}] } });
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VzdHVyYWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2ludGVyYWN0L3NyYy9saWIvZGlyZWN0aXZlcy9nZXN0dXJhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUNsRCxZQUFZLEVBQUUsUUFBUSxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLFFBQVEsTUFBTSxZQUFZLENBQUM7QUFJbEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFFbkQsZUFBZTtBQVNmLDhEQUE4RDtBQUM5RCxNQUFNLE9BQU8sbUJBQW1CO0lBYTlCLFlBQ1MsRUFBYyxFQUNELGFBQWtDO1FBRC9DLE9BQUUsR0FBRixFQUFFLENBQVk7UUFDRCxrQkFBYSxHQUFiLGFBQWEsQ0FBcUI7UUFaL0Msb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFFakMsOENBQThDO1FBQ3BDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7UUFDbkQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUNsRCxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7SUFRdkQsQ0FBQztJQUVMLFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsY0FBYyxJQUFJLElBQUksQ0FBQztRQUMvRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDMUYsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELDBEQUEwRDtJQUMxRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsb0VBQW9FO1FBQ3BFLHVEQUF1RDtRQUN2RCxJQUFHLE9BQU8sQ0FBQyxhQUFhLElBQUksT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3BELElBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWTtnQkFBRSxPQUFPO1lBQzlCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsTUFBTSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ3RDLE1BQU0sYUFBYSxHQUFHLEVBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxhQUE2RCxFQUFFLGFBQTBCO1FBRTdHLE1BQU0sYUFBYSxHQUFzQjtZQUN2QyxPQUFPLEVBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZTtTQUNoQyxDQUFDO1FBQ0YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxZQUFZLElBQUksUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRWpGLE9BQU8sWUFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFDLEdBQUcsYUFBYSxFQUFFLEdBQUcsYUFBYSxFQUFDLENBQUM7YUFDakUsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDLEtBQW1CLEVBQUUsRUFBRTtZQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7UUFDbEUsQ0FBQyxDQUFDO2FBQ0QsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDLEtBQW1CLEVBQUUsRUFBRTtZQUN6QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7UUFDakUsQ0FBQyxDQUFDO2FBQ0QsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLEtBQW1CLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7UUFDaEUsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDOzhHQXpEVSxtQkFBbUI7a0dBQW5CLG1CQUFtQjs7MkZBQW5CLG1CQUFtQjtrQkFUL0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsaUJBQWlCO29CQUMzQixxRUFBcUU7b0JBQ3JFLElBQUksRUFBRTt3QkFDSixtRUFBbUU7d0JBQ25FLE1BQU0sRUFBRSxjQUFjO3FCQUN2QjtpQkFDRjs7MEJBaUJJLFFBQVE7eUNBYkYsWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIE91dHB1dCxcbiAgIEV2ZW50RW1pdHRlciwgT3B0aW9uYWwsIFNpbXBsZUNoYW5nZXMsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IGludGVyYWN0IGZyb20gJ2ludGVyYWN0anMnO1xuaW1wb3J0IHsgRHJhZ2dhYmxlT3B0aW9ucywgR2VzdHVyYWJsZU9wdGlvbnMsIEludGVyYWN0YWJsZSwgR2VzdHVyZUV2ZW50IH0gZnJvbSAnQGludGVyYWN0anMvdHlwZXMvaW5kZXgnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVGZ0Q29vcmRzLCBUZnRHZXN0dXJlRXZlbnQgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRHJhZ2dhYmxlRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcyc7XG5cbi8qKiBAZHluYW1pYyAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3RmdEdlc3R1cmFibGVdJyxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1ob3N0LW1ldGFkYXRhLXByb3BlcnR5XG4gIGhvc3Q6IHtcbiAgICAvLyAnW3N0eWxlLnRvdWNoQWN0aW9uXSc6ICd0aGlzLmdlc3R1cmVEaXNhYmxlZCA/IFwiYXV0b1wiIDogXCJub25lXCInLFxuICAgICdbaWRdJzogJ2dlc3R1cmFibGVJZCcsXG4gIH1cbn0pXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEdlc3R1cmFibGVEaXJlY3RpdmU8RCA9IGFueT4gaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgZ2VzdHVyYWJsZUlkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGdlc3R1cmVEaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBnZXN0dXJlQ29uZmlnOiBQYXJ0aWFsPEludGVyYWN0Lk9yQm9vbGVhbjxEcmFnZ2FibGVPcHRpb25zPj47XG4gIC8vIHBpcGVzIGFsbCBpbnRlcmFjdCBldmVudHMgdG8gZXZlbnQgZW1pdHRlcnNcbiAgQE91dHB1dCgpIGdlc3R1cmVTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8VGZ0R2VzdHVyZUV2ZW50PigpO1xuICBAT3V0cHV0KCkgZ2VzdHVyZU1vdmUgPSBuZXcgRXZlbnRFbWl0dGVyPFRmdEdlc3R1cmVFdmVudD4oKTtcbiAgQE91dHB1dCgpIGdlc3R1cmVFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPFRmdEdlc3R1cmVFdmVudD4oKTtcblxuICBpbnRlcmFjdGFibGVTdGF0ZTogT2JzZXJ2YWJsZTxUZnRDb29yZHM+O1xuICBpbnRlcmFjdGFibGU6IEludGVyYWN0YWJsZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWw6IEVsZW1lbnRSZWYsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBkcmFnZ2FibGVfZGlyPzogRHJhZ2dhYmxlRGlyZWN0aXZlLFxuICApIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZ2VzdHVyYWJsZUlkID0gdGhpcy5kcmFnZ2FibGVfZGlyPy5pbnRlcmFjdGFibGVJZCB8fCAnaWQnO1xuICAgIHRoaXMuaW50ZXJhY3RhYmxlID0gdGhpcy5pbml0aWF0ZUdlc3R1cmVFdmVudHModGhpcy5nZXN0dXJlQ29uZmlnLCB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMuc2V0R2VzdHVyZUNvbmZpZygpO1xuICB9XG5cbiAgLy8gVE9ETzogd2F0Y2ggY29uZmlnIGhlcmUgYXMgd2VsbCBhbmQgdXBkYXRlIGludGVyYWN0YWJsZVxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgLy8gd2UgZG8gdGhpcyBoZXJlIGluc3RlYWQgb2YgdXNpbmcgYSBzZXR0ZXIgb24gdGhlIGlucHV0IHNvIHRoYXQgaXRcbiAgICAvLyB3aWxsIG9ubHkgcnVuIG9uY2Ugd2hlbiB0aGVyZSBpcyBhIGNoYW5nZSB0byB4IGFuZCB5XG4gICAgaWYoY2hhbmdlcy5nZXN0dXJlQ29uZmlnIHx8IGNoYW5nZXMuZ2VzdHVyZURpc2FibGVkKSB7XG4gICAgICBpZighdGhpcy5pbnRlcmFjdGFibGUpIHJldHVybjtcbiAgICAgIHRoaXMuc2V0R2VzdHVyZUNvbmZpZygpO1xuICAgIH1cbiAgfVxuXG4gIHNldEdlc3R1cmVDb25maWcoKSB7XG4gICAgY29uc3QgZW5hYmxlZCA9ICF0aGlzLmdlc3R1cmVEaXNhYmxlZDtcbiAgICBjb25zdCBnZXN0dXJlQ29uZmlnID0gey4uLnRoaXMuZ2VzdHVyZUNvbmZpZywgZW5hYmxlZH07XG4gICAgdGhpcy5pbnRlcmFjdGFibGUuZ2VzdHVyYWJsZShnZXN0dXJlQ29uZmlnKTtcbiAgfVxuXG4gIGluaXRpYXRlR2VzdHVyZUV2ZW50cyhnZXN0dXJlQ29uZmlnOiBQYXJ0aWFsPEludGVyYWN0Lk9yQm9vbGVhbjxHZXN0dXJhYmxlT3B0aW9ucz4+LCBuYXRpdmVFbGVtZW50OiBIVE1MRWxlbWVudCkge1xuXG4gICAgY29uc3QgZGVmYXVsdENvbmZpZzogR2VzdHVyYWJsZU9wdGlvbnMgPSB7XG4gICAgICBlbmFibGVkOiAgIXRoaXMuZ2VzdHVyZURpc2FibGVkLFxuICAgIH07XG4gICAgY29uc3QgaW50ZXJhY3RhYmxlID0gdGhpcy5kcmFnZ2FibGVfZGlyPy5pbnRlcmFjdGFibGUgfHwgaW50ZXJhY3QobmF0aXZlRWxlbWVudCk7XG5cbiAgICByZXR1cm4gaW50ZXJhY3RhYmxlLmdlc3R1cmFibGUoey4uLmRlZmF1bHRDb25maWcsIC4uLmdlc3R1cmVDb25maWd9KVxuICAgICAgLm9uKCdnZXN0dXJlc3RhcnQnLCAoZXZlbnQ6IEdlc3R1cmVFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLmdlc3R1cmVTdGFydC5lbWl0KHtnZXN0dXJlUmVmOiB0aGlzLCBpbnRlcmFjdEV2ZW50OiBldmVudH0pXG4gICAgICB9KVxuICAgICAgLm9uKCdnZXN0dXJlbW92ZScsIChldmVudDogR2VzdHVyZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuZ2VzdHVyZU1vdmUuZW1pdCh7Z2VzdHVyZVJlZjogdGhpcywgaW50ZXJhY3RFdmVudDogZXZlbnR9KVxuICAgICAgfSlcbiAgICAgIC5vbignZ2VzdHVyZWVuZCcsIChldmVudDogR2VzdHVyZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuZ2VzdHVyZUVuZC5lbWl0KHtnZXN0dXJlUmVmOiB0aGlzLCBpbnRlcmFjdEV2ZW50OiBldmVudH0pXG4gICAgICB9KVxuICB9XG59XG4iXX0=
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export * from './draggable.directive';
|
|
2
|
-
export * from './dropzone.directive';
|
|
3
|
-
export * from './resizable.directive';
|
|
4
|
-
export * from './drag-preview.directive';
|
|
5
|
-
export * from './gesturable.directive';
|
|
6
|
-
export * from './drag-root.directive';
|
|
7
|
-
export * from './account-for-scale.directive';
|
|
8
|
-
export * from './apply-scale.directive';
|
|
9
|
-
export * from './auto-scroll.directive';
|
|
1
|
+
export * from './draggable.directive';
|
|
2
|
+
export * from './dropzone.directive';
|
|
3
|
+
export * from './resizable.directive';
|
|
4
|
+
export * from './drag-preview.directive';
|
|
5
|
+
export * from './gesturable.directive';
|
|
6
|
+
export * from './drag-root.directive';
|
|
7
|
+
export * from './account-for-scale.directive';
|
|
8
|
+
export * from './apply-scale.directive';
|
|
9
|
+
export * from './auto-scroll.directive';
|
|
10
10
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2ludGVyYWN0L3NyYy9saWIvZGlyZWN0aXZlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZHJhZ2dhYmxlLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2Ryb3B6b25lLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL3Jlc2l6YWJsZS5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9kcmFnLXByZXZpZXcuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vZ2VzdHVyYWJsZS5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9kcmFnLXJvb3QuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vYWNjb3VudC1mb3Itc2NhbGUuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwbHktc2NhbGUuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vYXV0by1zY3JvbGwuZGlyZWN0aXZlJztcbiJdfQ==
|