@limble/limble-tree 0.12.4 → 0.13.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/README.md +149 -149
- package/{esm2015/lib/classes/Branch.js → esm2020/lib/classes/Branch.mjs} +1 -1
- package/{esm2015/lib/classes/DropZone.js → esm2020/lib/classes/DropZone.mjs} +1 -1
- package/{esm2015/lib/classes/DropZoneLocation.js → esm2020/lib/classes/DropZoneLocation.mjs} +1 -1
- package/{esm2015/lib/custom-event-bindings/dragleave-no-change-detect.directive.js → esm2020/lib/custom-event-bindings/dragleave-no-change-detect.directive.mjs} +0 -0
- package/{esm2015/lib/custom-event-bindings/dragover-no-change-detect.directive.js → esm2020/lib/custom-event-bindings/dragover-no-change-detect.directive.mjs} +1 -1
- package/esm2020/lib/drop-zone/drop-zone.component.mjs +75 -0
- package/esm2020/lib/limble-tree-branch/limble-tree-branch.component.mjs +110 -0
- package/esm2020/lib/limble-tree-node/limble-tree-node.component.mjs +467 -0
- package/{esm2015/lib/limble-tree-placeholder/limble-tree-placeholder.component.js → esm2020/lib/limble-tree-placeholder/limble-tree-placeholder.component.mjs} +3 -8
- package/esm2020/lib/limble-tree-root/drop-zone.service.mjs +376 -0
- package/esm2020/lib/limble-tree-root/limble-tree-root.component.mjs +172 -0
- package/{esm2015/lib/limble-tree-root/tree-construction-status.service.js → esm2020/lib/limble-tree-root/tree-construction-status.service.mjs} +1 -1
- package/esm2020/lib/limble-tree-root/tree.service.mjs +297 -0
- package/{esm2015/lib/limble-tree.module.js → esm2020/lib/limble-tree.module.mjs} +5 -5
- package/{esm2015/lib/singletons/component-creator.service.js → esm2020/lib/singletons/component-creator.service.mjs} +1 -1
- package/esm2020/lib/singletons/drag-state.service.mjs +63 -0
- package/esm2020/lib/singletons/global-events.service.mjs +136 -0
- package/{esm2015/lib/util.js → esm2020/lib/util.mjs} +1 -1
- package/{esm2015/limble-limble-tree.js → esm2020/limble-limble-tree.mjs} +0 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +1 -1
- package/fesm2015/limble-limble-tree.mjs +2256 -0
- package/fesm2015/limble-limble-tree.mjs.map +1 -0
- package/{fesm2015/limble-limble-tree.js → fesm2020/limble-limble-tree.mjs} +89 -136
- package/fesm2020/limble-limble-tree.mjs.map +1 -0
- package/{limble-limble-tree.d.ts → index.d.ts} +0 -0
- package/lib/custom-event-bindings/dragleave-no-change-detect.directive.d.ts +1 -1
- package/lib/custom-event-bindings/dragover-no-change-detect.directive.d.ts +1 -1
- package/lib/drop-zone/drop-zone.component.d.ts +1 -1
- package/lib/limble-tree-branch/limble-tree-branch.component.d.ts +1 -1
- package/lib/limble-tree-node/limble-tree-node.component.d.ts +1 -1
- package/lib/limble-tree-placeholder/limble-tree-placeholder.component.d.ts +1 -1
- package/lib/limble-tree-root/limble-tree-root.component.d.ts +1 -1
- package/package.json +22 -9
- package/bundles/limble-limble-tree.umd.js +0 -2910
- package/bundles/limble-limble-tree.umd.js.map +0 -1
- package/esm2015/lib/drop-zone/drop-zone.component.js +0 -81
- package/esm2015/lib/limble-tree-branch/limble-tree-branch.component.js +0 -116
- package/esm2015/lib/limble-tree-node/limble-tree-node.component.js +0 -484
- package/esm2015/lib/limble-tree-root/drop-zone.service.js +0 -377
- package/esm2015/lib/limble-tree-root/limble-tree-root.component.js +0 -178
- package/esm2015/lib/limble-tree-root/tree.service.js +0 -301
- package/esm2015/lib/singletons/drag-state.service.js +0 -64
- package/esm2015/lib/singletons/global-events.service.js +0 -137
- package/fesm2015/limble-limble-tree.js.map +0 -1
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
import { Component, ElementRef, Input, ViewChild, ViewContainerRef } from "@angular/core";
|
|
2
|
+
import { arraysAreEqual, isDraggingAllowed, isNestingAllowed, suddenTreeExit } from "../util";
|
|
3
|
+
import { filter, first, skip, skipUntil } from "rxjs/operators";
|
|
4
|
+
import { DropZone } from "../classes/DropZone";
|
|
5
|
+
import { fromEvent, merge } from "rxjs";
|
|
6
|
+
import { LimbleTreeBranchComponent } from "../limble-tree-branch/limble-tree-branch.component";
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "../singletons/component-creator.service";
|
|
9
|
+
import * as i2 from "../singletons/drag-state.service";
|
|
10
|
+
import * as i3 from "../limble-tree-root/drop-zone.service";
|
|
11
|
+
import * as i4 from "../limble-tree-root/tree.service";
|
|
12
|
+
import * as i5 from "../singletons/global-events.service";
|
|
13
|
+
import * as i6 from "../limble-tree-root/tree-construction-status.service";
|
|
14
|
+
const _c0 = ["nodeHost"];
|
|
15
|
+
const _c1 = ["draggableDiv"];
|
|
16
|
+
const _c2 = ["nodeHostContainer"];
|
|
17
|
+
const _c3 = ["innerBranch"];
|
|
18
|
+
function LimbleTreeNodeComponent_drop_zone_0_Template(rf, ctx) { if (rf & 1) {
|
|
19
|
+
i0.ɵɵelement(0, "drop-zone", 7);
|
|
20
|
+
} if (rf & 2) {
|
|
21
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
22
|
+
i0.ɵɵproperty("dropZone", ctx_r0.dropZoneAbove);
|
|
23
|
+
} }
|
|
24
|
+
function LimbleTreeNodeComponent_ng_template_5_Template(rf, ctx) { }
|
|
25
|
+
function LimbleTreeNodeComponent_limble_tree_branch_7_Template(rf, ctx) { if (rf & 1) {
|
|
26
|
+
i0.ɵɵelement(0, "limble-tree-branch", 8, 9);
|
|
27
|
+
} if (rf & 2) {
|
|
28
|
+
const ctx_r5 = i0.ɵɵnextContext();
|
|
29
|
+
i0.ɵɵproperty("branch", ctx_r5.branch);
|
|
30
|
+
} }
|
|
31
|
+
function LimbleTreeNodeComponent_drop_zone_8_Template(rf, ctx) { if (rf & 1) {
|
|
32
|
+
i0.ɵɵelement(0, "drop-zone", 7);
|
|
33
|
+
} if (rf & 2) {
|
|
34
|
+
const ctx_r6 = i0.ɵɵnextContext();
|
|
35
|
+
i0.ɵɵproperty("dropZone", ctx_r6.dropZoneBelow);
|
|
36
|
+
} }
|
|
37
|
+
export class LimbleTreeNodeComponent {
|
|
38
|
+
constructor(componentCreatorService, changeDetectorRef, dragStateService, dropZoneService, treeService, globalEventsService, ngZone, treeConstructionStatus) {
|
|
39
|
+
this.componentCreatorService = componentCreatorService;
|
|
40
|
+
this.changeDetectorRef = changeDetectorRef;
|
|
41
|
+
this.dragStateService = dragStateService;
|
|
42
|
+
this.dropZoneService = dropZoneService;
|
|
43
|
+
this.treeService = treeService;
|
|
44
|
+
this.globalEventsService = globalEventsService;
|
|
45
|
+
this.ngZone = ngZone;
|
|
46
|
+
this.treeConstructionStatus = treeConstructionStatus;
|
|
47
|
+
this.treeConstructionStatus.constructing();
|
|
48
|
+
if (this.treeService.treeOptions !== undefined &&
|
|
49
|
+
this.treeService.treeOptions.listMode !== true) {
|
|
50
|
+
this.renderInnerBranch = true;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
this.renderInnerBranch = false;
|
|
54
|
+
}
|
|
55
|
+
this.renderDropZoneBelow = false;
|
|
56
|
+
this.renderDropZoneAbove = false;
|
|
57
|
+
this.treeChangeSubscription = this.treeService.changes$
|
|
58
|
+
.pipe(
|
|
59
|
+
//The first one is the initial tree render, which we can ignore
|
|
60
|
+
skip(1))
|
|
61
|
+
.subscribe(() => {
|
|
62
|
+
this.treeChangeHandler();
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
treeChangeHandler() {
|
|
66
|
+
if (this.branch !== undefined &&
|
|
67
|
+
this.currentBranchCoordinates !== undefined &&
|
|
68
|
+
!arraysAreEqual(this.branch.getCoordinates(), this.currentBranchCoordinates)) {
|
|
69
|
+
this.updateDropZones();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
ngOnInit() {
|
|
73
|
+
if (this.treeService.treeOptions?.allowDragging === false) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const parent = this.branch?.getParent();
|
|
77
|
+
if (parent?.data !== null) {
|
|
78
|
+
const parentData = parent?.data;
|
|
79
|
+
if (!isNestingAllowed(this.treeService.treeOptions, parentData)) {
|
|
80
|
+
this.renderInnerBranch = false;
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
this.registerDropZones();
|
|
85
|
+
this.currentBranchCoordinates = this.branch?.getCoordinates();
|
|
86
|
+
this.ngZone.runOutsideAngular(() => {
|
|
87
|
+
if (this.dropZoneAbove === undefined ||
|
|
88
|
+
this.dropZoneBelow === undefined) {
|
|
89
|
+
throw new Error("Zones not registered");
|
|
90
|
+
}
|
|
91
|
+
merge(this.dropZoneAbove.getCommChannel(), this.dropZoneBelow.getCommChannel())
|
|
92
|
+
.pipe(filter((message) => message === "checkRendered"))
|
|
93
|
+
.subscribe(() => {
|
|
94
|
+
if (this.dropZoneAbove === undefined ||
|
|
95
|
+
this.dropZoneBelow === undefined ||
|
|
96
|
+
this.branch === undefined) {
|
|
97
|
+
throw new Error("Zones not registered");
|
|
98
|
+
}
|
|
99
|
+
this.renderDropZoneAbove = this.dropZoneAbove.isRendered();
|
|
100
|
+
this.renderDropZoneBelow = this.dropZoneBelow.isRendered();
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
ngAfterViewInit() {
|
|
105
|
+
this.renderNode();
|
|
106
|
+
this.setDropZoneHosts();
|
|
107
|
+
this.checkForHandle();
|
|
108
|
+
this.treeConstructionStatus.doneConstructing();
|
|
109
|
+
this.changeDetectorRef.detectChanges();
|
|
110
|
+
}
|
|
111
|
+
ngOnDestroy() {
|
|
112
|
+
this.treeChangeSubscription.unsubscribe();
|
|
113
|
+
if (this.dropZoneAbove !== undefined) {
|
|
114
|
+
this.dropZoneService.removeDropZone(this.dropZoneAbove);
|
|
115
|
+
}
|
|
116
|
+
if (this.dropZoneBelow !== undefined) {
|
|
117
|
+
this.dropZoneService.removeDropZone(this.dropZoneBelow);
|
|
118
|
+
}
|
|
119
|
+
this.treeService.cleanupSignal$.next(true);
|
|
120
|
+
}
|
|
121
|
+
dragstartHandler(event) {
|
|
122
|
+
event.stopPropagation();
|
|
123
|
+
if (event.dataTransfer === null ||
|
|
124
|
+
this.branch === undefined ||
|
|
125
|
+
this.parentHost === undefined) {
|
|
126
|
+
throw new Error("failed to run dragstartHandler");
|
|
127
|
+
}
|
|
128
|
+
const draggedElement = event.target;
|
|
129
|
+
if (draggedElement.parentElement?.tagName !== "LIMBLE-TREE-NODE") {
|
|
130
|
+
//Don't drag stuff that isn't part of the tree
|
|
131
|
+
event.preventDefault();
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
event.dataTransfer.effectAllowed = "move";
|
|
135
|
+
this.dragStateService.dragging(this.branch, this.parentHost);
|
|
136
|
+
const treeElement = draggedElement.closest("limble-tree-root");
|
|
137
|
+
if (treeElement === null) {
|
|
138
|
+
throw new Error("could not get root of tree");
|
|
139
|
+
}
|
|
140
|
+
this.ngZone.runOutsideAngular(() => {
|
|
141
|
+
//We have to use a setTimeout due to a bug in chrome: https://stackoverflow.com/a/20733870/8796651
|
|
142
|
+
setTimeout(() => {
|
|
143
|
+
draggedElement.classList.add("dragging");
|
|
144
|
+
if (this.treeService.treeData?.length === 1 &&
|
|
145
|
+
this.branch?.getCoordinates().length === 1) {
|
|
146
|
+
//We are dragging the only element in the tree, so we have to use the placeholder system
|
|
147
|
+
this.treeService.placeholder$.next(true);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
//We use this weird subscription/timeout combo in order to avoid a strange bug where the dragleave event
|
|
151
|
+
//does not fire if the user drags out of the tree too quickly. This issue would make the drop zone
|
|
152
|
+
//remain in the UI, potentially causing drop zones to appear in multiple trees at a time. This subscription
|
|
153
|
+
//waits for the dragover event on the tree to fire before rendering any drop zones. If the dragover
|
|
154
|
+
//event does not fire within a half second, we know the mouse left the tree too quickly, and we won't
|
|
155
|
+
//render the drop zone at all.
|
|
156
|
+
const dragSubscription = fromEvent(treeElement, "dragover")
|
|
157
|
+
.pipe(first())
|
|
158
|
+
.subscribe((dragoverEvent) => {
|
|
159
|
+
dragoverEvent.stopPropagation();
|
|
160
|
+
if (this.branch === undefined) {
|
|
161
|
+
throw new Error("Could not show surrounding drop zones");
|
|
162
|
+
}
|
|
163
|
+
const parent = this.branch.getParent();
|
|
164
|
+
let parentData;
|
|
165
|
+
let parentNestingAllowed = true;
|
|
166
|
+
if (parent?.data !== null) {
|
|
167
|
+
parentData = parent?.data;
|
|
168
|
+
parentNestingAllowed = isNestingAllowed(this.treeService.treeOptions, parentData);
|
|
169
|
+
}
|
|
170
|
+
if (this.dropZoneAbove !== undefined && parentNestingAllowed) {
|
|
171
|
+
this.dropZoneService.showDropZoneFamily(this.dropZoneAbove, {
|
|
172
|
+
joinFamilies: true
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
setTimeout(() => {
|
|
177
|
+
if (!dragSubscription.closed) {
|
|
178
|
+
dragSubscription.unsubscribe();
|
|
179
|
+
}
|
|
180
|
+
}, 500);
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
dragendHandler(event) {
|
|
184
|
+
event?.stopPropagation();
|
|
185
|
+
if (this.draggableDiv === undefined) {
|
|
186
|
+
throw new Error("could not get draggable div");
|
|
187
|
+
}
|
|
188
|
+
this.draggableDiv.nativeElement.classList.remove("dragging");
|
|
189
|
+
if (this.dragStateService.getState() === "captured") {
|
|
190
|
+
if (this.treeService.captured === false) {
|
|
191
|
+
//Dropped in a different tree. Remove the one in this tree
|
|
192
|
+
if (this.branch === undefined) {
|
|
193
|
+
throw new Error("could not get branch in dragendHandler");
|
|
194
|
+
}
|
|
195
|
+
this.treeService.cleanupSignal$.next(true);
|
|
196
|
+
this.treeService.captured = false;
|
|
197
|
+
}
|
|
198
|
+
this.dragStateService.release();
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
//Wasn't dropped into a valid tree, so reset for next drag and
|
|
202
|
+
//don't do anything else.
|
|
203
|
+
this.dragStateService.release();
|
|
204
|
+
this.dropZoneService.clearVisibleZones();
|
|
205
|
+
this.dropZoneService.restoreFamilies();
|
|
206
|
+
if (this.treeService.treeData?.length === 1 &&
|
|
207
|
+
this.branch?.getCoordinates().length === 1) {
|
|
208
|
+
//We were dragging the only element in the tree, so we have to
|
|
209
|
+
//remove the placeholder that we added in the dragstart
|
|
210
|
+
this.treeService.placeholder$.next(false);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
dragoverHandler(event) {
|
|
215
|
+
if (this.globalEventsService.scrolling === true) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
if (this.branch === undefined) {
|
|
219
|
+
throw new Error("Can't get current branch during dragover event");
|
|
220
|
+
}
|
|
221
|
+
const data = this.dragStateService.getData();
|
|
222
|
+
if (data === undefined) {
|
|
223
|
+
//They might be dragging something that isn't a node. Just ignore it.
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
const sourceBranch = data.branch;
|
|
227
|
+
//If trying to drop on self, return.
|
|
228
|
+
if (sourceBranch === this.branch ||
|
|
229
|
+
this.branch.getAncestors().includes(sourceBranch)) {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
const target = event.currentTarget.closest(".node-host-container");
|
|
233
|
+
if (!(target instanceof HTMLElement)) {
|
|
234
|
+
throw new Error("Failed to find node host container while dragging");
|
|
235
|
+
}
|
|
236
|
+
let topLine;
|
|
237
|
+
let bottomLine;
|
|
238
|
+
if (this.innerBranch?.renderDropZoneInside === false) {
|
|
239
|
+
topLine = target.offsetHeight / 2 - 6;
|
|
240
|
+
bottomLine = topLine;
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
topLine = target.offsetHeight / 3 - 3; //an imaginary line 1/3 of the way down from the top of the element;
|
|
244
|
+
bottomLine = topLine * 2; //an imaginary line 1/3 of the way up from the bottom of the element;
|
|
245
|
+
}
|
|
246
|
+
const parent = this.branch.getParent();
|
|
247
|
+
let parentData;
|
|
248
|
+
let parentNestingAllowed = true;
|
|
249
|
+
if (parent?.data !== null) {
|
|
250
|
+
parentData = parent?.data;
|
|
251
|
+
parentNestingAllowed = isNestingAllowed(this.treeService.treeOptions, parentData);
|
|
252
|
+
}
|
|
253
|
+
/** The y-coordinates of the mouse in relation to the node it is hovering over */
|
|
254
|
+
const offsetY = event.clientY - target.getBoundingClientRect().top;
|
|
255
|
+
const activeDropZone = this.dropZoneService.getActiveDropZone();
|
|
256
|
+
if (offsetY < topLine &&
|
|
257
|
+
this.dropZoneAbove !== undefined &&
|
|
258
|
+
parentNestingAllowed &&
|
|
259
|
+
(activeDropZone === null ||
|
|
260
|
+
!DropZone.dropZoneLocationsAreEqual(activeDropZone, this.dropZoneAbove))) {
|
|
261
|
+
const index = this.branch.getIndex();
|
|
262
|
+
if (index === undefined || index === null) {
|
|
263
|
+
throw new Error("can't get branch index");
|
|
264
|
+
}
|
|
265
|
+
this.dropZoneService.showDropZoneFamily(this.dropZoneAbove, {
|
|
266
|
+
activateLowestInsteadOfFounder: true
|
|
267
|
+
});
|
|
268
|
+
if (suddenTreeExit(event)) {
|
|
269
|
+
this.dropZoneService.clearVisibleZones();
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
else if (offsetY < bottomLine &&
|
|
273
|
+
offsetY > topLine &&
|
|
274
|
+
this.innerBranch?.renderDropZoneInside === true &&
|
|
275
|
+
this.innerBranch?.dropZoneInside !== undefined &&
|
|
276
|
+
(activeDropZone === null ||
|
|
277
|
+
!DropZone.dropZoneLocationsAreEqual(activeDropZone, this.innerBranch.dropZoneInside))) {
|
|
278
|
+
this.dropZoneService.showDropZoneFamily(this.innerBranch.dropZoneInside);
|
|
279
|
+
if (suddenTreeExit(event)) {
|
|
280
|
+
this.dropZoneService.clearVisibleZones();
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
else if (offsetY >= bottomLine &&
|
|
284
|
+
this.dropZoneBelow !== undefined &&
|
|
285
|
+
parentNestingAllowed &&
|
|
286
|
+
(activeDropZone === null ||
|
|
287
|
+
!DropZone.dropZoneLocationsAreEqual(activeDropZone, this.dropZoneBelow)) &&
|
|
288
|
+
this.branch.getChildren().length === 0) {
|
|
289
|
+
const index = this.branch.getIndex();
|
|
290
|
+
if (index === undefined || index === null) {
|
|
291
|
+
throw new Error("can't get branch index");
|
|
292
|
+
}
|
|
293
|
+
this.dropZoneService.showDropZoneFamily(this.dropZoneBelow);
|
|
294
|
+
if (suddenTreeExit(event)) {
|
|
295
|
+
this.dropZoneService.clearVisibleZones();
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
renderNode() {
|
|
300
|
+
if (this.nodeHost === undefined || this.branch === undefined) {
|
|
301
|
+
throw new Error("Failed to render tree node");
|
|
302
|
+
}
|
|
303
|
+
let component = this.branch.data.component;
|
|
304
|
+
if (component === undefined) {
|
|
305
|
+
component = this.treeService.treeOptions?.defaultComponent;
|
|
306
|
+
}
|
|
307
|
+
if (component === undefined) {
|
|
308
|
+
throw new Error("limbleTree requires a component to render");
|
|
309
|
+
}
|
|
310
|
+
const componentRef = this.componentCreatorService.appendComponent(component.class, this.nodeHost);
|
|
311
|
+
componentRef.instance.nodeData = this.branch.data;
|
|
312
|
+
for (const binding in component.bindings) {
|
|
313
|
+
componentRef.instance[binding] = component.bindings[binding];
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
registerDropZones() {
|
|
317
|
+
this.addDropZoneAbove();
|
|
318
|
+
this.addDropZoneBelow();
|
|
319
|
+
}
|
|
320
|
+
addDropZoneAbove() {
|
|
321
|
+
if (this.branch === undefined) {
|
|
322
|
+
throw new Error("failed to register drop zone above");
|
|
323
|
+
}
|
|
324
|
+
const parent = this.branch.getParent();
|
|
325
|
+
const currentCoordinates = this.branch.getCoordinates();
|
|
326
|
+
const index = currentCoordinates[currentCoordinates.length - 1];
|
|
327
|
+
this.dropZoneAbove = new DropZone([...(parent?.getCoordinates() ?? [])], index);
|
|
328
|
+
this.dropZoneService.addDropZone(this.dropZoneAbove);
|
|
329
|
+
}
|
|
330
|
+
addDropZoneBelow() {
|
|
331
|
+
if (this.branch === undefined) {
|
|
332
|
+
throw new Error("failed to register drop zone below");
|
|
333
|
+
}
|
|
334
|
+
const parent = this.branch.getParent();
|
|
335
|
+
const currentCoordinates = this.branch.getCoordinates();
|
|
336
|
+
const index = currentCoordinates[currentCoordinates.length - 1];
|
|
337
|
+
this.dropZoneBelow = new DropZone([...(parent?.getCoordinates() ?? [])], index + 1);
|
|
338
|
+
this.dropZoneService.addDropZone(this.dropZoneBelow);
|
|
339
|
+
}
|
|
340
|
+
updateDropZones() {
|
|
341
|
+
this.currentBranchCoordinates = this.branch?.getCoordinates();
|
|
342
|
+
this.updateDropZoneAbove();
|
|
343
|
+
this.updateDropZoneBelow();
|
|
344
|
+
this.updateDropZoneInside();
|
|
345
|
+
this.setDropZoneHosts();
|
|
346
|
+
}
|
|
347
|
+
updateDropZoneAbove() {
|
|
348
|
+
if (this.branch === undefined || this.dropZoneAbove === undefined) {
|
|
349
|
+
throw new Error("failed to update drop zone above");
|
|
350
|
+
}
|
|
351
|
+
const parent = this.branch.getParent();
|
|
352
|
+
const currentCoordinates = this.branch.getCoordinates();
|
|
353
|
+
const index = currentCoordinates[currentCoordinates.length - 1];
|
|
354
|
+
const location = this.dropZoneAbove.getLocation();
|
|
355
|
+
location.setParentCoordinates([...(parent?.getCoordinates() ?? [])]);
|
|
356
|
+
location.setInsertIndex(index);
|
|
357
|
+
}
|
|
358
|
+
updateDropZoneBelow() {
|
|
359
|
+
if (this.branch === undefined || this.dropZoneBelow === undefined) {
|
|
360
|
+
throw new Error("failed to update drop zone below");
|
|
361
|
+
}
|
|
362
|
+
const parent = this.branch.getParent();
|
|
363
|
+
const currentCoordinates = this.branch.getCoordinates();
|
|
364
|
+
const index = currentCoordinates[currentCoordinates.length - 1];
|
|
365
|
+
const location = this.dropZoneBelow.getLocation();
|
|
366
|
+
location.setParentCoordinates([...(parent?.getCoordinates() ?? [])]);
|
|
367
|
+
location.setInsertIndex(index + 1);
|
|
368
|
+
}
|
|
369
|
+
updateDropZoneInside() {
|
|
370
|
+
if (this.innerBranch?.dropZoneInside === undefined) {
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
if (this.branch === undefined) {
|
|
374
|
+
throw new Error("failed to update drop zone inside");
|
|
375
|
+
}
|
|
376
|
+
const location = this.innerBranch.dropZoneInside.getLocation();
|
|
377
|
+
location.setParentCoordinates([...this.branch.getCoordinates()]);
|
|
378
|
+
}
|
|
379
|
+
setDropZoneHosts() {
|
|
380
|
+
if (this.dropZoneAbove === undefined ||
|
|
381
|
+
this.dropZoneBelow === undefined) {
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
this.dropZoneAbove.setHost(this.parentHost);
|
|
385
|
+
this.dropZoneBelow.setHost(this.parentHost);
|
|
386
|
+
}
|
|
387
|
+
checkForHandle() {
|
|
388
|
+
if (this.nodeHostContainer === undefined ||
|
|
389
|
+
this.draggableDiv === undefined) {
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
const nodeHostContainerElement = this.nodeHostContainer.nativeElement;
|
|
393
|
+
const handle = nodeHostContainerElement.querySelector(".limble-tree-handle");
|
|
394
|
+
const draggableDivElement = this.draggableDiv.nativeElement;
|
|
395
|
+
if (!isDraggingAllowed(this.treeService.treeOptions, this.branch?.data)) {
|
|
396
|
+
draggableDivElement.setAttribute("draggable", "false");
|
|
397
|
+
}
|
|
398
|
+
else if (handle === null) {
|
|
399
|
+
draggableDivElement.setAttribute("draggable", "true");
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
handle.addEventListener("mousedown", () => {
|
|
403
|
+
draggableDivElement.setAttribute("draggable", "true");
|
|
404
|
+
//For some reason mouseup doesn't fire after a drag, so we use this observable sequence instead.
|
|
405
|
+
const dragging = this.dragStateService.state$.pipe(filter((state) => state === "dragging"), first());
|
|
406
|
+
this.dragStateService.state$
|
|
407
|
+
.pipe(skipUntil(dragging), filter((state) => state === "idle"), first())
|
|
408
|
+
.subscribe(() => {
|
|
409
|
+
draggableDivElement.setAttribute("draggable", "false");
|
|
410
|
+
});
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
LimbleTreeNodeComponent.ɵfac = function LimbleTreeNodeComponent_Factory(t) { return new (t || LimbleTreeNodeComponent)(i0.ɵɵdirectiveInject(i1.ComponentCreatorService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i2.DragStateService), i0.ɵɵdirectiveInject(i3.DropZoneService), i0.ɵɵdirectiveInject(i4.TreeService), i0.ɵɵdirectiveInject(i5.GlobalEventsService), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i6.TreeConstructionStatus)); };
|
|
416
|
+
LimbleTreeNodeComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LimbleTreeNodeComponent, selectors: [["limble-tree-node"]], viewQuery: function LimbleTreeNodeComponent_Query(rf, ctx) { if (rf & 1) {
|
|
417
|
+
i0.ɵɵviewQuery(_c0, 5, ViewContainerRef);
|
|
418
|
+
i0.ɵɵviewQuery(_c1, 5, ElementRef);
|
|
419
|
+
i0.ɵɵviewQuery(_c2, 5, ElementRef);
|
|
420
|
+
i0.ɵɵviewQuery(_c3, 5, LimbleTreeBranchComponent);
|
|
421
|
+
} if (rf & 2) {
|
|
422
|
+
let _t;
|
|
423
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.nodeHost = _t.first);
|
|
424
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.draggableDiv = _t.first);
|
|
425
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.nodeHostContainer = _t.first);
|
|
426
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.innerBranch = _t.first);
|
|
427
|
+
} }, inputs: { branch: "branch", parentHost: "parentHost" }, decls: 9, vars: 4, consts: [[3, "dropZone", 4, "ngIf"], [1, "limble-parent-container", 3, "dragstart", "dragend"], ["draggableDiv", ""], [1, "node-host-container", 3, "dragoverEventThrottle", "dragoverNoChangeDetect"], ["nodeHostContainer", ""], ["nodeHost", ""], [3, "branch", 4, "ngIf"], [3, "dropZone"], [3, "branch"], ["innerBranch", ""]], template: function LimbleTreeNodeComponent_Template(rf, ctx) { if (rf & 1) {
|
|
428
|
+
i0.ɵɵtemplate(0, LimbleTreeNodeComponent_drop_zone_0_Template, 1, 1, "drop-zone", 0);
|
|
429
|
+
i0.ɵɵelementStart(1, "div", 1, 2);
|
|
430
|
+
i0.ɵɵlistener("dragstart", function LimbleTreeNodeComponent_Template_div_dragstart_1_listener($event) { return ctx.dragstartHandler($event); })("dragend", function LimbleTreeNodeComponent_Template_div_dragend_1_listener($event) { return ctx.dragendHandler($event); });
|
|
431
|
+
i0.ɵɵelementStart(3, "div", 3, 4);
|
|
432
|
+
i0.ɵɵlistener("dragoverNoChangeDetect", function LimbleTreeNodeComponent_Template_div_dragoverNoChangeDetect_3_listener($event) { return ctx.dragoverHandler($event); });
|
|
433
|
+
i0.ɵɵtemplate(5, LimbleTreeNodeComponent_ng_template_5_Template, 0, 0, "ng-template", null, 5, i0.ɵɵtemplateRefExtractor);
|
|
434
|
+
i0.ɵɵelementEnd();
|
|
435
|
+
i0.ɵɵtemplate(7, LimbleTreeNodeComponent_limble_tree_branch_7_Template, 2, 1, "limble-tree-branch", 6);
|
|
436
|
+
i0.ɵɵelementEnd();
|
|
437
|
+
i0.ɵɵtemplate(8, LimbleTreeNodeComponent_drop_zone_8_Template, 1, 1, "drop-zone", 0);
|
|
438
|
+
} if (rf & 2) {
|
|
439
|
+
i0.ɵɵproperty("ngIf", ctx.renderDropZoneAbove === true);
|
|
440
|
+
i0.ɵɵadvance(3);
|
|
441
|
+
i0.ɵɵproperty("dragoverEventThrottle", 10);
|
|
442
|
+
i0.ɵɵadvance(4);
|
|
443
|
+
i0.ɵɵproperty("ngIf", ctx.branch !== undefined && ctx.renderInnerBranch === true);
|
|
444
|
+
i0.ɵɵadvance(1);
|
|
445
|
+
i0.ɵɵproperty("ngIf", ctx.renderDropZoneBelow === true);
|
|
446
|
+
} }, styles: [".dragging[_ngcontent-%COMP%]{position:absolute;transition:transform .01s;transform:translate(-9999px)}"] });
|
|
447
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LimbleTreeNodeComponent, [{
|
|
448
|
+
type: Component,
|
|
449
|
+
args: [{ selector: "limble-tree-node", template: "<drop-zone\n *ngIf=\"renderDropZoneAbove === true\"\n [dropZone]=\"dropZoneAbove\"\n></drop-zone>\n<div\n (dragstart)=\"dragstartHandler($event)\"\n (dragend)=\"dragendHandler($event)\"\n class=\"limble-parent-container\"\n #draggableDiv\n>\n <div\n class=\"node-host-container\"\n (dragoverNoChangeDetect)=\"dragoverHandler($event)\"\n [dragoverEventThrottle]=\"10\"\n #nodeHostContainer\n >\n <ng-template #nodeHost></ng-template>\n </div>\n <limble-tree-branch\n *ngIf=\"branch !== undefined && renderInnerBranch === true\"\n [branch]=\"branch\"\n #innerBranch\n ></limble-tree-branch>\n</div>\n<drop-zone\n *ngIf=\"renderDropZoneBelow === true\"\n [dropZone]=\"dropZoneBelow\"\n></drop-zone>\n", styles: [".dragging{position:absolute;transition:transform .01s;transform:translate(-9999px)}\n"] }]
|
|
450
|
+
}], function () { return [{ type: i1.ComponentCreatorService }, { type: i0.ChangeDetectorRef }, { type: i2.DragStateService }, { type: i3.DropZoneService }, { type: i4.TreeService }, { type: i5.GlobalEventsService }, { type: i0.NgZone }, { type: i6.TreeConstructionStatus }]; }, { branch: [{
|
|
451
|
+
type: Input
|
|
452
|
+
}], nodeHost: [{
|
|
453
|
+
type: ViewChild,
|
|
454
|
+
args: ["nodeHost", { read: ViewContainerRef }]
|
|
455
|
+
}], draggableDiv: [{
|
|
456
|
+
type: ViewChild,
|
|
457
|
+
args: ["draggableDiv", { read: ElementRef }]
|
|
458
|
+
}], nodeHostContainer: [{
|
|
459
|
+
type: ViewChild,
|
|
460
|
+
args: ["nodeHostContainer", { read: ElementRef }]
|
|
461
|
+
}], parentHost: [{
|
|
462
|
+
type: Input
|
|
463
|
+
}], innerBranch: [{
|
|
464
|
+
type: ViewChild,
|
|
465
|
+
args: ["innerBranch", { read: LimbleTreeBranchComponent }]
|
|
466
|
+
}] }); })();
|
|
467
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGltYmxlLXRyZWUtbm9kZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2xpbWJsZS10cmVlLW5vZGUvbGltYmxlLXRyZWUtbm9kZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2xpbWJsZS10cmVlLW5vZGUvbGltYmxlLXRyZWUtbm9kZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0osU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBSUwsU0FBUyxFQUNULGdCQUFnQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQU12QixPQUFPLEVBQ0osY0FBYyxFQUNkLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsY0FBYyxFQUNoQixNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQzs7Ozs7Ozs7Ozs7OztJQzNCL0YsK0JBR2E7OztJQURWLCtDQUEwQjs7OztJQWdCMUIsMkNBSXNCOzs7SUFGbkIsc0NBQWlCOzs7SUFJdkIsK0JBR2E7OztJQURWLCtDQUEwQjs7QURTN0IsTUFBTSxPQUFPLHVCQUF1QjtJQXVCakMsWUFDb0IsdUJBQWdELEVBQ2hELGlCQUFvQyxFQUNwQyxnQkFBa0MsRUFDbEMsZUFBZ0MsRUFDaEMsV0FBd0IsRUFDeEIsbUJBQXdDLEVBQ3hDLE1BQWMsRUFDZCxzQkFBOEM7UUFQOUMs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a0JBRHhCLFNBQVM7bUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBSTNDLFVBQVU7a0JBQWxCLEtBQUs7WUFFRSxXQUFXO2tCQURsQixTQUFTO21CQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSx5QkFBeUIsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICBBZnRlclZpZXdJbml0LFxuICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICBDb21wb25lbnQsXG4gICBFbGVtZW50UmVmLFxuICAgSW5wdXQsXG4gICBOZ1pvbmUsXG4gICBPbkRlc3Ryb3ksXG4gICBPbkluaXQsXG4gICBWaWV3Q2hpbGQsXG4gICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDb21wb25lbnRDcmVhdG9yU2VydmljZSB9IGZyb20gXCIuLi9zaW5nbGV0b25zL2NvbXBvbmVudC1jcmVhdG9yLnNlcnZpY2VcIjtcbmltcG9ydCB7IERyb3Bab25lU2VydmljZSB9IGZyb20gXCIuLi9saW1ibGUtdHJlZS1yb290L2Ryb3Atem9uZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBEcmFnU3RhdGVTZXJ2aWNlIH0gZnJvbSBcIi4uL3NpbmdsZXRvbnMvZHJhZy1zdGF0ZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBMaW1ibGVUcmVlTm9kZSwgVHJlZVNlcnZpY2UgfSBmcm9tIFwiLi4vbGltYmxlLXRyZWUtcm9vdC90cmVlLnNlcnZpY2VcIjtcbmltcG9ydCB7IEJyYW5jaCwgQnJhbmNoQ29vcmRpbmF0ZXMgfSBmcm9tIFwiLi4vY2xhc3Nlcy9CcmFuY2hcIjtcbmltcG9ydCB7XG4gICBhcnJheXNBcmVFcXVhbCxcbiAgIGlzRHJhZ2dpbmdBbGxvd2VkLFxuICAgaXNOZXN0aW5nQWxsb3dlZCxcbiAgIHN1ZGRlblRyZWVFeGl0XG59IGZyb20gXCIuLi91dGlsXCI7XG5pbXBvcnQgeyBmaWx0ZXIsIGZpcnN0LCBza2lwLCBza2lwVW50aWwgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IEdsb2JhbEV2ZW50c1NlcnZpY2UgfSBmcm9tIFwiLi4vc2luZ2xldG9ucy9nbG9iYWwtZXZlbnRzLnNlcnZpY2VcIjtcbmltcG9ydCB7IERyb3Bab25lIH0gZnJvbSBcIi4uL2NsYXNzZXMvRHJvcFpvbmVcIjtcbmltcG9ydCB7IGZyb21FdmVudCwgbWVyZ2UsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBMaW1ibGVUcmVlQnJhbmNoQ29tcG9uZW50IH0gZnJvbSBcIi4uL2xpbWJsZS10cmVlLWJyYW5jaC9saW1ibGUtdHJlZS1icmFuY2guY29tcG9uZW50XCI7XG5pbXBvcnQgeyBUcmVlQ29uc3RydWN0aW9uU3RhdHVzIH0gZnJvbSBcIi4uL2xpbWJsZS10cmVlLXJvb3QvdHJlZS1jb25zdHJ1Y3Rpb24tc3RhdHVzLnNlcnZpY2VcIjtcblxuQENvbXBvbmVudCh7XG4gICBzZWxlY3RvcjogXCJsaW1ibGUtdHJlZS1ub2RlXCIsXG4gICB0ZW1wbGF0ZVVybDogXCIuL2xpbWJsZS10cmVlLW5vZGUuY29tcG9uZW50Lmh0bWxcIixcbiAgIHN0eWxlVXJsczogW1wiLi9saW1ibGUtdHJlZS1ub2RlLmNvbXBvbmVudC5zY3NzXCJdXG59KVxuZXhwb3J0IGNsYXNzIExpbWJsZVRyZWVOb2RlQ29tcG9uZW50XG4gICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95XG57XG4gICBASW5wdXQoKSBicmFuY2g6IEJyYW5jaDxhbnk+IHwgdW5kZWZpbmVkO1xuICAgQFZpZXdDaGlsZChcIm5vZGVIb3N0XCIsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSBwcml2YXRlIG5vZGVIb3N0OlxuICAgICAgfCBWaWV3Q29udGFpbmVyUmVmXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgIHB1YmxpYyBkcm9wWm9uZUFib3ZlOiBEcm9wWm9uZSB8IHVuZGVmaW5lZDtcbiAgIHB1YmxpYyByZW5kZXJEcm9wWm9uZUFib3ZlOiBib29sZWFuO1xuICAgcHVibGljIGRyb3Bab25lQmVsb3c6IERyb3Bab25lIHwgdW5kZWZpbmVkO1xuICAgcHVibGljIHJlbmRlckRyb3Bab25lQmVsb3c6IGJvb2xlYW47XG4gICBwdWJsaWMgcmVuZGVySW5uZXJCcmFuY2g6IEJvb2xlYW47XG4gICBAVmlld0NoaWxkKFwiZHJhZ2dhYmxlRGl2XCIsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBwcml2YXRlIGRyYWdnYWJsZURpdjpcbiAgICAgIHwgRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgQFZpZXdDaGlsZChcIm5vZGVIb3N0Q29udGFpbmVyXCIsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgcHJpdmF0ZSBub2RlSG9zdENvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCB1bmRlZmluZWQ7XG4gICBwcml2YXRlIGN1cnJlbnRCcmFuY2hDb29yZGluYXRlczogQnJhbmNoQ29vcmRpbmF0ZXMgfCB1bmRlZmluZWQ7XG4gICBwcml2YXRlIHJlYWRvbmx5IHRyZWVDaGFuZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgIEBJbnB1dCgpIHBhcmVudEhvc3Q6IFZpZXdDb250YWluZXJSZWYgfCB1bmRlZmluZWQ7XG4gICBAVmlld0NoaWxkKFwiaW5uZXJCcmFuY2hcIiwgeyByZWFkOiBMaW1ibGVUcmVlQnJhbmNoQ29tcG9uZW50IH0pXG4gICBwcml2YXRlIGlubmVyQnJhbmNoOiBMaW1ibGVUcmVlQnJhbmNoQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xuXG4gICBjb25zdHJ1Y3RvcihcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgY29tcG9uZW50Q3JlYXRvclNlcnZpY2U6IENvbXBvbmVudENyZWF0b3JTZXJ2aWNlLFxuICAgICAgcHJpdmF0ZSByZWFkb25seSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IGRyYWdTdGF0ZVNlcnZpY2U6IERyYWdTdGF0ZVNlcnZpY2UsXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IGRyb3Bab25lU2VydmljZTogRHJvcFpvbmVTZXJ2aWNlLFxuICAgICAgcHJpdmF0ZSByZWFkb25seSB0cmVlU2VydmljZTogVHJlZVNlcnZpY2UsXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IGdsb2JhbEV2ZW50c1NlcnZpY2U6IEdsb2JhbEV2ZW50c1NlcnZpY2UsXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IG5nWm9uZTogTmdab25lLFxuICAgICAgcHJpdmF0ZSByZWFkb25seSB0cmVlQ29uc3RydWN0aW9uU3RhdHVzOiBUcmVlQ29uc3RydWN0aW9uU3RhdHVzXG4gICApIHtcbiAgICAgIHRoaXMudHJlZUNvbnN0cnVjdGlvblN0YXR1cy5jb25zdHJ1Y3RpbmcoKTtcbiAgICAgIGlmIChcbiAgICAgICAgIHRoaXMudHJlZVNlcnZpY2UudHJlZU9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgdGhpcy50cmVlU2VydmljZS50cmVlT3B0aW9ucy5saXN0TW9kZSAhPT0gdHJ1ZVxuICAgICAgKSB7XG4gICAgICAgICB0aGlzLnJlbmRlcklubmVyQnJhbmNoID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICB0aGlzLnJlbmRlcklubmVyQnJhbmNoID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLnJlbmRlckRyb3Bab25lQmVsb3cgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVuZGVyRHJvcFpvbmVBYm92ZSA9IGZhbHNlO1xuICAgICAgdGhpcy50cmVlQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy50cmVlU2VydmljZS5jaGFuZ2VzJFxuICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAvL1RoZSBmaXJzdCBvbmUgaXMgdGhlIGluaXRpYWwgdHJlZSByZW5kZXIsIHdoaWNoIHdlIGNhbiBpZ25vcmVcbiAgICAgICAgICAgIHNraXAoMSlcbiAgICAgICAgIClcbiAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50cmVlQ2hhbmdlSGFuZGxlcigpO1xuICAgICAgICAgfSk7XG4gICB9XG5cbiAgIHByaXZhdGUgdHJlZUNoYW5nZUhhbmRsZXIoKSB7XG4gICAgICBpZiAoXG4gICAgICAgICB0aGlzLmJyYW5jaCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICB0aGlzLmN1cnJlbnRCcmFuY2hDb29yZGluYXRlcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAhYXJyYXlzQXJlRXF1YWwoXG4gICAgICAgICAgICB0aGlzLmJyYW5jaC5nZXRDb29yZGluYXRlcygpLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50QnJhbmNoQ29vcmRpbmF0ZXNcbiAgICAgICAgIClcbiAgICAgICkge1xuICAgICAgICAgdGhpcy51cGRhdGVEcm9wWm9uZXMoKTtcbiAgICAgIH1cbiAgIH1cblxuICAgbmdPbkluaXQoKSB7XG4gICAgICBpZiAodGhpcy50cmVlU2VydmljZS50cmVlT3B0aW9ucz8uYWxsb3dEcmFnZ2luZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuYnJhbmNoPy5nZXRQYXJlbnQoKTtcbiAgICAgIGlmIChwYXJlbnQ/LmRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgIGNvbnN0IHBhcmVudERhdGEgPSBwYXJlbnQ/LmRhdGEgYXMgTGltYmxlVHJlZU5vZGU7XG4gICAgICAgICBpZiAoIWlzTmVzdGluZ0FsbG93ZWQodGhpcy50cmVlU2VydmljZS50cmVlT3B0aW9ucywgcGFyZW50RGF0YSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVySW5uZXJCcmFuY2ggPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucmVnaXN0ZXJEcm9wWm9uZXMoKTtcbiAgICAgIHRoaXMuY3VycmVudEJyYW5jaENvb3JkaW5hdGVzID0gdGhpcy5icmFuY2g/LmdldENvb3JkaW5hdGVzKCk7XG4gICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmRyb3Bab25lQWJvdmUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgdGhpcy5kcm9wWm9uZUJlbG93ID09PSB1bmRlZmluZWRcbiAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWm9uZXMgbm90IHJlZ2lzdGVyZWRcIik7XG4gICAgICAgICB9XG4gICAgICAgICBtZXJnZShcbiAgICAgICAgICAgIHRoaXMuZHJvcFpvbmVBYm92ZS5nZXRDb21tQ2hhbm5lbCgpLFxuICAgICAgICAgICAgdGhpcy5kcm9wWm9uZUJlbG93LmdldENvbW1DaGFubmVsKClcbiAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKGZpbHRlcigobWVzc2FnZSkgPT4gbWVzc2FnZSA9PT0gXCJjaGVja1JlbmRlcmVkXCIpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICB0aGlzLmRyb3Bab25lQWJvdmUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wWm9uZUJlbG93ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgIHRoaXMuYnJhbmNoID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWm9uZXMgbm90IHJlZ2lzdGVyZWRcIik7XG4gICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICB0aGlzLnJlbmRlckRyb3Bab25lQWJvdmUgPSB0aGlzLmRyb3Bab25lQWJvdmUuaXNSZW5kZXJlZCgpO1xuICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJEcm9wWm9uZUJlbG93ID0gdGhpcy5kcm9wWm9uZUJlbG93LmlzUmVuZGVyZWQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gICB9XG5cbiAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgIHRoaXMucmVuZGVyTm9kZSgpO1xuICAgICAgdGhpcy5zZXREcm9wWm9uZUhvc3RzKCk7XG4gICAgICB0aGlzLmNoZWNrRm9ySGFuZGxlKCk7XG4gICAgICB0aGlzLnRyZWVDb25zdHJ1Y3Rpb25TdGF0dXMuZG9uZUNvbnN0cnVjdGluZygpO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICB9XG5cbiAgIG5nT25EZXN0cm95KCkge1xuICAgICAgdGhpcy50cmVlQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICBpZiAodGhpcy5kcm9wWm9uZUFib3ZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLnJlbW92ZURyb3Bab25lKHRoaXMuZHJvcFpvbmVBYm92ZSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kcm9wWm9uZUJlbG93ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLnJlbW92ZURyb3Bab25lKHRoaXMuZHJvcFpvbmVCZWxvdyk7XG4gICAgICB9XG4gICAgICB0aGlzLnRyZWVTZXJ2aWNlLmNsZWFudXBTaWduYWwkLm5leHQodHJ1ZSk7XG4gICB9XG5cbiAgIHB1YmxpYyBkcmFnc3RhcnRIYW5kbGVyKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaWYgKFxuICAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyID09PSBudWxsIHx8XG4gICAgICAgICB0aGlzLmJyYW5jaCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICB0aGlzLnBhcmVudEhvc3QgPT09IHVuZGVmaW5lZFxuICAgICAgKSB7XG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmYWlsZWQgdG8gcnVuIGRyYWdzdGFydEhhbmRsZXJcIik7XG4gICAgICB9XG4gICAgICBjb25zdCBkcmFnZ2VkRWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGlmIChkcmFnZ2VkRWxlbWVudC5wYXJlbnRFbGVtZW50Py50YWdOYW1lICE9PSBcIkxJTUJMRS1UUkVFLU5PREVcIikge1xuICAgICAgICAgLy9Eb24ndCBkcmFnIHN0dWZmIHRoYXQgaXNuJ3QgcGFydCBvZiB0aGUgdHJlZVxuICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gXCJtb3ZlXCI7XG4gICAgICB0aGlzLmRyYWdTdGF0ZVNlcnZpY2UuZHJhZ2dpbmcodGhpcy5icmFuY2gsIHRoaXMucGFyZW50SG9zdCk7XG4gICAgICBjb25zdCB0cmVlRWxlbWVudCA9IGRyYWdnZWRFbGVtZW50LmNsb3Nlc3QoXCJsaW1ibGUtdHJlZS1yb290XCIpO1xuICAgICAgaWYgKHRyZWVFbGVtZW50ID09PSBudWxsKSB7XG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb3VsZCBub3QgZ2V0IHJvb3Qgb2YgdHJlZVwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgIC8vV2UgaGF2ZSB0byB1c2UgYSBzZXRUaW1lb3V0IGR1ZSB0byBhIGJ1ZyBpbiBjaHJvbWU6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMDczMzg3MC84Nzk2NjUxXG4gICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGRyYWdnZWRFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJkcmFnZ2luZ1wiKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgIHRoaXMudHJlZVNlcnZpY2UudHJlZURhdGE/Lmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgdGhpcy5icmFuY2g/LmdldENvb3JkaW5hdGVzKCkubGVuZ3RoID09PSAxXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgIC8vV2UgYXJlIGRyYWdnaW5nIHRoZSBvbmx5IGVsZW1lbnQgaW4gdGhlIHRyZWUsIHNvIHdlIGhhdmUgdG8gdXNlIHRoZSBwbGFjZWhvbGRlciBzeXN0ZW1cbiAgICAgICAgICAgICAgIHRoaXMudHJlZVNlcnZpY2UucGxhY2Vob2xkZXIkLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICB9KTtcbiAgICAgICAgIC8vV2UgdXNlIHRoaXMgd2VpcmQgc3Vic2NyaXB0aW9uL3RpbWVvdXQgY29tYm8gaW4gb3JkZXIgdG8gYXZvaWQgYSBzdHJhbmdlIGJ1ZyB3aGVyZSB0aGUgZHJhZ2xlYXZlIGV2ZW50XG4gICAgICAgICAvL2RvZXMgbm90IGZpcmUgaWYgdGhlIHVzZXIgZHJhZ3Mgb3V0IG9mIHRoZSB0cmVlIHRvbyBxdWlja2x5LiBUaGlzIGlzc3VlIHdvdWxkIG1ha2UgdGhlIGRyb3Agem9uZVxuICAgICAgICAgLy9yZW1haW4gaW4gdGhlIFVJLCBwb3RlbnRpYWxseSBjYXVzaW5nIGRyb3Agem9uZXMgdG8gYXBwZWFyIGluIG11bHRpcGxlIHRyZWVzIGF0IGEgdGltZS4gVGhpcyBzdWJzY3JpcHRpb25cbiAgICAgICAgIC8vd2FpdHMgZm9yIHRoZSBkcmFnb3ZlciBldmVudCBvbiB0aGUgdHJlZSB0byBmaXJlIGJlZm9yZSByZW5kZXJpbmcgYW55IGRyb3Agem9uZXMuIElmIHRoZSBkcmFnb3ZlclxuICAgICAgICAgLy9ldmVudCBkb2VzIG5vdCBmaXJlIHdpdGhpbiBhIGhhbGYgc2Vjb25kLCB3ZSBrbm93IHRoZSBtb3VzZSBsZWZ0IHRoZSB0cmVlIHRvbyBxdWlja2x5LCBhbmQgd2Ugd29uJ3RcbiAgICAgICAgIC8vcmVuZGVyIHRoZSBkcm9wIHpvbmUgYXQgYWxsLlxuICAgICAgICAgY29uc3QgZHJhZ1N1YnNjcmlwdGlvbiA9IGZyb21FdmVudCh0cmVlRWxlbWVudCwgXCJkcmFnb3ZlclwiKVxuICAgICAgICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGRyYWdvdmVyRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgIGRyYWdvdmVyRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICBpZiAodGhpcy5icmFuY2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IHNob3cgc3Vycm91bmRpbmcgZHJvcCB6b25lc1wiKTtcbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuYnJhbmNoLmdldFBhcmVudCgpO1xuICAgICAgICAgICAgICAgbGV0IHBhcmVudERhdGE6IExpbWJsZVRyZWVOb2RlO1xuICAgICAgICAgICAgICAgbGV0IHBhcmVudE5lc3RpbmdBbGxvd2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgIGlmIChwYXJlbnQ/LmRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIHBhcmVudERhdGEgPSBwYXJlbnQ/LmRhdGEgYXMgTGltYmxlVHJlZU5vZGU7XG4gICAgICAgICAgICAgICAgICBwYXJlbnROZXN0aW5nQWxsb3dlZCA9IGlzTmVzdGluZ0FsbG93ZWQoXG4gICAgICAgICAgICAgICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLnRyZWVPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgcGFyZW50RGF0YVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIGlmICh0aGlzLmRyb3Bab25lQWJvdmUgIT09IHVuZGVmaW5lZCAmJiBwYXJlbnROZXN0aW5nQWxsb3dlZCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wWm9uZVNlcnZpY2Uuc2hvd0Ryb3Bab25lRmFtaWx5KHRoaXMuZHJvcFpvbmVBYm92ZSwge1xuICAgICAgICAgICAgICAgICAgICAgam9pbkZhbWlsaWVzOiB0cnVlXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWRyYWdTdWJzY3JpcHRpb24uY2xvc2VkKSB7XG4gICAgICAgICAgICAgICBkcmFnU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICB9LCA1MDApO1xuICAgICAgfSk7XG4gICB9XG5cbiAgIHB1YmxpYyBkcmFnZW5kSGFuZGxlcihldmVudD86IERyYWdFdmVudCk6IHZvaWQge1xuICAgICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaWYgKHRoaXMuZHJhZ2dhYmxlRGl2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNvdWxkIG5vdCBnZXQgZHJhZ2dhYmxlIGRpdlwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZHJhZ2dhYmxlRGl2Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcImRyYWdnaW5nXCIpO1xuICAgICAgaWYgKHRoaXMuZHJhZ1N0YXRlU2VydmljZS5nZXRTdGF0ZSgpID09PSBcImNhcHR1cmVkXCIpIHtcbiAgICAgICAgIGlmICh0aGlzLnRyZWVTZXJ2aWNlLmNhcHR1cmVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgLy9Ecm9wcGVkIGluIGEgZGlmZmVyZW50IHRyZWUuIFJlbW92ZSB0aGUgb25lIGluIHRoaXMgdHJlZVxuICAgICAgICAgICAgaWYgKHRoaXMuYnJhbmNoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNvdWxkIG5vdCBnZXQgYnJhbmNoIGluIGRyYWdlbmRIYW5kbGVyXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50cmVlU2VydmljZS5jbGVhbnVwU2lnbmFsJC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgdGhpcy50cmVlU2VydmljZS5jYXB0dXJlZCA9IGZhbHNlO1xuICAgICAgICAgfVxuICAgICAgICAgdGhpcy5kcmFnU3RhdGVTZXJ2aWNlLnJlbGVhc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICAvL1dhc24ndCBkcm9wcGVkIGludG8gYSB2YWxpZCB0cmVlLCBzbyByZXNldCBmb3IgbmV4dCBkcmFnIGFuZFxuICAgICAgICAgLy9kb24ndCBkbyBhbnl0aGluZyBlbHNlLlxuICAgICAgICAgdGhpcy5kcmFnU3RhdGVTZXJ2aWNlLnJlbGVhc2UoKTtcbiAgICAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLmNsZWFyVmlzaWJsZVpvbmVzKCk7XG4gICAgICAgICB0aGlzLmRyb3Bab25lU2VydmljZS5yZXN0b3JlRmFtaWxpZXMoKTtcbiAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMudHJlZVNlcnZpY2UudHJlZURhdGE/Lmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgdGhpcy5icmFuY2g/LmdldENvb3JkaW5hdGVzKCkubGVuZ3RoID09PSAxXG4gICAgICAgICApIHtcbiAgICAgICAgICAgIC8vV2Ugd2VyZSBkcmFnZ2luZyB0aGUgb25seSBlbGVtZW50IGluIHRoZSB0cmVlLCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgICAgICAvL3JlbW92ZSB0aGUgcGxhY2Vob2xkZXIgdGhhdCB3ZSBhZGRlZCBpbiB0aGUgZHJhZ3N0YXJ0XG4gICAgICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLnBsYWNlaG9sZGVyJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgIH1cbiAgICAgIH1cbiAgIH1cblxuICAgcHVibGljIGRyYWdvdmVySGFuZGxlcihldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgICBpZiAodGhpcy5nbG9iYWxFdmVudHNTZXJ2aWNlLnNjcm9sbGluZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYnJhbmNoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGdldCBjdXJyZW50IGJyYW5jaCBkdXJpbmcgZHJhZ292ZXIgZXZlbnRcIik7XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5kcmFnU3RhdGVTZXJ2aWNlLmdldERhdGEoKTtcbiAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIC8vVGhleSBtaWdodCBiZSBkcmFnZ2luZyBzb21ldGhpbmcgdGhhdCBpc24ndCBhIG5vZGUuIEp1c3QgaWdub3JlIGl0LlxuICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc291cmNlQnJhbmNoID0gZGF0YS5icmFuY2g7XG4gICAgICAvL0lmIHRyeWluZyB0byBkcm9wIG9uIHNlbGYsIHJldHVybi5cbiAgICAgIGlmIChcbiAgICAgICAgIHNvdXJjZUJyYW5jaCA9PT0gdGhpcy5icmFuY2ggfHxcbiAgICAgICAgIHRoaXMuYnJhbmNoLmdldEFuY2VzdG9ycygpLmluY2x1ZGVzKHNvdXJjZUJyYW5jaClcbiAgICAgICkge1xuICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0ID0gKGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXG4gICAgICAgICBcIi5ub2RlLWhvc3QtY29udGFpbmVyXCJcbiAgICAgICk7XG4gICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBmaW5kIG5vZGUgaG9zdCBjb250YWluZXIgd2hpbGUgZHJhZ2dpbmdcIik7XG4gICAgICB9XG4gICAgICBsZXQgdG9wTGluZTogbnVtYmVyO1xuICAgICAgbGV0IGJvdHRvbUxpbmU6IG51bWJlcjtcbiAgICAgIGlmICh0aGlzLmlubmVyQnJhbmNoPy5yZW5kZXJEcm9wWm9uZUluc2lkZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgIHRvcExpbmUgPSB0YXJnZXQub2Zmc2V0SGVpZ2h0IC8gMiAtIDY7XG4gICAgICAgICBib3R0b21MaW5lID0gdG9wTGluZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICB0b3BMaW5lID0gdGFyZ2V0Lm9mZnNldEhlaWdodCAvIDMgLSAzOyAvL2FuIGltYWdpbmFyeSBsaW5lIDEvMyBvZiB0aGUgd2F5IGRvd24gZnJvbSB0aGUgdG9wIG9mIHRoZSBlbGVtZW50O1xuICAgICAgICAgYm90dG9tTGluZSA9IHRvcExpbmUgKiAyOyAvL2FuIGltYWdpbmFyeSBsaW5lIDEvMyBvZiB0aGUgd2F5IHVwIGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgZWxlbWVudDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuYnJhbmNoLmdldFBhcmVudCgpO1xuICAgICAgbGV0IHBhcmVudERhdGE6IExpbWJsZVRyZWVOb2RlO1xuICAgICAgbGV0IHBhcmVudE5lc3RpbmdBbGxvd2VkID0gdHJ1ZTtcbiAgICAgIGlmIChwYXJlbnQ/LmRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgIHBhcmVudERhdGEgPSBwYXJlbnQ/LmRhdGEgYXMgTGltYmxlVHJlZU5vZGU7XG4gICAgICAgICBwYXJlbnROZXN0aW5nQWxsb3dlZCA9IGlzTmVzdGluZ0FsbG93ZWQoXG4gICAgICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLnRyZWVPcHRpb25zLFxuICAgICAgICAgICAgcGFyZW50RGF0YVxuICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8qKiBUaGUgeS1jb29yZGluYXRlcyBvZiB0aGUgbW91c2UgaW4gcmVsYXRpb24gdG8gdGhlIG5vZGUgaXQgaXMgaG92ZXJpbmcgb3ZlciAqL1xuICAgICAgY29uc3Qgb2Zmc2V0WSA9IGV2ZW50LmNsaWVudFkgLSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgY29uc3QgYWN0aXZlRHJvcFpvbmUgPSB0aGlzLmRyb3Bab25lU2VydmljZS5nZXRBY3RpdmVEcm9wWm9uZSgpO1xuICAgICAgaWYgKFxuICAgICAgICAgb2Zmc2V0WSA8IHRvcExpbmUgJiZcbiAgICAgICAgIHRoaXMuZHJvcFpvbmVBYm92ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICBwYXJlbnROZXN0aW5nQWxsb3dlZCAmJlxuICAgICAgICAgKGFjdGl2ZURyb3Bab25lID09PSBudWxsIHx8XG4gICAgICAgICAgICAhRHJvcFpvbmUuZHJvcFpvbmVMb2NhdGlvbnNBcmVFcXVhbChcbiAgICAgICAgICAgICAgIGFjdGl2ZURyb3Bab25lLFxuICAgICAgICAgICAgICAgdGhpcy5kcm9wWm9uZUFib3ZlXG4gICAgICAgICAgICApKVxuICAgICAgKSB7XG4gICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuYnJhbmNoLmdldEluZGV4KCk7XG4gICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCB8fCBpbmRleCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2FuJ3QgZ2V0IGJyYW5jaCBpbmRleFwiKTtcbiAgICAgICAgIH1cbiAgICAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLnNob3dEcm9wWm9uZUZhbWlseSh0aGlzLmRyb3Bab25lQWJvdmUsIHtcbiAgICAgICAgICAgIGFjdGl2YXRlTG93ZXN0SW5zdGVhZE9mRm91bmRlcjogdHJ1ZVxuICAgICAgICAgfSk7XG4gICAgICAgICBpZiAoc3VkZGVuVHJlZUV4aXQoZXZlbnQpKSB7XG4gICAgICAgICAgICB0aGlzLmRyb3Bab25lU2VydmljZS5jbGVhclZpc2libGVab25lcygpO1xuICAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgIG9mZnNldFkgPCBib3R0b21MaW5lICYmXG4gICAgICAgICBvZmZzZXRZID4gdG9wTGluZSAmJlxuICAgICAgICAgdGhpcy5pbm5lckJyYW5jaD8ucmVuZGVyRHJvcFpvbmVJbnNpZGUgPT09IHRydWUgJiZcbiAgICAgICAgIHRoaXMuaW5uZXJCcmFuY2g/LmRyb3Bab25lSW5zaWRlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgIChhY3RpdmVEcm9wWm9uZSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgIURyb3Bab25lLmRyb3Bab25lTG9jYXRpb25zQXJlRXF1YWwoXG4gICAgICAgICAgICAgICBhY3RpdmVEcm9wWm9uZSxcbiAgICAgICAgICAgICAgIHRoaXMuaW5uZXJCcmFuY2guZHJvcFpvbmVJbnNpZGVcbiAgICAgICAgICAgICkpXG4gICAgICApIHtcbiAgICAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLnNob3dEcm9wWm9uZUZhbWlseShcbiAgICAgICAgICAgIHRoaXMuaW5uZXJCcmFuY2guZHJvcFpvbmVJbnNpZGVcbiAgICAgICAgICk7XG4gICAgICAgICBpZiAoc3VkZGVuVHJlZUV4aXQoZXZlbnQpKSB7XG4gICAgICAgICAgICB0aGlzLmRyb3Bab25lU2VydmljZS5jbGVhclZpc2libGVab25lcygpO1xuICAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgIG9mZnNldFkgPj0gYm90dG9tTGluZSAmJlxuICAgICAgICAgdGhpcy5kcm9wWm9uZUJlbG93ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgIHBhcmVudE5lc3RpbmdBbGxvd2VkICYmXG4gICAgICAgICAoYWN0aXZlRHJvcFpvbmUgPT09IG51bGwgfHxcbiAgICAgICAgICAgICFEcm9wWm9uZS5kcm9wWm9uZUxvY2F0aW9uc0FyZUVxdWFsKFxuICAgICAgICAgICAgICAgYWN0aXZlRHJvcFpvbmUsXG4gICAgICAgICAgICAgICB0aGlzLmRyb3Bab25lQmVsb3dcbiAgICAgICAgICAgICkpICYmXG4gICAgICAgICB0aGlzLmJyYW5jaC5nZXRDaGlsZHJlbigpLmxlbmd0aCA9PT0gMFxuICAgICAgKSB7XG4gICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuYnJhbmNoLmdldEluZGV4KCk7XG4gICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCB8fCBpbmRleCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2FuJ3QgZ2V0IGJyYW5jaCBpbmRleFwiKTtcbiAgICAgICAgIH1cbiAgICAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLnNob3dEcm9wWm9uZUZhbWlseSh0aGlzLmRyb3Bab25lQmVsb3cpO1xuICAgICAgICAgaWYgKHN1ZGRlblRyZWVFeGl0KGV2ZW50KSkge1xuICAgICAgICAgICAgdGhpcy5kcm9wWm9uZVNlcnZpY2UuY2xlYXJWaXNpYmxlWm9uZXMoKTtcbiAgICAgICAgIH1cbiAgICAgIH1cbiAgIH1cblxuICAgcHJpdmF0ZSByZW5kZXJOb2RlKCkge1xuICAgICAgaWYgKHRoaXMubm9kZUhvc3QgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmJyYW5jaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcmVuZGVyIHRyZWUgbm9kZVwiKTtcbiAgICAgIH1cbiAgICAgIGxldCBjb21wb25lbnQgPSB0aGlzLmJyYW5jaC5kYXRhLmNvbXBvbmVudDtcbiAgICAgIGlmIChjb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgY29tcG9uZW50ID0gdGhpcy50cmVlU2VydmljZS50cmVlT3B0aW9ucz8uZGVmYXVsdENvbXBvbmVudDtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibGltYmxlVHJlZSByZXF1aXJlcyBhIGNvbXBvbmVudCB0byByZW5kZXJcIik7XG4gICAgICB9XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLmNvbXBvbmVudENyZWF0b3JTZXJ2aWNlLmFwcGVuZENvbXBvbmVudDxhbnk+KFxuICAgICAgICAgY29tcG9uZW50LmNsYXNzLFxuICAgICAgICAgdGhpcy5ub2RlSG9zdFxuICAgICAgKTtcbiAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5ub2RlRGF0YSA9IHRoaXMuYnJhbmNoLmRhdGE7XG4gICAgICBmb3IgKGNvbnN0IGJpbmRpbmcgaW4gY29tcG9uZW50LmJpbmRpbmdzKSB7XG4gICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2VbYmluZGluZ10gPSBjb21wb25lbnQuYmluZGluZ3NbYmluZGluZ107XG4gICAgICB9XG4gICB9XG5cbiAgIHByaXZhdGUgcmVnaXN0ZXJEcm9wWm9uZXMoKTogdm9pZCB7XG4gICAgICB0aGlzLmFkZERyb3Bab25lQWJvdmUoKTtcbiAgICAgIHRoaXMuYWRkRHJvcFpvbmVCZWxvdygpO1xuICAgfVxuXG4gICBwcml2YXRlIGFkZERyb3Bab25lQWJvdmUoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5icmFuY2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmFpbGVkIHRvIHJlZ2lzdGVyIGRyb3Agem9uZSBhYm92ZVwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuYnJhbmNoLmdldFBhcmVudCgpO1xuICAgICAgY29uc3QgY3VycmVudENvb3JkaW5hdGVzID0gdGhpcy5icmFuY2guZ2V0Q29vcmRpbmF0ZXMoKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gY3VycmVudENvb3JkaW5hdGVzW2N1cnJlbnRDb29yZGluYXRlcy5sZW5ndGggLSAxXTtcbiAgICAgIHRoaXMuZHJvcFpvbmVBYm92ZSA9IG5ldyBEcm9wWm9uZShcbiAgICAgICAgIFsuLi4ocGFyZW50Py5nZXRDb29yZGluYXRlcygpID8/IFtdKV0sXG4gICAgICAgICBpbmRleFxuICAgICAgKTtcbiAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLmFkZERyb3Bab25lKHRoaXMuZHJvcFpvbmVBYm92ZSk7XG4gICB9XG5cbiAgIHByaXZhdGUgYWRkRHJvcFpvbmVCZWxvdygpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmJyYW5jaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmYWlsZWQgdG8gcmVnaXN0ZXIgZHJvcCB6b25lIGJlbG93XCIpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5icmFuY2guZ2V0UGFyZW50KCk7XG4gICAgICBjb25zdCBjdXJyZW50Q29vcmRpbmF0ZXMgPSB0aGlzLmJyYW5jaC5nZXRDb29yZGluYXRlcygpO1xuICAgICAgY29uc3QgaW5kZXggPSBjdXJyZW50Q29vcmRpbmF0ZXNbY3VycmVudENvb3JkaW5hdGVzLmxlbmd0aCAtIDFdO1xuICAgICAgdGhpcy5kcm9wWm9uZUJlbG93ID0gbmV3IERyb3Bab25lKFxuICAgICAgICAgWy4uLihwYXJlbnQ/LmdldENvb3JkaW5hdGVzKCkgPz8gW10pXSxcbiAgICAgICAgIGluZGV4ICsgMVxuICAgICAgKTtcbiAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLmFkZERyb3Bab25lKHRoaXMuZHJvcFpvbmVCZWxvdyk7XG4gICB9XG5cbiAgIHByaXZhdGUgdXBkYXRlRHJvcFpvbmVzKCk6IHZvaWQge1xuICAgICAgdGhpcy5jdXJyZW50QnJhbmNoQ29vcmRpbmF0ZXMgPSB0aGlzLmJyYW5jaD8uZ2V0Q29vcmRpbmF0ZXMoKTtcbiAgICAgIHRoaXMudXBkYXRlRHJvcFpvbmVBYm92ZSgpO1xuICAgICAgdGhpcy51cGRhdGVEcm9wWm9uZUJlbG93KCk7XG4gICAgICB0aGlzLnVwZGF0ZURyb3Bab25lSW5zaWRlKCk7XG4gICAgICB0aGlzLnNldERyb3Bab25lSG9zdHMoKTtcbiAgIH1cblxuICAgcHJpdmF0ZSB1cGRhdGVEcm9wWm9uZUFib3ZlKCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuYnJhbmNoID09PSB1bmRlZmluZWQgfHwgdGhpcy5kcm9wWm9uZUFib3ZlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImZhaWxlZCB0byB1cGRhdGUgZHJvcCB6b25lIGFib3ZlXCIpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5icmFuY2guZ2V0UGFyZW50KCk7XG4gICAgICBjb25zdCBjdXJyZW50Q29vcmRpbmF0ZXMgPSB0aGlzLmJyYW5jaC5nZXRDb29yZGluYXRlcygpO1xuICAgICAgY29uc3QgaW5kZXggPSBjdXJyZW50Q29vcmRpbmF0ZXNbY3VycmVudENvb3JkaW5hdGVzLmxlbmd0aCAtIDFdO1xuICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmRyb3Bab25lQWJvdmUuZ2V0TG9jYXRpb24oKTtcbiAgICAgIGxvY2F0aW9uLnNldFBhcmVudENvb3JkaW5hdGVzKFsuLi4ocGFyZW50Py5nZXRDb29yZGluYXRlcygpID8/IFtdKV0pO1xuICAgICAgbG9jYXRpb24uc2V0SW5zZXJ0SW5kZXgoaW5kZXgpO1xuICAgfVxuXG4gICBwcml2YXRlIHVwZGF0ZURyb3Bab25lQmVsb3coKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5icmFuY2ggPT09IHVuZGVmaW5lZCB8fCB0aGlzLmRyb3Bab25lQmVsb3cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmFpbGVkIHRvIHVwZGF0ZSBkcm9wIHpvbmUgYmVsb3dcIik7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmJyYW5jaC5nZXRQYXJlbnQoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRDb29yZGluYXRlcyA9IHRoaXMuYnJhbmNoLmdldENvb3JkaW5hdGVzKCk7XG4gICAgICBjb25zdCBpbmRleCA9IGN1cnJlbnRDb29yZGluYXRlc1tjdXJyZW50Q29vcmRpbmF0ZXMubGVuZ3RoIC0gMV07XG4gICAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuZHJvcFpvbmVCZWxvdy5nZXRMb2NhdGlvbigpO1xuICAgICAgbG9jYXRpb24uc2V0UGFyZW50Q29vcmRpbmF0ZXMoWy4uLihwYXJlbnQ/LmdldENvb3JkaW5hdGVzKCkgPz8gW10pXSk7XG4gICAgICBsb2NhdGlvbi5zZXRJbnNlcnRJbmRleChpbmRleCArIDEpO1xuICAgfVxuXG4gICBwcml2YXRlIHVwZGF0ZURyb3Bab25lSW5zaWRlKCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuaW5uZXJCcmFuY2g/LmRyb3Bab25lSW5zaWRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmJyYW5jaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmYWlsZWQgdG8gdXBkYXRlIGRyb3Agem9uZSBpbnNpZGVcIik7XG4gICAgICB9XG4gICAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuaW5uZXJCcmFuY2guZHJvcFpvbmVJbnNpZGUuZ2V0TG9jYXRpb24oKTtcbiAgICAgIGxvY2F0aW9uLnNldFBhcmVudENvb3JkaW5hdGVzKFsuLi50aGlzLmJyYW5jaC5nZXRDb29yZGluYXRlcygpXSk7XG4gICB9XG5cbiAgIHByaXZhdGUgc2V0RHJvcFpvbmVIb3N0cygpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIHRoaXMuZHJvcFpvbmVBYm92ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICB0aGlzLmRyb3Bab25lQmVsb3cgPT09IHVuZGVmaW5lZFxuICAgICAgKSB7XG4gICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmRyb3Bab25lQWJvdmUuc2V0SG9zdCh0aGlzLnBhcmVudEhvc3QpO1xuICAgICAgdGhpcy5kcm9wWm9uZUJlbG93LnNldEhvc3QodGhpcy5wYXJlbnRIb3N0KTtcbiAgIH1cblxuICAgcHJpdmF0ZSBjaGVja0ZvckhhbmRsZSgpOiB2b2lkIHtcbiAgICAgIGlmIChcbiAgICAgICAgIHRoaXMubm9kZUhvc3RDb250YWluZXIgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgdGhpcy5kcmFnZ2FibGVEaXYgPT09IHVuZGVmaW5lZFxuICAgICAgKSB7XG4gICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBub2RlSG9zdENvbnRhaW5lckVsZW1lbnQgPSB0aGlzLm5vZGVIb3N0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBoYW5kbGUgPSBub2RlSG9zdENvbnRhaW5lckVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgIFwiLmxpbWJsZS10cmVlLWhhbmRsZVwiXG4gICAgICApO1xuICAgICAgY29uc3QgZHJhZ2dhYmxlRGl2RWxlbWVudCA9IHRoaXMuZHJhZ2dhYmxlRGl2Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWlzRHJhZ2dpbmdBbGxvd2VkKHRoaXMudHJlZVNlcnZpY2UudHJlZU9wdGlvbnMsIHRoaXMuYnJhbmNoPy5kYXRhKSkge1xuICAgICAgICAgZHJhZ2dhYmxlRGl2RWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkcmFnZ2FibGVcIiwgXCJmYWxzZVwiKTtcbiAgICAgIH0gZWxzZSBpZiAoaGFuZGxlID09PSBudWxsKSB7XG4gICAgICAgICBkcmFnZ2FibGVEaXZFbGVtZW50LnNldEF0dHJpYnV0ZShcImRyYWdnYWJsZVwiLCBcInRydWVcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgKCkgPT4ge1xuICAgICAgICAgICAgZHJhZ2dhYmxlRGl2RWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkcmFnZ2FibGVcIiwgXCJ0cnVlXCIpO1xuICAgICAgICAgICAgLy9Gb3Igc29tZSByZWFzb24gbW91c2V1cCBkb2Vzbid0IGZpcmUgYWZ0ZXIgYSBkcmFnLCBzbyB3ZSB1c2UgdGhpcyBvYnNlcnZhYmxlIHNlcXVlbmNlIGluc3RlYWQuXG4gICAgICAgICAgICBjb25zdCBkcmFnZ2luZyA9IHRoaXMuZHJhZ1N0YXRlU2VydmljZS5zdGF0ZSQucGlwZShcbiAgICAgICAgICAgICAgIGZpbHRlcigoc3RhdGUpID0+IHN0YXRlID09PSBcImRyYWdnaW5nXCIpLFxuICAgICAgICAgICAgICAgZmlyc3QoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZHJhZ1N0YXRlU2VydmljZS5zdGF0ZSRcbiAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgc2tpcFVudGlsKGRyYWdnaW5nKSxcbiAgICAgICAgICAgICAgICAgIGZpbHRlcigoc3RhdGUpID0+IHN0YXRlID09PSBcImlkbGVcIiksXG4gICAgICAgICAgICAgICAgICBmaXJzdCgpXG4gICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGRyYWdnYWJsZURpdkVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZHJhZ2dhYmxlXCIsIFwiZmFsc2VcIik7XG4gICAgICAgICAgICAgICB9KTtcbiAgICAgICAgIH0pO1xuICAgICAgfVxuICAgfVxufVxuIiwiPGRyb3Atem9uZVxuICAgKm5nSWY9XCJyZW5kZXJEcm9wWm9uZUFib3ZlID09PSB0cnVlXCJcbiAgIFtkcm9wWm9uZV09XCJkcm9wWm9uZUFib3ZlXCJcbj48L2Ryb3Atem9uZT5cbjxkaXZcbiAgIChkcmFnc3RhcnQpPVwiZHJhZ3N0YXJ0SGFuZGxlcigkZXZlbnQpXCJcbiAgIChkcmFnZW5kKT1cImRyYWdlbmRIYW5kbGVyKCRldmVudClcIlxuICAgY2xhc3M9XCJsaW1ibGUtcGFyZW50LWNvbnRhaW5lclwiXG4gICAjZHJhZ2dhYmxlRGl2XG4+XG4gICA8ZGl2XG4gICAgICBjbGFzcz1cIm5vZGUtaG9zdC1jb250YWluZXJcIlxuICAgICAgKGRyYWdvdmVyTm9DaGFuZ2VEZXRlY3QpPVwiZHJhZ292ZXJIYW5kbGVyKCRldmVudClcIlxuICAgICAgW2RyYWdvdmVyRXZlbnRUaHJvdHRsZV09XCIxMFwiXG4gICAgICAjbm9kZUhvc3RDb250YWluZXJcbiAgID5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjbm9kZUhvc3Q+PC9uZy10ZW1wbGF0ZT5cbiAgIDwvZGl2PlxuICAgPGxpbWJsZS10cmVlLWJyYW5jaFxuICAgICAgKm5nSWY9XCJicmFuY2ggIT09IHVuZGVmaW5lZCAmJiByZW5kZXJJbm5lckJyYW5jaCA9PT0gdHJ1ZVwiXG4gICAgICBbYnJhbmNoXT1cImJyYW5jaFwiXG4gICAgICAjaW5uZXJCcmFuY2hcbiAgID48L2xpbWJsZS10cmVlLWJyYW5jaD5cbjwvZGl2PlxuPGRyb3Atem9uZVxuICAgKm5nSWY9XCJyZW5kZXJEcm9wWm9uZUJlbG93ID09PSB0cnVlXCJcbiAgIFtkcm9wWm9uZV09XCJkcm9wWm9uZUJlbG93XCJcbj48L2Ryb3Atem9uZT5cbiJdfQ==
|
|
@@ -62,14 +62,9 @@ LimbleTreePlaceholderComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ ty
|
|
|
62
62
|
i0.ɵɵelementEnd();
|
|
63
63
|
} if (rf & 2) {
|
|
64
64
|
i0.ɵɵproperty("dropZone", ctx.dropZone);
|
|
65
|
-
} },
|
|
65
|
+
} }, dependencies: [i4.DropZoneComponent, i5.DragoverNoChangeDetectDirective], styles: [".placeholder[_ngcontent-%COMP%]{width:100%;height:20px}"], changeDetection: 0 });
|
|
66
66
|
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LimbleTreePlaceholderComponent, [{
|
|
67
67
|
type: Component,
|
|
68
|
-
args: [{
|
|
69
|
-
selector: "limble-tree-placeholder",
|
|
70
|
-
templateUrl: "./limble-tree-placeholder.component.html",
|
|
71
|
-
styleUrls: ["./limble-tree-placeholder.component.scss"],
|
|
72
|
-
changeDetection: ChangeDetectionStrategy.OnPush
|
|
73
|
-
}]
|
|
68
|
+
args: [{ selector: "limble-tree-placeholder", changeDetection: ChangeDetectionStrategy.OnPush, template: "<drop-zone [dropZone]=\"dropZone\"></drop-zone>\n<div class=\"placeholder\" (dragoverNoChangeDetect)=\"dragoverHandler()\"></div>\n", styles: [".placeholder{width:100%;height:20px}\n"] }]
|
|
74
69
|
}], function () { return [{ type: i1.DropZoneService }, { type: i0.ChangeDetectorRef }, { type: i2.TreeService }, { type: i3.TreeConstructionStatus }]; }, null); })();
|
|
75
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGltYmxlLXRyZWUtcGxhY2Vob2xkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbGltYmxlLXRyZWUvc3JjL2xpYi9saW1ibGUtdHJlZS1wbGFjZWhvbGRlci9saW1ibGUtdHJlZS1wbGFjZWhvbGRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2xpbWJsZS10cmVlLXBsYWNlaG9sZGVyL2xpbWJsZS10cmVlLXBsYWNlaG9sZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSix1QkFBdUIsRUFFdkIsU0FBUyxFQUdYLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7OztBQVcvQyxNQUFNLE9BQU8sOEJBQThCO0lBS3hDLFlBQ29CLGVBQWdDLEVBQ2hDLGlCQUFvQyxFQUNwQyxXQUF3QixFQUN4QixzQkFBOEM7UUFIOUMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUUvRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDM0MsOEVBQThFO1FBQzlFLG1GQUFtRjtRQUNuRixvRkFBb0Y7UUFDcEYsa0ZBQWtGO1FBQ2xGLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQ25FLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO2dCQUM5QixPQUFPO2FBQ1Q7WUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkQsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUNqQixJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDL0M7UUFDSixDQUFDLENBQ0gsQ0FBQztJQUNMLENBQUM7SUFFTSxRQUFRO1FBQ1osSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTSxlQUFlO1FBQ25CLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1NBQzFEO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVNLGVBQWU7UUFDbkIsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUM5QixPQUFPO1NBQ1Q7UUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU0sV0FBVztRQUNmLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMzQyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztTQUM1RDtRQUNELElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RCxDQUFDOzs0R0F6RFMsOEJBQThCO2lGQUE5Qiw4QkFBOEI7UUNwQjNDLCtCQUE2QztRQUM3Qyw4QkFBc0U7UUFBN0MsMElBQTBCLHFCQUFpQixJQUFDO1FBQUMsaUJBQU07O1FBRGpFLHVDQUFxQjs7dUZEb0JuQiw4QkFBOEI7Y0FOMUMsU0FBUzsyQkFDRyx5QkFBeUIsbUJBR2xCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgQWZ0ZXJWaWV3SW5pdCxcbiAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICBDb21wb25lbnQsXG4gICBPbkRlc3Ryb3ksXG4gICBPbkluaXRcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBEcm9wWm9uZSB9IGZyb20gXCIuLi9jbGFzc2VzL0Ryb3Bab25lXCI7XG5pbXBvcnQgeyBEcm9wWm9uZVNlcnZpY2UgfSBmcm9tIFwiLi4vbGltYmxlLXRyZWUtcm9vdC9kcm9wLXpvbmUuc2VydmljZVwiO1xuaW1wb3J0IHsgVHJlZUNvbnN0cnVjdGlvblN0YXR1cyB9IGZyb20gXCIuLi9saW1ibGUtdHJlZS1yb290L3RyZWUtY29uc3RydWN0aW9uLXN0YXR1cy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBUcmVlU2VydmljZSB9IGZyb20gXCIuLi9saW1ibGUtdHJlZS1yb290L3RyZWUuc2VydmljZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgIHNlbGVjdG9yOiBcImxpbWJsZS10cmVlLXBsYWNlaG9sZGVyXCIsXG4gICB0ZW1wbGF0ZVVybDogXCIuL2xpbWJsZS10cmVlLXBsYWNlaG9sZGVyLmNvbXBvbmVudC5odG1sXCIsXG4gICBzdHlsZVVybHM6IFtcIi4vbGltYmxlLXRyZWUtcGxhY2Vob2xkZXIuY29tcG9uZW50LnNjc3NcIl0sXG4gICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBMaW1ibGVUcmVlUGxhY2Vob2xkZXJDb21wb25lbnRcbiAgIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgcHVibGljIGRyb3Bab25lOiBEcm9wWm9uZSB8IHVuZGVmaW5lZDtcbiAgIHByaXZhdGUgcmVhZG9ubHkgcGxhY2Vob2xkZXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgcHJpdmF0ZSByZWFkb25seSBkcm9wWm9uZVNlcnZpY2U6IERyb3Bab25lU2VydmljZSxcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgcHJpdmF0ZSByZWFkb25seSB0cmVlU2VydmljZTogVHJlZVNlcnZpY2UsXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IHRyZWVDb25zdHJ1Y3Rpb25TdGF0dXM6IFRyZWVDb25zdHJ1Y3Rpb25TdGF0dXNcbiAgICkge1xuICAgICAgdGhpcy50cmVlQ29uc3RydWN0aW9uU3RhdHVzLmNvbnN0cnVjdGluZygpO1xuICAgICAgLy9UaGlzIGxvZ2ljIGlzIHZlcnkgc2ltaWxhciB0byB3aGF0IHRoZSBsaWZlY3ljbGUgaG9va3Mgb2YgdGhpcyBjb21wb25lbnQgZG8uXG4gICAgICAvL1dlIHVzZSB0aGlzIHN1YnNjcmlwdGlvbiBiZWNhdXNlIHNvbWV0aW1lcyB3ZSBjYW4ndCB3YWl0IGZvciB0aGUgbGlmZWN5Y2xlIGhvb2tzOlxuICAgICAgLy9TcGVjaWZpY2FsbHksIHRoZSBkcm9wIHpvbmUgcmVnaXN0cmF0aW9uIGFuZCBkZXJlZ2lzdHJhdGlvbiBzb21ldGltZXMgY2FuJ3QgaGFwcGVuXG4gICAgICAvL2FzeW5jaHJvbm91c2x5IHdpdGhvdXQgY2F1c2luZyBidWdzLiBTbyB3ZSBoYW5kbGUgaXQgc3luY2hyb25vdXNseSBoZXJlIGFzIHdlbGwuXG4gICAgICB0aGlzLnBsYWNlaG9sZGVyU3Vic2NyaXB0aW9uID0gdGhpcy50cmVlU2VydmljZS5wbGFjZWhvbGRlciQuc3Vic2NyaWJlKFxuICAgICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5kcm9wWm9uZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRyb3Bab25lU2VydmljZS5yZW1vdmVEcm9wWm9uZSh0aGlzLmRyb3Bab25lKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgdGhpcy5kcm9wWm9uZVNlcnZpY2UuYWRkRHJvcFpvbmUodGhpcy5kcm9wWm9uZSk7XG4gICAgICAgICAgICAgICB0aGlzLmRyb3Bab25lLnNldEhvc3QodGhpcy50cmVlU2VydmljZS5ob3N0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgIH1cbiAgICAgICk7XG4gICB9XG5cbiAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgIHRoaXMuZHJvcFpvbmUgPSBuZXcgRHJvcFpvbmUoW10sIDApO1xuICAgICAgdGhpcy5kcm9wWm9uZVNlcnZpY2UuYWRkRHJvcFpvbmUodGhpcy5kcm9wWm9uZSk7XG4gICB9XG5cbiAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICBpZiAodGhpcy5kcm9wWm9uZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwbGFjZWhvbGRlciBkcm9wIHpvbmUgaXMgbm90IGRlZmluZWRcIik7XG4gICAgICB9XG4gICAgICB0aGlzLmRyb3Bab25lLnNldEhvc3QodGhpcy50cmVlU2VydmljZS5ob3N0KTtcbiAgICAgIHRoaXMudHJlZUNvbnN0cnVjdGlvblN0YXR1cy5kb25lQ29uc3RydWN0aW5nKCk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgIH1cblxuICAgcHVibGljIGRyYWdvdmVySGFuZGxlcigpIHtcbiAgICAgIGlmICh0aGlzLmRyb3Bab25lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLnNob3dEcm9wWm9uZUZhbWlseSh0aGlzLmRyb3Bab25lKTtcbiAgIH1cblxuICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgdGhpcy5wbGFjZWhvbGRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgaWYgKHRoaXMuZHJvcFpvbmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY291bGQgbm90IHJlbW92ZSBwbGFjZWhvbGRlciBkcm9wIHpvbmVcIik7XG4gICAgICB9XG4gICAgICB0aGlzLmRyb3Bab25lU2VydmljZS5yZW1vdmVEcm9wWm9uZSh0aGlzLmRyb3Bab25lKTtcbiAgIH1cbn1cbiIsIjxkcm9wLXpvbmUgW2Ryb3Bab25lXT1cImRyb3Bab25lXCI+PC9kcm9wLXpvbmU+XG48ZGl2IGNsYXNzPVwicGxhY2Vob2xkZXJcIiAoZHJhZ292ZXJOb0NoYW5nZURldGVjdCk9XCJkcmFnb3ZlckhhbmRsZXIoKVwiPjwvZGl2PlxuIl19
|